ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDI5YzhjYjQuLjYzNTA1YWMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTAwLDkgKzEwMCwxMSBAQAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoQ2FsbGJhY2suYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGhIZWFkc2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoUGJhcC5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50UmVjZWl2ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JSW50ZW50U2VuZGVyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0FkYXB0ZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY0NvbnRleHQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JU3luY1N0YXR1c09ic2VydmVyLmFpZGwgXApAQCAtMTI5LDcgKzEzMSw2IEBACiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCiAgICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKICAgICBjb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSUFwcGxpY2F0aW9uVG9rZW4uYWlkbCBcCkBAIC0xNTksNiArMTYwLDkgQEAKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RDbGllbnQuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RTZXNzaW9uLmFpZGwgXAorCWNvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvSVJlbW90ZVZpZXdzRmFjdG9yeS5haWRsIFwKKwlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIFwKKwlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUdlb2NvZGVQcm92aWRlci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUdwc1N0YXR1c0xpc3RlbmVyLmFpZGwgXAogCWxvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9JR3BzU3RhdHVzUHJvdmlkZXIuYWlkbCBcCkBAIC0zNDgsNyArMzUyLDcgQEAKIAkJCWZyYW1ld29yayBcCiAKIGZyYW1ld29ya19kb2NzX0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBKQVZBX0xJQlJBUklFUwotZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfSFRNTF9ESVIgOj0gJChMT0NBTF9QQVRIKS9kb2NzL2h0bWwgJChPVVRfRE9DUykvZ2VuCitmcmFtZXdvcmtfZG9jc19MT0NBTF9EUk9JRERPQ19IVE1MX0RJUiA6PSBkb2NzL2h0bWwKICMgVGhlIHNpbmNlIGZsYWcgKC1zaW5jZSBOLnhtbCBBUElfTEVWRUwpIGlzIHVzZWQgdG8gYWRkIEFQSSBMZXZlbCBpbmZvcm1hdGlvbgogIyB0byB0aGUgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uIE11c3QgYmUgaW4gb3JkZXIgb2Ygb2xkZXN0IHRvIG5ld2VzdC4KIGZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX09QVElPTlMgOj0gXApAQCAtMzYwLDcgKzM2NCw5IEBACiAgICAgLXNpbmNlIC4vZnJhbWV3b3Jrcy9iYXNlL2FwaS82LnhtbCA2IFwKICAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpLzcueG1sIDcgXAogICAgIC1zaW5jZSAuL2ZyYW1ld29ya3MvYmFzZS9hcGkvOC54bWwgOCBcCi0JCS1lcnJvciAxIC1lcnJvciAyIC13YXJuaW5nIDMgLWVycm9yIDQgLWVycm9yIDYgLWVycm9yIDggLWVycm9yIDE0IFwKKyAgICAtc2luY2UgLi9mcmFtZXdvcmtzL2Jhc2UvYXBpL2N1cnJlbnQueG1sIEhDIFwKKwkJLWVycm9yIDEwMSAtZXJyb3IgMTAyIC13YXJuaW5nIDEwMyAtZXJyb3IgMTA0IC1lcnJvciAxMDYgLWVycm9yIDEwOCAtd2FybmluZyAxMTMgXAorCQktZXJyb3IgMTE0IFwKIAkJLW92ZXJ2aWV3ICQoTE9DQUxfUEFUSCkvY29yZS9qYXZhL292ZXJ2aWV3Lmh0bWwKIAogZnJhbWV3b3JrX2RvY3NfTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUjo9JChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmspCkBAIC00MTYsNyArNDIyLDkgQEAKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9XaWt0aW9uYXJ5U2ltcGxlIFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeVNpbXBsZSAiV2lrdGlvbmFyeSAoU2ltcGxpZmllZCkiIFwKIAkJLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9Wb2ljZVJlY29nbml0aW9uU2VydmljZSBcCi0JCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlICJWb2ljZSBSZWNvZ25pdGlvbiBTZXJ2aWNlIgorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAiVm9pY2UgUmVjb2duaXRpb24gU2VydmljZSIgXAorCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL1htbEFkYXB0ZXJzIFwKKwkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvWG1sQWRhcHRlcnMgIlhNTCBBZGFwdGVycyIKIAogIyMgU0RLIHZlcnNpb24gaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgcHVibGlzaGVkIGRvY3MKICAgIyBtYWpvclsubWlub3JdIHZlcnNpb24gZm9yIGN1cnJlbnQgU0RLLiAoZnVsbCByZWxlYXNlcyBvbmx5KQpAQCAtNDYzLDExICs0NzEsMTMgQEAKIAkJLW5vZG9jcwogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCisKK0xPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCi0kKGZ1bGxfdGFyZ2V0KTogJChmcmFtZXdvcmtfYnVpbHQpCisjICQoZ2VuKSwgaS5lLiBmcmFtZXdvcmsuYWlkbCwgaXMgYWxzbyBuZWVkZWQgd2hpbGUgYnVpbGRpbmcgYWdhaW5zdCB0aGUgY3VycmVudCBzdHViLgorJChmdWxsX3RhcmdldCk6ICQoZnJhbWV3b3JrX2J1aWx0KSAkKGdlbikKICQoSU5URVJOQUxfUExBVEZPUk1fQVBJX0ZJTEUpOiAkKGZ1bGxfdGFyZ2V0KQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLHNkaywkKElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFKSkKIApAQCAtNDg5LDcgKzQ5OSw4IEBACiAJCS1wYXJzZWNvbW1lbnRzCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKKworTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTUxOSwxNCArNTMwLDEzIEBACiAJCS1wcm9vZnJlYWQgJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpLXByb29mcmVhZC50eHQgXAogCQktdG9kbyAkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktZG9jcy10b2RvLmh0bWwgXAogCQktc2RrdmFsdWVzICQoT1VUX0RPQ1MpIFwKLQkJLWhkZiBhbmRyb2lkLndoaWNoZG9jIG9mZmxpbmUgCisJCS1oZGYgYW5kcm9pZC53aGljaGRvYyBvZmZsaW5lCiAKIGlmZXEgKCQoZnJhbWV3b3JrX2RvY3NfU0RLX1BSRVZJRVcpLHRydWUpCiAgIExPQ0FMX0RST0lERE9DX09QVElPTlMgKz0gLWhkZiBzZGsuY3VycmVudCBwcmV2aWV3IAogZW5kaWYKIAogTE9DQUxfRFJPSURET0NfQ1VTVE9NX1RFTVBMQVRFX0RJUjo9YnVpbGQvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNkawotTE9DQUxfRFJPSURET0NfQ1VTVE9NX0FTU0VUX0RJUjo9YXNzZXRzLXNkawogCiBpbmNsdWRlICQoQlVJTERfRFJPSURET0MpCiAKQEAgLTUzOSw3ICs1NDksNiBAQAogJChmdWxsX3RhcmdldCk6ICQoc3RhdGljX2RvY19pbmRleF9yZWRpcmVjdCkKICQoZnVsbF90YXJnZXQpOiAkKGZyYW1ld29ya19idWlsdCkKIAotCiAjID09PT0gZG9jcyBmb3IgdGhlIHdlYiAob24gdGhlIGdvb2dsZSBhcHAgZW5naW5lIHNlcnZlcikgPT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC01NjIsMTIgKzU3MSwxMSBAQAogCQktaGRmIHRlbXBsYXRlLnNob3dMYW5ndWFnZU1lbnUgdHJ1ZQogCiBMT0NBTF9EUk9JRERPQ19DVVNUT01fVEVNUExBVEVfRElSOj1idWlsZC90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2RrCi1MT0NBTF9EUk9JRERPQ19DVVNUT01fQVNTRVRfRElSOj1hc3NldHMtc2RrCiAKIGluY2x1ZGUgJChCVUlMRF9EUk9JRERPQykKIAogIyBleHBsaWNpdGx5IHNwZWNpZnkgdGhhdCBvbmxpbmUtc2RrIGRlcGVuZHMgb24gZnJhbWV3b3JrLXJlcyBhbmQgYW55IGdlbmVyYXRlZCBkb2NzCi0kKGZ1bGxfdGFyZ2V0KTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldCAkKEFMTF9HRU5FUkFURURfRE9DUykKKyQoZnVsbF90YXJnZXQpOiBmcmFtZXdvcmstcmVzLXBhY2thZ2UtdGFyZ2V0CiAKICMgPT09PSBkb2NzIHRoYXQgaGF2ZSBhbGwgb2YgdGhlIHN0dWZmIHRoYXQncyBAaGlkZGVuID09PT09PT09PT09PT09PT09PT09PT09CiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTU4MywxMSArNTkxLDEwIEBACiBMT0NBTF9NT0RVTEUgOj0gaGlkZGVuCiBMT0NBTF9EUk9JRERPQ19PUFRJT05TOj1cCiAJCSQoZnJhbWV3b3JrX2RvY3NfTE9DQUxfRFJPSURET0NfT1BUSU9OUykgXAotICAgICAgICAtdGl0bGUgIkFuZHJvaWQgU0RLIC0gSW5jbHVkaW5nIGhpZGRlbiBBUElzLiIKLSMgICAgICAgIC1oaWRkZW4KKwkJLXRpdGxlICJBbmRyb2lkIFNESyAtIEluY2x1ZGluZyBoaWRkZW4gQVBJcy4iCisjCQktaGlkZGVuCiAKIExPQ0FMX0RST0lERE9DX0NVU1RPTV9URU1QTEFURV9ESVI6PWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zZGsKLUxPQ0FMX0RST0lERE9DX0NVU1RPTV9BU1NFVF9ESVI6PWFzc2V0cy1zZGsKIAogaW5jbHVkZSAkKEJVSUxEX0RST0lERE9DKQogCkBAIC01OTcsMTAgKzYwNCwxNCBAQAogZXh0X2RpcnMgOj0gXAogCS4uLy4uL2V4dGVybmFsL25pc3Qtc2lwL2phdmEgXAogCS4uLy4uL2V4dGVybmFsL2FwYWNoZS1odHRwL3NyYyBcCi0JLi4vLi4vZXh0ZXJuYWwvdGFnc291cC9zcmMKKwkuLi8uLi9leHRlcm5hbC90YWdzb3VwL3NyYyBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKIAogZXh0X3NyY19maWxlcyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsJChleHRfZGlycykpCiAKK2V4dF9yZXNfZGlycyA6PSBcCisJLi4vLi4vZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMKKwogIyA9PT09ICB0aGUgbGlicmFyeSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC02MDgsNyArNjE5LDcgQEAKIAogTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTIDo9IHRydWUKIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUKLQorTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTIDo9ICQoZXh0X3Jlc19kaXJzKQogTE9DQUxfTU9EVUxFIDo9IGV4dAogCiBMT0NBTF9OT19FTU1BX0lOU1RSVU1FTlQgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDU2MThlYWEuLmU1ZjFmOTAgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTY3LDcgKzY3LDIwIEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJyZXZlcmJfaW50ZXJtZWRpYXRlcykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYnJldmVyYnRlc3RfaW50ZXJtZWRpYXRlcykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvc291bmRmeC8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgLiAtdHlwZSBmIC1uYW1lICIqLnJzIiAtcHJpbnQwIHwgeGFyZ3MgLTAgdG91Y2gpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhbmRyb2lkX3J1bnRpbWVfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zeXN0ZW0vbGliL2xpYmFuZHJvaWRfcnVudGltZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYW5kcm9pZF9ydW50aW1lLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliaHd1aV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJod3VpLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zeXN0ZW0vbGliL2xpYmh3dWkuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmh3dWkuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlLyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lDbGlwYm9hcmQuUCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuUCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZF9zdHVic19jdXJyZW50X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiBvdXQvdGFyZ2V0L2NvbW1vbi9kb2NzL2FwaS1zdHVicyopCiAKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVApkaWZmIC0tZ2l0IGEvYXBpLzkueG1sIGIvYXBpLzkueG1sCmluZGV4IDlmZjEyODcuLjNlNzY1M2MgMTAwNjQ0Ci0tLSBhL2FwaS85LnhtbAorKysgYi9hcGkvOS54bWwKQEAgLTE1ODQ1LDE3ICsxNTg0NSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEluc3RhbmNlQ291bnQiCi0gcmV0dXJuPSJsb25nIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50ZW50IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkludGVudCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODU3MSwxNiArNTg1NjAsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJiaXRtYXAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJDYW52YXMiCi0gdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJnbCIgdHlwZT0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbGlwUGF0aCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTk0OTcsMTcgKzU5NDc2LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZnJlZUdsQ2FjaGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENsaXBCb3VuZHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5NTU0LDE3ICs1OTUyMiw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEdMIgotIHJldHVybj0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU5OTI4LDIxICs1OTg4NSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1hdHJpeCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Vmlld3BvcnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJza2V3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC03NDE0OCw3ICs3NDA5MCw3IEBACiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAuMDAxMGYiCisgdmFsdWU9IjAuMDAxZiIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNDc3NjAsMTcgKzE0NzcwMiw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3NzgyLDMwICsxNDc3MTMsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ3ODMyLDE3ICsxNDc3MzksNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MDM5LDE3ICsxNDc5MzUsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJoYXNVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FmdGVyTGFzdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ4MjUzLDE3ICsxNDgxMzgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzdXBwb3J0c1VwZGF0ZXMiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE0ODI5MCwxMjQgKzE0ODE2NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im9ic2VydmVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVCbG9iIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJ5dGVbXSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVEb3VibGUiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUZsb2F0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImZsb2F0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUludCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlTG9uZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJsb25nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVNob3J0IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9InNob3J0Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVN0cmluZyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZVRvTnVsbCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTW9ja0RpYWxvZ0ludGVyZmFjZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMTY0Njc0LDcgKzE2NDQzMCw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNjQ2ODUsNyArMTY0NDQxLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xOTU1OTYsNiArMTk1MzUyLDM5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPG1ldGhvZCBuYW1lPSJhZnRlclRleHRDaGFuZ2VkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDQwNTIsMzkgKzIwMzg0MSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9OT05FIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMCIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9TSU5HTEUiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJMaXN0Vmlldy5GaXhlZFZpZXdJbmZvIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCmRpZmYgLS1naXQgYS9hcGkvY3VycmVudC54bWwgYi9hcGkvY3VycmVudC54bWwKaW5kZXggZTU3MGFjOS4uNGM1NDliZCAxMDA2NDQKLS0tIGEvYXBpL2N1cnJlbnQueG1sCisrKyBiL2FwaS9jdXJyZW50LnhtbApAQCAtMTQ2MCw2ICsxNDYwLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRvcl9mYWRlX2luIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTc0MzI2MDkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYW5pbWF0b3JfZmFkZV9vdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzQzMjYxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJhbnRpY2lwYXRlX2ludGVycG9sYXRvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwNjYsNiArMjA4OCwxNjAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclNpemUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTM1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTGF5b3V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1ODAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uTW9kZUJhY2tncm91bmQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0OSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VCdXR0b25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFjdGlvblZpZXdDbGFzcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTgxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFjdGl2aXR5Q2xvc2VFbnRlckFuaW1hdGlvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxMTAsNiArMjI4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWRhcHRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFkZFN0YXRlc0Zyb21DaGlsZHJlbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNDMsNiArMjMzMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iYWxsQ29udGFjdHNOYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iYWxsb3dCYWNrdXAiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0yMjMxLDYgKzI0MjksMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImFuaW1hdGVGaXJzdFZpZXciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU0MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhbmltYXRlTGF5b3V0Q2hhbmdlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImFuaW1hdGVPbkNsaWNrIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjMxOSw2ICsyNTM5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJhcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1dGhvciIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTI5NzksNiArMzIxMCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY29sdW1uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iY29sdW1uRGVsYXkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMTIyLDYgKzMzNjQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJjeWNsZXMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMzg2LDYgKzM2MzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImRpc3BsYXlPcHRpb25zIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MzciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZGl0aGVyIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMzU4NCw2ICszODQ4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MTQ1LDYgKzQ0MjAsNjEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50T3BlbkV4aXRBbmltYXRpb24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJmcmVlemVzVGV4dCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNTYsNiArNDQ4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImZyb21BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQxNzgsNiArNDUxOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iZnJvbVZhbHVlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iZnJvbVhEZWx0YSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ0NjQsNiArNDgxNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Imhhc0NvZGUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NTg1LDYgKzQ5NDgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imljb25pZmllZEJ5RGVmYXVsdCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImlkIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDY5NSw2ICs1MDY5LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlRXh0cmFWYWx1ZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU2NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbWVTdWJ0eXBlTW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImltbWVyc2l2ZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTUwNDcsNiArNTQ1NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaXRlbVBhZGRpbmciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU3NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJpdGVtVGV4dEFwcGVhcmFuY2UiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02MzY3LDYgKzY3ODUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjYzMSw2ICs3MDYwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTQxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Im1lbnVDYXRlZ29yeSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY3NjMsNiArNzIwMywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ibmF2aWdhdGlvbk1vZGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJuZWdhdGl2ZUJ1dHRvblRleHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02OTI4LDYgKzczNzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im9yZGVyaW5nIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ib3JkZXJpbmdGcm9tWG1sIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjk2MSwzOSArNzQyMyw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJvdmVyc2Nyb2xsRm9vdGVyIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTY4NDM0NTkiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0ib3ZlcnNjcm9sbEhlYWRlciIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjE2ODQzNDU4IgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Im92ZXJzY3JvbGxNb2RlIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMTY4NDM0NTciCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icGFkZGluZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTczNTcsNiArNzc4NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icHJldmlld0ltYWdlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0icHJpb3JpdHkiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC03NTExLDYgKzc5NTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InByb3BlcnR5TmFtZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InByb3RlY3Rpb25MZXZlbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgyODEsNiArODczMiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2VsZWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2V0dGluZ3NBY3Rpdml0eSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTgzOTEsNiArODg1MywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2hvd0FzQWN0aW9uIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2hvd0RlZmF1bHQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDY4LDYgKzg5NDEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNvcnRPcmRlciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNvdW5kRWZmZWN0c0VuYWJsZWQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NTEyLDYgKzg5OTYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNwaW5uZXJNb2RlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic3Bpbm5lclN0eWxlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODUyMyw2ICs5MDE4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTY3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNyYyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTg4MjAsNiArOTMyNiwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic3VidGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzOCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzdWJ0aXRsZVRleHRTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InN1Z2dlc3RBY3Rpb25Nc2ciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC05NjU2LDYgKzEwMTg0LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ0aXRsZVRleHRTdHlsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTc3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1MjYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0idG9BbHBoYSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk2NzgsNiArMTAyMjgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRvVmFsdWUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUyOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ0b1hEZWx0YSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk4NTQsNiArMTA0MTUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InVyaSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InVzZUxldmVsIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtOTg4Nyw2ICsxMDQ1OSwzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVGcm9tIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0idmFsdWVUbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTUzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InZhbHVlVHlwZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTU0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InZhcmlhYmxlUGFkZGluZyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEwMTk1LDYgKzEwODAwLDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aW5kb3dBY3Rpb25CYXJPdmVybGF5IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM1NTgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzU1MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTEwNDA0LDYgKzExMDQyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoQ2xhc3MiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzUzMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNTMxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IndyaXRlUGVybWlzc2lvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MDUzLDYgKzE0NzEzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJob21lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5MDgzNTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iaWNvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0NDM4LDYgKzE1MTA5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3RUZXh0TW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTA4MzU0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNlbGVjdGVkSWNvbiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0OTc4LDYgKzE1NjYwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsaXN0X2NvbnRlbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNzM2NzA3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJwcmVmZXJlbmNlX2NhdGVnb3J5IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTUxMjEsNiArMTU4MTQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MzY3MDc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0iCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTE2Niw2ICsxNTg3MCwyMyBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUi5tZW51IgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iUi5tZW51IgorIHR5cGU9ImFuZHJvaWQuUi5tZW51IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlIucGx1cmFscyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1NTQ2LDYgKzE2MjY3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJzZWxlY3RUZXh0TW9kZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE3MDM5NDA4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InVua25vd25OYW1lIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYwODAsNiArMTY4MTIsNTAgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0RpYWxvZ19Ob0ZyYW1lIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sbyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTm9BY3Rpb25CYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9Ib2xvX05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9JbnB1dE1ldGhvZCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MTAyLDYgKzE2ODc4LDM5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9MaWdodF9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTGlnaHRfSG9sb19Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTczOTc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0xpZ2h0X05vVGl0bGVCYXIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjE3OSw2ICsxNjk4OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfTm9UaXRsZUJhcl9PdmVybGF5QWN0aW9uTW9kZXMiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUaGVtZV9QYW5lbCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE2MjY3LDYgKzE3MDg3LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUaGVtZV9XaXRoQWN0aW9uQmFyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzM5NjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyODksNiArMTcxMjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9BY3Rpb25CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQXV0b0NvbXBsZXRlVGV4dFZpZXciCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNjY2Myw2ICsxNzUwNSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X1NwaW5uZXJfRHJvcERvd24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3Mzk3MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfVGFiV2lkZ2V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwNDMsOCArMTk4OTYsMjU1MSBAQAogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+CiA8L3BhY2thZ2U+Cis8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbiIKKz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RHVyYXRpb24iCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUnVubmluZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVBbGxMaXN0ZW5lcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0RGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFyZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldHVwRW5kVmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXR1cFN0YXJ0VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uRW5kIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uUmVwZWF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9ySW5mbGF0ZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9ySW5mbGF0ZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JJbmZsYXRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJsb2FkQW5pbWF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBbmltYXRvckxpc3RlbmVyQWRhcHRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uQ2FuY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkFuaW1hdGlvbkVuZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BbmltYXRpb25SZXBlYXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uU3RhcnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9yU2V0IgorIGV4dGVuZHM9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmltYXRvclNldCIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDaGlsZEFuaW1hdGlvbnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yJmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXREdXJhdGlvbiIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhcnREZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNSdW5uaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwbGF5IgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXQuQnVpbGRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGxheVNlcXVlbnRpYWxseSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1zIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwbGF5VG9nZXRoZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtcyIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHVyYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkdXJhdGlvbiIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlcnBvbGF0b3IiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YXJ0RGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydERlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFuaW1hdG9yU2V0LkJ1aWxkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJhZnRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImFmdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVmb3JlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbSIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id2l0aCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW0iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkRvdWJsZUV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJEb3VibGVFdmFsdWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uRG91YmxlRXZhbHVhdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImV2YWx1YXRlIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGbG9hdEV2YWx1YXRvciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJGbG9hdEV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5GbG9hdEV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSW50RXZhbHVhdG9yIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkludEV2YWx1YXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5JbnRFdmFsdWF0b3IiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXZhbHVhdGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXJ0VmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVuZFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IktleWZyYW1lIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEubGFuZy5DbG9uZWFibGUiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuRmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLkRvdWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5ZnJhbWUiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFjdGlvbiIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IktleWZyYW1lIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLktleWZyYW1lIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xvbmUiCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFjdGlvbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVycG9sYXRvciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2xhc3MiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVycG9sYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VmFsdWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJMYXlvdXRUcmFuc2l0aW9uIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMYXlvdXRUcmFuc2l0aW9uIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkVHJhbnNpdGlvbkxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24uVHJhbnNpdGlvbkxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNoaWxkQWRkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2hpbGRSZW1vdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoaWxkIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJbnRlcnBvbGF0b3IiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFnZ2VyIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdGFydERlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUcmFuc2l0aW9uTGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXImZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVRyYW5zaXRpb25MaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmltYXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdG9yIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldER1cmF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZXJwb2xhdG9yIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFnZ2VyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvblR5cGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3RhcnREZWxheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlbGF5IiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFOR0VfQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSEFOR0VfRElTQVBQRUFSSU5HIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNBUFBFQVJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTGF5b3V0VHJhbnNpdGlvbi5UcmFuc2l0aW9uTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImVuZFRyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXdHcm91cCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXRpb25UeXBlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0aW9uVHlwZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJPYmplY3RBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJPYmplY3RBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ik9iamVjdEFuaW1hdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHVyYXRpb24iIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldFByb3BlcnR5TmFtZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFyZ2V0IgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9wZXJ0eU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iamF2YS5sYW5nLkNsb25lYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjbG9uZSIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEdldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcm9wZXJ0eU5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNldHRlciIKKyByZXR1cm49ImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFdmFsdWF0b3IiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJldmFsdWF0b3IiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0R2V0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZ2V0dGVyIiB0eXBlPSJqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvcGVydHlOYW1lIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNldHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNldHRlciIgdHlwZT0iamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJSR0JFdmFsdWF0b3IiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iUkdCRXZhbHVhdG9yIgorIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlJHQkV2YWx1YXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWN0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5kVmFsdWUiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlR5cGVFdmFsdWF0b3IiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJldmFsdWF0ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhY3Rpb24iIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzdGFydFZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlbmRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iVmFsdWVBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlZhbHVlQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlZhbHVlQW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9IlQuLi4iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZGRVcGRhdGVMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0ZWRWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0ZWRWYWx1ZSIKKyByZXR1cm49ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXJyZW50UGxheVRpbWUiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldER1cmF0aW9uIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFtZURlbGF5IgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEludGVycG9sYXRvciIKKyByZXR1cm49ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlcGVhdENvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJlcGVhdE1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RhcnREZWxheSIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VmFsdWVzIgorIHJldHVybj0iYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1J1bm5pbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVVwZGF0ZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXZlcnNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXJyZW50UGxheVRpbWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwbGF5VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREdXJhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJsb25nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEV2YWx1YXRvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEZyYW1lRGVsYXkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYW1lRGVsYXkiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW50ZXJwb2xhdG9yIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlcGVhdENvdW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZXBlYXRNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdGFydERlbGF5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhcnREZWxheSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyLi4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iVC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklORklOSVRFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkVTVEFSVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkVWRVJTRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJWYWx1ZUFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uQW5pbWF0aW9uVXBkYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb24iIHR5cGU9ImFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5hcHAiCiA+Cis8Y2xhc3MgbmFtZT0iQWN0aW9uQmFyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbkJhciIKKyB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYWRkVGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkVGFiIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWIiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGlvbkJhci5UYWIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpc3BsYXlPcHRpb25zIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRUYWIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3VGFiIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVRhYkF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNlbGVjdFRhYiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RGlzcGxheU9wdGlvbnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdGlvbnMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5T3B0aW9ucyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0aW9ucyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtYXNrIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuTmF2aWdhdGlvbkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNwaW5uZXJBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLk5hdmlnYXRpb25DYWxsYmFjayI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN0YW5kYXJkTmF2aWdhdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN1YnRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFN1YnRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhYk5hdmlnYXRpb25Nb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUaXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9ISURFX0hPTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfVVNFX0xPR08iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9DVVNUT00iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJOQVZJR0FUSU9OX01PREVfU1RBTkRBUkQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5BVklHQVRJT05fTU9ERV9UQUJTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2siCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTmF2aWdhdGlvbkl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbVBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW1JZCIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQWN0aW9uQmFyLlRhYiIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFjdGlvbkJhci5UYWIiCisgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRDdXN0b21WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJY29uIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRleHQiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2VsZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFiTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGFnIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvYmoiIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOVkFMSURfUE9TSVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFjdGlvbkJhci5UYWJMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25UYWJTZWxlY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFiIiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpb25CYXIuVGFiIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmdCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblRhYlVuc2VsZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhYiIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyLlRhYiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkFjdGl2aXR5IgogIGV4dGVuZHM9ImFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MTkwLDYgKzIyNTg2LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2IiB0eXBlPSJhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlJZCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmluZEZyYWdtZW50QnlUYWciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZmluZFZpZXdCeUlkIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyNTUsNiArMjI2NzcsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiIHR5cGU9ImFuZHJvaWQuYXBwLkFjdGl2aXR5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGlvbkJhciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkFjdGlvbkJhciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBcHBsaWNhdGlvbiIKICByZXR1cm49ImFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5MzIxLDEyICsyMjc1NCwxMiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRJbnN0YW5jZUNvdW50IgotIHJldHVybj0ibG9uZyIKKzxtZXRob2QgbmFtZT0iZ2V0RnJhZ21lbnRNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKQEAgLTE5MzY1LDYgKzIyNzk4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlck1hbmFnZXIiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5Mb2FkZXJNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldExvY2FsQ2xhc3NOYW1lIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTQ5OSw2ICsyMjk0MywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNDaGlsZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTk1MzksNyArMjMwMDUsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgpAQCAtMTk1ODMsNiArMjMwNDksMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkF0dGFjaEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uQXR0YWNoZWRUb1dpbmRvdyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAxNjksNiArMjM2NDgsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjAyODIsNiArMjM3NzQsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlbkZyYWdtZW50VHJhbnNhY3Rpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ib3Blbk9wdGlvbnNNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDMwOCw2ICsyMzgxMSw0NyBAQAogPHBhcmFtZXRlciBuYW1lPSJleGl0QW5pbSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjk5LDYgKzI0MjQzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aW9uTW9kZSIKKyByZXR1cm49ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA3MzEsNiArMjQyODgsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUlmTmVlZGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDgwNSw3ICsyNDM3OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgpAQCAtMjA4NTAsNyArMjQ0MjQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KQEAgLTIwOTYzLDYgKzI0NTM3LDE3IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlJFU1VMVF9DQU5DRUxFRCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIzNjY1LDYgKzI3MjUwLDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWN0aW9uQmFyIgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aW9uQmFyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENvbnRleHQiCiAgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMzc0Miw2ICsyNzMzOCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbnZhbGlkYXRlT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2hvd2luZyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQxMDMsNiArMjc3MTAsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uU3RvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjQ1MTEsNiArMjgxMzEsMjUxIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJEaWFsb2dGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZS5PbkNhbmNlbExpc3RlbmVyIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkRpYWxvZ0ZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImRpc21pc3MiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENhbmNlbGFibGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldERpYWxvZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkRpYWxvZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTaG93c0RpYWxvZyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGhlbWUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkaWFsb2ciIHR5cGU9ImFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVEaWFsb2ciCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5EaWFsb2ciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGlhbG9nIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldENhbmNlbGFibGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW5jZWxhYmxlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dzRGlhbG9nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd3NEaWFsb2ciIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0aGVtZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFjdGl2aXR5IiB0eXBlPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3ciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2FjdGlvbiIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9STUFMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVFlMRV9OT19GUkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RZTEVfTk9fSU5QVVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUWUxFX05PX1RJVExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRXhwYW5kYWJsZUxpc3RBY3Rpdml0eSIKICBleHRlbmRzPSJhbmRyb2lkLmFwcC5BY3Rpdml0eSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNDY3MCw2ICsyODUzNSwxMDc5IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGcmFnbWVudCIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZXF1YWxzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEFjdGl2aXR5IgorIHJldHVybj0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBcmd1bWVudHMiCisgcmV0dXJuPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEZyYWdtZW50TWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldElkIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyTWFuYWdlciIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UmV0YWluSW5zdGFuY2UiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGFnIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFRhcmdldEZyYWdtZW50IgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUYXJnZXRSZXF1ZXN0Q29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNoQ29kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc3RhbnRpYXRlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0FkZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGlkZGVuIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUmVzdW1lZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Zpc2libGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BY3Rpdml0eUNyZWF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQWN0aXZpdHlSZXN1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXN1bHRDb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25BdHRhY2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhY3Rpdml0eSIgdHlwZT0iYW5kcm9pZC5hcHAuQWN0aXZpdHkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db25maWd1cmF0aW9uQ2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld0NvbmZpZyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ29udGV4dEl0ZW1TZWxlY3RlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Iml0ZW0iIHR5cGU9ImFuZHJvaWQudmlldy5NZW51SXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGVBbmltYXRvciIKKyByZXR1cm49ImFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2l0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuZXh0QW5pbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51SW5mbyIgdHlwZT0iYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImluZmxhdGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlVmlldyIKKyByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmZsYXRlciIgdHlwZT0iYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3R3JvdXAiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNhdmVkSW5zdGFuY2VTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRlc3Ryb3lWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkRldGFjaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25IaWRkZW5DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGlkZGVuIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uSW5mbGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzYXZlZEluc3RhbmNlU3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG93TWVtb3J5IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbk9wdGlvbnNJdGVtU2VsZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25PcHRpb25zTWVudUNsb3NlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUGF1c2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZU9wdGlvbnNNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibWVudSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZXN1bWUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU2F2ZUluc3RhbmNlU3RhdGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRTdGF0ZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TdG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QXJndW1lbnRzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SGFzT3B0aW9uc01lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoYXNNZW51IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJldGFpbkluc3RhbmNlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmV0YWluIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRhcmdldEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0QWN0aXZpdHkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpdml0eUZvclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ1bnJlZ2lzdGVyRm9yQ29udGV4dE1lbnUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iRnJhZ21lbnQuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibXNnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYXVzZSIgdHlwZT0iamF2YS5sYW5nLkV4Y2VwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudE1hbmFnZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeUlkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaW5kRnJhZ21lbnRCeVRhZyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1bmRsZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHJhbnNhY3Rpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icG9wQmFja1N0YWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvcEJhY2tTdGFjayIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwb3BCYWNrU3RhY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icHV0RnJhZ21lbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJ1bmRsZSIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJGcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGQiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRhaW5lclZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkVG9CYWNrU3RhY2siCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY29tbWl0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGlkZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRW1wdHkiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVtb3ZlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmcmFnbWVudCIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVwbGFjZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGFpbmVyVmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZXBsYWNlIgorIHJldHVybj0iYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250YWluZXJWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q3VzdG9tQW5pbWF0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50ZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXhpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zaXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2l0aW9uU3R5bGUiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0eWxlUmVzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2hvdyIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9FTlRFUl9NQVNLIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX0VYSVRfTUFTSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9DTE9TRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjgxOTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFJBTlNJVF9GUkFHTUVOVF9PUEVOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNDA5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUUkFOU0lUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRSQU5TSVRfVU5TRVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ikluc3RydW1lbnRhdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTI2MTE5LDYgKzMxMDU3LDM3MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTGlzdEZyYWdtZW50IgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLkZyYWdtZW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdEZyYWdtZW50IgorIHR5cGU9ImFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRMaXN0QWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtSWQiCisgcmV0dXJuPSJsb25nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGVkSXRlbVBvc2l0aW9uIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTGlzdEl0ZW1DbGljayIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImwiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW1wdHlUZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMaXN0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RTaG93biIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNob3duIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RTaG93bk5vQW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2hvd24iIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyTWFuYWdlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImdldExvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbml0TG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzJmx0O0QmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlc3RhcnRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3MmbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RvcExvYWRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkxvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkNyZWF0ZUxvYWRlciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb2FkRmluaXNoZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyBleHRlbmRzPSJhbmRyb2lkLmFwcC5GcmFnbWVudCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlck1hbmFnaW5nRnJhZ21lbnQiCisgdHlwZT0iYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdpbmdGcmFnbWVudCIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkZXIiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlTG9hZGVyIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkluaXRpYWxpemVMb2FkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZENvbXBsZXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Mb2FkRmluaXNoZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtEJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyJmx0O0QmZ3Q7IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wTG9hZGluZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTG9jYWxBY3Rpdml0eU1hbmFnZXIiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjYwMiw2ICszMTkwNywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19ISUdIX1BSSU9SSVRZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTI4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfSU5TSVNURU5UIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjk4MzIsNiArMzUxNDgsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJVU0VTX1BPTElDWV9XQVRDSF9MT0dJTiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMwMTIxLDYgKzM1NDQ4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEdsb2JhbFByb3h5QWRtaW4iCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDE0Nyw2ICszNTQ4NSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNYXhpbXVtTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMTczLDYgKzM1NTI0LDg0IEBACiA8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRQYXNzd29yZFF1YWxpdHkiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAyNDksNiArMzU2NzgsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRHbG9iYWxQcm94eSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByb3h5U3BlYyIgdHlwZT0iamF2YS5uZXQuUHJveHkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4Y2x1c2lvbkxpc3QiIHR5cGU9ImphdmEudXRpbC5MaXN0Jmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDI3OSw2ICszNTcyNSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0aW1lTXMiIHR5cGU9ImxvbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwMjk0LDYgKzM1NzU1LDk2IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxldHRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkbWluIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRtaW4iIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsZW5ndGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZG1pbiIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxlbmd0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhc3N3b3JkUXVhbGl0eSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzAzODgsNiArMzU5MzksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjM5MzIxNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMTM3MSw2ICszNjkzMyw2NiBAQAogPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhcHBXaWRnZXRJZHMiIHR5cGU9ImludFtdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3cyIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYXBwV2lkZ2V0SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld3MiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InVwZGF0ZUFwcFdpZGdldCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzM5ODIsNiArMzk2MDQsNzEgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQXN5bmNUYXNrTG9hZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Mb2FkZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFzeW5jVGFza0xvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJjYW5jZWxMb2FkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmb3JjZUxvYWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRJbkJhY2tncm91bmQiCisgcmV0dXJuPSJEIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DYW5jZWxsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYXRhIiB0eXBlPSJEIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkJyb2FkY2FzdFJlY2VpdmVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDIxMiw2ICszOTg5OSw1NzEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkNsaXBEYXRhIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YSIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZEl0ZW0iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEuSXRlbSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJY29uIgorIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SXRlbSIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW1Db3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdJbnRlbnQiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV3UGxhaW5UZXh0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdSYXdVcmkiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imljb24iIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXdVcmkiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb2x2ZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpY29uIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDbGlwRGF0YS5JdGVtIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEYXRhLkl0ZW0iCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY29lcmNlVG9UZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW50ZW50IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkludGVudCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmkiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ2xpcERlc2NyaXB0aW9uIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ2xpcERlc2NyaXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBEZXNjcmlwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImNvbXBhcmVNaW1lVHlwZXMiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbmNyZXRlVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVzaXJlZFR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJmaWx0ZXJNaW1lVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExhYmVsIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNaW1lVHlwZSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TWltZVR5cGVDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNNaW1lVHlwZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUlNRVRZUEVfVEVYVF9JTlRFTlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7dGV4dC92bmQuYW5kcm9pZC5pbnRlbnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUlNRVRZUEVfVEVYVF9QTEFJTiIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0ZXh0L3BsYWluJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1JTUVUWVBFX1RFWFRfVVJJTElTVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0ZXh0L3VyaS1saXN0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgorIGV4dGVuZHM9ImFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9ImFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2hhdCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXIuT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmltYXJ5Q2xpcCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmltYXJ5Q2xpcERlc2NyaXB0aW9uIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUZXh0IgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1ByaW1hcnlDbGlwIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNUZXh0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2hhdCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXIuT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcmltYXJ5Q2xpcCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNsaXAiIHR5cGU9ImFuZHJvaWQuY29udGVudC5DbGlwRGF0YSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uUHJpbWFyeUNsaXBDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iQ29tcG9uZW50Q2FsbGJhY2tzIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zNDU4NSw2ICs0MDgzNywyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTdHJlYW1UeXBlcyIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1pbWVUeXBlRmlsdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFR5cGUiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzQ3MjEsNiArNDA5ODgsNDggQEAKIDxleGNlcHRpb24gbmFtZT0iRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuUGlwZUhlbHBlciIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZ1bmMiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXImbHQ7VCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDc4MSw2ICs0MTA5MCwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNodXRkb3duIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zNDgwMSw2ICs0MTEyMSwzNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRlbnRQcm92aWRlci5QaXBlRGF0YVdyaXRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0id3JpdGVEYXRhVG9QaXBlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvdXRwdXQiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9IlQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRlbnRQcm92aWRlckNsaWVudCIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM0ODczLDYgKzQxMjIyLDIzIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN0cmVhbVR5cGVzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmwiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGVGaWx0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzQ5NDMsNiArNDEzMDksMjcgQEAKIDxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yIgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3B0cyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icXVlcnkiCiAgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNTcxMyw2ICs0MjEwMCwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRob3JpdHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyZWFtVHlwZXMiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVybCIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtaW1lVHlwZUZpbHRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRTeW5jQWRhcHRlclR5cGVzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlN5bmNBZGFwdGVyVHlwZVtdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM1OTEwLDYgKzQyMzEyLDI1IEBACiA8ZXhjZXB0aW9uIG5hbWU9IkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibWltZVR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9wdHMiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJGaWxlTm90Rm91bmRFeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InF1ZXJ5IgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMzY1NzUsNiArNDI5OTYsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImtleVNldCIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icHV0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zNzYyNSw2ICs0NDA1NywyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvckhhbmRsZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVla1dhbGxwYXBlciIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0zOTA2Myw2ICs0NTUxNCwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlZWtXYWxscGFwZXIiCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTM5Mzg5LDYgKzQ1ODU5LDIyNSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ3Vyc29yTG9hZGVyIgorIGV4dGVuZHM9ImFuZHJvaWQuY29udGVudC5Bc3luY1Rhc2tMb2FkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJDdXJzb3JMb2FkZXIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic29ydE9yZGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVsaXZlclJlc3VsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZGVzdHJveSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvamVjdGlvbiIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmdbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNlbGVjdGlvbkFyZ3MiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29ydE9yZGVyIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmkiCisgcmV0dXJuPSJhbmRyb2lkLm5ldC5VcmkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibG9hZEluQmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ2FuY2VsbGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQcm9qZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJvamVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNvcnRPcmRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNvcnRPcmRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRVcmkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydExvYWRpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxpbnRlcmZhY2UgbmFtZT0iRGlhbG9nSW50ZXJmYWNlIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0zOTc1MCw2ICs0NjQzOSw5MyBAQAogPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5JSW50ZXJmYWNlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGlzcGF0Y2hQcmltYXJ5Q2xpcENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgorPGNsYXNzIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgZXh0ZW5kcz0iYW5kcm9pZC5vcy5CaW5kZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiPgorPC9pbXBsZW1lbnRzPgorPGNvbnN0cnVjdG9yIG5hbWU9IklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LklPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYXNCaW5kZXIiCisgcmV0dXJuPSJhbmRyb2lkLm9zLklCaW5kZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYXNJbnRlcmZhY2UiCisgcmV0dXJuPSJhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2JqIiB0eXBlPSJhbmRyb2lkLm9zLklCaW5kZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25UcmFuc2FjdCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InJlcGx5IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJJbnRlbnQiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC00MTk2OCw2ICs0ODc0NCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNUSU9OX1BBU1RFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaW50ZW50LmFjdGlvbi5QQVNURSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJBQ1RJT05fUElDSyIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00MjMwOSw2ICs0OTA5NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0FURUdPUllfQVBQX01BUktFVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmludGVudC5jYXRlZ29yeS5BUFBfTUFSS0VUJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNBVEVHT1JZX0JST1dTQUJMRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NDM2Niw2ICs1MTE2NCwxODMgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxvYWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxpdmVyUmVzdWx0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGF0YSIgdHlwZT0iRCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZvcmNlTG9hZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDb250ZXh0IgorIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Db250ZW50Q2hhbmdlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0b3BMb2FkaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLkZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTG9hZENvbXBsZXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Mb2FkZXImbHQ7RCZndDsiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9IkQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9Ik11dGFibGVDb250ZXh0V3JhcHBlciIKICBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDQ5MDUsNiArNTE4ODAsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZGVmVmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3RyaW5nU2V0IgorIHJldHVybj0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3Rlck9uU2hhcmVkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1MDQ3LDYgKzUyMDM3LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InB1dFN0cmluZ1NldCIKKyByZXR1cm49ImFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZXMiIHR5cGU9ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVtb3ZlIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTQ1NzY0LDYgKzUyNzY5LDE0NSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyBleHRlbmRzPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iWG1sRG9jdW1lbnRQcm92aWRlciIKKyB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZWxldGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbkFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZXNvdXJjZVhtbFB1bGxQYXJzZXIiCisgcmV0dXJuPSJvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZVVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRVcmlYbWxQdWxsUGFyc2VyIgorIHJldHVybj0ib3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imluc2VydCIKKyByZXR1cm49ImFuZHJvaWQubmV0LlVyaSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJhbmRyb2lkLm5ldC5VcmkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXMiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25DcmVhdGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwcm9qZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzb3J0T3JkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idXBkYXRlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ1cmkiIHR5cGU9ImFuZHJvaWQubmV0LlVyaSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlcyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8L3BhY2thZ2U+CiA8cGFja2FnZSBuYW1lPSJhbmRyb2lkLmNvbnRlbnQucG0iCiA+CkBAIC00NjAyOSw2ICs1MzE3MywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19JTU1FUlNJVkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1MTIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkxBR19NVUxUSVBST0NFU1MiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC00NjUxNiw2ICs1MzY4MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOUyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUyNDI4OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGTEFHX1NZU1RFTSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTQ5MDU0LDYgKzU2MjMxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX1NFTlNPUl9CQVJPTUVURVIiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYmFyb21ldGVyJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZFQVRVUkVfU0VOU09SX0NPTVBBU1MiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNDkwNjUsNiArNTYyNTMsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfU0VOU09SX0dZUk9TQ09QRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iRkVBVFVSRV9TRU5TT1JfTElHSFQiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTE3MTgsNiArNTg5MTcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iVE9VQ0hTQ1JFRU5fRklOR0VSIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTM1MTMsNiArNjA3MjMsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VXBkYXRlZEZpZWxkIgogIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01MzUyMCw3ICs2MDc0Myw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01MzU4OCw3ICs2MDgxMSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CkBAIC01Mzg3NCw3ICs2MTA5Nyw3IEBACiAgdm9sYXRpbGU9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KQEAgLTU0MDEwLDcgKzYxMjMzLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU0MDIzLDcgKzYxMjQ2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU0MDM2LDcgKzYxMjU5LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU0MDYyLDcgKzYxMjg1LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KQEAgLTU0NTM2LDYgKzYxNzU5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTQ3NzYsNiArNjIwMTIsNjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9CTE9CIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0ZMT0FUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGSUVMRF9UWVBFX0lOVEVHRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZJRUxEX1RZUEVfTlVMTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRklFTERfVFlQRV9TVFJJTkciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ3Vyc29ySW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIKICBleHRlbmRzPSJqYXZhLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIKQEAgLTU1MTMzLDYgKzYyNDI0LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2wiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0Jsb2IiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1MTQwLDcgKzYyNDQ2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTE1NSw3ICs2MjQ2MSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTUxNzAsNyArNjI0NzYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InJvdyIgdHlwZT0iaW50Ij4KQEAgLTU1MTg1LDcgKzYyNDkxLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJyb3ciIHR5cGU9ImludCI+CkBAIC01NTIwMCw3ICs2MjUwNiw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0icm93IiB0eXBlPSJpbnQiPgpAQCAtNTU2MTEsNiArNjI5MTcsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRUeXBlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFdhbnRzQWxsT25Nb3ZlQ2FsbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1NjIyLDYgKzYyOTQxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFdyYXBwZWRDdXJzb3IiCisgcmV0dXJuPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0FmdGVyTGFzdCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTU5MzAsNiArNjMyNjAsMjcgQEAKID4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxpbnRlcmZhY2UgbmFtZT0iRGF0YWJhc2VFcnJvckhhbmRsZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkNvcnJ1cHRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiT2JqIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iRGF0YWJhc2VVdGlscyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1OTYxLDYgKzYzMzEyLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9InNxbFN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhcHBlbmRTZWxlY3Rpb25BcmdzIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmFsdWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im5ld1ZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImFwcGVuZFZhbHVlVG9TcWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU1OTkzLDYgKzYzMzU5LDM4IEBACiA8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkYiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJzZWxlY3Rpb25BcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByb2ciIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2VsZWN0aW9uQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNyZWF0ZURiRnJvbVNxbFN0YXRlbWVudHMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU2NDMwLDYgKzYzODI4LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3FsU3RhdGVtZW50VHlwZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzcWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9uZ0ZvclF1ZXJ5IgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NjYxNiw2ICs2NDAyNyw4MyBAQAogPHBhcmFtZXRlciBuYW1lPSJlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX0FCT1JUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQVRUQUNIIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTVEFURU1FTlRfQkVHSU4iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9DT01NSVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUQVRFTUVOVF9PVEhFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1NFTEVDVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU1RBVEVNRU5UX1VQREFURSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkRhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC01Njg1MCw2ICs2NDMzOCwzOCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L2ltcGxlbWVudHM+Cis8Y29uc3RydWN0b3IgbmFtZT0iRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uQ29ycnVwdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRiT2JqIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNYXRyaXhDdXJzb3IiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdEN1cnNvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzMzMyw2ICs2NDg1MywxMTQgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJTUUxpdGVDbG9zYWJsZSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtNTc0NDQsNyArNjUwNzIsNyBAQAogIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvciIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iZGIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIj4KQEAgLTU3NDU2LDYgKzY1MDg0LDIwIEBACiA8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVRdWVyeSI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlQ3Vyc29yIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUN1cnNvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRyaXZlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yRHJpdmVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJlZGl0VGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InF1ZXJ5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVRdWVyeSI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImdldENvbHVtbk5hbWVzIgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZ1tdIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NTkzLDYgKzY1MjM1LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZ2luVHJhbnNhY3Rpb25XaXRoTGlzdGVuZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NjA2LDYgKzY1MjU5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zYWN0aW9uTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xvc2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU3NjYyLDYgKzY1MzI4LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9IndoZXJlQXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZ1tdIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVuZFRyYW5zYWN0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01NzcxOCw2ICs2NTM5NSwxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJ0YWJsZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QXR0YWNoZWREYnMiCisgcmV0dXJuPSJqYXZhLnV0aWwuQXJyYXlMaXN0Jmx0O2FuZHJvaWQudXRpbC5QYWlyJmx0O2phdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcmZ3Q7Jmd0OyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNYXhpbXVtU2l6ZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc3NTgsNyArNjU0NDYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTU3ODM5LDYgKzY1NTI3LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbmZsaWN0QWxnb3JpdGhtIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNEYXRhYmFzZUludGVncml0eU9rIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01Nzg5MCw3ICs2NTU4OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0idGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgpAQCAtNTc5MDUsNyArNjU2MDQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KQEAgLTU3OTU2LDYgKzY1NjU1LDI1IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib3BlbkRhdGFiYXNlIgorIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3JIYW5kbGVyIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9wZW5PckNyZWF0ZURhdGFiYXNlIgogIHJldHVybj0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTc5ODYsNiArNjU3MDQsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJxdWVyeSIKICByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4MTc5LDYgKzY1OTE0LDE5IEBACiA8ZXhjZXB0aW9uIG5hbWU9IlNRTEV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29ubmVjdGlvblBvb2xTaXplIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzaXplIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9jYWxlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODIwNSw2ICs2NTk1MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsb2NraW5nRW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNYXhTcWxDYWNoZVNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhY2hlU2l6ZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1heGltdW1TaXplIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODQwNyw2ICs2NjE2OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTUFYX1NRTF9DQUNIRV9TSVpFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik5PX0xPQ0FMSVpFRF9DT0xMQVRPUlMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC01ODUwNiw2ICs2NjI3OCw2MCBAQAogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb24iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlRGlza0lPRXhjZXB0aW9uIgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODY2NSw2ICs2NjQ5MSwyNCBAQAogPHBhcmFtZXRlciBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZU9wZW5IZWxwZXIiCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3BlbkhlbHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmYWN0b3J5IiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01ODc0Miw2ICs2NjU4NiwzMyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlUHJvZ3JhbSIKICBleHRlbmRzPSJhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTU4NzUwLDYgKzY2NjIxLDE5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJiaW5kQWxsQXJnc0FzU3RyaW5ncyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImJpbmRBcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iYmluZEJsb2IiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTU4ODY3LDcgKzY2NzUxLDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTU5MjkwLDYgKzY3MTc0LDMzIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iU1FMaXRlU3RhdGVtZW50IgogIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVByb2dyYW0iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNTkzMjAsNiArNjcyMzEsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZXhlY3V0ZVVwZGF0ZURlbGV0ZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaW1wbGVRdWVyeUZvckJsb2JGaWxlRGVzY3JpcHRvciIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2ltcGxlUXVlcnlGb3JMb25nIgogIHJldHVybj0ibG9uZyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC01OTM0Myw2ICs2NzI3NiwzMyBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIGV4dGVuZHM9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlcnJvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC02NDE0OSwxNiArNzIxMDksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJiaXRtYXAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJDYW52YXMiCi0gdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5DYW52YXMiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJnbCIgdHlwZT0iamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJjbGlwUGF0aCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjQ5MzIsNyArNzI4ODIsNyBAQAogPG1ldGhvZCBuYW1lPSJkcmF3VGV4dCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCkBAIC02NTA3NSwxNyArNzMwMjUsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJwYWludCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5QYWludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmcmVlR2xDYWNoZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0Q2xpcEJvdW5kcyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNjUxMzksOCArNzMwNzgsOCBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKQEAgLTY1MjAwLDYgKzczMTM5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSGFyZHdhcmVBY2NlbGVyYXRlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNPcGFxdWUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTY1NTA2LDIxICs3MzQ1Niw2IEBACiA8cGFyYW1ldGVyIG5hbWU9Im1hdHJpeCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5NYXRyaXgiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0Vmlld3BvcnQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJza2V3IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC02ODkxOCw3ICs3Njg1Myw3IEBACiA8bWV0aG9kIG5hbWU9InNldFNoYWRvd0xheWVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKQEAgLTc0ODg1LDYgKzgyODIwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNvbXB1dGVDb25zdGFudFNpemUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldENoYW5naW5nQ29uZmlndXJhdGlvbnMiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNzU3NzksNiArODM3MjUsMzYgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik1pcG1hcERyYXdhYmxlIgorIGV4dGVuZHM9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb250YWluZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNaXBtYXBEcmF3YWJsZSIKKyB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLk1pcG1hcERyYXdhYmxlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZERyYXdhYmxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZHJhd2FibGUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTmluZVBhdGNoRHJhd2FibGUiCiAgZXh0ZW5kcz0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC04MDA2OSw3ICs4ODA0NSw3IEBACiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAuMDAxMGYiCisgdmFsdWU9IjAuMDAxZiIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC04MTk1MSw2ICs4OTkyNywyNCBAQAogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9Im1vZGVJZCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ3aWR0aCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iS2V5Ym9hcmQiCisgdHlwZT0iYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuS2V5Ym9hcmQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ieG1sTGF5b3V0UmVzSWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgogPGNvbnN0cnVjdG9yIG5hbWU9IktleWJvYXJkIgogIHR5cGU9ImFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLktleWJvYXJkIgpAQCAtOTAzNTIsNiArOTgzNDYsNzggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icXVhbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc1Byb2ZpbGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InF1YWxpdHkiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNQcm9maWxlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjYW1lcmFJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJxdWFsaXR5IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzEwODBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfNzIwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9DSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlFVQUxJVFlfSElHSCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkwMzc0LDYgKzk4NDQwLDk0IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDYiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFXzQ4MFAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlFVQUxJVFlfVElNRV9MQVBTRV83MjBQIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfQ0lGIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAwMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJRVUFMSVRZX1RJTUVfTEFQU0VfSElHSCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX0xPVyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUVVBTElUWV9USU1FX0xBUFNFX1FDSUYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImF1ZGlvQml0UmF0ZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTkzNzgyLDYgKzEwMTkzNiwyNSBAQAogPHBhcmFtZXRlciBuYW1lPSJwcm9maWxlIiB0eXBlPSJhbmRyb2lkLm1lZGlhLkNhbWNvcmRlclByb2ZpbGUiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGltZUxhcHNlUGFyYW1ldGVycyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVRpbWVMYXBzZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5jb2RlckxldmVsIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmlkZW9FbmNvZGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC05OTMwNCw3ICsxMDc0NzcsNyBAQAogIHR5cGU9ImFuZHJvaWQubmV0LlNTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaGFuZHNoYWtlVGltZW91dE1pbGxpcyIgdHlwZT0iaW50Ij4KQEAgLTk5Nzc5LDYgKzEwNzk1MiwyMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRCb29sZWFuUXVlcnlQYXJhbWV0ZXIiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRFbmNvZGVkQXV0aG9yaXR5IgogIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTk5OTM1LDYgKzEwODEyMywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UXVlcnlQYXJhbWV0ZXJzIgogIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTAwMTgxLDYgKzEwODM4MCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjbGVhclF1ZXJ5IgorIHJldHVybj0iYW5kcm9pZC5uZXQuVXJpLkJ1aWxkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZW5jb2RlZEF1dGhvcml0eSIKICByZXR1cm49ImFuZHJvaWQubmV0LlVyaS5CdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEwMTQwNCw3ICsxMDk2MTQsNyBAQAogIHR5cGU9ImFuZHJvaWQubmV0Lmh0dHAuU3NsQ2VydGlmaWNhdGUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9Imlzc3VlZFRvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KQEAgLTEwMTQ3MSw3ICsxMDk2ODEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTEwMTQ5Myw3ICsxMDk3MDMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTEyMzMxMCw2ICsxMzE1MjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkhPTkVZQ09NQiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMDAwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCdW5kbGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTEyOTM0NSw2ICsxMzc1NjYsMTkgQEAKIDxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgogPC9leGNlcHRpb24+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY3JlYXRlUGlwZSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3JbXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEyOTM1Niw2ICsxMzc1OTAsMjMgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZnJvbURhdGEiCisgcmV0dXJuPSJhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImRhdGEiIHR5cGU9ImJ5dGVbXSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZnJvbVNvY2tldCIKICByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMjU1LDYgKzEzOTUwNiw1MyBAQAogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5vcy5zdG9yYWdlIgogPgorPGNsYXNzIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VFdmVudExpc3RlbmVyIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJvblN0b3JhZ2VTdGF0ZUNoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvbGRTdGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3U3RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Vc2JNYXNzU3RvcmFnZUNvbm5lY3Rpb25DaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29ubmVjdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlN0b3JhZ2VNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMjYzLDYgKzEzOTU2MSwyOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZGlzYWJsZVVzYk1hc3NTdG9yYWdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmFibGVVc2JNYXNzU3RvcmFnZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0TW91bnRlZE9iYlBhdGgiCiAgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMTI5MSw2ICsxMzk2MTEsMjggQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VDb25uZWN0ZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzVXNiTWFzc1N0b3JhZ2VFbmFibGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJtb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMzA2LDYgKzEzOTY0OCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJrZXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5tb3VudE9iYiIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMxMzIzLDYgKzEzOTY3OCwxMjQgQEAKIDxleGNlcHRpb24gbmFtZT0iSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIj4KIDwvZXhjZXB0aW9uPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InVucmVnaXN0ZXJMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZUV2ZW50TGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU3RvcmFnZVJlc3VsdENvZGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0b3JhZ2VSZXN1bHRDb2RlIgorIHR5cGU9ImFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlUmVzdWx0Q29kZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZEludGVybmFsRXJyb3IiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRNZWRpYUJsYW5rIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTWVkaWFDb3JydXB0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTQiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkTm9NZWRpYSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvbkZhaWxlZFN0b3JhZ2VCdXN5IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iLTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iT3BlcmF0aW9uRmFpbGVkU3RvcmFnZU1vdW50ZWQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPcGVyYXRpb25GYWlsZWRTdG9yYWdlTm90TW91bnRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii01IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik9wZXJhdGlvblN1Y2NlZWRlZCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPC9wYWNrYWdlPgogPHBhY2thZ2UgbmFtZT0iYW5kcm9pZC5wcmVmZXJlbmNlIgpAQCAtMTMyMTE4LDYgKzE0MDU5MSwxNDggQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiCisgZXh0ZW5kcz0iYW5kcm9pZC5wcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJmaW5kSW5kZXhPZlZhbHVlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFbnRyaWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEVudHJ5VmFsdWVzIgorIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZhbHVlcyIKKyByZXR1cm49ImphdmEudXRpbC5TZXQmbHQ7amF2YS5sYW5nLlN0cmluZyZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cmllcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudHJpZXMiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2VbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbnRyaWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cmllc1Jlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW50cnlWYWx1ZXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbnRyeVZhbHVlcyIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEVudHJ5VmFsdWVzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW50cnlWYWx1ZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFZhbHVlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlcyIgdHlwZT0iamF2YS51dGlsLlNldCZsdDtqYXZhLmxhbmcuU3RyaW5nJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMyMjM2LDYgKzE0MDg1MSwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHRyYXMiCisgcmV0dXJuPSJhbmRyb2lkLm9zLkJ1bmRsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRGcmFnbWVudCIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50ZW50IgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LkludGVudCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xMzI2NjgsNiArMTQxMzA1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLk9iamVjdCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrRXh0cmFzIgorIHJldHVybj0iYW5kcm9pZC5vcy5CdW5kbGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icGVyc2lzdEJvb2xlYW4iCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTEzMjc5OCw2ICsxNDE0NDYsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGcmFnbWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEludGVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTMzMTE2LDYgKzE0MTc3Nyw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudC5PblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgogPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VBY3Rpdml0eSIKICB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5IgogIHN0YXRpYz0iZmFsc2UiCkBAIC0xMzMxMzEsNiArMTQxNzk0LDQ3MCBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZXNSZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImZpbmRQcmVmZXJlbmNlIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFByZWZlcmVuY2VNYW5hZ2VyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJlZmVyZW5jZVNjcmVlbiIKKyByZXR1cm49ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzSGVhZGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZUhlYWRlcnMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzTXVsdGlQYW5lIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJsb2FkSGVhZGVyc0Zyb21SZXNvdXJjZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXImZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQnVpbGRIZWFkZXJzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciZndDsiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXRJbml0aWFsSGVhZGVyIgorIHJldHVybj0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eS5IZWFkZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXROZXdIZWFkZXIiCisgcmV0dXJuPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbkhlYWRlckNsaWNrIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbklzSGlkaW5nSGVhZGVycyIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25Jc011bHRpUGFuZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxlciIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25QcmVmZXJlbmNlVHJlZUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcmVmZXJlbmNlU2NyZWVuIiB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZmVyZW5jZSIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGlzdEZvb3RlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByZWZlcmVuY2VTY3JlZW4iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InByZWZlcmVuY2VTY3JlZW4iIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlU2NyZWVuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0UHJlZmVyZW5jZUZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwdXNoIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0V2l0aEZyYWdtZW50IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzd2l0Y2hUb0hlYWRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZyYWdtZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXJncyIgdHlwZT0iYW5kcm9pZC5vcy5CdW5kbGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJFWFRSQV9OT19IRUFERVJTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOm5vX2hlYWRlcnMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhUUkFfU0hPV19GUkFHTUVOVCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDs6YW5kcm9pZDpzaG93X2ZyYWdtZW50JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90OzphbmRyb2lkOnNob3dfZnJhZ21lbnRfYXJncyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUFjdGl2aXR5LkhlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQWN0aXZpdHkuSGVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8ZmllbGQgbmFtZT0iZnJhZ21lbnQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9ImZyYWdtZW50QXJndW1lbnRzIgorIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaWNvbiIKKyB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iaWNvblJlcyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJpbnRlbnQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InN1bW1hcnkiCisgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InRpdGxlIgorIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCisgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgorIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ2F0ZWdvcnkiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQiCisgZXh0ZW5kcz0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VGcmFnbWVudCIKKyB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImFkZFByZWZlcmVuY2VzRnJvbUludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CkBAIC0xMzMyMTQsNTEgKzE0MjM0MSwyOSBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Ci08Y2xhc3MgbmFtZT0iUHJlZmVyZW5jZUNhdGVnb3J5IgotIGV4dGVuZHM9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlR3JvdXAiCi0gYWJzdHJhY3Q9ImZhbHNlIgorPGludGVyZmFjZSBuYW1lPSJQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvblByZWZlcmVuY2VTdGFydEZyYWdtZW50IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsZXIiIHR5cGU9ImFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlRnJhZ21lbnQiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icHJlZiIgdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UiPgogPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPGNvbnN0cnVjdG9yIG5hbWU9IlByZWZlcmVuY2VDYXRlZ29yeSIKLSB0eXBlPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNhdGVnb3J5IgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJQcmVmZXJlbmNlQ2F0ZWdvcnkiCi0gdHlwZT0iYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VDYXRlZ29yeSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KLTwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTwvY2xhc3M+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlByZWZlcmVuY2VHcm91cCIKICBleHRlbmRzPSJhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTEzNDE1OCw5ICsxNDMyNjMsOSBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0iYyIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+CiA8L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8cGFyYW1ldGVyIG5hbWU9InN0cmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ0cnVuY2F0ZUhpc3RvcnkiCkBAIC0xMzQ1NDQsNyArMTQzNjQ5LDcgQEAKICB2YWx1ZT0iJnF1b3Q7dXJsJnF1b3Q7IgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+CkBAIC0xMzc2MDMsNiArMTQ2NzA4LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVJFQ1RPUllfUEFSQU1fS0VZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RpcmVjdG9yeSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMSU1JVF9QQVJBTV9LRVkiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7bGltaXQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQWdncmVnYXRpb25FeGNlcHRpb25zIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xMzc4NzgsNiArMTQ3MDA1LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InR5cGUiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkFERFJFU1MiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7ZGF0YTEmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iQ09OVEVOVF9GSUxURVJfVVJJIgogIHR5cGU9ImFuZHJvaWQubmV0LlVyaSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTM5NjM2LDYgKzE0ODc3NCw5MSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgorPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtkaXNwbGF5X25hbWVfYWx0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRJU1BMQVlfTkFNRV9QUklNQVJZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJESVNQTEFZX05BTUVfU09VUkNFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlfbmFtZV9zb3VyY2UmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEhPTkVUSUNfTkFNRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtwaG9uZXRpY19uYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT05FVElDX05BTUVfU1RZTEUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cGhvbmV0aWNfbmFtZV9zdHlsZSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTT1JUX0tFWV9BTFRFUk5BVElWRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleV9hbHQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU09SVF9LRVlfUFJJTUFSWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtzb3J0X2tleSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0xMzk3OTQsNiArMTQ5MDE3LDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0U3RhdHVzQ29sdW1ucyI+CkBAIC0xMzk5ODksNiArMTQ5MjE0LDEwIEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RTdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0c0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPGZpZWxkIG5hbWU9IkNPTlRFTlRfRElSRUNUT1JZIgpAQCAtMTQwMDI3LDYgKzE0OTI1Niw2OCBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5FbnRpdHkiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkJhc2VTeW5jQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RTdGF0dXNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGFDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN0YXR1c0NvbHVtbnMiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlN5bmNDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KKzxmaWVsZCBuYW1lPSJDT05URU5UX0RJUkVDVE9SWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtlbnRpdGllcyZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJEQVRBX0lEIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGFfaWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUkFXX0NPTlRBQ1RfSUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7cmF3X2NvbnRhY3RfaWQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMuUGhvdG8iCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDAwMzcsNyArMTQ5MzI4LDcgQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgotPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGFDb2x1bW5zIj4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhQ29sdW1uc1dpdGhKb2lucyI+CiA8L2ltcGxlbWVudHM+CiA8ZmllbGQgbmFtZT0iQ09OVEVOVF9ESVJFQ1RPUlkiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKQEAgLTE0MDA1MCw2ICsxNDkzNDEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBIT1RPIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2RhdGExNSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDwvY2xhc3M+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHNDb2x1bW5zIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTQwMzU1LDYgKzE0OTY1NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSVNfUkVBRF9PTkxZIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2lzX3JlYWRfb25seSZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJJU19TVVBFUl9QUklNQVJZIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MDQ0Miw2ICsxNDk3NTUsOCBAQAogPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE5hbWVDb2x1bW5zIj4KKzwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0T3B0aW9uc0NvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgogPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RTdGF0dXNDb2x1bW5zIj4KQEAgLTE0MDQ1NSw2ICsxNDk3NzAsMzg2IEBACiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuU3RhdHVzQ29sdW1ucyI+CiA8L2ltcGxlbWVudHM+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LkRpcmVjdG9yeSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+Cis8bWV0aG9kIG5hbWU9Im5vdGlmeURpcmVjdG9yeUNoYW5nZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb2x2ZXIiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJBQ0NPVU5UX05BTUUiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YWNjb3VudE5hbWUmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQUNDT1VOVF9UWVBFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FjY291bnRUeXBlJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfSVRFTV9UWVBFIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3ZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2NvbnRhY3RfZGlyZWN0b3J5JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNPTlRFTlRfVFlQRSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ09OVEVOVF9VUkkiCisgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRFRkFVTFQiCisgdHlwZT0ibG9uZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMEwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElSRUNUT1JZX0FVVEhPUklUWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthdXRob3JpdHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRElTUExBWV9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2Rpc3BsYXlOYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2V4cG9ydFN1cHBvcnQmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX05PTkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkVYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJMT0NBTF9JTlZJU0lCTEUiCisgdHlwZT0ibG9uZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMUwiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUEFDS0FHRV9OQU1FIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O3BhY2thZ2VOYW1lJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7c2hvcnRjdXRTdXBwb3J0JnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfREFUQV9JVEVNU19PTkxZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9SVENVVF9TVVBQT1JUX0ZVTEwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNIT1JUQ1VUX1NVUFBPUlRfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9SRVNPVVJDRV9JRCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDt0eXBlUmVzb3VyY2VJZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuRGlzcGxheU5hbWVTb3VyY2VzIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGZpZWxkIG5hbWU9IkVNQUlMIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTklDS05BTUUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzNSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJPUkdBTklaQVRJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJQSE9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNUUlVDVFVSRURfTkFNRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjQwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlVOREVGSU5FRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iQ29udGFjdHNDb250cmFjdC5GdWxsTmFtZVN0eWxlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGZpZWxkIG5hbWU9IkNISU5FU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkNKSyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSkFQQU5FU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktPUkVBTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXRVNURVJOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuR3JvdXBzIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQwNTMyLDYgKzE1MDIyNywxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KKzxmaWVsZCBuYW1lPSJBVVRPX0FERCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthdXRvX2FkZCZxdW90OyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJERUxFVEVEIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE0MDU0Myw2ICsxNTAyNDksMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZBVk9SSVRFUyIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtmYXZvcml0ZXMmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iR1JPVVBfVklTSUJMRSIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNDEwOTcsNiArMTUwODE0LDU4IEBACiA+CiA8L2ZpZWxkPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IkNvbnRhY3RzQ29udHJhY3QuUGhvbmV0aWNOYW1lU3R5bGUiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZmllbGQgbmFtZT0iSkFQQU5FU0UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktPUkVBTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUElOWUlOIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJVTkRFRklORUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPC9pbnRlcmZhY2U+CiA8Y2xhc3MgbmFtZT0iQ29udGFjdHNDb250cmFjdC5QcmVzZW5jZSIKICBleHRlbmRzPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuU3RhdHVzVXBkYXRlcyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNDEyNzksNiArMTUxMDQ4LDggQEAKID4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMiPgogPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3ROYW1lQ29sdW1ucyI+Cis8L2ltcGxlbWVudHM+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdE9wdGlvbnNDb2x1bW5zIj4KIDwvaW1wbGVtZW50cz4KIDxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c0NvbHVtbnMiPgpAQCAtMTQxMzQyLDcgKzE1MTExMyw3IEBACiAgdmFsdWU9IjEiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTE0MTQ4OSw2ICsxNTEyNjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlJBV19DT05UQUNUX0lTX1JFQURfT05MWSIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDtyYXdfY29udGFjdF9pc19yZWFkX29ubHkmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNDE3MDUsMTEgKzE1MTQ4NywxMSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSIKKzxmaWVsZCBuYW1lPSJDQVBBQklMSVRZX0hBU19WSURFTyIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKICB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjEiCisgdmFsdWU9IjIiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgpAQCAtMTQxNzIwLDcgKzE1MTUwMiw3IEBACiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgorIHZhbHVlPSIxIgogIHN0YXRpYz0idHJ1ZSIKICBmaW5hbD0idHJ1ZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTE1MDYzNiw3ICsxNjA0MTgsNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0idGV4dCIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KKzxwYXJhbWV0ZXIgbmFtZT0icyIgdHlwZT0iYW5kcm9pZC50ZXh0LkVkaXRhYmxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImJlZm9yZVRleHRDaGFuZ2VkIgpAQCAtMTU1NDY3LDYgKzE2NTI0OSwzNiBAQAogPgogPC9tZXRob2Q+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkxvYWRlclRlc3RDYXNlIgorIGV4dGVuZHM9ImFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2UiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJMb2FkZXJUZXN0Q2FzZSIKKyB0eXBlPSJhbmRyb2lkLnRlc3QuTG9hZGVyVGVzdENhc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0TG9hZGVyUmVzdWx0U3luY2hyb25vdXNseSIKKyByZXR1cm49IlQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxvYWRlciIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkxvYWRlciZsdDtUJmd0OyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb3JlQXNzZXJ0cyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE1ODM4Nyw2ICsxNjgxOTksMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmFjdG9yeSIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvcGVuT3JDcmVhdGVEYXRhYmFzZSIKKyByZXR1cm49ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZhY3RvcnkiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImVycm9ySGFuZGxlciIgdHlwZT0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJwZWVrV2FsbHBhcGVyIgogIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTg3MzEsMTcgKzE2ODU2Miw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9jb25zdHJ1Y3Rvcj4KLTxtZXRob2QgbmFtZT0iYWJvcnRVcGRhdGVzIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbG9zZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU4NzUzLDMwICsxNjg1NzMsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjb21taXRVcGRhdGVzIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWVzIiB0eXBlPSJqYXZhLnV0aWwuTWFwJmx0Oz8gZXh0ZW5kcyBqYXZhLmxhbmcuTG9uZywgPyBleHRlbmRzIGphdmEudXRpbC5NYXAmbHQ7amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCZndDsmZ3Q7Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvcHlTdHJpbmdUb0J1ZmZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU4ODAzLDE3ICsxNjg1OTksNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJkZWxldGVSb3ciCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEJsb2IiCiAgcmV0dXJuPSJieXRlW10iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU4OTk5LDggKzE2ODc4NCw4IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldFR5cGUiCisgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE1OTAwOSw4ICsxNjg3OTQsMTAgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iaGFzVXBkYXRlcyIKKzxtZXRob2QgbmFtZT0iZ2V0V2FudHNBbGxPbk1vdmVDYWxscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0xNTkyMjQsMTcgKzE2OTAxMSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InVyaSIgdHlwZT0iYW5kcm9pZC5uZXQuVXJpIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InN1cHBvcnRzVXBkYXRlcyIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTU5MjYxLDEyNCArMTY5MDM3LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib2JzZXJ2ZXIiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZUJsb2IiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYnl0ZVtdIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InVwZGF0ZURvdWJsZSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImNvbHVtbkluZGV4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJkb3VibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlRmxvYXQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlSW50IgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJ1cGRhdGVMb25nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImxvbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU2hvcnQiCi0gcmV0dXJuPSJib29sZWFuIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ic2hvcnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlU3RyaW5nIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0idXBkYXRlVG9OdWxsIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJNb2NrRGlhbG9nSW50ZXJmYWNlIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCkBAIC0xNjE1MzEsMTUgKzE3MTE4OSwyMyBAQAogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDbGlwYm9hcmRNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IkNsaXBib2FyZE1hbmFnZXIiCisgdHlwZT0iYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0VGV4dCIKICByZXR1cm49ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTYxNTUwLDcgKzE3MTIxNiw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzVGV4dCIKICByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTYxNTYxLDcgKzE3MTIyNyw3IEBACiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VGV4dCIKICByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgorIGFic3RyYWN0PSJ0cnVlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMTY0Mzg2LDYgKzE3NDA1MiwyOSBAQAogPHBhcmFtZXRlciBuYW1lPSJraW5kIiB0eXBlPSJqYXZhLmxhbmcuQ2xhc3MmbHQ7VCZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGV4dFJ1bkN1cnNvciIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFN0YXJ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRFbmQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImN1cnNvck9wdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBhaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imluc2VydCIKICByZXR1cm49ImFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE2NTQ0Niw3ICsxNzUxMzUsNyBAQAogPgogPHBhcmFtZXRlciBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KIDwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJwIiB0eXBlPSJhbmRyb2lkLnRleHQuVGV4dFBhaW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0icGFpbnQiIHR5cGU9ImFuZHJvaWQudGV4dC5UZXh0UGFpbnQiPgogPC9wYXJhbWV0ZXI+CiA8cGFyYW1ldGVyIG5hbWU9ImF2YWlsIiB0eXBlPSJmbG9hdCI+CiA8L3BhcmFtZXRlcj4KQEAgLTE3Mzg0Niw2ICsxODM1MzUsMTggQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuVGhyb3dhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBbmRyb2lkRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5FeGNlcHRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgpAQCAtMTczODgzLDYgKzE4MzU4NCwxOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2F1c2UiIHR5cGU9ImphdmEubGFuZy5UaHJvd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIgorIHR5cGU9ImFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+CiA8cGFyYW1ldGVyIG5hbWU9ImNhdXNlIiB0eXBlPSJqYXZhLmxhbmcuRXhjZXB0aW9uIj4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KQEAgLTE3NDg5MSw3ICsxODQ2MDQsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxjb25zdHJ1Y3RvciBuYW1lPSJFdmVudExvZ1RhZ3MiCkBAIC0xNzUwNDYsNiArMTg0NzU5LDQ4MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvblJlYWRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uQ2xvc2VhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJKc29uUmVhZGVyIgorIHR5cGU9ImFuZHJvaWQudXRpbC5Kc29uUmVhZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW4iIHR5cGU9ImphdmEuaW8uUmVhZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iYmVnaW5BcnJheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImJlZ2luT2JqZWN0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRBcnJheSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZE9iamVjdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Imhhc05leHQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0Qm9vbGVhbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHREb3VibGUiCisgcmV0dXJuPSJkb3VibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRJbnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRMb25nIgorIHJldHVybj0ibG9uZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ibmV4dE5hbWUiCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuZXh0TnVsbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im5leHRTdHJpbmciCisgcmV0dXJuPSJqYXZhLmxhbmcuU3RyaW5nIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJwZWVrIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TGVuaWVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImxlbmllbnQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2tpcFZhbHVlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3ludGF4RXJyb3IiCisgcmV0dXJuPSJqYXZhLmlvLklPRXhjZXB0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJKc29uVG9rZW4iCisgZXh0ZW5kcz0iamF2YS5sYW5nLkVudW0iCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZU9mIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Ub2tlbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlcyIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uVG9rZW5bXSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iSnNvbldyaXRlciIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImphdmEuaW8uQ2xvc2VhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJKc29uV3JpdGVyIgorIHR5cGU9ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0IiB0eXBlPSJqYXZhLmlvLldyaXRlciI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJlZ2luQXJyYXkiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYmVnaW5PYmplY3QiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2xvc2UiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRBcnJheSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJlbmRPYmplY3QiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZmx1c2giCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJuYW1lIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im51bGxWYWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbmRlbnQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbmRlbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0idmFsdWUiCisgcmV0dXJuPSJhbmRyb2lkLnV0aWwuSnNvbldyaXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IklPRXhjZXB0aW9uIiB0eXBlPSJqYXZhLmlvLklPRXhjZXB0aW9uIj4KKzwvZXhjZXB0aW9uPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InZhbHVlIgorIHJldHVybj0iYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZhbHVlIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iZG91YmxlIj4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ2YWx1ZSIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5Kc29uV3JpdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTG9nIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTc1NzcxLDcgKzE4NTk2MSw3IEBACiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgogIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iJnF1b3Q7KChhZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfChiaXp8YlthYmRlZmdoaWptbm9yc3R2d3l6XSl8KGNhdHxjb218Y29vcHxjW2FjZGZnaGlrbG1ub3J1dnh5el0pfGRbZWprbW96XXwoZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoZ292fGdbYWJkZWZnaGlsbW5wcXJzdHV3eV0pfGhba21ucnR1XXwoaW5mb3xpbnR8aVtkZWxtbm9xcnN0XSl8KGpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KG1pbHxtb2JpfG11c2V1bXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdKXwobmFtZXxuZXR8blthY2VmZ2lsb3BydXpdKXwob3JnfG9tKXwocHJvfHBbYWVmZ2hrbG1ucnN0d3ldKXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnl6XXwodGVsfHRyYXZlbHx0W2NkZmdoamtsbW5vcHJ0dnd6XSl8dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkmcXVvdDsiCisgdmFsdWU9IiZxdW90OygoYWVyb3xhcnBhfGFzaWF8YVtjZGVmZ2lsbW5vcXJzdHV3eHpdKXwoYml6fGJbYWJkZWZnaGlqbW5vcnN0dnd5el0pfChjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KGVkdXxlW2NlZ3JzdHVdKXxmW2lqa21vcl18KGdvdnxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldKXxoW2ttbnJ0dV18KGluZm98aW50fGlbZGVsbW5vcXJzdF0pfChqb2JzfGpbZW1vcF0pfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfChtaWx8bW9iaXxtdXNldW18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XSl8KG5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KG9yZ3xvbSl8KHByb3xwW2FlZmdoa2xtbnJzdHd5XSl8cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ5el18KHRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCh4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC1tZ2JhYW03YThofHhuXFwtXFwtbWdiZXJwNGE1ZDRhcnx4blxcLVxcLXdnYmgxY3x4blxcLVxcLXpja3phaCl8eVtldF18elthbXddKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNzU3ODIsNyArMTg1OTcyLDcgQEAKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgogIHRyYW5zaWVudD0iZmFsc2UiCiAgdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCl8eVtldHVdfHpbYW13XSkpJnF1b3Q7IgorIHZhbHVlPSImcXVvdDsoPzooPzphZXJvfGFycGF8YXNpYXxhW2NkZWZnaWxtbm9xcnN0dXd4el0pfCg/OmJpenxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdKXwoPzpjYXR8Y29tfGNvb3B8Y1thY2RmZ2hpa2xtbm9ydXZ4eXpdKXxkW2Vqa21vel18KD86ZWR1fGVbY2VncnN0dV0pfGZbaWprbW9yXXwoPzpnb3Z8Z1thYmRlZmdoaWxtbnBxcnN0dXd5XSl8aFtrbW5ydHVdfCg/OmluZm98aW50fGlbZGVsbW5vcXJzdF0pfCg/OmpvYnN8altlbW9wXSl8a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18KD86bWlsfG1vYml8bXVzZXVtfG1bYWNkZWdoa2xtbm9wcXJzdHV2d3h5el0pfCg/Om5hbWV8bmV0fG5bYWNlZmdpbG9wcnV6XSl8KD86b3JnfG9tKXwoPzpwcm98cFthZWZnaGtsbW5yc3R3eV0pfHFhfHJbZW9zdXddfHNbYWJjZGVnaGlqa2xtbm9ydHV2eXpdfCg/OnRlbHx0cmF2ZWx8dFtjZGZnaGprbG1ub3BydHZ3el0pfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfCg/OnhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLW1nYmFhbTdhOGh8eG5cXC1cXC1tZ2JlcnA0YTVkNGFyfHhuXFwtXFwtd2diaDFjfHhuXFwtXFwtemNremFoKXx5W2V0XXx6W2Ftd10pKSZxdW90OyIKICBzdGF0aWM9InRydWUiCiAgZmluYWw9InRydWUiCiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCkBAIC0xNzYwNDksNiArMTg2MjM5LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImtleSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlbW92ZUF0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRWYWx1ZUF0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNzc2NTQsNiArMTg3ODU3LDIzMSBAQAogPgogPC9maWVsZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iQWN0aW9uTW9kZSIKKyBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBY3Rpb25Nb2RlIgorIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImZpbmlzaCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDdXN0b21WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51IgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNZW51SW5mbGF0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U3VidGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VGl0bGUiCisgcmV0dXJuPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRDdXN0b21WaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJ0aXRsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VidGl0bGUiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U3VidGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJlc0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VGl0bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRpdGxlIiB0eXBlPSJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRpdGxlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyZXNJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJBY3Rpb25Nb2RlLkNhbGxiYWNrIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkFjdGlvbkl0ZW1DbGlja2VkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaXRlbSIgdHlwZT0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlQWN0aW9uTW9kZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im1lbnUiIHR5cGU9ImFuZHJvaWQudmlldy5NZW51Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGVzdHJveUFjdGlvbk1vZGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUHJlcGFyZUFjdGlvbk1vZGUiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZW51IiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IkNvbnRleHRNZW51IgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0xODI4NDUsNiArMTkzMjczLDE3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPG1ldGhvZCBuYW1lPSJnZXRBY3Rpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBbHBoYWJldGljU2hvcnRjdXQiCiAgcmV0dXJuPSJjaGFyIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTgzMDIxLDYgKzE5MzQ2MCwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBY3Rpb25WaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldEFscGhhYmV0aWNTaG9ydGN1dCIKICByZXR1cm49ImFuZHJvaWQudmlldy5NZW51SXRlbSIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTE4MzE1Myw2ICsxOTM2MDUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYWxwaGFDaGFyIiB0eXBlPSJjaGFyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNob3dBc0FjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWN0aW9uRW51bSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRpdGxlIgogIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJdGVtIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTgzMjA1LDYgKzE5MzY3MCwzOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ2aXNpYmxlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iU0hPV19BU19BQ1RJT05fQUxXQVlTIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9JRl9ST09NIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTSE9XX0FTX0FDVElPTl9ORVZFUiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xODQ4MDksNiArMTk1MzA3LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRTcGFuWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRTcGFuWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldEV2ZW50VGltZSIKICByZXR1cm49ImxvbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg0ODUzLDYgKzE5NTM3MywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRQcmV2aW91c1NwYW5YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJldmlvdXNTcGFuWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjYWxlRmFjdG9yIgogIHJldHVybj0iZmxvYXQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg2NDMyLDYgKzE5Njk3NCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJmb2N1c2FibGVNb2RlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iYWRkT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImFkZFRvdWNoYWJsZXMiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Njk4OSw2ICsxOTc1NDQsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QWxwaGEiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRBbmltYXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc0MzMsNiArMTk3OTk5LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJpbnRbXSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNYXRyaXgiCisgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRNZWFzdXJlZEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc1MTAsOCArMTk4MDg3LDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0T3ZlcnNjcm9sbE1vZGUiCi0gcmV0dXJuPSJpbnQiCis8bWV0aG9kIG5hbWU9ImdldE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzIgorIHJldHVybj0iamF2YS51dGlsLkxpc3QmbHQ7YW5kcm9pZC52aWV3LlZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciZndDsiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKQEAgLTE4NzU3Niw2ICsxOTgxNTMsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RYIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UGl2b3RZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0UmVzb3VyY2VzIgogIHJldHVybj0iYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg3NjMxLDYgKzE5ODIzMCw2MSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSb3RhdGlvbiIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJvdGF0aW9uWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWCIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlWSIKKyByZXR1cm49ImZsb2F0IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjcm9sbEJhclN0eWxlIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Nzc3Niw2ICsxOTg0MzAsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25YIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNsYXRpb25ZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VmVydGljYWxGYWRpbmdFZGdlTGVuZ3RoIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4Nzg3Nyw2ICsxOTg1NTMsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0UmVjdCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5SZWN0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFgiCisgcmV0dXJuPSJmbG9hdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRZIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaGFzRm9jdXMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODA5Nyw2ICsxOTg3OTUsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNIYXJkd2FyZUFjY2VsZXJhdGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJpc0hvcml6b250YWxGYWRpbmdFZGdlRW5hYmxlZCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg4MjA3LDYgKzE5ODkxNiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1NhdmVGcm9tUGFyZW50RW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNTY3JvbGxiYXJGYWRpbmdFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODg2NzQsMjUgKzE5OTM5NCw2IEBACiA8cGFyYW1ldGVyIG5hbWU9ImhlaWdodE1lYXN1cmVTcGVjIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ib25PdmVyc2Nyb2xsZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHJvdGVjdGVkIgotPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iY2xhbXBlZFgiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImNsYW1wZWRZIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uUmVzdG9yZUluc3RhbmNlU3RhdGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4ODg0NiwzNSArMTk5NTQ3LDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmlzaWJpbGl0eSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9Im92ZXJzY3JvbGxCeSIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImRlbHRhWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJkZWx0YVkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic2Nyb2xsWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InNjcm9sbFJhbmdlWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJzY3JvbGxSYW5nZVkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4T3ZlcnNjcm9sbFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4T3ZlcnNjcm9sbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iaXNUb3VjaEV2ZW50IiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InBlcmZvcm1DbGljayIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5MDU0LDYgKzE5OTcyNiwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEubGFuZy5SdW5uYWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJyZW1vdmVPbkxheW91dENoYW5nZUxpc3RlbmVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0icmVxdWVzdEZvY3VzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODkyNTcsNiArMTk5OTQyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImV2ZW50IiB0eXBlPSJhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWxwaGEiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbHBoYSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODkzMDksNiArMjAwMDA3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InJlc2lkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Qm90dG9tIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJib3R0b20iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDbGlja2FibGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTUzMCw2ICsyMDAyNDEsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW1zIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMZWZ0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsZWZ0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0TG9uZ0NsaWNrYWJsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5NzE0LDE5ICsyMDA0MzgsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJsIiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0T3ZlcnNjcm9sbE1vZGUiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyc2Nyb2xsTW9kZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFBhZGRpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTc0Niw2ICsyMDA0NTcsMzIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYm90dG9tIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UGl2b3RYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icGl2b3RYIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRQaXZvdFkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwaXZvdFkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFByZXNzZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTc1OSw2ICsyMDA0OTYsNTggQEAKIDxwYXJhbWV0ZXIgbmFtZT0icHJlc3NlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSaWdodCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSb3RhdGlvblgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJyb3RhdGlvblgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJvdGF0aW9uWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InJvdGF0aW9uWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2F2ZUVuYWJsZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE4OTc3Miw2ICsyMDA1NjEsNDUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTYXZlRnJvbVBhcmVudEVuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJlbmFibGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNjYWxlWCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlWCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2NhbGVZIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic2NhbGVZIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxCYXJTdHlsZSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5ODY1LDYgKzIwMDY5MywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5PYmplY3QiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0VG9wIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0b3AiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRUb3VjaERlbGVnYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODk4NzgsNiArMjAwNzE5LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlbGVnYXRlIiB0eXBlPSJhbmRyb2lkLnZpZXcuVG91Y2hEZWxlZ2F0ZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRUcmFuc2xhdGlvblgiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ0cmFuc2xhdGlvblgiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFRyYW5zbGF0aW9uWSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zbGF0aW9uWSIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5OTQzLDYgKzIwMDgxMCwzMiBAQAogPHBhcmFtZXRlciBuYW1lPSJ3aWxsTm90RHJhdyIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRYIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ieCIgdHlwZT0iZmxvYXQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0WSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImZsb2F0Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNob3dDb250ZXh0TWVudSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTg5OTU0LDYgKzIwMDg0NywxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEFjdGlvbk1vZGUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTAzNDksMzkgKzIwMTI1NSw2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KLTxmaWVsZCBuYW1lPSJPVkVSU0NST0xMX0FMV0FZUyIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIxIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgotPGZpZWxkIG5hbWU9Ik9WRVJTQ1JPTExfTkVWRVIiCi0gdHlwZT0iaW50IgotIHRyYW5zaWVudD0iZmFsc2UiCi0gdm9sYXRpbGU9ImZhbHNlIgotIHZhbHVlPSIyIgotIHN0YXRpYz0idHJ1ZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlBSRVNTRURfRU5BQkxFRF9GT0NVU0VEX1NFTEVDVEVEX1NUQVRFX1NFVCIKICB0eXBlPSJpbnRbXSIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTkwODk1LDYgKzIwMTc2OCw0MyBAQAogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgorPGludGVyZmFjZSBuYW1lPSJWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uTGF5b3V0Q2hhbmdlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGVmdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ0b3AiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYm90dG9tIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZExlZnQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib2xkVG9wIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZFJpZ2h0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9Im9sZEJvdHRvbSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxpbnRlcmZhY2UgbmFtZT0iVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTE5MTE0NCwyOCArMjAyMDU0LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNjYWxlZFBhZ2luZ1RvdWNoU2xvcCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTE5NjMsNiArMjAyODUxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRyYXdpbmdUaW1lIiB0eXBlPSJsb25nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImVuZFZpZXdUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZm9jdXNTZWFyY2giCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTIxNzMsNiArMjAzMDc0LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExheW91dFRyYW5zaXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFBlcnNpc3RlbnREcmF3aW5nQ2FjaGUiCiAgcmV0dXJuPSJpbnQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTkyMjcxLDYgKzIwMzE4MywxNyBAQAogIHZpc2liaWxpdHk9InByb3RlY3RlZCIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01vdGlvbkV2ZW50U3BsaXR0aW5nRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibWVhc3VyZUNoaWxkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3MzQsNiArMjAzNjU3LDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImFuaW1hdGlvbkxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRMYXlvdXRUcmFuc2l0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idHJhbnNpdGlvbiIgdHlwZT0iYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzcGxpdCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3ODYsNiArMjAzNzM1LDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luYWxWaWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN0YXJ0TGF5b3V0QW5pbWF0aW9uIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTI3OTcsNiArMjAzNzYxLDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN0YXJ0Vmlld1RyYW5zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ1cGRhdGVWaWV3TGF5b3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xOTM0NzYsNiArMjA0NDUzLDIxIEBACiA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpbmFsVmlldyIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5hbFZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjYWxsYmFjayIgdHlwZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlZpZXdTdHViIgogIGV4dGVuZHM9ImFuZHJvaWQudmlldy5WaWV3IgpAQCAtMTk0MTUyLDYgKzIwNTE0NCwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJoYXNGZWF0dXJlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmVhdHVyZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Imhhc1NvZnRJbnB1dE1vZGUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NDE2Myw2ICsyMDUxNjgsMTkgQEAKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaW52YWxpZGF0ZVBhbmVsTWVudSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmVhdHVyZUlkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iaXNBY3RpdmUiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NDcyNCw2ICsyMDU3NDIsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXBwTmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRXaW5kb3dNYW5hZ2VyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id20iIHR5cGU9ImFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcHBUb2tlbiIgdHlwZT0iYW5kcm9pZC5vcy5JQmluZGVyIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcHBOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InN1cGVyRGlzcGF0Y2hLZXlFdmVudCIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xOTQ4MjgsNiArMjA1ODY1LDM5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9CQVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0FDVElPTl9NT0RFX09WRVJMQVkiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX0NPTlRFWFRfTUVOVSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTE5NDg1MCw2ICsyMDU5MjAsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkZFQVRVUkVfSEFSRFdBUkVfQUNDRUxFUkFURUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJGRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTUyMDksNiArMjA2MjkwLDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uU3RhcnRBY3Rpb25Nb2RlIgorIHJldHVybj0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY2FsbGJhY2siIHR5cGU9ImFuZHJvaWQudmlldy5BY3Rpb25Nb2RlLkNhbGxiYWNrIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uV2luZG93QXR0cmlidXRlc0NoYW5nZWQiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMTk1Njk4LDYgKzIwNjc5MiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0yMTQ3NDgzNjQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZMQUdfSUdOT1JFX0NIRUVLX1BSRVNTRVMiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xOTc1ODQsNiArMjA4Njg5LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFNjYWxlRmFjdG9yIgorIHJldHVybj0iZmxvYXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0U3RhcnRPZmZzZXQiCiAgcmV0dXJuPSJsb25nIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTE5NzYyMSw2ICsyMDg3MzcsMjMgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0VHJhbnNmb3JtYXRpb24iCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJyZW50VGltZSIgdHlwZT0ibG9uZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0VHJhbnNmb3JtYXRpb24iIHR5cGU9ImFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb24iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InNjYWxlIiB0eXBlPSJmbG9hdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRaQWRqdXN0bWVudCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDE5MTcsNiArMjEzMDUwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFN1YnR5cGVzIgorIHJldHVybj0iamF2YS51dGlsLkFycmF5TGlzdCZsdDthbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RJbmZvLklucHV0TWV0aG9kU3VidHlwZSZndDsiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9hZEljb24iCiAgcmV0dXJuPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwMTk2OSw2ICsyMTMxMTMsMTA4IEBACiA+CiA8L2ZpZWxkPgogPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJJbnB1dE1ldGhvZEluZm8uSW5wdXRNZXRob2RTdWJ0eXBlIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KKzxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRFeHRyYVZhbHVlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRJY29uSWQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0TG9jYWxlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRNb2RlIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXROYW1lIgorIHJldHVybj0iamF2YS5sYW5nLlN0cmluZyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ3cml0ZVRvUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVzdCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InBhcmNlbGFibGVGbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0iQ1JFQVRPUiIKKyB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iSW5wdXRNZXRob2RNYW5hZ2VyIgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA0OTg0LDYgKzIxNjIzMCwxNyBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxtZXRob2QgbmFtZT0iZW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0QWxsb3dGaWxlQWNjZXNzIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDUyNjYsNyArMjE2NTIzLDcgQEAKICBzeW5jaHJvbml6ZWQ9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTIwNTM1OCwxNyArMjE2NjE1LDYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZCIKLSByZXR1cm49ImJvb2xlYW4iCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0VXNlV2lkZVZpZXdQb3J0IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDU2MTAsNiArMjE2ODU2LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImZsYWciIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0RW5hYmxlU21vb3RoVHJhbnNpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGYW50YXN5Rm9udEZhbWlseSIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA1ODEyLDcgKzIxNzA3MSw3IEBACiAgc3luY2hyb25pemVkPSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJmbGFnIiB0eXBlPSJib29sZWFuIj4KQEAgLTIwNTk2MSwxOSArMjE3MjIwLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idXNlIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFVzZVdpZGVWaWV3UG9ydCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA2NTU1LDYgKzIxNzgwMSwyMiBAQAogPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJXZWJWaWV3IgorIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InByaXZhdGVCcm93c2luZyIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+CiA8bWV0aG9kIG5hbWU9ImFkZEphdmFzY3JpcHRJbnRlcmZhY2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNjYwNSw2ICsyMTc4NjcsMjggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iY2FuWm9vbUluIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJjYW5ab29tT3V0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjYXB0dXJlUGljdHVyZSIKICByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDY5NjQsNiArMjE4MjQ4LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFZpc2libGVUaXRsZUhlaWdodCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRab29tQ29udHJvbHMiCiAgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDcwMjEsNiArMjE4MzE2LDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ibG9hZERhdGEiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzM0MCw2ICsyMTg2NDYsMzYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ib3V0U3RhdGUiIHR5cGU9ImFuZHJvaWQub3MuQnVuZGxlIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNhdmVXZWJBcmNoaXZlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmlsZW5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2F2ZVdlYkFyY2hpdmUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJiYXNlbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXV0b25hbWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLndlYmtpdC5WYWx1ZUNhbGxiYWNrJmx0O2phdmEubGFuZy5TdHJpbmcmZ3Q7Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENlcnRpZmljYXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDc0ODksNiArMjE4ODI1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNsaWVudCIgdHlwZT0iYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93RmluZERpYWxvZyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic3RvcExvYWRpbmciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIwNzkzNyw3ICsyMTkyODYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQud2Via2l0LldlYlZpZXciPgpAQCAtMjA4MzQ0LDYgKzIxOTY5MywxNyBAQAogPHBhcmFtZXRlciBuYW1lPSJhZnRlciIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImNsZWFyQ2hvaWNlcyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iY2xlYXJUZXh0RmlsdGVyIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDgzNjYsNiArMjE5NzI2LDYxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtQ291bnQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1JZHMiCisgcmV0dXJuPSJsb25nW10iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbiIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRDaGVja2VkSXRlbVBvc2l0aW9ucyIKKyByZXR1cm49ImFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXkiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRMaXN0UGFkZGluZ0JvdHRvbSIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg1MDksNiArMjE5OTI0LDE5IEBACiAgdmlzaWJpbGl0eT0icHJvdGVjdGVkIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzSXRlbUNoZWNrZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImlzU2Nyb2xsaW5nQ2FjaGVFbmFibGVkIgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg1ODgsNiArMjIwMDE2LDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZW1vdGVBZGFwdGVyRGlzY29ubmVjdGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvblJlc3RvcmVJbnN0YW5jZVN0YXRlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg2ODcsNiArMjIwMTM3LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZpZXdzIiB0eXBlPSJqYXZhLnV0aWwuTGlzdCZsdDthbmRyb2lkLnZpZXcuVmlldyZndDsiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFkYXB0ZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldENhY2hlQ29sb3JIaW50IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMDg3MDAsNiArMjIwMTYzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImNvbG9yIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q2hvaWNlTW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNob2ljZU1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXREcmF3U2VsZWN0b3JPblRvcCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NzM5LDYgKzIyMDIxNSwzNCBAQAogPHBhcmFtZXRlciBuYW1lPSJmaWx0ZXJUZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEl0ZW1DaGVja2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0T25TY3JvbGxMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4NzY1LDYgKzIyMDI2OSwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuUmVjeWNsZXJMaXN0ZW5lciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0U2Nyb2xsSW5kaWNhdG9ycyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4OTE0LDYgKzIyMDQzMSwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJib3VuZFBvc2l0aW9uIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic21vb3RoU2Nyb2xsVG9Qb3NpdGlvbkZyb21Ub3AiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJ2ZXJpZnlEcmF3YWJsZSIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjA4OTI3LDYgKzIyMDQ1OSw1MCBAQAogPHBhcmFtZXRlciBuYW1lPSJkciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUUkFOU0NSSVBUX01PREVfQUxXQVlTX1NDUk9MTCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwOTAxOCw2ICsyMjA1OTQsMzUgQEAKIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IkFic0xpc3RWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LkFjdGlvbk1vZGUuQ2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJvbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImxvbmciPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImNoZWNrZWQiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGludGVyZmFjZSBuYW1lPSJBYnNMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0idHJ1ZSIKQEAgLTIxMDE5NCw2ICsyMjE3OTksNTgyIEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8Y2xhc3MgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldyIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdBbmltYXRvciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkFkYXB0ZXJWaWV3QW5pbWF0b3IiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImdldEFkYXB0ZXIiCisgcmV0dXJuPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEN1cnJlbnRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0RGlzcGxheWVkQ2hpbGQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5BbmltYXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZFZpZXciCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuVmlldyIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25SZXN0b3JlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25TYXZlSW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsYWJsZSIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBbmltYXRlRmlyc3RWaWV3IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYW5pbWF0ZSIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXREaXNwbGF5ZWRDaGlsZCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9IndoaWNoQ2hpbGQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbkFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImluQW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRJbkFuaW1hdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUlEIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T3V0QW5pbWF0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3V0QW5pbWF0aW9uIiB0eXBlPSJhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPdXRBbmltYXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VJRCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFJlbW90ZVZpZXdzQWRhcHRlciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dOZXh0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93UHJldmlvdXMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlld0FuaW1hdG9yIgorIGFic3RyYWN0PSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlclZpZXdGbGlwcGVyIgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3RmxpcHBlciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVyVmlld0ZsaXBwZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdGbGlwcGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iaXNBdXRvU3RhcnQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImlzRmxpcHBpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEF1dG9TdGFydCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImF1dG9TdGFydCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRGbGlwSW50ZXJ2YWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJtaWxsaXNlY29uZHMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdGFydEZsaXBwaW5nIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzdG9wRmxpcHBpbmciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJsb2FkQWRhcHRlciIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0idXJpIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJqYXZhLmxhbmcuT2JqZWN0Li4uIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImxvYWRDdXJzb3JBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iamF2YS5sYW5nLk9iamVjdC4uLiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9jbGFzcz4KKzxjbGFzcyBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJBZGFwdGVycy5DdXJzb3JCaW5kZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yQmluZGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9ImJpbmQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXciIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Im1UcmFuc2Zvcm1hdGlvbiIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzwvZmllbGQ+Cis8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIgorIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8Y29uc3RydWN0b3IgbmFtZT0iQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb24iCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9InRyYW5zZm9ybSIKKyByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY3Vyc29yIiB0eXBlPSJhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iY29sdW1uSW5kZXgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJ0cmFuc2Zvcm1Ub1Jlc291cmNlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjdXJzb3IiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJjb2x1bW5JbmRleCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8ZmllbGQgbmFtZT0ibUNvbnRleHQiCisgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCis+Cis8L2ZpZWxkPgorPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJBbHBoYWJldEluZGV4ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjEyMTgxLDYgKzIyNDM2MiwyMCBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iYmluZFZpZXciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMjEyMzI4LDYgKzIyNDUyMywyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJhdXRvUmVxdWVyeSIgdHlwZT0iYm9vbGVhbiI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpbml0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InByb3RlY3RlZCIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im5ld0Ryb3BEb3duVmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMjM5OSw2ICsyMjQ2MTEsMjggQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZmlsdGVyUXVlcnlQcm92aWRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuRmlsdGVyUXVlcnlQcm92aWRlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkZMQUdfQVVUT19SRVFVRVJZIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJDdXJzb3JUcmVlQWRhcHRlciIKICBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIgpAQCAtMjE0ODM4LDcgKzIyNzA3Miw3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFN0cmV0Y2hNb2RlIgorPG1ldGhvZCBuYW1lPSJnZXROdW1Db2x1bW5zIgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE0ODQ5LDggKzIyNzA4Myw4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCi0gcmV0dXJuPSJ2b2lkIgorPG1ldGhvZCBuYW1lPSJnZXRTdHJldGNoTW9kZSIKKyByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjE0ODU5LDggKzIyNzA5Myw2IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Ci08L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRDb2x1bW5XaWR0aCIKICByZXR1cm49InZvaWQiCkBAIC0yMTQ5NTMsNiArMjI3MTg1LDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InZlcnRpY2FsU3BhY2luZyIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJBVVRPX0ZJVCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIxNjAyNCw2ICsyMjgyNjksMjAgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IkxpbmVhckxheW91dCIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgogPG1ldGhvZCBuYW1lPSJnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4IgogIHJldHVybj0iaW50IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjA2OCw2ICsyMjgzMjcsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uTGF5b3V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTYxNDEsNiArMjI4NDExLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imhvcml6b250YWxHcmF2aXR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRPcmllbnRhdGlvbiIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2MzM3LDYgKzIyODYyMCw2OTEgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJMaXN0UG9wdXBXaW5kb3ciCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iTGlzdFBvcHVwV2luZG93IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVBdHRyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9Ikxpc3RQb3B1cFdpbmRvdyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0UG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iYXR0cnMiIHR5cGU9ImFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlQXR0ciIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZVJlcyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iY2xlYXJMaXN0U2VsZWN0aW9uIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkaXNtaXNzIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRBbmNob3JWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0QmFja2dyb3VuZCIKKyByZXR1cm49ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SGVpZ2h0IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEhvcml6b250YWxPZmZzZXQiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldExpc3RWaWV3IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuTGlzdFZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtIgorIHJldHVybj0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRTZWxlY3RlZEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24iCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U2VsZWN0ZWRWaWV3IgorIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRXaWR0aCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0lucHV0TWV0aG9kTm90TmVlZGVkIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc01vZGFsIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1Nob3dpbmciCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uS2V5RG93biIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVByZUltZSIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImtleUNvZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5LZXlFdmVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvbktleVVwIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ia2V5Q29kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJldmVudCIgdHlwZT0iYW5kcm9pZC52aWV3LktleUV2ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBlcmZvcm1JdGVtQ2xpY2siCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InBvc3RTaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iYWRhcHRlciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5jaG9yVmlldyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImFuY2hvciIgdHlwZT0iYW5kcm9pZC52aWV3LlZpZXciPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0QW5pbWF0aW9uU3R5bGUiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhbmltYXRpb25TdHlsZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEJhY2tncm91bmREcmF3YWJsZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImQiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0Q29udGVudFdpZHRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIZWlnaHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJoZWlnaHQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRIb3Jpem9udGFsT2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW5wdXRNZXRob2RNb2RlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldExpc3RTZWxlY3RvciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdG9yIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldE1vZGFsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kYWwiIHR5cGU9ImJvb2xlYW4iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25EaXNtaXNzTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3cuT25EaXNtaXNzTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtQ2xpY2tMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNsaWNrTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lciIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InNlbGVjdGVkTGlzdGVuZXIiIHR5cGU9ImFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UHJvbXB0UG9zaXRpb24iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFByb21wdFZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJwcm9tcHQiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFNlbGVjdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U29mdElucHV0TW9kZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im1vZGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRWZXJ0aWNhbE9mZnNldCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im9mZnNldCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFdpZHRoIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0id2lkdGgiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05FRURFRCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSU5QVVRfTUVUSE9EX05PVF9ORUVERUQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik1BVENIX1BBUkVOVCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ii0xIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlBPU0lUSU9OX1BST01QVF9BQk9WRSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iUE9TSVRJT05fUFJPTVBUX0JFTE9XIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXUkFQX0NPTlRFTlQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSItMiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXciCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2NDQxLDE3ICsyMjk0MDksNiBAQAogPHBhcmFtZXRlciBuYW1lPSJ2IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJjbGVhckNob2ljZXMiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImZpbmRWaWV3VHJhdmVyc2FsIgogIHJldHVybj0iYW5kcm9pZC52aWV3LlZpZXciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2NDk2LDUxICsyMjk0NTMsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtSWRzIgotIHJldHVybj0ibG9uZ1tdIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENoZWNrZWRJdGVtUG9zaXRpb24iCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMiCi0gcmV0dXJuPSJhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldENob2ljZU1vZGUiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtMjE2NjEwLDQxICsyMjk1MjMsNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRPdmVyc2Nyb2xsRm9vdGVyIgotIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRPdmVyc2Nyb2xsSGVhZGVyIgotIHJldHVybj0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0l0ZW1DaGVja2VkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZW1vdmVGb290ZXJWaWV3IgogIHJldHVybj0iYm9vbGVhbiIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMTY2NzEsMzIgKzIyOTU0OSw2IEBACiA8cGFyYW1ldGVyIG5hbWU9InYiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEFkYXB0ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzZXRDaG9pY2VNb2RlIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY2hvaWNlTW9kZSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldERpdmlkZXIiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjc0OSwyMSArMjI5NjAxLDYgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaGVhZGVyRGl2aWRlcnNFbmFibGVkIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldEl0ZW1DaGVja2VkIgotIHJldHVybj0idm9pZCIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImJvb2xlYW4iPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0SXRlbXNDYW5Gb2N1cyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE2Nzc3LDMyICsyMjk2MTQsNiBAQAogPHBhcmFtZXRlciBuYW1lPSJpdGVtc0NhbkZvY3VzIiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9InNldE92ZXJzY3JvbGxGb290ZXIiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJmb290ZXIiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic2V0T3ZlcnNjcm9sbEhlYWRlciIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImhlYWRlciIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRTZWxlY3Rpb24iCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxNjg0MiwzOSArMjI5NjUzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9InkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgotPGZpZWxkIG5hbWU9IkNIT0lDRV9NT0RFX01VTFRJUExFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMiIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCis8bWV0aG9kIG5hbWU9InNtb290aFNjcm9sbEJ5T2Zmc2V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfTk9ORSIKLSB0eXBlPSJpbnQiCi0gdHJhbnNpZW50PSJmYWxzZSIKLSB2b2xhdGlsZT0iZmFsc2UiCi0gdmFsdWU9IjAiCi0gc3RhdGljPSJ0cnVlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvZmllbGQ+Ci08ZmllbGQgbmFtZT0iQ0hPSUNFX01PREVfU0lOR0xFIgotIHR5cGU9ImludCIKLSB0cmFuc2llbnQ9ImZhbHNlIgotIHZvbGF0aWxlPSJmYWxzZSIKLSB2YWx1ZT0iMSIKLSBzdGF0aWM9InRydWUiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9maWVsZD4KKzxwYXJhbWV0ZXIgbmFtZT0ib2Zmc2V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iTGlzdFZpZXcuRml4ZWRWaWV3SW5mbyIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgpAQCAtMjE3Mzc0LDcgKzIzMDE2NSw3IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Ci08Y2xhc3MgbmFtZT0iT3ZlclNjcm9sbGVyIgorPGNsYXNzIG5hbWU9IlBvcHVwTWVudSIKICBleHRlbmRzPSJqYXZhLmxhbmcuT2JqZWN0IgogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgpAQCAtMjE3MzgyLDggKzIzMDE3Myw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPGNvbnN0cnVjdG9yIG5hbWU9Ik92ZXJTY3JvbGxlciIKLSB0eXBlPSJhbmRyb2lkLndpZGdldC5PdmVyU2Nyb2xsZXIiCis8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBNZW51IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlBvcHVwTWVudSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKQEAgLTIxNzM5MSwzNiArMjMwMTgyLDEwIEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgotPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgorPHBhcmFtZXRlciBuYW1lPSJhbmNob3IiIHR5cGU9ImFuZHJvaWQudmlldy5WaWV3Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KLTxjb25zdHJ1Y3RvciBuYW1lPSJPdmVyU2Nyb2xsZXIiCi0gdHlwZT0iYW5kcm9pZC53aWRnZXQuT3ZlclNjcm9sbGVyIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImludGVycG9sYXRvciIgdHlwZT0iYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3IiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImJvdW5jZUNvZWZmaWNpZW50WCIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImJvdW5jZUNvZWZmaWNpZW50WSIgdHlwZT0iZmxvYXQiPgotPC9wYXJhbWV0ZXI+Ci08L2NvbnN0cnVjdG9yPgotPG1ldGhvZCBuYW1lPSJhYm9ydEFuaW1hdGlvbiIKKzxtZXRob2QgbmFtZT0iZGlzbWlzcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTc0MzEsOCArMjMwMTk2LDggQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iY29tcHV0ZVNjcm9sbE9mZnNldCIKLSByZXR1cm49ImJvb2xlYW4iCis8bWV0aG9kIG5hbWU9ImdldE1lbnUiCisgcmV0dXJuPSJhbmRyb2lkLnZpZXcuTWVudSIKICBhYnN0cmFjdD0iZmFsc2UiCiAgbmF0aXZlPSJmYWxzZSIKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgpAQCAtMjE3NDQyLDcgKzIzMDIwNywxOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJmbGluZyIKKzxtZXRob2QgbmFtZT0iZ2V0TWVudUluZmxhdGVyIgorIHJldHVybj0iYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgogIG5hdGl2ZT0iZmFsc2UiCkBAIC0yMTc0NTIsMjQgKzIzMDIyOCwxMCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0idmVsb2NpdHlZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5ZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFkiIHR5cGU9ImludCI+Cis8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnUuT25NZW51SXRlbUNsaWNrTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZmxpbmciCis8bWV0aG9kIG5hbWU9InNob3ciCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKICBuYXRpdmU9ImZhbHNlIgpAQCAtMjE3NDc5LDIyNiArMjMwMjQxLDI5IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InZlbG9jaXR5WCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJ2ZWxvY2l0eVkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1pblkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWF4WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWCIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJvdmVyWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImZvcmNlRmluaXNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9ImZpbmlzaGVkIiB0eXBlPSJib29sZWFuIj4KLTwvcGFyYW1ldGVyPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldEN1cnJYIgotIHJldHVybj0iaW50IgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0iZ2V0Q3VyclkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRGaW5hbFgiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRGaW5hbFkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdGFydFgiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJnZXRTdGFydFkiCi0gcmV0dXJuPSJpbnQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJpc0ZpbmlzaGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImlzT3ZlcnNjcm9sbGVkIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0iZmluYWxYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im92ZXJYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ibm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZCIKLSByZXR1cm49InZvaWQiCi0gYWJzdHJhY3Q9ImZhbHNlIgotIG5hdGl2ZT0iZmFsc2UiCi0gc3luY2hyb25pemVkPSJmYWxzZSIKLSBzdGF0aWM9ImZhbHNlIgotIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKLSB2aXNpYmlsaXR5PSJwdWJsaWMiCi0+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJmaW5hbFkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ib3ZlclkiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTwvbWV0aG9kPgotPG1ldGhvZCBuYW1lPSJzcHJpbmdiYWNrIgotIHJldHVybj0iYm9vbGVhbiIKLSBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJmYWxzZSIKLSBzeW5jaHJvbml6ZWQ9ImZhbHNlIgotIHN0YXRpYz0iZmFsc2UiCi0gZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgotIHZpc2liaWxpdHk9InB1YmxpYyIKLT4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRYIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9InN0YXJ0WSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtaW5YIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9Im1heFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ibWluWSIgdHlwZT0iaW50Ij4KLTwvcGFyYW1ldGVyPgotPHBhcmFtZXRlciBuYW1lPSJtYXhZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRTY3JvbGwiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR5IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08L21ldGhvZD4KLTxtZXRob2QgbmFtZT0ic3RhcnRTY3JvbGwiCi0gcmV0dXJuPSJ2b2lkIgotIGFic3RyYWN0PSJmYWxzZSIKLSBuYXRpdmU9ImZhbHNlIgotIHN5bmNocm9uaXplZD0iZmFsc2UiCi0gc3RhdGljPSJmYWxzZSIKLSBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCi0gdmlzaWJpbGl0eT0icHVibGljIgotPgotPHBhcmFtZXRlciBuYW1lPSJzdGFydFgiIHR5cGU9ImludCI+Ci08L3BhcmFtZXRlcj4KLTxwYXJhbWV0ZXIgbmFtZT0ic3RhcnRZIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR4IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR5IiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+Ci08cGFyYW1ldGVyIG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJpbnQiPgotPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8aW50ZXJmYWNlIG5hbWU9IlBvcHVwTWVudS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxtZXRob2QgbmFtZT0ib25NZW51SXRlbUNsaWNrIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpdGVtIiB0eXBlPSJhbmRyb2lkLnZpZXcuTWVudUl0ZW0iPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzwvaW50ZXJmYWNlPgogPGNsYXNzIG5hbWU9IlBvcHVwV2luZG93IgogIGV4dGVuZHM9ImphdmEubGFuZy5PYmplY3QiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE3NzUwLDYgKzIzMDMxNSwyMiBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJkZWZTdHlsZUF0dHIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGVSZXMiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iUG9wdXBXaW5kb3ciCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3ciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgogPC9jb25zdHJ1Y3Rvcj4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQb3B1cFdpbmRvdyIKICB0eXBlPSJhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdyIKQEAgLTIxODc3OSw2ICsyMzEzNjAsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhjbHVkZU1pbWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0SW1hZ2VUb0RlZmF1bHQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldE1vZGUiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxOTkxNSw2ICsyMzI1MDcsMjEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0idmFsdWUiIHR5cGU9ImRvdWJsZSI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRFbXB0eVZpZXciCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZW1wdHlWaWV3SWQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRGbG9hdCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjE5OTk0LDYgKzIzMjYwMSwyMyBAQAogPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEludGVudCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtZXRob2ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJzZXRMb25nIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjAwNDUsNiArMjMyNjY5LDUxIEBACiA8cGFyYW1ldGVyIG5hbWU9ImluZGV0ZXJtaW5hdGUiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJvZmZzZXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRSZW1vdGVBZGFwdGVyIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0idmlld0lkIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImludGVudCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkludGVudCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTY3JvbGxQb3NpdGlvbiIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJwb3NpdGlvbiIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFNob3J0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjAxNDEsNiArMjMyODEwLDMyIEBACiA8cGFyYW1ldGVyIG5hbWU9InZpc2liaWxpdHkiIHR5cGU9ImludCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzaG93TmV4dCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNob3dQcmV2aW91cyIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9InZpZXdJZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDIwNyw2ICsyMzI5MDIsMTYwIEBACiA8aW1wbGVtZW50cyBuYW1lPSJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIj4KIDwvaW1wbGVtZW50cz4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iUmVtb3RlVmlld3NTZXJ2aWNlIgorIGV4dGVuZHM9ImFuZHJvaWQuYXBwLlNlcnZpY2UiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlbW90ZVZpZXdzU2VydmljZSIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3c1NlcnZpY2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0ib25CaW5kIgorIHJldHVybj0iYW5kcm9pZC5vcy5JQmluZGVyIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbnRlbnQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5JbnRlbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25HZXRWaWV3RmFjdG9yeSIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzU2VydmljZS5SZW1vdGVWaWV3c0ZhY3RvcnkiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW50ZW50IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuSW50ZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJSZW1vdGVWaWV3c1NlcnZpY2UuUmVtb3RlVmlld3NGYWN0b3J5IgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJnZXRDb3VudCIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldEl0ZW1JZCIKKyByZXR1cm49ImxvbmciCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRMb2FkaW5nVmlldyIKKyByZXR1cm49ImFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0Vmlld0F0IgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0icG9zaXRpb24iIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRWaWV3VHlwZUNvdW50IgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iaGFzU3RhYmxlSWRzIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uQ3JlYXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uRGF0YVNldENoYW5nZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ib25EZXN0cm95IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJSZXNvdXJjZUN1cnNvckFkYXB0ZXIiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIyMDI0NSw2ICsyMzMwOTQsMjIgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iYXV0b1JlcXVlcnkiIHR5cGU9ImJvb2xlYW4iPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlJlc291cmNlQ3Vyc29yQWRhcHRlciIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXIiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibGF5b3V0IiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImMiIHR5cGU9ImFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJmbGFncyIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0ibmV3VmlldyIKICByZXR1cm49ImFuZHJvaWQudmlldy5WaWV3IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIyMDg3Myw2ICsyMzM3MzgsMjI4IEBACiA+CiA8L21ldGhvZD4KIDwvY2xhc3M+Cis8Y2xhc3MgbmFtZT0iU2VhcmNoVmlldyIKKyBleHRlbmRzPSJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxjb25zdHJ1Y3RvciBuYW1lPSJTZWFyY2hWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlNlYXJjaFZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU2VhcmNoVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TZWFyY2hWaWV3IgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dCIgdHlwZT0iYW5kcm9pZC5jb250ZW50LkNvbnRleHQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImF0dHJzIiB0eXBlPSJhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZ2V0U3VnZ2VzdGlvbnNBZGFwdGVyIgorIHJldHVybj0iYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc0ljb25maWVkQnlEZWZhdWx0IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQiCisgcmV0dXJuPSJib29sZWFuIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEljb25pZmllZEJ5RGVmYXVsdCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Imljb25pZmllZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJsaXN0ZW5lciIgdHlwZT0iYW5kcm9pZC53aWRnZXQuU2VhcmNoVmlldy5PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0UXVlcnkiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic3VibWl0IiB0eXBlPSJib29sZWFuIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldFF1ZXJ5SGludCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImhpbnQiIHR5cGU9ImphdmEubGFuZy5DaGFyU2VxdWVuY2UiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2V0U2VhcmNoYWJsZUluZm8iCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzZWFyY2hhYmxlIiB0eXBlPSJhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWJtaXRCdXR0b25FbmFibGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlZCIgdHlwZT0iYm9vbGVhbiI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJzZXRTdWdnZXN0aW9uc0FkYXB0ZXIiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJhZGFwdGVyIiB0eXBlPSJhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2NsYXNzPgorPGludGVyZmFjZSBuYW1lPSJTZWFyY2hWaWV3LkZpbHRlcmFibGVMaXN0QWRhcHRlciIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQud2lkZ2V0LkZpbHRlcmFibGUiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIiPgorPC9pbXBsZW1lbnRzPgorPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IlNlYXJjaFZpZXcuT25DbG9zZUxpc3RlbmVyIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPG1ldGhvZCBuYW1lPSJvbkNsb3NlIgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KKzxpbnRlcmZhY2UgbmFtZT0iU2VhcmNoVmlldy5PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIiCisgYWJzdHJhY3Q9InRydWUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8bWV0aG9kIG5hbWU9Im9uUXVlcnlUZXh0Q2hhbmdlZCIKKyByZXR1cm49ImJvb2xlYW4iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ibmV3VGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN1Ym1pdFF1ZXJ5IgorIHJldHVybj0iYm9vbGVhbiIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJxdWVyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlNlY3Rpb25JbmRleGVyIgogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCkBAIC0yMjIyNTYsNiArMjM1MzQzLDE4IEBACiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KIDwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJtb2RlIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNwaW5uZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgogPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+CiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CkBAIC0yMjIyNzMsNiArMjM1MzcyLDIyIEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlZlN0eWxlIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPGNvbnN0cnVjdG9yIG5hbWU9IlNwaW5uZXIiCisgdHlwZT0iYW5kcm9pZC53aWRnZXQuU3Bpbm5lciIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZGVmU3R5bGUiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ibW9kZSIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9jb25zdHJ1Y3Rvcj4KIDxtZXRob2QgbmFtZT0iZ2V0UHJvbXB0IgogIHJldHVybj0iamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yMjIzMjUsNiArMjM1NDQwLDI4IEBACiA8cGFyYW1ldGVyIG5hbWU9InByb21wdElkIiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJNT0RFX0RJQUxPRyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iTU9ERV9EUk9QRE9XTiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8L2NsYXNzPgogPGludGVyZmFjZSBuYW1lPSJTcGlubmVyQWRhcHRlciIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTIyMjM1Myw2ICsyMzU0OTAsMzcgQEAKIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+CiA8L2ludGVyZmFjZT4KKzxjbGFzcyBuYW1lPSJTdGFja1ZpZXciCisgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXdBbmltYXRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGNvbnN0cnVjdG9yIG5hbWU9IlN0YWNrVmlldyIKKyB0eXBlPSJhbmRyb2lkLndpZGdldC5TdGFja1ZpZXciCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IiB0eXBlPSJhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8Y29uc3RydWN0b3IgbmFtZT0iU3RhY2tWaWV3IgorIHR5cGU9ImFuZHJvaWQud2lkZ2V0LlN0YWNrVmlldyIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImNvbnRleHQiIHR5cGU9ImFuZHJvaWQuY29udGVudC5Db250ZXh0Ij4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhdHRycyIgdHlwZT0iYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCI+Cis8L3BhcmFtZXRlcj4KKzwvY29uc3RydWN0b3I+Cis8L2NsYXNzPgogPGNsYXNzIG5hbWU9IlRhYkhvc3QiCiAgZXh0ZW5kcz0iYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtNDE0MzA1LDcgKzQyNzQ3Myw3IEBACiAgYWJzdHJhY3Q9InRydWUiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8bWV0aG9kIG5hbWU9ImdldExlbmd0aCIKQEAgLTQxNDc5NCw3ICs0Mjc5NjIsNyBAQAogIGFic3RyYWN0PSJ0cnVlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJjaGFyYWN0ZXJzIgpAQCAtNDE1MDA5LDcgKzQyODE3Nyw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPGltcGxlbWVudHMgbmFtZT0ib3JnLnhtbC5zYXguRFRESGFuZGxlciI+CkBAIC00MTU0NzYsNyArNDI4NjQ0LDcgQEAKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0icGFyc2UiCkBAIC00MTY5MDgsNyArNDMwMDc2LDcgQEAKICBhYnN0cmFjdD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8aW1wbGVtZW50cyBuYW1lPSJvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0Ij4KQEAgLTQxODM5Nyw3ICs0MzE1NjUsNyBAQAogIGFic3RyYWN0PSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxtZXRob2QgbmFtZT0ibWFrZVBhcnNlciIKZGlmZiAtLWdpdCBhL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEgYi9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCmluZGV4IDMwMTg4M2YuLmY5MDFiZmIgMTAwNjQ0Ci0tLSBhL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKKysrIGIvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkFuZHJvaWRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwpAQCAtOTgsNiArOTcsOCBAQAogICAgICAgICAgICAgc2VuZEJyb2FkY2FzdCgpOwogICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygicHJvZmlsZSIpKSB7CiAgICAgICAgICAgICBydW5Qcm9maWxlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJkdW1waGVhcCIpKSB7CisgICAgICAgICAgICBydW5EdW1wSGVhcCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjb21tYW5kOiAiICsgb3ApOwogICAgICAgICB9CkBAIC0xNDAsNiArMTQxLDMxIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKGtleSwgSW50ZWdlci52YWx1ZU9mKHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgaGFzSW50ZW50SW5mbyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5lcXVhbHMoIi0tZWlhIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV4dEFyZ1JlcXVpcmVkKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IHZhbHVlLnNwbGl0KCIsIik7CisgICAgICAgICAgICAgICAgaW50W10gbGlzdCA9IG5ldyBpbnRbc3RyaW5ncy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsaXN0W2ldID0gSW50ZWdlci52YWx1ZU9mKHN0cmluZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBsaXN0KTsKKyAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1lbCIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShrZXksIExvbmcudmFsdWVPZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGhhc0ludGVudEluZm8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuZXF1YWxzKCItLWVsYSIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSB2YWx1ZS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIGxvbmdbXSBsaXN0ID0gbmV3IGxvbmdbc3RyaW5ncy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsaXN0W2ldID0gTG9uZy52YWx1ZU9mKHN0cmluZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoa2V5LCBsaXN0KTsKKyAgICAgICAgICAgICAgICBoYXNJbnRlbnRJbmZvID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LmVxdWFscygiLS1leiIpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5leHRBcmdSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5leHRBcmdSZXF1aXJlZCgpOwpAQCAtNDI0LDYgKzQ1MCwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkR1bXBIZWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gbWFuYWdlZCA9ICEiLW4iLmVxdWFscyhuZXh0T3B0aW9uKCkpOworICAgICAgICBTdHJpbmcgcHJvY2VzcyA9IG5leHRBcmdSZXF1aXJlZCgpOworICAgICAgICBTdHJpbmcgaGVhcEZpbGUgPSBuZXh0QXJnUmVxdWlyZWQoKTsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmZCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLm9wZW4oCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGhlYXBGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9DUkVBVEUgfAorICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5NT0RFX1RSVU5DQVRFIHwKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IuTU9ERV9SRUFEX1dSSVRFKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6IFVuYWJsZSB0byBvcGVuIGZpbGU6ICIgKyBoZWFwRmlsZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1BbS5kdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBoZWFwRmlsZSwgZmQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZEV4Y2VwdGlvbigiSEVBUCBEVU1QIEZBSUxFRCBvbiBwcm9jZXNzICIgKyBwcm9jZXNzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgSW50ZW50UmVjZWl2ZXIgZXh0ZW5kcyBJSW50ZW50UmVjZWl2ZXIuU3R1YiB7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQgPSBmYWxzZTsKIApAQCAtNTkxLDggKzYzOSwxNSBAQAogICAgICAgICAgICAgICAgICIgICAgICAgIC1wIDxGSUxFPjogd3JpdGUgcHJvZmlsaW5nIGRhdGEgdG8gPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICAtdzogd2FpdCBmb3IgaW5zdHJ1bWVudGF0aW9uIHRvIGZpbmlzaCBiZWZvcmUgcmV0dXJuaW5nXG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIHJ1biBhIHRlc3QgcGFja2FnZSBhZ2FpbnN0IGFuIGFwcGxpY2F0aW9uOiBhbSBpbnN0cnVtZW50IFtmbGFnc10gPFRFU1RfUEFDS0FHRT4vPFJVTk5FUl9DTEFTUz5cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC1lIDx0ZXN0cnVubmVyX2ZsYWc+IDx0ZXN0cnVubmVyX3ZhbHVlPiBbLDx0ZXN0cnVubmVyX3ZhbHVlPl1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIC13IHdhaXQgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaCAocmVxdWlyZWQpXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtciB1c2Ugd2l0aCAtZSBwZXJmIHRydWUgdG8gZ2VuZXJhdGUgcmF3IG91dHB1dCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzXG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IHByb2ZpbGluZzogYW0gcHJvZmlsZSA8UFJPQ0VTUz4gc3RhcnQgPEZJTEU+XG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0b3AgcHJvZmlsaW5nOiBhbSBwcm9maWxlIDxQUk9DRVNTPiBzdG9wXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGR1bXAgaGVhcDogYW0gZHVtcGhlYXAgW2ZsYWdzXSA8UFJPQ0VTUz4gPEZJTEU+XG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICAtbjogZHVtcCBuYXRpdmUgaGVhcCBpbnN0ZWFkIG9mIG1hbmFnZWQgaGVhcFxuIiArCiAgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICA8SU5URU5UPiBzcGVjaWZpY2F0aW9ucyBpbmNsdWRlIHRoZXNlIGZsYWdzOlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy1hIDxBQ1RJT04+XSBbLWQgPERBVEFfVVJJPl0gWy10IDxNSU1FX1RZUEU+XVxuIiArCkBAIC02MDAsNyArNjU1LDEwIEBACiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy1lfC0tZXMgPEVYVFJBX0tFWT4gPEVYVFJBX1NUUklOR19WQUxVRT4gLi4uXVxuIiArCiAgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZXNuIDxFWFRSQV9LRVk+IC4uLl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWV6IDxFWFRSQV9LRVk+IDxFWFRSQV9CT09MRUFOX1ZBTFVFPiAuLi5dXG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICBbLWV8LS1laSA8RVhUUkFfS0VZPiA8RVhUUkFfSU5UX1ZBTFVFPiAuLi5dXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBbLS1laSA8RVhUUkFfS0VZPiA8RVhUUkFfSU5UX1ZBTFVFPiAuLi5dXG4iICsKKyAgICAgICAgICAgICAgICAiICAgICAgICBbLS1lbCA8RVhUUkFfS0VZPiA8RVhUUkFfTE9OR19WQUxVRT4gLi4uXVxuIiArCisgICAgICAgICAgICAgICAgIiAgICAgICAgWy0tZWlhIDxFWFRSQV9LRVk+IDxFWFRSQV9JTlRfVkFMVUU+Wyw8RVhUUkFfSU5UX1ZBTFVFLi4uXV1cbiIgKworICAgICAgICAgICAgICAgICIgICAgICAgIFstLWVsYSA8RVhUUkFfS0VZPiA8RVhUUkFfTE9OR19WQUxVRT5bLDxFWFRSQV9MT05HX1ZBTFVFLi4uXV1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstbiA8Q09NUE9ORU5UPl0gWy1mIDxGTEFHUz5dXG4iICsKICAgICAgICAgICAgICAgICAiICAgICAgICBbLS1ncmFudC1yZWFkLXVyaS1wZXJtaXNzaW9uXSBbLS1ncmFudC13cml0ZS11cmktcGVybWlzc2lvbl1cbiIgKwogICAgICAgICAgICAgICAgICIgICAgICAgIFstLWRlYnVnLWxvZy1yZXNvbHV0aW9uXVxuIiArCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDZlOWNhYWYuLmEwOTY2NmUgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC0zOSw2ICszOSw4IEBACiBzdGF0aWMgY2hhciBjbWRsaW5lX2J1ZlsxNjM4NF0gPSAiKHVua25vd24pIjsKIHN0YXRpYyBjb25zdCBjaGFyICpkdW1wX3RyYWNlc19wYXRoID0gTlVMTDsKIAorc3RhdGljIGNoYXIgc2NyZWVuc2hvdF9wYXRoW1BBVEhfTUFYXSA9ICIiOworCiAvKiBkdW1wcyB0aGUgY3VycmVudCBzeXN0ZW0gc3RhdGUgdG8gc3Rkb3V0ICovCiBzdGF0aWMgdm9pZCBkdW1wc3RhdGUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CkBAIC03Niw2ICs3OCwxMiBAQAogICAgIGR1bXBfZmlsZSgiU0xBQiBJTkZPIiwgIi9wcm9jL3NsYWJpbmZvIik7CiAgICAgZHVtcF9maWxlKCJaT05FSU5GTyIsICIvcHJvYy96b25laW5mbyIpOwogCisgICAgaWYgKHNjcmVlbnNob3RfcGF0aFswXSkgeworICAgICAgICBMT0dJKCJ0YWtpbmcgc2NyZWVuc2hvdFxuIik7CisgICAgICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsICJzdSIsICJyb290IiwgInNjcmVlbnNob3QiLCBzY3JlZW5zaG90X3BhdGgsIE5VTEwpOworICAgICAgICBMT0dJKCJ3cm90ZSBzY3JlZW5zaG90OiAlc1xuIiwgc2NyZWVuc2hvdF9wYXRoKTsKKyAgICB9CisKICAgICBydW5fY29tbWFuZCgiU1lTVEVNIExPRyIsIDIwLCAibG9nY2F0IiwgIi12IiwgInRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7CiAKICAgICAvKiBzaG93IHRoZSB0cmFjZXMgd2UgY29sbGVjdGVkIGluIG1haW4oKSwgaWYgdGhhdCB3YXMgZG9uZSAqLwpAQCAtMTAzLDcgKzExMSwxMiBAQAogICAgIGR1bXBfZmlsZSgiTkVUV09SSyBST1VURVMiLCAiL3Byb2MvbmV0L3JvdXRlIik7CiAgICAgZHVtcF9maWxlKCJBUlAgQ0FDSEUiLCAiL3Byb2MvbmV0L2FycCIpOwogCisgICAgcnVuX2NvbW1hbmQoIldJRkkgTkVUV09SS1MiLCAyMCwKKyAgICAgICAgICAgICJzdSIsICJyb290IiwgIndwYV9jbGkiLCAibGlzdF9uZXR3b3JrcyIsIE5VTEwpOworCiAjaWZkZWYgRldEVU1QX2JjbTQzMjkKKyAgICBydW5fY29tbWFuZCgiRFVNUCBXSUZJIFNUQVRVUyIsIDIwLAorICAgICAgICAgICAgInN1IiwgInJvb3QiLCAiZGhkdXRpbCIsICItaSIsICJldGgwIiwgImR1bXAiLCBOVUxMKTsKICAgICBydW5fY29tbWFuZCgiRFVNUCBXSUZJIEZJUk1XQVJFIExPRyIsIDYwLAogICAgICAgICAgICAgInN1IiwgInJvb3QiLCAiZGhkdXRpbCIsICItaSIsICJldGgwIiwgInVwbG9hZCIsICIvZGF0YS9sb2NhbC90bXAvd2xhbl9jcmFzaC5kdW1wIiwgTlVMTCk7CiAjZW5kaWYKQEAgLTE2NCwxOCArMTc3LDI1IEBACiB9CiAKIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGR1bXBzdGF0ZSBbLWRdIFstbyBmaWxlXSBbLXNdIFstel1cbiIKLSAgICAgICAgICAgICIgIC1kOiBhcHBlbmQgZGF0ZSB0byBmaWxlbmFtZSAocmVxdWlyZXMgLW8pXG4iCisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogZHVtcHN0YXRlIFstYiBzb3VuZGZpbGVdIFstZSBzb3VuZGZpbGVdIFstbyBmaWxlIFstZF0gWy1wXSBbLXpdXSBbLXNdXG4iCiAgICAgICAgICAgICAiICAtbzogd3JpdGUgdG8gZmlsZSAoaW5zdGVhZCBvZiBzdGRvdXQpXG4iCisgICAgICAgICAgICAiICAtZDogYXBwZW5kIGRhdGUgdG8gZmlsZW5hbWUgKHJlcXVpcmVzIC1vKVxuIgorICAgICAgICAgICAgIiAgLXo6IGd6aXAgb3V0cHV0IChyZXF1aXJlcyAtbylcbiIKKyAgICAgICAgICAgICIgIC1wOiBjYXB0dXJlIHNjcmVlbnNob3QgdG8gZmlsZW5hbWUucG5nIChyZXF1aXJlcyAtbylcbiIKICAgICAgICAgICAgICIgIC1zOiB3cml0ZSBvdXRwdXQgdG8gY29udHJvbCBzb2NrZXQgKGZvciBpbml0KVxuIgotICAgICAgICAgICAgIiAgLXo6IGd6aXAgb3V0cHV0IChyZXF1aXJlcyAtbylcbiIpOworICAgICAgICAgICAgIiAgLWI6IHBsYXkgc291bmQgZmlsZSBpbnN0ZWFkIG9mIHZpYnJhdGUsIGF0IGJlZ2lubmluZyBvZiBqb2JcbiIKKyAgICAgICAgICAgICIgIC1lOiBwbGF5IHNvdW5kIGZpbGUgaW5zdGVhZCBvZiB2aWJyYXRlLCBhdCBlbmQgb2Ygam9iXG4iCisJCSk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICBpbnQgZG9fYWRkX2RhdGUgPSAwOwogICAgIGludCBkb19jb21wcmVzcyA9IDA7CiAgICAgY2hhciogdXNlX291dGZpbGUgPSAwOworICAgIGNoYXIqIGJlZ2luX3NvdW5kID0gMDsKKyAgICBjaGFyKiBlbmRfc291bmQgPSAwOwogICAgIGludCB1c2Vfc29ja2V0ID0gMDsKKyAgICBpbnQgZG9fZmIgPSAwOwogCiAgICAgTE9HSSgiYmVnaW5cbiIpOwogCkBAIC0xOTEsMTMgKzIxMSwxNiBAQAogICAgIGR1bXBfdHJhY2VzX3BhdGggPSBkdW1wX3ZtX3RyYWNlcygpOwogCiAgICAgaW50IGM7Ci0gICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkaG86c3Z6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiOmRlOmhvOnN2enAiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdiJzogYmVnaW5fc291bmQgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2QnOiBkb19hZGRfZGF0ZSA9IDE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZSc6IGVuZF9zb3VuZCA9IG9wdGFyZzsgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdvJzogdXNlX291dGZpbGUgPSBvcHRhcmc7ICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOiB1c2Vfc29ja2V0ID0gMTsgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAndic6IGJyZWFrOyAgLy8gY29tcGF0aWJpbGl0eSBuby1vcAogICAgICAgICAgICAgY2FzZSAneic6IGRvX2NvbXByZXNzID0gNjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzogZG9fZmIgPSAxOyAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJz8nOiBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAgICB1c2FnZSgpOwpAQCAtMjQ0LDYgKzI2NywxMCBAQAogICAgICAgICAgICAgc3RyZnRpbWUoZGF0ZSwgc2l6ZW9mKGRhdGUpLCAiLSVZLSVtLSVkLSVILSVNLSVTIiwgbG9jYWx0aW1lKCZub3cpKTsKICAgICAgICAgICAgIHN0cmxjYXQocGF0aCwgZGF0ZSwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgfQorICAgICAgICBpZiAoZG9fZmIpIHsKKyAgICAgICAgICAgIHN0cmxjcHkoc2NyZWVuc2hvdF9wYXRoLCBwYXRoLCBzaXplb2Yoc2NyZWVuc2hvdF9wYXRoKSk7CisgICAgICAgICAgICBzdHJsY2F0KHNjcmVlbnNob3RfcGF0aCwgIi5wbmciLCBzaXplb2Yoc2NyZWVuc2hvdF9wYXRoKSk7CisgICAgICAgIH0KICAgICAgICAgc3RybGNhdChwYXRoLCAiLnR4dCIsIHNpemVvZihwYXRoKSk7CiAgICAgICAgIGlmIChkb19jb21wcmVzcykgc3RybGNhdChwYXRoLCAiLmd6Iiwgc2l6ZW9mKHBhdGgpKTsKICAgICAgICAgc3RybGNweSh0bXBfcGF0aCwgcGF0aCwgc2l6ZW9mKHRtcF9wYXRoKSk7CkBAIC0yNTEsMTYgKzI3OCwxOCBAQAogICAgICAgICBnemlwX3BpZCA9IHJlZGlyZWN0X3RvX2ZpbGUoc3Rkb3V0LCB0bXBfcGF0aCwgZG9fY29tcHJlc3MpOwogICAgIH0KIAotICAgIC8qIGJ6enp6enogKi8KLSAgICBpZiAodmlicmF0b3IpIHsKKyAgICBpZiAoYmVnaW5fc291bmQpIHsKKyAgICAgICAgcGxheV9zb3VuZChiZWdpbl9zb3VuZCk7CisgICAgfSBlbHNlIGlmICh2aWJyYXRvcikgewogICAgICAgICBmcHV0cygiMTUwIiwgdmlicmF0b3IpOwogICAgICAgICBmZmx1c2godmlicmF0b3IpOwogICAgIH0KIAogICAgIGR1bXBzdGF0ZSgpOwogCi0gICAgLyogYnp6eiBienp6IGJ6enogKi8KLSAgICBpZiAodmlicmF0b3IpIHsKKyAgICBpZiAoZW5kX3NvdW5kKSB7CisgICAgICAgIHBsYXlfc291bmQoZW5kX3NvdW5kKTsKKyAgICB9IGVsc2UgaWYgKHZpYnJhdG9yKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICBmcHV0cygiNzVcbiIsIHZpYnJhdG9yKTsKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5oIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKaW5kZXggNjgyZWFmZC4uODNiMWQxMSAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmgKQEAgLTQ0LDQgKzQ0LDcgQEAKIC8qIERpc3BsYXlzIGEgYmxvY2tlZCBwcm9jZXNzZXMgaW4ta2VybmVsIHdhaXQgY2hhbm5lbCAqLwogdm9pZCBzaG93X3djaGFuKGludCBwaWQsIGNvbnN0IGNoYXIgKm5hbWUpOwogCisvKiBQbGF5IGEgc291bmQgdmlhIFN0YWdlZnJpZ2h0ICovCit2b2lkIHBsYXlfc291bmQoY29uc3QgY2hhciogcGF0aCk7CisKICNlbmRpZiAvKiBfRFVNUFNUQVRFX0hfICovCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS91dGlscy5jIGIvY21kcy9kdW1wc3RhdGUvdXRpbHMuYwppbmRleCBjN2E3OGNjLi5mOTJhY2JiYiAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvdXRpbHMuYworKysgYi9jbWRzL2R1bXBzdGF0ZS91dGlscy5jCkBAIC00MjksMyArNDI5LDcgQEAKICAgICByZW5hbWUoYW5yX3RyYWNlc19wYXRoLCB0cmFjZXNfcGF0aCk7CiAgICAgcmV0dXJuIGR1bXBfdHJhY2VzX3BhdGg7CiB9CisKK3ZvaWQgcGxheV9zb3VuZChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcnVuX2NvbW1hbmQoTlVMTCwgNSwgIi9zeXN0ZW0vYmluL3N0YWdlZnJpZ2h0IiwgIi1vIiwgIi1hIiwgcGF0aCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhIGIvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQppbmRleCA5YjhiMGFjLi4wNDA0MjFhIDEwMDY0NAotLS0gYS9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCisrKyBiL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJhd0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBsaXN0LmFkZChyYXdMaXN0W2ldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCisKIAogICAgICAgICAgICAgLy8gU29ydCBieSBuYW1lCiAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPEZlYXR1cmVJbmZvPigpIHsKQEAgLTkwOSw2ICs5MDksOSBAQAogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBsaXN0IGluc3RydW1lbnRhdGlvbiBjb21tYW5kIHByaW50cyBhbGwgaW5zdHJ1bWVudGF0aW9ucywiKTsKICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJvciBvbmx5IHRob3NlIHRoYXQgdGFyZ2V0IGEgc3BlY2lmaWVkIHBhY2thZ2UuICBPcHRpb25zOiIpOwogICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWY6IHNlZSB0aGVpciBhc3NvY2lhdGVkIGZpbGUuIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKFVzZSB0aGlzIGNvbW1hbmQgdG8gbGlzdCBhbGwgdGVzdCBwYWNrYWdlcywgb3IgdXNlIDxUQVJHRVQtUEFDS0FHRT4gIik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIHRvIGxpc3QgdGhlIHRlc3QgcGFja2FnZXMgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4gVGhlIC1mICIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiBvcHRpb24gbGlzdHMgdGhlIC5hcGsgZmlsZSBmb3IgdGhlIHRlc3QgcGFja2FnZS4pIik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIGxpc3QgZmVhdHVyZXMgY29tbWFuZCBwcmludHMgYWxsIGZlYXR1cmVzIG9mIHRoZSBzeXN0ZW0uIik7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIik7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tayBiL2NtZHMvc2NyZWVuc2hvdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzdhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnNob3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gc2NyZWVuc2hvdC5jCisKK0xPQ0FMX01PRFVMRSA6PSBzY3JlZW5zaG90CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnoKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicG5nCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL3psaWIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnNob3Qvc2NyZWVuc2hvdC5jIGIvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDg2MzZjCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9zY3JlZW5zaG90L3NjcmVlbnNob3QuYwpAQCAtMCwwICsxLDE3MSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlIDxsaWJwbmcvcG5nLmg+CisKKyNpbmNsdWRlICJwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCIKKworI2RlZmluZSBMT0dfVEFHICJzY3JlZW5zaG90IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit2b2lkIHRha2Vfc2NyZWVuc2hvdChGSUxFICpmYl9pbiwgRklMRSAqZmJfb3V0KSB7CisgICAgaW50IGZiOworICAgIGNoYXIgaW1nYnVmWzB4MTAwMDBdOworICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2aW5mbzsKKyAgICBwbmdfc3RydWN0cCBwbmc7CisgICAgcG5nX2luZm9wIGluZm87CisgICAgdW5zaWduZWQgaW50IHIsYyxyb3dsZW47CisgICAgdW5zaWduZWQgaW50IGJ5dGVzcHAsb2Zmc2V0OworCisgICAgZmIgPSBmaWxlbm8oZmJfaW4pOworICAgIGlmKGZiIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gb3BlbiBmcmFtZWJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmJfaW4gPSBmZG9wZW4oZmIsICJyIik7CisKKyAgICBpZihpb2N0bChmYiwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnZpbmZvKSA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGdldCBmcmFtZWJ1ZmZlciBpbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmY250bChmYiwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKyAgICBwbmcgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChwbmcgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3RcbiIpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcG5nX2luaXRfaW8ocG5nLCBmYl9vdXQpOworICAgIGluZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZyk7CisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdFxuIik7CisgICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nLCBOVUxMKTsKKyAgICAgICAgZmNsb3NlKGZiX2luKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nKSkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHBuZyBzZXRqbXBcbiIpOworICAgICAgICBwbmdfZGVzdHJveV93cml0ZV9zdHJ1Y3QoJnBuZywgTlVMTCk7CisgICAgICAgIGZjbG9zZShmYl9pbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBieXRlc3BwID0gdmluZm8uYml0c19wZXJfcGl4ZWwgLyA4OworICAgIHBuZ19zZXRfSUhEUihwbmcsIGluZm8sCisgICAgICAgIHZpbmZvLnhyZXMsIHZpbmZvLnlyZXMsIHZpbmZvLmJpdHNfcGVyX3BpeGVsIC8gNCwgCisgICAgICAgIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSwgUE5HX0lOVEVSTEFDRV9OT05FLAorICAgICAgICBQTkdfQ09NUFJFU1NJT05fVFlQRV9CQVNFLCBQTkdfRklMVEVSX1RZUEVfQkFTRSk7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nLCBpbmZvKTsKKworICAgIHJvd2xlbj12aW5mby54cmVzICogYnl0ZXNwcDsKKyAgICBpZiAocm93bGVuID4gc2l6ZW9mKGltZ2J1ZikpIHsKKyAgICAgICAgTE9HRSgiY3Jhenkgcm93bGVuOiAlZFxuIiwgcm93bGVuKTsKKyAgICAgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworICAgICAgICBmY2xvc2UoZmJfaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2Zmc2V0ID0gdmluZm8ueG9mZnNldCAqIGJ5dGVzcHAgKyB2aW5mby54cmVzICogdmluZm8ueW9mZnNldCAqIGJ5dGVzcHA7CisgICAgZnNlZWsoZmJfaW4sIG9mZnNldCwgU0VFS19TRVQpOworCisgICAgZm9yKHI9MDsgcjx2aW5mby55cmVzOyByKyspIHsKKyAgICAgICAgaW50IGxlbiA9IGZyZWFkKGltZ2J1ZiwgMSwgcm93bGVuLCBmYl9pbik7CisgICAgICAgIGlmIChsZW4gPD0gMCkgYnJlYWs7CisgICAgICAgIHBuZ193cml0ZV9yb3cocG5nLCAocG5nX2J5dGVwKWltZ2J1Zik7CisgICAgfQorCisgICAgcG5nX3dyaXRlX2VuZChwbmcsIGluZm8pOworICAgIGZjbG9zZShmYl9pbik7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmcsIE5VTEwpOworfQorCit2b2lkIGZvcmtfc291bmQoY29uc3QgY2hhciogcGF0aCkgeworICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKKyAgICBpZiAocGlkID09IDApIHsKKyAgICAgICAgZXhlY2woIi9zeXN0ZW0vYmluL3N0YWdlZnJpZ2h0IiwgInN0YWdlZnJpZ2h0IiwgIi1vIiwgIi1hIiwgcGF0aCwgTlVMTCk7CisgICAgfQorfQorCit2b2lkIHVzYWdlKCkgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgInVzYWdlOiBzY3JlZW5zaG90IFstcyBzb3VuZGZpbGVdIGZpbGVuYW1lLnBuZ1xuIgorICAgICAgICAgICAgIiAgIC1zOiBwbGF5IGEgc291bmQgZWZmZWN0IHRvIHNpZ25hbCBzdWNjZXNzXG4iCisgICAgICAgICAgICAiICAgLWk6IGF1dG9pbmNyZW1lbnQgdG8gYXZvaWQgb3ZlcndyaXRpbmcgZmlsZW5hbWUucG5nXG4iCisgICAgKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpIHsKKyAgICBGSUxFICpwbmcgPSBOVUxMOworICAgIEZJTEUgKmZiX2luID0gTlVMTDsKKyAgICBjaGFyIG91dGZpbGVbUEFUSF9NQVhdID0gIiI7CisKKyAgICBjaGFyICogc291bmRmaWxlID0gTlVMTDsKKyAgICBpbnQgZG9faW5jcmVtZW50ID0gMDsKKworICAgIGludCBjOworICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiczppIikpICE9IC0xKSB7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAncyc6IHNvdW5kZmlsZSA9IG9wdGFyZzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdpJzogZG9faW5jcmVtZW50ID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIHVzYWdlKCk7IGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgdXNhZ2UoKTsgZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJsY3B5KG91dGZpbGUsIGFyZ3ZbMF0sIFBBVEhfTUFYKTsKKyAgICBpZiAoZG9faW5jcmVtZW50KSB7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgICBjaGFyIGJhc2VbUEFUSF9NQVhdID0gIiI7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXQob3V0ZmlsZSwgJnN0KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWJhc2VbMF0pIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RycmNocihvdXRmaWxlLCAnLicpOworICAgICAgICAgICAgICAgIGlmIChwKSAqcCA9ICdcMCc7CisgICAgICAgICAgICAgICAgc3RyY3B5KGJhc2UsIG91dGZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYob3V0ZmlsZSwgUEFUSF9NQVgsICIlcy0lZC5wbmciLCBiYXNlLCArK2kpOworICAgICAgICB9CisgICAgfQorCisgICAgZmJfaW4gPSBmb3BlbigiL2Rldi9ncmFwaGljcy9mYjAiLCAiciIpOworICAgIGlmICghZmJfaW4pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogY291bGQgbm90IHJlYWQgZnJhbWVidWZmZXJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIHN3aXRjaCB0byBub24tcm9vdCB1c2VyIGFuZCBncm91cCAqLworICAgIGdpZF90IGdyb3Vwc1tdID0geyBBSURfTE9HLCBBSURfU0RDQVJEX1JXIH07CisgICAgc2V0Z3JvdXBzKHNpemVvZihncm91cHMpL3NpemVvZihncm91cHNbMF0pLCBncm91cHMpOworICAgIHNldHVpZChBSURfU0hFTEwpOworCisgICAgcG5nID0gZm9wZW4ob3V0ZmlsZSwgInciKTsKKyAgICBpZiAoIXBuZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiB3cml0aW5nIGZpbGUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgIG91dGZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgdGFrZV9zY3JlZW5zaG90KGZiX2luLCBwbmcpOworCisgICAgaWYgKHNvdW5kZmlsZSkgeworICAgICAgICBmb3JrX3NvdW5kKHNvdW5kZmlsZSk7CisgICAgfQorCisgICAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMWQ5ZTBmMS4uZTZiMWMwOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvQWNjb3VudE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTM5OSwxOSArMzk5LDE5IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gaW5zZXJ0QWNjb3VudEludG9EYXRhYmFzZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwYXNzd29yZCwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbm9Ccm9hZGNhc3QgPSBhY2NvdW50LnR5cGUuZXF1YWxzKEdPT0dMRV9BQ0NPVU5UX1RZUEUpCisgICAgICAgICAgICAgICAgJiYgZXh0cmFzICE9IG51bGwgJiYgZXh0cmFzLmdldEJvb2xlYW4oTk9fQlJPQURDQVNUX0ZMQUcsIGZhbHNlKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSAnbm9icm9hZGNhc3QnIGZsYWcgc2luY2Ugd2UgZG9uJ3Qgd2FudCBpdCB0byBwZXJzaXN0IGluIHRoZSBkYi4gSXQgaXMgaW5zdGVhZAorICAgICAgICAvLyB1c2VkIGFzIGEgY29udHJvbCBzaWduYWwgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBpbnNlcnRpb24gc2hvdWxkIHJlc3VsdCBpbgorICAgICAgICAvLyBhbiBhY2NvdW50cyBjaGFuZ2VkIGJyb2FkY2FzdCBiZWluZyBzZW50LgorICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoTk9fQlJPQURDQVNUX0ZMQUcpOworICAgICAgICB9CiAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIG5vQnJvYWRjYXN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYWNjb3VudC50eXBlLmVxdWFscyhHT09HTEVfQUNDT1VOVF9UWVBFKSkgewotICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSAnbm9icm9hZGNhc3QnIGZsYWcgYW5kIHJlbW92ZSBpdCBzaW5jZSB3ZSBkb24ndCB3YW50IGl0IHRvIHBlcnNpc3QKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgZGIuCi0gICAgICAgICAgICAgICAgbm9Ccm9hZGNhc3QgPSBleHRyYXMuZ2V0Qm9vbGVhbihOT19CUk9BRENBU1RfRkxBRywgZmFsc2UpOwotICAgICAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoTk9fQlJPQURDQVNUX0ZMQUcpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBsb25nIG51bU1hdGNoZXMgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwKICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBUQUJMRV9BQ0NPVU5UUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBXSEVSRSAiICsgQUNDT1VOVFNfTkFNRSArICI9PyBBTkQgIiArIEFDQ09VTlRTX1RZUEUrICI9PyIsCkBAIC00MzYsMTMgKzQzNiwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgaWYgKCFub0Jyb2FkY2FzdCkgewotICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKICAgICAgICAgfQorICAgICAgICBpZiAoIW5vQnJvYWRjYXN0KSB7CisgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBsb25nIGluc2VydEV4dHJhKFNRTGl0ZURhdGFiYXNlIGRiLCBsb25nIGFjY291bnRJZCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRzUHJvdmlzaW9uaW5nOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lZWRzUHJvdmlzaW9uaW5nID0gdGVsZXBob255LmdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgICAgICAgICAgICAgICAgICBuZWVkc1Byb3Zpc2lvbmluZyA9IHRlbGVwaG9ueS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJleGNlcHRpb24gd2hpbGUgY2hlY2tpbmcgcHJvdmlzaW9uaW5nIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gTk9UIHdpcGluZyBvdXQgdGhlIHBhc3N3b3JkcwpAQCAtMTY4MSwxMSArMTY4MSwxMSBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRFTEVURSBmcm9tICIgKyBUQUJMRV9BVVRIVE9LRU5TKTsKICAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiVVBEQVRFICIgKyBUQUJMRV9BQ0NPVU5UUyArICIgU0VUICIgKyBBQ0NPVU5UU19QQVNTV09SRCArICIgPSAnJyIpOwotICAgICAgICAgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldE1ldGFWYWx1ZSgiaW1zaSIsIGltc2kpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGE2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBmb3IgY2xhc3NlcyB3aGljaCBwcm92aWRlIGJhc2ljIHN1cHBvcnQgZm9yIGFuaW1hdGlvbnMgd2hpY2ggY2FuIGJlCisgKiBzdGFydGVkLCBlbmRlZCwgYW5kIGhhdmUgPGNvZGU+QW5pbWF0b3JMaXN0ZW5lcnM8L2NvZGU+IGFkZGVkIHRvIHRoZW0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRvciBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBtTGlzdGVuZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGlzIGFuaW1hdGlvbi4gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBub256ZXJvIHN0YXJ0RGVsYXksIHRoZSBhbmltYXRpb24gd2lsbCBzdGFydAorICAgICAqIHJ1bm5pbmcgYWZ0ZXIgdGhhdCBkZWxheSBlbGFwc2VzLiBOb3RlIHRoYXQgdGhlIGFuaW1hdGlvbiBkb2VzIG5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdpdGgKKyAgICAgKiB0aGlzIGNhbGwsIGJlY2F1c2UgYWxsIGFuaW1hdGlvbiBldmVudHMgYXJlIHBvc3RlZCB0byBhIGNlbnRyYWwgdGltaW5nIGxvb3Agc28gdGhhdCBhbmltYXRpb24KKyAgICAgKiB0aW1lcyBhcmUgYWxsIHN5bmNocm9uaXplZCBvbiBhIHNpbmdsZSB0aW1pbmcgcHVsc2Ugb24gdGhlIFVJIHRocmVhZC4gU28gdGhlIGFuaW1hdGlvbiB3aWxsCisgICAgICogc3RhcnQgdGhlIG5leHQgdGltZSB0aGF0IGV2ZW50IGhhbmRsZXIgcHJvY2Vzc2VzIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24uIFVubGlrZSB7QGxpbmsgI2VuZCgpfSwgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvCisgICAgICogc3RvcCBpbiBpdHMgdHJhY2tzLCBzZW5kaW5nIGFuIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyI29uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yKX0gdG8KKyAgICAgKiBpdHMgbGlzdGVuZXJzLCBmb2xsb3dlZCBieSBhbiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYXVzZXMgdGhlIGFuaW1hdGlvbiB0byBhc3NpZ24gdGhlIGVuZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcKKyAgICAgKiBhbmltYXRlZCwgdGhlbiBjYWxsaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciNvbkFuaW1hdGlvbkVuZChBbmltYXRvcil9IG1ldGhvZCBvbgorICAgICAqIGl0cyBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IHJ1bm5pbmcgdGhlIGFuaW1hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldFN0YXJ0RGVsYXkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyCisgICAgICoge0BsaW5rICNzdGFydCgpfSBpcyBjYWxsZWQuCisKKyAgICAgKiBAcGFyYW0gc3RhcnREZWxheSBUaGUgYW1vdW50IG9mIHRoZSBkZWxheSwgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhcnREZWxheShsb25nIHN0YXJ0RGVsYXkpOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXREdXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBBbmltYXRvciBpcyBjdXJyZW50bHkgcnVubmluZyAoaGF2aW5nIGJlZW4gc3RhcnRlZCBhbmQgbm90IHlldCBlbmRlZCkuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBBbmltYXRvciBpcyBydW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUnVubmluZygpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4KKyAgICAgKiBhbmltYXRpb24sIHN1Y2ggYXMgc3RhcnQsIHJlcGVhdCwgYW5kIGVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpc3RlbmVycyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPigpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgc2V0IGxpc3RlbmluZyB0byB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2V0IG9mIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyfSBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseQorICAgICAqIGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgPGNvZGU+QW5pbWF0b3I8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IFRoZSBzZXQgb2YgbGlzdGVuZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZnJvbSB0aGlzIG9iamVjdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRMaXN0ZW5lcnMoKTwvY29kZT4gZm9sbG93ZWQgYnkgY2FsbGluZyA8Y29kZT5jbGVhcigpPC9jb2RlPiBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IG9mIGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxMaXN0ZW5lcnMoKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFuaW1hdG9yIGNsb25lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQW5pbWF0b3IgYW5pbSA9IChBbmltYXRvcikgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gb2xkTGlzdGVuZXJzID0gbUxpc3RlbmVyczsKKyAgICAgICAgICAgICAgICBhbmltLm1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KCk7CisgICAgICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1MaXN0ZW5lcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBhbmltLm1MaXN0ZW5lcnMuYWRkKG9sZExpc3RlbmVycy5nZXQoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbmltOworICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG9iamVjdCB0byB1c2UgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gdG8gZXh0cmFjdAorICAgICAqIHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGFuaW1hdGlvbi4gRm9yIGV4YW1wbGUsIGEgQW5pbWF0b3JTZXQgb2JqZWN0IHdpbGwgcGFzcworICAgICAqIHRoaXMgY2FsbCB0byBpdHMgY2hpbGQgb2JqZWN0cyB0byB0ZWxsIHRoZW0gdG8gc2V0IHVwIHRoZSB2YWx1ZXMuIEEKKyAgICAgKiBPYmplY3RBbmltYXRvciBvYmplY3Qgd2lsbCB1c2UgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAqIGFuZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHRvIGdldCB0aGUgc3RhcnQgdmFsdWVzIGZvciBpdHMgcHJvcGVydGllcy4KKyAgICAgKiBBbiBWYWx1ZUFuaW1hdG9yIG9iamVjdCB3aWxsIGlnbm9yZSB0aGUgcmVxdWVzdCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlIGVub3VnaAorICAgICAqIGluZm9ybWF0aW9uIChzdWNoIGFzIGEgdGFyZ2V0IG9iamVjdCkgdG8gZ2F0aGVyIHRoZXNlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR1cFN0YXJ0VmFsdWVzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRlbGxzIHRoZSBvYmplY3QgdG8gdXNlIGFwcHJvcHJpYXRlIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKKyAgICAgKiBlbmRpbmcgdmFsdWVzIGZvciB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgYSBBbmltYXRvclNldCBvYmplY3Qgd2lsbCBwYXNzCisgICAgICogdGhpcyBjYWxsIHRvIGl0cyBjaGlsZCBvYmplY3RzIHRvIHRlbGwgdGhlbSB0byBzZXQgdXAgdGhlIHZhbHVlcy4gQQorICAgICAqIE9iamVjdEFuaW1hdG9yIG9iamVjdCB3aWxsIHVzZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGl0cyB0YXJnZXQgb2JqZWN0CisgICAgICogYW5kIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgdG8gZ2V0IHRoZSBzdGFydCB2YWx1ZXMgZm9yIGl0cyBwcm9wZXJ0aWVzLgorICAgICAqIEFuIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHdpbGwgaWdub3JlIHRoZSByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICogaW5mb3JtYXRpb24gKHN1Y2ggYXMgYSB0YXJnZXQgb2JqZWN0KSB0byBnYXRoZXIgdGhlc2UgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldHVwRW5kVmFsdWVzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSBhbmltYXRlZCBieSB0aGlzIGFuaW1hdGlvbi4gTm90IGFsbCBzdWJjbGFzc2VzCisgICAgICogb3BlcmF0ZSBvbiB0YXJnZXQgb2JqZWN0cyAoZm9yIGV4YW1wbGUsIHtAbGluayBWYWx1ZUFuaW1hdG9yfSwgYnV0IHRoaXMgbWV0aG9kCisgICAgICogaXMgb24gdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiBkZWFsaW5nIGdlbmVyaWNhbGx5IHdpdGggdGhvc2Ugc3ViY2xhc3NlcworICAgICAqIHRoYXQgZG8gaGFuZGxlIHRhcmdldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkFuIGFuaW1hdGlvbiBsaXN0ZW5lciByZWNlaXZlcyBub3RpZmljYXRpb25zIGZyb20gYW4gYW5pbWF0aW9uLgorICAgICAqIE5vdGlmaWNhdGlvbnMgaW5kaWNhdGUgYW5pbWF0aW9uIHJlbGF0ZWQgZXZlbnRzLCBzdWNoIGFzIHRoZSBlbmQgb3IgdGhlCisgICAgICogcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbmltYXRvckxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBzdGFydCBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgc3RhcnRlZCBhbmltYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Tm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLiBUaGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkCisgICAgICAgICAqIGZvciBhbmltYXRpb25zIHdpdGggcmVwZWF0IGNvdW50IHNldCB0byBJTkZJTklURS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB3aGljaCByZWFjaGVkIGl0cyBlbmQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPk5vdGlmaWVzIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZAorICAgICAgICAgKiBmb3IgYW5pbWF0aW9ucyB3aXRoIHJlcGVhdCBjb3VudCBzZXQgdG8gSU5GSU5JVEUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIGNhbmNlbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgcmVwZXRpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHdoaWNoIHdhcyByZXBlYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JJbmZsYXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9ySW5mbGF0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDE2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9ySW5mbGF0ZXIuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBtZW51IFhNTCBmaWxlcyBpbnRvIEFuaW1hdG9yIG9iamVjdHMuCisgKiA8cD4KKyAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBtZW51IGluZmxhdGlvbiByZWxpZXMgaGVhdmlseSBvbiBwcmUtcHJvY2Vzc2luZyBvZgorICogWE1MIGZpbGVzIHRoYXQgaXMgZG9uZSBhdCBidWlsZCB0aW1lLiBUaGVyZWZvcmUsIGl0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUKKyAqIHRvIHVzZSBNZW51SW5mbGF0ZXIgd2l0aCBhbiBYbWxQdWxsUGFyc2VyIG92ZXIgYSBwbGFpbiBYTUwgZmlsZSBhdCBydW50aW1lOworICogaXQgb25seSB3b3JrcyB3aXRoIGFuIFhtbFB1bGxQYXJzZXIgcmV0dXJuZWQgZnJvbSBhIGNvbXBpbGVkIHJlc291cmNlIChSLgorICogPGVtPnNvbWV0aGluZzwvZW0+IGZpbGUuKQorICovCitwdWJsaWMgY2xhc3MgQW5pbWF0b3JJbmZsYXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgQW5pbWF0b3JTZXQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBFbnVtIHZhbHVlcyB1c2VkIGluIFhNTCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIHRoZSB2YWx1ZSBmb3IgbVZhbHVlVHlwZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0ZMT0FUICAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9JTlQgICAgICAgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTFVFX1RZUEVfRE9VQkxFICAgICAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRV9UWVBFX0NPTE9SICAgICAgID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfVFlQRV9DVVNUT00gICAgICA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0b3J9IG9iamVjdCBmcm9tIGEgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IEFwcGxpY2F0aW9uIGNvbnRleHQgdXNlZCB0byBhY2Nlc3MgcmVzb3VyY2VzCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIFRoZSBhbmltYXRvciBvYmplY3QgcmVmZXJlbmNlIGJ5IHRoZSBzcGVjaWZpZWQgaWQKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uIHdoZW4gdGhlIGFuaW1hdGlvbiBjYW5ub3QgYmUgbG9hZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQpCisgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldEFuaW1hdGlvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGNvbnRleHQsIHBhcnNlcik7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBsb2FkIGFuaW1hdGlvbiByZXNvdXJjZSBJRCAjMHgiICsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhpZCkpOworICAgICAgICAgICAgcm5mLmluaXRDYXVzZShleCk7CisgICAgICAgICAgICB0aHJvdyBybmY7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gcm5mID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigiQ2FuJ3QgbG9hZCBhbmltYXRpb24gcmVzb3VyY2UgSUQgIzB4IiArCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoaWQpKTsKKyAgICAgICAgICAgIHJuZi5pbml0Q2F1c2UoZXgpOworICAgICAgICAgICAgdGhyb3cgcm5mOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFuaW1hdG9yIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGMsIHBhcnNlciwgWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlciksIG51bGwsIDApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFuaW1hdG9yIGNyZWF0ZUFuaW1hdG9yRnJvbVhtbChDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBBbmltYXRvclNldCBwYXJlbnQsIGludCBzZXF1ZW5jZU9yZGVyaW5nKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBBbmltYXRvciBhbmltID0gbnVsbDsKKyAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yPiBjaGlsZEFuaW1zID0gbnVsbDsKKworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG9uIGEgc3RhcnQgdGFnLgorICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgd2hpbGUgKCgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkKKyAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nICBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJvYmplY3RBbmltYXRvciIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IGxvYWRPYmplY3RBbmltYXRvcihjLCBhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJhbmltYXRvciIpKSB7CisgICAgICAgICAgICAgICAgYW5pbSA9IGxvYWRBbmltYXRvcihjLCBhdHRycywgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzZXQiKSkgeworICAgICAgICAgICAgICAgIGFuaW0gPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSBjLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvclNldCk7CisgICAgICAgICAgICAgICAgaW50IG9yZGVyaW5nID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JTZXRfb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBUT0dFVEhFUik7CisgICAgICAgICAgICAgICAgY3JlYXRlQW5pbWF0b3JGcm9tWG1sKGMsIHBhcnNlciwgYXR0cnMsIChBbmltYXRvclNldCkgYW5pbSwgIG9yZGVyaW5nKTsKKyAgICAgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gYW5pbWF0b3IgbmFtZTogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRBbmltcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkQW5pbXMgPSBuZXcgQXJyYXlMaXN0PEFuaW1hdG9yPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZEFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgY2hpbGRBbmltcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBbmltYXRvcltdIGFuaW1zQXJyYXkgPSBuZXcgQW5pbWF0b3JbY2hpbGRBbmltcy5zaXplKCldOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3IgYSA6IGNoaWxkQW5pbXMpIHsKKyAgICAgICAgICAgICAgICBhbmltc0FycmF5W2luZGV4KytdID0gYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXF1ZW5jZU9yZGVyaW5nID09IFRPR0VUSEVSKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlUb2dldGhlcihhbmltc0FycmF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnBsYXlTZXF1ZW50aWFsbHkoYW5pbXNBcnJheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGxvYWRPYmplY3RBbmltYXRvcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykKKyAgICAgICAgICAgIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0QW5pbWF0b3IgYW5pbSA9IG5ldyBPYmplY3RBbmltYXRvcigpOworCisgICAgICAgIGxvYWRBbmltYXRvcihjb250ZXh0LCBhdHRycywgYW5pbSk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0KKyAgICAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb3BlcnR5QW5pbWF0b3IpOworCisgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Qcm9wZXJ0eUFuaW1hdG9yX3Byb3BlcnR5TmFtZSk7CisKKyAgICAgICAgYW5pbS5zZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFuaW1hdGlvbiB3aG9zZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYW5kCisgICAgICogYXR0cmlidXRlcyBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGhvbGRpbmcgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVBbmltYXRvciBsb2FkQW5pbWF0b3IoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIFZhbHVlQW5pbWF0b3IgYW5pbSkKKyAgICAgICAgICAgIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0KKyAgICAgICAgICAgICAgICBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yKTsKKworICAgICAgICBsb25nIGR1cmF0aW9uID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfZHVyYXRpb24sIDApOworCisgICAgICAgIGxvbmcgc3RhcnREZWxheSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3N0YXJ0T2Zmc2V0LCAwKTsKKworICAgICAgICBpbnQgdmFsdWVUeXBlID0gYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUeXBlLAorICAgICAgICAgICAgICAgIFZBTFVFX1RZUEVfRkxPQVQpOworCisgICAgICAgIE9iamVjdCB2YWx1ZUZyb20gPSBudWxsOworICAgICAgICBPYmplY3QgdmFsdWVUbyA9IG51bGw7CisgICAgICAgIFR5cGVFdmFsdWF0b3IgZXZhbHVhdG9yID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHZhbHVlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0ZMT0FUOgorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFMVUVfVFlQRV9DT0xPUjoKKyAgICAgICAgICAgICAgICBldmFsdWF0b3IgPSBuZXcgUkdCRXZhbHVhdG9yKCk7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHBpY2sgdXAgdmFsdWVzCisgICAgICAgICAgICBjYXNlIFZBTFVFX1RZUEVfSU5UOgorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRJbnRlZ2VyKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSBhLmdldEludGVnZXIoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRnJvbSA9IChEb3VibGUpKChGbG9hdCkoYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKSkpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlVG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlVG8gPSAoRG91YmxlKSgoRmxvYXQpYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZVRvLCAwZikpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWQUxVRV9UWVBFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBIb3cgdG8gZ2V0IGFuICdPYmplY3QnIHZhbHVlPworICAgICAgICAgICAgICAgIGlmIChhLmhhc1ZhbHVlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3ZhbHVlRnJvbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVGcm9tID0gYS5nZXRGbG9hdChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl92YWx1ZUZyb20sIDBmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbykpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVUbyA9IGEuZ2V0RmxvYXQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfdmFsdWVUbywgMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbmltID09IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0gPSBuZXcgVmFsdWVBbmltYXRvcihkdXJhdGlvbiwgdmFsdWVGcm9tLCB2YWx1ZVRvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oZHVyYXRpb24pOworICAgICAgICAgICAgYW5pbS5zZXRWYWx1ZXModmFsdWVGcm9tLCB2YWx1ZVRvKTsKKyAgICAgICAgfQorCisgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShzdGFydERlbGF5KTsKKworICAgICAgICBpZiAoYS5oYXNWYWx1ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9yZXBlYXRDb3VudCkpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0UmVwZWF0Q291bnQoCisgICAgICAgICAgICAgICAgICAgIGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuaW1hdG9yX3JlcGVhdENvdW50LCAwKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEuaGFzVmFsdWUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0TW9kZSkpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0UmVwZWF0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5pbWF0b3JfcmVwZWF0TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yLlJFU1RBUlQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXZhbHVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uc2V0RXZhbHVhdG9yKGV2YWx1YXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgcmVzSUQgPQorICAgICAgICAgICAgICAgIGEuZ2V0UmVzb3VyY2VJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmltYXRvcl9pbnRlcnBvbGF0b3IsIDApOworICAgICAgICBpZiAocmVzSUQgPiAwKSB7CisgICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKGNvbnRleHQsIHJlc0lEKSk7CisgICAgICAgIH0KKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgyMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0FuaW1hdG9yTGlzdGVuZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogVGhpcyBhZGFwdGVyIGNsYXNzIHByb3ZpZGVzIGVtcHR5IGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbWV0aG9kcyBmcm9tIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyfS4KKyAqIEFueSBjdXN0b20gbGlzdGVuZXIgdGhhdCBjYXJlcyBvbmx5IGFib3V0IGEgc3Vic2V0IG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgbGlzdGVuZXIgY2FuCisgKiBzaW1wbHkgc3ViY2xhc3MgdGhpcyBhZGFwdGVyIGNsYXNzIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgZGlyZWN0bHkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmltYXRvckxpc3RlbmVyQWRhcHRlciBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0ZG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdGRvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXRkb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0ZG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JTZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9BbmltYXRvclNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Mzg1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vQW5pbWF0b3JTZXQuamF2YQpAQCAtMCwwICsxLDkzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBwbGF5cyBhIHNldCBvZiB7QGxpbmsgQW5pbWF0b3J9IG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBvcmRlci4gQW5pbWF0aW9ucworICogY2FuIGJlIHNldCB1cCB0byBwbGF5IHRvZ2V0aGVyLCBpbiBzZXF1ZW5jZSwgb3IgYWZ0ZXIgYSBzcGVjaWZpZWQgZGVsYXkuCisgKgorICogPHA+VGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBhZGRpbmcgYW5pbWF0aW9ucyB0byBhIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPjoKKyAqIGVpdGhlciB0aGUge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXlUb2dldGhlcihBbmltYXRvcltdKSBwbGF5VG9nZXRoZXIoKX0gb3IKKyAqIHtAbGluayBBbmltYXRvclNldCNwbGF5U2VxdWVudGlhbGx5KEFuaW1hdG9yW10pIHBsYXlTZXF1ZW50aWFsbHkoKX0gbWV0aG9kcyBjYW4gYmUgY2FsbGVkIHRvIGFkZAorICogYSBzZXQgb2YgYW5pbWF0aW9ucyBhbGwgYXQgb25jZSwgb3IgdGhlIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FuIGJlCisgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbWV0aG9kcyBpbiB0aGUge0BsaW5rIEFuaW1hdG9yU2V0LkJ1aWxkZXIgQnVpbGRlcn0KKyAqIGNsYXNzIHRvIGFkZCBhbmltYXRpb25zCisgKiBvbmUgYnkgb25lLjwvcD4KKyAqCisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBzZXQgdXAgYSA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbgorICogaXRzIGFuaW1hdGlvbnMuIEZvciBleGFtcGxlLCBhbiBhbmltYXRpb24gYTEgY291bGQgYmUgc2V0IHVwIHRvIHN0YXJ0IGJlZm9yZSBhbmltYXRpb24gYTIsIGEyCisgKiBiZWZvcmUgYTMsIGFuZCBhMyBiZWZvcmUgYTEuIFRoZSByZXN1bHRzIG9mIHRoaXMgY29uZmlndXJhdGlvbiBhcmUgdW5kZWZpbmVkLCBidXQgd2lsbCB0eXBpY2FsbHkKKyAqIHJlc3VsdCBpbiBub25lIG9mIHRoZSBhZmZlY3RlZCBhbmltYXRpb25zIGJlaW5nIHBsYXllZC4gQmVjYXVzZSBvZiB0aGlzIChhbmQgYmVjYXVzZQorICogY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGRvIG5vdCBtYWtlIGxvZ2ljYWwgc2Vuc2UgYW55d2F5KSwgY2lyY3VsYXIgZGVwZW5kZW5jaWVzCisgKiBzaG91bGQgYmUgYXZvaWRlZCwgYW5kIHRoZSBkZXBlbmRlbmN5IGZsb3cgb2YgYW5pbWF0aW9ucyBzaG91bGQgb25seSBiZSBpbiBvbmUgZGlyZWN0aW9uLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5pbWF0b3JTZXQgZXh0ZW5kcyBBbmltYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUcmFja3MgYW5pbWF0aW9ucyBjdXJyZW50bHkgYmVpbmcgcGxheWVkLCBzbyB0aGF0IHdlIGtub3cgd2hhdCB0bworICAgICAqIGNhbmNlbCBvciBlbmQgd2hlbiBjYW5jZWwoKSBvciBlbmQoKSBpcyBjYWxsZWQgb24gdGhpcyBBbmltYXRvclNldAorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdG9yPiBtUGxheWluZ1NldCA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBhbGwgbm9kZXMsIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIEFuaW1hdG9ycy4gV2hlbiBuZXcKKyAgICAgKiBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGlzIGFkZGVkIGZvciBhbiBBbmltYXRvciwgd2Ugd2FudCB0byBhZGQgaXQKKyAgICAgKiB0byBhIHNpbmdsZSBub2RlIHJlcHJlc2VudGluZyB0aGF0IEFuaW1hdG9yLCBub3QgY3JlYXRlIGEgbmV3IE5vZGUKKyAgICAgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPiBtTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPigpOworCisgICAgLyoqCisgICAgICogU2V0IG9mIGFsbCBub2RlcyBjcmVhdGVkIGZvciB0aGlzIEFuaW1hdG9yU2V0LiBUaGlzIGxpc3QgaXMgdXNlZCB1cG9uCisgICAgICogc3RhcnRpbmcgdGhlIHNldCwgYW5kIHRoZSBub2RlcyBhcmUgcGxhY2VkIGluIHNvcnRlZCBvcmRlciBpbnRvIHRoZQorICAgICAqIHNvcnRlZE5vZGVzIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Tm9kZT4gbU5vZGVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnRlZCBsaXN0IG9mIG5vZGVzLiBUaGlzIGlzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYW5pbWF0aW9ucyB3aWxsCisgICAgICogYmUgcGxheWVkLiBUaGUgZGV0YWlscyBhYm91dCB3aGVuIGV4YWN0bHkgdGhleSB3aWxsIGJlIHBsYXllZCBkZXBlbmQKKyAgICAgKiBvbiB0aGUgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXBzIG9mIHRoZSBub2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlPiBtU29ydGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm9kZXMgc2hvdWxkIGJlIHNvcnRlZCBwcmlvciB0byBwbGF5aW5nLiBUaGlzCisgICAgICogZmxhZyBhbGxvd3MgdXMgdG8gY2FjaGUgdGhlIHByZXZpb3VzIHNvcnRlZCBub2RlcyBzbyB0aGF0IGlmIHRoZSBzZXF1ZW5jZQorICAgICAqIGlzIHJlcGxheWVkIHdpdGggbm8gY2hhbmdlcywgaXQgZG9lcyBub3QgaGF2ZSB0byByZS1zb3J0IHRoZSBub2RlcyBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzU29ydCA9IHRydWU7CisKKyAgICBwcml2YXRlIEFuaW1hdG9yU2V0TGlzdGVuZXIgbVNldExpc3RlbmVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBBbmltYXRvclNldCBoYXMgYmVlbiBjYW5jZWxlZCAoYnkgY2FsbGluZyBjYW5jZWwoKSBvciBlbmQoKSkuCisgICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gYXZvaWQgc3RhcnRpbmcgb3RoZXIgYW5pbWF0aW9ucyB3aGVuIGN1cnJlbnRseS1wbGF5aW5nCisgICAgICogY2hpbGQgYW5pbWF0aW9ucyBvZiB0aGlzIEFuaW1hdG9yU2V0IGVuZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgLy8gVGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIgc3RhcnQoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIGxvbmcgbVN0YXJ0RGVsYXkgPSAwOworCisKKyAgICAvLyBIb3cgbG9uZyB0aGUgY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgbGFzdCBpbiBtcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbmVnYXRpdmUsIHdoaWNoCisgICAgLy8gc2ltcGx5IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gZHVyYXRpb24gc2V0IG9uIHRoZSBBbmltYXRvclNldC4gV2hlbiBhIHJlYWwgZHVyYXRpb24gaXMKKyAgICAvLyBzZXQsIGl0IGlzIHBhc3NlZCBhbG9uZyB0byB0aGUgY2hpbGQgYW5pbWF0aW9ucy4KKyAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uID0gLTE7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBbmltYXRvclNldCB0byBwbGF5IGFsbCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIFRoZSBhbmltYXRpb25zIHRoYXQgd2lsbCBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBsYXlUb2dldGhlcihBbmltYXRvci4uLiBpdGVtcykgeworICAgICAgICBpZiAoaXRlbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5lZWRzU29ydCA9IHRydWU7CisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBwbGF5KGl0ZW1zWzBdKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLndpdGgoaXRlbXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFuaW1hdG9yU2V0IHRvIHBsYXkgZWFjaCBvZiB0aGUgc3VwcGxpZWQgYW5pbWF0aW9ucyB3aGVuIHRoZQorICAgICAqIHByZXZpb3VzIGFuaW1hdGlvbiBlbmRzLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIFRoZSBhbmlhbXRpb25zIHRoYXQgd2lsbCBiZSBzdGFydGVkIG9uZSBhZnRlciBhbm90aGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBsYXlTZXF1ZW50aWFsbHkoQW5pbWF0b3IuLi4gaXRlbXMpIHsKKyAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGxheShpdGVtc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXkoaXRlbXNbaV0pLmJlZm9yZShpdGVtc1tpKzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgY2hpbGQgQW5pbWF0b3Igb2JqZWN0cyBjb250cm9sbGVkIGJ5IHRoaXMKKyAgICAgKiBBbmltYXRvclNldC4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGxpc3Q7IG1vZGlmaWNhdGlvbnMgdG8gdGhlIHJldHVybmVkIGxpc3QKKyAgICAgKiB3aWxsIG5vdCBhZmZlY3QgdGhlIEFuaW1hdG9yU2V0LCBhbHRob3VnaCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIEFuaW1hdG9yIG9iamVjdHMKKyAgICAgKiB3aWxsIGFmZmVjdCB0aG9zZSBvYmplY3RzIGJlaW5nIG1hbmFnZWQgYnkgdGhlIEFuaW1hdG9yU2V0LgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheUxpc3Q8QW5pbWF0b3I+IFRoZSBsaXN0IG9mIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlMaXN0PEFuaW1hdG9yPiBnZXRDaGlsZEFuaW1hdGlvbnMoKSB7CisgICAgICAgIEFycmF5TGlzdDxBbmltYXRvcj4gY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZS5hbmltYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGlsZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgQW5pbWF0b3JTZXQgdGhhdCB0YWtlIHRhcmdldHMgKHtAbGluayBPYmplY3RBbmltYXRvcn0gYW5kCisgICAgICogQW5pbWF0b3JTZXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIEFuaW1hdG9yIGFuaW1hdGlvbiA9IG5vZGUuYW5pbWF0aW9uOworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIEFuaW1hdG9yU2V0KSB7CisgICAgICAgICAgICAgICAgKChBbmltYXRvclNldClhbmltYXRpb24pLnNldFRhcmdldCh0YXJnZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgICAgICgoT2JqZWN0QW5pbWF0b3IpYW5pbWF0aW9uKS5zZXRUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEludGVycG9sYXRvciBmb3IgYWxsIGN1cnJlbnQge0BsaW5rICNnZXRDaGlsZEFuaW1hdGlvbnMoKSBjaGlsZCBhbmltYXRpb25zfQorICAgICAqIG9mIHRoaXMgQW5pbWF0b3JTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIHRoZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBieSBlYWNoIGNoaWxkIGFuaW1hdGlvbiBvZiB0aGlzIEFuaW1hdG9yU2V0CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnNldEludGVycG9sYXRvcihpbnRlcnBvbGF0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdCwgd2hpY2ggaXMgdXNlZCB0bworICAgICAqIHNldCB1cCBwbGF5aW5nIGNvbnN0cmFpbnRzLiBUaGlzIGluaXRpYWwgPGNvZGU+cGxheSgpPC9jb2RlPiBtZXRob2QKKyAgICAgKiB0ZWxscyB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gdGhlIGFuaW1hdGlvbiB0aGF0IGlzIHRoZSBkZXBlbmRlbmN5IGZvcgorICAgICAqIHRoZSBzdWNjZWVkaW5nIGNvbW1hbmRzIHRvIHRoZSA8Y29kZT5CdWlsZGVyPC9jb2RlPi4gRm9yIGV4YW1wbGUsCisgICAgICogY2FsbGluZyA8Y29kZT5wbGF5KGExKS53aXRoKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgQW5pbWF0b3JTZXQgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBhbmQgPGNvZGU+YTI8L2NvZGU+IGF0IHRoZSBzYW1lIHRpbWUsCisgICAgICogPGNvZGU+cGxheShhMSkuYmVmb3JlKGEyKTwvY29kZT4gc2V0cyB1cCB0aGUgQW5pbWF0b3JTZXQgdG8gcGxheQorICAgICAqIDxjb2RlPmExPC9jb2RlPiBmaXJzdCwgZm9sbG93ZWQgYnkgPGNvZGU+YTI8L2NvZGU+LCBhbmQKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5hZnRlcihhMik8L2NvZGU+IHNldHMgdXAgdGhlIEFuaW1hdG9yU2V0IHRvIHBsYXkKKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gZmlyc3QsIGZvbGxvd2VkIGJ5IDxjb2RlPmExPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCA8Y29kZT5wbGF5KCk8L2NvZGU+IGlzIHRoZSBvbmx5IHdheSB0byB0ZWxsIHRoZQorICAgICAqIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoZSBhbmltYXRpb24gdXBvbiB3aGljaCB0aGUgZGVwZW5kZW5jeSBpcyBjcmVhdGVkLAorICAgICAqIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGluIDxjb2RlPkJ1aWxkZXI8L2NvZGU+CisgICAgICogd2lsbCBhbGwgcmVmZXIgdG8gdGhlIGluaXRpYWwgcGFyYW1ldGVyIHN1cHBsaWVkIGluIDxjb2RlPnBsYXkoKTwvY29kZT4KKyAgICAgKiBhcyB0aGUgZGVwZW5kZW5jeSBvZiB0aGUgb3RoZXIgYW5pbWF0aW9ucy4gRm9yIGV4YW1wbGUsIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5wbGF5KGExKS5iZWZvcmUoYTIpLmJlZm9yZShhMyk8L2NvZGU+IHdpbGwgcGxheSBib3RoIDxjb2RlPmEyPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5hMzwvY29kZT4gd2hlbiBhMSBlbmRzOyBpdCBkb2VzIG5vdCBzZXQgdXAgYSBkZXBlbmRlbmN5IGJldHdlZW4KKyAgICAgKiA8Y29kZT5hMjwvY29kZT4gYW5kIDxjb2RlPmEzPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5pbSBUaGUgYW5pbWF0aW9uIHRoYXQgaXMgdGhlIGRlcGVuZGVuY3kgdXNlZCBpbiBsYXRlciBjYWxscyB0byB0aGUKKyAgICAgKiBtZXRob2RzIGluIHRoZSByZXR1cm5lZCA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QuIEEgbnVsbCBwYXJhbWV0ZXIgd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIG51bGwgPGNvZGU+QnVpbGRlcjwvY29kZT4gcmV0dXJuIHZhbHVlLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBUaGUgb2JqZWN0IHRoYXQgY29uc3RydWN0cyB0aGUgQW5pbWF0b3JTZXQgYmFzZWQgb24gdGhlIGRlcGVuZGVuY2llcworICAgICAqIG91dGxpbmVkIGluIHRoZSBjYWxscyB0byA8Y29kZT5wbGF5PC9jb2RlPiBhbmQgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhlCisgICAgICogPGNvZGU+QnVpbGRlcjwvY29kZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIEJ1aWxkZXIgcGxheShBbmltYXRvciBhbmltKSB7CisgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFuaW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBjYW5jZWxpbmcgYSA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gYWxzbyBjYW5jZWxzIGFsbCBvZiB0aGUgYW5pbWF0aW9ucyB0aGF0IGl0IGlzCisgICAgICogcmVzcG9uc2libGUgZm9yLjwvcD4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IHRydWU7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgZW5kaW5nIGEgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGFsc28gZW5kcyBhbGwgb2YgdGhlIGFuaW1hdGlvbnMgdGhhdCBpdCBpcworICAgICAqIHJlc3BvbnNpYmxlIGZvci48L3A+CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOworICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSAhPSBtTm9kZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBoYXNuJ3QgYmVlbiBzdGFydGVkIHlldCAtIHNvcnQgdGhlIG5vZGVzIG5vdywgdGhlbiBlbmQgdGhlbQorICAgICAgICAgICAgc29ydE5vZGVzKCk7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Tb3J0ZWROb2RlcykgeworICAgICAgICAgICAgICAgIGlmIChtU2V0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2V0TGlzdGVuZXIgPSBuZXcgQW5pbWF0b3JTZXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNldExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVNvcnRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbVNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQgaGF2ZSBiZWVuIHN0YXJ0ZWQgYW5kIGhhdmUgbm90CisgICAgICogeWV0IGVuZGVkLgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGlzIEFuaW1hdG9yU2V0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGhhcyBub3QgeWV0IGVuZGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIGlmIChub2RlLmFuaW1hdGlvbi5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBydW5uaW5nIHRoZSBhbmltYXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSkgeworICAgICAgICBtU3RhcnREZWxheSA9IHN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGVuZ3RoIG9mIGVhY2ggb2YgdGhlIGNoaWxkIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4gVGhpcyB2YWx1ZSBtYXkKKyAgICAgKiBiZSBsZXNzIHRoYW4gMCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gZHVyYXRpb24gaGFzIGJlZW4gc2V0IG9uIHRoaXMgQW5pbWF0b3JTZXQKKyAgICAgKiBhbmQgZWFjaCBvZiB0aGUgY2hpbGQgYW5pbWF0aW9ucyB3aWxsIHVzZSB0aGVpciBvd24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCBvZiBlYWNoIG9mIHRoZSBjaGlsZAorICAgICAqIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgZWFjaCBvZiB0aGUgY3VycmVudCBjaGlsZCBhbmltYXRpb25zIG9mIHRoaXMgQW5pbWF0b3JTZXQuIEJ5IGRlZmF1bHQsCisgICAgICogZWFjaCBjaGlsZCBhbmltYXRpb24gd2lsbCB1c2UgaXRzIG93biBkdXJhdGlvbi4gSWYgdGhlIGR1cmF0aW9uIGlzIHNldCBvbiB0aGUgQW5pbWF0b3JTZXQsCisgICAgICogdGhlbiBlYWNoIGNoaWxkIGFuaW1hdGlvbiBpbmhlcml0cyB0aGlzIGR1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCBvZiBlYWNoIG9mIHRoZSBjaGlsZAorICAgICAqIGFuaW1hdGlvbnMgb2YgdGhpcyBBbmltYXRvclNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIGlmIChkdXJhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cmF0aW9uIG11c3QgYmUgYSB2YWx1ZSBvZiB6ZXJvIG9yIGdyZWF0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgLy8gVE9ETzogZG9uJ3Qgc2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgdGltaW5nLW9ubHkgbm9kZXMgY3JlYXRlZCBieSBBbmltYXRvclNldCB0bworICAgICAgICAgICAgLy8gaW5zZXJ0ICJwbGF5LWFmdGVyIiBkZWxheXMKKyAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiA8cD5TdGFydGluZyB0aGlzIDxjb2RlPkFuaW1hdG9yU2V0PC9jb2RlPiB3aWxsLCBpbiB0dXJuLCBzdGFydCB0aGUgYW5pbWF0aW9ucyBmb3Igd2hpY2gKKyAgICAgKiBpdCBpcyByZXNwb25zaWJsZS4gVGhlIGRldGFpbHMgb2Ygd2hlbiBleGFjdGx5IHRob3NlIGFuaW1hdGlvbnMgYXJlIHN0YXJ0ZWQgZGVwZW5kcyBvbgorICAgICAqIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgdGhhdCBoYXZlIGJlZW4gc2V0IHVwIGJldHdlZW4gdGhlIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIG1DYW5jZWxlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEZpcnN0LCBzb3J0IHRoZSBub2RlcyAoaWYgbmVjZXNzYXJ5KS4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHNvcnRlZE5vZGVzCisgICAgICAgIC8vIGNvbnRhaW5zIHRoZSBhbmltYXRpb24gbm9kZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgICAgICAgIHNvcnROb2RlcygpOworCisgICAgICAgIC8vIG5vZGVzVG9TdGFydCBob2xkcyB0aGUgbGlzdCBvZiBub2RlcyB0byBiZSBzdGFydGVkIGltbWVkaWF0ZWx5LiBXZSBkb24ndCB3YW50IHRvCisgICAgICAgIC8vIHN0YXJ0IHRoZSBhbmltYXRpb25zIGluIHRoZSBsb29wIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZmlyc3QgbmVlZCB0byBzZXQgdXAKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzIG9uIGFsbCBvZiB0aGUgbm9kZXMuIEZvciBleGFtcGxlLCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0IGFuIGFuaW1hdGlvbgorICAgICAgICAvLyB3aGVuIHNvbWUgb3RoZXIgYW5pbWF0aW9uIGFsc28gd2FudHMgdG8gc3RhcnQgd2hlbiB0aGUgZmlyc3QgYW5pbWF0aW9uIGJlZ2lucy4KKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5vZGU+IG5vZGVzVG9TdGFydCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtU29ydGVkTm9kZXMpIHsKKyAgICAgICAgICAgIGlmIChtU2V0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXRMaXN0ZW5lciA9IG5ldyBBbmltYXRvclNldExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBub2Rlc1RvU3RhcnQuYWRkKG5vZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kubm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlcGVuZGVuY3lMaXN0ZW5lcih0aGlzLCBub2RlLCBkZXBlbmRlbmN5LnJ1bGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS50bXBEZXBlbmRlbmNpZXMgPSAoQXJyYXlMaXN0PERlcGVuZGVuY3k+KSBub2RlLmRlcGVuZGVuY2llcy5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uYWRkTGlzdGVuZXIobVNldExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3cgdGhhdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBzZXQgdXAsIHN0YXJ0IHRoZSBhbmltYXRpb25zIHRoYXQgc2hvdWxkIGJlIHN0YXJ0ZWQuCisgICAgICAgIGlmIChtU3RhcnREZWxheSA8PSAwKSB7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgICAgIG5vZGUuYW5pbWF0aW9uLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbVBsYXlpbmdTZXQuYWRkKG5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE5lZWQgdG8gY2FuY2VsIG91dCBvZiB0aGUgZGVsYXkgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgVmFsdWVBbmltYXRvciBkZWxheUFuaW0gPSBuZXcgVmFsdWVBbmltYXRvcihtU3RhcnREZWxheSwgMGYsIDFmKTsKKyAgICAgICAgICAgIGRlbGF5QW5pbS5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0b3JMaXN0ZW5lckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG5vZGVzVG9TdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nU2V0LmFkZChub2RlLmFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25TdGFydCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbmltYXRvclNldCBjbG9uZSgpIHsKKyAgICAgICAgZmluYWwgQW5pbWF0b3JTZXQgYW5pbSA9IChBbmltYXRvclNldCkgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGJhc2ljIGNsb25lKCkgb3BlcmF0aW9uIGNvcGllcyBhbGwgaXRlbXMuIFRoaXMgZG9lc24ndCB3b3JrIHZlcnkgd2VsbCBmb3IKKyAgICAgICAgICogQW5pbWF0b3JTZXQsIGJlY2F1c2UgaXQgd2lsbCBjb3B5IHJlZmVyZW5jZXMgdGhhdCBuZWVkIHRvIGJlIHJlY3JlYXRlZCBhbmQgc3RhdGUKKyAgICAgICAgICogdGhhdCBtYXkgbm90IGFwcGx5LiBXaGF0IHdlIG5lZWQgdG8gZG8gbm93IGlzIHB1dCB0aGUgY2xvbmUgaW4gYW4gdW5pbml0aWFsaXplZAorICAgICAgICAgKiBzdGF0ZSwgd2l0aCBmcmVzaCwgZW1wdHkgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVuIHdlIHdpbGwgYnVpbGQgdXAgdGhlIG5vZGVzIGxpc3QKKyAgICAgICAgICogbWFudWFsbHksIGFzIHdlIGNsb25lIGVhY2ggTm9kZSAoYW5kIGl0cyBhbmltYXRpb24pLiBUaGUgY2xvbmUgd2lsbCB0aGVuIGJlIHNvcnRlZCwKKyAgICAgICAgICogYW5kIHdpbGwgcG9wdWxhdGUgYW55IGFwcHJvcHJpYXRlIGxpc3RzLCB3aGVuIGl0IGlzIHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBhbmltLm1OZWVkc1NvcnQgPSB0cnVlOworICAgICAgICBhbmltLm1DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICBhbmltLm1QbGF5aW5nU2V0ID0gbmV3IEFycmF5TGlzdDxBbmltYXRvcj4oKTsKKyAgICAgICAgYW5pbS5tTm9kZU1hcCA9IG5ldyBIYXNoTWFwPEFuaW1hdG9yLCBOb2RlPigpOworICAgICAgICBhbmltLm1Ob2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgYW5pbS5tU29ydGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CisKKyAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSBvbGQgbm9kZXMgbGlzdCwgY2xvbmluZyBlYWNoIG5vZGUgYW5kIGFkZGluZyBpdCB0byB0aGUgbmV3IG5vZGVtYXAuCisgICAgICAgIC8vIE9uZSBwcm9ibGVtIGlzIHRoYXQgdGhlIG9sZCBub2RlIGRlcGVuZGVuY2llcyBwb2ludCB0byBub2RlcyBpbiB0aGUgb2xkIEFuaW1hdG9yU2V0LgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYWNrIHRoZSBvbGQvbmV3IG5vZGVzIGluIG9yZGVyIHRvIHJlY29uc3RydWN0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lLgorICAgICAgICBIYXNoTWFwPE5vZGUsIE5vZGU+IG5vZGVDbG9uZU1hcCA9IG5ldyBIYXNoTWFwPE5vZGUsIE5vZGU+KCk7IC8vIDxvbGQsIG5ldz4KKyAgICAgICAgZm9yIChOb2RlIG5vZGUgOiBtTm9kZXMpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZUNsb25lID0gbm9kZS5jbG9uZSgpOworICAgICAgICAgICAgbm9kZUNsb25lTWFwLnB1dChub2RlLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgYW5pbS5tTm9kZXMuYWRkKG5vZGVDbG9uZSk7CisgICAgICAgICAgICBhbmltLm1Ob2RlTWFwLnB1dChub2RlQ2xvbmUuYW5pbWF0aW9uLCBub2RlQ2xvbmUpOworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNsb25lOyB3ZSdsbCBzZXQgdGhlc2UgdXAgbWFudWFsbHkgbGF0ZXIKKyAgICAgICAgICAgIG5vZGVDbG9uZS5kZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLnRtcERlcGVuZGVuY2llcyA9IG51bGw7CisgICAgICAgICAgICBub2RlQ2xvbmUubm9kZURlcGVuZGVudHMgPSBudWxsOworICAgICAgICAgICAgbm9kZUNsb25lLm5vZGVEZXBlbmRlbmNpZXMgPSBudWxsOworICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGFueSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIHNldCB1cCBieSB0aGUgQW5pbWF0b3JTZXQ7IHRoZXNlIHdpbGwKKyAgICAgICAgICAgIC8vIGJlIHNldCB1cCB3aGVuIHRoZSBjbG9uZSdzIG5vZGVzIGFyZSBzb3J0ZWQKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBjbG9uZUxpc3RlbmVycyA9IG5vZGVDbG9uZS5hbmltYXRpb24uZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAoY2xvbmVMaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiBsaXN0ZW5lcnNUb1JlbW92ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogY2xvbmVMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgQW5pbWF0b3JTZXRMaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1RvUmVtb3ZlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1RvUmVtb3ZlLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1RvUmVtb3ZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzVG9SZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IHRoYXQgd2UndmUgY2xvbmVkIGFsbCBvZiB0aGUgbm9kZXMsIHdlJ3JlIHJlYWR5IHRvIHdhbGsgdGhyb3VnaCB0aGVpcgorICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIG1hcHBpbmcgdGhlIG9sZCBkZXBlbmRlbmNpZXMgdG8gdGhlIG5ldyBub2RlcworICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgTm9kZSBub2RlQ2xvbmUgPSBub2RlQ2xvbmVNYXAuZ2V0KG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKERlcGVuZGVuY3kgZGVwZW5kZW5jeSA6IG5vZGUuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgY2xvbmVkRGVwZW5kZW5jeU5vZGUgPSBub2RlQ2xvbmVNYXAuZ2V0KGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY3kgY2xvbmVEZXBlbmRlbmN5ID0gbmV3IERlcGVuZGVuY3koY2xvbmVkRGVwZW5kZW5jeU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5ydWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUNsb25lLmFkZERlcGVuZGVuY3koY2xvbmVEZXBlbmRlbmN5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBtZWNoYW5pc20gYnkgd2hpY2ggYW5pbWF0aW9ucyBhcmUgc3RhcnRlZCBiYXNlZCBvbiBldmVudHMgaW4gb3RoZXIKKyAgICAgKiBhbmltYXRpb25zLiBJZiBhbiBhbmltYXRpb24gaGFzIG11bHRpcGxlIGRlcGVuZGVuY2llcyBvbiBvdGhlciBhbmltYXRpb25zLCB0aGVuCisgICAgICogYWxsIGRlcGVuZGVuY2llcyBtdXN0IGJlIHNhdGlzZmllZCBiZWZvcmUgdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlcGVuZGVuY3lMaXN0ZW5lciBpbXBsZW1lbnRzIEFuaW1hdG9yTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgQW5pbWF0b3JTZXQgbUFuaW1hdG9yU2V0OworCisgICAgICAgIC8vIFRoZSBub2RlIHVwb24gd2hpY2ggdGhlIGRlcGVuZGVuY3kgaXMgYmFzZWQuCisgICAgICAgIHByaXZhdGUgTm9kZSBtTm9kZTsKKworICAgICAgICAvLyBUaGUgRGVwZW5kZW5jeSBydWxlIChXSVRIIG9yIEFGVEVSKSB0aGF0IHRoZSBsaXN0ZW5lciBzaG91bGQgd2FpdCBmb3Igb24KKyAgICAgICAgLy8gdGhlIG5vZGUKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVJ1bGU7CisKKyAgICAgICAgcHVibGljIERlcGVuZGVuY3lMaXN0ZW5lcihBbmltYXRvclNldCBhbmltYXRvclNldCwgTm9kZSBub2RlLCBpbnQgcnVsZSkgeworICAgICAgICAgICAgdGhpcy5tQW5pbWF0b3JTZXQgPSBhbmltYXRvclNldDsKKyAgICAgICAgICAgIHRoaXMubU5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5tUnVsZSA9IHJ1bGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWdub3JlIGNhbmNlbCBldmVudHMgZm9yIG5vdy4gV2UgbWF5IHdhbnQgdG8gaGFuZGxlIHRoaXMgZXZlbnR1YWxseSwKKyAgICAgICAgICogdG8gcHJldmVudCBmb2xsb3ctb24gYW5pbWF0aW9ucyBmcm9tIHJ1bm5pbmcgd2hlbiBzb21lIGRlcGVuZGVuY3kKKyAgICAgICAgICogYW5pbWF0aW9uIGlzIGNhbmNlbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gZW5kIGV2ZW50IGlzIHJlY2VpdmVkIC0gc2VlIGlmIHRoaXMgaXMgYW4gZXZlbnQgd2UgYXJlIGxpc3RlbmluZyBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1SdWxlID09IERlcGVuZGVuY3kuQUZURVIpIHsKKyAgICAgICAgICAgICAgICBzdGFydElmUmVhZHkoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZ25vcmUgcmVwZWF0IGV2ZW50cyBmb3Igbm93CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHN0YXJ0IGV2ZW50IGlzIHJlY2VpdmVkIC0gc2VlIGlmIHRoaXMgaXMgYW4gZXZlbnQgd2UgYXJlIGxpc3RlbmluZyBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAobVJ1bGUgPT0gRGVwZW5kZW5jeS5XSVRIKSB7CisgICAgICAgICAgICAgICAgc3RhcnRJZlJlYWR5KGFuaW1hdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZXZlbnQgcmVjZWl2ZWQgaXMgb25lIHRoYXQgdGhlIG5vZGUgd2FzIHdhaXRpbmcgZm9yLgorICAgICAgICAgKiBJZiBzbywgbWFyayBpdCBhcyBjb21wbGV0ZSBhbmQgc2VlIHdoZXRoZXIgaXQncyB0aW1lIHRvIHN0YXJ0CisgICAgICAgICAqIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5QW5pbWF0aW9uIHRoZSBhbmltYXRpb24gdGhhdCBzZW50IHRoZSBldmVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBzdGFydElmUmVhZHkoQW5pbWF0b3IgZGVwZW5kZW5jeUFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKG1BbmltYXRvclNldC5tQ2FuY2VsZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IEFuaW1hdG9yU2V0IHdhcyBjYW5jZWxlZCwgdGhlbiBkb24ndCBzdGFydCBhbnkgZGVwZW5kZW50IGFuaW1zCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5VG9SZW1vdmUgPSBudWxsOworICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBtTm9kZS50bXBEZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5ydWxlID09IG1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Lm5vZGUuYW5pbWF0aW9uID09IGRlcGVuZGVuY3lBbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcnVsZSBmaXJlZCAtIHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBhbmQgbGlzdGVuZXIgYW5kIGNoZWNrIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIGl0J3MgdGltZSB0byBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lUb1JlbW92ZSA9IGRlcGVuZGVuY3k7CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lBbmltYXRpb24ucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob2RlLnRtcERlcGVuZGVuY2llcy5yZW1vdmUoZGVwZW5kZW5jeVRvUmVtb3ZlKTsKKyAgICAgICAgICAgIGlmIChtTm9kZS50bXBEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgZGVwZW5kZW5jaWVzIHNhdGlzZmllZDogc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIG1Ob2RlLmFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgICAgIG1BbmltYXRvclNldC5tUGxheWluZ1NldC5hZGQobU5vZGUuYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBBbmltYXRvclNldExpc3RlbmVyIGltcGxlbWVudHMgQW5pbWF0b3JMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBBbmltYXRvclNldCBtQW5pbWF0b3JTZXQ7CisKKyAgICAgICAgQW5pbWF0b3JTZXRMaXN0ZW5lcihBbmltYXRvclNldCBhbmltYXRvclNldCkgeworICAgICAgICAgICAgbUFuaW1hdG9yU2V0ID0gYW5pbWF0b3JTZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtUGxheWluZ1NldC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25DYW5jZWwobUFuaW1hdG9yU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGFuaW1hdGlvbi5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1QbGF5aW5nU2V0LnJlbW92ZShhbmltYXRpb24pOworICAgICAgICAgICAgTm9kZSBhbmltTm9kZSA9IG1BbmltYXRvclNldC5tTm9kZU1hcC5nZXQoYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIGFuaW1Ob2RlLmRvbmUgPSB0cnVlOworICAgICAgICAgICAgQXJyYXlMaXN0PE5vZGU+IHNvcnRlZE5vZGVzID0gbUFuaW1hdG9yU2V0Lm1Tb3J0ZWROb2RlczsKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRG9uZSA9IHRydWU7CisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHNvcnRlZE5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLmRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsRG9uZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWxsRG9uZSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNoaWxkIGFuaW1hdGlvbiB0byBlbmQsIHRoZW4gbm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBBbmltYXRvclNldCBoYXMgZW5kZWQKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvbkVuZChtQW5pbWF0b3JTZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc29ydHMgdGhlIGN1cnJlbnQgc2V0IG9mIG5vZGVzLCBpZiBuZWVkZWQuIFRoZSBzb3J0IGlzIGEgc2ltcGxlCisgICAgICogRGVwZW5kZW5jeUdyYXBoIHNvcnQsIHdoaWNoIGdvZXMgbGlrZSB0aGlzOgorICAgICAqIC0gQWxsIG5vZGVzIHdpdGhvdXQgZGVwZW5kZW5jaWVzIGJlY29tZSAncm9vdHMnCisgICAgICogLSB3aGlsZSByb290cyBsaXN0IGlzIG5vdCBudWxsCisgICAgICogLSAgIGZvciBlYWNoIHJvb3QgcgorICAgICAqIC0gICAgIGFkZCByIHRvIHNvcnRlZCBsaXN0CisgICAgICogLSAgICAgcmVtb3ZlIHIgYXMgYSBkZXBlbmRlbmN5IGZyb20gYW55IG90aGVyIG5vZGUKKyAgICAgKiAtICAgYW55IG5vZGVzIHdpdGggbm8gZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB0byB0aGUgcm9vdHMgbGlzdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzb3J0Tm9kZXMoKSB7CisgICAgICAgIGlmIChtTmVlZHNTb3J0KSB7CisgICAgICAgICAgICBtU29ydGVkTm9kZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiByb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIGZvciAoTm9kZSBub2RlIDogbU5vZGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVwZW5kZW5jaWVzID09IG51bGwgfHwgbm9kZS5kZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFycmF5TGlzdDxOb2RlPiB0bXBSb290cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIHdoaWxlIChyb290cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIHJvb3QgOiByb290cykgeworICAgICAgICAgICAgICAgICAgICBtU29ydGVkTm9kZXMuYWRkKHJvb3QpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5ub2RlRGVwZW5kZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IHJvb3Qubm9kZURlcGVuZGVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVEZXBlbmRlbmNpZXMucmVtb3ZlKHJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVEZXBlbmRlbmNpZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUm9vdHMuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb290cy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJvb3RzLmFkZEFsbCh0bXBSb290cyk7CisgICAgICAgICAgICAgICAgdG1wUm9vdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OZWVkc1NvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtU29ydGVkTm9kZXMuc2l6ZSgpICE9IG1Ob2Rlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDaXJjdWxhciBkZXBlbmRlbmNpZXMgY2Fubm90IGV4aXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIEFuaW1hdG9yU2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEb2Vzbid0IG5lZWQgc29ydGluZywgYnV0IHN0aWxsIG5lZWQgdG8gYWRkIGluIHRoZSBub2RlRGVwZW5kZW5jaWVzIGxpc3QKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlc2UgZ2V0IHJlbW92ZWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmaXJlIGFuZCB0aGUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAvLyBhcmUgc2F0aXNmaWVkCisgICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA6IG1Ob2RlcykgeworICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZGVuY2llcyAhPSBudWxsICYmIG5vZGUuZGVwZW5kZW5jaWVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChEZXBlbmRlbmN5IGRlcGVuZGVuY3kgOiBub2RlLmRlcGVuZGVuY2llcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZURlcGVuZGVuY2llcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeS5ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLmRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlcGVuZGVuY3kgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgdGhhdCBzb21lIG90aGVyIG5vZGUgaXMKKyAgICAgKiBkZXBlbmRlbnQgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGF0IGRlcGVuZGVuY3kuCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBlbmRlbmN5IHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBXSVRIID0gMDsgLy8gZGVwZW5kZW50IG5vZGUgbXVzdCBzdGFydCB3aXRoIHRoaXMgZGVwZW5kZW5jeSBub2RlCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUZURVIgPSAxOyAvLyBkZXBlbmRlbnQgbm9kZSBtdXN0IHN0YXJ0IHdoZW4gdGhpcyBkZXBlbmRlbmN5IG5vZGUgZmluaXNoZXMKKworICAgICAgICAvLyBUaGUgbm9kZSB0aGF0IHRoZSBvdGhlciBub2RlIHdpdGggdGhpcyBEZXBlbmRlbmN5IGlzIGRlcGVuZGVudCB1cG9uCisgICAgICAgIHB1YmxpYyBOb2RlIG5vZGU7CisKKyAgICAgICAgLy8gVGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeSAoV0lUSCBvciBBRlRFUikKKyAgICAgICAgcHVibGljIGludCBydWxlOworCisgICAgICAgIHB1YmxpYyBEZXBlbmRlbmN5KE5vZGUgbm9kZSwgaW50IHJ1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgICAgICAgICB0aGlzLnJ1bGUgPSBydWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBOb2RlIGlzIGFuIGVtYm9kaW1lbnQgb2YgYm90aCB0aGUgQW5pbWF0b3IgdGhhdCBpdCB3cmFwcyBhcyB3ZWxsIGFzCisgICAgICogYW55IGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBBbmltYXRpb24uIFRoaXMgaW5jbHVkZXMKKyAgICAgKiBib3RoIGRlcGVuZGVuY2llcyB1cG9uIG90aGVyIG5vZGVzIChpbiB0aGUgZGVwZW5kZW5jaWVzIGxpc3QpIGFzCisgICAgICogd2VsbCBhcyBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgbm9kZXMgdXBvbiB0aGlzIChpbiB0aGUgbm9kZURlcGVuZGVudHMgbGlzdCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisgICAgICAgIHB1YmxpYyBBbmltYXRvciBhbmltYXRpb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqICBUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHRoaXMgbm9kZSdzIGFuaW1hdGlvbiBoYXMgb24gb3RoZXIKKyAgICAgICAgICogIG5vZGVzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBub2RlJ3MgYW5pbWF0aW9uIHNob3VsZCBiZWdpbiB3aXRoIHNvbWUKKyAgICAgICAgICogIG90aGVyIGFuaW1hdGlvbiBlbmRzLCB0aGVuIHRoZXJlIHdpbGwgYmUgYW4gaXRlbSBpbiB0aGlzIG5vZGUncworICAgICAgICAgKiAgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHRoYXQgb3RoZXIgYW5pbWF0aW9uJ3Mgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gZGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogdG1wRGVwZW5kZW5jaWVzIGlzIGEgcnVudGltZSBkZXRhaWwuIFdlIHVzZSB0aGUgZGVwZW5kZW5jaWVzIGxpc3QgZm9yIHNvcnRpbmcuCisgICAgICAgICAqIEJ1dCB3ZSBhbHNvIHVzZSB0aGUgbGlzdCB0byBrZWVwIHRyYWNrIG9mIHdoZW4gbXVsdGlwbGUgZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQsCisgICAgICAgICAqIGJ1dCByZW1vdmluZyBlYWNoIGRlcGVuZGVuY3kgYXMgaXQgaXMgc2F0aXNmaWVkLiBXZSBkbyBub3Qgd2FudCB0byByZW1vdmUKKyAgICAgICAgICogdGhlIGRlcGVuZGVuY3kgaXRzZWxmIGZyb20gdGhlIGxpc3QsIGJlY2F1c2Ugd2UgbmVlZCB0byByZXRhaW4gdGhhdCBpbmZvcm1hdGlvbgorICAgICAgICAgKiBpZiB0aGUgQW5pbWF0b3JTZXQgaXMgbGF1bmNoZWQgaW4gdGhlIGZ1dHVyZS4gU28gd2UgY3JlYXRlIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeQorICAgICAgICAgKiBsaXN0IHdoZW4gdGhlIEFuaW1hdG9yU2V0IHN0YXJ0cyBhbmQgdXNlIHRoaXMgdG1wRGVwZW5kZW5jaWVzIGxpc3QgdG8gdHJhY2sgdGhlCisgICAgICAgICAqIGxpc3Qgb2Ygc2F0aXNmaWVkIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8RGVwZW5kZW5jeT4gdG1wRGVwZW5kZW5jaWVzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogbm9kZURlcGVuZGVuY2llcyBpcyBqdXN0IGEgbGlzdCBvZiB0aGUgbm9kZXMgdGhhdCB0aGlzIE5vZGUgaXMgZGVwZW5kZW50IHVwb24uCisgICAgICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpbiBzb3J0Tm9kZXMoKSwgdG8gZGV0ZXJtaW5lIHdoZW4gYSBub2RlIGlzIGEgcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcnJheUxpc3Q8Tm9kZT4gbm9kZURlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG5vZGVEZXBkZW5kZW50cyBpcyB0aGUgbGlzdCBvZiBub2RlcyB0aGF0IGhhdmUgdGhpcyBub2RlIGFzIGEgZGVwZW5kZW5jeS4gVGhpcworICAgICAgICAgKiBpcyBhIHV0aWxpdHkgZmllbGQgdXNlZCBpbiBzb3J0Tm9kZXMgdG8gZmFjaWxpdGF0ZSByZW1vdmluZyB0aGlzIG5vZGUgYXMgYQorICAgICAgICAgKiBkZXBlbmRlbmN5IHdoZW4gaXQgaXMgYSByb290IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PE5vZGU+IG5vZGVEZXBlbmRlbnRzID0gbnVsbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpbiB0aGlzIG5vZGUgaXMgZmluaXNoZWQuIFRoaXMgZmxhZworICAgICAgICAgKiBpcyB1c2VkIGJ5IEFuaW1hdG9yU2V0IHRvIGNoZWNrLCBhcyBlYWNoIGFuaW1hdGlvbiBlbmRzLCB3aGV0aGVyIGFsbCBjaGlsZCBhbmltYXRpb25zCisgICAgICAgICAqIGFyZSBkb25lIGFuZCBpdCdzIHRpbWUgdG8gc2VuZCBvdXQgYW4gZW5kIGV2ZW50IGZvciB0aGUgZW50aXJlIEFuaW1hdG9yU2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSBOb2RlIHdpdGggdGhlIGFuaW1hdGlvbiB0aGF0IGl0IGVuY2Fwc3VsYXRlcy4gQSBOb2RlIGhhcyBubworICAgICAgICAgKiBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdDsgZGVwZW5kZW5jaWVzIGFyZSBhZGRlZCB2aWEgdGhlIGFkZERlcGVuZGVuY3koKQorICAgICAgICAgKiBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltYXRpb24gVGhlIGFuaW1hdGlvbiB0aGF0IHRoZSBOb2RlIGVuY2Fwc3VsYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBOb2RlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgdGhpcy5hbmltYXRpb24gPSBhbmltYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIE5vZGUuIFRoZSBkZXBlbmRlbmN5IGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICAgKiBub2RlIHRoYXQgdGhpcyBub2RlIGlzIGRlcGVuZGVuY3kgdXBvbiBhbmQgdGhlIG5hdHVyZSBvZiB0aGUgZGVwZW5kZW5jeS4KKyAgICAgICAgICogQHBhcmFtIGRlcGVuZGVuY3kKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVuY3koRGVwZW5kZW5jeSBkZXBlbmRlbmN5KSB7CisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PERlcGVuZGVuY3k+KCk7CisgICAgICAgICAgICAgICAgbm9kZURlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CisgICAgICAgICAgICBpZiAoIW5vZGVEZXBlbmRlbmNpZXMuY29udGFpbnMoZGVwZW5kZW5jeS5ub2RlKSkgeworICAgICAgICAgICAgICAgIG5vZGVEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kubm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb2RlIGRlcGVuZGVuY3lOb2RlID0gZGVwZW5kZW5jeS5ub2RlOworICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5Tm9kZS5ub2RlRGVwZW5kZW50cyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcGVuZGVuY3lOb2RlLm5vZGVEZXBlbmRlbnRzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTm9kZSBjbG9uZSgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICAgICAgbm9kZS5hbmltYXRpb24gPSAoQW5pbWF0b3IpIGFuaW1hdGlvbi5jbG9uZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IGlzIGEgdXRpbGl0eSBjbGFzcyB0byBmYWNpbGl0YXRlIGFkZGluZyBhbmltYXRpb25zIHRvIGEKKyAgICAgKiA8Y29kZT5BbmltYXRvclNldDwvY29kZT4gYWxvbmcgd2l0aCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSB2YXJpb3VzIGFuaW1hdGlvbnMuIFRoZQorICAgICAqIGludGVudGlvbiBvZiB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gbWV0aG9kcywgYWxvbmcgd2l0aCB0aGUge0BsaW5rCisgICAgICogQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcikgcGxheSgpfSBtZXRob2Qgb2YgPGNvZGU+QW5pbWF0b3JTZXQ8L2NvZGU+IGlzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8KKyAgICAgKiBleHByZXNzIHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgb2YgYW5pbWF0aW9ucyBpbiBhIG5hdHVyYWwgd2F5LiBEZXZlbG9wZXJzIGNhbiBhbHNvIHVzZQorICAgICAqIHRoZSB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheVRvZ2V0aGVyKEFuaW1hdG9yW10pIHBsYXlUb2dldGhlcigpfSBhbmQge0BsaW5rCisgICAgICogQW5pbWF0b3JTZXQjcGxheVNlcXVlbnRpYWxseShBbmltYXRvcltdKSBwbGF5U2VxdWVudGlhbGx5KCl9IG1ldGhvZHMgaWYgdGhlc2Ugc3VpdCB0aGUgbmVlZCwKKyAgICAgKiBidXQgaXQgbWlnaHQgYmUgZWFzaWVyIGluIHNvbWUgc2l0dWF0aW9ucyB0byBleHByZXNzIHRoZSBBbmltYXRvclNldCBvZiBhbmltYXRpb25zIGluIHBhaXJzLgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5UaGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSwgYnV0IGlzIHJhdGhlciBjb25zdHJ1Y3RlZAorICAgICAqIGludGVybmFsbHkgdmlhIGEgY2FsbCB0byB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9LjwvcD4KKyAgICAgKiA8cC8+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoaXMgc2V0cyB1cCBhIEFuaW1hdG9yU2V0IHRvIHBsYXkgYW5pbTEgYW5kIGFuaW0yIGF0IHRoZSBzYW1lIHRpbWUsIGFuaW0zIHRvCisgICAgICogcGxheSB3aGVuIGFuaW0yIGZpbmlzaGVzLCBhbmQgYW5pbTQgdG8gcGxheSB3aGVuIGFuaW0zIGZpbmlzaGVzOjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICAgICBBbmltYXRvclNldCBzID0gbmV3IEFuaW1hdG9yU2V0KCk7CisgICAgICogICAgIHMucGxheShhbmltMSkud2l0aChhbmltMik7CisgICAgICogICAgIHMucGxheShhbmltMikuYmVmb3JlKGFuaW0zKTsKKyAgICAgKiAgICAgcy5wbGF5KGFuaW00KS5hZnRlcihhbmltMyk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwPk5vdGUgaW4gdGhlIGV4YW1wbGUgdGhhdCBib3RoIHtAbGluayBCdWlsZGVyI2JlZm9yZShBbmltYXRvcil9IGFuZCB7QGxpbmsKKyAgICAgKiBCdWlsZGVyI2FmdGVyKEFuaW1hdG9yKX0gYXJlIHVzZWQuIFRoZXNlIGFyZSBqdXN0IGRpZmZlcmVudCB3YXlzIG9mIGV4cHJlc3NpbmcgdGhlIHNhbWUKKyAgICAgKiByZWxhdGlvbnNoaXAgYW5kIGFyZSBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byBzYXkgdGhpbmdzIGluIGEgd2F5IHRoYXQgaXMgbW9yZSBuYXR1cmFsLAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgc2l0dWF0aW9uLjwvcD4KKyAgICAgKiA8cC8+CisgICAgICogPHA+SXQgaXMgcG9zc2libGUgdG8gbWFrZSBzZXZlcmFsIGNhbGxzIGludG8gdGhlIHNhbWUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0IHRvIGV4cHJlc3MKKyAgICAgKiBtdWx0aXBsZSByZWxhdGlvbnNoaXBzLiBIb3dldmVyLCBub3RlIHRoYXQgaXQgaXMgb25seSB0aGUgYW5pbWF0aW9uIHBhc3NlZCBpbnRvIHRoZSBpbml0aWFsCisgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2QgdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBpbiBhbnkgb2YgdGhlIHN1Y2Nlc3NpdmUKKyAgICAgKiBjYWxscyB0byB0aGUgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIHN0YXJ0cyBib3RoIGFuaW0yCisgICAgICogYW5kIGFuaW0zIHdoZW4gYW5pbTEgZW5kczsgdGhlcmUgaXMgbm8gZGlyZWN0IGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIGJldHdlZW4gYW5pbTIgYW5kCisgICAgICogYW5pbTM6CisgICAgICogPHByZT4KKyAgICAgKiAgIEFuaW1hdG9yU2V0IHMgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgKiAgIHMucGxheShhbmltMSkuYmVmb3JlKGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIElmIHRoZSBkZXNpcmVkIHJlc3VsdCBpcyB0byBwbGF5IGFuaW0xIHRoZW4gYW5pbTIgdGhlbiBhbmltMywgdGhpcyBjb2RlIGV4cHJlc3NlcyB0aGUKKyAgICAgKiByZWxhdGlvbnNoaXAgY29ycmVjdGx5OjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICAgQW5pbWF0b3JTZXQgcyA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAqICAgcy5wbGF5KGFuaW0xKS5iZWZvcmUoYW5pbTIpOworICAgICAqICAgcy5wbGF5KGFuaW0yKS5iZWZvcmUoYW5pbTMpOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gZXhwcmVzcyByZWxhdGlvbnNoaXBzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGFuZCB3aWxsIG5vdAorICAgICAqIHJlc3VsdCBpbiBzZW5zaWJsZSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgPGNvZGU+cGxheShhbmltMSkuYWZ0ZXIoYW5pbTEpPC9jb2RlPiBtYWtlcyBubworICAgICAqIHNlbnNlLiBJbiBnZW5lcmFsLCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzIG9uZSAob3IgbW9yZSBpbmRpcmVjdCBvbmVzIHdoZXJlIGEgZGVwZW5kcworICAgICAqIG9uIGIsIHdoaWNoIGRlcGVuZHMgb24gYywgd2hpY2ggZGVwZW5kcyBvbiBhKSBzaG91bGQgYmUgYXZvaWRlZC4gT25seSBjcmVhdGUgQW5pbWF0b3JTZXRzCisgICAgICogdGhhdCBjYW4gYm9pbCBkb3duIHRvIGEgc2ltcGxlLCBvbmUtd2F5IHJlbGF0aW9uc2hpcCBvZiBhbmltYXRpb25zIHN0YXJ0aW5nIHdpdGgsIGJlZm9yZSwgYW5kCisgICAgICogYWZ0ZXIgb3RoZXIsIGRpZmZlcmVudCwgYW5pbWF0aW9ucy48L3A+CisgICAgICovCisgICAgcHVibGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHRyYWNrcyB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZC4gSXQgaXMgc3VwcGxpZWQgdG8gdGhlIHBsYXkoKSBtZXRob2QKKyAgICAgICAgICogb2YgQW5pbWF0b3JTZXQgYW5kIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiBCdWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBOb2RlIG1DdXJyZW50Tm9kZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogcGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yLiBCdWlsZGVycyBhcmUgb25seSBjb25zdHJ1Y3RlZCBieSBBbmltYXRvclNldCwgd2hlbiB0aGUKKyAgICAgICAgICogcGxheSgpIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gdGhhdCBpcyB0aGUgZGVwZW5kZW5jeSBmb3IgdGhlIG90aGVyIGFuaW1hdGlvbnMgcGFzc2VkIGludG8KKyAgICAgICAgICogdGhlIG90aGVyIG1ldGhvZHMgb2YgdGhpcyBCdWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG1DdXJyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnROb2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG1DdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChtQ3VycmVudE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGdpdmVuIGFuaW1hdGlvbiB0byBwbGF5IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIHN0YXJ0cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdpdGgoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5XSVRIKTsKKyAgICAgICAgICAgIG5vZGUuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHVwIHRoZSBnaXZlbiBhbmltYXRpb24gdG8gcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgaW4gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gY2FsbCB0aGF0IGNyZWF0ZWQgdGhpcyA8Y29kZT5CdWlsZGVyPC9jb2RlPiBvYmplY3QKKyAgICAgICAgICogZW5kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFuaW0gVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgcGxheSB3aGVuIHRoZSBhbmltYXRpb24gc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICAqIHtAbGluayBBbmltYXRvclNldCNwbGF5KEFuaW1hdG9yKX0gbWV0aG9kIGVuZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmUoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbU5vZGVNYXAuZ2V0KGFuaW0pOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgTm9kZShhbmltKTsKKyAgICAgICAgICAgICAgICBtTm9kZU1hcC5wdXQoYW5pbSwgbm9kZSk7CisgICAgICAgICAgICAgICAgbU5vZGVzLmFkZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBEZXBlbmRlbmN5KG1DdXJyZW50Tm9kZSwgRGVwZW5kZW5jeS5BRlRFUik7CisgICAgICAgICAgICBub2RlLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB1cCB0aGUgZ2l2ZW4gYW5pbWF0aW9uIHRvIHBsYXkgd2hlbiB0aGUgYW5pbWF0aW9uIHN1cHBsaWVkIGluIHRoZQorICAgICAgICAgKiB7QGxpbmsgQW5pbWF0b3JTZXQjcGxheShBbmltYXRvcil9IGNhbGwgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+QnVpbGRlcjwvY29kZT4gb2JqZWN0CisgICAgICAgICAqIHRvIHN0YXJ0IHdoZW4gdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGlzIG1ldGhvZCBjYWxsIGVuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbmltIFRoZSBhbmltYXRpb24gd2hvc2UgZW5kIHdpbGwgY2F1c2UgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBtZXRob2QgdG8gcGxheS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyKEFuaW1hdG9yIGFuaW0pIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG1Ob2RlTWFwLmdldChhbmltKTsKKyAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoYW5pbSk7CisgICAgICAgICAgICAgICAgbU5vZGVNYXAucHV0KGFuaW0sIG5vZGUpOworICAgICAgICAgICAgICAgIG1Ob2Rlcy5hZGQobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeShub2RlLCBEZXBlbmRlbmN5LkFGVEVSKTsKKyAgICAgICAgICAgIG1DdXJyZW50Tm9kZS5hZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdXAgdGhlIGFuaW1hdGlvbiBzdXBwbGllZCBpbiB0aGUKKyAgICAgICAgICoge0BsaW5rIEFuaW1hdG9yU2V0I3BsYXkoQW5pbWF0b3IpfSBjYWxsIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IG9iamVjdAorICAgICAgICAgKiB0byBwbGF5IHdoZW4gdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIGVsYXBzZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZWxheSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IHNob3VsZCBlbGFwc2UgYmVmb3JlIHRoZQorICAgICAgICAgKiBhbmltYXRpb24gc3RhcnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXIobG9uZyBkZWxheSkgeworICAgICAgICAgICAgLy8gc2V0dXAgZHVtbXkgVmFsdWVBbmltYXRvciBqdXN0IHRvIHJ1biB0aGUgY2xvY2sKKyAgICAgICAgICAgIGFmdGVyKG5ldyBWYWx1ZUFuaW1hdG9yKGRlbGF5LCAwZiwgMWYpKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRG91YmxlRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2ZWIzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Eb3VibGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgRG91YmxlRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5kb3VibGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgPGNvZGU+RG91YmxlPC9jb2RlPgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5Eb3VibGU8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBkb3VibGUgc3RhcnREb3VibGUgPSAoKE51bWJlcikgc3RhcnRWYWx1ZSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0RG91YmxlICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5kb3VibGVWYWx1ZSgpIC0gc3RhcnREb3VibGUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjA1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vRmxvYXRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGbG9hdEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5GbG9hdDwvY29kZT4KKyAgICAgKiBAcGFyYW0gZW5kVmFsdWUgICBUaGUgZW5kIHZhbHVlOyBzaG91bGQgYmUgb2YgdHlwZSA8Y29kZT5mbG9hdDwvY29kZT4gb3IgPGNvZGU+RmxvYXQ8L2NvZGU+CisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSkgeworICAgICAgICBmbG9hdCBzdGFydEZsb2F0ID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0RmxvYXQgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmZsb2F0VmFsdWUoKSAtIHN0YXJ0RmxvYXQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4ODkyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9JbnRFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworLyoqCisgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmludDwvY29kZT4gdmFsdWVzLgorICovCitwdWJsaWMgY2xhc3MgSW50RXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aAorICAgICAqIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHByb3BvcnRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMuIFRoZQorICAgICAqIGNhbGN1bGF0aW9uIGlzIGEgc2ltcGxlIHBhcmFtZXRyaWMgY2FsY3VsYXRpb246IDxjb2RlPnJlc3VsdCA9IHgwICsgdCAqICh2MSAtIHYwKTwvY29kZT4sCisgICAgICogd2hlcmUgPGNvZGU+eDA8L2NvZGU+IGlzIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+LCA8Y29kZT54MTwvY29kZT4gaXMgPGNvZGU+ZW5kVmFsdWU8L2NvZGU+LAorICAgICAqIGFuZCA8Y29kZT50PC9jb2RlPiBpcyA8Y29kZT5mcmFjdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gICBUaGUgZnJhY3Rpb24gZnJvbSB0aGUgc3RhcnRpbmcgdG8gdGhlIGVuZGluZyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gc3RhcnRWYWx1ZSBUaGUgc3RhcnQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICA8Y29kZT5JbnRlZ2VyPC9jb2RlPgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWU7IHNob3VsZCBiZSBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4KKyAgICAgKiBAcmV0dXJuIEEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIGdpdmVuIHRoZQorICAgICAqICAgICAgICAgPGNvZGU+ZnJhY3Rpb248L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5pbnRWYWx1ZSgpOworICAgICAgICByZXR1cm4gKGludCkgKHN0YXJ0SW50ICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5pbnRWYWx1ZSgpIC0gc3RhcnRJbnQpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vS2V5ZnJhbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTJiYTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIHRpbWUvdmFsdWUgcGFpciBmb3IgYW4gYW5pbWF0aW9uLiBUaGUgS2V5ZnJhbWUgY2xhc3MgaXMgdXNlZAorICogYnkge0BsaW5rIFZhbHVlQW5pbWF0b3J9IHRvIGRlZmluZSB0aGUgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB0YXJnZXQgd2lsbCBoYXZlIG92ZXIgdGhlIGNvdXJzZQorICogb2YgdGhlIGFuaW1hdGlvbi4gQXMgdGhlIHRpbWUgcHJvY2VlZHMgZnJvbSBvbmUga2V5ZnJhbWUgdG8gdGhlIG90aGVyLCB0aGUgdmFsdWUgb2YgdGhlCisgKiB0YXJnZXQgb2JqZWN0IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuIHRoZSB2YWx1ZSBhdCB0aGUgcHJldmlvdXMga2V5ZnJhbWUgYW5kIHRoZSB2YWx1ZSBhdCB0aGUKKyAqIG5leHQga2V5ZnJhbWUuIEVhY2gga2V5ZnJhbWUgYWxzbyBob2xkcyBhbiBvcHRpb24ge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yfQorICogb2JqZWN0LCB3aGljaCBkZWZpbmVzIHRoZSB0aW1lIGludGVycG9sYXRpb24gb3ZlciB0aGUgaW50ZXJ2YWx1ZSBwcmVjZWRpbmcgdGhlIGtleWZyYW1lLgorICovCitwdWJsaWMgY2xhc3MgS2V5ZnJhbWUgaW1wbGVtZW50cyBDbG9uZWFibGUgeworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGF0IHdoaWNoIG1WYWx1ZSB3aWxsIGhvbGQgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1GcmFjdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgYW5pbWF0aW9uIGF0IHRoZSB0aW1lIG1GcmFjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaW4gdGhpcyBLZXlmcmFtZS4gVGhpcyB0eXBlIGlzIGRldGVybWluZWQgYXQgY29uc3RydWN0aW9uIHRpbWUsCisgICAgICogYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvYmplY3QgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgbVZhbHVlVHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBvcHRpb25hbCB0aW1lIGludGVycG9sYXRvciBmb3IgdGhlIGludGVydmFsIHByZWNlZGluZyB0aGlzIGtleWZyYW1lLiBBIG51bGwgaW50ZXJwb2xhdG9yCisgICAgICogKHRoZSBkZWZhdWx0KSByZXN1bHRzIGluIGxpbmVhciBpbnRlcnBvbGF0aW9uIG92ZXIgdGhlIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBudWxsOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciwgY2FsbGVkIGZyb20gdGhlIHB1YmxpYyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgYWRkaXRpb25hbAorICAgICAqIDxjb2RlPnZhbHVlVHlwZTwvY29kZT4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gb2JqZWN0LiBUaGlzIGlzIHVzZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNnZXRWYWx1ZSgpfSBmdW5jdGlvbm0sIHdoaWNoIGlzIHF1ZXJpZWQgYnkge0BsaW5rIFZhbHVlQW5pbWF0b3J9IHRvIGRldGVybWluZQorICAgICAqIHRoZSB0eXBlIG9mIHtAbGluayBUeXBlRXZhbHVhdG9yfSB0byB1c2UgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHZhbHVlLCBDbGFzcyB2YWx1ZVR5cGUpIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgICAgIG1WYWx1ZSA9IHZhbHVlOworICAgICAgICBtVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzKGZyYWN0aW9uLCB2YWx1ZSwgKHZhbHVlICE9IG51bGwpID8gdmFsdWUuZ2V0Q2xhc3MoKSA6IE9iamVjdC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBmbG9hdCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgRmxvYXQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIEZsb2F0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGludGVnZXIgdmFsdWUuIFRoZSB0aW1lIGRlZmluZXMgdGhlCisgICAgICogdGltZSwgYXMgYSBwcm9wb3J0aW9uIG9mIGFuIG92ZXJhbGwgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGF0IHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGhvbGQgdHJ1ZQorICAgICAqIGZvciB0aGUgYW5pbWF0aW9uLiBUaGUgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gYmV0d2VlbiBrZXlmcmFtZXMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzCisgICAgICogYW4gaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSB2YWx1ZXMgYXQgdGhvc2Uga2V5ZnJhbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSB0aW1lLCBleHByZXNzZWQgYXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHJlcHJlc2VudGluZyB0aGUgZnJhY3Rpb24KKyAgICAgKiBvZiB0aW1lIGVsYXBzZWQgb2YgdGhlIG92ZXJhbGwgYW5pbWF0aW9uIGR1cmF0aW9uLgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgb2JqZWN0IHdpbGwgYW5pbWF0ZSB0byBhcyB0aGUgYW5pbWF0aW9uIHRpbWUgYXBwcm9hY2hlcworICAgICAqIHRoZSB0aW1lIGluIHRoaXMga2V5ZnJhbWUsIGFuZCB0aGUgdGhlIHZhbHVlIGFuaW1hdGVkIGZyb20gYXMgdGhlIHRpbWUgcGFzc2VzIHRoZSB0aW1lIGluCisgICAgICogdGhpcyBrZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5ZnJhbWUoZmxvYXQgZnJhY3Rpb24sIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIEludGVnZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBLZXlmcmFtZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdGltZSBhbmQgZG91YmxlIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBEb3VibGUgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIERvdWJsZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBpbnRlZ2VyIHZhbHVlLiBUaGUgdGltZSBkZWZpbmVzIHRoZQorICAgICAqIHRpbWUsIGFzIGEgcHJvcG9ydGlvbiBvZiBhbiBvdmVyYWxsIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBhdCB3aGljaCB0aGUgdmFsdWUgd2lsbCBob2xkIHRydWUKKyAgICAgKiBmb3IgdGhlIGFuaW1hdGlvbi4gVGhlIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIGJldHdlZW4ga2V5ZnJhbWVzIHdpbGwgYmUgY2FsY3VsYXRlZCBhcworICAgICAqIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdmFsdWVzIGF0IHRob3NlIGtleWZyYW1lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgdGltZSwgZXhwcmVzc2VkIGFzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCByZXByZXNlbnRpbmcgdGhlIGZyYWN0aW9uCisgICAgICogb2YgdGltZSBlbGFwc2VkIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbiBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgdGhlIG9iamVjdCB3aWxsIGFuaW1hdGUgdG8gYXMgdGhlIGFuaW1hdGlvbiB0aW1lIGFwcHJvYWNoZXMKKyAgICAgKiB0aGUgdGltZSBpbiB0aGlzIGtleWZyYW1lLCBhbmQgdGhlIHRoZSB2YWx1ZSBhbmltYXRlZCBmcm9tIGFzIHRoZSB0aW1lIHBhc3NlcyB0aGUgdGltZSBpbgorICAgICAqIHRoaXMga2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEtleWZyYW1lKGZsb2F0IGZyYWN0aW9uLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGludC5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIEtleWZyYW1lIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB0aW1lIGFuZCBmbG9hdCB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgdGhpcyhmcmFjdGlvbiwgdmFsdWUsIGZsb2F0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgS2V5ZnJhbWUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHRpbWUgYW5kIGRvdWJsZSB2YWx1ZS4gVGhlIHRpbWUgZGVmaW5lcyB0aGUKKyAgICAgKiB0aW1lLCBhcyBhIHByb3BvcnRpb24gb2YgYW4gb3ZlcmFsbCBhbmltYXRpb24ncyBkdXJhdGlvbiwgYXQgd2hpY2ggdGhlIHZhbHVlIHdpbGwgaG9sZCB0cnVlCisgICAgICogZm9yIHRoZSBhbmltYXRpb24uIFRoZSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBiZXR3ZWVuIGtleWZyYW1lcyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMKKyAgICAgKiBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHZhbHVlcyBhdCB0aG9zZSBrZXlmcmFtZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIHRpbWUsIGV4cHJlc3NlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgcmVwcmVzZW50aW5nIHRoZSBmcmFjdGlvbgorICAgICAqIG9mIHRpbWUgZWxhcHNlZCBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBvYmplY3Qgd2lsbCBhbmltYXRlIHRvIGFzIHRoZSBhbmltYXRpb24gdGltZSBhcHByb2FjaGVzCisgICAgICogdGhlIHRpbWUgaW4gdGhpcyBrZXlmcmFtZSwgYW5kIHRoZSB0aGUgdmFsdWUgYW5pbWF0ZWQgZnJvbSBhcyB0aGUgdGltZSBwYXNzZXMgdGhlIHRpbWUgaW4KKyAgICAgKiB0aGlzIGtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBLZXlmcmFtZShmbG9hdCBmcmFjdGlvbiwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMoZnJhY3Rpb24sIHZhbHVlLCBkb3VibGUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBmb3IgdGhpcyBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbVZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleWZyYW1lLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBvdmVyYWxsIGFuaW1hdGlvbgorICAgICAqIGR1cmF0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0RnJhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtRnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZSBmb3IgdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24gZHVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gdGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXlmcmFtZSwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgb3ZlcmFsbCBhbmltYXRpb24KKyAgICAgKiBkdXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RnJhY3Rpb24oZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgbUZyYWN0aW9uID0gZnJhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLiBBIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRlcworICAgICAqIHRoYXQgdGhlcmUgaXMgbm8gaW50ZXJwb2xhdGlvbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvcHRpb25hbCBpbnRlcnBvbGF0b3IgZm9yIHRoaXMgS2V5ZnJhbWUuCisgICAgICovCisgICAgcHVibGljIEludGVycG9sYXRvciBnZXRJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgIHJldHVybiBtSW50ZXJwb2xhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wdGlvbmFsIGludGVycG9sYXRvciBmb3IgdGhpcyBLZXlmcmFtZS4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IHRoZXJlIGlzIG5vIGludGVycG9sYXRpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGxpbmVhciBpbnRlcnBvbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgb3B0aW9uYWwgaW50ZXJwb2xhdG9yIGZvciB0aGlzIEtleWZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiBrZXlmcmFtZS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IFZhbHVlQW5pbWF0b3IgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mCisgICAgICoge0BsaW5rIFR5cGVFdmFsdWF0b3J9IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHZhbHVlcyBiZXR3ZWVuIGtleWZyYW1lcy4gVGhlIHR5cGUgaXMgYmFzZWQKKyAgICAgKiBvbiB0aGUgdHlwZSBvZiBLZXlmcmFtZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBLZXlmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleWZyYW1lIGNsb25lKCkgeworICAgICAgICBLZXlmcmFtZSBrZkNsb25lID0gbmV3IEtleWZyYW1lKG1GcmFjdGlvbiwgbVZhbHVlLCBtVmFsdWVUeXBlKTsKKyAgICAgICAga2ZDbG9uZS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgIHJldHVybiBrZkNsb25lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0tleWZyYW1lU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0N2ExNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9LZXlmcmFtZVNldC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIEtleWZyYW1lIG9iamVjdHMgYW5kIGlzIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yIHRvIGNhbGN1bGF0ZQorICogdmFsdWVzIGJldHdlZW4gdGhvc2Uga2V5ZnJhbWVzIGZvciBhIGdpdmVuIGFuaW1hdGlvbi4gVGhlIGNsYXNzIGludGVybmFsIHRvIHRoZSBhbmltYXRpb24KKyAqIHBhY2thZ2UgYmVjYXVzZSBpdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgaG93IEtleWZyYW1lcyBhcmUgc3RvcmVkIGFuZCB1c2VkLgorICovCitjbGFzcyBLZXlmcmFtZVNldCB7CisKKyAgICBwcml2YXRlIGludCBtTnVtS2V5ZnJhbWVzOworCisgICAgQXJyYXlMaXN0PEtleWZyYW1lPiBtS2V5ZnJhbWVzOworCisgICAgcHVibGljIEtleWZyYW1lU2V0KEtleWZyYW1lLi4uIGtleWZyYW1lcykgeworICAgICAgICBtS2V5ZnJhbWVzID0gbmV3IEFycmF5TGlzdDxLZXlmcmFtZT4oKTsKKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZXlmcmFtZSA6IGtleWZyYW1lcykgeworICAgICAgICAgICAgbUtleWZyYW1lcy5hZGQoa2V5ZnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1OdW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbmltYXRlZCB2YWx1ZSwgZ2l2ZW4gdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW50ZXJwb2xhdGVkIGJ5IHRoZQorICAgICAqIGFuaW1hdGlvbidzIGludGVycG9sYXRvcikgYW5kIHRoZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgaW4tYmV0d2VlbiB2YWx1ZXMuIFRoaXMKKyAgICAgKiBmdW5jdGlvbiBtYXBzIHRoZSBpbnB1dCBmcmFjdGlvbiB0byB0aGUgYXBwcm9wcmlhdGUga2V5ZnJhbWUgaW50ZXJ2YWwgYW5kIGEgZnJhY3Rpb24KKyAgICAgKiBiZXR3ZWVuIHRoZW0gYW5kIHJldHVybnMgdGhlIGludGVycG9sYXRlZCB2YWx1ZS4gTm90ZSB0aGF0IHRoZSBpbnB1dCBmcmFjdGlvbiBtYXkgZmFsbAorICAgICAqIG91dHNpZGUgdGhlIFswLTFdIGJvdW5kcywgaWYgdGhlIGFuaW1hdGlvbidzIGludGVycG9sYXRvciBtYWRlIHRoYXQgaGFwcGVuIChlLmcuLCBhCisgICAgICogc3ByaW5nIGludGVycG9sYXRpb24gdGhhdCBtaWdodCBzZW5kIHRoZSBmcmFjdGlvbiBwYXN0IDEuMCkuIFdlIGhhbmRsZSB0aGlzIHNpdHVhdGlvbiBieQorICAgICAqIGp1c3QgdXNpbmcgdGhlIHR3byBrZXlmcmFtZXMgYXQgdGhlIGFwcHJvcHJpYXRlIGVuZCB3aGVuIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRob3NlIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uCisgICAgICogQHBhcmFtIGV2YWx1YXRvciBUaGUgdHlwZSBldmFsdWF0b3IgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludGVycG9sYXRlZCB2YWx1ZXMuCisgICAgICogQHJldHVybiBUaGUgYW5pbWF0ZWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShmbG9hdCBmcmFjdGlvbiwgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogc3BlY2lhbC1jYXNlIDIta2V5ZnJhbWUgY29tbW9uIGNhc2UKKworICAgICAgICBpZiAoZnJhY3Rpb24gPD0gMGYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KDApOworICAgICAgICAgICAgZmluYWwgS2V5ZnJhbWUgbmV4dEtleWZyYW1lID0gbUtleWZyYW1lcy5nZXQoMSk7CisgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihmcmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBpbnRlcnZhbEZyYWN0aW9uID0gKGZyYWN0aW9uIC0gcHJldktleWZyYW1lLmdldEZyYWN0aW9uKCkpIC8KKyAgICAgICAgICAgICAgICAobmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkgLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICBuZXh0S2V5ZnJhbWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIHByZXZLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAyKTsKKyAgICAgICAgICAgIGZpbmFsIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KG1OdW1LZXlmcmFtZXMgLSAxKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXh0S2V5ZnJhbWUuZ2V0SW50ZXJwb2xhdG9yKCk7CisgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0IGludGVydmFsRnJhY3Rpb24gPSAoZnJhY3Rpb24gLSBwcmV2S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSkgLworICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoaW50ZXJ2YWxGcmFjdGlvbiwgcHJldktleWZyYW1lLmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIG5leHRLZXlmcmFtZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBwcmV2S2V5ZnJhbWUgPSBtS2V5ZnJhbWVzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIEtleWZyYW1lIG5leHRLZXlmcmFtZSA9IG1LZXlmcmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGZyYWN0aW9uIDwgbmV4dEtleWZyYW1lLmdldEZyYWN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0gbmV4dEtleWZyYW1lLmdldEludGVycG9sYXRvcigpOworICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IGludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJ2YWxGcmFjdGlvbiA9IChmcmFjdGlvbiAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKSAvCisgICAgICAgICAgICAgICAgICAgIChuZXh0S2V5ZnJhbWUuZ2V0RnJhY3Rpb24oKSAtIHByZXZLZXlmcmFtZS5nZXRGcmFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmV2YWx1YXRlKGludGVydmFsRnJhY3Rpb24sIHByZXZLZXlmcmFtZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEtleWZyYW1lLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldktleWZyYW1lID0gbmV4dEtleWZyYW1lOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICByZXR1cm4gbUtleWZyYW1lcy5nZXQobU51bUtleWZyYW1lcyAtIDEpLmdldFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0xheW91dFRyYW5zaXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9MYXlvdXRUcmFuc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhZDY3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9MYXlvdXRUcmFuc2l0aW9uLmphdmEKQEAgLTAsMCArMSw3ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbmFibGVzIGF1dG9tYXRpYyBhbmltYXRpb25zIG9uIGxheW91dCBjaGFuZ2VzIGluIFZpZXdHcm91cCBvYmplY3RzLiBUbyBlbmFibGUKKyAqIHRyYW5zaXRpb25zIGZvciBhIGxheW91dCBjb250YWluZXIsIGNyZWF0ZSBhIExheW91dFRyYW5zaXRpb24gb2JqZWN0IGFuZCBzZXQgaXQgb24gYW55CisgKiBWaWV3R3JvdXAgYnkgY2FsbGluZyB7QGxpbmsgVmlld0dyb3VwI3NldExheW91dFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbil9LiBUaGlzIHdpbGwgY2F1c2UKKyAqIGRlZmF1bHQgYW5pbWF0aW9ucyB0byBydW4gd2hlbmV2ZXIgaXRlbXMgYXJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGF0IGNvbnRhaW5lci4gVG8gc3BlY2lmeQorICogY3VzdG9tIGFuaW1hdGlvbnMsIHVzZSB0aGUge0BsaW5rIExheW91dFRyYW5zaXRpb24jc2V0QW5pbWF0b3IoaW50LCBBbmltYXRvcikKKyAqIHNldEFuaW1hdG9yKCl9IG1ldGhvZC4KKyAqCisgKiA8cD5PbmUgb2YgdGhlIGNvcmUgY29uY2VwdHMgb2YgdGhlc2UgdHJhbnNpdGlvbiBhbmltYXRpb25zIGlzIHRoYXQgdGhlcmUgYXJlIHR3byBjb3JlCisgKiBjaGFuZ2VzIHRoYXQgY2F1c2UgdGhlIHRyYW5zaXRpb24gYW5kIGZvdXIgZGlmZmVyZW50IGFuaW1hdGlvbnMgdGhhdCBydW4gYmVjYXVzZSBvZgorICogdGhvc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgdGhhdCB0cmlnZ2VyIHRoZSB0cmFuc2l0aW9uIGFyZSBpdGVtcyBiZWluZyBhZGRlZCB0byBhIGNvbnRhaW5lcgorICogKHJlZmVycmVkIHRvIGFzIGFuICJhcHBlYXJpbmciIHRyYW5zaXRpb24pIG9yIHJlbW92ZWQgZnJvbSBhIGNvbnRhaW5lciAoYWxzbyBrbm93biBhcworICogImRpc2FwcGVhcmluZyIpLiBUaGUgYW5pbWF0aW9ucyB0aGF0IHJ1biBkdWUgdG8gdGhvc2UgZXZlbnRzIGFyZSBvbmUgdGhhdCBhbmltYXRlcworICogaXRlbXMgYmVpbmcgYWRkZWQsIG9uZSB0aGF0IGFuaW1hdGVzIGl0ZW1zIGJlaW5nIHJlbW92ZWQsIGFuZCB0d28gdGhhdCBhbmltYXRlIHRoZSBvdGhlcgorICogaXRlbXMgaW4gdGhlIGNvbnRhaW5lciB0aGF0IGNoYW5nZSBkdWUgdG8gdGhlIGFkZC9yZW1vdmUgb2NjdXJyZW5jZS4gVXNlcnMgb2YKKyAqIHRoZSB0cmFuc2l0aW9uIG1heSB3YW50IGRpZmZlcmVudCBhbmltYXRpb25zIGZvciB0aGUgY2hhbmdpbmcgaXRlbXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIHRoZXkgYXJlIGNoYW5naW5nIGR1ZSB0byBhbmFwcGVhcmluZyBvciBkaXNhcHBlYXJpbmcgZXZlbnQsIHNvIHRoZXJlIGlzIG9uZSBhbmltYXRpb24gZm9yCisgKiBlYWNoIG9mIHRoZXNlIHZhcmlhdGlvbnMgb2YgdGhlIGNoYW5naW5nIGV2ZW50LiBNb3N0IG9mIHRoZSBBUEkgb2YgdGhpcyBjbGFzcyBpcyBjb25jZXJuZWQKKyAqIHdpdGggc2V0dGluZyB1cCB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUgYW5pbWF0aW9ucyB1c2VkIGluIHRoZXNlIGZvdXIgc2l0dWF0aW9ucywKKyAqIG9yIHdpdGggc2V0dGluZyB1cCBjdXN0b20gYW5pbWF0aW9ucyBmb3IgYW55IG9yIGFsbCBvZiB0aGUgZm91ci48L3A+CisgKgorICogPHA+VGhlIGFuaW1hdGlvbnMgc3BlY2lmaWVkIGZvciB0aGUgdHJhbnNpdGlvbiwgYm90aCB0aGUgZGVmYXVsdHMgYW5kIGFueSBjdXN0b20gYW5pbWF0aW9ucworICogc2V0IG9uIHRoZSB0cmFuc2l0aW9uIG9iamVjdCwgYXJlIHRlbXBsYXRlcyBvbmx5LiBUaGF0IGlzLCB0aGVzZSBhbmltYXRpb25zIGV4aXN0IHRvIGhvbGQgdGhlCisgKiBiYXNpYyBhbmltYXRpb24gcHJvcGVydGllcywgc3VjaCBhcyB0aGUgZHVyYXRpb24sIHN0YXJ0IGRlbGF5LCBhbmQgcHJvcGVydGllcyBiZWluZyBhbmltYXRlZC4KKyAqIEJ1dCB0aGUgYWN0dWFsIHRhcmdldCBvYmplY3QsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGZvciB0aG9zZSBwcm9wZXJ0aWVzLCBhcmUKKyAqIHNldCBhdXRvbWF0aWNhbGx5IGluIHRoZSBwcm9jZXNzIG9mIHNldHRpbmcgdXAgdGhlIHRyYW5zaXRpb24gZWFjaCB0aW1lIGl0IHJ1bnMuIEVhY2ggb2YgdGhlCisgKiBhbmltYXRpb25zIGlzIGNsb25lZCBmcm9tIHRoZSBvcmlnaW5hbCBjb3B5IGFuZCB0aGUgY2xvbmUgaXMgdGhlbiBwb3B1bGF0ZWQgd2l0aCB0aGUgZHluYW1pYworICogdmFsdWVzIG9mIHRoZSB0YXJnZXQgYmVpbmcgYW5pbWF0ZWQgKHN1Y2ggYXMgb25lIG9mIHRoZSBpdGVtcyBpbiBhIGxheW91dCBjb250YWluZXIgdGhhdCBpcworICogbW92aW5nIGFzIGEgcmVzdWx0IG9mIHRoZSBsYXlvdXQgZXZlbnQpIGFzIHdlbGwgYXMgdGhlIHZhbHVlcyB0aGF0IGFyZSBjaGFuZ2luZyAoc3VjaCBhcyB0aGUKKyAqIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoYXQgb2JqZWN0KS4gVGhlIGFjdHVhbCB2YWx1ZXMgdGhhdCBhcmUgcHVzaGVkIHRvIGVhY2ggYW5pbWF0aW9uCisgKiBkZXBlbmRzIG9uIHdoYXQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciB0aGUgYW5pbWF0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQKKyAqIENIQU5HRV9BUFBFQVJJTkcgYW5pbWF0aW9uIGFuaW1hdGVzIDxjb2RlPmxlZnQ8L2NvZGU+LCA8Y29kZT50b3A8L2NvZGU+LCA8Y29kZT5yaWdodDwvY29kZT4sCisgKiBhbmQgPGNvZGU+Ym90dG9tPC9jb2RlPi4gVmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB1cGRhdGVkIHdpdGggdGhlIHByZS0gYW5kIHBvc3QtbGF5b3V0CisgKiB2YWx1ZXMgd2hlbiB0aGUgdHJhbnNpdGlvbiBiZWdpbnMuIEN1c3RvbSBhbmltYXRpb25zIHdpbGwgYmUgc2ltaWxhcmx5IHBvcHVsYXRlZCB3aXRoCisgKiB0aGUgdGFyZ2V0IGFuZCB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQsIGFzc3VtaW5nIHRoZXkgdXNlIE9iamVjdEFuaW1hdG9yIG9iamVjdHMgd2l0aAorICogcHJvcGVydHkgbmFtZXMgdGhhdCBhcmUga25vd24gb24gdGhlIHRhcmdldCBvYmplY3QuPC9wPgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VHJhbnNpdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBBIGZsYWcgaW5kaWNhdGluZyB0aGUgYW5pbWF0aW9uIHRoYXQgcnVucyBvbiB0aG9zZSBpdGVtcyB0aGF0IGFyZSBjaGFuZ2luZworICAgICAqIGR1ZSB0byBhIG5ldyBpdGVtIGFwcGVhcmluZyBpbiB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9BUFBFQVJJTkcgPSAwOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9ESVNBUFBFQVJJTkcgPSAxOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBhcHBlYXJpbmcgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBFQVJJTkcgPSAyOworCisgICAgLyoqCisgICAgICogQSBmbGFnIGluZGljYXRpbmcgdGhlIGFuaW1hdGlvbiB0aGF0IHJ1bnMgb24gdGhvc2UgaXRlbXMgdGhhdCBhcmUgY2hhbmdpbmcKKyAgICAgKiBkdWUgdG8gYSBuZXcgaXRlbSBhcHBlYXJpbmcgaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNBUFBFQVJJTkcgPSAzOworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGhvbGQgdGhlIGFuaW1hdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHVzZWQgdG8gcnVuIHRoZSB0cmFuc2l0aW9uIGVmZmVjdHMuCisgICAgICogVGhlc2UgYW5pbWF0aW9ucyBhcmUgc2V0IHRvIGRlZmF1bHRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdG8gY3VzdG9tIGFuaW1hdGlvbnMgYnkKKyAgICAgKiBjYWxscyB0byBzZXRBbmltYXRvcigpLgorICAgICAqLworICAgIHByaXZhdGUgQW5pbWF0b3IgbURpc2FwcGVhcmluZ0FuaW0gPSBudWxsOworICAgIHByaXZhdGUgQW5pbWF0b3IgbUFwcGVhcmluZ0FuaW0gPSBudWxsOworICAgIHByaXZhdGUgQW5pbWF0b3IgbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IG51bGw7CisgICAgcHJpdmF0ZSBBbmltYXRvciBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdBbmltID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBhbmltYXRpb25zLCBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB1bmxlc3MgdGhlIHVzZXIgc3BlY2lmaWVzIGN1c3RvbSBhbmltYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRDaGFuZ2VJbjsKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RBbmltYXRvciBkZWZhdWx0Q2hhbmdlT3V0OworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEFuaW1hdG9yIGRlZmF1bHRGYWRlSW47CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0QW5pbWF0b3IgZGVmYXVsdEZhZGVPdXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkdXJhdGlvbiB1c2VkIGJ5IGFsbCBhbmltYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgREVGQVVMVF9EVVJBVElPTiA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkdXJhdGlvbnMgb2YgdGhlIGZvdXIgZGlmZmVyZW50IGFuaW1hdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbUNoYW5naW5nQXBwZWFyaW5nRHVyYXRpb24gPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1BcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisgICAgcHJpdmF0ZSBsb25nIG1EaXNhcHBlYXJpbmdEdXJhdGlvbiA9IERFRkFVTFRfRFVSQVRJT047CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnQgZGVsYXlzIG9mIHRoZSBmb3VyIGRpZmZlcmVudCBhbmltYXRpb25zLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YKKyAgICAgKiB0aGUgYXBwZWFyaW5nIGl0ZW0gaXMgdGhlIGRlZmF1bHQgZHVyYXRpb24sIHNpbmNlIGl0IHNob3VsZCB3YWl0IGZvciB0aGUgaXRlbXMgdG8gbW92ZQorICAgICAqIGJlZm9yZSBmYWRpbmcgaXQuIFNhbWUgZm9yIHRoZSBjaGFuZ2luZyBhbmltYXRpb24gd2hlbiBkaXNhcHBlYXJpbmc7IGl0IHdhaXRzIGZvciB0aGUgaXRlbQorICAgICAqIHRvIGZhZGUgb3V0IGJlZm9yZSBtb3ZpbmcgdGhlIG90aGVyIGl0ZW1zLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBtQXBwZWFyaW5nRGVsYXkgPSBERUZBVUxUX0RVUkFUSU9OOworICAgIHByaXZhdGUgbG9uZyBtRGlzYXBwZWFyaW5nRGVsYXkgPSAwOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdBcHBlYXJpbmdEZWxheSA9IDA7CisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0RlbGF5ID0gREVGQVVMVF9EVVJBVElPTjsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlci1hbmltYXRpb24gZGVsYXlzIHVzZWQgb24gdGhlIHR3byBjaGFuZ2luZyBhbmltYXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1DaGFuZ2luZ0FwcGVhcmluZ1N0YWdnZXIgPSAwOworICAgIHByaXZhdGUgbG9uZyBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGludGVycG9sYXRvcnMgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbURpc2FwcGVhcmluZ0ludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1DaGFuZ2luZ0FwcGVhcmluZ0ludGVycG9sYXRvciA9IG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaGFzaG1hcCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBhbmltYXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nIGFzIHBhcnQgb2YKKyAgICAgKiB0aGUgdHJhbnNpdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGEgZnVydGhlciBsYXlvdXQgZXZlbnQgc2hvdWxkIGNhdXNlCisgICAgICogZXhpc3RpbmcgYW5pbWF0aW9ucyB0byBzdG9wIHdoZXJlIHRoZXkgYXJlIHByaW9yIHRvIHN0YXJ0aW5nIG5ldyBhbmltYXRpb25zLiBTbworICAgICAqIHdlIGNhY2hlIGFsbCBvZiB0aGUgY3VycmVudCBhbmltYXRpb25zIGluIHRoaXMgbWFwIGZvciBwb3NzaWJsZSBjYW5jZWxsYXRpb24gb24KKyAgICAgKiBhbm90aGVyIGxheW91dCBldmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8VmlldywgQW5pbWF0b3I+IGN1cnJlbnRBbmltYXRpb25zID0gbmV3IEhhc2hNYXA8VmlldywgQW5pbWF0b3I+KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhhc2htYXAgaXMgdXNlZCB0byB0cmFjayB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjaGlsZHJlbiBvZgorICAgICAqIGEgY29udGFpbmVyLiBXaGVuIGEgbGF5b3V0IGNoYW5nZSBvY2N1cnMsIGFuIGFuaW1hdGlvbiBpcyBjcmVhdGVkIGZvciBlYWNoIFZpZXcsIHNvIHRoYXQKKyAgICAgKiB0aGUgcHJlLWxheW91dCB2YWx1ZXMgY2FuIGJlIGNhY2hlZCBpbiB0aGF0IGFuaW1hdGlvbi4gVGhlbiBhIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZQorICAgICAqIHZpZXcgdG8gc2VlIHdoZXRoZXIgdGhlIGxheW91dCBjaGFuZ2VzIHRoZSBib3VuZHMgb2YgdGhhdCB2aWV3LiBJZiBzbywgdGhlIGFuaW1hdGlvbgorICAgICAqIGlzIHNldCB3aXRoIHRoZSBmaW5hbCB2YWx1ZXMgYW5kIHRoZW4gcnVuLiBJZiBub3QsIHRoZSBhbmltYXRpb24gaXMgbm90IHN0YXJ0ZWQuIFdoZW4KKyAgICAgKiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIGFsbCBhcHByb3ByaWF0ZSBhbmltYXRpb25zIGlzIGRvbmUsIHdlIG5lZWQgdG8KKyAgICAgKiByZW1vdmUgdGhlc2UgbGlzdGVuZXJzIGFuZCBjbGVhciBvdXQgdGhlIG1hcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8VmlldywgVmlldy5PbkxheW91dENoYW5nZUxpc3RlbmVyPiBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxWaWV3LCBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+KCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHRyYWNrIHRoZSBjdXJyZW50IGRlbGF5IGJlaW5nIGFzc2lnbmVkIHRvIHN1Y2Nlc3NpdmUgYW5pbWF0aW9ucyBhcyB0aGV5IGFyZQorICAgICAqIHN0YXJ0ZWQuIFRoaXMgdmFsdWUgaXMgaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IGFuaW1hdGlvbiwgdGhlbiB6ZXJvZWQgYmVmb3JlIHRoZSBuZXh0CisgICAgICogdHJhbnNpdGlvbiBiZWdpbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHN0YWdnZXJEZWxheTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gQVBQRUFSSU5HL0RJU0FQUEVBUklORyB0cmFuc2l0aW9ucworICAgICAqIHN0YXJ0IGFuZCBlbmQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VHJhbnNpdGlvbkxpc3RlbmVyPiBtTGlzdGVuZXJzOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoZSBvYmplY3Qgd2lsbCBsaXN0ZW4gdG8gbGF5b3V0CisgICAgICogZXZlbnRzIG9uIGFueSBWaWV3R3JvdXAgdGhhdCBpdCBpcyBzZXQgb24gYW5kIHdpbGwgcnVuIGRlZmF1bHQgYW5pbWF0aW9ucyBmb3IgZWFjaAorICAgICAqIHR5cGUgb2YgbGF5b3V0IGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMYXlvdXRUcmFuc2l0aW9uKCkgeworICAgICAgICBpZiAoZGVmYXVsdENoYW5nZUluID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vICJsZWZ0IiBpcyBqdXN0IGEgcGxhY2Vob2xkZXI7IHdlJ2xsIHB1dCByZWFsIHByb3BlcnRpZXMvdmFsdWVzIGluIHdoZW4gbmVlZGVkCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhMZWZ0ID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEludGVnZXI+KCJsZWZ0IiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhUb3AgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oInRvcCIsIDAsIDEpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4gcHZoUmlnaHQgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oInJpZ2h0IiwgMCwgMSk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxJbnRlZ2VyPiBwdmhCb3R0b20gPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8SW50ZWdlcj4oImJvdHRvbSIsIDAsIDEpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluID0gbmV3IE9iamVjdEFuaW1hdG9yPFByb3BlcnR5VmFsdWVzSG9sZGVyPihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBwdmhMZWZ0LCBwdmhUb3AsIHB2aFJpZ2h0LCBwdmhCb3R0b20pOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluLnNldFN0YXJ0RGVsYXkobUNoYW5naW5nQXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZUluLnNldEludGVycG9sYXRvcihtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dCA9IGRlZmF1bHRDaGFuZ2VJbi5jbG9uZSgpOworICAgICAgICAgICAgZGVmYXVsdENoYW5nZU91dC5zZXRTdGFydERlbGF5KG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgICAgIGRlZmF1bHRDaGFuZ2VPdXQuc2V0SW50ZXJwb2xhdG9yKG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0ludGVycG9sYXRvcik7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLCAiYWxwaGEiLCAwZiwgMWYpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVJbi5zZXRTdGFydERlbGF5KG1BcHBlYXJpbmdEZWxheSk7CisgICAgICAgICAgICBkZWZhdWx0RmFkZUluLnNldEludGVycG9sYXRvcihtQXBwZWFyaW5nSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgICAgIGRlZmF1bHRGYWRlT3V0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0RVUkFUSU9OLCB0aGlzLCAiYWxwaGEiLCAxZiwgMGYpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQuc2V0U3RhcnREZWxheShtRGlzYXBwZWFyaW5nRGVsYXkpOworICAgICAgICAgICAgZGVmYXVsdEZhZGVPdXQuc2V0SW50ZXJwb2xhdG9yKG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IpOworICAgICAgICB9CisgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdlSW47CisgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPSBkZWZhdWx0Q2hhbmdlT3V0OworICAgICAgICBtQXBwZWFyaW5nQW5pbSA9IGRlZmF1bHRGYWRlSW47CisgICAgICAgIG1EaXNhcHBlYXJpbmdBbmltID0gZGVmYXVsdEZhZGVPdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZHVyYXRpb24gdG8gYmUgdXNlZCBieSBhbGwgYW5pbWF0aW9ucyBvZiB0aGlzIHRyYW5zaXRpb24gb2JqZWN0LiBJZiB5b3Ugd2FudCB0bworICAgICAqIHNldCB0aGUgZHVyYXRpb24gb2YganVzdCBvbmUgb2YgdGhlIGFuaW1hdGlvbnMgaW4gcGFydGljdWxhciwgdXNlIHRoZQorICAgICAqIHtAbGluayAjc2V0RHVyYXRpb24oaW50LCBsb25nKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCB0aGF0IHRoZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMKKyAgICAgKiBzaG91bGQgbGFzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIG1BcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICBtRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdGFydCBkZWxheSBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydCBkZWxheQorICAgICAqIGlzIGJlaW5nIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlIHN0YXJ0CisgICAgICogZGVsYXkgaXMgYmVpbmcgc2V0LgorICAgICAqIEBwYXJhbSBkZWxheSBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhbmltYXRpb24uCisgICAgICogQHNlZSBBbmltYXRvciNzZXRTdGFydERlbGF5KGxvbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnREZWxheShpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZGVsYXkpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRGVsYXkgPSBkZWxheTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1BcHBlYXJpbmdEZWxheSA9IGRlbGF5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0RlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzdGFydCBkZWxheSBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBzdGFydCBkZWxheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2Ugc3RhcnQKKyAgICAgKiBkZWxheSBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIHN0YXJ0IGRlbGF5IG9mIHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uLgorICAgICAqIEBzZWUgQW5pbWF0b3IjZ2V0U3RhcnREZWxheSgpCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U3RhcnREZWxheShpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkdXJhdGlvbiBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBkdXJhdGlvbgorICAgICAqIGlzIGJlaW5nIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBvbmUgb2Yge0BsaW5rICNDSEFOR0VfQVBQRUFSSU5HfSwge0BsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfSwKKyAgICAgKiB7QGxpbmsgI0FQUEVBUklOR30sIG9yIHtAbGluayAjRElTQVBQRUFSSU5HfSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYW5pbWF0aW9uIHdob3NlCisgICAgICogZHVyYXRpb24gaXMgYmVpbmcgc2V0LgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdGhhdCB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiBzaG91bGQgcnVuLgorICAgICAqIEBzZWUgQW5pbWF0b3Ijc2V0RHVyYXRpb24obG9uZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1BcHBlYXJpbmdEdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbURpc2FwcGVhcmluZ0R1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvbiBvbmUgb2YgdGhlIGFuaW1hdGlvbiBvYmplY3RzIHVzZWQgYnkgdGhpcyB0cmFuc2l0aW9uLiBUaGUKKyAgICAgKiA8Y29kZT50cmFuc2l0aW9uVHlwZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZSBkdXJhdGlvbgorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIGR1cmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYW5pbWF0aW9uLgorICAgICAqIEBzZWUgQW5pbWF0b3IjZ2V0RHVyYXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldER1cmF0aW9uKGludCB0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICBjYXNlIERJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbURpc2FwcGVhcmluZ0R1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIGRlbGF5IGJldHdlZW4gc3RhcnRpbmcgZWFjaCBhbmltYXRpb24gZHVyaW5nIG9uZSBvZiB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uVHlwZSBBIHZhbHVlIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30gb3IgQGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgYmVmb3JlIGxhdW5jaGluZyB0aGUgbmV4dAorICAgICAqIGFuaW1hdGlvbiBpbiB0aGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhZ2dlcihpbnQgdHJhbnNpdGlvblR5cGUsIGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0FwcGVhcmluZ1N0YWdnZXIgPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBub29wIG90aGVyIGNhc2VzCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXRzIHRoZSBsZW5ndGggb2YgdGltZSB0byBkZWxheSBiZXR3ZWVuIHN0YXJ0aW5nIGVhY2ggYW5pbWF0aW9uIGR1cmluZyBvbmUgb2YgdGhlCisgICAgICogQ0hBTkdFIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgQSB2YWx1ZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9IG9yIEBsaW5rICNDSEFOR0VfRElTQVBQRUFSSU5HfS4KKyAgICAgKiBAcmV0dXJuIGxvbmcgVGhlIGxlbmd0aCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IGJlZm9yZSBsYXVuY2hpbmcgdGhlIG5leHQKKyAgICAgKiBhbmltYXRpb24gaW4gdGhlIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN0YWdnZXIoaW50IHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nQXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nU3RhZ2dlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbnRlcnBvbGF0b3Igb24gb25lIG9mIHRoZSBhbmltYXRpb24gb2JqZWN0cyB1c2VkIGJ5IHRoaXMgdHJhbnNpdGlvbi4gVGhlCisgICAgICogPGNvZGU+dHJhbnNpdGlvblR5cGU8L2NvZGU+IHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UgaW50ZXJwb2xhdG9yCisgICAgICogaXMgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHRoYXQgdGhlIHNwZWNpZmllZCBhbmltYXRpb24gc2hvdWxkIHVzZS4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnBvbGF0b3IoaW50IHRyYW5zaXRpb25UeXBlLCBJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUFwcGVhcmluZ0ludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbnRlcnBvbGF0b3Igb24gb25lIG9mIHRoZSBhbmltYXRpb24gb2JqZWN0cyB1c2VkIGJ5IHRoaXMgdHJhbnNpdGlvbi4gVGhlCisgICAgICogPGNvZGU+dHJhbnNpdGlvblR5cGU8L2NvZGU+IHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UgaW50ZXJwb2xhdG9yCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgb25lIG9mIHtAbGluayAjQ0hBTkdFX0FQUEVBUklOR30sIHtAbGluayAjQ0hBTkdFX0RJU0FQUEVBUklOR30sCisgICAgICoge0BsaW5rICNBUFBFQVJJTkd9LCBvciB7QGxpbmsgI0RJU0FQUEVBUklOR30sIHdoaWNoIGRldGVybWluZXMgdGhlIGFuaW1hdGlvbiB3aG9zZQorICAgICAqIGR1cmF0aW9uIGlzIGJlaW5nIHNldC4KKyAgICAgKiBAcmV0dXJuIEludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHRoYXQgdGhlIHNwZWNpZmllZCBhbmltYXRpb24gdXNlcy4KKyAgICAgKiBAc2VlIEFuaW1hdG9yI3NldEludGVycG9sYXRvcihhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJwb2xhdG9yIGdldEludGVycG9sYXRvcihpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0cmFuc2l0aW9uVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDSEFOR0VfQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQ2hhbmdpbmdBcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9ESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0ludGVycG9sYXRvcjsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nSW50ZXJwb2xhdG9yOworICAgICAgICAgICAgY2FzZSBESVNBUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EaXNhcHBlYXJpbmdJbnRlcnBvbGF0b3I7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW5pbWF0aW9uIHVzZWQgZHVyaW5nIG9uZSBvZiB0aGUgdHJhbnNpdGlvbiB0eXBlcyB0aGF0IG1heSBydW4uIEFueQorICAgICAqIEFuaW1hdG9yIG9iamVjdCBjYW4gYmUgdXNlZCwgYnV0IHRvIGJlIG1vc3QgdXNlZnVsIGluIHRoZSBjb250ZXh0IG9mIGxheW91dAorICAgICAqIHRyYW5zaXRpb25zLCB0aGUgYW5pbWF0aW9uIHNob3VsZCBlaXRoZXIgYmUgYSBPYmplY3RBbmltYXRvciBvciBhIEFuaW1hdG9yU2V0CisgICAgICogb2YgYW5pbWF0aW9ucyBpbmNsdWRpbmcgUHJvcGVydHlBbmltYXRvcnMuIEFsc28sIHRoZXNlIE9iamVjdEFuaW1hdG9yIG9iamVjdHMKKyAgICAgKiBzaG91bGQgYmUgYWJsZSB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb24gdGhlaXIgdGFyZ2V0IG9iamVjdHMgYXV0b21hdGljYWxseS4gRm9yCisgICAgICogZXhhbXBsZSwgYSBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIHRoZSBwcm9wZXJ0eSAibGVmdCIgaXMgYWJsZSB0byBzZXQgYW5kIGdldCB0aGUKKyAgICAgKiA8Y29kZT5sZWZ0PC9jb2RlPiBwcm9wZXJ0eSBmcm9tIHRoZSBWaWV3IG9iamVjdHMgYmVpbmcgYW5pbWF0ZWQgYnkgdGhlIGxheW91dAorICAgICAqIHRyYW5zaXRpb24uIFRoZSB0cmFuc2l0aW9uIHdvcmtzIGJ5IHNldHRpbmcgdGFyZ2V0IG9iamVjdHMgYW5kIHByb3BlcnRpZXMKKyAgICAgKiBkeW5hbWljYWxseSwgYWNjb3JkaW5nIHRvIHRoZSBwcmUtIGFuZCBwb3N0LWxheW9vdXQgdmFsdWVzIG9mIHRob3NlIG9iamVjdHMsIHNvCisgICAgICogaGF2aW5nIGFuaW1hdGlvbnMgdGhhdCBjYW4gaGFuZGxlIHRob3NlIHByb3BlcnRpZXMgYXBwcm9wcmlhdGVseSB3aWxsIHdvcmsgYmVzdAorICAgICAqIGZvciBjdXN0b20gYW5pbWF0aW9uLiBUaGUgZHluYW1pYyBzZXR0aW5nIG9mIHZhbHVlcyBpcyBvbmx5IHRoZSBjYXNlIGZvciB0aGUKKyAgICAgKiBDSEFOR0UgYW5pbWF0aW9uczsgdGhlIEFQUEVBUklORyBhbmQgRElTQVBQRUFSSU5HIGFuaW1hdGlvbnMgYXJlIHNpbXBseSBydW4gd2l0aAorICAgICAqIHRoZSB2YWx1ZXMgdGhleSBoYXZlLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCBhbnkgYW5kIGFsbCBhbmltYXRpb25zIChhbmQgdGhlaXIgdW5kZXJseWluZworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMpIHdpbGwgaGF2ZSB0aGVpciBzdGFydCBhbmQgZW5kIHZhbHVlcyBzZXQgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIHByZS0gYW5kIHBvc3QtbGF5b3V0IHZhbHVlcy4gU28sIGZvciBleGFtcGxlLCBhIGN1c3RvbSBhbmltYXRpb24gb24gImFscGhhIgorICAgICAqIGFzIHRoZSBDSEFOR0VfQVBQRUFSSU5HIGFuaW1hdGlvbiB3aWxsIGluaGVyaXQgdGhlIHJlYWwgdmFsdWUgb2YgYWxwaGEgb24gdGhlIHRhcmdldAorICAgICAqIG9iamVjdCAocHJlc3VtYWJseSAxKSBhcyBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyB2YWx1ZSB3aGVuIHRoZSBhbmltYXRpb24gYmVnaW5zLgorICAgICAqIEFuaW1hdGlvbnMgd2hpY2ggbmVlZCB0byB1c2UgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCB0aGF0IG1heSBub3QgbWF0Y2ggdGhlCisgICAgICogdmFsdWVzIHF1ZXJpZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBiZWdpbnMgbWF5IG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IG1lY2hhbmlzbQorICAgICAqIHRoYW4gYSBzdGFuZGFyZCBPYmplY3RBbmltYXRvciBvYmplY3QuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIGFuaW1hdG9yIFRoZSBhbmltYXRpb24gYmVpbmcgYXNzaWduZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0b3IoaW50IHRyYW5zaXRpb25UeXBlLCBBbmltYXRvciBhbmltYXRvcikgeworICAgICAgICBzd2l0Y2ggKHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgICAgICBjYXNlIENIQU5HRV9BUFBFQVJJTkc6CisgICAgICAgICAgICAgICAgbUNoYW5naW5nQXBwZWFyaW5nQW5pbSA9IChhbmltYXRvciAhPSBudWxsKSA/IGFuaW1hdG9yIDogZGVmYXVsdENoYW5nZUluOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDSEFOR0VfRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0FuaW0gPSAoYW5pbWF0b3IgIT0gbnVsbCkgPyBhbmltYXRvciA6IGRlZmF1bHRDaGFuZ2VPdXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFQUEVBUklORzoKKyAgICAgICAgICAgICAgICBtQXBwZWFyaW5nQW5pbSA9IChhbmltYXRvciAhPSBudWxsKSA/IGFuaW1hdG9yIDogZGVmYXVsdEZhZGVJbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdBbmltID0gKGFuaW1hdG9yICE9IG51bGwpID8gYW5pbWF0b3IgOiBkZWZhdWx0RmFkZU91dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFuaW1hdGlvbiB1c2VkIGR1cmluZyBvbmUgb2YgdGhlIHRyYW5zaXRpb24gdHlwZXMgdGhhdCBtYXkgcnVuLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIG9uZSBvZiB7QGxpbmsgI0NIQU5HRV9BUFBFQVJJTkd9LCB7QGxpbmsgI0NIQU5HRV9ESVNBUFBFQVJJTkd9LAorICAgICAqIHtAbGluayAjQVBQRUFSSU5HfSwgb3Ige0BsaW5rICNESVNBUFBFQVJJTkd9LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbmltYXRpb24gd2hvc2UKKyAgICAgKiBkdXJhdGlvbiBpcyBiZWluZyBzZXQuCisgICAgICogQHJldHVybiBBbmltYXRvciBUaGUgYW5pbWF0aW9uIGJlaW5nIHVzZWQgZm9yIHRoZSBnaXZlbiB0cmFuc2l0aW9uIHR5cGUuCisgICAgICogQHNlZSAjc2V0QW5pbWF0b3IoaW50LCBBbmltYXRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0b3IgZ2V0QW5pbWF0b3IoaW50IHRyYW5zaXRpb25UeXBlKSB7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nQXBwZWFyaW5nQW5pbTsKKyAgICAgICAgICAgIGNhc2UgQ0hBTkdFX0RJU0FQUEVBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbTsKKyAgICAgICAgICAgIGNhc2UgQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtQXBwZWFyaW5nQW5pbTsKKyAgICAgICAgICAgIGNhc2UgRElTQVBQRUFSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBtRGlzYXBwZWFyaW5nQW5pbTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGRuJ3QgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgcnVucyBhbmltYXRpb25zIG9uIGFsbCBvZiB0aGUgdmlld3MgdGhhdCBjaGFuZ2UgZHVyaW5nIGxheW91dC4KKyAgICAgKiBGb3IgZXZlcnkgY2hpbGQgaW4gdGhlIHBhcmVudCwgd2UgY3JlYXRlIGEgY2hhbmdlIGFuaW1hdGlvbiBvZiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgKiB0eXBlIChhcHBlYXJpbmcgb3IgZGlzYXBwZWFyaW5nKSBhbmQgYXNrIGl0IHRvIHBvcHVsYXRlIGl0cyBzdGFydCB2YWx1ZXMgZnJvbSBpdHMKKyAgICAgKiB0YXJnZXQgdmlldy4gV2UgYWRkIGxheW91dCBsaXN0ZW5lcnMgdG8gYWxsIGNoaWxkIHZpZXdzIGFuZCBsaXN0ZW4gZm9yIGNoYW5nZXMuIEZvcgorICAgICAqIHRob3NlIHZpZXdzIHRoYXQgY2hhbmdlLCB3ZSBwb3B1bGF0ZSB0aGUgZW5kIHZhbHVlcyBmb3IgdGhvc2UgYW5pbWF0aW9ucyBhbmQgc3RhcnQgdGhlbS4KKyAgICAgKiBBbmltYXRpb25zIGFyZSBub3QgcnVuIG9uIHVuY2hhbmdpbmcgdmlld3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBjb250YWluZXIgd2hpY2ggaXMgdW5kZXJnb2luZyBhbiBhcHBlYXJpbmcgb3IgZGlzYXBwZWFyaW5nIGNoYW5nZS4KKyAgICAgKiBAcGFyYW0gbmV3VmlldyBUaGUgdmlldyBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhlIHBhcmVudC4KKyAgICAgKiBAcGFyYW0gY2hhbmdlUmVhc29uIEEgdmFsdWUgb2YgQVBQRUFSSU5HIG9yIERJU0FQUEVBUklORywgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICAgICAqIHRyYW5zaXRpb24gaXMgb2NjdXJpbmcgYmVjYXVzZSBhbiBpdGVtIGlzIGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBydW5DaGFuZ2VUcmFuc2l0aW9uKGZpbmFsIFZpZXdHcm91cCBwYXJlbnQsIFZpZXcgbmV3VmlldywgZmluYWwgaW50IGNoYW5nZVJlYXNvbikgeworICAgICAgICAvLyByZXNldCB0aGUgaW50ZXItYW5pbWF0aW9uIGRlbGF5LCBpbiBjYXNlIHdlIHVzZSBpdCBsYXRlcgorICAgICAgICBzdGFnZ2VyRGVsYXkgPSAwOworCisgICAgICAgIGZpbmFsIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBwYXJlbnQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOyAvLyB1c2VkIGZvciBsYXRlciBjbGVhbnVwCisgICAgICAgIGlmICghb2JzZXJ2ZXIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgb2JzZXJ2ZXIncyBub3QgaW4gYSBnb29kIHN0YXRlLCBza2lwIHRoZSB0cmFuc2l0aW9uCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IG51bUNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyArK2kpIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgLy8gb25seSBhbmltYXRlIHRoZSB2aWV3cyBub3QgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZAorICAgICAgICAgICAgaWYgKGNoaWxkICE9IG5ld1ZpZXcpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYW5pbWF0aW9uIHJ1bm5pbmcgb24gdGhpcyB2aWV3IGFscmVhZHksIGNhbmNlbCBpdAorICAgICAgICAgICAgICAgIEFuaW1hdG9yIGN1cnJlbnRBbmltYXRpb24gPSBjdXJyZW50QW5pbWF0aW9ucy5nZXQoY2hpbGQpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QW5pbWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGlvbnMucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgYXBwcm9wcmlhdGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgZmluYWwgQW5pbWF0b3IgYW5pbSA9IChjaGFuZ2VSZWFzb24gPT0gQVBQRUFSSU5HKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdpbmdBcHBlYXJpbmdBbmltLmNsb25lKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5naW5nRGlzYXBwZWFyaW5nQW5pbS5jbG9uZSgpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZvciB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoY2hpbGQpOworCisgICAgICAgICAgICAgICAgLy8gQSBPYmplY3RBbmltYXRvciAob3IgQW5pbWF0b3JTZXQgb2YgdGhlbSkgY2FuIGV4dHJhY3Qgc3RhcnQgdmFsdWVzIGZyb20KKyAgICAgICAgICAgICAgICAvLyBpdHMgdGFyZ2V0IG9iamVjdAorICAgICAgICAgICAgICAgIGFuaW0uc2V0dXBTdGFydFZhbHVlcygpOworCisgICAgICAgICAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gdHJhY2sgbGF5b3V0IGNoYW5nZXMgb24gdGhpcyB2aWV3LiBJZiB3ZSBkb24ndCBnZXQgYSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBhbmltYXRlLgorICAgICAgICAgICAgICAgIFZpZXcuT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWaWV3Lk9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0Q2hhbmdlKFZpZXcgdiwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2xkTGVmdCwgaW50IG9sZFRvcCwgaW50IG9sZFJpZ2h0LCBpbnQgb2xkQm90dG9tKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBhbmltYXRpb24gaW4gY2FzZSB3ZSBuZWVkIHRvIGNhbmNlbCBpdCBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGlvbnMucHV0KGNoaWxkLCBhbmltKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGUgYW5pbWF0aW9uIHRvIGV4dHJhY3QgZW5kIHZhbHVlcyBmcm9tIHRoZSBjaGFuZ2VkIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXR1cEVuZFZhbHVlcygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0RGVsYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGR1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVJlYXNvbiA9PSBBUFBFQVJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERlbGF5ID0gbUNoYW5naW5nQXBwZWFyaW5nRGVsYXkgKyBzdGFnZ2VyRGVsYXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2dlckRlbGF5ICs9IG1DaGFuZ2luZ0FwcGVhcmluZ1N0YWdnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBtQ2hhbmdpbmdBcHBlYXJpbmdEdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZWxheSA9IG1DaGFuZ2luZ0Rpc2FwcGVhcmluZ0RlbGF5ICsgc3RhZ2dlckRlbGF5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdnZXJEZWxheSArPSBtQ2hhbmdpbmdEaXNhcHBlYXJpbmdTdGFnZ2VyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbUNoYW5naW5nRGlzYXBwZWFyaW5nRHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkoc3RhcnREZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhbmltYXRpb24gZnJvbSB0aGUgY2FjaGUgd2hlbiBpdCBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgICBhbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRvciBhbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZW1vdmUgY2FuY2VsZWQgYW5pbWF0aW9ucyBpbW1lZGlhdGVseSwgbm90IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmNlbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5pbWF0aW9ucy5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSBpbnN0YW5jZW9mIE9iamVjdEFuaW1hdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcikgYW5pbSkuc2V0Q3VycmVudFBsYXlUaW1lKDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgcmVtb3ZlcyBsaXN0ZW5lcnMgd2hvc2Ugdmlld3MgY2hhbmdlZCAtIG11c3QgY2xlYXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBsaXN0ZW5lcnMgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnJlbW92ZU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjaGlsZC5hZGRPbkxheW91dENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgbGlzdGVuZXIgZm9yIGxhdGVyIHJlbW92YWwKKyAgICAgICAgICAgICAgICBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5wdXQoY2hpbGQsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUaGlzIGlzIHRoZSBjbGVhbnVwIHN0ZXAuIFdoZW4gd2UgZ2V0IHRoaXMgcmVuZGVyaW5nIGV2ZW50LCB3ZSBrbm93IHRoYXQgYWxsIG9mCisgICAgICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBhbmltYXRpb25zIGhhdmUgYmVlbiBzZXQgdXAgYW5kIHJ1bi4gTm93IHdlIGNhbiBjbGVhciBvdXQgdGhlCisgICAgICAgIC8vIGxheW91dCBsaXN0ZW5lcnMuCisgICAgICAgIG9ic2VydmVyLmFkZE9uUHJlRHJhd0xpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uUHJlRHJhd0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVEcmF3KCkgeworICAgICAgICAgICAgICAgIHBhcmVudC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25QcmVEcmF3TGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgaW50IG51bUNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IHBhcmVudC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgICAgICAgICBjaGlsZC5yZW1vdmVPbkxheW91dENoYW5nZUxpc3RlbmVyKGxheW91dENoYW5nZUxpc3RlbmVyTWFwLmdldChjaGlsZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXlvdXRDaGFuZ2VMaXN0ZW5lck1hcC5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBydW5zIHRoZSBhbmltYXRpb24gdGhhdCBtYWtlcyBhbiBhZGRlZCBpdGVtIGFwcGVhci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCB0byB3aGljaCB0aGUgVmlldyBpcyBiZWluZyBhZGRlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgYWRkZWQgdG8gdGhlIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcnVuQXBwZWFyaW5nVHJhbnNpdGlvbihmaW5hbCBWaWV3R3JvdXAgcGFyZW50LCBmaW5hbCBWaWV3IGNoaWxkKSB7CisgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBtQXBwZWFyaW5nQW5pbS5jbG9uZSgpOworICAgICAgICBhbmltLnNldFRhcmdldChjaGlsZCk7CisgICAgICAgIGFuaW0uc2V0U3RhcnREZWxheShtQXBwZWFyaW5nRGVsYXkpOworICAgICAgICBhbmltLnNldER1cmF0aW9uKG1BcHBlYXJpbmdEdXJhdGlvbik7CisgICAgICAgIGlmIChhbmltIGluc3RhbmNlb2YgT2JqZWN0QW5pbWF0b3IpIHsKKyAgICAgICAgICAgICgoT2JqZWN0QW5pbWF0b3IpIGFuaW0pLnNldEN1cnJlbnRQbGF5VGltZSgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChUcmFuc2l0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiBtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5lbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24udGhpcywgcGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBydW5zIHRoZSBhbmltYXRpb24gdGhhdCBtYWtlcyBhIHJlbW92ZWQgaXRlbSBkaXNhcHBlYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgZnJvbSB3aGljaCB0aGUgVmlldyBpcyBiZWluZyByZW1vdmVkLgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgVmlldyBiZWluZyByZW1vdmVkIGZyb20gdGhlIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcnVuRGlzYXBwZWFyaW5nVHJhbnNpdGlvbihmaW5hbCBWaWV3R3JvdXAgcGFyZW50LCBmaW5hbCBWaWV3IGNoaWxkKSB7CisgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBtRGlzYXBwZWFyaW5nQW5pbS5jbG9uZSgpOworICAgICAgICBhbmltLnNldFN0YXJ0RGVsYXkobURpc2FwcGVhcmluZ0RlbGF5KTsKKyAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtRGlzYXBwZWFyaW5nRHVyYXRpb24pOworICAgICAgICBhbmltLnNldFRhcmdldChjaGlsZCk7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuaW0uYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVuZFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbi50aGlzLCBwYXJlbnQsIGNoaWxkLCBESVNBUFBFQVJJTkcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFuaW0gaW5zdGFuY2VvZiBPYmplY3RBbmltYXRvcikgeworICAgICAgICAgICAgKChPYmplY3RBbmltYXRvcikgYW5pbSkuc2V0Q3VycmVudFBsYXlUaW1lKDApOworICAgICAgICB9CisgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgVmlld0dyb3VwIHdoZW4gYSBjaGlsZCB2aWV3IGlzIGFib3V0IHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIGNvbnRhaW5lci4gVGhpcyBjYWxsYmFjayBzdGFydHMgdGhlIHByb2Nlc3Mgb2YgYSB0cmFuc2l0aW9uOyB3ZSBncmFiIHRoZSBzdGFydGluZworICAgICAqIHZhbHVlcywgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGNvbnRhaW5lciwgYW5kIHN0YXJ0IGFwcHJvcHJpYXRlCisgICAgICogYW5pbWF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIFZpZXdHcm91cCB0byB3aGljaCB0aGUgVmlldyBpcyBiZWluZyBhZGRlZC4KKyAgICAgKiBAcGFyYW0gY2hpbGQgVGhlIFZpZXcgYmVpbmcgYWRkZWQgdG8gdGhlIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGlsZEFkZChWaWV3R3JvdXAgcGFyZW50LCBWaWV3IGNoaWxkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLnN0YXJ0VHJhbnNpdGlvbih0aGlzLCBwYXJlbnQsIGNoaWxkLCBBUFBFQVJJTkcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJ1bkNoYW5nZVRyYW5zaXRpb24ocGFyZW50LCBjaGlsZCwgQVBQRUFSSU5HKTsKKyAgICAgICAgcnVuQXBwZWFyaW5nVHJhbnNpdGlvbihwYXJlbnQsIGNoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgVmlld0dyb3VwIHdoZW4gYSBjaGlsZCB2aWV3IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgKiBjb250YWluZXIuIFRoaXMgY2FsbGJhY2sgc3RhcnRzIHRoZSBwcm9jZXNzIG9mIGEgdHJhbnNpdGlvbjsgd2UgZ3JhYiB0aGUgc3RhcnRpbmcKKyAgICAgKiB2YWx1ZXMsIGxpc3RlbiBmb3IgY2hhbmdlcyB0byBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBjb250YWluZXIsIGFuZCBzdGFydCBhcHByb3ByaWF0ZQorICAgICAqIGFuaW1hdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBWaWV3R3JvdXAgZnJvbSB3aGljaCB0aGUgVmlldyBpcyBiZWluZyByZW1vdmVkLgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgVmlldyBiZWluZyByZW1vdmVkIGZyb20gdGhlIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGlsZFJlbW92ZShWaWV3R3JvdXAgcGFyZW50LCBWaWV3IGNoaWxkKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLnN0YXJ0VHJhbnNpdGlvbih0aGlzLCBwYXJlbnQsIGNoaWxkLCBESVNBUFBFQVJJTkcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJ1bkNoYW5nZVRyYW5zaXRpb24ocGFyZW50LCBjaGlsZCwgRElTQVBQRUFSSU5HKTsKKyAgICAgICAgcnVuRGlzYXBwZWFyaW5nVHJhbnNpdGlvbihwYXJlbnQsIGNoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJvdW5kcyBvZiB0aGUgdmlldyBjaGFuZ2UgZHVlIHRvCisgICAgICogbGF5b3V0IHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBsYXlvdXQgYm91bmRzIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc2l0aW9uTGlzdGVuZXIoVHJhbnNpdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFRyYW5zaXRpb25MaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZm9yIGxheW91dCBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmb3IgbGF5b3V0IGJvdW5kcyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVHJhbnNpdGlvbkxpc3RlbmVyKFRyYW5zaXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBsaXN0ZW5lcnMgZm9yIGxheW91dCBjaGFuZ2VzLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUcmFuc2l0aW9uTGlzdGVuZXI+IGdldFRyYW5zaXRpb25MaXN0ZW5lcnMoKSB7CisgICAgICAgIHJldHVybiBtTGlzdGVuZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIGxpc3RlbmluZyB0byBzdGFydGluZyBhbmQgZW5kaW5nIGV2ZW50cyBmb3IgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBUcmFuc2l0aW9uTGlzdGVuZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGV2ZW50IGlzIHNlbnQgdG8gbGlzdGVuZXJzIHdoZW4gYW4gQVBQRUFSSU5HIG9yIERJU0FQUEVBUklORyB0cmFuc2l0aW9uCisgICAgICAgICAqIGJlZ2lucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRyYW5zaXRpb24gVGhlIExheW91dFRyYW5zaXRpb24gc2VuZGluZyBvdXQgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBWaWV3R3JvdXAgb24gd2hpY2ggdGhlIHRyYW5zaXRpb24gaXMgcGxheWluZy4KKyAgICAgICAgICogQHBhcmFtIHZpZXcgVGhlIFZpZXcgb2JqZWN0IGJlaW5nIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNpdGlvblR5cGUgVGhlIHR5cGUgb2YgdHJhbnNpdGlvbiB0aGF0IGlzIGJlZ2lubmluZywgZWl0aGVyCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uI0FQUEVBUklOR30gb3IKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb24jRElTQVBQRUFSSU5HfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGV2ZW50IGlzIHNlbnQgdG8gbGlzdGVuZXJzIHdoZW4gYW4gQVBQRUFSSU5HIG9yIERJU0FQUEVBUklORyB0cmFuc2l0aW9uIGVuZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIHNlbmRpbmcgb3V0IHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgVmlld0dyb3VwIG9uIHdoaWNoIHRoZSB0cmFuc2l0aW9uIGlzIHBsYXlpbmcuCisgICAgICAgICAqIEBwYXJhbSB2aWV3IFRoZSBWaWV3IG9iamVjdCBiZWluZyBhZGRlZCBvciByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4KKyAgICAgICAgICogQHBhcmFtIHRyYW5zaXRpb25UeXBlIFRoZSB0eXBlIG9mIHRyYW5zaXRpb24gdGhhdCBpcyBlbmRpbmcsIGVpdGhlcgorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbiNBUFBFQVJJTkd9IG9yCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uI0RJU0FQUEVBUklOR30uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBlbmRUcmFuc2l0aW9uKExheW91dFRyYW5zaXRpb24gdHJhbnNpdGlvbiwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBWaWV3IHZpZXcsIGludCB0cmFuc2l0aW9uVHlwZSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL09iamVjdEFuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vT2JqZWN0QW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I5MGJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL09iamVjdEFuaW1hdG9yLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBUaGlzIHN1YmNsYXNzIG9mIHtAbGluayBWYWx1ZUFuaW1hdG9yfSBwcm92aWRlcyBzdXBwb3J0IGZvciBhbmltYXRpbmcgcHJvcGVydGllcyBvbiB0YXJnZXQgb2JqZWN0cy4KKyAqIFRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhpcyBjbGFzcyB0YWtlIHBhcmFtZXRlcnMgdG8gZGVmaW5lIHRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgd2lsbCBiZSBhbmltYXRlZAorICogYXMgd2VsbCBhcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBBcHByb3ByaWF0ZSBzZXQvZ2V0IGZ1bmN0aW9ucworICogYXJlIHRoZW4gZGV0ZXJtaW5lZCBpbnRlcm5hbGx5IGFuZCB0aGUgYW5pbWF0aW9uIHdpbGwgY2FsbCB0aGVzZSBmdW5jdGlvbnMgYXMgbmVjZXNzYXJ5IHRvCisgKiBhbmltYXRlIHRoZSBwcm9wZXJ0eS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9iamVjdEFuaW1hdG9yPFQ+IGV4dGVuZHMgVmFsdWVBbmltYXRvcjxUPiB7CisKKyAgICAvLyBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgcHJvcGVydHkgZXhpc3RzLCBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCisgICAgcHJpdmF0ZSBPYmplY3QgbVRhcmdldDsKKworICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgc2V0dGVyIGZ1bmN0aW9uIGRlcml2ZWQgZnJvbSB0aGlzIHByb3BlcnR5IG5hbWUKKyAgICAgKiBtdXN0IHRha2UgdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGUgYXMgdGhlCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcywgb3RoZXJ3aXNlIHRoZSBjYWxsIHRvCisgICAgICogdGhlIHNldHRlciBmdW5jdGlvbiB3aWxsIGZhaWwuPC9wPgorICAgICAqCisgICAgICogPHA+SWYgdGhpcyBPYmplY3RBbmltYXRvciBoYXMgYmVlbiBzZXQgdXAgdG8gYW5pbWF0ZSBzZXZlcmFsIHByb3BlcnRpZXMgdG9nZXRoZXIsCisgICAgICogdXNpbmcgbW9yZSB0aGFuIG9uZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVuIHNldHRpbmcgdGhlIHByb3BlcnR5TmFtZSBzaW1wbHkKKyAgICAgKiBzZXRzIHRoZSBwcm9wZXJ0eU5hbWUgaW4gdGhlIGZpcnN0IG9mIHRob3NlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgaWYgKG1WYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbVZhbHVlcyBzaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsCisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSB2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCk7CisgICAgICAgICAgICB2YWx1ZXNIb2xkZXIuc2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnJlbW92ZShvbGROYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHByb3BlcnR5TmFtZSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gVGhpcyBuYW1lIHdpbGwgYmUgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7CisgICAgICAgIHJldHVybiBtUHJvcGVydHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCisgICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCisgICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQorICAgICAqIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7CisgICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgorICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7CisgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKKyAgICAgICAgU3RyaW5nIHNldHRlck5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7CisgICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIGFyZ3NbMF0gPSB2YWx1ZVR5cGU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVyblZhbCA9IG1UYXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwgYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgiT2JqZWN0QW5pbWF0b3IiLAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBzZXR0ZXIvZ2V0dGVyIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArICI6ICIgKyBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgT2JqZWN0QW5pbWF0b3Igb2JqZWN0LiBUaGlzIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgcHJpbWFyaWx5IGZvcgorICAgICAqIHVzZSBpbnRlcm5hbGx5OyB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHdoaWNoIHRha2UgcGFyYW1ldGVycyBhcmUgbW9yZSBnZW5lcmFsbHkKKyAgICAgKiB1c2VmdWwuCisgICAgICovCisgICAgcHVibGljIE9iamVjdEFuaW1hdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHNpbmdsZSBwcm9wZXJ0eSBuYW1lIGFuZCBzZXQgb2YgdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yIGlzCisgICAgICogdXNlZCBpbiB0aGUgc2ltcGxlIGNhc2Ugb2YgYW5pbWF0aW5nIGEgc2luZ2xlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCisgICAgICogaGF2ZSBhIHB1YmxpYyBtZXRob2Qgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4gSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0CisgICAgICogaXMgYXNzdW1lZCB0byBiZSB0aGUgZmluYWwgdmFsdWUgYmVpbmcgYW5pbWF0ZWQgdG8sIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGJlCisgICAgICogZGVyaXZlZCBvbiB0aGUgZmx5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBULi4udmFsdWVzKSB7CisgICAgICAgIHN1cGVyKGR1cmF0aW9uLCAoVFtdKSB2YWx1ZXMpOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBzZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+UHJvcGVydHlWYWx1ZUhvbGRlcjwvY29kZT4gdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZAorICAgICAqIGJlIHVzZWQgd2hlbiBhbmltYXRpbmcgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF0IG9uY2Ugd2l0aCB0aGUgc2FtZSBPYmplY3RBbmltYXRvciwgc2luY2UKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBhbGxvd3MgeW91IHRvIGFzc29jaWF0ZSBhIHNldCBvZiBhbmltYXRpb24gdmFsdWVzIHdpdGggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKKyAgICAgKiBoYXZlIHB1YmxpYyBtZXRob2RzIG9uIGl0IGNhbGxlZCA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5uYW1lPC9jb2RlPiBpcworICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBwYXNzZWQgaW4gYXMgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyIGZvcgorICAgICAqIGVhY2ggb2YgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB3aGljaCBob2xkIGVhY2ggdGhlIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlcworICAgICAqIHRvIGFuaW1hdGUgdGhhdCBwcm9wZXJ0eSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RBbmltYXRvcihsb25nIGR1cmF0aW9uLCBPYmplY3QgdGFyZ2V0LCBQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLnZhbHVlcykgeworICAgICAgICBzdXBlcihkdXJhdGlvbik7CisgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBmaXJzdCBhbmltYXRpb24KKyAgICAgKiBmcmFtZSBvZiBhbiBhbmltYXRpb24uIElmIHRoZXJlIGlzIGEgbm9uemVybyA8Y29kZT5zdGFydERlbGF5PC9jb2RlPiwgdGhlCisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoYXQgZGVsYXkgZW5kcy4KKyAgICAgKiBJdCB0YWtlcyBjYXJlIG9mIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBmb3IgdGhlCisgICAgICogYW5pbWF0aW9uLiBUaGlzIGluY2x1ZGVzIHNldHRpbmcgbUV2YWx1YXRvciwgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQKKyAgICAgKiBzZXQgaXQgdXAsIGFuZCB0aGUgc2V0dGVyL2dldHRlciBtZXRob2RzLCBpZiB0aGUgdXNlciBkaWQgbm90IHN1cHBseQorICAgICAqIHRoZW0uCisgICAgICoKKyAgICAgKiAgPHA+T3ZlcnJpZGVycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCB0aGUgc3VwZXJjbGFzcyBtZXRob2QgdG8gY2F1c2UKKyAgICAgKiAgaW50ZXJuYWwgbWVjaGFuaXNtcyB0byBiZSBzZXQgdXAgY29ycmVjdGx5LjwvcD4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGluaXRBbmltYXRpb24oKSB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAvLyBtVmFsdWVUeXBlIG1heSBjaGFuZ2UgZHVlIHRvIHNldHRlci9nZXR0ZXIgc2V0dXA7IGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgc3VwZXIuaW5pdCgpLAorICAgICAgICAgICAgLy8gd2hpY2ggdXNlcyBtVmFsdWVUeXBlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB0eXBlIGV2YWx1YXRvci4KKyAgICAgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwU2V0dGVyQW5kR2V0dGVyKG1UYXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuaW5pdEFuaW1hdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFRhcmdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIGFuaW1hdGVkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgYmVpbmcgYW5pbWF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwU3RhcnRWYWx1ZXMoKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldHVwU3RhcnRWYWx1ZShtVGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldHVwRW5kVmFsdWVzKCkgeworICAgICAgICBpbml0QW5pbWF0aW9uKCk7CisgICAgICAgIGludCBudW1WYWx1ZXMgPSBtVmFsdWVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgbVZhbHVlc1tpXS5zZXR1cEVuZFZhbHVlKG1UYXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiBkdXJpbmcgZXZlcnkKKyAgICAgKiBhbmltYXRpb24gZnJhbWUuIFRoaXMgZnVuY3Rpb24gdHVybnMgdGhlIGVsYXBzZWQgZnJhY3Rpb24gaW50byBhbiBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBpbnRvIGFuIGFuaW1hdGVkIHZhbHVlIChmcm9tIHRoZSBldmFsdWF0b3IuIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgbW9zdGx5IGR1cmluZworICAgICAqIGFuaW1hdGlvbiB1cGRhdGVzLCBidXQgaXQgaXMgYWxzbyBjYWxsZWQgd2hlbiB0aGUgPGNvZGU+ZW5kKCk8L2NvZGU+CisgICAgICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0byBzZXQgdGhlIGZpbmFsIHZhbHVlIG9uIHRoZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgdGhlIHN1cGVyY2xhc3MgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb24KKyAgICAgKiBvZiB0aGUgYW5pbWF0ZWQgdmFsdWUuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uIFRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBhbmltYXRlVmFsdWUoZmxvYXQgZnJhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuYW5pbWF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLnNldEFuaW1hdGVkVmFsdWUobVRhcmdldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0QW5pbWF0b3IgY2xvbmUoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdEFuaW1hdG9yIGFuaW0gPSAoT2JqZWN0QW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NjEyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9Qcm9wZXJ0eVZhbHVlc0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb3BlcnR5IGFuZCB0aGUgdmFsdWVzIHRoYXQgdGhhdCBwcm9wZXJ0eQorICogc2hvdWxkIHRha2Ugb24gZHVyaW5nIGFuIGFuaW1hdGlvbi4gUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBjYW4gYmUgdXNlZCB0byBjcmVhdGUKKyAqIGFuaW1hdGlvbnMgd2l0aCBWYWx1ZUFuaW1hdG9yIG9yIE9iamVjdEFuaW1hdG9yIHRoYXQgb3BlcmF0ZSBvbiBzZXZlcmFsIGRpZmZlcmVudCBwcm9wZXJ0aWVzCisgKiBpbiBwYXJhbGxlbC4KKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWVzSG9sZGVyPFQ+IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlcy4gVGhpcyBuZWVkIG5vdCBiZSBhIHJlYWwgcHJvcGVydHksCisgICAgICogdW5sZXNzIHRoaXMgb2JqZWN0IGlzIGJlaW5nIHVzZWQgd2l0aCBPYmplY3RBbmltYXRvci4gQnV0IHRoaXMgaXMgdGhlIG5hbWUgYnkgd2hpY2gKKyAgICAgKiBhbmlhbXRlZCB2YWx1ZXMgYXJlIGxvb2tlZCB1cCB3aXRoIGdldEFuaW1hdGVkVmFsdWUoU3RyaW5nKSBpbiBWYWx1ZUFuaW1hdG9yLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2QgbVNldHRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2V0dGVyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuIE9iamVjdEFuaW1hdG9yIGhhbmRzIG9mZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciwgc2luY2UgaXQgaG9sZHMgYWxsIG9mIHRoZSBwZXItcHJvcGVydHkgaW5mb3JtYXRpb24uIFRoaXMKKyAgICAgKiBwcm9wZXJ0eSBjYW4gYmUgbWFudWFsbHkgc2V0IHZpYSBzZXRTZXR0ZXIoKS4gT3RoZXJ3aXNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZGVyaXZlZCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzIGluIHNldHVwU2V0dGVyQW5kR2V0dGVyKCkgaWYgdXNpbmcgT2JqZWN0QW5pbWF0b3IuCisgICAgICogVGhlIGdldHRlciBpcyBvbmx5IGRlcml2ZWQgYW5kIHVzZWQgaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCBtR2V0dGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHZhbHVlcyBzdXBwbGllZC4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggaW4gZGVyaXZpbmcgdGhlIHNldHRlci9nZXR0ZXIKKyAgICAgKiBmdW5jdGlvbnMgYW5kIGluIGRlcml2aW5nIHRoZSB0eXBlIG9mIFR5cGVFdmFsdWF0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBtVmFsdWVUeXBlOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBrZXlmcmFtZXMgKHRpbWUvdmFsdWUgcGFpcnMpIHRoYXQgZGVmaW5lIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgS2V5ZnJhbWVTZXQgbUtleWZyYW1lU2V0ID0gbnVsbDsKKworCisgICAgLy8gdHlwZSBldmFsdWF0b3JzIGZvciB0aGUgdGhyZWUgcHJpbWl0aXZlIHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0ludEV2YWx1YXRvciA9IG5ldyBJbnRFdmFsdWF0b3IoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlRXZhbHVhdG9yIHNGbG9hdEV2YWx1YXRvciA9IG5ldyBGbG9hdEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0RvdWJsZUV2YWx1YXRvciA9IG5ldyBEb3VibGVFdmFsdWF0b3IoKTsKKworICAgIC8vIFdlIHRyeSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYXBwcm9wcmlhdGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMuCisgICAgLy8gVGhlIGNhbGxlciBtYXkgaGF2ZSBzdXBwbGllZCB2YWx1ZXMgaW4gYSB0eXBlIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNldHRlci9nZXR0ZXIKKyAgICAvLyBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIGludGVnZXJzIDAgYW5kIDEgdG8gcmVwcmVzZW50IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IgYWxwaGEpLgorICAgIC8vIEFsc28sIHRoZSB1c2Ugb2YgZ2VuZXJpY3MgaW4gY29uc3RydWN0b3JzIG1lYW5zIHRoYXQgd2UgZW5kIHVwIHdpdGggdGhlIE9iamVjdCB2ZXJzaW9ucworICAgIC8vIG9mIHByaW1pdGl2ZSB0eXBlcyAoRmxvYXQgdnMuIGZsb2F0KS4gQnV0IG1vc3QgbGlrZWx5LCB0aGUgc2V0dGVyL2dldHRlciBmdW5jdGlvbnMKKyAgICAvLyB3aWxsIHRha2UgcHJpbWl0aXZlIHR5cGVzIGluc3RlYWQuCisgICAgLy8gU28gd2Ugc3VwcGx5IGFuIG9yZGVyZWQgYXJyYXkgb2Ygb3RoZXIgdHlwZXMgdG8gdHJ5IGJlZm9yZSBnaXZpbmcgdXAuCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBGTE9BVF9WQVJJQU5UUyA9IHtmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsIGRvdWJsZS5jbGFzcywgaW50LmNsYXNzLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLCBJbnRlZ2VyLmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1tdIElOVEVHRVJfVkFSSUFOVFMgPSB7aW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBmbG9hdC5jbGFzcywgZG91YmxlLmNsYXNzLAorICAgICAgICAgICAgRmxvYXQuY2xhc3MsIERvdWJsZS5jbGFzc307CisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBET1VCTEVfVkFSSUFOVFMgPSB7ZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MsIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsCisgICAgICAgICAgICBGbG9hdC5jbGFzcywgSW50ZWdlci5jbGFzc307CisKKyAgICAvLyBUaGVzZSBtYXBzIGhvbGQgYWxsIHByb3BlcnR5IGVudHJpZXMgZm9yIGEgcGFydGljdWxhciBjbGFzcy4gVGhpcyBtYXAKKyAgICAvLyBpcyB1c2VkIHRvIHNwZWVkIHVwIHByb3BlcnR5L3NldHRlci9nZXR0ZXIgbG9va3VwcyBmb3IgYSBnaXZlbiBjbGFzcy9wcm9wZXJ0eQorICAgIC8vIGNvbWJpbmF0aW9uLiBObyBuZWVkIHRvIHVzZSByZWZsZWN0aW9uIG9uIHRoZSBjb21iaW5hdGlvbiBtb3JlIHRoYW4gb25jZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc1NldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4gc0dldHRlclByb3BlcnR5TWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgTWV0aG9kPj4oKTsKKworICAgIC8vIFRoaXMgbG9jayBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIHByb3BlcnR5IG1hcHMKKyAgICAvLyBhdCBhIHRpbWUuCisgICAgcHJpdmF0ZSBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHByb3BlcnR5TWFwTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisKKyAgICAvLyBVc2VkIHRvIHBhc3Mgc2luZ2xlIHZhbHVlIHRvIHZhcmFyZ3MgcGFyYW1ldGVyIGluIHNldHRlciBpbnZvY2F0aW9uCisgICAgcHJpdmF0ZSBPYmplY3RbXSBtVG1wVmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGFuaW1hdGVkIHZhbHVlcy4gVGhpcyBldmFsdWF0b3IgaXMgZGV0ZXJtaW5lZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIHN0YXJ0L2VuZCBvYmplY3RzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAgKiBidXQgdGhlIHN5c3RlbSBvbmx5IGtub3dzIGFib3V0IHRoZSBwcmltaXRpdmUgdHlwZXMgaW50LCBkb3VibGUsIGFuZCBmbG9hdC4gQW55IG90aGVyCisgICAgICogdHlwZSB3aWxsIG5lZWQgdG8gc2V0IHRoZSBldmFsdWF0b3IgdG8gYSBjdXN0b20gZXZhbHVhdG9yIGZvciB0aGF0IHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBUeXBlRXZhbHVhdG9yIG1FdmFsdWF0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGJ5IGNhbGN1bGF0ZVZhbHVlKCkuIFRoaXMgaXMgc2V0IGR1cmluZworICAgICAqIHRoYXQgZnVuY3Rpb24gYW5kIG1pZ2h0IGJlIHJldHJpZXZlZCBsYXRlciBlaXRoZXIgYnkgVmFsdWVBbmltYXRvci5hbmltYXRlZFZhbHVlKCkgb3IKKyAgICAgKiBieSB0aGUgcHJvcGVydHktc2V0dGluZyBsb2dpYyBpbiBPYmplY3RBbmltYXRvci5hbmltYXRlZFZhbHVlKCkuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgbUFuaW1hdGVkVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGgganVzdCBhIHNldCBvZiB2YWx1ZXMuIFRoaXMgY29uc3RydWN0b3IKKyAgICAgKiBpcyB0eXBpY2FsbHkgbm90IHVzZWQgd2hlbiBhbmltYXRpbmcgb2JqZWN0cyB3aXRoIE9iamVjdEFuaW1hdG9yLCBiZWNhdXNlIHRoYXQKKyAgICAgKiBvYmplY3QgbmVlZHMgZGlzdGluY3QgYW5kIG1lYW5pbmdmdWwgcHJvcGVydHkgbmFtZXMuIFNpbXBsZXIgYW5pbWF0aW9ucyBvZiBvbmUKKyAgICAgKiBzZXQgb2YgdmFsdWVzIHVzaW5nIFZhbHVlQW5pbWF0b3IgbWF5IHVzZSB0aGlzIGNvbnN0cnVjdG9yLCBob3dldmVyLCBiZWNhdXNlIG5vCisgICAgICogZGlzdGluZ3Vpc2hpbmcgbmFtZSBpcyBuZWVkZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdAorICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGZpbmFsIHZhbHVlIGJlaW5nIGFuaW1hdGVkIHRvLCBhbmQgdGhlIGluaXRpYWwgdmFsdWUgd2lsbCBiZQorICAgICAqIGRlcml2ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoVC4uLnZhbHVlcykgeworICAgICAgICB0aGlzKG51bGwsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG9mIGFueSB0eXBlLCBidXQgdGhlIHR5cGUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgc28gdGhhdAorICAgICAqIGFuIGFwcHJvcHJpYXRlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yfSBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaGVzCisgICAgICogdGhlIGNvbW1vbiB0eXBlLgorICAgICAqIDxwPklmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBlbmQgdmFsdWUgb2YgYW4gYW5pbWF0aW9uLAorICAgICAqIGFuZCBhbiBpbml0aWFsIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCwgaWYgcG9zc2libGUsIGJ5IGNhbGxpbmcgYSBnZXR0ZXIgZnVuY3Rpb24KKyAgICAgKiBvbiB0aGUgb2JqZWN0LiBBbHNvLCBpZiBhbnkgdmFsdWUgaXMgbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gdGhlIGFuaW1hdGlvbgorICAgICAqIHN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkuIFRoaXMgbWVjaGFuaXNtIG9mIGF1dG9tYXRpY2FsbHkgZ2V0dGluZyBudWxsIHZhbHVlcyBvbmx5IHdvcmtzCisgICAgICogaWYgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uCisgICAgICoge0BsaW5rIE9iamVjdEFuaW1hdG9yfSwgYW5kIHdpdGggYSBnZXR0ZXIgZnVuY3Rpb24gZWl0aGVyCisgICAgICogZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBvciBzZXQgZXhwbGljaXRseSB2aWEKKyAgICAgKiB7QGxpbmsgI3NldEdldHRlcihqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpfSwgc2luY2Ugb3RoZXJ3aXNlIFByb3BlcnR5VmFsdWVzSG9sZGVyIGhhcworICAgICAqIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2V0IG9mIHZhbHVlcy4gVGhpcworICAgICAqIGNhbiBiZSB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUgdG8gYmUgdXNlZCB3aGVuIHVzaW5nIGEgT2JqZWN0QW5pbWF0b3Igb2JqZWN0LCBvcgorICAgICAqIGp1c3QgYSBuYW1lIHVzZWQgdG8gZ2V0IGFuaW1hdGVkIHZhbHVlcywgc3VjaCBhcyBpZiB0aGlzIG9iamVjdCBpcyB1c2VkIHdpdGggYW4KKyAgICAgKiBWYWx1ZUFuaW1hdG9yIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWVzIGJlaW5nIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgdmFsdWUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIGVuZCB2YWx1ZSBvZiBhbiBhbmltYXRpb24sCisgICAgICogYW5kIGFuIGluaXRpYWwgdmFsdWUgd2lsbCBiZSBkZXJpdmVkLCBpZiBwb3NzaWJsZSwgYnkgY2FsbGluZyBhIGdldHRlciBmdW5jdGlvbgorICAgICAqIG9uIHRoZSBvYmplY3QuIEFsc28sIGlmIGFueSB2YWx1ZSBpcyBudWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiB0aGUgYW5pbWF0aW9uCisgICAgICogc3RhcnRzIGluIHRoZSBzYW1lIHdheS4gVGhpcyBtZWNoYW5pc20gb2YgYXV0b21hdGljYWxseSBnZXR0aW5nIG51bGwgdmFsdWVzIG9ubHkgd29ya3MKKyAgICAgKiBpZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24KKyAgICAgKiB7QGxpbmsgT2JqZWN0QW5pbWF0b3J9LCBhbmQgd2l0aCBhIGdldHRlciBmdW5jdGlvbiBlaXRoZXIKKyAgICAgKiBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IG9yIHNldCBleHBsaWNpdGx5IHZpYQorICAgICAqIHtAbGluayAjc2V0R2V0dGVyKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCl9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoVC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bUtleWZyYW1lcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRoaXNWYWx1ZVR5cGUgPSB2YWx1ZXNbaV0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAobVZhbHVlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSB0aGlzVmFsdWVUeXBlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzVmFsdWVUeXBlICE9IG1WYWx1ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXNWYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgfHwgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHRoaXNWYWx1ZVR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MgJiYgdGhpc1ZhbHVlVHlwZSA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVUeXBlID0gdGhpc1ZhbHVlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZSBrZXlmcmFtZXNbXSA9IG5ldyBLZXlmcmFtZVtNYXRoLm1heChudW1LZXlmcmFtZXMsMildOworICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoS2V5ZnJhbWUuY2xhc3MpKSB7CisgICAgICAgICAgICBtVmFsdWVUeXBlID0gKChLZXlmcmFtZSl2YWx1ZXNbMF0pLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbaV0gPSAoS2V5ZnJhbWUpdmFsdWVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG51bUtleWZyYW1lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAga2V5ZnJhbWVzWzBdID0gbmV3IEtleWZyYW1lKDBmLCAoT2JqZWN0KSBudWxsKTsKKyAgICAgICAgICAgICAgICBrZXlmcmFtZXNbMV0gPSBuZXcgS2V5ZnJhbWUoMWYsIHZhbHVlc1swXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGtleWZyYW1lc1swXSA9IG5ldyBLZXlmcmFtZSgwZiwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bUtleWZyYW1lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCAmJiAodmFsdWVzW2ldLmdldENsYXNzKCkgIT0gbVZhbHVlVHlwZSkpIHsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lc1tpXSA9IG5ldyBLZXlmcmFtZSgoZmxvYXQpIGkgLyAobnVtS2V5ZnJhbWVzIC0gMSksIHZhbHVlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1LZXlmcmFtZVNldCA9IG5ldyBLZXlmcmFtZVNldChrZXlmcmFtZXMpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIHNldHRlciBvciBnZXR0ZXIgZnVuY3Rpb24gdXNpbmcgdGhlIEphdmFCZWFucyBjb252ZW50aW9uIG9mIHNldEZvbyBvcgorICAgICAqIGdldEZvbyBmb3IgYSBwcm9wZXJ0eSBuYW1lZCAnZm9vJy4gVGhpcyBmdW5jdGlvbiBmaWd1cmVzIG91dCB3aGF0IHRoZSBuYW1lIG9mIHRoZQorICAgICAqIGZ1bmN0aW9uIHNob3VsZCBiZSBhbmQgdXNlcyByZWZsZWN0aW9uIHRvIGZpbmQgdGhlIE1ldGhvZCB3aXRoIHRoYXQgbmFtZSBvbiB0aGUKKyAgICAgKiB0YXJnZXQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBjbGFzcyB0byBzZWFyY2ggZm9yIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgKGluIHRoZSBjYXNlIG9mIGEgc2V0dGVyKS4gVGhpcyB0eXBlCisgICAgICogaXMgZGVyaXZlZCBmcm9tIHRoZSB2YWx1ZXMgc2V0IG9uIHRoaXMgUHJvcGVydHlWYWx1ZXNIb2xkZXIuIFRoaXMgdHlwZSBpcyB1c2VkIGFzCisgICAgICogYSBmaXJzdCBndWVzcyBhdCB0aGUgcGFyYW1ldGVyIHR5cGUsIGJ1dCB3ZSBjaGVjayBmb3IgbWV0aG9kcyB3aXRoIHNldmVyYWwgZGlmZmVyZW50CisgICAgICogdHlwZXMgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBzbGlnaHQgbWlzLW1hdGNoZXMgYmV0d2VlbiBzdXBwbGllZCB2YWx1ZXMgYW5kIGFjdHVhbAorICAgICAqIHZhbHVlIHR5cGVzIHVzZWQgb24gdGhlIHNldHRlci4KKyAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oQ2xhc3MgdGFyZ2V0Q2xhc3MsIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICAvLyBUT0RPOiBmYXN0ZXIgaW1wbGVtZW50YXRpb24uLi4KKyAgICAgICAgTWV0aG9kIHJldHVyblZhbCA9IG51bGw7CisgICAgICAgIFN0cmluZyBmaXJzdExldHRlciA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpOworICAgICAgICBTdHJpbmcgdGhlUmVzdCA9IG1Qcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBmaXJzdExldHRlciA9IGZpcnN0TGV0dGVyLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gcHJlZml4ICsgZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OworICAgICAgICBDbGFzcyBhcmdzW10gPSBudWxsOworICAgICAgICBpZiAodmFsdWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gdGFyZ2V0Q2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbm8tYXJnIG1ldGhvZCBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKyAiOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcmdzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgQ2xhc3MgdHlwZVZhcmlhbnRzW107CisgICAgICAgICAgICBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRmxvYXQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gRkxPQVRfVkFSSUFOVFM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1WYWx1ZVR5cGUuZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gSU5URUdFUl9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVZhbHVlVHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50cyA9IERPVUJMRV9WQVJJQU5UUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZVZhcmlhbnRzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgICAgIHR5cGVWYXJpYW50c1swXSA9IG1WYWx1ZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKENsYXNzIHR5cGVWYXJpYW50IDogdHlwZVZhcmlhbnRzKSB7CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IHRhcmdldENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB2YWx1ZSB0eXBlIHRvIHN1aXQKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlVHlwZSA9IHR5cGVWYXJpYW50OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN3YWxsb3cgdGhlIGVycm9yIGFuZCBrZWVwIHRyeWluZyBvdGhlciB2YXJpYW50cworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIHdhcyBmb3VuZAorICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgc2V0dGVyL2dldHRlciBmb3IgcHJvcGVydHkgIiArIG1Qcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHZhbHVlIHR5cGUgIisgbVZhbHVlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0dGVyIG9yIGdldHRlciByZXF1ZXN0ZWQuIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUKKyAgICAgKiByZXF1ZXN0ZWQgbWV0aG9kIGV4aXN0cyBpbiB0aGUgcHJvcGVydHlNYXBNYXAgY2FjaGUuIElmIG5vdCwgaXQgY2FsbHMgYW5vdGhlcgorICAgICAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gcmVxdWVzdCB0aGUgTWV0aG9kIGZyb20gdGhlIHRhcmdldENsYXNzIGRpcmVjdGx5LgorICAgICAqIEBwYXJhbSB0YXJnZXRDbGFzcyBUaGUgQ2xhc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3RlZCBtZXRob2Qgc2hvdWxkIGV4aXN0LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU1hcE1hcCBUaGUgY2FjaGUgb2Ygc2V0dGVycy9nZXR0ZXJzIGRlcml2ZWQgc28gZmFyLgorICAgICAqIEBwYXJhbSBwcmVmaXggInNldCIgb3IgImdldCIsIGZvciB0aGUgc2V0dGVyIG9yIGdldHRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWVUeXBlIFRoZSB0eXBlIG9mIHBhcmFtZXRlciBwYXNzZWQgaW50byB0aGUgbWV0aG9kIChudWxsIGZvciBnZXR0ZXIpLgorICAgICAqIEByZXR1cm4gTWV0aG9kIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIG1Qcm9wZXJ0eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBNZXRob2Qgc2V0dXBTZXR0ZXJPckdldHRlcihDbGFzcyB0YXJnZXRDbGFzcywKKyAgICAgICAgICAgIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+PiBwcm9wZXJ0eU1hcE1hcCwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIENsYXNzIHZhbHVlVHlwZSkgeworICAgICAgICBNZXRob2Qgc2V0dGVyT3JHZXR0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBsb2NrIHByb3BlcnR5IG1hcCBwcmlvciB0byByZWFkaW5nIGl0LCB0byBndWFyZCBhZ2FpbnN0CisgICAgICAgICAgICAvLyBhbm90aGVyIHRocmVhZCBwdXR0aW5nIHNvbWV0aGluZyBpbiB0aGVyZSBhZnRlciB3ZSd2ZSBjaGVja2VkIGl0CisgICAgICAgICAgICAvLyBidXQgYmVmb3JlIHdlJ3ZlIGFkZGVkIGFuIGVudHJ5IHRvIGl0CisgICAgICAgICAgICAvLyBUT0RPOiBjYW4gd2Ugc3RvcmUgdGhlIHNldHRlci9nZXR0ZXIgcGVyIENsYXNzIGluc3RlYWQgb2YgcGVyIE9iamVjdD8KKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgTWV0aG9kPiBwcm9wZXJ0eU1hcCA9IHByb3BlcnR5TWFwTWFwLmdldCh0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlck9yR2V0dGVyID0gcHJvcGVydHlNYXAuZ2V0KG1Qcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldHRlck9yR2V0dGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXR0ZXJPckdldHRlciA9IGdldFByb3BlcnR5RnVuY3Rpb24odGFyZ2V0Q2xhc3MsIHByZWZpeCwgdmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcE1hcC5wdXQodGFyZ2V0Q2xhc3MsIHByb3BlcnR5TWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIHNldHRlck9yR2V0dGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2V0dGVyT3JHZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNldHRlciBmcm9tIHRhcmdldENsYXNzCisgICAgICogQHBhcmFtIHRhcmdldENsYXNzIFRoZSBDbGFzcyBvbiB3aGljaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBzaG91bGQgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwU2V0dGVyKENsYXNzIHRhcmdldENsYXNzKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR1cFNldHRlck9yR2V0dGVyKHRhcmdldENsYXNzLCBzU2V0dGVyUHJvcGVydHlNYXAsICJzZXQiLCBtVmFsdWVUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2V0dGVyIGZyb20gdGFyZ2V0Q2xhc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBHZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgbUdldHRlciA9IHNldHVwU2V0dGVyT3JHZXR0ZXIodGFyZ2V0Q2xhc3MsIHNHZXR0ZXJQcm9wZXJ0eU1hcCwgImdldCIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIGZ1bmN0aW9uIChjYWxsZWQgZnJvbSBPYmplY3RBbmltYXRvcikgdG8gc2V0IHVwIHRoZSBzZXR0ZXIgYW5kIGdldHRlcgorICAgICAqIHByaW9yIHRvIHJ1bm5pbmcgdGhlIGFuaW1hdGlvbi4gSWYgdGhlIHNldHRlciBoYXMgbm90IGJlZW4gbWFudWFsbHkgc2V0IGZvciB0aGlzCisgICAgICogb2JqZWN0LCBpdCB3aWxsIGJlIGRlcml2ZWQgYXV0b21hdGljYWxseSBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSwgdGFyZ2V0IG9iamVjdCwgYW5kCisgICAgICogdHlwZXMgb2YgdmFsdWVzIHN1cHBsaWVkLiBJZiBubyBnZXR0ZXIgaGFzIGJlZW4gc2V0LCBpdCB3aWxsIGJlIHN1cHBsaWVkIGlmZiBhbnkgb2YgdGhlCisgICAgICogc3VwcGxpZWQgdmFsdWVzIHdhcyBudWxsLiBJZiB0aGVyZSBpcyBhIG51bGwgdmFsdWUsIHRoZW4gdGhlIGdldHRlciAoc3VwcGxpZWQgb3IgZGVyaXZlZCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCB0byBzZXQgdGhvc2UgbnVsbCB2YWx1ZXMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzZXR0ZXIgKGFuZCBwb3NzaWJseSBnZXR0ZXIpIGV4aXN0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcyA9IHRhcmdldC5nZXRDbGFzcygpOworICAgICAgICBpZiAobVNldHRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXR1cFNldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChLZXlmcmFtZSBrZiA6IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoa2YuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cEdldHRlcih0YXJnZXRDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtmLnNldFZhbHVlKChUKSBtR2V0dGVyLmludm9rZSh0YXJnZXQpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgc3RvcmVkIGluIGEgcGFydGljdWxhciBLZXlmcmFtZS4gVGhlIHZhbHVlIHVzZWQgaXMKKyAgICAgKiB3aGF0ZXZlciB0aGUgdmFsdWUgaXMgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lIHNwZWNpZmllZCBpbiB0aGUga2V5ZnJhbWUgb24gdGhlIHRhcmdldCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgdmFsdWUgc2hvdWxkIGJlIGV4dHJhY3RlZC4KKyAgICAgKiBAcGFyYW0ga2YgVGhlIGtleWZyYW1lIHdoaWNoIGhvbGRzIHRoZSBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZShPYmplY3QgdGFyZ2V0LCBLZXlmcmFtZSBrZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgc2V0dXBHZXR0ZXIodGFyZ2V0Q2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2Yuc2V0VmFsdWUoKFQpIG1HZXR0ZXIuaW52b2tlKHRhcmdldCkpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIHN0YXJ0IHZhbHVlcyBhcmUgc2V0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhlIHRhcmdldCBvYmplY3QuIFRoZQorICAgICAqIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGV4dHJhY3RlZCBpcyB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgYnkgdGhlIHByb3BlcnR5TmFtZSBvZiB0aGlzCisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBzdGFydCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2V0LgorICAgICAqLworICAgIHZvaWQgc2V0dXBTdGFydFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgc2V0dXBWYWx1ZSh0YXJnZXQsIG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLmdldCgwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT2JqZWN0QW5pbWF0b3Igd2hlbiBzZXR0aW5nIHRoZSBlbmQgdmFsdWVzIGZvciBhbiBhbmltYXRpb24uCisgICAgICogVGhlIGVuZCB2YWx1ZXMgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoZSB0YXJnZXQgb2JqZWN0LiBUaGUKKyAgICAgKiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBleHRyYWN0ZWQgaXMgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUgb2YgdGhpcworICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aGljaCBob2xkcyB0aGUgc3RhcnQgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNldC4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwRW5kVmFsdWUoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBzZXR1cFZhbHVlKHRhcmdldCwgbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXMuZ2V0KG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzLnNpemUoKSAtIDEpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgY2xvbmUoKSB7CisgICAgICAgIEFycmF5TGlzdDxLZXlmcmFtZT4ga2V5ZnJhbWVzID0gbUtleWZyYW1lU2V0Lm1LZXlmcmFtZXM7CisgICAgICAgIGludCBudW1LZXlmcmFtZXMgPSBtS2V5ZnJhbWVTZXQubUtleWZyYW1lcy5zaXplKCk7CisgICAgICAgIEtleWZyYW1lW10gbmV3S2V5ZnJhbWVzID0gbmV3IEtleWZyYW1lW251bUtleWZyYW1lc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5ZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgIG5ld0tleWZyYW1lc1tpXSA9IGtleWZyYW1lcy5nZXQoaSkuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhDbG9uZSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcihtUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbmV3S2V5ZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuIHB2aENsb25lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9uIHRoZSB0YXJnZXQgb2JqZWN0LCB1c2luZyB0aGUgc2V0dGVyIHNldCB1cAorICAgICAqIGVhcmxpZXIgb24gdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE9iamVjdEFuaW1hdG9yCisgICAgICogdG8gaGFuZGxlIHR1cm5pbmcgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgYnkgVmFsdWVBbmltYXRvciBpbnRvIGEgdmFsdWUgc2V0IG9uIHRoZSBvYmplY3QKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIHZhbHVlIGlzIHNldAorICAgICAqLworICAgIHZvaWQgc2V0QW5pbWF0ZWRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgIGlmIChtU2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVRtcFZhbHVlQXJyYXlbMF0gPSBtQW5pbWF0ZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICBtU2V0dGVyLmludm9rZSh0YXJnZXQsIG1UbXBWYWx1ZUFycmF5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZSgiUHJvcGVydHlWYWx1ZXNIb2xkZXIiLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yLCB0byBzZXQgdXAgdGhlIFR5cGVFdmFsdWF0b3IgdGhhdCB3aWxsIGJlIHVzZWQKKyAgICAgKiB0byBjYWxjdWxhdGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1FdmFsdWF0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbUV2YWx1YXRvciA9IChtVmFsdWVUeXBlID09IGludC5jbGFzcyB8fCBtVmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MpID8gc0ludEV2YWx1YXRvciA6CisgICAgICAgICAgICAgICAgKG1WYWx1ZVR5cGUgPT0gZG91YmxlLmNsYXNzIHx8IG1WYWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSA/IHNEb3VibGVFdmFsdWF0b3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgc0Zsb2F0RXZhbHVhdG9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFR5cGVFdmFsdWF0b3Igd2lsbCB0aGUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHZhbHVlcworICAgICAqIHN1cHBsaWVkIHRvIFByb3BlcnR5VmFsdWVzSG9sZGVyLiBUaGUgZXZhbHVhdG9yIGNhbiBiZSBtYW51YWxseSBzZXQsIGhvd2V2ZXIsIGlmIHNvCisgICAgICogZGVzaXJlZC4gVGhpcyBtYXkgYmUgaW1wb3J0YW50IGluIGNhc2VzIHdoZXJlIGVpdGhlciB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIHN1cHBsaWVkCisgICAgICogZG8gbm90IG1hdGNoIHRoZSB3YXkgdGhhdCB0aGV5IHNob3VsZCBiZSBpbnRlcnBvbGF0ZWQgYmV0d2Vlbiwgb3IgaWYgdGhlIHZhbHVlcworICAgICAqIGFyZSBvZiBhIGN1c3RvbSB0eXBlIG9yIG9uZSBub3QgY3VycmVudGx5IHVuZGVyc3Rvb2QgYnkgdGhlIGFuaW1hdGlvbiBzeXN0ZW0uIEN1cnJlbnRseSwKKyAgICAgKiBvbmx5IHZhbHVlcyBvZiB0eXBlIGZsb2F0LCBkb3VibGUsIGFuZCBpbnQgKGFuZCB0aGVpciBPYmplY3QgZXF1aXZhbGVudHMsIEZsb2F0LCBEb3VibGUsCisgICAgICogYW5kIEludGVnZXIpIGFyZSAgY29ycmVjdGx5IGludGVycG9sYXRlZDsgYWxsIG90aGVyIHR5cGVzIHJlcXVpcmUgc2V0dGluZyBhIFR5cGVFdmFsdWF0b3IuCisgICAgICogQHBhcmFtIGV2YWx1YXRvcgorICAgICAqLworCXB1YmxpYyB2b2lkIHNldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yIGV2YWx1YXRvcikgeworICAgICAgICBtRXZhbHVhdG9yID0gZXZhbHVhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGV2YWx1YXRvciBzZXQgdXAgZm9yCisgICAgICogdGhpcyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFZhbHVlQW5pbWF0b3IuYW5pbWF0ZVZhbHVlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGVsYXBzZWQsIGludGVycG9sYXRlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIGNhbGN1bGF0ZWQgdmFsdWUgYXQgdGhpcyBwb2ludCBpbiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIE9iamVjdCBjYWxjdWxhdGVWYWx1ZShmbG9hdCBmcmFjdGlvbikgeworICAgICAgICBtQW5pbWF0ZWRWYWx1ZSA9IG1LZXlmcmFtZVNldC5nZXRWYWx1ZShmcmFjdGlvbiwgbUV2YWx1YXRvcik7CisgICAgICAgIHJldHVybiBtQW5pbWF0ZWRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8Y29kZT5NZXRob2Q8L2NvZGU+IHRoYXQgaXMgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcyBjYWxjdWxhdGVkCisgICAgICogZHVyaW5nIHRoZSBhbmltYXRpb24uIFNldHRpbmcgdGhlIHNldHRlciBtZXRob2QgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGEKKyAgICAgKiB7QGxpbmsgI3NldFByb3BlcnR5TmFtZShTdHJpbmcpIHByb3BlcnR5TmFtZX0gZnJvbSB3aGljaCB0aGUgbWV0aG9kIGlzIGRlcml2ZWQuIFRoaXMKKyAgICAgKiBhcHByb2FjaCBpcyBtb3JlIGRpcmVjdCwgYW5kIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gYSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0aGF0IGRvZXMKKyAgICAgKiBub3QgY29ycmVzcG9uZCB0byB0aGUgY29udmVudGlvbiBvZiA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LiBGb3IgZXhhbXBsZSwgaWYgYSBmdW5jdGlvbgorICAgICAqIGNhbGxlZCA8Y29kZT5vZmZzZXQoKTwvY29kZT4gaXMgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcywgdGhlcmUgaXMgbm8gd2F5CisgICAgICogdG8gdGVsbCA8Y29kZT5PYmplY3RBbmltYXRvcjwvY29kZT4gaG93IHRvIGNhbGwgdGhhdCBmdW5jdGlvbiBzaW1wbHkgdGhyb3VnaCBhIHByb3BlcnR5CisgICAgICogbmFtZSwgc28gYSBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBzdXBwbGllZCBpbnN0ZWFkLgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBzZXR0ZXIgZnVuY3Rpb24gbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXIgVGhlIHNldHRlciBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoTWV0aG9kIHNldHRlcikgeworICAgICAgICBtU2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPk1ldGhvZDwvY29kZT4gdGhhdCBpcyBjYWxsZWQgd2l0aCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGNhbGN1bGF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldFNldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4gU2V0dGluZyB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgYQorICAgICAqIHtAbGluayAjc2V0UHJvcGVydHlOYW1lKFN0cmluZykgcHJvcGVydHlOYW1lfSBmcm9tIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVyaXZlZC4gVGhpcworICAgICAqIGFwcHJvYWNoIGlzIG1vcmUgZGlyZWN0LCBhbmQgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBhIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRoYXQgZG9lcworICAgICAqIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb252ZW50aW9uIG9mIDxjb2RlPnNldE5hbWUoKTwvY29kZT4uIEZvciBleGFtcGxlLCBpZiBhIGZ1bmN0aW9uCisgICAgICogY2FsbGVkIDxjb2RlPm9mZnNldCgpPC9jb2RlPiBpcyB0byBiZSBjYWxsZWQgdG8gZ2V0IGFuIGluaXRpYWwgdmFsdWUsIHRoZXJlIGlzIG5vIHdheQorICAgICAqIHRvIHRlbGwgPGNvZGU+T2JqZWN0QW5pbWF0b3I8L2NvZGU+IGhvdyB0byBjYWxsIHRoYXQgZnVuY3Rpb24gc2ltcGx5IHRocm91Z2ggYSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIHNvIGEgZ2V0dGVyIG1ldGhvZCBzaG91bGQgYmUgc3VwcGxpZWQgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZ2V0dGVyIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGV0aGVyIHN1cHBsaWVkIGhlcmUgb3IgZGVyaXZlZAorICAgICAqIGZyb20gdGhlIHByb3BlcnR5IG5hbWUsIGlmIG9uZSBvZiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yIDxjb2RlPnZhbHVlVG88L2NvZGU+IGFyZQorICAgICAqIG51bGwuIElmIGJvdGggb2YgdGhvc2UgdmFsdWVzIGFyZSBub24tbnVsbCwgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCBvbmUgb2YgdGhlCisgICAgICogdmFsdWVzIGFuZCB0aGUgZ2V0dGVyIGlzIG5vdCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIGdldHRlciBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZSBhcyB0aGUKKyAgICAgKiA8Y29kZT52YWx1ZUZyb208L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRvPC9jb2RlPiBwcm9wZXJ0aWVzICh3aGljaGV2ZXIgb2YgdGhlbSBhcmUKKyAgICAgKiBub24tbnVsbCksIG90aGVyd2lzZSB0aGUgY2FsbCB0byB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwgZmFpbC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0dGVyIFRoZSBnZXR0ZXIgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB0byBnZXQgaW5pdGlhbCBhbmltYXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdldHRlcihNZXRob2QgZ2V0dGVyKSB7CisgICAgICAgIG1HZXR0ZXIgPSBnZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgPGNvZGU+TWV0aG9kPC9jb2RlPiB0aGF0IGlzIGNhbGxlZCB0byBnZXQgdW5zdXBwbGllZCA8Y29kZT52YWx1ZUZyb208L2NvZGU+IG9yCisgICAgICogPGNvZGU+dmFsdWVUbzwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldEdldHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1HZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBkZXJpdmUKKyAgICAgKiBhIHNldHRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHNldCBhbmltYXRlZCB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZSBvZiA8Y29kZT5mb288L2NvZGU+IHdpbGwgcmVzdWx0CisgICAgICogaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiA8Y29kZT5zZXRGb28oKTwvY29kZT4gb24gdGhlIHRhcmdldCBvYmplY3QuIElmIGVpdGhlcgorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gb3IgPGNvZGU+dmFsdWVUbzwvY29kZT4gaXMgbnVsbCwgdGhlbiBhIGdldHRlciBmdW5jdGlvbiB3aWxsCisgICAgICogYWxzbyBiZSBkZXJpdmVkIGFuZCBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHNldHRlciBmdW5jdGlvbiBkZXJpdmVkIGZyb20gdGhpcyBwcm9wZXJ0eSBuYW1lCisgICAgICogbXVzdCB0YWtlIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlIGFzIHRoZQorICAgICAqIDxjb2RlPnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlVG88L2NvZGU+IHByb3BlcnRpZXMsIG90aGVyd2lzZSB0aGUgY2FsbCB0bworICAgICAqIHRoZSBzZXR0ZXIgZnVuY3Rpb24gd2lsbCBmYWlsLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQorICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KKyAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKKyAgICAgKiBpbiBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIDxjb2RlPnNldEZvbygpPC9jb2RlPiBvbiB0aGUgdGFyZ2V0IG9iamVjdC4gSWYgZWl0aGVyCisgICAgICogPGNvZGU+dmFsdWVGcm9tPC9jb2RlPiBvciA8Y29kZT52YWx1ZVRvPC9jb2RlPiBpcyBudWxsLCB0aGVuIGEgZ2V0dGVyIGZ1bmN0aW9uIHdpbGwKKyAgICAgKiBhbHNvIGJlIGRlcml2ZWQgYW5kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9wZXJ0eU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24sIGNhbGxlZCBieSBWYWx1ZUFuaW1hdG9yIGFuZCBPYmplY3RBbmltYXRvciwgdG8gcmV0cmlldmUgdGhlIHZhbHVlCisgICAgICogbW9zdCByZWNlbnRseSBjYWxjdWxhdGVkIGluIGNhbGN1bGF0ZVZhbHVlKCkuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdGVkVmFsdWU7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9SR0JFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWUwYWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1JHQkV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOworCisvKioKKyAqIFRoaXMgZXZhbHVhdG9yIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdHlwZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gaW50ZWdlcgorICogdmFsdWVzIHRoYXQgcmVwcmVzZW50IEFSR0IgY29sb3JzLgorICovCitwdWJsaWMgY2xhc3MgUkdCRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW4tYmV0d2VlbiB2YWx1ZSBmb3IgYSBjb2xvcgorICAgICAqIGdpdmVuIGludGVnZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcyBpbiB0aGUgZm91cgorICAgICAqIGJ5dGVzIG9mIHRoZSAzMi1iaXQgaW50LiBFYWNoIGNoYW5uZWwgaXMgc2VwYXJhdGVseSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKKyAgICAgKiBhbmQgdGhlIHJlc3VsdGluZyBjYWxjdWxhdGVkIHZhbHVlcyBhcmUgcmVjb21iaW5lZCBpbnRvIHRoZSByZXR1cm4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhY3Rpb24gVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgQSAzMi1iaXQgaW50IHZhbHVlIHJlcHJlc2VudGluZyBjb2xvcnMgaW4gdGhlCisgICAgICogc2VwYXJhdGUgYnl0ZXMgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSBBIDMyLWJpdCBpbnQgdmFsdWUgcmVwcmVzZW50aW5nIGNvbG9ycyBpbiB0aGUKKyAgICAgKiBzZXBhcmF0ZSBieXRlcyBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBBIHZhbHVlIHRoYXQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGluZWFybHkgaW50ZXJwb2xhdGVkCisgICAgICogcmVzdWx0LCBkZXJpdmVkIGJ5IHNlcGFyYXRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGludG8gc2VwYXJhdGUKKyAgICAgKiBjb2xvciBjaGFubmVscyBhbmQgaW50ZXJwb2xhdGluZyBlYWNoIG9uZSBzZXBhcmF0ZWx5LCByZWNvbWJpbmluZyB0aGUKKyAgICAgKiByZXN1bHRpbmcgdmFsdWVzIGluIHRoZSBzYW1lIHdheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgIGludCBzdGFydEludCA9IChJbnRlZ2VyKSBzdGFydFZhbHVlOworICAgICAgICBpbnQgc3RhcnRBID0gKHN0YXJ0SW50ID4+IDI0KTsKKyAgICAgICAgaW50IHN0YXJ0UiA9IChzdGFydEludCA+PiAxNikgJiAweGZmOworICAgICAgICBpbnQgc3RhcnRHID0gKHN0YXJ0SW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IHN0YXJ0QiA9IHN0YXJ0SW50ICYgMHhmZjsKKworICAgICAgICBpbnQgZW5kSW50ID0gKEludGVnZXIpIGVuZFZhbHVlOworICAgICAgICBpbnQgZW5kQSA9IChlbmRJbnQgPj4gMjQpOworICAgICAgICBpbnQgZW5kUiA9IChlbmRJbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEcgPSAoZW5kSW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgaW50IGVuZEIgPSBlbmRJbnQgJiAweGZmOworCisgICAgICAgIHJldHVybiAoaW50KSgoc3RhcnRBICsgKGludCkoZnJhY3Rpb24gKiAoZW5kQSAtIHN0YXJ0QSkpKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydFIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRSIC0gc3RhcnRSKSkpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKGludCkoKHN0YXJ0RyArIChpbnQpKGZyYWN0aW9uICogKGVuZEcgLSBzdGFydEcpKSkgPDwgOCkgfAorICAgICAgICAgICAgICAgIChpbnQpKChzdGFydEIgKyAoaW50KShmcmFjdGlvbiAqIChlbmRCIC0gc3RhcnRCKSkpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0OTE3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKKy8qKgorICogSW50ZXJmYWNlIGZvciB1c2Ugd2l0aCB0aGUge0BsaW5rIFZhbHVlQW5pbWF0b3Ijc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IpfSBmdW5jdGlvbi4gRXZhbHVhdG9ycworICogYWxsb3cgZGV2ZWxvcGVycyB0byBjcmVhdGUgYW5pbWF0aW9ucyBvbiBhcmJpdHJhcnkgcHJvcGVydHkgdHlwZXMsIGJ5IGFsbG93aW5nIHRoZW0gdG8gc3VwcGx5CisgKiBjdXN0b20gZXZhdWxhdG9ycyBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgdW5kZXJzdG9vZCBhbmQgdXNlZCBieSB0aGUgYW5pbWF0aW9uCisgKiBzeXN0ZW0uCisgKgorICogQHNlZSBWYWx1ZUFuaW1hdG9yI3NldEV2YWx1YXRvcihUeXBlRXZhbHVhdG9yKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFR5cGVFdmFsdWF0b3IgeworCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2YgbGluZWFybHkgaW50ZXJwb2xhdGluZyB0aGUgc3RhcnQgYW5kIGVuZCB2YWx1ZXMsIHdpdGgKKyAgICAgKiA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBwcm9wb3J0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiBUaGUKKyAgICAgKiBjYWxjdWxhdGlvbiBpcyBhIHNpbXBsZSBwYXJhbWV0cmljIGNhbGN1bGF0aW9uOiA8Y29kZT5yZXN1bHQgPSB4MCArIHQgKiAodjEgLSB2MCk8L2NvZGU+LAorICAgICAqIHdoZXJlIDxjb2RlPngwPC9jb2RlPiBpcyA8Y29kZT5zdGFydFZhbHVlPC9jb2RlPiwgPGNvZGU+eDE8L2NvZGU+IGlzIDxjb2RlPmVuZFZhbHVlPC9jb2RlPiwKKyAgICAgKiBhbmQgPGNvZGU+dDwvY29kZT4gaXMgPGNvZGU+ZnJhY3Rpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWN0aW9uICAgVGhlIGZyYWN0aW9uIGZyb20gdGhlIHN0YXJ0aW5nIHRvIHRoZSBlbmRpbmcgdmFsdWVzCisgICAgICogQHBhcmFtIHN0YXJ0VmFsdWUgVGhlIHN0YXJ0IHZhbHVlLgorICAgICAqIEBwYXJhbSBlbmRWYWx1ZSAgIFRoZSBlbmQgdmFsdWUuCisgICAgICogQHJldHVybiBBIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLCBnaXZlbiB0aGUKKyAgICAgKiAgICAgICAgIDxjb2RlPmZyYWN0aW9uPC9jb2RlPiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShmbG9hdCBmcmFjdGlvbiwgT2JqZWN0IHN0YXJ0VmFsdWUsIE9iamVjdCBlbmRWYWx1ZSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZTJiYmNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YQpAQCAtMCwwICsxLDk4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNpbXBsZSB0aW1pbmcgZW5naW5lIGZvciBydW5uaW5nIGFuaW1hdGlvbnMKKyAqIHdoaWNoIGNhbGN1bGF0ZSBhbmltYXRlZCB2YWx1ZXMgYW5kIHNldCB0aGVtIG9uIHRhcmdldCBvYmplY3RzLgorICoKKyAqIDxwPlRoZXJlIGlzIGEgc2luZ2xlIHRpbWluZyBwdWxzZSB0aGF0IGFsbCBhbmltYXRpb25zIHVzZS4gSXQgcnVucyBpbiBhCisgKiBjdXN0b20gaGFuZGxlciB0byBlbnN1cmUgdGhhdCBwcm9wZXJ0eSBjaGFuZ2VzIGhhcHBlbiBvbiB0aGUgVUkgdGhyZWFkLjwvcD4KKyAqCisgKiA8cD5CeSBkZWZhdWx0LCBWYWx1ZUFuaW1hdG9yIHVzZXMgbm9uLWxpbmVhciB0aW1lIGludGVycG9sYXRpb24sIHZpYSB0aGUKKyAqIHtAbGluayBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcn0gY2xhc3MsIHdoaWNoIGFjY2VsZXJhdGVzIGludG8gYW5kIGRlY2VsZXJhdGVzCisgKiBvdXQgb2YgYW4gYW5pbWF0aW9uLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcKKyAqIHtAbGluayBWYWx1ZUFuaW1hdG9yI3NldEludGVycG9sYXRvcihJbnRlcnBvbGF0b3IpfS48L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZUFuaW1hdG9yPFQ+IGV4dGVuZHMgQW5pbWF0b3IgeworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uc3RhbnRzCisgICAgICovCisKKyAgICAvKgorICAgICAqIFRoZSBkZWZhdWx0IGFtb3VudCBvZiB0aW1lIGluIG1zIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9GUkFNRV9ERUxBWSA9IDMwOworCisgICAgLyoqCisgICAgICogTWVzc2FnZXMgc2VudCB0byB0aW1pbmcgaGFuZGxlcjogU1RBUlQgaXMgc2VudCB3aGVuIGFuIGFuaW1hdGlvbiBmaXJzdCBiZWdpbnMsIEZSQU1FIGlzIHNlbnQKKyAgICAgKiBieSB0aGUgaGFuZGxlciB0byBpdHNlbGYgdG8gcHJvY2VzcyB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX1NUQVJUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFUSU9OX0ZSQU1FID0gMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlcyB1c2VkIHdpdGggaW50ZXJuYWwgdmFyaWFibGUgbVBsYXlpbmdTdGF0ZSB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbgorICAgICAqIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgICA9IDA7IC8vIE5vdCB5ZXQgcGxheWluZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HICAgID0gMTsgLy8gUGxheWluZyBub3JtYWxseQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxFRCAgID0gMjsgLy8gY2FuY2VsKCkgY2FsbGVkIC0gbmVlZCB0byBlbmQgaXQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5ERUQgICAgICA9IDM7IC8vIGVuZCgpIGNhbGxlZCAtIG5lZWQgdG8gZW5kIGl0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRUtFRCAgICAgPSA0OyAvLyBTZWVrZWQgdG8gc29tZSB0aW1lIHZhbHVlCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB2YXJpYWJsZXMKKyAgICAgKiBOT1RFOiBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBjbG9uZSgpIG1ldGhvZCwgbWFraW5nIGEgZGVlcCBjb3B5IG9mIGFueSByZWZlcmVuY2VkCisgICAgICogb2JqZWN0cy4gQXMgb3RoZXIgbm9uLXRyaXZpYWwgZmllbGRzIGFyZSBhZGRlZCB0byB0aGlzIGNsYXNzLCBtYWtlIHN1cmUgdG8gYWRkIGxvZ2ljCisgICAgICogdG8gY2xvbmUoKSB0byBtYWtlIGRlZXAgY29waWVzIG9mIHRoZW0uCisgICAgICovCisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGF0IHRoZSBhbmltYXRpb24ncyBhbmltYXRlRnJhbWUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGlzIHRpbWUgaXMgdXNlZCB0bworICAgIC8vIGRldGVybWluZSBlbGFwc2VkIHRpbWUgKGFuZCB0aGVyZWZvcmUgdGhlIGVsYXBzZWQgZnJhY3Rpb24pIGluIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAvLyB0byBhbmltYXRlRnJhbWUoKQorICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOworCisgICAgLyoqCisgICAgICogU2V0IHdoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkgaXMgY2FsbGVkLiBJZiBuZWdhdGl2ZSwgYW5pbWF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc2Vla2VkCisgICAgICogdG8gYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgbVNlZWtUaW1lID0gLTE7CisKKyAgICAvLyBUaGUgc3RhdGljIHNBbmltYXRpb25IYW5kbGVyIHByb2Nlc3NlcyB0aGUgaW50ZXJuYWwgdGltaW5nIGxvb3Agb24gd2hpY2ggYWxsIGFuaW1hdGlvbnMKKyAgICAvLyBhcmUgYmFzZWQKKyAgICBwcml2YXRlIHN0YXRpYyBBbmltYXRpb25IYW5kbGVyIHNBbmltYXRpb25IYW5kbGVyOworCisgICAgLy8gVGhlIHN0YXRpYyBsaXN0IG9mIGFsbCBhY3RpdmUgYW5pbWF0aW9ucworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzQW5pbWF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKworICAgIC8vIFRoZSBzZXQgb2YgYW5pbWF0aW9ucyB0byBiZSBzdGFydGVkIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzUGVuZGluZ0FuaW1hdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFZhbHVlQW5pbWF0b3I+KCk7CisKKyAgICAvLyBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZCBpZiBub25lIGlzIHNldCBvbiB0aGUgYW5pbWF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZXJwb2xhdG9yIHNEZWZhdWx0SW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7CisKKyAgICAvLyB0eXBlIGV2YWx1YXRvcnMgZm9yIHRoZSB0aHJlZSBwcmltaXRpdmUgdHlwZXMgaGFuZGxlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzSW50RXZhbHVhdG9yID0gbmV3IEludEV2YWx1YXRvcigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGVFdmFsdWF0b3Igc0Zsb2F0RXZhbHVhdG9yID0gbmV3IEZsb2F0RXZhbHVhdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUV2YWx1YXRvciBzRG91YmxlRXZhbHVhdG9yID0gbmV3IERvdWJsZUV2YWx1YXRvcigpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBhbmltYXRpb24gaXMgY3VycmVudGx5IHBsYXlpbmcgaW4gcmV2ZXJzZS4gVGhpcyBjYXVzZXMgdGhlCisgICAgICogZWxhcHNlZCBmcmFjdGlvbiB0byBiZSBpbnZlcnRlZCB0byBjYWxjdWxhdGUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVBsYXlpbmdCYWNrd2FyZHMgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiB0aGF0IGlzIHBsYXlpbmcuIFdoZW4gbUN1cnJlbnRJdGVyYXRpb24gZXhjZWVkcyB0aGUKKyAgICAgKiByZXBlYXRDb3VudCAoaWYgcmVwZWF0Q291bnQhPUlORklOSVRFKSwgdGhlIGFuaW1hdGlvbiBlbmRzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRJdGVyYXRpb24gPSAwOworCisgICAgLyoqCisgICAgICogVHJhY2tzIHdoZXRoZXIgYSBzdGFydERlbGF5J2QgYW5pbWF0aW9uIGhhcyBiZWd1biBwbGF5aW5nIHRocm91Z2ggdGhlIHN0YXJ0RGVsYXkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgYW5pbWF0aW9uIGJlZ2FuIHBsYXlpbmcgdGhyb3VnaCBpdHMgc3RhcnREZWxheS4gVGhpcyBpcworICAgICAqIGRpZmZlcmVudCBmcm9tIHRoZSBtU3RhcnRUaW1lIHZhcmlhYmxlLCB3aGljaCBpcyB1c2VkIHRvIHRyYWNrIHdoZW4gdGhlIGFuaW1hdGlvbiBiZWNhbWUKKyAgICAgKiBhY3RpdmUgKHdoaWNoIGlzIHdoZW4gdGhlIHN0YXJ0RGVsYXkgZXhwaXJlZCBhbmQgdGhlIGFuaW1hdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGFjdGl2ZQorICAgICAqIGFuaW1hdGlvbnMgbGlzdCkuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1EZWxheVN0YXJ0VGltZTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhbmltYXRpb24uIFVzZWQgdG8gZmlndXJlIG91dCB3aGVuIHRvIHN0YXJ0CisgICAgICogYW4gYW5pbWF0aW9uIChpZiBzdGF0ZSA9PSBTVE9QUEVEKS4gQWxzbyB1c2VkIHRvIGVuZCBhbiBhbmltYXRpb24gdGhhdAorICAgICAqIGhhcyBiZWVuIGNhbmNlbCgpJ2Qgb3IgZW5kKCknZCBzaW5jZSB0aGUgbGFzdCBhbmltYXRpb24gZnJhbWUuIFBvc3NpYmxlIHZhbHVlcyBhcmUKKyAgICAgKiBTVE9QUEVELCBSVU5OSU5HLCBFTkRFRCwgQ0FOQ0VMRUQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb2xsZWN0aW9ucyB1c2VkIHRvIGF2b2lkIHNldCBjb2xsaXNpb25zIGFzIGFuaW1hdGlvbnMgc3RhcnQgYW5kIGVuZCB3aGlsZSBiZWluZworICAgICAqIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4gc0VuZGluZ0FuaW1zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzRGVsYXllZEFuaW1zID0gbmV3IEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBzUmVhZHlBbmltcyA9IG5ldyBBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4oKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdGhhdCBkZW5vdGVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBpcyBzZXQgdXAgYW5kIHJlYWR5IHRvIGdvLiBVc2VkIHRvCisgICAgICogc2V0IHVwIGFuaW1hdGlvbiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgLy8KKyAgICAvLyBCYWNraW5nIHZhcmlhYmxlcworICAgIC8vCisKKyAgICAvLyBIb3cgbG9uZyB0aGUgYW5pbWF0aW9uIHNob3VsZCBsYXN0IGluIG1zCisgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKKworICAgIC8vIFRoZSBhbW91bnQgb2YgdGltZSBpbiBtcyB0byBkZWxheSBzdGFydGluZyB0aGUgYW5pbWF0aW9uIGFmdGVyIHN0YXJ0KCkgaXMgY2FsbGVkCisgICAgcHJpdmF0ZSBsb25nIG1TdGFydERlbGF5ID0gMDsKKworICAgIC8vIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lcworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgc0ZyYW1lRGVsYXkgPSBERUZBVUxUX0ZSQU1FX0RFTEFZOworCisgICAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHdpbGwgcmVwZWF0LiBUaGUgZGVmYXVsdCBpcyAwLCB3aGljaCBtZWFucyB0aGUgYW5pbWF0aW9uCisgICAgLy8gd2lsbCBwbGF5IG9ubHkgb25jZQorICAgIHByaXZhdGUgaW50IG1SZXBlYXRDb3VudCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiByZXBldGl0aW9uIHRoYXQgd2lsbCBvY2N1ciB3aGVuIHJlcGVhdE1vZGUgaXMgbm9uemVyby4gUkVTVEFSVCBtZWFucyB0aGUKKyAgICAgKiBhbmltYXRpb24gd2lsbCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb24gZXZlcnkgbmV3IGN5Y2xlLiBSRVZFUlNFIG1lYW5zIHRoZSBhbmltYXRpb24KKyAgICAgKiB3aWxsIHJldmVyc2UgZGlyZWN0aW9ucyBvbiBlYWNoIGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZSA9IFJFU1RBUlQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnBvbGF0b3IgdG8gYmUgdXNlZC4gVGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhlIGFuaW1hdGlvbiB3aWxsIGJlIHBhc3NlZAorICAgICAqIHRocm91Z2ggdGhpcyBpbnRlcnBvbGF0b3IgdG8gY2FsY3VsYXRlIHRoZSBpbnRlcnBvbGF0ZWQgZnJhY3Rpb24sIHdoaWNoIGlzIHRoZW4gdXNlZCB0bworICAgICAqIGNhbGN1bGF0ZSB0aGUgYW5pbWF0ZWQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3IgPSBzRGVmYXVsdEludGVycG9sYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGlzdGVuZXJzIHRvIGJlIHNlbnQgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PEFuaW1hdG9yVXBkYXRlTGlzdGVuZXI+IG1VcGRhdGVMaXN0ZW5lcnMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5L3ZhbHVlIHNldHMgYmVpbmcgYW5pbWF0ZWQuCisgICAgICovCisgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBtVmFsdWVzOworCisgICAgLyoqCisgICAgICogQSBoYXNobWFwIG9mIHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGxvb2t1cCBhbmltYXRlZCB2YWx1ZXMKKyAgICAgKiBieSBwcm9wZXJ0eSBuYW1lIGR1cmluZyBjYWxscyB0byBnZXRBbmltYXRlZFZhbHVlKFN0cmluZykuCisgICAgICovCisgICAgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPiBtVmFsdWVzTWFwOworCisgICAgLyoqCisgICAgICogUHVibGljIGNvbnN0YW50cworICAgICAqLworCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgYW5pbWF0aW9uIHJlYWNoZXMgdGhlIGVuZCBhbmQgPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGlzIElORklOSVRFCisgICAgICogb3IgYSBwb3NpdGl2ZSB2YWx1ZSwgdGhlIGFuaW1hdGlvbiByZXN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVEFSVCA9IDE7CisgICAgLyoqCisgICAgICogV2hlbiB0aGUgYW5pbWF0aW9uIHJlYWNoZXMgdGhlIGVuZCBhbmQgPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGlzIElORklOSVRFCisgICAgICogb3IgYSBwb3NpdGl2ZSB2YWx1ZSwgdGhlIGFuaW1hdGlvbiByZXZlcnNlcyBkaXJlY3Rpb24gb24gZXZlcnkgaXRlcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVkVSU0UgPSAyOworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgdXNlZCB1c2VkIHdpdGggdGhlIHtAbGluayAjc2V0UmVwZWF0Q291bnQoaW50KX0gcHJvcGVydHkgdG8gcmVwZWF0CisgICAgICogdGhlIGFuaW1hdGlvbiBpbmRlZmluaXRlbHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSU5JVEUgPSAtMTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVmFsdWVBbmltYXRvciBvYmplY3QuIFRoaXMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcmltYXJpbHkgZm9yCisgICAgICogdXNlIGludGVybmFsbHk7IHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBwYXJhbWV0ZXJzIGFyZSBtb3JlIGdlbmVyYWxseQorICAgICAqIHVzZWZ1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWVBbmltYXRvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBhbmQgc2V0IG9mCisgICAgICogdmFsdWVzLiBJZiB0aGUgdmFsdWVzIGFyZSBhIHNldCBvZiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGVuIHRoZXNlIG9iamVjdHMKKyAgICAgKiBkZWZpbmUgdGhlIHBvdGVudGlhbGx5IG11bHRpcGxlIHByb3BlcnRpZXMgYmVpbmcgYW5pbWF0ZWQgYW5kIHRoZSB2YWx1ZXMgdGhlIHByb3BlcnRpZXMgYXJlCisgICAgICogYW5pbWF0ZWQgYmV0d2Vlbi4gT3RoZXJ3aXNlLCB0aGUgdmFsdWVzIGRlZmluZSBhIHNpbmdsZSBzZXQgb2YgdmFsdWVzIGFuaW1hdGVkIGJldHdlZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uIElmIHRoZXNlIHZhbHVlcyBhcmUgbm90CisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiB0aGVyZSBzaG91bGQgYmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSwgc2luY2UgdGhlIHZhbHVlcworICAgICAqIGRldGVybWluZSB0aGUgaW50ZXJ2YWwgdG8gYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyBWYWx1ZUFuaW1hdG9yKGxvbmcgZHVyYXRpb24sIFQuLi52YWx1ZXMpIHsKKyAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZXMsIHBlciBwcm9wZXJ0eSwgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW50ZXJuYWxseQorICAgICAqIGJ5IHRoZSBjb25zdHJ1Y3RvcnMgb2YgVmFsdWVBbmltYXRvciB0aGF0IHRha2UgYSBsaXN0IG9mIHZhbHVlcy4gQnV0IGFuIFZhbHVlQW5pbWF0b3IgY2FuCisgICAgICogYmUgY29uc3RydWN0ZWQgd2l0aG91dCB2YWx1ZXMgYW5kIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gc2V0IHRoZSB2YWx1ZXMgbWFudWFsbHkKKyAgICAgKiBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcywgcGVyIHByb3BlcnR5LCBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7CisgICAgICAgIG1WYWx1ZXMgPSB2YWx1ZXM7CisgICAgICAgIG1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSAoUHJvcGVydHlWYWx1ZXNIb2xkZXIpIHZhbHVlc1tpXTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKSwgdmFsdWVzSG9sZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlcyB0aGF0IHRoaXMgVmFsdWVBbmltYXRvciBhbmltYXRlcyBiZXR3ZWVuLiBUaGVzZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbgorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMsIGV2ZW4gaWYgdGhlIFZhbHVlQW5pbWF0b3Igd2FzIGNyZWF0ZWQgd2l0aCBhIHNpbXBsZSBsaXN0CisgICAgICogb2YgdmFsdWUgb2JqZWN0cyBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdIEFuIGFycmF5IG9mIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgd2hpY2ggaG9sZCB0aGUKKyAgICAgKiB2YWx1ZXMsIHBlciBwcm9wZXJ0eSwgdGhhdCBkZWZpbmUgdGhlIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBtVmFsdWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4gZm9yIHRoaXMgYW5pbWF0aW9uLiBJZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzCisgICAgICogYSBzZXQgb2YgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlc2Ugb2JqZWN0cyB3aWxsIGJlY29tZSB0aGUgc2V0IG9mIHByb3BlcnRpZXMKKyAgICAgKiBhbmltYXRlZCBhbmQgdGhlIHZhbHVlcyB0aGF0IHRob3NlIHByb3BlcnRpZXMgYXJlIGFuaW1hdGVkIGJldHdlZW4uIE90aGVyd2lzZSwgdGhpcyBtZXRob2QKKyAgICAgKiB3aWxsIHNldCBvbmx5IG9uZSBzZXQgb2YgdmFsdWVzIGZvciB0aGUgVmFsdWVBbmltYXRvci4gQWxzbywgaWYgdGhlIHZhbHVlcyBhcmUgbm90CisgICAgICogUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyBhbmQgaWYgdGhlcmUgYXJlIGFscmVhZHkgbXVsdGlwbGUgc2V0cyBvZgorICAgICAqIHZhbHVlcyBkZWZpbmVkIGZvciB0aGlzIFZhbHVlQW5pbWF0b3IgdmlhCisgICAgICogbW9yZSB0aGFuIG9uZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLCB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgdmFsdWVzIGZvcgorICAgICAqIHRoZSBmaXJzdCBvZiB0aG9zZSBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgc2V0IG9mIHZhbHVlcyB0byBhbmltYXRlIGJldHdlZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKFQuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmIChtVmFsdWVzID09IG51bGwgfHwgbVZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgc2V0VmFsdWVzKG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcltdeworICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXIoIiIsIChPYmplY3RbXSl2YWx1ZXMpfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciB2YWx1ZXNIb2xkZXIgPSBtVmFsdWVzWzBdOworICAgICAgICAgICAgdmFsdWVzSG9sZGVyLnNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGZpcnN0IGFuaW1hdGlvbgorICAgICAqIGZyYW1lIG9mIGFuIGFuaW1hdGlvbi4gSWYgdGhlcmUgaXMgYSBub256ZXJvIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+LCB0aGUKKyAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhhdCBkZWxheSBlbmRzLgorICAgICAqIEl0IHRha2VzIGNhcmUgb2YgdGhlIGZpbmFsIGluaXRpYWxpemF0aW9uIHN0ZXBzIGZvciB0aGUKKyAgICAgKiBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiAgPHA+T3ZlcnJpZGVzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIHRoZSBzdXBlcmNsYXNzIG1ldGhvZCB0byBlbnN1cmUKKyAgICAgKiAgdGhhdCBpbnRlcm5hbCBtZWNoYW5pc21zIGZvciB0aGUgYW5pbWF0aW9uIGFyZSBzZXQgdXAgY29ycmVjdGx5LjwvcD4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRBbmltYXRpb24oKSB7CisgICAgICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpbnQgbnVtVmFsdWVzID0gbVZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5pbml0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudEl0ZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIGFuaW1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBhbmltYXRpb24sIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gVGhpcyB0aW1lIHNob3VsZAorICAgICAqIGJlIGJldHdlZW4gMCBhbmQgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbi4gSWYKKyAgICAgKiB0aGUgYW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZCwgdGhlbiBpdCB3aWxsIG5vdCBhZHZhbmNlIGZvcndhcmQgYWZ0ZXIgaXQgaXMKKyAgICAgKiBzZXQgdG8gdGhpcyB0aW1lOyBpdCB3aWxsIHNpbXBseSBzZXQgdGhlIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUKKyAgICAgKiBhY3Rpb25zIGJhc2VkIG9uIHRoYXQgdGltZS4gSWYgdGhlIGFuaW1hdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gc2V0Q3VycmVudFBsYXlUaW1lKCkKKyAgICAgKiB3aWxsIHNldCB0aGUgY3VycmVudCBwbGF5aW5nIHRpbWUgdG8gdGhpcyB2YWx1ZSBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGxheVRpbWUgVGhlIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gd2hpY2ggdGhlIGFuaW1hdGlvbiBpcyBhZHZhbmNlZCBvciByZXdvdW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRQbGF5VGltZShsb25nIHBsYXlUaW1lKSB7CisgICAgICAgIGluaXRBbmltYXRpb24oKTsKKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIG1TZWVrVGltZSA9IHBsYXlUaW1lOworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNFRUtFRDsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSBwbGF5VGltZTsKKyAgICAgICAgYW5pbWF0aW9uRnJhbWUoY3VycmVudFRpbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiB0aW1lLCB3aGljaCBpcyBlcXVhbCB0byB0aGUgY3VycmVudAorICAgICAqIHRpbWUgbWludXMgdGhlIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQuIEFuIGFuaW1hdGlvbiB0aGF0IGlzIG5vdCB5ZXQgc3RhcnRlZCB3aWxsCisgICAgICogcmV0dXJuIGEgdmFsdWUgb2YgemVyby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGltZSBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRQbGF5VGltZSgpIHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgbVBsYXlpbmdTdGF0ZSA9PSBTVE9QUEVEKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjdXN0b20sIHN0YXRpYyBoYW5kbGVyIGhhbmRsZXMgdGhlIHRpbWluZyBwdWxzZSB0aGF0IGlzIHNoYXJlZCBieQorICAgICAqIGFsbCBhY3RpdmUgYW5pbWF0aW9ucy4gVGhpcyBhcHByb2FjaCBlbnN1cmVzIHRoYXQgdGhlIHNldHRpbmcgb2YgYW5pbWF0aW9uCisgICAgICogdmFsdWVzIHdpbGwgaGFwcGVuIG9uIHRoZSBVSSB0aHJlYWQgYW5kIHRoYXQgYWxsIGFuaW1hdGlvbnMgd2lsbCBzaGFyZQorICAgICAqIHRoZSBzYW1lIHRpbWVzIGZvciBjYWxjdWxhdGluZyB0aGVpciB2YWx1ZXMsIHdoaWNoIG1ha2VzIHN5bmNocm9uaXppbmcKKyAgICAgKiBhbmltYXRpb25zIHBvc3NpYmxlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5pbWF0aW9uSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlcmUgYXJlIG9ubHkgdHdvIG1lc3NhZ2VzIHRoYXQgd2UgY2FyZSBhYm91dDogQU5JTUFUSU9OX1NUQVJUIGFuZAorICAgICAgICAgKiBBTklNQVRJT05fRlJBTUUuIFRoZSBTVEFSVCBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhbiBhbmltYXRpb24ncyBzdGFydCgpCisgICAgICAgICAqIG1ldGhvZCBpcyBjYWxsZWQuIEl0IGNhbm5vdCBzdGFydCBzeW5jaHJvbm91c2x5IHdoZW4gc3RhcnQoKSBpcyBjYWxsZWQKKyAgICAgICAgICogYmVjYXVzZSB0aGUgY2FsbCBtYXkgYmUgb24gdGhlIHdyb25nIHRocmVhZCwgYW5kIGl0IHdvdWxkIGFsc28gbm90IGJlCisgICAgICAgICAqIHN5bmNocm9uaXplZCB3aXRoIG90aGVyIGFuaW1hdGlvbnMgYmVjYXVzZSBpdCB3b3VsZCBub3Qgc3RhcnQgb24gYSBjb21tb24KKyAgICAgICAgICogdGltaW5nIHB1bHNlLiBTbyBlYWNoIGFuaW1hdGlvbiBzZW5kcyBhIFNUQVJUIG1lc3NhZ2UgdG8gdGhlIGhhbmRsZXIsIHdoaWNoCisgICAgICAgICAqIGNhdXNlcyB0aGUgaGFuZGxlciB0byBwbGFjZSB0aGUgYW5pbWF0aW9uIG9uIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBxdWV1ZSBhbmQKKyAgICAgICAgICogc3RhcnQgcHJvY2Vzc2luZyBmcmFtZXMgZm9yIHRoYXQgYW5pbWF0aW9uLgorICAgICAgICAgKiBUaGUgRlJBTUUgbWVzc2FnZSBpcyB0aGUgb25lIHRoYXQgaXMgc2VudCBvdmVyIGFuZCBvdmVyIHdoaWxlIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgICogYWN0aXZlIGFuaW1hdGlvbnMgdG8gcHJvY2Vzcy4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBib29sZWFuIGNhbGxBZ2FpbiA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGF2b2lkIHNlbmRpbmcgZnJhbWUgbWVzc2FnZSB3aGVuIHN0YXJ0aW5nIGlmIHdlCisgICAgICAgICAgICAgICAgLy8gd2VyZSBhbHJlYWR5IHJ1bm5pbmc/CisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChzQW5pbWF0aW9ucy5zaXplKCkgPiAwIHx8IHNEZWxheWVkQW5pbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEFnYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcGVuZGluZ0FuaW1zIGhvbGRzIGFueSBhbmltYXRpb25zIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBjbGVhciBzUGVuZGluZ0FuaW1hdGlvbnMsIGJ1dCBzdGFydGluZyBhbmltYXRpb24gbWF5CisgICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlIG1vcmUgdG8gYmUgYWRkZWQgdG8gdGhlIHBlbmRpbmcgbGlzdCAoZm9yIGV4YW1wbGUsIGlmIG9uZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRpbmcgdHJpZ2dlcnMgYW5vdGhlciBzdGFydGluZykuIFNvIHdlIGxvb3AgdW50aWwgc1BlbmRpbmdBbmltYXRpb25zCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc1BlbmRpbmdBbmltYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxWYWx1ZUFuaW1hdG9yPiBwZW5kaW5nQ29weSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8VmFsdWVBbmltYXRvcj4pIHNQZW5kaW5nQW5pbWF0aW9ucy5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc1BlbmRpbmdBbmltYXRpb25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBwZW5kaW5nQ29weS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFuaW1hdG9yIGFuaW0gPSBwZW5kaW5nQ29weS5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBoYXMgYSBzdGFydERlbGF5LCBwbGFjZSBpdCBvbiB0aGUgZGVsYXllZCBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0ubVN0YXJ0RGVsYXkgPT0gMCB8fCBhbmltLm1QbGF5aW5nU3RhdGUgPT0gRU5ERUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0ubVBsYXlpbmdTdGF0ZSA9PSBDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RlbGF5ZWRBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBwcm9jZXNzIGZpcnN0IGZyYW1lIG9mIG5ldyBhbmltYXRpb25zCisgICAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fRlJBTUU6CisgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lIGhvbGRzIHRoZSBjb21tb24gdGltZSBmb3IgYWxsIGFuaW1hdGlvbnMgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGR1cmluZyB0aGlzIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0LCBwcm9jZXNzIGFuaW1hdGlvbnMgY3VycmVudGx5IHNpdHRpbmcgb24gdGhlIGRlbGF5ZWQgcXVldWUsIGFkZGluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIHRoZSBhY3RpdmUgYW5pbWF0aW9ucyBpZiB0aGV5IGFyZSByZWFkeQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtRGVsYXllZEFuaW1zID0gc0RlbGF5ZWRBbmltcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRGVsYXllZEFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYW5pbSA9IHNEZWxheWVkQW5pbXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0uZGVsYXllZEFuaW1hdGlvbkZyYW1lKGN1cnJlbnRUaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNSZWFkeUFuaW1zLmFkZChhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUmVhZHlBbmltcyA9IHNSZWFkeUFuaW1zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVJlYWR5QW5pbXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlYWR5QW5pbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYW5pbSA9IHNSZWFkeUFuaW1zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0QW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RlbGF5ZWRBbmltcy5yZW1vdmUoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzUmVhZHlBbmltcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm93IHByb2Nlc3MgYWxsIGFjdGl2ZSBhbmltYXRpb25zLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gYW5pbWF0aW9uRnJhbWUoKQorICAgICAgICAgICAgICAgICAgICAvLyB0ZWxscyB0aGUgaGFuZGxlciB3aGV0aGVyIGl0IHNob3VsZCBub3cgYmUgZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bUFuaW1zID0gc0FuaW1hdGlvbnMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFuaW1zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQW5pbWF0b3IgYW5pbSA9IHNBbmltYXRpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmltLmFuaW1hdGlvbkZyYW1lKGN1cnJlbnRUaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5hZGQoYW5pbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNFbmRpbmdBbmltcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNFbmRpbmdBbmltcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFbmRpbmdBbmltcy5nZXQoaSkuZW5kQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzRW5kaW5nQW5pbXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgb3IgZGVsYXllZCBhbmltYXRpb25zLCBjYWxsIHRoZSBoYW5kbGVyIGFnYWluCisgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRoZSBmcmFtZURlbGF5CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQWdhaW4gJiYgKCFzQW5pbWF0aW9ucy5pc0VtcHR5KCkgfHwgIXNEZWxheWVkQW5pbXMuaXNFbXB0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoQU5JTUFUSU9OX0ZSQU1FLCBzRnJhbWVEZWxheSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgdG8gZGVsYXkgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBhZnRlcgorICAgICAqIHtAbGluayAjc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBydW5uaW5nIHRoZSBhbmltYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydERlbGF5KCkgeworICAgICAgICByZXR1cm4gbVN0YXJ0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIHRvIGRlbGF5IHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KKworICAgICAqIEBwYXJhbSBzdGFydERlbGF5IFRoZSBhbW91bnQgb2YgdGhlIGRlbGF5LCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydERlbGF5KGxvbmcgc3RhcnREZWxheSkgeworICAgICAgICB0aGlzLm1TdGFydERlbGF5ID0gc3RhcnREZWxheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgYmV0d2VlbiBlYWNoIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgYQorICAgICAqIHJlcXVlc3RlZCB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGF0dGVtcHQgdG8gaG9ub3IsIGJ1dCB0aGUgYWN0dWFsIGRlbGF5IGJldHdlZW4KKyAgICAgKiBmcmFtZXMgbWF5IGJlIGRpZmZlcmVudCwgZGVwZW5kaW5nIG9uIHN5c3RlbSBsb2FkIGFuZCBjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYSBzdGF0aWMKKyAgICAgKiBmdW5jdGlvbiBiZWNhdXNlIHRoZSBzYW1lIGRlbGF5IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgYW5pbWF0aW9ucywgc2luY2UgdGhleSBhcmUgYWxsCisgICAgICogcnVuIG9mZiBvZiBhIHNpbmdsZSB0aW1pbmcgbG9vcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RnJhbWVEZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIHNGcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBiZXR3ZWVuIGVhY2ggZnJhbWUgb2YgdGhlIGFuaW1hdGlvbi4gVGhpcyBpcyBhCisgICAgICogcmVxdWVzdGVkIHRpbWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgYXR0ZW1wdCB0byBob25vciwgYnV0IHRoZSBhY3R1YWwgZGVsYXkgYmV0d2VlbgorICAgICAqIGZyYW1lcyBtYXkgYmUgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gc3lzdGVtIGxvYWQgYW5kIGNhcGFiaWxpdGllcy4gVGhpcyBpcyBhIHN0YXRpYworICAgICAqIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHNhbWUgZGVsYXkgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBhbmltYXRpb25zLCBzaW5jZSB0aGV5IGFyZSBhbGwKKyAgICAgKiBydW4gb2ZmIG9mIGEgc2luZ2xlIHRpbWluZyBsb29wLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lRGVsYXkgdGhlIHJlcXVlc3RlZCB0aW1lIGJldHdlZW4gZnJhbWVzLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RnJhbWVEZWxheShsb25nIGZyYW1lRGVsYXkpIHsKKyAgICAgICAgc0ZyYW1lRGVsYXkgPSBmcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudCB2YWx1ZSBjYWxjdWxhdGVkIGJ5IHRoaXMgPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4gd2hlbiB0aGVyZSBpcyBqdXN0IG9uZQorICAgICAqIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiBUaGlzIHZhbHVlIGlzIG9ubHkgc2Vuc2libGUgd2hpbGUgdGhlIGFuaW1hdGlvbiBpcyBydW5uaW5nLiBUaGUgbWFpbgorICAgICAqIHB1cnBvc2UgZm9yIHRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGlzIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmcm9tIHRoZSA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPgorICAgICAqIGR1cmluZyBhIGNhbGwgdG8ge0BsaW5rIEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIjb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvcil9LCB3aGljaAorICAgICAqIGlzIGNhbGxlZCBkdXJpbmcgZWFjaCBhbmltYXRpb24gZnJhbWUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbmltYXRlZFZhbHVlIFRoZSB2YWx1ZSBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiBmb3IKKyAgICAgKiB0aGUgc2luZ2xlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBwcm9wZXJ0aWVzIGJlaW5nIGFuaW1hdGVkCisgICAgICogKHNwZWNpZmllZCBieSBzZXZlcmFsIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgaW4gdGhlIGNvbnN0cnVjdG9yKSwgdGhpcyBmdW5jdGlvbgorICAgICAqIHJldHVybnMgdGhlIGFuaW1hdGVkIHZhbHVlIGZvciB0aGUgZmlyc3Qgb2YgdGhvc2Ugb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEFuaW1hdGVkVmFsdWUoKSB7CisgICAgICAgIGlmIChtVmFsdWVzICE9IG51bGwgJiYgbVZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVZhbHVlc1swXS5nZXRBbmltYXRlZFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2hvdWxkbid0IGdldCBoZXJlOyBzaG91bGQgYWx3YXlzIGhhdmUgdmFsdWVzIHVubGVzcyBWYWx1ZUFuaW1hdG9yIHdhcyBzZXQgdXAgd3JvbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1vc3QgcmVjZW50IHZhbHVlIGNhbGN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiBmb3IgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPi4KKyAgICAgKiBUaGUgbWFpbiBwdXJwb3NlIGZvciB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBpcyB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5WYWx1ZUFuaW1hdG9yPC9jb2RlPiBkdXJpbmcgYSBjYWxsIHRvCisgICAgICoge0BsaW5rIEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIjb25BbmltYXRpb25VcGRhdGUoVmFsdWVBbmltYXRvcil9LCB3aGljaAorICAgICAqIGlzIGNhbGxlZCBkdXJpbmcgZWFjaCBhbmltYXRpb24gZnJhbWUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbmltYXRlZFZhbHVlIFRoZSB2YWx1ZSBtb3N0IHJlY2VudGx5IGNhbGN1bGF0ZWQgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0eQorICAgICAqIGJ5IHRoaXMgPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBbmltYXRlZFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgdmFsdWVzSG9sZGVyID0gbVZhbHVlc01hcC5nZXQocHJvcGVydHlOYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlc0hvbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzSG9sZGVyLmdldEFuaW1hdGVkVmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEF0IGxlYXN0IGF2b2lkIGNyYXNoaW5nIGlmIGNhbGxlZCB3aXRoIGJvZ3VzIHByb3BlcnR5TmFtZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGJlIHJlcGVhdGVkLiBJZiB0aGUgcmVwZWF0CisgICAgICogY291bnQgaXMgMCwgdGhlIGFuaW1hdGlvbiBpcyBuZXZlciByZXBlYXRlZC4gSWYgdGhlIHJlcGVhdCBjb3VudCBpcworICAgICAqIGdyZWF0ZXIgdGhhbiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LCB0aGUgcmVwZWF0IG1vZGUgd2lsbCBiZSB0YWtlbgorICAgICAqIGludG8gYWNjb3VudC4gVGhlIHJlcGVhdCBjb3VudCBpcyAwIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSByZXBlYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdENvdW50KGludCB2YWx1ZSkgeworICAgICAgICBtUmVwZWF0Q291bnQgPSB2YWx1ZTsKKyAgICB9CisgICAgLyoqCisgICAgICogRGVmaW5lcyBob3cgbWFueSB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogaXMgMC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYW5pbWF0aW9uIHNob3VsZCByZXBlYXQsIG9yIHtAbGluayAjSU5GSU5JVEV9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZXBlYXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRDb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoYXQgdGhpcyBhbmltYXRpb24gc2hvdWxkIGRvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kLiBUaGlzCisgICAgICogc2V0dGluZyBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcmVwZWF0IGNvdW50IGlzIGVpdGhlciBncmVhdGVyIHRoYW4KKyAgICAgKiAwIG9yIHtAbGluayAjSU5GSU5JVEV9LiBEZWZhdWx0cyB0byB7QGxpbmsgI1JFU1RBUlR9LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAbGluayAjUkVTVEFSVH0gb3Ige0BsaW5rICNSRVZFUlNFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoaW50IHZhbHVlKSB7CisgICAgICAgIG1SZXBlYXRNb2RlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGF0IHRoaXMgYW5pbWF0aW9uIHNob3VsZCBkbyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZWl0aGVyIG9uZSBvZiB7QGxpbmsgI1JFVkVSU0V9IG9yIHtAbGluayAjUkVTVEFSVH0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7CisgICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIHNldCBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgc2VudCB1cGRhdGUgZXZlbnRzIHRocm91Z2ggdGhlIGxpZmUgb2YKKyAgICAgKiBhbiBhbmltYXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbGwgbGlzdGVuZXJzIGZvciBldmVyeSBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uLAorICAgICAqIGFmdGVyIHRoZSB2YWx1ZXMgZm9yIHRoZSBhbmltYXRpb24gaGF2ZSBiZWVuIGNhbGN1bGF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHNldCBvZiBsaXN0ZW5lcnMgZm9yIHRoaXMgYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFVwZGF0ZUxpc3RlbmVyKEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1VcGRhdGVMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVVwZGF0ZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8QW5pbWF0b3JVcGRhdGVMaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIHNldCBsaXN0ZW5pbmcgdG8gZnJhbWUgdXBkYXRlcyBmb3IgdGhpcyBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBzZXQgb2YgdXBkYXRlIGxpc3RlbmVycworICAgICAqIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVMaXN0ZW5lcihBbmltYXRvclVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVXBkYXRlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtVXBkYXRlTGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW50ZXJwb2xhdG9yIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGVsYXBzZWQgZnJhY3Rpb24gb2YgdGhpcyBhbmltYXRpb24uIFRoZQorICAgICAqIGludGVycG9sYXRvciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBydW5zIHdpdGggbGluZWFyIG9yIG5vbi1saW5lYXIgbW90aW9uLAorICAgICAqIHN1Y2ggYXMgYWNjZWxlcmF0aW9uIGFuZCBkZWNlbGVyYXRpb24uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3J9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVycG9sYXRvciB0byBiZSB1c2VkIGJ5IHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUludGVycG9sYXRvciA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGltaW5nIGludGVycG9sYXRvciB0aGF0IHRoaXMgVmFsdWVBbmltYXRvciB1c2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdGltaW5nIGludGVycG9sYXRvciBmb3IgdGhpcyBWYWx1ZUFuaW1hdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlcnBvbGF0b3IgZ2V0SW50ZXJwb2xhdG9yKCkgeworICAgICAgICByZXR1cm4gbUludGVycG9sYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBldmFsdWF0b3IgdG8gYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBhbmltYXRlZCB2YWx1ZXMgb2YgdGhpcyBhbmltYXRpb24uCisgICAgICogVGhlIHN5c3RlbSB3aWxsIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgZmxvYXQsIGludCwgb3IgZG91YmxlIGV2YWx1YXRvciBiYXNlZCBvbiB0aGUgdHlwZQorICAgICAqIG9mIDxjb2RlPnN0YXJ0VmFsdWU8L2NvZGU+IGFuZCA8Y29kZT5lbmRWYWx1ZTwvY29kZT4gaW4gdGhlIGNvbnN0cnVjdG9yLiBCdXQgaWYgdGhlc2UgdmFsdWVzCisgICAgICogYXJlIG5vdCBvbmUgb2YgdGhlc2UgcHJpbWl0aXZlIHR5cGVzLCBvciBpZiBkaWZmZXJlbnQgZXZhbHVhdGlvbiBpcyBkZXNpcmVkIChzdWNoIGFzIGlzCisgICAgICogbmVjZXNzYXJ5IHdpdGggaW50IHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvcnMpLCBhIGN1c3RvbSBldmFsdWF0b3IgbmVlZHMgdG8gYmUgYXNzaWduZWQuCisgICAgICogRm9yIGV4YW1wbGUsIHdoZW4gcnVubmluZyBhbiBhbmltYXRpb24gb24gY29sb3IgdmFsdWVzLCB0aGUge0BsaW5rIFJHQkV2YWx1YXRvcn0KKyAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBnZXQgY29ycmVjdCBSR0IgY29sb3IgaW50ZXJwb2xhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgVmFsdWVBbmltYXRvciBoYXMgb25seSBvbmUgc2V0IG9mIHZhbHVlcyBiZWluZyBhbmltYXRlZCBiZXR3ZWVuLCB0aGlzIGV2YWx1YXRvcgorICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgdGhhdCBzZXQuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHNldHMgb2YgdmFsdWVzIGJlaW5nIGFuaW1hdGVkLCB3aGljaCBpcworICAgICAqIHRoZSBjYXNlIGlmIFByb3BlcnR5VmFsdWVzSE9sZGVyIG9iamVjdHMgd2VyZSBzZXQgb24gdGhlIFZhbHVlQW5pbWF0b3IsIHRoZW4gdGhlIGV2YWx1YXRvcgorICAgICAqIGlzIGFzc2lnbmVkIGp1c3QgdG8gdGhlIGZpcnN0IFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGV2YWx1YXRvciB0byBiZSB1c2VkIHRoaXMgYW5pbWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXZhbHVhdG9yKFR5cGVFdmFsdWF0b3IgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgbVZhbHVlcyAhPSBudWxsICYmIG1WYWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbVZhbHVlc1swXS5zZXRFdmFsdWF0b3IodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGFuaW1hdGlvbiBwbGF5aW5nLiBUaGlzIHZlcnNpb24gb2Ygc3RhcnQoKSB0YWtlcyBhIGJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcworICAgICAqIHdoZXRoZXIgdGhlIGFuaW1hdGlvbiBzaG91bGQgcGxheSBpbiByZXZlcnNlLiBUaGUgZmxhZyBpcyB1c3VhbGx5IGZhbHNlLCBidXQgbWF5IGJlIHNldAorICAgICAqIHRvIHRydWUgaWYgY2FsbGVkIGZyb20gdGhlIHJldmVyc2UoKSBtZXRob2QvCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGxheUJhY2t3YXJkcyBXaGV0aGVyIHRoZSBWYWx1ZUFuaW1hdG9yIHNob3VsZCBzdGFydCBwbGF5aW5nIGluIHJldmVyc2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KGJvb2xlYW4gcGxheUJhY2t3YXJkcykgeworICAgICAgICBtUGxheWluZ0JhY2t3YXJkcyA9IHBsYXlCYWNrd2FyZHM7CisgICAgICAgIGlmICgobVN0YXJ0RGVsYXkgPT0gMCkgJiYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gTG9vcGVyLmdldE1haW5Mb29wZXIoKS5nZXRUaHJlYWQoKSkpIHsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25TdGFydCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGlzIHNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGFuaW1hdGlvbiwgcHJpb3IgdG8gYWN0dWFsbHkgc3RhcnRpbmcgaXQgcnVubmluZworICAgICAgICAgICAgc2V0Q3VycmVudFBsYXlUaW1lKGdldEN1cnJlbnRQbGF5VGltZSgpKTsKKyAgICAgICAgfQorICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgbVN0YXJ0ZWREZWxheSA9IGZhbHNlOworICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuYWRkKHRoaXMpOworICAgICAgICBpZiAoc0FuaW1hdGlvbkhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIgPSBuZXcgQW5pbWF0aW9uSGFuZGxlcigpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGRvZXMgdGhpcyBwdXQgdG9vIG1hbnkgbWVzc2FnZXMgb24gdGhlIHF1ZXVlIGlmIHRoZSBoYW5kbGVyCisgICAgICAgIC8vIGlzIGFscmVhZHkgcnVubmluZz8KKyAgICAgICAgc0FuaW1hdGlvbkhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShBTklNQVRJT05fU1RBUlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBzdGFydChmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICBpZiAobUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4gdG1wTGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPikgbUxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICAgICAgZm9yIChBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyIDogdG1wTGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIub25BbmltYXRpb25DYW5jZWwodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSnVzdCBzZXQgdGhlIENBTkNFTEVEIGZsYWcgLSB0aGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGVuZCB0aGUgbmV4dCB0aW1lIGEgZnJhbWUKKyAgICAgICAgLy8gaXMgcHJvY2Vzc2VkLgorICAgICAgICBtUGxheWluZ1N0YXRlID0gQ0FOQ0VMRUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZW5kKCkgeworICAgICAgICBpZiAoIXNBbmltYXRpb25zLmNvbnRhaW5zKHRoaXMpICYmICFzUGVuZGluZ0FuaW1hdGlvbnMuY29udGFpbnModGhpcykpIHsKKyAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBpZiB0aGUgYW5pbWF0aW9uIGhhcyBub3QgeWV0IHN0YXJ0ZWQ7IGdldCBpdCByZWFkeSBmb3IgZW5kaW5nCisgICAgICAgICAgICBtU3RhcnRlZERlbGF5ID0gZmFsc2U7CisgICAgICAgICAgICBzUGVuZGluZ0FuaW1hdGlvbnMuYWRkKHRoaXMpOworICAgICAgICAgICAgaWYgKHNBbmltYXRpb25IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzQW5pbWF0aW9uSGFuZGxlciA9IG5ldyBBbmltYXRpb25IYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzQW5pbWF0aW9uSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEFOSU1BVElPTl9TVEFSVCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSnVzdCBzZXQgdGhlIEVOREVEIGZsYWcgLSB0aGlzIGNhdXNlcyB0aGUgYW5pbWF0aW9uIHRvIGVuZCB0aGUgbmV4dCB0aW1lIGEgZnJhbWUKKyAgICAgICAgLy8gaXMgcHJvY2Vzc2VkLgorICAgICAgICBtUGxheWluZ1N0YXRlID0gRU5ERUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworICAgICAgICAvLyBFTkRFRCBvciBDQU5DRUxFRCBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBiZWVuIGVuZGVkIG9yIGNhbmNlbGVkLCBidXQgbm90IHByb2Nlc3NlZCB5ZXQKKyAgICAgICAgcmV0dXJuIChtUGxheWluZ1N0YXRlID09IFJVTk5JTkcgfHwgbVBsYXlpbmdTdGF0ZSA9PSBFTkRFRCB8fCBtUGxheWluZ1N0YXRlID09IENBTkNFTEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQbGF5cyB0aGUgVmFsdWVBbmltYXRvciBpbiByZXZlcnNlLiBJZiB0aGUgYW5pbWF0aW9uIGlzIGFscmVhZHkgcnVubmluZywKKyAgICAgKiBpdCB3aWxsIHN0b3AgaXRzZWxmIGFuZCBwbGF5IGJhY2t3YXJkcyBmcm9tIHRoZSBwb2ludCByZWFjaGVkIHdoZW4gcmV2ZXJzZSB3YXMgY2FsbGVkLgorICAgICAqIElmIHRoZSBhbmltYXRpb24gaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIGl0IHdpbGwgc3RhcnQgZnJvbSB0aGUgZW5kIGFuZAorICAgICAqIHBsYXkgYmFja3dhcmRzLiBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgc2V0IGZvciB0aGUgY3VycmVudCBhbmltYXRpb247IGZ1dHVyZSBwbGF5aW5nCisgICAgICogb2YgdGhlIGFuaW1hdGlvbiB3aWxsIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBwbGF5aW5nIGZvcndhcmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV2ZXJzZSgpIHsKKyAgICAgICAgbVBsYXlpbmdCYWNrd2FyZHMgPSAhbVBsYXlpbmdCYWNrd2FyZHM7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9uZyBjdXJyZW50UGxheVRpbWUgPSBjdXJyZW50VGltZSAtIG1TdGFydFRpbWU7CisgICAgICAgICAgICBsb25nIHRpbWVMZWZ0ID0gbUR1cmF0aW9uIC0gY3VycmVudFBsYXlUaW1lOworICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IHRvIGVuZCBhbiBhbmltYXRpb24gYnkgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgYW5pbWF0aW9ucyBsaXN0LiBNdXN0IGJlCisgICAgICogY2FsbGVkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZEFuaW1hdGlvbigpIHsKKyAgICAgICAgc0FuaW1hdGlvbnMucmVtb3ZlKHRoaXMpOworICAgICAgICBtUGxheWluZ1N0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+IHRtcExpc3RlbmVycyA9CisgICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3Q8QW5pbWF0b3JMaXN0ZW5lcj4pIG1MaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IHRtcExpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGludGVybmFsbHkgdG8gc3RhcnQgYW4gYW5pbWF0aW9uIGJ5IGFkZGluZyBpdCB0byB0aGUgYWN0aXZlIGFuaW1hdGlvbnMgbGlzdC4gTXVzdCBiZQorICAgICAqIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgaW5pdEFuaW1hdGlvbigpOworICAgICAgICBzQW5pbWF0aW9ucy5hZGQodGhpcyk7CisgICAgICAgIGlmIChtU3RhcnREZWxheSA+IDAgJiYgbUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBMaXN0ZW5lcnMgd2VyZSBhbHJlYWR5IG5vdGlmaWVkIGluIHN0YXJ0KCkgaWYgc3RhcnREZWxheSBpcyAwOyB0aGlzIGlzCisgICAgICAgICAgICAvLyBqdXN0IGZvciBkZWxheWVkIGFuaW1hdGlvbnMKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvckxpc3RlbmVyPiB0bXBMaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0PEFuaW1hdG9yTGlzdGVuZXI+KSBtTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICBmb3IgKEFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIgOiB0bXBMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblN0YXJ0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgZnVuY3Rpb24gY2FsbGVkIHRvIHByb2Nlc3MgYW4gYW5pbWF0aW9uIGZyYW1lIG9uIGFuIGFuaW1hdGlvbiB0aGF0IGlzIGN1cnJlbnRseQorICAgICAqIHNsZWVwaW5nIHRocm91Z2ggaXRzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IHBoYXNlLiBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGl0CisgICAgICogc2hvdWxkIGJlIHdva2VuIHVwIGFuZCBwdXQgb24gdGhlIGFjdGl2ZSBhbmltYXRpb25zIHF1ZXVlLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB0aW1lLCB1c2VkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgKiBoYXMgZXhjZWVkZWQgaXRzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IGFuZCBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbidzIDxjb2RlPnN0YXJ0RGVsYXk8L2NvZGU+IGhhcyBiZWVuIGV4Y2VlZGVkIGFuZCB0aGUgYW5pbWF0aW9uCisgICAgICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXQgb2YgYWN0aXZlIGFuaW1hdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGF5ZWRBbmltYXRpb25GcmFtZShsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGlmIChtUGxheWluZ1N0YXRlID09IENBTkNFTEVEIHx8IG1QbGF5aW5nU3RhdGUgPT0gRU5ERUQpIHsKKyAgICAgICAgICAgIC8vIGVuZCB0aGUgZGVsYXksIHByb2Nlc3MgYW4gYW5pbWF0aW9uIGZyYW1lIHRvIGFjdHVhbGx5IGNhbmNlbCBpdAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU3RhcnRlZERlbGF5KSB7CisgICAgICAgICAgICBtU3RhcnRlZERlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EZWxheVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9uZyBkZWx0YVRpbWUgPSBjdXJyZW50VGltZSAtIG1EZWxheVN0YXJ0VGltZTsKKyAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgPiBtU3RhcnREZWxheSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0RGVsYXkgZW5kZWQgLSBzdGFydCB0aGUgYW5pbSBhbmQgcmVjb3JkIHRoZQorICAgICAgICAgICAgICAgIC8vIG1TdGFydFRpbWUgYXBwcm9wcmlhdGVseQorICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZSAtIChkZWx0YVRpbWUgLSBtU3RhcnREZWxheSk7CisgICAgICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFJVTk5JTkc7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgc2luZ2xlIGFuaW1hdGlvbiBmcmFtZSBmb3IgYSBnaXZlbiBhbmltYXRpb24uIFRoZQorICAgICAqIGN1cnJlbnRUaW1lIHBhcmFtZXRlciBpcyB0aGUgdGltaW5nIHB1bHNlIHNlbnQgYnkgdGhlIGhhbmRsZXIsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQorICAgICAqIGVsYXBzZWQgZHVyYXRpb24sIGFuZCB0aGVyZWZvcmUKKyAgICAgKiB0aGUgZWxhcHNlZCBmcmFjdGlvbiwgb2YgdGhlIGFuaW1hdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYW5pbWF0aW9uCisgICAgICogc2hvdWxkIGJlIGVuZGVkICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgYW5pbWF0aW9uIGV4Y2VlZHMgdGhlCisgICAgICogYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyB0aGUgcmVwZWF0Q291bnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUaW1lIFRoZSBjdXJyZW50IHRpbWUsIGFzIHRyYWNrZWQgYnkgdGhlIHN0YXRpYyB0aW1pbmcgaGFuZGxlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGluY2x1ZGluZyBhbnkgcmVwZXRpdGlvbnMgZHVlIHRvCisgICAgICogPGNvZGU+cmVwZWF0Q291bnQ8L2NvZGU+IGhhcyBiZWVuIGV4Y2VlZGVkIGFuZCB0aGUgYW5pbWF0aW9uIHNob3VsZCBiZSBlbmRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYW5pbWF0aW9uRnJhbWUobG9uZyBjdXJyZW50VGltZSkgeworICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKworICAgICAgICBpZiAobVBsYXlpbmdTdGF0ZSA9PSBTVE9QUEVEKSB7CisgICAgICAgICAgICBtUGxheWluZ1N0YXRlID0gUlVOTklORzsKKyAgICAgICAgICAgIGlmIChtU2Vla1RpbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gY3VycmVudFRpbWUgLSBtU2Vla1RpbWU7CisgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UncmUgcGxheWluZywgcmVzZXQgdGhlIHNlZWsgdGltZQorICAgICAgICAgICAgICAgIG1TZWVrVGltZSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobVBsYXlpbmdTdGF0ZSkgeworICAgICAgICBjYXNlIFJVTk5JTkc6CisgICAgICAgIGNhc2UgU0VFS0VEOgorICAgICAgICAgICAgZmxvYXQgZnJhY3Rpb24gPSAoZmxvYXQpKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyBtRHVyYXRpb247CisgICAgICAgICAgICBpZiAoZnJhY3Rpb24gPj0gMWYpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRJdGVyYXRpb24gPCBtUmVwZWF0Q291bnQgfHwgbVJlcGVhdENvdW50ID09IElORklOSVRFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRpbWUgdG8gcmVwZWF0CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQW5pbWF0b3JMaXN0ZW5lciBsaXN0ZW5lciA6IG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkFuaW1hdGlvblJlcGVhdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK21DdXJyZW50SXRlcmF0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVWRVJTRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmdCYWNrd2FyZHMgPSBtUGxheWluZ0JhY2t3YXJkcyA/IGZhbHNlIDogdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkb2Vzbid0IGFjY291bnQgZm9yIGZyYWN0aW9uIGdvaW5nIFdheXl5eXkgb3ZlciAxLCBsaWtlIDIrCisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gZnJhY3Rpb24gLSAxZjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSArPSBtRHVyYXRpb247CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gTWF0aC5taW4oZnJhY3Rpb24sIDEuMGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGxheWluZ0JhY2t3YXJkcykgeworICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMWYgLSBmcmFjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFuaW1hdGVWYWx1ZShmcmFjdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTkRFRDoKKyAgICAgICAgICAgIC8vIFRoZSBmaW5hbCB2YWx1ZSBzZXQgb24gdGhlIHRhcmdldCB2YXJpZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIC8vIHdhcyBzdXBwb3NlZCB0byByZXBlYXQgYW4gb2RkIG51bWJlciBvZiB0aW1lcworICAgICAgICAgICAgaWYgKG1SZXBlYXRDb3VudCA+IDAgJiYgKG1SZXBlYXRDb3VudCAmIDB4MDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlVmFsdWUoMGYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlVmFsdWUoMWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNldCBkb25lIGZsYWcKKyAgICAgICAgY2FzZSBDQU5DRUxFRDoKKyAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgbVBsYXlpbmdTdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb25lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBlbGFwc2VkIGZyYWN0aW9uIG9mIHRoZSBhbmltYXRpb24gZHVyaW5nIGV2ZXJ5CisgICAgICogYW5pbWF0aW9uIGZyYW1lLiBUaGlzIGZ1bmN0aW9uIHR1cm5zIHRoZSBlbGFwc2VkIGZyYWN0aW9uIGludG8gYW4gaW50ZXJwb2xhdGVkIGZyYWN0aW9uCisgICAgICogYW5kIHRoZW4gaW50byBhbiBhbmltYXRlZCB2YWx1ZSAoZnJvbSB0aGUgZXZhbHVhdG9yLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIG1vc3RseSBkdXJpbmcKKyAgICAgKiBhbmltYXRpb24gdXBkYXRlcywgYnV0IGl0IGlzIGFsc28gY2FsbGVkIHdoZW4gdGhlIDxjb2RlPmVuZCgpPC9jb2RlPgorICAgICAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdG8gc2V0IHRoZSBmaW5hbCB2YWx1ZSBvbiB0aGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD5PdmVycmlkZXMgb2YgdGhpcyBtZXRob2QgbXVzdCBjYWxsIHRoZSBzdXBlcmNsYXNzIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9uCisgICAgICogb2YgdGhlIGFuaW1hdGVkIHZhbHVlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFjdGlvbiBUaGUgZWxhcHNlZCBmcmFjdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqLworICAgIHZvaWQgYW5pbWF0ZVZhbHVlKGZsb2F0IGZyYWN0aW9uKSB7CisgICAgICAgIGZyYWN0aW9uID0gbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKGZyYWN0aW9uKTsKKyAgICAgICAgaW50IG51bVZhbHVlcyA9IG1WYWx1ZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICBtVmFsdWVzW2ldLmNhbGN1bGF0ZVZhbHVlKGZyYWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVVwZGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbnVtTGlzdGVuZXJzID0gbVVwZGF0ZUxpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgbVVwZGF0ZUxpc3RlbmVycy5nZXQoaSkub25BbmltYXRpb25VcGRhdGUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFsdWVBbmltYXRvciBjbG9uZSgpIHsKKyAgICAgICAgZmluYWwgVmFsdWVBbmltYXRvciBhbmltID0gKFZhbHVlQW5pbWF0b3IpIHN1cGVyLmNsb25lKCk7CisgICAgICAgIGlmIChtVXBkYXRlTGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPiBvbGRMaXN0ZW5lcnMgPSBtVXBkYXRlTGlzdGVuZXJzOworICAgICAgICAgICAgYW5pbS5tVXBkYXRlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxBbmltYXRvclVwZGF0ZUxpc3RlbmVyPigpOworICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IG9sZExpc3RlbmVycy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpc3RlbmVyczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tVXBkYXRlTGlzdGVuZXJzLmFkZChvbGRMaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhbmltLm1TZWVrVGltZSA9IC0xOworICAgICAgICBhbmltLm1QbGF5aW5nQmFja3dhcmRzID0gZmFsc2U7CisgICAgICAgIGFuaW0ubUN1cnJlbnRJdGVyYXRpb24gPSAwOworICAgICAgICBhbmltLm1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBhbmltLm1QbGF5aW5nU3RhdGUgPSBTVE9QUEVEOworICAgICAgICBhbmltLm1TdGFydGVkRGVsYXkgPSBmYWxzZTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXJbXSBvbGRWYWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBpZiAob2xkVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBudW1WYWx1ZXMgPSBvbGRWYWx1ZXMubGVuZ3RoOworICAgICAgICAgICAgYW5pbS5tVmFsdWVzID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW251bVZhbHVlc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgICAgICAgICAgYW5pbS5tVmFsdWVzW2ldID0gb2xkVmFsdWVzW2ldLmNsb25lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmltLm1WYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5VmFsdWVzSG9sZGVyPihudW1WYWx1ZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbaV07CisgICAgICAgICAgICAgICAgYW5pbS5tVmFsdWVzTWFwLnB1dCh2YWx1ZXNIb2xkZXIuZ2V0UHJvcGVydHlOYW1lKCksIHZhbHVlc0hvbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBhZGQgdGhlbXNlbHZlcyBhcyB1cGRhdGUgbGlzdGVuZXJzCisgICAgICogdG8gYW4gPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4gaW5zdGFuY2UgdG8gcmVjZWl2ZSBjYWxsYmFja3Mgb24gZXZlcnkgYW5pbWF0aW9uCisgICAgICogZnJhbWUsIGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lJ3MgdmFsdWVzIGhhdmUgYmVlbiBjYWxjdWxhdGVkIGZvciB0aGF0CisgICAgICogPGNvZGU+VmFsdWVBbmltYXRvcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5Ob3RpZmllcyB0aGUgb2NjdXJyZW5jZSBvZiBhbm90aGVyIGZyYW1lIG9mIHRoZSBhbmltYXRpb24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYW5pbWF0aW9uIFRoZSBhbmltYXRpb24gd2hpY2ggd2FzIHJlcGVhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbik7CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL3BhY2thZ2UuaHRtbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2NjY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw2IEBACis8aHRtbD4KKzxib2R5PgorUHJvdmlkZXMgY2xhc3NlcyBmb3IgYW5pbWF0aW5nIHZhbHVlcyBvdmVyIHRpbWUsIGFuZCBzZXR0aW5nIHRob3NlIHZhbHVlcyBvbiB0YXJnZXQKK29iamVjdHMuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMmUzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgY29udGV4dHVhbCBBY3Rpb25CYXIuCisgKiBUaGUgQWN0aW9uQmFyIGFjdHMgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIHRpdGxlIGJhciBpbiBBY3Rpdml0aWVzLgorICogSXQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgY3JlYXRpbmcgdG9vbGJhciBhY3Rpb25zIGFzIHdlbGwgYXMKKyAqIG1ldGhvZHMgb2YgbmF2aWdhdGluZyBhcm91bmQgYW4gYXBwbGljYXRpb24uIAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQmFyIHsKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuIENvbnNpc3RzIG9mIGVpdGhlciBhIGxvZ28gb3IgaWNvbgorICAgICAqIGFuZCB0aXRsZSB0ZXh0IHdpdGggYW4gb3B0aW9uYWwgc3VidGl0bGUuIENsaWNraW5nIGFueSBvZiB0aGVzZSBlbGVtZW50cworICAgICAqIHdpbGwgZGlzcGF0Y2ggb25BY3Rpb25JdGVtU2VsZWN0ZWQgdG8gdGhlIHJlZ2lzdGVyZWQgQ2FsbGJhY2sgd2l0aAorICAgICAqIGEgTWVudUl0ZW0gd2l0aCBpdGVtIElEIGFuZHJvaWQuUi5pZC5ob21lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9TVEFOREFSRCA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogRHJvcGRvd24gbGlzdCBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBkcm9wZG93biBtZW51IGZvciBuYXZpZ2F0aW9uIHdpdGhpbiB0aGUgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1QgPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFRhYiBuYXZpZ2F0aW9uIG1vZGUuIEluc3RlYWQgb2Ygc3RhdGljIHRpdGxlIHRleHQgdGhpcyBtb2RlCisgICAgICogcHJlc2VudHMgYSBzZXJpZXMgb2YgdGFicyBmb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRJT05fTU9ERV9UQUJTID0gMjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbmF2aWdhdGlvbiBtb2RlLiBUaGlzIG5hdmlnYXRpb24gbW9kZSBpcyBzZXQgaW1wbGljaXRseSB3aGVuZXZlcgorICAgICAqIGEgY3VzdG9tIG5hdmlnYXRpb24gdmlldyBpcyBzZXQuIFNlZSB7QGxpbmsgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZJR0FUSU9OX01PREVfQ1VTVE9NID0gMzsKKworICAgIC8qKgorICAgICAqIFVzZSBsb2dvIGluc3RlYWQgb2YgaWNvbiBpZiBhdmFpbGFibGUuIFRoaXMgZmxhZyB3aWxsIGNhdXNlIGFwcHJvcHJpYXRlCisgICAgICogbmF2aWdhdGlvbiBtb2RlcyB0byB1c2UgYSB3aWRlciBsb2dvIGluIHBsYWNlIG9mIHRoZSBzdGFuZGFyZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfVVNFX0xPR08gPSAweDE7CisgICAgCisgICAgLyoqCisgICAgICogSGlkZSAnaG9tZScgZWxlbWVudHMgaW4gdGhpcyBhY3Rpb24gYmFyLCBsZWF2aW5nIG1vcmUgc3BhY2UgZm9yIG90aGVyCisgICAgICogbmF2aWdhdGlvbiBlbGVtZW50cy4gVGhpcyBpbmNsdWRlcyBsb2dvIGFuZCBpY29uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfSElERV9IT01FID0gMHgyOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gY3VzdG9tIG5hdmlnYXRpb24gbW9kZSwgc3VwcGx5aW5nIGEgdmlldworICAgICAqIGZvciBjdXN0b20gbmF2aWdhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBDdXN0b20gbmF2aWdhdGlvbiB2aWV3cyBhcHBlYXIgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gaWNvbiBhbmQKKyAgICAgKiBhbnkgYWN0aW9uIGJ1dHRvbnMgYW5kIG1heSB1c2UgYW55IHNwYWNlIGF2YWlsYWJsZSB0aGVyZS4gQ29tbW9uCisgICAgICogdXNlIGNhc2VzIGZvciBjdXN0b20gbmF2aWdhdGlvbiB2aWV3cyBtaWdodCBpbmNsdWRlIGFuIGF1dG8tc3VnZ2VzdGluZworICAgICAqIGFkZHJlc3MgYmFyIGZvciBhIGJyb3dzZXIgb3Igb3RoZXIgbmF2aWdhdGlvbiBtZWNoYW5pc21zIHRoYXQgZG8gbm90CisgICAgICogdHJhbnNsYXRlIHdlbGwgdG8gcHJvdmlkZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmlldyBDdXN0b20gbmF2aWdhdGlvbiB2aWV3IHRvIHBsYWNlIGluIHRoZSBBY3Rpb25CYXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tTmF2aWdhdGlvbk1vZGUoVmlldyB2aWV3KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBkcm9wZG93biBuYXZpZ2F0aW9uIG1vZGUgYW5kIHN1cHBseSBhbiBhZGFwdGVyCisgICAgICogdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgZm9yIG5hdmlnYXRpb24gY2hvaWNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhZGFwdGVyIHRoYXQgd2lsbCBwcm92aWRlIHZpZXdzIGJvdGggdG8gZGlzcGxheQorICAgICAqICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gc2VsZWN0aW9uIGFuZCBwb3B1bGF0ZSB2aWV3cworICAgICAqICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgZHJvcGRvd24gbmF2aWdhdGlvbiBtZW51LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIE5hdmlnYXRpb25DYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBldmVudHMgd2hlbiB0aGUgdXNlcgorICAgICAqICAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbmF2aWdhdGlvbiBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBkcm9wZG93biBuYXZpZ2F0aW9uIG1vZGUgYW5kIHN1cHBseSBhbiBhZGFwdGVyIHRoYXQgd2lsbAorICAgICAqIHByb3ZpZGUgdmlld3MgZm9yIG5hdmlnYXRpb24gY2hvaWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFkYXB0ZXIgdGhhdCB3aWxsIHByb3ZpZGUgdmlld3MgYm90aCB0byBkaXNwbGF5IHRoZSBjdXJyZW50CisgICAgICogICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBzZWxlY3Rpb24gYW5kIHBvcHVsYXRlIHZpZXdzIHdpdGhpbiB0aGUgZHJvcGRvd24KKyAgICAgKiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIG1lbnUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgTmF2aWdhdGlvbkNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyB3aGVuIHRoZSB1c2VyCisgICAgICogICAgICAgICAgICAgICAgIHNlbGVjdHMgYSBuYXZpZ2F0aW9uIGl0ZW0uCisgICAgICogQHBhcmFtIGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uIFBvc2l0aW9uIHdpdGhpbiB0aGUgcHJvdmlkZWQgYWRhcHRlciB0aGF0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBmcm9tIHRoZSBvdXRzZXQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBpbnQgZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWxlY3RlZCBuYXZpZ2F0aW9uIGl0ZW0gaW4gZHJvcGRvd24gb3IgdGFiYmVkIG5hdmlnYXRpb24gbW9kZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGl0ZW0gdG8gc2VsZWN0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFNlbGVjdGVkTmF2aWdhdGlvbkl0ZW0oaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlbGVjdGVkIG5hdmlnYXRpb24gaXRlbSBpbiBkcm9wZG93biBvciB0YWJiZWQgbmF2aWdhdGlvbiBtb2Rlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUG9zaXRpb24gb2YgdGhlIHNlbGVjdGVkIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjdGlvbiBiYXIgaW50byBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUsIHVzaW5nIHRoZSBjdXJyZW50bHkgc2V0IHRpdGxlCisgICAgICogYW5kL29yIHN1YnRpdGxlLgorICAgICAqCisgICAgICogU3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlIGlzIGRlZmF1bHQuIFRoZSB0aXRsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byB0aGUgbmFtZSBvZgorICAgICAqIHlvdXIgQWN0aXZpdHkgb24gc3RhcnR1cCBpZiBhbiBhY3Rpb24gYmFyIGlzIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3MgdGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIHRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyJ3Mgc3VidGl0bGUuIFRoaXMgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpbiBzdGFuZGFyZCBuYXZpZ2F0aW9uIG1vZGUuCisgICAgICogU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgc3VidGl0bGUgZW50aXJlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VidGl0bGUgU3VidGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShpbnQpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWN0aW9uIGJhcidzIHN1YnRpdGxlLiBUaGlzIHdpbGwgb25seSBiZSBkaXNwbGF5ZWQgaW4gc3RhbmRhcmQgbmF2aWdhdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFJlc291cmNlIElEIG9mIHN1YnRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IGRpc3BsYXkgb3B0aW9ucy4gVGhpcyBjaGFuZ2VzIGFsbCBkaXNwbGF5IG9wdGlvbiBiaXRzIGF0IG9uY2UuIFRvIGNoYW5nZQorICAgICAqIGEgbGltaXRlZCBzdWJzZXQgb2YgZGlzcGxheSBvcHRpb25zLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQsIGludCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvcHRpb25zIEEgY29tYmluYXRpb24gb2YgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgRElTUExBWV8gY29uc3RhbnRzCisgICAgICogICAgICAgICAgICAgICAgZGVmaW5lZCBpbiBBY3Rpb25CYXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpOworICAgIAorICAgIC8qKgorICAgICAqIFNldCBzZWxlY3RlZCBkaXNwbGF5IG9wdGlvbnMuIE9ubHkgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGJ5IG1hc2sgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAqIFRvIGNoYW5nZSBhbGwgZGlzcGxheSBvcHRpb24gYml0cyBhdCBvbmNlLCBzZWUge0BsaW5rICNzZXREaXNwbGF5T3B0aW9ucyhpbnQpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5FeGFtcGxlOiBzZXREaXNwbGF5T3B0aW9ucygwLCBESVNQTEFZX0hJREVfSE9NRSkgd2lsbCBkaXNhYmxlIHRoZQorICAgICAqIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IG9wdGlvbi4KKyAgICAgKiBzZXREaXNwbGF5T3B0aW9ucyhESVNQTEFZX0hJREVfSE9NRSwgRElTUExBWV9ISURFX0hPTUUgfCBESVNQTEFZX1VTRV9MT0dPKQorICAgICAqIHdpbGwgZW5hYmxlIHtAbGluayAjRElTUExBWV9ISURFX0hPTUV9IGFuZCBkaXNhYmxlIHtAbGluayAjRElTUExBWV9VU0VfTE9HT30uCisgICAgICogCisgICAgICogQHBhcmFtIG9wdGlvbnMgQSBjb21iaW5hdGlvbiBvZiB0aGUgYml0cyBkZWZpbmVkIGJ5IHRoZSBESVNQTEFZXyBjb25zdGFudHMKKyAgICAgKiAgICAgICAgICAgICAgICBkZWZpbmVkIGluIEFjdGlvbkJhci4KKyAgICAgKiBAcGFyYW0gbWFzayBBIGJpdCBtYXNrIGRlY2xhcmluZyB3aGljaCBkaXNwbGF5IG9wdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMsIGludCBtYXNrKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEFjdGlvbkJhcidzIGJhY2tncm91bmQuCisgICAgICogCisgICAgICogQHBhcmFtIGQgQmFja2dyb3VuZCBkcmF3YWJsZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSBuYXZpZ2F0aW9uIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tTmF2aWdhdGlvblZpZXcoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IEFjdGlvbkJhciB0aXRsZSBpbiBzdGFuZGFyZCBtb2RlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB7QGxpbmsgI2dldE5hdmlnYXRpb25Nb2RlKCl9IHdvdWxkIG5vdCByZXR1cm4KKyAgICAgKiB7QGxpbmsgI05BVklHQVRJT05fTU9ERV9TVEFOREFSRH0uIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBBY3Rpb25CYXIgdGl0bGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBBY3Rpb25CYXIgc3VidGl0bGUgaW4gc3RhbmRhcmQgbW9kZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYge0BsaW5rICNnZXROYXZpZ2F0aW9uTW9kZSgpfSB3b3VsZCBub3QgcmV0dXJuCisgICAgICoge0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQWN0aW9uQmFyIHN1YnRpdGxlIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgcmVzdWx0IHdpbGwgYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfU1RBTkRBUkR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI05BVklHQVRJT05fTU9ERV9UQUJTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTkFWSUdBVElPTl9NT0RFX0NVU1RPTX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKCkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAc2VlICNzZXRTdGFuZGFyZE5hdmlnYXRpb25Nb2RlKENoYXJTZXF1ZW5jZSwgQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIpCisgICAgICogQHNlZSAjc2V0VGFiTmF2aWdhdGlvbk1vZGUoKQorICAgICAqIEBzZWUgI3NldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXROYXZpZ2F0aW9uTW9kZSgpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2V0IG9mIGRpc3BsYXkgb3B0aW9ucy4gCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBnZXREaXNwbGF5T3B0aW9ucygpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2FkZFRhYihUYWIpCisgICAgICogQHNlZSAjaW5zZXJ0VGFiKFRhYiwgaW50KQorICAgICAqIEBzZWUgI3JlbW92ZVRhYihUYWIpCisgICAgICogQHNlZSAjcmVtb3ZlVGFiQXQoaW50KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgVGFifS4KKyAgICAgKiBUaGlzIHRhYiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uIGJhciB1bnRpbCBpdCBpcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBuZXcgVGFiCisgICAgICoKKyAgICAgKiBAc2VlICNhZGRUYWIoVGFiKQorICAgICAqIEBzZWUgI2luc2VydFRhYihUYWIsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGFiIG5ld1RhYigpOworCisgICAgLyoqCisgICAgICogQWRkIGEgdGFiIGZvciB1c2UgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZS4gVGhlIHRhYiB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRhYiB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUYWIoVGFiIHRhYik7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB0YWIgZm9yIHVzZSBpbiB0YWJiZWQgbmF2aWdhdGlvbiBtb2RlLiBUaGUgdGFiIHdpbGwgYmUgaW5zZXJ0ZWQgYXQKKyAgICAgKiA8Y29kZT5wb3NpdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gYWRkCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIHRhYgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlVGFiKFRhYiB0YWIpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdGFiIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIHRhYiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogU2VsZWN0IHRoZSBzcGVjaWZpZWQgdGFiLiBJZiBpdCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIGFjdGlvbiBiYXIgaXQgd2lsbCBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWIgVGFiIHRvIHNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbGVjdFRhYihUYWIgdGFiKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIgaWYgaW4gdGFiYmVkIG5hdmlnYXRpb24gbW9kZSBhbmQgdGhlcmUgaXMgYXQgbGVhc3QKKyAgICAgKiBvbmUgdGFiIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGFiIG9yIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGFiIGdldFNlbGVjdGVkVGFiKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIEFjdGlvbkJhci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEFjdGlvbkJhcidzIGhlaWdodAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SGVpZ2h0KCk7CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBBY3Rpb25CYXIgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nLgorICAgICAqIElmIHRoZSB3aW5kb3cgaG9zdGluZyB0aGUgQWN0aW9uQmFyIGRvZXMgbm90IGhhdmUgdGhlIGZlYXR1cmUKKyAgICAgKiB7QGxpbmsgV2luZG93I0ZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZfSBpdCB3aWxsIHJlc2l6ZSBhcHBsaWNhdGlvbgorICAgICAqIGNvbnRlbnQgdG8gZml0IHRoZSBuZXcgc3BhY2UgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNob3coKTsKKworICAgIC8qKgorICAgICAqIEhpZGUgdGhlIEFjdGlvbkJhciBpZiBpdCBpcyBub3QgY3VycmVudGx5IHNob3dpbmcuCisgICAgICogSWYgdGhlIHdpbmRvdyBob3N0aW5nIHRoZSBBY3Rpb25CYXIgZG9lcyBub3QgaGF2ZSB0aGUgZmVhdHVyZQorICAgICAqIHtAbGluayBXaW5kb3cjRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVl9IGl0IHdpbGwgcmVzaXplIGFwcGxpY2F0aW9uCisgICAgICogY29udGVudCB0byBmaXQgdGhlIG5ldyBzcGFjZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQWN0aW9uQmFyIGlzIHNob3dpbmcsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTaG93aW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIEFjdGlvbkJhciBuYXZpZ2F0aW9uIGV2ZW50cy4gCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBOYXZpZ2F0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbmF2aWdhdGlvbiBpdGVtIGluIHlvdXIgYWN0aW9uIGJhcgorICAgICAgICAgKiBpcyBzZWxlY3RlZC4KKyAgICAgICAgICogICAgCisgICAgICAgICAqIEBwYXJhbSBpdGVtUG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGl0ZW0gY2xpY2tlZC4KKyAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBJRCBvZiB0aGUgaXRlbSBjbGlja2VkLgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQoaW50IGl0ZW1Qb3NpdGlvbiwgbG9uZyBpdGVtSWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFiIGluIHRoZSBhY3Rpb24gYmFyLgorICAgICAqCisgICAgICogPHA+VGFicyBtYW5hZ2UgdGhlIGhpZGluZyBhbmQgc2hvd2luZyBvZiB7QGxpbmsgRnJhZ21lbnR9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRhYiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBpbnZhbGlkIHBvc2l0aW9uIGZvciBhIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0UG9zaXRpb24oKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT1NJVElPTiA9IC0xOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhpcyB0YWIgaW4gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQ3VycmVudCBwb3NpdGlvbiwgb3Ige0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiB0aGlzIHRhYiBpcyBub3QgY3VycmVudGx5IGluCisgICAgICAgICAqICAgICAgICAgdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBvc2l0aW9uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHRhYidzIGljb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBEcmF3YWJsZSBnZXRJY29uKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgdGV4dCBvZiB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdGFiJ3MgdGV4dAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUZXh0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgaWNvbiBkaXNwbGF5ZWQgb24gdGhpcyB0YWIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpY29uIFRoZSBkcmF3YWJsZSB0byB1c2UgYXMgYW4gaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0ZXh0IGRpc3BsYXllZCBvbiB0aGlzIHRhYi4gVGV4dCBtYXkgYmUgdHJ1bmNhdGVkIGlmIHRoZXJlIGlzIG5vdAorICAgICAgICAgKiByb29tIHRvIGRpc3BsYXkgdGhlIGVudGlyZSBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGRpc3BsYXkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBjdXN0b20gdmlldyB0byBiZSB1c2VkIGZvciB0aGlzIHRhYi4gVGhpcyBvdmVycmlkZXMgdmFsdWVzIHNldCBieQorICAgICAgICAgKiB7QGxpbmsgI3NldFRleHQoQ2hhclNlcXVlbmNlKX0gYW5kIHtAbGluayAjc2V0SWNvbihEcmF3YWJsZSl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmlldyBDdXN0b20gdmlldyB0byBiZSB1c2VkIGFzIGEgdGFiLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q3VzdG9tVmlldyhWaWV3IHZpZXcpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgc2V0IGN1c3RvbSB2aWV3IGZvciB0aGlzIHRhYi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgY3VzdG9tIHZpZXcgc2V0IGJ5IHtAbGluayAjc2V0Q3VzdG9tVmlldyhWaWV3KX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVmlldyBnZXRDdXN0b21WaWV3KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdpdmUgdGhpcyBUYWIgYW4gYXJiaXRyYXJ5IG9iamVjdCB0byBob2xkIGZvciBsYXRlciB1c2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHN0b3JlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYWcoT2JqZWN0IG9iaik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhpcyBUYWIncyB0YWcgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRUYWcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB7QGxpbmsgVGFiTGlzdGVuZXJ9IHRoYXQgd2lsbCBoYW5kbGUgc3dpdGNoaW5nIHRvIGFuZCBmcm9tIHRoaXMgdGFiLgorICAgICAgICAgKiBBbGwgdGFicyBtdXN0IGhhdmUgYSBUYWJMaXN0ZW5lciBzZXQgYmVmb3JlIGJlaW5nIGFkZGVkIHRvIHRoZSBBY3Rpb25CYXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0byBoYW5kbGUgdGFiIHNlbGVjdGlvbiBldmVudHMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRhYkxpc3RlbmVyKFRhYkxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0IHRoaXMgdGFiLiBPbmx5IHZhbGlkIGlmIHRoZSB0YWIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGFjdGlvbiBiYXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgaW52b2tlZCB3aGVuIGEgdGFiIGlzIGZvY3VzZWQsIHVuZm9jdXNlZCwgYWRkZWQsIG9yIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBUYWJMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHRhYiBlbnRlcnMgdGhlIHNlbGVjdGVkIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGFiIFRoZSB0YWIgdGhhdCB3YXMgc2VsZWN0ZWQKKyAgICAgICAgICogQHBhcmFtIGZ0IEEge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb259IGZvciBxdWV1aW5nIGZyYWdtZW50IG9wZXJhdGlvbnMgdG8gZXhlY3V0ZQorICAgICAgICAgKiAgICAgICAgZHVyaW5nIGEgdGFiIHN3aXRjaC4gVGhlIHByZXZpb3VzIHRhYidzIHVuc2VsZWN0IGFuZCB0aGlzIHRhYidzIHNlbGVjdCB3aWxsIGJlCisgICAgICAgICAqICAgICAgICBleGVjdXRlZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFiU2VsZWN0ZWQoVGFiIHRhYiwgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgdGFiIGV4aXRzIHRoZSBzZWxlY3RlZCBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhYiBUaGUgdGFiIHRoYXQgd2FzIHVuc2VsZWN0ZWQKKyAgICAgICAgICogQHBhcmFtIGZ0IEEge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb259IGZvciBxdWV1aW5nIGZyYWdtZW50IG9wZXJhdGlvbnMgdG8gZXhlY3V0ZQorICAgICAgICAgKiAgICAgICAgZHVyaW5nIGEgdGFiIHN3aXRjaC4gVGhpcyB0YWIncyB1bnNlbGVjdCBhbmQgdGhlIG5ld2x5IHNlbGVjdGVkIHRhYidzIHNlbGVjdAorICAgICAgICAgKiAgICAgICAgd2lsbCBiZSBleGVjdXRlZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVGFiVW5zZWxlY3RlZChUYWIgdGFiLCBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCmluZGV4IDZlNmU4NmYuLjk3YWEyM2UgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhCkBAIC0xNiwxOSArMTYsMjIgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFwcDsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFwcC5BY3Rpb25CYXJJbXBsOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5Qb2xpY3lNYW5hZ2VyOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudENhbGxiYWNrczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUludGVudFNlbmRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKQEAgLTM5LDYgKzQyLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwpAQCAtNDksNyArNTMsOSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNTgsMTcgKzY0LDE1IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTExMCw2ICsxMTQsNyBAQAogICogCiAgKiA8cD5Ub3BpY3MgY292ZXJlZCBoZXJlOgogICogPG9sPgorICogPGxpPjxhIGhyZWY9IiNGcmFnbWVudHMiPkZyYWdtZW50czwvYT4KICAqIDxsaT48YSBocmVmPSIjQWN0aXZpdHlMaWZlY3ljbGUiPkFjdGl2aXR5IExpZmVjeWNsZTwvYT4KICAqIDxsaT48YSBocmVmPSIjQ29uZmlndXJhdGlvbkNoYW5nZXMiPkNvbmZpZ3VyYXRpb24gQ2hhbmdlczwvYT4KICAqIDxsaT48YSBocmVmPSIjU3RhcnRpbmdBY3Rpdml0aWVzIj5TdGFydGluZyBBY3Rpdml0aWVzIGFuZCBHZXR0aW5nIFJlc3VsdHM8L2E+CkBAIC0xMTgsNiArMTIzLDE0IEBACiAgKiA8bGk+PGEgaHJlZj0iI1Byb2Nlc3NMaWZlY3ljbGUiPlByb2Nlc3MgTGlmZWN5Y2xlPC9hPgogICogPC9vbD4KICAqIAorICogPGEgbmFtZT0iRnJhZ21lbnRzIj48L2E+CisgKiA8aDM+RnJhZ21lbnRzPC9oMz4KKyAqCisgKiA8cD5TdGFydGluZyB3aXRoIHtAbGluayBhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT05fQ09ERVMjSE9ORVlDT01CfSwgQWN0aXZpdHkKKyAqIGltcGxlbWVudGF0aW9ucyBjYW4gbWFrZSB1c2Ugb2YgdGhlIHtAbGluayBGcmFnbWVudH0gY2xhc3MgdG8gYmV0dGVyCisgKiBtb2R1bGFyaXplIHRoZWlyIGNvZGUsIGJ1aWxkIG1vcmUgc29waGlzdGljYXRlZCB1c2VyIGludGVyZmFjZXMgZm9yIGxhcmdlcgorICogc2NyZWVucywgYW5kIGhlbHAgc2NhbGUgdGhlaXIgYXBwbGljYXRpb24gYmV0d2VlbiBzbWFsbCBhbmQgbGFyZ2Ugc2NyZWVucy4KKyAqCiAgKiA8YSBuYW1lPSJBY3Rpdml0eUxpZmVjeWNsZSI+PC9hPgogICogPGgzPkFjdGl2aXR5IExpZmVjeWNsZTwvaDM+CiAgKgpAQCAtNjA0LDkgKzYxNyw4IEBACiAgICAgLyoqIFN0YXJ0IG9mIHVzZXItZGVmaW5lZCBhY3Rpdml0eSByZXN1bHRzLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1VMVF9GSVJTVF9VU0VSICAgPSAxOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX0hJRVJBUkNIWV9UQUcgPSAiYW5kcm9pZDp2aWV3SGllcmFyY2h5U3RhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVFNfVEFHID0gImFuZHJvaWQ6ZnJhZ21lbnRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0lEU19LRVkgPSAiYW5kcm9pZDpzYXZlZERpYWxvZ0lkcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0RJQUxPR1NfVEFHID0gImFuZHJvaWQ6c2F2ZWREaWFsb2dzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX0tFWV9QUkVGSVggPSAiYW5kcm9pZDpkaWFsb2dfIjsKQEAgLTYyOCwxOCArNjQwLDI4IEBACiAgICAgcHJpdmF0ZSBDb21wb25lbnROYW1lIG1Db21wb25lbnQ7CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlJbmZvIG1BY3Rpdml0eUluZm87CiAgICAgLypwYWNrYWdlKi8gQWN0aXZpdHlUaHJlYWQgbU1haW5UaHJlYWQ7Ci0gICAgLypwYWNrYWdlKi8gT2JqZWN0IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOwotICAgIC8qcGFja2FnZSovIEhhc2hNYXA8U3RyaW5nLE9iamVjdD4gbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXM7CiAgICAgQWN0aXZpdHkgbVBhcmVudDsKICAgICBib29sZWFuIG1DYWxsZWQ7CisgICAgYm9vbGVhbiBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXI7CisgICAgYm9vbGVhbiBtU3RhcnRlZDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc3VtZWQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkOwogICAgIGJvb2xlYW4gbUZpbmlzaGVkOwogICAgIGJvb2xlYW4gbVN0YXJ0ZWRBY3Rpdml0eTsKKyAgICAvKiogdHJ1ZSBpZiB0aGUgYWN0aXZpdHkgaXMgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIHJlY3JlYXRlIGl0IHdpdGggYSBuZXcgY29uZmlndXJhdGlvbiAqLworICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBpbnQgbUNvbmZpZ0NoYW5nZUZsYWdzOwogICAgIC8qcGFja2FnZSovIENvbmZpZ3VyYXRpb24gbUN1cnJlbnRDb25maWc7CiAgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOwogCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgeworICAgICAgICBPYmplY3QgYWN0aXZpdHk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkcmVuOworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50czsKKyAgICAgICAgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+IGxvYWRlcnM7CisgICAgfQorICAgIC8qIHBhY2thZ2UgKi8gTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CisgICAgCiAgICAgcHJpdmF0ZSBXaW5kb3cgbVdpbmRvdzsKIAogICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKQEAgLTY0NywxMCArNjY5LDE2IEBACiAgICAgLypwYWNrYWdlKi8gYm9vbGVhbiBtV2luZG93QWRkZWQgPSBmYWxzZTsKICAgICAvKnBhY2thZ2UqLyBib29sZWFuIG1WaXNpYmxlRnJvbVNlcnZlciA9IGZhbHNlOwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gbVZpc2libGVGcm9tQ2xpZW50ID0gdHJ1ZTsKKyAgICAvKnBhY2thZ2UqLyBBY3Rpb25CYXJJbXBsIG1BY3Rpb25CYXIgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOwogICAgIHByaXZhdGUgaW50IG1UaXRsZUNvbG9yID0gMDsKIAorICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlckltcGwgbUZyYWdtZW50cyA9IG5ldyBGcmFnbWVudE1hbmFnZXJJbXBsKCk7CisgICAgCisgICAgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICBMb2FkZXJNYW5hZ2VySW1wbCBtTG9hZGVyTWFuYWdlcjsKKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNYW5hZ2VkQ3Vyc29yIHsKICAgICAgICAgTWFuYWdlZEN1cnNvcihDdXJzb3IgY3Vyc29yKSB7CiAgICAgICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwpAQCAtNjc3LDI0ICs3MDUsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCiAgICAgcHJpdmF0ZSBUaHJlYWQgbVVpVGhyZWFkOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBwdWJsaWMgQWN0aXZpdHkoKSB7Ci0gICAgICAgICsrc0luc3RhbmNlQ291bnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLS1zSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc0luc3RhbmNlQ291bnQ7Ci0gICAgfQorICAgIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwogCiAgICAgLyoqIFJldHVybiB0aGUgaW50ZW50IHRoYXQgc3RhcnRlZCB0aGlzIGFjdGl2aXR5LiAqLwogICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgewpAQCAtNzQ4LDYgKzc1OSwzMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBnZXRMb2FkZXJNYW5hZ2VyKC0xLCBtU3RhcnRlZCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBtTG9hZGVyTWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgTG9hZGVyTWFuYWdlckltcGwgZ2V0TG9hZGVyTWFuYWdlcihpbnQgaW5kZXgsIGJvb2xlYW4gc3RhcnRlZCwgYm9vbGVhbiBjcmVhdGUpIHsKKyAgICAgICAgaWYgKG1BbGxMb2FkZXJNYW5hZ2VycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBuZXcgU3BhcnNlQXJyYXk8TG9hZGVyTWFuYWdlckltcGw+KCk7CisgICAgICAgIH0KKyAgICAgICAgTG9hZGVyTWFuYWdlckltcGwgbG0gPSBtQWxsTG9hZGVyTWFuYWdlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKGxtID09IG51bGwgJiYgY3JlYXRlKSB7CisgICAgICAgICAgICBsbSA9IG5ldyBMb2FkZXJNYW5hZ2VySW1wbChzdGFydGVkKTsKKyAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5wdXQoaW5kZXgsIGxtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG07CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLnZpZXcuV2luZG93I2dldEN1cnJlbnRGb2N1c30gb24gdGhlCiAgICAgICogV2luZG93IG9mIHRoaXMgQWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjdXJyZW50bHkgZm9jdXNlZCB2aWV3LgogICAgICAqIApAQCAtODAxLDYgKzgzNiwxNSBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgbVZpc2libGVGcm9tQ2xpZW50ID0gIW1XaW5kb3cuZ2V0V2luZG93U3R5bGUoKS5nZXRCb29sZWFuKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dOb0Rpc3BsYXksIGZhbHNlKTsKKyAgICAgICAgaWYgKG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMgPSBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMubG9hZGVyczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhcmNlbGFibGUgcCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRQYXJjZWxhYmxlKEZSQUdNRU5UU19UQUcpOworICAgICAgICAgICAgbUZyYWdtZW50cy5yZXN0b3JlQWxsU3RhdGUocCwgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMuZnJhZ21lbnRzIDogbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaENyZWF0ZSgpOwogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTkzMyw2ICs5NzcsMTMgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0KCkgewogICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gZ2V0TG9hZGVyTWFuYWdlcigtMSwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA4NSw2ICsxMTM2LDEwIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgb3V0U3RhdGUucHV0QnVuZGxlKFdJTkRPV19ISUVSQVJDSFlfVEFHLCBtV2luZG93LnNhdmVIaWVyYXJjaHlTdGF0ZSgpKTsKKyAgICAgICAgUGFyY2VsYWJsZSBwID0gbUZyYWdtZW50cy5zYXZlQWxsU3RhdGUoKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0UGFyY2VsYWJsZShGUkFHTUVOVFNfVEFHLCBwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQwOCw3ICsxNDYzLDggQEAKICAgICAgKiB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlOworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5hY3Rpdml0eSA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQyMCw2ICsxNDc2LDExIEBACiAgICAgICoge0BsaW5rICNnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9IGluIHRoZSBuZXcgYWN0aXZpdHkKICAgICAgKiBpbnN0YW5jZS4KICAgICAgKiAKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRnJhZ21lbnR9IHdpdGgKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnQjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbikKKyAgICAgKiBGcmFnbWVudC5zZXRSZXRhaW5JbnN0YW5jZShib29sZWFufS48L2VtPgorICAgICAqCiAgICAgICogPHA+VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcHVyZWx5IGFzIGFuIG9wdGltaXphdGlvbiwgYW5kIHlvdSBtdXN0CiAgICAgICogbm90IHJlbHkgb24gaXQgYmVpbmcgY2FsbGVkLiAgV2hlbiBpdCBpcyBjYWxsZWQsIGEgbnVtYmVyIG9mIGd1YXJhbnRlZXMKICAgICAgKiB3aWxsIGJlIG1hZGUgdG8gaGVscCBvcHRpbWl6ZSBjb25maWd1cmF0aW9uIHN3aXRjaGluZzoKQEAgLTE0NjQsOCArMTUyNSw5IEBACiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvYmplY3QgcHJldmlvdXNseSByZXR1cm5lZCBieQogICAgICAqIHtAbGluayAjb25SZXRhaW5Ob25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKX0KICAgICAgKi8KLSAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlczsKKyAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5jaGlsZHJlbiA6IG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTQ3OSwxNyArMTU0MSw4OCBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgCisgICAgTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyByZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKCkgeworICAgICAgICBPYmplY3QgYWN0aXZpdHkgPSBvblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZHJlbiA9IG9uUmV0YWluTm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzKCk7CisgICAgICAgIEFycmF5TGlzdDxGcmFnbWVudD4gZnJhZ21lbnRzID0gbUZyYWdtZW50cy5yZXRhaW5Ob25Db25maWcoKTsKKyAgICAgICAgYm9vbGVhbiByZXRhaW5Mb2FkZXJzID0gZmFsc2U7CisgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcHJ1bmUgb3V0IGFueSBsb2FkZXIgbWFuYWdlcnMgdGhhdCB3ZXJlIGFscmVhZHkgc3RvcHBlZCBhbmQgc28KKyAgICAgICAgICAgIC8vIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gcmV0YWluLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxtLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0YWluTG9hZGVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG0uZG9EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwgJiYgY2hpbGRyZW4gPT0gbnVsbCAmJiBmcmFnbWVudHMgPT0gbnVsbCAmJiAhcmV0YWluTG9hZGVycykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbmNpID0gbmV3IE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKKyAgICAgICAgbmNpLmFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgICAgIG5jaS5jaGlsZHJlbiA9IGNoaWxkcmVuOworICAgICAgICBuY2kuZnJhZ21lbnRzID0gZnJhZ21lbnRzOworICAgICAgICBuY2kubG9hZGVycyA9IG1BbGxMb2FkZXJNYW5hZ2VyczsKKyAgICAgICAgcmV0dXJuIG5jaTsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgb25Mb3dNZW1vcnkoKSB7CiAgICAgICAgIG1DYWxsZWQgPSB0cnVlOwogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEZyYWdtZW50TWFuYWdlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBmcmFnbWVudHMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBhY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyIGdldEZyYWdtZW50TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBzZXJpZXMgb2YgZWRpdCBvcGVyYXRpb25zIG9uIHRoZSBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBhY3Rpdml0eS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gb3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLm9wZW5UcmFuc2FjdGlvbigpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVGcmFnbWVudEluZGV4KGludCBpbmRleCkgeworICAgICAgICAvL0xvZy52KFRBRywgImludmFsaWRhdGVGcmFnbWVudEluZGV4OiBpbmRleD0iICsgaW5kZXgpOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLmdldChpbmRleCk7CisgICAgICAgICAgICBpZiAobG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxtLmRvRGVzdHJveSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFsbExvYWRlck1hbmFnZXJzLnJlbW92ZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSBGcmFnbWVudCBpcyBiZWluZyBhdHRhY2hlZCB0byB0aGlzIGFjdGl2aXR5LCBpbW1lZGlhdGVseQorICAgICAqIGFmdGVyIHRoZSBjYWxsIHRvIGl0cyB7QGxpbmsgRnJhZ21lbnQjb25BdHRhY2ggRnJhZ21lbnQub25BdHRhY2goKX0KKyAgICAgKiBtZXRob2QgYW5kIGJlZm9yZSB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGUgRnJhZ21lbnQub25DcmVhdGUoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCkgeworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBXcmFwcGVyIGFyb3VuZAogICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjcXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZyl9CiAgICAgICogdGhhdCBnaXZlcyB0aGUgcmVzdWx0aW5nIHtAbGluayBDdXJzb3J9IHRvIGNhbGwKICAgICAgKiB7QGxpbmsgI3N0YXJ0TWFuYWdpbmdDdXJzb3J9IHNvIHRoYXQgdGhlIGFjdGl2aXR5IHdpbGwgbWFuYWdlIGl0cwogICAgICAqIGxpZmVjeWNsZSBmb3IgeW91LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5LgogICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIExpc3Qgb2YgY29sdW1ucyB0byByZXR1cm4uCiAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBTUUwgV0hFUkUgY2xhdXNlLgpAQCAtMTUwMCwxMiArMTYzMywxMiBAQAogICAgICAqIEBzZWUgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgogICAgICAqIEBoaWRlCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgQ3Vyc29yIG1hbmFnZWRRdWVyeShVcmkgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKQotICAgIHsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKSB7CiAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIG51bGwsIHNvcnRPcmRlcik7CiAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CkBAIC0xNTIwLDYgKzE2NTMsMTAgQEAKICAgICAgKiB7QGxpbmsgI3N0YXJ0TWFuYWdpbmdDdXJzb3J9IHNvIHRoYXQgdGhlIGFjdGl2aXR5IHdpbGwgbWFuYWdlIGl0cwogICAgICAqIGxpZmVjeWNsZSBmb3IgeW91LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyIHRvIHF1ZXJ5LgogICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIExpc3Qgb2YgY29sdW1ucyB0byByZXR1cm4uCiAgICAgICogQHBhcmFtIHNlbGVjdGlvbiBTUUwgV0hFUkUgY2xhdXNlLgpAQCAtMTUzMCwxMyArMTY2NywxMiBAQAogICAgICAqIAogICAgICAqIEBzZWUgQ29udGVudFJlc29sdmVyI3F1ZXJ5KGFuZHJvaWQubmV0LlVyaSAsIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpCiAgICAgICogQHNlZSAjc3RhcnRNYW5hZ2luZ0N1cnNvcgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCi0gICAgcHVibGljIGZpbmFsIEN1cnNvciBtYW5hZ2VkUXVlcnkoVXJpIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyKQotICAgIHsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBmaW5hbCBDdXJzb3IgbWFuYWdlZFF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB7CiAgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkodXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7CiAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CkBAIC0xNTQ1LDQwICsxNjgxLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXcmFwcGVyIGFyb3VuZCB7QGxpbmsgQ3Vyc29yI2NvbW1pdFVwZGF0ZXMoKX0gdGhhdCB0YWtlcyBjYXJlIG9mIG5vdGluZwotICAgICAqIHRoYXQgdGhlIEN1cnNvciBuZWVkcyB0byBiZSByZXF1ZXJpZWQuICBZb3UgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4KLSAgICAgKiB7QGxpbmsgI29uUGF1c2V9IG9yIHtAbGluayAjb25TdG9wfSB0byBoYXZlIHRoZSBzeXN0ZW0gY2FsbAotICAgICAqIHtAbGluayBDdXJzb3IjcmVxdWVyeX0gZm9yIHlvdSBpZiB0aGUgYWN0aXZpdHkgaXMgbGF0ZXIgcmVzdW1lZC4gIFRoaXMKLSAgICAgKiBhbGxvd3MgeW91IHRvIGF2b2lkIGRldGVybWluZyB3aGVuIHRvIGRvIHRoZSByZXF1ZXJ5IHlvdXJzZWxmICh3aGljaCBpcwotICAgICAqIHJlcXVpcmVkIGZvciB0aGUgQ3Vyc29yIHRvIHNlZSBhbnkgZGF0YSBjaGFuZ2VzIHRoYXQgd2VyZSBjb21taXR0ZWQgd2l0aAotICAgICAqIGl0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYyBUaGUgQ3Vyc29yIHdob3NlIGNoYW5nZXMgYXJlIHRvIGJlIGNvbW1pdHRlZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNtYW5hZ2VkUXVlcnkoYW5kcm9pZC5uZXQuVXJpICwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZykKLSAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCi0gICAgICogQHNlZSBDdXJzb3IjY29tbWl0VXBkYXRlcygpCi0gICAgICogQHNlZSBDdXJzb3IjcmVxdWVyeQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBtYW5hZ2VkQ29tbWl0VXBkYXRlcyhDdXJzb3IgYykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChtYy5tQ3Vyc29yID09IGMpIHsKLSAgICAgICAgICAgICAgICAgICAgYy5jb21taXRVcGRhdGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDdXJzb3IgIiArIGMgKyAiIGlzIG5vdCBjdXJyZW50bHkgbWFuYWdlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBhY3Rpdml0eSB0byB0YWtlIGNhcmUgb2YgbWFuYWdpbmcgdGhlIGdpdmVuCiAgICAgICoge0BsaW5rIEN1cnNvcn0ncyBsaWZlY3ljbGUgZm9yIHlvdSBiYXNlZCBvbiB0aGUgYWN0aXZpdHkncyBsaWZlY3ljbGUuCiAgICAgICogVGhhdCBpcywgd2hlbiB0aGUgYWN0aXZpdHkgaXMgc3RvcHBlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbApAQCAtMTU4NiwxMSArMTY4OCwxOCBAQAogICAgICAqIGl0IHdpbGwgY2FsbCB7QGxpbmsgQ3Vyc29yI3JlcXVlcnl9IGZvciB5b3UuICBXaGVuIHRoZSBhY3Rpdml0eSBpcwogICAgICAqIGRlc3Ryb3llZCwgYWxsIG1hbmFnZWQgQ3Vyc29ycyB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LgogICAgICAqIAorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyB7QGxpbmsgTG9hZGVyTWFuYWdlcn0gaW5zdGVhZCwgYXZhaWxhYmxlCisgICAgICogdmlhIHtAbGluayAjZ2V0TG9hZGVyTWFuYWdlcigpfS48L2VtPgorICAgICAqCiAgICAgICogQHBhcmFtIGMgVGhlIEN1cnNvciB0byBiZSBtYW5hZ2VkLgogICAgICAqIAogICAgICAqIEBzZWUgI21hbmFnZWRRdWVyeShhbmRyb2lkLm5ldC5VcmkgLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKQogICAgICAqIEBzZWUgI3N0b3BNYW5hZ2luZ0N1cnNvcgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDdXJzb3JMb2FkZXJ9IGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzdGFydE1hbmFnaW5nQ3Vyc29yKEN1cnNvciBjKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1hbmFnZWRDdXJzb3JzKSB7CiAgICAgICAgICAgICBtTWFuYWdlZEN1cnNvcnMuYWRkKG5ldyBNYW5hZ2VkQ3Vyc29yKGMpKTsKQEAgLTE2MDUsNyArMTcxNCwxMCBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDdXJzb3IgdGhhdCB3YXMgYmVpbmcgbWFuYWdlZC4KICAgICAgKiAKICAgICAgKiBAc2VlICNzdGFydE1hbmFnaW5nQ3Vyc29yCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEN1cnNvckxvYWRlcn0gaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHN0b3BNYW5hZ2luZ0N1cnNvcihDdXJzb3IgYykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwpAQCAtMTY2MCw3ICsxNzcyLDU0IEBACiAgICAgcHVibGljIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgewogICAgICAgICByZXR1cm4gZ2V0V2luZG93KCkuZmluZFZpZXdCeUlkKGlkKTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGlzIGFjdGl2aXR5J3MgQWN0aW9uQmFyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQWN0aXZpdHkncyBBY3Rpb25CYXIsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgaGF2ZSBvbmUuCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkJhciBnZXRBY3Rpb25CYXIoKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQWN0aW9uQmFyLCBsb2NhdGVzIHRoZSBpbmZsYXRlZCBBY3Rpb25CYXJWaWV3LAorICAgICAqIGluaXRpYWxpemVzIHRoZSBBY3Rpb25CYXIgd2l0aCB0aGUgdmlldywgYW5kIHNldHMgbUFjdGlvbkJhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdEFjdGlvbkJhcigpIHsKKyAgICAgICAgV2luZG93IHdpbmRvdyA9IGdldFdpbmRvdygpOworICAgICAgICBpZiAoaXNDaGlsZCgpIHx8ICF3aW5kb3cuaGFzRmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKSB8fCBtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUFjdGlvbkJhciA9IG5ldyBBY3Rpb25CYXJJbXBsKHRoaXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGlkIGVpdGhlciB3aGVuIGluZmxhdGVkCisgICAgICogZnJvbSBYTUwgb3IgYXMgdGhlIGNvbnRhaW5lciBJRCB3aGVuIGFkZGVkIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIG9ubHkKKyAgICAgKiByZXR1cm5zIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIGFjdGl2aXR5J3MgY29udGVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBpZiBmb3VuZCBvciBudWxsIG90aGVyd2lzZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRGcmFnbWVudE1hbmFnZXJ9LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEZyYWdtZW50IGZpbmRGcmFnbWVudEJ5SWQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgb25seQorICAgICAqIHJldHVybnMgZnJhZ21lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgYWN0aXZpdHkncyBjb250ZW50LgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5maW5kRnJhZ21lbnRCeVRhZyh0YWcpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGFjdGl2aXR5IGNvbnRlbnQgZnJvbSBhIGxheW91dCByZXNvdXJjZS4gIFRoZSByZXNvdXJjZSB3aWxsIGJlCiAgICAgICogaW5mbGF0ZWQsIGFkZGluZyBhbGwgdG9wLWxldmVsIHZpZXdzIHRvIHRoZSBhY3Rpdml0eS4KQEAgLTE2NjksNiArMTgyOCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoaW50IGxheW91dFJlc0lEKSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldENvbnRlbnRWaWV3KGxheW91dFJlc0lEKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4MCw2ICsxODQwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OTIsNiArMTg1Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFZpZXcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBnZXRXaW5kb3coKS5zZXRDb250ZW50Vmlldyh2aWV3LCBwYXJhbXMpOworICAgICAgICBpbml0QWN0aW9uQmFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzAzLDYgKzE4NjUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKICAgICAgICAgZ2V0V2luZG93KCkuYWRkQ29udGVudFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgaW5pdEFjdGlvbkJhcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkyNiwxMiArMjA4OSw2NSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3BvcEJhY2tTdGFjayhTdHJpbmcsIGludCl9CisgICAgICogYW5kIHtAbGluayAjcG9wQmFja1N0YWNrKGludCwgaW50KX06IElmIHNldCwgYW5kIHRoZSBuYW1lIG9yIElEIG9mCisgICAgICogYSBiYWNrIHN0YWNrIGVudHJ5IGhhcyBiZWVuIHN1cHBsaWVkLCB0aGVuIGFsbCBtYXRjaGluZyBlbnRyaWVzIHdpbGwKKyAgICAgKiBiZSBjb25zdW1lZCB1bnRpbCBvbmUgdGhhdCBkb2Vzbid0IG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBib3R0b20gb2YKKyAgICAgKiB0aGUgc3RhY2sgaXMgcmVhY2hlZC4gIE90aGVyd2lzZSwgYWxsIGVudHJpZXMgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhhdCBlbnRyeQorICAgICAqIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUgPSAxPDwwOworCisgICAgLyoqCisgICAgICogUG9wIHRoZSB0b3Agc3RhdGUgb2ZmIHRoZSBiYWNrIHN0YWNrLiAgUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBvbmUKKyAgICAgKiB0byBwb3AsIGVsc2UgZmFsc2UuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RnJhZ21lbnRNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wIHRoZSBsYXN0IGZyYWdtZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgbG9jYWwgYWN0aXZpdHkncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5wb3BCYWNrU3RhY2sobmFtZSwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEZyYWdtZW50TWFuYWdlcn0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soaW50IGlkLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudHMucG9wQmFja1N0YWNrKGlkLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBoYXMgZGV0ZWN0ZWQgdGhlIHVzZXIncyBwcmVzcyBvZiB0aGUgYmFjawogICAgICAqIGtleS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBmaW5pc2hlcyB0aGUgY3VycmVudCBhY3Rpdml0eSwKICAgICAgKiBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIHRvIGRvIHdoYXRldmVyIHlvdSB3YW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIGZpbmlzaCgpOworICAgICAgICBpZiAoIW1GcmFnbWVudHMucG9wQmFja1N0YWNrKCkpIHsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMjE2OSw3ICsyMzg1LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdyA9IG9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICBzaG93IHw9IG1GcmFnbWVudHMuZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShtZW51LCBnZXRNZW51SW5mbGF0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gc2hvdzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjE4Niw2ICsyNDA0LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVQYW5lbChpbnQgZmVhdHVyZUlkLCBWaWV3IHZpZXcsIE1lbnUgbWVudSkgewogICAgICAgICBpZiAoZmVhdHVyZUlkID09IFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbWVudSAhPSBudWxsKSB7CiAgICAgICAgICAgICBib29sZWFuIGdvZm9yaXQgPSBvblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKyAgICAgICAgICAgIGdvZm9yaXQgfD0gbUZyYWdtZW50cy5kaXNwYXRjaFByZXBhcmVPcHRpb25zTWVudShtZW51KTsKICAgICAgICAgICAgIHJldHVybiBnb2Zvcml0ICYmIG1lbnUuaGFzVmlzaWJsZUl0ZW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yMjE2LDExICsyNDM1LDE3IEBACiAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBjYWxsIHRocm91Z2ggdG8gc3VwZXJjbGFzcydzIGltcGxtZWVudGF0aW9uIG9mIGVhY2gKICAgICAgICAgICAgICAgICAvLyBvZiB0aGVzZSBtZXRob2RzIGJlbG93CiAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg1MDAwMCwgMCwgaXRlbS5nZXRUaXRsZUNvbmRlbnNlZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmIChvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfQ09OVEVYVF9NRU5VOgogICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDAsIDEsIGl0ZW0uZ2V0VGl0bGVDb25kZW5zZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAob25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUZyYWdtZW50cy5kaXNwYXRjaENvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMzksNiArMjQ2NCw3IEBACiAgICAgcHVibGljIHZvaWQgb25QYW5lbENsb3NlZChpbnQgZmVhdHVyZUlkLCBNZW51IG1lbnUpIHsKICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIGNhc2UgV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTDoKKyAgICAgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CiAgICAgICAgICAgICAgICAgb25PcHRpb25zTWVudUNsb3NlZChtZW51KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKQEAgLTIyNDksNiArMjQ3NSwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlY2xhcmUgdGhhdCB0aGUgb3B0aW9ucyBtZW51IGhhcyBjaGFuZ2VkLCBzbyBzaG91bGQgYmUgcmVjcmVhdGVkLgorICAgICAqIFRoZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSl9IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0aGUgbmV4dAorICAgICAqIHRpbWUgaXQgbmVlZHMgdG8gYmUgZGlzcGxheWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKICAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4KICAgICAgKiAKQEAgLTI0NzEsNiArMjcwNiw5IEBACiAgICAgICogYnkgdGhlIGFjdGl2aXR5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhyb3VnaCB0bwogICAgICAqIHtAbGluayAjb25DcmVhdGVEaWFsb2coaW50KX0gZm9yIGNvbXBhdGliaWxpdHkuCiAgICAgICoKKyAgICAgKiA8ZW0+SWYgeW91IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgICAgICogb3IgbGF0ZXIsIGNvbnNpZGVyIGluc3RlYWQgdXNpbmcgYSB7QGxpbmsgRGlhbG9nRnJhZ21lbnR9IGluc3RlYWQuPC9lbT4KKyAgICAgKgogICAgICAqIDxwPklmIHlvdSB1c2Uge0BsaW5rICNzaG93RGlhbG9nKGludCl9LCB0aGUgYWN0aXZpdHkgd2lsbCBjYWxsIHRocm91Z2ggdG8KICAgICAgKiB0aGlzIG1ldGhvZCB0aGUgZmlyc3QgdGltZSwgYW5kIGhhbmcgb250byBpdCB0aGVyZWFmdGVyLiAgQW55IGRpYWxvZwogICAgICAqIHRoYXQgaXMgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2F2ZWQgYW5kIHJlc3RvcmVkCkBAIC0yNTQzLDYgKzI3ODEsOSBAQAogICAgICAqIHdpbGwgYmUgbWFkZSB3aXRoIHRoZSBzYW1lIGlkIHRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkIGZvciBhIGdpdmVuCiAgICAgICogaWQuICBGcm9tIHRoZXJlYWZ0ZXIsIHRoZSBkaWFsb2cgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNhdmVkIGFuZCByZXN0b3JlZC4KICAgICAgKgorICAgICAqIDxlbT5JZiB5b3UgYXJlIHRhcmdldGluZyB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAgICAgKiBvciBsYXRlciwgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBhIHtAbGluayBEaWFsb2dGcmFnbWVudH0gaW5zdGVhZC48L2VtPgorICAgICAqCiAgICAgICogPHA+RWFjaCB0aW1lIGEgZGlhbG9nIGlzIHNob3duLCB7QGxpbmsgI29uUHJlcGFyZURpYWxvZyhpbnQsIERpYWxvZywgQnVuZGxlKX0gd2lsbAogICAgICAqIGJlIG1hZGUgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSB0byBkbyBhbnkgdGltZWx5IHByZXBhcmF0aW9uLgogICAgICAqCkBAIC0zMDkwLDYgKzMzMzEsMzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgRnJhZ21lbnQgaW4gdGhpcyBhY3Rpdml0eSBjYWxscyBpdHMgCisgICAgICoge0BsaW5rIEZyYWdtZW50I3N0YXJ0QWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudCNzdGFydEFjdGl2aXR5Rm9yUmVzdWx0fQorICAgICAqIG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9ufQorICAgICAqIGlmIHRoZXJlIHdhcyBubyBBY3Rpdml0eSBmb3VuZCB0byBydW4gdGhlIGdpdmVuIEludGVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IG1ha2luZyB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IFRoZSBpbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIFJlcGx5IHJlcXVlc3QgY29kZS4gIDwgMCBpZiByZXBseSBpcyBub3QgcmVxdWVzdGVkLiAKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICogCisgICAgICogQHNlZSBGcmFnbWVudCNzdGFydEFjdGl2aXR5IAorICAgICAqIEBzZWUgRnJhZ21lbnQjc3RhcnRBY3Rpdml0eUZvclJlc3VsdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5RnJvbUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBJbnRlbnQgaW50ZW50LCAKKyAgICAgICAgICAgIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJbnN0cnVtZW50YXRpb24uQWN0aXZpdHlSZXN1bHQgYXIgPQorICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5leGVjU3RhcnRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICB0aGlzLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBtVG9rZW4sIGZyYWdtZW50LAorICAgICAgICAgICAgICAgIGludGVudCwgcmVxdWVzdENvZGUpOworICAgICAgICBpZiAoYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU1haW5UaHJlYWQuc2VuZEFjdGl2aXR5UmVzdWx0KAorICAgICAgICAgICAgICAgIG1Ub2tlbiwgZnJhZ21lbnQubVdobywgcmVxdWVzdENvZGUsCisgICAgICAgICAgICAgICAgYXIuZ2V0UmVzdWx0Q29kZSgpLCBhci5nZXRSZXN1bHREYXRhKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogTGlrZSB7QGxpbmsgI3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQoQWN0aXZpdHksIEludGVudCwgaW50KX0sIGJ1dAogICAgICAqIHRha2luZyBhIEludGVudFNlbmRlcjsgc2VlCiAgICAgICoge0BsaW5rICNzdGFydEludGVudFNlbmRlckZvclJlc3VsdChJbnRlbnRTZW5kZXIsIGludCwgSW50ZW50LCBpbnQsIGludCwgaW50KX0KQEAgLTMyNDgsNiArMzUxOSwxOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoaXMgYWN0aXZpdHkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkIGluIG9yZGVyIHRvIGJlCisgICAgICogcmVjcmVhdGVkIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gVGhpcyBpcyBvZnRlbiB1c2VkIGluCisgICAgICoge0BsaW5rICNvblN0b3B9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0ZSBuZWVkcyB0byBiZSBjbGVhbmVkIHVwIG9yIHdpbGwgYmUgcGFzc2VkCisgICAgICogb24gdG8gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIGFjdGl2aXR5IHZpYSB7QGxpbmsgI29uUmV0YWluTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlKCl9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gSWYgdGhlIGFjdGl2aXR5IGlzIGJlaW5nIHRvcm4gZG93biBpbiBvcmRlciB0byBiZSByZWNyZWF0ZWQgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uLAorICAgICAqIHJldHVybnMgdHJ1ZTsgZWxzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgdGhpcyB3aGVuIHlvdXIgYWN0aXZpdHkgaXMgZG9uZSBhbmQgc2hvdWxkIGJlIGNsb3NlZC4gIFRoZQogICAgICAqIEFjdGl2aXR5UmVzdWx0IGlzIHByb3BhZ2F0ZWQgYmFjayB0byB3aG9ldmVyIGxhdW5jaGVkIHlvdSB2aWEKICAgICAgKiBvbkFjdGl2aXR5UmVzdWx0KCkuCkBAIC0zMzQ4LDggKzM2MzIsNyBAQAogICAgICAqIEBzZWUgI2NyZWF0ZVBlbmRpbmdSZXN1bHQKICAgICAgKiBAc2VlICNzZXRSZXN1bHQoaW50KQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwKLSAgICAgICAgICAgIEludGVudCBkYXRhKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgb25BY3Rpdml0eVJlc3VsdChpbnQgcmVxdWVzdENvZGUsIGludCByZXN1bHRDb2RlLCBJbnRlbnQgZGF0YSkgewogICAgIH0KIAogICAgIC8qKgpAQCAtMzczMywxNCArNDAxNiwxMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdHViIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeSNvbkNyZWF0ZVZpZXd9IHVzZWQgd2hlbgotICAgICAqIGluZmxhdGluZyB3aXRoIHRoZSBMYXlvdXRJbmZsYXRlciByZXR1cm5lZCBieSB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9LiAgVGhpcwotICAgICAqIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIG51bGwgZm9yIGFsbCB2aWV3IG5hbWVzLgorICAgICAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlci5GYWN0b3J5I29uQ3JlYXRlVmlld30gdXNlZCB3aGVuCisgICAgICogaW5mbGF0aW5nIHdpdGggdGhlIExheW91dEluZmxhdGVyIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3lzdGVtU2VydmljZX0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIDxmcmFnbWVudD4gdGFncyB0byBlbWJlZCBmcmFnbWVudHMgaW5zaWRlCisgICAgICogb2YgdGhlIGFjdGl2aXR5LgogICAgICAqCiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIjY3JlYXRlVmlldwogICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LldpbmRvdyNnZXRMYXlvdXRJbmZsYXRlcgogICAgICAqLwogICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgaWYgKCEiZnJhZ21lbnQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmbmFtZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJjbGFzcyIpOworICAgICAgICBUeXBlZEFycmF5IGEgPSAKKyAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnQpOworICAgICAgICBpZiAoZm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZm5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaWQgPSBhLmdldFJlc291cmNlSWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfaWQsIDApOworICAgICAgICBTdHJpbmcgdGFnID0gYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRfdGFnKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBNdXN0IHNwZWNpZnkgdW5pcXVlIGFuZHJvaWQ6aWQgZm9yICIgKyBmbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElmIHdlIHJlc3RvcmVkIGZyb20gYSBwcmV2aW91cyBzdGF0ZSwgd2UgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAvLyBpbnN0YW50aWF0ZWQgdGhpcyBmcmFnbWVudCBmcm9tIHRoZSBzdGF0ZSBhbmQgc2hvdWxkIHVzZQorICAgICAgICAvLyB0aGF0IGluc3RhbmNlIGluc3RlYWQgb2YgbWFraW5nIGEgbmV3IG9uZS4KKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSBtRnJhZ21lbnRzLmZpbmRGcmFnbWVudEJ5SWQoaWQpOworICAgICAgICBpZiAoRnJhZ21lbnRNYW5hZ2VySW1wbC5ERUJVRykgTG9nLnYoVEFHLCAib25DcmVhdGVWaWV3OiBpZD0weCIKKyAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoaWQpICsgIiBmbmFtZT0iICsgZm5hbWUKKyAgICAgICAgICAgICAgICArICIgZXhpc3Rpbmc9IiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZyYWdtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYWdtZW50ID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgZm5hbWUpOworICAgICAgICAgICAgZnJhZ21lbnQubUZyb21MYXlvdXQgPSB0cnVlOworICAgICAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50SWQgPSBpZDsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1UYWcgPSB0YWc7CisgICAgICAgICAgICBmcmFnbWVudC5tSW1tZWRpYXRlQWN0aXZpdHkgPSB0aGlzOworICAgICAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50TWFuYWdlciA9IG1GcmFnbWVudHM7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZyYWdtZW50IGlzIG5ld2x5IGluc3RhbnRpYXRlZCAoZWl0aGVyIHJpZ2h0IG5vdywgb3IKKyAgICAgICAgICAgIC8vIGZyb20gbGFzdCBzYXZlZCBzdGF0ZSksIHRoZW4gZ2l2ZSBpdCB0aGUgYXR0cmlidXRlcyB0bworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBpdHNlbGYuCisgICAgICAgICAgICBpZiAoIWZyYWdtZW50Lm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5vbkluZmxhdGUoYXR0cnMsIGZyYWdtZW50Lm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYWdtZW50cy5hZGRGcmFnbWVudChmcmFnbWVudCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjcmVhdGUgYSB2aWV3LiIpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldElkKGlkKTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1WaWV3LmdldFRhZygpID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFRhZyh0YWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudC5tVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaXQgaW5kaWNhdGluZyB0aGF0IHRoaXMgYWN0aXZpdHkgaXMgImltbWVyc2l2ZSIgYW5kIHNob3VsZCBub3QgYmUKKyAgICAgKiBpbnRlcnJ1cHRlZCBieSBub3RpZmljYXRpb25zIGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogVGhpcyB2YWx1ZSBpcyBpbml0aWFsbHkgc2V0IGJ5IHRoZSBtYW5pZmVzdCBwcm9wZXJ0eQorICAgICAqIDxjb2RlPmFuZHJvaWQ6aW1tZXJzaXZlPC9jb2RlPiBidXQgbWF5IGJlIGNoYW5nZWQgYXQgcnVudGltZSBieQorICAgICAqIHtAbGluayAjc2V0SW1tZXJzaXZlfS4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNGTEFHX0lNTUVSU0lWRQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5pc0ltbWVyc2l2ZShtVG9rZW4pOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRqdXN0IHRoZSBjdXJyZW50IGltbWVyc2l2ZSBtb2RlIHNldHRpbmcuCisgICAgICogCisgICAgICogTm90ZSB0aGF0IGNoYW5naW5nIHRoaXMgdmFsdWUgd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgYWN0aXZpdHkncworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvfSBzdHJ1Y3R1cmU7IHRoYXQgaXMsIGlmCisgICAgICogPGNvZGU+YW5kcm9pZDppbW1lcnNpdmU8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgorICAgICAqIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGVudHJ5IGZvciB0aGlzIGFjdGl2aXR5LCB0aGUge0BsaW5rCisgICAgICogYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNmbGFncyBBY3Rpdml0eUluZm8uZmxhZ3N9IG1lbWJlciB3aWxsCisgICAgICogYWx3YXlzIGhhdmUgaXRzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvI0ZMQUdfSU1NRVJTSVZFCisgICAgICogRkxBR19JTU1FUlNJVkV9IGJpdCBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlICNpc0ltbWVyc2l2ZQorICAgICAqIEBzZWUgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbyNGTEFHX0lNTUVSU0lWRQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKGJvb2xlYW4gaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5zZXRJbW1lcnNpdmUobVRva2VuLCBpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgY29udGV4dCBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBtYW5hZ2UgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhpcyBjb250ZXh0IG1vZGUKKyAgICAgKiBAcmV0dXJuIFRoZSBDb250ZXh0TW9kZSB0aGF0IHdhcyBzdGFydGVkLCBvciBudWxsIGlmIGl0IHdhcyBjYW5jZWxlZAorICAgICAqCisgICAgICogQHNlZSBBY3Rpb25Nb2RlCisgICAgICovCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0RGVjb3JWaWV3KCkuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGluaXRBY3Rpb25CYXIoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXIuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTM3NTIsMjggKzQxNDgsMzAgQEAKIAogICAgIGZpbmFsIHZvaWQgYXR0YWNoKENvbnRleHQgY29udGV4dCwgQWN0aXZpdHlUaHJlYWQgYVRocmVhZCwgSW5zdHJ1bWVudGF0aW9uIGluc3RyLCBJQmluZGVyIHRva2VuLAogICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEludGVudCBpbnRlbnQsIEFjdGl2aXR5SW5mbyBpbmZvLCBDaGFyU2VxdWVuY2UgdGl0bGUsIAotICAgICAgICAgICAgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsIE9iamVjdCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAorICAgICAgICAgICAgQWN0aXZpdHkgcGFyZW50LCBTdHJpbmcgaWQsIE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMsCiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZykgewogICAgICAgICBhdHRhY2goY29udGV4dCwgYVRocmVhZCwgaW5zdHIsIHRva2VuLCAwLCBhcHBsaWNhdGlvbiwgaW50ZW50LCBpbmZvLCB0aXRsZSwgcGFyZW50LCBpZCwKLSAgICAgICAgICAgIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsIG51bGwsIGNvbmZpZyk7CisgICAgICAgICAgICBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcywgY29uZmlnKTsKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBhdHRhY2goQ29udGV4dCBjb250ZXh0LCBBY3Rpdml0eVRocmVhZCBhVGhyZWFkLAogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uIGluc3RyLCBJQmluZGVyIHRva2VuLCBpbnQgaWRlbnQsCiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGluZm8sCiAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIEFjdGl2aXR5IHBhcmVudCwgU3RyaW5nIGlkLAotICAgICAgICAgICAgT2JqZWN0IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMsCisgICAgICAgICAgICBOb25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLAogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgYXR0YWNoQmFzZUNvbnRleHQoY29udGV4dCk7CiAKKyAgICAgICAgbUZyYWdtZW50cy5hdHRhY2hBY3Rpdml0eSh0aGlzKTsKKyAgICAgICAgCiAgICAgICAgIG1XaW5kb3cgPSBQb2xpY3lNYW5hZ2VyLm1ha2VOZXdXaW5kb3codGhpcyk7CiAgICAgICAgIG1XaW5kb3cuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1XaW5kb3cuZ2V0TGF5b3V0SW5mbGF0ZXIoKS5zZXRGYWN0b3J5KHRoaXMpOwogICAgICAgICBpZiAoaW5mby5zb2Z0SW5wdXRNb2RlICE9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgIG1XaW5kb3cuc2V0U29mdElucHV0TW9kZShpbmZvLnNvZnRJbnB1dE1vZGUpOwogICAgICAgICB9CiAgICAgICAgIG1VaVRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0KKyAgICAgICAgCiAgICAgICAgIG1NYWluVGhyZWFkID0gYVRocmVhZDsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGluc3RyOwogICAgICAgICBtVG9rZW4gPSB0b2tlbjsKQEAgLTM3ODUsMTAgKzQxODMsMTAgQEAKICAgICAgICAgbVRpdGxlID0gdGl0bGU7CiAgICAgICAgIG1QYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgIG1FbWJlZGRlZElEID0gaWQ7Ci0gICAgICAgIG1MYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBtTGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlczsKIAotICAgICAgICBtV2luZG93LnNldFdpbmRvd01hbmFnZXIobnVsbCwgbVRva2VuLCBtQ29tcG9uZW50LmZsYXR0ZW5Ub1N0cmluZygpKTsKKyAgICAgICAgbVdpbmRvdy5zZXRXaW5kb3dNYW5hZ2VyKG51bGwsIG1Ub2tlbiwgbUNvbXBvbmVudC5mbGF0dGVuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAoaW5mby5mbGFncyAmIEFjdGl2aXR5SW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEKSAhPSAwKTsKICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgbVdpbmRvdy5zZXRDb250YWluZXIobVBhcmVudC5nZXRXaW5kb3coKSk7CiAgICAgICAgIH0KQEAgLTM4MDAsMTQgKzQxOTgsMjYgQEAKICAgICAgICAgcmV0dXJuIG1QYXJlbnQgIT0gbnVsbCA/IG1QYXJlbnQuZ2V0QWN0aXZpdHlUb2tlbigpIDogbVRva2VuOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgcGVyZm9ybUNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIG9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hBY3Rpdml0eUNyZWF0ZWQoKTsKKyAgICB9CisgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RhcnQoKSB7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPblN0YXJ0KHRoaXMpOwogICAgICAgICBpZiAoIW1DYWxsZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiQWN0aXZpdHkgIiArIG1Db21wb25lbnQudG9TaG9ydFN0cmluZygpICsKICAgICAgICAgICAgICAgICAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uU3RhcnQoKSIpOwogICAgICAgICB9CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hTdGFydCgpOworICAgICAgICBpZiAobUFsbExvYWRlck1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFsbExvYWRlck1hbmFnZXJzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBtQWxsTG9hZGVyTWFuYWdlcnMudmFsdWVBdChpKS5maW5pc2hSZXRhaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICBmaW5hbCB2b2lkIHBlcmZvcm1SZXN0YXJ0KCkgewpAQCAtMzgxNiw3ICs0MjI2LDEwIEBACiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgTWFuYWdlZEN1cnNvciBtYyA9IG1NYW5hZ2VkQ3Vyc29ycy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1jLm1SZWxlYXNlZCB8fCBtYy5tVXBkYXRlZCkgewotICAgICAgICAgICAgICAgICAgICBtYy5tQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYy5tQ3Vyc29yLnJlcXVlcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1jLm1SZWxlYXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KQEAgLTM4MzksNyArNDI1Miw5IEBACiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUmVzdW1lKCkgewogICAgICAgICBwZXJmb3JtUmVzdGFydCgpOwogICAgICAgICAKLSAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBudWxsOworICAgICAgICBtRnJhZ21lbnRzLmV4ZWNQZW5kaW5nQWN0aW9ucygpOworICAgICAgICAKKyAgICAgICAgbUxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgCiAgICAgICAgIC8vIEZpcnN0IGNhbGwgb25SZXN1bWUoKSAtYmVmb3JlLSBzZXR0aW5nIG1SZXN1bWVkLCBzbyB3ZSBkb24ndAogICAgICAgICAvLyBzZW5kIG91dCBhbnkgc3RhdHVzIGJhciAvIG1lbnUgbm90aWZpY2F0aW9ucyB0aGUgY2xpZW50IG1ha2VzLgpAQCAtMzg1NCw2ICs0MjY5LDEwIEBACiAgICAgICAgIC8vIE5vdyByZWFsbHkgcmVzdW1lLCBhbmQgaW5zdGFsbCB0aGUgY3VycmVudCBzdGF0dXMgYmFyIGFuZCBtZW51LgogICAgICAgICBtUmVzdW1lZCA9IHRydWU7CiAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hSZXN1bWUoKTsKKyAgICAgICAgbUZyYWdtZW50cy5leGVjUGVuZGluZ0FjdGlvbnMoKTsKKyAgICAgICAgCiAgICAgICAgIG9uUG9zdFJlc3VtZSgpOwogICAgICAgICBpZiAoIW1DYWxsZWQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigKQEAgLTM4NjMsNiArNDI4Miw3IEBACiAgICAgfQogCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtUGF1c2UoKSB7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hQYXVzZSgpOwogICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgIG9uUGF1c2UoKTsKICAgICAgICAgaWYgKCFtQ2FsbGVkICYmIGdldEFwcGxpY2F0aW9uSW5mbygpLnRhcmdldFNka1ZlcnNpb24KQEAgLTM4NzksMTEgKzQyOTksMjQgQEAKICAgICB9CiAgICAgCiAgICAgZmluYWwgdm9pZCBwZXJmb3JtU3RvcCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1DaGFuZ2luZ0NvbmZpZ3VyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvU3RvcCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyLmRvUmV0YWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAogICAgICAgICBpZiAoIW1TdG9wcGVkKSB7CiAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVdpbmRvdy5jbG9zZUFsbFBhbmVscygpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRnJhZ21lbnRzLmRpc3BhdGNoU3RvcCgpOworICAgICAgICAgICAgCiAgICAgICAgICAgICBtQ2FsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uU3RvcCh0aGlzKTsKICAgICAgICAgICAgIGlmICghbUNhbGxlZCkgewpAQCAtMzkwOCw2ICs0MzQxLDE1IEBACiAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgfQogCisgICAgZmluYWwgdm9pZCBwZXJmb3JtRGVzdHJveSgpIHsKKyAgICAgICAgbVdpbmRvdy5kZXN0cm95KCk7CisgICAgICAgIG1GcmFnbWVudHMuZGlzcGF0Y2hEZXN0cm95KCk7CisgICAgICAgIG9uRGVzdHJveSgpOworICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgZmluYWwgYm9vbGVhbiBpc1Jlc3VtZWQoKSB7CiAgICAgICAgIHJldHVybiBtUmVzdW1lZDsKICAgICB9CkBAIC0zOTE5LDYgKzQzNjEsMTEgQEAKICAgICAgICAgICAgICsgIiwgcmVzQ29kZT0iICsgcmVzdWx0Q29kZSArICIsIGRhdGE9IiArIGRhdGEpOwogICAgICAgICBpZiAod2hvID09IG51bGwpIHsKICAgICAgICAgICAgIG9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRnJhZ21lbnQgZnJhZyA9IG1GcmFnbWVudHMuZmluZEZyYWdtZW50QnlXaG8od2hvKTsKKyAgICAgICAgICAgIGlmIChmcmFnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFnLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCmluZGV4IGExODA4MzcuLjczZThkMzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKQEAgLTEyNjEsNiArMTI2MSwzMiBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIElTX0lNTUVSU0lWRV9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBJQmluZGVyIHRva2VuID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgICAgICBib29sZWFuIGlzaXQgPSBpc0ltbWVyc2l2ZSh0b2tlbik7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChpc2l0ID8gMSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9JTU1FUlNJVkVfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgSUJpbmRlciB0b2tlbiA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBpbW0gPSBkYXRhLnJlYWRJbnQoKSA9PSAxOworICAgICAgICAgICAgc2V0SW1tZXJzaXZlKHRva2VuLCBpbW0pOworICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhc2UgSVNfVE9QX0FDVElWSVRZX0lNTUVSU0lWRV9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIGlzaXQgPSBpc1RvcEFjdGl2aXR5SW1tZXJzaXZlKCk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChpc2l0ID8gMSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIENSQVNIX0FQUExJQ0FUSU9OX1RSQU5TQUNUSU9OOiB7CiAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKICAgICAgICAgICAgIGludCB1aWQgPSBkYXRhLnJlYWRJbnQoKTsKQEAgLTEyNzEsNyArMTI5Nyw3IEBACiAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotCisgICAgICAgIAogICAgICAgICBjYXNlIE5FV19VUklfUEVSTUlTU0lPTl9PV05FUl9UUkFOU0FDVElPTjogewogICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRhdGEucmVhZFN0cmluZygpOwpAQCAtMTMwNiw2ICsxMzMyLDE5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRFVNUF9IRUFQX1RSQU5TQUNUSU9OOiB7CisgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzID0gZGF0YS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBkdW1wSGVhcChwcm9jZXNzLCBtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChyZXMgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yODMyLDYgKzI4NzEsNDYgQEAKICAgICAgICAgcmVwbHkucmVjeWNsZSgpOwogICAgIH0KICAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJbW1lcnNpdmUoSUJpbmRlciB0b2tlbiwgYm9vbGVhbiBpbW1lcnNpdmUpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIodG9rZW4pOworICAgICAgICBkYXRhLndyaXRlSW50KGltbWVyc2l2ZSA/IDEgOiAwKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChTRVRfSU1NRVJTSVZFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbWVyc2l2ZShJQmluZGVyIHRva2VuKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHRva2VuKTsKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJU19JTU1FUlNJVkVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIHJlcyA9IHJlcGx5LnJlYWRJbnQoKSA9PSAxOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElTX1RPUF9BQ1RJVklUWV9JTU1FUlNJVkVfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIHJlcyA9IHJlcGx5LnJlYWRJbnQoKSA9PSAxOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGNyYXNoQXBwbGljYXRpb24oaW50IHVpZCwgaW50IGluaXRpYWxQaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CkBAIC0yODk1LDYgKzI5NzQsMjggQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKICAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkdW1wSGVhcChTdHJpbmcgcHJvY2VzcywgYm9vbGVhbiBtYW5hZ2VkLAorICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocHJvY2Vzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQobWFuYWdlZCA/IDEgOiAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKGRhdGEsIFBhcmNlbGFibGUuUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KERVTVBfSEVBUF9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gcmVzID0gcmVwbHkucmVhZEludCgpICE9IDA7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogICAgIAogICAgIHByaXZhdGUgSUJpbmRlciBtUmVtb3RlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCBmODQwN2MyLi42MGZjZGM0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkluc3RydW1lbnRhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlByb3ZpZGVySW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CkBAIC02Miw2ICs2Myw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKQEAgLTc0LDYgKzc2LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5SdW50aW1lSW5pdDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CiAKK2ltcG9ydCBkYWx2aWsuc3lzdGVtLlZNRGVidWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255LnhuZXQucHJvdmlkZXIuanNzZS5PcGVuU1NMU29ja2V0SW1wbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTE5Nyw4ICsyMDAsNyBAQAogICAgICAgICBXaW5kb3cgd2luZG93OwogICAgICAgICBBY3Rpdml0eSBwYXJlbnQ7CiAgICAgICAgIFN0cmluZyBlbWJlZGRlZElEOwotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzOworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzOwogICAgICAgICBib29sZWFuIHBhdXNlZDsKICAgICAgICAgYm9vbGVhbiBzdG9wcGVkOwogICAgICAgICBib29sZWFuIGhpZGVGb3JOb3c7CkBAIC0zNTksMTEgKzM2MSwxNiBAQAogICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZDsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEdW1wSGVhcERhdGEgeworICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvblRocmVhZCBleHRlbmRzIEFwcGxpY2F0aW9uVGhyZWFkTmF0aXZlIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVBfQ09MVU1OID0gIiUxN3MgJThzICU4cyAlOHMgJThzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9DT1VOVF9DT0xVTU4gPSAiJTE3cyAlOGQiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFdPX0NPVU5UX0NPTFVNTlMgPSAiJTE3cyAlOGQgJTE3cyAlOGQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfSU5GT19GT1JNQVQgPSAiICAlOGQgJThkICUxMGQgICVzIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX0lORk9fRk9STUFUID0gIiAgJTRkICU2ZCAlOGQgJTE0cyAgJXMiOwogCiAgICAgICAgIC8vIEZvcm1hdHRpbmcgZm9yIGNoZWNraW4gc2VydmljZSAtIHVwZGF0ZSB2ZXJzaW9uIGlmIHJvdyBmb3JtYXQgY2hhbmdlcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfVEhSRUFEX0NIRUNLSU5fVkVSU0lPTiA9IDE7CkBAIC02MjYsNiArNjMzLDEzIEBACiAgICAgICAgICAgICBxdWV1ZU9yU2VuZE1lc3NhZ2UoSC5QUk9GSUxFUl9DT05UUk9MLCBwY2QsIHN0YXJ0ID8gMSA6IDApOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcEhlYXAoYm9vbGVhbiBtYW5hZ2VkLCBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHsKKyAgICAgICAgICAgIER1bXBIZWFwRGF0YSBkaGQgPSBuZXcgRHVtcEhlYXBEYXRhKCk7CisgICAgICAgICAgICBkaGQucGF0aCA9IHBhdGg7CisgICAgICAgICAgICBkaGQuZmQgPSBmZDsKKyAgICAgICAgICAgIHF1ZXVlT3JTZW5kTWVzc2FnZShILkRVTVBfSEVBUCwgZGhkLCBtYW5hZ2VkID8gMSA6IDApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0U2NoZWR1bGluZ0dyb3VwKGludCBncm91cCkgewogICAgICAgICAgICAgLy8gTm90ZTogZG8gdGhpcyBpbW1lZGlhdGVseSwgc2luY2UgZ29pbmcgaW50byB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgLy8gc2hvdWxkIGhhcHBlbiByZWdhcmRsZXNzIG9mIHdoYXQgcGVuZGluZyB3b3JrIHdlIGhhdmUgdG8gZG8KQEAgLTY3NCw4ICs2ODgsOCBAQAogICAgICAgICAgICAgbG9uZyBkYWx2aWtBbGxvY2F0ZWQgPSBkYWx2aWtNYXggLSBkYWx2aWtGcmVlOwogICAgICAgICAgICAgbG9uZyB2aWV3SW5zdGFuY2VDb3VudCA9IFZpZXdEZWJ1Zy5nZXRWaWV3SW5zdGFuY2VDb3VudCgpOwogICAgICAgICAgICAgbG9uZyB2aWV3Um9vdEluc3RhbmNlQ291bnQgPSBWaWV3RGVidWcuZ2V0Vmlld1Jvb3RJbnN0YW5jZUNvdW50KCk7Ci0gICAgICAgICAgICBsb25nIGFwcENvbnRleHRJbnN0YW5jZUNvdW50ID0gQ29udGV4dEltcGwuZ2V0SW5zdGFuY2VDb3VudCgpOwotICAgICAgICAgICAgbG9uZyBhY3Rpdml0eUluc3RhbmNlQ291bnQgPSBBY3Rpdml0eS5nZXRJbnN0YW5jZUNvdW50KCk7CisgICAgICAgICAgICBsb25nIGFwcENvbnRleHRJbnN0YW5jZUNvdW50ID0gVk1EZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoQ29udGV4dEltcGwuY2xhc3MpOworICAgICAgICAgICAgbG9uZyBhY3Rpdml0eUluc3RhbmNlQ291bnQgPSBWTURlYnVnLmNvdW50SW5zdGFuY2VzT2ZDbGFzcyhBY3Rpdml0eS5jbGFzcyk7CiAgICAgICAgICAgICBpbnQgZ2xvYmFsQXNzZXRDb3VudCA9IEFzc2V0TWFuYWdlci5nZXRHbG9iYWxBc3NldENvdW50KCk7CiAgICAgICAgICAgICBpbnQgZ2xvYmFsQXNzZXRNYW5hZ2VyQ291bnQgPSBBc3NldE1hbmFnZXIuZ2V0R2xvYmFsQXNzZXRNYW5hZ2VyQ291bnQoKTsKICAgICAgICAgICAgIGludCBiaW5kZXJMb2NhbE9iamVjdENvdW50ID0gRGVidWcuZ2V0QmluZGVyTG9jYWxPYmplY3RDb3VudCgpOwpAQCAtNzYzLDcgKzc3Nyw3IEBACiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0cy5kYlN0YXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIERiU3RhdHMgZGJTdGF0cyA9IHN0YXRzLmRiU3RhdHMuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgREJfSU5GT19GT1JNQVQsIGRiU3RhdHMucGFnZVNpemUsIGRiU3RhdHMuZGJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmRiTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuY2FjaGUsIGRiU3RhdHMuZGJOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoJywnKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTgxNCwxMSArODI4LDEyIEBACiAgICAgICAgICAgICBpbnQgTiA9IHN0YXRzLmRiU3RhdHMuc2l6ZSgpOwogICAgICAgICAgICAgaWYgKE4gPiAwKSB7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIERBVEFCQVNFUyIpOwotICAgICAgICAgICAgICAgIHByaW50Um93KHB3LCAiICAlOHMgJThzICUxMHMgICVzIiwgIlBhZ2VzaXplIiwgIkRic2l6ZSIsICJMb29rYXNpZGUiLCAiRGJuYW1lIik7CisgICAgICAgICAgICAgICAgcHJpbnRSb3cocHcsICIgICU0cyAlNnMgJThzICUxNHMgICVzIiwgInBnc3oiLCAiZGJzeiIsICJsa2FzaWRlIiwgImNhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAgIkRibmFtZSIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIERiU3RhdHMgZGJTdGF0cyA9IHN0YXRzLmRiU3RhdHMuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgICBwcmludFJvdyhwdywgREJfSU5GT19GT1JNQVQsIGRiU3RhdHMucGFnZVNpemUsIGRiU3RhdHMuZGJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiU3RhdHMubG9va2FzaWRlLCBkYlN0YXRzLmRiTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0cy5sb29rYXNpZGUsIGRiU3RhdHMuY2FjaGUsIGRiU3RhdHMuZGJOYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTg3Miw2ICs4ODcsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfSklUICAgICAgICAgICAgICA9IDEzMjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUEFDS0FHRV9CUk9BRENBU1QgPSAxMzM7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFX0NSQVNIICAgICAgICAgID0gMTM0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVU1QX0hFQVAgICAgICAgICAgICAgICA9IDEzNTsKICAgICAgICAgU3RyaW5nIGNvZGVUb1N0cmluZyhpbnQgY29kZSkgewogICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewpAQCAtOTEwLDYgKzkyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgRU5BQkxFX0pJVDogcmV0dXJuICJFTkFCTEVfSklUIjsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVDogcmV0dXJuICJESVNQQVRDSF9QQUNLQUdFX0JST0FEQ0FTVCI7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NIRURVTEVfQ1JBU0g6IHJldHVybiAiU0NIRURVTEVfQ1JBU0giOworICAgICAgICAgICAgICAgICAgICBjYXNlIERVTVBfSEVBUDogcmV0dXJuICJEVU1QX0hFQVAiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAiKHVua25vd24pIjsKQEAgLTEwMzUsMTMgKzEwNTIsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTQ0hFRFVMRV9DUkFTSDoKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVNlcnZpY2VFeGNlcHRpb24oKFN0cmluZyltc2cub2JqKTsKKyAgICAgICAgICAgICAgICBjYXNlIERVTVBfSEVBUDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRHVtcEhlYXAobXNnLmFyZzEgIT0gMCwgKER1bXBIZWFwRGF0YSltc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIG1heWJlU25hcHNob3QoKSB7CiAgICAgICAgICAgICBpZiAobUJvdW5kQXBwbGljYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi53cml0ZVNuYXBzaG90KAotICAgICAgICAgICAgICAgICAgICAgICAgbUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUpOworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlICpwcml2YXRlKiBBY3Rpdml0eVRocmVhZC5QYWNrYWdlSW5mbyB0byAqcHVibGljKiBrbm93bgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG1Cb3VuZEFwcGxpY2F0aW9uLmluZm8ubVBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbyBwYWNrYWdlSW5mbyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0U3lzdGVtQ29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZihjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBjb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHBtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNhbm5vdCBnZXQgYSB2YWxpZCBQYWNrYWdlTWFuYWdlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VJbmZvID0gcG0uZ2V0UGFja2FnZUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9BQ1RJVklUSUVTKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjYW5ub3QgZ2V0IHBhY2thZ2UgaW5mbyBmb3IgIiArIHBhY2thZ2VOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QobUJvdW5kQXBwbGljYXRpb24ucHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE0MzIsNyArMTQ3MSw3IEBACiAKICAgICBwdWJsaWMgZmluYWwgQWN0aXZpdHkgc3RhcnRBY3Rpdml0eU5vdyhBY3Rpdml0eSBwYXJlbnQsIFN0cmluZyBpZCwKICAgICAgICAgSW50ZW50IGludGVudCwgQWN0aXZpdHlJbmZvIGFjdGl2aXR5SW5mbywgSUJpbmRlciB0b2tlbiwgQnVuZGxlIHN0YXRlLAotICAgICAgICBPYmplY3QgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSkgeworICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzKSB7CiAgICAgICAgIEFjdGl2aXR5Q2xpZW50UmVjb3JkIHIgPSBuZXcgQWN0aXZpdHlDbGllbnRSZWNvcmQoKTsKICAgICAgICAgICAgIHIudG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgIHIuaWRlbnQgPSAwOwpAQCAtMTQ0MSw3ICsxNDgwLDcgQEAKICAgICAgICAgICAgIHIucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgci5lbWJlZGRlZElEID0gaWQ7CiAgICAgICAgICAgICByLmFjdGl2aXR5SW5mbyA9IGFjdGl2aXR5SW5mbzsKLSAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2U7CisgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXM7CiAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG5hbWUgPSBpbnRlbnQuZ2V0Q29tcG9uZW50KCk7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZTsKQEAgLTE1NjMsMTQgKzE2MDIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgci5hY3Rpdml0eUluZm8ubmFtZSArICIgd2l0aCBjb25maWcgIiArIGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGFwcENvbnRleHQsIHRoaXMsIGdldEluc3RydW1lbnRhdGlvbigpLCByLnRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgci5pZGVudCwgYXBwLCByLmludGVudCwgci5hY3Rpdml0eUluZm8sIHRpdGxlLCByLnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuZW1iZWRkZWRJRCwgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzLCBjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgci5lbWJlZGRlZElELCByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzLCBjb25maWcpOwogCiAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUludGVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm1JbnRlbnQgPSBjdXN0b21JbnRlbnQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgci5sYXN0Tm9uQ29uZmlndXJhdGlvbkNoaWxkSW5zdGFuY2VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0gbnVsbDsKICAgICAgICAgICAgICAgICBhY3Rpdml0eS5tU3RhcnRlZEFjdGl2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW50IHRoZW1lID0gci5hY3Rpdml0eUluZm8uZ2V0VGhlbWVSZXNvdXJjZSgpOwogICAgICAgICAgICAgICAgIGlmICh0aGVtZSAhPSAwKSB7CkBAIC0yNTQ3LDYgKzI1ODQsOSBAQAogICAgICAgICAgICAgaWYgKGZpbmlzaGluZykgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNoYW5naW5nQ29uZmlndXJhdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFyLnBhdXNlZCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwpAQCAtMjU4Nyw4ICsyNjI3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXROb25Db25maWdJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICByLmxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByLmFjdGl2aXR5LnJldGFpbk5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZXMoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnN0cnVtZW50YXRpb24ub25FeGNlcHRpb24oci5hY3Rpdml0eSwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKApAQCAtMjU5NywyMiArMjYzNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHIubGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gci5hY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbUluc3RydW1lbnRhdGlvbi5vbkV4Y2VwdGlvbihyLmFjdGl2aXR5LCBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0YWluIGNoaWxkIGFjdGl2aXRpZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNhZmVUb0NvbXBvbmVudFNob3J0U3RyaW5nKHIuaW50ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubUNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkub25EZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUluc3RydW1lbnRhdGlvbi5jYWxsQWN0aXZpdHlPbkRlc3Ryb3koci5hY3Rpdml0eSk7CiAgICAgICAgICAgICAgICAgaWYgKCFyLmFjdGl2aXR5Lm1DYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGl2aXR5ICIgKyBzYWZlVG9Db21wb25lbnRTaG9ydFN0cmluZyhyLmludGVudCkgKwpAQCAtMzAyNCw2ICszMDUyLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBmaW5hbCB2b2lkIGhhbmRsZUR1bXBIZWFwKGJvb2xlYW4gbWFuYWdlZCwgRHVtcEhlYXBEYXRhIGRoZCkgeworICAgICAgICBpZiAobWFuYWdlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5kdW1wSHByb2ZEYXRhKGRoZC5wYXRoLCBkaGQuZmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIk1hbmFnZWQgaGVhcCBkdW1wIGZhaWxlZCBvbiBwYXRoICIgKyBkaGQucGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0tIGNhbiB0aGUgcHJvY2VzcyBhY2Nlc3MgdGhpcyBwYXRoPyIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkaGQuZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsdXJlIGNsb3NpbmcgcHJvZmlsZSBmZCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERlYnVnLmR1bXBOYXRpdmVIZWFwKGRoZC5mZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIHZvaWQgaGFuZGxlRGlzcGF0Y2hQYWNrYWdlQnJvYWRjYXN0KGludCBjbWQsIFN0cmluZ1tdIHBhY2thZ2VzKSB7CiAgICAgICAgIGJvb2xlYW4gaGFzUGtnSW5mbyA9IGZhbHNlOwogICAgICAgICBpZiAocGFja2FnZXMgIT0gbnVsbCkgewpAQCAtMzU4OSw2ICszNjM2LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGl2aXR5VGhyZWFkIHN5c3RlbU1haW4oKSB7CisgICAgICAgIEhhcmR3YXJlUmVuZGVyZXIuZGlzYWJsZSgpOwogICAgICAgICBBY3Rpdml0eVRocmVhZCB0aHJlYWQgPSBuZXcgQWN0aXZpdHlUaHJlYWQoKTsKICAgICAgICAgdGhyZWFkLmF0dGFjaCh0cnVlKTsKICAgICAgICAgcmV0dXJuIHRocmVhZDsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCmluZGV4IDIzODI1OTYuLjFlMDEyZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbkVycm9yUmVwb3J0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGNhbmRpZGF0ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KERFRkFVTFRfRVJST1JfUkVDRUlWRVJfUFJPUEVSVFkpOwogICAgICAgICByZXR1cm4gZ2V0RXJyb3JSZXBvcnRSZWNlaXZlcihwbSwgcGFja2FnZU5hbWUsIGNhbmRpZGF0ZSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGFjdGl2aXR5IGluIHJlY2VpdmVyUGFja2FnZSB0aGF0IGhhbmRsZXMgQUNUSU9OX0FQUF9FUlJPUi4KICAgICAgKgpAQCAtNTgxLDYgKzU4MSw5IEBACiAgICAgICAgICAgICBjYXNlIFRZUEVfQkFUVEVSWToKICAgICAgICAgICAgICAgICBiYXR0ZXJ5SW5mby5kdW1wKHB3LCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1JVTk5JTkdfU0VSVklDRToKKyAgICAgICAgICAgICAgICBydW5uaW5nU2VydmljZUluZm8uZHVtcChwdywgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvblRocmVhZE5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKaW5kZXggMWMyMDA2Mi4uZGMyMTQ1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uVGhyZWFkTmF0aXZlLmphdmEKQEAgLTQwMyw2ICs0MDMsMTcgQEAKICAgICAgICAgICAgIHNjaGVkdWxlQ3Jhc2gobXNnKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEVU1QX0hFQVBfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQXBwbGljYXRpb25UaHJlYWQuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBib29sZWFuIG1hbmFnZWQgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkID0gZGF0YS5yZWFkSW50KCkgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkgOiBudWxsOworICAgICAgICAgICAgZHVtcEhlYXAobWFuYWdlZCwgcGF0aCwgZmQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC04MjksNSArODQwLDIyIEBACiAgICAgICAgIGRhdGEucmVjeWNsZSgpOwogICAgICAgICAKICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBcHBsaWNhdGlvblRocmVhZC5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZUludChtYW5hZ2VkID8gMSA6IDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludCgxKTsKKyAgICAgICAgICAgIGZkLndyaXRlVG9QYXJjZWwoZGF0YSwgUGFyY2VsYWJsZS5QQVJDRUxBQkxFX1dSSVRFX1JFVFVSTl9WQUxVRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50KDApOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoRFVNUF9IRUFQX1RSQU5TQUNUSU9OLCBkYXRhLCBudWxsLAorICAgICAgICAgICAgICAgIElCaW5kZXIuRkxBR19PTkVXQVkpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0JhY2tTdGFja0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2YjQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9CYWNrU3RhY2tFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworZmluYWwgY2xhc3MgQmFja1N0YWNrU3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBpbnRbXSBtT3BzOworICAgIGZpbmFsIGludCBtVHJhbnNpdGlvbjsKKyAgICBmaW5hbCBpbnQgbVRyYW5zaXRpb25TdHlsZTsKKyAgICBmaW5hbCBTdHJpbmcgbU5hbWU7CisgICAgZmluYWwgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoRnJhZ21lbnRNYW5hZ2VySW1wbCBmbSwgQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIGludCBudW1SZW1vdmVkID0gMDsKKyAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBic2UubUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCAhPSBudWxsKSBudW1SZW1vdmVkICs9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1PcHMgPSBuZXcgaW50W2JzZS5tTnVtT3AqNSArIG51bVJlbW92ZWRdOworICAgICAgICAKKyAgICAgICAgaWYgKCFic2UubUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgb24gYmFjayBzdGFjayIpOworICAgICAgICB9CisKKyAgICAgICAgb3AgPSBic2UubUhlYWQ7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5jbWQ7CisgICAgICAgICAgICBtT3BzW3BvcysrXSA9IG9wLmZyYWdtZW50Lm1JbmRleDsKKyAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgbU9wc1twb3MrK10gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgIGlmIChvcC5yZW1vdmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG9wLnJlbW92ZWQuc2l6ZSgpOworICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gTjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1PcHNbcG9zKytdID0gb3AucmVtb3ZlZC5nZXQoaSkubUluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9wc1twb3MrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3AgPSBvcC5uZXh0OworICAgICAgICB9CisgICAgICAgIG1UcmFuc2l0aW9uID0gYnNlLm1UcmFuc2l0aW9uOworICAgICAgICBtVHJhbnNpdGlvblN0eWxlID0gYnNlLm1UcmFuc2l0aW9uU3R5bGU7CisgICAgICAgIG1OYW1lID0gYnNlLm1OYW1lOworICAgICAgICBtSW5kZXggPSBic2UubUluZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1PcHMgPSBpbi5jcmVhdGVJbnRBcnJheSgpOworICAgICAgICBtVHJhbnNpdGlvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbVRyYW5zaXRpb25TdHlsZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1JbmRleCA9IGluLnJlYWRJbnQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJhY2tTdGFja0VudHJ5IGluc3RhbnRpYXRlKEZyYWdtZW50TWFuYWdlckltcGwgZm0pIHsKKyAgICAgICAgQmFja1N0YWNrRW50cnkgYnNlID0gbmV3IEJhY2tTdGFja0VudHJ5KGZtKTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlIChwb3MgPCBtT3BzLmxlbmd0aCkgeworICAgICAgICAgICAgQmFja1N0YWNrRW50cnkuT3Agb3AgPSBuZXcgQmFja1N0YWNrRW50cnkuT3AoKTsKKyAgICAgICAgICAgIG9wLmNtZCA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAiQlNFICIgKyBic2UgKyAiIHNldCBiYXNlIGZyYWdtZW50ICMiICsgbU9wc1twb3NdKTsKKyAgICAgICAgICAgIEZyYWdtZW50IGYgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICBvcC5mcmFnbWVudCA9IGY7CisgICAgICAgICAgICBvcC5lbnRlckFuaW0gPSBtT3BzW3BvcysrXTsKKyAgICAgICAgICAgIG9wLmV4aXRBbmltID0gbU9wc1twb3MrK107CisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1PcHNbcG9zKytdOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgb3AucmVtb3ZlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KE4pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KEZyYWdtZW50TWFuYWdlckltcGwuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU0UgIiArIGJzZSArICIgc2V0IHJlbW92ZSBmcmFnbWVudCAjIiArIG1PcHNbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBmbS5tQWN0aXZlLmdldChtT3BzW3BvcysrXSk7CisgICAgICAgICAgICAgICAgICAgIG9wLnJlbW92ZWQuYWRkKHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJzZS5hZGRPcChvcCk7CisgICAgICAgIH0KKyAgICAgICAgYnNlLm1UcmFuc2l0aW9uID0gbVRyYW5zaXRpb247CisgICAgICAgIGJzZS5tVHJhbnNpdGlvblN0eWxlID0gbVRyYW5zaXRpb25TdHlsZTsKKyAgICAgICAgYnNlLm1OYW1lID0gbU5hbWU7CisgICAgICAgIGJzZS5tSW5kZXggPSBtSW5kZXg7CisgICAgICAgIGJzZS5tQWRkVG9CYWNrU3RhY2sgPSB0cnVlOworICAgICAgICBic2UuYnVtcEJhY2tTdGFja05lc3RpbmcoMSk7CisgICAgICAgIHJldHVybiBic2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtT3BzKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtVHJhbnNpdGlvbik7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobVRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobU5hbWUpOworICAgICAgICBkZXN0LndyaXRlSW50KG1JbmRleCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEJhY2tTdGFja1N0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QmFja1N0YWNrU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFja1N0YWNrU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQmFja1N0YWNrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQGhpZGUgRW50cnkgb2YgYW4gb3BlcmF0aW9uIG9uIHRoZSBmcmFnbWVudCBiYWNrIHN0YWNrLgorICovCitmaW5hbCBjbGFzcyBCYWNrU3RhY2tFbnRyeSBpbXBsZW1lbnRzIEZyYWdtZW50VHJhbnNhY3Rpb24sIFJ1bm5hYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCYWNrU3RhY2tFbnRyeSI7CisgICAgCisgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VySW1wbCBtTWFuYWdlcjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX05VTEwgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfQUREID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX1JFUExBQ0UgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfUkVNT1ZFID0gMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QX0hJREUgPSA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgT1BfU0hPVyA9IDU7CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE9wIHsKKyAgICAgICAgT3AgbmV4dDsKKyAgICAgICAgT3AgcHJldjsKKyAgICAgICAgaW50IGNtZDsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQ7CisgICAgICAgIGludCBlbnRlckFuaW07CisgICAgICAgIGludCBleGl0QW5pbTsKKyAgICAgICAgQXJyYXlMaXN0PEZyYWdtZW50PiByZW1vdmVkOworICAgIH0KKyAgICAKKyAgICBPcCBtSGVhZDsKKyAgICBPcCBtVGFpbDsKKyAgICBpbnQgbU51bU9wOworICAgIGludCBtRW50ZXJBbmltOworICAgIGludCBtRXhpdEFuaW07CisgICAgaW50IG1UcmFuc2l0aW9uOworICAgIGludCBtVHJhbnNpdGlvblN0eWxlOworICAgIGJvb2xlYW4gbUFkZFRvQmFja1N0YWNrOworICAgIFN0cmluZyBtTmFtZTsKKyAgICBib29sZWFuIG1Db21taXR0ZWQ7CisgICAgaW50IG1JbmRleDsKKyAgICAKKyAgICBwdWJsaWMgQmFja1N0YWNrRW50cnkoRnJhZ21lbnRNYW5hZ2VySW1wbCBtYW5hZ2VyKSB7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRPcChPcCBvcCkgeworICAgICAgICBpZiAobUhlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUhlYWQgPSBtVGFpbCA9IG9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3AucHJldiA9IG1UYWlsOworICAgICAgICAgICAgbVRhaWwubmV4dCA9IG9wOworICAgICAgICAgICAgbVRhaWwgPSBvcDsKKyAgICAgICAgfQorICAgICAgICBvcC5lbnRlckFuaW0gPSBtRW50ZXJBbmltOworICAgICAgICBvcC5leGl0QW5pbSA9IG1FeGl0QW5pbTsKKyAgICAgICAgbU51bU9wKys7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcCgwLCBmcmFnbWVudCwgdGFnLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsLCBPUF9BREQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZG9BZGRPcChjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCB0YWcsIE9QX0FERCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb0FkZE9wKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnLCBpbnQgb3BjbWQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFkZGVkOiAiICsgZnJhZ21lbnQpOworICAgICAgICB9CisgICAgICAgIGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgZnJhZ21lbnQubUZyYWdtZW50TWFuYWdlciA9IG1NYW5hZ2VyOworICAgICAgICAKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVRhZyAhPSBudWxsICYmICF0YWcuZXF1YWxzKGZyYWdtZW50Lm1UYWcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgY2hhbmdlIHRhZyBvZiBmcmFnbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdtZW50ICsgIjogd2FzICIgKyBmcmFnbWVudC5tVGFnCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubVRhZyA9IHRhZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lclZpZXdJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUZyYWdtZW50SWQgIT0gMCAmJiBmcmFnbWVudC5tRnJhZ21lbnRJZCAhPSBjb250YWluZXJWaWV3SWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBjaGFuZ2UgY29udGFpbmVyIElEIG9mIGZyYWdtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZnJhZ21lbnQgKyAiOiB3YXMgIiArIGZyYWdtZW50Lm1GcmFnbWVudElkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm93ICIgKyBjb250YWluZXJWaWV3SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQubUNvbnRhaW5lcklkID0gZnJhZ21lbnQubUZyYWdtZW50SWQgPSBjb250YWluZXJWaWV3SWQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IG9wY21kOworICAgICAgICBvcC5mcmFnbWVudCA9IGZyYWdtZW50OworICAgICAgICBhZGRPcChvcCk7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICByZXR1cm4gcmVwbGFjZShjb250YWluZXJWaWV3SWQsIGZyYWdtZW50LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZykgeworICAgICAgICBpZiAoY29udGFpbmVyVmlld0lkID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3QgdXNlIG5vbi16ZXJvIGNvbnRhaW5lclZpZXdJZCIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkb0FkZE9wKGNvbnRhaW5lclZpZXdJZCwgZnJhZ21lbnQsIHRhZywgT1BfUkVQTEFDRSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1JFTU9WRTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gaGlkZShGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUltbWVkaWF0ZUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IG5vdCBhZGRlZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgT3Agb3AgPSBuZXcgT3AoKTsKKyAgICAgICAgb3AuY21kID0gT1BfSElERTsKKyAgICAgICAgb3AuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICAgICAgYWRkT3Aob3ApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNob3coRnJhZ21lbnQgZnJhZ21lbnQpIHsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1JbW1lZGlhdGVBY3Rpdml0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBub3QgYWRkZWQ6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9wIG9wID0gbmV3IE9wKCk7CisgICAgICAgIG9wLmNtZCA9IE9QX1NIT1c7CisgICAgICAgIG9wLmZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgICAgIGFkZE9wKG9wKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpIHsKKyAgICAgICAgbUVudGVyQW5pbSA9IGVudGVyOworICAgICAgICBtRXhpdEFuaW0gPSBleGl0OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdGlvbikgeworICAgICAgICBtVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRUcmFuc2l0aW9uU3R5bGUoaW50IHN0eWxlUmVzKSB7CisgICAgICAgIG1UcmFuc2l0aW9uU3R5bGUgPSBzdHlsZVJlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1BZGRUb0JhY2tTdGFjayA9IHRydWU7CisgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgdm9pZCBidW1wQmFja1N0YWNrTmVzdGluZyhpbnQgYW10KSB7CisgICAgICAgIGlmICghbUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBpbiAiICsgdGhpcworICAgICAgICAgICAgICAgICsgIiBieSAiICsgYW10KTsKKyAgICAgICAgT3Agb3AgPSBtSGVhZDsKKyAgICAgICAgd2hpbGUgKG9wICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9wLmZyYWdtZW50Lm1CYWNrU3RhY2tOZXN0aW5nICs9IGFtdDsKKyAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICArIG9wLmZyYWdtZW50ICsgIiB0byAiICsgb3AuZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9b3AucmVtb3ZlZC5zaXplKCktMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IHIgPSBvcC5yZW1vdmVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgci5tQmFja1N0YWNrTmVzdGluZyArPSBhbXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJCdW1wIG5lc3Rpbmcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgciArICIgdG8gIiArIHIubUJhY2tTdGFja05lc3RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wID0gb3AubmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tbWl0KCkgeworICAgICAgICBpZiAobUNvbW1pdHRlZCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tbWl0IGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJDb21taXQ6ICIgKyB0aGlzKTsKKyAgICAgICAgbUNvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIG1JbmRleCA9IG1NYW5hZ2VyLmFsbG9jQmFja1N0YWNrSW5kZXgodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgfQorICAgICAgICBtTWFuYWdlci5lbnF1ZXVlQWN0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gbUluZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGlmIChGcmFnbWVudE1hbmFnZXJJbXBsLkRFQlVHKSBMb2cudihUQUcsICJSdW46ICIgKyB0aGlzKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgIGlmIChtSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkVG9CYWNrU3RhY2soKSBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1bXBCYWNrU3RhY2tOZXN0aW5nKDEpOworCisgICAgICAgIE9wIG9wID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BfQUREOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVQTEFDRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTWFuYWdlci5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NYW5hZ2VyLm1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IG9sZCA9IG1NYW5hZ2VyLm1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUF9SRVBMQUNFOiBhZGRpbmc9IiArIGYgKyAiIG9sZD0iICsgb2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkLm1Db250YWluZXJJZCA9PSBmLm1Db250YWluZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AucmVtb3ZlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZW1vdmVkLmFkZChvbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQubU5leHRBbmltID0gb3AuZXhpdEFuaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQWRkVG9CYWNrU3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5tQmFja1N0YWNrTmVzdGluZyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgIkJ1bXAgbmVzdGluZyBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2xkICsgIiB0byAiICsgb2xkLm1CYWNrU3RhY2tOZXN0aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5yZW1vdmVGcmFnbWVudChvbGQsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5lbnRlckFuaW07CisgICAgICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZEZyYWdtZW50KGYsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVNT1ZFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZi5tTmV4dEFuaW0gPSBvcC5leGl0QW5pbTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuaGlkZUZyYWdtZW50KGYsIG1UcmFuc2l0aW9uLCBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfU0hPVzogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubU5leHRBbmltID0gb3AuZW50ZXJBbmltOworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5zaG93RnJhZ21lbnQoZiwgbVRyYW5zaXRpb24sIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG1NYW5hZ2VyLm1vdmVUb1N0YXRlKG1NYW5hZ2VyLm1DdXJTdGF0ZSwgbVRyYW5zaXRpb24sCisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIAorICAgICAgICBpZiAobUFkZFRvQmFja1N0YWNrKSB7CisgICAgICAgICAgICBtTWFuYWdlci5hZGRCYWNrU3RhY2tTdGF0ZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwb3BGcm9tQmFja1N0YWNrKGJvb2xlYW4gZG9TdGF0ZU1vdmUpIHsKKyAgICAgICAgaWYgKEZyYWdtZW50TWFuYWdlckltcGwuREVCVUcpIExvZy52KFRBRywgInBvcEZyb21CYWNrU3RhY2s6ICIgKyB0aGlzKTsKKworICAgICAgICBidW1wQmFja1N0YWNrTmVzdGluZygtMSk7CisgICAgICAgIAorICAgICAgICBPcCBvcCA9IG1UYWlsOworICAgICAgICB3aGlsZSAob3AgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChvcC5jbWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QX0FERDogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BfUkVQTEFDRTogeworICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gb3AuZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlRnJhZ21lbnQoZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wLnJlbW92ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG9wLnJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudCBvbGQgPSBvcC5yZW1vdmVkLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRGcmFnbWVudChvbGQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9SRU1PVkU6IHsKKyAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG9wLmZyYWdtZW50OworICAgICAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1NYW5hZ2VyLm1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuYWRkRnJhZ21lbnQoZiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9ISURFOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuc2hvd0ZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUF9TSE9XOiB7CisgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBvcC5mcmFnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIuaGlkZUZyYWdtZW50KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5yZXZlcnNlVHJhbnNpdChtVHJhbnNpdGlvbiksIG1UcmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNtZDogIiArIG9wLmNtZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IG9wLnByZXY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChkb1N0YXRlTW92ZSkgeworICAgICAgICAgICAgbU1hbmFnZXIubW92ZVRvU3RhdGUobU1hbmFnZXIubUN1clN0YXRlLAorICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLnJldmVyc2VUcmFuc2l0KG1UcmFuc2l0aW9uKSwgbVRyYW5zaXRpb25TdHlsZSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyLmZyZWVCYWNrU3RhY2tJbmRleChtSW5kZXgpOworICAgICAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFRyYW5zaXRpb25TdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2l0aW9uU3R5bGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1OdW1PcCA9PSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKaW5kZXggODg5OWQ3Ni4uNzQ5NzEzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKQEAgLTU2LDExICs1NiwxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKIGltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklMb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CkBAIC04OSw3ICs5Miw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHMuRmlsZVN0YXR1czsKIGltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuQ2xpcGJvYXJkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKQEAgLTE2OSw2ICsxNzIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFRocm90dGxlTWFuYWdlciBzVGhyb3R0bGVNYW5hZ2VyOwogICAgIHByaXZhdGUgc3RhdGljIFdpZmlNYW5hZ2VyIHNXaWZpTWFuYWdlcjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhdGlvbk1hbmFnZXIgc0xvY2F0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudHJ5RGV0ZWN0b3Igc0NvdW50cnlEZXRlY3RvcjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU2hhcmVkUHJlZmVyZW5jZXNJbXBsPiBzU2hhcmVkUHJlZnMgPQogICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTaGFyZWRQcmVmZXJlbmNlc0ltcGw+KCk7CiAKQEAgLTIxMCwyMyArMjE0LDggQEAKICAgICBwcml2YXRlIEZpbGUgbUV4dGVybmFsRmlsZXNEaXI7CiAgICAgcHJpdmF0ZSBGaWxlIG1FeHRlcm5hbENhY2hlRGlyOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzSW5zdGFuY2VDb3VudCA9IDA7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9GSUxFX0xJU1QgPSB7fTsKIAotICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQXNzZXRNYW5hZ2VyIGdldEFzc2V0cygpIHsKICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXMuZ2V0QXNzZXRzKCk7CkBAIC01NDMsNiArNTMyLDE1IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7CisgICAgICAgIEZpbGUgZiA9IHZhbGlkYXRlRmlsZVBhdGgobmFtZSwgdHJ1ZSk7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoZi5nZXRQYXRoKCksIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgICAgIHNldEZpbGVQZXJtaXNzaW9uc0Zyb21Nb2RlKGYuZ2V0UGF0aCgpLCBtb2RlLCAwKTsKKyAgICAgICAgcmV0dXJuIGRiOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZURhdGFiYXNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWxlIGYgPSB2YWxpZGF0ZUZpbGVQYXRoKG5hbWUsIGZhbHNlKTsKQEAgLTYyMCw3ICs2MTgsOCBAQAogICAgICAgICAgICAgICAgICAgICArICIgSXMgdGhpcyByZWFsbHkgd2hhdCB5b3Ugd2FudD8iKTsKICAgICAgICAgfQogICAgICAgICBtTWFpblRocmVhZC5nZXRJbnN0cnVtZW50YXRpb24oKS5leGVjU3RhcnRBY3Rpdml0eSgKLSAgICAgICAgICAgIGdldE91dGVyQ29udGV4dCgpLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBudWxsLCBudWxsLCBpbnRlbnQsIC0xKTsKKyAgICAgICAgICAgIGdldE91dGVyQ29udGV4dCgpLCBtTWFpblRocmVhZC5nZXRBcHBsaWNhdGlvblRocmVhZCgpLCBudWxsLAorICAgICAgICAgICAgKEFjdGl2aXR5KW51bGwsIGludGVudCwgLTEpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTQ0LDYgKzk0Myw4IEBACiAgICAgICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcyk7CiAgICAgICAgIH0gZWxzZSBpZiAoTE9DQVRJT05fU0VSVklDRS5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChDT1VOVFJZX0RFVEVDVE9SLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENvdW50cnlEZXRlY3RvcigpOwogICAgICAgICB9IGVsc2UgaWYgKFNFQVJDSF9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFNlYXJjaE1hbmFnZXIoKTsKICAgICAgICAgfSBlbHNlIGlmIChTRU5TT1JfU0VSVklDRS5lcXVhbHMobmFtZSkpIHsKQEAgLTExMTAsNiArMTExMSwxNyBAQAogICAgICAgICByZXR1cm4gc0xvY2F0aW9uTWFuYWdlcjsKICAgICB9CiAKKyAgICBwcml2YXRlIENvdW50cnlEZXRlY3RvciBnZXRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1N5bmMpIHsKKyAgICAgICAgICAgIGlmIChzQ291bnRyeURldGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENPVU5UUllfREVURUNUT1IpOworICAgICAgICAgICAgICAgIElDb3VudHJ5RGV0ZWN0b3Igc2VydmljZSA9IElDb3VudHJ5RGV0ZWN0b3IuU3R1Yi5hc0ludGVyZmFjZShiKTsKKyAgICAgICAgICAgICAgICBzQ291bnRyeURldGVjdG9yID0gbmV3IENvdW50cnlEZXRlY3RvcihzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0NvdW50cnlEZXRlY3RvcjsKKyAgICB9CisKICAgICBwcml2YXRlIFNlYXJjaE1hbmFnZXIgZ2V0U2VhcmNoTWFuYWdlcigpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1TZWFyY2hNYW5hZ2VyID09IG51bGwpIHsKQEAgLTE0ODMsOCArMTQ5NSw2IEBACiAgICAgfQogCiAgICAgQ29udGV4dEltcGwoKSB7Ci0gICAgICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgICAgIC8vKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbU91dGVyQ29udGV4dCA9IHRoaXM7CiAgICAgfQogCkBAIC0xNDk1LDcgKzE1MDUsNiBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IEV4aXN0aW5nIGFwcGxpY2F0aW9uIGNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHRJbXBsKENvbnRleHRJbXBsIGNvbnRleHQpIHsKLSAgICAgICAgKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbVBhY2thZ2VJbmZvID0gY29udGV4dC5tUGFja2FnZUluZm87CiAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0Lm1SZXNvdXJjZXM7CiAgICAgICAgIG1NYWluVGhyZWFkID0gY29udGV4dC5tTWFpblRocmVhZDsKQEAgLTI4MDAsNiArMjgwOSwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB2ID0gKFNldDxTdHJpbmc+KSBtTWFwLmdldChrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogZGVmVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZlZhbHVlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTI4NjEsNiArMjg3NywxMiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgRWRpdG9yIHB1dFN0cmluZ1NldChTdHJpbmcga2V5LCBTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1vZGlmaWVkLnB1dChrZXksIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB1YmxpYyBFZGl0b3IgcHV0SW50KFN0cmluZyBrZXksIGludCB2YWx1ZSkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgICAgICBtTW9kaWZpZWQucHV0KGtleSwgdmFsdWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZy5qYXZhCmluZGV4IGRhOGM5ZTUuLmEwYmUwY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9EaWFsb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nLmphdmEKQEAgLTE2LDE4ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuYXBwOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLkFjdGlvbkJhckltcGw7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwpAQCAtMzYsMTMgKzM5LDEyIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CkBAIC03Niw2ICs3OCw3IEBACiAgICAgZmluYWwgV2luZG93TWFuYWdlciBtV2luZG93TWFuYWdlcjsKICAgICBXaW5kb3cgbVdpbmRvdzsKICAgICBWaWV3IG1EZWNvcjsKKyAgICBwcml2YXRlIEFjdGlvbkJhckltcGwgbUFjdGlvbkJhcjsKICAgICAvKioKICAgICAgKiBUaGlzIGZpZWxkIHNob3VsZCBiZSBtYWRlIHByaXZhdGUsIHNvIGl0IGlzIGhpZGRlbiBmcm9tIHRoZSBTREsuCiAgICAgICoge0BoaWRlfQpAQCAtMTc3LDYgKzE4MCwxNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSB7QGxpbmsgQWN0aW9uQmFyfSBhdHRhY2hlZCB0byB0aGlzIGRpYWxvZywgaWYgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEFjdGlvbkJhciBhdHRhY2hlZCB0byB0aGUgZGlhbG9nIG9yIG51bGwgaWYgbm8gQWN0aW9uQmFyIGlzIHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkJhciBnZXRBY3Rpb25CYXIoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uQmFyOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIEFjdGl2aXR5IHRoYXQgb3ducyB0aGlzIGRpYWxvZy4gQW4gZXhhbXBsZSB1c2U6IFRoaXMgRGlhbG9nIHdpbGwKICAgICAgKiB1c2UgdGhlIHN1Z2dlc3RlZCB2b2x1bWUgY29udHJvbCBzdHJlYW0gb2YgdGhlIEFjdGl2aXR5LgogICAgICAqIApAQCAtMjE2LDYgKzIyOCw5IEBACiAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKICAgICAgICAgaWYgKG1TaG93aW5nKSB7CiAgICAgICAgICAgICBpZiAobURlY29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVdpbmRvdy5oYXNGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0FDVElPTl9CQVIpKSB7CisgICAgICAgICAgICAgICAgICAgIG1XaW5kb3cuaW52YWxpZGF0ZVBhbmVsTWVudShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbURlY29yLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybjsKQEAgLTIyNyw2ICsyNDIsMTEgQEAKIAogICAgICAgICBvblN0YXJ0KCk7CiAgICAgICAgIG1EZWNvciA9IG1XaW5kb3cuZ2V0RGVjb3JWaWV3KCk7CisKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgPT0gbnVsbCAmJiBtV2luZG93Lmhhc0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfQUNUSU9OX0JBUikpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIgPSBuZXcgQWN0aW9uQmFySW1wbCh0aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGwgPSBtV2luZG93LmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICAgaWYgKChsLnNvZnRJbnB1dE1vZGUKICAgICAgICAgICAgICAgICAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfSVNfRk9SV0FSRF9OQVZJR0FUSU9OKSA9PSAwKSB7CkBAIC0zMTAsNyArMzMwLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTaW1pbGFyIHRvIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZX0sIHlvdSBzaG91bGQgaW5pdGlhbGl6ZWQgeW91ciBkaWFsb2cKKyAgICAgKiBTaW1pbGFyIHRvIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZX0sIHlvdSBzaG91bGQgaW5pdGlhbGl6ZSB5b3VyIGRpYWxvZwogICAgICAqIGluIHRoaXMgbWV0aG9kLCBpbmNsdWRpbmcgY2FsbGluZyB7QGxpbmsgI3NldENvbnRlbnRWaWV3fS4KICAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoaXMgZGlhbG9nIGlzIGJlaW5nIHJlaW5pdGFsaXplZCBhZnRlciBhCiAgICAgICogICAgIHRoZSBob3N0aW5nIGFjdGl2aXR5IHdhcyBwcmV2aW91c2x5IHNodXQgZG93biwgaG9sZHMgdGhlIHJlc3VsdCBmcm9tCkBAIC03NzUsNiArNzk1LDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQHNlZSBBY3Rpdml0eSNpbnZhbGlkYXRlT3B0aW9uc01lbnUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVPcHRpb25zTWVudSgpIHsKKyAgICAgICAgbVdpbmRvdy5pbnZhbGlkYXRlUGFuZWxNZW51KFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEBzZWUgQWN0aXZpdHkjb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSwgVmlldywgQ29udGV4dE1lbnVJbmZvKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKQEAgLTgzMiw4ICs4NTksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIG9uU3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25CYXIuc3RhcnRBY3Rpb25Nb2RlKGNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpdml0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFsb2csIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gYXNzb2NhaXRlZCBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIFRoZSBhY3Rpdml0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkaWFsb2csIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCBhY3Rpdml0eS4KICAgICAgKi8KICAgICBwcml2YXRlIENvbXBvbmVudE5hbWUgZ2V0QXNzb2NpYXRlZEFjdGl2aXR5KCkgewogICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IG1Pd25lckFjdGl2aXR5OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZ0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRGlhbG9nRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGRmYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0RpYWxvZ0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworCisvKioKKyAqIEEgZnJhZ21lbnQgdGhhdCBkaXNwbGF5cyBhIGRpYWxvZyB3aW5kb3csIGZsb2F0aW5nIG9uIHRvcCBvZiBpdHMKKyAqIGFjdGl2aXR5J3Mgd2luZG93LiAgVGhpcyBmcmFnbWVudCBjb250YWlucyBhIERpYWxvZyBvYmplY3QsIHdoaWNoIGl0CisgKiBkaXNwbGF5cyBhcyBhcHByb3ByaWF0ZSBiYXNlZCBvbiB0aGUgZnJhZ21lbnQncyBzdGF0ZS4gIENvbnRyb2wgb2YKKyAqIHRoZSBkaWFsb2cgKGRlY2lkaW5nIHdoZW4gdG8gc2hvdywgaGlkZSwgZGlzbWlzcyBpdCkgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaAorICogdGhlIEFQSSBoZXJlLCBub3Qgd2l0aCBkaXJlY3QgY2FsbHMgb24gdGhlIGRpYWxvZy4KKyAqCisgKiA8cD5JbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudAorICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0gdG8gc3VwcGx5IHRoZQorICogY29udGVudCBvZiB0aGUgZGlhbG9nLiAgQWx0ZXJuYXRpdmVseSwgdGhleSBjYW4gb3ZlcnJpZGUKKyAqIHtAbGluayAjb25DcmVhdGVEaWFsb2coQnVuZGxlKX0gdG8gY3JlYXRlIGFuIGVudGlyZWx5IGN1c3RvbSBkaWFsb2csIHN1Y2gKKyAqIGFzIGFuIEFsZXJ0RGlhbG9nLCB3aXRoIGl0cyBvd24gY29udGVudC4KKyAqCisgKiA8cD5Ub3BpY3MgY292ZXJlZCBoZXJlOgorICogPG9sPgorICogPGxpPjxhIGhyZWY9IiNMaWZlY3ljbGUiPkxpZmVjeWNsZTwvYT4KKyAqIDxsaT48YSBocmVmPSIjQmFzaWNEaWFsb2ciPkJhc2ljIERpYWxvZzwvYT4KKyAqIDxsaT48YSBocmVmPSIjQWxlcnREaWFsb2ciPkFsZXJ0IERpYWxvZzwvYT4KKyAqIDxsaT48YSBocmVmPSIjRGlhbG9nT3JFbWJlZCI+U2VsZWN0aW5nIEJldHdlZW4gRGlhbG9nIG9yIEVtYmVkZGluZzwvYT4KKyAqIDwvb2w+CisgKgorICogPGEgbmFtZT0iTGlmZWN5Y2xlIj48L2E+CisgKiA8aDM+TGlmZWN5Y2xlPC9oMz4KKyAqCisgKiA8cD5EaWFsb2dGcmFnbWVudCBkb2VzIHZhcmlvdXMgdGhpbmdzIHRvIGtlZXAgdGhlIGZyYWdtZW50J3MgbGlmZWN5Y2xlCisgKiBkcml2aW5nIGl0LCBpbnN0ZWFkIG9mIHRoZSBEaWFsb2cuICBOb3RlIHRoYXQgZGlhbG9ncyBhcmUgZ2VuZXJhbGx5CisgKiBhdXRvbm9tb3VzIGVudGl0aWVzIC0tIHRoZXkgYXJlIHRoZWlyIG93biB3aW5kb3csIHJlY2VpdmluZyB0aGVpciBvd24KKyAqIGlucHV0IGV2ZW50cywgYW5kIG9mdGVuIGRlY2lkaW5nIG9uIHRoZWlyIG93biB3aGVuIHRvIGRpc2FwcGVhciAoYnkKKyAqIHJlY2VpdmluZyBhIGJhY2sga2V5IGV2ZW50IG9yIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgYnV0dG9uKS4KKyAqCisgKiA8cD5EaWFsb2dGcmFnbWVudCBuZWVkcyB0byBlbnN1cmUgdGhhdCB3aGF0IGlzIGhhcHBlbmluZyB3aXRoIHRoZSBGcmFnbWVudAorICogYW5kIERpYWxvZyBzdGF0ZXMgcmVtYWlucyBjb25zaXN0ZW50LiAgVG8gZG8gdGhpcywgaXQgd2F0Y2hlcyBmb3IgZGlzbWlzcworICogZXZlbnRzIGZyb20gdGhlIGRpYWxvZyBhbmQgdGFrZXMgYXJlIG9mIHJlbW92aW5nIGl0cyBvd24gc3RhdGUgd2hlbiB0aGV5CisgKiBoYXBwZW4uICBUaGlzIG1lYW5zIHlvdSBzaG91bGQgdXNlIHtAbGluayAjc2hvdyhGcmFnbWVudE1hbmFnZXIsIFN0cmluZyl9CisgKiBvciB7QGxpbmsgI3Nob3coRnJhZ21lbnRUcmFuc2FjdGlvbiwgU3RyaW5nKX0gdG8gYWRkIGFuIGluc3RhbmNlIG9mCisgKiBEaWFsb2dGcmFnbWVudCB0byB5b3VyIFVJLCBhcyB0aGVzZSBrZWVwIHRyYWNrIG9mIGhvdyBEaWFsb2dGcmFnbWVudCBzaG91bGQKKyAqIHJlbW92ZSBpdHNlbGYgd2hlbiB0aGUgZGlhbG9nIGlzIGRpc21pc3NlZC4KKyAqCisgKiA8YSBuYW1lPSJCYXNpY0RpYWxvZyI+PC9hPgorICogPGgzPkJhc2ljIERpYWxvZzwvaDM+CisgKgorICogPHA+VGhlIHNpbXBsZXN0IHVzZSBvZiBEaWFsb2dGcmFnbWVudCBpcyBhcyBhIGZsb2F0aW5nIGNvbnRhaW5lciBmb3IgdGhlCisgKiBmcmFnbWVudCdzIHZpZXcgaGllcmFyY2h5LiAgQSBzaW1wbGUgaW1wbGVtZW50YXRpb24gbWF5IGxvb2sgbGlrZSB0aGlzOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQorICogICAgICBkaWFsb2d9CisgKgorICogPHA+QW4gZXhhbXBsZSBzaG93RGlhbG9nKCkgbWV0aG9kIG9uIHRoZSBBY3Rpdml0eSBjb3VsZCBiZToKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEKKyAqICAgICAgYWRkX2RpYWxvZ30KKyAqCisgKiA8cD5UaGlzIHJlbW92ZXMgYW55IGN1cnJlbnRseSBzaG93biBkaWFsb2csIGNyZWF0ZXMgYSBuZXcgRGlhbG9nRnJhZ21lbnQKKyAqIHdpdGggYW4gYXJndW1lbnQsIGFuZCBzaG93cyBpdCBhcyBhIG5ldyBzdGF0ZSBvbiB0aGUgYmFjayBzdGFjay4gIFdoZW4gdGhlCisgKiB0cmFuc2FjdGlvbiBpcyBwb3BwZWQsIHRoZSBjdXJyZW50IERpYWxvZ0ZyYWdtZW50IGFuZCBpdHMgRGlhbG9nIHdpbGwgYmUKKyAqIGRlc3Ryb3llZCwgYW5kIHRoZSBwcmV2aW91cyBvbmUgKGlmIGFueSkgcmUtc2hvd24uICBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlCisgKiBEaWFsb2dGcmFnbWVudCB3aWxsIHRha2UgY2FyZSBvZiBwb3BwaW5nIHRoZSB0cmFuc2FjdGlvbiBvZiB0aGUgRGlhbG9nCisgKiBpcyBkaXNtaXNzZWQgc2VwYXJhdGVseSBmcm9tIGl0LgorICoKKyAqIDxhIG5hbWU9IkFsZXJ0RGlhbG9nIj48L2E+CisgKiA8aDM+QWxlcnQgRGlhbG9nPC9oMz4KKyAqCisgKiA8cD5JbnN0ZWFkIG9mIChvciBpbiBhZGRpdGlvbiB0bykgaW1wbGVtZW50aW5nIHtAbGluayAjb25DcmVhdGVWaWV3fSB0bworICogZ2VuZXJhdGUgdGhlIHZpZXcgaGllcmFyY2h5IGluc2lkZSBvZiBhIGRpYWxvZywgeW91IG1heSBpbXBsZW1lbnQKKyAqIHtAbGluayAjb25DcmVhdGVEaWFsb2coQnVuZGxlKX0gdG8gY3JlYXRlIHlvdXIgb3duIGN1c3RvbSBEaWFsb2cgb2JqZWN0LgorICoKKyAqIDxwPlRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGNyZWF0aW5nIGFuIHtAbGluayBBbGVydERpYWxvZ30sIGFsbG93aW5nIHlvdQorICogdG8gZGlzcGxheSBzdGFuZGFyZCBhbGVydHMgdG8gdGhlIHVzZXIgdGhhdCBhcmUgbWFuYWdlZCBieSBhIGZyYWdtZW50LgorICogQSBzaW1wbGUgZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGlzOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRBbGVydERpYWxvZy5qYXZhCisgKiAgICAgIGRpYWxvZ30KKyAqCisgKiA8cD5UaGUgYWN0aXZpdHkgY3JlYXRpbmcgdGhpcyBmcmFnbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdG8KKyAqIHNob3cgdGhlIGRpYWxvZyBhbmQgcmVjZWl2ZSByZXN1bHRzIGZyb20gaXQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKKyAqICAgICAgYWN0aXZpdHl9CisgKgorICogPHA+Tm90ZSB0aGF0IGluIHRoaXMgY2FzZSB0aGUgZnJhZ21lbnQgaXMgbm90IHBsYWNlZCBvbiB0aGUgYmFjayBzdGFjaywgaXQKKyAqIGlzIGp1c3QgYWRkZWQgYXMgYW4gaW5kZWZpbml0ZWx5IHJ1bm5pbmcgZnJhZ21lbnQuICBCZWNhdXNlIGRpYWxvZ3Mgbm9ybWFsbHkKKyAqIGFyZSBtb2RhbCwgdGhpcyB3aWxsIHN0aWxsIG9wZXJhdGUgYXMgYSBiYWNrIHN0YWNrLCBzaW5jZSB0aGUgZGlhbG9nIHdpbGwKKyAqIGNhcHR1cmUgdXNlciBpbnB1dCB1bnRpbCBpdCBpcyBkaXNtaXNzZWQuICBXaGVuIGl0IGlzIGRpc21pc3NlZCwgRGlhbG9nRnJhZ21lbnQKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIHJlbW92aW5nIGl0c2VsZiBmcm9tIGl0cyBmcmFnbWVudCBtYW5hZ2VyLgorICoKKyAqIDxhIG5hbWU9IkRpYWxvZ09yRW1iZWQiPjwvYT4KKyAqIDxoMz5TZWxlY3RpbmcgQmV0d2VlbiBEaWFsb2cgb3IgRW1iZWRkaW5nPC9oMz4KKyAqCisgKiA8cD5BIERpYWxvZ0ZyYWdtZW50IGNhbiBzdGlsbCBvcHRpb25hbGx5IGJlIHVzZWQgYXMgYSBub3JtYWwgZnJhZ21lbnQsIGlmCisgKiBkZXNpcmVkLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBmcmFnbWVudCB0aGF0IGluIHNvbWUgY2FzZXMgc2hvdWxkCisgKiBiZSBzaG93biBhcyBhIGRpYWxvZyBhbmQgb3RoZXJzIGVtYmVkZGVkIGluIGEgbGFyZ2VyIFVJLiAgVGhpcyBiZWhhdmlvcgorICogd2lsbCBub3JtYWxseSBiZSBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIGZvciB5b3UgYmFzZWQgb24gaG93IHlvdSBhcmUgdXNpbmcKKyAqIHRoZSBmcmFnbWVudCwgYnV0IGNhbiBiZSBjdXN0b21pemVkIHdpdGgge0BsaW5rICNzZXRTaG93c0RpYWxvZyhib29sZWFuKX0uCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGhlcmUgaXMgYSBzaW1wbGUgZGlhbG9nIGZyYWdtZW50OgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5LmphdmEKKyAqICAgICAgZGlhbG9nfQorICoKKyAqIDxwPkFuIGluc3RhbmNlIG9mIHRoaXMgZnJhZ21lbnQgY2FuIGJlIGNyZWF0ZWQgYW5kIHNob3duIGFzIGEgZGlhbG9nOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5LmphdmEKKyAqICAgICAgc2hvd19kaWFsb2d9CisgKgorICogPHA+SXQgY2FuIGFsc28gYmUgYWRkZWQgYXMgY29udGVudCBpbiBhIHZpZXcgaGllcmFyY2h5OgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2dPckFjdGl2aXR5LmphdmEKKyAqICAgICAgZW1iZWR9CisgKi8KK3B1YmxpYyBjbGFzcyBEaWFsb2dGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50CisgICAgICAgIGltcGxlbWVudHMgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIsIERpYWxvZ0ludGVyZmFjZS5PbkRpc21pc3NMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBTdHlsZSBmb3Ige0BsaW5rICNzZXRTdHlsZShpbnQsIGludCl9OiBhIGJhc2ljLAorICAgICAqIG5vcm1hbCBkaWFsb2cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9STUFMID0gMDsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGRvbid0IGluY2x1ZGUKKyAgICAgKiBhIHRpdGxlIGFyZWEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfTk9fVElUTEUgPSAxOworCisgICAgLyoqCisgICAgICogU3R5bGUgZm9yIHtAbGluayAjc2V0U3R5bGUoaW50LCBpbnQpfTogZG9uJ3QgZHJhdworICAgICAqIGFueSBmcmFtZSBhdCBhbGw7IHRoZSB2aWV3IGhpZXJhcmNoeSByZXR1cm5lZCBieSB7QGxpbmsgI29uQ3JlYXRlVmlld30KKyAgICAgKiBpcyBlbnRpcmVseSByZXNwb25zaWJsZSBmb3IgZHJhd2luZyB0aGUgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX05PX0ZSQU1FID0gMjsKKworICAgIC8qKgorICAgICAqIFN0eWxlIGZvciB7QGxpbmsgI3NldFN0eWxlKGludCwgaW50KX06IGxpa2UKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX0ZSQU1FfSwgYnV0IGFsc28gZGlzYWJsZXMgYWxsIGlucHV0IHRvIHRoZSBkaWFsb2cuCisgICAgICogVGhlIHVzZXIgY2FuIG5vdCB0b3VjaCBpdCwgYW5kIGl0cyB3aW5kb3cgd2lsbCBub3QgcmVjZWl2ZSBpbnB1dCBmb2N1cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9OT19JTlBVVCA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfRElBTE9HX1NUQVRFX1RBRyA9ICJhbmRyb2lkOnNhdmVkRGlhbG9nU3RhdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9TVFlMRSA9ICJhbmRyb2lkOnN0eWxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfVEhFTUUgPSAiYW5kcm9pZDp0aGVtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX0NBTkNFTEFCTEUgPSAiYW5kcm9pZDpjYW5jZWxhYmxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfU0hPV1NfRElBTE9HID0gImFuZHJvaWQ6c2hvd3NEaWFsb2ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9CQUNLX1NUQUNLX0lEID0gImFuZHJvaWQ6YmFja1N0YWNrSWQiOworCisgICAgaW50IG1TdHlsZSA9IFNUWUxFX05PUk1BTDsKKyAgICBpbnQgbVRoZW1lID0gMDsKKyAgICBib29sZWFuIG1DYW5jZWxhYmxlID0gdHJ1ZTsKKyAgICBib29sZWFuIG1TaG93c0RpYWxvZyA9IHRydWU7CisgICAgaW50IG1CYWNrU3RhY2tJZCA9IC0xOworCisgICAgRGlhbG9nIG1EaWFsb2c7CisgICAgYm9vbGVhbiBtRGVzdHJveWVkOworICAgIGJvb2xlYW4gbVJlbW92ZWQ7CisKKyAgICBwdWJsaWMgRGlhbG9nRnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCB0byBjdXN0b21pemUgdGhlIGJhc2ljIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW9yIG9mIHRoZQorICAgICAqIGZyYWdtZW50J3MgZGlhbG9nLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3Igc29tZSBjb21tb24gZGlhbG9nIGJlaGF2aW9ycywKKyAgICAgKiB0YWtpbmcgY2FyZSBvZiBzZWxlY3RpbmcgZmxhZ3MsIHRoZW1lLCBhbmQgb3RoZXIgb3B0aW9ucyBmb3IgeW91LiAgVGhlCisgICAgICogc2FtZSBlZmZlY3QgY2FuIGJlIGFjaGlldmUgYnkgbWFudWFsbHkgc2V0dGluZyBEaWFsb2cgYW5kIFdpbmRvdworICAgICAqIGF0dHJpYnV0ZXMgeW91cnNlbGYuICBDYWxsaW5nIHRoaXMgYWZ0ZXIgdGhlIGZyYWdtZW50J3MgRGlhbG9nIGlzCisgICAgICogY3JlYXRlZCB3aWxsIGhhdmUgbm8gZWZmZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0eWxlIFNlbGVjdHMgYSBzdGFuZGFyZCBzdHlsZTogbWF5IGJlIHtAbGluayAjU1RZTEVfTk9STUFMfSwKKyAgICAgKiB7QGxpbmsgI1NUWUxFX05PX1RJVExFfSwge0BsaW5rICNTVFlMRV9OT19GUkFNRX0sIG9yCisgICAgICoge0BsaW5rICNTVFlMRV9OT19JTlBVVH0uCisgICAgICogQHBhcmFtIHRoZW1lIE9wdGlvbmFsIGN1c3RvbSB0aGVtZS4gIElmIDAsIGFuIGFwcHJvcHJpYXRlIHRoZW1lIChiYXNlZAorICAgICAqIG9uIHRoZSBzdHlsZSkgd2lsbCBiZSBzZWxlY3RlZCBmb3IgeW91LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKGludCBzdHlsZSwgaW50IHRoZW1lKSB7CisgICAgICAgIG1TdHlsZSA9IHN0eWxlOworICAgICAgICBpZiAobVN0eWxlID09IFNUWUxFX05PX0ZSQU1FIHx8IG1TdHlsZSA9PSBTVFlMRV9OT19JTlBVVCkgeworICAgICAgICAgICAgbVRoZW1lID0gYW5kcm9pZC5SLnN0eWxlLlRoZW1lX0RpYWxvZ19Ob0ZyYW1lOworICAgICAgICB9CisgICAgICAgIGlmICh0aGVtZSAhPSAwKSB7CisgICAgICAgICAgICBtVGhlbWUgPSB0aGVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Uge0BsaW5rICNzaG93KEZyYWdtZW50TWFuYWdlciwgU3RyaW5nKX0uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBzaG93KEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBhY3Rpdml0eS5vcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICBmdC5hZGQodGhpcywgdGFnKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgZGlhbG9nLCBhZGRpbmcgdGhlIGZyYWdtZW50IHRvIHRoZSBnaXZlbiBGcmFnbWVudE1hbmFnZXIuICBUaGlzCisgICAgICogaXMgYSBjb252ZW5pZW5jZSBmb3IgZXhwbGljaXRseSBjcmVhdGluZyBhIHRyYW5zYWN0aW9uLCBhZGRpbmcgdGhlCisgICAgICogZnJhZ21lbnQgdG8gaXQgd2l0aCB0aGUgZ2l2ZW4gdGFnLCBhbmQgY29tbWl0dGluZyBpdC4gIFRoaXMgZG9lcworICAgICAqIDxlbT5ub3Q8L2VtPiBhZGQgdGhlIHRyYW5zYWN0aW9uIHRvIHRoZSBiYWNrIHN0YWNrLiAgV2hlbiB0aGUgZnJhZ21lbnQKKyAgICAgKiBpcyBkaXNtaXNzZWQsIGEgbmV3IHRyYW5zYWN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgdG8gcmVtb3ZlIGl0IGZyb20KKyAgICAgKiB0aGUgYWN0aXZpdHkuCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIEZyYWdtZW50TWFuYWdlciB0aGlzIGZyYWdtZW50IHdpbGwgYmUgYWRkZWQgdG8uCisgICAgICogQHBhcmFtIHRhZyBUaGUgdGFnIGZvciB0aGlzIGZyYWdtZW50LCBhcyBwZXIKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNhZGQoRnJhZ21lbnQsIFN0cmluZykgRnJhZ21lbnRUcmFuc2FjdGlvbi5hZGR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coRnJhZ21lbnRNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IG1hbmFnZXIub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZ0LmFkZCh0aGlzLCB0YWcpOworICAgICAgICBmdC5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBkaWFsb2csIGFkZGluZyB0aGUgZnJhZ21lbnQgdXNpbmcgYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24KKyAgICAgKiBhbmQgdGhlbiBjb21taXR0aW5nIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gQW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdG8gYWRkIHRoZSBmcmFnbWVudC4KKyAgICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgZm9yIHRoaXMgZnJhZ21lbnQsIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2FkZChGcmFnbWVudCwgU3RyaW5nKSBGcmFnbWVudFRyYW5zYWN0aW9uLmFkZH0uCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb21taXR0ZWQgdHJhbnNhY3Rpb24sIGFzIHBlcgorICAgICAqIHtAbGluayBGcmFnbWVudFRyYW5zYWN0aW9uI2NvbW1pdCgpIEZyYWdtZW50VHJhbnNhY3Rpb24uY29tbWl0KCl9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2hvdyhGcmFnbWVudFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBTdHJpbmcgdGFnKSB7CisgICAgICAgIHRyYW5zYWN0aW9uLmFkZCh0aGlzLCB0YWcpOworICAgICAgICBtUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICBtQmFja1N0YWNrSWQgPSB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICAgICAgcmV0dXJuIG1CYWNrU3RhY2tJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNtaXNzIHRoZSBmcmFnbWVudCBhbmQgaXRzIGRpYWxvZy4gIElmIHRoZSBmcmFnbWVudCB3YXMgYWRkZWQgdG8gdGhlCisgICAgICogYmFjayBzdGFjaywgYWxsIGJhY2sgc3RhY2sgc3RhdGUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGVudHJ5IHdpbGwKKyAgICAgKiBiZSBwb3BwZWQuICBPdGhlcndpc2UsIGEgbmV3IHRyYW5zYWN0aW9uIHdpbGwgYmUgY29tbWl0dGVkIHRvIHJlbW92ZQorICAgICAqIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1EaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgICAgIG1SZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1CYWNrU3RhY2tJZCA+PSAwKSB7CisgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5wb3BCYWNrU3RhY2sobUJhY2tTdGFja0lkLAorICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXIuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFKTsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tJZCA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZnQucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgZnQuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGlhbG9nIGdldERpYWxvZygpIHsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2c7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRUaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaGVtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgdGhlIHNob3duIERpYWxvZyBpcyBjYW5jZWxhYmxlLiAgVXNlIHRoaXMgaW5zdGVhZCBvZgorICAgICAqIGRpcmVjdGx5IGNhbGxpbmcge0BsaW5rIERpYWxvZyNzZXRDYW5jZWxhYmxlKGJvb2xlYW4pCisgICAgICogRGlhbG9nLnNldENhbmNlbGFibGUoYm9vbGVhbil9LCBiZWNhdXNlIERpYWxvZ0ZyYWdtZW50IG5lZWRzIHRvIGNoYW5nZQorICAgICAqIGl0cyBiZWhhdmlvciBiYXNlZCBvbiB0aGlzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbmNlbGFibGUgSWYgdHJ1ZSwgdGhlIGRpYWxvZyBpcyBjYW5jZWxhYmxlLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbGFibGUoYm9vbGVhbiBjYW5jZWxhYmxlKSB7CisgICAgICAgIG1DYW5jZWxhYmxlID0gY2FuY2VsYWJsZTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgbURpYWxvZy5zZXRDYW5jZWxhYmxlKGNhbmNlbGFibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB7QGxpbmsgI3NldENhbmNlbGFibGUoYm9vbGVhbil9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtQ2FuY2VsYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoaXMgZnJhZ21lbnQgc2hvdWxkIGJlIHNob3duIGluIGEgZGlhbG9nLiAgSWYgbm90CisgICAgICogc2V0LCBubyBEaWFsb2cgd2lsbCBiZSBjcmVhdGVkIGluIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0sCisgICAgICogYW5kIHRoZSBmcmFnbWVudCdzIHZpZXcgaGllcmFyY2h5IHdpbGwgdGh1cyBub3QgYmUgYWRkZWQgdG8gaXQuICBUaGlzCisgICAgICogYWxsb3dzIHlvdSB0byBpbnN0ZWFkIHVzZSBpdCBhcyBhIG5vcm1hbCBmcmFnbWVudCAoZW1iZWRkZWQgaW5zaWRlIG9mCisgICAgICogaXRzIGFjdGl2aXR5KS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgbm9ybWFsbHkgc2V0IGZvciB5b3UgYmFzZWQgb24gd2hldGhlciB0aGUgZnJhZ21lbnQgaXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYSBjb250YWluZXIgdmlldyBJRCBwYXNzZWQgdG8KKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNhZGQoaW50LCBGcmFnbWVudCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5hZGQoaW50LCBGcmFnbWVudCl9LgorICAgICAqIElmIHRoZSBmcmFnbWVudCB3YXMgYWRkZWQgd2l0aCBhIGNvbnRhaW5lciwgc2V0U2hvd3NEaWFsb2cgd2lsbCBiZQorICAgICAqIGluaXRpYWxpemVkIHRvIGZhbHNlOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUgdHJ1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaG93c0RpYWxvZyBJZiB0cnVlLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBEaWFsb2cuCisgICAgICogSWYgZmFsc2UsIG5vIERpYWxvZyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBmcmFnbWVudCdzIHZpZXcgaGllcmFyY2hseQorICAgICAqIGxlZnQgdW5kaXN0dXJiZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2hvd3NEaWFsb2coYm9vbGVhbiBzaG93c0RpYWxvZykgeworICAgICAgICBtU2hvd3NEaWFsb2cgPSBzaG93c0RpYWxvZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2Yge0BsaW5rICNzZXRTaG93c0RpYWxvZyhib29sZWFuKX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd3NEaWFsb2coKSB7CisgICAgICAgIHJldHVybiBtU2hvd3NEaWFsb2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1TaG93c0RpYWxvZyA9IG1Db250YWluZXJJZCA9PSAwOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN0eWxlID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludChTQVZFRF9TVFlMRSwgU1RZTEVfTk9STUFMKTsKKyAgICAgICAgICAgIG1UaGVtZSA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU0FWRURfVEhFTUUsIDApOworICAgICAgICAgICAgbUNhbmNlbGFibGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihTQVZFRF9DQU5DRUxBQkxFLCB0cnVlKTsKKyAgICAgICAgICAgIG1TaG93c0RpYWxvZyA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRCb29sZWFuKFNBVkVEX1NIT1dTX0RJQUxPRywgbVNob3dzRGlhbG9nKTsKKyAgICAgICAgICAgIG1CYWNrU3RhY2tJZCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoU0FWRURfQkFDS19TVEFDS19JRCwgLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlhbG9nKGdldEFjdGl2aXR5KCksIGdldFRoZW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2FuY2VsKERpYWxvZ0ludGVyZmFjZSBkaWFsb2cpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICBpZiAoIW1SZW1vdmVkKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgaWYgKCFtU2hvd3NEaWFsb2cpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZURpYWxvZyhzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobVN0eWxlKSB7CisgICAgICAgICAgICBjYXNlIFNUWUxFX05PX0lOUFVUOgorICAgICAgICAgICAgICAgIG1EaWFsb2cuZ2V0V2luZG93KCkuYWRkRmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hBQkxFKTsKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2guLi4KKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9fRlJBTUU6CisgICAgICAgICAgICBjYXNlIFNUWUxFX05PX1RJVExFOgorICAgICAgICAgICAgICAgIG1EaWFsb2cucmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICB9CisgICAgICAgIFZpZXcgdmlldyA9IGdldFZpZXcoKTsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpZXcuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpYWxvZ0ZyYWdtZW50IGNhbiBub3QgYmUgYXR0YWNoZWQgdG8gYSBjb250YWluZXIgdmlldyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURpYWxvZy5zZXRDb250ZW50Vmlldyh2aWV3KTsKKyAgICAgICAgfQorICAgICAgICBtRGlhbG9nLnNldE93bmVyQWN0aXZpdHkoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgIG1EaWFsb2cuc2V0Q2FuY2VsYWJsZShtQ2FuY2VsYWJsZSk7CisgICAgICAgIG1EaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbURpYWxvZy5zZXRPbkRpc21pc3NMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgZGlhbG9nU3RhdGUgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0QnVuZGxlKFNBVkVEX0RJQUxPR19TVEFURV9UQUcpOworICAgICAgICAgICAgaWYgKGRpYWxvZ1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGlhbG9nLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoZGlhbG9nU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICAgICAgbURpYWxvZy5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGRpYWxvZ1N0YXRlID0gbURpYWxvZy5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CisgICAgICAgICAgICBpZiAoZGlhbG9nU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShTQVZFRF9ESUFMT0dfU1RBVEVfVEFHLCBkaWFsb2dTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdHlsZSAhPSBTVFlMRV9OT1JNQUwpIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludChTQVZFRF9TVFlMRSwgbVN0eWxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRoZW1lICE9IDApIHsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludChTQVZFRF9USEVNRSwgbVRoZW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DYW5jZWxhYmxlKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKFNBVkVEX0NBTkNFTEFCTEUsIG1DYW5jZWxhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1TaG93c0RpYWxvZykgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0Qm9vbGVhbihTQVZFRF9TSE9XU19ESUFMT0csIG1TaG93c0RpYWxvZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CYWNrU3RhY2tJZCAhPSAtMSkgeworICAgICAgICAgICAgb3V0U3RhdGUucHV0SW50KFNBVkVEX0JBQ0tfU1RBQ0tfSUQsIG1CYWNrU3RhY2tJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLmhpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBkaWFsb2cuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95VmlldygpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95VmlldygpOworICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gU2V0IHJlbW92ZWQgaGVyZSBiZWNhdXNlIHRoaXMgZGlzbWlzc2FsIGlzIGp1c3QgdG8gaGlkZQorICAgICAgICAgICAgLy8gdGhlIGRpYWxvZyAtLSB3ZSBkb24ndCB3YW50IHRoaXMgdG8gY2F1c2UgdGhlIGZyYWdtZW50IHRvCisgICAgICAgICAgICAvLyBhY3R1YWxseSBiZSByZW1vdmVkLgorICAgICAgICAgICAgbVJlbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgbURpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICBtRGlhbG9nID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZWQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMTA5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50Q2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ZpbmFsIGNsYXNzIEZyYWdtZW50U3RhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICBmaW5hbCBTdHJpbmcgbUNsYXNzTmFtZTsKKyAgICBmaW5hbCBpbnQgbUluZGV4OworICAgIGZpbmFsIGJvb2xlYW4gbUZyb21MYXlvdXQ7CisgICAgZmluYWwgaW50IG1GcmFnbWVudElkOworICAgIGZpbmFsIGludCBtQ29udGFpbmVySWQ7CisgICAgZmluYWwgU3RyaW5nIG1UYWc7CisgICAgZmluYWwgYm9vbGVhbiBtUmV0YWluSW5zdGFuY2U7CisgICAgZmluYWwgQnVuZGxlIG1Bcmd1bWVudHM7CisgICAgCisgICAgQnVuZGxlIG1TYXZlZEZyYWdtZW50U3RhdGU7CisgICAgCisgICAgRnJhZ21lbnQgbUluc3RhbmNlOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlKEZyYWdtZW50IGZyYWcpIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGZyYWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIG1JbmRleCA9IGZyYWcubUluZGV4OworICAgICAgICBtRnJvbUxheW91dCA9IGZyYWcubUZyb21MYXlvdXQ7CisgICAgICAgIG1GcmFnbWVudElkID0gZnJhZy5tRnJhZ21lbnRJZDsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gZnJhZy5tQ29udGFpbmVySWQ7CisgICAgICAgIG1UYWcgPSBmcmFnLm1UYWc7CisgICAgICAgIG1SZXRhaW5JbnN0YW5jZSA9IGZyYWcubVJldGFpbkluc3RhbmNlOworICAgICAgICBtQXJndW1lbnRzID0gZnJhZy5tQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgbUluZGV4ID0gaW4ucmVhZEludCgpOworICAgICAgICBtRnJvbUxheW91dCA9IGluLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBtRnJhZ21lbnRJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgbUNvbnRhaW5lcklkID0gaW4ucmVhZEludCgpOworICAgICAgICBtVGFnID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICBtUmV0YWluSW5zdGFuY2UgPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgbUFyZ3VtZW50cyA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZSA9IGluLnJlYWRCdW5kbGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyYWdtZW50IGluc3RhbnRpYXRlKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIGlmIChtSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUluc3RhbmNlID0gRnJhZ21lbnQuaW5zdGFudGlhdGUoYWN0aXZpdHksIG1DbGFzc05hbWUsIG1Bcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgaWYgKG1TYXZlZEZyYWdtZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihhY3Rpdml0eS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2Uuc2V0SW5kZXgobUluZGV4KTsKKyAgICAgICAgbUluc3RhbmNlLm1Gcm9tTGF5b3V0ID0gbUZyb21MYXlvdXQ7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRJZCA9IG1GcmFnbWVudElkOworICAgICAgICBtSW5zdGFuY2UubUNvbnRhaW5lcklkID0gbUNvbnRhaW5lcklkOworICAgICAgICBtSW5zdGFuY2UubVRhZyA9IG1UYWc7CisgICAgICAgIG1JbnN0YW5jZS5tUmV0YWluSW5zdGFuY2UgPSBtUmV0YWluSW5zdGFuY2U7CisgICAgICAgIG1JbnN0YW5jZS5tRnJhZ21lbnRNYW5hZ2VyID0gYWN0aXZpdHkubUZyYWdtZW50czsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUNsYXNzTmFtZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUluZGV4KTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJvbUxheW91dCA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtRnJhZ21lbnRJZCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobUNvbnRhaW5lcklkKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtVGFnKTsKKyAgICAgICAgZGVzdC53cml0ZUludChtUmV0YWluSW5zdGFuY2UgPyAxIDogMCk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobUFyZ3VtZW50cyk7CisgICAgICAgIGRlc3Qud3JpdGVCdW5kbGUobVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50U3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxGcmFnbWVudFN0YXRlPigpIHsKKyAgICAgICAgcHVibGljIEZyYWdtZW50U3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZShpbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGcmFnbWVudFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFuIGFwcGxpY2F0aW9uJ3MgdXNlciBpbnRlcmZhY2Ugb3IgYmVoYXZpb3IKKyAqIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiBhbiB7QGxpbmsgQWN0aXZpdHl9LiAgSW50ZXJhY3Rpb24gd2l0aCBmcmFnbWVudHMKKyAqIGlzIGRvbmUgdGhyb3VnaCB7QGxpbmsgRnJhZ21lbnRNYW5hZ2VyfSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHZpYQorICoge0BsaW5rIEFjdGl2aXR5I2dldEZyYWdtZW50TWFuYWdlcigpIEFjdGl2aXR5LmdldEZyYWdtZW50TWFuYWdlcigpfSBhbmQKKyAqIHtAbGluayBGcmFnbWVudCNnZXRGcmFnbWVudE1hbmFnZXIoKSBGcmFnbWVudC5nZXRGcmFnbWVudE1hbmFnZXIoKX0uCisgKgorICogPHA+VGhlIEZyYWdtZW50IGNsYXNzIGNhbiBiZSB1c2VkIG1hbnkgd2F5cyB0byBhY2hpZXZlIGEgd2lkZSB2YXJpZXR5IG9mCisgKiByZXN1bHRzLiAgSXQgaXMgY29yZSwgaXQgcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uIG9yIGludGVyZmFjZQorICogdGhhdCBpcyBydW5uaW5nIHdpdGhpbiBhIGxhcmdlciB7QGxpbmsgQWN0aXZpdHl9LiAgQSBGcmFnbWVudCBpcyBjbG9zZWx5CisgKiB0aWVkIHRvIHRoZSBBY3Rpdml0eSBpdCBpcyBpbiwgYW5kIGNhbiBub3QgYmUgdXNlZCBhcGFydCBmcm9tIG9uZS4gIFRob3VnaAorICogRnJhZ21lbnQgZGVmaW5lcyBpdHMgb3duIGxpZmVjeWNsZSwgdGhhdCBsaWZlY3ljbGUgaXMgZGVwZW5kZW50IG9uIGl0cworICogYWN0aXZpdHk6IGlmIHRoZSBhY3Rpdml0eSBpcyBzdG9wcGVkLCBubyBmcmFnbWVudHMgaW5zaWRlIG9mIGl0IGNhbiBiZQorICogc3RhcnRlZDsgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZGVzdHJveWVkLCBhbGwgZnJhZ21lbnRzIHdpbGwgYmUgZGVzdHJveWVkLgorICoKKyAqIDxwPkFsbCBzdWJjbGFzc2VzIG9mIEZyYWdtZW50IG11c3QgaW5jbHVkZSBhIHB1YmxpYyBlbXB0eSBjb25zdHJ1Y3Rvci4KKyAqIFRoZSBmcmFtZXdvcmsgd2lsbCBvZnRlbiByZS1pbnN0YW50aWF0ZSBhIGZyYWdtZW50IGNsYXNzIHdoZW4gbmVlZGVkLAorICogaW4gcGFydGljdWxhciBkdXJpbmcgc3RhdGUgcmVzdG9yZSwgYW5kIG5lZWRzIHRvIGJlIGFibGUgdG8gZmluZCB0aGlzCisgKiBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSBpdC4gIElmIHRoZSBlbXB0eSBjb25zdHJ1Y3RvciBpcyBub3QgYXZhaWxhYmxlLAorICogYSBydW50aW1lIGV4Y2VwdGlvbiB3aWxsIG9jY3VyIGluIHNvbWUgY2FzZXMgZHVyaW5nIHN0YXRlIHJlc3RvcmUuCisgKgorICogPHA+VG9waWNzIGNvdmVyZWQgaGVyZToKKyAqIDxvbD4KKyAqIDxsaT48YSBocmVmPSIjTGlmZWN5Y2xlIj5MaWZlY3ljbGU8L2E+CisgKiA8bGk+PGEgaHJlZj0iI0xheW91dCI+TGF5b3V0PC9hPgorICogPGxpPjxhIGhyZWY9IiNCYWNrU3RhY2siPkJhY2sgU3RhY2s8L2E+CisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxpZmVjeWNsZSI+PC9hPgorICogPGgzPkxpZmVjeWNsZTwvaDM+CisgKgorICogPHA+VGhvdWdoIGEgRnJhZ21lbnQncyBsaWZlY3ljbGUgaXMgdGllZCB0byBpdHMgb3duaW5nIGFjdGl2aXR5LCBpdCBoYXMKKyAqIGl0cyBvd24gd3JpbmtsZSBvbiB0aGUgc3RhbmRhcmQgYWN0aXZpdHkgbGlmZWN5Y2xlLiAgSXQgaW5jbHVkZXMgYmFzaWMKKyAqIGFjdGl2aXR5IGxpZmVjeWNsZSBtZXRob2RzIHN1Y2ggYXMge0BsaW5rICNvblJlc3VtZX0sIGJ1dCBhbHNvIGltcG9ydGFudAorICogYXJlIG1ldGhvZHMgcmVsYXRlZCB0byBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgYWN0aXZpdHkgYW5kIFVJIGdlbmVyYXRpb24uCisgKgorICogPHA+VGhlIGNvcmUgc2VyaWVzIG9mIGxpZmVjeWNsZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB0byBicmluZyBhIGZyYWdtZW50CisgKiB1cCB0byByZXN1bWVkIHN0YXRlIChpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyKSBhcmU6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uQXR0YWNofSBjYWxsZWQgb25jZSB0aGUgZnJhZ21lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGl0cyBhY3Rpdml0eS4KKyAqIDxsaT4ge0BsaW5rICNvbkNyZWF0ZX0gY2FsbGVkIHRvIGRvIGluaXRpYWwgY3JlYXRpb24gb2YgdGhlIGZyYWdtZW50LgorICogPGxpPiB7QGxpbmsgI29uQ3JlYXRlVmlld30gY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgdmlldyBoaWVyYXJjaHkgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZnJhZ21lbnQuCisgKiA8bGk+IHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWR9IHRlbGxzIHRoZSBmcmFnbWVudCB0aGF0IGl0cyBhY3Rpdml0eSBoYXMKKyAqIGNvbXBsZXRlZCBpdHMgb3duIHtAbGluayBBY3Rpdml0eSNvbkNyZWF0ZSBBY3Rpdml0eS5vbkNyZWFhdGV9LgorICogPGxpPiB7QGxpbmsgI29uU3RhcnR9IG1ha2VzIHRoZSBmcmFnbWVudCB2aXNpYmxlIHRvIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgc3RhcnRlZCkuCisgKiA8bGk+IHtAbGluayAjb25SZXN1bWV9IG1ha2VzIHRoZSBmcmFnbWVudCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIChiYXNlZCBvbiBpdHMKKyAqIGNvbnRhaW5pbmcgYWN0aXZpdHkgYmVpbmcgcmVzdW1lZCkuCisgKiA8L29sPgorICoKKyAqIDxwPkFzIGEgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQsIGl0IGdvZXMgdGhyb3VnaCBhIHJldmVyc2UKKyAqIHNlcmllcyBvZiBjYWxsYmFja3M6CisgKgorICogPG9sPgorICogPGxpPiB7QGxpbmsgI29uUGF1c2V9IGZyYWdtZW50IGlzIG5vIGxvbmdlciBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyIGVpdGhlcgorICogYmVjYXVzZSBpdHMgYWN0aXZpdHkgaXMgYmVpbmcgcGF1c2VkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uU3RvcH0gZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIHZpc2libGUgdG8gdGhlIHVzZXIgZWl0aGVyCisgKiBiZWNhdXNlIGl0cyBhY3Rpdml0eSBpcyBiZWluZyBzdG9wcGVkIG9yIGEgZnJhZ21lbnQgb3BlcmF0aW9uIGlzIG1vZGlmeWluZyBpdAorICogaW4gdGhlIGFjdGl2aXR5LgorICogPGxpPiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IGFsbG93cyB0aGUgZnJhZ21lbnQgdG8gY2xlYW4gdXAgcmVzb3VyY2VzCisgKiBhc3NvY2lhdGVkIHdpdGggaXRzIFZpZXcuCisgKiA8bGk+IHtAbGluayAjb25EZXN0cm95fSBjYWxsZWQgdG8gZG8gZmluYWwgY2xlYW51cCBvZiB0aGUgZnJhZ21lbnQncyBzdGF0ZS4KKyAqIDxsaT4ge0BsaW5rICNvbkRldGFjaH0gY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIHRoZSBmcmFnbWVudCBubyBsb25nZXIKKyAqIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuCisgKiA8L29sPgorICoKKyAqIDxhIG5hbWU9IkxheW91dCI+PC9hPgorICogPGgzPkxheW91dDwvaDM+CisgKgorICogPHA+RnJhZ21lbnRzIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgeW91ciBhcHBsaWNhdGlvbidzIGxheW91dCwgYWxsb3dpbmcKKyAqIHlvdSB0byBiZXR0ZXIgbW9kdWxhcml6ZSB5b3VyIGNvZGUgYW5kIG1vcmUgZWFzaWx5IGFkanVzdCB5b3VyIHVzZXIKKyAqIGludGVyZmFjZSB0byB0aGUgc2NyZWVuIGl0IGlzIHJ1bm5pbmcgb24uICBBcyBhbiBleGFtcGxlLCB3ZSBjYW4gbG9vaworICogYXQgYSBzaW1wbGUgcHJvZ3JhbSBjb25zaXN0aW5nIG9mIGEgbGlzdCBvZiBpdGVtcywgYW5kIGRpc3BsYXkgb2YgdGhlCisgKiBkZXRhaWxzIG9mIGVhY2ggaXRlbS48L3A+CisgKgorICogPHA+QW4gYWN0aXZpdHkncyBsYXlvdXQgWE1MIGNhbiBpbmNsdWRlIDxjb2RlPiZsdDtmcmFnbWVudCZndDs8L2NvZGU+IHRhZ3MKKyAqIHRvIGVtYmVkIGZyYWdtZW50IGluc3RhbmNlcyBpbnNpZGUgb2YgdGhlIGxheW91dC4gIEZvciBleGFtcGxlLCBoZXJlIGlzCisgKiBhIHNpbXBseSBsYXlvdXQgdGhhdCBlbWJlZHMgb25lIGZyYWdtZW50OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbCBsYXlvdXR9CisgKgorICogPHA+VGhlIGxheW91dCBpcyBpbnN0YWxsZWQgaW4gdGhlIGFjdGl2aXR5IGluIHRoZSBub3JtYWwgd2F5OjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgbWFpbn0KKyAqCisgKiA8cD5UaGUgdGl0bGVzIGZyYWdtZW50LCBzaG93aW5nIGEgbGlzdCBvZiB0aXRsZXMsIGlzIHZlcnkgc2ltcGxlLCByZWx5aW5nCisgKiBvbiB7QGxpbmsgTGlzdEZyYWdtZW50fSBmb3IgbW9zdCBvZiBpdHMgd29yay4gIE5vdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mCisgKiBjbGlja2luZyBhbiBpdGVtLCB3aGljaCBjYW4gZWl0aGVyIHVwZGF0ZQorICogdGhlIGNvbnRlbnQgb2YgdGhlIGRldGFpbHMgZnJhZ21lbnQgb3Igc3RhcnQgYSBuZXcgYWN0aXZpdHkgc2hvdyB0aGUKKyAqIGRldGFpbHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgYWN0aXZpdHkncyBsYXlvdXQgY2FuIHNob3cgdGhlCisgKiBkZXRhaWxzLjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgdGl0bGVzfQorICoKKyAqIDxwPlRoZSBkZXRhaWxzIGZyYWdtZW50IHNob3dpbmcgdGhlIGNvbnRlbnRzIG9mIHNlbGVjdGVkIGl0ZW0gaGVyZSBqdXN0CisgKiBkaXNwbGF5cyBhIHN0cmluZyBvZiB0ZXh0IGJhc2VkIG9uIGFuIGluZGV4IG9mIGEgc3RyaW5nIGFycmF5IGJ1aWx0IGluIHRvCisgKiB0aGUgYXBwOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKKyAqICAgICAgZGV0YWlsc30KKyAqCisgKiA8cD5JbiB0aGlzIGNhc2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSB0aXRsZSwgdGhlcmUgaXMgbm8gZGV0YWlscworICogZnJhZ21lbnQgaW4gdGhlIGN1cnJlbnQgYWN0aXZpdHksIHNvIHRoZSB0aXRsZSB0aXRsZSBmcmFnbWVudCdzIGNsaWNrIGNvZGUgd2lsbAorICogbGF1bmNoIGEgbmV3IGFjdGl2aXR5IHRvIGRpc3BsYXkgdGhlIGRldGFpbHMgZnJhZ21lbnQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRMYXlvdXQuamF2YQorICogICAgICBkZXRhaWxzX2FjdGl2aXR5fQorICoKKyAqIDxwPkhvd2V2ZXIgdGhlIHNjcmVlbiBtYXkgYmUgbGFyZ2UgZW5vdWdoIHRvIHNob3cgYm90aCB0aGUgbGlzdCBvZiB0aXRsZXMKKyAqIGFuZCBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGl0bGUuICBUbyB1c2Ugc3VjaCBhIGxheW91dCBvbgorICogYSBsYW5kc2NhcGUgc2NyZWVuLCB0aGlzIGFsdGVybmF0aXZlIGxheW91dCBjYW4gYmUgcGxhY2VkIHVuZGVyIGxheW91dC1sYW5kOjwvcD4KKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9sYXlvdXQueG1sIGxheW91dH0KKyAqCisgKiA8cD5Ob3RlIGhvdyB0aGUgcHJpb3IgY29kZSB3aWxsIGFkanVzdCB0byB0aGlzIGFsdGVybmF0aXZlIFVJIGZsb3c6IHRoZQorICogdGl0bGVzIGZyYWdtZW50IHdpbGwgbm93IHNob3cgaXRzIHRleHQgaW5zaWRlIG9mIGl0cyBhY3Rpdml0eSwgYW5kIHRoZQorICogZGV0YWlscyBhY3Rpdml0eSB3aWxsIGZpbmlzaCBvZiBpdCBmaW5kcyBpdHNlbGYgcnVubmluZyBpbiBhIGNvbmZpZ3VyYXRpb24KKyAqIHdoZXJlIHRoZSBkZXRhaWxzIGNhbiBiZSBzaG93biBpbmxpbmUuCisgKgorICogPGEgbmFtZT0iQmFja1N0YWNrIj48L2E+CisgKiA8aDM+QmFjayBTdGFjazwvaDM+CisgKgorICogPHA+VGhlIHRyYW5zYWN0aW9uIGluIHdoaWNoIGZyYWdtZW50cyBhcmUgbW9kaWZpZWQgY2FuIGJlIHBsYWNlZCBvbiBhbgorICogaW50ZXJuYWwgYmFjay1zdGFjayBvZiB0aGUgb3duaW5nIGFjdGl2aXR5LiAgV2hlbiB0aGUgdXNlciBwcmVzc2VzIGJhY2sKKyAqIGluIHRoZSBhY3Rpdml0eSwgYW55IHRyYW5zYWN0aW9ucyBvbiB0aGUgYmFjayBzdGFjayBhcmUgcG9wcGVkIG9mZiBiZWZvcmUKKyAqIHRoZSBhY3Rpdml0eSBpdHNlbGYgaXMgZmluaXNoZWQuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgc2ltcGxlIGZyYWdtZW50IHRoYXQgaXMgaW5zdGFudGlhdGVkIHdpdGgKKyAqIGFuIGludGVnZXIgYXJndW1lbnQgYW5kIGRpc3BsYXlzIHRoYXQgaW4gYSBUZXh0VmlldyBpbiBpdHMgVUk6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhCisgKiAgICAgIGZyYWdtZW50fQorICoKKyAqIDxwPkEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmcmFnbWVudCwgcmVwbGFjaW5nCisgKiB3aGF0ZXZlciBjdXJyZW50IGZyYWdtZW50IGluc3RhbmNlIGlzIGJlaW5nIHNob3duIGFuZCBwdXNoaW5nIHRoYXQgY2hhbmdlCisgKiBvbiB0byB0aGUgYmFjayBzdGFjayBjb3VsZCBiZSB3cml0dGVuIGFzOgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhCisgKiAgICAgIGFkZF9zdGFja30KKyAqCisgKiA8cD5BZnRlciBlYWNoIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgYSBuZXcgZW50cnkgaXMgb24gdGhlIHN0YWNrLCBhbmQKKyAqIHByZXNzaW5nIGJhY2sgd2lsbCBwb3AgaXQgdG8gcmV0dXJuIHRoZSB1c2VyIHRvIHdoYXRldmVyIHByZXZpb3VzIHN0YXRlCisgKiB0aGUgYWN0aXZpdHkgVUkgd2FzIGluLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnQgaW1wbGVtZW50cyBDb21wb25lbnRDYWxsYmFja3MsIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PiBzQ2xhc3NNYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4oKTsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxJWklORyA9IDA7ICAgICAvLyBOb3QgeWV0IGNyZWF0ZWQuCisgICAgc3RhdGljIGZpbmFsIGludCBDUkVBVEVEID0gMTsgICAgICAgICAgLy8gQ3JlYXRlZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0NSRUFURUQgPSAyOyAvLyBUaGUgYWN0aXZpdHkgaGFzIGZpbmlzaGVkIGl0cyBjcmVhdGlvbi4KKyAgICBzdGF0aWMgZmluYWwgaW50IFNUQVJURUQgPSAzOyAgICAgICAgICAvLyBDcmVhdGVkIGFuZCBzdGFydGVkLCBub3QgcmVzdW1lZC4KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFU1VNRUQgPSA0OyAgICAgICAgICAvLyBDcmVhdGVkIHN0YXJ0ZWQgYW5kIHJlc3VtZWQuCisgICAgCisgICAgaW50IG1TdGF0ZSA9IElOSVRJQUxJWklORzsKKyAgICAKKyAgICAvLyBXaGVuIGluc3RhbnRpYXRlZCBmcm9tIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzYXZlZCBzdGF0ZS4KKyAgICBCdW5kbGUgbVNhdmVkRnJhZ21lbnRTdGF0ZTsKKyAgICBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPiBtU2F2ZWRWaWV3U3RhdGU7CisgICAgCisgICAgLy8gSW5kZXggaW50byBhY3RpdmUgZnJhZ21lbnQgYXJyYXkuCisgICAgaW50IG1JbmRleCA9IC0xOworICAgIAorICAgIC8vIEludGVybmFsIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZyYWdtZW50OworICAgIFN0cmluZyBtV2hvOworICAgIAorICAgIC8vIENvbnN0cnVjdGlvbiBhcmd1bWVudHM7CisgICAgQnVuZGxlIG1Bcmd1bWVudHM7CisKKyAgICAvLyBUYXJnZXQgZnJhZ21lbnQuCisgICAgRnJhZ21lbnQgbVRhcmdldDsKKworICAgIC8vIFRhcmdldCByZXF1ZXN0IGNvZGUuCisgICAgaW50IG1UYXJnZXRSZXF1ZXN0Q29kZTsKKworICAgIC8vIFRydWUgaWYgdGhlIGZyYWdtZW50IGlzIGluIHRoZSBsaXN0IG9mIGFkZGVkIGZyYWdtZW50cy4KKyAgICBib29sZWFuIG1BZGRlZDsKKyAgICAKKyAgICAvLyBUcnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4KKyAgICBib29sZWFuIG1SZXN1bWVkOworICAgIAorICAgIC8vIFNldCB0byB0cnVlIGlmIHRoaXMgZnJhZ21lbnQgd2FzIGluc3RhbnRpYXRlZCBmcm9tIGEgbGF5b3V0IGZpbGUuCisgICAgYm9vbGVhbiBtRnJvbUxheW91dDsKKyAgICAKKyAgICAvLyBOdW1iZXIgb2YgYWN0aXZlIGJhY2sgc3RhY2sgZW50cmllcyB0aGlzIGZyYWdtZW50IGlzIGluLgorICAgIGludCBtQmFja1N0YWNrTmVzdGluZzsKKyAgICAKKyAgICAvLyBUaGUgZnJhZ21lbnQgbWFuYWdlciB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgU2V0IGFzIHNvb24gYXMgdGhlCisgICAgLy8gZnJhZ21lbnQgaXMgdXNlZCBpbiBhIHRyYW5zYWN0aW9uOyBjbGVhcmVkIGFmdGVyIGl0IGhhcyBiZWVuIHJlbW92ZWQKKyAgICAvLyBmcm9tIGFsbCB0cmFuc2FjdGlvbnMuCisgICAgRnJhZ21lbnRNYW5hZ2VyIG1GcmFnbWVudE1hbmFnZXI7CisKKyAgICAvLyBTZXQgYXMgc29vbiBhcyBhIGZyYWdtZW50IGlzIGFkZGVkIHRvIGEgdHJhbnNhY3Rpb24gKG9yIHJlbW92ZWQpLAorICAgIC8vIHRvIGJlIGFibGUgdG8gZG8gdmFsaWRhdGlvbi4KKyAgICBBY3Rpdml0eSBtSW1tZWRpYXRlQWN0aXZpdHk7CisgICAgCisgICAgLy8gQWN0aXZpdHkgdGhpcyBmcmFnbWVudCBpcyBhdHRhY2hlZCB0by4KKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgLy8gVGhlIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgZnJhZ21lbnQgLS0gZWl0aGVyIHRoZSBjb250YWluZXIgSUQgaWYgaXQKKyAgICAvLyB3YXMgZHluYW1pY2FsbHkgYWRkZWQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LCBvciB0aGUgSUQgc3VwcGxpZWQgaW4KKyAgICAvLyBsYXlvdXQuCisgICAgaW50IG1GcmFnbWVudElkOworICAgIAorICAgIC8vIFdoZW4gYSBmcmFnbWVudCBpcyBiZWluZyBkeW5hbWljYWxseSBhZGRlZCB0byB0aGUgdmlldyBoaWVyYXJjaHksIHRoaXMKKyAgICAvLyBpcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IGNvbnRhaW5lciBpdCBpcyBiZWluZyBhZGRlZCB0by4KKyAgICBpbnQgbUNvbnRhaW5lcklkOworICAgIAorICAgIC8vIFRoZSBvcHRpb25hbCBuYW1lZCB0YWcgZm9yIHRoaXMgZnJhZ21lbnQgLS0gdXN1YWxseSB1c2VkIHRvIGZpbmQKKyAgICAvLyBmcmFnbWVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGxheW91dC4KKyAgICBTdHJpbmcgbVRhZzsKKyAgICAKKyAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBhcHAgaGFzIHJlcXVlc3RlZCB0aGF0IHRoaXMgZnJhZ21lbnQgYmUgaGlkZGVuCisgICAgLy8gZnJvbSB0aGUgdXNlci4KKyAgICBib29sZWFuIG1IaWRkZW47CisgICAgCisgICAgLy8gSWYgc2V0IHRoaXMgZnJhZ21lbnQgd291bGQgbGlrZSBpdHMgaW5zdGFuY2UgcmV0YWluZWQgYWNyb3NzCisgICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorICAgIGJvb2xlYW4gbVJldGFpbkluc3RhbmNlOworICAgIAorICAgIC8vIElmIHNldCB0aGlzIGZyYWdtZW50IGlzIGJlaW5nIHJldGFpbmVkIGFjcm9zcyB0aGUgY3VycmVudCBjb25maWcgY2hhbmdlLgorICAgIGJvb2xlYW4gbVJldGFpbmluZzsKKyAgICAKKyAgICAvLyBJZiBzZXQgdGhpcyBmcmFnbWVudCBoYXMgbWVudSBpdGVtcyB0byBjb250cmlidXRlLgorICAgIGJvb2xlYW4gbUhhc01lbnU7CisgICAgCisgICAgLy8gVXNlZCB0byB2ZXJpZnkgdGhhdCBzdWJjbGFzc2VzIGNhbGwgdGhyb3VnaCB0byBzdXBlciBjbGFzcy4KKyAgICBib29sZWFuIG1DYWxsZWQ7CisgICAgCisgICAgLy8gSWYgYXBwIGhhcyByZXF1ZXN0ZWQgYSBzcGVjaWZpYyBhbmltYXRpb24sIHRoaXMgaXMgdGhlIG9uZSB0byB1c2UuCisgICAgaW50IG1OZXh0QW5pbTsKKyAgICAKKyAgICAvLyBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGUgZnJhZ21lbnQgYWZ0ZXIgZHluYW1pY2FsbHkgYWRkZWQgdG8gVUkuCisgICAgVmlld0dyb3VwIG1Db250YWluZXI7CisgICAgCisgICAgLy8gVGhlIFZpZXcgZ2VuZXJhdGVkIGZvciB0aGlzIGZyYWdtZW50LgorICAgIFZpZXcgbVZpZXc7CisgICAgCisgICAgTG9hZGVyTWFuYWdlckltcGwgbUxvYWRlck1hbmFnZXI7CisgICAgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaHJvd24gYnkge0BsaW5rIEZyYWdtZW50I2luc3RhbnRpYXRlKENvbnRleHQsIFN0cmluZywgQnVuZGxlKX0gd2hlbgorICAgICAqIHRoZXJlIGlzIGFuIGluc3RhbnRpYXRpb24gZmFpbHVyZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAgPHN0cm9uZz5FdmVyeTwvc3Ryb25nPiBmcmFnbWVudCBtdXN0IGhhdmUgYW4KKyAgICAgKiBlbXB0eSBjb25zdHJ1Y3Rvciwgc28gaXQgY2FuIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJlc3RvcmluZyBpdHMKKyAgICAgKiBhY3Rpdml0eSdzIHN0YXRlLiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCBzdWJjbGFzc2VzIGRvIG5vdAorICAgICAqIGhhdmUgb3RoZXIgY29uc3RydWN0b3JzIHdpdGggcGFyYW1ldGVycywgc2luY2UgdGhlc2UgY29uc3RydWN0b3JzCisgICAgICogd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIHJlLWluc3RhbnRpYXRlZDsgaW5zdGVhZCwKKyAgICAgKiBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgd2l0aCB7QGxpbmsgI3NldEFyZ3VtZW50c30KKyAgICAgKiBhbmQgbGF0ZXIgcmV0cmlldmVkIGJ5IHRoZSBGcmFnbWVudCB3aXRoIHtAbGluayAjZ2V0QXJndW1lbnRzfS4KKyAgICAgKiAKKyAgICAgKiA8cD5BcHBsaWNhdGlvbnMgc2hvdWxkIGdlbmVyYWxseSBub3QgaW1wbGVtZW50IGEgY29uc3RydWN0b3IuICBUaGUKKyAgICAgKiBmaXJzdCBwbGFjZSBhcHBsaWNhdGlvbiBjb2RlIGFuIHJ1biB3aGVyZSB0aGUgZnJhZ21lbnQgaXMgcmVhZHkgdG8KKyAgICAgKiBiZSB1c2VkIGlzIGluIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSwgdGhlIHBvaW50IHdoZXJlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIGFjdHVhbGx5IGFzc29jaWF0ZWQgd2l0aCBpdHMgYWN0aXZpdHkuICBTb21lIGFwcGxpY2F0aW9ucyBtYXkgYWxzbworICAgICAqIHdhbnQgdG8gaW1wbGVtZW50IHtAbGluayAjb25JbmZsYXRlfSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzIGZyb20gYQorICAgICAqIGxheW91dCByZXNvdXJjZSwgdGhvdWdoIHNob3VsZCB0YWtlIGNhcmUgaGVyZSBiZWNhdXNlIHRoaXMgaGFwcGVucyBmb3IKKyAgICAgKiB0aGUgZnJhZ21lbnQgaXMgYXR0YWNoZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIHtAbGluayAjaW5zdGFudGlhdGUoQ29udGV4dCwgU3RyaW5nLCBCdW5kbGUpfSBidXQgd2l0aCBhIG51bGwKKyAgICAgKiBhcmd1bWVudCBCdW5kbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGcmFnbWVudCBpbnN0YW50aWF0ZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmbmFtZSkgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGUoY29udGV4dCwgZm5hbWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuICBUaGlzIGlzCisgICAgICogdGhlIHNhbWUgYXMgY2FsbGluZyBpdHMgZW1wdHkgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGluZyBjb250ZXh0IGJlaW5nIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIGZyYWdtZW50LgorICAgICAqIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCB0byBnZXQgaXRzIENsYXNzTG9hZGVyLgorICAgICAqIEBwYXJhbSBmbmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gaW5zdGFudGlhdGUuCisgICAgICogQHBhcmFtIGFyZ3MgQnVuZGxlIG9mIGFyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIGZyYWdtZW50LCB3aGljaCBpdAorICAgICAqIGNhbiByZXRyaWV2ZSB3aXRoIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9LiAgTWF5IGJlIG51bGwuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IGZyYWdtZW50IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4gaW5zdGFudGlhdGluZworICAgICAqIHRoZSBnaXZlbiBmcmFnbWVudCBjbGFzcy4gIFRoaXMgaXMgYSBydW50aW1lIGV4Y2VwdGlvbjsgaXQgaXMgbm90CisgICAgICogbm9ybWFsbHkgZXhwZWN0ZWQgdG8gaGFwcGVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRnJhZ21lbnQgaW5zdGFudGlhdGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgZm5hbWUsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHNDbGFzc01hcC5nZXQoZm5hbWUpOworICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAorICAgICAgICAgICAgICAgIGNsYXp6ID0gY29udGV4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhmbmFtZSk7CisgICAgICAgICAgICAgICAgc0NsYXNzTWFwLnB1dChmbmFtZSwgY2xhenopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRnJhZ21lbnQgZiA9IChGcmFnbWVudCljbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3Muc2V0Q2xhc3NMb2FkZXIoZi5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGYubUFyZ3VtZW50cyA9IGFyZ3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGZyYWdtZW50ICIgKyBmbmFtZQorICAgICAgICAgICAgICAgICAgICArICI6IG1ha2Ugc3VyZSBjbGFzcyBuYW1lIGV4aXN0cywgaXMgcHVibGljLCBhbmQgaGFzIGFuIgorICAgICAgICAgICAgICAgICAgICArICIgZW1wdHkgY29uc3RydWN0b3IgdGhhdCBpcyBwdWJsaWMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBmcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtYWtlIHN1cmUgY2xhc3MgbmFtZSBleGlzdHMsIGlzIHB1YmxpYywgYW5kIGhhcyBhbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgaXMgcHVibGljIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBmcmFnbWVudCAiICsgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiOiBtYWtlIHN1cmUgY2xhc3MgbmFtZSBleGlzdHMsIGlzIHB1YmxpYywgYW5kIGhhcyBhbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGVtcHR5IGNvbnN0cnVjdG9yIHRoYXQgaXMgcHVibGljIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCByZXN0b3JlVmlld1N0YXRlKCkgeworICAgICAgICBpZiAobVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WaWV3LnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShtU2F2ZWRWaWV3U3RhdGUpOworICAgICAgICAgICAgbVNhdmVkVmlld1N0YXRlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHNldEluZGV4KGludCBpbmRleCkgeworICAgICAgICBtSW5kZXggPSBpbmRleDsKKyAgICAgICAgbVdobyA9ICJhbmRyb2lkOmZyYWdtZW50OiIgKyBtSW5kZXg7CisgICB9CisgICAgCisgICAgdm9pZCBjbGVhckluZGV4KCkgeworICAgICAgICBtSW5kZXggPSAtMTsKKyAgICAgICAgbVdobyA9IG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG5vdCBvdmVycmlkZSBlcXVhbHMoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUgZmluYWwgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBjYW4gbm90IG92ZXJyaWRlIGhhc2hDb2RlKCkuCisgICAgICovCisgICAgQE92ZXJyaWRlIGZpbmFsIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKyAgICAgICAgc2IuYXBwZW5kKCJGcmFnbWVudHsiKTsKKyAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKTsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAjIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZyYWdtZW50SWQgIT0gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgaWQ9MHgiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKG1GcmFnbWVudElkKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQobVRhZyk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGlkZW50aWZpZXIgdGhpcyBmcmFnbWVudCBpcyBrbm93biBieS4gIFRoaXMgaXMgZWl0aGVyCisgICAgICogdGhlIGFuZHJvaWQ6aWQgdmFsdWUgc3VwcGxpZWQgaW4gYSBsYXlvdXQgb3IgdGhlIGNvbnRhaW5lciB2aWV3IElECisgICAgICogc3VwcGxpZWQgd2hlbiBhZGRpbmcgdGhlIGZyYWdtZW50LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRJZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0YWcgbmFtZSBvZiB0aGUgZnJhZ21lbnQsIGlmIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIG1UYWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN1cHBseSB0aGUgY29uc3RydWN0aW9uIGFyZ3VtZW50cyBmb3IgdGhpcyBmcmFnbWVudC4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBoYXMgYmVlbiBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHk7IHRoYXQKKyAgICAgKiBpcywgeW91IHNob3VsZCBjYWxsIGl0IGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGluZyB0aGUgZnJhZ21lbnQuICBUaGUKKyAgICAgKiBhcmd1bWVudHMgc3VwcGxpZWQgaGVyZSB3aWxsIGJlIHJldGFpbmVkIGFjcm9zcyBmcmFnbWVudCBkZXN0cm95IGFuZAorICAgICAqIGNyZWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50cyhCdW5kbGUgYXJncykgeworICAgICAgICBpZiAobUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyYWdtZW50IGFscmVhZHkgYWN0aXZlIik7CisgICAgICAgIH0KKyAgICAgICAgbUFyZ3VtZW50cyA9IGFyZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgd2hlbiB0aGUgZnJhZ21lbnQgd2FzIGluc3RhbnRpYXRlZCwKKyAgICAgKiBpZiBhbnkuCisgICAgICovCisgICAgZmluYWwgcHVibGljIEJ1bmRsZSBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBtQXJndW1lbnRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIHRhcmdldCBmb3IgdGhpcyBmcmFnbWVudC4gIFRoaXMgbWF5IGJlIHVzZWQsIGZvciBleGFtcGxlLAorICAgICAqIGlmIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgc3RhcnRlZCBieSBhbm90aGVyLCBhbmQgd2hlbiBkb25lIHdhbnRzIHRvCisgICAgICogZ2l2ZSBhIHJlc3VsdCBiYWNrIHRvIHRoZSBmaXJzdC4gIFRoZSB0YXJnZXQgc2V0IGhlcmUgaXMgcmV0YWluZWQKKyAgICAgKiBhY3Jvc3MgaW5zdGFuY2VzIHZpYSB7QGxpbmsgRnJhZ21lbnRNYW5hZ2VyI3B1dEZyYWdtZW50CisgICAgICogRnJhZ21lbnRNYW5hZ2VyLnB1dEZyYWdtZW50KCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhpcyBvbmUuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIE9wdGlvbmFsIHJlcXVlc3QgY29kZSwgZm9yIGNvbnZlbmllbmNlIGlmIHlvdQorICAgICAqIGFyZSBnb2luZyB0byBjYWxsIGJhY2sgd2l0aCB7QGxpbmsgI29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIEludGVudCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldEZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbVRhcmdldCA9IGZyYWdtZW50OworICAgICAgICBtVGFyZ2V0UmVxdWVzdENvZGUgPSByZXF1ZXN0Q29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhcmdldCBmcmFnbWVudCBzZXQgYnkge0BsaW5rICNzZXRUYXJnZXRGcmFnbWVudH0uCisgICAgICovCisgICAgZmluYWwgcHVibGljIEZyYWdtZW50IGdldFRhcmdldEZyYWdtZW50KCkgeworICAgICAgICByZXR1cm4gbVRhcmdldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhcmdldCByZXF1ZXN0IGNvZGUgc2V0IGJ5IHtAbGluayAjc2V0VGFyZ2V0RnJhZ21lbnR9LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBpbnQgZ2V0VGFyZ2V0UmVxdWVzdENvZGUoKSB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0UmVxdWVzdENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBBY3Rpdml0eSB0aGlzIGZyYWdtZW50IGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgZmluYWwgcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbUFjdGl2aXR5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEZyYWdtZW50TWFuYWdlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBmcmFnbWVudHMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBmcmFnbWVudCdzIGFjdGl2aXR5LiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBiZSBub24tbnVsbCBzbGlnaHRseQorICAgICAqIGJlZm9yZSB7QGxpbmsgI2dldEFjdGl2aXR5KCl9LCBpbiB0aGUgdGltZSBmcm9tIHdoZW4gdGhlIGZyYWdtZW50IGlzCisgICAgICogcGxhY2VkIGluIGEge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb259IHVudGlsIGl0IGlzIGNvbW1pdHRlZCBhbmQKKyAgICAgKiBhdHRhY2hlZCB0byBpdHMgYWN0aXZpdHkuCisgICAgICovCisgICAgZmluYWwgcHVibGljIEZyYWdtZW50TWFuYWdlciBnZXRGcmFnbWVudE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBtRnJhZ21lbnRNYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgYWRkZWQgdG8gaXRzIGFjdGl2aXR5LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzQWRkZWQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aXZpdHkgIT0gbnVsbCAmJiBtQWN0aXZpdHkubUZyYWdtZW50cy5tQWRkZWQuY29udGFpbnModGhpcyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBpbiB0aGUgcmVzdW1lZCBzdGF0ZS4gIFRoaXMgaXMgdHJ1ZQorICAgICAqIGZvciB0aGUgZHVyYXRpb24gb2Yge0BsaW5rICNvblJlc3VtZSgpfSBhbmQge0BsaW5rICNvblBhdXNlKCl9IGFzIHdlbGwuCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNSZXN1bWVkKCkgeworICAgICAgICByZXR1cm4gbVJlc3VtZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBmcmFnbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgbWVhbnMKKyAgICAgKiBpdDogKDEpIGhhcyBiZWVuIGFkZGVkLCAoMikgaGFzIGl0cyB2aWV3IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3csIGFuZCAKKyAgICAgKiAoMykgaXMgbm90IGhpZGRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBpc0FkZGVkKCkgJiYgIWlzSGlkZGVuKCkgJiYgbVZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gaGlkZGVuLiAgQnkgZGVmYXVsdCBmcmFnbWVudHMKKyAgICAgKiBhcmUgc2hvd24uICBZb3UgY2FuIGZpbmQgb3V0IGFib3V0IGNoYW5nZXMgdG8gdGhpcyBzdGF0ZSB3aXRoCisgICAgICoge0BsaW5rICNvbkhpZGRlbkNoYW5nZWR9LiAgTm90ZSB0aGF0IHRoZSBoaWRkZW4gc3RhdGUgaXMgb3J0aG9nb25hbAorICAgICAqIHRvIG90aGVyIHN0YXRlcyAtLSB0aGF0IGlzLCB0byBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLCBhIGZyYWdtZW50CisgICAgICogbXVzdCBiZSBib3RoIHN0YXJ0ZWQgYW5kIG5vdCBoaWRkZW4uCisgICAgICovCisgICAgZmluYWwgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CisgICAgICAgIHJldHVybiBtSGlkZGVuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgaGlkZGVuIHN0YXRlIChhcyByZXR1cm5lZCBieSB7QGxpbmsgI2lzSGlkZGVuKCl9IG9mCisgICAgICogdGhlIGZyYWdtZW50IGhhcyBjaGFuZ2VkLiAgRnJhZ21lbnRzIHN0YXJ0IG91dCBub3QgaGlkZGVuOyB0aGlzIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGZyYWdtZW50IGNoYW5nZXMgc3RhdGUgZnJvbSB0aGF0LgorICAgICAqIEBwYXJhbSBoaWRkZW4gVHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaXMgbm93IGhpZGRlbiwgZmFsc2UgaWYgaXQgaXMgbm90CisgICAgICogdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkhpZGRlbkNoYW5nZWQoYm9vbGVhbiBoaWRkZW4pIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIGEgZnJhZ21lbnQgaW5zdGFuY2UgaXMgcmV0YWluZWQgYWNyb3NzIEFjdGl2aXR5CisgICAgICogcmUtY3JlYXRpb24gKHN1Y2ggYXMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlKS4gIFRoaXMgY2FuIG9ubHkKKyAgICAgKiBiZSB1c2VkIHdpdGggZnJhZ21lbnRzIG5vdCBpbiB0aGUgYmFjayBzdGFjay4gIElmIHNldCwgdGhlIGZyYWdtZW50CisgICAgICogbGlmZWN5Y2xlIHdpbGwgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IHdoZW4gYW4gYWN0aXZpdHkgaXMgcmVjcmVhdGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAbGluayAjb25EZXN0cm95KCl9IHdpbGwgbm90IGJlIGNhbGxlZCAoYnV0IHtAbGluayAjb25EZXRhY2goKX0gc3RpbGwKKyAgICAgKiB3aWxsIGJlLCBiZWNhdXNlIHRoZSBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBjdXJyZW50IGFjdGl2aXR5KS4KKyAgICAgKiA8bGk+IHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gd2lsbCBub3QgYmUgY2FsbGVkIHNpbmNlIHRoZSBmcmFnbWVudAorICAgICAqIGlzIG5vdCBiZWluZyByZS1jcmVhdGVkLgorICAgICAqIDxsaT4ge0BsaW5rICNvbkF0dGFjaChBY3Rpdml0eSl9IGFuZCB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9IDxiPndpbGw8L2I+CisgICAgICogc3RpbGwgYmUgY2FsbGVkLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbiByZXRhaW4pIHsKKyAgICAgICAgbVJldGFpbkluc3RhbmNlID0gcmV0YWluOworICAgIH0KKyAgICAKKyAgICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBnZXRSZXRhaW5JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRhaW5JbnN0YW5jZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IHRoYXQgdGhpcyBmcmFnbWVudCB3b3VsZCBsaWtlIHRvIHBhcnRpY2lwYXRlIGluIHBvcHVsYXRpbmcKKyAgICAgKiB0aGUgb3B0aW9ucyBtZW51IGJ5IHJlY2VpdmluZyBhIGNhbGwgdG8ge0BsaW5rICNvbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGFuZCByZWxhdGVkIG1ldGhvZHMuCisgICAgICogCisgICAgICogQHBhcmFtIGhhc01lbnUgSWYgdHJ1ZSwgdGhlIGZyYWdtZW50IGhhcyBtZW51IGl0ZW1zIHRvIGNvbnRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbiBoYXNNZW51KSB7CisgICAgICAgIGlmIChtSGFzTWVudSAhPSBoYXNNZW51KSB7CisgICAgICAgICAgICBtSGFzTWVudSA9IGhhc01lbnU7CisgICAgICAgICAgICBpZiAoaXNBZGRlZCgpICYmICFpc0hpZGRlbigpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2aXR5LmludmFsaWRhdGVPcHRpb25zTWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyTWFuYWdlciBmb3IgdGhpcyBmcmFnbWVudCwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXJNYW5hZ2VyIGdldExvYWRlck1hbmFnZXIoKSB7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUxvYWRlck1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgbUxvYWRlck1hbmFnZXIgPSBtQWN0aXZpdHkuZ2V0TG9hZGVyTWFuYWdlcihtSW5kZXgsIG1TdGFydGVkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Mb2FkZXJNYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsIHtAbGluayBBY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCl9IG9uIHRoZSBmcmFnbWVudCdzCisgICAgICogY29udGFpbmluZyBBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFjdGl2aXR5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCAtMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGwge0BsaW5rIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGb3JSZXN1bHQoSW50ZW50LCBpbnQpfSBvbiB0aGUgZnJhZ21lbnQncworICAgICAqIGNvbnRhaW5pbmcgQWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQgaW50ZW50LCBpbnQgcmVxdWVzdENvZGUpIHsKKyAgICAgICAgbUFjdGl2aXR5LnN0YXJ0QWN0aXZpdHlGcm9tRnJhZ21lbnQodGhpcywgaW50ZW50LCByZXF1ZXN0Q29kZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlY2VpdmUgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCl9LiAgVGhpcyBmb2xsb3dzIHRoZQorICAgICAqIHJlbGF0ZWQgQWN0aXZpdHkgQVBJIGFzIGRlc2NyaWJlZCB0aGVyZSBpbgorICAgICAqIHtAbGluayBBY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0KGludCwgaW50LCBJbnRlbnQpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvZGUgVGhlIGludGVnZXIgcmVxdWVzdCBjb2RlIG9yaWdpbmFsbHkgc3VwcGxpZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgd2hvIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGNhbWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgaW50ZWdlciByZXN1bHQgY29kZSByZXR1cm5lZCBieSB0aGUgY2hpbGQgYWN0aXZpdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGl0cyBzZXRSZXN1bHQoKS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBbiBJbnRlbnQsIHdoaWNoIGNhbiByZXR1cm4gcmVzdWx0IGRhdGEgdG8gdGhlIGNhbGxlcgorICAgICAqICAgICAgICAgICAgICAgKHZhcmlvdXMgZGF0YSBjYW4gYmUgYXR0YWNoZWQgdG8gSW50ZW50ICJleHRyYXMiKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgaXMgYmVpbmcgY3JlYXRlZCBhcyBwYXJ0IG9mIGEgdmlldyBsYXlvdXQKKyAgICAgKiBpbmZsYXRpb24sIHR5cGljYWxseSBmcm9tIHNldHRpbmcgdGhlIGNvbnRlbnQgdmlldyBvZiBhbiBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZnJhZ21lbnQgaXMgY3JlYXRlZCBmcm9tIGEgPGZyYWdtZW50PgorICAgICAqIHRhZyBpbiBhIGxheW91dCBmaWxlLiAgTm90ZSB0aGlzIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgZnJhZ21lbnQncworICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBoYXMgYmVlbiBjYWxsZWQ7IGFsbCB5b3Ugc2hvdWxkIGRvIGhlcmUgaXMKKyAgICAgKiBwYXJzZSB0aGUgYXR0cmlidXRlcyBhbmQgc2F2ZSB0aGVtIGF3YXkuICBBIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMKKyAgICAgKiBzaW1wbHkgY29weSB0aGVtIGludG8gYSBCdW5kbGUgdGhhdCBpcyBnaXZlbiB0byB7QGxpbmsgI3NldEFyZ3VtZW50cyhCdW5kbGUpfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSBmcmFnbWVudCBpcyBpbmZsYXRlZCwgZXZlbiBpZiBpdCBpcworICAgICAqIGJlaW5nIGluZmxhdGVkIGludG8gYSBuZXcgaW5zdGFuY2Ugd2l0aCBzYXZlZCBzdGF0ZS4gIEJlY2F1c2UgYSBmcmFnbWVudCdzCisgICAgICogYXJndW1lbnRzIGFyZSByZXRhaW5lZCBhY3Jvc3MgaW5zdGFuY2VzLCBpdCBtYXkgbWFrZSBubyBzZW5zZSB0byByZS1wYXJzZQorICAgICAqIHRoZSBhdHRyaWJ1dGVzIGludG8gbmV3IGFyZ3VtZW50cy4gIFlvdSBtYXkgd2FudCB0byBmaXJzdCBjaGVjaworICAgICAqIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9IGFuZCBvbmx5IHBhcnNlIHRoZSBhdHRyaWJ1dGVzIGlmIGl0IHJldHVybnMgbnVsbCwKKyAgICAgKiB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IGlmIGl0IGlzIG5vbi1udWxsIHRob3NlIGFyZSB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBmcm9tIHRoZSBmaXJzdCB0aW1lIHRoZSBmcmFnbWVudCB3YXMgaW5mbGF0ZWQuICAoVGhhdCBzYWlkLCB5b3UgbWF5IHdhbnQKKyAgICAgKiB0byBoYXZlIGxheW91dHMgY2hhbmdlIGZvciBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgc3VjaCBhcyBsYW5kc2NhcGUKKyAgICAgKiBhbmQgcG9ydHJhaXQsIHdoaWNoIGNhbiBoYXZlIGRpZmZlcmVudCBhdHRyaWJ1dGVzLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQKKyAgICAgKiB0byByZS1wYXJzZSB0aGUgYXR0cmlidXRlcyBlYWNoIHRpbWUgdGhpcyBpcyBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3CisgICAgICogYXJndW1lbnRzLik8L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGF0IHRoZSB0YWcgd2hlcmUgdGhlIGZyYWdtZW50IGlzCisgICAgICogYmVpbmcgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkluZmxhdGUoQXR0cmlidXRlU2V0IGF0dHJzLCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIGZyYWdtZW50IGlzIGZpcnN0IGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4KKyAgICAgKiB7QGxpbmsgI29uQ3JlYXRlKEJ1bmRsZSl9IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25BdHRhY2goQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgZnJhZ21lbnQgbG9hZHMgYW4gYW5pbWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRvciBvbkNyZWF0ZUFuaW1hdG9yKGludCB0cmFuc2l0LCBib29sZWFuIGVudGVyLCBpbnQgbmV4dEFuaW0pIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkbyBpbml0aWFsIGNyZWF0aW9uIG9mIGEgZnJhZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgorICAgICAqIHtAbGluayAjb25BdHRhY2goQWN0aXZpdHkpfSBhbmQgYmVmb3JlCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCB3aGlsZSB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBpcworICAgICAqIHN0aWxsIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNyZWF0ZWQuICBBcyBzdWNoLCB5b3UgY2FuIG5vdCByZWx5CisgICAgICogb24gdGhpbmdzIGxpa2UgdGhlIGFjdGl2aXR5J3MgY29udGVudCB2aWV3IGhpZXJhcmNoeSBiZWluZyBpbml0aWFsaXplZAorICAgICAqIGF0IHRoaXMgcG9pbnQuICBJZiB5b3Ugd2FudCB0byBkbyB3b3JrIG9uY2UgdGhlIGFjdGl2aXR5IGl0c2VsZiBpcworICAgICAqIGNyZWF0ZWQsIHNlZSB7QGxpbmsgI29uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgdGhlIGZyYWdtZW50IGlzIGJlaW5nIHJlLWNyZWF0ZWQgZnJvbQorICAgICAqIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUsIHRoaXMgaXMgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBoYXZlIHRoZSBmcmFnbWVudCBpbnN0YW50aWF0ZSBpdHMgdXNlciBpbnRlcmZhY2Ugdmlldy4KKyAgICAgKiBUaGlzIGlzIG9wdGlvbmFsLCBhbmQgbm9uLWdyYXBoaWNhbCBmcmFnbWVudHMgY2FuIHJldHVybiBudWxsICh3aGljaAorICAgICAqIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uKS4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgYmV0d2VlbgorICAgICAqIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0gYW5kIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICogCisgICAgICogPHA+SWYgeW91IHJldHVybiBhIFZpZXcgZnJvbSBoZXJlLCB5b3Ugd2lsbCBsYXRlciBiZSBjYWxsZWQgaW4KKyAgICAgKiB7QGxpbmsgI29uRGVzdHJveVZpZXd9IHdoZW4gdGhlIHZpZXcgaXMgYmVpbmcgcmVsZWFzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGluZmxhdGVyIFRoZSBMYXlvdXRJbmZsYXRlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmZsYXRlCisgICAgICogYW55IHZpZXdzIGluIHRoZSBmcmFnbWVudCwKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIElmIG5vbi1udWxsLCB0aGlzIGlzIHRoZSBwYXJlbnQgdmlldyB0aGF0IHRoZSBmcmFnbWVudCdzCisgICAgICogVUkgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLiAgVGhlIGZyYWdtZW50IHNob3VsZCBub3QgYWRkIHRoZSB2aWV3IGl0c2VsZiwKKyAgICAgKiBidXQgdGhpcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgTGF5b3V0UGFyYW1zIG9mIHRoZSB2aWV3LgorICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgSWYgbm9uLW51bGwsIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgcmUtY29uc3RydWN0ZWQKKyAgICAgKiBmcm9tIGEgcHJldmlvdXMgc2F2ZWQgc3RhdGUgYXMgZ2l2ZW4gaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybiB0aGUgVmlldyBmb3IgdGhlIGZyYWdtZW50J3MgVUksIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZpZXcgZ2V0VmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQncyBhY3Rpdml0eSBoYXMgYmVlbiBjcmVhdGVkIGFuZCB0aGlzCisgICAgICogZnJhZ21lbnQncyB2aWV3IGhpZXJhcmNoeSBpbnN0YW50aWF0ZWQuICBJdCBjYW4gYmUgdXNlZCB0byBkbyBmaW5hbAorICAgICAqIGluaXRpYWxpemF0aW9uIG9uY2UgdGhlc2UgcGllY2VzIGFyZSBpbiBwbGFjZSwgc3VjaCBhcyByZXRyaWV2aW5nCisgICAgICogdmlld3Mgb3IgcmVzdG9yaW5nIHN0YXRlLiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGZyYWdtZW50cyB0aGF0IHVzZQorICAgICAqIHtAbGluayAjc2V0UmV0YWluSW5zdGFuY2UoYm9vbGVhbil9IHRvIHJldGFpbiB0aGVpciBpbnN0YW5jZSwKKyAgICAgKiBhcyB0aGlzIGNhbGxiYWNrIHRlbGxzIHRoZSBmcmFnbWVudCB3aGVuIGl0IGlzIGZ1bGx5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBuZXcgYWN0aXZpdHkgaW5zdGFuY2UuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI29uQ3JlYXRlVmlld30KKyAgICAgKiBhbmQgYmVmb3JlIHtAbGluayAjb25TdGFydCgpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIElmIHRoZSBmcmFnbWVudCBpcyBiZWluZyByZS1jcmVhdGVkIGZyb20KKyAgICAgKiBhIHByZXZpb3VzIHNhdmVkIHN0YXRlLCB0aGlzIGlzIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5Q3JlYXRlZChCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgRnJhZ21lbnQgaXMgdmlzaWJsZSB0byB0aGUgdXNlci4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdGFydCgpIEFjdGl2aXR5Lm9uU3RhcnR9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9TdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBmcmFnbWVudCBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBhY3RpdmVseSBydW5uaW5nLgorICAgICAqIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25SZXN1bWUoKSBBY3Rpdml0eS5vblJlc3VtZX0gb2YgdGhlIGNvbnRhaW5pbmcKKyAgICAgKiBBY3Rpdml0eSdzIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB0byBhc2sgdGhlIGZyYWdtZW50IHRvIHNhdmUgaXRzIGN1cnJlbnQgZHluYW1pYyBzdGF0ZSwgc28gaXQKKyAgICAgKiBjYW4gbGF0ZXIgYmUgcmVjb25zdHJ1Y3RlZCBpbiBhIG5ldyBpbnN0YW5jZSBvZiBpdHMgcHJvY2VzcyBpcworICAgICAqIHJlc3RhcnRlZC4gIElmIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmcmFnbWVudCBsYXRlciBuZWVkcyB0byBiZQorICAgICAqIGNyZWF0ZWQsIHRoZSBkYXRhIHlvdSBwbGFjZSBpbiB0aGUgQnVuZGxlIGhlcmUgd2lsbCBiZSBhdmFpbGFibGUKKyAgICAgKiBpbiB0aGUgQnVuZGxlIGdpdmVuIHRvIHtAbGluayAjb25DcmVhdGUoQnVuZGxlKX0sCisgICAgICoge0BsaW5rICNvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIsIFZpZXdHcm91cCwgQnVuZGxlKX0sIGFuZAorICAgICAqIHtAbGluayAjb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlKX0uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvcnJlc3BvbmRzIHRvIHtAbGluayBBY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSkKKyAgICAgKiBBY3Rpdml0eS5vblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSl9IGFuZCBtb3N0IG9mIHRoZSBkaXNjdXNzaW9uIHRoZXJlCisgICAgICogYXBwbGllcyBoZXJlIGFzIHdlbGwuICBOb3RlIGhvd2V2ZXI6IDxlbT50aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkCisgICAgICogYXQgYW55IHRpbWUgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9PC9lbT4uICBUaGVyZSBhcmUgbWFueSBzaXR1YXRpb25zCisgICAgICogd2hlcmUgYSBmcmFnbWVudCBtYXkgYmUgbW9zdGx5IHRvcm4gZG93biAoc3VjaCBhcyB3aGVuIHBsYWNlZCBvbiB0aGUKKyAgICAgKiBiYWNrIHN0YWNrIHdpdGggbm8gVUkgc2hvd2luZyksIGJ1dCBpdHMgc3RhdGUgd2lsbCBub3QgYmUgc2F2ZWQgdW50aWwKKyAgICAgKiBpdHMgb3duaW5nIGFjdGl2aXR5IGFjdHVhbGx5IG5lZWRzIHRvIHNhdmUgaXRzIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dFN0YXRlIEJ1bmRsZSBpbiB3aGljaCB0byBwbGFjZSB5b3VyIHNhdmVkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgcmVzdW1lZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25QYXVzZSgpIEFjdGl2aXR5Lm9uUGF1c2V9IG9mIHRoZSBjb250YWluaW5nCisgICAgICogQWN0aXZpdHkncyBsaWZlY3ljbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBGcmFnbWVudCBpcyBubyBsb25nZXIgc3RhcnRlZC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICogdGllZCB0byB7QGxpbmsgQWN0aXZpdHkjb25TdG9wKCkgQWN0aXZpdHkub25TdG9wfSBvZiB0aGUgY29udGFpbmluZworICAgICAqIEFjdGl2aXR5J3MgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIG9uTG93TWVtb3J5KCkgeworICAgICAgICBtQ2FsbGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZpZXcgcHJldmlvdXNseSBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVWaWV3fSBoYXMKKyAgICAgKiBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGZyYWdtZW50LiAgVGhlIG5leHQgdGltZSB0aGUgZnJhZ21lbnQgbmVlZHMKKyAgICAgKiB0byBiZSBkaXNwbGF5ZWQsIGEgbmV3IHZpZXcgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI29uU3RvcCgpfSBhbmQgYmVmb3JlIHtAbGluayAjb25EZXN0cm95KCl9LiAgSXQgaXMgY2FsbGVkCisgICAgICogPGVtPnJlZ2FyZGxlc3M8L2VtPiBvZiB3aGV0aGVyIHtAbGluayAjb25DcmVhdGVWaWV3fSByZXR1cm5lZCBhCisgICAgICogbm9uLW51bGwgdmlldy4gIEludGVybmFsbHkgaXQgaXMgY2FsbGVkIGFmdGVyIHRoZSB2aWV3J3Mgc3RhdGUgaGFzCisgICAgICogYmVlbiBzYXZlZCBidXQgYmVmb3JlIGl0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIFRoaXMgaXMgY2FsbGVkCisgICAgICogYWZ0ZXIge0BsaW5rICNvblN0b3AoKX0gYW5kIGJlZm9yZSB7QGxpbmsgI29uRGV0YWNoKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgbUNhbGxlZCA9IHRydWU7CisgICAgICAgIC8vTG9nLnYoImZvbyIsICJvbkRlc3Ryb3k6IG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcj0iICsgbUNoZWNrZWRGb3JMb2FkZXJNYW5hZ2VyCisgICAgICAgIC8vICAgICAgICArICIgbUxvYWRlck1hbmFnZXI9IiArIG1Mb2FkZXJNYW5hZ2VyKTsKKyAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG1BY3Rpdml0eS5nZXRMb2FkZXJNYW5hZ2VyKG1JbmRleCwgbVN0YXJ0ZWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvYWRlck1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvYWRlck1hbmFnZXIuZG9EZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4gIFRoaXMKKyAgICAgKiBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkRlc3Ryb3koKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25EZXRhY2goKSB7CisgICAgICAgIG1DYWxsZWQgPSB0cnVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiB0aGUgQWN0aXZpdHkncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUuICBZb3UKKyAgICAgKiBzaG91bGQgcGxhY2UgeW91ciBtZW51IGl0ZW1zIGluIHRvIDx2YXI+bWVudTwvdmFyPi4gIEZvciB0aGlzIG1ldGhvZAorICAgICAqIHRvIGJlIGNhbGxlZCwgeW91IG11c3QgaGF2ZSBmaXJzdCBjYWxsZWQge0BsaW5rICNzZXRIYXNPcHRpb25zTWVudX0uICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVPcHRpb25zTWVudShNZW51KSBBY3Rpdml0eS5vbkNyZWF0ZU9wdGlvbnNNZW51fQorICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZW51IFRoZSBvcHRpb25zIG1lbnUgaW4gd2hpY2ggeW91IHBsYWNlIHlvdXIgaXRlbXMuCisgICAgICogCisgICAgICogQHNlZSAjc2V0SGFzT3B0aW9uc01lbnUKKyAgICAgKiBAc2VlICNvblByZXBhcmVPcHRpb25zTWVudQorICAgICAqIEBzZWUgI29uT3B0aW9uc0l0ZW1TZWxlY3RlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRoZSBTY3JlZW4ncyBzdGFuZGFyZCBvcHRpb25zIG1lbnUgdG8gYmUgZGlzcGxheWVkLiAgVGhpcyBpcworICAgICAqIGNhbGxlZCByaWdodCBiZWZvcmUgdGhlIG1lbnUgaXMgc2hvd24sIGV2ZXJ5IHRpbWUgaXQgaXMgc2hvd24uICBZb3UgY2FuCisgICAgICogdXNlIHRoaXMgbWV0aG9kIHRvIGVmZmljaWVudGx5IGVuYWJsZS9kaXNhYmxlIGl0ZW1zIG9yIG90aGVyd2lzZQorICAgICAqIGR5bmFtaWNhbGx5IG1vZGlmeSB0aGUgY29udGVudHMuICBTZWUKKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSkgQWN0aXZpdHkub25QcmVwYXJlT3B0aW9uc01lbnV9CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldEhhc09wdGlvbnNNZW51CisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiB5b3VyIG9wdGlvbnMgbWVudSBpcyBzZWxlY3RlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwKKyAgICAgKiBwcm9jZXNzaW5nIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvCisgICAgICogaXRzIEhhbmRsZXIgYXMgYXBwcm9wcmlhdGUpLiAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QgZm9yIGFueSBpdGVtcworICAgICAqIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkbyBwcm9jZXNzaW5nIHdpdGhvdXQgdGhvc2Ugb3RoZXIKKyAgICAgKiBmYWNpbGl0aWVzLgorICAgICAqIAorICAgICAqIDxwPkRlcml2ZWQgY2xhc3NlcyBzaG91bGQgY2FsbCB0aHJvdWdoIHRvIHRoZSBiYXNlIGNsYXNzIGZvciBpdCB0bworICAgICAqIHBlcmZvcm0gdGhlIGRlZmF1bHQgbWVudSBoYW5kbGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXRlbSBUaGUgbWVudSBpdGVtIHRoYXQgd2FzIHNlbGVjdGVkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICogCisgICAgICogQHNlZSAjb25DcmVhdGVPcHRpb25zTWVudQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBvcHRpb25zIG1lbnUgaXMgYmVpbmcgY2xvc2VkIChlaXRoZXIgYnkgdGhlIHVzZXIgY2FuY2VsaW5nCisgICAgICogdGhlIG1lbnUgd2l0aCB0aGUgYmFjay9tZW51IGJ1dHRvbiwgb3Igd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkKS4KKyAgICAgKiAgCisgICAgICogQHBhcmFtIG1lbnUgVGhlIG9wdGlvbnMgbWVudSBhcyBsYXN0IHNob3duIG9yIGZpcnN0IGluaXRpYWxpemVkIGJ5CisgICAgICogICAgICAgICAgICAgb25DcmVhdGVPcHRpb25zTWVudSgpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgY29udGV4dCBtZW51IGZvciB0aGUge0Bjb2RlIHZpZXd9IGlzIGFib3V0IHRvIGJlIHNob3duLgorICAgICAqIFVubGlrZSB7QGxpbmsgI29uQ3JlYXRlT3B0aW9uc01lbnV9LCB0aGlzIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5CisgICAgICogdGltZSB0aGUgY29udGV4dCBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duIGFuZCBzaG91bGQgYmUgcG9wdWxhdGVkIGZvcgorICAgICAqIHRoZSB2aWV3IChvciBpdGVtIGluc2lkZSB0aGUgdmlldyBmb3Ige0BsaW5rIEFkYXB0ZXJWaWV3fSBzdWJjbGFzc2VzLAorICAgICAqIHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSB7QGNvZGUgbWVudUluZm99KSkuCisgICAgICogPHA+CisgICAgICogVXNlIHtAbGluayAjb25Db250ZXh0SXRlbVNlbGVjdGVkKGFuZHJvaWQudmlldy5NZW51SXRlbSl9IHRvIGtub3cgd2hlbiBhbgorICAgICAqIGl0ZW0gaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdXAgdG8KKyAgICAgKiB7QGxpbmsgQWN0aXZpdHkjb25DcmVhdGVDb250ZXh0TWVudSBBY3Rpdml0eS5vbkNyZWF0ZUNvbnRleHRNZW51fSwgdGhvdWdoCisgICAgICogeW91IGNhbiBub3QgY2FsbCB0aGlzIGltcGxlbWVudGF0aW9uIGlmIHlvdSBkb24ndCB3YW50IHRoYXQgYmVoYXZpb3IuCisgICAgICogPHA+CisgICAgICogSXQgaXMgbm90IHNhZmUgdG8gaG9sZCBvbnRvIHRoZSBjb250ZXh0IG1lbnUgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVDb250ZXh0TWVudShDb250ZXh0TWVudSBtZW51LCBWaWV3IHYsIENvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBnZXRBY3Rpdml0eSgpLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNvbnRleHQgbWVudSB0byBiZSBzaG93biBmb3IgdGhlIGdpdmVuIHZpZXcgKG11bHRpcGxlIHZpZXdzCisgICAgICogY2FuIHNob3cgdGhlIGNvbnRleHQgbWVudSkuIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZQorICAgICAqIHtAbGluayBPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXJ9IG9uIHRoZSB2aWV3IHRvIHRoaXMgZnJhZ21lbnQsIHNvCisgICAgICoge0BsaW5rICNvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51LCBWaWV3LCBDb250ZXh0TWVudUluZm8pfSB3aWxsIGJlCisgICAgICogY2FsbGVkIHdoZW4gaXQgaXMgdGltZSB0byBzaG93IHRoZSBjb250ZXh0IG1lbnUuCisgICAgICogCisgICAgICogQHNlZSAjdW5yZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc2hvdyBhIGNvbnRleHQgbWVudS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJldmVudHMgYSBjb250ZXh0IG1lbnUgdG8gYmUgc2hvd24gZm9yIHRoZSBnaXZlbiB2aWV3LiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICogcmVtb3ZlIHRoZSB7QGxpbmsgT25DcmVhdGVDb250ZXh0TWVudUxpc3RlbmVyfSBvbiB0aGUgdmlldy4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWdpc3RlckZvckNvbnRleHRNZW51KFZpZXcpCisgICAgICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCBzaG91bGQgc3RvcCBzaG93aW5nIGEgY29udGV4dCBtZW51LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJGb3JDb250ZXh0TWVudShWaWV3IHZpZXcpIHsKKyAgICAgICAgdmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaXRlbSBpbiBhIGNvbnRleHQgbWVudSBpcyBzZWxlY3RlZC4gVGhlCisgICAgICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyBmYWxzZSB0byBoYXZlIHRoZSBub3JtYWwgcHJvY2Vzc2luZworICAgICAqIGhhcHBlbiAoY2FsbGluZyB0aGUgaXRlbSdzIFJ1bm5hYmxlIG9yIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGl0cyBIYW5kbGVyCisgICAgICogYXMgYXBwcm9wcmlhdGUpLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCBmb3IgYW55IGl0ZW1zIGZvciB3aGljaCB5b3UKKyAgICAgKiB3b3VsZCBsaWtlIHRvIGRvIHByb2Nlc3Npbmcgd2l0aG91dCB0aG9zZSBvdGhlciBmYWNpbGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIFVzZSB7QGxpbmsgTWVudUl0ZW0jZ2V0TWVudUluZm8oKX0gdG8gZ2V0IGV4dHJhIGluZm9ybWF0aW9uIHNldCBieSB0aGUKKyAgICAgKiBWaWV3IHRoYXQgYWRkZWQgdGhpcyBtZW51IGl0ZW0uCisgICAgICogPHA+CisgICAgICogRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjYWxsIHRocm91Z2ggdG8gdGhlIGJhc2UgY2xhc3MgZm9yIGl0IHRvIHBlcmZvcm0KKyAgICAgKiB0aGUgZGVmYXVsdCBtZW51IGhhbmRsaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZXh0IG1lbnUgaXRlbSB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBjb250ZXh0IG1lbnUgcHJvY2Vzc2luZyB0bworICAgICAqICAgICAgICAgcHJvY2VlZCwgdHJ1ZSB0byBjb25zdW1lIGl0IGhlcmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIHBlcmZvcm1TdG9wKCkgeworICAgICAgICBvblN0b3AoKTsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Mb2FkZXJNYW5hZ2VyID0gbUFjdGl2aXR5LmdldExvYWRlck1hbmFnZXIobUluZGV4LCBtU3RhcnRlZCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb2FkZXJNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgfHwgIW1BY3Rpdml0eS5tQ2hhbmdpbmdDb25maWd1cmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1N0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1JldGFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA0ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB7QGxpbmsgRnJhZ21lbnR9IG9iamVjdHMgaW5zaWRlIG9mIGFuCisgKiB7QGxpbmsgQWN0aXZpdHl9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHNlcmllcyBvZiBlZGl0IG9wZXJhdGlvbnMgb24gdGhlIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIEZyYWdtZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBvcGVuVHJhbnNhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZnJhZ21lbnQgdGhhdCB3YXMgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gaWQgZWl0aGVyIHdoZW4gaW5mbGF0ZWQKKyAgICAgKiBmcm9tIFhNTCBvciBhcyB0aGUgY29udGFpbmVyIElEIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSUQgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeUlkKGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZyYWdtZW50IHRoYXQgd2FzIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHRhZyBlaXRoZXIgd2hlbiBpbmZsYXRlZAorICAgICAqIGZyb20gWE1MIG9yIGFzIHN1cHBsaWVkIHdoZW4gYWRkZWQgaW4gYSB0cmFuc2FjdGlvbi4gIFRoaXMgZmlyc3QKKyAgICAgKiBzZWFyY2hlcyB0aHJvdWdoIGZyYWdtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgYWRkZWQgdG8gdGhlIG1hbmFnZXIncworICAgICAqIGFjdGl2aXR5OyBpZiBubyBzdWNoIGZyYWdtZW50IGlzIGZvdW5kLCB0aGVuIGFsbCBmcmFnbWVudHMgY3VycmVudGx5CisgICAgICogb24gdGhlIGJhY2sgc3RhY2sgYXJlIHNlYXJjaGVkLgorICAgICAqIEByZXR1cm4gVGhlIGZyYWdtZW50IGlmIGZvdW5kIG9yIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBGcmFnbWVudCBmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcgdGFnKTsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjcG9wQmFja1N0YWNrKFN0cmluZywgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNwb3BCYWNrU3RhY2soaW50LCBpbnQpfTogSWYgc2V0LCBhbmQgdGhlIG5hbWUgb3IgSUQgb2YKKyAgICAgKiBhIGJhY2sgc3RhY2sgZW50cnkgaGFzIGJlZW4gc3VwcGxpZWQsIHRoZW4gYWxsIG1hdGNoaW5nIGVudHJpZXMgd2lsbAorICAgICAqIGJlIGNvbnN1bWVkIHVudGlsIG9uZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIGJvdHRvbSBvZgorICAgICAqIHRoZSBzdGFjayBpcyByZWFjaGVkLiAgT3RoZXJ3aXNlLCBhbGwgZW50cmllcyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGF0IGVudHJ5CisgICAgICogd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSA9IDE8PDA7CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIHRvcCBzdGF0ZSBvZmYgdGhlIGJhY2sgc3RhY2suICBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIG9uZQorICAgICAqIHRvIHBvcCwgZWxzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKTsKKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCBmcmFnbWVudCB0cmFuc2l0aW9uIGZyb20gdGhlIG1hbmFnZXIncyBmcmFnbWVudAorICAgICAqIGJhY2sgc3RhY2suICBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIHBvcCwgZmFsc2UgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIG5hbWUgSWYgbm9uLW51bGwsIHRoaXMgaXMgdGhlIG5hbWUgb2YgYSBwcmV2aW91cyBiYWNrIHN0YXRlCisgICAgICogdG8gbG9vayBmb3I7IGlmIGZvdW5kLCBhbGwgc3RhdGVzIHVwIHRvIHRoYXQgc3RhdGUgd2lsbCBiZSBwb3BwZWQuICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4gSWYgbnVsbCwgb25seSB0aGUgdG9wIHN0YXRlIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhTdHJpbmcgbmFtZSwgaW50IGZsYWdzKTsKKworICAgIC8qKgorICAgICAqIFBvcCBhbGwgYmFjayBzdGFjayBzdGF0ZXMgdXAgdG8gdGhlIG9uZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGF0ZWQgdG8gYmUgcG9wcGVkLiBJZiBubyBpZGVudGlmaWVyIGV4aXN0cywKKyAgICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiBUaGUgaWRlbnRpZmllciBpcyB0aGUgbnVtYmVyIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50VHJhbnNhY3Rpb24jY29tbWl0KCkgRnJhZ21lbnRUcmFuc2FjdGlvbi5jb21taXQoKX0uICBUaGUKKyAgICAgKiB7QGxpbmsgI1BPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRX0gZmxhZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIKKyAgICAgKiB0aGUgbmFtZWQgc3RhdGUgaXRzZWxmIGlzIHBvcHBlZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRWl0aGVyIDAgb3Ige0BsaW5rICNQT1BfQkFDS19TVEFDS19JTkNMVVNJVkV9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSByZWZlcmVuY2UgdG8gYSBmcmFnbWVudCBpbiBhIEJ1bmRsZS4gIFRoaXMgQnVuZGxlIGNhbiBiZQorICAgICAqIHBlcnNpc3RlZCBhcyBzYXZlZCBzdGF0ZSwgYW5kIHdoZW4gbGF0ZXIgcmVzdG9yaW5nCisgICAgICoge0BsaW5rICNnZXRGcmFnbWVudChCdW5kbGUsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50CisgICAgICogaW5zdGFuY2Ugb2YgdGhlIHNhbWUgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgaW4gd2hpY2ggdG8gcHV0IHRoZSBmcmFnbWVudCByZWZlcmVuY2UuCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgZW50cnkgaW4gdGhlIGJ1bmRsZS4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIEZyYWdtZW50IHdob3NlIHJlZmVyZW5jZSBpcyB0byBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSwgRnJhZ21lbnQgZnJhZ21lbnQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgRnJhZ21lbnQgaW5zdGFuY2UgZm9yIGEgcmVmZXJlbmNlIHByZXZpb3VzbHkKKyAgICAgKiBwbGFjZWQgd2l0aCB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGZyYWdtZW50IHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBlbnRyeSBpbiB0aGUgYnVuZGxlLgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCBGcmFnbWVudCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50IGdldEZyYWdtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBrZXkpOworfQorCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIEZyYWdtZW50U3RhdGVbXSBtQWN0aXZlOworICAgIGludFtdIG1BZGRlZDsKKyAgICBCYWNrU3RhY2tTdGF0ZVtdIG1CYWNrU3RhY2s7CisgICAgCisgICAgcHVibGljIEZyYWdtZW50TWFuYWdlclN0YXRlKCkgeworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG1BY3RpdmUgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEZyYWdtZW50U3RhdGUuQ1JFQVRPUik7CisgICAgICAgIG1BZGRlZCA9IGluLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIG1CYWNrU3RhY2sgPSBpbi5jcmVhdGVUeXBlZEFycmF5KEJhY2tTdGFja1N0YXRlLkNSRUFUT1IpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQWN0aXZlLCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheShtQWRkZWQpOworICAgICAgICBkZXN0LndyaXRlVHlwZWRBcnJheShtQmFja1N0YWNrLCBmbGFncyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPEZyYWdtZW50TWFuYWdlclN0YXRlPiBDUkVBVE9SCisgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8RnJhZ21lbnRNYW5hZ2VyU3RhdGU+KCkgeworICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoaW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRnJhZ21lbnRNYW5hZ2VyU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudE1hbmFnZXJTdGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKy8qKgorICogQ29udGFpbmVyIGZvciBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2aXR5LgorICovCitmaW5hbCBjbGFzcyBGcmFnbWVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgRnJhZ21lbnRNYW5hZ2VyIHsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRnJhZ21lbnRNYW5hZ2VyIjsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3JlcV9zdGF0ZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU1RBVEVfVEFHID0gImFuZHJvaWQ6dGFyZ2V0X3N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfU1RBVEVfVEFHID0gImFuZHJvaWQ6dmlld19zdGF0ZSI7CisKKyAgICBBcnJheUxpc3Q8UnVubmFibGU+IG1QZW5kaW5nQWN0aW9uczsKKyAgICBSdW5uYWJsZVtdIG1UbXBBY3Rpb25zOworICAgIGJvb2xlYW4gbUV4ZWN1dGluZ0FjdGlvbnM7CisgICAgCisgICAgQXJyYXlMaXN0PEZyYWdtZW50PiBtQWN0aXZlOworICAgIEFycmF5TGlzdDxGcmFnbWVudD4gbUFkZGVkOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxJbmRpY2VzOworICAgIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gbUJhY2tTdGFjazsKKyAgICAKKyAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGxvY2tlZC4KKyAgICBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+IG1CYWNrU3RhY2tJbmRpY2VzOworICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzOworCisgICAgaW50IG1DdXJTdGF0ZSA9IEZyYWdtZW50LklOSVRJQUxJWklORzsKKyAgICBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgCisgICAgYm9vbGVhbiBtTmVlZE1lbnVJbnZhbGlkYXRlOworICAgIGJvb2xlYW4gbVN0YXRlU2F2ZWQ7CisgICAgCisgICAgLy8gVGVtcG9yYXJ5IHZhcnMgZm9yIHN0YXRlIHNhdmUgYW5kIHJlc3RvcmUuCisgICAgQnVuZGxlIG1TdGF0ZUJ1bmRsZSA9IG51bGw7CisgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gbVN0YXRlQXJyYXkgPSBudWxsOworICAgIAorICAgIFJ1bm5hYmxlIG1FeGVjQ29tbWl0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgZXhlY1BlbmRpbmdBY3Rpb25zKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIG9wZW5UcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCYWNrU3RhY2tFbnRyeSh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soKSB7CisgICAgICAgIHJldHVybiBwb3BCYWNrU3RhY2tTdGF0ZShtQWN0aXZpdHkubUhhbmRsZXIsIG51bGwsIC0xLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwb3BCYWNrU3RhY2soU3RyaW5nIG5hbWUsIGludCBmbGFncykgeworICAgICAgICByZXR1cm4gcG9wQmFja1N0YWNrU3RhdGUobUFjdGl2aXR5Lm1IYW5kbGVyLCBuYW1lLCAtMSwgZmxhZ3MpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBvcEJhY2tTdGFjayhpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAoaWQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgaWQ6ICIgKyBpZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvcEJhY2tTdGFja1N0YXRlKG1BY3Rpdml0eS5tSGFuZGxlciwgbnVsbCwgaWQsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRGcmFnbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcga2V5LCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBpZiAoZnJhZ21lbnQubUluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGZyYWdtZW50CisgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY3VycmVudGx5IGluIHRoZSBGcmFnbWVudE1hbmFnZXIiKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0SW50KGtleSwgZnJhZ21lbnQubUluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSkgeworICAgICAgICBpbnQgaW5kZXggPSBidW5kbGUuZ2V0SW50KGtleSwgLTEpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA+PSBtQWN0aXZlLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJhZ2VtZW50IG5vIGxvbmdlciBleGlzdHMgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICsga2V5ICsgIjogaW5kZXggIiArIGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaW5kZXgpOworICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnZW1lbnQgbm8gbG9uZ2VyIGV4aXN0cyBmb3Iga2V5ICIKKyAgICAgICAgICAgICAgICAgICAgKyBrZXkgKyAiOiBpbmRleCAiICsgaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIEFuaW1hdG9yIGxvYWRBbmltYXRvcihGcmFnbWVudCBmcmFnbWVudCwgaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIsCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIEFuaW1hdG9yIGFuaW1PYmogPSBmcmFnbWVudC5vbkNyZWF0ZUFuaW1hdG9yKHRyYW5zaXQsIGVudGVyLAorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgIGlmIChhbmltT2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmltT2JqOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZnJhZ21lbnQubU5leHRBbmltICE9IDApIHsKKyAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBBbmltYXRvckluZmxhdGVyLmxvYWRBbmltYXRvcihtQWN0aXZpdHksIGZyYWdtZW50Lm1OZXh0QW5pbSk7CisgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0cmFuc2l0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgc3R5bGVJbmRleCA9IHRyYW5zaXRUb1N0eWxlSW5kZXgodHJhbnNpdCwgZW50ZXIpOworICAgICAgICBpZiAoc3R5bGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDAgJiYgbUFjdGl2aXR5LmdldFdpbmRvdygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSA9IG1BY3Rpdml0eS5nZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2luZG93QW5pbWF0aW9uczsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNpdGlvblN0eWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGF0dHJzID0gbUFjdGl2aXR5Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXModHJhbnNpdGlvblN0eWxlLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uKTsKKyAgICAgICAgaW50IGFuaW0gPSBhdHRycy5nZXRSZXNvdXJjZUlkKHN0eWxlSW5kZXgsIDApOworICAgICAgICBhdHRycy5yZWN5Y2xlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoYW5pbSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIEFuaW1hdG9ySW5mbGF0ZXIubG9hZEFuaW1hdG9yKG1BY3Rpdml0eSwgYW5pbSk7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoRnJhZ21lbnQgZiwgaW50IG5ld1N0YXRlLCBpbnQgdHJhbnNpdCwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICAvLyBGcmFnbWVudHMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhZGRlZCB3aWxsIHNpdCBpbiB0aGUgb25DcmVhdGUoKSBzdGF0ZS4KKyAgICAgICAgaWYgKCFmLm1BZGRlZCAmJiBuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGYubVN0YXRlIDwgbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LklOSVRJQUxJWklORzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZi5tU2F2ZWRGcmFnbWVudFN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBnZXRGcmFnbWVudChmLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRSZXF1ZXN0Q29kZSA9IGYubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlRBUkdFVF9SRVFVRVNUX0NPREVfU1RBVEVfVEFHLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGYub25BdHRhY2gobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQXR0YWNoKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHkub25BdHRhY2hGcmFnbWVudChmKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICghZi5tUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25DcmVhdGUoZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uQ3JlYXRlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubUZyb21MYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBmcmFnbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY29udGVudCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXlvdXQsIHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGhlIHZpZXcgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW5mbGF0ZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRkaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IGYub25DcmVhdGVWaWV3KG1BY3Rpdml0eS5nZXRMYXlvdXRJbmZsYXRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmLm1TYXZlZEZyYWdtZW50U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVZpZXcuc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3RvcmVWaWV3U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tSGlkZGVuKSBmLm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIENPTlRFTlQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tRnJvbUxheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cCBjb250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1Db250YWluZXJJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IChWaWV3R3JvdXApbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChmLm1Db250YWluZXJJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmV3IHZpZXcgZm91bmQgZm9yIGlkIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZi5tQ29udGFpbmVySWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgZnJhZ21lbnQgIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3ID0gZi5vbkNyZWF0ZVZpZXcobUFjdGl2aXR5LmdldExheW91dEluZmxhdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IGxvYWRBbmltYXRvcihmLCB0cmFuc2l0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uQWN0aXZpdHlDcmVhdGVkKGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblJlYWR5KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA+IEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZXRvIFNUQVJURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuU1RBUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuU1RBUlRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gUkVTVU1FRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYub25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUmVzdW1lKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGYubVN0YXRlID4gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZi5tU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LlJFU1VNRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LlJFU1VNRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gUkVTVU1FRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm9uUGF1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpZCBub3QgY2FsbCB0aHJvdWdoIHRvIHN1cGVyLm9uUGF1c2UoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tUmVzdW1lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBGcmFnbWVudC5TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPCBGcmFnbWVudC5TVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1vdmVmcm9tIFNUQVJURUQ6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5wZXJmb3JtU3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25TdG9wKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlIDwgRnJhZ21lbnQuQUNUSVZJVFlfQ1JFQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBDT05URU5UOiAiICsgZik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBzYXZlIHRoZSBjdXJyZW50IHZpZXcgc3RhdGUgaWYgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUFjdGl2aXR5LmlzRmluaXNoaW5nKCkgJiYgZi5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkRlc3Ryb3llZFZpZXcoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCAmJiBmLm1Db250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VyU3RhdGUgPiBGcmFnbWVudC5JTklUSUFMSVpJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbSA9IGxvYWRBbmltYXRvcihmLCB0cmFuc2l0LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBjb250YWluZXIgPSBmLm1Db250YWluZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdmlldyA9IGYubVZpZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdGFydFZpZXdUcmFuc2l0aW9uKHZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5lbmRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGYubVZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ29udGFpbmVyLnJlbW92ZVZpZXcoZi5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1Db250YWluZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEZyYWdtZW50LkNSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA8IEZyYWdtZW50LkNSRUFURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibW92ZWZyb20gQ1JFQVRFRDogIiArIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uRGVzdHJveSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5tQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRldGFjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXRhY2goKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZi5tQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGYubVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQorICAgIAorICAgIHZvaWQgbW92ZVRvU3RhdGUoaW50IG5ld1N0YXRlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBtb3ZlVG9TdGF0ZShuZXdTdGF0ZSwgMCwgMCwgYWx3YXlzKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBtb3ZlVG9TdGF0ZShpbnQgbmV3U3RhdGUsIGludCB0cmFuc2l0LCBpbnQgdHJhbnNpdFN0eWxlLCBib29sZWFuIGFsd2F5cykgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwgJiYgbmV3U3RhdGUgIT0gRnJhZ21lbnQuSU5JVElBTElaSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBhY3Rpdml0eSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsd2F5cyAmJiBtQ3VyU3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbUN1clN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVRvU3RhdGUoZiwgbmV3U3RhdGUsIHRyYW5zaXQsIHRyYW5zaXRTdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobU5lZWRNZW51SW52YWxpZGF0ZSAmJiBtQWN0aXZpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlT3B0aW9uc01lbnUoKTsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBtYWtlQWN0aXZlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmLnNldEluZGV4KG1BY3RpdmUuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuYWRkKGYpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmLnNldEluZGV4KG1BdmFpbEluZGljZXMucmVtb3ZlKG1BdmFpbEluZGljZXMuc2l6ZSgpLTEpKTsKKyAgICAgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIG1ha2VJbmFjdGl2ZShGcmFnbWVudCBmKSB7CisgICAgICAgIGlmIChmLm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJGcmVlaW5nIGZyYWdtZW50IGluZGV4ICIgKyBmLm1JbmRleCk7CisgICAgICAgIG1BY3RpdmUuc2V0KGYubUluZGV4LCBudWxsKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgfQorICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChmLm1JbmRleCk7CisgICAgICAgIG1BY3Rpdml0eS5pbnZhbGlkYXRlRnJhZ21lbnRJbmRleChmLm1JbmRleCk7CisgICAgICAgIGYuY2xlYXJJbmRleCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBtb3ZlVG9TdGF0ZU5vdykgeworICAgICAgICBpZiAobUFkZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIG1BZGRlZCA9IG5ldyBBcnJheUxpc3Q8RnJhZ21lbnQ+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUFkZGVkLmFkZChmcmFnbWVudCk7CisgICAgICAgIG1ha2VBY3RpdmUoZnJhZ21lbnQpOworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImFkZDogIiArIGZyYWdtZW50KTsKKyAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW92ZVRvU3RhdGVOb3cpIHsKKyAgICAgICAgICAgIG1vdmVUb1N0YXRlKGZyYWdtZW50LCBtQ3VyU3RhdGUsIDAsIDApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlbW92ZTogIiArIGZyYWdtZW50ICsgIiBuZXN0aW5nPSIgKyBmcmFnbWVudC5tQmFja1N0YWNrTmVzdGluZyk7CisgICAgICAgIG1BZGRlZC5yZW1vdmUoZnJhZ21lbnQpOworICAgICAgICBmaW5hbCBib29sZWFuIGluYWN0aXZlID0gZnJhZ21lbnQubUJhY2tTdGFja05lc3RpbmcgPD0gMDsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IYXNNZW51KSB7CisgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmcmFnbWVudC5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIGluYWN0aXZlID8gRnJhZ21lbnQuSU5JVElBTElaSU5HIDogRnJhZ21lbnQuQ1JFQVRFRCwKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLCB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICBpZiAoaW5hY3RpdmUpIHsKKyAgICAgICAgICAgIG1ha2VJbmFjdGl2ZShmcmFnbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaGlkZUZyYWdtZW50KEZyYWdtZW50IGZyYWdtZW50LCBpbnQgdHJhbnNpdGlvbiwgaW50IHRyYW5zaXRpb25TdHlsZSkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgImhpZGU6ICIgKyBmcmFnbWVudCk7CisgICAgICAgIGlmICghZnJhZ21lbnQubUhpZGRlbikgeworICAgICAgICAgICAgZnJhZ21lbnQubUhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBpZiAoZnJhZ21lbnQubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFuaW1hdG9yIGFuaW0gPSBsb2FkQW5pbWF0b3IoZnJhZ21lbnQsIHRyYW5zaXRpb24sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3R5bGUpOworICAgICAgICAgICAgICAgIGlmIChhbmltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbS5zZXRUYXJnZXQoZnJhZ21lbnQubVZpZXcpOworICAgICAgICAgICAgICAgICAgICBhbmltLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50Lm1WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tQWRkZWQgJiYgZnJhZ21lbnQubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYWdtZW50Lm9uSGlkZGVuQ2hhbmdlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzaG93RnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCB0cmFuc2l0aW9uLCBpbnQgdHJhbnNpdGlvblN0eWxlKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2hvdzogIiArIGZyYWdtZW50KTsKKyAgICAgICAgaWYgKGZyYWdtZW50Lm1IaWRkZW4pIHsKKyAgICAgICAgICAgIGZyYWdtZW50Lm1IaWRkZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudC5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQW5pbWF0b3IgYW5pbSA9IGxvYWRBbmltYXRvcihmcmFnbWVudCwgdHJhbnNpdGlvbiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TdHlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGFuaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbmltLnNldFRhcmdldChmcmFnbWVudC5tVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGFuaW0uc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhZ21lbnQubVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYWdtZW50Lm1BZGRlZCAmJiBmcmFnbWVudC5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgIG1OZWVkTWVudUludmFsaWRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhZ21lbnQub25IaWRkZW5DaGFuZ2VkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlJZChpbnQgaWQpIHsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QgbG9vayB0aHJvdWdoIGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgICAgIGZvciAoaW50IGk9bUFkZGVkLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm93IGZvciBhbnkga25vd24gZnJhZ21lbnQuCisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYubUZyYWdtZW50SWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nIHRhZykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBsb29rIHRocm91Z2ggYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWRkZWQuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgdGFnLmVxdWFscyhmLm1UYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdyBmb3IgYW55IGtub3duIGZyYWdtZW50LgorICAgICAgICAgICAgZm9yIChpbnQgaT1tQWN0aXZlLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiB0YWcuZXF1YWxzKGYubVRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRnJhZ21lbnQgZmluZEZyYWdtZW50QnlXaG8oU3RyaW5nIHdobykgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsICYmIHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPW1BY3RpdmUuc2l6ZSgpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWN0aXZlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmIHdoby5lcXVhbHMoZi5tV2hvKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGVucXVldWVBY3Rpb24oUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgIGlmIChtU3RhdGVTYXZlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgcGVyZm9ybSB0aGlzIGFjdGlvbiBhZnRlciBvblNhdmVJbnN0YW5jZVN0YXRlIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0FjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFJ1bm5hYmxlPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLmFkZChhY3Rpb24pOworICAgICAgICAgICAgaWYgKG1QZW5kaW5nQWN0aW9ucy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUV4ZWNDb21taXQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tSGFuZGxlci5wb3N0KG1FeGVjQ29tbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGFsbG9jQmFja1N0YWNrSW5kZXgoQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCB8fCBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtQmFja1N0YWNrSW5kaWNlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTZXR0aW5nIGJhY2sgc3RhY2sgaW5kZXggIiArIGluZGV4ICsgIiB0byAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQoYnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5yZW1vdmUobUF2YWlsQmFja1N0YWNrSW5kaWNlcy5zaXplKCktMSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHdpdGggIiArIGJzZSk7CisgICAgICAgICAgICAgICAgbUJhY2tTdGFja0luZGljZXMuc2V0KGluZGV4LCBic2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tTdGFja0luZGV4KGludCBpbmRleCwgQmFja1N0YWNrRW50cnkgYnNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1CYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8QmFja1N0YWNrRW50cnk+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgTiA9IG1CYWNrU3RhY2tJbmRpY2VzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IE4pIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNldHRpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXggKyAiIHRvICIgKyBic2UpOworICAgICAgICAgICAgICAgIG1CYWNrU3RhY2tJbmRpY2VzLnNldChpbmRleCwgYnNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKE4gPCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXZhaWxCYWNrU3RhY2tJbmRpY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgYXZhaWxhYmxlIGJhY2sgc3RhY2sgaW5kZXggIiArIE4pOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxCYWNrU3RhY2tJbmRpY2VzLmFkZChOKTsKKyAgICAgICAgICAgICAgICAgICAgTisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyBiYWNrIHN0YWNrIGluZGV4ICIgKyBpbmRleCArICIgd2l0aCAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5hZGQoYnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZyZWVCYWNrU3RhY2tJbmRleChpbnQgaW5kZXgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrSW5kaWNlcy5zZXQoaW5kZXgsIG51bGwpOworICAgICAgICAgICAgaWYgKG1BdmFpbEJhY2tTdGFja0luZGljZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BdmFpbEJhY2tTdGFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkZyZWVpbmcgYmFjayBzdGFjayBpbmRleCAiICsgaW5kZXgpOworICAgICAgICAgICAgbUF2YWlsQmFja1N0YWNrSW5kaWNlcy5hZGQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSBjYWxsIGZyb20gbWFpbiB0aHJlYWQhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY1BlbmRpbmdBY3Rpb25zKCkgeworICAgICAgICBpZiAobUV4ZWN1dGluZ0FjdGlvbnMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlY3Vyc2l2ZSBlbnRyeSB0byBleGVjUGVuZGluZ0FjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBudW1BY3Rpb25zOworICAgICAgICAgICAgCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdBY3Rpb25zID09IG51bGwgfHwgbVBlbmRpbmdBY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbnVtQWN0aW9ucyA9IG1QZW5kaW5nQWN0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKG1UbXBBY3Rpb25zID09IG51bGwgfHwgbVRtcEFjdGlvbnMubGVuZ3RoIDwgbnVtQWN0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBtVG1wQWN0aW9ucyA9IG5ldyBSdW5uYWJsZVtudW1BY3Rpb25zXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBY3Rpb25zLnRvQXJyYXkobVRtcEFjdGlvbnMpOworICAgICAgICAgICAgICAgIG1QZW5kaW5nQWN0aW9ucy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eS5tSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUV4ZWNDb21taXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtQWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVRtcEFjdGlvbnNbaV0ucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXhlY3V0aW5nQWN0aW9ucyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEJhY2tTdGFja1N0YXRlKEJhY2tTdGFja0VudHJ5IHN0YXRlKSB7CisgICAgICAgIGlmIChtQmFja1N0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrU3RhY2sgPSBuZXcgQXJyYXlMaXN0PEJhY2tTdGFja0VudHJ5PigpOworICAgICAgICB9CisgICAgICAgIG1CYWNrU3RhY2suYWRkKHN0YXRlKTsKKyAgICB9CisgICAgCisgICAgYm9vbGVhbiBwb3BCYWNrU3RhY2tTdGF0ZShIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBuYW1lLCBpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBpZiAobUJhY2tTdGFjayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCAmJiBpZCA8IDAgJiYgKGZsYWdzJkFjdGl2aXR5LlBPUF9CQUNLX1NUQUNLX0lOQ0xVU0lWRSkgPT0gMCkgeworICAgICAgICAgICAgaW50IGxhc3QgPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgaWYgKGxhc3QgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQmFja1N0YWNrRW50cnkgYnNzID0gbUJhY2tTdGFjay5yZW1vdmUobGFzdCk7CisgICAgICAgICAgICBlbnF1ZXVlQWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUG9wcGluZyBiYWNrIHN0YWNrIHN0YXRlOiAiICsgYnNzKTsKKyAgICAgICAgICAgICAgICAgICAgYnNzLnBvcEZyb21CYWNrU3RhY2sodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgfHwgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGEgbmFtZSBvciBJRCBpcyBzcGVjaWZpZWQsIGxvb2sgZm9yIHRoYXQgcGxhY2UgaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2suCisgICAgICAgICAgICAgICAgaW5kZXggPSBtQmFja1N0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzcyA9IG1CYWNrU3RhY2suZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhic3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IDAgJiYgaWQgPT0gYnNzLm1JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MmQWN0aXZpdHkuUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4LS07CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnN1bWUgYWxsIGZvbGxvd2luZyBlbnRyaWVzIHRoYXQgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCYWNrU3RhY2tFbnRyeSBic3MgPSBtQmFja1N0YWNrLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhic3MuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlkID49IDAgJiYgaWQgPT0gYnNzLm1JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbUJhY2tTdGFjay5zaXplKCktMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4gc3RhdGVzCisgICAgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9bUJhY2tTdGFjay5zaXplKCktMTsgaT5pbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgc3RhdGVzLmFkZChtQmFja1N0YWNrLnJlbW92ZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnF1ZXVlQWN0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBMQVNUID0gc3RhdGVzLnNpemUoKS0xOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8PUxBU1Q7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJQb3BwaW5nIGJhY2sgc3RhY2sgc3RhdGU6ICIgKyBzdGF0ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5nZXQoaSkucG9wRnJvbUJhY2tTdGFjayhpID09IExBU1QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxGcmFnbWVudD4gcmV0YWluTm9uQ29uZmlnKCkgeworICAgICAgICBBcnJheUxpc3Q8RnJhZ21lbnQ+IGZyYWdtZW50cyA9IG51bGw7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWN0aXZlLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BY3RpdmUuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgZi5tUmV0YWluSW5zdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMgPSBuZXcgQXJyYXlMaXN0PEZyYWdtZW50PigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cy5hZGQoZik7CisgICAgICAgICAgICAgICAgICAgIGYubVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudHM7CisgICAgfQorICAgIAorICAgIHZvaWQgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKEZyYWdtZW50IGYpIHsKKyAgICAgICAgaWYgKGYubVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RhdGVBcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOworICAgICAgICB9CisgICAgICAgIGYubVZpZXcuc2F2ZUhpZXJhcmNoeVN0YXRlKG1TdGF0ZUFycmF5KTsKKyAgICAgICAgaWYgKG1TdGF0ZUFycmF5LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gbVN0YXRlQXJyYXk7CisgICAgICAgICAgICBtU3RhdGVBcnJheSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgUGFyY2VsYWJsZSBzYXZlQWxsU3RhdGUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gdHJ1ZTsKKworICAgICAgICBpZiAobUFjdGl2ZSA9PSBudWxsIHx8IG1BY3RpdmUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IGFsbCBhY3RpdmUgZnJhZ21lbnRzLgorICAgICAgICBpbnQgTiA9IG1BY3RpdmUuc2l6ZSgpOworICAgICAgICBGcmFnbWVudFN0YXRlW10gYWN0aXZlID0gbmV3IEZyYWdtZW50U3RhdGVbTl07CisgICAgICAgIGJvb2xlYW4gaGF2ZUZyYWdtZW50cyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGF2ZUZyYWdtZW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IG5ldyBGcmFnbWVudFN0YXRlKGYpOworICAgICAgICAgICAgICAgIGFjdGl2ZVtpXSA9IGZzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtU3RhdGVCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYub25TYXZlSW5zdGFuY2VTdGF0ZShtU3RhdGVCdW5kbGUpOworICAgICAgICAgICAgICAgIGlmICghbVN0YXRlQnVuZGxlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbVN0YXRlQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVGcmFnbWVudFZpZXdTdGF0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVklFV19TVEFURV9UQUcsIGYubVNhdmVkVmlld1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1dEZyYWdtZW50KGZzLm1TYXZlZEZyYWdtZW50U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5UQVJHRVRfU1RBVEVfVEFHLCBmLm1UYXJnZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0UmVxdWVzdENvZGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5wdXRJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50TWFuYWdlckltcGwuVEFSR0VUX1JFUVVFU1RfQ09ERV9TVEFURV9UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubVRhcmdldFJlcXVlc3RDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlNhdmVkIHN0YXRlIG9mICIgKyBmICsgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmcy5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFoYXZlRnJhZ21lbnRzKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogbm8gZnJhZ21lbnRzISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGludFtdIGFkZGVkID0gbnVsbDsKKyAgICAgICAgQmFja1N0YWNrU3RhdGVbXSBiYWNrU3RhY2sgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgbGlzdCBvZiBjdXJyZW50bHkgYWRkZWQgZnJhZ21lbnRzLgorICAgICAgICBOID0gbUFkZGVkLnNpemUoKTsKKyAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICBhZGRlZCA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkZWRbaV0gPSBtQWRkZWQuZ2V0KGkpLm1JbmRleDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNhdmVBbGxTdGF0ZTogYWRkaW5nIGZyYWdtZW50ICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgbUFkZGVkLmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE5vdyBzYXZlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChtQmFja1N0YWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIE4gPSBtQmFja1N0YWNrLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID4gMCkgeworICAgICAgICAgICAgICAgIGJhY2tTdGFjayA9IG5ldyBCYWNrU3RhY2tTdGF0ZVtOXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tTdGFja1tpXSA9IG5ldyBCYWNrU3RhY2tTdGF0ZSh0aGlzLCBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAic2F2ZUFsbFN0YXRlOiBhZGRpbmcgYmFjayBzdGFjayAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBtQmFja1N0YWNrLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSBuZXcgRnJhZ21lbnRNYW5hZ2VyU3RhdGUoKTsKKyAgICAgICAgZm1zLm1BY3RpdmUgPSBhY3RpdmU7CisgICAgICAgIGZtcy5tQWRkZWQgPSBhZGRlZDsKKyAgICAgICAgZm1zLm1CYWNrU3RhY2sgPSBiYWNrU3RhY2s7CisgICAgICAgIHJldHVybiBmbXM7CisgICAgfQorICAgIAorICAgIHZvaWQgcmVzdG9yZUFsbFN0YXRlKFBhcmNlbGFibGUgc3RhdGUsIEFycmF5TGlzdDxGcmFnbWVudD4gbm9uQ29uZmlnKSB7CisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHNhdmVkIHN0YXRlIGF0IGFsbCwgdGhlbiB0aGVyZSBjYW4gbm90IGJlCisgICAgICAgIC8vIGFueSBub25Db25maWcgZnJhZ21lbnRzIGVpdGhlciwgc28gdGhhdCBpcyB0aGF0LgorICAgICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBGcmFnbWVudE1hbmFnZXJTdGF0ZSBmbXMgPSAoRnJhZ21lbnRNYW5hZ2VyU3RhdGUpc3RhdGU7CisgICAgICAgIGlmIChmbXMubUFjdGl2ZSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCByZS1hdHRhY2ggYW55IG5vbi1jb25maWcgaW5zdGFuY2VzIHdlIGFyZSByZXRhaW5pbmcgYmFjaworICAgICAgICAvLyB0byB0aGVpciBzYXZlZCBzdGF0ZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGluc3RhbnRpYXRlIHRoZW0gYWdhaW4uCisgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiByZS1hdHRhY2hpbmcgcmV0YWluZWQgIiArIGYpOworICAgICAgICAgICAgICAgIEZyYWdtZW50U3RhdGUgZnMgPSBmbXMubUFjdGl2ZVtmLm1JbmRleF07CisgICAgICAgICAgICAgICAgZnMubUluc3RhbmNlID0gZjsKKyAgICAgICAgICAgICAgICBmLm1TYXZlZFZpZXdTdGF0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZi5tQmFja1N0YWNrTmVzdGluZyA9IDA7CisgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBCdWlsZCB0aGUgZnVsbCBsaXN0IG9mIGFjdGl2ZSBmcmFnbWVudHMsIGluc3RhbnRpYXRpbmcgdGhlbSBmcm9tCisgICAgICAgIC8vIHRoZWlyIHNhdmVkIHN0YXRlLgorICAgICAgICBtQWN0aXZlID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BY3RpdmUubGVuZ3RoKTsKKyAgICAgICAgaWYgKG1BdmFpbEluZGljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUF2YWlsSW5kaWNlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUFjdGl2ZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRnJhZ21lbnRTdGF0ZSBmcyA9IGZtcy5tQWN0aXZlW2ldOworICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gZnMuaW5zdGFudGlhdGUobUFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogYWRkaW5nICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJyZXN0b3JlQWxsU3RhdGU6IGFkZGluZyAjIiArIGkgKyAiOiAobnVsbCkiKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlLmFkZChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobUF2YWlsSW5kaWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbEluZGljZXMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYXZhaWwgIyIgKyBpKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVXBkYXRlIHRoZSB0YXJnZXQgb2YgYWxsIHJldGFpbmVkIGZyYWdtZW50cy4KKyAgICAgICAgaWYgKG5vbkNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bm9uQ29uZmlnLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG5vbkNvbmZpZy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQubUluZGV4IDwgbUFjdGl2ZS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYubVRhcmdldCA9IG1BY3RpdmUuZ2V0KGYubVRhcmdldC5tSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmUtYXR0YWNoaW5nIHJldGFpbmVkIGZyYWdtZW50ICIgKyBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXJnZXQgbm8gbG9uZ2VyIGV4aXN0czogIiArIGYubVRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGFkZGVkIGZyYWdtZW50cy4KKyAgICAgICAgaWYgKGZtcy5tQWRkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkZGVkID0gbmV3IEFycmF5TGlzdDxGcmFnbWVudD4oZm1zLm1BZGRlZC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZtcy5tQWRkZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFjdGl2ZS5nZXQoZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBpbnN0YW50aWF0ZWQgZnJhZ21lbnQgZm9yIGluZGV4ICMiICsgZm1zLm1BZGRlZFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGYubUFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmLm1JbW1lZGlhdGVBY3Rpdml0eSA9IG1BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RvcmVBbGxTdGF0ZTogbWFraW5nIGFkZGVkICMiICsgaSArICI6ICIgKyBmKTsKKyAgICAgICAgICAgICAgICBtQWRkZWQuYWRkKGYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFkZGVkID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgdGhlIGJhY2sgc3RhY2suCisgICAgICAgIGlmIChmbXMubUJhY2tTdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbmV3IEFycmF5TGlzdDxCYWNrU3RhY2tFbnRyeT4oZm1zLm1CYWNrU3RhY2subGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxmbXMubUJhY2tTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEJhY2tTdGFja0VudHJ5IGJzZSA9IGZtcy5tQmFja1N0YWNrW2ldLmluc3RhbnRpYXRlKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAicmVzdG9yZUFsbFN0YXRlOiBhZGRpbmcgYnNlICMiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChpbmRleCAiICsgYnNlLm1JbmRleCArICIpOiAiICsgYnNlKTsKKyAgICAgICAgICAgICAgICBtQmFja1N0YWNrLmFkZChic2UpOworICAgICAgICAgICAgICAgIGlmIChic2UubUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QmFja1N0YWNrSW5kZXgoYnNlLm1JbmRleCwgYnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmFja1N0YWNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhdHRhY2hBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBpZiAobUFjdGl2aXR5ICE9IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gYWN0aXZpdHk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQWN0aXZpdHlDcmVhdGVkKCkgeworICAgICAgICBtU3RhdGVTYXZlZCA9IGZhbHNlOworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5BQ1RJVklUWV9DUkVBVEVELCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU3RhcnQoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlNUQVJURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hSZXN1bWUoKSB7CisgICAgICAgIG1TdGF0ZVNhdmVkID0gZmFsc2U7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LlJFU1VNRUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hQYXVzZSgpIHsKKyAgICAgICAgbW92ZVRvU3RhdGUoRnJhZ21lbnQuU1RBUlRFRCwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN0b3AoKSB7CisgICAgICAgIG1vdmVUb1N0YXRlKEZyYWdtZW50LkFDVElWSVRZX0NSRUFURUQsIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hEZXN0cm95KCkgeworICAgICAgICBtb3ZlVG9TdGF0ZShGcmFnbWVudC5JTklUSUFMSVpJTkcsIGZhbHNlKTsKKyAgICAgICAgbUFjdGl2aXR5ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hDcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICBib29sZWFuIHNob3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1BY3RpdmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1BZGRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBtQWRkZWQuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwgJiYgIWYubUhpZGRlbiAmJiBmLm1IYXNNZW51KSB7CisgICAgICAgICAgICAgICAgICAgIHNob3cgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSwgaW5mbGF0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hQcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIGJvb2xlYW4gc2hvdyA9IGZhbHNlOworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGYub25QcmVwYXJlT3B0aW9uc01lbnUobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzaG93OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaE9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAobUFjdGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bUFkZGVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZiA9IG1BZGRlZC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiAhZi5tSGlkZGVuICYmIGYubUhhc01lbnUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYub25Db250ZXh0SXRlbVNlbGVjdGVkKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoT3B0aW9uc01lbnVDbG9zZWQoTWVudSBtZW51KSB7CisgICAgICAgIGlmIChtQWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxtQWRkZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGcmFnbWVudCBmID0gbUFkZGVkLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZiAhPSBudWxsICYmICFmLm1IaWRkZW4gJiYgZi5tSGFzTWVudSkgeworICAgICAgICAgICAgICAgICAgICBmLm9uT3B0aW9uc01lbnVDbG9zZWQobWVudSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHJldmVyc2VUcmFuc2l0KGludCB0cmFuc2l0KSB7CisgICAgICAgIGludCByZXYgPSAwOworICAgICAgICBzd2l0Y2ggKHRyYW5zaXQpIHsKKyAgICAgICAgICAgIGNhc2UgRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU46CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX0NMT1NFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgcmV2ID0gRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IHRyYW5zaXRUb1N0eWxlSW5kZXgoaW50IHRyYW5zaXQsIGJvb2xlYW4gZW50ZXIpIHsKKyAgICAgICAgaW50IGFuaW1BdHRyID0gLTE7CisgICAgICAgIHN3aXRjaCAodHJhbnNpdCkgeworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfT1BFTjoKKyAgICAgICAgICAgICAgICBhbmltQXR0ciA9IGVudGVyCisgICAgICAgICAgICAgICAgICAgID8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuRnJhZ21lbnRBbmltYXRpb25fZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5GcmFnbWVudEFuaW1hdGlvbl9mcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfQ0xPU0U6CisgICAgICAgICAgICAgICAgYW5pbUF0dHIgPSBlbnRlcgorICAgICAgICAgICAgICAgICAgICA/IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICA6IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkZyYWdtZW50QW5pbWF0aW9uX2ZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmltQXR0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRUcmFuc2FjdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ0MTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50VHJhbnNhY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzMSBAQAorcGFja2FnZSBhbmRyb2lkLmFwcDsKKworLyoqCisgKiBBUEkgZm9yIHBlcmZvcm1pbmcgYSBzZXQgb2YgRnJhZ21lbnQgb3BlcmF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBGcmFnbWVudFRyYW5zYWN0aW9uIHsKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgMCBjb250YWluZXJWaWV3SWQuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKEZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgdGFnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxscyB7QGxpbmsgI2FkZChpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gYWRkKGludCBjb250YWluZXJWaWV3SWQsIEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHkgc3RhdGUuICBUaGlzIGZyYWdtZW50IG1heSBvcHRpb25hbGx5CisgICAgICogYWxzbyBoYXZlIGl0cyB2aWV3IChpZiB7QGxpbmsgRnJhZ21lbnQjb25DcmVhdGVWaWV3IEZyYWdtZW50Lm9uQ3JlYXRlVmlld30KKyAgICAgKiByZXR1cm5zIG5vbi1udWxsKSBpbnRvIGEgY29udGFpbmVyIHZpZXcgb2YgdGhlIGFjdGl2aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgT3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoaXMgZnJhZ21lbnQgaXMKKyAgICAgKiB0byBiZSBwbGFjZWQgaW4uICBJZiAwLCBpdCB3aWxsIG5vdCBiZSBwbGFjZWQgaW4gYSBjb250YWluZXIuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFRoZSBmcmFnbWVudCB0byBiZSBhZGRlZC4gIFRoaXMgZnJhZ21lbnQgbXVzdCBub3QgYWxyZWFkeQorICAgICAqIGJlIGFkZGVkIHRvIHRoZSBhY3Rpdml0eS4KKyAgICAgKiBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZyBuYW1lIGZvciB0aGUgZnJhZ21lbnQsIHRvIGxhdGVyIHJldHJpZXZlIHRoZQorICAgICAqIGZyYWdtZW50IHdpdGgge0BsaW5rIEFjdGl2aXR5I2ZpbmRGcmFnbWVudEJ5VGFnKFN0cmluZykKKyAgICAgKiBBY3Rpdml0eS5maW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpfS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBhZGQoaW50IGNvbnRhaW5lclZpZXdJZCwgRnJhZ21lbnQgZnJhZ21lbnQsIFN0cmluZyB0YWcpOworICAgIAorICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayAjcmVwbGFjZShpbnQsIEZyYWdtZW50LCBTdHJpbmcpfSB3aXRoIGEgbnVsbCB0YWcuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCk7CisgICAgCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBmcmFnbWVudCB0aGF0IHdhcyBhZGRlZCB0byBhIGNvbnRhaW5lci4gIFRoaXMgaXMKKyAgICAgKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBjYWxsaW5nIHtAbGluayAjcmVtb3ZlKEZyYWdtZW50KX0gZm9yIGFsbAorICAgICAqIGN1cnJlbnRseSBhZGRlZCBmcmFnbWVudHMgdGhhdCB3ZXJlIGFkZGVkIHdpdGggdGhlIHNhbWUgY29udGFpbmVyVmlld0lkCisgICAgICogYW5kIHRoZW4ge0BsaW5rICNhZGQoaW50LCBGcmFnbWVudCwgU3RyaW5nKX0gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKKyAgICAgKiBnaXZlbiBoZXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250YWluZXJWaWV3SWQgSWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHdob3NlIGZyYWdtZW50KHMpIGFyZQorICAgICAqIHRvIGJlIHJlcGxhY2VkLgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgbmV3IGZyYWdtZW50IHRvIHBsYWNlIGluIHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcgbmFtZSBmb3IgdGhlIGZyYWdtZW50LCB0byBsYXRlciByZXRyaWV2ZSB0aGUKKyAgICAgKiBmcmFnbWVudCB3aXRoIHtAbGluayBBY3Rpdml0eSNmaW5kRnJhZ21lbnRCeVRhZyhTdHJpbmcpCisgICAgICogQWN0aXZpdHkuZmluZEZyYWdtZW50QnlUYWcoU3RyaW5nKX0uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gcmVwbGFjZShpbnQgY29udGFpbmVyVmlld0lkLCBGcmFnbWVudCBmcmFnbWVudCwgU3RyaW5nIHRhZyk7CisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgSWYgaXQgd2FzIGFkZGVkIHRvIGEgY29udGFpbmVyLCBpdHMgdmlldworICAgICAqIGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoYXQgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiByZW1vdmUoRnJhZ21lbnQgZnJhZ21lbnQpOworICAgIAorICAgIC8qKgorICAgICAqIEhpZGVzIGFuIGV4aXN0aW5nIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgVGhlIGZyYWdtZW50IHRvIGJlIGhpZGRlbi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbWUgRnJhZ21lbnRUcmFuc2FjdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBoaWRlKEZyYWdtZW50IGZyYWdtZW50KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBIaWRlcyBhIHByZXZpb3VzbHkgaGlkZGVuIGZyYWdtZW50LiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBmcmFnbWVudHMgd2hvc2UKKyAgICAgKiB2aWV3cyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBjb250YWluZXIsIGFzIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmlldyB0bworICAgICAqIGJlIHNob3duLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gYmUgc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1lIEZyYWdtZW50VHJhbnNhY3Rpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZyYWdtZW50VHJhbnNhY3Rpb24gc2hvdyhGcmFnbWVudCBmcmFnbWVudCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgbm8gb3BlcmF0aW9ucywKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpOworICAgIAorICAgIC8qKgorICAgICAqIEJpdCBtYXNrIHRoYXQgaXMgc2V0IGZvciBhbGwgZW50ZXIgdHJhbnNpdGlvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBUUkFOU0lUX0VOVEVSX01BU0sgPSAweDEwMDA7CisgICAgCisgICAgLyoqCisgICAgICogQml0IG1hc2sgdGhhdCBpcyBzZXQgZm9yIGFsbCBleGl0IHRyYW5zaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9FWElUX01BU0sgPSAweDIwMDA7CisgICAgCisgICAgLyoqIE5vdCBzZXQgdXAgZm9yIGEgdHJhbnNpdGlvbi4gKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfVU5TRVQgPSAtMTsKKyAgICAvKiogTm8gYW5pbWF0aW9uIGZvciB0cmFuc2l0aW9uLiAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgVFJBTlNJVF9OT05FID0gMDsKKyAgICAvKiogRnJhZ21lbnQgaXMgYmVpbmcgYWRkZWQgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRlJBR01FTlRfT1BFTiA9IDEgfCBUUkFOU0lUX0VOVEVSX01BU0s7CisgICAgLyoqIEZyYWdtZW50IGlzIGJlaW5nIHJlbW92ZWQgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IFRSQU5TSVRfRlJBR01FTlRfQ0xPU0UgPSAyIHwgVFJBTlNJVF9FWElUX01BU0s7CisKKyAgICBwdWJsaWMgRnJhZ21lbnRUcmFuc2FjdGlvbiBzZXRDdXN0b21BbmltYXRpb25zKGludCBlbnRlciwgaW50IGV4aXQpOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb24oaW50IHRyYW5zaXQpOworICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIHNldFRyYW5zaXRpb25TdHlsZShpbnQgc3R5bGVSZXMpOworICAgIAorICAgIHB1YmxpYyBGcmFnbWVudFRyYW5zYWN0aW9uIGFkZFRvQmFja1N0YWNrKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlcyBhIGNvbW1pdCBvZiB0aGlzIHRyYW5zYWN0aW9uLiAgTm90ZSB0aGF0IHRoZSBjb21taXQgZG9lcworICAgICAqIG5vdCBoYXBwZW4gaW1tZWRpYXRlbHk7IGl0IHdpbGwgYmUgc2NoZWR1bGVkIGFzIHdvcmsgb24gdGhlIG1haW4gdGhyZWFkCisgICAgICogdG8gYmUgZG9uZSB0aGUgbmV4dCB0aW1lIHRoYXQgdGhyZWFkIGlzIHJlYWR5LgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgdHJhbnNhY3Rpb24ncyBiYWNrIHN0YWNrIGVudHJ5LAorICAgICAqIGlmIHtAbGluayAjYWRkVG9CYWNrU3RhY2soU3RyaW5nKX0gaGFkIGJlZW4gY2FsbGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zCisgICAgICogYSBuZWdhdGl2ZSBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIGludCBjb21taXQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IGY5YmQ0NjEuLjkwMWYxMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMzExLDYgKzMxMSwxMCBAQAogICAgIAogICAgIHB1YmxpYyB2b2lkIGZpbmlzaEhlYXZ5V2VpZ2h0QXBwKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKIAorICAgIHB1YmxpYyB2b2lkIHNldEltbWVyc2l2ZShJQmluZGVyIHRva2VuLCBib29sZWFuIGltbWVyc2l2ZSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbWVyc2l2ZShJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGlzVG9wQWN0aXZpdHlJbW1lcnNpdmUoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIAogICAgIHB1YmxpYyB2b2lkIGNyYXNoQXBwbGljYXRpb24oaW50IHVpZCwgaW50IGluaXRpYWxQaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIApAQCAtMzIwLDYgKzMyNCwxMCBAQAogICAgIHB1YmxpYyB2b2lkIHJldm9rZVVyaVBlcm1pc3Npb25Gcm9tT3duZXIoSUJpbmRlciBvd25lciwgVXJpIHVyaSwKICAgICAgICAgICAgIGludCBtb2RlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgLy8gQ2F1c2UgdGhlIHNwZWNpZmllZCBwcm9jZXNzIHRvIGR1bXAgdGhlIHNwZWNpZmllZCBoZWFwLgorICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLAorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKKwogICAgIC8qCiAgICAgICogUHJpdmF0ZSBub24tQmluZGVyIGludGVyZmFjZXMKICAgICAgKi8KQEAgLTUyOSw0ICs1MzcsNSBAQAogICAgIGludCBORVdfVVJJX1BFUk1JU1NJT05fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE0OwogICAgIGludCBHUkFOVF9VUklfUEVSTUlTU0lPTl9GUk9NX09XTkVSX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzExNTsKICAgICBpbnQgUkVWT0tFX1VSSV9QRVJNSVNTSU9OX0ZST01fT1dORVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE2OworICAgIGludCBEVU1QX0hFQVBfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTE3OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCmluZGV4IGM4ZWYxN2YuLjAzOWJjYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTk3LDYgKzk3LDggQEAKICAgICB2b2lkIHNjaGVkdWxlQWN0aXZpdHlDb25maWd1cmF0aW9uQ2hhbmdlZChJQmluZGVyIHRva2VuKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgcHJvZmlsZXJDb250cm9sKGJvb2xlYW4gc3RhcnQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CisgICAgdm9pZCBkdW1wSGVhcChib29sZWFuIG1hbmFnZWQsIFN0cmluZyBwYXRoLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCkKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBzZXRTY2hlZHVsaW5nR3JvdXAoaW50IGdyb3VwKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHZvaWQgZ2V0TWVtb3J5SW5mbyhEZWJ1Zy5NZW1vcnlJbmZvIG91dEluZm8pIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX1JFTU9WRUQgPSAwOwpAQCAtMTQwLDQgKzE0Miw1IEBACiAgICAgaW50IFNDSEVEVUxFX1NVSUNJREVfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMzI7CiAgICAgaW50IERJU1BBVENIX1BBQ0tBR0VfQlJPQURDQVNUX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzMzOwogICAgIGludCBTQ0hFRFVMRV9DUkFTSF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiszNDsKKyAgICBpbnQgRFVNUF9IRUFQX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzM1OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0luc3RydW1lbnRhdGlvbi5qYXZhCmluZGV4IGI4YzNhYTMuLjRkNWYzNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JbnN0cnVtZW50YXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSW5zdHJ1bWVudGF0aW9uLmphdmEKQEAgLTk5Nyw4ICs5OTcsMTAgQEAKICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewogICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSljbGF6ei5uZXdJbnN0YW5jZSgpOwogICAgICAgICBBY3Rpdml0eVRocmVhZCBhVGhyZWFkID0gbnVsbDsKLSAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LCBpbmZvLCB0aXRsZSwKLSAgICAgICAgICAgICAgICBwYXJlbnQsIGlkLCBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlLCBuZXcgQ29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGNvbnRleHQsIGFUaHJlYWQsIHRoaXMsIHRva2VuLCBhcHBsaWNhdGlvbiwgaW50ZW50LAorICAgICAgICAgICAgICAgIGluZm8sIHRpdGxlLCBwYXJlbnQsIGlkLAorICAgICAgICAgICAgICAgIChBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzKWxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSk7CiAgICAgICAgIHJldHVybiBhY3Rpdml0eTsKICAgICB9CiAKQEAgLTEwNTgsMjEgKzEwNjAsMjMgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgY2FsbEFjdGl2aXR5T25EZXN0cm95KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0gICAgICBpZiAobVdhaXRpbmdBY3Rpdml0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlXYWl0ZXIgYXcgPSBtV2FpdGluZ0FjdGl2aXRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKLSAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZmlsdGVyRXF1YWxzKGFjdGl2aXR5LmdldEludGVudCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgIGF3LmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQorICAgICAgLy8gVE9ETzogdGhlIGZvbGxvd2luZyBibG9jayBjYXVzZXMgaW50ZXJtaXR0ZW50IGhhbmdzIHdoZW4gdXNpbmcgc3RhcnRBY3Rpdml0eQorICAgICAgLy8gdGVtcG9yYXJpbHkgY29tbWVudCBvdXQgdW50aWwgcm9vdCBjYXVzZSBpcyBmaXhlZCAoYnVnIDI2MzA2ODMpCisvLyAgICAgIGlmIChtV2FpdGluZ0FjdGl2aXRpZXMgIT0gbnVsbCkgeworLy8gICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworLy8gICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVdhaXRpbmdBY3Rpdml0aWVzLnNpemUoKTsKKy8vICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisvLyAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5V2FpdGVyIGF3ID0gbVdhaXRpbmdBY3Rpdml0aWVzLmdldChpKTsKKy8vICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IGF3LmludGVudDsKKy8vICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5maWx0ZXJFcXVhbHMoYWN0aXZpdHkuZ2V0SW50ZW50KCkpKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICBhdy5hY3Rpdml0eSA9IGFjdGl2aXR5OworLy8gICAgICAgICAgICAgICAgICAgICAgbU1lc3NhZ2VRdWV1ZS5hZGRJZGxlSGFuZGxlcihuZXcgQWN0aXZpdHlHb2luZyhhdykpOworLy8gICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgfQorLy8gICAgICB9CiAgICAgICAKLSAgICAgIGFjdGl2aXR5Lm9uRGVzdHJveSgpOworICAgICAgYWN0aXZpdHkucGVyZm9ybURlc3Ryb3koKTsKICAgICAgIAogICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jKSB7CkBAIC0xMzMxLDcgKzEzMzUsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCiAgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAogICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgotICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggYWN0aXZpdHkgaXMgcGVyZm9ybSB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdoaWNoIGFjdGl2aXR5IGlzIHBlcmZvcm1pbmcgdGhlIHN0YXJ0IChhbmQgdGh1cyByZWNlaXZpbmcgCiAgICAgICogICAgICAgICAgICAgICBhbnkgcmVzdWx0KTsgbWF5IGJlIG51bGwgaWYgdGhpcyBjYWxsIGlzIG5vdCBiZWluZyBtYWRlCiAgICAgICogICAgICAgICAgICAgICBmcm9tIGFuIGFjdGl2aXR5LgogICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCkBAIC0xMzgxLDYgKzEzODUsNjQgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2V4ZWNTdGFydEFjdGl2aXR5KENvbnRleHQsIElCaW5kZXIsIElCaW5kZXIsIEFjdGl2aXR5LCBJbnRlbnQsIGludCl9LAorICAgICAqIGJ1dCBmb3IgY2FsbHMgZnJvbSBhIHsjbGluayBGcmFnbWVudH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdobyBUaGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eSBpcyBiZWluZyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0VGhyZWFkIFRoZSBtYWluIHRocmVhZCBvZiB0aGUgQ29udGV4dCBmcm9tIHdoaWNoIHRoZSBhY3Rpdml0eQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHRva2VuIEludGVybmFsIHRva2VuIGlkZW50aWZ5aW5nIHRvIHRoZSBzeXN0ZW0gd2hvIGlzIHN0YXJ0aW5nIAorICAgICAqICAgICAgICAgICAgICB0aGUgYWN0aXZpdHk7IG1heSBiZSBudWxsLgorICAgICAqIEBwYXJhbSB0YXJnZXQgV2hpY2ggZnJhZ21lbnQgaXMgcGVyZm9ybWluZyB0aGUgc3RhcnQgKGFuZCB0aHVzIHJlY2VpdmluZyAKKyAgICAgKiAgICAgICAgICAgICAgIGFueSByZXN1bHQpLgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGFjdHVhbCBJbnRlbnQgdG8gc3RhcnQuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb2RlIElkZW50aWZpZXIgZm9yIHRoaXMgcmVxdWVzdCdzIHJlc3VsdDsgbGVzcyB0aGFuIHplcm8gCisgICAgICogICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjYWxsZXIgaXMgbm90IGV4cGVjdGluZyBhIHJlc3VsdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRvIGZvcmNlIHRoZSByZXR1cm4gb2YgYSBwYXJ0aWN1bGFyIHJlc3VsdCwgcmV0dXJuIGFuIAorICAgICAqICAgICAgICAgQWN0aXZpdHlSZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgZGF0YTsgb3RoZXJ3aXNlCisgICAgICogICAgICAgICByZXR1cm4gbnVsbC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIG51bGwuCisgICAgICogIAorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHkoSW50ZW50KQorICAgICAqIEBzZWUgQWN0aXZpdHkjc3RhcnRBY3Rpdml0eUZvclJlc3VsdChJbnRlbnQsIGludCkKKyAgICAgKiBAc2VlIEFjdGl2aXR5I3N0YXJ0QWN0aXZpdHlGcm9tQ2hpbGQKKyAgICAgKiAKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIEFjdGl2aXR5UmVzdWx0IGV4ZWNTdGFydEFjdGl2aXR5KAorICAgICAgICBDb250ZXh0IHdobywgSUJpbmRlciBjb250ZXh0VGhyZWFkLCBJQmluZGVyIHRva2VuLCBGcmFnbWVudCB0YXJnZXQsCisgICAgICAgIEludGVudCBpbnRlbnQsIGludCByZXF1ZXN0Q29kZSkgeworICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQgd2hvVGhyZWFkID0gKElBcHBsaWNhdGlvblRocmVhZCkgY29udGV4dFRocmVhZDsKKyAgICAgICAgaWYgKG1BY3Rpdml0eU1vbml0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BY3Rpdml0eU1vbml0b3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjdGl2aXR5TW9uaXRvciBhbSA9IG1BY3Rpdml0eU1vbml0b3JzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFtLm1hdGNoKHdobywgbnVsbCwgaW50ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYW0ubUhpdHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbS5pc0Jsb2NraW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdENvZGUgPj0gMCA/IGFtLmdldFJlc3VsdCgpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKQorICAgICAgICAgICAgICAgIC5zdGFydEFjdGl2aXR5KHdob1RocmVhZCwgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnJlc29sdmVUeXBlSWZOZWVkZWQod2hvLmdldENvbnRlbnRSZXNvbHZlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIDAsIHRva2VuLCB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5tV2hvIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb2RlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgY2hlY2tTdGFydEFjdGl2aXR5UmVzdWx0KHJlc3VsdCwgaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKnBhY2thZ2UqLyBmaW5hbCB2b2lkIGluaXQoQWN0aXZpdHlUaHJlYWQgdGhyZWFkLAogICAgICAgICAgICAgQ29udGV4dCBpbnN0ckNvbnRleHQsIENvbnRleHQgYXBwQ29udGV4dCwgQ29tcG9uZW50TmFtZSBjb21wb25lbnQsIAogICAgICAgICAgICAgSUluc3RydW1lbnRhdGlvbldhdGNoZXIgd2F0Y2hlcikgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RBY3Rpdml0eS5qYXZhCmluZGV4IDRiZjU1MTguLmQ0OTk2OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0QWN0aXZpdHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEFjdGl2aXR5LmphdmEKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBpZiAobUxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfY29udGVudF9zaW1wbGUpOwogCiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyZjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBBIGZyYWdtZW50IHRoYXQgZGlzcGxheXMgYSBsaXN0IG9mIGl0ZW1zIGJ5IGJpbmRpbmcgdG8gYSBkYXRhIHNvdXJjZSBzdWNoIGFzCisgKiBhbiBhcnJheSBvciBDdXJzb3IsIGFuZCBleHBvc2VzIGV2ZW50IGhhbmRsZXJzIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtLgorICogPHA+CisgKiBMaXN0RnJhZ21lbnQgaG9zdHMgYSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXcgTGlzdFZpZXd9IG9iamVjdCB0aGF0IGNhbgorICogYmUgYm91bmQgdG8gZGlmZmVyZW50IGRhdGEgc291cmNlcywgdHlwaWNhbGx5IGVpdGhlciBhbiBhcnJheSBvciBhIEN1cnNvcgorICogaG9sZGluZyBxdWVyeSByZXN1bHRzLiBCaW5kaW5nLCBzY3JlZW4gbGF5b3V0LCBhbmQgcm93IGxheW91dCBhcmUgZGlzY3Vzc2VkCisgKiBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorICogPHA+CisgKiA8c3Ryb25nPlNjcmVlbiBMYXlvdXQ8L3N0cm9uZz4KKyAqIDwvcD4KKyAqIDxwPgorICogTGlzdEZyYWdtZW50IGhhcyBhIGRlZmF1bHQgbGF5b3V0IHRoYXQgY29uc2lzdHMgb2YgYSBzaW5nbGUgbGlzdCB2aWV3LgorICogSG93ZXZlciwgaWYgeW91IGRlc2lyZSwgeW91IGNhbiBjdXN0b21pemUgdGhlIGZyYWdtZW50IGxheW91dCBieSByZXR1cm5pbmcKKyAqIHlvdXIgb3duIHZpZXcgaGllcmFyY2h5IGZyb20ge0BsaW5rICNvbkNyZWF0ZVZpZXd9LgorICogVG8gZG8gdGhpcywgeW91ciB2aWV3IGhpZXJhcmNoeSA8ZW0+bXVzdDwvZW0+IGNvbnRhaW4gYSBMaXN0VmlldyBvYmplY3Qgd2l0aCB0aGUKKyAqIGlkICJAYW5kcm9pZDppZC9saXN0IiAob3Ige0BsaW5rIGFuZHJvaWQuUi5pZCNsaXN0fSBpZiBpdCdzIGluIGNvZGUpCisgKiA8cD4KKyAqIE9wdGlvbmFsbHksIHlvdXIgdmlldyBoaWVyYXJjaHkgY2FuIGNvbnRhaW4gYW5vdGhlciB2aWV3IG9iamVjdCBvZiBhbnkgdHlwZSB0bworICogZGlzcGxheSB3aGVuIHRoZSBsaXN0IHZpZXcgaXMgZW1wdHkuIFRoaXMgImVtcHR5IGxpc3QiIG5vdGlmaWVyIG11c3QgaGF2ZSBhbgorICogaWQgImFuZHJvaWQ6ZW1wdHkiLiBOb3RlIHRoYXQgd2hlbiBhbiBlbXB0eSB2aWV3IGlzIHByZXNlbnQsIHRoZSBsaXN0IHZpZXcKKyAqIHdpbGwgYmUgaGlkZGVuIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBkaXNwbGF5LgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGNvZGUgZGVtb25zdHJhdGVzIGFuICh1Z2x5KSBjdXN0b20gbGlzdCBsYXlvdXQuIEl0IGhhcyBhIGxpc3QKKyAqIHdpdGggYSBncmVlbiBiYWNrZ3JvdW5kLCBhbmQgYW4gYWx0ZXJuYXRlIHJlZCAibm8gZGF0YSIgbWVzc2FnZS4KKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7dXRmLTgmcXVvdDs/Jmd0OworICogJmx0O0xpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249JnF1b3Q7dmVydGljYWwmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0mcXVvdDs4ZHAmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9JnF1b3Q7OGRwJnF1b3Q7Jmd0OworICoKKyAqICAgICAmbHQ7TGlzdFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAaWQvYW5kcm9pZDpsaXN0JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0mcXVvdDsjMDBGRjAwJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0mcXVvdDsxJnF1b3Q7CisgKiAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAaWQvYW5kcm9pZDplbXB0eSZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O21hdGNoX3BhcmVudCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9JnF1b3Q7I0ZGMDAwMCZxdW90OworICogICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9JnF1b3Q7Tm8gZGF0YSZxdW90Oy8mZ3Q7CisgKiAmbHQ7L0xpbmVhckxheW91dCZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogPHN0cm9uZz5Sb3cgTGF5b3V0PC9zdHJvbmc+CisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgbGF5b3V0IG9mIGluZGl2aWR1YWwgcm93cyBpbiB0aGUgbGlzdC4gWW91IGRvIHRoaXMgYnkKKyAqIHNwZWNpZnlpbmcgYSBsYXlvdXQgcmVzb3VyY2UgaW4gdGhlIExpc3RBZGFwdGVyIG9iamVjdCBob3N0ZWQgYnkgdGhlIGZyYWdtZW50CisgKiAodGhlIExpc3RBZGFwdGVyIGJpbmRzIHRoZSBMaXN0VmlldyB0byB0aGUgZGF0YTsgbW9yZSBvbiB0aGlzIGxhdGVyKS4KKyAqIDxwPgorICogQSBMaXN0QWRhcHRlciBjb25zdHJ1Y3RvciB0YWtlcyBhIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyBhIGxheW91dCByZXNvdXJjZQorICogZm9yIGVhY2ggcm93LiBJdCBhbHNvIGhhcyB0d28gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgbGV0IHlvdSBzcGVjaWZ5CisgKiB3aGljaCBkYXRhIGZpZWxkIHRvIGFzc29jaWF0ZSB3aXRoIHdoaWNoIG9iamVjdCBpbiB0aGUgcm93IGxheW91dCByZXNvdXJjZS4KKyAqIFRoZXNlIHR3byBwYXJhbWV0ZXJzIGFyZSB0eXBpY2FsbHkgcGFyYWxsZWwgYXJyYXlzLgorICogPC9wPgorICogPHA+CisgKiBBbmRyb2lkIHByb3ZpZGVzIHNvbWUgc3RhbmRhcmQgcm93IGxheW91dCByZXNvdXJjZXMuIFRoZXNlIGFyZSBpbiB0aGUKKyAqIHtAbGluayBhbmRyb2lkLlIubGF5b3V0fSBjbGFzcywgYW5kIGhhdmUgbmFtZXMgc3VjaCBhcyBzaW1wbGVfbGlzdF9pdGVtXzEsCisgKiBzaW1wbGVfbGlzdF9pdGVtXzIsIGFuZCB0d29fbGluZV9saXN0X2l0ZW0uIFRoZSBmb2xsb3dpbmcgbGF5b3V0IFhNTCBpcyB0aGUKKyAqIHNvdXJjZSBmb3IgdGhlIHJlc291cmNlIHR3b19saW5lX2xpc3RfaXRlbSwgd2hpY2ggZGlzcGxheXMgdHdvIGRhdGEKKyAqIGZpZWxkcyxvbmUgYWJvdmUgdGhlIG90aGVyLCBmb3IgZWFjaCBsaXN0IHJvdy4KKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7dXRmLTgmcXVvdDs/Jmd0OworICogJmx0O0xpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90OworICogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249JnF1b3Q7dmVydGljYWwmcXVvdDsmZ3Q7CisgKgorICogICAgICZsdDtUZXh0VmlldyBhbmRyb2lkOmlkPSZxdW90O0AraWQvdGV4dDEmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0mcXVvdDsxNnNwJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSZxdW90O2JvbGQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9JnF1b3Q7bWF0Y2hfcGFyZW50JnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0mcXVvdDt3cmFwX2NvbnRlbnQmcXVvdDsvJmd0OworICoKKyAqICAgICAmbHQ7VGV4dFZpZXcgYW5kcm9pZDppZD0mcXVvdDtAK2lkL3RleHQyJnF1b3Q7CisgKiAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9JnF1b3Q7MTZzcCZxdW90OworICogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0mcXVvdDttYXRjaF9wYXJlbnQmcXVvdDsKKyAqICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSZxdW90O3dyYXBfY29udGVudCZxdW90Oy8mZ3Q7CisgKiAmbHQ7L0xpbmVhckxheW91dCZndDsKKyAqIDwvcHJlPgorICoKKyAqIDxwPgorICogWW91IG11c3QgaWRlbnRpZnkgdGhlIGRhdGEgYm91bmQgdG8gZWFjaCBUZXh0VmlldyBvYmplY3QgaW4gdGhpcyBsYXlvdXQuIFRoZQorICogc3ludGF4IGZvciB0aGlzIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorICogPC9wPgorICogPHA+CisgKiA8c3Ryb25nPkJpbmRpbmcgdG8gRGF0YTwvc3Ryb25nPgorICogPC9wPgorICogPHA+CisgKiBZb3UgYmluZCB0aGUgTGlzdEZyYWdtZW50J3MgTGlzdFZpZXcgb2JqZWN0IHRvIGRhdGEgdXNpbmcgYSBjbGFzcyB0aGF0CisgKiBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXIgTGlzdEFkYXB0ZXJ9IGludGVyZmFjZS4KKyAqIEFuZHJvaWQgcHJvdmlkZXMgdHdvIHN0YW5kYXJkIGxpc3QgYWRhcHRlcnM6CisgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2ltcGxlQWRhcHRlciBTaW1wbGVBZGFwdGVyfSBmb3Igc3RhdGljIGRhdGEgKE1hcHMpLAorICogYW5kIHtAbGluayBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyIFNpbXBsZUN1cnNvckFkYXB0ZXJ9IGZvciBDdXJzb3IKKyAqIHF1ZXJ5IHJlc3VsdHMuCisgKiA8L3A+CisgKiA8cD4KKyAqIFlvdSA8Yj5tdXN0PC9iPiB1c2UKKyAqIHtAbGluayAjc2V0TGlzdEFkYXB0ZXIoTGlzdEFkYXB0ZXIpIExpc3RGcmFnbWVudC5zZXRMaXN0QWRhcHRlcigpfSB0bworICogYXNzb2NpYXRlIHRoZSBsaXN0IHdpdGggYW4gYWRhcHRlci4gIERvIG5vdCBkaXJlY3RseSBjYWxsCisgKiB7QGxpbmsgTGlzdFZpZXcjc2V0QWRhcHRlcihMaXN0QWRhcHRlcikgTGlzdFZpZXcuc2V0QWRhcHRlcigpfSBvciBlbHNlCisgKiBpbXBvcnRhbnQgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBza2lwcGVkLgorICogPC9wPgorICoKKyAqIEBzZWUgI3NldExpc3RBZGFwdGVyCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3CisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgZmluYWwgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIGZpbmFsIHByaXZhdGUgUnVubmFibGUgbVJlcXVlc3RGb2N1cyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbUxpc3QuZm9jdXNhYmxlVmlld0F2YWlsYWJsZShtTGlzdCk7CisgICAgICAgIH0KKyAgICB9OworICAgIAorICAgIGZpbmFsIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtT25DbGlja0xpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBvbkxpc3RJdGVtQ2xpY2soKExpc3RWaWV3KXBhcmVudCwgdiwgcG9zaXRpb24sIGlkKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBMaXN0VmlldyBtTGlzdDsKKyAgICBWaWV3IG1FbXB0eVZpZXc7CisgICAgVGV4dFZpZXcgbVN0YW5kYXJkRW1wdHlWaWV3OworICAgIFZpZXcgbVByb2dyZXNzQ29udGFpbmVyOworICAgIFZpZXcgbUxpc3RDb250YWluZXI7CisgICAgYm9vbGVhbiBtU2V0RW1wdHlUZXh0OworICAgIGJvb2xlYW4gbUxpc3RTaG93bjsKKworICAgIHB1YmxpYyBMaXN0RnJhZ21lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRvIHJldHVybiBhIHNpbXBsZSBsaXN0IHZpZXcuICBTdWJjbGFzc2VzCisgICAgICogY2FuIG92ZXJyaWRlIHRvIHJlcGxhY2Ugd2l0aCB0aGVpciBvd24gbGF5b3V0LiAgSWYgZG9pbmcgc28sIHRoZQorICAgICAqIHJldHVybmVkIHZpZXcgaGllcmFyY2h5IDxlbT5tdXN0PC9lbT4gaGF2ZSBhIExpc3RWaWV3IHdob3NlIGlkCisgICAgICogaXMge0BsaW5rIGFuZHJvaWQuUi5pZCNsaXN0IGFuZHJvaWQuUi5pZC5saXN0fSBhbmQgY2FuIG9wdGlvbmFsbHkKKyAgICAgKiBoYXZlIGEgc2libGluZyB2aWV3IGlkIHtAbGluayBhbmRyb2lkLlIuaWQjZW1wdHkgYW5kcm9pZC5SLmlkLmVtcHR5fQorICAgICAqIHRoYXQgaXMgdG8gYmUgc2hvd24gd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiB5b3UgYXJlIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Qgd2l0aCB5b3VyIG93biBjdXN0b20gY29udGVudCwKKyAgICAgKiBjb25zaWRlciBpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxheW91dCB7QGxpbmsgYW5kcm9pZC5SLmxheW91dCNsaXN0X2NvbnRlbnR9CisgICAgICogaW4geW91ciBsYXlvdXQgZmlsZSwgc28gdGhhdCB5b3UgY29udGludWUgdG8gcmV0YWluIGFsbCBvZiB0aGUgc3RhbmRhcmQKKyAgICAgKiBiZWhhdmlvciBvZiBMaXN0RnJhZ21lbnQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqIHdheSB0byBoYXZlIHRoZSBidWlsdC1pbiBpbmRldGVybWluYW50IHByb2dyZXNzIHN0YXRlIGJlIHNob3duLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9jb250ZW50LAorICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCB0byBsaXN0IHZpZXcgb25jZSBGcmFnbWVudCBpcyByZWFkeSB0byBydW4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0YWNoIGZyb20gbGlzdCB2aWV3LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVxdWVzdEZvY3VzKTsKKyAgICAgICAgbUxpc3QgPSBudWxsOworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhbiBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLiBTdWJjbGFzc2VzIGNhbiBjYWxsCisgICAgICogZ2V0TGlzdFZpZXcoKS5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbikgaWYgdGhleSBuZWVkIHRvIGFjY2VzcyB0aGUKKyAgICAgKiBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsIFRoZSBMaXN0VmlldyB3aGVyZSB0aGUgY2xpY2sgaGFwcGVuZWQKKyAgICAgKiBAcGFyYW0gdiBUaGUgdmlldyB0aGF0IHdhcyBjbGlja2VkIHdpdGhpbiB0aGUgTGlzdFZpZXcKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSB2aWV3IGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGlkIFRoZSByb3cgaWQgb2YgdGhlIGl0ZW0gdGhhdCB3YXMgY2xpY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGhlIGN1cnNvciBmb3IgdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGJvb2xlYW4gaGFkQWRhcHRlciA9IG1BZGFwdGVyICE9IG51bGw7CisgICAgICAgIG1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgaWYgKG1MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgICAgICBpZiAoIW1MaXN0U2hvd24gJiYgIWhhZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdCB3YXMgaGlkZGVuLCBhbmQgcHJldmlvdXNseSBkaWRuJ3QgaGF2ZSBhbgorICAgICAgICAgICAgICAgIC8vIGFkYXB0ZXIuICBJdCBpcyBub3cgdGltZSB0byBzaG93IGl0LgorICAgICAgICAgICAgICAgIHNldExpc3RTaG93bih0cnVlLCBnZXRWaWV3KCkuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogcG9zaXRpb24gd2l0aCB0aGUgYWRhcHRlcidzIGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICBtTGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnNvciByb3cgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaXN0IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0U2VsZWN0ZWRJdGVtSWQoKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhY3Rpdml0eSdzIGxpc3QgdmlldyB3aWRnZXQuCisgICAgICovCisgICAgcHVibGljIExpc3RWaWV3IGdldExpc3RWaWV3KCkgeworICAgICAgICBlbnN1cmVMaXN0KCk7CisgICAgICAgIHJldHVybiBtTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjb250ZW50IGZvciBhIExpc3RGcmFnbWVudCBoYXMgYSBUZXh0VmlldyB0aGF0IGNhbgorICAgICAqIGJlIHNob3duIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuICBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGl0CisgICAgICogc2hvd24sIGNhbGwgdGhpcyBtZXRob2QgdG8gc3VwcGx5IHRoZSB0ZXh0IGl0IHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1wdHlUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgaWYgKG1TdGFuZGFyZEVtcHR5VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBiZSB1c2VkIHdpdGggYSBjdXN0b20gY29udGVudCB2aWV3Iik7CisgICAgICAgIH0KKyAgICAgICAgbVN0YW5kYXJkRW1wdHlWaWV3LnNldFRleHQodGV4dCk7CisgICAgICAgIGlmICghbVNldEVtcHR5VGV4dCkgeworICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7CisgICAgICAgICAgICBtU2V0RW1wdHlUZXh0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250cm9sIHdoZXRoZXIgdGhlIGxpc3QgaXMgYmVpbmcgZGlzcGxheWVkLiAgWW91IGNhbiBtYWtlIGl0IG5vdAorICAgICAqIGRpc3BsYXllZCBpZiB5b3UgYXJlIHdhaXRpbmcgZm9yIHRoZSBpbml0aWFsIGRhdGEgdG8gc2hvdyBpbiBpdC4gIER1cmluZworICAgICAqIHRoaXMgdGltZSBhbiBpbmRldGVybWluYW50IHByb2dyZXNzIGluZGljYXRvciB3aWxsIGJlIHNob3duIGluc3RlYWQuCisgICAgICogCisgICAgICogPHA+QXBwbGljYXRpb25zIGRvIG5vdCBub3JtYWxseSBuZWVkIHRvIHVzZSB0aGlzIHRoZW1zZWx2ZXMuICBUaGUgZGVmYXVsdAorICAgICAqIGJlaGF2aW9yIG9mIExpc3RGcmFnbWVudCBpcyB0byBzdGFydCB3aXRoIHRoZSBsaXN0IG5vdCBiZWluZyBzaG93biwgb25seQorICAgICAqIHNob3dpbmcgaXQgb25jZSBhbiBhZGFwdGVyIGlzIGdpdmVuIHdpdGgge0BsaW5rICNzZXRMaXN0QWRhcHRlcihMaXN0QWRhcHRlcil9LgorICAgICAqIElmIHRoZSBsaXN0IGF0IHRoYXQgcG9pbnQgaGFkIG5vdCBiZWVuIHNob3duLCB3aGVuIGl0IGRvZXMgZ2V0IHNob3duCisgICAgICogaXQgd2lsbCBiZSBkbyB3aXRob3V0IHRoZSB1c2VyIGV2ZXIgc2VlaW5nIHRoZSBoaWRkZW4gc3RhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIHNob3duIElmIHRydWUsIHRoZSBsaXN0IHZpZXcgaXMgc2hvd247IGlmIGZhbHNlLCB0aGUgcHJvZ3Jlc3MKKyAgICAgKiBpbmRpY2F0b3IuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RTaG93bihib29sZWFuIHNob3duKSB7CisgICAgICAgIHNldExpc3RTaG93bihzaG93biwgdHJ1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNzZXRMaXN0U2hvd24oYm9vbGVhbil9LCBidXQgbm8gYW5pbWF0aW9uIGlzIHVzZWQgd2hlbgorICAgICAqIHRyYW5zaXRpb25pbmcgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGlzdFNob3duTm9BbmltYXRpb24oYm9vbGVhbiBzaG93bikgeworICAgICAgICBzZXRMaXN0U2hvd24oc2hvd24sIGZhbHNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udHJvbCB3aGV0aGVyIHRoZSBsaXN0IGlzIGJlaW5nIGRpc3BsYXllZC4gIFlvdSBjYW4gbWFrZSBpdCBub3QKKyAgICAgKiBkaXNwbGF5ZWQgaWYgeW91IGFyZSB3YWl0aW5nIGZvciB0aGUgaW5pdGlhbCBkYXRhIHRvIHNob3cgaW4gaXQuICBEdXJpbmcKKyAgICAgKiB0aGlzIHRpbWUgYW4gaW5kZXRlcm1pbmFudCBwcm9ncmVzcyBpbmRpY2F0b3Igd2lsbCBiZSBzaG93biBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzaG93biBJZiB0cnVlLCB0aGUgbGlzdCB2aWV3IGlzIHNob3duOyBpZiBmYWxzZSwgdGhlIHByb2dyZXNzCisgICAgICogaW5kaWNhdG9yLiAgVGhlIGluaXRpYWwgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKiBAcGFyYW0gYW5pbWF0ZSBJZiB0cnVlLCBhbiBhbmltYXRpb24gd2lsbCBiZSB1c2VkIHRvIHRyYW5zaXRpb24gdG8gdGhlCisgICAgICogbmV3IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRMaXN0U2hvd24oYm9vbGVhbiBzaG93biwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIGVuc3VyZUxpc3QoKTsKKyAgICAgICAgaWYgKG1Qcm9ncmVzc0NvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW4ndCBiZSB1c2VkIHdpdGggYSBjdXN0b20gY29udGVudCB2aWV3Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MaXN0U2hvd24gPT0gc2hvd24pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdFNob3duID0gc2hvd247CisgICAgICAgIGlmIChzaG93bikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfb3V0KSk7CisgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0ZSkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9pbikpOworICAgICAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnN0YXJ0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpLCBhbmRyb2lkLlIuYW5pbS5mYWRlX291dCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1MaXN0Q29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIExpc3RBZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGl2aXR5J3MgTGlzdFZpZXcuCisgICAgICovCisgICAgcHVibGljIExpc3RBZGFwdGVyIGdldExpc3RBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxpc3QoKSB7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlldyByb290ID0gZ2V0VmlldygpOworICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250ZW50IHZpZXcgbm90IHlldCBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBMaXN0VmlldykgeworICAgICAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcm9vdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGFuZGFyZEVtcHR5VmlldyA9IChUZXh0Vmlldylyb290LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbnRlcm5hbEVtcHR5KTsKKyAgICAgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1FbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyID0gcm9vdC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcm9ncmVzc0NvbnRhaW5lcik7CisgICAgICAgICAgICBtTGlzdENvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdENvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IHJhd0xpc3RWaWV3ID0gcm9vdC5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmxpc3QpOworICAgICAgICAgICAgaWYgKCEocmF3TGlzdFZpZXcgaW5zdGFuY2VvZiBMaXN0VmlldykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IGhhcyB2aWV3IHdpdGggaWQgYXR0cmlidXRlICdhbmRyb2lkLlIuaWQubGlzdCcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgYSBMaXN0VmlldyBjbGFzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpcmF3TGlzdFZpZXc7CisgICAgICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIllvdXIgY29udGVudCBtdXN0IGhhdmUgYSBMaXN0VmlldyB3aG9zZSBpZCBhdHRyaWJ1dGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FbXB0eVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtRW1wdHlWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTGlzdFNob3duID0gdHJ1ZTsKKyAgICAgICAgbUxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBzdGFydGluZyB3aXRob3V0IGFuIGFkYXB0ZXIsIHNvIGFzc3VtZSB3ZSB3b24ndAorICAgICAgICAgICAgLy8gaGF2ZSBvdXIgZGF0YSByaWdodCBhd2F5IGFuZCBzdGFydCB3aXRoIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuCisgICAgICAgICAgICBpZiAobVByb2dyZXNzQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRMaXN0U2hvd24oZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5wb3N0KG1SZXF1ZXN0Rm9jdXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWJjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CisKKy8qKgorICogSW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCBhbiB7QGxpbmsgQWN0aXZpdHl9IG9yIHtAbGluayBGcmFnbWVudH0gZm9yIG1hbmFnaW5nCisgKiBvbmUgb3IgbW9yZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkxvYWRlcn0gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworcHVibGljIGludGVyZmFjZSBMb2FkZXJNYW5hZ2VyIHsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGEgY2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBMb2FkZXJDYWxsYmFja3M8RD4geworICAgICAgICAvKioKKyAgICAgICAgICogSW5zdGFudGlhdGUgYW5kIHJldHVybiBhIG5ldyBMb2FkZXIgZm9yIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGlkIFRoZSBJRCB3aG9zZSBsb2FkZXIgaXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgQW55IGFyZ3VtZW50cyBzdXBwbGllZCBieSB0aGUgY2FsbGVyLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybiBhIG5ldyBMb2FkZXIgaW5zdGFuY2UgdGhhdCBpcyByZWFkeSB0byBzdGFydCBsb2FkaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBvbkNyZWF0ZUxvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9hZGVyIGhhcyBmaW5pc2hlZCBpdHMgbG9hZC4KKyAgICAgICAgICogQHBhcmFtIGxvYWRlciBUaGUgTG9hZGVyIHRoYXQgaGFzIGZpbmlzaGVkLgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBnZW5lcmF0ZWQgYnkgdGhlIExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEVuc3VyZXMgYSBsb2FkZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIGFjdGl2ZS4gIElmIHRoZSBsb2FkZXIgZG9lc24ndAorICAgICAqIGFscmVhZHkgZXhpc3QsIG9uZSBpcyBjcmVhdGVkIGFuZCAoaWYgdGhlIGFjdGl2aXR5L2ZyYWdtZW50IGlzIGN1cnJlbnRseQorICAgICAqIHN0YXJ0ZWQpIHN0YXJ0cyB0aGUgbG9hZGVyLiAgT3RoZXJ3aXNlIHRoZSBsYXN0IGNyZWF0ZWQKKyAgICAgKiBsb2FkZXIgaXMgcmUtdXNlZC4KKyAgICAgKgorICAgICAqIDxwPkluIGVpdGhlciBjYXNlLCB0aGUgZ2l2ZW4gY2FsbGJhY2sgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2FkZXIsIGFuZAorICAgICAqIHdpbGwgYmUgY2FsbGVkIGFzIHRoZSBsb2FkZXIgc3RhdGUgY2hhbmdlcy4gIElmIGF0IHRoZSBwb2ludCBvZiBjYWxsCisgICAgICogdGhlIGNhbGxlciBpcyBpbiBpdHMgc3RhcnRlZCBzdGF0ZSwgYW5kIHRoZSByZXF1ZXN0ZWQgbG9hZGVyCisgICAgICogYWxyZWFkeSBleGlzdHMgYW5kIGhhcyBnZW5lcmF0ZWQgaXRzIGRhdGEsIHRoZW4KKyAgICAgKiBjYWxsYmFjay4ge0BsaW5rIExvYWRlckNhbGxiYWNrcyNvbkxvYWRGaW5pc2hlZH0gd2lsbAorICAgICAqIGJlIGNhbGxlZCBpbW1lZGlhdGVseSAoaW5zaWRlIG9mIHRoaXMgZnVuY3Rpb24pLCBzbyB5b3UgbXVzdCBiZSBwcmVwYXJlZAorICAgICAqIGZvciB0aGlzIHRvIGhhcHBlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBpbml0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGxvYWRlciBpbiB0aGlzIG1hbmFnZXIsIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIHRvIGl0LAorICAgICAqIGFuZCAoaWYgdGhlIGFjdGl2aXR5L2ZyYWdtZW50IGlzIGN1cnJlbnRseSBzdGFydGVkKSBzdGFydHMgbG9hZGluZyBpdC4KKyAgICAgKiBJZiBhIGxvYWRlciB3aXRoIHRoZSBzYW1lIGlkIGhhcyBwcmV2aW91c2x5IGJlZW4KKyAgICAgKiBzdGFydGVkIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgbmV3IGxvYWRlciBjb21wbGV0ZXMKKyAgICAgKiBpdHMgd29yay4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgb2xkIGxvYWRlcgorICAgICAqIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiByZXN0YXJ0TG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbmQgcmVtb3ZlcyB0aGUgbG9hZGVyIHdpdGggdGhlIGdpdmVuIElELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkZXIoaW50IGlkKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9hZGVyIHdpdGggdGhlIGdpdmVuIGlkIG9yIG51bGwgaWYgbm8gbWF0Y2hpbmcgTG9hZGVyCisgICAgICogaXMgZm91bmQuCisgICAgICovCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gZ2V0TG9hZGVyKGludCBpZCk7Cit9CisKK2NsYXNzIExvYWRlck1hbmFnZXJJbXBsIGltcGxlbWVudHMgTG9hZGVyTWFuYWdlciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTG9hZGVyTWFuYWdlckltcGwiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgIC8vIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBsb2FkZXJzLiAgQSBsb2FkZXIgaXMgaGVyZQorICAgIC8vIGZyb20gdGhlIHRpbWUgaXRzIGxvYWQgaXMgc3RhcnRlZCB1bnRpbCBpdCBoYXMgYmVlbiBleHBsaWNpdGx5CisgICAgLy8gc3RvcHBlZCBvciByZXN0YXJ0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIGZpbmFsIFNwYXJzZUFycmF5PExvYWRlckluZm8+IG1Mb2FkZXJzID0gbmV3IFNwYXJzZUFycmF5PExvYWRlckluZm8+KCk7CisKKyAgICAvLyBUaGVzZSBhcmUgcHJldmlvdXNseSBydW4gbG9hZGVycy4gIFRoaXMgbGlzdCBpcyBtYWludGFpbmVkIGludGVybmFsbHkKKyAgICAvLyB0byBhdm9pZCBkZXN0cm95aW5nIGEgbG9hZGVyIHdoaWxlIGFuIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHVzaW5nIGl0LgorICAgIC8vIEl0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZXN0YXJ0IGEgbG9hZGVyLCBidXQgY29udGludWUgdXNpbmcgaXRzCisgICAgLy8gcHJldmlvdXNseSBydW4gbG9hZGVyIHVudGlsIHRoZSBuZXcgbG9hZGVyJ3MgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgZmluYWwgU3BhcnNlQXJyYXk8TG9hZGVySW5mbz4gbUluYWN0aXZlTG9hZGVycyA9IG5ldyBTcGFyc2VBcnJheTxMb2FkZXJJbmZvPigpOworCisgICAgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICBib29sZWFuIG1SZXRhaW5pbmc7CisgICAgYm9vbGVhbiBtUmV0YWluaW5nU3RhcnRlZDsKKworICAgIGZpbmFsIGNsYXNzIExvYWRlckluZm8gaW1wbGVtZW50cyBMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxPYmplY3Q+IHsKKyAgICAgICAgZmluYWwgaW50IG1JZDsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1BcmdzOworICAgICAgICBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+IG1DYWxsYmFja3M7CisgICAgICAgIExvYWRlcjxPYmplY3Q+IG1Mb2FkZXI7CisgICAgICAgIE9iamVjdCBtRGF0YTsKKyAgICAgICAgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICAgICAgYm9vbGVhbiBtUmV0YWluaW5nOworICAgICAgICBib29sZWFuIG1SZXRhaW5pbmdTdGFydGVkOworICAgICAgICBib29sZWFuIG1EZXN0cm95ZWQ7CisgICAgICAgIGJvb2xlYW4gbUxpc3RlbmVyUmVnaXN0ZXJlZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBMb2FkZXJJbmZvKGludCBpZCwgQnVuZGxlIGFyZ3MsIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gY2FsbGJhY2tzKSB7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgICAgIG1BcmdzID0gYXJnczsKKyAgICAgICAgICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBpZiAobVJldGFpbmluZyAmJiBtUmV0YWluaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIE91ciBvd25lciBpcyBzdGFydGVkLCBidXQgd2Ugd2VyZSBiZWluZyByZXRhaW5lZCBmcm9tIGEKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBpbnN0YW5jZSBpbiB0aGUgc3RhcnRlZCBzdGF0ZS4uLiAgc28gdGhlcmUgaXMgcmVhbGx5CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBzaW5jZSB0aGUgbG9hZGVycyBhcmUgc3RpbGwgc3RhcnRlZC4KKyAgICAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBsb2FkZXIgYWxyZWFkeSBzdGFydGVkLCBkb24ndCByZXN0YXJ0LgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFN0YXJ0aW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBpZiAobUxvYWRlciA9PSBudWxsICYmIG1DYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgbUxvYWRlciA9IG1DYWxsYmFja3Mub25DcmVhdGVMb2FkZXIobUlkLCBtQXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtTGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcihtSWQsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgcmV0YWluKCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFJldGFpbmluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbVJldGFpbmluZyA9IHRydWU7CisgICAgICAgICAgICBtUmV0YWluaW5nU3RhcnRlZCA9IG1TdGFydGVkOworICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MgPSBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGZpbmlzaFJldGFpbigpIHsKKyAgICAgICAgICAgIGlmIChtUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIEZpbmlzaGVkIFJldGFpbmluZzogIiArIHRoaXMpOworICAgICAgICAgICAgICAgIG1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgIT0gbVJldGFpbmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2FkZXIgd2FzIHJldGFpbmVkIGluIGEgc3RhcnRlZCBzdGF0ZSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHJldGFpbmluZyBldmVyeXRoaW5nIG91ciBvd25lciBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbG9uZ2VyIHN0YXJ0ZWQuLi4gIHNvIG1ha2UgaXQgc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgbURhdGEgIT0gbnVsbCAmJiBtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsb2FkZXIgd2FzIHJldGFpbmVkLCBhbmQgbm93IGF0IHRoZSBwb2ludCBvZgorICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hpbmcgdGhlIHJldGFpbiB3ZSBmaW5kIHdlIHJlbWFpbiBzdGFydGVkLCBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIG91ciBkYXRhLCBhbmQgdGhlIG93bmVyIGhhcyBhIG5ldyBjYWxsYmFjay4uLiAgc28KKyAgICAgICAgICAgICAgICAgICAgLy8gbGV0J3MgZGVsaXZlciB0aGUgZGF0YSBub3cuCisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3Mub25Mb2FkRmluaXNoZWQobUxvYWRlciwgbURhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFN0b3BwaW5nOiAiICsgdGhpcyk7CisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb2FkZXIgIT0gbnVsbCAmJiBtTGlzdGVuZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgbG9hZGVyIGtub3cgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIuc3RvcExvYWRpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURhdGEgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIiAgRGVzdHJveWluZzogIiArIHRoaXMpOworICAgICAgICAgICAgbURlc3Ryb3llZCA9IHRydWU7CisgICAgICAgICAgICBtQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1Mb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxPYmplY3Q+IGxvYWRlciwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAib25Mb2FkQ29tcGxldGU6ICIgKyB0aGlzICsgIiBtRGVzdHJveWVkPSIgKyBtRGVzdHJveWVkKTsKKworICAgICAgICAgICAgaWYgKG1EZXN0cm95ZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdGlmeSBvZiB0aGUgbmV3IGRhdGEgc28gdGhlIGFwcCBjYW4gc3dpdGNoIG91dCB0aGUgb2xkIGRhdGEgYmVmb3JlCisgICAgICAgICAgICAvLyB3ZSB0cnkgdG8gZGVzdHJveSBpdC4KKyAgICAgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKGxvYWRlciwgZGF0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAib25Mb2FkRmluaXNoZWQgcmV0dXJuZWQ6ICIgKyB0aGlzKTsKKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgZ2l2ZW4gdGhlIGFwcGxpY2F0aW9uIHRoZSBuZXcgbG9hZGVyIHdpdGggaXRzCisgICAgICAgICAgICAvLyBsb2FkZWQgZGF0YSwgc28gaXQgc2hvdWxkIGhhdmUgc3RvcHBlZCB1c2luZyB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIGxvYWRlci4gIElmIHRoZXJlIGlzIGEgcHJldmlvdXMgbG9hZGVyIG9uIHRoZSBpbmFjdGl2ZSBsaXN0LAorICAgICAgICAgICAgLy8gY2xlYW4gaXQgdXAuCisgICAgICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtSW5hY3RpdmVMb2FkZXJzLmdldChtSWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpbmZvLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoNjQpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJMb2FkZXJJbmZveyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICMiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtSWQpOworICAgICAgICAgICAgaWYgKG1BcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobUFyZ3MudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIExvYWRlck1hbmFnZXJJbXBsKGJvb2xlYW4gc3RhcnRlZCkgeworICAgICAgICBtU3RhcnRlZCA9IHN0YXJ0ZWQ7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgTG9hZGVySW5mbyBjcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4gY2FsbGJhY2spIHsKKyAgICAgICAgTG9hZGVySW5mbyBpbmZvID0gbmV3IExvYWRlckluZm8oaWQsIGFyZ3MsICAoTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8T2JqZWN0PiljYWxsYmFjayk7CisgICAgICAgIG1Mb2FkZXJzLnB1dChpZCwgaW5mbyk7CisgICAgICAgIExvYWRlcjxPYmplY3Q+IGxvYWRlciA9IGNhbGxiYWNrLm9uQ3JlYXRlTG9hZGVyKGlkLCBhcmdzKTsKKyAgICAgICAgaW5mby5tTG9hZGVyID0gKExvYWRlcjxPYmplY3Q+KWxvYWRlcjsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBUaGUgYWN0aXZpdHkgd2lsbCBzdGFydCBhbGwgZXhpc3RpbmcgbG9hZGVycyBpbiBpdCdzIG9uU3RhcnQoKSwKKyAgICAgICAgICAgIC8vIHNvIG9ubHkgc3RhcnQgdGhlbSBoZXJlIGlmIHdlJ3JlIHBhc3QgdGhhdCBwb2ludCBvZiB0aGUgYWN0aXZpdGl5J3MKKyAgICAgICAgICAgIC8vIGxpZmUgY3ljbGUKKyAgICAgICAgICAgIGluZm8uc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gaW5pdExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICAKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJpbml0TG9hZGVyIGluICIgKyB0aGlzICsgIjogY3VyPSIgKyBpbmZvKTsKKworICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBMb2FkZXIgZG9lc24ndCBhbHJlYWR5IGV4aXN0OyBjcmVhdGUuCisgICAgICAgICAgICBpbmZvID0gY3JlYXRlTG9hZGVyKGlkLCBhcmdzLCAgKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzID0gKExvYWRlck1hbmFnZXIuTG9hZGVyQ2FsbGJhY2tzPE9iamVjdD4pY2FsbGJhY2s7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLm1EYXRhICE9IG51bGwgJiYgbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBsb2FkZXIgaGFzIGFscmVhZHkgZ2VuZXJhdGVkIGl0cyBkYXRhLCByZXBvcnQgaXQgbm93LgorICAgICAgICAgICAgaW5mby5tQ2FsbGJhY2tzLm9uTG9hZEZpbmlzaGVkKGluZm8ubUxvYWRlciwgaW5mby5tRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KWluZm8ubUxvYWRlcjsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxEPiBMb2FkZXI8RD4gcmVzdGFydExvYWRlcihpbnQgaWQsIEJ1bmRsZSBhcmdzLCBMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxEPiBjYWxsYmFjaykgeworICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy5nZXQoaWQpOworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInJlc3RhcnRMb2FkZXIgaW4gIiArIHRoaXMgKyAiOiBjdXI9IiArIGluZm8pOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvIGluYWN0aXZlID0gbUluYWN0aXZlTG9hZGVycy5nZXQoaWQpOworICAgICAgICAgICAgaWYgKGluYWN0aXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5tRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIG5vdyBoYXMgZGF0YS4uLiAgd2UgYXJlIHByb2JhYmx5IGJlaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIHdpdGhpbiBvbkxvYWRDb21wbGV0ZSwgd2hlcmUgd2UgaGF2ZW4ndAorICAgICAgICAgICAgICAgICAgICAvLyB5ZXQgZGVzdHJveWVkIHRoZSBsYXN0IGluYWN0aXZlIGxvYWRlci4gIFNvIGp1c3QgZG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBub3cuCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBSZW1vdmluZyBsYXN0IGluYWN0aXZlIGxvYWRlciBpbiAiICsgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGluYWN0aXZlLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbUluYWN0aXZlTG9hZGVycy5wdXQoaWQsIGluZm8pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBpbmFjdGl2ZSBsb2FkZXIgZm9yIHRoaXMgSUQgdGhhdCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IhICBOb3cgd2UgaGF2ZSB0aHJlZSBhY3RpdmUgbG9hZGVycy4uLiBsZXQncyBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhlIG9uZSBpbiB0aGUgbWlkZGxlLCBzaW5jZSB3ZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gaXRzIHJlc3VsdCBidXQgdGhhdCByZXN1bHQgaXMgYWxyZWFkeSBvdXQgb2YgZGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIFJlbW92aW5nIGludGVybWVkaWF0ZSBsb2FkZXIgaW4gIiArIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBpbmZvLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoaXMgbG9hZGVyIHNvIHdlIGNhbiBkZXN0cm95CisgICAgICAgICAgICAgICAgLy8gaXQgd2hlbiB0aGUgbmV3IG9uZSBjb21wbGV0ZXMuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICIgIE1ha2luZyBpbmFjdGl2ZTogIiArIGluZm8pOworICAgICAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5mbyA9IGNyZWF0ZUxvYWRlcihpZCwgYXJncywgIChMb2FkZXJNYW5hZ2VyLkxvYWRlckNhbGxiYWNrczxPYmplY3Q+KWNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIChMb2FkZXI8RD4paW5mby5tTG9hZGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9wTG9hZGVyKGludCBpZCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInN0b3BMb2FkZXIgaW4gIiArIHRoaXMgKyAiIG9mICIgKyBpZCk7CisgICAgICAgIGludCBpZHggPSBtTG9hZGVycy5pbmRleE9mS2V5KGlkKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvIGluZm8gPSBtTG9hZGVycy52YWx1ZUF0KGlkeCk7CisgICAgICAgICAgICBtTG9hZGVycy5yZW1vdmVBdChpZHgpOworICAgICAgICAgICAgaW5mby5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPEQ+IExvYWRlcjxEPiBnZXRMb2FkZXIoaW50IGlkKSB7CisgICAgICAgIExvYWRlckluZm8gbG9hZGVySW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChsb2FkZXJJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoTG9hZGVyPEQ+KW1Mb2FkZXJzLmdldChpZCkubUxvYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgCisgICAgdm9pZCBkb1N0YXJ0KCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0YXJ0aW5nOiAiICsgdGhpcyk7CisKKyAgICAgICAgLy8gQ2FsbCBvdXQgdG8gc3ViIGNsYXNzZXMgc28gdGhleSBjYW4gc3RhcnQgdGhlaXIgbG9hZGVycworICAgICAgICAvLyBMZXQgdGhlIGV4aXN0aW5nIGxvYWRlcnMga25vdyB0aGF0IHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIGxvYWQgaXMgY29tcGxldGUKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb1N0b3AoKSB7CisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiU3RvcHBpbmc6ICIgKyB0aGlzKTsKKworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGRvUmV0YWluKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJldGFpbmluZzogIiArIHRoaXMpOworCisgICAgICAgIG1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnJldGFpbigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgZmluaXNoUmV0YWluKCkgeworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkZpbmlzaGVkIFJldGFpbmluZzogIiArIHRoaXMpOworCisgICAgICAgIG1SZXRhaW5pbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1Mb2FkZXJzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5maW5pc2hSZXRhaW4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGRvRGVzdHJveSgpIHsKKyAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgQWN0aXZlOiAiICsgdGhpcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbUxvYWRlcnMudmFsdWVBdChpKS5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiRGVzdHJveWluZyBJbmFjdGl2ZTogIiArIHRoaXMpOworICAgICAgICBmb3IgKGludCBpID0gbUluYWN0aXZlTG9hZGVycy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMudmFsdWVBdChpKS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICAgICAgbUluYWN0aXZlTG9hZGVycy5jbGVhcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2luZ0ZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDE3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdpbmdGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Mb2FkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBBIEZyYWdtZW50IHRoYXQgaGFzIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFuYWdpbmcge0BsaW5rIExvYWRlcn1zLgorICoKKyAqIEBwYXJhbSA8RD4gVGhlIHR5cGUgb2YgZGF0YSByZXR1cm5lZCBieSB0aGUgTG9hZGVyLiBJZiB5b3UncmUgdXNpbmcgbXVsdGlwbGUgTG9hZGVycyB3aXRoCisgKiBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzIHVzZSBPYmplY3QgYW5kIGNhc2UgdGhlIHJlc3VsdHMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkZXJNYW5hZ2luZ0ZyYWdtZW50PEQ+IGV4dGVuZHMgRnJhZ21lbnQKKyAgICAgICAgaW1wbGVtZW50cyBMb2FkZXIuT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiB7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgTG9hZGVySW5mbzxEPiB7CisgICAgICAgIHB1YmxpYyBCdW5kbGUgYXJnczsKKyAgICAgICAgcHVibGljIExvYWRlcjxEPiBsb2FkZXI7CisgICAgfQorICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBtTG9hZGVyczsKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZWdlciwgTG9hZGVySW5mbzxEPj4gbUluYWN0aXZlTG9hZGVyczsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGxvYWRlciB3aXRoIHRoaXMgYWN0aXZpdHksIHJlZ2lzdGVycyB0aGUgY2FsbGJhY2tzIG9uIGl0LCBhbmQgc3RhcnRzIGl0IGxvYWRpbmcuCisgICAgICogSWYgYSBsb2FkZXIgd2l0aCB0aGUgc2FtZSBpZCBoYXMgcHJldmlvdXNseSBiZWVuIHN0YXJ0ZWQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlc3Ryb3llZAorICAgICAqIHdoZW4gdGhlIG5ldyBsb2FkZXIgY29tcGxldGVzIGl0J3Mgd29yay4gVGhlIGNhbGxiYWNrIHdpbGwgYmUgZGVsaXZlcmVkIGJlZm9yZSB0aGUgb2xkIGxvYWRlcgorICAgICAqIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IHN0YXJ0TG9hZGluZyhpbnQgaWQsIEJ1bmRsZSBhcmdzKSB7CisgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IG1Mb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoaXMgbG9hZGVyIHNvIHdlIGNhbiBkZXN0cm95CisgICAgICAgICAgICAvLyBpdCB3aGVuIHRoZSBuZXcgb25lIGNvbXBsZXRlcy4KKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvID0gbmV3IExvYWRlckluZm88RD4oKTsKKyAgICAgICAgaW5mby5hcmdzID0gYXJnczsKKyAgICAgICAgbUxvYWRlcnMucHV0KGlkLCBpbmZvKTsKKyAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IG9uQ3JlYXRlTG9hZGVyKGlkLCBhcmdzKTsKKyAgICAgICAgaW5mby5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gVGhlIGFjdGl2aXR5IHdpbGwgc3RhcnQgYWxsIGV4aXN0aW5nIGxvYWRlcnMgaW4gaXQncyBvblN0YXJ0KCksIHNvIG9ubHkgc3RhcnQgdGhlbQorICAgICAgICAgICAgLy8gaGVyZSBpZiB3ZSdyZSBwYXN0IHRoYXQgcG9pbnQgb2YgdGhlIGFjdGl2aXRpeSdzIGxpZmUgY3ljbGUKKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9hZGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMb2FkZXI8RD4gb25DcmVhdGVMb2FkZXIoaW50IGlkLCBCdW5kbGUgYXJncyk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTG9hZEZpbmlzaGVkKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBvbkxvYWRDb21wbGV0ZShMb2FkZXI8RD4gbG9hZGVyLCBEIGRhdGEpIHsKKyAgICAgICAgLy8gTm90aWZ5IG9mIHRoZSBuZXcgZGF0YSBzbyB0aGUgYXBwIGNhbiBzd2l0Y2ggb3V0IHRoZSBvbGQgZGF0YSBiZWZvcmUKKyAgICAgICAgLy8gd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuCisgICAgICAgIG9uTG9hZEZpbmlzaGVkKGxvYWRlciwgZGF0YSk7CisKKyAgICAgICAgLy8gTG9vayBmb3IgYW4gaW5hY3RpdmUgbG9hZGVyIGFuZCBkZXN0cm95IGl0IGlmIGZvdW5kCisgICAgICAgIGludCBpZCA9IGxvYWRlci5nZXRJZCgpOworICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtSW5hY3RpdmVMb2FkZXJzLmdldChpZCk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvYWRlcjxEPiBvbGRMb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgIGlmIChvbGRMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9sZExvYWRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5hY3RpdmVMb2FkZXJzLnJlbW92ZShpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZFN0YXRlKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwYXNzZWQgYWxvbmcgbG9hZGVyIGFuZCBjcmVhdGUgYSBuZXcgb25lIGlmIGl0J3Mgbm90IHRoZXJlCisvLyBUT0RPOiB1bmNvbW1lbnQgb25jZSBnZXRMYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlIG1ldGhvZCBpcyBhdmFpbGFibGUKKy8vICAgICAgICAgICAgbUxvYWRlcnMgPSAoSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPikgZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSgpOworICAgICAgICAgICAgaWYgKG1Mb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTG9hZGVycyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWRlckluZm88RD4+KCk7CisgICAgICAgICAgICAgICAgb25Jbml0aWFsaXplTG9hZGVycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtSW5hY3RpdmVMb2FkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1JbmFjdGl2ZUxvYWRlcnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworCisgICAgICAgIC8vIENhbGwgb3V0IHRvIHN1YiBjbGFzc2VzIHNvIHRoZXkgY2FuIHN0YXJ0IHRoZWlyIGxvYWRlcnMKKyAgICAgICAgLy8gTGV0IHRoZSBleGlzdGluZyBsb2FkZXJzIGtub3cgdGhhdCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBsb2FkIGlzIGNvbXBsZXRlCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpbnQgaWQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgbG9hZGVyID0gb25DcmVhdGVMb2FkZXIoaWQsIGluZm8uYXJncyk7CisgICAgICAgICAgICAgICBpbmZvLmxvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvYWRlci5yZWdpc3Rlckxpc3RlbmVyKGlkLCB0aGlzKTsKKyAgICAgICAgICAgIGxvYWRlci5zdGFydExvYWRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworCisgICAgICAgIGZvciAoSGFzaE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2FkZXJJbmZvPEQ+PiBlbnRyeSA6IG1Mb2FkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBMb2FkZXI8RD4gbG9hZGVyID0gaW5mby5sb2FkZXI7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTGV0IHRoZSBsb2FkZXIga25vdyB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgIGxvYWRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgICAgIC8vIFRoZSBsb2FkZXIgaXNuJ3QgZ2V0dGluZyBwYXNzZWQgYWxvbmcgdG8gdGhlIG5leHQgaW5zdGFuY2Ugc28gYXNrIGl0IHRvIHN0b3AgbG9hZGluZworICAgICAgICAgICAgaWYgKCFnZXRBY3Rpdml0eSgpLmlzQ2hhbmdpbmdDb25maWd1cmF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0b3BMb2FkaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKiBUTyBETzogVGhpcyBuZWVkcyB0byBiZSB0dXJuZWQgaW50byBhIHJldGFpbmVkIGZyYWdtZW50LgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3Qgb25SZXRhaW5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2UoKSB7CisgICAgICAgIC8vIFBhc3MgdGhlIGxvYWRlciBhbG9uZyB0byB0aGUgbmV4dCBndXkKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1Mb2FkZXJzOworICAgICAgICBtTG9hZGVycyA9IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICoqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICBpZiAobUxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIYXNoTWFwLkVudHJ5PEludGVnZXIsIExvYWRlckluZm88RD4+IGVudHJ5IDogbUxvYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIExvYWRlckluZm88RD4gaW5mbyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgTG9hZGVyPEQ+IGxvYWRlciA9IGluZm8ubG9hZGVyOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFuZCByZW1vdmVzIHRoZSBsb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoaW50IGlkKSB7CisgICAgICAgIGlmIChtTG9hZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2FkZXJJbmZvPEQ+IGluZm8gPSBtTG9hZGVycy5yZW1vdmUoaWQpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvYWRlcjxEPiBsb2FkZXIgPSBpbmZvLmxvYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgb3IgbnVsbCBpZiBubyBtYXRjaGluZyBMb2FkZXIKKyAgICAgKiBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZGVyPEQ+IGdldExvYWRlcihpbnQgaWQpIHsKKyAgICAgICAgTG9hZGVySW5mbzxEPiBsb2FkZXJJbmZvID0gbUxvYWRlcnMuZ2V0KGlkKTsKKyAgICAgICAgaWYgKGxvYWRlckluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2FkZXJzLmdldChpZCkubG9hZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYTI0ZmNhZS4uNTI0ZGU2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlIHx8IENvbmZpZy5MT0dWOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbG9jYWxMT0dWID0gZmFsc2U7CiAKICAgICAvLyBJbnRlcm5hbCB0b2tlbiBmb3IgYW4gQWN0aXZpdHkgYmVpbmcgbWFuYWdlZCBieSBMb2NhbEFjdGl2aXR5TWFuYWdlci4KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEFjdGl2aXR5UmVjb3JkIGV4dGVuZHMgQmluZGVyIHsKQEAgLTExMiwxMSArMTEwLDE2IEBACiAgICAgICAgIAogICAgICAgICBpZiAoci5jdXJTdGF0ZSA9PSBJTklUSUFMSVpJTkcpIHsKICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdE5vbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSBmb3IgdGhlIGFjdGl2aXR5Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZyxPYmplY3Q+IGxhc3ROb25Db25maWd1cmF0aW9uSW5zdGFuY2VzID0KLSAgICAgICAgICAgICAgICBtUGFyZW50LmdldExhc3ROb25Db25maWd1cmF0aW9uQ2hpbGRJbnN0YW5jZXMoKTsKLSAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnQuZ2V0TGFzdE5vbkNvbmZpZ3VyYXRpb25DaGlsZEluc3RhbmNlcygpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlT2JqID0gbnVsbDsKICAgICAgICAgICAgIGlmIChsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VPYmogPSBsYXN0Tm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcy5nZXQoci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eS5Ob25Db25maWd1cmF0aW9uSW5zdGFuY2VzIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZU9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQWN0aXZpdHkuTm9uQ29uZmlndXJhdGlvbkluc3RhbmNlcygpOworICAgICAgICAgICAgICAgIGluc3RhbmNlLmFjdGl2aXR5ID0gaW5zdGFuY2VPYmo7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBhbHdheXMgY3JlYXRlZCB0aGUgYWN0aXZpdHkuCkBAIC0zNDYsNyArMzQ5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFdpbmRvdyBwZXJmb3JtRGVzdHJveShMb2NhbEFjdGl2aXR5UmVjb3JkIHIsIGJvb2xlYW4gZmluaXNoKSB7Ci0gICAgICAgIFdpbmRvdyB3aW4gPSBudWxsOworICAgICAgICBXaW5kb3cgd2luOwogICAgICAgICB3aW4gPSByLndpbmRvdzsKICAgICAgICAgaWYgKHIuY3VyU3RhdGUgPT0gUkVTVU1FRCAmJiAhZmluaXNoKSB7CiAgICAgICAgICAgICBwZXJmb3JtUGF1c2UociwgZmluaXNoKTsKQEAgLTM4MCw3ICszODMsOCBAQAogICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICB3aW4gPSBwZXJmb3JtRGVzdHJveShyLCBmaW5pc2gpOwogICAgICAgICAgICAgaWYgKGZpbmlzaCkgewotICAgICAgICAgICAgICAgIG1BY3Rpdml0aWVzLnJlbW92ZShyKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZpdGllcy5yZW1vdmUoaWQpOworICAgICAgICAgICAgICAgIG1BY3Rpdml0eUFycmF5LnJlbW92ZShyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gd2luOwpAQCAtNDQxLDEwICs0NDUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoQ3JlYXRlKEJ1bmRsZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpID0gc3RhdGUua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBzdGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXN0YXRlID0gc3RhdGUuZ2V0QnVuZGxlKGlkKTsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxBY3Rpdml0eVJlY29yZCByID0gbUFjdGl2aXRpZXMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgewpAQCAtNDU3LDkgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIGZyb20gLWFsbC0gYXBwIGVycm9ycy4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHRocm93biB3aGVuIHJlc3RvcmluZyBMb2NhbEFjdGl2aXR5TWFuYWdlciBzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdGhyb3duIHdoZW4gcmVzdG9yaW5nIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHN0YXRlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKaW5kZXggODU2OTQzZC4uZGEwMDBlNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQpAQCAtMTE2LDYgKzExNiw5IEBACiAgICAgICogSWYgdGhpcyBmYWNpbGl0eSBpcyB1c2VkIGZvciBzb21ldGhpbmcgZWxzZSwgcGxlYXNlIGdpdmUgdGhlIHVzZXIgYW4gb3B0aW9uCiAgICAgICogdG8gdHVybiBpdCBvZmYgYW5kIHVzZSBhIG5vcm1hbCBub3RpZmljYXRpb24sIGFzIHRoaXMgY2FuIGJlIGV4dHJlbWVseQogICAgICAqIGRpc3J1cHRpdmUuCisgICAgICogCisgICAgICogPHA+VXNlIHdpdGgge0BsaW5rICNGTEFHX0hJR0hfUFJJT1JJVFl9IHRvIGVuc3VyZSB0aGF0IHRoaXMgbm90aWZpY2F0aW9uCisgICAgICogd2lsbCByZWFjaCB0aGUgdXNlciBldmVuIHdoZW4gb3RoZXIgbm90aWZpY2F0aW9ucyBhcmUgc3VwcHJlc3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBmdWxsU2NyZWVuSW50ZW50OwogCkBAIC0yNzUsNiArMjc4LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UgPSAweDAwMDAwMDQwOwogCisgICAgLyoqCisgICAgICogQml0IHRvIGJlIGJpdHdpc2Utb3JlZCBpbnRvIHRoZSB7QGxpbmsgI2ZsYWdzfSBmaWVsZCB0aGF0IHNob3VsZCBiZSBzZXQgaWYgdGhpcyBub3RpZmljYXRpb24KKyAgICAgKiByZXByZXNlbnRzIGEgaGlnaC1wcmlvcml0eSBldmVudCB0aGF0IG1heSBiZSBzaG93biB0byB0aGUgdXNlciBldmVuIGlmIG5vdGlmaWNhdGlvbnMgYXJlCisgICAgICogb3RoZXJ3aXNlIHVuYXZhaWxhYmxlICh0aGF0IGlzLCB3aGVuIHRoZSBzdGF0dXMgYmFyIGlzIGhpZGRlbikuIFRoaXMgZmxhZyBpcyBpZGVhbGx5IHVzZWQKKyAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjZnVsbFNjcmVlbkludGVudH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19ISUdIX1BSSU9SSVRZID0gMHgwMDAwMDA4MDsKKwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKICAgICAvKioKQEAgLTU0Myw2ICs1NTQsOSBAQAogICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmRlZmF1bHRzKSk7CiAgICAgICAgIHNiLmFwcGVuZCgiLGZsYWdzPTB4Iik7CiAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoaXMuZmxhZ3MpKTsKKyAgICAgICAgaWYgKCh0aGlzLmZsYWdzICYgRkxBR19ISUdIX1BSSU9SSVRZKSAhPSAwKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiEhITEhb25lISIpOworICAgICAgICB9CiAgICAgICAgIHNiLmFwcGVuZCgiKSIpOwogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKaW5kZXggMGJjZDY1Yy4uMjIzN2M4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQpAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX1dJUEVfREFUQSA9IDQ7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogYWJsZSB0byBzcGVjaWZ5IHRoZQorICAgICAqIGRldmljZSBHbG9iYWwgUHJveHksIHZpYSB7QGxpbmsgRGV2aWNlUG9saWN5TWFuYWdlciNzZXRHbG9iYWxQcm94eX0uCisgICAgICoKKyAgICAgKiA8cD5UbyBjb250cm9sIHRoaXMgcG9saWN5LCB0aGUgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSBhICJzZXQtZ2xvYmFsLXByb3h5IgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSA9IDU7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTM4LDYgKzE0Nyw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSywgImZvcmNlLWxvY2siLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9mb3JjZUxvY2ssCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucG9saWN5ZGVzY19mb3JjZUxvY2spKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9TRVRTX0dMT0JBTF9QUk9YWSwgInNldC1nbG9iYWwtcHJveHkiLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5KSk7CiAgICAgICAgIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTMyOCw3ICszNDAsNyBAQAogICAgICAqIHRoZSBnaXZlbiBwb2xpY3kgY29udHJvbC4gIFRoZSBwb3NzaWJsZSBwb2xpY3kgaWRlbnRpZmllciBpbnB1dHMgYXJlOgogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKLSAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0uCisgICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9XSVBFX0RBVEF9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggMjk2ZDcwYTQuLjJiN2U0MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlByb3h5OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKQEAgLTQ2LDcgKzQ4LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIGZpbmFsIElEZXZpY2VQb2xpY3lNYW5hZ2VyIG1TZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwogCiAgICAgcHJpdmF0ZSBEZXZpY2VQb2xpY3lNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CkBAIC02MSwxNCArNjMsMTQgQEAKICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtZSA9IG5ldyBEZXZpY2VQb2xpY3lNYW5hZ2VyKGNvbnRleHQsIGhhbmRsZXIpOwogICAgICAgICByZXR1cm4gbWUubVNlcnZpY2UgIT0gbnVsbCA/IG1lIDogbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGFzayB0aGUgdXNlciB0byBhZGQgYSBuZXcgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbS4KICAgICAgKiBUaGUgZGVzaXJlZCBwb2xpY3kgaXMgdGhlIENvbXBvbmVudE5hbWUgb2YgdGhlIHBvbGljeSBpbiB0aGUKICAgICAgKiB7QGxpbmsgI0VYVFJBX0RFVklDRV9BRE1JTn0gZXh0cmEgZmllbGQuICBUaGlzIHdpbGwgaW52b2tlIGEgVUkgdG8KICAgICAgKiBicmluZyB0aGUgdXNlciB0aHJvdWdoIGFkZGluZyB0aGUgZGV2aWNlIGFkbWluaXN0cmF0b3IgdG8gdGhlIHN5c3RlbSAob3IKICAgICAgKiBhbGxvd2luZyB0aGVtIHRvIHJlamVjdCBpdCkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5Zb3UgY2FuIG9wdGlvbmFsbHkgaW5jbHVkZSB0aGUge0BsaW5rICNFWFRSQV9BRERfRVhQTEFOQVRJT059CiAgICAgICogZmllbGQgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIGFkZGl0aW9uCiAgICAgICogdG8geW91ciBjb21wb25lbnQncyBkZXNjcmlwdGlvbikgYWJvdXQgd2hhdCBpcyBiZWluZyBhZGRlZC4KQEAgLTc2LDcgKzc4LDcgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FERF9ERVZJQ0VfQURNSU4KICAgICAgICAgICAgID0gImFuZHJvaWQuYXBwLmFjdGlvbi5BRERfREVWSUNFX0FETUlOIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IGFjdGlvbjogc2VuZCB3aGVuIGFueSBwb2xpY3kgYWRtaW4gY2hhbmdlcyBhIHBvbGljeS4KICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gYSBuZXcgcG9saWN5IGlzIGluIGVmZmVjdC4KQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAc2VlICNBQ1RJT05fQUREX0RFVklDRV9BRE1JTgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0RFVklDRV9BRE1JTiA9ICJhbmRyb2lkLmFwcC5leHRyYS5ERVZJQ0VfQURNSU4iOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQW4gb3B0aW9uYWwgQ2hhclNlcXVlbmNlIHByb3ZpZGluZyBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGZvciB3aHkgdGhlCiAgICAgICogYWRtaW4gaXMgYmVpbmcgYWRkZWQuCkBAIC0xMDAsMjIgKzEwMiwyMSBAQAogICAgICAqIEBzZWUgI0FDVElPTl9BRERfREVWSUNFX0FETUlOCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUREX0VYUExBTkFUSU9OID0gImFuZHJvaWQuYXBwLmV4dHJhLkFERF9FWFBMQU5BVElPTiI7Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBBY3Rpdml0eSBhY3Rpb246IGhhdmUgdGhlIHVzZXIgZW50ZXIgYSBuZXcgcGFzc3dvcmQuICBUaGlzIGFjdGl2aXR5Ci0gICAgICogc2hvdWxkIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9Ci0gICAgICogb3Ige0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSwgaW50KX0gdG8gaGF2ZSB0aGUKLSAgICAgKiB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLiAgWW91IGNhbgotICAgICAqIHVzZSB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkCi0gICAgICogdG8gaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAotICAgICAqIGNvbnN0cmFpbnRzLiAgVXBvbiBiZWluZyByZXN1bWVkIGZyb20gdGhpcyBhY3Rpdml0eSwKLSAgICAgKiB5b3UgY2FuIGNoZWNrIHRoZSBuZXcgcGFzc3dvcmQgY2hhcmFjdGVyaXN0aWNzIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIHN1ZmZpY2llbnQuCisgICAgICogQWN0aXZpdHkgYWN0aW9uOiBoYXZlIHRoZSB1c2VyIGVudGVyIGEgbmV3IHBhc3N3b3JkLiBUaGlzIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGJlIGxhdW5jaGVkIGFmdGVyIHVzaW5nIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5KENvbXBvbmVudE5hbWUsIGludCl9LAorICAgICAqIG9yIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKENvbXBvbmVudE5hbWUsIGludCl9IHRvIGhhdmUgdGhlIHVzZXIKKyAgICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IG1lZXRzIHRoZSBjdXJyZW50IHJlcXVpcmVtZW50cy4gWW91IGNhbiB1c2UKKyAgICAgKiB7QGxpbmsgI2lzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCl9IHRvIGRldGVybWluZSB3aGV0aGVyIHlvdSBuZWVkIHRvCisgICAgICogaGF2ZSB0aGUgdXNlciBzZWxlY3QgYSBuZXcgcGFzc3dvcmQgaW4gb3JkZXIgdG8gbWVldCB0aGUgY3VycmVudAorICAgICAqIGNvbnN0cmFpbnRzLiBVcG9uIGJlaW5nIHJlc3VtZWQgZnJvbSB0aGlzIGFjdGl2aXR5LCB5b3UgY2FuIGNoZWNrIHRoZSBuZXcKKyAgICAgKiBwYXNzd29yZCBjaGFyYWN0ZXJpc3RpY3MgdG8gc2VlIGlmIHRoZXkgYXJlIHN1ZmZpY2llbnQuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5BQ1RJVklUWV9JTlRFTlRfQUNUSU9OKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVRfTkVXX1BBU1NXT1JECiAgICAgICAgICAgICA9ICJhbmRyb2lkLmFwcC5hY3Rpb24uU0VUX05FV19QQVNTV09SRCI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWRtaW5pc3RyYXRvciBjb21wb25lbnQgaXMgY3VycmVudGx5CiAgICAgICogYWN0aXZlIChlbmFibGVkKSBpbiB0aGUgc3lzdGVtLgpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGFkbWluaXN0cmF0b3IncyBjb21wb25lbnQKICAgICAgKiBuYW1lcy4gIE5vdGUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gYWRtaW5pc3RyYXRvcnMgdGhhbiBudWxsIG1heSBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE2MCw3ICsxNjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYSBjdXJyZW50IGFkbWluaXN0cmF0aW9uIGNvbXBvbmVudC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3ducyB0aGUgYWRtaW5pc3RyYXRpb24gY29tcG9uZW50OyBpZiB5b3UKQEAgLTE3NiwyOCArMTc3LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDb25zdGFudCBmb3Ige0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9OiB0aGUgcG9saWN5IGhhcyBubyByZXF1aXJlbWVudHMKICAgICAgKiBmb3IgdGhlIHBhc3N3b3JkLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyCiAgICAgICogdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQgPSAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHBvbGljeSByZXF1aXJlcyBzb21lIGtpbmQKICAgICAgKiBvZiBwYXNzd29yZCwgYnV0IGRvZXNuJ3QgY2FyZSB3aGF0IGl0IGlzLiAgTm90ZSB0aGF0IHF1YWxpdHkgY29uc3RhbnRzCiAgICAgICogYXJlIG9yZGVyZWQgc28gdGhhdCBoaWdoZXIgdmFsdWVzIGFyZSBtb3JlIHJlc3RyaWN0aXZlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HID0gMHgxMDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IG51bWVyaWMgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBxdWFsaXR5CiAgICAgICogY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX05VTUVSSUMgPSAweDIwMDAwOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQogICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYWxwaGFiZXRpYyAob3Igb3RoZXIgc3ltYm9sKSBjaGFyYWN0ZXJzLgpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgICogcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID0gMHg0MDAwMDsKLSAgICAKKwogICAgIC8qKgogICAgICAqIENvbnN0YW50IGZvciB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX06IHRoZSB1c2VyIG11c3QgaGF2ZSBlbnRlcmVkIGEKICAgICAgKiBwYXNzd29yZCBjb250YWluaW5nIGF0IGxlYXN0IDxlbT5ib3RoPjwvZW0+IG51bWVyaWMgPGVtPmFuZDwvZW0+CkBAIC0yMTMsNyArMjE0LDE5IEBACiAgICAgICogb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUgcmVzdHJpY3RpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPSAweDUwMDAwOwotICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fTogdGhlIHVzZXIgbXVzdCBoYXZlIGVudGVyZWQgYQorICAgICAqIHBhc3N3b3JkIGNvbnRhaW5pbmcgYXQgbGVhc3QgYSBsZXR0ZXIsIGEgbnVtZXJpY2FsIGRpZ2l0IGFuZCBhIHNwZWNpYWwKKyAgICAgKiBzeW1ib2wsIGJ5IGRlZmF1bHQuIFdpdGggdGhpcyBwYXNzd29yZCBxdWFsaXR5LCBwYXNzd29yZHMgY2FuIGJlCisgICAgICogcmVzdHJpY3RlZCB0byBjb250YWluIHZhcmlvdXMgc2V0cyBvZiBjaGFyYWN0ZXJzLCBsaWtlIGF0IGxlYXN0IGFuCisgICAgICogdXBwZXJjYXNlIGxldHRlciwgZXRjLiBUaGVzZSBhcmUgc3BlY2lmaWVkIHVzaW5nIHZhcmlvdXMgbWV0aG9kcywKKyAgICAgKiBsaWtlIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9LiBOb3RlCisgICAgICogdGhhdCBxdWFsaXR5IGNvbnN0YW50cyBhcmUgb3JkZXJlZCBzbyB0aGF0IGhpZ2hlciB2YWx1ZXMgYXJlIG1vcmUKKyAgICAgKiByZXN0cmljdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVggPSAweDYwMDAwOworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKICAgICAgKiBwYXNzd29yZCByZXN0cmljdGlvbnMgaXQgaXMgaW1wb3NpbmcuICBBZnRlciBzZXR0aW5nIHRoaXMsIHRoZSB1c2VyCkBAIC0yMjIsMjEgKzIzNSwyMSBAQAogICAgICAqIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90CiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlF1YWxpdHkgY29uc3RhbnRzIGFyZSBvcmRlcmVkIHNvIHRoYXQgaGlnaGVyIHZhbHVlcyBhcmUgbW9yZSByZXN0cmljdGl2ZTsKICAgICAgKiB0aHVzIHRoZSBoaWdoZXN0IHJlcXVlc3RlZCBxdWFsaXR5IGNvbnN0YW50IChiZXR3ZWVuIHRoZSBwb2xpY3kgc2V0IGhlcmUsCiAgICAgICogdGhlIHVzZXIncyBwcmVmZXJlbmNlLCBhbmQgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zKSBpcyB0aGUgb25lIHRoYXQKICAgICAgKiBpcyBpbiBlZmZlY3QuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSBUaGUgbmV3IGRlc2lyZWQgcXVhbGl0eS4gIE9uZSBvZgogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRH0sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkd9LAogICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDfSwge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUN9LAotICAgICAqIG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LgorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9IG9yIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IHF1YWxpdHkpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKQEAgLTI0Nyw3ICsyNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbWluaW11bSBwYXNzd29yZCBxdWFsaXR5IGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTI2NCw3ICsyNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCiAgICAgICogbWluaW11bSBhbGxvd2VkIHBhc3N3b3JkIGxlbmd0aC4gIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIKQEAgLTI3NCwxNCArMjg3LDE0IEBACiAgICAgICogdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQogICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gIFRoaXMKICAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQgZWl0aGVyCi0gICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX05VTUVSSUN9LCB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQ30sCi0gICAgICogb3Ige0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30KKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfQorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUN9LCBvciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0KICAgICAgKiB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCiAgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoLiAgQSB2YWx1ZSBvZiAwCiAgICAgICogbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC0yOTUsNyArMzA4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIGZvciBhbGwgYWRtaW5zCiAgICAgICogb3IgYSBwYXJ0aWN1bGFyIG9uZS4KQEAgLTMxMiw3ICszMjUsMzc5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiB1cHBlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgdXBwZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVwcGVyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlcgorICAgICAqIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzCisgICAgICogbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQKKyAgICAgKiBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzCisgICAgICogbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsb3dlciBjYXNlIGxldHRlcnMKKyAgICAgKiAgICAgICAgICAgIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vCisgICAgICogICAgICAgICAgICByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxvd2VyIGNhc2UgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4gQWZ0ZXIgc2V0dGluZyB0aGlzLAorICAgICAqIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZW50ZXIgYSBuZXcgcGFzc3dvcmQgdGhhdCBpcyBub3QgYXQgbGVhc3QgYXMKKyAgICAgKiByZXN0cmljdGl2ZSBhcyB3aGF0IGhhcyBiZWVuIHNldC4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwKKyAgICAgKiByZW1haW4gdW50aWwgdGhlIHVzZXIgaGFzIHNldCBhIG5ldyBvbmUsIHNvIHRoZSBjaGFuZ2UgZG9lcyBub3QgdGFrZQorICAgICAqIHBsYWNlIGltbWVkaWF0ZWx5LiBUbyBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbmV3IHBhc3N3b3JkLCB1c2UKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuIFRoaXMKKyAgICAgKiBjb25zdHJhaW50IGlzIG9ubHkgaW1wb3NlZCBpZiB0aGUgYWRtaW5pc3RyYXRvciBoYXMgYWxzbyByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uIFRoZQorICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgMS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBXaGljaCB7QGxpbmsgRGV2aWNlQWRtaW5SZWNlaXZlcn0gdGhpcyByZXF1ZXN0IGlzIGFzc29jaWF0ZWQKKyAgICAgKiAgICAgICAgICAgIHdpdGguCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbmV3IGRlc2lyZWQgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhc3N3b3JkLiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhDb21wb25lbnROYW1lIGFkbWluLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQgZm9yIGFsbAorICAgICAqIGFkbWlucyBvciBhIHBhcnRpY3VsYXIgb25lLiBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogc2V0IGJ5IHsjbGluayB7QGxpbmsgI3NldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSwgaW50KX0KKyAgICAgKiBhbmQgb25seSBhcHBsaWVzIHdoZW4gdGhlIHBhc3N3b3JkIHF1YWxpdHkgaXMKKyAgICAgKiB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfQ09NUExFWH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gVGhlIG5hbWUgb2YgdGhlIGFkbWluIGNvbXBvbmVudCB0byBjaGVjaywgb3IgbnVsbCB0bworICAgICAqICAgICAgICAgICAgYWdncmVnYXRlIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSBudW1iZXIgb2YgbGV0dGVycyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoYWRtaW4pOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogbWluaW11bSBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyCisgICAgICogc2V0dGluZyB0aGlzLCB0aGUgdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMKKyAgICAgKiBub3QgYXQgbGVhc3QgYXMgcmVzdHJpY3RpdmUgYXMgd2hhdCBoYXMgYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudAorICAgICAqIHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMKKyAgICAgKiBub3QgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gVG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlCisgICAgICoge0BsaW5rICNBQ1RJT05fU0VUX05FV19QQVNTV09SRH0gYWZ0ZXIgc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzCisgICAgICogY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9IHdpdGgge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUKKyAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIDEuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKKyAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKKyAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBkZXNpcmVkIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBwYXNzd29yZC4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkCisgICAgICogZm9yIGFsbCBhZG1pbnMgb3IgYSBwYXJ0aWN1bGFyIG9uZS4gVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqIHNldCBieSB7I2xpbmsge0BsaW5rICNzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIG51bWVyaWNhbCBkaWdpdHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIGFkbWluKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQorICAgICAqIG1pbmltdW0gbnVtYmVyIG9mIHN5bWJvbHMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLiBBZnRlciBzZXR0aW5nIHRoaXMsCisgICAgICogdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIG5vdCBhdCBsZWFzdCBhcworICAgICAqIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzIGJlZW4gc2V0LiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFzc3dvcmQgd2lsbAorICAgICAqIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMgc2V0IGEgbmV3IG9uZSwgc28gdGhlIGNoYW5nZSBkb2VzIG5vdCB0YWtlCisgICAgICogcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgcGFzc3dvcmQsIHVzZQorICAgICAqIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyIHNldHRpbmcgdGhpcyB2YWx1ZS4gVGhpcworICAgICAqIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBhbHNvIHJlcXVlc3RlZAorICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoIHtAbGluayAjc2V0UGFzc3dvcmRRdWFsaXR5fS4gVGhlCisgICAgICogZGVmYXVsdCB2YWx1ZSBpcyAxLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZCBmb3IgYWxsCisgICAgICogYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhDb21wb25lbnROYW1lLCBpbnQpfQorICAgICAqIGFuZCBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgcGFzc3dvcmQgcXVhbGl0eSBpcworICAgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvCisgICAgICogICAgICAgICAgICBhZ2dyZWdhdGUgYWxsIGFkbWlucy4KKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzeW1ib2xzIHJlcXVpcmVkIGluIHRoZSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRNaW5pbXVtU3ltYm9scyhhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWRtaW5pc3RlcmluZyB0aGUgZGV2aWNlIHRvIHNldCB0aGUKKyAgICAgKiBtaW5pbXVtIG51bWJlciBvZiBub24tbGV0dGVyIGNoYXJhY3RlcnMgKG51bWVyaWNhbCBkaWdpdHMgb3Igc3ltYm9scykKKyAgICAgKiByZXF1aXJlZCBpbiB0aGUgcGFzc3dvcmQuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZQorICAgICAqIHRvIGVudGVyIGEgbmV3IHBhc3N3b3JkIHRoYXQgaXMgbm90IGF0IGxlYXN0IGFzIHJlc3RyaWN0aXZlIGFzIHdoYXQgaGFzCisgICAgICogYmVlbiBzZXQuIE5vdGUgdGhhdCB0aGUgY3VycmVudCBwYXNzd29yZCB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgdXNlciBoYXMKKyAgICAgKiBzZXQgYSBuZXcgb25lLCBzbyB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdAorICAgICAqIHRoZSB1c2VyIGZvciBhIG5ldyBwYXNzd29yZCwgdXNlIHtAbGluayAjQUNUSU9OX1NFVF9ORVdfUEFTU1dPUkR9IGFmdGVyCisgICAgICogc2V0dGluZyB0aGlzIHZhbHVlLiBUaGlzIGNvbnN0cmFpbnQgaXMgb25seSBpbXBvc2VkIGlmIHRoZSBhZG1pbmlzdHJhdG9yCisgICAgICogaGFzIGFsc28gcmVxdWVzdGVkIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYfSB3aXRoCisgICAgICoge0BsaW5rICNzZXRQYXNzd29yZFF1YWxpdHl9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRH0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZAorICAgICAqICAgICAgICAgICAgd2l0aC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiBsZXR0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqICAgICAgICAgICAgcGFzc3dvcmQuIEEgdmFsdWUgb2YgMCBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoQ29tcG9uZW50TmFtZSBhZG1pbiwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIoYWRtaW4sIGxlbmd0aCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9uLWxldHRlciBjaGFyYWN0ZXJzIHJlcXVpcmVkIGluIHRoZQorICAgICAqIHBhc3N3b3JkIGZvciBhbGwgYWRtaW5zIG9yIGEgcGFydGljdWxhciBvbmUuIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiBzZXQgYnkgeyNsaW5rIHtAbGluayAjc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUsIGludCl9CisgICAgICogYW5kIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBwYXNzd29yZCBxdWFsaXR5IGlzCisgICAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0NPTVBMRVh9LgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8KKyAgICAgKiAgICAgICAgICAgIGFnZ3JlZ2F0ZSBhbGwgYWRtaW5zLgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gbnVtYmVyIG9mIGxldHRlcnMgcmVxdWlyZWQgaW4gdGhlIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihhZG1pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIC8qKgorICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBsZW5ndGgKKyAgICogb2YgdGhlIHBhc3N3b3JkIGhpc3RvcnkuIEFmdGVyIHNldHRpbmcgdGhpcywgdGhlIHVzZXIgd2lsbCBub3QgYmUgYWJsZSB0bworICAgKiBlbnRlciBhIG5ldyBwYXNzd29yZCB0aGF0IGlzIHRoZSBzYW1lIGFzIGFueSBwYXNzd29yZCBpbiB0aGUgaGlzdG9yeS4gTm90ZQorICAgKiB0aGF0IHRoZSBjdXJyZW50IHBhc3N3b3JkIHdpbGwgcmVtYWluIHVudGlsIHRoZSB1c2VyIGhhcyBzZXQgYSBuZXcgb25lLCBzbworICAgKiB0aGUgY2hhbmdlIGRvZXMgbm90IHRha2UgcGxhY2UgaW1tZWRpYXRlbHkuIFRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcKKyAgICogcGFzc3dvcmQsIHVzZSB7QGxpbmsgI0FDVElPTl9TRVRfTkVXX1BBU1NXT1JEfSBhZnRlciBzZXR0aW5nIHRoaXMgdmFsdWUuCisgICAqIFRoaXMgY29uc3RyYWludCBpcyBvbmx5IGltcG9zZWQgaWYgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGFsc28gcmVxdWVzdGVkCisgICAqIGVpdGhlciB7QGxpbmsgI1BBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQ30sCisgICAqIHtAbGluayAjUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDfSwgb3IKKyAgICoge0BsaW5rICNQQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQ30gd2l0aCB7QGxpbmsgI3NldFBhc3N3b3JkUXVhbGl0eX0uCisgICAqCisgICAqIDxwPgorICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwgdGhpcworICAgKiBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAqICAgICAgICB3aXRoLgorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBuZXcgZGVzaXJlZCBsZW5ndGggb2YgcGFzc3dvcmQgaGlzdG9yeS4gQSB2YWx1ZSBvZiAwCisgICAqICAgICAgICBtZWFucyB0aGVyZSBpcyBubyByZXN0cmljdGlvbi4KKyAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgYWRtaW4sIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluLCBsZW5ndGgpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgaGlzdG9yeSBsZW5ndGggZm9yIGFsbCBhZG1pbnMKKyAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgorICAgICAqIEBwYXJhbSBhZG1pbiBUaGUgbmFtZSBvZiB0aGUgYWRtaW4gY29tcG9uZW50IHRvIGNoZWNrLCBvciBudWxsIHRvIGFnZ3JlZ2F0ZQorICAgICAqIGFsbCBhZG1pbnMuCisgICAgICogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCBoaXN0b3J5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoQ29tcG9uZW50TmFtZSBhZG1pbikgeworICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gcGFzc3dvcmQgbGVuZ3RoIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0cyBmb3IgYQogICAgICAqIHBhcnRpY3VsYXIgcGFzc3dvcmQgcXVhbGl0eS4KQEAgLTMyMywxNiArNzA4LDE2IEBACiAgICAgICAgIC8vIEtpbmQtb2YgYXJiaXRyYXJ5LgogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdGhlIHVzZXIgaGFzIHNldCBpcyBzdWZmaWNpZW50CiAgICAgICogdG8gbWVldCB0aGUgcG9saWN5IHJlcXVpcmVtZW50cyAocXVhbGl0eSwgbWluaW11bSBsZW5ndGgpIHRoYXQgaGF2ZSBiZWVuCiAgICAgICogcmVxdWVzdGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGN1cnJlbnQgcmVxdWlyZW1lbnRzLAogICAgICAqIGVsc2UgZmFsc2UuCiAgICAgICovCkBAIC0zNDYsMTEgKzczMSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB1c2VyIGhhcyBmYWlsZWQgYXQgZW50ZXJpbmcgYQogICAgICAqIHBhc3N3b3JkIHNpbmNlIHRoYXQgbGFzdCBzdWNjZXNzZnVsIHBhc3N3b3JkIGVudHJ5LgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSB0byBiZSBhYmxlIHRvIGNhbGwKICAgICAgKiB0aGlzIG1ldGhvZDsgaWYgaXQgaGFzIG5vdCwgYSBzZWN1cml0eSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCkBAIC0zNzMsMTQgKzc1OCwxNCBAQAogICAgICAqIHdhdGNoaW5nIGZvciBmYWlsZWQgcGFzc3dvcmRzIGFuZCB3aXBpbmcgdGhlIGRldmljZSwgYW5kIHJlcXVpcmVzCiAgICAgICogdGhhdCB5b3UgcmVxdWVzdCBib3RoIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0FUQ0hfTE9HSU59IGFuZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfV0lQRV9EQVRBfX0uCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UbyBpbXBsZW1lbnQgYW55IG90aGVyIHBvbGljeSAoZS5nLiB3aXBpbmcgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogYXBwbGljYXRpb24gb25seSwgZXJhc2luZyBvciByZXZva2luZyBjcmVkZW50aWFscywgb3IgcmVwb3J0aW5nIHRoZQogICAgICAqIGZhaWx1cmUgdG8gYSBzZXJ2ZXIpLCB5b3Ugc2hvdWxkIGltcGxlbWVudAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyI29uUGFzc3dvcmRGYWlsZWQoQ29udGV4dCwgYW5kcm9pZC5jb250ZW50LkludGVudCl9CiAgICAgICogaW5zdGVhZC4gIERvIG5vdCB1c2UgdGhpcyBBUEksIGJlY2F1c2UgaWYgdGhlIG1heGltdW0gY291bnQgaXMgcmVhY2hlZCwKICAgICAgKiB0aGUgZGV2aWNlIHdpbGwgYmUgd2lwZWQgaW1tZWRpYXRlbHksIGFuZCB5b3VyIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkIHdpdGguCiAgICAgICogQHBhcmFtIG51bSBUaGUgbnVtYmVyIG9mIGZhaWxlZCBwYXNzd29yZCBhdHRlbXB0cyBhdCB3aGljaCBwb2ludCB0aGUKICAgICAgKiBkZXZpY2Ugd2lsbCB3aXBlIGl0cyBkYXRhLgpAQCAtMzk0LDcgKzc3OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyB0aGF0IGFyZSBhbGxvd2VkCiAgICAgICogYmVmb3JlIHRoZSBkZXZpY2Ugd2lwZXMgaXRzZWxmLCBmb3IgYWxsIGFkbWlucwpAQCAtNDEyLDEzICs3OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3Jlc2V0UGFzc3dvcmR9OiBkb24ndCBhbGxvdyBvdGhlciBhZG1pbnMgdG8gY2hhbmdlCiAgICAgICogdGhlIHBhc3N3b3JkIGFnYWluIHVudGlsIHRoZSB1c2VyIGhhcyBlbnRlcmVkIGl0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VUX1BBU1NXT1JEX1JFUVVJUkVfRU5UUlkgPSAweDAwMDE7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBGb3JjZSBhIG5ldyBkZXZpY2UgdW5sb2NrIHBhc3N3b3JkICh0aGUgcGFzc3dvcmQgbmVlZGVkIHRvIGFjY2VzcyB0aGUKICAgICAgKiBlbnRpcmUgZGV2aWNlLCBub3QgZm9yIGluZGl2aWR1YWwgYWNjb3VudHMpIG9uIHRoZSB1c2VyLiAgVGhpcyB0YWtlcwpAQCAtNDMxLDExICs4MTYsMTEgQEAKICAgICAgKiB0aGF0IHRoZSBwYXNzd29yZCBtYXkgYmUgYSBzdHJvbmdlciBxdWFsaXR5IChjb250YWluaW5nIGFscGhhbnVtZXJpYwogICAgICAqIGNoYXJhY3RlcnMgd2hlbiB0aGUgcmVxdWVzdGVkIHF1YWxpdHkgaXMgb25seSBudW1lcmljKSwgaW4gd2hpY2ggY2FzZQogICAgICAqIHRoZSBjdXJyZW50bHkgYWN0aXZlIHF1YWxpdHkgd2lsbCBiZSBpbmNyZWFzZWQgdG8gbWF0Y2guCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfUkVTRVRfUEFTU1dPUkR9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IHBhc3N3b3JkIGZvciB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gZmxhZ3MgTWF5IGJlIDAgb3Ige0BsaW5rICNSRVNFVF9QQVNTV09SRF9SRVFVSVJFX0VOVFJZfS4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc3dvcmQgd2FzIGFwcGxpZWQsIG9yIGZhbHNlIGlmIGl0IGlzCkBAIC00NTEsMTYgKzgzNiwxNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gc2V0IHRoZQogICAgICAqIG1heGltdW0gdGltZSBmb3IgdXNlciBhY3Rpdml0eSB1bnRpbCB0aGUgZGV2aWNlIHdpbGwgbG9jay4gIFRoaXMgbGltaXRzCiAgICAgICogdGhlIGxlbmd0aCB0aGF0IHRoZSB1c2VyIGNhbiBzZXQuICBJdCB0YWtlcyBlZmZlY3QgaW1tZWRpYXRlbHkuCi0gICAgICogCisgICAgICoKICAgICAgKiA8cD5UaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAogICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfRk9SQ0VfTE9DS30gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqIEBwYXJhbSB0aW1lTXMgVGhlIG5ldyBkZXNpcmVkIG1heGltdW0gdGltZSB0byBsb2NrIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKiBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24uCkBAIC00NzQsNyArODU5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IG1heGltdW0gdGltZSB0byB1bmxvY2sgZm9yIGFsbCBhZG1pbnMKICAgICAgKiBvciBhIHBhcnRpY3VsYXIgb25lLgpAQCAtNDkxLDExICs4NzYsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBNYWtlIHRoZSBkZXZpY2UgbG9jayBpbW1lZGlhdGVseSwgYXMgaWYgdGhlIGxvY2sgc2NyZWVuIHRpbWVvdXQgaGFzCiAgICAgICogZXhwaXJlZCBhdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX0ZPUkNFX0xPQ0t9IHRvIGJlIGFibGUgdG8gY2FsbAogICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KQEAgLTUwOSwxNiArODk0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBBc2sgdGhlIHVzZXIgZGF0ZSBiZSB3aXBlZC4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZGV2aWNlIHRvIHJlYm9vdCwKICAgICAgKiBlcmFzaW5nIGFsbCB1c2VyIGRhdGEgd2hpbGUgbmV4dCBib290aW5nIHVwLiAgRXh0ZXJuYWwgc3RvcmFnZSBzdWNoCiAgICAgICogYXMgU0QgY2FyZHMgd2lsbCBub3QgYmUgZXJhc2VkLgotICAgICAqIAorICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxpbmcgZGV2aWNlIGFkbWluIG11c3QgaGF2ZSByZXF1ZXN0ZWQKICAgICAgKiB7QGxpbmsgRGV2aWNlQWRtaW5JbmZvI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0gdG8gYmUgYWJsZSB0byBjYWxsCiAgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWdzIEJpdCBtYXNrIG9mIGFkZGl0aW9uYWwgb3B0aW9uczogY3VycmVudGx5IG11c3QgYmUgMC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKQEAgLTUzMCw3ICs5MTUsOTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGFkbWluaXN0ZXJpbmcgdGhlIGRldmljZSB0byBzZXQgdGhlCisgICAgICogZ2xvYmFsIHByb3h5IGFuZCBleGNsdXNpb24gbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGluZyBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIHJlcXVlc3RlZAorICAgICAqIHtAbGluayBEZXZpY2VBZG1pbkluZm8jVVNFU19QT0xJQ1lfU0VUU19HTE9CQUxfUFJPWFl9IHRvIGJlIGFibGUgdG8gY2FsbAorICAgICAqIHRoaXMgbWV0aG9kOyBpZiBpdCBoYXMgbm90LCBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4gY2FuIHNldCB0aGUgcHJveHkuIElmIGEgc2Vjb25kIGFkbWluIGF0dGVtcHRzCisgICAgICogdG8gc2V0IHRoZSBwcm94eSwgdGhlIHtAbGluayBDb21wb25lbnROYW1lfSBvZiB0aGUgYWRtaW4gb3JpZ2luYWxseSBzZXR0aW5nIHRoZQorICAgICAqIHByb3h5IHdpbGwgYmUgcmV0dXJuZWQuIElmIHN1Y2Nlc3NmdWwgaW4gc2V0dGluZyB0aGUgcHJveHksIG51bGwgd2lsbAorICAgICAqIGJlIHJldHVybmVkLgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBkZXZpY2UgYWRtaW4gYWxyYWR5IHNldHRpbmcgdGhlCisgICAgICogcHJveHkgdG8gdXBkYXRlIHRoZSBwcm94eSBhbmQgZXhjbHVzaW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRtaW4gV2hpY2gge0BsaW5rIERldmljZUFkbWluUmVjZWl2ZXJ9IHRoaXMgcmVxdWVzdCBpcyBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICB3aXRoLgorICAgICAqIEBwYXJhbSBwcm94eVNwZWMgdGhlIGdsb2JhbCBwcm94eSBkZXNpcmVkLiBNdXN0IGJlIGFuIEhUVFAgUHJveHkuCisgICAgICogICAgICAgICAgICBQYXNzIFByb3h5Lk5PX1BST1hZIHRvIHJlc2V0IHRoZSBwcm94eS4KKyAgICAgKiBAcGFyYW0gZXhjbHVzaW9uTGlzdCBhIGxpc3Qgb2YgZG9tYWlucyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICogQHJldHVybiByZXR1cm5zIG51bGwgaWYgdGhlIHByb3h5IHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciBhIHtAbGluayBDb21wb25lbnROYW1lfQorICAgICAqICAgICAgICAgICAgb2YgdGhlIGRldmljZSBhZG1pbiB0aGF0IHNldHMgdGhldyBwcm94eSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgc2V0R2xvYmFsUHJveHkoQ29tcG9uZW50TmFtZSBhZG1pbiwgUHJveHkgcHJveHlTcGVjLAorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbkxpc3QgKSB7CisgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RTcGVjOworICAgICAgICAgICAgICAgIFN0cmluZyBleGNsU3BlYzsKKyAgICAgICAgICAgICAgICBpZiAocHJveHlTcGVjLmVxdWFscyhQcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFNwZWMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm94eVNwZWMudHlwZSgpLmVxdWFscyhQcm94eS5UeXBlLkhUVFApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJveHlTcGVjLmFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gc2EuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQgPSBzYS5nZXRQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaG9zdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBob3N0U3BlYyA9IGhvc3RCdWlsZGVyLmFwcGVuZChob3N0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhwb3J0KSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjbFNwZWMgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdERvbWFpbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsRG9tYWluIDogZXhjbHVzaW9uTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3REb21haW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEJ1aWxkZXIgPSBsaXN0QnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERvbWFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0QnVpbGRlciA9IGxpc3RCdWlsZGVyLmFwcGVuZChleGNsRG9tYWluLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGNsU3BlYyA9IGxpc3RCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5uZXQuUHJveHkudmFsaWRhdGUoaG9zdE5hbWUsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGV4Y2xTcGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNldEdsb2JhbFByb3h5KGFkbWluLCBob3N0U3BlYywgZXhjbFNwZWMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdGFsa2luZyB3aXRoIGRldmljZSBwb2xpY3kgc2VydmljZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIHNldHRpbmcgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgKiBAcmV0dXJuIENvbXBvbmVudE5hbWUgb2JqZWN0IG9mIHRoZSBkZXZpY2UgYWRtaW4gdGhhdCBzZXQgdGhlIGdsb2JhbCBwcm94eSwgb3IKKyAgICAgKiAgICAgICAgICAgIG51bGwgaWYgbm8gYWRtaW4gaGFzIHNldCB0aGUgcHJveHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0R2xvYmFsUHJveHlBZG1pbigpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEdsb2JhbFByb3h5QWRtaW4oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNTQzLDcgKzEwMTMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTU1NiwxMCArMTAyNiwxMCBAQAogICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRldmljZSBwb2xpY3kgIiArIGNuLCBlKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIFJlc29sdmVJbmZvIHJpID0gbmV3IFJlc29sdmVJbmZvKCk7CiAgICAgICAgIHJpLmFjdGl2aXR5SW5mbyA9IGFpOwotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIHJpKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NzAsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC01ODcsMTYgKzEwNTcsMTggQEAKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKHF1YWxpdHksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVNlcnZpY2Uuc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShxdWFsaXR5LCBsZW5ndGgsIGxldHRlcnMsIHVwcGVyY2FzZSwgbG93ZXJjYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycywgc3ltYm9scywgbm9ubGV0dGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCkBAIC02MDksNyArMTA4MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBAaGlkZQogICAgICAqLwpAQCAtNjIyLDQgKzEwOTQsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vSURldmljZVBvbGljeU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCmluZGV4IDZmYzRkYzUuLjNmY2Q2ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsCkBAIC0yNywxMCArMjcsMzEgQEAKIGludGVyZmFjZSBJRGV2aWNlUG9saWN5TWFuYWdlciB7CiAgICAgdm9pZCBzZXRQYXNzd29yZFF1YWxpdHkoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBxdWFsaXR5KTsKICAgICBpbnQgZ2V0UGFzc3dvcmRRdWFsaXR5KGluIENvbXBvbmVudE5hbWUgd2hvKTsKLSAgICAKKwogICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKICAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCisgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhpbiBDb21wb25lbnROYW1lIHdobyk7CisKKyAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpOworICAgIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGluIENvbXBvbmVudE5hbWUgd2hvKTsKKworICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICAKKyAgICB2b2lkIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCk7CisgICAgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChpbiBDb21wb25lbnROYW1lIHdobyk7CisKICAgICBib29sZWFuIGlzQWN0aXZlUGFzc3dvcmRTdWZmaWNpZW50KCk7CiAgICAgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgCkBAIC00NSw2ICs2Niw5IEBACiAgICAgdm9pZCBsb2NrTm93KCk7CiAgICAgCiAgICAgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpOworCisgICAgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShpbiBDb21wb25lbnROYW1lIGFkbWluLCBTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCk7CisgICAgQ29tcG9uZW50TmFtZSBnZXRHbG9iYWxQcm94eUFkbWluKCk7CiAgICAgCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBib29sZWFuIGlzQWRtaW5BY3RpdmUoaW4gQ29tcG9uZW50TmFtZSBwb2xpY3lSZWNlaXZlcik7CkBAIC01Myw3ICs3Nyw4IEBACiAgICAgdm9pZCBnZXRSZW1vdmVXYXJuaW5nKGluIENvbXBvbmVudE5hbWUgcG9saWN5UmVjZWl2ZXIsIGluIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCk7CiAgICAgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICAKLSAgICB2b2lkIHNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoaW50IHF1YWxpdHksIGludCBsZW5ndGgpOworICAgIHZvaWQgc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShpbnQgcXVhbGl0eSwgaW50IGxlbmd0aCwgaW50IGxldHRlcnMsIGludCB1cHBlcmNhc2UsIGludCBsb3dlcmNhc2UsCisgICAgICAgIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcik7CiAgICAgdm9pZCByZXBvcnRGYWlsZWRQYXNzd29yZEF0dGVtcHQoKTsKICAgICB2b2lkIHJlcG9ydFN1Y2Nlc3NmdWxQYXNzd29yZEF0dGVtcHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdC5qYXZhCmluZGV4IGIyZmMxM2YuLjc3MzA5NDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRIb3N0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEVfVVBEQVRFID0gMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9QUk9WSURFUl9DSEFOR0VEID0gMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9WSUVXX0RBVEFfQ0hBTkdFRCA9IDM7CiAKICAgICBmaW5hbCBzdGF0aWMgT2JqZWN0IHNTZXJ2aWNlTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBzdGF0aWMgSUFwcFdpZGdldFNlcnZpY2Ugc1NlcnZpY2U7CkBAIC02MCw2ICs2MSwxMyBAQAogICAgICAgICAgICAgbXNnLm9iaiA9IGluZm87CiAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoSEFORExFX1ZJRVdfREFUQV9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gYXBwV2lkZ2V0SWQ7CisgICAgICAgICAgICBtc2cuYXJnMiA9IHZpZXdJZDsKKyAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNsYXNzIFVwZGF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTc3LDYgKzg1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUHJvdmlkZXJDaGFuZ2VkKG1zZy5hcmcxLCAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBIQU5ETEVfVklFV19EQVRBX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgdmlld0RhdGFDaGFuZ2VkKG1zZy5hcmcxLCBtc2cuYXJnMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1MCw2ICsyNjIsMTYgQEAKICAgICAgICAgICAgIHYudXBkYXRlQXBwV2lkZ2V0KHZpZXdzKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCkgeworICAgICAgICBBcHBXaWRnZXRIb3N0VmlldyB2OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3cykgeworICAgICAgICAgICAgdiA9IG1WaWV3cy5nZXQoYXBwV2lkZ2V0SWQpOworICAgICAgICB9CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHYudmlld0RhdGFDaGFuZ2VkKHZpZXdJZCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldEhvc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQppbmRleCBiMzNiMDk3Li40ZjhlZTkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0SG9zdFZpZXcuamF2YQpAQCAtMjMsMTUgKzIzLDE4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CkBAIC0yNTgsNiArMjYxLDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUHJvY2VzcyBkYXRhLWNoYW5nZWQgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCB2aWV3IGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzZXQgb2Yge0BsaW5rIFJlbW90ZVZpZXdzfSB2aWV3cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpZXdEYXRhQ2hhbmdlZChpbnQgdmlld0lkKSB7CisgICAgICAgIFZpZXcgdiA9IGZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICBpZiAoKHYgIT0gbnVsbCkgJiYgKHYgaW5zdGFuY2VvZiBBZGFwdGVyVmlldzw/PikpIHsKKyAgICAgICAgICAgIEFkYXB0ZXJWaWV3PD8+IGFkYXB0ZXJWaWV3ID0gKEFkYXB0ZXJWaWV3PD8+KSB2OworICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlclZpZXcuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBCYXNlQWRhcHRlcikgeworICAgICAgICAgICAgICAgIEJhc2VBZGFwdGVyIGJhc2VBZGFwdGVyID0gKEJhc2VBZGFwdGVyKSBhZGFwdGVyOworICAgICAgICAgICAgICAgIGJhc2VBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCdWlsZCBhIHtAbGluayBDb250ZXh0fSBjbG9uZWQgaW50byBhbm90aGVyIHBhY2thZ2UgbmFtZSwgdXN1YWxseSBmb3IgdGhlCiAgICAgICogcHVycG9zZXMgb2YgcmVhZGluZyByZW1vdGUgcmVzb3VyY2VzLgogICAgICAqLwpAQCAtMjc1LDYgKzI5NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkcmF3Q2hpbGQoQ2FudmFzIGNhbnZhcywgVmlldyBjaGlsZCwgbG9uZyBkcmF3aW5nVGltZSkgewogICAgICAgICBpZiAoQ1JPU1NGQURFKSB7CiAgICAgICAgICAgICBpbnQgYWxwaGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldE1hbmFnZXIuamF2YQppbmRleCBkMmFiODVlLi4yYTU4M2MxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRNYW5hZ2VyLmphdmEKQEAgLTIzMyw2ICsyMzMsMTAgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIFJlbW90ZVZpZXdzIHRvIHVzZSBmb3IgdGhlIHNwZWNpZmllZCBhcHBXaWRnZXRJZHMuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfS4KKyAgICAgKgogICAgICAqIDxwPgogICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCiAgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCkBAIC0yNTMsNiArMjU3LDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIHRoZSBzcGVjaWZpZWQgYXBwV2lkZ2V0SWQuCiAgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIFJlbW90ZVZpZXdzIHBhcmFtZXRlciB3aWxsIGJlIGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZSwgYW5kIGhlbmNlIHNob3VsZAorICAgICAqIGNvbnRhaW4gYSBjb21wbGV0ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZ2V0LiBGb3IgcGVyZm9ybWluZyBwYXJ0aWFsIHdpZGdldCB1cGRhdGVzLCBzZWUKKyAgICAgKiB7QGxpbmsgI3BhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQsIFJlbW90ZVZpZXdzKX0uCisgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAogICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgpAQCAtMjY2LDYgKzI3NCw1OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW4gaW5jcmVtZW50YWwgdXBkYXRlIG9yIGNvbW1hbmQgb24gdGhlIHdpZGdldChzKSBzcGVjaWZpZWQgYnkgYXBwV2lkZ2V0SWRzLgorICAgICAqCisgICAgICogVGhpcyB1cGRhdGUgIGRpZmZlcnMgZnJvbSB7QGxpbmsgI3VwZGF0ZUFwcFdpZGdldChpbnRbXSwgUmVtb3RlVmlld3MpfSBpbiB0aGF0IHRoZQorICAgICAqIFJlbW90ZVZpZXdzIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgaXMgdW5kZXJzdG9vZCB0byBiZSBhbiBpbmNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAKKyAgICAgKiB3aWRnZXQsIGFuZCBoZW5jZSBpcyBub3QgY2FjaGVkIGJ5IHRoZSBBcHBXaWRnZXRTZXJ2aWNlLiBOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSB1cGRhdGVzIGFyZSAKKyAgICAgKiBub3QgY2FjaGVkLCBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdAorICAgICAqIHBlcnNpc3QgaW4gdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluCisgICAgICogQXBwV2lkZ2V0U2VydmljZS4KKyAgICAgKgorICAgICAqIFVzZSB3aXRoIHtAbGluayBSZW1vdGVWaWV3cyNzaG93TmV4dChpbnQpfSwge0BsaW5rIFJlbW90ZVZpZXdzI3Nob3dQcmV2aW91cyhpbnQpfSwKKyAgICAgKiB7QGxpbmsgUmVtb3RlVmlld3Mjc2V0U2Nyb2xsUG9zaXRpb24oaW50LCBpbnQpfSBhbmQgc2ltaWxhciBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9rYXkgdG8gY2FsbCB0aGlzIG1ldGhvZCBib3RoIGluc2lkZSBhbiB7QGxpbmsgI0FDVElPTl9BUFBXSURHRVRfVVBEQVRFfSBicm9hZGNhc3QsCisgICAgICogYW5kIG91dHNpZGUgb2YgdGhlIGhhbmRsZXIuCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgd2hlbiBjYWxsZWQgZnJvbSB0aGUgdWlkIHRoYXQgb3ducyB0aGUgQXBwV2lkZ2V0IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgICAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnRbXSBhcHBXaWRnZXRJZHMsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzU2VydmljZS5wYXJ0aWFsbHlVcGRhdGVBcHBXaWRnZXRJZHMoYXBwV2lkZ2V0SWRzLCB2aWV3cyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCB1cGRhdGUgb3IgY29tbWFuZCBvbiB0aGUgd2lkZ2V0IHNwZWNpZmllZCBieSBhcHBXaWRnZXRJZC4KKyAgICAgKgorICAgICAqIFRoaXMgdXBkYXRlICBkaWZmZXJzIGZyb20ge0BsaW5rICN1cGRhdGVBcHBXaWRnZXQoaW50LCBSZW1vdGVWaWV3cyl9IGluIHRoYXQgdGhlIFJlbW90ZVZpZXdzCisgICAgICogb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCBpcyB1bmRlcnN0b29kIHRvIGJlIGFuIGluY29tcGxldGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdpZGdldCwgYW5kCisgICAgICogaGVuY2UgaXMgbm90IGNhY2hlZCBieSB0aGUgQXBwV2lkZ2V0U2VydmljZS4gTm90ZSB0aGF0IGJlY2F1c2UgdGhlc2UgdXBkYXRlcyBhcmUgbm90IGNhY2hlZCwKKyAgICAgKiBhbnkgc3RhdGUgdGhhdCB0aGV5IG1vZGlmeSB0aGF0IGlzIG5vdCByZXN0b3JlZCBieSByZXN0b3JlSW5zdGFuY2VTdGF0ZSB3aWxsIG5vdCBwZXJzaXN0IGluCisgICAgICogdGhlIGNhc2UgdGhhdCB0aGUgd2lkZ2V0cyBhcmUgcmVzdG9yZWQgdXNpbmcgdGhlIGNhY2hlZCB2ZXJzaW9uIGluIEFwcFdpZGdldFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgUmVtb3RlVmlld3Mjc2hvd05leHQoaW50KX0sIHtAbGluayBSZW1vdGVWaWV3cyNzaG93UHJldmlvdXMoaW50KX0sCisgICAgICoge0BsaW5rIFJlbW90ZVZpZXdzI3NldFNjcm9sbFBvc2l0aW9uKGludCwgaW50KX0gYW5kIHNpbWlsYXIgY29tbWFuZHMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBva2F5IHRvIGNhbGwgdGhpcyBtZXRob2QgYm90aCBpbnNpZGUgYW4ge0BsaW5rICNBQ1RJT05fQVBQV0lER0VUX1VQREFURX0gYnJvYWRjYXN0LAorICAgICAqIGFuZCBvdXRzaWRlIG9mIHRoZSBoYW5kbGVyLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gY2FsbGVkIGZyb20gdGhlIHVpZCB0aGF0IG93bnMgdGhlIEFwcFdpZGdldCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBXaWRnZXRJZCAgICAgIFRoZSBBcHBXaWRnZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRvIHNldCB0aGUgUmVtb3RlVmlld3MuCisgICAgICogQHBhcmFtIHZpZXdzICAgICAgICAgICAgVGhlIFJlbW90ZVZpZXdzIG9iamVjdCBjb250YWluaW5nIHRoZSBpbmNyZW1lbnRhbCB1cGRhdGUgLyBjb21tYW5kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChpbnQgYXBwV2lkZ2V0SWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHBhcnRpYWxseVVwZGF0ZUFwcFdpZGdldChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3cyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBSZW1vdGVWaWV3cyB0byB1c2UgZm9yIGFsbCBBcHBXaWRnZXQgaW5zdGFuY2VzIGZvciB0aGUgc3VwcGxpZWQgQXBwV2lkZ2V0IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogPHA+CkBAIC0yODgsMTEgKzM0OSw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2aWV3IGluIGFsbCB0aGUgc3BlY2lmaWVkIEFwcFdpZGdldCBpbnN0YW5jZXMKKyAgICAgKiB0byBpbnZhbGlkYXRlIHRoZWlyIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkcyAgVGhlIEFwcFdpZGdldCBpbnN0YW5jZXMgZm9yIHdoaWNoIHRvIG5vdGlmeSBvZiB2aWV3IGRhdGEgY2hhbmdlcy4KKyAgICAgKiBAcGFyYW0gdmlld0lkICAgICAgICBUaGUgY29sbGVjdGlvbiB2aWV3IGlkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNTZXJ2aWNlLm5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChhcHBXaWRnZXRJZHMsIHZpZXdJZCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3lzdGVtIHNlcnZlciBkZWFkPyIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZpZXcgaW4gYWxsIHRoZSBzcGVjaWZpZWQgQXBwV2lkZ2V0IGluc3RhbmNlCisgICAgICogdG8gaW52YWxpZGF0ZSBpdCdzIGN1cnJlbnRseSBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcFdpZGdldElkICBUaGUgQXBwV2lkZ2V0IGluc3RhbmNlIGZvciB3aGljaCB0byBub3RpZnkgb2YgdmlldyBkYXRhIGNoYW5nZXMuCisgICAgICogQHBhcmFtIHZpZXdJZCAgICAgICAgVGhlIGNvbGxlY3Rpb24gdmlldyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnlBcHBXaWRnZXRWaWV3RGF0YUNoYW5nZWQoaW50IGFwcFdpZGdldElkLCBpbnQgdmlld0lkKSB7CisgICAgICAgIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9LCB2aWV3SWQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIEFwcFdpZGdldCBwcm92aWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4KICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIExpc3Q8QXBwV2lkZ2V0UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBzU2VydmljZS5nZXRJbnN0YWxsZWRQcm92aWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8gOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGNvbXBsZXggdG8gZHAuCisgICAgICAgICAgICAgICAgaW5mby5taW5XaWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlLmNvbXBsZXhUb0RpbWVuc2lvblBpeGVsU2l6ZShpbmZvLm1pbldpZHRoLCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgICAgIGluZm8ubWluSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUuY29tcGxleFRvRGltZW5zaW9uUGl4ZWxTaXplKGluZm8ubWluSGVpZ2h0LCBtRGlzcGxheU1ldHJpY3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzeXN0ZW0gc2VydmVyIGRlYWQ/IiwgZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHB3aWRnZXQvQXBwV2lkZ2V0UHJvdmlkZXJJbmZvLmphdmEKaW5kZXggY2VlMjg2NS4uMzk2ZTkyZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwd2lkZ2V0L0FwcFdpZGdldFByb3ZpZGVySW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcHdpZGdldC9BcHBXaWRnZXRQcm92aWRlckluZm8uamF2YQpAQCAtMTEwLDYgKzExMCwxNyBAQAogICAgICAqIEBoaWRlIFBlbmRpbmcgQVBJIGFwcHJvdmFsCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBvbGROYW1lOworICAgIAorICAgIC8qKgorICAgICAqIEEgcHJldmlldyBvZiB3aGF0IHRoZSBBcHBXaWRnZXQgd2lsbCBsb29rIGxpa2UgYWZ0ZXIgaXQncyBjb25maWd1cmVkLgorICAgICAqIElmIG5vdCBzdXBwbGllZCwgdGhlIEFwcFdpZGdldCdzIGljb24gd2lsbCBiZSB1c2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YW5kcm9pZDpwcmV2aWV3SW1hZ2U8L2NvZGU+IGF0dHJpYnV0ZSBpbgorICAgICAqIHRoZSA8Y29kZT4mbHQ7cmVjZWl2ZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKwlwdWJsaWMgaW50IHByZXZpZXdJbWFnZTsKIAogICAgIHB1YmxpYyBBcHBXaWRnZXRQcm92aWRlckluZm8oKSB7CiAgICAgfQpAQCAtMTMwLDYgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5sYWJlbCA9IGluLnJlYWRTdHJpbmcoKTsKICAgICAgICAgdGhpcy5pY29uID0gaW4ucmVhZEludCgpOworICAgICAgICB0aGlzLnByZXZpZXdJbWFnZSA9IGluLnJlYWRJbnQoKTsKICAgICB9CiAKIApAQCAtMTUyLDYgKzE2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgb3V0LndyaXRlU3RyaW5nKHRoaXMubGFiZWwpOwogICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5pY29uKTsKKyAgICAgICAgb3V0LndyaXRlSW50KHRoaXMucHJldmlld0ltYWdlKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQ2xhc3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCmluZGV4IGM3ZmVhOWUuLmM4MzgxYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhDbGFzcy5qYXZhCkBAIC0yNTksNiArMjU5LDEyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9BMkRQID0gMTsKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9GSUxFX09QUCA9IDI7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9ISUQgPSAzOworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfUEFOVSA9IDQ7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9OQVAgPSA1OwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgY2xhc3MgYml0cyBmb3IgcG9zc2libGUgYmx1ZXRvb3RoIHByb2ZpbGUgc3VwcG9ydC4KQEAgLTMyNCw2ICszMzAsMTQgQEAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBQUk9GSUxFX0hJRCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLlBFUklQSEVSQUwpID09IERldmljZS5NYWpvci5QRVJJUEhFUkFMOworICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gUFJPRklMRV9QQU5VIHx8IHByb2ZpbGUgPT0gUFJPRklMRV9OQVApeworICAgICAgICAgICAgLy8gTm8gZ29vZCB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvLCBiYXNlZCBvbiBjbGFzcyBiaXRzLgorICAgICAgICAgICAgaWYgKGhhc1NlcnZpY2UoU2VydmljZS5ORVRXT1JLSU5HKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChnZXREZXZpY2VDbGFzcygpICYgRGV2aWNlLk1ham9yLk5FVFdPUktJTkcpID09IERldmljZS5NYWpvci5ORVRXT1JLSU5HOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUGlja2VyLmphdmEKaW5kZXggMDVlZWQwZS4uNzQxNTcyMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVBpY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQaWNrZXIuamF2YQpAQCAtNjMsNCArNjMsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX0FVRElPID0gMTsKICAgICAvKiogQXNrIGRldmljZSBwaWNrZXIgdG8gc2hvdyBCVCBkZXZpY2VzIHRoYXQgc3VwcG9ydCBPYmplY3QgVHJhbnNmZXIgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxURVJfVFlQRV9UUkFOU0ZFUiA9IDI7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQKKyAgICAgKiBQZXJzb25hbCBBcmVhIE5ldHdvcmtpbmcgVXNlciAoUEFOVSkgcHJvZmlsZSovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMVEVSX1RZUEVfUEFOVSA9IDM7CisgICAgLyoqIEFzayBkZXZpY2UgcGlja2VyIHRvIHNob3cgQlQgZGV2aWNlcyB0aGF0IHN1cHBvcnQgTmV0d29yayBBY2Nlc3MgUG9pbnQgKE5BUCkgcHJvZmlsZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTFRFUl9UWVBFX05BUCA9IDQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOGU2NTVlMi4uMWZkNzE1MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuamF2YQpAQCAtNTgsMTkgKzU4LDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy9TVE9QU0hJUCAtIENoYW5nZSB0byBmYWxzZQogCisgICAgLy8gVE9ETygpOiBSZXN0cnVjdHVyZSB0aGUgc3RhdGUgbWFjaGluZSB0byBtYWtlIGl0IHNjYWxhYmxlIHdpdGggcmVnYXJkIHRvIHByb2ZpbGVzLgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSEZQX09VVEdPSU5HID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hGUF9JTkNPTUlORyA9IDI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9BMkRQX09VVEdPSU5HID0gMzsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfSElEX09VVEdPSU5HID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hJRF9JTkNPTUlORyA9IDY7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hGUF9PVVRHT0lORyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfQTJEUF9JTkNPTUlORyA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfT1VUR09JTkcgPSA1MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9IRlBfSU5DT01JTkcgPSA1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfT1VUR09JTkcgPSA1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0EyRFBfSU5DT01JTkcgPSA1MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0hJRF9PVVRHT0lORyA9IDU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HID0gNTU7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlBBSVIgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TSVRJT05fVE9fU1RBQkxFID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5QQUlSID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fQ09OTkVDVF9QUk9GSUxFUyA9IDEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0lUSU9OX1RPX1NUQUJMRSA9IDEwMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRPX0NPTk5FQ1RfREVMQVkgPSA2MDAwOyAvLyA2IHNlY3MKIApAQCAtNzksNiArODQsOCBAQAogICAgIHByaXZhdGUgSW5jb21pbmdIYW5kc2ZyZWUgbUluY29taW5nSGFuZHNmcmVlID0gbmV3IEluY29taW5nSGFuZHNmcmVlKCk7CiAgICAgcHJpdmF0ZSBJbmNvbWluZ0EyZHAgbUluY29taW5nQTJkcCA9IG5ldyBJbmNvbWluZ0EyZHAoKTsKICAgICBwcml2YXRlIE91dGdvaW5nQTJkcCBtT3V0Z29pbmdBMmRwID0gbmV3IE91dGdvaW5nQTJkcCgpOworICAgIHByaXZhdGUgT3V0Z29pbmdIaWQgbU91dGdvaW5nSGlkID0gbmV3IE91dGdvaW5nSGlkKCk7CisgICAgcHJpdmF0ZSBJbmNvbWluZ0hpZCBtSW5jb21pbmdIaWQgPSBuZXcgSW5jb21pbmdIaWQoKTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIEJsdWV0b290aFNlcnZpY2UgbVNlcnZpY2U7CkBAIC04OSw2ICs5Niw3IEBACiAgICAgcHJpdmF0ZSBCbHVldG9vdGhEZXZpY2UgbURldmljZTsKICAgICBwcml2YXRlIGludCBtSGVhZHNldFN0YXRlOwogICAgIHByaXZhdGUgaW50IG1BMmRwU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUhpZFN0YXRlOwogCiAgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTI1LDYgKzEzMywxOSBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9PSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBtSGlkU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShESVNDT05ORUNUX0hJRF9JTkNPTUlORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKFRSQU5TSVRJT05fVE9fU1RBQkxFKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9BQ0xfQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgIGlmICghZ2V0Q3VycmVudFN0YXRlKCkuZXF1YWxzKG1Cb25kZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlN0YXRlIGlzOiAiICsgZ2V0Q3VycmVudFN0YXRlKCkpOwpAQCAtMTY1LDYgKzE4Niw4IEBACiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0hhbmRzZnJlZSk7CiAgICAgICAgIGFkZFN0YXRlKG1JbmNvbWluZ0EyZHApOwogICAgICAgICBhZGRTdGF0ZShtT3V0Z29pbmdBMmRwKTsKKyAgICAgICAgYWRkU3RhdGUobU91dGdvaW5nSGlkKTsKKyAgICAgICAgYWRkU3RhdGUobUluY29taW5nSGlkKTsKICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1Cb25kZWREZXZpY2UpOwogCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CkBAIC0xNzIsNiArMTk1LDcgQEAKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aERldmljZS5BQ1RJT05fQUNMX0NPTk5FQ1RFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0lOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKIApAQCAtMjI0LDYgKzI0OCwxNCBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1PdXRnb2luZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgICAgICBpZiAobUhlYWRzZXRTdGF0ZSAhPSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9IRlBfT1VUR09JTkcpOwpAQCAtMjMzLDYgKzI2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1IaWRTdGF0ZSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKERJU0NPTk5FQ1RfSElEX09VVEdPSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb21tYW5kKFVOUEFJUik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0LDYgKzI5MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHBTZXJ2aWNlLmdldENvbm5lY3RlZFNpbmtzKCkubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcFNlcnZpY2UuY29ubmVjdFNpbmsobURldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VQcmlvcml0eShtRGV2aWNlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29ubmVjdElucHV0RGV2aWNlKG1EZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNJVElPTl9UT19TVEFCTEU6CkBAIC0zNDIsNiArMzgyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0NPTk5FQ1RfUFJPRklMRVM6CiAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKQEAgLTQwOSw2ICs0NjYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBjYXVzZXMgaW5jb21pbmcgSEZQIHRvIGZhaWwsIGl0IGlzIG1vcmUgb2YgYSBoZWFkc2V0IHByb2JsZW0KICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgYm90aCBjb25uZWN0aW9ucyBhcmUgaW5jb21pbmcgb25lcy4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNDk2LDYgKzU2MCwyMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmNvbWluZ0hpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1zZy53aGF0ID0gbUNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UoZGVmZXJNc2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKICAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOwpAQCAtNTYxLDYgKzY0MiwxMyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQogICAgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUT19DT05ORUNUX1BST0ZJTEVTOgogICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CkBAIC01NzYsNiArNjY0LDE0MyBAQAogICAgIH0KIAogCisgICAgcHJpdmF0ZSBjbGFzcyBPdXRnb2luZ0hpZCBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgbG9nKCJFbnRlcmluZyBPdXRnb2luZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICAgIG1Db21tYW5kID0gZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0OworICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IENPTk5FQ1RfSElEX09VVEdPSU5HICYmCisgICAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfT1VUR09JTkcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvcjogT3V0Z29pbmdIaWQgc3RhdGUgd2l0aCBjb21tYW5kOiIgKyBtQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgICAgaWYgKCFtU3RhdHVzKSBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBsb2coIk91dGdvaW5nSGlkIFN0YXRlLT5Qcm9jZXNzaW5nIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgLy8gZGVmZXIgYWxsIG91dGdvaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hGUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9PVVRHT0lORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5jb21pbmdIYW5kc2ZyZWUpOworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nQTJkcCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2FuY2VsIEhJRCBvdXRnb2luZyBhcyB0aGVyZSBpcyBubyBndWFyYW50ZWUgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBnZXQgY2FuY2VsZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGFscmVhZHkgYmUgY29ubmVjdGVkIGJ1dCB3ZSBtaWdodCBub3QgaGF2ZSBnb3QgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0UuIEhlbmNlLCBubyBwb2ludCBkaXNjb25uZWN0aW5nIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JzdCBjYXNlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGZhaWwsIHJldHJ5LgorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNc2cud2hhdCA9IG1Db21tYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKGRlZmVyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgLy8gQmx1ZXogd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGNvbmZsaWN0cworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUluY29taW5nSGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX0lOQ09NSU5HOgorICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBIRlAuIFNvbWV0aW1lcyBISUQgY29ubmVjdGlvbiBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZmFpbCBkdWUgdG8gdGhlIGRpc2Nvbm5lY3Rpb24gb2YgSEZQLiBTbyBhZGQgYSByZXRyeQorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIEhJRC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTXNnLndoYXQgPSBtQ29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShkZWZlck1zZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLCB3aWxsIGJlIGhhbmRsZWQgYnkgQmx1ZXoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFVOUEFJUjoKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUJvbmRlZERldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgIHByaXZhdGUgY2xhc3MgSW5jb21pbmdIaWQgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXR1cyA9IGZhbHNlOworICAgICAgcHJpdmF0ZSBpbnQgbUNvbW1hbmQ7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgbG9nKCJFbnRlcmluZyBJbmNvbWluZ0hpZCBzdGF0ZSB3aXRoOiAiICsgZ2V0Q3VycmVudE1lc3NhZ2UoKS53aGF0KTsKKyAgICAgICAgICBtQ29tbWFuZCA9IGdldEN1cnJlbnRNZXNzYWdlKCkud2hhdDsKKyAgICAgICAgICBpZiAobUNvbW1hbmQgIT0gQ09OTkVDVF9ISURfSU5DT01JTkcgJiYKKyAgICAgICAgICAgICAgbUNvbW1hbmQgIT0gRElTQ09OTkVDVF9ISURfSU5DT01JTkcpIHsKKyAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3I6IEluY29taW5nSGlkIHN0YXRlIHdpdGggY29tbWFuZDoiICsgbUNvbW1hbmQpOworICAgICAgICAgIH0KKyAgICAgICAgICBtU3RhdHVzID0gcHJvY2Vzc0NvbW1hbmQobUNvbW1hbmQpOworICAgICAgICAgIGlmICghbVN0YXR1cykgc2VuZE1lc3NhZ2UoVFJBTlNJVElPTl9UT19TVEFCTEUpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgIGxvZygiSW5jb21pbmdIaWQgU3RhdGUtPlByb2Nlc3NpbmcgTWVzc2FnZTogIiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgTWVzc2FnZSBkZWZlck1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSEZQX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSEZQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBDT05ORUNUX0EyRFBfT1VUR09JTkc6CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9BMkRQX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfSElEX0lOQ09NSU5HOgorICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgaGFwcGVuIGJ1dCBpZiBkb2VzLCB3ZSBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gRGVwZW5kcyBpZiB0aGUgaGVhZHNldCBjYW4gaGFuZGxlIGl0LgorICAgICAgICAgICAgICAgICAgLy8gSW5jb21pbmcgSElEIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVleiwgRGlzY29ubmVjdCBIRlAKKyAgICAgICAgICAgICAgICAgIC8vIHRoZSBzb2NrZXQgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUX0EyRFBfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUsIHdpbGwgYmUgaGFuZGxlZCBieSBCbHVlegorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgVU5QQUlSOgorICAgICAgICAgICAgICBjYXNlIEFVVE9fQ09OTkVDVF9QUk9GSUxFUzoKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fVE9fU1RBQkxFOgorICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Cb25kZWREZXZpY2UpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgfQorICB9CisKIAogICAgIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbENvbW1hbmQoaW50IGNvbW1hbmQpIHsKICAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ09OTkVDVF9IRlBfT1VUR09JTkcgKSB7CkBAIC02MTksNiArODQ0LDEwIEBACiAgICAgICAgICAgICBjYXNlIENPTk5FQ1RfQTJEUF9JTkNPTUlORzoKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIEJsdWV6IHRha2VzIGNhcmUKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9ISURfT1VUR09JTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmNvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOworICAgICAgICAgICAgY2FzZSBDT05ORUNUX0hJRF9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9IRlBfT1VUR09JTkc6CiAgICAgICAgICAgICAgICAgaWYgKCFtSGVhZHNldFNlcnZpY2VDb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZGVmZXJIZWFkc2V0TWVzc2FnZShjb21tYW5kKTsKQEAgLTY0NSw2ICs4NzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwU2VydmljZS5kaXNjb25uZWN0U2lua0ludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVF9ISURfSU5DT01JTkc6CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RfSElEX09VVEdPSU5HOgorICAgICAgICAgICAgICAgIGlmIChtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UpID09CisgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX0FVVE9fQ09OTkVDVCkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KG1EZXZpY2UsIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKG1EZXZpY2UpOwogICAgICAgICAgICAgY2FzZSBVTlBBSVI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnJlbW92ZUJvbmRJbnRlcm5hbChtRGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNjUzLDYgKzg5MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKwogICAgIC8qcGFja2FnZSovIEJsdWV0b290aERldmljZSBnZXREZXZpY2UoKSB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCmluZGV4IDUzZDZhMzcuLmJlMjFkNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQpAQCAtOTAsNiArOTAsNyBAQAogICAgICAqIHtAbGluayAjRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ01EfSwgYW5kCiAgICAgICoge0BsaW5rICNFWFRSQV9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9BUkdTfS4KICAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USH0gdG8gcmVjZWl2ZS4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UID0KQEAgLTk4LDYgKzk5LDcgQEAKICAgICAvKioKICAgICAgKiBBIFN0cmluZyBleHRyYSBmaWVsZCBpbiB7QGxpbmsgI0FDVElPTl9WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVH0KICAgICAgKiBpbnRlbnRzIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ01EID0KICAgICAgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5oZWFkc2V0LmV4dHJhLlZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NNRCI7CkBAIC0xMDgsNiArMTEwLDcgQEAKICAgICAgKiBjb21tYW5kLgogICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy9UZWNobmljYWwvQXNzaWduZWROdW1iZXJzL2lkZW50aWZpZXJzLmh0bSI+CiAgICAgICogQmx1ZXRvb3RoIFNJRyBBc3NpZ25lZCBOdW1iZXJzIC0gQ29tcGFueSBJZGVudGlmaWVyczwvYT4KKyAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZFTkRPUl9TUEVDSUZJQ19IRUFEU0VUX0VWRU5UX0NPTVBBTllfSUQgPQogICAgICAgICAgICAgImFuZHJvaWQuYmx1ZXRvb3RoLmhlYWRzZXQuZXh0cmEuVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQ09NUEFOWV9JRCI7CkBAIC0xMTYsNiArMTE5LDcgQEAKICAgICAgKiBBIFBhcmNlbGFibGUgU3RyaW5nIGFycmF5IGV4dHJhIGZpZWxkIGluCiAgICAgICoge0BsaW5rICNBQ1RJT05fVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlR9IGludGVudHMgdGhhdCBjb250YWlucwogICAgICAqIHRoZSBhcmd1bWVudHMgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBjb21tYW5kLgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVkVORE9SX1NQRUNJRklDX0hFQURTRVRfRVZFTlRfQVJHUyA9CiAgICAgICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGguaGVhZHNldC5leHRyYS5WRU5ET1JfU1BFQ0lGSUNfSEVBRFNFVF9FVkVOVF9BUkdTIjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhJbnB1dERldmljZS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFB1YmxpYyBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBCbHVldG9vdGggSElEIChJbnB1dCBEZXZpY2UpIFByb2ZpbGUKKyAqCisgKiBCbHVldG9vdGhJbnB1dERldmljZSBpcyBhIHByb3h5IG9iamVjdCB1c2VkIHRvIG1ha2UgY2FsbHMgdG8gQmx1ZXRvb3RoIFNlcnZpY2UKKyAqIHdoaWNoIGhhbmRsZXMgdGhlIEhJRCBwcm9maWxlLgorICoKKyAqIENyZWF0aW5nIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2Ugb2JqZWN0IHdpbGwgaW5pdGlhdGUgYSBiaW5kaW5nIHdpdGggdGhlCisgKiBCbHVldG9vdGggc2VydmljZS4gVXNlcnMgb2YgdGhpcyBvYmplY3Qgc2hvdWxkIGNhbGwgY2xvc2UoKSB3aGVuIHRoZXkKKyAqIGFyZSBmaW5pc2hlZCwgc28gdGhhdCB0aGlzIHByb3h5IG9iamVjdCBjYW4gdW5iaW5kIGZyb20gdGhlIHNlcnZpY2UuCisgKgorICogQ3VycmVudGx5IHRoZSBCbHVldG9vdGggc2VydmljZSBydW5zIGluIHRoZSBzeXN0ZW0gc2VydmVyIGFuZCB0aGlzCisgKiBwcm94eSBvYmplY3Qgd2lsbCBiZSBpbW1lZGlhdGVseSBib3VuZCB0byB0aGUgc2VydmljZSBvbiBjb25zdHJ1Y3Rpb24uCisgKgorICogIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCbHVldG9vdGhJbnB1dERldmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhJbnB1dERldmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5JTlBVVF9ERVZJQ0VfU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5leHRyYS5QUkVWSU9VU19JTlBVVF9ERVZJQ0VfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gaW5wdXQgZGV2aWNlIGhhcyBjaGFuZ2VkLgorICAgICAqIFRoaXMgaW50ZW50IHdpbGwgYWx3YXlzIGNvbnRhaW4gRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLAorICAgICAqIEVYVFJBX1BSRVZJT1VTX0lOUFVUX0RFVklDRV9TVEFURSBhbmQgQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRQorICAgICAqIGV4dHJhcy4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5pbnB1dGRldmljZS5hY3Rpb24uSU5QVVRfREVWSUNFX1NUQVRFX0NIQU5HRUQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRCAgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElORyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBdXRvIGNvbm5lY3Rpb24sIGluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMKKyAgICAgKiBwcmlvcml0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9BVVRPX0NPTk5FQ1QgPSAxMDAwOworICAgIC8qKgorICAgICAqIEluY29taW5nIGFuZCBvdXRnb2luZyBjb25uZWN0aW9uIGFyZSBhbGxvd2VkIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9PTiA9IDEwMDsKKyAgICAvKioKKyAgICAgKiBDb25uZWN0aW9ucyB0byB0aGUgZGV2aWNlIGFyZSBub3QgYWxsb3dlZCBhdCB0aGlzIHByaW9yaXR5IGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX09GRiA9IDA7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcmlvcml0eSBsZXZlbCB3aGVuIHRoZSBkZXZpY2UgaXMgdW5wYWlyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfVU5ERUZJTkVEID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIElCbHVldG9vdGggbVNlcnZpY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgQmx1ZXRvb3RoSW5wdXREZXZpY2UgcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBTZXJ2aWNlIHdoaWNoIGhhbmRsZSB0aGUgSElEIHByb2ZpbGUuCisgICAgICogQHBhcmFtIGMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhJbnB1dERldmljZShDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIgd2hlbiBpdCBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAgICAgbVNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGEgY29ubmVjdGlvbiB0byBhbiBJbnB1dCBkZXZpY2UuCisgICAgICoKKyAgICAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqICBjb25uZWN0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2UoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3RJbnB1dERldmljZSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0SW5wdXREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBhbiBJbnB1dCBEZXZpY2UuCisgICAgICogIFRoaXMgZnVuY3Rpb24gcmV0dXJuIGZhbHNlIG9uIGVycm9yIGFuZCB0cnVlIGlmIHRoZSBkaXNjb25uZWN0aW9uCisgICAgICogIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqICBMaXN0ZW4gZm9yIElOUFVUX0RFVklDRV9TVEFURV9DSEFOR0VEX0FDVElPTiB0byBmaW5kIG91dCB3aGVuCisgICAgICogIGRpc2Nvbm5lY3QgaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiAgQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsIHRydWUgb3RoZXJ3aXNlCisgICAgICogIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJkaXNjb25uZWN0SW5wdXREZXZpY2UoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdElucHV0RGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDaGVjayBpZiBhIHNwZWNpZmllZCBJbnB1dERldmljZSBpcyBjb25uZWN0ZWQuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRydWUgaWYgY29ubmVjdGVkICwgZmFsc2Ugb3RoZXJ3aXNlIGFuZCBvbiBlcnJvci4KKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlQ29ubmVjdGVkKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJpc0lucHV0RGV2aWNlQ29ubmVjdGVkKCIgKyBkZXZpY2UgKyAiKSIpOworICAgICAgICBpbnQgc3RhdGUgPSBnZXRJbnB1dERldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9DT05ORUNURUQpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIENoZWNrIGlmIGFueSBJbnB1dCBEZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhIHVubW9kaWZpYWJsZSBzZXQgb2YgY29ubmVjdGVkIElucHV0IERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEJsdWV0b290aERldmljZT4gZ2V0Q29ubmVjdGVkSW5wdXREZXZpY2VzKCkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqICBAcmV0dXJuIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBJbnB1dCBEZXZpY2UKKyAgICAgKiAgQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImdldElucHV0RGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHByaW9yaXR5IG9mIGFuIGlucHV0IGRldmljZS4KKyAgICAgKgorICAgICAqIFByaW9yaXR5IGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIFByaW9yaXR5IGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKKyAgICAgKiB2YWx1ZXM6CisgICAgICoge0BsaW5rIFBSSU9SSVRZX09OfSwge0BsaW5rIFBSSU9SSVRZX09GRn0sIHtAbGluayBQUklPUklUWV9BVVRPX0NPTk5FQ1R9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBkZXZpY2UuCisgICAgICogQHBhcmFtIHByaW9yaXR5IEludGVnZXIgcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldElucHV0RGV2aWNlUHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CisgICAgICAgIGlmIChEQkcpIGxvZygic2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIiwgIiArIHByaW9yaXR5ICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgcHJpb3JpdHkpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBhbiBJbnB1dCBEZXZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIElucHV0IERldmljZQorICAgICAqIEByZXR1cm4gbm9uLW5lZ2F0aXZlIHByaW9yaXR5LCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5wdXREZXZpY2VQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZ2V0SW5wdXREZXZpY2VQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBQUklPUklUWV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisgICAgICAgIExvZy5kKFRBRywgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjNmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQ7CitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLlNka0NvbnN0YW50LlNka0NvbnN0YW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmx1ZXRvb3RoUGFuIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFBhbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BBTl9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5wYW4uZXh0cmEuU1RBVEUiOworICAgIC8qKiBpbnQgZXh0cmEgZm9yIEFDVElPTl9QQU5fU1RBVEVfQ0hBTkdFRCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRVZJT1VTX1BBTl9TVEFURSA9CisgICAgICAgICJhbmRyb2lkLmJsdWV0b290aC5wYW4uZXh0cmEuUFJFVklPVVNfU1RBVEUiOworCisgICAgLyoqIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgYW4gUEFOIGRldmljZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBUaGlzIGludGVudCB3aWxsIGFsd2F5cyBjb250YWluIEVYVFJBX0RFVklDRV9TVEFURSwKKyAgICAgKiBFWFRSQV9QUkVWSU9VU19ERVZJQ0VfU1RBVEUgYW5kIEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UKKyAgICAgKiBleHRyYXMuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQgPQorICAgICAgICAiYW5kcm9pZC5ibHVldG9vdGgucGFuLmFjdGlvbi5TVEFURV9DSEFOR0VEIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BUF9ST0xFID0gIm5hcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFQX0JSSURHRSA9ICJwYW4xIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DT05ORUNUSU9OUyA9IDc7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURUQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkcgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNUSU5HID0gMzsKKworICAgIHByaXZhdGUgZmluYWwgSUJsdWV0b290aCBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBCbHVldG9vdGhQYW4gcHJveHkgb2JqZWN0IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBsb2NhbAorICAgICAqIEJsdWV0b290aCBQYW4gc2VydmljZS4KKyAgICAgKiBAcGFyYW0gYyBDb250ZXh0CisgICAgICovCisgICAgcHVibGljIEJsdWV0b290aFBhbihDb250ZXh0IGMpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQmx1ZXRvb3RoQWRhcHRlci5CTFVFVE9PVEhfU0VSVklDRSk7CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUJsdWV0b290aC5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiQmx1ZXRvb3RoIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSEiKTsKKworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gd2hpY2ggcHJldmVudHMgcGVvcGxlIGZyb20gZ29pbmcKKyAgICAgICAgICAgIC8vIGludG8gV2lyZWxlc3Mgc2V0dGluZ3MgaW4gdGhlIGVtdWxhdG9yLiBMZXQgaXQgY3Jhc2ggbGF0ZXIKKyAgICAgICAgICAgIC8vIHdoZW4gaXQgaXMgYWN0dWFsbHkgdXNlZC4KKyAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGEgUEFOIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2Ugb24gZXJyb3IgYW5kIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBhdHRlbXB0IGlzIGJlaW5nIG1hZGUuCisgICAgICoKKyAgICAgKiBMaXN0ZW4gZm9yIHtAbGluayAjQUNUSU9OX1BBTl9TVEFURV9DSEFOR0VEfSB0byBmaW5kIG91dCB3aGVuIHRoZQorICAgICAqIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQlQgZGV2aWNlLgorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLCB0cnVlIG90aGVyd2lzZQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgiICsgZGV2aWNlICsgIikiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jb25uZWN0UGFuRGV2aWNlKGRldmljZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGRpc2Nvbm5lY3QgZnJvbSBQQU4uCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybiBmYWxzZSBvbiBlcnJvciBhbmQgdHJ1ZSBpZiB0aGUgZGlzY29ubmVjdGlvbgorICAgICAqIGF0dGVtcHQgaXMgYmVpbmcgbWFkZS4KKyAgICAgKgorICAgICAqIExpc3RlbiBmb3Ige0BsaW5rICNBQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUR9IHRvIGZpbmQgb3V0IHdoZW4KKyAgICAgKiBkaXNjb25uZWN0IGlzIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJUIGRldmljZS4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwgdHJ1ZSBvdGhlcndpc2UKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBpZiAoREJHKSBsb2coImRpc2Nvbm5lY3QoIiArIGRldmljZSArICIpIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZGlzY29ubmVjdFBhbkRldmljZShkZXZpY2UpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogR2V0IHRoZSBzdGF0ZSBvZiBhIFBBTiBEZXZpY2UuCisgICAgKgorICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGludCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIHRoZSBQQU4gY29ubmVjdGlvbgorICAgICoKKyAgICAqICBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCVCBkZXZpY2UuCisgICAgKiAgQHJldHVybiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgUEFOIERldmljZQorICAgICogIEBoaWRlCisgICAgKi8KKyAgIHB1YmxpYyBpbnQgZ2V0UGFuRGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgIGlmIChEQkcpIGxvZygiZ2V0UGFuRGV2aWNlU3RhdGUoIiArIGRldmljZSArICIpIik7CisgICAgICAgdHJ5IHsKKyAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFBhbkRldmljZVN0YXRlKGRldmljZSk7CisgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgIHJldHVybiBTVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgfQorICAgfQorCisgICAvKiogUmV0dXJucyBhIHNldCBvZiBhbGwgdGhlIGNvbm5lY3RlZCBQQU4gRGV2aWNlcworICAgKgorICAgKiBEb2VzIG5vdCBpbmNsdWRlIGRldmljZXMgdGhhdCBhcmUgY3VycmVudGx5IGNvbm5lY3Rpbmcgb3IgZGlzY29ubmVjdGluZworICAgKgorICAgKiBAcmV0dXJuIGEgdW5tb2RpZmlhYmxlIHNldCBvZiBjb25uZWN0ZWQgUEFOIERldmljZXMsIG9yIG51bGwgb24gZXJyb3IuCisgICAqIEBoaWRlCisgICAqLworICAgcHVibGljIFNldDxCbHVldG9vdGhEZXZpY2U+IGdldENvbm5lY3RlZERldmljZXMoKSB7CisgICAgICBpZiAoREJHKSBsb2coImdldENvbm5lY3RlZERldmljZXMiKTsKKyAgICAgIHRyeSB7CisgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCgKKyAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEJsdWV0b290aERldmljZT4oCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChtU2VydmljZS5nZXRDb25uZWN0ZWRQYW5EZXZpY2VzKCkpKSk7CisgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgIExvZy5lKFRBRywgIiIsIGUpOworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgeworICAgICAgICBMb2cuZChUQUcsIG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNldEJsdWV0b290aFRldGhlcmluZyh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICIiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGV0aGVyaW5nT24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuaXNUZXRoZXJpbmdPbigpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLmphdmEKaW5kZXggOTQ2ZGNhYS4uYWQ3MGQwZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGVTdGF0ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlU3RhdGUuamF2YQpAQCAtNDMsOCArNDMsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsgLy8gU1RPUFNISVAgLSBjaGFuZ2UgdG8gZmFsc2UuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhQcm9maWxlU3RhdGUiOwogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgSEZQID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBBMkRQID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRlAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEEyRFAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhJRCA9IDI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgVFJBTlNJVElPTl9UT19TVEFCTEUgPSAxMDA7CiAKQEAgLTcwLDYgKzcxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSkgewogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2ZpbGUgPT0gSElEICYmIChuZXdTdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShUUkFOU0lUSU9OX1RPX1NUQUJMRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTg0LDYgKzkxLDcgQEAKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQpOwogICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFV1aWQuamF2YQppbmRleCA0MTY0YTNkLi4zZmJmYzcwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVXVpZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhVdWlkLmphdmEKQEAgLTQ5LDEwICs0OSwxOCBAQAogICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEwQy0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgT2JleE9iamVjdFB1c2ggPQogICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTEwNS0wMDAwLTEwMDAtODAwMC0wMDgwNWY5YjM0ZmIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgSGlkID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMjQtMDAwMC0xMDAwLTgwMDAtMDA4MDVmOWIzNGZiIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIFBBTlUgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMTExNS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbFV1aWQgTkFQID0KKyAgICAgICAgICAgIFBhcmNlbFV1aWQuZnJvbVN0cmluZygiMDAwMDExMTYtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxVdWlkIEJORVAgPQorICAgICAgICAgICAgUGFyY2VsVXVpZC5mcm9tU3RyaW5nKCIwMDAwMDAwZi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkIiKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsVXVpZFtdIFJFU0VSVkVEX1VVSURTID0gewogICAgICAgICBBdWRpb1NpbmssIEF1ZGlvU291cmNlLCBBZHZBdWRpb0Rpc3QsIEhTUCwgSGFuZHNmcmVlLCBBdnJjcENvbnRyb2xsZXIsIEF2cmNwVGFyZ2V0LAotICAgICAgICBPYmV4T2JqZWN0UHVzaH07CisgICAgICAgIE9iZXhPYmplY3RQdXNoLCBQQU5VLCBOQVB9OwogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXVkaW9Tb3VyY2UoUGFyY2VsVXVpZCB1dWlkKSB7CiAgICAgICAgIHJldHVybiB1dWlkLmVxdWFscyhBdWRpb1NvdXJjZSk7CkBAIC04Miw2ICs5MCwyMSBAQAogICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQXZyY3BUYXJnZXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lucHV0RGV2aWNlKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoSGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYW51KFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoUEFOVSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFwKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoTkFQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCbmVwKFBhcmNlbFV1aWQgdXVpZCkgeworICAgICAgICByZXR1cm4gdXVpZC5lcXVhbHMoQk5FUCk7CisgICAgfQogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBQYXJjZWxVdWlkIGlzIHByZXNlbnQgaW4gdXVpZEFycmF5CiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvSUJsdWV0b290aC5haWRsCmluZGV4IGVhNzEwMzQuLmM0YTQwY2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9JQmx1ZXRvb3RoLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0lCbHVldG9vdGguYWlkbApAQCAtMTcsNiArMTcsNyBAQAogcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKIAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGhDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxVdWlkOwogCiAvKioKQEAgLTcyLDQgKzczLDE5IEBACiAgICAgYm9vbGVhbiBjb25uZWN0SGVhZHNldChTdHJpbmcgYWRkcmVzcyk7CiAgICAgYm9vbGVhbiBkaXNjb25uZWN0SGVhZHNldChTdHJpbmcgYWRkcmVzcyk7CiAgICAgYm9vbGVhbiBub3RpZnlJbmNvbWluZ0Nvbm5lY3Rpb24oU3RyaW5nIGFkZHJlc3MpOworCisgICAgLy8gSElEIHByb2ZpbGUgQVBJcworICAgIGJvb2xlYW4gY29ubmVjdElucHV0RGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpOyAgLy8gY2hhbmdlIHRvIFNldDw+IG9uY2UgQUlETCBzdXBwb3J0cworICAgIGludCBnZXRJbnB1dERldmljZVN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIGJvb2xlYW4gc2V0SW5wdXREZXZpY2VQcmlvcml0eShpbiBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpOworICAgIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworCisgICAgYm9vbGVhbiBpc1RldGhlcmluZ09uKCk7CisgICAgdm9pZCBzZXRCbHVldG9vdGhUZXRoZXJpbmcoYm9vbGVhbiB2YWx1ZSk7CisgICAgaW50IGdldFBhbkRldmljZVN0YXRlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOworICAgIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZFBhbkRldmljZXMoKTsKKyAgICBib29sZWFuIGNvbm5lY3RQYW5EZXZpY2UoaW4gQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CisgICAgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlKGluIEJsdWV0b290aERldmljZSBkZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL1Njb1NvY2tldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVhOTlhLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXIuV2FrZUxvY2s7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBUaGUgQW5kcm9pZCBCbHVldG9vdGggQVBJIGlzIG5vdCBmaW5hbGl6ZWQsIGFuZCAqd2lsbCogY2hhbmdlLiBVc2UgYXQgeW91cgotICogb3duIHJpc2suCi0gKgotICogU2ltcGxlIFNDTyBTb2NrZXQuCi0gKiBDdXJyZW50bHkgaW4gQW5kcm9pZCwgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VuZGluZyBkYXRhIG92ZXIgYSBTQ08KLSAqIHNvY2tldCAtIHRoaXMgaXMgbWFuYWdlZCBieSB0aGUgaGFyZHdhcmUgbGluayB0byB0aGUgQmx1ZXRvb3RoIENoaXAuIFRoaXMKLSAqIGNsYXNzIGlzIGluc3RlYWQgaW50ZW5kZWQgZm9yIG1hbmFnZW1lbnQgb2YgdGhlIFNDTyBzb2NrZXQgbGlmZXRpbWUsIAotICogYW5kIGlzIHRhaWxvcmVkIGZvciB1c2Ugd2l0aCB0aGUgaGVhZHNldCAvIGhhbmRzZnJlZSBwcm9maWxlcy4KLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTY29Tb2NrZXQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2NvU29ja2V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWREJHID0gZmFsc2U7ICAvLyBldmVuIG1vcmUgbG9nZ2luZwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVBRFkgPSAxOyAgICAvLyBSZWFkeSBmb3IgdXNlLiBObyB0aHJlYWRzIG9yIHNvY2tldHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9BQ0NFUFQgPSAyOyAgIC8vIGFjY2VwdCgpIHRocmVhZCBydW5uaW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVElORyA9IDM7ICAvLyBjb25uZWN0KCkgdGhyZWFkIHJ1bm5pbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURUQgPSA0OyAgIC8vIGNvbm5lY3RlZCwgd2FpdGluZyBmb3IgY2xvc2UoKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NMT1NFRCA9IDU7ICAgLy8gd2FzIGNvbm5lY3RlZCwgbm93IGNsb3NlZC4KLQotICAgIHByaXZhdGUgaW50IG1TdGF0ZTsKLSAgICBwcml2YXRlIGludCBtTmF0aXZlRGF0YTsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBpbnQgbUFjY2VwdGVkQ29kZTsKLSAgICBwcml2YXRlIGludCBtQ29ubmVjdGVkQ29kZTsKLSAgICBwcml2YXRlIGludCBtQ2xvc2VkQ29kZTsKLQotICAgIHByaXZhdGUgV2FrZUxvY2sgbVdha2VMb2NrOyAgLy8gaGVsZCB3aGlsZSBpbiBTVEFURV9DT05ORUNUSU5HCi0KLSAgICBzdGF0aWMgewotICAgICAgICBjbGFzc0luaXROYXRpdmUoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIHZvaWQgY2xhc3NJbml0TmF0aXZlKCk7Ci0KLSAgICBwdWJsaWMgU2NvU29ja2V0KFBvd2VyTWFuYWdlciBwbSwgSGFuZGxlciBoYW5kbGVyLCBpbnQgYWNjZXB0ZWRDb2RlLCBpbnQgY29ubmVjdGVkQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjbG9zZWRDb2RlKSB7Ci0gICAgICAgIGluaXROYXRpdmUoKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVBRFk7Ci0gICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgbUFjY2VwdGVkQ29kZSA9IGFjY2VwdGVkQ29kZTsKLSAgICAgICAgbUNvbm5lY3RlZENvZGUgPSBjb25uZWN0ZWRDb2RlOwotICAgICAgICBtQ2xvc2VkQ29kZSA9IGNsb3NlZENvZGU7Ci0gICAgICAgIG1XYWtlTG9jayA9IHBtLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgIlNjb1NvY2tldCIpOwotICAgICAgICBtV2FrZUxvY2suc2V0UmVmZXJlbmNlQ291bnRlZChmYWxzZSk7Ci0gICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBDVE9SIik7Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdE5hdGl2ZSgpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChWREJHKSBsb2codGhpcyArICIgU0NPIE9CSkVDVCBEVE9SIik7Ci0gICAgICAgICAgICBkZXN0cm95TmF0aXZlKCk7Ci0gICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkZXN0cm95TmF0aXZlKCk7Ci0KLSAgICAvKiogQ29ubmVjdCB0aGlzIFNDTyBzb2NrZXQgdG8gdGhlIGdpdmVuIEJUIGFkZHJlc3MuCi0gICAgICogIERvZXMgbm90IGJsb2NrLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0KFN0cmluZyBhZGRyZXNzLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoREJHKSBsb2coImNvbm5lY3QoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiY29ubmVjdCgpOiBCYWQgc3RhdGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKLSAgICAgICAgaWYgKGNvbm5lY3ROYXRpdmUoYWRkcmVzcywgbmFtZSkpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja05vdygpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdE5hdGl2ZShTdHJpbmcgYWRkcmVzcywgU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqIEFjY2VwdCBpbmNvbWluZyBTQ08gY29ubmVjdGlvbnMuCi0gICAgICogIERvZXMgbm90IGJsb2NrLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NlcHQoKSB7Ci0gICAgICAgIGlmIChWREJHKSBsb2coImFjY2VwdCgpICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRUFEWSkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJCYWQgc3RhdGUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWNjZXB0TmF0aXZlKCkpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FDQ0VQVDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gYWNjZXB0TmF0aXZlKCk7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZyh0aGlzICsgIiBTQ08gT0JKRUNUIGNsb3NlKCkgbVN0YXRlID0gIiArIG1TdGF0ZSk7Ci0gICAgICAgIGFjcXVpcmVXYWtlTG9jaygpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgIGNsb3NlTmF0aXZlKCk7Ci0gICAgICAgIHJlbGVhc2VXYWtlTG9jaygpOwotICAgIH0KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGNsb3NlTmF0aXZlKCk7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQ29ubmVjdGVkKGludCByZXN1bHQpIHsKLSAgICAgICAgaWYgKFZEQkcpIGxvZyh0aGlzICsgIiBvbkNvbm5lY3RlZCgpIG1TdGF0ZSA9ICIgKyBtU3RhdGUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIlN0cmFuZ2Ugc3RhdGUsIGNsb3NpbmcgIiArIG1TdGF0ZSArICIgIiArIHRoaXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQ0xPU0VEOwotICAgICAgICB9Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UobUNvbm5lY3RlZENvZGUsIG1TdGF0ZSwgLTEsIHRoaXMpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICByZWxlYXNlV2FrZUxvY2tOb3coKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9uQWNjZXB0ZWQoaW50IHJlc3VsdCkgewotICAgICAgICBpZiAoVkRCRykgbG9nKCJvbkFjY2VwdGVkKCkgIiArIHRoaXMpOwotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDQ0VQVCkgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJTdHJhbmdlIHN0YXRlICIgKyB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NMT1NFRDsKLSAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1BY2NlcHRlZENvZGUsIG1TdGF0ZSwgLTEsIHRoaXMpLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgb25DbG9zZWQoKSB7Ci0gICAgICAgIGlmIChEQkcpIGxvZygib25DbG9zZWQoKSAiICsgdGhpcyk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9DTE9TRUQ7Ci0gICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKG1DbG9zZWRDb2RlLCBtU3RhdGUsIC0xLCB0aGlzKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFjcXVpcmVXYWtlTG9jaygpIHsKLSAgICAgICAgaWYgKCFtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJtV2FrZUxvY2suYWNxdWlyZSgpICIgKyB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgICAgIGlmIChtV2FrZUxvY2suaXNIZWxkKCkpIHsKLSAgICAgICAgICAgIC8vIEtlZXAgYXBwcyBwcm9jZXNzb3IgYXdha2UgZm9yIGEgZnVydGhlciAyIHNlY29uZHMuCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB0byByZXNvbHZlIGlzc3VlIGh0dHA6Ly9iLzE2MTYyNjMgLSBpbiB3aGljaAotICAgICAgICAgICAgLy8gd2UgYXJlIGxlZnQgaW4gYSA4MCBtQSBwb3dlciBzdGF0ZSB3aGVuIHJlbW90ZWx5IHRlcm1pbmF0aW5nIGEKLSAgICAgICAgICAgIC8vIGNhbGwgd2hpbGUgY29ubmVjdGVkIHRvIEJUIGhlYWRzZXQgIkhUQyBCSCBTMTAwICIgd2l0aCBBMkRQIGFuZAotICAgICAgICAgICAgLy8gSEZQIHByb2ZpbGVzLgotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLnJlbGVhc2UoKSBpbiAyIHNlYyIgKyB0aGlzKTsKLSAgICAgICAgICAgIG1XYWtlTG9jay5hY3F1aXJlKDIwMDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VXYWtlTG9ja05vdygpIHsKLSAgICAgICAgaWYgKG1XYWtlTG9jay5pc0hlbGQoKSkgewotICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygibVdha2VMb2NrLnJlbGVhc2UoKSBub3ciICsgdGhpcyk7Ci0gICAgICAgICAgICBtV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIExvZy5kKFRBRywgbXNnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0FzeW5jVGFza0xvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTljMDcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Bc3luY1Rhc2tMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CisKKy8qKgorICogQWJzdHJhY3QgTG9hZGVyIHRoYXQgcHJvdmlkZXMgYW4ge0BsaW5rIEFzeW5jVGFza30gdG8gZG8gdGhlIHdvcmsuCisgKgorICogQHBhcmFtIDxEPiB0aGUgZGF0YSB0eXBlIHRvIGJlIGxvYWRlZC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFzeW5jVGFza0xvYWRlcjxEPiBleHRlbmRzIExvYWRlcjxEPiB7CisgICAgZmluYWwgY2xhc3MgTG9hZFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRD4geworCisgICAgICAgIHByaXZhdGUgRCByZXN1bHQ7CisKKyAgICAgICAgLyogUnVucyBvbiBhIHdvcmtlciB0aHJlYWQgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBEIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBc3luY1Rhc2tMb2FkZXIudGhpcy5sb2FkSW5CYWNrZ3JvdW5kKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLyogUnVucyBvbiB0aGUgVUkgdGhyZWFkICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEQgZGF0YSkgeworICAgICAgICAgICAgQXN5bmNUYXNrTG9hZGVyLnRoaXMuZGlzcGF0Y2hPbkxvYWRDb21wbGV0ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIEFzeW5jVGFza0xvYWRlci50aGlzLm9uQ2FuY2VsbGVkKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMb2FkVGFzayBtVGFzazsKKworICAgIHB1YmxpYyBBc3luY1Rhc2tMb2FkZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIGFuIGFzeW5jaHJvbm91cyBsb2FkLiBVbmxpa2Uge0BsaW5rICNzdGFydExvYWRpbmcoKX0gdGhpcyB3aWxsIGlnbm9yZSBhIHByZXZpb3VzbHkKKyAgICAgKiBsb2FkZWQgZGF0YSBzZXQgYW5kIGxvYWQgYSBuZXcgb25lLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvcmNlTG9hZCgpIHsKKyAgICAgICAgY2FuY2VsTG9hZCgpOworICAgICAgICBtVGFzayA9IG5ldyBMb2FkVGFzaygpOworICAgICAgICBtVGFzay5leGVjdXRlKChWb2lkW10pIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHQgdG8gY2FuY2VsIHRoZSBjdXJyZW50IGxvYWQgdGFzay4gU2VlIHtAbGluayBBc3luY1Rhc2sjY2FuY2VsKGJvb2xlYW4pfQorICAgICAqIGZvciBtb3JlIGluZm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD5mYWxzZTwvdHQ+IGlmIHRoZSB0YXNrIGNvdWxkIG5vdCBiZSBjYW5jZWxlZCwKKyAgICAgKiAgICAgICAgIHR5cGljYWxseSBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBub3JtYWxseSwgb3IKKyAgICAgKiAgICAgICAgIGJlY2F1c2Uge0BsaW5rICNzdGFydExvYWRpbmcoKX0gaGFzbid0IGJlZW4gY2FsbGVkLCBhbmQKKyAgICAgKiAgICAgICAgIDx0dD50cnVlPC90dD4gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsTG9hZCgpIHsKKyAgICAgICAgaWYgKG1UYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuY2VsbGVkID0gbVRhc2suY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgIG1UYXNrID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBjYW5jZWxsZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBpZiB0aGUgdGFzayB3YXMgY2FuY2VsZWQgYmVmb3JlIGl0IHdhcyBjb21wbGV0ZWQuICBHaXZlcyB0aGUgY2xhc3MgYSBjaGFuY2UKKyAgICAgKiB0byBwcm9wZXJseSBkaXNwb3NlIG9mIHRoZSByZXN1bHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DYW5jZWxsZWQoRCBkYXRhKSB7CisgICAgfQorCisgICAgdm9pZCBkaXNwYXRjaE9uTG9hZENvbXBsZXRlKEQgZGF0YSkgeworICAgICAgICBtVGFzayA9IG51bGw7CisgICAgICAgIGRlbGl2ZXJSZXN1bHQoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uIGEgd29ya2VyIHRocmVhZCB0byBwZXJmb3JtIHRoZSBhY3R1YWwgbG9hZC4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgZGVsaXZlciB0aGUKKyAgICAgKiByZXN1bHRzIGRpcmVjdGx5LCBidXQgc2hvdWxkIHJldHVybiB0aGVtIGZyb20gdGhpcyBtZXRob2QsIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBlbmQgdXAKKyAgICAgKiBjYWxsaW5nIGRlbGl2ZXJSZXN1bHQgb24gdGhlIFVJIHRocmVhZC4gSWYgaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gcHJvY2VzcworICAgICAqIHRoZSByZXN1bHRzIG9uIHRoZSBVSSB0aHJlYWQgdGhleSBtYXkgb3ZlcnJpZGUgZGVsaXZlclJlc3VsdCBhbmQgZG8gc28KKyAgICAgKiB0aGVyZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbG9hZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBEIGxvYWRJbkJhY2tncm91bmQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmMxMmNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK3BhcmNlbGFibGUgQ2xpcERhdGE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5YjEzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YQpAQCAtMCwwICsxLDQ5NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgY2xpcHBlZCBkYXRhIG9uIHRoZSBjbGlwYm9hcmQuCisgKgorICogPHA+Q2xpcHBlZERhdGEgaXMgYSBjb21wbGV4IHR5cGUgY29udGFpbmluZyBvbmUgb3IgSXRlbSBpbnN0YW5jZXMsCisgKiBlYWNoIG9mIHdoaWNoIGNhbiBob2xkIG9uZSBvciBtb3JlIHJlcHJlc2VudGF0aW9ucyBvZiBhbiBpdGVtIG9mIGRhdGEuCisgKiBGb3IgZGlzcGxheSB0byB0aGUgdXNlciwgaXQgYWxzbyBoYXMgYSBsYWJlbCBhbmQgaWNvbmljIHJlcHJlc2VudGF0aW9uLjwvcD4KKyAqCisgKiA8cD5BIENsaXBEYXRhIGlzIGEgc3ViLWNsYXNzIG9mIHtAbGluayBDbGlwRGVzY3JpcHRpb259LCB3aGljaCBkZXNjcmliZXMKKyAqIGltcG9ydGFudCBtZXRhLWRhdGEgYWJvdXQgdGhlIGNsaXAuICBJbiBwYXJ0aWN1bGFyLCBpdHMge0BsaW5rICNnZXRNaW1lVHlwZShpbnQpfQorICogbXVzdCByZXR1cm4gY29ycmVjdCBNSU1FIHR5cGUocykgZGVzY3JpYmluZyB0aGUgZGF0YSBpbiB0aGUgY2xpcC4gIEZvciBoZWxwCisgKiBpbiBjb3JyZWN0bHkgY29uc3RydWN0aW5nIGEgY2xpcCB3aXRoIHRoZSBjb3JyZWN0IE1JTUUgdHlwZSwgdXNlCisgKiB7QGxpbmsgI25ld1BsYWluVGV4dChDaGFyU2VxdWVuY2UsIEJpdG1hcCwgQ2hhclNlcXVlbmNlKX0sCisgKiB7QGxpbmsgI25ld1VyaShDb250ZW50UmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSwgQml0bWFwLCBVcmkpfSwgYW5kCisgKiB7QGxpbmsgI25ld0ludGVudChDaGFyU2VxdWVuY2UsIEJpdG1hcCwgSW50ZW50KX0uCisgKgorICogPHA+RWFjaCBJdGVtIGluc3RhbmNlIGNhbiBiZSBvbmUgb2YgdGhyZWUgbWFpbiBjbGFzc2VzIG9mIGRhdGE6IGEgc2ltcGxlCisgKiBDaGFyU2VxdWVuY2Ugb2YgdGV4dCwgYSBzaW5nbGUgSW50ZW50IG9iamVjdCwgb3IgYSBVcmkuICBTZWUge0BsaW5rIEl0ZW19CisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIDxhIG5hbWU9IkltcGxlbWVudGluZ1Bhc3RlIj48L2E+CisgKiA8aDM+SW1wbGVtZW50aW5nIFBhc3RlIG9yIERyb3A8L2gzPgorICoKKyAqIDxwPlRvIGltcGxlbWVudCBhIHBhc3RlIG9yIGRyb3Agb2YgYSBDbGlwcGVkRGF0YSBvYmplY3QgaW50byBhbiBhcHBsaWNhdGlvbiwKKyAqIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNvcnJlY3RseSBpbnRlcnByZXQgdGhlIGRhdGEgZm9yIGl0cyB1c2UuICBJZiB0aGUge0BsaW5rIEl0ZW19CisgKiBpdCBjb250YWlucyBpcyBzaW1wbGUgdGV4dCBvciBhbiBJbnRlbnQsIHRoZXJlIGlzIGxpdHRsZSB0byBiZSBkb25lOiB0ZXh0CisgKiBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBhcyB0ZXh0LCBhbmQgYW4gSW50ZW50IHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yCisgKiBjcmVhdGluZyBzaG9ydGN1dHMgKHN1Y2ggYXMgcGxhY2luZyBpY29ucyBvbiB0aGUgaG9tZSBzY3JlZW4pIG9yIG90aGVyCisgKiBhY3Rpb25zLgorICoKKyAqIDxwPklmIGFsbCB5b3Ugd2FudCBpcyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcHBlZCBkYXRhLCB5b3UKKyAqIGNhbiB1c2UgdGhlIGNvbnZlbmllbmNlIG1ldGhvZCB7QGxpbmsgSXRlbSNjb2VyY2VUb1RleHQgSXRlbS5jb2VyY2VUb1RleHR9LgorICogSW4gdGhpcyBjYXNlIHRoZXJlIGlzIGdlbmVyYWxseSBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBNSU1FIHR5cGVzCisgKiByZXBvcnRlZCBieSB7QGxpbmsgI2dldE1pbWVUeXBlKGludCl9LCBzaW5jZSBhbnkgY2xpcCBpdGVtIGFuIGFsd2F5cyBiZQorICogY29udmVydGVkIHRvIGEgc3RyaW5nLgorICoKKyAqIDxwPk1vcmUgY29tcGxpY2F0ZWQgZXhjaGFuZ2VzIHdpbGwgYmUgZG9uZSB0aHJvdWdoIFVSSXMsIGluIHBhcnRpY3VsYXIKKyAqICJjb250ZW50OiIgVVJJcy4gIEEgY29udGVudCBVUkkgYWxsb3dzIHRoZSByZWNpcGllbnQgb2YgYSBDbGlwcGVkRGF0YSBpdGVtCisgKiB0byBpbnRlcmFjdCBjbG9zZWx5IHdpdGggdGhlIENvbnRlbnRQcm92aWRlciBob2xkaW5nIHRoZSBkYXRhIGluIG9yZGVyIHRvCisgKiBuZWdvdGlhdGUgdGhlIHRyYW5zZmVyIG9mIHRoYXQgZGF0YS4gIFRoZSBjbGlwIG11c3QgYWxzbyBiZSBmaWxsZWQgaW4gd2l0aAorICogdGhlIGF2YWlsYWJsZSBNSU1FIHR5cGVzOyB7QGxpbmsgI25ld1VyaShDb250ZW50UmVzb2x2ZXIsIENoYXJTZXF1ZW5jZSwgQml0bWFwLCBVcmkpfQorICogd2lsbCB0YWtlIGNhcmUgb2YgY29ycmVjdGx5IGRvaW5nIHRoaXMuCisgKgorICogPHA+Rm9yIGV4YW1wbGUsIGhlcmUgaXMgdGhlIHBhc3RlIGZ1bmN0aW9uIG9mIGEgc2ltcGxlIE5vdGVQYWQgYXBwbGljYXRpb24uCisgKiBXaGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkLCBpdCBjYW4gZG8gZWl0aGVyIHR3byB0aGluZ3M6CisgKiBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIGEgVVJJIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBub3RlLCBpdCBjb3BpZXMKKyAqIHRoZSBlbnRpcmUgc3RydWN0dXJlIG9mIHRoZSBub3RlIGludG8gYSBuZXcgbm90ZTsgb3RoZXJ3aXNlLCBpdCBzaW1wbHkKKyAqIGNvZXJjZXMgdGhlIGNsaXAgaW50byB0ZXh0IGFuZCB1c2VzIHRoYXQgYXMgdGhlIG5ldyBub3RlJ3MgY29udGVudHMuCisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZUVkaXRvci5qYXZhCisgKiAgICAgIHBhc3RlfQorICoKKyAqIDxwPkluIG1hbnkgY2FzZXMgYW4gYXBwbGljYXRpb24gY2FuIHBhc3RlIHZhcmlvdXMgdHlwZXMgb2Ygc3RyZWFtcyBvZiBkYXRhLiAgRm9yCisgKiBleGFtcGxlLCBhbiBlLW1haWwgYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gcGFzdGUgYW4gaW1hZ2UKKyAqIG9yIG90aGVyIGJpbmFyeSBkYXRhIGFzIGFuIGF0dGFjaG1lbnQuICBUaGlzIGlzIGFjY29tcGxpc2hlZCB0aHJvdWdoIHRoZQorICogQ29udGVudFJlc29sdmVyIHtAbGluayBDb250ZW50UmVzb2x2ZXIjZ2V0U3RyZWFtVHlwZXMoVXJpLCBTdHJpbmcpfSBhbmQKKyAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZywgYW5kcm9pZC5vcy5CdW5kbGUpfQorICogbWV0aG9kcy4gIFRoZXNlIGFsbG93IGEgY2xpZW50IHRvIGRpc2NvdmVyIHRoZSB0eXBlKHMpIG9mIGRhdGEgdGhhdCBhIHBhcnRpY3VsYXIKKyAqIGNvbnRlbnQgVVJJIGNhbiBtYWtlIGF2YWlsYWJsZSBhcyBhIHN0cmVhbSBhbmQgcmV0cmlldmUgdGhlIHN0cmVhbSBvZiBkYXRhLgorICoKKyAqIDxwPkZvciBleGFtcGxlLCB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEl0ZW0jY29lcmNlVG9UZXh0IEl0ZW0uY29lcmNlVG9UZXh0fQorICogaXRzZWxmIHVzZXMgdGhpcyB0byB0cnkgdG8gcmV0cmlldmUgYSBVUkkgY2xpcCBhcyBhIHN0cmVhbSBvZiB0ZXh0OgorICoKKyAqIHtAc2FtcGxlIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEgY29lcmNlVG9UZXh0fQorICoKKyAqIDxhIG5hbWU9IkltcGxlbWVudGluZ0NvcHkiPjwvYT4KKyAqIDxoMz5JbXBsZW1lbnRpbmcgQ29weSBvciBEcmFnPC9oMz4KKyAqCisgKiA8cD5UbyBiZSB0aGUgc291cmNlIG9mIGEgY2xpcCwgdGhlIGFwcGxpY2F0aW9uIG11c3QgY29uc3RydWN0IGEgQ2xpcHBlZERhdGEKKyAqIG9iamVjdCB0aGF0IGFueSByZWNpcGllbnQgY2FuIGludGVycHJldCBiZXN0IGZvciB0aGVpciBjb250ZXh0LiAgSWYgdGhlIGNsaXAKKyAqIGlzIHRvIGNvbnRhaW4gYSBzaW1wbGUgdGV4dCwgSW50ZW50LCBvciBVUkksIHRoaXMgaXMgZWFzeTogYW4ge0BsaW5rIEl0ZW19CisgKiBjb250YWluaW5nIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHR5cGUgY2FuIGJlIGNvbnN0cnVjdGVkIGFuZCB1c2VkLgorICoKKyAqIDxwPk1vcmUgY29tcGxpY2F0ZWQgZGF0YSB0eXBlcyByZXF1aXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdXBwb3J0IGluCisgKiBhIENvbnRlbnRQcm92aWRlciBmb3IgZGVzY3JpYmluZyBhbmQgZ2VuZXJhdGluZyB0aGUgZGF0YSBmb3IgdGhlIHJlY2lwaWVudC4KKyAqIEEgY29tbW9uIHNjZW5hcmlvIGlzIG9uZSB3aGVyZSBhbiBhcHBsaWNhdGlvbiBwbGFjZXMgb24gdGhlIGNsaXBib2FyZCB0aGUKKyAqIGNvbnRlbnQ6IFVSSSBvZiBhbiBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgY29waWVkLCB3aXRoIHRoZSBkYXRhIGF0IHRoYXQKKyAqIFVSSSBjb25zaXN0aW5nIG9mIGEgY29tcGxpY2F0ZWQgc3RydWN0dXJlIHRoYXQgb25seSBvdGhlciBhcHBsaWNhdGlvbnMgd2l0aAorICogZGlyZWN0IGtub3dsZWRnZSBvZiB0aGUgc3RydWN0dXJlIGNhbiB1c2UuCisgKgorICogPHA+Rm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGludHJpbnNpYyBrbm93bGVkZ2Ugb2YgdGhlIGRhdGEgc3RydWN0dXJlLAorICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgaG9sZGluZyBpdCBjYW4gbWFrZSB0aGUgZGF0YSBhdmFpbGFibGUgYXMgYW4gYXJiaXRyYXJ5CisgKiBudW1iZXIgb2YgdHlwZXMgb2YgZGF0YSBzdHJlYW1zLiAgVGhpcyBpcyBkb25lIGJ5IGltcGxlbWVudGluZyB0aGUKKyAqIENvbnRlbnRQcm92aWRlciB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKX0gYW5kCisgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5UeXBlZEFzc2V0RmlsZShVcmksIFN0cmluZywgYW5kcm9pZC5vcy5CdW5kbGUpfQorICogbWV0aG9kcy4KKyAqCisgKiA8cD5Hb2luZyBiYWNrIHRvIG91ciBzaW1wbGUgTm90ZVBhZCBhcHBsaWNhdGlvbiwgdGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGl0IG1heSBoYXZlIHRvIGNvbnZlcnQgYSBzaW5nbGUgbm90ZSBVUkkgKGNvbnNpc3Rpbmcgb2YgYSB0aXRsZSBhbmQgdGhlIG5vdGUKKyAqIHRleHQpIGludG8gYSBzdHJlYW0gb2YgcGxhaW4gdGV4dCBkYXRhLgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlci5qYXZhCisgKiAgICAgIHN0cmVhbX0KKyAqCisgKiA8cD5UaGUgY29weSBvcGVyYXRpb24gaW4gb3VyIE5vdGVQYWQgYXBwbGljYXRpb24gaXMgbm93IGp1c3QgYSBzaW1wbGUgbWF0dGVyCisgKiBvZiBtYWtpbmcgYSBjbGlwIGNvbnRhaW5pbmcgdGhlIFVSSSBvZiB0aGUgbm90ZSBiZWluZyBjb3BpZWQ6CisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEKKyAqICAgICAgY29weX0KKyAqCisgKiA8cD5Ob3RlIGlmIGEgcGFzdGUgb3BlcmF0aW9uIG5lZWRzIHRoaXMgY2xpcCBhcyB0ZXh0IChmb3IgZXhhbXBsZSB0byBwYXN0ZQorICogaW50byBhbiBlZGl0b3IpLCB0aGVuIHtAbGluayBJdGVtI2NvZXJjZVRvVGV4dChDb250ZXh0KX0gd2lsbCBhc2sgdGhlIGNvbnRlbnQKKyAqIHByb3ZpZGVyIGZvciB0aGUgY2xpcCBVUkkgYXMgdGV4dCBhbmQgc3VjY2Vzc2Z1bGx5IHBhc3RlIHRoZSBlbnRpcmUgbm90ZS4KKyAqLworcHVibGljIGNsYXNzIENsaXBEYXRhIGV4dGVuZHMgQ2xpcERlc2NyaXB0aW9uIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlNRVRZUEVTX1RFWFRfUExBSU4gPSBuZXcgU3RyaW5nW10geyBNSU1FVFlQRV9URVhUX1BMQUlOIH07CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19URVhUX1VSSUxJU1QgPSBuZXcgU3RyaW5nW10geyBNSU1FVFlQRV9URVhUX1VSSUxJU1QgfTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlNRVRZUEVTX1RFWFRfSU5URU5UID0gbmV3IFN0cmluZ1tdIHsgTUlNRVRZUEVfVEVYVF9JTlRFTlQgfTsKKworICAgIGZpbmFsIEJpdG1hcCBtSWNvbjsKKworICAgIGZpbmFsIEFycmF5TGlzdDxJdGVtPiBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEl0ZW0+KCk7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBpdGVtIGluIGEgQ2xpcHBlZERhdGEuCisgICAgICoKKyAgICAgKiA8cD5UaGUgdHlwZXMgdGhhbiBhbiBpbmRpdmlkdWFsIGl0ZW0gY2FuIGN1cnJlbnRseSBjb250YWluIGFyZTo8L3A+CisgICAgICoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiBUZXh0OiBhIGJhc2ljIHN0cmluZyBvZiB0ZXh0LiAgVGhpcyBpcyBhY3R1YWxseSBhIENoYXJTZXF1ZW5jZSwKKyAgICAgKiBzbyBpdCBjYW4gYmUgZm9ybWF0dGVkIHRleHQgc3VwcG9ydGVkIGJ5IGNvcnJlc3BvbmRpbmcgQW5kcm9pZCBidWlsdC1pbgorICAgICAqIHN0eWxlIHNwYW5zLiAgKEN1c3RvbSBhcHBsaWNhdGlvbiBzcGFucyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZQorICAgICAqIHN0cmlwcGVkIHdoZW4gdHJhbnNwb3J0aW5nIHRocm91Z2ggdGhlIGNsaXBib2FyZC4pCisgICAgICogPGxpPiBJbnRlbnQ6IGFuIGFyYml0cmFyeSBJbnRlbnQgb2JqZWN0LiAgQSB0eXBpY2FsIHVzZSBpcyB0aGUgc2hvcnRjdXQKKyAgICAgKiB0byBjcmVhdGUgd2hlbiBwYXN0aW5nIGEgY2xpcHBlZCBpdGVtIG9uIHRvIHRoZSBob21lIHNjcmVlbi4KKyAgICAgKiA8bGk+IFVyaTogYSBVUkkgcmVmZXJlbmNlLiAgVGhpcyBtYXkgYmUgYW55IFVSSSAoc3VjaCBhcyBhbiBodHRwOiBVUkkKKyAgICAgKiByZXByZXNlbnRpbmcgYSBib29rbWFyayksIGhvd2V2ZXIgaXQgaXMgb2Z0ZW4gYSBjb250ZW50OiBVUkkuICBVc2luZworICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgcmVmZXJlbmNlcyBhcyBjbGlwcyBsaWtlIHRoaXMgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvCisgICAgICogc2hhcmUgY29tcGxleCBvciBsYXJnZSBjbGlwcyB0aHJvdWdoIHRoZSBzdGFuZGFyZCBjb250ZW50IHByb3ZpZGVyCisgICAgICogZmFjaWxpdGllcy4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSXRlbSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAgICAgZmluYWwgSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIGZpbmFsIFVyaSBtVXJpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGEgc2luZ2xlIGJsb2NrIG9mIChwb3NzaWJseSBzdHlsZWQpIHRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICAgICAgbVRleHQgPSB0ZXh0OworICAgICAgICAgICAgbUludGVudCA9IG51bGw7CisgICAgICAgICAgICBtVXJpID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gSXRlbSBjb25zaXN0aW5nIG9mIGFuIGFyYml0cmFyeSBJbnRlbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlbShJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBtVGV4dCA9IG51bGw7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVVyaSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIEl0ZW0gY29uc2lzdGluZyBvZiBhbiBhcmJpdHJhcnkgVVJJLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oVXJpIHVyaSkgeworICAgICAgICAgICAgbVRleHQgPSBudWxsOworICAgICAgICAgICAgbUludGVudCA9IG51bGw7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGNvbXBsZXggSXRlbSwgY29udGFpbmluZyBtdWx0aXBsZSByZXByZXNlbnRhdGlvbnMgb2YKKyAgICAgICAgICogdGV4dCwgaW50ZW50LCBhbmQvb3IgVVJJLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEl0ZW0oQ2hhclNlcXVlbmNlIHRleHQsIEludGVudCBpbnRlbnQsIFVyaSB1cmkpIHsKKyAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgdGV4dCBjb250YWluZWQgaW4gdGhpcyBJdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgSW50ZW50IGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW50ZW50IGdldEludGVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW50ZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIHRoZSByYXcgVVJJIGNvbnRhaW5lZCBpbiB0aGlzIEl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXJpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR1cm4gdGhpcyBpdGVtIGludG8gdGV4dCwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiBkYXRhIGl0CisgICAgICAgICAqIGFjdHVhbGx5IGNvbnRhaW5zLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGUgYWxnb3JpdGhtIGZvciBkZWNpZGluZyB3aGF0IHRleHQgdG8gcmV0dXJuIGlzOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRUZXh0fSBpcyBub24tbnVsbCwgcmV0dXJuIHRoYXQuCisgICAgICAgICAqIDxsaT4gSWYge0BsaW5rICNnZXRVcml9IGlzIG5vbi1udWxsLCB0cnkgdG8gcmV0cmlldmUgaXRzIGRhdGEKKyAgICAgICAgICogYXMgYSB0ZXh0IHN0cmVhbSBmcm9tIGl0cyBjb250ZW50IHByb3ZpZGVyLiAgSWYgdGhpcyBzdWNjZWVkcywgY29weQorICAgICAgICAgKiB0aGUgdGV4dCBpbnRvIGEgU3RyaW5nIGFuZCByZXR1cm4gaXQuICBJZiBpdCBpcyBub3QgYSBjb250ZW50OiBVUkkgb3IKKyAgICAgICAgICogdGhlIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcGx5IGEgdGV4dCByZXByZXNlbnRhdGlvbiwgcmV0dXJuCisgICAgICAgICAqIHRoZSByYXcgVVJJIGFzIGEgc3RyaW5nLgorICAgICAgICAgKiA8bGk+IElmIHtAbGluayAjZ2V0SW50ZW50fSBpcyBub24tbnVsbCwgY29udmVydCB0aGF0IHRvIGFuIGludGVudDoKKyAgICAgICAgICogVVJJIGFuZCByZXR1cm5pdC4KKyAgICAgICAgICogPGxpPiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsZXIncyBDb250ZXh0LCBmcm9tIHdoaWNoIGl0cyBDb250ZW50UmVzb2x2ZXIKKyAgICAgICAgICogYW5kIG90aGVyIHRoaW5ncyBjYW4gYmUgcmV0cmlldmVkLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGl0ZW0ncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29lcmNlVG9UZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhbiBleHBsaWNpdCB0ZXh0dWFsIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoYXQuCisgICAgICAgICAgICBpZiAobVRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhpcyBJdGVtIGhhcyBhIFVSSSB2YWx1ZSwgdHJ5IHVzaW5nIHRoYXQuCisgICAgICAgICAgICBpZiAobVVyaSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBzZWUgaWYgdGhlIFVSSSBjYW4gYmUgb3BlbmVkIGFzIGEgcGxhaW4gdGV4dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAvLyAob2YgYW55IHN1Yi10eXBlKS4gIElmIHNvLCB0aGlzIGlzIHRoZSBiZXN0IHRleHR1YWwKKyAgICAgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgaXQuCisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXNrIGZvciBhIHN0cmVhbSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGRlc2NyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKG1VcmksICJ0ZXh0LyoiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gZGVzY3IuY3JlYXRlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSwgIlVURi04Iik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gR290IGl0Li4uICBjb3B5IHRoZSBzdHJlYW0gaW50byBhIGxvY2FsIHN0cmluZyBhbmQgcmV0dXJuIGl0LgorICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbODE5Ml07CisgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuPXJlYWRlci5yZWFkKGJ1ZmZlcikpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gb3BlbiBjb250ZW50IFVSSSBhcyB0ZXh0Li4uICBub3QgcmVhbGx5IGFuCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBqdXN0IHNvbWV0aGluZyB0byBpZ25vcmUuCisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkLgorICAgICAgICAgICAgICAgICAgICBMb2cudygiQ2xpcHBlZERhdGEiLCAiRmFpbHVyZSBsb2FkaW5nIHRleHQiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIFVSSSBhcyBhIHN0cmVhbSwgdGhlbiB0aGUgVVJJIGl0c2VsZgorICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IHNlcnZlcyBmYWlybHkgd2VsbCBhcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgICAgcmV0dXJuIG1VcmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluYWxseSwgaWYgYWxsIHdlIGhhdmUgaXMgYW4gSW50ZW50LCB0aGVuIHdlIGNhbiBqdXN0IHR1cm4gdGhhdAorICAgICAgICAgICAgLy8gaW50byB0ZXh0LiAgTm90IHRoZSBtb3N0IHVzZXItZnJpZW5kbHkgdGhpbmcsIGJ1dCBpdCdzIHNvbWV0aGluZy4KKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUludGVudC50b1VyaShJbnRlbnQuVVJJX0lOVEVOVF9TQ0hFTUUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTaG91bGRuJ3QgZ2V0IGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorLy9FTkRfSU5DTFVERShjb2VyY2VUb1RleHQpCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNsaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTGFiZWwgdG8gc2hvdyB0byB0aGUgdXNlciBkZXNjcmliaW5nIHRoaXMgY2xpcC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVzIEFuIGFycmF5IG9mIE1JTUUgdHlwZXMgdGhpcyBkYXRhIGlzIGF2YWlsYWJsZSBhcy4KKyAgICAgKiBAcGFyYW0gaWNvbiBCaXRtYXAgcHJvdmlkaW5nIHRoZSB1c2VyIHdpdGggYW4gaWNvbmluZyByZXByZXNlbnRhdGlvbiBvZgorICAgICAqIHRoZSBjbGlwLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgY2xpcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERhdGEoQ2hhclNlcXVlbmNlIGxhYmVsLCBTdHJpbmdbXSBtaW1lVHlwZXMsIEJpdG1hcCBpY29uLCBJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3VwZXIobGFiZWwsIG1pbWVUeXBlcyk7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlbSBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUljb24gPSBpY29uOworICAgICAgICBtSXRlbXMuYWRkKGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDbGlwRGF0YSBob2xkaW5nIGRhdGEgb2YgdGhlIHR5cGUge0BsaW5rICNNSU1FVFlQRV9URVhUX1BMQUlOfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBVc2VyLXZpc2libGUgbGFiZWwgZm9yIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGljb24gSWNvbmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIHRleHQgVGhlIGFjdHVhbCB0ZXh0IGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld1BsYWluVGV4dChDaGFyU2VxdWVuY2UgbGFiZWwsIEJpdG1hcCBpY29uLCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbSh0ZXh0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShsYWJlbCwgTUlNRVRZUEVTX1RFWFRfUExBSU4sIGljb24sIGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDbGlwRGF0YSBob2xkaW5nIGFuIEludGVudCB3aXRoIE1JTUUgdHlwZSB7QGxpbmsgI01JTUVUWVBFX1RFWFRfSU5URU5UfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBVc2VyLXZpc2libGUgbGFiZWwgZm9yIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGljb24gSWNvbmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGludGVudCBUaGUgYWN0dWFsIEludGVudCBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdJbnRlbnQoQ2hhclNlcXVlbmNlIGxhYmVsLCBCaXRtYXAgaWNvbiwgSW50ZW50IGludGVudCkgeworICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbShpbnRlbnQpOworICAgICAgICByZXR1cm4gbmV3IENsaXBEYXRhKGxhYmVsLCBNSU1FVFlQRVNfVEVYVF9JTlRFTlQsIGljb24sIGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBDbGlwRGF0YSBob2xkaW5nIGEgVVJJLiAgSWYgdGhlIFVSSSBpcyBhIGNvbnRlbnQ6IFVSSSwKKyAgICAgKiB0aGlzIHdpbGwgcXVlcnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBNSU1FIHR5cGUgb2YgaXRzIGRhdGEgYW5kCisgICAgICogdXNlIHRoYXQgYXMgdGhlIE1JTUUgdHlwZS4gIE90aGVyd2lzZSwgaXQgd2lsbCB1c2UgdGhlIE1JTUUgdHlwZQorICAgICAqIHtAbGluayAjTUlNRVRZUEVfVEVYVF9VUklMSVNUfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvbHZlciBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVSSS4KKyAgICAgKiBAcGFyYW0gbGFiZWwgVXNlci12aXNpYmxlIGxhYmVsIGZvciB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSBpY29uIEljb25pYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpcCBkYXRhLgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBpbiB0aGUgY2xpcC4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgQ2xpcERhdGEgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBDbGlwRGF0YSBuZXdVcmkoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBDaGFyU2VxdWVuY2UgbGFiZWwsCisgICAgICAgICAgICBCaXRtYXAgaWNvbiwgVXJpIHVyaSkgeworICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbSh1cmkpOworICAgICAgICBTdHJpbmdbXSBtaW1lVHlwZXMgPSBudWxsOworICAgICAgICBpZiAoImNvbnRlbnQiLmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVhbFR5cGUgPSByZXNvbHZlci5nZXRUeXBlKHVyaSk7CisgICAgICAgICAgICBtaW1lVHlwZXMgPSByZXNvbHZlci5nZXRTdHJlYW1UeXBlcyh1cmksICIqLyoiKTsKKyAgICAgICAgICAgIGlmIChtaW1lVHlwZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlcyA9IG5ldyBTdHJpbmdbXSB7IHJlYWxUeXBlLCBNSU1FVFlQRV9URVhUX1VSSUxJU1QgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRtcCA9IG5ldyBTdHJpbmdbbWltZVR5cGVzLmxlbmd0aCArIChyZWFsVHlwZSAhPSBudWxsID8gMiA6IDEpXTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wWzBdID0gcmVhbFR5cGU7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtaW1lVHlwZXMsIDAsIHRtcCwgaSwgbWltZVR5cGVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgdG1wW2kgKyBtaW1lVHlwZXMubGVuZ3RoXSA9IE1JTUVUWVBFX1RFWFRfVVJJTElTVDsKKyAgICAgICAgICAgICAgICBtaW1lVHlwZXMgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtaW1lVHlwZXMgPSBNSU1FVFlQRVNfVEVYVF9VUklMSVNUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIG1pbWVUeXBlcywgaWNvbiwgaXRlbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgYW4gVVJJIHdpdGggTUlNRSB0eXBlIHtAbGluayAjTUlNRVRZUEVfVEVYVF9VUklMSVNUfS4KKyAgICAgKiBVbmxpa2Uge0BsaW5rICNuZXdVcmkoQ29udGVudFJlc29sdmVyLCBDaGFyU2VxdWVuY2UsIEJpdG1hcCwgVXJpKX0sIG5vdGhpbmcKKyAgICAgKiBpcyBpbmZlcnJlZCBhYm91dCB0aGUgVVJJIC0tIGlmIGl0IGlzIGEgY29udGVudDogVVJJIGhvbGRpbmcgYSBiaXRtYXAsCisgICAgICogdGhlIHJlcG9ydGVkIHR5cGUgd2lsbCBzdGlsbCBiZSB1cmktbGlzdC4gIFVzZSB0aGlzIHdpdGggY2FyZSEKKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBVc2VyLXZpc2libGUgbGFiZWwgZm9yIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIGljb24gSWNvbmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGlwIGRhdGEuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIGluIHRoZSBjbGlwLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBDbGlwRGF0YSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIENsaXBEYXRhIG5ld1Jhd1VyaShDaGFyU2VxdWVuY2UgbGFiZWwsIEJpdG1hcCBpY29uLCBVcmkgdXJpKSB7CisgICAgICAgIEl0ZW0gaXRlbSA9IG5ldyBJdGVtKHVyaSk7CisgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGEobGFiZWwsIE1JTUVUWVBFU19URVhUX1VSSUxJU1QsIGljb24sIGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW0oSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiaXRlbSBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQml0bWFwIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgxKTsKKyAgICAgICAgICAgIG1JY29uLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgTiA9IG1JdGVtcy5zaXplKCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoTik7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgIEl0ZW0gaXRlbSA9IG1JdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChpdGVtLm1UZXh0LCBkZXN0LCBmbGFncyk7CisgICAgICAgICAgICBpZiAoaXRlbS5tSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDEpOworICAgICAgICAgICAgICAgIGl0ZW0ubUludGVudC53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdGVtLm1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgaXRlbS5tVXJpLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ2xpcERhdGEoUGFyY2VsIGluKSB7CisgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgaWYgKGluLnJlYWRJbnQoKSAhPSAwKSB7CisgICAgICAgICAgICBtSWNvbiA9IEJpdG1hcC5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoaW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUljb24gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gaW4ucmVhZEludCgpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gaW4ucmVhZEludCgpICE9IDAgPyBJbnRlbnQuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKSA6IG51bGw7CisgICAgICAgICAgICBVcmkgdXJpID0gaW4ucmVhZEludCgpICE9IDAgPyBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKSA6IG51bGw7CisgICAgICAgICAgICBtSXRlbXMuYWRkKG5ldyBJdGVtKHRleHQsIGludGVudCwgdXJpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGF0YT4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERhdGE+KCkgeworCisgICAgICAgICAgICBwdWJsaWMgQ2xpcERhdGEgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgc291cmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGlwRGF0YShzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpcERhdGFbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcERhdGFbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFmZDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitwYXJjZWxhYmxlIENsaXBEZXNjcmlwdGlvbjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWQ4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIE1ldGEtZGF0YSBkZXNjcmliaW5nIHRoZSBjb250ZW50cyBvZiBhIHtAbGluayBDbGlwRGF0YX0uICBQcm92aWRlcyBlbm91Z2gKKyAqIGluZm9ybWF0aW9uIHRvIGtub3cgaWYgeW91IGNhbiBoYW5kbGUgdGhlIENsaXBEYXRhLCBidXQgbm90IHRoZSBkYXRhCisgKiBpdHNlbGYuCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwRGVzY3JpcHRpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgTUlNRSB0eXBlIGZvciBhIGNsaXAgaG9sZGluZyBwbGFpbiB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVUWVBFX1RFWFRfUExBSU4gPSAidGV4dC9wbGFpbiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUlNRSB0eXBlIGZvciBhIGNsaXAgaG9sZGluZyBvbmUgb3IgbW9yZSBVUklzLiAgVGhpcyBzaG91bGQgYmUKKyAgICAgKiB1c2VkIGZvciBVUklzIHRoYXQgYXJlIG1lYW5pbmdmdWwgdG8gYSB1c2VyIChzdWNoIGFzIGFuIGh0dHA6IFVSSSkuCisgICAgICogSXQgc2hvdWxkIDxlbT5ub3Q8L2VtPiBiZSB1c2VkIGZvciBhIGNvbnRlbnQ6IFVSSSB0aGF0IHJlZmVyZW5jZXMgc29tZQorICAgICAqIG90aGVyIHBpZWNlIG9mIGRhdGE7IGluIHRoYXQgY2FzZSB0aGUgTUlNRSB0eXBlIHNob3VsZCBiZSB0aGUgdHlwZQorICAgICAqIG9mIHRoZSByZWZlcmVuY2VkIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRVRZUEVfVEVYVF9VUklMSVNUID0gInRleHQvdXJpLWxpc3QiOworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgdHlwZSBmb3IgYSBjbGlwIGhvbGRpbmcgYW4gSW50ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVUWVBFX1RFWFRfSU5URU5UID0gInRleHQvdm5kLmFuZHJvaWQuaW50ZW50IjsKKworICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBtTGFiZWw7CisgICAgZmluYWwgU3RyaW5nW10gbU1pbWVUeXBlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjbGlwLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIExhYmVsIHRvIHNob3cgdG8gdGhlIHVzZXIgZGVzY3JpYmluZyB0aGlzIGNsaXAuCisgICAgICogQHBhcmFtIG1pbWVUeXBlcyBBbiBhcnJheSBvZiBNSU1FIHR5cGVzIHRoaXMgZGF0YSBpcyBhdmFpbGFibGUgYXMuCisgICAgICovCisgICAgcHVibGljIENsaXBEZXNjcmlwdGlvbihDaGFyU2VxdWVuY2UgbGFiZWwsIFN0cmluZ1tdIG1pbWVUeXBlcykgeworICAgICAgICBpZiAobWltZVR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibWltZVR5cGVzIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtTGFiZWwgPSBsYWJlbDsKKyAgICAgICAgbU1pbWVUeXBlcyA9IG1pbWVUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIGEgQ2xpcERlc2NyaXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24oQ2xpcERlc2NyaXB0aW9uIG8pIHsKKyAgICAgICAgbUxhYmVsID0gby5tTGFiZWw7CisgICAgICAgIG1NaW1lVHlwZXMgPSBvLm1NaW1lVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIHRvIGNvbXBhcmUgdHdvIE1JTUUgdHlwZXMsIHdoZXJlIG9uZSBtYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBjb25jcmV0ZVR5cGUgQSBmdWxseS1zcGVjaWZpZWQgTUlNRSB0eXBlLgorICAgICAqIEBwYXJhbSBkZXNpcmVkVHlwZSBBIGRlc2lyZWQgTUlNRSB0eXBlIHRoYXQgbWF5IGJlIGEgcGF0dGVybiBzdWNoIGFzICpcLyouCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBNSU1FIHR5cGVzIG1hdGNoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWltZVR5cGVzKFN0cmluZyBjb25jcmV0ZVR5cGUsIFN0cmluZyBkZXNpcmVkVHlwZSkgeworICAgICAgICBmaW5hbCBpbnQgdHlwZUxlbmd0aCA9IGRlc2lyZWRUeXBlLmxlbmd0aCgpOworICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSAzICYmIGRlc2lyZWRUeXBlLmVxdWFscygiKi8qIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHNsYXNocG9zID0gZGVzaXJlZFR5cGUuaW5kZXhPZignLycpOworICAgICAgICBpZiAoc2xhc2hwb3MgPiAwKSB7CisgICAgICAgICAgICBpZiAodHlwZUxlbmd0aCA9PSBzbGFzaHBvcysyICYmIGRlc2lyZWRUeXBlLmNoYXJBdChzbGFzaHBvcysxKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFR5cGUucmVnaW9uTWF0Y2hlcygwLCBjb25jcmV0ZVR5cGUsIDAsIHNsYXNocG9zKzEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzaXJlZFR5cGUuZXF1YWxzKGNvbmNyZXRlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhYmVsIGZvciB0aGlzIGNsaXAuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIG1MYWJlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBjbGlwIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgTUlNRSB0eXBlLiAgTWF5IGJlIGEgcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIE1JTUUgdHlwZXMgaW4gdGhlIGNsaXAgZGVzY3JpcHRpb24KKyAgICAgKiBtYXRjaGVzIHRoZSBkZXNpcmVkIE1JTUUgdHlwZSwgZWxzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1NaW1lVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlTWltZVR5cGVzKG1NaW1lVHlwZXNbaV0sIG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGhlIGNsaXAgZGVzY3JpcHRpb24gTUlNRSB0eXBlcyBieSB0aGUgZ2l2ZW4gTUlNRSB0eXBlLiAgUmV0dXJucworICAgICAqIGFsbCBNSU1FIHR5cGVzIGluIHRoZSBjbGlwIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCBNSU1FIHR5cGUuICBNYXkgYmUgYSBwYXR0ZXJuLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgbWF0Y2hpbmcgTUlNRSB0eXBlcy4gIElmIHRoZXJlIGFyZSBubworICAgICAqIG1hdGNoaW5nIE1JTUUgdHlwZXMsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbHRlck1pbWVUeXBlcyhTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYXJyYXkgPSBudWxsOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbXBhcmVNaW1lVHlwZXMobU1pbWVUeXBlc1tpXSwgbWltZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJyYXkuYWRkKG1NaW1lVHlwZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSByYXdBcnJheSA9IG5ldyBTdHJpbmdbYXJyYXkuc2l6ZSgpXTsKKyAgICAgICAgYXJyYXkudG9BcnJheShyYXdBcnJheSk7CisgICAgICAgIHJldHVybiByYXdBcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBNSU1FIHR5cGVzIHRoZSBjbGlwIGlzIGF2YWlsYWJsZSBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1pbWVUeXBlQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtTWltZVR5cGVzLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gb25lIG9mIHRoZSBwb3NzaWJsZSBjbGlwIE1JTUUgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1NaW1lVHlwZXNbaW5kZXhdOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICBpZiAobU1pbWVUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm51bGwgbWltZSB0eXBlcyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtTWltZVR5cGVzLmxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtdXN0IGhhdmUgYXQgbGVhc3QgMSBtaW1lIHR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1NaW1lVHlwZXNbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibWltZSB0eXBlIGF0ICIgKyBpICsgIiBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChtTGFiZWwsIGRlc3QsIGZsYWdzKTsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KG1NaW1lVHlwZXMpOworICAgIH0KKworICAgIENsaXBEZXNjcmlwdGlvbihQYXJjZWwgaW4pIHsKKyAgICAgICAgbUxhYmVsID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKKyAgICAgICAgbU1pbWVUeXBlcyA9IGluLmNyZWF0ZVN0cmluZ0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8Q2xpcERlc2NyaXB0aW9uPiBDUkVBVE9SID0KKyAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxDbGlwRGVzY3JpcHRpb24+KCkgeworCisgICAgICAgICAgICBwdWJsaWMgQ2xpcERlc2NyaXB0aW9uIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcERlc2NyaXB0aW9uKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb25bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcERlc2NyaXB0aW9uW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBib2FyZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEwNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIEludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkIHNlcnZpY2UsIGZvciBwbGFjaW5nIGFuZCByZXRyaWV2aW5nIHRleHQgaW4KKyAqIHRoZSBnbG9iYWwgY2xpcGJvYXJkLgorICoKKyAqIDxwPgorICogWW91IGRvIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBpbnN0ZWFkLCByZXRyaWV2ZSBpdCB0aHJvdWdoCisgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZX0uCisgKgorICogPHA+CisgKiBUaGUgQ2xpcGJvYXJkTWFuYWdlciBBUEkgaXRzZWxmIGlzIHZlcnkgc2ltcGxlOiBpdCBjb25zaXN0cyBvZiBtZXRob2RzCisgKiB0byBhdG9taWNhbGx5IGdldCBhbmQgc2V0IHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcGJvYXJkIGRhdGEuICBUaGF0IGRhdGEKKyAqIGlzIGV4cHJlc3NlZCBhcyBhIHtAbGluayBDbGlwRGF0YX0gb2JqZWN0LCB3aGljaCBkZWZpbmVzIHRoZSBwcm90b2NvbAorICogZm9yIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiBhcHBsaWNhdGlvbnMuCisgKgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwYm9hcmRNYW5hZ2VyIGV4dGVuZHMgYW5kcm9pZC50ZXh0LkNsaXBib2FyZE1hbmFnZXIgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE9iamVjdCBzU3RhdGljTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBJQ2xpcGJvYXJkIHNTZXJ2aWNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8T25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4gbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycworICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5TdHViIG1QcmltYXJ5Q2xpcENoYW5nZWRTZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgICAgID0gbmV3IElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLlN0dWIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoUHJpbWFyeUNsaXBDaGFuZ2VkKCkgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfUkVQT1JUX1BSSU1BUllfQ0xJUF9DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19SRVBPUlRfUFJJTUFSWV9DTElQX0NIQU5HRUQgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfUkVQT1JUX1BSSU1BUllfQ0xJUF9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICByZXBvcnRQcmltYXJ5Q2xpcENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgeworICAgICAgICB2b2lkIG9uUHJpbWFyeUNsaXBDaGFuZ2VkKCk7CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgSUNsaXBib2FyZCBnZXRTZXJ2aWNlKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNTdGF0aWNMb2NrKSB7CisgICAgICAgICAgICBpZiAoc1NlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpOworICAgICAgICAgICAgc1NlcnZpY2UgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoYik7CisgICAgICAgICAgICByZXR1cm4gc1NlcnZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBDbGlwYm9hcmRNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHByaW1hcnkgY2xpcCBvbiB0aGUgY2xpcGJvYXJkLiAgVGhpcyBpcyB0aGUgY2xpcCB0aGF0CisgICAgICogaXMgaW52b2x2ZWQgaW4gbm9ybWFsIGN1dCBhbmQgcGFzdGUgb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGlwIFRoZSBjbGlwcGVkIGRhdGEgaXRlbSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEgY2xpcCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0U2VydmljZSgpLnNldFByaW1hcnlDbGlwKGNsaXApOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldFByaW1hcnlDbGlwKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBwcmltYXJ5IGNsaXAgb24gdGhlIGNsaXBib2FyZAorICAgICAqIGJ1dCBub3QgYSBjb3B5IG9mIGl0cyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgcHJpbWFyeSBjbGlwIG9uIHRoZSBjbGlwYm9hcmQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmhhc1ByaW1hcnlDbGlwKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcihPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIHdoYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2UoKS5hZGRQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcnMuYWRkKHdoYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB3aGF0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgbVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUod2hhdCk7CisgICAgICAgICAgICBpZiAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2UoKS5yZW1vdmVQcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBDaGFuZ2VkU2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFByaW1hcnlDbGlwKCl9IGluc3RlYWQuICBUaGlzIHJldHJpZXZlcworICAgICAqIHRoZSBwcmltYXJ5IGNsaXAgYW5kIHRyaWVzIHRvIGNvZXJjZSBpdCB0byBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHQoKSB7CisgICAgICAgIENsaXBEYXRhIGNsaXAgPSBnZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBpZiAoY2xpcCAhPSBudWxsICYmIGNsaXAuZ2V0SXRlbUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2xpcC5nZXRJdGVtKDApLmNvZXJjZVRvVGV4dChtQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEpfSBpbnN0ZWFkLiAgVGhpcworICAgICAqIGNyZWF0ZXMgYSBDbGlwcGVkSXRlbSBob2xkaW5nIHRoZSBnaXZlbiB0ZXh0IGFuZCBzZXRzIGl0IGFzIHRoZQorICAgICAqIHByaW1hcnkgY2xpcC4gIEl0IGhhcyBubyBsYWJlbCBvciBpY29uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsIHRleHQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNoYXNQcmltYXJ5Q2xpcCgpfSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmhhc1ByaW1hcnlDbGlwKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlcG9ydFByaW1hcnlDbGlwQ2hhbmdlZCgpIHsKKyAgICAgICAgT2JqZWN0W10gbGlzdGVuZXJzOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVycykgeworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBtUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXJzLnRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICgoT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcilsaXN0ZW5lcnNbaV0pLm9uUHJpbWFyeUNsaXBDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXIuamF2YQppbmRleCBkYzRlOWM0Li5kM2MxYjRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTI4LDEzICsyOCwxNiBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuSUNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIC8qKgpAQCAtNzYsNiArNzksOCBAQAogICogY3Jvc3MtcHJvY2VzcyBjYWxscy48L3A+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBDb21wb25lbnRDYWxsYmFja3MgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29udGVudFByb3ZpZGVyIjsKKwogICAgIC8qCiAgICAgICogTm90ZTogaWYgeW91IGFkZCBtZXRob2RzIHRvIENvbnRlbnRQcm92aWRlciwgeW91IG11c3QgYWRkIHNpbWlsYXIgbWV0aG9kcyB0bwogICAgICAqICAgICAgIE1vY2tDb250ZW50UHJvdmlkZXIuCkBAIC0yNDksNiArMjU0LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyLnRoaXMuY2FsbChtZXRob2QsIHJlcXVlc3QsIGFyZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJlYW1UeXBlcyhVcmkgdXJpLCBTdHJpbmcgbWltZVR5cGVGaWx0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBDb250ZW50UHJvdmlkZXIudGhpcy5nZXRTdHJlYW1UeXBlcyh1cmksIG1pbWVUeXBlRmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVuZm9yY2VSZWFkUGVybWlzc2lvbih1cmkpOworICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmksIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlUmVhZFBlcm1pc3Npb24oVXJpIHVyaSkgewogICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBpZiAodWlkID09IG1NeVVpZCkgewpAQCAtNzUwLDYgKzc2NywxNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBkYXRhIHN0cmVhbXMgdGhhdCB0aGlzCisgICAgICogY29udGVudCBwcm92aWRlciBzdXBwb3J0cyBmb3IgdGhlIGdpdmVuIFVSSS4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsLCBtZWFuaW5nIG5vIHR5cGVzLiAgSWYgeW91ciBjb250ZW50IHByb3ZpZGVyIHN0b3JlcyBkYXRhCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIHR5cGUsIHJldHVybiB0aGF0IE1JTUUgdHlwZSBpZiBpdCBtYXRjaGVzIHRoZSBnaXZlbgorICAgICAqIG1pbWVUeXBlRmlsdGVyLiAgSWYgaXQgY2FuIHBlcmZvcm0gdHlwZSBjb252ZXJzaW9ucywgcmV0dXJuIGFuIGFycmF5CisgICAgICogb2YgYWxsIHN1cHBvcnRlZCBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggbWltZVR5cGVGaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkYXRhIGluIHRoZSBjb250ZW50IHByb3ZpZGVyIGJlaW5nIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSB0eXBlIG9mIGRhdGEgdGhlIGNsaWVudCBkZXNpcmVzLiAgTWF5IGJlCisgICAgICogYSBwYXR0ZXJuLCBzdWNoIGFzICpcLyogdG8gcmV0cmlldmUgYWxsIHBvc3NpYmxlIGRhdGEgdHlwZXMuCisgICAgICogQHJldHVybiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vIHBvc3NpYmxlIGRhdGEgc3RyZWFtcyBmb3IgdGhlCisgICAgICogZ2l2ZW4gbWltZVR5cGVGaWx0ZXIuICBPdGhlcndpc2UgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgYXZhaWxhYmxlCisgICAgICogY29uY3JldGUgTUlNRSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFR5cGUoVXJpKQorICAgICAqIEBzZWUgI29wZW5UeXBlZEFzc2V0RmlsZShVcmksIFN0cmluZywgQnVuZGxlKQorICAgICAqIEBzZWUgQ2xpcERlc2NyaXB0aW9uI2NvbXBhcmVNaW1lVHlwZXMoU3RyaW5nLCBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYSBjbGllbnQgdG8gb3BlbiBhIHJlYWQtb25seSBzdHJlYW0gY29udGFpbmluZyBkYXRhIG9mIGEKKyAgICAgKiBwYXJ0aWN1bGFyIE1JTUUgdHlwZS4gIFRoaXMgaXMgbGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpfSwKKyAgICAgKiBleGNlcHQgdGhlIGZpbGUgY2FuIG9ubHkgYmUgcmVhZC1vbmx5IGFuZCB0aGUgY29udGVudCBwcm92aWRlciBtYXkKKyAgICAgKiBwZXJmb3JtIGRhdGEgY29udmVyc2lvbnMgdG8gZ2VuZXJhdGUgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogPHA+VGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY29tcGFyZXMgdGhlIGdpdmVuIG1pbWVUeXBlIGFnYWluc3QgdGhlCisgICAgICogcmVzdWx0IG9mIHtAbGluayAjZ2V0VHlwZShVcmkpfSBhbmQsIGlmIHRoZSBtYXRjaCwgc2ltcGxlIGNhbGxzCisgICAgICoge0BsaW5rICNvcGVuQXNzZXRGaWxlKFVyaSwgU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiA8cD5TZWUge0BsaW5rIENsaXBEYXRhfSBmb3IgZXhhbXBsZXMgb2YgdGhlIHVzZSBhbmQgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGRhdGEgaW4gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgcXVlcmllZC4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgVGhlIHR5cGUgb2YgZGF0YSB0aGUgY2xpZW50IGRlc2lyZXMuICBNYXkgYmUKKyAgICAgKiBhIHBhdHRlcm4sIHN1Y2ggYXMgKlwvKiwgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIHR5cGUKKyAgICAgKiByZXF1aXJlbWVudHM7IGluIHRoaXMgY2FzZSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIHBpY2sgaXRzIGJlc3QKKyAgICAgKiB0eXBlIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLgorICAgICAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBmcm9tIHRoZSBjbGllbnQuICBUaGUgZGVmaW5pdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmVpbmcgY2FsbGVkLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgY2xpZW50IGNhbgorICAgICAqIHJlYWQgZGF0YSBvZiB0aGUgZGVzaXJlZCB0eXBlLgorICAgICAqCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcworICAgICAqIG5vIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVUkkgb3IgdGhlIG1vZGUgaXMgaW52YWxpZC4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIFRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXMKKyAgICAgKiBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgZGF0YS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZQorICAgICAqIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIE1JTUUgdHlwZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFN0cmVhbVR5cGVzKFVyaSwgU3RyaW5nKQorICAgICAqIEBzZWUgI29wZW5Bc3NldEZpbGUoVXJpLCBTdHJpbmcpCisgICAgICogQHNlZSBDbGlwRGVzY3JpcHRpb24jY29tcGFyZU1pbWVUeXBlcyhTdHJpbmcsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGUoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyLCBCdW5kbGUgb3B0cykKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBpZiAoIiovKiIuZXF1YWxzKG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgLy8gSWYgdGhleSBjYW4gdGFrZSBhbnl0aGluZywgdGhlIHVudHlwZWQgb3BlbiBjYWxsIGlzIGdvb2QgZW5vdWdoLgorICAgICAgICAgICAgcmV0dXJuIG9wZW5Bc3NldEZpbGUodXJpLCAiciIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBiYXNlVHlwZSA9IGdldFR5cGUodXJpKTsKKyAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgQ2xpcERlc2NyaXB0aW9uLmNvbXBhcmVNaW1lVHlwZXMoYmFzZVR5cGUsIG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgLy8gVXNlIG9sZCB1bnR5cGVkIG9wZW4gY2FsbCBpZiB0aGlzIHByb3ZpZGVyIGhhcyBhIHR5cGUgZm9yIHRoaXMKKyAgICAgICAgICAgIC8vIFVSSSBhbmQgaXQgbWF0Y2hlcyB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIHJldHVybiBvcGVuQXNzZXRGaWxlKHVyaSwgInIiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW4ndCBvcGVuICIgKyB1cmkgKyAiIGFzIHR5cGUgIiArIG1pbWVUeXBlRmlsdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gd3JpdGUgYSBzdHJlYW0gb2YgZGF0YSB0byBhIHBpcGUuICBVc2Ugd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlblBpcGVIZWxwZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUGlwZURhdGFXcml0ZXI8VD4geworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIGZyb20gYSBiYWNrZ3JvdW5kIHRocmVhZCB0byBzdHJlYW0gZGF0YSBvdXQgdG8gYSBwaXBlLgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHBpcGUgaXMgYmxvY2tpbmcsIHNvIHRoaXMgdGhyZWFkIGNhbiBibG9jayBvbgorICAgICAgICAgKiB3cml0ZXMgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBpZiB0aGUgY2xpZW50IGlzIHNsb3cKKyAgICAgICAgICogYXQgcmVhZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG91dHB1dCBUaGUgcGlwZSB3aGVyZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLiAgVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGNsb3NlZCBmb3IgeW91IHVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBkZXNpcmVkIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLgorICAgICAgICAgKiBAcGFyYW0gb3B0cyBPcHRpb25zIHN1cHBsaWVkIGJ5IGNhbGxlci4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YVRvUGlwZShQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRwdXQsIFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICBCdW5kbGUgb3B0cywgVCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBmb3IgaW1wbGVtZW50aW5nIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlfSwgZm9yCisgICAgICogY3JlYXRpbmcgYSBkYXRhIHBpcGUgYW5kIGJhY2tncm91bmQgdGhyZWFkIGFsbG93aW5nIHlvdSB0byBzdHJlYW0KKyAgICAgKiBnZW5lcmF0ZWQgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyICh0aGUgY2FsbGVyCisgICAgICogaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlc2lyZWQgdHlwZSBvZiBkYXRhIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG9wdHMgT3B0aW9ucyBzdXBwbGllZCBieSBjYWxsZXIuCisgICAgICogQHBhcmFtIGFyZ3MgWW91ciBvd24gY3VzdG9tIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gZnVuYyBJbnRlcmZhY2UgaW1wbGVtZW50aW5nIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkKKyAgICAgKiBzdHJlYW0gdGhlIGRhdGEuCisgICAgICogQHJldHVybiBSZXR1cm5zIGEgbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yIGhvbGRpbmcgdGhlIHJlYWQgc2lkZSBvZgorICAgICAqIHRoZSBwaXBlLiAgVGhpcyBzaG91bGQgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBmb3IgcmVhZGluZzsgdGhlIGNhbGxlcgorICAgICAqIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IHdoZW4gZG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5QaXBlSGVscGVyKGZpbmFsIFVyaSB1cmksIGZpbmFsIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRzLCBmaW5hbCBUIGFyZ3MsIGZpbmFsIFBpcGVEYXRhV3JpdGVyPFQ+IGZ1bmMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gZmRzID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuY3JlYXRlUGlwZSgpOworCisgICAgICAgICAgICBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4gdGFzayA9IG5ldyBBc3luY1Rhc2s8T2JqZWN0LCBPYmplY3QsIE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBkb0luQmFja2dyb3VuZChPYmplY3QuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmMud3JpdGVEYXRhVG9QaXBlKGZkc1sxXSwgdXJpLCBtaW1lVHlwZSwgb3B0cywgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmZHNbMV0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbHVyZSBjbG9zaW5nIHBpcGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGFzay5leGVjdXRlKChPYmplY3RbXSludWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIGZkc1swXTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiZmFpbHVyZSBtYWtpbmcgcGlwZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdGFuY2UgaXMgYSB0ZW1wb3JhcnkgY29udGVudCBwcm92aWRlci4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0YW5jZSBpcyBhIHRlbXBvcmFyeSBjb250ZW50IHByb3ZpZGVyCiAgICAgICovCkBAIC03NzUsNiArOTMwLDExIEBACiAgICAgICogQHBhcmFtIGluZm8gUmVnaXN0ZXJlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhdHRhY2hJbmZvKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJJbmZvIGluZm8pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgbWF5IGJlIHVzaW5nIEFzeW5jVGFzayBmcm9tIGJpbmRlciB0aHJlYWRzLiAgTWFrZSBpdCBpbml0IGhlcmUKKyAgICAgICAgICogc28gaXRzIHN0YXRpYyBoYW5kbGVyIGlzIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzeW5jVGFzay5pbml0KCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT25seSBhbGxvdyBpdCB0byBiZSBzZXQgb25jZSwgc28gYWZ0ZXIgdGhlIGNvbnRlbnQgc2VydmljZSBnaXZlcwpAQCAtODIzLDcgKzk4Myw3IEBACiAgICAgLyoqCiAgICAgICogQGhpZGUgLS0gdW50aWwgaW50ZXJmYWNlIGhhcyBwcm92ZW4gaXRzZWxmCiAgICAgICoKLSAgICAgKiBDYWxsIGFuIHByb3ZpZGVyLWRlZmluZWQgbWV0aG9kLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKyAgICAgKiBDYWxsIGEgcHJvdmlkZXItZGVmaW5lZCBtZXRob2QuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAogICAgICAqIGludGVyZmFjZXMgdGhhdCBhcmUgY2hlYXBlciB0aGFuIHVzaW5nIGEgQ3Vyc29yLgogICAgICAqCiAgICAgICogQHBhcmFtIG1ldGhvZCBNZXRob2QgbmFtZSB0byBjYWxsLiAgT3BhcXVlIHRvIGZyYW1ld29yay4KQEAgLTgzMyw0ICs5OTMsMzEgQEAKICAgICBwdWJsaWMgQnVuZGxlIGNhbGwoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIHJlcXVlc3QsIEJ1bmRsZSBhcmdzKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGlzIHRvIHNodXQgZG93biB0aGUgQ29udGVudFByb3ZpZGVyIGluc3RhbmNlLiBZb3UgY2FuIHRoZW4KKyAgICAgKiBpbnZva2UgdGhpcyBtZXRob2QgaW4gdW5pdCB0ZXN0cy4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBBbmRyb2lkIG5vcm1hbGx5IGhhbmRsZXMgQ29udGVudFByb3ZpZGVyIHN0YXJ0dXAgYW5kIHNodXRkb3duCisgICAgICogYXV0b21hdGljYWxseS4gWW91IGRvIG5vdCBuZWVkIHRvIHN0YXJ0IHVwIG9yIHNodXQgZG93biBhCisgICAgICogQ29udGVudFByb3ZpZGVyLiBXaGVuIHlvdSBpbnZva2UgYSB0ZXN0IG1ldGhvZCBvbiBhIENvbnRlbnRQcm92aWRlciwKKyAgICAgKiBob3dldmVyLCBhIENvbnRlbnRQcm92aWRlciBpbnN0YW5jZSBpcyBzdGFydGVkIGFuZCBrZWVwcyBydW5uaW5nIGFmdGVyCisgICAgICogdGhlIHRlc3QgZmluaXNoZXMsIGV2ZW4gaWYgYSBzdWNjZWVkaW5nIHRlc3QgaW5zdGFudGlhdGVzIGFub3RoZXIKKyAgICAgKiBDb250ZW50UHJvdmlkZXIuIEEgY29uZmxpY3QgZGV2ZWxvcHMgYmVjYXVzZSB0aGUgdHdvIGluc3RhbmNlcyBhcmUKKyAgICAgKiB1c3VhbGx5IHJ1bm5pbmcgYWdhaW5zdCB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlIChmb3IgZXhhbXBsZSwgYW4KKyAgICAgKiBzcWxpdGUgZGF0YWJhc2UpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRpbmcgc2h1dERvd24oKSBhdm9pZHMgdGhpcyBjb25mbGljdCBieSBwcm92aWRpbmcgYSB3YXkgdG8KKyAgICAgKiB0ZXJtaW5hdGUgdGhlIENvbnRlbnRQcm92aWRlci4gVGhpcyBtZXRob2QgY2FuIGFsc28gcHJldmVudCBtZW1vcnkgbGVha3MKKyAgICAgKiBmcm9tIG11bHRpcGxlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBDb250ZW50UHJvdmlkZXIsIGFuZCBpdCBjYW4gZW5zdXJlCisgICAgICogdW5pdCB0ZXN0IGlzb2xhdGlvbiBieSBhbGxvd2luZyB5b3UgdG8gY29tcGxldGVseSBjbGVhbiB1cCB0aGUgdGVzdAorICAgICAqIGZpeHR1cmUgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCB0ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgTG9nLncoVEFHLCAiaW1wbGVtZW50IENvbnRlbnRQcm92aWRlciBzaHV0ZG93bigpIHRvIG1ha2Ugc3VyZSBhbGwgZGF0YWJhc2UgIiArCisgICAgICAgICAgICAgICAgImNvbm5lY3Rpb25zIGFyZSBncmFjZWZ1bGx5IHNodXRkb3duIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyQ2xpZW50LmphdmEKaW5kZXggMDg1OGVhNS4uMDU0MDEwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlckNsaWVudC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CkBAIC00Myw1MyArNDQsNzcgQEAKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjcXVlcnl9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3F1ZXJ5IENvbnRlbnRQcm92aWRlci5xdWVyeX0gKi8KICAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmwsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCiAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIucXVlcnkodXJsLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sICBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRUeXBlfSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNnZXRUeXBlIENvbnRlbnRQcm92aWRlci5nZXRUeXBlfSAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJsKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZ2V0VHlwZSh1cmwpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNpbnNlcnR9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2dldFN0cmVhbVR5cGVzIENvbnRlbnRQcm92aWRlci5nZXRTdHJlYW1UeXBlc30gKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIuZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgfQorCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2luc2VydCBDb250ZW50UHJvdmlkZXIuaW5zZXJ0fSAqLwogICAgIHB1YmxpYyBVcmkgaW5zZXJ0KFVyaSB1cmwsIENvbnRlbnRWYWx1ZXMgaW5pdGlhbFZhbHVlcykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5pbnNlcnQodXJsLCBpbml0aWFsVmFsdWVzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYnVsa0luc2VydH0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjYnVsa0luc2VydCBDb250ZW50UHJvdmlkZXIuYnVsa0luc2VydH0gKi8KICAgICBwdWJsaWMgaW50IGJ1bGtJbnNlcnQoVXJpIHVybCwgQ29udGVudFZhbHVlc1tdIGluaXRpYWxWYWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5idWxrSW5zZXJ0KHVybCwgaW5pdGlhbFZhbHVlcyk7CiAgICAgfQogCi0gICAgLyoqIHNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI2RlbGV0ZX0gKi8KKyAgICAvKiogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjZGVsZXRlIENvbnRlbnRQcm92aWRlci5kZWxldGV9ICovCiAgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVybCwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5kZWxldGUodXJsLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciN1cGRhdGV9ICovCisgICAgLyoqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI3VwZGF0ZSBDb250ZW50UHJvdmlkZXIudXBkYXRlfSAqLwogICAgIHB1YmxpYyBpbnQgdXBkYXRlKFVyaSB1cmwsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLCBTdHJpbmcgc2VsZWN0aW9uLAogICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLnVwZGF0ZSh1cmwsIHZhbHVlcywgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzKTsKICAgICB9CiAKLSAgICAvKiogc2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGV9ICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5GaWxlfS4gIE5vdGUgdGhhdAorICAgICAqIHRoaXMgPGVtPmRvZXMgbm90PC9lbT4KKyAgICAgKiB0YWtlIGNhcmUgb2Ygbm9uLWNvbnRlbnQ6IFVSSXMgc3VjaCBhcyBmaWxlOi4gIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisgICAgICogeW91IHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuRmlsZURlc2NyaXB0b3IKKyAgICAgKiBDb250ZW50UmVzb2x2ZXIub3BlbkZpbGVEZXNjcmlwdG9yfSBBUEkgaW5zdGVhZC4KKyAgICAgKi8KICAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuRmlsZSh1cmwsIG1vZGUpOwogICAgIH0KIAotICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuQXNzZXRGaWxlfSAqLworICAgIC8qKgorICAgICAqIFNlZSB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5Bc3NldEZpbGV9LgorICAgICAqIE5vdGUgdGhhdCB0aGlzIDxlbT5kb2VzIG5vdDwvZW0+CisgICAgICogdGFrZSBjYXJlIG9mIG5vbi1jb250ZW50OiBVUklzIHN1Y2ggYXMgZmlsZTouICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAorICAgICAqIHlvdSB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3IKKyAgICAgKiBDb250ZW50UmVzb2x2ZXIub3BlbkFzc2V0RmlsZURlc2NyaXB0b3J9IEFQSSBpbnN0ZWFkLgorICAgICAqLwogICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5Bc3NldEZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbUNvbnRlbnRQcm92aWRlci5vcGVuQXNzZXRGaWxlKHVybCwgbW9kZSk7CiAgICAgfQogCi0gICAgIC8qKiBzZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNhcHBseUJhdGNofSAqLworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuVHlwZWRBc3NldEZpbGUgQ29udGVudFByb3ZpZGVyLm9wZW5UeXBlZEFzc2V0RmlsZX0gKi8KKyAgICBwdWJsaWMgZmluYWwgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSB1cmksCisgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50UHJvdmlkZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGUsIG9wdHMpOworICAgIH0KKworICAgIC8qKiBTZWUge0BsaW5rIENvbnRlbnRQcm92aWRlciNhcHBseUJhdGNoIENvbnRlbnRQcm92aWRlci5hcHBseUJhdGNofSAqLwogICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBPcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtQ29udGVudFByb3ZpZGVyLmFwcGx5QmF0Y2gob3BlcmF0aW9ucyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UHJvdmlkZXJOYXRpdmUuamF2YQppbmRleCBmZGIzZDIwLi5kMWFiOGQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRQcm92aWRlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyTmF0aXZlLmphdmEKQEAgLTI1Nyw2ICsyNTcsMzggQEAKICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVCdW5kbGUocmVzcG9uc2VCdW5kbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgVXJpIHVybCA9IFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZUZpbHRlciA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IGdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlU3RyaW5nQXJyYXkodHlwZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElDb250ZW50UHJvdmlkZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIFVyaSB1cmwgPSBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIG9wdHMgPSBkYXRhLnJlYWRCdW5kbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkOworICAgICAgICAgICAgICAgICAgICBmZCA9IG9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmZC53cml0ZVRvUGFyY2VsKHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxhYmxlLlBBUkNFTEFCTEVfV1JJVEVfUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMud3JpdGVFeGNlcHRpb25Ub1BhcmNlbChyZXBseSwgZSk7CkBAIC01NjgsNSArNjAwLDUwIEBACiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbnRlbnRQcm92aWRlci5kZXNjcmlwdG9yKTsKKworICAgICAgICB1cmwud3JpdGVUb1BhcmNlbChkYXRhLCAwKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhtaW1lVHlwZUZpbHRlcik7CisKKyAgICAgICAgbVJlbW90ZS50cmFuc2FjdChJQ29udGVudFByb3ZpZGVyLkdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKworICAgICAgICBEYXRhYmFzZVV0aWxzLnJlYWRFeGNlcHRpb25Gcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgU3RyaW5nW10gb3V0ID0gcmVwbHkuY3JlYXRlU3RyaW5nQXJyYXkoKTsKKworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworCisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29udGVudFByb3ZpZGVyLmRlc2NyaXB0b3IpOworCisgICAgICAgIHVybC53cml0ZVRvUGFyY2VsKGRhdGEsIDApOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nKG1pbWVUeXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUJ1bmRsZShvcHRzKTsKKworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KElDb250ZW50UHJvdmlkZXIuT1BFTl9UWVBFRF9BU1NFVF9GSUxFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisKKyAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uV2l0aEZpbGVOb3RGb3VuZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBpbnQgaGFzID0gcmVwbHkucmVhZEludCgpOworICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gaGFzICE9IDAKKyAgICAgICAgICAgICAgICA/IEFzc2V0RmlsZURlc2NyaXB0b3IuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHJlcGx5KSA6IG51bGw7CisKKyAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CisgICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKKworICAgICAgICByZXR1cm4gZmQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBJQmluZGVyIG1SZW1vdGU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UXVlcnlNYXAuamF2YQppbmRleCBkYmNiNGE3Li5jOTU1MDk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRRdWVyeU1hcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFF1ZXJ5TWFwLmphdmEKQEAgLTEyOSw3ICsxMjksOSBAQAogICAgIC8qKiBSZXF1ZXJpZXMgdGhlIGN1cnNvciBhbmQgcmVhZHMgdGhlIGNvbnRlbnRzIGludG8gdGhlIGNhY2hlICovCiAgICAgcHVibGljIHZvaWQgcmVxdWVyeSgpIHsKICAgICAgICAgbURpcnR5ID0gZmFsc2U7Ci0gICAgICAgIG1DdXJzb3IucmVxdWVyeSgpOworICAgICAgICBpZiAoIW1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IiKTsKKyAgICAgICAgfQogICAgICAgICByZWFkQ3Vyc29ySW50b0NhY2hlKCk7CiAgICAgICAgIHNldENoYW5nZWQoKTsKICAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50UmVzb2x2ZXIuamF2YQppbmRleCA2OWY3NjExLi4yMmZlYjlhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRSZXNvbHZlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFJlc29sdmVyLmphdmEKQEAgLTQ0LDkgKzQ0LDkgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIAogLyoqCkBAIC0xODYsOCArMTg2LDcgQEAKICAgICAgKiB1c2luZyB0aGUgY29udGVudDovLyBzY2hlbWUuCiAgICAgICogQHJldHVybiBBIE1JTUUgdHlwZSBmb3IgdGhlIGNvbnRlbnQsIG9yIG51bGwgaWYgdGhlIFVSTCBpcyBpbnZhbGlkIG9yIHRoZSB0eXBlIGlzIHVua25vd24KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFR5cGUoVXJpIHVybCkKLSAgICB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUeXBlKFVyaSB1cmwpIHsKICAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmwpOwogICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0yMDQsNiArMjAzLDM5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUXVlcnkgZm9yIHRoZSBwb3NzaWJsZSBNSU1FIHR5cGVzIGZvciB0aGUgcmVwcmVzZW50YXRpb25zIHRoZSBnaXZlbgorICAgICAqIGNvbnRlbnQgVVJMIGNhbiBiZSByZXR1cm5lZCB3aGVuIG9wZW5lZCBhcyBhcyBzdHJlYW0gd2l0aAorICAgICAqIHtAbGluayAjb3BlblR5cGVkQXNzZXRGaWxlRGVzY3JpcHRvcn0uICBOb3RlIHRoYXQgdGhlIHR5cGVzIGhlcmUgYXJlCisgICAgICogbm90IG5lY2Vzc2FyaWx5IGEgc3VwZXJzZXQgb2YgdGhlIHR5cGUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlfSAtLQorICAgICAqIG1hbnkgY29udGVudCBwcm92aWRlcnMgY2FuIG5vdCByZXR1cm4gYSByYXcgc3RyZWFtIGZvciB0aGUgc3RydWN0dXJlZAorICAgICAqIGRhdGEgdGhhdCB0aGV5IGNvbnRhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIEEgVXJpIGlkZW50aWZ5aW5nIGNvbnRlbnQgKGVpdGhlciBhIGxpc3Qgb3Igc3BlY2lmaWMgdHlwZSksCisgICAgICogdXNpbmcgdGhlIGNvbnRlbnQ6Ly8gc2NoZW1lLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZUZpbHRlciBUaGUgZGVzaXJlZCBNSU1FIHR5cGUuICBUaGlzIG1heSBiZSBhIHBhdHRlcm4sCisgICAgICogc3VjaCBhcyAqXC8qLCB0byBxdWVyeSBmb3IgYWxsIGF2YWlsYWJsZSBNSU1FIHR5cGVzIHRoYXQgbWF0Y2ggdGhlCisgICAgICogcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gYXJyYXkgb2YgTUlNRSB0eXBlIHN0cmluZ3MgZm9yIGFsbCBhdmFpbGFibGxlCisgICAgICogZGF0YSBzdHJlYW1zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIG1pbWVUeXBlRmlsdGVyLiAgSWYgdGhlcmUgYXJlIG5vbmUsCisgICAgICogbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJsKTsKKyAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U3RyZWFtVHlwZXModXJsLCBtaW1lVHlwZUZpbHRlcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiA8cD4KICAgICAgKiBRdWVyeSB0aGUgZ2l2ZW4gVVJJLCByZXR1cm5pbmcgYSB7QGxpbmsgQ3Vyc29yfSBvdmVyIHRoZSByZXN1bHQgc2V0LgogICAgICAqIDwvcD4KQEAgLTM0OSw3ICszODEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgImNvbnRlbnQ6IiBVUkkuICBUaGlzCisgICAgICogT3BlbiBhIHJhdyBmaWxlIGRlc2NyaXB0b3IgdG8gYWNjZXNzIGRhdGEgdW5kZXIgYSBVUkkuICBUaGlzCiAgICAgICogaXMgbGlrZSB7QGxpbmsgI29wZW5Bc3NldEZpbGVEZXNjcmlwdG9yKFVyaSwgU3RyaW5nKX0sIGJ1dCB1c2VzIHRoZQogICAgICAqIHVuZGVybHlpbmcge0BsaW5rIENvbnRlbnRQcm92aWRlciNvcGVuRmlsZX0KICAgICAgKiBDb250ZW50UHJvdmlkZXIub3BlbkZpbGUoKX0gbWV0aG9kLCBzbyB3aWxsIDxlbT5ub3Q8L2VtPiB3b3JrIHdpdGgKQEAgLTM5OSwxMCArNDMxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhICJjb250ZW50OiIgVVJJLiAgVGhpcworICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyBkYXRhIHVuZGVyIGEgVVJJLiAgVGhpcwogICAgICAqIGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIHtAbGluayBDb250ZW50UHJvdmlkZXIjb3BlbkFzc2V0RmlsZX0KLSAgICAgKiBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZSgpfSBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBVUkksIHRvIHJldHJpZXZlIGFueSBmaWxlIHN0b3JlZCB0aGVyZS4KKyAgICAgKiBtZXRob2Qgb2YgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSBhbnkgZmlsZSBzdG9yZWQgdGhlcmUuCiAgICAgICoKICAgICAgKiA8aDU+QWNjZXB0cyB0aGUgZm9sbG93aW5nIFVSSSBzY2hlbWVzOjwvaDU+CiAgICAgICogPHVsPgpAQCAtNDM0LDYgKzQ2NSwxMSBAQAogICAgICAqIDwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgcmVhZC1vbmx5IGlucHV0IChtb2RlIGlzICJyIikKKyAgICAgKiBvbiBhIGNvbnRlbnQ6IFVSSSwgaXQgd2lsbCBpbnN0ZWFkIGNhbGwge0BsaW5rICNvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yfQorICAgICAqIGZvciB5b3Ugd2l0aCBhIE1JTUUgdHlwZSBvZiAiKlwvKiIuICBUaGlzIGFsbG93cyBzdWNoIGNhbGxlcnMgdG8gYmVuZWZpdAorICAgICAqIGZyb20gYW55IGJ1aWx0LWluIGRhdGEgY29udmVyc2lvbiB0aGF0IGEgcHJvdmlkZXIgaW1wbGVtZW50cy4KKyAgICAgKgogICAgICAqIEBwYXJhbSB1cmkgVGhlIGRlc2lyZWQgVVJJIHRvIG9wZW4uCiAgICAgICogQHBhcmFtIG1vZGUgVGhlIGZpbGUgbW9kZSB0byB1c2UsIGFzIHBlciB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5Bc3NldEZpbGUKICAgICAgKiBDb250ZW50UHJvdmlkZXIub3BlbkFzc2V0RmlsZX0uCkBAIC00NjAsMjkgKzQ5Niw5NyBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh1cmkuZ2V0UGF0aCgpKSwgbW9kZVRvTW9kZSh1cmksIG1vZGUpKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihwZmQsIDAsIC0xKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBwcm92aWRlci5vcGVuQXNzZXRGaWxlKHVyaSwgbW9kZSk7Ci0gICAgICAgICAgICAgICAgaWYoZmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGlmICgiciIuZXF1YWxzKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UeXBlZEFzc2V0RmlsZURlc2NyaXB0b3IodXJpLCAiKi8qIiwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIElDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBhY3F1aXJlUHJvdmlkZXIodXJpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJObyBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRQYXJjZWxGaWxlRGVzY3JpcHRvcigpLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldERlY2xhcmVkTGVuZ3RoKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGZkID0gcHJvdmlkZXIub3BlbkFzc2V0RmlsZSh1cmksIG1vZGUpOworICAgICAgICAgICAgICAgICAgICBpZihmZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgcGZkID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSwgcHJvdmlkZXIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MhICBEb24ndCByZWxlYXNlIHRoZSBwcm92aWRlciB3aGVuIGV4aXRpbmcsIGxldAorICAgICAgICAgICAgICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIGRvIHRoYXQgd2hlbiBpdCBpcyBjbG9zZWQuCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IocGZkLCBmZC5nZXRTdGFydE9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldERlY2xhcmVkTGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkRlYWQgY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gYSByYXcgZmlsZSBkZXNjcmlwdG9yIHRvIGFjY2VzcyAocG90ZW50aWFsbHkgdHlwZSB0cmFuc2Zvcm1lZCkKKyAgICAgKiBkYXRhIGZyb20gYSAiY29udGVudDoiIFVSSS4gIFRoaXMgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcKKyAgICAgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyI29wZW5UeXBlZEFzc2V0RmlsZX0gbWV0aG9kIG9mIHRoZSBwcm92aWRlcgorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJLCB0byByZXRyaWV2ZSByZXRyaWV2ZSBhbnkgYXBwcm9wcmlhdGUKKyAgICAgKiBkYXRhIHN0cmVhbSBmb3IgdGhlIGRhdGEgc3RvcmVkIHRoZXJlLgorICAgICAqCisgICAgICogPHA+VW5saWtlIHtAbGluayAjb3BlbkFzc2V0RmlsZURlc2NyaXB0b3J9LCB0aGlzIGZ1bmN0aW9uIG9ubHkgd29ya3MKKyAgICAgKiB3aXRoICJjb250ZW50OiIgVVJJcywgYmVjYXVzZSBjb250ZW50IHByb3ZpZGVycyBhcmUgdGhlIG9ubHkgZmFjaWxpdHkKKyAgICAgKiB3aXRoIGFuIGFzc29jaWF0ZWQgTUlNRSB0eXBlIHRvIGVuc3VyZSB0aGF0IHRoZSByZXR1cm5lZCBkYXRhIHN0cmVhbQorICAgICAqIGlzIG9mIHRoZSBkZXNpcmVkIHR5cGUuCisgICAgICoKKyAgICAgKiA8cD5BbGwgdGV4dC8qIHN0cmVhbXMgYXJlIGVuY29kZWQgaW4gVVRGLTguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBkZXNpcmVkIFVSSSB0byBvcGVuLgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgZGVzaXJlZCBNSU1FIHR5cGUgb2YgdGhlIHJldHVybmVkIGRhdGEuICBUaGlzIGNhbgorICAgICAqIGJlIGEgcGF0dGVybiBzdWNoIGFzICpcLyosIHdoaWNoIHdpbGwgYWxsb3cgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8KKyAgICAgKiBzZWxlY3QgYSB0eXBlLCB0aG91Z2ggdGhlcmUgaXMgbm8gd2F5IGZvciB5b3UgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZQorICAgICAqIGl0IGlzIHJldHVybmluZy4KKyAgICAgKiBAcGFyYW0gb3B0cyBBZGRpdGlvbmFsIHByb3ZpZGVyLWRlcGVuZGVudCBvcHRpb25zLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvciBmcm9tIHdoaWNoIHlvdSBjYW4gcmVhZCB0aGUKKyAgICAgKiBkYXRhIHN0cmVhbSBmcm9tIHRoZSBwcm92aWRlci4gIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhIHBpcGUsIG1lYW5pbmcKKyAgICAgKiB5b3UgY2FuJ3Qgc2VlayBpbiBpdC4gIFRoZSBvbmx5IHNlZWsgeW91IHNob3VsZCBkbyBpcyBpZiB0aGUKKyAgICAgKiBBc3NldEZpbGVEZXNjcmlwdG9yIGNvbnRhaW5zIGFuIG9mZnNldCwgdG8gbW92ZSB0byB0aGF0IG9mZnNldCBiZWZvcmUKKyAgICAgKiByZWFkaW5nLiAgWW91IG93biB0aGlzIGRlc2NyaXB0b3IgYW5kIGFyZSByZXNwb25zaWJsZSBmb3IgY2xvc2luZyBpdCB3aGVuIGRvbmUuCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBvZiBubworICAgICAqIGRhdGEgb2YgdGhlIGRlc2lyZWQgdHlwZSBleGlzdHMgdW5kZXIgdGhlIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQXNzZXRGaWxlRGVzY3JpcHRvciBvcGVuVHlwZWRBc3NldEZpbGVEZXNjcmlwdG9yKFVyaSB1cmksCisgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGFjcXVpcmVQcm92aWRlcih1cmkpOworICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gY29udGVudCBwcm92aWRlcjogIiArIHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IgZmQgPSBwcm92aWRlci5vcGVuVHlwZWRBc3NldEZpbGUodXJpLCBtaW1lVHlwZSwgb3B0cyk7CisgICAgICAgICAgICBpZiAoZmQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJlbGVhc2VQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVhZCBjb250ZW50IHByb3ZpZGVyOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lcigKKyAgICAgICAgICAgICAgICAgICAgZmQuZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSwgcHJvdmlkZXIpOworCisgICAgICAgICAgICAvLyBTdWNjZXNzISAgRG9uJ3QgcmVsZWFzZSB0aGUgcHJvdmlkZXIgd2hlbiBleGl0aW5nLCBsZXQKKyAgICAgICAgICAgIC8vIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZG8gdGhhdCB3aGVuIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgICAgIHByb3ZpZGVyID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKHBmZCwgZmQuZ2V0U3RhcnRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgZmQuZ2V0RGVjbGFyZWRMZW5ndGgoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJEZWFkIGNvbnRlbnQgcHJvdmlkZXI6ICIgKyB1cmkpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTM0Miw3ICsxNDQ2LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEN1cnNvcldyYXBwZXJJbm5lciBleHRlbmRzIEN1cnNvcldyYXBwZXIgewotICAgICAgICBwcml2YXRlIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ29udGVudFByb3ZpZGVyIG1Db250ZW50UHJvdmlkZXI7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iQ3Vyc29yV3JhcHBlcklubmVyIjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZUZsYWcgPSBmYWxzZTsKIApAQCAtMTM3MSw3ICsxNDc1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFBhcmNlbEZpbGVEZXNjcmlwdG9ySW5uZXIgZXh0ZW5kcyBQYXJjZWxGaWxlRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBtQ29udGVudFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbUNvbnRlbnRQcm92aWRlcjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHPSJQYXJjZWxGaWxlRGVzY3JpcHRvcklubmVyIjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlUHJvdmlkZXJGbGFnID0gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFZhbHVlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEKaW5kZXggNzU3ODdjZC4uY2UwNDdmNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50VmFsdWVzLmphdmEKQEAgLTQ0Niw2ICs0NDYsMTUgQEAKICAgICAgICAgcmV0dXJuIG1WYWx1ZXMuZW50cnlTZXQoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIGFsbCBvZiB0aGUga2V5cworICAgICAqCisgICAgICogQHJldHVybiBhIHNldCBvZiBhbGwgb2YgdGhlIGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gbVZhbHVlcy5rZXlTZXQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxDb250ZW50VmFsdWVzPiBDUkVBVE9SID0KICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8Q29udGVudFZhbHVlcz4oKSB7CiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiZGVwcmVjYXRpb24iLCAidW5jaGVja2VkIn0pCkBAIC00ODgsNiArNDk3LDEwIEBACiAgICAgICAgIHJldHVybiAoQXJyYXlMaXN0PFN0cmluZz4pIG1WYWx1ZXMuZ2V0KGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29uY2lzZSwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICogQHJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKaW5kZXggMDEwMDU1MC4uM2QyOTM3OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEKQEAgLTIxLDEwICsyMSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Nhbm5lckNvbm5lY3Rpb24uT25TY2FuQ29tcGxldGVkTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTU4OCw2ICs1OTAsMzIgQEAKICAgICAgICAgICAgIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnkpOwogCiAgICAgLyoqCisgICAgICogT3BlbiBhIG5ldyBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRleHQncworICAgICAqIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBDcmVhdGVzIHRoZSBkYXRhYmFzZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSAodW5pcXVlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlKSBvZiB0aGUgZGF0YWJhc2UuCisgICAgICogQHBhcmFtIG1vZGUgT3BlcmF0aW5nIG1vZGUuICBVc2UgMCBvciB7QGxpbmsgI01PREVfUFJJVkFURX0gZm9yIHRoZQorICAgICAqICAgICBkZWZhdWx0IG9wZXJhdGlvbiwge0BsaW5rICNNT0RFX1dPUkxEX1JFQURBQkxFfQorICAgICAqICAgICBhbmQge0BsaW5rICNNT0RFX1dPUkxEX1dSSVRFQUJMRX0gdG8gY29udHJvbCBwZXJtaXNzaW9ucy4KKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBBbiBvcHRpb25hbCBmYWN0b3J5IGNsYXNzIHRoYXQgaXMgY2FsbGVkIHRvIGluc3RhbnRpYXRlIGEKKyAgICAgKiAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLgorICAgICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUgdXNlZCB3aGVuIHNxbGl0ZSByZXBvcnRzIGRhdGFiYXNlCisgICAgICogY29ycnVwdGlvbi4gaWYgbnVsbCwge0BsaW5rIGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyfSBpcyBhc3N1bWVkLgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIGEgbmV3bHkgY3JlYXRlZCBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNNT0RFX1BSSVZBVEUKKyAgICAgKiBAc2VlICNNT0RFX1dPUkxEX1JFQURBQkxFCisgICAgICogQHNlZSAjTU9ERV9XT1JMRF9XUklURUFCTEUKKyAgICAgKiBAc2VlICNkZWxldGVEYXRhYmFzZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcik7CisKKyAgICAvKioKICAgICAgKiBEZWxldGUgYW4gZXhpc3RpbmcgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250ZXh0J3MKICAgICAgKiBhcHBsaWNhdGlvbiBwYWNrYWdlLgogICAgICAqCkBAIC0xMzU2LDcgKzEzODQsMTYgQEAKICAgICAgKiBAc2VlIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fU0VSVklDRSA9ICJsb2NhdGlvbiI7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9IHRvIHJldHJpZXZlIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5RGV0ZWN0b3J9IGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdAorICAgICAqIHRoZSB1c2VyIGlzIGluLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVFJZX0RFVEVDVE9SID0gImNvdW50cnlfZGV0ZWN0b3IiOworCiAgICAgLyoqCiAgICAgICogVXNlIHdpdGgge0BsaW5rICNnZXRTeXN0ZW1TZXJ2aWNlfSB0byByZXRyaWV2ZSBhIHtAbGluawogICAgICAqIGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXJ9IGZvciBoYW5kbGluZyBzZWFyY2hlcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGV4dFdyYXBwZXIuamF2YQppbmRleCBhNDQ3MTA4Li4zZjVkMjE1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHRXcmFwcGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0V3JhcHBlci5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKQEAgLTIwNCw2ICsyMDUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUsIGludCBtb2RlLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG5hbWUsIG1vZGUsIGZhY3RvcnksIGVycm9ySGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZGVsZXRlRGF0YWJhc2UoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIG1CYXNlLmRlbGV0ZURhdGFiYXNlKG5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ3Vyc29yTG9hZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTk5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0N1cnNvckxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CisKKy8qKgorICogQSBsb2FkZXIgdGhhdCBxdWVyaWVzIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSBhbmQgcmV0dXJucyBhIHtAbGluayBDdXJzb3J9LgorICovCitwdWJsaWMgY2xhc3MgQ3Vyc29yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrTG9hZGVyPEN1cnNvcj4geworICAgIEN1cnNvciBtQ3Vyc29yOworICAgIEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgYm9vbGVhbiBtU3RvcHBlZDsKKyAgICBVcmkgbVVyaTsKKyAgICBTdHJpbmdbXSBtUHJvamVjdGlvbjsKKyAgICBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICBTdHJpbmcgbVNvcnRPcmRlcjsKKworICAgIC8qIFJ1bnMgb24gYSB3b3JrZXIgdGhyZWFkICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBsb2FkSW5CYWNrZ3JvdW5kKCkgeworICAgICAgICBDdXJzb3IgY3Vyc29yID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KG1VcmksIG1Qcm9qZWN0aW9uLCBtU2VsZWN0aW9uLAorICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzLCBtU29ydE9yZGVyKTsKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBjdXJzb3Igd2luZG93IGlzIGZpbGxlZAorICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1cnNvci5nZXRDb3VudCgpOworICAgICAgICAgICAgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnNvcjsKKyAgICB9CisKKyAgICAvKiBSdW5zIG9uIHRoZSBVSSB0aHJlYWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxpdmVyUmVzdWx0KEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1TdG9wcGVkKSB7CisgICAgICAgICAgICAvLyBBbiBhc3luYyBxdWVyeSBjYW1lIGluIHdoaWxlIHRoZSBsb2FkZXIgaXMgc3RvcHBlZAorICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ3Vyc29yIG9sZEN1cnNvciA9IG1DdXJzb3I7CisgICAgICAgIG1DdXJzb3IgPSBjdXJzb3I7CisgICAgICAgIHN1cGVyLmRlbGl2ZXJSZXN1bHQoY3Vyc29yKTsKKworICAgICAgICBpZiAob2xkQ3Vyc29yICE9IG51bGwgJiYgIW9sZEN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBvbGRDdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDdXJzb3JMb2FkZXIoQ29udGV4dCBjb250ZXh0LCBVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLAorICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbU9ic2VydmVyID0gbmV3IEZvcmNlTG9hZENvbnRlbnRPYnNlcnZlcigpOworICAgICAgICBtVXJpID0gdXJpOworICAgICAgICBtUHJvamVjdGlvbiA9IHByb2plY3Rpb247CisgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgbVNvcnRPcmRlciA9IHNvcnRPcmRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYW4gYXN5bmNocm9ub3VzIGxvYWQgb2YgdGhlIGNvbnRhY3RzIGxpc3QgZGF0YS4gV2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5IHRoZSBjYWxsYmFja3MKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBhIHByZXZpb3VzIGxvYWQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCB2YWxpZAorICAgICAqIHRoZSByZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2tzIGltbWVkaWF0ZWx5LgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRMb2FkaW5nKCkgeworICAgICAgICBtU3RvcHBlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlbGl2ZXJSZXN1bHQobUN1cnNvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JjZUxvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3BMb2FkaW5nKCkgeworICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsICYmICFtQ3Vyc29yLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBtQ3Vyc29yID0gbnVsbDsKKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNhbmNlbCB0aGUgY3VycmVudCBsb2FkIHRhc2sgaWYgcG9zc2libGUuCisgICAgICAgIGNhbmNlbExvYWQoKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbnkgb3V0c3RhbmRpbmcgbG9hZHMgY2xlYW4gdGhlbXNlbHZlcyB1cCBwcm9wZXJseQorICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DYW5jZWxsZWQoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgIWN1cnNvci5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIC8vIEVuc3VyZSB0aGUgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgc3RvcExvYWRpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXJpIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG1Vcmk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXJpKFVyaSB1cmkpIHsKKyAgICAgICAgbVVyaSA9IHVyaTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvamVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9qZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3Rpb24oU3RyaW5nW10gcHJvamVjdGlvbikgeworICAgICAgICBtUHJvamVjdGlvbiA9IHByb2plY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihTdHJpbmcgc2VsZWN0aW9uKSB7CisgICAgICAgIG1TZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlbGVjdGlvbkFyZ3MoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQXJnczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25BcmdzKFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgbVNlbGVjdGlvbkFyZ3MgPSBzZWxlY3Rpb25BcmdzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29ydE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbVNvcnRPcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3J0T3JkZXIoU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICBtU29ydE9yZGVyID0gc29ydE9yZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ2xpcGJvYXJkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxZmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNsaXBib2FyZC5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI7CisKKy8qKgorICogUHJvZ3JhbW1pbmcgaW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQsIHdoaWNoIGFsbG93cyBjb3B5aW5nIGFuZCBwYXN0aW5nCisgKiBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElDbGlwYm9hcmQgeworICAgIHZvaWQgc2V0UHJpbWFyeUNsaXAoaW4gQ2xpcERhdGEgY2xpcCk7CisgICAgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoKTsKKyAgICBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpOworICAgIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKTsKKyAgICB2b2lkIGFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICB2b2lkIHJlbW92ZVByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKGluIElPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNjdlNzU4MS4uOGYxMjJjZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKICAgICBwdWJsaWMgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gYXBwbHlCYXRjaChBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25zKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQXBwbGljYXRpb25FeGNlcHRpb247CisKICAgICAvKioKICAgICAgKiBAaGlkZSAtLSB1bnRpbCBpbnRlcmZhY2UgaGFzIHByb3ZlbiBpdHNlbGYKICAgICAgKgpAQCAtNzEsNiArNzIsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQnVuZGxlIGNhbGwoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIHJlcXVlc3QsIEJ1bmRsZSBhcmdzKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCisgICAgLy8gRGF0YSBpbnRlcmNoYW5nZS4KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVybCwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworCiAgICAgLyogSVBDIGNvbnN0YW50cyAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvciA9ICJhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlciI7CiAKQEAgLTg0LDQgKzkwLDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDE0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBQTFlfQkFUQ0hfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAxOTsKICAgICBzdGF0aWMgZmluYWwgaW50IENBTExfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9TVFJFQU1fVFlQRVNfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IE9QRU5fVFlQRURfQVNTRVRfRklMRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDIyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDJhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0lPblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworb25ld2F5IGludGVyZmFjZSBJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lciB7CisgICAgdm9pZCBkaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKaW5kZXggNzE1NGFlZS4uNGQwYjhiMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCkBAIC01MzQsNiArNTM0LDcgQEAKICAqICAgICA8bGk+IHtAbGluayAjQ0FURUdPUllfQ0FSX0RPQ0t9CiAgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0RFU0tfRE9DS30KICAqICAgICA8bGk+IHtAbGluayAjQ0FURUdPUllfQ0FSX01PREV9CisgKiAgICAgPGxpPiB7QGxpbmsgI0NBVEVHT1JZX0FQUF9NQVJLRVR9CiAgKiA8L3VsPgogICoKICAqIDxoMz5TdGFuZGFyZCBFeHRyYSBEYXRhPC9oMz4KQEAgLTk4NSw2ICs5ODYsMTUgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkFDVElWSVRZX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lOU0VSVCA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uSU5TRVJUIjsKICAgICAvKioKKyAgICAgKiBBY3Rpdml0eSBBY3Rpb246IENyZWF0ZSBhIG5ldyBpdGVtIGluIHRoZSBnaXZlbiBjb250YWluZXIsIGluaXRpYWxpemluZyBpdAorICAgICAqIGZyb20gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4KKyAgICAgKiA8cD5JbnB1dDoge0BsaW5rICNnZXREYXRhfSBpcyBVUkkgb2YgdGhlIGRpcmVjdG9yeSAodm5kLmFuZHJvaWQuY3Vyc29yLmRpci8qKQorICAgICAqIGluIHdoaWNoIHRvIHBsYWNlIHRoZSBkYXRhLgorICAgICAqIDxwPk91dHB1dDogVVJJIG9mIHRoZSBuZXcgZGF0YSB0aGF0IHdhcyBjcmVhdGVkLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFTVEUgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBU1RFIjsKKyAgICAvKioKICAgICAgKiBBY3Rpdml0eSBBY3Rpb246IERlbGV0ZSB0aGUgZ2l2ZW4gZGF0YSBmcm9tIGl0cyBjb250YWluZXIuCiAgICAgICogPHA+SW5wdXQ6IHtAbGluayAjZ2V0RGF0YX0gaXMgVVJJIG9mIGRhdGEgdG8gYmUgZGVsZXRlZC4KICAgICAgKiA8cD5PdXRwdXQ6IG5vdGhpbmcuCkBAIC0yMDAxLDYgKzIwMTEsMTEgQEAKICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLklOVEVOVF9DQVRFR09SWSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FTUJFRCA9ICJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5FTUJFRCI7CiAgICAgLyoqCisgICAgICogVGhpcyBhY3Rpdml0eSBhbGxvd3MgdGhlIHVzZXIgdG8gYnJvd3NlIGFuZCBkb3dubG9hZCBuZXcgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuSU5URU5UX0NBVEVHT1JZKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0FQUF9NQVJLRVQgPSAiYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuQVBQX01BUktFVCI7CisgICAgLyoqCiAgICAgICogVGhpcyBhY3Rpdml0eSBtYXkgYmUgZXhlcmNpc2VkIGJ5IHRoZSBtb25rZXkgb3Igb3RoZXIgYXV0b21hdGVkIHRlc3QgdG9vbHMuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5JTlRFTlRfQ0FURUdPUlkpCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0xvYWRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQwOTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Mb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5jb250ZW50OworCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworCisvKioKKyAqIEFuIGFic3RyYWN0IGNsYXNzIHRoYXQgcGVyZm9ybXMgYXN5bmNocm9ub3VzIGxvYWRpbmcgb2YgZGF0YS4gV2hpbGUgTG9hZGVycyBhcmUgYWN0aXZlCisgKiB0aGV5IHNob3VsZCBtb25pdG9yIHRoZSBzb3VyY2Ugb2YgdGhlaXIgZGF0YSBhbmQgZGVsaXZlciBuZXcgcmVzdWx0cyB3aGVuIHRoZSBjb250ZW50cworICogY2hhbmdlLgorICoKKyAqIEBwYXJhbSA8RD4gVGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIHRoZSBsb2FkIGlzIGNvbXBsZXRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb2FkZXI8RD4geworICAgIGludCBtSWQ7CisgICAgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBtTGlzdGVuZXI7CisgICAgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb3JjZUxvYWRDb250ZW50T2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBwdWJsaWMgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyKCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGVsaXZlclNlbGZOb3RpZmljYXRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBvbkNvbnRlbnRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8RD4geworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIG9uIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSBMb2FkZXIgd2hlbiB0aGUgbG9hZCBpcyBjb21wbGV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGxvYWRlciB0aGUgbG9hZGVyIHRoYXQgY29tcGxldGVkIHRoZSBsb2FkCisgICAgICAgICAqIEBwYXJhbSBkYXRhIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKExvYWRlcjxEPiBsb2FkZXIsIEQgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIGF3YXkgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGNvbnRleHQuIFNpbmNlIExvYWRlcnMgY2FuIGJlIHVzZWQKKyAgICAgKiBhY3Jvc3MgbXVsdGlwbGUgYWN0aXZpdGllcyBpdCdzIGRhbmdlcm91cyB0byBzdG9yZSB0aGUgY29udGV4dCBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHVzZWQgdG8gcmV0cmlldmUgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIExvYWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSByZXN1bHQgb2YgdGhlIGxvYWQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBzdWJjbGFzc2VzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlbGl2ZXJSZXN1bHQoRCBkYXRhKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLm9uTG9hZENvbXBsZXRlKHRoaXMsIGRhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhbiBhcHBsaWNhdGlvbiBjb250ZXh0IHJldHJpZXZlZCBmcm9tIHRoZSBDb250ZXh0IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElEIG9mIHRoaXMgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyB0aGF0IHdpbGwgcmVjZWl2ZSBjYWxsYmFja3Mgd2hlbiBhIGxvYWQgaXMgY29tcGxldGUuIFRoZSBjYWxsYmFja3Mgd2lsbAorICAgICAqIGJlIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkIHNvIGl0J3Mgc2FmZSB0byBwYXNzIHRoZSByZXN1bHRzIHRvIHdpZGdldHMuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKGludCBpZCwgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxEPiBsaXN0ZW5lcikgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIGFscmVhZHkgYSBsaXN0ZW5lciByZWdpc3RlcmVkIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIG1JZCA9IGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihPbkxvYWRDb21wbGV0ZUxpc3RlbmVyPEQ+IGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gbGlzdGVuZXIgcmVnaXN0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxpc3RlbmVyICE9IGxpc3RlbmVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRlbXB0aW5nIHRvIHVucmVnaXN0ZXIgdGhlIHdyb25nIGxpc3RlbmVyIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYW4gYXN5bmNocm9ub3VzIGxvYWQgb2YgdGhlIGNvbnRhY3RzIGxpc3QgZGF0YS4gV2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5IHRoZSBjYWxsYmFja3MKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgVUkgdGhyZWFkLiBJZiBhIHByZXZpb3VzIGxvYWQgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBpcyBzdGlsbCB2YWxpZAorICAgICAqIHRoZSByZXN1bHQgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2tzIGltbWVkaWF0ZWx5LiBUaGUgbG9hZGVyIHdpbGwgbW9uaXRvciB0aGUgc291cmNlIG9mCisgICAgICogdGhlIGRhdGEgc2V0IGFuZCBtYXkgZGVsaXZlciBmdXR1cmUgY2FsbGJhY2tzIGlmIHRoZSBzb3VyY2UgY2hhbmdlcy4gQ2FsbGluZworICAgICAqIHtAbGluayAjc3RvcExvYWRpbmd9IHdpbGwgc3RvcCB0aGUgZGVsaXZlcnkgb2YgY2FsbGJhY2tzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnRMb2FkaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSBhbiBhc3luY2hyb25vdXMgbG9hZC4gVW5saWtlIHtAbGluayAjc3RhcnRMb2FkaW5nKCl9IHRoaXMgd2lsbCBpZ25vcmUgYSBwcmV2aW91c2x5CisgICAgICogbG9hZGVkIGRhdGEgc2V0IGFuZCBsb2FkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmb3JjZUxvYWQoKTsKKworICAgIC8qKgorICAgICAqIFN0b3BzIGRlbGl2ZXJ5IG9mIHVwZGF0ZXMgdW50aWwgdGhlIG5leHQgdGltZSB7QGxpbmsgI3N0YXJ0TG9hZGluZygpfSBpcyBjYWxsZWQKKyAgICAgKgorICAgICAqIE11c3QgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3BMb2FkaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbG9hZGVyIGFuZCBmcmVlcyBpdHMgcmVzb3VyY2VzLCBtYWtpbmcgaXQgdW51c2FibGUuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB7QGxpbmsgRm9yY2VMb2FkQ29udGVudE9ic2VydmVyfSBkZXRlY3RzIGEgY2hhbmdlLiAgQ2FsbHMge0BsaW5rICNmb3JjZUxvYWQoKX0KKyAgICAgKiBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db250ZW50Q2hhbmdlZCgpIHsKKyAgICAgICAgZm9yY2VMb2FkKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU2hhcmVkUHJlZmVyZW5jZXMuamF2YQppbmRleCAxNDg0MjA0Li5jMDc4OGY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1NoYXJlZFByZWZlcmVuY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TaGFyZWRQcmVmZXJlbmNlcy5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBhbmQgbW9kaWZ5aW5nIHByZWZlcmVuY2UgZGF0YSByZXR1cm5lZCBieSB7QGxpbmsKQEAgLTcxLDYgKzcyLDE3IEBACiAgICAgICAgIEVkaXRvciBwdXRTdHJpbmcoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKICAgICAgICAgCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgYSBzZXQgb2YgU3RyaW5nIHZhbHVlcyBpbiB0aGUgcHJlZmVyZW5jZXMgZWRpdG9yLCB0byBiZSB3cml0dGVuCisgICAgICAgICAqIGJhY2sgb25jZSB7QGxpbmsgI2NvbW1pdH0gaXMgY2FsbGVkLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byBtb2RpZnkuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIG5ldyB2YWx1ZXMgZm9yIHRoZSBwcmVmZXJlbmNlLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNhbWUgRWRpdG9yIG9iamVjdCwgc28geW91IGNhbgorICAgICAgICAgKiBjaGFpbiBwdXQgY2FsbHMgdG9nZXRoZXIuCisgICAgICAgICAqLworICAgICAgICBFZGl0b3IgcHV0U3RyaW5nU2V0KFN0cmluZyBrZXksIFNldDxTdHJpbmc+IHZhbHVlcyk7CisgICAgICAgIAorICAgICAgICAvKioKICAgICAgICAgICogU2V0IGFuIGludCB2YWx1ZSBpbiB0aGUgcHJlZmVyZW5jZXMgZWRpdG9yLCB0byBiZSB3cml0dGVuIGJhY2sgb25jZQogICAgICAgICAgKiB7QGxpbmsgI2NvbW1pdH0gb3Ige0BsaW5rICNhcHBseX0gYXJlIGNhbGxlZC4KICAgICAgICAgICogCkBAIC0yMTgsNiArMjMwLDIwIEBACiAgICAgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBTdHJpbmcgZGVmVmFsdWUpOwogICAgIAogICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgc2V0IG9mIFN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcGFyYW0gZGVmVmFsdWVzIFZhbHVlcyB0byByZXR1cm4gaWYgdGhpcyBwcmVmZXJlbmNlIGRvZXMgbm90IGV4aXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSB2YWx1ZXMgaWYgdGhleSBleGlzdCwgb3IgZGVmVmFsdWVzLgorICAgICAqIFRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcmVmZXJlbmNlIHdpdGggdGhpcyBuYW1lCisgICAgICogdGhhdCBpcyBub3QgYSBTZXQuCisgICAgICogCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KKyAgICAgKi8KKyAgICBTZXQ8U3RyaW5nPiBnZXRTdHJpbmdTZXQoU3RyaW5nIGtleSwgU2V0PFN0cmluZz4gZGVmVmFsdWVzKTsKKyAgICAKKyAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhbiBpbnQgdmFsdWUgZnJvbSB0aGUgcHJlZmVyZW5jZXMuCiAgICAgICogCiAgICAgICogQHBhcmFtIGtleSBUaGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQppbmRleCBkMGI2N2NjLi43Zjc0OWJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTWFwczsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKQEAgLTEyNiwxNCArMTI5LDEzIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTElaQVRJT05fVU5CSU5EX0RFTEFZX01TID0gNTAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX1dBS0VfTE9DSyA9ICJTeW5jTWFuYWdlclN5bmNXYWtlTG9jayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfV0FLRV9MT0NLX1BSRUZJWCA9ICJTeW5jV2FrZUxvY2siOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVfU1lOQ19BTEFSTV9XQUtFX0xPQ0sgPSAiU3luY01hbmFnZXJIYW5kbGVTeW5jQWxhcm1XYWtlTG9jayI7CiAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHZvbGF0aWxlIEFjY291bnRbXSBtQWNjb3VudHMgPSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZOwogCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVN5bmNXYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbURhdGFDb25uZWN0aW9uSXNDb25uZWN0ZWQgPSBmYWxzZTsKICAgICB2b2xhdGlsZSBwcml2YXRlIGJvb2xlYW4gbVN0b3JhZ2VJc0xvdyA9IGZhbHNlOwpAQCAtMTk1LDYgKzE5Nyw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwogCisgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CkBAIC0zNTYsMTUgKzM2MCwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1nciA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7Ci0gICAgICAgIG1TeW5jV2FrZUxvY2sgPSBwbS5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFNZTkNfV0FLRV9MT0NLKTsKLSAgICAgICAgbVN5bmNXYWtlTG9jay5zZXRSZWZlcmVuY2VDb3VudGVkKGZhbHNlKTsKKyAgICAgICAgbVBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwogCiAgICAgICAgIC8vIFRoaXMgV2FrZUxvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB3ZSBzdGF5IGF3YWtlIGJldHdlZW4gdGhlIHRpbWUgdGhhdCB3ZSByZWNlaXZlCiAgICAgICAgIC8vIGEgc3luYyBhbGFybSBub3RpZmljYXRpb24gYW5kIHdoZW4gd2UgZmluaXNoIHByb2Nlc3NpbmcgaXQuIFdlIG5lZWQgdG8gZG8gdGhpcwogICAgICAgICAvLyBiZWNhdXNlIHdlIGRvbid0IGRvIHRoZSB3b3JrIGluIHRoZSBhbGFybSBoYW5kbGVyLCByYXRoZXIgd2UgZG8gaXQgaW4gYSBtZXNzYWdlCiAgICAgICAgIC8vIGhhbmRsZXIuCi0gICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICBtSGFuZGxlQWxhcm1XYWtlTG9jayA9IG1Qb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgIEhBTkRMRV9TWU5DX0FMQVJNX1dBS0VfTE9DSyk7CiAgICAgICAgIG1IYW5kbGVBbGFybVdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOwogCkBAIC0xMzAyLDYgKzEzMDQsOSBAQAogICAgICAgICBwdWJsaWMgZmluYWwgU3luY05vdGlmaWNhdGlvbkluZm8gbVN5bmNOb3RpZmljYXRpb25JbmZvID0gbmV3IFN5bmNOb3RpZmljYXRpb25JbmZvKCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyBtQWxhcm1TY2hlZHVsZVRpbWUgPSBudWxsOwogICAgICAgICBwdWJsaWMgZmluYWwgU3luY1RpbWVUcmFja2VyIG1TeW5jVGltZVRyYWNrZXIgPSBuZXcgU3luY1RpbWVUcmFja2VyKCk7CisgICAgICAgIHByaXZhdGUgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG1TeW5jV2FrZUxvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxQYWlyPFN0cmluZywgU3RyaW5nPiwgIFBvd2VyTWFuYWdlci5XYWtlTG9jaz4gbVdha2VMb2NrcyA9CisgICAgICAgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwKCk7CiAKICAgICAgICAgLy8gdXNlZCB0byB0cmFjayBpZiB3ZSBoYXZlIGluc3RhbGxlZCB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgcmVpbnN0YWxsCiAgICAgICAgIC8vIGl0IGlmIHN5bmMgaXMgc3RpbGwgZmFpbGluZwpAQCAtMTMxNSw2ICsxMzIwLDE4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBnZXRTeW5jV2FrZUxvY2soU3RyaW5nIGFjY291bnRUeXBlLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBQYWlyPFN0cmluZywgU3RyaW5nPiB3YWtlTG9ja0tleSA9IFBhaXIuY3JlYXRlKGFjY291bnRUeXBlLCBhdXRob3JpdHkpOworICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHdha2VMb2NrID0gbVdha2VMb2Nrcy5nZXQod2FrZUxvY2tLZXkpOworICAgICAgICAgICAgaWYgKHdha2VMb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IFNZTkNfV0FLRV9MT0NLX1BSRUZJWCArICJfIiArIGF1dGhvcml0eSArICJfIiArIGFjY291bnRUeXBlOworICAgICAgICAgICAgICAgIHdha2VMb2NrID0gbVBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIG5hbWUpOworICAgICAgICAgICAgICAgIHdha2VMb2NrLnNldFJlZmVyZW5jZUNvdW50ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja3MucHV0KHdha2VMb2NrS2V5LCB3YWtlTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gd2FrZUxvY2s7CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgd2FpdFVudGlsUmVhZHlUb1J1bigpIHsKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbVJlYWR5VG9SdW5MYXRjaDsKICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CkBAIC0xNDc3LDggKzE0OTQsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N5bmNJblByb2dyZXNzID0gbUFjdGl2ZVN5bmNDb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1N5bmNJblByb2dyZXNzICYmIG1TeW5jV2FrZUxvY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBtU3luY1dha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1hbmFnZVN5bmNOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICBtYW5hZ2VFcnJvck5vdGlmaWNhdGlvbigpOwpAQCAtMTcwNCw3ICsxNzIyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtU3luY1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIHdha2Vsb2NrIGZvciB0aGlzIGFjY291bnQgYW5kIGF1dGhvcml0eSBhbmQgc3RvcmUgaXQgaW4gbVN5bmNXYWtlTG9jay4KKyAgICAgICAgICAgIC8vIEJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcHJldmlvdXMgd2FrZWxvY2sgc28gdGhhdCB3ZSBkb24ndCBlbmQgdXAgd2l0aCBpdCBiZWluZworICAgICAgICAgICAgLy8gaGVsZCB1bnRpbCBpdCBpcyB1c2VkIGFnYWluLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGEgY291cGxlIHRyaWNreSB0aGluZ3MgYWJvdXQgdGhpcyBjb2RlOgorICAgICAgICAgICAgLy8gLSBtYWtlIHN1cmUgdGhhdCB3ZSBhY3F1aXJlIHRoZSBuZXcgd2FrZWxvY2sgYmVmb3JlIHJlbGVhc2luZyB0aGUgb2xkIG9uZSwKKyAgICAgICAgICAgIC8vICAgb3RoZXJ3aXNlIHRoZSBkZXZpY2UgbWlnaHQgZ28gdG8gc2xlZXAgYXMgc29vbiBhcyB3ZSByZWxlYXNlIGl0LgorICAgICAgICAgICAgLy8gLSBzaW5jZSB3ZSB1c2Ugbm9uLXJlZmVyZW5jZSBjb3VudGVkIHdha2Vsb2NrcyB3ZSBoYXZlIHRvIGJlIHN1cmUgbm90IHRvIGRvCisgICAgICAgICAgICAvLyAgIHRoZSByZWxlYXNlIGlmIHRoZSB3YWtlbG9jayBkaWRuJ3QgY2hhbmdlLiBPdGhld2lzZSB3ZSB3b3VsZCBkbyBhbgorICAgICAgICAgICAgLy8gICBhY3F1aXJlIGZvbGxvd2VkIGJ5IGEgcmVsZWFzZSBvbiB0aGUgc2FtZSBsb2NrLCByZXN1bHRpbmcgaW4gbm8gbG9jaworICAgICAgICAgICAgLy8gICBiZWluZyBoZWxkLgorICAgICAgICAgICAgUG93ZXJNYW5hZ2VyLldha2VMb2NrIG9sZFdha2VMb2NrID0gbVN5bmNXYWtlTG9jazsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jayA9IGdldFN5bmNXYWtlTG9jayhvcC5hY2NvdW50LnR5cGUsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbVN5bmNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChvbGRXYWtlTG9jayAhPSBudWxsICYmIG9sZFdha2VMb2NrICE9IG1TeW5jV2FrZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzY2hlZHVsZSBhbiBhbGFybSwgYXMgdGhhdCB3aWxsIGJlIGRvbmUgYnkgb3VyIGNhbGxlci4KIAogICAgICAgICAgICAgLy8gdGhlIG5leHQgc3RlcCB3aWxsIG9jY3VyIHdoZW4gd2UgZ2V0IGVpdGhlciBhIHRpbWVvdXQgb3IgYQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1htbERvY3VtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNhZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9YbWxEb2N1bWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlci5PcGVuUmVzb3VyY2VJZFJlc3VsdDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLk1hdHJpeEN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5BbmRyb2lkSHR0cENsaWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSByZWFkLW9ubHkgY29udGVudCBwcm92aWRlciB3aGljaCBleHRyYWN0cyBkYXRhIG91dCBvZiBhbiBYTUwgZG9jdW1lbnQuCisgKgorICogPHA+QSBYUGF0aC1saWtlIHNlbGVjdGlvbiBwYXR0ZXJuIGlzIHVzZWQgdG8gc2VsZWN0IHNvbWUgbm9kZXMgaW4gdGhlIFhNTCBkb2N1bWVudC4gRWFjaCBzdWNoCisgKiBub2RlIHdpbGwgY3JlYXRlIGEgcm93IGluIHRoZSB7QGxpbmsgQ3Vyc29yfSByZXN1bHQuPC9wPgorICoKKyAqIEVhY2ggcm93IGlzIHRoZW4gcG9wdWxhdGVkIHdpdGggY29sdW1ucyB0aGF0IGFyZSBhbHNvIGRlZmluZWQgYXMgWFBhdGgtbGlrZSBwcm9qZWN0aW9ucy4gVGhlc2UKKyAqIHByb2plY3Rpb25zIGZldGNoIGF0dHJpYnV0ZXMgdmFsdWVzIG9yIHRleHQgaW4gdGhlIG1hdGNoaW5nIHJvdyBub2RlIG9yIGl0cyBjaGlsZHJlbi4KKyAqCisgKiA8cD5UbyBhZGQgdGhpcyBwcm92aWRlciBpbiB5b3VyIGFwcGxpY2F0aW9uLCB5b3Ugc2hvdWxkIGFkZCBpdHMgZGVjbGFyYXRpb24gdG8geW91ciBhcHBsaWNhdGlvbgorICogbWFuaWZlc3Q6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7cHJvdmlkZXIgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmNvbnRlbnQuWG1sRG9jdW1lbnRQcm92aWRlciIgYW5kcm9pZDphdXRob3JpdGllcz0ieG1sZG9jdW1lbnQiIC8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiA8aDI+Tm9kZSBzZWxlY3Rpb24gc3ludGF4PC9oMj4KKyAqIFRoZSBub2RlIHNlbGVjdGlvbiBzeW50YXggaXMgbWFkZSBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIChhdCBsZWFzdCBvbmUpIG9mCisgKiA8Y29kZT4vbm9kZV9uYW1lPC9jb2RlPiBub2RlIHNlbGVjdGlvbiBwYXR0ZXJucy4KKyAqCisgKiA8cD5UaGUgPGNvZGU+L3Jvb3QvY2hpbGQxL2NoaWxkMjwvY29kZT4gcGF0dGVybiB3aWxsIGZvciBpbnN0YW5jZSBtYXRjaCBhbGwgbm9kZXMgbmFtZWQKKyAqIDxjb2RlPmNoaWxkMjwvY29kZT4gd2hpY2ggYXJlIGNoaWxkcmVuIG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5jaGlsZDE8L2NvZGU+IHdoaWNoIGFyZSB0aGVtc2VsdmVzCisgKiBjaGlsZHJlbiBvZiBhIHJvb3Qgbm9kZSBuYW1lZCA8Y29kZT5yb290PC9jb2RlPi48L3A+CisgKgorICogQW55IDxjb2RlPi88L2NvZGU+IHNlcGFyYXRvciBpbiB0aGUgcHJldmlvdXMgZXhwcmVzc2lvbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSA8Y29kZT4vLzwvY29kZT4KKyAqIHNlcGFyYXRvciBpbnN0ZWFkLCB3aGljaCBpbmRpY2F0ZWQgYSA8aT5kZXNjZW5kYW50PC9pPiBpbnN0ZWFkIG9mIGEgY2hpbGQuCisgKgorICogPHA+VGhlIDxjb2RlPi8vbm9kZTEvL25vZGUyPC9jb2RlPiBwYXR0ZXJuIHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoIGFsbCBub2RlcyBuYW1lZAorICogPGNvZGU+bm9kZTI8L2NvZGU+IHdoaWNoIGFyZSBkZXNjZW5kYW50IG9mIGEgbm9kZSBuYW1lZCA8Y29kZT5ub2RlMTwvY29kZT4gbG9jYXRlZCBhbnl3aGVyZSBpbgorICogdGhlIGRvY3VtZW50IGhpZXJhcmNoeS48L3A+CisgKgorICogTm9kZSBuYW1lcyBjYW4gY29udGFpbiBuYW1lc3BhY2VzIGluIHRoZSBmb3JtIDxjb2RlPm5hbWVzcGFjZTpub2RlPC9jb2RlPi4KKyAqCisgKiA8aDI+UHJvamVjdGlvbiBzeW50YXg8L2gyPgorICogRm9yIGV2ZXJ5IHNlbGVjdGVkIG5vZGUsIHRoZSBwcm9qZWN0aW9uIHdpbGwgdGhlbiBleHRyYWN0IGFjdHVhbCBkYXRhIGZyb20gdGhpcyBub2RlIGFuZCBpdHMKKyAqIGRlc2NlbmRhbnQuCisgKgorICogPHA+VXNlIGEgc3ludGF4IHNpbWlsYXIgdG8gdGhlIHNlbGVjdGlvbiBzeW50YXggZGVzY3JpYmVkIGFib3ZlIHRvIHNlbGVjdCB0aGUgdGV4dCBhc3NvY2lhdGVkCisgKiB3aXRoIGEgY2hpbGQgb2YgdGhlIHNlbGVjdGVkIG5vZGUuIFRoZSBpbXBsaWNpdCByb290IG9mIHRoaXMgcHJvamVjdGlvbiBwYXR0ZXJuIGlzIHRoZSBzZWxlY3RlZAorICogbm9kZS4gPGNvZGU+LzwvY29kZT4gd2lsbCBoZW5jZSByZWZlciB0byB0aGUgdGV4dCBvZiB0aGUgc2VsZWN0ZWQgbm9kZSwgd2hpbGUKKyAqIDxjb2RlPi9jaGlsZDE8L2NvZGU+IHdpbGwgZmV0Y2ggdGhlIHRleHQgb2YgaXRzIGNoaWxkIG5hbWVkIDxjb2RlPmNoaWxkMTwvY29kZT4gYW5kCisgKiA8Y29kZT4vL2NoaWxkMTwvY29kZT4gd2lsbCBtYXRjaCBhbnkgPGk+ZGVzY2VuZGFudDwvaT4gbmFtZWQgPGNvZGU+Y2hpbGQxPC9jb2RlPi4gSWYgc2V2ZXJhbAorICogbm9kZXMgbWF0Y2ggdGhlIHByb2plY3Rpb24gcGF0dGVybiwgdGhlaXIgdGV4dHMgYXJlIGFwcGVuZGVkIGFzIGEgcmVzdWx0LjwvcD4KKyAqCisgKiBBIHByb2plY3Rpb24gY2FuIGFsc28gZmV0Y2ggYW55IG5vZGUgYXR0cmlidXRlIGJ5IGFwcGVuZGluZyBhIDxjb2RlPkBhdHRyaWJ1dGVfbmFtZTwvY29kZT4KKyAqIHBhdHRlcm4gdG8gdGhlIHByZXZpb3VzbHkgZGVzY3JpYmVkIHN5bnRheC4gPGNvZGU+Ly9jaGlsZDFAcHJpY2U8L2NvZGU+IHdpbGwgZm9yIGluc3RhbmNlIG1hdGNoCisgKiB0aGUgYXR0cmlidXRlIDxjb2RlPnByaWNlPC9jb2RlPiBvZiBhbnkgPGNvZGU+Y2hpbGQxPC9jb2RlPiBkZXNjZW5kYW50LgorICoKKyAqIDxwPklmIGEgcHJvamVjdGlvbiBkb2VzIG5vdCBtYXRjaCBhbnkgbm9kZS9hdHRyaWJ1dGUsIGl0cyBhc3NvY2lhdGVkIHZhbHVlIHdpbGwgYmUgYW4gZW1wdHkKKyAqIHN0cmluZy48L3A+CisgKgorICogPGgyPkV4YW1wbGU8L2gyPgorICogVXNpbmcgdGhlIGZvbGxvd2luZyBYTUwgZG9jdW1lbnQ6CisgKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+CisgKiAmbHQ7bGlicmFyeSZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IkVIOTQiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgT2xkIE1hbiBhbmQgdGhlIFNlYSZsdDsvdGl0bGUmZ3Q7CisgKiAgICAgJmx0O2F1dGhvciZndDtFcm5lc3QgSGVtaW5nd2F5Jmx0Oy9hdXRob3ImZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O2Jvb2sgaWQ9IlhYMTAiJmd0OworICogICAgICZsdDt0aXRsZSZndDtUaGUgQXJhYmlhbiBOaWdodHM6IFRhbGVzIG9mIDEsMDAxIE5pZ2h0cyZsdDsvdGl0bGUmZ3Q7CisgKiAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0O25vLWlkJmd0OworICogICAgICZsdDtib29rJmd0OworICogICAgICAgJmx0O3RpdGxlJmd0O0FuaW1hbCBGYXJtJmx0Oy90aXRsZSZndDsKKyAqICAgICAgICZsdDthdXRob3ImZ3Q7R2VvcmdlIE9yd2VsbCZsdDsvYXV0aG9yJmd0OworICogICAgICZsdDsvYm9vayZndDsKKyAqICAgJmx0Oy9uby1pZCZndDsKKyAqICZsdDsvbGlicmFyeSZndDsKKyAqIDwvcHJlPgorICogQSBzZWxlY3Rpb24gcGF0dGVybiBvZiA8Y29kZT4vbGlicmFyeS8vYm9vazwvY29kZT4gd2lsbCBtYXRjaCB0aGUgdGhyZWUgYm9vayBlbnRyaWVzICh3aGlsZQorICogPGNvZGU+L2xpYnJhcnkvYm9vazwvY29kZT4gd2lsbCBvbmx5IG1hdGNoIHRoZSBmaXJzdCB0d28gb25lcykuCisgKgorICogPHA+RGVmaW5pbmcgdGhlIHByb2plY3Rpb25zIGFzIDxjb2RlPi90aXRsZTwvY29kZT4sIDxjb2RlPi9hdXRob3I8L2NvZGU+IGFuZCA8Y29kZT5AaWQ8L2NvZGU+CisgKiB3aWxsIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEuIE5vdGUgdGhhdCB0aGUgYXV0aG9yIG9mIHRoZSBzZWNvbmQgYm9vayBhcyB3ZWxsIGFzIHRoZSBpZCBvZgorICogdGhlIHRoaXJkIGFyZSBlbXB0eSBzdHJpbmdzLgorICovCitwdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciB7CisgICAgLyoKKyAgICAgKiBJZGVhcyBmb3IgaW1wcm92ZW1lbnQ6CisgICAgICogLSBFeHBhbmQgWFBhdGgtbGlrZSBzeW50YXggdG8gYWxsb3cgZm9yIFtuYl0gY2hpbGQgbnVtYmVyIHNlbGVjdG9yCisgICAgICogLSBBZGRyZXNzIHRoZSBzdGFydGluZyAuIGJ1ZyBpbiBBYnN0cmFjdEN1cnNvciB3aGljaCBwcmV2ZW50cyBhIHRydWUgWFBhdGggc3ludGF4LgorICAgICAqIC0gUHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSB0byBjb25jYXRlbmF0aW9uIHdoZW4gc2V2ZXJhbCBub2RlIG1hdGNoIChsaXN0LWxpa2UpLgorICAgICAqIC0gU3VwcG9ydCBuYW1lc3BhY2VzIGluIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICAgKiAtIEluY3JlbWVudGFsIEN1cnNvciBjcmVhdGlvbiwgcGFnaW5hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlhtbERvY3VtZW50UHJvdmlkZXIiOworICAgIHByaXZhdGUgQW5kcm9pZEh0dHBDbGllbnQgbUh0dHBDbGllbnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgZGF0YSBmcm9tIHRoZSBYTUwgZG9jdW1lbnQgcmVmZXJlbmNlZCBpbiB0aGUgVVJJLgorICAgICAqCisgICAgICogPHA+VGhlIFhNTCBkb2N1bWVudCBjYW4gYmUgYSBsb2NhbCByZXNvdXJjZSBvciBhIGZpbGUgdGhhdCB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUKKyAgICAgKiBJbnRlcm5ldC4gSW4gdGhlIGxhdHRlciBjYXNlLCB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlcXVlc3QgdGhlIElOVEVSTkVUIHBlcm1pc3Npb24gaW4KKyAgICAgKiBpdHMgbWFuaWZlc3QuPC9wPgorICAgICAqCisgICAgICogVGhlIFVSSSB3aWxsIGJlIG9mIHRoZSBmb3JtIDxjb2RlPmNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/cmVzb3VyY2U9Ui54bWwubXlGaWxlPC9jb2RlPiBmb3IgYQorICAgICAqIGxvY2FsIHJlc291cmNlLiA8Y29kZT54bWxkb2N1bWVudDwvY29kZT4gc2hvdWxkIG1hdGNoIHRoZSBhdXRob3JpdHkgZGVjbGFyZWQgZm9yIHRoaXMKKyAgICAgKiBwcm92aWRlciBpbiB5b3VyIG1hbmlmZXN0LiBJbnRlcm5ldCBkb2N1bWVudHMgYXJlIHJlZmVyZW5jZWQgdXNpbmcKKyAgICAgKiA8Y29kZT5jb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD08L2NvZGU+IGZvbGxvd2VkIGJ5IGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgVVJMIG9mIHlvdXIKKyAgICAgKiBkb2N1bWVudCAoc2VlIHtAbGluayBVcmkjZW5jb2RlKFN0cmluZyl9KS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgcmVzdWx0aW5nIEN1cnNvciBpcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJvamVjdGlvbgorICAgICAqIGFycmF5IHBsdXMgb25lLCBuYW1lZCA8Y29kZT5faWQ8L2NvZGU+IHdoaWNoIHdpbGwgY29udGFpbiBhIHVuaXF1ZSByb3cgaWQgKGFsbG93aW5nIHRoZQorICAgICAqIEN1cnNvciB0byBiZSB1c2VkIHdpdGggYSB7QGxpbmsgQ3Vyc29yQWRhcHRlcn0pLiBUaGUgb3RoZXIgY29sdW1ucycgbmFtZXMgYXJlIHRoZSBwcm9qZWN0aW9uCisgICAgICogcGF0dGVybnMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHlvdXIgbG9jYWwgcmVzb3VyY2Ugb3IgSW50ZXJuZXQgZG9jdW1lbnQuCisgICAgICogQHBhcmFtIHByb2plY3Rpb24gQSBzZXQgb2YgcGF0dGVybnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gZWFjaCBzZWxlY3RlZAorICAgICAqIG5vZGUuIFNlZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBwYXR0ZXJuIHN5bnRheC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgc2VsZWN0aW9uIHBhdHRlcm4gd2hpY2ggd2lsbCBzZWxlY3QgdGhlIG5vZGVzIHRoYXQgd2lsbCBjcmVhdGUgdGhlCisgICAgICogQ3Vyc29yJ3Mgcm93cy4gU2VlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIHBhdHRlcm4gc3ludGF4LgorICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNvcnRPcmRlciBUaGUgcm93IG9yZGVyIGluIHRoZSByZXN1bHRpbmcgY3Vyc29yIGlzIGRldGVybWluZWQgZnJvbSB0aGUgbm9kZSBvcmRlciBpbgorICAgICAqIHRoZSBYTUwgZG9jdW1lbnQuIFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisgICAgICogQHJldHVybiBBIEN1cnNvciBvciBudWxsIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgeworCisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgbUh0dHBDbGllbnQgPSBudWxsOworCisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoInVybCIpOworICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcnNlciA9IGdldFVyaVhtbFB1bGxQYXJzZXIodXJsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZSA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigicmVzb3VyY2UiKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVXJpIHJlc291cmNlVXJpID0gVXJpLnBhcnNlKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRSArICI6Ly8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHBhcnNlciA9IGdldFJlc291cmNlWG1sUHVsbFBhcnNlcihyZXNvdXJjZVVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFhNTEN1cnNvciB4bWxDdXJzb3IgPSBuZXcgWE1MQ3Vyc29yKHNlbGVjdGlvbiwgcHJvamVjdGlvbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbEN1cnNvci5wYXJzZVdpdGgocGFyc2VyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4geG1sQ3Vyc29yOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJL08gZXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgcGFyc2luZyBYTUwgIiArIHVyaSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChtSHR0cENsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1IdHRwQ2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgVVJMLiBDYW4gYmUgb3ZlcmxvYWRlZCB0byBwcm92aWRlIHlvdXIgb3duIHBhcnNlci4KKyAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIFhNTCBkb2N1bWVudCB0aGF0IGlzIHRvIGJlIHBhcnNlZC4KKyAgICAgKiBAcmV0dXJuIEFuIFhtbFB1bGxQYXJzZXIgb24gdGhpcyBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgWG1sUHVsbFBhcnNlciBnZXRVcmlYbWxQdWxsUGFyc2VyKFN0cmluZyB1cmwpIHsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWG1sUHVsbFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFhtbFB1bGxQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgcGFyc2VyID0gZmFjdG9yeS5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuYWJsZSB0byBjcmVhdGUgWG1sUHVsbFBhcnNlciIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBIdHRwR2V0IGdldCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBtSHR0cENsaWVudCA9IEFuZHJvaWRIdHRwQ2xpZW50Lm5ld0luc3RhbmNlKCJBbmRyb2lkIik7CisgICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBtSHR0cENsaWVudC5leGVjdXRlKGdldCk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSA9PSBIdHRwU3RhdHVzLlNDX09LKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSHR0cEVudGl0eSBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgWE1MIGZpbGUgIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW5wdXRTdHJlYW0sIG51bGwpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFcnJvciB3aGlsZSByZWFkaW5nIFhNTCBmaWxlIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBYbWxQdWxsUGFyc2VyIGZvciB0aGUgcHJvdmlkZWQgbG9jYWwgcmVzb3VyY2UuIENhbiBiZSBvdmVybG9hZGVkIHRvIHByb3ZpZGUgeW91cgorICAgICAqIG93biBwYXJzZXIuCisgICAgICogQHBhcmFtIHJlc291cmNlVXJpIEEgZnVsbHkgcXVhbGlmaWVkIHJlc291cmNlIG5hbWUgcmVmZXJlbmNpbmcgYSBsb2NhbCBYTUwgcmVzb3VyY2UuCisgICAgICogQHJldHVybiBBbiBYbWxQdWxsUGFyc2VyIG9uIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFhtbFB1bGxQYXJzZXIgZ2V0UmVzb3VyY2VYbWxQdWxsUGFyc2VyKFVyaSByZXNvdXJjZVVyaSkgeworICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByZXNvdXJjZUlkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb3VyY2VJZCA9IGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHJlc291cmNlVXJpKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUlkLnIuZ2V0WG1sKHJlc291cmNlSWQuaWQpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlhNTCByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyByZXNvdXJjZVVyaS50b1N0cmluZygpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShVcmkgdXJpKSB7CisgICAgICAgIHJldHVybiAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci94bWxkb2MiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgQ29udGVudFByb3ZpZGVyIGlzIHJlYWQtb25seS4gVGhpcyBtZXRob2QgdGhyb3dzIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXJpIGluc2VydChVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZWxldGUoVXJpIHVyaSwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIENvbnRlbnRQcm92aWRlciBpcyByZWFkLW9ubHkuIFRoaXMgbWV0aG9kIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKiovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB1cGRhdGUoVXJpIHVyaSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWE1MQ3Vyc29yIGV4dGVuZHMgTWF0cml4Q3Vyc29yIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIG1TZWxlY3Rpb25QYXR0ZXJuOworICAgICAgICBwcml2YXRlIFBhdHRlcm5bXSBtUHJvamVjdGlvblBhdHRlcm5zOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIG1BdHRyaWJ1dGVOYW1lczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ3VycmVudFZhbHVlczsKKyAgICAgICAgcHJpdmF0ZSBCaXRTZXRbXSBtQWN0aXZlVGV4dERlcHRoTWFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU51bWJlck9mUHJvamVjdGlvbnM7CisKKyAgICAgICAgcHVibGljIFhNTEN1cnNvcihTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBwcm9qZWN0aW9ucykgeworICAgICAgICAgICAgc3VwZXIocHJvamVjdGlvbnMpOworICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGNvbHVtbiBpbiBwcm9qZWN0aW9ucyBpcyB1c2VkIGZvciB0aGUgX0lECisgICAgICAgICAgICBtTnVtYmVyT2ZQcm9qZWN0aW9ucyA9IHByb2plY3Rpb25zLmxlbmd0aCAtIDE7CisgICAgICAgICAgICBtU2VsZWN0aW9uUGF0dGVybiA9IGNyZWF0ZVBhdHRlcm4oc2VsZWN0aW9uKTsKKyAgICAgICAgICAgIGNyZWF0ZVByb2plY3Rpb25QYXR0ZXJuKHByb2plY3Rpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBpbnB1dCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBpbnB1dC5yZXBsYWNlQWxsKCIvLyIsICIvKC4qL3wpIikucmVwbGFjZUFsbCgiXi8iLCAiXi8iKSArICIkIjsKKyAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdGlvblBhdHRlcm4oU3RyaW5nW10gcHJvamVjdGlvbnMpIHsKKyAgICAgICAgICAgIG1Qcm9qZWN0aW9uUGF0dGVybnMgPSBuZXcgUGF0dGVyblttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICBtQXR0cmlidXRlTmFtZXMgPSBuZXcgU3RyaW5nW21OdW1iZXJPZlByb2plY3Rpb25zXTsKKyAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrID0gbmV3IEJpdFNldFttTnVtYmVyT2ZQcm9qZWN0aW9uc107CisgICAgICAgICAgICAvLyBBZGQgYSBjb2x1bW4gdG8gc3RvcmUgX0lECisgICAgICAgICAgICBtQ3VycmVudFZhbHVlcyA9IG5ldyBTdHJpbmdbbU51bWJlck9mUHJvamVjdGlvbnMgKyAxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXSA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdGlvbiA9IHByb2plY3Rpb25zW2kgKyAxXTsgLy8gKzEgdG8gc2tpcCB0aGUgX0lEIGNvbHVtbgorICAgICAgICAgICAgICAgIGludCBhdEluZGV4ID0gcHJvamVjdGlvbi5sYXN0SW5kZXhPZignQCcsIHByb2plY3Rpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChhdEluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZU5hbWVzW2ldID0gcHJvamVjdGlvbi5zdWJzdHJpbmcoYXRJbmRleCsxKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDAsIGF0SW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVOYW1lc1tpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ29uZm9ybXMgdG8gWFBhdGggc3RhbmRhcmQ6IHJlZmVyZW5jZSB0byBsb2NhbCBjb250ZXh0IHN0YXJ0cyB3aXRoIGEgLgorICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uLmNoYXJBdCgwKSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiA9IHByb2plY3Rpb24uc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUHJvamVjdGlvblBhdHRlcm5zW2ldID0gY3JlYXRlUGF0dGVybihwcm9qZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlV2l0aChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBTdGFjazxJbnRlZ2VyPiBwYXRoTGVuZ3RoU3RhY2sgPSBuZXcgU3RhY2s8SW50ZWdlcj4oKTsKKworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBwYXJzaW5nIG1vZGU6IGluIHJvb3QgbW9kZSwgcm9vdFBhdGggaXMgdXBkYXRlZCBhbmQgbm9kZXMgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHNlbGVjdGlvblBhdHRlcm4gYXJlIHNlYXJjaGVkIGZvciBhbmQgY3VycmVudE5vZGVEZXB0aCBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICAgIC8vIFdoZW4gYSBub2RlIG1hdGNoaW5nIHNlbGVjdGlvblBhdHRlcm4gaXMgZm91bmQsIGN1cnJlbnROb2RlRGVwdGggaXMgc2V0IHRvIDAgYW5kCisgICAgICAgICAgICAvLyB1cGRhdGVkIGFzIGNoaWxkcmVuIGFyZSBwYXJzZWQgYW5kIHByb2plY3Rpb25QYXR0ZXJucyBhcmUgc2VhcmNoZWQgaW4gbm9kZVBhdGguCisgICAgICAgICAgICBpbnQgY3VycmVudE5vZGVEZXB0aCA9IC0xOworCisgICAgICAgICAgICAvLyBJbmRleCB3aGVyZSBsb2NhbCBzZWxlY3RlZCBub2RlIHBhdGggc3RhcnRzIGZyb20gaW4gcGF0aAorICAgICAgICAgICAgaW50IGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSAwOworCisgICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgd2hpbGUgKGV2ZW50VHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcGF0aAorICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoU3RhY2sucHVzaChwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRQcmVmaXggaXMgbm90IHN1cHBvcnRlZCBieSBsb2NhbCBYbWwgcmVzb3VyY2UgcGFyc2VyCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJzZXIuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHBhcnNlci5nZXROYW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZURlcHRoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGgrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbm9kZSBtYXRjaGluZyBzZWxlY3Rpb24gaXMgZm91bmQ6IGluaXRpYWxpemUgY2hpbGQgcGFyc2luZyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGlvblBhdHRlcm4ubWF0Y2hlcihwYXRoLnRvU3RyaW5nKCkpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRGVwdGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlUGF0aFN0YXJ0SW5kZXggPSBwYXRoLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzWzBdID0gSW50ZWdlci50b1N0cmluZyhnZXRDb3VudCgpKTsgLy8gX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZQcm9qZWN0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHZhbHVlcyB0byBkZWZhdWx0IChlbXB0eSBzdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VmFsdWVzW2kgKyAxXSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBoYXMgdG8gYmUgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIG9uZSBhcyBjdXJyZW50Tm9kZURlcHRoIGNhbgorICAgICAgICAgICAgICAgICAgICAvLyBiZSBtb2RpZmllZCBhYm92ZSAod2hlbiBhIG5vZGUgbWF0Y2hpbmcgc2VsZWN0aW9uIGlzIGZvdW5kKS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsTm9kZVBhdGggPSBwYXRoLnN1YnN0cmluZyhjdXJyZW50Tm9kZVBhdGhTdGFydEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mUHJvamVjdGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvamVjdGlvblBhdHRlcm5zW2ldLm1hdGNoZXIobG9jYWxOb2RlUGF0aCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBtQXR0cmlidXRlTmFtZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUZXh0RGVwdGhNYXNrW2ldLnNldChjdXJyZW50Tm9kZURlcHRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBvcCBsYXN0IG5vZGUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwYXRoTGVuZ3RoU3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHBhdGguc2V0TGVuZ3RoKGxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlRGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlYXZpbmcgYSBzZWxlY3Rpb24gbWF0Y2hpbmcgbm9kZTogYWRkIGEgbmV3IHJvdyB3aXRoIHJlc3VsdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSb3cobUN1cnJlbnRWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRleHREZXB0aE1hc2tbaV0uc2V0KGN1cnJlbnROb2RlRGVwdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZURlcHRoLS07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50VHlwZSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpICYmICghcGFyc2VyLmlzV2hpdGVzcGFjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZlByb2plY3Rpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudE5vZGVEZXB0aCA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQWN0aXZlVGV4dERlcHRoTWFza1tpXS5nZXQoY3VycmVudE5vZGVEZXB0aCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRWYWx1ZXNbaSArIDFdICs9IHBhcnNlci5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKaW5kZXggMzk1YzM5Mi4uZTIxY2I5NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCkBAIC0xNDksNiArMTQ5LDI3IEBACiAgICAgICoge0BsaW5rIGFuZHJvaWQuUi5hdHRyI2ZpbmlzaE9uQ2xvc2VTeXN0ZW1EaWFsb2dzfSBhdHRyaWJ1dGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19GSU5JU0hfT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MgPSAweDAxMDA7CisgICAgLyoqIAorICAgICAqIEJpdCBpbiB7QGxpbmsgI2ZsYWdzfSBjb3JyZXNwb25kaW5nIHRvIGFuIGltbWVyc2l2ZSBhY3Rpdml0eQorICAgICAqIHRoYXQgd2lzaGVzIG5vdCB0byBiZSBpbnRlcnJ1cHRlZCBieSBub3RpZmljYXRpb25zLgorICAgICAqIEFwcGxpY2F0aW9ucyB0aGF0IGhpZGUgdGhlIHN5c3RlbSBub3RpZmljYXRpb24gYmFyIHdpdGgKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zI0ZMQUdfRlVMTFNDUkVFTn0KKyAgICAgKiBtYXkgc3RpbGwgYmUgaW50ZXJydXB0ZWQgYnkgaGlnaC1wcmlvcml0eSBub3RpZmljYXRpb25zOyBmb3IgZXhhbXBsZSwgYW4KKyAgICAgKiBpbmNvbWluZyBwaG9uZSBjYWxsIG1heSB1c2UKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uI2Z1bGxTY3JlZW5JbnRlbnQgZnVsbFNjcmVlbkludGVudH0KKyAgICAgKiB0byBwcmVzZW50IGEgZnVsbC1zY3JlZW4gaW4tY2FsbCBhY3Rpdml0eSB0byB0aGUgdXNlciwgcGF1c2luZyB0aGUKKyAgICAgKiBjdXJyZW50IGFjdGl2aXR5IGFzIGEgc2lkZS1lZmZlY3QuIEFuIGFjdGl2aXR5IHdpdGgKKyAgICAgKiB7QGxpbmsgI0ZMQUdfSU1NRVJTSVZFfSBzZXQsIGhvd2V2ZXIsIHdpbGwgbm90IGJlIGludGVycnVwdGVkOyB0aGUKKyAgICAgKiBub3RpZmljYXRpb24gbWF5IGJlIHNob3duIGluIHNvbWUgb3RoZXIgd2F5IChzdWNoIGFzIGEgc21hbGwgZmxvYXRpbmcKKyAgICAgKiAidG9hc3QiIHdpbmRvdykuCisgICAgICoge0BzZWUgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uI0ZMQUdfSElHSF9QUklPUklUWX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0lNTUVSU0lWRSA9IDB4MDIwMDsKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBmb3Ige0BsaW5rICNmbGFnc306IHRydWUgd2hlbiB0aGUgYXBwbGljYXRpb24ncyByZW5kZXJpbmcgc2hvdWxkCisgICAgICogYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4MDQwMDsKICAgICAvKioKICAgICAgKiBPcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHNldCBpbiB0aGUgYWN0aXZpdHkgZGVjbGFyYXRpb24gaW4gdGhlCiAgICAgICogbWFuaWZlc3QuCkBAIC0xNTksNiArMTgwLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1RBVEVfTk9UX05FRURFRH0sIHtAbGluayAjRkxBR19FWENMVURFX0ZST01fUkVDRU5UU30sCiAgICAgICoge0BsaW5rICNGTEFHX0FMTE9XX1RBU0tfUkVQQVJFTlRJTkd9LCB7QGxpbmsgI0ZMQUdfTk9fSElTVE9SWX0sCiAgICAgICoge0BsaW5rICNGTEFHX0ZJTklTSF9PTl9DTE9TRV9TWVNURU1fRElBTE9HU30sCisgICAgICoge0BsaW5rICNGTEFHX0lNTUVSU0lWRX0sIHtAbGluayAjRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRH0KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGZsYWdzOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQppbmRleCAwZGI5NTRkLi4zOGQ4OTdlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKQEAgLTI2OSw3ICsyNjksNiBAQAogICAgICAqIGluY3JlYXNlZCBpbiBzaXplIGZvciBleHRyYSBsYXJnZSBzY3JlZW5zLiAgQ29ycmVzcG9uZHMgdG8KICAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfeGxhcmdlU2NyZWVucwogICAgICAqIGFuZHJvaWQ6eGxhcmdlU2NyZWVuc30uCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TID0gMTw8MTk7CiAgICAgCkBAIC0zMTIsNyArMzExLDcgQEAKICAgICAgKiB7QGxpbmsgI0ZMQUdfQUxMT1dfQ0xFQVJfVVNFUl9EQVRBfSwge0BsaW5rICNGTEFHX1VQREFURURfU1lTVEVNX0FQUH0sCiAgICAgICoge0BsaW5rICNGTEFHX1RFU1RfT05MWX0sIHtAbGluayAjRkxBR19TVVBQT1JUU19TTUFMTF9TQ1JFRU5TfSwKICAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfTk9STUFMX1NDUkVFTlN9LAotICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TfSwKKyAgICAgKiB7QGxpbmsgI0ZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOU30sIHtAbGluayAjRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOU30sCiAgICAgICoge0BsaW5rICNGTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlN9LAogICAgICAqIHtAbGluayAjRkxBR19TVVBQT1JUU19TQ1JFRU5fREVOU0lUSUVTfSwge0BsaW5rICNGTEFHX1ZNX1NBRkVfTU9ERX0KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCBlZjcyMDEzLi44OTYzZDBjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC03MTMsNiArNzEzLDIxIEBACiAKICAgICAvKioKICAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGFuIGFjY2VsZXJvbWV0ZXIuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5GRUFUVVJFKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfU0VOU09SX0FDQ0VMRVJPTUVURVIgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYWNjZWxlcm9tZXRlciI7CisKKyAgICAvKioKKyAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGEgYmFyb21ldGVyIChhaXIKKyAgICAgKiBwcmVzc3VyZSBzZW5zb3IuKQorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1NFTlNPUl9CQVJPTUVURVIgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYmFyb21ldGVyIjsKKworICAgIC8qKgorICAgICAqIEZlYXR1cmUgZm9yIHtAbGluayAjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXN9IGFuZAogICAgICAqIHtAbGluayAjaGFzU3lzdGVtRmVhdHVyZX06IFRoZSBkZXZpY2UgaW5jbHVkZXMgYSBtYWduZXRvbWV0ZXIgKGNvbXBhc3MpLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKQEAgLTcyMCwxMCArNzM1LDEwIEBACiAKICAgICAvKioKICAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKLSAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGluY2x1ZGVzIGFuIGFjY2VsZXJvbWV0ZXIuCisgICAgICoge0BsaW5rICNoYXNTeXN0ZW1GZWF0dXJlfTogVGhlIGRldmljZSBpbmNsdWRlcyBhIGd5cm9zY29wZS4KICAgICAgKi8KICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkZFQVRVUkUpCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9TRU5TT1JfQUNDRUxFUk9NRVRFUiA9ICJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5hY2NlbGVyb21ldGVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1NFTlNPUl9HWVJPU0NPUEUgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlIjsKIAogICAgIC8qKgogICAgICAqIEZlYXR1cmUgZm9yIHtAbGluayAjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXN9IGFuZApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQppbmRleCBlMjBjYjVlLi45MmE4YTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQpAQCAtMTYsOSArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudC5wbTsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKQEAgLTMwLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLQogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00OCw3ICs0NSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogCkBAIC0xNDk4LDEyICsxNDk0LDE4IEBACiAgICAgICAgICAgICBhaS5ub25Mb2NhbGl6ZWRMYWJlbCA9IHYuY29lcmNlVG9TdHJpbmcoKTsKICAgICAgICAgfQogCisgICAgICAgIGludCBkZWZhdWx0VGhlbWUgPSAwOworICAgICAgICBpZiAob3duZXIuYXBwbGljYXRpb25JbmZvLnRhcmdldFNka1ZlcnNpb24gPj0gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQikgeworICAgICAgICAgICAgLy8gQXMgb2YgaG9uZXljb21iLCB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0aGVtZSBpcyBob2xvZ3JhcGhpYy4KKyAgICAgICAgICAgIGRlZmF1bHRUaGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ib2xvOworICAgICAgICB9CisKICAgICAgICAgYWkuaWNvbiA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faWNvbiwgMCk7CiAgICAgICAgIGFpLmxvZ28gPSBzYS5nZXRSZXNvdXJjZUlkKAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX2xvZ28sIDApOwogICAgICAgICBhaS50aGVtZSA9IHNhLmdldFJlc291cmNlSWQoCi0gICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fdGhlbWUsIDApOworICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFwcGxpY2F0aW9uX3RoZW1lLCBkZWZhdWx0VGhlbWUpOwogICAgICAgICBhaS5kZXNjcmlwdGlvblJlcyA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZGVzY3JpcHRpb24sIDApOwogCkBAIC0xNTM1LDYgKzE1MzcsMTAgQEAKICAgICAgICAgICAgIGFpLmZsYWdzIHw9IEFwcGxpY2F0aW9uSW5mby5GTEFHX1ZNX1NBRkVfTU9ERTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCA9IHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFyZHdhcmVBY2NlbGVyYXRlZCwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisKICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25faGFzQ29kZSwKICAgICAgICAgICAgICAgICB0cnVlKSkgewpAQCAtMTYzNCw3ICsxNjQwLDggQEAKIAogICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKHRhZ05hbWUuZXF1YWxzKCJhY3Rpdml0eSIpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgQWN0aXZpdHkgYSA9IHBhcnNlQWN0aXZpdHkob3duZXIsIHJlcywgcGFyc2VyLCBhdHRycywgZmxhZ3MsIG91dEVycm9yLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE2NDMsNyArMTY1MCw3IEBACiAgICAgICAgICAgICAgICAgb3duZXIuYWN0aXZpdGllcy5hZGQoYSk7CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoInJlY2VpdmVyIikpIHsKLSAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gcGFyc2VBY3Rpdml0eShvd25lciwgcmVzLCBwYXJzZXIsIGF0dHJzLCBmbGFncywgb3V0RXJyb3IsIHRydWUpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGEgPSBwYXJzZUFjdGl2aXR5KG93bmVyLCByZXMsIHBhcnNlciwgYXR0cnMsIGZsYWdzLCBvdXRFcnJvciwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhcnNlRXJyb3IgPSBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1BBUlNFX0ZBSUxFRF9NQU5JRkVTVF9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE3NzgsNyArMTc4NSw4IEBACiAKICAgICBwcml2YXRlIEFjdGl2aXR5IHBhcnNlQWN0aXZpdHkoUGFja2FnZSBvd25lciwgUmVzb3VyY2VzIHJlcywKICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBmbGFncywgU3RyaW5nW10gb3V0RXJyb3IsCi0gICAgICAgICAgICBib29sZWFuIHJlY2VpdmVyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiByZWNlaXZlciwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgVHlwZWRBcnJheSBzYSA9IHJlcy5vYnRhaW5BdHRyaWJ1dGVzKGF0dHJzLAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5KTsKIApAQCAtMTg4Myw3ICsxODkxLDE5IEBACiAgICAgICAgICAgICBhLmluZm8uZmxhZ3MgfD0gQWN0aXZpdHlJbmZvLkZMQUdfRklOSVNIX09OX0NMT1NFX1NZU1RFTV9ESUFMT0dTOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfaW1tZXJzaXZlLAorICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKCFyZWNlaXZlcikgeworICAgICAgICAgICAgaWYgKHNhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2hhcmR3YXJlQWNjZWxlcmF0ZWQsCisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlQWNjZWxlcmF0ZWQpKSB7CisgICAgICAgICAgICAgICAgYS5pbmZvLmZsYWdzIHw9IEFjdGl2aXR5SW5mby5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBhLmluZm8ubGF1bmNoTW9kZSA9IHNhLmdldEludCgKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QWN0aXZpdHlfbGF1bmNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLkxBVU5DSF9NVUxUSVBMRSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Bc3NldEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggYTM3ZTRlOC4uMDFhZTFkYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQXNzZXRGaWxlRGVzY3JpcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0Fzc2V0RmlsZURlc2NyaXB0b3IuamF2YQpAQCAtMjUsOCArMjUsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiAKIC8qKgogICogRmlsZSBkZXNjcmlwdG9yIG9mIGFuIGVudHJ5IGluIHRoZSBBc3NldE1hbmFnZXIuICBUaGlzIHByb3ZpZGVzIHlvdXIgb3duCkBAIC01MSw3ICs0OSw3IEBACiAgICAgICogQHBhcmFtIHN0YXJ0T2Zmc2V0IFRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZpbGUgdGhhdCB0aGUgYXNzZXQgc3RhcnRzLgogICAgICAqIFRoaXMgbXVzdCBiZSAwIGlmIGxlbmd0aCBpcyBVTktOT1dOX0xFTkdUSC4KICAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGFzc2V0LCBvcgotICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEggaWYgaXQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAqIHtAbGluayAjVU5LTk9XTl9MRU5HVEh9IGlmIGl0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgQXNzZXRGaWxlRGVzY3JpcHRvcihQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBzdGFydE9mZnNldCwKICAgICAgICAgICAgIGxvbmcgbGVuZ3RoKSB7CkBAIC0xMjUsMTMgKzEyMyw2IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtRmQuY2xvc2UoKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBmaWxlIGRlc2NyaXB0b3IgaXMgZm9yIGEgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVtb3J5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShtRmQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYXV0by1jbG9zZSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgYXNzZXQuICBUaGlzCkBAIC0xNDIsMTIgKzEzMyw2IEBACiAgICAgICogc2hvdWxkIG9ubHkgY2FsbCB0aGlzIG9uY2UgZm9yIGEgcGFydGljdWxhciBhc3NldC4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtIGNyZWF0ZUlucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzTWVtb3J5RmlsZSgpKSB7Ci0gICAgICAgICAgICBpZiAobUxlbmd0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGaWxlIGxlbmd0aCB0b28gbGFyZ2UgZm9yIGEgbWVtb3J5IGZpbGU6ICIgKyBtTGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtKG1GZCwgKGludCltTGVuZ3RoKTsKLSAgICAgICAgfQogICAgICAgICBpZiAobUxlbmd0aCA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0obUZkKTsKICAgICAgICAgfQpAQCAtMjc2LDY2ICsyNjEsNiBAQAogICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBbiBpbnB1dCBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIGEgTWVtb3J5RmlsZSBhbmQgY2xvc2VzIGl0IHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICAgICogVGhpcyBleHRlbmRzIEZpbGVJbnB1dFN0cmVhbSBqdXN0IGJlY2F1c2Uge0BsaW5rICNjcmVhdGVJbnB1dFN0cmVhbX0gcmV0dXJucwotICAgICAqIGEgRmlsZUlucHV0U3RyZWFtLiBBbGwgdGhlIEZpbGVJbnB1dFN0cmVhbSBtZXRob2RzIGFyZQotICAgICAqIG92ZXJyaWRkZW4gdG8gdXNlIHRoZSBNZW1vcnlGaWxlIGluc3RlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXV0b0Nsb3NlTWVtb3J5RmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBtUGFyY2VsRmQ7Ci0gICAgICAgIHByaXZhdGUgTWVtb3J5RmlsZSBtRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBtU3RyZWFtOwotCi0gICAgICAgIHB1YmxpYyBBdXRvQ2xvc2VNZW1vcnlGaWxlSW5wdXRTdHJlYW0oUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKGZkLmdldEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgbVBhcmNlbEZkID0gZmQ7Ci0gICAgICAgICAgICBtRmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGxlbmd0aCwgInIiKTsKLSAgICAgICAgICAgIG1TdHJlYW0gPSBtRmlsZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLmF2YWlsYWJsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG1QYXJjZWxGZC5jbG9zZSgpOyAgLy8gbXVzdCBjbG9zZSBQYXJjZWxGaWxlRGVzY3JpcHRvciwgbm90IGp1c3QgdGhlIGZpbGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgY291bGQgYmUgYSBzdWJjbGFzcyBvZiBQYXJjZWxGaWxlRGVzY3JpcHRvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRS5nLiBDb250ZW50UmVzb2x2ZXIuUGFyY2VsRmlsZURlc2NyaXB0b3JJbm5lci5jbG9zZSgpIHJlbGVhc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY29udGVudCBwcm92aWRlcgotICAgICAgICAgICAgbUZpbGUuY2xvc2UoKTsgICAgICAvLyB0byB1bm1hcCB0aGUgbWVtb3J5IGZpbGUgZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1TdHJlYW0uY2xvc2UoKTsgICAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBnZXRDaGFubmVsKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIsIG9mZnNldCwgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW0ucmVhZChidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RyZWFtLnNraXAoY291bnQpOwotICAgICAgICB9Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogQW4gT3V0cHV0U3RyZWFtIHlvdSBjYW4gY3JlYXRlIG9uIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IsIHdoaWNoIHdpbGwKQEAgLTQyMiwxNSArMzQ3LDQgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbSBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZnJvbU1lbW9yeUZpbGUoTWVtb3J5RmlsZSBtZW1vcnlGaWxlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQgPSBtZW1vcnlGaWxlLmdldFBhcmNlbEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQXNzZXRGaWxlRGVzY3JpcHRvcihmZCwgMCwgbWVtb3J5RmlsZS5sZW5ndGgoKSk7Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKaW5kZXggNWEzZGQ0MS4uMmYxMTBmMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtNjIsNyArNjIsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX1NNQUxMID0gMHgwMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9OT1JNQUwgPSAweDAyOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9TSVpFX0xBUkdFID0gMHgwMzsKLSAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0UgPSAweDA0OwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTkxBWU9VVF9MT05HX01BU0sgPSAweDMwOwpAQCAtODQsNyArODMsNyBAQAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX01BU0t9IGJpdHMgZGVmaW5lIHRoZSBvdmVyYWxsIHNpemUKICAgICAgKiBvZiB0aGUgc2NyZWVuLiAgVGhleSBtYXkgYmUgb25lIG9mCiAgICAgICoge0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9TTUFMTH0sIHtAbGluayAjU0NSRUVOTEFZT1VUX1NJWkVfTk9STUFMfSwKLSAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfS4KKyAgICAgKiB7QGxpbmsgI1NDUkVFTkxBWU9VVF9TSVpFX0xBUkdFfSwgb3Ige0BsaW5rICNTQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0V9LgogICAgICAqIAogICAgICAqIDxwPlRoZSB7QGxpbmsgI1NDUkVFTkxBWU9VVF9MT05HX01BU0t9IGRlZmluZXMgd2hldGhlciB0aGUgc2NyZWVuCiAgICAgICogaXMgd2lkZXIvdGFsbGVyIHRoYW4gbm9ybWFsLiAgVGhleSBtYXkgYmUgb25lIG9mCkBAIC0yNjcsMTEgKzI2NiwxOCBAQAogICAgICAgICBzYi5hcHBlbmQoIi8iKTsKICAgICAgICAgc2IuYXBwZW5kKG5hdmlnYXRpb25IaWRkZW4pOwogICAgICAgICBzYi5hcHBlbmQoIiBvcmllbj0iKTsKLSAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgbGF5b3V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoc2NyZWVuTGF5b3V0KTsKLSAgICAgICAgc2IuYXBwZW5kKCIgdWlNb2RlPSIpOwotICAgICAgICBzYi5hcHBlbmQodWlNb2RlKTsKKyAgICAgICAgc3dpdGNoKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX0xBTkRTQ0FQRToKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkwiKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9SSUVOVEFUSU9OX1BPUlRSQUlUOgorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUCIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiBsYXlvdXQ9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHNjcmVlbkxheW91dCkpOworICAgICAgICBzYi5hcHBlbmQoIiB1aU1vZGU9MHgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGphdmEubGFuZy5JbnRlZ2VyLnRvSGV4U3RyaW5nKHVpTW9kZSkpOwogICAgICAgICBpZiAoc2VxICE9IDApIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcT0iKTsKICAgICAgICAgICAgIHNiLmFwcGVuZChzZXEpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1BsdXJhbFJ1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2UzYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUGx1cmFsUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoKLSAqIFl1Y2stby4gIFRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgdG8gaW1wbGVtZW50IHRoaXMuICBXaGVuIHRoZSBJQ1UgUGx1cmFsUnVsZXMKLSAqIG9iamVjdCBoYXMgYmVlbiBpbnRlZ3JhdGVkIHRvIGFuZHJvaWQsIHdlIHNob3VsZCBzd2l0Y2ggdG8gdGhhdC4gIEZvciBub3csIHl1Y2stby4KLSAqLwotCi1hYnN0cmFjdCBjbGFzcyBQbHVyYWxSdWxlcyB7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX09USEVSID0gMHgwMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfWkVSTyAgPSAweDAwMDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9PTkUgICA9IDB4MDAwMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFFVQU5USVRZX1RXTyAgID0gMHgwMDA0OwotICAgIHN0YXRpYyBmaW5hbCBpbnQgUVVBTlRJVFlfRkVXICAgPSAweDAwMDg7Ci0gICAgc3RhdGljIGZpbmFsIGludCBRVUFOVElUWV9NQU5ZICA9IDB4MDAxMDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OwotCi0gICAgYWJzdHJhY3QgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKTsKLQotICAgIGZpbmFsIGludCBhdHRyRm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBQbHVyYWxSdWxlcy5hdHRyRm9yUXVhbnRpdHkocXVhbnRpdHlGb3JOdW1iZXIobikpOwotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgYXR0ckZvclF1YW50aXR5KGludCBxdWFudGl0eSkgewotICAgICAgICAvLyBzZWUgaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKLSAgICAgICAgc3dpdGNoIChxdWFudGl0eSkgewotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7Ci0gICAgICAgICAgICBjYXNlIFFVQU5USVRZX1RXTzogIHJldHVybiAweDAxMDAwMDA3OwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nRm9yUXVhbnRpdHkoaW50IHF1YW50aXR5KSB7Ci0gICAgICAgIHN3aXRjaCAocXVhbnRpdHkpIHsKLSAgICAgICAgICAgIGNhc2UgUVVBTlRJVFlfWkVSTzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInplcm8iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9PTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJvbmUiOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9UV086Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ0d28iOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9GRVc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmZXciOwotICAgICAgICAgICAgY2FzZSBRVUFOVElUWV9NQU5ZOgotICAgICAgICAgICAgICAgIHJldHVybiAibWFueSI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAib3RoZXIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIFBsdXJhbFJ1bGVzIHJ1bGVGb3JMb2NhbGUoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICBTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotICAgICAgICBpZiAoImNzIi5lcXVhbHMobGFuZykpIHsKLSAgICAgICAgICAgIGlmIChjcyA9PSBudWxsKSBjcyA9IG5ldyBjcygpOwotICAgICAgICAgICAgcmV0dXJuIGNzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGVuID09IG51bGwpIGVuID0gbmV3IGVuKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQbHVyYWxSdWxlcyBjczsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBjcyBleHRlbmRzIFBsdXJhbFJ1bGVzIHsKLSAgICAgICAgaW50IHF1YW50aXR5Rm9yTnVtYmVyKGludCBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG4gPj0gMiAmJiBuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfRkVXOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFVQU5USVRZX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGx1cmFsUnVsZXMgZW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZW4gZXh0ZW5kcyBQbHVyYWxSdWxlcyB7Ci0gICAgICAgIGludCBxdWFudGl0eUZvck51bWJlcihpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBRVUFOVElUWV9PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUVVBTlRJVFlfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL1Jlc291cmNlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKaW5kZXggYTY1MTNhYS4uOWIyM2MxZSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucmVzOwogCi0KIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKQEAgLTQyLDYgKzQxLDggQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAoraW1wb3J0IGxpYmNvcmUuaWN1Lk5hdGl2ZVBsdXJhbFJ1bGVzOworCiAvKioKICAqIENsYXNzIGZvciBhY2Nlc3NpbmcgYW4gYXBwbGljYXRpb24ncyByZXNvdXJjZXMuICBUaGlzIHNpdHMgb24gdG9wIG9mIHRoZQogICogYXNzZXQgbWFuYWdlciBvZiB0aGUgYXBwbGljYXRpb24gKGFjY2Vzc2libGUgdGhyb3VnaCBnZXRBc3NldHMoKSkgYW5kCkBAIC01Myw2ICs1NCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0ZPUl9QUkVMT0FEID0gZmFsc2U7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RIRVIgPSAweDAxMDAwMDA0OworCiAgICAgLy8gVXNlIHRoZSBjdXJyZW50IFNESyB2ZXJzaW9uIGNvZGUuICBJZiB3ZSBhcmUgYSBkZXZlbG9wbWVudCBidWlsZCwKICAgICAvLyBhbHNvIGFsbG93IHRoZSBwcmV2aW91cyBTREsgdmVyc2lvbiArIDEuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNTZGtWZXJzaW9uID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UCkBAIC05MSw3ICs5NCw3IEBACiAgICAgLypwYWNrYWdlKi8gZmluYWwgQXNzZXRNYW5hZ2VyIG1Bc3NldHM7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIG1Db25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKICAgICAvKnBhY2thZ2UqLyBmaW5hbCBEaXNwbGF5TWV0cmljcyBtTWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgIFBsdXJhbFJ1bGVzIG1QbHVyYWxSdWxlOworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgbVBsdXJhbFJ1bGU7CiAgICAgCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5SW5mbyBtQ29tcGF0aWJpbGl0eUluZm87CiAgICAgcHJpdmF0ZSBEaXNwbGF5IG1EZWZhdWx0RGlzcGxheTsKQEAgLTIwOCw5ICsyMTEsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHJlc291cmNlIElEIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgKiBudW1lcmljYWwgcXVhbnRpdHkuCisgICAgICoKKyAgICAgKiA8cD5TZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmh0bWwjUGx1cmFscyI+U3RyaW5nCisgICAgICogUmVzb3VyY2VzPC9hPiBmb3IgbW9yZSBvbiBxdWFudGl0eSBzdHJpbmdzLgorICAgICAqCiAgICAgICogQHBhcmFtIGlkIFRoZSBkZXNpcmVkIHJlc291cmNlIGlkZW50aWZpZXIsIGFzIGdlbmVyYXRlZCBieSB0aGUgYWFwdAogICAgICAqICAgICAgICAgICB0b29sLiBUaGlzIGludGVnZXIgZW5jb2RlcyB0aGUgcGFja2FnZSwgdHlwZSwgYW5kIHJlc291cmNlCiAgICAgICogICAgICAgICAgIGVudHJ5LiBUaGUgdmFsdWUgMCBpcyBhbiBpbnZhbGlkIGlkZW50aWZpZXIuCisgICAgICogQHBhcmFtIHF1YW50aXR5IFRoZSBudW1iZXIgdXNlZCB0byBnZXQgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciB0aGUgY3VycmVudCBsYW5ndWFnZSdzCisgICAgICogICAgICAgICAgIHBsdXJhbCBydWxlcy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gVGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBJRCBkb2VzIG5vdCBleGlzdC4KICAgICAgKgpAQCAtMjE4LDI5ICsyMjksNTIgQEAKICAgICAgKiAgICAgICAgIHBvc3NpYmx5IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UXVhbnRpdHlUZXh0KGludCBpZCwgaW50IHF1YW50aXR5KSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOwotICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIHJ1bGUuYXR0ckZvck51bWJlcihxdWFudGl0eSkpOworICAgICAgICBOYXRpdmVQbHVyYWxSdWxlcyBydWxlID0gZ2V0UGx1cmFsUnVsZSgpOworICAgICAgICBDaGFyU2VxdWVuY2UgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsCisgICAgICAgICAgICAgICAgYXR0ckZvclF1YW50aXR5Q29kZShydWxlLnF1YW50aXR5Rm9ySW50KHF1YW50aXR5KSkpOwogICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIFBsdXJhbFJ1bGVzLklEX09USEVSKTsKKyAgICAgICAgcmVzID0gbUFzc2V0cy5nZXRSZXNvdXJjZUJhZ1RleHQoaWQsIElEX09USEVSKTsKICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigiUGx1cmFsIHJlc291cmNlIElEICMweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGlkKQogICAgICAgICAgICAgICAgICsgIiBxdWFudGl0eT0iICsgcXVhbnRpdHkKLSAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgUGx1cmFsUnVsZXMuc3RyaW5nRm9yUXVhbnRpdHkocnVsZS5xdWFudGl0eUZvck51bWJlcihxdWFudGl0eSkpKTsKKyAgICAgICAgICAgICAgICArICIgaXRlbT0iICsgc3RyaW5nRm9yUXVhbnRpdHlDb2RlKHJ1bGUucXVhbnRpdHlGb3JJbnQocXVhbnRpdHkpKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQbHVyYWxSdWxlcyBnZXRQbHVyYWxSdWxlKCkgeworICAgIHByaXZhdGUgTmF0aXZlUGx1cmFsUnVsZXMgZ2V0UGx1cmFsUnVsZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUobUNvbmZpZ3VyYXRpb24ubG9jYWxlKTsKKyAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IE5hdGl2ZVBsdXJhbFJ1bGVzLmZvckxvY2FsZShtQ29uZmlndXJhdGlvbi5sb2NhbGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1QbHVyYWxSdWxlOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGF0dHJGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gMHgwMTAwMDAwNTsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuT05FOiAgcmV0dXJuIDB4MDEwMDAwMDY7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAweDAxMDAwMDA3OworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5GRVc6ICByZXR1cm4gMHgwMTAwMDAwODsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuTUFOWTogcmV0dXJuIDB4MDEwMDAwMDk7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRF9PVEhFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWFudGl0eUNvZGUoaW50IHF1YW50aXR5Q29kZSkgeworICAgICAgICBzd2l0Y2ggKHF1YW50aXR5Q29kZSkgeworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5aRVJPOiByZXR1cm4gInplcm8iOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5PTkU6ICByZXR1cm4gIm9uZSI7CisgICAgICAgICAgICBjYXNlIE5hdGl2ZVBsdXJhbFJ1bGVzLlRXTzogIHJldHVybiAidHdvIjsKKyAgICAgICAgICAgIGNhc2UgTmF0aXZlUGx1cmFsUnVsZXMuRkVXOiAgcmV0dXJuICJmZXciOworICAgICAgICAgICAgY2FzZSBOYXRpdmVQbHVyYWxSdWxlcy5NQU5ZOiByZXR1cm4gIm1hbnkiOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm90aGVyIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQuICBJdAogICAgICAqIHdpbGwgYmUgc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgpAQCAtMjk1LDYgKzMyOSw5IEBACiAgICAgICogc3RyaXBwZWQgb2YgYW55IHN0eWxlZCB0ZXh0IGluZm9ybWF0aW9uLgogICAgICAqIHtAbW9yZX0KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTMxNyw2ICszNTQsOSBAQAogICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgSUQgZm9yIGEgcGFydGljdWxhcgogICAgICAqIG51bWVyaWNhbCBxdWFudGl0eS4KICAgICAgKgorICAgICAqIDxwPlNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuaHRtbCNQbHVyYWxzIj5TdHJpbmcKKyAgICAgKiBSZXNvdXJjZXM8L2E+IGZvciBtb3JlIG9uIHF1YW50aXR5IHN0cmluZ3MuCisgICAgICoKICAgICAgKiBAcGFyYW0gaWQgVGhlIGRlc2lyZWQgcmVzb3VyY2UgaWRlbnRpZmllciwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBhYXB0CiAgICAgICogICAgICAgICAgIHRvb2wuIFRoaXMgaW50ZWdlciBlbmNvZGVzIHRoZSBwYWNrYWdlLCB0eXBlLCBhbmQgcmVzb3VyY2UKICAgICAgKiAgICAgICAgICAgZW50cnkuIFRoZSB2YWx1ZSAwIGlzIGFuIGludmFsaWQgaWRlbnRpZmllci4KQEAgLTEzMTUsNyArMTM1NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgewogICAgICAgICAgICAgaWYgKG1QbHVyYWxSdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGx1cmFsUnVsZSA9IFBsdXJhbFJ1bGVzLnJ1bGVGb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CisgICAgICAgICAgICAgICAgbVBsdXJhbFJ1bGUgPSBOYXRpdmVQbHVyYWxSdWxlcy5mb3JMb2NhbGUoY29uZmlnLmxvY2FsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTE5LDcgKzE1NTksNyBAQAogICAgIC8qKgogICAgICAqIFBhcnNlIGEgc2VyaWVzIG9mIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0V4dHJhICZsdDtleHRyYSZndDt9IHRhZ3MgZnJvbQogICAgICAqIGFuIFhNTCBmaWxlLiAgWW91IGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgYXQgdGhlIHBhcmVudCB0YWcgb2YgdGhlCi0gICAgICogZXh0cmEgdGFncywgYW5kIGl0IHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgorICAgICAqIGV4dHJhIHRhZ3MsIGFuZCBpdCB3aWxsIHJldHVybiBvbmNlIGFsbCBvZiB0aGUgY2hpbGQgdGFncyBoYXZlIGJlZW4gcGFyc2VkLgogICAgICAqIFRoaXMgd2lsbCBjYWxsIHtAbGluayAjcGFyc2VCdW5kbGVFeHRyYX0gZm9yIGVhY2ggZXh0cmEgdGFnIGVuY291bnRlcmVkLgogICAgICAqIAogICAgICAqIEBwYXJhbSBwYXJzZXIgVGhlIHBhcnNlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBleHRyYXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RDdXJzb3IuamF2YQppbmRleCBhNWU1ZTQ2Li45YjE0OTk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0Q3Vyc29yLmphdmEKQEAgLTE4LDE2ICsxOCwxMSBAQAogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC01Niw2ICs1MSwxMCBAQAogICAgIGFic3RyYWN0IHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW4pOwogICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKTsKIAorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKwogICAgIC8vIFRPRE8gaW1wbGVtZW50IGdldEJsb2IgaW4gYWxsIGN1cnNvciB0eXBlcwogICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZ2V0QmxvYiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgbURhdGFTZXRPYnNlcnZhYmxlLm5vdGlmeUludmFsaWRhdGVkKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKICAgICAgICAgaWYgKG1TZWxmT2JzZXJ2ZXIgIT0gbnVsbCAmJiBtU2VsZk9ic2VydmVyUmVnaXN0ZXJlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtTm90aWZ5VXJpLCB0cnVlLCBtU2VsZk9ic2VydmVyKTsKQEAgLTEwOSwyMiArMTA4LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgY3Vyc29yIGlzIHN1Y2Nlc3NmdWxseSBzY3JvbGxlZAogICAgICAqIHRvIGEgbmV3IHBvc2l0aW9uLCBnaXZpbmcgdGhlIHN1YmNsYXNzIGEgY2hhbmNlIHRvIHVwZGF0ZSBhbnkgc3RhdGUgaXQKICAgICAgKiBtYXkgaGF2ZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgbW92ZSBmdW5jdGlvbiB3aWxsIGFsc28gZG8gc28gYW5kIHRoZQpAQCAtMzIwLDEzNyArMzAzLDYgQEAKICAgICAgICAgcmV0dXJuIGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGUoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBTaG9ydC52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlTG9uZyhpbnQgY29sdW1uSW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgTG9uZy52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRmxvYXQudmFsdWVPZih2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZShjb2x1bW5JbmRleCwgRG91YmxlLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gdXBkYXRlKGNvbHVtbkluZGV4LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGludCBjb2x1bW5JbmRleCwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb25nLnZhbHVlT2YoKSByZXR1cm5zIG51bGwgc29tZXRpbWVzIQotLy8gICAgICAgIExvbmcgcm93aWQgPSBMb25nLnZhbHVlT2YoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBMb25nIHJvd2lkID0gbmV3IExvbmcoZ2V0TG9uZyhtUm93SWRDb2x1bW5JbmRleCkpOwotICAgICAgICBpZiAocm93aWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibnVsbCByb3dpZC4gbVJvd0lkQ29sdW1uSW5kZXggPSAiICsgbVJvd0lkQ29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBtVXBkYXRlZFJvd3MuZ2V0KHJvd2lkKTsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgIG1VcGRhdGVkUm93cy5wdXQocm93aWQsIHJvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3cucHV0KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdLCBvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNvbW1pdHRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgcmV0dXJuIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1pdFVwZGF0ZXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyKENvbnRlbnRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ29udGVudE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7CiAgICAgfQpAQCAtNDc4LDkgKzMzMCw5IEBACiAgICAgICAgIHJldHVybiBtRGF0YVNldE9ic2VydmFibGU7CiAgICAgICAgIAogICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtRGF0YVNldE9ic2VydmFibGUucmVnaXN0ZXJPYnNlcnZlcihvYnNlcnZlcik7Ci0gICAgICAgIAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyKSB7CkBAIC01MzUsMzYgKzM4NywxOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBoYXMgYmVlbiB1cGRhdGVkIGFuZCBpcwotICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2dldFVwZGF0ZWRGaWVsZH0gdG8gYWxsb3cgc3ViY2xhc3NlcyB0bwotICAgICAqIHN1cHBvcnQgcmVhZGluZyB1bmNvbW1pdHRlZCB1cGRhdGVzLiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGFuZAotICAgICAqIHtAbGluayAjZ2V0VXBkYXRlZEZpZWxkfSBzaG91bGQgYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhCi0gICAgICogYmxvY2sgc3luY2hyb25pemVkIG9uIG1VcGRhdGVkUm93cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgY29sdW1uIGluZGV4IG9mIHRoZSBmaWVsZCB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaGFzIGJlZW4gdXBkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgZmFsc2Ugc2luY2UgQ3Vyc29ycyBkbyBub3Qgc3VwcG9ydCB1cGRhdGluZyByb3dzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpZWxkVXBkYXRlZChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKG1Sb3dJZENvbHVtbkluZGV4ICE9IC0xICYmIG1VcGRhdGVkUm93cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICAgICAgaWYgKHVwZGF0ZXMgIT0gbnVsbCAmJiB1cGRhdGVzLmNvbnRhaW5zS2V5KGdldENvbHVtbk5hbWVzKClbY29sdW1uSW5kZXhdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVuY29tbWl0dGVkIHVwZGF0ZWQgdmFsdWUgZm9yIHRoZSBmaWVsZAotICAgICAqIGF0IGNvbHVtbkluZGV4LiAgTk9URTogVGhpcyBmdW5jdGlvbiBhbmQge0BsaW5rICNpc0ZpZWxkVXBkYXRlZH0gc2hvdWxkCi0gICAgICogYmUgY2FsbGVkIHRvZ2V0aGVyIGluc2lkZSBvZiBhIGJsb2NrIHN5bmNocm9uaXplZCBvbiBtVXBkYXRlZFJvd3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgZmllbGQgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIHZhbHVlCisgICAgICogQGRlcHJlY2F0ZWQgQWx3YXlzIHJldHVybnMgbnVsbCBzaW5jZSBDdXJzb3JzIGRvIG5vdCBzdXBwb3J0IHVwZGF0aW5nIHJvd3MKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VXBkYXRlZEZpZWxkKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHVwZGF0ZXMgPSBtVXBkYXRlZFJvd3MuZ2V0KG1DdXJyZW50Um93SUQpOwotICAgICAgICByZXR1cm4gdXBkYXRlcy5nZXQoZ2V0Q29sdW1uTmFtZXMoKVtjb2x1bW5JbmRleF0pOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNCwxMSArNDQ5LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIEhhc2hNYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gTG9uZyByb3dJRHMgdG8gYW5vdGhlciBNYXAKLSAgICAgKiB0aGF0IG1hcHMgZnJvbSBTdHJpbmcgY29sdW1uIG5hbWVzIHRvIG5ldyB2YWx1ZXMuIEEgTlVMTCB2YWx1ZSBtZWFucyB0bwotICAgICAqIHJlbW92ZSBhbiBleGlzdGluZyB2YWx1ZSwgYW5kIGFsbCBudW1lcmljIHZhbHVlcyBhcmUgaW4gdGhlaXIgY2xhc3MKLSAgICAgKiBmb3JtcywgaS5lLiBJbnRlZ2VyLCBMb25nLCBGbG9hdCwgZXRjLgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaXMgbmV2ZXIgdXBkYXRlZCBieSB0aGlzIGNsYXNzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IG1VcGRhdGVkUm93czsKIAogICAgIC8qKgpAQCAtNjI4LDYgKzQ2MSwxMSBAQAogICAgIHByb3RlY3RlZCBpbnQgbVJvd0lkQ29sdW1uSW5kZXg7CiAKICAgICBwcm90ZWN0ZWQgaW50IG1Qb3M7CisgICAgLyoqCisgICAgICogSWYge0BsaW5rICNtUm93SWRDb2x1bW5JbmRleH0gaXMgbm90IC0xIHRoaXMgY29udGFpbnMgY29udGFpbnMgdGhlIHZhbHVlIG9mCisgICAgICogdGhlIGNvbHVtbiBhdCB7QGxpbmsgI21Sb3dJZENvbHVtbkluZGV4fSBmb3IgdGhlIGN1cnJlbnQgcm93IHRoaXMgY3Vyc29yIGlzCisgICAgICogcG9pbnRpbmcgYXQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIExvbmcgbUN1cnJlbnRSb3dJRDsKICAgICBwcm90ZWN0ZWQgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNsb3NlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQWJzdHJhY3RXaW5kb3dlZEN1cnNvci5qYXZhCmluZGV4IDI3YTAyZTIuLjhhZGRhYTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0Fic3RyYWN0V2luZG93ZWRDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yLmphdmEKQEAgLTE5LDIwMiArMTksMTA1IEBACiAvKioKICAqIEEgYmFzZSBjbGFzcyBmb3IgQ3Vyc29ycyB0aGF0IHN0b3JlIHRoZWlyIGRhdGEgaW4ge0BsaW5rIEN1cnNvcldpbmRvd31zLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yCi17CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXaW5kb3dlZEN1cnNvciBleHRlbmRzIEFic3RyYWN0Q3Vyc29yIHsKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJsb2IoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChieXRlW10pZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldEJsb2IobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkKLSAgICB7CisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBtV2luZG93LmdldFN0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikKLSAgICB7CisgICAgcHVibGljIHZvaWQgY29weVN0cmluZ1RvQnVmZmVyKGludCBjb2x1bW5JbmRleCwgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcikgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuY29weVN0cmluZ1RvQnVmZmVyKGNvbHVtbkluZGV4LCBidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICBtV2luZG93LmNvcHlTdHJpbmdUb0J1ZmZlcihtUG9zLCBjb2x1bW5JbmRleCwgYnVmZmVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRTaG9ydChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRJbnQobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldExvbmcoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE51bWJlciB2YWx1ZSA9IChOdW1iZXIpZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRMb25nKG1Qb3MsIGNvbHVtbkluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGNvbHVtbkluZGV4KSB7CiAgICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoaXNGaWVsZFVwZGF0ZWQoY29sdW1uSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcilnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRGbG9hdChtUG9zLCBjb2x1bW5JbmRleCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGNvbHVtbkluZGV4KQotICAgIHsKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBOdW1iZXIgdmFsdWUgPSAoTnVtYmVyKWdldFVwZGF0ZWRGaWVsZChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXREb3VibGUobVBvcywgY29sdW1uSW5kZXgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpCi0gICAgeworICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KSA9PSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNOdWxsKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cuZ2V0VHlwZShtUG9zLCBjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2IoaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgICAgY2hlY2tQb3NpdGlvbigpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChpc0ZpZWxkVXBkYXRlZChjb2x1bW5JbmRleCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0VXBkYXRlZEZpZWxkKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgb2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1XaW5kb3cuaXNCbG9iKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRUeXBlfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0cmluZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbVdpbmRvdy5pc1N0cmluZyhtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlciB8fCBvYmplY3QgaW5zdGFuY2VvZiBMb25nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzTG9uZyhtUG9zLCBjb2x1bW5JbmRleCk7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0VHlwZX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZyhpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoY29sdW1uSW5kZXgpID09IEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdChpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgICBjaGVja1Bvc2l0aW9uKCk7Ci0KLSAgICAgICAgc3luY2hyb25pemVkKG1VcGRhdGVkUm93cykgewotICAgICAgICAgICAgaWYgKGlzRmllbGRVcGRhdGVkKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRVcGRhdGVkRmllbGQoY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiAob2JqZWN0IGluc3RhbmNlb2YgRmxvYXQgfHwgb2JqZWN0IGluc3RhbmNlb2YgRG91YmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtV2luZG93LmlzRmxvYXQobVBvcywgY29sdW1uSW5kZXgpOworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFR5cGV9CisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KGludCBjb2x1bW5JbmRleCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShjb2x1bW5JbmRleCkgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQb3NpdGlvbigpCi0gICAgeworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgY2hlY2tQb3NpdGlvbigpOworICAgICAgICByZXR1cm4gbVdpbmRvdy5nZXRUeXBlKG1Qb3MsIGNvbHVtbkluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1Bvc2l0aW9uKCkgewogICAgICAgICBzdXBlci5jaGVja1Bvc2l0aW9uKCk7CiAgICAgICAgIAogICAgICAgICBpZiAobVdpbmRvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGVEYXRhRXhjZXB0aW9uKCJBY2Nlc3MgY2xvc2VkIGN1cnNvciIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFN0YWxlRGF0YUV4Y2VwdGlvbigiQXR0ZW1wdGluZyB0byBhY2Nlc3MgYSBjbG9zZWQgY3Vyc29yIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JOYXRpdmUuamF2YQppbmRleCBiYWE5NGQ4Li5mYTYyZDY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yTmF0aXZlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvck5hdGl2ZS5qYXZhCkBAIC0xNywxMyArMTcsMTAgQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIC8qKgogICogTmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBidWxrIGN1cnNvci4gVGhpcyBpcyBvbmx5IGZvciB1c2UgaW4gaW1wbGVtZW50aW5nCkBAIC0xMjAsMjYgKzExNyw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5lbmZvcmNlSW50ZXJmYWNlKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gd2hhdCBDbGFzc0xvYWRlciBzaG91bGQgYmUgcGFzc2VkIHRvIHJlYWRIYXNoTWFwPwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIC0gc3dpdGNoIHRvIEJ1bmRsZQotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcyA9IGRhdGEucmVhZEhhc2hNYXAobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdXBkYXRlUm93cyh2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlSW50KChyZXN1bHQgPT0gdHJ1ZSA/IDEgOiAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFX1JPV19UUkFOU0FDVElPTjogewotICAgICAgICAgICAgICAgICAgICBkYXRhLmVuZm9yY2VJbnRlcmZhY2UoSUJ1bGtDdXJzb3IuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGRhdGEucmVhZEludCgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGRlbGV0ZVJvdyhwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkud3JpdGVJbnQoKHJlc3VsdCA9PSB0cnVlID8gMSA6IDApKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgY2FzZSBPTl9NT1ZFX1RSQU5TQUNUSU9OOiB7CiAgICAgICAgICAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQnVsa0N1cnNvci5kZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50KCk7CkBAIC0zNDMsNDggKzMyMCw2IEBACiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcCB2YWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotCi0gICAgICAgIGRhdGEud3JpdGVNYXAodmFsdWVzKTsKLQotICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFVQREFURV9ST1dTX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7Ci0KLSAgICAgICAgRGF0YWJhc2VVdGlscy5yZWFkRXhjZXB0aW9uRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJlc3VsdCA9IChyZXBseS5yZWFkSW50KCkgPT0gMSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICAgICAgZGF0YS5yZWN5Y2xlKCk7Ci0gICAgICAgIHJlcGx5LnJlY3ljbGUoKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdyhpbnQgcG9zaXRpb24pIHRocm93cyBSZW1vdGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwotICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElCdWxrQ3Vyc29yLmRlc2NyaXB0b3IpOwotCi0gICAgICAgIGRhdGEud3JpdGVJbnQocG9zaXRpb24pOwotCi0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoREVMRVRFX1JPV19UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwotCi0gICAgICAgIERhdGFiYXNlVXRpbHMucmVhZEV4Y2VwdGlvbkZyb21QYXJjZWwocmVwbHkpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAocmVwbHkucmVhZEludCgpID09IDEgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgICAgIGRhdGEucmVjeWNsZSgpOwotICAgICAgICByZXBseS5yZWN5Y2xlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRXYW50c0FsbE9uTW92ZUNhbGxzKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIFBhcmNlbCBkYXRhID0gUGFyY2VsLm9idGFpbigpOwogICAgICAgICBQYXJjZWwgcmVwbHkgPSBQYXJjZWwub2J0YWluKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9CdWxrQ3Vyc29yVG9DdXJzb3JBZGFwdG9yLmphdmEKaW5kZXggMTQ2OWVhMi4uMmNiMmFlYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQnVsa0N1cnNvclRvQ3Vyc29yQWRhcHRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0J1bGtDdXJzb3JUb0N1cnNvckFkYXB0b3IuamF2YQpAQCAtMTYsMTIgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiAvKioKICAqIEFkYXB0cyBhbiB7QGxpbmsgSUJ1bGtDdXJzb3J9IHRvIGEge0BsaW5rIEN1cnNvcn0gZm9yIHVzZSBpbiB0aGUgbG9jYWwKICAqIHByb2Nlc3MuCkBAIC0xNzQsMzggKzE3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBtQnVsa0N1cnNvci5kZWxldGVSb3cobVBvcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHdpbmRvdyBjb250YWlucyB0aGUgb2xkIHZhbHVlLCBkaXNjYXJkIGl0Ci0gICAgICAgICAgICAgICAgbVdpbmRvdyA9IG51bGw7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy8gRml4IHVwIHRoZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1Db3VudCA9IG1CdWxrQ3Vyc29yLmNvdW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qb3MgPCBtQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZFBvcyA9IG1Qb3M7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3MgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVRvUG9zaXRpb24ob2xkUG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9zID0gbUNvdW50OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNoYW5nZSBub3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGRlbGV0ZSByb3cgYmVjYXVzZSB0aGUgcmVtb3RlIHByb2Nlc3MgaXMgZGVhZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgewogICAgICAgICBpZiAobUNvbHVtbnMgPT0gbnVsbCkgewpAQCAtMjE5LDQ0ICsxODUsNiBAQAogICAgICAgICByZXR1cm4gbUNvbHVtbnM7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBpZiAoIXN1cHBvcnRzVXBkYXRlcygpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJjb21taXRVcGRhdGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBjdXJzb3IsIGRpZCB5b3UgaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZChtVXBkYXRlZFJvd3MpIHsKLSAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MucHV0QWxsKGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVVwZGF0ZWRSb3dzLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbUJ1bGtDdXJzb3IudXBkYXRlUm93cyhtVXBkYXRlZFJvd3MpOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtVXBkYXRlZFJvd3MuY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGNvbW1pdCB1cGRhdGVzIGJlY2F1c2UgdGhlIHJlbW90ZSBwcm9jZXNzIGlzIGRlYWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKaW5kZXggNjUzOTE1Ni4uYzAzYzU4NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yLmphdmEKQEAgLTMwLDYgKzMwLDI1IEBACiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIEN1cnNvci4KICAqLwogcHVibGljIGludGVyZmFjZSBDdXJzb3IgeworICAgIC8qCisgICAgICogVmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfS4KKyAgICAgKiBUaGVzZSBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIGRlZmluZWQgaW4gQ3Vyc29yV2luZG93LmgKKyAgICAgKi8KKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIG51bGwgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfTlVMTCA9IDA7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgIGNvbHVtbiB0eXBlIGlzIGludGVnZXIgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfSU5URUdFUiA9IDE7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRUeXBlKGludCl9IGlmIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUgaXMgZmxvYXQgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfRkxPQVQgPSAyOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGlzIHN0cmluZyAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVFlQRV9TVFJJTkcgPSAzOworCisgICAgLyoqIFZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VHlwZShpbnQpfSBpZiB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGlzIGJsb2IgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1RZUEVfQkxPQiA9IDQ7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXJzIG9mIHJvd3MgaW4gdGhlIGN1cnNvci4KICAgICAgKgpAQCAtMTQ2LDIyICsxNjUsNiBAQAogICAgIGJvb2xlYW4gaXNBZnRlckxhc3QoKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHJvdyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhCi0gICAgICogc3RvcmUuIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnNvciB3aWxsIGJlIHBvaW50aW5nIHRvIHRoZSByb3cKLSAgICAgKiBhZnRlciB0aGUgcm93IHRoYXQgaXMgZGVsZXRlZC4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGRlY3JlbWVudGluZwotICAgICAqIHRoZSByZXN1bHQgb2YgY291bnQoKSBieSBvbmUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHF1ZXJ5IG11c3QgaGF2ZSB0aGUgcm93IElEIGNvbHVtbiBpbiBpdHMgc2VsZWN0aW9uLCBvdGhlcndpc2UgdGhpcwotICAgICAqIGNhbGwgd2lsbCBmYWlsLgotICAgICAqIAotICAgICAqIEBoaWRlCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSByZWNvcmQgd2FzIHN1Y2Nlc3NmdWxseSBkZWxldGVkLgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQ29udGVudFJlc29sdmVyI2RlbGV0ZShVcmksIFN0cmluZywgU3RyaW5nW10pfQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBkZWxldGVSb3coKTsKLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHplcm8tYmFzZWQgaW5kZXggZm9yIHRoZSBnaXZlbiBjb2x1bW4gbmFtZSwgb3IgLTEgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IGV4aXN0LgogICAgICAqIElmIHlvdSBleHBlY3QgdGhlIGNvbHVtbiB0byBleGlzdCB1c2Uge0BsaW5rICNnZXRDb2x1bW5JbmRleE9yVGhyb3coU3RyaW5nKX0gaW5zdGVhZCwgd2hpY2gKICAgICAgKiB3aWxsIG1ha2UgdGhlIGVycm9yIG1vcmUgY2xlYXIuCkBAIC0yOTUsNiArMjk4LDI3IEBACiAgICAgZG91YmxlIGdldERvdWJsZShpbnQgY29sdW1uSW5kZXgpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhIHR5cGUgb2YgdGhlIGdpdmVuIGNvbHVtbidzIHZhbHVlLgorICAgICAqIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgY29sdW1uIGlzIHJldHVybmVkIGJ1dCB0aGUgZGF0YSBtYXkgYmUgY29udmVydGVkIHRvIG90aGVyIHR5cGVzCisgICAgICogYXMgZG9jdW1lbnRlZCBpbiB0aGUgZ2V0LXR5cGUgbWV0aG9kcyBzdWNoIGFzIHtAbGluayAjZ2V0SW50KGludCl9LCB7QGxpbmsgI2dldEZsb2F0KGludCl9CisgICAgICogZXRjLgorICAgICAqPHA+CisgICAgICogUmV0dXJuZWQgY29sdW1uIHR5cGVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI0ZJRUxEX1RZUEVfTlVMTH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9JTlRFR0VSfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX0ZMT0FUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNGSUVMRF9UWVBFX1NUUklOR308L2xpPgorICAgICAqICAgPGxpPntAbGluayAjRklFTERfVFlQRV9CTE9CfTwvbGk+CisgICAgICo8L3VsPgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgorICAgICAqIEByZXR1cm4gY29sdW1uIHZhbHVlIHR5cGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0VHlwZShpbnQgY29sdW1uSW5kZXgpOworCisgICAgLyoqCiAgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgaW4gdGhlIGluZGljYXRlZCBjb2x1bW4gaXMgbnVsbC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KQEAgLTMwMywxODggKzMyNyw2IEBACiAgICAgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbkluZGV4KTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnNvciBzdXBwb3J0cyB1cGRhdGVzLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBjdXJzb3Igc3VwcG9ydHMgdXBkYXRlcy4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gc3VwcG9ydHNVcGRhdGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29tbWl0dGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiBoYXNVcGRhdGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlQmxvYihpbnQgY29sdW1uSW5kZXgsIGJ5dGVbXSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiBpbiB0aGUgcm93IHRoZSBjdXJzb3IgaXMKLSAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgYXQuIFVwZGF0ZXMgYXJlIG5vdCBjb21taXR0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUKLSAgICAgKiB1bnRpbCB7QGxpbmsgI2NvbW1pdFVwZGF0ZXMoKX0gaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSB0YXJnZXQgY29sdW1uLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlLgotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gdXBkYXRlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgQ3Vyc29yCi0gICAgICogdXBkYXRlIG1ldGhvZHMKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVTaG9ydChpbnQgY29sdW1uSW5kZXgsIHNob3J0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVJbnQoaW50IGNvbHVtbkluZGV4LCBpbnQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVGbG9hdChpbnQgY29sdW1uSW5kZXgsIGZsb2F0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIGluIHRoZSByb3cgdGhlIGN1cnNvciBpcwotICAgICAqIGN1cnJlbnRseSBwb2ludGluZyBhdC4gVXBkYXRlcyBhcmUgbm90IGNvbW1pdHRlZCB0byB0aGUgYmFja2luZyBzdG9yZQotICAgICAqIHVudGlsIHtAbGluayAjY29tbWl0VXBkYXRlcygpfSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHRhcmdldCBjb2x1bW4uCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUuCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHJvdyB0aGUgY3Vyc29yIGlzCi0gICAgICogY3VycmVudGx5IHBvaW50aW5nIGF0LiBVcGRhdGVzIGFyZSBub3QgY29tbWl0dGVkIHRvIHRoZSBiYWNraW5nIHN0b3JlCi0gICAgICogdW50aWwge0BsaW5rICNjb21taXRVcGRhdGVzKCl9IGlzIGNhbGxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5JbmRleCB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgdGFyZ2V0IGNvbHVtbi4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBjb21taXRzIGFsbCB1cGRhdGVzIHRvIHRoZSBiYWNraW5nIHN0b3JlLiBBZnRlciBjb21wbGV0aW9uLAotICAgICAqIHRoaXMgbWV0aG9kIGxlYXZlcyB0aGUgZGF0YSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIHlvdSBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayAjcmVxdWVyeX0gYmVmb3JlIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBjdXJzb3IgYWdhaW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIEF0b21pY2FsbHkgY29tbWl0cyBhbGwgdXBkYXRlcyB0byB0aGUgYmFja2luZyBzdG9yZSwgYXMgd2VsbCBhcyB0aGUKLSAgICAgKiB1cGRhdGVzIGluY2x1ZGVkIGluIHZhbHVlcy4gQWZ0ZXIgY29tcGxldGlvbiwKLSAgICAgKiB0aGlzIG1ldGhvZCBsZWF2ZXMgdGhlIGRhdGEgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGFuZCB5b3Ugc2hvdWxkIGNhbGwKLSAgICAgKiB7QGxpbmsgI3JlcXVlcnl9IGJlZm9yZSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgY3Vyc29yIGFnYWluLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlcyBBIG1hcCBmcm9tIHJvdyBJRHMgdG8gTWFwcyBhc3NvY2lhdGluZyBjb2x1bW4gbmFtZXMgd2l0aAotICAgICAqICAgICAgICAgICAgICAgdXBkYXRlZCB2YWx1ZXMuIEEgbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGZpZWxkIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBDb250ZW50UmVzb2x2ZXJ9IHVwZGF0ZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIEN1cnNvcgotICAgICAqIHVwZGF0ZSBtZXRob2RzCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsT2JqZWN0Pj4gdmFsdWVzKTsKLQotICAgIC8qKgotICAgICAqIFJldmVydHMgYWxsIHVwZGF0ZXMgbWFkZSB0byB0aGUgY3Vyc29yIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLSAgICAgKiBjb21taXRVcGRhdGVzLgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgQ29udGVudFJlc29sdmVyfSB1cGRhdGUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBDdXJzb3IKLSAgICAgKiB1cGRhdGUgbWV0aG9kcwotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgdm9pZCBhYm9ydFVwZGF0ZXMoKTsKLQotICAgIC8qKgogICAgICAqIERlYWN0aXZhdGVzIHRoZSBDdXJzb3IsIG1ha2luZyBhbGwgY2FsbHMgb24gaXQgZmFpbCB1bnRpbCB7QGxpbmsgI3JlcXVlcnl9IGlzIGNhbGxlZC4KICAgICAgKiBJbmFjdGl2ZSBDdXJzb3JzIHVzZSBmZXdlciByZXNvdXJjZXMgdGhhbiBhY3RpdmUgQ3Vyc29ycy4KICAgICAgKiBDYWxsaW5nIHtAbGluayAjcmVxdWVyeX0gd2lsbCBtYWtlIHRoZSBjdXJzb3IgYWN0aXZlIGFnYWluLgpAQCAtNDk2LDYgKzMzOCwxMCBAQAogICAgICAqIGNvbnRlbnRzLiBUaGlzIG1heSBiZSBkb25lIGF0IGFueSB0aW1lLCBpbmNsdWRpbmcgYWZ0ZXIgYSBjYWxsIHRvIHtAbGluawogICAgICAqICNkZWFjdGl2YXRlfS4KICAgICAgKgorICAgICAqIFNpbmNlIHRoaXMgbWV0aG9kIGNvdWxkIGV4ZWN1dGUgYSBxdWVyeSBvbiB0aGUgZGF0YWJhc2UgYW5kIHBvdGVudGlhbGx5IHRha2UKKyAgICAgKiBhIHdoaWxlLCBpdCBjb3VsZCBjYXVzZSBBTlIgaWYgaXQgaXMgY2FsbGVkIG9uIE1haW4gKFVJKSB0aHJlYWQuCisgICAgICogQSB3YXJuaW5nIGlzIHByaW50ZWQgaWYgdGhpcyBtZXRob2QgaXMgYmVpbmcgZXhlY3V0ZWQgb24gTWFpbiB0aHJlYWQuCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlcnkgc3VjY2VlZGVkLCBmYWxzZSBpZiBub3QsIGluIHdoaWNoIGNhc2UgdGhlCiAgICAgICogICAgICAgICBjdXJzb3IgYmVjb21lcyBpbnZhbGlkLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yVG9CdWxrQ3Vyc29yQWRhcHRvci5qYXZhCmluZGV4IDc0OGViOTkuLjhiYzdkZTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvclRvQnVsa0N1cnNvckFkYXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JUb0J1bGtDdXJzb3JBZGFwdG9yLmphdmEKQEAgLTE2LDE2ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVNaXN1c2VFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIAogLyoqCiAgKiBXcmFwcyBhIEJ1bGtDdXJzb3IgYXJvdW5kIGFuIGV4aXN0aW5nIEN1cnNvciBtYWtpbmcgaXQgcmVtb3RhYmxlLgpAQCAtMzgsNyArMzQsNiBAQAogICAgIHByaXZhdGUgZmluYWwgQ3Jvc3NQcm9jZXNzQ3Vyc29yIG1DdXJzb3I7CiAgICAgcHJpdmF0ZSBDdXJzb3JXaW5kb3cgbVdpbmRvdzsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUHJvdmlkZXJOYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVhZE9ubHk7CiAgICAgcHJpdmF0ZSBDb250ZW50T2JzZXJ2ZXJQcm94eSBtT2JzZXJ2ZXI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250ZW50T2JzZXJ2ZXJQcm94eSBleHRlbmRzIENvbnRlbnRPYnNlcnZlciAKQEAgLTk4LDcgKzkzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgIk9ubHkgQ3Jvc3NQcm9jZXNzQ3Vyc29yIGN1cnNvcnMgYXJlIHN1cHBvcnRlZCBhY3Jvc3MgcHJvY2VzcyBmb3Igbm93IiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgbVByb3ZpZGVyTmFtZSA9IHByb3ZpZGVyTmFtZTsKLSAgICAgICAgbVJlYWRPbmx5ID0gIWFsbG93V3JpdGU7CiAKICAgICAgICAgY3JlYXRlQW5kUmVnaXN0ZXJPYnNlcnZlclByb3h5KG9ic2VydmVyKTsKICAgICB9CkBAIC0xOTcsMzEgKzE5MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVSb3dzKE1hcDw/IGV4dGVuZHMgTG9uZywgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlcykgewotICAgICAgICBpZiAobVJlYWRPbmx5KSB7Ci0gICAgICAgICAgICBMb2cudygiQ29udGVudFByb3ZpZGVyIiwgIlBlcm1pc3Npb24gRGVuaWFsOiBtb2RpZnlpbmcgIgotICAgICAgICAgICAgICAgICAgICArIG1Qcm92aWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gcGlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5jb21taXRVcGRhdGVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVJlYWRPbmx5KSB7Ci0gICAgICAgICAgICBMb2cudygiQ29udGVudFByb3ZpZGVyIiwgIlBlcm1pc3Npb24gRGVuaWFsOiBtb2RpZnlpbmcgIgotICAgICAgICAgICAgICAgICAgICArIG1Qcm92aWRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gcGlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUN1cnNvci5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0RXh0cmFzKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQppbmRleCBjNzU2ODI1Li41OTk0MzFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3cuamF2YQpAQCAtMjE3LDE4ICsyMTcsMTMgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyB7QGNvZGUgTlVMTH0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzTnVsbF9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzTnVsbF9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGJ5dGUgYXJyYXkgZm9yIHRoZSBnaXZlbiBmaWVsZC4KICAgICAgKgpAQCAtMjQ4LDE5ICsyNDMsNDMgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBieXRlW10gZ2V0QmxvYl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGEgdHlwZSBvZiB0aGUgZ2l2ZW4gY29sdW1uJ3MgdmFsdWUuCisgICAgICo8cD4KKyAgICAgKiBSZXR1cm5lZCBjb2x1bW4gdHlwZXMgYXJlCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9OVUxMfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0lOVEVHRVJ9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfRkxPQVR9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfU1RSSU5HfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0JMT0J9PC9saT4KKyAgICAgKjwvdWw+CisgICAgICo8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdworICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCByb3csIGludCBjb2wpIHsKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGVfbmF0aXZlKHJvdyAtIG1TdGFydFBvcywgY29sKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBhIGZpZWxkIGNvbnRhaW5zIGVpdGhlciBhIGJsb2Igb3IgaXMgbnVsbC4KICAgICAgKgogICAgICAqIEBwYXJhbSByb3cgdGhlIHJvdyB0byByZWFkIGZyb20sIHJvdyAtIGdldFN0YXJ0UG9zaXRpb24oKSBiZWluZyB0aGUgYWN0dWFsIHJvdyBpbiB0aGUgd2luZG93CiAgICAgICogQHBhcmFtIGNvbCB0aGUgY29sdW1uIHRvIHJlYWQgZnJvbQogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIGZpZWxkIGlzIHtAY29kZSBOVUxMfSBvciBhIGJsb2IKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNCbG9iKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmxvYl9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGludCB0eXBlID0gZ2V0VHlwZShyb3csIGNvbCk7CisgICAgICAgIHJldHVybiB0eXBlID09IEN1cnNvci5GSUVMRF9UWVBFX0JMT0IgfHwgdHlwZSA9PSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY5LDE0ICsyODgsMTEgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyBhIGxvbmcKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRUeXBlKGludCwgaW50KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gaXNMb25nKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzSW50ZWdlcl9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9JTlRFR0VSOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjg1LDE0ICszMDEsMTEgQEAKICAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgdG8gcmVhZCBmcm9tLCByb3cgLSBnZXRTdGFydFBvc2l0aW9uKCkgYmVpbmcgdGhlIGFjdHVhbCByb3cgaW4gdGhlIHdpbmRvdwogICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbHVtbiB0byByZWFkIGZyb20KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBmaWVsZCBpcyBhIGZsb2F0CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzRmxvYXQoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNGbG9hdF9uYXRpdmUocm93IC0gbVN0YXJ0UG9zLCBjb2wpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRUeXBlKHJvdywgY29sKSA9PSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDsKICAgICB9CiAKICAgICAvKioKQEAgLTMwMSwyMCArMzE0LDE1IEBACiAgICAgICogQHBhcmFtIHJvdyB0aGUgcm93IHRvIHJlYWQgZnJvbSwgcm93IC0gZ2V0U3RhcnRQb3NpdGlvbigpIGJlaW5nIHRoZSBhY3R1YWwgcm93IGluIHRoZSB3aW5kb3cKICAgICAgKiBAcGFyYW0gY29sIHRoZSBjb2x1bW4gdG8gcmVhZCBmcm9tCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gZmllbGQgaXMge0Bjb2RlIE5VTEx9IG9yIGEgU3RyaW5nCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZShpbnQsIGludCl9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlzU3RyaW5nX25hdGl2ZShyb3cgLSBtU3RhcnRQb3MsIGNvbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHR5cGUgPSBnZXRUeXBlKHJvdywgY29sKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HIHx8IHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTDsKICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGlzQmxvYl9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc1N0cmluZ19uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBpc0ludGVnZXJfbmF0aXZlKGludCByb3csIGludCBjb2wpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gaXNGbG9hdF9uYXRpdmUoaW50IHJvdywgaW50IGNvbCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGdldFR5cGVfbmF0aXZlKGludCByb3csIGludCBjb2wpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIFN0cmluZyBmb3IgdGhlIGdpdmVuIGZpZWxkLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvQ3Vyc29yV3JhcHBlci5qYXZhCmluZGV4IGYwYWE3ZDcuLjNjM2JkNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldyYXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXcmFwcGVyLmphdmEKQEAgLTE3LDI4ICsxNywyNiBAQAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNoYXJBcnJheUJ1ZmZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCiAvKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIEN1cnNvciB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgdG8gdGhlIGFjdHVhbCBjdXJzb3Igb2JqZWN0CisgKiBXcmFwcGVyIGNsYXNzIGZvciBDdXJzb3IgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNhbGxzIHRvIHRoZSBhY3R1YWwgY3Vyc29yIG9iamVjdC4gIFRoZSBwcmltYXJ5CisgKiB1c2UgZm9yIHRoaXMgY2xhc3MgaXMgdG8gZXh0ZW5kIGEgY3Vyc29yIHdoaWxlIG92ZXJyaWRpbmcgb25seSBhIHN1YnNldCBvZiBpdHMgbWV0aG9kcy4KICAqLwotCiBwdWJsaWMgY2xhc3MgQ3Vyc29yV3JhcHBlciBpbXBsZW1lbnRzIEN1cnNvciB7CiAKKyAgICBwcml2YXRlIGZpbmFsIEN1cnNvciBtQ3Vyc29yOworCiAgICAgcHVibGljIEN1cnNvcldyYXBwZXIoQ3Vyc29yIGN1cnNvcikgewogICAgICAgICBtQ3Vyc29yID0gY3Vyc29yOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIGN1cnNvcgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFib3J0VXBkYXRlcygpIHsKLSAgICAgICAgbUN1cnNvci5hYm9ydFVwZGF0ZXMoKTsKKyAgICBwdWJsaWMgQ3Vyc29yIGdldFdyYXBwZWRDdXJzb3IoKSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewpAQCAtNDksMjMgKzQ3LDYgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNDbG9zZWQoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuY29tbWl0VXBkYXRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKAotICAgICAgICAgICAgTWFwPD8gZXh0ZW5kcyBMb25nLCA/IGV4dGVuZHMgTWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmNvbW1pdFVwZGF0ZXModmFsdWVzKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5nZXRDb3VudCgpOwogICAgIH0KQEAgLTc0LDE0ICs1NSw2IEBACiAgICAgICAgIG1DdXJzb3IuZGVhY3RpdmF0ZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewogICAgICAgICByZXR1cm4gbUN1cnNvci5tb3ZlVG9GaXJzdCgpOwogICAgIH0KQEAgLTE0NywxNCArMTIwLDYgQEAKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0V2FudHNBbGxPbk1vdmVDYWxscygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci5oYXNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7CiAgICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7CiAgICAgfQpAQCAtMTcxLDYgKzEzNiwxMCBAQAogICAgICAgICByZXR1cm4gbUN1cnNvci5pc0xhc3QoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIHJldHVybiBtQ3Vyc29yLmdldFR5cGUoY29sdW1uSW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KTsKICAgICB9CkBAIC0yMTksMTQgKzE4OCw2IEBACiAgICAgICAgIG1DdXJzb3Iuc2V0Tm90aWZpY2F0aW9uVXJpKGNyLCB1cmkpOyAgICAgICAgCiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzVXBkYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3Iuc3VwcG9ydHNVcGRhdGVzKCk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihDb250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKICAgICAgICAgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG9ic2VydmVyKTsgICAgICAgIAogICAgIH0KQEAgLTIzNCw3MiArMTk1LDUgQEAKICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKERhdGFTZXRPYnNlcnZlciBvYnNlcnZlcikgewogICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVEb3VibGUoaW50IGNvbHVtbkluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRG91YmxlKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUZsb2F0KGludCBjb2x1bW5JbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlRmxvYXQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlSW50KGludCBjb2x1bW5JbmRleCwgaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUludChjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVMb25nKGludCBjb2x1bW5JbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVMb25nKGNvbHVtbkluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNob3J0KGludCBjb2x1bW5JbmRleCwgc2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJzb3IudXBkYXRlU2hvcnQoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU3RyaW5nKGludCBjb2x1bW5JbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZVN0cmluZyhjb2x1bW5JbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLnVwZGF0ZUJsb2IoY29sdW1uSW5kZXgsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlVG9OdWxsKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICByZXR1cm4gbUN1cnNvci51cGRhdGVUb051bGwoY29sdW1uSW5kZXgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEN1cnNvciBtQ3Vyc29yOwotICAgIAogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YVNldE9ic2VydmFibGUuamF2YQppbmRleCA5MjAwZTgxLi41MWM3MmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhU2V0T2JzZXJ2YWJsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFTZXRPYnNlcnZhYmxlLmphdmEKQEAgLTI3LDggKzI3LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCgpIHsKICAgICAgICAgc3luY2hyb25pemVkKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uQ2hhbmdlZCgpOworICAgICAgICAgICAgLy8gc2luY2Ugb25DaGFuZ2VkKCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGFwcCwgaXQgY291bGQgZG8gYW55dGhpbmcsIGluY2x1ZGluZworICAgICAgICAgICAgLy8gcmVtb3ZpbmcgaXRzZWxmIGZyb20ge0BsaW5rIG1PYnNlcnZlcnN9IC0gYW5kIHRoYXQgY291bGQgY2F1c2UgcHJvYmxlbXMgaWYKKyAgICAgICAgICAgIC8vIGFuIGl0ZXJhdG9yIGlzIHVzZWQgb24gdGhlIEFycmF5TGlzdCB7QGxpbmsgbU9ic2VydmVyc30uCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzdWNoIHByb2JsZW1zLCBqdXN0IG1hcmNoIHRocnUgdGhlIGxpc3QgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgICAgICAgICAgICBmb3IgKGludCBpID0gbU9ic2VydmVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1PYnNlcnZlcnMuZ2V0KGkpLm9uQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzksOCArNDMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUludmFsaWRhdGVkKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1PYnNlcnZlcnMpIHsKLSAgICAgICAgICAgIGZvciAoRGF0YVNldE9ic2VydmVyIG9ic2VydmVyIDogbU9ic2VydmVycykgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLm9uSW52YWxpZGF0ZWQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtT2JzZXJ2ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbU9ic2VydmVycy5nZXQoaSkub25JbnZhbGlkYXRlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZTsKKworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworCisvKioKKyAqIEFuIGludGVyZmFjZSB0byBsZXQgdGhlIGFwcHMgZGVmaW5lIHRoZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgZGV0ZWN0ZWQKKyAqICAgZGF0YWJhc2UgY29ycnVwdGlvbgorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHsKKworICAgIC8qKgorICAgICAqIGRlZmluZXMgdGhlIG1ldGhvZCB0byBiZSBpbnZva2VkIHdoZW4gZGF0YWJhc2UgY29ycnVwdGlvbiBpcyBkZXRlY3RlZC4KKyAgICAgKiBAcGFyYW0gZGJPYmogdGhlIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YWJhc2Ugb24gd2hpY2ggY29ycnVwdGlvbgorICAgICAqIGlzIGRldGVjdGVkLgorICAgICAqLworICAgIHZvaWQgb25Db3JydXB0aW9uKFNRTGl0ZURhdGFiYXNlIGRiT2JqKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlVXRpbHMuamF2YQppbmRleCA5NWZjMWZkLi45MGJiMGUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VVdGlscy5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlUHJvZ3JhbTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTUwLDYgKzUxLDIzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvdW50UHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXXsiY291bnQoKikifTsKKworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX1NFTEVDVCA9IDE7CisgICAgLyoqIE9uZSBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcpfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURU1FTlRfVVBEQVRFID0gMjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9BVFRBQ0ggPSAzOworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0JFR0lOID0gNDsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9DT01NSVQgPSA1OworICAgIC8qKiBPbmUgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFNxbFN0YXRlbWVudFR5cGUoU3RyaW5nKX0uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVNRU5UX0FCT1JUID0gNjsKKyAgICAvKiogT25lIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRTcWxTdGF0ZW1lbnRUeXBlKFN0cmluZyl9LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTUVOVF9PVEhFUiA9IDc7CisKICAgICAvKioKICAgICAgKiBTcGVjaWFsIGZ1bmN0aW9uIGZvciB3cml0aW5nIGFuIGV4Y2VwdGlvbiByZXN1bHQgYXQgdGhlIGhlYWRlciBvZgogICAgICAqIGEgcGFyY2VsLCB0byBiZSB1c2VkIHdoZW4gcmV0dXJuaW5nIGFuIGV4Y2VwdGlvbiBmcm9tIGEgdHJhbnNhY3Rpb24uCkBAIC0xOTEsNiArMjA5LDM3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBkYXRhIHR5cGUgb2YgdGhlIGdpdmVuIG9iamVjdCdzIHZhbHVlLgorICAgICAqPHA+CisgICAgICogUmV0dXJuZWQgdmFsdWVzIGFyZQorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT57QGxpbmsgQ3Vyc29yI0ZJRUxEX1RZUEVfTlVMTH08L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9JTlRFR0VSfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX0ZMT0FUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEN1cnNvciNGSUVMRF9UWVBFX1NUUklOR308L2xpPgorICAgICAqICAgPGxpPntAbGluayBDdXJzb3IjRklFTERfVFlQRV9CTE9CfTwvbGk+CisgICAgICo8L3VsPgorICAgICAqPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIHR5cGUgaXMgdG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIG9iamVjdCB2YWx1ZSB0eXBlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlT2ZPYmplY3QoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9OVUxMOworICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgcmV0dXJuIEN1cnNvci5GSUVMRF9UWVBFX0JMT0I7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRmxvYXQgfHwgb2JqIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTG9uZyB8fCBvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICByZXR1cm4gQ3Vyc29yLkZJRUxEX1RZUEVfSU5URUdFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDdXJzb3IuRklFTERfVFlQRV9TVFJJTkc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBcHBlbmRzIGFuIFNRTCBzdHJpbmcgdG8gdGhlIGdpdmVuIFN0cmluZ0J1aWxkZXIsIGluY2x1ZGluZyB0aGUgb3BlbmluZwogICAgICAqIGFuZCBjbG9zaW5nIHNpbmdsZSBxdW90ZXMuIEFueSBzaW5nbGUgcXVvdGVzIGludGVybmFsIHRvIHNxbFN0cmluZyB3aWxsCiAgICAgICogYmUgZXNjYXBlZC4KQEAgLTY1NiwxNCArNzA1LDggQEAKICAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbG9uZ0ZvclF1ZXJ5KFNRTGl0ZVN0YXRlbWVudCBwcm9nLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25BcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gc2VsZWN0aW9uQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGJpbmRPYmplY3RUb1Byb2dyYW0ocHJvZywgaSArIDEsIHNlbGVjdGlvbkFyZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIHByb2cuYmluZEFsbEFyZ3NBc1N0cmluZ3Moc2VsZWN0aW9uQXJncyk7CisgICAgICAgIHJldHVybiBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjg0LDE0ICs3MjcsMzYgQEAKICAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgewotICAgICAgICBpZiAoc2VsZWN0aW9uQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kT2JqZWN0VG9Qcm9ncmFtKHByb2csIGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBydW4gdGhlIHF1ZXJ5IG9uIHRoZSBkYiBhbmQgcmV0dXJuIHRoZSBibG9iIHZhbHVlIGluIHRoZQorICAgICAqIGZpcnN0IGNvbHVtbiBvZiB0aGUgZmlyc3Qgcm93LgorICAgICAqCisgICAgICogQHJldHVybiBBIHJlYWQtb25seSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgY29weSBvZiB0aGUgYmxvYiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KFNRTGl0ZURhdGFiYXNlIGRiLAorICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5LCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gZGIuY29tcGlsZVN0YXRlbWVudChxdWVyeSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYmxvYkZpbGVEZXNjcmlwdG9yRm9yUXVlcnkocHJvZywgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcm9nLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvZy5zaW1wbGVRdWVyeUZvclN0cmluZygpOwotICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gcnVuIHRoZSBwcmUtY29tcGlsZWQgcXVlcnkgYW5kIHJldHVybiB0aGUgYmxvYiB2YWx1ZSBpbiB0aGUKKyAgICAgKiBmaXJzdCBjb2x1bW4gb2YgdGhlIGZpcnN0IHJvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSByZWFkLW9ubHkgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGNvcHkgb2YgdGhlIGJsb2IgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBibG9iRmlsZURlc2NyaXB0b3JGb3JRdWVyeShTUUxpdGVTdGF0ZW1lbnQgcHJvZywKKyAgICAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MpIHsKKyAgICAgICAgcHJvZy5iaW5kQWxsQXJnc0FzU3RyaW5ncyhzZWxlY3Rpb25BcmdzKTsKKyAgICAgICAgcmV0dXJuIHByb2cuc2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcwNCw4ICs3NjksOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRTdHJpbmcoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTcyMCw4ICs3ODUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0TG9uZyhpbmRleCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzM2LDggKzgwMSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGN1cnNvclNob3J0VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0U2hvcnQoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc1Miw4ICs4MTcsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoQ3Vyc29yIGN1cnNvciwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgY29sdW1uKSB7Ci0gICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coY29sdW1uKTsKLSAgICAgICAgaWYgKCFjdXJzb3IuaXNOdWxsKGluZGV4KSkgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoY29sdW1uKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xICYmICFjdXJzb3IuaXNOdWxsKGluZGV4KSkgewogICAgICAgICAgICAgdmFsdWVzLnB1dChjb2x1bW4sIGN1cnNvci5nZXRJbnQoaW5kZXgpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc2OCw4ICs4MzMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjdXJzb3JGbG9hdFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChDdXJzb3IgY3Vyc29yLCBDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4pIHsKLSAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhjb2x1bW4pOwotICAgICAgICBpZiAoIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChjb2x1bW4pOworICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgIWN1cnNvci5pc051bGwoaW5kZXgpKSB7CiAgICAgICAgICAgICB2YWx1ZXMucHV0KGNvbHVtbiwgY3Vyc29yLmdldEZsb2F0KGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03ODQsOCArODQ5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3Vyc29yRG91YmxlVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KEN1cnNvciBjdXJzb3IsIENvbnRlbnRWYWx1ZXMgdmFsdWVzLAogICAgICAgICAgICAgU3RyaW5nIGNvbHVtbikgewotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KGNvbHVtbik7Ci0gICAgICAgIGlmICghY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbik7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSAmJiAhY3Vyc29yLmlzTnVsbChpbmRleCkpIHsKICAgICAgICAgICAgIHZhbHVlcy5wdXQoY29sdW1uLCBjdXJzb3IuZ2V0RG91YmxlKGluZGV4KSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTUyLDQgKzEyMTcsNTkgQEAKICAgICAgICAgZGIuc2V0VmVyc2lvbihkYlZlcnNpb24pOwogICAgICAgICBkYi5jbG9zZSgpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgd2hpY2ggcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBTUUwgc3RhdGVtZW50LgorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9TRUxFQ1R9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9VUERBVEV9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9BVFRBQ0h9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI1NUQVRFTUVOVF9CRUdJTn08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0NPTU1JVH08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjU1RBVEVNRU5UX0FCT1JUfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNTVEFURU1FTlRfT1RIRVJ9PC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQgd2hvc2UgdHlwZSBpcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZAorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSB2YWx1ZXMgbGlzdGVkIGFib3ZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3FsU3RhdGVtZW50VHlwZShTdHJpbmcgc3FsKSB7CisgICAgICAgIHNxbCA9IHNxbC50cmltKCk7CisgICAgICAgIGlmIChzcWwubGVuZ3RoKCkgPCAzKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX09USEVSOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwcmVmaXhTcWwgPSBzcWwuc3Vic3RyaW5nKDAsIDMpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJTRUwiKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9TRUxFQ1Q7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiSU5TIikgfHwKKyAgICAgICAgICAgICAgICBwcmVmaXhTcWwuZXF1YWxzKCJVUEQiKSB8fAorICAgICAgICAgICAgICAgIHByZWZpeFNxbC5lcXVhbHMoIlJFUCIpIHx8CisgICAgICAgICAgICAgICAgcHJlZml4U3FsLmVxdWFscygiREVMIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfVVBEQVRFOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkFUVCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0FUVEFDSDsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhTcWwuZXF1YWxzKCJDT00iKSkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRFTUVOVF9DT01NSVQ7CisgICAgICAgIH0gZWxzZSBpZiAocHJlZml4U3FsLmVxdWFscygiRU5EIikpIHsKKyAgICAgICAgICAgIHJldHVybiBTVEFURU1FTlRfQ09NTUlUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIlJPTCIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0FCT1JUOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeFNxbC5lcXVhbHMoIkJFRyIpKSB7CisgICAgICAgICAgICByZXR1cm4gU1RBVEVNRU5UX0JFR0lOOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTVEFURU1FTlRfT1RIRVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBvbmUgc2V0IG9mIHNlbGVjdGlvbiBhcmdzIHRvIGFub3RoZXIuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYWRkaW5nIGEgc2VsZWN0aW9uCisgICAgICogYXJndW1lbnQgdG8gYSB1c2VyIHByb3ZpZGVkIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFwcGVuZFNlbGVjdGlvbkFyZ3MoU3RyaW5nW10gb3JpZ2luYWxWYWx1ZXMsIFN0cmluZ1tdIG5ld1ZhbHVlcykgeworICAgICAgICBpZiAob3JpZ2luYWxWYWx1ZXMgPT0gbnVsbCB8fCBvcmlnaW5hbFZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlczsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29yaWdpbmFsVmFsdWVzLmxlbmd0aCArIG5ld1ZhbHVlcy5sZW5ndGggXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbFZhbHVlcywgMCwgcmVzdWx0LCAwLCBvcmlnaW5hbFZhbHVlcy5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5ld1ZhbHVlcywgMCwgcmVzdWx0LCBvcmlnaW5hbFZhbHVlcy5sZW5ndGgsIG5ld1ZhbHVlcy5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxOWU0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0RlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUGFpcjsKKworLyoqCisgKiBEZWZhdWx0IGNsYXNzIHVzZWQgZGVmaW5pbmcgdGhlIGFjdGlvbnMgdG8gdGFrZSB3aGVuIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBkZXRlY3RlZAorICogICBkYXRhYmFzZSBjb3JydXB0aW9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBEYXRhYmFzZUVycm9ySGFuZGxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlciI7CisKKyAgICAvKioKKyAgICAgKiBkZWZpbmVzIHRoZSBkZWZhdWx0IG1ldGhvZCB0byBiZSBpbnZva2VkIHdoZW4gZGF0YWJhc2UgY29ycnVwdGlvbiBpcyBkZXRlY3RlZC4KKyAgICAgKiBAcGFyYW0gZGJPYmogdGhlIHtAbGluayBTUUxpdGVEYXRhYmFzZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YWJhc2Ugb24gd2hpY2ggY29ycnVwdGlvbgorICAgICAqIGlzIGRldGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ29ycnVwdGlvbihTUUxpdGVEYXRhYmFzZSBkYk9iaikgeworICAgICAgICBMb2cuZShUQUcsICJDb3JydXB0aW9uIHJlcG9ydGVkIGJ5IHNxbGl0ZSBvbiBkYXRhYmFzZTogIiArIGRiT2JqLmdldFBhdGgoKSk7CisKKyAgICAgICAgLy8gaXMgdGhlIGNvcnJ1cHRpb24gZGV0ZWN0ZWQgZXZlbiBiZWZvcmUgZGF0YWJhc2UgY291bGQgYmUgJ29wZW5lZCc/CisgICAgICAgIGlmICghZGJPYmouaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIGRhdGFiYXNlIGZpbGVzIGFyZSBub3QgZXZlbiBvcGVuYWJsZS4gZGVsZXRlIHRoaXMgZGF0YWJhc2UgZmlsZS4KKyAgICAgICAgICAgIC8vIE5PVEUgaWYgdGhlIGRhdGFiYXNlIGhhcyBhdHRhY2hlZCBkYXRhYmFzZXMsIHRoZW4gYW55IG9mIHRoZW0gY291bGQgYmUgY29ycnVwdC4KKyAgICAgICAgICAgIC8vIGFuZCBub3QgZGVsZXRpbmcgYWxsIG9mIHRoZW0gY291bGQgY2F1c2UgY29ycnVwdGVkIGRhdGFiYXNlIGZpbGUgdG8gcmVtYWluIGFuZCAKKyAgICAgICAgICAgIC8vIG1ha2UgdGhlIGFwcGxpY2F0aW9uIGNyYXNoIG9uIGRhdGFiYXNlIG9wZW4gb3BlcmF0aW9uLiBUbyBhdm9pZCB0aGlzIHByb2JsZW0sCisgICAgICAgICAgICAvLyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHByb3ZpZGUgaXRzIG93biB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IGltcGwgY2xhc3MKKyAgICAgICAgICAgIC8vIHRvIGRlbGV0ZSBBTEwgZmlsZXMgb2YgdGhlIGRhdGFiYXNlIChpbmNsdWRpbmcgdGhlIGF0dGFjaGVkIGRhdGFiYXNlcykuCisgICAgICAgICAgICBkZWxldGVEYXRhYmFzZUZpbGUoZGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlLCB3aGljaCB3aWxsIGNhdXNlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB0byBmYWlsLgorICAgICAgICAgICAgLy8gYmVmb3JlIHRoYXQsIGdldCB0aGUgYXR0YWNoZWQgZGF0YWJhc2UgbGlzdCBmaXJzdC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGJPYmouY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBEZWxldGUgYWxsIGZpbGVzIG9mIHRoaXMgY29ycnVwdCBkYXRhYmFzZSBhbmQvb3IgYXR0YWNoZWQgZGF0YWJhc2VzCisgICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIFN0cmluZz4gcCA6IGF0dGFjaGVkRGJzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShwLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBhdHRhY2hlZERicyA9IG51bGwgaXMgcG9zc2libGUgd2hlbiB0aGUgZGF0YWJhc2UgaXMgc28gY29ycnVwdCB0aGF0IGV2ZW4KKyAgICAgICAgICAgICAgICAvLyAiUFJBR01BIGRhdGFiYXNlX2xpc3Q7IiBhbHNvIGZhaWxzLiBkZWxldGUgdGhlIG1haW4gZGF0YWJhc2UgZmlsZQorICAgICAgICAgICAgICAgIGRlbGV0ZURhdGFiYXNlRmlsZShkYk9iai5nZXRQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZURhdGFiYXNlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgaWYgKGZpbGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnk6IikgfHwgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJkZWxldGluZyB0aGUgZGF0YWJhc2UgZmlsZTogIiArIGZpbGVOYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBGaWxlKGZpbGVOYW1lKS5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8qIHByaW50IHdhcm5pbmcgYW5kIGlnbm9yZSBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIExvZy53KFRBRywgImRlbGV0ZSBmYWlsZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvSUJ1bGtDdXJzb3IuamF2YQppbmRleCA0Njc5MGEzLi4yNDRjODhmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9JQnVsa0N1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL0lCdWxrQ3Vyc29yLmphdmEKQEAgLTE2LDE2ICsxNiwxNCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CiAKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIGxvdy1sZXZlbCB3YXkgdG8gcGFzcyBidWxrIGN1cnNvciBkYXRhIGFjcm9zcwotICogYm90aCBwcm9jZXNzIGFuZCBsYW5ndWFnZSBib3VuZHJpZXMuIEFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIHVzZSB0aGUgQ3Vyc29yCisgKiBib3RoIHByb2Nlc3MgYW5kIGxhbmd1YWdlIGJvdW5kYXJpZXMuIEFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIHVzZSB0aGUgQ3Vyc29yCiAgKiBpbnRlcmZhY2UgZGlyZWN0bHkuCiAgKgogICoge0BoaWRlfQpAQCAtNTQsMTAgKzUyLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29sdW1uTmFtZXMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlUm93cyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coaW50IHBvc2l0aW9uKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwotCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CkBAIC03Niw4ICs3MCw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBHRVRfQ1VSU09SX1dJTkRPV19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTjsKICAgICBzdGF0aWMgZmluYWwgaW50IENPVU5UX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgMTsKICAgICBzdGF0aWMgZmluYWwgaW50IEdFVF9DT0xVTU5fTkFNRVNfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAyOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1JPV1NfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX1JPV19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDQ7CiAgICAgc3RhdGljIGZpbmFsIGludCBERUFDVElWQVRFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OICsgNTsKICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFUllfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04gKyA2OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgT05fTU9WRV9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTiArIDc7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NYXRyaXhDdXJzb3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhCmluZGV4IGQ1YzNhMzIuLjVjMWI5NjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01hdHJpeEN1cnNvci5qYXZhCkBAIC0yNzIsNiArMjcyLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMuZ2V0VHlwZU9mT2JqZWN0KGdldChjb2x1bW4pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGNvbHVtbikgewogICAgICAgICByZXR1cm4gZ2V0KGNvbHVtbikgPT0gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvTWVyZ2VDdXJzb3IuamF2YQppbmRleCA3MjJkNzA3Li4yYzI1ZGI3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9NZXJnZUN1cnNvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL01lcmdlQ3Vyc29yLmphdmEKQEAgLTkyLDMyICs5Miw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmRlbGV0ZVJvdygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcygpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IG1DdXJzb3JzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbGVuZ3RoIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnNvcnNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJzb3JzW2ldLmNvbW1pdFVwZGF0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbkNoYW5nZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbikKICAgICB7CkBAIC0xNTUsNiArMTI5LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E1MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2UvUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiB0aGF0IGluZGljYXRlcyBpbnZva2luZyB7QGxpbmsgQ3Vyc29yI3JlcXVlcnkoKX0gb24gTWFpbiB0aHJlYWQgY291bGQgY2F1c2UgQU5SLgorICogVGhpcyBleGNlcHRpb24gc2hvdWxkIGVuY291cmFnZSBhcHBzIHRvIGludm9rZSB7QGxpbmsgQ3Vyc29yI3JlcXVlcnkoKX0gaW4gYSBiYWNrZ3JvdW5kIHRocmVhZC4gCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24oU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHN1cGVyKCJJbiAiICsgcGFja2FnZU5hbWUgKyAiIFJlcXVlcnkgaXMgZXhlY3V0aW5nIG9uIG1haW4gKFVJKSB0aHJlYWQuIGNvdWxkIGNhdXNlIEFOUi4gIiArCisgICAgICAgICAgICAgICAgImRvIGl0IGluIGJhY2tncm91bmQgdGhyZWFkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjA2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5qYXZhCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQSBjb25uZWN0aW9uIHBvb2wgdG8gYmUgdXNlZCBieSByZWFkZXJzLgorICogTm90ZSB0aGF0IGVhY2ggY29ubmVjdGlvbiBjYW4gYmUgdXNlZCBieSBvbmx5IG9uZSByZWFkZXIgYXQgYSB0aW1lLgorICovCisvKiBwYWNrYWdlICovIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIjsKKworICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgc2l6ZS4gSXQgaXMgc2V0IGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRoZSBkZXZpY2UgaGFzLgorICAgICAqIFRPRE86IHNldCB0aGlzIHdpdGggJ2Egc3lzdGVtIGNhbGwnIHdoaWNoIHJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhlIGRldmljZSBoYXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX1BPT0xfU0laRSA9IDE7CisKKyAgICAvKiogdGhlIHBvb2wgc2l6ZSBzZXQgZm9yIHRoaXMge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSAqLworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG1NYXhQb29sU2l6ZSA9IERFRkFVTFRfQ09OTkVDVElPTl9QT09MX1NJWkU7CisKKyAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCBvYmplY3RzIGFyZSBzdG9yZWQgaW4gdGhpcyBtZW1iZXIuCisgICAgICogVE9ETzogcmV2aXNpdCB0aGlzIGRhdGEgc3RydWN0IGFzIHRoZSBudW1iZXIgb2YgcG9vbGVkIGNvbm5lY3Rpb25zIGluY3JlYXNlIGJleW9uZAorICAgICAqIHNpbmdsZS1kaWdpdCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UG9vbE9iaj4gbVBvb2wgPSBuZXcgQXJyYXlMaXN0PFBvb2xPYmo+KG1NYXhQb29sU2l6ZSk7CisKKyAgICAvKiogdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiB0byB3aGljaCB0aGlzIGNvbm5lY3Rpb24gcG9vbCBpcyBhdHRhY2hlZCAqLworICAgIHByaXZhdGUgZmluYWwgU1FMaXRlRGF0YWJhc2UgbVBhcmVudERiT2JqOworCisgICAgLyoqIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgdG8gcGljayBhIGZyZWUgY29ubmVjdGlvbiBvdXQgb2YgdGhlIHBvb2wgKi8KKyAgICBwcml2YXRlIFJhbmRvbSByYW5kOyAvLyBsYXppbHkgaW5pdGlhbGl6ZWQKKworICAgIC8qIHBhY2thZ2UgKi8gRGF0YWJhc2VDb25uZWN0aW9uUG9vbChTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICB0aGlzLm1QYXJlbnREYk9iaiA9IGRiOworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJNYXggUG9vbCBTaXplOiAiICsgbU1heFBvb2xTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGNsb3NlIGFsbCBkYXRhYmFzZSBjb25uZWN0aW9ucyBpbiB0aGUgcG9vbCAtIGV2ZW4gaWYgdGhleSBhcmUgaW4gdXNlIQorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1QYXJlbnREYk9iaikgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gcG9vbCBvbiAiICsgbVBhcmVudERiT2JqLmdldFBhdGgoKSArIHRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Qb29sLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgbVBvb2wuZ2V0KGkpLm1EYi5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvb2wuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGZyZWUgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3FsIGlmIG5vdCBudWxsLCB0cnkgdG8gZmluZCBhIGNvbm5lY3Rpb24gaW50aGUgcG9vbCB3aGljaCBhbHJlYWR5IGhhcyBjYWNoZWQKKyAgICAgKiB0aGUgY29tcGlsZWQgc3RhdGVtZW50IGZvciB0aGlzIHNxbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBEYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgdGhlIGNhbGxlciBjYW4gdXNlCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXQoU3RyaW5nIHNxbCkgeworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG51bGw7CisgICAgICAgIFBvb2xPYmogcG9vbE9iaiA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGludCBwb29sU2l6ZSA9IG1Qb29sLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgc3FsICE9IG51bGw7CisgICAgICAgICAgICAgICAgZG9Bc3NlcnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0RnJlZVBvb2xTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGZyZWUgKCA9IGF2YWlsYWJsZSkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiAobU1heFBvb2xTaXplID09IHBvb2xTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1heGVkIG91dC4gY2FuJ3Qgb3BlbiBhbnkgbW9yZSBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBjYWxsZXIgd2FpdCBvbiBvbmUgb2YgdGhlIHBvb2xlZCBjb25uZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJhYmx5IGEgY29ubmVjdGlvbiBjYWNoaW5nIHRoZSBwcmUtY29tcGlsZWQgc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBTUUwKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NYXhQb29sU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29sT2JqID0gbVBvb2wuZ2V0KDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWF4UG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkubURiLmlzU3FsSW5TdGF0ZW1lbnRDYWNoZShzcWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb29sT2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgbm8gZGF0YWJhc2UgY29ubmVjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gU1FMIHByZS1jb21waWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvayB0byByZXR1cm4gYW55IG9mIHRoZSBjb25uZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQgPSBuZXcgUmFuZG9tKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChyYW5kLm5leHRJbnQobU1heFBvb2xTaXplKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLCBzaW5jZSB3ZSBoYXZlbid0IHJlYWNoZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHBvb2wgc2l6ZSBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgIGRiID0gbVBhcmVudERiT2JqLmNyZWF0ZVBvb2xDb25uZWN0aW9uKChzaG9ydCkocG9vbFNpemUgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBuZXcgUG9vbE9iaihkYik7CisgICAgICAgICAgICAgICAgICAgIG1Qb29sLmFkZChwb29sU2l6ZSwgcG9vbE9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUuIHBpY2sgb25lCisgICAgICAgICAgICAgICAgLy8gcHJlZmVyYWJseSBhIGNvbm5lY3Rpb24gY2FjaGluZyB0aGUgcHJlLWNvbXBpbGVkIHN0YXRlbWVudCBvZiB0aGUgZ2l2ZW4gU1FMCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9vbC5nZXQoaSkuaXNGcmVlKCkgJiYgbVBvb2wuZ2V0KGkpLm1EYi5pc1NxbEluU3RhdGVtZW50Q2FjaGUoc3FsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE9iaiA9IG1Qb29sLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb29sT2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBmcmVlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gU1FMIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlLWNvbXBpbGVkLiByZXR1cm4gYSBmcmVlIGNvbm5lY3Rpb24gKHRoaXMgbWVhbnMsIHRoZSBzYW1lIFNRTCBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY29tcGlsZWQgb24gbW9yZSB0aGFuIG9uZSBkYXRhYmFzZSBjb25uZWN0aW9uLiBwb3RlbnRpYWwgd2FzdGVkIG1lbW9yeS4pCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9vbFNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGIgPSBwb29sT2JqLm1EYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0IHBvb2xPYmogIT0gbnVsbDsKKyAgICAgICAgICAgIGFzc2VydCBwb29sT2JqLm1EYiA9PSBkYjsKKworICAgICAgICAgICAgcG9vbE9iai5hY3F1aXJlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJFTkQgZ2V0LWNvbm5lY3Rpb246ICIgKyB0b1N0cmluZygpICsgcG9vbE9iai50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGI7CisgICAgICAgIC8vIFRPRE8gaWYgYSB0aHJlYWQgYWNxdWlyZXMgYSBjb25uZWN0aW9uIGFuZCBkaWVzIHdpdGhvdXQgcmVsZWFzaW5nIHRoZSBjb25uZWN0aW9uLCB0aGVuCisgICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIGEgY29ubmVjdGlvbiBsZWFrLgorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbGVhc2UgdGhlIGdpdmVuIGRhdGFiYXNlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KKyAgICAgKiBAcGFyYW0gZGIgdGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgcmVsZWFzZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICBQb29sT2JqIHBvb2xPYmo7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGIubUNvbm5lY3Rpb25OdW0gPiAwOworICAgICAgICAgICAgICAgIGRvQXNzZXJ0cygpOworICAgICAgICAgICAgICAgIGFzc2VydCBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKS5tRGIgPT0gZGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvb2xPYmogPSBtUG9vbC5nZXQoZGIubUNvbm5lY3Rpb25OdW0gLSAxKTsKKworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkJFR0lOIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9vbE9iai5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlbGVhc2luZyBvYmplY3QgYWxyZWFkeSBmcmVlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBkYi5tQ29ubmVjdGlvbk51bSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBvb2xPYmoucmVsZWFzZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRU5EIHJlbGVhc2UtY29ubjogIiArIHRvU3RyaW5nKCkgKyBwb29sT2JqLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sIChib3RoIGZyZWUgYW5kIGJ1c3kgY29ubmVjdGlvbnMpLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiAiYWRiIGJ1Z3JlcG9ydCIgaXMgZG9uZS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gZ2V0Q29ubmVjdGlvbkxpc3QoKSB7CisgICAgICAgIEFycmF5TGlzdDxTUUxpdGVEYXRhYmFzZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKG1Qb29sLmdldChpKS5tRGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHBhY2thZ2UgbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuIG90aGVyd2lzZSwgcHJpdmF0ZSBzaG91bGQgYmUgc3VmZmljaWVudC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRGcmVlUG9vbFNpemUoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBtUG9vbC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgaWYgKG1Qb29sLmdldChpKS5pc0ZyZWUoKSkgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50Kys7CisgICAgfQorCisgICAgLyoqCisgICAgICogb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gQXJyYXlMaXN0PFBvb2xPYmo+IGdldFBvb2woKSB7CisgICAgICAgIHJldHVybiBtUG9vbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWZmLmFwcGVuZCgiZGI6ICIpOworICAgICAgICBidWZmLmFwcGVuZChtUGFyZW50RGJPYmouZ2V0UGF0aCgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgdG90YWxzaXplID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG1Qb29sLnNpemUoKSk7CisgICAgICAgIGJ1ZmYuYXBwZW5kKCIsICNmcmVlID0gIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKGdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYnVmZi5hcHBlbmQoIiwgbWF4cG9vbHNpemUgPSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobU1heFBvb2xTaXplKTsKKyAgICAgICAgZm9yIChQb29sT2JqIHAgOiBtUG9vbCkgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChwLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvQXNzZXJ0cygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUG9vbC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbVBvb2wuZ2V0KGkpLnZlcmlmeSgpOworICAgICAgICAgICAgYXNzZXJ0IG1Qb29sLmdldChpKS5tRGIubUNvbm5lY3Rpb25OdW0gPT0gKGkgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRNYXhQb29sU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVBhcmVudERiT2JqKSB7CisgICAgICAgICAgICBtTWF4UG9vbFNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0TWF4UG9vbFNpemUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtUGFyZW50RGJPYmopIHsKKyAgICAgICAgICAgIHJldHVybiBtTWF4UG9vbFNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogb25seSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc0RhdGFiYXNlT2JqRnJlZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICByZXR1cm4gbVBvb2wuZ2V0KGRiLm1Db25uZWN0aW9uTnVtIC0gMSkuaXNGcmVlKCk7CisgICAgfQorCisgICAgLyoqIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gKi8KKyAgICAvKiBwYWNrYWdlICovIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gbVBvb2wuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlcHJlc2VudHMgb2JqZWN0cyBpbiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqIHBhY2thZ2UtbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgUG9vbE9iaiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTUUxpdGVEYXRhYmFzZSBtRGI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRnJlZUJ1c3lGbGFnID0gRlJFRTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGUkVFID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBCVVNZID0gZmFsc2U7CisKKyAgICAgICAgLyoqIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBob2xkaW5nIHRoaXMgY29ubmVjdGlvbiAqLworICAgICAgICAvLyBAR3VhcmRlZEJ5KCJ0aGlzIikKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU51bUhvbGRlcnMgPSAwOworCisgICAgICAgIC8qKiBjb250YWlucyB0aGUgdGhyZWFkSWRzIG9mIHRoZSB0aHJlYWRzIGhvbGRpbmcgdGhpcyBjb25uZWN0aW9uLgorICAgICAgICAgKiB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAgICAgICAgICovCisgICAgICAgIC8vIEBHdWFyZGVkQnkoInRoaXMiKQorICAgICAgICBwcml2YXRlIEhhc2hTZXQ8TG9uZz4gbUhvbGRlcklkcyA9IG5ldyBIYXNoU2V0PExvbmc+KCk7CisKKyAgICAgICAgcHVibGljIFBvb2xPYmooU1FMaXRlRGF0YWJhc2UgZGIpIHsKKyAgICAgICAgICAgIG1EYiA9IGRiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhY3F1aXJlKCkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBpc0ZyZWUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGlkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgICAgIGFzc2VydCAhbUhvbGRlcklkcy5jb250YWlucyhpZCk7CisgICAgICAgICAgICAgICAgbUhvbGRlcklkcy5hZGQoaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTnVtSG9sZGVycysrOworICAgICAgICAgICAgbUZyZWVCdXN5RmxhZyA9IEJVU1k7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBpZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbUhvbGRlcklkcy5zaXplKCkgPT0gbU51bUhvbGRlcnM7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Ib2xkZXJJZHMuY29udGFpbnMoaWQpOworICAgICAgICAgICAgICAgIG1Ib2xkZXJJZHMucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUhvbGRlcnMtLTsKKyAgICAgICAgICAgIGlmIChtTnVtSG9sZGVycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUZyZWVCdXN5RmxhZyA9IEZSRUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGlzRnJlZSgpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgICAgICB2ZXJpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobUZyZWVCdXN5RmxhZyA9PSBGUkVFKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICAgICAgaWYgKG1GcmVlQnVzeUZsYWcgPT0gRlJFRSkgeworICAgICAgICAgICAgICAgIGFzc2VydCBtTnVtSG9sZGVycyA9PSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbU51bUhvbGRlcnMgPiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgICAgICovCisgICAgICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGludCBnZXROdW1Ib2xkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OdW1Ib2xkZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQoIiwgY29ubiAjICIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURiLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIG1Db3VudEhvbGRlcnMgPSAiKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobU51bUhvbGRlcnMpOworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGZyZWVCdXN5RmxhZyA9ICIpOworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1GcmVlQnVzeUZsYWcpOworICAgICAgICAgICAgICAgIGZvciAoTG9uZyBsIDogbUhvbGRlcklkcykgeworICAgICAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBpZCA9ICIgKyBsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL0RhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQppbmRleCA4YWM0YzBmLi5mMjhjNzBmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24uamF2YQpAQCAtMjEsMTMgKzIxLDExIEBACiAgKiB0aGF0IGlzIG5vdCBleHBsaWNpdGx5IGNsb3NlZAogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgoteworcHVibGljIGNsYXNzIERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHMgPSAiQXBwbGljYXRpb24gZGlkIG5vdCBjbG9zZSB0aGUgY3Vyc29yIG9yIGRhdGFiYXNlIG9iamVjdCAiICsKICAgICAgICAgICAgICJ0aGF0IHdhcyBvcGVuZWQgaGVyZSI7CiAKLSAgICBwdWJsaWMgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKQotICAgIHsKKyAgICBwdWJsaWMgRGF0YWJhc2VPYmplY3ROb3RDbG9zZWRFeGNlcHRpb24oKSB7CiAgICAgICAgIHN1cGVyKHMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOGRhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQWNjZXNzUGVybUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGNsYXNzIGlzIHVzZWQgd2hlbiBzcWxpdGUgY2FuJ3QgYWNjZXNzIHRoZSBkYXRhYmFzZSBmaWxlCisgKiBkdWUgdG8gbGFjayBvZiBwZXJtaXNzaW9ucyBvbiB0aGUgZmlsZS4KKyAqLworcHVibGljIGNsYXNzIFNRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVBY2Nlc3NQZXJtRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjJmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhyb3duIGlmIHRoZSB0aGUgYmluZCBvciBjb2x1bW4gcGFyYW1ldGVyIGluZGV4IGlzIG91dCBvZiByYW5nZQorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQmluZE9yQ29sdW1uSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVCaW5kT3JDb2x1bW5JbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQmxvYlRvb0JpZ0V4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI2NzZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVCbG9iVG9vQmlnRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNhbnRPcGVuRGF0YWJhc2VFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwMTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVDYW50T3BlbkRhdGFiYXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDbG9zYWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNsb3NhYmxlLmphdmEKaW5kZXggMTgzMGY2Yy4uNThkYWIyYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNsb3NhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUNsb3NhYmxlLmphdmEKQEAgLTIzLDEzICsyMywxMyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1FMaXRlQ2xvc2FibGUgewogICAgIHByaXZhdGUgaW50IG1SZWZlcmVuY2VDb3VudCA9IDE7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOwogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkRnJvbUNvbnRhaW5lcigpIHt9CiAKICAgICBwdWJsaWMgdm9pZCBhY3F1aXJlUmVmZXJlbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGNoZWNrUmVmQ291bnQoKTsKICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPD0gMCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byByZS1vcGVuIGFuIGFscmVhZHktY2xvc2VkIG9iamVjdDogIiArIGdldE9iakluZm8oKSk7CkBAIC0zOSw3ICszOSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZVJlZmVyZW5jZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBjaGVja1JlZkNvdW50KCk7CiAgICAgICAgICAgICBtUmVmZXJlbmNlQ291bnQtLTsKICAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CkBAIC00OCw3ICs0OSw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVsZWFzZVJlZmVyZW5jZUZyb21Db250YWluZXIoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgY2hlY2tSZWZDb3VudCgpOwogICAgICAgICAgICAgbVJlZmVyZW5jZUNvdW50LS07CiAgICAgICAgICAgICBpZiAobVJlZmVyZW5jZUNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKTsKQEAgLTYzLDggKzY1LDcgQEAKICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVEYXRhYmFzZSkgewogICAgICAgICAgICAgYnVmZi5hcHBlbmQoImRhdGFiYXNlID0gIik7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgoKFNRTGl0ZURhdGFiYXNlKXRoaXMpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0gfHwgdGhpcyBpbnN0YW5jZW9mIFNRTGl0ZVN0YXRlbWVudCB8fAotICAgICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVRdWVyeSkgeworICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBTUUxpdGVQcm9ncmFtKSB7CiAgICAgICAgICAgICBidWZmLmFwcGVuZCgibVNxbCA9ICIpOwogICAgICAgICAgICAgYnVmZi5hcHBlbmQoKChTUUxpdGVQcm9ncmFtKXRoaXMpLm1TcWwpOwogICAgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBDdXJzb3JXaW5kb3cpIHsKQEAgLTc0LDQgKzc1LDEzIEBACiAgICAgICAgIGJ1ZmYuYXBwZW5kKCIpICIpOwogICAgICAgICByZXR1cm4gYnVmZi50b1N0cmluZygpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JlZkNvdW50KCkgeworICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKKyAgICAgICAgICAgIGlmIChtUmVmZXJlbmNlQ291bnQgPiAxMDAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicmVmY291bnQ6ICIgKyBtUmVmZXJlbmNlQ291bnQgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE9iakluZm8oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29tcGlsZWRTcWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCmluZGV4IDI1YWE5YjMuLjBiNWE0ZGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb21waWxlZFNxbC5qYXZhCkBAIC03OCwyMCArNzgsMTMgQEAKICAgICAgKiAgZXhpc3RpbmcgY29tcGlsZWQgU1FMIHByb2dyYW0gYWxyZWFkeSBhcm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgc3FsLCBib29sZWFuIGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlMb2NrT3duZXIoKTsKICAgICAgICAgLy8gT25seSBjb21waWxlIGlmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBzdGF0ZW1lbnQgYWxyZWFkeSBvciB0aGUgY2FsbGVyIGhhcwogICAgICAgICAvLyBleHBsaWNpdGx5IHJlcXVlc3RlZCBhIHJlY29tcGlsZS4KICAgICAgICAgaWYgKGZvcmNlQ29tcGlsYXRpb24pIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbmF0aXZlX2NvbXBpbGUoKSB0YWtlcyBjYXJlIG9mIGRlc3Ryb3lpbmcgYW55IHByZXZpb3VzbHkKLSAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwcm9ncmFtcyBiZWZvcmUgaXQgY29tcGlsZXMuCi0gICAgICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuYXRpdmVfY29tcGlsZSgpIHRha2VzIGNhcmUgb2YgZGVzdHJveWluZyBhbnkgcHJldmlvdXNseQorICAgICAgICAgICAgLy8gZXhpc3RpbmcgcHJvZ3JhbXMgYmVmb3JlIGl0IGNvbXBpbGVzLgorICAgICAgICAgICAgbmF0aXZlX2NvbXBpbGUoc3FsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTksMTYgKzkyLDggQEAKICAgICAgICAgLy8gTm90ZSB0aGF0IG5hdGl2ZV9maW5hbGl6ZSgpIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBuU3RhdGVtZW50IGlzCiAgICAgICAgIC8vIG5vbi1udWxsIGJlZm9yZSBkZXN0cm95aW5nIGl0LgogICAgICAgICBpZiAoblN0YXRlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJjbG9zZWQgYW5kIGRlYWxsb2NhdGVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLmZpbmFsaXplU3RhdGVtZW50TGF0ZXIoblN0YXRlbWVudCk7CisgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIxLDE5ICsxMDYsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBtSW5Vc2UgPSB0cnVlOwotICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfQUNUSVZFX0NVUlNPUl9GSU5BTElaQVRJT04pIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgIkFjcXVpcmVkIERiT2JqIChpZCMiICsgblN0YXRlbWVudCArICIpIGZyb20gREIgY2FjaGUiKTsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiUmVsZWFzZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikgYmFjayB0byBEQiBjYWNoZSIpOwotICAgICAgICB9CiAgICAgICAgIG1JblVzZSA9IGZhbHNlOwogICAgIH0KIAorICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIGJvb2xlYW4gaXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JblVzZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbmF0aXZlIHJlc291cmNlIGlzIGNsZWFuZWQgdXAuCiAgICAgICovCkBAIC0xNDIsOSArMTI1LDYgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChuU3RhdGVtZW50ID09IDApIHJldHVybjsKICAgICAgICAgICAgIC8vIGZpbmFsaXplciBzaG91bGQgTkVWRVIgZ2V0IGNhbGxlZAotICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0FDVElWRV9DVVJTT1JfRklOQUxJWkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiKiogd2FybmluZyAqKiBGaW5hbGl6ZWQgRGJPYmogKGlkIyIgKyBuU3RhdGVtZW50ICsgIikiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKICAgICAgICAgICAgIExvZy53KFRBRywgIlJlbGVhc2luZyBzdGF0ZW1lbnQgaW4gYSBmaW5hbGl6ZXIuIFBsZWFzZSBlbnN1cmUgIiArCiAgICAgICAgICAgICAgICAgICAgICJ0aGF0IHlvdSBleHBsaWNpdGx5IGNhbGwgY2xvc2UoKSBvbiB5b3VyIGN1cnNvcjogIiArCkBAIC0xNTUsNiArMTM1LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiIG5TdGF0ZW1lbnQ9Iik7CisgICAgICAgICAgICBidWZmLmFwcGVuZChuU3RhdGVtZW50KTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIGRiPSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURhdGFiYXNlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLCBkYl9jb25uZWN0aW9uTnVtPSIpOworICAgICAgICAgICAgYnVmZi5hcHBlbmQobURhdGFiYXNlLm1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsIHNxbD0iKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBtU3FsU3RtdC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKG1TcWxTdG10LnN1YnN0cmluZygwLCAobGVuID4gMTAwKSA/IDEwMCA6IGxlbikpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbXBpbGVzIFNRTCBpbnRvIGEgU1FMaXRlIHByb2dyYW0uCiAgICAgICoKQEAgLTE2Miw1ICsxNTgsNCBAQAogICAgICAqIEBwYXJhbSBzcWwgVGhlIFNRTCB0byBjb21waWxlLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2NvbXBpbGUoU3RyaW5nIHNxbCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAwZDg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lbW9yeUZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNpbmcgU1FMaXRlIGRhdGFiYXNlIHRvIGltcGxlbWVudCBjb250ZW50IHByb3ZpZGVycy4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU1FMaXRlQ29udGVudEhlbHBlciB7Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBBc3NldEZpbGVEZXNjcmlwdG9yIGZvciB0aGUKLSAgICAgKiBibG9iIGluIGNvbHVtbiAwIG9mIHRoZSBmaXJzdCByb3cuIElmIHRoZSBmaXJzdCBjb2x1bW4gZG9lcwotICAgICAqIG5vdCBjb250YWluIGEgYmxvYiwgYW4gdW5zcGVjaWZpZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYiBIYW5kbGUgdG8gYSByZWFkYWJsZSBkYXRhYmFzZS4KLSAgICAgKiBAcGFyYW0gc3FsIFNRTCBxdWVyeSwgcG9zc2libHkgd2l0aCBxdWVyeSBhcmd1bWVudHMuCi0gICAgICogQHBhcmFtIHNlbGVjdGlvbkFyZ3MgUXVlcnkgYXJndW1lbnQgdmFsdWVzLCBvciB7QGNvZGUgbnVsbH0gZm9yIG5vIGFyZ3VtZW50LgotICAgICAqIEByZXR1cm4gSWYgbm8gZXhjZXB0aW9uIGlzIHRocm93biwgYSBub24tbnVsbCBBc3NldEZpbGVEZXNjcmlwdG9yIGlzIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZSBxdWVyeSByZXR1cm5zIG5vIHJlc3VsdHMgb3IgdGhlCi0gICAgICogICAgICAgICB2YWx1ZSBvZiBjb2x1bW4gMCBpcyBOVUxMLCBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUKLSAgICAgKiAgICAgICAgIGFzc2V0IGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFzc2V0RmlsZURlc2NyaXB0b3IgZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLAotICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKGRiLCBzcWwsIHNlbGVjdGlvbkFyZ3MpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vIHJlc3VsdHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQXNzZXRGaWxlRGVzY3JpcHRvci5mcm9tTWVtb3J5RmlsZShmaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIGFuIFNRTGl0ZSBxdWVyeSBhbmQgcmV0dXJucyBhIE1lbW9yeUZpbGUgZm9yIHRoZQotICAgICAqIGJsb2IgaW4gY29sdW1uIDAgb2YgdGhlIGZpcnN0IHJvdy4gSWYgdGhlIGZpcnN0IGNvbHVtbiBkb2VzCi0gICAgICogbm90IGNvbnRhaW4gYSBibG9iLCBhbiB1bnNwZWNpZmllZCBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBBIG1lbW9yeSBmaWxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHF1ZXJ5IHJldHVybnMgbm8gcmVzdWx0cwotICAgICAqICAgICAgICAgb3IgdGhlIHZhbHVlIGNvbHVtbiAwIGlzIE5VTEwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgbWVtb3J5IGZpbGUuCi0gICAgICovCi0gICAgLy8gVE9ETzogbWFrZSB0aGlzIG5hdGl2ZSBhbmQgdXNlIHRoZSBTUUxpdGUgYmxvYiBBUEkgdG8gcmVkdWNlIGNvcHlpbmcKLSAgICBwcml2YXRlIHN0YXRpYyBNZW1vcnlGaWxlIHNpbXBsZVF1ZXJ5Rm9yQmxvYk1lbW9yeUZpbGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucmF3UXVlcnkoc3FsLCBzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gY3Vyc29yLmdldEJsb2IoMCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUud3JpdGVCeXRlcyhieXRlcywgMCwgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUuZGVhY3RpdmF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvci5qYXZhCmluZGV4IGM3ZTU4ZmEuLmQ1OGE2ODkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yLmphdmEKQEAgLTE2LDIwICsxNiwxOSBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5BYnN0cmFjdFdpbmRvd2VkQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yV2luZG93OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YVNldE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwotCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5SZXF1ZXJ5T25VaVRocmVhZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiAKQEAgLTQ1LDI4ICs0NCwyNSBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKIAogICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZWRpdCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1FZGl0VGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVkaXRUYWJsZTsKIAogICAgIC8qKiBUaGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHJvd3MgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1Db2x1bW5zOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUNvbHVtbnM7CiAKICAgICAvKiogVGhlIHF1ZXJ5IG9iamVjdCBmb3IgdGhlIGN1cnNvciAqLwogICAgIHByaXZhdGUgU1FMaXRlUXVlcnkgbVF1ZXJ5OwogCi0gICAgLyoqIFRoZSBkYXRhYmFzZSB0aGUgY3Vyc29yIHdhcyBjcmVhdGVkIGZyb20gKi8KLSAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKLQogICAgIC8qKiBUaGUgY29tcGlsZWQgcXVlcnkgdGhpcyBjdXJzb3IgY2FtZSBmcm9tICovCi0gICAgcHJpdmF0ZSBTUUxpdGVDdXJzb3JEcml2ZXIgbURyaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNRTGl0ZUN1cnNvckRyaXZlciBtRHJpdmVyOwogCiAgICAgLyoqIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY3Vyc29yICovCi0gICAgcHJpdmF0ZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbUNvdW50ID0gTk9fQ09VTlQ7CiAKICAgICAvKiogQSBtYXBwaW5nIG9mIGNvbHVtbiBuYW1lcyB0byBjb2x1bW4gaW5kaWNlcywgdG8gc3BlZWQgdXAgbG9va3VwcyAqLwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gbUNvbHVtbk5hbWVNYXA7CiAKICAgICAvKiogVXNlZCB0byBmaW5kIG91dCB3aGVyZSBhIGN1cnNvciB3YXMgYWxsb2NhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IHJlbGVhc2VkLiAqLwotICAgIHByaXZhdGUgVGhyb3dhYmxlIG1TdGFja1RyYWNlOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIG1TdGFja1RyYWNlOwogICAgIAogICAgIC8qKiAKICAgICAgKiAgbU1heFJlYWQgaXMgdGhlIG1heCBpdGVtcyB0aGF0IGVhY2ggY3Vyc29yIHdpbmRvdyByZWFkcyAKQEAgLTc3LDYgKzczLDExIEBACiAgICAgcHJpdmF0ZSBpbnQgbUN1cnNvclN0YXRlID0gMDsKICAgICBwcml2YXRlIFJlZW50cmFudExvY2sgbUxvY2sgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0RhdGEgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rICNyZXF1ZXJ5KCl9IHRvIHJlbWVtYmVyIGZvciB3aGljaCBkYXRhYmFzZSB3ZSd2ZSBhbHJlYWR5IHNob3duIHRoZSB3YXJuaW5nLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBzQWxyZWFkeVdhcm5lZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICAvKioKICAgICAgKiAgc3VwcG9ydCBmb3IgYSBjdXJzb3IgdmFyaWFudCB0aGF0IGRvZXNuJ3QgYWx3YXlzIHJlYWQgYWxsIHJlc3VsdHMKQEAgLTEzNiwxNCArMTM3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtUXVlcnkuZmlsbFdpbmRvdyhjdywgbU1heFJlYWQsIG1Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyBub3QgZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KGN3LCBtTWF4UmVhZCwgbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVzdWx0c2V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArPSBtTWF4UmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlY2VpdmVkIC0xIGZyb20gbmF0aXZlX2ZpbGxfd2luZG93LiByZWFkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWNlaXZlZCBhbGwgZGF0YSBmcm9tIG5hdGl2ZV9maWxsX3dpbmRvdy4gcmVhZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ291bnQgKyAiIHJvd3MuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMDEsMjQgKzIxMCw0NiBAQAogICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgogICAgICAqCiAgICAgICogQHBhcmFtIGRiIGEgcmVmZXJlbmNlIHRvIGEgRGF0YWJhc2Ugb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBjb25zdHJ1Y3RlZAotICAgICAqICAgICBhbmQgb3BlbmVkCisgICAgICogICAgIGFuZCBvcGVuZWQuIFRoaXMgcGFyYW0gaXMgbm90IHVzZWQgYW55IGxvbmdlcgogICAgICAqIEBwYXJhbSBlZGl0VGFibGUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHRoaXMgcXVlcnkKICAgICAgKiBAcGFyYW0gcXVlcnkgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5IHRlcm1zCiAgICAgICogICAgIGN1cnNvciBpcyBmaW5hbGl6ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFNRTGl0ZUN1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciwKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CisgICAgICAgIHRoaXMoZHJpdmVyLCBlZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIGl0cyByZXN1bHQgc2V0IHRocm91Z2ggYSBDdXJzb3IKKyAgICAgKiBpbnRlcmZhY2UuIEZvciBhIHF1ZXJ5IHN1Y2ggYXM6IHtAY29kZSBTRUxFQ1QgbmFtZSwgYmlydGgsIHBob25lIEZST00KKyAgICAgKiBteVRhYmxlIFdIRVJFIC4uLiBMSU1JVCAxLDIwIE9SREVSIEJZLi4ufSB0aGUgY29sdW1uIG5hbWVzIChuYW1lLCBiaXJ0aCwKKyAgICAgKiBwaG9uZSkgd291bGQgYmUgaW4gdGhlIHByb2plY3Rpb24gYXJndW1lbnQgYW5kIGV2ZXJ5dGhpbmcgZnJvbQorICAgICAqIHtAY29kZSBGUk9NfSBvbndhcmQgd291bGQgYmUgaW4gdGhlIHBhcmFtcyBhcmd1bWVudC4gVGhpcyBjb25zdHJ1Y3RvcgorICAgICAqIGhhcyBwYWNrYWdlIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGVkaXRUYWJsZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3IgdGhpcyBxdWVyeQorICAgICAqIEBwYXJhbSBxdWVyeSB0aGUge0BsaW5rIFNRTGl0ZVF1ZXJ5fSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3Vyc29yIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU1FMaXRlQ3Vyc29yKFNRTGl0ZUN1cnNvckRyaXZlciBkcml2ZXIsIFN0cmluZyBlZGl0VGFibGUsIFNRTGl0ZVF1ZXJ5IHF1ZXJ5KSB7CiAgICAgICAgIC8vIFRoZSBBYnN0cmFjdEN1cnNvciBjb25zdHJ1Y3RvciBuZWVkcyB0byBkbyBzb21lIHNldHVwLgogICAgICAgICBzdXBlcigpOworICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgb2JqZWN0IGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5Lm1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeS5tRGF0YWJhc2UgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQogICAgICAgICBtU3RhY2tUcmFjZSA9IG5ldyBEYXRhYmFzZU9iamVjdE5vdENsb3NlZEV4Y2VwdGlvbigpLmZpbGxJblN0YWNrVHJhY2UoKTsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CiAgICAgICAgIG1Ecml2ZXIgPSBkcml2ZXI7CiAgICAgICAgIG1FZGl0VGFibGUgPSBlZGl0VGFibGU7CiAgICAgICAgIG1Db2x1bW5OYW1lTWFwID0gbnVsbDsKICAgICAgICAgbVF1ZXJ5ID0gcXVlcnk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHF1ZXJ5Lm1EYXRhYmFzZS5sb2NrKCk7CiAKICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNvbHVtbnMKICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCA9IG1RdWVyeS5jb2x1bW5Db3VudExvY2tlZCgpOwpAQCAtMjM5LDcgKzI3MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICBxdWVyeS5tRGF0YWJhc2UudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0Nyw3ICsyNzgsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIFNRTGl0ZURhdGFiYXNlIHRoYXQgdGhpcyBjdXJzb3IgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5Lm1EYXRhYmFzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjgzLDEzICszMTYsMjcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVdpbmRvdy5zZXRTdGFydFBvc2l0aW9uKHN0YXJ0UG9zKTsKLSAgICAgICAgbUNvdW50ID0gbVF1ZXJ5LmZpbGxXaW5kb3cobVdpbmRvdywgbUluaXRpYWxSZWFkLCAwKTsKLSAgICAgICAgLy8gcmV0dXJuIC0xIG1lYW5zIG5vdCBmaW5pc2hlZAotICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKXsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0UXVlcnkoKS5maWxsV2luZG93KG1XaW5kb3csIG1Jbml0aWFsUmVhZCwgMCk7CisgICAgICAgIC8vIHJldHVybiAtMSBtZWFucyB0aGVyZSBpcyBzdGlsbCBtb3JlIGRhdGEgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlc3VsdHNldAorICAgICAgICBpZiAoY291bnQgPT0gTk9fQ09VTlQpewogICAgICAgICAgICAgbUNvdW50ID0gc3RhcnRQb3MgKyBtSW5pdGlhbFJlYWQ7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgLTEgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3cuIHJlYWQgIiArIG1Db3VudCArICIgcm93cyBzbyBmYXIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUXVlcnlUaHJlYWQobUN1cnNvclN0YXRlKSwgInF1ZXJ5IHRocmVhZCIpOwogICAgICAgICAgICAgdC5zdGFydCgpOwotICAgICAgICB9IAorICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0UG9zID09IDApIHsgLy8gbmF0aXZlX2ZpbGxfd2luZG93IHJldHVybnMgY291bnQoKikgb25seSBmb3Igc3RhcnRQb3MgPSAwCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVjZWl2ZWQgY291bnQoKikgZnJvbSBuYXRpdmVfZmlsbF93aW5kb3c6ICIgKyBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ291bnQgPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY291bnQgc2hvdWxkIG5ldmVyIGJlIG5vbi16ZXJvIG5lZ2F0aXZlIG51bWJlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlUXVlcnkgZ2V0UXVlcnkoKSB7CisgICAgICAgIHJldHVybiBtUXVlcnk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMjEsMTY2ICszNjgsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVSb3coKSB7Ci0gICAgICAgIGNoZWNrUG9zaXRpb24oKTsKLQotICAgICAgICAvLyBPbmx5IGFsbG93IGRlbGV0ZXMgaWYgdGhlcmUgaXMgYW4gSUQgY29sdW1uLCBhbmQgdGhlIElEIGhhcyBiZWVuIHJlYWQgZnJvbSBpdAotICAgICAgICBpZiAobVJvd0lkQ29sdW1uSW5kZXggPT0gLTEgfHwgbUN1cnJlbnRSb3dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIHJvdyBiZWNhdXNlIGVpdGhlciB0aGUgcm93IElEIGNvbHVtbiBpcyBub3QgYXZhaWxhYmxlIG9yIGl0IiArCi0gICAgICAgICAgICAgICAgICAgICJoYXMgbm90IGJlZW4gcmVhZC4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBFbnN1cmUgd2UgZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGF0YWJhc2Ugd2hlbiBhbm90aGVyCi0gICAgICAgICAqIHRocmVhZCBpcyBob2xkaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiByZXF1ZXJ5KCkgYW5kIG1vdmVUbygpIGFyZSBhbHNvCi0gICAgICAgICAqIHN5bmNocm9uaXplZCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGV5IGdldCB0aGUgc3RhdGUgb2YgdGhlIGRhdGFiYXNlCi0gICAgICAgICAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgREVMRVRFLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShtRWRpdFRhYmxlLCBtQ29sdW1uc1ttUm93SWRDb2x1bW5JbmRleF0gKyAiPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHttQ3VycmVudFJvd0lELnRvU3RyaW5nKCl9KTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9zID0gbVBvczsKLSAgICAgICAgICAgIHJlcXVlcnkoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEVuc3VyZSBwcm9wZXIgY3Vyc29yIHN0YXRlLiBOb3RlIHRoYXQgbUN1cnJlbnRSb3dJRCBjaGFuZ2VzCi0gICAgICAgICAgICAgKiBpbiB0aGlzIGNhbGwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1vdmVUb1Bvc2l0aW9uKHBvcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgb25DaGFuZ2UodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKICAgICAgICAgcmV0dXJuIG1Db2x1bW5zOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zdXBwb3J0c1VwZGF0ZXMoKSAmJiAhVGV4dFV0aWxzLmlzRW1wdHkobUVkaXRUYWJsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoTWFwPD8gZXh0ZW5kcyBMb25nLAotICAgICAgICAgICAgPyBleHRlbmRzIE1hcDxTdHJpbmcsIE9iamVjdD4+IGFkZGl0aW9uYWxWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzdXBwb3J0c1VwZGF0ZXMoKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY29tbWl0VXBkYXRlcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY3Vyc29yLCBkaWQgeW91ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW5jbHVkZSB0aGUgX2lkIGNvbHVtbj8iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFByZXZlbnQgb3RoZXIgdGhyZWFkcyBmcm9tIGNoYW5naW5nIHRoZSB1cGRhdGVkIHJvd3Mgd2hpbGUgdGhleSdyZQotICAgICAgICAgKiBiZWluZyBwcm9jZXNzZWQgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN5bmNocm9uaXplZCAobVVwZGF0ZWRSb3dzKSB7Ci0gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLnB1dEFsbChhZGRpdGlvbmFsVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1VcGRhdGVkUm93cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUHJldmVudCBvdGhlciB0aHJlYWRzIGZyb20gY2hhbmdpbmcgdGhlIGRhdGFiYXNlIHN0YXRlIHdoaWxlCi0gICAgICAgICAgICAgKiB3ZSBwcm9jZXNzIHRoZSB1cGRhdGVkIHJvd3MsIGFuZCBwcmV2ZW50cyB1cyBmcm9tIGNoYW5naW5nIHRoZQotICAgICAgICAgICAgICogZGF0YWJhc2UgYmVoaW5kIHRoZSBiYWNrIG9mIGFub3RoZXIgdGhyZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCByb3cgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8TG9uZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93RW50cnkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSByb3dFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMb25nIHJvd0lkT2JqID0gcm93RW50cnkuZ2V0S2V5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0lkT2JqID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm51bGwgcm93SWQgb3IgdmFsdWVzIGZvdW5kISByb3dJZCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3dJZE9iaiArICIsIHZhbHVlcyA9ICIgKyB2YWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gcm93SWRPYmoubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICBzcWwuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCJVUERBVEUgIiArIG1FZGl0VGFibGUgKyAiIFNFVCAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBjb2x1bW4gdmFsdWUgdGhhdCBoYXMgYmVlbiB1cGRhdGVkCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGJpbmRpbmdzID0gbmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgiPT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzW2ldID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIgV0hFUkUgIiArIG1Db2x1bW5zW21Sb3dJZENvbHVtbkluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJz0nICsgcm93SWQpOwotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKHNxbC50b1N0cmluZygpLCBiaW5kaW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5yb3dVcGRhdGVkKG1FZGl0VGFibGUsIHJvd0lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVVwZGF0ZWRSb3dzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMZXQgYW55IGNoYW5nZSBvYnNlcnZlcnMga25vdyBhYm91dCB0aGUgdXBkYXRlCi0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlQ29tbW9uKCkgewogICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIjw8PCBSZWxlYXNpbmcgY3Vyc29yICIgKyB0aGlzKTsKICAgICAgICAgbUN1cnNvclN0YXRlID0gMDsKQEAgLTUwMSw5ICszOTMsMzIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgZGVhY3RpdmF0ZUNvbW1vbigpOwotICAgICAgICBtUXVlcnkuY2xvc2UoKTsKLSAgICAgICAgbURyaXZlci5jdXJzb3JDbG9zZWQoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBkZWFjdGl2YXRlQ29tbW9uKCk7CisgICAgICAgICAgICBtUXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yQ2xvc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyBhZ2FpbnN0IHRoZSB1c2Ugb2YgcmVxdWVyeSgpIGlmIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgICogVGhpcyB3YXJuaW5nIGlzIHNob3duIHBlciBkYXRhYmFzZSBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FybklmVWlUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIuZ2V0TWFpbkxvb3BlcigpID09IExvb3Blci5teUxvb3BlcigpKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VQYXRoID0gZ2V0UXVlcnkoKS5tRGF0YWJhc2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgLy8gV2Ugc2hvdyB0aGUgd2FybmluZyBvbmNlIHBlciBkYXRhYmFzZSBpbiBvcmRlciBub3QgdG8gc3BhbSBsb2djYXQuCisgICAgICAgICAgICBpZiAoIXNBbHJlYWR5V2FybmVkLmNvbnRhaW5zS2V5KGRhdGFiYXNlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBzQWxyZWFkeVdhcm5lZC5wdXQoZGF0YWJhc2VQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBBY3Rpdml0eVRocmVhZC5jdXJyZW50UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gQkVHSU4gU1RPUFNISVAgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICAgICAgIHQgPSBuZXcgUmVxdWVyeU9uVWlUaHJlYWRFeGNlcHRpb24ocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIC8vIEVORCBTVE9QU0hJUAorICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3VsZCBub3QgYXR0ZW1wdCByZXF1ZXJ5IG9uIG1haW4gKFVJKSB0aHJlYWQ6IGFwcCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPT0gbnVsbCA/ICIndW5rbm93biciIDogcGFja2FnZU5hbWUsIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01MTEsMjAgKzQyNiwzMCBAQAogICAgICAgICBpZiAoaXNDbG9zZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHdhcm5JZlVpVGhyZWFkKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICB0aW1lU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBTeW5jaHJvbml6ZSBvbiB0aGUgZGF0YWJhc2UgbG9jayB0byBlbnN1cmUgdGhhdCBtQ291bnQgbWF0Y2hlcyB0aGUKLSAgICAgICAgICogcmVzdWx0cyBvZiBtUXVlcnkucmVxdWVyeSgpLgotICAgICAgICAgKi8KLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtV2luZG93LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUG9zID0gLTE7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1RdWVyeS5tRGF0YWJhc2UuZ2V0RGF0YWJhc2VIYW5kbGUobVF1ZXJ5Lm1TcWwpOworICAgICAgICAgICAgaWYgKCFkYi5lcXVhbHMobVF1ZXJ5Lm1EYXRhYmFzZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHVzZSBhIGRpZmZlcmVudCBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAvLyByZS1jb21waWxlIHRoZSBxdWVyeQorICAgICAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgb2xkIG1RdWVyeSBvYmplY3QgYW5kIG9wZW4gYSBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIG1RdWVyeS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBtUXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkoZGIsIG1RdWVyeSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhpcyBvbmUgd2lsbCByZWNyZWF0ZSB0aGUgdGVtcCB0YWJsZSwgYW5kIGdldCBpdHMgY291bnQKICAgICAgICAgICAgIG1Ecml2ZXIuY3Vyc29yUmVxdWVyaWVkKHRoaXMpOwogICAgICAgICAgICAgbUNvdW50ID0gTk9fQ09VTlQ7CkBAIC01MzUsOCArNDYwLDYgQEAKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgcXVlcnlUaHJlYWRVbmxvY2soKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChDb25maWcuTE9HVikgewpAQCAtNTg0LDE0ICs1MDcsMTQgQEAKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgbGVuID0gbVF1ZXJ5Lm1TcWwubGVuZ3RoKCk7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmluYWxpemluZyBhIEN1cnNvciB0aGF0IGhhcyBub3QgYmVlbiBkZWFjdGl2YXRlZCBvciBjbG9zZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFiYXNlID0gIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhYmFzZSA9ICIgKyBtUXVlcnkubURhdGFiYXNlLmdldFBhdGgoKSArICIsIHRhYmxlID0gIiArIG1FZGl0VGFibGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwuc3Vic3RyaW5nKDAsIChsZW4gPiAxMDApID8gMTAwIDogbGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFja1RyYWNlKTsKICAgICAgICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICAgICAgIFNRTGl0ZURlYnVnLm5vdGlmeUFjdGl2ZUN1cnNvckZpbmFsaXplZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmluYWxpemluZyBjdXJzb3Igb24gZGF0YWJhc2UgPSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmFsaXppbmcgY3Vyc29yIG9uIGRhdGFiYXNlID0gIiArIG1RdWVyeS5tRGF0YWJhc2UuZ2V0UGF0aCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCB0YWJsZSA9ICIgKyBtRWRpdFRhYmxlICsgIiwgcXVlcnkgPSAiICsgbVF1ZXJ5Lm1TcWwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU5OSw0ICs1MjIsMTEgQEAKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGlzIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0TUNvdW50KCkgeworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JEcml2ZXIuamF2YQppbmRleCBlZGExYjc4Li5iMzk2M2Y5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yRHJpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUN1cnNvckRyaXZlci5qYXZhCkBAIC00MCw4ICs0MCw2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgYSBTUUxpdGVDdXJzb3Igd2hlbiBpdCBpcyByZXF1ZXJ5ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNvdW50IHZhbHVlLgogICAgICAqLwogICAgIHZvaWQgY3Vyc29yUmVxdWVyaWVkKEN1cnNvciBjdXJzb3IpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCmluZGV4IGNkYzliYmIuLjY5MzdkYTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZS5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eVRocmVhZDsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURlYnVnLkRiU3RhdHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLm9zLlN0YXRGczsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMzgsMTUgKzM4LDEzIEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC02Nyw3ICs2NSw3IEBACiAgKiBpcyB0aGUgVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtIGFuZCBub3QgdGFpbG9yZWQgdG8gdGhlIGN1cnJlbnQgbG9jYWxlLgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBTUUxpdGVDbG9zYWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVEYXRhYmFzZSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RCX09QRVJBVElPTiA9IDUyMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EQl9DT1JSVVBUID0gNzUwMDQ7CiAKQEAgLTE5Miw2ICsxOTAsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgbVRyYW5zYWN0aW9uTGlzdGVuZXI7CiAKKyAgICAvKioKKyAgICAgKiB0aGlzIG1lbWJlciBpcyBzZXQgaWYge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGlzIHVzZWQgdG8gYmVnaW4gYW5kIGVuZCB0cmFuc2FjdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1UcmFuc2FjdGlvblVzaW5nRXhlY1NxbDsKKwogICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGlzIHdoZW4gYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSAqLwogICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBtTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOwogCkBAIC0yMzMsNDggKzIzNiw3OCBAQAogICAgIC8vIGxvY2sgYWNxdWlzdGlvbnMgb2YgdGhlIGRhdGFiYXNlLgogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTE9DS19MT0dfUFJFRklYID0gIkdFVExPQ0s6IjsKIAotICAgIC8qKiBVc2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgcmVuYW1lICovCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbU5hdGl2ZUhhbmRsZSA9IDA7CisgICAgLyoqIFVzZWQgYnkgbmF0aXZlIGNvZGUsIGRvIG5vdCByZW5hbWUuIG1ha2UgaXQgdm9sYXRpbGUsIHNvIGl0IGlzIHRocmVhZC1zYWZlLiAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9sYXRpbGUgaW50IG1OYXRpdmVIYW5kbGUgPSAwOwogCi0gICAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wIHRhYmxlIG5hbWVzIHVuaXF1ZSAqLwotICAgIC8qIHBhY2thZ2UgKi8gaW50IG1UZW1wVGFibGVTZXF1ZW5jZSA9IDA7CisgICAgLyoqCisgICAgICogVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBhIGJsb2NrIG9uICIvZGF0YSIuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFVuaXgKKyAgICAgKiBzdGF0ZnMuZl9ic2l6ZSBmaWVsZC4gbm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbGF6aWx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzQmxvY2tTaXplID0gMDsKIAogICAgIC8qKiBUaGUgcGF0aCBmb3IgdGhlIGRhdGFiYXNlIGZpbGUgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKIAogICAgIC8qKiBUaGUgYW5vbnltaXplZCBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZSBmb3IgbG9nZ2luZyBwdXJwb3NlcyAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoRm9yTG9ncyA9IG51bGw7ICAvLyBsYXppbHkgcG9wdWxhdGVkCiAKICAgICAvKiogVGhlIGZsYWdzIHBhc3NlZCB0byBvcGVuL2NyZWF0ZSAqLwotICAgIHByaXZhdGUgaW50IG1GbGFnczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7CiAKICAgICAvKiogVGhlIG9wdGlvbmFsIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgbmV3IEN1cnNvcnMgKi8KLSAgICBwcml2YXRlIEN1cnNvckZhY3RvcnkgbUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwogCi0gICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxTUUxpdGVDbG9zYWJsZSwgT2JqZWN0PiBtUHJvZ3JhbXM7CiAKICAgICAvKioKLSAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIGNhY2hlIGlzIG1haW50YWluZWQgdG8gc3RvcmUKKyAgICAgKiBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhIExSVSBjYWNoZSBpcyBtYWludGFpbmVkIHRvIHN0b3JlCiAgICAgICogdGhlIGNvbXBpbGVkIHF1ZXJ5IHN0YXRlbWVudCBpZHMgcmV0dXJuZWQgYnkgc3FsaXRlIGRhdGFiYXNlLgotICAgICAqICAgICBrZXkgPSBzcWwgc3RhdGVtZW50IHdpdGggIj8iIGZvciBiaW5kIGFyZ3MKKyAgICAgKiAgICAga2V5ID0gU1FMIHN0YXRlbWVudCB3aXRoICI/IiBmb3IgYmluZCBhcmdzCiAgICAgICogICAgIHZhbHVlID0ge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfQogICAgICAqIElmIGFuIGFwcGxpY2F0aW9uIG9wZW5zIHRoZSBkYXRhYmFzZSBhbmQga2VlcHMgaXQgb3BlbiBkdXJpbmcgaXRzIGVudGlyZSBsaWZlLCB0aGVuCi0gICAgICogdGhlcmUgd2lsbCBub3QgYmUgYW4gb3ZlcmhlYWQgb2YgY29tcGlsYXRpb24gb2Ygc3FsIHN0YXRlbWVudHMgYnkgc3FsaXRlLgorICAgICAqIHRoZXJlIHdpbGwgbm90IGJlIGFuIG92ZXJoZWFkIG9mIGNvbXBpbGF0aW9uIG9mIFNRTCBzdGF0ZW1lbnRzIGJ5IHNxbGl0ZS4KICAgICAgKgogICAgICAqIHdoeSBpcyB0aGlzIGNhY2hlIE5PVCBzdGF0aWM/IGJlY2F1c2Ugc3FsaXRlIGF0dGFjaGVzIGNvbXBpbGVkc3FsIHN0YXRlbWVudHMgdG8gdGhlCiAgICAgICogc3RydWN0IGNyZWF0ZWQgd2hlbiB7QGxpbmsgU1FMaXRlRGF0YWJhc2Ujb3BlbkRhdGFiYXNlKFN0cmluZywgQ3Vyc29yRmFjdG9yeSwgaW50KX0gaXMKICAgICAgKiBpbnZva2VkLgogICAgICAqCiAgICAgICogdGhpcyBjYWNoZSBoYXMgYW4gdXBwZXIgbGltaXQgb2YgbU1heFNxbENhY2hlU2l6ZSAoc2V0dGFibGUgYnkgY2FsbGluZyB0aGUgbWV0aG9kCi0gICAgICogKEBsaW5rIHNldE1heENhY2hlU2l6ZShpbnQpfSkuIGl0cyBkZWZhdWx0IGlzIDAgLSBpLmUuLCBubyBjYWNoaW5nIGJ5IGRlZmF1bHQgYmVjYXVzZQotICAgICAqIG1vc3Qgb2YgdGhlIGFwcHMgZG9uJ3QgdXNlICI/IiBzeW50YXggaW4gdGhlaXIgc3FsLCBjYWNoaW5nIGlzIG5vdCB1c2VmdWwgZm9yIHRoZW0uCisgICAgICogKEBsaW5rICNzZXRNYXhTcWxDYWNoZVNpemUoaW50KX0pLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gTWFwPFN0cmluZywgU1FMaXRlQ29tcGlsZWRTcWw+IG1Db21waWxlZFF1ZXJpZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAvLyBkZWZhdWx0IHN0YXRlbWVudC1jYWNoZSBzaXplIHBlciBkYXRhYmFzZSBjb25uZWN0aW9uICggPSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzKQorICAgIHByaXZhdGUgaW50IG1NYXhTcWxDYWNoZVNpemUgPSAyNTsKKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIE1hcDxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBtQ29tcGlsZWRRdWVyaWVzID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTUUxpdGVDb21waWxlZFNxbD4obU1heFNxbENhY2hlU2l6ZSArIDEsIDAuNzVmLCB0cnVlKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxTdHJpbmcsIFNRTGl0ZUNvbXBpbGVkU3FsPiBlbGRlc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBlbGRlc3QgPSBsZWFzdC1yZWNlbnRseSB1c2VkIGVudHJ5CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCB0byBhY2NvbW1vZGF0ZSBhIG5ldyBlbnRyeSwKKyAgICAgICAgICAgICAgICAvLyAgICAgY2xvc2Uge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSByZXByZXNlbnRlZCBieSB0aGlzIGVudHJ5LCBpZiBub3QgaW4gdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIGFuZCB0aGVuIGxldCBpdCBiZSByZW1vdmVkIGZyb20gdGhlIE1hcC4KKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoaXMgaXMgY2FsbGVkLCB0aGUgY2FsbGVyIG11c3QgYmUgdHJ5aW5nIHRvIGFkZCBhIGp1c3QtY29tcGlsZWQgc3RtdAorICAgICAgICAgICAgICAgIC8vIHRvIGNhY2hlOyBpLmUuLCBjYWxsZXIgc2hvdWxkIGFscmVhZHkgaGF2ZSBhY3F1aXJlZCBkYXRhYmFzZSBsb2NrIEFORAorICAgICAgICAgICAgICAgIC8vIHRoZSBsb2NrIG9uIG1Db21waWxlZFF1ZXJpZXMuIGRvIGFzIGFzc2VydCBvZiB0aGVzZSB0d28gMiBmYWN0cy4KKyAgICAgICAgICAgICAgICB2ZXJpZnlMb2NrT3duZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zaXplKCkgPD0gbU1heFNxbENhY2hlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBpcyBub3QgZnVsbC4gbm90aGluZyBuZWVkcyB0byBiZSByZW1vdmVkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgZnVsbC4gZWxkZXN0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBlbnRyeSA9IGVsZGVzdC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICghZW50cnkuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpcyBub3QgaW4gdXNlLiByZWxlYXNlIGl0LgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZWxlYXNlU3FsU3RhdGVtZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlLCBzbyB0aGF0IHRoaXMgZW50cnkgaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAgICAgLyoqCi0gICAgICogQGhpZGUKKyAgICAgKiBhYnNvbHV0ZSBtYXggdmFsdWUgdGhhdCBjYW4gYmUgc2V0IGJ5IHtAbGluayAjc2V0TWF4U3FsQ2FjaGVTaXplKGludCl9CisgICAgICogc2l6ZSBvZiBlYWNoIHByZXBhcmVkLXN0YXRlbWVudCBpcyBiZXR3ZWVuIDFLIC0gNkssIGRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUKKyAgICAgKiBTUUwgc3RhdGVtZW50ICYgc2NoZW1hLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TUUxfQ0FDSEVfU0laRSA9IDI1MDsKLSAgICBwcml2YXRlIGludCBtTWF4U3FsQ2FjaGVTaXplID0gTUFYX1NRTF9DQUNIRV9TSVpFOyAvLyBtYXggY2FjaGUgc2l6ZSBwZXIgRGF0YWJhc2UgaW5zdGFuY2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfU1FMX0NBQ0hFX1NJWkUgPSAxMDA7CiAgICAgcHJpdmF0ZSBpbnQgbUNhY2hlRnVsbFdhcm5pbmdzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTiA9IDE7CiAKQEAgLTI4Miw0NSArMzE1LDU5IEBACiAgICAgcHJpdmF0ZSBpbnQgbU51bUNhY2hlSGl0czsKICAgICBwcml2YXRlIGludCBtTnVtQ2FjaGVNaXNzZXM7CiAKLSAgICAvKiogdGhlIGZvbGxvd2luZyAyIG1lbWJlcnMgbWFpbnRhaW4gdGhlIHRpbWUgd2hlbiBhIGRhdGFiYXNlIGlzIG9wZW5lZCBhbmQgY2xvc2VkICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpbWVPcGVuZWQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaW1lQ2xvc2VkID0gbnVsbDsKLQogICAgIC8qKiBVc2VkIHRvIGZpbmQgb3V0IHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkIGluIGNhc2UgaXQgbmV2ZXIgZ290IGNsb3NlZC4gKi8KLSAgICBwcml2YXRlIFRocm93YWJsZSBtU3RhY2tUcmFjZSA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUgbVN0YWNrVHJhY2U7CiAKICAgICAvLyBTeXN0ZW0gcHJvcGVydHkgdGhhdCBlbmFibGVzIGxvZ2dpbmcgb2Ygc2xvdyBxdWVyaWVzLiBTcGVjaWZ5IHRoZSB0aHJlc2hvbGQgaW4gbXMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19TTE9XX1FVRVJJRVNfUFJPUEVSVFkgPSAiZGIubG9nLnNsb3dfcXVlcnlfdGhyZXNob2xkIjsKICAgICBwcml2YXRlIGZpbmFsIGludCBtU2xvd1F1ZXJ5VGhyZXNob2xkOwogCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsb3NhYmxlCisgICAgLyoqIHN0b3JlcyB0aGUgbGlzdCBvZiBzdGF0ZW1lbnQgaWRzIHRoYXQgbmVlZCB0byBiZSBmaW5hbGl6ZWQgYnkgc3FsaXRlICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbUNsb3NlZFN0YXRlbWVudElkcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIC8qKiB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmV0dXJucyBhbnkgb2YgdGhlIGZvbGxvd2luZyBlcnJvcnMKKyAgICAgKiAgICBDb3JydXB0aW9uCisgICAgICogKi8KKyAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlRXJyb3JIYW5kbGVyIG1FcnJvckhhbmRsZXI7CisKKyAgICAvKiogVGhlIERhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbCB7QGxpbmsgRGF0YWJhc2VDb25uZWN0aW9uUG9vbH0uCisgICAgICogVmlzaWJpbGl0eSBpcyBwYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuIG90aGVyd2lzZSwgcHJpdmF0ZSB2aXNpYmlsaXR5IGlzIGVub3VnaC4KICAgICAgKi8KLSAgICB2b2lkIGFkZFNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAvKiBwYWNrYWdlICovIHZvbGF0aWxlIERhdGFiYXNlQ29ubmVjdGlvblBvb2wgbUNvbm5lY3Rpb25Qb29sID0gbnVsbDsKKworICAgIC8qKiBFYWNoIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIGluIHRoZSBwb29sIGlzIGFzc2lnbmVkIGEgbnVtYmVyIDEuLk4sIHdoZXJlIE4gaXMgdGhlCisgICAgICogc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBwb29sLgorICAgICAqIFRoZSBtYWluIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHdoaWNoIHRoZSBwb29sIGlzIGF0dGFjaGVkIGlzIGFzc2lnbmVkIGEgdmFsdWUgb2YgMC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGZpbmFsIHNob3J0IG1Db25uZWN0aW9uTnVtOworCisgICAgLyoqIG9uIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9ucywgdGhpcyBtZW1iZXIgcG9pbnRzIHRvIHRoZSBwYXJlbnQgKCA9IG1haW4pCisgICAgICogZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICogcGFja2FnZSB2aXNpYmlsaXR5IG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIG1QYXJlbnRDb25uT2JqID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1PUllfREJfUEFUSCA9ICI6bWVtb3J5OiI7CisKKyAgICAvKiogc3RvcmVzIHJlZmVyZW5jZSB0byBhbGwgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGUgY3VycmVudCBwcm9jZXNzLiAqLworICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9CisgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PigpOworCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKKyAgICAgICAgLy8gbVByb2dyYW1zIGlzIHBlciBpbnN0YW5jZSBvZiBTUUxpdGVEYXRhYmFzZSBhbmQgaXQgZG9lc24ndCBhY3R1YWxseSB0b3VjaCB0aGUgZGF0YWJhc2UKKyAgICAgICAgLy8gaXRzZWxmLiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBsb2NrKCkuCisgICAgICAgIG1Qcm9ncmFtcy5wdXQoY2xvc2FibGUsIG51bGwpOwogICAgIH0KIAotICAgIHZvaWQgcmVtb3ZlU1FMaXRlQ2xvc2FibGUoU1FMaXRlQ2xvc2FibGUgY2xvc2FibGUpIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbVByb2dyYW1zLnJlbW92ZShjbG9zYWJsZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNRTGl0ZUNsb3NhYmxlKFNRTGl0ZUNsb3NhYmxlIGNsb3NhYmxlKSB7CisgICAgICAgIG1Qcm9ncmFtcy5yZW1vdmUoY2xvc2FibGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCkgewogICAgICAgICBpZiAoaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtVGltZUNsb3NlZCA9IGdldFRpbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBkYXRhYmFzZSB3aGljaCB3aWxsIGNsb3NlIGFsbCBwZW5kaW5nIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkIGFsc28KKyAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1MCwxOSArMzk3LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKIAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBvbkNvcnJ1cHRpb24oKSB7Ci0gICAgICAgIExvZy5lKFRBRywgIlJlbW92aW5nIGNvcnJ1cHQgZGF0YWJhc2U6ICIgKyBtUGF0aCk7CiAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRfREJfQ09SUlVQVCwgbVBhdGgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRhdGFiYXNlIChpZiB3ZSBjYW4pLCB3aGljaCB3aWxsIGNhdXNlIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB0byBmYWlsLgotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgY29ycnVwdCBmaWxlLiAgRG9uJ3QgcmUtY3JlYXRlIGl0IG5vdyAtLSB0aGF0IHdvdWxkIGp1c3QgY29uZnVzZSBwZW9wbGUKLSAgICAgICAgICAgIC8vIC0tIGJ1dCB0aGUgbmV4dCB0aW1lIHNvbWVvbmUgdHJpZXMgdG8gb3BlbiBpdCwgdGhleSBjYW4gc2V0IGl0IHVwIGZyb20gc2NyYXRjaC4KLSAgICAgICAgICAgIGlmICghbVBhdGguZXF1YWxzSWdub3JlQ2FzZSgiOm1lbW9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGlzIG9ubHkgZm9yIG5vbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShtUGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24odGhpcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzQsNiArNDEwLDcgQEAKICAgICAgKiBAc2VlICN1bmxvY2soKQogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBsb2NrKCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBpZiAoIW1Mb2NraW5nRW5hYmxlZCkgcmV0dXJuOwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19MT0NLX1RJTUVfVFJBQ0tJTkcpIHsKQEAgLTM5NCw2ICs0MzEsNyBAQAogICAgICAqIEBzZWUgI3VubG9ja0ZvcmNlZCgpCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGxvY2tGb3JjZWQoKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX0xPQ0tfVElNRV9UUkFDS0lORykgewogICAgICAgICAgICAgaWYgKG1Mb2NrLmdldEhvbGRDb3VudCgpID09IDEpIHsKQEAgLTQ2MCwxMSArNDk4LDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyBjYW4gYmUgbmVzdGVkLiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBFWENMVVNJVkUgbW9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4KKyAgICAgKiBXaGVuIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YKICAgICAgKiB0aGUgd29yayBkb25lIGluIHRoYXQgdHJhbnNhY3Rpb24gYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvcgogICAgICAqIHJvbGxlZCBiYWNrLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCiAgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgY29tbWl0dGVkLgotICAgICAqCisgICAgICogPC9wPgogICAgICAqIDxwPkhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CiAgICAgICoKICAgICAgKiA8cHJlPgpAQCAtNDc4LDE1ICs1MTksNDIgQEAKICAgICAgKiA8L3ByZT4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uKCkgewotICAgICAgICBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyKG51bGwgLyogdHJhbnNhY3Rpb25TdGF0dXNDYWxsYmFjayAqLyk7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4gdGhlIG91dGVyIHRyYW5zYWN0aW9uIGlzIGVuZGVkIGFsbCBvZgorICAgICAqIEJlZ2lucyBhIHRyYW5zYWN0aW9uIGluIElNTUVESUFURSBtb2RlLiBUcmFuc2FjdGlvbnMgY2FuIGJlIG5lc3RlZC4gV2hlbgorICAgICAqIHRoZSBvdXRlciB0cmFuc2FjdGlvbiBpcyBlbmRlZCBhbGwgb2YgdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uCisgICAgICogYW5kIGFsbCBvZiB0aGUgbmVzdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGNvbW1pdHRlZCBvciByb2xsZWQgYmFjay4gVGhlCisgICAgICogY2hhbmdlcyB3aWxsIGJlIHJvbGxlZCBiYWNrIGlmIGFueSB0cmFuc2FjdGlvbiBpcyBlbmRlZCB3aXRob3V0IGJlaW5nCisgICAgICogbWFya2VkIGFzIGNsZWFuIChieSBjYWxsaW5nIHNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCkuIE90aGVyd2lzZSB0aGV5CisgICAgICogd2lsbCBiZSBjb21taXR0ZWQuCisgICAgICogPHA+CisgICAgICogSGVyZSBpcyB0aGUgc3RhbmRhcmQgaWRpb20gZm9yIHRyYW5zYWN0aW9uczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24obnVsbCAvKiB0cmFuc2FjdGlvblN0YXR1c0NhbGxiYWNrICovLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGEgdHJhbnNhY3Rpb24gaW4gRVhDTFVTSVZFIG1vZGUuCisgICAgICogPHA+CisgICAgICogVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuCisgICAgICogV2hlbiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mCiAgICAgICogdGhlIHdvcmsgZG9uZSBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3IKICAgICAgKiByb2xsZWQgYmFjay4gVGhlIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZwogICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIGNvbW1pdHRlZC4KLSAgICAgKgorICAgICAqIDwvcD4KICAgICAgKiA8cD5IZXJlIGlzIHRoZSBzdGFuZGFyZCBpZGlvbSBmb3IgdHJhbnNhY3Rpb25zOgogICAgICAqCiAgICAgICogPHByZT4KQEAgLTQ5OCwxNSArNTY2LDQ4IEBACiAgICAgICogICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICogICB9CiAgICAgICogPC9wcmU+CisgICAgICoKICAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBiZWdpbnMsCiAgICAgICogY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlciBleHBsaWNpdGx5IG9yIGJ5IGEgY2FsbCB0bwogICAgICAqIHtAbGluayAjeWllbGRJZkNvbnRlbmRlZFNhZmVseX0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lcihTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyIHRyYW5zYWN0aW9uTGlzdGVuZXIpIHsKKyAgICAgICAgYmVnaW5UcmFuc2FjdGlvbih0cmFuc2FjdGlvbkxpc3RlbmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgYSB0cmFuc2FjdGlvbiBpbiBJTU1FRElBVEUgbW9kZS4gVHJhbnNhY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIFdoZW4KKyAgICAgKiB0aGUgb3V0ZXIgdHJhbnNhY3Rpb24gaXMgZW5kZWQgYWxsIG9mIHRoZSB3b3JrIGRvbmUgaW4gdGhhdCB0cmFuc2FjdGlvbgorICAgICAqIGFuZCBhbGwgb2YgdGhlIG5lc3RlZCB0cmFuc2FjdGlvbnMgd2lsbCBiZSBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIFRoZQorICAgICAqIGNoYW5nZXMgd2lsbCBiZSByb2xsZWQgYmFjayBpZiBhbnkgdHJhbnNhY3Rpb24gaXMgZW5kZWQgd2l0aG91dCBiZWluZworICAgICAqIG1hcmtlZCBhcyBjbGVhbiAoYnkgY2FsbGluZyBzZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwpLiBPdGhlcndpc2UgdGhleQorICAgICAqIHdpbGwgYmUgY29tbWl0dGVkLgorICAgICAqIDxwPgorICAgICAqIEhlcmUgaXMgdGhlIHN0YW5kYXJkIGlkaW9tIGZvciB0cmFuc2FjdGlvbnM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZGIuYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShsaXN0ZW5lcik7CisgICAgICogICB0cnkgeworICAgICAqICAgICAuLi4KKyAgICAgKiAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICogICB9IGZpbmFsbHkgeworICAgICAqICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAqICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZ2lucywgY29tbWl0cywgb3IgaXMgcm9sbGVkIGJhY2ssIGVpdGhlcgorICAgICAqICAgICAgICAgICAgZXhwbGljaXRseSBvciBieSBhIGNhbGwgdG8ge0BsaW5rICN5aWVsZElmQ29udGVuZGVkU2FmZWx5fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpblRyYW5zYWN0aW9uV2l0aExpc3RlbmVyTm9uRXhjbHVzaXZlKAorICAgICAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb25MaXN0ZW5lciB0cmFuc2FjdGlvbkxpc3RlbmVyKSB7CisgICAgICAgIGJlZ2luVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25MaXN0ZW5lciwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiZWdpblRyYW5zYWN0aW9uKFNRTGl0ZVRyYW5zYWN0aW9uTGlzdGVuZXIgdHJhbnNhY3Rpb25MaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGxvY2tGb3JjZWQoKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQogICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCBhbHJlYWR5IGhhZCB0aGUgbG9jayB0aGVuIGdldCBvdXQKQEAgLTUyNCw3ICs2MjUsMTEgQEAKIAogICAgICAgICAgICAgLy8gVGhpcyB0aHJlYWQgZGlkbid0IGFscmVhZHkgaGF2ZSB0aGUgbG9jaywgc28gYmVnaW4gYSBkYXRhYmFzZQogICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gbm93LgotICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gRVhDTFVTSVZFOyIpOworICAgICAgICAgICAgaWYgKGV4Y2x1c2l2ZSAmJiBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4ZWNTUUwoIkJFR0lOIEVYQ0xVU0lWRTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY1NRTCgiQkVHSU4gSU1NRURJQVRFOyIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVRyYW5zYWN0aW9uTGlzdGVuZXIgPSB0cmFuc2FjdGlvbkxpc3RlbmVyOwogICAgICAgICAgICAgbVRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTsKICAgICAgICAgICAgIG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7CkBAIC01NTEsMTIgKzY1Niw3IEBACiAgICAgICogYXJlIGNvbW1pdHRlZCBhbmQgcm9sbGVkIGJhY2suCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9jay5pc0hlbGRCeUN1cnJlbnRUaHJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gdHJhbnNhY3Rpb24gcGVuZGluZyIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1Jbm5lclRyYW5zYWN0aW9uSXNTdWNjZXNzZnVsKSB7CiAgICAgICAgICAgICAgICAgbUlubmVyVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwgPSBmYWxzZTsKQEAgLTU4MSw2ICs2ODEsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVHJhbnNhY3Rpb25Jc1N1Y2Nlc3NmdWwpIHsKICAgICAgICAgICAgICAgICBleGVjU1FMKENPTU1JVF9TUUwpOworICAgICAgICAgICAgICAgIC8vIGlmIHdyaXRlLWFoZWFkIGxvZ2dpbmcgaXMgdXNlZCwgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgY2hlY2twb2ludC4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXBwbGljYXRpb25zIGJlIGdpdmVuIHRoZSBmbGV4aWJpbGl0eSBvZiBjaG9vc2luZyB3aGVuIHRvCisgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGVja3BvaW50PworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIGRvIGNoZWNrcG9pbnQgYWZ0ZXIgZXZlcnkgQ09NTUlUIGJlY2F1c2UgdGhhdCBpcyB0aGUgZmFzdGVzdAorICAgICAgICAgICAgICAgIC8vIHdheSB0byBndWFyYW50ZWUgdGhhdCByZWFkZXJzIHdpbGwgc2VlIGxhdGVzdCBkYXRhLgorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIHRoZSBzbG93ZXN0IHdheSB0byBydW4gc3FsaXRlIHdpdGggaW4gd3JpdGUtYWhlYWQgbG9nZ2luZyBtb2RlLgorICAgICAgICAgICAgICAgIGlmICh0aGlzLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWNTUUwoIlBSQUdNQSB3YWxfY2hlY2twb2ludDsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQUkFHTUEgd2FsX0NoZWNrcG9pbnQgZG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBleGVjU1FMKCJST0xMQkFDSzsiKTsKQEAgLTYxNCw5ICs3MjYsNyBAQAogICAgICAqIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgbWFya2VkIGFzIHN1Y2Nlc3NmdWwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCkgewotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CiAgICAgICAgIGlmICghbUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIHRyYW5zYWN0aW9uIHBlbmRpbmciKTsKICAgICAgICAgfQpAQCAtNjMxLDcgKzc0MSw1MCBAQAogICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb24gcGVuZGluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGluVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDA7CisgICAgICAgIHJldHVybiBtTG9jay5nZXRIb2xkQ291bnQoKSA+IDAgfHwgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJmb3VuZCBleGVjU1FMKCdiZWdpbiB0cmFuc2FjdGlvbicpIik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0VHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWxGbGFnKCkgeworICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiZm91bmQgZXhlY1NRTCgnY29tbWl0IG9yIGVuZCBvciByb2xsYmFjaycpIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICogPHA+CisgICAgICogQ2FsbGVyIGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZQorICAgICAqIDxvbD4KKyAgICAgKiAgIDxsaT5JZiB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcgYmVnaW5UcmFuc2FjdGlvbigpIG1ldGhvZHMgQU5EIGlmIHRoZSBjYWxsZXIgaXMKKyAgICAgKiAgIGluIHRoZSBzYW1lIHRocmVhZCBhcyB0aGUgdGhyZWFkIHRoYXQgc3RhcnRlZCB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogICA8L2xpPgorICAgICAqICAgPGxpPklmIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIGJ5IGNhbGxpbmcge0BsaW5rICNleGVjU1FMKFN0cmluZyl9IGxpa2UgdGhpczoKKyAgICAgKiAgIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuIEluIHRoaXMgY2FzZSwgZXZlcnkgdGhyZWFkIGluIHRoZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQKKyAgICAgKiAgIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhbUlJblRyYW5zYWN0aW9uKCkgeworICAgICAgICAvLyBhbHdheXMgZG8gdGhpcyB0ZXN0IG9uIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gLSBOT1Qgb24gcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2luY2UgdHJhbnNhY3Rpb25zIGFsd2F5cyBvY2N1ciBvbiB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9ucyBvbmx5LgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgPyBtUGFyZW50Q29ubk9iaiA6IHRoaXM7CisgICAgICAgIGJvb2xlYW4gYiA9ICghZGIuaW5UcmFuc2FjdGlvbigpKSA/IGZhbHNlIDoKKyAgICAgICAgICAgICAgICBkYi5tVHJhbnNhY3Rpb25Vc2luZ0V4ZWNTcWwgfHwgZGIubUxvY2suaXNIZWxkQnlDdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImFtSWluVHJhbnNhY3Rpb246ICIgKyBiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYjsKICAgICB9CiAKICAgICAvKioKQEAgLTczNSw1NCArODg4LDEyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8qKiBNYXBzIHRhYmxlIG5hbWVzIHRvIGluZm8gYWJvdXQgd2hhdCB0byB3aGljaCBfc3luY190aW1lIGNvbHVtbiB0byBzZXQKLSAgICAgKiB0byBOVUxMIG9uIGFuIHVwZGF0ZS4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgc3luY2luZy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN5bmNVcGRhdGVJbmZvPiBtU3luY1VwZGF0ZUluZm8gPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTeW5jVXBkYXRlSW5mbz4oKTsKLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN5bmNlZFRhYmxlcygpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdGFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG1TeW5jVXBkYXRlSW5mby5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN5bmNVcGRhdGVJbmZvIGluZm8gPSBtU3luY1VwZGF0ZUluZm8uZ2V0KHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5kZWxldGVkVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YWJsZXMucHV0KHRhYmxlLCBpbmZvLmRlbGV0ZWRUYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRhYmxlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgotICAgICAqIEludGVybmFsIGNsYXNzIHVzZWQgdG8ga2VlcCB0cmFjayB3aGF0IG5lZWRzIHRvIGJlIG1hcmtlZCBhcyBjaGFuZ2VkCi0gICAgICogd2hlbiBhbiB1cGRhdGUgb2NjdXJzLiBUaGlzIGlzIHVzZWQgZm9yIHN5bmNpbmcsIHNvIHRoZSBzeW5jIGVuZ2luZQotICAgICAqIGtub3dzIHdoYXQgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIGxvY2FsbHkuCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3luY1VwZGF0ZUluZm8gewotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyB0aGUgU3luY1VwZGF0ZUluZm8gY2xhc3MuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtYXN0ZXJUYWJsZSBUaGUgdGFibGUgdG8gc2V0IF9zeW5jX3RpbWUgdG8gTlVMTCBpbgotICAgICAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICAgICAqICAgICAgICAgIG1hc3RlciB0YWJsZQotICAgICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSBUaGUga2V5IHRoYXQgcmVmZXJzIHRvIHRoZSBwcmltYXJ5IGtleSBpbiB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgU3luY1VwZGF0ZUluZm8oU3RyaW5nIG1hc3RlclRhYmxlLCBTdHJpbmcgZGVsZXRlZFRhYmxlLAotICAgICAgICAgICAgICAgIFN0cmluZyBmb3JlaWduS2V5KSB7Ci0gICAgICAgICAgICB0aGlzLm1hc3RlclRhYmxlID0gbWFzdGVyVGFibGU7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0ZWRUYWJsZSA9IGRlbGV0ZWRUYWJsZTsKLSAgICAgICAgICAgIHRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogVGhlIHRhYmxlIGNvbnRhaW5pbmcgdGhlIF9zeW5jX3RpbWUgY29sdW1uICovCi0gICAgICAgIFN0cmluZyBtYXN0ZXJUYWJsZTsKLQotICAgICAgICAvKiogVGhlIGRlbGV0ZWQgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbWFzdGVyIHRhYmxlICovCi0gICAgICAgIFN0cmluZyBkZWxldGVkVGFibGU7Ci0KLSAgICAgICAgLyoqIFRoZSBrZXkgaW4gdGhlIGxvY2FsIHRhYmxlIHRoZSByb3cgaW4gdGFibGUuIEl0IG1heSBiZSBfaWQsIGlmIHRhYmxlCi0gICAgICAgICAqIGlzIHRoZSBsb2NhbCB0YWJsZS4gKi8KLSAgICAgICAgU3RyaW5nIGZvcmVpZ25LZXk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTeW5jZWRUYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oMCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OTEsOCArOTAyLDcgQEAKICAgICBwdWJsaWMgaW50ZXJmYWNlIEN1cnNvckZhY3RvcnkgewogICAgICAgICAvKioKICAgICAgICAgICogU2VlCi0gICAgICAgICAqIHtAbGluayBTUUxpdGVDdXJzb3IjU1FMaXRlQ3Vyc29yKFNRTGl0ZURhdGFiYXNlLCBTUUxpdGVDdXJzb3JEcml2ZXIsCi0gICAgICAgICAqIFN0cmluZywgU1FMaXRlUXVlcnkpfS4KKyAgICAgICAgICoge0BsaW5rIFNRTGl0ZUN1cnNvciNTUUxpdGVDdXJzb3IoU1FMaXRlQ3Vyc29yRHJpdmVyLCBTdHJpbmcsIFNRTGl0ZVF1ZXJ5KX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQ3Vyc29yIG5ld0N1cnNvcihTUUxpdGVEYXRhYmFzZSBkYiwKICAgICAgICAgICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgbWFzdGVyUXVlcnksIFN0cmluZyBlZGl0VGFibGUsCkBAIC04MTQsMzAgKzkyNCw4MCBAQAogICAgICAqIEB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIGlmIHRoZSBkYXRhYmFzZSBjYW5ub3QgYmUgb3BlbmVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIHNxbGl0ZURhdGFiYXNlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncywgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkYXRhYmFzZSBhY2NvcmRpbmcgdG8gdGhlIGZsYWdzIHtAbGluayAjT1BFTl9SRUFEV1JJVEV9CisgICAgICoge0BsaW5rICNPUEVOX1JFQURPTkxZfSB7QGxpbmsgI0NSRUFURV9JRl9ORUNFU1NBUll9IGFuZC9vciB7QGxpbmsgI05PX0xPQ0FMSVpFRF9DT0xMQVRPUlN9LgorICAgICAqCisgICAgICogPHA+U2V0cyB0aGUgbG9jYWxlIG9mIHRoZSBkYXRhYmFzZSB0byB0aGUgIHRoZSBzeXN0ZW0ncyBjdXJyZW50IGxvY2FsZS4KKyAgICAgKiBDYWxsIHtAbGluayAjc2V0TG9jYWxlfSBpZiB5b3Ugd291bGQgbGlrZSBzb21ldGhpbmcgZWxzZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5BY2NlcHRzIGlucHV0IHBhcmFtOiBhIGNvbmNyZXRlIGluc3RhbmNlIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gYmUKKyAgICAgKiB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UgY29ycnVwdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0byBkYXRhYmFzZSBmaWxlIHRvIG9wZW4gYW5kL29yIGNyZWF0ZQorICAgICAqIEBwYXJhbSBmYWN0b3J5IGFuIG9wdGlvbmFsIGZhY3RvcnkgY2xhc3MgdGhhdCBpcyBjYWxsZWQgdG8gaW5zdGFudGlhdGUgYQorICAgICAqICAgICAgICAgICAgY3Vyc29yIHdoZW4gcXVlcnkgaXMgY2FsbGVkLCBvciBudWxsIGZvciBkZWZhdWx0CisgICAgICogQHBhcmFtIGZsYWdzIHRvIGNvbnRyb2wgZGF0YWJhc2UgYWNjZXNzIG1vZGUKKyAgICAgKiBAcGFyYW0gZXJyb3JIYW5kbGVyIHRoZSB7QGxpbmsgRGF0YWJhc2VFcnJvckhhbmRsZXJ9IG9iaiB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb3JydXB0aW9uCisgICAgICogd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgb3BlbmVkIGRhdGFiYXNlCisgICAgICogQHRocm93cyBTUUxpdGVFeGNlcHRpb24gaWYgdGhlIGRhdGFiYXNlIGNhbm5vdCBiZSBvcGVuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5EYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2Ugc3FsaXRlRGF0YWJhc2UgPSBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgZmxhZ3MsIGVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDAgLyogdGhlIG1haW4gY29ubmVjdGlvbiBoYW5kbGUgKi8pOworCisgICAgICAgIC8vIHNldCBzcWxpdGUgcGFnZXNpemUgdG8gbUJsb2NrU2l6ZQorICAgICAgICBpZiAoc0Jsb2NrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiAiL2RhdGEiIHNob3VsZCBiZSBhIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29uc3RhbnQgc29tZXdoZXJlLiBpdCBpcyBoYXJkY29kZWQKKyAgICAgICAgICAgIC8vIGluIHNldmVyYWwgcGxhY2VzIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHNCbG9ja1NpemUgPSBuZXcgU3RhdEZzKCIvZGF0YSIpLmdldEJsb2NrU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHNxbGl0ZURhdGFiYXNlLnNldFBhZ2VTaXplKHNCbG9ja1NpemUpOworICAgICAgICAvL1NUT1BTSElQIC0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAvL3NxbGl0ZURhdGFiYXNlLnNldEpvdXJuYWxNb2RlKHBhdGgsICJUUlVOQ0FURSIpOworICAgICAgICAvLyBTVE9QU0hJUCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lcworICAgICAgICBpZiAoIXBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIHNxbGl0ZURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIFNUT1BTSElQCisKKyAgICAgICAgLy8gYWRkIHRoaXMgZGF0YWJhc2UgdG8gdGhlIGxpc3Qgb2YgZGF0YWJhc2VzIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIG1BY3RpdmVEYXRhYmFzZXMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPihzcWxpdGVEYXRhYmFzZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTUUxpdGVEYXRhYmFzZSBvcGVuRGF0YWJhc2UoU3RyaW5nIHBhdGgsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IGZsYWdzLAorICAgICAgICAgICAgRGF0YWJhc2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyLCBzaG9ydCBjb25uZWN0aW9uTnVtKSB7CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbmV3IFNRTGl0ZURhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIm9wZW5pbmcgdGhlIGRiIDogIiArIHBhdGgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gT3BlbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5kYm9wZW4ocGF0aCwgZmxhZ3MpOworICAgICAgICAgICAgZGIuc2V0TG9jYWxlKExvY2FsZS5nZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9TVEFURU1FTlRTKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsVHJhY2luZyhwYXRoKTsKKyAgICAgICAgICAgICAgICBkYi5lbmFibGVTcWxUcmFjaW5nKHBhdGgsIGNvbm5lY3Rpb25OdW0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9USU1FKSB7Ci0gICAgICAgICAgICAgICAgc3FsaXRlRGF0YWJhc2UuZW5hYmxlU3FsUHJvZmlsaW5nKHBhdGgpOworICAgICAgICAgICAgICAgIGRiLmVuYWJsZVNxbFByb2ZpbGluZyhwYXRoLCBjb25uZWN0aW9uTnVtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkYjsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWNvdmVyIGZyb20gdGhpcywgaWYgd2UgY2FuLgotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGRvIHRoaXMgZm9yIG90aGVyIG9wZW4gZmFpbHVyZXM/Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJEZWxldGluZyBhbmQgcmUtY3JlYXRpbmcgY29ycnVwdCBkYXRhYmFzZSAiICsgcGF0aCwgZSk7Ci0gICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UX0RCX0NPUlJVUFQsIHBhdGgpOwotICAgICAgICAgICAgaWYgKCFwYXRoLmVxdWFsc0lnbm9yZUNhc2UoIjptZW1vcnkiKSkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpcyBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlIGZpbGVzCi0gICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcWxpdGVEYXRhYmFzZSA9IG5ldyBTUUxpdGVEYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBmbGFncyk7CisgICAgICAgICAgICBkYi5tRXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYik7CisgICAgICAgICAgICByZXR1cm4gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKHBhdGgsIGZhY3RvcnksIGZsYWdzLCBlcnJvckhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG9wZW4gdGhlIGRhdGFiYXNlLiBjbG9zaW5nIGl0LiIsIGUpOworICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KLSAgICAgICAgQWN0aXZlRGF0YWJhc2VzLmdldEluc3RhbmNlKCkubUFjdGl2ZURhdGFiYXNlcy5hZGQoCi0gICAgICAgICAgICAgICAgbmV3IFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+KHNxbGl0ZURhdGFiYXNlKSk7Ci0gICAgICAgIHJldHVybiBzcWxpdGVEYXRhYmFzZTsKICAgICB9CiAKICAgICAvKioKQEAgLTg1NSw2ICsxMDE1LDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBvcGVuRGF0YWJhc2UocGF0aCwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgZXJyb3JIYW5kbGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNRTGl0ZURhdGFiYXNlIG9wZW5PckNyZWF0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG9wZW5EYXRhYmFzZShwYXRoLCBmYWN0b3J5LCBDUkVBVEVfSUZfTkVDRVNTQVJZLCBlcnJvckhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRKb3VybmFsTW9kZShmaW5hbCBTdHJpbmcgZGJQYXRoLCBmaW5hbCBTdHJpbmcgbW9kZSkgeworICAgICAgICAvLyBqb3VybmFsIG1vZGUgY2FuIGJlIHNldCBvbmx5IGZvciBub24tbWVtb3J5IGRhdGFiYXNlcworICAgICAgICBpZiAoIWRiUGF0aC5lcXVhbHNJZ25vcmVDYXNlKE1FTU9SWV9EQl9QQVRIKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBEYXRhYmFzZVV0aWxzLnN0cmluZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgam91cm5hbF9tb2RlPSIgKyBtb2RlLCBudWxsKTsKKyAgICAgICAgICAgIGlmICghcy5lcXVhbHNJZ25vcmVDYXNlKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic2V0dGluZyBqb3VybmFsX21vZGUgdG8gIiArIG1vZGUgKyAiIGZhaWxlZCBmb3IgZGI6ICIgKyBkYlBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgIiAob24gcHJhZ21hIHNldCBqb3VybmFsX21vZGUsIHNxbGl0ZSByZXR1cm5lZDoiICsgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZW1vcnkgYmFja2VkIFNRTGl0ZSBkYXRhYmFzZS4gIEl0cyBjb250ZW50cyB3aWxsIGJlIGRlc3Ryb3llZAogICAgICAqIHdoZW4gdGhlIGRhdGFiYXNlIGlzIGNsb3NlZC4KICAgICAgKgpAQCAtODY3LDcgKzEwNDYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgY3JlYXRlKEN1cnNvckZhY3RvcnkgZmFjdG9yeSkgewogICAgICAgICAvLyBUaGlzIGlzIGEgbWFnaWMgc3RyaW5nIHdpdGggc3BlY2lhbCBtZWFuaW5nIGZvciBTUUxpdGUuCi0gICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoIjptZW1vcnk6IiwgZmFjdG9yeSwgQ1JFQVRFX0lGX05FQ0VTU0FSWSk7CisgICAgICAgIHJldHVybiBvcGVuRGF0YWJhc2UoTUVNT1JZX0RCX1BBVEgsIGZhY3RvcnksIENSRUFURV9JRl9ORUNFU1NBUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODc3LDE4ICsxMDU2LDMxIEBACiAgICAgICAgIGlmICghaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBjbG9zZWQKICAgICAgICAgfQorICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjbG9zaW5nIGRiOiAiICsgbVBhdGggKyAiIChjb25uZWN0aW9uICMgIiArIG1Db25uZWN0aW9uTnVtKTsKKyAgICAgICAgfQogICAgICAgICBsb2NrKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjbG9zZUNsb3NhYmxlKCk7CisgICAgICAgICAgICAvLyBmaW5hbGl6ZSBBTEwgc3RhdGVtZW50cyBxdWV1ZWQgdXAgc28gZmFyCisgICAgICAgICAgICBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICByZWxlYXNlQ3VzdG9tRnVuY3Rpb25zKCk7CiAgICAgICAgICAgICAvLyBjbG9zZSB0aGlzIGRhdGFiYXNlIGluc3RhbmNlIC0gcmVnYXJkbGVzcyBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IHZhbHVlCi0gICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgY2xvc2VEYXRhYmFzZSgpOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUNvbm5lY3Rpb25Qb29sICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgdW5sb2NrKCk7ICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2xvc2VDbG9zYWJsZSgpIHsKLSAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgc3FsIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KKyAgICAgICAgLyogZGVhbGxvY2F0ZSBhbGwgY29tcGlsZWQgU1FMIHN0YXRlbWVudCBvYmplY3RzIGZyb20gbUNvbXBpbGVkUXVlcmllcyBjYWNoZS4KICAgICAgICAgICogdGhpcyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgZGUtcmVmZXJlbmNpbmcgYWxsIHtAbGluayBTUUxpdGVDbG9zYWJsZX0gb2JqZWN0cwogICAgICAgICAgKiBmcm9tIHRoaXMgZGF0YWJhc2Ugb2JqZWN0IGJlY2F1c2UgY2FsbGluZwogICAgICAgICAgKiB7QGxpbmsgU1FMaXRlQ2xvc2FibGUjb25BbGxSZWZlcmVuY2VzUmVsZWFzZWRGcm9tQ29udGFpbmVyKCl9IGNvdWxkIGNhdXNlIHRoZSBkYXRhYmFzZQpAQCAtOTA4LDI5ICsxMTAwLDEwNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIHBhY2thZ2UgbGV2ZWwgYWNjZXNzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIGNsb3NlRGF0YWJhc2UoKSB0aHJvd3MgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGUpICB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBtc2cuc3BsaXQoIiwiLCAyKTsKKyAgICAgICAgICAgIGludCBzdG10SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vuc1swXSk7CisgICAgICAgICAgICAvLyBnZXQgZXh0cmEgaW5mbyBhYm91dCB0aGlzIHN0YXRlbWVudCwgaWYgaXQgaXMgc3RpbGwgdG8gYmUgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpCisgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U1FMaXRlQ2xvc2FibGUsIE9iamVjdD4+IGl0ZXIgPSBtUHJvZ3JhbXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFNRTGl0ZUNsb3NhYmxlLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU1FMaXRlQ2xvc2FibGUgcHJvZ3JhbSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtICE9IG51bGwgJiYgcHJvZ3JhbSBpbnN0YW5jZW9mIFNRTGl0ZVByb2dyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsID0gKChTUUxpdGVQcm9ncmFtKXByb2dyYW0pLm1Db21waWxlZFNxbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFNxbC5uU3RhdGVtZW50ID09IHN0bXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbXBpbGVkU3FsLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGVtZW50IGlzIGFscmVhZHkgcmVsZWFzZWQgYnkgY2xvc2VDbG9zYWJsZSgpLiBpcyBpdCB3YWl0aW5nIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZmluYWxpemVkPworICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VkU3RhdGVtZW50SWRzLmNvbnRhaW5zKHN0bXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBmaW5hbGl6aW5nIHRoZSBzdGF0ZW1lbnQgbm93OiAiKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY2xvc2UgdGhlIGRhdGFiYXNlIGFnYWluCisgICAgICAgICAgICAgICAgICAgIGNsb3NlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBzdGF0ZW1lbnQgaXMgbm90IHlldCBjbG9zZWQuIG1vc3QgcHJvYmFibHkgcHJvZ3JhbW1pbmcgZXJyb3IgaW4gdGhlIGFwcC4KKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJkYmNsb3NlIGZhaWxlZCBkdWUgdG8gdW4tY2xvc2UoKWQgU1FMIHN0YXRlbWVudHM6ICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBjbG9zZSB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYmNsb3NlKCk7CiAKICAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgYSBjdXN0b20gc3FsaXRlMyBmdW5jdGlvbi4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tRnVuY3Rpb24geworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsYmFjayhTdHJpbmdbXSBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBDdXN0b21GdW5jdGlvbiBjYWxsYmFjayBhcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogc3FsaXRlMyBkYXRhYmFzZSB0cmlnZ2Vycy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3FsaXRlMyBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBudW1BcmdzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tRnVuY3Rpb24oU3RyaW5nIG5hbWUsIGludCBudW1BcmdzLCBDdXN0b21GdW5jdGlvbiBmdW5jdGlvbikgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1DdXN0b21GdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGludCByZWYgPSBuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24obmFtZSwgbnVtQXJncywgZnVuY3Rpb24pOworICAgICAgICAgICAgaWYgKHJlZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24gZm9yIGNsZWFudXAgbGF0ZXIKKyAgICAgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmFkZChuZXcgSW50ZWdlcihyZWYpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiZmFpbGVkIHRvIGFkZCBjdXN0b20gZnVuY3Rpb24gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUN1c3RvbUZ1bmN0aW9ucykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ3VzdG9tRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBmdW5jdGlvbiA9IG1DdXN0b21GdW5jdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oZnVuY3Rpb24uaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VzdG9tRnVuY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBsaXN0IG9mIEN1c3RvbUZ1bmN0aW9uIHJlZmVyZW5jZXMgc28gd2UgY2FuIGNsZWFuIHVwIHdoZW4gdGhlIGRhdGFiYXNlIGNsb3NlcworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEludGVnZXI+IG1DdXN0b21GdW5jdGlvbnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbihTdHJpbmcgbmFtZSwgaW50IG51bUFyZ3MsIEN1c3RvbUZ1bmN0aW9uIGZ1bmN0aW9uKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oaW50IGZ1bmN0aW9uKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGRhdGFiYXNlIHZlcnNpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIlBSQUdNQSB1c2VyX3ZlcnNpb247Iik7Ci0gICAgICAgICAgICBsb25nIHZlcnNpb24gPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZlcnNpb247Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gKChMb25nKSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIHVzZXJfdmVyc2lvbjsiLCBudWxsKSkuaW50VmFsdWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk0OCwyMCArMTIxNyw4IEBACiAgICAgICogQHJldHVybiB0aGUgbmV3IG1heGltdW0gZGF0YWJhc2Ugc2l6ZQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1TaXplKCkgewotICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7Ci0gICAgICAgIGxvY2soKTsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudDsiKTsKLSAgICAgICAgICAgIGxvbmcgcGFnZUNvdW50ID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBwYWdlQ291bnQgKiBnZXRQYWdlU2l6ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeSh0aGlzLCAiUFJBR01BIG1heF9wYWdlX2NvdW50OyIsIG51bGwpOworICAgICAgICByZXR1cm4gcGFnZUNvdW50ICogZ2V0UGFnZVNpemUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3MiwyNiArMTIyOSwxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5ldyBtYXhpbXVtIGRhdGFiYXNlIHNpemUKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBzZXRNYXhpbXVtU2l6ZShsb25nIG51bUJ5dGVzKSB7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOworICAgICAgICBsb25nIHBhZ2VTaXplID0gZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgbG9uZyBudW1QYWdlcyA9IG51bUJ5dGVzIC8gcGFnZVNpemU7CisgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCisgICAgICAgIGlmICgobnVtQnl0ZXMgJSBwYWdlU2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgbnVtUGFnZXMrKzsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBwYWdlU2l6ZSA9IGdldFBhZ2VTaXplKCk7Ci0gICAgICAgICAgICBsb25nIG51bVBhZ2VzID0gbnVtQnl0ZXMgLyBwYWdlU2l6ZTsKLSAgICAgICAgICAgIC8vIElmIG51bUJ5dGVzIGlzbid0IGEgbXVsdGlwbGUgb2YgcGFnZVNpemUsIGJ1bXAgdXAgYSBwYWdlCi0gICAgICAgICAgICBpZiAoKG51bUJ5dGVzICUgcGFnZVNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBudW1QYWdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZyA9IG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIlBSQUdNQSBtYXhfcGFnZV9jb3VudCA9ICIgKyBudW1QYWdlcyk7Ci0gICAgICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IHByb2cuc2ltcGxlUXVlcnlGb3JMb25nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UGFnZUNvdW50ICogcGFnZVNpemU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHJvZyAhPSBudWxsKSBwcm9nLmNsb3NlKCk7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1BhZ2VDb3VudCA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgbWF4X3BhZ2VfY291bnQgPSAiICsgbnVtUGFnZXMsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIHJldHVybiBuZXdQYWdlQ291bnQgKiBwYWdlU2l6ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDAsMjAgKzEyNDYsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGRhdGFiYXNlIHBhZ2Ugc2l6ZSwgaW4gYnl0ZXMKICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRQYWdlU2l6ZSgpIHsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHByb2cgPSBudWxsOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICJQUkFHTUEgcGFnZV9zaXplOyIpOwotICAgICAgICAgICAgbG9uZyBzaXplID0gcHJvZy5zaW1wbGVRdWVyeUZvckxvbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb2cgIT0gbnVsbCkgcHJvZy5jbG9zZSgpOwotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KHRoaXMsICJQUkFHTUEgcGFnZV9zaXplOyIsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzNCw5ICsxMjY3LDEwIEBACiAgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBtYXJrIGFzIHN5bmNhYmxlCiAgICAgICogQHBhcmFtIGRlbGV0ZWRUYWJsZSBUaGUgZGVsZXRlZCB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQogICAgICAqICAgICAgICAgIHN5bmNhYmxlIHRhYmxlCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBkZWxldGVkVGFibGUpIHsKLSAgICAgICAgbWFya1RhYmxlU3luY2FibGUodGFibGUsICJfaWQiLCB0YWJsZSwgZGVsZXRlZFRhYmxlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDksNjAgKzEyODMsMTAgQEAKICAgICAgKiBAcGFyYW0gZm9yZWlnbktleSB0aGlzIGlzIHRoZSBjb2x1bW4gaW4gdGFibGUgd2hvc2UgdmFsdWUgaXMgYW4gX2lkIGluCiAgICAgICogICAgICAgICAgdXBkYXRlVGFibGUKICAgICAgKiBAcGFyYW0gdXBkYXRlVGFibGUgdGhpcyBpcyB0aGUgdGFibGUgdGhhdCB3aWxsIGhhdmUgaXRzIF9zeW5jX2RpcnR5CisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHNlcnZlcyBhbnkgdXNlZnVsIHB1cnBvc2UgYW5kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSkgewotICAgICAgICBtYXJrVGFibGVTeW5jYWJsZSh0YWJsZSwgZm9yZWlnbktleSwgdXBkYXRlVGFibGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmsgdGhpcyB0YWJsZSBhcyBzeW5jYWJsZSwgd2l0aCB0aGUgX3N5bmNfZGlydHkgcmVzaWRpbmcgaW4gYW5vdGhlcgotICAgICAqIHRhYmxlLiBXaGVuIGFuIHVwZGF0ZSBvY2N1cnMgaW4gdGhpcyB0YWJsZSB0aGUgX3N5bmNfZGlydHkgZmllbGQgb2YgdGhlCi0gICAgICogcm93IGluIHVwZGF0ZVRhYmxlIHdpdGggdGhlIF9pZCBpbiBmb3JlaWduS2V5IHdpbGwgYmUgc2V0IHRvCi0gICAgICogZW5zdXJlIHByb3BlciBzeW5jaW5nIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSBhbiB1cGRhdGUgb24gdGhpcyB0YWJsZSB3aWxsIHRyaWdnZXIgYSBzeW5jIHRpbWUgcmVtb3ZhbAotICAgICAqIEBwYXJhbSBmb3JlaWduS2V5IHRoaXMgaXMgdGhlIGNvbHVtbiBpbiB0YWJsZSB3aG9zZSB2YWx1ZSBpcyBhbiBfaWQgaW4KLSAgICAgKiAgICAgICAgICB1cGRhdGVUYWJsZQotICAgICAqIEBwYXJhbSB1cGRhdGVUYWJsZSB0aGlzIGlzIHRoZSB0YWJsZSB0aGF0IHdpbGwgaGF2ZSBpdHMgX3N5bmNfZGlydHkKLSAgICAgKiBAcGFyYW0gZGVsZXRlZFRhYmxlIFRoZSBkZWxldGVkIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0gICAgICogICAgICAgICAgdXBkYXRlVGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbWFya1RhYmxlU3luY2FibGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgZm9yZWlnbktleSwKLSAgICAgICAgICAgIFN0cmluZyB1cGRhdGVUYWJsZSwgU3RyaW5nIGRlbGV0ZWRUYWJsZSkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUIF9zeW5jX2RpcnR5IEZST00gIiArIHVwZGF0ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBMSU1JVCAwIik7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTCgiU0VMRUNUICIgKyBmb3JlaWduS2V5ICsgIiBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICIgTElNSVQgMCIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvID0gbmV3IFN5bmNVcGRhdGVJbmZvKHVwZGF0ZVRhYmxlLCBkZWxldGVkVGFibGUsCi0gICAgICAgICAgICAgICAgZm9yZWlnbktleSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNVcGRhdGVJbmZvKSB7Ci0gICAgICAgICAgICBtU3luY1VwZGF0ZUluZm8ucHV0KHRhYmxlLCBpbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgZm9yIGVhY2ggcm93IHRoYXQgaXMgdXBkYXRlZCBpbiBhIGN1cnNvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdGhlIHJvdyBpcyBpbgotICAgICAqIEBwYXJhbSByb3dJZCB0aGUgcm93IElEIG9mIHRoZSB1cGRhdGVkIHJvdwotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByb3dVcGRhdGVkKFN0cmluZyB0YWJsZSwgbG9uZyByb3dJZCkgewotICAgICAgICBTeW5jVXBkYXRlSW5mbyBpbmZvOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jVXBkYXRlSW5mbykgewotICAgICAgICAgICAgaW5mbyA9IG1TeW5jVXBkYXRlSW5mby5nZXQodGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWNTUUwoIlVQREFURSAiICsgaW5mby5tYXN0ZXJUYWJsZQotICAgICAgICAgICAgICAgICAgICArICIgU0VUIF9zeW5jX2RpcnR5PTEgV0hFUkUgX2lkPShTRUxFQ1QgIiArIGluZm8uZm9yZWlnbktleQotICAgICAgICAgICAgICAgICAgICArICIgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIF9pZD0iICsgcm93SWQgKyAiKSIpOwotICAgICAgICB9CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBtYXJrVGFibGVTeW5jYWJsZShTdHJpbmcgdGFibGUsIFN0cmluZyBmb3JlaWduS2V5LCBTdHJpbmcgdXBkYXRlVGFibGUpIHsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzQsNiArMTMxOCw4IEBACiAgICAgICogc3RhdGVtZW50IGFuZCBmaWxsIGluIHRob3NlIHZhbHVlcyB3aXRoIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRTdHJpbmd9CiAgICAgICogYW5kIHtAbGluayBTUUxpdGVQcm9ncmFtI2JpbmRMb25nfSBlYWNoIHRpbWUgeW91IHdhbnQgdG8gcnVuIHRoZQogICAgICAqIHN0YXRlbWVudC4gU3RhdGVtZW50cyBtYXkgbm90IHJldHVybiByZXN1bHQgc2V0cyBsYXJnZXIgdGhhbiAxeDEuCisgICAgICo8cD4KKyAgICAgKiBObyB0d28gdGhyZWFkcyBzaG91bGQgYmUgdXNpbmcgdGhlIHNhbWUge0BsaW5rIFNRTGl0ZVN0YXRlbWVudH0gYXQgdGhlIHNhbWUgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBzcWwgVGhlIHJhdyBTUUwgc3RhdGVtZW50LCBtYXkgY29udGFpbiA/IGZvciB1bmtub3duIHZhbHVlcyB0byBiZQogICAgICAqICAgICAgICAgICAgYm91bmQgbGF0ZXIuCkBAIC0xMTQxLDE1ICsxMzI3LDggQEAKICAgICAgKiB7QGxpbmsgU1FMaXRlU3RhdGVtZW50fXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLwogICAgIHB1YmxpYyBTUUxpdGVTdGF0ZW1lbnQgY29tcGlsZVN0YXRlbWVudChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgc3FsLCBudWxsKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMjYsOSArMTQwNSw3IEBACiAgICAgICAgICAgICBib29sZWFuIGRpc3RpbmN0LCBTdHJpbmcgdGFibGUsIFN0cmluZ1tdIGNvbHVtbnMsCiAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgZ3JvdXBCeSwKICAgICAgICAgICAgIFN0cmluZyBoYXZpbmcsIFN0cmluZyBvcmRlckJ5LCBTdHJpbmcgbGltaXQpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBTdHJpbmcgc3FsID0gU1FMaXRlUXVlcnlCdWlsZGVyLmJ1aWxkUXVlcnlTdHJpbmcoCiAgICAgICAgICAgICAgICAgZGlzdGluY3QsIHRhYmxlLCBjb2x1bW5zLCBzZWxlY3Rpb24sIGdyb3VwQnksIGhhdmluZywgb3JkZXJCeSwgbGltaXQpOwogCkBAIC0xMzM5LDkgKzE1MTYsNyBAQAogICAgIHB1YmxpYyBDdXJzb3IgcmF3UXVlcnlXaXRoRmFjdG9yeSgKICAgICAgICAgICAgIEN1cnNvckZhY3RvcnkgY3Vyc29yRmFjdG9yeSwgU3RyaW5nIHNxbCwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywKICAgICAgICAgICAgIFN0cmluZyBlZGl0VGFibGUpIHsKLSAgICAgICAgaWYgKCFpc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2Ugbm90IG9wZW4iKTsKLSAgICAgICAgfQorICAgICAgICB2ZXJpZnlEYklzT3BlbigpOwogICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uUmVhZEZyb21EaXNrKCk7CiAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gMDsKIApAQCAtMTM0OSw3ICsxNTI0LDggQEAKICAgICAgICAgICAgIHRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAKLSAgICAgICAgU1FMaXRlQ3Vyc29yRHJpdmVyIGRyaXZlciA9IG5ldyBTUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIodGhpcywgc3FsLCBlZGl0VGFibGUpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICBTUUxpdGVDdXJzb3JEcml2ZXIgZHJpdmVyID0gbmV3IFNRTGl0ZURpcmVjdEN1cnNvckRyaXZlcihkYiwgc3FsLCBlZGl0VGFibGUpOwogCiAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMTM3NSw2ICsxNTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI8bnVsbD4iKSAgKyAiLCBjb3VudCBpcyAiICsgY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbGVhc2VEYkNvbm5lY3Rpb24oZGIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgfQpAQCAtMTUwMSw4NCArMTY3OCw0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGluc2VydFdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgU3RyaW5nIG51bGxDb2x1bW5IYWNrLAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzLCBpbnQgY29uZmxpY3RBbGdvcml0aG0pIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNZWFzdXJlbWVudHMgc2hvdyBtb3N0IHNxbCBsZW5ndGhzIDw9IDE1MgotICAgICAgICBTdHJpbmdCdWlsZGVyIHNxbCA9IG5ldyBTdHJpbmdCdWlsZGVyKDE1Mik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3FsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc3FsLmFwcGVuZCgiSU5TRVJUIik7CiAgICAgICAgIHNxbC5hcHBlbmQoQ09ORkxJQ1RfVkFMVUVTW2NvbmZsaWN0QWxnb3JpdGhtXSk7CiAgICAgICAgIHNxbC5hcHBlbmQoIiBJTlRPICIpOwogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKLSAgICAgICAgLy8gTWVhc3VyZW1lbnRzIHNob3cgbW9zdCB2YWx1ZXMgbGVuZ3RocyA8IDQwCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoNDApOworICAgICAgICBzcWwuYXBwZW5kKCcoJyk7CiAKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gbnVsbDsKLSAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCAmJiBpbml0aWFsVmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGVudHJ5U2V0ID0gaW5pdGlhbFZhbHVlcy52YWx1ZVNldCgpOwotICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotICAgICAgICAgICAgc3FsLmFwcGVuZCgnKCcpOwotCi0gICAgICAgICAgICBib29sZWFuIG5lZWRTZXBhcmF0b3IgPSBmYWxzZTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFNlcGFyYXRvcikgewotICAgICAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZWVkU2VwYXJhdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cmllc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoJz8nKTsKKyAgICAgICAgT2JqZWN0W10gYmluZEFyZ3MgPSBudWxsOworICAgICAgICBpbnQgc2l6ZSA9IChpbml0aWFsVmFsdWVzICE9IG51bGwgJiYgaW5pdGlhbFZhbHVlcy5zaXplKCkgPiAwKSA/IGluaXRpYWxWYWx1ZXMuc2l6ZSgpIDogMDsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBiaW5kQXJncyA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogaW5pdGlhbFZhbHVlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoKGkgPiAwKSA/ICIsIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgICAgIGJpbmRBcmdzW2krK10gPSBpbml0aWFsVmFsdWVzLmdldChjb2xOYW1lKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc3FsLmFwcGVuZCgnKScpOworICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFZBTFVFUyAoIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3FsLmFwcGVuZCgoaSA+IDApID8gIiw/IiA6ICI/Iik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKCIoIiArIG51bGxDb2x1bW5IYWNrICsgIikgIik7Ci0gICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKCJOVUxMIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKG51bGxDb2x1bW5IYWNrICsgIikgVkFMVUVTIChOVUxMIik7CiAgICAgICAgIH0KKyAgICAgICAgc3FsLmFwcGVuZCgnKScpOwogCi0gICAgICAgIHNxbC5hcHBlbmQoIiBWQUxVRVMoIik7Ci0gICAgICAgIHNxbC5hcHBlbmQodmFsdWVzKTsKLSAgICAgICAgc3FsLmFwcGVuZCgiKTsiKTsKLQotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwudG9TdHJpbmcoKSwgYmluZEFyZ3MpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhdGVtZW50ID0gY29tcGlsZVN0YXRlbWVudChzcWwudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgdGhlIHZhbHVlcwotICAgICAgICAgICAgaWYgKGVudHJ5U2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyaWVzSXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBwcm9ncmFtIGFuZCB0aGVuIGNsZWFudXAKLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgaW5zZXJ0ZWRSb3dJZCA9IGxhc3RJbnNlcnRSb3coKTsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZFJvd0lkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW5zZXJ0aW5nICIgKyBpbml0aWFsVmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKENvbmZpZy5MT0dEICYmIExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkluc2VydGluZyByb3cgIiArIGluc2VydGVkUm93SWQgKyAiIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbFZhbHVlcyArICIgdXNpbmcgIiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2VydGVkUm93SWQ7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVJbnNlcnQoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5MywzMiArMTcyNywxNSBAQAogICAgICAqICAgICAgICAgd2hlcmVDbGF1c2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBkZWxldGUoU3RyaW5nIHRhYmxlLCBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncykgewotICAgICAgICBCbG9ja0d1YXJkLmdldFRocmVhZFBvbGljeSgpLm9uV3JpdGVUb0Rpc2soKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gIG5ldyBTUUxpdGVTdGF0ZW1lbnQodGhpcywgIkRFTEVURSBGUk9NICIgKyB0YWJsZSArCisgICAgICAgICAgICAgICAgKCFUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZUNsYXVzZSkgPyAiIFdIRVJFICIgKyB3aGVyZUNsYXVzZSA6ICIiKSwgd2hlcmVBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoIkRFTEVURSBGUk9NICIgKyB0YWJsZQotICAgICAgICAgICAgICAgICAgICArICghVGV4dFV0aWxzLmlzRW1wdHkod2hlcmVDbGF1c2UpCi0gICAgICAgICAgICAgICAgICAgID8gIiBXSEVSRSAiICsgd2hlcmVDbGF1c2UgOiAiIikpOwotICAgICAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYmluZE9iamVjdFRvUHJvZ3JhbShzdGF0ZW1lbnQsIGkgKyAxLCB3aGVyZUFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlbWVudC5leGVjdXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdENoYW5nZUNvdW50KCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY0OSw4ICsxNzY2LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHVwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZyB0YWJsZSwgQ29udGVudFZhbHVlcyB2YWx1ZXMsCiAgICAgICAgICAgICBTdHJpbmcgd2hlcmVDbGF1c2UsIFN0cmluZ1tdIHdoZXJlQXJncywgaW50IGNvbmZsaWN0QWxnb3JpdGhtKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGludCBzZXRWYWx1ZXNTaXplID0gdmFsdWVzLnNpemUoKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHNldFZhbHVlc1NpemUgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgdmFsdWVzIik7CiAgICAgICAgIH0KIApAQCAtMTY2MCw5OCArMTc3Nyw2OCBAQAogICAgICAgICBzcWwuYXBwZW5kKHRhYmxlKTsKICAgICAgICAgc3FsLmFwcGVuZCgiIFNFVCAiKTsKIAotICAgICAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTZXQgPSB2YWx1ZXMudmFsdWVTZXQoKTsKLSAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllc0l0ZXIgPSBlbnRyeVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChlbnRyaWVzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBlbnRyaWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzcWwuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgLy8gbW92ZSBhbGwgYmluZCBhcmdzIHRvIG9uZSBhcnJheQorICAgICAgICBpbnQgYmluZEFyZ3NTaXplID0gKHdoZXJlQXJncyA9PSBudWxsKSA/IHNldFZhbHVlc1NpemUgOiAoc2V0VmFsdWVzU2l6ZSArIHdoZXJlQXJncy5sZW5ndGgpOworICAgICAgICBPYmplY3RbXSBiaW5kQXJncyA9IG5ldyBPYmplY3RbYmluZEFyZ3NTaXplXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFN0cmluZyBjb2xOYW1lIDogdmFsdWVzLmtleVNldCgpKSB7CisgICAgICAgICAgICBzcWwuYXBwZW5kKChpID4gMCkgPyAiLCIgOiAiIik7CisgICAgICAgICAgICBzcWwuYXBwZW5kKGNvbE5hbWUpOworICAgICAgICAgICAgYmluZEFyZ3NbaSsrXSA9IHZhbHVlcy5nZXQoY29sTmFtZSk7CiAgICAgICAgICAgICBzcWwuYXBwZW5kKCI9PyIpOwotICAgICAgICAgICAgaWYgKGVudHJpZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHNxbC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdoZXJlQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBzZXRWYWx1ZXNTaXplOyBpIDwgYmluZEFyZ3NTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kQXJnc1tpXSA9IHdoZXJlQXJnc1tpIC0gc2V0VmFsdWVzU2l6ZV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlQ2xhdXNlKSkgewogICAgICAgICAgICAgc3FsLmFwcGVuZCgiIFdIRVJFICIpOwogICAgICAgICAgICAgc3FsLmFwcGVuZCh3aGVyZUNsYXVzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KHRoaXMsIHNxbC50b1N0cmluZygpLCBiaW5kQXJncyk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb21waWxlU3RhdGVtZW50KHNxbC50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQmluZCB0aGUgdmFsdWVzCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IGVudHJ5U2V0LnNpemUoKTsKLSAgICAgICAgICAgIGVudHJpZXNJdGVyID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGludCBiaW5kQXJnID0gMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJpZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmJpbmRPYmplY3RUb1Byb2dyYW0oc3RhdGVtZW50LCBiaW5kQXJnLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBiaW5kQXJnKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZUFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUgPSB3aGVyZUFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC5iaW5kU3RyaW5nKGJpbmRBcmcsIHdoZXJlQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRBcmcrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJ1biB0aGUgcHJvZ3JhbSBhbmQgdGhlbiBjbGVhbnVwCi0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgaW50IG51bUNoYW5nZWRSb3dzID0gbGFzdENoYW5nZUNvdW50KCk7Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkxPR0QgJiYgTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJVcGRhdGVkICIgKyBudW1DaGFuZ2VkUm93cyArICIgdXNpbmcgIiArIHZhbHVlcyArICIgYW5kICIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bUNoYW5nZWRSb3dzOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC5leGVjdXRlVXBkYXRlRGVsZXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBvbkNvcnJ1cHRpb24oKTsKICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciB1cGRhdGluZyAiICsgdmFsdWVzICsgIiB1c2luZyAiICsgc3FsKTsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgc3RhdGVtZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBub3QgYSBxdWVyeS4gRm9yIGV4YW1wbGUsIENSRUFURQotICAgICAqIFRBQkxFLCBERUxFVEUsIElOU0VSVCwgZXRjLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSA7cyBhcmUgbm90Ci0gICAgICogc3VwcG9ydGVkLiBpdCB0YWtlcyBhIHdyaXRlIGxvY2sKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QKKyAgICAgKiBvciBhbnkgb3RoZXIgU1FMIHN0YXRlbWVudCB0aGF0IHJldHVybnMgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBoYXMgbm8gbWVhbnMgdG8gcmV0dXJuIGFueSBkYXRhIChzdWNoIGFzIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cykuCisgICAgICogSW5zdGVhZCwgeW91J3JlIGVuY291cmFnZWQgdG8gdXNlIHtAbGluayAjaW5zZXJ0KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX0sCisgICAgICoge0BsaW5rICN1cGRhdGUoU3RyaW5nLCBDb250ZW50VmFsdWVzLCBTdHJpbmcsIFN0cmluZ1tdKX0sIGV0IGFsLCB3aGVuIHBvc3NpYmxlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVzaW5nIHtAbGluayAjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0sIGpvdXJuYWxfbW9kZSBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgbWFuYWdlZCBieSB0aGlzIGNsYXNzLiBTbywgZG8gbm90IHNldCBqb3VybmFsX21vZGUKKyAgICAgKiB1c2luZyAiUFJBR01BIGpvdXJuYWxfbW9kZSc8dmFsdWU+IiBzdGF0ZW1lbnQgaWYgeW91ciBhcHAgaXMgdXNpbmcKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9CisgICAgICogPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIHNxbCB0aGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZC4gTXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyBhcmUKKyAgICAgKiBub3Qgc3VwcG9ydGVkLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7CisgICAgICAgIGludCBzdG10VHlwZSA9IERhdGFiYXNlVXRpbHMuZ2V0U3FsU3RhdGVtZW50VHlwZShzcWwpOworICAgICAgICBpZiAoc3RtdFR5cGUgPT0gRGF0YWJhc2VVdGlscy5TVEFURU1FTlRfQVRUQUNIKSB7CisgICAgICAgICAgICBkaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQogICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGlmICghaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlIG5vdCBvcGVuIik7Ci0gICAgICAgIH0KICAgICAgICAgbG9nVGltZVN0YXQobUxhc3RTcWxTdGF0ZW1lbnQsIHRpbWVTdGFydCwgR0VUX0xPQ0tfTE9HX1BSRUZJWCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfZXhlY1NRTChzcWwpOwotICAgICAgICB9IGNhdGNoIChTUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25Db3JydXB0aW9uKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZVNxbChzcWwsIG51bGwpOwogCiAgICAgICAgIC8vIExvZyBjb21taXQgc3RhdGVtZW50cyBhbG9uZyB3aXRoIHRoZSBtb3N0IHJlY2VudGx5IGV4ZWN1dGVkCi0gICAgICAgIC8vIFNRTCBzdGF0ZW1lbnQgZm9yIGRpc2FtYmlndWF0aW9uLiAgTm90ZSB0aGF0IGluc3RhbmNlCi0gICAgICAgIC8vIGVxdWFsaXR5IHRvIENPTU1JVF9TUUwgaXMgc2FmZSBoZXJlLgotICAgICAgICBpZiAoc3FsID09IENPTU1JVF9TUUwpIHsKKyAgICAgICAgLy8gU1FMIHN0YXRlbWVudCBmb3IgZGlzYW1iaWd1YXRpb24uCisgICAgICAgIGlmIChzdG10VHlwZSA9PSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9DT01NSVQpIHsKICAgICAgICAgICAgIGxvZ1RpbWVTdGF0KG1MYXN0U3FsU3RhdGVtZW50LCB0aW1lU3RhcnQsIENPTU1JVF9TUUwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9nVGltZVN0YXQoc3FsLCB0aW1lU3RhcnQsIG51bGwpOwpAQCAtMTc1OSw2NSArMTg0Niw5OCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudCB0aGF0IGlzIG5vdCBhIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgQ1JFQVRFCi0gICAgICogVEFCTEUsIERFTEVURSwgSU5TRVJULCBldGMuIE11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IDtzIGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQuIGl0IHRha2VzIGEgd3JpdGUgbG9jaywKKyAgICAgKiBFeGVjdXRlIGEgc2luZ2xlIFNRTCBzdGF0ZW1lbnQgdGhhdCBpcyBOT1QgYSBTRUxFQ1QvSU5TRVJUL1VQREFURS9ERUxFVEUuCisgICAgICogPHA+CisgICAgICogRm9yIElOU0VSVCBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnQoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNpbnNlcnRPclRocm93KFN0cmluZywgU3RyaW5nLCBDb250ZW50VmFsdWVzKX08L2xpPgorICAgICAqICAgPGxpPntAbGluayAjaW5zZXJ0V2l0aE9uQ29uZmxpY3QoU3RyaW5nLCBTdHJpbmcsIENvbnRlbnRWYWx1ZXMsIGludCl9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIEZvciBVUERBVEUgc3RhdGVtZW50cywgdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIGluc3RlYWQuCisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayAjdXBkYXRlKFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI3VwZGF0ZVdpdGhPbkNvbmZsaWN0KFN0cmluZywgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSwgaW50KX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIERFTEVURSBzdGF0ZW1lbnRzLCB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNkZWxldGUoU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJlIGdvb2QgY2FuZGlkYXRlcyBmb3IgdXNpbmcgdGhpcyBtZXRob2Q6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFMVEVSIFRBQkxFPC9saT4KKyAgICAgKiAgIDxsaT5DUkVBVEUgb3IgRFJPUCB0YWJsZSAvIHRyaWdnZXIgLyB2aWV3IC8gaW5kZXggLyB2aXJ0dWFsIHRhYmxlPC9saT4KKyAgICAgKiAgIDxsaT5SRUlOREVYPC9saT4KKyAgICAgKiAgIDxsaT5SRUxFQVNFPC9saT4KKyAgICAgKiAgIDxsaT5TQVZFUE9JTlQ8L2xpPgorICAgICAqICAgPGxpPlBSQUdNQSB0aGF0IHJldHVybnMgbm8gZGF0YTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogV2hlbiB1c2luZyB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LCBqb3VybmFsX21vZGUgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhpcyBjbGFzcy4gU28sIGRvIG5vdCBzZXQgam91cm5hbF9tb2RlCisgICAgICogdXNpbmcgIlBSQUdNQSBqb3VybmFsX21vZGUnPHZhbHVlPiIgc3RhdGVtZW50IGlmIHlvdXIgYXBwIGlzIHVzaW5nCisgICAgICoge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfQorICAgICAqIDwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBzcWwKKyAgICAgKiBAcGFyYW0gc3FsIHRoZSBTUUwgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkLiBNdWx0aXBsZSBzdGF0ZW1lbnRzIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIGFyZQorICAgICAqIG5vdCBzdXBwb3J0ZWQuCiAgICAgICogQHBhcmFtIGJpbmRBcmdzIG9ubHkgYnl0ZVtdLCBTdHJpbmcsIExvbmcgYW5kIERvdWJsZSBhcmUgc3VwcG9ydGVkIGluIGJpbmRBcmdzLgogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIElmIHRoZSBTUUwgc3RyaW5nIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY1NRTChTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOwogICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW1wdHkgYmluZEFyZ3MiKTsKICAgICAgICAgfQorICAgICAgICBleGVjdXRlU3FsKHNxbCwgYmluZEFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlU3FsKFN0cmluZyBzcWwsIE9iamVjdFtdIGJpbmRBcmdzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9jaygpOwotICAgICAgICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSBub3Qgb3BlbiIpOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCh0aGlzLCBzcWwsIGJpbmRBcmdzKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKLSAgICAgICAgICAgIGlmIChiaW5kQXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bUFyZ3MgPSBiaW5kQXJncy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5iaW5kT2JqZWN0VG9Qcm9ncmFtKHN0YXRlbWVudCwgaSArIDEsIGJpbmRBcmdzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGVEZWxldGUoKTsKICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRGF0YWJhc2VDb3JydXB0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBsb2dUaW1lU3RhdChzcWwsIHRpbWVTdGFydCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7Ci0gICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiY2xvc2UoKSB3YXMgbmV2ZXIgZXhwbGljaXRseSBjYWxsZWQgb24gZGF0YWJhc2UgJyIgKwotICAgICAgICAgICAgICAgICAgICBtUGF0aCArICInICIsIG1TdGFja1RyYWNlKTsKLSAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKLSAgICAgICAgICAgIG9uQWxsUmVmZXJlbmNlc1JlbGVhc2VkKCk7CisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImNsb3NlKCkgd2FzIG5ldmVyIGV4cGxpY2l0bHkgY2FsbGVkIG9uIGRhdGFiYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRoICsgIicgIiwgbVN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIGNsb3NlQ2xvc2FibGUoKTsKKyAgICAgICAgICAgICAgICBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2VDdXN0b21GdW5jdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLiBTZWUge0BsaW5rICNjcmVhdGV9IGFuZCB7QGxpbmsgI29wZW5EYXRhYmFzZX0uCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCiAgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgdG8gdXNlIHdoZW4gY3JlYXRpbmcgY3Vyc29ycywgbWF5IGJlIE5VTEwuCiAgICAgICogQHBhcmFtIGZsYWdzIDAgb3Ige0BsaW5rICNOT19MT0NBTElaRURfQ09MTEFUT1JTfS4gIElmIHRoZSBkYXRhYmFzZSBmaWxlIGFscmVhZHkKICAgICAgKiAgICAgICAgICAgICAgZXhpc3RzLCBtRmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciBUaGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLiBtYXkgYmUgTlVMTC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSAwIGZvciBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlLiAxLi5OIGZvciBwb29sZWQgZGF0YWJhc2UKKyAgICAgKiBjb25uZWN0aW9uIGhhbmRsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZShTdHJpbmcgcGF0aCwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgZmxhZ3MpIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlKFN0cmluZyBwYXRoLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCBmbGFncywKKyAgICAgICAgICAgIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciwgc2hvcnQgY29ubmVjdGlvbk51bSkgewogICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXRoIHNob3VsZCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9CkBAIC0xODI2LDI1ICsxOTQ2LDExIEBACiAgICAgICAgIG1TbG93UXVlcnlUaHJlc2hvbGQgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludChMT0dfU0xPV19RVUVSSUVTX1BST1BFUlRZLCAtMSk7CiAgICAgICAgIG1TdGFja1RyYWNlID0gbmV3IERhdGFiYXNlT2JqZWN0Tm90Q2xvc2VkRXhjZXB0aW9uKCkuZmlsbEluU3RhY2tUcmFjZSgpOwogICAgICAgICBtRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGRib3BlbihtUGF0aCwgbUZsYWdzKTsKLSAgICAgICAgaWYgKFNRTGl0ZURlYnVnLkRFQlVHX1NRTF9DQUNIRSkgewotICAgICAgICAgICAgbVRpbWVPcGVuZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgIH0KICAgICAgICAgbVByb2dyYW1zID0gbmV3IFdlYWtIYXNoTWFwPFNRTGl0ZUNsb3NhYmxlLE9iamVjdD4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldExvY2FsZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc2V0TG9jYWxlKCkgd2hlbiBjb25zdHJ1Y3RpbmcsIGNsb3NpbmcgdGhlIGRhdGFiYXNlIiwgZSk7Ci0gICAgICAgICAgICBkYmNsb3NlKCk7Ci0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVDbG9zZWQgPSBnZXRUaW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyAiKS5mb3JtYXQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAvLyBTZXQgdGhlIERhdGFiYXNlRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgd2hlbiBTUUxpdGUgcmVwb3J0cyBjb3JydXB0aW9uLgorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIHNldHMgZXJyb3JIYW5kbGVyID0gbnVsbCwgdGhlbiB1c2UgZGVmYXVsdCBlcnJvcmhhbmRsZXIuCisgICAgICAgIG1FcnJvckhhbmRsZXIgPSAoZXJyb3JIYW5kbGVyID09IG51bGwpID8gbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIDogZXJyb3JIYW5kbGVyOworICAgICAgICBtQ29ubmVjdGlvbk51bSA9IGNvbm5lY3Rpb25OdW07CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTAxLDcgKzIwMDcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdXJhdGlvbk1pbGxpcyA+PSBzUXVlcnlMb2dUaW1lSW5NaWxsaXMpIHsKICAgICAgICAgICAgIHNhbXBsZVBlcmNlbnQgPSAxMDA7Ci0gICAgICAgIH0gZWxzZSB7OworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2FtcGxlUGVyY2VudCA9IChpbnQpICgxMDAgKiBkdXJhdGlvbk1pbGxpcyAvIHNRdWVyeUxvZ1RpbWVJbk1pbGxpcykgKyAxOwogICAgICAgICAgICAgaWYgKG1SYW5kb20ubmV4dEludCgxMDApID49IHNhbXBsZVBlcmNlbnQpIHJldHVybjsKICAgICAgICAgfQpAQCAtMTk3MCw2ICsyMDc2LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgdmVyaWZ5RGJJc09wZW4oKSB7CisgICAgICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBnZXRQYXRoKCkgKyAiIChjb25uIyAiICsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25OdW0gKyAiKSBhbHJlYWR5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHZlcmlmeUxvY2tPd25lcigpIHsKKyAgICAgICAgdmVyaWZ5RGJJc09wZW4oKTsKKyAgICAgICAgaWYgKG1Mb2NraW5nRW5hYmxlZCAmJiAhaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEb24ndCBoYXZlIGRhdGFiYXNlIGxvY2shIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKgogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKgpAQCAtMTk3Nyw1OSArMjA5Nyw0NSBAQAogICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgKi8KICAgICAvKioKLSAgICAgKiBhZGRzIHRoZSBnaXZlbiBzcWwgYW5kIGl0cyBjb21waWxlZC1zdGF0ZW1lbnQtaWQtcmV0dXJuZWQtYnktc3FsaXRlIHRvIHRoZQorICAgICAqIEFkZHMgdGhlIGdpdmVuIFNRTCBhbmQgaXRzIGNvbXBpbGVkLXN0YXRlbWVudC1pZC1yZXR1cm5lZC1ieS1zcWxpdGUgdG8gdGhlCiAgICAgICogY2FjaGUgb2YgY29tcGlsZWRRdWVyaWVzIGF0dGFjaGVkIHRvICd0aGlzJy4KLSAgICAgKgotICAgICAqIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IGluIGNvbXBpbGVkUXVlcmllcyBmb3IgdGhlIGdpdmVuIHNxbCwKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEge0BsaW5rIFNRTGl0ZUNvbXBpbGVkU3FsfSBpbiBjb21waWxlZFF1ZXJpZXMgZm9yIHRoZSBnaXZlbiBTUUwsCiAgICAgICogdGhlIG5ldyB7QGxpbmsgU1FMaXRlQ29tcGlsZWRTcWx9IG9iamVjdCBpcyBOT1QgaW5zZXJ0ZWQgaW50byB0aGUgY2FjaGUgKGkuZS4sdGhlIGN1cnJlbnQKICAgICAgKiBtYXBwaW5nIGlzIE5PVCByZXBsYWNlZCB3aXRoIHRoZSBuZXcgbWFwcGluZykuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGFkZFRvQ29tcGlsZWRRdWVyaWVzKFN0cmluZyBzcWwsIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChtTWF4U3FsQ2FjaGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIGZvciB0aGlzIGRhdGFiYXNlLCB0aGVyZSBpcyBubyBjYWNoZSBvZiBjb21waWxlZCBzcWwuCi0gICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifE5PVCBhZGRpbmdfc3FsX3RvX2NhY2hlfCIgKyBnZXRQYXRoKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcGlsZWRTcWwgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQobUNvbXBpbGVkUXVlcmllcykgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IHRoZSBuZXcgbWFwcGluZyBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgIGNvbXBpbGVkU3FsID0gbUNvbXBpbGVkUXVlcmllcy5nZXQoc3FsKTsKLSAgICAgICAgICAgIGlmIChjb21waWxlZFNxbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWRkIHRoaXMgPHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQ+IHRvIHRoZSBjYWNoZQorCiAgICAgICAgICAgICBpZiAobUNvbXBpbGVkUXVlcmllcy5zaXplKCkgPT0gbU1heFNxbENhY2hlU2l6ZSkgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogY2FjaGUgc2l6ZSBvZiB7QGxpbmsgI21NYXhTcWxDYWNoZVNpemV9IGlzIG5vdCBlbm91Z2ggZm9yIHRoaXMgYXBwLgotICAgICAgICAgICAgICAgICAqIGxvZyBhIHdhcm5pbmcgTUFYX1dBUk5JTkdTX09OX0NBQ0hFU0laRV9DT05ESVRJT04gdGltZXMKLSAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBzbyBjYWNoaW5nIGlzIHVzZWxlc3MuCi0gICAgICAgICAgICAgICAgICogVE9ETzogZWl0aGVyIGxldCB0aGUgY2FsbGVycyBzZXQgbWF4IGNjaGVzaXplIGZvciB0aGVpciBhcHAsIG9yIGludGVsbGlnZW50bHkKLSAgICAgICAgICAgICAgICAgKiBmaWd1cmUgb3V0IHdoYXQgc2hvdWxkIGJlIGNhY2hlZCBmb3IgYSBnaXZlbiBhcHAuCisgICAgICAgICAgICAgICAgICogbG9nIGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgKiBjaGFuY2VzIGFyZSBpdCBpcyBOT1QgdXNpbmcgPyBmb3IgYmluZGFyZ3MgLSBvciBjYWNoZXNpemUgaXMgdG9vIHNtYWxsLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmICgrK21DYWNoZUZ1bGxXYXJuaW5ncyA9PSBNQVhfV0FSTklOR1NfT05fQ0FDSEVTSVpFX0NPTkRJVElPTikgewogICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJSZWFjaGVkIE1BWCBzaXplIGZvciBjb21waWxlZC1zcWwgc3RhdGVtZW50IGNhY2hlIGZvciBkYXRhYmFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiOyBpLmUuLCBOTyBzcGFjZSBmb3IgdGhpcyBzcWwgc3RhdGVtZW50IGluIGNhY2hlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWwgKyAiLiBQbGVhc2UgY2hhbmdlIHlvdXIgc3FsIHN0YXRlbWVudHMgdG8gdXNlICc/JyBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpbmRhcmdzLCBpbnN0ZWFkIG9mIHVzaW5nIGFjdHVhbCB2YWx1ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAiLiBVc2Ugc2V0TWF4U3FsQ2FjaGVTaXplKCkgdG8gaW5jcmVhc2UgY2FjaGVzaXplLiAiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWRkIHRoaXMgZW50cnkgdG8gY2FjaGUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FjaGUgaXMgTk9UIGZ1bGwuIGFkZCB0aGlzIHRvIGNhY2hlLgotICAgICAgICAgICAgICAgIG1Db21waWxlZFF1ZXJpZXMucHV0KHNxbCwgY29tcGlsZWRTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5zaXplKCkgKyAifCIgKyBzcWwpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBhZGQgdGhlIGdpdmVuIFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3RhdGVtZW50IHRvIGNhY2hlLgorICAgICAgICAgICAgICogbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgY2FjaGUgc2l6ZSAtIGJlY2F1c2Uge0BsaW5rICNtQ29tcGlsZWRRdWVyaWVzfQorICAgICAgICAgICAgICogc2VsZi1saW1pdHMgaXRzIHNpemUgdG8ge0BsaW5rICNtTWF4U3FsQ2FjaGVTaXplfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbUNvbXBpbGVkUXVlcmllcy5wdXQoc3FsLCBjb21waWxlZFN0YXRlbWVudCk7CisgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7CisgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAifGFkZGluZ19zcWxfdG9fY2FjaGV8IiArIGdldFBhdGgoKSArICJ8IiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArICJ8IiArIHNxbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAotCi0gICAgcHJpdmF0ZSB2b2lkIGRlYWxsb2NDYWNoZWRTcWxTdGF0ZW1lbnRzKCkgeworICAgIC8qKiBwYWNrYWdlLWxldmVsIGFjY2VzcyBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkZWFsbG9jQ2FjaGVkU3FsU3RhdGVtZW50cygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQ29tcGlsZWRRdWVyaWVzKSB7CiAgICAgICAgICAgICBmb3IgKFNRTGl0ZUNvbXBpbGVkU3FsIGNvbXBpbGVkU3FsIDogbUNvbXBpbGVkUXVlcmllcy52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIGNvbXBpbGVkU3FsLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKQEAgLTIwMzksMjAgKzIxNDUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBmcm9tIHRoZSBjb21waWxlZFF1ZXJpZXMgY2FjaGUsIHJldHVybnMgdGhlIGNvbXBpbGVkLXN0YXRlbWVudC1pZCBmb3IgdGhlIGdpdmVuIHNxbC4KLSAgICAgKiByZXR1cm5zIG51bGwsIGlmIG5vdCBmb3VuZCBpbiB0aGUgY2FjaGUuCisgICAgICogRnJvbSB0aGUgY29tcGlsZWRRdWVyaWVzIGNhY2hlLCByZXR1cm5zIHRoZSBjb21waWxlZC1zdGF0ZW1lbnQtaWQgZm9yIHRoZSBnaXZlbiBTUUwuCisgICAgICogUmV0dXJucyBudWxsLCBpZiBub3QgZm91bmQgaW4gdGhlIGNhY2hlLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwgZ2V0Q29tcGlsZWRTdGF0ZW1lbnRGb3JTcWwoU3RyaW5nIHNxbCkgewogICAgICAgICBTUUxpdGVDb21waWxlZFNxbCBjb21waWxlZFN0YXRlbWVudCA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gY2FjaGVIaXQ7CiAgICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBpZiAobU1heFNxbENhY2hlU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgZGF0YWJhc2UsIHRoZXJlIGlzIG5vIGNhY2hlIG9mIGNvbXBpbGVkIHNxbC4KLSAgICAgICAgICAgICAgICBpZiAoU1FMaXRlRGVidWcuREVCVUdfU1FMX0NBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgInxjYWNoZSBOT1QgZm91bmR8IiArIGdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FjaGVIaXQgPSAoY29tcGlsZWRTdGF0ZW1lbnQgPSBtQ29tcGlsZWRRdWVyaWVzLmdldChzcWwpKSAhPSBudWxsOwogICAgICAgICB9CiAgICAgICAgIGlmIChjYWNoZUhpdCkgewpAQCAtMjA2NSw2MyArMjE2NCwyNCBAQAogICAgICAgICAgICAgTG9nLnYoVEFHLCAifGNhY2hlX3N0YXRzfCIgKwogICAgICAgICAgICAgICAgICAgICBnZXRQYXRoKCkgKyAifCIgKyBtQ29tcGlsZWRRdWVyaWVzLnNpemUoKSArCiAgICAgICAgICAgICAgICAgICAgICJ8IiArIG1OdW1DYWNoZUhpdHMgKyAifCIgKyBtTnVtQ2FjaGVNaXNzZXMgKwotICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIG1UaW1lT3BlbmVkICsgInwiICsgbVRpbWVDbG9zZWQgKyAifCIgKyBzcWwpOworICAgICAgICAgICAgICAgICAgICAifCIgKyBjYWNoZUhpdCArICJ8IiArIHNxbCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvbXBpbGVkU3RhdGVtZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3FsIGlzIGNhY2hlZCBpbiBjb21waWxlZC1zcWwgY2FjaGUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBpbGVkUXVlcmllcy5jb250YWluc0tleShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHVyZ2VzIHRoZSBnaXZlbiBzcWwgZnJvbSB0aGUgY29tcGlsZWQtc3FsIGNhY2hlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVyZ2VGcm9tQ29tcGlsZWRTcWxDYWNoZShTdHJpbmcgc3FsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLnJlbW92ZShzcWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY29tcGlsZWQgc3FsIGNhY2hlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbXBpbGVkU3FsQ2FjaGUoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ29tcGlsZWRRdWVyaWVzKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRRdWVyaWVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGN1cnJlbnQgbWF4Q2FjaGVTcWxDYWNoZVNpemUKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1heFNxbENhY2hlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhTcWxDYWNoZVNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHRoZSBtYXggc2l6ZSBvZiB0aGUgY29tcGlsZWQgc3FsIGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlIGFmdGVyIHB1cmdpbmcgdGhlIGNhY2hlLgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgcHJlcGFyZWQtc3RhdGVtZW50IGNhY2hlIGZvciB0aGlzIGRhdGFiYXNlLgogICAgICAqIChzaXplIG9mIHRoZSBjYWNoZSA9IG51bWJlciBvZiBjb21waWxlZC1zcWwtc3RhdGVtZW50cyBzdG9yZWQgaW4gdGhlIGNhY2hlKS4KKyAgICAgKjxwPgorICAgICAqIE1heGltdW0gY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMTApLgorICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHNtYWxsZXIgc2l6ZSB0aGFuIHRoZSBjdXJyZW50IG1heGltdW0gdmFsdWUsCisgICAgICogdGhlbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCiAgICAgICoKLSAgICAgKiBtYXggY2FjaGUgc2l6ZSBjYW4gT05MWSBiZSBpbmNyZWFzZWQgZnJvbSBpdHMgY3VycmVudCBzaXplIChkZWZhdWx0ID0gMCkuCi0gICAgICogaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggc21hbGxlciBzaXplIHRoYW4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgbU1heFNxbENhY2hlU2l6ZSwKLSAgICAgKiB0aGVuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKgotICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdCB0aHJlYWRzIHRvIGNoYW5nZSBjYWNoZSBzaXplIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgICogQHBhcmFtIGNhY2hlU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUuIGNhbiBiZSAoMCB0byBNQVhfU1FMX0NBQ0hFX1NJWkUpCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW5wdXQgY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIG9yIDwgMCBvcgotICAgICAqIDwgdGhlIHZhbHVlIHNldCB3aXRoIHByZXZpb3VzIHNldE1heFNxbENhY2hlU2l6ZSgpIGNhbGwuCi0gICAgICoKLSAgICAgKiBAaGlkZQorICAgICAqIEBwYXJhbSBjYWNoZVNpemUgdGhlIHNpemUgb2YgdGhlIGNhY2hlLiBjYW4gYmUgKDAgdG8ge0BsaW5rICNNQVhfU1FMX0NBQ0hFX1NJWkV9KQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlucHV0IGNhY2hlU2l6ZSA+IHtAbGluayAjTUFYX1NRTF9DQUNIRV9TSVpFfSBvcgorICAgICAqIHRoZSB2YWx1ZSBzZXQgd2l0aCBwcmV2aW91cyBzZXRNYXhTcWxDYWNoZVNpemUoKSBjYWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhTcWxDYWNoZVNpemUoaW50IGNhY2hlU2l6ZSkgewogICAgICAgICBpZiAoY2FjaGVTaXplID4gTUFYX1NRTF9DQUNIRV9TSVpFIHx8IGNhY2hlU2l6ZSA8IDApIHsKQEAgLTIxMzMsNjAgKzIxOTMsMzA2IEBACiAgICAgICAgIG1NYXhTcWxDYWNoZVNpemUgPSBjYWNoZVNpemU7CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2ZURhdGFiYXNlcyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFjdGl2ZURhdGFiYXNlcyBhY3RpdmVEYXRhYmFzZXMgPSBuZXcgQWN0aXZlRGF0YWJhc2VzKCk7Ci0gICAgICAgIHByaXZhdGUgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4gbUFjdGl2ZURhdGFiYXNlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaFNldDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4oKTsKLSAgICAgICAgcHJpdmF0ZSBBY3RpdmVEYXRhYmFzZXMoKSB7fSAvLyBkaXNhYmxlIGluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcwotICAgICAgICBzdGF0aWMgQWN0aXZlRGF0YWJhc2VzIGdldEluc3RhbmNlKCkge3JldHVybiBhY3RpdmVEYXRhYmFzZXM7fQorICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1NxbEluU3RhdGVtZW50Q2FjaGUoU3RyaW5nIHNxbCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Db21waWxlZFF1ZXJpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcGlsZWRRdWVyaWVzLmNvbnRhaW5zS2V5KHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgZmluYWxpemVTdGF0ZW1lbnRMYXRlcihpbnQgaWQpIHsKKyAgICAgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgICAgICAgLy8gZGF0YWJhc2UgYWxyZWFkeSBjbG9zZWQuIHRoaXMgc3RhdGVtZW50IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZmluYWxpemVkLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZChtQ2xvc2VkU3RhdGVtZW50SWRzKSB7CisgICAgICAgICAgICBpZiAobUNsb3NlZFN0YXRlbWVudElkcy5jb250YWlucyhpZCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YXRlbWVudCBpZCBpcyBhbHJlYWR5IHF1ZXVlZCB1cCBmb3IgZmluYWxpemF0aW9uLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zZWRTdGF0ZW1lbnRJZHMuYWRkKGlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBjbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGRhdGFiYXNlIGlzIGFscmVhZHkgY2xvc2VkLCBubyBuZWVkIHRvIGZpbmFsaXplIGFueXRoaW5nLgorICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHZlcmlmeUxvY2tPd25lcigpOworICAgICAgICAvKiB0byBtaW5pbWl6ZSBzeW5jaHJvbml6YXRpb24gb24gbUNsb3NlZFN0YXRlbWVudElkcywgbWFrZSBhIGNvcHkgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KG1DbG9zZWRTdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKyAgICAgICAgc3luY2hyb25pemVkKG1DbG9zZWRTdGF0ZW1lbnRJZHMpIHsKKyAgICAgICAgICAgIGxpc3QuYWRkQWxsKG1DbG9zZWRTdGF0ZW1lbnRJZHMpOworICAgICAgICAgICAgbUNsb3NlZFN0YXRlbWVudElkcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIC8vIGZpbmFsaXplIGFsbCB0aGUgc3RhdGVtZW50cyBmcm9tIHRoZSBjb3BpZWQgbGlzdAorICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKGxpc3QuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGZvciB0ZXN0aW5nIG9ubHkKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEFycmF5TGlzdDxJbnRlZ2VyPiBnZXRRdWV1ZWRVcFN0bXRMaXN0KCkgeworICAgICAgICByZXR1cm4gbUNsb3NlZFN0YXRlbWVudElkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBlbmFibGVzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBxdWVyaWVzIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKiBJdCBkb2VzIHRoaXMgYnkgb3BlbmluZyBtdWx0aXBsZSBoYW5kbGVzIHRvIHRoZSBkYXRhYmFzZSBhbmQgdXNpbmcgYSBkaWZmZXJlbnQKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgZm9yIGVhY2ggcXVlcnkuCisgICAgICogPHA+CisgICAgICogSWYgYSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcyBvbiBvbmUgY29ubmVjdGlvbiBoYW5kbGUgYW5kIHNheSwgYSB0YWJsZSBpcyB1cGRhdGVkIGluIHRoZQorICAgICAqIHRyYW5zYWN0aW9uLCB0aGVuIHF1ZXJ5IG9uIHRoZSBzYW1lIHRhYmxlIG9uIGFub3RoZXIgY29ubmVjdGlvbiBoYW5kbGUgd2lsbCBibG9jayBmb3IgdGhlCisgICAgICogdHJhbnNhY3Rpb24gdG8gY29tcGxldGUuIEJ1dCB0aGlzIG1ldGhvZCBlbmFibGVzIHN1Y2ggcXVlcmllcyB0byBleGVjdXRlIGJ5IGhhdmluZyB0aGVtCisgICAgICogcmV0dXJuIG9sZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIGZyb20gdGhlIHRhYmxlLiBNb3N0IG9mdGVuIGl0IGlzIHRoZSBkYXRhIHRoYXQgZXhpc3RlZCBpbiB0aGUKKyAgICAgKiB0YWJsZSBwcmlvciB0byB0aGUgYWJvdmUgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiB0aGF0IHRhYmxlLgorICAgICAqIDxwPgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBoYW5kbGVzIHVzZWQgdG8gZXhlY3V0ZSBxdWVyaWVzIGluIHBhcmFsbGVsIGlzCisgICAgICogZGVwZW5kZW50IHVwb24gdGhlIGRldmljZSBtZW1vcnkgYW5kIHBvc3NpYmx5IG90aGVyIHByb3BlcnRpZXMuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgZXhlY3V0aW9uIG9mIHF1ZXJpZXMgaW4gcGFyYWxsZWwgaXMgZW5hYmxlZCBhcyBsb25nIGFzIHRoaXMKKyAgICAgKiBkYXRhYmFzZSBoYW5kbGUgaXMgb3Blbi4gVG8gZGlzYWJsZSBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGxlbCwgZGF0YWJhc2Ugc2hvdWxkCisgICAgICogYmUgY2xvc2VkIGFuZCByZW9wZW5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHF1ZXJ5IGlzIHBhcnQgb2YgYSB0cmFuc2FjdGlvbiwgdGhlbiBpdCBpcyBleGVjdXRlZCBvbiB0aGUgc2FtZSBkYXRhYmFzZSBoYW5kbGUgdGhlCisgICAgICogdHJhbnNhY3Rpb24gd2FzIGJlZ3VuLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBkYXRhYmFzZSBoYXMgYW55IGF0dGFjaGVkIGRhdGFiYXNlcywgdGhlbiBleGVjdXRpb24gb2YgcXVlcmllcyBpbiBwYXJhbGVsIGlzIE5PVAorICAgICAqIHBvc3NpYmxlLiBJbiBzdWNoIGNhc2VzLCBhIG1lc3NhZ2UgaXMgcHJpbnRlZCB0byBsb2djYXQgYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGZvciA6bWVtb3J5OiBkYXRhYmFzZXMuIEluIHN1Y2ggY2FzZXMsCisgICAgICogYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gbG9nY2F0IGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHR5cGljYWwgd2F5IHRvIHVzZSB0aGlzIG1ldGhvZCBpcyB0aGUgZm9sbG93aW5nOgorICAgICAqIDxwcmU+CisgICAgICogICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gU1FMaXRlRGF0YWJhc2Uub3BlbkRhdGFiYXNlKCJkYl9maWxlbmFtZSIsIGN1cnNvckZhY3RvcnksCisgICAgICogICAgICAgICAgICAgQ1JFQVRFX0lGX05FQ0VTU0FSWSwgbXlEYXRhYmFzZUVycm9ySGFuZGxlcik7CisgICAgICogICAgIGRiLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogV3JpdGVycyBzaG91bGQgdXNlIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpfSBvcgorICAgICAqIHtAbGluayAjYmVnaW5UcmFuc2FjdGlvbldpdGhMaXN0ZW5lck5vbkV4Y2x1c2l2ZShTUUxpdGVUcmFuc2FjdGlvbkxpc3RlbmVyKX0KKyAgICAgKiB0byBzdGFydCBhIHRyc25zYWN0aW9uLgorICAgICAqIE5vbi1leGNsdXNpdmUgbW9kZSBhbGxvd3MgZGF0YWJhc2UgZmlsZSB0byBiZSBpbiByZWFkYWJsZSBieSB0aHJlYWRzIGV4ZWN1dGluZyBxdWVyaWVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3cml0ZS1haGVhZC1sb2dnaW5nIGlzIHNldC4gZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBpZiAobVBhdGguZXF1YWxzSWdub3JlQ2FzZShNRU1PUllfREJfUEFUSCkpIHsKKyAgICAgICAgICAgIExvZy5pKFRBRywgImNhbid0IGVuYWJsZSBXQUwgZm9yIG1lbW9yeSBkYXRhYmFzZXMuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBkYXRhYmFzZSBoYXMgTk8gYXR0YWNoZWQgZGF0YWJhc2VzIGJlY2F1c2Ugc3FsaXRlJ3Mgd3JpdGUtYWhlYWQtbG9nZ2luZworICAgICAgICAvLyBkb2Vzbid0IHdvcmsgZm9yIGRhdGFiYXNlcyB3aXRoIGF0dGFjaGVkIGRhdGFiYXNlcworICAgICAgICBpZiAoZ2V0QXR0YWNoZWREYnMoKS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZGF0YWJhc2U6ICIgKyBtUGF0aCArICIgaGFzIGF0dGFjaGVkIGRhdGFiYXNlcy4gY2FuJ3QgIGVuYWJsZSBXQUwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wgPSBuZXcgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCh0aGlzKTsKKyAgICAgICAgICAgIHNldEpvdXJuYWxNb2RlKG1QYXRoLCAiV0FMIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgZGlzYWJsZXMgdGhlIGZlYXR1cmVzIGVuYWJsZWQgYnkge0BsaW5rICNlbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25Qb29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29ubmVjdGlvblBvb2wuY2xvc2UoKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUG9vbCA9IG51bGw7CisgICAgICAgICAgICBzZXRKb3VybmFsTW9kZShtUGF0aCwgIlRSVU5DQVRFIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGdldERhdGFiYXNlSGFuZGxlKFN0cmluZyBzcWwpIHsKKyAgICAgICAgaWYgKGlzUG9vbGVkQ29ubmVjdGlvbigpKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGEgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIHVzZSBpdCBpZiBpdCBpcyBvcGVuIEFORCBpZiBJIGFtIG5vdCBjdXJyZW50bHkgcGFydCBvZiBhIHRyYW5zYWN0aW9uCisgICAgICAgICAgICBpZiAoaXNPcGVuKCkgJiYgIWFtSUluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhbm90aGVyIGNvbm5lY3Rpb24gZnJvbSB0aGUgcG9vbAorICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IHNvbWUgb3RoZXIgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gQU5EIGlmIHRoZXJlIGFyZSBmcmVlIGNvbm5lY3Rpb25zIGluIHRoZSBwb29sCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwb29sZWQgY29ubmVjdGlvbiBpcyBub3Qgb3BlbiEgY291bGQgaGF2ZSBiZWVuIGNsb3NlZCBlaXRoZXIgZHVlCisgICAgICAgICAgICAgICAgLy8gdG8gY29ycnVwdGlvbiBvbiB0aGlzIG9yIHNvbWUgb3RoZXIgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICAvLyBPUiwgbWF5YmUgdGhlIGNvbm5lY3Rpb24gcG9vbCBpcyBkaXNhYmxlZCBhZnRlciB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQgdG8gbWUuIHRyeSB0byBnZXQgc29tZSBvdGhlciBwb29sZWQgb3IgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBhcmVudERiQ29ubk9iaigpLmdldERiQ29ubmVjdGlvbihzcWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbi4gY2FuIHdlIGdldCBvbmU/CisgICAgICAgICAgICByZXR1cm4gZ2V0RGJDb25uZWN0aW9uKHNxbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIERhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgZW5hYmxlZCB3aGVuIHRoZSBhcHAgY2FsbHMKKyAgICAgKiB7QGxpbmsgI2VuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgaXMgc2V0IGJ5IHRoZSBzeXN0ZW0gYnkgdGFraW5nIGludG8gYWNjb3VudCB2YXJpb3VzCisgICAgICogYXNwZWN0cyBvZiB0aGUgZGV2aWNlLCBzdWNoIGFzIG1lbW9yeSwgbnVtYmVyIG9mIGNvcmVzIGV0Yy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdAorICAgICAqIGFwcGxpY2F0aW9ucyB1c2UgdGhlIGRlZmF1bHQgcG9vbCBzaXplIHNldCBieSB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIHZhbHVlIHRoZSBjb25uZWN0aW9uIGhhbmRsZSBwb29sIHNpemUgc2hvdWxkIGJlIHNldCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q29ubmVjdGlvblBvb2xTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29ubmVjdGlvbiBwb29sIG5vdCBlbmFibGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGkgPSBtQ29ubmVjdGlvblBvb2wuZ2V0TWF4UG9vbFNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgPCBpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHNldCBtYXggcG9vbCBzaXplIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSg9IiArCisgICAgICAgICAgICAgICAgICAgIGkgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIG1Db25uZWN0aW9uUG9vbC5zZXRNYXhQb29sU2l6ZShzaXplKTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZURhdGFiYXNlIGNyZWF0ZVBvb2xDb25uZWN0aW9uKHNob3J0IGNvbm5lY3Rpb25OdW0pIHsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBvcGVuRGF0YWJhc2UobVBhdGgsIG1GYWN0b3J5LCBtRmxhZ3MsIG1FcnJvckhhbmRsZXIsIGNvbm5lY3Rpb25OdW0pOworICAgICAgICBkYi5tUGFyZW50Q29ubk9iaiA9IHRoaXM7CisgICAgICAgIHJldHVybiBkYjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBTUUxpdGVEYXRhYmFzZSBnZXRQYXJlbnREYkNvbm5PYmooKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50Q29ubk9iajsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29sZWRDb25uZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQ29ubmVjdGlvbk51bSA+IDA7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVEYXRhYmFzZSBnZXREYkNvbm5lY3Rpb24oU3RyaW5nIHNxbCkgeworICAgICAgICB2ZXJpZnlEYklzT3BlbigpOworICAgICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIHRoZSBvbmx5IHRpbWUgd2hlbiBpdCBpcyBjYWxsZWQgd2l0aCBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUgaXMKKyAgICAgICAgLy8gY29ycnVwdGlvbiBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIG9wZW4gYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBoYW5kbGUuCisgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgc2ltcGx5IHJldHVybiAndGhpcycgaGFuZGxlCisgICAgICAgIGlmIChpc1Bvb2xlZENvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBoYW5kbGUgaWYKKyAgICAgICAgLy8gMS4gaWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIHRoZSBvbmdvaW5nIHRyYW5zYWN0aW9uLCBpZiBhbnkKKyAgICAgICAgLy8gMi4gT1IsIGlmIHRoZXJlIGlzIE5PIGNvbm5lY3Rpb24gaGFuZGxlIHBvb2wgc2V0dXAKKyAgICAgICAgaWYgKGFtSUluVHJhbnNhY3Rpb24oKSB8fCBtQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uIGhhbmRsZSBmcm9tIHRoZSBwb29sCisgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG1Db25uZWN0aW9uUG9vbCAhPSBudWxsOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgbUNvbm5lY3Rpb25Qb29sLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uUG9vbC5nZXQoc3FsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlRGJDb25uZWN0aW9uKFNRTGl0ZURhdGFiYXNlIGRiKSB7CisgICAgICAgIC8vIGlnbm9yZSB0aGlzIHJlbGVhc2UgY2FsbCBpZgorICAgICAgICAvLyAxLiB0aGUgZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIC8vIDIuIE9SLCBpZiBkYiBpcyBOT1QgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUKKyAgICAgICAgLy8gMy4gT1IsIGlmIHRoZSBkYXRhYmFzZSBiZWluZyByZWxlYXNlZCBpcyBzYW1lIGFzICd0aGlzJyAodGhpcyBjb25kaXRpb24gbWVhbnMKKyAgICAgICAgLy8gICAgIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBiZSByZWxlYXNpbmcgYSBwb29sZWQgY29ubmVjdGlvbiBoYW5kbGUgYnkgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAgICAvLyAgICAgZnJvbSB0aGUgJ21haW4nIGNvbm5lY3Rpb24gaGFuZGxlCisgICAgICAgIGlmICghaXNPcGVuKCkgfHwgIWRiLmlzUG9vbGVkQ29ubmVjdGlvbigpIHx8IChkYiA9PSB0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRykpIHsKKyAgICAgICAgICAgIGFzc2VydCBpc1Bvb2xlZENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGFzc2VydCBtQ29ubmVjdGlvblBvb2wgIT0gbnVsbDsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2VEYkNvbm5lY3Rpb24gdGhyZWFkaWQgPSAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsKKyAgICAgICAgICAgICAgICAgICAgIiwgcmVsZWFzaW5nICMgIiArIGRiLm1Db25uZWN0aW9uTnVtICsgIiwgIiArIGdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbm5lY3Rpb25Qb29sLnJlbGVhc2UoZGIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IEFMTCBvcGVuIGRhdGFiYXNlcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgotICAgICAqIGJ1Z3JlcG9ydCBpcyBhIHVzZXIgb2YgdGhpcyBkYXRhLiAKKyAgICAgKiBidWdyZXBvcnQgaXMgYSB1c2VyIG9mIHRoaXMgZGF0YS4KICAgICAgKi8KICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBBcnJheUxpc3Q8RGJTdGF0cz4gZ2V0RGJTdGF0cygpIHsKICAgICAgICAgQXJyYXlMaXN0PERiU3RhdHM+IGRiU3RhdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxEYlN0YXRzPigpOwotICAgICAgICBmb3IgKFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+IHcgOiBBY3RpdmVEYXRhYmFzZXMuZ2V0SW5zdGFuY2UoKS5tQWN0aXZlRGF0YWJhc2VzKSB7CisgICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IG9mIG1BY3RpdmVEYXRhYmFzZXMgLSBzbyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjb21wZXRpbmcKKyAgICAgICAgLy8gZm9yIHN5bmNocm9uaXphdGlvbiBsb2NrIG9uIG1BY3RpdmVEYXRhYmFzZXMKKyAgICAgICAgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8U1FMaXRlRGF0YWJhc2U+PiB0ZW1wTGlzdDsKKyAgICAgICAgc3luY2hyb25pemVkKG1BY3RpdmVEYXRhYmFzZXMpIHsKKyAgICAgICAgICAgIHRlbXBMaXN0ID0gKEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPFNRTGl0ZURhdGFiYXNlPj4pbUFjdGl2ZURhdGFiYXNlcy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxTUUxpdGVEYXRhYmFzZT4gdyA6IHRlbXBMaXN0KSB7CiAgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IHcuZ2V0KCk7CiAgICAgICAgICAgICBpZiAoZGIgPT0gbnVsbCB8fCAhZGIuaXNPcGVuKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGdldCBTUUxJVEVfREJTVEFUVVNfTE9PS0FTSURFX1VTRUQgZm9yIHRoZSBkYgotICAgICAgICAgICAgaW50IGxvb2thc2lkZVVzZWQgPSBkYi5uYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKIAotICAgICAgICAgICAgLy8gZ2V0IHRoZSBsYXN0bm9kZSBvZiB0aGUgZGJuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGludCBpbmR4ID0gcGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIGxhc3Rub2RlID0gcGF0aC5zdWJzdHJpbmcoKGluZHggIT0gLTEpID8gKytpbmR4IDogMCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRiKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBmb3IgdGhlIGRiCisgICAgICAgICAgICAgICAgICAgIGludCBsb29rYXNpZGVVc2VkID0gZGIubmF0aXZlX2dldERiTG9va2FzaWRlKCk7CiAKLSAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKLSAgICAgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicyhkYik7Ci0gICAgICAgICAgICBpZiAoYXR0YWNoZWREYnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRhY2hlZERicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBnZXRQcmFnbWFWYWwoZGIsIHAuZmlyc3QgKyAiLnBhZ2VfY291bnQ7Iik7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGFzdG5vZGUgb2YgdGhlIGRibmFtZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRiLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZHggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0bm9kZSA9IHBhdGguc3Vic3RyaW5nKChpbmR4ICE9IC0xKSA/ICsraW5keCA6IDApOwogCi0gICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgcHJlZml4aW5nIHRoZSBkYm5hbWUgd2l0aCAibWFpbiIKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGJOYW1lOwotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gbGFzdG5vZGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCi0gICAgICAgICAgICAgICAgICAgIGxvb2thc2lkZVVzZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSAiICAoYXR0YWNoZWQpICIgKyBwLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgIGlmIChwLnNlY29uZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcC5zZWNvbmQubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCBsaXN0IG9mIGF0dGFjaGVkIGRicyBhbmQgZm9yIGVhY2ggZGIsIGdldCBpdHMgc2l6ZSBhbmQgcGFnZXNpemUKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiBhdHRhY2hlZERicyA9IGRiLmdldEF0dGFjaGVkRGJzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERicyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFnZUNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dGFjaGVkRGJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBwID0gYXR0YWNoZWREYnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwYWdlQ291bnQgPSBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShkYiwgIlBSQUdNQSAiICsgcC5maXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIucGFnZV9jb3VudDsiLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgZW50cnkgaW4gdGhlIGF0dGFjaGVkIGRiIGxpc3QgaXMgYWx3YXlzIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBwcmVmaXhpbmcgdGhlIGRibmFtZSB3aXRoICJtYWluIgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRiTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYk5hbWUgPSBsYXN0bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va2FzaWRlIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBtYWluIGRiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FzaWRlVXNlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJOYW1lID0gIiAgKGF0dGFjaGVkKSAiICsgcC5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0YWNoZWQgZGIgaGFzIGEgcGF0aCwgYXR0YWNoIHRoZSBsYXN0bm9kZSBmcm9tIHRoZSBwYXRoIHRvIGFib3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuc2Vjb25kLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHAuc2Vjb25kLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiTmFtZSArPSAiIDogIiArIHAuc2Vjb25kLnN1YnN0cmluZygoaWR4ICE9IC0xKSA/ICsraWR4IDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlN0YXRzTGlzdC5hZGQobmV3IERiU3RhdHMoZGJOYW1lLCBwYWdlQ291bnQsIGRiLmdldFBhZ2VTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYXNpZGVVc2VkLCBkYi5tTnVtQ2FjaGVIaXRzLCBkYi5tTnVtQ2FjaGVNaXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5tQ29tcGlsZWRRdWVyaWVzLnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBwb29sZWQgY29ubmVjdGlvbnMsIHJldHVybiB0aGUgY2FjaGUgc3RhdHMgZm9yIHRoZW0gYWxzby4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRiLm1Db25uZWN0aW9uUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFNRTGl0ZURhdGFiYXNlIHBEYiA6IGRiLm1Db25uZWN0aW9uUG9vbC5nZXRDb25uZWN0aW9uTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJTdGF0c0xpc3QuYWRkKG5ldyBEYlN0YXRzKCIocG9vbGVkICMgIiArIHBEYi5tQ29ubmVjdGlvbk51bSArICIpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdG5vZGUsIDAsIDAsIDAsIHBEYi5tTnVtQ2FjaGVIaXRzLCBwRGIubU51bUNhY2hlTWlzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERiLm1Db21waWxlZFF1ZXJpZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUuIHdlIGRvbid0IGNhcmUgYWJvdXQgZXhjZXB0aW9ucyB3aGVuIHdlIGFyZSB0YWtpbmcgYWRiCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1Z3JlcG9ydCEKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxOTQsNDQgKzI1MDAsODIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBnZXQgdGhlIHNwZWNpZmllZCBwcmFnbWEgdmFsdWUgZnJvbSBzcWxpdGUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UuCi0gICAgICogb25seSBoYW5kbGVzIHByYWdtYSdzIHRoYXQgcmV0dXJuIGludC9sb25nLgotICAgICAqIE5PIEpBVkEgbG9ja3MgYXJlIGhlbGQgaW4gdGhpcyBtZXRob2QuCi0gICAgICogVE9ETzogdXNlIHRoaXMgdG8gZG8gYWxsIHByYWdtYSdzIGluIHRoaXMgY2xhc3MKKyAgICAgKiBSZXR1cm5zIGxpc3Qgb2YgZnVsbCBwYXRobmFtZXMgb2YgYWxsIGF0dGFjaGVkIGRhdGFiYXNlcyBpbmNsdWRpbmcgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiBieSBleGVjdXRpbmcgJ3ByYWdtYSBkYXRhYmFzZV9saXN0JyBvbiB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBvZiBwYWlycyBvZiAoZGF0YWJhc2UgbmFtZSwgZGF0YWJhc2UgZmlsZSBwYXRoKSBvciBudWxsIGlmIHRoZSBkYXRhYmFzZQorICAgICAqIGlzIG5vdCBvcGVuLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0UHJhZ21hVmFsKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgcHJhZ21hKSB7Ci0gICAgICAgIGlmICghZGIuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwcm9nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb2cgPSBuZXcgU1FMaXRlU3RhdGVtZW50KGRiLCAiUFJBR01BICIgKyBwcmFnbWEpOwotICAgICAgICAgICAgbG9uZyB2YWwgPSBwcm9nLnNpbXBsZVF1ZXJ5Rm9yTG9uZygpOwotICAgICAgICAgICAgcmV0dXJuIHZhbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgbGlzdCBvZiBmdWxsIHBhdGhuYW1lcyBvZiBhbGwgYXR0YWNoZWQgZGF0YWJhc2VzCi0gICAgICogaW5jbHVkaW5nIHRoZSBtYWluIGRhdGFiYXNlCi0gICAgICogVE9ETzogbW92ZSB0aGlzIHRvIHtAbGluayBEYXRhYmFzZVV0aWxzfQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZ2V0QXR0YWNoZWREYnMoU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKLSAgICAgICAgaWYgKCFkYk9iai5pc09wZW4oKSkgeworICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGdldEF0dGFjaGVkRGJzKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+IGF0dGFjaGVkRGJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4oKTsKLSAgICAgICAgQ3Vyc29yIGMgPSBkYk9iai5yYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7Ci0gICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgIGF0dGFjaGVkRGJzLmFkZChuZXcgUGFpcjxTdHJpbmcsIFN0cmluZz4oYy5nZXRTdHJpbmcoMSksIGMuZ2V0U3RyaW5nKDIpKSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSByYXdRdWVyeSgicHJhZ21hIGRhdGFiYXNlX2xpc3Q7IiwgbnVsbCk7CisgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzcWxpdGUgcmV0dXJucyBhIHJvdyBmb3IgZWFjaCBkYXRhYmFzZSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBvZiBkYXRhYmFzZXMuCisgICAgICAgICAgICAgICAgLy8gICBpbiBlYWNoIHJvdywKKyAgICAgICAgICAgICAgICAvLyAgICAgICAxc3QgY29sdW1uIGlzIHRoZSBkYXRhYmFzZSBuYW1lIHN1Y2ggYXMgbWFpbiwgb3IgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHNwZWNpZmllZCBvbiB0aGUgIkFUVEFDSCIgY29tbWFuZAorICAgICAgICAgICAgICAgIC8vICAgICAgIDJuZCBjb2x1bW4gaXMgdGhlIGRhdGFiYXNlIGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KGMuZ2V0U3RyaW5nKDEpLCBjLmdldFN0cmluZygyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjLmNsb3NlKCk7CiAgICAgICAgIHJldHVybiBhdHRhY2hlZERiczsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSdW5zICdwcmFnbWEgaW50ZWdyaXR5X2NoZWNrJyBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgKGFuZCBhbGwgdGhlIGF0dGFjaGVkIGRhdGFiYXNlcykKKyAgICAgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRhYmFzZSAoYW5kIGFsbCBpdHMgYXR0YWNoZWQgZGF0YWJhc2VzKSBwYXNzIGludGVncml0eV9jaGVjaywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuCisgICAgICo8cD4KKyAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIGZhbHNlLCB0aGVuIHRoaXMgbWV0aG9kIGxvZ3MgdGhlIGVycm9ycyByZXBvcnRlZCBieSB0aGUgaW50ZWdyaXR5X2NoZWNrCisgICAgICogY29tbWFuZCBleGVjdXRpb24uCisgICAgICo8cD4KKyAgICAgKiBOb3RlIHRoYXQgJ3ByYWdtYSBpbnRlZ3JpdHlfY2hlY2snIG9uIGEgZGF0YWJhc2UgY2FuIHRha2UgYSBsb25nIHRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRhdGFiYXNlIChhbmQgYWxsIGl0cyBhdHRhY2hlZCBkYXRhYmFzZXMpIHBhc3MgaW50ZWdyaXR5X2NoZWNrLAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFiYXNlSW50ZWdyaXR5T2soKSB7CisgICAgICAgIHZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXR0YWNoZWREYnMgPSBnZXRBdHRhY2hlZERicygpOworICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZWxpc3QgZm9yOiAiICsgZ2V0UGF0aCgpICsgIiBjb3VsZG4ndCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZSByZXRyaWV2ZWQuIHByb2JhYmx5IGJlY2F1c2UgdGhlIGRhdGFiYXNlIGlzIGNsb3NlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gY2FuJ3QgZ2V0IGF0dGFjaGVkRGIgbGlzdC4gZG8gaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICAgICAgICBhdHRhY2hlZERicyA9IG5ldyBBcnJheUxpc3Q8UGFpcjxTdHJpbmcsIFN0cmluZz4+KCk7CisgICAgICAgICAgICBhdHRhY2hlZERicy5hZGQobmV3IFBhaXI8U3RyaW5nLCBTdHJpbmc+KCJtYWluIiwgdGhpcy5tUGF0aCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0YWNoZWREYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHAgPSBhdHRhY2hlZERicy5nZXQoaSk7CisgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgcHJvZyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2cgPSBjb21waWxlU3RhdGVtZW50KCJQUkFHTUEgIiArIHAuZmlyc3QgKyAiLmludGVncml0eV9jaGVjaygxKTsiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcnNsdCA9IHByb2cuc2ltcGxlUXVlcnlGb3JTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJzbHQuZXF1YWxzSWdub3JlQ2FzZSgib2siKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ3JpdHlfY2hlY2tlciBmYWlsZWQgb24gbWFpbiBvciBhdHRhY2hlZCBkYXRhYmFzZXMKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUFJBR01BIGludGVncml0eV9jaGVjayBvbiAiICsgcC5zZWNvbmQgKyAiIHJldHVybmVkOiAiICsgcnNsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChwcm9nICE9IG51bGwpIHByb2cuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgY2FsbCB0byBvcGVuIHRoZSBkYXRhYmFzZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGRhdGFiYXNlCkBAIC0yMjM5LDUxICsyNTgzLDM0IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBkYm9wZW4oU3RyaW5nIHBhdGgsIGludCBmbGFncyk7CiAKICAgICAvKioKLSAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCB0cmFjaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cworICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldHVwIHRyYWNpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGF0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTnVtIGNvbm5lY3Rpb24gbnVtYmVyOiAwIC0gTiwgd2hlcmUgdGhlIG1haW4gZGF0YWJhc2UKKyAgICAgKiAgICAgICAgICAgIGNvbm5lY3Rpb24gaGFuZGxlIGlzIG51bWJlcmVkIDAgYW5kIHRoZSBjb25uZWN0aW9uIGhhbmRsZXMgaW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHBvb2wgYXJlIG51bWJlcmVkIDEuLk4uCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKFN0cmluZyBwYXRoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGVuYWJsZVNxbFRyYWNpbmcoU3RyaW5nIHBhdGgsIHNob3J0IGNvbm5lY3Rpb25OdW0pOwogCiAgICAgLyoqCi0gICAgICogTmF0aXZlIGNhbGwgdG8gc2V0dXAgcHJvZmlsaW5nIG9mIGFsbCBzcWwgc3RhdGVtZW50cy4KKyAgICAgKiBOYXRpdmUgY2FsbCB0byBzZXR1cCBwcm9maWxpbmcgb2YgYWxsIFNRTCBzdGF0ZW1lbnRzLgogICAgICAqIGN1cnJlbnRseSwgc3FsaXRlJ3MgcHJvZmlsaW5nID0gcHJpbnRpbmcgb2YgZXhlY3V0aW9uLXRpbWUKLSAgICAgKiAod2FsbC1jbG9jayB0aW1lKSBvZiBlYWNoIG9mIHRoZSBzcWwgc3RhdGVtZW50cywgYXMgdGhleQorICAgICAqICh3YWxsLWNsb2NrIHRpbWUpIG9mIGVhY2ggb2YgdGhlIFNRTCBzdGF0ZW1lbnRzLCBhcyB0aGV5CiAgICAgICogYXJlIGV4ZWN1dGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk51bSBjb25uZWN0aW9uIG51bWJlcjogMCAtIE4sIHdoZXJlIHRoZSBtYWluIGRhdGFiYXNlCisgICAgICogICAgICAgICAgICBjb25uZWN0aW9uIGhhbmRsZSBpcyBudW1iZXJlZCAwIGFuZCB0aGUgY29ubmVjdGlvbiBoYW5kbGVzIGluIHRoZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBwb29sIGFyZSBudW1iZXJlZCAxLi5OLgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKFN0cmluZyBwYXRoKTsKLQotICAgIC8qKgotICAgICAqIE5hdGl2ZSBjYWxsIHRvIGV4ZWN1dGUgYSByYXcgU1FMIHN0YXRlbWVudC4ge0BsaW5rICNsb2NrfSBtdXN0IGJlIGhlbGQKLSAgICAgKiB3aGVuIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3FsIFRoZSByYXcgU1FMIHN0cmluZwotICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBuYXRpdmUgdm9pZCBuYXRpdmVfZXhlY1NRTChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKFN0cmluZyBwYXRoLCBzaG9ydCBjb25uZWN0aW9uTnVtKTsKIAogICAgIC8qKgogICAgICAqIE5hdGl2ZSBjYWxsIHRvIHNldCB0aGUgbG9jYWxlLiAge0BsaW5rICNsb2NrfSBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nCiAgICAgICogdGhpcyBtZXRob2QuCiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24KICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRMb2NhbGUoU3RyaW5nIGxvYywgaW50IGZsYWdzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvdyBJRCBvZiB0aGUgbGFzdCByb3cgaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByb3cgSUQgb2YgdGhlIGxhc3Qgcm93IGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gbmF0aXZlIGxvbmcgbGFzdEluc2VydFJvdygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5nZXMgbWFkZSBpbiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhbmdlcyBtYWRlIGluIHRoZSBsYXN0IHN0YXRlbWVudCBleGVjdXRlZC4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIG5hdGl2ZSBpbnQgbGFzdENoYW5nZUNvdW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVfc2V0TG9jYWxlKFN0cmluZyBsb2MsIGludCBmbGFncyk7CiAKICAgICAvKioKICAgICAgKiByZXR1cm4gdGhlIFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRCBkb2N1bWVudGVkIGhlcmUKQEAgLTIyOTEsNCArMjYxOCwxMSBAQAogICAgICAqIEByZXR1cm4gaW50IHZhbHVlIG9mIFNRTElURV9EQlNUQVRVU19MT09LQVNJREVfVVNFRAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0RGJMb29rYXNpZGUoKTsKKworICAgIC8qKgorICAgICAqIGZpbmFsaXplcyB0aGUgZ2l2ZW4gc3RhdGVtZW50IGlkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlbWVudElkIHN0YXRlbWVudCB0byBiZSBmaW56bGllZCBieSBzcWxpdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG5hdGl2ZV9maW5hbGl6ZShpbnQgc3RhdGVtZW50SWQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUyZDgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlTG9ja2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhyb3duIGlmICB0aGUgZGF0YWJhc2UgZW5naW5lIHdhcyB1bmFibGUgdG8gYWNxdWlyZSB0aGUKKyAqIGRhdGFiYXNlIGxvY2tzIGl0IG5lZWRzIHRvIGRvIGl0cyBqb2IuICBJZiB0aGUgc3RhdGVtZW50IGlzIGEgW0NPTU1JVF0KKyAqIG9yIG9jY3VycyBvdXRzaWRlIG9mIGFuIGV4cGxpY2l0IHRyYW5zYWN0aW9uLCB0aGVuIHlvdSBjYW4gcmV0cnkgdGhlCisgKiBzdGF0ZW1lbnQuICBJZiB0aGUgc3RhdGVtZW50IGlzIG5vdCBhIFtDT01NSVRdIGFuZCBvY2N1cnMgd2l0aGluIGEKKyAqIGV4cGxpY2l0IHRyYW5zYWN0aW9uIHRoZW4geW91IHNob3VsZCByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24gYmVmb3JlCisgKiBjb250aW51aW5nLgorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZUxvY2tlZEV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YXR5cGVNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjgyNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24geworICAgIHB1YmxpYyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVEYXRhdHlwZU1pc21hdGNoRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGVidWcuamF2YQppbmRleCA4OWMzZjk2Li45NDk2MDc5MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURlYnVnLmphdmEKQEAgLTEzMiwxMSArMTMyLDE2IEBACiAgICAgICAgIC8qKiBkb2N1bWVudGVkIGhlcmUgaHR0cDovL3d3dy5zcWxpdGUub3JnL2MzcmVmL2NfZGJzdGF0dXNfbG9va2FzaWRlX3VzZWQuaHRtbCAqLwogICAgICAgICBwdWJsaWMgaW50IGxvb2thc2lkZTsKIAotICAgICAgICBwdWJsaWMgRGJTdGF0cyhTdHJpbmcgZGJOYW1lLCBsb25nIHBhZ2VDb3VudCwgbG9uZyBwYWdlU2l6ZSwgaW50IGxvb2thc2lkZSkgeworICAgICAgICAvKiogc3RhdGVtZW50IGNhY2hlIHN0YXRzOiBoaXRzL21pc3Nlcy9jYWNoZXNpemUgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBjYWNoZTsKKworICAgICAgICBwdWJsaWMgRGJTdGF0cyhTdHJpbmcgZGJOYW1lLCBsb25nIHBhZ2VDb3VudCwgbG9uZyBwYWdlU2l6ZSwgaW50IGxvb2thc2lkZSwKKyAgICAgICAgICAgIGludCBoaXRzLCBpbnQgbWlzc2VzLCBpbnQgY2FjaGVzaXplKSB7CiAgICAgICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTsKLSAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKKyAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZSAvIDEwMjQ7CiAgICAgICAgICAgICBkYlNpemUgPSAocGFnZUNvdW50ICogcGFnZVNpemUpIC8gMTAyNDsKICAgICAgICAgICAgIHRoaXMubG9va2FzaWRlID0gbG9va2FzaWRlOworICAgICAgICAgICAgdGhpcy5jYWNoZSA9IGhpdHMgKyAiLyIgKyBtaXNzZXMgKyAiLyIgKyBjYWNoZXNpemU7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEaXJlY3RDdXJzb3JEcml2ZXIuamF2YQppbmRleCAyMTQ0ZmMzLi5kZTJmY2E5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlyZWN0Q3Vyc29yRHJpdmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURpcmVjdEN1cnNvckRyaXZlci5qYXZhCkBAIC0zOSwxOCArMzksMTYgQEAKIAogICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7CiAgICAgICAgIC8vIENvbXBpbGUgdGhlIHF1ZXJ5Ci0gICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbmV3IFNRTGl0ZVF1ZXJ5KG1EYXRhYmFzZSwgbVNxbCwgMCwgc2VsZWN0aW9uQXJncyk7CisgICAgICAgIFNRTGl0ZVF1ZXJ5IHF1ZXJ5ID0gbnVsbDsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQXJnIGJpbmRpbmcKLSAgICAgICAgICAgIGludCBudW1BcmdzID0gc2VsZWN0aW9uQXJncyA9PSBudWxsID8gMCA6IHNlbGVjdGlvbkFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBxdWVyeS5iaW5kU3RyaW5nKGkgKyAxLCBzZWxlY3Rpb25BcmdzW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICAgICAgcXVlcnkgPSBuZXcgU1FMaXRlUXVlcnkobURhdGFiYXNlLCBtU3FsLCAwLCBzZWxlY3Rpb25BcmdzKTsKIAogICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjdXJzb3IKICAgICAgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbmV3IFNRTGl0ZUN1cnNvcihtRGF0YWJhc2UsIHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKKyAgICAgICAgICAgICAgICBtQ3Vyc29yID0gbmV3IFNRTGl0ZUN1cnNvcih0aGlzLCBtRWRpdFRhYmxlLCBxdWVyeSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBmYWN0b3J5Lm5ld0N1cnNvcihtRGF0YWJhc2UsIHRoaXMsIG1FZGl0VGFibGUsIHF1ZXJ5KTsKICAgICAgICAgICAgIH0KQEAgLTYxLDYgKzU5LDcgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBpcyBjbGVhbmVkIHVwIGlmIHNvbWV0aGluZyBoYXBwZW5zCiAgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgcXVlcnkuY2xvc2UoKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjksMTAgKzY4LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRCaW5kQXJndW1lbnRzKFN0cmluZ1tdIGJpbmRBcmdzKSB7Ci0gICAgICAgIGZpbmFsIGludCBudW1BcmdzID0gYmluZEFyZ3MubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgbVF1ZXJ5LmJpbmRTdHJpbmcoaSArIDEsIGJpbmRBcmdzW2ldKTsKLSAgICAgICAgfQorICAgICAgICBtUXVlcnkuYmluZEFsbEFyZ3NBc1N0cmluZ3MoYmluZEFyZ3MpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGN1cnNvckRlYWN0aXZhdGVkKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU1pc3VzZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDY4NWYzZWEuLjU0NmVjMDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVNaXN1c2VFeGNlcHRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uLmphdmEKQEAgLTE2LDYgKzE2LDE4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKKy8qKgorICogVGhpcyBlcnJvciBjYW4gb2NjdXIgaWYgdGhlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSBTUUxpdGVTdGF0ZW1lbnQgb2JqZWN0IGFuZCBhbGxvd3MgbXVsdGlwbGUKKyAqIHRocmVhZHMgaW4gdGhlIGFwcGxpY2F0aW9uIHVzZSBpdCBhdCB0aGUgc2FtZSB0aW1lLgorICogU3FsaXRlIHJldHVybnMgdGhpcyBlcnJvciBpZiBiaW5kIGFuZCBleGVjdXRlIG1ldGhvZHMgb24gdGhpcyBvYmplY3Qgb2NjdXIgYXQgdGhlIHNhbWUgdGltZQorICogZnJvbSBtdWx0aXBsZSB0aHJlYWRzLCBsaWtlIHNvOgorICogICAgIHRocmVhZCAjIDE6IGluIGV4ZWN1dGUoKSBtZXRob2Qgb2YgdGhlIFNRTGl0ZVN0YXRlbWVudCBvYmplY3QKKyAqICAgICB3aGlsZSB0aHJlYWQgIyAyOiBpcyBpbiBiaW5kLi4oKSBvbiB0aGUgc2FtZSBvYmplY3QuCisgKjwvcD4KKyAqIEZJWCB0aGlzIGJ5IE5FVkVSIHNoYXJpbmcgdGhlIHNhbWUgU1FMaXRlU3RhdGVtZW50IG9iamVjdCBiZXR3ZWVuIHRocmVhZHMuCisgKiBDcmVhdGUgYSBsb2NhbCBpbnN0YW5jZSBvZiB0aGUgU1FMaXRlU3RhdGVtZW50IHdoZW5ldmVyIGl0IGlzIG5lZWRlZCwgdXNlIGl0IGFuZCBjbG9zZSBpdCBBU0FQLgorICogTkVWRVIgbWFrZSBpdCBnbG9iYWxseSBhdmFpbGFibGUuCisgKi8KIHB1YmxpYyBjbGFzcyBTUUxpdGVNaXN1c2VFeGNlcHRpb24gZXh0ZW5kcyBTUUxpdGVFeGNlcHRpb24gewogICAgIHB1YmxpYyBTUUxpdGVNaXN1c2VFeGNlcHRpb24oKSB7fQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZU9wZW5IZWxwZXIuamF2YQppbmRleCBiNDYxNWViLi5jY2Y4ZDY4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3BlbkhlbHBlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPcGVuSGVscGVyLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKIHBhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlRXJyb3JIYW5kbGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3Rvcnk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNTEsNiArNTMsNyBAQAogCiAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2UgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNJbml0aWFsaXppbmcgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlRXJyb3JIYW5kbGVyIG1FcnJvckhhbmRsZXI7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBoZWxwZXIgb2JqZWN0IHRvIGNyZWF0ZSwgb3BlbiwgYW5kL29yIG1hbmFnZSBhIGRhdGFiYXNlLgpAQCAtNjUsMTIgKzY4LDM3IEBACiAgICAgICogICAgIHtAbGluayAjb25VcGdyYWRlfSB3aWxsIGJlIHVzZWQgdG8gdXBncmFkZSB0aGUgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgU1FMaXRlT3BlbkhlbHBlcihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBDdXJzb3JGYWN0b3J5IGZhY3RvcnksIGludCB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbmFtZSwgZmFjdG9yeSwgdmVyc2lvbiwgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBoZWxwZXIgb2JqZWN0IHRvIGNyZWF0ZSwgb3BlbiwgYW5kL29yIG1hbmFnZSBhIGRhdGFiYXNlLgorICAgICAqIFRoZSBkYXRhYmFzZSBpcyBub3QgYWN0dWFsbHkgY3JlYXRlZCBvciBvcGVuZWQgdW50aWwgb25lIG9mCisgICAgICoge0BsaW5rICNnZXRXcml0YWJsZURhdGFiYXNlfSBvciB7QGxpbmsgI2dldFJlYWRhYmxlRGF0YWJhc2V9IGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIDxwPkFjY2VwdHMgaW5wdXQgcGFyYW06IGEgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZQorICAgICAqIHVzZWQgdG8gaGFuZGxlIGNvcnJ1cHRpb24gd2hlbiBzcWxpdGUgcmVwb3J0cyBkYXRhYmFzZSBjb3JydXB0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRvIHVzZSB0byBvcGVuIG9yIGNyZWF0ZSB0aGUgZGF0YWJhc2UKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGF0YWJhc2UgZmlsZSwgb3IgbnVsbCBmb3IgYW4gaW4tbWVtb3J5IGRhdGFiYXNlCisgICAgICogQHBhcmFtIGZhY3RvcnkgdG8gdXNlIGZvciBjcmVhdGluZyBjdXJzb3Igb2JqZWN0cywgb3IgbnVsbCBmb3IgdGhlIGRlZmF1bHQKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRhdGFiYXNlIChzdGFydGluZyBhdCAxKTsgaWYgdGhlIGRhdGFiYXNlIGlzIG9sZGVyLAorICAgICAqICAgICB7QGxpbmsgI29uVXBncmFkZX0gd2lsbCBiZSB1c2VkIHRvIHVwZ3JhZGUgdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIGVycm9ySGFuZGxlciB0aGUge0BsaW5rIERhdGFiYXNlRXJyb3JIYW5kbGVyfSB0byBiZSB1c2VkIHdoZW4gc3FsaXRlIHJlcG9ydHMgZGF0YWJhc2UKKyAgICAgKiBjb3JydXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTUUxpdGVPcGVuSGVscGVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG5hbWUsIEN1cnNvckZhY3RvcnkgZmFjdG9yeSwgaW50IHZlcnNpb24sCisgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKICAgICAgICAgaWYgKHZlcnNpb24gPCAxKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJzaW9uIG11c3QgYmUgPj0gMSwgd2FzICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRhYmFzZUVycm9ySGFuZGxlciBwYXJhbSB2YWx1ZSBjYW4ndCBiZSBudWxsLiIpOworICAgICAgICB9CiAKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtTmFtZSA9IG5hbWU7CiAgICAgICAgIG1GYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAgbU5ld1ZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICBtRXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTMsOCArMTIxLDEzIEBACiAgICAgICogQHJldHVybiBhIHJlYWQvd3JpdGUgZGF0YWJhc2Ugb2JqZWN0IHZhbGlkIHVudGlsIHtAbGluayAjY2xvc2V9IGlzIGNhbGxlZAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0V3JpdGFibGVEYXRhYmFzZSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5pc09wZW4oKSAmJiAhbURhdGFiYXNlLmlzUmVhZE9ubHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkYXJuISB0aGUgdXNlciBjbG9zZWQgdGhlIGRhdGFiYXNlIGJ5IGNhbGxpbmcgbURhdGFiYXNlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmICghbURhdGFiYXNlLmlzUmVhZE9ubHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YWJhc2U7ICAvLyBUaGUgZGF0YWJhc2UgaXMgYWxyZWFkeSBvcGVuIGZvciBidXNpbmVzcworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1Jc0luaXRpYWxpemluZykgewpAQCAtMTE1LDEwICsxNDgsMTQgQEAKICAgICAgICAgICAgIGlmIChtTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZGIgPSBTUUxpdGVEYXRhYmFzZS5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRiID0gbUNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UobU5hbWUsIDAsIG1GYWN0b3J5KTsKKyAgICAgICAgICAgICAgICBkYiA9IG1Db250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKG1OYW1lLCAwLCBtRmFjdG9yeSwgbUVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCB2ZXJzaW9uID0gZGIuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPiBtTmV3VmVyc2lvbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRhdGFiYXNlICIgKyBtTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBkb3duZ3JhZGVkLiBpbnN0ZWFkLCBwbGVhc2UgdW5pbnN0YWxsIG5ldyB2ZXJzaW9uIGZpcnN0LiIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbU5ld1ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTE3NSw4ICsyMTIsMTMgQEAKICAgICAgKiAgICAgb3Ige0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0UmVhZGFibGVEYXRhYmFzZSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSAhPSBudWxsICYmIG1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZTsgIC8vIFRoZSBkYXRhYmFzZSBpcyBhbHJlYWR5IG9wZW4gZm9yIGJ1c2luZXNzCisgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkYXJuISB0aGUgdXNlciBjbG9zZWQgdGhlIGRhdGFiYXNlIGJ5IGNhbGxpbmcgbURhdGFiYXNlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURhdGFiYXNlOyAgLy8gVGhlIGRhdGFiYXNlIGlzIGFscmVhZHkgb3BlbiBmb3IgYnVzaW5lc3MKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSXNJbml0aWFsaXppbmcpIHsKQEAgLTE5NCw3ICsyMzYsOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbUlzSW5pdGlhbGl6aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbUNvbnRleHQuZ2V0RGF0YWJhc2VQYXRoKG1OYW1lKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBtRmFjdG9yeSwgU1FMaXRlRGF0YWJhc2UuT1BFTl9SRUFET05MWSk7CisgICAgICAgICAgICBkYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5EYXRhYmFzZShwYXRoLCBtRmFjdG9yeSwgU1FMaXRlRGF0YWJhc2UuT1BFTl9SRUFET05MWSwKKyAgICAgICAgICAgICAgICAgICAgbUVycm9ySGFuZGxlcik7CiAgICAgICAgICAgICBpZiAoZGIuZ2V0VmVyc2lvbigpICE9IG1OZXdWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTGl0ZUV4Y2VwdGlvbigiQ2FuJ3QgdXBncmFkZSByZWFkLW9ubHkgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgZGIuZ2V0VmVyc2lvbigpICsgIiB0byAiICsgbU5ld1ZlcnNpb24gKyAiOiAiICsgcGF0aCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVPdXRPZk1lbW9yeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2U4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZU91dE9mTWVtb3J5RXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVQcm9ncmFtLmphdmEKaW5kZXggNGQ5NmYxMi4uYzdjMGM3OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVByb2dyYW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUHJvZ3JhbS5qYXZhCkBAIC0xNiwxMSArMTYsMTUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKIAoraW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBjb21waWxlZCBTUUxpdGUgcHJvZ3JhbXMuCi0gKgorICo8cD4KICAqIFNRTGl0ZVByb2dyYW0gaXMgbm90IGludGVybmFsbHkgc3luY2hyb25pemVkIHNvIGNvZGUgdXNpbmcgYSBTUUxpdGVQcm9ncmFtIGZyb20gbXVsdGlwbGUKICAqIHRocmVhZHMgc2hvdWxkIHBlcmZvcm0gaXRzIG93biBzeW5jaHJvbml6YXRpb24gd2hlbiB1c2luZyB0aGUgU1FMaXRlUHJvZ3JhbS4KICAqLwpAQCAtNDMsMTIgKzQ3LDEyIEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5IYW5kbGUgPSAwOworICAgIHByb3RlY3RlZCBpbnQgbkhhbmRsZTsKIAogICAgIC8qKgogICAgICAqIHRoZSBTUUxpdGVDb21waWxlZFNxbCBvYmplY3QgZm9yIHRoZSBnaXZlbiBzcWwgc3RhdGVtZW50LgogICAgICAqLwotICAgIHByaXZhdGUgU1FMaXRlQ29tcGlsZWRTcWwgbUNvbXBpbGVkU3FsOworICAgIC8qIHBhY2thZ2UgKi8gU1FMaXRlQ29tcGlsZWRTcWwgbUNvbXBpbGVkU3FsOwogCiAgICAgLyoqCiAgICAgICogU1FMaXRlQ29tcGlsZWRTcWwgc3RhdGVtZW50IGlkIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBmcm9tIHRoZSBhYm92ZQpAQCAtNTYsNDEgKzYwLDc2IEBACiAgICAgICogQGRlcHJlY2F0ZWQgZG8gbm90IHVzZSB0aGlzCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgaW50IG5TdGF0ZW1lbnQgPSAwOworICAgIHByb3RlY3RlZCBpbnQgblN0YXRlbWVudDsKKworICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIG9mIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LCB0aGlzIG1lbWJlciBzdG9yZXMgdGhlIGJpbmRhcmdzIHBhc3NlZAorICAgICAqIHRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kcywgaW5zdGVhZCBvZiBhY3R1YWxseSBkb2luZyB0aGUgYmluZGluZy4KKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kQmxvYihpbnQsIGJ5dGVbXSl9PC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgI2JpbmREb3VibGUoaW50LCBkb3VibGUpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTG9uZyhpbnQsIGxvbmcpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kTnVsbChpbnQpfTwvbGk+CisgICAgICogICA8bGk+e0BsaW5rICNiaW5kU3RyaW5nKGludCwgU3RyaW5nKX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBQYWlyIG9mCisgICAgICogPG9sPgorICAgICAqICAgPGxpPmJpbmQgYXJnIHBvc2l0aW9uIG51bWJlcjwvbGk+CisgICAgICogICA8bGk+dGhlIHZhbHVlIHRvIGJlIGJvdW5kIHRvIHRoZSBiaW5kYXJnPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIGxhemlseSBpbml0aWFsaXplZCBpbiB0aGUgYWJvdmUgYmluZCBtZXRob2RzCisgICAgICogYW5kIGl0IGlzIGNsZWFyZWQgaW4ge0BsaW5rICNjbGVhckJpbmRpbmdzKCl9IG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBwcm90ZWN0ZWQgKGluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50KSBieSB7QGxpbmsgU1FMaXRlUHJvZ3JhbX0udGhpcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG1CaW5kQXJncyA9IG51bGw7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBpbnQgbVN0YXRlbWVudFR5cGU7CiAKICAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVByb2dyYW0oU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKLSAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIHRoaXMoZGIsIHNxbCwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVQcm9ncmFtKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsLCBPYmplY3RbXSBiaW5kQXJncywKKyAgICAgICAgICAgIGJvb2xlYW4gY29tcGlsZUZsYWcpIHsKICAgICAgICAgbVNxbCA9IHNxbC50cmltKCk7CisgICAgICAgIG1TdGF0ZW1lbnRUeXBlID0gRGF0YWJhc2VVdGlscy5nZXRTcWxTdGF0ZW1lbnRUeXBlKG1TcWwpOwogICAgICAgICBkYi5hY3F1aXJlUmVmZXJlbmNlKCk7CiAgICAgICAgIGRiLmFkZFNRTGl0ZUNsb3NhYmxlKHRoaXMpOwotICAgICAgICB0aGlzLm5IYW5kbGUgPSBkYi5tTmF0aXZlSGFuZGxlOworICAgICAgICBtRGF0YWJhc2UgPSBkYjsKKyAgICAgICAgbkhhbmRsZSA9IGRiLm1OYXRpdmVIYW5kbGU7CisgICAgICAgIGlmIChiaW5kQXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGJpbmRBcmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0JpbmRBcmdzKGkgKyAxLCBiaW5kQXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBpbGVGbGFnKSB7CisgICAgICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBjb21waWxlU3FsKCkgewogICAgICAgICAvLyBvbmx5IGNhY2hlIENSVUQgc3RhdGVtZW50cwotICAgICAgICBTdHJpbmcgcHJlZml4U3FsID0gbVNxbC5zdWJzdHJpbmcoMCwgNik7Ci0gICAgICAgIGlmICghcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIklOU0VSVCIpICYmICFwcmVmaXhTcWwuZXF1YWxzSWdub3JlQ2FzZSgiVVBEQVRFIikgJiYKLSAgICAgICAgICAgICAgICAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlJFUExBQyIpICYmCi0gICAgICAgICAgICAgICAgIXByZWZpeFNxbC5lcXVhbHNJZ25vcmVDYXNlKCJERUxFVEUiKSAmJiAhcHJlZml4U3FsLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpKSB7Ci0gICAgICAgICAgICBtQ29tcGlsZWRTcWwgPSBuZXcgU1FMaXRlQ29tcGlsZWRTcWwoZGIsIHNxbCk7CisgICAgICAgIGlmIChtU3RhdGVtZW50VHlwZSAhPSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9TRUxFQ1QgJiYKKyAgICAgICAgICAgICAgICBtU3RhdGVtZW50VHlwZSAhPSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9VUERBVEUpIHsKKyAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgblN0YXRlbWVudCA9IG1Db21waWxlZFNxbC5uU3RhdGVtZW50OwogICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgbm90IGluIHRoZSBjYWNoZSwgbm8gbmVlZCB0byBhY3F1aXJlKCkgaXQuCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBpdCBpcyBub3QgcHJhZ21hCi0gICAgICAgIG1Db21waWxlZFNxbCA9IGRiLmdldENvbXBpbGVkU3RhdGVtZW50Rm9yU3FsKHNxbCk7CisgICAgICAgIG1Db21waWxlZFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChtU3FsKTsKICAgICAgICAgaWYgKG1Db21waWxlZFNxbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY29tcGlsZWQtc3FsIG9iagotICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOworICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKG1EYXRhYmFzZSwgbVNxbCk7CiAKICAgICAgICAgICAgIC8vIGFkZCBpdCB0byB0aGUgY2FjaGUgb2YgY29tcGlsZWQtc3FscwogICAgICAgICAgICAgLy8gYnV0IGJlZm9yZSBhZGRpbmcgaXQgYW5kIHRodXMgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgYW55b25lIGVsc2UgdG8gdXNlIGl0LAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGl0IGlzIGFjcXVpcmVkIGJ5IG1lLgogICAgICAgICAgICAgbUNvbXBpbGVkU3FsLmFjcXVpcmUoKTsKLSAgICAgICAgICAgIGRiLmFkZFRvQ29tcGlsZWRRdWVyaWVzKHNxbCwgbUNvbXBpbGVkU3FsKTsKLSAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkNyZWF0ZWQgRGJPYmogKGlkIyIgKyBtQ29tcGlsZWRTcWwublN0YXRlbWVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKSBmb3Igc3FsOiAiICsgc3FsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhYmFzZS5hZGRUb0NvbXBpbGVkUXVlcmllcyhtU3FsLCBtQ29tcGlsZWRTcWwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaXQgaXMgYWxyZWFkeSBpbiBjb21waWxlZC1zcWwgY2FjaGUuCiAgICAgICAgICAgICAvLyB0cnkgdG8gYWNxdWlyZSB0aGUgb2JqZWN0LgpAQCAtMTAwLDEzICsxMzksNyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IGhhdmUgdHdvIGRpZmZlcmVudCBTUUxpdGVQcm9nYW0gb2JqZWN0cyBjYW4ndCBzaGFyZSB0aGUgc2FtZQogICAgICAgICAgICAgICAgIC8vIENvbXBpbGVkU3FsIG9iamVjdC4gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSBpdCB3aGVuIEkgYW0gZG9uZSB3aXRoIGl0IGluICJ0aGlzIiBvYmplY3QuCi0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpOwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19BQ1RJVkVfQ1VSU09SX0ZJTkFMSVpBVElPTikgewotICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIqKiBwb3NzaWJsZSBidWcgKiogQ3JlYXRlZCBORVcgRGJPYmogKGlkIyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5uU3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBiZWNhdXNlIHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgRGJPYmogKGlkIyIgKyBsYXN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSB3YXMgbm90IHJlbGVhc2VkIGZvciBzcWw6IiArIHNxbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbCA9IG5ldyBTUUxpdGVDb21waWxlZFNxbChtRGF0YWJhc2UsIG1TcWwpOwogICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIG5vdCBpbiB0aGUgY2FjaGUsIG5vIG5lZWQgdG8gYWNxdWlyZSgpIGl0LgogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTUsMTggKzE0OCwxOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BbGxSZWZlcmVuY2VzUmVsZWFzZWQoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOwotICAgICAgICBtRGF0YWJhc2UucmVsZWFzZVJlZmVyZW5jZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZW1vdmVTUUxpdGVDbG9zYWJsZSh0aGlzKTsKKyAgICAgICAgbURhdGFiYXNlLnJlbGVhc2VSZWZlcmVuY2UoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFsbFJlZmVyZW5jZXNSZWxlYXNlZEZyb21Db250YWluZXIoKSB7Ci0gICAgICAgIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpOworICAgICAgICByZWxlYXNlKCk7CiAgICAgICAgIG1EYXRhYmFzZS5yZWxlYXNlUmVmZXJlbmNlKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb21waWxlZFNxbElmTm90SW5DYWNoZSgpIHsKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7CiAgICAgICAgIGlmIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMzUsMjIgKzE2OCwzNCBAQAogICAgICAgICAgICAgICAgIC8vIGl0IGlzIE5PVCBpbiBjb21waWxlZC1zcWwgY2FjaGUuIGkuZS4sIHJlc3BvbnNpYmlsaXR5IG9mCiAgICAgICAgICAgICAgICAgLy8gcmVsZWFzaW5nIHRoaXMgc3RhdGVtZW50IGlzIG9uIG1lLgogICAgICAgICAgICAgICAgIG1Db21waWxlZFNxbC5yZWxlYXNlU3FsU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgbUNvbXBpbGVkU3FsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuU3RhdGVtZW50ID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gaXQgaXMgaW4gY29tcGlsZWQtc3FsIGNhY2hlLiByZXNldCBpdHMgQ29tcGlsZWRTcWwjbUluVXNlIGZsYWcKICAgICAgICAgICAgICAgICBtQ29tcGlsZWRTcWwucmVsZWFzZSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgIG1Db21waWxlZFNxbCA9IG51bGw7CisgICAgICAgIG5TdGF0ZW1lbnQgPSAwOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9ncmFtLgogICAgICAqCiAgICAgICogQHJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHByb2dyYW0KKyAgICAgKiBAZGVwcmVjYXRlZCBkbyBub3QgdXNlIHRoaXMgbWV0aG9kLiBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBhY3Jvc3MgZXhlY3V0aW9ucyBvZgorICAgICAqIHRoZSBTUUwgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VW5pcXVlSWQoKSB7Ci0gICAgICAgIHJldHVybiBuU3RhdGVtZW50OworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIHVzZWQgb25seSBmb3IgdGVzdGluZyBwdXJwb3NlcworICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gaW50IGdldFNxbFN0YXRlbWVudElkKCkgeworICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgcmV0dXJuIChtQ29tcGlsZWRTcWwgPT0gbnVsbCkgPyAwIDogblN0YXRlbWVudDsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBnZXRTcWxTdHJpbmcoKSB7CkBAIC0xNjksNiArMjE0LDM5IEBACiAgICAgICAgIC8vIFRPRE8gaXMgdGhlcmUgYSBuZWVkIGZvciB0aGlzPwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBiaW5kKGludCB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICAgICAgYWRkVG9CaW5kQXJncyhpbmRleCwgKHR5cGUgPT0gQ3Vyc29yLkZJRUxEX1RZUEVfTlVMTCkgPyBudWxsIDogdmFsdWUpOworICAgICAgICAgICAgaWYgKG5TdGF0ZW1lbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gYmluZCBvbmx5IGlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGNvbXBpbGVkCisgICAgICAgICAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX251bGwoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9CTE9COgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2Jsb2IoaW5kZXgsIChieXRlW10pIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCAoRG91YmxlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKExvbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBCaW5kIGEgTlVMTCB2YWx1ZSB0byB0aGlzIHN0YXRlbWVudC4gVGhlIHZhbHVlIHJlbWFpbnMgYm91bmQgdW50aWwKICAgICAgKiB7QGxpbmsgI2NsZWFyQmluZGluZ3N9IGlzIGNhbGxlZC4KQEAgLTE3NiwzNCArMjU0LDE4IEBACiAgICAgICogQHBhcmFtIGluZGV4IFRoZSAxLWJhc2VkIGluZGV4IHRvIHRoZSBwYXJhbWV0ZXIgdG8gYmluZCBudWxsIHRvCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZE51bGwoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9udWxsKGluZGV4KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX05VTEwsIGluZGV4LCBudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBCaW5kIGEgbG9uZyB2YWx1ZSB0byB0aGlzIHN0YXRlbWVudC4gVGhlIHZhbHVlIHJlbWFpbnMgYm91bmQgdW50aWwKICAgICAgKiB7QGxpbmsgI2NsZWFyQmluZGluZ3N9IGlzIGNhbGxlZC4KLSAgICAgKgorICAgICAqYWRkVG9CaW5kQXJncwogICAgICAqIEBwYXJhbSBpbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgcGFyYW1ldGVyIHRvIGJpbmQKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJpbmQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBiaW5kTG9uZyhpbnQgaW5kZXgsIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVIsIGluZGV4LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQsMTUgKzI3Niw3IEBACiAgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiaW5kCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfZG91YmxlKGluZGV4LCB2YWx1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgYmluZChDdXJzb3IuRklFTERfVFlQRV9GTE9BVCwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzNiwxNSArMjkwLDcgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRoZSBiaW5kIHZhbHVlIGF0IGluZGV4ICIgKyBpbmRleCArICIgaXMgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfYmluZF9zdHJpbmcoaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgfQorICAgICAgICBiaW5kKEN1cnNvci5GSUVMRF9UWVBFX1NUUklORywgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1OCwyOSArMzA0LDI1IEBACiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgYmluZCB2YWx1ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG51bGwiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmF0aXZlX2JpbmRfYmxvYihpbmRleCwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICB9CisgICAgICAgIGJpbmQoQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQiwgaW5kZXgsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgYWxsIGV4aXN0aW5nIGJpbmRpbmdzLiBVbnNldCBiaW5kaW5ncyBhcmUgdHJlYXRlZCBhcyBOVUxMLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyQmluZGluZ3MoKSB7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuYXRpdmVfY2xlYXJfYmluZGluZ3MoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBudWxsOworICAgICAgICAgICAgaWYgKHRoaXMublN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGFiYXNlLnZlcmlmeURiSXNPcGVuKCk7CisgICAgICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9jbGVhcl9iaW5kaW5ncygpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4OCwxOCArMzMwLDc2IEBACiAgICAgICogUmVsZWFzZSB0aGlzIHByb2dyYW0ncyByZXNvdXJjZXMsIG1ha2luZyBpdCBpbnZhbGlkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1CaW5kQXJncyA9IG51bGw7CisgICAgICAgICAgICBpZiAobkhhbmRsZSA9PSAwIHx8ICFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFRvQmluZEFyZ3MoaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1CaW5kQXJncyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQmluZEFyZ3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgbUJpbmRBcmdzLnB1dChpbmRleCwgdmFsdWUpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3luY2hyb25pemVkIHZvaWQgY29tcGlsZUFuZGJpbmRBbGxBcmdzKCkgeworICAgICAgICBpZiAoblN0YXRlbWVudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBTUUwgc3RhdGVtZW50IGlzIG5vdCBjb21waWxlZCB5ZXQuIGNvbXBpbGUgaXQgbm93LgorICAgICAgICAgICAgY29tcGlsZVNxbCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtQmluZEFyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4IDogbUJpbmRBcmdzLmtleVNldCgpKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQmluZEFyZ3MuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbnVsbChpbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlIHx8IHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9kb3VibGUoaW5kZXgsICgoTnVtYmVyKSB2YWx1ZSkuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2JpbmRfbG9uZyhpbmRleCwgKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbCA9IChCb29sZWFuKXZhbHVlOworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX2xvbmcoaW5kZXgsIChib29sKSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICBpZiAoYm9vbCkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9sb25nKGluZGV4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKXsKKyAgICAgICAgICAgICAgICBuYXRpdmVfYmluZF9ibG9iKGluZGV4LCAoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9iaW5kX3N0cmluZyhpbmRleCwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBTdHJpbmcgYmluZEFyZ3MsIHRoaXMgbWV0aG9kIGJpbmRzIGFsbCBvZiB0aGVtIGluIG9uZSBzaW5nbGUgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kQXJncyB0aGUgU3RyaW5nIGFycmF5IG9mIGJpbmQgYXJncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kQWxsQXJnc0FzU3RyaW5ncyhTdHJpbmdbXSBiaW5kQXJncykgeworICAgICAgICBpZiAoYmluZEFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gYmluZEFyZ3MubGVuZ3RoOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBiaW5kU3RyaW5nKGkgKyAxLCBiaW5kQXJnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldE5hdGl2ZUhhbmRsZShpbnQgbkhhbmRsZSkgeworICAgICAgICB0aGlzLm5IYW5kbGUgPSBuSGFuZGxlOworICAgIH0KKworICAgIC8qKgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQuCiAgICAgICogQ29tcGlsZXMgU1FMIGludG8gYSBTUUxpdGUgcHJvZ3JhbS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQppbmRleCA5MDViNjZiLi5lOWUwMTcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnkuamF2YQpAQCAtMjgsMjggKzI4LDM4IEBACiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVF1ZXJ5LgogICovCiBwdWJsaWMgY2xhc3MgU1FMaXRlUXVlcnkgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkN1cnNvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTUUxpdGVRdWVyeSI7CiAKICAgICAvKiogVGhlIGluZGV4IG9mIHRoZSB1bmJvdW5kIE9GRlNFVCBwYXJhbWV0ZXIgKi8KLSAgICBwcml2YXRlIGludCBtT2Zmc2V0SW5kZXg7Ci0gICAgCi0gICAgLyoqIEFyZ3MgdG8gYmluZCBvbiByZXF1ZXJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtQmluZEFyZ3M7CisgICAgcHJpdmF0ZSBpbnQgbU9mZnNldEluZGV4ID0gMDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2VkID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBwZXJzaXN0ZW50IHF1ZXJ5IG9iamVjdC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBkYiBUaGUgZGF0YWJhc2UgdGhhdCB0aGlzIHF1ZXJ5IG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIFNRTCBzdHJpbmcgZm9yIHRoaXMgcXVlcnkuIAogICAgICAqIEBwYXJhbSBvZmZzZXRJbmRleCBUaGUgMS1iYXNlZCBpbmRleCB0byB0aGUgT0ZGU0VUIHBhcmFtZXRlciwgCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHF1ZXJ5LCBpbnQgb2Zmc2V0SW5kZXgsIFN0cmluZ1tdIGJpbmRBcmdzKSB7CiAgICAgICAgIHN1cGVyKGRiLCBxdWVyeSk7Ci0KICAgICAgICAgbU9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7Ci0gICAgICAgIG1CaW5kQXJncyA9IGJpbmRBcmdzOworICAgICAgICBiaW5kQWxsQXJnc0FzU3RyaW5ncyhiaW5kQXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlIHRvIHJlcGxhY2UgYSBnaXZlbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIHRoZSBjdXJyZW50IFF1ZXJ5IG9iamVjdCBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50CisgICAgICoge0BsaW5rIFNRTGl0ZURhdGFiYXNlfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGIgVGhlIGRhdGFiYXNlIHRoYXQgdGhpcyBxdWVyeSBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgU1FMaXRlUXVlcnl9IHRvIGJlIHJlcGxhY2VkCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBTUUxpdGVRdWVyeShTUUxpdGVEYXRhYmFzZSBkYiwgU1FMaXRlUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgc3VwZXIoZGIsIHF1ZXJ5Lm1TcWwpOworICAgICAgICB0aGlzLm1CaW5kQXJncyA9IHF1ZXJ5Lm1CaW5kQXJnczsKKyAgICAgICAgdGhpcy5tT2Zmc2V0SW5kZXggPSBxdWVyeS5tT2Zmc2V0SW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MCwxMyArODAsOCBAQAogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGFydCBwb3MgaXMgbm90IGVxdWFsIHRvIDAsIHRoZW4gbW9zdCBsaWtlbHkgd2luZG93IGlzCiAgICAgICAgICAgICAgICAgLy8gdG9vIHNtYWxsIGZvciB0aGUgZGF0YSBzZXQsIGxvYWRpbmcgYnkgYW5vdGhlciB0aHJlYWQKICAgICAgICAgICAgICAgICAvLyBpcyBub3Qgc2FmZSBpbiB0aGlzIHNpdHVhdGlvbi4gdGhlIG5hdGl2ZSBjb2RlIHdpbGwgaWdub3JlIG1heFJlYWQKLSAgICAgICAgICAgICAgICBpbnQgbnVtUm93cyA9IG5hdGl2ZV9maWxsX3dpbmRvdyh3aW5kb3csIHdpbmRvdy5nZXRTdGFydFBvc2l0aW9uKCksIG1PZmZzZXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlYWQsIGxhc3RQb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gTG9nZ2luZwotICAgICAgICAgICAgICAgIGlmIChTUUxpdGVEZWJ1Zy5ERUJVR19TUUxfU1RBVEVNRU5UUykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmaWxsV2luZG93KCk6ICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG51bVJvd3MgPSBuYXRpdmVfZmlsbF93aW5kb3cod2luZG93LCB3aW5kb3cuZ2V0U3RhcnRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldEluZGV4LCBtYXhSZWFkLCBsYXN0UG9zKTsKICAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVtUm93czsKICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKXsKQEAgLTg1LDYgKzkwLDkgQEAKICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZURhdGFiYXNlQ29ycnVwdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgbURhdGFiYXNlLm9uQ29ycnVwdGlvbigpOwogICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIjsgcXVlcnk6ICIgKyBtU3FsKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICB3aW5kb3cucmVsZWFzZVJlZmVyZW5jZSgpOwogICAgICAgICAgICAgfQpAQCAtMTQxLDUxICsxNDksMTMgQEAKICAgICAgKiBDYWxsZWQgYnkgU1FMaXRlQ3Vyc29yIHdoZW4gaXQgaXMgcmVxdWVyaWVkLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZXF1ZXJ5KCkgewotICAgICAgICBpZiAobUJpbmRBcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBsZW4gPSBtQmluZEFyZ3MubGVuZ3RoOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cGVyLmJpbmRTdHJpbmcoaSArIDEsIG1CaW5kQXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlTWlzdXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJtU3FsICIgKyBtU3FsKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChtQmluZEFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGxlYWtQcm9ncmFtID0gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyck1zZy50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBsZWFrUHJvZ3JhbTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJyZXF1ZXJ5aW5nIGEgY2xvc2VkIGN1cnNvciIpOwogICAgICAgICB9CisgICAgICAgIGNvbXBpbGVBbmRiaW5kQWxsQXJncygpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmROdWxsKGludCBpbmRleCkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IG51bGw7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZE51bGwoaW5kZXgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRMb25nKGludCBpbmRleCwgbG9uZyB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgICAgICBpZiAoIW1DbG9zZWQpIHN1cGVyLmJpbmRMb25nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYmluZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotICAgICAgICBtQmluZEFyZ3NbaW5kZXggLSAxXSA9IERvdWJsZS50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghbUNsb3NlZCkgc3VwZXIuYmluZERvdWJsZShpbmRleCwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGJpbmRTdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbUJpbmRBcmdzW2luZGV4IC0gMV0gPSB2YWx1ZTsKLSAgICAgICAgaWYgKCFtQ2xvc2VkKSBzdXBlci5iaW5kU3RyaW5nKGluZGV4LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCAKKyAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgbmF0aXZlX2ZpbGxfd2luZG93KEN1cnNvcldpbmRvdyB3aW5kb3csCiAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsIGludCBvZmZzZXRQYXJhbSwgaW50IG1heFJlYWQsIGludCBsYXN0UG9zKTsKIAogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfY29sdW1uX2NvdW50KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVJlYWRPbmx5RGF0YWJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYzM2M2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVSZWFkT25seURhdGFiYXNlRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbigpIHt9CisKKyAgICBwdWJsaWMgU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbihTdHJpbmcgZXJyb3IpIHsKKyAgICAgICAgc3VwZXIoZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnQuamF2YQppbmRleCA5ZTQyNWMzLi5hNWE4YTkyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlU3RhdGVtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudC5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOwogCitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IGRhbHZpay5zeXN0ZW0uQmxvY2tHdWFyZDsKIApAQCAtMjUsNDQgKzMwLDY1IEBACiAgKiBUaGUgc3RhdGVtZW50IGNhbm5vdCByZXR1cm4gbXVsdGlwbGUgcm93cywgYnV0IDF4MSByZXN1bHQgc2V0cyBhcmUgYWxsb3dlZC4KICAqIERvbid0IHVzZSBTUUxpdGVTdGF0ZW1lbnQgY29uc3RydWN0b3IgZGlyZWN0bHksIHBsZWFzZSB1c2UKICAqIHtAbGluayBTUUxpdGVEYXRhYmFzZSNjb21waWxlU3RhdGVtZW50KFN0cmluZyl9Ci0gKgorICo8cD4KICAqIFNRTGl0ZVN0YXRlbWVudCBpcyBub3QgaW50ZXJuYWxseSBzeW5jaHJvbml6ZWQgc28gY29kZSB1c2luZyBhIFNRTGl0ZVN0YXRlbWVudCBmcm9tIG11bHRpcGxlCiAgKiB0aHJlYWRzIHNob3VsZCBwZXJmb3JtIGl0cyBvd24gc3luY2hyb25pemF0aW9uIHdoZW4gdXNpbmcgdGhlIFNRTGl0ZVN0YXRlbWVudC4KICAqLworQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKIHB1YmxpYyBjbGFzcyBTUUxpdGVTdGF0ZW1lbnQgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtCiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNRTGl0ZVN0YXRlbWVudCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQUQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gV1JJVEUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbU9yaWdEYjsKKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisgICAgLyoqIHBvc3NpYmxlIHZhbHVlIGZvciB7QGxpbmsgI21TdGF0ZX0uIGluZGljYXRlcyB0aGF0IGEgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZC59ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TX1NUQVJURUQgPSAxOworICAgIC8qKiBwb3NzaWJsZSB2YWx1ZSBmb3Ige0BsaW5rICNtU3RhdGV9LiBpbmRpY2F0ZXMgdGhhdCBhIGxvY2sgaXMgYWNxdWlyZWQufSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NLX0FDUVVJUkVEID0gMjsKKwogICAgIC8qKgogICAgICAqIERvbid0IHVzZSBTUUxpdGVTdGF0ZW1lbnQgY29uc3RydWN0b3IgZGlyZWN0bHksIHBsZWFzZSB1c2UKICAgICAgKiB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjY29tcGlsZVN0YXRlbWVudChTdHJpbmcpfQogICAgICAqIEBwYXJhbSBkYgogICAgICAqIEBwYXJhbSBzcWwKICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVN0YXRlbWVudChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgewotICAgICAgICBzdXBlcihkYiwgc3FsKTsKKyAgICAvKiBwYWNrYWdlICovIFNRTGl0ZVN0YXRlbWVudChTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCwgT2JqZWN0W10gYmluZEFyZ3MpIHsKKyAgICAgICAgc3VwZXIoZGIsIHNxbCwgYmluZEFyZ3MsIGZhbHNlIC8qIGRvbid0IGNvbXBpbGUgc3FsIHN0YXRlbWVudCAqLyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGlzIFNRTCBzdGF0ZW1lbnQsIGlmIGl0IGlzIG5vdCBhIHF1ZXJ5LiBGb3IgZXhhbXBsZSwKLSAgICAgKiBDUkVBVEUgVEFCTEUsIERFTFRFLCBJTlNFUlQsIGV0Yy4KKyAgICAgKiBFeGVjdXRlIHRoaXMgU1FMIHN0YXRlbWVudCwgaWYgaXQgaXMgbm90IGEgU0VMRUNUIC8gSU5TRVJUIC8gREVMRVRFIC8gVVBEQVRFLCBmb3IgZXhhbXBsZQorICAgICAqIENSRUFURSAvIERST1AgdGFibGUsIHZpZXcsIHRyaWdnZXIsIGluZGV4IGV0Yy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb24gSWYgdGhlIFNRTCBzdHJpbmcgaXMgaW52YWxpZCBmb3IKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOworICAgICAgICBleGVjdXRlVXBkYXRlRGVsZXRlKCk7CisgICAgfQogCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoaXMgU1FMIHN0YXRlbWVudCwgaWYgdGhlIHRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCBieSBleGVjdGlvbiBvZiB0aGlzIFNRTAorICAgICAqIHN0YXRlbWVudCBpcyBvZiBhbnkgaW1wb3J0YW5jZSB0byB0aGUgY2FsbGVyIC0gZm9yIGV4YW1wbGUsIFVQREFURSAvIERFTEVURSBTUUwgc3RhdGVtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGJ5IHRoaXMgU1FMIHN0YXRlbWVudCBleGVjdXRpb24uCisgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLlNRTEV4Y2VwdGlvbiBJZiB0aGUgU1FMIHN0cmluZyBpcyBpbnZhbGlkIGZvcgorICAgICAqICAgICAgICAgc29tZSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGV4ZWN1dGVVcGRhdGVEZWxldGUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFdSSVRFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG51bUNoYW5nZXMgPSBuYXRpdmVfZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBudW1DaGFuZ2VzOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc2LDIxICsxMDIsMTUgQEAKICAgICAgKiAgICAgICAgIHNvbWUgcmVhc29uCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZXhlY3V0ZUluc2VydCgpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vbldyaXRlVG9EaXNrKCk7Ci0gICAgICAgIGlmICghbURhdGFiYXNlLmlzT3BlbigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkYXRhYmFzZSAiICsgbURhdGFiYXNlLmdldFBhdGgoKSArICIgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIHRpbWVTdGFydCA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtRGF0YWJhc2UubG9jaygpOwotCi0gICAgICAgIGFjcXVpcmVSZWZlcmVuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hdGl2ZV9leGVjdXRlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiAobURhdGFiYXNlLmxhc3RDaGFuZ2VDb3VudCgpID4gMCkgPyBtRGF0YWJhc2UubGFzdEluc2VydFJvdygpIDogLTE7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFdSSVRFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBsYXN0SW5zZXJ0ZWRSb3dJZCA9IG5hdGl2ZV9leGVjdXRlSW5zZXJ0KCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLmxvZ1RpbWVTdGF0KG1TcWwsIHRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RJbnNlcnRlZFJvd0lkOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMywyMSArMTIzLDE1IEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHNpbXBsZVF1ZXJ5Rm9yTG9uZygpIHsKLSAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOwotICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc09wZW4oKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGF0YWJhc2UgIiArIG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiIGFscmVhZHkgY2xvc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKLQotICAgICAgICBhY3F1aXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9sb25nKCk7Ci0gICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlbGVhc2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gYWNxdWlyZUFuZExvY2soUkVBRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgcmV0VmFsdWUgPSBuYXRpdmVfMXgxX2xvbmcoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTMwLDI1ICsxNDQsMTM2IEBACiAgICAgICogQHRocm93cyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEb25lRXhjZXB0aW9uIGlmIHRoZSBxdWVyeSByZXR1cm5zIHplcm8gcm93cwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgc2ltcGxlUXVlcnlGb3JTdHJpbmcoKSB7Ci0gICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25SZWFkRnJvbURpc2soKTsKLSAgICAgICAgaWYgKCFtRGF0YWJhc2UuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImRhdGFiYXNlICIgKyBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIiBhbHJlYWR5IGNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdGltZVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7Ci0KLSAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9zdHJpbmcoKTsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5sb2dUaW1lU3RhdChtU3FsLCB0aW1lU3RhcnQpOwotICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZVJlZmVyZW5jZSgpOwotICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgbG9uZyB0aW1lU3RhcnQgPSBhY3F1aXJlQW5kTG9jayhSRUFEKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gbmF0aXZlXzF4MV9zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VBbmRVbmxvY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWN1dGUoKTsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhIHN0YXRlbWVudCB0aGF0IHJldHVybnMgYSAxIGJ5IDEgdGFibGUgd2l0aCBhIGJsb2IgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgcmVhZC1vbmx5IGZpbGUgZGVzY3JpcHRvciBmb3IgYSBjb3B5IG9mIHRoZSBibG9iIHZhbHVlLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSB2YWx1ZSBpcyBudWxsIG9yIGNvdWxkIG5vdCBiZSByZWFkIGZvciBzb21lIHJlYXNvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRG9uZUV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igc2ltcGxlUXVlcnlGb3JCbG9iRmlsZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVTdGFydCA9IGFjcXVpcmVBbmRMb2NrKFJFQUQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciByZXRWYWx1ZSA9IG5hdGl2ZV8xeDFfYmxvYl9hc2htZW0oKTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UubG9nVGltZVN0YXQobVNxbCwgdGltZVN0YXJ0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInNpbXBsZVF1ZXJ5Rm9yQmxvYkZpbGVEZXNjcmlwdG9yKCkgZmFpbGVkIiwgZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQW5kVW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV2ZXJ5IG1ldGhvZCBpbiB0aGlzIGNsYXNzIGJlZm9yZSBleGVjdXRpbmcgYSBTUUwgc3RhdGVtZW50LAorICAgICAqIHRoaXMgbWV0aG9kIGRvZXMgdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+bWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBpcyBvcGVuPC9saT4KKyAgICAgKiAgIDxsaT5nZXQgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCxpZiBwb3NzaWJsZTwvbGk+CisgICAgICogICA8bGk+bm90aWZpZXMge0BsaW5rIEJsb2NrR3VhcmR9IG9mIHJlYWQvd3JpdGU8L2xpPgorICAgICAqICAgPGxpPmlmIHRoZSBTUUwgc3RhdGVtZW50IGlzIGFuIHVwZGF0ZSwgc3RhcnQgdHJhbnNhY3Rpb24gaWYgbm90IGFscmVhZHkgaW4gb25lLgorICAgICAqICAgb3RoZXJ3aXNlLCBnZXQgbG9jayBvbiB0aGUgZGF0YWJhc2U8L2xpPgorICAgICAqICAgPGxpPmFjcXVpcmUgcmVmZXJlbmNlIG9uIHRoaXMgb2JqZWN0PC9saT4KKyAgICAgKiAgIDxsaT5hbmQgdGhlbiByZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBfYmVmb3JlXyB0aGUgZGF0YWJhc2UgbG9jayB3YXMgYWNxdWlyZWQ8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZHVwbGljYXRlIGNvZGUgZnJvbSB0aGUgb3RoZXIgcHVibGljCisgICAgICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhY3F1aXJlQW5kTG9jayhib29sZWFuIHJ3RmxhZykgeworICAgICAgICBtU3RhdGUgPSAwOworICAgICAgICAvLyB1c2UgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlcyBmb3IgU0VMRUNUIFNRTCBzdGF0ZW1lbnRzCisgICAgICAgIG1EYXRhYmFzZS52ZXJpZnlEYklzT3BlbigpOworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IChtU3RhdGVtZW50VHlwZSAhPSBEYXRhYmFzZVV0aWxzLlNUQVRFTUVOVF9TRUxFQ1QpID8gbURhdGFiYXNlCisgICAgICAgICAgICAgICAgOiBtRGF0YWJhc2UuZ2V0RGJDb25uZWN0aW9uKG1TcWwpOworICAgICAgICAvLyB1c2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2J0YWluZWQgYWJvdmUKKyAgICAgICAgbU9yaWdEYiA9IG1EYXRhYmFzZTsKKyAgICAgICAgbURhdGFiYXNlID0gZGI7CisgICAgICAgIHNldE5hdGl2ZUhhbmRsZShtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSk7CisgICAgICAgIGlmIChyd0ZsYWcgPT0gV1JJVEUpIHsKKyAgICAgICAgICAgIEJsb2NrR3VhcmQuZ2V0VGhyZWFkUG9saWN5KCkub25Xcml0ZVRvRGlzaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmxvY2tHdWFyZC5nZXRUaHJlYWRQb2xpY3koKS5vblJlYWRGcm9tRGlzaygpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mIFNRTGl0ZURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikuCisgICAgICAgICAqIHdlIGtub3cgaXQgaXMgZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKSBmcm9tIHRoZSBjYWxsZXIgSUYgdGhlcmUgaXMgbm8gbG9jayBoZWxkLgorICAgICAgICAgKiBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbiBTUUxpdGVEYXRhYmFzZSBjYWxsIGxvY2tGb3JjZWQoKSBiZWZvcmUKKyAgICAgICAgICogY2FsbGluZyBleGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0JFR0lOKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2FjdGlvbiBpcyAgTk9UIHN0YXJ0ZWQgYnkgY2FsbGluZyBiZWdpblRyYW5zYWN0aW9uKCkgbWV0aG9kcyBpbgorICAgICAgICAgICAgICAgIC8vIFNRTGl0ZURhdGFiYXNlCisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uVXNpbmdFeGVjU3FsRmxhZygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX1VQREFURSkgeworICAgICAgICAgICAgLy8gZ290IHVwZGF0ZSBTUUwgc3RhdGVtZW50LiBpZiB0aGVyZSBpcyBOTyBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzdGFydCBvbmUKKyAgICAgICAgICAgIGlmICghbURhdGFiYXNlLmluVHJhbnNhY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gVFJBTlNfU1RBUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBkbyBJIGhhdmUgZGF0YWJhc2UgbG9jaz8gaWYgbm90LCBncmFiIGl0LgorICAgICAgICBpZiAoIW1EYXRhYmFzZS5pc0RiTG9ja2VkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBMT0NLX0FDUVVJUkVEOworICAgICAgICB9CisKKyAgICAgICAgYWNxdWlyZVJlZmVyZW5jZSgpOworICAgICAgICBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBtRGF0YWJhc2UuY2xvc2VQZW5kaW5nU3RhdGVtZW50cygpOworICAgICAgICBjb21waWxlQW5kYmluZEFsbEFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0aGlzIG1ldGhvZCByZWxlYXNlcyBsb2NrcyBhbmQgcmVmZXJlbmNlcyBhY3F1aXJlZCBpbiB7QGxpbmsgI2FjcXVpcmVBbmRMb2NrKGJvb2xlYW4pfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxlYXNlQW5kVW5sb2NrKCkgeworICAgICAgICByZWxlYXNlUmVmZXJlbmNlKCk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gVFJBTlNfU1RBUlRFRCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBMT0NLX0FDUVVJUkVEKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0NPTU1JVCB8fAorICAgICAgICAgICAgICAgIG1TdGF0ZW1lbnRUeXBlID09IERhdGFiYXNlVXRpbHMuU1RBVEVNRU5UX0FCT1JUKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UucmVzZXRUcmFuc2FjdGlvblVzaW5nRXhlY1NxbEZsYWcoKTsKKyAgICAgICAgfQorICAgICAgICBjbGVhckJpbmRpbmdzKCk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNvbXBpbGVkIHNxbCBzdGF0ZW1lbnQgc28gdGhhdCB0aGUgY2FsbGVyJ3MgU1FMaXRlU3RhdGVtZW50IG5vIGxvbmdlcgorICAgICAgICAvLyBoYXMgYSBoYXJkIHJlZmVyZW5jZSB0byBhIGRhdGFiYXNlIG9iamVjdCB0aGF0IG1heSBnZXQgZGVhbGxvY2F0ZWQgYXQgYW55IHBvaW50LgorICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBtRGF0YWJhc2UgPSBtT3JpZ0RiOworICAgICAgICBzZXROYXRpdmVIYW5kbGUobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBuYXRpdmVfZXhlY3V0ZSgpOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIGxvbmcgbmF0aXZlX2V4ZWN1dGVJbnNlcnQoKTsKICAgICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBsb25nIG5hdGl2ZV8xeDFfbG9uZygpOwogICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIFN0cmluZyBuYXRpdmVfMXgxX3N0cmluZygpOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZV8xeDFfYmxvYl9hc2htZW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzhkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworcHVibGljIGNsYXNzIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlVGFibGVMb2NrZWRFeGNlcHRpb24oKSB7fQorCisgICAgcHVibGljIFNRTGl0ZVRhYmxlTG9ja2VkRXhjZXB0aW9uKFN0cmluZyBlcnJvcikgeworICAgICAgICBzdXBlcihlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjk1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKKy8qKgorICogVGhyb3duIGlmIHRoZSBkYXRhYmFzZSBjYW4ndCBiZSBjbG9zZWQgYmVjYXVzZSBvZiBzb21lIHVuLWNsb3NlZAorICogQ3Vyc29yIG9yIFNRTGl0ZVN0YXRlbWVudCBvYmplY3RzLiBDb3VsZCBoYXBwZW4gd2hlbiBhIHRocmVhZCBpcyB0cnlpbmcgdG8gY2xvc2UKKyAqIHRoZSBkYXRhYmFzZSB3aGlsZSBhbm90aGVyIHRocmVhZCBzdGlsbCBoYXNuJ3QgY2xvc2VkIGEgQ3Vyc29yIG9uIHRoYXQgZGF0YWJhc2UuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGV4dGVuZHMgU1FMaXRlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uKCkge30KKworICAgIHB1YmxpYyBTUUxpdGVVbmZpbmFsaXplZE9iamVjdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yKSB7CisgICAgICAgIHN1cGVyKGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9Vc2IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCmluZGV4IDU3MjcxZDQuLmViYjgyOTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL1VzYi5qYXZhCkBAIC0xNyw2ICsxNywxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmU7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogLyoqCiAgKiBDbGFzcyBmb3IgYWNjZXNzaW5nIFVTQiBzdGF0ZSBpbmZvcm1hdGlvbi4KICAqIEBoaWRlCkBAIC01NSw2ICs1OSwyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfU1RBVEUgPQogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSI7CiAKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCBmb3IgVVNCIGNhbWVyYSBhdHRhY2hlZCBldmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgaW50ZW50IGlzIHNlbnQgd2hlbiBhIFVTQiBkZXZpY2Ugc3VwcG9ydGluZyBQVFAgaXMgYXR0YWNoZWQgdG8gdGhlIGhvc3QgVVNCIGJ1cy4KKyAgICAgKiBUaGUgaW50ZW50J3MgZGF0YSBjb250YWlucyBhIFVyaSBmb3IgdGhlIGRldmljZSBpbiB0aGUgTVRQIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VU0JfQ0FNRVJBX0FUVEFDSEVEID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0FUVEFDSEVEIjsKKworICAgLyoqCisgICAgICogQnJvYWRjYXN0IEFjdGlvbjogIEEgYnJvYWRjYXN0IGZvciBVU0IgY2FtZXJhIGRldGFjaGVkIGV2ZW50LgorICAgICAqCisgICAgICogVGhpcyBpbnRlbnQgaXMgc2VudCB3aGVuIGEgVVNCIGRldmljZSBzdXBwb3J0aW5nIFBUUCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IFVTQiBidXMuCisgICAgICogVGhlIGludGVudCdzIGRhdGEgY29udGFpbnMgYSBVcmkgZm9yIHRoZSBkZXZpY2UgaW4gdGhlIE1UUCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVVNCX0NBTUVSQV9ERVRBQ0hFRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9ERVRBQ0hFRCI7CisKICAgICAvKioKICAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgpAQCAtOTYsNCArMTE4LDMwIEBACiAgICAgICogVXNlZCBpbiBleHRyYXMgZm9yIHRoZSB7QGxpbmsgI0FDVElPTl9VU0JfQ09OTkVDVEVEfSBicm9hZGNhc3QKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfRlVOQ1RJT05fRElTQUJMRUQgPSAiZGlzYWJsZWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGdW5jdGlvbkVuYWJsZUZpbGUoU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZSgiL3N5cy9jbGFzcy91c2JfY29tcG9zaXRlLyIgKyBmdW5jdGlvbiArICIvZW5hYmxlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVVNCIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLgorICAgICAqIE5vdGUgdGhhdCBhIFVTQiBmdW5jdGlvbiBtYXliZSBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKS5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBVU0IgZnVuY3Rpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRnVuY3Rpb25FbmFibGVkKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKSk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSAoc3RyZWFtLnJlYWQoKSA9PSAnMScpOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0VGV4dC5qYXZhCmluZGV4IDhhNTJlNDAuLjIyOTY4YjAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0RWRpdFRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRUZXh0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5FeHRyYWN0ZWRUZXh0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OwogCkBAIC0yOSw3ICsyOCw2IEBACiBwdWJsaWMgY2xhc3MgRXh0cmFjdEVkaXRUZXh0IGV4dGVuZHMgRWRpdFRleHQgewogICAgIHByaXZhdGUgSW5wdXRNZXRob2RTZXJ2aWNlIG1JTUU7CiAgICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdFeHRyYWN0ZWRUZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29udGV4dE1lbnVTaG91bGRCZUhhbmRsZWRCeVN1cGVyID0gZmFsc2U7CiAgICAgCiAgICAgcHVibGljIEV4dHJhY3RFZGl0VGV4dChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CkBAIC05OSwxOSArOTcsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGVDb250ZXh0TWVudShtZW51KTsKLSAgICAgICAgbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlciA9IHRydWU7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIG9uVGV4dENvbnRleHRNZW51SXRlbShpbnQgaWQpIHsKLSAgICAgICAgaWYgKG1JTUUgIT0gbnVsbCAmJiAhbUNvbnRleHRNZW51U2hvdWxkQmVIYW5kbGVkQnlTdXBlcikgeworICAgICAgICBpZiAobUlNRSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobUlNRS5vbkV4dHJhY3RUZXh0Q29udGV4dE1lbnVJdGVtKGlkKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Db250ZXh0TWVudVNob3VsZEJlSGFuZGxlZEJ5U3VwZXIgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIHN1cGVyLm9uVGV4dENvbnRleHRNZW51SXRlbShpZCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQppbmRleCA0ODE0YjBhLi44ODVhNmI4IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmQuamF2YQpAQCAtNTAwLDcgKzUwMCwzMCBAQAogICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKKyAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gb3Igc2VydmljZSBjb250ZXh0CisgICAgICogQHBhcmFtIHhtbExheW91dFJlc0lkIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGtleWJvYXJkIGxheW91dCBhbmQga2V5cy4KKyAgICAgKiBAcGFyYW0gbW9kZUlkIGtleWJvYXJkIG1vZGUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSB3aWR0aCBzZXRzIHdpZHRoIG9mIGtleWJvYXJkCisgICAgICogQHBhcmFtIGhlaWdodCBzZXRzIGhlaWdodCBvZiBrZXlib2FyZAorICAgICAqLworICAgIHB1YmxpYyBLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGVJZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1EaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgbURlZmF1bHRIb3Jpem9udGFsR2FwID0gMDsKKyAgICAgICAgbURlZmF1bHRXaWR0aCA9IG1EaXNwbGF5V2lkdGggLyAxMDsKKyAgICAgICAgbURlZmF1bHRWZXJ0aWNhbEdhcCA9IDA7CisgICAgICAgIG1EZWZhdWx0SGVpZ2h0ID0gbURlZmF1bHRXaWR0aDsKKyAgICAgICAgbUtleXMgPSBuZXcgQXJyYXlMaXN0PEtleT4oKTsKKyAgICAgICAgbU1vZGlmaWVyS2V5cyA9IG5ldyBBcnJheUxpc3Q8S2V5PigpOworICAgICAgICBtS2V5Ym9hcmRNb2RlID0gbW9kZUlkOworICAgICAgICBsb2FkS2V5Ym9hcmQoY29udGV4dCwgY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRYbWwoeG1sTGF5b3V0UmVzSWQpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEga2V5Ym9hcmQgZnJvbSB0aGUgZ2l2ZW4geG1sIGtleSBsYXlvdXQgZmlsZS4gV2VlZHMgb3V0IHJvd3MKICAgICAgKiB0aGF0IGhhdmUgYSBrZXlib2FyZCBtb2RlIGRlZmluZWQgYnV0IGRvbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbW9kZS4gCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvS2V5Ym9hcmRWaWV3LmphdmEKaW5kZXggNGI0ODQwOS4uYWI1Yzc4YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0tleWJvYXJkVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9LZXlib2FyZFZpZXcuamF2YQpAQCAtMTEyOCw3ICsxMTI4LDkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBvbk1vZGlmaWVkVG91Y2hFdmVudChNb3Rpb25FdmVudCBtZSwgYm9vbGVhbiBwb3NzaWJsZVBvbHkpIHsKICAgICAgICAgaW50IHRvdWNoWCA9IChpbnQpIG1lLmdldFgoKSAtIG1QYWRkaW5nTGVmdDsKLSAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSArIG1WZXJ0aWNhbENvcnJlY3Rpb24gLSBtUGFkZGluZ1RvcDsKKyAgICAgICAgaW50IHRvdWNoWSA9IChpbnQpIG1lLmdldFkoKSAtIG1QYWRkaW5nVG9wOworICAgICAgICBpZiAodG91Y2hZID49IC1tVmVydGljYWxDb3JyZWN0aW9uKQorICAgICAgICAgICAgdG91Y2hZICs9IG1WZXJ0aWNhbENvcnJlY3Rpb247CiAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBtZS5nZXRBY3Rpb24oKTsKICAgICAgICAgZmluYWwgbG9uZyBldmVudFRpbWUgPSBtZS5nZXRFdmVudFRpbWUoKTsKICAgICAgICAgbU9sZEV2ZW50VGltZSA9IGV2ZW50VGltZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCmluZGV4IGQxMjdjYTguLjYxZmM5ZTYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQpAQCAtMzU2LDE0ICszNTYsMTQgQEAKICAgICAgKiA8cD4KICAgICAgKiBBbGwgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBiYWNrZ3JvdW5kIHNlcnZpY2VzIHRoYXQgdXNlIHRoZSBuZXR3b3JrCiAgICAgICogc2hvdWxkIGxpc3RlbiB0byB7QGxpbmsgI0FDVElPTl9CQUNLR1JPVU5EX0RBVEFfU0VUVElOR19DSEFOR0VEfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gV2hldGhlciBiYWNrZ3JvdW5kIGRhdGEgdXNhZ2UgaXMgYWxsb3dlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UuZ2V0QmFja2dyb3VuZERhdGFTZXR0aW5nKCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFcnIgb24gdGhlIHNpZGUgb2Ygc2FmZXR5IAorICAgICAgICAgICAgLy8gRXJyIG9uIHRoZSBzaWRlIG9mIHNhZmV0eQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTIxLDYgKzUyMSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVRIRVJfRVJST1JfTk9fRVJST1IgICAgICAgICAgID0gMDsKICAgICAvKioge0BoaWRlfSAqLwpAQCAtNTU5LDYgKzU3MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGUgZGV2aWNlIHN0YXlzIGF3YWtlIHVudGlsIHdlIGNvbm5lY3Qgd2l0aCB0aGUgbmV4dCBuZXR3b3JrCisgICAgICogQHBhcmFtIGZvcldob21lIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIGdvaW5nIGRvd24gZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soU3RyaW5nIGZvcldob20pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKGZvcldob20pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAcGFyYW0gbmV0d29ya1R5cGUgVGhlIHR5cGUgb2YgbmV0d29yayB5b3Ugd2FudCB0byByZXBvcnQgb24KICAgICAgKiBAcGFyYW0gcGVyY2VudGFnZSBUaGUgcXVhbGl0eSBvZiB0aGUgY29ubmVjdGlvbiAwIGlzIGJhZCwgMTAwIGlzIGdvb2QKICAgICAgKiB7QGhpZGV9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRG93bmxvYWRzLmphdmEKaW5kZXggZmQzMzc4MS4uZGRkZTVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2Fkcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZHMuamF2YQpAQCAtNDMwLDExICs0MzAsMTAgQEAKIAogICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKIAotICAgICAgICAgICAgQ3Vyc29yIGMgPSBjci5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKKyAgICAgICAgICAgIEN1cnNvciBjID0gY3IucXVlcnkoZG93bmxvYWRVcmksIERPV05MT0FEU19QUk9KRUNUSU9OLCBudWxsIC8qIHNlbGVjdGlvbiAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzZWxlY3Rpb24gYXJncyAqLywgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCmluZGV4IGFmY2NkZDkuLjlmMmZjMTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JQ29ubmVjdGl2aXR5TWFuYWdlci5haWRsCkBAIC0xLDE2ICsxLDE2IEBACiAvKioKICAqIENvcHlyaWdodCAoYykgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKQEAgLTc1LDUgKzc1LDkgQEAKIAogICAgIFN0cmluZ1tdIGdldFRldGhlcmFibGVXaWZpUmVnZXhzKCk7CiAKKyAgICBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisKKyAgICB2b2lkIHJlcXVlc3ROZXR3b3JrVHJhbnNpdGlvbldha2Vsb2NrKGluIFN0cmluZyBmb3JXaG9tKTsKKwogICAgIHZvaWQgcmVwb3J0SW5ldENvbmRpdGlvbihpbnQgbmV0d29ya1R5cGUsIGludCBwZXJjZW50YWdlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNzk4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5haWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKiogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK3BhcmNlbGFibGUgTGlua1Byb3BlcnRpZXM7CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0xpbmtQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhZWJmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9MaW5rUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5UHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIG5ldHdvcmsgbGluay4KKyAqIFRPRE8gLSBjb25zaWRlciBhZGRpbmcgb3B0aW9uYWwgZmllbGRzIGxpa2UgQXBuIGFuZCBBcG5UeXBlCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTGlua1Byb3BlcnRpZXMgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIHByaXZhdGUgTmV0d29ya0ludGVyZmFjZSBtSWZhY2U7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBtQWRkcmVzc2VzOworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gbURuc2VzOworICAgIHByaXZhdGUgSW5ldEFkZHJlc3MgbUdhdGV3YXk7CisgICAgcHJpdmF0ZSBQcm94eVByb3BlcnRpZXMgbUh0dHBQcm94eTsKKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgY2xvbmUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMoTGlua1Byb3BlcnRpZXMgc291cmNlKSB7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbUlmYWNlID0gc291cmNlLmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgbUFkZHJlc3NlcyA9IHNvdXJjZS5nZXRBZGRyZXNzZXMoKTsKKyAgICAgICAgICAgIG1EbnNlcyA9IHNvdXJjZS5nZXREbnNlcygpOworICAgICAgICAgICAgbUdhdGV3YXkgPSBzb3VyY2UuZ2V0R2F0ZXdheSgpOworICAgICAgICAgICAgbUh0dHBQcm94eSA9IG5ldyBQcm94eVByb3BlcnRpZXMoc291cmNlLmdldEh0dHBQcm94eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlIGlmYWNlKSB7CisgICAgICAgIG1JZmFjZSA9IGlmYWNlOworICAgIH0KKyAgICBwdWJsaWMgTmV0d29ya0ludGVyZmFjZSBnZXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiBtSWZhY2U7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChtSWZhY2UgPT0gbnVsbCA/IG51bGwgOiBtSWZhY2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBZGRyZXNzKEluZXRBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgbUFkZHJlc3Nlcy5hZGQoYWRkcmVzcyk7CisgICAgfQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEluZXRBZGRyZXNzPiBnZXRBZGRyZXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1BZGRyZXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZERucyhJbmV0QWRkcmVzcyBkbnMpIHsKKyAgICAgICAgbURuc2VzLmFkZChkbnMpOworICAgIH0KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbmV0QWRkcmVzcz4gZ2V0RG5zZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG1EbnNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2F0ZXdheShJbmV0QWRkcmVzcyBnYXRld2F5KSB7CisgICAgICAgIG1HYXRld2F5ID0gZ2F0ZXdheTsKKyAgICB9CisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEdhdGV3YXkoKSB7CisgICAgICAgIHJldHVybiBtR2F0ZXdheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIdHRwUHJveHkoUHJveHlQcm9wZXJ0aWVzIHByb3h5KSB7CisgICAgICAgIG1IdHRwUHJveHkgPSBwcm94eTsKKyAgICB9CisgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBnZXRIdHRwUHJveHkoKSB7CisgICAgICAgIHJldHVybiBtSHR0cFByb3h5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBtSWZhY2UgPSBudWxsOworICAgICAgICBtQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbURuc2VzID0gbmV3IEFycmF5TGlzdDxJbmV0QWRkcmVzcz4oKTsKKyAgICAgICAgbUdhdGV3YXkgPSBudWxsOworICAgICAgICBtSHR0cFByb3h5ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBpZmFjZU5hbWUgPSAobUlmYWNlID09IG51bGwgPyAiIiA6ICJJbnRlcmZhY2VOYW1lOiAiICsgbUlmYWNlLmdldE5hbWUoKSArICIgIik7CisKKyAgICAgICAgU3RyaW5nIGlwID0gIklwQWRkcmVzc2VzOiBbIjsKKyAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbUFkZHJlc3NlcykgaXAgKz0gIGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSArICIsIjsKKyAgICAgICAgaXAgKz0gIl0gIjsKKworICAgICAgICBTdHJpbmcgZG5zID0gIkRuc0FkZHJlc3NlczogWyI7CisgICAgICAgIGZvciAoSW5ldEFkZHJlc3MgYWRkciA6IG1EbnNlcykgZG5zICs9IGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSArICIsIjsKKyAgICAgICAgZG5zICs9ICJdICI7CisKKyAgICAgICAgU3RyaW5nIHByb3h5ID0gKG1IdHRwUHJveHkgPT0gbnVsbCA/ICIiIDogIkh0dHBQcm94eTogIiArIG1IdHRwUHJveHkudG9TdHJpbmcoKSArICIgIik7CisgICAgICAgIFN0cmluZyBnYXRld2F5ID0gKG1HYXRld2F5ID09IG51bGwgPyAiIiA6ICJHYXRld2F5OiAiICsgbUdhdGV3YXkuZ2V0SG9zdEFkZHJlc3MoKSArICIgIik7CisKKyAgICAgICAgcmV0dXJuIGlmYWNlTmFtZSArIGlwICsgZ2F0ZXdheSArIGRucyArIHByb3h5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhnZXRJbnRlcmZhY2VOYW1lKCkpOworICAgICAgICBkZXN0LndyaXRlSW50KG1BZGRyZXNzZXMuc2l6ZSgpKTsKKyAgICAgICAgLy9UT0RPOiBleHBsb3JlIGFuIGVhc3kgYWx0ZXJuYXRpdmUgdG8gcHJlc2VydmUgaG9zdG5hbWUKKyAgICAgICAgLy8gd2l0aG91dCBkb2luZyBhIGxvb2t1cAorICAgICAgICBmb3IoSW5ldEFkZHJlc3MgYSA6IG1BZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlQXJyYXkoYS5nZXRBZGRyZXNzKCkpOworICAgICAgICB9CisgICAgICAgIGRlc3Qud3JpdGVJbnQobURuc2VzLnNpemUoKSk7CisgICAgICAgIGZvcihJbmV0QWRkcmVzcyBkIDogbURuc2VzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGQuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUdhdGV3YXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KG1HYXRld2F5LmdldEFkZHJlc3MoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUh0dHBQcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVQYXJjZWxhYmxlKG1IdHRwUHJveHksIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKTApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxMaW5rUHJvcGVydGllcz4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBDcmVhdG9yPExpbmtQcm9wZXJ0aWVzPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIG5ldFByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWZhY2UgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldFByb3Auc2V0SW50ZXJmYWNlKE5ldHdvcmtJbnRlcmZhY2UuZ2V0QnlOYW1lKGlmYWNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkcmVzc0NvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhZGRyZXNzQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5hZGREbnMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW4ucmVhZEJ5dGUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRQcm9wLnNldEdhdGV3YXkoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGluLmNyZWF0ZUJ5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbi5yZWFkQnl0ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV0UHJvcC5zZXRIdHRwUHJveHkoKFByb3h5UHJvcGVydGllcylpbi5yZWFkUGFyY2VsYWJsZShudWxsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXRQcm9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXNbc2l6ZV07CisgICAgICAgICAgICB9CisgICAgICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCAwMDRjZGI3Li42M2JkZjhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDE5ICsxNiwyMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CkBAIC00MCw3ICs0Miw3IEBACiAgKgogICoge0BoaWRlfQogICovCi1wdWJsaWMgY2xhc3MgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBleHRlbmRzIE5ldHdvcmtTdGF0ZVRyYWNrZXIgeworcHVibGljIGNsYXNzIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgaW1wbGVtZW50cyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTW9iaWxlRGF0YVN0YXRlVHJhY2tlciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOwpAQCAtNDksMTAgKzUxLDE1IEBACiAgICAgcHJpdmF0ZSBJVGVsZXBob255IG1QaG9uZVNlcnZpY2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQXBuVHlwZVRvV2F0Y2hGb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUFwbk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVN0YXRlUmVjZWl2ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc0Ruc1Byb3BOYW1lczsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbURlZmF1bHRHYXRld2F5QWRkciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZhdWx0Um91dGVTZXQgPSBmYWxzZTsKIAogICAgIC8vIERFRkFVTFQgYW5kIEhJUFJJIGFyZSB0aGUgc2FtZSBjb25uZWN0aW9uLiAgSWYgd2UncmUgb25lIG9mIHRoZXNlIHdlIG5lZWQgdG8gY2hlY2sgaWYKICAgICAvLyB0aGUgb3RoZXIgaXMgYWxzbyBkaXNjb25uZWN0ZWQgYmVmb3JlIHdlIHJlc2V0IHNvY2tldHMKQEAgLTYwLDM1ICs2NywyMiBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgYXBwbGljYXRpb24gY29udGV4dCBvZiB0aGUgY2FsbGVyCi0gICAgICogQHBhcmFtIHRhcmdldCBhIG1lc3NhZ2UgaGFuZGxlciBmb3IgZ2V0dGluZyBjYWxsYmFja3MgYWJvdXQgc3RhdGUgY2hhbmdlcwogICAgICAqIEBwYXJhbSBuZXRUeXBlIHRoZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG5ldHdvcmsgdHlwZQotICAgICAqIEBwYXJhbSBhcG5UeXBlIHRoZSBQaG9uZSBhcG5UeXBlCiAgICAgICogQHBhcmFtIHRhZyB0aGUgbmFtZSBvZiB0aGlzIG5ldHdvcmsKICAgICAgKi8KLSAgICBwdWJsaWMgTW9iaWxlRGF0YVN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0LCBpbnQgbmV0VHlwZSwgU3RyaW5nIHRhZykgewotICAgICAgICBzdXBlcihjb250ZXh0LCB0YXJnZXQsIG5ldFR5cGUsCisgICAgcHVibGljIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIoaW50IG5ldFR5cGUsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKG5ldFR5cGUsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGUoKSwgdGFnLAogICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldE5ldHdvcmtUeXBlTmFtZSgpKTsKICAgICAgICAgbUFwblR5cGUgPSBuZXR3b3JrVHlwZVRvQXBuVHlwZShuZXRUeXBlKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobUFwblR5cGUsIFBob25lLkFQTl9UWVBFX0hJUFJJKSkgewotICAgICAgICAgICAgbUFwblR5cGVUb1dhdGNoRm9yID0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BcG5UeXBlVG9XYXRjaEZvciA9IG1BcG5UeXBlOwotICAgICAgICB9CiAgICAgICAgIGlmIChuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUgfHwKICAgICAgICAgICAgICAgICBuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEVfSElQUkkpIHsKICAgICAgICAgICAgIG1Jc0RlZmF1bHRPckhpcHJpID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIG1QaG9uZVNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZihuZXRUeXBlID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIH0KIAotICAgICAgICBtRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgc0Ruc1Byb3BOYW1lcyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMSIsCiAgICAgICAgICAgICAgICAgIm5ldC5ybW5ldDAuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5ldGgwLmRuczEiLApAQCAtOTksMTY1ICs5MywxNjIgQEAKICAgICAgICAgICAgICAgICAibmV0LmdwcnMuZG5zMiIsCiAgICAgICAgICAgICAgICAgIm5ldC5wcHAwLmRuczEiLAogICAgICAgICAgICAgICAgICJuZXQucHBwMC5kbnMyIn07Ci0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBCZWdpbiBtb25pdG9yaW5nIG1vYmlsZSBkYXRhIGNvbm5lY3Rpdml0eS4KKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIGRhdGEgY29ubmVjdGl2aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaXMgdGhlIGN1cnJlbnQgQW5kcm9pZCBjb250ZXh0CisgICAgICogQHBhcmFtIHRhcmdldCBpcyB0aGUgSGFuZGVyIHRvIHdoaWNoIHRvIHJldHVybiB0aGUgZXZlbnRzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IEludGVudEZpbHRlcihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZyhDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7CisgICAgICAgIG1UYXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fREFUQV9DT05ORUNUSU9OX0ZBSUxFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVGVsZXBob255SW50ZW50cy5BQ1RJT05fU0VSVklDRV9TVEFURV9DSEFOR0VEKTsKIAotICAgICAgICBtU3RhdGVSZWNlaXZlciA9IG5ldyBNb2JpbGVEYXRhU3RhdGVSZWNlaXZlcigpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU3RhdGVSZWNlaXZlciwgZmlsdGVyKTsKLSAgICAgICAgaWYgKGludGVudCAhPSBudWxsKQotICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlID0gUGhvbmUuRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihuZXcgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIoKSwgZmlsdGVyKTsKKyAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSA9IFBob25lLkRhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBQaG9uZS5EYXRhU3RhdGUgZ2V0TW9iaWxlRGF0YVN0YXRlKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5TVEFURV9LRVkpOwotICAgICAgICBpZiAoc3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVkpOwotICAgICAgICAgICAgaWYgKGlzQXBuVHlwZUluY2x1ZGVkKGFwblR5cGVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLCBzdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBETlMgc2VydmVycyBhdmFpbGFibGUgZm9yIHRoZSBtb2JpbGUgZGF0YQorICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldERuc1Byb3BOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNEbnNQcm9wTmFtZXM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXBuVHlwZUluY2x1ZGVkKFN0cmluZyB0eXBlTGlzdCkgewotICAgICAgICAvKiBjb21tYSBzZXBlcmF0ZWQgbGlzdCAtIHNwbGl0IGFuZCBjaGVjayAqLwotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQ7CisgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGxpc3QgPSB0eXBlTGlzdC5zcGxpdCgiLCIpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgbUFwblR5cGVUb1dhdGNoRm9yKSB8fAotICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHMobGlzdFtpXSwgUGhvbmUuQVBOX1RZUEVfQUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgdm9pZCBwcml2YXRlRG5zUm91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Um91dGVTZXQoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlU2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSb3V0ZVNldChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURlZmF1bHRSb3V0ZVNldCA9IGVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5lY3Rpdml0eU1hbmFnZXI7CisgICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOworCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVGVsZXBob255SW50ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSA9IGdldE1vYmlsZURhdGFTdGF0ZShpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0NIQU5HRV9SRUFTT05fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwbk5hbWUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGVMaXN0ID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BcG5OYW1lID0gYXBuTmFtZTsKKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFRlbGVwaG9ueUludGVudHMuCisgICAgICAgICAgICAgICAgICAgIEFDVElPTl9BTllfREFUQV9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFwblR5cGUgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9BUE5fVFlQRV9LRVkpOworICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhhcG5UeXBlLCBtQXBuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUgPSBFbnVtLnZhbHVlT2YoUGhvbmUuRGF0YVN0YXRlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLlNUQVRFX0tFWSkpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZSghaW50ZW50LmdldEJvb2xlYW5FeHRyYShQaG9uZS5ORVRXT1JLX1VOQVZBSUxBQkxFX0tFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgYXBuVHlwZUxpc3QuICBJdCdzIGFsbCB0aGUgc2FtZSByYWRpby9uZXR3b3JrCi0gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVybmVhdGgKLSAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKCF1bmF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtTW9iaWxlRGF0YVN0YXRlICsgIiwgcmVhc29uPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FwblR5cGVJbmNsdWRlZChhcG5UeXBlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBlbmFibGVkIGJ1dCB0aGUgQVBOIFR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNvcmQgdGhlIGludGVyZmFjZSBuYW1lIGlmIG9uZSdzIHByb3ZpZGVkLiAgSWYgdGhlIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJucyBvbiB0aGlzIG5ldHdvcmsgd2Ugd2lsbCBuZWVkIHRoZSBpbnRlcmZhY2VuYW1lIGJ1dCB3b24ndCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZyZXNoIGNvbm5lY3RlZCBtZXNzYWdlIC0gVE9ETyBmaXggdGhpcyB3aGVuIHdlIGdldCBwZXItQVBOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInJlcGxhY2luZyBvbGQgbUludGVyZmFjZU5hbWUgKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lICsgIikgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoUGhvbmUuREFUQV9JRkFDRV9OQU1FX0tFWSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yICIgKyBtQXBuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVkpOworICAgICAgICAgICAgICAgIGlmIChtTW9iaWxlRGF0YVN0YXRlICE9IHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICIgUmVjZWl2ZWQgc3RhdGU9ICIgKyBzdGF0ZSArICIsIG9sZD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vYmlsZURhdGFTdGF0ZSArICIsIHJlYXNvbj0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogcmVhc29uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgYXBuVHlwZUxpc3Q9ICIgKyBhcG5UeXBlTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2JpbGVEYXRhU3RhdGUgIT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNUZWFyZG93blJlcXVlc3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBkZWZhdWx0IGFuZCBoaXByaSBtdXN0IGdvIGRvd24gYmVmb3JlIHdlIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZVRvQ2hlY2sgPSAoUGhvbmUuQVBOX1RZUEVfREVGQVVMVC5lcXVhbHMobUFwblR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9ISVBSSSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aXZpdHlNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29ubmVjdGl2aXR5TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NoZWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9DaGVjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSA9PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVzZXQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGdvIGFoZWFkIHdpdGggdGhlIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gdHJ5aW5nIHRvIGNvbnRhY3QgQ29ublNlcnZpY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9SZXNldCAmJiBtSW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgZG8gdGhpcyBoZXJlIC0gQ29ubmVjdGl2aXR5U2VydmljZSBuZWVkcyBpdCB0byBjbGVhciBzdHVmZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIHRob3VnaCAtIGp1c3QgbGVhdmUgaXQgdG8gYmUgcmVmcmVzaGVkIG5leHQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChEQkcpIExvZy5kKFRBRywgImNsZWFyaW5nIG1JbnRlcmZhY2VOYW1lIGZvciAiKyBtQXBuVHlwZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAiIGFzIGl0IERJU0NPTk5FQ1RFRCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdEdhdGV3YXlBZGRyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgcmVhc29uLCBhcG5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5TVVNQRU5ERUQsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBpbnRlcmZhY2UgbmFtZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEdhdGV3YXlBZGRyID0gaW50ZW50LmdldEludEV4dHJhKFBob25lLkRBVEFfR0FURVdBWV9LRVksIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVELCByZWFzb24sIGFwbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gbUxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKGlmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNoZWNrIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGlzIGhlcmUgLSBDb25uZWN0aXZpdHlTZXJ2aWNlIG5lZWRzIGl0IHRvIGNsZWFyIHN0dWZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKERCRykgTG9nLmQoVEFHLCAiY2xlYXJpbmcgbUludGVyZmFjZU5hbWUgZm9yICIrIG1BcG5UeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIiBhcyBpdCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21JbnRlcmZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21EZWZhdWx0R2F0ZXdheUFkZHIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HLCByZWFzb24sIGFwbk5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVVNQRU5ERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLlNVU1BFTkRFRCwgcmVhc29uLCBhcG5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZS5EQVRBX0xJTktfUFJPUEVSVElFU19LRVkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTGlua1Byb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTk5FQ1RFRCBldmVudCBkaWQgbm90IHN1cHBseSBsaW5rIHByb3BlcnRpZXMuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlY2VpdmVkICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkgKyAiIGJyb2FkY2FzdCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOwotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRkFJTEVELCByZWFzb24sIGFwbk5hbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRtID0gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgc2V0Um9hbWluZ1N0YXR1cyh0bS5pc05ldHdvcmtSb2FtaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldFN1YnR5cGUodG0uZ2V0TmV0d29ya1R5cGUoKSwgdG0uZ2V0TmV0d29ya1R5cGVOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuCisgICAgICAgICAgICAgICAgICAgIGVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9EQVRBX0NPTk5FQ1RJT05fRkFJTEVEKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoYXBuVHlwZSwgbUFwblR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQaG9uZS5GQUlMVVJFX1JFQVNPTl9LRVkpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcG5OYW1lID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBob25lLkRBVEFfQVBOX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBtQXBuVHlwZSArICJSZWNlaXZlZCAiICsgaW50ZW50LmdldEFjdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnJvYWRjYXN0IiArIHJlYXNvbiA9PSBudWxsID8gIiIgOiAiKCIgKyByZWFzb24gKyAiKSIpOworICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIHJlYXNvbiwgYXBuTmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNzIsMzMgKzI2Myw3IEBACiAgICAgICogUmVwb3J0IHdoZXRoZXIgZGF0YSBjb25uZWN0aXZpdHkgaXMgcG9zc2libGUuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgIGdldFBob25lU2VydmljZShmYWxzZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHBob25lIHByb2Nlc3MgaGFzIGNyYXNoZWQgaW4gdGhlIHBhc3QsIHdlJ2xsIGdldCBhCi0gICAgICAgICAqIFJlbW90ZUV4Y2VwdGlvbiBhbmQgbmVlZCB0byByZS1yZWZlcmVuY2UgdGhlIHNlcnZpY2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCByZXRyeSA9IDA7IHJldHJ5IDwgMjsgcmV0cnkrKykgewotICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QaG9uZVNlcnZpY2UuaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmlyc3QtdGltZSBmYWlsZWQsIGdldCB0aGUgcGhvbmUgc2VydmljZSBhZ2FpbgotICAgICAgICAgICAgICAgIGlmIChyZXRyeSA9PSAwKSBnZXRQaG9uZVNlcnZpY2UodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrIHN1YnR5cGUgaW5kaWNhdGVzIHdoYXQgZ2VuZXJhdGlvbiBuZXR3b3JrIHRlY2hub2xvZ3kgaXMgaW4gZWZmZWN0LAotICAgICAqIGUuZy4sIEdQUlMsIEVER0UsIFVNVFMsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5ldHdvcmtTdWJ0eXBlKCkgewotICAgICAgICByZXR1cm4gVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGUoKTsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzUwLDcwICszMTUsNzQgQEAKICAgICAvKioKICAgICAgKiBUZWFyIGRvd24gbW9iaWxlIGRhdGEgY29ubmVjdGl2aXR5LCBpLmUuLCBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZQogICAgICAqIG1vYmlsZSBkYXRhIGNvbm5lY3Rpb25zLgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCByZXR1cm4gbm90aGluZz8KICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiB0ZWFyZG93bigpIHsKLSAgICAgICAgLy8gc2luY2Ugd2Ugd29uJ3QgZ2V0IGEgbm90aWZpY2F0aW9uIGN1cnJlbnRseSAoVE9ETyAtIHBlciBBUE4gbm90aWZpY2F0aW9ucykKLSAgICAgICAgLy8gd2Ugd29uJ3QgZ2V0IGEgZGlzY29ubmVjdCBtZXNzYWdlIHVudGlsIGFsbCBBUE4ncyBvbiB0aGUgY3VycmVudCBjb25uZWN0aW9uJ3MKLSAgICAgICAgLy8gQVBOIGxpc3QgYXJlIGRpc2FibGVkLiAgVGhhdCBtZWFucyBwcml2YXRlUm91dGVzIGZvciBETlMgYW5kIHN1Y2ggd2lsbCByZW1haW4gb24gLQotICAgICAgICAvLyBub3QgYSBwcm9ibGVtIHNpbmNlIHRoYXQncyBhbGwgc2hhcmVkIHdpdGggd2hhdGV2ZXIgb3RoZXIgQVBOIGlzIHN0aWxsIG9uLCBidXQKLSAgICAgICAgLy8gdWdseS4KICAgICAgICAgc2V0VGVhcmRvd25SZXF1ZXN0ZWQodHJ1ZSk7CiAgICAgICAgIHJldHVybiAoc2V0RW5hYmxlQXBuKG1BcG5UeXBlLCBmYWxzZSkgIT0gUGhvbmUuQVBOX1JFUVVFU1RfRkFJTEVEKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGRldGFpbGVkIHN0YXRlIG9mIGEgbmV0d29yaywgYW5kIGlmIGl0IGlzIGEKKyAgICAgKiBjaGFuZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGUsIHNlbmQgYSBub3RpZmljYXRpb24gdG8KKyAgICAgKiBhbnkgbGlzdGVuZXJzLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqIEBwYXJhbSByZWFzb24gYSB7QGNvZGUgU3RyaW5nfSBpbmRpY2F0aW5nIGEgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLAorICAgICAqIGlmIG9uZSB3YXMgc3VwcGxpZWQuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGV4dHJhSW5mbyBvcHRpb25hbCB7QGNvZGUgU3RyaW5nfSBwcm92aWRpbmcgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXRlIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiB3YXNDb25uZWN0aW5nID0gKG1OZXR3b3JrSW5mby5nZXRTdGF0ZSgpID09IE5ldHdvcmtJbmZvLlN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgU3RyaW5nIGxhc3RSZWFzb24gPSBtTmV0d29ya0luZm8uZ2V0UmVhc29uKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgYSByZWFzb24gd2FzIHN1cHBsaWVkIHdoZW4gdGhlIENPTk5FQ1RJTkcgc3RhdGUgd2FzIGVudGVyZWQsIGFuZCBubworICAgICAgICAgICAgICogcmVhc29uIHdhcyBzdXBwbGllZCBmb3IgZW50ZXJpbmcgdGhlIENPTk5FQ1RFRCBzdGF0ZSwgdGhlbiByZXRhaW4gdGhlCisgICAgICAgICAgICAgKiByZWFzb24gdGhhdCB3YXMgc3VwcGxpZWQgd2hlbiBnb2luZyB0byBDT05ORUNUSU5HLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAod2FzQ29ubmVjdGluZyAmJiBzdGF0ZSA9PSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCAmJiByZWFzb24gPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBsYXN0UmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhc29uID0gbGFzdFJlYXNvbjsKKyAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXREZXRhaWxlZFN0YXRlKHN0YXRlLCByZWFzb24sIGV4dHJhSW5mbyk7CisgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZShFVkVOVF9TVEFURV9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgeworICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlLWVuYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aXZpdHkgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE8gLSBtYWtlIGFzeW5jIGFuZCBhbHdheXMgZ2V0IGEgbm90aWZpY2F0aW9uPwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOyAvL2Nvbm5lY3RlZCBvciBleHBlY3QgdG8gYmU/CiAgICAgICAgIHNldFRlYXJkb3duUmVxdWVzdGVkKGZhbHNlKTsKICAgICAgICAgc3dpdGNoIChzZXRFbmFibGVBcG4obUFwblR5cGUsIHRydWUpKSB7CiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9BTFJFQURZX0FDVElWRToKLSAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBnZXQgcGVyLWFwbiBub3RpZmljYXRpb25zCi0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2V0IHNlbGYgdG8gQ09OTkVDVElORyBzbyB0aGUgYmVsb3cgbWVzc2FnZSBpcyBoYW5kbGVkLgotICAgICAgICAgICAgICAgIG1Nb2JpbGVEYXRhU3RhdGUgPSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVElORywgUGhvbmUuUkVBU09OX0FQTl9DSEFOR0VELCBudWxsKTsKLSAgICAgICAgICAgICAgICAvL3NlbmQgb3V0IGEgY29ubmVjdGVkIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChUZWxlcGhvbnlJbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0FOWV9EQVRBX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLlNUQVRFX0tFWSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuU1RBVEVfQ0hBTkdFX1JFQVNPTl9LRVksIFBob25lLlJFQVNPTl9BUE5fQ0hBTkdFRCk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVTX0tFWSwgbUFwblR5cGVUb1dhdGNoRm9yKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBtQXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuTkVUV09SS19VTkFWQUlMQUJMRV9LRVksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlUmVjZWl2ZXIgIT0gbnVsbCkgbVN0YXRlUmVjZWl2ZXIub25SZWNlaXZlKG1Db250ZXh0LCBpbnRlbnQpOworICAgICAgICAgICAgICAgIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUGhvbmUuQVBOX1JFUVVFU1RfU1RBUlRFRDoKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyAtIHdlJ3JlIGFscmVhZHkgZHVlIHNvbWUgc3RhdHVzIHVwZGF0ZSBpbnRlbnRzCisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBQaG9uZS5BUE5fUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1QaG9uZVNlcnZpY2UgPT0gbnVsbCAmJiBtQXBuVHlwZSA9PSBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9uIHN0YXJ0dXAgd2UgbWF5IHRyeSB0byB0YWxrIHRvIHRoZSBwaG9uZSBiZWZvcmUgaXQncyByZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGhvbmUgd2lsbCBjb21lIHVwIGVuYWJsZWQsIGdvIHdpdGggdGhhdC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgYWxzbyBjb21lcyB1cCBvbiB0ZWxlcGhvbnkgY3Jhc2g6IGlmIHdlIHRoaW5rIG1vYmlsZSBkYXRhIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhbmQgdGhlIHRlbGVwaG9ueSBzdHVmZiBjcmFzaGVzIGFuZCBoYXMgdG8gcmVzdGFydCBpdCB3aWxsIGNvbWUgdXAKLSAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlZCAobWFraW5nIGEgZGF0YSBjb25uZWN0aW9uKS4gIFdlIHdpbGwgdGhlbiBiZSBvdXQgb2Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgLy8gQSBwb3NzaWJsZSBzb2x1dGlvbiBpcyBhIGJyb2FkY2FzdCB3aGVuIHRlbGVwaG9ueSByZXN0YXJ0cy4KLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsc2UgZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQgbWF5IGJlIG9mZiBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBBaXJwbGFuZU1vZGUgb3IgRS1DYWxsIG9yIHdoYXRldmVyLi4KLSAgICAgICAgICAgICAgICBpZiAobUFwblR5cGUgIT0gUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gcmVjb25uZWN0IC0gdW5leHBlY3RlZCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIHJldFZhbHVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDg2LDI1ICs0NTUsNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAotICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBvbiBzdWNjZXNzLCB7QGNvZGUgZmFsc2V9IG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Um91dGVUb0hvc3QoSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVxdWVzdGVkIGhvc3Qgcm91dGUgdG8gIiArIGhvc3RBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgbUFwblR5cGUgKyAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBOZXR3b3JrVXRpbHMuYWRkSG9zdFJvdXRlKG1JbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNb2JpbGUgZGF0YSBzdGF0ZTogIik7CkBAIC01NjYsNCArNTE2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKaW5kZXggNjQ5Y2I4Yy4uNWY1ZTExYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVELCBTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5GQUlMRUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBpbnQgbU5ldHdvcmtUeXBlOwogICAgIHByaXZhdGUgaW50IG1TdWJ0eXBlOwogICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlTmFtZTsKQEAgLTEyMSw3ICsxMjEsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUpIHt9CiAKLSAgICBOZXR3b3JrSW5mbyhpbnQgdHlwZSwgaW50IHN1YnR5cGUsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8oaW50IHR5cGUsIGludCBzdWJ0eXBlLCBTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewogICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZVZhbGlkKHR5cGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5ldHdvcmsgdHlwZTogIiArIHR5cGUpOwogICAgICAgICB9CkBAIC0xNDEsNyArMTQ0LDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtTmV0d29ya1R5cGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1OZXR3b3JrVHlwZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTUwLDEyICsxNTUsMTYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXR3b3JrIHN1YnR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFN1YnR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHNldFN1YnR5cGUoaW50IHN1YnR5cGUsIFN0cmluZyBzdWJ0eXBlTmFtZSkgewotICAgICAgICBtU3VidHlwZSA9IHN1YnR5cGU7Ci0gICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlID0gc3VidHlwZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IHN1YnR5cGVOYW1lOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQsNyArMTczLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVR5cGVOYW1lOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtVHlwZU5hbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3Miw3ICsxODMsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgc3VidHlwZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VidHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTg1LDcgKzE5OCw5IEBACiAgICAgICogb2YgYmVpbmcgZXN0YWJsaXNoZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nKCkgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gU3RhdGUuQ09OTkVDVElORzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTk0LDcgKzIwOSw5IEBACiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV0d29yayBjb25uZWN0aXZpdHkgZXhpc3RzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIxMCw3ICsyMjcsOSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXR3b3JrIGlzIGF2YWlsYWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Jc0F2YWlsYWJsZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzQXZhaWxhYmxlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjAsNyArMjM5LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElzQXZhaWxhYmxlKGJvb2xlYW4gaXNBdmFpbGFibGUpIHsKLSAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzQXZhaWxhYmxlID0gaXNBdmFpbGFibGU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIzMSw3ICsyNTIsOSBAQAogICAgICAqIG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxvdmVyKCkgewotICAgICAgICByZXR1cm4gbUlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsNyArMjY0LDkgQEAKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvdmVyKGJvb2xlYW4gaXNGYWlsb3ZlcikgewotICAgICAgICBtSXNGYWlsb3ZlciA9IGlzRmFpbG92ZXI7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzRmFpbG92ZXIgPSBpc0ZhaWxvdmVyOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTEsMTEgKzI3NiwxNSBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJvYW1pbmcgaXMgaW4gZWZmZWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvYW1pbmcoKSB7Ci0gICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNSb2FtaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZXRSb2FtaW5nKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIG1Jc1JvYW1pbmcgPSBpc1JvYW1pbmc7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgbUlzUm9hbWluZyA9IGlzUm9hbWluZzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjYzLDcgKzI5Miw5IEBACiAgICAgICogQHJldHVybiB0aGUgY29hcnNlLWdyYWluZWQgc3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgU3RhdGUgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjcxLDcgKzMwMiw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmluZS1ncmFpbmVkIHN0YXRlCiAgICAgICovCiAgICAgcHVibGljIERldGFpbGVkU3RhdGUgZ2V0RGV0YWlsZWRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EZXRhaWxlZFN0YXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjgxLDEyICszMTQsMTUgQEAKICAgICAgKiBpZiBvbmUgd2FzIHN1cHBsaWVkLiBNYXkgYmUge0Bjb2RlIG51bGx9LgogICAgICAqIEBwYXJhbSBleHRyYUluZm8gYW4gb3B0aW9uYWwge0Bjb2RlIFN0cmluZ30gcHJvdmlkaW5nIGFkZGRpdGlvbmFsIG5ldHdvcmsgc3RhdGUKICAgICAgKiBpbmZvcm1hdGlvbiBwYXNzZWQgdXAgZnJvbSB0aGUgbG93ZXIgbmV0d29ya2luZyBsYXllcnMuCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICB2b2lkIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZSBkZXRhaWxlZFN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIHRoaXMubURldGFpbGVkU3RhdGUgPSBkZXRhaWxlZFN0YXRlOwotICAgICAgICB0aGlzLm1TdGF0ZSA9IHN0YXRlTWFwLmdldChkZXRhaWxlZFN0YXRlKTsKLSAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOwotICAgICAgICB0aGlzLm1FeHRyYUluZm8gPSBleHRyYUluZm87CisgICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlIGRldGFpbGVkU3RhdGUsIFN0cmluZyByZWFzb24sIFN0cmluZyBleHRyYUluZm8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICB0aGlzLm1EZXRhaWxlZFN0YXRlID0gZGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgICAgIHRoaXMubVN0YXRlID0gc3RhdGVNYXAuZ2V0KGRldGFpbGVkU3RhdGUpOworICAgICAgICAgICAgdGhpcy5tUmVhc29uID0gcmVhc29uOworICAgICAgICAgICAgdGhpcy5tRXh0cmFJbmZvID0gZXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTUsNyArMzMxLDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZWFzb24gZm9yIGZhaWx1cmUsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgewotICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlYXNvbjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzA1LDIwICszNDMsMjQgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBleHRyYSBpbmZvcm1hdGlvbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRFeHRyYUluZm8oKSB7Ci0gICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFJbmZvOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk5ldHdvcmtJbmZvOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInR5cGU6ICIpLmFwcGVuZChnZXRUeXBlTmFtZSgpKS5hcHBlbmQoIlsiKS5hcHBlbmQoZ2V0U3VidHlwZU5hbWUoKSkuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJdLCBzdGF0ZTogIikuYXBwZW5kKG1TdGF0ZSkuYXBwZW5kKCIvIikuYXBwZW5kKG1EZXRhaWxlZFN0YXRlKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCIsIGV4dHJhOiAiKS5hcHBlbmQobUV4dHJhSW5mbyA9PSBudWxsID8gIihub25lKSIgOiBtRXh0cmFJbmZvKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgcm9hbWluZzogIikuYXBwZW5kKG1Jc1JvYW1pbmcpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KLSAgICAgICAgICAgICAgICBhcHBlbmQoIiwgaXNBdmFpbGFibGU6ICIpLmFwcGVuZChtSXNBdmFpbGFibGUpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJOZXR3b3JrSW5mbzogIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgidHlwZTogIikuYXBwZW5kKGdldFR5cGVOYW1lKCkpLmFwcGVuZCgiWyIpLmFwcGVuZChnZXRTdWJ0eXBlTmFtZSgpKS4KKyAgICAgICAgICAgIGFwcGVuZCgiXSwgc3RhdGU6ICIpLmFwcGVuZChtU3RhdGUpLmFwcGVuZCgiLyIpLmFwcGVuZChtRGV0YWlsZWRTdGF0ZSkuCisgICAgICAgICAgICBhcHBlbmQoIiwgcmVhc29uOiAiKS5hcHBlbmQobVJlYXNvbiA9PSBudWxsID8gIih1bnNwZWNpZmllZCkiIDogbVJlYXNvbikuCisgICAgICAgICAgICBhcHBlbmQoIiwgZXh0cmE6ICIpLmFwcGVuZChtRXh0cmFJbmZvID09IG51bGwgPyAiKG5vbmUpIiA6IG1FeHRyYUluZm8pLgorICAgICAgICAgICAgYXBwZW5kKCIsIHJvYW1pbmc6ICIpLmFwcGVuZChtSXNSb2FtaW5nKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBmYWlsb3ZlcjogIikuYXBwZW5kKG1Jc0ZhaWxvdmVyKS4KKyAgICAgICAgICAgIGFwcGVuZCgiLCBpc0F2YWlsYWJsZTogIikuYXBwZW5kKG1Jc0F2YWlsYWJsZSk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzQsMTcgKzM3NiwxOSBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobU5ldHdvcmtUeXBlKTsKLSAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVR5cGVOYW1lKTsKLSAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU5hbWUpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOwotICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1EZXRhaWxlZFN0YXRlLm5hbWUoKSk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRmFpbG92ZXIgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOwotICAgICAgICBkZXN0LndyaXRlSW50KG1Jc1JvYW1pbmcgPyAxIDogMCk7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVJlYXNvbik7Ci0gICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZGVzdC53cml0ZUludChtTmV0d29ya1R5cGUpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtU3VidHlwZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1UeXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRGV0YWlsZWRTdGF0ZS5uYW1lKCkpOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNGYWlsb3ZlciA/IDEgOiAwKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzQXZhaWxhYmxlID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZUludChtSXNSb2FtaW5nID8gMSA6IDApOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtUmVhc29uKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobUV4dHJhSW5mbyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlVHJhY2tlci5qYXZhCmluZGV4IDA3MDdkZjMuLjU0MjBkOGYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGVUcmFja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTYsMzcxICsxNiwxMzMgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogCiAvKioKLSAqIEVhY2ggc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyBrZWVwcyB0cmFjayBvZiB0aGUgc3RhdGUgb2YgY29ubmVjdGl2aXR5Ci0gKiBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlLiBBbGwgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGEgbmV0d29yayBzaG91bGQKLSAqIGJlIGtlcHQgaW4gYSBUcmFja2VyIGNsYXNzLiBUaGlzIHN1cGVyY2xhc3MgbWFuYWdlcyB0aGUKLSAqIG5ldHdvcmstdHlwZS1pbmRlcGVuZGVudCBhc3BlY3RzIG9mIG5ldHdvcmsgc3RhdGUuCisgKiBJbnRlcmZhY2UgcHJvdmlkZXMgdGhlIHtAbGluayBjb20uYW5kcm9pZC5zZXJ2ZXIuQ29ubmVjdGl2aXR5U2VydmljZX0KKyAqIHdpdGggdGhyZWUgc2VydmljZXMuIEV2ZW50cyB0byB0aGUgQ29ubmVjdGl2aXR5U2VydmljZSB3aGVuCisgKiBjaGFuZ2VzIG9jY3VyLCBhbiBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBuZXR3b3JrIGFuZCBzdG9yYWdlCisgKiBmb3IgbmV0d29yayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgQ29ubmVjdGl2aXR5IHdpbGwgY2FsbCBzdGFydE1vbml0b3JpbmcgYmVmb3JlIGFueSBvdGhlcgorICogbWV0aG9kIGlzIGNhbGxlZC4KICAqCiAgKiB7QGhpZGV9CiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXR3b3JrU3RhdGVUcmFja2VyIGV4dGVuZHMgSGFuZGxlciB7CitwdWJsaWMgaW50ZXJmYWNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIgewogCi0gICAgcHJvdGVjdGVkIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKLSAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtVGFyZ2V0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgbUludGVyZmFjZU5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1EbnNQcm9wTmFtZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQ7Ci0gICAgcHJvdGVjdGVkIGludCBtRGVmYXVsdEdhdGV3YXlBZGRyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVGVhcmRvd25SZXF1ZXN0ZWQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdGVUcmFja2VyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NUQVRFX0NIQU5HRUQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUgPSAyOwogICAgIC8qKgotICAgICAqIGFyZzE6IDEgdG8gc2hvdywgMCB0byBoaWRlCi0gICAgICogYXJnMjogSUQgb2YgdGhlIG5vdGlmaWNhdGlvbgotICAgICAqIG9iajogTm90aWZpY2F0aW9uIChpZiBzaG93aW5nKQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBFdmVudCBJbnRlcmZhY2UgYmFjayB0byBDb25uZWN0aXZpdHlTZXJ2aWNlLgorICAgICAqCisgICAgICogVGhlIGV2ZW50cyB0aGF0IGFyZSB0byBiZSBzZW50IGJhY2sgdG8gdGhlIEhhbmRsZXIgcGFzc2VkCisgICAgICogdG8gc3RhcnRNb25pdG9yaW5nIHdoZW4gdGhlIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLgorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VEID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9ST0FNSU5HX0NIQU5HRUQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VEID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDc7CisKICAgICAvKioKLSAgICAgKiBhcmcxOiBuZXR3b3JrIHR5cGUKLSAgICAgKiBhcmcyOiBjb25kaXRpb24gKDAgYmFkLCAxMDAgZ29vZCkKKyAgICAgKiBUaGUgbmV0d29yayBzdGF0ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIE5ldHdvcmtJbmZvIG9iamVjdAorICAgICAqIGNvbnRhaW5zIHRoZSBuZXcgc3RhdGUuCisgICAgICoKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX1NUQVRFX0NIQU5HRUQKKyAgICAgKiBtc2cub2JqID0gTmV0d29ya0luZm8gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1RBVEVfQ0hBTkdFRCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBtc2cud2hhdCA9IEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRAorICAgICAqIG1zZy5vYmogPSBOZXR3b3JrSW5mbyBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQgPSAzOworCisgICAgLyoqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSworICAgICAqIG1zZy5vYmogPSBGZWF0dXJlVXNlciBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9SRVNUT1JFX0RFRkFVTFRfTkVUV09SSyA9IDY7CisKKyAgICAvKioKKyAgICAgKiBVU0VEIGJ5IENvbm5lY3Rpdml0eVNlcnZpY2Ugb25seQorICAgICAqCisgICAgICogbXNnLndoYXQgPSBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSworICAgICAqIG1zZy5hcmcxID0gbU5ldFRyYW5zaXRpb25XYWtlTG9ja1NlcmlhbE51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLID0gNzsKKworICAgIC8qKgorICAgICAqIG1zZy5hcmcxID0gbmV0d29yayB0eXBlCisgICAgICogbXNnLmFyZzIgPSBjb25kaXRpb24gKDAgYmFkLCAxMDAgZ29vZCkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTkVUX0NPTkRJVElPTl9DSEFOR0UgPSA4OworCiAgICAgLyoqCi0gICAgICogYXJnMTogbmV0d29yayB0eXBlCisgICAgICogbXNnLmFyZzEgPSBuZXR3b3JrIHR5cGUKKyAgICAgKiBtc2cuYXJnMiA9IGRlZmF1bHQgY29ubmVjdGlvbiBzZXF1ZW5jZSBudW1iZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JTkVUX0NPTkRJVElPTl9IT0xEX0VORCA9IDk7CiAKLSAgICBwdWJsaWMgTmV0d29ya1N0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBIYW5kbGVyIHRhcmdldCwKLSAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSwKLSAgICAgICAgICAgIGludCBzdWJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIENvbnRyb2wgSW50ZXJmYWNlCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqLworICAgIC8qKgorICAgICAqIEJlZ2luIG1vbml0b3JpbmcgZGF0YSBjb25uZWN0aXZpdHkuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRoZSBmaXJzdCBtZXRob2QgY2FsbGVkIHdoZW4gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGlzIHRoZSBjdXJyZW50IEFuZHJvaWQgY29udGV4dAorICAgICAqIEBwYXJhbSB0YXJnZXQgaXMgdGhlIEhhbmRlciB0byB3aGljaCB0byByZXR1cm4gdGhlIGV2ZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCk7CiAKLSAgICAgICAgdGhpcy5tTmV0d29ya0luZm8gPSBuZXcgTmV0d29ya0luZm8obmV0d29ya1R5cGUsIHN1YlR5cGUsIHR5cGVOYW1lLCBzdWJ0eXBlTmFtZSk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIEZldGNoIE5ldHdvcmtJbmZvIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpOwogCi0gICAgcHVibGljIE5ldHdvcmtJbmZvIGdldE5ldHdvcmtJbmZvKCkgewotICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBGZXRjaCBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgc3lzdGVtIHByb3BlcnRpZXMgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRjcCBidWZmZXIgc2l6ZXMKICAgICAgKiBmb3IgdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIEROUyBzZXJ2ZXJzIGF2YWlsYWJsZSBmb3IgdGhlIG1vYmlsZSBkYXRhCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgRE5TIGFkZHJlc3Nlcywgd2l0aCBubyBob2xlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TmFtZVNlcnZlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lU2VydmVyTGlzdChtRG5zUHJvcE5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGlzCi0gICAgICogbmV0d29yayBpbnRlcmZhY2UuCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMgdGhlIG5hbWVzIG9mIHRoZSBzeXN0ZW0gcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMKLSAgICAgKiBnaXZlIHRoZSBJUCBhZGRyZXNzZXMuIFByb3BlcnRpZXMgd2l0aCBubyB2YWx1ZXMgYXJlIHNraXBwZWQuCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiB7QGNvZGUgU3RyaW5nfXMgY29udGFpbmluZyB0aGUgSVAgYWRkcmVzc2VzCi0gICAgICogb2YgdGhlIEROUyBzZXJ2ZXJzLCBpbiBkb3Qtbm90YXRpb24uIFRoaXMgbWF5IGhhdmUgZmV3ZXIKLSAgICAgKiBub24tbnVsbCBlbnRyaWVzIHRoYW4gdGhlIGxpc3Qgb2YgbmFtZXMgcGFzc2VkIGluLCBzaW5jZQotICAgICAqIHNvbWUgb2YgdGhlIHBhc3NlZC1pbiBuYW1lcyBtYXkgaGF2ZSBlbXB0eSB2YWx1ZXMuCi0gICAgICovCi0gICAgc3RhdGljIHByb3RlY3RlZCBTdHJpbmdbXSBnZXROYW1lU2VydmVyTGlzdChTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGRuc0FkZHJlc3NlcyA9IG5ldyBTdHJpbmdbcHJvcGVydHlOYW1lcy5sZW5ndGhdOwotICAgICAgICBpbnQgaSwgajsKLQotICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZXNbaV0pOwotICAgICAgICAgICAgLy8gVGhlIEdTTSBsYXllciBzb21ldGltZXMgc2V0cyBhIGJvZ3VzIEROUyBzZXJ2ZXIgYWRkcmVzcyBvZgotICAgICAgICAgICAgLy8gMC4wLjAuMAotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkgJiYgIVRleHRVdGlscy5lcXVhbHModmFsdWUsICIwLjAuMC4wIikpIHsKLSAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNbaisrXSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkbnNBZGRyZXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIHRoaXMgKwotICAgICAgICAgICAgICAgICAgICAiKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIC0gbVByaXZhdGVEbnNSb3V0ZVNldCA9ICIrbVByaXZhdGVEbnNSb3V0ZVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIW1Qcml2YXRlRG5zUm91dGVTZXQpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGFkZHJTdHJpbmcgOiBnZXROYW1lU2VydmVycygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICIgIGFkZGluZyAiICsgYWRkclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShtSW50ZXJmYWNlTmFtZSwgaW5ldEFkZHJlc3MsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVEbnNSb3V0ZVNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIiBETlMgYWRkcmVzcyAiICsgYWRkclN0cmluZyArICIgOiBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyAtIHdlIHNob3VsZCBkbyB0aGlzIGV4cGxpY2l0bHkgYnV0IHRoZSBOZXRVdGlscyBhcGkgZG9lc250Ci0gICAgICAgIC8vIHN1cHBvcnQgdGhpcyB5ZXQgLSBtdXN0IHJlbW92ZSBhbGwuICBObyB3b3JzZSB0aGFuIGJlZm9yZQotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBtUHJpdmF0ZURuc1JvdXRlU2V0KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgKyBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGlmICgobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKG1EZWZhdWx0R2F0ZXdheUFkZHIgIT0gMCkpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGREZWZhdWx0Um91dGUgZm9yICIgKyBtTmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgbUludGVyZmFjZU5hbWUgKyAiKSwgR2F0ZXdheUFkZHI9IiArIG1EZWZhdWx0R2F0ZXdheUFkZHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGVmYXVsdEdhdGV3YXlBZGRyKTsKLSAgICAgICAgICAgIGlmIChpbmV0QWRkcmVzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiIFVuYWJsZSB0byBhZGQgZGVmYXVsdCByb3V0ZS4gbURlZmF1bHRHYXRld2F5QWRkciBFcnJvciIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIU5ldHdvcmtVdGlscy5hZGREZWZhdWx0Um91dGUobUludGVyZmFjZU5hbWUsIGluZXRBZGRyZXNzKSAmJiBEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICBVbmFibGUgdG8gYWRkIGRlZmF1bHQgcm91dGUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKCkgewotICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZURlZmF1bHRSb3V0ZSBmb3IgIiArIG1OZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsgIiAoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlRGVmYXVsdFJvdXRlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBuZXR3b3JrIHNwZWNpZmljIFRDUCBidWZmZXIgc2l6ZXMgZnJvbSBTeXN0ZW1Qcm9wZXJ0aWVzCi0gICAgICogbmV0LnRjcC5idWZmZXJzaXplLltkZWZhdWx0fHdpZml8dW10c3xlZGdlfGdwcnNdIGFuZCBzZXQgdGhlbSBmb3Igc3lzdGVtCi0gICAgICogd2lkZSB1c2UKLSAgICAgKi8KLSAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKLQotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCBrZXkgKyAiIG5vdCBmb3VuZCBpbiBzeXN0ZW0gcHJvcGVydGllcy4gVXNpbmcgZGVmYXVsdHMiKTsKLQotICAgICAgICAgICAgLy8gU2V0dGluZyB0byBkZWZhdWx0IHZhbHVlcyBzbyB3ZSB3b24ndCBiZSBzdHVjayB0byBwcmV2aW91cyB2YWx1ZXMKLSAgICAgICAgICAgIGtleSA9ICJuZXQudGNwLmJ1ZmZlcnNpemUuZGVmYXVsdCI7Ci0gICAgICAgICAgICBidWZmZXJTaXplcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdmFsdWVzIGluIGtlcm5lbAotICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlNldHRpbmcgVENQIHZhbHVlczogWyIgKyBidWZmZXJTaXplcwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSB3aGljaCBjb21lcyBmcm9tIFsiICsga2V5ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEJ1ZmZlclNpemUoYnVmZmVyU2l6ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgd2FrZWxvY2ssIGlmIGFueSwgdGhhdCBtYXkgYmUgaGVsZCB3aGlsZSBoYW5kbGluZyBhCi0gICAgICogZGlzY29ubmVjdCBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVdha2VMb2NrKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KLSAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQotICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXJTaXplcyBpbiB0aGUgZm9ybWF0IG9mICJyZWFkTWluLCByZWFkSW5pdGlhbCwgcmVhZE1heCwKLSAgICAgKiAgICAgICAgd3JpdGVNaW4sIHdyaXRlSW5pdGlhbCwgd3JpdGVNYXgiCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEJ1ZmZlclNpemUoU3RyaW5nIGJ1ZmZlclNpemVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBidWZmZXJTaXplcy5zcGxpdCgiLCIpOwotCi0gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2FuJ3Qgc2V0IHRjcCBidWZmZXIgc2l6ZXM6IiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBzdHJpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1RvRmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBzdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0LndyaXRlKHN0cmluZyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIHNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLCBhbmQgaWYgaXQgaXMgYQotICAgICAqIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSwgc2VuZCBhIG5vdGlmaWNhdGlvbiB0bwotICAgICAqIGFueSBsaXN0ZW5lcnMuCi0gICAgICogQHBhcmFtIHN0YXRlIHRoZSBuZXcgQHtjb2RlIERldGFpbGVkU3RhdGV9Ci0gICAgICogQHBhcmFtIHJlYXNvbiBhIHtAY29kZSBTdHJpbmd9IGluZGljYXRpbmcgYSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UsCi0gICAgICogaWYgb25lIHdhcyBzdXBwbGllZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KLSAgICAgKiBAcGFyYW0gZXh0cmFJbmZvIG9wdGlvbmFsIHtAY29kZSBTdHJpbmd9IHByb3ZpZGluZyBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgY2hhbmdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsZWRTdGF0ZShOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHN0YXRlLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZXh0cmFJbmZvKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldERldGFpbGVkIHN0YXRlLCBvbGQgPSIrbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSsiIGFuZCBuZXcgc3RhdGU9IitzdGF0ZSk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBtTmV0d29ya0luZm8uZ2V0RGV0YWlsZWRTdGF0ZSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHdhc0Nvbm5lY3RpbmcgPSAobU5ldHdvcmtJbmZvLmdldFN0YXRlKCkgPT0gTmV0d29ya0luZm8uU3RhdGUuQ09OTkVDVElORyk7Ci0gICAgICAgICAgICBTdHJpbmcgbGFzdFJlYXNvbiA9IG1OZXR3b3JrSW5mby5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJZiBhIHJlYXNvbiB3YXMgc3VwcGxpZWQgd2hlbiB0aGUgQ09OTkVDVElORyBzdGF0ZSB3YXMgZW50ZXJlZCwgYW5kIG5vCi0gICAgICAgICAgICAgKiByZWFzb24gd2FzIHN1cHBsaWVkIGZvciBlbnRlcmluZyB0aGUgQ09OTkVDVEVEIHN0YXRlLCB0aGVuIHJldGFpbiB0aGUKLSAgICAgICAgICAgICAqIHJlYXNvbiB0aGF0IHdhcyBzdXBwbGllZCB3aGVuIGdvaW5nIHRvIENPTk5FQ1RJTkcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh3YXNDb25uZWN0aW5nICYmIHN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEICYmIHJlYXNvbiA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGxhc3RSZWFzb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFzb24gPSBsYXN0UmVhc29uOwotICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIHJlYXNvbiwgZXh0cmFJbmZvKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NUQVRFX0NIQU5HRUQsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZXRhaWxlZFN0YXRlSW50ZXJuYWwoTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBzdGF0ZSkgewotICAgICAgICBtTmV0d29ya0luZm8uc2V0RGV0YWlsZWRTdGF0ZShzdGF0ZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVhcmRvd25SZXF1ZXN0ZWQoYm9vbGVhbiBpc1JlcXVlc3RlZCkgewotICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQgPSBpc1JlcXVlc3RlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RlYXJkb3duUmVxdWVzdGVkKCkgewotICAgICAgICByZXR1cm4gbVRlYXJkb3duUmVxdWVzdGVkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZW5kIGEgIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSByZXN1bHRzIG9mIGEgc2NhbiBmb3IgbmV0d29yayBhY2Nlc3MKLSAgICAgKiBwb2ludHMgaGFzIGNvbXBsZXRlZCwgYW5kIHJlc3VsdHMgYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEUsIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIHJvYW1pbmcgc3RhdHVzIG9mIHRoZSBkZXZpY2UsIGFuZCBpZiBpdCBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cwotICAgICAqIHN0YXR1cywgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhbnkgbGlzdGVuZXJzLgotICAgICAqIEBwYXJhbSBpc1JvYW1pbmcge0Bjb2RlIHRydWV9IGlmIHRoZSBkZXZpY2UgaXMgbm93IHJvYW1pbmcsIHtAY29kZSBmYWxzZX0KLSAgICAgKiBpZiBpdCBpcyBubyBsb25nZXIgcm9hbWluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSb2FtaW5nU3RhdHVzKGJvb2xlYW4gaXNSb2FtaW5nKSB7Ci0gICAgICAgIGlmIChpc1JvYW1pbmcgIT0gbU5ldHdvcmtJbmZvLmlzUm9hbWluZygpKSB7Ci0gICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0Um9hbWluZyhpc1JvYW1pbmcpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfUk9BTUlOR19DSEFOR0VELCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3VidHlwZShpbnQgc3VidHlwZSwgU3RyaW5nIHN1YnR5cGVOYW1lKSB7Ci0gICAgICAgIGlmIChtTmV0d29ya0luZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaW50IG9sZFN1YnR5cGUgPSBtTmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOwotICAgICAgICAgICAgaWYgKHN1YnR5cGUgIT0gb2xkU3VidHlwZSkgewotICAgICAgICAgICAgICAgIG1OZXR3b3JrSW5mby5zZXRTdWJ0eXBlKHN1YnR5cGUsIHN1YnR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1UYXJnZXQub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX05FVFdPUktfU1VCVFlQRV9DSEFOR0VELCBvbGRTdWJ0eXBlLCAwLCBtTmV0d29ya0luZm8pOwotICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0TW9uaXRvcmluZygpOworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwQnVmZmVyU2l6ZXNQcm9wTmFtZSgpOwogCiAgICAgLyoqCiAgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYSB0ZWFyZG93biBvY2N1cnJlZCwge0Bjb2RlIGZhbHNlfSBpZiB0aGUKICAgICAgKiB0ZWFyZG93biBkaWQgbm90IG9jY3VyLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHRlYXJkb3duKCk7CisgICAgcHVibGljIGJvb2xlYW4gdGVhcmRvd24oKTsKIAogICAgIC8qKgogICAgICAqIFJlZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHdlJ3JlIGNvbm5lY3RlZCBvciBleHBlY3QgdG8gYmUgY29ubmVjdGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVjb25uZWN0KCk7CisgICAgcHVibGljIGJvb2xlYW4gcmVjb25uZWN0KCk7CiAKICAgICAvKioKICAgICAgKiBUdXJuIHRoZSB3aXJlbGVzcyByYWRpbyBvZmYgZm9yIGEgbmV0d29yay4KICAgICAgKiBAcGFyYW0gdHVybk9uIHtAY29kZSB0cnVlfSB0byB0dXJuIHRoZSByYWRpbyBvbiwge0Bjb2RlIGZhbHNlfQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFJhZGlvKGJvb2xlYW4gdHVybk9uKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5Pbik7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGlzIG5ldHdvcmsgaXMgYXZhaWxhYmxlIGZvcgogICAgICAqIGNvbm5lY3Rpb25zLiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gbWVhbnMgdGhhdCBzb21lIHF1YXNpLXBlcm1hbmVudAogICAgICAqIGNvbmRpdGlvbiBwcmV2ZW50cyBjb25uZWN0aXZpdHkgdG8gdGhpcyBuZXR3b3JrLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXZhaWxhYmxlKCk7CisgICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEZldGNoIGRlZmF1bHQgZ2F0ZXdheSBhZGRyZXNzIGZvciB0aGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEdhdGV3YXlBZGRyKCk7CiAKICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgd2FudHMgdG8KQEAgLTM5NCw3ICsxNTYsNyBAQAogICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CiAgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOworICAgIHB1YmxpYyBpbnQgc3RhcnRVc2luZ05ldHdvcmtGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgY2FsbGluZ1BpZCwgaW50IGNhbGxpbmdVaWQpOwogCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGlzIGZpbmlzaGVkCkBAIC00MDgsMjMgKzE3MCw0MyBAQAogICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CiAgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCk7CisgICAgcHVibGljIGludCBzdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKTsKIAogICAgIC8qKgotICAgICAqIEVuc3VyZSB0aGF0IGEgbmV0d29yayByb3V0ZSBleGlzdHMgdG8gZGVsaXZlciB0cmFmZmljIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBob3N0IHZpYSB0aGlzIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBTdG9yYWdlIEFQSSB1c2VkIGJ5IENvbm5lY3Rpdml0eVNlcnZpY2UgZm9yIHNhdmluZworICAgICAqIE5ldHdvcmsgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcXVlc3RSb3V0ZVRvSG9zdChJbmV0QWRkcmVzcyBob3N0QWRkcmVzcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAgLyoqCi0gICAgICogSW50ZXJwcmV0cyBzY2FuIHJlc3VsdHMuIFRoaXMgd2lsbCBiZSBjYWxsZWQgYXQgYSBzYWZlIHRpbWUgZm9yCi0gICAgICogcHJvY2Vzc2luZywgYW5kIGZyb20gYSBzYWZlIHRocmVhZC4KKyAgICAgKiBDaGVjayBpZiBwcml2YXRlIEROUyByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0gICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgZGVmYXVsdCByb3V0ZSBpcyBzZXQgZm9yIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdFJvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0ZWFyIGRvd24gd2FzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlIHRlYXIgZG93biByZXF1ZXN0ZWQgZnJvbSBjb25uZWN0aXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKTsKIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtVdGlscy5qYXZhCmluZGV4IDVkNGIwOTkuLjAxMDA0YzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1V0aWxzLmphdmEKQEAgLTUyLDcgKzUyLDExIEBACiAgICAgICAgICAgaW50IHByZWZpeExlbmd0aCwgU3RyaW5nIGd3KTsKIAogICAgIC8qKiBSZXR1cm4gdGhlIGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgcm91dGUgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuICovCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CisgICAgcHVibGljIHN0YXRpYyBJbmV0QWRkcmVzcyBnZXREZWZhdWx0Um91dGUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKKyAgICAgICAgaW50IGFkZHIgPSBnZXREZWZhdWx0Um91dGVOYXRpdmUoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgIHJldHVybiBpbnRUb0luZXRBZGRyZXNzKGFkZHIpOworICAgIH0KKyAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgaW50IGdldERlZmF1bHRSb3V0ZU5hdGl2ZShTdHJpbmcgaW50ZXJmYWNlTmFtZSk7CiAKICAgICAvKiogUmVtb3ZlIGhvc3Qgcm91dGVzIHRoYXQgdXNlcyB0aGUgbmFtZWQgaW50ZXJmYWNlLiAqLwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCByZW1vdmVIb3N0Um91dGVzKFN0cmluZyBpbnRlcmZhY2VOYW1lKTsKQEAgLTE5NCwxOSArMTk4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYWRkUm91dGUoaW50ZXJmYWNlTmFtZSwgZHN0U3RyLCBwcmVmaXhMZW5ndGgsIGd3U3RyKSA9PSAwOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHY0U3RyaW5nVG9JbnQoU3RyaW5nIHN0cikgewotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgICAgU3RyaW5nW10gYXJyYXkgPSBzdHIuc3BsaXQoIlxcLiIpOwotICAgICAgICBpZiAoYXJyYXkubGVuZ3RoICE9IDQpIHJldHVybiAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gSW50ZWdlci5wYXJzZUludChhcnJheVszXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsyXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVsxXSk7Ci0gICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDgpICsgSW50ZWdlci5wYXJzZUludChhcnJheVswXSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Qcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKaW5kZXggMjJjMzBhNS4uOWM2M2NkOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5LmphdmEKQEAgLTE2LDMyICsxNiwxNjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwSG9zdDsKLQogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUgdXNlciBhbmQgZGVmYXVsdCBwcm94eQogICogc2V0dGluZ3MuCiAgKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBQcm94eSB7CitwdWJsaWMgZmluYWwgY2xhc3MgUHJveHkgewogCiAgICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGV4dHJhIGRlYnVnZ2luZy4KLSAgICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgUFJPWFlfQ0hBTkdFX0FDVElPTiA9CisgICAgLy8gVXNlZCB0byBub3RpZnkgYW4gYXBwIHRoYXQncyBjYWNoaW5nIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gcHJveHkKKyAgICAvLyB0aGF0IGVpdGhlciB0aGUgZGVmYXVsdCBjb25uZWN0aW9uIG9yIGl0cyBwcm94eSBoYXMgY2hhbmdlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NIQU5HRV9BQ1RJT04gPQogICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBST1hZX0NIQU5HRSI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkV3JpdGVMb2NrIHNQcm94eUluZm9Mb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldHRpbmdzT2JzZXJ2ZXIgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIFByb3h5U3BlYyBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKworICAgIC8vIEhvc3RuYW1lIC8gSVAgUkVHRVggdmFsaWRhdGlvbgorICAgIC8vIE1hdGNoZXMgYmxhbmsgaW5wdXQsIGlwcywgYW5kIGRvbWFpbiBuYW1lcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0lQX1JFR0VYID0KKyAgICAgICAgIlthLXpBLVowLTldKyhcXC1bYS16QS1aMC05XSspKihcXC5bYS16QS1aMC05XSsoXFwtW2EtekEtWjAtOV0rKSopKiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVE5BTUVfUkVHRVhQID0gIl4kfF4iICsgTkFNRV9JUF9SRUdFWCArICIkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSE9TVE5BTUVfUEFUVEVSTjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMTElTVF9SRUdFWFAgPSAiJHxeKC4/IiArIE5BTUVfSVBfUkVHRVgKKyAgICAgICAgKyAiKSsoLCguPyIgKyBOQU1FX0lQX1JFR0VYICsgIikpKiQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBFWENMTElTVF9QQVRURVJOOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSE9TVE5BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZShIT1NUTkFNRV9SRUdFWFApOworICAgICAgICBFWENMTElTVF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKEVYQ0xMSVNUX1JFR0VYUCk7CisgICAgfQorCisgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgaG9sZHMgdGhlIHByb2Nlc3NlZCBleGNsdXNpb24gbGlzdCAtIGRvbid0IHdhbnQgdG8gcmVwYXJzZSBpdCBlYWNoIHRpbWUKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm94eVNwZWMgeworICAgICAgICBTdHJpbmdbXSBleGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgICAgIHB1YmxpYyBQcm94eVNwZWMoKSB7IH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSTEluRXhjbHVzaW9uTGlzdFJlYWRMb2NrZWQoU3RyaW5nIHVybCwgU3RyaW5nW10gZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXJpIHUgPSBVcmkucGFyc2UodXJsKTsKKyAgICAgICAgU3RyaW5nIHVybERvbWFpbiA9IHUuZ2V0SG9zdCgpOworICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIGRlZmluZWQgYXMgIi5hbmRyb2lkLmNvbSIgb3IgImFuZHJvaWQuY29tIiwgd2Ugd2lzaCB0byBtYXRjaAorICAgICAgICAvLyBodHRwOi8vYW5kcm9pZC5jb20gYXMgd2VsbCBhcyBodHRwOi8veHh4LmFuZHJvaWQuY29tICwgYnV0IG5vdAorICAgICAgICAvLyBodHRwOi8vbXlhbmRyb2lkLmNvbSAuIFRoaXMgY29kZSB3b3JrcyBvdXQgdGhlIGxvZ2ljLgorICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlZERvbWFpbiA6IGV4Y2x1c2lvbkxpc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBkb3REb21haW4gPSAiLiIgKyBleGNsdWRlZERvbWFpbjsKKyAgICAgICAgICAgIGlmICh1cmxEb21haW4uZXF1YWxzKGV4Y2x1ZGVkRG9tYWluKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybERvbWFpbi5lbmRzV2l0aChkb3REb21haW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gbWF0Y2gKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIHByb3h5U3BlYykgeworICAgICAgICBpbnQgaSA9IHByb3h5U3BlYy5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwcm94eVNwZWMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJveHlTcGVjLnN1YnN0cmluZygwLCBpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VQb3J0KFN0cmluZyBwcm94eVNwZWMpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eVNwZWMuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocHJveHlTcGVjLmxlbmd0aCgpID09IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaSA8IHByb3h5U3BlYy5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocHJveHlTcGVjLnN1YnN0cmluZyhpKzEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IG9iamVjdCB0byBiZSB1c2VkIGZvciB0aGUgVVJMIGdpdmVuIGFzIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBob3N0LgorICAgICAqIEBwYXJhbSB1cmwgQSBVUkwgdG8gYmUgYWNjZXNzZWQuIFVzZWQgdG8gZXZhbHVhdGUgZXhjbHVzaW9uIGxpc3QuCisgICAgICogQHJldHVybiBQcm94eSAoamF2YS5uZXQpIG9iamVjdCBjb250YWluaW5nIHRoZSBob3N0IG5hbWUuIElmIHRoZQorICAgICAqICAgICAgICAgdXNlciBkaWQgbm90IHNldCBhIGhvc3RuYW1lIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKiAgICAgICAgIEEgbnVsbCB2YWx1ZSBtZWFucyB0aGF0IG5vIGhvc3QgaXMgdG8gYmUgdXNlZC4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eSBnZXRQcm94eShDb250ZXh0IGN0eCwgU3RyaW5nIHVybCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgamF2YS5uZXQuUHJveHkgcmV0dmFsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFByb3h5IGRlZmluZWQgLSBBcHBseSBleGNsdXNpb24gcnVsZXMKKyAgICAgICAgICAgICAgICBpZiAoaXNVUkxJbkV4Y2x1c2lvbkxpc3RSZWFkTG9ja2VkKHVybCwgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbm8gcHJveHkKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsIHNHbG9iYWxQcm94eVNwZWMuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBuZXR3b3JrIGlzIFdpRmksIHJldHVybiBubyBwcm94eS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgTW9iaWxlIE9wZXJhdG9yIHByb3h5LgorICAgICAgICAgICAgICAgIGlmICghaXNOZXR3b3JrV2lmaShjdHgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGdldERlZmF1bHRQcm94eSh1cmwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGphdmEubmV0LlByb3h5Lk5PX1BST1hZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXR2YWwgIT0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFkpICYmIChpc0xvY2FsSG9zdCh1cmwpKSkgeworICAgICAgICAgICAgcmV0dmFsID0gamF2YS5uZXQuUHJveHkuTk9fUFJPWFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBmdW5jdGlvbgogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcHJveHkgaG9zdCBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICogQHBhcmFtIGN0eCBBIENvbnRleHQgdXNlZCB0byBnZXQgdGhlIHNldHRpbmdzIGZvciB0aGUgcHJveHkgaG9zdC4KQEAgLTQ5LDYwICsxODIsNTUgQEAKICAgICAgKiAgICAgICAgIG5hbWUgaXQgcmV0dXJucyB0aGUgZGVmYXVsdCBob3N0LiBBIG51bGwgdmFsdWUgbWVhbnMgdGhhdCBubwogICAgICAqICAgICAgICAgaG9zdCBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldEhvc3QoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRIb3N0KENvbnRleHQgY3R4KSB7CisgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXJzUmVhZExvY2tlZChjdHgpOworICAgICAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChjdHgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDAsIGkpOworICAgICAgICAgICAgaWYgKHNHbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHNhID0gc0dsb2JhbFByb3h5U3BlYy5hZGRyZXNzOworICAgICAgICAgICAgICAgIHJldHVybiBzYS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRIb3N0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0SG9zdCgpOwogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcm94eSBwb3J0IHNldCBieSB0aGUgdXNlci4KICAgICAgKiBAcGFyYW0gY3R4IEEgQ29udGV4dCB1c2VkIHRvIGdldCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBwcm94eSBwb3J0LgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIHVzZSBvciAtMSBpZiBubyBwcm94eSBpcyB0byBiZSB1c2VkLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgaW50IGdldFBvcnQoQ29udGV4dCBjdHgpIHsKLSAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGVudFJlc29sdmVyKTsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWSk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShob3N0Lmxlbmd0aCgpID09IDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0UG9ydChDb250ZXh0IGN0eCkgeworICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ29udGVudE9ic2VydmVyc1JlYWRMb2NrZWQoY3R4KTsKKyAgICAgICAgICAgICAgICBwYXJzZUdsb2JhbFByb3h5SW5mb1JlYWRMb2NrZWQoY3R4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGkgPCBob3N0Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChzR2xvYmFsUHJveHlTcGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYSA9IHNHbG9iYWxQcm94eVNwZWMuYWRkcmVzczsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2EuZ2V0UG9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoaSsxKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFBvcnQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRQb3J0KCk7CiAgICAgfQogCisgICAgLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgZnVuY3Rpb24KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJveHkgaG9zdCBzcGVjaWZpZWQgYnkgdGhlIGNhcnJpZXIuCiAgICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0aGUgaG9zdCBuYW1lIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJveHkgZm9yCiAgICAgICogdGhpcyBjYXJyaWVyLgogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgewogICAgICAgICBTdHJpbmcgaG9zdCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJuZXQuZ3Bycy5odHRwLXByb3h5Iik7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpICE9IDApKSB7CiAgICAgICAgICAgICBVcmkgdSA9IFVyaS5wYXJzZShob3N0KTsKICAgICAgICAgICAgIGhvc3QgPSB1LmdldEhvc3QoKTsKICAgICAgICAgICAgIHJldHVybiBob3N0OwpAQCAtMTExLDE0ICsyMzksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIGZ1bmN0aW9uCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IHByb3h5IHBvcnQgc3BlY2lmaWVkIGJ5IHRoZSBjYXJyaWVyLgogICAgICAqIEByZXR1cm4gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJveHkgaG9zdCBvciAtMSBpZiB0aGVyZSBpcwogICAgICAqIG5vIHByb3h5IGZvciB0aGlzIGNhcnJpZXIuCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZ2V0RGVmYXVsdFBvcnQoKSB7CiAgICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoIm5ldC5ncHJzLmh0dHAtcHJveHkiKTsKLSAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKICAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOwogICAgICAgICAgICAgcmV0dXJuIHUuZ2V0UG9ydCgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI2LDYgKzI1NSwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkgZ2V0RGVmYXVsdFByb3h5KFN0cmluZyB1cmwpIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIGdvIGF3YXkgd2hlbiBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgZnJvbSBDb25uZWN0aXZpdHlNYW5hZ2VyLi4uCisgICAgICAgIC8vIFRoZXJlIGFyZSBicm9hZGNhc3Qgb2YgbmV0d29yayBwcm94aWVzLCBzbyB0aGV5IGFyZSBwYXJzZSBtYW51YWxseS4KKyAgICAgICAgU3RyaW5nIGhvc3QgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgibmV0LmdwcnMuaHR0cC1wcm94eSIpOworICAgICAgICBpZiAoKGhvc3QgIT0gbnVsbCkgJiYgKGhvc3QubGVuZ3RoKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIFVyaSB1ID0gVXJpLnBhcnNlKGhvc3QpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLm5ldC5Qcm94eShqYXZhLm5ldC5Qcm94eS5UeXBlLkhUVFAsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyh1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5ldC5Qcm94eS5OT19QUk9YWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZ1bmN0aW9uIC8gZGVwcmVjYXRlCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHByb3h5IHRvIGJlIHVzZWQgYnkgY2xpZW50cy4gVGhpcyBpcyBhIHdyYXBwZXIKICAgICAgKiBhcm91bmQge0BsaW5rIGFuZHJvaWQubmV0LlByb3h5I2dldEhvc3QoKX0uIEN1cnJlbnRseSBubyBwcm94eSB3aWxsCkBAIC0xMzgsMjYgKzI4MSwyMyBAQAogICAgICAqIGFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfTkVUV09SS19TVEFURQogICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcm94eSB0byBiZSB1c2VkIGJ5IGNsaWVudHMsIG9yIG51bGwgaWYgdGhlcmUKICAgICAgKiBpcyBubyBwcm94eS4KLSAgICAgKgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgcHVibGljIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEh0dHBIb3N0IGdldFByZWZlcnJlZEh0dHBIb3N0KENvbnRleHQgY29udGV4dCwKICAgICAgICAgICAgIFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKCFpc0xvY2FsSG9zdCh1cmwpICYmICFpc05ldHdvcmtXaWZpKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJveHlIb3N0ID0gUHJveHkuZ2V0SG9zdChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3QocHJveHlIb3N0LCBQcm94eS5nZXRQb3J0KGNvbnRleHQpLCAiaHR0cCIpOwotICAgICAgICAgICAgfQorICAgICAgICBqYXZhLm5ldC5Qcm94eSBwcmVmUHJveHkgPSBnZXRQcm94eShjb250ZXh0LCB1cmwpOworICAgICAgICBpZiAocHJlZlByb3h5LmVxdWFscyhqYXZhLm5ldC5Qcm94eS5OT19QUk9YWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2EgPSAoSW5ldFNvY2tldEFkZHJlc3MpcHJlZlByb3h5LmFkZHJlc3MoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhvc3Qoc2EuZ2V0SG9zdE5hbWUoKSwgc2EuZ2V0UG9ydCgpLCAiaHR0cCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xvY2FsSG9zdChTdHJpbmcgdXJsKSB7CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKHVybCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CkBAIC0xNzQsMTUgKzMxNCwxMyBAQAogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWV4KSB7CiAgICAgICAgICAgICAvLyBJZ25vcmUgKFVSSS5jcmVhdGUpCiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBpc05ldHdvcmtXaWZpKENvbnRleHQgY29udGV4dCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNOZXR3b3JrV2lmaShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0KICAgICAgICAgZmluYWwgQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uZWN0aXZpdHkgPSAoQ29ubmVjdGl2aXR5TWFuYWdlcikKICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgaWYgKGNvbm5lY3Rpdml0eSAhPSBudWxsKSB7CkBAIC0xOTIsNyArMzMwLDEyOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKworICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgU2V0dGluZ3NPYnNlcnZlcihDb250ZXh0IGN0eCkgeworICAgICAgICAgICAgc3VwZXIobmV3IEhhbmRsZXIoY3R4LmdldE1haW5Mb29wZXIoKSkpOworICAgICAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChtQ29udGV4dCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCByZWdpc3RlckNvbnRlbnRPYnNlcnZlcnNSZWFkTG9ja2VkKENvbnRleHQgY3R4KSB7CisgICAgICAgIFVyaSB1cmlHbG9iYWxQcm94eSA9IFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFkpOworICAgICAgICBVcmkgdXJpR2xvYmFsRXhjbExpc3QgPQorICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCk7CisKKyAgICAgICAgLy8gTm8gbG9jayB1cGdyYWRpbmcgKGZyb20gcmVhZCB0byB3cml0ZSkgYWxsb3dlZAorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlDaGFuZ2VkT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihjdHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gRG93bmdyYWRpbmcgbG9ja3MgKGZyb20gd3JpdGUgdG8gcmVhZCkgaXMgYWxsb3dlZAorICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjdHguZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIodXJpR2xvYmFsUHJveHksIGZhbHNlLAorICAgICAgICAgICAgICAgIHNHbG9iYWxQcm94eUNoYW5nZWRPYnNlcnZlcik7CisgICAgICAgIGN0eC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcih1cmlHbG9iYWxFeGNsTGlzdCwgZmFsc2UsCisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5Q2hhbmdlZE9ic2VydmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIHBhcnNlR2xvYmFsUHJveHlJbmZvUmVhZExvY2tlZChDb250ZXh0IGN0eCkgeworICAgICAgICBDb250ZW50UmVzb2x2ZXIgY29udGVudFJlc29sdmVyID0gY3R4LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTdHJpbmcgcHJveHlIb3N0ID0gIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZKTsKKyAgICAgICAgaWYgKChwcm94eUhvc3QgPT0gbnVsbCkgfHwgKHByb3h5SG9zdC5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICAgICAgLy8gQ2xlYXIgc2lnbmFsCisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYyA9IG51bGw7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0U3BlYyA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5IVFRQX1BST1hZX0VYQ0xVU0lPTl9MSVNUKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBwYXJzZUhvc3QocHJveHlIb3N0KTsKKyAgICAgICAgaW50IHBvcnQgPSBwYXJzZVBvcnQocHJveHlIb3N0KTsKKyAgICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbmV3IFByb3h5U3BlYygpOworICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5hZGRyZXNzPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBpZiAoKGV4Y2x1c2lvbkxpc3RTcGVjICE9IG51bGwpICYmIChleGNsdXNpb25MaXN0U3BlYy5sZW5ndGgoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1c2lvbkxpc3RFbnRyaWVzID0gZXhjbHVzaW9uTGlzdFNwZWMudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb2Nlc3NlZEVudHJpZXMgPSBuZXcgU3RyaW5nW2V4Y2x1c2lvbkxpc3RFbnRyaWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdXNpb25MaXN0RW50cmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBleGNsdXNpb25MaXN0RW50cmllc1tpXS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZW50cnkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVudHJpZXNbaV0gPSBlbnRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gcHJvY2Vzc2VkRW50cmllczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc1Byb3h5SW5mb0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICAgICAgc0dsb2JhbFByb3h5U3BlYy5leGNsdXNpb25MaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNQcm94eUluZm9Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICBzUHJveHlJbmZvTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBzR2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzUHJveHlJbmZvTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgc1Byb3h5SW5mb0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgc3ludGF4IG9mIGhvc3RuYW1lLCBwb3J0IGFuZCBleGNsdXNpb24gbGlzdCBlbnRyaWVzCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShTdHJpbmcgaG9zdG5hbWUsIFN0cmluZyBwb3J0LCBTdHJpbmcgZXhjbExpc3QpIHsKKyAgICAgICAgTWF0Y2hlciBtYXRjaCA9IEhPU1ROQU1FX1BBVFRFUk4ubWF0Y2hlcihob3N0bmFtZSk7CisgICAgICAgIE1hdGNoZXIgbGlzdE1hdGNoID0gRVhDTExJU1RfUEFUVEVSTi5tYXRjaGVyKGV4Y2xMaXN0KTsKKworICAgICAgICBpZiAoIW1hdGNoLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsaXN0TWF0Y2gubWF0Y2hlcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPiAwICYmIHBvcnQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoaG9zdG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwb3J0VmFsID0gLTE7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBvcnRWYWwgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcnRWYWwgPD0gMCB8fCBwb3J0VmFsID4gMHhGRkZGKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1Byb3h5UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTlmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvUHJveHlQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNvbnRhaW5lciBjbGFzcyBmb3IgdGhlIGh0dHAgcHJveHkgaW5mbworICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFByb3h5UHJvcGVydGllcyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHJpdmF0ZSBJbmV0U29ja2V0QWRkcmVzcyBtUHJveHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4Y2x1c2lvbkxpc3Q7CisKKyAgICBwdWJsaWMgUHJveHlQcm9wZXJ0aWVzKCkgeworICAgIH0KKworICAgIC8vIGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZiBjbG9uZQorICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXMoUHJveHlQcm9wZXJ0aWVzIHNvdXJjZSkgeworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcm94eSA9IHNvdXJjZS5nZXRTb2NrZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBTdHJpbmcgZXhjbHVzaW9uTGlzdCA9IHNvdXJjZS5nZXRFeGNsdXNpb25MaXN0KCk7CisgICAgICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4Y2x1c2lvbkxpc3QgPSBuZXcgU3RyaW5nKGV4Y2x1c2lvbkxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEluZXRTb2NrZXRBZGRyZXNzIGdldFNvY2tldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBtUHJveHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U29ja2V0QWRkcmVzcyhJbmV0U29ja2V0QWRkcmVzcyBwcm94eSkgeworICAgICAgICBtUHJveHkgPSBwcm94eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2x1c2lvbkxpc3QoKSB7CisgICAgICAgIHJldHVybiBtRXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdXNpb25MaXN0KFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIG1FeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobVByb3h5LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKG1FeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgeGw9IikuYXBwZW5kKG1FeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudCB0aGUgUGFyY2VsYWJsZSBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgaWYgKG1Qcm94eSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbmV0QWRkcmVzcyBhZGRyID0gbVByb3h5LmdldEFkZHJlc3MoKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgoYnl0ZSkxKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZUFycmF5KGFkZHIuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1Qcm94eS5nZXRQb3J0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKGJ5dGUpMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtRXhjbHVzaW9uTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+IENSRUFUT1IgPQorICAgICAgICBuZXcgQ3JlYXRvcjxQcm94eVByb3BlcnRpZXM+KCkgeworICAgICAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllcyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBuZXcgUHJveHlQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhpbi5jcmVhdGVCeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0U29ja2V0QWRkcmVzcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgaW4ucmVhZEludCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0RXhjbHVzaW9uTGlzdChpbi5yZWFkU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBwcm94eVByb3BlcnRpZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcm94eVByb3BlcnRpZXNbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHlQcm9wZXJ0aWVzW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1VyaS5qYXZhCmluZGV4IDQ3ZmFhYmEuLjNiMjE1OTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9VcmkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVXJpLmphdmEKQEAgLTI4LDggKzI4LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogSW1tdXRhYmxlIFVSSSByZWZlcmVuY2UuIEEgVVJJIHJlZmVyZW5jZSBpbmNsdWRlcyBhIFVSSSBhbmQgYSBmcmFnbWVudCwgdGhlCkBAIC00Nyw3ICs0OSw3IEBACiAgICAgLyoKIAogICAgIFRoaXMgY2xhc3MgYWltcyB0byBkbyBhcyBsaXR0bGUgdXAgZnJvbnQgd29yayBhcyBwb3NzaWJsZS4gVG8gYWNjb21wbGlzaAotICAgIHRoYXQsIHdlIHZhcnkgdGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIHBhc3NlcyBpbi4KKyAgICB0aGF0LCB3ZSB2YXJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBwYXNzZXMgaW4uCiAgICAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgb25lIGltcGxlbWVudGF0aW9uIGlmIHRoZSB1c2VyIHBhc3NlcyBpbiBhCiAgICAgVVJJIHN0cmluZyAoU3RyaW5nVXJpKSBhbmQgYW5vdGhlciBpZiB0aGUgdXNlciBwYXNzZXMgaW4gdGhlCiAgICAgaW5kaXZpZHVhbCBjb21wb25lbnRzIChPcGFxdWVVcmkpLgpAQCAtMTI1MywxNCArMTI1NSwxNiBAQAogICAgICAqIGNvbmN1cnJlbnQgdXNlLgogICAgICAqCiAgICAgICogPHA+QW4gYWJzb2x1dGUgaGllcmFyY2hpY2FsIFVSSSByZWZlcmVuY2UgZm9sbG93cyB0aGUgcGF0dGVybjoKLSAgICAgKiB7QGNvZGUgJmx0O3NjaGVtZSZndDs6Ly8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDthYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICoge0Bjb2RlIDxzY2hlbWU+Oi8vPGF1dGhvcml0eT48YWJzb2x1dGUgcGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+fQogICAgICAqCiAgICAgICogPHA+UmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgKHdoaWNoIGFyZSBhbHdheXMgaGllcmFyY2hpY2FsKSBmb2xsb3cgb25lCi0gICAgICogb2YgdHdvIHBhdHRlcm5zOiB7QGNvZGUgJmx0O3JlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgmZ3Q7PyZsdDtxdWVyeSZndDsjJmx0O2ZyYWdtZW50Jmd0O30KLSAgICAgKiBvciB7QGNvZGUgLy8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDthYnNvbHV0ZSBwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICogb2YgdHdvIHBhdHRlcm5zOiB7QGNvZGUgPHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50Pn0KKyAgICAgKiBvciB7QGNvZGUgLy88YXV0aG9yaXR5PjxhYnNvbHV0ZSBwYXRoPj88cXVlcnk+IzxmcmFnbWVudD59CiAgICAgICoKICAgICAgKiA8cD5BbiBvcGFxdWUgVVJJIGZvbGxvd3MgdGhpcyBwYXR0ZXJuOgotICAgICAqIHtAY29kZSAmbHQ7c2NoZW1lJmd0OzombHQ7b3BhcXVlIHBhcnQmZ3Q7IyZsdDtmcmFnbWVudCZndDt9CisgICAgICoge0Bjb2RlIDxzY2hlbWU+OjxvcGFxdWUgcGFydD4jPGZyYWdtZW50Pn0KKyAgICAgKiAKKyAgICAgKiA8cD5Vc2Uge0BsaW5rIFVyaSNidWlsZFVwb24oKX0gdG8gb2J0YWluIGEgYnVpbGRlciByZXByZXNlbnRpbmcgYW4gZXhpc3RpbmcgVVJJLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CiAKQEAgLTE0NDcsNiArMTQ1MSwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFycyB0aGUgdGhlIHByZXZpb3VzbHkgc2V0IHF1ZXJ5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJRdWVyeSgpIHsKKyAgICAgICAgICByZXR1cm4gcXVlcnkoKFBhcnQpIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdHMgYSBVcmkgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGVzLgogICAgICAgICAgKgogICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBVUkkgaXMgb3BhcXVlIGFuZCB0aGUKQEAgLTE0OTEsMTkgKzE1MDIsNjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIHRoZSB1bmlxdWUgbmFtZXMgb2YgYWxsIHF1ZXJ5IHBhcmFtZXRlcnMuIEl0ZXJhdGluZworICAgICAqIG92ZXIgdGhlIHNldCB3aWxsIHJldHVybiB0aGUgbmFtZXMgaW4gb3JkZXIgb2YgdGhlaXIgZmlyc3Qgb2NjdXJyZW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIGhpZXJhcmNoaWNhbCBVUkkKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgZGVjb2RlZCBuYW1lcworICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBpZiAoaXNPcGFxdWUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE5PVF9ISUVSQVJDSElDQUwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0RW5jb2RlZFF1ZXJ5KCk7CisgICAgICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gKG5leHQgPT0gLTEpID8gcXVlcnkubGVuZ3RoKCkgOiBuZXh0OworCisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHF1ZXJ5LnN1YnN0cmluZyhzdGFydCwgc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIG5hbWVzLmFkZChkZWNvZGUobmFtZSkpOworCisgICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIGVuZCBvZiBuYW1lLgorICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICB9IHdoaWxlIChzdGFydCA8IHF1ZXJ5Lmxlbmd0aCgpKTsKKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5hbWVzKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZWFyY2hlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBwYXJhbWV0ZXIgdmFsdWVzIHdpdGggdGhlIGdpdmVuIGtleS4KICAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgd2hpY2ggd2lsbCBiZSBlbmNvZGVkCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBrZXkgaXMgbnVsbAotICAgICAqCiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgZGVjb2RlZCB2YWx1ZXMKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFF1ZXJ5UGFyYW1ldGVycyhTdHJpbmcga2V5KSB7CiAgICAgICAgIGlmIChpc09wYXF1ZSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTk9UX0hJRVJBUkNISUNBTCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOwogICAgICAgICBpZiAocXVlcnkgPT0gbnVsbCkgewpAQCAtMTUxNywzOSArMTU2OSwzNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gUHJlcGVuZCBxdWVyeSB3aXRoICImIiBtYWtpbmcgdGhlIGZpcnN0IHBhcmFtZXRlciB0aGUgc2FtZSBhcyB0aGUKLSAgICAgICAgLy8gcmVzdC4KLSAgICAgICAgcXVlcnkgPSAiJiIgKyBxdWVyeTsKLQotICAgICAgICAvLyBQYXJhbWV0ZXIgcHJlZml4LgotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiYiICsgZW5jb2RlZEtleSArICI9IjsKLQogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKIAogICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gcXVlcnkubGVuZ3RoKCk7Ci0gICAgICAgIHdoaWxlIChzdGFydCA8IGxlbmd0aCkgewotICAgICAgICAgICAgc3RhcnQgPSBxdWVyeS5pbmRleE9mKHByZWZpeCwgc3RhcnQpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgbmV4dEFtcGVyc2FuZCA9IHF1ZXJ5LmluZGV4T2YoJyYnLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gbmV4dEFtcGVyc2FuZCAhPSAtMSA/IG5leHRBbXBlcnNhbmQgOiBxdWVyeS5sZW5ndGgoKTsKIAotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbW9yZSB2YWx1ZXMuCisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yIC0gc3RhcnQgPT0gZW5jb2RlZEtleS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAmJiBxdWVyeS5yZWdpb25NYXRjaGVzKHN0YXJ0LCBlbmNvZGVkS2V5LCAwLCBlbmNvZGVkS2V5Lmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKCIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChkZWNvZGUocXVlcnkuc3Vic3RyaW5nKHNlcGFyYXRvciArIDEsIGVuZCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgc3RhcnQgdG8gZW5kIG9mIG5hbWUuCisgICAgICAgICAgICBpZiAobmV4dEFtcGVyc2FuZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dEFtcGVyc2FuZCArIDE7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNb3ZlIHN0YXJ0IHRvIHN0YXJ0IG9mIHZhbHVlLgotICAgICAgICAgICAgc3RhcnQgKz0gcHJlZml4Lmxlbmd0aCgpOwotCi0gICAgICAgICAgICAvLyBGaW5kIGVuZCBvZiB2YWx1ZS4KLSAgICAgICAgICAgIGludCBlbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGVuZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVuZCA9IHF1ZXJ5Lmxlbmd0aCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKGRlY29kZSh2YWx1ZSkpOwotCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKLSAgICAgICAgfQorICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh2YWx1ZXMpOwogICAgIH0KQEAgLTE1NjAsNyArMTYwNyw2IEBACiAgICAgICogQHBhcmFtIGtleSB3aGljaCB3aWxsIGJlIGVuY29kZWQKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgaXNuJ3QgYSBoaWVyYXJjaGljYWwgVVJJCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBrZXkgaXMgbnVsbAotICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBvciBudWxsIGlmIG5vIHBhcmFtZXRlciBpcyBmb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbWV0ZXIoU3RyaW5nIGtleSkgewpAQCAtMTU2OCw3ICsxNjE0LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihOT1RfSElFUkFSQ0hJQ0FMKTsKICAgICAgICAgfQogICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImtleSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJrZXkiKTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IGdldEVuY29kZWRRdWVyeSgpOwpAQCAtMTU3NywzNyArMTYyMyw1NCBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRLZXkgPSBlbmNvZGUoa2V5LCBudWxsKTsKLSAgICAgICAgZmluYWwgaW50IGVuY29kZWRLZXlMZW5ndGggPSBlbmNvZGVkS2V5Lmxlbmd0aCgpOworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcXVlcnkubGVuZ3RoKCk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBuZXh0QW1wZXJzYW5kID0gcXVlcnkuaW5kZXhPZignJicsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBlbmQgPSBuZXh0QW1wZXJzYW5kICE9IC0xID8gbmV4dEFtcGVyc2FuZCA6IGxlbmd0aDsKIAotICAgICAgICBpbnQgZW5jb2RlZEtleVNlYXJjaEluZGV4ID0gMDsKLSAgICAgICAgZmluYWwgaW50IGVuY29kZWRLZXlTZWFyY2hFbmQgPSBxdWVyeS5sZW5ndGgoKSAtIChlbmNvZGVkS2V5TGVuZ3RoICsgMSk7CisgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcXVlcnkuaW5kZXhPZignPScsIHN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiBlbmQgfHwgc2VwYXJhdG9yID09IC0xKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gZW5kOworICAgICAgICAgICAgfQogCi0gICAgICAgIHdoaWxlIChlbmNvZGVkS2V5U2VhcmNoSW5kZXggPD0gZW5jb2RlZEtleVNlYXJjaEVuZCkgewotICAgICAgICAgICAgaW50IGtleUluZGV4ID0gcXVlcnkuaW5kZXhPZihlbmNvZGVkS2V5LCBlbmNvZGVkS2V5U2VhcmNoSW5kZXgpOwotICAgICAgICAgICAgaWYgKGtleUluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZXF1YWxzSW5kZXggPSBrZXlJbmRleCArIGVuY29kZWRLZXlMZW5ndGg7Ci0gICAgICAgICAgICBpZiAoZXF1YWxzSW5kZXggPj0gcXVlcnkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChxdWVyeS5jaGFyQXQoZXF1YWxzSW5kZXgpICE9ICc9JykgewotICAgICAgICAgICAgICAgIGVuY29kZWRLZXlTZWFyY2hJbmRleCA9IGVxdWFsc0luZGV4ICsgMTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXlJbmRleCA9PSAwIHx8IHF1ZXJ5LmNoYXJBdChrZXlJbmRleCAtIDEpID09ICcmJykgewotICAgICAgICAgICAgICAgIGludCBlbmQgPSBxdWVyeS5pbmRleE9mKCcmJywgZXF1YWxzSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gcXVlcnkubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoc2VwYXJhdG9yIC0gc3RhcnQgPT0gZW5jb2RlZEtleS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAmJiBxdWVyeS5yZWdpb25NYXRjaGVzKHN0YXJ0LCBlbmNvZGVkS2V5LCAwLCBlbmNvZGVkS2V5Lmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGUocXVlcnkuc3Vic3RyaW5nKHNlcGFyYXRvciArIDEsIGVuZCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHF1ZXJ5LnN1YnN0cmluZyhlcXVhbHNJbmRleCArIDEsIGVuZCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkS2V5U2VhcmNoSW5kZXggPSBlcXVhbHNJbmRleCArIDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW92ZSBzdGFydCB0byBlbmQgb2YgbmFtZS4KKyAgICAgICAgICAgIGlmIChuZXh0QW1wZXJzYW5kICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0QW1wZXJzYW5kICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgZmlyc3QgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGFuZCBpbnRlcnByZXRzIGl0CisgICAgICogYXMgYSBib29sZWFuIHZhbHVlLiAiZmFsc2UiIGFuZCAiMCIgYXJlIGludGVycHJldGVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiwgZXZlcnl0aGluZworICAgICAqIGVsc2UgaXMgaW50ZXJwcmV0ZWQgYXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHdoaWNoIHdpbGwgYmUgZGVjb2RlZAorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5IHBhcmFtZXRlciBmb3Iga2V5CisgICAgICogQHJldHVybiB0aGUgYm9vbGVhbiBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGtleQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5RdWVyeVBhcmFtZXRlcihTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBTdHJpbmcgZmxhZyA9IGdldFF1ZXJ5UGFyYW1ldGVyKGtleSk7CisgICAgICAgIGlmIChmbGFnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgZmxhZyA9IGZsYWcudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuICghImZhbHNlIi5lcXVhbHMoZmxhZykgJiYgISIwIi5lcXVhbHMoZmxhZykpOworICAgIH0KKwogICAgIC8qKiBJZGVudGlmaWVzIGEgbnVsbCBwYXJjZWxsZWQgVXJpLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVUxMX1RZUEVfSUQgPSAwOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3MuamF2YQppbmRleCA0MTAxYWI0Li45YzRkNmU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvV2ViQWRkcmVzcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9XZWJBZGRyZXNzLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAKICAgICBzdGF0aWMgUGF0dGVybiBzQWRkcmVzc1BhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoCiAgICAgICAgICAgICAvKiBzY2hlbWUgICAgKi8gIig/OihodHRwfGh0dHBzfGZpbGUpXFw6XFwvXFwvKT8iICsKICAgICAgICAgICAgIC8qIGF1dGhvcml0eSAqLyAiKD86KFstQS1aYS16MC05JF8uKyEqJygpLDs/Jj1dKyg/OlxcOlstQS1aYS16MC05JF8uKyEqJygpLDs/Jj1dKyk/KUApPyIgKwotICAgICAgICAgICAgLyogaG9zdCAgICAgICovICIoWy0iICsgR09PRF9JUklfQ0hBUiArICIlX10rKD86XFwuWy0iICsgR09PRF9JUklfQ0hBUiArICIlX10rKSp8XFxbWzAtOWEtZkEtRjpcXC5dK1xcXSk/IiArCisgICAgICAgICAgICAvKiBob3N0ICAgICAgKi8gIihbIiArIEdPT0RfSVJJX0NIQVIgKyAiJV8tXVsiICsgR09PRF9JUklfQ0hBUiArICIlX1xcLi1dKnxcXFtbMC05YS1mQS1GOlxcLl0rXFxdKT8iICsKICAgICAgICAgICAgIC8qIHBvcnQgICAgICAqLyAiKD86XFw6KFswLTldKikpPyIgKwogICAgICAgICAgICAgLyogcGF0aCAgICAgICovICIoXFwvP1teI10qKT8iICsKICAgICAgICAgICAgIC8qIGFuY2hvciAgICAqLyAiLioiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0FuZHJvaWRIdHRwQ2xpZW50LmphdmEKaW5kZXggZTA3ZWU1OS4uOTE1ZTM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQW5kcm9pZEh0dHBDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9BbmRyb2lkSHR0cENsaWVudC5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5OwogaW1wb3J0IGFuZHJvaWQubmV0LlNTTFNlc3Npb25DYWNoZTsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgpAQCAtODEsNiArODIsMTEgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQW5kcm9pZEh0dHBDbGllbnQiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGV4dENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAidGV4dC8iLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiIKKyAgICB9OwogCiAgICAgLyoqIEludGVyY2VwdG9yIHRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGV4ZWN1dGluZyB0aHJlYWQgaXMgYmxvY2tlZCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEh0dHBSZXF1ZXN0SW50ZXJjZXB0b3Igc1RocmVhZENoZWNrSW50ZXJjZXB0b3IgPQpAQCAtMzU4LDcgKzM2NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVsIDwgTG9nLlZFUkJPU0UgfHwgbGV2ZWwgPiBMb2cuQVNTRVJUKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMZXZlbCBpcyBvdXQgb2YgcmFuZ2UgWyIKLSAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOyAgICAKKyAgICAgICAgICAgICAgICArIExvZy5WRVJCT1NFICsgIi4uIiArIExvZy5BU1NFUlQgKyAiXSIpOwogICAgICAgICB9CiAKICAgICAgICAgY3VybENvbmZpZ3VyYXRpb24gPSBuZXcgTG9nZ2luZ0NvbmZpZ3VyYXRpb24obmFtZSwgbGV2ZWwpOwpAQCAtNDMxLDEyICs0MzcsMTcgQEAKICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKSA8IDEwMjQpIHsKICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgZW50aXR5LndyaXRlVG8oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eVN0cmluZyA9IHN0cmVhbS50b1N0cmluZygpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoZSBjb250ZW50IHR5cGUsIHRvby4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAtLWRhdGEtYXNjaWkgXCIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0JpbmFyeUNvbnRlbnQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlVG9TdHJpbmcoc3RyZWFtLnRvQnl0ZUFycmF5KCksIEJhc2U2NC5OT19XUkFQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuaW5zZXJ0KDAsICJlY2hvICciICsgYmFzZTY0ICsgIicgfCBiYXNlNjQgLWQgPiAvdG1wLyQkLmJpbjsgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1iaW5hcnkgQC90bXAvJCQuYmluIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5U3RyaW5nID0gc3RyZWFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIC0tZGF0YS1hc2NpaSBcIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZW50aXR5U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbVE9PIE1VQ0ggREFUQSBUTyBJTkNMVURFXSIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ0Niw2ICs0NTcsMzAgQEAKICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmluYXJ5Q29udGVudChIdHRwVXJpUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIEhlYWRlcltdIGhlYWRlcnM7CisgICAgICAgIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChIZWFkZXIgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgICAgIGlmICgiZ3ppcCIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhIZWFkZXJzLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSGVhZGVyIGhlYWRlciA6IGhlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb250ZW50VHlwZSA6IHRleHRDb250ZW50VHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGF0ZSBvZiB0aGUgZ2l2ZW4gSFRUUCBkYXRlIHN0cmluZy4gVGhpcyBtZXRob2QgY2FuIGlkZW50aWZ5CiAgICAgICogYW5kIHBhcnNlIHRoZSBkYXRlIGZvcm1hdHMgZW1pdHRlZCBieSBjb21tb24gSFRUUCBzZXJ2ZXJzLCBzdWNoIGFzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggYzUyN2ZlNC4uYzM2YWQzOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtODAsMTQgKzgwLDEwIEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBzZXJ2ZXJDZXJ0aWZpY2F0ZXMgPSBudWxsOwogCi0gICAgICAgIC8vIHN0YXJ0IGhhbmRzaGFrZSwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzc2xTb2NrZXQuc2V0VXNlQ2xpZW50TW9kZSh0cnVlKTsKLSAgICAgICAgICAgIHNzbFNvY2tldC5zdGFydEhhbmRzaGFrZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIHNzbFNvY2tldCwgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKKyAgICAgICAgLy8gZ2V0IGEgdmFsaWQgU1NMU2Vzc2lvbiwgY2xvc2UgdGhlIHNvY2tldCBpZiB3ZSBmYWlsCisgICAgICAgIFNTTFNlc3Npb24gc3NsU2Vzc2lvbiA9IHNzbFNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoIXNzbFNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBjbG9zZVNvY2tldFRocm93RXhjZXB0aW9uKHNzbFNvY2tldCwgImZhaWxlZCB0byBwZXJmb3JtIFNTTCBoYW5kc2hha2UiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBjaGFpbiBvZiB0aGUgc2VydmVyIHBlZXIgY2VydGlmaWNhdGVzCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9Bc3luY1Rhc2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCmluZGV4IGQyODE0OGMuLmQyZjNkNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0FzeW5jVGFzay5qYXZhCkBAIC0xNiwxNiArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgpAQCAtMzYsOCArMzYsOCBAQAogICogPHA+QW4gYXN5bmNocm9ub3VzIHRhc2sgaXMgZGVmaW5lZCBieSBhIGNvbXB1dGF0aW9uIHRoYXQgcnVucyBvbiBhIGJhY2tncm91bmQgdGhyZWFkIGFuZAogICogd2hvc2UgcmVzdWx0IGlzIHB1Ymxpc2hlZCBvbiB0aGUgVUkgdGhyZWFkLiBBbiBhc3luY2hyb25vdXMgdGFzayBpcyBkZWZpbmVkIGJ5IDMgZ2VuZXJpYwogICogdHlwZXMsIGNhbGxlZCA8Y29kZT5QYXJhbXM8L2NvZGU+LCA8Y29kZT5Qcm9ncmVzczwvY29kZT4gYW5kIDxjb2RlPlJlc3VsdDwvY29kZT4sCi0gKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPmJlZ2luPC9jb2RlPiwgPGNvZGU+ZG9JbkJhY2tncm91bmQ8L2NvZGU+LAotICogPGNvZGU+cHJvY2Vzc1Byb2dyZXNzPC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPi48L3A+CisgKiBhbmQgNCBzdGVwcywgY2FsbGVkIDxjb2RlPm9uUHJlRXhlY3V0ZTwvY29kZT4sIDxjb2RlPmRvSW5CYWNrZ3JvdW5kPC9jb2RlPiwKKyAqIDxjb2RlPm9uUHJvZ3Jlc3NVcGRhdGU8L2NvZGU+IGFuZCA8Y29kZT5vblBvc3RFeGVjdXRlPC9jb2RlPi48L3A+CiAgKgogICogPGgyPlVzYWdlPC9oMj4KICAqIDxwPkFzeW5jVGFzayBtdXN0IGJlIHN1YmNsYXNzZWQgdG8gYmUgdXNlZC4gVGhlIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgYXQgbGVhc3QKQEAgLTEyMyw2ICsxMjMsMTYgQEAKICAqICAgICA8bGk+VGhlIHRhc2sgY2FuIGJlIGV4ZWN1dGVkIG9ubHkgb25jZSAoYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmCiAgKiAgICAgYSBzZWNvbmQgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4pPC9saT4KICAqIDwvdWw+CisgKgorICogPGgyPk1lbW9yeSBvYnNlcnZhYmlsaXR5PC9oMj4KKyAqIDxwPkFzeW5jVGFzayBndWFyYW50ZWVzIHRoYXQgYWxsIGNhbGxiYWNrIGNhbGxzIGFyZSBzeW5jaHJvbml6ZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIG9wZXJhdGlvbnMgYXJlIHNhZmUgd2l0aG91dCBleHBsaWNpdCBzeW5jaHJvbml6YXRpb25zLjwvcD4KKyAqIDx1bD4KKyAqICAgICA8bGk+U2V0IG1lbWJlciBmaWVsZHMgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIHtAbGluayAjb25QcmVFeGVjdXRlfSwgYW5kIHJlZmVyIHRvIHRoZW0KKyAqICAgICBpbiB7QGxpbmsgI2RvSW5CYWNrZ3JvdW5kfS4KKyAqICAgICA8bGk+U2V0IG1lbWJlciBmaWVsZHMgaW4ge0BsaW5rICNkb0luQmFja2dyb3VuZH0sIGFuZCByZWZlciB0byB0aGVtIGluCisgKiAgICAge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBhbmQge0BsaW5rICNvblBvc3RFeGVjdXRlfS4KKyAqIDwvdWw+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Rhc2s8UGFyYW1zLCBQcm9ncmVzcywgUmVzdWx0PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQXN5bmNUYXNrIjsKQEAgLTE3NSw2ICsxODUsMTEgQEAKICAgICAgICAgRklOSVNIRUQsCiAgICAgfQogCisgICAgLyoqIEBoaWRlIFVzZWQgdG8gZm9yY2Ugc3RhdGljIGhhbmRsZXIgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc0hhbmRsZXIuZ2V0TG9vcGVyKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBhc3luY2hyb25vdXMgdGFzay4gVGhpcyBjb25zdHJ1Y3RvciBtdXN0IGJlIGludm9rZWQgb24gdGhlIFVJIHRocmVhZC4KICAgICAgKi8KQEAgLTE4Nyw2ICsyMDIsMTcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBtRnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8UmVzdWx0PihtV29ya2VyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0KFJlc3VsdCB2KSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0KHYpOworICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9QT1NUX0NBTkNFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFJlc3VsdD4oQXN5bmNUYXNrLnRoaXMsIChSZXN1bHRbXSkgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb25lKCkgewogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKQEAgLTQwMiwxNCArNDI4LDE5IEBACiAgICAgICogc3RpbGwgcnVubmluZy4gRWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZXhlY3V0aW9uIG9mCiAgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSBvbiB0aGUgVUkgdGhyZWFkLgogICAgICAqCisgICAgICoge0BsaW5rICNvblByb2dyZXNzVXBkYXRlfSB3aWxsIG5vdGUgYmUgY2FsbGVkIGlmIHRoZSB0YXNrIGhhcyBiZWVuCisgICAgICogY2FuY2VsZWQuCisgICAgICoKICAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBwcm9ncmVzcyB2YWx1ZXMgdG8gdXBkYXRlIHRoZSBVSSB3aXRoLgogICAgICAqCiAgICAgICogQHNlZSAjb25Qcm9ncmVzc1VwZGF0ZQogICAgICAqIEBzZWUgI2RvSW5CYWNrZ3JvdW5kCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcHVibGlzaFByb2dyZXNzKFByb2dyZXNzLi4uIHZhbHVlcykgewotICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKLSAgICAgICAgICAgICAgICBuZXcgQXN5bmNUYXNrUmVzdWx0PFByb2dyZXNzPih0aGlzLCB2YWx1ZXMpKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgaWYgKCFpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBzSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1FU1NBR0VfUE9TVF9QUk9HUkVTUywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jVGFza1Jlc3VsdDxQcm9ncmVzcz4odGhpcywgdmFsdWVzKSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZmluaXNoKFJlc3VsdCByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCmluZGV4IDg5MjViZDAuLjkyNjhjZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQpAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0lOR0VSQlJFQUQgPSBDVVJfREVWRUxPUE1FTlQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5leHQgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPkFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgdGhpcyBvciBhIGxhdGVyIHJlbGVhc2Ugd2lsbCBnZXQgdGhlc2UKKyAgICAgICAgICogbmV3IGNoYW5nZXMgaW4gYmVoYXZpb3I6PC9wPgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4gVGhlIGRlZmF1bHQgdGhlbWUgZm9yIGFwcGxpY2F0aW9ucyBpcyBub3cgZGFyayBob2xvZ3JhcGhpYzoKKyAgICAgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlI1RoZW1lX0hvbG99LgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CID0gQ1VSX0RFVkVMT1BNRU5UOwogICAgIH0KICAgICAKICAgICAvKiogVGhlIHR5cGUgb2YgYnVpbGQsIGxpa2UgInVzZXIiIG9yICJlbmciLiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0RlYnVnLmphdmEKaW5kZXggODZmOWE2Yi4uYTU4ZTcwYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRGVidWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9EZWJ1Zy5qYXZhCkBAIC03MzEsNyArNzMxLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIHdpbGwgY2F1c2UgYSBHQy4KKyAgICAgKiBEdW1wICJocHJvZiIgZGF0YSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIG1heSBjYXVzZSBhIEdDLgogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGVOYW1lIEZ1bGwgcGF0aG5hbWUgb2Ygb3V0cHV0IGZpbGUgKGUuZy4gIi9zZGNhcmQvZHVtcC5ocHJvZiIpLgogICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIFZNIHdhcyBidWlsdCB3aXRob3V0CkBAIC03NDMsMTEgKzc0MywyNCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbGxlY3QgImhwcm9mIiBhbmQgc2VuZCBpdCB0byBERE1TLiAgVGhpcyB3aWxsIGNhdXNlIGEgR0MuCisgICAgICogTGlrZSBkdW1wSHByb2ZEYXRhKFN0cmluZyksIGJ1dCB0YWtlcyBhbiBhbHJlYWR5LW9wZW5lZAorICAgICAqIEZpbGVEZXNjcmlwdG9yIHRvIHdoaWNoIHRoZSB0cmFjZSBpcyB3cml0dGVuLiAgVGhlIGZpbGUgbmFtZSBpcyBhbHNvCisgICAgICogc3VwcGxpZWQgc2ltcGx5IGZvciBsb2dnaW5nLiAgTWFrZXMgYSBkdXAgb2YgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIFByaW1hcmlseSBmb3IgdXNlIGJ5IHRoZSAiYW0iIHNoZWxsIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wSHByb2ZEYXRhKFN0cmluZyBmaWxlTmFtZSwgRmlsZURlc2NyaXB0b3IgZmQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBWTURlYnVnLmR1bXBIcHJvZkRhdGEoZmlsZU5hbWUsIGZkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0ICJocHJvZiIgYW5kIHNlbmQgaXQgdG8gRERNUy4gIFRoaXMgbWF5IGNhdXNlIGEgR0MuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSBWTSB3YXMgYnVpbHQgd2l0aG91dAogICAgICAqICAgICAgICAgSFBST0Ygc3VwcG9ydC4KLSAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXBIcHJvZkRhdGFEZG1zKCkgewpAQCAtNzU1LDYgKzc2OCwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFdyaXRlcyBuYXRpdmUgaGVhcCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGR1bXBOYXRpdmVIZWFwKEZpbGVEZXNjcmlwdG9yIGZkKTsKKworICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZW50IHRyYW5zYWN0aW9ucyBmcm9tIHRoaXMgcHJvY2Vzcy4KICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2Ygc2VudCB0cmFuc2FjdGlvbnMgb3IgLTEgaWYgaXQgY291bGQgbm90IHJlYWQgdC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKaW5kZXggYTE3YjdmZS4uNzJlMjFkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEKQEAgLTg1LDYgKzg1LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50W10gb3V0UGVybWlzc2lvbnMpOwogCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFVNYXNrKGludCBtYXNrKTsKKwogICAgIC8qKiByZXR1cm5zIHRoZSBGQVQgZmlsZSBzeXN0ZW0gdm9sdW1lIElEIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgCiAgICAgICogYXQgdGhlIGdpdmVuIG1vdW50IHBvaW50LCBvciAtMSBmb3IgZmFpbHVyZQogICAgICAqIEBwYXJhbSBtb3VudCBwb2ludCBmb3IgRkFUIHZvbHVtZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVtb3J5RmlsZS5qYXZhCmluZGV4IGE4MWUxNmIuLmY4MjcwMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lbW9yeUZpbGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZW1vcnlGaWxlLmphdmEKQEAgLTU4LDcgKzU4LDYgQEAKICAgICBwcml2YXRlIGludCBtQWRkcmVzczsgICAvLyBhZGRyZXNzIG9mIGFzaG1lbSBtZW1vcnkKICAgICBwcml2YXRlIGludCBtTGVuZ3RoOyAgICAvLyB0b3RhbCBsZW5ndGggb2Ygb3VyIGFzaG1lbSByZWdpb24KICAgICBwcml2YXRlIGJvb2xlYW4gbUFsbG93UHVyZ2luZyA9IGZhbHNlOyAgLy8gdHJ1ZSBpZiBvdXIgYXNobWVtIHJlZ2lvbiBpcyB1bnBpbm5lZAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtT3duc1JlZ2lvbjsgIC8vIGZhbHNlIGlmIHRoaXMgaXMgYSByZWYgdG8gYW4gZXhpc3RpbmcgYXNobWVtIHJlZ2lvbgogCiAgICAgLyoqCiAgICAgICogQWxsb2NhdGVzIGEgbmV3IGFzaG1lbSByZWdpb24uIFRoZSByZWdpb24gaXMgaW5pdGlhbGx5IG5vdCBwdXJnYWJsZS4KQEAgLTcwLDM4ICs2OSwxMSBAQAogICAgIHB1YmxpYyBNZW1vcnlGaWxlKFN0cmluZyBuYW1lLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBtRkQgPSBuYXRpdmVfb3BlbihuYW1lLCBsZW5ndGgpOwotICAgICAgICBtQWRkcmVzcyA9IG5hdGl2ZV9tbWFwKG1GRCwgbGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSAgICAgICAgbU93bnNSZWdpb24gPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUuIENoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIGZpbGUKLSAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSB0aHJvdWdoIHRoaXMgcmVmZXJlbmNlLgotICAgICAqIENhbGxzIHRvIHtAbGluayAjYWxsb3dQdXJnaW5nKGJvb2xlYW4pfSBvbiB0aGUgcmV0dXJuZWQgTWVtb3J5RmlsZSB3aWxsIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmQgRmlsZSBkZXNjcmlwdG9yIGZvciBhbiBleGlzdGluZyBtZW1vcnkgZmlsZSwgYXMgcmV0dXJuZWQgYnkKLSAgICAgKiAgICAgICAge0BsaW5rICNnZXRGaWxlRGVzY3JpcHRvcigpfS4gVGhpcyBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQKLSAgICAgKiAgICAgICAgYnkge0BsaW5rICNjbG9zZSgpfS4KLSAgICAgKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiB0aGUgbWVtb3J5IGZpbGUgaW4gYnl0ZXMuCi0gICAgICogQHBhcmFtIG1vZGUgRmlsZSBtb2RlLiBDdXJyZW50bHkgb25seSAiciIgZm9yIHJlYWQtb25seSBhY2Nlc3MgaXMgc3VwcG9ydGVkLgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+ZmQ8L2NvZGU+IGlzIG51bGwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gZG9lcyBub3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgbWVtb3J5IGZpbGUsCi0gICAgICogICAgICAgICBvciBpZiB0aGUgZmlsZSBtb2RlIG9mIHRoZSBleGlzdGluZyBtZW1vcnkgZmlsZSBpcyBtb3JlIHJlc3RyaWN0aXZlCi0gICAgICogICAgICAgICB0aGFuIDxjb2RlPm1vZGU8L2NvZGU+LgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvciBmZCwgaW50IGxlbmd0aCwgU3RyaW5nIG1vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkZpbGUgZGVzY3JpcHRvciBpcyBudWxsLiIpOworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWRkcmVzcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFpc01lbW9yeUZpbGUoZmQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBtZW1vcnkgZmlsZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICBtRkQgPSBmZDsKLSAgICAgICAgbUFkZHJlc3MgPSBuYXRpdmVfbW1hcChtRkQsIGxlbmd0aCwgbW9kZVRvUHJvdChtb2RlKSk7Ci0gICAgICAgIG1Pd25zUmVnaW9uID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjIsNyArOTQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgeworICAgIHZvaWQgZGVhY3RpdmF0ZSgpIHsKICAgICAgICAgaWYgKCFpc0RlYWN0aXZhdGVkKCkpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmF0aXZlX211bm1hcChtQWRkcmVzcywgbUxlbmd0aCk7CkBAIC0xODEsOSArMTUzLDYgQEAKICAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIG9mIGFsbG93UHVyZ2luZwogICAgICAqLwogICAgIHN5bmNocm9uaXplZCBwdWJsaWMgYm9vbGVhbiBhbGxvd1B1cmdpbmcoYm9vbGVhbiBhbGxvd1B1cmdpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbU93bnNSZWdpb24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiT25seSB0aGUgb3duZXIgY2FuIG1ha2UgYXNobWVtIHJlZ2lvbnMgcHVyZ2FibGUuIik7Ci0gICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IG1BbGxvd1B1cmdpbmc7CiAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBhbGxvd1B1cmdpbmcpIHsKICAgICAgICAgICAgIG5hdGl2ZV9waW4obUZELCAhYWxsb3dQdXJnaW5nKTsKQEAgLTI2MCwyOCArMjI5LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgUGFyY2VsRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4gU2VlIHtAbGluayAjZ2V0RmlsZURlc2NyaXB0b3IoKX0KLSAgICAgKiBmb3IgY2F2ZWF0cy4gVGhpcyBtdXN0IGJlIGhlcmUgdG8gYWxsb3cgY2xhc3NlcyBvdXRzaWRlIDxjb2RlPmFuZHJvaWQub3M8L2NvZGU8IHRvCi0gICAgICogbWFrZSBQYXJjZWxGaWxlRGVzY3JpcHRvcnMgZnJvbSBNZW1vcnlGaWxlcywgYXMKLSAgICAgKiB7QGxpbmsgUGFyY2VsRmlsZURlc2NyaXB0b3IjUGFyY2VsRmlsZURlc2NyaXB0b3IoRmlsZURlc2NyaXB0b3IpfSBpcyBwYWNrYWdlIHByaXZhdGUuCi0gICAgICoKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZGVzY3JpcHRvciBvd25lZCBieSB0aGlzIG1lbW9yeSBmaWxlIG9iamVjdC4KLSAgICAgKiAgICAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgbWVtb3J5IGZpbGUgaGFzIGJlZW4gY2xvc2VkLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3IgZ2V0UGFyY2VsRmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGdldEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEZpbGVEZXNjcmlwdG9yIGZvciB0aGUgbWVtb3J5IGZpbGUuIE5vdGUgdGhhdCB0aGlzIGZpbGUgZGVzY3JpcHRvcgotICAgICAqIGlzIG9ubHkgc2FmZSB0byBwYXNzIHRvIHtAbGluayAjTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvcixpbnQpfSkuIEl0Ci0gICAgICogc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggZmlsZSBkZXNjcmlwdG9yIG9wZXJhdGlvbnMgdGhhdCBleHBlY3QgYSBmaWxlIGRlc2NyaXB0b3IKLSAgICAgKiBmb3IgYSBub3JtYWwgZmlsZS4KKyAgICAgKiBHZXRzIGEgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBtZW1vcnkgZmlsZS4KICAgICAgKgogICAgICAqIFRoZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cGxpY2F0ZWQuCiAgICAgICoKQEAgLTI5NCwxNyArMjQyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0byBhIG1lbW9yeSBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiA8Y29kZT5mZDwvY29kZT4gaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKG5hdGl2ZV9nZXRfc2l6ZShmZCkgPj0gMCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZpbGUgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlZmVycyB0bywKICAgICAgKiBvciAtMSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IHJlZmVyIHRvIGEgbWVtb3J5IGZpbGUuCiAgICAgICoKQEAgLTMxNiwyMCArMjUzLDYgQEAKICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRfc2l6ZShmZCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBmaWxlIG1vZGUgc3RyaW5nIHRvIGEgPGNvZGU+cHJvdDwvY29kZT4gdmFsdWUgYXMgZXhwZWN0ZWQgYnkKLSAgICAgKiBuYXRpdmVfbW1hcCgpLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpbGUgbW9kZSBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBtb2RlVG9Qcm90KFN0cmluZyBtb2RlKSB7Ci0gICAgICAgIGlmICgiciIuZXF1YWxzKG1vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUFJPVF9SRUFEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZmlsZSBtb2RlOiAnIiArIG1vZGUgKyAiJyIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW1vcnlJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKIAogICAgICAgICBwcml2YXRlIGludCBtTWFyayA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKaW5kZXggNDliNzJmZS4uZWI5NDFlNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQpAQCAtNzMsNyArNzMsMTggQEAKICAgICAgKiByZWNlaXZlci4KICAgICAgKi8KICAgICBwdWJsaWMgTWVzc2VuZ2VyIHJlcGx5VG87Ci0gICAgCisKKyAgICAvKiogSWYgc2V0IG1lc3NhZ2UgaXMgaW4gdXNlICovCisgICAgLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIGludCBGTEFHX0lOX1VTRSA9IDE7CisKKyAgICAvKiogRmxhZ3MgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKEFsbCBhcmUgcmVzZXJ2ZWQgZm9yIG5vdykgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1JFU0VSVkVEID0gfkZMQUdfSU5fVVNFOworCisgICAgLyoqIEZsYWdzIHRvIGNsZWFyIGluIHRoZSBjb3B5RnJvbSBtZXRob2QgKi8KKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgaW50IEZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTSA9IEZMQUdTX1JFU0VSVkVEIHwgRkxBR19JTl9VU0U7CisKKyAgICAvKnBhY2thZ2UqLyBpbnQgZmxhZ3M7CisKICAgICAvKnBhY2thZ2UqLyBsb25nIHdoZW47CiAgICAgCiAgICAgLypwYWNrYWdlKi8gQnVuZGxlIGRhdGE7CkBAIC0yNTMsNiArMjY0LDcgQEAKICAgICAgKiB0YXJnZXQvY2FsbGJhY2sgb2YgdGhlIG9yaWdpbmFsIG1lc3NhZ2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY29weUZyb20oTWVzc2FnZSBvKSB7CisgICAgICAgIHRoaXMuZmxhZ3MgPSBvLmZsYWdzICYgfkZMQUdTX1RPX0NMRUFSX09OX0NPUFlfRlJPTTsKICAgICAgICAgdGhpcy53aGF0ID0gby53aGF0OwogICAgICAgICB0aGlzLmFyZzEgPSBvLmFyZzE7CiAgICAgICAgIHRoaXMuYXJnMiA9IG8uYXJnMjsKQEAgLTM1MCw2ICszNjIsNyBAQAogICAgIH0KIAogICAgIC8qcGFja2FnZSovIHZvaWQgY2xlYXJGb3JSZWN5Y2xlKCkgeworICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgIHdoYXQgPSAwOwogICAgICAgICBhcmcxID0gMDsKICAgICAgICAgYXJnMiA9IDA7CkBAIC0zNjEsNiArMzc0LDE0IEBACiAgICAgICAgIGRhdGEgPSBudWxsOwogICAgIH0KIAorICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuICgoZmxhZ3MgJiBGTEFHX0lOX1VTRSkgPT0gRkxBR19JTl9VU0UpOworICAgIH0KKworICAgIC8qcGFja2FnZSovIHZvaWQgbWFya0luVXNlKCkgeworICAgICAgICBmbGFncyB8PSBGTEFHX0lOX1VTRTsKKyAgICB9CisKICAgICAvKiogQ29uc3RydWN0b3IgKGJ1dCB0aGUgcHJlZmVycmVkIHdheSB0byBnZXQgYSBNZXNzYWdlIGlzIHRvIGNhbGwge0BsaW5rICNvYnRhaW4oKSBNZXNzYWdlLm9idGFpbigpfSkuCiAgICAgKi8KICAgICBwdWJsaWMgTWVzc2FnZSgpIHsKQEAgLTQ1Myw0ICs0NzQsMyBAQAogICAgICAgICByZXBseVRvID0gTWVzc2VuZ2VyLnJlYWRNZXNzZW5nZXJPck51bGxGcm9tUGFyY2VsKHNvdXJjZSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCmluZGV4IDI4MTM4NjMuLmU4OWY3YzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZS5qYXZhCkBAIC0xMjAsNiArMTIwLDcgQEAKICAgICAgICAgICAgICAgICBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHB1bGxOZXh0TG9ja2VkKG5vdyk7CiAgICAgICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5tYXJrSW5Vc2UoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0xOTIsNyArMTkzLDcgQEAKICAgICB9CiAKICAgICBmaW5hbCBib29sZWFuIGVucXVldWVNZXNzYWdlKE1lc3NhZ2UgbXNnLCBsb25nIHdoZW4pIHsKLSAgICAgICAgaWYgKG1zZy53aGVuICE9IDApIHsKKyAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBbmRyb2lkUnVudGltZUV4Y2VwdGlvbihtc2cKICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgbWVzc2FnZSBpcyBhbHJlYWR5IGluIHVzZS4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yLmphdmEKaW5kZXggOWQyMTNiMy4uYzFhMTgwOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvci5qYXZhCkBAIC0xMzQsNiArMTM0LDQ1IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIEZpbGVEZXNjcmlwdG9yIGdldEZpbGVEZXNjcmlwdG9yRnJvbVNvY2tldChTb2NrZXQgc29ja2V0KTsKIAogICAgIC8qKgorICAgICAqIENyZWF0ZSB0d28gUGFyY2VsRmlsZURlc2NyaXB0b3JzIHN0cnVjdHVyZWQgYXMgYSBkYXRhIHBpcGUuICBUaGUgZmlyc3QKKyAgICAgKiBQYXJjZWxGaWxlRGVzY3JpcHRvciBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhlIHJlYWQgc2lkZTsgdGhlIHNlY29uZAorICAgICAqIGlzIHRoZSB3cml0ZSBzaWRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBjcmVhdGVQaXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBmZHMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMl07CisgICAgICAgIGludCByZXMgPSBjcmVhdGVQaXBlTmF0aXZlKGZkcyk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3JbXSBwZmRzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yWzJdOworICAgICAgICAgICAgcGZkc1swXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMF0pOworICAgICAgICAgICAgcGZkc1sxXSA9IG5ldyBQYXJjZWxGaWxlRGVzY3JpcHRvcihmZHNbMV0pOworICAgICAgICAgICAgcmV0dXJuIHBmZHM7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHBpcGU6IGVycm5vPSIgKyAtcmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGNyZWF0ZVBpcGVOYXRpdmUoRmlsZURlc2NyaXB0b3JbXSBvdXRGZHMpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gY29weS4KKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhIHRoYXQgbWF5IGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgYW5kIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBBIFBhcmNlbEZpbGVEZXNjcmlwdG9yLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIHNoYXJlZCBtZW1vcnkgYXJlYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZyb21EYXRhKGJ5dGVbXSBkYXRhLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKG5hbWUsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmlsZS53cml0ZUJ5dGVzKGRhdGEsIDAsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaWxlLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHJldHVybiBmZCAhPSBudWxsID8gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yKGZkKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIGFjdHVhbCBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCiAgICAgICogCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBGaWxlRGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKaW5kZXggN2I4ODNhNy4uZDNkMzlkNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZUV2ZW50TGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VFdmVudExpc3RlbmVyLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyoqCiAgKiBVc2VkIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBTdG9yYWdlTWFuYWdlcgotICogQGhpZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFN0b3JhZ2VFdmVudExpc3RlbmVyIHsKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQppbmRleCBkZjBiNjljLi40YTAyOTZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiAgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBieSBjYWxsaW5nCiAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZShqYXZhLmxhbmcuU3RyaW5nKX0gd2l0aCBhbiBhcmd1bWVudAogICogb2Yge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I1NUT1JBR0VfU0VSVklDRX0uCisgKgogICovCiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlTWFuYWdlcgpAQCAtMjAzLDcgKzIwNCw2IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQSB7QGxpbmsgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyIFN0b3JhZ2VFdmVudExpc3RlbmVyfSBvYmplY3QuCiAgICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoU3RvcmFnZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKQEAgLTIyMCw3ICsyMjAsNiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGxpc3RlbmVyIEEge0BsaW5rIGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lciBTdG9yYWdlRXZlbnRMaXN0ZW5lcn0gb2JqZWN0LgogICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoU3RvcmFnZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHsKQEAgLTI0MSw4ICsyNDAsNiBAQAogCiAgICAgLyoqCiAgICAgICogRW5hYmxlcyBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuYWJsZVVzYk1hc3NTdG9yYWdlKCkgewogICAgICAgICB0cnkgewpAQCAtMjU0LDggKzI1MSw2IEBACiAKICAgICAvKioKICAgICAgKiBEaXNhYmxlcyBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIG9uIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRpc2FibGVVc2JNYXNzU3RvcmFnZSgpIHsKICAgICAgICAgdHJ5IHsKQEAgLTI2OCw4ICsyNjMsNiBAQAogICAgIC8qKgogICAgICAqIFF1ZXJ5IGlmIGEgVVNCIE1hc3MgU3RvcmFnZSAoVU1TKSBob3N0IGlzIGNvbm5lY3RlZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgVU1TIGhvc3QgaXMgY29ubmVjdGVkLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzYk1hc3NTdG9yYWdlQ29ubmVjdGVkKCkgewogICAgICAgICB0cnkgewpAQCAtMjgzLDggKzI3Niw2IEBACiAgICAgLyoqCiAgICAgICogUXVlcnkgaWYgYSBVU0IgTWFzcyBTdG9yYWdlIChVTVMpIGlzIGVuYWJsZWQgb24gdGhlIGRldmljZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgVU1TIGhvc3QgaXMgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNVc2JNYXNzU3RvcmFnZUVuYWJsZWQoKSB7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VSZXN1bHRDb2RlLmphdmEKaW5kZXggMDc1ZjQ3Zi4uMDdkOTVkZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlUmVzdWx0Q29kZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVJlc3VsdENvZGUuamF2YQpAQCAtMTksOCArMTksNiBAQAogLyoqCiAgKiBDbGFzcyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBjb25zdGFudHMgcmV0dXJuZWQgZnJvbSBTdG9yYWdlTWFuYWdlcgogICogYW5kIGxvd2VyIGxldmVsIE1vdW50U2VydmljZSBBUElzLgotICoKLSAqIEBoaWRlCiAgKi8KIHB1YmxpYyBjbGFzcyBTdG9yYWdlUmVzdWx0Q29kZQogewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKaW5kZXggNjM1MzIzZS4uMjgyNDE3ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCkBAIC0xODEsNyArMTgxLDkgQEAKICAgICAgICAgYm9vbGVhbiBpblV0YyA9IHN0YXJ0LnBhcnNlKGR0c3RhcnQpOwogICAgICAgICBib29sZWFuIGFsbERheSA9IHN0YXJ0LmFsbERheTsKIAotICAgICAgICBpZiAoaW5VdGMpIHsKKyAgICAgICAgLy8gV2UgZm9yY2UgVGltZVpvbmUgdG8gVVRDIGZvciAiYWxsIGRheSByZWN1cnJpbmcgZXZlbnRzIiBhcyB0aGUgc2VydmVyIGlzIHNlbmRpbmcgbm8KKyAgICAgICAgLy8gVGltZVpvbmUgaW4gRFRTVEFSVCBmb3IgdGhlbQorICAgICAgICBpZiAoaW5VdGMgfHwgYWxsRGF5KSB7CiAgICAgICAgICAgICB0emlkID0gVGltZS5USU1FWk9ORV9VVEM7CiAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKQEAgLTIwNCwxMCArMjA2LDcgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGFsbERheSkgewotICAgICAgICAJLy8gVE9ETzogYWxzbyBjaGFuZ2UgdHppZCB0byBiZSBVVEM/ICB0aGF0IHdvdWxkIGJlIGNvbnNpc3RlbnQsIGJ1dAotICAgICAgICAJLy8gdGhhdCB3b3VsZCBub3QgcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGltZXpvbmUgdmFsdWUgYmFjayB0byB0aGUKLSAgICAgICAgCS8vIHNlcnZlci4KLSAgICAgICAgCXN0YXJ0LnRpbWV6b25lID0gVGltZS5USU1FWk9ORV9VVEM7CisgICAgICAgICAgICBzdGFydC50aW1lem9uZSA9IFRpbWUuVElNRVpPTkVfVVRDOwogICAgICAgICB9CiAgICAgICAgIGxvbmcgbWlsbGlzID0gc3RhcnQudG9NaWxsaXMoZmFsc2UgLyogdXNlIGlzRHN0ICovKTsKICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhci5FdmVudHMuRFRTVEFSVCwgbWlsbGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvSmFwYW5lc2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZlOTgwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9KYXBhbmVzZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRleHRVdGlscyBlc3BlY2lhbGx5IGZvciBKYXBhbmVzZS4KLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBKYXBhbmVzZVV0aWxzIHsKLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBTdHJpbmc+IHNIYWxmV2lkdGhNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDEnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMDInLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEMnLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMEQnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdTMwMUMnLCAifiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQxJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDQ5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDREJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDRGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDUzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDU5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDVGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDYzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDY5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDZGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDcyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDczJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDc5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdEJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDdGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDgzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDg5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDhGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDkzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlCJywgIlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMDlDJywgIlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEExJywgIlx1RkY2NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEyJywgIlx1RkY3MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEEzJywgIlx1RkY2OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE0JywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE1JywgIlx1RkY2OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE2JywgIlx1RkY3MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE3JywgIlx1RkY2QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE4JywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEE5JywgIlx1RkY2QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFBJywgIlx1RkY3NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFCJywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFDJywgIlx1RkY3Nlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFEJywgIlx1RkY3NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFFJywgIlx1RkY3N1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEFGJywgIlx1RkY3OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIwJywgIlx1RkY3OFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIxJywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIyJywgIlx1RkY3OVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEIzJywgIlx1RkY3QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI0JywgIlx1RkY3QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI1JywgIlx1RkY3QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI2JywgIlx1RkY3Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI3JywgIlx1RkY3QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI4JywgIlx1RkY3Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEI5JywgIlx1RkY3RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJBJywgIlx1RkY3RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJCJywgIlx1RkY3RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJDJywgIlx1RkY3RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJEJywgIlx1RkY3RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJFJywgIlx1RkY3Rlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEJGJywgIlx1RkY4MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMwJywgIlx1RkY4MFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMxJywgIlx1RkY4MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMyJywgIlx1RkY4MVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEMzJywgIlx1RkY2RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM0JywgIlx1RkY4MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM1JywgIlx1RkY4Mlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM2JywgIlx1RkY4MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM3JywgIlx1RkY4M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM4JywgIlx1RkY4NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEM5JywgIlx1RkY4NFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENBJywgIlx1RkY4NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENCJywgIlx1RkY4NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENDJywgIlx1RkY4NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENEJywgIlx1RkY4OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENFJywgIlx1RkY4OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMENGJywgIlx1RkY4QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQwJywgIlx1RkY4QVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQxJywgIlx1RkY4QVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQyJywgIlx1RkY4QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQzJywgIlx1RkY4Qlx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ0JywgIlx1RkY4Qlx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ1JywgIlx1RkY4QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ2JywgIlx1RkY4Q1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ3JywgIlx1RkY4Q1x1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ4JywgIlx1RkY4RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEQ5JywgIlx1RkY4RFx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERBJywgIlx1RkY4RFx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERCJywgIlx1RkY4RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERDJywgIlx1RkY4RVx1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEREJywgIlx1RkY4RVx1RkY5RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERFJywgIlx1RkY4RiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMERGJywgIlx1RkY5MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUwJywgIlx1RkY5MSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUxJywgIlx1RkY5MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUyJywgIlx1RkY5MyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEUzJywgIlx1RkY2QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU0JywgIlx1RkY5NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU1JywgIlx1RkY2RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU2JywgIlx1RkY5NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU3JywgIlx1RkY2RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU4JywgIlx1RkY5NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEU5JywgIlx1RkY5NyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVBJywgIlx1RkY5OCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVCJywgIlx1RkY5OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVDJywgIlx1RkY5QSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVEJywgIlx1RkY5QiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVFJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEVGJywgIlx1RkY5QyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYwJywgIlx1RkY3MiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYxJywgIlx1RkY3NCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYyJywgIlx1RkY2NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEYzJywgIlx1RkY5RCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY0JywgIlx1RkY3M1x1RkY5RSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY1JywgIlx1RkY3NiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEY2JywgIlx1RkY3OSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZCJywgIlx1RkY2NSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHUzMEZDJywgIlx1RkY3MCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAxJywgIiEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwMicsICJcIiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjAzJywgIiMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNCcsICIkIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDUnLCAiJSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA2JywgIiYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwNycsICInIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMDgnLCAiKCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjA5JywgIikiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwQScsICIqIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEInLCAiKyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBDJywgIiwiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYwRCcsICItIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMEUnLCAiLiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjBGJywgIi8iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMCcsICIwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTEnLCAiMSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjEyJywgIjIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxMycsICIzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTQnLCAiNCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE1JywgIjUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxNicsICI2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMTcnLCAiNyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjE4JywgIjgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxOScsICI5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUEnLCAiOiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFCJywgIjsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxQycsICI8Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMUQnLCAiPSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjFFJywgIj4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYxRicsICI/Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjAnLCAiQCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjIxJywgIkEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyMicsICJCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjMnLCAiQyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI0JywgIkQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyNScsICJFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjYnLCAiRiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjI3JywgIkciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyOCcsICJIIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMjknLCAiSSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJBJywgIkoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyQicsICJLIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkMnLCAiTCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjJEJywgIk0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYyRScsICJOIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMkYnLCAiTyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMwJywgIlAiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzMScsICJRIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzInLCAiUiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjMzJywgIlMiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNCcsICJUIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzUnLCAiVSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM2JywgIlYiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzNycsICJXIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGMzgnLCAiWCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjM5JywgIlkiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzQScsICJaIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0InLCAiWyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNDJywgIlxcIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGM0QnLCAiXSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjNFJywgIl4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkYzRicsICJfIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDEnLCAiYSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQyJywgImIiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0MycsICJjIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDQnLCAiZCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ1JywgImUiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0NicsICJmIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNDcnLCAiZyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjQ4JywgImgiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0OScsICJpIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEEnLCAiaiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRCJywgImsiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0QycsICJsIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNEQnLCAibSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjRFJywgIm4iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY0RicsICJvIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTAnLCAicCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjUxJywgInEiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1MicsICJyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTMnLCAicyIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU0JywgInQiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1NScsICJ1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTYnLCAidiIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjU3JywgInciKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1OCcsICJ4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNTknLCAieSIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVBJywgInoiKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1QicsICJ7Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNUMnLCAifCIpOwotICAgICAgICBzSGFsZldpZHRoTWFwLnB1dCgnXHVGRjVEJywgIn0iKTsKLSAgICAgICAgc0hhbGZXaWR0aE1hcC5wdXQoJ1x1RkY1RScsICJ+Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjEnLCAiXHVGRjYxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjInLCAiXHVGRjYyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjMnLCAiXHVGRjYzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjQnLCAiXHVGRjY0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjUnLCAiXHVGRjY1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjYnLCAiXHVGRjY2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjcnLCAiXHVGRjY3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjgnLCAiXHVGRjY4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNjknLCAiXHVGRjY5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkEnLCAiXHVGRjZBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkInLCAiXHVGRjZCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkMnLCAiXHVGRjZDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkQnLCAiXHVGRjZEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkUnLCAiXHVGRjZFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNkYnLCAiXHVGRjZGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzAnLCAiXHVGRjcwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzEnLCAiXHVGRjcxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzInLCAiXHVGRjcyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzMnLCAiXHVGRjczIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzQnLCAiXHVGRjc0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzUnLCAiXHVGRjc1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzYnLCAiXHVGRjc2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzcnLCAiXHVGRjc3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzgnLCAiXHVGRjc4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGNzknLCAiXHVGRjc5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0EnLCAiXHVGRjdBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0InLCAiXHVGRjdCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0MnLCAiXHVGRjdDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0QnLCAiXHVGRjdEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0UnLCAiXHVGRjdFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGN0YnLCAiXHVGRjdGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODAnLCAiXHVGRjgwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODEnLCAiXHVGRjgxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODInLCAiXHVGRjgyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODMnLCAiXHVGRjgzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODQnLCAiXHVGRjg0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODUnLCAiXHVGRjg1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODYnLCAiXHVGRjg2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODcnLCAiXHVGRjg3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODgnLCAiXHVGRjg4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGODknLCAiXHVGRjg5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEEnLCAiXHVGRjhBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEInLCAiXHVGRjhCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEMnLCAiXHVGRjhDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEQnLCAiXHVGRjhEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEUnLCAiXHVGRjhFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOEYnLCAiXHVGRjhGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTAnLCAiXHVGRjkwIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTEnLCAiXHVGRjkxIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTInLCAiXHVGRjkyIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTMnLCAiXHVGRjkzIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTQnLCAiXHVGRjk0Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTUnLCAiXHVGRjk1Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTYnLCAiXHVGRjk2Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTcnLCAiXHVGRjk3Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTgnLCAiXHVGRjk4Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOTknLCAiXHVGRjk5Iik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUEnLCAiXHVGRjlBIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUInLCAiXHVGRjlCIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUMnLCAiXHVGRjlDIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUQnLCAiXHVGRjlEIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUUnLCAiXHVGRjlFIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGOUYnLCAiXHVGRjlGIik7Ci0gICAgICAgIHNIYWxmV2lkdGhNYXAucHV0KCdcdUZGRTUnLCAiXHUwMDVDXHUwMDVDIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBoYWxmLXdpZHRoIHZlcnNpb24gb2YgdGhhdCBjaGFyYWN0ZXIgaWYgcG9zc2libGUuIFJldHVybnMgbnVsbCBpZiBub3QgcG9zc2libGUKLSAgICAgKiBAcGFyYW0gY2ggaW5wdXQgY2hhcmFjdGVyCi0gICAgICogQHJldHVybiBDaGFyU2VxdWVuY2Ugb2JqZWN0IGlmIHRoZSBtYXBwaW5nIGZvciBjaCBleGlzdHMuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cnlHZXRIYWxmV2lkdGhUZXh0KGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKHNIYWxmV2lkdGhNYXAuY29udGFpbnNLZXkoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc0hhbGZXaWR0aE1hcC5nZXQoY2gpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDA3ZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUmVsYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCBsZXRzIHVzZXJzIGNyZWF0ZSB0aGVpciBvd24gdkNhcmQgU3RyaW5nLiBUeXBpY2FsIHVzYWdlIGlzIGFzIGZvbGxvd3M6Ci0gKiA8L3A+Ci0gKiA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCI+ZmluYWwgVkNhcmRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVkNhcmRCdWlsZGVyKHZjYXJkVHlwZSk7Ci0gKiBidWlsZGVyLmFwcGVuZE5hbWVQcm9wZXJ0aWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZE5pY2tOYW1lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRQaG9uZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kRW1haWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBvc3RhbHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRPcmdhbml6YXRpb25zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRXZWJzaXRlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZFBob3Rvcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gKiAgICAgLmFwcGVuZEV2ZW50cyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpKQotICogICAgIC5hcHBlbmRJbXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEltLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAqICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gKiByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOzwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRCdWlsZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZEJ1aWxkZXIiOwotCi0gICAgLy8gSWYgeW91IGFkZCB0aGUgb3RoZXIgZWxlbWVudCwgcGxlYXNlIGNoZWNrIGFsbCB0aGUgY29sdW1ucyBhcmUgYWJsZSB0byBiZQotICAgIC8vIGNvbnZlcnRlZCB0byBTdHJpbmcuCi0gICAgLy8KLSAgICAvLyBlLmcuIEJMT0IgaXMgbm90IHdoYXQgd2UgY2FuIGhhbmRsZSBoZXJlIG5vdy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSkpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QSE9ORV9UWVBFID0gUGhvbmUuVFlQRV9IT01FOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9TVEFMX1RZUEUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VNQUlMX1RZUEUgPSBFbWFpbC5UWVBFX09USEVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfVkNBUkQgPSAiVkNBUkQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9EQVRBX1BVQkxJQyA9ICJQVUJMSUMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfRU5EX09GX0xJTkUgPSAiXHJcbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX0RBVEFfU0VQQVJBVE9SID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9JVEVNX1NFUEFSQVRPUiA9ICI7IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfV1MgPSAiICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VRVUFMID0gIj0iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9WMjEgPQotICAgICAgICAgICAgIkVOQ09ESU5HPSIgKyBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1BBUkFNX0VOQ09ESU5HX0JBU0U2NF9BU19CID0KLSAgICAgICAgICAgICJFTkNPRElORz0iICsgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSElGVF9KSVMgPSAiU0hJRlRfSklTIjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1WQ2FyZFR5cGU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzVjMwT3JWNDA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0phcGFuZXNlTW9iaWxlUGhvbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Pbmx5T25lTm90ZUZpZWxkSXNBdmFpbGFibGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc0RvQ29NbzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVVzZXNBbmRyb2lkUHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Vc2VzRGVmYWN0UHJvcGVydHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1BcHBlbmRUeXBlUGFyYW1OYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUmVmcmFpbnNRUFRvTmFtZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1OZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2hhcnNldDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVkNhcmRDaGFyc2V0UGFyYW1ldGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW5kQXBwZW5kZWQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgLy8gRGVmYXVsdCBjaGFyc2V0IHNob3VsZCBiZSB1c2VkCi0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmNhcmRUeXBlCi0gICAgICogQHBhcmFtIGNoYXJzZXQgSWYgbnVsbCwgd2UgdXNlIGRlZmF1bHQgY2hhcnNldCBmb3IgZXhwb3J0LgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQnVpbGRlcihmaW5hbCBpbnQgdmNhcmRUeXBlLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotCi0gICAgICAgIExvZy53KExPR19UQUcsCi0gICAgICAgICAgICAgICAgIlNob3VsZCBub3QgdXNlIHZDYXJkIDQuMCB3aGVuIGJ1aWxkaW5nIHZDYXJkLiAiICsKLSAgICAgICAgICAgICAgICAiSXQgaXMgbm90IG9mZmljaWFsbHkgcHVibGlzaGVkIHlldC4iKTsKLQotICAgICAgICBtSXNWMzBPclY0MCA9IFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgfHwgVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKTsKLSAgICAgICAgbVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSA9IFZDYXJkQ29uZmlnLnNob3VsZFVzZVF1b3RlZFByaW50YWJsZSh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSXNKYXBhbmVzZU1vYmlsZVBob25lID0gVkNhcmRDb25maWcubmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZyh2Y2FyZFR5cGUpOwotICAgICAgICBtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlID0gVkNhcmRDb25maWcub25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzQW5kcm9pZFByb3BlcnR5ID0gVkNhcmRDb25maWcudXNlc0FuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Vc2VzRGVmYWN0UHJvcGVydHkgPSBWQ2FyZENvbmZpZy51c2VzRGVmYWN0UHJvcGVydHkodmNhcmRUeXBlKTsKLSAgICAgICAgbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzID0gVkNhcmRDb25maWcuc2hvdWxkUmVmcmFpblFQVG9OYW1lUHJvcGVydGllcyh2Y2FyZFR5cGUpOwotICAgICAgICBtQXBwZW5kVHlwZVBhcmFtTmFtZSA9IFZDYXJkQ29uZmlnLmFwcGVuZFR5cGVQYXJhbU5hbWUodmNhcmRUeXBlKTsKLSAgICAgICAgbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcgPSBWQ2FyZENvbmZpZy5uZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKHZjYXJkVHlwZSk7Ci0KLSAgICAgICAgLy8gdkNhcmQgMi4xIHJlcXVpcmVzIGNoYXJzZXQuCi0gICAgICAgIC8vIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBpdCBidXQgd2UgZm91bmQgc29tZSBkZXZpY2VzIHVzZSBpdCB0byBkZXRlcm1pbmUKLSAgICAgICAgLy8gdGhlIGV4YWN0IGNoYXJzZXQuCi0gICAgICAgIC8vIFdlIGN1cnJlbnRseSBhcHBlbmQgaXQgb25seSB3aGVuIGNoYXJzZXQgb3RoZXIgdGhhbiBVVEZfOCBpcyB1c2VkLgotICAgICAgICBtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtID0KLSAgICAgICAgICAgICAgICAhKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgJiYgIlVURi04Ii5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKTsKLQotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNEb0NvTW8odmNhcmRUeXBlKSkgewotICAgICAgICAgICAgaWYgKCFTSElGVF9KSVMuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGNoYXJzZXQgXCIiICsgY2hhcnNldCArICJcIiBpcyB1c2VkIHdoaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgU0hJRlRfSklTICsgIiBpcyBuZWVkZWQgdG8gYmUgdXNlZC4iKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihjaGFyc2V0KS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFwiIiArIGNoYXJzZXQgKyAiXCIgd2FzIG5vdCBmb3VuZCAoYXMgdXN1YWwpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBpdCBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTLCAiZG9jb21vIikubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvQ29Nby1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoU0hJRlRfSklTKS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFNISUZUX0pJUyB3YXMgbm90IGZvdW5kLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBTSElGVF9KSVMgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gU0hJRlRfSklTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgU0hJRlRfSklTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgdGhlIGNoYXJzZXQgXCIiICsgVkNhcmRDb25maWcuREVGQVVMVF9FWFBPUlRfQ0hBUlNFVAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZm9yIGV4cG9ydC4iKTsKLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfRVhQT1JUX0NIQVJTRVQ7Ci0gICAgICAgICAgICAgICAgbVZDYXJkQ2hhcnNldFBhcmFtZXRlciA9ICJDSEFSU0VUPSIgKyBWQ2FyZENvbmZpZy5ERUZBVUxUX0VYUE9SVF9DSEFSU0VUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldFV0aWxzLmNoYXJzZXRGb3JWZW5kb3IoY2hhcnNldCkubmFtZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBcIiIgKyBjaGFyc2V0ICsgIlwiIHdhcyBub3QgZm91bmQgKGFzIHVzdWFsKS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBpdCBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICAgICAgICAgIG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIgPSAiQ0hBUlNFVD0iICsgY2hhcnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG1FbmRBcHBlbmRlZCA9IGZhbHNlOwotICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JFR0lOLCBWQ0FSRF9EQVRBX1ZDQVJEKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04sIFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjQwKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9WRVJTSU9OLCBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIVZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVua25vd24gdkNhcmQgdmVyc2lvbiBkZXRlY3RlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTiwgVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTm9uRW1wdHlOYW1lKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNHaXZlbk5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLSAgICAgICAgcmV0dXJuICEoVGV4dFV0aWxzLmlzRW1wdHkoZmFtaWx5TmFtZSkgJiYgVGV4dFV0aWxzLmlzRW1wdHkobWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShnaXZlbk5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShzdWZmaXgpICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZW50VmFsdWVzIGdldFByaW1hcnlDb250ZW50VmFsdWUoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBDb250ZW50VmFsdWVzIHByaW1hcnlDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgQ29udGVudFZhbHVlcyBzdWJwcmltYXJ5Q29udGVudFZhbHVlcyA9IG51bGw7Ci0gICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW50ZWdlciBpc1N1cGVyUHJpbWFyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlkpOwotICAgICAgICAgICAgaWYgKGlzU3VwZXJQcmltYXJ5ICE9IG51bGwgJiYgaXNTdXBlclByaW1hcnkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlICJzdXBlciBwcmltYXJ5IiBDb250ZW50VmFsdWVzLgotICAgICAgICAgICAgICAgIHByaW1hcnlDb250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSB0aGUgZmlyc3QgInByaW1hcnkiIENvbnRlbnRWYWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBpZiAic3VwZXIgcHJpbWFyeSIgQ29udGVudFZhbHVlcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgIGlmIChpc1ByaW1hcnkgIT0gbnVsbCAmJiBpc1ByaW1hcnkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc05vbkVtcHR5TmFtZShjb250ZW50VmFsdWVzKSkgewotICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29udGVudFZhbHVlcyA9IGNvbnRlbnRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBicmVhaywgc2luY2UgdGhlcmUgbWF5IGJlIENvbnRlbnRWYWx1ZXMgd2l0aCAic3VwZXIgcHJpbWFyeSIKLSAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXJ3b3JkLgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNOb25FbXB0eU5hbWUoY29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmltYXJ5Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3VicHJpbWFyeUNvbnRlbnRWYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGNob29zZSB0aGUgZmlyc3QgQ29udGVudFZhbHVlcyBpZiBhbnkgInByaW1hcnkiIENvbnRlbnRWYWx1ZXMgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBzdWJwcmltYXJ5Q29udGVudFZhbHVlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFsbCBDb250ZW50VmFsdWVzIGdpdmVuIGZyb20gZGF0YWJhc2UgaXMgZW1wdHkuIik7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByaW1hcnlDb250ZW50VmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvbXBsaWNhdGlvbiBpbiBsb2dpYywgd2UgdXNlIHRoaXMgbWV0aG9kIHRvIGNvbnN0cnVjdCBOLCBGTgotICAgICAqIHByb3BlcnRpZXMgZm9yIHZDYXJkIDQuMC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFZDYXJkQnVpbGRlciBhcHBlbmROYW1lUHJvcGVydGllc1Y0MChmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChtSXNEb0NvTW8gfHwgbU5lZWRzVG9Db252ZXJ0UGhvbmV0aWNTdHJpbmcpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgZmxhZ3MgdGhhdCBsb29rIHN0YWxlIGZyb20gdGhlIHZpZXcgb2YgdkNhcmQgNC4wIHRvCi0gICAgICAgICAgICAvLyBzaW1wbGlmeSBjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLiBBY3R1YWxseSB3ZSBkb24ndCBoYXZlIGFueSB2Q2FyZCBmaWxlCi0gICAgICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSByZWFsIHdvcmxkIHlldCwgc28gd2UgbWF5IG5lZWQgdG8gcmUtZW5hYmxlIHNvbWUgb2YgdGhlc2UKLSAgICAgICAgICAgIC8vIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBmbGFnIGlzIHVzZWQgaW4gdkNhcmQgNC4wIGNvbnN0cnVjdGlvbi4gSWdub3JlZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTiwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBoYXZlIGRpZmZpY3VsdHkgaGVyZS4gSG93IGNhbiB3ZSBhcHByb3ByaWF0ZWx5IGhhbmRsZSBTdHJ1Y3R1cmVkTmFtZSB3aXRoCi0gICAgICAgIC8vIG1pc3NpbmcgcGFydHMgbmVjZXNzYXJ5IGZvciBkaXNwbGF5aW5nIHdoaWxlIGl0IGhhcyBzdXBwcmVtZW50YWwgaW5mb3JtYXRpb24uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGUuZy4gSG93IHRvIGhhbmRsZSBub24tZW1wdHkgcGhvbmV0aWMgbmFtZXMgd2l0aCBlbXB0eSBzdHJ1Y3R1cmVkIG5hbWVzPwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IGdldFByaW1hcnlDb250ZW50VmFsdWUoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICBTdHJpbmcgZmFtaWx5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZ2l2ZW5OYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUFJFRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuU1VGRklYKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShmYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KGdpdmVuTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtaWRkbGVOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShzdWZmaXgpKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZm9ybWF0dGVkTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYW1pbHlOYW1lID0gZm9ybWF0dGVkTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWUgPQotICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljR2l2ZW5OYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZEZhbWlseSA9IGVzY2FwZUNoYXJhY3RlcnMoZmFtaWx5TmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkR2l2ZW4gPSBlc2NhcGVDaGFyYWN0ZXJzKGdpdmVuTmFtZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkTWlkZGxlID0gZXNjYXBlQ2hhcmFjdGVycyhtaWRkbGVOYW1lKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVDaGFyYWN0ZXJzKHByZWZpeCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkU3VmZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhzdWZmaXgpOwotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKTsKLQotICAgICAgICBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3J0QXMgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAgICAgKyAnOycgKyBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICArICc7JyArIGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZCgiU09SVC1BUz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1Y0MFBhcmFtVmFsdWUoc29ydEFzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZEZhbWlseSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkR2l2ZW4pOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoZXNjYXBlZE1pZGRsZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVkUHJlZml4KTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRTdWZmaXgpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShmb3JtYXR0ZWROYW1lKSkgewotICAgICAgICAgICAgLy8gTm90ZToKLSAgICAgICAgICAgIC8vIERJU1BMQVlfTkFNRSBkb2Vzbid0IGV4aXN0IHdoaWxlIHNvbWUgb3RoZXIgZWxlbWVudHMgZG8sIHdoaWNoIGlzIHVzdWFsbHkKLSAgICAgICAgICAgIC8vIHdlaXJkIGluIEFuZHJvaWQsIGFzIERJU1BMQVlfTkFNRSBzaG91bGQgKHVzdWFsbHkpIGJlIGNvbnN0cnVjdGVkCi0gICAgICAgICAgICAvLyBmcm9tIHRoZSBvdGhlcnMgdXNpbmcgbG9jYWxlIGluZm9ybWF0aW9uIGFuZCBpdHMgY29kZSBwb2ludHMuCi0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRElTUExBWV9OQU1FIGlzIGVtcHR5LiIpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZCA9IGVzY2FwZUNoYXJhY3RlcnMoVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKG1WQ2FyZFR5cGUpLAotICAgICAgICAgICAgICAgICAgICBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUsIHByZWZpeCwgc3VmZml4KSk7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCBlc2NhcGVkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkRm9ybWF0dGVkID0gZXNjYXBlQ2hhcmFjdGVycyhmb3JtYXR0ZWROYW1lKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVzY2FwZWRGb3JtYXR0ZWQpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG1heSBuZWVkIFgtIHByb3BlcnRpZXMgZm9yIHBob25ldGljIG5hbWVzLgotICAgICAgICBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBzYWZldHksIHdlJ2xsIGVtaXQganVzdCBvbmUgdmFsdWUgYXJvdW5kIFN0cnVjdHVyZWROYW1lLCBhcyBleHRlcm5hbCBpbXBvcnRlcnMKLSAgICAgKiBtYXkgZ2V0IGNvbmZ1c2VkIHdpdGggbXVsdGlwbGUgIk4iLCAiRk4iLCBldGMuIHByb3BlcnRpZXMsIHRob3VnaCBpdCBpcyB2YWxpZCBpbgotICAgICAqIHZDYXJkIHNwZWMuCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmROYW1lUHJvcGVydGllcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIGFwcGVuZE5hbWVQcm9wZXJ0aWVzVjQwKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIHJlcXVpcmVzICJOIiBhbmQgIkZOIiBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIC8vIHZDYXJkIDQuMCBkb2VzIE5PVCByZXF1aXJlIE4sIGJ1dCB3ZSB0YWtlIGNhcmUgb2YgcG9zc2libGUgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IGlzc3Vlcy4KLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOLCAiIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBnZXRQcmltYXJ5Q29udGVudFZhbHVlKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZhbWlseU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBSRUZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlNVRkZJWCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkaXNwbGF5TmFtZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FKTsKLQotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGZhbWlseU5hbWUpIHx8ICFUZXh0VXRpbHMuaXNFbXB0eShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseUFwcGVuZENoYXJzZXRQYXJhbWV0ZXJUb05hbWUgPQotICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZmFtaWx5TmFtZSwgZ2l2ZW5OYW1lLCBtaWRkbGVOYW1lLCBwcmVmaXgsIHN1ZmZpeCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZ2l2ZW5OYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkobWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHByZWZpeCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHN1ZmZpeCkpKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE5hbWU7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgICAgIGZvcm1hdHRlZE5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVkTmFtZSA9IFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cygKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLmdldE5hbWVPcmRlclR5cGUobVZDYXJkVHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlOYW1lLCBtaWRkbGVOYW1lLCBnaXZlbk5hbWUsIHByZWZpeCwgc3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvRk4gPQotICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZm9ybWF0dGVkTmFtZSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRk4gPQotICAgICAgICAgICAgICAgICAgICAhbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShmb3JtYXR0ZWROYW1lKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGYW1pbHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEdpdmVuOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRNaWRkbGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFByZWZpeDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkU3VmZml4OwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvTmFtZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRGYW1pbHkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUoZmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZEdpdmVuID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGdpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE1pZGRsZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShtaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUHJlZml4ID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFN1ZmZpeCA9IGVuY29kZVF1b3RlZFByaW50YWJsZShzdWZmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRmFtaWx5ID0gZXNjYXBlQ2hhcmFjdGVycyhmYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkR2l2ZW4gPSBlc2NhcGVDaGFyYWN0ZXJzKGdpdmVuTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZE1pZGRsZSA9IGVzY2FwZUNoYXJhY3RlcnMobWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFByZWZpeCA9IGVzY2FwZUNoYXJhY3RlcnMocHJlZml4KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkU3VmZml4ID0gZXNjYXBlQ2hhcmFjdGVycyhzdWZmaXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEZvcm1hdHRlZG5hbWUgPQotICAgICAgICAgICAgICAgICAgICAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9GTiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUXVvdGVkUHJpbnRhYmxlKGZvcm1hdHRlZE5hbWUpIDogZXNjYXBlQ2hhcmFjdGVycyhmb3JtYXR0ZWROYW1lKSk7Ci0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKTsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5QXBwZW5kQ2hhcnNldFBhcmFtZXRlclRvTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIC8vIERvQ29NbyBwaG9uZXMgcmVxdWlyZSB0aGF0IGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlICJmYW1pbHkgbmFtZSIgZmllbGQuCi0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGZvcm1hdHRlZE5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb05hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRGYW1pbHkpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRHaXZlbik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZE1pZGRsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotCi0gICAgICAgICAgICAvLyBGTiBwcm9wZXJ0eQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0ZOKTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlBcHBlbmRDaGFyc2V0UGFyYW1ldGVyVG9GTikgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0ZOKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZEZvcm1hdHRlZG5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgfSBlbHNlIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUgPQotICAgICAgICAgICAgICAgICghbVJlZnJhaW5zUVBUb05hbWVQcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZGlzcGxheU5hbWUpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkRGlzcGxheU5hbWUgPQotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGVUb0Rpc3BsYXlOYW1lID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVRdW90ZWRQcmludGFibGUoZGlzcGxheU5hbWUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlQ2hhcmFjdGVycyhkaXNwbGF5TmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIE4KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0oZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZVRvRGlzcGxheU5hbWUpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0KLSAgICAgICAgICAgIC8vIEZOCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4pOwotCi0gICAgICAgICAgICAvLyBOb3RlOiAiQ0hBUlNFVCIgcGFyYW0gaXMgbm90IGFsbG93ZWQgaW4gdkNhcmQgMy4wLCBidXQgd2UgbWF5IGFkZCBpdAotICAgICAgICAgICAgLy8gICAgICAgd2hlbiBpdCB3b3VsZCBiZSB1c2VmdWwgb3IgbmVjZXNzYXJ5IGZvciBleHRlcm5hbCBpbXBvcnRlcnMsCi0gICAgICAgICAgICAvLyAgICAgICBhc3N1bWluZyB0aGUgZXh0ZXJuYWwgaW1wb3J0ZXIgYWxsb3dzIHRoaXMgdmlvcmF0aW9uIG9mIHRoZSBzcGVjLgotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWREaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX04sICIiKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfRk4sICIiKTsKLSAgICAgICAgfSBlbHNlIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTiwgIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXBwZW5kUGhvbmV0aWNOYW1lRmllbGRzKGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbWl0cyBTT1VORDtJUk1DLCBTT1JULVNUUklORywgYW5kIGRlLWZhY3QgdmFsdWVzIGZvciBwaG9uZXRpYyBuYW1lcyBsaWtlIFgtUEhPTkVUSUMtRkFNSUxZLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQaG9uZXRpY05hbWVGaWVsZHMoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0ZhbWlseU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRtcFBob25ldGljRmFtaWx5TmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG1wUGhvbmV0aWNNaWRkbGVOYW1lID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBQaG9uZXRpY0dpdmVuTmFtZSA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FKTsKLSAgICAgICAgICAgIGlmIChtTmVlZHNUb0NvbnZlcnRQaG9uZXRpY1N0cmluZykgewotICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSA9IFZDYXJkVXRpbHMudG9IYWxmV2lkdGhTdHJpbmcodG1wUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNHaXZlbk5hbWUgPSBWQ2FyZFV0aWxzLnRvSGFsZldpZHRoU3RyaW5nKHRtcFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lID0gdG1wUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIHBob25ldGljTWlkZGxlTmFtZSA9IHRtcFBob25ldGljTWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBwaG9uZXRpY0dpdmVuTmFtZSA9IHRtcFBob25ldGljR2l2ZW5OYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgU09SVC1TVFJJTkcgYW55d2F5LgotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc29ydFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyhtVkNhcmRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljRmFtaWx5TmFtZSwgcGhvbmV0aWNNaWRkbGVOYW1lLCBwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpOwotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpICYmIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShzb3J0U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBkb2VzIG5vdCBmb3JjZSB1cyB0byB1c2UgVVRGLTggYW5kIGFjdHVhbGx5IHdlIHNlZSBzb21lCi0gICAgICAgICAgICAgICAgLy8gcHJvZ3JhbXMgd2hpY2ggZW1pdCB0aGlzIHZhbHVlLiBJdCBpcyBpbmNvcnJlY3QgZnJvbSB0aGUgdmlldyBvZgotICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljYXRpb24sIGJ1dCBhY3R1YWxseSBuZWNlc3NhcnkgZm9yIHBhcnNpbmcgdkNhcmQgd2l0aCBub24tVVRGLTgKLSAgICAgICAgICAgICAgICAvLyBjaGFyc2V0cywgZXhwZWN0aW5nIG90aGVyIHBhcnNlcnMgbm90IGdldCBjb25mdXNlZCB3aXRoIHRoaXMgdmFsdWUuCi0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlc2NhcGVDaGFyYWN0ZXJzKHNvcnRTdHJpbmcpKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlzSmFwYW5lc2VNb2JpbGVQaG9uZSkgewotICAgICAgICAgICAgLy8gTm90ZTogVGhlcmUgaXMgbm8gYXBwcm9wcmlhdGUgcHJvcGVydHkgZm9yIGV4cHJlc3NpbmcKLSAgICAgICAgICAgIC8vICAgICAgIHBob25ldGljIG5hbWUgKFlvbWlnYW5hIGluIEphcGFuZXNlKSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluCi0gICAgICAgICAgICAvLyAgICAgICB2Q2FyZCAzLjAgKFNPUlQtU1RSSU5HKS4KLSAgICAgICAgICAgIC8vICAgICAgIFdlIHVzZSBEb0NvTW8ncyB3YXkgd2hlbiB0aGUgZGV2aWNlIGlzIEphcGFuZXNlIG9uZSBzaW5jZSBpdCBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAvLyAgICAgICBzdXBwb3J0ZWQgYnkgYSBsb3Qgb2YgSmFwYW5lc2UgbW9iaWxlIHBob25lcy4KLSAgICAgICAgICAgIC8vICAgICAgIFRoaXMgaXMgIlgtIiBwcm9wZXJ0eSwgc28gYW55IHBhcnNlciBob3BlZnVsbHkgd291bGQgbm90IGdldAotICAgICAgICAgICAgLy8gICAgICAgY29uZnVzZWQgd2l0aCB0aGlzLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgIEFsc28sIERvQ29NbydzIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdkNhcmQgY29tcG9zZXIgdG8gdXNlIGp1c3QgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAgICAgICBjb2x1bW4uCi0gICAgICAgICAgICAvLyAgICAgICBpLmUuCi0gICAgICAgICAgICAvLyAgICAgICBnb29kOiAgU09VTkQ7WC1JUk1DLU46TWl5YWthd2EgRGFpc3VrZTs7OzsKLSAgICAgICAgICAgIC8vICAgICAgIGJhZCA6ICBTT1VORDtYLUlSTUMtTjpNaXlha2F3YTtEYWlzdWtlOzs7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09VTkQpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTik7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAoIW1SZWZyYWluc1FQVG9OYW1lUHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25ldGljR2l2ZW5OYW1lKSkpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZTsKLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY01pZGRsZU5hbWUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0dpdmVuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lLAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lLCBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gZmFtaWx5O2dpdmVuCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gZ2l2ZW47bWlkZGxlCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gbWlkZGxlO3ByZWZpeAotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIHByZWZpeDtzdWZmaXgKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2cuZCgiQEBAIiwgImhvZ2UiKTsKLSAgICAgICAgaWYgKG1Vc2VzRGVmYWN0UHJvcGVydHkpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNHaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShwaG9uZXRpY0dpdmVuTmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0dpdmVuTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9QSE9ORVRJQ19GSVJTVF9OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtKHBob25ldGljR2l2ZW5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9ICAvLyBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljR2l2ZW5OYW1lKSkKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocGhvbmV0aWNNaWRkbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRQaG9uZXRpY01pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljTWlkZGxlTmFtZSA9IGVzY2FwZUNoYXJhY3RlcnMocGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTUlERExFX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0ocGhvbmV0aWNNaWRkbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKG1WQ2FyZENoYXJzZXRQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfREFUQV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkUGhvbmV0aWNNaWRkbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICAgICAgfSAgLy8gaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG9uZXRpY0dpdmVuTmFtZSkpCi0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHBob25ldGljRmFtaWx5TmFtZSkpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFBob25ldGljRmFtaWx5TmFtZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShwaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHBob25ldGljRmFtaWx5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShwaG9uZXRpY0ZhbWlseU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRQaG9uZXRpY0ZhbWlseU5hbWUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICB9ICAvLyBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHBob25ldGljRmFtaWx5TmFtZSkpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5pY2tOYW1lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQW5kcm9pZFByb3BlcnR5OwotICAgICAgICBpZiAobUlzVjMwT3JWNDApIHsgICAvLyBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIE5JQ0tOQU1FIHByb3BlcnR5LgotICAgICAgICAgICAgdXNlQW5kcm9pZFByb3BlcnR5ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAobVVzZXNBbmRyb2lkUHJvcGVydHkpIHsKLSAgICAgICAgICAgIHVzZUFuZHJvaWRQcm9wZXJ0eSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHdheSB0byBhZGQgdGhpcyBmaWVsZC4KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5pY2tuYW1lID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhOaWNrbmFtZS5OQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobmlja25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodXNlQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLCBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OSUNLTkFNRSwgbmlja25hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZFBob25lcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gcGhvbmVMaW5lRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwaG9uZVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHR5cGVBc09iamVjdCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKFBob25lLlRZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTEFCRUwpOwotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoUGhvbmUuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoUGhvbmUuTlVNQkVSKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlciA9IHBob25lTnVtYmVyLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBob25lTnVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQQUdFUiBudW1iZXIgbmVlZHMgdW5mb3JtYXR0ZWQgInBob25lIG51bWJlciIuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSAodHlwZUFzT2JqZWN0ICE9IG51bGwgPyB0eXBlQXNPYmplY3QgOiBERUZBVUxUX1BIT05FX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFBob25lLlRZUEVfUEFHRVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uZmlnLnJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwaG9uZVNldC5jb250YWlucyhwaG9uZU51bWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUZWxMaW5lKHR5cGUsIGxhYmVsLCBwaG9uZU51bWJlciwgaXNQcmltYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZU51bWJlckxpc3QgPSBzcGxpdEFuZFRyaW1QaG9uZU51bWJlcnMocGhvbmVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGhvbmVOdW1iZXJMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGhvbmVMaW5lRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYWN0dWFsUGhvbmVOdW1iZXIgOiBwaG9uZU51bWJlckxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGhvbmVTZXQuY29udGFpbnMoYWN0dWFsUGhvbmVOdW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZvcm1hdCA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZFBob25lTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKGFjdHVhbFBob25lTnVtYmVyLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob25lU2V0LmFkZChhY3R1YWxQaG9uZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGVsTGluZSh0eXBlLCBsYWJlbCwgZm9ybWF0dGVkUGhvbmVOdW1iZXIsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gIC8vIGZvciAoU3RyaW5nIGFjdHVhbFBob25lTnVtYmVyIDogcGhvbmVOdW1iZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwaG9uZUxpbmVFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRUZWxMaW5lKFBob25lLlRZUEVfSE9NRSwgIiIsICIiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTcGxpdHMgYSBnaXZlbiBzdHJpbmcgZXhwcmVzc2luZyBwaG9uZSBudW1iZXJzIGludG8gc2V2ZXJhbCBzdHJpbmdzLCBhbmQgcmVtb3ZlCi0gICAgICogdW5uZWNlc3NhcnkgY2hhcmFjdGVycyBpbnNpZGUgdGhlbS4gVGhlIHNpemUgb2YgYSByZXR1cm5lZCBsaXN0IGJlY29tZXMgMSB3aGVuCi0gICAgICogbm8gc3BsaXQgaXMgbmVlZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2l2ZW4gbnVtYmVyICJtYXkiIGhhdmUgc2V2ZXJhbCBwaG9uZSBudW1iZXJzIHdoZW4gdGhlIGNvbnRhY3QgZW50cnkgaXMgY29ycnVwdGVkCi0gICAgICogYmVjYXVzZSBvZiBpdHMgb3JpZ2luYWwgc291cmNlLgotICAgICAqIGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpXG40NDQtNTU1LTY2NjYgKEJyb3dhcmQ7IDMwNS02NTMtNjc5NiAoTWlhbWkpIgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGtpbmQgb2YgInBob25lIG51bWJlcnMiIHdpbGwgbm90IGJlIGNyZWF0ZWQgd2l0aCBBbmRyb2lkIHZDYXJkIGltcGxlbWVudGF0aW9uLAotICAgICAqIGJ1dCB3ZSBtYXkgZW5jb3VudGVyIHRoZW0gaWYgdGhlIHNvdXJjZSBvZiB0aGUgaW5wdXQgZGF0YSBoYXMgYWxyZWFkeSBjb3JydXB0ZWQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVG8gaGFuZGxlIHRoaXMgY2FzZSwgdGhpcyBtZXRob2QgZmlyc3Qgc3BsaXRzIGl0cyBpbnB1dCBpbnRvIG11bHRpcGxlIHBhcnRzCi0gICAgICogKGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpIiwgIjQ0NC01NTUtNjY2NiAoQnJvd2FyZCIsIGFuZCAzMDU2NTMtNjc5NiAoTWlhbWkpIikgYW5kCi0gICAgICogcmVtb3ZlcyB1bm5lY2Vzc2FyeSBzdHJpbmdzIGxpa2UgIihNaWFtaSkiLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHRyaW1taW5nIGlzIGluYXBwcm9wcmlhdGUgZm9yIGl0cyByZWNlaXZlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHNwbGl0QW5kVHJpbVBob25lTnVtYmVycyhmaW5hbCBTdHJpbmcgcGhvbmVOdW1iZXIpIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHBob25lTnVtYmVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChjaCkgfHwgY2ggPT0gJysnKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoY2ggPT0gJzsnIHx8IGNoID09ICdcbicpICYmIGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcGhvbmVMaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBob25lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZEVtYWlscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGJvb2xlYW4gZW1haWxBZGRyZXNzRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhZGRyZXNzU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbWFpbEFkZHJlc3MgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEVtYWlsLkRBVEEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbWFpbEFkZHJlc3MgPSBlbWFpbEFkZHJlc3MudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZW1haWxBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW50ZWdlciB0eXBlQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFbWFpbC5UWVBFKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9ICh0eXBlQXNPYmplY3QgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNPYmplY3QgOiBERUZBVUxUX0VNQUlMX1RZUEUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRW1haWwuTEFCRUwpOwotICAgICAgICAgICAgICAgIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRW1haWwuSVNfUFJJTUFSWSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkgPSAoaXNQcmltYXJ5QXNJbnRlZ2VyICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzc0V4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2V0LmNvbnRhaW5zKGVtYWlsQWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1NldC5hZGQoZW1haWxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kRW1haWxMaW5lKHR5cGUsIGxhYmVsLCBlbWFpbEFkZHJlc3MsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFlbWFpbEFkZHJlc3NFeGlzdHMgJiYgbUlzRG9Db01vKSB7Ci0gICAgICAgICAgICBhcHBlbmRFbWFpbExpbmUoRW1haWwuVFlQRV9IT01FLCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kUG9zdGFscyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCA9PSBudWxsIHx8IGNvbnRlbnRWYWx1ZXNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0hPTUUpOwotICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRQb3N0YWxzRm9yRG9Db01vKGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXBwZW5kUG9zdGFsc0ZvckdlbmVyaWMoY29udGVudFZhbHVlc0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IHNQb3N0YWxUeXBlUHJpb3JpdHlNYXA7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICAgICAgc1Bvc3RhbFR5cGVQcmlvcml0eU1hcC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUsIDApOwotICAgICAgICBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfV09SSywgMSk7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUiwgMik7Ci0gICAgICAgIHNQb3N0YWxUeXBlUHJpb3JpdHlNYXAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00sIDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyaWVzIHRvIGFwcGVuZCBqdXN0IG9uZSBsaW5lLiBJZiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFkZHJlc3MKLSAgICAgKiBpbmZvcm1hdGlvbiwgYXBwZW5kIGFuIGVtcHR5IGxpbmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JEb0NvTW8oZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpbnQgY3VycmVudFByaW9yaXR5ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIGludCBjdXJyZW50VHlwZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBDb250ZW50VmFsdWVzIGN1cnJlbnRDb250ZW50VmFsdWVzID0gbnVsbDsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgcHJpb3JpdHlBc0ludGVnZXIgPSBzUG9zdGFsVHlwZVByaW9yaXR5TWFwLmdldCh0eXBlQXNJbnRlZ2VyKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgIChwcmlvcml0eUFzSW50ZWdlciAhPSBudWxsID8gcHJpb3JpdHlBc0ludGVnZXIgOiBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHkgPCBjdXJyZW50UHJpb3JpdHkpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50UHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VHlwZSA9IHR5cGVBc0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgY3VycmVudENvbnRlbnRWYWx1ZXMgPSBjb250ZW50VmFsdWVzOwotICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJyZW50Q29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiU2hvdWxkIG5vdCBjb21lIGhlcmUuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcG9zdGFsIGRhdGEuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWwgPSBjdXJyZW50Q29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMKTsKLSAgICAgICAgYXBwZW5kUG9zdGFsTGluZShjdXJyZW50VHlwZSwgbGFiZWwsIGN1cnJlbnRDb250ZW50VmFsdWVzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBvc3RhbHNGb3JHZW5lcmljKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW50ZWdlciB0eXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gKHR5cGVBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVBc0ludGVnZXIgOiBERUZBVUxUX1BPU1RBTF9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoU3RydWN0dXJlZFBvc3RhbC5MQUJFTCk7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGlzUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoU3RydWN0dXJlZFBvc3RhbC5JU19QUklNQVJZKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5ID0gKGlzUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgYXBwZW5kUG9zdGFsTGluZSh0eXBlLCBsYWJlbCwgY29udGVudFZhbHVlcywgaXNQcmltYXJ5LCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQb3N0YWxTdHJ1Y3QgewotICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0OwotICAgICAgICBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGE7Ci0gICAgICAgIHB1YmxpYyBQb3N0YWxTdHJ1Y3QoZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRDaGFyc2V0LCBmaW5hbCBTdHJpbmcgYWRkcmVzc0RhdGEpIHsKLSAgICAgICAgICAgIHRoaXMucmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlOwotICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGFyc2V0ID0gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgICAgIHRoaXMuYWRkcmVzc0RhdGEgPSBhZGRyZXNzRGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gbnVsbCB3aGVuIHRoZXJlJ3Mgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGNvbnN0cnVjdCB0aGUgZGF0YS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBvc3RhbFN0cnVjdCB0cnlDb25zdHJ1Y3RQb3N0YWxTdHJ1Y3QoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIC8vIGFkci12YWx1ZSAgICA9IDAqNih0ZXh0LXZhbHVlICI7IikgdGV4dC12YWx1ZQotICAgICAgICAvLyAgICAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgIC8vICAgICAgICAgICAgICA7IENvZGUsIENvdW50cnkgTmFtZQotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UG9Cb3ggPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TmVpZ2hib3Job29kID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdTdHJlZXQgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVUKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0xvY2FsaXR5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLkNJVFkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmF3UmVnaW9uID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByYXdQb3N0YWxDb2RlID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd0NvdW50cnkgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHJhd0FkZHJlc3NBcnJheSA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICByYXdQb0JveCwgcmF3TmVpZ2hib3Job29kLCByYXdTdHJlZXQsIHJhd0xvY2FsaXR5LAotICAgICAgICAgICAgICAgIHJhd1JlZ2lvbiwgcmF3UG9zdGFsQ29kZSwgcmF3Q291bnRyeX07Ci0gICAgICAgIGlmICghVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpKSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdBZGRyZXNzQXJyYXkpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldCA9Ci0gICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkocmF3QWRkcmVzc0FycmF5KTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9Cb3g7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFN0cmVldDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTG9jYWxpdHk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFJlZ2lvbjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkUG9zdGFsQ29kZTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkQ291bnRyeTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkTmVpZ2hib3Job29kOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3TG9jYWxpdHkyOwotICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBpbmVmZmljaWVudCBzaW5jZSB3ZSBlbmNvZGUgcmF3TG9jYWxpdHkgYW5kIHJhd05laWdoYm9yaG9vZCB0d2ljZSwKLSAgICAgICAgICAgIC8vIGJ1dCB0aGlzIGlzIGludGVudGlvbmFsLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFFQIGVuY29kaW5nIG1heSBhZGQgbGluZSBmZWVkcyB3aGVuIG5lZWRlZCBhbmQgdGhlIHJlc3VsdCBvZgotICAgICAgICAgICAgLy8gLSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkgKyAiICIgKyByYXdOZWlnaGJvcmhvb2QpCi0gICAgICAgICAgICAvLyBtYXkgYmUgZGlmZmVyZW50IGZyb20KLSAgICAgICAgICAgIC8vIC0gZW5jb2RlZExvY2FsaXR5ICsgIiAiICsgZW5jb2RlZE5laWdoYm9yaG9vZC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB1c2Ugc2FmZXIgd2F5LgotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0xvY2FsaXR5KSkgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9ICIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd05laWdoYm9yaG9vZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyYXdOZWlnaGJvcmhvb2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd0xvY2FsaXR5MiA9IHJhd0xvY2FsaXR5ICsgIiAiICsgcmF3TmVpZ2hib3Job29kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUG9Cb3ggPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3U3RyZWV0KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTG9jYWxpdHkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3TG9jYWxpdHkyKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkUmVnaW9uID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3UG9zdGFsQ29kZSk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZENvdW50cnkgPSBlbmNvZGVRdW90ZWRQcmludGFibGUocmF3Q291bnRyeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuY29kZWRQb0JveCA9IGVzY2FwZUNoYXJhY3RlcnMocmF3UG9Cb3gpOwotICAgICAgICAgICAgICAgIGVuY29kZWRTdHJlZXQgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1N0cmVldCk7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZExvY2FsaXR5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdMb2NhbGl0eTIpOwotICAgICAgICAgICAgICAgIGVuY29kZWRSZWdpb24gPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFBvc3RhbENvZGUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1Bvc3RhbENvZGUpOwotICAgICAgICAgICAgICAgIGVuY29kZWRDb3VudHJ5ID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdDb3VudHJ5KTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkTmVpZ2hib3Job29kID0gZXNjYXBlQ2hhcmFjdGVycyhyYXdOZWlnaGJvcmhvb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBhZGRyZXNzQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBvQm94KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBQTyBCT1ggOyBFeHRlbmRlZCBBZGRyZXNzCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gRXh0ZW5kZWQgQWRkcmVzcyA6IFN0cmVldAotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRTdHJlZXQpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFN0cmVldCA6IExvY2FsaXR5Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZExvY2FsaXR5KTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBMb2NhbGl0eSA6IFJlZ2lvbgotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRSZWdpb24pOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFJlZ2lvbiA6IFBvc3RhbCBDb2RlCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoZW5jb2RlZFBvc3RhbENvZGUpOwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFBvc3RhbCBDb2RlIDogQ291bnRyeQotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRDb3VudHJ5KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdGFsU3RydWN0KAotICAgICAgICAgICAgICAgICAgICByZWFsbHlVc2VRdW90ZWRQcmludGFibGUsIGFwcGVuZENoYXJzZXQsIGFkZHJlc3NCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgeyAgLy8gVkNhcmRVdGlscy5hcmVBbGxFbXB0eShyYXdBZGRyZXNzQXJyYXkpID09IHRydWUKLSAgICAgICAgICAgIC8vIFRyeSB0byB1c2UgRk9STUFUVEVEX0FERFJFU1MgaW5zdGVhZC4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByYXdGb3JtYXR0ZWRBZGRyZXNzID0KLSAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd0Zvcm1hdHRlZEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9Ci0gICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdGb3JtYXR0ZWRBZGRyZXNzKSk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZENoYXJzZXQgPQotICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0Zvcm1hdHRlZEFkZHJlc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkRm9ybWF0dGVkQWRkcmVzcyA9IGVzY2FwZUNoYXJhY3RlcnMocmF3Rm9ybWF0dGVkQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc2Vjb25kIHZhbHVlICgiRXh0ZW5kZWQgQWRkcmVzcyIpIGp1c3QgYmVjYXVzZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzCi0gICAgICAgICAgICAvLyBkbyBzby4gSWYgdGhlIG90aGVyIGltcG9ydGVyIGV4cGVjdHMgdGhlIHZhbHVlIGJlIGluIHRoZSBvdGhlciBmaWVsZCwgc29tZSBmbGFnIG1heQotICAgICAgICAgICAgLy8gYmUgbmVlZGVkLgotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBhZGRyZXNzQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUE8gQk9YIDsgRXh0ZW5kZWQgQWRkcmVzcwotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKGVuY29kZWRGb3JtYXR0ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBFeHRlbmRlZCBBZGRyZXNzIDogU3RyZWV0Ci0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gU3RyZWV0IDogTG9jYWxpdHkKLSAgICAgICAgICAgIGFkZHJlc3NCdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7ICAvLyBMb2NhbGl0eSA6IFJlZ2lvbgotICAgICAgICAgICAgYWRkcmVzc0J1aWxkZXIuYXBwZW5kKFZDQVJEX0lURU1fU0VQQVJBVE9SKTsgIC8vIFJlZ2lvbiA6IFBvc3RhbCBDb2RlCi0gICAgICAgICAgICBhZGRyZXNzQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOyAgLy8gUG9zdGFsIENvZGUgOiBDb3VudHJ5Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RhbFN0cnVjdCgKLSAgICAgICAgICAgICAgICAgICAgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlLCBhcHBlbmRDaGFyc2V0LCBhZGRyZXNzQnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEJ1aWxkZXIgYXBwZW5kSW1zKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHByb3RvY29sQXNPYmplY3QgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5QUk9UT0NPTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sQXNPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IFZDYXJkVXRpbHMuZ2V0UHJvcGVydHlOYW1lRm9ySW0ocHJvdG9jb2xBc09iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoSW0uREFUQSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGVBc1N0cmluZzsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEltLlRZUEUpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVBc0ludGVnZXIgIT0gbnVsbCA/IHR5cGVBc0ludGVnZXIgOiBJbS5UWVBFX09USEVSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW0uVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbS5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYWJlbCA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoSW0uTEFCRUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IChsYWJlbCAhPSBudWxsID8gIlgtIiArIGxhYmVsIDogbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEltLlRZUEVfT1RIRVI6ICAvLyBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHR5cGVBc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodHlwZUFzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1ByaW1hcnlBc0ludGVnZXIgPSBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihJbS5JU19QUklNQVJZKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaXNQcmltYXJ5QXNJbnRlZ2VyID4gMCkgOiBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgcGFyYW1ldGVyTGlzdCwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRXZWJzaXRlcyhmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYnNpdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKFdlYnNpdGUuVVJMKTsKLSAgICAgICAgICAgICAgICBpZiAod2Vic2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdlYnNpdGUgPSB3ZWJzaXRlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiB2Q2FyZCAzLjAgZG9lcyBub3QgYWxsb3cgYW55IHBhcmFtZXRlciBhZGRpdGlvbiB0b3dhcmQgIlVSTCIKLSAgICAgICAgICAgICAgICAvLyAgICAgICBwcm9wZXJ0eSwgd2hpbGUgdGhlcmUncyBubyBkb2N1bWVudCBpbiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh3ZWJzaXRlKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwsIHdlYnNpdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE9yZ2FuaXphdGlvbnMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wYW55ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uQ09NUEFOWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhbnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21wYW55ID0gY29tcGFueS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBkZXBhcnRtZW50ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhPcmdhbml6YXRpb24uREVQQVJUTUVOVCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcGFydG1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXBhcnRtZW50ID0gZGVwYXJ0bWVudC50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoT3JnYW5pemF0aW9uLlRJVExFKTsKLSAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG9yZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY29tcGFueSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnQnVpbGRlci5hcHBlbmQoY29tcGFueSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZGVwYXJ0bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yZ0J1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmdCdWlsZGVyLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9yZ0J1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3JnbGluZSA9IG9yZ0J1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX09SRywgb3JnbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG9yZ2xpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG9yZ2xpbmUpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RJVExFLCB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSh0aXRsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSh0aXRsZSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRQaG90b3MoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gY29udGVudFZhbHVlcy5nZXRBc0J5dGVBcnJheShQaG90by5QSE9UTyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob3RvVHlwZSA9IFZDYXJkVXRpbHMuZ3Vlc3NJbWFnZVR5cGUoZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob3RvVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJVbmtub3duIHBob3RvIHR5cGUuIElnbm9yZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGlzIHdvcmtzIGZpbmUuCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBob3RvU3RyaW5nID0gbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKGRhdGEsIEJhc2U2NC5OT19XUkFQKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShwaG90b1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kUGhvdG9MaW5lKHBob3RvU3RyaW5nLCBwaG90b1R5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRCdWlsZGVyIGFwcGVuZE5vdGVzKGZpbmFsIExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtT25seU9uZU5vdGVGaWVsZElzQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBub3RlQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm90ZSA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub3RlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbm90ZUJ1aWxkZXIuYXBwZW5kKG5vdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub3RlU3RyID0gbm90ZUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHNjYW4gbm90ZVN0ciBjb21wbGV0ZWx5IHR3aWNlLCB3aGljaCBpcyByZWR1bmRhbnQuCi0gICAgICAgICAgICAgICAgLy8gQnV0IGZvciBub3csIHdlIGFzc3VtZSB0aGlzIGlzIG5vdCBzbyB0aW1lLWNvbnN1bWluZy4uCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX05PVEUsIG5vdGVTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbywgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbm90ZVN0ciA9IGNvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoTm90ZS5OT1RFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShub3RlU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRBcHBlbmRDaGFyc2V0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKG5vdGVTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKG5vdGVTdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZExpbmUoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTk9URSwgbm90ZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQXBwZW5kQ2hhcnNldEluZm8sIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRFdmVudHMoZmluYWwgTGlzdDxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAvLyBUaGVyZSdzIHBvc3NpYmlsaXR5IHdoZXJlIGEgZ2l2ZW4gb2JqZWN0IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgYmlydGhkYXksIHdoaWNoCi0gICAgICAgIC8vIGlzIGluYXBwcm9wcmlhdGUuIFdlIGp1c3QgYnVpbGQgb25lIGJpcnRoZGF5LgotICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHByaW1hcnlCaXJ0aGRheSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5QmlydGhkYXkgPSBudWxsOwotICAgICAgICAgICAgZm9yIChmaW5hbCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgOiBjb250ZW50VmFsdWVzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgZXZlbnRUeXBlQXNJbnRlZ2VyID0gY29udGVudFZhbHVlcy5nZXRBc0ludGVnZXIoRXZlbnQuVFlQRSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlQXNJbnRlZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlQXNJbnRlZ2VyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZSA9IEV2ZW50LlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnQuVFlQRV9CSVJUSERBWSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmlydGhkYXlDYW5kaWRhdGUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKEV2ZW50LlNUQVJUX0RBVEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmlydGhkYXlDYW5kaWRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzLmdldEFzSW50ZWdlcihFdmVudC5JU19TVVBFUl9QUklNQVJZKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1N1cGVyUHJpbWFyeSA9IChpc1N1cGVyUHJpbWFyeUFzSW50ZWdlciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNTdXBlclByaW1hcnlBc0ludGVnZXIgPiAwKSA6IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3VwZXJQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAic3VwZXIgcHJpbWFyeSIgYmlydGhkYXkgc2hvdWxkIHRoZSBwcmVmZXJlZCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaXNQcmltYXJ5QXNJbnRlZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMuZ2V0QXNJbnRlZ2VyKEV2ZW50LklTX1BSSU1BUlkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSA9IChpc1ByaW1hcnlBc0ludGVnZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzUHJpbWFyeUFzSW50ZWdlciA+IDApIDogZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBicmVhayBoZXJlIHNpbmNlICJzdXBlciBwcmltYXJ5IiBiaXJ0aGRheSBtYXkgZXhpc3QgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkgPSBiaXJ0aGRheUNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlCaXJ0aGRheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBlbnRyeSBpcyBzZXQgdG8gdGhlICJzZWNvbmRhcnkiIGNhbmRpZGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5ID0gYmlydGhkYXlDYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VzQW5kcm9pZFByb3BlcnR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIG90aGVyIHRoYW4gQmlydGhkYXkgaXMgbm90IHN1cHBvcnRlZCBieSB2Q2FyZC4KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcmltYXJ5QmlydGhkYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QmlydGhkYXkudHJpbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5QmlydGhkYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfQkRBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUJpcnRoZGF5LnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkQnVpbGRlciBhcHBlbmRSZWxhdGlvbihmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgIGlmIChtVXNlc0FuZHJvaWRQcm9wZXJ0eSAmJiBjb250ZW50VmFsdWVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBwZW5kQW5kcm9pZFNwZWNpZmljUHJvcGVydHkoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUsIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbWl0RXZlcnlUaW1lIElmIHRydWUsIGJ1aWxkZXIgYnVpbGRzIHRoZSBsaW5lIGV2ZW4gd2hlbiB0aGVyZSdzIG5vIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFBvc3RhbExpbmUoZmluYWwgaW50IHR5cGUsIGZpbmFsIFN0cmluZyBsYWJlbCwKLSAgICAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcywKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5LCBmaW5hbCBib29sZWFuIGVtaXRFdmVyeVRpbWUpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQ2hhcnNldDsKLSAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NWYWx1ZTsKLSAgICAgICAgewotICAgICAgICAgICAgUG9zdGFsU3RydWN0IHBvc3RhbFN0cnVjdCA9IHRyeUNvbnN0cnVjdFBvc3RhbFN0cnVjdChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgIGlmIChwb3N0YWxTdHJ1Y3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChlbWl0RXZlcnlUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGFyc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NWYWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSA9IHBvc3RhbFN0cnVjdC5yZWFsbHlVc2VRdW90ZWRQcmludGFibGU7Ci0gICAgICAgICAgICAgICAgYXBwZW5kQ2hhcnNldCA9IHBvc3RhbFN0cnVjdC5hcHBlbmRDaGFyc2V0OwotICAgICAgICAgICAgICAgIGFkZHJlc3NWYWx1ZSA9IHBvc3RhbFN0cnVjdC5hZGRyZXNzRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRik7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHN1cmUgd2hldGhlciB0aGUgbGFiZWwgaXMgdmFsaWQgaW4gdGhlIHNwZWMKLSAgICAgICAgICAgICAgICAgICAgLy8gKCJJQU5BLXRva2VuIiBpbiB0aGUgdkNhcmQgMy4wIGlzIHVuY2xlYXIuLi4pCi0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgIGZvciBzYWZldHksIHdlIGFkZCAiWC0iIGF0IHRoZSBiZWdnaW5pbmcgb2YgZWFjaCBsYWJlbC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBjaGVja3MgdGhlIGxhYmVsIG9iZXlzIHdpdGggdkNhcmQgMy4wIHNwZWMuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKCJYLSIgKyBsYWJlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfT1RIRVI6IHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biBTdHJ1Y3R1cmVkUG9zdGFsIHR5cGU6ICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpOwotICAgICAgICBpZiAoIXBhcmFtZXRlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcHBlbmRDaGFyc2V0KSB7Ci0gICAgICAgICAgICAvLyBTdHJpY3RseSwgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IGV4cG9ydGVycyB0byBlbWl0IGNoYXJzZXQgaW5mb3JtYXRpb24sCi0gICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBhZGQgaXQgc2luY2UgdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSB1c2VmdWwgZm9yIGltcG9ydGVycywKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBc3N1bWUgbm8gcGFyc2VyIGRvZXMgbm90IGVtaXQgZXJyb3Igd2l0aCB0aGlzIHBhcmFtZXRlciBpbiB2Q2FyZCAzLjAuCi0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19RUCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGFkZHJlc3NWYWx1ZSk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kRW1haWxMaW5lKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgbGFiZWwsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0eXBlQXNTdHJpbmc7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX0NVU1RPTTogewotICAgICAgICAgICAgICAgIGlmIChWQ2FyZFV0aWxzLmlzTW9iaWxlUGhvbmVMYWJlbChsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DRUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGxhYmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSAiWC0iICsgbGFiZWw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEVtYWlsLlRZUEVfSE9NRTogewotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBFbWFpbC5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgdHlwZUFzU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRW1haWwuVFlQRV9NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICB0eXBlQXNTdHJpbmcgPSBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gRW1haWwgdHlwZTogIiArIHR5cGUpOwotICAgICAgICAgICAgICAgIHR5cGVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodHlwZUFzU3RyaW5nKSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQodHlwZUFzU3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0VNQUlMLCBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgICAgIHJhd1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRUZWxMaW5lKGZpbmFsIEludGVnZXIgdHlwZUFzSW50ZWdlciwgZmluYWwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCk7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotCi0gICAgICAgIGZpbmFsIGludCB0eXBlOwotICAgICAgICBpZiAodHlwZUFzSW50ZWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9PVEhFUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlQXNJbnRlZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9IT01FOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUks6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfRkFYX0hPTUU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0ZBWF9XT1JLOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGRBbGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9GQVgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NT0JJTEU6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1BBR0VSOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgcmVhc29uLCBidXQgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gaGFkCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgIlZPSUNFIiBpbnN0ZWFkIG9mICJQQUdFUiIKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX09USEVSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9WT0lDRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ0FSOiB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9DQVIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0NPTVBBTllfTUFJTjogewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcmVsZXZhbnQgZmllbGQgaW4gdkNhcmQgKGF0IGxlYXN0IDIuMSkuCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKTsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX0lTRE46IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX01BSU46IHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX09USEVSX0ZBWDogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfRkFYKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9URUxFWDogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVExYKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9XT1JLX01PQklMRTogewotICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkssIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1dPUktfUEFHRVI6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspOwotICAgICAgICAgICAgICAgIC8vIFNlZSBhYm92ZS4KLSAgICAgICAgICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhvbmUuVFlQRV9NTVM6IHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX01TRyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBob25lLlRZUEVfQ1VTVE9NOiB7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxhYmVsKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSB0aGUgY3VzdG9tIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfVk9JQ0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRVdGlscy5pc01vYmlsZVBob25lTGFiZWwobGFiZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNWMzBPclY0MCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxhYmVsIGlzIGFwcHJvcHJpYXRlbHkgZW5jb2RlZCBpbiBhcHBlbmRUeXBlUGFyYW1ldGVycy4KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5hZGQobGFiZWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cHBlckxhYmVsID0gbGFiZWwudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkVXRpbHMuaXNWYWxpZEluVjIxQnV0VW5rbm93blRvQ29udGFjdHNQaG90ZVR5cGUodXBwZXJMYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxpc3QuYWRkKHVwcGVyTGFiZWwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFN0cmljdGx5LCB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgIlgtIiBwYXJhbWV0ZXIgd2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIlRZUEU9IiBzdHJpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZCgiWC0iICsgbGFiZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1JBRElPOgotICAgICAgICAgICAgY2FzZSBQaG9uZS5UWVBFX1RUWV9UREQ6Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhcHBlbmRVbmNvbW1vblBob25lVHlwZShtQnVpbGRlciwgdHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVycyhwYXJhbWV0ZXJMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgcGhvbmUgdHlwZSBzdHJpbmcgd2hpY2ggbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gc29tZSBkZXZpY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRVbmNvbW1vblBob25lVHlwZShmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIEludGVnZXIgdHlwZSkgewotICAgICAgICBpZiAobUlzRG9Db01vKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gZm9yIERvQ29NbyBoYWQgYmVlbiBjb25zZXJ2YXRpdmUKLSAgICAgICAgICAgIC8vIGFib3V0IG1pc2NlbGxhbmVvdXMgdHlwZXMuCi0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZPSUNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwaG9uZVR5cGUgPSBWQ2FyZFV0aWxzLmdldFBob25lVHlwZVN0cmluZyh0eXBlKTsKLSAgICAgICAgICAgIGlmIChwaG9uZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIocGhvbmVUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgKGJ5IHZDYXJkKSBQaG9uZSB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5jb2RlZFZhbHVlIE11c3QgYmUgZW5jb2RlZCBieSBCQVNFNjQgCi0gICAgICogQHBhcmFtIHBob3RvVHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFBob3RvTGluZShmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlLCBmaW5hbCBTdHJpbmcgcGhvdG9UeXBlKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdG1wQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1BIT1RPKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgaWYgKG1Jc1YzME9yVjQwKSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfQVNfQik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9FTkNPRElOR19CQVNFNjRfVjIxKTsKLSAgICAgICAgfQotICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKHRtcEJ1aWxkZXIsIHBob3RvVHlwZSk7Ci0gICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKFZDQVJEX0RBVEFfU0VQQVJBVE9SKTsKLSAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgdG1wU3RyID0gdG1wQnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB0bXBTdHIubGVuZ3RoKCk7Ci0gICAgICAgIGZpbmFsIGludCBtYXhOdW1Gb3JGaXJzdExpbmUgPSBWQ2FyZENvbnN0YW50cy5NQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMAotICAgICAgICAgICAgICAgIC0gVkNBUkRfRU5EX09GX0xJTkUubGVuZ3RoKCk7Ci0gICAgICAgIGZpbmFsIGludCBtYXhOdW1JbkdlbmVyYWwgPSBtYXhOdW1Gb3JGaXJzdExpbmUgLSBWQ0FSRF9XUy5sZW5ndGgoKTsKLSAgICAgICAgaW50IG1heE51bSA9IG1heE51bUZvckZpcnN0TGluZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQodG1wU3RyLmNoYXJBdChpKSk7Ci0gICAgICAgICAgICBsaW5lQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPiBtYXhOdW0pIHsKLSAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChWQ0FSRF9FTkRfT0ZfTElORSk7Ci0gICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoVkNBUkRfV1MpOwotICAgICAgICAgICAgICAgIG1heE51bSA9IG1heE51bUluR2VuZXJhbDsKLSAgICAgICAgICAgICAgICBsaW5lQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZCh0bXBCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEFuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlLCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgaWYgKCFzQWxsb3dlZEFuZHJvaWRQcm9wZXJ0eVNldC5jb250YWlucyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTjsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb250ZW50VmFsdWVzLmdldEFzU3RyaW5nKCJkYXRhIiArIGkpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmF3VmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgIChtU2hvdWxkQXBwZW5kQ2hhcnNldFBhcmFtICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYm9vbGVhbiByZWFsbHlVc2VRdW90ZWRQcmludGFibGUgPQotICAgICAgICAgICAgKG1TaG91bGRVc2VRdW90ZWRQcmludGFibGUgJiYKLSAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlTGlzdCkpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9BTkRST0lEX0NVU1RPTSk7Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fRU5DT0RJTkdfUVApOwotICAgICAgICB9Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChtaW1lVHlwZSk7ICAvLyBTaG91bGQgbm90IGJlIGVuY29kZWQuCi0gICAgICAgIGZvciAoU3RyaW5nIHJhd1ZhbHVlIDogcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFZhbHVlOwotICAgICAgICAgICAgaWYgKHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uZSBsaW5lIG1heSBiZSB0b28gaHVnZSwgd2hpY2ggbWF5IGJlIGludmFsaWQgaW4gdkNhcmQgMy4wCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICh3aGljaCBzYXlzICJXaGVuIGdlbmVyYXRpbmcgYSBjb250ZW50IGxpbmUsIGxpbmVzIGxvbmdlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIDc1IGNoYXJhY3RlcnMgU0hPVUxEIGJlIGZvbGRlZCIpLCB0aG91Z2ggc2V2ZXJhbAotICAgICAgICAgICAgICAgIC8vICAgICAgICAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhpcy4KLSAgICAgICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9JVEVNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoZW5jb2RlZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24ocHJvcGVydHlOYW1lLCBudWxsLCByYXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZVdpdGhDaGFyc2V0QW5kUVBEZXRlY3Rpb24oCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcmF3VmFsdWVMaXN0KSB7Ci0gICAgICAgIGFwcGVuZExpbmVXaXRoQ2hhcnNldEFuZFFQRGV0ZWN0aW9uKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWVMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsIGZpbmFsIFN0cmluZyByYXdWYWx1ZSkgewotICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRDaGFyc2V0ID0KLSAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShyYXdWYWx1ZSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgICAgICAobVNob3VsZFVzZVF1b3RlZFByaW50YWJsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKHJhd1ZhbHVlKSk7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCBwYXJhbWV0ZXJMaXN0LAotICAgICAgICAgICAgICAgIHJhd1ZhbHVlLCBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lV2l0aENoYXJzZXRBbmRRUERldGVjdGlvbihmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYm9vbGVhbiBuZWVkQ2hhcnNldCA9Ci0gICAgICAgICAgICAobVNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSAmJgotICAgICAgICAgICAgICAgICAgICAhVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkocmF3VmFsdWVMaXN0KSk7Ci0gICAgICAgIGJvb2xlYW4gcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlID0KLSAgICAgICAgICAgIChtU2hvdWxkVXNlUXVvdGVkUHJpbnRhYmxlICYmCi0gICAgICAgICAgICAgICAgICAgICFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShyYXdWYWx1ZUxpc3QpKTsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIHJhd1ZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBuZWVkQ2hhcnNldCwgcmVhbGx5VXNlUXVvdGVkUHJpbnRhYmxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIG9uZSBsaW5lIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHJhd1ZhbHVlKSB7Ci0gICAgICAgIGFwcGVuZExpbmUocHJvcGVydHlOYW1lLCByYXdWYWx1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHJhd1ZhbHVlTGlzdCwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRMaW5lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWUsIG5lZWRDaGFyc2V0LCByZWFsbHlVc2VRdW90ZWRQcmludGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUpIHsKLSAgICAgICAgYXBwZW5kTGluZShwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckxpc3QsIHJhd1ZhbHVlLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHBhcmFtZXRlckxpc3QsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmF3VmFsdWUsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBib29sZWFuIHJlYWxseVVzZVF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBtQnVpbGRlci5hcHBlbmQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlckxpc3QgIT0gbnVsbCAmJiBwYXJhbWV0ZXJMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRDaGFyc2V0KSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChtVkNhcmRDaGFyc2V0UGFyYW1ldGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkVmFsdWU7Ci0gICAgICAgIGlmIChyZWFsbHlVc2VRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVuY29kZVF1b3RlZFByaW50YWJsZShyYXdWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBvbmUgbGluZSBtYXkgYmUgdG9vIGh1Z2UsIHdoaWNoIG1heSBiZSBpbnZhbGlkIGluIHZDYXJkIHNwZWMsIHRob3VnaAotICAgICAgICAgICAgLy8gICAgICAgc2V2ZXJhbCAoZXZlbiB3ZWxsLWtub3duKSBhcHBsaWNhdGlvbnMgZG8gbm90IGNhcmUgdGhhdCB2aW9sYXRpb24uCi0gICAgICAgICAgICBlbmNvZGVkVmFsdWUgPSBlc2NhcGVDaGFyYWN0ZXJzKHJhd1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChlbmNvZGVkVmFsdWUpOwotICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfRU5EX09GX0xJTkUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZExpbmUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgTGlzdDxTdHJpbmc+IHJhd1ZhbHVlTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsIGJvb2xlYW4gbmVlZFF1b3RlZFByaW50YWJsZSkgewotICAgICAgICBhcHBlbmRMaW5lKHByb3BlcnR5TmFtZSwgbnVsbCwgcmF3VmFsdWVMaXN0LCBuZWVkQ2hhcnNldCwgbmVlZFF1b3RlZFByaW50YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kTGluZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1ldGVyTGlzdCwKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByYXdWYWx1ZUxpc3QsIGZpbmFsIGJvb2xlYW4gbmVlZENoYXJzZXQsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJMaXN0ICE9IG51bGwgJiYgcGFyYW1ldGVyTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfUEFSQU1fU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXJzKHBhcmFtZXRlckxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkQ2hhcnNldCkgewotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQobVZDYXJkQ2hhcnNldFBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRRdW90ZWRQcmludGFibGUpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX0VOQ09ESU5HX1FQKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9EQVRBX1NFUEFSQVRPUik7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyByYXdWYWx1ZSA6IHJhd1ZhbHVlTGlzdCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRWYWx1ZTsKLSAgICAgICAgICAgIGlmIChuZWVkUXVvdGVkUHJpbnRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlID0gZW5jb2RlUXVvdGVkUHJpbnRhYmxlKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogb25lIGxpbmUgbWF5IGJlIHRvbyBodWdlLCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiB2Q2FyZCAzLjAKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgKHdoaWNoIHNheXMgIldoZW4gZ2VuZXJhdGluZyBhIGNvbnRlbnQgbGluZSwgbGluZXMgbG9uZ2VyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgNzUgY2hhcmFjdGVycyBTSE9VTEQgYmUgZm9sZGVkIiksIHRob3VnaCBzZXZlcmFsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIChldmVuIHdlbGwta25vd24pIGFwcGxpY2F0aW9ucyBkbyBub3QgY2FyZSB0aGlzLgotICAgICAgICAgICAgICAgIGVuY29kZWRWYWx1ZSA9IGVzY2FwZUNoYXJhY3RlcnMocmF3VmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVpbGRlci5hcHBlbmQoVkNBUkRfSVRFTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVuY29kZWRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX0VORF9PRl9MSU5FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWQ0FSRF9QQVJBTV9TRVBBUkFUT1IgbXVzdCBiZSBhcHBlbmRlZCBiZWZvcmUgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUeXBlUGFyYW1ldGVycyhmaW5hbCBMaXN0PFN0cmluZz4gdHlwZXMpIHsKLSAgICAgICAgLy8gV2UgbWF5IGhhdmUgdG8gbWFrZSB0aGlzIGNvbW1hIHNlcGFyYXRlZCBmb3JtIGxpa2UgIlRZUEU9RE9NLFdPUksiIGluIHRoZSBmdXR1cmUsCi0gICAgICAgIC8vIHdoaWNoIHdvdWxkIGJlIHJlY29tbWVuZGVkIHdheSBpbiB2Y2FyZCAzLjAgdGhvdWdoIG5vdCB2YWxpZCBpbiB2Q2FyZCAyLjEuCi0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB0eXBlVmFsdWUgOiB0eXBlcykgewotICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWQgPSBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKHR5cGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGVuY29kZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDMuMCBzcGVjaWZpZXMgdGhlIGRpZmZlcmVudCB0eXBlIG9mIGFjY2VwdGFibGUgdHlwZSBTdHJpbmdzLCBidXQKLSAgICAgICAgICAgICAgICAvLyAgICAgICB3ZSBkb24ndCBlbWl0IHRoYXQga2luZCBvZiB2Q2FyZCAzLjAgc3BlY2lmaWMgdHlwZSBzaW5jZSB0aGVyZSBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAvLyAgICAgICBoaWdoIHByb2JhYmlseXR5IGluIHdoaWNoIGV4dGVybmFsIGltcG9ydGVycyBjYW5ub3QgdW5kZXJzdGFuZCB0aGVtLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gZS5nLiBUWVBFPSJcdTU3OEJcdTMwNkJcdTMwODciICh2Q2FyZCAzLjAgYWxsb3dzIG5vbi1Bc2NpaSBjaGFyYWN0ZXJzIGlmIHRoZXkKLSAgICAgICAgICAgICAgICAvLyAgICAgIGFyZSBxdW90ZWQuKQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLmFwcGVuZChWQ0FSRF9QQVJBTV9TRVBBUkFUT1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcHBlbmRUeXBlUGFyYW1ldGVyKGVuY29kZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHZDYXJkIDIuMQotICAgICAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5pc1YyMVdvcmQodHlwZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKFZDQVJEX1BBUkFNX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwcGVuZFR5cGVQYXJhbWV0ZXIodHlwZVZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZDQVJEX1BBUkFNX1NFUEFSQVRPUiBtdXN0IGJlIGFwcGVuZGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgYXBwZW5kVHlwZVBhcmFtZXRlcihtQnVpbGRlciwgdHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyLCBmaW5hbCBTdHJpbmcgdHlwZSkgewotICAgICAgICAvLyBSZWZyYWluIGZyb20gdXNpbmcgYXBwZW5kVHlwZSgpIHNvIHRoYXQgIlRZUEU9IiBpcyBub3QgYmUgYXBwZW5kZWQgd2hlbiB0aGUKLSAgICAgICAgLy8gZGV2aWNlIGlzIERvQ29NbydzIChqdXN0IGZvciBzYWZldHkpLgotICAgICAgICAvLwotICAgICAgICAvLyBOb3RlOiBJbiB2Q2FyZCAzLjAsIFR5cGUgc3RyaW5ncyBhbHNvIGNhbiBiZSBsaWtlIHRoaXM6ICJUWVBFPUhPTUUsUFJFRiIKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgKChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMChtVkNhcmRUeXBlKSB8fCBtQXBwZW5kVHlwZVBhcmFtTmFtZSkgJiYgIW1Jc0RvQ29NbykpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpLmFwcGVuZChWQ0FSRF9QQVJBTV9FUVVBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQodHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BlcnR5IGxpbmUgc2hvdWxkIGNvbnRhaW4gY2hhcnNldCBwYXJhbWV0ZXIKLSAgICAgKiBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgbWF5IHJldHVybiB0cnVlIGV2ZW4gd2hlbiB2Q2FyZCB2ZXJzaW9uIGlzIDMuMC4KLSAgICAgKgotICAgICAqIFN0cmljdGx5LCBhZGRpbmcgY2hhcnNldCBpbmZvcm1hdGlvbiBpcyBpbnZhbGlkIGluIFZDYXJkIDMuMC4KLSAgICAgKiBIb3dldmVyIHdlJ2xsIGFkZCB0aGUgaW5mbyBvbmx5IHdoZW4gY2hhcnNldCB3ZSB1c2UgaXMgbm90IFVURi04Ci0gICAgICogaW4gdkNhcmQgMy4wIGZvcm1hdCwgc2luY2UgcGFyc2VyIHNpZGUgbWF5IGJlIGFibGUgdG8gdXNlIHRoZSBjaGFyc2V0Ci0gICAgICogdmlhIHRoaXMgZmllbGQsIHRob3VnaCB3ZSBtYXkgZW5jb3VudGVyIGFub3RoZXIgcHJvYmxlbSBieSBhZGRpbmcgaXQuCi0gICAgICoKLSAgICAgKiBlLmcuIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMgdXNlIFNoaWZ0X0ppcyB3aGlsZSBSRkMgMjQyNgotICAgICAqIHJlY29tbWVuZHMgVVRGLTguIEJ5IGFkZGluZyB0aGlzIGZpZWxkLCBwYXJzZXJzIG1heSBiZSBhYmxlCi0gICAgICogdG8ga25vdyB0aGlzIHRleHQgaXMgTk9UIFVURi04IGJ1dCBTaGlmdF9KaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbShTdHJpbmcuLi5wcm9wZXJ0eVZhbHVlTGlzdCkgewotICAgICAgICBpZiAoIW1TaG91bGRBcHBlbmRDaGFyc2V0UGFyYW0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eVZhbHVlIDogcHJvcGVydHlWYWx1ZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaShwcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVRdW90ZWRQcmludGFibGUoZmluYWwgU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc3RyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0gICAgICAgIGJ5dGVbXSBzdHJBcnJheSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKG1DaGFyc2V0KTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQ2hhcnNldCAiICsgbUNoYXJzZXQgKyAiIGNhbm5vdCBiZSB1c2VkLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlRyeSBkZWZhdWx0IGNoYXJzZXQiKTsKLSAgICAgICAgICAgIHN0ckFycmF5ID0gc3RyLmdldEJ5dGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGluZGV4IDwgc3RyQXJyYXkubGVuZ3RoKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KCI9JTAyWCIsIHN0ckFycmF5W2luZGV4XSkpOwotICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgIGxpbmVDb3VudCArPSAzOwotCi0gICAgICAgICAgICBpZiAobGluZUNvdW50ID49IDY3KSB7Ci0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhdGlvbiByZXF1aXJlcyBDUkxGIG11c3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgbGluZQotICAgICAgICAgICAgICAgIC8vIGJlY29tZXMgbW9yZSB0aGFuIDc2LgotICAgICAgICAgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIsCi0gICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZWNvbWUKLSAgICAgICAgICAgICAgICAvLyA2IGJ5dGVzLgotICAgICAgICAgICAgICAgIC8vIDc2IC0gNiAtIDMgPSA2NwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI9XHJcbiIpOwotICAgICAgICAgICAgICAgIGxpbmVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCAnXCcgdG8gdGhlIGNoYXJhY3RlcnMgd2hpY2ggc2hvdWxkIGJlIGVzY2FwZWQuIFRoZSBjaGFyYWN0ZXIgc2V0IGlzIGRpZmZlcmVudAotICAgICAqIG5vdCBvbmx5IGJldHdlZW4gdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjAgYnV0IGFsc28gYW1vbmcgZWFjaCBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgUXVvdGVkLVByaW50YWJsZSBzdHJpbmcgbXVzdCBub3QgYmUgaW5wdXQgaGVyZS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZUNoYXJhY3RlcnMoZmluYWwgU3RyaW5nIHVuZXNjYXBlZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodW5lc2NhcGVkKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0bXBCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHVuZXNjYXBlZC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHVuZXNjYXBlZC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnOyc6IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlICdccic6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRDaGFyID0gdW5lc2NhcGVkLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEluIHZDYXJkIDIuMSwgdGhlcmUncyBubyBzcGVjaWZpY2F0aW9uIGFib3V0IHRoaXMsIHdoaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIHZDYXJkIDMuMCBleHBsaWNpdGx5IHJlcXVpcmVzIHRoaXMgc2hvdWxkIGJlIGVuY29kZWQgdG8gIlxuIi4KLSAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWMzBPclY0MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnPic6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXBCdWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgJywnOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNWMzBPclY0MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoIlxcLCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKCFtRW5kQXBwZW5kZWQpIHsKLSAgICAgICAgICAgIGlmIChtSXNEb0NvTW8pIHsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQ0xBU1MsIFZDQVJEX0RBVEFfUFVCTElDKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRMaW5lKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUkVEVUNUSU9OLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX05PLCAiIik7Ci0gICAgICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBwZW5kTGluZShWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTkQsIFZDQVJEX0RBVEFfVkNBUkQpOwotICAgICAgICAgICAgbUVuZEFwcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29tcG9zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzY2YxZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb21wb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eS5OYW1lZENvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRW1haWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FdmVudDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTmlja25hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Ob3RlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuT3JnYW5pemF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG90bzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlJlbGF0aW9uOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0c0VudGl0eTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBmb3IgY29tcG9zaW5nIHZDYXJkIGZyb20gQ29udGFjdHMgaW5mb3JtYXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFVzdWFsbHksIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzLgotICogPC9wPgotICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPlZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPSBudWxsOwotICogdHJ5IHsKLSAqICAgICBjb21wb3NlciA9IG5ldyBWQ2FyZENvbXBvc2VyKGNvbnRleHQpOwotICogICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIoCi0gKiAgICAgICAgICAgICBjb21wb3Nlci5uZXcgSGFuZGxlckZvck91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLSAqICAgICBpZiAoIWNvbXBvc2VyLmluaXQoKSkgewotICogICAgICAgICAvLyBEbyBzb21ldGhpbmcgaGFuZGxpbmcgdGhlIHNpdHVhdGlvbi4KLSAqICAgICAgICAgcmV0dXJuOwotICogICAgIH0KLSAqICAgICB3aGlsZSAoIWNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpIHsKLSAqICAgICAgICAgaWYgKG1DYW5jZWxlZCkgewotICogICAgICAgICAgICAgLy8gQXNzdW1lIGEgdXNlciBtYXkgY2FuY2VsIHRoaXMgb3BlcmF0aW9uIGR1cmluZyB0aGUgZXhwb3J0LgotICogICAgICAgICAgICAgcmV0dXJuOwotICogICAgICAgICB9Ci0gKiAgICAgICAgIGlmICghY29tcG9zZXIuY3JlYXRlT25lRW50cnkoKSkgewotICogICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIGhhbmRsaW5nIHRoZSBlcnJvciBzaXR1YXRpb24uCi0gKiAgICAgICAgICAgICByZXR1cm47Ci0gKiAgICAgICAgIH0KLSAqICAgICB9Ci0gKiB9IGZpbmFsbHkgewotICogICAgIGlmIChjb21wb3NlciAhPSBudWxsKSB7Ci0gKiAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICogICAgIH0KLSAqIH08L3ByZT4KLSAqIDxwPgotICogVXNlcnMgaGF2ZSB0byBtYW51YWxseSB0YWtlIGNhcmUgb2YgbWVtb3J5IGVmZmljaWVuY3kuIEV2ZW4gb25lIHZDYXJkIG1heSBjb250YWluCi0gKiBpbWFnZSBvZiBub24tdHJpdmlhbCBzaXplIGZvciBtb2JpbGUgZGV2aWNlcy4KLSAqIDwvcD4KLSAqIDxwPgotICoge0BsaW5rIFZDYXJkQnVpbGRlcn0gaXMgdXNlZCB0byBidWlsZCBlYWNoIHZDYXJkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb21wb3NlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb21wb3NlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9GQUlMRURfVE9fR0VUX0RBVEFCQVNFX0lORk8gPQotICAgICAgICAiRmFpbGVkIHRvIGdldCBkYXRhYmFzZSBpbmZvcm1hdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFX1JFQVNPTl9OT19FTlRSWSA9Ci0gICAgICAgICJUaGVyZSdzIG5vIGV4cG9ydGFibGUgaW4gdGhlIGRhdGFiYXNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX05PVF9JTklUSUFMSVpFRCA9Ci0gICAgICAgICJUaGUgdkNhcmQgY29tcG9zZXIgb2JqZWN0IGlzIG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQiOwotCi0gICAgLyoqIFNob3VsZCBiZSB2aXNpYmxlIG9ubHkgZnJvbSBkZXZlbG9wZXJzLi4uIChubyBuZWVkIHRvIHRyYW5zbGF0ZSwgaG9wZWZ1bGx5KSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfUkVBU09OX1VOU1VQUE9SVEVEX1VSSSA9Ci0gICAgICAgICJUaGUgVXJpIHZDYXJkIGNvbXBvc2VyIHJlY2VpdmVkIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvc2VyLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19FUlJPUiA9ICJObyBlcnJvciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1NUUklOR19ET0NPTU8gPSAiZG9jb21vIjsKLQotICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCAiU2hpZnRfSklTIiBpcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSwgYnV0IHdlIHVzZSB1cHBlciB2ZXJzaW9uIGhlcmUsCi0gICAgLy8gc2luY2UgdXN1YWwgdkNhcmQgZGV2aWNlcyBmb3IgSmFwYW5lc2UgZGV2aWNlcyBhbHJlYWR5IHVzZSBpdC4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hJRlRfSklTID0gIlNISUZUX0pJUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotICAgIC8qKgotICAgICAqIFNwZWNpYWwgVVJJIGZvciB0ZXN0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RFU1RfQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLnVuaXRfdGVzdHMudmNhcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFZDQVJEX1RFU1RfQVVUSE9SSVRZX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBWQ0FSRF9URVNUX0FVVEhPUklUWSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEFDVFNfVEVTVF9DT05URU5UX1VSSSA9Ci0gICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKFZDQVJEX1RFU1RfQVVUSE9SSVRZX1VSSSwgImNvbnRhY3RzIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBzSW1NYXA7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzSW1NYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfQUlNLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfTVNOLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTik7Ci0gICAgICAgIHNJbU1hcC5wdXQoSW0uUFJPVE9DT0xfWUFIT08sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08pOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX0lDUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EpOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX0pBQkJFUiwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIpOwotICAgICAgICBzSW1NYXAucHV0KEltLlBST1RPQ09MX1NLWVBFLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FKTsKLSAgICAgICAgLy8gV2UgZG9uJ3QgYWRkIEdvb2dsZSB0YWxrIGhlcmUgc2luY2UgaXQgaGFzIHRvIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBPbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkluaXQoQ29udGV4dCBjb250ZXh0KTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiB1c2VmdWwgaGFuZGxlciBmb3IgZW1pdHRpbmcgdkNhcmQgU3RyaW5nIHRvIGFuIE91dHB1dFN0cmVhbSBvYmplY3Qgb25lIGJ5IG9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhlIGlucHV0IE91dHB1dFN0cmVhbSBvYmplY3QgaXMgY2xvc2VkKCkgb24ge0BsaW5rICNvblRlcm1pbmF0ZSgpfS4KLSAgICAgKiBNdXN0IG5vdCBjbG9zZSB0aGUgc3RyZWFtIG91dHNpZGUgdGhpcyBjbGFzcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGNsYXNzIEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBPbmVFbnRyeUhhbmRsZXIgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRDb21wb3Nlci5IYW5kbGVyRm9yT3V0cHV0U3RyZWFtIjsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU9uVGVybWluYXRlSXNDYWxsZWQgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBtT3V0cHV0U3RyZWFtOyAvLyBtV3JpdGVyIHdpbGwgY2xvc2UgdGhpcy4KLSAgICAgICAgcHJpdmF0ZSBXcml0ZXIgbVdyaXRlcjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSW5wdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIG9uIHRoZSBkZXRydWN0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEhhbmRsZXJGb3JPdXRwdXRTdHJlYW0oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgbU91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbSwgbUNoYXJzZXQpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5zdXBwb3J0ZWQgY2hhcnNldDogIiArIG1DaGFyc2V0KTsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiRW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZCAodXN1YWxseSB0aGlzIGRvZXMgbm90IGhhcHBlbiEpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1DaGFyc2V0OwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBvbmUgZW1wdHkgZW50cnkuCi0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIud3JpdGUoY3JlYXRlT25lRW50cnlJbnRlcm5hbCgiLTEiLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVkNhcmRFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duIGR1cmluZyBvbiBJbml0KCk6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4cG9ydE9uZUNvbnRhY3REYXRhOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gIklPRXhjZXB0aW9uIG9jY3VycmVkOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtV3JpdGVyLndyaXRlKHZjYXJkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBleHBvcnRPbmVDb250YWN0RGF0YTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBtRXJyb3JSZWFzb24gPSAiSU9FeGNlcHRpb24gb2NjdXJyZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGVybWluYXRlKCkgewotICAgICAgICAgICAgbU9uVGVybWluYXRlSXNDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Xcml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGFuZCBzeW5jIHRoZSBkYXRhIHNvIHRoYXQgYSB1c2VyIGlzIGFibGUgdG8gcHVsbAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU0RDYXJkIGp1c3QgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4cG9ydC4KLSAgICAgICAgICAgICAgICAgICAgbVdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dFN0cmVhbSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU91dHB1dFN0cmVhbSBpbnN0YW5jZW9mIEZpbGVPdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZpbGVPdXRwdXRTdHJlYW0pIG1PdXRwdXRTdHJlYW0pLmdldEZEKCkuc3luYygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJT0V4Y2VwdGlvbiBkdXJpbmcgY2xvc2luZyB0aGUgb3V0cHV0IHN0cmVhbTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZU91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJT0V4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGNsb3NlKCkuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICAgICAgaWYgKCFtT25UZXJtaW5hdGVJc0NhbGxlZCkgewotICAgICAgICAgICAgICAgIG9uVGVybWluYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUNhcmVIYW5kbGVyRXJyb3JzOwotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzRG9Db01vOwotICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbUlkQ29sdW1uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNoYXJzZXQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UZXJtaW5hdGVJc0NhbGxlZDsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25lRW50cnlIYW5kbGVyPiBtSGFuZGxlckxpc3Q7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtRXJyb3JSZWFzb24gPSBOT19FUlJPUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNDb250YWN0c1Byb2plY3Rpb24gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBDb250YWN0cy5fSUQsCi0gICAgfTsKLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfREVGQVVMVCwgbnVsbCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhcmlhbnQgd2hpY2ggc2V0cyBjaGFyc2V0IHRvIG51bGwgYW5kIHNldHMgY2FyZUhhbmRsZXJFcnJvcnMgdG8gdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihDb250ZXh0IGNvbnRleHQsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKENvbnRleHQgY29udGV4dCwgaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIGNoYXJzZXQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YXJpYW50IHdoaWNoIHNldHMgY2hhcnNldCB0byBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBWQ2FyZENvbXBvc2VyKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FyZUhhbmRsZXJFcnJvcnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCB2Y2FyZFR5cGUsIG51bGwsIGNhcmVIYW5kbGVyRXJyb3JzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgZm9yIHN1cHBvcnRpbmcgY2FsbCBsb2cgZW50cnkgdkNhcmQgY29tcG9zaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSB1c2VkIGR1cmluZyB0aGUgY29tcG9zaXRpb24uCi0gICAgICogQHBhcmFtIHZjYXJkVHlwZSBUaGUgdHlwZSBvZiB2Q2FyZCwgdHlwaWNhbGx5IGF2YWlsYWJsZSB2aWEge0BsaW5rIFZDYXJkQ29uZmlnfS4KLSAgICAgKiBAcGFyYW0gY2hhcnNldCBUaGUgY2hhcnNldCB0byBiZSB1c2VkLiBVc2UgbnVsbCB3aGVuIHlvdSBkb24ndCBuZWVkIHRoZSBjaGFyc2V0LgotICAgICAqIEBwYXJhbSBjYXJlSGFuZGxlckVycm9ycyBJZiB0cnVlLCBUaGlzIG9iamVjdCByZXR1cm5zIGZhbHNlIGV2ZXJ5dGltZQotICAgICAqIGEgSGFuZGxlciBvYmplY3QgZ2l2ZW4gdmlhIHt7QGxpbmsgI2FkZEhhbmRsZXIoT25lRW50cnlIYW5kbGVyKX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiBJZiBmYWxzZSwgdGhpcyBpZ25vcmVzIHRob3NlIGVycm9ycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRDb21wb3NlcihmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0LAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1DYXJlSGFuZGxlckVycm9ycyA9IGNhcmVIYW5kbGVyRXJyb3JzOwotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLQotICAgICAgICBtSXNEb0NvTW8gPSBWQ2FyZENvbmZpZy5pc0RvQ29Nbyh2Y2FyZFR5cGUpOwotICAgICAgICBtSGFuZGxlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE9uZUVudHJ5SGFuZGxlcj4oKTsKLQotICAgICAgICBjaGFyc2V0ID0gKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpID8gVkNhcmRDb25maWcuREVGQVVMVF9FWFBPUlRfQ0hBUlNFVCA6IGNoYXJzZXQpOwotICAgICAgICBmaW5hbCBib29sZWFuIHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSA9ICEoCi0gICAgICAgICAgICAgICAgVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSAmJiBVVEZfOC5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKTsKLQotICAgICAgICBpZiAobUlzRG9Db01vIHx8IHNob3VsZEFwcGVuZENoYXJzZXRQYXJhbSkgewotICAgICAgICAgICAgaWYgKFNISUZUX0pJUy5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUywgImRvY29tbyIpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb0NvTW8tc3BlY2lmaWMgU0hJRlRfSklTIHdhcyBub3QgZm91bmQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlIFNISUZUX0pJUyBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKFNISUZUX0pJUykubmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmVlci1zcGVjaWZpYyBTSElGVF9KSVMgd2FzIG5vdCBmb3VuZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgU0hJRlRfSklTIGFzIGlzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNISUZUX0pJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGNoYXJzZXQgXCIiICsgY2hhcnNldCArICJcIiBpcyB1c2VkIHdoaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgU0hJRlRfSklTICsgIiBpcyBuZWVkZWQgdG8gYmUgdXNlZC4iKTsKLSAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2hhcnNldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBTSElGVF9KSVM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbHMuY2hhcnNldEZvclZlbmRvcihjaGFyc2V0KS5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZWVyLXNwZWNpZmljIFwiIiArIGNoYXJzZXQgKyAiXCIgd2FzIG5vdCBmb3VuZCAoYXMgdXN1YWwpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBpdCBhcyBpcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2hhcnNldCA9IGNoYXJzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGNoYXJzZXQpKSB7Ci0gICAgICAgICAgICAgICAgbUNoYXJzZXQgPSBVVEZfODsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXRVdGlscy5jaGFyc2V0Rm9yVmVuZG9yKGNoYXJzZXQpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXJlZXItc3BlY2lmaWMgXCIiICsgY2hhcnNldCArICJcIiB3YXMgbm90IGZvdW5kIChhcyB1c3VhbCkuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgaXQgYXMgaXMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DaGFyc2V0ID0gY2hhcnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvZy5kKExPR19UQUcsICJVc2UgdGhlIGNoYXJzZXQgXCIiICsgbUNoYXJzZXQgKyAiXCIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUge0BsaW5rICNpbml0KCl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEhhbmRsZXIoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhbmRsZXJMaXN0LmFkZChoYW5kbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgc3VjY2Vzc2Z1bCBhbmQgYWxsIHRoZSBvdGhlcgotICAgICAqICAgICAgICAgIG1ldGhvZHMgYXJlIGF2YWlsYWJsZS4gUmV0dXJucyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdCgpIHsKLSAgICAgICAgcmV0dXJuIGluaXQobnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdChmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLCBmaW5hbCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKSB7Ci0gICAgICAgIHJldHVybiBpbml0KENvbnRhY3RzLkNPTlRFTlRfVVJJLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHVuc3RhYmxlIGludGVyZmFjZSwgbWF5IGJlIGRlbGV0ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0KGZpbmFsIFVyaSBjb250ZW50VXJpLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgZmluYWwgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNhcmVIYW5kbGVyRXJyb3JzKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PE9uZUVudHJ5SGFuZGxlcj4gZmluaXNoZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxPbmVFbnRyeUhhbmRsZXI+KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlckxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoT25lRW50cnlIYW5kbGVyIGhhbmRsZXIgOiBtSGFuZGxlckxpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXIub25Jbml0KG1Db250ZXh0KSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBmaW5pc2hlZCA6IGZpbmlzaGVkTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQub25UZXJtaW5hdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGZhbHNlIHJldHVybmVkIGZyb20gb25Jbml0KCkuCi0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5vbkluaXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gcHJvamVjdGlvbjsKLSAgICAgICAgaWYgKENvbnRhY3RzLkNPTlRFTlRfVVJJLmVxdWFscyhjb250ZW50VXJpKSB8fAotICAgICAgICAgICAgICAgIENPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkuZXF1YWxzKGNvbnRlbnRVcmkpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0aW9uID0gc0NvbnRhY3RzUHJvamVjdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FcnJvclJlYXNvbiA9IEZBSUxVUkVfUkVBU09OX1VOU1VQUE9SVEVEX1VSSTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtQ3Vyc29yID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeSgKLSAgICAgICAgICAgICAgICBjb250ZW50VXJpLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlcik7Ci0KLSAgICAgICAgaWYgKG1DdXJzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fRkFJTEVEX1RPX0dFVF9EQVRBQkFTRV9JTkZPOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldENvdW50KCkgPT0gMCB8fCAhbUN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNRTGl0ZUV4Y2VwdGlvbiBvbiBDdXJzb3IjY2xvc2UoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUVycm9yUmVhc29uID0gRkFJTFVSRV9SRUFTT05fTk9fRU5UUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWRDb2x1bW4gPSBtQ3Vyc29yLmdldENvbHVtbkluZGV4KENvbnRhY3RzLl9JRCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY3JlYXRlT25lRW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVPbmVFbnRyeShudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ2V0RW50aXR5SXRlcmF0b3JNZXRob2QgRm9yIERlcGVuZGVuY3kgSW5qZWN0aW9uLgotICAgICAqIEBoaWRlIGp1c3QgZm9yIHRlc3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY3JlYXRlT25lRW50cnkoTWV0aG9kIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwgfHwgbUN1cnNvci5pc0FmdGVyTGFzdCgpKSB7Ci0gICAgICAgICAgICBtRXJyb3JSZWFzb24gPSBGQUlMVVJFX1JFQVNPTl9OT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHZjYXJkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1JZENvbHVtbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdmNhcmQgPSBjcmVhdGVPbmVFbnRyeUludGVybmFsKG1DdXJzb3IuZ2V0U3RyaW5nKG1JZENvbHVtbiksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbmNvcnJlY3QgbUlkQ29sdW1uOiAiICsgbUlkQ29sdW1uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlZDYXJkRXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlcnJvcikgewotICAgICAgICAgICAgLy8gTWF5YmUgc29tZSBkYXRhIChlLmcuIHBob3RvKSBpcyB0b28gYmlnIHRvIGhhdmUgaW4gbWVtb3J5LiBCdXQgaXQKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSByYXJlLgotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIk91dE9mTWVtb3J5RXJyb3Igb2NjdXJlZC4gSWdub3JlIHRoZSBlbnRyeS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHRlbGwgdXNlcnMgd2hhdCBoYXBwZW5lZD8KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbUN1cnNvci5tb3ZlVG9OZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNhcmUgdGhlIE91dE9mTWVtb3J5RXJyb3Igb24gdGhlIGhhbmRsZXIgc2lkZSA6LVAKLSAgICAgICAgaWYgKG1DYXJlSGFuZGxlckVycm9ycykgewotICAgICAgICAgICAgTGlzdDxPbmVFbnRyeUhhbmRsZXI+IGZpbmlzaGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8T25lRW50cnlIYW5kbGVyPigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXJMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLm9uRW50cnlDcmVhdGVkKHZjYXJkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChPbmVFbnRyeUhhbmRsZXIgaGFuZGxlciA6IG1IYW5kbGVyTGlzdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZXIub25FbnRyeUNyZWF0ZWQodmNhcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlT25lRW50cnlJbnRlcm5hbChmaW5hbCBTdHJpbmcgY29udGFjdElkLAotICAgICAgICAgICAgZmluYWwgTWV0aG9kIGdldEVudGl0eUl0ZXJhdG9yTWV0aG9kKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PENvbnRlbnRWYWx1ZXM+PiBjb250ZW50VmFsdWVzTGlzdE1hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PENvbnRlbnRWYWx1ZXM+PigpOwotICAgICAgICAvLyBUaGUgcmVzb2x2ZXIgbWF5IHJldHVybiB0aGUgZW50aXR5IGl0ZXJhdG9yIHdpdGggbm8gZGF0YS4gSXQgaXMgcG9zc2libGUuCi0gICAgICAgIC8vIGUuZy4gSWYgYWxsIHRoZSBkYXRhIGluIHRoZSBjb250YWN0IG9mIHRoZSBnaXZlbiBjb250YWN0IGlkIGFyZSBub3QgZXhwb3J0YWJsZSBvbmVzLAotICAgICAgICAvLyAgICAgIHRoZXkgYXJlIGhpZGRlbiBmcm9tIHRoZSB2aWV3IG9mIHRoaXMgbWV0aG9kLCB0aG91Z2ggY29udGFjdCBpZCBpdHNlbGYgZXhpc3RzLgotICAgICAgICBFbnRpdHlJdGVyYXRvciBlbnRpdHlJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gUmF3Q29udGFjdHNFbnRpdHkuQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCkKLSAgICAgICAgICAgICAgICAgICAgLy8gLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJmb3JfZXhwb3J0X29ubHkiLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcihEYXRhLkZPUl9FWFBPUlRfT05MWSwgIjEiKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3Rpb24gPSBEYXRhLkNPTlRBQ1RfSUQgKyAiPT8iOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7Y29udGFjdElkfTsKLSAgICAgICAgICAgIGlmIChnZXRFbnRpdHlJdGVyYXRvck1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGJyYW5jaCBpcyBleGVjdXRlZCBieSB1bml0IHRlc3RzIG9ubHkKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlbnRpdHlJdGVyYXRvciA9IChFbnRpdHlJdGVyYXRvcilnZXRFbnRpdHlJdGVyYXRvck1ldGhvZC5pbnZva2UobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLCB1cmksIHNlbGVjdGlvbiwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGhhcyBiZWVuIHRocm93bjogIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZUVsZW1lbnRzID0gZS5nZXRDYXVzZSgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogc3RhY2tUcmFjZUVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiICAgIGF0ICIgKyBlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IgPSBSYXdDb250YWN0cy5uZXdFbnRpdHlJdGVyYXRvcihtQ29udGVudFJlc29sdmVyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgdXJpLCBudWxsLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVudGl0eUl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRW50aXR5SXRlcmF0b3IgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRGF0YSBkb2VzIG5vdCBleGlzdC4gY29udGFjdElkOiAiICsgY29udGFjdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChlbnRpdHlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gZW50aXR5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoTmFtZWRDb250ZW50VmFsdWVzIG5hbWVkQ29udGVudFZhbHVlcyA6IGVudGl0eS5nZXRTdWJWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuYW1lZENvbnRlbnRWYWx1ZXMudmFsdWVzOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gY29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbnRlbnRWYWx1ZXM+IGNvbnRlbnRWYWx1ZXNMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlc0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0TWFwLnB1dChrZXksIGNvbnRlbnRWYWx1ZXNMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNMaXN0LmFkZChjb250ZW50VmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChlbnRpdHlJdGVyYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50aXR5SXRlcmF0b3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZFZDYXJkKGNvbnRlbnRWYWx1ZXNMaXN0TWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdkNhcmQgdXNpbmcgZ2l2ZW4gbWFwLCB3aG9zZSBrZXkgaXMgQ09OVEVOVF9JVEVNX1RZUEUgZGVmaW5lZCBpbgotICAgICAqIHtDb250YWN0c0NvbnRyYWN0fS4gRGV2ZWxvcGVycyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBvdXRwdXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBidWlsZFZDYXJkKGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8Q29udGVudFZhbHVlcz4+IGNvbnRlbnRWYWx1ZXNMaXN0TWFwKSB7Ci0gICAgICAgIGlmIChjb250ZW50VmFsdWVzTGlzdE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVGhlIGdpdmVuIG1hcCBpcyBudWxsLiBJZ25vcmUgYW5kIHJldHVybiBlbXB0eSBTdHJpbmciKTsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkQnVpbGRlciBidWlsZGVyID0gbmV3IFZDYXJkQnVpbGRlcihtVkNhcmRUeXBlLCBtQ2hhcnNldCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZE5hbWVQcm9wZXJ0aWVzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmROaWNrTmFtZXMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFBob25lcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kRW1haWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRQb3N0YWxzKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZE9yZ2FuaXphdGlvbnMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRXZWJzaXRlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkpOwotICAgICAgICAgICAgaWYgKChtVkNhcmRUeXBlICYgVkNhcmRDb25maWcuRkxBR19SRUZSQUlOX0lNQUdFX0VYUE9SVCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kUGhvdG9zKGNvbnRlbnRWYWx1ZXNMaXN0TWFwLmdldChQaG90by5DT05URU5UX0lURU1fVFlQRSkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmROb3Rlcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoTm90ZS5DT05URU5UX0lURU1fVFlQRSkpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmRFdmVudHMoY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKSkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZEltcyhjb250ZW50VmFsdWVzTGlzdE1hcC5nZXQoSW0uQ09OVEVOVF9JVEVNX1RZUEUpKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kUmVsYXRpb24oY29udGVudFZhbHVlc0xpc3RNYXAuZ2V0KFJlbGF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBmb3IgKE9uZUVudHJ5SGFuZGxlciBoYW5kbGVyIDogbUhhbmRsZXJMaXN0KSB7Ci0gICAgICAgICAgICBoYW5kbGVyLm9uVGVybWluYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNRTGl0ZUV4Y2VwdGlvbiBvbiBDdXJzb3IjY2xvc2UoKTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlcm1pbmF0ZUlzQ2FsbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKCFtVGVybWluYXRlSXNDYWxsZWQpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJ0ZXJtaW5hdGUoKSBpcyBub3QgY2FsbGVkIHlldC4gV2UgY2FsbCBpdCBpbiBmaW5hbGl6ZSgpIHN0ZXAuIik7Ci0gICAgICAgICAgICB0ZXJtaW5hdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBlbnRpdGllcy4gVGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQKLSAgICAgKiB3aGVuIHRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQgKHR5cGljYWxseSB3aGVuIHt7QGxpbmsgI2luaXQoKX0gaXMgbm90IGNhbGxlZAotICAgICAqIG9yIHdoZW4ge0BsaW5rICN0ZXJtaW5hdGUoKX0gaXMgYWxyZWFkeSBjYWxsZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUaGlzIG9iamVjdCBpcyBub3QgcmVhZHkgeWV0LiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiB0aGVyZSdzIG5vIGVudGl0eSB0byBiZSBidWlsdC4gVGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQKLSAgICAgKiB3aGVuIHRoaXMgb2JqZWN0IGlzIG5vdCByZWFkeSB5ZXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZnRlckxhc3QoKSB7Ci0gICAgICAgIGlmIChtQ3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUaGlzIG9iamVjdCBpcyBub3QgcmVhZHkgeWV0LiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3Vyc29yLmlzQWZ0ZXJMYXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlcnJvciByZWFzb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvclJlYXNvbigpIHsKLSAgICAgICAgcmV0dXJuIG1FcnJvclJlYXNvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRDb25maWcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTc1OWUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50aW5nIFZDYXJkIHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIFVzZWZ1bCBzdGF0aWMgbWV0aG9kcyBhcmUgbm90IGluIHRoaXMgY2xhc3MKLSAqIGJ1dCBpbiBWQ2FyZFV0aWxzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25maWcgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkQ29uZmlnIjsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBMT0dfTEVWRUxfTk9ORSA9IDA7Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTF9QRVJGT1JNQU5DRV9NRUFTVVJFTUVOVCA9IDB4MTsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1NIT1dfV0FSTklORyA9IDB4MjsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTE9HX0xFVkVMX1ZFUkJPU0UgPQotICAgICAgICBMT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQgfCBMT0dfTEVWRUxfU0hPV19XQVJOSU5HOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IExPR19MRVZFTCA9IExPR19MRVZFTF9OT05FOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNoYXJzZXQgdXNlZCBkdXJpbmcgaW1wb3J0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBjYW5ub3QgZGV0ZXJtaW5lIHdoaWNoIGNoYXJzZXQgc2hvdWxkIGJlIHVzZWQgdG8gaW50ZXJwcmV0IGxpbmVzIGluIHZDYXJkLAotICAgICAqIHdoaWxlIEphdmEgcmVxdWlyZXMgdXMgdG8gc3BlY2lmeSBpdCB3aGVuIElucHV0U3RyZWFtIGlzIHVzZWQuCi0gICAgICogV2UgbmVlZCB0byByZWx5IG9uIHRoZSBtZWNoYW5pc20gZHVlIHRvIHNvbWUgcGVyZm9ybWFuY2UgcmVhc29uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBvcmRlciB0byBhdm9pZCAibWlzaW50ZXJwcmV0YXRpb24iIG9mIGNoYXJzZXQgYW5kIGxvc2UgYW55IGRhdGEgaW4gdkNhcmQsCi0gICAgICogIklTTy04ODU5LTEiIGlzIGZpcnN0IHVzZWQgZm9yIHJlYWRpbmcgdGhlIHN0cmVhbS4KLSAgICAgKiBXaGVuIGEgY2hhcnNldCBpcyBzcGVjaWZpZWQgaW4gYSBwcm9wZXJ0eSAod2l0aCAiQ0hBUlNFVD0uLi4iIHBhcmFtZXRlciksCi0gICAgICogdGhlIHN0cmluZyBpcyBkZWNvZGVkIHRvIHJhdyBieXRlcyBhbmQgZW5jb2RlZCBpbnRvIHRoZSBzcGVjaWZpYyBjaGFyc2V0LAotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBVbmljb2RlIHNwZWNpZmljYXRpb24gdGhlcmUncyBhIG9uZSB0byBvbmUgbWFwcGluZyBiZXR3ZWVuIGVhY2ggYnl0ZSBpbiBJU08tODg1OS0xCi0gICAgICogYW5kIGEgY29kZXBvaW50LCBhbmQgSmF2YSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHJ1bnRpbWUgbXVzdCBoYXZlIHRoZSBjaGFyc2V0LgotICAgICAqIFRodXMsIElTTy04ODU5LTEgaXMgb25lIGVmZmVjdGl2ZSBtYXBwaW5nIGZvciBpbnRlcm1lZGlhdGUgbWFwcGluZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlRFUk1FRElBVEVfQ0hBUlNFVCA9ICJJU08tODg1OS0xIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzZWQgd2hlbiB0aGVyZSdzIG5vIGluZm9ybWF0aW9uIGFmZmJvdXQgd2hhdCBjaGFyc2V0IHNob3VsZCBiZSB1c2VkIHRvCi0gICAgICogZW5jb2RlIHRoZSBiaW5hcnkgZ2l2ZW4gZnJvbSB2Q2FyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNUE9SVF9DSEFSU0VUID0gIlVURi04IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYUE9SVF9DSEFSU0VUID0gIlVURi04IjsKLQotICAgIC8qKgotICAgICAqIERvIG5vdCB1c2Ugc3RhdGljYWxseSBsaWtlICJ2ZXJzaW9uID09IFZFUlNJT05fVjIxIgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMjEgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMzAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fNDAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX09SREVSX0RFRkFVTFQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfRVVST1BFID0gMHg0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfSkFQQU5FU0UgPSAweDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTUVfT1JERVJfTUFTSyA9IDB4QzsKLQotICAgIC8vIDB4MTAgaXMgcmVzZXJ2ZWQgZm9yIHNhZmV0eQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGZsYWcgaW5kaWNhdGluZyB0aGUgdkNhcmQgY29tcG9zZXIgd2lsbCBhZGQgc29tZSAiWC0iIHByb3BlcnRpZXMgdXNlZCBvbmx5IGluIEFuZHJvaWQKLSAgICAgKiB3aGVuIHRoZSBmb3JtYWwgdkNhcmQgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIGZpZWxkcyBmb3IgdGhhdCBkYXRhLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBGb3IgZXhhbXBsZSwgQW5kcm9pZCBhY2NlcHRzIG5pY2tuYW1lIGluZm9ybWF0aW9uIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBvbiwgdkNhcmQgY29tcG9zZXIgZW1pdHMgYWx0ZXJuYXRpdmUgIlgtIiBwcm9wZXJ0eSAobGlrZSAiWC1OSUNLTkFNRSIpCi0gICAgICogaW5zdGVhZCBvZiBqdXN0IGRyb3BwaW5nIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiB2Q2FyZCBwYXJzZXIgY29kZSBhdXRvbWF0aWNhbGx5IHBhcnNlcyB0aGUgZmllbGQgZW1pdHRlZCBldmVuIHdoZW4gdGhpcyBmbGFnIGlzIG9mZi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkgPSAweDgwMDAwMDAwOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyIHdpbGwgYWRkIHNvbWUgIlgtIiBwcm9wZXJ0aWVzIHNlZW4gaW4gdGhlCi0gICAgICogdkNhcmQgZGF0YSBlbWl0dGVkIGJ5IHRoZSBvdGhlciBzb2Z0d2FyZXMvZGV2aWNlcyB3aGVuIHRoZSBmb3JtYWwgdkNhcmQgc3BlY2lmaWNhdGlvbgotICAgICAqIGRvZXMgbm90IGhhdmUgYXBwcm9wcmlhdGUgZmllbGQocykgZm9yIHRoYXQgZGF0YS4KLSAgICAgKiA8L3A+IAotICAgICAqIDxwPgotICAgICAqIE9uZSBleGFtcGxlIGlzIFgtUEhPTkVUSUMtRklSU1QtTkFNRS9YLVBIT05FVElDLU1JRERMRS1OQU1FL1gtUEhPTkVUSUMtTEFTVC1OQU1FLCB3aGljaCBhcmUKLSAgICAgKiBmb3IgcGhvbmV0aWMgbmFtZSAoaG93IHRoZSBuYW1lIGlzIHByb25vdW5jZWQpLCBzZWVuIGluIHRoZSB2Q2FyZCBlbWl0dGVkIGJ5IHNvbWUgb3RoZXIKLSAgICAgKiBub24tQW5kcm9pZCBkZXZpY2VzL3NvZnR3YXJlcy4gV2UgY2hvc2UgdG8gZW5hYmxlIHRoZSB2Q2FyZCBjb21wb3NlciB0byB1c2UgdGhvc2UKLSAgICAgKiBkZWZhY3QgcHJvcGVydGllcyBzaW5jZSB0aGV5IGFyZSBhbHNvIHVzZWZ1bCBmb3IgQW5kcm9pZCBkZXZpY2VzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIGZvciBkZXZlbG9wZXJzOiBvbmx5ICJYLSIgcHJvcGVydGllcyBzaG91bGQgYmUgYWRkZWQgd2l0aCB0aGlzIGZsYWcuIHZDYXJkIDIuMS8zLjAKLSAgICAgKiBhbGxvd3MgYW55IGtpbmQgb2YgIlgtIiBwcm9wZXJ0aWVzIGJ1dCBkb2VzIG5vdCBhbGxvdyBub24tIlgtIiBwcm9wZXJ0aWVzIChleGNlcHQgSUFOQSB0b2tlbnMKLSAgICAgKiBpbiB2Q2FyZCAzLjApLiBTb21lIGV4dGVybmFsIHBhcnNlcnMgbWF5IGdldCBjb25mdXNlZCB3aXRoIG5vbi12YWxpZCwgbm9uLSJYLSIgcHJvcGVydGllcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSA9IDB4NDAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHNvbWUgc3BlY2lmaWMgZGlhbGVjdCBzZWVuIGluIHZDYXJkIG9mIERvQ29NbyAob25lIG9mIEphcGFuZXNlCi0gICAgICogbW9iaWxlIGNhcmVlcnMpIHNob3VsZCBiZSB1c2VkLiBUaGlzIGZsYWcgZG9lcyBub3QgaW5jbHVkZSBhbnkgb3RoZXIgaW5mb3JtYXRpb24gbGlrZQotICAgICAqIHRoYXQgInRoZSB2Q2FyZCBpcyBmb3IgSmFwYW5lc2UiLiBTbyBpdCBpcyAicG9zc2libGUiIHRoYXQgInRoZSB2Q2FyZCBzaG91bGQgaGF2ZSBEb0NvTW8ncwotICAgICAqIGRpYWxlY3QgYnV0IHRoZSBuYW1lIG9yZGVyIHNob3VsZCBiZSBFdXJvcGVhbiIsIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPQ09NTyA9IDB4MjAwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciBkb2VzICJOT1QiIHVzZSBRdW90ZWQtUHJpbnRhYmxlIHRvd2FyZCAicHJpbWFyeSIKLSAgICAgKiBwcm9wZXJ0aWVzIGV2ZW4gdGhvdWdoIGl0IGlzIHJlcXVpcmVkIGJ5IHZDYXJkIDIuMSAoUVAgaXMgcHJvaGliaXRlZCBpbiB2Q2FyZCAzLjApLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBXZSBhY3R1YWxseSBjYW5ub3QgZGVmaW5lIHdoYXQgaXMgdGhlICJwcmltYXJ5IiBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoaXMgaXMgTk9UIGRlZmluZWQKLSAgICAgKiBpbiB2Q2FyZCBzcGVjaWZpY2F0aW9uIGVpdGhlci4gQWxzbyBiZSBhd2FyZSB0aGF0IGl0IGlzIE5PVCByZWxhdGVkIHRvICJwcmltYXJ5IiBub3Rpb24KLSAgICAgKiB1c2VkIGluIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3R9LgotICAgICAqIFRoaXMgbm90aW9uIGlzIGp1c3QgZm9yIHZDYXJkIGNvbXBvc2l0aW9uIGluIEFuZHJvaWQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIGFkZGVkIHRoaXMgQW5kcm9pZC1zcGVjaWZpYyBub3Rpb24gc2luY2Ugc29tZSAoaW5jb21wbGV0ZSkgdkNhcmQgZXhwb3J0ZXJzIGZvciB2Q2FyZCAyLjEKLSAgICAgKiBkbyBOT1QgdXNlIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmcgdG93YXJkIHNvbWUgcHJvcGVydGllcyByZWxhdGVkIG5hbWVzIGxpa2UgIk4iLCAiRk4iLCBldGMuCi0gICAgICogZXZlbiB3aGVuIHRoZWlyIHZhbHVlcyBjb250YWluIG5vbi1hc2NpaSBvci9hbmQgQ1IvTEYsIHdoaWxlIHRoZXkgdXNlIHRoZSBlbmNvZGluZyBpbiB0aGUKLSAgICAgKiBvdGhlciBwcm9wZXJ0aWVzIGxpa2UgIkFEUiIsICJPUkciLCBldGMuCi0gICAgICogPHA+Ci0gICAgICogV2UgYXJlIGFmcmFpZCBvZiB0aGUgY2FzZSB3aGVyZSBzb21lIHZDYXJkIGltcG9ydGVyIGFsc28gZm9yZ2V0IGhhbmRsaW5nIFFQIHByZXN1bWluZyBRUCBpcwotICAgICAqIG5vdCB1c2VkIGluIHN1Y2ggZmllbGRzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZnVsIHdoZW4gc29tZSB0YXJnZXQgaW1wb3J0ZXIgeW91IGFyZSBnb2luZyB0byBmb2N1cyBvbiBkb2VzIG5vdCBhY2NlcHQKLSAgICAgKiBzdWNoIHByb3BlcnRpZXMgd2l0aCBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBBZ2Fpbiwgd2Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmbGFnIGF0IGFsbCBmb3IgY29tcGx5aW5nIHZDYXJkIDIuMSBzcGVjLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB2Q2FyZCAzLjAsIFF1b3RlZC1QcmludGFibGUgaXMgZXhwbGljaXRseSAicHJvaGliaXR0ZWQiLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgdGhpcwotICAgICAqIGtpbmQgb2YgcHJvYmxlbSAoaG9wZWZ1bGx5KS4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fUVBfVE9fTkFNRV9QUk9QRVJUSUVTID0gMHgxMDAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCBwaG9uZXRpYyBuYW1lIHJlbGF0ZWQgZmllbGRzIG11c3QgYmUgY29udmVydGVkIHRvCi0gICAgICogYXBwcm9wcmlhdGUgZm9ybS4gTm90ZSB0aGF0ICJhcHByb3ByaWF0ZSIgaXMgbm90IGRlZmluZWQgaW4gYW55IHZDYXJkIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhpcyBpcyBBbmRyb2lkLXNwZWNpZmljLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmUgdHlwaWNhbCAoYW5kIGN1cnJlbnRseSBzb2xlKSBleGFtcGxlIHdoZXJlIHdlIG5lZWQgdGhpcyBmbGFnIGlzIHRoZSB0aW1lIHdoZW4KLSAgICAgKiB3ZSBuZWVkIHRvIGVtaXQgSmFwYW5lc2UgcGhvbmV0aWMgbmFtZXMgaW50byB2Q2FyZCBlbnRyaWVzLiBUaGUgcHJvcGVydHkgdmFsdWVzCi0gICAgICogc2hvdWxkIGJlIGVuY29kZWQgaW50byBoYWxmLXdpZHRoIGthdGFrYW5hIHdoZW4gdGhlIHRhcmdldCBpbXBvcnRlciBpcyBKYXBhbmVzZSBtb2JpbGUKLSAgICAgKiBwaG9uZXMnLCB3aGljaCBhcmUgcHJvYmFibHkgbm90IGFibGUgdG8gcGFyc2UgZnVsbC13aWR0aCBoaXJhZ2FuYS9rYXRha2FuYSBmb3IKLSAgICAgKiBoaXN0b3JpY2FsIHJlYXNvbnMsIHdoaWxlIHRoZSB2Q2FyZCBpbXBvcnRlcnMgZW1iZWRkZWQgdG8gc29mdHdhcmVzIGZvciBQQyBzaG91bGQgYmUKLSAgICAgKiBhYmxlIHRvIHBhcnNlIHRoZW0gYXMgd2UgZXhwZWN0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTID0gMHgwODAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHZDYXJkIGNvbXBvc2VyICJmb3IgMi4xIiBlbWl0cyAiVFlQRT0iIHN0cmluZyB0b3dhcmQgVFlQRSBwYXJhbXMKLSAgICAgKiBldmVyeSB0aW1lIHBvc3NpYmxlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBkb2VzIG5vdCBlbWl0IGl0IGFuZCBpcyB2YWxpZCBpbiB0aGUgc3BlYy4KLSAgICAgKiBJbiB2Q3JhZCAzLjAsIHRoaXMgZmxhZyBpcyB1bm5lY2Vzc2FyeSwgc2luY2UgIlRZUEU9IiBpcyBNVVNUIGluIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBEZXRhaWw6Ci0gICAgICogSG93IG1vcmUgdGhhbiBvbmUgVFlQRSBmaWVsZHMgYXJlIGV4cHJlc3NlZCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogZS5nLgotICAgICAqIDwvcD4KLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPlByb2JhYmx5IHZhbGlkIGluIGJvdGggdkNhcmQgMi4xIGFuZCB2Q2FyZCAzLjA6ICJBRFI7VFlQRT1ET007VFlQRT1IT01FOi4uLiI8L2xpPgotICAgICAqIDxsaT5WYWxpZCBpbiB2Q2FyZCAyLjEgYnV0IG5vdCBpbiB2Q2FyZCAzLjA6ICJBRFI7RE9NO0hPTUU6Li4uIjwvbGk+Ci0gICAgICogPGxpPlZhbGlkIGluIHZDYXJkIDMuMCBidXQgbm90IGluIHZDYXJkIDIuMTogIkFEUjtUWVBFPURPTSxIT01FOi4uLiI8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPHA+Ci0gICAgICogSWYgeW91IGFyZSB0YXJnZXRpbmcgdG8gdGhlIGltcG9ydGVyIHdoaWNoIGNhbm5vdCBhY2NlcHQgVFlQRSBwYXJhbXMgd2l0aG91dCAiVFlQRT0iCi0gICAgICogc3RyaW5ncyAod2hpY2ggc2hvdWxkIGJlIHJhcmUgdGhvdWdoKSwgcGxlYXNlIHVzZSB0aGlzIGZsYWcuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGUgdXNhZ2U6Ci0gICAgICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPmludCB0eXBlID0gKFZDQVJEX1RZUEVfVjIxX0dFTkVSSUMgfCBGTEFHX0FQUEVORF9UWVBFX1BBUkFNKTs8L3ByZT4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BUFBFTkRfVFlQRV9QQVJBTSA9IDB4MDQwMDAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSB2Q2FyZCBjb21wb3NlciBkb2VzIHRvdWNoIG5vdGhpbmcgdG93YXJkIHBob25lIG51bWJlciBTdHJpbmdzCi0gICAgICogYnV0IGxlYXZlIGl0IGFzIGlzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgc3BlY2lmaWNhdGlvbnMgbWVudGlvbiBub3RoaW5nIHRvd2FyZCBwaG9uZSBudW1iZXJzLCB3aGlsZSBzb21lIGRldmljZXMKLSAgICAgKiBkbyAod3JvbmdseSwgYnV0IHdpdGggaW5uZXZpdGFibGUgcmVhc29ucykuCi0gICAgICogRm9yIGV4YW1wbGUsIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIGFyZSBleHBlY3RlZCB0byBoYXZlCi0gICAgICoganVzdCBudW1iZXJzLCBoeXBlbnMsIHBsdXMsIGV0Yy4gYnV0IG5vdCB1c3VhbCBhbHBoYWJldHMsIHdoaWxlIFVTIG1vYmlsZSBwaG9uZXMKLSAgICAgKiBzaG91bGQgZ2V0IHN1Y2ggY2hhcmFjdGVycy4gVG8gbWFrZSBleHBvcnRlZCB2Q2FyZCBzaW1wbGUgZm9yIGV4dGVybmFsIHBhcnNlcnMsCi0gICAgICogd2UgaGF2ZSB1c2VkIHtAbGluayBQaG9uZU51bWJlclV0aWxzI2Zvcm1hdE51bWJlcihTdHJpbmcpfSBkdXJpbmcgZXhwb3J0LCBhbmQKLSAgICAgKiByZW1vdmVkIHVubmVjZXNzYXJ5IGNoYXJhY3RlcnMgaW5zaWRlIHRoZSBudW1iZXIgKGUuZy4gIjExMS0yMjItMzMzMyAoTWlhbWkpIgotICAgICAqIGJlY29tZXMgIjExMS0yMjItMzMzMyIpLgotICAgICAqIFVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIHRoYXQgdXNlIHdhcyBzb21lIGNvbnRyb2wgY2hhcmFjdGVycyB1c2VkIGluIHRoZSBvdGhlcgotICAgICAqIGFyZWFzIG1heSBiZSBiYWRseSBhZmZlY3RlZCBieSB0aGUgZm9ybWF0dGluZy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGRpc2FibGVzIHRoYXQgZm9ybWF0dGluZywgYWZmZWN0aW5nIGJvdGggaW1wb3J0ZXIgYW5kIGV4cG9ydGVyLgotICAgICAqIElmIHRoZSB1c2VyIGlzIGF3YXJlIG9mIHNvbWUgc2lkZSBlZmZlY3RzIGR1ZSB0byB0aGUgaW1wbGljaXQgZm9ybWF0dGluZywgdXNlIHRoaXMgZmxhZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19SRUZSQUlOX1BIT05FX05VTUJFUl9GT1JNQVRUSU5HID0gMHgwMjAwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEZvciBpbXBvcnRlciBvbmx5LiBJZ25vcmVkIGluIGV4cG9ydGVyLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZmxhZyBpbmRpY2F0aW5nIHRoZSBwYXJzZXIgc2hvdWxkIGhhbmRsZSBhIG5lc3RlZCB2Q2FyZCwgaW4gd2hpY2ggdkNhcmQgY2xhdXNlIHN0YXJ0cwotICAgICAqIGluIGFub3RoZXIgdkNhcmQgY2xhdXNlLiBIZXJlJ3MgYSB0eXBpY2FsIGV4YW1wbGUuCi0gICAgICogPC9wPgotICAgICAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij5CRUdJTjpWQ0FSRAotICAgICAqIEJFR0lOOlZDQVJECi0gICAgICogVkVSU0lPTjoyLjEKLSAgICAgKiAuLi4KLSAgICAgKiBFTkQ6VkNBUkQKLSAgICAgKiBFTkQ6VkNBUkQ8L3ByZT4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzIHRoZSBuZXN0LCBidXQgYWxzbyBsZXQgcGFyc2VycyBpZ25vcmUgbmVzdGVkIGVudHJpZXMsCi0gICAgICogd2hpbGUgc29tZSBtb2JpbGUgZGV2aWNlcyBlbWl0IG5lc3RlZCBvbmVzIGFzIHByaW1hcnkgZGF0YSB0byBiZSBpbXBvcnRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGZvcmNlcyBhIHZDYXJkIHBhcnNlciB0byB0b3JlbGF0ZSBzdWNoIGEgbmVzdCBhbmQgdW5kZXJzdGFuZCBpdHMgY29udGVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19UT1JFTEFURV9ORVNUID0gMHgwMTAwMDAwMDsKLQotICAgIC8vLy8gVGhlIGZvbGxvd2luZ3MgYXJlIFZDYXJkIHR5cGVzIGF2YWlsYWJsZSBmcm9tIGltcG9ydGVyL2V4cG9ydGVyLiAvLy8vCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFRlJBSU5fSU1BR0VfRVhQT1JUID0gMHgwMDgwMDAwMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB0eXBlIGluZGljYXRpbmcgbm90aGluZy4gVXNlZCBieSB7QGxpbmsgVkNhcmRTb3VyY2VEZXRlY3Rvcn0gd2hlbiBpdAotICAgICAqIHdhcyBub3QgYWJsZSB0byBndWVzcyB0aGUgZXhhY3QgdkNhcmQgdHlwZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9VTktOT1dOID0gMDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdlbmVyaWMgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZDYXJkIDIuMS4gV2hlbiBjb21wb3NpbmcgYSB2Q2FyZCBlbnRyeSwKLSAgICAgKiB0aGUgVVMgY29udmVuc2lvbiB3aWxsIGJlIHVzZWQgdG93YXJkIGZvcm1hdHRpbmcgc29tZSB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIGUuZy4gVGhlIG9yZGVyIG9mIHRoZSBkaXNwbGF5IG5hbWUgd291bGQgYmUgIlByZWZpeCBHaXZlbiBNaWRkbGUgRmFtaWx5IFN1ZmZpeCIsCi0gICAgICogd2hpbGUgaXQgc2hvdWxkIGJlICJQcmVmaXggRmFtaWx5IE1pZGRsZSBHaXZlbiBTdWZmaXgiIGluIEphcGFuIGZvciBleGFtcGxlLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VzIFVURi04IGZvciB0aGUgY2hhcnNldCBhcyBhIGNoYXJzZXQgZm9yIGV4cG9ydGluZy4gTm90ZSB0aGF0IG9sZCB2Q2FyZCBpbXBvcnRlcgotICAgICAqIG91dHNpZGUgQW5kcm9pZCBjYW5ub3QgYWNjZXB0IGl0IHNpbmNlIHZDYXJkIDIuMSBzcGVjaWZpY2FsbHkgZG9lcyBub3QgYWxsb3cKLSAgICAgKiB0aGF0IGNoYXJzZXQsIHdoaWxlIHdlIG5lZWQgdG8gdXNlIGl0IHRvIHN1cHBvcnQgdmFyaW91cyBsYW5ndWFnZXMgYXJvdW5kIHRoZSB3b3JsZC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogSWYgeW91IHdhbnQgdG8gdXNlIGFsdGVybmF0aXZlIGNoYXJzZXQsIHlvdSBzaG91bGQgbm90aWZ5IHRoZSBjaGFyc2V0IHRvIHRoZSBvdGhlcgotICAgICAqIGNvbXBvbnRlbnQgdG8gYmUgdXNlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfR0VORVJJQyA9Ci0gICAgICAgIChWRVJTSU9OXzIxIHwgTkFNRV9PUkRFUl9ERUZBVUxUIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfR0VORVJJQ19TVFIgPSAidjIxX2dlbmVyaWMiOwotICAgIAotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdlbmVyYWwgdkNhcmQgZm9ybWF0IHdpdGggdGhlIHZlcnNpb24gMy4wLiBVc2VzIFVURi04IGZvciB0aGUgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90IGZ1bGx5IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfR0VORVJJQyA9Ci0gICAgICAgIChWRVJTSU9OXzMwIHwgTkFNRV9PUkRFUl9ERUZBVUxUIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19TVFIgPSAidjMwX2dlbmVyaWMiOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiA0LjAuCi0gICAgICogQGhpZGUgdkNhcmQgNC4wIGlzIG5vdCBwdWJsaXNoZWQgeWV0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjQwX0dFTkVSSUMgPQotICAgICAgICAoVkVSU0lPTl80MCB8IE5BTUVfT1JERVJfREVGQVVMVCB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjQwX0dFTkVSSUNfU1RSID0gInY0MF9nZW5lcmljIjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEdlbmVyYWwgdkNhcmQgZm9ybWF0IGZvciB0aGUgdkNhcmQgMi4xIHdpdGggc29tZSBFdXJvcGUgY29udmVuc2lvbi4gVXNlcyBVdGYtOC4KLSAgICAgKiBDdXJyZW50bHksIG9ubHkgbmFtZSBvcmRlciBpcyBjb25zaWRlcmVkICgiUHJlZml4IE1pZGRsZSBHaXZlbiBGYW1pbHkgU3VmZml4IikKLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfRVVST1BFID0KLSAgICAgICAgKFZFUlNJT05fMjEgfCBOQU1FX09SREVSX0VVUk9QRSB8IEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSB8IEZMQUdfVVNFX0FORFJPSURfUFJPUEVSVFkpOwotCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjIxX0VVUk9QRV9TVFIgPSAidjIxX2V1cm9wZSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogR2VuZXJhbCB2Q2FyZCBmb3JtYXQgd2l0aCB0aGUgdmVyc2lvbiAzLjAgd2l0aCBzb21lIEV1cm9wZSBjb252ZW5zaW9uLiBVc2VzIFVURi04LgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3QgcmVhZHkgeWV0LiBVc2Ugd2l0aCBjYXV0aW9uIHdoZW4geW91IHVzZSB0aGlzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEUgPQotICAgICAgICAoVkVSU0lPTl8zMCB8IE5BTUVfT1JERVJfRVVST1BFIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0gICAgCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFZDQVJEX1RZUEVfVjMwX0VVUk9QRV9TVFIgPSAidjMwX2V1cm9wZSI7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdkNhcmQgMi4xIGZvcm1hdCBmb3IgbWlzY2VsbGFuZW91cyBKYXBhbmVzZSBkZXZpY2VzLCB1c2luZyBVVEYtOCBhcyBkZWZhdWx0IGNoYXJzZXQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdCByZWFkeSB5ZXQuIFVzZSB3aXRoIGNhdXRpb24gd2hlbiB5b3UgdXNlIHRoaXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFID0KLSAgICAgICAgKFZFUlNJT05fMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwgRkxBR19VU0VfREVGQUNUX1BST1BFUlRZIHwgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfU1RSID0gInYyMV9qYXBhbmVzZV91dGY4IjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCAzLjAgZm9ybWF0IGZvciBtaXNjZWxsYW5lb3VzIEphcGFuZXNlIGRldmljZXMsIHVzaW5nIFVURi04IGFzIGRlZmF1bHQgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90IHJlYWR5IHlldC4gVXNlIHdpdGggY2F1dGlvbiB3aGVuIHlvdSB1c2UgdGhpcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UgPQotICAgICAgICAoVkVSU0lPTl8zMCB8IE5BTUVfT1JERVJfSkFQQU5FU0UgfCBGTEFHX1VTRV9ERUZBQ1RfUFJPUEVSVFkgfCBGTEFHX1VTRV9BTkRST0lEX1BST1BFUlRZKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRV9TVFIgPSAidjMwX2phcGFuZXNlX3V0ZjgiOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZDYXJkIDIuMSBiYXNlZCBmb3JtYXQgd2hpY2ggKHBhcnRpYWxseSkgY29uc2lkZXJzIHRoZSBjb252ZW50aW9uIGluIEphcGFuZXNlCi0gICAgICogbW9iaWxlIHBob25lcywgd2hlcmUgcGhvbmV0aWMgbmFtZXMgYXJlIHRyYW5zbGF0ZWQgdG8gaGFsZi13aWR0aCBrYXRha2FuYSBpZgotICAgICAqIHBvc3NpYmxlLCBldGMuIEl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgU2hpZnRfSklTIGFzIGEgY2hhcnNldCBmb3IgbWF4aW11bQotICAgICAqIGNvbXBhdGliaWxpdHkuCi0gICAgICogPC9wPgotICAgICAqIEBoaWRlIFNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdvcmxkIHdpZGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFID0KLSAgICAgICAgKFZFUlNJT05fMjEgfCBOQU1FX09SREVSX0pBUEFORVNFIHwKLSAgICAgICAgICAgICAgICBGTEFHX0NPTlZFUlRfUEhPTkVUSUNfTkFNRV9TVFJJTkdTIHwgRkxBR19SRUZSQUlOX1FQX1RPX05BTUVfUFJPUEVSVElFUyk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFX1NUUiA9ICJ2MjFfamFwYW5lc2VfbW9iaWxlIjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSB2Q2FyZCBmb3JtYXQgdXNlZCBpbiBEb0NvTW8sIHdoaWNoIGlzIG9uZSBvZiBKYXBhbmVzZSBtb2JpbGUgcGhvbmUgY2FyZWVycy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQmFzZSB2ZXJzaW9uIGlzIHZDYXJkIDIuMSwgYnV0IHRoZSBkYXRhIGhhcyBzZXZlcmFsIERvQ29Nby1zcGVjaWZpYyBjb252ZW5zaW9ucy4KLSAgICAgKiBObyBBbmRyb2lkLXNwZWNpZmljIHByb3BlcnR5IG5vciBkZWZhY3QgcHJvcGVydHkgaXMgaW5jbHVkZWQuIFRoZSAiUHJpbWFyeSIgcHJvcGVydGllcwotICAgICAqIGFyZSBOT1QgZW5jb2RlZCB0byBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZSBTaG91bGQgbm90IGJlIGF2YWlsYWJsZSB3b3JsZCB3aWRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZDQVJEX1RZUEVfRE9DT01PID0KLSAgICAgICAgKFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSB8IEZMQUdfRE9DT01PKTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFN0cmluZyBWQ0FSRF9UWVBFX0RPQ09NT19TVFIgPSAiZG9jb21vIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IFZDQVJEX1RZUEVfREVGQVVMVCA9IFZDQVJEX1RZUEVfVjIxX0dFTkVSSUM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzVkNhcmRUeXBlTWFwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJbnRlZ2VyPiBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0OwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0dFTkVSSUNfU1RSLCBWQ0FSRF9UWVBFX1YyMV9HRU5FUklDKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfR0VORVJJQ19TVFIsIFZDQVJEX1RZUEVfVjMwX0dFTkVSSUMpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9FVVJPUEVfU1RSLCBWQ0FSRF9UWVBFX1YyMV9FVVJPUEUpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YzMF9FVVJPUEVfU1RSLCBWQ0FSRF9UWVBFX1YzMF9FVVJPUEUpOwotICAgICAgICBzVkNhcmRUeXBlTWFwLnB1dChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICAgICAgc1ZDYXJkVHlwZU1hcC5wdXQoVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0VfU1RSLCBWQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRV9TVFIsIFZDQVJEX1RZUEVfVjIxX0pBUEFORVNFX01PQklMRSk7Ci0gICAgICAgIHNWQ2FyZFR5cGVNYXAucHV0KFZDQVJEX1RZUEVfRE9DT01PX1NUUiwgVkNBUkRfVFlQRV9ET0NPTU8pOwotCi0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotICAgICAgICBzSmFwYW5lc2VNb2JpbGVUeXBlU2V0LmFkZChWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSk7Ci0gICAgICAgIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuYWRkKFZDQVJEX1RZUEVfVjMwX0pBUEFORVNFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0VfTU9CSUxFKTsKLSAgICAgICAgc0phcGFuZXNlTW9iaWxlVHlwZVNldC5hZGQoVkNBUkRfVFlQRV9ET0NPTU8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZDYXJkVHlwZUZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZjYXJkVHlwZVN0cmluZykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbG93ZXJlZEtleSA9IHZjYXJkVHlwZVN0cmluZy50b0xvd2VyQ2FzZSgpOwotICAgICAgICBpZiAoc1ZDYXJkVHlwZU1hcC5jb250YWluc0tleShsb3dlcmVkS2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIHNWQ2FyZFR5cGVNYXAuZ2V0KGxvd2VyZWRLZXkpOwotICAgICAgICB9IGVsc2UgaWYgKCJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHZjYXJkVHlwZVN0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBWQ0FSRF9UWVBFX0RFRkFVTFQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93biB2Q2FyZCB0eXBlIFN0cmluZzogXCIiICsgdmNhcmRUeXBlU3RyaW5nICsgIlwiIik7Ci0gICAgICAgICAgICByZXR1cm4gVkNBUkRfVFlQRV9ERUZBVUxUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbjIxKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICh2Y2FyZFR5cGUgJiBWRVJTSU9OX01BU0spID09IFZFUlNJT05fMjE7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbjMwKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICh2Y2FyZFR5cGUgJiBWRVJTSU9OX01BU0spID09IFZFUlNJT05fMzA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbjQwKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICh2Y2FyZFR5cGUgJiBWRVJTSU9OX01BU0spID09IFZFUlNJT05fNDA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZVF1b3RlZFByaW50YWJsZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAhaXNWZXJzaW9uMzAodmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXROYW1lT3JkZXJUeXBlKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHZjYXJkVHlwZSAmIE5BTUVfT1JERVJfTUFTSzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc0FuZHJvaWRTcGVjaWZpY1Byb3BlcnR5KGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19VU0VfQU5EUk9JRF9QUk9QRVJUWSkgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHVzZXNEZWZhY3RQcm9wZXJ0eShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoKHZjYXJkVHlwZSAmIEZMQUdfVVNFX0RFRkFDVF9QUk9QRVJUWSkgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dQZXJmb3JtYW5jZUxvZygpIHsKLSAgICAgICAgcmV0dXJuIChWQ2FyZENvbmZpZy5MT0dfTEVWRUwgJiBWQ2FyZENvbmZpZy5MT0dfTEVWRUxfUEVSRk9STUFOQ0VfTUVBU1VSRU1FTlQpICE9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFJlZnJhaW5RUFRvTmFtZVByb3BlcnRpZXMoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgIHJldHVybiAoIXNob3VsZFVzZVF1b3RlZFByaW50YWJsZSh2Y2FyZFR5cGUpIHx8Ci0gICAgICAgICAgICAgICAoKHZjYXJkVHlwZSAmIEZMQUdfUkVGUkFJTl9RUF9UT19OQU1FX1BST1BFUlRJRVMpICE9IDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXBwZW5kVHlwZVBhcmFtTmFtZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCAoKHZjYXJkVHlwZSAmIEZMQUdfQVBQRU5EX1RZUEVfUEFSQU0pICE9IDApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBKYXBhbmVzZSBhbmQgc29tZSBKYXBhbmVzZSBjb252ZW5zaW9uIGlzCi0gICAgICogYXBwbGllZCB0byBjcmVhdGluZyAiZm9ybWF0dGVkIiBzb21ldGhpbmcgbGlrZSBGT1JNQVRURURfQUREUkVTUy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXBhbmVzZURldmljZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE86IFNvbWUgbWFzayB3aWxsIGJlIHJlcXVpcmVkIHNvIHRoYXQgdGhpcyBtZXRob2Qgd3JvbmdseSBpbnRlcnByZXQKLSAgICAgICAgLy8gICAgICAgIEphcGFuZXNlIi1saWtlIiB2Q2FyZCB0eXBlLgotICAgICAgICAvLyAgICAgICAgZS5nLiBWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9TSklTIHwgRkxBR19BUFBFTkRfVFlQRV9QQVJBTVMKLSAgICAgICAgcmV0dXJuIHNKYXBhbmVzZU1vYmlsZVR5cGVTZXQuY29udGFpbnModmNhcmRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBib29sZWFuIHJlZnJhaW5QaG9uZU51bWJlckZvcm1hdHRpbmcoZmluYWwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICByZXR1cm4gKCh2Y2FyZFR5cGUgJiBGTEFHX1JFRlJBSU5fUEhPTkVfTlVNQkVSX0ZPUk1BVFRJTkcpICE9IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZWVkc1RvQ29udmVydFBob25ldGljU3RyaW5nKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19DT05WRVJUX1BIT05FVElDX05BTUVfU1RSSU5HUykgIT0gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlPbmVOb3RlRmllbGRJc0F2YWlsYWJsZShmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHJldHVybiB2Y2FyZFR5cGUgPT0gVkNBUkRfVFlQRV9ET0NPTU87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9Db01vKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgcmV0dXJuICgodmNhcmRUeXBlICYgRkxBR19ET0NPTU8pICE9IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgVkNhcmRDb25maWcoKSB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzcxZWY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotLyoqCi0gKiBDb25zdGFudHMgdXNlZCBpbiBib3RoIGV4cG9ydGVyIGFuZCBpbXBvcnRlciBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVjIxID0gIjIuMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9WMzAgPSAiMy4wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1Y0MCA9ICI0LjAiOwotCi0gICAgLy8gVGhlIHByb3BlcnR5IG5hbWVzIHZhbGlkIGJvdGggaW4gdkNhcmQgMi4xIGFuZCAzLjAuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQkVHSU4gPSAiQkVHSU4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZFUlNJT04gPSAiVkVSU0lPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTiA9ICJOIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GTiA9ICJGTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQURSID0gIkFEUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRU1BSUwgPSAiRU1BSUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05PVEUgPSAiTk9URSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfT1JHID0gIk9SRyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU09VTkQgPSAiU09VTkQiOyAgLy8gTm90IGZ1bGx5IHN1cHBvcnRlZC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9URUwgPSAiVEVMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9USVRMRSA9ICJUSVRMRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUk9MRSA9ICJST0xFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QSE9UTyA9ICJQSE9UTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTE9HTyA9ICJMT0dPIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VUkwgPSAiVVJMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CREFZID0gIkJEQVkiOyAgLy8gQmlydGhkYXkgKDMuMCwgNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JJUlRIID0gIkJJUlRIIjsgIC8vIFBsYWNlIG9mIGJpcnRoICg0LjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQU5OSVZFUlNBUlkgPSAiQU5OSVZFUlNBUlkiOyAgLy8gRGF0ZSBvZiBtYXJyaWFnZSAoNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAiTkFNRSI7ICAvLyAoMy4wLCA0LDApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTklDS05BTUUgPSAiTklDS05BTUUiOyAgLy8gKDMuMCwgNC4wKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NPUlRfU1RSSU5HID0gIlNPUlQtU1RSSU5HIjsgIC8vICgzLjAsIDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTkQgPSAiRU5EIjsKLQotICAgIC8vIFZhbGlkIHByb3BlcnR5IG5hbWVzIG5vdCBzdXBwb3J0ZWQgKG5vdCBhcHByb3ByaWF0ZWx5IGhhbmRsZWQpIGJ5IG91ciBpbXBvcnRlci4KLSAgICAvLyBUT0RPOiBTaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSB2aWV3IG9mIG1lbW9yeSBlZmZpY2llbmN5PwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1JFViA9ICJSRVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FHRU5UID0gIkFHRU5UIjsgIC8vICgzLjApCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRERBWSA9ICJEREFZIjsgIC8vIERhdGUgb2YgZGVhdGggKDQuMCkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUFUSCA9ICJERUFUSCI7ICAvLyBQbGFjZSBvZiBkZWF0aCAoNC4wKQotCi0gICAgLy8gQXZhaWxhYmxlIGluIHZDYXJkIDMuMC4gU2hvdWQgbm90IHVzZSB3aGVuIGNvbXBvc2luZyB2Q2FyZCAyLjEgZmlsZS4KLSAgICAKLSAgICAvLyBEZS1mYWN0IHByb3BlcnR5IHZhbHVlcyBleHByZXNzaW5nIHBob25ldGljIG5hbWVzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUEhPTkVUSUNfRklSU1RfTkFNRSA9ICJYLVBIT05FVElDLUZJUlNULU5BTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfUEhPTkVUSUNfTUlERExFX05BTUUgPSAiWC1QSE9ORVRJQy1NSURETEUtTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9QSE9ORVRJQ19MQVNUX05BTUUgPSAiWC1QSE9ORVRJQy1MQVNULU5BTUUiOwotCi0gICAgLy8gUHJvcGVydGllcyBib3RoIENvbnRhY3RzU3RydWN0IGFuZCBkZS1mYWN0IHZDYXJkIGV4dGVuc2lvbnMKLSAgICAvLyBTaG93biBpbiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZDYXJkIHN1cHBvcnQgYXJlIGRlZmluZWQgaGVyZS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0FJTSA9ICJYLUFJTSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9NU04gPSAiWC1NU04iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfWUFIT08gPSAiWC1ZQUhPTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9JQ1EgPSAiWC1JQ1EiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfSkFCQkVSID0gIlgtSkFCQkVSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0dPT0dMRV9UQUxLID0gIlgtR09PR0xFLVRBTEsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfVVNFUk5BTUUgPSAiWC1TS1lQRS1VU0VSTkFNRSI7Ci0gICAgLy8gUHJvcGVydGllcyBvbmx5IENvbnRhY3RzU3RydWN0IGhhcy4gV2UgYWxzZSB1c2UgdGhpcy4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1FRID0gIlgtUVEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfTkVUTUVFVElORyA9ICJYLU5FVE1FRVRJTkciOwotCi0gICAgLy8gUGhvbmUgbnVtYmVyIGZvciBTa3lwZSwgYXZhaWxhYmxlIGFzIHVzdWFsIHBob25lLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfU0tZUEVfUFNUTk5VTUJFUiA9ICJYLVNLWVBFLVBTVE5OVU1CRVIiOwotCi0gICAgLy8gUHJvcGVydHkgZm9yIEFuZHJvaWQtc3BlY2lmaWMgZmllbGRzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00gPSAiWC1BTkRST0lELUNVU1RPTSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzIGZvciBEb0NvTW8gdkNhcmQuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9DTEFTUyA9ICJYLUNMQVNTIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX1JFRFVDVElPTiA9ICJYLVJFRFVDVElPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9OTyA9ICJYLU5PIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0RDTV9ITU5fTU9ERSA9ICJYLURDTS1ITU4tTU9ERSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFID0gIlRZUEUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9IT01FID0gIkhPTUUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfV09SSyA9ICJXT1JLIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0ZBWCA9ICJGQVgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0VMTCA9ICJDRUxMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1ZPSUNFID0gIlZPSUNFIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX0lOVEVSTkVUID0gIklOVEVSTkVUIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NIQVJTRVQgPSAiQ0hBUlNFVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkcgPSAiRU5DT0RJTkciOwotCi0gICAgLy8gQWJicmV2aWF0aW9uIG9mICJwcmVmZXJlZCIgYWNjb3JkaW5nIHRvIHZDYXJkIDIuMSBzcGVjaWZpY2F0aW9uLgotICAgIC8vIFdlIGludGVycHJldCB0aGlzIHZhbHVlIGFzICJwcmltYXJ5IiBwcm9wZXJ0eSBkdXJpbmcgaW1wb3J0L2V4cG9ydC4KLSAgICAvLwotICAgIC8vIE5vdGU6IEJvdGggdkNhcmQgc3BlY3MgZG9lcyBub3QgbWVudGlvbiBhbnl0aGluZyBhYm91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgcGFyYW1ldGVyLAotICAgIC8vICAgICAgIGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB2Q2FyZCBpbXBvcnRlciB3aGljaCB3aWxsIGdldCBjb25mdXNlZCB3aXRoIG1vcmUgdGhhbgotICAgIC8vICAgICAgIG9uZSAiUFJFRiJzIGluIG9uZSBwcm9wZXJ0eSBuYW1lLCB3aGlsZSBBbmRyb2lkIGFjY2VwdHMgdGhlbS4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX1BSRUYgPSAiUFJFRiI7Ci0KLSAgICAvLyBQaG9uZSB0eXBlIHBhcmFtZXRlcnMgdmFsaWQgaW4gdkNhcmQgYW5kIGtub3duIHRvIENvbnRhY3RzQ29udHJhY3QsIGJ1dCBub3Qgc28gY29tbW9uLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQ0FSID0gIkNBUiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9JU0ROID0gIklTRE4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfUEFHRVIgPSAiUEFHRVIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfVExYID0gIlRMWCI7ICAvLyBUZWxleAotCi0gICAgLy8gUGhvbmUgdHlwZXMgZXhpc3RpbmcgaW4gdkNhcmQgMi4xIGJ1dCBub3Qga25vd24gdG8gQ29udGFjdHNDb250cmFjdC4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01PREVNID0gIk1PREVNIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UWVBFX01TRyA9ICJNU0ciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfQkJTID0gIkJCUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9WSURFTyA9ICJWSURFTyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9FTkNPRElOR183QklUID0gIjdCSVQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0VOQ09ESU5HXzhCSVQgPSAiOEJJVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfUVAgPSAiUVVPVEVELVBSSU5UQUJMRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfQkFTRTY0ID0gIkJBU0U2NCI7ICAvLyBBdmFpbGFibGUgaW4gdkNhcmQgMi4xCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRU5DT0RJTkdfQiA9ICJCIjsgIC8vIEF2YWlsYWJsZSBpbiB2Q2FyZCAzLjAKLQotICAgIC8vIFRZUEUgcGFyYW1ldGVycyBmb3IgUGhvbmVzLCB3aGljaCBhcmUgbm90IGZvcm1hbGx5IHZhbGlkIGluIHZDYXJkIChhdCBsZWFzdCAyLjEpLgotICAgIC8vIFRoZXNlIHR5cGVzIGFyZSBiYXNpY2FsbHkgZW5jb2RlZCB0byAiWC0iIHBhcmFtZXRlcnMgd2hlbiBjb21wb3NpbmcgdkNhcmQuCi0gICAgLy8gUGFyc2VyIHBhc3NlcyB0aGVzZSB3aGVuICJYLSIgaXMgYWRkZWQgdG8gdGhlIHBhcmFtZXRlciBvciBub3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DQUxMQkFDSyA9ICJDQUxMQkFDSyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9SQURJTyA9ICJSQURJTyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9UVFlfVEREID0gIlRUWS1UREQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQVNTSVNUQU5UID0gIkFTU0lTVEFOVCI7Ci0gICAgLy8gdkNhcmQgY29tcG9zZXIgdHJhbnNsYXRlcyB0aGlzIHR5cGUgdG8gIldPUksiICsgIlBSRUYiLiBKdXN0IGZvciBwYXJzaW5nLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfQ09NUEFOWV9NQUlOID0gIkNPTVBBTlktTUFJTiI7Ci0gICAgLy8gdkNhcmQgY29tcG9zZXIgdHJhbnNsYXRlcyB0aGlzIHR5cGUgdG8gIlZPSUNFIiBKdXN0IGZvciBwYXJzaW5nLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BIT05FX0VYVFJBX1RZUEVfT1RIRVIgPSAiT1RIRVIiOwotCi0gICAgLy8gVFlQRSBwYXJhbWV0ZXJzIGZvciBwb3N0YWwgYWRkcmVzc2VzLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FEUl9UWVBFX1BBUkNFTCA9ICJQQVJDRUwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FEUl9UWVBFX0RPTSA9ICJET00iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FEUl9UWVBFX0lOVEwgPSAiSU5UTCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9MQU5HVUFHRSA9ICJMQU5HVUFHRSI7Ci0KLSAgICAvLyBTT1JULUFTIHBhcmFtZXRlciBpbnRyb2R1Y2VkIGluIHZDYXJkIDQuMCAoYXMgb2YgcmV2LjEzKQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1NPUlRfQVMgPSAiU09SVC1BUyI7Ci0KLSAgICAvLyBUWVBFIHBhcmFtZXRlcnMgbm90IG9mZmljaWFsbHkgdmFsaWQgYnV0IHVzZWQgaW4gc29tZSB2Q2FyZCBleHBvcnRlci4KLSAgICAvLyBEbyBub3QgdXNlIGluIGNvbXBvc2VyIHNpZGUuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRVhUUkFfVFlQRV9DT01QQU5ZID0gIkNPTVBBTlkiOwotCi0gICAgcHVibGljIGludGVyZmFjZSBJbXBvcnRPbmx5IHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfWF9OSUNLTkFNRSA9ICJYLU5JQ0tOQU1FIjsKLSAgICAgICAgLy8gU29tZSBkZXZpY2UgZW1pdHMgdGhpcyAiWC0iIHBhcmFtZXRlciBmb3IgZXhwcmVzc2luZyBHb29nbGUgVGFsaywKLSAgICAgICAgLy8gd2hpY2ggaXMgc3BlY2lmaWNhbGx5IGludmFsaWQgYnV0IHNob3VsZCBiZSBhbHdheXMgcHJvcGVybHkgYWNjZXB0ZWQsIGFuZCBlbWl0dGVkCi0gICAgICAgIC8vIGluIHNvbWUgc3BlY2lhbCBjYXNlIChmb3IgdGhhdCBkZXZpY2UvYXBwbGljYXRpb24pLgotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YX0dPT0dMRV9UQUxLX1dJVEhfU1BBQ0UgPSAiWC1HT09HTEUgVEFMSyI7Ci0gICAgfQotCi0gICAgLy8vLyBNYWlubHkgZm9yIHBhY2thZ2UgY29uc3RhbnRzLgotCi0gICAgLy8gRG9Db01vIHNwZWNpZmljIHR5cGUgcGFyYW1ldGVyLiBVc2VkIHdpdGggIlNPVU5EIiBwcm9wZXJ0eSwgd2hpY2ggaXMgYWx0ZXJuYXRlIG9mCi0gICAgLy8gU09SVC1TVFJJTkcgaW52Q2FyZCAzLjAuCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RZUEVfWF9JUk1DX04gPSAiWC1JUk1DLU4iOwotCi0gICAgLy8gVXNlZCBpbiB1bml0IHRlc3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfQ09MVU1OID0gMTU7Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NIQVJBQ1RFUl9OVU1TX1FQID0gNzY7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQ0hBUkFDVEVSX05VTVNfQkFTRTY0X1YzMCA9IDc1OwotCi0gICAgcHJpdmF0ZSBWQ2FyZENvbnN0YW50cygpIHsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjdjNWYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5PcGVyYXRpb25BcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkV2ZW50OwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuR3JvdXBNZW1iZXJzaGlwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuSW07Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Pcmdhbml6YXRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob3RvOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuV2Vic2l0ZTsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGJyaWRnZXMgYmV0d2VlbiBkYXRhIHN0cnVjdHVyZSBvZiBDb250YWN0IGFwcCBhbmQgVkNhcmQgZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnkiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfT1JHQU5JWkFUSU9OX1RZUEUgPSBPcmdhbml6YXRpb24uVFlQRV9XT1JLOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0ltTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSwgSW0uUFJPVE9DT0xfQUlNKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTiwgSW0uUFJPVE9DT0xfTVNOKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1lBSE9PLCBJbS5QUk9UT0NPTF9ZQUhPTyk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9JQ1EsIEltLlBST1RPQ09MX0lDUSk7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9KQUJCRVIsIEltLlBST1RPQ09MX0pBQkJFUik7Ci0gICAgICAgIHNJbU1hcC5wdXQoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9TS1lQRV9VU0VSTkFNRSwgSW0uUFJPVE9DT0xfU0tZUEUpOwotICAgICAgICBzSW1NYXAucHV0KFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfR09PR0xFX1RBTEssIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0ltTWFwLnB1dChWQ2FyZENvbnN0YW50cy5JbXBvcnRPbmx5LlBST1BFUlRZX1hfR09PR0xFX1RBTEtfV0lUSF9TUEFDRSwKLSAgICAgICAgICAgICAgICBJbS5QUk9UT0NPTF9HT09HTEVfVEFMSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQaG9uZURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsYWJlbDsKLSAgICAgICAgLy8gaXNQcmltYXJ5IGlzIChub3QgZmluYWwgYnV0KSBjaGFuZ2FibGUsIG9ubHkgd2hlbiB0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIG9uZSBleGlzdGluZwotICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgVkNhcmQuCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgcHVibGljIFBob25lRGF0YShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob25lRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gKFBob25lRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvbmVEYXRhLnR5cGUgJiYgZGF0YS5lcXVhbHMocGhvbmVEYXRhLmRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgIGxhYmVsLmVxdWFscyhwaG9uZURhdGEubGFiZWwpICYmIGlzUHJpbWFyeSA9PSBwaG9uZURhdGEuaXNQcmltYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInR5cGU6ICVkLCBkYXRhOiAlcywgbGFiZWw6ICVzLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtYWlsRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBkYXRhOwotICAgICAgICAvLyBVc2VkIG9ubHkgd2hlbiBUWVBFIGlzIFRZUEVfQ1VTVE9NLgotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxhYmVsOwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgIHB1YmxpYyBFbWFpbERhdGEoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKLSAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgICAgICAgICAgIHRoaXMuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBFbWFpbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW1haWxEYXRhIGVtYWlsRGF0YSA9IChFbWFpbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IGVtYWlsRGF0YS50eXBlICYmIGRhdGEuZXF1YWxzKGVtYWlsRGF0YS5kYXRhKSAmJgotICAgICAgICAgICAgICAgICAgICBsYWJlbC5lcXVhbHMoZW1haWxEYXRhLmxhYmVsKSAmJiBpc1ByaW1hcnkgPT0gZW1haWxEYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ0eXBlOiAlZCwgZGF0YTogJXMsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGRhdGEsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3N0YWxEYXRhIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lZCBieSB2Q2FyZCBzcGVjaWZpY2F0aW9uLgotICAgICAgICAvLyAtIFBPIEJveCwgRXh0ZW5kZWQgQWRkciwgU3RyZWV0LCBMb2NhbGl0eSwgUmVnaW9uLCBQb3N0YWwgQ29kZSwgQ291bnRyeSBOYW1lCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERFJfTUFYX0RBVEFfU0laRSA9IDc7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gZGF0YUFycmF5OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBvYm94OwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGV4dGVuZGVkQWRkcmVzczsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzdHJlZXQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbG9jYWx0eTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWdpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcG9zdGFsQ29kZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb3VudHJ5OwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeTsKLQotICAgICAgICBwdWJsaWMgUG9zdGFsRGF0YShmaW5hbCBpbnQgdHlwZSwgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIGRhdGFBcnJheSA9IG5ldyBTdHJpbmdbQUREUl9NQVhfREFUQV9TSVpFXTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSBwcm9wVmFsdWVMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IEFERFJfTUFYX0RBVEFfU0laRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRyLXZhbHVlID0gMCo2KHRleHQtdmFsdWUgIjsiKSB0ZXh0LXZhbHVlCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBQTyBCb3gsIEV4dGVuZGVkIEFkZHJlc3MsIFN0cmVldCwgTG9jYWxpdHksIFJlZ2lvbiwgUG9zdGFsCi0gICAgICAgICAgICAvLyAgICAgICAgICAgOyBDb2RlLCBDb3VudHJ5IE5hbWUKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBVc2UgSXRlcmF0b3IgYXNzdW1pbmcgTGlzdCBtYXkgYmUgTGlua2VkTGlzdCwgdGhvdWdoIGFjdHVhbGx5IGl0IGlzCi0gICAgICAgICAgICAvLyBhbHdheXMgQXJyYXlMaXN0IGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWRkcmVzc0VsZW1lbnQgOiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2ldID0gYWRkcmVzc0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKCsraSA+PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgQUREUl9NQVhfREFUQV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgZGF0YUFycmF5W2krK10gPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLnBvYm94ID0gZGF0YUFycmF5WzBdOwotICAgICAgICAgICAgdGhpcy5leHRlbmRlZEFkZHJlc3MgPSBkYXRhQXJyYXlbMV07Ci0gICAgICAgICAgICB0aGlzLnN0cmVldCA9IGRhdGFBcnJheVsyXTsKLSAgICAgICAgICAgIHRoaXMubG9jYWx0eSA9IGRhdGFBcnJheVszXTsKLSAgICAgICAgICAgIHRoaXMucmVnaW9uID0gZGF0YUFycmF5WzRdOwotICAgICAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gZGF0YUFycmF5WzVdOwotICAgICAgICAgICAgdGhpcy5jb3VudHJ5ID0gZGF0YUFycmF5WzZdOwotICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBvc3RhbERhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgUG9zdGFsRGF0YSBwb3N0YWxEYXRhID0gKFBvc3RhbERhdGEpb2JqOwotICAgICAgICAgICAgcmV0dXJuIChBcnJheXMuZXF1YWxzKGRhdGFBcnJheSwgcG9zdGFsRGF0YS5kYXRhQXJyYXkpICYmCi0gICAgICAgICAgICAgICAgICAgICh0eXBlID09IHBvc3RhbERhdGEudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsID09IHBvc3RhbERhdGEubGFiZWwpIDogdHJ1ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcG9zdGFsRGF0YS5pc1ByaW1hcnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkQWRkcmVzcyhmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgYm9vbGVhbiBlbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNKYXBhbmVzZURldmljZSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gSmFwYW4sIHRoZSBvcmRlciBpcyByZXZlcnNlZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gQUREUl9NQVhfREFUQV9TSVpFIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQUREUl9NQVhfREFUQV9TSVpFOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NQYXJ0ID0gZGF0YUFycmF5W2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGFkZHJlc3NQYXJ0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhZGRyZXNzUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGxhYmVsOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPcmdhbml6YXRpb25EYXRhIHsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCB0eXBlOwotICAgICAgICAvLyBub24tZmluYWwgaXMgSW50ZW50aW9uYWw6IHdlIG1heSBjaGFuZ2UgdGhlIHZhbHVlcyBzaW5jZSB0aGlzIGluZm8gaXMgc2VwYXJhdGVkIGludG8KLSAgICAgICAgLy8gdHdvIHBhcnRzIGluIHZDYXJkOiAiT1JHIiArICJUSVRMRSIsIGFuZCB3ZSBoYXZlIHRvIGNvcGUgd2l0aCBlYWNoIGZpZWxkIGluCi0gICAgICAgIC8vIGRpZmZlcmVudCB0aW1pbmcuCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFueU5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGl0bGVOYW1lOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZTsgIC8vIFdlIHdvbid0IGhhdmUgdGhpcyBpbiAiVElUTEUiIHByb3BlcnR5LgotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIE9yZ2FuaXphdGlvbkRhdGEoaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGVOYW1lLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwaG9uZXRpY05hbWUsCi0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLmNvbXBhbnlOYW1lID0gY29tcGFueU5hbWU7Ci0gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnROYW1lID0gZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgICAgICB0aGlzLnRpdGxlTmFtZSA9IHRpdGxlTmFtZTsKLSAgICAgICAgICAgIHRoaXMucGhvbmV0aWNOYW1lID0gcGhvbmV0aWNOYW1lOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9yZ2FuaXphdGlvbkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb24gPSAoT3JnYW5pemF0aW9uRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gb3JnYW5pemF0aW9uLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmVxdWFscyhjb21wYW55TmFtZSwgb3JnYW5pemF0aW9uLmNvbXBhbnlOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZXF1YWxzKGRlcGFydG1lbnROYW1lLCBvcmdhbml6YXRpb24uZGVwYXJ0bWVudE5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5lcXVhbHModGl0bGVOYW1lLCBvcmdhbml6YXRpb24udGl0bGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPT0gb3JnYW5pemF0aW9uLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvbXBhbnlOYW1lKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShkZXBhcnRtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGRlcGFydG1lbnROYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0aXRsZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgInR5cGU6ICVkLCBjb21wYW55OiAlcywgZGVwYXJ0bWVudDogJXMsIHRpdGxlOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBpc1ByaW1hcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbURhdGEgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGN1c3RvbVByb3RvY29sOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGF0YTsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltYXJ5OwotCi0gICAgICAgIHB1YmxpYyBJbURhdGEoZmluYWwgaW50IHByb3RvY29sLCBmaW5hbCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGZpbmFsIGludCB0eXBlLAotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhLCBmaW5hbCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICAgICAgdGhpcy5jdXN0b21Qcm90b2NvbCA9IGN1c3RvbVByb3RvY29sOwotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICB0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgSW1EYXRhKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltRGF0YSBpbURhdGEgPSAoSW1EYXRhKW9iajsKLSAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBpbURhdGEudHlwZSAmJiBwcm90b2NvbCA9PSBpbURhdGEucHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgJiYgKGN1c3RvbVByb3RvY29sICE9IG51bGwgPyBjdXN0b21Qcm90b2NvbC5lcXVhbHMoaW1EYXRhLmN1c3RvbVByb3RvY29sKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaW1EYXRhLmN1c3RvbVByb3RvY29sID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiAoZGF0YSAhPSBudWxsID8gZGF0YS5lcXVhbHMoaW1EYXRhLmRhdGEpIDogKGltRGF0YS5kYXRhID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ByaW1hcnkgPT0gaW1EYXRhLmlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAidHlwZTogJWQsIHByb3RvY29sOiAlZCwgY3VzdG9tX3Byb3Rjb2w6ICVzLCBkYXRhOiAlcywgaXNQcmltYXJ5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgIHR5cGUsIHByb3RvY29sLCBjdXN0b21Qcm90b2NvbCwgZGF0YSwgaXNQcmltYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGhvdG9EYXRhIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0ZMQVNIID0gIlNXRiI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdHlwZTsKLSAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBmb3JtYXROYW1lOyAgLy8gdXNlZCB3aGVuIHR5cGUgaXMgbm90IGRlZmluZWQgaW4gQ29udGFjdHNDb250cmFjdC4KLSAgICAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBwaG90b0J5dGVzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0KLSAgICAgICAgcHVibGljIFBob3RvRGF0YShpbnQgdHlwZSwgU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuZm9ybWF0TmFtZSA9IGZvcm1hdE5hbWU7Ci0gICAgICAgICAgICB0aGlzLnBob3RvQnl0ZXMgPSBwaG90b0J5dGVzOwotICAgICAgICAgICAgdGhpcy5pc1ByaW1hcnkgPSBpc1ByaW1hcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBob3RvRGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQaG90b0RhdGEgcGhvdG9EYXRhID0gKFBob3RvRGF0YSlvYmo7Ci0gICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gcGhvdG9EYXRhLnR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKGZvcm1hdE5hbWUgPT0gbnVsbCA/IChwaG90b0RhdGEuZm9ybWF0TmFtZSA9PSBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0TmFtZS5lcXVhbHMocGhvdG9EYXRhLmZvcm1hdE5hbWUpKSAmJgotICAgICAgICAgICAgICAgICAgICAoQXJyYXlzLmVxdWFscyhwaG90b0J5dGVzLCBwaG90b0RhdGEucGhvdG9CeXRlcykpICYmCi0gICAgICAgICAgICAgICAgICAgIChpc1ByaW1hcnkgPT0gcGhvdG9EYXRhLmlzUHJpbWFyeSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgidHlwZTogJWQsIGZvcm1hdDogJXM6IHNpemU6ICVkLCBpc1ByaW1hcnk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZSwgZm9ybWF0TmFtZSwgcGhvdG9CeXRlcy5sZW5ndGgsIGlzUHJpbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBtUGFyYW1ldGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PigpOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUHJvcGVydHlWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbVByb3BlcnR5Qnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIHBhcmFtVmFsdWUpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXM7Ci0gICAgICAgICAgICBpZiAoIW1QYXJhbWV0ZXJNYXAuY29udGFpbnNLZXkocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1QYXJhbWV0ZXJNYXAuZ2V0KHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKHBhcmFtVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVG9Qcm9wZXJ0eVZhbHVlTGlzdChmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmFkZChwcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5Qnl0ZXMoZmluYWwgYnl0ZVtdIHByb3BlcnR5Qnl0ZXMpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eUJ5dGVzID0gcHJvcGVydHlCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFyYW1ldGVycyhTdHJpbmcgdHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJNYXAuZ2V0KHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRQcm9wZXJ0eVZhbHVlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIG1Qcm9wZXJ0eU5hbWUgPSBudWxsOwotICAgICAgICAgICAgbVBhcmFtZXRlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgbVByb3BlcnR5VmFsdWVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUHJvcGVydHlCeXRlcyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPKGRtaXlha2F3YSk6IHZDYXJkIDQuMCBsb2dpY2FsbHkgaGFzIG11bHRpcGxlIGZvcm1hdHRlZCBuYW1lcyBhbmQgd2UgbmVlZCB0bwotICAgIC8vIHNlbGVjdCB0aGUgbW9zdCBwcmVmZXJhYmxlIG9uZSB1c2luZyBQUkVGIHBhcmFtZXRlci4KLSAgICAvLwotICAgIC8vIGUuZy4gKGJhc2VkIG9uIHJldi4xMykKLSAgICAvLyBGTjtQUkVGPTE6Sm9obiBNLiBEb2UKLSAgICAvLyBGTjtQUkVGPTI6Sm9obiBEb2UKLSAgICAvLyBGTjtQUkVGPTM7Sm9obgotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZhbWlseU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUdpdmVuTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTWlkZGxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUHJlZml4OwotICAgIHByaXZhdGUgU3RyaW5nIG1TdWZmaXg7Ci0KLSAgICAvLyBVc2VkIG9ubHkgd2hlbiBubyBmYW1pbHkgbm9yIGdpdmVuIG5hbWUgaXMgZm91bmQuCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUZvcm1hdHRlZE5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZXRpY0dpdmVuTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGhvbmV0aWNNaWRkbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVBob25ldGljRnVsbE5hbWU7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTmlja05hbWVMaXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbUJpcnRoZGF5OwotICAgIHByaXZhdGUgU3RyaW5nIG1Bbm5pdmVyc2FyeTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1Ob3RlTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8UGhvbmVEYXRhPiBtUGhvbmVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxFbWFpbERhdGE+IG1FbWFpbExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFBvc3RhbERhdGE+IG1Qb3N0YWxMaXN0OwotICAgIHByaXZhdGUgTGlzdDxPcmdhbml6YXRpb25EYXRhPiBtT3JnYW5pemF0aW9uTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW1EYXRhPiBtSW1MaXN0OwotICAgIHByaXZhdGUgTGlzdDxQaG90b0RhdGE+IG1QaG90b0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVdlYnNpdGVMaXN0OwotICAgIHByaXZhdGUgTGlzdDxMaXN0PFN0cmluZz4+IG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeSgpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHRoaXModmNhcmRUeXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeShpbnQgdmNhcmRUeXBlLCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgbVZDYXJkVHlwZSA9IHZjYXJkVHlwZTsKLSAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQaG9uZShpbnQgdHlwZSwgU3RyaW5nIGRhdGEsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1QaG9uZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbVBob25lTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhvbmVEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0cmltZWQgPSBkYXRhLnRyaW0oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZE51bWJlcjsKLSAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9QQUdFUiB8fCBWQ2FyZENvbmZpZy5yZWZyYWluUGhvbmVOdW1iZXJGb3JtYXR0aW5nKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSB0cmltZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdHJpbWVkLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0cmltZWQuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykgfHwgKGkgPT0gMCAmJiBjaCA9PSAnKycpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBmb3JtYXR0aW5nVHlwZSA9IFZDYXJkVXRpbHMuZ2V0UGhvbmVOdW1iZXJGb3JtYXQobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXIgPSBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcihidWlsZGVyLnRvU3RyaW5nKCksIGZvcm1hdHRpbmdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBQaG9uZURhdGEgcGhvbmVEYXRhID0gbmV3IFBob25lRGF0YSh0eXBlLCBmb3JtYXR0ZWROdW1iZXIsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICBtUGhvbmVMaXN0LmFkZChwaG9uZURhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROaWNrTmFtZShmaW5hbCBTdHJpbmcgbmlja05hbWUpIHsKLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5pY2tOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIG1OaWNrTmFtZUxpc3QuYWRkKG5pY2tOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRW1haWwoaW50IHR5cGUsIFN0cmluZyBkYXRhLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1FbWFpbExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUVtYWlsTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW1haWxEYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1FbWFpbExpc3QuYWRkKG5ldyBFbWFpbERhdGEodHlwZSwgZGF0YSwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQb3N0YWwoaW50IHR5cGUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNQcmltYXJ5KXsKLSAgICAgICAgaWYgKG1Qb3N0YWxMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Qb3N0YWxMaXN0ID0gbmV3IEFycmF5TGlzdDxQb3N0YWxEYXRhPigwKTsKLSAgICAgICAgfQotICAgICAgICBtUG9zdGFsTGlzdC5hZGQobmV3IFBvc3RhbERhdGEodHlwZSwgcHJvcFZhbHVlTGlzdCwgbGFiZWwsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgdmlhIHtAbGluayAjaGFuZGxlT3JnVmFsdWUoaW50LCBMaXN0LCBNYXAsIGJvb2xlYW4pIG9yCi0gICAgICoge0BsaW5rICNoYW5kbGVUaXRsZVZhbHVlKFN0cmluZyl9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGROZXdPcmdhbml6YXRpb24oaW50IHR5cGUsIGZpbmFsIFN0cmluZyBjb21wYW55TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXBhcnRtZW50TmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGhvbmV0aWNOYW1lLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1Pcmdhbml6YXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Pcmdhbml6YXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxPcmdhbml6YXRpb25EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1Pcmdhbml6YXRpb25MaXN0LmFkZChuZXcgT3JnYW5pemF0aW9uRGF0YSh0eXBlLCBjb21wYW55TmFtZSwKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSwgdGl0bGVOYW1lLCBwaG9uZXRpY05hbWUsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBzRW1wdHlMaXN0ID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDxTdHJpbmc+KDApKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkU2luZ2xlUGhvbmV0aWNOYW1lRnJvbVNvcnRBc1BhcmFtKE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGFyYW1NYXApIHsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRBc0NvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fU09SVF9BUyk7Ci0gICAgICAgIGlmIChzb3J0QXNDb2xsZWN0aW9uICE9IG51bGwgJiYgc29ydEFzQ29sbGVjdGlvbi5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNvcnRBc0NvbGxlY3Rpb24uc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbmNvcnJlY3QgbXVsdGlwbGUgU09SVF9BUyBwYXJhbWV0ZXJzIGRldGVjdGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhzb3J0QXNDb2xsZWN0aW9uLnRvQXJyYXkoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNvcnROYW1lcyA9Ci0gICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShzb3J0QXNDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGVsZW0gOiBzb3J0TmFtZXMpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlbGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCAiT1JHIiByZWxhdGVkIHZhbHVlcyB0byB0aGUgYXBwcm9wcmlhdGUgZGF0YS4gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lCi0gICAgICoge0BsaW5rIE9yZ2FuaXphdGlvbkRhdGF9IG9iamVjdHMsIHRoaXMgaW5wdXQgZGF0YSBhcmUgYXR0YWNoZWQgdG8gdGhlIGxhc3Qgb25lIHdoaWNoCi0gICAgICogZG9lcyBub3QgaGF2ZSB2YWxpZCB2YWx1ZXMgKG5vdCBpbmNsdWRpbmcgZW1wdHkgYnV0IG9ubHkgbnVsbCkuIElmIHRoZXJlJ3Mgbm8KLSAgICAgKiB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gb2JqZWN0LCBhIG5ldyB7QGxpbmsgT3JnYW5pemF0aW9uRGF0YX0gaXMgY3JlYXRlZCwKLSAgICAgKiB3aG9zZSB0aXRsZSBpcyBzZXQgdG8gbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlT3JnVmFsdWUoZmluYWwgaW50IHR5cGUsIExpc3Q8U3RyaW5nPiBvcmdMaXN0LAotICAgICAgICAgICAgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZSA9IGJ1aWxkU2luZ2xlUGhvbmV0aWNOYW1lRnJvbVNvcnRBc1BhcmFtKHBhcmFtTWFwKTsKLSAgICAgICAgaWYgKG9yZ0xpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgb3JnTGlzdCA9IHNFbXB0eUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBhbnlOYW1lOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwYXJ0bWVudE5hbWU7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gb3JnTGlzdC5zaXplKCk7Ci0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgICAgICAgY29tcGFueU5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICBkZXBhcnRtZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICBjb21wYW55TmFtZSA9IG9yZ0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6IHsgIC8vIE1vcmUgdGhhbiAxLgotICAgICAgICAgICAgICAgIGNvbXBhbnlOYW1lID0gb3JnTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IHN1cmUgd2hpY2ggaXMgdGhlIGNvcnJlY3Qgc3RyaW5nIGZvciBkZXBhcnRtZW50LgotICAgICAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGtlZXAgYWxsIHRoZSBkYXRhLCBjb25jYXRpbmF0ZSB0aGUgcmVzdCBvZiBlbGVtZW50cy4KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChvcmdMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlcGFydG1lbnROYW1lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGZpcnN0IG9yZ2FuaXphdGlvbiBlbnRyeSwgd2l0aCAibnVsbCIgdGl0bGUgd2hpY2ggbWF5IGJlCi0gICAgICAgICAgICAvLyBhZGRlZCB2aWEgaGFuZGxlVGl0bGVWYWx1ZSgpLgotICAgICAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgbnVsbCwgcGhvbmV0aWNOYW1lLCBpc1ByaW1hcnkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT3JnYW5pemF0aW9uRGF0YSBvcmdhbml6YXRpb25EYXRhIDogbU9yZ2FuaXphdGlvbkxpc3QpIHsKLSAgICAgICAgICAgIC8vIE5vdCB1c2UgVGV4dFV0aWxzLmlzRW1wdHkoKSBzaW5jZSBPUkcgd2FzIHNldCBidXQgdGhlIGVsZW1lbnRzIG1pZ2h0IGJlIGVtcHR5LgotICAgICAgICAgICAgLy8gZS5nLiAiT1JHO1BSRUY6OyIgLT4gQm90aCBjb21wYW55TmFtZSBhbmQgZGVwYXJ0bWVudE5hbWUgYmVjb21lIGVtcHR5IGJ1dCBub3QgbnVsbC4KLSAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJvYmFibHkgdGhlICJUSVRMRSIgcHJvcGVydHkgY29tZXMgYmVmb3JlIHRoZSAiT1JHIiBwcm9wZXJ0eSB2aWEKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGVUaXRsZUxpbmUoKS4KLSAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lID0gY29tcGFueU5hbWU7Ci0gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSA9IGRlcGFydG1lbnROYW1lOwotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEuaXNQcmltYXJ5ID0gaXNQcmltYXJ5OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBObyBPcmdhbml6YXRpb0RhdGEgaXMgYXZhaWxhYmxlLiBDcmVhdGUgYW5vdGhlciBvbmUsIHdpdGggIm51bGwiIHRpdGxlLCB3aGljaCBtYXkgYmUKLSAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZVRpdGxlVmFsdWUoKS4KLSAgICAgICAgYWRkTmV3T3JnYW5pemF0aW9uKHR5cGUsIGNvbXBhbnlOYW1lLCBkZXBhcnRtZW50TmFtZSwgbnVsbCwgcGhvbmV0aWNOYW1lLCBpc1ByaW1hcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCAidGl0bGUiIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBkYXRhLiBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUKLSAgICAgKiBPcmdhbml6YXRpb25EYXRhIG9iamVjdHMsIHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gdGhlIGxhc3Qgb25lIHdoaWNoIGRvZXMgbm90Ci0gICAgICogaGF2ZSB2YWxpZCB0aXRsZSB2YWx1ZSAobm90IGluY2x1ZGluZyBlbXB0eSBidXQgb25seSBudWxsKS4gSWYgdGhlcmUncyBubwotICAgICAqIE9yZ2FuaXphdGlvbkRhdGEgb2JqZWN0LCBhIG5ldyBPcmdhbml6YXRpb25EYXRhIGlzIGNyZWF0ZWQsIHdob3NlIGNvbXBhbnkgbmFtZSBpcwotICAgICAqIHNldCB0byBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUaXRsZVZhbHVlKGZpbmFsIFN0cmluZyB0aXRsZSkgewotICAgICAgICBpZiAobU9yZ2FuaXphdGlvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBmaXJzdCBvcmdhbml6YXRpb24gZW50cnksIHdpdGggIm51bGwiIG90aGVyIGluZm8sIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGhhbmRsZU9yZ1ZhbHVlKCkuCi0gICAgICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbkRhdGEudGl0bGVOYW1lID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIE9yZ2FuaXphdGlvbiBpcyBhdmFpbGFibGUuIENyZWF0ZSBhbm90aGVyIG9uZSwgd2l0aCAibnVsbCIgb3RoZXIgaW5mbywgd2hpY2ggbWF5IGJlCi0gICAgICAgIC8vIGFkZGVkIHZpYSBoYW5kbGVPcmdWYWx1ZSgpLgotICAgICAgICBhZGROZXdPcmdhbml6YXRpb24oREVGQVVMVF9PUkdBTklaQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgdGl0bGUsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW0oaW50IHByb3RvY29sLCBTdHJpbmcgY3VzdG9tUHJvdG9jb2wsIGludCB0eXBlLAotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSwgYm9vbGVhbiBpc1ByaW1hcnkpIHsKLSAgICAgICAgaWYgKG1JbUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbUltTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW1EYXRhPigpOwotICAgICAgICB9Ci0gICAgICAgIG1JbUxpc3QuYWRkKG5ldyBJbURhdGEocHJvdG9jb2wsIGN1c3RvbVByb3RvY29sLCB0eXBlLCBwcm9wVmFsdWUsIGlzUHJpbWFyeSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROb3RlKGZpbmFsIFN0cmluZyBub3RlKSB7Ci0gICAgICAgIGlmIChtTm90ZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgbU5vdGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotICAgICAgICB9Ci0gICAgICAgIG1Ob3RlTGlzdC5hZGQobm90ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBob3RvQnl0ZXMoU3RyaW5nIGZvcm1hdE5hbWUsIGJ5dGVbXSBwaG90b0J5dGVzLCBib29sZWFuIGlzUHJpbWFyeSkgewotICAgICAgICBpZiAobVBob3RvTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUGhvdG9MaXN0ID0gbmV3IEFycmF5TGlzdDxQaG90b0RhdGE+KDEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFBob3RvRGF0YSBwaG90b0RhdGEgPSBuZXcgUGhvdG9EYXRhKDAsIG51bGwsIHBob3RvQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgIG1QaG90b0xpc3QuYWRkKHBob3RvRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gZXh0cmFjdCBwYXJhbU1hcCwgY29uc3RydWN0cyBTT1JULUFTIHBhcmFtZXRlciB2YWx1ZXMsIGFuZCBzdG9yZSB0aGVtIGluCi0gICAgICogYXBwcm9wcmlhdGUgcGhvbmV0aWMgbmFtZSB2YXJpYWJsZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjYXJlIHRoZSB2Q2FyZCB2ZXJzaW9uLiBFdmVuIHdoZW4gd2UgaGF2ZSBTT1JULUFTIHBhcmFtZXRlcnMgaW4KLSAgICAgKiBpbnZhbGlkIHZlcnNpb25zIChpLmUuIDIuMSBhbmQgMy4wKSwgd2Ugc2NpbGVudGx5IGFjY2VwdCB0aGVtIHNvIHRoYXQgd2Ugd29uJ3QgZHJvcAotICAgICAqIG1lYW5pbmdmdWwgaW5mb3JtYXRpb24uIElmIHdlIGhhZCB0aGlzIHBhcmFtZXRlciBpbiB0aGUgTiBmaWVsZCBvZiB2Q2FyZCAzLjAsIGFuZAotICAgICAqIHRoZSBjb250YWN0IGRhdGEgYWxzbyBoYXZlIFNPUlQtU1RSSU5HLCB3ZSB3aWxsIHByZWZlciBTT1JULVNUUklORywgc2luY2UgaXQgaXMKLSAgICAgKiByZWdpdGltYXRlIHByb3BlcnR5IHRvIGJlIHVuZGVyc3Rvb2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRyeUhhbmRsZVNvcnRBc05hbWUoZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBwYXJhbU1hcCkgewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBzb3J0QXNDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1NPUlRfQVMpOwotICAgICAgICBpZiAoc29ydEFzQ29sbGVjdGlvbiAhPSBudWxsICYmIHNvcnRBc0NvbGxlY3Rpb24uc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzb3J0QXNDb2xsZWN0aW9uLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW5jb3JyZWN0IG11bHRpcGxlIFNPUlRfQVMgcGFyYW1ldGVycyBkZXRlY3RlZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoc29ydEFzQ29sbGVjdGlvbi50b0FycmF5KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBzb3J0TmFtZXMgPQotICAgICAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUoc29ydEFzQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGludCBzaXplID0gc29ydE5hbWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMykgewotICAgICAgICAgICAgICAgIHNpemUgPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgICAgICBjYXNlIDM6IG1QaG9uZXRpY01pZGRsZU5hbWUgPSBzb3J0TmFtZXMuZ2V0KDIpOyAvLyRGQUxMLVRIUk9VR0gkCi0gICAgICAgICAgICBjYXNlIDI6IG1QaG9uZXRpY0dpdmVuTmFtZSA9IHNvcnROYW1lcy5nZXQoMSk7IC8vJEZBTEwtVEhST1VHSCQKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBzb3J0TmFtZXMuZ2V0KDApOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5Qcm9wZXJ0eShmaW5hbCBMaXN0PFN0cmluZz4gcGFyYW1WYWx1ZXMsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwKSB7Ci0gICAgICAgIC8vIGluIHZDYXJkIDQuMCwgU09SVC1BUyBwYXJhbWV0ZXIgaXMgYXZhaWxhYmxlLgotICAgICAgICB0cnlIYW5kbGVTb3J0QXNOYW1lKHBhcmFtTWFwKTsKLQotICAgICAgICAvLyBGYW1pbHksIEdpdmVuLCBNaWRkbGUsIFByZWZpeCwgU3VmZml4LiAoMSAtIDUpCi0gICAgICAgIGludCBzaXplOwotICAgICAgICBpZiAocGFyYW1WYWx1ZXMgPT0gbnVsbCB8fCAoc2l6ZSA9IHBhcmFtVmFsdWVzLnNpemUoKSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPiA1KSB7Ci0gICAgICAgICAgICBzaXplID0gNTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc2l6ZSkgewotICAgICAgICAvLyBGYWxsLXRocm91Z2guCi0gICAgICAgIGNhc2UgNTogbVN1ZmZpeCA9IHBhcmFtVmFsdWVzLmdldCg0KTsKLSAgICAgICAgY2FzZSA0OiBtUHJlZml4ID0gcGFyYW1WYWx1ZXMuZ2V0KDMpOwotICAgICAgICBjYXNlIDM6IG1NaWRkbGVOYW1lID0gcGFyYW1WYWx1ZXMuZ2V0KDIpOwotICAgICAgICBjYXNlIDI6IG1HaXZlbk5hbWUgPSBwYXJhbVZhbHVlcy5nZXQoMSk7Ci0gICAgICAgIGRlZmF1bHQ6IG1GYW1pbHlOYW1lID0gcGFyYW1WYWx1ZXMuZ2V0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZTogU29tZSBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzIHVzZSB0aGlzIGZpZWxkIGZvciBwaG9uZXRpYyBuYW1lLAotICAgICAqICAgICAgIHNpbmNlIHZDYXJkIDIuMSBkb2VzIG5vdCBoYXZlICJTT1JULVNUUklORyIgdHlwZS4KLSAgICAgKiAgICAgICBBbHNvLCBpbiBzb21lIGNhc2VzLCB0aGUgZmllbGQgaGFzIHNvbWUgJzsncyBpbiBpdC4KLSAgICAgKiAgICAgICBBc3N1bWUgdGhlICc7JyBtZWFucyB0aGUgc2FtZSBtZWFuaW5nIGluIE4gcHJvcGVydHkKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZmFsbHRocm91Z2giKQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQaG9uZXRpY05hbWVGcm9tU291bmQoTGlzdDxTdHJpbmc+IGVsZW1zKSB7Ci0gICAgICAgIGlmICghKFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0ZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljTWlkZGxlTmFtZSkgJiYKLSAgICAgICAgICAgICAgICBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNHaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGUgb3RoZXIgcHJvcGVydGllcyBsaWtlICJYLVBIT05FVElDLUZJUlNULU5BTUUiIHdhcyBhbHJlYWR5IGZvdW5kLgotICAgICAgICAgICAgLy8gSWdub3JlICJTT1VORDtYLUlSTUMtTiIuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgaWYgKGVsZW1zID09IG51bGwgfHwgKHNpemUgPSBlbGVtcy5zaXplKCkpIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIG9yZGVyIGlzICJGYW1pbHksIEdpdmVuLCBNaWRkbGUiLgotICAgICAgICAvLyBUaGlzIGlzIG5vdCBmcm9tIHNwZWNpZmljYXRpb24gYnV0IG1lcmUgYXNzdW1wdGlvbi4gU29tZSBKYXBhbmVzZSBwaG9uZXMgdXNlIHRoaXMgb3JkZXIuCi0gICAgICAgIGlmIChzaXplID4gMykgewotICAgICAgICAgICAgc2l6ZSA9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbXMuZ2V0KDApLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChlbGVtcy5nZXQoaSkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ubHlGaXJzdEVsZW1Jc05vbkVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbmx5Rmlyc3RFbGVtSXNOb25FbXB0eSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVzQXJyYXkgPSBlbGVtcy5nZXQoMCkuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmFtZUFycmF5TGVuZ3RoID0gbmFtZXNBcnJheS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVBcnJheUxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgc3RyaW5nIGlzICJGYW1pbHkgTWlkZGxlIEdpdmVuIi4KLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSA9IG5hbWVzQXJyYXlbMF07Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY01pZGRsZU5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzJdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZUFycmF5TGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBzdHJpbmcgaXMgIkZhbWlseSBHaXZlbiIgYmFzZWQgb24gdGhlIEphcGFuZXNlIG1vYmlsZQotICAgICAgICAgICAgICAgICAgICAvLyBwaG9uZXMnIHByZWZlcmVuY2UuCi0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBuYW1lc0FycmF5WzBdOwotICAgICAgICAgICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBuYW1lc0FycmF5WzFdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QaG9uZXRpY0Z1bGxOYW1lID0gZWxlbXMuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHNpemUpIHsKLSAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCi0gICAgICAgICAgICBjYXNlIDM6IG1QaG9uZXRpY01pZGRsZU5hbWUgPSBlbGVtcy5nZXQoMik7Ci0gICAgICAgICAgICBjYXNlIDI6IG1QaG9uZXRpY0dpdmVuTmFtZSA9IGVsZW1zLmdldCgxKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShmaW5hbCBQcm9wZXJ0eSBwcm9wZXJ0eSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5tUHJvcGVydHlOYW1lOwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBhcmFtTWFwID0gcHJvcGVydHkubVBhcmFtZXRlck1hcDsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QgPSBwcm9wZXJ0eS5tUHJvcGVydHlWYWx1ZUxpc3Q7Ci0gICAgICAgIGJ5dGVbXSBwcm9wQnl0ZXMgPSBwcm9wZXJ0eS5tUHJvcGVydHlCeXRlczsKLQotICAgICAgICBpZiAocHJvcFZhbHVlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcocHJvcFZhbHVlTGlzdCkudHJpbSgpOwotCi0gICAgICAgIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIC8vIHZDYXJkIHZlcnNpb24uIElnbm9yZSB0aGlzLgotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9GTikpIHsKLSAgICAgICAgICAgIG1Gb3JtYXR0ZWROYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OQU1FKSAmJiBtRm9ybWF0dGVkTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGluIHZDYXJkIDMuMC4gVXNlIHRoaXMgaWYgRk4sIHdoaWNoIG11c3QgZXhpc3QgaW4gdkNhcmQgMy4wIGJ1dCBtYXkgbm90Ci0gICAgICAgICAgICAvLyBhY3R1YWxseSBleGlzdCBpbiB0aGUgcmVhbCB2Q2FyZCBkYXRhLCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgIG1Gb3JtYXR0ZWROYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OKSkgewotICAgICAgICAgICAgaGFuZGxlTlByb3BlcnR5KHByb3BWYWx1ZUxpc3QsIHBhcmFtTWFwKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfU09SVF9TVFJJTkcpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNGdWxsTmFtZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTklDS05BTUUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLkltcG9ydE9ubHkuUFJPUEVSVFlfWF9OSUNLTkFNRSkpIHsKLSAgICAgICAgICAgIGFkZE5pY2tOYW1lKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1NPVU5EKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgdHlwZUNvbGxlY3Rpb24uY29udGFpbnMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9YX0lSTUNfTikpIHsKLSAgICAgICAgICAgICAgICAvLyBBcyBvZiAyMDA5LTEwLTA4LCBQYXJzZXIgc2lkZSBkb2VzIG5vdCBzcGxpdCBhIHByb3BlcnR5IHZhbHVlIGludG8gc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgLy8gdmFsdWVzIHVzaW5nICc7JyAoaW4gb3RoZXIgd29yZHMsIHByb3BWYWx1ZUxpc3Quc2l6ZSgpID09IDEpLAotICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvcnJlY3QgYmVoYXZpb3IgZnJvbSB0aGUgdmlldyBvZiB2Q2FyZCAyLjEuCi0gICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgaXQgdG8gYmUgc2VwYXJhdGVkLCBzbyBkbyB0aGUgc2VwYXJhdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwaG9uZXRpY05hbWVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wVmFsdWUsIG1WQ2FyZFR5cGUpOwotICAgICAgICAgICAgICAgIGhhbmRsZVBob25ldGljTmFtZUZyb21Tb3VuZChwaG9uZXRpY05hbWVMaXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgZmllbGQgc2luY2UgQW5kcm9pZCBjYW5ub3QgdW5kZXJzdGFuZCB3aGF0IGl0IGlzLgotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9BRFIpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHZhbHVlc0FyZUFsbEVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcHJvcFZhbHVlTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzQXJlQWxsRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlc0FyZUFsbEVtcHR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gIiI7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9IT01FOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VYVFJBX1RZUEVfQ09NUEFOWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJDT01QQU5ZIiBzZWVtcyBlbWl0dGVkIGJ5IFdpbmRvd3MgTW9iaWxlLCB3aGljaCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljYWxseSBzdXBwb3J0ZWQgYnkgdkNhcmQgMi4xLiBXZSBhc3N1bWUgdGhpcyBpcyBzYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyAiV09SSyIuCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUks7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0FEUl9UWVBFX1BBUkNFTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9BRFJfVFlQRV9ET00pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fQURSX1RZUEVfSU5UTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIGFueSBhcHByb3ByaWF0ZSB3YXkgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nID0gdHlwZVN0cmluZy5zdWJzdHJpbmcoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2Q2FyZCAzLjAgYWxsb3dzIGlhbmEtdG9rZW4uIEFsc28gc29tZSB2Q2FyZCAyLjEgZXhwb3J0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IG5vbi1zdGFuZGFyZCB0eXBlcy4gV2UgZG8gbm90IGhhbmRsZSB0aGVpciB2YWx1ZXMgbm93LgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT007Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSB1c2UgIkhPTUUiIGFzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUG9zdGFsKHR5cGUsIHByb3BWYWx1ZUxpc3QsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9FTUFJTCkpIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gLTE7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVN0cmluZyA6IHR5cGVDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBFbWFpbC5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZVN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9XT1JLKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NFTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gRW1haWwuVFlQRV9NT0JJTEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5zdGFydHNXaXRoKCJYLSIpICYmIHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVTdHJpbmcuc3Vic3RyaW5nKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFsbG93cyBpYW5hLXRva2VuLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgSU5URVJORVQgKHNwZWNpZmllZCBpbiB2Q2FyZCBzcGVjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDSE9PTCwgZXRjLgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfQ1VTVE9NOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB0eXBlU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHR5cGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEVtYWlsLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRFbWFpbCh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9PUkcpKSB7Ci0gICAgICAgICAgICAvLyB2Q2FyZCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgb3RoZXIgdHlwZXMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IE9yZ2FuaXphdGlvbi5UWVBFX1dPUks7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJpbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoYW5kbGVPcmdWYWx1ZSh0eXBlLCBwcm9wVmFsdWVMaXN0LCBwYXJhbU1hcCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfVElUTEUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVUaXRsZVZhbHVlKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1JPTEUpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNvbmZsaWN0cyB3aXRoIFRJVExFLiBJZ25vcmUgZm9yIG5vdy4uLgotICAgICAgICAgICAgLy8gaGFuZGxlVGl0bGVWYWx1ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9QSE9UTykgfHwKLSAgICAgICAgICAgICAgICBwcm9wTmFtZS5lcXVhbHMoVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfTE9HTykpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbU1hcFZhbHVlID0gcGFyYW1NYXAuZ2V0KCJWQUxVRSIpOwotICAgICAgICAgICAgaWYgKHBhcmFtTWFwVmFsdWUgIT0gbnVsbCAmJiBwYXJhbU1hcFZhbHVlLmNvbnRhaW5zKCJVUkwiKSkgewotICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkbyBub3QgaGF2ZSBhcHByb3ByaWF0ZSBleGFtcGxlIGZvciB0ZXN0aW5nIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KCJUWVBFIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZVZhbHVlIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYuZXF1YWxzKHR5cGVWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXROYW1lID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdE5hbWUgPSB0eXBlVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUGhvdG9CeXRlcyhmb3JtYXROYW1lLCBwcm9wQnl0ZXMsIGlzUHJpbWFyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1RFTCkpIHsKLSAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0eXBlQ29sbGVjdGlvbiA9IHBhcmFtTWFwLmdldChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0eXBlT2JqZWN0ID0KLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmdldFBob25lVHlwZUZyb21TdHJpbmdzKHR5cGVDb2xsZWN0aW9uLCBwcm9wVmFsdWUpOwotICAgICAgICAgICAgZmluYWwgaW50IHR5cGU7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGFiZWw7Ci0gICAgICAgICAgICBpZiAodHlwZU9iamVjdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gKEludGVnZXIpdHlwZU9iamVjdDsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHR5cGVPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1ByaW1hcnk7Ci0gICAgICAgICAgICBpZiAodHlwZUNvbGxlY3Rpb24gIT0gbnVsbCAmJiB0eXBlQ29sbGVjdGlvbi5jb250YWlucyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1BSRUYpKSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRQaG9uZSh0eXBlLCBwcm9wVmFsdWUsIGxhYmVsLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1BTVE5OVU1CRVIpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcGhvbmUgbnVtYmVyIGF2YWlsYWJsZSB2aWEgU2t5cGUuCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUNvbGxlY3Rpb24gPSBwYXJhbU1hcC5nZXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IFBob25lLlRZUEVfT1RIRVI7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUHJpbWFyeTsKLSAgICAgICAgICAgIGlmICh0eXBlQ29sbGVjdGlvbiAhPSBudWxsICYmIHR5cGVDb2xsZWN0aW9uLmNvbnRhaW5zKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1ByaW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFBob25lKHR5cGUsIHByb3BWYWx1ZSwgbnVsbCwgaXNQcmltYXJ5KTsKLSAgICAgICAgfSBlbHNlIGlmIChzSW1NYXAuY29udGFpbnNLZXkocHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdG9jb2wgPSBzSW1NYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHR5cGVDb2xsZWN0aW9uID0gcGFyYW1NYXAuZ2V0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEUpOwotICAgICAgICAgICAgaWYgKHR5cGVDb2xsZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlU3RyaW5nIDogdHlwZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJpbWFyeSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLmVxdWFsc0lnbm9yZUNhc2UoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9IT01FKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1dPUkspKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEltLlRZUEVfV09SSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlIDwgMCkgewotICAgICAgICAgICAgICAgIHR5cGUgPSBJbS5UWVBFX0hPTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRJbShwcm90b2NvbCwgbnVsbCwgdHlwZSwgcHJvcFZhbHVlLCBpc1ByaW1hcnkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9OT1RFKSkgewotICAgICAgICAgICAgYWRkTm90ZShwcm9wVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9VUkwpKSB7Ci0gICAgICAgICAgICBpZiAobVdlYnNpdGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtV2Vic2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtV2Vic2l0ZUxpc3QuYWRkKHByb3BWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0JEQVkpKSB7Ci0gICAgICAgICAgICBtQmlydGhkYXkgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX0FOTklWRVJTQVJZKSkgewotICAgICAgICAgICAgbUFubml2ZXJzYXJ5ID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0ZJUlNUX05BTUUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNHaXZlbk5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfUEhPTkVUSUNfTUlERExFX05BTUUpKSB7Ci0gICAgICAgICAgICBtUGhvbmV0aWNNaWRkbGVOYW1lID0gcHJvcFZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1BIT05FVElDX0xBU1RfTkFNRSkpIHsKLSAgICAgICAgICAgIG1QaG9uZXRpY0ZhbWlseU5hbWUgPSBwcm9wVmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfQU5EUk9JRF9DVVNUT00pKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLmNvbnN0cnVjdExpc3RGcm9tVmFsdWUocHJvcFZhbHVlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFuZHJvaWRDdXN0b21Qcm9wZXJ0eShmaW5hbCBMaXN0PFN0cmluZz4gY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdDxTdHJpbmc+PigpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmRyb2lkQ3VzdG9tUHJvcGVydHlMaXN0LmFkZChjdXN0b21Qcm9wZXJ0eUxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCB0aGUgZGlzcGxheSBuYW1lLiBUaGUgY29uc3RydWN0ZWQgZGF0YSBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3REaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgLy8gRnVsbE5hbWUgKGNyZWF0ZWQgdmlhICJGTiIgb3IgIk5BTUUiIGZpZWxkKSBpcyBwcmVmZXJlZC4KLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtRm9ybWF0dGVkTmFtZSkpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Gb3JtYXR0ZWROYW1lOwotICAgICAgICB9IGVsc2UgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobUZhbWlseU5hbWUpICYmIFRleHRVdGlscy5pc0VtcHR5KG1HaXZlbk5hbWUpKSkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gVkNhcmRVdGlscy5jb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKG1WQ2FyZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1GYW1pbHlOYW1lLCBtTWlkZGxlTmFtZSwgbUdpdmVuTmFtZSwgbVByZWZpeCwgbVN1ZmZpeCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKSAmJgotICAgICAgICAgICAgICAgIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0dpdmVuTmFtZSkpKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBWQ2FyZFV0aWxzLmNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMobVZDYXJkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbVBob25ldGljRmFtaWx5TmFtZSwgbVBob25ldGljTWlkZGxlTmFtZSwgbVBob25ldGljR2l2ZW5OYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRW1haWxMaXN0ICE9IG51bGwgJiYgbUVtYWlsTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtRW1haWxMaXN0LmdldCgwKS5kYXRhOwotICAgICAgICB9IGVsc2UgaWYgKG1QaG9uZUxpc3QgIT0gbnVsbCAmJiBtUGhvbmVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1QaG9uZUxpc3QuZ2V0KDApLmRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCAmJiBtUG9zdGFsTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtRGlzcGxheU5hbWUgPSBtUG9zdGFsTGlzdC5nZXQoMCkuZ2V0Rm9ybWF0dGVkQWRkcmVzcyhtVkNhcmRUeXBlKTsKLSAgICAgICAgfSBlbHNlIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsICYmIG1Pcmdhbml6YXRpb25MaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IG1Pcmdhbml6YXRpb25MaXN0LmdldCgwKS5nZXRGb3JtYXR0ZWRTdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zb2xpZGF0ZSBzZXZlcmFsIGZpZWxzZHMgKGxpa2UgbU5hbWUpIHVzaW5nIG5hbWUgY2FuZGlkYXRlcywKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25zb2xpZGF0ZUZpZWxkcygpIHsKLSAgICAgICAgY29uc3RydWN0RGlzcGxheU5hbWUoKTsKLQotICAgICAgICBpZiAobVBob25ldGljRnVsbE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbVBob25ldGljRnVsbE5hbWUgPSBtUGhvbmV0aWNGdWxsTmFtZS50cmltKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVXJpIHB1c2hJbnRvQ29udGVudFJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPiBvcGVyYXRpb25MaXN0ID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q29udGVudFByb3ZpZGVyT3BlcmF0aW9uPigpOwotICAgICAgICAvLyBBZnRlciBhcHBseWluZyB0aGUgYmF0Y2ggdGhlIGZpcnN0IHJlc3VsdCdzIFVyaSBpcyByZXR1cm5lZCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdAotICAgICAgICAvLyB0aGUgUmF3Q29udGFjdCBpcyB0aGUgZmlyc3Qgb3BlcmF0aW9uIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0Ci0gICAgICAgIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChSYXdDb250YWN0cy5DT05URU5UX1VSSSk7Ci0gICAgICAgIFN0cmluZyBteUdyb3Vwc0lkID0gbnVsbDsKLSAgICAgICAgaWYgKG1BY2NvdW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfTkFNRSwgbUFjY291bnQubmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShSYXdDb250YWN0cy5BQ0NPVU5UX1RZUEUsIG1BY2NvdW50LnR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBudWxsKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICBpZiAoIW5hbWVGaWVsZHNBcmVFbXB0eSgpKSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkTmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsIG1HaXZlbk5hbWUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsIG1GYW1pbHlOYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCBtTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsIG1QcmVmaXgpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZE5hbWUuU1VGRklYLCBtU3VmZml4KTsKLQotICAgICAgICAgICAgaWYgKCEoVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNNaWRkbGVOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNHaXZlbk5hbWUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCBtUGhvbmV0aWNGYW1pbHlOYW1lKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgbVBob25ldGljTWlkZGxlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGdWxsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCBtUGhvbmV0aWNGdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1OaWNrTmFtZUxpc3QgIT0gbnVsbCAmJiBtTmlja05hbWVMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5pY2tOYW1lIDogbU5pY2tOYW1lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOaWNrbmFtZS5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE5pY2tuYW1lLlRZUEUsIE5pY2tuYW1lLlRZUEVfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoTmlja25hbWUuTkFNRSwgbmlja05hbWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob25lTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob25lRGF0YSBwaG9uZURhdGEgOiBtUGhvbmVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob25lLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG9uZS5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5UWVBFLCBwaG9uZURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBob25lRGF0YS50eXBlID09IFBob25lLlRZUEVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFBob25lLkxBQkVMLCBwaG9uZURhdGEubGFiZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5OVU1CRVIsIHBob25lRGF0YS5kYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvbmVEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtT3JnYW5pemF0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9yZ2FuaXphdGlvbkRhdGEgb3JnYW5pemF0aW9uRGF0YSA6IG1Pcmdhbml6YXRpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKE9yZ2FuaXphdGlvbi5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uVFlQRSwgb3JnYW5pemF0aW9uRGF0YS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5jb21wYW55TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5DT01QQU5ZLCBvcmdhbml6YXRpb25EYXRhLmNvbXBhbnlOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbkRhdGEuZGVwYXJ0bWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgb3JnYW5pemF0aW9uRGF0YS5kZXBhcnRtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcmdhbml6YXRpb25EYXRhLnRpdGxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKE9yZ2FuaXphdGlvbi5USVRMRSwgb3JnYW5pemF0aW9uRGF0YS50aXRsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShPcmdhbml6YXRpb24uUEhPTkVUSUNfTkFNRSwgb3JnYW5pemF0aW9uRGF0YS5waG9uZXRpY05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9uRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoT3JnYW5pemF0aW9uLklTX1BSSU1BUlksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbWFpbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbWFpbERhdGEgZW1haWxEYXRhIDogbUVtYWlsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShFbWFpbC5SQVdfQ09OVEFDVF9JRCwgMCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpOwotCi0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuVFlQRSwgZW1haWxEYXRhLnR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEudHlwZSA9PSBFbWFpbC5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShFbWFpbC5MQUJFTCwgZW1haWxEYXRhLmxhYmVsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRW1haWwuREFUQSwgZW1haWxEYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChlbWFpbERhdGEuaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBvc3RhbExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQb3N0YWxEYXRhIHBvc3RhbERhdGEgOiBtUG9zdGFsTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMuaW5zZXJ0U3RydWN0dXJlZFBvc3RhbERhdGFVc2luZ0NvbnRhY3RzU3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVZDYXJkVHlwZSwgYnVpbGRlciwgcG9zdGFsRGF0YSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSW1EYXRhIGltRGF0YSA6IG1JbUxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoSW0uUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEltLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShJbS5UWVBFLCBpbURhdGEudHlwZSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uUFJPVE9DT0wsIGltRGF0YS5wcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoSW0uREFUQSwgaW1EYXRhLmRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChpbURhdGEucHJvdG9jb2wgPT0gSW0uUFJPVE9DT0xfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEltLkNVU1RPTV9QUk9UT0NPTCwgaW1EYXRhLmN1c3RvbVByb3RvY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGltRGF0YS5pc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTm90ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgbm90ZSA6IG1Ob3RlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShOb3RlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShOb3RlLk5PVEUsIG5vdGUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVBob3RvTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBob3RvRGF0YSBwaG90b0RhdGEgOiBtUGhvdG9MaXN0KSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWVCYWNrUmVmZXJlbmNlKFBob3RvLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBQaG90by5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoUGhvdG8uUEhPVE8sIHBob3RvRGF0YS5waG90b0J5dGVzKTsKLSAgICAgICAgICAgICAgICBpZiAocGhvdG9EYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShQaG90by5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtV2Vic2l0ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgd2Vic2l0ZSA6IG1XZWJzaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24ubmV3SW5zZXJ0KERhdGEuQ09OVEVOVF9VUkkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShXZWJzaXRlLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShEYXRhLk1JTUVUWVBFLCBXZWJzaXRlLkNPTlRFTlRfSVRFTV9UWVBFKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlVSTCwgd2Vic2l0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBVUkwgaW4gdkNhcmQuCi0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIFRZUEVfSE9NRVBBR0UgZm9yIHNhZmV0eS4KLSAgICAgICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShXZWJzaXRlLlRZUEUsIFdlYnNpdGUuVFlQRV9IT01FUEFHRSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUJpcnRoZGF5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUJpcnRoZGF5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobUFubml2ZXJzYXJ5KSkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRXZlbnQuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRXZlbnQuU1RBUlRfREFURSwgbUFubml2ZXJzYXJ5KTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpOwotICAgICAgICAgICAgb3BlcmF0aW9uTGlzdC5hZGQoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nPiBjdXN0b21Qcm9wZXJ0eUxpc3QgOiBtQW5kcm9pZEN1c3RvbVByb3BlcnR5TGlzdCkgewotICAgICAgICAgICAgICAgIGludCBzaXplID0gY3VzdG9tUHJvcGVydHlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgVGV4dFV0aWxzLmlzRW1wdHkoY3VzdG9tUHJvcGVydHlMaXN0LmdldCgwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplID4gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMSkgewotICAgICAgICAgICAgICAgICAgICBzaXplID0gVkNhcmRDb25zdGFudHMuTUFYX0RBVEFfQ09MVU1OICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tUHJvcGVydHlMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVByb3BlcnR5TGlzdC5zdWJMaXN0KDAsIFZDYXJkQ29uc3RhbnRzLk1BWF9EQVRBX0NPTFVNTiArIDIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXN0b21Qcm9wZXJ0eVZhbHVlIDogY3VzdG9tUHJvcGVydHlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGN1c3RvbVByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0luc2VydChEYXRhLkNPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShHcm91cE1lbWJlcnNoaXAuUkFXX0NPTlRBQ1RfSUQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gMSA8PSBpICYmIGkgPD0gTUFYX0RBVEFfQ09MVU1OUwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjdXN0b21Qcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKCJkYXRhIiArIGksIGN1c3RvbVByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG15R3JvdXBzSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoRGF0YS5DT05URU5UX1VSSSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoR3JvdXBNZW1iZXJzaGlwLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKERhdGEuTUlNRVRZUEUsIEdyb3VwTWVtYmVyc2hpcC5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShHcm91cE1lbWJlcnNoaXAuR1JPVVBfU09VUkNFX0lELCBteUdyb3Vwc0lkKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbkxpc3QuYWRkKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyUmVzdWx0W10gcmVzdWx0cyA9IHJlc29sdmVyLmFwcGx5QmF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250YWN0c0NvbnRyYWN0LkFVVEhPUklUWSwgb3BlcmF0aW9uTGlzdCk7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVzdWx0IGlzIGFsd2F5cyB0aGUgcmF3X2NvbnRhY3QuIHJldHVybiBpdCdzIHVyaSBzbwotICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgZm91bmQgbGF0ZXIuIGRvIG51bGwgY2hlY2tpbmcgZm9yIGJhZGx5IGJlaGF2aW5nCi0gICAgICAgICAgICAvLyBDb250ZW50UmVzb2x2ZXJzCi0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA9PSAwIHx8IHJlc3VsdHNbMF0gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHJlc3VsdHNbMF0udXJpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiJXM6ICVzIiwgZS50b1N0cmluZygpLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsIFN0cmluZy5mb3JtYXQoIiVzOiAlcyIsIGUudG9TdHJpbmcoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWQ2FyZEVudHJ5IGJ1aWxkRnJvbVJlc29sdmVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICByZXR1cm4gYnVpbGRGcm9tUmVzb2x2ZXIocmVzb2x2ZXIsIENvbnRhY3RzLkNPTlRFTlRfVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZDYXJkRW50cnkgYnVpbGRGcm9tUmVzb2x2ZXIoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBVcmkgdXJpKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5hbWVGaWVsZHNBcmVFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChUZXh0VXRpbHMuaXNFbXB0eShtRmFtaWx5TmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtTWlkZGxlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QcmVmaXgpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVN1ZmZpeCkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtRm9ybWF0dGVkTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuaXNFbXB0eShtUGhvbmV0aWNGYW1pbHlOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY01pZGRsZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmlzRW1wdHkobVBob25ldGljR2l2ZW5OYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5pc0VtcHR5KG1QaG9uZXRpY0Z1bGxOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZSgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFRvU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KXsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IGxpc3QpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh0eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBnZXR0ZXIgbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHksIHNpbmNlIHRoZXkgbWF5IGNoYW5nZQotICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgb2YgMjAwOS0xMC0wNSwgb24gd2hpY2ggSSBjYW5ub3QgYmUgc3VyZSB0aGlzIHN0cnVjdHVyZQotICAgIC8vIGlzIGNvbXBsZXRlbHkgY29uc29saWRhdGVkLgotICAgIC8vCi0gICAgLy8gQWxzbyBub3RlIHRoYXQgdGhlc2UgZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgb25seSBhZnRlcgotICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGJlaW5nIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LiBJZiBub3QsIGluY29ycmVjdAotICAgIC8vIHZhbHVlIHdpbGwgImJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgY2FjaGUgYW5kIiBiZSByZXR1cm5lZCB0byB5b3UuCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtRmFtaWx5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdpdmVuTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1HaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaWRkbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbU1pZGRsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgewotICAgICAgICByZXR1cm4gbVN1ZmZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdHRlZE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY0ZhbWlseU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNGYW1pbHlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNHaXZlbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNHaXZlbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQaG9uZXRpY01pZGRsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmV0aWNNaWRkbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNGdWxsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZXRpY0Z1bGxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tmlja05hbWVMaXN0KCkgewotICAgICAgICByZXR1cm4gbU5pY2tOYW1lTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpcnRoZGF5KCkgewotICAgICAgICByZXR1cm4gbUJpcnRoZGF5OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Tm90ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTm90ZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8UGhvbmVEYXRhPiBnZXRQaG9uZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtUGhvbmVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEVtYWlsRGF0YT4gZ2V0RW1haWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbUVtYWlsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQb3N0YWxEYXRhPiBnZXRQb3N0YWxMaXN0KCkgewotICAgICAgICByZXR1cm4gbVBvc3RhbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8T3JnYW5pemF0aW9uRGF0YT4gZ2V0T3JnYW5pemF0aW9uTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Pcmdhbml6YXRpb25MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEltRGF0YT4gZ2V0SW1MaXN0KCkgewotICAgICAgICByZXR1cm4gbUltTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTGlzdDxQaG90b0RhdGE+IGdldFBob3RvTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1QaG90b0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRXZWJzaXRlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJzaXRlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAobURpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnN0cnVjdERpc3BsYXlOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb21taXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjODA1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogPFA+Ci0gKiB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvbW1pdHMgdGhlIGVudHJ5IHRvIENvbnRlbnRSZXNvbHZlci4KLSAqIDwvUD4KLSAqIDxQPgotICogTm90ZTo8QlIgLz4KLSAqIEVhY2ggdkNhcmQgbWF5IGNvbnRhaW4gYmlnIHBob3RvIGltYWdlcyBlbmNvZGVkIGJ5IEJBU0U2NCwKLSAqIElmIHdlIHN0b3JlIGFsbCB2Q2FyZCBlbnRyaWVzIGluIG1lbW9yeSwgT3V0T2ZNZW1vcnlFcnJvciBtYXkgYmUgdGhyb3duLgotICogVGh1cywgdGhpcyBjbGFzcyBwdXNoIGVhY2ggVkNhcmQgZW50cnkgaW50byBDb250ZW50UmVzb2x2ZXIgaW1tZWRpYXRlbHkuCi0gKiA8L1A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEVudHJ5Q29tbWl0dGVyIGltcGxlbWVudHMgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRFbnRyeUNvbWl0dGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lVG9Db21taXQ7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8VXJpPiBtQ3JlYXRlZFVyaXMgPSBuZXcgQXJyYXlMaXN0PFVyaT4oKTsKLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29tbWl0dGVyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICBtQ29udGVudFJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZCgpIHsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLnNob3dQZXJmb3JtYW5jZUxvZygpKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCBTdHJpbmcuZm9ybWF0KCJ0aW1lIHRvIGNvbW1pdCBlbnRyaWVzOiAlZCBtcyIsIG1UaW1lVG9Db21taXQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKGZpbmFsIFZDYXJkRW50cnkgdmNhcmRFbnRyeSkgewotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1DcmVhdGVkVXJpcy5hZGQodmNhcmRFbnRyeS5wdXNoSW50b0NvbnRlbnRSZXNvbHZlcihtQ29udGVudFJlc29sdmVyKSk7Ci0gICAgICAgIG1UaW1lVG9Db21taXQgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNyZWF0ZWQgVXJpcy4gVGhpcyBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYnkgdGhlIGNhbGxlciBhcyBpdCBpcwotICAgICAqIG5vdCBhIGNsb25lLgotICAgICAqLwotICAgcHVibGljIEFycmF5TGlzdDxVcmk+IGdldENyZWF0ZWRVcmlzKCkgewotICAgICAgICByZXR1cm4gbUNyZWF0ZWRVcmlzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhM2UzZTIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRW50cnlDb25zdHJ1Y3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5CYXNlNjQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNoYXJzZXRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gaW1wbGVtZW50YXRpb24gd2hpY2ggZW5hYmxlcyB7QGxpbmsgVkNhcmRFbnRyeUhhbmRsZXJ9IG9iamVjdHMKLSAqIHRvIGVhc2lseSBoYW5kbGUgZWFjaCB2Q2FyZCBlbnRyeS4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB1bmRlcnN0YW5kIGRldGFpbHMgaW5zaWRlIHZDYXJkIGFuZCB0cmFuc2xhdGVzIGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5fS4KLSAqIFRoZW4gdGhlIGNsYXNzIHRocm93IGl0IHRvIHtAbGluayBWQ2FyZEVudHJ5SGFuZGxlcn0gcmVnaXN0ZXJlZCB2aWEKLSAqIHtAbGluayAjYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyKX0sIHNvIHRoYXQgYWxsIHRob3NlIHJlZ2lzdGVyZWQgb2JqZWN0cwotICogYXJlIGFibGUgdG8gaGFuZGxlIHRoZSB7QGxpbmsgVkNhcmRFbnRyeX0gb2JqZWN0LgotICogPC9wPgotICogPHA+Ci0gKiBJZiB5b3Ugd2FudCB0byBrbm93IHRoZSBkZXRhaWwgaW5zaWRlIHZDYXJkLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaW1wbGVtZW50Ci0gKiB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0gZGlyZWN0bHksIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGlzIGNsYXNzIGFuZAotICoge0BsaW5rIFZDYXJkRW50cnl9IGNyZWF0ZWQgYnkgdGhlIG9iamVjdC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkRW50cnlDb25zdHJ1Y3RvciI7Ci0KLSAgICBwcml2YXRlIFZDYXJkRW50cnkuUHJvcGVydHkgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgcHJpdmF0ZSBWQ2FyZEVudHJ5IG1DdXJyZW50VkNhcmRFbnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBtUGFyYW1UeXBlOwotICAgIAotICAgIC8vIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIHtAbGluayBWQ2FyZEludGVycHJldGVyfSBwYXJzZXMgdGhlIHRleHQuCi0gICAgLy8gRWFjaCBTdHJpbmcgaXMgZmlyc3QgZGVjb2RlZCBpbnRvIGJpbmFyeSBzdHJlYW0gd2l0aCB0aGlzIGNoYXJzZXQsIGFuZCBlbmNvZGVkIGJhY2sKLSAgICAvLyB0byAidGFyZ2V0IGNoYXJzZXQiLCB3aGljaCBtYXkgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgdGhlIHZDYXJkIHdpdGggIkNIQVJTRVQiCi0gICAgLy8gcHJvcGVydHkgb3IgaW1wbGljaXRseSBtZW50aW9uZWQgYnkgaXRzIHZlcnNpb24gKGUuZy4gdkNhcmQgMy4wIHJlY29tbWVuZHMgVVRGLTgpLgotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Tb3VyY2VDaGFyc2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1TdHJpY3RMaW5lQnJlYWtpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY291bnQgbUFjY291bnQ7Ci0gICAgCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlcjsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxWQ2FyZEVudHJ5SGFuZGxlcj4gbUVudHJ5SGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PFZDYXJkRW50cnlIYW5kbGVyPigpOwotCi0gICAgcHVibGljIFZDYXJkRW50cnlDb25zdHJ1Y3RvcigpIHsKLSAgICAgICAgdGhpcyhWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgdGhpcyh2Y2FyZFR5cGUsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEVudHJ5Q29uc3RydWN0b3IoZmluYWwgaW50IHZjYXJkVHlwZSwgZmluYWwgQWNjb3VudCBhY2NvdW50LAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0Q2hhcnNldCkgewotICAgICAgICB0aGlzKHZjYXJkVHlwZSwgYWNjb3VudCwgaW5wdXRDaGFyc2V0LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUgSnVzdCBmb3IgdGVzdGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVkNhcmRFbnRyeUNvbnN0cnVjdG9yKGZpbmFsIGludCB2Y2FyZFR5cGUsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dENoYXJzZXQsIGZpbmFsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFrUGFyc2luZykgewotICAgICAgICBpZiAoaW5wdXRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2VDaGFyc2V0ID0gaW5wdXRDaGFyc2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgICAgICB9Ci0gICAgICAgIG1TdHJpY3RMaW5lQnJlYWtpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgICAgICBtQWNjb3VudCA9IGFjY291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnlIYW5kbGVyKFZDYXJkRW50cnlIYW5kbGVyIGVudHJ5SGFuZGxlcikgewotICAgICAgICBtRW50cnlIYW5kbGVycy5hZGQoZW50cnlIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eSA9IG5ldyBWQ2FyZEVudHJ5LlByb3BlcnR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VkNhcmRFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTmVzdGVkIFZDYXJkIGNvZGUgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbmV3IFZDYXJkRW50cnkobVZDYXJkVHlwZSwgbUFjY291bnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ3VycmVudFZDYXJkRW50cnkuY29uc29saWRhdGVGaWVsZHMoKTsKLSAgICAgICAgZm9yIChWQ2FyZEVudHJ5SGFuZGxlciBlbnRyeUhhbmRsZXIgOiBtRW50cnlIYW5kbGVycykgewotICAgICAgICAgICAgZW50cnlIYW5kbGVyLm9uRW50cnlDcmVhdGVkKG1DdXJyZW50VkNhcmRFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWQ2FyZEVudHJ5ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBtQ3VycmVudFByb3BlcnR5LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIG1DdXJyZW50VkNhcmRFbnRyeS5hZGRQcm9wZXJ0eShtQ3VycmVudFByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInByb3BlcnR5UGFyYW1UeXBlKCkgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICIgKwotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIHByb3BlcnR5UGFyYW1WYWx1ZSgpIGlzIGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1QYXJhbVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1QYXJhbVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRnJvbSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4gdkNhcmQgMy4wIGZvcm1hbGx5IGRvZXMgbm90IGFsbG93IHRoaXMgY2FzZS4KLSAgICAgICAgICAgIG1QYXJhbVR5cGUgPSAiVFlQRSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4odmFsdWUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtU291cmNlQ2hhcnNldCwgVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5hZGRQYXJhbWV0ZXIobVBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICBtUGFyYW1UeXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBoYW5kbGVPbmVWYWx1ZShTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgc291cmNlQ2hhcnNldCwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB3aGVuIHNvbWUgb2YgbXVsdGlwbGUgdmFsdWVzIGFyZSBlbXB0eS4KLSAgICAgICAgLy8gZS5nLiBOOjthOzs7IC0+IHZhbHVlcyBhcmUgIiIsICJhIiwgIiIsICIiLCBhbmQgIiIuCi0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKCJCQVNFNjQiKSB8fCBlbmNvZGluZy5lcXVhbHMoIkIiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuc2V0UHJvcGVydHlCeXRlcyhCYXNlNjQuZGVjb2RlKHZhbHVlLmdldEJ5dGVzKCksIEJhc2U2NC5ERUZBVUxUKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHMoIlFVT1RFRC1QUklOVEFCTEUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZFV0aWxzLnBhcnNlUXVvdGVkUHJpbnRhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG1TdHJpY3RMaW5lQnJlYWtpbmcsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSnVzdCB0cmFuc2xhdGUgdGhlIGNoYXJzZXQgb2YgYSBnaXZlbiBTdHJpbmcgZnJvbSBpbnB1dENoYXJzZXQgdG8gYSBzeXN0ZW0gb25lLiAKLSAgICAgICAgcmV0dXJuIFZDYXJkVXRpbHMuY29udmVydFN0cmluZ0NoYXJzZXQodmFsdWUsIHNvdXJjZUNoYXJzZXQsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gY2hhcnNldENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1DdXJyZW50UHJvcGVydHkuZ2V0UGFyYW1ldGVycyhWQ2FyZENvbnN0YW50cy5QQVJBTV9DSEFSU0VUKTsKLSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGVuY29kaW5nQ29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wZXJ0eS5nZXRQYXJhbWV0ZXJzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0KLSAgICAgICAgICAgICgoZW5jb2RpbmdDb2xsZWN0aW9uICE9IG51bGwpID8gZW5jb2RpbmdDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpIDogbnVsbCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKAotICAgICAgICAgICAgICAgICgoY2hhcnNldENvbGxlY3Rpb24gIT0gbnVsbCkgPyBjaGFyc2V0Q29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA6IG51bGwpKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICB0YXJnZXRDaGFyc2V0ID0gVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BlcnR5LmFkZFRvUHJvcGVydHlWYWx1ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCBtU291cmNlQ2hhcnNldCwgdGFyZ2V0Q2hhcnNldCwgZW5jb2RpbmcpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2hvd1BlcmZvcm1hbmNlSW5mbygpIHsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgInRpbWUgZm9yIGluc2VydCBDb250YWN0U3RydWN0IHRvIGRhdGFiYXNlOiAiICsgCi0gICAgICAgICAgICAgICAgbVRpbWVQdXNoSW50b0NvbnRlbnRSZXNvbHZlciArICIgbXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUNvdW50ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFiNTBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5Q291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIGNsYXNzIHdoaWNoIGp1c3QgY291bnRzIHRoZSBudW1iZXIgb2YgdkNhcmQgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRFbnRyeUNvdW50ZXIgaW1wbGVtZW50cyBWQ2FyZEludGVycHJldGVyIHsKLSAgICBwcml2YXRlIGludCBtQ291bnQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbUNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgICAgICBtQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRFbnRyeUhhbmRsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJmNjlkLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEVudHJ5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi0vKioKLSAqIDxwPgotICogVGhlIGludGVyZmFjZSBjYWxsZWQgYnkge0BsaW5rIFZDYXJkRW50cnlDb25zdHJ1Y3Rvcn0uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZnVsIHdoZW4geW91IGRvbid0IHdhbnQgdG8ga25vdyB2Q2FyZCBkYXRhIGluIGRldGFpbC4gSWYgeW91IHdhbnQgdG8ga25vdwotICogaXQsIGl0IHdvdWxkIGJlIGJldHRlciB0byBjb25zaWRlciB1c2luZyB7QGxpbmsgVkNhcmRJbnRlcnByZXRlcn0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRFbnRyeUhhbmRsZXIgewotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIHN0YXJ0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBjYWxsZWQgd2hlbiBvbmUgVkNhcmQgZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChmaW5hbCBWQ2FyZEVudHJ5IGVudHJ5KTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBwYXJzaW5nIGVuZGVkLgotICAgICAqIEFibGUgdG8gYmUgdXNlIHRoaXMgbWV0aG9kIGZvciBzaG93aW5nIHBlcmZvcm1hbmNlIGxvZywgZXRjLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3MDRhMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxQPgotICogVGhlIGludGVyZmFjZSB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzZXMgd2hpY2ggaGF2ZSB0byBhbmFseXplIGVhY2gKLSAqIHZDYXJkIGVudHJ5IG1pbnV0ZWx5LgotICogPC9QPgotICogPFA+Ci0gKiBIZXJlLCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZXJtcyBzcGVjaWZpYyB0byB2Q2FyZCAoYW5kIHRoaXMgbGlicmFyeSkuCi0gKiA8L1A+Ci0gKiA8UD4KLSAqIFRoZSB0ZXJtICJlbnRyeSIgaXMgb25lIHZDYXJkIHJlcHJlc2VudGF0aW9uIGluIHRoZSBpbnB1dCwgd2hpY2ggc2hvdWxkIHN0YXJ0IHdpdGggIkJFR0lOOlZDQVJEIgotICogYW5kIGVuZCB3aXRoICJFTkQ6VkNBUkQiLgotICogPC9QPgotICogPFA+Ci0gKiBUaGUgdGVybSAicHJvcGVydHkiIGlzIG9uZSBsaW5lIGluIHZDYXJkIGVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiAiZ3JvdXAiLCAicHJvcGVydHkgbmFtZSIsCi0gKiAicGFyYW1ldGVyKHBhcmFtKSBuYW1lcyBhbmQgdmFsdWVzIiwgYW5kICJwcm9wZXJ0eSB2YWx1ZXMiLgotICogPC9QPgotICogPFA+Ci0gKiBlLmcuIGdyb3VwMS5wcm9wTmFtZTtwYXJhbU5hbWUxPXBhcmFtVmFsdWUxO3BhcmFtTmFtZTI9cGFyYW1WYWx1ZTI7cHJvcGVydHlWYWx1ZTE7cHJvcGVydHlWYWx1ZTIuLi4KLSAqIDwvUD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWQ2FyZEludGVycHJldGVyIHsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2Q2FyZCBpbnRlcnByZXRhdGlvbiBzdGFydGVkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHZDYXJkIGludGVycHJldGF0aW9uIGZpbmlzaGVkLgotICAgICAqLwotICAgIHZvaWQgZW5kKCk7Ci0KLSAgICAvKiogCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgc3RhcnRlZC4KLSAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gIkJFR0lOOlZDQVJEIiBpcyByZWFkLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRFbnRyeSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gcGFyc2luZyBvbmUgdkNhcmQgZW50cnkgZW5kZWQuCi0gICAgICogTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICJFTkQ6VkNBUkQiIGlzIHJlYWQuCi0gICAgICogTm90ZSB0aGF0IHtAbGluayAjc3RhcnRFbnRyeSgpfSBtYXkgYmUgY2FsbGVkIHNpbmNlCi0gICAgICogdkNhcmQgKGVzcGVjaWFsbHkgMi4xKSBhbGxvd3MgbmVzdGVkIHZDYXJkLgotICAgICAqLwotICAgIHZvaWQgZW5kRW50cnkoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHJlYWRpbmcgb25lIHByb3BlcnR5IHN0YXJ0ZWQuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiByZWFkaW5nIG9uZSBwcm9wZXJ0eSBlbmRlZC4KLSAgICAgKi8KLSAgICB2b2lkIGVuZFByb3BlcnR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZ3JvdXAgQSBncm91cCBuYW1lLiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9yIG1heSBub3QgYmUKLSAgICAgKiBjYWxsZWQgYXQgYWxsLCBkZXBlbmRpbmcgb24gaG93IG1hbnkgZ3J1b3VwcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgQSBwcm9wZXJ0eSBuYW1lIGxpa2UgIk4iLCAiRk4iLCAiQURSIiwgZXRjLgotICAgICAqLwotICAgIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlIEEgcGFyYW1ldGVyIG5hbWUgbGlrZSAiRU5DT0RJTkciLCAiQ0hBUlNFVCIsIGV0Yy4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5UGFyYW1UeXBlKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZSBBIHBhcmFtZXRlciB2YWx1ZS4gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCB3aXRob3V0Ci0gICAgICoge0BsaW5rICNwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcpfSBiZWluZyBjYWxsZWQgKHdoZW4gdGhlIHZDYXJkIGlzIHZDYXJkIDIuMSkuCi0gICAgICovCi0gICAgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZXMgTGlzdCBvZiBwcm9wZXJ0eSB2YWx1ZXMuIFRoZSBzaXplIG9mIHZhbHVlcyB3b3VsZCBiZSAxIHVubGVzcwotICAgICAqIGNvcmVzc3BvbmRpbmcgcHJvcGVydHkgbmFtZSBpcyAiTiIsICJBRFIiLCBvciAiT1JHIi4KLSAgICAgKi8KLSAgICB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlNDRhMC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGFnZ3JlZ2F0ZXMgbW9yZSB0aGFuIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdHMgYW5kIG1ha2UgYSB1c2VyIG9iamVjdCB0cmVhdCB0aGVtIGFzIG9uZQotICoge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkSW50ZXJwcmV0ZXJDb2xsZWN0aW9uIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZDYXJkSW50ZXJwcmV0ZXI+IG1JbnRlcnByZXRlckNvbGxlY3Rpb247Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb24oQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBpbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgbUludGVycHJldGVyQ29sbGVjdGlvbiA9IGludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxWQ2FyZEludGVycHJldGVyPiBnZXRDb2xsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbUludGVycHJldGVyQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5zdGFydEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFByb3BlcnR5KCkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlHcm91cChTdHJpbmcgZ3JvdXApIHsKLSAgICAgICAgZm9yIChWQ2FyZEludGVycHJldGVyIGJ1aWxkZXIgOiBtSW50ZXJwcmV0ZXJDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBidWlsZGVyLnByb3BlcnR5R3JvdXAoZ3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eU5hbWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlQYXJhbVR5cGUodHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGZvciAoVkNhcmRJbnRlcnByZXRlciBidWlsZGVyIDogbUludGVycHJldGVyQ29sbGVjdGlvbikgewotICAgICAgICAgICAgYnVpbGRlci5wcm9wZXJ0eVBhcmFtVmFsdWUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZXMoTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBmb3IgKFZDYXJkSW50ZXJwcmV0ZXIgYnVpbGRlciA6IG1JbnRlcnByZXRlckNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIucHJvcGVydHlWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjkzNjkuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVkNhcmRQYXJzZXIgewotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCBzZW5kIHRoZSB2Q2FyZCBkYXRhIGludG8gVkNhcmRCdWlsZGVyQmFzZSBvYmplY3QuCi0gICAgICogPC9wPi4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gYWxsb3dzICJDSEFSU0VUIiBwYXJhbWV0ZXIsIGFuZCBzb21lIGNhcmVlciBzZXRzCi0gICAgICogbG9jYWwgZW5jb2RpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBKYXBhbmVzZSBwaG9uZSBjYXJlZXIgdXNlcyBTaGlmdF9KSVMsIHdoaWNoIGlzCi0gICAgICogZm9ybWFsbHkgYWxsb3dlZCBpbiB2Q2FyZCAyLjEsIGJ1dCBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAuIEluIHZDYXJkIDIuMSwKLSAgICAgKiBJbiBzb21lIGV4cmVtZSBjYXNlLCBpdCBpcyBhbGxvd2VkIGZvciB2Q2FyZCB0byBoYXZlIGRpZmZlcmVudCBjaGFyc2V0cyBpbiBvbmUgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFdlIHJlY29tbWVuZCB5b3UgdXNlIHtAbGluayBWQ2FyZFNvdXJjZURldGVjdG9yfSBhbmQgZGV0ZWN0IHdoaWNoIGtpbmQgb2Ygc291cmNlIHRoZQotICAgICAqIHZDYXJkIGNvbWVzIGZyb20gYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGNoYXJzZXQgdXNpbmcgdGhlIHJlc3VsdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgVGhlIHNvdXJjZSB0byBwYXJzZS4KLSAgICAgKiBAcGFyYW0gaW50ZXJlcHJldGVyIEEge0BsaW5rIFZDYXJkSW50ZXJwcmV0ZXJ9IG9iamVjdCB3aGljaCB1c2VkIHRvIGNvbnN0cnVjdCBkYXRhLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIENhbmNlbCBwYXJzaW5nIHZDYXJkLiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzdG9wIHRoZSBwYXJzZSBpbiB0aGUgb3RoZXIgdGhyZWFkcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogQWN0dWFsIGNhbmNlbCBpcyBkb25lIGFmdGVyIHBhcnNpbmcgdGhlIGN1cnJlbnQgdmNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNhbmNlbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzY1ZWIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmROZXN0ZWRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkVmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIGFjaGlldmluZyB2Q2FyZCBwYXJzaW5nLiBCYXNlZCBvbiB2Q2FyZCAyLjEsCi0gKiA8L3A+Ci0gKiBAaGlkZQotICovCi0vKiBwYWNrYWdlICovIGNsYXNzIFZDYXJkUGFyc2VySW1wbF9WMjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkUGFyc2VySW1wbF9WMjEiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlJbnRlcnByZXRlciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kKCkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgZW5kUHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVzKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoKSB7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UHJvcGVydHkoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbUJ1ZmZlcmVkUmVhZGVyIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgewotICAgICAgICBwcml2YXRlIGxvbmcgbVRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5lZWRlZCBzaW5jZSAibmV4dCBsaW5lIiBtYXkgYmUgbnVsbCBkdWUgdG8gZW5kIG9mIGxpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5leHRMaW5lSXNWYWxpZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRMaW5lOwotCi0gICAgICAgIHB1YmxpYyBDdXN0b21CdWZmZXJlZFJlYWRlcihSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgIHN1cGVyKGluKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtTmV4dExpbmVJc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJldCA9IG1OZXh0TGluZTsKLSAgICAgICAgICAgICAgICBtTmV4dExpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0TGluZUlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbVRpbWUgKz0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIG9uZSBsaW5lLCBidXQgbWFrZSB0aGlzIG9iamVjdCBzdG9yZSBpdCBpbiBpdHMgcXVldWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIHBlZWtMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICghbU5leHRMaW5lSXNWYWxpZCkgewotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHN1cGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBtVGltZSArPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIG1OZXh0TGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgbU5leHRMaW5lSXNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtTmV4dExpbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbG1pbGxpc2Vjb25kKCkgewotICAgICAgICAgICAgcmV0dXJuIG1UaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiOEJJVCI7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQ2FuY2VsZWQ7Ci0gICAgcHJvdGVjdGVkIFZDYXJkSW50ZXJwcmV0ZXIgbUludGVycHJldGVyOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBtSW50ZXJtZWRpYXRlQ2hhcnNldDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSBlbmNvZGluZyB0eXBlIGZvciBkZWNvbmRpbmcgYnl0ZSBzdHJlYW1zLiBUaGlzIG1lbWJlciB2YXJpYWJsZSBpcwotICAgICAqIHJlc2V0IHRvIGEgZGVmYXVsdCBlbmNvZGluZyBldmVyeSB0aW1lIHdoZW4gYSBuZXcgaXRlbSBjb21lcy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogIkVuY29kaW5nIiBpbiB2Q2FyZCBpcyBkaWZmZXJlbnQgZnJvbSAiQ2hhcnNldCIuIEl0IGlzIG1haW5seSB1c2VkIGZvcgotICAgICAqIGFkZHJlc3Nlcywgbm90ZXMsIGltYWdlcy4gIjdCSVQiLCAiOEJJVCIsICJCQVNFNjQiLCBhbmQKLSAgICAgKiAiUVVPVEVELVBSSU5UQUJMRSIgYXJlIGtub3duIGV4YW1wbGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1DdXJyZW50RW5jb2Rpbmc7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhZGVyIG9iamVjdCB0byBiZSB1c2VkIGludGVybmFsbHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIERldmVsb3BlcnMgc2hvdWxkIG5vdCBkaXJlY3RseSByZWFkIGEgbGluZSBmcm9tIHRoaXMgb2JqZWN0LiBVc2UKLSAgICAgKiBnZXRMaW5lKCkgdW5sZXNzIHRoZXJlIHNvbWUgcmVhc29uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ3VzdG9tQnVmZmVyZWRSZWFkZXIgbVJlYWRlcjsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNldCBmb3Igc3RvcmluZyB1bmtvbnduIFRZUEUgYXR0cmlidXRlcywgd2hpY2ggaXMgbm90IGFjY2VwdGFibGUgaW4gdkNhcmQKLSAgICAgKiBzcGVjaWZpY2F0aW9uLCBidXQgaGFwcGVucyB0byBiZSBzZWVuIGluIHJlYWwgd29ybGQgdkNhcmQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8U3RyaW5nPiBtVW5rbm93blR5cGVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBTZXQgZm9yIHN0b3JpbmcgdW5rb253biBWQUxVRSBhdHRyaWJ1dGVzLCB3aGljaCBpcyBub3QgYWNjZXB0YWJsZSBpbgotICAgICAqIHZDYXJkIHNwZWNpZmljYXRpb24sIGJ1dCBoYXBwZW5zIHRvIGJlIHNlZW4gaW4gcmVhbCB3b3JsZCB2Q2FyZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG1Vbmtub3duVmFsdWVTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQotICAgIC8vIEluIHNvbWUgY2FzZXMsIHZDYXJkIGlzIG5lc3RlZC4gQ3VycmVudGx5LCB3ZSBvbmx5IGNvbnNpZGVyIHRoZSBtb3N0Ci0gICAgLy8gaW50ZXJpb3IgdkNhcmQgZGF0YS4KLSAgICAvLyBTZWUgdjIxX2ZvbWFfMS52Y2YgaW4gdGVzdCBkaXJlY3RvcnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgLy8gVE9ETzogRG9uJ3QgaWdub3JlIGJ5IHVzaW5nIGNvdW50LCBidXQgcmVhZCBhbGwgb2YgaW5mb3JtYXRpb24gb3V0c2lkZSB2Q2FyZC4KLSAgICBwcml2YXRlIGludCBtTmVzdENvdW50OwotCi0gICAgLy8gVXNlZCBvbmx5IGZvciBwYXJzaW5nIEVORDpWQ0FSRC4KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotCi0gICAgLy8gRm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZS4KLSAgICBwcml2YXRlIGxvbmcgbVRpbWVUb3RhbDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVSZWFkU3RhcnRSZWNvcmQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUmVhZEVuZFJlY29yZDsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVTdGFydFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZUVuZFByb3BlcnR5OwotICAgIHByaXZhdGUgbG9uZyBtVGltZVBhcnNlSXRlbXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXA7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlczsKLSAgICBwcml2YXRlIGxvbmcgbVRpbWVQYXJzZUFkck9yZ047Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWU7Ci0gICAgcHJpdmF0ZSBsb25nIG1UaW1lSGFuZGxlUXVvdGVkUHJpbnRhYmxlOwotICAgIHByaXZhdGUgbG9uZyBtVGltZUhhbmRsZUJhc2U2NDsKLQotICAgIHB1YmxpYyBWQ2FyZFBhcnNlckltcGxfVjIxKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfREVGQVVMVCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMjEoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpZiAoKHZjYXJkVHlwZSAmIFZDYXJkQ29uZmlnLkZMQUdfVE9SRUxBVEVfTkVTVCkgIT0gMCkgewotICAgICAgICAgICAgbU5lc3RDb3VudCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW50ZXJtZWRpYXRlQ2hhcnNldCA9ICBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8vIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij52Y2FyZF9maWxlID0gW3dzbHNdIHZjYXJkIFt3c2xzXTwvcHJlPgotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVkNhcmRGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVhZGluZ0ZpcnN0RmlsZSA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAobUNhbmNlbGVkKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXBhcnNlT25lVkNhcmQocmVhZGluZ0ZpcnN0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWRpbmdGaXJzdEZpbGUgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTmVzdENvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbGVhbiB1c2VDYWNoZSA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHJlYWRFbmRWQ2FyZCh1c2VDYWNoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdXNlQ2FjaGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBpcyBhIHZhbGlkIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3BlcnR5TmFtZShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgIGlmICghKGdldEtub3duUHJvcGVydHlOYW1lU2V0KCkuY29udGFpbnMocHJvcGVydHlOYW1lLnRvVXBwZXJDYXNlKCkpIHx8Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICBtVW5rbm93blR5cGVTZXQuYWRkKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiUHJvcGVydHkgbmFtZSB1bnN1cHBvcnRlZCBieSB2Q2FyZCAyLjE6ICIgKyBwcm9wZXJ0eU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nLiBJdCBtYXkgYmUgbnVsbCwgb3IgaXRzIGxlbmd0aCBtYXkgYmUgMAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcGVla0xpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbVJlYWRlci5wZWVrTGluZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggaXQncyBsZW5ndGggPiAwCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24gd2hlbiB0aGUgc3RyZWFtIHJlYWNoZWQgZW5kIG9mIGxpbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vbkVtcHR5TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIGVuZCBvZiBidWZmZXIuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiB2Y2FyZCA9ICJCRUdJTiIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiIFt3c10gMSpDUkxGCi0gICAgICogICAgICAgICBpdGVtcyAqQ1JMRgotICAgICAqICAgICAgICAgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlT25lVkNhcmQoYm9vbGVhbiBmaXJzdFJlYWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGFsbG93R2FyYmFnZSA9IGZhbHNlOwotICAgICAgICBpZiAoZmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICBpZiAobU5lc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OZXN0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhbGxvd0dhcmJhZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVhZEJlZ2luVkNhcmQoYWxsb3dHYXJiYWdlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlU3RhcnRFbnRyeSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRFbnRyeSgpOwotICAgICAgICBtVGltZVJlYWRTdGFydFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZVN0YXJ0RW50cnk7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVQYXJzZUl0ZW1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHBhcnNlSXRlbXMoKTsKLSAgICAgICAgbVRpbWVQYXJzZUl0ZW1zICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlUGFyc2VJdGVtczsKLQotICAgICAgICByZWFkRW5kVkNhcmQodHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kRW50cnkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUludGVycHJldGVyLmVuZEVudHJ5KCk7Ci0gICAgICAgIG1UaW1lUmVhZEVuZFJlY29yZCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZEVudHJ5OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRydWUgd2hlbiBzdWNjZXNzZnVsLiBGYWxzZSB3aGVuIHJlYWNoaW5nIHRoZSBlbmQgb2YgbGluZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFZDYXJkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEJlZ2luVkNhcmQoYm9vbGVhbiBhbGxvd0dhcmJhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ckFycmF5Lmxlbmd0aDsKLQotICAgICAgICAgICAgLy8gQWx0aG91Z2ggdkNhcmQgMi4xLzMuMCBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGxvd2VyIGNhc2VzLAotICAgICAgICAgICAgLy8gd2UgZm91bmQgdkNhcmQgZmlsZSBlbWl0dGVkIGJ5IHNvbWUgZXh0ZXJuYWwgdkNhcmQgZXhwb3RlciBoYXZlIHN1Y2gKLSAgICAgICAgICAgIC8vIGludmFsaWQgU3RyaW5ncy4KLSAgICAgICAgICAgIC8vIFNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgLy8gZS5nLgotICAgICAgICAgICAgLy8gQkVHSU46dkNhcmQKLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMiAmJiBzdHJBcnJheVswXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiQkVHSU4iKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghYWxsb3dHYXJiYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJFeHBlY3RlZCBTdHJpbmcgXCJCRUdJTjpWQ0FSRFwiIGRpZCBub3QgY29tZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEluc3RlYWQsIFwiIiArIGxpbmUgKyAiXCIgY2FtZSkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0KLSAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJSZWFjaGVkIHdoZXJlIG11c3Qgbm90IGJlIHJlYWNoZWQuIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFyZ3VtZW50cyB1c2VDYWNoZSBhbmQgYWxsb3dHYXJiYXNlIGFyZSB1c3VhbGx5IHRydWUgYW5kIGZhbHNlCi0gICAgICogYWNjb3JkaW5nbHkgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIHRoaXMgZnVuY3Rpb24gaXRzZWxmLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUgV2hlbiB0cnVlLCBsaW5lIGlzIG9idGFpbmVkIGZyb20gbVByZXZpb3VzbGluZS4KLSAgICAgKiAgICAgICAgICAgIE90aGVyd2lzZSwgZ2V0TGluZSgpIGlzIHVzZWQuCi0gICAgICogQHBhcmFtIGFsbG93R2FyYmFnZSBXaGVuIHRydWUsIGlnbm9yZSBub24gIkVORDpWQ0FSRCIgbGluZS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBWQ2FyZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRFbmRWQ2FyZChib29sZWFuIHVzZUNhY2hlLCBib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKHVzZUNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhvdWdoIHZDYXJkIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgbG93ZXIgY2FzZXMsCi0gICAgICAgICAgICAgICAgLy8gc29tZSBkYXRhIG1heSBoYXZlIHRoZW0sIHNvIHdlIGFsbG93IGl0LgotICAgICAgICAgICAgICAgIGxpbmUgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZ2V0TGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkV4cGVjdGVkIEVORDpWQ0FSRCB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbGluZS5zcGxpdCgiOiIsIDIpOwotICAgICAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyICYmIHN0ckFycmF5WzBdLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJFTkQiKQotICAgICAgICAgICAgICAgICAgICAmJiBzdHJBcnJheVsxXS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgiVkNBUkQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFsbG93R2FyYmFnZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiRU5EOlZDQVJEICE9IFwiIiArIG1QcmV2aW91c0xpbmUgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVzZUNhY2hlID0gZmFsc2U7Ci0gICAgICAgIH0gd2hpbGUgKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpdGVtcyA9ICpDUkxGIGl0ZW0gLyBpdGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VJdGVtcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGVuZGVkID0gZmFsc2U7Ci0KLSAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVCZWdpblByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5zdGFydFByb3BlcnR5KCk7Ci0gICAgICAgIG1UaW1lU3RhcnRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUJlZ2luUHJvcGVydHk7Ci0gICAgICAgIGVuZGVkID0gcGFyc2VJdGVtKCk7Ci0gICAgICAgIGlmICghZW5kZWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgYmVmb3JlRW5kUHJvcGVydHkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVFbmRQcm9wZXJ0eSArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZUVuZFByb3BlcnR5OwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFlbmRlZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVTdGFydFByb3BlcnR5ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuc3RhcnRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgbVRpbWVTdGFydFByb3BlcnR5ICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVmb3JlU3RhcnRQcm9wZXJ0eTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW5kZWQgPSBwYXJzZUl0ZW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFZDYXJkSW52YWxpZENvbW1lbnRMaW5lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiSW52YWxpZCBsaW5lIHdoaWNoIGxvb2tzIGxpa2Ugc29tZSBjb21tZW50IHdhcyBmb3VuZC4gSWdub3JlZC4iKTsKLSAgICAgICAgICAgICAgICBlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBiZWZvcmVFbmRQcm9wZXJ0eSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5lbmRQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIG1UaW1lRW5kUHJvcGVydHkgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmVFbmRQcm9wZXJ0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogaXRlbSA9IFtncm91cHMgIi4iXSBuYW1lIFtwYXJhbXNdICI6IiB2YWx1ZSBDUkxGIC8gW2dyb3VwcyAiLiJdICJBRFIiCi0gICAgICogW3BhcmFtc10gIjoiIGFkZHJlc3NwYXJ0cyBDUkxGIC8gW2dyb3VwcyAiLiJdICJPUkciIFtwYXJhbXNdICI6IiBvcmdwYXJ0cwotICAgICAqIENSTEYgLyBbZ3JvdXBzICIuIl0gIk4iIFtwYXJhbXNdICI6IiBuYW1lcGFydHMgQ1JMRiAvIFtncm91cHMgIi4iXQotICAgICAqICJBR0VOVCIgW3BhcmFtc10gIjoiIHZjYXJkIENSTEYKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUl0ZW0oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgbUN1cnJlbnRFbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkc7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXROb25FbXB0eUxpbmUoKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZUFuZFZhbHVlID0gc2VwYXJhdGVMaW5lQW5kSGFuZGxlR3JvdXAobGluZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydHlOYW1lQW5kVmFsdWUubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uKCJJbnZhbGlkIGxpbmUgXCIiICsgbGluZSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdOwotCi0gICAgICAgIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLQotICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQURSIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiT1JHIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscygiTiIpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlTXVsdGlwbGVQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBtVGltZVBhcnNlQWRyT3JnTiArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkFHRU5UIikpIHsKLSAgICAgICAgICAgIGhhbmRsZUFnZW50KHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkJFR0lOIikpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5lcXVhbHMoIlZDQVJEIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkTmVzdGVkRXhjZXB0aW9uKCJUaGlzIHZDYXJkIGhhcyBuZXN0ZWQgdkNhcmQgZGF0YSBpbiBpdC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gQkVHSU4gdHlwZTogIiArIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiVkVSU0lPTiIpICYmICFwcm9wZXJ0eVZhbHVlLmVxdWFscyhnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkVmVyc2lvbkV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIHZlcnNpb246ICIgKyBwcm9wZXJ0eVZhbHVlICsgIiAhPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGdldFZlcnNpb25TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgaGFuZGxlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgbVRpbWVQYXJzZVByb3BlcnR5VmFsdWVzICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgbmFtZTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbiwgdGhlIHN0YXRlcyBmb3IgZ3JvdXAgYW5kIHByb3BlcnR5IG5hbWUgYXJlIG1lcmdlZCBpbnRvIG9uZS4KLSAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRSA9IDA7Ci0gICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX1BBUkFNUyA9IDE7Ci0gICAgLy8gdkNhcmQgMy4wIHNwZWNpZmljYXRpb24gYWxsb3dzIGRvdWJsZS1xdW90ZWQgcGFyYW1ldGVycywgd2hpbGUgdkNhcmQgMi4xIGRvZXMgbm90LgotICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBTVEFURV9QQVJBTVNfSU5fRFFVT1RFID0gMjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzZXBhcmF0ZUxpbmVBbmRIYW5kbGVHcm91cChTdHJpbmcgbGluZSkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lQW5kVmFsdWUgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgbGluZS5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX0dST1VQX09SX1BST1BFUlRZX05BTUU7Ci0gICAgICAgIGludCBuYW1lSW5kZXggPSAwOwotCi0gICAgICAgIC8vIFRoaXMgbG9vcCBpcyBkZXZlbG9wZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRha2UgY2FyZSBvZiBib3R0bGUgbmVjayBoZXJlLgotICAgICAgICAvLyBSZWZhY3RvciBjYXJlZnVsbHkgd2hlbiB5b3UgbmVlZCB0byBkbyBzby4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IGxpbmUuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfR1JPVVBfT1JfUFJPUEVSVFlfTkFNRTogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgYSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeyAgLy8gRWFjaCBncm91cCBpcyBmb2xsb3dlZCBieSB0aGUgZG90LgotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwTmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRW1wdHkgZ3JvdXAgZm91bmQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlHcm91cChncm91cE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7ICAvLyBOZXh0IHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIG9yIGEgcHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIEVuZCBvZiBwcm9wZXJ0eSBuYW1lIGFuZCBiZWdpbm5lbmcgb2YgcGFyYW1ldGVycy4gIAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVORCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVswXSA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVJbmRleCA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9QQVJBTVM7ICAvLyBTdGFydCBwYXJhbWV0ZXIgcGFyc2luZy4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb21tYSBzdXBwb3J0IChpbiB2Q2FyZCAzLjAgYW5kIDQuMCkuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNUzogewotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEuZXF1YWxzSWdub3JlQ2FzZShnZXRWZXJzaW9uU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkRvdWJsZS1xdW90ZWQgcGFyYW1zIGZvdW5kIGluIHZDYXJkIDIuMS4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2lsZW50bHkgYWxsb3cgaXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfUEFSQU1TX0lOX0RRVU9URTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsgIC8vIFN0YXJ0cyBhbm90aGVyIHBhcmFtLgotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyYW1zKGxpbmUuc3Vic3RyaW5nKG5hbWVJbmRleCwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUluZGV4ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7ICAvLyBFbmQgb2YgcGFyYW0gYW5kIGJlZ2luZW5uaW5nIG9mIHZhbHVlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmFtcyhsaW5lLnN1YnN0cmluZyhuYW1lSW5kZXgsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUFuZFZhbHVlWzFdID0gbGluZS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVBbmRWYWx1ZVsxXSA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZUFuZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BBUkFNU19JTl9EUVVPVEU6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjIxLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VmVyc2lvblN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJEb3VibGUtcXVvdGVkIHBhcmFtcyBmb3VuZCBpbiB2Q2FyZCAyLjEuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbGVudGx5IGFsbG93IGl0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1BBUkFNUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigiSW52YWxpZCBsaW5lOiBcIiIgKyBsaW5lICsgIlwiIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwYXJhbXMgPSAiOyIgW3dzXSBwYXJhbWxpc3QgcGFyYW1saXN0ID0gcGFyYW1saXN0IFt3c10gIjsiIFt3c10gcGFyYW0gLwotICAgICAqIHBhcmFtIHBhcmFtID0gIlRZUEUiIFt3c10gIj0iIFt3c10gcHR5cGV2YWwgLyAiVkFMVUUiIFt3c10gIj0iIFt3c10KLSAgICAgKiBwdmFsdWV2YWwgLyAiRU5DT0RJTkciIFt3c10gIj0iIFt3c10gcGVuY29kaW5ndmFsIC8gIkNIQVJTRVQiIFt3c10gIj0iCi0gICAgICogW3dzXSBjaGFyc2V0dmFsIC8gIkxBTkdVQUdFIiBbd3NdICI9IiBbd3NdIGxhbmd2YWwgLyAiWC0iIHdvcmQgW3dzXSAiPSIKLSAgICAgKiBbd3NdIHdvcmQgLyBrbm93bnR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gc3RyQXJyYXkgPSBwYXJhbXMuc3BsaXQoIj0iLCAyKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gc3RyQXJyYXlbMF0udHJpbSgpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHN0ckFycmF5WzFdLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJUWVBFIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzKCJWQUxVRSIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHMoIkVOQ09ESU5HIikpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFbmNvZGluZyhwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiQ0hBUlNFVCIpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ2hhcnNldChwYXJhbVZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFscygiTEFOR1VBR0UiKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlKHBhcmFtVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aCgiWC0iKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUFueVBhcmFtKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiVW5rbm93biB0eXBlIFwiIiArIHBhcmFtTmFtZSArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShzdHJBcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2Q2FyZCAzLjAgcGFyc2VyIGltcGxlbWVudGF0aW9uIG1heSB0aHJvdyBWQ2FyZEV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbVdpdGhvdXROYW1lKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcHR5cGV2YWwgPSBrbm93bnR5cGUgLyAiWC0iIHdvcmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwdHlwZXZhbCkgewotICAgICAgICBpZiAoIShnZXRLbm93blR5cGVTZXQoKS5jb250YWlucyhwdHlwZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB0eXBldmFsLnN0YXJ0c1dpdGgoIlgtIikpCi0gICAgICAgICAgICAgICAgJiYgIW1Vbmtub3duVHlwZVNldC5jb250YWlucyhwdHlwZXZhbCkpIHsKLSAgICAgICAgICAgIG1Vbmtub3duVHlwZVNldC5hZGQocHR5cGV2YWwpOwotICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgiVFlQRSB1bnN1cHBvcnRlZCBieSAlczogIiwgZ2V0VmVyc2lvbigpLCBwdHlwZXZhbCkpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHB0eXBldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHB2YWx1ZXZhbCA9ICJJTkxJTkUiIC8gIlVSTCIgLyAiQ09OVEVOVC1JRCIgLyAiQ0lEIiAvICJYLSIgd29yZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVZhbHVlKGZpbmFsIFN0cmluZyBwdmFsdWV2YWwpIHsKLSAgICAgICAgaWYgKCEoZ2V0S25vd25WYWx1ZVNldCgpLmNvbnRhaW5zKHB2YWx1ZXZhbC50b1VwcGVyQ2FzZSgpKQotICAgICAgICAgICAgICAgIHx8IHB2YWx1ZXZhbC5zdGFydHNXaXRoKCJYLSIpCi0gICAgICAgICAgICAgICAgfHwgbVVua25vd25WYWx1ZVNldC5jb250YWlucyhwdmFsdWV2YWwpKSkgewotICAgICAgICAgICAgbVVua25vd25WYWx1ZVNldC5hZGQocHZhbHVldmFsKTsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdmFsdWUgdW5zdXBwb3J0ZWQgYnkgVFlQRSBvZiAlczogIiwgZ2V0VmVyc2lvbigpLCBwdmFsdWV2YWwpKTsKLSAgICAgICAgfQotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIlZBTFVFIik7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUocHZhbHVldmFsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHBlbmNvZGluZ3ZhbCA9ICI3QklUIiAvICI4QklUIiAvICJRVU9URUQtUFJJTlRBQkxFIiAvICJCQVNFNjQiIC8gIlgtIiB3b3JkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRW5jb2RpbmcoU3RyaW5nIHBlbmNvZGluZ3ZhbCkgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldEF2YWlsYWJsZUVuY29kaW5nU2V0KCkuY29udGFpbnMocGVuY29kaW5ndmFsKSB8fAotICAgICAgICAgICAgICAgIHBlbmNvZGluZ3ZhbC5zdGFydHNXaXRoKCJYLSIpKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkVOQ09ESU5HIik7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBlbmNvZGluZ3ZhbCk7Ci0gICAgICAgICAgICBtQ3VycmVudEVuY29kaW5nID0gcGVuY29kaW5ndmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJVbmtub3duIGVuY29kaW5nIFwiIiArIHBlbmNvZGluZ3ZhbCArICJcIiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gb25seSBhbGxvd3MgdXMtYXNjaWkgYW5kIGlzby04ODU5LXh4eCAoU2VlIFJGQyAxNTIxKSwKLSAgICAgKiBidXQgcmVjZW50IHZDYXJkIGZpbGVzIG9mdGVuIGNvbnRhaW4gb3RoZXIgY2hhcnNldCBsaWtlIFVURi04LCBTSElGVF9KSVMsIGV0Yy4KLSAgICAgKiBXZSBhbGxvdyBhbnkgY2hhcnNldC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhcnNldChTdHJpbmcgY2hhcnNldHZhbCkgewotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVR5cGUoIkNIQVJTRVQiKTsKLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5UGFyYW1WYWx1ZShjaGFyc2V0dmFsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgYWxzbyBTZWN0aW9uIDcuMSBvZiBSRkMgMTUyMQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUxhbmd1YWdlKFN0cmluZyBsYW5ndmFsKSB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheSA9IGxhbmd2YWwuc3BsaXQoIi0iKTsKLSAgICAgICAgaWYgKHN0ckFycmF5Lmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkludmFsaWQgTGFuZ3VhZ2U6IFwiIiArIGxhbmd2YWwgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG1wID0gc3RyQXJyYXlbMF07Ci0gICAgICAgIGludCBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRtcCA9IHN0ckFycmF5WzFdOwotICAgICAgICBsZW5ndGggPSB0bXAubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghaXNBc2NpaUxldHRlcih0bXAuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZTogXCIiICsgbGFuZ3ZhbCArICJcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShWQ2FyZENvbnN0YW50cy5QQVJBTV9MQU5HVUFHRSk7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUobGFuZ3ZhbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXNjaWlMZXR0ZXIoY2hhciBjaCkgewotICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW5seSBmb3IgIlgtIiB0eXBlLiBUaGlzIGFjY2VwdHMgYW55IGtpbmQgb2YgdHlwZSB3aXRob3V0IGNoZWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKFN0cmluZyBwYXJhbU5hbWUsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHVwcGVyRW5jb2RpbmcgPSBtQ3VycmVudEVuY29kaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19RUCkpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBnZXRRdW90ZWRQcmludGFibGUocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB2LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKHYpOwotICAgICAgICAgICAgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfSBlbHNlIGlmICh1cHBlckVuY29kaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQpCi0gICAgICAgICAgICAgICAgfHwgdXBwZXJFbmNvZGluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpIHsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIC8vIEl0IGlzIHZlcnkgcmFyZSwgYnV0IHNvbWUgQkFTRTY0IGRhdGEgbWF5IGJlIHNvIGJpZyB0aGF0Ci0gICAgICAgICAgICAvLyBPdXRPZk1lbW9yeUVycm9yIG9jY3Vycy4gVG8gaWdub3JlIHN1Y2ggY2FzZXMsIHVzZSB0cnktY2F0Y2guCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGFycmF5TGlzdC5hZGQoZ2V0QmFzZTY0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMoYXJyYXlMaXN0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiT3V0T2ZNZW1vcnlFcnJvciBoYXBwZW5lZCBkdXJpbmcgcGFyc2luZyBCQVNFNjQgZGF0YSEiKTsKLSAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGltZUhhbmRsZUJhc2U2NCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEodXBwZXJFbmNvZGluZy5lcXVhbHMoIjdCSVQiKSB8fCB1cHBlckVuY29kaW5nLmVxdWFscygiOEJJVCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHVwcGVyRW5jb2Rpbmcuc3RhcnRzV2l0aCgiWC0iKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVGhlIGVuY29kaW5nIFwiJXNcIiBpcyB1bnN1cHBvcnRlZCBieSB2Q2FyZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50RW5jb2RpbmcsIGdldFZlcnNpb25TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTb21lIGRldmljZSB1c2VzIGxpbmUgZm9sZGluZyBkZWZpbmVkIGluIFJGQyAyNDI1LCB3aGljaCBpcyBub3QgYWxsb3dlZAotICAgICAgICAgICAgLy8gaW4gdkNhcmQgMi4xICh3aGlsZSBuZWVkZWQgaW4gdkNhcmQgMy4wKS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyBCRUdJTjpWQ0FSRAotICAgICAgICAgICAgLy8gVkVSU0lPTjoyLjEKLSAgICAgICAgICAgIC8vIE46O09tZWdhOzs7Ci0gICAgICAgICAgICAvLyBFTUFJTDtJTlRFUk5FVDoiT21lZ2EiCi0gICAgICAgICAgICAvLyAgIDxvbWVnYUBleGFtcGxlLmNvbT4KLSAgICAgICAgICAgIC8vIEZOOk9tZWdhCi0gICAgICAgICAgICAvLyBFTkQ6VkNBUkQKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBUaGUgdkNhcmQgYWJvdmUgYXNzdW1lcyB0aGF0IGVtYWlsIGFkZHJlc3Mgc2hvdWxkIGJlY29tZToKLSAgICAgICAgICAgIC8vICJPbWVnYSIgPG9tZWdhQGV4YW1wbGUuY29tPgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEJ1dCB2Q2FyZCAyLjEgcmVxdWlyZXMgUXVvdGUtUHJpbnRhYmxlIHdoZW4gYSBsaW5lIGNvbnRhaW5zIGxpbmUgYnJlYWsocykuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbGluZSBmb2xkaW5nLAotICAgICAgICAgICAgLy8gc2VlICI1LjguMS4gTGluZSBkZWxpbWl0aW5nIGFuZCBmb2xkaW5nIiBpbiBSRkMgMjQyNS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBXZSB0YWtlIGNhcmUgb2YgdGhpcyBjYXNlIG1vcmUgZm9ybWFsbHkgaW4gdkNhcmQgMy4wLCBzbyB3ZSBvbmx5IG5lZWQgdG8KLSAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gdkNhcmQgMi4xLgotICAgICAgICAgICAgaWYgKGdldFZlcnNpb24oKSA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmV4dExpbmUgPSBwZWVrTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhcmUgdG9vIG11Y2ggYWJvdXQgdGhpcyBleGNlcHRpb25hbCBjYXNlLAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIG5vdCB3cm9uZ2x5IGVhdCB1cCAiRU5EOlZDQVJEIiwgc2luY2UgaXQgY3JpdGljYWxseQotICAgICAgICAgICAgICAgICAgICAvLyBicmVha3MgdGhpcyBwYXJzZXIncyBzdGF0ZSBtYWNoaW5lLgotICAgICAgICAgICAgICAgICAgICAvLyBUaHVzIHdlIHJvdWdobHkgbG9vayBvdmVyIHRoZSBuZXh0IGxpbmUgYW5kIGNvbmZpcm0gaXQgaXMgYXQgbGVhc3Qgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vICJFTkQ6VkNBUkQiLiBUaGlzIGV4dHJhIGZlZSBpcyB3b3J0aCBwYXlpbmcuIFRoaXMgaXMgZXhjZXB0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gYW55d2F5LgotICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KG5leHRMaW5lKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5lLmNoYXJBdCgwKSA9PSAnICcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIkVORDpWQ0FSRCIuY29udGFpbnMobmV4dExpbmUudG9VcHBlckNhc2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmUoKTsgIC8vIERyb3AgdGhlIG5leHQgbGluZS4KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dExpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHYuYWRkKG1heWJlVW5lc2NhcGVUZXh0KHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVZhbHVlcyh2KTsKLSAgICAgICAgICAgIG1UaW1lSGFuZGxlTWlzY1Byb3BlcnR5VmFsdWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyBhbmQgcmV0dXJucyBRdW90ZWQtUHJpbnRhYmxlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaXJzdFN0cmluZyBUaGUgc3RyaW5nIGZvbGxvd2luZyBhIHBhcmFtZXRlciBuYW1lIGFuZCBhdHRyaWJ1dGVzLgotICAgICAqICAgICAgICAgICAgRXhhbXBsZTogInN0cmluZyIgaW4KLSAgICAgKiAgICAgICAgICAgICJBRFI6RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpzdHJpbmdcblxyIi4KLSAgICAgKiBAcmV0dXJuIHdob2xlIFF1b3RlZC1QcmludGFibGUgc3RyaW5nLCBpbmNsdWRpbmcgYSBnaXZlbiBhcmd1bWVudCBhbmQKLSAgICAgKiAgICAgICAgIGZvbGxvd2luZyBsaW5lcy4gRXhjbHVkZXMgdGhlIGxhc3QgZW1wdHkgbGluZSBmb2xsb3dpbmcgdG8gUXVvdGVkCi0gICAgICogICAgICAgICBQcmludGFibGUgbGluZXMuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVkNhcmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRRdW90ZWRQcmludGFibGUoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCB0aGVyZSBtYXkgYmUgc29tZSBwYWRkaW5nIGJldHdlZW4gPSBhbmQgQ1JMRi4KLSAgICAgICAgLy8gU2VlIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHFwLWxpbmUgOj0gKihxcC1zZWdtZW50IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYpCi0gICAgICAgIC8vIHFwLXBhcnQgdHJhbnNwb3J0LXBhZGRpbmcKLSAgICAgICAgLy8gcXAtc2VnbWVudCA6PSBxcC1zZWN0aW9uICooU1BBQ0UgLyBUQUIpICI9IgotICAgICAgICAvLyA7IE1heGltdW0gbGVuZ3RoIG9mIDc2IGNoYXJhY3RlcnMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gZS5nLiAoZnJvbSBSRkMgMjA0NSkKLSAgICAgICAgLy8gTm93J3MgdGhlIHRpbWUgPQotICAgICAgICAvLyBmb3IgYWxsIGZvbGsgdG8gY29tZT0KLSAgICAgICAgLy8gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LgotICAgICAgICBpZiAoZmlyc3RTdHJpbmcudHJpbSgpLmVuZHNXaXRoKCI9IikpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSAidHJhbnNwb3J0LXBhZGRpbmciCi0gICAgICAgICAgICBpbnQgcG9zID0gZmlyc3RTdHJpbmcubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgd2hpbGUgKGZpcnN0U3RyaW5nLmNoYXJBdChwb3MpICE9ICc9JykgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nLnN1YnN0cmluZygwLCBwb3MgKyAxKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgYSBRdW90ZWQtUHJpbnRhYmxlIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZS50cmltKCkuZW5kc1dpdGgoIj0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgInRyYW5zcG9ydC1wYWRkaW5nIgotICAgICAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpbmUuY2hhckF0KHBvcykgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZS5zdWJzdHJpbmcoMCwgcG9zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXHJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoU3RyaW5nIGZpcnN0U3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoZmlyc3RTdHJpbmcpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IGdldExpbmUoKTsKLSAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIkZpbGUgZW5kZWQgZHVyaW5nIHBhcnNpbmcgQkFTRTY0IGJpbmFyeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIE1haW5seSBmb3IgIkFEUiIsICJPUkciLCBhbmQgIk4iCi0gICAgICogPC9wPgotICAgICAqLwotICAgIC8qCi0gICAgICogYWRkcmVzc3BhcnRzID0gMCo2KHN0cm5vc2VtaSAiOyIpIHN0cm5vc2VtaSA7IFBPIEJveCwgRXh0ZW5kZWQgQWRkciwKLSAgICAgKiBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLCBDb3VudHJ5IE5hbWUgb3JncGFydHMgPQotICAgICAqICooc3Rybm9zZW1pICI7Iikgc3Rybm9zZW1pIDsgRmlyc3QgaXMgT3JnYW5pemF0aW9uIE5hbWUsIHJlbWFpbmRlciBhcmUKLSAgICAgKiBPcmdhbml6YXRpb24gVW5pdHMuIG5hbWVwYXJ0cyA9IDAqNChzdHJub3NlbWkgIjsiKSBzdHJub3NlbWkgOyBGYW1pbHksCi0gICAgICogR2l2ZW4sIE1pZGRsZSwgUHJlZml4LCBTdWZmaXguIDsgRXhhbXBsZTpQdWJsaWM7Sm9objtRLjtSZXZlcmVuZCBEci47SUlJLAotICAgICAqIEVzcS4gc3Rybm9zZW1pID0gKigqbm9uc2VtaSAoIlw7IiAvICJcIiBDUkxGKSkgKm5vbnNlbWkgOyBUbyBpbmNsdWRlIGEKLSAgICAgKiBzZW1pY29sb24gaW4gdGhpcyBzdHJpbmcsIGl0IG11c3QgYmUgZXNjYXBlZCA7IHdpdGggYSAiXCIgY2hhcmFjdGVyLiBXZQotICAgICAqIGRvIG5vdCBjYXJlIHRoZSBudW1iZXIgb2YgInN0cm5vc2VtaSIgaGVyZS4gV2UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgd2UKLSAgICAgKiBzaG91bGQgYWRkICJcIiBDUkxGIHRvIGVhY2ggdmFsdWUuIFdlIGV4Y2x1ZGUgdGhlbSBmb3Igbm93LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU11bHRpcGxlUHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICAvLyB2Q2FyZCAyLjEgZG9lcyBub3QgYWxsb3cgUVVPVEVELVBSSU5UQUJMRSBoZXJlLCBidXQgc29tZQotICAgICAgICAvLyBzb2Z0d2FyZXMvZGV2aWNlcwotICAgICAgICAvLyBlbWl0IHN1Y2ggZGF0YS4KLSAgICAgICAgaWYgKG1DdXJyZW50RW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gZ2V0UXVvdGVkUHJpbnRhYmxlKHByb3BlcnR5VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUludGVycHJldGVyLnByb3BlcnR5VmFsdWVzKFZDYXJkVXRpbHMuY29uc3RydWN0TGlzdEZyb21WYWx1ZShwcm9wZXJ0eVZhbHVlLAotICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKSkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogdkNhcmQgMi4xIHNwZWNpZmllcyBBR0VOVCBhbGxvd3Mgb25lIHZjYXJkIGVudHJ5LiBDdXJyZW50bHkgd2UgZW1pdCBhbgotICAgICAqIGVycm9yIHRvd2FyZCB0aGUgQUdFTlQgcHJvcGVydHkuCi0gICAgICogLy8gVE9ETzogU3VwcG9ydCBBR0VOVCBwcm9wZXJ0eS4KLSAgICAgKiBpdGVtID0KLSAgICAgKiAuLi4gLyBbZ3JvdXBzICIuIl0gIkFHRU5UIiBbcGFyYW1zXSAiOiIgdmNhcmQgQ1JMRiB2Y2FyZCA9ICJCRUdJTiIgW3dzXQotICAgICAqICI6IiBbd3NdICJWQ0FSRCIgW3dzXSAxKkNSTEYgaXRlbXMgKkNSTEYgIkVORCIgW3dzXSAiOiIgW3dzXSAiVkNBUkQiCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWdlbnQoZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcHJvcGVydHlWYWx1ZS50b1VwcGVyQ2FzZSgpLmNvbnRhaW5zKCJCRUdJTjpWQ0FSRCIpKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IGludmFsaWQgbGluZSBzZWVuIGluIFdpbmRvd3MgTW9iaWxlIDYuNS4gSWdub3JlIHRoZW0uCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRBZ2VudE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQUdFTlQgUHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBub3cuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgdkNhcmQgMy4wLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB1bmVzY2FwZWQgU3RyaW5nIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHVuZXNjYXBlZC4gUmV0dXJuCi0gICAgICogbnVsbCBvdGhlcndpc2UuIGUuZy4gSW4gdkNhcmQgMi4xLCAiXDsiIHNob3VsZCBiZSB1bmVzY2FwZWQgaW50byAiOyIKLSAgICAgKiB3aGlsZSAiXHgiIHNob3VsZCBub3QgYmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlQ2hhcmFjdGVyKGNoKTsKLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICAvLyBPcmlnaW5hbCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyB0cmFuc2Zvcm1hdGlvbgotICAgICAgICAvLyAiXDoiIC0+ICI6IiwgIlwsIiAtPiAiLCIsIGFuZCAiXFwiIC0+ICJcIiwgYnV0IHByZXZpb3VzCi0gICAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgIC8vIHRoaXMgY2xhc3MgYWxsb3dlZCB0aGVtLCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgICBpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSAnOycgfHwgY2ggPT0gJzonIHx8IGNoID09ICcsJykgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dQZXJmb3JtYW5jZUluZm8oKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUb3RhbCBwYXJzaW5nIHRpbWU6ICAiICsgbVRpbWVUb3RhbCArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRvdGFsIHJlYWRMaW5lIHRpbWU6ICIgKyBtUmVhZGVyLmdldFRvdGFsbWlsbGlzZWNvbmQoKSArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIHRoZSBiZWdnaW5pbmcgb2YgdGhlIHJlY29yZDogIiArIG1UaW1lUmVhZFN0YXJ0UmVjb3JkCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyB0aGUgZW5kIG9mIHRoZSByZWNvcmQ6ICIgKyBtVGltZVJlYWRFbmRSZWNvcmQgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIGxpbmUsIGFuZCBoYW5kbGluZyBncm91cDogIiArIG1UaW1lUGFyc2VMaW5lQW5kSGFuZGxlR3JvdXAKLSAgICAgICAgICAgICAgICArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIHBhcnNpbmcgQURSLCBPUkcsIGFuZCBOIGZpZWxkczoiICsgbVRpbWVQYXJzZUFkck9yZ04gKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBwYXJzaW5nIHByb3BlcnR5IHZhbHVlczogIiArIG1UaW1lUGFyc2VQcm9wZXJ0eVZhbHVlcyArICIgbXMiKTsKLSAgICAgICAgTG9nLmQoTE9HX1RBRywgIlRpbWUgZm9yIGhhbmRsaW5nIG5vcm1hbCBwcm9wZXJ0eSB2YWx1ZXM6ICIgKyBtVGltZUhhbmRsZU1pc2NQcm9wZXJ0eVZhbHVlCi0gICAgICAgICAgICAgICAgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBRdW90ZWQtUHJpbnRhYmxlOiAiICsgbVRpbWVIYW5kbGVRdW90ZWRQcmludGFibGUgKyAiIG1zIik7Ci0gICAgICAgIExvZy5kKExPR19UQUcsICJUaW1lIGZvciBoYW5kbGluZyBCYXNlNjQ6ICIgKyBtVGltZUhhbmRsZUJhc2U2NCArICIgbXMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHtAbGluayBWQ2FyZENvbmZpZyNWRVJTSU9OXzIxfQotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMjE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGxpbmsgVkNhcmRDb25maWcjVkVSU0lPTl8zMH0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YyMTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25Qcm9wZXJ0eU5hbWVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duUHJvcGVydHlOYW1lU2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blR5cGVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0tub3duVHlwZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0S25vd25WYWx1ZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YyMS5zS25vd25WYWx1ZVNldDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0QXZhaWxhYmxlRW5jb2RpbmdTZXQoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFBhcnNlcl9WMjEuc0F2YWlsYWJsZUVuY29kaW5nOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9FTkNPRElORzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVycHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIklucHV0U3RyZWFtIG11c3Qgbm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciB0bXBSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIG1JbnRlcm1lZGlhdGVDaGFyc2V0KTsKLSAgICAgICAgbVJlYWRlciA9IG5ldyBDdXN0b21CdWZmZXJlZFJlYWRlcih0bXBSZWFkZXIpOwotCi0gICAgICAgIG1JbnRlcnByZXRlciA9IChpbnRlcnByZXRlciAhPSBudWxsID8gaW50ZXJwcmV0ZXIgOiBuZXcgRW1wdHlJbnRlcnByZXRlcigpKTsKLQotICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtSW50ZXJwcmV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUludGVycHJldGVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWQ2FyZEZpbGUoKTsKLSAgICAgICAgaWYgKG1JbnRlcnByZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSW50ZXJwcmV0ZXIuZW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVUb3RhbCArPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotCi0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5zaG93UGVyZm9ybWFuY2VMb2coKSkgewotICAgICAgICAgICAgc2hvd1BlcmZvcm1hbmNlSW5mbygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtQ2FuY2VsZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJJbXBsX1YzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFkOWEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBhY2hpZXZpbmcgdkNhcmQgMy4wIHBhcnNpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaW5oZXJpdHMgdkNhcmQgMi4xIGltcGxlbWVudGF0aW9uIHNpbmNlIHRlY2huaWNhbGx5IHRoZXkgYXJlIHNpbWlsYXIsCi0gKiB3aGlsZSBzcGVjaWZpY2FsbHkgdGhlcmUncyBsb2dpY2FsIG5vIHJlbGV2YW5jZSBiZXR3ZWVuIHRoZW0uCi0gKiBTbyB0aGF0IGRldmVsb3BlcnMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHRoZSBpbmhlcml0YW5jZSwKLSAqIHtAbGluayBWQ2FyZFBhcnNlcl9WMzB9IGRvZXMgbm90IGluaGVyaXQge0BsaW5rIFZDYXJkUGFyc2VyX1YyMX0sIHdoaWxlCi0gKiB7QGxpbmsgVkNhcmRQYXJzZXJJbXBsX1YzMH0gaW5oZXJpdHMge0BsaW5rIFZDYXJkUGFyc2VySW1wbF9WMjF9LgotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjMwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YyMSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1YzMCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtUHJldmlvdXNMaW5lOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRW1pdHRlZEFnZW50V2FybmluZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VySW1wbF9WMzAoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBzdXBlcih2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdkNhcmQgMy4wIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgd2l0aCBzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCi0gICAgICogbXVzdCBiZSBjb21iaW5lZCB3aXRoIHByZXZpb3VzIGxpbmUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROb25FbXB0eUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gbVJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0ID0gbVByZXZpb3VzTGluZTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzTGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBWQ2FyZEV4Y2VwdGlvbigiUmVhY2hlZCBlbmQgb2YgYnVmZmVyLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmlvdXNMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldCA9IG1QcmV2aW91c0xpbmU7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnIHx8IGxpbmUuY2hhckF0KDApID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBTZWN0aW9uIDUuOC4xIG9mIFJGQyAyNDI1IChNSU1FLURJUiBkb2N1bWVudCkuCi0gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBpcyB0aGUgZXhjZXJwdHMgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24gdGhhdCBleGlzdHMgb24gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIENhbiBiZSByZXByZXNlbnRlZCBhczoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gREVTQ1JJUFRJT046VGhpcyBpcyBhIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gIHRoYXQgZXhpc3RzIG9uIGEgbG9uZyBsaW5lLgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBJdCBjb3VsZCBhbHNvIGJlIHJlcHJlc2VudGVkIGFzOgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICAvLyBERVNDUklQVElPTjpUaGlzIGlzIGEgbG9uZyBkZXNjcmlwCi0gICAgICAgICAgICAgICAgICAgIC8vICB0aW9uIHRoYXQgZXhpc3RzIG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIG4gYSBsb25nIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobVByZXZpb3VzTGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c0xpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChsaW5lLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJTcGFjZSBleGlzdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c0xpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBtUHJldmlvdXNMaW5lOwotICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHZjYXJkID0gW2dyb3VwICIuIl0gIkJFR0lOIiAiOiIgIlZDQVJEIiAxICogQ1JMRgotICAgICAqICAgICAgICAgMSAqIChjb250ZW50bGluZSkKLSAgICAgKiAgICAgICAgIDtBIHZDYXJkIG9iamVjdCBNVVNUIGluY2x1ZGUgdGhlIFZFUlNJT04sIEZOIGFuZCBOIHR5cGVzLgotICAgICAqICAgICAgICAgW2dyb3VwICIuIl0gIkVORCIgIjoiICJWQ0FSRCIgMSAqIENSTEYKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkQmVnaW5WQ2FyZChib29sZWFuIGFsbG93R2FyYmFnZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRCZWdpblZDYXJkKGFsbG93R2FyYmFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEVuZFZDYXJkKGJvb2xlYW4gdXNlQ2FjaGUsIGJvb2xlYW4gYWxsb3dHYXJiYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE86IHZDYXJkIDMuMCBzdXBwb3J0cyBncm91cC4KLSAgICAgICAgc3VwZXIucmVhZEVuZFZDYXJkKHVzZUNhY2hlLCBhbGxvd0dhcmJhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBhbGxvd3MgaWFuYS10b2tlbiBhcyBwYXJhbVR5cGUsIHdoaWxlIHZDYXJkIDIuMSBkb2VzIG5vdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQYXJhbXMoZmluYWwgU3RyaW5nIHBhcmFtcykgdGhyb3dzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZVBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9IGNhdGNoIChWQ2FyZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBtYXliZSBJQU5BIHR5cGUKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gcGFyYW1zLnNwbGl0KCI9IiwgMik7Ci0gICAgICAgICAgICBpZiAoc3RyQXJyYXkubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbnlQYXJhbShzdHJBcnJheVswXSwgc3RyQXJyYXlbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IG5vdCBjb21lIGhlcmUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGFyYW1zIHZhbHVlOiAiICsgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFueVBhcmFtKGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZShwYXJhbU5hbWUpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUGFyYW1XaXRob3V0TmFtZShmaW5hbCBTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICBoYW5kbGVUeXBlKHBhcmFtVmFsdWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIHZDYXJkIDMuMCBkZWZpbmVzCi0gICAgICoKLSAgICAgKiAgcGFyYW0gICAgICAgICA9IHBhcmFtLW5hbWUgIj0iIHBhcmFtLXZhbHVlICooIiwiIHBhcmFtLXZhbHVlKQotICAgICAqICBwYXJhbS1uYW1lICAgID0gaWFuYS10b2tlbiAvIHgtbmFtZQotICAgICAqICBwYXJhbS12YWx1ZSAgID0gcHRleHQgLyBxdW90ZWQtc3RyaW5nCi0gICAgICogIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgUVNBRkUtQ0hBUiBEUVVPVEUKLSAgICAgKiAgUVNBRkUtQ0hBUiAgICA9IFdTUCAvICV4MjEgLyAleDIzLTdFIC8gTk9OLUFTQ0lJCi0gICAgICogICAgICAgICAgICAgICAgOyBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBDVExzLCBEUVVPVEUKLSAgICAgKgotICAgICAqICBRU0FGRS1DSEFSIG11c3Qgbm90IGNvbnRhaW4gRFFVT1RFLCBpbmNsdWRpbmcgZXNjYXBlZCBvbmUgKFwiKS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlKGZpbmFsIFN0cmluZyBwYXJhbVZhbHVlKSB7Ci0gICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVHlwZSgiVFlQRSIpOwotICAgICAgICBzcGxpdEFuZFB1dFBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHBhcmFtZXRlciB2YWx1ZXMgaW50byBwaWVjZXMgaW4gYWNjb3JkYW5jZSB3aXRoIHZDYXJkIDMuMCBzcGVjaWZpY2F0aW9uIGFuZAotICAgICAqIHB1dHMgcGllY2VzIGludG8gbUludGVycHJldGVyLgotICAgICAqLwotICAgIC8qCi0gICAgICogIHBhcmFtLXZhbHVlICAgPSBwdGV4dCAvIHF1b3RlZC1zdHJpbmcKLSAgICAgKiAgcXVvdGVkLXN0cmluZyA9IERRVU9URSBRU0FGRS1DSEFSIERRVU9URQotICAgICAqICBRU0FGRS1DSEFSICAgID0gV1NQIC8gJXgyMSAvICV4MjMtN0UgLyBOT04tQVNDSUkKLSAgICAgKiAgICAgICAgICAgICAgICA7IEFueSBjaGFyYWN0ZXIgZXhjZXB0IENUTHMsIERRVU9URQotICAgICAqCi0gICAgICogIFFTQUZFLUNIQVIgbXVzdCBub3QgY29udGFpbiBEUVVPVEUsIGluY2x1ZGluZyBlc2NhcGVkIG9uZSAoXCIpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNwbGl0QW5kUHV0UGFyYW1WYWx1ZShTdHJpbmcgcGFyYW1WYWx1ZSkgewotICAgICAgICAvLyAiY29tbWEsc2VwYXJhdGVkOmluc2lkZS5kcXVvdGUiLHByZWYKLSAgICAgICAgLy8gICAtLT4KLSAgICAgICAgLy8gLSBjb21tYSxzZXBhcmF0ZWQ6aW5zaWRlLmRxdW90ZQotICAgICAgICAvLyAtIHByZWYKLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZTogVGhvdWdoIHRoZXJlJ3MgYSBjb2RlLCB3ZSBkb24ndCBuZWVkIHRvIHRha2UgbXVjaCBjYXJlIG9mCi0gICAgICAgIC8vIHdyb25nbHktYWRkZWQgcXVvdGVzIGxpa2UgdGhlIGV4YW1wbGUgYWJvdmUsIGFzIHRoZXkgaW5kdWNlCi0gICAgICAgIC8vIHBhcnNlIGVycm9ycyBhdCB0aGUgdG9wIGxldmVsICh3aGVuIHNwbGl0dGluZyBhIGxpbmUgaW50byBwYXJ0cykuCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7ICAvLyBEZWxheSBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgYm9vbGVhbiBpbnNpZGVEcXVvdGUgPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHBhcmFtVmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSBwYXJhbVZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBEcXVvdGUuCi0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGluc2lkZURxdW90ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVmInF1b3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5leHBlY3RlZCBEcXVvdGUgaW5zaWRlIHByb3BlcnR5LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZiwicXVvdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJxdW90ZWQiLHByZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwcmV0ZXIucHJvcGVydHlQYXJhbVZhbHVlKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5zaWRlRHF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcsJyAmJiAhaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQ29tbWEgaXMgdXNlZCBiZWZvcmUgYWN0dWFsIHN0cmluZyBjb21lcy4gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUbyBzdG9wIGNyZWF0aW5nIGVtcHR5IFN0cmluZ0J1ZmZlciBhdCB0aGUgZW5kIG9mIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAvLyB3ZSBkZWxheSBjcmVhdGluZyB0aGlzIG9iamVjdCB1bnRpbCB0aGlzIHBvaW50LgotICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaW5zaWRlRHF1b3RlKSB7Ci0gICAgICAgICAgICAvLyBlLmcuCi0gICAgICAgICAgICAvLyAibm9uLXF1b3RlLWF0LWVuZAotICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIkRhbmdsaW5nIERxdW90ZS4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlVuaW50ZW5kZWQgYmVoYXZpb3IuIFdlIG11c3Qgbm90IHNlZSBlbXB0eSBTdHJpbmdCdWlsZGVyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImF0IHRoZSBlbmQgb2YgcGFyYW1ldGVyIHZhbHVlIHBhcnNpbmcuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1JbnRlcnByZXRlci5wcm9wZXJ0eVBhcmFtVmFsdWUoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFnZW50KGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIC8vIFRoZSB3YXkgaG93IHZDYXJkIDMuMCBzdXBwb3J0cyAiQUdFTlQiIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdkNhcmQgMi4xLgotICAgICAgICAvLwotICAgICAgICAvLyBlLmcuCi0gICAgICAgIC8vIEFHRU5UOkJFR0lOOlZDQVJEXG5GTjpKb2UgRnJpZGF5XG5URUw6KzEtOTE5LTU1NS03ODc4XG4KLSAgICAgICAgLy8gIFRJVExFOkFyZWEgQWRtaW5pc3RyYXRvclwsIEFzc2lzdGFudFxuIEVNQUlMXDtUWVBFPUlOVEVSTlxuCi0gICAgICAgIC8vICBFVDpqZnJpZGF5QGhvc3QuY29tXG5FTkQ6VkNBUkRcbgotICAgICAgICAvLwotICAgICAgICAvLyBUT0RPOiBmaXggdGhpcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaXNzdWU6Ci0gICAgICAgIC8vICB2Q2FyZCAzLjAgYWxzbyBhbGxvd3MgdGhpcyBhcyBhbiBleGFtcGxlLgotICAgICAgICAvLwotICAgICAgICAvLyBBR0VOVDtWQUxVRT11cmk6Ci0gICAgICAgIC8vICBDSUQ6SlFQVUJMSUMucGFydDMuOTYwMTI5VDA4MzAyMC54eXpNYWlsQGhvc3QzLmNvbQotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIG5vdCB2Q2FyZC4gU2hvdWxkIHdlIHN1cHBvcnQgdGhpcz8KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSnVzdCBpZ25vcmUgdGhlIGxpbmUgZm9yIG5vdywgc2luY2Ugd2UgY2Fubm90IGtub3cgaG93IHRvIGhhbmRsZSBpdC4uLgotICAgICAgICBpZiAoIW1FbWl0dGVkQWdlbnRXYXJuaW5nKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiQUdFTlQgaW4gdkNhcmQgMy4wIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBJZ25vcmUgaXQiKTsKLSAgICAgICAgICAgIG1FbWl0dGVkQWdlbnRXYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZDYXJkIDMuMCBkb2VzIG5vdCByZXF1aXJlIHR3byBDUkxGIGF0IHRoZSBsYXN0IG9mIEJBU0U2NCBkYXRhLgotICAgICAqIEl0IG9ubHkgcmVxdWlyZXMgdGhhdCBkYXRhIHNob3VsZCBiZSBNSU1FLWVuY29kZWQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlNjQoZmluYWwgU3RyaW5nIGZpcnN0U3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKGZpcnN0U3RyaW5nKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSBnZXRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFZDYXJkRXhjZXB0aW9uKCJGaWxlIGVuZGVkIGR1cmluZyBwYXJzaW5nIEJBU0U2NCBiaW5hcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxpbmUuc3RhcnRzV2l0aCgiICIpICYmICFsaW5lLnN0YXJ0c1dpdGgoIlx0IikpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFU0NBUEVELUNIQVIgPSAiXFwiIC8gIlw7IiAvICJcLCIgLyAiXG4iIC8gIlxOIikKLSAgICAgKiAgICAgICAgICAgICAgOyBcXCBlbmNvZGVzIFwsIFxuIG9yIFxOIGVuY29kZXMgbmV3bGluZQotICAgICAqICAgICAgICAgICAgICA7IFw7IGVuY29kZXMgOywgXCwgZW5jb2RlcyAsCi0gICAgICoKLSAgICAgKiBOb3RlOiBBcHBsZSBlc2NhcGVzICc6JyBpbnRvICdcOicgd2hpbGUgZG9lcyBub3QgZXNjYXBlICdcJwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWF5YmVVbmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIHVuZXNjYXBlVGV4dCh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgY2hhciBuZXh0X2NoID0gdGV4dC5jaGFyQXQoKytpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dF9jaCA9PSAnbicgfHwgbmV4dF9jaCA9PSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dF9jaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heWJlVW5lc2NhcGVDaGFyYWN0ZXIoZmluYWwgY2hhciBjaCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVDaGFyYWN0ZXIoY2gpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1YzMC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlckltcGxfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTc2YmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VySW1wbF9WNDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIEJhc2ljIGltcGxlbWVudGF0aW9uIHBhcnNpbmcgdkNhcmQgNC4wLgotICogPC9wPgotICogPHA+Ci0gKiB2Q2FyZCA0LjAgaXMgbm90IHB1Ymxpc2hlZCB5ZXQuIEFsc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmVtYXR1cmUuIAotICogPC9wPgotICogQGhpZGUKLSAqLwotLyogcGFja2FnZSAqLyBjbGFzcyBWQ2FyZFBhcnNlckltcGxfVjQwIGV4dGVuZHMgVkNhcmRQYXJzZXJJbXBsX1YzMCB7Ci0gICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRQYXJzZXJJbXBsX1Y0MCI7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJJbXBsX1Y0MChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIHN1cGVyKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1Y0MDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSBlc2NhcGUgIlxOIiBpbnRvIG5ldyBsaW5lIGZvciBzYWZldHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYXliZVVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICByZXR1cm4gdW5lc2NhcGVUZXh0KHRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewotICAgICAgICAvLyBUT0RPOiBtb3JlIHN0cmljdGx5LCB2Q2FyZCA0LjAgcmVxdWlyZXMgZGlmZmVyZW50IHR5cGUgb2YgdW5lc2NhcGluZyBydWxlCi0gICAgICAgIC8vICAgICAgIHRvd2FyZCBlYWNoIHByb3BlcnR5LgotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIG5leHRfY2ggPSB0ZXh0LmNoYXJBdCgrK2kpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0X2NoID09ICduJyB8fCBuZXh0X2NoID09ICdOJykgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0X2NoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZXNjYXBlQ2hhcmFjdGVyKGZpbmFsIGNoYXIgY2gpIHsKLSAgICAgICAgaWYgKGNoID09ICduJyB8fCBjaCA9PSAnTicpIHsKLSAgICAgICAgICAgIHJldHVybiAiXG4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRLbm93blByb3BlcnR5TmFtZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIFZDYXJkUGFyc2VyX1Y0MC5zS25vd25Qcm9wZXJ0eU5hbWVTZXQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YTE3Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPC9wPgotICogdkNhcmQgcGFyc2VyIGZvciB2Q2FyZCAyLjEuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWwgYWJvdXQgdGhlIHNwZWMgaXRzZWxmLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlYyBpcyB3cml0dGVuIGluIDE5OTYsIGFuZCBjdXJyZW50bHkgdmFyaW91cyB0eXBlcyBvZiAidkNhcmQgMi4xIiBleGlzdC4KLSAqIFRvIGhhbmRsZSByZWFsIHRoZSB3b3JsZCB2Q2FyZCBmb3JtYXRzIGFwcHJvcHJpYXRlbHkgYW5kIGVmZmVjdGl2ZWx5LCB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gKiBvYmV5IHdpdGggc3RyaWN0IHZDYXJkIDIuMS4KLSAqIEluIHN0ZWFkLCBub3Qgb25seSB2Q2FyZCBzcGVjIGJ1dCBhbHNvIHJlYWwgd29ybGQgdkNhcmQgaXMgY29uc2lkZXJlZC4KLSAqIDwvcD4KLSAqIGUuZy4gQSBsb3Qgb2YgZGV2aWNlcyBhbmQgc29mdHdhcmVzIGxldCB2Q2FyZCBpbXBvcnRlci9leHBvcnRlciB0byB1c2UKLSAqIHRoZSBQTkcgZm9ybWF0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBpbWFnZSwgd2hpbGUgaXQgaXMgbm90IGFsbG93ZWQgaW4KLSAqIHRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uLiBBcyBvZiAyMDEwLCB3ZSBjYW4gc2VlIGV2ZW4gdGhlIEZMViBmb3JtYXQKLSAqIChwb3NzaWJsZSBpbiBKYXBhbmVzZSBtb2JpbGUgcGhvbmVzKS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZDYXJkUGFyc2VyX1YyMSBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKioKLSAgICAgKiBBIHVubW9kaWZpYWJsZSBTZXQgc3RvcmluZyB0aGUgcHJvcGVydHkgbmFtZXMgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkJFR0lOIiwgIkxPR08iLCAiUEhPVE8iLCAiTEFCRUwiLCAiRk4iLCAiVElUTEUiLCAiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWRVJTSU9OIiwgIlRFTCIsICJFTUFJTCIsICJUWiIsICJHRU8iLCAiTk9URSIsICJVUkwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCREFZIiwgIlJPTEUiLCAiUkVWIiwgIlVJRCIsICJLRVkiLCAiTUFJTEVSIikpKTsKLQotICAgIC8qKgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB0eXBlcyBrbm93biBpbiB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVHlwZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiRE9NIiwgIklOVEwiLCAiUE9TVEFMIiwgIlBBUkNFTCIsICJIT01FIiwgIldPUksiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUkVGIiwgIlZPSUNFIiwgIkZBWCIsICJNU0ciLCAiQ0VMTCIsICJQQUdFUiIsICJCQlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNT0RFTSIsICJDQVIiLCAiSVNETiIsICJWSURFTyIsICJBT0wiLCAiQVBQTEVMSU5LIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRUTUFJTCIsICJDSVMiLCAiRVdPUkxEIiwgIklOVEVSTkVUIiwgIklCTU1BSUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQ0lNQUlMIiwgIlBPV0VSU0hBUkUiLCAiUFJPRElHWSIsICJUTFgiLCAiWDQwMCIsICJHSUYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDR00iLCAiV01GIiwgIkJNUCIsICJNRVQiLCAiUE1CIiwgIkRJQiIsICJQSUNUIiwgIlRJRkYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQREYiLCAiUFMiLCAiSlBFRyIsICJRVElNRSIsICJNUEVHIiwgIk1QRUcyIiwgIkFWSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBVkUiLCAiQUlGRiIsICJQQ00iLCAiWDUwOSIsICJQR1AiKSkpOwotCi0gICAgLyoqCi0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIlZBTFVFIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0tub3duVmFsdWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIklOTElORSIsICJVUkwiLCAiQ09OVEVOVC1JRCIsICJDSUQiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHRoZSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFRob3VnaCB2Q2FyZCAyLjEgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyAiQiIgZW5jb2RpbmcsIHNvbWUgZGF0YSBtYXkgaGF2ZSBpdC4KLSAgICAgKiBXZSBhbGxvdyBpdCBmb3Igc2FmZXR5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQXZhaWxhYmxlRW5jb2RpbmcgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjIxIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WMjEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjIxKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjIxKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFBhcnNlcl9WMzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZDNhOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIHZDYXJkIHBhcnNlciBmb3IgdkNhcmQgMy4wLiBTZWUgUkZDIDI0MjYgZm9yIG1vcmUgZGV0YWlsLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHBhcnNlciBhbGxvd3MgdkNhcmQgZm9ybWF0IHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBSRkMsIHNpbmNlCi0gKiB3ZSBoYXZlIHNlZW4gc2V2ZXJhbCB2Q2FyZCAzLjAgZmlsZXMgd2hpY2ggZG9uJ3QgY29tcGx5IHdpdGggaXQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIGUuZy4gdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93ICJDSEFSU0VUIiBhdHRyaWJ1dGUsIGJ1dCBzb21lIGFjdHVhbCBmaWxlcwotICogaGF2ZSBpdCBhbmQgdGhleSB1c2VzIG5vbiBVVEYtOCBjaGFyc2V0cy4gVVRGLTggaXMgcmVjb21tZW5kZWQgaW4gUkZDIDI0MjYsCi0gKiBidXQgaXQgaXMgbm90IGEgbXVzdC4gV2Ugc2lsZW50bHkgYWxsb3cgIkNIQVJTRVQiLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRQYXJzZXJfVjMwIGltcGxlbWVudHMgVkNhcmRQYXJzZXIgewotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNLbm93blByb3BlcnR5TmFtZVNldCA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAiQkVHSU4iLCAiTE9HTyIsICJQSE9UTyIsICJMQUJFTCIsICJGTiIsICJUSVRMRSIsICJTT1VORCIsIAotICAgICAgICAgICAgICAgICAgICAiVkVSU0lPTiIsICJURUwiLCAiRU1BSUwiLCAiVFoiLCAiR0VPIiwgIk5PVEUiLCAiVVJMIiwKLSAgICAgICAgICAgICAgICAgICAgIkJEQVkiLCAiUk9MRSIsICJSRVYiLCAiVUlEIiwgIktFWSIsICJNQUlMRVIiLCAvLyAyLjEKLSAgICAgICAgICAgICAgICAgICAgIk5BTUUiLCAiUFJPRklMRSIsICJTT1VSQ0UiLCAiTklDS05BTUUiLCAiQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAiU09SVC1TVFJJTkciLCAiQ0FURUdPUklFUyIsICJQUk9ESUQiKSkpOyAvLyAzLjAKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIEEgdW5tb2RpZmlhYmxlIFNldCBzdG9yaW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBlICJFTkNPRElORyIsIGF2YWlsYWJsZSBpbiB0aGUgdkNhcmQgMy4wLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaG91Z2ggdkNhcmQgMi4xIHNwZWNpZmljYXRpb24gZG9lcyBub3QgYWxsb3cgIjdCSVQiIG9yICJCQVNFNjQiLCB3ZSBhbGxvdyB0aGVtIGZvciBzYWZldHkuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqICJRVU9URUQtUFJJTlRBQkxFIiBpcyBub3QgYWxsb3dlZCBpbiB2Q2FyZCAzLjAgYW5kIG5vdCBpbiB0aGlzIHBhcnNlciBlaXRoZXIsCi0gICAgICogYmVjYXVzZSB0aGUgZW5jb2RpbmcgYW1iaWd1YXRlcyBob3cgdGhlIHZDYXJkIGZpbGUgdG8gYmUgcGFyc2VkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzQWNjZXB0YWJsZUVuY29kaW5nID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzdCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HXzhCSVQsCi0gICAgICAgICAgICAgICAgICAgIFZDYXJkQ29uc3RhbnRzLlBBUkFNX0VOQ09ESU5HX0JBU0U2NCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fRU5DT0RJTkdfQikpKTsKLQotICAgIHByaXZhdGUgZmluYWwgVkNhcmRQYXJzZXJJbXBsX1YzMCBtVkNhcmRQYXJzZXJJbXBsOwotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjMwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZDYXJkUGFyc2VyX1YzMChpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwgPSBuZXcgVkNhcmRQYXJzZXJJbXBsX1YzMCh2Y2FyZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzLCBWQ2FyZEludGVycHJldGVyIGludGVyZXByZXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLnBhcnNlKGlzLCBpbnRlcmVwcmV0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbC5jYW5jZWwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRQYXJzZXJfVjQwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTJmNjguLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkUGFyc2VyX1Y0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiB2Q2FyZCBwYXJzZXIgZm9yIHZDYXJkIDQuMC4KLSAqIDwvcD4KLSAqIDxwPgotICogQ3VycmVudGx5IHRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHZDYXJkIDQuMCBzcGVjaWZpY2F0aW9uIHJldiAxMS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkUGFyc2VyX1Y0MCBpbXBsZW1lbnRzIFZDYXJkUGFyc2VyIHsKLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25Qcm9wZXJ0eU5hbWVTZXQgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgIkJFR0lOIiwgIkVORCIsICJTT1VSQ0UiLCAiTkFNRSIsICJLSU5EIiwgIlhNTCIsCi0gICAgICAgICAgICAgICAgICAgICJGTiIsICJOIiwgIk5JQ0tOQU1FIiwgIlBIT1RPIiwgIkJEQVkiLCAiRERBWSIsCi0gICAgICAgICAgICAgICAgICAgICJCSVJUSCIsICJERUFUSCIsICJBTk5JVkVSU0FSWSIsICJTRVgiLCAiQURSIiwKLSAgICAgICAgICAgICAgICAgICAgIkxBQkVMIiwgIlRFTCIsICJFTUFJTCIsICJJTVBQIiwgIkxBTkciLCAiVFoiLAotICAgICAgICAgICAgICAgICAgICAiR0VPIiwgIlRJVExFIiwgIlJPTEUiLCAiTE9HTyIsICJPUkciLCAiTUVNQkVSIiwKLSAgICAgICAgICAgICAgICAgICAgIlJFTEFURUQiLCAiQ0FURUdPUklFUyIsICJOT1RFIiwgIlBST0RJRCIsCi0gICAgICAgICAgICAgICAgICAgICJSRVYiLCAiU09VTkQiLCAiVUlEIiwgIkNMSUVOVFBJRE1BUCIsCi0gICAgICAgICAgICAgICAgICAgICJVUkwiLCAiVkVSU0lPTiIsICJDTEFTUyIsICJLRVkiLCAiRkJVUkwiLCAiQ0FMRU5EUlVSSSIsCi0gICAgICAgICAgICAgICAgICAgICJDQUxVUkkiKSkpOwotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQSB1bm1vZGlmaWFibGUgU2V0IHN0b3JpbmcgdGhlIHZhbHVlcyBmb3IgdGhlIHR5cGUgIkVOQ09ESU5HIiwgYXZhaWxhYmxlIGluIHZDYXJkIDQuMC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gc0FjY2VwdGFibGVFbmNvZGluZyA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR184QklULAotICAgICAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QQVJBTV9FTkNPRElOR19CKSkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZFBhcnNlckltcGxfVjMwIG1WQ2FyZFBhcnNlckltcGw7Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsID0gbmV3IFZDYXJkUGFyc2VySW1wbF9WNDAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRQYXJzZXJfVjQwKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZDYXJkUGFyc2VySW1wbCA9IG5ldyBWQ2FyZFBhcnNlckltcGxfVjQwKHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMsIFZDYXJkSW50ZXJwcmV0ZXIgaW50ZXJlcHJldGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1WQ2FyZFBhcnNlckltcGwucGFyc2UoaXMsIGludGVyZXByZXRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2FuY2VsKCkgewotICAgICAgICBtVkNhcmRQYXJzZXJJbXBsLmNhbmNlbCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkU291cmNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2NDYxZS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRTb3VyY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyB3aGljaCB0cmllcyB0byBkZXRlY3RzIHRoZSBzb3VyY2Ugb2YgYSB2Q2FyZCBmaWxlIGZyb20gaXRzIGNvbnRlbnRzLgotICogPC9wPgotICogPHA+Ci0gKiBUaGUgc3BlY2lmaWNhdGlvbiBvZiB2Q2FyZCAoaW5jbHVkaW5nIGJvdGggMi4xIGFuZCAzLjApIGlzIG5vdCBzbyBzdHJpY3QgYXMgdG8KLSAqIGd1ZXNzIGl0cyBmb3JtYXQganVzdCBieSByZWFkaW5nIGJlZ2lubmluZyBmZXcgbGluZXMgKHVzdWFsbHkgd2UgY2FuLCBidXQgaW4KLSAqIHNvbWUgbW9zdCBwZXNzaW1pc3RpYyBjYXNlLCB3ZSBjYW5ub3QgdW50aWwgYXQgYWxtb3N0IHRoZSBlbmQgb2YgdGhlIGZpbGUpLgotICogQWxzbyB3ZSBjYW5ub3Qgc3RvcmUgYWxsIHZDYXJkIGVudHJpZXMgaW4gbWVtb3J5LCB3aGlsZSB0aGVyZSdzIG5vIHNwZWNpZmljYXRpb24KLSAqIGhvdyBiaWcgdGhlIHZDYXJkIGVudHJ5IHdvdWxkIGJlY29tZSBhZnRlciB0aGUgcGFyc2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgdXN1YWxseSB1c2VkIGZvciB0aGUgImZpcnN0IHNjYW4iLCBpbiB3aGljaCB3ZSBjYW4gdW5kZXJzdGFuZCB3aGljaCB2Q2FyZAotICogdmVyc2lvbiBpcyB1c2VkIChhbmQgaG93IG1hbnkgZW50cmllcyBleGlzdCBpbiBhIGZpbGUpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRTb3VyY2VEZXRlY3RvciBpbXBsZW1lbnRzIFZDYXJkSW50ZXJwcmV0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlZDYXJkU291cmNlRGV0ZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gQVBQTEVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlgtUEhPTkVUSUMtTUlERExFLU5BTUUiLCAiWC1QSE9ORVRJQy1MQVNULU5BTUUiLAotICAgICAgICAgICAgIlgtQUJBRFIiLCAiWC1BQlVJRCIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAiWC1HTk8iLCAiWC1HTiIsICJYLVJFRFVDVElPTiIpKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBXSU5ET1dTX01PQklMRV9QSE9ORV9TSUdOUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICJYLU1JQ1JPU09GVC1BU1NUX1RFTCIsICJYLU1JQ1JPU09GVC1BU1NJU1RBTlQiLCAiWC1NSUNST1NPRlQtT0ZGSUNFTE9DIikpOwotICAgIAotICAgIC8vIE5vdGU6IHRoZXNlIHNpZ25lcyBhcHBlYXJzIGJlZm9yZSB0aGUgc2lnbnMgb2YgdGhlIG90aGVyIHR5cGUgKGUuZy4gIlgtR04iKS4KLSAgICAvLyBJbiBvdGhlciB3b3JkcywgSmFwYW5lc2UgRk9NQSBtb2JpbGUgcGhvbmVzIGFyZSBkZXRlY3RlZCBhcyBGT01BLCBub3QgSkFQQU5FU0VfTU9CSUxFX1BIT05FUy4KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBGT01BX1NJR05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIlgtU0QtVkVSTiIsICJYLVNELUZPUk1BVF9WRVIiLCAiWC1TRC1DQVRFR09SSUVTIiwgIlgtU0QtQ0xBU1MiLCAiWC1TRC1EQ1JFQVRFRCIsCi0gICAgICAgICAgICAiWC1TRC1ERVNDUklQVElPTiIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFlQRV9GT01BX0NIQVJTRVRfU0lHTiA9ICJYLVNELUNIQVJfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIHRoYXQgbm8gZXN0aW1hdGlvbiBpcyBhdmFpbGFibGUuIFVzZXJzIG9mIHRoaXMgY2xhc3MgaXMgYWJsZSB0byB0aGlzCi0gICAgICogY29uc3RhbnQgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBsZXQgYSB2Q2FyZCBwYXJzZXIgcmVseSBvbiBlc3RpbWF0aW9uIGZvciBwYXJzZSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfVU5LTk9XTiA9IDA7Ci0KLSAgICAvLyBGb3IgQXBwbGUncyBzb2Z0d2FyZSwgd2hpY2ggZG9lcyBub3QgbWVhbiB0aGlzIHR5cGUgaXMgZWZmZWN0aXZlIGZvciBhbGwgaXRzIHByb2R1Y3RzLgotICAgIC8vIFdlIGNvbmZpcm1lZCB0aGV5IHVzdWFsbHkgdXNlIFVURi04LCBidXQgbm90IHN1cmUgYWJvdXQgdkNhcmQgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9BUFBMRSA9IDE7Ci0gICAgLy8gRm9yIEphcGFuZXNlIG1vYmlsZSBwaG9uZXMsIHdoaWNoIGFyZSB1c3VhbGx5IHVzaW5nIFNoaWZ0X0pJUyBhcyBhIGNoYXJzZXQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQID0gMjsKLSAgICAvLyBGb3Igc29tZSBvZiBtb2JpbGUgcGhvbmVzIHJlbGVhc2VkIGZyb20gRG9Db01vLCB3aGljaCB1c2UgbmVzdGVkIHZDYXJkLiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVCA9IDM7Ci0gICAgLy8gRm9yIEphcGFuZXNlIFdpbmRvd3MgTW9iZWwgcGhvbmVzLiBJdCdzIHZlcnNpb24gaXMgc3VwcG9zZWQgdG8gYmUgNi41LgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUCA9IDQ7Ci0KLSAgICBwcml2YXRlIGludCBtUGFyc2VUeXBlID0gMDsgIC8vIE5vdCBzdXJlLgotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVG9QYXJzZVZlcnNpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBtVmVyc2lvbiA9IC0xOyAgLy8gLTEgPT0gdW5rbm93bgotCi0gICAgLy8gU29tZSBtb2JpbGUgcGhvbmVzIChsaWtlIEZPTUEpIHRlbGxzIHVzIHRoZSBjaGFyc2V0IG9mIHRoZSBkYXRhLgotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvUGFyc2VDaGFyc2V0OwotICAgIHByaXZhdGUgU3RyaW5nIG1TcGVjaWZpZWRDaGFyc2V0OwotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbnRyeSgpIHsKLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbU5lZWRUb1BhcnNlQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGVuZFByb3BlcnR5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVudHJ5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5R3JvdXAoU3RyaW5nIGdyb3VwKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICBtTmVlZFRvUGFyc2VWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRV9GT01BX0NIQVJTRVRfU0lHTikpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOwotICAgICAgICAgICAgLy8gUHJvYmFibHkgU2hpZnRfSklTIGlzIHVzZWQsIGJ1dCB3ZSBzaG91bGQgZG91YmxlIGNvbmZpcm0uCi0gICAgICAgICAgICBtTmVlZFRvUGFyc2VDaGFyc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBhcnNlVHlwZSAhPSBQQVJTRV9UWVBFX1VOS05PV04pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoV0lORE9XU19NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX1dJTkRPV1NfTU9CSUxFX1Y2NV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChGT01BX1NJR05TLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICBtUGFyc2VUeXBlID0gUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDsKLSAgICAgICAgfSBlbHNlIGlmIChKQVBBTkVTRV9NT0JJTEVfUEhPTkVfU0lHTlMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIG1QYXJzZVR5cGUgPSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDsKLSAgICAgICAgfSBlbHNlIGlmIChBUFBMRV9TSUdOUy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgbVBhcnNlVHlwZSA9IFBBUlNFX1RZUEVfQVBQTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5UGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmIChtTmVlZFRvUGFyc2VWZXJzaW9uICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoVkNhcmRDb25zdGFudHMuVkVSU0lPTl9WMjEpKSB7Ci0gICAgICAgICAgICAgICAgbVZlcnNpb24gPSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5WRVJTSU9OX1YzMCkpIHsKLSAgICAgICAgICAgICAgICBtVmVyc2lvbiA9IFZDYXJkQ29uZmlnLlZFUlNJT05fMzA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25TdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlZFUlNJT05fVjQwKSkgewotICAgICAgICAgICAgICAgIG1WZXJzaW9uID0gVkNhcmRDb25maWcuVkVSU0lPTl80MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkludmFsaWQgdmVyc2lvbiBzdHJpbmc6ICIgKyB2ZXJzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTmVlZFRvUGFyc2VDaGFyc2V0ICYmIHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU3BlY2lmaWVkQ2hhcnNldCA9IHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhdmFpbGFibGUgdHlwZSBjYW4gYmUgdXNlZCB3aXRoIHZDYXJkIHBhcnNlci4gWW91IHByb2JhYmx5IG5lZWQgdG8KLSAgICAgKiB1c2Uge3tAbGluayAjZ2V0RXN0aW1hdGVkQ2hhcnNldCgpfSB0byB1bmRlcnN0YW5kIHRoZSBjaGFyc2V0IHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKG1QYXJzZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFSU0VfVFlQRV9ET0NPTU9fVE9SRUxBVEVfTkVTVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8gfCBWQ2FyZENvbmZpZy5GTEFHX1RPUkVMQVRFX05FU1Q7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfTU9CSUxFX1BIT05FX0pQOgotICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEU7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGlmIChtVmVyc2lvbiA9PSBWQ2FyZENvbmZpZy5WRVJTSU9OXzIxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVZlcnNpb24gPT0gVkNhcmRDb25maWcuVkVSU0lPTl8zMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1WZXJzaW9uID09IFZDYXJkQ29uZmlnLlZFUlNJT05fNDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjQwX0dFTkVSSUM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIGNoYXJzZXQgU3RyaW5nIGd1ZXNzZWQgZnJvbSB0aGUgc291cmNlJ3MgcHJvcGVydGllcy4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBwYXJzaW5nIHRhcmdldCBmaWxlKHMpLgotICAgICAqIDwvcD4KLSAgICAgKiBAcmV0dXJuIENoYXJzZXQgU3RyaW5nLiBOdWxsIGlzIHJldHVybmVkIGlmIGd1ZXNzaW5nIHRoZSBzb3VyY2UgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFc3RpbWF0ZWRDaGFyc2V0KCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVNwZWNpZmllZENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNwZWNpZmllZENoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChtUGFyc2VUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfV0lORE9XU19NT0JJTEVfVjY1X0pQOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX0RPQ09NT19UT1JFTEFURV9ORVNUOgotICAgICAgICAgICAgY2FzZSBQQVJTRV9UWVBFX01PQklMRV9QSE9ORV9KUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNISUZUX0pJUyI7Ci0gICAgICAgICAgICBjYXNlIFBBUlNFX1RZUEVfQVBQTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiY2VjYTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbi5WQ2FyZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkltOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkUG9zdGFsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLkRlY29kZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldC5RdW90ZWRQcmludGFibGVDb2RlYzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgVkNhcmQgaGFuZGxpbmcgY29kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWQ2FyZFV0aWxzIjsKLQotICAgIC8vIE5vdGUgdGhhdCBub3QgYWxsIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiB0aGlzIG1hcC9zZXQsIHNpbmNlLCBmb3IgZXhhbXBsZSwgVFlQRV9IT01FX0ZBWCBpcwotICAgIC8vIGNvbnZlcnRlZCB0byB0d28gcGFyYW1ldGVyIFN0cmluZ3MuIFRoZXNlIG9ubHkgY29udGFpbiBzb21lIG1pbm9yIGZpZWxkcyB2YWxpZCBpbiBib3RoCi0gICAgLy8gdkNhcmQgYW5kIGN1cnJlbnQgKGFzIG9mIDIwMDktMDgtMDcpIENvbnRhY3RzIHN0cnVjdHVyZS4gCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gc0tub3duUGhvbmVUeXBlTWFwX1N0b0k7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHNNb2JpbGVQaG9uZUxhYmVsU2V0OwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlc01hcF9JdG9TID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSSA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLQotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfQ0FSLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0NBUiwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVzTWFwX0l0b1MucHV0KFBob25lLlRZUEVfUEFHRVIsIFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUEFHRVIpOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9QQUdFUiwgUGhvbmUuVFlQRV9QQUdFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZXNNYXBfSXRvUy5wdXQoUGhvbmUuVFlQRV9JU0ROLCBWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0lTRE4pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9JU0ROLCBQaG9uZS5UWVBFX0lTRE4pOwotICAgICAgICAKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfSE9NRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfV09SSywgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfQ0VMTCwgUGhvbmUuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9PVEhFUiwgUGhvbmUuVFlQRV9PVEhFUik7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0NBTExCQUNLLAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfQ0FMTEJBQ0spOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoCi0gICAgICAgICAgICAgICAgVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9DT01QQU5ZX01BSU4sIFBob25lLlRZUEVfQ09NUEFOWV9NQUlOKTsKLSAgICAgICAgc0tub3duUGhvbmVUeXBlTWFwX1N0b0kucHV0KFZDYXJkQ29uc3RhbnRzLlBBUkFNX1BIT05FX0VYVFJBX1RZUEVfUkFESU8sIFBob25lLlRZUEVfUkFESU8pOwotICAgICAgICBzS25vd25QaG9uZVR5cGVNYXBfU3RvSS5wdXQoVkNhcmRDb25zdGFudHMuUEFSQU1fUEhPTkVfRVhUUkFfVFlQRV9UVFlfVERELAotICAgICAgICAgICAgICAgIFBob25lLlRZUEVfVFRZX1RERCk7Ci0gICAgICAgIHNLbm93blBob25lVHlwZU1hcF9TdG9JLnB1dChWQ2FyZENvbnN0YW50cy5QQVJBTV9QSE9ORV9FWFRSQV9UWVBFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICBQaG9uZS5UWVBFX0FTU0lTVEFOVCk7Ci0KLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9NT0RFTSk7Ci0gICAgICAgIHNQaG9uZVR5cGVzVW5rbm93blRvQ29udGFjdHNTZXQuYWRkKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfTVNHKTsKLSAgICAgICAgc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5hZGQoVkNhcmRDb25zdGFudHMuUEFSQU1fVFlQRV9CQlMpOwotICAgICAgICBzUGhvbmVUeXBlc1Vua25vd25Ub0NvbnRhY3RzU2V0LmFkZChWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX1ZJREVPKTsKLQotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfQUlNLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0FJTSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTVNOLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX01TTik7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfWUFIT08sIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfWUFIT08pOwotICAgICAgICBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MucHV0KEltLlBST1RPQ09MX1NLWVBFLCBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX1NLWVBFX1VTRVJOQU1FKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9HT09HTEVfVEFMSywKLSAgICAgICAgICAgICAgICBWQ2FyZENvbnN0YW50cy5QUk9QRVJUWV9YX0dPT0dMRV9UQUxLKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9JQ1EsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSUNRKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9KQUJCRVIsIFZDYXJkQ29uc3RhbnRzLlBST1BFUlRZX1hfSkFCQkVSKTsKLSAgICAgICAgc0tub3duSW1Qcm9wTmFtZU1hcF9JdG9TLnB1dChJbS5QUk9UT0NPTF9RUSwgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9RUSk7Ci0gICAgICAgIHNLbm93bkltUHJvcE5hbWVNYXBfSXRvUy5wdXQoSW0uUFJPVE9DT0xfTkVUTUVFVElORywgVkNhcmRDb25zdGFudHMuUFJPUEVSVFlfWF9ORVRNRUVUSU5HKTsKLQotICAgICAgICAvLyBcdTY0M0FcdTVFMkZcdTk2RkJcdThBNzEgPSBGdWxsLXdpZHRoIEhpcmFnYW5hICJLZWl0YWktRGVud2EiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIC8vIFx1NjQzQVx1NUUyRiA9IEZ1bGwtd2lkdGggSGlyYWdhbmEgIktlaXRhaSIgKG1vYmlsZSBwaG9uZSkKLSAgICAgICAgLy8gXHUzMEIxXHUzMEE0XHUzMEJGXHUzMEE0ID0gRnVsbC13aWR0aCBLYXRha2FuYSAiS2VpdGFpIiAobW9iaWxlIHBob25lKQotICAgICAgICAvLyBcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIgPSBIYWxmLXdpZHRoIEthdGFrYW5hICJLZWl0YWkiIChtb2JpbGUgcGhvbmUpCi0gICAgICAgIHNNb2JpbGVQaG9uZUxhYmVsU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJNT0JJTEUiLCAiXHU2NDNBXHU1RTJGXHU5NkZCXHU4QTcxIiwgIlx1NjQzQVx1NUUyRiIsICJcdTMwQjFcdTMwQTRcdTMwQkZcdTMwQTQiLAotICAgICAgICAgICAgICAgICJcdUZGNzlcdUZGNzJcdUZGODBcdUZGNzIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGhvbmVUeXBlU3RyaW5nKEludGVnZXIgdHlwZSkgewotICAgICAgICByZXR1cm4gc0tub3duUGhvbmVUeXBlc01hcF9JdG9TLmdldCh0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIEludGVyZ2VyIHdoZW4gdGhlIGdpdmVuIHR5cGVzIGNhbiBiZSBwYXJzZWQgYXMga25vd24gdHlwZS4gUmV0dXJucyBTdHJpbmcgb2JqZWN0Ci0gICAgICogd2hlbiBub3QsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gbGFiZWwuIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBob25lVHlwZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiB0eXBlcywKLSAgICAgICAgICAgIFN0cmluZyBudW1iZXIpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBudW1iZXIgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBpbnQgdHlwZSA9IC0xOwotICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzRmF4ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaGFzUHJlZiA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVTdHJpbmcgOiB0eXBlcykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVTdHJpbmcuZXF1YWxzKFZDYXJkQ29uc3RhbnRzLlBBUkFNX1RZUEVfUFJFRikpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzUHJlZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlU3RyaW5nLmVxdWFscyhWQ2FyZENvbnN0YW50cy5QQVJBTV9UWVBFX0ZBWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYXggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlU3RyaW5nLnN0YXJ0c1dpdGgoIlgtIikgJiYgdHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nLnN1YnN0cmluZygyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZVN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRtcCA9IHNLbm93blBob25lVHlwZU1hcF9TdG9JLmdldCh0eXBlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZUNhbmRpZGF0ZSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRZUEVfUEFHRVIgaXMgcHJlZmVyZWQgd2hlbiB0aGUgbnVtYmVyIGNvbnRhaW5zIEAgc3Vycm9uZGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHBhZ2VyIG51bWJlciBhbmQgYSBkb21haW4gbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG8gMTExMUBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IEBkb21haW4uY29tCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB4IDExMTFACi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXhPZkF0ID0gbnVtYmVyLmluZGV4T2YoIkAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZUNhbmRpZGF0ZSA9PSBQaG9uZS5UWVBFX1BBR0VSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIDAgPCBpbmRleE9mQXQgJiYgaW5kZXhPZkF0IDwgbnVtYmVyLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA8IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX0NVU1RPTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdHlwZVN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChoYXNQcmVmKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfTUFJTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBUWVBFX0hPTUUKLSAgICAgICAgICAgICAgICB0eXBlID0gUGhvbmUuVFlQRV9IT01FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0ZheCkgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9IT01FKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX0hPTUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9XT1JLKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBob25lLlRZUEVfRkFYX1dPUks7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUGhvbmUuVFlQRV9PVEhFUikgewotICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5UWVBFX09USEVSX0ZBWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX0NVU1RPTSkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vYmlsZVBob25lTGFiZWwoZmluYWwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgICAgICAvLyBEZXRhaWw6IFVudGlsIERvbnV0LCB0aGVyZSBpc24ndCBUWVBFX01PQklMRSBmb3IgZW1haWwgd2hpbGUgdGhlcmUgaXMgbm93LgotICAgICAgICAvLyAgICAgICAgIFRvIHN1cHBvcnQgbW9iaWxlIHR5cGUgYXQgdGhhdCB0aW1lLCB0aGlzIGN1c3RvbSBsYWJlbCBoYWQgYmVlbiB1c2VkLgotICAgICAgICByZXR1cm4gKCJfQVVUT19DRUxMIi5lcXVhbHMobGFiZWwpIHx8IHNNb2JpbGVQaG9uZUxhYmVsU2V0LmNvbnRhaW5zKGxhYmVsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJblYyMUJ1dFVua25vd25Ub0NvbnRhY3RzUGhvdGVUeXBlKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gc1Bob25lVHlwZXNVbmtub3duVG9Db250YWN0c1NldC5jb250YWlucyhsYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lRm9ySW0oZmluYWwgaW50IHByb3RvY29sKSB7Ci0gICAgICAgIHJldHVybiBzS25vd25JbVByb3BOYW1lTWFwX0l0b1MuZ2V0KHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNvcnROYW1lRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBsaXN0ID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgZmluYWwgaW50IG5hbWVPcmRlclR5cGUgPSBWQ2FyZENvbmZpZy5nZXROYW1lT3JkZXJUeXBlKHZjYXJkVHlwZSk7Ci0gICAgICAgIHN3aXRjaCAobmFtZU9yZGVyVHlwZSkgewotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0pBUEFORVNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZhbWlseU5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc09ubHlQcmludGFibGVBc2NpaShnaXZlbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaXN0WzBdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFsxXSA9IG1pZGRsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RbMl0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBWQ2FyZENvbmZpZy5OQU1FX09SREVSX0VVUk9QRTogewotICAgICAgICAgICAgICAgIGxpc3RbMF0gPSBtaWRkbGVOYW1lOwotICAgICAgICAgICAgICAgIGxpc3RbMV0gPSBnaXZlbk5hbWU7Ci0gICAgICAgICAgICAgICAgbGlzdFsyXSA9IGZhbWlseU5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgbGlzdFswXSA9IGdpdmVuTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzFdID0gbWlkZGxlTmFtZTsKLSAgICAgICAgICAgICAgICBsaXN0WzJdID0gZmFtaWx5TmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQaG9uZU51bWJlckZvcm1hdChmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGlmIChWQ2FyZENvbmZpZy5pc0phcGFuZXNlRGV2aWNlKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogSW5zZXJ0cyBwb3N0YWwgZGF0YSBpbnRvIHRoZSBidWlsZGVyIG9iamVjdC4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBDb250YWN0c0NvbnRyYWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgZGVmaW5lZCBpbiB2Q2FyZC4KLSAgICAgKiBTbyBzb21lIGNvbnZlcnNpb24gbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFN0cnVjdHVyZWRQb3N0YWxEYXRhVXNpbmdDb250YWN0c1N0cnVjdChpbnQgdmNhcmRUeXBlLAotICAgICAgICAgICAgZmluYWwgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgIGZpbmFsIFZDYXJkRW50cnkuUG9zdGFsRGF0YSBwb3N0YWxEYXRhKSB7Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShTdHJ1Y3R1cmVkUG9zdGFsLlJBV19DT05UQUNUX0lELCAwKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5NSU1FVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBwb3N0YWxEYXRhLnR5cGUpOwotICAgICAgICBpZiAocG9zdGFsRGF0YS50eXBlID09IFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsIHBvc3RhbERhdGEubGFiZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHN0cmVldFN0cmluZzsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuc3RyZWV0KSkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHN0cmVldFN0cmluZyA9IHBvc3RhbERhdGEuc3RyZWV0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlZXRTdHJpbmcgPSBwb3N0YWxEYXRhLnN0cmVldCArICIgIiArIHBvc3RhbERhdGEuZXh0ZW5kZWRBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIud2l0aFZhbHVlKFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsIHBvc3RhbERhdGEucG9ib3gpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgc3RyZWV0U3RyaW5nKTsKLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCBwb3N0YWxEYXRhLmxvY2FsdHkpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgcG9zdGFsRGF0YS5yZWdpb24pOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCBwb3N0YWxEYXRhLnBvc3RhbENvZGUpOwotICAgICAgICBidWlsZGVyLndpdGhWYWx1ZShTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksIHBvc3RhbERhdGEuY291bnRyeSk7Ci0KLSAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICBwb3N0YWxEYXRhLmdldEZvcm1hdHRlZEFkZHJlc3ModmNhcmRUeXBlKSk7Ci0gICAgICAgIGlmIChwb3N0YWxEYXRhLmlzUHJpbWFyeSkgewotICAgICAgICAgICAgYnVpbGRlci53aXRoVmFsdWUoRGF0YS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnN0cnVjdE5hbWVGcm9tRWxlbWVudHMoZmluYWwgaW50IHZjYXJkVHlwZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmYW1pbHlOYW1lLCBmaW5hbCBTdHJpbmcgbWlkZGxlTmFtZSwgZmluYWwgU3RyaW5nIGdpdmVuTmFtZSkgewotICAgICAgICByZXR1cm4gY29uc3RydWN0TmFtZUZyb21FbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb25zdHJ1Y3ROYW1lRnJvbUVsZW1lbnRzKGZpbmFsIGludCB2Y2FyZFR5cGUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFtaWx5TmFtZSwgZmluYWwgU3RyaW5nIG1pZGRsZU5hbWUsIGZpbmFsIFN0cmluZyBnaXZlbk5hbWUsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIG5hbWVMaXN0ID0gc29ydE5hbWVFbGVtZW50cyh2Y2FyZFR5cGUsIGZhbWlseU5hbWUsIG1pZGRsZU5hbWUsIGdpdmVuTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHByZWZpeCkpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG5hbWVQYXJ0IDogbmFtZUxpc3QpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobmFtZVBhcnQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmFtZVBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VmZml4KSkgewotICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzdWZmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHBpZWNlcyB1c2luZyB0aGUgZGVsaW1pdGVyICc7JyBpbnNpZGUgaXQuCi0gICAgICoKLSAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnMgaW4gdGhvc2UgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVuZXNjYXBlZCBpbnRvIG9yaWdpbmFsIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gY29uc3RydWN0TGlzdEZyb21WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmIGkgPCBsZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1bmVzY2FwZWRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkU3RyaW5nID0gVkNhcmRQYXJzZXJJbXBsX1Y0MC51bmVzY2FwZUNoYXJhY3RlcihuZXh0Q2gpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjMwLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmtub3duIHZDYXJkIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmtub3duIHZDYXJkIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRTdHJpbmcgPSBWQ2FyZFBhcnNlckltcGxfVjIxLnVuZXNjYXBlQ2hhcmFjdGVyKG5leHRDaCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHVuZXNjYXBlZFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChidWlsZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlQcmludGFibGVBc2NpaShmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzUHJpbnRhYmxlQXNjaWlPbmx5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNoZWNraW5nIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGVuY29kZWQgaW50byBxdW90ZWQtcHJpbnRhYmxlCi0gICAgICogb3Igbm90LCB3aGljaCBpcyByZXF1aXJlZCBieSB2Q2FyZCAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiAiN2JpdCIgaW4gdkNhcmQgMi4xIHNwZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaShBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSB2YWx1ZS5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgICAgIGlmICghKGFzY2lpRmlyc3QgPD0gYyAmJiBjIDw9IGFzY2lpTGFzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2hhcmFjdGVyPiBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQgPQotICAgICAgICBuZXcgSGFzaFNldDxDaGFyYWN0ZXI+KEFycmF5cy5hc0xpc3QoJ1snLCAnXScsICc9JywgJzonLCAnLicsICcsJywgJyAnKSk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHVzZWZ1bCBzaW5jZSB2Q2FyZCAzLjAgb2Z0ZW4gcmVxdWlyZXMgdGhlICgiWC0iKSBwcm9wZXJ0aWVzIGFuZCBncm91cHMKLSAgICAgKiBzaG91bGQgY29udGFpbiBvbmx5IGFscGhhYmV0cywgZGlnaXRzLCBhbmQgaHlwaGVuLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4gCi0gICAgICogTm90ZTogSXQgaXMgYWxyZWFkeSBrbm93biBzb21lIGRldmljZXMgKHdyb25nbHkpIG91dHB1dHMgcHJvcGVydGllcyB3aXRoIGNoYXJhY3RlcnMKLSAgICAgKiAgICAgICB3aGljaCBzaG91bGQgbm90IGJlIGluIHRoZSBmaWVsZC4gT25lIGV4YW1wbGUgaXMgIlgtR09PR0xFIFRBTEsiLiBXZSBhY2NlcHQKLSAgICAgKiAgICAgICBzdWNoIGtpbmQgb2YgaW5wdXQgYnV0IG11c3QgbmV2ZXIgb3V0cHV0IGl0IHVubGVzcyB0aGUgdGFyZ2V0IGlzIHZlcnkgc3BlY2lmaWMKLSAgICAgKiAgICAgICB0byB0aGUgZGV2aWNlIHdoaWNoIGlzIGFibGUgdG8gcGFyc2UgdGhlIG1hbGZvcm1lZCBpbnB1dC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVwcGVyQWxwaGFiZXRGaXJzdCA9IDB4NDE7ICAvLyBBCi0gICAgICAgIGZpbmFsIGludCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg1YjsgIC8vIFsKLSAgICAgICAgZmluYWwgaW50IGxvd2VyQWxwaGFiZXRGaXJzdCA9IDB4NjE7ICAvLyBhCi0gICAgICAgIGZpbmFsIGludCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0ID0gMHg3YjsgIC8vIHsKLSAgICAgICAgZmluYWwgaW50IGRpZ2l0Rmlyc3QgPSAweDMwOyAgLy8gMAotICAgICAgICBmaW5hbCBpbnQgZGlnaXRBZnRlckxhc3QgPSAweDNBOyAgLy8gOgotICAgICAgICBmaW5hbCBpbnQgaHlwaGVuID0gJy0nOwotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvZGVwb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoISgobG93ZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCBsb3dlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAodXBwZXJBbHBoYWJldEZpcnN0IDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPCB1cHBlckFscGhhYmV0QWZ0ZXJMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlnaXRGaXJzdCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDwgZGlnaXRBZnRlckxhc3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb2RlcG9pbnQgPT0gaHlwaGVuKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNPbmx5V2hpdGVTcGFjZXMoZmluYWwgU3RyaW5nLi4udmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zT25seVdoaXRlU3BhY2VzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzdHIgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzdHIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgPSBzdHIub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jb2RlUG9pbnRBdChpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGNhdGVnb3JpemVkIGFzICJ3b3JkIiBzcGVjaWZpZWQgaW4gdkNhcmQgc3BlYyAyLjEuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIHZDYXJkIDIuMSBzcGVjaWZpZXM6PGJyIC8+Ci0gICAgICogd29yZCA9ICZsdDthbnkgcHJpbnRhYmxlIDdiaXQgdXMtYXNjaWkgZXhjZXB0IFtdPTouLCAmZ3Q7Ci0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1YyMVdvcmQoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUZpcnN0ID0gMHgyMDsKLSAgICAgICAgZmluYWwgaW50IGFzY2lpTGFzdCA9IDB4N0U7ICAvLyBpbmNsdWRlZAotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpID0gdmFsdWUub2Zmc2V0QnlDb2RlUG9pbnRzKGksIDEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgYyA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKCEoYXNjaWlGaXJzdCA8PSBjICYmIGMgPD0gYXNjaWlMYXN0KSB8fAotICAgICAgICAgICAgICAgICAgICBzVW5BY2NlcHRhYmxlQXNjaWlJblYyMVdvcmRTZXQuY29udGFpbnMoKGNoYXIpYykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gc0VzY2FwZUluZGljYXRvcnNWMzAgPSBuZXcgaW50W117Ci0gICAgICAgICc6JywgJzsnLCAnLCcsICcgJwotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBzRXNjYXBlSW5kaWNhdG9yc1Y0MCA9IG5ldyBpbnRbXXsKLSAgICAgICAgJzsnLCAnOicKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogPFA+Ci0gICAgICogUmV0dXJucyBTdHJpbmcgYXZhaWxhYmxlIGFzIHBhcmFtZXRlciB2YWx1ZSBpbiB2Q2FyZCAzLjAuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIFJGQyAyNDI2IHJlcXVpcmVzIHZDYXJkIGNvbXBvc2VyIHRvIHF1b3RlIHBhcmFtZXRlciB2YWx1ZXMgd2hlbiBpdCBjb250YWlucwotICAgICAqIHNlbWktY29sb24sIGZvciBleGFtcGxlIChTZWUgUkZDIDI0MjYgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBTdHJpbmcgY2FuIGJlIHVzZWQgd2l0aG91dCBxdW90ZXMuCi0gICAgICogPC9QPgotICAgICAqIDxQPgotICAgICAqIE5vdGU6IFdlIHJlbW92ZSBEUVVPVEUgaW5zaWRlIHRoZSBnaXZlbiB2YWx1ZSBzaWxlbnRseSBmb3Igbm93LgotICAgICAqIDwvUD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nQXNQYXJhbVZhbHVlKHZhbHVlLCBzRXNjYXBlSW5kaWNhdG9yc1YzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdBc1Y0MFBhcmFtVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB0b1N0cmluZ0FzUGFyYW1WYWx1ZSh2YWx1ZSwgc0VzY2FwZUluZGljYXRvcnNWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZ0FzUGFyYW1WYWx1ZShTdHJpbmcgdmFsdWUsIGZpbmFsIGludFtdIGVzY2FwZUluZGljYXRvcnMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgYXNjaWlGaXJzdCA9IDB4MjA7Ci0gICAgICAgIGZpbmFsIGludCBhc2NpaUxhc3QgPSAweDdFOyAgLy8gaW5jbHVkZWQKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIG5lZWRRdW90ZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IHZhbHVlLm9mZnNldEJ5Q29kZVBvaW50cyhpLCAxKSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvZGVQb2ludCA9IHZhbHVlLmNvZGVQb2ludEF0KGkpOwotICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IGFzY2lpRmlyc3QgfHwgY29kZVBvaW50ID09ICciJykgewotICAgICAgICAgICAgICAgIC8vIENUTCBjaGFyYWN0ZXJzIGFuZCBEUVVPVEUgYXJlIG5ldmVyIGFjY2VwdGVkLiBSZW1vdmUgdGhlbS4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kQ29kZVBvaW50KGNvZGVQb2ludCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpbmRpY2F0b3IgOiBlc2NhcGVJbmRpY2F0b3JzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA9PSBpbmRpY2F0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVlZFF1b3RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuICgocmVzdWx0LmlzRW1wdHkoKSB8fCBWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVdoaXRlU3BhY2VzKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogKG5lZWRRdW90ZSA/ICgnIicgKyByZXN1bHQgKyAnIicpCi0gICAgICAgICAgICAgICAgOiByZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0hhbGZXaWR0aFN0cmluZyhmaW5hbCBTdHJpbmcgb3JnU3RyaW5nKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvcmdTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gb3JnU3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSA9IG9yZ1N0cmluZy5vZmZzZXRCeUNvZGVQb2ludHMoaSwgMSkpIHsKLSAgICAgICAgICAgIC8vIEFsbCBKYXBhbmVzZSBjaGFyYWN0ZXIgaXMgYWJsZSB0byBiZSBleHByZXNzZWQgYnkgY2hhci4KLSAgICAgICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIHVzZSBTdHJpbmcjY29kZXBQb2ludEF0KCkuCi0gICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gb3JnU3RyaW5nLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWxmV2lkdGhUZXh0ID0gSmFwYW5lc2VVdGlscy50cnlHZXRIYWxmV2lkdGhUZXh0KGNoKTsKLSAgICAgICAgICAgIGlmIChoYWxmV2lkdGhUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChoYWxmV2lkdGhUZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR3Vlc3NlcyB0aGUgZm9ybWF0IG9mIGlucHV0IGltYWdlLiBDdXJyZW50bHkganVzdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGFyZSB1c2VkLgotICAgICAqIFRoZSB0eXBlICJHSUYiLCAiUE5HIiwgb3IgIkpQRUciIGlzIHJldHVybmVkIHdoZW4gcG9zc2libGUuIFJldHVybnMgbnVsbCB3aGVuCi0gICAgICogdGhlIGd1ZXNzIGZhaWxlZC4KLSAgICAgKiBAcGFyYW0gaW5wdXQgSW1hZ2UgYXMgYnl0ZSBhcnJheS4KLSAgICAgKiBAcmV0dXJuIFRoZSBpbWFnZSB0eXBlIG9yIG51bGwgd2hlbiB0aGUgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0ltYWdlVHlwZShmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC5sZW5ndGggPj0gMyAmJiBpbnB1dFswXSA9PSAnRycgJiYgaW5wdXRbMV0gPT0gJ0knICYmIGlucHV0WzJdID09ICdGJykgewotICAgICAgICAgICAgcmV0dXJuICJHSUYiOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSA0ICYmIGlucHV0WzBdID09IChieXRlKSAweDg5Ci0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gJ1AnICYmIGlucHV0WzJdID09ICdOJyAmJiBpbnB1dFszXSA9PSAnRycpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHZDYXJkIDIuMSBvZmZpY2lhbGx5IGRvZXMgbm90IHN1cHBvcnQgUE5HLCBidXQgd2UgbWF5IGhhdmUgaXQgYW5kCi0gICAgICAgICAgICAvLyAgICAgICB1c2luZyBYLSB3b3JkIGxpa2UgIlgtUE5HIiBtYXkgbm90IGxldCBpbXBvcnRlcnMga25vdyBpdCBpcyBQTkcuCi0gICAgICAgICAgICAvLyAgICAgICBTbyB3ZSB1c2UgdGhlIFN0cmluZyAiUE5HIiBhcyBpcy4uLgotICAgICAgICAgICAgcmV0dXJuICJQTkciOwotICAgICAgICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA+PSAyICYmIGlucHV0WzBdID09IChieXRlKSAweGZmCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRbMV0gPT0gKGJ5dGUpIDB4ZDgpIHsKLSAgICAgICAgICAgIHJldHVybiAiSlBFRyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVHJ1ZSB3aGVuIGFsbCB0aGUgZ2l2ZW4gdmFsdWVzIGFyZSBudWxsIG9yIGVtcHR5IFN0cmluZ3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFyZUFsbEVtcHR5KGZpbmFsIFN0cmluZy4uLnZhbHVlcykgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8gVGhlIG1ldGhvZHMgYmVsbG93IG1heSBiZSB1c2VkIGJ5IHVuaXQgdGVzdC4KLQotICAgIC8qKgotICAgICAqIFVucXVvdGVzIGdpdmVuIFF1b3RlZC1QcmludGFibGUgdmFsdWUuIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VRdW90ZWRQcmludGFibGUoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gc3RyaWN0TGluZUJyZWFraW5nLAotICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUNoYXJzZXQsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIC8vICI9ICIgLT4gIiAiLCAiPVx0IiAtPiAiXHQiLgotICAgICAgICAvLyBQcmV2aW91cyBjb2RlIGhhZCBkb25lIHRoaXMgcmVwbGFjZW1lbnQuIEtlZXAgb24gdGhlIHNhZmUgc2lkZS4KLSAgICAgICAgZmluYWwgU3RyaW5nIHF1b3RlZFByaW50YWJsZTsKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPScgJiYgaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0Q2ggPSB2YWx1ZS5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICcgJyB8fCBuZXh0Q2ggPT0gJ1x0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobmV4dENoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHF1b3RlZFByaW50YWJsZSA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGxpbmVzOwotICAgICAgICBpZiAoc3RyaWN0TGluZUJyZWFraW5nKSB7Ci0gICAgICAgICAgICBsaW5lcyA9IHF1b3RlZFByaW50YWJsZS5zcGxpdCgiXHJcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBxdW90ZWRQcmludGFibGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IHF1b3RlZFByaW50YWJsZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gcXVvdGVkUHJpbnRhYmxlLmNoYXJBdChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxhc3RMaW5lID0gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxhc3RMaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGxhc3RMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpbmVzID0gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiPSIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJhd1N0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHJhd1N0cmluZykpIHsKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJHaXZlbiByYXcgc3RyaW5nIGlzIGVtcHR5LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhd0J5dGVzID0gcmF3U3RyaW5nLmdldEJ5dGVzKHNvdXJjZUNoYXJzZXQpOyAKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiRmFpbGVkIHRvIGRlY29kZTogIiArIHNvdXJjZUNoYXJzZXQpOwotICAgICAgICAgICAgcmF3Qnl0ZXMgPSByYXdTdHJpbmcuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVjb2RlZEJ5dGVzID0gUXVvdGVkUHJpbnRhYmxlQ29kZWMuZGVjb2RlUXVvdGVkUHJpbnRhYmxlKHJhd0J5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoRGVjb2RlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRGVjb2RlckV4Y2VwdGlvbiBpcyB0aHJvd24uIik7Ci0gICAgICAgICAgICBkZWNvZGVkQnl0ZXMgPSByYXdCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkZWNvZGVkQnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZDYXJkUGFyc2VyIGdldEFwcHJvcHJpYXRlUGFyc2VyKGludCB2Y2FyZFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWQ2FyZFBhcnNlcl9WMjEoKTsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24zMCh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZDYXJkUGFyc2VyX1YzMCgpOwotICAgICAgICB9IGVsc2UgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKHZjYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVkNhcmRQYXJzZXJfVjQwKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVkNhcmRFeGNlcHRpb24oIlZlcnNpb24gaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udmVydFN0cmluZ0NoYXJzZXQoCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyBzb3VyY2VDaGFyc2V0LCBTdHJpbmcgdGFyZ2V0Q2hhcnNldCkgewotICAgICAgICBpZiAoc291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHNvdXJjZUNoYXJzZXQpOwotICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBjaGFyc2V0LmVuY29kZShvcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgIC8vIGJ5dGVCdWZmZXIuYXJyYXkoKSAibWF5IiByZXR1cm4gYnl0ZSBhcnJheSB3aGljaCBpcyBsYXJnZXIgdGhhbgotICAgICAgICAvLyBieXRlQnVmZmVyLnJlbWFpbmluZygpLiBIZXJlLCB3ZSBrZWVwIG9uIHRoZSBzYWZlIHNpZGUuCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOwotICAgICAgICBieXRlQnVmZmVyLmdldChieXRlcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgdGFyZ2V0Q2hhcnNldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBlbmNvZGU6IGNoYXJzZXQ9IiArIHRhcmdldENoYXJzZXQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1dGlsaXRpZXMgZm9yIHZDYXJkIDQuMDogZGF0ZXRpbWUsIHRpbWVzdGFtcCwgaW50ZWdlciwgZmxvYXQsIGFuZCBib29sZWFuCi0KLSAgICBwcml2YXRlIFZDYXJkVXRpbHMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYzdkZi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkQWdlbnROb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBWQ2FyZEFnZW50Tm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1NzIxOS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVkNhcmRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgVkNhcmRFeGNlcHRpb24gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBWQ2FyZEV4Y2VwdGlvbiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFZDYXJkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RiNjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLmV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiB0aGUgdkNhcmQgaGFzIHNvbWUgbGluZSBzdGFydGluZyB3aXRoICcjJy4gSW4gdGhlIHNwZWNpZmljYXRpb24sCi0gKiBib3RoIHZDYXJkIDIuMSBhbmQgdkNhcmQgMy4wIGRvZXMgbm90IGFsbG93IHN1Y2ggbGluZSwgYnV0IHNvbWUgYWN0dWFsIGV4cG9ydGVyIGVtaXQKLSAqIHN1Y2ggbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZEludmFsaWRDb21tZW50TGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkQ29tbWVudExpbmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZEludmFsaWRMaW5lRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwNTg0Yi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkSW52YWxpZExpbmVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb247Ci0KLS8qKgotICogVGhyb3duIHdoZW4gdGhlIHZDYXJkIGhhcyBzb21lIGxpbmUgc3RhcnRpbmcgd2l0aCAnIycuIEluIHRoZSBzcGVjaWZpY2F0aW9uLAotICogYm90aCB2Q2FyZCAyLjEgYW5kIHZDYXJkIDMuMCBkb2VzIG5vdCBhbGxvdyBzdWNoIGxpbmUsIGJ1dCBzb21lIGFjdHVhbCBleHBvcnRlciBlbWl0Ci0gKiBzdWNoIGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVkNhcmRJbnZhbGlkTGluZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTmVzdGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2MyZmIuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9WQ2FyZE5lc3RlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHRocm93biB3aGVuIFZDYXJkIGlzIG5lc3RlZCB3aXRob3V0IFZDYXJkUGFyc2VyJ3MgYmVpbmcgbm90aWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbiBleHRlbmRzIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgVkNhcmROZXN0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZE5lc3RlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmFhNzc2My4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBleGNlcHRpb24gd2hpY2ggdGVsbHMgdGhhdCB0aGUgaW5wdXQgVkNhcmQgaXMgcHJvYmFibHkgdmFsaWQgZnJvbSB0aGUgdmlldyBvZgotICogc3BlY2lmaWNhdGlvbiBidXQgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBmcmFtZXdvcmsgZm9yIG5vdy4KLSAqIAotICogVGhpcyBpcyBhIGtpbmQgb2YgYSBnb29kIG5ld3MgZnJvbSB0aGUgdmlldyBvZiBkZXZlbG9wbWVudC4KLSAqIEl0IG1heSBiZSBnb29kIHRvIGFzayB1c2VycyB0byBzZW5kIGEgcmVwb3J0IHdpdGggdGhlIFZDYXJkIGV4YW1wbGUKLSAqIGZvciB0aGUgZnV0dXJlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXh0ZW5kcyBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIFZDYXJkTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgICBwdWJsaWMgVkNhcmROb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL1ZDYXJkVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA5ZmU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3BpbS92Y2FyZC9leGNlcHRpb24vVkNhcmRWZXJzaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uOwotCi0vKioKLSAqIFZDYXJkRXhjZXB0aW9uIHVzZWQgb25seSB3aGVuIHRoZSB2ZXJzaW9uIG9mIHRoZSB2Q2FyZCBpcyBkaWZmZXJlbnQuIAotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJzaW9uRXhjZXB0aW9uIGV4dGVuZHMgVkNhcmRFeGNlcHRpb24gewotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBWQ2FyZFZlcnNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL2V4Y2VwdGlvbi9wYWNrYWdlLmh0bWwgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvZXhjZXB0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLXtAaGlkZX0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvcGltL3ZjYXJkL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiOGEzMi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9waW0vdmNhcmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08SFRNTD4KLTxCT0RZPgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNTU1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZW50cmllcyBhcworICogYSBkaWFsb2cuCisgKiA8cD4KKyAqIFRoaXMgcHJlZmVyZW5jZSB3aWxsIHN0b3JlIGEgc2V0IG9mIHN0cmluZ3MgaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKiBUaGlzIHNldCB3aWxsIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzIGZyb20gdGhlCisgKiB7QGxpbmsgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKX0gYXJyYXkuCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI011bHRpU2VsZWN0TGlzdFByZWZlcmVuY2VfZW50cmllcworICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZV9lbnRyeVZhbHVlcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RMaXN0UHJlZmVyZW5jZSBleHRlbmRzIERpYWxvZ1ByZWZlcmVuY2UgeworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlW10gbUVudHJpZXM7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2VbXSBtRW50cnlWYWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtVmFsdWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbU5ld1ZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByZWZlcmVuY2VDaGFuZ2VkOworICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlLCAwLCAwKTsKKyAgICAgICAgbUVudHJpZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJpZXMpOworICAgICAgICBtRW50cnlWYWx1ZXMgPSBhLmdldFRleHRBcnJheShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlX2VudHJ5VmFsdWVzKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBodW1hbi1yZWFkYWJsZSBlbnRyaWVzIHRvIGJlIHNob3duIGluIHRoZSBsaXN0LiBUaGlzIHdpbGwgYmUKKyAgICAgKiBzaG93biBpbiBzdWJzZXF1ZW50IGRpYWxvZ3MuCisgICAgICogPHA+CisgICAgICogRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGluZGV4IGluCisgICAgICoge0BsaW5rICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbnRyaWVzIFRoZSBlbnRyaWVzLgorICAgICAqIEBzZWUgI3NldEVudHJ5VmFsdWVzKENoYXJTZXF1ZW5jZVtdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoQ2hhclNlcXVlbmNlW10gZW50cmllcykgeworICAgICAgICBtRW50cmllcyA9IGVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgI3NldEVudHJpZXMoQ2hhclNlcXVlbmNlW10pCisgICAgICogQHBhcmFtIGVudHJpZXNSZXNJZCBUaGUgZW50cmllcyBhcnJheSBhcyBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJpZXMoaW50IGVudHJpZXNSZXNJZCkgeworICAgICAgICBzZXRFbnRyaWVzKGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0QXJyYXkoZW50cmllc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIGVudHJpZXMgdG8gYmUgc2hvd24gaW4gdGhlIGxpc3QgaW4gc3Vic2VxdWVudCBkaWFsb2dzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGxpc3QgYXMgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZVtdIGdldEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBtRW50cmllczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGFycmF5IHRvIGZpbmQgdGhlIHZhbHVlIHRvIHNhdmUgZm9yIGEgcHJlZmVyZW5jZSB3aGVuIGFuIGVudHJ5IGZyb20KKyAgICAgKiBlbnRyaWVzIGlzIHNlbGVjdGVkLiBJZiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzZWNvbmQgaXRlbSBpbiBlbnRyaWVzLCB0aGUKKyAgICAgKiBzZWNvbmQgaXRlbSBpbiB0aGlzIGFycmF5IHdpbGwgYmUgc2F2ZWQgdG8gdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVudHJ5VmFsdWVzIFRoZSBhcnJheSB0byBiZSB1c2VkIGFzIHZhbHVlcyB0byBzYXZlIGZvciB0aGUgcHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSBlbnRyeVZhbHVlcykgeworICAgICAgICBtRW50cnlWYWx1ZXMgPSBlbnRyeVZhbHVlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRFbnRyeVZhbHVlcyhDaGFyU2VxdWVuY2VbXSkKKyAgICAgKiBAcGFyYW0gZW50cnlWYWx1ZXNSZXNJZCBUaGUgZW50cnkgdmFsdWVzIGFycmF5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50cnlWYWx1ZXMoaW50IGVudHJ5VmFsdWVzUmVzSWQpIHsKKyAgICAgICAgc2V0RW50cnlWYWx1ZXMoZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldFRleHRBcnJheShlbnRyeVZhbHVlc1Jlc0lkKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHZhbHVlcyB0byBiZSBzYXZlZCBmb3IgdGhlIHByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgYXJyYXkgb2YgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2VbXSBnZXRFbnRyeVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyeVZhbHVlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGtleS4gVGhpcyBzaG91bGQgY29udGFpbiBlbnRyaWVzIGluCisgICAgICoge0BsaW5rICNnZXRFbnRyeVZhbHVlcygpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gc2V0IGZvciB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhTZXQ8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgbVZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHBlcnNpc3RTdHJpbmdTZXQodmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiB2YWx1ZSAoaW4gdGhlIGVudHJ5IHZhbHVlcyBhcnJheSkuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB3aG9zZSBpbmRleCBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIGludCBmaW5kSW5kZXhPZlZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtRW50cnlWYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1FbnRyeVZhbHVlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChtRW50cnlWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblByZXBhcmVEaWFsb2dCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICBzdXBlci5vblByZXBhcmVEaWFsb2dCdWlsZGVyKGJ1aWxkZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG1FbnRyaWVzID09IG51bGwgfHwgbUVudHJ5VmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVNlbGVjdExpc3RQcmVmZXJlbmNlIHJlcXVpcmVzIGFuIGVudHJpZXMgYXJyYXkgYW5kICIgKworICAgICAgICAgICAgICAgICAgICAiYW4gZW50cnlWYWx1ZXMgYXJyYXkuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW5bXSBjaGVja2VkSXRlbXMgPSBnZXRTZWxlY3RlZEl0ZW1zKCk7CisgICAgICAgIGJ1aWxkZXIuc2V0TXVsdGlDaG9pY2VJdGVtcyhtRW50cmllcywgY2hlY2tlZEl0ZW1zLAorICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25NdWx0aUNob2ljZUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoLCBib29sZWFuIGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLmFkZChtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCB8PSBtTmV3VmFsdWVzLnJlbW92ZShtRW50cmllc1t3aGljaF0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgbU5ld1ZhbHVlcy5jbGVhcigpOworICAgICAgICBtTmV3VmFsdWVzLmFkZEFsbChtVmFsdWVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuW10gZ2V0U2VsZWN0ZWRJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlW10gZW50cmllcyA9IG1FbnRyaWVzOworICAgICAgICBmaW5hbCBpbnQgZW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YWx1ZXMgPSBtVmFsdWVzOworICAgICAgICBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bZW50cnlDb3VudF07CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gdmFsdWVzLmNvbnRhaW5zKGVudHJpZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKKyAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOworICAgICAgICAKKyAgICAgICAgaWYgKHBvc2l0aXZlUmVzdWx0ICYmIG1QcmVmZXJlbmNlQ2hhbmdlZCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFsdWVzID0gbU5ld1ZhbHVlczsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIodmFsdWVzKSkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmVmZXJlbmNlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZVtdIGRlZmF1bHRWYWx1ZXMgPSBhLmdldFRleHRBcnJheShpbmRleCk7CisgICAgICAgIGZpbmFsIGludCB2YWx1ZUNvdW50ID0gZGVmYXVsdFZhbHVlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGRlZmF1bHRWYWx1ZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0SW5pdGlhbFZhbHVlKGJvb2xlYW4gcmVzdG9yZVZhbHVlLCBPYmplY3QgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHNldFZhbHVlcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQobVZhbHVlcykgOiAoU2V0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUKKyAgICAgICAgICAgIHJldHVybiBzdXBlclN0YXRlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTYXZlZFN0YXRlIG15U3RhdGUgPSBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlKTsKKyAgICAgICAgbXlTdGF0ZS52YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZhbHVlczsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbCBzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gc291cmNlLnJlYWRTdHJpbmdBcnJheSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgc3RyaW5nQ291bnQgPSBzdHJpbmdzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3RyaW5nc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZ0FycmF5KHZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCmluZGV4IGRkZTY0OTMuLjE3YjJlODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZS5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkNoYXJTZXF1ZW5jZXM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMjgsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5DaGFyU2VxdWVuY2VzOwogaW1wb3J0IGFuZHJvaWQudmlldy5BYnNTYXZlZFN0YXRlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTM2LDYgKzM0LDEwIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYmFzaWMgUHJlZmVyZW5jZSBVSSBidWlsZGluZwogICogYmxvY2sgZGlzcGxheWVkIGJ5IGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0gaW4gdGhlIGZvcm0gb2YgYQpAQCAtNTQsNiArNTYsNyBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV90aXRsZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV9zdW1tYXJ5CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX29yZGVyCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2ZyYWdtZW50CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlX2xheW91dAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZV93aWRnZXRMYXlvdXQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VfZW5hYmxlZApAQCAtODYsNiArODksOCBAQAogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdW1tYXJ5OwogICAgIHByaXZhdGUgU3RyaW5nIG1LZXk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFN0cmluZyBtRnJhZ21lbnQ7CisgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0YWJsZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1aXJlc0tleTsKQEAgLTIwOCw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbU9yZGVyID0gYS5nZXRJbnQoYXR0ciwgbU9yZGVyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VfZnJhZ21lbnQ6CisgICAgICAgICAgICAgICAgICAgIG1GcmFnbWVudCA9IGEuZ2V0U3RyaW5nKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZV9sYXlvdXQ6CiAgICAgICAgICAgICAgICAgICAgIG1MYXlvdXRSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZChhdHRyLCBtTGF5b3V0UmVzSWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTMxMyw2ICszMjIsNDQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzcyBuYW1lIG9mIGEgZnJhZ21lbnQgdG8gYmUgc2hvd24gd2hlbiB0aGlzIFByZWZlcmVuY2UgaXMgY2xpY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZnJhZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChTdHJpbmcgZnJhZ21lbnQpIHsKKyAgICAgICAgbUZyYWdtZW50ID0gZnJhZ21lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBmcmFnbWVudCBjbGFzcyBuYW1lIGxhc3Qgc2V0IHZpYSB7QGxpbmsgI3NldEZyYWdtZW50fSBvciBYTUwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dHJhcyBCdW5kbGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZlcmVuY2UsIGNyZWF0aW5nCisgICAgICogYSBuZXcgQnVuZGxlIGlmIHRoZXJlIGN1cnJlbnRseSBpc24ndCBvbmUuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGdldCBhbmQKKyAgICAgKiBzZXQgaW5kaXZpZHVhbCBleHRyYSBrZXkvdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIGlmIChtRXh0cmFzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRyYXMgQnVuZGxlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcmVmZXJlbmNlLAorICAgICAqIHJldHVybmluZyBudWxsIGlmIHRoZXJlIGlzIG5vdCBjdXJyZW50bHkgb25lLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgcGVla0V4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYXM7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbGF5b3V0IHJlc291cmNlIHRoYXQgaXMgaW5mbGF0ZWQgYXMgdGhlIHtAbGluayBWaWV3fSB0byBiZSBzaG93bgogICAgICAqIGZvciB0aGlzIFByZWZlcmVuY2UuIEluIG1vc3QgY2FzZXMsIHRoZSBkZWZhdWx0IGxheW91dCBpcyBzdWZmaWNpZW50IGZvcgogICAgICAqIGN1c3RvbSBQcmVmZXJlbmNlIG9iamVjdHMgYW5kIG9ubHkgdGhlIHdpZGdldCBsYXlvdXQgbmVlZHMgdG8gYmUgY2hhbmdlZC4KQEAgLTEyNTAsNiArMTI5Nyw2MSBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwZXJzaXN0IGEgc2V0IG9mIFN0cmluZ3MgdG8gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXN9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgd2lsbCBjaGVjayBpZiB0aGlzIFByZWZlcmVuY2UgaXMgcGVyc2lzdGVudCwgZ2V0IGFuIGVkaXRvciBmcm9tCisgICAgICogdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0sIHB1dCBpbiB0aGUgc3RyaW5ncywgYW5kIGNoZWNrIGlmIHdlIHNob3VsZCBjb21taXQgKGFuZAorICAgICAqIGNvbW1pdCBpZiBzbykuCisgICAgICogCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIHBlcnNpc3QuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBQcmVmZXJlbmNlIGlzIHBlcnNpc3RlbnQuIChUaGlzIGlzIG5vdCB3aGV0aGVyIHRoZQorICAgICAqICAgICAgICAgdmFsdWUgd2FzIHBlcnNpc3RlZCwgc2luY2Ugd2UgbWF5IG5vdCBuZWNlc3NhcmlseSBjb21taXQgaWYgdGhlcmUKKyAgICAgKiAgICAgICAgIHdpbGwgYmUgYSBiYXRjaCBjb21taXQgbGF0ZXIuKQorICAgICAqIEBzZWUgI2dldFBlcnNpc3RlZFN0cmluZyhTZXQpCisgICAgICogCisgICAgICogQGhpZGUgUGVuZGluZyBBUEkgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0U3RyaW5nU2V0KFNldDxTdHJpbmc+IHZhbHVlcykgeworICAgICAgICBpZiAoc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICAvLyBTaG91bGRuJ3Qgc3RvcmUgbnVsbAorICAgICAgICAgICAgaWYgKHZhbHVlcy5lcXVhbHMoZ2V0UGVyc2lzdGVkU3RyaW5nU2V0KG51bGwpKSkgeworICAgICAgICAgICAgICAgIC8vIEl0J3MgYWxyZWFkeSB0aGVyZSwgc28gdGhlIHNhbWUgYXMgcGVyc2lzdGluZworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcy5FZGl0b3IgZWRpdG9yID0gbVByZWZlcmVuY2VNYW5hZ2VyLmdldEVkaXRvcigpOworICAgICAgICAgICAgZWRpdG9yLnB1dFN0cmluZ1NldChtS2V5LCB2YWx1ZXMpOworICAgICAgICAgICAgdHJ5Q29tbWl0KGVkaXRvcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gZ2V0IGEgcGVyc2lzdGVkIHNldCBvZiBTdHJpbmdzIGZyb20gdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlc30uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGNoZWNrIGlmIHRoaXMgUHJlZmVyZW5jZSBpcyBwZXJzaXN0ZW50LCBnZXQgdGhlIFNoYXJlZFByZWZlcmVuY2VzCisgICAgICogZnJvbSB0aGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSwgYW5kIGdldCB0aGUgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtIGRlZmF1bHRSZXR1cm5WYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgZWl0aGVyIHRoZQorICAgICAqICAgICAgICAgICAgUHJlZmVyZW5jZSBpcyBub3QgcGVyc2lzdGVudCBvciB0aGUgUHJlZmVyZW5jZSBpcyBub3QgaW4gdGhlCisgICAgICogICAgICAgICAgICBzaGFyZWQgcHJlZmVyZW5jZXMuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgZnJvbSB0aGUgU2hhcmVkUHJlZmVyZW5jZXMgb3IgdGhlIGRlZmF1bHQgcmV0dXJuCisgICAgICogICAgICAgICB2YWx1ZS4KKyAgICAgKiBAc2VlICNwZXJzaXN0U3RyaW5nU2V0KFNldCkKKyAgICAgKiAKKyAgICAgKiBAaGlkZSBQZW5kaW5nIEFQSSBhcHByb3ZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBnZXRQZXJzaXN0ZWRTdHJpbmdTZXQoU2V0PFN0cmluZz4gZGVmYXVsdFJldHVyblZhbHVlKSB7CisgICAgICAgIGlmICghc2hvdWxkUGVyc2lzdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFJldHVyblZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFNoYXJlZFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nU2V0KG1LZXksIGRlZmF1bHRSZXR1cm5WYWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIEF0dGVtcHRzIHRvIHBlcnNpc3QgYW4gaW50IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzfS4KICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHBlcnNpc3QuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlQWN0aXZpdHkuamF2YQppbmRleCA3MjY3OTNkLi4yZWZiMDlkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUFjdGl2aXR5LmphdmEKQEAgLTE2LDEzNSArMTYsNjMyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKLSAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCi0gKiBsaXN0cywgcG9zc2libHkgc3Bhbm5pbmcgbXVsdGlwbGUgc2NyZWVucy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAotICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKLSAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKLSAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgYWN0aXZpdHkgd2lsbCB1c2UsIGNhbGwKLSAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQotICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGFjdGl2aXR5LgotICogPHA+Ci0gKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCi0gKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCi0gKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KLSAqIHVzZSB0aGlzIGFjdGl2aXR5IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCi0gKiA8cD4KLSAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQotICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQotICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKLSAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCi0gKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCi0gKiA8cD4KLSAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6Ci0gKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5Ci0gKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCi0gKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKLSAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQotICogPHA+Ci0gKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQotICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKLSAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50Ci0gKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgotICogPHA+Ci0gKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKLSAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKLSAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKLSAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKLSAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCi0gKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgYWN0aXZpdHkuCi0gKiA8cD4KLSAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQotICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KLSAqIDxwPgotICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBhY3Rpdml0eSBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQotICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQotICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgotICogCi0gKiBAc2VlIFByZWZlcmVuY2UKLSAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYW4gYWN0aXZpdHkgdG8gc2hvdyBhIGhpZXJhcmNoeSBvZiBwcmVmZXJlbmNlcworICogdG8gdGhlIHVzZXIuICBQcmlvciB0byB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQn0KKyAqIHRoaXMgY2xhc3Mgb25seSBhbGxvd2VkIHRoZSBkaXNwbGF5IG9mIGEgc2luZ2xlIHNldCBvZiBwcmVmZXJlbmNlOyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5IHNob3VsZCBub3cgYmUgZm91bmQgaW4gdGhlIG5ldyB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fQorICogY2xhc3MuICBJZiB5b3UgYXJlIHVzaW5nIFByZWZlcmVuY2VBY3Rpdml0eSBpbiBpdHMgb2xkIG1vZGUsIHRoZSBkb2N1bWVudGF0aW9uCisgKiB0aGVyZSBhcHBsaWVzIHRvIHRoZSBkZXByZWNhdGVkIEFQSXMgaGVyZS4KKyAqCisgKiA8cD5UaGlzIGFjdGl2aXR5IHNob3dzIG9uZSBvciBtb3JlIGhlYWRlcnMgb2YgcHJlZmVyZW5jZXMsIGVhY2ggb2Ygd2l0aAorICogaXMgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gdG8gZGlzcGxheSB0aGUgcHJlZmVyZW5jZXMKKyAqIG9mIHRoYXQgaGVhZGVyLiAgVGhlIGFjdHVhbCBsYXlvdXQgYW5kIGRpc3BsYXkgb2YgdGhlc2UgYXNzb2NpYXRpb25zIGNhbgorICogaG93ZXZlciB2YXJ5OyBjdXJyZW50bHkgdGhlcmUgYXJlIHR3byBtYWpvciBhcHByb2FjaGVzIGl0IG1heSB0YWtlOgorICoKKyAqIDx1bD4KKyAqIDxsaT5PbiBhIHNtYWxsIHNjcmVlbiBpdCBtYXkgZGlzcGxheSBvbmx5IHRoZSBoZWFkZXJzIGFzIGEgc2luZ2xlIGxpc3QKKyAqIHdoZW4gZmlyc3QgbGF1bmNoZWQuICBTZWxlY3Rpbmcgb25lIG9mIHRoZSBoZWFkZXIgaXRlbXMgd2lsbCByZS1sYXVuY2gKKyAqIHRoZSBhY3Rpdml0eSB3aXRoIGl0IG9ubHkgc2hvd2luZyB0aGUgUHJlZmVyZW5jZUZyYWdtZW50IG9mIHRoYXQgaGVhZGVyLgorICogPGxpPk9uIGEgbGFyZ2Ugc2NyZWVuIGluIG1heSBkaXNwbGF5IGJvdGggdGhlIGhlYWRlcnMgYW5kIGN1cnJlbnQKKyAqIFByZWZlcmVuY2VGcmFnbWVudCB0b2dldGhlciBhcyBwYW5lcy4gIFNlbGVjdGluZyBhIGhlYWRlciBpdGVtIHN3aXRjaGVzCisgKiB0byBzaG93aW5nIHRoZSBjb3JyZWN0IFByZWZlcmVuY2VGcmFnbWVudCBmb3IgdGhhdCBpdGVtLgorICogPC91bD4KKyAqCisgKiA8cD5TdWJjbGFzc2VzIG9mIFByZWZlcmVuY2VBY3Rpdml0eSBzaG91bGQgaW1wbGVtZW50CisgKiB7QGxpbmsgI29uQnVpbGRIZWFkZXJzfSB0byBwb3B1bGF0ZSB0aGUgaGVhZGVyIGxpc3Qgd2l0aCB0aGUgZGVzaXJlZAorICogaXRlbXMuICBEb2luZyB0aGlzIGltcGxpY2l0bHkgc3dpdGNoZXMgdGhlIGNsYXNzIGludG8gaXRzIG5ldyAiaGVhZGVycworICogKyBmcmFnbWVudHMiIG1vZGUgcmF0aGVyIHRoYW4gdGhlIG9sZCBzdHlsZSBvZiBqdXN0IHNob3dpbmcgYSBzaW5nbGUKKyAqIHByZWZlcmVuY2VzIGxpc3QuCisgKgorICogPGEgbmFtZT0iU2FtcGxlQ29kZSI+PC9hPgorICogPGgzPlNhbXBsZSBDb2RlPC9oMz4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHNob3dzIGEgc2ltcGxlIHByZWZlcmVuY2UgYWN0aXZpdHkgdGhhdAorICogaGFzIHR3byBkaWZmZXJlbnQgc2V0cyBvZiBwcmVmZXJlbmNlcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiwgY29uc2lzdGluZworICogb2YgdGhlIGFjdGl2aXR5IGl0c2VsZiBhcyB3ZWxsIGFzIGl0cyB0d28gcHJlZmVyZW5jZSBmcmFnbWVudHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VXaXRoSGVhZGVycy5qYXZhCisgKiAgICAgIGFjdGl2aXR5fQorICoKKyAqIDxwPlRoZSBwcmVmZXJlbmNlX2hlYWRlcnMgcmVzb3VyY2UgZGVzY3JpYmVzIHRoZSBoZWFkZXJzIHRvIGJlIGRpc3BsYXllZAorICogYW5kIHRoZSBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBJdCBpczoKKyAqCisgKiB7QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbCBoZWFkZXJzfQorICoKKyAqIDxwPlRoZSBmaXJzdCBoZWFkZXIgaXMgc2hvd24gYnkgUHJlZnMxRnJhZ21lbnQsIHdoaWNoIHBvcHVsYXRlcyBpdHNlbGYKKyAqIGZyb20gdGhlIGZvbGxvd2luZyBYTUwgcmVzb3VyY2U6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbCBwcmVmZXJlbmNlc30KKyAqCisgKiA8cD5Ob3RlIHRoYXQgdGhpcyBYTUwgcmVzb3VyY2UgY29udGFpbnMgYSBwcmVmZXJlbmNlIHNjcmVlbiBob2xkaW5nIGFub3RoZXIKKyAqIGZyYWdtZW50LCB0aGUgUHJlZnMxRnJhZ21lbnRJbm5lciBpbXBsZW1lbnRlZCBoZXJlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIKKyAqIHRvIHRyYXZlcnNlIGRvd24gYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXM7IHByZXNzaW5nIGJhY2sgd2lsbCBwb3AgZWFjaAorICogZnJhZ21lbnQgb2ZmIHRoZSBzdGFjayB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIHByZWZlcmVuY2VzLgorICoKKyAqIDxwPlNlZSB7QGxpbmsgUHJlZmVyZW5jZUZyYWdtZW50fSBmb3IgaW5mb3JtYXRpb24gb24gaW1wbGVtZW50aW5nIHRoZQorICogZnJhZ21lbnRzIHRoZW1zZWx2ZXMuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlQWN0aXZpdHkgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgaW1wbGVtZW50cwotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7Ci0gICAgCisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyLk9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyLAorICAgICAgICBQcmVmZXJlbmNlRnJhZ21lbnQuT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlByZWZlcmVuY2VBY3Rpdml0eSI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOwotICAgIAorCisgICAgLyoqCisgICAgICogV2hlbiBzdGFydGluZyB0aGlzIGFjdGl2aXR5LCB0aGUgaW52b2tpbmcgSW50ZW50IGNhbiBjb250YWluIHRoaXMgZXh0cmEKKyAgICAgKiBzdHJpbmcgdG8gc3BlY2lmeSB3aGljaCBmcmFnbWVudCBzaG91bGQgYmUgaW5pdGlhbGx5IGRpc3BsYXllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TSE9XX0ZSQUdNRU5UID0gIjphbmRyb2lkOnNob3dfZnJhZ21lbnQiOworCisgICAgLyoqCisgICAgICogV2hlbiBzdGFydGluZyB0aGlzIGFjdGl2aXR5IGFuZCB1c2luZyB7QGxpbmsgI0VYVFJBX1NIT1dfRlJBR01FTlR9LAorICAgICAqIHRoaXMgZXh0cmEgY2FuIGFsc28gYmUgc3BlY2lmeSB0byBzdXBwbHkgYSBCdW5kbGUgb2YgYXJndW1lbnRzIHRvIHBhc3MKKyAgICAgKiB0byB0aGF0IGZyYWdtZW50IHdoZW4gaXQgaXMgaW5zdGFudGlhdGVkIGR1cmluZyB0aGUgaW5pdGlhbCBjcmVhdGlvbgorICAgICAqIG9mIFByZWZlcmVuY2VBY3Rpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyA9ICI6YW5kcm9pZDpzaG93X2ZyYWdtZW50X2FyZ3MiOworCisgICAgLyoqCisgICAgICogV2hlbiBzdGFydGluZyB0aGlzIGFjdGl2aXR5LCB0aGUgaW52b2tpbmcgSW50ZW50IGNhbiBjb250YWluIHRoaXMgZXh0cmEKKyAgICAgKiBib29sZWFuIHRoYXQgdGhlIGhlYWRlciBsaXN0IHNob3VsZCBub3QgYmUgZGlzcGxheWVkLiAgVGhpcyBpcyBtb3N0IG9mdGVuCisgICAgICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjRVhUUkFfU0hPV19GUkFHTUVOVH0gdG8gbGF1bmNoCisgICAgICogdGhlIGFjdGl2aXR5IHRvIGRpc3BsYXkgYSBzcGVjaWZpYyBmcmFnbWVudCB0aGF0IHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9OT19IRUFERVJTID0gIjphbmRyb2lkOm5vX2hlYWRlcnMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tfU1RBQ0tfUFJFRlMgPSAiOmFuZHJvaWQ6cHJlZnMiOworCisgICAgLy8gZXh0cmFzIHRoYXQgYWxsb3cgYW55IHByZWZlcmVuY2UgYWN0aXZpdHkgdG8gYmUgbGF1bmNoZWQgYXMgcGFydCBvZiBhIHdpemFyZAorCisgICAgLy8gc2hvdyBCYWNrIGFuZCBOZXh0IGJ1dHRvbnM/IHRha2VzIGJvb2xlYW4gcGFyYW1ldGVyCisgICAgLy8gQmFjayB3aWxsIHRoZW4gcmV0dXJuIFJFU1VMVF9DQU5DRUxFRCBhbmQgTmV4dCBSRVNVTFRfT0sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSID0gImV4dHJhX3ByZWZzX3Nob3dfYnV0dG9uX2JhciI7CisKKyAgICAvLyBhZGQgYSBTa2lwIGJ1dHRvbj8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfUFJFRlNfU0hPV19TS0lQID0gImV4dHJhX3ByZWZzX3Nob3dfc2tpcCI7CisKKyAgICAvLyBzcGVjaWZ5IGN1c3RvbSB0ZXh0IGZvciB0aGUgQmFjayBvciBOZXh0IGJ1dHRvbnMsIG9yIGNhdXNlIGEgYnV0dG9uIHRvIG5vdCBhcHBlYXIKKyAgICAvLyBhdCBhbGwgYnkgc2V0dGluZyBpdCB0byBudWxsCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9ORVhUX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X25leHRfdGV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQgPSAiZXh0cmFfcHJlZnNfc2V0X2JhY2tfdGV4dCI7CisKKyAgICAvLyAtLS0gU3RhdGUgZm9yIG5ldyBtb2RlIHdoZW4gc2hvd2luZyBhIGxpc3Qgb2YgaGVhZGVycyArIHByZWZzIGZyYWdtZW50CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxIZWFkZXI+IG1IZWFkZXJzID0gbmV3IEFycmF5TGlzdDxIZWFkZXI+KCk7CisKKyAgICBwcml2YXRlIEhlYWRlckFkYXB0ZXIgbUFkYXB0ZXI7CisKKyAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1MaXN0Rm9vdGVyOworCisgICAgcHJpdmF0ZSBWaWV3IG1QcmVmc0NvbnRhaW5lcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU2luZ2xlUGFuZTsKKworICAgIC8vIC0tLSBTdGF0ZSBmb3Igb2xkIG1vZGUgd2hlbiBzaG93aW5nIGEgc2luZ2xlIHByZWZlcmVuY2UgbGlzdAorCiAgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7Ci0gICAgCisKICAgICBwcml2YXRlIEJ1bmRsZSBtU2F2ZWRJbnN0YW5jZVN0YXRlOwogCisgICAgLy8gLS0tIENvbW1vbiBzdGF0ZQorCisgICAgcHJpdmF0ZSBCdXR0b24gbU5leHRCdXR0b247CisKICAgICAvKioKICAgICAgKiBUaGUgc3RhcnRpbmcgcmVxdWVzdCBjb2RlIGdpdmVuIG91dCB0byBwcmVmZXJlbmNlIGZyYW1ld29yay4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfUkVRVUVTVF9DT0RFID0gMTAwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0JJTkRfUFJFRkVSRU5DRVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQlVJTERfSEVBREVSUyA9IDI7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfQklORF9QUkVGRVJFTkNFUzoKICAgICAgICAgICAgICAgICAgICAgYmluZFByZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0JVSUxEX0hFQURFUlM6CisgICAgICAgICAgICAgICAgICAgIG9uQnVpbGRIZWFkZXJzKG1IZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9uR2V0TmV3SGVhZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCAmJiBoZWFkZXIuZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoVG9IZWFkZXIoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhlYWRlckFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8SGVhZGVyPiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhlYWRlclZpZXdIb2xkZXIgeworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb247CisgICAgICAgICAgICBUZXh0VmlldyB0aXRsZTsKKyAgICAgICAgICAgIFRleHRWaWV3IHN1bW1hcnk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIExheW91dEluZmxhdGVyIG1JbmZsYXRlcjsKKworICAgICAgICBwdWJsaWMgSGVhZGVyQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8SGVhZGVyPiBvYmplY3RzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCBvYmplY3RzKTsKKyAgICAgICAgICAgIG1JbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIEhlYWRlclZpZXdIb2xkZXIgaG9sZGVyOworICAgICAgICAgICAgVmlldyB2aWV3OworCisgICAgICAgICAgICBpZiAoY29udmVydFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXcgPSBtSW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5wcmVmZXJlbmNlX2xpc3RfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIGhvbGRlciA9IG5ldyBIZWFkZXJWaWV3SG9sZGVyKCk7CisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24gPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24pOworICAgICAgICAgICAgICAgIGhvbGRlci50aXRsZSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50aXRsZSk7CisgICAgICAgICAgICAgICAgaG9sZGVyLnN1bW1hcnkgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgdmlldy5zZXRUYWcoaG9sZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmlldyA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGhvbGRlciA9IChIZWFkZXJWaWV3SG9sZGVyKSB2aWV3LmdldFRhZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbGwgdmlldyBmaWVsZHMgbXVzdCBiZSB1cGRhdGVkIGV2ZXJ5IHRpbWUsIGJlY2F1c2UgdGhlIHZpZXcgbWF5IGJlIHJlY3ljbGVkIAorICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGhlYWRlci5pY29uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZURyYXdhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlUmVzb3VyY2UoaGVhZGVyLmljb25SZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuaWNvbi5zZXRJbWFnZVJlc291cmNlKDApOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uLnNldEltYWdlRHJhd2FibGUoaGVhZGVyLmljb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaG9sZGVyLnRpdGxlLnNldFRleHQoaGVhZGVyLnRpdGxlKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShoZWFkZXIuc3VtbWFyeSkpIHsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhvbGRlci5zdW1tYXJ5LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBob2xkZXIuc3VtbWFyeS5zZXRUZXh0KGhlYWRlci5zdW1tYXJ5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBIZWFkZXIgaXRlbSB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogVGl0bGUgb2YgdGhlIGhlYWRlciB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLgorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNQcmVmZXJlbmNlSGVhZGVyX3RpdGxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHRpdGxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBzdW1tYXJ5IGRlc2NyaWJpbmcgd2hhdCB0aGlzIGhlYWRlciBjb250cm9scy4KKyAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjUHJlZmVyZW5jZUhlYWRlcl9zdW1tYXJ5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1bW1hcnk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIGljb24gcmVzb3VyY2UgdG8gc2hvdyBmb3IgdGhpcyBoZWFkZXIuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfaWNvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBpY29uUmVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcHRpb25hbCBpY29uIGRyYXdhYmxlIHRvIHNob3cgZm9yIHRoaXMgaGVhZGVyLiAgKElmIHRoaXMgaXMgbm9uLW51bGwsCisgICAgICAgICAqIHRoZSBpY29uUmVzIHdpbGwgYmUgaWdub3JlZC4pCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRHJhd2FibGUgaWNvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRnVsbCBjbGFzcyBuYW1lIG9mIHRoZSBmcmFnbWVudCB0byBkaXNwbGF5IHdoZW4gdGhpcyBoZWFkZXIgaXMKKyAgICAgICAgICogc2VsZWN0ZWQuCisgICAgICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ByZWZlcmVuY2VIZWFkZXJfZnJhZ21lbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZnJhZ21lbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBzdXBwbHkgdG8gdGhlIGZyYWdtZW50IHdoZW4gaXQgaXMKKyAgICAgICAgICogaW5zdGFudGlhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1bmRsZSBmcmFnbWVudEFyZ3VtZW50czsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW50ZW50IHRvIGxhdW5jaCB3aGVuIHRoZSBwcmVmZXJlbmNlIGlzIHNlbGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEludGVudCBpbnRlbnQ7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCiAgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnByZWZlcmVuY2VfbGlzdF9jb250ZW50KTsKLSAgICAgICAgCi0gICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlciA9IG9uQ3JlYXRlUHJlZmVyZW5jZU1hbmFnZXIoKTsKKworICAgICAgICBtTGlzdEZvb3RlciA9IChGcmFtZUxheW91dClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5saXN0X2Zvb3Rlcik7CisgICAgICAgIG1QcmVmc0NvbnRhaW5lciA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzKTsKKyAgICAgICAgYm9vbGVhbiBoaWRpbmdIZWFkZXJzID0gb25Jc0hpZGluZ0hlYWRlcnMoKTsKKyAgICAgICAgbVNpbmdsZVBhbmUgPSBoaWRpbmdIZWFkZXJzIHx8ICFvbklzTXVsdGlQYW5lKCk7CisgICAgICAgIFN0cmluZyBpbml0aWFsRnJhZ21lbnQgPSBnZXRJbnRlbnQoKS5nZXRTdHJpbmdFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UKTsKKyAgICAgICAgQnVuZGxlIGluaXRpYWxBcmd1bWVudHMgPSBnZXRJbnRlbnQoKS5nZXRCdW5kbGVFeHRyYShFWFRSQV9TSE9XX0ZSQUdNRU5UX0FSR1VNRU5UUyk7CisKKyAgICAgICAgaWYgKGluaXRpYWxGcmFnbWVudCAhPSBudWxsICYmIG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUganVzdCBzaG93aW5nIGEgZnJhZ21lbnQsIHdlIHdhbnQgdG8gcnVuIGluCisgICAgICAgICAgICAvLyBuZXcgZnJhZ21lbnQgbW9kZSwgYnV0IGRvbid0IG5lZWQgdG8gY29tcHV0ZSBhbmQgc2hvdworICAgICAgICAgICAgLy8gdGhlIGhlYWRlcnMuCisgICAgICAgICAgICBnZXRMaXN0VmlldygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1QcmVmc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQsIGluaXRpYWxBcmd1bWVudHMpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHRyeSB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgICAgICAgIG9uQnVpbGRIZWFkZXJzKG1IZWFkZXJzKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGhlYWRlcnMsIHRoZW4gYXQgdGhpcyBwb2ludCB3ZSBuZWVkIHRvIHNob3cKKyAgICAgICAgICAgIC8vIHRoZW0gYW5kLCBkZXBlbmRpbmcgb24gdGhlIHNjcmVlbiwgd2UgbWF5IGFsc28gc2hvdyBpbi1saW5lCisgICAgICAgICAgICAvLyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHByZWZlcmVuY2UgZnJhZ21lbnQuCisgICAgICAgICAgICBpZiAobUhlYWRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IEhlYWRlckFkYXB0ZXIodGhpcywgbUhlYWRlcnMpOworICAgICAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmVmc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsRnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGggPSBvbkdldEluaXRpYWxIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxGcmFnbWVudCA9IGguZnJhZ21lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJndW1lbnRzID0gaC5mcmFnbWVudEFyZ3VtZW50czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihpbml0aWFsRnJhZ21lbnQsIGluaXRpYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGhlYWRlcnMsIHdlIGFyZSBpbiB0aGUgb2xkICJqdXN0IHNob3cgYSBzY3JlZW4KKyAgICAgICAgICAgIC8vIG9mIHByZWZlcmVuY2VzIiBtb2RlLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIodGhpcywgRklSU1RfUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBnZXRMaXN0VmlldygpLnNldFNjcm9sbEJhclN0eWxlKFZpZXcuU0NST0xMQkFSU19JTlNJREVfT1ZFUkxBWSk7CisKKyAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCBzaG93IEJhY2svTmV4dCBidXR0b25zCisgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKGludGVudC5nZXRCb29sZWFuRXh0cmEoRVhUUkFfUFJFRlNfU0hPV19CVVRUT05fQkFSLCBmYWxzZSkpIHsKKworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYnV0dG9uX2Jhcikuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBCdXR0b24gYmFja0J1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYmFja19idXR0b24pOworICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBCdXR0b24gc2tpcEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc2tpcF9idXR0b24pOworICAgICAgICAgICAgc2tpcEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubmV4dF9idXR0b24pOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBzZXQgb3VyIHZhcmlvdXMgYnV0dG9uIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmIChpbnRlbnQuaGFzRXh0cmEoRVhUUkFfUFJFRlNfU0VUX05FWFRfVEVYVCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShFWFRSQV9QUkVGU19TRVRfTkVYVF9URVhUKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoYnV0dG9uVGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW50ZW50Lmhhc0V4dHJhKEVYVFJBX1BSRUZTX1NFVF9CQUNLX1RFWFQpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoRVhUUkFfUFJFRlNfU0VUX0JBQ0tfVEVYVCk7CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGJ1dHRvblRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0Qm9vbGVhbkV4dHJhKEVYVFJBX1BSRUZTX1NIT1dfU0tJUCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgc2tpcEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBhY3Rpdml0eSBpcyBjdXJyZW50bHkgc2hvd2luZyB0aGUgaGVhZGVyIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldExpc3RWaWV3KCkuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRQorICAgICAgICAgICAgICAgICYmIG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcgbXVsdGlwbGUgcGFuZXMgLS0gdGhlIGhlYWRlcnMKKyAgICAgKiBhbmQgYSBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTXVsdGlQYW5lKCkgeworICAgICAgICByZXR1cm4gaGFzSGVhZGVycygpICYmIG1QcmVmc0NvbnRhaW5lci5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFjdGl2aXR5IHNob3VsZCBydW4gaW4gbXVsdGktcGFuZSBtb2RlLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2NyZWVuIGlzIGxhcmdlCisgICAgICogZW5vdWdoLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uSXNNdWx0aVBhbmUoKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoKGNvbmZpZy5zY3JlZW5MYXlvdXQmQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKQorICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFCisgICAgICAgICAgICAgICAgJiYgY29uZmlnLm9yaWVudGF0aW9uID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBoZWFkZXIgbGlzdCBzaG91bGQgYmUgaGlkZGVuLgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlCisgICAgICogdmFsdWUgZ2l2ZW4gaW4ge0BsaW5rICNFWFRSQV9OT19IRUFERVJTfSBvciBmYWxzZSBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgICAgICogVGhpcyBpcyBzZXQgdG8gZmFsc2UsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBiZWluZyByZS1sYXVuY2hlZAorICAgICAqIHRvIHNob3cgYSBwYXJ0aWN1bGFyIHByZWZlcmVuY2UgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25Jc0hpZGluZ0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRJbnRlbnQoKS5nZXRCb29sZWFuRXh0cmEoRVhUUkFfTk9fSEVBREVSUywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgaGVhZGVyIHRvIGJlIHNob3duLiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgZnJhZ21lbnQgb2YgdGhlIGZpcnN0IGhlYWRlci4gIE5vdGUKKyAgICAgKiB0aGF0IHRoZSByZXR1cm5lZCBIZWFkZXIgb2JqZWN0IGRvZXMgbm90IGFjdHVhbGx5IG5lZWQgdG8gZXhpc3QgaW4KKyAgICAgKiB5b3VyIGhlYWRlciBsaXN0IC0tIHdoYXRldmVyIGl0cyBmcmFnbWVudCBpcyB3aWxsIHNpbXBseSBiZSB1c2VkIHRvCisgICAgICogc2hvdyBmb3IgdGhlIGluaXRpYWwgVUkuCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBvbkdldEluaXRpYWxIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVycy5nZXQoMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgbGlzdCBoYXMgYmVlbiB1cGRhdGVkICh7QGxpbmsgI29uQnVpbGRIZWFkZXJzfQorICAgICAqIGhhcyBiZWVuIGNhbGxlZCBhbmQgcmV0dXJuZWQgZHVlIHRvIHtAbGluayAjaW52YWxpZGF0ZUhlYWRlcnMoKX0pIHRvCisgICAgICogc3BlY2lmeSB0aGUgaGVhZGVyIHRoYXQgc2hvdWxkIG5vdyBiZSBzZWxlY3RlZC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICogcmV0dXJucyBudWxsIHRvIGtlZXAgd2hhdGV2ZXIgaGVhZGVyIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyIG9uR2V0TmV3SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgbmVlZHMgaXRzIGxpc3Qgb2YgaGVhZGVycyBidWlsZC4gIEJ5CisgICAgICogaW1wbGVtZW50aW5nIHRoaXMgYW5kIGFkZGluZyBhdCBsZWFzdCBvbmUgaXRlbSB0byB0aGUgbGlzdCwgeW91CisgICAgICogd2lsbCBjYXVzZSB0aGUgYWN0aXZpdHkgdG8gcnVuIGluIGl0cyBtb2Rlcm4gZnJhZ21lbnQgbW9kZS4gIE5vdGUKKyAgICAgKiB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBhbHdheXMgYmUgY2FsbGVkOyBmb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICogYWN0aXZpdHkgaGFzIGJlZW4gYXNrZWQgdG8gZGlzcGxheSBhIHBhcnRpY3VsYXIgZnJhZ21lbnQgd2l0aG91dAorICAgICAqIHRoZSBoZWFkZXIgbGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCB0aGUgaGVhZGVycy4KKyAgICAgKgorICAgICAqIDxwPlR5cGljYWwgaW1wbGVtZW50YXRpb25zIHdpbGwgdXNlIHtAbGluayAjbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2V9CisgICAgICogdG8gZmlsbCBpbiB0aGUgbGlzdCBmcm9tIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBsaXN0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHdoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBoZWFkZXJzIGJlaW5nIGRpc3BsYXllZC4gIFdpbGwgcmVzdWx0CisgICAgICogaW4gb25CdWlsZEhlYWRlcnMoKSBsYXRlciBiZWluZyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIG5ldyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGVIZWFkZXJzKCkgeworICAgICAgICBpZiAoIW1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CVUlMRF9IRUFERVJTKSkgeworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQlVJTERfSEVBREVSUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gWE1MIGZpbGUgYXMgYSBoZWFkZXIgZGVzY3JpcHRpb24sIGFkZGluZyBlYWNoCisgICAgICogcGFyc2VkIEhlYWRlciBpbnRvIHRoZSB0YXJnZXQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNpZCBUaGUgWE1MIHJlc291cmNlIHRvIGxvYWQgYW5kIHBhcnNlLgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIGxpc3QgaW4gd2hpY2ggdGhlIHBhcnNlZCBoZWFkZXJzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoaW50IHJlc2lkLCBMaXN0PEhlYWRlcj4gdGFyZ2V0KSB7CisgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIgPSBnZXRSZXNvdXJjZXMoKS5nZXRYbWwocmVzaWQpOworICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzID0gWG1sLmFzQXR0cmlidXRlU2V0KHBhcnNlcik7CisKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlPXBhcnNlci5uZXh0KCkpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghInByZWZlcmVuY2UtaGVhZGVycyIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlhNTCBkb2N1bWVudCBtdXN0IHN0YXJ0IHdpdGggPHByZWZlcmVuY2UtaGVhZGVycz4gdGFnOyBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZU5hbWUgKyAiIGF0ICIgKyBwYXJzZXIuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnVuZGxlIGN1ckJ1bmRsZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICB3aGlsZSAoKHR5cGU9cGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAgICAmJiAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBvdXRlckRlcHRoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCJoZWFkZXIiLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IHNhID0gZ2V0UmVzb3VyY2VzKCkub2J0YWluQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRpdGxlID0gc2EuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnN1bW1hcnkgPSBzYS5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByZWZlcmVuY2VIZWFkZXJfc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlci5pY29uUmVzID0gc2EuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5QcmVmZXJlbmNlSGVhZGVyX2ljb24sIDApOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIuZnJhZ21lbnQgPSBzYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJlZmVyZW5jZUhlYWRlcl9mcmFnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHNhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1ckJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbm5lckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodHlwZT1wYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gaW5uZXJEZXB0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRyB8fCB0eXBlID09IFhtbFB1bGxQYXJzZXIuVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5uZXJOb2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImV4dHJhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKCJleHRyYSIsIGF0dHJzLCBjdXJCdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5uZXJOb2RlTmFtZS5lcXVhbHMoImludGVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmludGVudCA9IEludGVudC5wYXJzZUludGVudChnZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMuc2tpcEN1cnJlbnRUYWcocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJCdW5kbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmZyYWdtZW50QXJndW1lbnRzID0gY3VyQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgY3VyQnVuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGQoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGhlYWRlcnMiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgaGVhZGVycyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgZm9vdGVyIHRoYXQgc2hvdWxkIGJlIHNob3duIGF0IHRoZSBib3R0b20gb2YgdGhlIGhlYWRlciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RGb290ZXIoVmlldyB2aWV3KSB7CisgICAgICAgIG1MaXN0Rm9vdGVyLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1MaXN0Rm9vdGVyLmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblN0b3AoKSB7CiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICAKLSAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVN0b3AoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eURlc3Ryb3koKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CiAKLSAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwotICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKLSAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCdW5kbGUoUFJFRkVSRU5DRVNfVEFHLCBjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc3RhdGUpIHsKLSAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHN0YXRlLmdldEJ1bmRsZShQUkVGRVJFTkNFU19UQUcpOwotICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiA9IGdldFByZWZlcmVuY2VTY3JlZW4oKTsKLSAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOwotICAgICAgICAgICAgICAgIG1TYXZlZEluc3RhbmNlU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChtUHJlZmVyZW5jZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGNvbnRhaW5lciA9IHN0YXRlLmdldEJ1bmRsZShQUkVGRVJFTkNFU19UQUcpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5yZXN0b3JlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhdmVkSW5zdGFuY2VTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1NiwxNCArNjUzLDEwNCBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQWN0aXZpdHlSZXN1bHQoaW50IHJlcXVlc3RDb2RlLCBpbnQgcmVzdWx0Q29kZSwgSW50ZW50IGRhdGEpIHsKICAgICAgICAgc3VwZXIub25BY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7Ci0gICAgICAgIAotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hBY3Rpdml0eVJlc3VsdChyZXF1ZXN0Q29kZSwgcmVzdWx0Q29kZSwgZGF0YSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNvbnRlbnRDaGFuZ2VkKCkgewogICAgICAgICBzdXBlci5vbkNvbnRlbnRDaGFuZ2VkKCk7Ci0gICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBzdXBlci5vbkxpc3RJdGVtQ2xpY2sobCwgdiwgcG9zaXRpb24sIGlkKTsKKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgb25IZWFkZXJDbGljayhtSGVhZGVycy5nZXQocG9zaXRpb24pLCBwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gaW4gdGhlIGhlYWRlciBsaXN0LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGNhbGwgZWl0aGVyIHtAbGluayAjc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nLCBCdW5kbGUpfQorICAgICAqIG9yIHtAbGluayAjc3dpdGNoVG9IZWFkZXIoU3RyaW5nLCBCdW5kbGUpfSBhcyBhcHByb3ByaWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciB0aGF0IHdhcyBzZWxlY3RlZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGhlYWRlcidzIHBvc2l0aW9uIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVyQ2xpY2soSGVhZGVyIGhlYWRlciwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChoZWFkZXIuZnJhZ21lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1TaW5nbGVQYW5lKSB7CisgICAgICAgICAgICAgICAgc3RhcnRXaXRoRnJhZ21lbnQoaGVhZGVyLmZyYWdtZW50LCBoZWFkZXIuZnJhZ21lbnRBcmd1bWVudHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2hUb0hlYWRlcihoZWFkZXIuZnJhZ21lbnQsIGhlYWRlci5mcmFnbWVudEFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGhlYWRlci5pbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBhY3Rpdml0eSwgc2hvd2luZyBvbmx5IHRoZSBnaXZlbgorICAgICAqIHByZWZlcmVuY2UgZnJhZ21lbnQuICBXaGVuIGxhdW5jaGVkIGluIHRoaXMgbW9kZSwgdGhlIGhlYWRlciBsaXN0CisgICAgICogd2lsbCBiZSBoaWRkZW4gYW5kIHRoZSBnaXZlbiBwcmVmZXJlbmNlIGZyYWdtZW50IHdpbGwgYmUgaW5zdGFudGlhdGVkCisgICAgICogYW5kIGZpbGwgdGhlIGVudGlyZSBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZyYWdtZW50IHRvIGRpc3BsYXkuCisgICAgICogQHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIHN1cHBseSB0byB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaXRoRnJhZ21lbnQoU3RyaW5nIGZyYWdtZW50TmFtZSwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9NQUlOKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIGdldENsYXNzKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfU0hPV19GUkFHTUVOVCwgZnJhZ21lbnROYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1NIT1dfRlJBR01FTlRfQVJHVU1FTlRTLCBhcmdzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05PX0hFQURFUlMsIHRydWUpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hlbiBpbiB0d28tcGFuZSBtb2RlLCBzd2l0Y2ggdGhlIGZyYWdtZW50IHBhbmUgdG8gc2hvdyB0aGUgZ2l2ZW4KKyAgICAgKiBwcmVmZXJlbmNlIGZyYWdtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGZyYWdtZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gZGlzcGxheS4KKyAgICAgKiBAcGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gc3VwcGx5IHRvIHRoZSBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2l0Y2hUb0hlYWRlcihTdHJpbmcgZnJhZ21lbnROYW1lLCBCdW5kbGUgYXJncykgeworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5wb3BCYWNrU3RhY2soQkFDS19TVEFDS19QUkVGUywgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFKTsKKworICAgICAgICBGcmFnbWVudCBmID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgZnJhZ21lbnROYW1lLCBhcmdzKTsKKyAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCkucmVwbGFjZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmKS5jb21taXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIG5ldyBmcmFnbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gc3RhcnQKKyAgICAgKiBAcGFyYW0gcHVzaCBJZiB0cnVlLCB0aGUgY3VycmVudCBmcmFnbWVudCB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZSBiYWNrIHN0YWNrLiAgSWYgZmFsc2UsCisgICAgICogdGhlIGN1cnJlbnQgZnJhZ21lbnQgd2lsbCBiZSByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZlcmVuY2VGcmFnbWVudChGcmFnbWVudCBmcmFnbWVudCwgYm9vbGVhbiBwdXNoKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgdHJhbnNhY3Rpb24ucmVwbGFjZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnByZWZzLCBmcmFnbWVudCk7CisgICAgICAgIGlmIChwdXNoKSB7CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5hZGRUb0JhY2tTdGFjayhCQUNLX1NUQUNLX1BSRUZTKTsKKyAgICAgICAgfQorICAgICAgICB0cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZikgeworICAgICAgICBGcmFnbWVudCBmID0gRnJhZ21lbnQuaW5zdGFudGlhdGUodGhpcywgcHJlZi5nZXRGcmFnbWVudCgpLCBwcmVmLmdldEV4dHJhcygpKTsKKyAgICAgICAgc3RhcnRQcmVmZXJlbmNlRnJhZ21lbnQoZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc2LDcgKzc2Myw3IEBACiAgICAgICAgIGlmIChtSGFuZGxlci5oYXNNZXNzYWdlcyhNU0dfQklORF9QUkVGRVJFTkNFUykpIHJldHVybjsKICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQklORF9QUkVGRVJFTkNFUykuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcmVmZXJlbmNlcygpIHsKICAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOwogICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CkBAIC0xODcsMzggKzc3NCw0MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VNYW5hZ2VyfSB1c2VkIGJ5IHRoaXMgYWN0aXZpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBvbkNyZWF0ZVByZWZlcmVuY2VNYW5hZ2VyKCkgewotICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBwcmVmZXJlbmNlTWFuYWdlciA9IG5ldyBQcmVmZXJlbmNlTWFuYWdlcih0aGlzLCBGSVJTVF9SRVFVRVNUX0NPREUpOwotICAgICAgICBwcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIHByZWZlcmVuY2VNYW5hZ2VyOwotICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0gdXNlZCBieSB0aGlzIGFjdGl2aXR5LgogICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgUHJlZmVyZW5jZU1hbmFnZXIgZ2V0UHJlZmVyZW5jZU1hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpIHsKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgaWYgKG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1cGVyLm9uQ3JlYXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNb2Rlcm4gdHdvLXBhbmUgUHJlZmVyZW5jZUFjdGl2aXR5IHJlcXVpcmVzIHVzZSBvZiBhIFByZWZlcmVuY2VGcmFnbWVudCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcm9vdCBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkgdGhhdCB0aGlzIGFjdGl2aXR5IGlzIHNob3dpbmcuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZVNjcmVlbiBUaGUgcm9vdCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVsZXZhbnQgZm9yIGEgbW9kZXJuIGZyYWdtZW50LWJhc2VkCisgICAgICogUHJlZmVyZW5jZUFjdGl2aXR5LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlci5zZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlU2NyZWVuKSAmJiBwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKICAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IGdldFByZWZlcmVuY2VTY3JlZW4oKS5nZXRUaXRsZSgpOwpAQCAtMjI4LDYxICs4MTgsODQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBhY3Rpdml0eSBpcyBzaG93aW5nLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHRoYXQgaXMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UKICAgICAgKiAgICAgICAgIGhpZXJhcmNoeS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQcmVmZXJlbmNlU2NyZWVuIGdldFByZWZlcmVuY2VTY3JlZW4oKSB7Ci0gICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEFkZHMgcHJlZmVyZW5jZXMgZnJvbSBhY3Rpdml0aWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBJbnRlbnR9LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGludGVudCBUaGUge0BsaW5rIEludGVudH0gdG8gcXVlcnkgYWN0aXZpdGllcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbUludGVudChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOwotICAgICAgICAKKwogICAgICAgICBzZXRQcmVmZXJlbmNlU2NyZWVuKG1QcmVmZXJlbmNlTWFuYWdlci5pbmZsYXRlRnJvbUludGVudChpbnRlbnQsIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEluZmxhdGVzIHRoZSBnaXZlbiBYTUwgcmVzb3VyY2UgYW5kIGFkZHMgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRvIHRoZSBjdXJyZW50CiAgICAgICogcHJlZmVyZW5jZSBoaWVyYXJjaHkuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZmVyZW5jZXNSZXNJZCBUaGUgWE1MIHJlc291cmNlIElEIHRvIGluZmxhdGUuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWxldmFudCBmb3IgYSBtb2Rlcm4gZnJhZ21lbnQtYmFzZWQKKyAgICAgKiBQcmVmZXJlbmNlQWN0aXZpdHkuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShpbnQgcHJlZmVyZW5jZXNSZXNJZCkgewogICAgICAgICByZXF1aXJlUHJlZmVyZW5jZU1hbmFnZXIoKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21SZXNvdXJjZSh0aGlzLCBwcmVmZXJlbmNlc1Jlc0lkLAogICAgICAgICAgICAgICAgIGdldFByZWZlcmVuY2VTY3JlZW4oKSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlZmVyZW5jZVRyZWVDbGljayhQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4sIFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogRmluZHMgYSB7QGxpbmsgUHJlZmVyZW5jZX0gYmFzZWQgb24gaXRzIGtleS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJlZmVyZW5jZSB0byByZXRyaWV2ZS4KICAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZX0gd2l0aCB0aGUga2V5LCBvciBudWxsLgogICAgICAqIEBzZWUgUHJlZmVyZW5jZUdyb3VwI2ZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSkKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGV2YW50IGZvciBhIG1vZGVybiBmcmFnbWVudC1iYXNlZAorICAgICAqIFByZWZlcmVuY2VBY3Rpdml0eS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQcmVmZXJlbmNlIGZpbmRQcmVmZXJlbmNlKENoYXJTZXF1ZW5jZSBrZXkpIHsKLSAgICAgICAgCisKICAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmZpbmRQcmVmZXJlbmNlKGtleSk7CiAgICAgfQogCkBAIC0yOTIsNSArOTA1LDE0IEBACiAgICAgICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuZGlzcGF0Y2hOZXdJbnRlbnQoaW50ZW50KTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8vIGdpdmUgc3ViY2xhc3NlcyBhY2Nlc3MgdG8gdGhlIE5leHQgYnV0dG9uCisgICAgLyoqIEBoaWRlICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uICE9IG51bGw7CisgICAgfQorICAgIC8qKiBAaGlkZSAqLworICAgIHByb3RlY3RlZCBCdXR0b24gZ2V0TmV4dEJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1OZXh0QnV0dG9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OTQ5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCisvKioKKyAqIFNob3dzIGEgaGllcmFyY2h5IG9mIHtAbGluayBQcmVmZXJlbmNlfSBvYmplY3RzIGFzCisgKiBsaXN0cy4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbAorICogYXV0b21hdGljYWxseSBzYXZlIHRvIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gYXMgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGgKKyAqIHRoZW0uIFRvIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30gdGhhdCB0aGUKKyAqIHByZWZlcmVuY2UgaGllcmFyY2h5IGluIHRoaXMgZnJhZ21lbnQgd2lsbCB1c2UsIGNhbGwKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNnZXREZWZhdWx0U2hhcmVkUHJlZmVyZW5jZXMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpfQorICogd2l0aCBhIGNvbnRleHQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGlzIGZyYWdtZW50LgorICogPHA+CisgKiBGdXJ0aGVybW9yZSwgdGhlIHByZWZlcmVuY2VzIHNob3duIHdpbGwgZm9sbG93IHRoZSB2aXN1YWwgc3R5bGUgb2Ygc3lzdGVtCisgKiBwcmVmZXJlbmNlcy4gSXQgaXMgZWFzeSB0byBjcmVhdGUgYSBoaWVyYXJjaHkgb2YgcHJlZmVyZW5jZXMgKHRoYXQgY2FuIGJlCisgKiBzaG93biBvbiBtdWx0aXBsZSBzY3JlZW5zKSB2aWEgWE1MLiBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8KKyAqIHVzZSB0aGlzIGZyYWdtZW50IChhcyBhIHN1cGVyY2xhc3MpIHRvIGRlYWwgd2l0aCBwcmVmZXJlbmNlcyBpbiBhcHBsaWNhdGlvbnMuCisgKiA8cD4KKyAqIEEge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IG9iamVjdCBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiB0aGUgcHJlZmVyZW5jZQorICogaGllcmFyY2h5LiBGdXJ0aGVybW9yZSwgc3Vic2VxdWVudCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeQorICogZGVub3RlIGEgc2NyZWVuIGJyZWFrLS10aGF0IGlzIHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgd2l0aGluIHN1YnNlcXVlbnQKKyAqIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBzaG91bGQgYmUgc2hvd24gb24gYW5vdGhlciBzY3JlZW4uIFRoZSBwcmVmZXJlbmNlCisgKiBmcmFtZXdvcmsgaGFuZGxlcyBzaG93aW5nIHRoZXNlIG90aGVyIHNjcmVlbnMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgKiA8cD4KKyAqIFRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSBjYW4gYmUgZm9ybWVkIGluIG11bHRpcGxlIHdheXM6CisgKiA8bGk+IEZyb20gYW4gWE1MIGZpbGUgc3BlY2lmeWluZyB0aGUgaGllcmFyY2h5CisgKiA8bGk+IEZyb20gZGlmZmVyZW50IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2ggc3BlY2lmeSBpdHMgb3duCisgKiBwcmVmZXJlbmNlcyBpbiBhbiBYTUwgZmlsZSB2aWEge0BsaW5rIEFjdGl2aXR5fSBtZXRhLWRhdGEKKyAqIDxsaT4gRnJvbSBhbiBvYmplY3QgaGllcmFyY2h5IHJvb3RlZCB3aXRoIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufQorICogPHA+CisgKiBUbyBpbmZsYXRlIGZyb20gWE1MLCB1c2UgdGhlIHtAbGluayAjYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoaW50KX0uIFRoZQorICogcm9vdCBlbGVtZW50IHNob3VsZCBiZSBhIHtAbGluayBQcmVmZXJlbmNlU2NyZWVufS4gU3Vic2VxdWVudCBlbGVtZW50cyBjYW4gcG9pbnQKKyAqIHRvIGFjdHVhbCB7QGxpbmsgUHJlZmVyZW5jZX0gc3ViY2xhc3Nlcy4gQXMgbWVudGlvbmVkIGFib3ZlLCBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gaW4gdGhlIGhpZXJhcmNoeSB3aWxsIHJlc3VsdCBpbiB0aGUgc2NyZWVuIGJyZWFrLgorICogPHA+CisgKiBUbyBzcGVjaWZ5IGFuIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IHtAbGluayBBY3Rpdml0eSBBY3Rpdml0aWVzfSB0aGF0IGVhY2gKKyAqIGhhdmUgcHJlZmVyZW5jZXMsIHVzZSB7QGxpbmsgI2FkZFByZWZlcmVuY2VzRnJvbUludGVudH0uIEVhY2gKKyAqIHtAbGluayBBY3Rpdml0eX0gY2FuIHNwZWNpZnkgbWV0YS1kYXRhIGluIHRoZSBtYW5pZmVzdCAodmlhIHRoZSBrZXkKKyAqIHtAbGluayBQcmVmZXJlbmNlTWFuYWdlciNNRVRBREFUQV9LRVlfUFJFRkVSRU5DRVN9KSB0aGF0IHBvaW50cyB0byBhbiBYTUwKKyAqIHJlc291cmNlLiBUaGVzZSBYTUwgcmVzb3VyY2VzIHdpbGwgYmUgaW5mbGF0ZWQgaW50byBhIHNpbmdsZSBwcmVmZXJlbmNlCisgKiBoaWVyYXJjaHkgYW5kIHNob3duIGJ5IHRoaXMgZnJhZ21lbnQuCisgKiA8cD4KKyAqIFRvIHNwZWNpZnkgYW4gb2JqZWN0IGhpZXJhcmNoeSByb290ZWQgd2l0aCB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0sIHVzZQorICoge0BsaW5rICNzZXRQcmVmZXJlbmNlU2NyZWVuKFByZWZlcmVuY2VTY3JlZW4pfS4KKyAqIDxwPgorICogQXMgYSBjb252ZW5pZW5jZSwgdGhpcyBmcmFnbWVudCBpbXBsZW1lbnRzIGEgY2xpY2sgbGlzdGVuZXIgZm9yIGFueQorICogcHJlZmVyZW5jZSBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHksIHNlZQorICoge0BsaW5rICNvblByZWZlcmVuY2VUcmVlQ2xpY2soUHJlZmVyZW5jZVNjcmVlbiwgUHJlZmVyZW5jZSl9LgorICoKKyAqIDxhIG5hbWU9IlNhbXBsZUNvZGUiPjwvYT4KKyAqIDxoMz5TYW1wbGUgQ29kZTwvaDM+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzYW1wbGUgY29kZSBzaG93cyBhIHNpbXBsZSBwcmVmZXJlbmNlIGZyYWdtZW50IHRoYXQgaXMKKyAqIHBvcHVsYXRlZCBmcm9tIGEgcmVzb3VyY2UuICBUaGUgcmVzb3VyY2UgaXQgbG9hZHMgaXM6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgcHJlZmVyZW5jZXN9CisgKgorICogPHA+VGhlIGZyYWdtZW50IGltcGxlbWVudGF0aW9uIGl0c2VsZiBzaW1wbHkgcG9wdWxhdGVzIHRoZSBwcmVmZXJlbmNlcworICogd2hlbiBjcmVhdGVkLiAgTm90ZSB0aGF0IHRoZSBwcmVmZXJlbmNlcyBmcmFtZXdvcmsgdGFrZXMgY2FyZSBvZiBsb2FkaW5nCisgKiB0aGUgY3VycmVudCB2YWx1ZXMgb3V0IG9mIHRoZSBhcHAgcHJlZmVyZW5jZXMgYW5kIHdyaXRpbmcgdGhlbSB3aGVuIGNoYW5nZWQ6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQorICogICAgICBmcmFnbWVudH0KKyAqCisgKiBAc2VlIFByZWZlcmVuY2UKKyAqIEBzZWUgUHJlZmVyZW5jZVNjcmVlbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgaW1wbGVtZW50cworICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5PblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRVNfVEFHID0gImFuZHJvaWQ6cHJlZmVyZW5jZXMiOworCisgICAgcHJpdmF0ZSBQcmVmZXJlbmNlTWFuYWdlciBtUHJlZmVyZW5jZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVQcmVmczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXREb25lOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0aW5nIHJlcXVlc3QgY29kZSBnaXZlbiBvdXQgdG8gcHJlZmVyZW5jZSBmcmFtZXdvcmsuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1JFUVVFU1RfQ09ERSA9IDEwMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQklORF9QUkVGRVJFTkNFUyA9IDE7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19CSU5EX1BSRUZFUkVOQ0VTOgorICAgICAgICAgICAgICAgICAgICBiaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgZmluYWwgcHJpdmF0ZSBSdW5uYWJsZSBtUmVxdWVzdEZvY3VzID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtTGlzdC5mb2N1c2FibGVWaWV3QXZhaWxhYmxlKG1MaXN0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBQcmVmZXJlbmNlRnJhZ21lbnQncyBjb250YWluaW5nIGFjdGl2aXR5IHNob3VsZAorICAgICAqIGltcGxlbWVudCB0byBiZSBhYmxlIHRvIHByb2Nlc3MgcHJlZmVyZW5jZSBpdGVtcyB0aGF0IHdpc2ggdG8KKyAgICAgKiBzd2l0Y2ggdG8gYSBuZXcgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYSBQcmVmZXJlbmNlIHRoYXQgaGFzCisgICAgICAgICAqIGEgZnJhZ21lbnQgY2xhc3MgbmFtZSBhc3NvY2lhdGVkIHdpdGggaXQuICBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogdG8gc2hvdWxkIGluc3RhbnRpYXRlIGFuZCBzd2l0Y2ggdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuCisgICAgICAgICAqIGZyYWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBvblByZWZlcmVuY2VTdGFydEZyYWdtZW50KFByZWZlcmVuY2VGcmFnbWVudCBjYWxsZXIsIFByZWZlcmVuY2UgcHJlZik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoZ2V0QWN0aXZpdHkoKSwgRklSU1RfUkVRVUVTVF9DT0RFKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldE9uUHJlZmVyZW5jZVRyZWVDbGlja0xpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV9saXN0X2NvbnRlbnQsCisgICAgICAgICAgICAgICAgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRMaXN0VmlldygpLnNldFNjcm9sbEJhclN0eWxlKFZpZXcuU0NST0xMQkFSU19JTlNJREVfT1ZFUkxBWSk7CisKKyAgICAgICAgaWYgKG1IYXZlUHJlZnMpIHsKKyAgICAgICAgICAgIGJpbmRQcmVmZXJlbmNlcygpOworICAgICAgICB9CisKKyAgICAgICAgbUluaXREb25lID0gdHJ1ZTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb250YWluZXIgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0QnVuZGxlKFBSRUZFUkVOQ0VTX1RBRyk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VTY3JlZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmVmZXJlbmNlU2NyZWVuLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5U3RvcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveVZpZXcoKSB7CisgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SZXF1ZXN0Rm9jdXMpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlEZXN0cm95KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TYXZlSW5zdGFuY2VTdGF0ZShCdW5kbGUgb3V0U3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZVNjcmVlbiBwcmVmZXJlbmNlU2NyZWVuID0gZ2V0UHJlZmVyZW5jZVNjcmVlbigpOworICAgICAgICBpZiAocHJlZmVyZW5jZVNjcmVlbiAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgY29udGFpbmVyID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgcHJlZmVyZW5jZVNjcmVlbi5zYXZlSGllcmFyY2h5U3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZShQUkVGRVJFTkNFU19UQUcsIGNvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOworCisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5UmVzdWx0KHJlcXVlc3RDb2RlLCByZXN1bHRDb2RlLCBkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9IHVzZWQgYnkgdGhpcyBmcmFnbWVudC4KKyAgICAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgUHJlZmVyZW5jZU1hbmFnZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBQcmVmZXJlbmNlTWFuYWdlciBnZXRQcmVmZXJlbmNlTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJlbmNlTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByb290IG9mIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0aGF0IHRoaXMgZnJhZ21lbnQgaXMgc2hvd2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmZXJlbmNlU2NyZWVuIFRoZSByb290IHtAbGluayBQcmVmZXJlbmNlU2NyZWVufSBvZiB0aGUgcHJlZmVyZW5jZSBoaWVyYXJjaHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVNjcmVlbihQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4pIHsKKyAgICAgICAgaWYgKG1QcmVmZXJlbmNlTWFuYWdlci5zZXRQcmVmZXJlbmNlcyhwcmVmZXJlbmNlU2NyZWVuKSAmJiBwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1IYXZlUHJlZnMgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1Jbml0RG9uZSkgeworICAgICAgICAgICAgICAgIHBvc3RCaW5kUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UgaGllcmFyY2h5IHRoYXQgdGhpcyBmcmFnbWVudCBpcyBzaG93aW5nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59IHRoYXQgaXMgdGhlIHJvb3Qgb2YgdGhlIHByZWZlcmVuY2UKKyAgICAgKiAgICAgICAgIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZmVyZW5jZVNjcmVlbiBnZXRQcmVmZXJlbmNlU2NyZWVuKCkgeworICAgICAgICByZXR1cm4gbVByZWZlcmVuY2VNYW5hZ2VyLmdldFByZWZlcmVuY2VTY3JlZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHByZWZlcmVuY2VzIGZyb20gYWN0aXZpdGllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiB7QGxpbmsgSW50ZW50fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIHtAbGluayBJbnRlbnR9IHRvIHF1ZXJ5IGFjdGl2aXRpZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZmVyZW5jZXNGcm9tSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCk7CisKKyAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihtUHJlZmVyZW5jZU1hbmFnZXIuaW5mbGF0ZUZyb21JbnRlbnQoaW50ZW50LCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlcyB0aGUgZ2l2ZW4gWE1MIHJlc291cmNlIGFuZCBhZGRzIHRoZSBwcmVmZXJlbmNlIGhpZXJhcmNoeSB0byB0aGUgY3VycmVudAorICAgICAqIHByZWZlcmVuY2UgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZlcmVuY2VzUmVzSWQgVGhlIFhNTCByZXNvdXJjZSBJRCB0byBpbmZsYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKGludCBwcmVmZXJlbmNlc1Jlc0lkKSB7CisgICAgICAgIHJlcXVpcmVQcmVmZXJlbmNlTWFuYWdlcigpOworCisgICAgICAgIHNldFByZWZlcmVuY2VTY3JlZW4obVByZWZlcmVuY2VNYW5hZ2VyLmluZmxhdGVGcm9tUmVzb3VyY2UoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc1Jlc0lkLCBnZXRQcmVmZXJlbmNlU2NyZWVuKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVmZXJlbmNlVHJlZUNsaWNrKFByZWZlcmVuY2VTY3JlZW4gcHJlZmVyZW5jZVNjcmVlbiwKKyAgICAgICAgICAgIFByZWZlcmVuY2UgcHJlZmVyZW5jZSkgeworICAgICAgICBpZiAocHJlZmVyZW5jZS5nZXRGcmFnbWVudCgpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICBnZXRBY3Rpdml0eSgpIGluc3RhbmNlb2YgT25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gKChPblByZWZlcmVuY2VTdGFydEZyYWdtZW50Q2FsbGJhY2spZ2V0QWN0aXZpdHkoKSkub25QcmVmZXJlbmNlU3RhcnRGcmFnbWVudCgKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgcHJlZmVyZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEge0BsaW5rIFByZWZlcmVuY2V9IGJhc2VkIG9uIGl0cyBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIHByZWZlcmVuY2UgdG8gcmV0cmlldmUuCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIFByZWZlcmVuY2V9IHdpdGggdGhlIGtleSwgb3IgbnVsbC4KKyAgICAgKiBAc2VlIFByZWZlcmVuY2VHcm91cCNmaW5kUHJlZmVyZW5jZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIFByZWZlcmVuY2UgZmluZFByZWZlcmVuY2UoQ2hhclNlcXVlbmNlIGtleSkgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtUHJlZmVyZW5jZU1hbmFnZXIuZmluZFByZWZlcmVuY2Uoa2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWlyZVByZWZlcmVuY2VNYW5hZ2VyKCkgeworICAgICAgICBpZiAobVByZWZlcmVuY2VNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc3VwZXIub25DcmVhdGUuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdEJpbmRQcmVmZXJlbmNlcygpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyLmhhc01lc3NhZ2VzKE1TR19CSU5EX1BSRUZFUkVOQ0VTKSkgcmV0dXJuOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19CSU5EX1BSRUZFUkVOQ0VTKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmluZFByZWZlcmVuY2VzKCkgeworICAgICAgICBmaW5hbCBQcmVmZXJlbmNlU2NyZWVuIHByZWZlcmVuY2VTY3JlZW4gPSBnZXRQcmVmZXJlbmNlU2NyZWVuKCk7CisgICAgICAgIGlmIChwcmVmZXJlbmNlU2NyZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByZWZlcmVuY2VTY3JlZW4uYmluZChnZXRMaXN0VmlldygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBMaXN0VmlldyBnZXRMaXN0VmlldygpIHsKKyAgICAgICAgZW5zdXJlTGlzdCgpOworICAgICAgICByZXR1cm4gbUxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUxpc3QoKSB7CisgICAgICAgIGlmIChtTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlldyByb290ID0gZ2V0VmlldygpOworICAgICAgICBpZiAocm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250ZW50IHZpZXcgbm90IHlldCBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgVmlldyByYXdMaXN0VmlldyA9IHJvb3QuZmluZFZpZXdCeUlkKGFuZHJvaWQuUi5pZC5saXN0KTsKKyAgICAgICAgaWYgKCEocmF3TGlzdFZpZXcgaW5zdGFuY2VvZiBMaXN0VmlldykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBoYXMgdmlldyB3aXRoIGlkIGF0dHJpYnV0ZSAnYW5kcm9pZC5SLmlkLmxpc3QnICIKKyAgICAgICAgICAgICAgICAgICAgKyAidGhhdCBpcyBub3QgYSBMaXN0VmlldyBjbGFzcyIpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ID0gKExpc3RWaWV3KXJhd0xpc3RWaWV3OworICAgICAgICBpZiAobUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVJlcXVlc3RGb2N1cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUluZmxhdGVyLmphdmEKaW5kZXggNzc5ZTc0Ni4uYzIxYWExOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlSW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VJbmZsYXRlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlsczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMzksNiArNDEsNyBAQAogY2xhc3MgUHJlZmVyZW5jZUluZmxhdGVyIGV4dGVuZHMgR2VuZXJpY0luZmxhdGVyPFByZWZlcmVuY2UsIFByZWZlcmVuY2VHcm91cD4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUHJlZmVyZW5jZUluZmxhdGVyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URU5UX1RBR19OQU1FID0gImludGVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RBR19OQU1FID0gImV4dHJhIjsKIAogICAgIHByaXZhdGUgUHJlZmVyZW5jZU1hbmFnZXIgbVByZWZlcmVuY2VNYW5hZ2VyOwogICAgIApAQCAtNzMsOCArNzYsMTAgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaW50ZW50ID0gSW50ZW50LnBhcnNlSW50ZW50KGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKSwgcGFyc2VyLCBhdHRycyk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ291bGQgbm90IHBhcnNlIEludGVudC4iKTsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsIGUpOworICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXggPSBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIHByZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewpAQCAtODIsNiArODcsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodGFnLmVxdWFscyhFWFRSQV9UQUdfTkFNRSkpIHsKKyAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5wYXJzZUJ1bmRsZUV4dHJhKEVYVFJBX1RBR19OQU1FLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50UHJlZmVyZW5jZS5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBleCA9IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgcHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVNjcmVlbi5qYXZhCmluZGV4IDk1ZTU0MzI0Li5jN2Y4YWIyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VTY3JlZW4uamF2YQpAQCAtOTEsNyArOTEsOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBhZGFwdGVyIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEge0BsaW5rIFByZWZlcmVuY2VBY3Rpdml0eX0KLSAgICAgKiB0byBzaG93IHRoZSBwcmVmZXJlbmNlcyBjb250YWluZWQgaW4gdGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCisgICAgICogb3Ige0BsaW5rIFByZWZlcmVuY2VGcmFnbWVudH0gdG8gc2hvdyB0aGUgcHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoaXMKKyAgICAgKiB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0uCiAgICAgICogPHA+CiAgICAgICogVGhpcyB7QGxpbmsgUHJlZmVyZW5jZVNjcmVlbn0gd2lsbCBOT1QgYXBwZWFyIGluIHRoZSByZXR1cm5lZCBhZGFwdGVyLCBpbnN0ZWFkCiAgICAgICogaXQgYXBwZWFycyBpbiB0aGUgaGllcmFyY2h5IGFib3ZlIHRoaXMge0BsaW5rIFByZWZlcmVuY2VTY3JlZW59LgpAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DbGljaygpIHsKLSAgICAgICAgaWYgKGdldEludGVudCgpICE9IG51bGwgfHwgZ2V0UHJlZmVyZW5jZUNvdW50KCkgPT0gMCkgeworICAgICAgICBpZiAoZ2V0SW50ZW50KCkgIT0gbnVsbCB8fCBnZXRGcmFnbWVudCgpICE9IG51bGwgfHwgZ2V0UHJlZmVyZW5jZUNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCmluZGV4IDJmYmExZDc5Li5jYjZlMThmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3Nlci5qYXZhCkBAIC0xNywyMiArMTcsMzAgQEAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyQ29udHJhY3QuQm9va21hcmtzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQnJvd3NlckNvbnRyYWN0Lkhpc3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyQ29udHJhY3QuU2VhcmNoZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJJY29uRGF0YWJhc2U7CiAKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQogcHVibGljIGNsYXNzIEJyb3dzZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dUQUcgPSAiYnJvd3NlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQk9PS01BUktTX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvYm9va21hcmtzIik7CisKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIGNvbnRhaW5pbmcgYm90aCBib29rbWFya3MgYW5kIGhpc3RvcnkgaXRlbXMuIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhcmUgZGVmaW5lZCBpbgorICAgICAqIHtAbGluayBCb29rbWFya0NvbHVtbnN9LiBSZWFkaW5nIHRoaXMgdGFibGUgcmVxdWlyZXMgdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uIGFuZCB3cml0aW5nIHRvIGl0CisgICAgICogcmVxdWlyZXMgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9IHBlcm1pc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQk9PS01BUktTX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvYm9va21hcmtzIik7CiAKICAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiBleHRyYSBkYXRhIHdoZW4gc3RhcnRpbmcgQnJvd3NlciB3aXRoIEFDVElPTl9WSUVXIG9yCkBAIC00OSwxMiArNTcsMTEgQEAKICAgICAgKiBhcHBsaWNhdGlvbi4KICAgICAgKiA8cD4KICAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgaWRlbnRpZmljYXRpb24gc3RyaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvCi0gICAgICogaW5kZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBUaGUgQnJvd3NlciB3aWxsIGF0dGVtcHQgdG8gcmV1c2UgdGhlCisgICAgICogaWRlbnRpZnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIFRoZSBCcm93c2VyIHdpbGwgYXR0ZW1wdCB0byByZXVzZSB0aGUKICAgICAgKiBzYW1lIHdpbmRvdyBlYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIGxhdW5jaGVzIHRoZSBCcm93c2VyIHdpdGggdGhlIHNhbWUKICAgICAgKiBpZGVudGlmaWVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FQUExJQ0FUSU9OX0lEID0KLSAgICAgICAgImNvbS5hbmRyb2lkLmJyb3dzZXIuYXBwbGljYXRpb25faWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0FQUExJQ0FUSU9OX0lEID0gImNvbS5hbmRyb2lkLmJyb3dzZXIuYXBwbGljYXRpb25faWQiOwogCiAgICAgLyoqCiAgICAgICogVGhlIG5hbWUgb2YgdGhlIGV4dHJhIGRhdGEgaW4gdGhlIFZJRVcgaW50ZW50LiBUaGUgZGF0YSBhcmUga2V5L3ZhbHVlCkBAIC02OCwxMCArNzUsMTcgQEAKICAgICAvKiBpZiB5b3UgY2hhbmdlIGNvbHVtbiBvcmRlciB5b3UgbXVzdCBhbHNvIGNoYW5nZSBpbmRpY2VzCiAgICAgICAgYmVsb3cgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhJU1RPUllfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5fSUQsIEJvb2ttYXJrQ29sdW1ucy5VUkwsIEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5EQVRFLCBCb29rbWFya0NvbHVtbnMuQk9PS01BUkssIEJvb2ttYXJrQ29sdW1ucy5USVRMRSwKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLkZBVklDT04sIEJvb2ttYXJrQ29sdW1ucy5USFVNQk5BSUwsCi0gICAgICAgIEJvb2ttYXJrQ29sdW1ucy5UT1VDSF9JQ09OLCBCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVEIH07CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVVJMLCAvLyAxCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVklTSVRTLCAvLyAyCisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSwgLy8gMworICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkJPT0tNQVJLLCAvLyA0CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVElUTEUsIC8vIDUKKyAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5GQVZJQ09OLCAvLyA2CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVEhVTUJOQUlMLCAvLyA3CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuVE9VQ0hfSUNPTiwgLy8gOAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlVTRVJfRU5URVJFRCwgLy8gOQorICAgIH07CiAKICAgICAvKiB0aGVzZSBpbmRpY2VzIGRlcGVuZGVudCBvbiBISVNUT1JZX1BST0pFQ1RJT04gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVggPSAwOwpAQCAtOTIsMTkgKzEwNiwzMyBAQAogCiAgICAgLyogY29sdW1ucyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdHJ1bmNhdGUgaGlzdG9yeSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVFJVTkNBVEVfSElTVE9SWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQm9va21hcmtDb2x1bW5zLl9JRCwgQm9va21hcmtDb2x1bW5zLkRBVEUsIH07CisgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuX0lELAorICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLkRBVEUsCisgICAgfTsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSVU5DQVRFX0hJU1RPUllfUFJPSkVDVElPTl9JRF9JTkRFWCA9IDA7CiAKICAgICAvKiB0cnVuY2F0ZSB0aGlzIG1hbnkgaGlzdG9yeSBpdGVtcyBhdCBhIHRpbWUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUlVOQ0FURV9OX09MREVTVCA9IDU7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBTRUFSQ0hFU19VUkkgPQotICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly9icm93c2VyL3NlYXJjaGVzIik7CisgICAgLyoqCisgICAgICogQSB0YWJsZSBjb250YWluaW5nIGEgbG9nIG9mIGJyb3dzZXIgc2VhcmNoZXMuIFRoZSBjb2x1bW5zIG9mIHRoZSB0YWJsZSBhcmUgZGVmaW5lZCBpbgorICAgICAqIHtAbGluayBTZWFyY2hDb2x1bW5zfS4gUmVhZGluZyB0aGlzIHRhYmxlIHJlcXVpcmVzIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jUkVBRF9ISVNUT1JZX0JPT0tNQVJLU30gcGVybWlzc2lvbiBhbmQgd3JpdGluZyB0byBpdAorICAgICAqIHJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFNFQVJDSEVTX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovL2Jyb3dzZXIvc2VhcmNoZXMiKTsKIAotICAgIC8qIGlmIHlvdSBjaGFuZ2UgY29sdW1uIG9yZGVyIHlvdSBtdXN0IGFsc28gY2hhbmdlIGluZGljZXMKLSAgICAgICBiZWxvdyAqLworICAgIC8qKgorICAgICAqIEEgcHJvamVjdGlvbiBvZiB7QGxpbmsgI1NFQVJDSEVTX1VSSX0gdGhhdCBjb250YWlucyB7QGxpbmsgU2VhcmNoQ29sdW1ucyNfSUR9LAorICAgICAqIHtAbGluayBTZWFyY2hDb2x1bW5zI1NFQVJDSH0sIGFuZCB7QGxpbmsgU2VhcmNoQ29sdW1ucyNEQVRFfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNFQVJDSEVTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICBTZWFyY2hDb2x1bW5zLl9JRCwgU2VhcmNoQ29sdW1ucy5TRUFSQ0gsIFNlYXJjaENvbHVtbnMuREFURSB9OworICAgICAgICAgICAgLy8gaWYgeW91IGNoYW5nZSBjb2x1bW4gb3JkZXIgeW91IG11c3QgYWxzbyBjaGFuZ2UgaW5kaWNlcyBiZWxvdworICAgICAgICAgICAgU2VhcmNoQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIFNlYXJjaENvbHVtbnMuU0VBUkNILCAvLyAxCisgICAgICAgICAgICBTZWFyY2hDb2x1bW5zLkRBVEUsIC8vIDIKKyAgICB9OwogCiAgICAgLyogdGhlc2UgaW5kaWNlcyBkZXBlbmRlbnQgb24gU0VBUkNIRVNfUFJPSkVDVElPTiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSEVTX1BST0pFQ1RJT05fU0VBUkNIX0lOREVYID0gMTsKQEAgLTEyMSw5ICsxNDksMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hJU1RPUllfQ09VTlQgPSAyNTA7CiAKICAgICAvKioKLSAgICAgKiAgT3BlbiB0aGUgQWRkQm9va21hcmsgYWN0aXZpdHkgdG8gc2F2ZSBhIGJvb2ttYXJrLiAgTGF1bmNoIHdpdGgKLSAgICAgKiAgYW5kL29yIHVybCwgd2hpY2ggY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgc2F2aW5nLgotICAgICAqICBAcGFyYW0gYyAgICAgICAgQ29udGV4dCB1c2VkIHRvIGxhdW5jaCB0aGUgQWRkQm9va21hcmsgYWN0aXZpdHkuCisgICAgICogIE9wZW4gYW4gYWN0aXZpdHkgdG8gc2F2ZSBhIGJvb2ttYXJrLiBMYXVuY2ggd2l0aCBhIHRpdGxlCisgICAgICogIGFuZC9vciBhIHVybCwgYm90aCBvZiB3aGljaCBjYW4gYmUgZWRpdGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBzYXZpbmcuCisgICAgICoKKyAgICAgKiAgQHBhcmFtIGMgICAgICAgIENvbnRleHQgdXNlZCB0byBsYXVuY2ggdGhlIGFjdGl2aXR5IHRvIGFkZCBhIGJvb2ttYXJrLgogICAgICAqICBAcGFyYW0gdGl0bGUgICAgVGl0bGUgZm9yIHRoZSBib29rbWFyay4gQ2FuIGJlIG51bGwgb3IgZW1wdHkgc3RyaW5nLgogICAgICAqICBAcGFyYW0gdXJsICAgICAgVXJsIGZvciB0aGUgYm9va21hcmsuIENhbiBiZSBudWxsIG9yIGVtcHR5IHN0cmluZy4KICAgICAgKi8KQEAgLTE1Miw4ICsxODEsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFWFRSQV9TSEFSRV9GQVZJQ09OID0gInNoYXJlX2Zhdmljb24iOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNlbmRTdHJpbmcoQ29udGV4dCBjLCBTdHJpbmcgcykgewotICAgICAgICBzZW5kU3RyaW5nKGMsIHMsIGMuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbmRUZXh0KSk7CisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIGdpdmVuIHN0cmluZyB1c2luZyBhbiBJbnRlbnQgd2l0aCB7QGxpbmsgSW50ZW50I0FDVElPTl9TRU5EfSBhbmQgYSBtaW1lIHR5cGUKKyAgICAgKiBvZiB0ZXh0L3BsYWluLiBUaGUgc3RyaW5nIGlzIHB1dCBpbnRvIHtAbGluayBJbnRlbnQjRVhUUkFfVEVYVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB1c2VkIHRvIHN0YXJ0IHRoZSBhY3Rpdml0eQorICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHN0cmluZyB0byBzZW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNlbmRTdHJpbmcoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHNlbmRTdHJpbmcoY29udGV4dCwgc3RyaW5nLCBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZW5kVGV4dCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc0LDQ4ICsyMTAsNDkgQEAKICAgICAgICAgc2VuZC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfVEVYVCwgc3RyaW5nVG9TZW5kKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgYy5zdGFydEFjdGl2aXR5KEludGVudC5jcmVhdGVDaG9vc2VyKHNlbmQsIGNob29zZXJEaWFsb2dUaXRsZSkpOworICAgICAgICAgICAgSW50ZW50IGkgPSBJbnRlbnQuY3JlYXRlQ2hvb3NlcihzZW5kLCBjaG9vc2VyRGlhbG9nVGl0bGUpOworICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBmcm9tIG91dHNpZGUgYW4gQWN0aXZpdHkKKyAgICAgICAgICAgIGkuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgYy5zdGFydEFjdGl2aXR5KGkpOwogICAgICAgICB9IGNhdGNoKGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBpZiBubyBhcHAgaGFuZGxlcyBpdCwgZG8gbm90aGluZwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHRoZSBib29rbWFya3MuCisgICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHRoZSBib29rbWFya3MuIFRoZSBjdXJzb3Igd2lsbCBoYXZlIGEgc2luZ2xlCisgICAgICogIGNvbHVtbiwge0BsaW5rIEJvb2ttYXJrQ29sdW1ucyNVUkx9LgorICAgICAqICA8cD4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqCiAgICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldEFsbEJvb2ttYXJrcyhDb250ZW50UmVzb2x2ZXIgY3IpIHRocm93cyAKICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrQ29sdW1ucy5VUkwgfSwgCi0gICAgICAgICAgICAgICAgImJvb2ttYXJrID0gMSIsIG51bGwsIG51bGwpOworICAgICAgICByZXR1cm4gY3IucXVlcnkoQm9va21hcmtzLkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrcy5VUkwgfSwgCisgICAgICAgICAgICAgICAgQm9va21hcmtzLklTX0ZPTERFUiArICIgPSAwIiwgbnVsbCwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIFJldHVybiBhIGN1cnNvciBwb2ludGluZyB0byBhIGxpc3Qgb2YgYWxsIHZpc2l0ZWQgc2l0ZSB1cmxzLgorICAgICAqICBSZXR1cm4gYSBjdXJzb3IgcG9pbnRpbmcgdG8gYSBsaXN0IG9mIGFsbCB2aXNpdGVkIHNpdGUgdXJscy4gVGhlIGN1cnNvciB3aWxsCisgICAgICogIGhhdmUgYSBzaW5nbGUgY29sdW1uLCB7QGxpbmsgQm9va21hcmtDb2x1bW5zI1VSTH0uCisgICAgICogIDxwPgogICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiAgQHBhcmFtIGNyICAgVGhlIENvbnRlbnRSZXNvbHZlciB1c2VkIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0QWxsVmlzaXRlZFVybHMoQ29udGVudFJlc29sdmVyIGNyKSB0aHJvd3MKICAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjci5xdWVyeShCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEJvb2ttYXJrQ29sdW1ucy5VUkwgfSwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIHJldHVybiBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuVVJMIH0sIG51bGwsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgYWRkT3JVcmxFcXVhbHMoU3RyaW5nQnVpbGRlciBzYikgewogICAgICAgICBzYi5hcHBlbmQoIiBPUiAiICsgQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAgUmV0dXJuIGEgQ3Vyc29yIHdpdGggYWxsIGhpc3RvcnkvYm9va21hcmtzIHRoYXQgYXJlIHNpbWlsYXIgdG8gdXJsLAotICAgICAqICB3aGVyZSBzaW1pbGFyIG1lYW5zICdodHRwKHMpOi8vJyBhbmQgJ3d3dy4nIGFyZSBvcHRpb25hbCwgYnV0IHRoZSByZXN0Ci0gICAgICogIG9mIHRoZSB1cmwgaXMgdGhlIHNhbWUuCi0gICAgICogIEBwYXJhbSBjciAgIFRoZSBDb250ZW50UmVzb2x2ZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlLgotICAgICAqICBAcGFyYW0gdXJsICBUaGUgdXJsIHRvIGNvbXBhcmUgdG8uCi0gICAgICogIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgZ2V0VmlzaXRlZExpa2UoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgdXJsKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3Vyc29yIGdldFZpc2l0ZWRMaWtlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHVybCkgewogICAgICAgICBib29sZWFuIHNlY3VyZSA9IGZhbHNlOwogICAgICAgICBTdHJpbmcgY29tcGFyZVN0cmluZyA9IHVybDsKICAgICAgICAgaWYgKGNvbXBhcmVTdHJpbmcuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7CkBAIC0yMjksMTQgKzI2NiwxNCBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgd2hlcmVDbGF1c2UgPSBudWxsOwogICAgICAgICBpZiAoc2VjdXJlKSB7Ci0gICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrQ29sdW1ucy5VUkwgKyAiID0gIik7CisgICAgICAgICAgICB3aGVyZUNsYXVzZSA9IG5ldyBTdHJpbmdCdWlsZGVyKEJvb2ttYXJrcy5VUkwgKyAiID0gIik7CiAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmFwcGVuZEVzY2FwZWRTUUxTdHJpbmcod2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICJodHRwczovLyIgKyBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgICAgIGFkZE9yVXJsRXF1YWxzKHdoZXJlQ2xhdXNlKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHBzOi8vd3d3LiIgKyBjb21wYXJlU3RyaW5nKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKKyAgICAgICAgICAgIHdoZXJlQ2xhdXNlID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtzLlVSTCArICIgPSAiKTsKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmluZyk7CiAgICAgICAgICAgICBhZGRPclVybEVxdWFscyh3aGVyZUNsYXVzZSk7CkBAIC0yNTAsNyArMjg3LDcgQEAKICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyh3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8iICsgd3d3U3RyaW5nKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY3IucXVlcnkoQk9PS01BUktTX1VSSSwgSElTVE9SWV9QUk9KRUNUSU9OLAorICAgICAgICByZXR1cm4gY3IucXVlcnkoSGlzdG9yeS5DT05URU5UX1VSSSwgbmV3IFN0cmluZ1tdIHsgSGlzdG9yeS5fSUQsIEhpc3RvcnkuVklTSVRTIH0sCiAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UudG9TdHJpbmcoKSwgbnVsbCwgbnVsbCk7CiAgICAgfQogCkBAIC0yNjYsMjYgKzMwMywyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB1cGRhdGVWaXNpdGVkSGlzdG9yeShDb250ZW50UmVzb2x2ZXIgY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwsIGJvb2xlYW4gcmVhbCkgewotICAgICAgICBsb25nIG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBDdXJzb3IgYyA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjID0gZ2V0VmlzaXRlZExpa2UoY3IsIHVybCk7CiAgICAgICAgICAgICAvKiBXZSBzaG91bGQgb25seSBnZXQgb25lIGFuc3dlciB0aGF0IGlzIGV4YWN0bHkgdGhlIHNhbWUuICovCiAgICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICBpZiAocmVhbCkgewotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50KEhJU1RPUllfUFJPSkVDVElPTl9WSVNJVFNfSU5ERVgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5WSVNJVFMsIGMuZ2V0SW50KDEpICsgMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlVTRVJfRU5URVJFRCwgMSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIG5vdyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXQotICAgICAgICAgICAgICAgICAgICAgICAgeyBJbnRlZ2VyLnZhbHVlT2YoYy5nZXRJbnQoMCkpLnRvU3RyaW5nKCkgfTsKLSAgICAgICAgICAgICAgICBjci51cGRhdGUoQk9PS01BUktTX1VSSSwgbWFwLCAiX2lkID0gPyIsIHByb2plY3Rpb24pOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCwgbm93KTsKKyAgICAgICAgICAgICAgICBjci51cGRhdGUoQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoSGlzdG9yeS5DT05URU5UX1VSSSwgYy5nZXRMb25nKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRydW5jYXRlSGlzdG9yeShjcik7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICBpbnQgdmlzaXRzOwogICAgICAgICAgICAgICAgIGludCB1c2VyX2VudGVyZWQ7CiAgICAgICAgICAgICAgICAgaWYgKHJlYWwpIHsKQEAgLTI5NSwxNCArMzMwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHZpc2l0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHVzZXJfZW50ZXJlZCA9IDE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlVSTCwgdXJsKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5WSVNJVFMsIHZpc2l0cyk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuREFURSwgbm93KTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywgMCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVElUTEUsIHVybCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuQ1JFQVRFRCwgMCk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChCb29rbWFya0NvbHVtbnMuVVNFUl9FTlRFUkVELCB1c2VyX2VudGVyZWQpOwotICAgICAgICAgICAgICAgIGNyLmluc2VydChCT09LTUFSS1NfVVJJLCBtYXApOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VUkwsIHVybCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlZJU0lUUywgdmlzaXRzKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KEhpc3RvcnkuREFURV9MQVNUX1ZJU0lURUQsIG5vdyk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChIaXN0b3J5LlRJVExFLCB1cmwpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5EQVRFX0NSRUFURUQsIDApOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoSGlzdG9yeS5VU0VSX0VOVEVSRUQsIHVzZXJfZW50ZXJlZCk7CisgICAgICAgICAgICAgICAgY3IuaW5zZXJ0KEhpc3RvcnkuQ09OVEVOVF9VUkksIHZhbHVlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cGRhdGVWaXNpdGVkSGlzdG9yeSIsIGUpOwpAQCAtMzIyLDEwICszNTYsMTAgQEAKICAgICAgICAgU3RyaW5nW10gc3RyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICJ1cmwiCisgICAgICAgICAgICAgICAgICAgIEhpc3RvcnkuVVJMLAogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGMgPSBjci5xdWVyeShCT09LTUFSS1NfVVJJLCBwcm9qZWN0aW9uLCAidmlzaXRzID4gMCIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIEhpc3RvcnkuVklTSVRTICsgIiA+IDAiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwogICAgICAgICAgICAgc3RyID0gbmV3IFN0cmluZ1tjLmdldENvdW50KCldOwogICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CkBAIC0zNTMsMzEgKzM4NywyOSBAQAogICAgICAqIEBwYXJhbSBjciBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdHJ1bmNhdGVIaXN0b3J5KENvbnRlbnRSZXNvbHZlciBjcikgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIC8vIFRPRE8gbWFrZSBhIHNpbmdsZSByZXF1ZXN0IHRvIHRoZSBwcm92aWRlciB0byBkbyB0aGlzIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uCisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBudWxsOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBTZWxlY3Qgbm9uLWJvb2ttYXJrIGhpc3RvcnksIG9yZGVyZWQgYnkgZGF0ZQotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBCT09LTUFSS1NfVVJJLAotICAgICAgICAgICAgICAgICAgICBUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICJib29rbWFyayA9IDAiLAotICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICBCb29rbWFya0NvbHVtbnMuREFURSk7Ci0gICAgICAgICAgICAvLyBMb2cudihMT0dUQUcsICJoaXN0b3J5IGNvdW50ICIgKyBjLmNvdW50KCkpOwotICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSAmJiBjLmdldENvdW50KCkgPj0gTUFYX0hJU1RPUllfQ09VTlQpIHsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuX0lELCBIaXN0b3J5LlVSTCwgSGlzdG9yeS5EQVRFX0xBU1RfVklTSVRFRCB9LAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBIaXN0b3J5LkRBVEVfTEFTVF9WSVNJVEVEICsgIiBBU0MiKTsKKworICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9GaXJzdCgpICYmIGN1cnNvci5nZXRDb3VudCgpID49IE1BWF9ISVNUT1JZX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgZmluYWwgV2ViSWNvbkRhdGFiYXNlIGljb25EYiA9IFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgIC8qIGVsaW1pbmF0ZSBvbGRlc3QgaGlzdG9yeSBpdGVtcyAqLwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVFJVTkNBVEVfTl9PTERFU1Q7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBMb2cudihMT0dUQUcsICJ0cnVuY2F0ZSBoaXN0b3J5ICIgKwotICAgICAgICAgICAgICAgICAgICAvLyBjLmdldEludChUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVgpKTsKLSAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKEJPT0tNQVJLU19VUkksICJfaWQgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldEludChUUlVOQ0FURV9ISVNUT1JZX1BST0pFQ1RJT05fSURfSU5ERVgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWMubW92ZVRvTmV4dCgpKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY3IuZGVsZXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKEhpc3RvcnkuQ09OVEVOVF9VUkksIGN1cnNvci5nZXRMb25nKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRiLnJlbGVhc2VJY29uRm9yUGFnZVVybChjdXJzb3IuZ2V0U3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IubW92ZVRvTmV4dCgpKSBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ0cnVuY2F0ZUhpc3RvcnkiLCBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4OCwyMyArNDIwLDE3IEBACiAgICAgICogQHJldHVybiBib29sZWFuICBUcnVlIGlmIHRoZSBoaXN0b3J5IGNhbiBiZSBjbGVhcmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjYW5DbGVhckhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoCi0gICAgICAgICAgICAgICAgQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgQm9va21hcmtDb2x1bW5zLl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2ttYXJrQ29sdW1ucy5CT09LTUFSSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9va21hcmtDb2x1bW5zLlZJU0lUUyB9LAotICAgICAgICAgICAgICAgICJib29rbWFyayA9IDAgT1IgdmlzaXRzID4gMCIsIAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbAotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICByZXQgPSBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgICAgICBjdXJzb3IgPSBjci5xdWVyeShIaXN0b3J5LkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcgW10geyBIaXN0b3J5Ll9JRCwgSGlzdG9yeS5WSVNJVFMgfSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHJldCA9IGN1cnNvci5nZXRDb3VudCgpID4gMDsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImNhbkNsZWFySGlzdG9yeSIsIGUpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTQyMCw2NyArNDQ2LDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgaGlzdG9yeSBpdGVtcyBhbmQgcmV2ZXJ0IGFsbAotICAgICAqIGJvb2ttYXJrcyB0byB6ZXJvIHZpc2l0cyB3aGljaCBtZWV0IHRoZSBjcml0ZXJpYSBwcm92aWRlZC4KLSAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQotICAgICAqICBSZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1dSSVRFX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIGhpc3RvcnkgaXRlbXMgYW5kIHJlbGVhc2UgdGhlIGljb25zIGZvciB0aGVtIGluIHRoZQorICAgICAqIHtAbGluayBXZWJJY29uRGF0YWJhc2V9LgorICAgICAqCisgICAgICogUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0hJU1RPUllfQk9PS01BUktTfQorICAgICAqIFJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jV1JJVEVfSElTVE9SWV9CT09LTUFSS1N9CisgICAgICoKICAgICAgKiBAcGFyYW0gY3IgICBUaGUgQ29udGVudFJlc29sdmVyIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZS4KICAgICAgKiBAcGFyYW0gd2hlcmVDbGF1c2UgICBTdHJpbmcgdG8gbGltaXQgdGhlIGl0ZW1zIGFmZmVjdGVkLgogICAgICAqICAgICAgICAgICAgICAgICAgICAgIG51bGwgbWVhbnMgYWxsIGl0ZW1zLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlSGlzdG9yeVdoZXJlKENvbnRlbnRSZXNvbHZlciBjciwKLSAgICAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSkgewotICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBkZWxldGVIaXN0b3J5V2hlcmUoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgd2hlcmVDbGF1c2UpIHsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjID0gY3IucXVlcnkoQk9PS01BUktTX1VSSSwKLSAgICAgICAgICAgICAgICBISVNUT1JZX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgIGN1cnNvciA9IGNyLnF1ZXJ5KEhpc3RvcnkuQ09OVEVOVF9VUkksIG5ldyBTdHJpbmdbXSB7IEhpc3RvcnkuVVJMIH0sIHdoZXJlQ2xhdXNlLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFdlYkljb25EYXRhYmFzZSBpY29uRGIgPSBXZWJJY29uRGF0YWJhc2UuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgZmF2aWNvbnMsIGFuZCByZXZlcnQgYm9va21hcmtzIHdoaWNoIGhhdmUgYmVlbiB2aXNpdGVkCi0gICAgICAgICAgICAgICAgICogdG8gc2ltcGx5IGJvb2ttYXJrcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IGMuZ2V0U3RyaW5nKEhJU1RPUllfUFJPSkVDVElPTl9VUkxfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQm9va21hcmsgPQotICAgICAgICAgICAgICAgICAgICAgICAgYy5nZXRJbnQoSElTVE9SWV9QUk9KRUNUSU9OX0JPT0tNQVJLX0lOREVYKSA9PSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNCb29rbWFyaykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBPUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiKCBfaWQgPSAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjLmdldEludCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiApIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpY29uRGIucmVsZWFzZUljb25Gb3JQYWdlVXJsKHVybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjLm1vdmVUb05leHQoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBmYXZpY29ucworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGRvbid0IHJlbGVhc2UgaWYgdGhlIFVSTCBpcyBib29rbWFya2VkCisgICAgICAgICAgICAgICAgICAgIGljb25EYi5yZWxlYXNlSWNvbkZvclBhZ2VVcmwoY3Vyc29yLmdldFN0cmluZygwKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0VGltZSkgewotICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLlZJU0lUUywgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoQm9va21hcmtDb2x1bW5zLkRBVEUsIDApOwotICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogU2hvdWxkIEkgYWxzbyByZW1vdmUgdGhlIHRpdGxlPyAqLwotICAgICAgICAgICAgICAgICAgICBjci51cGRhdGUoQk9PS01BUktTX1VSSSwgbWFwLCBzYi50b1N0cmluZygpLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVsZXRlV2hlcmVDbGF1c2UgPSBCb29rbWFya0NvbHVtbnMuQk9PS01BUksgKyAiID0gMCI7Ci0gICAgICAgICAgICAgICAgaWYgKHdoZXJlQ2xhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlV2hlcmVDbGF1c2UgKz0gIiBBTkQgIiArIHdoZXJlQ2xhdXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjci5kZWxldGUoQk9PS01BUktTX1VSSSwgZGVsZXRlV2hlcmVDbGF1c2UsIG51bGwpOworICAgICAgICAgICAgICAgIGNyLmRlbGV0ZShCT09LTUFSS1NfVVJJLCB3aGVyZUNsYXVzZSwgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJkZWxldGVIaXN0b3J5V2hlcmUiLCBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgY3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUyMCwxMCArNTE1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZGVsZXRlRnJvbUhpc3RvcnkoQ29udGVudFJlc29sdmVyIGNyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoQm9va21hcmtDb2x1bW5zLlVSTCArICIgPSAiKTsKLSAgICAgICAgRGF0YWJhc2VVdGlscy5hcHBlbmRFc2NhcGVkU1FMU3RyaW5nKHNiLCB1cmwpOwotICAgICAgICBTdHJpbmcgbWF0Y2hlc1VybCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIGRlbGV0ZUhpc3RvcnlXaGVyZShjciwgbWF0Y2hlc1VybCk7CisgICAgICAgIGNyLmRlbGV0ZShIaXN0b3J5LkNPTlRFTlRfVVJJLCBIaXN0b3J5LlVSTCArICI9PyIsIG5ldyBTdHJpbmdbXSB7IHVybCB9KTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzNCwzMCArNTI2LDEzIEBACiAgICAgICogQHBhcmFtIHNlYXJjaCAgICBUaGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgc2VhcmNoZXMgZGF0YWJhc2UuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFkZFNlYXJjaFVybChDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZyBzZWFyY2gpIHsKLSAgICAgICAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLSAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KAotICAgICAgICAgICAgICAgIFNFQVJDSEVTX1VSSSwKLSAgICAgICAgICAgICAgICBTRUFSQ0hFU19QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIFNFQVJDSEVTX1dIRVJFX0NMQVVTRSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgc2VhcmNoIH0sCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICBtYXAucHV0KFNlYXJjaENvbHVtbnMuU0VBUkNILCBzZWFyY2gpOwotICAgICAgICAgICAgbWFwLnB1dChTZWFyY2hDb2x1bW5zLkRBVEUsIG5vdyk7Ci0gICAgICAgICAgICAvKiBXZSBzaG91bGQgb25seSBnZXQgb25lIGFuc3dlciB0aGF0IGlzIGV4YWN0bHkgdGhlIHNhbWUuICovCi0gICAgICAgICAgICBpZiAoYy5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgY3IudXBkYXRlKFNFQVJDSEVTX1VSSSwgbWFwLCAiX2lkID0gIiArIGMuZ2V0SW50KDApLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3IuaW5zZXJ0KFNFQVJDSEVTX1VSSSwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR1RBRywgImFkZFNlYXJjaFVybCIsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwotICAgICAgICB9CisgICAgICAgIC8vIFRoZSBjb250ZW50IHByb3ZpZGVyIHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0aW5nIGV4aXN0aW5nIHNlYXJjaGVzIGluc3RlYWQgb2YgZHVwbGljYXRpbmcKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICB2YWx1ZXMucHV0KFNlYXJjaGVzLlNFQVJDSCwgc2VhcmNoKTsKKyAgICAgICAgdmFsdWVzLnB1dChTZWFyY2hlcy5EQVRFLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIGNyLmluc2VydChTZWFyY2hlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBSZW1vdmUgYWxsIHNlYXJjaGVzIGZyb20gdGhlIHNlYXJjaCBkYXRhYmFzZS4KICAgICAgKiAgUmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNXUklURV9ISVNUT1JZX0JPT0tNQVJLU30KQEAgLTU2Nyw3ICs1NDIsNyBAQAogICAgICAgICAvLyBGSVhNRTogU2hvdWxkIHRoaXMgY2xlYXIgdGhlIHVybHMgdG8gd2hpY2ggdGhlc2Ugc2VhcmNoZXMgbGVhZD8KICAgICAgICAgLy8gKGkuZS4gcmVtb3ZlIGdvb2dsZS5jb20vcXVlcnk9IGJsYWggYmxhaCBibGFoKQogICAgICAgICB0cnkgewotICAgICAgICAgICAgY3IuZGVsZXRlKFNFQVJDSEVTX1VSSSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBjci5kZWxldGUoU2VhcmNoZXMuQ09OVEVOVF9VUkksIG51bGwsIG51bGwpOwogICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiY2xlYXJTZWFyY2hlcyIsIGUpOwogICAgICAgICB9CkBAIC01ODYsMzUgKzU2MSw5MiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCByZXF1ZXN0QWxsSWNvbnMoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgd2hlcmUsCiAgICAgICAgICAgICBXZWJJY29uRGF0YWJhc2UuSWNvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmJ1bGtSZXF1ZXN0SWNvbkZvclBhZ2VVcmwoY3IsIHdoZXJlLCBsaXN0ZW5lcik7CisgICAgICAgIFdlYkljb25EYXRhYmFzZS5nZXRJbnN0YW5jZSgpLmJ1bGtSZXF1ZXN0SWNvbkZvclBhZ2VVcmwoY3IsIHdoZXJlLCBsaXN0ZW5lcik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgbWl4ZWQgYm9va21hcmsgYW5kIGhpc3RvcnkgaXRlbXMgYXZhaWxhYmxlCisgICAgICogYXQge0BsaW5rICNCT09LTUFSS1NfVVJJfS4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2ttYXJrQ29sdW1ucyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGJvb2ttYXJrIG9yIGhpc3RvcnkgaXRlbS4KKyAgICAgICAgICogPHA+VHlwZTogVEVYVCAoVVJMKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWUgdGhlIGl0ZW0gaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklTSVRTID0gInZpc2l0cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBpdGVtIHdhcyBsYXN0IHZpc2l0ZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IGFuIGl0ZW0gaXMgYSBib29rbWFyay4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyBhIGJvb2ttYXJrLCBhIHZhbHVlCisgICAgICAgICAqIG9mIDAgaW5kaWNhdGVzIGEgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLID0gImJvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgdmlzaWJsZSB0aXRsZSBvZiB0aGUgYm9va21hcmsgb3IgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKiA8cD5UeXBlOiBURVhUPC9wPgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEID0gImNyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmF2aWNvbiBvZiB0aGUgYm9va21hcmsuIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVZJQ09OID0gImZhdmljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJOQUlMID0gInRodW1ibmFpbCI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSF9JQ09OID0gInRvdWNoX2ljb24iOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FTlRFUkVEID0gInVzZXJfZW50ZXJlZCI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgc2VhcmNoIGhpc3RvcnkgdGFibGUsIGF2YWlsYWJsZSBhdCB7QGxpbmsgI1NFQVJDSEVTX1VSSX0uCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWFyY2hDb2x1bW5zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogQGRlcHJlY2F0ZWQgTm90IHVzZWQuCisgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVzZXIgZW50ZXJlZCBzZWFyY2ggdGVybS4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSCA9ICJzZWFyY2giOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgc2VhcmNoIHdhcyBwZXJmb3JtZWQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guCisgICAgICAgICAqIDxwPlR5cGU6IE5VTUJFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSAiZGF0ZSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ccm93c2VyQ29udHJhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGEyYTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQnJvd3NlckNvbnRyYWN0LmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyQ2xpZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBCcm93c2VyQ29udHJhY3QgeworICAgIC8qKiBUaGUgYXV0aG9yaXR5IGZvciB0aGUgYnJvd3NlciBwcm92aWRlciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5icm93c2VyIjsKKworICAgIC8qKiBBIGNvbnRlbnQ6Ly8gc3R5bGUgdXJpIHRvIHRoZSBhdXRob3JpdHkgZm9yIHRoZSBicm93c2VyIHByb3ZpZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQVVUSE9SSVRZX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkpOworCisgICAgLyoqCisgICAgICogQW4gb3B0aW9uYWwgaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIFVSSSBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgdGhlIGNhbGxlcgorICAgICAqIHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBhIHN5bmMgYWRhcHRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIElmIHRydWUKKyAgICAgKiB0aGUgZGlydHkgZmxhZyBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYW5kIHRoZSAic3luY1RvTmV0d29yayIgcGFyYW1ldGVyCisgICAgICogaXMgc2V0IHRvIGZhbHNlIHdoZW4gY2FsbGluZworICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIEdlbmVyaWMgY29sdW1ucyBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIFRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgb2YKKyAgICAgKiB0aGVzZSBjb2x1bW5zIGFyZSBwcml2YXRlIHRvIHRoZSBzeW5jIGFkYXB0ZXIuIE90aGVyIGNsaWVudHMgb2YgdGhlIEFQSQorICAgICAqIHNob3VsZCBub3QgYXR0ZW1wdCB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSB0aGVzZSBjb2x1bW5zLgorICAgICAqLworICAgIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBkZWZpbml0aW9ucyBmb3IgdXNlIGluIGltcGxlbWVudGluZyBjaHJvbWUgYm9va21hcmtzIHN5bmMgaW4gdGhlIEJvb2ttYXJrcyB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENocm9tZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgcHJpdmF0ZSBDaHJvbWVTeW5jQ29sdW1ucygpIHt9CisKKyAgICAgICAgLyoqIFRoZSBzZXJ2ZXIgdW5pcXVlIElEIGZvciBhbiBpdGVtICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9VTklRVUUgPSBCYXNlU3luY0NvbHVtbnMuU1lOQzM7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfUk9PVCA9ICJnb29nbGVfY2hyb21lIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfQk9PS01BUktTID0gImdvb2dsZV9jaHJvbWVfYm9va21hcmtzIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX05BTUVfQk9PS01BUktTX0JBUiA9ICJib29rbWFya19iYXIiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRV9PVEhFUl9CT09LTUFSS1MgPSAib3RoZXJfYm9va21hcmtzIjsKKworICAgICAgICAvKiogVGhlIGNsaWVudCB1bmlxdWUgSUQgZm9yIGFuIGl0ZW0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1VOSVFVRSA9IEJhc2VTeW5jQ29sdW1ucy5TWU5DNDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIHRoYXQgYXBwZWFyIHdoZW4gZWFjaCByb3cgb2YgYSB0YWJsZSBiZWxvbmdzIHRvIGEgc3BlY2lmaWMKKyAgICAgKiBhY2NvdW50LCBpbmNsdWRpbmcgc3luYyBpbmZvcm1hdGlvbiB0aGF0IGFuIGFjY291bnQgbWF5IG5lZWQuCisgICAgICovCisgICAgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQmFzZVN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgcm93IGJlbG9uZ3MsIHdoaWNoIHdoZW4gcGFpcmVkIHdpdGgKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGlkZW50aWZpZXMgYSBzcGVjaWZpYyBhY2NvdW50LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnRfbmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0eXBlIG9mIGFjY291bnQgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudF90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHJvdyB0byBpdHMgc291cmNlIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfSUQgPSAic291cmNlaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJzaW9uIG51bWJlciB0aGF0IGlzIHVwZGF0ZWQgd2hlbmV2ZXIgdGhpcyByb3cgb3IgaXRzIHJlbGF0ZWQgZGF0YQorICAgICAgICAgKiBjaGFuZ2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHRoYXQge0BsaW5rICNWRVJTSU9OfSBoYXMgY2hhbmdlZCwgYW5kIHRoaXMgcm93IG5lZWRzCisgICAgICAgICAqIHRvIGJlIHN5bmNocm9uaXplZCBieSBpdHMgb3duaW5nIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSVFkgPSAiZGlydHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGF0IHRoaXMgcm93IHdhcyBjcmVhdGVkIG9uIGl0cyBvcmlnaW5hdGluZyBjbGllbnQgKG1zZWNzCisgICAgICAgICAqIHNpbmNlIHRoZSBlcG9jaCkuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0NSRUFURUQgPSAiY3JlYXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhpcyByb3cgd2FzIGxhc3QgbW9kaWZpZWQgYnkgYSBjbGllbnQgKG1zZWNzIHNpbmNlIHRoZSBlcG9jaCkuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX01PRElGSUVEID0gIm1vZGlmaWVkIjsKKworICAgIH0KKworICAgIGludGVyZmFjZSBCb29rbWFya0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0lEID0gIl9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgb2YgdGhlIGJvb2ttYXJrLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIHZpc2libGUgdGl0bGUgb2YgdGhlIGJvb2ttYXJrLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZmF2aWNvbiBvZiB0aGUgYm9va21hcmssIG1heSBiZSBOVUxMLgorICAgICAgICAgKiBNdXN0IGRlY29kZSB2aWEge0BsaW5rIEJpdG1hcEZhY3RvcnkjZGVjb2RlQnl0ZUFycmF5fS4KKyAgICAgICAgICogPHA+VHlwZTogQkxPQiAoaW1hZ2UpPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWSUNPTiA9ICJmYXZpY29uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSB0aHVtYm5haWwgb2YgdGhlIHBhZ2UsbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQk5BSUwgPSAidGh1bWJuYWlsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRvdWNoIGljb24gZm9yIHRoZSB3ZWIgcGFnZSwgbWF5IGJlIE5VTEwuCisgICAgICAgICAqIE11c3QgZGVjb2RlIHZpYSB7QGxpbmsgQml0bWFwRmFjdG9yeSNkZWNvZGVCeXRlQXJyYXl9LgorICAgICAgICAgKiA8cD5UeXBlOiBCTE9CIChpbWFnZSk8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSF9JQ09OID0gInRvdWNoX2ljb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib29rbWFya3MgdGFibGUsIHdoaWNoIGhvbGRzIHRoZSB1c2VyJ3MgYnJvd3NlciBib29rbWFya3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCb29rbWFya3MgaW1wbGVtZW50cyBCb29rbWFya0NvbHVtbnMsIFN5bmNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBCb29rbWFya3MoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImJvb2ttYXJrcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoZSBkZWZhdWx0IGZvbGRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIgPQorICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENPTlRFTlRfVVJJLCAiZm9sZGVyIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyBhIFVSSSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBJRCBvZiB0aGUgZm9sZGVyIHRvIHBvaW50IHRvCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBidWlsZEZvbGRlclVyaShsb25nIGZvbGRlcklkKSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ09OVEVOVF9VUklfREVGQVVMVF9GT0xERVIsIGZvbGRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBib29rbWFya3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLmRpci9ib29rbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvZiBhIHNpbmdsZSBib29rbWFyay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL2Jvb2ttYXJrIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBzZWUgZGVsZXRlZCBib29rbWFya3MgdGhhdCBhcmUgc3RpbGwKKyAgICAgICAgICogYXJvdW5kIG9uIHRoZSBkZXZpY2UgYW5kIGhhdmVuJ3QgYmVlbiBzeW5jZWQgeWV0LgorICAgICAgICAgKiBAc2VlICNJU19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVEID0gInNob3dfZGVsZXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyBpZiBhbiBpdGVtIGlzIGEgZm9sZGVyIG9yIGJvb2ttYXJrLiBOb24temVybyB2YWx1ZXMgaW5kaWNhdGUKKyAgICAgICAgICogYSBmb2xkZXIgYW5kIHplcm8gaW5kaWNhdGVzIGEgYm9va21hcmsuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfRk9MREVSID0gImZvbGRlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgcGFyZW50IGZvbGRlci4gSUQgMCBpcyB0aGUgcm9vdCBmb2xkZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKHJlZmVyZW5jZSB0byBpdGVtIGluIHRoZSBzYW1lIHRhYmxlKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGJvb2ttYXJrIGluIHJlbGF0aW9uIHRvIGl0J3Mgc2libGluZ3MgdGhhdCBzaGFyZSB0aGUgc2FtZQorICAgICAgICAgKiB7QGxpbmsgI1BBUkVOVH0uIE1heSBiZSBuZWdhdGl2ZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU0lUSU9OID0gInBvc2l0aW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGl0ZW0gdGhhdCB0aGUgYm9va21hcmsgc2hvdWxkIGJlIGluc2VydGVkIGFmdGVyLgorICAgICAgICAgKiBNYXkgYmUgbmVnYXRpdmUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfQUZURVIgPSAiaW5zZXJ0X2FmdGVyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBmbGFnIHRvIGluZGljYXRlIGlmIGFuIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZC4gUXVlcmllcyB3aWxsIG5vdCByZXR1cm4gZGVsZXRlZAorICAgICAgICAgKiBlbnRyaWVzIHVubGVzcyB5b3UgYWRkIHRoZSB7QGxpbmsgI1FVRVJZX1BBUkFNRVRFUl9TSE9XX0RFTEVURUR9IHF1ZXJ5IHBhcmFtdGVyCisgICAgICAgICAqIHRvIHRoZSBVUkkgd2hlbiBwZXJmb3JtaW5nIHlvdXIgcXVlcnkuCisgICAgICAgICAqIDxwPlR5cGU6IElOVEVHRVIgKG5vbi16ZXJvIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGRlbGV0ZWQsIHplcm8gaWYgaXQgaGFzbid0KQorICAgICAgICAgKiBAc2VlICNRVUVSWV9QQVJBTUVURVJfU0hPV19ERUxFVEVECisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19ERUxFVEVEID0gImRlbGV0ZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoaXN0b3J5IHRhYmxlLCB3aGljaCBob2xkcyB0aGUgYnJvd3NpbmcgaGlzdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEhpc3RvcnkgaW1wbGVtZW50cyBCb29rbWFya0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEhpc3RvcnkoKSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImhpc3RvcnkiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiB7QGxpbmsgI0NPTlRFTlRfVVJJfSBwcm92aWRpbmcgYSBkaXJlY3Rvcnkgb2YgYnJvd3NlciBoaXN0b3J5IGl0ZW1zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgaGlzdG9yeSBpdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9JVEVNX1RZUEUgPSAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vYnJvd3Nlci1oaXN0b3J5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIGl0ZW0gd2FzIGxhc3QgdmlzaXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoZGF0ZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKTwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTEFTVF9WSVNJVEVEID0gImRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgaXRlbSBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAgICAgKiA8cD5UeXBlOiBOVU1CRVIgKGRhdGUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCk8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX0NSRUFURUQgPSAiY3JlYXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGl0ZW0gaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lUUyA9ICJ2aXNpdHMiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRU5URVJFRCA9ICJ1c2VyX2VudGVyZWQiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZWFyY2ggaGlzdG9yeSB0YWJsZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VhcmNoZXMgeworICAgICAgICBwcml2YXRlIFNlYXJjaGVzKCkge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKEFVVEhPUklUWV9VUkksICJzZWFyY2hlcyIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIHtAbGluayAjQ09OVEVOVF9VUkl9IHByb3ZpZGluZyBhIGRpcmVjdG9yeSBvZiBicm93c2VyIHNlYXJjaCBpdGVtcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL3NlYXJjaGVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9mIGEgc2luZ2xlIGJyb3dzZXIgc2VhcmNoIGl0ZW0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lURU1fVFlQRSA9ICJ2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9zZWFyY2hlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9JRCA9ICJfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdXNlciBlbnRlcmVkIHNlYXJjaCB0ZXJtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIID0gInNlYXJjaCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkYXRlIHRoZSBzZWFyY2ggd2FzIHBlcmZvcm1lZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAgICAgICogPHA+VHlwZTogTlVNQkVSIChkYXRlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzApPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURSA9ICJkYXRlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRhYmxlIHByb3ZpZGVkIGZvciBzeW5jIGFkYXB0ZXJzIHRvIHVzZSBmb3Igc3RvcmluZyBwcml2YXRlIHN5bmMgc3RhdGUgZGF0YS4KKyAgICAgKgorICAgICAqIEBzZWUgU3luY1N0YXRlQ29udHJhY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN5bmNTdGF0ZSBpbXBsZW1lbnRzIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3luY1N0YXRlKCkge30KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9CisgICAgICAgICAgICAgICAgU3luY1N0YXRlQ29udHJhY3QuQ29uc3RhbnRzLkNPTlRFTlRfRElSRUNUT1JZOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KKyAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCBDT05URU5UX0RJUkVDVE9SWSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgYW5kcm9pZC5wcm92aWRlci5TeW5jU3RhdGVDb250cmFjdC5IZWxwZXJzI2dldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0KENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50KQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuZ2V0KHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjZ2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIFBhaXI8VXJpLCBieXRlW10+IGdldFdpdGhVcmkoQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyLCBBY2NvdW50IGFjY291bnQpCisgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gU3luY1N0YXRlQ29udHJhY3QuSGVscGVycy5nZXRXaXRoVXJpKHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjc2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0KENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlciwgQWNjb3VudCBhY2NvdW50LCBieXRlW10gZGF0YSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMuc2V0KHByb3ZpZGVyLCBDT05URU5UX1VSSSwgYWNjb3VudCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMjbmV3U2V0T3BlcmF0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbiBuZXdTZXRPcGVyYXRpb24oQWNjb3VudCBhY2NvdW50LCBieXRlW10gZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFN5bmNTdGF0ZUNvbnRyYWN0LkhlbHBlcnMubmV3U2V0T3BlcmF0aW9uKENPTlRFTlRfVVJJLCBhY2NvdW50LCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCmluZGV4IDlhMDk4MDUuLmE2Mzk0ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXIuamF2YQpAQCAtNzYsMTEgKzc2LDEwNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOwogCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmljIGNvbHVtbnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBUaGUgc3BlY2lmaWMgZnVuY3Rpb25zIG9mCisgICAgICogdGhlc2UgY29sdW1ucyBhcmUgcHJpdmF0ZSB0byB0aGUgc3luYyBhZGFwdGVyLiBPdGhlciBjbGllbnRzIG9mIHRoZSBBUEkKKyAgICAgKiBzaG91bGQgbm90IGF0dGVtcHQgdG8gZWl0aGVyIHJlYWQgb3Igd3JpdGUgdGhpcyBjb2x1bW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBCYXNlU3luY0NvbHVtbnMgeworCisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMxID0gInN5bmMxIjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzIgPSAic3luYzIiOworICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMyA9ICJzeW5jMyI7CisgICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM0ID0gInN5bmM0IjsKKyAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzUgPSAic3luYzUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbHVtbnMgZm9yIFN5bmMgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBTeW5jQ29sdW1ucyBleHRlbmRzIEJhc2VTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UID0gIl9zeW5jX2FjY291bnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19BQ0NPVU5UX1RZUEUgPSAiX3N5bmNfYWNjb3VudF90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVuaXF1ZSBJRCBmb3IgYSByb3cgYXNzaWduZWQgYnkgdGhlIHN5bmMgc291cmNlLiBOVUxMIGlmIHRoZSByb3cgaGFzIG5ldmVyIGJlZW4gc3luY2VkLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGFzdCB0aW1lLCBmcm9tIHRoZSBzeW5jIHNvdXJjZSdzIHBvaW50IG9mIHZpZXcsIHRoYXQgdGhpcyByb3cgaGFzIGJlZW4gc3luY2hyb25pemVkLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX1RJTUUgPSAiX3N5bmNfdGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3csIGFzIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19WRVJTSU9OID0gIl9zeW5jX3ZlcnNpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgdXNlIGJ5IHN5bmMgYWRhcHRlciBhdCBpdHMgZGlzY3JldGlvbjsgbm90IG1vZGlmaWVkIGJ5IENhbGVuZGFyUHJvdmlkZXIKKyAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgY29sdW1uIHdhcyBmb3JtZXJseSBuYW1lZCBfU1lOQ19MT0NBTF9JRC4gIFdlIGFyZSB1c2luZyBpdCB0byBhdm9pZCBhCisgICAgICAgICAqIHNjaGVtYSBjaGFuZ2UuCisgICAgICAgICAqIFRPRE8gUmVwbGFjZSB0aGlzIHdpdGggc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RBVEEgPSAiX3N5bmNfbG9jYWxfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIG9ubHkgaW4gcGVyc2lzdGVudCBwcm92aWRlcnMsIGFuZCBvbmx5IGR1cmluZyBtZXJnaW5nLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX01BUksgPSAiX3N5bmNfbWFyayI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCwgdW5zeW5jZWQsIGNoYW5nZXMgYXJlIHByZXNlbnQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfRElSVFkgPSAiX3N5bmNfZGlydHkiOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBBY2NvdW50IGluZm9ybWF0aW9uIHVzZWQgYnkgQ2FsZW5kYXJzIGFuZCBFdmVudHMgdGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQWNjb3VudENvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQ2FsZW5kYXJzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucwotICAgIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyc0NvbHVtbnMgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbG9yIG9mIHRoZSBjYWxlbmRhcgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChjb2xvciB2YWx1ZSk8L1A+CkBAIC0xMzUsNzUgKzIzMCwxMDMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19TVEFURSA9ICJzeW5jX3N0YXRlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKiBXaGV0aGVyIHRoZSByb3cgaGFzIGJlZW4gZGVsZXRlZC4gIEEgZGVsZXRlZCByb3cgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVCA9ICJfc3luY19hY2NvdW50IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfQUNDT1VOVF9UWVBFID0gIl9zeW5jX2FjY291bnRfdHlwZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRm9yIHVzZSBieSBzeW5jIGFkYXB0ZXIgYXQgaXRzIGRpc2NyZXRpb247IG5vdCBtb2RpZmllZCBieSBDYWxlbmRhclByb3ZpZGVyCi0gICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGNvbHVtbiB3YXMgZm9ybWVybHkgbmFtZWQgX1NZTkNfTE9DQUxfSUQuICBXZSBhcmUgdXNpbmcgaXQgdG8gYXZvaWQgYQotICAgICAgICAgKiBzY2hlbWEgY2hhbmdlLgotICAgICAgICAgKiBUT0RPIFJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGdlbmVyYWwgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19EQVRBID0gIl9zeW5jX2xvY2FsX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0RJUlRZID0gIl9zeW5jX2RpcnR5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgaW5zdGFuY2UgdG8gd2hpY2ggdGhpcyByb3cgYmVsb25ncywgd2hpY2ggd2hlbiBwYWlyZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gaWRlbnRpZmllcyBhIHNwZWNpZmljIGFjY291bnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCB0byB3aGljaCB0aGlzIHJvdyBiZWxvbmdzLCB3aGljaCB3aGVuIHBhaXJlZCB3aXRoCi0gICAgICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYWNjb3VudC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEID0gImRlbGV0ZWQiOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIENhbGVuZGFyIEVudGl0eS4gVGhlcmUgaXMgb25lIGVudHJ5IHBlciBjYWxlbmRhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFyc0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKKyAgICAgICAgICAgICAgICAiL2NhbGVuZGFyX2VudGl0aWVzIik7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcmVzb2x2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLAorICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCBwcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlJdGVyYXRvckltcGwgZXh0ZW5kcyBDdXJzb3JFbnRpdHlJdGVyYXRvciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5IGdldEVudGl0eUFuZEluY3JlbWVudEN1cnNvcihDdXJzb3IgY3Vyc29yKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBleHBlY3QgdGhlIGN1cnNvciBpcyBhbHJlYWR5IGF0IHRoZSByb3cgd2UgbmVlZCB0byByZWFkIGZyb20KKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGNhbGVuZGFySWQgPSBjdXJzb3IuZ2V0TG9uZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KF9JRCkpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZW50IHZhbHVlCisgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICAgICAgY3YucHV0KF9JRCwgY2FsZW5kYXJJZCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19BQ0NPVU5UX1RZUEUpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfSUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX1RJTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RBVEEpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX01BUkspOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMxKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzIpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM0KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzUpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLk5BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRElTUExBWV9OQU1FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuQ09MT1IpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFDQ0VTU19MRVZFTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU0VMRUNURUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNZTkNfRVZFTlRTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTE9DQVRJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFRJTUVaT05FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9XTkVSX0FDQ09VTlQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuT1JHQU5JWkVSX0NBTl9SRVNQT05EKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBFbnRpdHkgZnJvbSB0aGUgQ29udGVudFZhbHVlCisgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGN1cnNvciB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgRW50aXR5CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKICAgICAgKiBDb250YWlucyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNhbGVuZGFycy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhcnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgQ2FsZW5kYXJzQ29sdW1ucwogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0RFTEVURV9GT1JfQUNDT1VOVCA9IENhbGVuZGFycy5fU1lOQ19BQ0NPVU5UICsgIj0/IgogICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIENhbGVuZGFycy5fU1lOQ19BQ0NPVU5UX1RZUEUgKyAiPT8iOwpAQCAtMjU4LDYgKzM4MSwyNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkwgPSAidXJsIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGl0c2VsZgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRl9VUkwgPSAic2VsZlVybCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciB0byBiZSBlZGl0ZWQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfVVJMID0gImVkaXRVcmwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgZXZlbnRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVFNfVVJMID0gImV2ZW50c1VybCI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjYWxlbmRhcgogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KQEAgLTI3NiwxMiArNDE3LDYgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAibG9jYXRpb24iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTaG91bGQgdGhlIGNhbGVuZGFyIGJlIGhpZGRlbiBpbiB0aGUgY2FsZW5kYXIgc2VsZWN0aW9uIHBhbmVsPwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJRERFTiA9ICJoaWRkZW4iOwotCi0gICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgb3duZXIgYWNjb3VudCBmb3IgdGhpcyBjYWxlbmRhciwgYmFzZWQgb24gdGhlIGNhbGVuZGFyIGZlZWQuCiAgICAgICAgICAqIFRoaXMgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgX1NZTkNfQUNDT1VOVCBmb3IgZGVsZWdhdGVkIGNhbGVuZGFycy4KICAgICAgICAgICogPFA+VHlwZTogU3RyaW5nPC9QPgpAQCAtMjk2LDYgKzQzMSw5IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR0FOSVpFUl9DQU5fUkVTUE9ORCA9ICJvcmdhbml6ZXJDYW5SZXNwb25kIjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KKyAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgewogCiAgICAgICAgIC8qKgpAQCAtMzYxLDggKzQ5OSw3IEBACiAgICAgLyoqCiAgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCiAgICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zCi0gICAgeworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgY2FsZW5kYXIgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIENhbGVuZGFycyB0YWJsZSk8L1A+CkBAIC00MzgsNiArNTc1LDE4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EID0gImR0ZW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IHN0YXJ0cyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVDIgPSAiZHRzdGFydDIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgZW5kcyB3aXRoIGFsbERheSBldmVudHMgaW4gYSBsb2NhbCB0egorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkQyID0gImR0ZW5kMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZXZlbnQKICAgICAgICAgICogPFA+VHlwZTogVEVYVCAoZHVyYXRpb24gaW4gUkZDMjQ0NSBmb3JtYXQpPC9QPgogICAgICAgICAgKi8KQEAgLTQ1MCw2ICs1OTksMTIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUgPSAiZXZlbnRUaW1lem9uZSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LCBhbGxEYXkgZXZlbnRzIHdpbGwgaGF2ZSBhIGxvY2FsIHR6IGluc3RlYWQgb2YgVVRDCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1RJTUVaT05FMiA9ICJldmVudFRpbWV6b25lMiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGxhc3RzIGFsbCBkYXkgb3Igbm90CiAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgogICAgICAgICAgKi8KQEAgLTU5OCw3ICs3NTMsOCBAQAogICAgIC8qKgogICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQWNjb3VudENvbHVtbnMsCisgICAgICAgICAgICBFdmVudHNDb2x1bW5zIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KQEAgLTcwMyw4ICs4NTksOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0RBVEEpOwogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19ESVJUWSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlVSTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRXZlbnRzQ29sdW1ucy5ERUxFVEVEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzEpOwogCiAgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOwogICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7CkBAIC03OTUsNyArOTUxLDggQEAKICAgICAvKioKICAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50LiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgYXMgYSBzaW5nbGUgZW50cnkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEFjY291bnRDb2x1bW5zLAorICAgICAgICAgICAgRXZlbnRzQ29sdW1ucyB7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRkVUQ0hfRU5UUllfQ09MVU1OUyA9CiAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgRXZlbnRzLl9TWU5DX0FDQ09VTlQsIEV2ZW50cy5fU1lOQ19JRCB9OwpAQCAtODYwLDYgKzEwMTcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgc2VhcmNoUXVlcnkgfSwgREVGQVVMVF9TT1JUX09SREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyB3aGVyZSwgU3RyaW5nIG9yZGVyQnkpIHsKICAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1VSSS5idWlsZFVwb24oKTsKICAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKQEAgLTg3Myw2ICsxMDM5LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIGxvbmcgYmVnaW4sCisgICAgICAgICAgICAgICAgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSwgU3RyaW5nIHdoZXJlLCBTdHJpbmcgb3JkZXJCeSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5hcHBlbmRQYXRoKHNlYXJjaFF1ZXJ5KTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh3aGVyZSkpIHsKKyAgICAgICAgICAgICAgICB3aGVyZSA9IFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hlcmUgPSAiKCIgKyB3aGVyZSArICIpIEFORCAiICsgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgd2hlcmUsIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOworICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQogICAgICAgICAgKi8KQEAgLTg4MCw2ICsxMDYxLDEwIEBACiAgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvd2hlbiIpOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0JZX0RBWV9VUkkgPQogICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3doZW5ieWRheSIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1NFQVJDSF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKKyAgICAgICAgICAgICAgICAiL2luc3RhbmNlcy9zZWFyY2giKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfQllfREFZX1VSSSA9CisgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9pbnN0YW5jZXMvc2VhcmNoYnlkYXkiKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBmb3IgdGhpcyB0YWJsZS4KQEAgLTg5Niw3ICsxMDgxLDYgQEAKICAgICAgICAgICogcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLCBpdCBqdXN0IGFkZHMgYSBuaWNlIHRvdWNoLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09SVF9DQUxFTkRBUl9WSUVXID0gImJlZ2luIEFTQywgZW5kIERFU0MsIHRpdGxlIEFTQyI7Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBiZWdpbm5pbmcgdGltZSBvZiB0aGUgaW5zdGFuY2UsIGluIFVUQyBtaWxsaXNlY29uZHMKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KQEAgLTk4MSw3ICsxMTY1LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0VWRU5UREFZUyA9ICJtYXhFdmVudERheXMiOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsZW5kYXJNZXRhRGF0YSBpbXBsZW1lbnRzIENhbGVuZGFyTWV0YURhdGFDb2x1bW5zIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucywgQmFzZUNvbHVtbnMgewogICAgIH0KIAogICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CkBAIC0xMzc5LDQgKzE1NjMsNDMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQogICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENhbGVuZGFyLkNPTlRFTlRfVVJJLCBDT05URU5UX0RJUkVDVE9SWSk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHNSYXdUaW1lcyB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgc3RhcnRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUXzI0NDUgPSAiZHRzdGFydDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgdGltZSB0aGUgZXZlbnQgZW5kcworICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkRfMjQ0NSA9ICJkdGVuZDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgb3JpZ2luYWwgaW5zdGFuY2UgdGltZSBvZiB0aGUgcmVjdXJyaW5nIGV2ZW50IGZvciB3aGljaCB0aGlzCisgICAgICAgICAqIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0lOU1RBTkNFX1RJTUVfMjQ0NSA9ICJvcmlnaW5hbEluc3RhbmNlVGltZTI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdCBuZXZlciBlbmRzCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEVfMjQ0NSA9ICJsYXN0RGF0ZTI0NDUiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzUmF3VGltZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKaW5kZXggZDUyNjMyYi4uYmYwNTFmNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQpAQCAtODgsNiArODgsMTcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIm51bWJlciI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBvZiB0aGUgY291bnRyeSB3aGVyZSB0aGUKKyAgICAgICAgICogdXNlciByZWNlaXZlZCBvciBtYWRlIHRoZSBjYWxsLgorICAgICAgICAgKiA8UD4KKyAgICAgICAgICogVHlwZTogVEVYVAorICAgICAgICAgKiA8L1A+CisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVFJZX0lTTyA9ICJjb3VudHJ5aXNvIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGRhdGUgdGhlIGNhbGwgb2NjdXJlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKaW5kZXggMTNjYmRhOC4uZWNkOWZlOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQpAQCAtMzAsOSArMzAsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VVdGlsczsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKQEAgLTQxLDYgKzQxLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIDxwPgpAQCAtMTMwLDYgKzEzMSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkgPSAicmVxdWVzdGluZ19wYWNrYWdlIjsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtZXRlciB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gYWNjZXNzIGEgc3BlY2lmaWMKKyAgICAgKiB7QGxpbmsgRGlyZWN0b3J5fS4gVGhlIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgdGhlIF9JRCBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqIGRpcmVjdG9yeSwgZS5nLgorICAgICAqIHtAY29kZSBjb250ZW50Oi8vY29tLmFuZHJvaWQuY29udGFjdHMvZGF0YS9lbWFpbHMvZmlsdGVyL2FjbWU/ZGlyZWN0b3J5PTN9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX1BBUkFNX0tFWSA9ICJkaXJlY3RvcnkiOworCisgICAgLyoqCisgICAgICogQSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHJldHVybmVkLiBUaGUKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIGJlIGFuIGludGVnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElNSVRfUEFSQU1fS0VZID0gImxpbWl0IjsKKworICAgIC8qKgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcmVmZXJlbmNlcyB7CkBAIC0xODEsNiArMTk2LDI5NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEEgRGlyZWN0b3J5IHJlcHJlc2VudHMgYSBjb250YWN0cyBjb3JwdXMsIGUuZy4gTG9jYWwgY29udGFjdHMsCisgICAgICogR29vZ2xlIEFwcHMgR2xvYmFsIEFkZHJlc3MgTGlzdCBvciBDb3Jwb3JhdGUgR2xvYmFsIEFkZHJlc3MgTGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIERpcmVjdG9yeSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBpdHMgdW5pcXVlIGF1dGhvcml0eSBhbmQKKyAgICAgKiB0aGUgc2FtZSBBUEkgYXMgdGhlIG1haW4gQ29udGFjdHMgUHJvdmlkZXIuICBIb3dldmVyLCB0aGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0CisgICAgICogZXZlcnkgZGlyZWN0b3J5IHByb3ZpZGVyIHdpbGwgaW1wbGVtZW50IHRoaXMgQ29udHJhY3QgaW4gaXRzIGVudGlyZXR5LiAgSWYgYQorICAgICAqIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzIG5vdCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIGZvciBhIHNwZWNpZmljIHJlcXVlc3QsIGl0CisgICAgICogc2hvdWxkIHRocm93IGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9zdCBpbXBvcnRhbnQgdXNlIGNhc2UgZm9yIERpcmVjdG9yaWVzIGlzIHNlYXJjaC4gIEEgRGlyZWN0b3J5IHByb3ZpZGVyIGlzCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkkKKyAgICAgKiBDb250YWN0cy5DT05URU5UX0ZJTFRFUl9VUkl9LiAgSWYgYSBEaXJlY3RvcnkgcHJvdmlkZXIgd2FudHMgdG8gcGFydGljaXBhdGUKKyAgICAgKiBpbiBlbWFpbCBhbmQgcGhvbmUgbG9va3VwIGZ1bmN0aW9uYWxpdGllcywgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50CisgICAgICoge0BsaW5rIENvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkkgQ29tbW9uRGF0YUtpbmRzLkVtYWlsLkNPTlRFTlRfRklMVEVSX1VSSX0KKyAgICAgKiBhbmQKKyAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLlBob25lI0NPTlRFTlRfRklMVEVSX1VSSSBDb21tb25EYXRhS2luZHMuUGhvbmUuQ09OVEVOVF9GSUxURVJfVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3RvcnkgcHJvdmlkZXIgc2hvdWxkIHJldHVybiBOVUxMIGZvciBldmVyeSBwcm9qZWN0aW9uIGZpZWxkIGl0IGRvZXMgbm90CisgICAgICogcmVjb2duaXplLCByYXRoZXIgdGhhbiB0aHJvd2luZyBhbiBleGNlcHRpb24uICBUaGlzIHdheSBpdCB3aWxsIG5vdCBiZSBicm9rZW4KKyAgICAgKiBpZiBDb250YWN0c0NvbnRyYWN0IGlzIGV4dGVuZGVkIHdpdGggbmV3IGZpZWxkcyBpbiB0aGUgZnV0dXJlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xpZW50IGludGVyYWN0cyB3aXRoIGEgZGlyZWN0b3J5IHZpYSBDb250YWN0cyBQcm92aWRlciBieSBzdXBwbHlpbmcgYW4KKyAgICAgKiBvcHRpb25hbCB7QGNvZGUgZGlyZWN0b3J5PX0gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCB0cmFuc2Zvcm1zIHRoZSBVUkkgYW5kIGZvcndhcmRzCisgICAgICogdGhlIHJlcXVlc3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICogVGhlIFVSSSBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgZm9sbG93aW5nIGZhc2hpb246CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgVVJJIGF1dGhvcml0eSBpcyByZXBsYWNlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjRElSRUNUT1JZX0FVVEhPUklUWX0uPC9saT4KKyAgICAgKiA8bGk+VGhlIHtAY29kZSBhY2NvdW50TmFtZT19IGFuZCB7QGNvZGUgYWNjb3VudFR5cGU9fSBwYXJhbWV0ZXJzIGFyZSBhZGRlZCBvcgorICAgICAqIHJlcGxhY2VkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayAjQUNDT1VOVF9UWVBFfSBhbmQge0BsaW5rICNBQ0NPVU5UX05BTUV9IHZhbHVlcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgVVJJIGlzIG1pc3NpbmcgYSBDb250YWN0c0NvbnRyYWN0LlJFUVVFU1RJTkdfUEFDS0FHRV9QQVJBTV9LRVkKKyAgICAgKiBwYXJhbWV0ZXIsIHRoaXMgcGFyYW1ldGVyIGlzIGFkZGVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQ2xpZW50cyBzaG91bGQgc2VuZCBkaXJlY3RvcnkgcmVxdWVzdHMgdG8gQ29udGFjdHMgUHJvdmlkZXIgYW5kIGxldCBpdAorICAgICAqIGZvcndhcmQgdGhlbSB0byB0aGUgcmVzcGVjdGl2ZSBwcm92aWRlcnMgcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nCisgICAgICogZGlyZWN0b3J5IHByb3ZpZGVyIFVSSXMgYnkgdGhlbXNlbHZlcy4gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MKKyAgICAgKiBDb250YWN0cyBQcm92aWRlciB0byBpbXBsZW1lbnQgYWRkaXRpb25hbCBzeXN0ZW0tbGV2ZWwgZmVhdHVyZXMgYW5kCisgICAgICogb3B0aW1pemF0aW9ucy4gQWNjZXNzIHRvIENvbnRhY3RzIFByb3ZpZGVyIGlzIHByb3RlY3RlZCBieSB0aGUKKyAgICAgKiBSRUFEX0NPTlRBQ1RTIHBlcm1pc3Npb24sIGJ1dCBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSBwcm92aWRlciBpcyBub3QuCisgICAgICogVGhlcmVmb3JlIGRpcmVjdG9yeSBwcm92aWRlcnMgbXVzdCByZWplY3QgcmVxdWVzdHMgY29taW5nIGZyb20gY2xpZW50cworICAgICAqIG90aGVyIHRoYW4gdGhlIENvbnRhY3RzIFByb3ZpZGVyIGl0c2VsZi4gQW4gZWFzeSB3YXkgdG8gcHJldmVudCBzdWNoCisgICAgICogdW5hdXRob3JpemVkIGFjY2VzcyBpcyB0byBjaGVjayB0aGUgbmFtZSBvZiB0aGUgY2FsbGluZyBwYWNrYWdlOgorICAgICAqIDxwcmU+CisgICAgICogcHJpdmF0ZSBib29sZWFuIGlzQ2FsbGVyQWxsb3dlZCgpIHsKKyAgICAgKiAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0Q29udGV4dCgpLmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICogICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZTogcG0uZ2V0UGFja2FnZXNGb3JVaWQoQmluZGVyLmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgKiAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscygiY29tLmFuZHJvaWQucHJvdmlkZXJzLmNvbnRhY3RzIikpIHsKKyAgICAgKiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfQorICAgICAqICAgcmV0dXJuIGZhbHNlOworICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIERpcmVjdG9yeSB0YWJsZSBpcyByZWFkLW9ubHkgYW5kIGlzIG1haW50YWluZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyCisgICAgICogYXV0b21hdGljYWxseS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+SXQgYWx3YXlzIGhhcyBhdCBsZWFzdCB0aGVzZSB0d28gcm93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIFRoZSBsb2NhbCBkaXJlY3RvcnkuIEl0IGhhcyB7QGxpbmsgRGlyZWN0b3J5I19JRCBEaXJlY3RvcnkuX0lEfSA9CisgICAgICoge0BsaW5rIERpcmVjdG9yeSNERUZBVUxUIERpcmVjdG9yeS5ERUZBVUxUfS4gVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGxvY2FsbHkKKyAgICAgKiBzdG9yZWQgY29udGFjdHMuIFRoZSBzYW1lIGNhbiBiZSBhY2hpZXZlZCBieSBvbWl0dGluZyB0aGUge0Bjb2RlIGRpcmVjdG9yeT19CisgICAgICogcGFyYW1ldGVyIGFsdG9nZXRoZXIuCisgICAgICogPC9saT4KKyAgICAgKiA8bGk+CisgICAgICogVGhlIGxvY2FsIGludmlzaWJsZSBjb250YWN0cy4gVGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IElEIGlzCisgICAgICoge0BsaW5rIERpcmVjdG9yeSNMT0NBTF9JTlZJU0lCTEUgRGlyZWN0b3J5LkxPQ0FMX0lOVklTSUJMRX0uCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5DdXN0b20gRGlyZWN0b3JpZXMgYXJlIGRpc2NvdmVyZWQgYnkgdGhlIENvbnRhY3RzIFByb3ZpZGVyIGZvbGxvd2luZyB0aGlzIHByb2NlZHVyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGZpbmRzIGFsbCBpbnN0YWxsZWQgY29udGVudCBwcm92aWRlcnMgd2l0aCBtZXRhIGRhdGEgaWRlbnRpZnlpbmcgdGhlbQorICAgICAqIGFzIGRpcmVjdG9yeSBwcm92aWRlcnMgaW4gQW5kcm9pZE1hbmlmZXN0LnhtbDoKKyAgICAgKiA8Y29kZT4KKyAgICAgKiAmbHQ7bWV0YS1kYXRhIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5jb250ZW50LkNvbnRhY3REaXJlY3RvcnkiCisgICAgICogICAgICAgICAgICAgICBhbmRyb2lkOnZhbHVlPSJ0cnVlIiAvJmd0OworICAgICAqIDwvY29kZT4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRhZyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyBjb250ZW50IHByb3ZpZGVyIGRlY2xhcmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiBUaGVuIENvbnRhY3RzIFByb3ZpZGVyIHNlbmRzIGEge0BsaW5rIERpcmVjdG9yeSNDT05URU5UX1VSSSBEaXJlY3RvcnkuQ09OVEVOVF9VUkl9CisgICAgICogcXVlcnkgdG8gZWFjaCBvZiB0aGUgZGlyZWN0b3J5IGF1dGhvcml0aWVzLiAgQSBkaXJlY3RvcnkgcHJvdmlkZXIgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB0aGlzIHF1ZXJ5IGFuZCByZXR1cm4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzLiAgRWFjaCBkaXJlY3RvcnkgcmV0dXJuZWQgYnkKKyAgICAgKiB0aGUgcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGNvbWJpbmF0aW9uIGZvciB0aGUge0BsaW5rICNBQ0NPVU5UX05BTUV9IGFuZAorICAgICAqIHtAbGluayAjQUNDT1VOVF9UWVBFfSBjb2x1bW5zIChudWxscyBhcmUgYWxsb3dlZCkuICBTaW5jZSBkaXJlY3RvcnkgSURzIGFyZSBhc3NpZ25lZAorICAgICAqIGF1dG9tYXRpY2FsbHksIHRoZSBfSUQgZmllbGQgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgcXVlcnkgcHJvamVjdGlvbi4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5Db250YWN0cyBQcm92aWRlciBjb21waWxlcyBkaXJlY3RvcnkgbGlzdHMgcmVjZWl2ZWQgZnJvbSBhbGwgZGlyZWN0b3J5CisgICAgICogcHJvdmlkZXJzIGludG8gb25lLCBhc3NpZ25zIGVhY2ggaW5kaXZpZHVhbCBkaXJlY3RvcnkgYSBnbG9iYWxseSB1bmlxdWUgSUQgYW5kCisgICAgICogc3RvcmVzIGFsbCBkaXJlY3RvcnkgcmVjb3JkcyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlLgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+Q29udGFjdHMgUHJvdmlkZXIgYXV0b21hdGljYWxseSBpbnRlcnJvZ2F0ZXMgbmV3bHkgaW5zdGFsbGVkIG9yIHJlcGxhY2VkIHBhY2thZ2VzLgorICAgICAqIFRodXMgc2ltcGx5IGluc3RhbGxpbmcgYSBwYWNrYWdlIGNvbnRhaW5pbmcgYSBkaXJlY3RvcnkgcHJvdmlkZXIgaXMgc3VmZmljaWVudAorICAgICAqIHRvIGhhdmUgdGhhdCBwcm92aWRlciByZWdpc3RlcmVkLiAgQSBwYWNrYWdlIHN1cHBseWluZyBhIGRpcmVjdG9yeSBwcm92aWRlciBkb2VzCisgICAgICogbm90IGhhdmUgdG8gY29udGFpbiBsYXVuY2hhYmxlIGFjdGl2aXRpZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEV2ZXJ5IHJvdyBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlIGlzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhY2thZ2UKKyAgICAgKiAoYXBrKS4gIElmIHRoZSBwYWNrYWdlIGlzIGxhdGVyIHVuaW5zdGFsbGVkLCBhbGwgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgcm93cworICAgICAqIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgaGFuZGxlZCBieSBhIGRpcmVjdG9yeSBwcm92aWRlciBjaGFuZ2VzCisgICAgICogKGZvciBpbnN0YW5jZSB3aGVuIHRoZSB1c2VyIGFkZHMgYSBuZXcgRGlyZWN0b3J5IGFjY291bnQpLCB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyCisgICAgICogc2hvdWxkIGNhbGwge0BsaW5rICNub3RpZnlEaXJlY3RvcnlDaGFuZ2V9IHRvIG5vdGlmeSB0aGUgQ29udGFjdHMgUHJvdmlkZXIgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBJbiByZXNwb25zZSwgdGhlIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgcmVxdWVyeSB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIHRvIG9idGFpbiB0aGUKKyAgICAgKiBuZXcgbGlzdCBvZiBkaXJlY3Rvcmllcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkaXJlY3Rvcnkgcm93IGNhbiBiZSBvcHRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBhY2NvdW50CisgICAgICogKHNlZSB7QGxpbmsgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlcn0pLiBJZiB0aGUgYWNjb3VudCBpcyBsYXRlciByZW1vdmVkLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdG9yeSByb3dzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgQ29udGFjdHMgUHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGlyZWN0b3J5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3QgaW5zdGFudGlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBEaXJlY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciB0aGlzIHRhYmxlLiAgUmVxdWVzdHMgdG8gdGhpcyBVUkkgY2FuIGJlCisgICAgICAgICAqIHBlcmZvcm1lZCBvbiB0aGUgVUkgdGhyZWFkIGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIHVuYmxvY2tpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoQVVUSE9SSVRZX1VSSSwgImRpcmVjdG9yaWVzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FLXR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mCisgICAgICAgICAqIGNvbnRhY3QgZGlyZWN0b3JpZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPQorICAgICAgICAgICAgICAgICJ2bmQuYW5kcm9pZC5jdXJzb3IuZGlyL2NvbnRhY3RfZGlyZWN0b3JpZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgTUlNRSB0eXBlIG9mIGEge0BsaW5rICNDT05URU5UX1VSSX0gaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0KKyAgICAgICAgICAgICAgICAidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vY29udGFjdF9kaXJlY3RvcnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRlZmF1bHQgZGlyZWN0b3J5LCB3aGljaCByZXByZXNlbnRzIGxvY2FsbHkgc3RvcmVkIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBfSUQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHJlcHJlc2VudHMgbG9jYWxseSBzdG9yZWQgaW52aXNpYmxlIGNvbnRhY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIExPQ0FMX0lOVklTSUJMRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoYXQgb3ducyB0aGlzIGRpcmVjdG9yeS4gQ29udGFjdHMgUHJvdmlkZXIKKyAgICAgICAgICogZmlsbCBpdCBpbiB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBwcm92aWRlci4KKyAgICAgICAgICogSWYgdGhlIHBhY2thZ2UgaXMgbGF0ZXIgdW5pbnN0YWxsZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZQorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBURVhUPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gInBhY2thZ2VOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgZGlyZWN0b3J5IGNhcHR1cmVkIGFzIGEgcmVzb3VyY2UgSUQgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgICAgICAgICAqIHBhY2thZ2Uge0BsaW5rICNQQUNLQUdFX05BTUV9LCBlLmcuICJDb3Jwb3JhdGUgRGlyZWN0b3J5IgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiBJTlRFR0VSPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9SRVNPVVJDRV9JRCA9ICJ0eXBlUmVzb3VyY2VJZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgVUkgdG8gcmVwcmVzZW50IHRoaXMgZGlyZWN0b3J5LAorICAgICAgICAgKiBlLmcuICJBY21lIENvcnAiCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGF1dGhvcml0eSBvZiB0aGUgRGlyZWN0b3J5IFByb3ZpZGVyLiBDb250YWN0cyBQcm92aWRlciB3aWxsCisgICAgICAgICAqIHVzZSB0aGlzIGF1dGhvcml0eSB0byBmb3J3YXJkIHJlcXVlc3RzIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAqIEEgZGlyZWN0b3J5IHByb3ZpZGVyIGNhbiBsZWF2ZSB0aGlzIGNvbHVtbiBlbXB0eSAtIENvbnRhY3RzIFByb3ZpZGVyIHdpbGwgZmlsbCBpdCBpbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ2xpZW50cyBvZiB0aGlzIEFQSSBzaG91bGQgbm90IHNlbmQgcmVxdWVzdHMgZGlyZWN0bHkgdG8gdGhpcyBhdXRob3JpdHkuCisgICAgICAgICAqIEFsbCBkaXJlY3RvcnkgcmVxdWVzdHMgbXVzdCBiZSByb3V0ZWQgdGhyb3VnaCBDb250YWN0cyBQcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUT1JZX0FVVEhPUklUWSA9ICJhdXRob3JpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0eXBlIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlRZUEU6IHRleHQ8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEUgPSAiYWNjb3VudFR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB3aXRoIHdoaWNoIHRoaXMgZGlyZWN0b3J5IGlzIGFzc29jaWF0ZWQuIElmIHRoZSBhY2NvdW50IGlzIGxhdGVyCisgICAgICAgICAqIHJlbW92ZWQsIHRoZSBkaXJlY3RvcmllcyBpdCBvd25zIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGlzIHRhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UWVBFOiB0ZXh0PC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9OQU1FID0gImFjY291bnROYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogT25lIG9mIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjRVhQT1JUX1NVUFBPUlRfQU5ZX0FDQ09VTlR9LAorICAgICAgICAgKiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUX1NBTUVfQUNDT1VOVF9PTkxZfS4gVGhpcyBpcyB0aGUgZXhwZWN0YXRpb24gdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBoYXMgZm9yIGRhdGEgZXhwb3J0ZWQgZnJvbSBpdC4gIENsaWVudHMgbXVzdCBvYmV5IHRoaXMgc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9TVVBQT1JUID0gImV4cG9ydFN1cHBvcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBkb2VzIG5vdCBhbGxvdyBhbnkgZGF0YSB0byBiZSBjb3BpZWQgb3V0IG9mIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfTk9ORSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjRVhQT1JUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGl0cyBkYXRhIGNvcGllZCBvbmx5IHRvIHRoZSBhY2NvdW50IHNwZWNpZmllZCBieQorICAgICAgICAgKiB7QGxpbmsgI0FDQ09VTlRfVFlQRX0ve0BsaW5rICNBQ0NPVU5UX05BTUV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX1NVUFBPUlRfU0FNRV9BQ0NPVU5UX09OTFkgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI0VYUE9SVF9TVVBQT1JUfSBzZXR0aW5nIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRpcmVjdG9yeQorICAgICAgICAgKiBhbGxvdyBpdHMgZGF0YSBjb3BpZWQgdG8gYW55IGNvbnRhY3RzIGFjY291bnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfU1VQUE9SVF9BTllfQUNDT1VOVCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9uZSBvZiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfTk9ORX0sIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVF9EQVRBX0lURU1TX09OTFl9LAorICAgICAgICAgKiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlRfRlVMTH0sIFRoaXMgaXMgdGhlIGV4cGVjdGF0aW9uIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogaGFzIGZvciBzaG9ydGN1dHMgY3JlYXRlZCBmb3IgaXRzIGVsZW1lbnRzLiBDbGllbnRzIG11c3Qgb2JleSB0aGlzIHNldHRpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVENVVF9TVVBQT1JUID0gInNob3J0Y3V0U3VwcG9ydCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogZG9lcyBub3QgYWxsb3cgYW55IHNob3J0Y3V0cyBjcmVhdGVkIGZvciBpdHMgY29udGFjdHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX05PTkUgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiB7QGxpbmsgI1NIT1JUQ1VUX1NVUFBPUlR9IHNldHRpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0b3J5CisgICAgICAgICAqIGFsbG93IGNyZWF0aW9uIG9mIHNob3J0Y3V0cyBmb3IgZGF0YSBpdGVtcyBsaWtlIGVtYWlsLCBwaG9uZSBvciBwb3N0YWwgYWRkcmVzcywKKyAgICAgICAgICogYnV0IG5vdCB0aGUgZW50aXJlIGNvbnRhY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0RBVEFfSVRFTVNfT05MWSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIHtAbGluayAjU0hPUlRDVVRfU1VQUE9SVH0gc2V0dGluZyB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICogYWxsb3cgY3JlYXRpb24gb2Ygc2hvcnRjdXRzIGZvciBjb250YWN0IGFzIHdlbGwgYXMgdGhlaXIgY29uc3RpdHVlbnQgZWxlbWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVENVVF9TVVBQT1JUX0ZVTEwgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmllcyB0aGUgc3lzdGVtIG9mIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGhhbmRsZWQgYnkKKyAgICAgICAgICogYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBwcm92aWRlci4gVGhlIENvbnRhY3RzIHByb3ZpZGVyIHdpbGwgdHVybiBhcm91bmQKKyAgICAgICAgICogYW5kIHNlbmQgYSBxdWVyeSB0byB0aGUgZGlyZWN0b3J5IHByb3ZpZGVyIGZvciB0aGUgZnVsbCBsaXN0IG9mIGRpcmVjdG9yaWVzLAorICAgICAgICAgKiB3aGljaCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm90aWZ5RGlyZWN0b3J5Q2hhbmdlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHRyaWdnZXIgYSBxdWVyeSBieSBDb250YWN0cyBQcm92aWRlciBiYWNrIHRvIHRoZSBkaXJlY3RvcnkgcHJvdmlkZXIuCisgICAgICAgICAgICAvLyBObyBkYXRhIG5lZWRzIHRvIGJlIHNlbnQgYmFjaywgYmVjYXVzZSB0aGUgcHJvdmlkZXIgY2FuIGluZmVyIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAvLyBwYWNrYWdlIGZyb20gYmluZGVyLgorICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIHJlc29sdmVyLnVwZGF0ZShEaXJlY3RvcnkuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB1c2VycyBhcmUgdXBkYXRlZCB0byByZWZlciB0byBTeW5jU3RhdGUKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgU3luY1N0YXRlIGluc3RlYWQKICAgICAgKi8KQEAgLTQ1Nyw3ICs3NjEsNiBAQAogICAgICAqICdmYW1pbHkgbmFtZScsICdnaXZlbiBuYW1lJyAnbWlkZGxlIG5hbWUnLiAgVGhlIENKSyB0cmFkaXRpb24gaXMKICAgICAgKiAnZmFtaWx5IG5hbWUnICdtaWRkbGUgbmFtZScgJ2dpdmVuIG5hbWUnLCB3aXRoIEphcGFuZXNlIGZhdm9yaW5nIGEgc3BhY2UgYmV0d2VlbgogICAgICAqIHRoZSBuYW1lcyBhbmQgQ2hpbmVzZSBvbWl0dGluZyB0aGUgc3BhY2UuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIEZ1bGxOYW1lU3R5bGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSAwOwpAQCAtNDc2LDcgKzc3OSw2IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIHZhcmlvdXMgc3R5bGVzIG9mIGNhcHR1cmluZyB0aGUgcHJvbnVuY2lhdGlvbiBvZiBhIHBlcnNvbidzIG5hbWUuCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFBob25ldGljTmFtZVN0eWxlIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUwMiw4ICs4MDQsNiBAQAogICAgIC8qKgogICAgICAqIFR5cGVzIG9mIGRhdGEgdXNlZCB0byBwcm9kdWNlIHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgY29udGFjdC4gTGlzdGVkIGluIHRoZSBvcmRlcgogICAgICAqIG9mIGluY3JlYXNpbmcgcHJpb3JpdHkuCi0gICAgICoKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheU5hbWVTb3VyY2VzIHsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEID0gMDsKQEAgLTUxOSwxNSArODE5LDEyIEBACiAgICAgICoKICAgICAgKiBAc2VlIENvbnRhY3RzCiAgICAgICogQHNlZSBSYXdDb250YWN0cwotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDb250YWN0TmFtZUNvbHVtbnMgewogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUga2luZCBvZiBkYXRhIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGlzcGxheSBuYW1lIGZvciB0aGUgY29udGFjdCwgc3VjaCBhcwotICAgICAgICAgKiBzdHJ1Y3R1cmVkIG5hbWUgb3IgZW1haWwgYWRkcmVzcy4gIFNlZSBEaXNwbGF5TmFtZVNvdXJjZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgRGlzcGxheU5hbWVTb3VyY2VzIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICogc3RydWN0dXJlZCBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuICBTZWUge0BsaW5rIERpc3BsYXlOYW1lU291cmNlc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUVfU09VUkNFID0gImRpc3BsYXlfbmFtZV9zb3VyY2UiOwogCkBAIC01NzUsOSArODcyLDcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHBob25ldGljIGFscGhhYmV0IHVzZWQgdG8gcmVwcmVzZW50IHRoZSB7QGxpbmsgI1BIT05FVElDX05BTUV9LiAgU2VlCi0gICAgICAgICAqIFBob25ldGljTmFtZVN0eWxlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBjb252ZXJ0IFBob25ldGljTmFtZVN0eWxlIHRvIGEgbGluayBhZnRlciBpdCBpcyB1bi1oaWRkZW4KKyAgICAgICAgICoge0BsaW5rIFBob25ldGljTmFtZVN0eWxlfS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX05BTUVfU1RZTEUgPSAicGhvbmV0aWNfbmFtZV9zdHlsZSI7CiAKQEAgLTU4NywxMyArODgyLDEwIEBACiAgICAgICAgICAqIHtAbGluayAjUEhPTkVUSUNfTkFNRV9TVFlMRX0uCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgotICAgICAgICAgKiBUaGlzIGNhcGFiaWxpdHkgaXMgaXMgb2YgaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMKLSAgICAgICAgICogd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljCi0gICAgICAgICAqIGFscGhhYmV0cywgc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuICBTZWUgUGhvbmV0aWNOYW1lU3R5bGUuCisgICAgICAgICAqIFRoZSB2YWx1ZSBtYXkgYmUgc2V0IG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBUaGlzIGNhcGFiaWxpdHkgaXMgb2YKKyAgICAgICAgICogaW50ZXJlc3Qgb25seSBpbiBjb3VudHJpZXMgd2l0aCBjb21tb25seSB1c2VkIHBob25ldGljIGFscGhhYmV0cywKKyAgICAgICAgICogc3VjaCBhcyBKYXBhbiBhbmQgS29yZWEuIFNlZSB7QGxpbmsgUGhvbmV0aWNOYW1lU3R5bGV9LgogICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IGNvbnZlcnQgUGhvbmV0aWNOYW1lU3R5bGUgdG8gYSBsaW5rIGFmdGVyIGl0IGlzIHVuLWhpZGRlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhPTkVUSUNfTkFNRSA9ICJwaG9uZXRpY19uYW1lIjsKIApAQCAtOTc1LDEwICsxMjY3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogTWFyayBhIGNvbnRhY3QgYXMgaGF2aW5nIGJlZW4gY29udGFjdGVkLiAgVGhpcyB1cGRhdGVzIHRoZQotICAgICAgICAgKiB7QGxpbmsgI1RJTUVTX0NPTlRBQ1RFRH0gYW5kIHtAbGluayAjTEFTVF9USU1FX0NPTlRBQ1RFRH0gZm9yIHRoZQotICAgICAgICAgKiBjb250YWN0LCBwbHVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBvZiBhbnkgYXNzb2NpYXRlZCByYXcKLSAgICAgICAgICogY29udGFjdHMuCisgICAgICAgICAqIE1hcmsgYSBjb250YWN0IGFzIGhhdmluZyBiZWVuIGNvbnRhY3RlZC4gVXBkYXRlcyB0d28gZmllbGRzOgorICAgICAgICAgKiB7QGxpbmsgI1RJTUVTX0NPTlRBQ1RFRH0gYW5kIHtAbGluayAjTEFTVF9USU1FX0NPTlRBQ1RFRH0uIFRoZQorICAgICAgICAgKiBUSU1FU19DT05UQUNURUQgZmllbGQgaXMgaW5jcmVtZW50ZWQgYnkgMSBhbmQgdGhlIExBU1RfVElNRV9DT05UQUNURUQKKyAgICAgICAgICogZmllbGQgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSByZXNvbHZlciB0aGUgQ29udGVudFJlc29sdmVyIHRvIHVzZQogICAgICAgICAgKiBAcGFyYW0gY29udGFjdElkIHRoZSBwZXJzb24gd2hvIHdhcyBjb250YWN0ZWQKQEAgLTEwNDAsNyArMTMzMiw4IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSBjb250YWN0IHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBjb25zdGl0dWVudCByYXcgY29udGFjdAotICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLgorICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5EYXRhfSByb3dzLiAgVGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgZWl0aGVyCisgICAgICAgICAqIHdpdGggYSB7QGxpbmsgI0NPTlRFTlRfVVJJfSBvciB7QGxpbmsgI0NPTlRFTlRfTE9PS1VQX1VSSX0uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xMDU2LDYgKzEzNDksNTcgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogPHA+CisgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCisgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzfSBhcyB3ZWxsIGFzCisgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeSBhcHBlbmQKKyAgICAgICAgICoge0BsaW5rICNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFbnRpdHkgaGFzIHRocmVlIElEIGZpZWxkczoge0BsaW5rICNDT05UQUNUX0lEfSBmb3IgdGhlIGNvbnRhY3QsCisgICAgICAgICAqIHtAbGluayAjUkFXX0NPTlRBQ1RfSUR9IGZvciB0aGUgcmF3IGNvbnRhY3QgYW5kIHtAbGluayAjREFUQV9JRH0gZm9yCisgICAgICAgICAqIHRoZSBkYXRhIHJvd3MuIEVudGl0eSBhbHdheXMgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJvdyBwZXIKKyAgICAgICAgICogY29uc3RpdHVlbnQgcmF3IGNvbnRhY3QsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGFjdHVhbCBkYXRhIHJvd3MuIEluCisgICAgICAgICAqIHRoaXMgY2FzZSB0aGUge0BsaW5rICNEQVRBX0lEfSBmaWVsZCB3aWxsIGJlIG51bGwuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEVudGl0eSByZWFkcyBhbGwgZGF0YSBmb3IgdGhlIGVudGlyZSBjb250YWN0IGluIG9uZSB0cmFuc2FjdGlvbiwgdG8KKyAgICAgICAgICogZ3VhcmFudGVlIGNvbnNpc3RlbmN5LiAgVGhlcmUgaXMgc2lnbmlmaWNhbnQgZGF0YSBkdXBsaWNhdGlvbgorICAgICAgICAgKiBpbiB0aGUgRW50aXR5IChlYWNoIHJvdyByZXBlYXRzIGFsbCBDb250YWN0IGNvbHVtbnMgYW5kIGFsbCBSYXdDb250YWN0CisgICAgICAgICAqIGNvbHVtbnMpLCBzbyB0aGUgYmVuZWZpdHMgb2YgdHJhbnNhY3Rpb25hbCBjb25zaXN0ZW5jeSBzaG91bGQgYmUgd2VpZ2hlZAorICAgICAgICAgKiBhZ2FpbnN0IHRoZSBjb3N0IG9mIHRyYW5zZmVycmluZyBsYXJnZSBhbW91bnRzIG9mIGRlbm9ybWFsaXplZCBkYXRhCisgICAgICAgICAqIGZyb20gdGhlIFByb3ZpZGVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBDb250YWN0c0NvbHVtbnMsCisgICAgICAgICAgICAgICAgQ29udGFjdE5hbWVDb2x1bW5zLCBSYXdDb250YWN0c0NvbHVtbnMsIEJhc2VTeW5jQ29sdW1ucywgU3luY0NvbHVtbnMsIERhdGFDb2x1bW5zLAorICAgICAgICAgICAgICAgIFN0YXR1c0NvbHVtbnMsIENvbnRhY3RPcHRpb25zQ29sdW1ucywgQ29udGFjdFN0YXR1c0NvbHVtbnMgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBubyBwdWJsaWMgY29uc3RydWN0b3Igc2luY2UgdGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBFbnRpdHkoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIGRpcmVjdG9yeSB0d2lnIGZvciB0aGlzIHN1Yi10YWJsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9ICJlbnRpdGllcyI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSByYXcgY29udGFjdCByb3cuCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JRCA9ICJyYXdfY29udGFjdF9pZCI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIElEIG9mIHRoZSBkYXRhIHJvdy4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbCBpZiB0aGlzIHJhdyBjb250YWN0IGhhcyBubworICAgICAgICAgICAgICogZGF0YSByb3dzLgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9JRCA9ICJkYXRhX2lkIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD4KICAgICAgICAgICogQSA8aT5yZWFkLW9ubHk8L2k+IHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgY29udGFjdCBhZ2dyZWdhdGUgdGhhdAogICAgICAgICAgKiBjb250YWlucyBhbGwgYWdncmVnYXRpb24gc3VnZ2VzdGlvbnMgKG90aGVyIGNvbnRhY3RzKS4gVGhlCiAgICAgICAgICAqIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb25zIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBhcHByb3hpbWF0ZSBkYXRhCkBAIC0xMDgwLDkgKzE0MjQsMTMgQEAKICAgICAgICAgICogPC9wcmU+CiAgICAgICAgICAqCiAgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIGVpdGhlciB3aXRoIGEge0BsaW5rICNDT05URU5UX1VSSX0gb3IKKyAgICAgICAgICoge0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9LgorICAgICAgICAgKiA8L3A+CiAgICAgICAgICAqLwotICAgICAgICAvLyBUT0RPOiBhZGQgQ29udGFjdE9wdGlvbnNDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQ29udGFjdHNDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucywKKyAgICAgICAgICAgICAgICBDb250YWN0T3B0aW9uc0NvbHVtbnMsIENvbnRhY3RTdGF0dXNDb2x1bW5zIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogTm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCiAgICAgICAgICAgICAgKi8KQEAgLTEwOTQsNiArMTQ0MiwxMDYgQEAKICAgICAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjQ09OVEVOVF9GSUxURVJfVVJJfS4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAic3VnZ2VzdGlvbnMiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgQnVpbGRlciNhZGRQYXJhbWV0ZXJ9IHRvIHNwZWNpZnkgd2hhdCBraW5kIG9mIGRhdGEgaXMKKyAgICAgICAgICAgICAqIHN1cHBsaWVkIGZvciB0aGUgc3VnZ2VzdGlvbiBxdWVyeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAaGlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTUFUQ0hfTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX0VNQUlMID0gImVtYWlsIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX1BIT05FID0gInBob25lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rIEJ1aWxkZXIjYWRkUGFyYW1ldGVyfSB0byBzcGVjaWZ5IHdoYXQga2luZCBvZiBkYXRhIGlzCisgICAgICAgICAgICAgKiBzdXBwbGllZCBmb3IgdGhlIHN1Z2dlc3Rpb24gcXVlcnkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX01BVENIX05JQ0tOQU1FID0gIm5pY2tuYW1lIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBIGNvbnZlbmllbmNlIGJ1aWxkZXIgZm9yIGFnZ3JlZ2F0aW9uIHN1Z2dlc3Rpb24gY29udGVudCBVUklzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRPRE86IGNoYW5nZSBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGNsYXNzIHRvIHVzZSB0aGUgYnVpbGRlci4KKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1Db250YWN0SWQ7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtS2luZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBtTGltaXQ7CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBPcHRpb25hbCBleGlzdGluZyBjb250YWN0IElELiAgSWYgaXQgaXMgbm90IHByb3ZpZGVkLCB0aGUgc2VhcmNoCisgICAgICAgICAgICAgICAgICogd2lsbCBiZSBiYXNlZCBleGNsdXNpdmVseSBvbiB0aGUgdmFsdWVzIHN1cHBsaWVkIHdpdGgge0BsaW5rICNhZGRQYXJhbWV0ZXJ9LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhY3RJZChsb25nIGNvbnRhY3RJZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm1Db250YWN0SWQgPSBjb250YWN0SWQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgYW4gYWdncmVnYXRpb24KKyAgICAgICAgICAgICAgICAgKiBzdWdnZXN0aW9uLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHBhcmFtIGtpbmQgY2FuIGJlIG9uZSBvZgorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX05BTUV9LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAge0BsaW5rIEFnZ3JlZ2F0aW9uU3VnZ2VzdGlvbnMjUEFSQU1FVEVSX01BVENIX0VNQUlMfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIHtAbGluayBBZ2dyZWdhdGlvblN1Z2dlc3Rpb25zI1BBUkFNRVRFUl9NQVRDSF9OSUNLTkFNRX0sCisgICAgICAgICAgICAgICAgICogICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb25TdWdnZXN0aW9ucyNQQVJBTUVURVJfTUFUQ0hfUEhPTkV9CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFyYW1ldGVyKFN0cmluZyBraW5kLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LaW5kcy5hZGQoa2luZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGltaXQoaW50IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW1pdCA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgVXJpIGJ1aWxkKCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm5ldC5VcmkuQnVpbGRlciBidWlsZGVyID0gQ29udGFjdHMuQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kRW5jb2RlZFBhdGgoU3RyaW5nLnZhbHVlT2YobUNvbnRhY3RJZCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZFBhdGgoQ29udGFjdHMuQWdncmVnYXRpb25TdWdnZXN0aW9ucy5DT05URU5UX0RJUkVDVE9SWSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGltaXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigibGltaXQiLCBTdHJpbmcudmFsdWVPZihtTGltaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1LaW5kcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmRRdWVyeVBhcmFtZXRlcigicXVlcnkiLCBtS2luZHMuZ2V0KGkpICsgIjoiICsgbVZhbHVlcy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQGhpZGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTExMjksOSArMTU3NywxMiBAQAogICAgICAgICAgKiA8cD5Zb3Ugc2hvdWxkIGFsc28gY29uc2lkZXIgdXNpbmcgdGhlIGNvbnZlbmllbmNlIG1ldGhvZAogICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNvcGVuQ29udGFjdFBob3RvSW5wdXRTdHJlYW0oQ29udGVudFJlc29sdmVyLCBVcmkpfQogICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCBlaXRoZXIgd2l0aCBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yCisgICAgICAgICAqIHtAbGluayAjQ09OVEVOVF9MT09LVVBfVVJJfS4KKyAgICAgICAgICogPC9wPgogICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETzogY2hhbmdlIERhdGFDb2x1bW5zIHRvIERhdGFDb2x1bW5zV2l0aEpvaW5zCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGhvdG8gaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBob3RvIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIERhdGFDb2x1bW5zV2l0aEpvaW5zIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogbm8gcHVibGljIGNvbnN0cnVjdG9yIHNpbmNlIHRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzCiAgICAgICAgICAgICAgKi8KQEAgLTExNDcsNyArMTU5OCw2IEBACiAgICAgICAgICAgICAgKiB0aGF0IGNvdWxkIGJlIGluZmxhdGVkIHVzaW5nIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnl9LgogICAgICAgICAgICAgICogPHA+CiAgICAgICAgICAgICAgKiBUeXBlOiBCTE9CCi0gICAgICAgICAgICAgKiBAaGlkZSBUT0RPOiBVbmhpZGUgaW4gYSBzZXBhcmF0ZSBDTAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UTyA9IERBVEExNTsKICAgICAgICAgfQpAQCAtMTE1Niw3ICsxNjA2LDEwIEBACiAgICAgICAgICAqIE9wZW5zIGFuIElucHV0U3RyZWFtIGZvciB0aGUgY29udGFjdHMncyBkZWZhdWx0IHBob3RvIGFuZCByZXR1cm5zIHRoZQogICAgICAgICAgKiBwaG90byBhcyBhIGJ5dGUgc3RyZWFtLiBJZiB0aGVyZSBpcyBub3QgcGhvdG8gbnVsbCB3aWxsIGJlIHJldHVybmVkLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB3aG9zZSBwaG90byBzaG91bGQgYmUgdXNlZAorICAgICAgICAgKiBAcGFyYW0gY29udGFjdFVyaSB0aGUgY29udGFjdCB3aG9zZSBwaG90byBzaG91bGQgYmUgdXNlZC4gVGhpcyBjYW4gYmUgdXNlZCB3aXRoCisgICAgICAgICAqIGVpdGhlciBhIHtAbGluayAjQ09OVEVOVF9VUkl9IG9yIGEge0BsaW5rICNDT05URU5UX0xPT0tVUF9VUkl9IFVSSS4KKyAgICAgICAgICogPC9wPgorCiAgICAgICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gb2YgdGhlIHBob3RvLCBvciBudWxsIGlmIG5vIHBob3RvIGlzIHByZXNlbnQKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gb3BlbkNvbnRhY3RQaG90b0lucHV0U3RyZWFtKENvbnRlbnRSZXNvbHZlciBjciwgVXJpIGNvbnRhY3RVcmkpIHsKQEAgLTEyNDQsNiArMTY5NywxMyBAQAogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9WRVJJRklFRCA9ICJuYW1lX3ZlcmlmaWVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlICJyZWFkLW9ubHkiIGZsYWc6ICIwIiBieSBkZWZhdWx0LCAiMSIgaWYgdGhlIHJvdyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IKKyAgICAgICAgICogZGVsZXRlZCBleGNlcHQgYnkgYSBzeW5jIGFkYXB0ZXIuICBTZWUge0BsaW5rIENvbnRhY3RzQ29udHJhY3QjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBV19DT05UQUNUX0lTX1JFQURfT05MWSA9ICJyYXdfY29udGFjdF9pc19yZWFkX29ubHkiOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTYyOSwxMCArMjA4OSwxMCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBR0dSRUdBVElPTl9NT0RFX0RFRkFVTFQgPSAwOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBEbyBub3QgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBkZXByZWNhdGUgaW4gZmF2b3Igb2Yge0BsaW5rICNBR0dSRUdBVElPTl9NT0RFX0RFRkFVTFR9CisgICAgICAgICAqIEFnZ3JlZ2F0aW9uIG1vZGU6IGFnZ3JlZ2F0ZSBhdCB0aGUgdGltZSB0aGUgcmF3IGNvbnRhY3QgaXMgaW5zZXJ0ZWQvdXBkYXRlZC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgQWdncmVnYXRpb24gaXMgc3luY2hyb25vdXMsIHRoaXMgaGlzdG9yaWMgdmFsdWUgaXMgYSBuby1vcAogICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUdHUkVHQVRJT05fTU9ERV9JTU1FRElBVEUgPSAxOwogCiAgICAgICAgIC8qKgpAQCAtMTcwMCw5ICsyMTYwLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEEgc3ViLWRpcmVjdG9yeSBvZiBhIHNpbmdsZSByYXcgY29udGFjdCB0aGF0IGNvbnRhaW5zIGFsbCBvZiBpdHMKICAgICAgICAgICoge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuRGF0YX0gcm93cy4gVG8gYWNjZXNzIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAqIGFwcGVuZCB7QGxpbmsgRGF0YSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLgotICAgICAgICAgKgotICAgICAgICAgKiBUT0RPOiBkZXByZWNhdGUgaW4gZmF2b3Igb2Yge0BsaW5rIFJhd0NvbnRhY3RzLkVudGl0eX0uCisgICAgICAgICAqIGFwcGVuZCB7QGxpbmsgRGF0YSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIHJhdyBjb250YWN0IFVSSS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGF0YSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBEYXRhQ29sdW1ucyB7CiAgICAgICAgICAgICAvKioKQEAgLTE3MjEsNyArMjE3OSw3IEBACiAgICAgICAgICAqIDxwPgogICAgICAgICAgKiBBIHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgcmF3IGNvbnRhY3QgdGhhdCBjb250YWlucyBhbGwgb2YgaXRzCiAgICAgICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkRhdGF9IHJvd3MuIFRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeSBhcHBlbmQKLSAgICAgICAgICoge0BsaW5rICNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIGNvbnRhY3QgVVJJLiBTZWUKKyAgICAgICAgICoge0BsaW5rIFJhd0NvbnRhY3RzLkVudGl0eSNDT05URU5UX0RJUkVDVE9SWX0gdG8gdGhlIHJhdyBjb250YWN0IFVSSS4gU2VlCiAgICAgICAgICAqIHtAbGluayBSYXdDb250YWN0c0VudGl0eX0gZm9yIGEgc3RhbmQtYWxvbmUgdGFibGUgY29udGFpbmluZyB0aGUgc2FtZQogICAgICAgICAgKiBkYXRhLgogICAgICAgICAgKiA8L3A+CkBAIC0xNzMzLDEwICsyMTkxLDEwIEBACiAgICAgICAgICAqIG51bGwuCiAgICAgICAgICAqIDwvcD4KICAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEVudGl0eSByZWFkcyBhbGwKLSAgICAgICAgICogZGF0YSBmb3IgYSByYXcgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHRvIGd1YXJhbnRlZQotICAgICAgICAgKiBjb25zaXN0ZW5jeS4KLSAgICAgICAgICogPC9wPgorICAgICAgICAgKiBVc2luZyBFbnRpdHkgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB1c2luZyB0d28gc2VwYXJhdGUgcXVlcmllczoKKyAgICAgICAgICogUmF3Q29udGFjdHMgZm9sbG93ZWQgYnkgRGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IEVudGl0eSByZWFkcyBhbGwKKyAgICAgICAgICogZGF0YSBmb3IgYSByYXcgY29udGFjdCBpbiBvbmUgdHJhbnNhY3Rpb24sIHNvIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5CisgICAgICAgICAqIG9mIHRoZSBkYXRhIGNoYW5naW5nIGJldHdlZW4gdGhlIHR3byBxdWVyaWVzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRGF0YUNvbHVtbnMgewogICAgICAgICAgICAgLyoqCkBAIC0xNzUxLDcgKzIyMDksNyBAQAogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVJFQ1RPUlkgPSAiZW50aXR5IjsKIAogICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgY29sdW1uLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGRhdGEgcm93LiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoaXMgcmF3IGNvbnRhY3QgaGFzIG5vCiAgICAgICAgICAgICAgKiBkYXRhIHJvd3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgogICAgICAgICAgICAgICovCkBAIC0xODM5LDI4ICsyMjk3LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5EQVRBX1ZFUlNJT04pOwogICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBEQVRBX0tFWVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjdXJzb3IuZ2V0VHlwZShjb2x1bW5JbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX05VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHB1dCBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX0lOVEVHRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDdXJzb3IuRklFTERfVFlQRV9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEN1cnNvci5GSUVMRF9UWVBFX1NUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ3Vyc29yLkZJRUxEX1RZUEVfQkxPQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3YucHV0KGtleSwgY3Vyc29yLmdldEJsb2IoY29sdW1uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgb3IgdW5oYW5kbGVkIGRhdGEgdHlwZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZ28gYmFjayB0byB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgd2hlbiBidWcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTIzMDYzNzAgaXMgZml4ZWQuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNOdWxsKGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcHV0IGFueXRoaW5nCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzTG9uZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc0Zsb2F0KGNvbHVtbkluZGV4KSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChrZXksIGN1cnNvci5nZXRGbG9hdChjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnNvci5pc1N0cmluZyhjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmlzQmxvYihjb2x1bW5JbmRleCkpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCkpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGFjdC5hZGRTdWJWYWx1ZShDb250YWN0c0NvbnRyYWN0LkRhdGEuQ09OVEVOVF9VUkksIGN2KTsKICAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKTsKQEAgLTE5NjUsMTggKzI0MTYsMTkgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBVF9DQVBBQklMSVRZID0gImNoYXRfY2FwYWJpbGl0eSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBjYW4KKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIGF1ZGlvLWNoYXQgY2FwYWJpbGl0eSAobWljcm9waG9uZQorICAgICAgICAgKiBhbmQgc3BlYWtlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZPSUNFID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYWxsb3dlZCBmbGFnIG9mIHtAbGluayAjQ0hBVF9DQVBBQklMSVRZfS4gSW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRhY3QncyBkZXZpY2UgY2FuCiAgICAgICAgICAqIGRpc3BsYXkgYSB2aWRlbyBmZWVkLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUJJTElUWV9IQVNfVklERU9fUExBWUJBQ0tfT05MWSA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUEFCSUxJVFlfSEFTX1ZJREVPID0gMjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQW4gYWxsb3dlZCB2YWx1ZSBvZiB7QGxpbmsgI0NIQVRfQ0FQQUJJTElUWX0uIEluZGljYXRlcyBhdWRpby1jaGF0IGNhcGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19WT0lDRSA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGFsbG93ZWQgdmFsdWUgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQorICAgICAgICAgKiBBbiBhbGxvd2VkIGZsYWcgb2Yge0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9LiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udGFjdCdzIGRldmljZSBoYXMgYQogICAgICAgICAgKiBjYW1lcmEgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmlkZW8gY2hhdCAoZS5nLiBhIGZyb250LWZhY2luZyBjYW1lcmEgb24gYSBwaG9uZSkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVBBQklMSVRZX0hBU19DQU1FUkEgPSA0OwpAQCAtMjAyMyw2ICsyNDc1LDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NVUEVSX1BSSU1BUlkgPSAiaXNfc3VwZXJfcHJpbWFyeSI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAicmVhZC1vbmx5IiBmbGFnOiAiMCIgYnkgZGVmYXVsdCwgIjEiIGlmIHRoZSByb3cgY2Fubm90IGJlIG1vZGlmaWVkIG9yCisgICAgICAgICAqIGRlbGV0ZWQgZXhjZXB0IGJ5IGEgc3luYyBhZGFwdGVyLiAgU2VlIHtAbGluayBDb250YWN0c0NvbnRyYWN0I0NBTExFUl9JU19TWU5DQURBUFRFUn0uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19SRUFEX09OTFkgPSAiaXNfcmVhZF9vbmx5IjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBkYXRhIHJlY29yZC4gVGhpcyBpcyBhIHJlYWQtb25seSB2YWx1ZS4gVGhlIGRhdGEgY29sdW1uIGlzCiAgICAgICAgICAqIGd1YXJhbnRlZWQgdG8gbm90IGNoYW5nZSB3aXRob3V0IHRoZSB2ZXJzaW9uIGdvaW5nIHVwLiBUaGlzIHZhbHVlIGlzIG1vbm90b25pY2FsbHkKICAgICAgICAgICogaW5jcmVhc2luZy4KQEAgLTI4NTcsNiArMzMxNiwxNCBAQAogICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAibGFiZWwiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyJ3MgRTE2NCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gIm5vcm1hbGl6ZWRfbnVtYmVyIjsKICAgICB9CiAKICAgICAvKioKQEAgLTMxMjksMTAgKzM1OTYsMTEgQEAKICAgICAgKiA8dGQ+aW50PC90ZD4KICAgICAgKiA8dGQ+e0BsaW5rICNDSEFUX0NBUEFCSUxJVFl9PC90ZD4KICAgICAgKiA8dGQ+cmVhZC93cml0ZTwvdGQ+Ci0gICAgICogPHRkPkNvbnRhY3QgSU0gY2hhdCBjb21wYXRpYmlsaXR5IHZhbHVlLiBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlOgorICAgICAqIDx0ZD5Db250YWN0IElNIGNoYXQgY29tcGF0aWJpbGl0eSB2YWx1ZS4gVGhlIGFsbG93ZWQgdmFsdWVzIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nCisgICAgICogZmxhZ3MuIElmIE5vbmUgb2YgdGhlc2UgZmxhZ3MgaXMgc2V0LCB0aGUgZGV2aWNlIGNhbiBvbmx5IGRvIHRleHQgbWVzc2FnaW5nLgogICAgICAqIDxwPgogICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WSURFT19QTEFZQkFDS19PTkxZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FQQUJJTElUWV9IQVNfVklERU99PC9saT4KICAgICAgKiA8bGk+e0BsaW5rICNDQVBBQklMSVRZX0hBU19WT0lDRX08L2xpPgogICAgICAqIDxsaT57QGxpbmsgI0NBUEFCSUxJVFlfSEFTX0NBTUVSQX08L2xpPgogICAgICAqIDwvdWw+CkBAIC0zNzA4LDYgKzQxNzYsMTQgQEAKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9IERBVEE7CiAKICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHBob25lIG51bWJlcidzIEUxNjQgcmVwcmVzZW50YXRpb24uCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEBoaWRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTElaRURfTlVNQkVSID0gREFUQTQ7CisKKyAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0VHlwZUxhYmVsKFJlc291cmNlcywgaW50LCBDaGFyU2VxdWVuY2UpfSBpbnN0ZWFkLgogICAgICAgICAgICAgICogQGhpZGUKICAgICAgICAgICAgICAqLwpAQCAtMzc4OSw3ICs0MjY1LDcgQEAKICAgICAgICAgICogPC90cj4KICAgICAgICAgICogPHRyPgogICAgICAgICAgKiA8dGQ+U3RyaW5nPC90ZD4KLSAgICAgICAgICogPHRkPntAbGluayAjREFUQX08L3RkPgorICAgICAgICAgKiA8dGQ+e0BsaW5rICNBRERSRVNTfTwvdGQ+CiAgICAgICAgICAqIDx0ZD57QGxpbmsgI0RBVEExfTwvdGQ+CiAgICAgICAgICAqIDx0ZD5FbWFpbCBhZGRyZXNzIGl0c2VsZi48L3RkPgogICAgICAgICAgKiA8L3RyPgpAQCAtMzg4MCw3ICs0MzU2LDYgQEAKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogVGhlIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgICAgICogQGhpZGUgVE9ETzogVW5oaWRlIGluIGEgc2VwYXJhdGUgQ0wKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTUyA9IERBVEExOwogCkBAIC00OTk4LDYgKzU0NzMsMjMgQEAKICAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9TWU5DID0gInNob3VsZF9zeW5jIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW55IG5ld2x5IGNyZWF0ZWQgY29udGFjdHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGdyb3VwcyB0aGF0IGhhdmUgdGhpcworICAgICAgICAgKiBmbGFnIHNldCB0byB0cnVlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVHlwZTogSU5URUdFUiAoYm9vbGVhbikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fQUREID0gImF1dG9fYWRkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBhIGNvbnRhY3RzIGlzIG1hcmtlZCBhcyBhIGZhdm9yaXRlcyBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQKKyAgICAgICAgICogdG8gdGhlIGdyb3VwcyB0aGF0IGhhdmUgdGhpcyBmbGFnIHNldCwgYW5kIHdoZW4gaXQgaXMgcmVtb3ZlZCBmcm9tIGZhdm9yaXRlcworICAgICAgICAgKiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGVzZSBncm91cHMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBJTlRFR0VSIChib29sZWFuKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWT1JJVEVTID0gImZhdm9yaXRlcyI7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTM4LDYgKzU2MzAsOCBAQAogICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgREVMRVRFRCk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCB2YWx1ZXMsIE5PVEVTKTsKICAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIHZhbHVlcywgU0hPVUxEX1NZTkMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBGQVZPUklURVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgdmFsdWVzLCBBVVRPX0FERCk7CiAgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eSh2YWx1ZXMpOwogICAgICAgICAgICAgfQpAQCAtNTY1NCw2ICs2MTQ4LDI4IEBACiAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5TSE9XX09SX0NSRUFURV9DT05UQUNUIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnRzIGFuIEFjdGl2aXR5IHRoYXQgbGV0cyB0aGUgdXNlciBzZWxlY3QgdGhlIG11bHRpcGxlIHBob25lcyBmcm9tIGEKKyAgICAgICAgICogbGlzdCBvZiBwaG9uZSBudW1iZXJzIHdoaWNoIGNvbWUgZnJvbSB0aGUgY29udGFjdHMgb3IKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIGJlaW5nIHBhc3NlZCBpbiB0aHJvdWdoIHtAbGluayAjRVhUUkFfUEhPTkVfVVJJU30KKyAgICAgICAgICogY291bGQgYmVsb25nIHRvIHRoZSBjb250YWN0cyBvciBub3QsIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgdXNlcidzIHNlbGVjdGlvbiB3aWxsIGJlIHJldHVybmVkIGZyb20KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQWN0aXZpdHlSZXN1bHQoaW50LCBpbnQsIGFuZHJvaWQuY29udGVudC5JbnRlbnQpfQorICAgICAgICAgKiBpZiB0aGUgcmVzdWx0Q29kZSBpcworICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjUkVTVUxUX09LfSwgdGhlIGFycmF5IG9mIHBpY2tlZCBwaG9uZQorICAgICAgICAgKiBudW1iZXJzIGFyZSBpbiB0aGUgSW50ZW50J3MKKyAgICAgICAgICoge0BsaW5rICNFWFRSQV9QSE9ORV9VUklTfTsgb3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I1JFU1VMVF9DQU5DRUxFRH0gaXMgcmV0dXJuZWQgaWYgdGhlIHVzZXIKKyAgICAgICAgICogbGVmdCB0aGUgQWN0aXZpdHkgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9NVUxUSVBMRV9QSE9ORVMgPQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb250YWN0cy5hY3Rpb24uR0VUX01VTFRJUExFX1BIT05FUyI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI1NIT1dfT1JfQ1JFQVRFX0NPTlRBQ1R9IHRvIGZvcmNlIGNyZWF0aW5nIGEgbmV3CiAgICAgICAgICAqIGNvbnRhY3QgaWYgbm8gbWF0Y2hpbmcgY29udGFjdCBmb3VuZC4gT3RoZXJ3aXNlLCBkZWZhdWx0IGJlaGF2aW9yIGlzCiAgICAgICAgICAqIHRvIHByb21wdCB1c2VyIHdpdGggZGlhbG9nIGJlZm9yZSBjcmVhdGluZy4KQEAgLTU2NzQsNiArNjE5MCwyMyBAQAogICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmFjdGlvbi5DUkVBVEVfREVTQ1JJUFRJT04iOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fR0VUX01VTFRJUExFX1BIT05FU30gYXMgdGhlIGlucHV0IG9yIG91dHB1dCB2YWx1ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdhbnQgdG8gYmUgcGlja2VkIGJ5IGRlZmF1bHQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcworICAgICAgICAgKiBpbnB1dCB2YWx1ZS4gVGhlc2UgcGhvbmUgbnVtYmVycyBjb3VsZCBiZWxvbmcgdG8gdGhlIGNvbnRhY3RzIG9yIG5vdC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBwaG9uZSBudW1iZXJzIHdoaWNoIHdlcmUgcGlja2VkIGJ5IHRoZSB1c2VyIGFyZSByZXR1cm5lZCBhcyBvdXRwdXQKKyAgICAgICAgICogdmFsdWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlOiBhcnJheSBvZiBVUklzLCB0aGUgdGVsIFVSSSBpcyB1c2VkIGZvciB0aGUgcGhvbmUgbnVtYmVycyB3aGljaCBkb24ndAorICAgICAgICAgKiBiZWxvbmcgdG8gYW55IGNvbnRhY3QsIHRoZSBjb250ZW50IFVSSSBpcyB1c2VkIGZvciBwaG9uZSBpZCBpbiBjb250YWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1BIT05FX1VSSVMgPQorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNvbnRhY3RzLmV4dHJhLlBIT05FX1VSSVMiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBPcHRpb25hbCBleHRyYSB1c2VkIHdpdGgge0BsaW5rICNTSE9XX09SX0NSRUFURV9DT05UQUNUfSB0byBzcGVjaWZ5IGEKICAgICAgICAgICogZGlhbG9nIGxvY2F0aW9uIHVzaW5nIHNjcmVlbiBjb29yZGluYXRlcy4gV2hlbiBub3Qgc3BlY2lmaWVkLCB0aGUKICAgICAgICAgICogZGlhbG9nIHdpbGwgYmUgY2VudGVyZWQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRHJtU3RvcmUuamF2YQppbmRleCBjNDM4YWM0Li4zNGYyZjBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Ecm1TdG9yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0RybVN0b3JlLmphdmEKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGluc2VydGluZyBhIGZpbGUgc3RyZWFtIGludG8gdGhlIERSTSBjb250ZW50IHByb3ZpZGVyLgogICAgICAqCiAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZQotICAgICAqIEBwYXJhbSBmaWxlU3RyZWFtIFRoZSBGaWxlSW5wdXRTdHJlYW0gdG8gaW5zZXJ0CisgICAgICogQHBhcmFtIGZpcyBUaGUgRmlsZUlucHV0U3RyZWFtIHRvIGluc2VydAogICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgZm9yIHRoZSBjb250ZW50IChvciBudWxsKQogICAgICAqIEByZXR1cm4gdXJpIHRvIHRoZSBEUk0gcmVjb3JkIG9yIG51bGwKICAgICAgKi8KQEAgLTE0MywxMSArMTQzLDExIEBACiAgICAgICAgICAgICBEcm1SYXdDb250ZW50IGNvbnRlbnQgPSBuZXcgRHJtUmF3Q29udGVudChmaXMsIChpbnQpIGZpcy5hdmFpbGFibGUoKSwKICAgICAgICAgICAgICAgICAgICAgRHJtUmF3Q29udGVudC5EUk1fTUlNRVRZUEVfTUVTU0FHRV9TVFJJTkcpOwogICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gY29udGVudC5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgbG9uZyBzaXplID0gZmlzLmdldENoYW5uZWwoKS5zaXplKCk7CiAKICAgICAgICAgICAgIERybVJpZ2h0c01hbmFnZXIgbWFuYWdlciA9IG1hbmFnZXIgPSBEcm1SaWdodHNNYW5hZ2VyLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICBEcm1SaWdodHMgcmlnaHRzID0gbWFuYWdlci5xdWVyeVJpZ2h0cyhjb250ZW50KTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNvbnRlbnQuZ2V0Q29udGVudElucHV0U3RyZWFtKHJpZ2h0cyk7Ci0gICAgICAgICAgICBsb25nIHNpemUgPSBzdHJlYW0uYXZhaWxhYmxlKCk7CiAKICAgICAgICAgICAgIFVyaSBjb250ZW50VXJpID0gbnVsbDsKICAgICAgICAgICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTWVkaWFTdG9yZS5qYXZhCmluZGV4IDA3NWRhMzMuLjE0MTdlZjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL01lZGlhU3RvcmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9NZWRpYVN0b3JlLmphdmEKQEAgLTI1Myw5ICsyNTMsMTA3IEBACiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAibWltZV90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJvdyBJRCBpbiB0aGUgTVRQIG9iamVjdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgZmlsZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1UUF9PQkpFQ1RfSUQgPSAib2JqZWN0X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIE1UUCBvYmplY3QgaGFuZGxlIG9mIGEgbmV3bHkgdHJhbnNmZXJlZCBmaWxlLgorICAgICAgICAgKiBVc2VkIHRvIHBhc3MgdGhlIG5ldyBmaWxlJ3Mgb2JqZWN0IGhhbmRsZSB0aHJvdWdoIHRoZSBtZWRpYSBzY2FubmVyCisgICAgICAgICAqIGZyb20gTVRQIHRvIHRoZSBtZWRpYSBwcm92aWRlcgorICAgICAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgYnkgTVRQLCBtZWRpYSBzY2FubmVyIGFuZCBtZWRpYSBwcm92aWRlci4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCA9ICJtZWRpYV9zY2FubmVyX25ld19vYmplY3RfaWQiOwogICAgICB9CiAKICAgICAvKioKKyAgICAgKiBNZWRpYSBwcm92aWRlciB0YWJsZSBjb250YWluaW5nIGFuIGluZGV4IG9mIGFsbCBmaWxlcyBpbiB0aGUgc3RvcmFnZS4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0byBmaW5kIGFsbCBkb2N1bWVudHMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUKKyAgICAgKiBhbmQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGRldmljZSBzaWRlIE1UUCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZXMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi9maWxlIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBnZXRDb250ZW50VXJpKFN0cmluZyB2b2x1bWVOYW1lLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZUlkKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgdm9sdW1lTmFtZQorICAgICAgICAgICAgICAgICAgICArICIvZmlsZS8iICsgZmlsZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldE10cE9iamVjdHNVcmkoU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi9vYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldE10cE9iamVjdHNVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBmaWxlSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIGZpbGVJZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2VkIHRvIGltcGxlbWVudCB0aGUgTVRQIEdldE9iamVjdFJlZmVyZW5jZXMgYW5kIFNldE9iamVjdFJlZmVyZW5jZXMgY29tbWFuZHMuCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGdldE10cFJlZmVyZW5jZXNVcmkoU3RyaW5nIHZvbHVtZU5hbWUsCisgICAgICAgICAgICAgICAgbG9uZyBmaWxlSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfU0xBU0ggKyB2b2x1bWVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIGZpbGVJZCArICIvcmVmZXJlbmNlcyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpZWxkcyBmb3IgbWFzdGVyIHRhYmxlIGZvciBhbGwgbWVkaWEgZmlsZXMuCisgICAgICAgICAqIFRhYmxlIGFsc28gY29udGFpbnMgTWVkaWFDb2x1bW5zLl9JRCwgREFUQSwgU0laRSBhbmQgREFURV9NT0RJRklFRC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmlsZUNvbHVtbnMgZXh0ZW5kcyBNZWRpYUNvbHVtbnMgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgTVRQIGZvcm1hdCBjb2RlIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVCA9ICJwYXJlbnQiOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBtZWRpYSB0YWJsZSBjb250YWluaW5nIHRoZSBmaWxlLgorICAgICAgICAgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IE1lZGlhUHJvdmlkZXIKKyAgICAgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RBQkxFID0gIm1lZGlhX3RhYmxlIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgaW4gaXRzIG1lZGlhIHRhYmxlLgorICAgICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfSUQgPSAibWVkaWFfaWQiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGZpbGUKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRSA9ICJtaW1lX3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGNvbnRlbnQKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSBJbWFnZXMuVGh1bWJuYWlscyBhbmQgVmlkZW8uVGh1bWJuYWlscywgaXQncyBub3QgaW50ZW5kZWQKICAgICAgKiB0byBiZSBhY2Nlc3NlZCBlbHNld2hlcmUuCiAgICAgICovCkBAIC0zMzUsMjYgKzQzMywyNyBAQAogICAgICAgICAgICAgLy8gTG9nLnYoVEFHLCAiZ2V0VGh1bWJuYWlsOiBvcmlnSWQ9IitvcmlnSWQrIiwga2luZD0iK2tpbmQrIiwgaXNWaWRlbz0iK2lzVmlkZW8pOwogICAgICAgICAgICAgLy8gSWYgdGhlIG1hZ2ljIGlzIG5vbi16ZXJvLCB3ZSBzaW1wbHkgcmV0dXJuIHRodW1ibmFpbCBpZiBpdCBkb2VzIGV4aXN0LgogICAgICAgICAgICAgLy8gcXVlcnlpbmcgTWVkaWFQcm92aWRlciBhbmQgc2ltcGx5IHJldHVybiB0aHVtYm5haWwuCi0gICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IE1pbmlUaHVtYkZpbGUuaW5zdGFuY2UoYmFzZVVyaSk7Ci0gICAgICAgICAgICBsb25nIG1hZ2ljID0gdGh1bWJGaWxlLmdldE1hZ2ljKG9yaWdJZCk7Ci0gICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChraW5kID09IE1JQ1JPX0tJTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzVGh1bWJCdWZMb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVGh1bWJCdWYgPSBuZXcgYnl0ZVtNaW5pVGh1bWJGaWxlLkJZVEVTX1BFUl9NSU5USFVNQl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoc1RodW1iQnVmLCAwLCBzVGh1bWJCdWYubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICBNaW5pVGh1bWJGaWxlIHRodW1iRmlsZSA9IG5ldyBNaW5pVGh1bWJGaWxlKGlzVmlkZW8gPyBWaWRlby5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSQorICAgICAgICAgICAgICAgICAgICA6IEltYWdlcy5NZWRpYS5FWFRFUk5BTF9DT05URU5UX1VSSSk7CisgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbWFnaWMgPSB0aHVtYkZpbGUuZ2V0TWFnaWMob3JpZ0lkKTsKKyAgICAgICAgICAgICAgICBpZiAobWFnaWMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBNSUNST19LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUaHVtYkJ1ZkxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1RodW1iQnVmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1RodW1iQnVmID0gbmV3IGJ5dGVbTWluaVRodW1iRmlsZS5CWVRFU19QRVJfTUlOVEhVTUJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGh1bWJGaWxlLmdldE1pbmlUaHVtYkZyb21GaWxlKG9yaWdJZCwgc1RodW1iQnVmKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KHNUaHVtYkJ1ZiwgMCwgc1RodW1iQnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY291bGRuJ3QgZGVjb2RlIGJ5dGUgYXJyYXkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gTUlOSV9LSU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2x1bW4gPSBpc1ZpZGVvID8gInZpZGVvX2lkPSIgOiAiaW1hZ2VfaWQ9IjsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09IE1JTklfS0lORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbHVtbiA9IGlzVmlkZW8gPyAidmlkZW9faWQ9IiA6ICJpbWFnZV9pZD0iOwogICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJhc2VVcmksIFBST0pFQ1RJT04sIGNvbHVtbiArIG9yaWdJZCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCA9IGdldE1pbmlUaHVtYkZyb21GaWxlKGMsIGJhc2VVcmksIGNyLCBvcHRpb25zKTsKQEAgLTM2MiwxNyArNDYxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFVyaSBibG9ja2luZ1VyaSA9IGJhc2VVcmkuYnVpbGRVcG9uKCkuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoImJsb2NraW5nIiwgIjEiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKCJvcmlnX2lkIiwgU3RyaW5nLnZhbHVlT2Yob3JpZ0lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZ3JvdXBfaWQiLCBTdHJpbmcudmFsdWVPZihncm91cElkKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgYyA9IGNyLnF1ZXJ5KGJsb2NraW5nVXJpLCBQUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBvcmlnaW5hbCBpbWFnZS92aWRlbyBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHJldHVybiBudWxsOwpAQCAtNDIzLDYgKzUxOCw5IEBACiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBleCk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgICAgIHRodW1iRmlsZS5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICAgICAgdGh1bWJGaWxlID0gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvTXRwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL010cC5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogVGhlIE1UUCBwcm92aWRlciBzdXBwb3J0cyBhY2Nlc3NpbmcgY29udGVudCBvbiBNVFAgYW5kIFBUUCBkZXZpY2VzLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE10cAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiTXRwIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJtdHAiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIID0gImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggPSAiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2RldmljZS8iOworCisKKyAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246ICBBIGJyb2FkY2FzdCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGFuIE1UUCBzZXNzaW9uIHdpdGggdGhlIGhvc3QuCisgICAgICogVGhpcyBicm9hZGNhc3QgaXMgb25seSBzZW50IGlmIE1UUCBhY3Rpdml0eSBoYXMgbW9kaWZpZWQgdGhlIG1lZGlhIGRhdGFiYXNlIGR1cmluZyB0aGUKKyAgICAgKiBtb3N0IHJlY2VudCBNVFAgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NVFBfU0VTU0lPTl9FTkQgPSAiYW5kcm9pZC5wcm92aWRlci5hY3Rpb24uTVRQX1NFU1NJT05fRU5EIjsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2YgYWxsIE1UUC9QVFAgZGV2aWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGV2aWNlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX1NMQVNIICsgImRldmljZSIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFudWZhY3R1cmVyIG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTlVGQUNUVVJFUiA9ICJtYW51ZmFjdHVyZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTCA9ICJtb2RlbCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbnMgbGlzdCBvZiBzdG9yYWdlIHVuaXRzIGZvciBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIFVyaSBnZXRDb250ZW50VXJpKGludCBkZXZpY2VJRCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaS5wYXJzZShDT05URU5UX0FVVEhPUklUWV9ERVZJQ0VfU0xBU0ggKyBkZXZpY2VJRCArICIvc3RvcmFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaShpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU3RvcmFnZSB1bml0IGlkZW50aWZpZXIKKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0b3JhZ2UgdW5pdCBkZXNjcmlwdGlvbgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGxpc3Qgb2Ygb2JqZWN0cyBvbiBhbiBNVFAvUFRQIGRldmljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0IGltcGxlbWVudHMgQmFzZUNvbHVtbnMgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXJpIGdldENvbnRlbnRVcmkoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL29iamVjdC8iICsgb2JqZWN0SUQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvck9iamVjdENoaWxkcmVuKGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpLnBhcnNlKENPTlRFTlRfQVVUSE9SSVRZX0RFVklDRV9TTEFTSCArIGRldmljZUlECisgICAgICAgICAgICAgICAgICAgICsgIi9vYmplY3QvIiArIG9iamVjdElEICsgIi9jaGlsZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVcmkgZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihpbnQgZGV2aWNlSUQsIGludCBzdG9yYWdlSUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmkucGFyc2UoQ09OVEVOVF9BVVRIT1JJVFlfREVWSUNFX1NMQVNIICsgZGV2aWNlSUQKKyAgICAgICAgICAgICAgICAgICAgKyAiL3N0b3JhZ2UvIiArIHN0b3JhZ2VJRCArICIvY2hpbGQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGNvbHVtbnMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIGluIHRoZSBPYmplY3RJbmZvIGRhdGFzZXQKKyAgICAgICAgICogYXMgZGVzY3JpYmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBJRCBvZiB0aGUgc3RvcmFnZSB1bml0IGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfSUQgPSAic3RvcmFnZV9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvYmplY3QncyBmb3JtYXQuICBDYW4gYmUgb25lIG9mIHRoZSBGT1JNQVRfKiBzeW1ib2xzIGJlbG93LAorICAgICAgICAgKiBvciBhbnkgb2YgdGhlIHZhbGlkIE1UUCBvYmplY3QgZm9ybWF0cyBhcyBkZWZpbmVkIGluIHRoZSBNVFAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIG9iamVjdC4gIFNlZSB0aGUgUFJPVEVDVElPTl9TVEFUVVNfKnN5bWJvbHMgYmVsb3cuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNUSU9OX1NUQVRVUyA9ICJwcm90ZWN0aW9uX3N0YXR1cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFID0gInNpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2JqZWN0J3MgdGh1bWJuYWlsIGZvcm1hdC4gIENhbiBiZSBvbmUgb2YgdGhlIEZPUk1BVF8qIHN5bWJvbHMgYmVsb3csCisgICAgICAgICAqIG9yIGFueSBvZiB0aGUgdmFsaWQgTVRQIG9iamVjdCBmb3JtYXRzIGFzIGRlZmluZWQgaW4gdGhlIE1UUCBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhVTUJfRk9STUFUID0gImZvcm1hdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3QncyB0aHVtYm5haWwgaW4gYnl0ZXMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9TSVpFID0gInRodW1iX3NpemUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9XSURUSCA9ICJ0aHVtYl93aWR0aCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIG9iamVjdCdzIHRodW1ibmFpbCBpbiBwaXhlbHMuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFVNQl9IRUlHSFQgPSAidGh1bWJfaGVpZ2h0IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9iamVjdCdzIHRodW1ibmFpbC4KKyAgICAgICAgICogPFA+VHlwZTogQkxPQjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CID0gInRodW1iIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfV0lEVEggPSAiaW1hZ2Vfd2lkdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBvYmplY3QgaW4gcGl4ZWxzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEVJR0hUID0gImltYWdlX2hlaWdodCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZXB0aCBvZiB0aGUgb2JqZWN0IGluIGJpdHMgcGVyIHBpeGVsLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfREVQVEggPSAiaW1hZ2VfZGVwdGgiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIG9iamVjdCdzIHBhcmVudCwgb3IgemVybyBpZiB0aGUgb2JqZWN0CisgICAgICAgICAqIGlzIGluIHRoZSByb290IG9mIGl0cyBzdG9yYWdlIHVuaXQuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlQgPSAicGFyZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzc29jaWF0aW9uIHR5cGUgZm9yIGEgY29udGFpbmVyIG9iamVjdC4KKyAgICAgICAgICogRm9yIGZvbGRlcnMgdGhpcyBpcyB0eXBpY2FsbHkge0BsaW5rICNBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSfQorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fVFlQRSA9ICJhc3NvY2lhdGlvbl90eXBlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgb2JqZWN0cy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX0RFU0MgPSAiYXNzb2NpYXRpb25fZGVzYyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgZm9yIGFuIGFzc29jaWF0aW9uCisgICAgICAgICAqIGNvbnRhaW5pbmcgaW1hZ2VzIHRha2VuIGluIHNlcXVlbmNlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfTlVNQkVSID0gInNlcXVlbmNlX251bWJlciI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfQ1JFQVRFRCA9ICJkYXRlX2NyZWF0ZWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0ZSB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLCBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MC4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfTU9ESUZJRUQgPSAiZGF0ZV9tb2RpZmllZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbGlzdCBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LCBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRFMgPSAia2V5d29yZHMiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCmluZGV4IDE5NmM5YWMuLjQ2YmRlMzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQpAQCAtMTYsMTQgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0Lk1hcHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKIAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UXVlcnlNYXA7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTM4LDE5ICszNSwxNCBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BbmRyb2lkRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIAogLyoqCkBAIC0xMDA5LDcgKzEwMDEsNyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RpbmdDb25maWd1cmF0aW9uQ2hhbmdlcyhpbnQgY2hhbmdlcykgewogICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VzJkFjdGl2aXR5SW5mby5DT05GSUdfRk9OVF9TQ0FMRSkgIT0gMDsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0dUYWxrU2VydmljZVN0YXR1cyhDb250ZW50UmVzb2x2ZXIgY3IpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRJbnQoY3IsIFNIT1dfR1RBTEtfU0VSVklDRV9TVEFUVVMsIDApICE9IDA7CiAgICAgICAgIH0KQEAgLTEyMTYsNyArMTIwOCw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0tfUEFUVEVSTl9WSVNJQkxFID0gImxvY2tfcGF0dGVybl92aXNpYmxlX3BhdHRlcm4iOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgCisgICAgICAgICAqIEBkZXByZWNhdGVkIFVzZQogICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUjTE9DS19QQVRURVJOX1RBQ1RJTEVfRkVFREJBQ0tfRU5BQkxFRH0KICAgICAgICAgICogaW5zdGVhZAogICAgICAgICAgKi8KQEAgLTE2OTQsNiArMTY4NiwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xNzg5LDYgKzE3ODcsNyBAQAogICAgICAgICAgICAgTE9DS1NDUkVFTl9TT1VORFNfRU5BQkxFRCwKICAgICAgICAgICAgIFNIT1dfV0VCX1NVR0dFU1RJT05TLAogICAgICAgICAgICAgTk9USUZJQ0FUSU9OX0xJR0hUX1BVTFNFLAorICAgICAgICAgICAgVVNFX1BUUF9JTlRFUkZBQ0UsCiAgICAgICAgICAgICBTSVBfQ0FMTF9PUFRJT05TLAogICAgICAgICAgICAgU0lQX1JFQ0VJVkVfQ0FMTFMKICAgICAgICAgfTsKQEAgLTIzMjcsNiArMjMyNiwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUga2V5IHRoYXQgcmV0cmlldmVzIGEgYmx1ZXRvb3RoIElucHV0IERldmljZSdzIHByaW9yaXR5LgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShTdHJpbmcgYWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuICgiYmx1ZXRvb3RoX2lucHV0X2RldmljZV9wcmlvcml0eV8iICsgYWRkcmVzcy50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCBkYXRhIHJvYW1pbmcgaXMgZW5hYmxlZC4gKDAgPSBmYWxzZSwgMSA9IHRydWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1JPQU1JTkcgPSAiZGF0YV9yb2FtaW5nIjsKQEAgLTIzNTgsMTEgKzIzNjUsMzIgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfU1lTVEVNX0lOUFVUX01FVEhPRFMgPSAiZGlzYWJsZWRfc3lzdGVtX2lucHV0X21ldGhvZHMiOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBIb3N0IG5hbWUgYW5kIHBvcnQgZm9yIGEgdXNlci1zZWxlY3RlZCBwcm94eS4KKyAgICAgICAgICogSG9zdCBuYW1lIGFuZCBwb3J0IGZvciBnbG9iYWwgcHJveHkuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZID0gImh0dHBfcHJveHkiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNsdXNpb24gbGlzdCBmb3IgZ2xvYmFsIHByb3h5LiBUaGlzIHN0cmluZyBjb250YWlucyBhIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisgICAgICAgICAqIGRvbWFpbnMgd2hlcmUgdGhlIGdsb2JhbCBwcm94eSBkb2VzIG5vdCBhcHBseS4gRG9tYWlucyBzaG91bGQgYmUgbGlzdGVkIGluIGEgY29tbWEtCisgICAgICAgICAqIHNlcGFyYXRlZCBsaXN0LiBFeGFtcGxlIG9mIGFjY2VwdGFibGUgZm9ybWF0czogIi5kb21haW4xLmNvbSxteS5kb21haW4yLmNvbSIKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfRVhDTFVTSU9OX0xJU1QgPSAiaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuYWJsZXMgdGhlIFVJIHNldHRpbmcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZ2xvYmFsIEhUVFAgcHJveHkKKyAgICAgICAgICogYW5kIGFzc29jaWF0ZWQgZXhjbHVzaW9uIGxpc3QuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfR0xPQkFMX0hUVFBfUFJPWFkgPSAic2V0X2dsb2JhbF9odHRwX3Byb3h5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBmb3IgZGVmYXVsdCBETlMgaW4gY2FzZSBub2JvZHkgc3VnZ2VzdHMgb25lCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ROU19TRVJWRVIgPSAiZGVmYXVsdF9kbnNfc2VydmVyIjsKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQogICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgogICAgICAgICAgKgpAQCAtMjM5Myw2ICsyNDIxLDE0IEBACiAgICAgICAgICAgICAibG9ja19wYXR0ZXJuX3RhY3RpbGVfZmVlZGJhY2tfZW5hYmxlZCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgcHJlZmVyZW5jZSBhbGxvd3MgdGhlIGRldmljZSB0byBiZSBsb2NrZWQgZ2l2ZW4gdGltZSBhZnRlciBzY3JlZW4gZ29lcyBvZmYsCisgICAgICAgICAqIHN1YmplY3QgdG8gY3VycmVudCBEZXZpY2VBZG1pbiBwb2xpY3kgbGltaXRzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19TQ1JFRU5fTE9DS19BRlRFUl9USU1FT1VUID0gImxvY2tfc2NyZWVuX2xvY2tfYWZ0ZXJfdGltZW91dCI7CisKKworICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciBhc3Npc3RlZCBHUFMgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgogICAgICAgICAgKiBAaGlkZQogICAgICAgICAgKi8KQEAgLTI0NTMsNiArMjQ4OSwxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRBTF9DT05UUk9MX1JFRElSRUNUX1VSTCA9ICJwYXJlbnRhbF9jb250cm9sX3JlZGlyZWN0X3VybCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoZSBmcmVxdWVuY3kgb2YgU2FtcGxpbmdQcm9maWxlcgorICAgICAgICAgKiB0YWtpbmcgc25hcHNob3RzIGluIGhlcnR6LiBaZXJvIHZhbHVlIG1lYW5zIFNhbXBsaW5nUHJvZmlsZXIgaXMgZGlzYWJsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTElOR19QUk9GSUxFUl9IWiA9ICJzYW1wbGluZ19wcm9maWxlcl9oeiI7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFNldHRpbmdzIGNsYXNzbmFtZSB0byBsYXVuY2ggd2hlbiBTZXR0aW5ncyBpcyBjbGlja2VkIGZyb20gQWxsCiAgICAgICAgICAqIEFwcGxpY2F0aW9ucy4gIE5lZWRlZCBiZWNhdXNlIG9mIHVzZXIgdGVzdGluZyBiZXR3ZWVuIHRoZSBvbGQKICAgICAgICAgICogYW5kIG5ldyBTZXR0aW5ncyBhcHBzLgpAQCAtMzYzNiwyMCArMzY4MCw4IEBACiAgICAgICAgICAgICAvLyBJZiBhIHNob3J0Y3V0IGlzIHN1cHBsaWVkLCBhbmQgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIGZvcgogICAgICAgICAgICAgLy8gYW5vdGhlciBib29rbWFyaywgdGhlbiByZW1vdmUgdGhlIG9sZCBkZWZpbml0aW9uLgogICAgICAgICAgICAgaWYgKHNob3J0Y3V0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBDdXJzb3IgYyA9IGNyLnF1ZXJ5KENPTlRFTlRfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgc1Nob3J0Y3V0UHJvamVjdGlvbiwgc1Nob3J0Y3V0U2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgU3RyaW5nLnZhbHVlT2YoKGludCkgc2hvcnRjdXQpIH0sIG51bGwpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjLmRlbGV0ZVJvdygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvdWxkIG5vdCBkZWxldGUgZXhpc3Rpbmcgc2hvcnRjdXQgcm93Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjci5kZWxldGUoQ09OVEVOVF9VUkksIHNTaG9ydGN1dFNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKChpbnQpIHNob3J0Y3V0KSB9KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCmluZGV4IDA1YmU1MmFhLi5mZGUzNzY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoRXZlbnRMb29wLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aEV2ZW50TG9vcC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhDbGFzczsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUGFuOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTM2NCw3ICszNjYsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIGxvZygiRGV2aWNlIHByb3BlcnR5IGNoYW5nZWQ6IiArIGFkZHJlc3MgKyAicHJvcGVydHk6IiArIG5hbWUpOworICAgICAgICAgICAgbG9nKCJEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiIHByb3BlcnR5OiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgdmFsdWU6ICIgKyBwcm9wVmFsdWVzWzFdKTsKICAgICAgICAgfQogICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOwogICAgICAgICBpZiAobmFtZS5lcXVhbHMoIk5hbWUiKSkgewpAQCAtNDMzLDYgKzQzNiwzOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHBhdGgsIFN0cmluZ1tdIHByb3BWYWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQ6IEFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBkZXZpY2UgaW4gbnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGxvZygiIElucHV0IERldmljZSA6IE5hbWUgb2YgUHJvcGVydHkgaXM6IiArIHByb3BWYWx1ZXNbMF0pOworICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBzdGF0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUJsdWV0b290aFNlcnZpY2UuaGFuZGxlSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZShhZGRyZXNzLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBkZXZpY2VPYmplY3RQYXRoLCBTdHJpbmdbXSBwcm9wVmFsdWVzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvcFZhbHVlc1swXTsKKyAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgoZGV2aWNlT2JqZWN0UGF0aCk7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uUGFuRGV2aWNlUHJvcGVydHlDaGFuZ2VkOiBBZGRyZXNzIG9mIHRoZSByZW1vdGUgZGV2aWNlIGluIG51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBsb2coIlBhbiBEZXZpY2UgcHJvcGVydHkgY2hhbmdlZDogIiArIGFkZHJlc3MgKyAiICBwcm9wZXJ0eTogIgorICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiIHZhbHVlOiAiKyBwcm9wVmFsdWVzWzFdKTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkNvbm5lY3RlZCIpKSB7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBwcm9wVmFsdWVzWzFdLmVxdWFscygidHJ1ZSIpID8gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEIDoKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUGFpcmluZ1JlcXVlc3RBbmRHZXRBZGRyZXNzKFN0cmluZyBvYmplY3RQYXRoLCBpbnQgbmF0aXZlRGF0YSkgewogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewpAQCAtNTc5LDYgKzYxNSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG9uQWdlbnRBdXRob3JpemUoU3RyaW5nIG9iamVjdFBhdGgsIFN0cmluZyBkZXZpY2VVdWlkKSB7CisgICAgICAgIGlmICghbUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkpIHJldHVybiBmYWxzZTsKKwogICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldEFkZHJlc3NGcm9tT2JqZWN0UGF0aChvYmplY3RQYXRoKTsKICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGdldCBkZXZpY2UgYWRkcmVzcyBpbiBvbkF1dGhBZ2VudEF1dGhvcml6ZSIpOwpAQCAtNTg3LDE1ICs2MjUsMTUgQEAKIAogICAgICAgICBib29sZWFuIGF1dGhvcml6ZWQgPSBmYWxzZTsKICAgICAgICAgUGFyY2VsVXVpZCB1dWlkID0gUGFyY2VsVXVpZC5mcm9tU3RyaW5nKGRldmljZVV1aWQpOwotICAgICAgICBCbHVldG9vdGhBMmRwIGEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CiAKICAgICAgICAgLy8gQmx1ZXogc2VuZHMgdGhlIFVVSUQgb2YgdGhlIGxvY2FsIHNlcnZpY2UgYmVpbmcgYWNjZXNzZWQsIF9ub3RfIHRoZQogICAgICAgICAvLyByZW1vdGUgc2VydmljZQotICAgICAgICBpZiAobUJsdWV0b290aFNlcnZpY2UuaXNFbmFibGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoQmx1ZXRvb3RoVXVpZC5pc0F1ZGlvU291cmNlKHV1aWQpIHx8IEJsdWV0b290aFV1aWQuaXNBdnJjcFRhcmdldCh1dWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc090aGVyU2lua0luTm9uRGlzY29ubmVjdGluZ1N0YXRlKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBpZiAoKEJsdWV0b290aFV1aWQuaXNBdWRpb1NvdXJjZSh1dWlkKSB8fCBCbHVldG9vdGhVdWlkLmlzQXZyY3BUYXJnZXQodXVpZCkKKyAgICAgICAgICAgICAgfHwgQmx1ZXRvb3RoVXVpZC5pc0FkdkF1ZGlvRGlzdCh1dWlkKSkgJiYKKyAgICAgICAgICAgICAgIWlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoYWRkcmVzcykpIHsKKyAgICAgICAgICAgIEJsdWV0b290aEEyZHAgYTJkcCA9IG5ldyBCbHVldG9vdGhBMmRwKG1Db250ZXh0KTsKKwogICAgICAgICAgICAgYXV0aG9yaXplZCA9IGEyZHAuZ2V0U2lua1ByaW9yaXR5KGRldmljZSkgPiBCbHVldG9vdGhBMmRwLlBSSU9SSVRZX09GRjsKICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQWxsb3dpbmcgaW5jb21pbmcgQTJEUCAvIEFWUkNQIGNvbm5lY3Rpb24gZnJvbSAiICsgYWRkcmVzcyk7CkBAIC02MDMsNiArNjQxLDE4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBBMkRQIC8gQVZSQ1AgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhVdWlkLmlzSW5wdXREZXZpY2UodXVpZCkgJiYgIWlzT3RoZXJJbnB1dERldmljZUNvbm5lY3RlZChhZGRyZXNzKSkgeworICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UgaW5wdXREZXZpY2UgPSBuZXcgQmx1ZXRvb3RoSW5wdXREZXZpY2UobUNvbnRleHQpOworICAgICAgICAgICAgYXV0aG9yaXplZCA9IGlucHV0RGV2aWNlLmdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT0ZGOworICAgICAgICAgICAgIGlmIChhdXRob3JpemVkKSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkFsbG93aW5nIGluY29taW5nIEhJRCBjb25uZWN0aW9uIGZyb20gIiArIGFkZHJlc3MpOworICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyBISUQgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoVXVpZC5pc0JuZXAodXVpZCkgfHwgQmx1ZXRvb3RoVXVpZC5pc05hcCh1dWlkKSAmJgorICAgICAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmlzVGV0aGVyaW5nT24oKSl7CisgICAgICAgICAgICBhdXRob3JpemVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExvZy5pKFRBRywgIlJlamVjdGluZyBpbmNvbWluZyAiICsgZGV2aWNlVXVpZCArICIgY29ubmVjdGlvbiBmcm9tICIgKyBhZGRyZXNzKTsKICAgICAgICAgfQpAQCAtNjEwLDcgKzY2MCwxOSBAQAogICAgICAgICByZXR1cm4gYXV0aG9yaXplZDsKICAgICB9CiAKLSAgICBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPdGhlcklucHV0RGV2aWNlQ29ubmVjdGVkKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPQorICAgICAgICAgICAgbUJsdWV0b290aFNlcnZpY2UubG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMobmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUR9KTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoIWRldmljZS5nZXRBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3RoZXJTaW5rSW5Ob25EaXNjb25uZWN0aW5nU3RhdGUoU3RyaW5nIGFkZHJlc3MpIHsKICAgICAgICAgQmx1ZXRvb3RoQTJkcCBhMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwogICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gYTJkcC5nZXROb25EaXNjb25uZWN0ZWRTaW5rcygpOwogICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwpAQCAtNjYxLDYgKzcyMyw2MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlc3VsdCkgeworICAgICAgICAvLyBTdWNjZXNzIGNhc2UgZ2V0cyBoYW5kbGVkIGJ5IFByb3BlcnR5IENoYW5nZSBzaWduYWwKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0QWRkcmVzc0Zyb21PYmplY3RQYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IG1BZGFwdGVyLmdldFJlbW90ZURldmljZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhTZXJ2aWNlLmdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdC4gU3RhdGUgaXM6IiArIHN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoYWRkcmVzcywgY29ubmVjdGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVzdWx0KSB7CisgICAgICAgIGxvZyAoIm9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCAiICsgcGF0aCArICIgIiArIHJlc3VsdCk7CisgICAgICAgIC8vIFN1Y2Nlc3MgY2FzZSBnZXRzIGhhbmRsZWQgYnkgUHJvcGVydHkgQ2hhbmdlIHNpZ25hbAorICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBtQmx1ZXRvb3RoU2VydmljZS5nZXRBZGRyZXNzRnJvbU9iamVjdFBhdGgocGF0aCk7CisgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aFNlcnZpY2UuZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdC4gU3RhdGUgaXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhdGUgKyAiIHJlc3VsdDogIisgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBuZXdTdGF0ZSA9IGNvbm5lY3RlZD8gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIG1CbHVldG9vdGhTZXJ2aWNlLmhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgbmV3U3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZChTdHJpbmcgYWRkcmVzcykgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbk5ldHdvcmtEZXZpY2VDb25uZWN0ZWQoU3RyaW5nIGFkZHJlc3MsIGludCBkZXN0VXVpZCkgeworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gbUFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKGFkZHJlc3MpOworICAgICAgICBtQmx1ZXRvb3RoU2VydmljZS5oYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBvblJlc3RhcnRSZXF1aXJlZCgpIHsKICAgICAgICAgaWYgKG1CbHVldG9vdGhTZXJ2aWNlLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBMb2cuZShUQUcsICIqKiogQSBzZXJpb3VzIGVycm9yIG9jY3VyZWQgKGRpZCBibHVldG9vdGhkIGNyYXNoPykgLSAiICsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCmluZGV4IGIyYWEwNGQuLjcyNTI3MzYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQpAQCAtMjksNyArMjksOSBAQAogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0OwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZVN0YXRlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aElucHV0RGV2aWNlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFNvY2tldDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhVdWlkOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLklCbHVldG9vdGg7CkBAIC00MCw5ICs0MiwxMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbFV1aWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CkBAIC03MCw4ICs3NSwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgQmx1ZXRvb3RoU2VydmljZSBleHRlbmRzIElCbHVldG9vdGguU3R1YiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhTZXJ2aWNlIjsKQEAgLTg0LDYgKzkxLDcgQEAKICAgICBwcml2YXRlIGludCBtQmx1ZXRvb3RoU3RhdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXN0YXJ0ID0gZmFsc2U7ICAvLyBuZWVkIHRvIGNhbGwgZW5hYmxlKCkgYWZ0ZXIgZGlzYWJsZSgpCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Rpc2NvdmVyaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nT247CiAKICAgICBwcml2YXRlIEJsdWV0b290aEFkYXB0ZXIgbUFkYXB0ZXI7ICAvLyBjb25zdGFudCBhZnRlciBpbml0KCkKICAgICBwcml2YXRlIGZpbmFsIEJvbmRTdGF0ZSBtQm9uZFN0YXRlID0gbmV3IEJvbmRTdGF0ZSgpOyAgLy8gbG9jYWwgY2FjaGUgb2YgYm9uZGluZ3MKQEAgLTEwNCw2ICsxMTIsMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9VVUlEX0lOVEVOVCA9IDM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRElTQ09WRVJBQkxFX1RJTUVPVVQgPSA0OwogCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUVUT09USF9ORUFSX0lGQUNFX0FERFJfUFJFRklYPSAiMTkyLjE2OC40NC4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFVE9PVEhfTkVUTUFTSyAgICAgICAgPSAiMjU1LjI1NS4yNTUuMCI7CisKICAgICAvLyBUaGUgdGltZW91dCB1c2VkIHRvIHNlbnQgdGhlIFVVSURzIEludGVudAogICAgIC8vIFRoaXMgdGltZW91dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBwYWdlIHRpbWVvdXQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9JTlRFTlRfREVMQVkgPSA2MDAwOwpAQCAtMTI3LDggKzEzOSwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZT4gbURldmljZVByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtQTJkcFByb2ZpbGVTdGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIEJsdWV0b290aFByb2ZpbGVTdGF0ZSBtSGZwUHJvZmlsZVN0YXRlOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlIG1IaWRQcm9maWxlU3RhdGU7CiAKICAgICBwcml2YXRlIEJsdWV0b290aEEyZHBTZXJ2aWNlIG1BMmRwU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPiBtSW5wdXREZXZpY2VzOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+IG1QYW5EZXZpY2VzOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1Eb2NrQWRkcmVzczsKICAgICBwcml2YXRlIFN0cmluZyBtRG9ja1BpbjsKIApAQCAtMTc5LDYgKzE5NSw3IEBACiAKICAgICAgICAgbUJsdWV0b290aFN0YXRlID0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY7CiAgICAgICAgIG1Jc0Rpc2NvdmVyaW5nID0gZmFsc2U7CisgICAgICAgIG1UZXRoZXJpbmdPbiA9IGZhbHNlOwogICAgICAgICBtQWRhcHRlclByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgICAgbURldmljZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsU3RyaW5nPj4oKTsKIApAQCAtMTg5LDE1ICsyMDYsMjUgQEAKICAgICAgICAgbURldmljZVByb2ZpbGVTdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlPigpOwogICAgICAgICBtQTJkcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5BMkRQKTsKICAgICAgICAgbUhmcFByb2ZpbGVTdGF0ZSA9IG5ldyBCbHVldG9vdGhQcm9maWxlU3RhdGUobUNvbnRleHQsIEJsdWV0b290aFByb2ZpbGVTdGF0ZS5IRlApOworICAgICAgICBtSGlkUHJvZmlsZVN0YXRlID0gbmV3IEJsdWV0b290aFByb2ZpbGVTdGF0ZShtQ29udGV4dCwgQmx1ZXRvb3RoUHJvZmlsZVN0YXRlLkhJRCk7CisKKyAgICAgICAgLy8gQ2FuIHRldGhlciB0byB1cCB0byA3IGRldmljZXMKKyAgICAgICAgbUJsdWV0b290aElmYWNlQWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEJsdWV0b290aFBhbi5NQVhfQ09OTkVDVElPTlMpOworICAgICAgICBmb3IgKGludCBpPTE7IGkgPD0gQmx1ZXRvb3RoUGFuLk1BWF9DT05ORUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBtQmx1ZXRvb3RoSWZhY2VBZGRyZXNzZXMuYWRkKEJMVUVUT09USF9ORUFSX0lGQUNFX0FERFJfUFJFRklYICsgaSk7CisgICAgICAgIH0KIAogICAgICAgICBtSGZwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CiAgICAgICAgIG1BMmRwUHJvZmlsZVN0YXRlLnN0YXJ0KCk7CisgICAgICAgIG1IaWRQcm9maWxlU3RhdGUuc3RhcnQoKTsKIAogICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwogICAgICAgICByZWdpc3RlckZvckFpcnBsYW5lTW9kZShmaWx0ZXIpOwogCiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9ET0NLX0VWRU5UKTsKICAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1JbnB1dERldmljZXMgPSBuZXcgSGFzaE1hcDxCbHVldG9vdGhEZXZpY2UsIEludGVnZXI+KCk7CisgICAgICAgIG1QYW5EZXZpY2VzID0gbmV3IEhhc2hNYXA8Qmx1ZXRvb3RoRGV2aWNlLCBJbnRlZ2VyPigpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyByZWFkRG9ja0JsdWV0b290aEFkZHJlc3MoKSB7CkBAIC0zMjUsNiArMzUyLDcgQEAKICAgICAgICAgfQogICAgICAgICBzZXRCbHVldG9vdGhTdGF0ZShCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGKTsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTUVTU0FHRV9SRUdJU1RFUl9TRFBfUkVDT1JEUyk7CisgICAgICAgIHNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZShmYWxzZSwgQmx1ZXRvb3RoUGFuLk5BUF9ST0xFLCBCbHVldG9vdGhQYW4uTkFQX0JSSURHRSk7CiAKICAgICAgICAgLy8gQWxsb3cgMyBzZWNvbmRzIGZvciBwcm9maWxlcyB0byBncmFjZWZ1bGx5IGRpc2Nvbm5lY3QKICAgICAgICAgLy8gVE9ETzogSW50cm9kdWNlIGEgY2FsbGJhY2sgbWVjaGFuaXNtIHNvIHRoYXQgZWFjaCBwcm9maWxlIGNhbiBub3RpZnkKQEAgLTU0OCw4ICs1NzYsMTIgQEAKICAgICAgICAgICAgICAgICBtQm9uZFN0YXRlLnJlYWRBdXRvUGFpcmluZ0RhdGEoKTsKICAgICAgICAgICAgICAgICBtQm9uZFN0YXRlLmxvYWRCb25kU3RhdGUoKTsKICAgICAgICAgICAgICAgICBpbml0UHJvZmlsZVN0YXRlKCk7CisKKyAgICAgICAgICAgICAgICAvL1JlZ2lzdGVyIFNEUCByZWNvcmRzLgogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTUVTU0FHRV9SRUdJU1RFUl9TRFBfUkVDT1JEUywgMSwgLTEpLCAzMDAwKTsKKyAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUodHJ1ZSwgQmx1ZXRvb3RoUGFuLk5BUF9ST0xFLCBCbHVldG9vdGhQYW4uTkFQX0JSSURHRSk7CisKIAogICAgICAgICAgICAgICAgIC8vIExvZyBibHVldG9vdGggb24gdG8gYmF0dGVyeSBzdGF0cy4KICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC02NjgsNiArNzAwLDEwIEBACiAgICAgICAgICAgICAgICAgcmVtb3ZlUHJvZmlsZVN0YXRlKGFkZHJlc3MpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBISUQgaXMgaGFuZGxlZCBieSBCbHVldG9vdGhTZXJ2aWNlLCBvdGhlciBwcm9maWxlcworICAgICAgICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgc2VydmljZXMuCisgICAgICAgICAgICBzZXRJbml0aWFsSW5wdXREZXZpY2VQcmlvcml0eShtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyksIHN0YXRlKTsKKwogICAgICAgICAgICAgaWYgKERCRykgbG9nKGFkZHJlc3MgKyAiIGJvbmQgc3RhdGUgIiArIG9sZFN0YXRlICsgIiAtPiAiICsgc3RhdGUgKyAiICgiICsKICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gKyAiKSIpOwogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQpOwpAQCAtMTIyMCw2ICsxMjU2LDM3MyBAQAogICAgICAgICByZXR1cm4gc3AuY29udGFpbnMoU0hBUkVEX1BSRUZFUkVOQ0VfRE9DS19BRERSRVNTICsgYWRkcmVzcyk7CiAgICAgfQogCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzVGV0aGVyaW5nT24oKSB7CisgICAgICAgIHJldHVybiBtVGV0aGVyaW5nT247CisgICAgfQorCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtVGV0aGVyaW5nUmVjZWl2ZXIgPSBudWxsOworCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RQYW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRCbHVldG9vdGhTdGF0ZSgpICE9IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04gJiYgdmFsdWUpIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQpOworICAgICAgICAgICAgbVRldGhlcmluZ1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZ09uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtVGV0aGVyaW5nUmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVRldGhlcmluZ1JlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRldGhlcmluZ09uID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRQYW5EZXZpY2VTdGF0ZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfUEVSTSwgIk5lZWQgQkxVRVRPT1RIIHBlcm1pc3Npb24iKTsKKworICAgICAgICBpZiAobVBhbkRldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1QYW5EZXZpY2VzLmdldChkZXZpY2UpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKERCRykgbG9nKCJjb25uZWN0IFBBTigiICsgb2JqZWN0UGF0aCArICIpIik7CisgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpICE9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgICAgIGxvZyAoZGV2aWNlICsgIiBhbHJlYWR5IGNvbm5lY3RlZCB0byBQQU4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb25uZWN0ZWRDb3VudCA9IDA7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIEJUZGV2aWNlOiBtUGFuRGV2aWNlcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGdldFBhbkRldmljZVN0YXRlKEJUZGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ291bnQgKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbm5lY3RlZENvdW50ID4gOCkgeworICAgICAgICAgICAgbG9nIChkZXZpY2UgKyAiIGNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiBiZWNhdXNlIDggb3RoZXIgZGV2aWNlcyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZVBhbkRldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkcpOworICAgICAgICBpZiAoY29ubmVjdFBhbkRldmljZU5hdGl2ZShvYmplY3RQYXRoLCAibmFwIiwgInBhbnUiKSkgeworICAgICAgICAgICAgbG9nICgiY29ubmVjdGluZyB0byBQQU4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlUGFuRGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGxvZyAoImNvdWxkIG5vdCBjb25uZWN0IHRvIFBBTiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuKCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBhbGwgUEFOIGRldmljZXMiKTsKKworICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1QYW5EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkaXNjb25uZWN0UGFuRGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nICgiY291bGQgbm90IGRpc2Nvbm5lY3QgUGFuIERldmljZSAiK2RldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQmx1ZXRvb3RoRGV2aWNlW10gZ2V0Q29ubmVjdGVkUGFuRGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworCisgICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGRldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZTogbVBhbkRldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRQYW5EZXZpY2VTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXZpY2VzLnRvQXJyYXkobmV3IEJsdWV0b290aERldmljZVtkZXZpY2VzLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0UGFuRGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzY29ubmVjdCBQQU4oIiArIG9iamVjdFBhdGggKyAiKSIpOworICAgICAgICBpZiAoZ2V0UGFuRGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsb2cgKGRldmljZSArICIgYWxyZWFkeSBkaXNjb25uZWN0ZWQgZnJvbSBQQU4iKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShkZXZpY2UsIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUob2JqZWN0UGF0aCk7CisgICAgfQorCisgICAgLypwYWNrYWdlKi8gdm9pZCBoYW5kbGVQYW5EZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1QYW5EZXZpY2VzLmdldChkZXZpY2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZXZTdGF0ZSA9IEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2U3RhdGUgPSBtUGFuRGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbVBhbkRldmljZXMucHV0KGRldmljZSwgc3RhdGUpOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aFBhbi5BQ1RJT05fUEFOX1NUQVRFX0NIQU5HRUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9QUkVWSU9VU19QQU5fU1RBVEUsIHByZXZTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhQYW4uRVhUUkFfUEFOX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJQYW4gRGV2aWNlIHN0YXRlIDogZGV2aWNlOiAiICsgZGV2aWNlICsgIiBTdGF0ZToiICsgcHJldlN0YXRlICsgIi0+IiArIHN0YXRlKTsKKworICAgIH0KKworICAgIC8vIGNvbmZpZ3VyZWQgd2hlbiB3ZSBzdGFydCB0ZXRoZXJpbmcgYW5kIHVuY29uZmlnJ2Qgb24gZXJyb3Igb3IgY29uY2x1c2lvbgorICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVUZXRoZXJTdGF0ZShib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlndXJlQmx1ZXRvb3RoSWZhY2UoIiArIGVuYWJsZWQgKyAiKSIpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIGNtID0KKyAgICAgICAgICAgIChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIFN0cmluZ1tdIGJsdWV0b290aFJlZ2V4cyA9IGNtLmdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKTsKKworICAgICAgICAvLyBicmluZyB0b2dnbGUgdGhlIGludGVyZmFjZXMKKyAgICAgICAgU3RyaW5nW10gaWZhY2VzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmYWNlcyA9IHNlcnZpY2UubGlzdEludGVyZmFjZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGxpc3RpbmcgSW50ZXJmYWNlcyA6IiArIGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gaWZhY2VBZGRyZXNzZXMgPSAoQXJyYXlMaXN0PFN0cmluZz4pIG1CbHVldG9vdGhJZmFjZUFkZHJlc3Nlcy5jbG9uZSgpOworICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IGlmYWNlcykgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVnZXggOiBibHVldG9vdGhSZWdleHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cgPSBzZXJ2aWNlLmdldEludGVyZmFjZUNvbmZpZyhpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZjZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYWRkciA9IEJMVUVUT09USF9ORVRNQVNLLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5uZXRtYXNrID0gKEludGVnZXIucGFyc2VJbnQoYWRkclswXSkgPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzFdKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbMl0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzNdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmNnLmlwQWRkciA9PSAwICYmICFpZmFjZUFkZHJlc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBpZmFjZUFkZHJlc3Nlcy5yZW1vdmUoMCkuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pcEFkZHIgPSAoSW50ZWdlci5wYXJzZUludChhZGRyWzBdKSA8PCAyNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzFdKSA8PCAxNikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlci5wYXJzZUludChhZGRyWzJdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnRlZ2VyLnBhcnNlSW50KGFkZHJbM10pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBJZmFjZUFkZHJlc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihpZmNnLmlwQWRkciA+Pj4gMjQpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoKGlmY2cuaXBBZGRyICYgMHgwMEZGMDAwMCkgPj4+IDE2KSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKChpZmNnLmlwQWRkciAmIDB4MDAwMEZGMDApID4+PiA4KSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGlmY2cuaXBBZGRyICYgMHgwMDAwMDBGRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZUFkZHJlc3Nlcy5yZW1vdmUoSWZhY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJkb3duIiwgInVwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9IGlmY2cuaW50ZXJmYWNlRmxhZ3MucmVwbGFjZSgidXAiLCAiZG93biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmludGVyZmFjZUZsYWdzID0gaWZjZy5pbnRlcmZhY2VGbGFncy5yZXBsYWNlKCJydW5uaW5nIiwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSBpZmNnLmludGVyZmFjZUZsYWdzLnJlcGxhY2UoIiAgIiwiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0SW50ZXJmYWNlQ29uZmlnKGlmYWNlLCBpZmNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY20udGV0aGVyKGlmYWNlKSAhPSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRFVEhFUl9FUlJPUl9OT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraWZhY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNvbmZpZ3VyaW5nIGludGVyZmFjZSAiICsgaWZhY2UgKyAiLCA6IiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbm5lY3RJbnB1dERldmljZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihCTFVFVE9PVEhfQURNSU5fUEVSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWVkIEJMVUVUT09USF9BRE1JTiBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGlmIChvYmplY3RQYXRoID09IG51bGwgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlU3RhdGUoZGV2aWNlKSAhPSBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQgfHwKKyAgICAgICAgICAgIGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA9PSBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9PRkYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUgc3RhdGUgPSBtRGV2aWNlUHJvZmlsZVN0YXRlLmdldChkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIG1zZy5hcmcxID0gQmx1ZXRvb3RoRGV2aWNlUHJvZmlsZVN0YXRlLkNPTk5FQ1RfSElEX09VVEdPSU5HOworICAgICAgICAgICAgbXNnLm9iaiA9IHN0YXRlOworICAgICAgICAgICAgbUhpZFByb2ZpbGVTdGF0ZS5zZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VJbnRlcm5hbChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIFN0cmluZyBvYmplY3RQYXRoID0gZ2V0T2JqZWN0UGF0aEZyb21BZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyk7CisgICAgICAgIGlmICghY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKG9iamVjdFBhdGgpKSB7CisgICAgICAgICAgICBoYW5kbGVJbnB1dERldmljZVN0YXRlQ2hhbmdlKGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9BRE1JTl9QRVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZWQgQkxVRVRPT1RIX0FETUlOIHBlcm1pc3Npb24iKTsKKworICAgICAgICBTdHJpbmcgb2JqZWN0UGF0aCA9IGdldE9iamVjdFBhdGhGcm9tQWRkcmVzcyhkZXZpY2UuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgaWYgKG9iamVjdFBhdGggPT0gbnVsbCB8fCBnZXRDb25uZWN0ZWRJbnB1dERldmljZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJsdWV0b290aERldmljZVByb2ZpbGVTdGF0ZSBzdGF0ZSA9IG1EZXZpY2VQcm9maWxlU3RhdGUuZ2V0KGRldmljZS5nZXRBZGRyZXNzKCkpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbXNnLmFyZzEgPSBCbHVldG9vdGhEZXZpY2VQcm9maWxlU3RhdGUuRElTQ09OTkVDVF9ISURfT1VUR09JTkc7CisgICAgICAgICAgICBtc2cub2JqID0gc3RhdGU7CisgICAgICAgICAgICBtSGlkUHJvZmlsZVN0YXRlLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZUludGVybmFsKEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgU3RyaW5nIG9iamVjdFBhdGggPSBnZXRPYmplY3RQYXRoRnJvbUFkZHJlc3MoZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNUSU5HKTsKKyAgICAgICAgaWYgKCFkaXNjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUob2JqZWN0UGF0aCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9DT05ORUNURUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldElucHV0RGV2aWNlU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX1BFUk0sICJOZWVkIEJMVUVUT09USCBwZXJtaXNzaW9uIik7CisKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIEJsdWV0b290aERldmljZVtdIGdldENvbm5lY3RlZElucHV0RGV2aWNlcygpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBkZXZpY2VzID0gbG9va3VwSW5wdXREZXZpY2VzTWF0Y2hpbmdTdGF0ZXMoCisgICAgICAgICAgICBuZXcgaW50W10ge0JsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRH0pOworICAgICAgICByZXR1cm4gZGV2aWNlcy50b0FycmF5KG5ldyBCbHVldG9vdGhEZXZpY2VbZGV2aWNlcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKEJMVUVUT09USF9QRVJNLCAiTmVlZCBCTFVFVE9PVEggcGVybWlzc2lvbiIpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0Qmx1ZXRvb3RoSW5wdXREZXZpY2VQcmlvcml0eUtleShkZXZpY2UuZ2V0QWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5QUklPUklUWV9VTkRFRklORUQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oQkxVRVRPT1RIX0FETUlOX1BFUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVlZCBCTFVFVE9PVEhfQURNSU4gcGVybWlzc2lvbiIpOworICAgICAgICBpZiAoIUJsdWV0b290aEFkYXB0ZXIuY2hlY2tCbHVldG9vdGhBZGRyZXNzKGRldmljZS5nZXRBZGRyZXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEJsdWV0b290aElucHV0RGV2aWNlUHJpb3JpdHlLZXkoZGV2aWNlLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICAgICAgcHJpb3JpdHkpOworICAgIH0KKworICAgIC8qcGFja2FnZSovc3luY2hyb25pemVkIFNldDxCbHVldG9vdGhEZXZpY2U+IGxvb2t1cElucHV0RGV2aWNlc01hdGNoaW5nU3RhdGVzKGludFtdIHN0YXRlcykgeworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBpbnB1dERldmljZXMgPSBuZXcgSGFzaFNldDxCbHVldG9vdGhEZXZpY2U+KCk7CisgICAgICAgIGlmIChtSW5wdXREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGV2aWNlczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJsdWV0b290aERldmljZSBkZXZpY2U6IG1JbnB1dERldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGludCBpbnB1dERldmljZVN0YXRlID0gZ2V0SW5wdXREZXZpY2VTdGF0ZShkZXZpY2UpOworICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgOiBzdGF0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gaW5wdXREZXZpY2VTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXREZXZpY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSW5wdXREZXZpY2VTdGF0ZUNoYW5nZShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgaW50IHByZXZTdGF0ZTsKKyAgICAgICAgaWYgKG1JbnB1dERldmljZXMuZ2V0KGRldmljZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJldlN0YXRlID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldlN0YXRlID0gbUlucHV0RGV2aWNlcy5nZXQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldlN0YXRlID09IHN0YXRlKSByZXR1cm47CisKKyAgICAgICAgbUlucHV0RGV2aWNlcy5wdXQoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgaWYgKGdldElucHV0RGV2aWNlUHJpb3JpdHkoZGV2aWNlKSA+CisgICAgICAgICAgICAgIEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX09GRiAmJgorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORyB8fAorICAgICAgICAgICAgc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbm5lY3RlZCBvciBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuCisgICAgICAgICAgICAvLyBCdW1wIHByaW9yaXR5CisgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfQVVUT19DT05ORUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9JTlBVVF9ERVZJQ0VfU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfUFJFVklPVVNfSU5QVVRfREVWSUNFX1NUQVRFLCBwcmV2U3RhdGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQmx1ZXRvb3RoSW5wdXREZXZpY2UuRVhUUkFfSU5QVVRfREVWSUNFX1NUQVRFLCBzdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50LCBCTFVFVE9PVEhfUEVSTSk7CisKKyAgICAgICAgaWYgKERCRykgbG9nKCJJbnB1dERldmljZSBzdGF0ZSA6IGRldmljZTogIiArIGRldmljZSArICIgU3RhdGU6IiArIHByZXZTdGF0ZSArICItPiIgKyBzdGF0ZSk7CisKKyAgICB9CisKKyAgICAvKnBhY2thZ2UqLyB2b2lkIGhhbmRsZUlucHV0RGV2aWNlUHJvcGVydHlDaGFuZ2UoU3RyaW5nIGFkZHJlc3MsIGJvb2xlYW4gY29ubmVjdGVkKSB7CisgICAgICAgIGludCBzdGF0ZSA9IGNvbm5lY3RlZCA/IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0NPTk5FQ1RFRCA6CisgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBtQWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoYWRkcmVzcyk7CisgICAgICAgIGhhbmRsZUlucHV0RGV2aWNlU3RhdGVDaGFuZ2UoZGV2aWNlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxJbnB1dERldmljZVByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBzdGF0ZSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0SW5wdXREZXZpY2VQcmlvcml0eShkZXZpY2UpID09IEJsdWV0b290aElucHV0RGV2aWNlLlBSSU9SSVRZX1VOREVGSU5FRCkgeworICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfT04pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZVByaW9yaXR5KGRldmljZSwgQmx1ZXRvb3RoSW5wdXREZXZpY2UuUFJJT1JJVFlfVU5ERUZJTkVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qcGFja2FnZSovIGJvb2xlYW4gaXNSZW1vdGVEZXZpY2VJbkNhY2hlKFN0cmluZyBhZGRyZXNzKSB7CiAgICAgICAgIHJldHVybiAobURldmljZVByb3BlcnRpZXMuZ2V0KGFkZHJlc3MpICE9IG51bGwpOwogICAgIH0KQEAgLTEyNDIsNyArMTY0NSw3IEBACiAgICAgICAgICAgICBpZiAodXBkYXRlUmVtb3RlRGV2aWNlUHJvcGVydGllc0NhY2hlKGFkZHJlc3MpKQogICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZW1vdGVEZXZpY2VQcm9wZXJ0eShhZGRyZXNzLCBwcm9wZXJ0eSk7CiAgICAgICAgIH0KLSAgICAgICAgTG9nLmUoVEFHLCAiZ2V0UmVtb3RlRGV2aWNlUHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICJub3QgcHJlc2VudDoiICsgYWRkcmVzcyk7CisgICAgICAgIExvZy5lKFRBRywgImdldFJlbW90ZURldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG5vdCBwcmVzZW50OiAiICsgYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIApAQCAtMjEwMyw0ICsyNTA2LDEwIEBACiAgICAgICAgICAgICBzaG9ydCBjaGFubmVsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIHJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBzZXRMaW5rVGltZW91dE5hdGl2ZShTdHJpbmcgcGF0aCwgaW50IG51bV9zbG90cyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGlzY29ubmVjdElucHV0RGV2aWNlTmF0aXZlKFN0cmluZyBwYXRoKTsKKworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlKGJvb2xlYW4gdmFsdWUsIFN0cmluZyBuYXAsIFN0cmluZyBicmlkZ2UpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gY29ubmVjdFBhbkRldmljZU5hdGl2ZShTdHJpbmcgcGF0aCwgU3RyaW5nIHNyY1JvbGUsIFN0cmluZyBkc3RSb2xlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUoU3RyaW5nIHBhdGgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC9TcGVlY2hSZWNvZ25pemVyLmphdmEKaW5kZXggOGZhMGQ1OS4uY2Q3M2JhOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL1NwZWVjaFJlY29nbml6ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvU3BlZWNoUmVjb2duaXplci5qYXZhCkBAIC01MCw3ICs1MCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGVlY2hSZWNvZ25pemVyIjsKIAogICAgIC8qKgotICAgICAqIFVzZWQgdG8gcmV0cmlldmUgYW4ge0Bjb2RlIEFycmF5TGlzdCZsdDtTdHJpbmcmZ3Q7fSBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSBwYXNzZWQgdG8gdGhlCisgICAgICogVXNlZCB0byByZXRyaWV2ZSBhbiB7QGNvZGUgQXJyYXlMaXN0PFN0cmluZz59IGZyb20gdGhlIHtAbGluayBCdW5kbGV9IHBhc3NlZCB0byB0aGUKICAgICAgKiB7QGxpbmsgUmVjb2duaXRpb25MaXN0ZW5lciNvblJlc3VsdHMoQnVuZGxlKX0gYW5kCiAgICAgICoge0BsaW5rIFJlY29nbml0aW9uTGlzdGVuZXIjb25QYXJ0aWFsUmVzdWx0cyhCdW5kbGUpfSBtZXRob2RzLiBUaGVzZSBzdHJpbmdzIGFyZSB0aGUgcG9zc2libGUKICAgICAgKiByZWNvZ25pdGlvbiByZXN1bHRzLCB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgbW9zdCBsaWtlbHkgY2FuZGlkYXRlLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9BbmRyb2lkQmlkaS5qYXZhCmluZGV4IGU0ZjkzNGUuLmVhY2Q0MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQW5kcm9pZEJpZGkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0FuZHJvaWRCaWRpLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LkRpcmVjdGlvbnM7CisKIC8qKgogICogQWNjZXNzIHRoZSBJQ1UgYmlkaSBpbXBsZW1lbnRhdGlvbi4KICAqIEBoaWRlCkBAIC00NCw1ICs0NiwxMzIgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHJ1biBkaXJlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGEgbGluZSB3aXRoaW4gYSBwYXJhZ3JhcGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIGJhc2UgbGluZSBkaXJlY3Rpb24sIGVpdGhlciBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQgb3IKKyAgICAgKiAgICAgTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUCisgICAgICogQHBhcmFtIGxldmVscyBsZXZlbHMgYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2JpZGl9CisgICAgICogQHBhcmFtIGxzdGFydCBzdGFydCBvZiB0aGUgbGluZSBpbiB0aGUgbGV2ZWxzIGFycmF5CisgICAgICogQHBhcmFtIGNoYXJzIHRoZSBjaGFyYWN0ZXIgYXJyYXkgKHVzZWQgdG8gZGV0ZXJtaW5lIHdoaXRlc3BhY2UpCisgICAgICogQHBhcmFtIGNzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgaW4gdGhlIGNoYXJzIGFycmF5CisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lCisgICAgICogQHJldHVybiB0aGUgZGlyZWN0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlyZWN0aW9ucyBkaXJlY3Rpb25zKGludCBkaXIsIGJ5dGVbXSBsZXZlbHMsIGludCBsc3RhcnQsCisgICAgICAgICAgICBjaGFyW10gY2hhcnMsIGludCBjc3RhcnQsIGludCBsZW4pIHsKKworICAgICAgICBpbnQgYmFzZUxldmVsID0gZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCA/IDAgOiAxOworICAgICAgICBpbnQgY3VyTGV2ZWwgPSBsZXZlbHNbbHN0YXJ0XTsKKyAgICAgICAgaW50IG1pbkxldmVsID0gY3VyTGV2ZWw7CisgICAgICAgIGludCBydW5Db3VudCA9IDE7CisgICAgICAgIGZvciAoaW50IGkgPSBsc3RhcnQgKyAxLCBlID0gbHN0YXJ0ICsgbGVuOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSBsZXZlbHNbaV07CisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gY3VyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBjdXJMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICsrcnVuQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgZmluYWwgcnVuIGZvciB0cmFpbGluZyBjb3VudGVyLWRpcmVjdGlvbmFsIHdoaXRlc3BhY2UKKyAgICAgICAgaW50IHZpc0xlbiA9IGxlbjsKKyAgICAgICAgaWYgKChjdXJMZXZlbCAmIDEpICE9IChiYXNlTGV2ZWwgJiAxKSkgeworICAgICAgICAgICAgLy8gbG9vayBmb3IgdmlzaWJsZSBlbmQKKyAgICAgICAgICAgIHdoaWxlICgtLXZpc0xlbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IGNoYXJzW2NzdGFydCArIHZpc0xlbl07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAtLXZpc0xlbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoICE9ICcgJyAmJiBjaCAhPSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrdmlzTGVuOworICAgICAgICAgICAgaWYgKHZpc0xlbiAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICArK3J1bkNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bkNvdW50ID09IDEgJiYgbWluTGV2ZWwgPT0gYmFzZUxldmVsKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBkb25lLCBvbmx5IG9uZSBydW4gb24gdGhpcyBsaW5lCisgICAgICAgICAgICBpZiAoKG1pbkxldmVsICYgMSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgfQorCisgICAgICAgIGludFtdIGxkID0gbmV3IGludFtydW5Db3VudCAqIDJdOworICAgICAgICBpbnQgbWF4TGV2ZWwgPSBtaW5MZXZlbDsKKyAgICAgICAgaW50IGxldmVsQml0cyA9IG1pbkxldmVsIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IG9mIGZpcnN0IHBhaXIgaXMgYWx3YXlzIDAsIHdlIHdyaXRlCisgICAgICAgICAgICAvLyBsZW5ndGggdGhlbiBzdGFydCBhdCBlYWNoIG5ldyBydW4sIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIGxhc3QgcnVuIGxlbmd0aCBhZnRlciB3ZSdyZSBkb25lLgorICAgICAgICAgICAgaW50IG4gPSAxOworICAgICAgICAgICAgaW50IHByZXYgPSBsc3RhcnQ7CisgICAgICAgICAgICBjdXJMZXZlbCA9IG1pbkxldmVsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxzdGFydCwgZSA9IGxzdGFydCArIHZpc0xlbjsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGxldmVsc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gY3VyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPCBtaW5MZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBYWFggaWdub3JlIHJ1biBsZW5ndGggbGltaXQgb2YgMl5SVU5fTEVWRUxfU0hJRlQKKyAgICAgICAgICAgICAgICAgICAgbGRbbisrXSA9IChpIC0gcHJldikgfCBsZXZlbEJpdHM7CisgICAgICAgICAgICAgICAgICAgIGxkW24rK10gPSBpIC0gbHN0YXJ0OworICAgICAgICAgICAgICAgICAgICBsZXZlbEJpdHMgPSBjdXJMZXZlbCA8PCBMYXlvdXQuUlVOX0xFVkVMX1NISUZUOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZFtuXSA9IChsc3RhcnQgKyB2aXNMZW4gLSBwcmV2KSB8IGxldmVsQml0czsKKyAgICAgICAgICAgIGlmICh2aXNMZW4gPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBsZFsrK25dID0gdmlzTGVuOworICAgICAgICAgICAgICAgIGxkWysrbl0gPSAobGVuIC0gdmlzTGVuKSB8IChiYXNlTGV2ZWwgPDwgTGF5b3V0LlJVTl9MRVZFTF9TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzd2FwIGFueSBydW5zLgorICAgICAgICAvLyBJZiB0aGUgbWluIGxldmVsIHJ1biBkaXJlY3Rpb24gZG9lc24ndCBtYXRjaCB0aGUgYmFzZQorICAgICAgICAvLyBkaXJlY3Rpb24sIHdlIGFsd2F5cyBuZWVkIHRvIHN3YXAgKGF0IHRoaXMgcG9pbnQKKyAgICAgICAgLy8gd2UgaGF2ZSBtb3JlIHRoYW4gb25lIHJ1bikuCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgZG9uJ3QgbmVlZCB0byBzd2FwIHRoZSBsb3dlc3QgbGV2ZWwuCisgICAgICAgIC8vIFNpbmNlIHRoZXJlIGFyZSBubyBsb2dpY2FsbHkgYWRqYWNlbnQgcnVucyBhdCB0aGUgc2FtZQorICAgICAgICAvLyBsZXZlbCwgaWYgdGhlIG1heCBsZXZlbCBpcyB0aGUgc2FtZSBhcyB0aGUgKG5ldykgbWluCisgICAgICAgIC8vIGxldmVsLCB3ZSBoYXZlIGEgc2VyaWVzIG9mIGFsdGVybmF0aW5nIGxldmVscyB0aGF0CisgICAgICAgIC8vIGlzIGFscmVhZHkgaW4gb3JkZXIsIHNvIHRoZXJlJ3Mgbm8gbW9yZSB0byBkby4KKyAgICAgICAgLy8KKyAgICAgICAgYm9vbGVhbiBzd2FwOworICAgICAgICBpZiAoKG1pbkxldmVsICYgMSkgPT0gYmFzZUxldmVsKSB7CisgICAgICAgICAgICBtaW5MZXZlbCArPSAxOworICAgICAgICAgICAgc3dhcCA9IG1heExldmVsID4gbWluTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2FwID0gcnVuQ291bnQgPiAxOworICAgICAgICB9CisgICAgICAgIGlmIChzd2FwKSB7CisgICAgICAgICAgICBmb3IgKGludCBsZXZlbCA9IG1heExldmVsIC0gMTsgbGV2ZWwgPj0gbWluTGV2ZWw7IC0tbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxkLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbHNbbGRbaV1dID49IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSA9IGkgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGUgPCBsZC5sZW5ndGggJiYgbGV2ZWxzW2xkW2VdXSA+PSBsZXZlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGxvdyA9IGksIGhpID0gZSAtIDI7IGxvdyA8IGhpOyBsb3cgKz0gMiwgaGkgLT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbGRbbG93XTsgbGRbbG93XSA9IGxkW2hpXTsgbGRbaGldID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGRbbG93KzFdOyBsZFtsb3crMV0gPSBsZFtoaSsxXTsgbGRbaGkrMV0gPSB4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGUgKyAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aW9ucyhsZCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIGludCBydW5CaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCBib29sZWFuIGhhdmVJbmZvKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9Cb3JpbmdMYXlvdXQuamF2YQppbmRleCA5NDRmNzM1Li45MzA5YjA1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0JvcmluZ0xheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQm9yaW5nTGF5b3V0LmphdmEKQEAgLTIwOCwxMSArMjA4LDExIEBACiAgICAgICAgICAgICAgKiB3aWR0aCBiZWNhdXNlIHRoZSB3aWR0aCB0aGF0IHdhcyBwYXNzZWQgaW4gd2FzIGZvciB0aGUKICAgICAgICAgICAgICAqIGZ1bGwgdGV4dCwgbm90IHRoZSBlbGxpcHNpemVkIGZvcm0uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc1RlbXApIHsKLSAgICAgICAgICAgICAgICBtTWF4ID0gKGludCkgKEZsb2F0TWF0aC5jZWlsKFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgc1RlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBUZXh0TGluZSBsaW5lID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgICAgICBsaW5lLnNldChwYWludCwgc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoKCksIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgIG1NYXggPSAoaW50KSBGbG9hdE1hdGguY2VpbChsaW5lLm1ldHJpY3MobnVsbCkpOworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZShsaW5lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbmNsdWRlcGFkKSB7CkBAIC0yNzYsMTQgKzI3NiwxMyBAQAogICAgICAgICAgICAgaWYgKGZtID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBmbSA9IG5ldyBNZXRyaWNzKCk7CiAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBpbnQgd2lkOwogCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNUZW1wKSB7Ci0gICAgICAgICAgICAgICAgd2lkID0gKGludCkgKEZsb2F0TWF0aC5jZWlsKFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgc1RlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCBmbSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZtLndpZHRoID0gd2lkOworICAgICAgICAgICAgVGV4dExpbmUgbGluZSA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAgICAgbGluZS5zZXQocGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgIGZtLndpZHRoID0gKGludCkgRmxvYXRNYXRoLmNlaWwobGluZS5tZXRyaWNzKGZtKSk7CisgICAgICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKGxpbmUpOworCiAgICAgICAgICAgICByZXR1cm4gZm07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM4OSw3ICszODgsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRyaWNzIGV4dGVuZHMgUGFpbnQuRm9udE1ldHJpY3NJbnQgewogICAgICAgICBwdWJsaWMgaW50IHdpZHRoOwotICAgICAgICAKKwogICAgICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB3aWR0aD0iICsgd2lkdGg7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvQ2xpcGJvYXJkTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKaW5kZXggNTIwMzlhZi4uMGIyMzljZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9DbGlwYm9hcmRNYW5hZ2VyLmphdmEKQEAgLTE2LDczICsxNiwyNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGV4dDsKIAotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCiAvKioKLSAqIEludGVyZmFjZSB0byB0aGUgY2xpcGJvYXJkIHNlcnZpY2UsIGZvciBwbGFjaW5nIGFuZCByZXRyaWV2aW5nIHRleHQgaW4KLSAqIHRoZSBnbG9iYWwgY2xpcGJvYXJkLgotICoKLSAqIDxwPgotICogWW91IGRvIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyBpbnN0ZWFkLCByZXRyaWV2ZSBpdCB0aHJvdWdoCi0gKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjZ2V0U3lzdGVtU2VydmljZX0uCi0gKgotICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBAZGVwcmVjYXRlZCBPbGQgdGV4dC1vbmx5IGludGVyYWNlIHRvIHRoZSBjbGlwYm9hcmQuICBTZWUKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ2xpcGJvYXJkTWFuYWdlcn0gZm9yIHRoZSBtb2Rlcm4gQVBJLgogICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSUNsaXBib2FyZCBzU2VydmljZTsKLQotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLQotICAgIHN0YXRpYyBwcml2YXRlIElDbGlwYm9hcmQgZ2V0U2VydmljZSgpIHsKLSAgICAgICAgaWYgKHNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzU2VydmljZTsKLSAgICAgICAgfQotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJjbGlwYm9hcmQiKTsKLSAgICAgICAgc1NlcnZpY2UgPSBJQ2xpcGJvYXJkLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0gICAgICAgIHJldHVybiBzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioge0BoaWRlfSAqLwotICAgIHB1YmxpYyBDbGlwYm9hcmRNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KK0BEZXByZWNhdGVkCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpcGJvYXJkTWFuYWdlciB7CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdGV4dCBvbiB0aGUgY2xpcGJvYXJkLiAgSXQgd2lsbCBldmVudHVhbGx5IGJlIHBvc3NpYmxlCiAgICAgICogdG8gc3RvcmUgdHlwZXMgb3RoZXIgdGhhbiB0ZXh0IHRvbywgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgcmV0dXJuCiAgICAgICogbnVsbCBpZiB0aGUgdHlwZSBjYW5ub3QgYmUgY29lcmNlZCB0byB0ZXh0LgogICAgICAqLwotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0Q2xpcGJvYXJkVGV4dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRUZXh0KCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHRvIHRoZSBzcGVjaWZpZWQgdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlKCkuc2V0Q2xpcGJvYXJkVGV4dCh0ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5oYXNDbGlwYm9hcmRUZXh0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzVGV4dCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9EeW5hbWljTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQppbmRleCAxNGU1NjU1Li5iNmFhMDNhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0R5bmFtaWNMYXlvdXQuamF2YQpAQCAtMzEwLDcgKzMxMCw2IEBACiAKICAgICAgICAgRGlyZWN0aW9uc1tdIG9iamVjdHMgPSBuZXcgRGlyZWN0aW9uc1sxXTsKIAotCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICBpbnRzW1NUQVJUXSA9IHJlZmxvd2VkLmdldExpbmVTdGFydChpKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWZsb3dlZC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSkgPDwgRElSX1NISUZUKSB8CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQppbmRleCBjM2JkMGFlLi5kNDI2ZDEyNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9HcmFwaGljc09wZXJhdGlvbnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0dyYXBoaWNzT3BlcmF0aW9ucy5qYXZhCkBAIC0zNCwxMyArMzQsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwKTsKIAogICAgIC8qKgorICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgQ2FudmFzI2RyYXdUZXh0UnVufS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCk7CisKKyAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjbWVhc3VyZVRleHR9LgogICAgICAqLwogICAgIGZsb2F0IG1lYXN1cmVUZXh0KGludCBzdGFydCwgaW50IGVuZCwgUGFpbnQgcCk7CiAKLQogICAgIC8qKgogICAgICAqIEp1c3QgbGlrZSB7QGxpbmsgUGFpbnQjZ2V0VGV4dFdpZHRoc30uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRUZXh0V2lkdGhzKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXRbXSB3aWR0aHMsIFBhaW50IHApOworCisgICAgLyoqCisgICAgICogSnVzdCBsaWtlIHtAbGluayBQYWludCNnZXRUZXh0UnVuQWR2YW5jZXN9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LCBQYWludCBwYWludCk7CisKKyAgICAvKioKKyAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFBhaW50I2dldFRleHRSdW5DdXJzb3J9LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgaW50IGdldFRleHRSdW5DdXJzb3IoaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwKKyAgICAgICAgICAgIGludCBjdXJzb3JPcHQsIFBhaW50IHApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9JQ2xpcGJvYXJkLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlYjVjOC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0lDbGlwYm9hcmQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRleHQ7Ci0KLS8qKgotICogUHJvZ3JhbW1pbmcgaW50ZXJmYWNlIHRvIHRoZSBjbGlwYm9hcmQsIHdoaWNoIGFsbG93cyBjb3B5aW5nIGFuZCBwYXN0aW5nCi0gKiBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KLSAqIHtAaGlkZX0KLSAqLwotaW50ZXJmYWNlIElDbGlwYm9hcmQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRleHQgb24gdGhlIGNsaXBib2FyZC4gIEl0IHdpbGwgZXZlbnR1YWxseSBiZSBwb3NzaWJsZQotICAgICAqIHRvIHN0b3JlIHR5cGVzIG90aGVyIHRoYW4gdGV4dCB0b28sIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybgotICAgICAqIG51bGwgaWYgdGhlIHR5cGUgY2Fubm90IGJlIGNvZXJjZWQgdG8gdGV4dC4KLSAgICAgKi8KLSAgICBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgc3BlY2lmaWVkIHRleHQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDbGlwYm9hcmRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRhaW5zIHRleHQ7IGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0NsaXBib2FyZFRleHQoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0ZTE5N2NkLi41NGFjOTA2Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQpAQCAtMTYsMjkgKzE2LDMzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCi1pbXBvcnQgYW5kcm9pZC5lbW9qaS5FbW9qaUZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuKjsKK2ltcG9ydCBhbmRyb2lkLmVtb2ppLkVtb2ppRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxlYWRpbmdNYXJnaW5TcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MaW5lQmFja2dyb3VuZFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCi0gKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbiAKLSAqIHRoZSBzY3JlZW4uIAotICogPHA+Rm9yIHRleHQgdGhhdCB3aWxsIGJlIGVkaXRlZCwgdXNlIGEge0BsaW5rIER5bmFtaWNMYXlvdXR9LCAKLSAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLiAgCisgKiBBIGJhc2UgY2xhc3MgdGhhdCBtYW5hZ2VzIHRleHQgbGF5b3V0IGluIHZpc3VhbCBlbGVtZW50cyBvbgorICogdGhlIHNjcmVlbi4KKyAqIDxwPkZvciB0ZXh0IHRoYXQgd2lsbCBiZSBlZGl0ZWQsIHVzZSBhIHtAbGluayBEeW5hbWljTGF5b3V0fSwKKyAqIHdoaWNoIHdpbGwgYmUgdXBkYXRlZCBhcyB0aGUgdGV4dCBjaGFuZ2VzLgogICogRm9yIHRleHQgdGhhdCB3aWxsIG5vdCBjaGFuZ2UsIHVzZSBhIHtAbGluayBTdGF0aWNMYXlvdXR9LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF5b3V0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyYWdyYXBoU3R5bGVbXSBOT19QQVJBX1NQQU5TID0KICAgICAgICAgQXJyYXlVdGlscy5lbXB0eUFycmF5KFBhcmFncmFwaFN0eWxlLmNsYXNzKTsKIApAQCAtNTQsOSArNTgsNyBAQAogICAgICAgICAgICAgTUlOX0VNT0pJID0gLTE7CiAgICAgICAgICAgICBNQVhfRU1PSkkgPSAtMTsKICAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFJlY3RGIG1FbW9qaVJlY3Q7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGhvdyB3aWRlIGEgbGF5b3V0IG11c3QgYmUgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUKQEAgLTY2LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQpIHsKICAgICAgICAgcmV0dXJuIGdldERlc2lyZWRXaWR0aChzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgoKSwgcGFpbnQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBob3cgd2lkZSBhIGxheW91dCBtdXN0IGJlIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlCiAgICAgICogc3BlY2lmaWVkIHRleHQgc2xpY2Ugd2l0aCBvbmUgbGluZSBwZXIgcGFyYWdyYXBoLgpAQCAtODUsOCArODcsNyBAQAogICAgICAgICAgICAgICAgIG5leHQgPSBlbmQ7CiAKICAgICAgICAgICAgIC8vIG5vdGUsIG9taXRzIHRyYWlsaW5nIHBhcmFncmFwaCBjaGFyCi0gICAgICAgICAgICBmbG9hdCB3ID0gbWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGksIG5leHQsIG51bGwsIHRydWUsIG51bGwpOworICAgICAgICAgICAgZmxvYXQgdyA9IG1lYXN1cmVQYXJhKHBhaW50LCB3b3JrUGFpbnQsIHNvdXJjZSwgaSwgbmV4dCk7CiAKICAgICAgICAgICAgIGlmICh3ID4gbmVlZCkKICAgICAgICAgICAgICAgICBuZWVkID0gdzsKQEAgLTExNiw2ICsxMTcsMTUgQEAKICAgICAgICAgaWYgKHdpZHRoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxheW91dDogIiArIHdpZHRoICsgIiA8IDAiKTsKIAorICAgICAgICAvLyBFbnN1cmUgcGFpbnQgZG9lc24ndCBoYXZlIGJhc2VsaW5lU2hpZnQgc2V0LgorICAgICAgICAvLyBXaGlsZSBub3JtYWxseSB3ZSBkb24ndCBtb2RpZnkgdGhlIHBhaW50IHRoZSB1c2VyIHBhc3NlZCBpbiwKKyAgICAgICAgLy8gd2Ugd2VyZSBhbHJlYWR5IGRvaW5nIHRoaXMgaW4gU3R5bGVkLmRyYXdVbmlmb3JtUnVuIHdpdGggYm90aAorICAgICAgICAvLyBiYXNlbGluZVNoaWZ0IGFuZCBiZ0NvbG9yLiAgV2UgcHJvYmFibHkgc2hvdWxkIHJlZXZhbHVhdGUgYmdDb2xvci4KKyAgICAgICAgaWYgKHBhaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOworICAgICAgICAgICAgcGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgIH0KKwogICAgICAgICBtVGV4dCA9IHRleHQ7CiAgICAgICAgIG1QYWludCA9IHBhaW50OwogICAgICAgICBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOwpAQCAtMTc1LDcgKzE4NSw2IEBACiAgICAgICAgICAgICBkYm90dG9tID0gc1RlbXBSZWN0LmJvdHRvbTsKICAgICAgICAgfQogCi0KICAgICAgICAgaW50IHRvcCA9IDA7CiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGdldExpbmVDb3VudCgpKTsKIApAQCAtMTg1LDI2ICsxOTQsMjggQEAKICAgICAgICAgaWYgKGRib3R0b20gPCBib3R0b20pIHsKICAgICAgICAgICAgIGJvdHRvbSA9IGRib3R0b207CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBmaXJzdCA9IGdldExpbmVGb3JWZXJ0aWNhbCh0b3ApOyAKKworICAgICAgICBpbnQgZmlyc3QgPSBnZXRMaW5lRm9yVmVydGljYWwodG9wKTsKICAgICAgICAgaW50IGxhc3QgPSBnZXRMaW5lRm9yVmVydGljYWwoYm90dG9tKTsKLSAgICAgICAgCisKICAgICAgICAgaW50IHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICBpbnQgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKLSAgICAgICAgCisKICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbVBhaW50OwogICAgICAgICBDaGFyU2VxdWVuY2UgYnVmID0gbVRleHQ7CiAgICAgICAgIGludCB3aWR0aCA9IG1XaWR0aDsKICAgICAgICAgYm9vbGVhbiBzcGFubmVkVGV4dCA9IG1TcGFubmVkVGV4dDsKIAogICAgICAgICBQYXJhZ3JhcGhTdHlsZVtdIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgaW50IHNwYW5lbmQgPSAwOworICAgICAgICBpbnQgc3BhbkVuZCA9IDA7CiAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gMDsKIAogICAgICAgICAvLyBGaXJzdCwgZHJhdyBMaW5lQmFja2dyb3VuZFNwYW5zLgotICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50IG9yIGRpcmVjdGlvbiBvZgotICAgICAgICAvLyB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PworICAgICAgICAvLyBMaW5lQmFja2dyb3VuZFNwYW5zIGtub3cgbm90aGluZyBhYm91dCB0aGUgYWxpZ25tZW50LCBtYXJnaW5zLCBvcgorICAgICAgICAvLyBkaXJlY3Rpb24gb2YgdGhlIGxheW91dCBvciBsaW5lLiAgWFhYOiBTaG91bGQgdGhleT8KKyAgICAgICAgLy8gVGhleSBhcmUgZXZhbHVhdGVkIGF0IGVhY2ggbGluZS4KICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKICAgICAgICAgICAgIHRleHRMZW5ndGggPSBidWYubGVuZ3RoKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcHJldmlvdXNMaW5lRW5kOwpAQCAtMjE2LDEyICsyMjcsMTQgQEAKICAgICAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOwotICAgICAgICAgICAgICAgICAgIHNwYW5lbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIHNwYW5lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBpbmZyZXF1ZW50LCBzbyB3ZSdsbCB1c2UgdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgYXMgb2Z0ZW4uCisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxsIExpbmVCYWNrZ3JvdW5kU3BhbnMgb24gYSBsaW5lIGNvbnRyaWJ1dGUgdG8gaXRzCisgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zLmxlbmd0aDsgbisrKSB7CkBAIC0yMzQsMTEgKzI0NywxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlc2V0IHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICAgICAgc3BhbmVuZCA9IDA7CisgICAgICAgICAgICBzcGFuRW5kID0gMDsKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGdldExpbmVUb3AoZmlyc3QpOwogICAgICAgICAgICAgcHJldmlvdXNMaW5lRW5kID0gZ2V0TGluZVN0YXJ0KGZpcnN0KTsKICAgICAgICAgICAgIHNwYW5zID0gTk9fUEFSQV9TUEFOUzsKLSAgICAgICAgfSAKKyAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhIGhpZ2hsaWdodCBldmVuIHdpdGhvdXQgc3BhbnMgaWYgd2UgYXJlIGRyYXdpbmcKICAgICAgICAgLy8gYSBub24tc3Bhbm5lZCB0cmFuc2Zvcm1hdGlvbiBvZiBhIHNwYW5uZWQgZWRpdGluZyBidWZmZXIuCkBAIC0yNTUsNyArMjY4LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBtQWxpZ25tZW50OwotICAgICAgICAKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBib29sZWFuIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisKICAgICAgICAgLy8gTmV4dCBkcmF3IHRoZSBsaW5lcywgb25lIGF0IGEgdGltZS4KICAgICAgICAgLy8gdGhlIGJhc2VsaW5lIGlzIHRoZSB0b3Agb2YgdGhlIGZvbGxvd2luZyBsaW5lIG1pbnVzIHRoZSBjdXJyZW50CiAgICAgICAgIC8vIGxpbmUncyBkZXNjZW50LgpAQCAtMjcwLDE5ICsyODcsMzAgQEAKICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CiAgICAgICAgICAgICBpbnQgbGJhc2VsaW5lID0gbGJvdHRvbSAtIGdldExpbmVEZXNjZW50KGkpOwogCi0gICAgICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7IAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSAwIHx8IGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQYXJhTGluZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb21wdXRlIHRoZSBhbGlnbm1lbnQuCi0gICAgICAgICAgICAgICAgLy8gTGFzdCBhbGlnbm1lbnQgc3R5bGUgd2lucy4KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbmVuZCkgewotICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgc3BhbmVuZCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihzdGFydCwgdGV4dExlbmd0aCwKKyAgICAgICAgICAgIGludCBkaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24oaSk7CisgICAgICAgICAgICBpbnQgbGVmdCA9IDA7CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBtV2lkdGg7CisKKyAgICAgICAgICAgIGlmIChzcGFubmVkVGV4dCkgeworICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgYnVmOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaXJzdFBhcmFMaW5lID0gKHN0YXJ0ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jaGFyQXQoc3RhcnQgLSAxKSA9PSAnXG4nKTsKKworICAgICAgICAgICAgICAgIC8vIE5ldyBiYXRjaCBvZiBwYXJhZ3JhcGggc3R5bGVzLCBjb2xsZWN0IGludG8gc3BhbnMgYXJyYXkuCisgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYWxpZ25tZW50LCBsYXN0IGFsaWdubWVudCBzdHlsZSB3aW5zLgorICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRhYlN0b3BzLCB3ZSdsbCByZWJ1aWxkIGlmIHdlIGVuY291bnRlciBhIGxpbmUgd2l0aAorICAgICAgICAgICAgICAgIC8vIHRhYnMuCisgICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0IHBhcmFncmFwaCBzcGFucyB0byBiZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIHVzZQorICAgICAgICAgICAgICAgIC8vIHNwYW5FbmQgc28gdGhhdCB3ZSBjYW4gY2hlY2sgbGVzcyBmcmVxdWVudGx5LiAgU2luY2UKKyAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGggc3R5bGVzIG91Z2h0IHRvIGFwcGx5IHRvIGVudGlyZSBwYXJhZ3JhcGhzLCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbGxlY3QgdGhlIG9uZXMgcHJlc2VudCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcmFncmFwaC4KKyAgICAgICAgICAgICAgICAvLyBJZiBzcGFuRW5kIGlzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGgsIHRoYXQncyBub3QKKyAgICAgICAgICAgICAgICAvLyBvdXIgcHJvYmxlbS4KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCAmJiAoaSA9PSBmaXJzdCB8fCBpc0ZpcnN0UGFyYUxpbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwYW5FbmQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBzcGFucyA9IHNwLmdldFNwYW5zKHN0YXJ0LCBzcGFuZW5kLCBQYXJhZ3JhcGhTdHlsZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwLCBzdGFydCwgc3BhbkVuZCwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpOworCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gbUFsaWdubWVudDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IHNwYW5zLmxlbmd0aC0xOyBuID49IDA7IG4tLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zW25dIGluc3RhbmNlb2YgQWxpZ25tZW50U3BhbikgewpAQCAtMjkwLDQ1ICszMTgsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihpKTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMDsKLSAgICAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKIAotICAgICAgICAgICAgLy8gRHJhdyBhbGwgbGVhZGluZyBtYXJnaW4gc3BhbnMuICBBZGp1c3QgbGVmdCBvciByaWdodCBhY2NvcmRpbmcKLSAgICAgICAgICAgIC8vIHRvIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoZSBsaW5lLgotICAgICAgICAgICAgaWYgKHNwYW5uZWRUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzSXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERyYXcgYWxsIGxlYWRpbmcgbWFyZ2luIHNwYW5zLiAgQWRqdXN0IGxlZnQgb3IgcmlnaHQgYWNjb3JkaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24gb2YgdGhlIGxpbmUuCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNwYW5zLmxlbmd0aDsKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuc1tuXSBpbnN0YW5jZW9mIExlYWRpbmdNYXJnaW5TcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBtYXJnaW4gPSAoTGVhZGluZ01hcmdpblNwYW4pIHNwYW5zW25dOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VGaXJzdExpbmVNYXJnaW4gPSBpc0ZpcnN0UGFyYUxpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFyZ2luIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpIG1hcmdpbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydExpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KHNwLmdldFNwYW5TdGFydChtYXJnaW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGaXJzdExpbmVNYXJnaW4gPSBpIDwgc3RhcnRMaW5lICsgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4uZHJhd0xlYWRpbmdNYXJnaW4oYywgcGFpbnQsIHJpZ2h0LCBkaXIsIGx0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiYXNlbGluZSwgbGJvdHRvbSwgYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBpc0ZpcnN0UGFyYUxpbmUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbihpc0ZpcnN0UGFyYUxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09IG1hcmdpbi5nZXRMZWFkaW5nTWFyZ2luKHVzZUZpcnN0TGluZU1hcmdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi5kcmF3TGVhZGluZ01hcmdpbihjLCBwYWludCwgbGVmdCwgZGlyLCBsdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYmFzZWxpbmUsIGxib3R0b20sIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgaXNGaXJzdFBhcmFMaW5lLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJnaW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpbWFyZ2luKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1hcmdpbiA9IGNvdW50ID4gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArPSBtYXJnaW4uZ2V0TGVhZGluZ01hcmdpbih1c2VNYXJnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gbWFyZ2luLmdldExlYWRpbmdNYXJnaW4odXNlRmlyc3RMaW5lTWFyZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBwb2ludCBhdCB3aGljaCB0byBzdGFydCByZW5kZXJpbmcgZGVwZW5kaW5nIG9uIHRoZQotICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgICAgICBib29sZWFuIGhhc1RhYk9yRW1vamkgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CisgICAgICAgICAgICAvLyBDYW4ndCB0ZWxsIGlmIHdlIGhhdmUgdGFicyBmb3Igc3VyZSwgY3VycmVudGx5CisgICAgICAgICAgICBpZiAoaGFzVGFiT3JFbW9qaSAmJiAhdGFiU3RvcHNJc0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhYlN0b3BzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgc3BhbnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzLnJlc2V0KFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFiU3RvcHNJc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX05PUk1BTCkgewogICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKQEAgLTMzNyw0MSArMzY5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgIHggPSByaWdodDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVNYXgoaSwgc3BhbnMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4ID0gKGludClnZXRMaW5lRXh0ZW50KGksIHRhYlN0b3BzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCArIG1heDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJpZ2h0IC0gbWF4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50LkFMSUdOX0NFTlRFUgotICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXggJiB+MTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYgPSAocmlnaHQgLSBsZWZ0IC0gbWF4KSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4ID0gcmlnaHQgLSBoYWxmOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGxlZnQgLSBtYXg7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCAmIH4xOworICAgICAgICAgICAgICAgICAgICB4ID0gKHJpZ2h0ICsgbGVmdCAtIG1heCkgPj4gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGkpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWIgPSBnZXRMaW5lQ29udGFpbnNUYWIoaSk7CiAgICAgICAgICAgICBpZiAoZGlyZWN0aW9ucyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUICYmCi0gICAgICAgICAgICAgICAgICAgICFzcGFubmVkVGV4dCAmJiAhaGFzVGFiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIXNwYW5uZWRUZXh0ICYmICFoYXNUYWJPckVtb2ppKSB7CiAgICAgICAgICAgICAgICAgLy8gWFhYOiBhc3N1bWVzIHRoZXJlJ3Mgbm90aGluZyBhZGRpdGlvbmFsIHRvIGJlIGRvbmUKICAgICAgICAgICAgICAgICBjLmRyYXdUZXh0KGJ1Ziwgc3RhcnQsIGVuZCwgeCwgbGJhc2VsaW5lLCBwYWludCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRyYXdUZXh0KGMsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sIHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICBoYXNUYWIsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICB0bC5zZXQocGFpbnQsIGJ1Ziwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJPckVtb2ppLCB0YWJTdG9wcyk7CisgICAgICAgICAgICAgICAgdGwuZHJhdyhjLCB4LCBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbGluZSwgZ2l2ZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcworICAgICAqIG9mIHRoZSBtYXJnaW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcGFyYW0gbGVmdCB0aGUgbGVmdCBib3VuZHMgKDAsIG9yIGxlYWRpbmcgbWFyZ2luIGlmIGx0ciBwYXJhKQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgYm91bmRzICh3aWR0aCwgbWludXMgbGVhZGluZyBtYXJnaW4gaWYgcnRsIHBhcmEpCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUgKHRvIHJpZ2h0IG9mIGxpbmUgaWYgcnRsIHBhcmEpCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVN0YXJ0UG9zKGludCBsaW5lLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CisgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnQgYXQgd2hpY2ggdG8gc3RhcnQgcmVuZGVyaW5nIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguCisgICAgICAgIEFsaWdubWVudCBhbGlnbiA9IGdldFBhcmFncmFwaEFsaWdubWVudChsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBpbnQgeDsKKyAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICB4ID0gbGVmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeCA9IHJpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCAmJiBnZXRMaW5lQ29udGFpbnNUYWIobGluZSkpIHsKKyAgICAgICAgICAgICAgICBTcGFubmVkIHNwYW5uZWQgPSAoU3Bhbm5lZCkgbVRleHQ7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gc3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24oc3RhcnQsIHNwYW5uZWQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJTcGFucyA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHN0YXJ0LCBzcGFuRW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKHRhYlNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFiU3RvcHMgPSBuZXcgVGFiU3RvcHMoVEFCX0lOQ1JFTUVOVCwgdGFiU3BhbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBtYXggPSAoaW50KWdldExpbmVFeHRlbnQobGluZSwgdGFiU3RvcHMsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChhbGlnbiA9PSBBbGlnbm1lbnQuQUxJR05fT1BQT1NJVEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSByaWdodCAtIG1heDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4ID0gbGVmdCAtIG1heDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSCisgICAgICAgICAgICAgICAgbWF4ID0gbWF4ICYgfjE7CisgICAgICAgICAgICAgICAgeCA9IChsZWZ0ICsgcmlnaHQgLSBtYXgpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MTcsNyArNDg4LDcgQEAKIAogICAgICAgICBtV2lkdGggPSB3aWQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhpcyBsYXlvdXQuCiAgICAgICovCkBAIC00NTAsNyArNTIxLDcgQEAKICAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0ZXh0IGluIHRoaXMgbGF5b3V0LgogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGluZUNvdW50KCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGJhc2VsaW5lIGZvciB0aGUgc3BlY2lmaWVkIGxpbmUgKDAmaGVsbGlwO2dldExpbmVDb3VudCgpIC0gMSkKICAgICAgKiBJZiBib3VuZHMgaXMgbm90IG51bGwsIHJldHVybiB0aGUgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIGV4dGVudHMKQEAgLTUyNCwxMyArNTk1LDk1IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRCb3R0b21QYWRkaW5nKCk7CiAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCBhbmQgdGhlIHByZWNlZGluZyBjaGFyYWN0ZXIKKyAgICAgKiBhcmUgYXQgZGlmZmVyZW50IHJ1biBsZXZlbHMgKGFuZCB0aHVzIHRoZXJlJ3MgYSBzcGxpdCBjYXJldCkuCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0CisgICAgICogQHJldHVybiB0cnVlIGlmIGF0IGEgbGV2ZWwgYm91bmRhcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMZXZlbEJvdW5kYXJ5KGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlycyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpZiAoZGlycyA9PSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUIHx8IGRpcnMgPT0gRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gcnVucyA9IGRpcnMubURpcmVjdGlvbnM7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBsaW5lU3RhcnQgfHwgb2Zmc2V0ID09IGxpbmVFbmQpIHsKKyAgICAgICAgICAgIGludCBwYXJhTGV2ZWwgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICAgICAgaW50IHJ1bkluZGV4ID0gb2Zmc2V0ID09IGxpbmVTdGFydCA/IDAgOiBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgICAgICByZXR1cm4gKChydW5zW3J1bkluZGV4ICsgMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSykgIT0gcGFyYUxldmVsOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0IC09IGxpbmVTdGFydDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IHJ1bnNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHByaW1hcnlJc1RyYWlsaW5nUHJldmlvdXMoaW50IG9mZnNldCkgeworICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVFbmQgPSBnZXRMaW5lRW5kKGxpbmUpOworICAgICAgICBpbnRbXSBydW5zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSkubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IGxldmVsQXQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgaW50IGxpbWl0ID0gc3RhcnQgKyAocnVuc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGlmIChsaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciBpcyBhdCBzYW1lIGxldmVsLCBzbyBkb24ndCB1c2UgdHJhaWxpbmcuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGV2ZWxBdCA9IChydW5zW2krMV0gPj4+IFJVTl9MRVZFTF9TSElGVCkgJiBSVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWxBdCA9PSAtMSkgeworICAgICAgICAgICAgLy8gT2Zmc2V0IHdhcyBsaW1pdCBvZiBsaW5lLgorICAgICAgICAgICAgbGV2ZWxBdCA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PSAxID8gMCA6IDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCBsZXZlbCBib3VuZGFyeSwgY2hlY2sgcHJldmlvdXMgbGV2ZWwuCisgICAgICAgIGludCBsZXZlbEJlZm9yZSA9IC0xOworICAgICAgICBpZiAob2Zmc2V0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSkgPT0gMSA/IDAgOiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0IC09IDE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW2ldOworICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IHN0YXJ0ICsgKHJ1bnNbaSsxXSAmIFJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgaWYgKGxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGxpbmVFbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhcnQgJiYgb2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxCZWZvcmUgPSAocnVuc1tpKzFdID4+PiBSVU5fTEVWRUxfU0hJRlQpICYgUlVOX0xFVkVMX01BU0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsZXZlbEJlZm9yZSA8IGxldmVsQXQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBwcmltYXJ5IGhvcml6b250YWwgcG9zaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGV4dCBvZmZzZXQuCiAgICAgICogVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hlcmUgYSBuZXcgY2hhcmFjdGVyIHdvdWxkIGJlIGluc2VydGVkIGluCiAgICAgICogdGhlIHBhcmFncmFwaCdzIHByaW1hcnkgZGlyZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRQcmltYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgZmFsc2UsIHRydWUpOworICAgICAgICBib29sZWFuIHRyYWlsaW5nID0gcHJpbWFyeUlzVHJhaWxpbmdQcmV2aW91cyhvZmZzZXQpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUzOSw2NiArNjkyLDQyIEBACiAgICAgICogdGhlIGRpcmVjdGlvbiBvdGhlciB0aGFuIHRoZSBwYXJhZ3JhcGgncyBwcmltYXJ5IGRpcmVjdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBwcmltYXJ5SXNUcmFpbGluZ1ByZXZpb3VzKG9mZnNldCk7CisgICAgICAgIHJldHVybiBnZXRIb3Jpem9udGFsKG9mZnNldCwgIXRyYWlsaW5nKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQpIHsKKyAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZykgewogICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKIAotICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBhbHQsIGxpbmUpOworICAgICAgICByZXR1cm4gZ2V0SG9yaXpvbnRhbChvZmZzZXQsIHRyYWlsaW5nLCBsaW5lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGZsb2F0IGdldEhvcml6b250YWwoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgYm9vbGVhbiBhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7CisgICAgcHJpdmF0ZSBmbG9hdCBnZXRIb3Jpem9udGFsKGludCBvZmZzZXQsIGJvb2xlYW4gdHJhaWxpbmcsIGludCBsaW5lKSB7CiAgICAgICAgIGludCBzdGFydCA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaW50IGVuZCA9IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKICAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLSAgICAgICAgYm9vbGVhbiB0YWIgPSBnZXRMaW5lQ29udGFpbnNUYWIobGluZSk7CisgICAgICAgIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKICAgICAgICAgRGlyZWN0aW9ucyBkaXJlY3Rpb25zID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7CiAKLSAgICAgICAgVGFiU3RvcFNwYW5bXSB0YWJzID0gbnVsbDsKLSAgICAgICAgaWYgKHRhYiAmJiBtVGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIHRhYnMgPSAoKFNwYW5uZWQpIG1UZXh0KS5nZXRTcGFucyhzdGFydCwgZW5kLCBUYWJTdG9wU3Bhbi5jbGFzcyk7CisgICAgICAgIFRhYlN0b3BzIHRhYlN0b3BzID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgd2lkID0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LCBtVGV4dCwgc3RhcnQsIG9mZnNldCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIsIGRpcmVjdGlvbnMsIHRyYWlsaW5nLCBhbHQsIHRhYiwgdGFicyk7CisgICAgICAgIFRleHRMaW5lIHRsID0gVGV4dExpbmUub2J0YWluKCk7CisgICAgICAgIHRsLnNldChtUGFpbnQsIG1UZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYk9yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkID0gdGwubWVhc3VyZShvZmZzZXQgLSBzdGFydCwgdHJhaWxpbmcsIG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKIAotICAgICAgICBpZiAob2Zmc2V0ID4gZW5kKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHdpZCAtPSBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0LCBlbmQsIG9mZnNldCwgbnVsbCwgdGFiLCB0YWJzKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3aWQgKz0gbWVhc3VyZVRleHQobVBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgZW5kLCBvZmZzZXQsIG51bGwsIHRhYiwgdGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGlnbm1lbnQgYWxpZ24gPSBnZXRQYXJhZ3JhcGhBbGlnbm1lbnQobGluZSk7CiAgICAgICAgIGludCBsZWZ0ID0gZ2V0UGFyYWdyYXBoTGVmdChsaW5lKTsKICAgICAgICAgaW50IHJpZ2h0ID0gZ2V0UGFyYWdyYXBoUmlnaHQobGluZSk7CiAKLSAgICAgICAgaWYgKGFsaWduID09IEFsaWdubWVudC5BTElHTl9OT1JNQUwpIHsKLSAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgd2lkOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgbWF4ID0gZ2V0TGluZU1heChsaW5lKTsKLQotICAgICAgICBpZiAoYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgbWF4ICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtIG1heCArIHdpZDsKLSAgICAgICAgfSBlbHNlIHsgLyogYWxpZ24gPT0gQWxpZ25tZW50LkFMSUdOX0NFTlRFUiAqLwotICAgICAgICAgICAgaW50IGltYXggPSAoKGludCkgbWF4KSAmIH4xOwotCi0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHJldHVybiByaWdodCAtICgoKHJpZ2h0IC0gbGVmdCkgLSBpbWF4KSAvIDIpICsgd2lkOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgKChyaWdodCAtIGxlZnQpIC0gaW1heCkgLyAyICsgd2lkOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXRMaW5lU3RhcnRQb3MobGluZSwgbGVmdCwgcmlnaHQpICsgd2lkOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjU2LDM4ICs3ODUsNzYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZwotICAgICAqIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICogR2V0cyB0aGUgdW5zaWduZWQgaG9yaXpvbnRhbCBleHRlbnQgb2YgdGhlIHNwZWNpZmllZCBsaW5lLCBpbmNsdWRpbmcKKyAgICAgKiBsZWFkaW5nIG1hcmdpbiBpbmRlbnQsIGJ1dCBleGNsdWRpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gZ2V0TGluZU1heChsaW5lLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGZsb2F0IG1hcmdpbiA9IGdldFBhcmFncmFwaExlYWRpbmdNYXJnaW4obGluZSk7CisgICAgICAgIGZsb2F0IHNpZ25lZEV4dGVudCA9IGdldExpbmVFeHRlbnQobGluZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIGhvcml6b250YWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgbGluZSwgaW5jbHVkaW5nCi0gICAgICogdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBHZXRzIHRoZSB1bnNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGluY2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luIGluZGVudCBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0TGluZVdpZHRoKGludCBsaW5lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5lTWF4KGxpbmUsIG51bGwsIHRydWUpOworICAgICAgICBmbG9hdCBtYXJnaW4gPSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOworICAgICAgICBmbG9hdCBzaWduZWRFeHRlbnQgPSBnZXRMaW5lRXh0ZW50KGxpbmUsIHRydWUpOworICAgICAgICByZXR1cm4gbWFyZ2luICsgc2lnbmVkRXh0ZW50ID49IDAgPyBzaWduZWRFeHRlbnQgOiAtc2lnbmVkRXh0ZW50OwogICAgIH0KIAotICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZU1heChpbnQgbGluZSwgT2JqZWN0W10gdGFicywgYm9vbGVhbiBmdWxsKSB7CisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI2dldExpbmVFeHRlbnQoaW50LFRhYlN0b3BzLGJvb2xlYW4pfSBidXQgZGV0ZXJtaW5lcyB0aGUKKyAgICAgKiB0YWIgc3RvcHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgb25lcyBwYXNzZWQgaW4uCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGluZGV4IG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZ1bGwgd2hldGhlciB0byBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnQgb2YgdGhlIGxpbmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGdldExpbmVFeHRlbnQoaW50IGxpbmUsIGJvb2xlYW4gZnVsbCkgewogICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQ7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOwogCi0gICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZW5kID0gZ2V0TGluZVZpc2libGVFbmQobGluZSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGJvb2xlYW4gdGFiID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOwotCi0gICAgICAgIGlmICh0YWJzID09IG51bGwgJiYgdGFiICYmIG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgYm9vbGVhbiBoYXNUYWJzT3JFbW9qaSA9IGdldExpbmVDb250YWluc1RhYihsaW5lKTsKKyAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOworICAgICAgICBpZiAoaGFzVGFic09yRW1vamkgJiYgbVRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICAvLyBKdXN0IGNoZWNraW5nIHRoaXMgbGluZSBzaG91bGQgYmUgZ29vZCBlbm91Z2gsIHRhYnMgc2hvdWxkIGJlCisgICAgICAgICAgICAvLyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgbGluZXMgaW4gYSBwYXJhZ3JhcGguCisgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgbVRleHQsIHN0YXJ0LCBlbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh0YWJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCB0YWJzKTsgLy8gWFhYIHNob3VsZCByZXVzZQorICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOworICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwogCi0gICAgICAgIHJldHVybiBtZWFzdXJlVGV4dChtUGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dCwgc3RhcnQsIGVuZCwgbnVsbCwgdGFiLCB0YWJzKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdGwuc2V0KG1QYWludCwgbVRleHQsIHN0YXJ0LCBlbmQsIGRpciwgZGlyZWN0aW9ucywgaGFzVGFic09yRW1vamksIHRhYlN0b3BzKTsKKyAgICAgICAgZmxvYXQgd2lkdGggPSB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpZ25lZCBob3Jpem9udGFsIGV4dGVudCBvZiB0aGUgc3BlY2lmaWVkIGxpbmUsIGV4Y2x1ZGluZworICAgICAqIGxlYWRpbmcgbWFyZ2luLiAgSWYgZnVsbCBpcyBmYWxzZSwgZXhjbHVkZXMgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgKiBAcGFyYW0gbGluZSB0aGUgaW5kZXggb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gdGFiU3RvcHMgdGhlIHRhYiBzdG9wcywgY2FuIGJlIG51bGwgaWYgd2Uga25vdyB0aGV5J3JlIG5vdCB1c2VkLgorICAgICAqIEBwYXJhbSBmdWxsIHdoZXRoZXIgdG8gaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICogQHJldHVybiB0aGUgZXh0ZW50IG9mIHRoZSB0ZXh0IG9uIHRoaXMgbGluZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgZ2V0TGluZUV4dGVudChpbnQgbGluZSwgVGFiU3RvcHMgdGFiU3RvcHMsIGJvb2xlYW4gZnVsbCkgeworICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBlbmQgPSBmdWxsID8gZ2V0TGluZUVuZChsaW5lKSA6IGdldExpbmVWaXNpYmxlRW5kKGxpbmUpOworICAgICAgICBib29sZWFuIGhhc1RhYnNPckVtb2ppID0gZ2V0TGluZUNvbnRhaW5zVGFiKGxpbmUpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKKworICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBkaXJlY3Rpb25zLCBoYXNUYWJzT3JFbW9qaSwgdGFiU3RvcHMpOworICAgICAgICBmbG9hdCB3aWR0aCA9IHRsLm1ldHJpY3MobnVsbCk7CisgICAgICAgIFRleHRMaW5lLnJlY3ljbGUodGwpOworICAgICAgICByZXR1cm4gd2lkdGg7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzgsNyArOTA1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNmaWVkIGxpbmUgd2hvc2UgcG9zaXRpb24gaXMKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgb24gdGhlIHNwZWNpZmllZCBsaW5lIHdob3NlIHBvc2l0aW9uIGlzCiAgICAgICogY2xvc2VzdCB0byB0aGUgc3BlY2lmaWVkIGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGludCBsaW5lLCBmbG9hdCBob3JpeikgewpAQCAtNzQ5LDIwICs5MTYsMTYgQEAKICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQogICAgICAgICAgICAgbWF4Kys7CiAKLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgbWF4ID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZ2V0TGluZUVuZChsaW5lKSk7Ci0KICAgICAgICAgaW50IGJlc3QgPSBtaW47CiAgICAgICAgIGZsb2F0IGJlc3RkaXN0ID0gTWF0aC5hYnMoZ2V0UHJpbWFyeUhvcml6b250YWwoYmVzdCkgLSBob3Jpeik7CiAKLSAgICAgICAgaW50IGhlcmUgPSBtaW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpbnQgc3dhcCA9ICgoaSAmIDEpID09IDApID8gMSA6IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbWluICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgIGludCBzd2FwID0gKGRpcnMubURpcmVjdGlvbnNbaSsxXSAmIFJVTl9SVExfRkxBRykgIT0gMCA/IC0xIDogMTsKIAogICAgICAgICAgICAgaWYgKHRoZXJlID4gbWF4KQogICAgICAgICAgICAgICAgIHRoZXJlID0gbWF4OwotCiAgICAgICAgICAgICBpbnQgaGlnaCA9IHRoZXJlIC0gMSArIDEsIGxvdyA9IGhlcmUgKyAxIC0gMSwgZ3Vlc3M7CiAKICAgICAgICAgICAgIHdoaWxlIChoaWdoIC0gbG93ID4gMSkgewpAQCAtNzk1LDcgKzk1OCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IGJlc3RkaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsgICAKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGxvdzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTgwNSw4ICs5NjgsNiBAQAogICAgICAgICAgICAgICAgIGJlc3RkaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgZGlzdCA9IE1hdGguYWJzKGdldFByaW1hcnlIb3Jpem9udGFsKG1heCkgLSBob3Jpeik7CkBAIC04MjYsMTkgKzk4NywxNSBAQAogICAgICAgICByZXR1cm4gZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKICAgICB9CiAKLSAgICAvKiogCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0ZXh0IG9mZnNldCBhZnRlciB0aGUgbGFzdCB2aXNpYmxlIGNoYXJhY3RlciAoc28gd2hpdGVzcGFjZQogICAgICAqIGlzIG5vdCBjb3VudGVkKSBvbiB0aGUgc3BlY2lmaWVkIGxpbmUuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaW5lVmlzaWJsZUVuZChpbnQgbGluZSkgewogICAgICAgICByZXR1cm4gZ2V0TGluZVZpc2libGVFbmQobGluZSwgZ2V0TGluZVN0YXJ0KGxpbmUpLCBnZXRMaW5lU3RhcnQobGluZSsxKSk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldExpbmVWaXNpYmxlRW5kKGludCBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShnZXRMaW5lU3RhcnQobGluZSkgPT0gc3RhcnQgJiYgZ2V0TGluZVN0YXJ0KGxpbmUrMSkgPT0gZW5kKTsKLSAgICAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGluZVZpc2libGVFbmQoaW50IGxpbmUsIGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1UZXh0OwogICAgICAgICBjaGFyIGNoOwogICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpIHsKQEAgLTg4NSwyMDcgKzEwNDIsNjIgQEAKICAgICAgICAgcmV0dXJuIGdldExpbmVUb3AobGluZSkgLSAoZ2V0TGluZVRvcChsaW5lKzEpIC0gZ2V0TGluZURlc2NlbnQobGluZSkpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyBsZWZ0Ci0gICAgICogKHBvc3NpYmx5IG9udG8gYW5vdGhlciBsaW5lKSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgotICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0VG9MZWZ0T2YoaW50IG9mZnNldCkgewotICAgICAgICBpbnQgbGluZSA9IGdldExpbmVGb3JPZmZzZXQob2Zmc2V0KTsKLSAgICAgICAgaW50IHN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpbnQgZW5kID0gZ2V0TGluZUVuZChsaW5lKTsKLSAgICAgICAgRGlyZWN0aW9ucyBkaXJzID0gZ2V0TGluZURpcmVjdGlvbnMobGluZSk7Ci0KLSAgICAgICAgaWYgKGxpbmUgIT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgZW5kKTsKLQotICAgICAgICBmbG9hdCBob3JpeiA9IGdldFByaW1hcnlIb3Jpem9udGFsKG9mZnNldCk7Ci0KLSAgICAgICAgaW50IGJlc3QgPSBvZmZzZXQ7Ci0gICAgICAgIGZsb2F0IGJlc3RoID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0gICAgICAgIGludCBjYW5kaWRhdGU7Ci0KLSAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgb2Zmc2V0KTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBoZXJlID0gc3RhcnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5tRGlyZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IHRoZXJlID0gaGVyZSArIGRpcnMubURpcmVjdGlvbnNbaV07Ci0gICAgICAgICAgICBpZiAodGhlcmUgPiBlbmQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQ7Ci0KLSAgICAgICAgICAgIGZsb2F0IGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChoZXJlKTsKLQotICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICBiZXN0ID0gaGVyZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRBZnRlcihtVGV4dCwgaGVyZSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID49IHN0YXJ0ICYmIGNhbmRpZGF0ZSA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoY2FuZGlkYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChoIDwgaG9yaXogJiYgaCA+IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RoID0gaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIHRoZXJlKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgICAgIGggPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChjYW5kaWRhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0KLSAgICAgICAgaWYgKGggPCBob3JpeiAmJiBoID4gYmVzdGgpIHsKLSAgICAgICAgICAgIGJlc3QgPSBlbmQ7Ci0gICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmVzdCAhPSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gYmVzdDsKLQotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCi0gICAgICAgIGlmIChkaXIgPiAwKSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgLSAxLCAxMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobGluZSA9PSBnZXRMaW5lQ291bnQoKSAtIDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE9mZnNldEZvckhvcml6b250YWwobGluZSArIDEsIDEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihvZmZzZXQsIHRydWUpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGV4dCBvZmZzZXQgdGhhdCB3b3VsZCBiZSByZWFjaGVkIGJ5IG1vdmluZyByaWdodAotICAgICAqIChwb3NzaWJseSBvbnRvIGFub3RoZXIgbGluZSkgZnJvbSB0aGUgc3BlY2lmaWVkIG9mZnNldC4KLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE9mZnNldFRvUmlnaHRPZihpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChvZmZzZXQpOwotICAgICAgICBpbnQgc3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7Ci0gICAgICAgIGludCBlbmQgPSBnZXRMaW5lRW5kKGxpbmUpOwotICAgICAgICBEaXJlY3Rpb25zIGRpcnMgPSBnZXRMaW5lRGlyZWN0aW9ucyhsaW5lKTsKKyAgICAgICAgcmV0dXJuIGdldE9mZnNldFRvTGVmdFJpZ2h0T2Yob2Zmc2V0LCBmYWxzZSk7CisgICAgfQogCi0gICAgICAgIGlmIChsaW5lICE9IGdldExpbmVDb3VudCgpIC0gMSkKLSAgICAgICAgICAgIGVuZCA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIGVuZCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihpbnQgY2FyZXQsIGJvb2xlYW4gdG9MZWZ0KSB7CisgICAgICAgIGludCBsaW5lID0gZ2V0TGluZUZvck9mZnNldChjYXJldCk7CisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IGxpbmVEaXIgPSBnZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSk7CiAKLSAgICAgICAgZmxvYXQgaG9yaXogPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChvZmZzZXQpOwotCi0gICAgICAgIGludCBiZXN0ID0gb2Zmc2V0OwotICAgICAgICBmbG9hdCBiZXN0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICBpbnQgY2FuZGlkYXRlOwotCi0gICAgICAgIGNhbmRpZGF0ZSA9IFRleHRVdGlscy5nZXRPZmZzZXRCZWZvcmUobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGUgPj0gc3RhcnQgJiYgY2FuZGlkYXRlIDw9IGVuZCkgewotICAgICAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaGVyZSA9IHN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kKQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kOwotCi0gICAgICAgICAgICBmbG9hdCBoID0gZ2V0UHJpbWFyeUhvcml6b250YWwoaGVyZSk7Ci0KLSAgICAgICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYW5kaWRhdGUgPSBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7CisgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRvTGVmdCA9PSAobGluZURpciA9PSBESVJfUklHSFRfVE9fTEVGVCk7CisgICAgICAgIGlmIChjYXJldCA9PSAoYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQpKSB7CisgICAgICAgICAgICAvLyB3YWxraW5nIG9mZiBsaW5lLCBzbyBsb29rIGF0IHRoZSBsaW5lIHdlJ3JlIGhlYWRlZCB0bworICAgICAgICAgICAgaWYgKGNhcmV0ID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAtLWxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IHN0YXJ0LCBkb24ndCBtb3ZlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA8IGdldExpbmVDb3VudCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICArK2xpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcmV0OyAvLyBhdCB2ZXJ5IGVuZCwgZG9uJ3QgbW92ZQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FuZGlkYXRlID0gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgdGhlcmUpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+PSBzdGFydCAmJiBjYW5kaWRhdGUgPD0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGNhbmRpZGF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaCA+IGhvcml6ICYmIGggPCBiZXN0aCkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBiZXN0aCA9IGg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZVN0YXJ0ID0gZ2V0TGluZVN0YXJ0KGxpbmUpOworICAgICAgICAgICAgbGluZUVuZCA9IGdldExpbmVFbmQobGluZSk7CisgICAgICAgICAgICBpbnQgbmV3RGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICAgICAgaWYgKG5ld0RpciAhPSBsaW5lRGlyKSB7CisgICAgICAgICAgICAgICAgLy8gdW51c3VhbCBjYXNlLiAgd2Ugd2FudCB0byB3YWxrIG9udG8gdGhlIGxpbmUsIGJ1dCBpdCBydW5zCisgICAgICAgICAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGZha2UgbW92ZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorICAgICAgICAgICAgICAgIHRvTGVmdCA9ICF0b0xlZnQ7CisgICAgICAgICAgICAgICAgbGluZURpciA9IG5ld0RpcjsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgaCA9IGdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7CisgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9ucyA9IGdldExpbmVEaXJlY3Rpb25zKGxpbmUpOwogCi0gICAgICAgIGlmIChoID4gaG9yaXogJiYgaCA8IGJlc3RoKSB7Ci0gICAgICAgICAgICBiZXN0ID0gZW5kOwotICAgICAgICAgICAgYmVzdGggPSBoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlc3QgIT0gb2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0KLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQotICAgICAgICBpZiAoZGlyID4gMCkgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gZ2V0TGluZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUgKyAxLCAtMTAwMDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lIC0gMSwgLTEwMDAwKTsKLSAgICAgICAgfQorICAgICAgICBUZXh0TGluZSB0bCA9IFRleHRMaW5lLm9idGFpbigpOworICAgICAgICAvLyBYWFg6IHdlIGRvbid0IGNhcmUgYWJvdXQgdGFicworICAgICAgICB0bC5zZXQobVBhaW50LCBtVGV4dCwgbGluZVN0YXJ0LCBsaW5lRW5kLCBsaW5lRGlyLCBkaXJlY3Rpb25zLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIGNhcmV0ID0gbGluZVN0YXJ0ICsgdGwuZ2V0T2Zmc2V0VG9MZWZ0UmlnaHRPZihjYXJldCAtIGxpbmVTdGFydCwgdG9MZWZ0KTsKKyAgICAgICAgdGwgPSBUZXh0TGluZS5yZWN5Y2xlKHRsKTsKKyAgICAgICAgcmV0dXJuIGNhcmV0OwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldE9mZnNldEF0U3RhcnRPZihpbnQgb2Zmc2V0KSB7CisgICAgICAgIC8vIFhYWCB0aGlzIHByb2JhYmx5IHNob3VsZCBza2lwIGxvY2FsIHJlb3JkZXJpbmdzIGFuZAorICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMsIGxvb2sgYXQgY2FsbGVycwogICAgICAgICBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gMDsKIApAQCAtMTExOCw3ICsxMTMwLDcgQEAKICAgICAvKioKICAgICAgKiBGaWxscyBpbiB0aGUgc3BlY2lmaWVkIFBhdGggd2l0aCBhIHJlcHJlc2VudGF0aW9uIG9mIGEgY3Vyc29yCiAgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuICBUaGlzIHdpbGwgb2Z0ZW4gYmUgYSB2ZXJ0aWNhbCBsaW5lCi0gICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW5vdXMgbGluZXMgaW4gdGV4dCB3aXRoIG11bHRpcGxlCisgICAgICogYnV0IGNhbiBiZSBtdWx0aXBsZSBkaXNjb250aW51b3VzIGxpbmVzIGluIHRleHQgd2l0aCBtdWx0aXBsZQogICAgICAqIGRpcmVjdGlvbmFsaXRpZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0Q3Vyc29yUGF0aChpbnQgcG9pbnQsIFBhdGggZGVzdCwKQEAgLTExMzAsNyArMTE0Miw4IEBACiAgICAgICAgIGludCBib3R0b20gPSBnZXRMaW5lVG9wKGxpbmUrMSk7CiAKICAgICAgICAgZmxvYXQgaDEgPSBnZXRQcmltYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmOwotICAgICAgICBmbG9hdCBoMiA9IGdldFNlY29uZGFyeUhvcml6b250YWwocG9pbnQpIC0gMC41ZjsKKyAgICAgICAgZmxvYXQgaDIgPSBpc0xldmVsQm91bmRhcnkocG9pbnQpID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0U2Vjb25kYXJ5SG9yaXpvbnRhbChwb2ludCkgLSAwLjVmIDogaDE7CiAKICAgICAgICAgaW50IGNhcHMgPSBUZXh0S2V5TGlzdGVuZXIuZ2V0TWV0YVN0YXRlKGVkaXRpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5NRVRBX1NISUZUX09OKSB8CkBAIC0xMjA3LDkgKzEyMjAsMTAgQEAKICAgICAgICAgaWYgKGxpbmVlbmQgPiBsaW5lc3RhcnQgJiYgbVRleHQuY2hhckF0KGxpbmVlbmQgLSAxKSA9PSAnXG4nKQogICAgICAgICAgICAgbGluZWVuZC0tOwogCi0gICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJzLm1EaXJlY3Rpb25zW2ldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubURpcmVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGludCBoZXJlID0gbGluZXN0YXJ0ICsgZGlycy5tRGlyZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyAoZGlycy5tRGlyZWN0aW9uc1tpKzFdICYgUlVOX0xFTkdUSF9NQVNLKTsKKwogICAgICAgICAgICAgaWYgKHRoZXJlID4gbGluZWVuZCkKICAgICAgICAgICAgICAgICB0aGVyZSA9IGxpbmVlbmQ7CiAKQEAgLTEyMTgsMTQgKzEyMzIsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQgZW4gPSBNYXRoLm1pbihlbmQsIHRoZXJlKTsKIAogICAgICAgICAgICAgICAgIGlmIChzdCAhPSBlbikgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBmYWxzZSwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGgyID0gZ2V0SG9yaXpvbnRhbChlbiwgdHJ1ZSwgZmFsc2UsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoMSA9IGdldEhvcml6b250YWwoc3QsIGZhbHNlLCBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIgPSBnZXRIb3Jpem9udGFsKGVuLCB0cnVlLCBsaW5lKTsKIAogICAgICAgICAgICAgICAgICAgICBkZXN0LmFkZFJlY3QoaDEsIHRvcCwgaDIsIGJvdHRvbSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjYwLDcgKzEyNzIsNyBAQAogCiAgICAgICAgICAgICBhZGRTZWxlY3Rpb24oc3RhcnRsaW5lLCBzdGFydCwgZ2V0TGluZUVuZChzdGFydGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgZ2V0TGluZUJvdHRvbShzdGFydGxpbmUpLCBkZXN0KTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKHN0YXJ0bGluZSkgPT0gRElSX1JJR0hUX1RPX0xFRlQpCiAgICAgICAgICAgICAgICAgZGVzdC5hZGRSZWN0KGdldExpbmVMZWZ0KHN0YXJ0bGluZSksIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGdldExpbmVCb3R0b20oc3RhcnRsaW5lKSwgUGF0aC5EaXJlY3Rpb24uQ1cpOwpAQCAtMTI5Niw3ICsxMzA4LDcgQEAKIAogICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7CiAgICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIG1UZXh0OwotICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAorICAgICAgICAgICAgQWxpZ25tZW50U3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3AsIGdldExpbmVTdGFydChsaW5lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVFbmQobGluZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnRTcGFuLmNsYXNzKTsKIApAQCAtMTMxMyw0MjMgKzEzMjUsMTczIEBACiAgICAgICogR2V0IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IGxlZnQgbWFyZ2lucy4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgaW50IGdldFBhcmFncmFwaExlZnQoaW50IGxpbmUpIHsKLSAgICAgICAgaW50IGRpciA9IGdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKTsKLQogICAgICAgICBpbnQgbGVmdCA9IDA7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXIgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZiA9IGdldExpbmVTdGFydChsaW5lKTsKLSAgICAgICAgaWYgKG9mZiA9PSAwIHx8IG1UZXh0LmNoYXJBdChvZmYgLSAxKSA9PSAnXG4nKQotICAgICAgICAgICAgcGFyID0gdHJ1ZTsKLQotICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSBtVGV4dDsKLSAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoZ2V0TGluZVN0YXJ0KGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lRW5kKGxpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFyZ2luID0gcGFyOwotICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBzcGFuID0gc3BhbnNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgTGVhZGluZ01hcmdpblNwYW4uTGVhZGluZ01hcmdpblNwYW4yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilzcGFuKS5nZXRMZWFkaW5nTWFyZ2luTGluZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBjb3VudCA+PSBsaW5lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gc3Bhbi5nZXRMZWFkaW5nTWFyZ2luKG1hcmdpbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OyAvLyBsZWFkaW5nIG1hcmdpbiBoYXMgbm8gaW1wYWN0LCBvciBubyBzdHlsZXMKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICByZXR1cm4gZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihsaW5lKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNwZWNpZmllZCBwYXJhZ3JhcGgsIGluc2V0IGJ5IHJpZ2h0IG1hcmdpbnMuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGludCBnZXRQYXJhZ3JhcGhSaWdodChpbnQgbGluZSkgewotICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOwotCiAgICAgICAgIGludCByaWdodCA9IG1XaWR0aDsKLQotICAgICAgICBib29sZWFuIHBhciA9IGZhbHNlOwotICAgICAgICBpbnQgb2ZmID0gZ2V0TGluZVN0YXJ0KGxpbmUpOwotICAgICAgICBpZiAob2ZmID09IDAgfHwgbVRleHQuY2hhckF0KG9mZiAtIDEpID09ICdcbicpCi0gICAgICAgICAgICBwYXIgPSB0cnVlOwotCi0KLSAgICAgICAgaWYgKGRpciA9PSBESVJfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgaWYgKG1TcGFubmVkVGV4dCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgbVRleHQ7Ci0gICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW5bXSBzcGFucyA9IHNwLmdldFNwYW5zKGdldExpbmVTdGFydChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZUVuZChsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICByaWdodCAtPSBzcGFuc1tpXS5nZXRMZWFkaW5nTWFyZ2luKHBhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpbnQgZGlyID0gZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpOworICAgICAgICBpZiAoZGlyID09IERJUl9MRUZUX1RPX1JJR0hUIHx8ICFtU3Bhbm5lZFRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiByaWdodDsgLy8gbGVhZGluZyBtYXJnaW4gaGFzIG5vIGltcGFjdCwgb3Igbm8gc3R5bGVzCiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgRGlyZWN0aW9ucyBkaXJlY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSBwYXJzcGFucykgewotICAgICAgICBjaGFyW10gYnVmOwotICAgICAgICBpZiAoIWhhc1RhYnMpIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb25zID09IERJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoRElSX0xFRlRfVE9fUklHSFQgPT0gZGlyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3R5bGVkLmRyYXdUZXh0KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwgZGlyLCBmYWxzZSwgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmID0gVGV4dFV0aWxzLm9idGFpbihlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGggPSAwOwotCi0gICAgICAgIGludCBoZXJlID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgdGhlcmUgPSBoZXJlICsgZGlyZWN0aW9ucy5tRGlyZWN0aW9uc1tpXTsKLSAgICAgICAgICAgIGlmICh0aGVyZSA+IGVuZCAtIHN0YXJ0KQotICAgICAgICAgICAgICAgIHRoZXJlID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICAgICAgICAgIGludCBzZWdzdGFydCA9IGhlcmU7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaGFzVGFicyA/IGhlcmUgOiB0aGVyZTsgaiA8PSB0aGVyZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gdGhlcmUgfHwgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQuZHJhd1RleHQoY2FudmFzLCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBzdGFydCArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaiAhPSBlbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJ1ZltqXSA9PSAnXHQnKQotICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGRpciAqIG5leHRUYWIodGV4dCwgc3RhcnQsIGVuZCwgaCAqIGRpciwgcGFyc3BhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNUYWJzICYmIGJ1ZltqXSA+PSAweEQ4MDAgJiYgYnVmW2pdIDw9IDB4REZGRiAmJiBqICsgMSA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChidWYsIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbW9qaSA+PSBNSU5fRU1PSkkgJiYgZW1vamkgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGVtb2ppKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICs9IFN0eWxlZC5kcmF3VGV4dChjYW52YXMsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciwgKGkgJiAxKSAhPSAwLCB4ICsgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIHksIGJvdHRvbSwgcGFpbnQsIHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGogIT0gZW5kKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW1vamlSZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVtb2ppUmVjdCA9IG5ldyBSZWN0RigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LCB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGosIHN0YXJ0ICsgaiArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJpdG1hcEhlaWdodCA9IGJtLmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRleHRIZWlnaHQgPSAtd29ya1BhaW50LmFzY2VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gdGV4dEhlaWdodCAvIGJpdG1hcEhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IGJtLmdldFdpZHRoKCkgKiBzY2FsZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbW9qaVJlY3Quc2V0KHggKyBoLCB5IC0gdGV4dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ICsgaCArIHdpZHRoLCB5KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJtLCBudWxsLCBtRW1vamlSZWN0LCBwYWludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSB3aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZXJlID0gdGhlcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzVGFicykKLSAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgbWVhc3VyZVRleHQoVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgb2Zmc2V0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIERpcmVjdGlvbnMgZGlyZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyYWlsaW5nLCBib29sZWFuIGFsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1RhYnMsIE9iamVjdFtdIHRhYnMpIHsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBoID0gMDsKLQotICAgICAgICBpZiAoYWx0KSB7Ci0gICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gIXRyYWlsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhlcmUgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGlvbnMubURpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhbHQpCi0gICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7Ci0KLSAgICAgICAgICAgIGludCB0aGVyZSA9IGhlcmUgKyBkaXJlY3Rpb25zLm1EaXJlY3Rpb25zW2ldOwotICAgICAgICAgICAgaWYgKHRoZXJlID4gZW5kIC0gc3RhcnQpCi0gICAgICAgICAgICAgICAgdGhlcmUgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gaGVyZTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBoYXNUYWJzID8gaGVyZSA6IHRoZXJlOyBqIDw9IHRoZXJlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgaiA8IHRoZXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGJ1ZltqXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4RDgwMCAmJiBjb2RlcHQgPD0gMHhERkZGICYmIGogKyAxIDwgdGhlcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1Ziwgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA+PSBNSU5fRU1PSkkgJiYgY29kZXB0IDw9IE1BWF9FTU9KSSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm0gPSBFTU9KSV9GQUNUT1JZLmdldEJpdG1hcEZyb21BbmRyb2lkUHVhKGNvZGVwdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaiA9PSB0aGVyZSB8fCBjb2RlcHQgPT0gJ1x0JyB8fCBibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHN0YXJ0ICsgaiB8fAotICAgICAgICAgICAgICAgICAgICAgICAodHJhaWxpbmcgJiYgb2Zmc2V0IDw9IHN0YXJ0ICsgaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgJiYgKGkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gRElSX1JJR0hUX1RPX0xFRlQgJiYgKGkgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWd3ID0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBzZWdzdGFydCwgc3RhcnQgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBzdGFydCArIGogfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICh0cmFpbGluZyAmJiBvZmZzZXQgPD0gc3RhcnQgKyBqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTEVGVF9UT19SSUdIVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gc2VndyAtIFN0eWxlZC5tZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIHNlZ3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3IC0gU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgc2Vnc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSBzZWd3OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBoICs9IHNlZ3c7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gdGhlcmUgJiYgYnVmW2pdID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBoID0gZGlyICogbmV4dFRhYih0ZXh0LCBzdGFydCwgZW5kLCBoICogZGlyLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChqICE9IHRoZXJlICYmIGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gc3RhcnQgKyBqKSByZXR1cm4gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaiArIDIsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWQgPSAoZmxvYXQpIGJtLmdldFdpZHRoKCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdvcmtQYWludC5hc2NlbnQoKSAvIGJtLmdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZWdzdGFydCA9IGogKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVyZSA9IHRoZXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiBoOworICAgICAgICByZXR1cm4gcmlnaHQgLSBnZXRQYXJhZ3JhcGhMZWFkaW5nTWFyZ2luKGxpbmUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE1lYXN1cmUgd2lkdGggb2YgYSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lIHRoYXQgaXMga25vd24gdG8gYWxsIGJlCi0gICAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFzIHRoZSBwYXJhZ3JhcGggYmFzZSBkaXJlY3Rpb24uIFJldHVybnMgdGhlIHdpZHRoLAotICAgICAqIGFuZCB0aGUgbGluZSBtZXRyaWNzIGluIGZtIGlmIGZtIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludCBmb3IgdGhlIHRleHQ7IHdpbGwgbm90IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBwYWludCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbgotICAgICAqIEBwYXJhbSB0ZXh0IHRleHQKLSAgICAgKiBAcGFyYW0gc3RhcnQgc3RhcnQgb2YgdGhlIGxpbmUKLSAgICAgKiBAcGFyYW0gZW5kIGxpbWl0IG9mIHRoZSBsaW5lCi0gICAgICogQHBhcmFtIGZtIG9iamVjdCB0byByZXR1cm4gaW50ZWdlciBtZXRyaWNzIGluLCBjYW4gYmUgbnVsbAotICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgaXQgaXMga25vd24gdGhhdCB0aGUgbGluZSBoYXMgdGFicwotICAgICAqIEBwYXJhbSB0YWJzIHRhYiBwb3NpdGlvbiBpbmZvcm1hdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGZyb20gc3RhcnQgdG8gZW5kCisgICAgICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIGxlYWRpbmcgbWFyZ2luICh1bnNpZ25lZCkgZm9yIHRoaXMgbGluZSwKKyAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IExlYWRpbmdNYXJnaW5TcGFuIGFuZCBMZWFkaW5nTWFyZ2luU3BhbjIuCisgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBsZWFkaW5nIG1hcmdpbiBvZiB0aGlzIGxpbmUKICAgICAgKi8KLSAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzLCBPYmplY3RbXSB0YWJzKSB7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBudWxsOwotICAKLSAgICAgICAgaWYgKGhhc1RhYnMpIHsKLSAgICAgICAgICAgIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oZW5kIC0gc3RhcnQpOwotICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7CisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFyYWdyYXBoTGVhZGluZ01hcmdpbihpbnQgbGluZSkgeworICAgICAgICBpZiAoIW1TcGFubmVkVGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIG1UZXh0OworCisgICAgICAgIGludCBsaW5lU3RhcnQgPSBnZXRMaW5lU3RhcnQobGluZSk7CisgICAgICAgIGludCBsaW5lRW5kID0gZ2V0TGluZUVuZChsaW5lKTsKKyAgICAgICAgaW50IHNwYW5FbmQgPSBzcGFubmVkLm5leHRTcGFuVHJhbnNpdGlvbihsaW5lU3RhcnQsIGxpbmVFbmQsCisgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgbGluZVN0YXJ0LCBzcGFuRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBubyBsZWFkaW5nIG1hcmdpbiBzcGFuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpbnQgbWFyZ2luID0gMDsKIAotICAgICAgICBpbnQgbGFzdFBvcyA9IDA7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gMDsKLSAgICAgICAgaW50IGFzY2VudCA9IDAsIGRlc2NlbnQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworICAgICAgICBib29sZWFuIGlzRmlyc3RQYXJhTGluZSA9IGxpbmVTdGFydCA9PSAwIHx8CisgICAgICAgICAgICBzcGFubmVkLmNoYXJBdChsaW5lU3RhcnQgLSAxKSA9PSAnXG4nOwogCi0gICAgICAgIGlmIChmbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmbS5hc2NlbnQgPSAwOwotICAgICAgICAgICAgZm0uZGVzY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBwb3MgPSBoYXNUYWJzID8gMCA6IGxlbjsgcG9zIDw9IGxlbjsgcG9zKyspIHsKLSAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOwotICAgICAgICAgICAgQml0bWFwIGJtID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGhhc1RhYnMgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gYnVmW3Bvc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuIHNwYW4gPSBzcGFuc1tpXTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlRmlyc3RMaW5lTWFyZ2luID0gaXNGaXJzdFBhcmFMaW5lOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3BTdGFydCA9IHNwYW5uZWQuZ2V0U3BhblN0YXJ0KHNwYW4pOworICAgICAgICAgICAgICAgIGludCBzcGFuTGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3BTdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gKChMZWFkaW5nTWFyZ2luU3BhbjIpc3BhbikuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOworICAgICAgICAgICAgICAgIHVzZUZpcnN0TGluZU1hcmdpbiA9IGxpbmUgPCBzcGFuTGluZSArIGNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFyZ2luICs9IHNwYW4uZ2V0TGVhZGluZ01hcmdpbih1c2VGaXJzdExpbmVNYXJnaW4pOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhEODAwICYmIGNvZGVwdCA8PSAweERGRkYgJiYgcG9zIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGJ1ZiwgcG9zKTsKKyAgICAgICAgcmV0dXJuIG1hcmdpbjsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IE1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTUFYX0VNT0pJKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJtID0gRU1PSklfRkFDVE9SWS5nZXRCaXRtYXBGcm9tQW5kcm9pZFB1YShjb2RlcHQpOworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgZmxvYXQgbWVhc3VyZVBhcmEoVGV4dFBhaW50IHBhaW50LCBUZXh0UGFpbnQgd29ya1BhaW50LAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgVGV4dExpbmUgdGwgPSBUZXh0TGluZS5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG10LnNldFBhcmEodGV4dCwgc3RhcnQsIGVuZCwgRElSX1JFUVVFU1RfTFRSKTsKKyAgICAgICAgICAgIERpcmVjdGlvbnMgZGlyZWN0aW9uczsKKyAgICAgICAgICAgIGludCBkaXI7CisgICAgICAgICAgICBpZiAobXQubUVhc3kpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb25zID0gRElSU19BTExfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgICAgICBkaXIgPSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpcmVjdGlvbnMgPSBBbmRyb2lkQmlkaS5kaXJlY3Rpb25zKG10Lm1EaXIsIG10Lm1MZXZlbHMsCisgICAgICAgICAgICAgICAgICAgIDAsIG10Lm1DaGFycywgMCwgbXQubUxlbik7CisgICAgICAgICAgICAgICAgZGlyID0gbXQubURpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG10Lm1DaGFyczsKKyAgICAgICAgICAgIGludCBsZW4gPSBtdC5tTGVuOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJzID0gZmFsc2U7CisgICAgICAgICAgICBUYWJTdG9wcyB0YWJTdG9wcyA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzVGFicyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCBzcGFubmVkID0gKFNwYW5uZWQpIHRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYlN0b3BTcGFuW10gc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBzdGFydCwgc3BhbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJTdG9wcyA9IG5ldyBUYWJTdG9wcyhUQUJfSU5DUkVNRU5ULCBzcGFucyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGwuc2V0KHBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLCBkaXIsIGRpcmVjdGlvbnMsIGhhc1RhYnMsIHRhYlN0b3BzKTsKKyAgICAgICAgICAgIHJldHVybiB0bC5tZXRyaWNzKG51bGwpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGV4dExpbmUucmVjeWNsZSh0bCk7CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZShtdCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChwb3MgPT0gbGVuIHx8IGNvZGVwdCA9PSAnXHQnIHx8IGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBUYWJTdG9wcyB7CisgICAgICAgIHByaXZhdGUgaW50W10gbVN0b3BzOworICAgICAgICBwcml2YXRlIGludCBtTnVtU3RvcHM7CisgICAgICAgIHByaXZhdGUgaW50IG1JbmNyZW1lbnQ7CiAKLSAgICAgICAgICAgICAgICB3aWR0aCArPSBTdHlsZWQubWVhc3VyZVRleHQocGFpbnQsIHdvcmtQYWludCwgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGxhc3RQb3MsIHN0YXJ0ICsgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtKTsKKyAgICAgICAgVGFiU3RvcHMoaW50IGluY3JlbWVudCwgT2JqZWN0W10gc3BhbnMpIHsKKyAgICAgICAgICAgIHJlc2V0KGluY3JlbWVudCwgc3BhbnMpOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAod29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS50b3AgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICB2b2lkIHJlc2V0KGludCBpbmNyZW1lbnQsIE9iamVjdFtdIHNwYW5zKSB7CisgICAgICAgICAgICB0aGlzLm1JbmNyZW1lbnQgPSBpbmNyZW1lbnQ7CisKKyAgICAgICAgICAgIGludCBucyA9IDA7CisgICAgICAgICAgICBpZiAoc3BhbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHNwYW5zKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFiU3RvcFNwYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnMgPT0gc3RvcHMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gbnN0b3BzID0gbmV3IGludFtucyAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RvcHNbaV0gPSBzdG9wc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgPSBuc3RvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wc1tucysrXSA9ICgoVGFiU3RvcFNwYW4pIG8pLmdldFRhYlN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwb3MgIT0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBlbW9qaSwgbXVzdCBoYXZlIGhpdCBhIHRhYgotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBuZXh0VGFiKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRoLCB0YWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2V0cyB1cCB3b3JrUGFpbnQgd2l0aCB0aGUgZm9udCBvbiB0aGUgZW1vamkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQsIHNvIHRoYXQgd2UgY2FuIGV4dHJhY3QgdGhlIGFzY2VudCBhbmQgc2NhbGUuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlVGV4dCBiZWNhdXNlIHRoZSBlbW9qaSBtaWdodCBoYXZlIGl0cyBvd24gc3R5bGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGluaXRpYWxpemUgd29ya1BhaW50IGhlcmUgYmVjYXVzZSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgaXMgdW5zdHlsZWQgbWVhc3VyZVRleHQgbWlnaHQgbm90IHVzZSB3b3JrUGFpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGFsbC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXQocGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVkLm1lYXN1cmVUZXh0KHBhaW50LCB3b3JrUGFpbnQsIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBwb3MsIHN0YXJ0ICsgcG9zICsgMSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICs9IChmbG9hdCkgYm0uZ2V0V2lkdGgoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd29ya1BhaW50LmFzY2VudCgpIC8gYm0uZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhZCBhbiBlbW9qaSwgd2UgYnVtcCBwYXN0IHRoZSBzZWNvbmQgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHN0b3BzLCAwLCBucyk7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmFzY2VudCA8IGFzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW50ID0gZm0uYXNjZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmbS5kZXNjZW50ID4gZGVzY2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VudCA9IGZtLmRlc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZm0udG9wIDwgdG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBmbS50b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZtLmJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gZm0uYm90dG9tOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB0YWtlIGJpdG1hcCBoZWlnaHQgaW50byBhY2NvdW50IGhlcmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IGlzIHNjYWxlZCB0byBtYXRjaCB0aGUgdGV4dCBoZWlnaHQuCisgICAgICAgICAgICAgICAgaWYgKHN0b3BzICE9IHRoaXMubVN0b3BzKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubVN0b3BzID0gc3RvcHM7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFBvcyA9IHBvcyArIDE7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLm1OdW1TdG9wcyA9IG5zOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZtLmFzY2VudCA9IGFzY2VudDsKLSAgICAgICAgICAgIGZtLmRlc2NlbnQgPSBkZXNjZW50OwotICAgICAgICAgICAgZm0udG9wID0gdG9wOwotICAgICAgICAgICAgZm0uYm90dG9tID0gYm90dG9tOworICAgICAgICBmbG9hdCBuZXh0VGFiKGZsb2F0IGgpIHsKKyAgICAgICAgICAgIGludCBucyA9IHRoaXMubU51bVN0b3BzOworICAgICAgICAgICAgaWYgKG5zID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHN0b3BzID0gdGhpcy5tU3RvcHM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdG9wID0gc3RvcHNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID4gaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV4dERlZmF1bHRTdG9wKGgsIG1JbmNyZW1lbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGhhc1RhYnMpCi0gICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOwotCi0gICAgICAgIHJldHVybiB3aWR0aDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmbG9hdCBuZXh0RGVmYXVsdFN0b3AoZmxvYXQgaCwgaW50IGluYykgeworICAgICAgICAgICAgcmV0dXJuICgoaW50KSAoKGggKyBpbmMpIC8gaW5jKSkgKiBpbmM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE3NTEsNyArMTUxMyw3IEBACiAKICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CiAgICAgICAgICAgICBpZiAodGFicyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGFicyA9ICgoU3Bhbm5lZCkgdGV4dCkuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHRhYnMgPSBnZXRQYXJhZ3JhcGhTcGFucygoU3Bhbm5lZCkgdGV4dCwgc3RhcnQsIGVuZCwgVGFiU3RvcFNwYW4uY2xhc3MpOwogICAgICAgICAgICAgICAgIGFsbHRhYnMgPSB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC0xNzc4LDYgKzE1NDAsMzggQEAKICAgICAgICAgcmV0dXJuIG1TcGFubmVkVGV4dDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1lIGFzIDxjb2RlPnRleHQuZ2V0U3BhbnMoKTwvY29kZT4sIGV4Y2VwdCB3aGVyZQorICAgICAqIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPiBhcmUgdGhlIHNhbWUgYW5kIGFyZSBub3QKKyAgICAgKiBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHRleHQsIGluIHdoaWNoIGNhc2UgYW4gZW1wdHkgYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZCBpbnN0ZWFkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgY2FzZSB0aGF0IDxjb2RlPmdldFNwYW5zKCk8L2NvZGU+CisgICAgICogb24gYW4gZW1wdHkgcmFuZ2UgcmV0dXJucyB0aGUgc3BhbnMgYWRqYWNlbnQgdG8gdGhhdCByYW5nZSwgd2hpY2ggaXMKKyAgICAgKiBwcmltYXJpbHkgZm9yIHRoZSBzYWtlIG9mIDxjb2RlPlRleHRXYXRjaGVyczwvY29kZT4gc28gdGhleSB3aWxsIGdldAorICAgICAqIG5vdGlmaWNhdGlvbnMgd2hlbiB0ZXh0IGdvZXMgZnJvbSBlbXB0eSB0byBub24tZW1wdHkuICBCdXQgaXQgYWxzbworICAgICAqIGhhcyB0aGUgdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3QgdGhhdCBpZiB0aGUgdGV4dCBlbmRzIHdpdGggYW4gZW1wdHkKKyAgICAgKiBwYXJhZ3JhcGgsIHRoYXQgcGFyYWdyYXBoIGFjY2lkZW50YWxseSBwaWNrcyB1cCB0aGUgc3R5bGVzIG9mIHRoZQorICAgICAqIHByZWNlZGluZyBwYXJhZ3JhcGggKGV2ZW4gdGhvdWdoIHRob3NlIHN0eWxlcyB3aWxsIG5vdCBiZSBwaWNrZWQgdXAKKyAgICAgKiBieSBuZXcgdGV4dCB0aGF0IGlzIGluc2VydGVkIGludG8gdGhlIGVtcHR5IHBhcmFncmFwaCkuCisgICAgICogPHA+CisgICAgICogVGhlIHJlYXNvbiBpdCBqdXN0IGNoZWNrcyB3aGV0aGVyIDxjb2RlPnN0YXJ0PC9jb2RlPiBhbmQgPGNvZGU+ZW5kPC9jb2RlPgorICAgICAqIGlzIHRoZSBzYW1lIGlzIHRoYXQgdGhlIG9ubHkgdGltZSBhIGxpbmUgY2FuIGNvbnRhaW4gMCBjaGFyYWN0ZXJzCisgICAgICogaXMgaWYgaXQgaXMgdGhlIGZpbmFsIHBhcmFncmFwaCBvZiB0aGUgTGF5b3V0OyBvdGhlcndpc2UgYW55IGxpbmUgd2lsbAorICAgICAqIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHByaW50aW5nIG9yIG5ld2xpbmUgY2hhcmFjdGVyLiAgVGhlIHJlYXNvbiBmb3IgdGhlCisgICAgICogYWRkaXRpb25hbCBjaGVjayBpZiA8Y29kZT5zdGFydDwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDAgaXMgdGhhdAorICAgICAqIGlmIHRoZSBlbXB0eSBwYXJhZ3JhcGggaXMgdGhlIGVudGlyZSBjb250ZW50IG9mIHRoZSBidWZmZXIsIHBhcmFncmFwaAorICAgICAqIHN0eWxlcyB0aGF0IGFyZSBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGJ1ZmZlciB3aWxsIGFwcGx5IHRvIHRleHQgdGhhdAorICAgICAqIGlzIGluc2VydGVkIGludG8gaXQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgPFQ+IFRbXSBnZXRQYXJhZ3JhcGhTcGFucyhTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICBpZiAoc3RhcnQgPT0gZW5kICYmIHN0YXJ0ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIChUW10pIEFycmF5VXRpbHMuZW1wdHlBcnJheSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZXh0LmdldFNwYW5zKHN0YXJ0LCBlbmQsIHR5cGUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBlbGxpcHNpemUoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdG9mZikgewogICAgICAgICBpbnQgZWxsaXBzaXNDb3VudCA9IGdldEVsbGlwc2lzQ291bnQobGluZSk7CkBAIC0xODA4LDIzICsxNjAyLDIyIEBACiAKICAgICAvKioKICAgICAgKiBTdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYmlkaXJlY3Rpb25hbCAobGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KQotICAgICAqIHRleHQgd2l0aGluIHRoZSBsYXlvdXQgb2YgYSBsaW5lLiAgVE9ETzogVGhpcyB3b3JrIGlzIG5vdCBjb21wbGV0ZQotICAgICAqIG9yIGNvcnJlY3QgYW5kIHdpbGwgYmUgZmxlc2hlZCBvdXQgaW4gYSBsYXRlciByZXZpc2lvbi4KKyAgICAgKiB0ZXh0IHdpdGhpbiB0aGUgbGF5b3V0IG9mIGEgbGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpcmVjdGlvbnMgewotICAgICAgICBwcml2YXRlIHNob3J0W10gbURpcmVjdGlvbnM7CisgICAgICAgIC8vIERpcmVjdGlvbnMgcmVwcmVzZW50cyBkaXJlY3Rpb25hbCBydW5zIHdpdGhpbiBhIGxpbmUgb2YgdGV4dC4KKyAgICAgICAgLy8gUnVucyBhcmUgcGFpcnMgb2YgaW50cyBsaXN0ZWQgaW4gdmlzdWFsIG9yZGVyLCBzdGFydGluZyBmcm9tIHRoZQorICAgICAgICAvLyBsZWFkaW5nIG1hcmdpbi4gIFRoZSBmaXJzdCBpbnQgb2YgZWFjaCBwYWlyIGlzIHRoZSBvZmZzZXQgZnJvbQorICAgICAgICAvLyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgcnVuLiAgVGhlCisgICAgICAgIC8vIHNlY29uZCBpbnQgcmVwcmVzZW50cyBib3RoIHRoZSBsZW5ndGggYW5kIGxldmVsIG9mIHRoZSBydW4uCisgICAgICAgIC8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIGxvd2VyIGJpdHMsIGFjY2Vzc2VkIGJ5IG1hc2tpbmcgd2l0aAorICAgICAgICAvLyBESVJfTEVOR1RIX01BU0suICBUaGUgbGV2ZWwgaXMgaW4gdGhlIGhpZ2hlciBiaXRzLCBhY2Nlc3NlZAorICAgICAgICAvLyBieSBzaGlmdGluZyBieSBESVJfTEVWRUxfU0hJRlQgYW5kIG1hc2tpbmcgYnkgRElSX0xFVkVMX01BU0suCisgICAgICAgIC8vIFRvIHNpbXBseSB0ZXN0IGZvciBhbiBSVEwgZGlyZWN0aW9uLCB0ZXN0IHRoZSBiaXQgdXNpbmcKKyAgICAgICAgLy8gRElSX1JUTF9GTEFHLCBpZiBzZXQgdGhlbiB0aGUgZGlyZWN0aW9uIGlzIHJ0bC4KIAotICAgICAgICAvLyBUaGUgdmFsdWVzIGluIG1EaXJlY3Rpb25zIGFyZSB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAgICAgLy8gaW4gdGhlIGxpbmUgdG8gdGhlIG5leHQgZmxpcCBpbiBkaXJlY3Rpb24uICBSdW5zIGF0IGV2ZW4gaW5kaWNlcwotICAgICAgICAvLyBhcmUgbGVmdC10by1yaWdodCwgdGhlIG90aGVycyBhcmUgcmlnaHQtdG8tbGVmdC4gIFNvLCBmb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggYSByaWdodC10by1sZWZ0IHJ1biBoYXMgMCBhdCBtRGlyZWN0aW9uc1swXSwKLSAgICAgICAgLy8gc2luY2UgdGhlICdmaXJzdCcgKGx0cikgcnVuIGlzIHplcm8gbGVuZ3RoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgY29kZSBjdXJyZW50bHkgYXNzdW1lcyB0aGF0IGVhY2ggcnVuIGlzIGFkamFjZW50IHRvIHRoZSBwcmV2aW91cwotICAgICAgICAvLyBvbmUsIHByb2dyZXNzaW5nIGluIHRoZSBiYXNlIGxpbmUgZGlyZWN0aW9uLiAgVGhpcyBpc24ndCBzdWZmaWNpZW50Ci0gICAgICAgIC8vIHRvIGhhbmRsZSBuZXN0ZWQgcnVucywgZm9yIGV4YW1wbGUgbnVtZXJpYyB0ZXh0IGluIGFuIHJ0bCBjb250ZXh0Ci0gICAgICAgIC8vIGluIGFuIGx0ciBwYXJhZ3JhcGguCi0gICAgICAgIC8qIHBhY2thZ2UgKi8gRGlyZWN0aW9ucyhzaG9ydFtdIGRpcnMpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyBpbnRbXSBtRGlyZWN0aW9uczsKKyAgICAgICAgLyogcGFja2FnZSAqLyBEaXJlY3Rpb25zKGludFtdIGRpcnMpIHsKICAgICAgICAgICAgIG1EaXJlY3Rpb25zID0gZGlyczsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MzUsNiArMTYyOCw3IEBACiAgICAgICogbGluZSBpcyBlbGxpcHNpemVkLCBub3QgZ2V0TGluZVN0YXJ0KCkuKQogICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RWxsaXBzaXNTdGFydChpbnQgbGluZSk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlbGxpcHNpemVkIGF3YXksIG9yIDAgaWYKICAgICAgKiBubyBlbGxpcHNpcyBpcyB0byB0YWtlIHBsYWNlLgpAQCAtMTg3NCw3ICsxNjY4LDcgQEAKICAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVRleHQubGVuZ3RoKCk7CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgICAgICAgICAgY2hhcltdIHMgPSBuZXcgY2hhcltlbmQgLSBzdGFydF07CiAgICAgICAgICAgICBnZXRDaGFycyhzdGFydCwgZW5kLCBzLCAwKTsKQEAgLTE5MzUsMTcgKzE3MjksMjIgQEAKICAgICBwcml2YXRlIEFsaWdubWVudCBtQWxpZ25tZW50ID0gQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKICAgICBwcml2YXRlIGZsb2F0IG1TcGFjaW5nTXVsdDsKICAgICBwcml2YXRlIGZsb2F0IG1TcGFjaW5nQWRkOwotICAgIHByaXZhdGUgc3RhdGljIFJlY3Qgc1RlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IHNUZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1TcGFubmVkVGV4dDsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9MRUZUX1RPX1JJR0hUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJfUklHSFRfVE9fTEVGVCA9IC0xOwotICAgIAorCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0xUUiA9IDE7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX1JUTCA9IC0xOwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiA9IDI7CiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IERJUl9SRVFVRVNUX0RFRkFVTFRfUlRMID0gLTI7CiAKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFTkdUSF9NQVNLID0gMHgwM2ZmZmZmZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX1NISUZUID0gMjY7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgaW50IFJVTl9MRVZFTF9NQVNLID0gMHgzZjsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1JUTF9GTEFHID0gMSA8PCBSVU5fTEVWRUxfU0hJRlQ7CisKICAgICBwdWJsaWMgZW51bSBBbGlnbm1lbnQgewogICAgICAgICBBTElHTl9OT1JNQUwsCiAgICAgICAgIEFMSUdOX09QUE9TSVRFLApAQCAtMTk1Nyw4ICsxNzU2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOwogCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgRGlyZWN0aW9ucyBESVJTX0FMTF9MRUZUX1RPX1JJR0hUID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBzaG9ydFtdIHsgMzI3NjcgfSk7CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKICAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdGlvbnMobmV3IHNob3J0W10geyAwLCAzMjc2NyB9KTsKLQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L01lYXN1cmVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9NZWFzdXJlZFRleHQuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqLworY2xhc3MgTWVhc3VyZWRUZXh0IHsKKyAgICAvKiBwYWNrYWdlICovIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICAvKiBwYWNrYWdlICovIGludCBtVGV4dFN0YXJ0OworICAgIC8qIHBhY2thZ2UgKi8gZmxvYXRbXSBtV2lkdGhzOworICAgIC8qIHBhY2thZ2UgKi8gY2hhcltdIG1DaGFyczsKKyAgICAvKiBwYWNrYWdlICovIGJ5dGVbXSBtTGV2ZWxzOworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1EaXI7CisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG1FYXN5OworICAgIC8qIHBhY2thZ2UgKi8gaW50IG1MZW47CisgICAgcHJpdmF0ZSBpbnQgbVBvczsKKyAgICBwcml2YXRlIFRleHRQYWludCBtV29ya1BhaW50OworCisgICAgcHJpdmF0ZSBNZWFzdXJlZFRleHQoKSB7CisgICAgICAgIG1Xb3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVhc3VyZWRUZXh0W10gY2FjaGVkID0gbmV3IE1lYXN1cmVkVGV4dFszXTsKKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgTWVhc3VyZWRUZXh0IG9idGFpbigpIHsKKyAgICAgICAgTWVhc3VyZWRUZXh0IG10OworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNhY2hlZC5sZW5ndGg7IC0taSA+PSAwOykgeworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtdCA9IGNhY2hlZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdCA9IG5ldyBNZWFzdXJlZFRleHQoKTsKKyAgICAgICAgTG9nLmUoIk1FQVMiLCAibmV3OiAiICsgbXQpOworICAgICAgICByZXR1cm4gbXQ7CisgICAgfQorCisgICAgLyogcGFja2FnZSAqLworICAgIHN0YXRpYyBNZWFzdXJlZFRleHQgcmVjeWNsZShNZWFzdXJlZFRleHQgbXQpIHsKKyAgICAgICAgbXQubVRleHQgPSBudWxsOworICAgICAgICBpZiAobXQubUxlbiA8IDEwMDApIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChjYWNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFtpXSA9IG10OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5hbHl6ZXMgdGV4dCBmb3IgYmlkaXJlY3Rpb25hbCBydW5zLiAgQWxsb2NhdGVzIHdvcmtpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovCisgICAgdm9pZCBzZXRQYXJhKENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBiaWRpUmVxdWVzdCkgeworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIG1UZXh0U3RhcnQgPSBzdGFydDsKKworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsZW47CisgICAgICAgIG1Qb3MgPSAwOworCisgICAgICAgIGlmIChtV2lkdGhzID09IG51bGwgfHwgbVdpZHRocy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgIG1XaWR0aHMgPSBuZXcgZmxvYXRbQXJyYXlVdGlscy5pZGVhbEZsb2F0QXJyYXlTaXplKGxlbildOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbGVuKSB7CisgICAgICAgICAgICBtQ2hhcnMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQorICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgbUNoYXJzLCAwKTsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKKyAgICAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgUmVwbGFjZW1lbnRTcGFuW10gc3BhbnMgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuc1tpXSkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgZW5kSW5QYXJhID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW5zW2ldKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzdGFydEluUGFyYTsgaiA8IGVuZEluUGFyYTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGFyc1tqXSA9ICdcdUZGRkMnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUZXh0VXRpbHMuZG9lc05vdE5lZWRCaWRpKG1DaGFycywgMCwgbGVuKSkgeworICAgICAgICAgICAgbURpciA9IExheW91dC5ESVJfTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIG1FYXN5ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTGV2ZWxzID09IG51bGwgfHwgbUxldmVscy5sZW5ndGggPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBtTGV2ZWxzID0gbmV3IGJ5dGVbQXJyYXlVdGlscy5pZGVhbEJ5dGVBcnJheVNpemUobGVuKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGlyID0gQW5kcm9pZEJpZGkuYmlkaShiaWRpUmVxdWVzdCwgbUNoYXJzLCBtTGV2ZWxzLCBsZW4sIGZhbHNlKTsKKyAgICAgICAgICAgIG1FYXN5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBhZGRTdHlsZVJ1bihUZXh0UGFpbnQgcGFpbnQsIGludCBsZW4sIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtKSB7CisgICAgICAgIGlmIChmbSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWludC5nZXRGb250TWV0cmljc0ludChmbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcCA9IG1Qb3M7CisgICAgICAgIG1Qb3MgPSBwICsgbGVuOworCisgICAgICAgIGlmIChtRWFzeSkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gbURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQKKyAgICAgICAgICAgICAgICA/IENhbnZhcy5ESVJFQ1RJT05fTFRSIDogQ2FudmFzLkRJUkVDVElPTl9SVEw7CisgICAgICAgICAgICByZXR1cm4gcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcCwgbGVuLCBwLCBsZW4sIGZsYWdzLCBtV2lkdGhzLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHRvdGFsQWR2YW5jZSA9IDA7CisgICAgICAgIGludCBsZXZlbCA9IG1MZXZlbHNbcF07CisgICAgICAgIGZvciAoaW50IHEgPSBwLCBpID0gcCArIDEsIGUgPSBwICsgbGVuOzsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBlIHx8IG1MZXZlbHNbaV0gIT0gbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAobGV2ZWwgJiAweDEpID09IDAgPyBDYW52YXMuRElSRUNUSU9OX0xUUiA6IENhbnZhcy5ESVJFQ1RJT05fUlRMOworICAgICAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgcSwgaSAtIHEsIHEsIGkgLSBxLCBmbGFncywgbVdpZHRocywgcSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcSA9IGk7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2U7CisgICAgfQorCisgICAgZmxvYXQgYWRkU3R5bGVSdW4oVGV4dFBhaW50IHBhaW50LCBNZXRyaWNBZmZlY3RpbmdTcGFuW10gc3BhbnMsIGludCBsZW4sCisgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSkgeworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBtV29ya1BhaW50OworICAgICAgICB3b3JrUGFpbnQuc2V0KHBhaW50KTsKKyAgICAgICAgLy8gWFhYIHBhaW50IHNob3VsZCBub3QgaGF2ZSBhIGJhc2VsaW5lIHNoaWZ0LCBidXQuLi4KKyAgICAgICAgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQgPSAwOworCisgICAgICAgIFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4gc3BhbiA9IHNwYW5zW2ldOworICAgICAgICAgICAgaWYgKHNwYW4gaW5zdGFuY2VvZiBSZXBsYWNlbWVudFNwYW4pIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVNZWFzdXJlU3RhdGUod29ya1BhaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHdpZDsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHdpZCA9IGFkZFN0eWxlUnVuKHdvcmtQYWludCwgbGVuLCBmbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2Ugb3JpZ2luYWwgdGV4dC4gIFNob3VsZG4ndCBtYXR0ZXIuCisgICAgICAgICAgICB3aWQgPSByZXBsYWNlbWVudC5nZXRTaXplKHdvcmtQYWludCwgbVRleHQsIG1UZXh0U3RhcnQgKyBtUG9zLAorICAgICAgICAgICAgICAgICAgICBtVGV4dFN0YXJ0ICsgbVBvcyArIGxlbiwgZm0pOworICAgICAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgICAgIHdbbVBvc10gPSB3aWQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvcyArIDEsIGUgPSBtUG9zICsgbGVuOyBpIDwgZTsgaSsrKQorICAgICAgICAgICAgICAgIHdbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmbS5hc2NlbnQgKz0gd29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgZm0udG9wICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbS5kZXNjZW50ICs9IHdvcmtQYWludC5iYXNlbGluZVNoaWZ0OworICAgICAgICAgICAgICAgIGZtLmJvdHRvbSArPSB3b3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3aWQ7CisgICAgfQorCisgICAgaW50IGJyZWFrVGV4dChpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBmb3J3YXJkcywgZmxvYXQgd2lkdGgpIHsKKyAgICAgICAgZmxvYXRbXSB3ID0gbVdpZHRoczsKKyAgICAgICAgaWYgKGZvcndhcmRzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCAtPSB3W2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbGltaXQ7IC0taSA+PSBzdGFydDspIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdpZHRoIC09IHdbaV0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXQgLSBpIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaW1pdCAtIHN0YXJ0OworICAgIH0KKworICAgIGZsb2F0IG1lYXN1cmUoaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBmbG9hdFtdIHcgPSBtV2lkdGhzOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgKytpKSB7CisgICAgICAgICAgICB3aWR0aCArPSB3W2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmFibGVTdHJpbmdCdWlsZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQppbmRleCBjYWFhZmExLi5mYzAxZWYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5uYWJsZVN0cmluZ0J1aWxkZXIuamF2YQpAQCAtMTcsOCArMTcsOSBAQAogcGFja2FnZSBhbmRyb2lkLnRleHQ7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKKwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKIApAQCAtMzEyLDEyICszMTMsMTUgQEAKIAogICAgICAgICBtb3ZlR2FwVG8oZW5kKTsKIAotICAgICAgICBpZiAodGJlbmQgLSB0YnN0YXJ0ID49IG1HYXBMZW5ndGggKyAoZW5kIC0gc3RhcnQpKQotICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCAtIG1HYXBMZW5ndGggKwotICAgICAgICAgICAgICAgICAgICAgIHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCkpOworICAgICAgICAvLyBDYW4gYmUgbmVnYXRpdmUKKyAgICAgICAgZmluYWwgaW50IG5iTmV3Q2hhcnMgPSAodGJlbmQgLSB0YnN0YXJ0KSAtIChlbmQgLSBzdGFydCk7CiAKLSAgICAgICAgbUdhcFN0YXJ0ICs9IHRiZW5kIC0gdGJzdGFydCAtIChlbmQgLSBzdGFydCk7Ci0gICAgICAgIG1HYXBMZW5ndGggLT0gdGJlbmQgLSB0YnN0YXJ0IC0gKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgaWYgKG5iTmV3Q2hhcnMgPj0gbUdhcExlbmd0aCkgeworICAgICAgICAgICAgcmVzaXplRm9yKG1UZXh0Lmxlbmd0aCArIG5iTmV3Q2hhcnMgLSBtR2FwTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1HYXBTdGFydCArPSBuYk5ld0NoYXJzOworICAgICAgICBtR2FwTGVuZ3RoIC09IG5iTmV3Q2hhcnM7CiAKICAgICAgICAgaWYgKG1HYXBMZW5ndGggPCAxKQogICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigibUdhcExlbmd0aCA8IDEiKS5wcmludFN0YWNrVHJhY2UoKTsKQEAgLTcwNyw2ICs3MTEsNyBAQAogICAgICAqIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhlIGJ1ZmZlci4gIFRoZSBraW5kIG1heSBiZSBPYmplY3QuY2xhc3MgdG8gZ2V0CiAgICAgICogYSBsaXN0IG9mIGFsbCB0aGUgc3BhbnMgcmVnYXJkbGVzcyBvZiB0eXBlLgogICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyA8VD4gVFtdIGdldFNwYW5zKGludCBxdWVyeVN0YXJ0LCBpbnQgcXVlcnlFbmQsIENsYXNzPFQ+IGtpbmQpIHsKICAgICAgICAgaW50IHNwYW5Db3VudCA9IG1TcGFuQ291bnQ7CiAgICAgICAgIE9iamVjdFtdIHNwYW5zID0gbVNwYW5zOwpAQCAtNzE3LDggKzcyMiw4IEBACiAgICAgICAgIGludCBnYXBsZW4gPSBtR2FwTGVuZ3RoOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIE9iamVjdFtdIHJldCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCByZXQxID0gbnVsbDsKKyAgICAgICAgVFtdIHJldCA9IG51bGw7CisgICAgICAgIFQgcmV0MSA9IG51bGw7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFuQ291bnQ7IGkrKykgewogICAgICAgICAgICAgaW50IHNwYW5TdGFydCA9IHN0YXJ0c1tpXTsKQEAgLTc1MCwxMSArNzU1LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0MSA9IHNwYW5zW2ldOworICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgIHJldDEgPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBzcGFuQ291bnQgLSBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiwgYnV0IHJlcXVpcmVzIGEgc3VwcHJlc3NXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIHNwYW5Db3VudCAtIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MSwyOSArNzc4LDMzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJldCwgaiwgcmV0LCBqICsgMSwgY291bnQgLSBqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2pdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbal0gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0W2NvdW50KytdID0gc3BhbnNbaV07CisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmUgY29udmVyc2lvbiB0aGFua3MgdG8gdGhlIGlzSW5zdGFuY2UgdGVzdCBhYm92ZQorICAgICAgICAgICAgICAgICAgICByZXRbY291bnQrK10gPSAoVCkgc3BhbnNbaV07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSBBcnJheVV0aWxzLmVtcHR5QXJyYXkoa2luZCk7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5lbXB0eUFycmF5KGtpbmQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICByZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOworICAgICAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgICAgIHJldCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIDEpOwogICAgICAgICAgICAgcmV0WzBdID0gcmV0MTsKLSAgICAgICAgICAgIHJldHVybiAoVFtdKSByZXQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudCA9PSByZXQubGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFRbXSkgcmV0OworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIE9iamVjdFtdIG5yZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGtpbmQsIGNvdW50KTsKKyAgICAgICAgLy8gU2FmZSBjb252ZXJzaW9uLCBidXQgcmVxdWlyZXMgYSBzdXBwcmVzc1dhcm5pbmcKKyAgICAgICAgVFtdIG5yZXQgPSAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShraW5kLCBjb3VudCk7CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmV0LCAwLCBucmV0LCAwLCBjb3VudCk7Ci0gICAgICAgIHJldHVybiAoVFtdKSBucmV0OworICAgICAgICByZXR1cm4gbnJldDsKICAgICB9CiAKICAgICAvKioKQEAgLTg2Miw2ICs4NzMsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIFN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY2hhcnMgaW4gdGhpcyBidWZmZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaW50IGxlbiA9IGxlbmd0aCgpOwogICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbGVuXTsKQEAgLTk1Miw2ICs5NjQsNyBAQAogICAgICAgICB9CiAgICAgfQogCisvKgogICAgIHByaXZhdGUgYm9vbGVhbiBpc3ByaW50KGNoYXIgYykgeyAvLyBYWFgKICAgICAgICAgaWYgKGMgPj0gJyAnICYmIGMgPD0gJ34nKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05NTksNyArOTcyLDYgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLS8qCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHN0YXJ0RmxhZyhpbnQgZmxhZykgewogICAgICAgICByZXR1cm4gKGZsYWcgPj4gNCkgJiAweDBGOwogICAgIH0KQEAgLTEwNTQsNyArMTA2NiwzMiBAQAogICAgICAgICB9CiAgICAgfQogCisKICAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBDYW52YXMgdG8gdXNlIGludGVybmFsbHkuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRyYXdUZXh0UnVuKENhbnZhcyBjLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIGludCBmbGFncywgUGFpbnQgcCkgeworICAgICAgICBjaGVja1JhbmdlKCJkcmF3VGV4dFJ1biIsIHN0YXJ0LCBlbmQpOworCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgaW50IGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0LCBsZW4sIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLCBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGV4dFV0aWxzLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIGdldENoYXJzKGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4oYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLCAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcCk7CisgICAgICAgICAgICBUZXh0VXRpbHMucmVjeWNsZShidWYpOworICAgICAgICB9CisgICAgfQorCisgICAvKioKICAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCkBAIC0xMTAzLDYgKzExNDAsNTggQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEb24ndCBjYWxsIHRoaXMgeW91cnNlbGYgLS0gZXhpc3RzIGZvciBQYWludCB0byB1c2UgaW50ZXJuYWxseS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNQb3MsIFBhaW50IHApIHsKKworICAgICAgICBmbG9hdCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisKKyAgICAgICAgaWYgKGVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBzdGFydCwgbGVuLCBjb250ZXh0U3RhcnQsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNQb3MpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IG1HYXBTdGFydCkgeworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMobVRleHQsIHN0YXJ0ICsgbUdhcExlbmd0aCwgbGVuLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtR2FwTGVuZ3RoLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZXh0VXRpbHMub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICAgICAgZ2V0Q2hhcnMoY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBidWYsIDApOworICAgICAgICAgICAgcmV0ID0gcC5nZXRUZXh0UnVuQWR2YW5jZXMoYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzUG9zKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5yZWN5Y2xlKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGN1cnNvck9wdCwgUGFpbnQgcCkgeworCisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAoY29udGV4dEVuZCA8PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0LCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRTdGFydCA+PSBtR2FwU3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IHAuZ2V0VGV4dFJ1bkN1cnNvcihtVGV4dCwgY29udGV4dFN0YXJ0ICsgbUdhcExlbmd0aCwgY29udGV4dExlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZnNldCArIG1HYXBMZW5ndGgsIGN1cnNvck9wdCkgLSBtR2FwTGVuZ3RoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRleHRVdGlscy5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICBnZXRDaGFycyhjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICByZXQgPSBwLmdldFRleHRSdW5DdXJzb3IoYnVmLCAwLCBjb250ZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0IC0gY29udGV4dFN0YXJ0LCBjdXJzb3JPcHQpICsgY29udGV4dFN0YXJ0OworICAgICAgICAgICAgVGV4dFV0aWxzLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgLy8gRG9jdW1lbnRhdGlvbiBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoSW5wdXRGaWx0ZXJbXSBmaWx0ZXJzKSB7CiAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TcGFubmVkLmphdmEKaW5kZXggMTU0NDk3ZC4uZDE0ZmNiYzQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3Bhbm5lZC5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFID0gU1BBTl9QT0lOVF9NQVJLOwogCiAgICAgLyoqCi0gICAgICogTm9uLTAtbGVuZ3RoIHNwYW5zIG9mIHR5cGUgU1BBTl9JTkNMVVNJVkVfRVhDTFVTSVZFIGV4cGFuZAorICAgICAqIE5vbi0wLWxlbmd0aCBzcGFucyBvZiB0eXBlIFNQQU5fRVhDTFVTSVZFX0lOQ0xVU0lWRSBleHBhbmQKICAgICAgKiB0byBpbmNsdWRlIHRleHQgaW5zZXJ0ZWQgYXQgdGhlaXIgZW5kaW5nIHBvaW50IGJ1dCBub3QgYXQgdGhlaXIKICAgICAgKiBzdGFydGluZyBwb2ludC4gIFdoZW4gMC1sZW5ndGgsIHRoZXkgYmVoYXZlIGxpa2UgcG9pbnRzLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBkMGQyNDgyLi5jYzk2OWNiCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXQuamF2YQpAQCAtMTYsMTQgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5BcnJheVV0aWxzOworCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTGVhZGluZ01hcmdpblNwYW47CiBpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkxpbmVIZWlnaHRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5NZXRyaWNBZmZlY3RpbmdTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5SZXBsYWNlbWVudFNwYW47CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlRhYlN0b3BTcGFuOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5MZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjI7CiAKIC8qKgogICogU3RhdGljTGF5b3V0IGlzIGEgTGF5b3V0IGZvciB0ZXh0IHRoYXQgd2lsbCBub3QgYmUgZWRpdGVkIGFmdGVyIGl0CkBAIC0zMSw4ICszMiw5IEBACiAgKiA8cD5UaGlzIGlzIHVzZWQgYnkgd2lkZ2V0cyB0byBjb250cm9sIHRleHQgbGF5b3V0LiBZb3Ugc2hvdWxkIG5vdCBuZWVkCiAgKiB0byB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bmxlc3MgeW91IGFyZSBpbXBsZW1lbnRpbmcgeW91ciBvd24gd2lkZ2V0CiAgKiBvciBjdXN0b20gZGlzcGxheSBvYmplY3QsIG9yIHdvdWxkIGJlIHRlbXB0ZWQgdG8gY2FsbAotICoge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzI2RyYXdUZXh0KGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwgZmxvYXQsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQpCi0gKiAgQ2FudmFzLmRyYXdUZXh0KCl9IGRpcmVjdGx5LjwvcD4KKyAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlLCBpbnQsIGludCwKKyAqIGZsb2F0LCBmbG9hdCwgYW5kcm9pZC5ncmFwaGljcy5QYWludCkKKyAqIENhbnZhcy5kcmF3VGV4dCgpfSBkaXJlY3RseS48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcwogU3RhdGljTGF5b3V0CkBAIC02Miw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VXRpbHMuVHJ1bmNhdGVBdCBlbGxpcHNpemUsIGludCBlbGxpcHNpemVkV2lkdGgpIHsKICAgICAgICAgc3VwZXIoKGVsbGlwc2l6ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gc291cmNlIAorICAgICAgICAgICAgICAgID8gc291cmNlCiAgICAgICAgICAgICAgICAgOiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkKICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU3Bhbm5lZEVsbGlwc2l6ZXIoc291cmNlKQogICAgICAgICAgICAgICAgICAgICA6IG5ldyBFbGxpcHNpemVyKHNvdXJjZSksCkBAIC03Miw3ICs3NCw3IEBACiAgICAgICAgICAqIFRoaXMgaXMgYW5ub3lpbmcsIGJ1dCB3ZSBjYW4ndCByZWZlciB0byB0aGUgbGF5b3V0IHVudGlsCiAgICAgICAgICAqIHN1cGVyY2xhc3MgY29uc3RydWN0aW9uIGlzIGZpbmlzaGVkLCBhbmQgdGhlIHN1cGVyY2xhc3MKICAgICAgICAgICogY29uc3RydWN0b3Igd2FudHMgdGhlIHJlZmVyZW5jZSB0byB0aGUgZGlzcGxheSB0ZXh0LgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogVGhpcyB3aWxsIGJyZWFrIGlmIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIGV2ZXIgYWN0dWFsbHkKICAgICAgICAgICogY2FyZXMgYWJvdXQgdGhlIGNvbnRlbnQgaW5zdGVhZCBvZiBqdXN0IGhvbGRpbmcgdGhlIHJlZmVyZW5jZS4KICAgICAgICAgICovCkBAIC05NCwxMyArOTYsMTMgQEAKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CiAKKyAgICAgICAgbU1lYXN1cmVkID0gTWVhc3VyZWRUZXh0Lm9idGFpbigpOworCiAgICAgICAgIGdlbmVyYXRlKHNvdXJjZSwgYnVmc3RhcnQsIGJ1ZmVuZCwgcGFpbnQsIG91dGVyd2lkdGgsIGFsaWduLAogICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgaW5jbHVkZXBhZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgZWxsaXBzaXplICE9IG51bGwsIGVsbGlwc2l6ZWRXaWR0aCwgZWxsaXBzaXplKTsKIAotICAgICAgICBtQ2hkaXJzID0gbnVsbDsKLSAgICAgICAgbUNocyA9IG51bGw7Ci0gICAgICAgIG1XaWR0aHMgPSBudWxsOworICAgICAgICBtTWVhc3VyZWQgPSBNZWFzdXJlZFRleHQucmVjeWNsZShtTWVhc3VyZWQpOwogICAgICAgICBtRm9udE1ldHJpY3NJbnQgPSBudWxsOwogICAgIH0KIApAQCAtMTExLDYgKzExMyw3IEBACiAgICAgICAgIG1MaW5lcyA9IG5ldyBpbnRbQXJyYXlVdGlscy5pZGVhbEludEFycmF5U2l6ZSgyICogbUNvbHVtbnMpXTsKICAgICAgICAgbUxpbmVEaXJlY3Rpb25zID0gbmV3IERpcmVjdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoMiAqIG1Db2x1bW5zKV07CisgICAgICAgIG1NZWFzdXJlZCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKICAgICB9CiAKICAgICAvKiBwYWNrYWdlICovIHZvaWQgZ2VuZXJhdGUoQ2hhclNlcXVlbmNlIHNvdXJjZSwgaW50IGJ1ZnN0YXJ0LCBpbnQgYnVmZW5kLApAQCAtMTI4LDU5ICsxMzEsNTAgQEAKICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0gPSBtRm9udE1ldHJpY3NJbnQ7CiAgICAgICAgIGludFtdIGNob29zZWh0diA9IG51bGw7CiAKLSAgICAgICAgaW50IGVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgYnVmc3RhcnQsIGJ1ZmVuZCk7Ci0gICAgICAgIGludCBidWZzaXogPSBlbmQgPj0gMCA/IGVuZCAtIGJ1ZnN0YXJ0IDogYnVmZW5kIC0gYnVmc3RhcnQ7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBNZWFzdXJlZFRleHQgbWVhc3VyZWQgPSBtTWVhc3VyZWQ7CiAKLSAgICAgICAgaWYgKG1DaGRpcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNoZGlycyA9IG5ldyBieXRlW0FycmF5VXRpbHMuaWRlYWxCeXRlQXJyYXlTaXplKGJ1ZnNpeiArIDEpXTsKLSAgICAgICAgICAgIG1DaHMgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShidWZzaXogKyAxKV07Ci0gICAgICAgICAgICBtV2lkdGhzID0gbmV3IGZsb2F0W0FycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUoKGJ1ZnNpeiArIDEpICogMildOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGNoZGlycyA9IG1DaGRpcnM7Ci0gICAgICAgIGNoYXJbXSBjaHMgPSBtQ2hzOwotICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1XaWR0aHM7Ci0KLSAgICAgICAgQWx0ZXJlZENoYXJTZXF1ZW5jZSBhbHRlciA9IG51bGw7CiAgICAgICAgIFNwYW5uZWQgc3Bhbm5lZCA9IG51bGw7Ci0KICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFNwYW5uZWQpCiAgICAgICAgICAgICBzcGFubmVkID0gKFNwYW5uZWQpIHNvdXJjZTsKIAogICAgICAgICBpbnQgREVGQVVMVF9ESVIgPSBESVJfTEVGVF9UT19SSUdIVDsgLy8gWFhYCiAKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgPSBidWZzdGFydDsgc3RhcnQgPD0gYnVmZW5kOyBzdGFydCA9IGVuZCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGludCBwYXJhRW5kOworICAgICAgICBmb3IgKGludCBwYXJhU3RhcnQgPSBidWZzdGFydDsgcGFyYVN0YXJ0IDw9IGJ1ZmVuZDsgcGFyYVN0YXJ0ID0gcGFyYUVuZCkgeworICAgICAgICAgICAgcGFyYUVuZCA9IFRleHRVdGlscy5pbmRleE9mKHNvdXJjZSwgJ1xuJywgcGFyYVN0YXJ0LCBidWZlbmQpOworICAgICAgICAgICAgaWYgKHBhcmFFbmQgPCAwKQorICAgICAgICAgICAgICAgIHBhcmFFbmQgPSBidWZlbmQ7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZW5kID0gVGV4dFV0aWxzLmluZGV4T2Yoc291cmNlLCAnXG4nLCBzdGFydCwgYnVmZW5kKTsKKyAgICAgICAgICAgICAgICBwYXJhRW5kKys7CisgICAgICAgICAgICBpbnQgcGFyYUxlbiA9IHBhcmFFbmQgLSBwYXJhU3RhcnQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPCAwKQotICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZmVuZDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbmQrKzsKLQotICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lQ291bnQgPSAxOworICAgICAgICAgICAgaW50IGZpcnN0V2lkdGhMaW5lTGltaXQgPSBtTGluZUNvdW50ICsgMTsKICAgICAgICAgICAgIGludCBmaXJzdHdpZHRoID0gb3V0ZXJ3aWR0aDsKICAgICAgICAgICAgIGludCByZXN0d2lkdGggPSBvdXRlcndpZHRoOwogCiAgICAgICAgICAgICBMaW5lSGVpZ2h0U3BhbltdIGNob29zZWh0ID0gbnVsbDsKIAogICAgICAgICAgICAgaWYgKHNwYW5uZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3A7Ci0KLSAgICAgICAgICAgICAgICBzcCA9IHNwYW5uZWQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTGVhZGluZ01hcmdpblNwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuW10gc3AgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcGFubmVkLCBwYXJhU3RhcnQsIHBhcmFFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3Bhbi5jbGFzcyk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBMZWFkaW5nTWFyZ2luU3BhbiBsbXMgPSBzcFtpXTsKICAgICAgICAgICAgICAgICAgICAgZmlyc3R3aWR0aCAtPSBzcFtpXS5nZXRMZWFkaW5nTWFyZ2luKHRydWUpOwogICAgICAgICAgICAgICAgICAgICByZXN0d2lkdGggLT0gc3BbaV0uZ2V0TGVhZGluZ01hcmdpbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3Bhbi5MZWFkaW5nTWFyZ2luU3BhbjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V2lkdGhMaW5lQ291bnQgPSAoKExlYWRpbmdNYXJnaW5TcGFuLkxlYWRpbmdNYXJnaW5TcGFuMilsbXMpLmdldExlYWRpbmdNYXJnaW5MaW5lQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmdNYXJnaW5TcGFuMiBpcyBvZGQuICBUaGUgY291bnQgYWZmZWN0cyBhbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVhZGluZyBtYXJnaW4gc3BhbnMsIG5vdCBqdXN0IHRoaXMgcGFydGljdWxhciBvbmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNwYW4sIG5vdCB0aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIGlmIChsbXMgaW5zdGFuY2VvZiBMZWFkaW5nTWFyZ2luU3BhbjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWRpbmdNYXJnaW5TcGFuMiBsbXMyID0gKExlYWRpbmdNYXJnaW5TcGFuMikgbG1zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxtc0ZpcnN0TGluZSA9IGdldExpbmVGb3JPZmZzZXQoc3Bhbm5lZC5nZXRTcGFuU3RhcnQobG1zMikpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RXaWR0aExpbmVMaW1pdCA9IGxtc0ZpcnN0TGluZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtczIuZ2V0TGVhZGluZ01hcmdpbkxpbmVDb3VudCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2hvb3NlaHQgPSBzcGFubmVkLmdldFNwYW5zKHN0YXJ0LCBlbmQsIExpbmVIZWlnaHRTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjaG9vc2VodCA9IGdldFBhcmFncmFwaFNwYW5zKHNwYW5uZWQsIHBhcmFTdGFydCwgcGFyYUVuZCwgTGluZUhlaWdodFNwYW4uY2xhc3MpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNob29zZWh0Lmxlbmd0aCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaG9vc2VodHYgPT0gbnVsbCB8fApAQCAtMTkyLDExICsxODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaG9vc2VodC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG8gPSBzcGFubmVkLmdldFNwYW5TdGFydChjaG9vc2VodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvIDwgcGFyYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGluIHRoaXMgbGF5b3V0LCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYXJhZ3JhcGgKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0dltpXSA9IGdldExpbmVUb3AoZ2V0TGluZUZvck9mZnNldChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0cyBpbiB0aGlzIHBhcmFncmFwaAogCkBAIC0yMDYsMTY2ICsyMDAsODcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChlbmQgLSBzdGFydCA+IGNoZGlycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGRpcnMgPSBuZXcgYnl0ZVtBcnJheVV0aWxzLmlkZWFsQnl0ZUFycmF5U2l6ZShlbmQgLSBzdGFydCldOwotICAgICAgICAgICAgICAgIG1DaGRpcnMgPSBjaGRpcnM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiBjaHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hzID0gbmV3IGNoYXJbQXJyYXlVdGlscy5pZGVhbENoYXJBcnJheVNpemUoZW5kIC0gc3RhcnQpXTsKLSAgICAgICAgICAgICAgICBtQ2hzID0gY2hzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChlbmQgLSBzdGFydCkgKiAyID4gd2lkdGhzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdpZHRocyA9IG5ldyBmbG9hdFtBcnJheVV0aWxzLmlkZWFsSW50QXJyYXlTaXplKChlbmQgLSBzdGFydCkgKiAyKV07Ci0gICAgICAgICAgICAgICAgbVdpZHRocyA9IHdpZHRoczsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lYXN1cmVkLnNldFBhcmEoc291cmNlLCBwYXJhU3RhcnQsIHBhcmFFbmQsIERJUl9SRVFVRVNUX0RFRkFVTFRfTFRSKTsKKyAgICAgICAgICAgIGNoYXJbXSBjaHMgPSBtZWFzdXJlZC5tQ2hhcnM7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG1lYXN1cmVkLm1XaWR0aHM7CisgICAgICAgICAgICBieXRlW10gY2hkaXJzID0gbWVhc3VyZWQubUxldmVsczsKKyAgICAgICAgICAgIGludCBkaXIgPSBtZWFzdXJlZC5tRGlyOworICAgICAgICAgICAgYm9vbGVhbiBlYXN5ID0gbWVhc3VyZWQubUVhc3k7CiAKLSAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyhzb3VyY2UsIHN0YXJ0LCBlbmQsIGNocywgMCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbiA9IGVuZCAtIHN0YXJ0OwotCi0gICAgICAgICAgICBib29sZWFuIGVhc3kgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhbHRlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGlyID0gREVGQVVMVF9ESVI7IC8vIFhYWAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjaHNbaV0gPj0gRklSU1RfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBlYXN5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdW5kZXJseWluZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkCi0gICAgICAgICAgICAvLyBhcyB2aWFibGUgYnJlYWtwb2ludHMsIGFuZCB0aGF0IHRoZSBlbnRpcmUgcnVuIGdldHMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGJpZGkgZGlyZWN0aW9uLgotCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgc291cmNlOwotICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgc3BhbnMubGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcC5nZXRTcGFuU3RhcnQoc3BhbnNbeV0pOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHNwLmdldFNwYW5FbmQoc3BhbnNbeV0pOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSBhOyB4IDwgYjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHNbeCAtIHN0YXJ0XSA9ICdcdUZGRkMnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVhc3kpIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggcHV0IG92ZXJyaWRlIGZsYWdzLCBldGMuIGludG8gY2hkaXJzCi0gICAgICAgICAgICAgICAgZGlyID0gYmlkaShkaXIsIGNocywgY2hkaXJzLCBuLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBtaXJyb3JpbmcgZm9yIHJpZ2h0LXRvLWxlZnQgc2VnbWVudHMKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbaV0gPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1tqXSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBbmRyb2lkQ2hhcmFjdGVyLm1pcnJvcihjaHMsIGksIGogLSBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGogLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViOwotCi0gICAgICAgICAgICBpZiAoYWx0ZXJlZCkgewotICAgICAgICAgICAgICAgIGlmIChhbHRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhbHRlciA9IEFsdGVyZWRDaGFyU2VxdWVuY2UubWFrZShzb3VyY2UsIGNocywgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhbHRlci51cGRhdGUoY2hzLCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIHN1YiA9IGFsdGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWIgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3ViID0gc291cmNlOwogCiAgICAgICAgICAgICBpbnQgd2lkdGggPSBmaXJzdHdpZHRoOwogCiAgICAgICAgICAgICBmbG9hdCB3ID0gMDsKLSAgICAgICAgICAgIGludCBoZXJlID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgaGVyZSA9IHBhcmFTdGFydDsKIAotICAgICAgICAgICAgaW50IG9rID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgb2sgPSBwYXJhU3RhcnQ7CiAgICAgICAgICAgICBmbG9hdCBva3dpZHRoID0gdzsKICAgICAgICAgICAgIGludCBva2FzY2VudCA9IDAsIG9rZGVzY2VudCA9IDAsIG9rdG9wID0gMCwgb2tib3R0b20gPSAwOwogCi0gICAgICAgICAgICBpbnQgZml0ID0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgZml0ID0gcGFyYVN0YXJ0OwogICAgICAgICAgICAgZmxvYXQgZml0d2lkdGggPSB3OwogICAgICAgICAgICAgaW50IGZpdGFzY2VudCA9IDAsIGZpdGRlc2NlbnQgPSAwLCBmaXR0b3AgPSAwLCBmaXRib3R0b20gPSAwOwogCi0gICAgICAgICAgICBib29sZWFuIHRhYiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUYWJPckVtb2ppID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGhhc1RhYiA9IGZhbHNlOworICAgICAgICAgICAgVGFiU3RvcHMgdGFiU3RvcHMgPSBudWxsOwogCi0gICAgICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZW5kOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyk7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSBwYXJhU3RhcnQsIHNwYW5FbmQgPSBzcGFuU3RhcnQsIG5leHRTcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydCA8IHBhcmFFbmQ7IHNwYW5TdGFydCA9IG5leHRTcGFuU3RhcnQpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IHBhaW50LmdldFRleHRXaWR0aHMoc3ViLCBpLCBuZXh0LCB3aWR0aHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAtIGkgPiBhY3R1YWxOdW0pCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUZXh0V2lkdGhzKHdpZHRocywgc3ViLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFubmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gcGFyYUVuZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IHNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgcGFyYUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFjdHVhbE51bSA9IFN0eWxlZC5nZXRUZXh0V2lkdGhzKHBhaW50LCBtV29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uZWQsIGksIG5leHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBmbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IC0gaSA+IGFjdHVhbE51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdFRleHRXaWR0aHMod2lkdGhzLCBzcGFubmVkLCBpLCBuZXh0LCBhY3R1YWxOdW0pOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZHRocywgMCwgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0ICsgKGkgLSBzdGFydCksIG5leHQgLSBpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVdvcmtQYWludC5iYXNlbGluZVNoaWZ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYXNjZW50ICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCArPSBtV29ya1BhaW50LmJhc2VsaW5lU2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzcGFuTGVuID0gc3BhbkVuZCAtIHNwYW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5MZW4sIGZtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtLmRlc2NlbnQgKz0gbVdvcmtQYWludC5iYXNlbGluZVNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgZm0uYm90dG9tICs9IG1Xb3JrUGFpbnQuYmFzZWxpbmVTaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbm5lZC5nZXRTcGFucyhzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWQuYWRkU3R5bGVSdW4ocGFpbnQsIHNwYW5zLCBzcGFuTGVuLCBmbSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBuZXh0U3BhblN0YXJ0ID0gc3BhbkVuZDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRJblBhcmEgPSBzcGFuU3RhcnQgLSBwYXJhU3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGVuZEluUGFyYSA9IHNwYW5FbmQgLSBwYXJhU3RhcnQ7CisKICAgICAgICAgICAgICAgICBpbnQgZm10b3AgPSBmbS50b3A7CiAgICAgICAgICAgICAgICAgaW50IGZtYm90dG9tID0gZm0uYm90dG9tOwogICAgICAgICAgICAgICAgIGludCBmbWFzY2VudCA9IGZtLmFzY2VudDsKICAgICAgICAgICAgICAgICBpbnQgZm1kZXNjZW50ID0gZm0uZGVzY2VudDsKIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBuZXh0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBMb2cuZSgidGV4dCIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgbmV4dDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGNoc1tqIC0gc3RhcnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBzcGFuU3RhcnQ7IGogPCBzcGFuRW5kOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gY2hzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICBmbG9hdCBiZWZvcmUgPSB3OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcdCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBMYXlvdXQubmV4dFRhYihzdWIsIHN0YXJ0LCBlbmQsIHcsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRiAmJiBqICsgMSA8IG5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbW9qaSA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChjaHMsIGogLSBzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFiID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNUYWJPckVtb2ppID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbm5lZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRhYiB0aGlzIHBhcmEsIGNoZWNrIGZvciB0YWJzdG9wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJTdG9wU3BhbltdIHNwYW5zID0gZ2V0UGFyYWdyYXBoU3BhbnMoc3Bhbm5lZCwgcGFyYVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQsIFRhYlN0b3BTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYlN0b3BzID0gbmV3IFRhYlN0b3BzKFRBQl9JTkNSRU1FTlQsIHNwYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJTdG9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRhYlN0b3BzLm5leHRUYWIodyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBUYWJTdG9wcy5uZXh0RGVmYXVsdFN0b3AodywgVEFCX0lOQ1JFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYgJiYgaiArIDEgPCBzcGFuRW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW1vamkgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQoY2hzLCBqIC0gcGFyYVN0YXJ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtb2ppID49IE1JTl9FTU9KSSAmJiBlbW9qaSA8PSBNQVhfRU1PSkkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBFTU9KSV9GQUNUT1JZLgpAQCAtMzgwLDIxICsyOTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFpbnQgPSBtV29ya1BhaW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gKGZsb2F0KSBibS5nZXRXaWR0aCgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkID0gYm0uZ2V0V2lkdGgoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13aGljaFBhaW50LmFzY2VudCgpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uZ2V0SGVpZ2h0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RhYk9yRW1vamkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSB3aWR0aHNbaiAtIHBhcmFTdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tqIC0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gd2lkdGhzW2ogLSBwYXJhU3RhcnRdOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAid2FzICIgKyBiZWZvcmUgKyAiIG5vdyAiICsgdyArICIgYWZ0ZXIgIiArIGMgKyAiIHdpdGhpbiAiICsgd2lkdGgpOwpAQCAtNDE1LDcgKzMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICogRnJvbSB0aGUgVW5pY29kZSBMaW5lIEJyZWFraW5nIEFsZ29yaXRobToKICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdCBsZWFzdCBhcHByb3hpbWF0ZWx5KQotICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC4sOjsgYXJlIGNsYXNzIElTOiBicmVha3BvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBleGNlcHQgd2hlbiBhZGphY2VudCB0byBkaWdpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqIC8gICAgaXMgY2xhc3MgU1k6IGEgYnJlYWtwb2ludApAQCAtNDMwLDEyICszNDUsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLicgIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8IGMgPT0gJzsnKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAtIDEgPCBoZXJlIHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiAtIDEgLSBzdGFydF0pKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gbmV4dCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gc3RhcnRdKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gMSA8IGhlcmUgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqIC0gMSAtIHBhcmFTdGFydF0pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiArIDEgPj0gc3BhbkVuZCB8fCAhQ2hhcmFjdGVyLmlzRGlnaXQoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSkpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYyA9PSAnLycgfHwgYyA9PSAnLScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqICsgMSA+PSBuZXh0IHx8ICFDaGFyYWN0ZXIuaXNEaWdpdChjaHNbaiArIDEgLSBzdGFydF0pKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGogKyAxID49IHNwYW5FbmQgfHwgIUNoYXJhY3Rlci5pc0RpZ2l0KGNoc1tqICsgMSAtIHBhcmFTdGFydF0pKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSBGSVJTVF9DSksgJiYgaXNJZGVvZ3JhcGhpYyhjLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICsgMSA8IG5leHQgJiYgaXNJZGVvZ3JhcGhpYyhjaHNbaiArIDEgLSBzdGFydF0sIGZhbHNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIDEgPCBzcGFuRW5kICYmIGlzSWRlb2dyYXBoaWMoY2hzW2ogKyAxIC0gcGFyYVN0YXJ0XSwgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rd2lkdGggPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gaiArIDE7CiAKQEAgLTQ1Miw3ICszNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rICE9IGhlcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgb2sgIiArIGhlcmUgKyAiIHRvICIgK29rKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IG5leHQgJiYgY2hzW29rIC0gc3RhcnRdID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvayA8IHNwYW5FbmQgJiYgY2hzW29rIC0gcGFyYVN0YXJ0XSA9PSAnICcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2srKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ2MSwxMCArMzc2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2FzY2VudCwgb2tkZXNjZW50LCBva3RvcCwgb2tib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VodHYsIGZtLCBoYXNUYWJPckVtb2ppLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBwYXJhU3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzLCB3aWR0aHMsIGhlcmUgLSBwYXJhU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSwgZWxsaXBzaXplZFdpZHRoLCBva3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCkBAIC00ODgsNyArNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvayAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9rICIgKyBoZXJlICsgIiB0byAiICtvayk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBuZXh0ICYmIGNoc1tvayAtIHN0YXJ0XSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2sgPCBzcGFuRW5kICYmIGNoc1tvayAtIHBhcmFTdGFydF0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00OTcsMTAgKzQxMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQsIG9rZGVzY2VudCwgb2t0b3AsIG9rYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwgdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMsIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgb2t3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKIApAQCAtNTEzLDE5ICs0MjgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdHRvcCwgZml0Ym90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCA9PSBidWZlbmQsIGluY2x1ZGVwYWQsIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIGZpdHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGZpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nLmUoInRleHQiLCAib3V0cHV0IG9uZSAiICsgaGVyZSArICIgdG8gIiArKGhlcmUgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggbm90IHN1cmUgd2h5IHRoZSBleGlzdGluZyBmbSB3YXNuJ3Qgb2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZVRleHQocGFpbnQsIG1Xb3JrUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgc291cmNlLCBoZXJlLCBoZXJlICsgMSwgZm0sIHRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBudWxsKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvdXQoc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgaGVyZSsxLApAQCAtNTMzLDE5ICs0NDksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtLnRvcCwgZm0uYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmdtdWx0LCBzcGFjaW5nYWRkLCBjaG9vc2VodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZWh0diwgZm0sIHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgc3RhcnQsIGNoZGlycywgZGlyLCBlYXN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKyAxID09IGJ1ZmVuZCwgaW5jbHVkZXBhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHMsIHdpZHRocywgaGVyZSAtIHBhcmFTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHNbaGVyZSAtIHN0YXJ0XSwgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzW2hlcmUgLSBwYXJhU3RhcnRdLCBwYWludCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlID0gaGVyZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBuZXh0ID0gaGVyZTsgLy8gbXVzdCByZW1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlIDwgc3BhblN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlkbid0IG91dHB1dCBhbGwgdGhlIHRleHQgZm9yIHRoaXMgc3BhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIG1lYXN1cmVkIHRoZSByYXcgd2lkdGhzLCB0aG91Z2gsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXNldCB0aGUgc3RhcnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gbmV4dFNwYW5TdGFydCA9IGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBoZXJlIC0gMTsgICAgLy8gY29udGludWUgbG9vcGluZwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTU1LDE0ICs0NzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpdGFzY2VudCA9IGZpdGRlc2NlbnQgPSBmaXR0b3AgPSBmaXRib3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb2thc2NlbnQgPSBva2Rlc2NlbnQgPSBva3RvcCA9IG9rYm90dG9tID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZmlyc3RXaWR0aExpbmVDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1maXJzdFdpZHRoTGluZUxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJlc3R3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGVuZCAhPSBoZXJlKSB7CisgICAgICAgICAgICBpZiAocGFyYUVuZCAhPSBoZXJlKSB7CiAgICAgICAgICAgICAgICAgaWYgKChmaXR0b3AgfCBmaXRib3R0b20gfCBmaXRkZXNjZW50IHwgZml0YXNjZW50KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtKTsKIApAQCAtNTc1LDIwICs0OTQsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBMb2cuZSgidGV4dCIsICJvdXRwdXQgcmVzdCAiICsgaGVyZSArICIgdG8gIiArIGVuZCk7CiAKICAgICAgICAgICAgICAgICB2ID0gb3V0KHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgcGFyYUVuZCwgZml0YXNjZW50LCBmaXRkZXNjZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgZml0dG9wLCBmaXRib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZ211bHQsIHNwYWNpbmdhZGQsIGNob29zZWh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBzdGFydCwgY2hkaXJzLCBkaXIsIGVhc3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocywgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlaHR2LCBmbSwgaGFzVGFiT3JFbW9qaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNdWx0aXBseSwgcGFyYVN0YXJ0LCBjaGRpcnMsIGRpciwgZWFzeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFFbmQgPT0gYnVmZW5kLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNocywgd2lkdGhzLCBoZXJlIC0gcGFyYVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsIGVsbGlwc2l6ZWRXaWR0aCwgdywgcGFpbnQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdGFydCA9IGVuZDsKKyAgICAgICAgICAgIHBhcmFTdGFydCA9IHBhcmFFbmQ7CiAKLSAgICAgICAgICAgIGlmIChlbmQgPT0gYnVmZW5kKQorICAgICAgICAgICAgaWYgKHBhcmFFbmQgPT0gYnVmZW5kKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYwMywyNDYgKzUyMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgICAgICAgICBzcGFjaW5nbXVsdCwgc3BhY2luZ2FkZCwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZm0sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBuZWVkTXVsdGlwbHksIGJ1ZmVuZCwgY2hkaXJzLCBERUZBVUxUX0RJUiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbmVlZE11bHRpcGx5LCBidWZlbmQsIG51bGwsIERFRkFVTFRfRElSLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCBpbmNsdWRlcGFkLCB0cmFja3BhZCwKLSAgICAgICAgICAgICAgICAgICAgd2lkdGhzLCBidWZzdGFydCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgYnVmc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIHdoZXJlLCBlbGxpcHNpemVkV2lkdGgsIDAsIHBhaW50KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHVuaWNvZGUgYmlkaSBhbGdvcml0aG0gb24gdGhlIGZpcnN0IG4gY2hhcnMgaW4gY2hzLCByZXR1cm5pbmcKLSAgICAgKiB0aGUgY2hhciBkaXJzIGluIGNoSW5mbyBhbmQgdGhlIGJhc2UgbGluZSBkaXJlY3Rpb24gb2YgdGhlIGZpcnN0Ci0gICAgICogcGFyYWdyYXBoLgotICAgICAqIAotICAgICAqIFhYWCBjaGFuZ2UgcmVzdWx0IGZyb20gZGlycyB0byBsZXZlbHMKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0aW9uIGZsYWcsIGVpdGhlciBESVJfUkVRVUVTVF9MVFIsCi0gICAgICogRElSX1JFUVVFU1RfUlRMLCBESVJfUkVRVUVTVF9ERUZBVUxUX0xUUiwgb3IgRElSX1JFUVVFU1RfREVGQVVMVF9SVEwuCi0gICAgICogQHBhcmFtIGNocyB0aGUgdGV4dCB0byBleGFtaW5lCi0gICAgICogQHBhcmFtIGNoSW5mbyBvbiBpbnB1dCwgaWYgaGFzSW5mbyBpcyB0cnVlLCBvdmVycmlkZSBhbmQgb3RoZXIgZmxhZ3MgCi0gICAgICogcmVwcmVzZW50aW5nIG91dC1vZi1iYW5kIGVtYmVkZGluZyBpbmZvcm1hdGlvbi4gT24gb3V0cHV0LCB0aGUgZ2VuZXJhdGVkIAotICAgICAqIGRpcnMgb2YgdGhlIHRleHQuCi0gICAgICogQHBhcmFtIG4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC9pbmZvcm1hdGlvbiBpbiBjaHMgYW5kIGNoSW5mbwotICAgICAqIEBwYXJhbSBoYXNJbmZvIHRydWUgaWYgY2hJbmZvIGhhcyBpbnB1dCBpbmZvcm1hdGlvbiwgb3RoZXJ3aXNlIHRoZQotICAgICAqIGlucHV0IGRhdGEgaW4gY2hJbmZvIGlzIGlnbm9yZWQuCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZGlyZWN0aW9uIGxldmVsIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGgsIGVpdGhlcgotICAgICAqIERJUl9MRUZUX1RPX1JJR0hUIG9yIERJUl9SSUdIVF9UT19MRUZULgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGludCBiaWRpKGludCBkaXIsIGNoYXJbXSBjaHMsIGJ5dGVbXSBjaEluZm8sIGludCBuLCAKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzSW5mbykgewotICAgICAgICAKLSAgICAgICAgQW5kcm9pZENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0aWVzKGNocywgY2hJbmZvLCBuKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEZXRlcm1pbmUgcHJpbWFyeSBwYXJhZ3JhcGggZGlyZWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkaXIgIT0gRElSX1JFUVVFU1RfTFRSICYmIGRpciAhPSBESVJfUkVRVUVTVF9SVEwpIHsKLSAgICAgICAgICAgIC8vIHNldCB1cCBkZWZhdWx0Ci0gICAgICAgICAgICBkaXIgPSBkaXIgPj0gMCA/IERJUl9MRUZUX1RPX1JJR0hUIDogRElSX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgICAgIGludCBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX0xFRlRfVE9fUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVCkgewotICAgICAgICAgICAgICAgICAgICBkaXIgPSBESVJfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYnl0ZSBTT1IgPSBkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQgPwotICAgICAgICAgICAgICAgIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUIDoKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBYWFggRXhwbGljaXQgb3ZlcnJpZGVzIHNob3VsZCBnbyBoZXJlCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlYWsgdHlwZSByZXNvbHV0aW9uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiaW5pdGlhbCIpOwotCi0gICAgICAgIC8vIFcxIG5vbiBzcGFjaW5nIG1hcmtzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoY2hJbmZvW2pdID09IENoYXJhY3Rlci5OT05fU1BBQ0lOR19NQVJLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gU09SOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gY2hJbmZvW2ogLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzEiKTsKLQotICAgICAgICAvLyBXMiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGJ5dGUgY3VyID0gU09SOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQykKLSAgICAgICAgICAgICAgICBjdXIgPSBkOwotICAgICAgICAgICAgZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgIGlmIChjdXIgPT0KLSAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlRfQVJBQklDKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzIiKTsKLQotICAgICAgICAvLyBXMyBhcmFiaWMgbGV0dGVycwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgaWYgKGNoSW5mb1tqXSA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUMpCi0gICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlczIik7Ci0KLSAgICAgICAgLy8gVzQgc2luZ2xlIHNlcGFyYXRvciBiZXR3ZWVuIG51bWJlcnMKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBuIC0gMTsgaisrKSB7Ci0gICAgICAgICAgICBieXRlIGQgPSBjaEluZm9bal07Ci0gICAgICAgICAgICBieXRlIHByZXYgPSBjaEluZm9baiAtIDFdOwotICAgICAgICAgICAgYnl0ZSBuZXh0ID0gY2hJbmZvW2ogKyAxXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSICYmCi0gICAgICAgICAgICAgICAgICAgIG5leHQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUiAmJgotICAgICAgICAgICAgICAgICAgICBuZXh0ID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9BUkFCSUNfTlVNQkVSKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiVzQiKTsKLQotICAgICAgICAvLyBXNSBldXJvcGVhbiBudW1iZXIgdGVybWluYXRvcnMKLSAgICAgICAgYm9vbGVhbiBhZGphY2VudCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewotICAgICAgICAgICAgYnl0ZSBkID0gY2hJbmZvW2pdOwotCi0gICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSKQotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUl9URVJNSU5BVE9SICYmIGFkamFjZW50KQotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vZHVtcChjaGRpcnMsIG4sICJXNSIpOwotCi0gICAgICAgIC8vIFc1IGV1cm9wZWFuIG51bWJlciB0ZXJtaW5hdG9ycyBwYXJ0IDIsCi0gICAgICAgIC8vIFc2IHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzCi0gICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGogPSBuIC0gMTsgaiA+PSAwOyBqLS0pIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9FVVJPUEVBTl9OVU1CRVJfVEVSTUlOQVRPUikgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudCkKLSAgICAgICAgICAgICAgICAgICAgY2hJbmZvW2pdID0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9PVEhFUl9ORVVUUkFMUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFkamFjZW50ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9DT01NT05fTlVNQkVSX1NFUEFSQVRPUiB8fAotICAgICAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9QQVJBR1JBUEhfU0VQQVJBVE9SIHx8Ci0gICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1NFR01FTlRfU0VQQVJBVE9SKQotICAgICAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfT1RIRVJfTkVVVFJBTFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc2Iik7Ci0KLSAgICAgICAgLy8gVzcgc3Ryb25nIGRpcmVjdGlvbiBvZiBldXJvcGVhbiBudW1iZXJzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gU09SIHx8Ci0gICAgICAgICAgICAgICAgZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICAgICAgY3VyID0gZDsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUikKLSAgICAgICAgICAgICAgICBjaEluZm9bal0gPSBjdXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkdW1wKGNoZGlycywgbiwgIlc3Iik7Ci0KLSAgICAgICAgLy8gTjEsIE4yIG5ldXRyYWxzCi0gICAgICAgIGN1ciA9IFNPUjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGJ5dGUgZCA9IGNoSW5mb1tqXTsKLQotICAgICAgICAgICAgaWYgKGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQgfHwKLSAgICAgICAgICAgICAgICBkID09IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgY3VyID0gZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0FSQUJJQ19OVU1CRVIpIHsKLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZSBkZCA9IFNPUjsKLSAgICAgICAgICAgICAgICBpbnQgazsKLQotICAgICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgbjsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRkID0gY2hJbmZvW2tdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPT0gQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfRVVST1BFQU5fTlVNQkVSIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZCA9PSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfQVJBQklDX05VTUJFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IGo7IHkgPCBrOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRkID09IGN1cikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoSW5mb1t5XSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2hJbmZvW3ldID0gU09SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGogPSBrIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGR1bXAoY2hkaXJzLCBuLCAiZmluYWwiKTsKLQotICAgICAgICAvLyBleHRyYTogZW5mb3JjZSB0aGF0IGFsbCB0YWJzIGFuZCBzdXJyb2dhdGUgY2hhcmFjdGVycyBnbyB0aGUKLSAgICAgICAgLy8gcHJpbWFyeSBkaXJlY3Rpb24KLSAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgZG8gZGlyZWN0aW9ucyByaWdodCBmb3Igc3Vycm9nYXRlcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBjaHNbal07Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcdCcgfHwgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSkgewotICAgICAgICAgICAgICAgIGNoSW5mb1tqXSA9IFNPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRpcjsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZJUlNUX0NKSyA9ICdcdTJFODAnOwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhvc2Ugc3BlY2lmaWVkCkBAIC05NDgsNTMgKzYzNCwxNSBAQAogICAgIH0KICovCiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rml0KFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCkgewotICAgICAgICBpbnQgaGlnaCA9IGVuZCArIDEsIGxvdyA9IHN0YXJ0IC0gMSwgZ3Vlc3M7Ci0KLSAgICAgICAgd2hpbGUgKGhpZ2ggLSBsb3cgPiAxKSB7Ci0gICAgICAgICAgICBndWVzcyA9IChoaWdoICsgbG93KSAvIDI7Ci0KLSAgICAgICAgICAgIGlmIChtZWFzdXJlVGV4dChwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIHN0YXJ0LCBndWVzcywgbnVsbCwgdHJ1ZSwgbnVsbCkgPiB3aWQpCi0gICAgICAgICAgICAgICAgaGlnaCA9IGd1ZXNzOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvdyA9IGd1ZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvdyA8IHN0YXJ0KQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbG93OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0VGV4dFdpZHRocyhmbG9hdFtdIHdpZHRocywgQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3VyUG9zLCBpbnQgbmV4dFBvcywgaW50IGFjdHVhbE51bSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGRzdEluZGV4ID0gbmV4dFBvcyAtIGN1clBvcyAtIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNJbmRleCA9IGFjdHVhbE51bSAtIDE7IHNyY0luZGV4ID49IDA7IHNyY0luZGV4LS0pIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB0ZXh0LmNoYXJBdChkc3RJbmRleCArIGN1clBvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IDAuMGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdpZHRoc1tkc3RJbmRleC0tXSA9IHdpZHRoc1tzcmNJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoInRleHQiLCAiYWRqdXN0IHRleHQgd2lkdGhzIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgb3V0KENoYXJTZXF1ZW5jZSB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3ZlLCBpbnQgYmVsb3csIGludCB0b3AsIGludCBib3R0b20sIGludCB2LAogICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwYWNpbmdtdWx0LCBmbG9hdCBzcGFjaW5nYWRkLAogICAgICAgICAgICAgICAgICAgICAgIExpbmVIZWlnaHRTcGFuW10gY2hvb3NlaHQsIGludFtdIGNob29zZWh0diwKLSAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbSwgYm9vbGVhbiB0YWIsCisgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3NJbnQgZm0sIGJvb2xlYW4gaGFzVGFiT3JFbW9qaSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRNdWx0aXBseSwgaW50IHBzdGFydCwgYnl0ZVtdIGNoZGlycywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIGVhc3ksIGJvb2xlYW4gbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVwYWQsIGJvb2xlYW4gdHJhY2twYWQsCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSB3aWR0aHMsIGludCB3aWRzdGFydCwgaW50IHdpZG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hzLCBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFRleHRVdGlscy5UcnVuY2F0ZUF0IGVsbGlwc2l6ZSwgZmxvYXQgZWxsaXBzaXN3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgaiA9IG1MaW5lQ291bnQ7CkBAIC0xMDAyLDggKzY1MCw2IEBACiAgICAgICAgIGludCB3YW50ID0gb2ZmICsgbUNvbHVtbnMgKyBUT1A7CiAgICAgICAgIGludFtdIGxpbmVzID0gbUxpbmVzOwogCi0gICAgICAgIC8vIExvZy5lKCJ0ZXh0IiwgImxpbmUgIiArIHN0YXJ0ICsgIiB0byAiICsgZW5kICsgKGxhc3QgPyAiPT09IiA6ICIiKSk7Ci0KICAgICAgICAgaWYgKHdhbnQgPj0gbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICBpbnQgbmxlbiA9IEFycmF5VXRpbHMuaWRlYWxJbnRBcnJheVNpemUod2FudCArIDEpOwogICAgICAgICAgICAgaW50W10gZ3JvdyA9IG5ldyBpbnRbbmxlbl07CkBAIC0xMDc5LDU5ICs3MjUsMjMgQEAKICAgICAgICAgbGluZXNbb2ZmICsgbUNvbHVtbnMgKyBTVEFSVF0gPSBlbmQ7CiAgICAgICAgIGxpbmVzW29mZiArIG1Db2x1bW5zICsgVE9QXSA9IHY7CiAKLSAgICAgICAgaWYgKHRhYikKKyAgICAgICAgaWYgKGhhc1RhYk9yRW1vamkpCiAgICAgICAgICAgICBsaW5lc1tvZmYgKyBUQUJdIHw9IFRBQl9NQVNLOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpbmVzW29mZiArIERJUl0gfD0gZGlyIDw8IERJUl9TSElGVDsKLQotICAgICAgICAgICAgaW50IGN1ciA9IENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgaWYgKCFlYXN5KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZGlyc1trIC0gcHN0YXJ0XSAhPSBjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjaGRpcnNbayAtIHBzdGFydF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnM7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFtdIGxkID0gbmV3IHNob3J0W2NvdW50ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBjdXIgPSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfTEVGVF9UT19SSUdIVDsKLSAgICAgICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGhlcmUgPSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGRpcnNbayAtIHBzdGFydF0gIT0gY3VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBYWFggY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3ZlcmZsb3cgc2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkW2NvdW50KytdID0gKHNob3J0KSAoayAtIGhlcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY2hkaXJzW2sgLSBwc3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsZFtjb3VudF0gPSAoc2hvcnQpIChlbmQgLSBoZXJlKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGxkWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZWRpcnMgPSBESVJTX0FMTF9SSUdIVF9UT19MRUZUOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVkaXJzID0gbmV3IERpcmVjdGlvbnMobGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICBsaW5lc1tvZmYgKyBESVJdIHw9IGRpciA8PCBESVJfU0hJRlQ7CisgICAgICAgIERpcmVjdGlvbnMgbGluZWRpcnMgPSBESVJTX0FMTF9MRUZUX1RPX1JJR0hUOworICAgICAgICAvLyBlYXN5IG1lYW5zIGFsbCBjaGFycyA8IHRoZSBmaXJzdCBSVEwsIHNvIG5vIGVtb2ppLCBubyBub3RoaW5nCisgICAgICAgIC8vIFhYWCBhIHJ1biB3aXRoIG5vIHRleHQgb3IgYWxsIHNwYWNlcyBpcyBlYXN5IGJ1dCBtaWdodCBiZSBhbiBlbXB0eQorICAgICAgICAvLyBSVEwgcGFyYWdyYXBoLiAgTWFrZSBzdXJlIGVhc3kgaXMgZmFsc2UgaWYgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAgICAgaWYgKGVhc3kpIHsKICAgICAgICAgICAgIG1MaW5lRGlyZWN0aW9uc1tqXSA9IGxpbmVkaXJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxpbmVEaXJlY3Rpb25zW2pdID0gQW5kcm9pZEJpZGkuZGlyZWN0aW9ucyhkaXIsIGNoZGlycywgd2lkc3RhcnQsIGNocywKKyAgICAgICAgICAgICAgICAgICAgd2lkc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIAogICAgICAgICAgICAgLy8gSWYgZWxsaXBzaXplIGlzIGluIG1hcnF1ZWUgbW9kZSwgZG8gbm90IGFwcGx5IGVsbGlwc2lzIG9uIHRoZSBmaXJzdCBsaW5lCiAgICAgICAgICAgICBpZiAoZWxsaXBzaXplICE9IG51bGwgJiYgKGVsbGlwc2l6ZSAhPSBUZXh0VXRpbHMuVHJ1bmNhdGVBdC5NQVJRVUVFIHx8IGogIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVFbGxpcHNpcyhzdGFydCwgZW5kLCB3aWR0aHMsIHdpZHN0YXJ0LCB3aWRvZmYsCisgICAgICAgICAgICAgICAgY2FsY3VsYXRlRWxsaXBzaXMoc3RhcnQsIGVuZCwgd2lkdGhzLCB3aWRzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpc3dpZHRoLCBlbGxpcHNpemUsIGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHdpZHRoLCBwYWludCk7CiAgICAgICAgICAgICB9CkBAIC0xMTQyLDcgKzc1Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUVsbGlwc2lzKGludCBsaW5lc3RhcnQsIGludCBsaW5lZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LCBpbnQgd2lkb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFtdIHdpZHRocywgaW50IHdpZHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhdmFpbCwgVGV4dFV0aWxzLlRydW5jYXRlQXQgd2hlcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBmbG9hdCB0ZXh0d2lkdGgsIFRleHRQYWludCBwYWludCkgewogICAgICAgICBpbnQgbGVuID0gbGluZWVuZCAtIGxpbmVzdGFydDsKQEAgLTExNjIsNyArNzcyLDcgQEAKICAgICAgICAgICAgIGludCBpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tpIC0gMSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgLSAxICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBzdW0gKyBlbGxpcHNpc3dpZCA+IGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE3OCw3ICs3ODgsNyBAQAogICAgICAgICAgICAgaW50IGk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWR0aHNbaSArIGxpbmVzdGFydCAtIHdpZHN0YXJ0ICsgd2lkb2ZmXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2kgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTk1LDcgKzgwNSw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7CiAgICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tyaWdodCAtIDEgKyBsaW5lc3RhcnQgLSB3aWRzdGFydF07CiAKICAgICAgICAgICAgICAgICBpZiAodyArIHJzdW0gPiByYXZhaWwpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjA2LDcgKzgxNiw3IEBACiAKICAgICAgICAgICAgIGZsb2F0IGxhdmFpbCA9IGF2YWlsIC0gZWxsaXBzaXN3aWQgLSByc3VtOwogICAgICAgICAgICAgZm9yIChsZWZ0ID0gMDsgbGVmdCA8IHJpZ2h0OyBsZWZ0KyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB3ID0gd2lkdGhzW2xlZnQgKyBsaW5lc3RhcnQgLSB3aWRzdGFydCArIHdpZG9mZl07CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZHRoc1tsZWZ0ICsgbGluZXN0YXJ0IC0gd2lkc3RhcnRdOwogCiAgICAgICAgICAgICAgICAgaWYgKHcgKyBsc3VtID4gbGF2YWlsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIyMyw3ICs4MzMsNyBAQAogICAgICAgICBtTGluZXNbbUNvbHVtbnMgKiBsaW5lICsgRUxMSVBTSVNfQ09VTlRdID0gZWxsaXBzaXNDb3VudDsKICAgICB9CiAKLSAgICAvLyBPdmVycmlkZSB0aGUgYmFzZWNsYXNzIHNvIHdlIGNhbiBkaXJlY3RseSBhY2Nlc3Mgb3VyIG1lbWJlcnMsCisgICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgY2xhc3Mgc28gd2UgY2FuIGRpcmVjdGx5IGFjY2VzcyBvdXIgbWVtYmVycywKICAgICAvLyByYXRoZXIgdGhhbiByZWx5aW5nIG9uIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgLy8gVGhlIGxvZ2ljIG1pcnJvcnMgdGhhdCBvZiBMYXlvdXQuZ2V0TGluZUZvclZlcnRpY2FsCiAgICAgLy8gRklYTUU6IEl0IG1heSBiZSBmYXN0ZXIgdG8gZG8gYSBsaW5lYXIgc2VhcmNoIGZvciBsYXlvdXRzIHdpdGhvdXQgbWFueSBsaW5lcy4KQEAgLTEyNTIsMTEgKzg2MiwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVRvcChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07ICAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIFRPUF07CiAgICAgfQogCiAgICAgcHVibGljIGludCBnZXRMaW5lRGVzY2VudChpbnQgbGluZSkgewotICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOyAgIAorICAgICAgICByZXR1cm4gbUxpbmVzW21Db2x1bW5zICogbGluZSArIERFU0NFTlRdOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0TGluZVN0YXJ0KGludCBsaW5lKSB7CkBAIC0xMzI5LDEzICs5MzksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElSX1NISUZUICA9IDMwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfTUFTSyAgID0gMHgyMDAwMDAwMDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRklSU1RfUklHSFRfVE9fTEVGVCA9ICdcdTA1OTAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfSU5DUkVNRU5UID0gMjA7IC8vIHNhbWUgYXMgTGF5b3V0LCBidXQgdGhhdCdzIHByaXZhdGUKIAogICAgIC8qCi0gICAgICogVGhlc2UgYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgdG8gZ2VuZXJhdGUoKQorICAgICAqIFRoaXMgaXMgcmV1c2VkIGFjcm9zcyBjYWxscyB0byBnZW5lcmF0ZSgpCiAgICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gbUNoZGlyczsKLSAgICBwcml2YXRlIGNoYXJbXSBtQ2hzOwotICAgIHByaXZhdGUgZmxvYXRbXSBtV2lkdGhzOworICAgIHByaXZhdGUgTWVhc3VyZWRUZXh0IG1NZWFzdXJlZDsKICAgICBwcml2YXRlIFBhaW50LkZvbnRNZXRyaWNzSW50IG1Gb250TWV0cmljc0ludCA9IG5ldyBQYWludC5Gb250TWV0cmljc0ludCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3R5bGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzY2M0MmMuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9TdHlsZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC50ZXh0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLk1ldHJpY0FmZmVjdGluZ1NwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlJlcGxhY2VtZW50U3BhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBkcmF3aW5nIGFuZCBtZWFzdXJpbmcgc3R5bGVkIHRleHQsCi0gKiBsaWtlIHtAbGluayBhbmRyb2lkLnRleHQuU3Bhbm5lZH0gb2JqZWN0IHdpdGgKLSAqIHtAbGluayBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFufS4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkCi17Ci0gICAgLyoqCi0gICAgICogRHJhd3MgYW5kL29yIG1lYXN1cmVzIGEgdW5pZm9ybSBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLiBObyBzcGFuIG9mCi0gICAgICogaW50ZXJlc3Qgc2hvdWxkIHN0YXJ0IG9yIGVuZCBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgcnVuIChpZiBub3QKLSAgICAgKiBkcmF3aW5nLCBjaGFyYWN0ZXIgc3BhbnMgdGhhdCBkb24ndCBhZmZlY3QgbWV0cmljcyBjYW4gYmUgaWdub3JlZCkuCi0gICAgICogTmVpdGhlciBzaG91bGQgdGhlIHJ1biBkaXJlY3Rpb24gY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRleHQuIEluIGEgcmlnaHQtdG8tbGVmdAotICAgICAqIHBhcmFncmFwaCwgdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dCB0byBiZSBkcmF3bi4gUGFpbnQKLSAgICAgKiBzaG91bGQgbm90IGhhdmUgYW4gQWxpZ24gdmFsdWUgb3RoZXIgdGhhbiBMRUZUIG9yIHBvc2l0aW9uaW5nIHdpbGwgZ2V0Ci0gICAgICogY29uZnVzZWQuCi0gICAgICoKLSAgICAgKiA8cD5PbiByZXR1cm4sIHdvcmtQYWludCB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHBhaW50IHBsdXMgYW55Ci0gICAgICogbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IGNoYXJhY3RlciBzdHlsZXMgb24gdGhlIHJ1bi4KLSAgICAgKgotICAgICAqIDxwPlRoZSByZXR1cm5lZCB3aWR0aCBpcyBzaWduZWQgYW5kIHdpbGwgYmUgPCAwIGlmIHRoZSBwYXJhZ3JhcGgKLSAgICAgKiBkaXJlY3Rpb24gaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBkcmF3VW5pZm9ybVJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5lZCB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLCBib29sZWFuIHJ1bklzUnRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5Gb250TWV0cmljc0ludCBmbWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKLQotICAgICAgICBib29sZWFuIGhhdmVXaWR0aCA9IGZhbHNlOwotICAgICAgICBmbG9hdCByZXQgPSAwOwotICAgICAgICBDaGFyYWN0ZXJTdHlsZVtdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgZW5kLCBDaGFyYWN0ZXJTdHlsZS5jbGFzcyk7Ci0KLSAgICAgICAgUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBYWFg6IFRoaXMgc2hvdWxkbid0IGJlIG1vZGlmeWluZyBwYWludCwgb25seSB3b3JrUGFpbnQuCi0gICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBtZW1iZXJzIGJlbG9uZ2luZyB0byBUZXh0UGFpbnQgc2hvdWxkIGhhdmUgZGVmYXVsdAotICAgICAgICAvLyB2YWx1ZXMgYW55d2F5LiAgQmV0dGVyIHRvIGVuc3VyZSB0aGlzIGluIHRoZSBMYXlvdXQgY29uc3RydWN0b3IuCi0gICAgICAgIHBhaW50LmJnQ29sb3IgPSAwOwotICAgICAgICBwYWludC5iYXNlbGluZVNoaWZ0ID0gMDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0KLQkJaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlDaGFyYWN0ZXJTdHlsZSBzcGFuID0gc3BhbnNbaV07Ci0KLQkJCQlpZiAoc3BhbiBpbnN0YW5jZW9mIFJlcGxhY2VtZW50U3BhbikgewotCQkJCQlyZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNwYW4udXBkYXRlRHJhd1N0YXRlKHdvcmtQYWludCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLSAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0bXA7Ci0gICAgICAgICAgICBpbnQgdG1wc3RhcnQsIHRtcGVuZDsKLQotICAgICAgICAgICAgaWYgKHJ1bklzUnRsKSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgdG1wc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFhYWDogYXNzdW1lcyBnZXRSZXZlcnNlIGRvZXNuJ3QgY2hhbmdlIHRoZSBsZW5ndGggb2YgdGhlIHRleHQKLSAgICAgICAgICAgICAgICB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wID0gdGV4dDsKLSAgICAgICAgICAgICAgICB0bXBzdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIHRtcGVuZCA9IGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd29ya1BhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh3b3JrUGFpbnQuYmdDb2xvciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gd29ya1BhaW50LmdldENvbG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhaW50LlN0eWxlIHMgPSB3b3JrUGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKHdvcmtQYWludC5iZ0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldFN0eWxlKFBhaW50LlN0eWxlLkZJTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh4IC0gcmV0LCB0b3AsIHgsIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3b3JrUGFpbnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtQYWludC5zZXRTdHlsZShzKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LnNldENvbG9yKGMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB3b3JrUGFpbnQubWVhc3VyZVRleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQodG1wLCB0bXBzdGFydCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSArIHdvcmtQYWludC5iYXNlbGluZVNoaWZ0LCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh0bXAsIHRtcHN0YXJ0LCB0bXBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd29ya1BhaW50LmJhc2VsaW5lU2hpZnQsIHdvcmtQYWludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoICYmICFoYXZlV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gd29ya1BhaW50Lm1lYXN1cmVUZXh0KHRtcCwgdG1wc3RhcnQsIHRtcGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUKQotICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5kcmF3KGNhbnZhcywgdGV4dCwgc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gcmV0LCB0b3AsIHksIGJvdHRvbSwgd29ya1BhaW50KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LmRyYXcoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3b3JrUGFpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpciA9PSBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQpCi0gICAgICAgICAgICByZXR1cm4gLXJldDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlIHdpZHRocyBmb3IgYSB1bmlmb3JtIGxlZnQtdG8tcmlnaHQgcnVuIG9mIHRleHQgd2l0aAotICAgICAqIG5vIHN0eWxlIGNoYW5nZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgcnVuLiBJZiBhbnkgc3R5bGUgaXMgcmVwbGFjZW1lbnQKLSAgICAgKiB0ZXh0LCB0aGUgZmlyc3QgY2hhcmFjdGVyIHdpbGwgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVwbGFjZW1lbnQgYW5kIHRoZQotICAgICAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzIHdpbGwgZ2V0IGEgd2lkdGggb2YgMC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50LCB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgYSBwYWludCB0byBtb2RpZnk7IG9uIHJldHVybiB3aWxsIHJlZmxlY3QgdGhlIG9yaWdpbmFsCi0gICAgICogICAgICAgIHBhaW50IHBsdXMgdGhlIGVmZmVjdCBvZiBhbGwgc3BhbnMgb24gdGhlIHJ1bgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgcnVuCi0gICAgICogQHBhcmFtIGVuZCB0aGUgbGltaXQgb2YgdGhlIHJ1bgotICAgICAqIEBwYXJhbSB3aWR0aHMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZSB3aWR0aHMgb2YgdGhlIGNoYXJhY3RlcnMuIE11c3QKLSAgICAgKiAgICAgICAgYmUgYXQgbGVhc3QgYSBsYXJnZSBhcyAoZW5kIC0gc3RhcnQpLgotICAgICAqIEBwYXJhbSBmbWkgRm9udE1ldHJpY3MgaW5mb3JtYXRpb247IGNhbiBiZSBudWxsCi0gICAgICogQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiB3aWR0aHMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0V2lkdGhzKFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFubmVkIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gd2lkdGhzLCBQYWludC5Gb250TWV0cmljc0ludCBmbWkpIHsKLSAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgIHRleHQuZ2V0U3BhbnMoc3RhcnQsIGVuZCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLQkJUmVwbGFjZW1lbnRTcGFuIHJlcGxhY2VtZW50ID0gbnVsbDsKLSAgICAgICAgd29ya1BhaW50LnNldChwYWludCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tpXTsKLQkJCWlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7Ci0JCQkJcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGFuLnVwZGF0ZU1lYXN1cmVTdGF0ZSh3b3JrUGFpbnQpOwotCQkJfQotCQl9Ci0JCi0gICAgICAgIGludCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3b3JrUGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHdvcmtQYWludC5nZXRUZXh0V2lkdGhzKHRleHQsIHN0YXJ0LCBlbmQsIHdpZHRocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgd2lkID0gcmVwbGFjZW1lbnQuZ2V0U2l6ZSh3b3JrUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsIGZtaSk7Ci0KLSAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IHdpZDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgZW5kOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tpIC0gc3RhcnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyBhbmQvb3IgbWVhc3VyZXMgYSBkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLgotICAgICAqIFVubGlrZSB7QGxpbmsgI2RyYXdVbmlmb3JtUnVufSwgdGhpcyBjYW4gcmVuZGVyIHJ1bnMgdGhhdCBjcm9zcyBzdHlsZQotICAgICAqIGJvdW5kYXJpZXMuICBSZXR1cm5zIHRoZSBzaWduZWQgYWR2YW5jZSB3aWR0aCwgaWYgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogPHA+VGhlIHggcG9zaXRpb24gaXMgdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGV4dC4gSW4gYSByaWdodC10by1sZWZ0Ci0gICAgICogcGFyYWdyYXBoLCB0aGlzIHdpbGwgYmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0IHRvIGJlIGRyYXduLiBQYWludAotICAgICAqIHNob3VsZCBub3QgaGF2ZSBhbiBBbGlnbiB2YWx1ZSBvdGhlciB0aGFuIExFRlQgb3IgcG9zaXRpb25pbmcgd2lsbCBnZXQKLSAgICAgKiBjb25mdXNlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgb3B0aW1pemVzIGZvciB1bnN0eWxlZCB0ZXh0IGFuZCBzbyB3b3JrUGFpbnQgbWlnaHQgbm90IGJlCi0gICAgICogbW9kaWZpZWQgYnkgdGhpcyBjYWxsLgotICAgICAqCi0gICAgICogPHA+VGhlIHJldHVybmVkIGFkdmFuY2Ugd2lkdGggd2lsbCBiZSA8IDAgaWYgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBpcyByaWdodC10by1sZWZ0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGRyYXdEaXJlY3Rpb25hbFJ1bihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGJvb2xlYW4gcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotCi0gICAgICAgIC8vIFhYWDogSXQgbG9va3MgbGlrZSBhbGwgY2FsbHMgdG8gdGhpcyBBUEkgbWF0Y2ggZGlyIGFuZCBydW5Jc1J0bCwgc28KLSAgICAgICAgLy8gaGF2aW5nIGJvdGggcGFyYW1ldGVycyBpcyByZWR1bmRhbnQgYW5kIGNvbmZ1c2luZy4KLQotICAgICAgICAvLyBmYXN0IHBhdGggZm9yIHVuc3R5bGVkIHRleHQKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdG1wID0gVGV4dFV0aWxzLmdldFJldmVyc2UodGV4dCwgc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICAgICAgLy8gWFhYOiB0aGlzIGFzc3VtZXMgZ2V0UmV2ZXJzZSBkb2Vzbid0IHR3ZWFrIHRoZSBsZW5ndGggb2YKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGV4dAotICAgICAgICAgICAgICAgIGludCB0bXBlbmQgPSBlbmQgLSBzdGFydDsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCB8fCBuZWVkV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IHBhaW50Lm1lYXN1cmVUZXh0KHRtcCwgMCwgdG1wZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRtcCwgMCwgdG1wZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtIHJldCwgeSwgcGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmVlZFdpZHRoKQotICAgICAgICAgICAgICAgICAgICByZXQgPSBwYWludC5tZWFzdXJlVGV4dCh0ZXh0LCBzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYW52YXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZtaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFpbnQuZ2V0Rm9udE1ldHJpY3NJbnQoZm1pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldCAqIGRpcjsgICAvLyBMYXlvdXQuRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmxvYXQgb3ggPSB4OwotICAgICAgICBpbnQgbWluQXNjZW50ID0gMCwgbWF4RGVzY2VudCA9IDAsIG1pblRvcCA9IDAsIG1heEJvdHRvbSA9IDA7Ci0KLSAgICAgICAgU3Bhbm5lZCBzcCA9IChTcGFubmVkKSB0ZXh0OwotICAgICAgICBDbGFzczw/PiBkaXZpc2lvbjsKLQotICAgICAgICBpZiAoY2FudmFzID09IG51bGwpCi0gICAgICAgICAgICBkaXZpc2lvbiA9IE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlzaW9uID0gQ2hhcmFjdGVyU3R5bGUuY2xhc3M7Ci0KLSAgICAgICAgaW50IG5leHQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBzcC5uZXh0U3BhblRyYW5zaXRpb24oaSwgZW5kLCBkaXZpc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIFhYWDogaWYgZGlyIGFuZCBydW5Jc1J0bCB3ZXJlIG5vdCB0aGUgc2FtZSwgdGhpcyB3b3VsZCBkcmF3Ci0gICAgICAgICAgICAvLyBzcGFucyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGJ1dCBubyBvbmUgYXBwZWFycyB0byBjYWxsIGl0IHRoaXMKLSAgICAgICAgICAgIC8vIHdheS4KLSAgICAgICAgICAgIHggKz0gZHJhd1VuaWZvcm1SdW4oY2FudmFzLCBzcCwgaSwgbmV4dCwgZGlyLCBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBmbWksIHBhaW50LCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbmV4dCAhPSBlbmQpOwotCi0gICAgICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmFzY2VudCA8IG1pbkFzY2VudCkKLSAgICAgICAgICAgICAgICAgICAgbWluQXNjZW50ID0gZm1pLmFzY2VudDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmRlc2NlbnQgPiBtYXhEZXNjZW50KQotICAgICAgICAgICAgICAgICAgICBtYXhEZXNjZW50ID0gZm1pLmRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm1pLnRvcCA8IG1pblRvcCkKLSAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gZm1pLnRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZm1pLmJvdHRvbSA+IG1heEJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gZm1pLmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbWkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHBhaW50LmdldEZvbnRNZXRyaWNzSW50KGZtaSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZtaS5hc2NlbnQgPSBtaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgICAgZm1pLmRlc2NlbnQgPSBtYXhEZXNjZW50OwotICAgICAgICAgICAgICAgIGZtaS50b3AgPSBtaW5Ub3A7Ci0gICAgICAgICAgICAgICAgZm1pLmJvdHRvbSA9IG1heEJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4IC0gb3g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCBydW4gb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb3B0aW9uYWxseQotICAgICAqIHJldHVybnMgdGhlIHNpZ25lZCBhZHZhbmNlLiAgVW5saWtlIGRyYXdEaXJlY3Rpb25hbFJ1biwgdGhlIHBhcmFncmFwaAotICAgICAqIGRpcmVjdGlvbiBhbmQgcnVuIGRpcmVjdGlvbiBjYW4gYmUgZGlmZmVyZW50LgotICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZsb2F0IGRyYXdUZXh0KENhbnZhcyBjYW52YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgYm9vbGVhbiBydW5Jc1J0bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGludCB0b3AsIGludCB5LCBpbnQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFBhaW50IHdvcmtQYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZFdpZHRoKSB7Ci0gICAgICAgIC8vIFhYWCB0aGlzIGxvZ2ljIGlzIChkaXIgPT0gRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsCi0gICAgICAgIGlmICgoZGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCAmJiAhcnVuSXNSdGwpIHx8Ci0gICAgICAgICAgICAocnVuSXNSdGwgJiYgZGlyID09IExheW91dC5ESVJfTEVGVF9UT19SSUdIVCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbmVlZHMgdGhlIHJlYWwgZGlyZWN0aW9uCi0gICAgICAgICAgICBmbG9hdCBjaCA9IGRyYXdEaXJlY3Rpb25hbFJ1bihudWxsLCB0ZXh0LCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQsIGZhbHNlLCAwLCAwLCAwLCAwLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgY2ggKj0gZGlyOyAgLy8gRElSX1JJR0hUX1RPX0xFRlQgPT0gLTEKLSAgICAgICAgICAgIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIC1kaXIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bklzUnRsLCB4ICsgY2gsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgd29ya1BhaW50LCB0cnVlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRyYXdEaXJlY3Rpb25hbFJ1bihjYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIGRpciwgcnVuSXNSdGwsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCBudWxsLCBwYWludCwgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEcmF3cyBhIHJ1biBvZiB0ZXh0IG9uIGEgc2luZ2xlIGxpbmUsIHdpdGggaXRzCi0gICAgICogb3JpZ2luIGF0ICh4LHkpLCBpbiB0aGUgc3BlY2lmaWVkIFBhaW50LiBUaGUgb3JpZ2luIGlzIGludGVycHJldGVkIGJhc2VkCi0gICAgICogb24gdGhlIEFsaWduIHNldHRpbmcgaW4gdGhlIFBhaW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY29uc2lkZXJzIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0Ci0gICAgICogaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5Ci0gICAgICogZHJhd3MgdGhlIHRleHQpLiBTZWUgYWxzbwotICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNkcmF3VGV4dChDaGFyU2VxdWVuY2UsIGludCwgaW50LCBmbG9hdCwKLSAgICAgKiBmbG9hdCwgUGFpbnQpfSBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZHJhd1JlY3QoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsCi0gICAgICogUGFpbnQpfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSB0YXJnZXQgY2FudmFzCi0gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24KLSAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGV4dCB0byBkcmF3Ci0gICAgICogQHBhcmFtIGVuZCAoZW5kIC0gMSkgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0ZXh0IHRvIGRyYXcKLSAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHRleHQuIFRoaXMgbXVzdCBiZQotICAgICAqICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXh0LkxheW91dCNESVJfTEVGVF9UT19SSUdIVH0gb3IKLSAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudGV4dC5MYXlvdXQjRElSX1JJR0hUX1RPX0xFRlR9LgotICAgICAqIEBwYXJhbSB4IFRoZSB4LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSB5IFRoZSB5LWNvb3JkaW5hdGUgb2Ygb3JpZ2luIGZvciB3aGVyZSB0byBkcmF3IHRoZSB0ZXh0Ci0gICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIHNpZGUgb2YgdGhlIHJlY3RhbmdsZSB0byBiZSBkcmF3bgotICAgICAqIEBwYXJhbSBwYWludCBUaGUgbWFpbiB7QGxpbmsgVGV4dFBhaW50fSBvYmplY3QuCi0gICAgICogQHBhcmFtIHdvcmtQYWludCBUaGUge0BsaW5rIFRleHRQYWludH0gb2JqZWN0IHVzZWQgZm9yIHRlbXBvcmFsCi0gICAgICogICAgICAgIHdvcmtzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIElmIHRydWUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHdpZHRoIG9mIGRyYXduIHRleHQKLSAgICAgKiBAcmV0dXJuIFdpZHRoIG9mIHRoZSBkcmF3biB0ZXh0IGlmIG5lZWRXaWR0aCBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBkcmF3VGV4dChDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgewotICAgICAgICAvLyBGb3Igc2FmZXR5LgotICAgICAgICBkaXJlY3Rpb24gPSBkaXJlY3Rpb24gPj0gMCA/IExheW91dC5ESVJfTEVGVF9UT19SSUdIVAotICAgICAgICAgICAgICAgIDogTGF5b3V0LkRJUl9SSUdIVF9UT19MRUZUOwotCi0gICAgICAgIC8vIEhpZGUgcnVuSXNSdGwgcGFyYW1ldGVyIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlcm5hbAotICAgICAgICAvLyBkZXZlbG9wZXJzLgotICAgICAgICAvLyBYWFg6IHRoZSBydW5Jc1J0bCBwcm9iYWJseSBvdWdodCB0byBiZSB0aGUgc2FtZSBhcyBkaXJlY3Rpb24sIHRoZW4KLSAgICAgICAgLy8gdGhpcyBjb3VsZCBkcmF3IHJ0bCB0ZXh0LgotICAgICAgICByZXR1cm4gZHJhd1RleHQoY2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCBkaXJlY3Rpb24sIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeCwgdG9wLCB5LCBib3R0b20sIHBhaW50LCB3b3JrUGFpbnQsIG5lZWRXaWR0aCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgcnVuIG9mIGxlZnQtdG8tcmlnaHQgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLAotICAgICAqIGNvbnNpZGVyaW5nIHN0eWxlIGluZm9ybWF0aW9uIGluIHRoZSB0ZXh0IChlLmcuIGV2ZW4gd2hlbiB0ZXh0IGlzIGFuCi0gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQudGV4dC5TcGFubmVkfSwgdGhpcyBtZXRob2QgY29ycmVjdGx5IG1lYXN1cmVzCi0gICAgICogdGhlIHdpZHRoIG9mIHRoZSB0ZXh0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIG1haW4ge0BsaW5rIFRleHRQYWludH0gb2JqZWN0OyB3aWxsIG5vdCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSB3b3JrUGFpbnQgdGhlIHtAbGluayBUZXh0UGFpbnR9IG9iamVjdCBhdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbjsKLSAgICAgKiAgICAgICAgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgdXNlZAotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc3RhcnQgbWVhc3VyaW5nCi0gICAgICogQHBhcmFtIGVuZCAxIGJleW9uZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKLSAgICAgKiBAcGFyYW0gZm1pIEZvbnRNZXRyaWNzIGluZm9ybWF0aW9uOyBjYW4gYmUgbnVsbAotICAgICAqIEByZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmbG9hdCBtZWFzdXJlVGV4dChUZXh0UGFpbnQgcGFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgd29ya1BhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkZvbnRNZXRyaWNzSW50IGZtaSkgewotICAgICAgICByZXR1cm4gZHJhd0RpcmVjdGlvbmFsUnVuKG51bGwsIHRleHQsIHN0YXJ0LCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfTEVGVF9UT19SSUdIVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIGZtaSwgcGFpbnQsIHdvcmtQYWludCwgdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzQ4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGV4dDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Gb250TWV0cmljc0ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQuRGlyZWN0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuTGF5b3V0LlRhYlN0b3BzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuTWV0cmljQWZmZWN0aW5nU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuUmVwbGFjZW1lbnRTcGFuOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpbmUgb2Ygc3R5bGVkIHRleHQsIGZvciBtZWFzdXJpbmcgaW4gdmlzdWFsIG9yZGVyIGFuZAorICogZm9yIHJlbmRlcmluZy4KKyAqCisgKiA8cD5HZXQgYSBuZXcgaW5zdGFuY2UgdXNpbmcgb2J0YWluKCksIGFuZCB3aGVuIGZpbmlzaGVkIHdpdGggaXQsIHJldHVybiBpdAorICogdG8gdGhlIHBvb2wgdXNpbmcgcmVjeWNsZSgpLgorICoKKyAqIDxwPkNhbGwgc2V0IHRvIHByZXBhcmUgdGhlIGluc3RhbmNlIGZvciB1c2UsIHRoZW4gZWl0aGVyIGRyYXcsIG1lYXN1cmUsCisgKiBtZXRyaWNzLCBvciBjYXJldFRvTGVmdFJpZ2h0T2YuCisgKgorICogQGhpZGUKKyAqLworY2xhc3MgVGV4dExpbmUgeworICAgIHByaXZhdGUgVGV4dFBhaW50IG1QYWludDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGV4dDsKKyAgICBwcml2YXRlIGludCBtU3RhcnQ7CisgICAgcHJpdmF0ZSBpbnQgbUxlbjsKKyAgICBwcml2YXRlIGludCBtRGlyOworICAgIHByaXZhdGUgRGlyZWN0aW9ucyBtRGlyZWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc1RhYnM7CisgICAgcHJpdmF0ZSBUYWJTdG9wcyBtVGFiczsKKyAgICBwcml2YXRlIGNoYXJbXSBtQ2hhcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGFyc1ZhbGlkOworICAgIHByaXZhdGUgU3Bhbm5lZCBtU3Bhbm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFRleHRQYWludCBtV29ya1BhaW50ID0gbmV3IFRleHRQYWludCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgVGV4dExpbmVbXSBjYWNoZWQgPSBuZXcgVGV4dExpbmVbM107CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IFRleHRMaW5lIGZyb20gdGhlIHNoYXJlZCBwb29sLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB1bmluaXRpYWxpemVkIFRleHRMaW5lCisgICAgICovCisgICAgc3RhdGljIFRleHRMaW5lIG9idGFpbigpIHsKKyAgICAgICAgVGV4dExpbmUgdGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGVkKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gY2FjaGVkLmxlbmd0aDsgLS1pID49IDA7KSB7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFtpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRsID0gY2FjaGVkW2ldOworICAgICAgICAgICAgICAgICAgICBjYWNoZWRbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRsID0gbmV3IFRleHRMaW5lKCk7CisgICAgICAgIExvZy52KCJUTElORSIsICJuZXc6ICIgKyB0bCk7CisgICAgICAgIHJldHVybiB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgVGV4dExpbmUgYmFjayBpbnRvIHRoZSBzaGFyZWQgcG9vbC4gRG8gbm90IHVzZSB0aGlzIFRleHRMaW5lIG9uY2UKKyAgICAgKiBpdCBoYXMgYmVlbiByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdGwgdGhlIHRleHRMaW5lCisgICAgICogQHJldHVybiBudWxsLCBhcyBhIGNvbnZlbmllbmNlIGZyb20gY2xlYXJpbmcgcmVmZXJlbmNlcyB0byB0aGUgcHJvdmlkZWQKKyAgICAgKiBUZXh0TGluZQorICAgICAqLworICAgIHN0YXRpYyBUZXh0TGluZSByZWN5Y2xlKFRleHRMaW5lIHRsKSB7CisgICAgICAgIHRsLm1UZXh0ID0gbnVsbDsKKyAgICAgICAgdGwubVBhaW50ID0gbnVsbDsKKyAgICAgICAgdGwubURpcmVjdGlvbnMgPSBudWxsOworICAgICAgICBpZiAodGwubUxlbiA8IDI1MCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKGNhY2hlZCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkW2ldID0gdGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIFRleHRMaW5lIGFuZCBwcmVwYXJlcyBpdCBmb3IgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBiYXNlIHBhaW50IGZvciB0aGUgbGluZQorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0LCBjYW4gYmUgU3R5bGVkCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgbGluZSByZWxhdGl2ZSB0byB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbGltaXQgb2YgdGhlIGxpbmUgcmVsYXRpdmUgdG8gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBkaXJlY3Rpb25zIHRoZSBkaXJlY3Rpb25zIGluZm9ybWF0aW9uIG9mIHRoaXMgbGluZQorICAgICAqIEBwYXJhbSBoYXNUYWJzIHRydWUgaWYgdGhlIGxpbmUgbWlnaHQgY29udGFpbiB0YWJzIG9yIGVtb2ppCisgICAgICogQHBhcmFtIHRhYlN0b3BzIHRoZSB0YWJTdG9wcy4gQ2FuIGJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBzZXQoVGV4dFBhaW50IHBhaW50LCBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgbGltaXQsIGludCBkaXIsCisgICAgICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMsIGJvb2xlYW4gaGFzVGFicywgVGFiU3RvcHMgdGFiU3RvcHMpIHsKKyAgICAgICAgbVBhaW50ID0gcGFpbnQ7CisgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIG1MZW4gPSBsaW1pdCAtIHN0YXJ0OworICAgICAgICBtRGlyID0gZGlyOworICAgICAgICBtRGlyZWN0aW9ucyA9IGRpcmVjdGlvbnM7CisgICAgICAgIG1IYXNUYWJzID0gaGFzVGFiczsKKyAgICAgICAgbVNwYW5uZWQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaGFzUmVwbGFjZW1lbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmVkKSB7CisgICAgICAgICAgICBtU3Bhbm5lZCA9IChTcGFubmVkKSB0ZXh0OworICAgICAgICAgICAgaGFzUmVwbGFjZW1lbnQgPSBtU3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcykubGVuZ3RoID4gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1DaGFyc1ZhbGlkID0gaGFzUmVwbGFjZW1lbnQgfHwgaGFzVGFicyB8fAorICAgICAgICAgICAgZGlyZWN0aW9ucyAhPSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVDsKKworICAgICAgICBpZiAobUNoYXJzVmFsaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2hhcnMgPT0gbnVsbCB8fCBtQ2hhcnMubGVuZ3RoIDwgbUxlbikgeworICAgICAgICAgICAgICAgIG1DaGFycyA9IG5ldyBjaGFyW0FycmF5VXRpbHMuaWRlYWxDaGFyQXJyYXlTaXplKG1MZW4pXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgbGltaXQsIG1DaGFycywgMCk7CisgICAgICAgICAgICBpZiAoaGFzUmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlc2UgYWxsIGF0IG9uY2Ugc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhcyB3ZSBnby4KKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCByZXBsYWNlbWVudCBydW4gd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBvYmplY3QtcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluZGVyIHdpdGggemVybyB3aWR0aAorICAgICAgICAgICAgICAgIC8vIG5vbi1icmVhayBzcGFjZSBha2EgQk9NLiAgQ3Vyc29yIG1vdmVtZW50IGNvZGUgc2tpcHMgdGhlc2UKKyAgICAgICAgICAgICAgICAvLyB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gbUNoYXJzOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBsaW1pdDsgaSA9IGluZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGluZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VtZW50U3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3Bhbm5lZC5nZXRTcGFucyhpLCBpbmV4dCwgUmVwbGFjZW1lbnRTcGFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPiAwKSB7IC8vIHRyYW5zaXRpb24gaW50byBhIHNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2kgLSBzdGFydF0gPSAnXHVmZmZjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpIC0gc3RhcnQgKyAxLCBlID0gaW5leHQgLSBzdGFydDsgaiA8IGU7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gJ1x1ZmVmZic7IC8vIHVzZWQgYXMgWldOQlMsIG1hcmtzIHBvc2l0aW9ucyB0byBza2lwCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVRhYnMgPSB0YWJTdG9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBUZXh0TGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjYW52YXMgdG8gcmVuZGVyIG9uCisgICAgICogQHBhcmFtIHggdGhlIGxlYWRpbmcgbWFyZ2luIHBvc2l0aW9uCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICovCisgICAgdm9pZCBkcmF3KENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSkgeworICAgICAgICBpZiAoIW1IYXNUYWJzKSB7CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX0xFRlRfVE9fUklHSFQpIHsKKyAgICAgICAgICAgICAgICBkcmF3UnVuKGMsIDAsIDAsIG1MZW4sIGZhbHNlLCB4LCB0b3AsIHksIGJvdHRvbSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfUklHSFRfVE9fTEVGVCkgeworICAgICAgICAgICAgICAgIGRyYXdSdW4oYywgMCwgMCwgbUxlbiwgdHJ1ZSwgeCwgdG9wLCB5LCBib3R0b20sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBoID0gMDsKKyAgICAgICAgaW50W10gcnVucyA9IG1EaXJlY3Rpb25zLm1EaXJlY3Rpb25zOworICAgICAgICBSZWN0RiBlbW9qaVJlY3QgPSBudWxsOworCisgICAgICAgIGludCBsYXN0UnVuSW5kZXggPSBydW5zLmxlbmd0aCAtIDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gMikgeworICAgICAgICAgICAgaW50IHJ1blN0YXJ0ID0gcnVuc1tpXTsKKyAgICAgICAgICAgIGludCBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbaSsxXSAmIExheW91dC5SVU5fTEVOR1RIX01BU0spOworICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbUxlbikgeworICAgICAgICAgICAgICAgIHJ1bkxpbWl0ID0gbUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4gcnVuSXNSdGwgPSAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9SVExfRkxBRykgIT0gMDsKKworICAgICAgICAgICAgaW50IHNlZ3N0YXJ0ID0gcnVuU3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBqID0gbUhhc1RhYnMgPyBydW5TdGFydCA6IHJ1bkxpbWl0OyBqIDw9IHJ1bkxpbWl0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZXB0ID0gMDsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOworCisgICAgICAgICAgICAgICAgaWYgKG1IYXNUYWJzICYmIGogPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBtQ2hhcnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gMHhkODAwICYmIGNvZGVwdCA8IDB4ZGMwMCAmJiBqICsgMSA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcHQgPSBDaGFyYWN0ZXIuY29kZVBvaW50QXQobUNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoICs9IGRyYXdSdW4oYywgaSwgc2Vnc3RhcnQsIGosIHJ1bklzUnRsLCB4K2gsIHRvcCwgeSwgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gbGFzdFJ1bkluZGV4IHx8IGogIT0gbUxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gbURpciAqIG5leHRUYWIoaCAqIG1EaXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJtQXNjZW50ID0gYXNjZW50KGopOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYml0bWFwSGVpZ2h0ID0gYm0uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IC1ibUFzY2VudCAvIGJpdG1hcEhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gYm0uZ2V0V2lkdGgoKSAqIHNjYWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1vamlSZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppUmVjdC5zZXQoeCArIGgsIHkgKyBibUFzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArIGggKyB3aWR0aCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIGVtb2ppUmVjdCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vnc3RhcnQgPSBqICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG1ldHJpY3MgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgZm9udCBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgbGluZQorICAgICAqLworICAgIGZsb2F0IG1ldHJpY3MoRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIHJldHVybiBtZWFzdXJlKG1MZW4sIGZhbHNlLCBmbWkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb3NpdGlvbiBvbiB0aGUgbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGxpbmUtcmVsYXRpdmUgY2hhcmFjdGVyIG9mZnNldCwgYmV0d2VlbiAwIGFuZCB0aGUKKyAgICAgKiBsaW5lIGxlbmd0aCwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRyYWlsaW5nIHRydWUgdG8gbWVhc3VyZSB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgICogYmVmb3JlIG9mZnNldCwgZmFsc2UgdG8gbWVhc3VyZSB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSBjaGFyYWN0ZXIKKyAgICAgKiBhdCBvZmZzZXQuCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBjaGFyYWN0ZXIsIGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4gdG8gdGhlIHJlcXVlc3RlZAorICAgICAqIGNoYXJhY3RlciBlZGdlLgorICAgICAqLworICAgIGZsb2F0IG1lYXN1cmUoaW50IG9mZnNldCwgYm9vbGVhbiB0cmFpbGluZywgRm9udE1ldHJpY3NJbnQgZm1pKSB7CisgICAgICAgIGludCB0YXJnZXQgPSB0cmFpbGluZyA/IG9mZnNldCAtIDEgOiBvZmZzZXQ7CisgICAgICAgIGlmICh0YXJnZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGggPSAwOworCisgICAgICAgIGlmICghbUhhc1RhYnMpIHsKKyAgICAgICAgICAgIGlmIChtRGlyZWN0aW9ucyA9PSBMYXlvdXQuRElSU19BTExfTEVGVF9UT19SSUdIVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZWFzdXJlUnVuKDAsIDAsIG9mZnNldCwgbUxlbiwgZmFsc2UsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURpcmVjdGlvbnMgPT0gTGF5b3V0LkRJUlNfQUxMX1JJR0hUX1RPX0xFRlQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVhc3VyZVJ1bigwLCAwLCBvZmZzZXQsIG1MZW4sIHRydWUsIGZtaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGFyW10gY2hhcnMgPSBtQ2hhcnM7CisgICAgICAgIGludFtdIHJ1bnMgPSBtRGlyZWN0aW9ucy5tRGlyZWN0aW9uczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQgcnVuU3RhcnQgPSBydW5zW2ldOworICAgICAgICAgICAgaW50IHJ1bkxpbWl0ID0gcnVuU3RhcnQgKyAocnVuc1tpKzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAocnVuTGltaXQgPiBtTGVuKSB7CisgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBtTGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5zW2krMV0gJiBMYXlvdXQuUlVOX1JUTF9GTEFHKSAhPSAwOworCisgICAgICAgICAgICBpbnQgc2Vnc3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBtSGFzVGFicyA/IHJ1blN0YXJ0IDogcnVuTGltaXQ7IGogPD0gcnVuTGltaXQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCBjb2RlcHQgPSAwOworICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICBpZiAobUhhc1RhYnMgJiYgaiA8IHJ1bkxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVwdCA9IGNoYXJzW2pdOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXB0ID49IDB4ZDgwMCAmJiBjb2RlcHQgPCAweGRjMDAgJiYgaiArIDEgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXB0ID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KGNoYXJzLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlcHQgPj0gTGF5b3V0Lk1JTl9FTU9KSSAmJiBjb2RlcHQgPD0gTGF5b3V0Lk1BWF9FTU9KSSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gTGF5b3V0LkVNT0pJX0ZBQ1RPUlkuZ2V0Qml0bWFwRnJvbUFuZHJvaWRQdWEoY29kZXB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXB0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGogPT0gcnVuTGltaXQgfHwgY29kZXB0ID09ICdcdCcgfHwgYm0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluU2VnbWVudCA9IHRhcmdldCA+PSBzZWdzdGFydCAmJiB0YXJnZXQgPCBqOworCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IChtRGlyID09IExheW91dC5ESVJfUklHSFRfVE9fTEVGVCkgPT0gcnVuSXNSdGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQgJiYgYWR2YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggKz0gbWVhc3VyZVJ1bihpLCBzZWdzdGFydCwgb2Zmc2V0LCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBtZWFzdXJlUnVuKGksIHNlZ3N0YXJ0LCBqLCBqLCBydW5Jc1J0bCwgZm1pKTsKKyAgICAgICAgICAgICAgICAgICAgaCArPSBhZHZhbmNlID8gdyA6IC13OworCisgICAgICAgICAgICAgICAgICAgIGlmIChpblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICs9IG1lYXN1cmVSdW4oaSwgc2Vnc3RhcnQsIG9mZnNldCwgaiwgcnVuSXNSdGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwdCA9PSAnXHQnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtRGlyICogbmV4dFRhYihoICogbURpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibUFzY2VudCA9IGFzY2VudChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZCA9IGJtLmdldFdpZHRoKCkgKiAtYm1Bc2NlbnQgLyBibS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggKz0gbURpciAqIHdpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlZ3N0YXJ0ID0gaiArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYSB1bmlkaXJlY3Rpb25hbCAoYnV0IHBvc3NpYmx5IG11bHRpLXN0eWxlZCkgcnVuIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzIHRvIGRyYXcgb24KKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uYWwgcnVuCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0CisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0CisgICAgICogQHBhcmFtIHJ1bklzUnRsIHRydWUgaWYgdGhlIHJ1biBpcyByaWdodC10by1sZWZ0CisgICAgICogQHBhcmFtIHggdGhlIHBvc2l0aW9uIG9mIHRoZSBydW4gdGhhdCBpcyBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4sIGJhc2VkIG9uIHRoZSBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBkcmF3UnVuKENhbnZhcyBjLCBpbnQgcnVuSW5kZXgsIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksIGludCBib3R0b20sCisgICAgICAgICAgICBib29sZWFuIG5lZWRXaWR0aCkgeworCisgICAgICAgIGlmICgobURpciA9PSBMYXlvdXQuRElSX0xFRlRfVE9fUklHSFQpID09IHJ1bklzUnRsKSB7CisgICAgICAgICAgICBmbG9hdCB3ID0gLW1lYXN1cmVSdW4ocnVuSW5kZXgsIHN0YXJ0LCBsaW1pdCwgbGltaXQsIHJ1bklzUnRsLCBudWxsKTsKKyAgICAgICAgICAgIGhhbmRsZVJ1bihydW5JbmRleCwgc3RhcnQsIGxpbWl0LCBsaW1pdCwgcnVuSXNSdGwsIGMsIHggKyB3LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgbGltaXQsIGxpbWl0LCBydW5Jc1J0bCwgYywgeCwgdG9wLAorICAgICAgICAgICAgICAgIHksIGJvdHRvbSwgbnVsbCwgbmVlZFdpZHRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZWFzdXJlcyBhIHVuaWRpcmVjdGlvbmFsIChidXQgcG9zc2libHkgbXVsdGktc3R5bGVkKSBydW4gb2YgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5JbmRleCB0aGUgcnVuIGluZGV4CisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBsaW5lLXJlbGF0aXZlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgdG8gbWVhc3VyZSB0bywgYmV0d2VlbiBzdGFydCBhbmQgbGltaXQgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIGxpbWl0IHRoZSBsaW5lLXJlbGF0aXZlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3RlZAorICAgICAqIHJ1biwgY2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBydW4gdG8gdGhlIGxlYWRpbmcgZWRnZQorICAgICAqIG9mIHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0LCBiYXNlZCBvbiB0aGUgcnVuIChub3QgcGFyYWdyYXBoKSBkaXJlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1lYXN1cmVSdW4oaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsCisgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsIGJvb2xlYW4gcnVuSXNSdGwsIEZvbnRNZXRyaWNzSW50IGZtaSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUnVuKHJ1bkluZGV4LCBzdGFydCwgb2Zmc2V0LCBsaW1pdCwgcnVuSXNSdGwsIG51bGwsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgZm1pLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWxrIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGlzIGxpbmUsIHNraXBwaW5nIGNvbmp1bmN0cyBhbmQKKyAgICAgKiB6ZXJvLXdpZHRoIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSB3YWxrIHRoZSBjdXJzb3Igb2ZmIHRoZSBlbmRzIG9mIHRoZSBsaW5lCisgICAgICogc2luY2UgaXQgZG9lcyBub3Qga25vdyBhYm91dCBhbnkgc2hhcGluZyBvbiB0aGUgcHJldmlvdXMvZm9sbG93aW5nIGxpbmUKKyAgICAgKiB0aGF0IG1pZ2h0IGFmZmVjdCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBDYWxsZXJzIG11c3QgZWl0aGVyIGF2b2lkIHRoZXNlCisgICAgICogc2l0dWF0aW9ucyBvciBoYW5kbGUgdGhlIHJlc3VsdCBzcGVjaWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Vyc29yIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLCBiZXR3ZWVuIDAgYW5kIHRoZQorICAgICAqIGxlbmd0aCBvZiB0aGUgbGluZSwgaW5jbHVzaXZlCisgICAgICogQHBhcmFtIHRvTGVmdCB0cnVlIGlmIHRoZSBjYXJldCBpcyBtb3ZpbmcgdG8gdGhlIGxlZnQuCisgICAgICogQHJldHVybiB0aGUgbmV3IG9mZnNldC4gIElmIGl0IGlzIGxlc3MgdGhhbiAwIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIGxpbmUsIHRoZSBwcmV2aW91cy9mb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgZXhhbWluZWQgdG8gZ2V0IHRoZQorICAgICAqIGFjdHVhbCBvZmZzZXQuCisgICAgICovCisgICAgaW50IGdldE9mZnNldFRvTGVmdFJpZ2h0T2YoaW50IGN1cnNvciwgYm9vbGVhbiB0b0xlZnQpIHsKKyAgICAgICAgLy8gMSkgVGhlIGNhcmV0IG1hcmtzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgYSBjaGFyYWN0ZXIuIFRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gbG9naWNhbGx5IGJlZm9yZSBpdCBtaWdodCBiZSBvbiBhIGRpZmZlcmVudCBsZXZlbCwgYW5kIHRoZSBhY3RpdmUgY2FyZXQKKyAgICAgICAgLy8gcG9zaXRpb24gaXMgb24gdGhlIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuIElmIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIC8vIHdhcyB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLCB0aGUgY2FyZXQgaXMgb24gaXRzIHRyYWlsaW5nIGVkZ2UuCisgICAgICAgIC8vIDIpIFRha2UgdGhpcyBjaGFyYWN0ZXIvZWRnZSBhbmQgbW92ZSBpdCBpbiB0aGUgaW5kaWNhdGVkIGRpcmVjdGlvbi4KKyAgICAgICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBuZXcgY2hhcmFjdGVyIGFuZCBhIG5ldyBlZGdlLgorICAgICAgICAvLyAzKSBUaGlzIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHZpc3VhbGx5IGFkamFjZW50IGNoYXJhY3RlcnMuICBPbmUgb2YKKyAgICAgICAgLy8gdGhlc2UgbWlnaHQgYmUgYXQgYSBsb3dlciBsZXZlbC4gIFRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlCisgICAgICAgIC8vIGNoYXJhY3RlciBhdCB0aGUgbG93ZXIgbGV2ZWwuCisgICAgICAgIC8vIDQpIElmIHRoZSBhY3RpdmUgcG9zaXRpb24gaXMgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGNoYXJhY3RlciwKKyAgICAgICAgLy8gdGhlIG5ldyBjYXJldCBwb3NpdGlvbiBpcyB0aGUgZm9sbG93aW5nIGxvZ2ljYWwgY2hhcmFjdGVyLCBlbHNlIGl0CisgICAgICAgIC8vIGlzIHRoZSBjaGFyYWN0ZXIuCisKKyAgICAgICAgaW50IGxpbmVTdGFydCA9IDA7CisgICAgICAgIGludCBsaW5lRW5kID0gbUxlbjsKKyAgICAgICAgYm9vbGVhbiBwYXJhSXNSdGwgPSBtRGlyID09IC0xOworICAgICAgICBpbnRbXSBydW5zID0gbURpcmVjdGlvbnMubURpcmVjdGlvbnM7CisKKyAgICAgICAgaW50IHJ1bkluZGV4LCBydW5MZXZlbCA9IDAsIHJ1blN0YXJ0ID0gbGluZVN0YXJ0LCBydW5MaW1pdCA9IGxpbmVFbmQsIG5ld0NhcmV0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAoY3Vyc29yID09IGxpbmVTdGFydCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSAtMjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gbGluZUVuZCkgeworICAgICAgICAgICAgcnVuSW5kZXggPSBydW5zLmxlbmd0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBGaXJzdCwgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW4gY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHdpdGgKKyAgICAgICAgICAvLyB0aGUgYWN0aXZlIGNhcmV0LgorICAgICAgICAgIGZvciAocnVuSW5kZXggPSAwOyBydW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBydW5JbmRleCArPSAyKSB7CisgICAgICAgICAgICBydW5TdGFydCA9IGxpbmVTdGFydCArIHJ1bnNbcnVuSW5kZXhdOworICAgICAgICAgICAgaWYgKGN1cnNvciA+PSBydW5TdGFydCkgeworICAgICAgICAgICAgICBydW5MaW1pdCA9IHJ1blN0YXJ0ICsgKHJ1bnNbcnVuSW5kZXgrMV0gJiBMYXlvdXQuUlVOX0xFTkdUSF9NQVNLKTsKKyAgICAgICAgICAgICAgaWYgKHJ1bkxpbWl0ID4gbGluZUVuZCkgeworICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBsaW5lRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjdXJzb3IgPCBydW5MaW1pdCkgeworICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gKHJ1bnNbcnVuSW5kZXgrMV0gPj4+IExheW91dC5SVU5fTEVWRUxfU0hJRlQpICYKKyAgICAgICAgICAgICAgICAgICAgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gcnVuU3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYXJldCBpcyBvbiBhIHJ1biBib3VuZGFyeSwgc2VlIGlmIHdlIHNob3VsZAorICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWwgY2hhcmFjdGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICBpbnQgcHJldlJ1bkluZGV4LCBwcmV2UnVuTGV2ZWwsIHByZXZSdW5TdGFydCwgcHJldlJ1bkxpbWl0OworICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGN1cnNvciAtIDE7CisgICAgICAgICAgICAgICAgICBmb3IgKHByZXZSdW5JbmRleCA9IDA7IHByZXZSdW5JbmRleCA8IHJ1bnMubGVuZ3RoOyBwcmV2UnVuSW5kZXggKz0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmV2UnVuU3RhcnQgPSBsaW5lU3RhcnQgKyBydW5zW3ByZXZSdW5JbmRleF07CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcHJldlJ1blN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gcHJldlJ1blN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1bnNbcHJldlJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IHByZXZSdW5MaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJ1bkxldmVsID0gKHJ1bnNbcHJldlJ1bkluZGV4KzFdID4+PiBMYXlvdXQuUlVOX0xFVkVMX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgTGF5b3V0LlJVTl9MRVZFTF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZSdW5MZXZlbCA8IHJ1bkxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gbG9naWNhbGx5IHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5kZXggPSBwcmV2UnVuSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxldmVsID0gcHJldlJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydCA9IHByZXZSdW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGltaXQgPSBwcmV2UnVuTGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gY2FyZXQgbWlnaHQgYmUgPT0gbGluZUVuZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IGEgc3BhY2Ugb3IgcGFyYWdyYXBoCisgICAgICAgICAgLy8gc2VwYXJhdG9yIGFuZCBoYXMgYW4gYXNzb2NpYXRlZCBydW4sIGJ1dCBtaWdodCBiZSB0aGUgZW5kIG9mCisgICAgICAgICAgLy8gdGV4dCwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0LiAgSWYgdGhhdCBoYXBwZW5zLCB3ZSByYW4gb2ZmIHRoZQorICAgICAgICAgIC8vIGVuZCBvZiB0aGUgcnVuIGxpc3QsIGFuZCBydW5JbmRleCA9PSBydW5zLmxlbmd0aC4gIEluIHRoaXMgY2FzZSwKKyAgICAgICAgICAvLyB3ZSBhcmUgYXQgYSBydW4gYm91bmRhcnkgc28gd2Ugc2tpcCB0aGUgYmVsb3cgdGVzdC4KKyAgICAgICAgICBpZiAocnVuSW5kZXggIT0gcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCA9IChydW5MZXZlbCAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgICAgYm9vbGVhbiBhZHZhbmNlID0gdG9MZWZ0ID09IHJ1bklzUnRsOworICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IChhZHZhbmNlID8gcnVuTGltaXQgOiBydW5TdGFydCkgfHwgYWR2YW5jZSAhPSB0cmFpbGluZykgeworICAgICAgICAgICAgICAgICAgLy8gTW92aW5nIHdpdGhpbiBvciBpbnRvIHRoZSBydW4sIHNvIHdlIGNhbiBtb3ZlIGxvZ2ljYWxseS4KKyAgICAgICAgICAgICAgICAgIG5ld0NhcmV0ID0gZ2V0T2Zmc2V0QmVmb3JlQWZ0ZXIocnVuSW5kZXgsIHJ1blN0YXJ0LCBydW5MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSXNSdGwsIGN1cnNvciwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3IHBvc2l0aW9uIGlzIGludGVybmFsIHRvIHRoZSBydW4sIHdlJ3JlIGF0IHRoZSBzdHJvbmcKKyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGFscmVhZHkgc28gd2UncmUgZmluaXNoZWQuCisgICAgICAgICAgICAgICAgICBpZiAobmV3Q2FyZXQgIT0gKGFkdmFuY2UgPyBydW5MaW1pdCA6IHJ1blN0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdDYXJldDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5ld0NhcmV0IGlzIC0xLCB3ZSdyZSBzdGFydGluZyBhdCBhIHJ1biBib3VuZGFyeSBhbmQgY3Jvc3NpbmcKKyAgICAgICAgLy8gaW50byBhbm90aGVyIHJ1bi4gT3RoZXJ3aXNlIHdlJ3ZlIGFycml2ZWQgYXQgYSBydW4gYm91bmRhcnksIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhcmFjdGVyIHRvIGF0dGFjaCB0by4gIE5vdGUgd2UgbWlnaHQKKyAgICAgICAgLy8gbmVlZCB0byBydW4gdGhpcyB0d2ljZSwgaWYgd2UgY3Jvc3MgYSBydW4gYm91bmRhcnkgYW5kIGVuZCB1cCBhdAorICAgICAgICAvLyBhbm90aGVyIHJ1biBib3VuZGFyeS4KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBib29sZWFuIGFkdmFuY2UgPSB0b0xlZnQgPT0gcGFyYUlzUnRsOworICAgICAgICAgIGludCBvdGhlclJ1bkluZGV4ID0gcnVuSW5kZXggKyAoYWR2YW5jZSA/IDIgOiAtMik7CisgICAgICAgICAgaWYgKG90aGVyUnVuSW5kZXggPj0gMCAmJiBvdGhlclJ1bkluZGV4IDwgcnVucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvdGhlclJ1blN0YXJ0ID0gbGluZVN0YXJ0ICsgcnVuc1tvdGhlclJ1bkluZGV4XTsKKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxpbWl0ID0gb3RoZXJSdW5TdGFydCArCisgICAgICAgICAgICAocnVuc1tvdGhlclJ1bkluZGV4KzFdICYgTGF5b3V0LlJVTl9MRU5HVEhfTUFTSyk7CisgICAgICAgICAgICBpZiAob3RoZXJSdW5MaW1pdCA+IGxpbmVFbmQpIHsKKyAgICAgICAgICAgICAgICBvdGhlclJ1bkxpbWl0ID0gbGluZUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvdGhlclJ1bkxldmVsID0gKHJ1bnNbb3RoZXJSdW5JbmRleCsxXSA+Pj4gTGF5b3V0LlJVTl9MRVZFTF9TSElGVCkgJgorICAgICAgICAgICAgICAgIExheW91dC5SVU5fTEVWRUxfTUFTSzsKKyAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJSdW5Jc1J0bCA9IChvdGhlclJ1bkxldmVsICYgMSkgIT0gMDsKKworICAgICAgICAgICAgYWR2YW5jZSA9IHRvTGVmdCA9PSBvdGhlclJ1bklzUnRsOworICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBnZXRPZmZzZXRCZWZvcmVBZnRlcihvdGhlclJ1bkluZGV4LCBvdGhlclJ1blN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSdW5MaW1pdCwgb3RoZXJSdW5Jc1J0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPyBvdGhlclJ1blN0YXJ0IDogb3RoZXJSdW5MaW1pdCwgYWR2YW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcmV0ID09IChhZHZhbmNlID8gb3RoZXJSdW5MaW1pdCA6IG90aGVyUnVuU3RhcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENyb3NzZWQgYW5kIGVuZGVkIHVwIGF0IGEgbmV3IGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXQgYSBzZWNvbmQgYW5kIGZpbmFsIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIHJ1bkluZGV4ID0gb3RoZXJSdW5JbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcnVuTGV2ZWwgPSBvdGhlclJ1bkxldmVsOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBuZXcgY2FyZXQgaXMgYXQgYSBib3VuZGFyeS4KKyAgICAgICAgICAgIGlmIChvdGhlclJ1bkxldmVsIDwgcnVuTGV2ZWwpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHN0cm9uZyBjaGFyYWN0ZXIgaXMgaW4gdGhlIG90aGVyIHJ1bi4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gb3RoZXJSdW5TdGFydCA6IG90aGVyUnVuTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmV3Q2FyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UncmUgd2Fsa2luZyBvZmYgdGhlIGVuZCBvZiB0aGUgbGluZS4gIFRoZSBwYXJhZ3JhcGgKKyAgICAgICAgICAgICAgLy8gbGV2ZWwgaXMgYWx3YXlzIGVxdWFsIHRvIG9yIGxvd2VyIHRoYW4gYW55IGludGVybmFsIGxldmVsLCBzbworICAgICAgICAgICAgICAvLyB0aGUgYm91bmRhcmllcyBnZXQgdGhlIHN0cm9uZyBjYXJldC4KKyAgICAgICAgICAgICAgbmV3Q2FyZXQgPSBhZHZhbmNlID8gbUxlbiArIDEgOiAtMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gRWxzZSB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGF0J3MgYSBzdHJvbmcgcG9zaXRpb24uCisgICAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSBhcnJpdmVkIGhlcmUgYnkgY3Jvc3Npbmcgb3ZlciBhIHJ1biB3aXRoIG5vIGludGVybmFsCisgICAgICAgICAgLy8gYnJlYWtzIGFuZCBkcm9wcGluZyBvdXQgb2YgdGhlIGFib3ZlIGxvb3AgYmVmb3JlIGFkdmFuY2luZyBvbmUgZmluYWwKKyAgICAgICAgICAvLyB0aW1lLCBzbyByZXNldCB0aGUgY2FyZXQuCisgICAgICAgICAgLy8gTm90ZSwgd2UgdXNlICc8PScgYmVsb3cgdG8gaGFuZGxlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvbmx5IHJ1bgorICAgICAgICAgIC8vIG9uIHRoZSBsaW5lIGlzIGEgY291bnRlci1kaXJlY3Rpb25hbCBydW4uICBJZiB3ZSdyZSBub3QgYWR2YW5jaW5nLAorICAgICAgICAgIC8vIHdlIGNhbiBlbmQgdXAgYXQgdGhlICdsaW5lRW5kJyBwb3NpdGlvbiBidXQgdGhlIGNhcmV0IHdlIHdhbnQgaXMgYXQKKyAgICAgICAgICAvLyB0aGUgbGluZVN0YXJ0LgorICAgICAgICAgIGlmIChuZXdDYXJldCA8PSBsaW5lRW5kKSB7CisgICAgICAgICAgICAgIG5ld0NhcmV0ID0gYWR2YW5jZSA/IGxpbmVFbmQgOiBsaW5lU3RhcnQ7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0NhcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgdmFsaWQgb2Zmc2V0IHdpdGhpbiB0aGlzIGRpcmVjdGlvbmFsIHJ1biwgc2tpcHBpbmcKKyAgICAgKiBjb25qdW5jdHMgYW5kIHplcm8td2lkdGggY2hhcmFjdGVycy4gIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdG8gd2FsaworICAgICAqIG9mZiB0aGUgZW5kIG9mIHRoZSBsaW5lLCBzaW5jZSB0aGUgcmV0dXJuZWQgdmFsdWVzIG1pZ2h0IG5vdCBiZSB2YWxpZAorICAgICAqIG9uIG5laWdoYm9yaW5nIGxpbmVzLiAgSWYgdGhlIHJldHVybmVkIG9mZnNldCBpcyBsZXNzIHRoYW4gemVybyBvcgorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGUgbGluZSBsZW5ndGgsIHRoZSBvZmZzZXQgc2hvdWxkIGJlIHJlY29tcHV0ZWQgb24gdGhlCisgICAgICogcHJlY2VkaW5nIG9yIGZvbGxvd2luZyBsaW5lLCByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVuSW5kZXggdGhlIHJ1biBpbmRleAorICAgICAqIEBwYXJhbSBydW5TdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5MaW1pdCB0aGUgbGltaXQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBydW5Jc1J0bCB0cnVlIGlmIHRoZSBydW4gaXMgcmlnaHQtdG8tbGVmdAorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAorICAgICAqIEBwYXJhbSBhZnRlciB0cnVlIGlmIHRoZSBuZXcgb2Zmc2V0IHNob3VsZCBsb2dpY2FsbHkgZm9sbG93IHRoZSBwcm92aWRlZAorICAgICAqIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRPZmZzZXRCZWZvcmVBZnRlcihpbnQgcnVuSW5kZXgsIGludCBydW5TdGFydCwgaW50IHJ1bkxpbWl0LAorICAgICAgICAgICAgYm9vbGVhbiBydW5Jc1J0bCwgaW50IG9mZnNldCwgYm9vbGVhbiBhZnRlcikgeworCisgICAgICAgIGlmIChydW5JbmRleCA8IDAgfHwgb2Zmc2V0ID09IChhZnRlciA/IG1MZW4gOiAwKSkgeworICAgICAgICAgICAgLy8gV2Fsa2luZyBvZmYgZW5kIG9mIGxpbmUuICBTaW5jZSB3ZSBkb24ndCBrbm93CisgICAgICAgICAgICAvLyB3aGF0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBvdGhlciBsaW5lcywgd2UgY2FuJ3QKKyAgICAgICAgICAgIC8vIHJldHVybiBhY2N1cmF0ZSB2YWx1ZXMuICBUaGVzZSBhcmUgYSBndWVzcy4KKyAgICAgICAgICAgIGlmIChhZnRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZ2V0T2Zmc2V0QWZ0ZXIobVRleHQsIG9mZnNldCArIG1TdGFydCkgLSBtU3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gVGV4dFV0aWxzLmdldE9mZnNldEJlZm9yZShtVGV4dCwgb2Zmc2V0ICsgbVN0YXJ0KSAtIG1TdGFydDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRQYWludCB3cCA9IG1Xb3JrUGFpbnQ7CisgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgIGludCBzcGFuU3RhcnQgPSBydW5TdGFydDsKKyAgICAgICAgaW50IHNwYW5MaW1pdDsKKyAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHNwYW5MaW1pdCA9IHJ1bkxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRhcmdldCA9IGFmdGVyID8gb2Zmc2V0ICsgMSA6IG9mZnNldDsKKyAgICAgICAgICAgIGludCBsaW1pdCA9IG1TdGFydCArIHJ1bkxpbWl0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzcGFuTGltaXQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgc3BhblN0YXJ0LCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpIC0gbVN0YXJ0OworICAgICAgICAgICAgICAgIGlmIChzcGFuTGltaXQgPj0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGFuU3RhcnQgPSBzcGFuTGltaXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuID0gc3BhbnNbal07CisgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IChSZXBsYWNlbWVudFNwYW4pc3BhbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXBsYWNlbWVudCBzcGFuLCB3ZSdyZSBtb3ZpbmcgZWl0aGVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhpcyBzcGFuLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIgPyBzcGFuTGltaXQgOiBzcGFuU3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZsYWdzID0gcnVuSXNSdGwgPyBQYWludC5ESVJFQ1RJT05fUlRMIDogUGFpbnQuRElSRUNUSU9OX0xUUjsKKyAgICAgICAgaW50IGN1cnNvck9wdCA9IGFmdGVyID8gUGFpbnQuQ1VSU09SX0FGVEVSIDogUGFpbnQuQ1VSU09SX0JFRk9SRTsKKyAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICByZXR1cm4gd3AuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIHNwYW5TdGFydCwgc3BhbkxpbWl0IC0gc3BhblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdwLmdldFRleHRSdW5DdXJzb3IobVRleHQsIG1TdGFydCArIHNwYW5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgc3BhbkxpbWl0LCBmbGFncywgbVN0YXJ0ICsgb2Zmc2V0LCBjdXJzb3JPcHQpIC0gbVN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgbWVhc3VyaW5nIGFuZCByZW5kZXJpbmcgdGV4dC4gIFRoZSB0ZXh0IG11c3QKKyAgICAgKiBub3QgaW5jbHVkZSBhIHRhYiBvciBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cCB0aGUgd29ya2luZyBwYWludAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiByZW5kZXJpbmcgaXMgbm90IG5lZWRlZAorICAgICAqIEBwYXJhbSB4IHRoZSBlZGdlIG9mIHRoZSBydW4gY2xvc2VzdCB0byB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3Agb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gb2YgdGhlIGxpbmUKKyAgICAgKiBAcGFyYW0gZm1pIHJlY2VpdmVzIG1ldHJpY3MgaW5mb3JtYXRpb24sIGNhbiBiZSBudWxsCisgICAgICogQHBhcmFtIG5lZWRXaWR0aCB0cnVlIGlmIHRoZSB3aWR0aCBvZiB0aGUgcnVuIGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVRleHQoVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwKKyAgICAgICAgICAgIENhbnZhcyBjLCBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwKKyAgICAgICAgICAgIEZvbnRNZXRyaWNzSW50IGZtaSwgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCBydW5MZW4gPSBlbmQgLSBzdGFydDsKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpZiAobmVlZFdpZHRoIHx8IChjICE9IG51bGwgJiYgKHdwLmJnQ29sb3IgIT0gMCB8fCBydW5Jc1J0bCkpKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IFBhaW50LkRJUkVDVElPTl9SVEwgOiBQYWludC5ESVJFQ1RJT05fTFRSOworICAgICAgICAgICAgaWYgKG1DaGFyc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQsIHJ1bkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbiwgZmxhZ3MsIG51bGwsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBtU3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gd3AuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1UZXh0LCBkZWx0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKyBlbmQsIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbnVsbCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm1pICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdwLmdldEZvbnRNZXRyaWNzSW50KGZtaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocnVuSXNSdGwpIHsKKyAgICAgICAgICAgICAgICB4IC09IHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdwLmJnQ29sb3IgIT0gMCkgeworICAgICAgICAgICAgICAgIGludCBjb2xvciA9IHdwLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgUGFpbnQuU3R5bGUgcyA9IHdwLmdldFN0eWxlKCk7CisgICAgICAgICAgICAgICAgd3Auc2V0Q29sb3Iod3AuYmdDb2xvcik7CisgICAgICAgICAgICAgICAgd3Auc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgICAgICBjLmRyYXdSZWN0KHgsIHRvcCwgeCArIHJldCwgYm90dG9tLCB3cCk7CisKKyAgICAgICAgICAgICAgICB3cC5zZXRTdHlsZShzKTsKKyAgICAgICAgICAgICAgICB3cC5zZXRDb2xvcihjb2xvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYXdUZXh0UnVuKGMsIHdwLCBzdGFydCwgZW5kLCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHJ1bklzUnRsLAorICAgICAgICAgICAgICAgICAgICB4LCB5ICsgd3AuYmFzZWxpbmVTaGlmdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyBhbmQgcmVuZGVyaW5nIGEgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgdGhlIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIHdwIHRoZSB3b3JrIHBhaW50CisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbCBpZiBub3QgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIHggdGhlIGVkZ2Ugb2YgdGhlIHJlcGxhY2VtZW50IGNsb3Nlc3QgdG8gdGhlIGxlYWRpbmcgbWFyZ2luCisgICAgICogQHBhcmFtIHRvcCB0aGUgdG9wIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIHkgdGhlIGJhc2VsaW5lCisgICAgICogQHBhcmFtIGJvdHRvbSB0aGUgYm90dG9tIG9mIHRoZSBsaW5lCisgICAgICogQHBhcmFtIGZtaSByZWNlaXZlcyBtZXRyaWNzIGluZm9ybWF0aW9uLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSBuZWVkV2lkdGggdHJ1ZSBpZiB0aGUgd2lkdGggb2YgdGhlIHJlcGxhY2VtZW50IGlzIG5lZWRlZAorICAgICAqIEByZXR1cm4gdGhlIHNpZ25lZCB3aWR0aCBvZiB0aGUgcnVuIGJhc2VkIG9uIHRoZSBydW4gZGlyZWN0aW9uOyBvbmx5CisgICAgICogdmFsaWQgaWYgbmVlZFdpZHRoIGlzIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IGhhbmRsZVJlcGxhY2VtZW50KFJlcGxhY2VtZW50U3BhbiByZXBsYWNlbWVudCwgVGV4dFBhaW50IHdwLAorICAgICAgICAgICAgaW50IHJ1bkluZGV4LCBpbnQgc3RhcnQsIGludCBsaW1pdCwgYm9vbGVhbiBydW5Jc1J0bCwgQ2FudmFzIGMsCisgICAgICAgICAgICBmbG9hdCB4LCBpbnQgdG9wLCBpbnQgeSwgaW50IGJvdHRvbSwgRm9udE1ldHJpY3NJbnQgZm1pLAorICAgICAgICAgICAgYm9vbGVhbiBuZWVkV2lkdGgpIHsKKworICAgICAgICBmbG9hdCByZXQgPSAwOworCisgICAgICAgIGludCB0ZXh0U3RhcnQgPSBtU3RhcnQgKyBzdGFydDsKKyAgICAgICAgaW50IHRleHRMaW1pdCA9IG1TdGFydCArIGxpbWl0OworCisgICAgICAgIGlmIChuZWVkV2lkdGggfHwgKGMgIT0gbnVsbCAmJiBydW5Jc1J0bCkpIHsKKyAgICAgICAgICAgIHJldCA9IHJlcGxhY2VtZW50LmdldFNpemUod3AsIG1UZXh0LCB0ZXh0U3RhcnQsIHRleHRMaW1pdCwgZm1pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChydW5Jc1J0bCkgeworICAgICAgICAgICAgICAgIHggLT0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbGFjZW1lbnQuZHJhdyhjLCBtVGV4dCwgdGV4dFN0YXJ0LCB0ZXh0TGltaXQsCisgICAgICAgICAgICAgICAgICAgIHgsIHRvcCwgeSwgYm90dG9tLCB3cCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcnVuSXNSdGwgPyAtcmV0IDogcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGEgdW5pZGlyZWN0aW9uYWwgcnVuLiAgVGhlIHJ1biBtdXN0IG5vdAorICAgICAqIGNvbnRhaW4gdGFicyBvciBlbW9qaSBidXQgY2FuIGNvbnRhaW4gc3R5bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkluZGV4IHRoZSBydW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGxpbmUtcmVsYXRpdmUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBtZWFzdXJlTGltaXQgdGhlIG9mZnNldCB0byBtZWFzdXJlIHRvLCBiZXR3ZWVuIHN0YXJ0IGFuZCBsaW1pdCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzLCBjYW4gYmUgbnVsbAorICAgICAqIEBwYXJhbSB4IHRoZSBlbmQgb2YgdGhlIHJ1biBjbG9zZXN0IHRvIHRoZSBsZWFkaW5nIG1hcmdpbgorICAgICAqIEBwYXJhbSB0b3AgdGhlIHRvcCBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSB5IHRoZSBiYXNlbGluZQorICAgICAqIEBwYXJhbSBib3R0b20gdGhlIGJvdHRvbSBvZiB0aGUgbGluZQorICAgICAqIEBwYXJhbSBmbWkgcmVjZWl2ZXMgbWV0cmljcyBpbmZvcm1hdGlvbiwgY2FuIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZFdpZHRoIHRydWUgaWYgdGhlIHdpZHRoIGlzIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgc2lnbmVkIHdpZHRoIG9mIHRoZSBydW4gYmFzZWQgb24gdGhlIHJ1biBkaXJlY3Rpb247IG9ubHkKKyAgICAgKiB2YWxpZCBpZiBuZWVkV2lkdGggaXMgdHJ1ZQorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgaGFuZGxlUnVuKGludCBydW5JbmRleCwgaW50IHN0YXJ0LCBpbnQgbWVhc3VyZUxpbWl0LAorICAgICAgICAgICAgaW50IGxpbWl0LCBib29sZWFuIHJ1bklzUnRsLCBDYW52YXMgYywgZmxvYXQgeCwgaW50IHRvcCwgaW50IHksCisgICAgICAgICAgICBpbnQgYm90dG9tLCBGb250TWV0cmljc0ludCBmbWksIGJvb2xlYW4gbmVlZFdpZHRoKSB7CisKKyAgICAgICAgLy8gU2hhcGluZyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCBjb250ZXh0IHVwIHRvIG1ldHJpYyBib3VuZGFyaWVzLAorICAgICAgICAvLyBidXQgcmVuZGVyaW5nIG5lZWRzIHRvIHRha2UgaW50byBhY2NvdW50IGNoYXJhY3RlciBzdHlsZSBib3VuZGFyaWVzLgorICAgICAgICAvLyBTbyB3ZSBpdGVyYXRlIHRocm91Z2ggbWV0cmljIHJ1bnMgdG8gZ2V0IG1ldHJpYyBib3VuZHMsCisgICAgICAgIC8vIHRoZW4gd2l0aGluIGVhY2ggbWV0cmljIHJ1biBpdGVyYXRlIHRocm91Z2ggY2hhcmFjdGVyIHN0eWxlIHJ1bnMKKyAgICAgICAgLy8gZm9yIHRoZSBydW4gYm91bmRzLgorICAgICAgICBmbG9hdCBveCA9IHg7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgaW5leHQ7IGkgPCBtZWFzdXJlTGltaXQ7IGkgPSBpbmV4dCkgeworICAgICAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgICAgIHdwLnNldChtUGFpbnQpOworCisgICAgICAgICAgICBpbnQgbWxpbWl0OworICAgICAgICAgICAgaWYgKG1TcGFubmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmV4dCA9IGxpbWl0OworICAgICAgICAgICAgICAgIG1saW1pdCA9IG1lYXN1cmVMaW1pdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5leHQgPSBtU3Bhbm5lZC5uZXh0U3BhblRyYW5zaXRpb24obVN0YXJ0ICsgaSwgbVN0YXJ0ICsgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKSAtIG1TdGFydDsKKworICAgICAgICAgICAgICAgIG1saW1pdCA9IGluZXh0IDwgbWVhc3VyZUxpbWl0ID8gaW5leHQgOiBtZWFzdXJlTGltaXQ7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gbVNwYW5uZWQuZ2V0U3BhbnMobVN0YXJ0ICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCArIG1saW1pdCwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3BhbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBSZXBsYWNlbWVudFNwYW4gcmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNwYW5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuIHNwYW4gPSBzcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGFuIGluc3RhbmNlb2YgUmVwbGFjZW1lbnRTcGFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAoUmVwbGFjZW1lbnRTcGFuKXNwYW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYSByZXBsYWNlbWVudCB0aGF0IHVzZXMgdGhlIGRyYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSwgb3RoZXJ3aXNlIG1lYXN1cmUgc3RhdGUgd291bGQgc3VmZmljZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnVwZGF0ZURyYXdTdGF0ZSh3cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVSZXBsYWNlbWVudChyZXBsYWNlbWVudCwgd3AsIHJ1bkluZGV4LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbGltaXQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsIHksIGJvdHRvbSwgZm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkV2lkdGggfHwgbWxpbWl0IDwgbWVhc3VyZUxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCB8fCBjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IGhhbmRsZVRleHQod3AsIGksIG1saW1pdCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICB5LCBib3R0b20sIGZtaSwgbmVlZFdpZHRoIHx8IG1saW1pdCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLCBqbmV4dDsgaiA8IG1saW1pdDsgaiA9IGpuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGpuZXh0ID0gbVNwYW5uZWQubmV4dFNwYW5UcmFuc2l0aW9uKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgbWxpbWl0LCBDaGFyYWN0ZXJTdHlsZS5jbGFzcykgLSBtU3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGVbXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKG1TdGFydCArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ICsgam5leHQsIENoYXJhY3RlclN0eWxlLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICB3cC5zZXQobVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzcGFucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyU3R5bGUgc3BhbiA9IHNwYW5zW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi51cGRhdGVEcmF3U3RhdGUod3ApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgeCArPSBoYW5kbGVUZXh0KHdwLCBqLCBqbmV4dCwgaSwgaW5leHQsIHJ1bklzUnRsLCBjLCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwgeSwgYm90dG9tLCBmbWksIG5lZWRXaWR0aCB8fCBqbmV4dCA8IG1lYXN1cmVMaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHggLSBveDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSB0ZXh0IHJ1biB3aXRoIHRoZSBzZXQtdXAgcGFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgY2FudmFzCisgICAgICogQHBhcmFtIHdwIHRoZSBwYWludCB1c2VkIHRvIHJlbmRlciB0aGUgdGV4dAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcnVuCisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgY29udGV4dCBmb3IgdGhlIHJ1bgorICAgICAqIEBwYXJhbSBjb250ZXh0RW5kIHRoZSBlbmQgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSBydW4KKyAgICAgKiBAcGFyYW0gcnVuSXNSdGwgdHJ1ZSBpZiB0aGUgcnVuIGlzIHJpZ2h0LXRvLWxlZnQKKyAgICAgKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBydW4KKyAgICAgKiBAcGFyYW0geSB0aGUgYmFzZWxpbmUgb2YgdGhlIHJ1bgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgVGV4dFBhaW50IHdwLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgYm9vbGVhbiBydW5Jc1J0bCwgZmxvYXQgeCwgaW50IHkpIHsKKworICAgICAgICBpbnQgZmxhZ3MgPSBydW5Jc1J0bCA/IENhbnZhcy5ESVJFQ1RJT05fUlRMIDogQ2FudmFzLkRJUkVDVElPTl9MVFI7CisgICAgICAgIGlmIChtQ2hhcnNWYWxpZCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBpbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgIGMuZHJhd1RleHRSdW4obUNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgd3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhID0gbVN0YXJ0OworICAgICAgICAgICAgYy5kcmF3VGV4dFJ1bihtVGV4dCwgZGVsdGEgKyBzdGFydCwgZGVsdGEgKyBlbmQsCisgICAgICAgICAgICAgICAgICAgIGRlbHRhICsgY29udGV4dFN0YXJ0LCBkZWx0YSArIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCB3cCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQuICBUaGlzIGlzIHVzZWQgZm9yIHNjYWxpbmcKKyAgICAgKiBlbW9qaS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3MgdGhlIGxpbmUtcmVsYXRpdmUgcG9zaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBhc2NlbnQgb2YgdGhlIHRleHQgYXQgc3RhcnQKKyAgICAgKi8KKyAgICBmbG9hdCBhc2NlbnQoaW50IHBvcykgeworICAgICAgICBpZiAobVNwYW5uZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWludC5hc2NlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyArPSBtU3RhcnQ7CisgICAgICAgIE1ldHJpY0FmZmVjdGluZ1NwYW5bXSBzcGFucyA9IG1TcGFubmVkLmdldFNwYW5zKHBvcywgcG9zICsgMSwKKyAgICAgICAgICAgICAgICBNZXRyaWNBZmZlY3RpbmdTcGFuLmNsYXNzKTsKKyAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhaW50LmFzY2VudCgpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFBhaW50IHdwID0gbVdvcmtQYWludDsKKyAgICAgICAgd3Auc2V0KG1QYWludCk7CisgICAgICAgIGZvciAoTWV0cmljQWZmZWN0aW5nU3BhbiBzcGFuIDogc3BhbnMpIHsKKyAgICAgICAgICAgIHNwYW4udXBkYXRlTWVhc3VyZVN0YXRlKHdwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd3AuYXNjZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0YWIgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaCB0aGUgKHVuc2lnbmVkKSBvZmZzZXQgZnJvbSB0aGUgbGVhZGluZyBtYXJnaW4KKyAgICAgKiBAcmV0dXJuIHRoZSAodW5zaWduZWQpIHRhYiBwb3NpdGlvbiBhZnRlciB0aGlzIG9mZnNldAorICAgICAqLworICAgIGZsb2F0IG5leHRUYWIoZmxvYXQgaCkgeworICAgICAgICBpZiAobVRhYnMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UYWJzLm5leHRUYWIoaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRhYlN0b3BzLm5leHREZWZhdWx0U3RvcChoLCBUQUJfSU5DUkVNRU5UKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEFCX0lOQ1JFTUVOVCA9IDIwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dFV0aWxzLmphdmEKaW5kZXggODY3NWQwNS4uNzc0ODI2NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRVdGlscy5qYXZhCkBAIC0xNywxMiArMTcsMTEgQEAKIHBhY2thZ2UgYW5kcm9pZC50ZXh0OwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BYnNvbHV0ZVNpemVTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5BbGlnbm1lbnRTcGFuOwogaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5CYWNrZ3JvdW5kQ29sb3JTcGFuOwpAQCAtNDUsMTAgKzQ0LDggQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuUHJpbnRlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogcHVibGljIGNsYXNzIFRleHRVdGlscyB7CiAgICAgcHJpdmF0ZSBUZXh0VXRpbHMoKSB7IC8qIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8gfQpAQCAtOTgzLDcgKzk4MCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgdGV4dCBpZiBpdCBmaXRzIGluIHRoZSBzcGVjaWZpZWQgd2lkdGgKICAgICAgKiBnaXZlbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFBhaW50LAotICAgICAqIG9yLCBpZiBpdCBkb2VzIG5vdCBmaXQsIGEgY29weSB3aXRoIGVsbGlwc2lzIGNoYXJhY3RlciBhZGRlZCAKKyAgICAgKiBvciwgaWYgaXQgZG9lcyBub3QgZml0LCBhIGNvcHkgd2l0aCBlbGxpcHNpcyBjaGFyYWN0ZXIgYWRkZWQKICAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGVkZ2Ugb3IgY2VudGVyLgogICAgICAqIElmIDxjb2RlPnByZXNlcnZlTGVuZ3RoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm5lZCBjb3B5CiAgICAgICogd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvLXdpZHRoIHNwYWNlcyB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKQEAgLTk5Miw3ICs5ODksNyBAQAogICAgICAqIHJlcG9ydCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZWxsaXBzaXplZCByYW5nZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBlbGxpcHNpemUoQ2hhclNlcXVlbmNlIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRQYWludCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGF2YWlsLCBUcnVuY2F0ZUF0IHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpemVDYWxsYmFjayBjYWxsYmFjaykgewpAQCAtMTAwMywxMyArMTAwMCwxMiBAQAogCiAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgIC8vIFVzZSBQYWludC5icmVha1RleHQoKSBmb3IgdGhlIG5vbi1TcGFubmVkIGNhc2UgdG8gYXZvaWQgaGF2aW5nCi0gICAgICAgIC8vIHRvIGFsbG9jYXRlIG1lbW9yeSBhbmQgYWNjdW11bGF0ZSB0aGUgY2hhcmFjdGVyIHdpZHRocyBvdXJzZWx2ZXMuCisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gc2V0UGFyYShtdCwgcGFpbnQsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CiAKLSAgICAgICAgaWYgKCEodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpKSB7Ci0gICAgICAgICAgICBmbG9hdCB3aWQgPSBwLm1lYXN1cmVUZXh0KHRleHQsIDAsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmICh3aWQgPD0gYXZhaWwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8PSBhdmFpbCkgewogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAxNywyNTAgKzEwMTMsNjkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwLm1lYXN1cmVUZXh0KHNFbGxpcHNpcyk7CisgICAgICAgICAgICAvLyBYWFggYXNzdW1lcyBlbGxpcHNpcyBzdHJpbmcgZG9lcyBub3QgcmVxdWlyZSBzaGFwaW5nIGFuZAorICAgICAgICAgICAgLy8gaXMgdW5hZmZlY3RlZCBieSBzdHlsZQorICAgICAgICAgICAgZmxvYXQgZWxsaXBzaXN3aWQgPSBwYWludC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOworICAgICAgICAgICAgYXZhaWwgLT0gZWxsaXBzaXN3aWQ7CiAKLSAgICAgICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gb2J0YWluKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjeWNsZShidWYpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aGVyZSA9PSBUcnVuY2F0ZUF0LlNUQVJUKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBsZW4gLSBmaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgMCwgbGVuIC0gZml0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0VsbGlwc2lzICsgdGV4dC50b1N0cmluZygpLnN1YnN0cmluZyhsZW4gLSBmaXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxlZnQgPSAwOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIGl0IGFsbCBnb2VzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuU1RBUlQpIHsKKyAgICAgICAgICAgICAgICByaWdodCA9IGxlbiAtIG10LmJyZWFrVGV4dCgwLCBsZW4sIGZhbHNlLCBhdmFpbCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZpdCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwgLSBlbGxpcHNpc3dpZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsYW5rKHRleHQsIGZpdCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpLnN1YnN0cmluZygwLCBmaXQpICsgc0VsbGlwc2lzOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9IGVsc2UgLyogd2hlcmUgPT0gVHJ1bmNhdGVBdC5NSURETEUgKi8gewotICAgICAgICAgICAgICAgIGludCByaWdodCA9IHAuYnJlYWtUZXh0KHRleHQsIDAsIGxlbiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsIC0gZWxsaXBzaXN3aWQpIC8gMiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdXNlZCA9IHAubWVhc3VyZVRleHQodGV4dCwgbGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaW50IGxlZnQgPSBwLmJyZWFrVGV4dCh0ZXh0LCAwLCBsZW4gLSByaWdodCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsIC0gZWxsaXBzaXN3aWQgLSB1c2VkLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQobGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxhbmsodGV4dCwgbGVmdCwgbGVuIC0gcmlnaHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gdGV4dC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgbGVmdCkgKyBzRWxsaXBzaXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcobGVuIC0gcmlnaHQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQnV0IGRvIHRoZSBTcGFubmVkIGNhc2VzIGJ5IGhhbmQsIGJlY2F1c2UgaXQncyBzdWNoIGEgcGFpbgotICAgICAgICAvLyB0byBpdGVyYXRlIHRoZSBzcGFuIHRyYW5zaXRpb25zIGJhY2t3YXJkcyBhbmQgZ2V0VGV4dFdpZHRocygpCi0gICAgICAgIC8vIHdpbGwgZ2l2ZSB1cyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZC4KLQotICAgICAgICAvLyBnZXRUZXh0V2lkdGhzKCkgYWx3YXlzIHdyaXRlcyBpbnRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXksCi0gICAgICAgIC8vIHNvIG1lYXN1cmUgZWFjaCBzcGFuIGludG8gdGhlIGZpcnN0IGhhbGYgYW5kIHRoZW4gY29weSB0aGUKLSAgICAgICAgLy8gcmVzdWx0cyBpbnRvIHRoZSBzZWNvbmQgaGFsZiB0byB1c2UgbGF0ZXIuCi0KLSAgICAgICAgZmxvYXRbXSB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0gICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLQotICAgICAgICBpbnQgbmV4dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKGksIGxlbiwgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFN0eWxlZC5nZXRUZXh0V2lkdGhzKHAsIHRlbXBwYWludCwgc3AsIGksIG5leHQsIHdpZCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzdW0gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gKz0gd2lkW2xlbiArIGldOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1bSA8PSBhdmFpbCkgewotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5lbGxpcHNpemVkKDAsIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGVsbGlwc2lzd2lkID0gcC5tZWFzdXJlVGV4dChzRWxsaXBzaXMpOwotCi0gICAgICAgIGlmIChlbGxpcHNpc3dpZCA+IGF2YWlsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbGxiYWNrLmVsbGlwc2l6ZWQoMCwgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gJ1x1RkVGRic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcobmV3IFN0cmluZyhidWYsIDAsIGxlbikpOwotICAgICAgICAgICAgICAgIHJlY3ljbGUoYnVmKTsKLSAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiBzczsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgdHJ1ZSwgYXZhaWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2hlcmUgPT0gVHJ1bmNhdGVBdC5TVEFSVCkgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyBpIC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZCgwLCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZXNlcnZlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhibGFuayh0ZXh0LCAwLCBpKSk7Ci0gICAgICAgICAgICAgICAgY29weVNwYW5zRnJvbShzcCwgMCwgbGVuLCBPYmplY3QuY2xhc3MsIHNzLCAwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoc0VsbGlwc2lzKTsKLSAgICAgICAgICAgICAgICBvdXQuaW5zZXJ0KDEsIHRleHQsIGksIGxlbik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHdoZXJlID09IFRydW5jYXRlQXQuRU5EKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIHN1bSArIGVsbGlwc2lzd2lkID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3VtICs9IHc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChpLCBsZW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlc2VydmVMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmcgc3MgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nKGJsYW5rKHRleHQsIGksIGxlbikpOwotICAgICAgICAgICAgICAgIGNvcHlTcGFuc0Zyb20oc3AsIDAsIGxlbiwgT2JqZWN0LmNsYXNzLCBzcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKHNFbGxpcHNpcyk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydCgwLCB0ZXh0LCAwLCBpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSAvKiB3aGVyZSA9IFRydW5jYXRlQXQuTUlERExFICovIHsKLSAgICAgICAgICAgIGZsb2F0IGxzdW0gPSAwLCByc3VtID0gMDsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSBsZW47Ci0KLSAgICAgICAgICAgIGZsb2F0IHJhdmFpbCA9IChhdmFpbCAtIGVsbGlwc2lzd2lkKSAvIDI7Ci0gICAgICAgICAgICBmb3IgKHJpZ2h0ID0gbGVuOyByaWdodCA+PSAwOyByaWdodC0tKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdyA9IHdpZFtsZW4gKyByaWdodCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyByc3VtID4gcmF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJzdW0gKz0gdzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmxvYXQgbGF2YWlsID0gYXZhaWwgLSBlbGxpcHNpc3dpZCAtIHJzdW07Ci0gICAgICAgICAgICBmb3IgKGxlZnQgPSAwOyBsZWZ0IDwgcmlnaHQ7IGxlZnQrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IHcgPSB3aWRbbGVuICsgbGVmdF07Ci0KLSAgICAgICAgICAgICAgICBpZiAodyArIGxzdW0gPiBsYXZhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbHN1bSArPSB3OworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbGVuIC0gbXQuYnJlYWtUZXh0KDAsIGxlbiwgZmFsc2UsIGF2YWlsIC8gMik7CisgICAgICAgICAgICAgICAgYXZhaWwgLT0gbXQubWVhc3VyZShyaWdodCwgbGVuKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbXQuYnJlYWtUZXh0KDAsIHJpZ2h0LCB0cnVlLCBhdmFpbCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2FsbGJhY2suZWxsaXBzaXplZChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBtdC5tQ2hhcnM7CisgICAgICAgICAgICBTcGFubmVkIHNwID0gdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQgPyAoU3Bhbm5lZCkgdGV4dCA6IG51bGw7CisKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBsZW4gLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZyBzcyA9IG5ldyBTcGFubmFibGVTdHJpbmcoYmxhbmsodGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMCkgeyAvLyBlbHNlIGVsaW1pbmF0ZSB0aGUgZWxsaXBzaXMgdG9vCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZWZ0KytdID0gJ1x1MjAyNic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZWZ0OyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSAnXHVGRUZGJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nIHNzID0gbmV3IFNwYW5uYWJsZVN0cmluZyhzKTsKICAgICAgICAgICAgICAgICBjb3B5U3BhbnNGcm9tKHNwLCAwLCBsZW4sIE9iamVjdC5jbGFzcywgc3MsIDApOwogICAgICAgICAgICAgICAgIHJldHVybiBzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzRWxsaXBzaXMpOwotICAgICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgb3V0Lmluc2VydChvdXQubGVuZ3RoKCksIHRleHQsIHJpZ2h0LCBsZW4pOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBibGFuayhDaGFyU2VxdWVuY2Ugc291cmNlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgaW50IGxlbiA9IHNvdXJjZS5sZW5ndGgoKTsKLSAgICAgICAgY2hhcltdIGJ1ZiA9IG9idGFpbihsZW4pOwotCi0gICAgICAgIGlmIChzdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIDAsIHN0YXJ0LCBidWYsIDApOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmQgIT0gbGVuKSB7Ci0gICAgICAgICAgICBnZXRDaGFycyhzb3VyY2UsIGVuZCwgbGVuLCBidWYsIGVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBidWZbc3RhcnRdID0gJ1x1MjAyNic7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdcdUZFRkYnOworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgcmVjeWNsZShidWYpOwogCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihyZW1haW5pbmcgKyBzRWxsaXBzaXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIDAsIGxlZnQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzRWxsaXBzaXMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChidWYsIHJpZ2h0LCBsZW4gLSByaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3NiID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNzYi5hcHBlbmQodGV4dCwgMCwgbGVmdCk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHNFbGxpcHNpcyk7CisgICAgICAgICAgICBzc2IuYXBwZW5kKHRleHQsIHJpZ2h0LCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIHNzYjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3OCw4MCArMTA5MywxMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UGFpbnQgcCwgZmxvYXQgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uZU1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcmUpIHsKLSAgICAgICAgaW50IGxlbiA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltsZW5dOwotICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgMCwgbGVuLCBidWYsIDApOwogCi0gICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdFtdIHdpZDsKLQotICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFNwYW5uZWQpIHsKLSAgICAgICAgICAgIFNwYW5uZWQgc3AgPSAoU3Bhbm5lZCkgdGV4dDsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZW1wcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7Ci0gICAgICAgICAgICB3aWQgPSBuZXcgZmxvYXRbbGVuICogMl07Ci0KLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkgPSBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IHNwLm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgU3R5bGVkLmdldFRleHRXaWR0aHMocCwgdGVtcHBhaW50LCBzcCwgaSwgbmV4dCwgd2lkLCBudWxsKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHdpZCwgMCwgd2lkLCBsZW4gKyBpLCBuZXh0IC0gaSk7CisgICAgICAgIE1lYXN1cmVkVGV4dCBtdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBzZXRQYXJhKG10LCBwLCB0ZXh0LCAwLCBsZW4sIExheW91dC5ESVJfUkVRVUVTVF9ERUZBVUxUX0xUUik7CisgICAgICAgICAgICBpZiAod2lkdGggPD0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3aWQsIGxlbiwgd2lkLCAwLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2lkID0gbmV3IGZsb2F0W2xlbl07Ci0gICAgICAgICAgICBwLmdldFRleHRXaWR0aHModGV4dCwgMCwgbGVuLCB3aWQpOwotICAgICAgICB9CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbXQubUNoYXJzOwogCi0gICAgICAgIGludCBvayA9IDA7Ci0gICAgICAgIGludCBva1JlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOwotICAgICAgICBTdHJpbmcgb2tGb3JtYXQgPSAiIjsKLQotICAgICAgICBpbnQgdyA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgdyArPSB3aWRbaV07Ci0KLSAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjb21tYUNvdW50IC0gY291bnQgKyAxOwotICAgICAgICAgICAgICAgIGZsb2F0IG1vcmVXaWQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBvbmVNb3JlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIFN0cmluZy5mb3JtYXQobW9yZSwgcmVtYWluaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtb3JlV2lkID0gcC5tZWFzdXJlVGV4dChmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKHcgKyBtb3JlV2lkIDw9IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9rID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICBva0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgIGludCBjb21tYUNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBjb21tYUNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKHcgPD0gYXZhaWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGNvbW1hQ291bnQgKyAxOworCisgICAgICAgICAgICBpbnQgb2sgPSAwOworICAgICAgICAgICAgaW50IG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgU3RyaW5nIG9rRm9ybWF0ID0gIiI7CisKKyAgICAgICAgICAgIGludCB3ID0gMDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBmbG9hdFtdIHdpZHRocyA9IG10Lm1XaWR0aHM7CisKKyAgICAgICAgICAgIGludCByZXF1ZXN0ID0gbXQubURpciA9PSAxID8gTGF5b3V0LkRJUl9SRVFVRVNUX0xUUiA6CisgICAgICAgICAgICAgICAgTGF5b3V0LkRJUl9SRVFVRVNUX1JUTDsKKworICAgICAgICAgICAgTWVhc3VyZWRUZXh0IHRlbXBNdCA9IE1lYXN1cmVkVGV4dC5vYnRhaW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3ICs9IHdpZHRoc1tpXTsKKworICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCBub3QgaW5zZXJ0IHNwYWNlcywgc2hvdWxkIGJlIHBhcnQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFhYWCBzaG91bGQgdXNlIHBsdXJhbCBydWxlcyBhbmQgbm90IGFzc3VtZSBFbmdsaXNoIHBsdXJhbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIgIiArIG9uZU1vcmU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiICIgKyBTdHJpbmcuZm9ybWF0KG1vcmUsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBYWFggdGhpcyBpcyBwcm9iYWJseSBvaywgYnV0IG5lZWQgdG8gbG9vayBhdCBpdCBtb3JlCisgICAgICAgICAgICAgICAgICAgIHRlbXBNdC5zZXRQYXJhKGZvcm1hdCwgMCwgZm9ybWF0Lmxlbmd0aCgpLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgbW9yZVdpZCA9IG10LmFkZFN0eWxlUnVuKHAsIG10Lm1MZW4sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3ICsgbW9yZVdpZCA8PSBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rUmVtYWluaW5nID0gcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2tGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWFzdXJlZFRleHQucmVjeWNsZSh0ZW1wTXQpOworCiAgICAgICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG9rRm9ybWF0KTsKICAgICAgICAgICAgIG91dC5pbnNlcnQoMCwgdGV4dCwgMCwgb2spOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIE1lYXN1cmVkVGV4dC5yZWN5Y2xlKG10KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNldFBhcmEoTWVhc3VyZWRUZXh0IG10LCBUZXh0UGFpbnQgcGFpbnQsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgYmlkaVJlcXVlc3QpIHsKKworICAgICAgICBtdC5zZXRQYXJhKHRleHQsIHN0YXJ0LCBlbmQsIGJpZGlSZXF1ZXN0KTsKKworICAgICAgICBmbG9hdCB3aWR0aDsKKyAgICAgICAgU3Bhbm5lZCBzcCA9IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkID8gKFNwYW5uZWQpIHRleHQgOiBudWxsOworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGlmIChzcCA9PSBudWxsKSB7CisgICAgICAgICAgICB3aWR0aCA9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBsZW4sIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaW50IHNwYW5FbmQ7CisgICAgICAgICAgICBmb3IgKGludCBzcGFuU3RhcnQgPSAwOyBzcGFuU3RhcnQgPCBsZW47IHNwYW5TdGFydCA9IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHNwYW5TdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgTWV0cmljQWZmZWN0aW5nU3BhbltdIHNwYW5zID0gc3AuZ2V0U3BhbnMoCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnQsIHNwYW5FbmQsIE1ldHJpY0FmZmVjdGluZ1NwYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIHdpZHRoICs9IG10LmFkZFN0eWxlUnVuKHBhaW50LCBzcGFucywgc3BhbkVuZCAtIHNwYW5TdGFydCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9SSUdIVF9UT19MRUZUID0gJ1x1MDU5MCc7CisKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIGJvb2xlYW4gZG9lc05vdE5lZWRCaWRpKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkb2VzTm90TmVlZEJpZGkoY2hhcltdIHRleHQsIGludCBzdGFydCwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBpICsgbGVuOyBpIDwgZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGV4dFtpXSA+PSBGSVJTVF9SSUdIVF9UT19MRUZUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwogICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNoYXJbXSBvYnRhaW4oaW50IGxlbikgewogICAgICAgICBjaGFyW10gYnVmOwogCkBAIC0xNTI5LDcgKzEzODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX0NIQVJBQ1RFUlMKICAgICAgICAgICAgID0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX0NBUF9DSEFSQUNURVJTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogQ2FwaXRhbGl6YXRpb24gbW9kZSBmb3Ige0BsaW5rICNnZXRDYXBzTW9kZX06IGNhcGl0YWxpemUgdGhlIGZpcnN0CiAgICAgICogY2hhcmFjdGVyIG9mIGFsbCB3b3Jkcy4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTM3LDcgKzEzOTMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBUF9NT0RFX1dPUkRTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfV09SRFM7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBDYXBpdGFsaXphdGlvbiBtb2RlIGZvciB7QGxpbmsgI2dldENhcHNNb2RlfTogY2FwaXRhbGl6ZSB0aGUgZmlyc3QKICAgICAgKiBjaGFyYWN0ZXIgb2YgZWFjaCBzZW50ZW5jZS4gIFRoaXMgdmFsdWUgaXMgZXhwbGljaXRseSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzCkBAIC0xNTQ1LDEzICsxNDAxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FQX01PREVfU0VOVEVOQ0VTCiAgICAgICAgICAgICA9IElucHV0VHlwZS5UWVBFX1RFWFRfRkxBR19DQVBfU0VOVEVOQ0VTOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoYXQgY2FwcyBtb2RlIHNob3VsZCBiZSBpbiBlZmZlY3QgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0IGluCiAgICAgICogdGhlIHRleHQuICBPbmx5IHRoZSBtb2RlIGJpdHMgc2V0IGluIDx2YXI+cmVxTW9kZXM8L3Zhcj4gd2lsbCBiZQogICAgICAqIGNoZWNrZWQuICBOb3RlIHRoYXQgdGhlIGNhcHMgbW9kZSBmbGFncyBoZXJlIGFyZSBleHBsaWNpdGx5IGRlZmluZWQKICAgICAgKiB0byBtYXRjaCB0aG9zZSBpbiB7QGxpbmsgSW5wdXRUeXBlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjcyBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBjYXBzIG1vZGVzLgogICAgICAqIEBwYXJhbSBvZmYgTG9jYXRpb24gaW4gdGhlIHRleHQgYXQgd2hpY2ggdG8gY2hlY2suCiAgICAgICogQHBhcmFtIHJlcU1vZGVzIFRoZSBtb2RlcyB0byBiZSBjaGVja2VkOiBtYXkgYmUgYW55IGNvbWJpbmF0aW9uIG9mCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvVG91Y2guamF2YQppbmRleCBhMTlhNzhlLi4zYjk4ZmMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Ub3VjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvbWV0aG9kL1RvdWNoLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgaW50IGxlZnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgaW50IHJpZ2h0ID0gMDsKICAgICAgICAgQWxpZ25tZW50IGEgPSBudWxsOworICAgICAgICBib29sZWFuIGx0ciA9IHRydWU7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHRvcDsgaSA8PSBib3R0b207IGkrKykgewogICAgICAgICAgICAgbGVmdCA9IChpbnQpIE1hdGgubWluKGxlZnQsIGxheW91dC5nZXRMaW5lTGVmdChpKSk7CkBAIC01MSw2ICs1Miw3IEBACiAKICAgICAgICAgICAgIGlmIChhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBhID0gbGF5b3V0LmdldFBhcmFncmFwaEFsaWdubWVudChpKTsKKyAgICAgICAgICAgICAgICBsdHIgPSBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGkpID4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC01OCwxMCArNjAsMTIgQEAKICAgICAgICAgaW50IHdpZHRoID0gd2lkZ2V0LmdldFdpZHRoKCk7CiAgICAgICAgIGludCBkaWZmID0gMDsKIAorICAgICAgICAvLyBhbGlnbl9vcHBvc2l0ZSBkb2VzIE5PVCBtZWFuIGFsaWduX3JpZ2h0LCB3ZSBuZWVkIHRoZSBwYXJhZ3JhcGgKKyAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlc29sdmUgaXQgdG8gbGVmdCBvciByaWdodAogICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDwgd2lkdGggLSBwYWRkaW5nKSB7CiAgICAgICAgICAgICBpZiAoYSA9PSBBbGlnbm1lbnQuQUxJR05fQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICAgZGlmZiA9ICh3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KSkgLyAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IEFsaWdubWVudC5BTElHTl9PUFBPU0lURSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChsdHIgPT0gKGEgPT0gQWxpZ25tZW50LkFMSUdOX09QUE9TSVRFKSkgewogICAgICAgICAgICAgICAgIGRpZmYgPSB3aWR0aCAtIHBhZGRpbmcgLSAocmlnaHQgLSBsZWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRFeGNlcHRpb24uamF2YQppbmRleCBhNzY3ZWExLi5kZmUwMGM5YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkRXhjZXB0aW9uLmphdmEKQEAgLTI3LDYgKzI3LDEwIEBACiAgICAgICAgIHN1cGVyKG5hbWUpOwogICAgIH0KIAorICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKFN0cmluZyBuYW1lLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2F1c2UpOworICAgIH0KKwogICAgIHB1YmxpYyBBbmRyb2lkRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDRlZDE3YmNkLi4yYjgyNGJmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0FuZHJvaWRSdW50aW1lRXhjZXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9BbmRyb2lkUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0yNyw2ICsyNywxMCBAQAogICAgICAgICBzdXBlcihuYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG5hbWUsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihuYW1lLCBjYXVzZSk7CisgICAgfQorCiAgICAgcHVibGljIEFuZHJvaWRSdW50aW1lRXhjZXB0aW9uKEV4Y2VwdGlvbiBjYXVzZSkgewogICAgICAgICBzdXBlcihjYXVzZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvQ2hhcnNldFV0aWxzLmphdmEKaW5kZXggOWQ5MWFjYS4uYTc2M2E2OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DaGFyc2V0VXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NoYXJzZXRVdGlscy5qYXZhCkBAIC0xNywzNiArMTcsNTggQEAKIHBhY2thZ2UgYW5kcm9pZC51dGlsOwogCiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgorICogPHA+CiAgKiBBIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIHNldHMuIFRoaXMKICAqIGNsYXNzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGNvZGUgdGhhdCB3aXNoZXMgdG8gYmUgdmVuZG9yLWF3YXJlCi0gKiBpbiBpdHMgaW50ZXJwcmV0YXRpb24gb2YgSmFwYW5lc2UgZW5jb2RpbmcgbmFtZXMuCi0gKiAKLSAqIDxwPkFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgdmVuZG9yIHRoYXQgaXMgcmVjb2duaXplZCBieSB0aGlzCi0gKiBjbGFzcyBpcyBEb2NvbW8gKGlkZW50aWZpZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGFzIHtAY29kZSAiZG9jb21vIn0pLjwvcD4KLSAqIAotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgaXMgaGlkZGVuIGluIEN1cGNha2UsIHdpdGggYSBwbGFuIHRvCi0gKiB1bi1oaWRlIGluIERvbnV0LiBUaGlzIHdhcyBkb25lIGJlY2F1c2UgdGhlIGZpcnN0IGRlcGxveW1lbnQgdG8gdXNlCi0gKiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gQ3VwY2FrZSwgYnV0IHRoZSBBUEkgaGFkIHRvIGJlIGludHJvZHVjZWQKLSAqIGFmdGVyIHRoZSBwdWJsaWMgQVBJIGZyZWV6ZSBmb3IgdGhhdCByZWxlYXNlLiBUaGUgdXBzaG90IGlzIHRoYXQKLSAqIG9ubHkgc3lzdGVtIGFwcGxpY2F0aW9ucyBjYW4gc2FmZWx5IHVzZSB0aGlzIGNsYXNzIHVudGlsIERvbnV0IGlzCi0gKiBhdmFpbGFibGUuCi0gKiAKKyAqIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBKYXBhbmVzZSBjaGFyc2V0IG5hbWVzICh1c2VkIGluIERvQ29NbywKKyAqIEtEREksIGFuZCBTb2Z0QmFuaykuCisgKiA8L3A+CisgKgorICogPHA+CisgKiA8Yj5Ob3RlOjwvYj4gRGV2ZWxvcGVycyB3aWxsIG5lZWQgdG8gYWRkIGFuIGFwcHJvcHJpYXRlIG1hcHBpbmcgZm9yCisgKiBlYWNoIHZlbmRvci1zcGVjaWZpYyBjaGFyc2V0LiBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoZSBDIGxpYnJhcmllcworICogbGlrZSBpY3U0YyBpbiBvcmRlciB0byBsZXQgQW5kcm9pZCBzdXBwb3J0IGFuIGFkZGl0aW9uYWwgY2hhcnNldC4KKyAqIDwvcD4KKyAqCiAgKiBAaGlkZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ2hhcnNldFV0aWxzIHsKICAgICAvKioKLSAgICAgKiBuYW1lIG9mIHRoZSB2ZW5kb3IgIkRvY29tbyIuIDxiPk5vdGU6PC9iPiBUaGlzIGlzbid0IGEgcHVibGljCisgICAgICogbmFtZSBvZiB0aGUgdmVuZG9yICJEb0NvTW8iLiA8Yj5Ob3RlOjwvYj4gVGhpcyBpc24ndCBhIHB1YmxpYwogICAgICAqIGNvbnN0YW50LCBpbiBvcmRlciB0byBrZWVwIHRoaXMgY2xhc3MgZnJvbSBiZWNvbWluZyBhIGRlIGZhY3RvCiAgICAgICogcmVmZXJlbmNlIGxpc3Qgb2YgdmVuZG9yIG5hbWVzLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRU5ET1JfRE9DT01PID0gImRvY29tbyI7Ci0gICAgCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJLRERJIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX0tEREkgPSAia2RkaSI7CisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdmVuZG9yICJTb2Z0QmFuayIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFTkRPUl9TT0ZUQkFOSyA9ICJzb2Z0YmFuayI7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIG9uZS10by1vbmUgbWFwcGluZyBmcm9tIGEgdmVuZG9yIG5hbWUgdG8gYSBjaGFyc2V0IHNwZWNpZmljIHRvIHRoZSB2ZW5kb3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzVmVuZG9yU2hpZnRKaXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIFRoZXNlIHZhcmlhbnRzIG9mIFNoaWZ0X0pJUyBjb21lIGZyb20gaWN1J3MgbWFwcGluZyBkYXRhIChjb252cnRycy50eHQpCisgICAgICAgIHNWZW5kb3JTaGlmdEppc01hcC5wdXQoVkVORE9SX0RPQ09NTywgImRvY29tby1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9LRERJLCAia2RkaS1zaGlmdF9qaXMtMjAwNyIpOworICAgICAgICBzVmVuZG9yU2hpZnRKaXNNYXAucHV0KFZFTkRPUl9TT0ZUQkFOSywgInNvZnRiYW5rLXNoaWZ0X2ppcy0yMDA3Iik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1bmluc3RhbnRpYWJsZS4KICAgICAgKi8KQEAgLTU4LDIwICs4MCwyMiBAQAogICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBjaGFyYWN0ZXIgc2V0CiAgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gb3JpZ2luYWwgY2hhcmFjdGVyIHNldCBuYW1lIGFuZAogICAgICAqIHZlbmRvci4gSWYgdGhlcmUgaXMgbm8gdmVuZG9yLXNwZWNpZmljIGNoYXJhY3RlciBzZXQgZm9yIHRoZQotICAgICAqIGdpdmVuIG5hbWUvdmVuZG9yIHBhaXIsIHRoaXMgcmV0dXJucyB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyIHNldAotICAgICAqIG5hbWUuIFRoZSB2ZW5kb3IgbmFtZSBpcyBtYXRjaGVkIGNhc2UtaW5zZW5zaXRpdmVseS4KLSAgICAgKiAKKyAgICAgKiBnaXZlbiBuYW1lL3ZlbmRvciBwYWlyLCB0aGlzIHJldHVybnMgdGhlIG9yaWdpbmFsIGNoYXJhY3RlciBzZXQgbmFtZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSB0aGUgYmFzZSBjaGFyYWN0ZXIgc2V0IG5hbWUKLSAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IKKyAgICAgKiBAcGFyYW0gdmVuZG9yIHRoZSB2ZW5kb3IgdG8gc3BlY2lhbGl6ZSBmb3IuIEFsbCBjaGFyYWN0ZXJzIHNob3VsZCBiZSBsb3dlci1jYXNlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWFsaXplZCBjaGFyYWN0ZXIgc2V0IG5hbWUsIG9yIHtAY29kZSBjaGFyc2V0TmFtZX0gaWYKICAgICAgKiB0aGVyZSBpcyBubyBzcGVjaWFsaXplZCBuYW1lCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUZvclZlbmRvcihTdHJpbmcgY2hhcnNldE5hbWUsIFN0cmluZyB2ZW5kb3IpIHsKLSAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSwgdGhpcyBtYXkgd2FudCB0byBiZSB0YWJsZS1kcml2ZW4uCi0KLSAgICAgICAgaWYgKHZlbmRvci5lcXVhbHNJZ25vcmVDYXNlKFZFTkRPUl9ET0NPTU8pCi0gICAgICAgICAgICAgICAgJiYgaXNTaGlmdEppcyhjaGFyc2V0TmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAiZG9jb21vLXNoaWZ0X2ppcy0yMDA3IjsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0TmFtZSkgJiYgIVRleHRVdGlscy5pc0VtcHR5KHZlbmRvcikpIHsKKyAgICAgICAgICAgIC8vIFlvdSBjYW4gYWRkIHlvdXIgb3duIG1hcHBpbmcgaGVyZS4KKyAgICAgICAgICAgIGlmIChpc1NoaWZ0SmlzKGNoYXJzZXROYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZW5kb3JTaGlmdEppcyA9IHNWZW5kb3JTaGlmdEppc01hcC5nZXQodmVuZG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodmVuZG9yU2hpZnRKaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVuZG9yU2hpZnRKaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNoYXJzZXROYW1lOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GaW5hbGl6ZXJzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ZpbmFsaXplcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzFmMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GaW5hbGl6ZXJzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuUGhhbnRvbVJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOworCisvKioKKyAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHJlbGlhYmxlIGZpbmFsaXplcnMuCisgKiAKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaW5hbGl6ZXJzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaW5hbGl6ZXJzIjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBzTG9jayA9IG5ldyBPYmplY3RbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSW5pdDsKKyAgICBwcml2YXRlIHN0YXRpYyBSZWNsYWltZXIgc1JlY2xhaW1lcjsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzIG9mIFBoYW50b21SZWZlcmVuY2UgdXNlZCB0byByZWNsYWltIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJlY2xhaW1hYmxlUmVmZXJlbmNlPFQ+IGV4dGVuZHMgUGhhbnRvbVJlZmVyZW5jZTxUPiB7CisgICAgICAgIHB1YmxpYyBSZWNsYWltYWJsZVJlZmVyZW5jZShUIHIsIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gcSkgeworICAgICAgICAgICAgc3VwZXIociwgcSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlY2xhaW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBxdWV1ZSB1c2VkIHRvIHJlY2xhaW0gUmVjbGFpbWFibGVSZWZlcmVuY2VzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSByZWZlcmVuY2UgcXVldWUgb3IgbnVsbCBiZWZvcmUgaW5pdGlhbGl6YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gZ2V0UXVldWUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmICghc0luaXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc1JlY2xhaW1lci5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIHNSZWNsYWltZXIgPSBuZXcgUmVjbGFpbWVyKHNSZWNsYWltZXIubVF1ZXVlKTsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc1JlY2xhaW1lci5tUXVldWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IFp5Z290ZS4gRG9uJ3QgdG91Y2ghCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc0xvY2spIHsKKyAgICAgICAgICAgIGlmICghc0luaXQgJiYgc1JlY2xhaW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc1JlY2xhaW1lciA9IG5ldyBSZWNsYWltZXIoKTsKKyAgICAgICAgICAgICAgICBzUmVjbGFpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc0luaXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlY2xhaW1lciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gbVF1ZXVlOworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtUnVubmluZyA9IGZhbHNlOworCisgICAgICAgIFJlY2xhaW1lcigpIHsKKyAgICAgICAgICAgIHRoaXMobmV3IFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4oKSk7CisgICAgICAgIH0KKworICAgICAgICBSZWNsYWltZXIoUmVmZXJlbmNlUXVldWU8T2JqZWN0PiBxdWV1ZSkgeworICAgICAgICAgICAgc3VwZXIoIlJlY2xhaW1lciIpOworICAgICAgICAgICAgc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgbVF1ZXVlID0gcXVldWU7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1J1bm5pbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJ1bm5pbmc7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkluZmluaXRlTG9vcFN0YXRlbWVudCJ9KQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5VcChtUXVldWUucmVtb3ZlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlJlY2xhaW1lciB0aHJlYWQgZXhpdGluZzogIiwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2xlYW5VcChSZWZlcmVuY2U8Pz4gcmVmZXJlbmNlKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKChSZWNsYWltYWJsZVJlZmVyZW5jZTw/PikgcmVmZXJlbmNlKS5yZWNsYWltKCk7CisgICAgICAgICAgICB9IHdoaWxlICgocmVmZXJlbmNlID0gbVF1ZXVlLnBvbGwoKSkgIT0gbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25SZWFkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvblJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDViZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25SZWFkZXIuamF2YQpAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZWFkcyBhIEpTT04gKDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4pCisgKiBlbmNvZGVkIHZhbHVlIGFzIGEgc3RyZWFtIG9mIHRva2Vucy4gVGhpcyBzdHJlYW0gaW5jbHVkZXMgYm90aCBsaXRlcmFsCisgKiB2YWx1ZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBhbmQgbnVsbHMpIGFzIHdlbGwgYXMgdGhlIGJlZ2luIGFuZAorICogZW5kIGRlbGltaXRlcnMgb2Ygb2JqZWN0cyBhbmQgYXJyYXlzLiBUaGUgdG9rZW5zIGFyZSB0cmF2ZXJzZWQgaW4KKyAqIGRlcHRoLWZpcnN0IG9yZGVyLCB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBKU09OIGRvY3VtZW50LgorICogV2l0aGluIEpTT04gb2JqZWN0cywgbmFtZS92YWx1ZSBwYWlycyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgdG9rZW4uCisgKgorICogPGgzPlBhcnNpbmcgSlNPTjwvaDM+CisgKiBUbyBjcmVhdGUgYSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgeW91ciBvd24gSlNPTiBzdHJlYW1zLCBmaXJzdCBjcmVhdGUgYW4KKyAqIGVudHJ5IHBvaW50IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSB7QGNvZGUgSnNvblJlYWRlcn0uCisgKgorICogPHA+TmV4dCwgY3JlYXRlIGhhbmRsZXIgbWV0aG9kcyBmb3IgZWFjaCBzdHJ1Y3R1cmUgaW4geW91ciBKU09OIHRleHQuIFlvdSdsbAorICogbmVlZCBhIG1ldGhvZCBmb3IgZWFjaCBvYmplY3QgdHlwZSBhbmQgZm9yIGVhY2ggYXJyYXkgdHlwZS4KKyAqIDx1bD4KKyAqICAgPGxpPldpdGhpbiA8c3Ryb25nPmFycmF5IGhhbmRsaW5nPC9zdHJvbmc+IG1ldGhvZHMsIGZpcnN0IGNhbGwge0BsaW5rCisgKiAgICAgICAjYmVnaW5BcnJheX0gdG8gY29uc3VtZSB0aGUgYXJyYXkncyBvcGVuaW5nIGJyYWNrZXQuIFRoZW4gY3JlYXRlIGEKKyAqICAgICAgIHdoaWxlIGxvb3AgdGhhdCBhY2N1bXVsYXRlcyB2YWx1ZXMsIHRlcm1pbmF0aW5nIHdoZW4ge0BsaW5rICNoYXNOZXh0fQorICogICAgICAgaXMgZmFsc2UuIEZpbmFsbHksIHJlYWQgdGhlIGFycmF5J3MgY2xvc2luZyBicmFja2V0IGJ5IGNhbGxpbmcge0BsaW5rCisgKiAgICAgICAjZW5kQXJyYXl9LgorICogICA8bGk+V2l0aGluIDxzdHJvbmc+b2JqZWN0IGhhbmRsaW5nPC9zdHJvbmc+IG1ldGhvZHMsIGZpcnN0IGNhbGwge0BsaW5rCisgKiAgICAgICAjYmVnaW5PYmplY3R9IHRvIGNvbnN1bWUgdGhlIG9iamVjdCdzIG9wZW5pbmcgYnJhY2UuIFRoZW4gY3JlYXRlIGEKKyAqICAgICAgIHdoaWxlIGxvb3AgdGhhdCBhc3NpZ25zIHZhbHVlcyB0byBsb2NhbCB2YXJpYWJsZXMgYmFzZWQgb24gdGhlaXIgbmFtZS4KKyAqICAgICAgIFRoaXMgbG9vcCBzaG91bGQgdGVybWluYXRlIHdoZW4ge0BsaW5rICNoYXNOZXh0fSBpcyBmYWxzZS4gRmluYWxseSwKKyAqICAgICAgIHJlYWQgdGhlIG9iamVjdCdzIGNsb3NpbmcgYnJhY2UgYnkgY2FsbGluZyB7QGxpbmsgI2VuZE9iamVjdH0uCisgKiA8L3VsPgorICogPHA+V2hlbiBhIG5lc3RlZCBvYmplY3Qgb3IgYXJyYXkgaXMgZW5jb3VudGVyZWQsIGRlbGVnYXRlIHRvIHRoZQorICogY29ycmVzcG9uZGluZyBoYW5kbGVyIG1ldGhvZC4KKyAqCisgKiA8cD5XaGVuIGFuIHVua25vd24gbmFtZSBpcyBlbmNvdW50ZXJlZCwgc3RyaWN0IHBhcnNlcnMgc2hvdWxkIGZhaWwgd2l0aCBhbgorICogZXhjZXB0aW9uLiBMZW5pZW50IHBhcnNlcnMgc2hvdWxkIGNhbGwge0BsaW5rICNza2lwVmFsdWUoKX0gdG8gcmVjdXJzaXZlbHkKKyAqIHNraXAgdGhlIHZhbHVlJ3MgbmVzdGVkIHRva2Vucywgd2hpY2ggbWF5IG90aGVyd2lzZSBjb25mbGljdC4KKyAqCisgKiA8cD5JZiBhIHZhbHVlIG1heSBiZSBudWxsLCB5b3Ugc2hvdWxkIGZpcnN0IGNoZWNrIHVzaW5nIHtAbGluayAjcGVlaygpfS4KKyAqIE51bGwgbGl0ZXJhbHMgY2FuIGJlIGNvbnN1bWVkIHVzaW5nIGVpdGhlciB7QGxpbmsgI25leHROdWxsKCl9IG9yIHtAbGluaworICogI3NraXBWYWx1ZSgpfS4KKyAqCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiBTdXBwb3NlIHdlJ2QgbGlrZSB0byBwYXJzZSBhIHN0cmVhbSBvZiBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6IDxwcmU+IHtAY29kZQorICogWworICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAxLAorICogICAgICJ0ZXh0IjogIkhvdyBkbyBJIHJlYWQgSlNPTiBvbiBBbmRyb2lkPyIsCisgKiAgICAgImdlbyI6IG51bGwsCisgKiAgICAgInVzZXIiOiB7CisgKiAgICAgICAibmFtZSI6ICJhbmRyb2lkX25ld2IiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDQxCisgKiAgICAgIH0KKyAqICAgfSwKKyAqICAgeworICogICAgICJpZCI6IDkxMjM0NTY3ODkwMiwKKyAqICAgICAidGV4dCI6ICJAYW5kcm9pZF9uZXdiIGp1c3QgdXNlIGFuZHJvaWQudXRpbC5Kc29uUmVhZGVyISIsCisgKiAgICAgImdlbyI6IFs1MC40NTQ3MjIsIC0xMDQuNjA2NjY3XSwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImplc3NlIiwKKyAqICAgICAgICJmb2xsb3dlcnNfY291bnQiOiAyCisgKiAgICAgfQorICogICB9CisgKiBdfTwvcHJlPgorICogVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIHBhcnNlciBmb3IgdGhlIGFib3ZlIHN0cnVjdHVyZTogPHByZT4gICB7QGNvZGUKKyAqCisgKiAgIHB1YmxpYyBMaXN0PE1lc3NhZ2U+IHJlYWRKc29uU3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVRGLTgiKSk7CisgKiAgICAgcmV0dXJuIHJlYWRNZXNzYWdlc0FycmF5KHJlYWRlcik7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyBMaXN0PE1lc3NhZ2U+IHJlYWRNZXNzYWdlc0FycmF5KEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIExpc3Q8TWVzc2FnZT4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2U+KCk7CisgKgorICogICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIG1lc3NhZ2VzLmFkZChyZWFkTWVzc2FnZShyZWFkZXIpKTsKKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgKiAgICAgcmV0dXJuIG1lc3NhZ2VzOworICogICB9CisgKgorICogICBwdWJsaWMgTWVzc2FnZSByZWFkTWVzc2FnZShKc29uUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBsb25nIGlkID0gLTE7CisgKiAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICogICAgIFVzZXIgdXNlciA9IG51bGw7CisgKiAgICAgTGlzdDxEb3VibGU+IGdlbyA9IG51bGw7CisgKgorICogICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICogICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgKiAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRlci5uZXh0TmFtZSgpOworICogICAgICAgaWYgKG5hbWUuZXF1YWxzKCJpZCIpKSB7CisgKiAgICAgICAgIGlkID0gcmVhZGVyLm5leHRMb25nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJ0ZXh0IikpIHsKKyAqICAgICAgICAgdGV4dCA9IHJlYWRlci5uZXh0U3RyaW5nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZW8iKSAmJiByZWFkZXIucGVlaygpICE9IEpzb25Ub2tlbi5OVUxMKSB7CisgKiAgICAgICAgIGdlbyA9IHJlYWREb3VibGVzQXJyYXkocmVhZGVyKTsKKyAqICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInVzZXIiKSkgeworICogICAgICAgICB1c2VyID0gcmVhZFVzZXIocmVhZGVyKTsKKyAqICAgICAgIH0gZWxzZSB7CisgKiAgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICogICAgIHJldHVybiBuZXcgTWVzc2FnZShpZCwgdGV4dCwgdXNlciwgZ2VvKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIExpc3Q8RG91YmxlPiByZWFkRG91Ymxlc0FycmF5KEpzb25SZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICogICAgIExpc3Q8RG91YmxlPiBkb3VibGVzID0gbmV3IEFycmF5TGlzdDxEb3VibGU+KCk7CisgKgorICogICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIGRvdWJsZXMuYWRkKHJlYWRlci5uZXh0RG91YmxlKCkpOworICogICAgIH0KKyAqICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAqICAgICByZXR1cm4gZG91YmxlczsKKyAqICAgfQorICoKKyAqICAgcHVibGljIFVzZXIgcmVhZFVzZXIoSnNvblJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAqICAgICBpbnQgZm9sbG93ZXJzQ291bnQgPSAtMTsKKyAqCisgKiAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAqICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHROYW1lKCk7CisgKiAgICAgICBpZiAobmFtZS5lcXVhbHMoIm5hbWUiKSkgeworICogICAgICAgICB1c2VybmFtZSA9IHJlYWRlci5uZXh0U3RyaW5nKCk7CisgKiAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJmb2xsb3dlcnNfY291bnQiKSkgeworICogICAgICAgICBmb2xsb3dlcnNDb3VudCA9IHJlYWRlci5uZXh0SW50KCk7CisgKiAgICAgICB9IGVsc2UgeworICogICAgICAgICByZWFkZXIuc2tpcFZhbHVlKCk7CisgKiAgICAgICB9CisgKiAgICAgfQorICogICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAqICAgICByZXR1cm4gbmV3IFVzZXIodXNlcm5hbWUsIGZvbGxvd2Vyc0NvdW50KTsKKyAqICAgfX08L3ByZT4KKyAqCisgKiA8aDM+TnVtYmVyIEhhbmRsaW5nPC9oMz4KKyAqIFRoaXMgcmVhZGVyIHBlcm1pdHMgbnVtZXJpYyB2YWx1ZXMgdG8gYmUgcmVhZCBhcyBzdHJpbmdzIGFuZCBzdHJpbmcgdmFsdWVzIHRvCisgKiBiZSByZWFkIGFzIG51bWJlcnMuIEZvciBleGFtcGxlLCBib3RoIGVsZW1lbnRzIG9mIHRoZSBKU09OIGFycmF5IHtAY29kZQorICogWzEsICIxIl19IG1heSBiZSByZWFkIHVzaW5nIGVpdGhlciB7QGxpbmsgI25leHRJbnR9IG9yIHtAbGluayAjbmV4dFN0cmluZ30uCisgKiBUaGlzIGJlaGF2aW9yIGlzIGludGVuZGVkIHRvIHByZXZlbnQgbG9zc3kgbnVtZXJpYyBjb252ZXJzaW9uczogZG91YmxlIGlzCisgKiBKYXZhU2NyaXB0J3Mgb25seSBudW1lcmljIHR5cGUgYW5kIHZlcnkgbGFyZ2UgdmFsdWVzIGxpa2Uge0Bjb2RlCisgKiA5MDA3MTk5MjU0NzQwOTkzfSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBvbiB0aGF0IHBsYXRmb3JtLiBUbyBtaW5pbWl6ZQorICogcHJlY2lzaW9uIGxvc3MsIGV4dHJlbWVseSBsYXJnZSB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gYW5kIHJlYWQgYXMgc3RyaW5ncworICogaW4gSlNPTi4KKyAqCisgKiA8cD5FYWNoIHtAY29kZSBKc29uUmVhZGVyfSBtYXkgYmUgdXNlZCB0byByZWFkIGEgc2luZ2xlIEpTT04gc3RyZWFtLiBJbnN0YW5jZXMKKyAqIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQgc2FmZS4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpzb25SZWFkZXIgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgICAgLyoqIFRoZSBpbnB1dCBKU09OLiAqLworICAgIHByaXZhdGUgZmluYWwgUmVhZGVyIGluOworCisgICAgLyoqIFRydWUgdG8gYWNjZXB0IG5vbi1zcGVjIGNvbXBsaWFudCBKU09OICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxlbmllbnQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZSBhIG1hbnVhbCBidWZmZXIgdG8gZWFzaWx5IHJlYWQgYW5kIHVucmVhZCB1cGNvbWluZyBjaGFyYWN0ZXJzLCBhbmQKKyAgICAgKiBhbHNvIHNvIHdlIGNhbiBjcmVhdGUgc3RyaW5ncyB3aXRob3V0IGFuIGludGVybWVkaWF0ZSBTdHJpbmdCdWlsZGVyLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOworICAgIHByaXZhdGUgaW50IHBvcyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEpzb25TY29wZT4gc3RhY2sgPSBuZXcgQXJyYXlMaXN0PEpzb25TY29wZT4oKTsKKyAgICB7CisgICAgICAgIHB1c2goSnNvblNjb3BlLkVNUFRZX0RPQ1VNRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHdlJ3ZlIGFscmVhZHkgcmVhZCB0aGUgbmV4dCB0b2tlbi4gSWYgd2UgaGF2ZSwgdGhlIHN0cmluZyB2YWx1ZQorICAgICAqIGZvciB0aGF0IHRva2VuIHdpbGwgYmUgYXNzaWduZWQgdG8ge0Bjb2RlIHZhbHVlfSBpZiBzdWNoIGEgc3RyaW5nIHZhbHVlCisgICAgICogZXhpc3RzLiBBbmQgdGhlIHRva2VuIHR5cGUgd2lsbCBiZSBhc3NpZ25lZCB0byB7QGNvZGUgdG9rZW59IGlmIHRoZSB0b2tlbgorICAgICAqIHR5cGUgaXMga25vd24uIFRoZSB0b2tlbiB0eXBlIG1heSBiZSBudWxsIGZvciBsaXRlcmFscywgc2luY2Ugd2UgZGVyaXZlCisgICAgICogdGhhdCBsYXppbHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1Rva2VuOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIG5leHQgdG9rZW4gdG8gYmUgcmV0dXJuZWQgYnkge0BsaW5rICNwZWVrfSBhbmQge0BsaW5rCisgICAgICogI2FkdmFuY2V9LCBvciB7QGNvZGUgbnVsbH0gaWYgaXQgaXMgdW5rbm93biBhbmQgbXVzdCBmaXJzdCBiZSBkZXJpdmVkCisgICAgICogZnJvbSB7QGNvZGUgdmFsdWV9LiBUaGlzIHZhbHVlIGlzIHVuZGVmaW5lZCBpZiB7QGNvZGUgaGFzVG9rZW59IGlzIGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblRva2VuIHRva2VuOworCisgICAgLyoqIFRoZSB0ZXh0IG9mIHRoZSBuZXh0IG5hbWUuICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIC8qKiBUaGUgdGV4dCBvZiB0aGUgbmV4dCBsaXRlcmFsIHZhbHVlLiAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgLyoqIFRydWUgaWYgd2UncmUgY3VycmVudGx5IGhhbmRsaW5nIGEgc2tpcFZhbHVlKCkgY2FsbC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcHBpbmcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdGhhdCByZWFkcyBhIEpTT04tZW5jb2RlZCBzdHJlYW0gZnJvbSB7QGNvZGUgaW59LgorICAgICAqLworICAgIHB1YmxpYyBKc29uUmVhZGVyKFJlYWRlciBpbikgeworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpbiA9PSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGlzIHBhcnNlciB0byBiZSAgYmUgbGliZXJhbCBpbiB3aGF0IGl0IGFjY2VwdHMuIEJ5IGRlZmF1bHQsCisgICAgICogdGhpcyBwYXJzZXIgaXMgc3RyaWN0IGFuZCBvbmx5IGFjY2VwdHMgSlNPTiBhcyBzcGVjaWZpZWQgYnkgPGEKKyAgICAgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0NjI3LnR4dCI+UkZDIDQ2Mjc8L2E+LiBTZXR0aW5nIHRoZQorICAgICAqIHBhcnNlciB0byBsZW5pZW50IGNhdXNlcyBpdCB0byBpZ25vcmUgdGhlIGZvbGxvd2luZyBzeW50YXggZXJyb3JzOgorICAgICAqCisgICAgICogPHVsPgorICAgICAqICAgPGxpPkVuZCBvZiBsaW5lIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgge0Bjb2RlIC8vfSBvciB7QGNvZGUgI30gYW5kCisgICAgICogICAgICAgZW5kaW5nIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci4KKyAgICAgKiAgIDxsaT5DLXN0eWxlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGgge0Bjb2RlIC8qfSBhbmQgZW5kaW5nIHdpdGgKKyAgICAgKiAgICAgICB7QGNvZGUgKn17QGNvZGUgL30uIFN1Y2ggY29tbWVudHMgbWF5IG5vdCBiZSBuZXN0ZWQuCisgICAgICogICA8bGk+TmFtZXMgdGhhdCBhcmUgdW5xdW90ZWQgb3Ige0Bjb2RlICdzaW5nbGUgcXVvdGVkJ30uCisgICAgICogICA8bGk+U3RyaW5ncyB0aGF0IGFyZSB1bnF1b3RlZCBvciB7QGNvZGUgJ3NpbmdsZSBxdW90ZWQnfS4KKyAgICAgKiAgIDxsaT5BcnJheSBlbGVtZW50cyBzZXBhcmF0ZWQgYnkge0Bjb2RlIDt9IGluc3RlYWQgb2Yge0Bjb2RlICx9LgorICAgICAqICAgPGxpPlVubmVjZXNzYXJ5IGFycmF5IHNlcGFyYXRvcnMuIFRoZXNlIGFyZSBpbnRlcnByZXRlZCBhcyBpZiBudWxsCisgICAgICogICAgICAgd2FzIHRoZSBvbWl0dGVkIHZhbHVlLgorICAgICAqICAgPGxpPk5hbWVzIGFuZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IHtAY29kZSA9fSBvciB7QGNvZGUgPT59IGluc3RlYWQgb2YKKyAgICAgKiAgICAgICB7QGNvZGUgOn0uCisgICAgICogICA8bGk+TmFtZS92YWx1ZSBwYWlycyBzZXBhcmF0ZWQgYnkge0Bjb2RlIDt9IGluc3RlYWQgb2Yge0Bjb2RlICx9LgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGVuaWVudChib29sZWFuIGxlbmllbnQpIHsKKyAgICAgICAgdGhpcy5sZW5pZW50ID0gbGVuaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBKU09OIHN0cmVhbSBhbmQgYXNzZXJ0cyB0aGF0IGl0IGlzIHRoZQorICAgICAqIGJlZ2lubmluZyBvZiBhIG5ldyBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbkFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5CRUdJTl9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIGN1cnJlbnQgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoSnNvblRva2VuLkVORF9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgSlNPTiBzdHJlYW0gYW5kIGFzc2VydHMgdGhhdCBpdCBpcyB0aGUKKyAgICAgKiBiZWdpbm5pbmcgb2YgYSBuZXcgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEpzb25Ub2tlbi5CRUdJTl9PQkpFQ1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgdGhlCisgICAgICogZW5kIG9mIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChKc29uVG9rZW4uRU5EX09CSkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZXMge0Bjb2RlIGV4cGVjdGVkfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0KEpzb25Ub2tlbiBleHBlY3RlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAhPSBleHBlY3RlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgIiArIGV4cGVjdGVkICsgIiBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYXJyYXkgb3Igb2JqZWN0IGhhcyBhbm90aGVyIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICByZXR1cm4gdG9rZW4gIT0gSnNvblRva2VuLkVORF9PQkpFQ1QgJiYgdG9rZW4gIT0gSnNvblRva2VuLkVORF9BUlJBWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBuZXh0IHRva2VuIHdpdGhvdXQgY29uc3VtaW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBKc29uVG9rZW4gcGVlaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworCisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWNvZGVMaXRlcmFsKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IGEgdG9rZW4gaXMgcmVhZHkuIEFmdGVyIHRoaXMgY2FsbCBlaXRoZXIge0Bjb2RlIHRva2VufSBvcgorICAgICAqIHtAY29kZSB2YWx1ZX0gd2lsbCBiZSBub24tbnVsbC4gVG8gZW5zdXJlIHtAY29kZSB0b2tlbn0gaGFzIGEgZGVmaW5pdGl2ZQorICAgICAqIHZhbHVlLCB1c2Uge0BsaW5rICNwZWVrKCl9CisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gcXVpY2tQZWVrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGhhc1Rva2VuKSB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHBlZWtTdGFjaygpKSB7CisgICAgICAgICAgICBjYXNlIEVNUFRZX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICBKc29uVG9rZW4gZmlyc3RUb2tlbiA9IG5leHRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiAhPSBKc29uVG9rZW4uQkVHSU5fQVJSQVkgJiYgdG9rZW4gIT0gSnNvblRva2VuLkJFR0lOX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIEpTT04gZG9jdW1lbnQgdG8gc3RhcnQgd2l0aCAnWycgb3IgJ3snIGJ1dCB3YXMgIiArIHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VG9rZW47CisgICAgICAgICAgICBjYXNlIEVNUFRZX0FSUkFZOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5BcnJheSh0cnVlKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfQVJSQVk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbkFycmF5KGZhbHNlKTsKKyAgICAgICAgICAgIGNhc2UgRU1QVFlfT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW5PYmplY3QodHJ1ZSk7CisgICAgICAgICAgICBjYXNlIERBTkdMSU5HX05BTUU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdFZhbHVlKCk7CisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX09CSkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluT2JqZWN0KGZhbHNlKTsKKyAgICAgICAgICAgIGNhc2UgTk9ORU1QVFlfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgaGFzVG9rZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQ7CisgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJKc29uUmVhZGVyIGlzIGNsb3NlZCIpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2VzIHRoZSBjdXJzb3IgaW4gdGhlIEpTT04gc3RyZWFtIHRvIHRoZSBuZXh0IHRva2VuLgorICAgICAqLworICAgIHByaXZhdGUgSnNvblRva2VuIGFkdmFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKworICAgICAgICBKc29uVG9rZW4gcmVzdWx0ID0gdG9rZW47CisgICAgICAgIGhhc1Rva2VuID0gZmFsc2U7CisgICAgICAgIHRva2VuID0gbnVsbDsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuLCBhIHtAbGluayBKc29uVG9rZW4jTkFNRSBwcm9wZXJ0eSBuYW1lfSwgYW5kCisgICAgICogY29uc3VtZXMgaXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGluIHRoZSBzdHJlYW0gaXMgbm90IGEgcHJvcGVydHkKKyAgICAgKiAgICAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5leHROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAhPSBKc29uVG9rZW4uTkFNRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBuYW1lIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5hbWU7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI1NUUklORyBzdHJpbmd9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBudW1iZXIsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGl0cworICAgICAqIHN0cmluZyBmb3JtLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgc3RyaW5nIG9yIGlmCisgICAgICogICAgIHRoaXMgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5leHRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8ICh0b2tlbiAhPSBKc29uVG9rZW4uU1RSSU5HICYmIHRva2VuICE9IEpzb25Ub2tlbi5OVU1CRVIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIHN0cmluZyBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHZhbHVlOworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEpzb25Ub2tlbiNCT09MRUFOIGJvb2xlYW59IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBhIGJvb2xlYW4gb3IgaWYKKyAgICAgKiAgICAgdGhpcyByZWFkZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5leHRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRva2VuID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgYm9vbGVhbiBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgYSBib29sZWFuOiAiICsgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIEpTT04gc3RyZWFtIGFuZCBhc3NlcnRzIHRoYXQgaXQgaXMgYQorICAgICAqIGxpdGVyYWwgbnVsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBuZXh0IHRva2VuIGlzIG5vdCBudWxsIG9yIGlmIHRoaXMKKyAgICAgKiAgICAgcmVhZGVyIGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBuZXh0TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHF1aWNrUGVlaygpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB0b2tlbiA9PSBKc29uVG9rZW4uU1RSSU5HKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBudWxsIGJ1dCB3YXMgIiArIHBlZWsoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm51bGwiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IGEgbnVsbDogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBkb3VibGV9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bworICAgICAqIHBhcnNlIGl0IGFzIGEgZG91YmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgbGl0ZXJhbCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgbmV4dCBsaXRlcmFsIHZhbHVlIGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgKiAgICAgYXMgYSBkb3VibGUsIG9yIGlzIG5vbi1maW5pdGUuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBuZXh0RG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGRvdWJsZSBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgZG91YmxlIHJlc3VsdCA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7CisKKyAgICAgICAgaWYgKChyZXN1bHQgPj0gMS4wZCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpCisgICAgICAgICAgICAgICAgfHwgRG91YmxlLmlzTmFOKHJlc3VsdCkKKyAgICAgICAgICAgICAgICB8fCBEb3VibGUuaXNJbmZpbml0ZShyZXN1bHQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSlNPTiBmb3JiaWRzIG9jdGFsIHByZWZpeGVzLCBOYU4gYW5kIGluZmluaXRpZXM6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEpzb25Ub2tlbiNOVU1CRVIgbG9uZ30gdmFsdWUgb2YgdGhlIG5leHQgdG9rZW4sCisgICAgICogY29uc3VtaW5nIGl0LiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCBhdHRlbXB0IHRvCisgICAgICogcGFyc2UgaXQgYXMgYSBsb25nLiBJZiB0aGUgbmV4dCB0b2tlbidzIG51bWVyaWMgdmFsdWUgY2Fubm90IGJlIGV4YWN0bHkKKyAgICAgKiByZXByZXNlbnRlZCBieSBhIEphdmEge0Bjb2RlIGxvbmd9LCB0aGlzIG1ldGhvZCB0aHJvd3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIG51bWJlciwgb3IgZXhhY3RseSByZXByZXNlbnRlZCBhcyBhIGxvbmcuCisgICAgICovCisgICAgcHVibGljIGxvbmcgbmV4dExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBxdWlja1BlZWsoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkV4cGVjdGVkIGEgbG9uZyBidXQgd2FzICIgKyBwZWVrKCkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyByZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICBkb3VibGUgYXNEb3VibGUgPSBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOyAvLyBkb24ndCBjYXRjaCB0aGlzIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAgICAgICAgcmVzdWx0ID0gKGxvbmcpIGFzRG91YmxlOworICAgICAgICAgICAgaWYgKChkb3VibGUpIHJlc3VsdCAhPSBhc0RvdWJsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA+PSAxTCAmJiB2YWx1ZS5zdGFydHNXaXRoKCIwIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIkpTT04gZm9yYmlkcyBvY3RhbCBwcmVmaXhlczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSnNvblRva2VuI05VTUJFUiBpbnR9IHZhbHVlIG9mIHRoZSBuZXh0IHRva2VuLAorICAgICAqIGNvbnN1bWluZyBpdC4gSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIHdpbGwgYXR0ZW1wdCB0bworICAgICAqIHBhcnNlIGl0IGFzIGFuIGludC4gSWYgdGhlIG5leHQgdG9rZW4ncyBudW1lcmljIHZhbHVlIGNhbm5vdCBiZSBleGFjdGx5CisgICAgICogcmVwcmVzZW50ZWQgYnkgYSBKYXZhIHtAY29kZSBpbnR9LCB0aGlzIG1ldGhvZCB0aHJvd3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbmV4dCB0b2tlbiBpcyBub3QgYSBsaXRlcmFsIHZhbHVlLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBuZXh0IGxpdGVyYWwgdmFsdWUgY2Fubm90IGJlIHBhcnNlZAorICAgICAqICAgICBhcyBhIG51bWJlciwgb3IgZXhhY3RseSByZXByZXNlbnRlZCBhcyBhbiBpbnQuCisgICAgICovCisgICAgcHVibGljIGludCBuZXh0SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcXVpY2tQZWVrKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhbiBpbnQgYnV0IHdhcyAiICsgcGVlaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhc0RvdWJsZSA9IERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIGRvbid0IGNhdGNoIHRoaXMgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAoaW50KSBhc0RvdWJsZTsKKyAgICAgICAgICAgIGlmICgoZG91YmxlKSByZXN1bHQgIT0gYXNEb3VibGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPj0gMUwgJiYgdmFsdWUuc3RhcnRzV2l0aCgiMCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJKU09OIGZvcmJpZHMgb2N0YWwgcHJlZml4ZXM6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgSlNPTiByZWFkZXIgYW5kIHRoZSB1bmRlcmx5aW5nIHtAbGluayBSZWFkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaGFzVG9rZW4gPSBmYWxzZTsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICB0b2tlbiA9IG51bGw7CisgICAgICAgIHN0YWNrLmNsZWFyKCk7CisgICAgICAgIHN0YWNrLmFkZChKc29uU2NvcGUuQ0xPU0VEKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyB0aGUgbmV4dCB2YWx1ZSByZWN1cnNpdmVseS4gSWYgaXQgaXMgYW4gb2JqZWN0IG9yIGFycmF5LCBhbGwgbmVzdGVkCisgICAgICogZWxlbWVudHMgYXJlIHNraXBwZWQuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiB0aGUgSlNPTiB0b2tlbgorICAgICAqIHN0cmVhbSBjb250YWlucyB1bnJlY29nbml6ZWQgb3IgdW5oYW5kbGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBza2lwVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBza2lwcGluZyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEpzb25Ub2tlbiB0b2tlbiA9IGFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gPT0gSnNvblRva2VuLkJFR0lOX0FSUkFZIHx8IHRva2VuID09IEpzb25Ub2tlbi5CRUdJTl9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09IEpzb25Ub2tlbi5FTkRfQVJSQVkgfHwgdG9rZW4gPT0gSnNvblRva2VuLkVORF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChjb3VudCAhPSAwKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNraXBwaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25TY29wZSBwZWVrU3RhY2soKSB7CisgICAgICAgIHJldHVybiBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uU2NvcGUgcG9wKCkgeworICAgICAgICByZXR1cm4gc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXNoKEpzb25TY29wZSBuZXdUb3ApIHsKKyAgICAgICAgc3RhY2suYWRkKG5ld1RvcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZSB0aGUgdmFsdWUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUb3AoSnNvblNjb3BlIG5ld1RvcCkgeworICAgICAgICBzdGFjay5zZXQoc3RhY2suc2l6ZSgpIC0gMSwgbmV3VG9wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBuZXh0SW5BcnJheShib29sZWFuIGZpcnN0RWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpcnN0RWxlbWVudCkgeworICAgICAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuTk9ORU1QVFlfQVJSQVkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTG9vayBmb3IgYSBjb21tYSBiZWZvcmUgZWFjaCBlbGVtZW50IGFmdGVyIHRoZSBmaXJzdCBlbGVtZW50LiAqLworICAgICAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfQVJSQVk7CisgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOyAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBhcnJheSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuZXh0Tm9uV2hpdGVzcGFjZSgpKSB7CisgICAgICAgICAgICBjYXNlICddJzoKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IEpzb25Ub2tlbi5FTkRfQVJSQVk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaCB0byBoYW5kbGUgIixdIgorICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAvKiBJbiBsZW5pZW50IG1vZGUsIGEgMC1sZW5ndGggbGl0ZXJhbCBtZWFucyAnbnVsbCcgKi8KKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBwb3MtLTsKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAibnVsbCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLk5VTEw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSnNvblRva2VuIG5leHRJbk9iamVjdChib29sZWFuIGZpcnN0RWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCBkZWxpbWl0ZXJzLiBFaXRoZXIgYSBjb21tYS9zZW1pY29sb24gc2VwYXJhdGluZyB0aGlzIGFuZCB0aGUKKyAgICAgICAgICogcHJldmlvdXMgbmFtZS12YWx1ZSBwYWlyLCBvciBhIGNsb3NlIGJyYWNlIHRvIGRlbm90ZSB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoZmlyc3RFbGVtZW50KSB7CisgICAgICAgICAgICAvKiBQZWVrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBlbXB0eSBvYmplY3QuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKG5leHROb25XaGl0ZXNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkVORF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgb2JqZWN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHRoZSBuYW1lLiAqLworICAgICAgICBpbnQgcXVvdGUgPSBuZXh0Tm9uV2hpdGVzcGFjZSgpOworICAgICAgICBzd2l0Y2ggKHF1b3RlKSB7CisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7IC8vIGZhbGwtdGhyb3VnaAorICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5leHRTdHJpbmcoKGNoYXIpIHF1b3RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2hlY2tMZW5pZW50KCk7CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgbmFtZSA9IG5leHRMaXRlcmFsKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFeHBlY3RlZCBuYW1lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVwbGFjZVRvcChKc29uU2NvcGUuREFOR0xJTkdfTkFNRSk7CisgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLk5BTUU7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gb2JqZWN0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBuYW1lL3ZhbHVlIHNlcGFyYXRvci4gVXN1YWxseSBhIGNvbG9uICc6Jy4gSW4gbGVuaWVudCBtb2RlCisgICAgICAgICAqIHdlIGFsc28gYWNjZXB0IGFuIGVxdWFscyBzaWduICc9Jywgb3IgYW4gYXJyb3cgIj0+Ii4KKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaCAobmV4dE5vbldoaXRlc3BhY2UoKSkgeworICAgICAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpICYmIGJ1ZmZlcltwb3NdID09ICc+JykgeworICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFeHBlY3RlZCAnOiciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX09CSkVDVCk7CisgICAgICAgIHJldHVybiBuZXh0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25Ub2tlbiBuZXh0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYyA9IG5leHROb25XaGl0ZXNwYWNlKCk7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfT0JKRUNUKTsKKyAgICAgICAgICAgICAgICBoYXNUb2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gSnNvblRva2VuLkJFR0lOX09CSkVDVDsKKworICAgICAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICAgICAgcHVzaChKc29uU2NvcGUuRU1QVFlfQVJSQVkpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uQkVHSU5fQVJSQVk7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG5leHRTdHJpbmcoKGNoYXIpIGMpOworICAgICAgICAgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSBKc29uVG9rZW4uU1RSSU5HOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgIHJldHVybiByZWFkTGl0ZXJhbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIG9uY2Uge0Bjb2RlIGxpbWl0IC0gcG9zID49IG1pbmltdW19LiBJZiB0aGUgZGF0YSBpcworICAgICAqIGV4aGF1c3RlZCBiZWZvcmUgdGhhdCBtYW55IGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZSwgdGhpcyByZXR1cm5zCisgICAgICogZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbGxCdWZmZXIoaW50IG1pbmltdW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsaW1pdCAhPSBwb3MpIHsKKyAgICAgICAgICAgIGxpbWl0IC09IHBvczsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBwb3MsIGJ1ZmZlciwgMCwgbGltaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGltaXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgaW50IHRvdGFsOworICAgICAgICB3aGlsZSAoKHRvdGFsID0gaW4ucmVhZChidWZmZXIsIGxpbWl0LCBidWZmZXIubGVuZ3RoIC0gbGltaXQpKSAhPSAtMSkgeworICAgICAgICAgICAgbGltaXQgKz0gdG90YWw7CisgICAgICAgICAgICBpZiAobGltaXQgPj0gbWluaW11bSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBuZXh0Tm9uV2hpdGVzcGFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlIChwb3MgPCBsaW1pdCB8fCBmaWxsQnVmZmVyKDEpKSB7CisgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCAmJiAhZmlsbEJ1ZmZlcigxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBwZWVrID0gYnVmZmVyW3Bvc107CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGVlaykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIC8qIGMtc3R5bGUgY29tbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcFRvKCIqLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIC8vIGVuZC1vZi1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwVG9FbmRPZkxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNraXAgYSAjIGhhc2ggZW5kLW9mLWxpbmUgY29tbWVudC4gVGhlIEpTT04gUkZDIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICogc3BlY2lmeSB0aGlzIGJlaGF2aW91ciwgYnV0IGl0J3MgcmVxdWlyZWQgdG8gcGFyc2UKKyAgICAgICAgICAgICAgICAgICAgICogZXhpc3RpbmcgZG9jdW1lbnRzLiBTZWUgaHR0cDovL2IvMjU3MTQyMy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNoZWNrTGVuaWVudCgpOworICAgICAgICAgICAgICAgICAgICBza2lwVG9FbmRPZkxpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJFbmQgb2YgaW5wdXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tMZW5pZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFsZW5pZW50KSB7CisgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcigiVXNlIEpzb25SZWFkZXIuc2V0TGVuaWVudCh0cnVlKSB0byBhY2NlcHQgbWFsZm9ybWVkIEpTT04iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkdmFuY2VzIHRoZSBwb3NpdGlvbiB1bnRpbCBhZnRlciB0aGUgbmV4dCBuZXdsaW5lIGNoYXJhY3Rlci4gSWYgdGhlIGxpbmUKKyAgICAgKiBpcyB0ZXJtaW5hdGVkIGJ5ICJcclxuIiwgdGhlICdcbicgbXVzdCBiZSBjb25zdW1lZCBhcyB3aGl0ZXNwYWNlIGJ5IHRoZQorICAgICAqIGNhbGxlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2tpcFRvRW5kT2ZMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGxpbWl0IHx8IGZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNraXBUbyhTdHJpbmcgdG9GaW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXRlcjoKKyAgICAgICAgZm9yICg7IHBvcyArIHRvRmluZC5sZW5ndGgoKSA8IGxpbWl0IHx8IGZpbGxCdWZmZXIodG9GaW5kLmxlbmd0aCgpKTsgcG9zKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgdG9GaW5kLmxlbmd0aCgpOyBjKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW3BvcyArIGNdICE9IHRvRmluZC5jaGFyQXQoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB7QGNvZGUgcXVvdGV9LCB1bmVzY2FwaW5nIGFueQorICAgICAqIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGVuY291bnRlcmVkIGFsb25nIHRoZSB3YXkuIFRoZSBvcGVuaW5nIHF1b3RlCisgICAgICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQuIFRoaXMgY29uc3VtZXMgdGhlIGNsb3NpbmcgcXVvdGUsIGJ1dCBkb2VzCisgICAgICogbm90IGluY2x1ZGUgaXQgaW4gdGhlIHJldHVybmVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdW90ZSBlaXRoZXIgJyBvciAiLgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIGFueSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCisgICAgICogICAgIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuZXh0U3RyaW5nKGNoYXIgcXVvdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCB5ZXQgYXBwZW5kZWQgdG8gdGhlIGJ1aWxkZXIuICovCisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBxdW90ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic2tpcHBlZCEiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCAtIDEpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChyZWFkRXNjYXBlQ2hhcmFjdGVyKCkpOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgfSB3aGlsZSAoZmlsbEJ1ZmZlcigxKSk7CisKKyAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgYW55IGRlbGltaXRlciBjaGFyYWN0ZXJzLiBUaGlzCisgICAgICogZG9lcyBub3QgY29uc3VtZSB0aGUgZGVsaW1pdGVyIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuZXh0TGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG51bGw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCB5ZXQgYXBwZW5kZWQgdG8gdGhlIGJ1aWxkZXIuICovCisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsgLy8gZmFsbC10aHJvdWdoCisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzonOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBwaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJza2lwcGVkISI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgc3RhcnQsIHBvcyAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYnVmZmVyLCBzdGFydCwgcG9zIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIsIHN0YXJ0LCBwb3MgLSBzdGFydCk7CisgICAgICAgIH0gd2hpbGUgKGZpbGxCdWZmZXIoMSkpOworCisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgbmVhciAiICsgZ2V0U25pcHBldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuZXNjYXBlcyB0aGUgY2hhcmFjdGVyIGlkZW50aWZpZWQgYnkgdGhlIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgYSBiYWNrc2xhc2guIFRoZSBiYWNrc2xhc2ggJ1wnIHNob3VsZCBoYXZlIGFscmVhZHkKKyAgICAgKiBiZWVuIHJlYWQuIFRoaXMgc3VwcG9ydHMgYm90aCB1bmljb2RlIGVzY2FwZXMgInUwMDBBIiBhbmQgdHdvLWNoYXJhY3RlcgorICAgICAqIGVzY2FwZXMgIlxuIi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIGFueSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlCisgICAgICogICAgIG1hbGZvcm1lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNoYXIgcmVhZEVzY2FwZUNoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwb3MgPT0gbGltaXQgJiYgIWZpbGxCdWZmZXIoMSkpIHsKKyAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKCJVbnRlcm1pbmF0ZWQgZXNjYXBlIHNlcXVlbmNlIik7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGVzY2FwZWQgPSBidWZmZXJbcG9zKytdOworICAgICAgICBzd2l0Y2ggKGVzY2FwZWQpIHsKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIGlmIChwb3MgKyA0ID4gbGltaXQgJiYgIWZpbGxCdWZmZXIoNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIlVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGhleCA9IG5ldyBTdHJpbmcoYnVmZmVyLCBwb3MsIDQpOworICAgICAgICAgICAgICAgIHBvcyArPSA0OworICAgICAgICAgICAgICAgIHJldHVybiAoY2hhcikgSW50ZWdlci5wYXJzZUludChoZXgsIDE2KTsKKworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcdCc7CisKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIHJldHVybiAnXGInOworCisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xuJzsKKworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdccic7CisKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHJldHVybiAnXGYnOworCisgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIG51bGwsIGJvb2xlYW4sIG51bWVyaWMgb3IgdW5xdW90ZWQgc3RyaW5nIGxpdGVyYWwgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uVG9rZW4gcmVhZExpdGVyYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IG5leHRMaXRlcmFsKCk7CisgICAgICAgIGlmIChsaXRlcmFsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoIkV4cGVjdGVkIGxpdGVyYWwgdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IGxpdGVyYWw7CisgICAgICAgIGhhc1Rva2VuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRva2VuID0gbnVsbDsgLy8gdXNlIGRlY29kZUxpdGVyYWwoKSB0byBnZXQgdGhlIHRva2VuIHR5cGUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ25zIHtAY29kZSBuZXh0VG9rZW59IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB7QGNvZGUgbmV4dFZhbHVlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVjb2RlTGl0ZXJhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJudWxsIikpIHsKKyAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLk5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgIHRva2VuID0gSnNvblRva2VuLkJPT0xFQU47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7IC8vIHRoaXMgd29yayBjb3VsZCBwb3RlbnRpYWxseSBiZSBjYWNoZWQKKyAgICAgICAgICAgICAgICB0b2tlbiA9IEpzb25Ub2tlbi5OVU1CRVI7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBhbiB1bnF1b3RlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICBjaGVja0xlbmllbnQoKTsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IEpzb25Ub2tlbi5TVFJJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYSBuZXcgSU8gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGEgY29udGV4dCBzbmlwcGV0CisgICAgICogd2l0aCB0aGlzIHJlYWRlcidzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIElPRXhjZXB0aW9uIHN5bnRheEVycm9yKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSnNvblN5bnRheEV4Y2VwdGlvbihtZXNzYWdlICsgIiBuZWFyICIgKyBnZXRTbmlwcGV0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIGdldFNuaXBwZXQoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc25pcHBldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBiZWZvcmVQb3MgPSBNYXRoLm1pbihwb3MsIDIwKTsKKyAgICAgICAgc25pcHBldC5hcHBlbmQoYnVmZmVyLCBwb3MgLSBiZWZvcmVQb3MsIGJlZm9yZVBvcyk7CisgICAgICAgIGludCBhZnRlclBvcyA9IE1hdGgubWluKGxpbWl0IC0gcG9zLCAyMCk7CisgICAgICAgIHNuaXBwZXQuYXBwZW5kKGJ1ZmZlciwgcG9zLCBhZnRlclBvcyk7CisgICAgICAgIHJldHVybiBzbmlwcGV0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpzb25TeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaXZhdGUgSnNvblN5bnRheEV4Y2VwdGlvbihTdHJpbmcgcykgeworICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25TY29wZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uU2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTUzNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uU2NvcGUuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKKy8qKgorICogTGV4aWNhbCBzY29waW5nIGVsZW1lbnRzIHdpdGhpbiBhIEpTT04gcmVhZGVyIG9yIHdyaXRlci4KKyAqLworZW51bSBKc29uU2NvcGUgeworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgd2l0aCBubyBlbGVtZW50cyByZXF1aXJlcyBubyBzZXBhcmF0b3JzIG9yIG5ld2xpbmVzIGJlZm9yZQorICAgICAqIGl0IGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9BUlJBWSwKKworICAgIC8qKgorICAgICAqIEEgYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgcmVxdWlyZXMgYSBjb21tYSBhbmQgbmV3bGluZSBiZWZvcmUKKyAgICAgKiB0aGUgbmV4dCBlbGVtZW50LgorICAgICAqLworICAgIE5PTkVNUFRZX0FSUkFZLAorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHdpdGggbm8gbmFtZS92YWx1ZSBwYWlycyByZXF1aXJlcyBubyBzZXBhcmF0b3JzIG9yIG5ld2xpbmVzCisgICAgICogYmVmb3JlIGl0IGlzIGNsb3NlZC4KKyAgICAgKi8KKyAgICBFTVBUWV9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3Qgd2hvc2UgbW9zdCByZWNlbnQgZWxlbWVudCBpcyBhIGtleS4gVGhlIG5leHQgZWxlbWVudCBtdXN0CisgICAgICogYmUgYSB2YWx1ZS4KKyAgICAgKi8KKyAgICBEQU5HTElOR19OQU1FLAorCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IHdpdGggYXQgbGVhc3Qgb25lIG5hbWUvdmFsdWUgcGFpciByZXF1aXJlcyBhIGNvbW1hIGFuZAorICAgICAqIG5ld2xpbmUgYmVmb3JlIHRoZSBuZXh0IGVsZW1lbnQuCisgICAgICovCisgICAgTk9ORU1QVFlfT0JKRUNULAorCisgICAgLyoqCisgICAgICogTm8gb2JqZWN0IG9yIGFycmF5IGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICovCisgICAgRU1QVFlfRE9DVU1FTlQsCisKKyAgICAvKioKKyAgICAgKiBBIGRvY3VtZW50IHdpdGggYXQgYW4gYXJyYXkgb3Igb2JqZWN0LgorICAgICAqLworICAgIE5PTkVNUFRZX0RPQ1VNRU5ULAorCisgICAgLyoqCisgICAgICogQSBkb2N1bWVudCB0aGF0J3MgYmVlbiBjbG9zZWQgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKyAgICAgKi8KKyAgICBDTE9TRUQsCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Ub2tlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJjNmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Kc29uVG9rZW4uamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKKy8qKgorICogQSBzdHJ1Y3R1cmUsIG5hbWUgb3IgdmFsdWUgdHlwZSBpbiBhIEpTT04tZW5jb2RlZCBzdHJpbmcuCisgKi8KK3B1YmxpYyBlbnVtIEpzb25Ub2tlbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlbmluZyBvZiBhIEpTT04gYXJyYXkuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjYmVnaW5PYmplY3R9CisgICAgICogYW5kIHJlYWQgdXNpbmcge0BsaW5rIEpzb25SZWFkZXIjYmVnaW5PYmplY3R9LgorICAgICAqLworICAgIEJFR0lOX0FSUkFZLAorCisgICAgLyoqCisgICAgICogVGhlIGNsb3Npbmcgb2YgYSBKU09OIGFycmF5LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2VuZEFycmF5fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2VuZEFycmF5fS4KKyAgICAgKi8KKyAgICBFTkRfQVJSQVksCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlbmluZyBvZiBhIEpTT04gb2JqZWN0LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2JlZ2luT2JqZWN0fQorICAgICAqIGFuZCByZWFkIHVzaW5nIHtAbGluayBKc29uUmVhZGVyI2JlZ2luT2JqZWN0fS4KKyAgICAgKi8KKyAgICBCRUdJTl9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xvc2luZyBvZiBhIEpTT04gb2JqZWN0LiBXcml0dGVuIHVzaW5nIHtAbGluayBKc29uV3JpdGVyI2VuZE9iamVjdH0KKyAgICAgKiBhbmQgcmVhZCB1c2luZyB7QGxpbmsgSnNvblJlYWRlciNlbmRPYmplY3R9LgorICAgICAqLworICAgIEVORF9PQkpFQ1QsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gcHJvcGVydHkgbmFtZS4gV2l0aGluIG9iamVjdHMsIHRva2VucyBhbHRlcm5hdGUgYmV0d2VlbiBuYW1lcyBhbmQKKyAgICAgKiB0aGVpciB2YWx1ZXMuIFdyaXR0ZW4gdXNpbmcge0BsaW5rIEpzb25Xcml0ZXIjbmFtZX0gYW5kIHJlYWQgdXNpbmcge0BsaW5rCisgICAgICogSnNvblJlYWRlciNuZXh0TmFtZX0KKyAgICAgKi8KKyAgICBOQU1FLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHN0cmluZy4KKyAgICAgKi8KKyAgICBTVFJJTkcsCisKKyAgICAvKioKKyAgICAgKiBBIEpTT04gbnVtYmVyIHJlcHJlc2VudGVkIGluIHRoaXMgQVBJIGJ5IGEgSmF2YSB7QGNvZGUgZG91YmxlfSwge0Bjb2RlCisgICAgICogbG9uZ30sIG9yIHtAY29kZSBpbnR9LgorICAgICAqLworICAgIE5VTUJFUiwKKworICAgIC8qKgorICAgICAqIEEgSlNPTiB7QGNvZGUgdHJ1ZX0gb3Ige0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBCT09MRUFOLAorCisgICAgLyoqCisgICAgICogQSBKU09OIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBOVUxMLAorCisgICAgLyoqCisgICAgICogVGhlIGVuZCBvZiB0aGUgSlNPTiBzdHJlYW0uIFRoaXMgc2VudGluZWwgdmFsdWUgaXMgcmV0dXJuZWQgYnkge0BsaW5rCisgICAgICogSnNvblJlYWRlciNwZWVrKCl9IHRvIHNpZ25hbCB0aGF0IHRoZSBKU09OLWVuY29kZWQgdmFsdWUgaGFzIG5vIG1vcmUKKyAgICAgKiB0b2tlbnMuCisgICAgICovCisgICAgRU5EX0RPQ1VNRU5UCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSnNvbldyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlY2MxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFdyaXRlcyBhIEpTT04gKDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ2MjcudHh0Ij5SRkMgNDYyNzwvYT4pCisgKiBlbmNvZGVkIHZhbHVlIHRvIGEgc3RyZWFtLCBvbmUgdG9rZW4gYXQgYSB0aW1lLiBUaGUgc3RyZWFtIGluY2x1ZGVzIGJvdGgKKyAqIGxpdGVyYWwgdmFsdWVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyBhbmQgbnVsbHMpIGFzIHdlbGwgYXMgdGhlIGJlZ2luCisgKiBhbmQgZW5kIGRlbGltaXRlcnMgb2Ygb2JqZWN0cyBhbmQgYXJyYXlzLgorICoKKyAqIDxoMz5FbmNvZGluZyBKU09OPC9oMz4KKyAqIFRvIGVuY29kZSB5b3VyIGRhdGEgYXMgSlNPTiwgY3JlYXRlIGEgbmV3IHtAY29kZSBKc29uV3JpdGVyfS4gRWFjaCBKU09OCisgKiBkb2N1bWVudCBtdXN0IGNvbnRhaW4gb25lIHRvcC1sZXZlbCBhcnJheSBvciBvYmplY3QuIENhbGwgbWV0aG9kcyBvbiB0aGUKKyAqIHdyaXRlciBhcyB5b3Ugd2FsayB0aGUgc3RydWN0dXJlJ3MgY29udGVudHMsIG5lc3RpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFzCisgKiBuZWNlc3Nhcnk6CisgKiA8dWw+CisgKiAgIDxsaT5UbyB3cml0ZSA8c3Ryb25nPmFycmF5czwvc3Ryb25nPiwgZmlyc3QgY2FsbCB7QGxpbmsgI2JlZ2luQXJyYXkoKX0uCisgKiAgICAgICBXcml0ZSBlYWNoIG9mIHRoZSBhcnJheSdzIGVsZW1lbnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIHtAbGluayAjdmFsdWV9CisgKiAgICAgICBtZXRob2RzIG9yIGJ5IG5lc3Rpbmcgb3RoZXIgYXJyYXlzIGFuZCBvYmplY3RzLiBGaW5hbGx5IGNsb3NlIHRoZSBhcnJheQorICogICAgICAgdXNpbmcge0BsaW5rICNlbmRBcnJheSgpfS4KKyAqICAgPGxpPlRvIHdyaXRlIDxzdHJvbmc+b2JqZWN0czwvc3Ryb25nPiwgZmlyc3QgY2FsbCB7QGxpbmsgI2JlZ2luT2JqZWN0KCl9LgorICogICAgICAgV3JpdGUgZWFjaCBvZiB0aGUgb2JqZWN0J3MgcHJvcGVydGllcyBieSBhbHRlcm5hdGluZyBjYWxscyB0bworICogICAgICAge0BsaW5rICNuYW1lfSB3aXRoIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLiBXcml0ZSBwcm9wZXJ0eSB2YWx1ZXMgd2l0aCB0aGUKKyAqICAgICAgIGFwcHJvcHJpYXRlIHtAbGluayAjdmFsdWV9IG1ldGhvZCBvciBieSBuZXN0aW5nIG90aGVyIG9iamVjdHMgb3IgYXJyYXlzLgorICogICAgICAgRmluYWxseSBjbG9zZSB0aGUgb2JqZWN0IHVzaW5nIHtAbGluayAjZW5kT2JqZWN0KCl9LgorICogPC91bD4KKyAqCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiBTdXBwb3NlIHdlJ2QgbGlrZSB0byBlbmNvZGUgYSBzdHJlYW0gb2YgbWVzc2FnZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOiA8cHJlPiB7QGNvZGUKKyAqIFsKKyAqICAgeworICogICAgICJpZCI6IDkxMjM0NTY3ODkwMSwKKyAqICAgICAidGV4dCI6ICJIb3cgZG8gSSB3cml0ZSBKU09OIG9uIEFuZHJvaWQ/IiwKKyAqICAgICAiZ2VvIjogbnVsbCwKKyAqICAgICAidXNlciI6IHsKKyAqICAgICAgICJuYW1lIjogImFuZHJvaWRfbmV3YiIsCisgKiAgICAgICAiZm9sbG93ZXJzX2NvdW50IjogNDEKKyAqICAgICAgfQorICogICB9LAorICogICB7CisgKiAgICAgImlkIjogOTEyMzQ1Njc4OTAyLAorICogICAgICJ0ZXh0IjogIkBhbmRyb2lkX25ld2IganVzdCB1c2UgYW5kcm9pZC51dGlsLkpzb25Xcml0ZXIhIiwKKyAqICAgICAiZ2VvIjogWzUwLjQ1NDcyMiwgLTEwNC42MDY2NjddLAorICogICAgICJ1c2VyIjogeworICogICAgICAgIm5hbWUiOiAiamVzc2UiLAorICogICAgICAgImZvbGxvd2Vyc19jb3VudCI6IDIKKyAqICAgICB9CisgKiAgIH0KKyAqIF19PC9wcmU+CisgKiBUaGlzIGNvZGUgZW5jb2RlcyB0aGUgYWJvdmUgc3RydWN0dXJlOiA8cHJlPiAgIHtAY29kZQorICogICBwdWJsaWMgdm9pZCB3cml0ZUpzb25TdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICBKc29uV3JpdGVyIHdyaXRlciA9IG5ldyBKc29uV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGLTgiKSk7CisgKiAgICAgd3JpdGVyLnNldEluZGVudFNwYWNlcyg0KTsKKyAqICAgICB3cml0ZU1lc3NhZ2VzQXJyYXkod3JpdGVyLCBtZXNzYWdlcyk7CisgKiAgICAgd3JpdGVyLmNsb3NlKCk7CisgKiAgIH0KKyAqCisgKiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZXNBcnJheShKc29uV3JpdGVyIHdyaXRlciwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAqICAgICB3cml0ZXIuYmVnaW5BcnJheSgpOworICogICAgIGZvciAoTWVzc2FnZSBtZXNzYWdlIDogbWVzc2FnZXMpIHsKKyAqICAgICAgIHdyaXRlTWVzc2FnZSh3cml0ZXIsIG1lc3NhZ2UpOworICogICAgIH0KKyAqICAgICB3cml0ZXIuZW5kQXJyYXkoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlKEpzb25Xcml0ZXIgd3JpdGVyLCBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd3JpdGVyLm5hbWUoImlkIikudmFsdWUobWVzc2FnZS5nZXRJZCgpKTsKKyAqICAgICB3cml0ZXIubmFtZSgidGV4dCIpLnZhbHVlKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKKyAqICAgICBpZiAobWVzc2FnZS5nZXRHZW8oKSAhPSBudWxsKSB7CisgKiAgICAgICB3cml0ZXIubmFtZSgiZ2VvIik7CisgKiAgICAgICB3cml0ZURvdWJsZXNBcnJheSh3cml0ZXIsIG1lc3NhZ2UuZ2V0R2VvKCkpOworICogICAgIH0gZWxzZSB7CisgKiAgICAgICB3cml0ZXIubmFtZSgiZ2VvIikubnVsbFZhbHVlKCk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5uYW1lKCJ1c2VyIik7CisgKiAgICAgd3JpdGVVc2VyKHdyaXRlciwgbWVzc2FnZS5nZXRVc2VyKCkpOworICogICAgIHdyaXRlci5lbmRPYmplY3QoKTsKKyAqICAgfQorICoKKyAqICAgcHVibGljIHZvaWQgd3JpdGVVc2VyKEpzb25Xcml0ZXIgd3JpdGVyLCBVc2VyIHVzZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgKiAgICAgd3JpdGVyLm5hbWUoIm5hbWUiKS52YWx1ZSh1c2VyLmdldE5hbWUoKSk7CisgKiAgICAgd3JpdGVyLm5hbWUoImZvbGxvd2Vyc19jb3VudCIpLnZhbHVlKHVzZXIuZ2V0Rm9sbG93ZXJzQ291bnQoKSk7CisgKiAgICAgd3JpdGVyLmVuZE9iamVjdCgpOworICogICB9CisgKgorICogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZXNBcnJheShKc29uV3JpdGVyIHdyaXRlciwgTGlzdDxEb3VibGU+IGRvdWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgKiAgICAgd3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAqICAgICBmb3IgKERvdWJsZSB2YWx1ZSA6IGRvdWJsZXMpIHsKKyAqICAgICAgIHdyaXRlci52YWx1ZSh2YWx1ZSk7CisgKiAgICAgfQorICogICAgIHdyaXRlci5lbmRBcnJheSgpOworICogICB9fTwvcHJlPgorICoKKyAqIDxwPkVhY2gge0Bjb2RlIEpzb25Xcml0ZXJ9IG1heSBiZSB1c2VkIHRvIHdyaXRlIGEgc2luZ2xlIEpTT04gc3RyZWFtLgorICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIG5vdCB0aHJlYWQgc2FmZS4gQ2FsbHMgdGhhdCB3b3VsZCByZXN1bHQgaW4gYQorICogbWFsZm9ybWVkIEpTT04gc3RyaW5nIHdpbGwgZmFpbCB3aXRoIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlciBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisKKyAgICAvKiogVGhlIG91dHB1dCBkYXRhLCBjb250YWluaW5nIGF0IG1vc3Qgb25lIHRvcC1sZXZlbCBhcnJheSBvciBvYmplY3QuICovCisgICAgcHJpdmF0ZSBmaW5hbCBXcml0ZXIgb3V0OworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEpzb25TY29wZT4gc3RhY2sgPSBuZXcgQXJyYXlMaXN0PEpzb25TY29wZT4oKTsKKyAgICB7CisgICAgICAgIHN0YWNrLmFkZChKc29uU2NvcGUuRU1QVFlfRE9DVU1FTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmdWxsIHNldCBvZiBzcGFjZXMgZm9yIGEgc2luZ2xlIGxldmVsIG9mCisgICAgICogaW5kZW50YXRpb24sIG9yIG51bGwgZm9yIG5vIHByZXR0eSBwcmludGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbmRlbnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZS92YWx1ZSBzZXBhcmF0b3I7IGVpdGhlciAiOiIgb3IgIjogIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXBhcmF0b3IgPSAiOiI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHRoYXQgd3JpdGVzIGEgSlNPTi1lbmNvZGVkIHN0cmVhbSB0byB7QGNvZGUgb3V0fS4KKyAgICAgKiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgZW5zdXJlIHtAbGluayBXcml0ZXJ9IGlzIGJ1ZmZlcmVkOyB3cmFwcGluZyBpbgorICAgICAqIHtAbGluayBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIEJ1ZmZlcmVkV3JpdGVyfSBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIoV3JpdGVyIG91dCkgeworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigib3V0ID09IG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdG8gYmUgcmVwZWF0ZWQgZm9yIGVhY2ggbGV2ZWwgb2YgaW5kZW50YXRpb24KKyAgICAgKiBpbiB0aGUgZW5jb2RlZCBkb2N1bWVudC4gSWYge0Bjb2RlIGluZGVudC5pc0VtcHR5KCl9IHRoZSBlbmNvZGVkIGRvY3VtZW50CisgICAgICogd2lsbCBiZSBjb21wYWN0LiBPdGhlcndpc2UgdGhlIGVuY29kZWQgZG9jdW1lbnQgd2lsbCBiZSBtb3JlCisgICAgICogaHVtYW4tcmVhZGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZW50IGEgc3RyaW5nIGNvbnRhaW5pbmcgb25seSB3aGl0ZXNwYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7CisgICAgICAgIGlmIChpbmRlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLmluZGVudCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9ICI6IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OworICAgICAgICAgICAgdGhpcy5zZXBhcmF0b3IgPSAiOiAiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW5zIGVuY29kaW5nIGEgbmV3IGFycmF5LiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2QgbXVzdCBiZSBwYWlyZWQgd2l0aAorICAgICAqIGEgY2FsbCB0byB7QGxpbmsgI2VuZEFycmF5fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgYmVnaW5BcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvcGVuKEpzb25TY29wZS5FTVBUWV9BUlJBWSwgIlsiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIGVuY29kaW5nIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBlbmRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbG9zZShKc29uU2NvcGUuRU1QVFlfQVJSQVksIEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSwgIl0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbnMgZW5jb2RpbmcgYSBuZXcgb2JqZWN0LiBFYWNoIGNhbGwgdG8gdGhpcyBtZXRob2QgbXVzdCBiZSBwYWlyZWQKKyAgICAgKiB3aXRoIGEgY2FsbCB0byB7QGxpbmsgI2VuZE9iamVjdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIGJlZ2luT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG9wZW4oSnNvblNjb3BlLkVNUFRZX09CSkVDVCwgInsiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIGVuY29kaW5nIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgZW5kT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlKEpzb25TY29wZS5FTVBUWV9PQkpFQ1QsIEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QsICJ9Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW50ZXJzIGEgbmV3IHNjb3BlIGJ5IGFwcGVuZGluZyBhbnkgbmVjZXNzYXJ5IHdoaXRlc3BhY2UgYW5kIHRoZSBnaXZlbgorICAgICAqIGJyYWNrZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBKc29uV3JpdGVyIG9wZW4oSnNvblNjb3BlIGVtcHR5LCBTdHJpbmcgb3BlbkJyYWNrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKHRydWUpOworICAgICAgICBzdGFjay5hZGQoZW1wdHkpOworICAgICAgICBvdXQud3JpdGUob3BlbkJyYWNrZXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc2NvcGUgYnkgYXBwZW5kaW5nIGFueSBuZWNlc3Nhcnkgd2hpdGVzcGFjZSBhbmQgdGhlCisgICAgICogZ2l2ZW4gYnJhY2tldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25Xcml0ZXIgY2xvc2UoSnNvblNjb3BlIGVtcHR5LCBKc29uU2NvcGUgbm9uZW1wdHksIFN0cmluZyBjbG9zZUJyYWNrZXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uU2NvcGUgY29udGV4dCA9IHBlZWsoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbm9uZW1wdHkgJiYgY29udGV4dCAhPSBlbXB0eSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVzdGluZyBwcm9ibGVtOiAiICsgc3RhY2spOworICAgICAgICB9CisKKyAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgICAgICBpZiAoY29udGV4dCA9PSBub25lbXB0eSkgeworICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZShjbG9zZUJyYWNrZXQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzb25TY29wZSBwZWVrKCkgeworICAgICAgICByZXR1cm4gc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2UgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGggdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXBsYWNlVG9wKEpzb25TY29wZSB0b3BPZlN0YWNrKSB7CisgICAgICAgIHN0YWNrLnNldChzdGFjay5zaXplKCkgLSAxLCB0b3BPZlN0YWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZvcnRoY29taW5nIHZhbHVlLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBuYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5hbWUgPT0gbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGJlZm9yZU5hbWUoKTsKKyAgICAgICAgc3RyaW5nKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHtAY29kZSB2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGxpdGVyYWwgc3RyaW5nIHZhbHVlLCBvciBudWxsIHRvIGVuY29kZSBhIG51bGwgbGl0ZXJhbC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIHN0cmluZyh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciBudWxsVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC53cml0ZSgibnVsbCIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHtAY29kZSB2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc29uV3JpdGVyIHZhbHVlKGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZVZhbHVlKGZhbHNlKTsKKyAgICAgICAgb3V0LndyaXRlKHZhbHVlID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIGZpbml0ZSB2YWx1ZS4gTWF5IG5vdCBiZSB7QGxpbmsgRG91YmxlI2lzTmFOKCkgTmFOc30gb3IKKyAgICAgKiAgICAge0BsaW5rIERvdWJsZSNpc0luZmluaXRlKCkgaW5maW5pdGllc30uCisgICAgICogQHJldHVybiB0aGlzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNvbldyaXRlciB2YWx1ZShkb3VibGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChEb3VibGUuaXNOYU4odmFsdWUpIHx8IERvdWJsZS5pc0luZmluaXRlKHZhbHVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtZXJpYyB2YWx1ZXMgbXVzdCBiZSBmaW5pdGUsIGJ1dCB3YXMgIiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBiZWZvcmVWYWx1ZShmYWxzZSk7CisgICAgICAgIG91dC5hcHBlbmQoRG91YmxlLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMge0Bjb2RlIHZhbHVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIEpzb25Xcml0ZXIgdmFsdWUobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlVmFsdWUoZmFsc2UpOworICAgICAgICBvdXQud3JpdGUoTG9uZy50b1N0cmluZyh2YWx1ZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIGFsbCBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFdyaXRlcn0KKyAgICAgKiBhbmQgZmx1c2hlcyB0aGF0IHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoZXMgYW5kIGNsb3NlcyB0aGlzIHdyaXRlciBhbmQgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBKU09OIGRvY3VtZW50IGlzIGluY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICBpZiAocGVlaygpICE9IEpzb25TY29wZS5OT05FTVBUWV9ET0NVTUVOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbmNvbXBsZXRlIGRvY3VtZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKCJcIiIpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRnJvbSBSRkMgNDYyNywgIkFsbCBVbmljb2RlIGNoYXJhY3RlcnMgbWF5IGJlIHBsYWNlZCB3aXRoaW4gdGhlCisgICAgICAgICAgICAgKiBxdW90YXRpb24gbWFya3MgZXhjZXB0IGZvciB0aGUgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgZXNjYXBlZDoKKyAgICAgICAgICAgICAqIHF1b3RhdGlvbiBtYXJrLCByZXZlcnNlIHNvbGlkdXMsIGFuZCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgKiAoVSswMDAwIHRocm91Z2ggVSswMDFGKS4iCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCdcXCcpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXGIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiXFxuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIlxcciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcXGYiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDFGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoU3RyaW5nLmZvcm1hdCgiXFx1JTA0eCIsIChpbnQpIGMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZSgiXCIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV3bGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbmRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3V0LndyaXRlKCJcbiIpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHN0YWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoaW5kZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgYW55IG5lY2Vzc2FyeSBzZXBhcmF0b3JzIGFuZCB3aGl0ZXNwYWNlIGJlZm9yZSBhIG5hbWUuIEFsc28KKyAgICAgKiBhZGp1c3RzIHRoZSBzdGFjayB0byBleHBlY3QgdGhlIG5hbWUncyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYmVmb3JlTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25TY29wZSBjb250ZXh0ID0gcGVlaygpOworICAgICAgICBpZiAoY29udGV4dCA9PSBKc29uU2NvcGUuTk9ORU1QVFlfT0JKRUNUKSB7IC8vIGZpcnN0IGluIG9iamVjdAorICAgICAgICAgICAgb3V0LndyaXRlKCcsJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dCAhPSBKc29uU2NvcGUuRU1QVFlfT0JKRUNUKSB7IC8vIG5vdCBpbiBhbiBvYmplY3QhCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZXN0aW5nIHByb2JsZW06ICIgKyBzdGFjayk7CisgICAgICAgIH0KKyAgICAgICAgbmV3bGluZSgpOworICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5EQU5HTElOR19OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGFueSBuZWNlc3Nhcnkgc2VwYXJhdG9ycyBhbmQgd2hpdGVzcGFjZSBiZWZvcmUgYSBsaXRlcmFsIHZhbHVlLAorICAgICAqIGlubGluZSBhcnJheSwgb3IgaW5saW5lIG9iamVjdC4gQWxzbyBhZGp1c3RzIHRoZSBzdGFjayB0byBleHBlY3QgZWl0aGVyIGEKKyAgICAgKiBjbG9zaW5nIGJyYWNrZXQgb3IgYW5vdGhlciBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3QgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBuZXcgYXJyYXkgb3Igb2JqZWN0LCB0aGUgdHdvIHZhbHVlcworICAgICAqICAgICBwZXJtaXR0ZWQgYXMgdG9wLWxldmVsIGVsZW1lbnRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVWYWx1ZShib29sZWFuIHJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAocGVlaygpKSB7CisgICAgICAgICAgICBjYXNlIEVNUFRZX0RPQ1VNRU5UOiAvLyBmaXJzdCBpbiBkb2N1bWVudAorICAgICAgICAgICAgICAgIGlmICghcm9vdCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIG11c3Qgc3RhcnQgd2l0aCBhbiBhcnJheSBvciBhbiBvYmplY3QuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGxhY2VUb3AoSnNvblNjb3BlLk5PTkVNUFRZX0RPQ1VNRU5UKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFTVBUWV9BUlJBWTogLy8gZmlyc3QgaW4gYXJyYXkKKyAgICAgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9BUlJBWSk7CisgICAgICAgICAgICAgICAgbmV3bGluZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX0FSUkFZOiAvLyBhbm90aGVyIGluIGFycmF5CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgIG5ld2xpbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBEQU5HTElOR19OQU1FOiAvLyB2YWx1ZSBmb3IgbmFtZQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlVG9wKEpzb25TY29wZS5OT05FTVBUWV9PQkpFQ1QpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE5PTkVNUFRZX0RPQ1VNRU5UOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiBtdXN0IGhhdmUgb25seSBvbmUgdG9wLWxldmVsIHZhbHVlLiIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5lc3RpbmcgcHJvYmxlbTogIiArIHN0YWNrKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUGF0dGVybnMuamF2YQppbmRleCA1Y2JmZDI5Li4zYmNkMjY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1BhdHRlcm5zLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9QYXR0ZXJucy5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiBwdWJsaWMgY2xhc3MgUGF0dGVybnMgewogICAgIC8qKgogICAgICAqICBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWxsIElBTkEgdG9wLWxldmVsIGRvbWFpbnMuCi0gICAgICogIExpc3QgYWNjdXJhdGUgYXMgb2YgMjAxMC8wMi8wNS4gIExpc3QgdGFrZW4gZnJvbToKKyAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzA1LzA2LiAgTGlzdCB0YWtlbiBmcm9tOgogICAgICAqICBodHRwOi8vZGF0YS5pYW5hLm9yZy9UTEQvdGxkcy1hbHBoYS1ieS1kb21haW4udHh0CiAgICAgICogIFRoaXMgcGF0dGVybiBpcyBhdXRvLWdlbmVyYXRlZCBieSBmcmFtZXdvcmtzL2Jhc2UvY29tbW9uL3Rvb2xzL21ha2UtaWFuYS10bGQtcGF0dGVybi5weQogICAgICAqLwpAQCAtNTMsOCArNTMsOCBAQAogICAgICAgICArICJ8dVthZ2tzeXpdIgogICAgICAgICArICJ8dlthY2VnaW51XSIKICAgICAgICAgKyAifHdbZnNdIgotICAgICAgICArICJ8KHhuXFwtXFwtMHp3bTU2ZHx4blxcLVxcLTExYjViczNhOWFqNmd8eG5cXC1cXC04MGFraGJ5a25qNGZ8eG5cXC1cXC05dDRiMTF5aTVhfHhuXFwtXFwtZGViYTBhZHx4blxcLVxcLWc2dzI1MWR8eG5cXC1cXC1oZ2JrNmFqN2Y1M2JiYXx4blxcLVxcLWhsY2o2YXlhOWVzYzdhfHhuXFwtXFwtanhhbHBkbHB8eG5cXC1cXC1rZ2JlY2h0dnx4blxcLVxcLXpja3phaCkiCi0gICAgICAgICsgInx5W2V0dV0iCisgICAgICAgICsgInwoeG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpIgorICAgICAgICArICJ8eVtldF0iCiAgICAgICAgICsgInx6W2Ftd10pIjsKIAogICAgIC8qKgpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgLyoqCiAgICAgICogIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhbGwgSUFOQSB0b3AtbGV2ZWwgZG9tYWlucyBmb3IgV0VCX1VSTC4KLSAgICAgKiAgTGlzdCBhY2N1cmF0ZSBhcyBvZiAyMDEwLzAyLzA1LiAgTGlzdCB0YWtlbiBmcm9tOgorICAgICAqICBMaXN0IGFjY3VyYXRlIGFzIG9mIDIwMTAvMDUvMDYuICBMaXN0IHRha2VuIGZyb206CiAgICAgICogIGh0dHA6Ly9kYXRhLmlhbmEub3JnL1RMRC90bGRzLWFscGhhLWJ5LWRvbWFpbi50eHQKICAgICAgKiAgVGhpcyBwYXR0ZXJuIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IGZyYW1ld29ya3MvYmFzZS9jb21tb24vdG9vbHMvbWFrZS1pYW5hLXRsZC1wYXR0ZXJuLnB5CiAgICAgICovCkBAIC05NCw4ICs5NCw4IEBACiAgICAgICAgICsgInx1W2Fna3N5el0iCiAgICAgICAgICsgInx2W2FjZWdpbnVdIgogICAgICAgICArICJ8d1tmc10iCi0gICAgICAgICsgInwoPzp4blxcLVxcLTB6d201NmR8eG5cXC1cXC0xMWI1YnMzYTlhajZnfHhuXFwtXFwtODBha2hieWtuajRmfHhuXFwtXFwtOXQ0YjExeWk1YXx4blxcLVxcLWRlYmEwYWR8eG5cXC1cXC1nNncyNTFkfHhuXFwtXFwtaGdiazZhajdmNTNiYmF8eG5cXC1cXC1obGNqNmF5YTllc2M3YXx4blxcLVxcLWp4YWxwZGxwfHhuXFwtXFwta2diZWNodHZ8eG5cXC1cXC16Y2t6YWgpIgotICAgICAgICArICJ8eVtldHVdIgorICAgICAgICArICJ8KD86eG5cXC1cXC0wendtNTZkfHhuXFwtXFwtMTFiNWJzM2E5YWo2Z3x4blxcLVxcLTgwYWtoYnlrbmo0Znx4blxcLVxcLTl0NGIxMXlpNWF8eG5cXC1cXC1kZWJhMGFkfHhuXFwtXFwtZzZ3MjUxZHx4blxcLVxcLWhnYms2YWo3ZjUzYmJhfHhuXFwtXFwtaGxjajZheWE5ZXNjN2F8eG5cXC1cXC1qeGFscGRscHx4blxcLVxcLWtnYmVjaHR2fHhuXFwtXFwtbWdiYWFtN2E4aHx4blxcLVxcLW1nYmVycDRhNWQ0YXJ8eG5cXC1cXC13Z2JoMWN8eG5cXC1cXC16Y2t6YWgpIgorICAgICAgICArICJ8eVtldF0iCiAgICAgICAgICsgInx6W2Ftd10pKSI7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvU3BhcnNlQXJyYXkuamF2YQppbmRleCAxYzhiMzMwLi43ZmM0M2I5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1NwYXJzZUFycmF5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9TcGFyc2VBcnJheS5qYXZhCkBAIC05MCw2ICs5MCwxNiBAQAogICAgICAgICBkZWxldGUoa2V5KTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXQoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChtVmFsdWVzW2luZGV4XSAhPSBERUxFVEVEKSB7CisgICAgICAgICAgICBtVmFsdWVzW2luZGV4XSA9IERFTEVURUQ7CisgICAgICAgICAgICBtR2FyYmFnZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgcHJpdmF0ZSB2b2lkIGdjKCkgewogICAgICAgICAvLyBMb2cuZSgiU3BhcnNlQXJyYXkiLCAiZ2Mgc3RhcnQgd2l0aCAiICsgbVNpemUpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9UaW1pbmdMb2dnZXIuamF2YQppbmRleCAwZjM5Yzk3Li5iZTQ0MmRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1RpbWluZ0xvZ2dlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvVGltaW5nTG9nZ2VyLmphdmEKQEAgLTI0LDIyICsyNCwyNiBAQAogICogQSB1dGlsaXR5IGNsYXNzIHRvIGhlbHAgbG9nIHRpbWluZ3Mgc3BsaXRzIHRocm91Z2hvdXQgYSBtZXRob2QgY2FsbC4KICAqIFR5cGljYWwgdXNhZ2UgaXM6CiAgKgotICogVGltaW5nTG9nZ2VyIHRpbWluZ3MgPSBuZXcgVGltaW5nTG9nZ2VyKFRBRywgIm1ldGhvZEEiKTsKLSAqIC4uLiBkbyBzb21lIHdvcmsgQSAuLi4KLSAqIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQSIpOwotICogLi4uIGRvIHNvbWUgd29yayBCIC4uLgotICogdGltaW5ncy5hZGRTcGxpdCgid29yayBCIik7Ci0gKiAuLi4gZG8gc29tZSB3b3JrIEMgLi4uCi0gKiB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEMiKTsKLSAqIHRpbWluZ3MuZHVtcFRvTG9nKCk7CisgKiA8cHJlPgorICogICAgIFRpbWluZ0xvZ2dlciB0aW1pbmdzID0gbmV3IFRpbWluZ0xvZ2dlcihUQUcsICJtZXRob2RBIik7CisgKiAgICAgLy8gLi4uIGRvIHNvbWUgd29yayBBIC4uLgorICogICAgIHRpbWluZ3MuYWRkU3BsaXQoIndvcmsgQSIpOworICogICAgIC8vIC4uLiBkbyBzb21lIHdvcmsgQiAuLi4KKyAqICAgICB0aW1pbmdzLmFkZFNwbGl0KCJ3b3JrIEIiKTsKKyAqICAgICAvLyAuLi4gZG8gc29tZSB3b3JrIEMgLi4uCisgKiAgICAgdGltaW5ncy5hZGRTcGxpdCgid29yayBDIik7CisgKiAgICAgdGltaW5ncy5kdW1wVG9Mb2coKTsKKyAqIDwvcHJlPgogICoKLSAqIFRoZSBkdW1wVG9Mb2cgY2FsbCB3b3VsZCBhZGQgdGhlIGZvbGxvd2luZyB0byB0aGUgbG9nOgorICogPHA+VGhlIGR1bXBUb0xvZyBjYWxsIHdvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBsb2c6PC9wPgogICoKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiBiZWdpbgotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgOSBtcywgd29yayBBCi0gKiBEL1RBRyAgICAgKCAzNDU5KTogbWV0aG9kQTogICAgICAxIG1zLCB3b3JrIEIKLSAqIEQvVEFHICAgICAoIDM0NTkpOiBtZXRob2RBOiAgICAgIDYgbXMsIHdvcmsgQwotICogRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGVuZCwgMTYgbXMKKyAqIDxwcmU+CisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGJlZ2luCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgOSBtcywgd29yayBBCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgMSBtcywgd29yayBCCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6ICAgICAgNiBtcywgd29yayBDCisgKiAgICAgRC9UQUcgICAgICggMzQ1OSk6IG1ldGhvZEE6IGVuZCwgMTYgbXMKKyAqIDwvcHJlPgogICovCiBwdWJsaWMgY2xhc3MgVGltaW5nTG9nZ2VyIHsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0FjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmFmYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9BY3Rpb25Nb2RlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldzsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjb250ZXh0dWFsIG1vZGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBBY3Rpb24gbW9kZXMgY2FuIGJlIHVzZWQgZm9yCisgKiBtb2RhbCBpbnRlcmFjdGlvbnMgd2l0aCBjb250ZW50IGFuZCByZXBsYWNlIHBhcnRzIG9mIHRoZSBub3JtYWwgVUkgdW50aWwgZmluaXNoZWQuCisgKiBFeGFtcGxlcyBvZiBnb29kIGFjdGlvbiBtb2RlcyBpbmNsdWRlIHNlbGVjdGlvbiBtb2Rlcywgc2VhcmNoLCBjb250ZW50IGVkaXRpbmcsIGV0Yy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbk1vZGUgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBzdHJpbmcgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShpbnQpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBhY3Rpb24gbW9kZS4gVGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0IGlmCisgICAgICogYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzSWQgUmVzb3VyY2UgSUQgb2YgYSBzdHJpbmcgdG8gc2V0IGFzIHRoZSB0aXRsZQorICAgICAqCisgICAgICogQHNlZSAjc2V0VGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqIEBzZWUgI3NldEN1c3RvbVZpZXcoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdWJ0aXRsZSBvZiB0aGUgYWN0aW9uIG1vZGUuIFRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCBpZgorICAgICAqIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnRpdGxlIFN1YnRpdGxlIHN0cmluZyB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFN1YnRpdGxlKGludCkKKyAgICAgKiBAc2VlICNzZXRDdXN0b21WaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3VidGl0bGUgb2YgdGhlIGFjdGlvbiBtb2RlLiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QgaWYKKyAgICAgKiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBSZXNvdXJjZSBJRCBvZiBhIHN0cmluZyB0byBzZXQgYXMgdGhlIHN1YnRpdGxlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0Q3VzdG9tVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFN1YnRpdGxlKGludCByZXNJZCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGN1c3RvbSB2aWV3IHdpbGwgdGFrZSB0aGUgcGxhY2Ugb2YKKyAgICAgKiB0aGUgdGl0bGUgYW5kIHN1YnRpdGxlLiBVc2VmdWwgZm9yIHRoaW5ncyBsaWtlIHNlYXJjaCBib3hlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3IEN1c3RvbSB2aWV3IHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgdGl0bGUvc3VidGl0bGUuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICogQHNlZSAjc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGUgdGhlIGFjdGlvbiBtb2RlIGFuZCByZWZyZXNoIG1lbnUgY29udGVudC4gVGhlIG1vZGUncworICAgICAqIHtAbGluayBBY3Rpb25Nb2RlLkNhbGxiYWNrfSB3aWxsIGhhdmUgaXRzCisgICAgICoge0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG1ldGhvZCBjYWxsZWQuCisgICAgICogSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBtZW51IHdpbGwgYmUgc2Nhbm5lZCBmb3IgdXBkYXRlZCBjb250ZW50IGFuZCBhbnkgcmVsZXZhbnQgY2hhbmdlcworICAgICAqIHdpbGwgYmUgcmVmbGVjdGVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludmFsaWRhdGUoKTsKKworICAgIC8qKgorICAgICAqIEZpbmlzaCBhbmQgY2xvc2UgdGhpcyBhY3Rpb24gbW9kZS4gVGhlIGFjdGlvbiBtb2RlJ3Mge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IHdpbGwKKyAgICAgKiBoYXZlIGl0cyB7QGxpbmsgQ2FsbGJhY2sjb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlKX0gbWV0aG9kIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaW5pc2goKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lbnUgb2YgYWN0aW9ucyB0aGF0IHRoaXMgYWN0aW9uIG1vZGUgcHJlc2VudHMuCisgICAgICogQHJldHVybiBUaGUgYWN0aW9uIG1vZGUncyBtZW51LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51IGdldE1lbnUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGl0bGUgb2YgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRpdGxlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1YnRpdGxlIG9mIHRoaXMgYWN0aW9uIG1vZGUuCisgICAgICogQHJldHVybiBTdWJ0aXRsZSB0ZXh0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBjdXN0b20gdmlldyBmb3IgdGhpcyBhY3Rpb24gbW9kZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGN1c3RvbSB2aWV3CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFZpZXcgZ2V0Q3VzdG9tVmlldygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBNZW51SW5mbGF0ZXJ9IHdpdGggdGhlIEFjdGlvbk1vZGUncyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIGFjdGlvbiBtb2Rlcy4gU3VwcGxpZWQgdG8KKyAgICAgKiB7QGxpbmsgVmlldyNzdGFydEFjdGlvbk1vZGUoQ2FsbGJhY2spfSwgYSBDYWxsYmFjaworICAgICAqIGNvbmZpZ3VyZXMgYW5kIGhhbmRsZXMgZXZlbnRzIHJhaXNlZCBieSBhIHVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIGFuIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogPHA+QW4gYWN0aW9uIG1vZGUncyBsaWZlY3ljbGUgaXMgYXMgZm9sbG93czoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IG9uY2Ugb24gaW5pdGlhbAorICAgICAqIGNyZWF0aW9uPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIENhbGxiYWNrI29uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSwgTWVudSl9IGFmdGVyIGNyZWF0aW9uCisgICAgICogYW5kIGFueSB0aW1lIHRoZSB7QGxpbmsgQWN0aW9uTW9kZX0gaXMgaW52YWxpZGF0ZWQ8L2xpPgorICAgICAqIDxsaT57QGxpbmsgQ2FsbGJhY2sjb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlLCBNZW51SXRlbSl9IGFueSB0aW1lIGEKKyAgICAgKiBjb250ZXh0dWFsIGFjdGlvbiBidXR0b24gaXMgY2xpY2tlZDwvbGk+CisgICAgICogPGxpPntAbGluayBDYWxsYmFjayNvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUpfSB3aGVuIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIGlzIGNsb3NlZDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFjdGlvbiBtb2RlIGlzIGZpcnN0IGNyZWF0ZWQuIFRoZSBtZW51IHN1cHBsaWVkIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgKiBnZW5lcmF0ZSBhY3Rpb24gYnV0dG9ucyBmb3IgdGhlIGFjdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIGNyZWF0ZWQKKyAgICAgICAgICogQHBhcmFtIG1lbnUgTWVudSB1c2VkIHRvIHBvcHVsYXRlIGFjdGlvbiBidXR0b25zCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIG1vZGUgc2hvdWxkIGJlIGNyZWF0ZWQsIGZhbHNlIGlmIGVudGVyaW5nIHRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgIG1vZGUgc2hvdWxkIGJlIGFib3J0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVmcmVzaCBhbiBhY3Rpb24gbW9kZSdzIGFjdGlvbiBtZW51IHdoZW5ldmVyIGl0IGlzIGludmFsaWRhdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBBY3Rpb25Nb2RlIGJlaW5nIHByZXBhcmVkCisgICAgICAgICAqIEBwYXJhbSBtZW51IE1lbnUgdXNlZCB0byBwb3B1bGF0ZSBhY3Rpb24gYnV0dG9ucworICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lbnUgb3IgYWN0aW9uIG1vZGUgd2FzIHVwZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgdG8gcmVwb3J0IGEgdXNlciBjbGljayBvbiBhbiBhY3Rpb24gYnV0dG9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBUaGUgY3VycmVudCBBY3Rpb25Nb2RlCisgICAgICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIGNsaWNrZWQKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbGJhY2sgaGFuZGxlZCB0aGUgZXZlbnQsIGZhbHNlIGlmIHRoZSBzdGFuZGFyZCBNZW51SXRlbQorICAgICAgICAgKiAgICAgICAgICBpbnZvY2F0aW9uIHNob3VsZCBjb250aW51ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYW4gYWN0aW9uIG1vZGUgaXMgYWJvdXQgdG8gYmUgZXhpdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBjdXJyZW50IEFjdGlvbk1vZGUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTVkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCkBAIC0wLDAgKzEsODI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpY3R1cmU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZFN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgQ2FudmFzIG9uIHRvcCBvZiBPcGVuR0wgRVMgMi4wLgorICovCitjbGFzcyBHTEVTMjBDYW52YXMgZXh0ZW5kcyBDYW52YXMgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBHTCBtR2w7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1PcGFxdWU7CisgICAgcHJpdmF0ZSBpbnQgbVJlbmRlcmVyOworICAgIAorICAgIHByaXZhdGUgaW50IG1XaWR0aDsKKyAgICBwcml2YXRlIGludCBtSGVpZ2h0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtUG9pbnQgPSBuZXcgZmxvYXRbMl07CisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1MaW5lID0gbmV3IGZsb2F0WzRdOworICAgIAorICAgIHByaXZhdGUgZmluYWwgUmVjdCBtQ2xpcEJvdW5kcyA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIERyYXdGaWx0ZXIgbUZpbHRlcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ29udGV4dExvY2tlZDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEpOSQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbklzQXZhaWxhYmxlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSXNBdmFpbGFibGUgPSBuSXNBdmFpbGFibGUoKTsKKworICAgIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gc0lzQXZhaWxhYmxlOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorICAgIEdMRVMyMENhbnZhcyhHTCBnbCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBtR2wgPSBnbDsKKyAgICAgICAgbU9wYXF1ZSA9ICF0cmFuc2x1Y2VudDsKKworICAgICAgICBtUmVuZGVyZXIgPSBuQ3JlYXRlUmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKG1SZW5kZXJlciA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIEdMRVMyMENhbnZhcyByZW5kZXJlciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuQ3JlYXRlUmVuZGVyZXIoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBjYWxsZWQgYmVmb3JlIHJlbGVhc2luZyBhCisgICAgICogcmVmZXJlbmNlIHRvIGEgR0xFUzIwQ2FudmFzLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworICAgICAqIG5hdGl2ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZS4gTm90IGludm9raW5nIHRoaXMKKyAgICAgKiBtZXRob2QgcHJvcGVybHkgY2FuIHJlc3VsdCBpbiBtZW1vcnkgbGVha3MuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgaWYgKG1SZW5kZXJlciAhPSAwKSB7CisgICAgICAgICAgICBuRGVzdHJveVJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRGVzdHJveVJlbmRlcmVyKGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDYW52YXMgbWFuYWdlbWVudAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7CisgICAgICAgIHJldHVybiBtT3BhcXVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiBtV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtSGVpZ2h0OworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNldHVwCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgblNldFZpZXdwb3J0KG1SZW5kZXJlciwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldFZpZXdwb3J0KGludCByZW5kZXJlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICBuUHJlcGFyZShtUmVuZGVyZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5QcmVwYXJlKGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKCFtQ29udGV4dExvY2tlZCkgeworICAgICAgICAgICAgbkFjcXVpcmVDb250ZXh0KG1SZW5kZXJlcik7CisgICAgICAgICAgICBtQ29udGV4dExvY2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0TG9ja2VkOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkFjcXVpcmVDb250ZXh0KGludCByZW5kZXJlcik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29udGV4dCgpIHsKKyAgICAgICAgaWYgKG1Db250ZXh0TG9ja2VkKSB7CisgICAgICAgICAgICBuUmVsZWFzZUNvbnRleHQobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIG1Db250ZXh0TG9ja2VkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5SZWxlYXNlQ29udGV4dChpbnQgcmVuZGVyZXIpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ2xpcHBpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBQYXRoKFBhdGggcGF0aCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUGF0aChQYXRoIHBhdGgsIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5DbGlwUmVjdChpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBvcCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbkNsaXBSZWN0KGludCByZW5kZXJlciwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSwgaW50IG9wKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3QgcmVjdCkgeworICAgICAgICByZXR1cm4gbkNsaXBSZWN0KG1SZW5kZXJlciwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgUmVnaW9uLk9wLklOVEVSU0VDVC5uYXRpdmVJbnQpOyAgICAgICAgCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xpcFJlY3QoUmVjdCByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWN0KFJlY3RGIHJlY3QpIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5JTlRFUlNFQ1QubmF0aXZlSW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVjdChSZWN0RiByZWN0LCBSZWdpb24uT3Agb3ApIHsKKyAgICAgICAgcmV0dXJuIG5DbGlwUmVjdChtUmVuZGVyZXIsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBvcC5uYXRpdmVJbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBSZWdpb24oUmVnaW9uIHJlZ2lvbikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjbGlwUmVnaW9uKFJlZ2lvbiByZWdpb24sIFJlZ2lvbi5PcCBvcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGlwQm91bmRzKFJlY3QgYm91bmRzKSB7CisgICAgICAgIHJldHVybiBuR2V0Q2xpcEJvdW5kcyhtUmVuZGVyZXIsIGJvdW5kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuR2V0Q2xpcEJvdW5kcyhpbnQgcmVuZGVyZXIsIFJlY3QgYm91bmRzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgRWRnZVR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gblF1aWNrUmVqZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0eXBlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gblF1aWNrUmVqZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgaW50IGVkZ2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcXVpY2tSZWplY3QoUGF0aCBwYXRoLCBFZGdlVHlwZSB0eXBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHF1aWNrUmVqZWN0KFJlY3RGIHJlY3QsIEVkZ2VUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHF1aWNrUmVqZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUcmFuc2Zvcm1hdGlvbnMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAgICAgblRyYW5zbGF0ZShtUmVuZGVyZXIsIGR4LCBkeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblRyYW5zbGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGR4LCBmbG9hdCBkeSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2V3KGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgICAgICBuUm90YXRlKG1SZW5kZXJlciwgZGVncmVlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJvdGF0ZShpbnQgcmVuZGVyZXIsIGZsb2F0IGRlZ3JlZXMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5KSB7CisgICAgICAgIG5TY2FsZShtUmVuZGVyZXIsIHN4LCBzeSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNjYWxlKGludCByZW5kZXJlciwgZmxvYXQgc3gsIGZsb2F0IHN5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChNYXRyaXggbWF0cml4KSB7CisgICAgICAgIG5TZXRNYXRyaXgobVJlbmRlcmVyLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0TWF0cml4KGludCByZW5kZXJlciwgaW50IG1hdHJpeCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXRyaXgoTWF0cml4IG1hdHJpeCkgeworICAgICAgICBuR2V0TWF0cml4KG1SZW5kZXJlciwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkdldE1hdHJpeChpbnQgcmVuZGVyZXIsIGludCBtYXRyaXgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uY2F0KE1hdHJpeCBtYXRyaXgpIHsKKyAgICAgICAgbkNvbmNhdE1hdHJpeChtUmVuZGVyZXIsIG1hdHJpeC5uYXRpdmVfaW5zdGFuY2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5Db25jYXRNYXRyaXgoaW50IHJlbmRlcmVyLCBpbnQgbWF0cml4KTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0ZSBtYW5hZ2VtZW50CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmUoKSB7CisgICAgICAgIHJldHVybiBuU2F2ZShtUmVuZGVyZXIsIENhbnZhcy5DTElQX1NBVkVfRkxBRyB8IENhbnZhcy5NQVRSSVhfU0FWRV9GTEFHKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlKGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlKG1SZW5kZXJlciwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgblNhdmUoaW50IHJlbmRlcmVyLCBpbnQgZmxhZ3MpOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyKFJlY3RGIGJvdW5kcywgUGFpbnQgcGFpbnQsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIFBhaW50IHBhaW50LAorICAgICAgICAgICAgaW50IHNhdmVGbGFncykgeworICAgICAgICBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXIobVJlbmRlcmVyLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG5hdGl2ZVBhaW50LCBzYXZlRmxhZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuU2F2ZUxheWVyKGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50LCBpbnQgc2F2ZUZsYWdzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2F2ZUxheWVyQWxwaGEoUmVjdEYgYm91bmRzLCBpbnQgYWxwaGEsIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllckFscGhhKGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sCisgICAgICAgICAgICAgICAgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwKKyAgICAgICAgICAgIGludCBzYXZlRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5TYXZlTGF5ZXJBbHBoYShtUmVuZGVyZXIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5TYXZlTGF5ZXJBbHBoYShpbnQgcmVuZGVyZXIsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgaW50IHNhdmVGbGFncyk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZSgpIHsKKyAgICAgICAgblJlc3RvcmUobVJlbmRlcmVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuUmVzdG9yZShpbnQgcmVuZGVyZXIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzdG9yZVRvQ291bnQoaW50IHNhdmVDb3VudCkgeworICAgICAgICBuUmVzdG9yZVRvQ291bnQobVJlbmRlcmVyLCBzYXZlQ291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc3RvcmVUb0NvdW50KGludCByZW5kZXJlciwgaW50IHNhdmVDb3VudCk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTYXZlQ291bnQoKSB7CisgICAgICAgIHJldHVybiBuR2V0U2F2ZUNvdW50KG1SZW5kZXJlcik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIGludCBuR2V0U2F2ZUNvdW50KGludCByZW5kZXJlcik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBGaWx0ZXJpbmcKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERyYXdGaWx0ZXIoRHJhd0ZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgbUZpbHRlciA9IGZpbHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRHJhd0ZpbHRlciBnZXREcmF3RmlsdGVyKCkgeworICAgICAgICByZXR1cm4gbUZpbHRlcjsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBEcmF3aW5nCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3QXJjKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUsIGJvb2xlYW4gdXNlQ2VudGVyLAorICAgICAgICAgICAgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0FSR0IoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICAgICAgZHJhd0NvbG9yKChhICYgMHhGRikgPDwgMjQgfCAociAmIDB4RkYpIDw8IDE2IHwgKGcgJiAweEZGKSA8PCA4IHwgKGIgJiAweEZGKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BhdGNoKEJpdG1hcCBiaXRtYXAsIGJ5dGVbXSBjaHVua3MsIFJlY3RGIGRzdCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgcGF0Y2hlcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3UGF0Y2gobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgY2h1bmtzLCBkc3QubGVmdCwgZHN0LnRvcCwKKyAgICAgICAgICAgICAgICBkc3QucmlnaHQsIGRzdC5ib3R0b20sIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UGF0Y2goaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBieXRlW10gY2h1bmtzLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgICAgICBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworICAgICAgICBuRHJhd0JpdG1hcChtUmVuZGVyZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwLCBsZWZ0LCB0b3AsIG5hdGl2ZVBhaW50KTsKKyAgICAgICAgaWYgKGhhc0NvbG9yRmlsdGVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3Qml0bWFwKGludCByZW5kZXJlciwgaW50IGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBNYXRyaXggbWF0cml4LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgbWF0cml4Lm5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdCaXRtYXAoaW50IHJlbmRlcmVyLCBpbnQgYml0bWFwLCBpbnQgbWF0cml4LCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdCBkc3QsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgYm9vbGVhbiBoYXNDb2xvckZpbHRlciA9IHBhaW50ICE9IG51bGwgJiYgc2V0dXBDb2xvckZpbHRlcihwYWludCk7CisgICAgICAgIGZpbmFsIGludCBuYXRpdmVQYWludCA9IHBhaW50ID09IG51bGwgPyAwIDogcGFpbnQubU5hdGl2ZVBhaW50OworCisgICAgICAgIGludCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGVmdCA9IHRvcCA9IDA7CisgICAgICAgICAgICByaWdodCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgYm90dG9tID0gYml0bWFwLmdldEhlaWdodCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVmdCA9IHNyYy5sZWZ0OworICAgICAgICAgICAgcmlnaHQgPSBzcmMucmlnaHQ7CisgICAgICAgICAgICB0b3AgPSBzcmMudG9wOworICAgICAgICAgICAgYm90dG9tID0gc3JjLmJvdHRvbTsKKyAgICAgICAgfQorCisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYml0bWFwLm1OYXRpdmVCaXRtYXAsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0JpdG1hcChCaXRtYXAgYml0bWFwLCBSZWN0IHNyYywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBTaGFkZXJzIGFyZSBpZ25vcmVkIHdoZW4gZHJhd2luZyBiaXRtYXBzCisgICAgICAgIGJvb2xlYW4gaGFzQ29sb3JGaWx0ZXIgPSBwYWludCAhPSBudWxsICYmIHNldHVwQ29sb3JGaWx0ZXIocGFpbnQpOworICAgICAgICBmaW5hbCBpbnQgbmF0aXZlUGFpbnQgPSBwYWludCA9PSBudWxsID8gMCA6IHBhaW50Lm1OYXRpdmVQYWludDsKKyAgICAgICAgbkRyYXdCaXRtYXAobVJlbmRlcmVyLCBiaXRtYXAubU5hdGl2ZUJpdG1hcCwgc3JjLmxlZnQsIHNyYy50b3AsIHNyYy5yaWdodCwgc3JjLmJvdHRvbSwKKyAgICAgICAgICAgICAgICBkc3QubGVmdCwgZHN0LnRvcCwgZHN0LnJpZ2h0LCBkc3QuYm90dG9tLCBuYXRpdmVQYWludCk7CisgICAgICAgIGlmIChoYXNDb2xvckZpbHRlcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd0JpdG1hcChpbnQgcmVuZGVyZXIsIGludCBiaXRtYXAsCisgICAgICAgICAgICBmbG9hdCBzcmNMZWZ0LCBmbG9hdCBzcmNUb3AsIGZsb2F0IHNyY1JpZ2h0LCBmbG9hdCBzcmNCb3R0b20sCisgICAgICAgICAgICBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwKGludFtdIGNvbG9ycywgaW50IG9mZnNldCwgaW50IHN0cmlkZSwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBoYXNBbHBoYSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gU2hhZGVycyBhcmUgaWdub3JlZCB3aGVuIGRyYXdpbmcgYml0bWFwcworICAgICAgICBib29sZWFuIGhhc0NvbG9yRmlsdGVyID0gcGFpbnQgIT0gbnVsbCAmJiBzZXR1cENvbG9yRmlsdGVyKHBhaW50KTsKKyAgICAgICAgZmluYWwgQml0bWFwLkNvbmZpZyBjb25maWcgPSBoYXNBbHBoYSA/IEJpdG1hcC5Db25maWcuQVJHQl84ODg4IDogQml0bWFwLkNvbmZpZy5SR0JfNTY1OworICAgICAgICBmaW5hbCBCaXRtYXAgYiA9IEJpdG1hcC5jcmVhdGVCaXRtYXAoY29sb3JzLCBvZmZzZXQsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgY29uZmlnKTsKKyAgICAgICAgZmluYWwgaW50IG5hdGl2ZVBhaW50ID0gcGFpbnQgPT0gbnVsbCA/IDAgOiBwYWludC5tTmF0aXZlUGFpbnQ7CisgICAgICAgIG5EcmF3Qml0bWFwKG1SZW5kZXJlciwgYi5tTmF0aXZlQml0bWFwLCB4LCB5LCBuYXRpdmVQYWludCk7CisgICAgICAgIGIucmVjeWNsZSgpOworICAgICAgICBpZiAoaGFzQ29sb3JGaWx0ZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdCaXRtYXAoaW50W10gY29sb3JzLCBpbnQgb2Zmc2V0LCBpbnQgc3RyaWRlLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2xlYW4gaGFzQWxwaGEsIFBhaW50IHBhaW50KSB7CisgICAgICAgIC8vIFNoYWRlcnMgYXJlIGlnbm9yZWQgd2hlbiBkcmF3aW5nIGJpdG1hcHMKKyAgICAgICAgZHJhd0JpdG1hcChjb2xvcnMsIG9mZnNldCwgc3RyaWRlLCAoZmxvYXQpIHgsIChmbG9hdCkgeSwgd2lkdGgsIGhlaWdodCwgaGFzQWxwaGEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Qml0bWFwTWVzaChCaXRtYXAgYml0bWFwLCBpbnQgbWVzaFdpZHRoLCBpbnQgbWVzaEhlaWdodCwgZmxvYXRbXSB2ZXJ0cywKKyAgICAgICAgICAgIGludCB2ZXJ0T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NpcmNsZShmbG9hdCBjeCwgZmxvYXQgY3ksIGZsb2F0IHJhZGl1cywgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvcikgeworICAgICAgICBkcmF3Q29sb3IoY29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfT1ZFUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgbkRyYXdDb2xvcihtUmVuZGVyZXIsIGNvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdDb2xvcihpbnQgcmVuZGVyZXIsIGludCBjb2xvciwgaW50IG1vZGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmUoZmxvYXQgc3RhcnRYLCBmbG9hdCBzdGFydFksIGZsb2F0IHN0b3BYLCBmbG9hdCBzdG9wWSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgbUxpbmVbMF0gPSBzdGFydFg7CisgICAgICAgIG1MaW5lWzFdID0gc3RhcnRZOworICAgICAgICBtTGluZVsyXSA9IHN0b3BYOworICAgICAgICBtTGluZVszXSA9IHN0b3BZOworICAgICAgICBkcmF3TGluZXMobUxpbmUsIDAsIDEsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3TGluZXMoZmxvYXRbXSBwdHMsIGludCBvZmZzZXQsIGludCBjb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd0xpbmVzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3TGluZXMocHRzLCAwLCBwdHMubGVuZ3RoIC8gNCwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdPdmFsKFJlY3RGIG92YWwsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQYWludChQYWludCBwYWludCkgeworICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQ2xpcEJvdW5kczsKKyAgICAgICAgbkdldENsaXBCb3VuZHMobVJlbmRlcmVyLCByKTsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0aChQYXRoIHBhdGgsIFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIGlmIChwYXRoLmlzU2ltcGxlUGF0aCkgeworICAgICAgICAgICAgaWYgKHBhdGgucmVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5EcmF3UmVjdHMobVJlbmRlcmVyLCBwYXRoLnJlY3RzLm1OYXRpdmVSZWdpb24sIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuRHJhd1BhdGgobVJlbmRlcmVyLCBwYXRoLm1OYXRpdmVQYXRoLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1BhdGgoaW50IHJlbmRlcmVyLCBpbnQgcGF0aCwgaW50IHBhaW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5EcmF3UmVjdHMoaW50IHJlbmRlcmVyLCBpbnQgcmVnaW9uLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdQaWN0dXJlKFBpY3R1cmUgcGljdHVyZSwgUmVjdCBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BpY3R1cmUoUGljdHVyZSBwaWN0dXJlLCBSZWN0RiBkc3QpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50KGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIG1Qb2ludFswXSA9IHg7CisgICAgICAgIG1Qb2ludFsxXSA9IHk7CisgICAgICAgIGRyYXdQb2ludHMobVBvaW50LCAwLCAxLCBwYWludCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1BvaW50cyhmbG9hdFtdIHB0cywgaW50IG9mZnNldCwgaW50IGNvdW50LCBQYWludCBwYWludCkgeworICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9pbnRzKGZsb2F0W10gcHRzLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UG9pbnRzKHB0cywgMCwgcHRzLmxlbmd0aCAvIDIsIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gcG9zLCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UG9zVGV4dChTdHJpbmcgdGV4dCwgZmxvYXRbXSBwb3MsIFBhaW50IHBhaW50KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgbkRyYXdSZWN0KG1SZW5kZXJlciwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdSZWN0KGludCByZW5kZXJlciwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IHBhaW50KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSZWN0KFJlY3QgciwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgZHJhd1JlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHBhaW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3UmVjdChSZWN0RiByLCBQYWludCBwYWludCkgeworICAgICAgICBkcmF3UmVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgcGFpbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRyYXdSR0IoaW50IHIsIGludCBnLCBpbnQgYikgeworICAgICAgICBkcmF3Q29sb3IoMHhGRjAwMDAwMCB8IChyICYgMHhGRikgPDwgMTYgfCAoZyAmIDB4RkYpIDw8IDggfCAoYiAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3Um91bmRSZWN0KFJlY3RGIHJlY3QsIGZsb2F0IHJ4LCBmbG9hdCByeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCAoaW5kZXggKyBjb3VudCkgfCAodGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSkgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNNb2RpZmllcikgblJlc2V0TW9kaWZpZXJzKG1SZW5kZXJlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHQoaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0KHRoaXMsIHN0YXJ0LCBlbmQsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCBidWYsIDAsIGVuZCAtIHN0YXJ0LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IChlbmQgLSBzdGFydCkgfCAodGV4dC5sZW5ndGgoKSAtIGVuZCkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHQobVJlbmRlcmVyLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0KGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGludCBwYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dChTdHJpbmcgdGV4dCwgZmxvYXQgeCwgZmxvYXQgeSwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgYm9vbGVhbiBoYXNNb2RpZmllciA9IHNldHVwTW9kaWZpZXJzKHBhaW50KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5EcmF3VGV4dChtUmVuZGVyZXIsIHRleHQsIDAsIHRleHQubGVuZ3RoKCksIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRPblBhdGgoY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBQYXRoIHBhdGgsIGZsb2F0IGhPZmZzZXQsCisgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dE9uUGF0aChTdHJpbmcgdGV4dCwgUGF0aCBwYXRoLCBmbG9hdCBoT2Zmc2V0LCBmbG9hdCB2T2Zmc2V0LCBQYWludCBwYWludCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKGluZGV4IHwgY291bnQgfCB0ZXh0Lmxlbmd0aCAtIGluZGV4IC0gY291bnQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlyICE9IERJUkVDVElPTl9MVFIgJiYgZGlyICE9IERJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZGlyZWN0aW9uOiAiICsgZGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBzZXR1cE1vZGlmaWVycyhwYWludCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LCBpbmRleCwgY291bnQsIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCB4LCB5LCBkaXIsCisgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG5SZXNldE1vZGlmaWVycyhtUmVuZGVyZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuRHJhd1RleHRSdW4oaW50IHJlbmRlcmVyLCBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBpbnQgbmF0aXZlUGFpbnQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oQ2hhclNlcXVlbmNlIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZGlyLCBQYWludCBwYWludCkgeworICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgZW5kIC0gc3RhcnQgfCB0ZXh0Lmxlbmd0aCgpIC0gZW5kKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc01vZGlmaWVyID0gc2V0dXBNb2RpZmllcnMocGFpbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGZsYWdzID0gZGlyID09IDAgPyAwIDogMTsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CisgICAgICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCB0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0UnVuKHRoaXMsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgICAgICAgICAgVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYnVmLCAwKTsKKyAgICAgICAgICAgICAgICBuRHJhd1RleHRSdW4obVJlbmRlcmVyLCBidWYsIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBsZW4sIDAsIGNvbnRleHRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBuUmVzZXRNb2RpZmllcnMobVJlbmRlcmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbkRyYXdUZXh0UnVuKGludCByZW5kZXJlciwgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBuYXRpdmVQYWludCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkcmF3VmVydGljZXMoVmVydGV4TW9kZSBtb2RlLCBpbnQgdmVydGV4Q291bnQsIGZsb2F0W10gdmVydHMsIGludCB2ZXJ0T2Zmc2V0LAorICAgICAgICAgICAgZmxvYXRbXSB0ZXhzLCBpbnQgdGV4T2Zmc2V0LCBpbnRbXSBjb2xvcnMsIGludCBjb2xvck9mZnNldCwgc2hvcnRbXSBpbmRpY2VzLAorICAgICAgICAgICAgaW50IGluZGV4T2Zmc2V0LCBpbnQgaW5kZXhDb3VudCwgUGFpbnQgcGFpbnQpIHsKKyAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNldHVwTW9kaWZpZXJzKFBhaW50IHBhaW50KSB7CisgICAgICAgIGJvb2xlYW4gaGFzTW9kaWZpZXIgPSBmYWxzZTsKKworICAgICAgICBpZiAocGFpbnQuaGFzU2hhZG93KSB7CisgICAgICAgICAgICBuU2V0dXBTaGFkb3cobVJlbmRlcmVyLCBwYWludC5zaGFkb3dSYWRpdXMsIHBhaW50LnNoYWRvd0R4LCBwYWludC5zaGFkb3dEeSwKKyAgICAgICAgICAgICAgICAgICAgcGFpbnQuc2hhZG93Q29sb3IpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU2hhZGVyIHNoYWRlciA9IHBhaW50LmdldFNoYWRlcigpOworICAgICAgICBpZiAoc2hhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5TZXR1cFNoYWRlcihtUmVuZGVyZXIsIHNoYWRlci5uYXRpdmVfc2hhZGVyKTsKKyAgICAgICAgICAgIGhhc01vZGlmaWVyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbG9yRmlsdGVyIGZpbHRlciA9IHBhaW50LmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwQ29sb3JGaWx0ZXIobVJlbmRlcmVyLCBmaWx0ZXIubmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgaGFzTW9kaWZpZXIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhc01vZGlmaWVyOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZXR1cENvbG9yRmlsdGVyKFBhaW50IHBhaW50KSB7CisgICAgICAgIGZpbmFsIENvbG9yRmlsdGVyIGZpbHRlciA9IHBhaW50LmdldENvbG9yRmlsdGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgblNldHVwQ29sb3JGaWx0ZXIobVJlbmRlcmVyLCBmaWx0ZXIubmF0aXZlQ29sb3JGaWx0ZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblNldHVwU2hhZGVyKGludCByZW5kZXJlciwgaW50IHNoYWRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBDb2xvckZpbHRlcihpbnQgcmVuZGVyZXIsIGludCBjb2xvckZpbHRlcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0dXBTaGFkb3coaW50IHJlbmRlcmVyLCBmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKTsKKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgblJlc2V0TW9kaWZpZXJzKGludCByZW5kZXJlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0hhcmR3YXJlUmVuZGVyZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODUwNzZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xTdXJmYWNlOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgcmVuZGVyaW5nIGEgVmlld1Jvb3QgdXNpbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICogCisgKiBAaGlkZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGFyZHdhcmVSZW5kZXJlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSGFyZHdhcmVSZW5kZXJlciI7CisKKyAgICAvKioKKyAgICAgKiBBIHByb2Nlc3MgY2FuIHNldCB0aGlzIGZsYWcgdG8gZmFsc2UgdG8gcHJldmVudCB0aGUgdXNlIG9mIGhhcmR3YXJlCisgICAgICogcmVuZGVyaW5nLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNSZW5kZXJlckRpc2FibGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1SZXF1ZXN0ZWQgPSB0cnVlOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW5ub3QgdXNlIGhhcmR3YXJlIHJlbmRlcmluZy4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlKCkgeworICAgICAgICBzUmVuZGVyZXJEaXNhYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGF2YWlsYWJsZSB1bmRlciBhbnkgZm9ybSBmb3IKKyAgICAgKiB0aGUgdmlldyBoaWVyYXJjaHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGhpZXJhcmNoeSBjYW4gcG90ZW50aWFsbHkgYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBHTEVTMjBDYW52YXMuaXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgaGFyZHdhcmUgcmVuZGVyaW5nIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIGZ1bGwgSWYgdHJ1ZSwgZGVzdHJveXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgZGVzdHJveShib29sZWFuIGZ1bGwpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGhvbGRlciBUaGUgaG9sZGVyIGZvciB0aGUgc3VyZmFjZSB0byBoYXJkd2FyZSBhY2NlbGVyYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBib29sZWFuIGluaXRpYWxpemUoU3VyZmFjZUhvbGRlciBob2xkZXIpOworCisgICAgLyoqCisgICAgICogU2V0dXAgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciBkcmF3aW5nLiBUaGlzIGlzIGNhbGxlZCBmb3IgZXZlcnkKKyAgICAgKiBmcmFtZSB0byBkcmF3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzZXR1cChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLyoqCisgICAgICogRHJhd3MgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIGRyYXcuCisgICAgICogQHBhcmFtIGF0dGFjaEluZm8gQXR0YWNoSW5mbyB0aWVkIHRvIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGZvciB0aGUgc3BlY2lmaWVkIHN1cmZhY2UgYW5kIHNldHVwIHRoZQorICAgICAqIHJlbmRlcmVyIGZvciBkcmF3aW5nLCBpZiBuZWVkZWQuIFRoaXMgaXMgaW52b2tlZCB3aGVuIHRoZSBWaWV3Um9vdCBoYXMKKyAgICAgKiBwb3RlbnRpYWxseSBsb3N0IHRoZSBoYXJkd2FyZSByZW5kZXJlci4gVGhlIGhhcmR3YXJlIHJlbmRlcmVyIHNob3VsZCBiZQorICAgICAqIHJlaW5pdGlhbGl6ZWQgYW5kIHNldHVwIHdoZW4gdGhlIHJlbmRlciB7QGxpbmsgI2lzUmVxdWVzdGVkKCl9IGFuZAorICAgICAqIHtAbGluayAjaXNFbmFibGVkKCl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgKiBAcGFyYW0gYXR0YWNoSW5mbyBUaGUgCisgICAgICogQHBhcmFtIGhvbGRlcgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKGludCB3aWR0aCwgaW50IGhlaWdodCwgVmlldy5BdHRhY2hJbmZvIGF0dGFjaEluZm8sCisgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgLy8gV2UgbG9zdCB0aGUgZ2wgY29udGV4dCwgc28gcmVjcmVhdGUgaXQuCisgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemUoaG9sZGVyKSkgeworICAgICAgICAgICAgICAgICAgICBzZXR1cCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBoYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wuCisgICAgICogCisgICAgICogQHBhcmFtIGdsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBPcGVuR0wgdG8gdXNlICgxIGZvciBPcGVuR0wgMSwgMTEgZm9yIE9wZW5HTCAxLjEsIGV0Yy4pCisgICAgICogQHBhcmFtIHRyYW5zbHVjZW50IFRydWUgaWYgdGhlIHN1cmZhY2UgaXMgdHJhbnNsdWNlbnQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqIAorICAgICAqIEByZXR1cm4gQSBoYXJkd2FyZSByZW5kZXJlciBiYWNrZWQgYnkgT3BlbkdMLgorICAgICAqLworICAgIHN0YXRpYyBIYXJkd2FyZVJlbmRlcmVyIGNyZWF0ZUdsUmVuZGVyZXIoaW50IGdsVmVyc2lvbiwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICBzd2l0Y2ggKGdsVmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBHbDIwUmVuZGVyZXIuY3JlYXRlKHRyYW5zbHVjZW50KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIEdMIHZlcnNpb246ICIgKyBnbFZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgZW5hYmxlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGN1cnJlbnRseSBlbmFibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgaWYgdGhlIGhhcmR3YXJlIHJlbmRlcmVyIGlzIGluIHVzZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWVzdCBidXQgbm90CisgICAgICogbmVjZXNzYXJpbHkgZW5hYmxlZCB5ZXQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIHJlcXVlc3QgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0ZWQoYm9vbGVhbiByZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVJlcXVlc3RlZCA9IHJlcXVlc3RlZDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ImRlcHJlY2F0aW9uIn0pCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdsUmVuZGVyZXIgZXh0ZW5kcyBIYXJkd2FyZVJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OworCisgICAgICAgIHN0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0OworICAgICAgICBzdGF0aWMgRUdMMTAgc0VnbDsKKyAgICAgICAgc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXk7CisgICAgICAgIHN0YXRpYyBFR0xDb25maWcgc0VnbENvbmZpZzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWQgc0VnbFRocmVhZDsgICAgICAgIAorCisgICAgICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7CisgICAgICAgIAorICAgICAgICBHTCBtR2w7CisgICAgICAgIEdMRVMyMENhbnZhcyBtQ2FudmFzOworCisgICAgICAgIGZpbmFsIGludCBtR2xWZXJzaW9uOworICAgICAgICBmaW5hbCBib29sZWFuIG1UcmFuc2x1Y2VudDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURlc3Ryb3llZDsKKworICAgICAgICBHbFJlbmRlcmVyKGludCBnbFZlcnNpb24sIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKKyAgICAgICAgICAgIG1HbFZlcnNpb24gPSBnbFZlcnNpb247CisgICAgICAgICAgICBtVHJhbnNsdWNlbnQgPSB0cmFuc2x1Y2VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgZm9yIE9wZW5HTCBlcnJvcnMuIElmIGFuIGVycm9yIGhhcyBvY2N1cmVkLCB7QGxpbmsgI2Rlc3Ryb3koYm9vbGVhbil9CisgICAgICAgICAqIGlzIGludm9rZWQgYW5kIHRoZSByZXF1ZXN0ZWQgZmxhZyBpcyB0dXJuZWQgb2ZmLiBUaGUgZXJyb3IgY29kZSBpcworICAgICAgICAgKiBhbHNvIGxvZ2dlZCBhcyBhIHdhcm5pbmcuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrRXJyb3JzKCkgeworICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gc0VnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCByZXZlcnQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIHJlbmRlcmluZy4KKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEVHTDExLkVHTF9DT05URVhUX0xPU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJPcGVuR0wgZXJyb3I6ICIgKyBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0ZWQoKSAmJiAhaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplRWdsKCk7CisgICAgICAgICAgICAgICAgbUdsID0gY3JlYXRlRWdsU3VyZmFjZShob2xkZXIpOworICAgICAgICAgICAgICAgIG1EZXN0cm95ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtR2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyID0gc0VnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95KHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FudmFzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FudmFzID0gY3JlYXRlQ2FudmFzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbnZhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkhhcmR3YXJlIGFjY2VsZXJhdGVkIENhbnZhcyBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1DYW52YXMgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBHTEVTMjBDYW52YXMgY3JlYXRlQ2FudmFzKCk7CisKKyAgICAgICAgdm9pZCBpbml0aWFsaXplRWdsKCkgeworICAgICAgICAgICAgaWYgKHNFZ2xDb250ZXh0ICE9IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgc0VnbFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgICAgICBzRWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBHZXQgdG8gdGhlIGRlZmF1bHQgZGlzcGxheS4KKyAgICAgICAgICAgIHNFZ2xEaXNwbGF5ID0gc0VnbC5lZ2xHZXREaXNwbGF5KEVHTDEwLkVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc0VnbERpc3BsYXkgPT0gRUdMMTAuRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsR2V0RGlzcGxheSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgY2FuIG5vdyBpbml0aWFsaXplIEVHTCBmb3IgdGhhdCBkaXNwbGF5CisgICAgICAgICAgICBpbnRbXSB2ZXJzaW9uID0gbmV3IGludFsyXTsKKyAgICAgICAgICAgIGlmICghc0VnbC5lZ2xJbml0aWFsaXplKHNFZ2xEaXNwbGF5LCB2ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xJbml0aWFsaXplIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0VnbENvbmZpZyA9IGdldENvbmZpZ0Nob29zZXIobUdsVmVyc2lvbikuY2hvb3NlQ29uZmlnKHNFZ2wsIHNFZ2xEaXNwbGF5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogQ3JlYXRlIGFuIEVHTCBjb250ZXh0LiBXZSB3YW50IHRvIGRvIHRoaXMgYXMgcmFyZWx5IGFzIHdlIGNhbiwgYmVjYXVzZSBhbgorICAgICAgICAgICAgKiBFR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBzRWdsQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoc0VnbCwgc0VnbERpc3BsYXksIHNFZ2xDb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgR0wgY3JlYXRlRWdsU3VyZmFjZShTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgLy8gQ2hlY2sgcHJlY29uZGl0aW9ucy4KKyAgICAgICAgICAgIGlmIChzRWdsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNFZ2xEaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsRGlzcGxheSBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzRWdsQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigibUVnbENvbmZpZyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpICE9IHNFZ2xUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJIYXJkd2FyZVJlbmRlcmVyIGNhbm5vdCBiZSB1c2VkICIgCisgICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIG11bHRpcGxlIHRocmVhZHMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICBUaGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3CisgICAgICAgICAgICAgKiAgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IG51bGwgJiYgbUVnbFN1cmZhY2UgIT0gRUdMMTAuRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFVuYmluZCBhbmQgZGVzdHJveSB0aGUgb2xkIEVHTCBzdXJmYWNlLCBpZgorICAgICAgICAgICAgICAgICAqIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzRWdsLmVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgc0VnbC5lZ2xEZXN0cm95U3VyZmFjZShzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgorICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBzRWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2Uoc0VnbERpc3BsYXksIHNFZ2xDb25maWcsIGhvbGRlciwgbnVsbCk7CisKKyAgICAgICAgICAgIGlmIChtRWdsU3VyZmFjZSA9PSBudWxsIHx8IG1FZ2xTdXJmYWNlID09IEVHTDEwLkVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yID0gc0VnbC5lZ2xHZXRFcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSBFR0wxMC5FR0xfQkFEX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoIkVnbEhlbHBlciIsICJjcmVhdGVXaW5kb3dTdXJmYWNlIHJldHVybmVkIEVHTF9CQURfTkFUSVZFX1dJTkRPVy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQmVmb3JlIHdlIGNhbiBpc3N1ZSBHTCBjb21tYW5kcywgd2UgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFzRWdsLmVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIHNFZ2xDb250ZXh0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNFZ2xDb250ZXh0LmdldEdMKCk7CisgICAgICAgIH0KKworICAgICAgICBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGVnbERpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgbUdsVmVyc2lvbiwgRUdMMTAuRUdMX05PTkUgfTsKKworICAgICAgICAgICAgcmV0dXJuIGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGVnbENvbmZpZywgRUdMMTAuRUdMX05PX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgIG1HbFZlcnNpb24gIT0gMCA/IGF0dHJpYl9saXN0IDogbnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBpbml0aWFsaXplSWZOZWVkZWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywKKyAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAgICAgaWYgKGlzUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgICAgIHN1cGVyLmluaXRpYWxpemVJZk5lZWRlZCh3aWR0aCwgaGVpZ2h0LCBhdHRhY2hJbmZvLCBob2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBkZXN0cm95KGJvb2xlYW4gZnVsbCkgeworICAgICAgICAgICAgaWYgKGZ1bGwgJiYgbUNhbnZhcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbnZhcy5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgbUNhbnZhcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkgfHwgbURlc3Ryb3llZCkgcmV0dXJuOworCisgICAgICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKworICAgICAgICAgICAgc0VnbC5lZ2xNYWtlQ3VycmVudChzRWdsRGlzcGxheSwgRUdMMTAuRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT19TVVJGQUNFLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCk7CisgICAgICAgICAgICBzRWdsLmVnbERlc3Ryb3lTdXJmYWNlKHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CisKKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKKyAgICAgICAgICAgIG1HbCA9IG51bGw7CisKKyAgICAgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgc2V0dXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBtQ2FudmFzLnNldFZpZXdwb3J0KHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIGNhbkRyYXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUdsICE9IG51bGwgJiYgbUNhbnZhcyAhPSBudWxsOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHZvaWQgb25QcmVEcmF3KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZXMgdGhlIEVHTCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHJlbmRlcmVyLiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGlzIFJHQlgsIG5vIGRlcHRoLCBubyBzdGVuY2lsLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBBbiB7QGxpbmsgYW5kcm9pZC52aWV3LkhhcmR3YXJlUmVuZGVyZXIuR2xSZW5kZXJlci5FZ2xDb25maWdDaG9vc2VyfS4KKyAgICAgICAgICogQHBhcmFtIGdsVmVyc2lvbgorICAgICAgICAgKi8KKyAgICAgICAgRWdsQ29uZmlnQ2hvb3NlciBnZXRDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50U2l6ZUNob29zZXIoZ2xWZXJzaW9uLCA4LCA4LCA4LCA4LCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGRyYXcoVmlldyB2aWV3LCBWaWV3LkF0dGFjaEluZm8gYXR0YWNoSW5mbywgaW50IHlPZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChjYW5EcmF3KCkpIHsKKyAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1EcmF3aW5nVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGF0dGFjaEluZm8ubUlnbm9yZURpcnR5U3RhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgIHZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOworCisgICAgICAgICAgICAgICAgY2hlY2tDdXJyZW50KCk7CisKKyAgICAgICAgICAgICAgICBvblByZURyYXcoKTsKKworICAgICAgICAgICAgICAgIENhbnZhcyBjYW52YXMgPSBtQ2FudmFzOworICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMCwgLXlPZmZzZXQpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgc0VnbC5lZ2xTd2FwQnVmZmVycyhzRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tDdXJyZW50KCkgeworICAgICAgICAgICAgLy8gVE9ETzogRG9uJ3QgY2hlY2sgdGhlIGN1cnJlbnQgY29udGV4dCB3aGVuIHdlIGhhdmUgb25lIHBlciBVSSB0aHJlYWQKKyAgICAgICAgICAgIC8vIFRPRE86IFVzZSBhIHRocmVhZGxvY2FsIGZsYWcgdG8ga25vdyB3aGV0aGVyIHRoZSBzdXJmYWNlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICBpZiAoc0VnbC5lZ2xHZXRDdXJyZW50Q29udGV4dCgpICE9IHNFZ2xDb250ZXh0IHx8CisgICAgICAgICAgICAgICAgICAgIHNFZ2wuZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMMTAuRUdMX0RSQVcpICE9IG1FZ2xTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzRWdsLmVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIHNFZ2xDb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVnbENvbmZpZ0Nob29zZXIgeworICAgICAgICAgICAgZmluYWwgaW50W10gbUNvbmZpZ1NwZWM7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtR2xWZXJzaW9uOworCisgICAgICAgICAgICBFZ2xDb25maWdDaG9vc2VyKGludCBnbFZlcnNpb24sIGludFtdIGNvbmZpZ1NwZWMpIHsKKyAgICAgICAgICAgICAgICBtR2xWZXJzaW9uID0gZ2xWZXJzaW9uOworICAgICAgICAgICAgICAgIG1Db25maWdTcGVjID0gZmlsdGVyQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICAgICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBpZiAoIWVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgbUNvbmZpZ1NwZWMsIG51bGwsIDAsIGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlZ2xDaG9vc2VDb25maWcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBpbmRleFswXTsKKyAgICAgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUNvbmZpZ3NdOworICAgICAgICAgICAgICAgIGlmICghZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBtQ29uZmlnU3BlYywgY29uZmlncywgbnVtQ29uZmlncywgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVnbENob29zZUNvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnID0gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhYnN0cmFjdCBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWdbXSBjb25maWdzKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBpbnRbXSBmaWx0ZXJDb25maWdTcGVjKGludFtdIGNvbmZpZ1NwZWMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUdsVmVyc2lvbiAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdTcGVjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBXZSBrbm93IG5vbmUgb2YgdGhlIHN1YmNsYXNzZXMgZGVmaW5lIEVHTF9SRU5ERVJBQkxFX1RZUEUuCisgICAgICAgICAgICAgICAgICogQW5kIHdlIGtub3cgdGhlIGNvbmZpZ1NwZWMgaXMgd2VsbCBmb3JtZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGNvbmZpZ1NwZWMubGVuZ3RoOworICAgICAgICAgICAgICAgIGludFtdIG5ld0NvbmZpZ1NwZWMgPSBuZXcgaW50W2xlbiArIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29uZmlnU3BlYywgMCwgbmV3Q29uZmlnU3BlYywgMCwgbGVuIC0gMSk7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4gLSAxXSA9IEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW5dID0gNDsgLyogRUdMX09QRU5HTF9FUzJfQklUICovCisgICAgICAgICAgICAgICAgbmV3Q29uZmlnU3BlY1tsZW4gKyAxXSA9IEVHTDEwLkVHTF9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdDb25maWdTcGVjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENob29zZSBhIGNvbmZpZ3VyYXRpb24gd2l0aCBleGFjdGx5IHRoZSBzcGVjaWZpZWQgcixnLGIsYSBzaXplcywKKyAgICAgICAgICogYW5kIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgZGVwdGggYW5kIHN0ZW5jaWwgc2l6ZXMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgY2xhc3MgQ29tcG9uZW50U2l6ZUNob29zZXIgZXh0ZW5kcyBFZ2xDb25maWdDaG9vc2VyIHsKKyAgICAgICAgICAgIHByaXZhdGUgaW50W10gbVZhbHVlOworCisgICAgICAgICAgICBwcml2YXRlIGludCBtUmVkU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1HcmVlblNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQmx1ZVNpemU7CisgICAgICAgICAgICBwcml2YXRlIGludCBtQWxwaGFTaXplOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbURlcHRoU2l6ZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1TdGVuY2lsU2l6ZTsKKworICAgICAgICAgICAgQ29tcG9uZW50U2l6ZUNob29zZXIoaW50IGdsVmVyc2lvbiwgaW50IHJlZFNpemUsIGludCBncmVlblNpemUsIGludCBibHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhU2l6ZSwgaW50IGRlcHRoU2l6ZSwgaW50IHN0ZW5jaWxTaXplKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoZ2xWZXJzaW9uLCBuZXcgaW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCByZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIGdyZWVuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIGJsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIGFscGhhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCBkZXB0aFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCBzdGVuY2lsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FIH0pOworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICAgICAgbVJlZFNpemUgPSByZWRTaXplOworICAgICAgICAgICAgICAgIG1HcmVlblNpemUgPSBncmVlblNpemU7CisgICAgICAgICAgICAgICAgbUJsdWVTaXplID0gYmx1ZVNpemU7CisgICAgICAgICAgICAgICAgbUFscGhhU2l6ZSA9IGFscGhhU2l6ZTsKKyAgICAgICAgICAgICAgICBtRGVwdGhTaXplID0gZGVwdGhTaXplOworICAgICAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWxTaXplOworICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnW10gY29uZmlncykgeworICAgICAgICAgICAgICAgIGZvciAoRUdMQ29uZmlnIGNvbmZpZyA6IGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfREVQVEhfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX1NURU5DSUxfU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcyA+PSBtU3RlbmNpbFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLCBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPj0gbVJlZFNpemUgJiYgZyA+PSBtR3JlZW5TaXplICYmIGIgPj0gbUJsdWVTaXplICYmIGEgPj0gbUFscGhhU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGZpbmRDb25maWdBdHRyaWIoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWdsLmVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIGF0dHJpYnV0ZSwgbVZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSByZW5kZXJlciB1c2luZyBPcGVuR0wgRVMgMi4wLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBHbDIwUmVuZGVyZXIgZXh0ZW5kcyBHbFJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBHTEVTMjBDYW52YXMgbUdsQ2FudmFzOworCisgICAgICAgIEdsMjBSZW5kZXJlcihib29sZWFuIHRyYW5zbHVjZW50KSB7CisgICAgICAgICAgICBzdXBlcigyLCB0cmFuc2x1Y2VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgR0xFUzIwQ2FudmFzIGNyZWF0ZUNhbnZhcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtR2xDYW52YXMgPSBuZXcgR0xFUzIwQ2FudmFzKG1HbCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBvblByZURyYXcoKSB7CisgICAgICAgICAgICBtR2xDYW52YXMub25QcmVEcmF3KCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgSGFyZHdhcmVSZW5kZXJlciBjcmVhdGUoYm9vbGVhbiB0cmFuc2x1Y2VudCkgeworICAgICAgICAgICAgaWYgKEdMRVMyMENhbnZhcy5pc0F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHbDIwUmVuZGVyZXIodHJhbnNsdWNlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0xheW91dEluZmxhdGVyLmphdmEKaW5kZXggMTk0YzAxMy4uNDU4Mjc0ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXIuamF2YQpAQCAtMTYsMTUgKzE2LDE1IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTcxLDExICs3MSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBtQ29uc3RydWN0b3JBcmdzID0gbmV3IE9iamVjdFsyXTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gbUNvbnN0cnVjdG9yU2lnbmF0dXJlID0gbmV3IENsYXNzW10gewogICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQXR0cmlidXRlU2V0LmNsYXNzfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBDb25zdHJ1Y3Rvcj4gc0NvbnN0cnVjdG9yTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBWaWV3Pj4gc0NvbnN0cnVjdG9yTWFwID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+PigpOwogICAgIAogICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1GaWx0ZXJNYXA7CiAKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgICAgICogCiAgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGFsbG93ZWQgdG8gYmUgaW5mbGF0ZWQsIG9yIGZhbHNlIG90aGVyd2lzZQogICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgIGJvb2xlYW4gb25Mb2FkQ2xhc3MoQ2xhc3MgY2xhenopOwogICAgIH0KICAgICAKQEAgLTM4MCw3ICszODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJWaWV3R3JvdXAgcm9vdCBhbmQgYXR0YWNoVG9Sb290PXRydWUiKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGVtcCBpcyB0aGUgcm9vdCB2aWV3IHRoYXQgd2FzIGZvdW5kIGluIHRoZSB4bWwKICAgICAgICAgICAgICAgICAgICAgVmlldyB0ZW1wID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwpAQCAtNDA1LDcgKzQwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBzdGFydCBpbmZsYXRpbmcgY2hpbGRyZW4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBJbmZsYXRlIGFsbCBjaGlsZHJlbiB1bmRlciB0ZW1wCi0gICAgICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdGVtcCwgYXR0cnMpOworICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShwYXJzZXIsIHRlbXAsIGF0dHJzLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tPiBkb25lIGluZmxhdGluZyBjaGlsZHJlbiIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NTgsMTggKzQ1OSwxOCBAQAogICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZC4KICAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIFhNTCBhdHRyaWJ1dGVzIHN1cHBsaWVkIGZvciB0aGlzIGluc3RhbmNlLgogICAgICAqIAotICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGllZCB2aWV3LCBvciBudWxsLgorICAgICAqIEByZXR1cm4gVmlldyBUaGUgbmV3bHkgaW5zdGFudGlhdGVkIHZpZXcsIG9yIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFZpZXcgY3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluZmxhdGVFeGNlcHRpb24gewotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHNDb25zdHJ1Y3Rvck1hcC5nZXQobmFtZSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFZpZXc+IGNvbnN0cnVjdG9yID0gc0NvbnN0cnVjdG9yTWFwLmdldChuYW1lKTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFZpZXc+IGNsYXp6ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBDbGFzcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCBzZWUgaWYgaXQncyByZWFsLCBhbmQgdHJ5IHRvIGFkZCBpdAogICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggIT0gbnVsbCA/IChwcmVmaXggKyBuYW1lKSA6IG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgbmFtZSkgOiBuYW1lKS5hc1N1YmNsYXNzKFZpZXcuY2xhc3MpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwgJiYgY2xhenogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93ZWQgPSBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKQEAgLTQ4Nyw3ICs0ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFN0YXRlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjbGFzcyAtLSByZW1lbWJlciB3aGV0aGVyIGl0IGlzIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkuYXNTdWJjbGFzcyhWaWV3LmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gY2xhenogIT0gbnVsbCAmJiBtRmlsdGVyLm9uTG9hZENsYXNzKGNsYXp6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWx0ZXJNYXAucHV0KG5hbWUsIGFsbG93ZWQpOwpAQCAtNTAyLDcgKzUwMyw3IEBACiAKICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBtQ29uc3RydWN0b3JBcmdzOwogICAgICAgICAgICAgYXJnc1sxXSA9IGF0dHJzOwotICAgICAgICAgICAgcmV0dXJuIChWaWV3KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShhcmdzKTsKIAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgSW5mbGF0ZUV4Y2VwdGlvbiBpZSA9IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGF0dHJzLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQpAQCAtNTExLDYgKzUxMiwxMyBAQAogICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOwogICAgICAgICAgICAgdGhyb3cgaWU7CiAKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRlZCBjbGFzcyBpcyBub3QgYSBWaWV3IHN1YmNsYXNzCisgICAgICAgICAgICBJbmZsYXRlRXhjZXB0aW9uIGllID0gbmV3IEluZmxhdGVFeGNlcHRpb24oYXR0cnMuZ2V0UG9zaXRpb25EZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICsgIjogQ2xhc3MgaXMgbm90IGEgVmlldyAiCisgICAgICAgICAgICAgICAgICAgICsgKHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArIG5hbWUpIDogbmFtZSkpOworICAgICAgICAgICAgaWUuaW5pdENhdXNlKGUpOworICAgICAgICAgICAgdGhyb3cgaWU7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSWYgbG9hZENsYXNzIGZhaWxzLCB3ZSBzaG91bGQgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24uCiAgICAgICAgICAgICB0aHJvdyBlOwpAQCAtNTI0LDcgKzUzMiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhyb3cgYW4gZXhjcGV0aW9uIGJlY2F1c2UgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYWxsb3dlZCB0byBiZSBpbmZsYXRlZC4KKyAgICAgKiBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGluZmxhdGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBmYWlsTm90QWxsb3dlZChTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gaWUgPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbihhdHRycy5nZXRQb3NpdGlvbkRlc2NyaXB0aW9uKCkKQEAgLTU5NSw4ICs2MDMsOCBAQAogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBySW5mbGF0ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVmlldyBwYXJlbnQsIGZpbmFsIEF0dHJpYnV0ZVNldCBhdHRycykKLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJJbmZsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCwgZmluYWwgQXR0cmlidXRlU2V0IGF0dHJzLAorICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hJbmZsYXRlKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOwogICAgICAgICBpbnQgdHlwZTsKQEAgLTYyMywxMiArNjMxLDEyIEBACiAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY3JlYXRlVmlld0Zyb21UYWcobmFtZSwgYXR0cnMpOwogICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCB2aWV3R3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSB2aWV3R3JvdXAuZ2VuZXJhdGVMYXlvdXRQYXJhbXMoYXR0cnMpOwotICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMpOworICAgICAgICAgICAgICAgIHJJbmZsYXRlKHBhcnNlciwgdmlldywgYXR0cnMsIHRydWUpOwogICAgICAgICAgICAgICAgIHZpZXdHcm91cC5hZGRWaWV3KHZpZXcsIHBhcmFtcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CisgICAgICAgIGlmIChmaW5pc2hJbmZsYXRlKSBwYXJlbnQub25GaW5pc2hJbmZsYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVxdWVzdEZvY3VzKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBWaWV3IHBhcmVudCkKQEAgLTY3OSw3ICs2ODcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVSR0UuZXF1YWxzKGNoaWxkTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBySW5mbGF0ZShjaGlsZFBhcnNlciwgcGFyZW50LCBjaGlsZEF0dHJzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjcmVhdGVWaWV3RnJvbVRhZyhjaGlsZE5hbWUsIGNoaWxkQXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlld0dyb3VwIGdyb3VwID0gKFZpZXdHcm91cCkgcGFyZW50OwpAQCAtNzA0LDcgKzcxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgotICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgckluZmxhdGUoY2hpbGRQYXJzZXIsIHZpZXcsIGNoaWxkQXR0cnMsIHRydWUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbmNsdWRlZCBsYXlvdXQncyBhbmRyb2lkOmlkIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgc2V0IG9uIHRoZSA8aW5jbHVkZSAvPiB0YWcgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUluZmxhdGVyLmphdmEKaW5kZXggNDZjODA1Yy4uN2Q1ZGNkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SW5mbGF0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJbmZsYXRlci5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUl0ZW1JbXBsOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIApAQCAtMzAsNiArMjgsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgbWVudSBYTUwgZmlsZXMgaW50byBNZW51IG9iamVjdHMuCiAgKiA8cD4KQEAgLTUxLDYgKzUzLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19JRCA9IDA7CiAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBQ1RJT05fVklFV19DT05TVFJVQ1RPUl9TSUdOQVRVUkUgPSBuZXcgQ2xhc3NbXXtDb250ZXh0LmNsYXNzfTsKKwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICAKICAgICAvKioKQEAgLTE2Niw2ICsxNzAsNDEgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBQQVJBTV9UWVBFUyA9IG5ldyBDbGFzc1tdIHsgTWVudUl0ZW0uY2xhc3MgfTsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbU1ldGhvZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIENsYXNzIGMgPSBjb250ZXh0LmdldENsYXNzKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NZXRob2QgPSBjLmdldE1ldGhvZChtZXRob2ROYW1lLCBQQVJBTV9UWVBFUyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEluZmxhdGVFeGNlcHRpb24gZXggPSBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZXNvbHZlIG1lbnUgaXRlbSBvbkNsaWNrIGhhbmRsZXIgIiArIG1ldGhvZE5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBjbGFzcyAiICsgYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGV4LmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1NZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IEJvb2xlYW4uVFlQRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG1NZXRob2QuaW52b2tlKG1Db250ZXh0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtTWV0aG9kLmludm9rZShtQ29udGV4dCwgaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU3RhdGUgZm9yIHRoZSBjdXJyZW50IG1lbnUuCiAgICAgICogPHA+CkBAIC0yMDUsNiArMjQ0LDIwIEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpdGVtVmlzaWJsZTsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGl0ZW1FbmFibGVkOwogICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bmMgdG8gYXR0cnMueG1sIGVudW0sIHZhbHVlcyBpbiBNZW51SXRlbToKKyAgICAgICAgICogLSAwOiBuZXZlcgorICAgICAgICAgKiAtIDE6IGlmUm9vbQorICAgICAgICAgKiAtIDI6IGFsd2F5cworICAgICAgICAgKiAtIC0xOiBTYWZlIHNlbnRpbmVsIGZvciAibm8gdmFsdWUiLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgaXRlbVNob3dBc0FjdGlvbjsKKworICAgICAgICBwcml2YXRlIGludCBpdGVtQWN0aW9uVmlld0xheW91dDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaXRlbUFjdGlvblZpZXdDbGFzc05hbWU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIFN0cmluZyBpdGVtTGlzdGVuZXJNZXRob2ROYW1lOworICAgICAgICAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRlZmF1bHRHcm91cElkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUlkID0gTk9fSUQ7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0SXRlbUNhdGVnb3J5ID0gMDsKQEAgLTI3Niw2ICszMjksMTAgQEAKICAgICAgICAgICAgIGl0ZW1DaGVja2VkID0gYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2NoZWNrZWQsIGRlZmF1bHRJdGVtQ2hlY2tlZCk7CiAgICAgICAgICAgICBpdGVtVmlzaWJsZSA9IGEuZ2V0Qm9vbGVhbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV92aXNpYmxlLCBncm91cFZpc2libGUpOwogICAgICAgICAgICAgaXRlbUVuYWJsZWQgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWVudUl0ZW1fZW5hYmxlZCwgZ3JvdXBFbmFibGVkKTsKKyAgICAgICAgICAgIGl0ZW1TaG93QXNBY3Rpb24gPSBhLmdldEludChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9zaG93QXNBY3Rpb24sIC0xKTsKKyAgICAgICAgICAgIGl0ZW1MaXN0ZW5lck1ldGhvZE5hbWUgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5NZW51SXRlbV9vbkNsaWNrKTsKKyAgICAgICAgICAgIGl0ZW1BY3Rpb25WaWV3TGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvbkxheW91dCwgMCk7CisgICAgICAgICAgICBpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1lbnVJdGVtX2FjdGlvblZpZXdDbGFzcyk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGEucmVjeWNsZSgpOwogICAgICAgICAgICAgCkBAIC0yOTksOSArMzU2LDM4IEBACiAgICAgICAgICAgICAgICAgLnNldEljb24oaXRlbUljb25SZXNJZCkKICAgICAgICAgICAgICAgICAuc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KGl0ZW1BbHBoYWJldGljU2hvcnRjdXQpCiAgICAgICAgICAgICAgICAgLnNldE51bWVyaWNTaG9ydGN1dChpdGVtTnVtZXJpY1Nob3J0Y3V0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW1TaG93QXNBY3Rpb24gPj0gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0U2hvd0FzQWN0aW9uKGl0ZW1TaG93QXNBY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaXRlbUxpc3RlbmVyTWV0aG9kTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0LmlzUmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhbmRyb2lkOm9uQ2xpY2sgYXR0cmlidXRlIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgdXNlZCB3aXRoaW4gYSByZXN0cmljdGVkIGNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlbS5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbmZsYXRlZE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKG1Db250ZXh0LCBpdGVtTGlzdGVuZXJNZXRob2ROYW1lKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpdGVtQ2hlY2thYmxlID49IDIpIHsKLSAgICAgICAgICAgICAgICAoKE1lbnVJdGVtSW1wbCkgaXRlbSkuc2V0RXhjbHVzaXZlQ2hlY2thYmxlKHRydWUpOworICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbUltcGwpIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaW1wbCA9IChNZW51SXRlbUltcGwpIGl0ZW07CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1DaGVja2FibGUgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpbXBsLnNldEV4Y2x1c2l2ZUNoZWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpdGVtQWN0aW9uVmlld0NsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGl0ZW1BY3Rpb25WaWV3Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8Pz4gYyA9IGNsYXp6LmdldENvbnN0cnVjdG9yKEFDVElPTl9WSUVXX0NPTlNUUlVDVE9SX1NJR05BVFVSRSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0QWN0aW9uVmlldygoVmlldykgYy5uZXdJbnN0YW5jZShtQ29udGV4dCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUFjdGlvblZpZXdMYXlvdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEFjdGlvblZpZXcoaW5mbGF0ZXIuaW5mbGF0ZShpdGVtQWN0aW9uVmlld0xheW91dCwgbnVsbCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCmluZGV4IGZjZWJlYzUuLjhiOWQ2NTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKQEAgLTMxLDYgKzMxLDIxIEBACiAgKiBGb3IgYSBmZWF0dXJlIHNldCBvZiBzcGVjaWZpYyBtZW51IHR5cGVzLCBzZWUge0BsaW5rIE1lbnV9LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIE1lbnVJdGVtIHsKKyAgICAvKgorICAgICAqIFRoZXNlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhdHRycy54bWwgZW51bSBjb25zdGFudHMgZm9yIHNob3dBc0FjdGlvbgorICAgICAqLworICAgIC8qKiBOZXZlciBzaG93IHRoaXMgaXRlbSBhcyBhIGJ1dHRvbiBpbiBhbiBBY3Rpb24gQmFyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX05FVkVSID0gMDsKKyAgICAvKiogU2hvdyB0aGlzIGl0ZW0gYXMgYSBidXR0b24gaW4gYW4gQWN0aW9uIEJhciBpZiB0aGUgc3lzdGVtIGRlY2lkZXMgdGhlcmUgaXMgcm9vbSBmb3IgaXQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fSUZfUk9PTSA9IDE7CisgICAgLyoqCisgICAgICogQWx3YXlzIHNob3cgdGhpcyBpdGVtIGFzIGEgYnV0dG9uIGluIGFuIEFjdGlvbiBCYXIuCisgICAgICogVXNlIHNwYXJpbmdseSEgSWYgdG9vIG1hbnkgaXRlbXMgYXJlIHNldCB0byBhbHdheXMgc2hvdyBpbiB0aGUgQWN0aW9uIEJhciBpdCBjYW4KKyAgICAgKiBjcm93ZCB0aGUgQWN0aW9uIEJhciBhbmQgZGVncmFkZSB0aGUgdXNlciBleHBlcmllbmNlIG9uIGRldmljZXMgd2l0aCBzbWFsbGVyIHNjcmVlbnMuCisgICAgICogQSBnb29kIHJ1bGUgb2YgdGh1bWIgaXMgdG8gaGF2ZSBubyBtb3JlIHRoYW4gMiBpdGVtcyBzZXQgdG8gYWx3YXlzIHNob3cgYXQgYSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIT1dfQVNfQUNUSU9OX0FMV0FZUyA9IDI7CisgICAgCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEgbWVudSBpdGVtIGlzCiAgICAgICogY2xpY2tlZC4KQEAgLTM4MSw0ICszOTYsMzggQEAKICAgICAgKiAgICAgICAgIG1lbnUgaXRlbSB0byB0aGUgbWVudS4gVGhpcyBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCk7CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyBob3cgdGhpcyBpdGVtIHNob3VsZCBkaXNwbGF5IGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBY3Rpb24gQmFyLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbkVudW0gSG93IHRoZSBpdGVtIHNob3VsZCBkaXNwbGF5LiBPbmUgb2YKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0FMV0FZU30sIHtAbGluayAjU0hPV19BU19BQ1RJT05fSUZfUk9PTX0sIG9yCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9ORVZFUn0uIFNIT1dfQVNfQUNUSU9OX05FVkVSIGlzIHRoZSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aW9uQmFyCisgICAgICogQHNlZSAjc2V0QWN0aW9uVmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNob3dBc0FjdGlvbihpbnQgYWN0aW9uRW51bSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWN0aW9uIHZpZXcgZm9yIHRoaXMgbWVudSBpdGVtLiBBbiBhY3Rpb24gdmlldyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwbGFjZQorICAgICAqIG9mIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1lbnUgaXRlbSBlbGVtZW50IGluIHRoZSBVSSB3aGVuIHRoaXMgaXRlbSBpcyBzaG93bgorICAgICAqIGFzIGFuIGFjdGlvbiB3aXRoaW4gYSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlldyBWaWV3IHRvIHVzZSBmb3IgcHJlc2VudGluZyB0aGlzIGl0ZW0gdG8gdGhlIHVzZXIuCisgICAgICogQHJldHVybiBUaGlzIEl0ZW0gc28gYWRkaXRpb25hbCBzZXR0ZXJzIGNhbiBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgdmlldyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2V0IGFjdGlvbiB2aWV3IGZvciB0aGlzIG1lbnUgaXRlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhpcyBpdGVtJ3MgYWN0aW9uIHZpZXcKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEFjdGlvblZpZXcoVmlldykKKyAgICAgKiBAc2VlICNzZXRTaG93QXNBY3Rpb24oaW50KQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEFjdGlvblZpZXcoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEKaW5kZXggMDk5OTU5OC4uMTdiNWRkNyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICogdXNpbmcgdGhlIHN1cHBsaWVkIHtAbGluayBNb3Rpb25FdmVudH1zLiBUaGUge0BsaW5rIE9uU2NhbGVHZXN0dXJlTGlzdGVuZXJ9CiAgKiBjYWxsYmFjayB3aWxsIG5vdGlmeSB1c2VycyB3aGVuIGEgcGFydGljdWxhciBnZXN0dXJlIGV2ZW50IGhhcyBvY2N1cnJlZC4KICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHtAbGluayBNb3Rpb25FdmVudH1zIHJlcG9ydGVkIHZpYSB0b3VjaC4KLSAqIAorICoKICAqIFRvIHVzZSB0aGlzIGNsYXNzOgogICogPHVsPgogICogIDxsaT5DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHtAY29kZSBTY2FsZUdlc3R1cmVEZXRlY3Rvcn0gZm9yIHlvdXIKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgKiBJZiB5b3Ugd2FudCB0byBsaXN0ZW4gZm9yIGFsbCB0aGUgZGlmZmVyZW50IGdlc3R1cmVzIHRoZW4gaW1wbGVtZW50CiAgICAgICogdGhpcyBpbnRlcmZhY2UuIElmIHlvdSBvbmx5IHdhbnQgdG8gbGlzdGVuIGZvciBhIHN1YnNldCBpdCBtaWdodAogICAgICAqIGJlIGVhc2llciB0byBleHRlbmQge0BsaW5rIFNpbXBsZU9uU2NhbGVHZXN0dXJlTGlzdGVuZXJ9LgotICAgICAqIAorICAgICAqCiAgICAgICogQW4gYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIGV2ZW50cyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgogICAgICAqIDx1bD4KICAgICAgKiAgPGxpPk9uZSB7QGxpbmsgT25TY2FsZUdlc3R1cmVMaXN0ZW5lciNvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IpfQpAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogUmVzcG9uZHMgdG8gc2NhbGluZyBldmVudHMgZm9yIGEgZ2VzdHVyZSBpbiBwcm9ncmVzcy4KICAgICAgICAgICogUmVwb3J0ZWQgYnkgcG9pbnRlciBtb3Rpb24uCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZGV0ZWN0b3IgVGhlIGRldGVjdG9yIHJlcG9ydGluZyB0aGUgZXZlbnQgLSB1c2UgdGhpcyB0bwogICAgICAgICAgKiAgICAgICAgICByZXRyaWV2ZSBleHRlbmRlZCBpbmZvIGFib3V0IGV2ZW50IHN0YXRlLgogICAgICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBkZXRlY3RvciBzaG91bGQgY29uc2lkZXIgdGhpcyBldmVudApAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogUmVzcG9uZHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHNjYWxpbmcgZ2VzdHVyZS4gUmVwb3J0ZWQgYnkKICAgICAgICAgICogbmV3IHBvaW50ZXJzIGdvaW5nIGRvd24uCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZGV0ZWN0b3IgVGhlIGRldGVjdG9yIHJlcG9ydGluZyB0aGUgZXZlbnQgLSB1c2UgdGhpcyB0bwogICAgICAgICAgKiAgICAgICAgICByZXRyaWV2ZSBleHRlbmRlZCBpbmZvIGFib3V0IGV2ZW50IHN0YXRlLgogICAgICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBkZXRlY3RvciBzaG91bGQgY29udGludWUgcmVjb2duaXppbmcKQEAgLTgyLDE3ICs4MiwxNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogUmVzcG9uZHMgdG8gdGhlIGVuZCBvZiBhIHNjYWxlIGdlc3R1cmUuIFJlcG9ydGVkIGJ5IGV4aXN0aW5nCiAgICAgICAgICAqIHBvaW50ZXJzIGdvaW5nIHVwLgotICAgICAgICAgKiAKKyAgICAgICAgICoKICAgICAgICAgICogT25jZSBhIHNjYWxlIGhhcyBlbmRlZCwge0BsaW5rIFNjYWxlR2VzdHVyZURldGVjdG9yI2dldEZvY3VzWCgpfQogICAgICAgICAgKiBhbmQge0BsaW5rIFNjYWxlR2VzdHVyZURldGVjdG9yI2dldEZvY3VzWSgpfSB3aWxsIHJldHVybiB0aGUgbG9jYXRpb24KICAgICAgICAgICogb2YgdGhlIHBvaW50ZXIgcmVtYWluaW5nIG9uIHRoZSBzY3JlZW4uCi0gICAgICAgICAqIAorICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZGV0ZWN0b3IgVGhlIGRldGVjdG9yIHJlcG9ydGluZyB0aGUgZXZlbnQgLSB1c2UgdGhpcyB0bwogICAgICAgICAgKiAgICAgICAgICByZXRyaWV2ZSBleHRlbmRlZCBpbmZvIGFib3V0IGV2ZW50IHN0YXRlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgb25TY2FsZUVuZChTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3Rvcik7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQSBjb252ZW5pZW5jZSBjbGFzcyB0byBleHRlbmQgd2hlbiB5b3Ugb25seSB3YW50IHRvIGxpc3RlbiBmb3IgYSBzdWJzZXQKICAgICAgKiBvZiBzY2FsaW5nLXJlbGF0ZWQgZXZlbnRzLiBUaGlzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgaW4KQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAqIHtAY29kZSBmYWxzZX0gc28gdGhhdCBhIHN1YmNsYXNzIGNhbiByZXRyaWV2ZSB0aGUgYWNjdW11bGF0ZWQgc2NhbGUKICAgICAgKiBmYWN0b3IgaW4gYW4gb3ZlcnJpZGRlbiBvblNjYWxlRW5kLgogICAgICAqIHtAbGluayBPblNjYWxlR2VzdHVyZUxpc3RlbmVyI29uU2NhbGVCZWdpbihTY2FsZUdlc3R1cmVEZXRlY3Rvcil9IHJldHVybnMKLSAgICAgKiB7QGNvZGUgdHJ1ZX0uIAorICAgICAqIHtAY29kZSB0cnVlfS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZU9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgaW1wbGVtZW50cyBPblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VyclByZXNzdXJlOwogICAgIHByaXZhdGUgZmxvYXQgbVByZXZQcmVzc3VyZTsKICAgICBwcml2YXRlIGxvbmcgbVRpbWVEZWx0YTsKLSAgICAKKwogICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbUVkZ2VTbG9wOwogICAgIHByaXZhdGUgZmxvYXQgbVJpZ2h0U2xvcEVkZ2U7CiAgICAgcHJpdmF0ZSBmbG9hdCBtQm90dG9tU2xvcEVkZ2U7CkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgogICAgICAgICAgICAgICAgIGlmIChtU2xvcHB5R2VzdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWF0ZSBzbG9wcHkgZ2VzdHVyZXMgaWYgd2UndmUgbW92ZWQgb3V0c2lkZSBvZiB0aGUgc2xvcCBhcmVhLgpAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CiAgICAgICAgICAgICAgICAgaWYgKG1TbG9wcHlHZXN0dXJlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBmb2N1cyBwb2ludCB0byB0aGUgcmVtYWluaW5nIGZpbmdlcgpAQCAtMzA3LDE3ICszMDcsMTcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gaGFuZGxlZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WChpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLiAKKyAgICAgKiBNb3Rpb25FdmVudCBoYXMgbm8gZ2V0UmF3WChpbnQpIG1ldGhvZDsgc2ltdWxhdGUgaXQgcGVuZGluZyBmdXR1cmUgQVBJIGFwcHJvdmFsLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IGdldFJhd1goTW90aW9uRXZlbnQgZXZlbnQsIGludCBwb2ludGVySW5kZXgpIHsKICAgICAgICAgZmxvYXQgb2Zmc2V0ID0gZXZlbnQuZ2V0UmF3WCgpIC0gZXZlbnQuZ2V0WCgpOwogICAgICAgICByZXR1cm4gZXZlbnQuZ2V0WChwb2ludGVySW5kZXgpICsgb2Zmc2V0OwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIE1vdGlvbkV2ZW50IGhhcyBubyBnZXRSYXdZKGludCkgbWV0aG9kOyBzaW11bGF0ZSBpdCBwZW5kaW5nIGZ1dHVyZSBBUEkgYXBwcm92YWwuIAorICAgICAqIE1vdGlvbkV2ZW50IGhhcyBubyBnZXRSYXdZKGludCkgbWV0aG9kOyBzaW11bGF0ZSBpdCBwZW5kaW5nIGZ1dHVyZSBBUEkgYXBwcm92YWwuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgZ2V0UmF3WShNb3Rpb25FdmVudCBldmVudCwgaW50IHBvaW50ZXJJbmRleCkgewogICAgICAgICBmbG9hdCBvZmZzZXQgPSBldmVudC5nZXRSYXdZKCkgLSBldmVudC5nZXRZKCk7CkBAIC0zOTAsNyArMzkwLDcgQEAKICAgICAgKiByZW1haW5pbmcgcG9pbnRlciBvbiB0aGUgc2NyZWVuLgogICAgICAqIElmIHtAbGluayAjaXNJblByb2dyZXNzKCl9IHdvdWxkIHJldHVybiBmYWxzZSwgdGhlIHJlc3VsdCBvZiB0aGlzCiAgICAgICogZnVuY3Rpb24gaXMgdW5kZWZpbmVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBYIGNvb3JkaW5hdGUgb2YgdGhlIGZvY2FsIHBvaW50IGluIHBpeGVscy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0Rm9jdXNYKCkgewpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICogcmVtYWluaW5nIHBvaW50ZXIgb24gdGhlIHNjcmVlbi4KICAgICAgKiBJZiB7QGxpbmsgI2lzSW5Qcm9ncmVzcygpfSB3b3VsZCByZXR1cm4gZmFsc2UsIHRoZSByZXN1bHQgb2YgdGhpcwogICAgICAqIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gWSBjb29yZGluYXRlIG9mIHRoZSBmb2NhbCBwb2ludCBpbiBwaXhlbHMuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldEZvY3VzWSgpIHsKQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY3VycmVudCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRlcnMgZm9ybWluZyB0aGUKICAgICAgKiBnZXN0dXJlIGluIHByb2dyZXNzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBEaXN0YW5jZSBiZXR3ZWVuIHBvaW50ZXJzIGluIHBpeGVscy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0Q3VycmVudFNwYW4oKSB7CkBAIC00MjgsOSArNDI4LDI5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHggZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEN1cnJlbnRTcGFuWCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyRmluZ2VyRGlmZlg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHkgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldEN1cnJlbnRTcGFuWSgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyRmluZ2VyRGlmZlk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwcmV2aW91cyBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRlcnMgZm9ybWluZyB0aGUKICAgICAgKiBnZXN0dXJlIGluIHByb2dyZXNzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBQcmV2aW91cyBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50ZXJzIGluIHBpeGVscy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0UHJldmlvdXNTcGFuKCkgewpAQCAtNDQzLDEwICs0NjMsMzAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHggZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzIGZvcm1pbmcgdGhlCisgICAgICogZ2VzdHVyZSBpbiBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUHJldmlvdXMgZGlzdGFuY2UgYmV0d2VlbiBwb2ludGVycyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFByZXZpb3VzU3BhblgoKSB7CisgICAgICAgIHJldHVybiBtUHJldkZpbmdlckRpZmZYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJldmlvdXMgeSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRlcnMgZm9ybWluZyB0aGUKKyAgICAgKiBnZXN0dXJlIGluIHByb2dyZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBQcmV2aW91cyBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50ZXJzIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0UHJldmlvdXNTcGFuWSgpIHsKKyAgICAgICAgcmV0dXJuIG1QcmV2RmluZ2VyRGlmZlk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzY2FsaW5nIGZhY3RvciBmcm9tIHRoZSBwcmV2aW91cyBzY2FsZSBldmVudCB0byB0aGUgY3VycmVudAogICAgICAqIGV2ZW50LiBUaGlzIHZhbHVlIGlzIGRlZmluZWQgYXMKICAgICAgKiAoe0BsaW5rICNnZXRDdXJyZW50U3BhbigpfSAvIHtAbGluayAjZ2V0UHJldmlvdXNTcGFuKCl9KS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2NhbGluZyBmYWN0b3IuCiAgICAgICovCiAgICAgcHVibGljIGZsb2F0IGdldFNjYWxlRmFjdG9yKCkgewpAQCAtNDU1LDIwICs0OTUsMjAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNjYWxlRmFjdG9yOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdGltZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHRoZSBwcmV2aW91cwogICAgICAqIGFjY2VwdGVkIHNjYWxpbmcgZXZlbnQgYW5kIHRoZSBjdXJyZW50IHNjYWxpbmcgZXZlbnQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRpbWUgZGlmZmVyZW5jZSBzaW5jZSB0aGUgbGFzdCBzY2FsaW5nIGV2ZW50IGluIG1pbGxpc2Vjb25kcy4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRUaW1lRGVsdGEoKSB7CiAgICAgICAgIHJldHVybiBtVGltZURlbHRhOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCBldmVudCBiZWluZyBwcm9jZXNzZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgZXZlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0RXZlbnRUaW1lKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKaW5kZXggZmI4OGM3MS4uYjFmZGVjOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9BR0VfTUlMTElTRUNPTkRTID0gMjAwOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0lOVEVSX1BPT0xfQ0FQQUNJVFkgPSAyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT0lOVEVSID0gLTE7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQb29sPFZlbG9jaXR5VHJhY2tlcj4gc1Bvb2wgPSBQb29scy5zeW5jaHJvbml6ZWRQb29sKAogICAgICAgICAgICAgUG9vbHMuZmluaXRlUG9vbChuZXcgUG9vbGFibGVNYW5hZ2VyPFZlbG9jaXR5VHJhY2tlcj4oKSB7CkBAIC03Niw2ICs3Nyw3IEBACiAgICAgcHJpdmF0ZSBQb2ludGVyIG1Qb2ludGVyTGlzdEhlYWQ7IC8vIHNvcnRlZCBieSBpZCBpbiBpbmNyZWFzaW5nIG9yZGVyCiAgICAgcHJpdmF0ZSBpbnQgbUxhc3RUb3VjaEluZGV4OwogICAgIHByaXZhdGUgaW50IG1HZW5lcmF0aW9uOworICAgIHByaXZhdGUgaW50IG1BY3RpdmVQb2ludGVySWQ7CiAKICAgICBwcml2YXRlIFZlbG9jaXR5VHJhY2tlciBtTmV4dDsKIApAQCAtMTI1LDYgKzEyNyw3IEBACiAgICAgICAgIAogICAgICAgICBtUG9pbnRlckxpc3RIZWFkID0gbnVsbDsKICAgICAgICAgbUxhc3RUb3VjaEluZGV4ID0gMDsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xODAsNiArMTgzLDEwIEBACiAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB3ZW50IGRvd24uICBBZGQgaXQgdG8gdGhlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gV3JpdGUgYSBzZW50aW5lbCBhdCB0aGUgZW5kIG9mIHRoZSBwYXN0VGltZSB0cmFjZSBzbyB3ZSB3aWxsIGJlIGFibGUgdG8KICAgICAgICAgICAgICAgICAvLyB0ZWxsIHdoZW4gdGhlIHRyYWNlIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVQb2ludGVySWQgPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbmdyYXR1bGF0aW9ucyEgWW91J3JlIHRoZSBuZXcgYWN0aXZlIHBvaW50ZXIhCisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBwb2ludGVySWQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBvYnRhaW5Qb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgcG9pbnRlci5pZCA9IHBvaW50ZXJJZDsKICAgICAgICAgICAgICAgICBwb2ludGVyLnBhc3RUaW1lW2xhc3RUb3VjaEluZGV4XSA9IExvbmcuTUlOX1ZBTFVFOwpAQCAtMjE0LDYgKzIyMSw3IEBACiAgICAgICAgIHByZXZpb3VzUG9pbnRlciA9IG51bGw7CiAgICAgICAgIGZvciAoUG9pbnRlciBwb2ludGVyID0gbVBvaW50ZXJMaXN0SGVhZDsgcG9pbnRlciAhPSBudWxsOyApIHsKICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXIgbmV4dFBvaW50ZXIgPSBwb2ludGVyLm5leHQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gcG9pbnRlci5pZDsKICAgICAgICAgICAgIGlmIChwb2ludGVyLmdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgd2VudCB1cC4gIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1BvaW50ZXIgPT0gbnVsbCkgewpAQCAtMjIyLDYgKzIzMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1BvaW50ZXIubmV4dCA9IG5leHRQb2ludGVyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZWxlYXNlUG9pbnRlcihwb2ludGVyKTsKKworICAgICAgICAgICAgICAgIGlmIChwb2ludGVySWQgPT0gbUFjdGl2ZVBvaW50ZXJJZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQaWNrIGEgbmV3IGFjdGl2ZSBwb2ludGVyLiBIb3cgaXMgYXJiaXRyYXJ5LgorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gbVBvaW50ZXJMaXN0SGVhZCAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckxpc3RIZWFkLmlkIDogSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcHJldmlvdXNQb2ludGVyID0gcG9pbnRlcjsKICAgICAgICAgICAgIH0KQEAgLTMzNCw3ICszNDgsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgWCB2ZWxvY2l0eS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0WFZlbG9jaXR5KCkgewotICAgICAgICBQb2ludGVyIHBvaW50ZXIgPSBnZXRQb2ludGVyKDApOworICAgICAgICBQb2ludGVyIHBvaW50ZXIgPSBnZXRQb2ludGVyKG1BY3RpdmVQb2ludGVySWQpOwogICAgICAgICByZXR1cm4gcG9pbnRlciAhPSBudWxsID8gcG9pbnRlci54VmVsb2NpdHkgOiAwOwogICAgIH0KICAgICAKQEAgLTM0NSw3ICszNTksNyBAQAogICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgWSB2ZWxvY2l0eS4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0WVZlbG9jaXR5KCkgewotICAgICAgICBQb2ludGVyIHBvaW50ZXIgPSBnZXRQb2ludGVyKDApOworICAgICAgICBQb2ludGVyIHBvaW50ZXIgPSBnZXRQb2ludGVyKG1BY3RpdmVQb2ludGVySWQpOwogICAgICAgICByZXR1cm4gcG9pbnRlciAhPSBudWxsID8gcG9pbnRlci55VmVsb2NpdHkgOiAwOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKaW5kZXggZmUwMDNhNC4uNTFjMzg3OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKQEAgLTE2LDE0ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OwpAQCAtMzQsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CkBAIC00Nyw4ICs0Niw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sYWJsZTsKQEAgLTY1LDEyICs2MiwxNCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogCiAvKioKQEAgLTI2MCw3ICsyNTksOCBAQAogICogPHVsPgogICogPGxpPkRlZmluZSBhIEJ1dHRvbiBpbiB0aGUgbGF5b3V0IGZpbGUgYW5kIGFzc2lnbiBpdCBhIHVuaXF1ZSBJRC4KICAqIDxwcmU+Ci0gKiAmbHQ7QnV0dG9uIGlkPSJAK2lkL215X2J1dHRvbiIKKyAqICZsdDtCdXR0b24KKyAqICAgICBhbmRyb2lkOmlkPSJAK2lkL215X2J1dHRvbiIKICAqICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICogICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9teV9idXR0b25fdGV4dCIvJmd0OwpAQCAtOTE3LDYgKzkxNywyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEID0gMHgxMDAwMDAwMDsKIAogICAgIC8qKgorICAgICAqIDxwPkluZGljYXRlcyB0aGF0IHRoZSB2aWV3IGhpZXJhcmNoeSBzaG91bGQgc3RvcCBzYXZpbmcgc3RhdGUgd2hlbgorICAgICAqIGl0IHJlYWNoZXMgdGhpcyB2aWV3LiAgSWYgc3RhdGUgc2F2aW5nIGlzIGluaXRpYXRlZCBpbW1lZGlhdGVseSBhdAorICAgICAqIHRoZSB2aWV3LCBpdCB3aWxsIGJlIGFsbG93ZWQuCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUEFSRU5UX1NBVkVfRElTQUJMRUQgPSAweDIwMDAwMDAwOworCisgICAgLyoqCisgICAgICogPHA+TWFzayBmb3IgdXNlIHdpdGggc2V0RmxhZ3MgaW5kaWNhdGluZyBiaXRzIHVzZWQgZm9yIFBBUkVOVF9TQVZFX0RJU0FCTEVELjwvcD4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLID0gMHgyMDAwMDAwMDsKKworICAgIC8qKgogICAgICAqIFZpZXcgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIge0BsaW5rICNhZGRGb2N1c2FibGVzKEFycmF5TGlzdCwgaW50LCBpbnQpfQogICAgICAqIHNob3VsZCBhZGQgYWxsIGZvY3VzYWJsZSBWaWV3cyByZWdhcmRsZXNzIGlmIHRoZXkgYXJlIGZvY3VzYWJsZSBpbiB0b3VjaCBtb2RlLgogICAgICAqLwpAQCAtMTU1MSwzOCArMTU2NSwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBV0FLRU5fU0NST0xMX0JBUlNfT05fQVRUQUNIID0gMHgwODAwMDAwMDsKIAogICAgIC8qKgotICAgICAqIEFsd2F5cyBhbGxvdyBhIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGlzIHZpZXcsIHByb3ZpZGVkIGl0IGlzIGEKLSAgICAgKiB2aWV3IHRoYXQgY2FuIHNjcm9sbC4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBwaXZvdFggb3IgcGl2b3RZIHdlcmUgZXhwbGljaXRseSBzZXQgYW5kIHdlIHNob3VsZCBub3QgYXNzdW1lIHRoZSBjZW50ZXIKKyAgICAgKiBmb3IgdHJhbnNmb3JtIG9wZXJhdGlvbnMKICAgICAgKgotICAgICAqIEBzZWUgI2dldE92ZXJzY3JvbGxNb2RlKCkKLSAgICAgKiBAc2VlICNzZXRPdmVyc2Nyb2xsTW9kZShpbnQpCisgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSU0NST0xMX0FMV0FZUyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvdyBhIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGlzIHZpZXcgb25seSBpZiB0aGUgY29udGVudCBpcyBsYXJnZQotICAgICAqIGVub3VnaCB0byBtZWFuaW5nZnVsbHkgc2Nyb2xsLCBwcm92aWRlZCBpdCBpcyBhIHZpZXcgdGhhdCBjYW4gc2Nyb2xsLgotICAgICAqCi0gICAgICogQHNlZSAjZ2V0T3ZlcnNjcm9sbE1vZGUoKQotICAgICAqIEBzZWUgI3NldE92ZXJzY3JvbGxNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBOZXZlciBhbGxvdyBhIHVzZXIgdG8gb3ZlcnNjcm9sbCB0aGlzIHZpZXcuCi0gICAgICoKLSAgICAgKiBAc2VlICNnZXRPdmVyc2Nyb2xsTW9kZSgpCi0gICAgICogQHNlZSAjc2V0T3ZlcnNjcm9sbE1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfTkVWRVIgPSAyOwotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgdGhlIG92ZXJzY3JvbGwgbW9kZSBmb3IgdGhpcyB2aWV3LgotICAgICAqIFNlZSB7QGxpbmsgI292ZXJzY3JvbGxCeShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgYm9vbGVhbil9LAotICAgICAqIHtAbGluayAjT1ZFUlNDUk9MTF9BTFdBWVN9LCB7QGxpbmsgI09WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTfSwKLSAgICAgKiBhbmQge0BsaW5rICNPVkVSU0NST0xMX05FVkVSfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbE1vZGUgPSBPVkVSU0NST0xMX0FMV0FZUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElWT1RfRVhQTElDSVRMWV9TRVQgPSAweDEwMDAwMDAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIHBhcmVudCB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8uCkBAIC0xNjM1LDYgKzE2MjMsMTM1IEBACiAgICAgaW50IG1WaWV3RmxhZ3M7CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIFZpZXcuIFRoaXMgdHJhbnNmb3JtIGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseQorICAgICAqIGJhc2VkIG9uIHRoZSByb3RhdGlvbiwgc2NhbGVYLCBhbmQgc2NhbGVZIHByb3BlcnRpZXMuIFRoZSBpZGVudGl0eSBtYXRyaXgKKyAgICAgKiBpcyB1c2VkIGJ5IGRlZmF1bHQuIERvICpub3QqIHVzZSB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5OyBpbnN0ZWFkIGNhbGwKKyAgICAgKiBnZXRNYXRyaXgoKSwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IHJlY2FsY3VsYXRlIHRoZSBtYXRyaXggaWYgbmVjZXNzYXJ5CisgICAgICogdG8gZ2V0IHRoZSBjb3JyZWN0IG1hdHJpeCBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvdGF0aW9uIGFuZCBzY2FsZSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWF0cml4IG1NYXRyaXggPSBuZXcgTWF0cml4KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIFZpZXcuIFRoaXMgdHJhbnNmb3JtIGlzIGNhbGN1bGF0ZWQgaW50ZXJuYWxseQorICAgICAqIGJhc2VkIG9uIHRoZSByb3RhdGlvbiwgc2NhbGVYLCBhbmQgc2NhbGVZIHByb3BlcnRpZXMuIFRoZSBpZGVudGl0eSBtYXRyaXgKKyAgICAgKiBpcyB1c2VkIGJ5IGRlZmF1bHQuIERvICpub3QqIHVzZSB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5OyBpbnN0ZWFkIGNhbGwKKyAgICAgKiBnZXRNYXRyaXgoKSwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IHJlY2FsY3VsYXRlIHRoZSBtYXRyaXggaWYgbmVjZXNzYXJ5CisgICAgICogdG8gZ2V0IHRoZSBjb3JyZWN0IG1hdHJpeCBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvdGF0aW9uIGFuZCBzY2FsZSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgTWF0cml4IG1JbnZlcnNlTWF0cml4OworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgdmFyaWFibGUgdGhhdCB0cmFja3Mgd2hldGhlciB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQorICAgICAqIHRyYW5zZm9ybSBtYXRyaXgsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJvdGF0aW9uIG9yIHNjYWxlWC9ZIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG1hdHJpeCB3YXMgbGFzdCBjYWxjdWxhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0cml4RGlydHkgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEFuIGludGVybmFsIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUludmVyc2VNYXRyaXhEaXJ0eSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBIHZhcmlhYmxlIHRoYXQgdHJhY2tzIHdoZXRoZXIgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUKKyAgICAgKiB0cmFuc2Zvcm0gbWF0cml4LCBiYXNlZCBvbiB3aGV0aGVyIHRoZSByb3RhdGlvbiBvciBzY2FsZVgvWSBwcm9wZXJ0aWVzCisgICAgICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBtYXRyaXggd2FzIGxhc3QgY2FsY3VsYXRlZC4gVGhpcyB2YXJpYWJsZQorICAgICAqIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgYSBjYWxsIHRvIGdldE1hdHJpeCgpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0cml4SXNJZGVudGl0eSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ2FtZXJhIG9iamVjdCBpcyB1c2VkIHRvIGNvbXB1dGUgYSAzRCBtYXRyaXggd2hlbiByb3RhdGlvblggb3Igcm90YXRpb25ZIGFyZSBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBDYW1lcmEgbUNhbWVyYSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1hdHJpeCBpcyB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSBtYXRyaXggZm9yIDNEIHJvdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hdHJpeCBtYXRyaXgzRCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBwcmV2IHZhbHVlcyBhcmUgdXNlZCB0byByZWNhbGN1bGF0ZSBhIGNlbnRlcmVkIHBpdm90IHBvaW50IHdoZW4gbmVjZXNzYXJ5LiBUaGUKKyAgICAgKiBwaXZvdCBwb2ludCBpcyBvbmx5IHVzZWQgaW4gbWF0cml4IG9wZXJhdGlvbnMgKHdoZW4gcm90YXRpb24sIHNjYWxlLCBvciB0cmFuc2xhdGlvbiBhcmUKKyAgICAgKiBzZXQpLCBzbyB0aGVzIHZhbHVlcyBhcmUgb25seSB1c2VkIHRoZW4gYXMgd2VsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtUHJldldpZHRoID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIHZhbHVlIHRvIGNoZWNrIGZvciBmbG9hdCB2YWx1ZXMgdGhhdCBhcmUgY2xvc2UgZW5vdWdoIHRvIHplcm8gdG8gYmUgY29uc2lkZXJlZAorICAgICAqIHplcm8uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTk9OWkVST19FUFNJTE9OID0gLjAwMWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb25ZID0gMGY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyByb3RhdGlvbiBhcm91bmQgdGhlIGhvcml6b250YWwgYXhpcyB0aHJvdWdoIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1Sb3RhdGlvblggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWdyZWVzIHJvdGF0aW9uIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtUm90YXRpb24gPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdHJhbnNsYXRpb24gb2YgdGhlIG9iamVjdCBhd2F5IGZyb20gaXRzIGxlZnQgcHJvcGVydHkgKHBvc3QtbGF5b3V0KS4KKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblggPSAwZjsKKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgb2YgdHJhbnNsYXRpb24gb2YgdGhlIG9iamVjdCBhd2F5IGZyb20gaXRzIHRvcCBwcm9wZXJ0eSAocG9zdC1sYXlvdXQpLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVRyYW5zbGF0aW9uWSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeCBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWCA9IDFmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeSBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlWSA9IDFmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeCBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVBpdm90WCA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiBzY2FsZSBpbiB0aGUgeSBkaXJlY3Rpb24gYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gQQorICAgICAqIHZhbHVlIG9mIDEgbWVhbnMgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorICAgIHByaXZhdGUgZmxvYXQgbVBpdm90WSA9IDBmOworCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIFZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CisgICAgcHJpdmF0ZSBmbG9hdCBtQWxwaGEgPSAxZjsKKworICAgIC8qKgogICAgICAqIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoaXMgdmlldydzIHBhcmVudAogICAgICAqIHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyB2aWV3LgogICAgICAqIHtAaGlkZX0KQEAgLTE3NDgsNiArMTg2NSwxMSBAQAogICAgIHByb3RlY3RlZCBPbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbU9uRm9jdXNDaGFuZ2VMaXN0ZW5lcjsKIAogICAgIC8qKgorICAgICAqIExpc3RlbmVycyBmb3IgbGF5b3V0IGNoYW5nZSBldmVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8T25MYXlvdXRDaGFuZ2VMaXN0ZW5lcj4gbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzOworCisgICAgLyoqCiAgICAgICogTGlzdGVuZXIgdXNlZCB0byBkaXNwYXRjaCBjbGljayBldmVudHMuCiAgICAgICogVGhpcyBmaWVsZCBzaG91bGQgYmUgbWFkZSBwcml2YXRlLCBzbyBpdCBpcyBoaWRkZW4gZnJvbSB0aGUgU0RLLgogICAgICAqIHtAaGlkZX0KQEAgLTE3ODMsOCArMTkwNSw4IEBACiAKICAgICBwcml2YXRlIGludFtdIG1EcmF3YWJsZVN0YXRlID0gbnVsbDsKIAotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxCaXRtYXA+IG1EcmF3aW5nQ2FjaGU7Ci0gICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4gbVVuc2NhbGVkRHJhd2luZ0NhY2hlOworICAgIHByaXZhdGUgQml0bWFwIG1EcmF3aW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBCaXRtYXAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlOwogCiAgICAgLyoqCiAgICAgICogV2hlbiB0aGlzIHZpZXcgaGFzIGZvY3VzIGFuZCB0aGUgbmV4dCBmb2N1cyBpcyB7QGxpbmsgI0ZPQ1VTX0xFRlR9LApAQCAtMTg2MCw5ICsxOTgyLDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBtVG91Y2hTbG9wOwogCi0gICAgLy8gVXNlZCBmb3IgZGVidWcgb25seQotICAgIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIC8qKgogICAgICAqIFNpbXBsZSBjb25zdHJ1Y3RvciB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIHZpZXcgZnJvbSBjb2RlLgogICAgICAqCkBAIC0xODczLDggKzE5OTIsNiBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0ICE9IG51bGwgPyBjb250ZXh0LmdldFJlc291cmNlcygpIDogbnVsbDsKICAgICAgICAgbVZpZXdGbGFncyA9IFNPVU5EX0VGRkVDVFNfRU5BQkxFRCB8IEhBUFRJQ19GRUVEQkFDS19FTkFCTEVEOwotICAgICAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5Ci0gICAgICAgIC8vKytzSW5zdGFuY2VDb3VudDsKICAgICAgICAgbVRvdWNoU2xvcCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChjb250ZXh0KS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICB9CiAKQEAgLTE5NDEsNyArMjA1OCw2IEBACiAKICAgICAgICAgaW50IHNjcm9sbGJhclN0eWxlID0gU0NST0xMQkFSU19JTlNJREVfT1ZFUkxBWTsKIAotICAgICAgICBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBtT3ZlcnNjcm9sbE1vZGU7CiAgICAgICAgIGZpbmFsIGludCBOID0gYS5nZXRJbmRleENvdW50KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgYXR0ciA9IGEuZ2V0SW5kZXgoaSk7CkBAIC0yMTQ3LDE0ICsyMjYzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUi5zdHlsZWFibGUuVmlld19vdmVyc2Nyb2xsTW9kZToKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnNjcm9sbE1vZGUgPSBhLmdldEludChhdHRyLCBPVkVSU0NST0xMX0FMV0FZUyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc2V0T3ZlcnNjcm9sbE1vZGUob3ZlcnNjcm9sbE1vZGUpOwotCiAgICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKICAgICAgICAgfQpAQCAtMjIwMywxNSArMjMxNCw2IEBACiAgICAgVmlldygpIHsKICAgICB9CiAKLSAgICAvLyBVc2VkIGZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogSW5pdGlhbGl6ZXMgdGhlIGZhZGluZyBlZGdlcyBmcm9tIGEgZ2l2ZW4gc2V0IG9mIHN0eWxlZCBhdHRyaWJ1dGVzLiBUaGlzCkBAIC0yNDE4LDYgKzI1MjAsMzkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGJvdW5kcyBvZiB0aGUgdmlldyBjaGFuZ2UgZHVlIHRvCisgICAgICogbGF5b3V0IHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBsYXlvdXQgYm91bmRzIGNoYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPbkxheW91dENoYW5nZUxpc3RlbmVyKE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1PbkxheW91dENoYW5nZUxpc3RlbmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+KCk7CisgICAgICAgIH0KKyAgICAgICAgbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZm9yIGxheW91dCBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmb3IgbGF5b3V0IGJvdW5kcyBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcihPbkxheW91dENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmIChtT25MYXlvdXRDaGFuZ2VMaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1PbkxheW91dENoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBsaXN0ZW5lcnMgZm9yIGxheW91dCBjaGFuZ2VzLgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPbkxheW91dENoYW5nZUxpc3RlbmVyPiBnZXRPbkxheW91dENoYW5nZUxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1PbkxheW91dENoYW5nZUxpc3RlbmVyczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBmb2N1cy1jaGFuZ2UgY2FsbGJhY2sgcmVnaXN0ZXJlZCBmb3IgdGhpcyB2aWV3LgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgY2FsbGJhY2ssIG9yIG51bGwgaWYgb25lIGlzIG5vdCByZWdpc3RlcmVkLgpAQCAtMjUyMCw2ICsyNjU1LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU3RhcnQgYW4gYWN0aW9uIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIGNvbnRyb2wgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYWN0aW9uIG1vZGUKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgYWN0aW9uIG1vZGUgaWYgaXQgaXMgc3RhcnRlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIEBzZWUgQWN0aW9uTW9kZQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBnZXRQYXJlbnQoKS5zdGFydEFjdGlvbk1vZGVGb3JDaGlsZCh0aGlzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBpbiB0aGlzIHZpZXcuCiAgICAgICogQHBhcmFtIGwgdGhlIGtleSBsaXN0ZW5lciB0byBhdHRhY2ggdG8gdGhpcyB2aWV3CiAgICAgICovCkBAIC0zMzQ5LDcgKzM0OTYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByZXNzZWQgdGhhdCBmb3IgdGhpcyB2aWV3LgorICAgICAqIFNldHMgdGhlIHByZXNzZWQgc3RhdGUgZm9yIHRoaXMgdmlldy4KICAgICAgKgogICAgICAqIEBzZWUgI2lzQ2xpY2thYmxlKCkKICAgICAgKiBAc2VlICNzZXRDbGlja2FibGUoYm9vbGVhbikKQEAgLTM0NTYsNiArMzYwMywzOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRpcmUgaGllcmFyY2h5IHVuZGVyIHRoaXMgdmlldyB3aWxsIHNhdmUgaXRzCisgICAgICogc3RhdGUgd2hlbiBhIHN0YXRlIHNhdmluZyB0cmF2ZXJzYWwgb2NjdXJzIGZyb20gaXRzIHBhcmVudC4gIFRoZSBkZWZhdWx0CisgICAgICogaXMgdHJ1ZTsgaWYgZmFsc2UsIHRoZXNlIHZpZXdzIHdpbGwgbm90IGJlIHNhdmVkIHVubGVzcworICAgICAqIHtAbGluayAjc2F2ZUhpZXJhcmNoeVN0YXRlKFNwYXJzZUFycmF5KX0gaXMgY2FsbGVkIGRpcmVjdGx5IG9uIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoZSB2aWV3IHN0YXRlIHNhdmluZyBmcm9tIHBhcmVudCBpcyBlbmFibGVkLCBlbHNlIGZhbHNlLgorICAgICAqCisgICAgICogQHNlZSAjc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTYXZlRnJvbVBhcmVudEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobVZpZXdGbGFncyAmIFBBUkVOVF9TQVZFX0RJU0FCTEVEX01BU0spICE9IFBBUkVOVF9TQVZFX0RJU0FCTEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkgdW5kZXIgdGhpcyB2aWV3IHdpbGwgc2F2ZSBpdHMKKyAgICAgKiBzdGF0ZSB3aGVuIGEgc3RhdGUgc2F2aW5nIHRyYXZlcnNhbCBvY2N1cnMgZnJvbSBpdHMgcGFyZW50LiAgVGhlIGRlZmF1bHQKKyAgICAgKiBpcyB0cnVlOyBpZiBmYWxzZSwgdGhlc2Ugdmlld3Mgd2lsbCBub3QgYmUgc2F2ZWQgdW5sZXNzCisgICAgICoge0BsaW5rICNzYXZlSGllcmFyY2h5U3RhdGUoU3BhcnNlQXJyYXkpfSBpcyBjYWxsZWQgZGlyZWN0bHkgb24gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgU2V0IHRvIGZhbHNlIHRvIDxlbT5kaXNhYmxlPC9lbT4gc3RhdGUgc2F2aW5nLCBvciB0cnVlCisgICAgICogKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBpdC4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzU2F2ZUZyb21QYXJlbnRFbmFibGVkKCkKKyAgICAgKiBAc2VlICNzZXRJZChpbnQpCisgICAgICogQHNlZSAjb25TYXZlSW5zdGFuY2VTdGF0ZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2F2ZUZyb21QYXJlbnRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBzZXRGbGFncyhlbmFibGVkID8gMCA6IFBBUkVOVF9TQVZFX0RJU0FCTEVELCBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKTsKKyAgICB9CisKKworICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIFZpZXcgaXMgYWJsZSB0byB0YWtlIGZvY3VzLgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgdmlldyBjYW4gdGFrZSBmb2N1cywgb3IgZmFsc2Ugb3RoZXJ3aXNlLgpAQCAtMzg0MCwxMiArNDAxOSwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgLy8gSWYgYW55IGF0dGFjaGVkIGtleSBsaXN0ZW5lciBhIGZpcnN0IGNyYWNrIGF0IHRoZSBldmVudC4KLSAgICAgICAgLy9ub2luc3BlY3Rpb24gU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQKIAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudCxkZXByZWNhdGlvbgogICAgICAgICBpZiAoYW5kcm9pZC51dGlsLkNvbmZpZy5MT0dWKSB7CiAgICAgICAgICAgICBjYXB0dXJlVmlld0luZm8oImNhcHR1cmVWaWV3S2V5RXZlbnQiLCB0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25LZXlMaXN0ZW5lciAhPSBudWxsICYmIChtVmlld0ZsYWdzICYgRU5BQkxFRF9NQVNLKSA9PSBFTkFCTEVECiAgICAgICAgICAgICAgICAgJiYgbU9uS2V5TGlzdGVuZXIub25LZXkodGhpcywgZXZlbnQuZ2V0S2V5Q29kZSgpLCBldmVudCkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzg3Nyw2ICs0MDU3LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFNpbXBsaWZpYWJsZUlmU3RhdGVtZW50CiAgICAgICAgIGlmIChtT25Ub3VjaExpc3RlbmVyICE9IG51bGwgJiYgKG1WaWV3RmxhZ3MgJiBFTkFCTEVEX01BU0spID09IEVOQUJMRUQgJiYKICAgICAgICAgICAgICAgICBtT25Ub3VjaExpc3RlbmVyLm9uVG91Y2godGhpcywgZXZlbnQpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4OTMsNiArNDA3NCw3IEBACiAgICAgICogQHNlZSAjZ2V0RmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyVG91Y2hFdmVudEZvclNlY3VyaXR5KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlZHVuZGFudElmU3RhdGVtZW50CiAgICAgICAgIGlmICgobVZpZXdGbGFncyAmIEZJTFRFUl9UT1VDSEVTX1dIRU5fT0JTQ1VSRUQpICE9IDAKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSAmIE1vdGlvbkV2ZW50LkZMQUdfV0lORE9XX0lTX09CU0NVUkVEKSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBXaW5kb3cgaXMgb2JzY3VyZWQsIGRyb3AgdGhpcyB0b3VjaC4KQEAgLTQ0OTksOSArNDY4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXZlbnQuZ2V0WSgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIEJlIGxlbmllbnQgYWJvdXQgbW92aW5nIG91dHNpZGUgb2YgYnV0dG9ucwotICAgICAgICAgICAgICAgICAgICBpbnQgc2xvcCA9IG1Ub3VjaFNsb3A7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoeCA8IDAgLSBzbG9wKSB8fCAoeCA+PSBnZXRXaWR0aCgpICsgc2xvcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSA8IDAgLSBzbG9wKSB8fCAoeSA+PSBnZXRIZWlnaHQoKSArIHNsb3ApKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcG9pbnRJblZpZXcoeCwgeSwgbVRvdWNoU2xvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dHNpZGUgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUYXBDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgUFJFU1NFRCkgIT0gMCkgewpAQCAtNDczNiw2ICs0OTE2LDI4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsYXlvdXQgYm91bmRzIG9mIGEgdmlldworICAgICAqIGNoYW5nZXMgZHVlIHRvIGxheW91dCBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25MYXlvdXRDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZm9jdXMgc3RhdGUgb2YgYSB2aWV3IGhhcyBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdiBUaGUgdmlldyB3aG9zZSBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICogQHBhcmFtIGxlZnQgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgdmlldydzIGxlZnQgcHJvcGVydHkuCisgICAgICAgICAqIEBwYXJhbSB0b3AgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgdmlldydzIHRvcCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIHJpZ2h0IFRoZSBuZXcgdmFsdWUgb2YgdGhlIHZpZXcncyByaWdodCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgbmV3IHZhbHVlIG9mIHRoZSB2aWV3J3MgYm90dG9tIHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gb2xkTGVmdCBUaGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIHZpZXcncyBsZWZ0IHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gb2xkVG9wIFRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgdmlldydzIHRvcCBwcm9wZXJ0eS4KKyAgICAgICAgICogQHBhcmFtIG9sZFJpZ2h0IFRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgdmlldydzIHJpZ2h0IHByb3BlcnR5LgorICAgICAgICAgKiBAcGFyYW0gb2xkQm90dG9tIFRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgdmlldydzIGJvdHRvbSBwcm9wZXJ0eS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25MYXlvdXRDaGFuZ2UoVmlldyB2LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tLAorICAgICAgICAgICAgaW50IG9sZExlZnQsIGludCBvbGRUb3AsIGludCBvbGRSaWdodCwgaW50IG9sZEJvdHRvbSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIGxheW91dCB3aGVuIHRoZSBzaXplIG9mIHRoaXMgdmlldyBoYXMgY2hhbmdlZC4gSWYKICAgICAgKiB5b3Ugd2VyZSBqdXN0IGFkZGVkIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSwgeW91J3JlIGNhbGxlZCB3aXRoIHRoZSBvbGQKICAgICAgKiB2YWx1ZXMgb2YgMC4KQEAgLTQ4NDcsNiArNTA0OSwzNTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNmb3JtIG1hdHJpeCBvZiB0aGlzIHZpZXcsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAgICAgKiByb2F0aW9uLCBzY2FsZSwgYW5kIHBpdm90IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZSB2aWV3CisgICAgICovCisgICAgcHVibGljIE1hdHJpeCBnZXRNYXRyaXgoKSB7CisgICAgICAgIGhhc0lkZW50aXR5TWF0cml4KCk7CisgICAgICAgIHJldHVybiBtTWF0cml4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBmYXIgZW5vdWdoIGF3YXkgZnJvbSB6ZXJvIHRvIGJlCisgICAgICogY29uc2lkZXJlZCBub24temVyby4KKyAgICAgKiBAcGFyYW0gdmFsdWUgQSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBjaGVjayBmb3IgemVyby1uZXNzCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBwYXNzZWQtaW4gdmFsdWUgaXMgZmFyIGVub3VnaCBhd2F5IGZyb20gemVybyB0byBiZSBjb25zaWRlcmVkIG5vbi16ZXJvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub256ZXJvKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPCAtTk9OWkVST19FUFNJTE9OIHx8IHZhbHVlID4gTk9OWkVST19FUFNJTE9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvbXB1dGVzIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGlmIG5lY2Vzc2FyeS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zZm9ybSBtYXRyaXggaXMgdGhlIGlkZW50aXR5IG1hdHJpeCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzSWRlbnRpdHlNYXRyaXgoKSB7CisgICAgICAgIGlmIChtTWF0cml4RGlydHkpIHsKKyAgICAgICAgICAgIC8vIHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgc29tZW9uZQorICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBtYXRyaXg7IHJlY2FsY3VsYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCisKKyAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHBpdm90IHBvaW50CisgICAgICAgICAgICBpZiAoKG1Qcml2YXRlRmxhZ3MgJiBQSVZPVF9FWFBMSUNJVExZX1NFVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgobVJpZ2h0IC0gbUxlZnQpICE9IG1QcmV2V2lkdGggJiYgKG1Cb3R0b20gLSBtVG9wKSAhPSBtUHJldkhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CisgICAgICAgICAgICAgICAgICAgIG1QaXZvdFggPSAoZmxvYXQpIG1QcmV2V2lkdGggLyAyZjsKKyAgICAgICAgICAgICAgICAgICAgbVBpdm90WSA9IChmbG9hdCkgbVByZXZIZWlnaHQgLyAyZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF0cml4LnJlc2V0KCk7CisgICAgICAgICAgICBpZiAoIW5vbnplcm8obVJvdGF0aW9uWCkgJiYgIW5vbnplcm8obVJvdGF0aW9uWSkpIHsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnNldFRyYW5zbGF0ZShtVHJhbnNsYXRpb25YLCBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnByZVJvdGF0ZShtUm90YXRpb24sIG1QaXZvdFgsIG1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtQ2FtZXJhID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4M0QgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1lcmEuc2F2ZSgpOworICAgICAgICAgICAgICAgIG1NYXRyaXgucHJlU2NhbGUobVNjYWxlWCwgbVNjYWxlWSwgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5yb3RhdGVYKG1Sb3RhdGlvblgpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucm90YXRlWShtUm90YXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLnJvdGF0ZVooLW1Sb3RhdGlvbik7CisgICAgICAgICAgICAgICAgbUNhbWVyYS5nZXRNYXRyaXgobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnByZVRyYW5zbGF0ZSgtbVBpdm90WCwgLW1QaXZvdFkpOworICAgICAgICAgICAgICAgIG1hdHJpeDNELnBvc3RUcmFuc2xhdGUobVBpdm90WCArIG1UcmFuc2xhdGlvblgsIG1QaXZvdFkgKyBtVHJhbnNsYXRpb25ZKTsKKyAgICAgICAgICAgICAgICBtTWF0cml4LnBvc3RDb25jYXQobWF0cml4M0QpOworICAgICAgICAgICAgICAgIG1DYW1lcmEucmVzdG9yZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gZmFsc2U7CisgICAgICAgICAgICBtTWF0cml4SXNJZGVudGl0eSA9IG1NYXRyaXguaXNJZGVudGl0eSgpOworICAgICAgICAgICAgbUludmVyc2VNYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1NYXRyaXhJc0lkZW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBpbnZlcnNlIG9mIHRoZSBjdXJyZW50IG1NYXRyaXggcHJvcGVydHkuCisgICAgICogV2UgY2FjaGUgdGhlIG1hdHJpeCB0byBhdm9pZCByZWNhbGN1bGF0aW5nIGl0IHdoZW4gdHJhbnNmb3JtIHByb3BlcnRpZXMKKyAgICAgKiBoYXZlIG5vdCBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgaW52ZXJzZSBvZiB0aGUgY3VycmVudCBtYXRyaXggb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIE1hdHJpeCBnZXRJbnZlcnNlTWF0cml4KCkgeworICAgICAgICBpZiAobUludmVyc2VNYXRyaXhEaXJ0eSkgeworICAgICAgICAgICAgaWYgKG1JbnZlcnNlTWF0cml4ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NYXRyaXguaW52ZXJ0KG1JbnZlcnNlTWF0cml4KTsKKyAgICAgICAgICAgIG1JbnZlcnNlTWF0cml4RGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUludmVyc2VNYXRyaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBwaXZvdCBwb2ludC4gSW5jcmVhc2luZyB2YWx1ZXMKKyAgICAgKiByZXN1bHQgaW4gY2xvY2t3aXNlIHJvdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uIFRoZSBkZWdyZWVzIG9mIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvbihmbG9hdCByb3RhdGlvbikgeworICAgICAgICBpZiAobVJvdGF0aW9uICE9IHJvdGF0aW9uKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSB2ZXJ0aWNhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIGRlZ3JlZXMgb2YgWSByb3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0Um90YXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVJvdGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZWdyZWVzIHRoYXQgdGhlIHZpZXcgaXMgcm90YXRlZCBhcm91bmQgdGhlIHZlcnRpY2FsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICogSW5jcmVhc2luZyB2YWx1ZXMgcmVzdWx0IGluIGNvdW50ZXItY2xvY2t3aXNlIHJvdGF0aW9uIGZyb20gdGhlIHZpZXdwb2ludCBvZiBsb29raW5nCisgICAgICogZG93biB0aGUgeSBheGlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0aW9uWSBUaGUgZGVncmVlcyBvZiBZIHJvdGF0aW9uLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGlvblkoZmxvYXQgcm90YXRpb25ZKSB7CisgICAgICAgIGlmIChtUm90YXRpb25ZICE9IHJvdGF0aW9uWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1Sb3RhdGlvblkgPSByb3RhdGlvblk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVncmVlcyB0aGF0IHRoZSB2aWV3IGlzIHJvdGF0ZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGF4aXMgdGhyb3VnaCB0aGUgcGl2b3QgcG9pbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgZGVncmVlcyBvZiBYIHJvdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRSb3RhdGlvblgoKSB7CisgICAgICAgIHJldHVybiBtUm90YXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZ3JlZXMgdGhhdCB0aGUgdmlldyBpcyByb3RhdGVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCBheGlzIHRocm91Z2ggdGhlIHBpdm90IHBvaW50LgorICAgICAqIEluY3JlYXNpbmcgdmFsdWVzIHJlc3VsdCBpbiBjbG9ja3dpc2Ugcm90YXRpb24gZnJvbSB0aGUgdmlld3BvaW50IG9mIGxvb2tpbmcgZG93biB0aGUKKyAgICAgKiB4IGF4aXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm90YXRpb25YIFRoZSBkZWdyZWVzIG9mIFggcm90YXRpb24uCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdGF0aW9uWChmbG9hdCByb3RhdGlvblgpIHsKKyAgICAgICAgaWYgKG1Sb3RhdGlvblggIT0gcm90YXRpb25YKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVJvdGF0aW9uWCA9IHJvdGF0aW9uWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geCBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIHdpZHRoLiBBIHZhbHVlIG9mIDEsIHRoZSBkZWZhdWx0LCBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBkZWZhdWx0IDEuMGYKKyAgICAgKiBAc2VlICNnZXRQaXZvdFgoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICogQHJldHVybiBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYW1vdW50IHRoYXQgdGhlIHZpZXcgaXMgc2NhbGVkIGluIHggYXJvdW5kIHRoZSBwaXZvdCBwb2ludCwgYXMgYSBwcm9wb3J0aW9uIG9mCisgICAgICogdGhlIHZpZXcncyB1bnNjYWxlZCB3aWR0aC4gQSB2YWx1ZSBvZiAxIG1lYW5zIHRoYXQgbm8gc2NhbGluZyBpcyBhcHBsaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNjYWxlWCBUaGUgc2NhbGluZyBmYWN0b3IuCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWChmbG9hdCBzY2FsZVgpIHsKKyAgICAgICAgaWYgKG1TY2FsZVggIT0gc2NhbGVYKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVNjYWxlWCA9IHNjYWxlWDsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhbW91bnQgdGhhdCB0aGUgdmlldyBpcyBzY2FsZWQgaW4geSBhcm91bmQgdGhlIHBpdm90IHBvaW50LCBhcyBhIHByb3BvcnRpb24gb2YKKyAgICAgKiB0aGUgdmlldydzIHVuc2NhbGVkIGhlaWdodC4gQSB2YWx1ZSBvZiAxLCB0aGUgZGVmYXVsdCwgbWVhbnMgdGhhdCBubyBzY2FsaW5nIGlzIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHNlZSAjZ2V0UGl2b3RYKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZVkoKSB7CisgICAgICAgIHJldHVybiBtU2NhbGVZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFtb3VudCB0aGF0IHRoZSB2aWV3IGlzIHNjYWxlZCBpbiBZIGFyb3VuZCB0aGUgcGl2b3QgcG9pbnQsIGFzIGEgcHJvcG9ydGlvbiBvZgorICAgICAqIHRoZSB2aWV3J3MgdW5zY2FsZWQgd2lkdGguIEEgdmFsdWUgb2YgMSBtZWFucyB0aGF0IG5vIHNjYWxpbmcgaXMgYXBwbGllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2FsZVkgVGhlIHNjYWxpbmcgZmFjdG9yLgorICAgICAqIEBzZWUgI2dldFBpdm90WCgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FsZVkoZmxvYXQgc2NhbGVZKSB7CisgICAgICAgIGlmIChtU2NhbGVZICE9IHNjYWxlWSkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1TY2FsZVkgPSBzY2FsZVk7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVYKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFgoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RYOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHggbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcworICAgICAqIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9IGFuZCB7QGxpbmsgI3NldFNjYWxlWChmbG9hdCkgc2NhbGVkfS4KKyAgICAgKiBCeSBkZWZhdWx0LCB0aGUgcGl2b3QgcG9pbnQgaXMgY2VudGVyZWQgb24gdGhlIG9iamVjdC4KKyAgICAgKiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgZGlzYWJsZXMgdGhpcyBiZWhhdmlvciBhbmQgY2F1c2VzIHRoZSB2aWV3IHRvIHVzZSBvbmx5IHRoZQorICAgICAqIGV4cGxpY2l0bHkgc2V0IHBpdm90WCBhbmQgcGl2b3RZIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXZvdFggVGhlIHggbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqIEBzZWUgI2dldFJvdGF0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVgoKQorICAgICAqIEBzZWUgI2dldFNjYWxlWSgpCisgICAgICogQHNlZSAjZ2V0UGl2b3RZKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQaXZvdFgoZmxvYXQgcGl2b3RYKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gUElWT1RfRVhQTElDSVRMWV9TRVQ7CisgICAgICAgIGlmIChtUGl2b3RYICE9IHBpdm90WCkgeworICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG1QaXZvdFggPSBwaXZvdFg7CisgICAgICAgICAgICBtTWF0cml4RGlydHkgPSB0cnVlOworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgeSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSB2aWV3IGlzIHtAbGluayAjc2V0Um90YXRpb24oZmxvYXQpIHJvdGF0ZWR9CisgICAgICogYW5kIHtAbGluayAjc2V0U2NhbGVZKGZsb2F0KSBzY2FsZWR9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0Um90YXRpb24oKQorICAgICAqIEBzZWUgI2dldFNjYWxlWCgpCisgICAgICogQHNlZSAjZ2V0U2NhbGVZKCkKKyAgICAgKiBAc2VlICNnZXRQaXZvdFkoKQorICAgICAqIEByZXR1cm4gVGhlIHkgbG9jYXRpb24gb2YgdGhlIHBpdm90IHBvaW50LgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFkoKSB7CisgICAgICAgIHJldHVybiBtUGl2b3RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHkgbG9jYXRpb24gb2YgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB0aGUgdmlldyBpcyB7QGxpbmsgI3NldFJvdGF0aW9uKGZsb2F0KSByb3RhdGVkfQorICAgICAqIGFuZCB7QGxpbmsgI3NldFNjYWxlWShmbG9hdCkgc2NhbGVkfS4gQnkgZGVmYXVsdCwgdGhlIHBpdm90IHBvaW50IGlzIGNlbnRlcmVkIG9uIHRoZSBvYmplY3QuCisgICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHRoaXMgYmVoYXZpb3IgYW5kIGNhdXNlcyB0aGUgdmlldyB0byB1c2Ugb25seSB0aGUKKyAgICAgKiBleHBsaWNpdGx5IHNldCBwaXZvdFggYW5kIHBpdm90WSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl2b3RZIFRoZSB5IGxvY2F0aW9uIG9mIHRoZSBwaXZvdCBwb2ludC4KKyAgICAgKiBAc2VlICNnZXRSb3RhdGlvbigpCisgICAgICogQHNlZSAjZ2V0U2NhbGVYKCkKKyAgICAgKiBAc2VlICNnZXRTY2FsZVkoKQorICAgICAqIEBzZWUgI2dldFBpdm90WSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGl2b3RZKGZsb2F0IHBpdm90WSkgeworICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IFBJVk9UX0VYUExJQ0lUTFlfU0VUOworICAgICAgICBpZiAobVBpdm90WSAhPSBwaXZvdFkpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtUGl2b3RZID0gcGl2b3RZOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9wYWNpdHkgb2YgdGhlIHZpZXcuIFRoaXMgaXMgYSB2YWx1ZSBmcm9tIDAgdG8gMSwgd2hlcmUgMCBtZWFucyB0aGUgdmlldyBpcworICAgICAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgYW5kIDEgbWVhbnMgdGhlIHZpZXcgaXMgY29tcGxldGVseSBvcGFxdWUuCisgICAgICoKKyAgICAgKiBAZGVmYXVsdCAxLjBmCisgICAgICogQHJldHVybiBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0QWxwaGEoKSB7CisgICAgICAgIHJldHVybiBtQWxwaGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgdmlldy4gVGhpcyBpcyBhIHZhbHVlIGZyb20gMCB0byAxLCB3aGVyZSAwIG1lYW5zIHRoZSB2aWV3IGlzCisgICAgICogY29tcGxldGVseSB0cmFuc3BhcmVudCBhbmQgMSBtZWFucyB0aGUgdmlldyBpcyBjb21wbGV0ZWx5IG9wYXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgb3BhY2l0eSBvZiB0aGUgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICBtQWxwaGEgPSBhbHBoYTsKKyAgICAgICAgb25TZXRBbHBoYSgoaW50KSAoYWxwaGEgKiAyNTUpKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRvcCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHRvcCBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KQEAgLTQ4NTcsNiArNTQwNiw0NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRvcCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4gVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgY2FsbGVkCisgICAgICogYnkgdGhlIGxheW91dCBzeXN0ZW0gYW5kIHNob3VsZCBub3QgZ2VuZXJhbGx5IGJlIGNhbGxlZCBvdGhlcndpc2UsIGJlY2F1c2UgdGhlIHByb3BlcnR5CisgICAgICogbWF5IGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYnkgdGhlIGxheW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUb3AoaW50IHRvcCkgeworICAgICAgICBpZiAodG9wICE9IG1Ub3ApIHsKKyAgICAgICAgICAgIGlmIChoYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pblRvcDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHlMb2M7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3AgPCBtVG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5Ub3AgPSB0b3A7CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gdG9wIC0gbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRvcCA9IG1Ub3A7CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCB5TG9jLCBtUmlnaHQgLSBtTGVmdCwgbUJvdHRvbSAtIG1pblRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Ub3AgPSB0b3A7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCb3R0b20gcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODY3LDYgKzU0NTUsNDIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuIFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGJlCisgICAgICogY2FsbGVkIGJ5IHRoZSBsYXlvdXQgc3lzdGVtIGFuZCBzaG91bGQgbm90IGdlbmVyYWxseSBiZSBjYWxsZWQgb3RoZXJ3aXNlLCBiZWNhdXNlIHRoZQorICAgICAqIHByb3BlcnR5IG1heSBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJ5IHRoZSBsYXlvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Qm90dG9tKGludCBib3R0b20pIHsKKyAgICAgICAgaWYgKGJvdHRvbSAhPSBtQm90dG9tKSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGlmIChib3R0b20gPCBtQm90dG9tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3R0b20gPSBtQm90dG9tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm90dG9tID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIuc2V0KDAsIDAsIG1SaWdodCAtIG1MZWZ0LCBtYXhCb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJvdHRvbSA9IGJvdHRvbTsKKworICAgICAgICAgICAgaWYgKCFtTWF0cml4SXNJZGVudGl0eSkgeworICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIExlZnQgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODc3LDYgKzU1MDEsNDYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBjYWxsZWQKKyAgICAgKiBieSB0aGUgbGF5b3V0IHN5c3RlbSBhbmQgc2hvdWxkIG5vdCBnZW5lcmFsbHkgYmUgY2FsbGVkIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcHJvcGVydHkKKyAgICAgKiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSB0aGUgbGF5b3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGJvdHRvbSBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRMZWZ0KGludCBsZWZ0KSB7CisgICAgICAgIGlmIChsZWZ0ICE9IG1MZWZ0KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZpZXcgIiArIHRoaXMgKyAiIGxlZnQgPSAiICsgbGVmdCk7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5MZWZ0OworICAgICAgICAgICAgICAgICAgICBpbnQgeExvYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgPCBtTGVmdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IGxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB4TG9jID0gbGVmdCAtIG1MZWZ0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IG1MZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgeExvYyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci5zZXQoeExvYywgMCwgbVJpZ2h0IC0gbWluTGVmdCwgbUJvdHRvbSAtIG1Ub3ApOworICAgICAgICAgICAgICAgICAgICBwLmludmFsaWRhdGVDaGlsZCh0aGlzLCByKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGVmdCA9IGxlZnQ7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSaWdodCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIHJpZ2h0IGVkZ2Ugb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCkBAIC00ODg3LDEyICs1NTUxLDE3NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgcGFyZW50LiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSBjYWxsZWQKKyAgICAgKiBieSB0aGUgbGF5b3V0IHN5c3RlbSBhbmQgc2hvdWxkIG5vdCBnZW5lcmFsbHkgYmUgY2FsbGVkIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcHJvcGVydHkKKyAgICAgKiBtYXkgYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSB0aGUgbGF5b3V0LgorICAgICAqCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSBib3R0b20gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UmlnaHQoaW50IHJpZ2h0KSB7CisgICAgICAgIGlmIChyaWdodCAhPSBtUmlnaHQpIHsKKyAgICAgICAgICAgIGlmIChoYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwID0gbVBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCByID0gbUF0dGFjaEluZm8ubVRtcEludmFsUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHQgPCBtUmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFJpZ2h0ID0gbVJpZ2h0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmlnaHQgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtYXhSaWdodCAtIG1MZWZ0LCBtQm90dG9tIC0gbVRvcCk7CisgICAgICAgICAgICAgICAgICAgIHAuaW52YWxpZGF0ZUNoaWxkKHRoaXMsIHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRG91YmxlLWludmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgdG8gY2FwdHVyZSB2aWV3J3Mgb2xkIGFuZCBuZXcgYXJlYXMKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SaWdodCA9IHJpZ2h0OworCisgICAgICAgICAgICBpZiAoIW1NYXRyaXhJc0lkZW50aXR5KSB7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsgLy8gZm9yY2UgYW5vdGhlciBpbnZhbGlkYXRpb24gd2l0aCB0aGUgbmV3IG9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblgoZmxvYXQpIHRyYW5zbGF0aW9uWH0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHByb3BlcnR5LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICByZXR1cm4gbUxlZnQgKyBtVHJhbnNsYXRpb25YOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZpc3VhbCB4IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldFRyYW5zbGF0aW9uWChmbG9hdCkgdHJhbnNsYXRpb25YfSBwcm9wZXJ0eSB0byBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgICogdGhlIHggdmFsdWUgcGFzc2VkIGluIGFuZCB0aGUgY3VycmVudCB7QGxpbmsgI2dldExlZnQoKSBsZWZ0fSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IFRoZSB2aXN1YWwgeCBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25YKHggLSBtTGVmdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCisgICAgICoge0BsaW5rICNzZXRUcmFuc2xhdGlvblkoZmxvYXQpIHRyYW5zbGF0aW9uWX0gcHJvcGVydHkgcGx1cyB0aGUgY3VycmVudAorICAgICAqIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZpc3VhbCB5IHBvc2l0aW9uIG9mIHRoaXMgdmlldywgaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRZKCkgeworICAgICAgICByZXR1cm4gbVRvcCArIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzdWFsIHkgcG9zaXRpb24gb2YgdGhpcyB2aWV3LCBpbiBwaXhlbHMuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZQorICAgICAqIHtAbGluayAjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KSB0cmFuc2xhdGlvbll9IHByb3BlcnR5IHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgKiB0aGUgeSB2YWx1ZSBwYXNzZWQgaW4gYW5kIHRoZSBjdXJyZW50IHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB5IFRoZSB2aXN1YWwgeSBwb3NpdGlvbiBvZiB0aGlzIHZpZXcsIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHkpIHsKKyAgICAgICAgc2V0VHJhbnNsYXRpb25ZKHkgLSBtVG9wKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMge0BsaW5rICNnZXRMZWZ0KCkgbGVmdH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyBsZWZ0IHBvc2l0aW9uLCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRyYW5zbGF0aW9uWCgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0TGVmdCgpIGxlZnR9IHBvc2l0aW9uLgorICAgICAqIFRoaXMgZWZmZWN0aXZlbHkgcG9zaXRpb25zIHRoZSBvYmplY3QgcG9zdC1sYXlvdXQsIGluIGFkZGl0aW9uIHRvIHdoZXJldmVyIHRoZSBvYmplY3QncworICAgICAqIGxheW91dCBwbGFjZWQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRpb25YIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgbGVmdCBwb3NpdGlvbiwKKyAgICAgKiBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRpb25YKGZsb2F0IHRyYW5zbGF0aW9uWCkgeworICAgICAgICBpZiAobVRyYW5zbGF0aW9uWCAhPSB0cmFuc2xhdGlvblgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1pbnZhbGlkYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGNhcHR1cmUgdmlldydzIG9sZCBhbmQgbmV3IGFyZWFzCisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVHJhbnNsYXRpb25YID0gdHJhbnNsYXRpb25YOworICAgICAgICAgICAgbU1hdHJpeERpcnR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgfD0gRFJBV047IC8vIGZvcmNlIGFub3RoZXIgaW52YWxpZGF0aW9uIHdpdGggdGhlIG5ldyBvcmllbnRhdGlvbgorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGhvcml6b250YWwgbG9jYXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB7QGxpbmsgI2dldFRvcCgpIHRvcH0gcG9zaXRpb24uCisgICAgICogVGhpcyBwb3NpdGlvbiBpcyBwb3N0LWxheW91dCwgaW4gYWRkaXRpb24gdG8gd2hlcmV2ZXIgdGhlIG9iamVjdCdzCisgICAgICogbGF5b3V0IHBsYWNlZCBpdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoaXMgdmlldyByZWxhdGl2ZSB0byBpdHMgdG9wIHBvc2l0aW9uLAorICAgICAqIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VHJhbnNsYXRpb25ZKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2ZXJ0aWNhbCBsb2NhdGlvbiBvZiB0aGlzIHZpZXcgcmVsYXRpdmUgdG8gaXRzIHtAbGluayAjZ2V0VG9wKCkgdG9wfSBwb3NpdGlvbi4KKyAgICAgKiBUaGlzIGVmZmVjdGl2ZWx5IHBvc2l0aW9ucyB0aGUgb2JqZWN0IHBvc3QtbGF5b3V0LCBpbiBhZGRpdGlvbiB0byB3aGVyZXZlciB0aGUgb2JqZWN0J3MKKyAgICAgKiBsYXlvdXQgcGxhY2VkIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zbGF0aW9uWSBUaGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhpcyB2aWV3IHJlbGF0aXZlIHRvIGl0cyB0b3AgcG9zaXRpb24sCisgICAgICogaW4gcGl4ZWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zbGF0aW9uWShmbG9hdCB0cmFuc2xhdGlvblkpIHsKKyAgICAgICAgaWYgKG1UcmFuc2xhdGlvblkgIT0gdHJhbnNsYXRpb25ZKSB7CisgICAgICAgICAgICAvLyBEb3VibGUtaW52YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBjYXB0dXJlIHZpZXcncyBvbGQgYW5kIG5ldyBhcmVhcworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVRyYW5zbGF0aW9uWSA9IHRyYW5zbGF0aW9uWTsKKyAgICAgICAgICAgIG1NYXRyaXhEaXJ0eSA9IHRydWU7CisgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEhpdCByZWN0YW5nbGUgaW4gcGFyZW50J3MgY29vcmRpbmF0ZXMKICAgICAgKgogICAgICAqIEBwYXJhbSBvdXRSZWN0IFRoZSBoaXQgcmVjdGFuZ2xlIG9mIHRoZSB2aWV3LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldEhpdFJlY3QoUmVjdCBvdXRSZWN0KSB7Ci0gICAgICAgIG91dFJlY3Quc2V0KG1MZWZ0LCBtVG9wLCBtUmlnaHQsIG1Cb3R0b20pOworICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSB8fCBtQXR0YWNoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRSZWN0LnNldChtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1hdHJpeCBtID0gZ2V0TWF0cml4KCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0RiB0bXBSZWN0ID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICB0bXBSZWN0LnNldCgtbVBpdm90WCwgLW1QaXZvdFksIGdldFdpZHRoKCkgLSBtUGl2b3RYLCBnZXRIZWlnaHQoKSAtIG1QaXZvdFkpOworICAgICAgICAgICAgbS5tYXBSZWN0KHRtcFJlY3QpOworICAgICAgICAgICAgb3V0UmVjdC5zZXQoKGludCkgdG1wUmVjdC5sZWZ0ICsgbUxlZnQsIChpbnQpIHRtcFJlY3QudG9wICsgbVRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgdG1wUmVjdC5yaWdodCArIG1MZWZ0LCAoaW50KSB0bXBSZWN0LmJvdHRvbSArIG1Ub3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBvaW50LCBpbiBsb2NhbCBjb29yZGluYXRlcywKKyAgICAgKiBpcyBpbnNpZGUgdGhlIHZpZXcsIHdoZXJlIHRoZSBhcmVhIG9mIHRoZSB2aWV3IGlzIGV4cGFuZGVkIGJ5IHRoZSBzbG9wIGZhY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUgcHJvY2Vzc2luZyB0b3VjaC1tb3ZlIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgdGhlIGV2ZW50CisgICAgICogaXMgc3RpbGwgd2l0aGluIHRoZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwb2ludEluVmlldyhmbG9hdCBsb2NhbFgsIGZsb2F0IGxvY2FsWSwgZmxvYXQgc2xvcCkgeworICAgICAgICByZXR1cm4gbG9jYWxYID4gLXNsb3AgJiYgbG9jYWxZID4gLXNsb3AgJiYgbG9jYWxYIDwgKChtUmlnaHQgLSBtTGVmdCkgKyBzbG9wKSAmJgorICAgICAgICAgICAgICAgIGxvY2FsWSA8ICgobUJvdHRvbSAtIG1Ub3ApICsgc2xvcCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00OTU1LDggKzU3ODEsMzggQEAKICAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIG9mZnNldCB0aGUgdmlldyBieQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9mZnNldFRvcEFuZEJvdHRvbShpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ub3AgKz0gb2Zmc2V0OwotICAgICAgICBtQm90dG9tICs9IG9mZnNldDsKKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaGFzSWRlbnRpdHlNYXRyaXgoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdQYXJlbnQgcCA9IG1QYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGludCBtaW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCB5TG9jOworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b207CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluVG9wID0gbVRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdHRvbSA9IG1Cb3R0b20gKyBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB5TG9jID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCB5TG9jLCBtUmlnaHQgLSBtTGVmdCwgbWF4Qm90dG9tIC0gbWluVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Ub3AgKz0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdHRvbSArPSBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTQ5NjUsOCArNTgyMSwzNSBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG51bWVyIG9mIHBpeGVscyB0byBvZmZzZXQgdGhlIHZpZXcgYnkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvZmZzZXRMZWZ0QW5kUmlnaHQoaW50IG9mZnNldCkgewotICAgICAgICBtTGVmdCArPSBvZmZzZXQ7Ci0gICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3UGFyZW50IHAgPSBtUGFyZW50OworICAgICAgICAgICAgICAgIGlmIChwICE9IG51bGwgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IHIgPSBtQXR0YWNoSW5mby5tVG1wSW52YWxSZWN0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWluTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1heFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluTGVmdCA9IG1MZWZ0ICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmlnaHQgPSBtUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5MZWZ0ID0gbUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhSaWdodCA9IG1SaWdodCArIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLnNldCgwLCAwLCBtYXhSaWdodCAtIG1pbkxlZnQsIG1Cb3R0b20gLSBtVG9wKTsKKyAgICAgICAgICAgICAgICAgICAgcC5pbnZhbGlkYXRlQ2hpbGQodGhpcywgcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MZWZ0ICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1SaWdodCArPSBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmICghbU1hdHJpeElzSWRlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUZsYWdzIHw9IERSQVdOOyAvLyBmb3JjZSBhbm90aGVyIGludmFsaWRhdGlvbiB3aXRoIHRoZSBuZXcgb3JpZW50YXRpb24KKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTYwMDUsOSArNjg4OCw4IEBACiAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5TY3JvbGxCYXJEcmF3YWJsZQogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3SG9yaXpvbnRhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgc2Nyb2xsQmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdIb3Jpem9udGFsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjAyNiw5ICs2OTA4LDggQEAKICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNjcm9sbEJhckRyYXdhYmxlCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXdWZXJ0aWNhbFNjcm9sbEJhcihDYW52YXMgY2FudmFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIHNjcm9sbEJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd1ZlcnRpY2FsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIHNjcm9sbEJhciwKKyAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CiAgICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCwgciwgYik7CiAgICAgICAgIHNjcm9sbEJhci5kcmF3KGNhbnZhcyk7CiAgICAgfQpAQCAtNjQyNiw4ICs3MzA3LDcgQEAKICAgICAgICAgaWYgKChtVmlld0ZsYWdzICYgRFJBV0lOR19DQUNIRV9FTkFCTEVEKSA9PSBEUkFXSU5HX0NBQ0hFX0VOQUJMRUQpIHsKICAgICAgICAgICAgIGJ1aWxkRHJhd2luZ0NhY2hlKGF1dG9TY2FsZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF1dG9TY2FsZSA/IChtRHJhd2luZ0NhY2hlID09IG51bGwgPyBudWxsIDogbURyYXdpbmdDYWNoZS5nZXQoKSkgOgotICAgICAgICAgICAgICAgIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCA/IG51bGwgOiBtVW5zY2FsZWREcmF3aW5nQ2FjaGUuZ2V0KCkpOworICAgICAgICByZXR1cm4gYXV0b1NjYWxlID8gbURyYXdpbmdDYWNoZSA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKICAgICB9CiAKICAgICAvKioKQEAgLTY0NDIsMTMgKzczMjIsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZXN0cm95RHJhd2luZ0NhY2hlKCkgewogICAgICAgICBpZiAobURyYXdpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gbURyYXdpbmdDYWNoZS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgYml0bWFwLnJlY3ljbGUoKTsKKyAgICAgICAgICAgIG1EcmF3aW5nQ2FjaGUucmVjeWNsZSgpOwogICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IG51bGw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gbVVuc2NhbGVkRHJhd2luZ0NhY2hlLmdldCgpOwotICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSBiaXRtYXAucmVjeWNsZSgpOworICAgICAgICAgICAgbVVuc2NhbGVkRHJhd2luZ0NhY2hlLnJlY3ljbGUoKTsKICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02NTA5LDE1ICs3Mzg3LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYnVpbGREcmF3aW5nQ2FjaGUoYm9vbGVhbiBhdXRvU2NhbGUpIHsKICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgRFJBV0lOR19DQUNIRV9WQUxJRCkgPT0gMCB8fCAoYXV0b1NjYWxlID8KLSAgICAgICAgICAgICAgICAobURyYXdpbmdDYWNoZSA9PSBudWxsIHx8IG1EcmF3aW5nQ2FjaGUuZ2V0KCkgPT0gbnVsbCkgOgotICAgICAgICAgICAgICAgIChtVW5zY2FsZWREcmF3aW5nQ2FjaGUgPT0gbnVsbCB8fCBtVW5zY2FsZWREcmF3aW5nQ2FjaGUuZ2V0KCkgPT0gbnVsbCkpKSB7CisgICAgICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9PSBudWxsIDogbVVuc2NhbGVkRHJhd2luZ0NhY2hlID09IG51bGwpKSB7CiAKICAgICAgICAgICAgIGlmIChWaWV3RGVidWcuVFJBQ0VfSElFUkFSQ0hZKSB7CiAgICAgICAgICAgICAgICAgVmlld0RlYnVnLnRyYWNlKHRoaXMsIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUuQlVJTERfQ0FDSEUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZURyYXdpbmcpIHsKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAyLCBoYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IHdpZHRoID0gbVJpZ2h0IC0gbUxlZnQ7CiAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gbUJvdHRvbSAtIG1Ub3A7CkBAIC02NTQzLDggKzc0MTcsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBib29sZWFuIGNsZWFyID0gdHJ1ZTsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBhdXRvU2NhbGUgPyAobURyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1EcmF3aW5nQ2FjaGUuZ2V0KCkpIDoKLSAgICAgICAgICAgICAgICAgICAgKG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9PSBudWxsID8gbnVsbCA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZS5nZXQoKSk7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gYXV0b1NjYWxlID8gbURyYXdpbmdDYWNoZSA6IG1VbnNjYWxlZERyYXdpbmdDYWNoZTsKIAogICAgICAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsIHx8IGJpdG1hcC5nZXRXaWR0aCgpICE9IHdpZHRoIHx8IGJpdG1hcC5nZXRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnIHF1YWxpdHk7CkBAIC02NTc2LDkgKzc0NDksOSBAQAogICAgICAgICAgICAgICAgICAgICBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgICAgICBiaXRtYXAuc2V0RGVuc2l0eShnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b1NjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ0NhY2hlID0gbmV3IFNvZnRSZWZlcmVuY2U8Qml0bWFwPihiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgbURyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IG5ldyBTb2Z0UmVmZXJlbmNlPEJpdG1hcD4oYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VbnNjYWxlZERyYXdpbmdDYWNoZSA9IGJpdG1hcDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAob3BhcXVlICYmIHRyYW5zbHVjZW50V2luZG93KSBiaXRtYXAuc2V0SGFzQWxwaGEoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewpAQCAtNjgxNyw2ICs3NjkwLDI1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogPHA+SW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGFuIGhhcmR3YXJlIGFjY2VsZXJhdGVkCisgICAgICogd2luZG93IG9yIG5vdC48L3A+CisgICAgICogCisgICAgICogPHA+RXZlbiBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIGl0IGRvZXMgbm90IG1lYW4gdGhhdCBldmVyeSBjYWxsCisgICAgICogdG8ge0BsaW5rICNkcmF3KGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKX0gd2lsbCBiZSBtYWRlIHdpdGggYW4gaGFyZHdhcmUKKyAgICAgKiBhY2NlbGVyYXRlZCB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5DYW52YXN9LiBGb3IgaW5zdGFuY2UsIGlmIHRoaXMgdmlldworICAgICAqIGlzIGRyYXduIG9udG8gYW4gb2Zmc2NyZW4ge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwfSBhbmQgaXRzCisgICAgICogd2luZG93IGlzIGhhcmR3YXJlIGFjY2VsZXJhdGVkLAorICAgICAqIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKX0gd2lsbCBsaWtlbHkKKyAgICAgKiByZXR1cm4gZmFsc2UsIGFuZCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cgYW5kIHRoZSB3aW5kb3cgaXMKKyAgICAgKiAgICAgICAgIGhhcmR3YXJlIGFjY2VsZXJhdGVkOyBmYWxzZSBpbiBhbnkgb3RoZXIgY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBtQXR0YWNoSW5mbyAhPSBudWxsICYmIG1BdHRhY2hJbmZvLm1IYXJkd2FyZUFjY2VsZXJhdGVkOworICAgIH0KKyAgICAKKyAgICAvKioKICAgICAgKiBNYW51YWxseSByZW5kZXIgdGhpcyB2aWV3IChhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbikgdG8gdGhlIGdpdmVuIENhbnZhcy4KICAgICAgKiBUaGUgdmlldyBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZnVsbCBsYXlvdXQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKICAgICAgKiBjYWxsZWQuICBXaGVuIGltcGxlbWVudGluZyBhIHZpZXcsIGRvIG5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZDsgaW5zdGVhZCwKQEAgLTY5NDEsMTYgKzc4MzMsMTYgQEAKIAogICAgICAgICBpZiAodmVydGljYWxFZGdlcykgewogICAgICAgICAgICAgdG9wRmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0VG9wRmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdUb3AgPSB0b3BGYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdUb3AgPSB0b3BGYWRlU3RyZW5ndGggPiAwLjBmOwogICAgICAgICAgICAgYm90dG9tRmFkZVN0cmVuZ3RoID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgZ2V0Qm90dG9tRmFkaW5nRWRnZVN0cmVuZ3RoKCkpKTsKLSAgICAgICAgICAgIGRyYXdCb3R0b20gPSBib3R0b21GYWRlU3RyZW5ndGggPj0gMC4wZjsKKyAgICAgICAgICAgIGRyYXdCb3R0b20gPSBib3R0b21GYWRlU3RyZW5ndGggPiAwLjBmOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhvcml6b250YWxFZGdlcykgewogICAgICAgICAgICAgbGVmdEZhZGVTdHJlbmd0aCA9IE1hdGgubWF4KDAuMGYsIE1hdGgubWluKDEuMGYsIGdldExlZnRGYWRpbmdFZGdlU3RyZW5ndGgoKSkpOwotICAgICAgICAgICAgZHJhd0xlZnQgPSBsZWZ0RmFkZVN0cmVuZ3RoID49IDAuMGY7CisgICAgICAgICAgICBkcmF3TGVmdCA9IGxlZnRGYWRlU3RyZW5ndGggPiAwLjBmOwogICAgICAgICAgICAgcmlnaHRGYWRlU3RyZW5ndGggPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBnZXRSaWdodEZhZGluZ0VkZ2VTdHJlbmd0aCgpKSk7Ci0gICAgICAgICAgICBkcmF3UmlnaHQgPSByaWdodEZhZGVTdHJlbmd0aCA+PSAwLjBmOworICAgICAgICAgICAgZHJhd1JpZ2h0ID0gcmlnaHRGYWRlU3RyZW5ndGggPiAwLjBmOwogICAgICAgICB9CiAKICAgICAgICAgc2F2ZUNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOwpAQCAtNzE1NywxNCArODA0OSwxOSBAQAogICAgICAqCiAgICAgICogRGVyaXZlZCBjbGFzc2VzIHdpdGggY2hpbGRyZW4gc2hvdWxkIG92ZXJyaWRlCiAgICAgICogb25MYXlvdXQuIEluIHRoYXQgbWV0aG9kLCB0aGV5IHNob3VsZAotICAgICAqIGNhbGwgbGF5b3V0IG9uIGVhY2ggb2YgdGhlaXIgdGhlaXIgY2hpbGRyZW4uCisgICAgICogY2FsbCBsYXlvdXQgb24gZWFjaCBvZiB0aGVpciBjaGlsZHJlbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBsIExlZnQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAqIEBwYXJhbSB0IFRvcCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICogQHBhcmFtIHIgUmlnaHQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAqIEBwYXJhbSBiIEJvdHRvbSBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gcGFyZW50CiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKICAgICBwdWJsaWMgZmluYWwgdm9pZCBsYXlvdXQoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IG9sZEwgPSBtTGVmdDsKKyAgICAgICAgaW50IG9sZFQgPSBtVG9wOworICAgICAgICBpbnQgb2xkQiA9IG1Cb3R0b207CisgICAgICAgIGludCBvbGRSID0gbVJpZ2h0OwogICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBzZXRGcmFtZShsLCB0LCByLCBiKTsKICAgICAgICAgaWYgKGNoYW5nZWQgfHwgKG1Qcml2YXRlRmxhZ3MgJiBMQVlPVVRfUkVRVUlSRUQpID09IExBWU9VVF9SRVFVSVJFRCkgewogICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5UUkFDRV9ISUVSQVJDSFkpIHsKQEAgLTcxNzMsNiArODA3MCwxNSBAQAogCiAgICAgICAgICAgICBvbkxheW91dChjaGFuZ2VkLCBsLCB0LCByLCBiKTsKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkxBWU9VVF9SRVFVSVJFRDsKKworICAgICAgICAgICAgaWYgKG1PbkxheW91dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PE9uTGF5b3V0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyc0NvcHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdDxPbkxheW91dENoYW5nZUxpc3RlbmVyPikgbU9uTGF5b3V0Q2hhbmdlTGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgICAgICAgICAgaW50IG51bUxpc3RlbmVycyA9IGxpc3RlbmVyc0NvcHkuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGlzdGVuZXJzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzQ29weS5nZXQoaSkub25MYXlvdXRDaGFuZ2UodGhpcywgbCwgciwgdCwgYiwgb2xkTCwgb2xkVCwgb2xkUiwgb2xkQik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkZPUkNFX0xBWU9VVDsKICAgICB9CkBAIC03MTgzLDcgKzgwODksNyBAQAogICAgICAqCiAgICAgICogRGVyaXZlZCBjbGFzc2VzIHdpdGggY2hpbGRyZW4gc2hvdWxkIG92ZXJyaWRlCiAgICAgICogdGhpcyBtZXRob2QgYW5kIGNhbGwgbGF5b3V0IG9uIGVhY2ggb2YKLSAgICAgKiB0aGVpciB0aGVpciBjaGlsZHJlbi4KKyAgICAgKiB0aGVpciBjaGlsZHJlbi4KICAgICAgKiBAcGFyYW0gY2hhbmdlZCBUaGlzIGlzIGEgbmV3IHNpemUgb3IgcG9zaXRpb24gZm9yIHRoaXMgdmlldwogICAgICAqIEBwYXJhbSBsZWZ0IExlZnQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHBhcmVudAogICAgICAqIEBwYXJhbSB0b3AgVG9wIHBvc2l0aW9uLCByZWxhdGl2ZSB0byBwYXJlbnQKQEAgLTg2ODksMTMgKzk1OTUsMTMgQEAKICAgICAgICAgaWYgKG1BdHRhY2hJbmZvID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX1ZJRVdfU0VUVElORykgPT0gMAorICAgICAgICAvL25vaW5zcGVjdGlvbiBTaW1wbGlmaWFibGVJZlN0YXRlbWVudAorICAgICAgICBpZiAoKGZsYWdzICYgSGFwdGljRmVlZGJhY2tDb25zdGFudHMuRkxBR19JR05PUkVfVklFV19TRVRUSU5HKSA9PSAwCiAgICAgICAgICAgICAgICAgJiYgIWlzSGFwdGljRmVlZGJhY2tFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbUF0dGFjaEluZm8ubVJvb3RDYWxsYmFja3MucGVyZm9ybUhhcHRpY0ZlZWRiYWNrKAotICAgICAgICAgICAgICAgIGZlZWRiYWNrQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgKGZsYWdzJkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvLm1Sb290Q2FsbGJhY2tzLnBlcmZvcm1IYXB0aWNGZWVkYmFjayhmZWVkYmFja0NvbnN0YW50LAorICAgICAgICAgICAgICAgIChmbGFncyAmIEhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzLkZMQUdfSUdOT1JFX0dMT0JBTF9TRVRUSU5HKSAhPSAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg3NjYsOCArOTY3Miw3IEBACiAgICAgICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpIC0gZGVsYXlPZmZzZXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHN0YXRlU2V0VW5pb24oZmluYWwgaW50W10gc3RhdGVTZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50W10gc3RhdGVTZXQyKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc3RhdGVTZXRVbmlvbihmaW5hbCBpbnRbXSBzdGF0ZVNldDEsIGZpbmFsIGludFtdIHN0YXRlU2V0MikgewogICAgICAgICBmaW5hbCBpbnQgc3RhdGVTZXQxTGVuZ3RoID0gc3RhdGVTZXQxLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IHN0YXRlU2V0Mkxlbmd0aCA9IHN0YXRlU2V0Mi5sZW5ndGg7CiAgICAgICAgIGZpbmFsIGludFtdIG5ld1NldCA9IG5ldyBpbnRbc3RhdGVTZXQxTGVuZ3RoICsgc3RhdGVTZXQyTGVuZ3RoXTsKQEAgLTg4MDcsMTI4ICs5NzEyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTY3JvbGwgdGhlIHZpZXcgd2l0aCBzdGFuZGFyZCBiZWhhdmlvciBmb3Igc2Nyb2xsaW5nIGJleW9uZCB0aGUgbm9ybWFsCi0gICAgICogY29udGVudCBib3VuZGFyaWVzLiBWaWV3cyB0aGF0IGNhbGwgdGhpcyBtZXRob2Qgc2hvdWxkIG92ZXJyaWRlCi0gICAgICoge0BsaW5rICNvbk92ZXJzY3JvbGxlZChpbnQsIGludCwgYm9vbGVhbiwgYm9vbGVhbil9IHRvIHJlc3BvbmQgdG8gdGhlCi0gICAgICogcmVzdWx0cyBvZiBhbiBvdmVyc2Nyb2xsIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIFZpZXdzIGNhbiB1c2UgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGFueSB0b3VjaCBvciBmbGluZy1iYXNlZCBzY3JvbGxpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVsdGFYIENoYW5nZSBpbiBYIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBkZWx0YVkgQ2hhbmdlIGluIFkgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFggQ3VycmVudCBYIHNjcm9sbCB2YWx1ZSBpbiBwaXhlbHMgYmVmb3JlIGFwcGx5aW5nIGRlbHRhWAotICAgICAqIEBwYXJhbSBzY3JvbGxZIEN1cnJlbnQgWSBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzIGJlZm9yZSBhcHBseWluZyBkZWx0YVkKLSAgICAgKiBAcGFyYW0gc2Nyb2xsUmFuZ2VYIE1heGltdW0gY29udGVudCBzY3JvbGwgcmFuZ2UgYWxvbmcgdGhlIFggYXhpcwotICAgICAqIEBwYXJhbSBzY3JvbGxSYW5nZVkgTWF4aW11bSBjb250ZW50IHNjcm9sbCByYW5nZSBhbG9uZyB0aGUgWSBheGlzCi0gICAgICogQHBhcmFtIG1heE92ZXJzY3JvbGxYIE51bWJlciBvZiBwaXhlbHMgdG8gb3ZlcnNjcm9sbCBieSBpbiBlaXRoZXIgZGlyZWN0aW9uCi0gICAgICogICAgICAgICAgYWxvbmcgdGhlIFggYXhpcy4KLSAgICAgKiBAcGFyYW0gbWF4T3ZlcnNjcm9sbFkgTnVtYmVyIG9mIHBpeGVscyB0byBvdmVyc2Nyb2xsIGJ5IGluIGVpdGhlciBkaXJlY3Rpb24KLSAgICAgKiAgICAgICAgICBhbG9uZyB0aGUgWSBheGlzLgotICAgICAqIEBwYXJhbSBpc1RvdWNoRXZlbnQgdHJ1ZSBpZiB0aGlzIHNjcm9sbCBvcGVyYXRpb24gaXMgdGhlIHJlc3VsdCBvZiBhIHRvdWNoIGV2ZW50LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzY3JvbGxpbmcgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeSBhbG9uZyBlaXRoZXIKLSAgICAgKiAgICAgICAgICBheGlzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0YVksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBpbnQgc2Nyb2xsUmFuZ2VYLCBpbnQgc2Nyb2xsUmFuZ2VZLAotICAgICAgICAgICAgaW50IG1heE92ZXJzY3JvbGxYLCBpbnQgbWF4T3ZlcnNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGlzVG91Y2hFdmVudCkgewotICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuU2Nyb2xsSG9yaXpvbnRhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpID4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBjYW5TY3JvbGxWZXJ0aWNhbCA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSA+IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwotICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJzY3JvbGxIb3Jpem9udGFsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsSG9yaXpvbnRhbCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbFZlcnRpY2FsID0gb3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgY2FuU2Nyb2xsVmVydGljYWwpOwotCi0gICAgICAgIGludCBuZXdTY3JvbGxYID0gc2Nyb2xsWCArIGRlbHRhWDsKLSAgICAgICAgaWYgKCFvdmVyc2Nyb2xsSG9yaXpvbnRhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5ld1Njcm9sbFkgPSBzY3JvbGxZICsgZGVsdGFZOwotICAgICAgICBpZiAoIW92ZXJzY3JvbGxWZXJ0aWNhbCkgewotICAgICAgICAgICAgbWF4T3ZlcnNjcm9sbFkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xhbXAgdmFsdWVzIGlmIGF0IHRoZSBsaW1pdHMgYW5kIHJlY29yZAotICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IC1tYXhPdmVyc2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gbWF4T3ZlcnNjcm9sbFggKyBzY3JvbGxSYW5nZVg7Ci0gICAgICAgIGZpbmFsIGludCB0b3AgPSAtbWF4T3ZlcnNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBib3R0b20gPSBtYXhPdmVyc2Nyb2xsWSArIHNjcm9sbFJhbmdlWTsKLQotICAgICAgICBib29sZWFuIGNsYW1wZWRYID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxYID4gcmlnaHQpIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFggPSByaWdodDsKLSAgICAgICAgICAgIGNsYW1wZWRYID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdTY3JvbGxYIDwgbGVmdCkgewotICAgICAgICAgICAgbmV3U2Nyb2xsWCA9IGxlZnQ7Ci0gICAgICAgICAgICBjbGFtcGVkWCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGNsYW1wZWRZID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdTY3JvbGxZID4gYm90dG9tKSB7Ci0gICAgICAgICAgICBuZXdTY3JvbGxZID0gYm90dG9tOwotICAgICAgICAgICAgY2xhbXBlZFkgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1Njcm9sbFkgPCB0b3ApIHsKLSAgICAgICAgICAgIG5ld1Njcm9sbFkgPSB0b3A7Ci0gICAgICAgICAgICBjbGFtcGVkWSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBvbk92ZXJzY3JvbGxlZChuZXdTY3JvbGxYLCBuZXdTY3JvbGxZLCBjbGFtcGVkWCwgY2xhbXBlZFkpOwotCi0gICAgICAgIHJldHVybiBjbGFtcGVkWCB8fCBjbGFtcGVkWTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkge0BsaW5rICNvdmVyc2Nyb2xsQnkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGJvb2xlYW4pfSB0bwotICAgICAqIHJlc3BvbmQgdG8gdGhlIHJlc3VsdHMgb2YgYW4gb3ZlcnNjcm9sbCBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Nyb2xsWCBOZXcgWCBzY3JvbGwgdmFsdWUgaW4gcGl4ZWxzCi0gICAgICogQHBhcmFtIHNjcm9sbFkgTmV3IFkgc2Nyb2xsIHZhbHVlIGluIHBpeGVscwotICAgICAqIEBwYXJhbSBjbGFtcGVkWCBUcnVlIGlmIHNjcm9sbFggd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqIEBwYXJhbSBjbGFtcGVkWSBUcnVlIGlmIHNjcm9sbFkgd2FzIGNsYW1wZWQgdG8gYW4gb3ZlcnNjcm9sbCBib3VuZGFyeQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFgsIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eS4KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVGhlIHJlc3VsdCB3aWxsIGJlCi0gICAgICogb25lIG9mIHtAbGluayAjT1ZFUlNDUk9MTF9BTFdBWVN9IChkZWZhdWx0KSwge0BsaW5rICNPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMU30KLSAgICAgKiAoYWxsb3cgb3ZlcnNjcm9sbGluZyBvbmx5IGlmIHRoZSB2aWV3IGNvbnRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbnRhaW5lciksCi0gICAgICogb3Ige0BsaW5rICNPVkVSU0NST0xMX05FVkVSfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyB2aWV3J3Mgb3ZlcnNjcm9sbCBtb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3ZlcnNjcm9sbE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbE1vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvdmVyc2Nyb2xsIG1vZGUgZm9yIHRoaXMgdmlldy4gVmFsaWQgb3ZlcnNjcm9sbCBtb2RlcyBhcmUKLSAgICAgKiB7QGxpbmsgI09WRVJTQ1JPTExfQUxXQVlTfSAoZGVmYXVsdCksIHtAbGluayAjT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFN9Ci0gICAgICogKGFsbG93IG92ZXJzY3JvbGxpbmcgb25seSBpZiB0aGUgdmlldyBjb250ZW50IGlzIGxhcmdlciB0aGFuIHRoZSBjb250YWluZXIpLAotICAgICAqIG9yIHtAbGluayAjT1ZFUlNDUk9MTF9ORVZFUn0uCi0gICAgICoKLSAgICAgKiBTZXR0aW5nIHRoZSBvdmVyc2Nyb2xsIG1vZGUgb2YgYSB2aWV3IHdpbGwgaGF2ZSBhbiBlZmZlY3Qgb25seSBpZiB0aGUKLSAgICAgKiB2aWV3IGlzIGNhcGFibGUgb2Ygc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJzY3JvbGxNb2RlIFRoZSBuZXcgb3ZlcnNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG92ZXJzY3JvbGxNb2RlKSB7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSAhPSBPVkVSU0NST0xMX0FMV0FZUyAmJgotICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxNb2RlICE9IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbE1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvdmVyc2Nyb2xsIG1vZGUgIiArIG92ZXJzY3JvbGxNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcnNjcm9sbE1vZGUgPSBvdmVyc2Nyb2xsTW9kZTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBIE1lYXN1cmVTcGVjIGVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBwYXNzZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuCiAgICAgICogRWFjaCBNZWFzdXJlU3BlYyByZXByZXNlbnRzIGEgcmVxdWlyZW1lbnQgZm9yIGVpdGhlciB0aGUgd2lkdGggb3IgdGhlIGhlaWdodC4KICAgICAgKiBBIE1lYXN1cmVTcGVjIGlzIGNvbXByaXNlZCBvZiBhIHNpemUgYW5kIGEgbW9kZS4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlCkBAIC05MjkzLDYgKzEwMDc2LDggQEAKICAgICAgICAgSUJpbmRlciBtUGFuZWxQYXJlbnRXaW5kb3dUb2tlbjsKICAgICAgICAgU3VyZmFjZSBtU3VyZmFjZTsKIAorICAgICAgICBib29sZWFuIG1IYXJkd2FyZUFjY2VsZXJhdGVkOyAgICAgICAgCisgICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogU2NhbGUgZmFjdG9yIHVzZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbW9kZQogICAgICAgICAgKi8KQEAgLTk0MTAsNiArMTAxOTUsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpbmFsIGludFtdIG1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbiA9IG5ldyBpbnRbMl07CiAKKworICAgICAgICAvKioKKyAgICAgICAgICogR2xvYmFsIHRvIHRoZSB2aWV3IGhpZXJhcmNoeSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZvciBkZWFsaW5nIHdpdGgKKyAgICAgICAgICogeC95IGxvY2F0aW9uIHdoZW4gdmlldyBpcyB0cmFuc2Zvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGZsb2F0W10gbVRtcFRyYW5zZm9ybUxvY2F0aW9uID0gbmV3IGZsb2F0WzJdOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgdmlldyB0cmVlIG9ic2VydmVyIHVzZWQgdG8gZGlzcGF0Y2ggZ2xvYmFsIGV2ZW50cyBsaWtlCiAgICAgICAgICAqIGxheW91dCwgcHJlLWRyYXcsIHRvdWNoIG1vZGUgY2hhbmdlLCBldGMuCkBAIC05NDQ2LDYgKzEwMjM4LDExIEBACiAgICAgICAgIGZpbmFsIFJlY3QgbVRtcEludmFsUmVjdCA9IG5ldyBSZWN0KCk7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRlbXBvcmFyeSBmb3IgdXNlIGluIGNvbXB1dGluZyBoaXQgYXJlYXMgd2l0aCB0cmFuc2Zvcm1lZCB2aWV3cworICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUmVjdEYgbVRtcFRyYW5zZm9ybVJlY3QgPSBuZXcgUmVjdEYoKTsKKworICAgICAgICAvKioKICAgICAgICAgICogVGVtcG9yYXJ5IGxpc3QgZm9yIHVzZSBpbiBjb2xsZWN0aW5nIGZvY3VzYWJsZSBkZXNjZW5kZW50cyBvZiBhIHZpZXcuCiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbUZvY3VzYWJsZXNUZW1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oMjQpOwpAQCAtOTUwNSw4ICsxMDMwMiw4IEBACiAKICAgICAgICAgcHVibGljIGZpbmFsIEludGVycG9sYXRvciBzY3JvbGxCYXJJbnRlcnBvbGF0b3IgPSBuZXcgSW50ZXJwb2xhdG9yKDEsIDIpOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0gezI1NS4wZn07Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJhbnNwYXJlbnQgPSB7MC4wZn07CisgICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtT3BhcXVlID0geyAyNTUuMGYgfTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmFuc3BhcmVudCA9IHsgMC4wZiB9OwogICAgICAgICAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFdoZW4gZmFkaW5nIHNob3VsZCBzdGFydC4gVGhpcyB0aW1lIG1vdmVzIGludG8gdGhlIGZ1dHVyZSBldmVyeSB0aW1lCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKaW5kZXggOTI0YzlkNC4uYWNkZmMyOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTQwLDE2ICsxNDAsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IFNDUk9MTF9GUklDVElPTiA9IDAuMDE1ZjsKIAotICAgIC8qKgotICAgICAqIE1heCBkaXN0YW5jZSB0byBvdmVyc2Nyb2xsIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9ESVNUQU5DRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGZvciBlZGdlIGVmZmVjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUkZMSU5HX0RJU1RBTkNFID0gNDsKLQogICAgIHByaXZhdGUgZmluYWwgaW50IG1FZGdlU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtRmFkaW5nRWRnZUxlbmd0aDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTWluaW11bUZsaW5nVmVsb2NpdHk7CkBAIC0xNjAsOCArMTUwLDYgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBtRG91YmxlVGFwU2xvcDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtV2luZG93VG91Y2hTbG9wOwogICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPiBzQ29uZmlndXJhdGlvbnMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PFZpZXdDb25maWd1cmF0aW9uPigyKTsKQEAgLTE4Miw4ICsxNzAsNiBAQAogICAgICAgICBtV2luZG93VG91Y2hTbG9wID0gV0lORE9XX1RPVUNIX1NMT1A7CiAgICAgICAgIC8vbm9pbnNwZWN0aW9uIGRlcHJlY2F0aW9uCiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IE1BWElNVU1fRFJBV0lOR19DQUNIRV9TSVpFOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gT1ZFUlNDUk9MTF9ESVNUQU5DRTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gT1ZFUkZMSU5HX0RJU1RBTkNFOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEyLDkgKzE5OCw2IEBACiAKICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc2NyZWVuIGluIGJ5dGVzLCBpbiBBUkdCXzg4ODggZm9ybWF0CiAgICAgICAgIG1NYXhpbXVtRHJhd2luZ0NhY2hlU2l6ZSA9IDQgKiBtZXRyaWNzLndpZHRoUGl4ZWxzICogbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IChpbnQpIChkZW5zaXR5ICogT1ZFUlNDUk9MTF9ESVNUQU5DRSArIDAuNWYpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSAoaW50KSAoZGVuc2l0eSAqIE9WRVJGTElOR19ESVNUQU5DRSArIDAuNWYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDcyLDIwICs0NTUsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyc2Nyb2xsIGJ5IHdoZW4gc2hvd2luZyBlZGdlIGVmZmVjdHMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gZGlzdGFuY2UgYSBWaWV3IHNob3VsZCBvdmVyZmxpbmcgYnkgd2hlbiBzaG93aW5nIGVkZ2UgZWZmZWN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbU92ZXJmbGluZ0Rpc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB6b29tIGNvbnRyb2xzIHNob3VsZCBiZQogICAgICAqIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3RGVidWcuamF2YQppbmRleCA3YjY5OTFmLi5iMWQ1MjcyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdEZWJ1Zy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0RlYnVnLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTURlYnVnOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMTE4LDI0ICsxMTksMjEgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvZmlsZURyYXdpbmcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9EUkFXSU5HID0gZmFsc2U7CiAKICAgICAvKioKICAgICAgKiBQcm9maWxlcyBsYXlvdXQgdGltZXMgaW4gdGhlIGV2ZW50cyBsb2cuCiAgICAgICoKICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIEBEZWJ1Zy5EZWJ1Z1Byb3BlcnR5Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByb2ZpbGVMYXlvdXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUFJPRklMRV9MQVlPVVQgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIFByb2ZpbGVzIHJlYWwgZnBzICh0aW1lcyBiZXR3ZWVuIGRyYXdzKSBhbmQgZGlzcGxheXMgdGhlIHJlc3VsdC4KICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgQERlYnVnLkRlYnVnUHJvcGVydHkKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd0ZwcyA9IGZhbHNlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TSE9XX0ZQUyA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogPHA+RW5hYmxlcyBvciBkaXNhYmxlcyB2aWV3cyBjb25zaXN0ZW5jeSBjaGVjay4gRXZlbiB3aGVuIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwKQEAgLTQyNyw3ICs0MjUsNyBAQAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFZpZXdJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlldy5zSW5zdGFuY2VDb3VudDsKKyAgICAgICAgcmV0dXJuIFZNRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKFZpZXcuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM4LDcgKzQzNiw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Vmlld1Jvb3RJbnN0YW5jZUNvdW50KCkgewotICAgICAgICByZXR1cm4gVmlld1Jvb3QuZ2V0SW5zdGFuY2VDb3VudCgpOworICAgICAgICByZXR1cm4gVk1EZWJ1Zy5jb3VudEluc3RhbmNlc09mQ2xhc3MoVmlld1Jvb3QuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKaW5kZXggMjhiZWQzYS4uM2RiMDViNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CkBAIC0yMyw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CkBAIC0zMCw4ICszMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CkBAIC02Myw4ICs2MywxMCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2Fsd2F5c0RyYXduV2l0aENhY2hlCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfYWRkU3RhdGVzRnJvbUNoaWxkcmVuCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eQorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0dyb3VwX2FuaW1hdGVMYXlvdXRDaGFuZ2VzCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaWV3R3JvdXAgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgVmlld1BhcmVudCwgVmlld01hbmFnZXIgeworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKIAogICAgIC8qKgpAQCAtODYsMTMgKzg4LDI4IEBACiAgICAgLy8gVGhlIHZpZXcgY29udGFpbmVkIHdpdGhpbiB0aGlzIFZpZXdHcm91cCB0aGF0IGhhcyBvciBjb250YWlucyBmb2N1cy4KICAgICBwcml2YXRlIFZpZXcgbUZvY3VzZWQ7CiAKLSAgICAvLyBUaGUgY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0byBhcHBseSBvbiB0aGUgY2hpbGQgYmVpbmcgZHJhd24KLSAgICBwcml2YXRlIFRyYW5zZm9ybWF0aW9uIG1DaGlsZFRyYW5zZm9ybWF0aW9uOworICAgIC8qKgorICAgICAqIEEgVHJhbnNmb3JtYXRpb24gdXNlZCB3aGVuIGRyYXdpbmcgY2hpbGRyZW4sIHRvCisgICAgICogYXBwbHkgb24gdGhlIGNoaWxkIGJlaW5nIGRyYXduLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHJhbnNmb3JtYXRpb24gbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gdHJhY2sgdGhlIGN1cnJlbnQgaW52YWxpZGF0aW9uIHJlZ2lvbi4KKyAgICAgKi8KICAgICBwcml2YXRlIFJlY3RGIG1JbnZhbGlkYXRlUmVnaW9uOwogCisgICAgLyoqCisgICAgICogQSBUcmFuc2Zvcm1hdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBhIGNvcnJlY3QKKyAgICAgKiBpbnZhbGlkYXRpb24gYXJlYSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRvc2NhbGVkLgorICAgICAqLworICAgIHByaXZhdGUgVHJhbnNmb3JtYXRpb24gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworCiAgICAgLy8gVGFyZ2V0IG9mIE1vdGlvbiBldmVudHMKICAgICBwcml2YXRlIFZpZXcgbU1vdGlvblRhcmdldDsKLSAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKKworICAgIC8vIFRhcmdldHMgb2YgTW90aW9uRXZlbnRzIGluIHNwbGl0IG1vZGUKKyAgICBwcml2YXRlIFNwbGl0TW90aW9uVGFyZ2V0cyBtU3BsaXRNb3Rpb25UYXJnZXRzOwogCiAgICAgLy8gTGF5b3V0IGFuaW1hdGlvbgogICAgIHByaXZhdGUgTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlciBtTGF5b3V0QW5pbWF0aW9uQ29udHJvbGxlcjsKQEAgLTIyOCw2ICsyNDUsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCA9IDB4ODAwMDA7CiAKICAgICAvKioKKyAgICAgKiBXaGVuIHNldCwgdGhpcyBWaWV3R3JvdXAgd2lsbCBzcGxpdCBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGQgVmlld3Mgd2hlbiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTID0gMHgxMDAwMDA7CisKKyAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZXMgb2YgZHJhd2luZyBjYWNoZXMgYXJlIHRvIGJlIGtlcHQgaW4gbWVtb3J5LgogICAgICAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIG1hZGUgcHJpdmF0ZSwgc28gaXQgaXMgaGlkZGVuIGZyb20gdGhlIFNESy4KICAgICAgKiB7QGhpZGV9CkBAIC0yNzcsNiArMjk5LDE0IEBACiAgICAgLy8gVXNlZCB0byBkcmF3IGNhY2hlZCB2aWV3cwogICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUNhY2hlUGFpbnQgPSBuZXcgUGFpbnQoKTsKIAorICAgIC8vIFVzZWQgdG8gYW5pbWF0ZSBhZGQvcmVtb3ZlIGNoYW5nZXMgaW4gbGF5b3V0CisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uIG1UcmFuc2l0aW9uOworCisgICAgLy8gVGhlIHNldCBvZiB2aWV3cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdHJhbnNpdGlvbmVkLiBUaGlzIGxpc3QgaXMgdXNlZCB0byB0cmFjayB2aWV3cworICAgIC8vIGJlaW5nIHJlbW92ZWQgdGhhdCBzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHlldCBiZWNhdXNlIHRoZXkgYXJlCisgICAgLy8gYmVpbmcgYW5pbWF0ZWQuCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8Vmlldz4gbVRyYW5zaXRpb25pbmdWaWV3czsKKwogICAgIHB1YmxpYyBWaWV3R3JvdXAoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICBpbml0Vmlld0dyb3VwKCk7CkBAIC0zNDgsNiArMzc4LDE1IEBACiAgICAgICAgICAgICAgICAgY2FzZSBSLnN0eWxlYWJsZS5WaWV3R3JvdXBfZGVzY2VuZGFudEZvY3VzYWJpbGl0eToKICAgICAgICAgICAgICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShERVNDRU5EQU5UX0ZPQ1VTQUJJTElUWV9GTEFHU1thLmdldEludChhdHRyLCAwKV0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9zcGxpdE1vdGlvbkV2ZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2V0TW90aW9uRXZlbnRTcGxpdHRpbmdFbmFibGVkKGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFIuc3R5bGVhYmxlLlZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlczoKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbmltYXRlTGF5b3V0Q2hhbmdlcyA9IGEuZ2V0Qm9vbGVhbihhdHRyLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmltYXRlTGF5b3V0Q2hhbmdlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TGF5b3V0VHJhbnNpdGlvbihuZXcgTGF5b3V0VHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NjEsNiArNTAwLDEzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50ICE9IG51bGwgPyBtUGFyZW50LnN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKG9yaWdpbmFsVmlldywgY2FsbGJhY2spIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBGaW5kIHRoZSBuZWFyZXN0IHZpZXcgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24gdGhhdCB3YW50cyB0byB0YWtlCiAgICAgICogZm9jdXMuCiAgICAgICoKQEAgLTgyNiwxMiArODcyLDE4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKG1Hcm91cEZsYWdzICYgRkxBR19TUExJVF9NT1RJT05fRVZFTlRTKSA9PSBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpIHsKKyAgICAgICAgICAgIGlmIChtU3BsaXRNb3Rpb25UYXJnZXRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU3BsaXRNb3Rpb25UYXJnZXRzID0gbmV3IFNwbGl0TW90aW9uVGFyZ2V0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoU3BsaXRUb3VjaEV2ZW50KGV2KTsKKwl9CisKICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOwogICAgICAgICBmaW5hbCBmbG9hdCB4ZiA9IGV2LmdldFgoKTsKICAgICAgICAgZmluYWwgZmxvYXQgeWYgPSBldi5nZXRZKCk7CiAgICAgICAgIGZpbmFsIGZsb2F0IHNjcm9sbGVkWEZsb2F0ID0geGYgKyBtU2Nyb2xsWDsKICAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRZRmxvYXQgPSB5ZiArIG1TY3JvbGxZOwotICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gbVRlbXBSZWN0OwogCiAgICAgICAgIGJvb2xlYW4gZGlzYWxsb3dJbnRlcmNlcHQgPSAobUdyb3VwRmxhZ3MgJiBGTEFHX0RJU0FMTE9XX0lOVEVSQ0VQVCkgIT0gMDsKIApAQCAtODUwLDI5ICs5MDIsMTcgQEAKICAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pOwogICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgZmluZCBhIGNoaWxkCiAgICAgICAgICAgICAgICAgLy8gd2hvIGNhbiBoYW5kbGUgaXQsIHN0YXJ0IHdpdGggdGhlIGZyb250LW1vc3QgY2hpbGQuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbGVkWEludCA9IChpbnQpIHNjcm9sbGVkWEZsb2F0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxlZFlJbnQgPSAoaW50KSBzY3JvbGxlZFlGbG9hdDsKICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spID09IFZJU0lCTEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRIaXRSZWN0KGZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS5jb250YWlucyhzY3JvbGxlZFhJbnQsIHNjcm9sbGVkWUludCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdGhlIGV2ZW50IHRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gY2hpbGQubUxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIGNoaWxkLm1Ub3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5tUHJpdmF0ZUZsYWdzICY9IH5DQU5DRUxfTkVYVF9VUF9FVkVOVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgaGFuZGxlZCwgd2UgaGF2ZSBhIHRhcmdldCBub3cuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBkaWRuJ3QgZ2V0IGhhbmRsZWQsIHRyeSB0aGUgbmV4dCB2aWV3LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJlc2V0IHRoZSBldmVudCdzIGxvY2F0aW9uLCBpdCdzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIGRpc3BhdGNoIGFsd2F5cyBwaWNrcyBpdHMgdGFyZ2V0IGJhc2VkIG9uIHRoZSBpbml0aWFsIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50J3MgcG9zaXRpb24gLSBpbmRleCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hUb3VjaEV2ZW50SWZJblZpZXcoY2hpbGQsIGV2LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25UYXJnZXQgPSBjaGlsZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTkwMiwxMSArOTQyLDIyIEBACiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tTGVmdDsKKyAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CisgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgIHRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgeWMgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisKICAgICAgICAgLy8gaWYgaGF2ZSBhIHRhcmdldCwgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IGl0cwogICAgICAgICAvLyBldmVudHMKICAgICAgICAgaWYgKCFkaXNhbGxvd0ludGVyY2VwdCAmJiBvbkludGVyY2VwdFRvdWNoRXZlbnQoZXYpKSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOwogICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOwogICAgICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKQEAgLTkyOCw4ICs5NzksNiBAQAogCiAgICAgICAgIC8vIGZpbmFsbHkgb2Zmc2V0IHRoZSBldmVudCB0byB0aGUgdGFyZ2V0J3MgY29vcmRpbmF0ZSBzeXN0ZW0gYW5kCiAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KLSAgICAgICAgZmluYWwgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OwotICAgICAgICBmaW5hbCBmbG9hdCB5YyA9IHNjcm9sbGVkWUZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubVRvcDsKICAgICAgICAgZXYuc2V0TG9jYXRpb24oeGMsIHljKTsKIAogICAgICAgICBpZiAoKHRhcmdldC5tUHJpdmF0ZUZsYWdzICYgQ0FOQ0VMX05FWFRfVVBfRVZFTlQpICE9IDApIHsKQEAgLTkzOCw3ICs5ODcsMjk1IEBACiAgICAgICAgICAgICBtTW90aW9uVGFyZ2V0ID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiB0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgaWYgKHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhmLCB5Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGRldGVjdHMgd2hldGhlciB0aGUgcG9pbnRlciBsb2NhdGlvbiBhdCA8Y29kZT5wb2ludGVySW5kZXg8L2NvZGU+IHdpdGhpbgorICAgICAqIDxjb2RlPmV2PC9jb2RlPiBpcyBpbnNpZGUgdGhlIHNwZWNpZmllZCB2aWV3LiBJZiBzbywgdGhlIHRyYW5zZm9ybWVkIGV2ZW50IGlzIGRpc3BhdGNoZWQgdG8KKyAgICAgKiA8Y29kZT5jaGlsZDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgVmlldyB0byBoaXQgdGVzdCBhZ2FpbnN0CisgICAgICogQHBhcmFtIGV2IE1vdGlvbkV2ZW50IHRvIHRlc3QKKyAgICAgKiBAcGFyYW0gcG9pbnRlckluZGV4IEluZGV4IG9mIHRoZSBwb2ludGVyIHdpdGhpbiA8Y29kZT5ldjwvY29kZT4gdG8gdGVzdAorICAgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBoaXQgdGVzdCBmYWlsZWQsIG9yIHRoZSByZXN1bHQgb2YKKyAgICAgKiAgICAgICAgIDxjb2RlPmNoaWxkLmRpc3BhdGNoVG91Y2hFdmVudDwvY29kZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzcGF0Y2hUb3VjaEV2ZW50SWZJblZpZXcoVmlldyBjaGlsZCwgTW90aW9uRXZlbnQgZXYsIGludCBwb2ludGVySW5kZXgpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgeCA9IGV2LmdldFgocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmluYWwgZmxvYXQgeSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2Nyb2xsZWRYID0geCArIG1TY3JvbGxYOworICAgICAgICBmaW5hbCBmbG9hdCBzY3JvbGxlZFkgPSB5ICsgbVNjcm9sbFk7CisgICAgICAgIGZsb2F0IGxvY2FsWCA9IHNjcm9sbGVkWCAtIGNoaWxkLm1MZWZ0OworICAgICAgICBmbG9hdCBsb2NhbFkgPSBzY3JvbGxlZFkgLSBjaGlsZC5tVG9wOworICAgICAgICBpZiAoIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MgY29vcmRpbmF0ZXMKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgIGxvY2FsWFlbMF0gPSBsb2NhbFg7CisgICAgICAgICAgICBsb2NhbFhZWzFdID0gbG9jYWxZOworICAgICAgICAgICAgY2hpbGQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgIGxvY2FsWCA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICBsb2NhbFkgPSBsb2NhbFhZWzFdOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbFggPj0gMCAmJiBsb2NhbFkgPj0gMCAmJiBsb2NhbFggPCAoY2hpbGQubVJpZ2h0IC0gY2hpbGQubUxlZnQpICYmCisgICAgICAgICAgICAgICAgbG9jYWxZIDwgKGNoaWxkLm1Cb3R0b20gLSBjaGlsZC5tVG9wKSkgeworICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgc2FmZXIgdG8gY2xvbmUgdGhlIGV2ZW50IGhlcmUgYnV0IHdlIGRvbid0IGZvciBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBtYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgaW4gdG91Y2ggZXZlbnQgZGlzcGF0Y2g7IGNoYW5nZSBhdCB5b3VyIG93biByaXNrLgorICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisgICAgICAgICAgICBldi5vZmZzZXRMb2NhdGlvbihsb2NhbFggLSB4LCBsb2NhbFkgLSB5KTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5kaXNwYXRjaFRvdWNoRXZlbnQoZXYpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV2Lm9mZnNldExvY2F0aW9uKHggLSBsb2NhbFgsIHkgLSBsb2NhbFkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3BhdGNoU3BsaXRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIFNwbGl0TW90aW9uVGFyZ2V0cyB0YXJnZXRzID0gbVNwbGl0TW90aW9uVGFyZ2V0czsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgIGZsb2F0IHhmID0gZXYuZ2V0WCgpOworICAgICAgICBmbG9hdCB5ZiA9IGV2LmdldFkoKTsKKyAgICAgICAgZmxvYXQgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICBmbG9hdCBzY3JvbGxlZFlGbG9hdCA9IHlmICsgbVNjcm9sbFk7CisKKyAgICAgICAgYm9vbGVhbiBkaXNhbGxvd0ludGVyY2VwdCA9IChtR3JvdXBGbGFncyAmIEZMQUdfRElTQUxMT1dfSU5URVJDRVBUKSAhPSAwOworCisgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gfHwKKyAgICAgICAgICAgICAgICBtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbkluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZChhY3Rpb25JbmRleCk7CisKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCBhbnkgY3VycmVudCB0YXJnZXQgZm9yIHRoaXMgSUQuCisgICAgICAgICAgICAvLyBYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBzZW5kIGFuIEFDVElPTl9VUCB0byB0aGUgY3VycmVudAorICAgICAgICAgICAgLy8gdGFyZ2V0IGlmIHByZXNlbnQuCisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQoYWN0aW9uSWQpOworCisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBkaXNhbGxvd2luZyBpbnRlcmNlcHQgb3IgaWYgd2UncmUgYWxsb3dpbmcgYW5kIHdlIGRpZG4ndAorICAgICAgICAgICAgLy8gaW50ZXJjZXB0CisgICAgICAgICAgICBpZiAoZGlzYWxsb3dJbnRlcmNlcHQgfHwgIW9uSW50ZXJjZXB0VG91Y2hFdmVudChldikpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aGlzIGV2ZW50J3MgYWN0aW9uIChqdXN0IHRvIHByb3RlY3Qgb3Vyc2VsdmVzKQorICAgICAgICAgICAgICAgIGV2LnNldEFjdGlvbihhY3Rpb24pOworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgd2Ugd2FudCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgZG93biwgdHJ5IHRvIGZpbmQgYSBjaGlsZAorICAgICAgICAgICAgICAgIC8vIHdobyBjYW4gaGFuZGxlIGl0LCBzdGFydCB3aXRoIHRoZSBmcm9udC1tb3N0IGNoaWxkLgorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZG93blRpbWUgPSBldi5nZXRFdmVudFRpbWUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNoaWxkLm1WaWV3RmxhZ3MgJiBWSVNJQklMSVRZX01BU0spID09IFZJU0lCTEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LCBjaGlsZCwgZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEFjdGlvbkluZGV4ID0gY2hpbGRFdmVudC5maW5kUG9pbnRlckluZGV4KGFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoVG91Y2hFdmVudElmSW5WaWV3KGNoaWxkLCBjaGlsZEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQWN0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgY2hpbGQsIGRvd25UaW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEV2ZW50LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZmluZCBhIG5ldyB0YXJnZXQuIERvIHdlIGhhdmUgYSAicHJpbWFyeSIgdGFyZ2V0IHRvIHNlbmQgdG8/CisgICAgICAgICAgICAgICAgZmluYWwgU3BsaXRNb3Rpb25UYXJnZXRzLlRhcmdldEluZm8gcHJpbWFyeVRhcmdldEluZm8gPSB0YXJnZXRzLmdldFByaW1hcnlUYXJnZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpbWFyeVRhcmdldEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHByaW1hcnlUYXJnZXQgPSBwcmltYXJ5VGFyZ2V0SW5mby52aWV3OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNb3Rpb25FdmVudCBjaGlsZEV2ZW50ID0gdGFyZ2V0cy5maWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlUYXJnZXQsIHByaW1hcnlUYXJnZXRJbmZvLmRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCBwb2ludCBpbnRvIHRoZSB0YXJnZXQncyBsb2NhbCBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhjID0gc2Nyb2xsZWRYRmxvYXQgLSAoZmxvYXQpIHByaW1hcnlUYXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgcHJpbWFyeVRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJpbWFyeVRhcmdldC5oYXNJZGVudGl0eU1hdHJpeCgpICYmIG1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWlkZW50aXR5IG1hdHJpeDogdHJhbnNmb3JtIHRoZSBwb2ludCBpbnRvIHRoZSB2aWV3J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBsb2NhbFhZID0gbUF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybUxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzBdID0geGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMV0gPSB5YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeVRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5VGFyZ2V0LmRpc3BhdGNoVG91Y2hFdmVudChjaGlsZEV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmFkZChhY3Rpb25JZCwgcHJpbWFyeVRhcmdldCwgcHJpbWFyeVRhcmdldEluZm8uZG93blRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRXZlbnQucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1VwT3JDYW5jZWwgPSAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgfHwKKyAgICAgICAgICAgICAgICAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworCisgICAgICAgIGlmIChpc1VwT3JDYW5jZWwpIHsKKyAgICAgICAgICAgIC8vIE5vdGUsIHdlJ3ZlIGFscmVhZHkgY29waWVkIHRoZSBwcmV2aW91cyBzdGF0ZSB0byBvdXIgbG9jYWwKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlLCBzbyB0aGlzIHRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCBldmVudAorICAgICAgICAgICAgbUdyb3VwRmxhZ3MgJj0gfkZMQUdfRElTQUxMT1dfSU5URVJDRVBUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSB0YXJnZXRzLCB0aGlzIG1lYW5zIHdlJ3JlIGhhbmRsaW5nIHRoZQorICAgICAgICAgICAgLy8gZXZlbnQgYXMgYSByZWd1bGFyIHZpZXcuCisgICAgICAgICAgICBldi5zZXRMb2NhdGlvbih4ZiwgeWYpOworICAgICAgICAgICAgaWYgKChtUHJpdmF0ZUZsYWdzICYgQ0FOQ0VMX05FWFRfVVBfRVZFTlQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBldi5zZXRBY3Rpb24oTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTCk7CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGhhdmUgdGFyZ2V0cywgc2VlIGlmIHdlJ3JlIGFsbG93ZWQgdG8gYW5kIHdhbnQgdG8gaW50ZXJjZXB0IHRoZWlyCisgICAgICAgIC8vIGV2ZW50cworICAgICAgICBpbnQgdW5pcXVlVGFyZ2V0Q291bnQgPSB0YXJnZXRzLmdldFVuaXF1ZVRhcmdldENvdW50KCk7CisgICAgICAgIGlmICghZGlzYWxsb3dJbnRlcmNlcHQgJiYgb25JbnRlcmNlcHRUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgbVByaXZhdGVGbGFncyAmPSB+Q0FOQ0VMX05FWFRfVVBfRVZFTlQ7CisKKyAgICAgICAgICAgIGZvciAoaW50IHVuaXF1ZUluZGV4ID0gMDsgdW5pcXVlSW5kZXggPCB1bmlxdWVUYXJnZXRDb3VudDsgdW5pcXVlSW5kZXgrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgdGFyZ2V0ID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCkudmlldzsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgZmxvYXQgeGMgPSBzY3JvbGxlZFhGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1MZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHljID0gc2Nyb2xsZWRZRmxvYXQgLSAoZmxvYXQpIHRhcmdldC5tVG9wOworICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmhhc0lkZW50aXR5TWF0cml4KCkgJiYgbUF0dGFjaEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub24taWRlbnRpdHkgbWF0cml4OiB0cmFuc2Zvcm0gdGhlIHBvaW50IGludG8gdGhlIHZpZXcncyBjb29yZGluYXRlcworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdFtdIGxvY2FsWFkgPSBtQXR0YWNoSW5mby5tVG1wVHJhbnNmb3JtTG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIGxvY2FsWFlbMF0gPSB4YzsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVsxXSA9IHljOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0SW52ZXJzZU1hdHJpeCgpLm1hcFBvaW50cyhsb2NhbFhZKTsKKyAgICAgICAgICAgICAgICAgICAgeGMgPSBsb2NhbFhZWzBdOworICAgICAgICAgICAgICAgICAgICB5YyA9IGxvY2FsWFlbMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXYuc2V0QWN0aW9uKE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUwpOworICAgICAgICAgICAgICAgIGV2LnNldExvY2F0aW9uKHhjLCB5Yyk7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuZGlzcGF0Y2hUb3VjaEV2ZW50KGV2KSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgZGlkbid0IGhhbmRsZSBBQ1RJT05fQ0FOQ0VMLiBub3QgbXVjaCB3ZSBjYW4gZG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZXkgc2hvdWxkIGhhdmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICAgICAgLy8gRG9uJ3QgZGlzcGF0Y2ggdGhpcyBldmVudCB0byBvdXIgb3duIHZpZXcsIGJlY2F1c2Ugd2UgYWxyZWFkeQorICAgICAgICAgICAgLy8gc2F3IGl0IHdoZW4gaW50ZXJjZXB0aW5nOyB3ZSBqdXN0IHdhbnQgdG8gZ2l2ZSB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAvLyBldmVudCB0byB0aGUgbm9ybWFsIG9uVG91Y2hFdmVudCgpLgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgdW5pcXVlSW5kZXggPSAwOyB1bmlxdWVJbmRleCA8IHVuaXF1ZVRhcmdldENvdW50OyB1bmlxdWVJbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBTcGxpdE1vdGlvblRhcmdldHMuVGFyZ2V0SW5mbyB0YXJnZXRJbmZvID0gdGFyZ2V0cy5nZXRVbmlxdWVUYXJnZXRBdCh1bmlxdWVJbmRleCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHRhcmdldCA9IHRhcmdldEluZm8udmlldzsKKworICAgICAgICAgICAgZmluYWwgTW90aW9uRXZlbnQgdGFyZ2V0RXZlbnQgPQorICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmZpbHRlck1vdGlvbkV2ZW50Rm9yQ2hpbGQoZXYsIHRhcmdldCwgdGFyZ2V0SW5mby5kb3duVGltZSk7CisgICAgICAgICAgICBpZiAodGFyZ2V0RXZlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHBvaW50IGludG8gdGhlIHRhcmdldCdzIGxvY2FsIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgeGYgPSB0YXJnZXRFdmVudC5nZXRYKCk7CisgICAgICAgICAgICAgICAgeWYgPSB0YXJnZXRFdmVudC5nZXRZKCk7CisgICAgICAgICAgICAgICAgc2Nyb2xsZWRYRmxvYXQgPSB4ZiArIG1TY3JvbGxYOworICAgICAgICAgICAgICAgIHNjcm9sbGVkWUZsb2F0ID0geWYgKyBtU2Nyb2xsWTsKKyAgICAgICAgICAgICAgICBmbG9hdCB4YyA9IHNjcm9sbGVkWEZsb2F0IC0gKGZsb2F0KSB0YXJnZXQubUxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeWMgPSBzY3JvbGxlZFlGbG9hdCAtIChmbG9hdCkgdGFyZ2V0Lm1Ub3A7CisgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzSWRlbnRpdHlNYXRyaXgoKSAmJiBtQXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1pZGVudGl0eSBtYXRyaXg6IHRyYW5zZm9ybSB0aGUgcG9pbnQgaW50byB0aGUgdmlldydzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0W10gbG9jYWxYWSA9IG1BdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1Mb2NhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxYWVswXSA9IHhjOworICAgICAgICAgICAgICAgICAgICBsb2NhbFhZWzFdID0geWM7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRJbnZlcnNlTWF0cml4KCkubWFwUG9pbnRzKGxvY2FsWFkpOworICAgICAgICAgICAgICAgICAgICB4YyA9IGxvY2FsWFlbMF07CisgICAgICAgICAgICAgICAgICAgIHljID0gbG9jYWxYWVsxXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IG9mZnNldCB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIGFuZAorICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSBldmVudC4KKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5zZXRMb2NhdGlvbih4YywgeWMpOworCisgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXQubVByaXZhdGVGbGFncyAmIENBTkNFTF9ORVhUX1VQX0VWRU5UKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldEV2ZW50LnNldEFjdGlvbihNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm1Qcml2YXRlRmxhZ3MgJj0gfkNBTkNFTF9ORVhUX1VQX0VWRU5UOworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZVZpZXcodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlVGFyZ2V0Q291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoaWxkSGFuZGxlZCA9IHRhcmdldC5kaXNwYXRjaFRvdWNoRXZlbnQodGFyZ2V0RXZlbnQpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gY2hpbGRIYW5kbGVkOworICAgICAgICAgICAgICAgIGlmICghY2hpbGRIYW5kbGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoaWxkIGRvZXNuJ3Qgd2FudCB0aGVzZSBldmVudHMgYW55bW9yZSwgYnV0IHdlJ3JlIHN0aWxsIGRpc3BhdGNoaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIHNwbGl0IGV2ZW50cyB0byBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5yZW1vdmVWaWV3KHRhcmdldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXRFdmVudC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVtb3ZlSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUJ5SWQocmVtb3ZlSWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVXBPckNhbmNlbCkgeworICAgICAgICAgICAgdGFyZ2V0cy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwbGl0dGluZyBvZiBNb3Rpb25FdmVudHMgdG8gbXVsdGlwbGUgY2hpbGRyZW4gZHVyaW5nIHRvdWNoIGV2ZW50CisgICAgICogZGlzcGF0Y2guIFRoaXMgYmVoYXZpb3IgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIDxwPldoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBNb3Rpb25FdmVudHMgbWF5IGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIGRpZmZlcmVudCBjaGlsZAorICAgICAqIHZpZXdzIGRlcGVuZGluZyBvbiB3aGVyZSBlYWNoIHBvaW50ZXIgaW5pdGlhbGx5IHdlbnQgZG93bi4gVGhpcyBhbGxvd3MgZm9yIHVzZXIgaW50ZXJhY3Rpb25zCisgICAgICogc3VjaCBhcyBzY3JvbGxpbmcgdHdvIHBhbmVzIG9mIGNvbnRlbnQgaW5kZXBlbmRlbnRseSwgY2hvcmRpbmcgb2YgYnV0dG9ucywgYW5kIHBlcmZvcm1pbmcKKyAgICAgKiBpbmRlcGVuZGVudCBnZXN0dXJlcyBvbiBkaWZmZXJlbnQgcGllY2VzIG9mIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BsaXQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgTW90aW9uRXZlbnRzIHRvIGJlIHNwbGl0IGFuZCBkaXNwYXRjaGVkIHRvIG11bHRpcGxlCisgICAgICogICAgICAgICAgICAgIGNoaWxkIHZpZXdzLiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSBhbGxvdyBvbmUgY2hpbGQgdmlldyB0byBiZSB0aGUgdGFyZ2V0IG9mCisgICAgICogICAgICAgICAgICAgIGFueSBNb3Rpb25FdmVudCByZWNlaXZlZCBieSB0aGlzIFZpZXdHcm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYm9vbGVhbiBzcGxpdCkgeworICAgICAgICAvLyBUT0RPIEFwcGxpY2F0aW9ucyByZWFsbHkgc2hvdWxkbid0IGNoYW5nZSB0aGlzIHNldHRpbmcgbWlkLXRvdWNoIGV2ZW50LAorICAgICAgICAvLyBidXQgcGVyaGFwcyB0aGlzIHNob3VsZCBoYW5kbGUgdGhhdCBjYXNlIGFuZCBzZW5kIEFDVElPTl9DQU5DRUxzIHRvIGFueSBjaGlsZCB2aWV3cworICAgICAgICAvLyB3aXRoIGdlc3R1cmVzIGluIHByb2dyZXNzIHdoZW4gdGhpcyBpcyBjaGFuZ2VkLgorICAgICAgICBpZiAoc3BsaXQpIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX1NQTElUX01PVElPTl9FVkVOVFM7CisgICAgICAgICAgICBtU3BsaXRNb3Rpb25UYXJnZXRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBNb3Rpb25FdmVudHMgZGlzcGF0Y2hlZCB0byB0aGlzIFZpZXdHcm91cCBjYW4gYmUgc3BsaXQgdG8gbXVsdGlwbGUgY2hpbGRyZW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUdyb3VwRmxhZ3MgJiBGTEFHX1NQTElUX01PVElPTl9FVkVOVFMpID09IEZMQUdfU1BMSVRfTU9USU9OX0VWRU5UUzsKICAgICB9CiAKICAgICAvKioKQEAgLTExODYsNyArMTUyMywxMCBAQAogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2hpbGRyZW5Db3VudDsKICAgICAgICAgZmluYWwgVmlld1tdIGNoaWxkcmVuID0gbUNoaWxkcmVuOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuW2ldLmRpc3BhdGNoU2F2ZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIFZpZXcgYyA9IGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjLm1WaWV3RmxhZ3MgJiBQQVJFTlRfU0FWRV9ESVNBQkxFRF9NQVNLKSAhPSBQQVJFTlRfU0FWRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGMuZGlzcGF0Y2hTYXZlSW5zdGFuY2VTdGF0ZShjb250YWluZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjExLDcgKzE1NTEsMTAgQEAKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltpXS5kaXNwYXRjaFJlc3RvcmVJbnN0YW5jZVN0YXRlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBWaWV3IGMgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoYy5tVmlld0ZsYWdzICYgUEFSRU5UX1NBVkVfRElTQUJMRURfTUFTSykgIT0gUEFSRU5UX1NBVkVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBjLmRpc3BhdGNoUmVzdG9yZUluc3RhbmNlU3RhdGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ4MSwyMiArMTgyNCwyNSBAQAogICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBtR3JvdXBGbGFnczsKIAogICAgICAgICBpZiAoKGZsYWdzICYgRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgPT0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTikgewotICAgICAgICAgICAgaWYgKG1DaGlsZFRyYW5zZm9ybWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2hpbGRUcmFuc2Zvcm1hdGlvbi5jbGVhcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24uY2xlYXIoKTsKICAgICAgICAgICAgIG1Hcm91cEZsYWdzICY9IH5GTEFHX0NMRUFSX1RSQU5TRk9STUFUSU9OOwogICAgICAgICB9CiAKICAgICAgICAgVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtVG9BcHBseSA9IG51bGw7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uIGludmFsaWRhdGlvblRyYW5zZm9ybTsKICAgICAgICAgZmluYWwgQW5pbWF0aW9uIGEgPSBjaGlsZC5nZXRBbmltYXRpb24oKTsKICAgICAgICAgYm9vbGVhbiBjb25jYXRNYXRyaXggPSBmYWxzZTsKIAotICAgICAgICBpZiAoYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUludmFsaWRhdGVSZWdpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gbmV3IFJlY3RGKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBSZWN0RiByZWdpb24gPSBtSW52YWxpZGF0ZVJlZ2lvbjsKKyAgICAgICAgYm9vbGVhbiBzY2FsaW5nUmVxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBjYWNoaW5nID0gZmFsc2U7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGZsYWdzICYgRkxBR19DSElMRFJFTl9EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUgfHwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSA9PSBGTEFHX0FMV0FZU19EUkFXTl9XSVRIX0NBQ0hFKSB7CisgICAgICAgICAgICBjYWNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSBzY2FsaW5nUmVxdWlyZWQgPSBtQXR0YWNoSW5mby5tU2NhbGluZ1JlcXVpcmVkOworICAgICAgICB9CiAKKyAgICAgICAgaWYgKGEgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplZCA9IGEuaXNJbml0aWFsaXplZCgpOwogICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgIGEuaW5pdGlhbGl6ZShjciAtIGNsLCBjYiAtIGN0LCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7CkBAIC0xNTA0LDEwICsxODUwLDE3IEBACiAgICAgICAgICAgICAgICAgY2hpbGQub25BbmltYXRpb25TdGFydCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobUNoaWxkVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGlsZFRyYW5zZm9ybWF0aW9uID0gbmV3IFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihkcmF3aW5nVGltZSwgbUNoaWxkVHJhbnNmb3JtYXRpb24sCisgICAgICAgICAgICAgICAgICAgIHNjYWxpbmdSZXF1aXJlZCA/IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlIDogMWYpOworICAgICAgICAgICAgaWYgKHNjYWxpbmdSZXF1aXJlZCAmJiBtQXR0YWNoSW5mby5tQXBwbGljYXRpb25TY2FsZSAhPSAxZikgeworICAgICAgICAgICAgICAgIGlmIChtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZGF0aW9uVHJhbnNmb3JtID0gbUludmFsaWRhdGlvblRyYW5zZm9ybWF0aW9uOworICAgICAgICAgICAgICAgIGEuZ2V0VHJhbnNmb3JtYXRpb24oZHJhd2luZ1RpbWUsIGludmFsaWRhdGlvblRyYW5zZm9ybSwgMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRpb25UcmFuc2Zvcm0gPSBtQ2hpbGRUcmFuc2Zvcm1hdGlvbjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGRyYXdpbmdUaW1lLCBtQ2hpbGRUcmFuc2Zvcm1hdGlvbik7CiAgICAgICAgICAgICB0cmFuc2Zvcm1Ub0FwcGx5ID0gbUNoaWxkVHJhbnNmb3JtYXRpb247CiAKICAgICAgICAgICAgIGNvbmNhdE1hdHJpeCA9IGEud2lsbENoYW5nZVRyYW5zZm9ybWF0aW9uTWF0cml4KCk7CkBAIC0xNTI0LDcgKzE4NzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoY2wsIGN0LCBjciwgY2IpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYS5nZXRJbnZhbGlkYXRlUmVnaW9uKDAsIDAsIGNyIC0gY2wsIGNiIC0gY3QsIHJlZ2lvbiwgdHJhbnNmb3JtVG9BcHBseSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSW52YWxpZGF0ZVJlZ2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0ZVJlZ2lvbiA9IG5ldyBSZWN0RigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlY3RGIHJlZ2lvbiA9IG1JbnZhbGlkYXRlUmVnaW9uOworICAgICAgICAgICAgICAgICAgICBhLmdldEludmFsaWRhdGVSZWdpb24oMCwgMCwgY3IgLSBjbCwgY2IgLSBjdCwgcmVnaW9uLCBpbnZhbGlkYXRpb25UcmFuc2Zvcm0pOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBuZWVkIHRvIGRyYXcgYW4gYW5pbWF0aW9uLCBwb3RlbnRpYWxseSBvZmZzY3JlZW4sIHNvCiAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkbyBub3QgY2FuY2VsIGludmFsaWRhdGUgcmVxdWVzdHMKQEAgLTE1MzcsOSArMTg5NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgRkxBR19TVVBQT1JUX1NUQVRJQ19UUkFOU0ZPUk1BVElPTlMpID09CiAgICAgICAgICAgICAgICAgRkxBR19TVVBQT1JUX1NUQVRJQ19UUkFOU0ZPUk1BVElPTlMpIHsKLSAgICAgICAgICAgIGlmIChtQ2hpbGRUcmFuc2Zvcm1hdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoaWxkVHJhbnNmb3JtYXRpb24gPSBuZXcgVHJhbnNmb3JtYXRpb24oKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzVHJhbnNmb3JtID0gZ2V0Q2hpbGRTdGF0aWNUcmFuc2Zvcm1hdGlvbihjaGlsZCwgbUNoaWxkVHJhbnNmb3JtYXRpb24pOwogICAgICAgICAgICAgaWYgKGhhc1RyYW5zZm9ybSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCB0cmFuc2Zvcm1UeXBlID0gbUNoaWxkVHJhbnNmb3JtYXRpb24uZ2V0VHJhbnNmb3JtYXRpb25UeXBlKCk7CkBAIC0xNTQ5LDYgKzE5MDMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgY29uY2F0TWF0cml4IHw9ICFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpOworCiAgICAgICAgIC8vIFNldHMgdGhlIGZsYWcgYXMgZWFybHkgYXMgcG9zc2libGUgdG8gYWxsb3cgZHJhdygpIGltcGxlbWVudGF0aW9ucwogICAgICAgICAvLyB0byBjYWxsIGludmFsaWRhdGUoKSBzdWNjZXNzZnVsbHkgd2hlbiBkb2luZyBhbmltYXRpb25zCiAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gRFJBV047CkBAIC0xNTYzLDEyICsxOTE5LDkgQEAKICAgICAgICAgZmluYWwgaW50IHN4ID0gY2hpbGQubVNjcm9sbFg7CiAgICAgICAgIGZpbmFsIGludCBzeSA9IGNoaWxkLm1TY3JvbGxZOwogCi0gICAgICAgIGJvb2xlYW4gc2NhbGluZ1JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgIEJpdG1hcCBjYWNoZSA9IG51bGw7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NISUxEUkVOX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQ0hJTERSRU5fRFJBV05fV0lUSF9DQUNIRSB8fAotICAgICAgICAgICAgICAgIChmbGFncyAmIEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpID09IEZMQUdfQUxXQVlTX0RSQVdOX1dJVEhfQ0FDSEUpIHsKKyAgICAgICAgaWYgKGNhY2hpbmcpIHsKICAgICAgICAgICAgIGNhY2hlID0gY2hpbGQuZ2V0RHJhd2luZ0NhY2hlKHRydWUpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvICE9IG51bGwpIHNjYWxpbmdSZXF1aXJlZCA9IG1BdHRhY2hJbmZvLm1TY2FsaW5nUmVxdWlyZWQ7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBib29sZWFuIGhhc05vQ2FjaGUgPSBjYWNoZSA9PSBudWxsOwpAQCAtMTU4NSw0MCArMTkzOCw1NiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmxvYXQgYWxwaGEgPSAxLjBmOworICAgICAgICBmbG9hdCBhbHBoYSA9IGNoaWxkLmdldEFscGhhKCk7CiAKLSAgICAgICAgaWYgKHRyYW5zZm9ybVRvQXBwbHkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbmNhdE1hdHJpeCkgewotICAgICAgICAgICAgICAgIGludCB0cmFuc1ggPSAwOwotICAgICAgICAgICAgICAgIGludCB0cmFuc1kgPSAwOwotICAgICAgICAgICAgICAgIGlmIChoYXNOb0NhY2hlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zWCA9IC1zeDsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNZID0gLXN5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVbmRvIHRoZSBzY3JvbGwgdHJhbnNsYXRpb24sIGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgLy8gdGhlbiByZWRvIHRoZSBzY3JvbGwgdHJhbnNsYXRlIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQuCi0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuY29uY2F0KHRyYW5zZm9ybVRvQXBwbHkuZ2V0TWF0cml4KCkpOwotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOwotICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgIGlmICh0cmFuc2Zvcm1Ub0FwcGx5ICE9IG51bGwgfHwgYWxwaGEgPCAxLjBmIHx8ICFjaGlsZC5oYXNJZGVudGl0eU1hdHJpeCgpKSB7CisgICAgICAgICAgICBpbnQgdHJhbnNYID0gMDsKKyAgICAgICAgICAgIGludCB0cmFuc1kgPSAwOworCisgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgeworICAgICAgICAgICAgICAgIHRyYW5zWCA9IC1zeDsKKyAgICAgICAgICAgICAgICB0cmFuc1kgPSAtc3k7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFscGhhID0gdHJhbnNmb3JtVG9BcHBseS5nZXRBbHBoYSgpOworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVRvQXBwbHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjb25jYXRNYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5kbyB0aGUgc2Nyb2xsIHRyYW5zbGF0aW9uLCBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJlZG8gdGhlIHNjcm9sbCB0cmFuc2xhdGUgdG8gZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdC4KKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtdHJhbnNYLCAtdHJhbnNZKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmNvbmNhdCh0cmFuc2Zvcm1Ub0FwcGx5LmdldE1hdHJpeCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSh0cmFuc1gsIHRyYW5zWSk7CisgICAgICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmxvYXQgdHJhbnNmb3JtQWxwaGEgPSB0cmFuc2Zvcm1Ub0FwcGx5LmdldEFscGhhKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUFscGhhIDwgMS4wZikgeworICAgICAgICAgICAgICAgICAgICBhbHBoYSAqPSB0cmFuc2Zvcm1Ub0FwcGx5LmdldEFscGhhKCk7CisgICAgICAgICAgICAgICAgICAgIG1Hcm91cEZsYWdzIHw9IEZMQUdfQ0xFQVJfVFJBTlNGT1JNQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNoaWxkLmhhc0lkZW50aXR5TWF0cml4KCkpIHsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC10cmFuc1gsIC10cmFuc1kpOworICAgICAgICAgICAgICAgIGNhbnZhcy5jb25jYXQoY2hpbGQuZ2V0TWF0cml4KCkpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHJhbnNYLCB0cmFuc1kpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYWxwaGEgPCAxLjBmKSB7CiAgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19DTEVBUl9UUkFOU0ZPUk1BVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFscGhhIDwgMS4wZiAmJiBoYXNOb0NhY2hlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IG11bHRpcGxpZWRBbHBoYSA9IChpbnQpICgyNTUgKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5vblNldEFscGhhKG11bHRpcGxpZWRBbHBoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNhdmVMYXllckFscGhhKHN4LCBzeSwgc3ggKyBjciAtIGNsLCBzeSArIGNiIC0gY3QsIG11bHRpcGxpZWRBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQubVByaXZhdGVGbGFncyB8PSBBTFBIQV9TRVQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoaGFzTm9DYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbXVsdGlwbGllZEFscGhhID0gKGludCkgKDI1NSAqIGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5vblNldEFscGhhKG11bHRpcGxpZWRBbHBoYSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYShzeCwgc3ksIHN4ICsgY3IgLSBjbCwgc3kgKyBjYiAtIGN0LCBtdWx0aXBsaWVkQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhcy5IQVNfQUxQSEFfTEFZRVJfU0FWRV9GTEFHIHwgQ2FudmFzLkNMSVBfVE9fTEFZRVJfU0FWRV9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgfD0gQUxQSEFfU0VUOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChjaGlsZC5tUHJpdmF0ZUZsYWdzICYgQUxQSEFfU0VUKSA9PSBBTFBIQV9TRVQpIHsKICAgICAgICAgICAgIGNoaWxkLm9uU2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNoaWxkLm1Qcml2YXRlRmxhZ3MgJj0gfkFMUEhBX1NFVDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0NMSVBfQ0hJTERSRU4pID09IEZMQUdfQ0xJUF9DSElMRFJFTikgewpAQCAtMTY1Myw5ICsyMDIyLDYgQEAKICAgICAgICAgICAgICAgICBjYWNoZVBhaW50LnNldEFscGhhKDI1NSk7CiAgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgJj0gfkZMQUdfQUxQSEFfTE9XRVJfVEhBTl9PTkU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgewotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDMsIGhhc2hDb2RlKCkpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAoY2FjaGUsIDAuMGYsIDAuMGYsIGNhY2hlUGFpbnQpOwogICAgICAgICB9CiAKQEAgLTE3MDEsNiArMjA2Nyw3IEBACiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgCiAgICAgICAgICAgICBjaGlsZHJlbltpXS5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTc2LDYgKzIzNDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IGNhbGwgcmVtb3ZlVmlldygpIG9uIHRoZSBjaGlsZCdzIHBhcmVudCBmaXJzdC4iKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZEFkZCh0aGlzLCBjaGlsZCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIWNoZWNrTGF5b3V0UGFyYW1zKHBhcmFtcykpIHsKICAgICAgICAgICAgIHBhcmFtcyA9IGdlbmVyYXRlTGF5b3V0UGFyYW1zKHBhcmFtcyk7CiAgICAgICAgIH0KQEAgLTIwNTMsNyArMjQyNCw5IEBACiAgICAgLy8gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSBjaGlsZCdzIG1QYXJlbnQgdG8gbnVsbAogICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tQXJyYXkoaW50IGluZGV4KSB7CiAgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKLSAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICBpZiAoIShtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwgJiYgbVRyYW5zaXRpb25pbmdWaWV3cy5jb250YWlucyhjaGlsZHJlbltpbmRleF0pKSkgeworICAgICAgICAgICAgY2hpbGRyZW5baW5kZXhdLm1QYXJlbnQgPSBudWxsOworICAgICAgICB9CiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OwogICAgICAgICBpZiAoaW5kZXggPT0gY291bnQgLSAxKSB7CiAgICAgICAgICAgICBjaGlsZHJlblstLW1DaGlsZHJlbkNvdW50XSA9IG51bGw7CkBAIC0yMTg4LDEzICsyNTYxLDE5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdJbnRlcm5hbChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworCisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZFJlbW92ZSh0aGlzLCB2aWV3KTsKKyAgICAgICAgfQorCiAgICAgICAgIGJvb2xlYW4gY2xlYXJDaGlsZEZvY3VzID0gZmFsc2U7CiAgICAgICAgIGlmICh2aWV3ID09IG1Gb2N1c2VkKSB7CiAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgfSBlbHNlIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjIxMyw2ICsyNTkyLDM5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBmb3IgdGhpcyBWaWV3R3JvdXAuIElmIHRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCBpcworICAgICAqIG5vdCBudWxsLCBjaGFuZ2VzIGluIGxheW91dCB3aGljaCBvY2N1ciBiZWNhdXNlIG9mIGNoaWxkcmVuIGJlaW5nIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbQorICAgICAqIHRoZSBWaWV3R3JvdXAgd2lsbCBiZSBhbmltYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFuaW1hdGlvbnMgZGVmaW5lZCBpbiB0aGF0IExheW91dFRyYW5zaXRpb24KKyAgICAgKiBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoZSB0cmFuc2l0aW9uIG9iamVjdCBpcyBudWxsIChzbyBsYXlvdXQgY2hhbmdlcyBhcmUgbm90IGFuaW1hdGVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uIFRoZSBMYXlvdXRUcmFuc2l0aW9uIG9iamVjdCB0aGF0IHdpbGwgYW5pbWF0ZWQgY2hhbmdlcyBpbiBsYXlvdXQuIEEgdmFsdWUKKyAgICAgKiBvZiA8Y29kZT5udWxsPC9jb2RlPiBtZWFucyBubyB0cmFuc2l0aW9uIHdpbGwgcnVuIG9uIGxheW91dCBjaGFuZ2VzLgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdHcm91cF9hbmltYXRlTGF5b3V0Q2hhbmdlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExheW91dFRyYW5zaXRpb24oTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CisgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbi5yZW1vdmVUcmFuc2l0aW9uTGlzdGVuZXIobUxheW91dFRyYW5zaXRpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbVRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICBpZiAobVRyYW5zaXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVRyYW5zaXRpb24uYWRkVHJhbnNpdGlvbkxpc3RlbmVyKG1MYXlvdXRUcmFuc2l0aW9uTGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgZm9yIHRoaXMgVmlld0dyb3VwLiBJZiB0aGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgaXMKKyAgICAgKiBub3QgbnVsbCwgY2hhbmdlcyBpbiBsYXlvdXQgd2hpY2ggb2NjdXIgYmVjYXVzZSBvZiBjaGlsZHJlbiBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KKyAgICAgKiB0aGUgVmlld0dyb3VwIHdpbGwgYmUgYW5pbWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhbmltYXRpb25zIGRlZmluZWQgaW4gdGhhdCBMYXlvdXRUcmFuc2l0aW9uCisgICAgICogb2JqZWN0LiBCeSBkZWZhdWx0LCB0aGUgdHJhbnNpdGlvbiBvYmplY3QgaXMgbnVsbCAoc28gbGF5b3V0IGNoYW5nZXMgYXJlIG5vdCBhbmltYXRlZCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExheW91dFRyYW5zdGlvbiBUaGUgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3QgdGhhdCB3aWxsIGFuaW1hdGVkIGNoYW5nZXMgaW4gbGF5b3V0LgorICAgICAqIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgbm8gdHJhbnNpdGlvbiB3aWxsIHJ1biBvbiBsYXlvdXQgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGF5b3V0VHJhbnNpdGlvbiBnZXRMYXlvdXRUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zaXRpb247CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVZpZXdzSW50ZXJuYWwoaW50IHN0YXJ0LCBpbnQgY291bnQpIHsKICAgICAgICAgZmluYWwgT25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lciBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyID0gbU9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXI7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5TGlzdGVuZXIgPSBvbkhpZXJhcmNoeUNoYW5nZUxpc3RlbmVyICE9IG51bGw7CkBAIC0yMjI2LDEyICsyNjM4LDE3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBjaGlsZHJlbltpXTsKIAorICAgICAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvbi5jaGlsZFJlbW92ZSh0aGlzLCB2aWV3KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHZpZXcgPT0gZm9jdXNlZCkgewogICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJGb2N1c0ZvclJlbW92YWwoKTsKICAgICAgICAgICAgICAgICBjbGVhckNoaWxkRm9jdXMgPSB2aWV3OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmlldy5nZXRBbmltYXRpb24oKSAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgKG1UcmFuc2l0aW9uaW5nVmlld3MgIT0gbnVsbCAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzLmNvbnRhaW5zKHZpZXcpKSkgewogICAgICAgICAgICAgICAgIGFkZERpc2FwcGVhcmluZ1ZpZXcodmlldyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldGFjaCkgewogICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwpAQCAtMjI5MCwxMiArMjcwNywxNyBAQAogICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gY2hpbGRyZW5baV07CiAKKyAgICAgICAgICAgIGlmIChtVHJhbnNpdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb24uY2hpbGRSZW1vdmUodGhpcywgdmlldyk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmICh2aWV3ID09IGZvY3VzZWQpIHsKICAgICAgICAgICAgICAgICB2aWV3LmNsZWFyRm9jdXNGb3JSZW1vdmFsKCk7CiAgICAgICAgICAgICAgICAgY2xlYXJDaGlsZEZvY3VzID0gdmlldzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHZpZXcuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnModmlldykpKSB7CiAgICAgICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyh2aWV3KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV0YWNoKSB7CiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCk7CkBAIC0yMzI4LDExICsyNzUwLDE2IEBACiAgICAgICogQHNlZSAjZGV0YWNoVmlld0Zyb21QYXJlbnQoaW50KQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZURldGFjaGVkVmlldyhWaWV3IGNoaWxkLCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgaWYgKG1UcmFuc2l0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uLmNoaWxkUmVtb3ZlKHRoaXMsIGNoaWxkKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChjaGlsZCA9PSBtRm9jdXNlZCkgewogICAgICAgICAgICAgY2hpbGQuY2xlYXJGb2N1cygpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAoKGFuaW1hdGUgJiYgY2hpbGQuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsICYmIG1UcmFuc2l0aW9uaW5nVmlld3MuY29udGFpbnMoY2hpbGQpKSkgewogICAgICAgICAgICAgYWRkRGlzYXBwZWFyaW5nVmlldyhjaGlsZCk7CiAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQubUF0dGFjaEluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgY2hpbGQuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKQEAgLTI0NzQsNiArMjkwMSwxNSBAQAogICAgICAgICAgICAgZmluYWwgaW50W10gbG9jYXRpb24gPSBhdHRhY2hJbmZvLm1JbnZhbGlkYXRlQ2hpbGRMb2NhdGlvbjsKICAgICAgICAgICAgIGxvY2F0aW9uW0NISUxEX0xFRlRfSU5ERVhdID0gY2hpbGQubUxlZnQ7CiAgICAgICAgICAgICBsb2NhdGlvbltDSElMRF9UT1BfSU5ERVhdID0gY2hpbGQubVRvcDsKKyAgICAgICAgICAgIE1hdHJpeCBjaGlsZE1hdHJpeCA9IGNoaWxkLmdldE1hdHJpeCgpOworICAgICAgICAgICAgaWYgKCFjaGlsZE1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBSZWN0RiBib3VuZGluZ1JlY3QgPSBhdHRhY2hJbmZvLm1UbXBUcmFuc2Zvcm1SZWN0OworICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdC5zZXQoZGlydHkpOworICAgICAgICAgICAgICAgIGNoaWxkTWF0cml4Lm1hcFJlY3QoYm91bmRpbmdSZWN0KTsKKyAgICAgICAgICAgICAgICBkaXJ0eS5zZXQoKGludCkgYm91bmRpbmdSZWN0LmxlZnQsIChpbnQpIGJvdW5kaW5nUmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LmJvdHRvbSArIDAuNWYpKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIGRyYXdpbmcgYW4gYW5pbWF0aW9uLCB3ZSB3YW50IHRvIGNvcHkgdGhpcyBmbGFnIG9udG8KICAgICAgICAgICAgIC8vIG91cnNlbHZlcyBhbmQgdGhlIHBhcmVudCB0byBtYWtlIHN1cmUgdGhlIGludmFsaWRhdGUgcmVxdWVzdCBnb2VzCkBAIC0yNTA4LDYgKzI5NDQsMTggQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaW52YWxpZGF0ZUNoaWxkSW5QYXJlbnQobG9jYXRpb24sIGRpcnR5KTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIHRyYW5zZm9ybSBvbiBjdXJyZW50IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBNYXRyaXggbSA9IHZpZXcuZ2V0TWF0cml4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbS5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RGIGJvdW5kaW5nUmVjdCA9IGF0dGFjaEluZm8ubVRtcFRyYW5zZm9ybVJlY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGluZ1JlY3Quc2V0KGRpcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0ubWFwUmVjdChib3VuZGluZ1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkuc2V0KChpbnQpIGJvdW5kaW5nUmVjdC5sZWZ0LCAoaW50KSBib3VuZGluZ1JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRpbmdSZWN0LnJpZ2h0ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChib3VuZGluZ1JlY3QuYm90dG9tICsgMC41ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAocGFyZW50ICE9IG51bGwpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjg3NCw3ICszMzIyLDcgQEAKICAgICAgKi8KICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAiZHJhd2luZyIsIG1hcHBpbmcgPSB7CiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfTk9fQ0FDSEUsICAgICAgICB0byA9ICJOT05FIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTklNQVRJT04iKSwKKyAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gUEVSU0lTVEVOVF9BTklNQVRJT05fQ0FDSEUsIHRvID0gIkFOSU1BVElPTiIpLAogICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBQRVJTSVNURU5UX1NDUk9MTElOR19DQUNIRSwgdG8gPSAiU0NST0xMSU5HIiksCiAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IFBFUlNJU1RFTlRfQUxMX0NBQ0hFUywgICAgICB0byA9ICJBTEwiKQogICAgIH0pCkBAIC0zMjg3LDYgKzM3MzUsNzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgVmlld0dyb3VwIHRoYXQgdGhlIGdpdmVuIFZpZXcgb2JqZWN0LCB3aGljaCBzaG91bGQgaGF2ZSB0aGlzCisgICAgICogVmlld0dyb3VwIGFzIGl0cyBwYXJlbnQsCisgICAgICogc2hvdWxkIGJlIGtlcHQgYXJvdW5kICAocmUtZGlzcGxheWVkIHdoZW4gdGhlIFZpZXdHcm91cCBkcmF3cyBpdHMgY2hpbGRyZW4pIGV2ZW4gaWYgaXQKKyAgICAgKiBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudC4gVGhpcyBhbGxvd3MgYW5pbWF0aW9ucywgc3VjaCBhcyB0aG9zZSB1c2VkIGJ5CisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb259IHRvIGFuaW1hdGUKKyAgICAgKiB0aGUgcmVtb3ZhbCBvZiB2aWV3cy4gQSBjYWxsIHRvIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSBsYXRlciBjYWxsCisgICAgICogdG8ge0BsaW5rICNlbmRWaWV3VHJhbnNpdGlvbihWaWV3KX0sIHN1Y2ggYXMgYWZ0ZXIgYW4gYW5pbWF0aW9uIG9uIHRoZSBWaWV3IGhhcyBmaW5pc2hlZCwKKyAgICAgKiBzbyB0aGF0IHRoZSBWaWV3IGZpbmFsbHkgZ2V0cyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXcgVGhlIFZpZXcgb2JqZWN0IHRvIGJlIGtlcHQgdmlzaWJsZSBldmVuIGlmIGl0IGdldHMgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3IHZpZXcpIHsKKyAgICAgICAgaWYgKHZpZXcubVBhcmVudCA9PSB0aGlzKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYW5zaXRpb25pbmdWaWV3cyA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFuc2l0aW9uaW5nVmlld3MuYWRkKHZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgZm9sbG93aW5nIGFuIGVhcmxpZXIgY2FsbCB0bworICAgICAqIHtAbGluayAjc3RhcnRWaWV3VHJhbnNpdGlvbihWaWV3KX0uIFRoZSBnaXZlbiBWaWV3IGlzIGZpbmFsbHkgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQKKyAgICAgKiBhbmQgd2lsbCBubyBsb25nZXIgYmUgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSB0aGUgZnVuY3Rpb25hbGl0eQorICAgICAqIG9mIHJlbW92aW5nIGEgdmlldyBmcm9tIGl0cyBwYXJlbnQ7IGl0IGp1c3QgZGlzY29udGludWVzIHRoZSBkaXNwbGF5IG9mIGEgVmlldyB0aGF0CisgICAgICogaGFzIHByZXZpb3VzbHkgYmVlbiByZW1vdmVkLgorICAgICAqCisgICAgICogQHJldHVybiB2aWV3IFRoZSBWaWV3IG9iamVjdCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgYnV0IGlzIGJlaW5nIGtlcHQgYXJvdW5kIGluIHRoZSB2aXNpYmxlCisgICAgICogaGllcmFyY2h5IGJ5IGFuIGVhcmxpZXIgY2FsbCB0byB7QGxpbmsgI3N0YXJ0Vmlld1RyYW5zaXRpb24oVmlldyl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFZpZXdUcmFuc2l0aW9uKFZpZXcgdmlldykgeworICAgICAgICBpZiAobVRyYW5zaXRpb25pbmdWaWV3cyAhPSBudWxsKSB7CisgICAgICAgICAgICBtVHJhbnNpdGlvbmluZ1ZpZXdzLnJlbW92ZSh2aWV3KTsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBkaXNhcHBlYXJpbmdDaGlsZHJlbiA9IG1EaXNhcHBlYXJpbmdDaGlsZHJlbjsKKyAgICAgICAgICAgIGlmIChkaXNhcHBlYXJpbmdDaGlsZHJlbiAhPSBudWxsICYmIGRpc2FwcGVhcmluZ0NoaWxkcmVuLmNvbnRhaW5zKHZpZXcpKSB7CisgICAgICAgICAgICAgICAgZGlzYXBwZWFyaW5nQ2hpbGRyZW4ucmVtb3ZlKHZpZXcpOworICAgICAgICAgICAgICAgIGlmICh2aWV3Lm1BdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmlldy5tUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlldy5tUGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUdyb3VwRmxhZ3MgfD0gRkxBR19JTlZBTElEQVRFX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lciBtTGF5b3V0VHJhbnNpdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBMYXlvdXRUcmFuc2l0aW9uLlRyYW5zaXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBkaXNhcHBlYXJpbmcgaXRlbXMsIHNpbmNlIHdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBrZWVwCisgICAgICAgICAgICAvLyB0aG9zZSBpdGVtcyB2aXNpYmxlIGFmdGVyIHRoZXkndmUgYmVlbiAncmVtb3ZlZCcKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORykgeworICAgICAgICAgICAgICAgIHN0YXJ0Vmlld1RyYW5zaXRpb24odmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW5kVHJhbnNpdGlvbihMYXlvdXRUcmFuc2l0aW9uIHRyYW5zaXRpb24sIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgVmlldyB2aWV3LCBpbnQgdHJhbnNpdGlvblR5cGUpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uVHlwZSA9PSBMYXlvdXRUcmFuc2l0aW9uLkRJU0FQUEVBUklORyAmJiBtVHJhbnNpdGlvbmluZ1ZpZXdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbmRWaWV3VHJhbnNpdGlvbih2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0zNzQ4LDQgKzQyNjUsMjkyIEBACiAgICAgICAgICAgICBib3R0b21NYXJnaW4gPSBib3R0b207CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcGxpdE1vdGlvblRhcmdldHMgeworICAgICAgICBwcml2YXRlIFNwYXJzZUFycmF5PFZpZXc+IG1UYXJnZXRzOworICAgICAgICBwcml2YXRlIFRhcmdldEluZm9bXSBtVW5pcXVlVGFyZ2V0czsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICBwcml2YXRlIE1vdGlvbkV2ZW50LlBvaW50ZXJDb29yZHNbXSBtUG9pbnRlckNvb3JkczsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtUG9pbnRlcklkczsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRSA9IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0JVQ0tFVF9TSVpFID0gNTsKKworICAgICAgICBwdWJsaWMgU3BsaXRNb3Rpb25UYXJnZXRzKCkgeworICAgICAgICAgICAgbVRhcmdldHMgPSBuZXcgU3BhcnNlQXJyYXk8Vmlldz4oKTsKKyAgICAgICAgICAgIG1VbmlxdWVUYXJnZXRzID0gbmV3IFRhcmdldEluZm9bSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRV07CisgICAgICAgICAgICBtUG9pbnRlcklkcyA9IG5ldyBpbnRbSU5JVElBTF9CVUNLRVRfU0laRV07CisgICAgICAgICAgICBtUG9pbnRlckNvb3JkcyA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW0lOSVRJQUxfQlVDS0VUX1NJWkVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTklUSUFMX0JVQ0tFVF9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUG9pbnRlckNvb3Jkc1tpXSA9IG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1UYXJnZXRzLmNsZWFyKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVW5pcXVlVGFyZ2V0Q291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0c1tpXS5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVVuaXF1ZVRhcmdldENvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgcG9pbnRlcklkLCBWaWV3IHRhcmdldCwgbG9uZyBkb3duVGltZSkgeworICAgICAgICAgICAgbVRhcmdldHMucHV0KHBvaW50ZXJJZCwgdGFyZ2V0KTsKKworICAgICAgICAgICAgZmluYWwgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgYm9vbGVhbiBhZGRVbmlxdWUgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1VbmlxdWVUYXJnZXRzW2ldLnZpZXcgPT0gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFVuaXF1ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRVbmlxdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVVuaXF1ZVRhcmdldHMubGVuZ3RoID09IHVuaXF1ZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm9bXSBuZXdUYXJnZXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXJnZXRJbmZvW3VuaXF1ZUNvdW50ICsgSU5JVElBTF9VTklRVUVfTU9USU9OX1RBUkdFVFNfU0laRV07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVVuaXF1ZVRhcmdldHMsIDAsIG5ld1RhcmdldHMsIDAsIHVuaXF1ZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVVuaXF1ZVRhcmdldHMgPSBuZXdUYXJnZXRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0c1t1bmlxdWVDb3VudF0gPSBUYXJnZXRJbmZvLm9idGFpbih0YXJnZXQsIGRvd25UaW1lKTsKKyAgICAgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFVuaXF1ZVRhcmdldENvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVUYXJnZXRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYXJnZXRJbmZvIGdldFVuaXF1ZVRhcmdldEF0KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVUYXJnZXRzW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaWV3IGdldChpbnQgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy5nZXQoaWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmRleE9mVGFyZ2V0KFZpZXcgdGFyZ2V0KSB7CisgICAgICAgICAgICByZXR1cm4gbVRhcmdldHMuaW5kZXhPZlZhbHVlKHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlldyB0YXJnZXRBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFyZ2V0cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYXJnZXRJbmZvIGdldFByaW1hcnlUYXJnZXQoKSB7CisgICAgICAgICAgICBpZiAoIWlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvbmdlc3QtbGl2ZWQgdGFyZ2V0CisgICAgICAgICAgICAgICAgbG9uZyBmaXJzdFRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvIGluZm8gPSBtVW5pcXVlVGFyZ2V0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZG93blRpbWUgPCBmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGluZm8uZG93blRpbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldHNbZmlyc3RJbmRleF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZVRhcmdldENvdW50ID09IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVCeUlkKGludCBpZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbVRhcmdldHMuaW5kZXhPZktleShpZCk7CisgICAgICAgICAgICByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaSA8IG1UYXJnZXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0cy52YWx1ZUF0KGkpID09IHZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZVVuaXF1ZSh2aWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0KGludCBpbmRleCkgeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtVGFyZ2V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgcmVtb3ZlVmlldyA9IG1UYXJnZXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgbVRhcmdldHMucmVtb3ZlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKG1UYXJnZXRzLmluZGV4T2ZWYWx1ZShyZW1vdmVWaWV3KSA8IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVVbmlxdWUocmVtb3ZlVmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVW5pcXVlKFZpZXcgcmVtb3ZlVmlldykgeworICAgICAgICAgICAgVGFyZ2V0SW5mb1tdIHVuaXF1ZSA9IG1VbmlxdWVUYXJnZXRzOworICAgICAgICAgICAgaW50IHVuaXF1ZUNvdW50ID0gbVVuaXF1ZVRhcmdldENvdW50OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVtpXS52aWV3ID09IHJlbW92ZVZpZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlW2ldID0gdW5pcXVlWy0tdW5pcXVlQ291bnRdOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVbdW5pcXVlQ291bnRdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVW5pcXVlVGFyZ2V0Q291bnQgPSB1bmlxdWVDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBuZXcgKG9idGFpbigpZWQpIE1vdGlvbkV2ZW50IGNvbnRhaW5pbmcgb25seSBkYXRhIGZvciBwb2ludGVycyB0aGF0IHNob3VsZAorICAgICAgICAgKiBiZSBkaXNwYXRjaGVkIHRvIGNoaWxkLiBEb24ndCBmb3JnZXQgdG8gcmVjeWNsZSBpdCEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNb3Rpb25FdmVudCBmaWx0ZXJNb3Rpb25FdmVudEZvckNoaWxkKE1vdGlvbkV2ZW50IGV2LCBWaWV3IGNoaWxkLCBsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWFza2VkQWN0aW9uID0gYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7CisKKyAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBwb2ludGVyIHVwIGV2ZW50cyBpZiB0aGlzIGNoaWxkIHdhcyB0aGUgdGFyZ2V0LiBEcm9wIGl0IG90aGVyd2lzZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgZ2V0KGV2LmdldFBvaW50ZXJJZChldi5nZXRBY3Rpb25JbmRleCgpKSkgIT0gY2hpbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvaW50ZXJDb3VudCA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWRDb3VudCA9IGdldElkQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldEF0KGkpID09IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFjdGlvbklkID0gLTE7CisgICAgICAgICAgICBib29sZWFuIG5lZWRzTmV3SW5kZXggPSBmYWxzZTsgLy8gVHJ1ZSBpZiB3ZSBzaG91bGQgZmlsbCBpbiB0aGUgYWN0aW9uJ3MgbWFza2VkIGluZGV4CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkb3duIGV2ZW50LCBpdCB3YXNuJ3QgY291bnRlZCBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtYXNrZWRBY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBhY3Rpb25JZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICBwb2ludGVyQ291bnQrKzsKKworICAgICAgICAgICAgICAgIGFjdGlvbklkID0gZXYuZ2V0UG9pbnRlcklkKGV2LmdldEFjdGlvbkluZGV4KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZUYXJnZXQoY2hpbGQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmV3IGFjdGlvbiBzaG91bGQgYmUgQUNUSU9OX0RPV04gaWYgdGhpcyBjaGlsZCBpc24ndCBjdXJyZW50bHkgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICAvLyBhbnkgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsIGluIHRoZSBpbmRleCBwb3J0aW9uIG9mIHRoZSBhY3Rpb24gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG5lZWRzTmV3SW5kZXggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFza2VkQWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aW9uSWQgPSBldi5nZXRQb2ludGVySWQoZXYuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXcgYWN0aW9uIHNob3VsZCBiZSBBQ1RJT05fVVAgaWYgdGhlcmUncyBvbmx5IG9uZSBwb2ludGVyIGxlZnQgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdGFyZ2V0LgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBNb3Rpb25FdmVudC5BQ1RJT05fVVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbCBpbiB0aGUgaW5kZXggcG9ydGlvbiBvZiB0aGUgYWN0aW9uIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBuZWVkc05ld0luZGV4ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb2ludGVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxsIHRoZSBidWNrZXRzIHdpdGggcG9pbnRlciBkYXRhIQorICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50UG9pbnRlckNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisgICAgICAgICAgICBpbnQgYnVja2V0SW5kZXggPSAwOworICAgICAgICAgICAgaW50IG5ld0FjdGlvbkluZGV4ID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBldnAgPSAwOyBldnAgPCBldmVudFBvaW50ZXJDb3VudDsgZXZwKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBldi5nZXRQb2ludGVySWQoZXZwKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHBvaW50ZXIgdG8gdGhlIGJ1Y2tldCBpZiBpdCBpcyBuZXcgb3IgdGFyZ2V0ZWQgYXQgY2hpbGQKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gYWN0aW9uSWQgfHwgZ2V0KGlkKSA9PSBjaGlsZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBhbmQgc2NyYXRjaCBhcnJheXMgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckNvb3Jkcy5sZW5ndGggPD0gYnVja2V0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHBvaW50ZXJJZHMgPSBuZXcgaW50W3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW10gcG9pbnRlckNvb3JkcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb3Rpb25FdmVudC5Qb2ludGVyQ29vcmRzW3BvaW50ZXJDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbVBvaW50ZXJDb29yZHMubGVuZ3RoOyBpIDwgcG9pbnRlckNvb3Jkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHNbaV0gPSBuZXcgTW90aW9uRXZlbnQuUG9pbnRlckNvb3JkcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1Qb2ludGVyQ29vcmRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLCAwLCBtUG9pbnRlckNvb3Jkcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtUG9pbnRlcklkcywgMCwgcG9pbnRlcklkcywgMCwgbVBvaW50ZXJJZHMubGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJDb29yZHMgPSBwb2ludGVyQ29vcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHMgPSBwb2ludGVySWRzOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJJZHNbYnVja2V0SW5kZXhdID0gaWQ7CisgICAgICAgICAgICAgICAgICAgIGV2LmdldFBvaW50ZXJDb29yZHMoZXZwLCBtUG9pbnRlckNvb3Jkc1tidWNrZXRJbmRleF0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc05ld0luZGV4ICYmIGlkID09IGFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBY3Rpb25JbmRleCA9IGJ1Y2tldEluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVuY29kZSB0aGUgbmV3IGFjdGlvbiBpbmRleCBpZiB3ZSBoYXZlIG9uZQorICAgICAgICAgICAgaWYgKG5ld0FjdGlvbkluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdBY3Rpb25JbmRleCA8PCBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JTkRFWF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBNb3Rpb25FdmVudC5vYnRhaW4oZG93blRpbWUsIGV2LmdldEV2ZW50VGltZSgpLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIHBvaW50ZXJDb3VudCwgbVBvaW50ZXJJZHMsIG1Qb2ludGVyQ29vcmRzLCBldi5nZXRNZXRhU3RhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WFByZWNpc2lvbigpLCBldi5nZXRZUHJlY2lzaW9uKCksIGV2LmdldERldmljZUlkKCksIGV2LmdldEVkZ2VGbGFncygpLAorICAgICAgICAgICAgICAgICAgICBldi5nZXRTb3VyY2UoKSwgZXYuZ2V0RmxhZ3MoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgVGFyZ2V0SW5mbyB7CisgICAgICAgICAgICBwdWJsaWMgVmlldyB2aWV3OworICAgICAgICAgICAgcHVibGljIGxvbmcgZG93blRpbWU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbyBtTmV4dFJlY3ljbGVkOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBUYXJnZXRJbmZvIHNSZWN5Y2xlQmluOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNSZWN5Y2xlZENvdW50OworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1JFQ1lDTEVEID0gMTU7CisKKyAgICAgICAgICAgIHByaXZhdGUgVGFyZ2V0SW5mbygpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUYXJnZXRJbmZvIG9idGFpbihWaWV3IHYsIGxvbmcgdGltZSkgeworICAgICAgICAgICAgICAgIFRhcmdldEluZm8gaW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoc1JlY3ljbGVCaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmV3IFRhcmdldEluZm8oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgICAgIHNSZWN5Y2xlQmluID0gaW5mby5tTmV4dFJlY3ljbGVkOworICAgICAgICAgICAgICAgICAgICBzUmVjeWNsZWRDb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnZpZXcgPSB2OworICAgICAgICAgICAgICAgIGluZm8uZG93blRpbWUgPSB0aW1lOworICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAgICAgICAgIGlmIChzUmVjeWNsZWRDb3VudCA+PSBNQVhfUkVDWUNMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTmV4dFJlY3ljbGVkID0gc1JlY3ljbGVCaW47CisgICAgICAgICAgICAgICAgc1JlY3ljbGVCaW4gPSB0aGlzOworICAgICAgICAgICAgICAgIHNSZWN5Y2xlZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQYXJlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCmluZGV4IGI0NTZjNWQuLmQ3ZDRjM2YgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1BhcmVudC5qYXZhCkBAIC0xNjIsNiArMTYyLDIwIEBACiAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSk7CiAKICAgICAvKioKKyAgICAgKiBTdGFydCBhbiBhY3Rpb24gbW9kZSBmb3IgdGhlIHNwZWNpZmllZCB2aWV3LgorICAgICAqIDxwPgorICAgICAqIEluIG1vc3QgY2FzZXMsIGEgc3ViY2xhc3MgZG9lcyBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzLiBIb3dldmVyLCBpZiB0aGUKKyAgICAgKiBzdWJjbGFzcyBpcyBhZGRlZCBkaXJlY3RseSB0byB0aGUgd2luZG93IG1hbmFnZXIgKGZvciBleGFtcGxlLAorICAgICAqIHtAbGluayBWaWV3TWFuYWdlciNhZGRWaWV3KFZpZXcsIGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zKX0pCisgICAgICogdGhlbiBpdCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBhbmQgc3RhcnQgdGhlIGFjdGlvbiBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsVmlldyBUaGUgc291cmNlIHZpZXcgd2hlcmUgdGhlIGFjdGlvbiBtb2RlIHdhcyBmaXJzdCBpbnZva2VkCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBhY3Rpb24gbW9kZQorICAgICAqIEByZXR1cm4gVGhlIG5ldyBhY3Rpb24gbW9kZSBpZiBpdCB3YXMgc3RhcnRlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IG9yaWdpbmFsVmlldywgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIHBhcmVudCB3aGVuIGEgY2hpbGQncyBkcmF3YWJsZSBzdGF0ZQogICAgICAqIGhhcyBjaGFuZ2VkLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290LmphdmEKaW5kZXggNTdjOTA1NS4uNjJkMzBlZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtNTYsMTAgKzU2LDYgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLio7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMC4qOwotCiAvKioKICAqIFRoZSB0b3Agb2YgYSB2aWV3IGhpZXJhcmNoeSwgaW1wbGVtZW50aW5nIHRoZSBuZWVkZWQgcHJvdG9jb2wgYmV0d2VlbiBWaWV3CiAgKiBhbmQgdGhlIFdpbmRvd01hbmFnZXIuICBUaGlzIGlzIGZvciB0aGUgbW9zdCBwYXJ0IGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uCkBAIC02NywxNCArNjMsMTIgQEAKICAqCiAgKiB7QGhpZGV9CiAgKi8KLUBTdXBwcmVzc1dhcm5pbmdzKHsiRW1wdHlDYXRjaEJsb2NrIn0pCi1wdWJsaWMgZmluYWwgY2xhc3MgVmlld1Jvb3QgZXh0ZW5kcyBIYW5kbGVyIGltcGxlbWVudHMgVmlld1BhcmVudCwKLSAgICAgICAgVmlldy5BdHRhY2hJbmZvLkNhbGxiYWNrcyB7CitAU3VwcHJlc3NXYXJuaW5ncyh7IkVtcHR5Q2F0Y2hCbG9jayIsICJQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbiJ9KQorcHVibGljIGZpbmFsIGNsYXNzIFZpZXdSb290IGV4dGVuZHMgSGFuZGxlciBpbXBsZW1lbnRzIFZpZXdQYXJlbnQsIFZpZXcuQXR0YWNoSW5mby5DYWxsYmFja3MgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlld1Jvb3QiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX0ZQUyA9IGZhbHNlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiQ29uc3RhbnRDb25kaXRpb25hbEV4cHJlc3Npb24ifSkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZSA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9MT0dWID0gZmFsc2U7CiAgICAgLyoqIEBub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24qLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRFJBVyA9IGZhbHNlIHx8IExPQ0FMX0xPR1Y7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19MQVlPVVQgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwpAQCAtOTUsOCArODksNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RSQUNLQkFMTF9ERUxBWSA9IDI1MDsKIAotICAgIHN0YXRpYyBsb25nIHNJbnN0YW5jZUNvdW50ID0gMDsKLQogICAgIHN0YXRpYyBJV2luZG93U2Vzc2lvbiBzV2luZG93U2Vzc2lvbjsKIAogICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgbVN0YXRpY0luaXQgPSBuZXcgT2JqZWN0KCk7CkBAIC0yMDQsMTQgKzE5Niw3IEBACiAgICAgaW50IG1DdXJTY3JvbGxZOwogICAgIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAotICAgIEVHTDEwIG1FZ2w7Ci0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgR0wxMSBtR0w7Ci0gICAgQ2FudmFzIG1HbENhbnZhczsKLSAgICBib29sZWFuIG1Vc2VHTDsKLSAgICBib29sZWFuIG1HbFdhbnRlZDsKKyAgICBIYXJkd2FyZVJlbmRlcmVyIG1Id1JlbmRlcmVyOwogCiAgICAgZmluYWwgVmlld0NvbmZpZ3VyYXRpb24gbVZpZXdDb25maWd1cmF0aW9uOwogCkBAIC0yNDEsMTMgKzIyNiwxMiBAQAogICAgIHB1YmxpYyBWaWV3Um9vdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoKTsKIAotICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZICYmIGx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICBpZiAoTUVBU1VSRV9MQVRFTkNZKSB7CisgICAgICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGx0ID0gbmV3IExhdGVuY3lUaW1lcigxMDAsIDEwMDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gRm9yIGRlYnVnIG9ubHkKLSAgICAgICAgLy8rK3NJbnN0YW5jZUNvdW50OwotCiAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRpY3Mgd2hlbiB0aGlzIGNsYXNzIGlzIGZpcnN0IGluc3RhbnRpYXRlZC4gVGhpcyBpcwogICAgICAgICAvLyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgc3RhdGljIGJsb2NrIGJlY2F1c2UgWnlnb3RlIGRvZXMgbm90CiAgICAgICAgIC8vIGFsbG93IHRoZSBzcGF3bmluZyBvZiB0aHJlYWRzLgpAQCAtMjYyLDcgKzI0Niw3IEBACiAgICAgICAgIG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIG1WaXNSZWN0ID0gbmV3IFJlY3QoKTsKICAgICAgICAgbVdpbkZyYW1lID0gbmV3IFJlY3QoKTsKLSAgICAgICAgbVdpbmRvdyA9IG5ldyBXKHRoaXMsIGNvbnRleHQpOworICAgICAgICBtV2luZG93ID0gbmV3IFcodGhpcyk7CiAgICAgICAgIG1JbnB1dE1ldGhvZENhbGxiYWNrID0gbmV3IElucHV0TWV0aG9kQ2FsbGJhY2sodGhpcyk7CiAgICAgICAgIG1WaWV3VmlzaWJpbGl0eSA9IFZpZXcuR09ORTsKICAgICAgICAgbVRyYW5zcGFyZW50UmVnaW9uID0gbmV3IFJlZ2lvbigpOwpAQCAtMjc0LDE5ICsyNTgsNiBAQAogICAgICAgICBtRGVuc2l0eSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOwogICAgIH0KIAotICAgIC8vIEZvciBkZWJ1ZyBvbmx5Ci0gICAgLyoKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAtLXNJbnN0YW5jZUNvdW50OwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGdldEluc3RhbmNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2VDb3VudDsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmlyc3REcmF3SGFuZGxlcihSdW5uYWJsZSBjYWxsYmFjaykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgaWYgKCFzRmlyc3REcmF3Q29tcGxldGUpIHsKQEAgLTMzMCwxMjIgKzMwMSwxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVHTCgpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUdMSW5uZXIoKTsKLSAgICAgICAgaW50IGVyciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgLy8gZ2l2ZS11cCBvbiB1c2luZyBHTAotICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICBtR2xXYW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR0xJbm5lcigpIHsKLSAgICAgICAgZmluYWwgRUdMMTAgZWdsID0gKEVHTDEwKSBFR0xDb250ZXh0LmdldEVHTCgpOwotICAgICAgICBtRWdsID0gZWdsOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0byB0aGUgZGVmYXVsdCBkaXNwbGF5LgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMRGlzcGxheSBlZ2xEaXNwbGF5ID0gZWdsLmVnbEdldERpc3BsYXkoRUdMMTAuRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsRGlzcGxheTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBjYW4gbm93IGluaXRpYWxpemUgRUdMIGZvciB0aGF0IGRpc3BsYXkKLSAgICAgICAgICovCi0gICAgICAgIGludFtdIHZlcnNpb24gPSBuZXcgaW50WzJdOwotICAgICAgICBlZ2wuZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCB2ZXJzaW9uKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmb3Igb3VyIG9wZW5nbCBzZXNzaW9uCi0gICAgICAgICAqIGFuZCBncmFiIHRoZSBmaXJzdCBjb25maWd1cmF0aW9uIHRoYXQgbWF0Y2hlcyBpcwotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgaW50W10gY29uZmlnU3BlYyA9IHsKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsICAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgICAgNiwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAgICAgNSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfREVQVEhfU0laRSwgICAgMCwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQotICAgICAgICB9OwotICAgICAgICBmaW5hbCBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1sxXTsKLSAgICAgICAgZmluYWwgaW50W10gbnVtX2NvbmZpZyA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgY29uZmlnU3BlYywgY29uZmlncywgMSwgbnVtX2NvbmZpZyk7Ci0gICAgICAgIGZpbmFsIEVHTENvbmZpZyBjb25maWcgPSBjb25maWdzWzBdOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSBhbiBPcGVuR0wgRVMgY29udGV4dC4gVGhpcyBtdXN0IGJlIGRvbmUgb25seSBvbmNlLCBhbgotICAgICAgICAgKiBPcGVuR0wgY29udGV4dCBpcyBhIHNvbWV3aGF0IGhlYXZ5IG9iamVjdC4KLSAgICAgICAgICovCi0gICAgICAgIGZpbmFsIEVHTENvbnRleHQgY29udGV4dCA9IGVnbC5lZ2xDcmVhdGVDb250ZXh0KGVnbERpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgbnVsbCk7Ci0gICAgICAgIG1FZ2xDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDcmVhdGUgYW4gRUdMIHN1cmZhY2Ugd2UgY2FuIHJlbmRlciBpbnRvLgotICAgICAgICAgKi8KLSAgICAgICAgZmluYWwgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsLmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgY29uZmlnLCBtSG9sZGVyLCBudWxsKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBzdXJmYWNlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEJlZm9yZSB3ZSBjYW4gaXNzdWUgR0wgY29tbWFuZHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0gICAgICAgICAqIHRoZSBjb250ZXh0IGlzIGN1cnJlbnQgYW5kIGJvdW5kIHRvIGEgc3VyZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIGVnbC5lZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdG8gdGhlIGFwcHJvcHJpYXRlIEdMIGludGVyZmFjZS4KLSAgICAgICAgICogVGhpcyBpcyBzaW1wbHkgZG9uZSBieSBjYXN0aW5nIHRoZSBHTCBjb250ZXh0IHRvIGVpdGhlcgotICAgICAgICAgKiBHTDEwIG9yIEdMMTEuCi0gICAgICAgICAqLwotICAgICAgICBmaW5hbCBHTDExIGdsID0gKEdMMTEpIGNvbnRleHQuZ2V0R0woKTsKLSAgICAgICAgbUdMID0gZ2w7Ci0gICAgICAgIG1HbENhbnZhcyA9IG5ldyBDYW52YXMoZ2wpOwotICAgICAgICBtVXNlR0wgPSB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95R0woKSB7Ci0gICAgICAgIC8vIGluZm9ybSBza2lhIHRoYXQgdGhlIGNvbnRleHQgaXMgZ29uZQotICAgICAgICBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKLQotICAgICAgICBtRWdsLmVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0wxMC5FR0xfTk9fU1VSRkFDRSwKLSAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTk9fU1VSRkFDRSwgRUdMMTAuRUdMX05PX0NPTlRFWFQpOwotICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIG1FZ2wuZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgbUVnbC5lZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICBtRWdsQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gbnVsbDsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBudWxsOwotICAgICAgICBtRWdsID0gbnVsbDsKLSAgICAgICAgbUdsQ2FudmFzID0gbnVsbDsKLSAgICAgICAgbUdMID0gbnVsbDsKLSAgICAgICAgbVVzZUdMID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRWdsRXJyb3JzKCkgewotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gbUVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBiYWQgaGFzIGhhcHBlbmVkIHJldmVydCB0bwotICAgICAgICAgICAgICAgIC8vIG5vcm1hbCByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBFR0wxMS5FR0xfQ09OVEVYVF9MT1NUKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRyeSBhZ2FpbiBpZiBpdCB3YXMgY29udGV4dCBsb3N0Ci0gICAgICAgICAgICAgICAgICAgIG1HbFdhbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFdlIGhhdmUgb25lIGNoaWxkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmlldyhWaWV3IHZpZXcsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzLAotICAgICAgICAgICAgVmlldyBwYW5lbFBhcmVudFZpZXcpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldywgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFZpZXcgcGFuZWxQYXJlbnRWaWV3KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmlldyA9IHZpZXc7CiAgICAgICAgICAgICAgICAgbVdpbmRvd0F0dHJpYnV0ZXMuY29weUZyb20oYXR0cnMpOwogICAgICAgICAgICAgICAgIGF0dHJzID0gbVdpbmRvd0F0dHJpYnV0ZXM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRpb24oYXR0cnMpOworCiAgICAgICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSb290Vmlld1N1cmZhY2VUYWtlcikgewogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZUhvbGRlckNhbGxiYWNrID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJvb3RWaWV3U3VyZmFjZVRha2VyKXZpZXcpLndpbGxZb3VUYWtlVGhlU3VyZmFjZSgpOwpAQCAtNTc1LDYgKzQ0MiwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGF0dHJzKSB7CisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiB3ZSBhcmUgbm90IGluIHRoZSBzeXN0ZW0gcHJvY2VzcworICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgY3JlYXRlcyBWaWV3Um9vdHMgdG8gZGlzcGxheSBhbmltYXRlZCBwcmV2aWV3IHdpbmRvd3MKKyAgICAgICAgLy8gb2YgbGF1bmNoaW5nIGFwcHMgYW5kIHdlIGRvbid0IHdhbnQgdGhvc2UgdG8gYmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQKKyAgICAgICAgaWYgKCFIYXJkd2FyZVJlbmRlcmVyLnNSZW5kZXJlckRpc2FibGVkKSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIChhdHRycyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChhdHRycy5mbGFncyAmIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRyYW5zbHVjZW50ID0gYXR0cnMuZm9ybWF0ICE9IFBpeGVsRm9ybWF0Lk9QQVFVRTsKKyAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtSHdSZW5kZXJlci5kZXN0cm95KHRydWUpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbUh3UmVuZGVyZXIgPSBIYXJkd2FyZVJlbmRlcmVyLmNyZWF0ZUdsUmVuZGVyZXIoMiwgdHJhbnNsdWNlbnQpOworICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZUFjY2VsZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoKSB7CiAgICAgICAgIHJldHVybiBtVmlldzsKICAgICB9CkBAIC03MzEsOCArNjE2LDYgQEAKICAgICAgICAgYm9vbGVhbiB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgPSBtVmlld1Zpc2liaWxpdHkgIT0gdmlld1Zpc2liaWxpdHkKICAgICAgICAgICAgICAgICB8fCBtTmV3U3VyZmFjZU5lZWRlZDsKIAotICAgICAgICBmbG9hdCBhcHBTY2FsZSA9IG1BdHRhY2hJbmZvLm1BcHBsaWNhdGlvblNjYWxlOwotCiAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG51bGw7CiAgICAgICAgIGlmIChtV2luZG93QXR0cmlidXRlc0NoYW5nZWQpIHsKICAgICAgICAgICAgIG1XaW5kb3dBdHRyaWJ1dGVzQ2hhbmdlZCA9IGZhbHNlOwpAQCAtNzgwLDkgKzY2Myw5IEBACiAgICAgICAgICAgICBhdHRhY2hJbmZvLm1XaW5kb3dWaXNpYmlsaXR5ID0gdmlld1Zpc2liaWxpdHk7CiAgICAgICAgICAgICBob3N0LmRpc3BhdGNoV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgaWYgKHZpZXdWaXNpYmlsaXR5ICE9IFZpZXcuVklTSUJMRSB8fCBtTmV3U3VyZmFjZU5lZWRlZCkgewotICAgICAgICAgICAgICAgIGlmIChtVXNlR0wpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdHJveUdMKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSHdSZW5kZXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3koZmFsc2UpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmlld1Zpc2liaWxpdHkgPT0gVmlldy5HT05FKSB7CiAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgbWFraW5nIGEgd2luZG93IGdvbmUsIHdlIHdpbGwgY291bnQgaXQgYXMgYmVpbmcKQEAgLTg5NywxMCArNzgwLDEyIEBACiAKICAgICAgICAgZmluYWwgYm9vbGVhbiBjb21wdXRlc0ludGVybmFsSW5zZXRzID0KICAgICAgICAgICAgICAgICBhdHRhY2hJbmZvLm1UcmVlT2JzZXJ2ZXIuaGFzQ29tcHV0ZUludGVybmFsSW5zZXRzTGlzdGVuZXJzKCk7CisKICAgICAgICAgYm9vbGVhbiBpbnNldHNQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgIGludCByZWxheW91dFJlc3VsdCA9IDA7Ci0gICAgICAgIGlmIChtRmlyc3QgfHwgd2luZG93U2hvdWxkUmVzaXplIHx8IGluc2V0c0NoYW5nZWQKLSAgICAgICAgICAgICAgICB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQgfHwgcGFyYW1zICE9IG51bGwpIHsKKworICAgICAgICBpZiAobUZpcnN0IHx8IHdpbmRvd1Nob3VsZFJlc2l6ZSB8fCBpbnNldHNDaGFuZ2VkIHx8CisgICAgICAgICAgICAgICAgdmlld1Zpc2liaWxpdHlDaGFuZ2VkIHx8IHBhcmFtcyAhPSBudWxsKSB7CiAKICAgICAgICAgICAgIGlmICh2aWV3VmlzaWJpbGl0eSA9PSBWaWV3LlZJU0lCTEUpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdpbmRvdyBpcyBnaXZpbmcgaW50ZXJuYWwgaW5zZXRzIHRvIHRoZSB3aW5kb3cKQEAgLTkxMiwyNiArNzk3LDE5IEBACiAgICAgICAgICAgICAgICAgLy8gd2luZG93LCB3YWl0aW5nIHVudGlsIHdlIGNhbiBmaW5pc2ggbGF5aW5nIG91dCB0aGlzIHdpbmRvdwogICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgYmFjayB0byB0aGUgd2luZG93IG1hbmFnZXIgd2l0aCB0aGUgdWx0aW1hdGVseQogICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGluc2V0cy4KLSAgICAgICAgICAgICAgICBpbnNldHNQZW5kaW5nID0gY29tcHV0ZXNJbnRlcm5hbEluc2V0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dBdHRyaWJ1dGVzLm1lbW9yeVR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuTUVNT1JZX1RZUEVfR1BVKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gbVdpbmRvd0F0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUdsV2FudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5zZXRzUGVuZGluZyA9IGNvbXB1dGVzSW50ZXJuYWxJbnNldHMgJiYgKG1GaXJzdCB8fCB2aWV3VmlzaWJpbGl0eUNoYW5nZWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgbURyYXdpbmdBbGxvd2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgICAgICBib29sZWFuIGh3SW50aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiBjb250ZW50SW5zZXRzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlSW5zZXRzQ2hhbmdlZDsKICAgICAgICAgICAgIGJvb2xlYW4gaGFkU3VyZmFjZSA9IG1TdXJmYWNlLmlzVmFsaWQoKTsKKwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnQgZmwgPSAwOwogICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewpAQCAtOTkxLDkgKzg2OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uLnNldEVtcHR5KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtR2xXYW50ZWQgJiYgIW1Vc2VHTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVHTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkID0gbUdsQ2FudmFzICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UmVuZGVyZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3SW50aWFsaXplZCA9IG1Id1JlbmRlcmVyLmluaXRpYWxpemUobUhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtU3VyZmFjZS5pc1ZhbGlkKCkpIHsKQEAgLTEwNzAsMTAgKzk0Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyLm1TdXJmYWNlTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChtSGVpZ2h0ICogYXBwU2NhbGUgKyAwLjVmKSk7CisKKyAgICAgICAgICAgIGlmIChod0ludGlhbGl6ZWQgfHwgKHdpbmRvd1Nob3VsZFJlc2l6ZSAmJiBtSHdSZW5kZXJlciAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLnNldHVwKG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2xlYW4gZm9jdXNDaGFuZ2VkRHVlVG9Ub3VjaE1vZGUgPSBlbnN1cmVUb3VjaE1vZGVMb2NhbGx5KApAQCAtMTEzMyw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgICAgICBUQUcsICJMYXlpbmcgb3V0ICIgKyBob3N0ICsgIiB0byAoIiArCiAgICAgICAgICAgICAgICAgaG9zdC5tTWVhc3VyZWRXaWR0aCArICIsICIgKyBob3N0Lm1NZWFzdXJlZEhlaWdodCArICIpIik7CiAgICAgICAgICAgICBsb25nIHN0YXJ0VGltZSA9IDBMOwotICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcucHJvZmlsZUxheW91dCkgeworICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0xBWU9VVCkgewogICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaG9zdC5sYXlvdXQoMCwgMCwgaG9zdC5tTWVhc3VyZWRXaWR0aCwgaG9zdC5tTWVhc3VyZWRIZWlnaHQpOwpAQCAtMTE0Niw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnByb2ZpbGVMYXlvdXQpIHsKKyAgICAgICAgICAgIGlmIChWaWV3RGVidWcuREVCVUdfUFJPRklMRV9MQVlPVVQpIHsKICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDYwMDAxLCBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIHN0YXJ0VGltZSk7CiAgICAgICAgICAgICB9CiAKQEAgLTEzNDYsNyArMTIyMiw4IEBACiAgICAgICAgIGlmICghc0ZpcnN0RHJhd0NvbXBsZXRlKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNGaXJzdERyYXdIYW5kbGVycykgewogICAgICAgICAgICAgICAgIHNGaXJzdERyYXdDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHNGaXJzdERyYXdIYW5kbGVycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcG9zdChzRmlyc3REcmF3SGFuZGxlcnMuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMzgwLDUzICsxMjU3LDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChtVXNlR0wpIHsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwgJiYgbUh3UmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGlmICghZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG1HbENhbnZhczsKLSAgICAgICAgICAgICAgICBpZiAobUdMICE9IG51bGwgJiYgY2FudmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBtR0wuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgICAgICAgICAgbUdMLmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubURyYXdpbmdUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1JZ25vcmVEaXJ0eVN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZXcubVByaXZhdGVGbGFncyB8PSBWaWV3LkRSQVdOOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IudHJhbnNsYXRlQ2FudmFzKGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc2V0U2NyZWVuRGVuc2l0eShzY2FsaW5nUmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5ERUJVRyAmJiBWaWV3RGVidWcuY29uc2lzdGVuY3lDaGVja0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaENvbnNpc3RlbmN5Q2hlY2soVmlld0RlYnVnLkNPTlNJU1RFTkNZX0RSQVdJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5zaG93RnBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRyYXcobVZpZXcsIG1BdHRhY2hJbmZvLCB5b2ZmKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNjcm9sbGluZykgewogICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE0ODIsNyArMTMyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbnZhcy5kcmF3QVJHQigyNTUsIDI1NSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfRFJBV0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTUwOSw3ICsxMzQ5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWV0cmljcz0iICsgY3h0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjb21wYXRpYmlsaXR5SW5mbz0iICsgY3h0LmdldFJlc291cmNlcygpLmdldENvbXBhdGliaWxpdHlJbmZvKCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZShDYW52YXMuTUFUUklYX1NBVkVfRkxBRyk7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIC15b2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhbnNsYXRvciAhPSBudWxsKSB7CkBAIC0xNTIwLDE0ICsxMzU5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5kcmF3KGNhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSWdub3JlRGlydHlTdGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5jb25zaXN0ZW5jeUNoZWNrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hDb25zaXN0ZW5jeUNoZWNrKFZpZXdEZWJ1Zy5DT05TSVNURU5DWV9EUkFXSU5HKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0ZQUyB8fCBDb25maWcuREVCVUcgJiYgVmlld0RlYnVnLnNob3dGcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfRlBTIHx8IFZpZXdEZWJ1Zy5ERUJVR19TSE9XX0ZQUykgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdyA9IChpbnQpU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc0RyYXdUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVTaG93RlBTKGNhbnZhcywgbm93IC0gc0RyYXdUaW1lKTsKQEAgLTE1MzUsNyArMTM3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzRHJhd1RpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLkRFQlVHICYmIFZpZXdEZWJ1Zy5wcm9maWxlRHJhd2luZykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVmlld0RlYnVnLkRFQlVHX1BST0ZJTEVfRFJBV0lORykgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudCg2MDAwMCwgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBzdGFydFRpbWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTczOCw4ICsxNTc2LDYgQEAKICAgICB9CiAKICAgICB2b2lkIGRpc3BhdGNoRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZiAoQ29uZmlnLkxPR1YpIExvZy52KFRBRywgIkRldGFjaGluZyBpbiAiICsgdGhpcyArICIgb2YgIiArIG1TdXJmYWNlKTsKLQogICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVZpZXcuZGlzcGF0Y2hEZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICAgICAgfQpAQCAtMTc0OCw5ICsxNTg0LDEyIEBACiAgICAgICAgIG1BdHRhY2hJbmZvLm1Sb290VmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1TdXJmYWNlID0gbnVsbDsKIAotICAgICAgICBpZiAobVVzZUdMKSB7Ci0gICAgICAgICAgICBkZXN0cm95R0woKTsKKyAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Id1JlbmRlcmVyLmRlc3Ryb3kodHJ1ZSk7CisgICAgICAgICAgICBtSHdSZW5kZXJlciA9IG51bGw7CisgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFyZHdhcmVBY2NlbGVyYXRlZCA9IGZhbHNlOwogICAgICAgICB9CisKICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOwogCiAgICAgICAgIGlmIChtSW5wdXRDaGFubmVsICE9IG51bGwpIHsKQEAgLTE5MzMsMTggKzE3NzIsOCBAQAogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluVG91Y2hNb2RlID0gbXNnLmFyZzIgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlTG9jYWxseShpblRvdWNoTW9kZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvc3QgdGhlIGdsIGNvbnRleHQsIHNvIHJlY3JlYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbFdhbnRlZCAmJiAhbVVzZUdMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUdMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HbENhbnZhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcFNjYWxlID0gbUF0dGFjaEluZm8ubUFwcGxpY2F0aW9uU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1HbENhbnZhcy5zZXRWaWV3cG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobVdpZHRoICogYXBwU2NhbGUgKyAwLjVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAobUhlaWdodCAqIGFwcFNjYWxlICsgMC41ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1JlbmRlcmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Id1JlbmRlcmVyLmluaXRpYWxpemVJZk5lZWRlZChtV2lkdGgsIG1IZWlnaHQsIG1BdHRhY2hJbmZvLCBtSG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTk5NCw4ICsxODIzLDcgQEAKICAgICAgICAgICAgIGlmICgoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIElNRSBpcyB0cnlpbmcgdG8gc2F5IHRoaXMgZXZlbnQgaXMgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0hICBCYWQgYmFkIGJhZCEKLSAgICAgICAgICAgICAgICBldmVudCA9IEtleUV2ZW50LmNoYW5nZUZsYWdzKGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RmxhZ3MoKSZ+S2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSk7CisgICAgICAgICAgICAgICAgZXZlbnQgPSBLZXlFdmVudC5jaGFuZ2VGbGFncyhldmVudCwgZXZlbnQuZ2V0RmxhZ3MoKSAmIH5LZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeSgoS2V5RXZlbnQpbXNnLm9iaiwgZmFsc2UpOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjQ4Myw4ICsyMzExLDcgQEAKICAgICBwcml2YXRlIHZvaWQgZGVsaXZlcktleUV2ZW50KEtleUV2ZW50IGV2ZW50LCBib29sZWFuIHNlbmREb25lKSB7CiAgICAgICAgIC8vIElmIG1WaWV3IGlzIG51bGwsIHdlIGp1c3QgY29uc3VtZSB0aGUga2V5IGV2ZW50IGJlY2F1c2UgaXQgZG9lc24ndAogICAgICAgICAvLyBtYWtlIHNlbnNlIHRvIGRvIGFueXRoaW5nIGVsc2Ugd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gbVZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgID8gbVZpZXcuZGlzcGF0Y2hLZXlFdmVudFByZUltZShldmVudCkgOiB0cnVlOworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBtVmlldyA9PSBudWxsIHx8IG1WaWV3LmRpc3BhdGNoS2V5RXZlbnRQcmVJbWUoZXZlbnQpOwogICAgICAgICBpZiAoaGFuZGxlZCkgewogICAgICAgICAgICAgaWYgKHNlbmREb25lKSB7CiAgICAgICAgICAgICAgICAgZmluaXNoS2V5RXZlbnQoZXZlbnQpOwpAQCAtMjUxNiw3ICsyMzQzLDYgQEAKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VuZERvbmUgPSBzZXEgPj0gMDsKICAgICAgICAgICAgIGlmICghaGFuZGxlZCkgewogICAgICAgICAgICAgICAgIGRlbGl2ZXJLZXlFdmVudFRvVmlld0hpZXJhcmNoeShldmVudCwgc2VuZERvbmUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZERvbmUpIHsKICAgICAgICAgICAgICAgICBmaW5pc2hLZXlFdmVudChldmVudCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjcxMyw3ICsyNTM5LDcgQEAKIAogICAgIHZvaWQgZG9EaWUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7Ci0gICAgICAgIGlmIChDb25maWcuTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOworICAgICAgICBpZiAoTE9DQUxfTE9HVikgTG9nLnYoVEFHLCAiRElFIGluICIgKyB0aGlzICsgIiBvZiAiICsgbVN1cmZhY2UpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChtQWRkZWQgJiYgIW1GaXJzdCkgewogICAgICAgICAgICAgICAgIGludCB2aWV3VmlzaWJpbGl0eSA9IG1WaWV3LmdldFZpc2liaWxpdHkoKTsKQEAgLTI3OTksMTMgKzI2MjUsMTIgQEAKICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCiAgICAgICAgIGlmIChmYWxzZSAmJiBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgaWYgKGV2ZW50LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5LRVlDT0RFX0NBTUVSQSkgewotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLCAiRm9jdXNlZCB2aWV3IEhpZXJhcmNoeSBpczoiKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZCgia2V5ZGlzcCIsICJGb2N1c2VkIHZpZXcgSGllcmFyY2h5IGlzOiIpOworCiAgICAgICAgICAgICAgICAgZGVidWcoKTsKIAotICAgICAgICAgICAgICAgIGlmIChDb25maWcuTE9HRCkgTG9nLmQoImtleWRpc3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKCJrZXlkaXNwIiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4ODgsMTYgKzI3MTMsMTYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgb3JpZ2luYWxWaWV3LCBBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUpIHsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjaGlsZERyYXdhYmxlU3RhdGVDaGFuZ2VkKFZpZXcgY2hpbGQpIHsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgUmVjdCBnZXRXaW5kb3dGcmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1XaW5GcmFtZTsKLSAgICB9Ci0KICAgICB2b2lkIGNoZWNrVGhyZWFkKCkgewogICAgICAgICBpZiAobVRocmVhZCAhPSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ2FsbGVkRnJvbVdyb25nVGhyZWFkRXhjZXB0aW9uKApAQCAtMjk3NiwxNiArMjgwMSwxNSBAQAogICAgIHN0YXRpYyBjbGFzcyBXIGV4dGVuZHMgSVdpbmRvdy5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXdSb290PiBtVmlld1Jvb3Q7CiAKLSAgICAgICAgcHVibGljIFcoVmlld1Jvb3Qgdmlld1Jvb3QsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBXKFZpZXdSb290IHZpZXdSb290KSB7CiAgICAgICAgICAgICBtVmlld1Jvb3QgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3Um9vdD4odmlld1Jvb3QpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICBSZWN0IHZpc2libGVJbnNldHMsIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcmVzaXplZChpbnQgdywgaW50IGgsIFJlY3QgY292ZXJlZEluc2V0cywgUmVjdCB2aXNpYmxlSW5zZXRzLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwb3J0RHJhdywgQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKICAgICAgICAgICAgIGZpbmFsIFZpZXdSb290IHZpZXdSb290ID0gbVZpZXdSb290LmdldCgpOwogICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CisgICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hSZXNpemVkKHcsIGgsIGNvdmVyZWRJbnNldHMsIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzM4OCw4ICszMjEyLDQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTaG93RlBTKENhbnZhcyBjYW52YXMsIGludCBkdXJhdGlvbk1pbGxpcyk7Ci0KLSAgICAvLyBpbmZvcm0gc2tpYSB0byBqdXN0IGFiYW5kb24gaXRzIHRleHR1cmUgY2FjaGUgSURzCi0gICAgLy8gZG9lc24ndCBjYWxsIGdsRGVsZXRlVGV4dHVyZXMKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVBYmFuZG9uR2xDYWNoZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCmluZGV4IDExYzA5YzEuLjY2MzMzNjcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQpAQCAtNTYsMTEgKzU2LDMyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9DT05URVhUX01FTlUgPSA2OwogICAgIC8qKiBGbGFnIGZvciBjdXN0b20gdGl0bGUuIFlvdSBjYW5ub3QgY29tYmluZSB0aGlzIGZlYXR1cmUgd2l0aCBvdGhlciB0aXRsZSBmZWF0dXJlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0NVU1RPTV9USVRMRSA9IDc7Ci0gICAgLyoqIEZsYWcgZm9yIGFza2luZyBmb3IgYW4gT3BlbkdMIGVuYWJsZWQgd2luZG93LgotICAgICAgICBBbGwgMkQgZ3JhcGhpY3Mgd2lsbCBiZSBoYW5kbGVkIGJ5IE9wZW5HTCBFUy4KLSAgICAgICAgQGhpZGUKLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfT1BFTkdMID0gODsKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciBlbmFibGluZyB0aGUgQWN0aW9uIEJhci4KKyAgICAgKiBUaGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3Igc29tZSBkZXZpY2VzLiBUaGUgQWN0aW9uIEJhcgorICAgICAqIHJlcGxhY2VzIHRoZSB0aXRsZSBiYXIgYW5kIHByb3ZpZGVzIGFuIGFsdGVybmF0ZSBsb2NhdGlvbgorICAgICAqIGZvciBhbiBvbi1zY3JlZW4gbWVudSBidXR0b24gb24gc29tZSBkZXZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfQUNUSU9OX0JBUiA9IDg7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyBhbiBBY3Rpb24gQmFyIHRoYXQgb3ZlcmxheXMgd2luZG93IGNvbnRlbnQuCisgICAgICogTm9ybWFsbHkgYW4gQWN0aW9uIEJhciB3aWxsIHNpdCBpbiB0aGUgc3BhY2UgYWJvdmUgd2luZG93IGNvbnRlbnQsIGJ1dCBpZiB0aGlzCisgICAgICogZmVhdHVyZSBpcyByZXF1ZXN0ZWQgYWxvbmcgd2l0aCB7QGxpbmsgI0ZFQVRVUkVfQUNUSU9OX0JBUn0gaXQgd2lsbCBiZSBsYXllcmVkIG92ZXIKKyAgICAgKiB0aGUgd2luZG93IGNvbnRlbnQgaXRzZWxmLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB5b3VyIGFwcCB0byBoYXZlIG1vcmUgY29udHJvbAorICAgICAqIG92ZXIgaG93IHRoZSBBY3Rpb24gQmFyIGlzIGRpc3BsYXllZCwgc3VjaCBhcyBsZXR0aW5nIGFwcGxpY2F0aW9uIGNvbnRlbnQgc2Nyb2xsIGJlbmVhdGgKKyAgICAgKiBhbiBBY3Rpb24gQmFyIHdpdGggYSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIG9yIG90aGVyd2lzZSBkaXNwbGF5aW5nIGEgdHJhbnNwYXJlbnQvdHJhbnNsdWNlbnQKKyAgICAgKiBBY3Rpb24gQmFyIG92ZXIgYXBwbGljYXRpb24gY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0FDVElPTl9CQVJfT1ZFUkxBWSA9IDk7CisgICAgLyoqCisgICAgICogRmxhZyBmb3Igc3BlY2lmeWluZyB0aGUgYmVoYXZpb3Igb2YgYWN0aW9uIG1vZGVzIHdoZW4gYW4gQWN0aW9uIEJhciBpcyBub3QgcHJlc2VudC4KKyAgICAgKiBJZiBvdmVybGF5IGlzIGVuYWJsZWQsIHRoZSBhY3Rpb24gbW9kZSBVSSB3aWxsIGJlIGFsbG93ZWQgdG8gY292ZXIgZXhpc3Rpbmcgd2luZG93IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9BQ1RJT05fTU9ERV9PVkVSTEFZID0gMTA7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgcmVxdWVzdGluZyB0aGlzIHdpbmRvdyB0byBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZCwgaWYgcG9zc2libGUuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfSEFSRFdBUkVfQUNDRUxFUkFURUQgPSAxMTsKICAgICAvKiogRmxhZyBmb3Igc2V0dGluZyB0aGUgcHJvZ3Jlc3MgYmFyJ3MgdmlzaWJpbGl0eSB0byBWSVNJQkxFICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfVklTSUJJTElUWV9PTiA9IC0xOwogICAgIC8qKiBGbGFnIGZvciBzZXR0aW5nIHRoZSBwcm9ncmVzcyBiYXIncyB2aXNpYmlsaXR5IHRvIEdPTkUgKi8KQEAgLTEwOSw2ICsxMzAsOCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNTb2Z0SW5wdXRNb2RlID0gZmFsc2U7CiAgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CisKICAgICAvLyBUaGUgY3VycmVudCB3aW5kb3cgYXR0cmlidXRlcy4KICAgICBwcml2YXRlIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1XaW5kb3dBdHRyaWJ1dGVzID0KICAgICAgICAgbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKCk7CkBAIC0yOTIsNiArMzE1LDE0IEBACiAgICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25TZWFyY2hSZXF1ZXN0ZWQoKSAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2VhcmNoUmVxdWVzdGVkKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGFuIGFjdGlvbiBtb2RlIGlzIGJlaW5nIHN0YXJ0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayB0byBjb250cm9sIHRoZSBsaWZlY3ljbGUgb2YgdGhpcyBhY3Rpb24gbW9kZQorICAgICAgICAgKiBAcmV0dXJuIFRoZSBBY3Rpb25Nb2RlIHRoYXQgd2FzIHN0YXJ0ZWQsIG9yIG51bGwgaWYgaXQgd2FzIGNhbmNlbGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQWN0aW9uTW9kZSBvblN0YXJ0QWN0aW9uTW9kZShBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgV2luZG93KENvbnRleHQgY29udGV4dCkgewpAQCAtMzUzLDYgKzM4NCwxNiBAQAogICAgICAgICByZXR1cm4gbUhhc0NoaWxkcmVuOwogICAgIH0KICAgICAKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZXN0cm95ZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB3aW5kb3cgbWFuYWdlciBmb3IgdXNlIGJ5IHRoaXMgV2luZG93IHRvLCBmb3IgZXhhbXBsZSwKICAgICAgKiBkaXNwbGF5IHBhbmVscy4gIFRoaXMgaXMgPGVtPm5vdDwvZW0+IHVzZWQgZm9yIGRpc3BsYXlpbmcgdGhlCkBAIC0zNjAsMjEgKzQwMSwzNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHdtIFRoZSBWaWV3TWFuYWdlciBmb3IgYWRkaW5nIG5ldyB3aW5kb3dzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwKLSAgICAgICAgICAgIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lKSB7CisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtLCBJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgYXBwTmFtZSkgeworICAgICAgICBzZXRXaW5kb3dNYW5hZ2VyKHdtLCBhcHBUb2tlbiwgYXBwTmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2luZG93IG1hbmFnZXIgZm9yIHVzZSBieSB0aGlzIFdpbmRvdyB0bywgZm9yIGV4YW1wbGUsCisgICAgICogZGlzcGxheSBwYW5lbHMuICBUaGlzIGlzIDxlbT5ub3Q8L2VtPiB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZQorICAgICAqIFdpbmRvdyBpdHNlbGYgLS0gdGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3bSBUaGUgVmlld01hbmFnZXIgZm9yIGFkZGluZyBuZXcgd2luZG93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBhcHBOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgIG1BcHBUb2tlbiA9IGFwcFRva2VuOwogICAgICAgICBtQXBwTmFtZSA9IGFwcE5hbWU7CiAgICAgICAgIGlmICh3bSA9PSBudWxsKSB7CiAgICAgICAgICAgICB3bSA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKTsKICAgICAgICAgfQotICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20pOworICAgICAgICBtV2luZG93TWFuYWdlciA9IG5ldyBMb2NhbFdpbmRvd01hbmFnZXIod20sIGhhcmR3YXJlQWNjZWxlcmF0ZWQpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxXaW5kb3dNYW5hZ2VyIGltcGxlbWVudHMgV2luZG93TWFuYWdlciB7Ci0gICAgICAgIExvY2FsV2luZG93TWFuYWdlcihXaW5kb3dNYW5hZ2VyIHdtKSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGFyZHdhcmVBY2NlbGVyYXRlZDsKKworICAgICAgICBMb2NhbFdpbmRvd01hbmFnZXIoV2luZG93TWFuYWdlciB3bSwgYm9vbGVhbiBoYXJkd2FyZUFjY2VsZXJhdGVkKSB7CiAgICAgICAgICAgICBtV2luZG93TWFuYWdlciA9IHdtOwogICAgICAgICAgICAgbURlZmF1bHREaXNwbGF5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGVmYXVsdERpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkpOworICAgICAgICAgICAgbUhhcmR3YXJlQWNjZWxlcmF0ZWQgPSBoYXJkd2FyZUFjY2VsZXJhdGVkOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKSB7CkBAIC00MjEsNiArNDc2LDkgQEAKICAgICAgICAgICAgIGlmICh3cC5wYWNrYWdlTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd3AucGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1IYXJkd2FyZUFjY2VsZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgd3AuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zKTsKICAgICAgICAgfQogCkBAIC03MTMsNiArNzcxLDE1IEBACiAgICAgICAgIHJldHVybiAobUZlYXR1cmVzJmZsYWcpICE9IDA7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUgVXNlZCBpbnRlcm5hbGx5IHRvIGhlbHAgcmVzb2x2ZSBjb25mbGljdGluZyBmZWF0dXJlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVGZWF0dXJlKGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgZmluYWwgaW50IGZsYWcgPSAxPDxmZWF0dXJlSWQ7CisgICAgICAgIG1GZWF0dXJlcyAmPSB+ZmxhZzsKKyAgICAgICAgbUxvY2FsRmVhdHVyZXMgJj0gfihtQ29udGFpbmVyICE9IG51bGwgPyAoZmxhZyZ+bUNvbnRhaW5lci5tRmVhdHVyZXMpIDogZmxhZyk7CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgbWFrZUFjdGl2ZSgpIHsKICAgICAgICAgaWYgKG1Db250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1Db250YWluZXIubUFjdGl2ZUNoaWxkICE9IG51bGwpIHsKQEAgLTgxNyw2ICs4ODQsOCBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdG9nZ2xlUGFuZWwoaW50IGZlYXR1cmVJZCwgS2V5RXZlbnQgZXZlbnQpOwogCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52YWxpZGF0ZVBhbmVsTWVudShpbnQgZmVhdHVyZUlkKTsKKyAgICAKICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwZXJmb3JtUGFuZWxTaG9ydGN1dChpbnQgZmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50IGV2ZW50LApAQCAtOTk2LDYgKzEwNjUsMTYgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtRmVhdHVyZXM7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgY2VydGFpbiBmZWF0dXJlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlIElEIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKGludCBmZWF0dXJlKSB7CisgICAgICAgIHJldHVybiAoZ2V0RmVhdHVyZXMoKSAmICgxIDw8IGZlYXR1cmUpKSAhPSAwOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgZmVhdHVyZSBiaXRzIHRoYXQgYXJlIGJlaW5nIGltcGxlbWVudGVkIGJ5IHRoaXMgV2luZG93LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQppbmRleCBlZWJiYzkzLi5jMTQ3Yjc0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YQpAQCAtNzIsNiArNzIsNyBAQAogICAgICAgICAgKiBXaGVuIHVzaW5nIHtAbGluayBHcmF2aXR5I0xFRlR9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBpdCBwcm92aWRlcwogICAgICAgICAgKiBhbiBvZmZzZXQgZnJvbSB0aGUgZ2l2ZW4gZWRnZS4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgaW50IHg7CiAgICAgICAgIAogICAgICAgICAvKioKQEAgLTc5LDYgKzgwLDcgQEAKICAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNUT1B9IG9yIHtAbGluayBHcmF2aXR5I0JPVFRPTX0gaXQgcHJvdmlkZXMKICAgICAgICAgICogYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGludCB5OwogCiAgICAgICAgIC8qKgpAQCAtODcsNiArODksNyBAQAogICAgICAgICAgKiBzaG91bGQgbm90IGJlIHN0cmV0Y2hlZC4gT3RoZXJ3aXNlIHRoZSBleHRyYSBwaXhlbHMgd2lsbCBiZSBwcm8tcmF0ZWQKICAgICAgICAgICogYW1vbmcgYWxsIHZpZXdzIHdob3NlIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gMC4KICAgICAgICAgICovCisgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQogICAgICAgICBwdWJsaWMgZmxvYXQgaG9yaXpvbnRhbFdlaWdodDsKIAogICAgICAgICAvKioKQEAgLTk1LDggKzk4LDkgQEAKICAgICAgICAgICogc2hvdWxkIG5vdCBiZSBzdHJldGNoZWQuIE90aGVyd2lzZSB0aGUgZXh0cmEgcGl4ZWxzIHdpbGwgYmUgcHJvLXJhdGVkCiAgICAgICAgICAqIGFtb25nIGFsbCB2aWV3cyB3aG9zZSB3ZWlnaHQgaXMgZ3JlYXRlciB0aGFuIDAuCiAgICAgICAgICAqLworICAgICAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKICAgICAgICAgcHVibGljIGZsb2F0IHZlcnRpY2FsV2VpZ2h0OwotICAgICAgICAKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGdlbmVyYWwgdHlwZSBvZiB3aW5kb3cuICBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjbGFzc2VzIG9mCiAgICAgICAgICAqIHdpbmRvdyB0eXBlczoKQEAgLTM4OSw2ICszOTMsNyBAQAogICAgICAgICAgKiBAc2VlICNGTEFHX0ZVTExTQ1JFRU4KICAgICAgICAgICogQHNlZSAjRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTgogICAgICAgICAgKiBAc2VlICNGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTCisgICAgICAgICAqIEBzZWUgI0ZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQKICAgICAgICAgICovCiAgICAgICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShmbGFnTWFwcGluZyA9IHsKICAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBGTEFHX0JMVVJfQkVISU5ELCBlcXVhbHMgPSBGTEFHX0JMVVJfQkVISU5ELApAQCAtNDIwLDcgKzQyNSw5IEBACiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwKICAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19GT1JDRV9OT1RfRlVMTFNDUkVFTiwgbmFtZSA9ICJGTEFHX0ZPUkNFX05PVF9GVUxMU0NSRUVOIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywKLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIikKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19JR05PUkVfQ0hFRUtfUFJFU1NFUywgbmFtZSA9ICJGTEFHX0lHTk9SRV9DSEVFS19QUkVTU0VTIiksCisgICAgICAgICAgICBAVmlld0RlYnVnLkZsYWdUb1N0cmluZyhtYXNrID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCwgbmFtZSA9ICJGTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVEIikKICAgICAgICAgfSkKICAgICAgICAgcHVibGljIGludCBmbGFnczsKICAgICAgICAgCkBAIC02MDMsNiArNjEwLDEyIEBACiAgICAgICAgICAqIGl0IGlzIGNyZWF0ZWQuCiAgICAgICAgICAqIHtAaGlkZX0gKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TWVNURU1fRVJST1IgPSAweDQwMDAwMDAwOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgd2luZG93IHNob3VsZCBiZSBoYXJkd2FyZSBhY2NlbGVyYXRlZC4KKyAgICAgICAgICogUmVxdWVzdGluZyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZG9lcyBub3QgZ3VhcmFudGVlIGl0IHdpbGwgaGFwcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4ODAwMDAwMDA7ICAgICAgICAKIAogICAgICAgICAvKioKICAgICAgICAgICogR2l2ZW4gYSBwYXJ0aWN1bGFyIHNldCBvZiB3aW5kb3cgbWFuYWdlciBmbGFncywgZGV0ZXJtaW5lIHdoZXRoZXIKQEAgLTEwNzUsNiArMTA4OCw3IEBACiAgICAgICAgICAgICAgICAgc2NyZWVuT3JpZW50YXRpb24gPSBvLnNjcmVlbk9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gU0NSRUVOX09SSUVOVEFUSU9OX0NIQU5HRUQ7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCmluZGV4IDAxODYyNzAuLmY0MDZkYTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlci5qYXZhCkBAIC05NCw3ICs5NCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5TWFuYWdlciBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VTeW5jKSB7CiAgICAgICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCk7CisgICAgICAgICAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UgPSBJQWNjZXNzaWJpbGl0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShpQmluZGVyKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIoY29udGV4dCwgc2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKQEAgLTEwNCwxMyArMTA2LDE2IEBACiAgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSB7QGxpbmsgQ29udGV4dH0uCisgICAgICogQHBhcmFtIHNlcnZpY2UgQW4gaW50ZXJmYWNlIHRvIHRoZSBiYWNraW5nIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIHNlcnZpY2UpIHsKICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKGNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKLSAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoaUJpbmRlcik7CisgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKKwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgbUlzRW5hYmxlZCA9IG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CiAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlIGlzIGRlYWQiLCByZSk7CiAgICAgICAgIH0KQEAgLTEyOCw2ICsxMzMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgaW50ZXJmYWNlIHRoaXMgaW5zdGFuY2UgcmVnaXN0ZXJzIGluCisgICAgICogdGhlIGNlbnRyYWxpemVkIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xpZW50LgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICByZXR1cm4gKElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCkgbUNsaWVudC5hc0JpbmRlcigpOyAKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fS4gSWYgdGhpcyB7QGxpbmsgQWNjZXNzaWJpbGl0eU1hbmFnZXJ9IGlzIG5vdAogICAgICAqIGVuYWJsZWQgdGhlIGNhbGwgaXMgYSBOT09QLgogICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggMzI3ODhiZS4uNzYzMzU2OWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKQEAgLTI5LDcgKzI5LDcgQEAKICAqLwogaW50ZXJmYWNlIElBY2Nlc3NpYmlsaXR5TWFuYWdlciB7CiAKLSAgICB2b2lkIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKKyAgICBib29sZWFuIGFkZENsaWVudChJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgY2xpZW50KTsKIAogICAgIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChpbiBBY2Nlc3NpYmlsaXR5RXZlbnQgdWlFdmVudCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKaW5kZXggMzQ5YjdlNS4uOWExZTQxYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uLmphdmEKQEAgLTE3NCw3ICsxNzQsMTMgQEAKICAgICAgKiBEZXNpcmVkIFogb3JkZXIgbW9kZSBkdXJpbmcgYW5pbWF0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1aQWRqdXN0bWVudDsKLSAgICAKKworICAgIC8qKgorICAgICAqIHNjYWxlZmFjdG9yIHRvIGFwcGx5IHRvIHBpdm90IHBvaW50cywgZXRjLiBkdXJpbmcgYW5pbWF0aW9uLiBTdWJjbGFzc2VzIHJldHJpZXZlIHRoZQorICAgICAqIHZhbHVlIHZpYSBnZXRTY2FsZUZhY3RvcigpLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVNjYWxlRmFjdG9yID0gMWY7CisKICAgICAvKioKICAgICAgKiBEb24ndCBhbmltYXRlIHRoZSB3YWxscGFwZXIuCiAgICAgICovCkBAIC0zMDEsNyArMzA3LDcgQEAKICAgICAgKiBhbmltYXRlZCBhcyB3ZWxsIGFzIHRoZSBvYmplY3RzIHBhcmVudHMuIChUaGlzIGlzIHRvIHN1cHBvcnQgYW5pbWF0aW9uCiAgICAgICogc2l6ZXMgYmVpbmcgc3BlY2lmZWQgcmVsYXRpdmUgdG8gdGhlc2UgZGltZW5zaW9ucy4pCiAgICAgICoKLSAgICAgKiA8cD5PYmplY3RzIHRoYXQgaW50ZXJwcmV0IGEgQW5pbWF0aW9ucyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuCisgICAgICogPHA+T2JqZWN0cyB0aGF0IGludGVycHJldCBBbmltYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4KICAgICAgKiB0aGUgc2l6ZXMgb2YgdGhlIG9iamVjdCBiZWluZyBhbmltYXRlZCBhbmQgaXRzIHBhcmVudCBhcmUga25vd24sIGFuZAogICAgICAqIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb259LgogICAgICAqCkBAIC01NTMsNiArNTU5LDE5IEBACiAgICAgfQogICAgIAogICAgIC8qKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3IgaXMgc2V0IGJ5IHRoZSBjYWxsIHRvIDxjb2RlPmdldFRyYW5zZm9ybWF0aW9uPC9jb2RlPi4gT3ZlcnJpZGVzIG9mIAorICAgICAqIHtAbGluayAjZ2V0VHJhbnNmb3JtYXRpb24obG9uZywgVHJhbnNmb3JtYXRpb24sIGZsb2F0KX0gd2lsbCBnZXQgdGhpcyB2YWx1ZQorICAgICAqIGRpcmVjdGx5LiBPdmVycmlkZXMgb2Yge0BsaW5rICNhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0LCBUcmFuc2Zvcm1hdGlvbil9IGNhbgorICAgICAqIGNhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGZsb2F0IFRoZSBzY2FsZSBmYWN0b3IgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBwcmUtc2NhbGVkIHZhbHVlcyBpbgorICAgICAqIGFuIEFuaW1hdGlvbiBzdWNoIGFzIHRoZSBwaXZvdCBwb2ludHMgaW4ge0BsaW5rIFNjYWxlQW5pbWF0aW9ufSBhbmQge0BsaW5rIFJvdGF0ZUFuaW1hdGlvbn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZsb2F0IGdldFNjYWxlRmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRmFjdG9yOworICAgIH0KKworICAgIC8qKgogICAgICAqIElmIGRldGFjaFdhbGxwYXBlciBpcyB0cnVlLCBhbmQgdGhpcyBpcyBhIHdpbmRvdyBhbmltYXRpb24gb2YgYSB3aW5kb3cKICAgICAgKiB0aGF0IGhhcyBhIHdhbGxwYXBlciBiYWNrZ3JvdW5kLCB0aGVuIHRoZSB3aW5kb3cgd2lsbCBiZSBkZXRhY2hlZCBmcm9tCiAgICAgICogdGhlIHdhbGxwYXBlciB3aGlsZSBpdCBydW5zLiAgVGhhdCBpcywgdGhlIGFuaW1hdGlvbiB3aWxsIG9ubHkgYmUgYXBwbGllZApAQCAtNzM1LDYgKzc1NCw3IEBACiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaXMgc3RpbGwgcnVubmluZwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldFRyYW5zZm9ybWF0aW9uKGxvbmcgY3VycmVudFRpbWUsIFRyYW5zZm9ybWF0aW9uIG91dFRyYW5zZm9ybWF0aW9uKSB7CisKICAgICAgICAgaWYgKG1TdGFydFRpbWUgPT0gLTEpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgICAgfQpAQCAtODA2LDYgKzgyNiwyNCBAQAogCiAgICAgICAgIHJldHVybiBtTW9yZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8gYXBwbHkgYXQgYSBzcGVjaWZpZWQgcG9pbnQgaW4gdGltZS4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMKKyAgICAgKiBtZXRob2Qgc2hvdWxkIGFsd2F5cyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgVHJhbnNmb3JtYXRpb24gb3IgZG9jdW1lbnQgdGhleSBhcmUgZG9pbmcKKyAgICAgKiBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgV2hlcmUgd2UgYXJlIGluIHRoZSBhbmltYXRpb24uIFRoaXMgaXMgd2FsbCBjbG9jayB0aW1lLgorICAgICAqIEBwYXJhbSBvdXRUcmFuc2Zvcm1hdGlvbiBBIHRyYW5mb3JtYXRpb24gb2JqZWN0IHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgICogICAgICAgIGNhbGxlciBhbmQgd2lsbCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFuaW1hdGlvbi4KKyAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGluZyBmYWN0b3IgdG8gYXBwbHkgdG8gYW55IGlucHV0cyB0byB0aGUgdHJhbnNmb3JtIG9wZXJhdGlvbiwgc3VjaAorICAgICAqICAgICAgICBwaXZvdCBwb2ludHMgYmVpbmcgcm90YXRlZCBvciBzY2FsZWQgYXJvdW5kLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2Zvcm1hdGlvbihsb25nIGN1cnJlbnRUaW1lLCBUcmFuc2Zvcm1hdGlvbiBvdXRUcmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlKSB7CisgICAgICAgIG1TY2FsZUZhY3RvciA9IHNjYWxlOworICAgICAgICByZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb24oY3VycmVudFRpbWUsIG91dFRyYW5zZm9ybWF0aW9uKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiA8cD5JbmRpY2F0ZXMgd2hldGhlciB0aGlzIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCBvciBub3QuPC9wPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uU2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQppbmRleCAxNTQ2ZGNkLi44NzNjZTUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25TZXQuamF2YQpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgICAgICAgICBmaW5hbCBBbmltYXRpb24gYSA9IGFuaW1hdGlvbnMuZ2V0KGkpOwogCiAgICAgICAgICAgICB0ZW1wLmNsZWFyKCk7Ci0gICAgICAgICAgICBtb3JlID0gYS5nZXRUcmFuc2Zvcm1hdGlvbihjdXJyZW50VGltZSwgdGVtcCkgfHwgbW9yZTsKKyAgICAgICAgICAgIG1vcmUgPSBhLmdldFRyYW5zZm9ybWF0aW9uKGN1cnJlbnRUaW1lLCB0ZW1wLCBnZXRTY2FsZUZhY3RvcigpKSB8fCBtb3JlOwogICAgICAgICAgICAgdC5jb21wb3NlKHRlbXApOwogCiAgICAgICAgICAgICBzdGFydGVkID0gc3RhcnRlZCB8fCBhLmhhc1N0YXJ0ZWQoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9BbmltYXRpb25VdGlscy5qYXZhCmluZGV4IDMwODgzODIuLjMyZmY2NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL0FuaW1hdGlvblV0aWxzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vQW5pbWF0aW9uVXRpbHMuamF2YQpAQCAtMzMsNiArMzMsMTQgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBBbmltYXRpb25VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB3aGVuIHBhcnNpbmcgQW5pbWF0b3JTZXQgb2JqZWN0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0dFVEhFUiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUVVFTlRJQUxMWSA9IDE7CisKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHRpbWUgc2hvdWxkIGJlIHVzZWQgd2hlbiBpbnZva2luZwogICAgICAqIHtAbGluayBBbmltYXRpb24jc2V0U3RhcnRUaW1lKGxvbmcpfS4gUmVmZXIgdG8ge0BsaW5rIGFuZHJvaWQub3MuU3lzdGVtQ2xvY2t9IGZvciBtb3JlCkBAIC00OSw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBMb2FkcyBhbiB7QGxpbmsgQW5pbWF0aW9ufSBvYmplY3QgZnJvbSBhIHJlc291cmNlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCBBcHBsaWNhdGlvbiBjb250ZXh0IHVzZWQgdG8gYWNjZXNzIHJlc291cmNlcwogICAgICAqIEBwYXJhbSBpZCBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIGFuaW1hdGlvbiB0byBsb2FkCiAgICAgICogQHJldHVybiBUaGUgYW5pbWF0aW9uIG9iamVjdCByZWZlcmVuY2UgYnkgdGhlIHNwZWNpZmllZCBpZApAQCAtODIsMTIgKzkwLDEyIEBACiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCBudWxsLCBYbWwuYXNBdHRyaWJ1dGVTZXQocGFyc2VyKSk7CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQW5pbWF0aW9uIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoQ29udGV4dCBjLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwKICAgICAgICAgICAgIEFuaW1hdGlvblNldCBwYXJlbnQsIEF0dHJpYnV0ZVNldCBhdHRycykgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCisKICAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBudWxsOwotIAorCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgb24gYSBzdGFydCB0YWcuCiAgICAgICAgIGludCB0eXBlOwogICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKQEAgLTEwMCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgIAorCiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNldCIpKSB7CiAgICAgICAgICAgICAgICAgYW5pbSA9IG5ldyBBbmltYXRpb25TZXQoYywgYXR0cnMpOwogICAgICAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbkZyb21YbWwoYywgcGFyc2VyLCAoQW5pbWF0aW9uU2V0KWFuaW0sIGF0dHJzKTsKQEAgLTEyMCw3ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgIHBhcmVudC5hZGRBbmltYXRpb24oYW5pbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICByZXR1cm4gYW5pbTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1JvdGF0ZUFuaW1hdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKaW5kZXggMjg0Y2NjZS4uNThiZjA4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vUm90YXRlQW5pbWF0aW9uLmphdmEKQEAgLTE0OCwxMSArMTQ4LDEyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IGRlZ3JlZXMgPSBtRnJvbURlZ3JlZXMgKyAoKG1Ub0RlZ3JlZXMgLSBtRnJvbURlZ3JlZXMpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0KKyAgICAgICAgZmxvYXQgc2NhbGUgPSBnZXRTY2FsZUZhY3RvcigpOworICAgICAgICAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMC4wZiAmJiBtUGl2b3RZID09IDAuMGYpIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0Um90YXRlKGRlZ3JlZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdC5nZXRNYXRyaXgoKS5zZXRSb3RhdGUoZGVncmVlcywgbVBpdm90WCwgbVBpdm90WSk7CisgICAgICAgICAgICB0LmdldE1hdHJpeCgpLnNldFJvdGF0ZShkZWdyZWVzLCBtUGl2b3RYICogc2NhbGUsIG1QaXZvdFkgKiBzY2FsZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FuaW1hdGlvbi9TY2FsZUFuaW1hdGlvbi5qYXZhCmluZGV4IDFhNTZjOGIuLjg1MzdkNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYW5pbWF0aW9uL1NjYWxlQW5pbWF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hbmltYXRpb24vU2NhbGVBbmltYXRpb24uamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7CiAgICAgICAgIGZsb2F0IHN4ID0gMS4wZjsKICAgICAgICAgZmxvYXQgc3kgPSAxLjBmOworICAgICAgICBmbG9hdCBzY2FsZSA9IGdldFNjYWxlRmFjdG9yKCk7CiAKICAgICAgICAgaWYgKG1Gcm9tWCAhPSAxLjBmIHx8IG1Ub1ggIT0gMS4wZikgewogICAgICAgICAgICAgc3ggPSBtRnJvbVggKyAoKG1Ub1ggLSBtRnJvbVgpICogaW50ZXJwb2xhdGVkVGltZSk7CkBAIC0xNzIsNyArMTczLDcgQEAKICAgICAgICAgaWYgKG1QaXZvdFggPT0gMCAmJiBtUGl2b3RZID09IDApIHsKICAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBtUGl2b3RYLCBtUGl2b3RZKTsKKyAgICAgICAgICAgIHQuZ2V0TWF0cml4KCkuc2V0U2NhbGUoc3gsIHN5LCBzY2FsZSAqIG1QaXZvdFgsIHNjYWxlICogbVBpdm90WSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCmluZGV4IDM1N2NiNWZlLi42OGUyMzFjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgpAQCAtNjgsNyArNjksMTA4IEBACiAgICAgICogY2FuIGNoYW5nZSBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiAoaW4gcGFydGljdWxhciBsb2NhbGUpLgogICAgICAqLwogICAgIGZpbmFsIGludCBtSXNEZWZhdWx0UmVzSWQ7Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBJbnB1dE1ldGhvZFN1YnR5cGUgaXMgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQgbWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZQorICAgICAqIGxvY2FsZXMgKGUuZy4gZW5fVVMsIGZyX0ZSLi4uKSBhbmQgbW9kZXMgKGUuZy4gdm9pY2UsIGtleWJvYXJkLi4uKSwgYW5kIGlzIHVzZWQgZm9yCisgICAgICogSU1FIHN3aXRjaC4gVGhlIHN1YnR5cGUgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY2FsbCB0aGUgc3BlY2lmaWVkIHN1YnR5cGUgb2YgSU1FIGRpcmVjdGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRNZXRob2RTdWJ0eXBlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlTG9jYWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3VidHlwZU1vZGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TdWJ0eXBlRXh0cmFWYWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCisgICAgICAgICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAgICAgKiBAcGFyYW0gZXh0cmFWYWx1ZSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIElucHV0TWV0aG9kU3VidHlwZShTdHJpbmcgbmFtZSwgaW50IGljb25JZCwgU3RyaW5nIGxvY2FsZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICAgICAgICAgIG1TdWJ0eXBlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtU3VidHlwZUljb25JZCA9IGljb25JZDsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gbG9jYWxlOworICAgICAgICAgICAgbVN1YnR5cGVNb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IGV4dHJhVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dE1ldGhvZFN1YnR5cGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlSWNvbklkID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTG9jYWxlID0gc291cmNlLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIG1TdWJ0eXBlTW9kZSA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBtU3VidHlwZUV4dHJhVmFsdWUgPSBzb3VyY2UucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgaWNvbiBvZiB0aGUgc3VidHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRJY29uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVJY29uSWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgbG9jYWxlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3VidHlwZUxvY2FsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVNb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGV4dHJhIHZhbHVlIG9mIHRoZSBzdWJ0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dHJhVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVFeHRyYVZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgcGFyY2VsYWJsZUZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TdWJ0eXBlTmFtZSk7CisgICAgICAgICAgICBkZXN0LndyaXRlSW50KG1TdWJ0eXBlSWNvbklkKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZU1vZGUpOworICAgICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtU3VidHlwZUV4dHJhVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RTdWJ0eXBlPiBDUkVBVE9SCisgICAgICAgICAgICAgICAgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kU3VidHlwZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKHNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiB0aGUgc3VidHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBtU3VidHlwZXMgPSBuZXcgQXJyYXlMaXN0PElucHV0TWV0aG9kU3VidHlwZT4oKTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqIApAQCAtODEsMTEgKzE4MywxMSBAQAogICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CiAgICAgICAgIFNlcnZpY2VJbmZvIHNpID0gc2VydmljZS5zZXJ2aWNlSW5mbzsKICAgICAgICAgbUlkID0gbmV3IENvbXBvbmVudE5hbWUoc2kucGFja2FnZU5hbWUsIHNpLm5hbWUpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgIAorCiAgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBTdHJpbmcgc2V0dGluZ3NBY3Rpdml0eUNvbXBvbmVudCA9IG51bGw7CiAgICAgICAgIGludCBpc0RlZmF1bHRSZXNJZCA9IDA7Ci0gICAgICAgIAorCiAgICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYXJzZXIgPSBzaS5sb2FkWG1sTWV0YURhdGEocG0sIElucHV0TWV0aG9kLlNFUlZJQ0VfTUVUQV9EQVRBKTsKQEAgLTExNiwxMyArMjE4LDM2IEBACiAgICAgICAgICAgICBpc0RlZmF1bHRSZXNJZCA9IHNhLmdldFJlc291cmNlSWQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX2lzRGVmYXVsdCwgMCk7CiAgICAgICAgICAgICBzYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworICAgICAgICAgICAgLy8gUGFyc2UgYWxsIHN1YnR5cGVzCisgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCEic3VidHlwZSIuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhLWRhdGEgaW4gaW5wdXQtbWV0aG9kIGRvZXMgbm90IHN0YXJ0IHdpdGggc3VidHlwZSB0YWciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZWRBcnJheSBhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RTdWJ0eXBlIHN1YnR5cGUgPSBuZXcgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuSW5wdXRNZXRob2RfU3VidHlwZV9sYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLklucHV0TWV0aG9kX1N1YnR5cGVfaWNvbiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTG9jYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBjb250ZXh0IGZvcjogIiArIHNpLnBhY2thZ2VOYW1lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHNldHRpbmdzQWN0aXZpdHlDb21wb25lbnQ7CiAgICAgICAgIG1Jc0RlZmF1bHRSZXNJZCA9IGlzRGVmYXVsdFJlc0lkOwogICAgIH0KQEAgLTEzMiw4ICsyNTcsOSBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBtU2VydmljZSA9IFJlc29sdmVJbmZvLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChzb3VyY2UpOworICAgICAgICBzb3VyY2UucmVhZFR5cGVkTGlzdChtU3VidHlwZXMsIElucHV0TWV0aG9kU3VidHlwZS5DUkVBVE9SKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUZW1wb3JhcnkgQVBJIGZvciBjcmVhdGluZyBhIGJ1aWx0LWluIGlucHV0IG1ldGhvZC4KICAgICAgKi8KQEAgLTE1Niw3ICsyODIsNyBAQAogICAgICAgICBtU2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBzZXR0aW5nc0FjdGl2aXR5OwogICAgICAgICBtSXNEZWZhdWx0UmVzSWQgPSAwOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBpbnB1dCBtZXRob2QuICBUaGUgSUQgaXMgZ2VuZXJhdGVkIGZyb20KICAgICAgKiB0aGUgcGFja2FnZSBhbmQgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQEAgLTE2NCwxNCArMjkwLDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIG1JZDsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIC5hcGsgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnB1dCBtZXRob2QuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZSBjb21wb25lbnQgdGhhdCBpbXBsZW1lbnRzCiAgICAgICogdGhpcyBpbnB1dCBtZXRob2QuCkBAIC0xOTYsNyArMzIyLDcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnROYW1lKG1TZXJ2aWNlLnNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNlcnZpY2VJbmZvLm5hbWUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGxhYmVsIGZvciB0aGlzIGlucHV0IG1ldGhvZC4KICAgICAgKiAKQEAgLTIwNiw3ICszMzIsNyBAQAogICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9hZExhYmVsKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkTGFiZWwocG0pOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIExvYWQgdGhlIHVzZXItZGlzcGxheWVkIGljb24gZm9yIHRoaXMgaW5wdXQgbWV0aG9kLgogICAgICAqIApAQCAtMjE2LDcgKzM0Miw3IEBACiAgICAgcHVibGljIERyYXdhYmxlIGxvYWRJY29uKFBhY2thZ2VNYW5hZ2VyIHBtKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZS5sb2FkSWNvbihwbSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIGFuIGFjdGl2aXR5IHRoYXQgcHJvdmlkZXMgYSBzZXR0aW5ncyBVSSBmb3IKICAgICAgKiB0aGUgaW5wdXQgbWV0aG9kLiAgWW91IGNhbiBsYXVuY2ggdGhpcyBhY3Rpdml0eSBiZSBzdGFydGluZyBpdCB3aXRoCkBAIC0yMzAsNyArMzU2LDE0IEBACiAgICAgcHVibGljIFN0cmluZyBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgewogICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3VidHlwZXMgb2YgSW5wdXQgTWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBnZXRTdWJ0eXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJ0eXBlczsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSByZXNvdXJjZSBpbnNpZGUgb2YgdGhpcyBpbnB1dAogICAgICAqIG1ldGhvZCdzIC5hcGsgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYQpAQCAtMjM5LDcgKzM3Miw3IEBACiAgICAgcHVibGljIGludCBnZXRJc0RlZmF1bHRSZXNvdXJjZUlkKCkgewogICAgICAgICByZXR1cm4gbUlzRGVmYXVsdFJlc0lkOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRlciBwdywgU3RyaW5nIHByZWZpeCkgewogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJtSWQ9IiArIG1JZAogICAgICAgICAgICAgICAgICsgIiBtU2V0dGluZ3NBY3Rpdml0eU5hbWU9IiArIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CkBAIC0yODUsMTIgKzQxOCwxNCBAQAogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQobUlzRGVmYXVsdFJlc0lkKTsKICAgICAgICAgbVNlcnZpY2Uud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVUeXBlZExpc3QobVN1YnR5cGVzKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VkIHRvIG1ha2UgdGhpcyBjbGFzcyBwYXJjZWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPElucHV0TWV0aG9kSW5mbz4gQ1JFQVRPUiA9IG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8SW5wdXRNZXRob2RJbmZvPigpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+IENSRUFUT1IKKyAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxJbnB1dE1ldGhvZEluZm8+KCkgewogICAgICAgICBwdWJsaWMgSW5wdXRNZXRob2RJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dE1ldGhvZEluZm8oc291cmNlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0FjY2Vzc2liaWxpdHlJbmplY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZGRjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQWNjZXNzaWJpbGl0eUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW5qZWN0cyBhY2Nlc3NpYmlsaXR5IGludG8gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZCBKYXZhU2NyaXB0IG9yCisgKiBXZWJWaWV3cyB3aXRoIGVuYWJsZWQgSmF2YVNjcmlwdCBidXQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gYWNjZXNzaWJpbGl0eQorICogc2NyaXB0IHRvIGluamVjdC4KKyAqLworY2xhc3MgQWNjZXNzaWJpbGl0eUluamVjdG9yIHsKKworICAgIC8vIEhhbmRsZSB0byB0aGUgV2ViVmlldyB0aGlzIGluamVjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIFZ3ZWJWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYlZpZXcgVGhlIGFzc29jaWF0ZWQgV2ViVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUluamVjdG9yKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGEga2V5IGRvd24gPGNvZGU+ZXZlbnQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBhcyBhIHByb29mIG9mIGNvbmNlcHQgbGV0IHVzIGRvIHRoZSBzaW1wbGVzdCBleGFtcGxlCisKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7CisKKyAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfTjoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJmb3J3YXJkIiwgInNlbnRlbmNlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfUDoKKyAgICAgICAgICAgICAgICBtb2RpZnlTZWxlY3Rpb24oImV4dGVuZCIsICJiYWNrd2FyZCIsICJzZW50ZW5jZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSA8Y29kZT5zZWxlY3Rpb25TdHJpbmc8L2NvZGU+IGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RyaW5nQ2hhbmdlKFN0cmluZyBzZWxlY3Rpb25TdHJpbmcpIHsKKyAgICAgICAgLy8gcHV0IHRoZSBzZWxlY3Rpb24gc3RyaW5nIGluIGFuIEFjY2Vzc2liaWxpdHlFdmVudCBhbmQgc2VuZCBpdAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCk7CisgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoc2VsZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgbVdlYlZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtb2RpZnlTZWxlY3Rpb24oU3RyaW5nIGFsdGVyLCBTdHJpbmcgZGlyZWN0aW9uLCBTdHJpbmcgZ3JhbnVsYXJpdHkpIHsKKyAgICAgICAgV2ViVmlld0NvcmUgd2ViVmlld0NvcmUgPSBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpOworCisgICAgICAgIGlmICh3ZWJWaWV3Q29yZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBXZWJWaWV3Q29yZS5Nb2RpZnlTZWxlY3Rpb25EYXRhIGRhdGEgPSBuZXcgV2ViVmlld0NvcmUuTW9kaWZ5U2VsZWN0aW9uRGF0YSgpOworICAgICAgICBkYXRhLm1BbHRlciA9IGFsdGVyOworICAgICAgICBkYXRhLm1EaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgICAgIGRhdGEubUdyYW51bGFyaXR5ID0gZ3JhbnVsYXJpdHk7CisgICAgICAgIHdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLk1PRElGWV9TRUxFQ1RJT04sIGRhdGEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQppbmRleCBhMmM4MGYyLi5lOTcyYzI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwpAQCAtNzIsNiArNzQsOCBAQAogICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGNsZWFyZWQsdGhleSBhcmUgaWdub3JlZC4KICAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrTWVzc2FnZXMgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzRGF0YURpcmVjdG9yeSA9ICIiOworCiAgICAgLy8gSXMgdGhpcyBmcmFtZSB0aGUgbWFpbiBmcmFtZT8KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWFpbkZyYW1lOwogCkBAIC0yMjQsNiArMjI4LDExIEBACiAgICAgICAgIEFzc2V0TWFuYWdlciBhbSA9IGNvbnRleHQuZ2V0QXNzZXRzKCk7CiAgICAgICAgIG5hdGl2ZUNyZWF0ZUZyYW1lKHcsIGFtLCBwcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKSk7CiAKKyAgICAgICAgaWYgKHNEYXRhRGlyZWN0b3J5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBhcHBDb250ZXh0LmdldEZpbGVzRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBzRGF0YURpcmVjdG9yeSA9ICBkaXIuc3Vic3RyaW5nKDAsIGRpci5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLkJST1dTRVJfRlJBTUUpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkJyb3dzZXJGcmFtZSBjb25zdHJ1Y3RvcjogdGhpcz0iICsgdGhpcyk7CiAgICAgICAgIH0KQEAgLTI5NCw2ICszMDMsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBmaWxlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gU3RyaW5nIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBiYXNlbmFtZSwgYm9vbGVhbiBhdXRvbmFtZSkgeworICAgICAgICByZXR1cm4gbmF0aXZlU2F2ZVdlYkFyY2hpdmUoYmFzZW5hbWUsIGF1dG9uYW1lKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHbyBiYWNrIG9yIGZvcndhcmQgdGhlIG51bWJlciBvZiBzdGVwcyBnaXZlbi4KICAgICAgKiBAcGFyYW0gc3RlcHMgQSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgZGlyZWN0aW9uCiAgICAgICogICAgICAgICAgICAgIGFuZCBudW1iZXIgb2Ygc3RlcHMgdG8gbW92ZS4KQEAgLTUxMCwxMiArNTMxLDIxIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGV4dGVybmFsUmVwcmVzZW50YXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdmlzdWFsIHRleHQgb2YgdGhlIGN1cnJlbnQgZnJhbWUsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZpc3VhbCB0ZXh0IG9mIHRoZSBmcmFtZXMsIHB1dHMgaXQgYXMgdGhlIG9iamVjdCBmb3IKICAgICAgKiB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgdGhlIG1lc3NhZ2UuCiAgICAgICogQHBhcmFtIGNhbGxiYWNrIHRoZSBtZXNzYWdlIHRvIHVzZSB0byBzZW5kIHRoZSB2aXN1YWwgdGV4dAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvY3VtZW50QXNUZXh0KE1lc3NhZ2UgY2FsbGJhY2spIHsKLSAgICAgICAgY2FsbGJhY2sub2JqID0gZG9jdW1lbnRBc1RleHQoKTs7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGlmIChjYWxsYmFjay5hcmcxICE9IDApIHsKKyAgICAgICAgICAgIC8vIER1bXAgdG9wIGZyYW1lIGFzIHRleHQuCisgICAgICAgICAgICB0ZXh0LmFwcGVuZChkb2N1bWVudEFzVGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2suYXJnMiAhPSAwKSB7CisgICAgICAgICAgICAvLyBEdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0LgorICAgICAgICAgICAgdGV4dC5hcHBlbmQoY2hpbGRGcmFtZXNBc1RleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub2JqID0gdGV4dC50b1N0cmluZygpOwogICAgICAgICBjYWxsYmFjay5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKQEAgLTUyNCw2ICs1NTQsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgZG9jdW1lbnRBc1RleHQoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2hpbGQgZnJhbWVzIGFzIGEgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNoaWxkRnJhbWVzQXNUZXh0KCk7CisKICAgICAvKgogICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJDb3JlIHRvIGluZm9ybSB0aGUgZnJhbWUgdGhhdAogICAgICAqIHRoZSBKYXZhc2NyaXB0IHdpbmRvdyBvYmplY3QgaGFzIGJlZW4gY2xlYXJlZC4KQEAgLTYxNyw2ICs2NTIsMTA0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4gR2V0cyB0aGUgYXBwbGljYXRpb25zIGRhdGEgZGlyZWN0b3J5CisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIGFwcGxpY2F0aW9ucyBkYXRhIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREYXRhRGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gc0RhdGFEaXJlY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSS4KKyAgICAgKiBSZWFkIGZyb20gYW4gSW5wdXRTdHJlYW0gaW50byBhIHN1cHBsaWVkIGJ5dGVbXQorICAgICAqIFRoaXMgbWV0aG9kIGNhdGNoZXMgYW55IGV4Y2VwdGlvbnMgc28gdGhleSBkb24ndCBjcmFzaCB0aGUgSlZNLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBJbnB1dFN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG91dHB1dCBCeXRlYXJyYXkgdGhhdCBnZXRzIHRoZSBvdXRwdXQuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC1pIGlmIHRoZW4gZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBieXRlW10gb3V0cHV0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZChvdXRwdXQpOworICAgICAgICB9IGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiwgcmV0dXJuIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSW5wdXRTdHJlYW0gZm9yIGFuIEFuZHJvaWQgcmVzb3VyY2UKKyAgICAgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGFuZHJvaWQgcmVzb3VyY2VzOgorICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX3JlcworICAgICAqIC0gZmlsZTovLy9hbmRyb2lkX2Fzc2V0CisgICAgICogLSBjb250ZW50Oi8vCisgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byB0aGUgYW5kcm9pZCByZXNvdXJjZQorICAgICAqLworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gb3JBbmRyb2lkUmVzb3VyY2UoU3RyaW5nIHVybCwgaW50IHR5cGUpIHsKKyAgICAgICAgZmluYWwgaW50IFJFU09VUkNFID0gMTsKKyAgICAgICAgZmluYWwgaW50IEFTU0VUID0gMjsKKyAgICAgICAgZmluYWwgaW50IENPTlRFTlQgPSAzOworCisgICAgICAgIGlmICh0eXBlID09IFJFU09VUkNFKSB7CisgICAgICAgICAgICAvLyBmaWxlOi8vL2FuZHJvaWRfcmVzCisgICAgICAgICAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJ1cmwgaGFzIGxlbmd0aCAwICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsYXNoID0gdXJsLmluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBkb3QgPSB1cmwuaW5kZXhPZignLicsIHNsYXNoKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA9PSAtMSB8fCBkb3QgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJJbmNvcnJlY3QgcmVzIHBhdGg6ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHN1YkNsYXNzTmFtZSA9IHVybC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IHVybC5zdWJzdHJpbmcoc2xhc2ggKyAxLCBkb3QpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZCA9IG1Db250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLlIkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3ViQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGQuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBmaWVsZC5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VmFsdWUoaWQsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRBc3NldHMoKS5vcGVuTm9uQXNzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXNzZXRDb29raWUsIHZhbHVlLnN0cmluZy50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2V0TWFuYWdlci5BQ0NFU1NfU1RSRUFNSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPbGQgc3RhY2sgb25seSBzdXBwb3J0cyBUWVBFX1NUUklORyBmb3IgcmVzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgIm5vdCBvZiB0eXBlIHN0cmluZzogIiArIHVybCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXhjZXB0aW9uOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQVNTRVQpIHsKKyAgICAgICAgICAgIC8vIGZpbGU6Ly8vYW5kcm9pZF9hc3NldAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYXNzZXRzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzc2V0cy5vcGVuKHVybCwgQXNzZXRNYW5hZ2VyLkFDQ0VTU19TVFJFQU1JTkcpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ09OVEVOVCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKHVybCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFeGNlcHRpb246ICIgKyB1cmwpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdGFydCBsb2FkaW5nIGEgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlckhhbmRsZSBUaGUgbmF0aXZlIFJlc291cmNlTG9hZGVyIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRhdGEuCkBAIC04NDIsNiArOTc1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUExPQURfTEFCRUwgPSA0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNFVF9MQUJFTCA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNVQk1JVF9MQUJFTCA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVVBMT0FEX05PX0ZJTEVfQ0hPU0VOID0gNzsKIAogICAgIFN0cmluZyBnZXRSYXdSZXNGaWxlbmFtZShpbnQgaWQpIHsKICAgICAgICAgaW50IHJlc2lkOwpAQCAtODcxLDYgKzEwMDUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuc3VibWl0KTsKIAorICAgICAgICAgICAgY2FzZSBGSUxFX1VQTE9BRF9OT19GSUxFX0NIT1NFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcubm9fZmlsZV9jaG9zZW4pOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIExvZy5lKExPR1RBRywgImdldFJhd1Jlc0ZpbGVuYW1lIGdvdCBpbmNvbXBhdGlibGUgcmVzb3VyY2UgSUQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CkBAIC0xMDA2LDUgKzExNDQsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIEhhc2hNYXAgZ2V0Rm9ybVRleHREYXRhKCk7CiAKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlU2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lKTsKKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT3JpZW50YXRpb25DaGFuZ2VkKGludCBvcmllbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQppbmRleCBkNjVjMTA2Li4xYjU2NTFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAoraW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIGEgcHJveHkgY2xhc3MgZm9yIGhhbmRsaW5nIFdlYkNvcmUgLT4gVUkgdGhyZWFkIG1lc3NhZ2luZy4gQWxsCkBAIC0xMTIsNiArMTE0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX0hJU1RPUllfSVRFTSAgICAgICAgICAgICAgICAgICAgPSAxMzU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJU1RPUllfSU5ERVhfQ0hBTkdFRCAgICAgICAgICAgICAgID0gMTM2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRIX0NSRURFTlRJQUxTICAgICAgICAgICAgICAgICAgICA9IDEzNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0lOU1RBTExBQkxFX1dFQkFQUCAgICAgICAgICAgICAgPSAxMzg7CiAKICAgICAvLyBNZXNzYWdlIHRyaWdnZXJlZCBieSB0aGUgY2xpZW50IHRvIHJlc3VtZSBleGVjdXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7CkBAIC01MDAsMTggKzUwMywzMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0FsZXJ0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuY29uZmlybSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENhbmNlbGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPbkNhbmNlbExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKQEAgLTUyNSw2ICs1NDIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1zZy5nZXREYXRhKCkuZ2V0U3RyaW5nKCJ1cmwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2ViQ2hyb21lQ2xpZW50Lm9uSnNDb25maXJtKG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkaXNwbGF5IHRoZSBhbGVydCBkaWFsb2cgaWYgdGhlIG1Db250ZXh0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpdml0eSBhbmQgaXRzIHdpbmRvdyBoYXMgdGhlIGZvY3VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobUNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISgoQWN0aXZpdHkpIG1Db250ZXh0KS5oYXNXaW5kb3dGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRSZWFkeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCkBAIC01NjUsNiArNTkwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtc2cuZ2V0RGF0YSgpLmdldFN0cmluZygidXJsIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVdlYkNocm9tZUNsaWVudC5vbkpzUHJvbXB0KG1XZWJWaWV3LCB1cmwsIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWwsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExheW91dEluZmxhdGVyIGZhY3RvcnkgPSBMYXlvdXRJbmZsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShtQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBmYWN0b3J5LmluZmxhdGUoUi5sYXlvdXQuanNfcHJvbXB0LApAQCAtNjE2LDYgKzY0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInVybCIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1XZWJDaHJvbWVDbGllbnQub25Kc0JlZm9yZVVubG9hZChtV2ViVmlldywgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHJlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgYWxlcnQgZGlhbG9nIGlmIHRoZSBtQ29udGV4dCBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aXZpdHkgYW5kIGl0cyB3aW5kb3cgaGFzIHRoZSBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICEoKEFjdGl2aXR5KSBtQ29udGV4dCkuaGFzV2luZG93Rm9jdXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0UmVhZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtID0gbUNvbnRleHQuZ2V0U3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5qc19kaWFsb2dfYmVmb3JlX3VubG9hZCwgbWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcihtQ29udGV4dCkKQEAgLTcyNSw3ICs3NjYsOCBAQAogCiAgICAgICAgICAgICBjYXNlIE9QRU5fRklMRV9DSE9PU0VSOgogICAgICAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoKFVwbG9hZEZpbGUpIG1zZy5vYmopOworICAgICAgICAgICAgICAgICAgICBVcGxvYWRGaWxlTWVzc2FnZURhdGEgZGF0YSA9IChVcGxvYWRGaWxlTWVzc2FnZURhdGEpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgbVdlYkNocm9tZUNsaWVudC5vcGVuRmlsZUNob29zZXIoZGF0YS5nZXRVcGxvYWRGaWxlKCksIGRhdGEuZ2V0QWNjZXB0VHlwZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTc1MCw2ICs3OTIsOSBAQAogICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgKICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfSU5TVEFMTEFCTEVfV0VCQVBQOgorICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA4NywxMCArMTEzMiwxNSBAQAogICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKGludCBuZXdQcm9ncmVzcykgewogICAgICAgICAvLyBTeW5jaHJvbml6ZSBzbyB0aGF0IG1MYXRlc3RQcm9ncmVzcyBpcyB1cC10by1kYXRlLgogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwgfHwgbUxhdGVzdFByb2dyZXNzID09IG5ld1Byb2dyZXNzKSB7CisgICAgICAgICAgICAvLyB1cGRhdGUgbUxhdGVzdFByb2dyZXNzIGV2ZW4gbVdlYkNocm9tZUNsaWVudCBpcyBudWxsIGFzCisgICAgICAgICAgICAvLyBXZWJWaWV3LmdldFByb2dyZXNzKCkgbmVlZHMgaXQKKyAgICAgICAgICAgIGlmIChtTGF0ZXN0UHJvZ3Jlc3MgPT0gbmV3UHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTGF0ZXN0UHJvZ3Jlc3MgPSBuZXdQcm9ncmVzczsKKyAgICAgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW1Qcm9ncmVzc1VwZGF0ZVBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKFBST0dSRVNTKTsKICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nID0gdHJ1ZTsKQEAgLTExNzIsOSArMTIyMiw3IEBACiAgICAgICAgIC8vIGZvciBudWxsLgogICAgICAgICBXZWJIaXN0b3J5SXRlbSBpID0gbUJhY2tGb3J3YXJkTGlzdC5nZXRDdXJyZW50SXRlbSgpOwogICAgICAgICBpZiAoaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlY29tcG9zZWQgfHwgaS5nZXRUb3VjaEljb25VcmwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaS5zZXRUb3VjaEljb25VcmwodXJsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkuc2V0VG91Y2hJY29uVXJsKHVybCwgcHJlY29tcG9zZWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpAQCAtMTQzMiw2ICsxNDgwLDI0IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBsb2FkRmlsZU1lc3NhZ2VEYXRhIHsKKyAgICAgICAgcHJpdmF0ZSBVcGxvYWRGaWxlIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUFjY2VwdFR5cGU7CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGVNZXNzYWdlRGF0YShVcGxvYWRGaWxlIHVwbG9hZEZpbGUsIFN0cmluZyBhY2NlcHRUeXBlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSB1cGxvYWRGaWxlOworICAgICAgICAgICAgbUFjY2VwdFR5cGUgPSBhY2NlcHRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVwbG9hZEZpbGUgZ2V0VXBsb2FkRmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFjY2VwdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGNsYXNzIFVwbG9hZEZpbGUgaW1wbGVtZW50cyBWYWx1ZUNhbGxiYWNrPFVyaT4gewogICAgICAgICBwcml2YXRlIFVyaSBtVmFsdWU7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZVZhbHVlKFVyaSB2YWx1ZSkgewpAQCAtMTQ0OCwxMyArMTUxNCwxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCBieSBXZWJWaWV3Q29yZSB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gVXJpIG9wZW5GaWxlQ2hvb3NlcigpIHsKKyAgICAvKiBwYWNrYWdlICovIFVyaSBvcGVuRmlsZUNob29zZXIoU3RyaW5nIGFjY2VwdFR5cGUpIHsKICAgICAgICAgaWYgKG1XZWJDaHJvbWVDbGllbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgTWVzc2FnZSBteU1lc3NhZ2UgPSBvYnRhaW5NZXNzYWdlKE9QRU5fRklMRV9DSE9PU0VSKTsKICAgICAgICAgVXBsb2FkRmlsZSB1cGxvYWRGaWxlID0gbmV3IFVwbG9hZEZpbGUoKTsKLSAgICAgICAgbXlNZXNzYWdlLm9iaiA9IHVwbG9hZEZpbGU7CisgICAgICAgIFVwbG9hZEZpbGVNZXNzYWdlRGF0YSBkYXRhID0gbmV3IFVwbG9hZEZpbGVNZXNzYWdlRGF0YSh1cGxvYWRGaWxlLCBhY2NlcHRUeXBlKTsKKyAgICAgICAgbXlNZXNzYWdlLm9iaiA9IGRhdGE7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgc2VuZE1lc3NhZ2UobXlNZXNzYWdlKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNDgzLDQgKzE1NTAsMTEgQEAKICAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKEhJU1RPUllfSU5ERVhfQ0hBTkdFRCwgaW5kZXgsIDAsIGl0ZW0pOwogICAgICAgICBzZW5kTWVzc2FnZShtc2cpOwogICAgIH0KKworICAgIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7CisgICAgICAgIGlmIChtV2ViQ2hyb21lQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKFNFVF9JTlNUQUxMQUJMRV9XRUJBUFApKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjMmY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHNpbXBseSBhIGNvbnRhaW5lciBmb3IgdGhlIG1ldGhvZHMgdXNlZCB0byBpbXBsZW1lbnQgRGV2aWNlT3JpZW50YXRpb24sCisgKiBpbmNsdWRpbmcgdGhlIG1vY2sgRGV2aWNlT3JpZW50YXRpb25DbGllbnQgZm9yIHVzZSBpbiBMYXlvdXRUZXN0cy4KKyAqCisgKiBUaGlzIGNvdWxkIGJlIHBhcnQgb2YgV2ViVmlld0NvcmUsIGJ1dCBoYXZlIG1vdmVkIGl0IHRvIGl0cyBvd24gY2xhc3MgdG8KKyAqIGF2b2lkIGJsb2F0IHRoZXJlLgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uTWFuYWdlciB7CisgICAgcHJpdmF0ZSBXZWJWaWV3Q29yZSBtV2ViVmlld0NvcmU7CisgICAgcHJpdmF0ZSBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgbVNlcnZpY2U7CisKKyAgICBwdWJsaWMgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZSA9IHdlYlZpZXdDb3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgUGFnZSBmb3IgdGhpcyBXZWJWaWV3Q29yZSBzaG91bGQgdXNlIGEgbW9jayBEZXZpY2VPcmllbnRhdGlvbgorICAgICAqIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1c2VNb2NrKCkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlVXNlTW9jayhtV2ViVmlld0NvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gZm9yIHRoZSBtb2NrIERldmljZU9yaWVudGF0aW9uIHNlcnZpY2UgZm9yIHRoaXMgV2ViVmlld0NvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9ja09yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsCisgICAgICAgICAgICBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbmF0aXZlU2V0TW9ja09yaWVudGF0aW9uKG1XZWJWaWV3Q29yZSwgY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25PcmllbnRhdGlvbkNoYW5nZShEb3VibGUgYWxwaGEsIERvdWJsZSBiZXRhLCBEb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbmF0aXZlT25PcmllbnRhdGlvbkNoYW5nZShtV2ViVmlld0NvcmUsCisgICAgICAgICAgICAgICAgYWxwaGEgIT0gbnVsbCwgYWxwaGEgIT0gbnVsbCA/IGFscGhhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgYmV0YSAhPSBudWxsLCBiZXRhICE9IG51bGwgPyBiZXRhLmRvdWJsZVZhbHVlKCkgOiAwLjAsCisgICAgICAgICAgICAgICAgZ2FtbWEgIT0gbnVsbCwgZ2FtbWEgIT0gbnVsbCA/IGdhbW1hLmRvdWJsZVZhbHVlKCkgOiAwLjApOworICAgIH0KKworICAgIC8vIE5hdGl2ZSBmdW5jdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVVc2VNb2NrKFdlYlZpZXdDb3JlIHdlYlZpZXdDb3JlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRNb2NrT3JpZW50YXRpb24oV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uT3JpZW50YXRpb25DaGFuZ2UoV2ViVmlld0NvcmUgd2ViVmlld0NvcmUsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLCBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0RldmljZU9yaWVudGF0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmZjg0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudDsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLlNlbnNvckV2ZW50TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgamF2YS5sYW5nLlJ1bm5hYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKK2ZpbmFsIGNsYXNzIERldmljZU9yaWVudGF0aW9uU2VydmljZSBpbXBsZW1lbnRzIFNlbnNvckV2ZW50TGlzdGVuZXIgeworICAgIC8vIFRoZSBncmF2aXR5IHZlY3RvciBleHByZXNzZWQgaW4gdGhlIGJvZHkgZnJhbWUuCisgICAgcHJpdmF0ZSBmbG9hdFtdIG1HcmF2aXR5VmVjdG9yOworICAgIC8vIFRoZSBnZW9tYWduZXRpYyB2ZWN0b3IgZXhwcmVzc2VkIGluIHRoZSBib2R5IGZyYW1lLgorICAgIHByaXZhdGUgZmxvYXRbXSBtTWFnbmV0aWNGaWVsZFZlY3RvcjsKKworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1NYW5hZ2VyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSdW5uaW5nOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIFNlbnNvck1hbmFnZXIgbVNlbnNvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgRG91YmxlIG1BbHBoYTsKKyAgICBwcml2YXRlIERvdWJsZSBtQmV0YTsKKyAgICBwcml2YXRlIERvdWJsZSBtR2FtbWE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVMVEFfREVHUkVTUyA9IDEuMDsKKworICAgIHB1YmxpYyBEZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1hbmFnZXIsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtTWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIGFzc2VydChtTWFuYWdlciAhPSBudWxsKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBhc3NlcnQobUNvbnRleHQgIT0gbnVsbCk7CisgICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtSXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcmVnaXN0ZXJGb3JTZW5zb3JzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUlzUnVubmluZyA9IGZhbHNlOworICAgICAgICB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKCkgeworICAgICAgICBpZiAobUlzUnVubmluZykgeworICAgICAgICAgICAgdW5yZWdpc3RlckZyb21TZW5zb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoKSB7CisgICAgICAgIGlmIChtSXNSdW5uaW5nKSB7CisgICAgICAgICAgICByZWdpc3RlckZvclNlbnNvcnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kRXJyb3JFdmVudCgpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXIub25PcmllbnRhdGlvbkNoYW5nZShudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvclNlbnNvcnMoKSB7CisgICAgICAgIGlmIChtSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWdpc3RlckZvckFjY2VsZXJvbWV0ZXJTZW5zb3IoKSB8fCAhcmVnaXN0ZXJGb3JNYWduZXRpY0ZpZWxkU2Vuc29yKCkpIHsKKyAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tU2Vuc29ycygpOworICAgICAgICAgICAgc2VuZEVycm9yRXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKSB7CisgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsIHx8IG1NYWduZXRpY0ZpZWxkVmVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgcm90YXRpb24gbWF0cml4LgorICAgICAgICAvLyBUaGUgcm90YXRpb24gbWF0cml4IHRoYXQgdHJhbnNmb3JtcyBmcm9tIHRoZSBib2R5IGZyYW1lIHRvIHRoZSBlYXJ0aCBmcmFtZS4KKyAgICAgICAgZmxvYXRbXSBkZXZpY2VSb3RhdGlvbk1hdHJpeCA9IG5ldyBmbG9hdFs5XTsKKyAgICAgICAgaWYgKCFTZW5zb3JNYW5hZ2VyLmdldFJvdGF0aW9uTWF0cml4KAorICAgICAgICAgICAgICAgIGRldmljZVJvdGF0aW9uTWF0cml4LCBudWxsLCBtR3Jhdml0eVZlY3RvciwgbU1hZ25ldGljRmllbGRWZWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHJvdGF0aW9uIG1hdHJpeCB0byByb3RhdGlvbiBhbmdsZXMuCisgICAgICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhlIHJvdGF0aW9ucyBhcmUgYXBwaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgYXQKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sI3ZhbHVlcworICAgICAgICAvLyB0aGUgcm90YXRpb25zIGFyZSBhcHBsaWVkIGFib3V0IHRoZSBzYW1lIGF4ZXMgYW5kIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAvLyBBUEkuIFRoZSBvbmx5IGNvbnZlcnNpb25zIGFyZSBzaWduIGNoYW5nZXMgYXMgZm9sbG93cy4KKyAgICAgICAgLy8gVGhlIGFuZ2xlcyBhcmUgaW4gcmFkaWFucworICAgICAgICBmbG9hdFtdIHJvdGF0aW9uQW5nbGVzID0gbmV3IGZsb2F0WzNdOworICAgICAgICBTZW5zb3JNYW5hZ2VyLmdldE9yaWVudGF0aW9uKGRldmljZVJvdGF0aW9uTWF0cml4LCByb3RhdGlvbkFuZ2xlcyk7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9IE1hdGgudG9EZWdyZWVzKC1yb3RhdGlvbkFuZ2xlc1swXSkgLSA5MC4wOworICAgICAgICB3aGlsZSAoYWxwaGEgPCAwLjApIHsgYWxwaGEgKz0gMzYwLjA7IH0gLy8gWzAsIDM2MCkKKyAgICAgICAgZG91YmxlIGJldGEgPSBNYXRoLnRvRGVncmVlcygtcm90YXRpb25BbmdsZXNbMV0pOworICAgICAgICB3aGlsZSAoYmV0YSA8IC0xODAuMCkgeyBiZXRhICs9IDM2MC4wOyB9IC8vIFstMTgwLCAxODApCisgICAgICAgIGRvdWJsZSBnYW1tYSA9IE1hdGgudG9EZWdyZWVzKHJvdGF0aW9uQW5nbGVzWzJdKTsKKyAgICAgICAgd2hpbGUgKGdhbW1hIDwgLTkwLjApIHsgZ2FtbWEgKz0gMzYwLjA7IH0gLy8gWy05MCwgOTApCisKKyAgICAgICAgbWF5YmVTZW5kQ2hhbmdlKGFscGhhLCBiZXRhLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZW5zb3JNYW5hZ2VyIGdldFNlbnNvck1hbmFnZXIoKSB7CisgICAgICAgIGFzc2VydCBXZWJWaWV3Q29yZS5USFJFQURfTkFNRS5lcXVhbHMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICBpZiAobVNlbnNvck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbnNvck1hbmFnZXIgPSAoU2Vuc29yTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFTlNPUl9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVNlbnNvck1hbmFnZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yQWNjZWxlcm9tZXRlclNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9BQ0NFTEVST01FVEVSKTsKKyAgICAgICAgaWYgKHNlbnNvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaGFuZGxpbmcgbXVsdGlwbGUgc2Vuc29ycy4KKyAgICAgICAgcmV0dXJuIGdldFNlbnNvck1hbmFnZXIoKS5yZWdpc3Rlckxpc3RlbmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHNlbnNvcnMuZ2V0KDApLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9GQVNURVNULCBtSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyRm9yTWFnbmV0aWNGaWVsZFNlbnNvcigpIHsKKyAgICAgICAgTGlzdDxTZW5zb3I+IHNlbnNvcnMgPSBnZXRTZW5zb3JNYW5hZ2VyKCkuZ2V0U2Vuc29yTGlzdChTZW5zb3IuVFlQRV9NQUdORVRJQ19GSUVMRCk7CisgICAgICAgIGlmIChzZW5zb3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhhbmRsaW5nIG11bHRpcGxlIHNlbnNvcnMuCisgICAgICAgIHJldHVybiBnZXRTZW5zb3JNYW5hZ2VyKCkucmVnaXN0ZXJMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICB0aGlzLCBzZW5zb3JzLmdldCgwKSwgU2Vuc29yTWFuYWdlci5TRU5TT1JfREVMQVlfRkFTVEVTVCwgbUhhbmRsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRnJvbVNlbnNvcnMoKSB7CisgICAgICAgIGdldFNlbnNvck1hbmFnZXIoKS51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2VuZENoYW5nZShkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgYXNzZXJ0IFdlYlZpZXdDb3JlLlRIUkVBRF9OQU1FLmVxdWFscyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChtQWxwaGEgPT0gbnVsbCB8fCBtQmV0YSA9PSBudWxsIHx8IG1HYW1tYSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoYWxwaGEgLSBtQWxwaGEpID4gREVMVEFfREVHUkVTUworICAgICAgICAgICAgICAgIHx8IE1hdGguYWJzKGJldGEgLSBtQmV0YSkgPiBERUxUQV9ERUdSRVNTCisgICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoZ2FtbWEgLSBtR2FtbWEpID4gREVMVEFfREVHUkVTUykgeworICAgICAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgICAgICBtQmV0YSA9IGJldGE7CisgICAgICAgICAgICBtR2FtbWEgPSBnYW1tYTsKKyAgICAgICAgICAgIG1NYW5hZ2VyLm9uT3JpZW50YXRpb25DaGFuZ2UobUFscGhhLCBtQmV0YSwgbUdhbW1hKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbnNvckV2ZW50TGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCisgICAgICogQ2FsbGJhY2tzIGhhcHBlbiBvbiB0aGUgdGhyZWFkIG9uIHdoaWNoIHdlIHJlZ2lzdGVyZWQgLSB0aGUgV2ViQ29yZSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TZW5zb3JDaGFuZ2VkKFNlbnNvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydChldmVudC52YWx1ZXMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIW1Jc1J1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZXZlbnQuc2Vuc29yLmdldFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfQUNDRUxFUk9NRVRFUjoKKyAgICAgICAgICAgIGlmIChtR3Jhdml0eVZlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3IgPSBuZXcgZmxvYXRbM107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtR3Jhdml0eVZlY3RvclswXSA9IGV2ZW50LnZhbHVlc1swXTsKKyAgICAgICAgICAgIG1HcmF2aXR5VmVjdG9yWzFdID0gZXZlbnQudmFsdWVzWzFdOworICAgICAgICAgICAgbUdyYXZpdHlWZWN0b3JbMl0gPSBldmVudC52YWx1ZXNbMl07CisgICAgICAgICAgICBnZXRPcmllbnRhdGlvblVzaW5nR2V0Um90YXRpb25NYXRyaXgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgU2Vuc29yLlRZUEVfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICBpZiAobU1hZ25ldGljRmllbGRWZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yID0gbmV3IGZsb2F0WzNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hZ25ldGljRmllbGRWZWN0b3JbMF0gPSBldmVudC52YWx1ZXNbMF07CisgICAgICAgICAgICBtTWFnbmV0aWNGaWVsZFZlY3RvclsxXSA9IGV2ZW50LnZhbHVlc1sxXTsKKyAgICAgICAgICAgIG1NYWduZXRpY0ZpZWxkVmVjdG9yWzJdID0gZXZlbnQudmFsdWVzWzJdOworICAgICAgICAgICAgZ2V0T3JpZW50YXRpb25Vc2luZ0dldFJvdGF0aW9uTWF0cml4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgeworICAgICAgICBhc3NlcnQgV2ViVmlld0NvcmUuVEhSRUFEX05BTUUuZXF1YWxzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvRmluZEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk5ZDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0ZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOworCitjbGFzcyBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjaywgVGV4dFdhdGNoZXIsCisgICAgICAgIFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgRWRpdFRleHQgbUVkaXRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbU1hdGNoZXM7CisgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OworICAgIHByaXZhdGUgSW5wdXRNZXRob2RNYW5hZ2VyIG1JbnB1dDsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgYm9vbGVhbiBtTWF0Y2hlc0ZvdW5kOworICAgIHByaXZhdGUgaW50IG1OdW1iZXJPZk1hdGNoZXM7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKworICAgIEZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2soQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1DdXN0b21WaWV3ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5pbmZsYXRlKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LndlYnZpZXdfZmluZCwgbnVsbCk7CisgICAgICAgIG1FZGl0VGV4dCA9IChFZGl0VGV4dCkgbUN1c3RvbVZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZWRpdCk7CisgICAgICAgIC8vIE92ZXJyaWRlIGxvbmcgY2xpY2sgc28gdGhhdCBzZWxlY3QgQWN0aW9uTW9kZSBpcyBub3Qgb3BlbmVkLCB3aGljaAorICAgICAgICAvLyB3b3VsZCBleGl0IGZpbmQgQWN0aW9uTW9kZS4KKyAgICAgICAgbUVkaXRUZXh0LnNldE9uTG9uZ0NsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIHNldFRleHQoIiIpOworICAgICAgICBtTWF0Y2hlcyA9IChUZXh0VmlldykgbUN1c3RvbVZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubWF0Y2hlcyk7CisgICAgICAgIG1JbnB1dCA9IChJbnB1dE1ldGhvZE1hbmFnZXIpCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOworICAgICAgICBtUmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFRpdGxlQmFyKFZpZXcgdikgeyBtVGl0bGVCYXIgPSB2OyB9CisKKyAgICAvKgorICAgICAqIFBsYWNlIHRleHQgaW4gdGhlIHRleHQgZmllbGQgc28gaXQgY2FuIGJlIHNlYXJjaGVkIGZvci4gIE5lZWQgdG8gcHJlc3MKKyAgICAgKiB0aGUgZmluZCBuZXh0IG9yIGZpbmQgcHJldmlvdXMgYnV0dG9uIHRvIGZpbmQgYWxsIG9mIHRoZSBtYXRjaGVzLgorICAgICAqLworICAgIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICBtRWRpdFRleHQuc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgU3Bhbm5hYmxlIHNwYW4gPSAoU3Bhbm5hYmxlKSBtRWRpdFRleHQuZ2V0VGV4dCgpOworICAgICAgICBpbnQgbGVuZ3RoID0gc3Bhbi5sZW5ndGgoKTsKKyAgICAgICAgLy8gSWRlYWxseSwgd2Ugd291bGQgbGlrZSB0byBzZXQgdGhlIHNlbGVjdGlvbiB0byB0aGUgd2hvbGUgZmllbGQsCisgICAgICAgIC8vIGJ1dCB0aGlzIGJyaW5ncyB1cCB0aGUgVGV4dCBzZWxlY3Rpb24gQ0FCLCB3aGljaCBkaXNtaXNzZXMgdGhpcworICAgICAgICAvLyBvbmUuCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oc3BhbiwgbGVuZ3RoLCBsZW5ndGgpOworICAgICAgICAvLyBOZWNlc3NhcnkgZWFjaCB0aW1lIHdlIHNldCB0aGUgdGV4dCwgc28gdGhhdCB0aGlzIHdpbGwgd2F0Y2gKKyAgICAgICAgLy8gY2hhbmdlcyB0byBpdC4KKyAgICAgICAgc3Bhbi5zZXRTcGFuKHRoaXMsIDAsIGxlbmd0aCwgU3Bhbm5hYmxlLlNQQU5fSU5DTFVTSVZFX0lOQ0xVU0lWRSk7CisgICAgICAgIG1NYXRjaGVzRm91bmQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgV2ViVmlldyB0byBzZWFyY2guICBNdXN0IGJlIG5vbiBudWxsLCBhbmQgc2V0IGJlZm9yZSBjYWxsaW5nCisgICAgICogc3RhcnRBY3Rpb25Nb2RlLgorICAgICAqLworICAgIHZvaWQgc2V0V2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gd2ViVmlldykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJXZWJWaWV3IHN1cHBsaWVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyAiRmluZEFjdGlvbk1vZGVDYWxsYmFjayBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1vdmUgdGhlIGhpZ2hsaWdodCB0byB0aGUgbmV4dCBtYXRjaC4KKyAgICAgKiBAcGFyYW0gbmV4dCBJZiB0cnVlLCBmaW5kIHRoZSBuZXh0IG1hdGNoIGZ1cnRoZXIgZG93biBpbiB0aGUgZG9jdW1lbnQuCisgICAgICogICAgICAgICAgICAgSWYgZmFsc2UsIGZpbmQgdGhlIHByZXZpb3VzIG1hdGNoLCB1cCBpbiB0aGUgZG9jdW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpbmROZXh0KGJvb2xlYW4gbmV4dCkgeworICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiTm8gV2ViVmlldyBmb3IgRmluZEFjdGlvbk1vZGVDYWxsYmFjazo6ZmluZE5leHQiKTsKKyAgICAgICAgfQorICAgICAgICBtV2ViVmlldy5maW5kTmV4dChuZXh0KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEhpZ2hsaWdodCBhbGwgdGhlIGluc3RhbmNlcyBvZiB0aGUgc3RyaW5nIGZyb20gbUVkaXRUZXh0IGluIG1XZWJWaWV3LgorICAgICAqLworICAgIHZvaWQgZmluZEFsbCgpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk5vIFdlYlZpZXcgZm9yIEZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2s6OmZpbmRBbGwiKTsKKyAgICAgICAgfQorICAgICAgICBDaGFyU2VxdWVuY2UgZmluZCA9IG1FZGl0VGV4dC5nZXRUZXh0KCk7CisgICAgICAgIGlmICgwID09IGZpbmQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LmNsZWFyTWF0Y2hlcygpOworICAgICAgICAgICAgbU1hdGNoZXMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbU1hdGNoZXNGb3VuZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1hdGNoZXNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBtTWF0Y2hlcy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtTnVtYmVyT2ZNYXRjaGVzID0gbVdlYlZpZXcuZmluZEFsbChmaW5kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKDAgPT0gbU51bWJlck9mTWF0Y2hlcykgeworICAgICAgICAgICAgICAgIG1NYXRjaGVzLnNldFRleHQobVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5ub19tYXRjaGVzKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZU1hdGNoZXNTdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBzdHJpbmcgd2hpY2ggdGVsbHMgdGhlIHVzZXIgaG93IG1hbnkgbWF0Y2hlcyB3ZXJlIGZvdW5kLCBhbmQKKyAgICAgKiB3aGljaCBtYXRjaCBpcyBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hdGNoZXNTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IG1SZXNvdXJjZXMuZ2V0UXVhbnRpdHlTdHJpbmcoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5wbHVyYWxzLm1hdGNoZXNfZm91bmQsIG1OdW1iZXJPZk1hdGNoZXMsCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuZmluZEluZGV4KCkgKyAxLCBtTnVtYmVyT2ZNYXRjaGVzKTsKKworICAgICAgICBtTWF0Y2hlcy5zZXRUZXh0KHRlbXBsYXRlKTsKKyAgICB9CisKKyAgICAvLyBPbkxvbmdDbGlja0xpc3RlbmVyIGltcGxlbWVudGF0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkxvbmdDbGljayhWaWV3IHYpIHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vIEFjdGlvbk1vZGUuQ2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICBtb2RlLnNldEN1c3RvbVZpZXcobUN1c3RvbVZpZXcpOworICAgICAgICBtb2RlLmdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5tZW51LndlYnZpZXdfZmluZCwKKyAgICAgICAgICAgICAgICBtZW51KTsKKyAgICAgICAgRWRpdGFibGUgZWRpdCA9IG1FZGl0VGV4dC5nZXRUZXh0KCk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oZWRpdCwgZWRpdC5sZW5ndGgoKSk7CisgICAgICAgIG1NYXRjaGVzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbU1hdGNoZXNGb3VuZCA9IGZhbHNlOworICAgICAgICBtTWF0Y2hlcy5zZXRUZXh0KCIwIik7CisgICAgICAgIG1FZGl0VGV4dC5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgbUlucHV0LnNob3dTb2Z0SW5wdXQobUVkaXRUZXh0LCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSBtV2ViVmlldy5zZXRFbWJlZGRlZFRpdGxlQmFyKG1UaXRsZUJhcik7CisgICAgICAgIG1XZWJWaWV3Lm5vdGlmeUZpbmREaWFsb2dEaXNtaXNzZWQoKTsKKyAgICAgICAgbUlucHV0LmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KG1XZWJWaWV3LmdldFdpbmRvd1Rva2VuKCksIDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmICghbU1hdGNoZXNGb3VuZCkgeworICAgICAgICAgICAgZmluZEFsbCgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKGl0ZW0uZ2V0SXRlbUlkKCkpIHsKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5maW5kX3ByZXY6CisgICAgICAgICAgICAgICAgZmluZE5leHQoZmFsc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmZpbmRfbmV4dDoKKyAgICAgICAgICAgICAgICBmaW5kTmV4dCh0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZU1hdGNoZXNTdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVGV4dFdhdGNoZXIgaW1wbGVtZW50YXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFmdGVyKSB7CisgICAgICAgIC8vIERvZXMgbm90aGluZy4gIE5lZWRlZCB0byBpbXBsZW1lbnQgVGV4dFdhdGNoZXIuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgZmluZEFsbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAvLyBEb2VzIG5vdGhpbmcuICBOZWVkZWQgdG8gaW1wbGVtZW50IFRleHRXYXRjaGVyLgorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0dlb2xvY2F0aW9uU2VydmljZS5qYXZhCmluZGV4IDI0MzA2ZjQuLjkxZGUxZDggMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9HZW9sb2NhdGlvblNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvR2VvbG9jYXRpb25TZXJ2aWNlLmphdmEKQEAgLTQ1LDE0ICs0NSwxMyBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmcm9tIHdoaWNoIHdlIG9idGFpbiB0aGUgc3lzdGVtIHNlcnZpY2UuCiAgICAgICogQHBhcmFtIG5hdGl2ZU9iamVjdCBUaGUgbmF0aXZlIG9iamVjdCB0byB3aGljaCB0aGlzIG9iamVjdCB3aWxsIHJlcG9ydCBwb3NpdGlvbiB1cGRhdGVzIGFuZAogICAgICAqICAgICBlcnJvcnMuCiAgICAgICovCi0gICAgcHVibGljIEdlb2xvY2F0aW9uU2VydmljZShsb25nIG5hdGl2ZU9iamVjdCkgeworICAgIHB1YmxpYyBHZW9sb2NhdGlvblNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBsb25nIG5hdGl2ZU9iamVjdCkgewogICAgICAgICBtTmF0aXZlT2JqZWN0ID0gbmF0aXZlT2JqZWN0OwogICAgICAgICAvLyBSZWdpc3RlciBuZXdMb2NhdGlvbkF2YWlsYWJsZSB3aXRoIHBsYXRmb3JtIHNlcnZpY2UuCi0gICAgICAgIEFjdGl2aXR5VGhyZWFkIHRocmVhZCA9IEFjdGl2aXR5VGhyZWFkLnN5c3RlbU1haW4oKTsKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gdGhyZWFkLmdldEFwcGxpY2F0aW9uKCk7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIgPSAoTG9jYXRpb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKICAgICAgICAgaWYgKG1Mb2NhdGlvbk1hbmFnZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGdldCBsb2NhdGlvbiBtYW5hZ2VyLiIpOwpAQCAtNjIsOSArNjEsMTAgQEAKICAgICAvKioKICAgICAgKiBTdGFydCBsaXN0ZW5pbmcgZm9yIGxvY2F0aW9uIHVwZGF0ZXMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CiAgICAgICAgIHJlZ2lzdGVyRm9yTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgIG1Jc1J1bm5pbmcgPSB0cnVlOworICAgICAgICByZXR1cm4gbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlIHx8IG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlOwogICAgIH0KIAogICAgIC8qKgpAQCAtODcsNiArODcsOCBAQAogICAgICAgICAgICAgICAgIC8vIG9ubHkgdW5yZWdpc3RlciBmcm9tIGFsbCwgdGhlbiByZXJlZ2lzdGVyIHdpdGggYWxsIGJ1dCB0aGUgR1BTLgogICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcm9tTG9jYXRpb25VcGRhdGVzKCk7CiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGb3JMb2NhdGlvblVwZGF0ZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwcm92aWRlcnMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhZnRlciB3ZSByZS1yZWdpc3Rlci4KKyAgICAgICAgICAgICAgICBtYXliZVJlcG9ydEVycm9yKCJUaGUgbGFzdCBsb2NhdGlvbiBwcm92aWRlciBpcyBubyBsb25nZXIgYXZhaWxhYmxlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTYsMTEgKzE1OCwxNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckZvckxvY2F0aW9uVXBkYXRlcygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuTkVUV09SS19QUk9WSURFUiwgMCwgMCwgdGhpcyk7Ci0gICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgLy8gUmVnaXN0cmF0aW9uIG1heSBmYWlsIGlmIHByb3ZpZGVycyBhcmUgbm90IHByZXNlbnQgb24gdGhlIGRldmljZS4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5ORVRXT1JLX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtSXNOZXR3b3JrUHJvdmlkZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICBpZiAobUlzR3BzRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcyhMb2NhdGlvbk1hbmFnZXIuR1BTX1BST1ZJREVSLCAwLCAwLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZXF1ZXN0TG9jYXRpb25VcGRhdGVzKExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsIDAsIDAsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtSXNHcHNQcm92aWRlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2goU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2F1Z2h0IHNlY3VyaXR5IGV4Y2VwdGlvbiByZWdpc3RlcmluZyBmb3IgbG9jYXRpb24gdXBkYXRlcyBmcm9tIHN5c3RlbS4gIiArCkBAIC0xNzMsNiArMTgwLDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckZyb21Mb2NhdGlvblVwZGF0ZXMoKSB7CiAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVtb3ZlVXBkYXRlcyh0aGlzKTsKKyAgICAgICAgbUlzTmV0d29ya1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIG1Jc0dwc1Byb3ZpZGVyQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVBdWRpby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkyODgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1QXVkaW8uamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyLk9uQ29tcGxldGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25TZWVrQ29tcGxldGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisvKioKKyAqIDxwPkhUTUw1IHN1cHBvcnQgY2xhc3MgZm9yIEF1ZGlvLgorICovCitjbGFzcyBIVE1MNUF1ZGlvIGV4dGVuZHMgSGFuZGxlcgorICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUGxheWVyLk9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyLk9uUHJlcGFyZWRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllci5PblNlZWtDb21wbGV0ZUxpc3RlbmVyIHsKKyAgICAvLyBMb2dnaW5nIHRhZy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIkhUTUw1QXVkaW8iOworCisgICAgcHJpdmF0ZSBNZWRpYVBsYXllciBtTWVkaWFQbGF5ZXI7CisKKyAgICAvLyBUaGUgQysrIE1lZGlhUGxheWVyUHJpdmF0ZUFuZHJvaWQgb2JqZWN0LgorICAgIHByaXZhdGUgaW50IG1OYXRpdmVQb2ludGVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElETEUgICAgICAgID0gIDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IElOSVRJQUxJWkVEID0gIDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBSRVBBUkVEICAgID0gIDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgICAgID0gIDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IENPTVBMRVRFICAgID0gIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFBBVVNFRCAgICAgID0gIDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUT1BQRUQgICAgID0gLTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUk9SICAgICAgID0gLTE7CisKKyAgICBwcml2YXRlIGludCBtU3RhdGUgPSBJRExFOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVVybDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUFza1RvUGxheSA9IGZhbHNlOworCisgICAgLy8gVGltZXIgdGhyZWFkIC0+IFVJIHRocmVhZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FVVBEQVRFID0gMTAwOworCisgICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgdGltZXIgc2hvdWxkIGZpcmUgZXZlcnkgMjUwIG1zIG9yIGxlc3MuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVVUERBVEVfUEVSSU9EID0gMjUwOyAgLy8gbXMKKyAgICAvLyBUaGUgdGltZXIgZm9yIHRpbWV1cGF0ZSBldmVudHMuCisgICAgLy8gU2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2V2ZW50LW1lZGlhLXRpbWV1cGRhdGUKKyAgICBwcml2YXRlIFRpbWVyIG1UaW1lcjsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFRpbWV1cGRhdGVUYXNrIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgSFRNTDVBdWRpby50aGlzLm9idGFpbk1lc3NhZ2UoVElNRVVQREFURSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgVElNRVVQREFURTogeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRVJST1IgJiYgbU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUocG9zaXRpb24sIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGV2ZW50IGxpc3RlbmVycyBmb3IgTWVkaWFQbGF5ZXIKKyAgICAvLyBUaG9zZSBhcmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgdGhyZWFkIHdlIGNyZWF0ZWQgdGhlIE1lZGlhUGxheWVyCisgICAgLy8gKGkuZS4gdGhlIHdlYnZpZXdjb3JlIHRocmVhZCBoZXJlKQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcgorICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyIG1wLCBpbnQgcGVyY2VudCkgeworICAgICAgICBuYXRpdmVPbkJ1ZmZlcmluZyhwZXJjZW50LCBtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25Db21wbGV0aW9uTGlzdGVuZXI7CisgICAgcHVibGljIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyIG1wKSB7CisgICAgICAgIHJlc2V0TWVkaWFQbGF5ZXIoKTsKKyAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgbmF0aXZlT25FbmRlZChtTmF0aXZlUG9pbnRlcik7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25FcnJvckxpc3RlbmVyCisgICAgcHVibGljIGJvb2xlYW4gb25FcnJvcihNZWRpYVBsYXllciBtcCwgaW50IHdoYXQsIGludCBleHRyYSkgeworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWVkaWFQbGF5ZXIuT25QcmVwYXJlZExpc3RlbmVyCisgICAgcHVibGljIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllciBtcCkgeworICAgICAgICBtU3RhdGUgPSBQUkVQQVJFRDsKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuc2NoZWR1bGUobmV3IFRpbWV1cGRhdGVUYXNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVVQREFURV9QRVJJT0QsIFRJTUVVUERBVEVfUEVSSU9EKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVPblByZXBhcmVkKG1wLmdldER1cmF0aW9uKCksIDAsIDAsIG1OYXRpdmVQb2ludGVyKTsKKyAgICAgICAgaWYgKG1Bc2tUb1BsYXkpIHsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSBmYWxzZTsKKyAgICAgICAgICAgIHBsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1lZGlhUGxheWVyLk9uU2Vla0NvbXBsZXRlTGlzdGVuZXIKKyAgICBwdWJsaWMgdm9pZCBvblNlZWtDb21wbGV0ZShNZWRpYVBsYXllciBtcCkgeworICAgICAgICBuYXRpdmVPblRpbWV1cGRhdGUobXAuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1OYXRpdmVQb2ludGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYXRpdmVQdHIgaXMgdGhlIEMrKyBwb2ludGVyIHRvIHRoZSBNZWRpYVBsYXllclByaXZhdGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIVE1MNUF1ZGlvKGludCBuYXRpdmVQdHIpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgbmF0aXZlIHB0cgorICAgICAgICBtTmF0aXZlUG9pbnRlciA9IG5hdGl2ZVB0cjsKKyAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldE1lZGlhUGxheWVyKCkgeworICAgICAgICBpZiAobU1lZGlhUGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uQnVmZmVyaW5nVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NZWRpYVBsYXllci5zZXRPbkNvbXBsZXRpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uRXJyb3JMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uUHJlcGFyZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldERhdGFTb3VyY2UoU3RyaW5nIHVybCkgeworICAgICAgICBtVXJsID0gdXJsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJRExFKSB7CisgICAgICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UodXJsKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmVBc3luYygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJjb3VsZG4ndCBsb2FkIHRoZSByZXNvdXJjZTogIiArIHVybCArICIgZXhjOiAiICsgZSk7CisgICAgICAgICAgICByZXNldE1lZGlhUGxheWVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheSgpIHsKKyAgICAgICAgaWYgKChtU3RhdGUgPT0gRVJST1IgfHwgbVN0YXRlID09IElETEUpICYmIG1VcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzZXRNZWRpYVBsYXllcigpOworICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShtVXJsKTsKKyAgICAgICAgICAgIG1Bc2tUb1BsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdGF0ZSA+PSBQUkVQQVJFRCkgeworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhdXNlKCkgeworICAgICAgICBpZiAobVN0YXRlID09IFNUQVJURUQpIHsKKyAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBQQVVTRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VlayhpbnQgbXNlYykgeworICAgICAgICBpZiAobVN0YXRlID49IFBSRVBBUkVEKSB7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKG1zZWMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlYXJkb3duKCkgeworICAgICAgICBtTWVkaWFQbGF5ZXIucmVsZWFzZSgpOworICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgbU5hdGl2ZVBvaW50ZXIgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0TWF4VGltZVNlZWthYmxlKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkgLyAxMDAwLjBmOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25CdWZmZXJpbmcoaW50IHBlcmNlbnQsIGludCBuYXRpdmVQb2ludGVyKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZU9uRW5kZWQoaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25QcmVwYXJlZChpbnQgZHVyYXRpb24sIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5hdGl2ZVBvaW50ZXIpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlT25UaW1ldXBkYXRlKGludCBwb3NpdGlvbiwgaW50IG5hdGl2ZVBvaW50ZXIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0pXZWJDb3JlSmF2YUJyaWRnZS5qYXZhCmluZGV4IGU3NjY2OTMuLjkwODUyNmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9KV2ViQ29yZUphdmFCcmlkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSldlYkNvcmVKYXZhQnJpZGdlLmphdmEKQEAgLTE2LDEwICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBmaW5hbCBjbGFzcyBKV2ViQ29yZUphdmFCcmlkZ2UgZXh0ZW5kcyBIYW5kbGVyIHsKQEAgLTQ0LDE3ICs0NywyMSBAQAogCiAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgbWFpbiBXZWJWaWV3IGF0dGFjaGVkIHRvIHRoZSBjdXJyZW50IHdpbmRvdyBzbyB0aGF0IHdlCiAgICAgLy8gY2FuIGdldCB0aGUgcHJvcGVyIENvbnRleHQuCi0gICAgcHJpdmF0ZSBXZWJWaWV3IG1DdXJyZW50TWFpbldlYlZpZXc7CisgICAgcHJpdmF0ZSBzdGF0aWMgV2Vha1JlZmVyZW5jZTxXZWJWaWV3PiBzQ3VycmVudE1haW5XZWJWaWV3ID0KKyAgICAgICAgICAgIG5ldyBXZWFrUmVmZXJlbmNlPFdlYlZpZXc+KG51bGwpOwogCiAgICAgLyogcGFja2FnZSAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVGUkVTSF9QTFVHSU5TID0gMTAwOwogCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXA7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSldlYkNvcmVKYXZhQnJpZGdlIHRvIGludGVyZmFjZSB3aXRoCiAgICAgICogV2ViQ29yZSB0aW1lcnMgYW5kIGNvb2tpZXMuCiAgICAgICovCiAgICAgcHVibGljIEpXZWJDb3JlSmF2YUJyaWRnZSgpIHsKICAgICAgICAgbmF0aXZlQ29uc3RydWN0b3IoKTsKKwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNjIsMjAgKzY5LDIwIEBACiAgICAgICAgIG5hdGl2ZUZpbmFsaXplKCk7CiAgICAgfQogCi0gICAgc3luY2hyb25pemVkIHZvaWQgc2V0QWN0aXZlV2ViVmlldyhXZWJWaWV3IHdlYnZpZXcpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50TWFpbldlYlZpZXcgIT0gbnVsbCkgeworICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgeworICAgICAgICBpZiAoc0N1cnJlbnRNYWluV2ViVmlldy5nZXQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSBpZiB0aGVyZSBpcyBhIHN1Yi1XZWJWaWV3LiBEbyBub3RoaW5nLgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50TWFpbldlYlZpZXcgPSB3ZWJ2aWV3OworICAgICAgICBzQ3VycmVudE1haW5XZWJWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8V2ViVmlldz4od2Vidmlldyk7CiAgICAgfQogCi0gICAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQWN0aXZlV2ViVmlldyhXZWJWaWV3IHdlYnZpZXcpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50TWFpbldlYlZpZXcgIT0gd2VidmlldykgeworICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBY3RpdmVXZWJWaWV3KFdlYlZpZXcgd2VidmlldykgeworICAgICAgICBpZiAoc0N1cnJlbnRNYWluV2ViVmlldy5nZXQoKSAhPSB3ZWJ2aWV3KSB7CiAgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSBpZiB0aGVyZSBpcyBhIHN1Yi1XZWJWaWV3LiBEbyBub3RoaW5nLgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50TWFpbldlYlZpZXcgPSBudWxsOworICAgICAgICBzQ3VycmVudE1haW5XZWJWaWV3LmNsZWFyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTYsMTcgKzI2Myw0MCBAQAogCiAgICAgc3luY2hyb25pemVkIHByaXZhdGUgU3RyaW5nIGdldFNpZ25lZFB1YmxpY0tleShpbnQgaW5kZXgsIFN0cmluZyBjaGFsbGVuZ2UsCiAgICAgICAgICAgICBTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudE1haW5XZWJWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgV2ViVmlldyBjdXJyZW50ID0gc0N1cnJlbnRNYWluV2ViVmlldy5nZXQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gZ2VuZXJhdGVLZXlQYWlyIGV4cGVjdHMgb3JnYW5pemF0aW9ucyB3aGljaCB3ZSBkb24ndCBoYXZlLiBJZ25vcmUKICAgICAgICAgICAgIC8vIHVybC4KICAgICAgICAgICAgIHJldHVybiBDZXJ0VG9vbC5nZXRTaWduZWRQdWJsaWNLZXkoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWFpbldlYlZpZXcuZ2V0Q29udGV4dCgpLCBpbmRleCwgY2hhbGxlbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRDb250ZXh0KCksIGluZGV4LCBjaGFsbGVuZ2UpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiVGhlcmUgaXMgbm8gYWN0aXZlIFdlYlZpZXcgZm9yIGdldFNpZ25lZFB1YmxpY0tleSIpOwogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gQ2FsbGVkIG9uIHRoZSBXZWJDb3JlIHRocmVhZCB0aHJvdWdoIEpOSS4KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZVBhdGhGb3JDb250ZW50VXJpKFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhaWxzYWZlIGZhbGxiYWNrIHRvIGp1c3QgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudC4KKyAgICAgICAgLy8gKFNlZSBPcGVuYWJsZUNvbHVtbnMgZG9jdW1lbnRhdGlvbiBpbiB0aGUgU0RLKQorICAgICAgICBVcmkgalVyaSA9IFVyaS5wYXJzZSh1cmkpOworICAgICAgICByZXR1cm4galVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZUZpbGVQYXRoRm9yQ29udGVudFVyaShTdHJpbmcgcGF0aCwgU3RyaW5nIGNvbnRlbnRVcmkpIHsKKyAgICAgICAgaWYgKG1Db250ZW50VXJpVG9GaWxlUGF0aE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGVudFVyaVRvRmlsZVBhdGhNYXAucHV0KGNvbnRlbnRVcmksIHBhdGgpOworICAgIH0KKwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlQ29uc3RydWN0b3IoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZpbmFsaXplKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzaGFyZWRUaW1lckZpcmVkKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTG9hZExpc3RlbmVyLmphdmEKaW5kZXggZTZmYTQwNS4uNWIyNTZmMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0xvYWRMaXN0ZW5lci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Mb2FkTGlzdGVuZXIuamF2YQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAgcHJpdmF0ZSBSZXF1ZXN0SGFuZGxlIG1SZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgUmVxdWVzdEhhbmRsZSBtU3NsRXJyb3JSZXF1ZXN0SGFuZGxlOwogICAgIHByaXZhdGUgbG9uZyAgICAgbVBvc3RJZGVudGlmaWVyOworICAgIHByaXZhdGUgYm9vbGVhbiAgbVNldE5hdGl2ZVJlc3BvbnNlOwogCiAgICAgLy8gUmVxdWVzdCBkYXRhLiBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gd2UgYXJlIGRvaW5nIGEgbG9hZCBmcm9tIHRoZQogICAgIC8vIGNhY2hlLiBJdCBpcyBuZWVkZWQgaWYgdGhlIGNhY2hlIHJldHVybnMgYSByZWRpcmVjdApAQCAtMTgxLDYgKzE4Miw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTmF0aXZlTG9hZGVyKCkgewogICAgICAgICBzTmF0aXZlTG9hZGVyQ291bnQgLT0gMTsKICAgICAgICAgbU5hdGl2ZUxvYWRlciA9IDA7CisgICAgICAgIG1TZXROYXRpdmVSZXNwb25zZSA9IGZhbHNlOwogICAgIH0KIAogICAgIC8qCkBAIC0xMDg2LDEzICsxMDg4LDE4IEBACiAgICAgICAgIC8vIHJlcXVlc3Qgd2l0aCBzb21lIGNyZWRlbnRpYWxzIHRoZW4gZG9uJ3QgY29tbWl0IHRoZSBoZWFkZXJzCiAgICAgICAgIC8vIG9mIHRoaXMgcmVzcG9uc2U7IHdhaXQgZm9yIHRoZSByZXNwb25zZSB0byB0aGUgcmVxdWVzdCB3aXRoIHRoZQogICAgICAgICAvLyBjcmVkZW50aWFscy4KLSAgICAgICAgaWYgKG1BdXRoSGVhZGVyICE9IG51bGwpCisgICAgICAgIGlmIChtQXV0aEhlYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgICAgICAvLyBDb21taXQgdGhlIGhlYWRlcnMgdG8gV2ViQ29yZQorICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXROYXRpdmVSZXNwb25zZSgpIHsKICAgICAgICAgaW50IG5hdGl2ZVJlc3BvbnNlID0gY3JlYXRlTmF0aXZlUmVzcG9uc2UoKTsKICAgICAgICAgLy8gVGhlIG5hdGl2ZSBjb2RlIGRlbGV0ZXMgdGhlIG5hdGl2ZSByZXNwb25zZSBvYmplY3QuCiAgICAgICAgIG5hdGl2ZVJlY2VpdmVkUmVzcG9uc2UobmF0aXZlUmVzcG9uc2UpOworICAgICAgICBtU2V0TmF0aXZlUmVzcG9uc2UgPSB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEyNyw2ICsxMTM0LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY29tbWl0TG9hZCgpIHsKICAgICAgICAgaWYgKG1DYW5jZWxsZWQpIHJldHVybjsKKyAgICAgICAgaWYgKCFtU2V0TmF0aXZlUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHNldE5hdGl2ZVJlc3BvbnNlKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobUlzTWFpblBhZ2VMb2FkZXIpIHsKICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gc0NlcnRpZmljYXRlVHlwZU1hcC5nZXQobU1pbWVUeXBlKTsKQEAgLTExOTcsNiArMTIwNywxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtTmF0aXZlTG9hZGVyICE9IDApIHsKICAgICAgICAgICAgIFBlcmZDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGVyZkNoZWNrZXIoKTsKKyAgICAgICAgICAgIGlmICghbVNldE5hdGl2ZVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgIGNoZWNrZXIucmVzcG9uc2VBbGVydCgicmVzIG5hdGl2ZUZpbmlzaGVkIik7CiAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpAQCAtMTMxMiw2ICsxMzI2LDkgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IG1Db250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLm9wZW5fcGVybWlzc2lvbl9kZW55KQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iICsgcmVkaXJlY3RUbzsKKyAgICAgICAgICAgICAgICBpZiAoIW1TZXROYXRpdmVSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYXRpdmVBZGREYXRhKHRleHQuZ2V0Qnl0ZXMoKSwgdGV4dC5sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgbmF0aXZlRmluaXNoZWQoKTsKICAgICAgICAgICAgICAgICBjbGVhck5hdGl2ZUxvYWRlcigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L01pbWVUeXBlTWFwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQppbmRleCBjMWFjMTgwLi5mMDAwMDViIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTWltZVR5cGVNYXAuamF2YQpAQCAtMTYsMzUgKzE2LDIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGxpYmNvcmUubmV0Lk1pbWVVdGlsczsKIAogLyoqCiAgKiBUd28td2F5IG1hcCB0aGF0IG1hcHMgTUlNRS10eXBlcyB0byBmaWxlIGV4dGVuc2lvbnMgYW5kIHZpY2UgdmVyc2EuCisgKgorICogPHA+U2VlIGFsc28ge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb24jZ3Vlc3NDb250ZW50VHlwZUZyb21OYW1lfQorICogYW5kIHtAbGluayBqYXZhLm5ldC5VUkxDb25uZWN0aW9uI2d1ZXNzQ29udGVudFR5cGVGcm9tU3RyZWFtfS4gVGhpcworICogY2xhc3MgYW5kIHtAY29kZSBVUkxDb25uZWN0aW9ufSBzaGFyZSB0aGUgc2FtZSBNSU1FLXR5cGUgZGF0YWJhc2UuCiAgKi8KIHB1YmxpYyBjbGFzcyBNaW1lVHlwZU1hcCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWltZVR5cGVNYXAgc01pbWVUeXBlTWFwID0gbmV3IE1pbWVUeXBlTWFwKCk7CiAKLSAgICAvKioKLSAgICAgKiBTaW5nbGV0b24gTUlNRS10eXBlIG1hcCBpbnN0YW5jZToKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBNaW1lVHlwZU1hcCBzTWltZVR5cGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBNSU1FLXR5cGUgdG8gZmlsZSBleHRlbnNpb24gbWFwcGluZzoKLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwOwotCi0gICAgLyoqCi0gICAgICogRmlsZSBleHRlbnNpb24gdG8gTUlNRSB0eXBlIG1hcHBpbmc6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgTUlNRS10eXBlIG1hcC4KLSAgICAgKi8KICAgICBwcml2YXRlIE1pbWVUeXBlTWFwKCkgewotICAgICAgICBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTUsNyArNDIsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIHRoZSBnaXZlbiB1cmwuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbkZyb21VcmwoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHVybCkpIHsKICAgICAgICAgICAgIGludCBxdWVyeSA9IHVybC5sYXN0SW5kZXhPZignPycpOwogICAgICAgICAgICAgaWYgKHF1ZXJ5ID4gMCkgewogICAgICAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgcXVlcnkpOwpAQCAtNjYsNyArNTMsNyBAQAogCiAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsZW5hbWUgY29udGFpbnMgc3BlY2lhbCBjaGFyYWN0ZXJzLCB3ZSBkb24ndAogICAgICAgICAgICAgLy8gY29uc2lkZXIgaXQgdmFsaWQgZm9yIG91ciBtYXRjaGluZyBwdXJwb3NlczoKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IDAgJiYKKyAgICAgICAgICAgIGlmICghZmlsZW5hbWUuaXNFbXB0eSgpICYmCiAgICAgICAgICAgICAgICAgUGF0dGVybi5tYXRjaGVzKCJbYS16QS1aXzAtOVxcLlxcLVxcKFxcKVxcJV0rIiwgZmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaW50IGRvdFBvcyA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgICAgICAgaWYgKDAgPD0gZG90UG9zKSB7CkBAIC03OSwzNiArNjYsMTIgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIGFuIGVudHJ5IGludG8gdGhlIG1hcC4gVGhpcyBkb2VzIG5vdCBjaGVjayBpZiB0aGUgaXRlbSBhbHJlYWR5Ci0gICAgICogZXhpc3RzLCBpdCB0cnVzdHMgdGhlIGNhbGxlciEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEVudHJ5KFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICAvLwotICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIHggLS0+IHkgbWFwcGluZywgd2UgZG8gbm90IHdhbnQgdG8KLSAgICAgICAgLy8gb3ZlcnJpZGUgaXQgd2l0aCBhbm90aGVyIG1hcHBpbmcgeCAtLT4gPwotICAgICAgICAvLyB0aGlzIGlzIG1vc3RseSBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIG1pbWUtdHlwZSBtYXAgYmVsb3cKLSAgICAgICAgLy8gaXMgY29uc3RydWN0ZWQgKGlmIGEgbWltZSB0eXBlIG1hcHMgdG8gc2V2ZXJhbCBleHRlbnNpb25zCi0gICAgICAgIC8vIHRoZSBmaXJzdCBleHRlbnNpb24gaXMgY29uc2lkZXJlZCB0aGUgbW9zdCBwb3B1bGFyIGFuZCBpcwotICAgICAgICAvLyBhZGRlZCBmaXJzdDsgd2UgZG8gbm90IHdhbnQgdG8gb3ZlcndyaXRlIGl0IGxhdGVyKS4KLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCFtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXh0ZW5zaW9uTWFwLnB1dChtaW1lVHlwZSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FeHRlbnNpb25Ub01pbWVUeXBlTWFwLnB1dChleHRlbnNpb24sIG1pbWVUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gTUlNRSB0eXBlIGhhcyBhbiBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqIEBwYXJhbSBtaW1lVHlwZSBBIE1JTUUgdHlwZSAoaS5lLiB0ZXh0L3BsYWluKQogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYSBtaW1lVHlwZSBlbnRyeSBpbiB0aGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiBtaW1lVHlwZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtTWltZVR5cGVUb0V4dGVuc2lvbk1hcC5jb250YWluc0tleShtaW1lVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuaGFzTWltZVR5cGUobWltZVR5cGUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE3LDE2ICs4MCwxMiBAQAogICAgICAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbiBvciBudWxsIGlmZiB0aGVyZSBpcyBub25lLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5nZXQoZXh0ZW5zaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzTWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CiAgICAgfQogCiAgICAgLy8gU3RhdGljIG1ldGhvZCBjYWxsZWQgYnkgam5pLgogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtaW1lVHlwZUZyb21FeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0U2luZ2xldG9uKCkuZ2V0TWltZVR5cGVGcm9tRXh0ZW5zaW9uKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBNaW1lVXRpbHMuZ3Vlc3NNaW1lVHlwZUZyb21FeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNSwxMCArOTQsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZmYgdGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGVudHJ5IGluIHRoZSBtYXAuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uVG9NaW1lVHlwZU1hcC5jb250YWluc0tleShleHRlbnNpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE1pbWVVdGlscy5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OSwxMSArMTA1LDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBNSU1FIHR5cGUgb3IgbnVsbCBpZmYgdGhlcmUgaXMgbm9uZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbkZyb21NaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1pbWVUeXBlVG9FeHRlbnNpb25NYXAuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gTWltZVV0aWxzLmd1ZXNzRXh0ZW5zaW9uRnJvbU1pbWVUeXBlKG1pbWVUeXBlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MSwzNjMgKzExMyw2IEBACiAgICAgICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBNSU1FLXR5cGUgbWFwLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTWltZVR5cGVNYXAgZ2V0U2luZ2xldG9uKCkgewotICAgICAgICBpZiAoc01pbWVUeXBlTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcCA9IG5ldyBNaW1lVHlwZU1hcCgpOwotCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGJhc2VkIG9uIC9ldGMvbWltZS50eXBlcyBkYXRhIG1pbnVzCi0gICAgICAgICAgICAvLyBjaGVtaWNhbC8qIE1JTUUgdHlwZXMgYW5kIE1JTUUgdHlwZXMgdGhhdCBkb24ndCBtYXAgdG8gYW55Ci0gICAgICAgICAgICAvLyBmaWxlIGV4dGVuc2lvbnMuIFdlIGFsc28gZXhjbHVkZSB0b3AtbGV2ZWwgZG9tYWluIG5hbWVzIHRvCi0gICAgICAgICAgICAvLyBkZWFsIHdpdGggY2FzZXMgbGlrZToKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBtYWlsLmdvb2dsZS5jb20vYS9nb29nbGUuY29tCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gYW5kICJhY3RpdmUiIE1JTUUgdHlwZXMgKGR1ZSB0byBwb3RlbnRpYWwgc2VjdXJpdHkgaXNzdWVzKS4KLQotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vYW5kcmV3LWluc2V0IiwgImV6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9kc3B0eXBlIiwgInRzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vaHRhIiwgImh0YSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIiwgImhxeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm8iLCAiY3B0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYSIsICJuYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vbXNhY2Nlc3MiLCAibWRiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZGEiLCAib2RhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9vZ2ciLCAib2dnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZGYiLCAicGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9wZ3Ata2V5cyIsICJrZXkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiLCAicGdwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzIiwgInByZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmFyIiwgInJhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vcmRmK3htbCIsICJyZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3Jzcyt4bWwiLCAicnNzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi96aXAiLCAiemlwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmUiLCAKLSAgICAgICAgICAgICAgICAgICAgImFwayIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEiLCAiY2R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCIsICJzdGwiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIiwgIm9kYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIsICJvZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzIiwgIm9kZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSIsICJvZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0IiwgIm9kcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAib3RzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0IiwgIm9kdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXIiLCAib2RtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIiwgIm90dCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWIiLCAib3RoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi9tc3dvcmQiLCAiZG90Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAiZG9jeCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgImRvdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsICJ4bHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCIsCi0gICAgICAgICAgICAgICAgICAgICJ4bHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiLAotICAgICAgICAgICAgICAgICAgICAieGx0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHB0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsICJwb3QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwgInBwcyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICAgICAicHB0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICJwb3R4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyIsCi0gICAgICAgICAgICAgICAgICAgICJwcHN4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQucmltLmNvZCIsICJjb2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zbWFmIiwgIm1tZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5jYWxjIiwgInNkYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3IiwgInNkYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyIsICJzZGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3MiLCAic2RwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgiLCAic21mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciIsCi0gICAgICAgICAgICAgICAgICAgICJzZHciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInZvciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyLWdsb2JhbCIsICJzZ2wiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMiLCAic3hjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSIsICJzdGMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXciLCAic3hkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSIsICJzdGQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MiLCAic3hpIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZSIsICJzdGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgiLCAic3htIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIiLCAic3h3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbCIsICJzeGciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUiLCAic3R3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi92bmQudmlzaW8iLCAidnNkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFiaXdvcmQiLCAiYWJ3Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWFwcGxlLWRpc2tpbWFnZSIsICJkbWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYmNwaW8iLCAiYmNwaW8iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtYml0dG9ycmVudCIsICJ0b3JyZW50Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNkZiIsICJjZGYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtY2RsaW5rIiwgInZjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1jaGVzcy1wZ24iLCAicGduIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWNwaW8iLCAiY3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kZWJpYW4tcGFja2FnZSIsICJkZWIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UiLCAidWRlYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkY3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZGlyZWN0b3IiLCAiZGlyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRpcmVjdG9yIiwgImR4ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1kbXMiLCAiZG1zIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWRvb20iLCAid2FkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWR2aSIsICJkdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZmxhYyIsICJmbGFjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZhIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGZiIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAiZ3NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWZvbnQiLCAicGNmLloiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnJlZW1pbmQiLCAibW0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoIiwgInNwbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nbnVtZXJpYyIsICJnbnVtZXJpYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1nby1zZ2YiLCAic2dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWdyYXBoaW5nLWNhbGN1bGF0b3IiLCAiZ2NmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAiZ3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRneiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1ndGFyIiwgInRheiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1oZGYiLCAiaGRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWljYSIsICJpY2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaW50ZXJuZXQtc2lnbnVwIiwgImlucyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAiLCAiaXNwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWlwaG9uZSIsICJpaWkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtaXNvOTY2MC1pbWFnZSIsICJpc28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtam1vbCIsICJqbXoiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2NoYXJ0IiwgImNocnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta2lsbHVzdHJhdG9yIiwgImtpbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rb2FuIiwgInNrbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rcHJlc2VudGVyIiwgImtwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rc3ByZWFkIiwgImtzcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1rd29yZCIsICJrd2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gta3dvcmQiLCAia3d0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxhdGV4IiwgImxhdGV4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LWxoYSIsICJsaGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbHpoIiwgImx6aCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1sengiLCAibHp4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZybSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJtYWtlciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmcmFtZSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJmYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tYWtlciIsICJib29rIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1ha2VyIiwgImZiZG9jIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1pZiIsICJtaWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbXMtd21kIiwgIndtZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1tcy13bXoiLCAid216Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LW1zaSIsICJtc2kiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbnMtcHJveHktYXV0b2NvbmZpZyIsICJwYWMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtbndjIiwgIm53YyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vYmplY3QiLCAibyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1vei1hcHBsaWNhdGlvbiIsICJvemEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczEyIiwgInAxMiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcCIsICJwN3IiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtcGtjczctY3JsIiwgImNybCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1xdWlja3RpbWVwbGF5ZXIiLCAicXRsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXNoYXIiLCAic2hhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giLCAic3dmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN0dWZmaXQiLCAic2l0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXN2NGNwaW8iLCAic3Y0Y3BpbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC1zdjRjcmMiLCAic3Y0Y3JjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRhciIsICJ0YXIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdGV4aW5mbyIsICJ0ZXhpbmZvIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRleGluZm8iLCAidGV4aSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC10cm9mZiIsICJ0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXRyb2ZmIiwgInJvZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIiwgIm1hbiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC11c3RhciIsICJ1c3RhciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSIsICJzcmMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2luZ3oiLCAid3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gtd2ViYXJjaGl2ZSIsICJ3ZWJhcmNoaXZlIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCIsICJjcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteDUwOS11c2VyLWNlcnQiLCAiY3J0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhcHBsaWNhdGlvbi94LXhjZiIsICJ4Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3gteGZpZyIsICJmaWciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJ4aHRtbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vM2dwcCIsICIzZ3BwIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9hbXIiLCAiYW1yIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAibWlkIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgIm1pZGkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21pZGkiLCAia2FyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9taWRpIiwgInhtZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbW9iaWxlLXhtZiIsICJteG1mIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXBlZ2EiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWciLCAibXAyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9tcGVnIiwgIm1wMyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8vbXBlZyIsICJtNGEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL21wZWd1cmwiLCAibTN1Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby9wcnMuc2lkIiwgInNpZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1haWZmIiwgImFpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtYWlmZiIsICJhaWZjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LWdzbSIsICJnc20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtbXMtd21hIiwgIndtYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1tcy13YXgiLCAid2F4Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJyYSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1wbi1yZWFsYXVkaW8iLCAicm0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIiwgInJhbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiYXVkaW8veC1yZWFsYXVkaW8iLCAicmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtc2NwbHMiLCAicGxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJhdWRpby94LXNkMiIsICJzZDIiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImF1ZGlvL3gtd2F2IiwgIndhdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvYm1wIiwgImJtcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvZ2lmIiwgImdpZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImN1ciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWNvIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvaWVmIiwgImllZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9qcGVnIiwgImpwZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvanBlZyIsICJqcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BjeCIsICJwY3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3BuZyIsICJwbmciKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3N2Zyt4bWwiLCAic3ZnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS9zdmcreG1sIiwgInN2Z3oiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3RpZmYiLCAidGlmZiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UvdGlmZiIsICJ0aWYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdnUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3ZuZC5kanZ1IiwgImRqdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2Uvdm5kLndhcC53Ym1wIiwgIndibXAiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY211LXJhc3RlciIsICJyYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxkcmF3IiwgImNkciIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXdwYXR0ZXJuIiwgInBhdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1jb3JlbGRyYXd0ZW1wbGF0ZSIsICJjZHQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtY29yZWxwaG90b3BhaW50IiwgImNwdCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1pY29uIiwgImljbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1qZyIsICJhcnQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtam5nIiwgImpuZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1tcy1ibXAiLCAiYm1wIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBob3Rvc2hvcCIsICJwc2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcG9ydGFibGUtYW55bWFwIiwgInBubSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAiLCAicGJtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAiLCAicGdtIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCIsICJwcG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoImltYWdlL3gtcmdiIiwgInJnYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14Yml0bWFwIiwgInhibSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14cGl4bWFwIiwgInhwbSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgiaW1hZ2UveC14d2luZG93ZHVtcCIsICJ4d2QiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL2lnZXMiLCAiaWdzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9pZ2VzIiwgImlnZXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAibXNoIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJtb2RlbC9tZXNoIiwgIm1lc2giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIm1vZGVsL21lc2giLCAic2lsbyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9jYWxlbmRhciIsICJpY3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvY2FsZW5kYXIiLCAiaWN6Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NvbW1hLXNlcGFyYXRlZC12YWx1ZXMiLCAiY3N2Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2NzcyIsICJjc3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG0iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvaHRtbCIsICJodG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2gzMjMiLCAiMzIzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L2l1bHMiLCAidWxzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L21hdGhtbCIsICJtbWwiKTsKLSAgICAgICAgICAgIC8vIGFkZCBpdCBmaXJzdCBzbyBpdCB3aWxsIGJlIHRoZSBkZWZhdWx0IGZvciBFeHRlbnNpb25Gcm9tTWltZVR5cGUKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAidHh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImFzYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9wbGFpbiIsICJ0ZXh0Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3BsYWluIiwgImRpZmYiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvcGxhaW4iLCAicG8iKTsgICAgIC8vIHJlc2VydmUgInBvdCIgZm9yIHZuZC5tcy1wb3dlcnBvaW50Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3JpY2h0ZXh0IiwgInJ0eCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC9ydGYiLCAicnRmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RleG1hY3MiLCAidHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQvdGV4dCIsICJwaHBzIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIiwgInRzdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94bWwiLCAieG1sIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYmlidGV4IiwgImJpYiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWJvbyIsICJib28iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaCsrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysraGRyIiwgImhwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK2hkciIsICJoeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytoZHIiLCAiaGgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jKytzcmMiLCAiYysrIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtYysrc3JjIiwgImNwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWMrK3NyYyIsICJjeHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jaGRyIiwgImgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1jb21wb25lbnQiLCAiaHRjIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtY3NoIiwgImNzaCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWNzcmMiLCAiYyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWRzcmMiLCAiZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LWhhc2tlbGwiLCAiaHMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1qYXZhIiwgImphdmEiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1saXRlcmF0ZS1oYXNrZWxsIiwgImxocyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LW1vYyIsICJtb2MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wYXNjYWwiLCAicCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXBhc2NhbCIsICJwYXMiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC1wY3MtZ2NkIiwgImdjZCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXNldGV4dCIsICJldHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10Y2wiLCAidGNsIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgInRleCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXRleCIsICJsdHgiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC10ZXgiLCAic3R5Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ0ZXh0L3gtdGV4IiwgImNscyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidGV4dC94LXZjYWxlbmRhciIsICJ2Y3MiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInRleHQveC12Y2FyZCIsICJ2Y2YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2dwcCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vM2dwcCIsICIzZ3AiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvLzNncHAiLCAiM2cyIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kbCIsICJkbCIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZHYiLCAiZGlmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9kdiIsICJkdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vZmxpIiwgImZsaSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbTR2IiwgIm00diIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGVnIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9tcGVnIiwgIm1wZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8vbXBlZyIsICJtcGUiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wNCIsICJtcDQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL21wZWciLCAiVk9CIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby9xdWlja3RpbWUiLCAicXQiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3F1aWNrdGltZSIsICJtb3YiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3ZuZC5tcGVndXJsIiwgIm14dSIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1sYS1hc2YiLCAibHNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LWxhLWFzZiIsICJsc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbW5nIiwgIm1uZyIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy1hc2YiLCAiYXNmIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLWFzZiIsICJhc3giKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd20iLCAid20iKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXMtd212IiwgIndtdiIpOwotICAgICAgICAgICAgc01pbWVUeXBlTWFwLmxvYWRFbnRyeSgidmlkZW8veC1tcy13bXgiLCAid214Iik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ2aWRlby94LW1zLXd2eCIsICJ3dngiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtbXN2aWRlbyIsICJhdmkiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoInZpZGVvL3gtc2dpLW1vdmllIiwgIm1vdmllIik7Ci0gICAgICAgICAgICBzTWltZVR5cGVNYXAubG9hZEVudHJ5KCJ4LWNvbmZlcmVuY2UveC1jb29sdGFsayIsICJpY2UiKTsKLSAgICAgICAgICAgIHNNaW1lVHlwZU1hcC5sb2FkRW50cnkoIngtZXBvYy94LXNpc3gtYXBwIiwgInNpc3giKTsKLSAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBzTWltZVR5cGVNYXA7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9OZXR3b3JrLmphdmEKaW5kZXggNTk4ZjIwZC4uMGYwMzI1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L05ldHdvcmsuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvTmV0d29yay5qYXZhCkBAIC0xNiw3ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuKjsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTc2LDYgKzgxLDE5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBIdHRwQXV0aEhhbmRsZXIgbUh0dHBBdXRoSGFuZGxlcjsKIAorICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnRseSB1c2VkIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBhIHJvYW1pbmcgcGhvbmUKKyAgICAgKiBjb25uZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUm9hbWluZzsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyBpZiB3ZSBhcmUgcm9hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJvYW1pbmdNb25pdG9yIG1Sb2FtaW5nTW9uaXRvcjsKKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbmV0d29yay4KICAgICAgKi8KQEAgLTEwNyw2ICsxMjUsNyBAQAogICAgICAgICBpZiAoKytzUGxhdGZvcm1Ob3RpZmljYXRpb25FbmFibGVSZWZDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICBpZiAoc05ldHdvcmsgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNOZXR3b3JrLm1SZXF1ZXN0UXVldWUuZW5hYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICAgICAgc05ldHdvcmsubW9uaXRvclJvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC0xMjEsNiArMTQwLDcgQEAKICAgICAgICAgaWYgKC0tc1BsYXRmb3JtTm90aWZpY2F0aW9uRW5hYmxlUmVmQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKHNOZXR3b3JrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzTmV0d29yay5tUmVxdWVzdFF1ZXVlLmRpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBzTmV0d29yay5zdG9wTW9uaXRvcmluZ1JvYW1pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc1BsYXRmb3JtTm90aWZpY2F0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTM2LDEyICsxNTYsMzkgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuCiAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKS5lcXVhbHMoV2ViVmlld0NvcmUuVEhSRUFEX05BTUUpKTsKICAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Tc2xFcnJvckhhbmRsZXIgPSBuZXcgU3NsRXJyb3JIYW5kbGVyKCk7CiAgICAgICAgIG1IdHRwQXV0aEhhbmRsZXIgPSBuZXcgSHR0cEF1dGhIYW5kbGVyKHRoaXMpOwogCiAgICAgICAgIG1SZXF1ZXN0UXVldWUgPSBuZXcgUmVxdWVzdFF1ZXVlKGNvbnRleHQpOwogICAgIH0KIAorICAgIHByaXZhdGUgY2xhc3MgUm9hbWluZ01vbml0b3IgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoIUNvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm8gPSAoTmV0d29ya0luZm8paW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTyk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1Sb2FtaW5nID0gaW5mby5pc1JvYW1pbmcoKTsKKyAgICAgICAgfTsKKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1vbml0b3JSb2FtaW5nKCkgeworICAgICAgICBtUm9hbWluZ01vbml0b3IgPSBuZXcgUm9hbWluZ01vbml0b3IoKTsKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHNOZXR3b3JrLm1Sb2FtaW5nTW9uaXRvciwgZmlsdGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcE1vbml0b3JpbmdSb2FtaW5nKCkgeworICAgICAgICBpZiAobVJvYW1pbmdNb25pdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUm9hbWluZ01vbml0b3IpOworICAgICAgICAgICAgbVJvYW1pbmdNb25pdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcXVlc3QgYSB1cmwgZnJvbSBlaXRoZXIgdGhlIG5ldHdvcmsgb3IgdGhlIGZpbGUgc3lzdGVtLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBsb2FkLgpAQCAtMTcwLDYgKzIxNywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZWZldGNoLCBhYm9ydCBpdCBpZiB3ZSdyZSByb2FtaW5nLgorICAgICAgICBpZiAobVJvYW1pbmcgJiYgaGVhZGVycy5jb250YWluc0tleSgiWC1Nb3oiKSAmJiAicHJlZmV0Y2giLmVxdWFscyhoZWFkZXJzLmdldCgiWC1Nb3oiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIGxhbWUuICBQYXNzIGFuIElucHV0U3RyZWFtIGluLCByYXRoZXIgdGhhbgogICAgICAgICAgICBtYWtpbmcgdGhpcyBsYW1lIG9uZSBoZXJlICovCiAgICAgICAgIElucHV0U3RyZWFtIGJvZHlQcm92aWRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbk1hbmFnZXIuamF2YQppbmRleCBlNWVlYjhjLi5hYjNiNmQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5NYW5hZ2VyLmphdmEKQEAgLTE1OSw0MSArMTU5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IFBMVUdJTl9TWVNURU1fTElCICsgcGtnSW5mby5wYWNrYWdlTmFtZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGVybWlzc2lvbnNbXSA9IHBrZ0luZm8ucmVxdWVzdGVkUGVybWlzc2lvbnM7Ci0gICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGx1Z2luIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMgYW5kCisgICAgICAgICAgICAgICAgLy8gc2lnbmF0dXJlcworICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhwa2dJbmZvKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwZXJtaXNzaW9uT2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXQgOiBwZXJtaXNzaW9ucykgewotICAgICAgICAgICAgICAgICAgICBpZiAoUExVR0lOX1BFUk1JU1NJT04uZXF1YWxzKHBlcm1pdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25PayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXBlcm1pc3Npb25PaykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBwcm9wZXJseSBzaWduZWQKLSAgICAgICAgICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0gcGtnSW5mby5zaWduYXR1cmVzOwotICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oInJvLnNlY3VyZSIsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNpZ25hdHVyZU1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU2lnbmF0dXJlIHNpZ25hdHVyZSA6IHNpZ25hdHVyZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0lHTkFUVVJFUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSUdOQVRVUkVTW2ldLmVxdWFscyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZU1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHBsdWdpbiBmcm9tIHRoZSBtYW5pZmVzdAogICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlSW5mby5tZXRhRGF0YSA9PSBudWxsKSB7CkBAIC0yMzYsNiArMjA2LDY0IEBACiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLworICAgIGJvb2xlYW4gY29udGFpbnNQbHVnaW5QZXJtaXNzaW9uQW5kU2lnbmF0dXJlcyhTdHJpbmcgcGx1Z2luQVBLTmFtZSkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gcmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGx1Z2luJ3MgbWFuaWZlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZ0luZm8gPSBwbS5nZXRQYWNrYWdlSW5mbyhwbHVnaW5BUEtOYW1lLCBQYWNrYWdlTWFuYWdlci5HRVRfUEVSTUlTU0lPTlMKKyAgICAgICAgICAgICAgICAgICAgfCBQYWNrYWdlTWFuYWdlci5HRVRfU0lHTkFUVVJFUyk7CisgICAgICAgICAgICBpZiAocGtnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMocGtnSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhMT0dUQUcsICJDYW4ndCBmaW5kIHBsdWdpbjogIiArIHBsdWdpbkFQS05hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luUGVybWlzc2lvbkFuZFNpZ25hdHVyZXMoUGFja2FnZUluZm8gcGtnSW5mbykgeworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucworICAgICAgICBTdHJpbmcgcGVybWlzc2lvbnNbXSA9IHBrZ0luZm8ucmVxdWVzdGVkUGVybWlzc2lvbnM7CisgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBwZXJtaXNzaW9uT2sgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgcGVybWl0IDogcGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChQTFVHSU5fUEVSTUlTU0lPTi5lcXVhbHMocGVybWl0KSkgeworICAgICAgICAgICAgICAgIHBlcm1pc3Npb25PayA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwZXJtaXNzaW9uT2spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRvIGVuc3VyZSB0aGUgcGx1Z2luIGlzIHByb3Blcmx5IHNpZ25lZAorICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0gcGtnSW5mby5zaWduYXR1cmVzOworICAgICAgICBpZiAoc2lnbmF0dXJlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN5c3RlbVByb3BlcnRpZXMuZ2V0Qm9vbGVhbigicm8uc2VjdXJlIiwgZmFsc2UpKSB7CisgICAgICAgICAgICBib29sZWFuIHNpZ25hdHVyZU1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKFNpZ25hdHVyZSBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdOQVRVUkVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTSUdOQVRVUkVTW2ldLmVxdWFscyhzaWduYXR1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2lnbmF0dXJlTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovCiAgICAgU3RyaW5nIGdldFBsdWdpbnNBUEtOYW1lKFN0cmluZyBwbHVnaW5MaWIpIHsKIAogICAgICAgICAvLyBiYXNpYyBlcnJvciBjaGVja2luZyBvbiBpbnB1dCBwYXJhbXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9TZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1NlbGVjdEFjdGlvbk1vZGVDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitjbGFzcyBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2sgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisKKyAgICB2b2lkIHNldFdlYlZpZXcoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICB9CisKKyAgICB2b2lkIHNldFRpdGxlQmFyKFZpZXcgdikgeyBtVGl0bGVCYXIgPSB2OyB9CisKKyAgICB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgfQorCisgICAgLy8gQWN0aW9uTW9kZS5DYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgIG1vZGUuZ2V0TWVudUluZmxhdGVyKCkuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLm1lbnUud2Vidmlld19jb3B5LAorICAgICAgICAgICAgICAgIG1lbnUpOworICAgICAgICBtb2RlLnNldFRpdGxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSk7CisgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkFjdGlvbkl0ZW1DbGlja2VkKEFjdGlvbk1vZGUgbW9kZSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICBzd2l0Y2goaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgY2FzZSBhbmRyb2lkLlIuaWQuY29weToKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5jb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNoYXJlOgorICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBtV2ViVmlldy5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBCcm93c2VyLnNlbmRTdHJpbmcobVdlYlZpZXcuZ2V0Q29udGV4dCgpLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zZWxlY3RfYWxsOgorICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNlbGVjdEFsbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuZmluZDoKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsPSBtV2ViVmlldy5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNob3dGaW5kRGlhbG9nKHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgbVdlYlZpZXcuc2V0RW1iZWRkZWRUaXRsZUJhcihtVGl0bGVCYXIpOworICAgICAgICBtV2ViVmlldy5zZWxlY3Rpb25Eb25lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9VUkxVdGlsLmphdmEKaW5kZXggN2M1ZjJiMC4uYzEzMTllNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1VSTFV0aWwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvVVJMVXRpbC5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIFN0cmluZyByZXRWYWwgPSBpblVybDsKICAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzOwogCi0gICAgICAgIExvZy52KExPR1RBRywgImd1ZXNzVVJMIGJlZm9yZSBxdWV1ZVJlcXVlc3Q6ICIgKyBpblVybCk7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLlVSTF9VVElMKSBMb2cudihMT0dUQUcsICJndWVzc1VSTCBiZWZvcmUgcXVldWVSZXF1ZXN0OiAiICsgaW5VcmwpOwogCiAgICAgICAgIGlmIChpblVybC5sZW5ndGgoKSA9PSAwKSByZXR1cm4gaW5Vcmw7CiAgICAgICAgIGlmIChpblVybC5zdGFydHNXaXRoKCJhYm91dDoiKSkgcmV0dXJuIGluVXJsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCmluZGV4IDlmNjQyYzAuLmIyYmE3ZTIzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCkBAIC0zMTQsMjggKzMxNCwyMCBAQAogICAgIC8qKgogICAgICAqIFRlbGwgdGhlIGNsaWVudCB0byBvcGVuIGEgZmlsZSBjaG9vc2VyLgogICAgICAqIEBwYXJhbSB1cGxvYWRGaWxlIEEgVmFsdWVDYWxsYmFjayB0byBzZXQgdGhlIFVSSSBvZiB0aGUgZmlsZSB0byB1cGxvYWQuCi0gICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuCisgICAgICogICAgICBvblJlY2VpdmVWYWx1ZSBtdXN0IGJlIGNhbGxlZCB0byB3YWtlIHVwIHRoZSB0aHJlYWQuYQorICAgICAqIEBwYXJhbSBhY2NlcHRUeXBlIFRoZSB2YWx1ZSBvZiB0aGUgJ2FjY2VwdCcgYXR0cmlidXRlIG9mIHRoZSBpbnB1dCB0YWcKKyAgICAgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUgcGlja2VyLgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlKSB7CisgICAgcHVibGljIHZvaWQgb3BlbkZpbGVDaG9vc2VyKFZhbHVlQ2FsbGJhY2s8VXJpPiB1cGxvYWRGaWxlLCBTdHJpbmcgYWNjZXB0VHlwZSkgewogICAgICAgICB1cGxvYWRGaWxlLm9uUmVjZWl2ZVZhbHVlKG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkLgorICAgICAqIFRlbGwgdGhlIGNsaWVudCB0aGF0IHRoZSBwYWdlIGJlaW5nIHZpZXdlZCBpcyB3ZWIgYXBwIGNhcGFibGUsCisgICAgICogaS5lLiBoYXMgc3BlY2lmaWVkIHRoZSBmdWxsc2NyZWVuLXdlYi1hcHAtY2FwYWJsZSBtZXRhIHRhZy4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uU3RhcnQoV2ViVmlldyB2aWV3KSB7Ci0gICAgICAgIC8vIEJ5IGRlZmF1bHQgd2UgY2FuY2VsIHRoZSBzZWxlY3Rpb24gYWdhaW4sIHRodXMgZGlzYWJsaW5nCi0gICAgICAgIC8vIHRleHQgc2VsZWN0aW9uIHVubGVzcyB0aGUgY2hyb21lIGNsaWVudCBzdXBwb3J0cyBpdC4KLSAgICAgICAgdmlldy5ub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxsIHRoZSBjbGllbnQgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBiZWVuIGNvcGllZCBvciBjYW5jZWxlZC4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0aW9uRG9uZShXZWJWaWV3IHZpZXcpIHsKLSAgICB9CisgICAgcHVibGljIHZvaWQgc2V0SW5zdGFsbGFibGVXZWJBcHAoKSB7IH0KIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkhpc3RvcnlJdGVtLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQppbmRleCA0MjhhNTljLi43YzBlNDc4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViSGlzdG9yeUl0ZW0uamF2YQpAQCAtMTgsNiArMTgsOSBAQAogCiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiAKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCiAvKioKICAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIGFjY2Vzc2luZyBmaWVsZHMgaW4gYW4gZW50cnkgaW4gdGhlIGJhY2svZm9yd2FyZCBsaXN0CiAgKiBvZiBhIFdlYlZpZXcuIEVhY2ggV2ViSGlzdG9yeUl0ZW0gaXMgYSBzbmFwc2hvdCBvZiB0aGUgcmVxdWVzdGVkIGhpc3RvcnkKQEAgLTM5LDggKzQyLDEyIEBACiAgICAgcHJpdmF0ZSBCaXRtYXAgbUZhdmljb247CiAgICAgLy8gVGhlIHByZS1mbGF0dGVuZWQgZGF0YSB1c2VkIGZvciBzYXZpbmcgdGhlIHN0YXRlLgogICAgIHByaXZhdGUgYnl0ZVtdIG1GbGF0dGVuZWREYXRhOwotICAgIC8vIFRoZSBhcHBsZS10b3VjaC1pY29uIHVybCBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBzaXRlIHRvIHRoZSBob21lIHNjcmVlbgotICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25Vcmw7CisgICAgLy8gVGhlIGFwcGxlLXRvdWNoLWljb24gdXJsIGZvciB1c2Ugd2hlbiBhZGRpbmcgdGhlIHNpdGUgdG8gdGhlIGhvbWUgc2NyZWVuLAorICAgIC8vIGFzIG9idGFpbmVkIGZyb20gYSA8bGluaz4gZWxlbWVudCBpbiB0aGUgcGFnZS4KKyAgICBwcml2YXRlIFN0cmluZyBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgLy8gSWYgbm8gPGxpbms+IGlzIHNwZWNpZmllZCwgdGhpcyBob2xkcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUKKyAgICAvLyBhcHBsZS10b3VjaC1pY29uLgorICAgIHByaXZhdGUgU3RyaW5nIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIC8vIEN1c3RvbSBjbGllbnQgZGF0YSB0aGF0IGlzIG5vdCBmbGF0dGVuZWQgb3IgcmVhZCBieSBuYXRpdmUgY29kZS4KICAgICBwcml2YXRlIE9iamVjdCBtQ3VzdG9tRGF0YTsKIApAQCAtMTMyLDEwICsxMzksMjggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgdG91Y2ggaWNvbiB1cmwuCisgICAgICogSWYgbm8gdG91Y2ggaWNvbiA8bGluaz4gdGFnIHdhcyBzcGVjaWZpZWQsIHJldHVybnMKKyAgICAgKiA8aG9zdD4vYXBwbGUtdG91Y2gtaWNvbi5wbmcuIFRoZSBEb3dubG9hZFRvdWNoSWNvbiBjbGFzcyB0aGF0CisgICAgICogYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIHRvdWNoIGljb24gd2lsbCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUKKyAgICAgKiB0aGF0IGZpbGUgZG9lcyBub3QgZXhpc3QuIEFuIGljb24gc2V0IGJ5IGEgPGxpbms+IHRhZyBpcyBhbHdheXMKKyAgICAgKiB1c2VkIGluIHByZWZlcmVuY2UgdG8gYW4gaWNvbiBzYXZlZCBvbiB0aGUgc2VydmVyLgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUb3VjaEljb25VcmwoKSB7Ci0gICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsOworICAgICAgICBpZiAobVRvdWNoSWNvblVybEZyb21MaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtVG91Y2hJY29uVXJsRnJvbUxpbms7CisgICAgICAgIH0gZWxzZSBpZiAobVRvdWNoSWNvblVybFNlcnZlckRlZmF1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKG1PcmlnaW5hbFVybCk7CisgICAgICAgICAgICBtVG91Y2hJY29uVXJsU2VydmVyRGVmYXVsdCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICIvYXBwbGUtdG91Y2gtaWNvbi5wbmciKS50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ub3VjaEljb25VcmxTZXJ2ZXJEZWZhdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxLDExICsxOTYsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRvdWNoIGljb24gdXJsLgorICAgICAqIFNldCB0aGUgdG91Y2ggaWNvbiB1cmwuIFdpbGwgbm90IG92ZXJ3cml0ZSBhbiBpY29uIHRoYXQgaGFzIGJlZW4KKyAgICAgKiBzZXQgYWxyZWFkeSBmcm9tIGEgPGxpbms+IHRhZywgdW5sZXNzIHRoZSBuZXcgaWNvbiBpcyBwcmVjb21wb3NlZC4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIC8qcGFja2FnZSovIHZvaWQgc2V0VG91Y2hJY29uVXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgbVRvdWNoSWNvblVybCA9IHVybDsKKyAgICAvKnBhY2thZ2UqLyB2b2lkIHNldFRvdWNoSWNvblVybChTdHJpbmcgdXJsLCBib29sZWFuIHByZWNvbXBvc2VkKSB7CisgICAgICAgIGlmIChwcmVjb21wb3NlZCB8fCBtVG91Y2hJY29uVXJsRnJvbUxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRvdWNoSWNvblVybEZyb21MaW5rID0gdXJsOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViU2V0dGluZ3MuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCmluZGV4IGRhMGM2MWIuLmQ4MWQ3ZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhCkBAIC0yMiw4ICsyMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7Ci1pbXBvcnQgamF2YS5sYW5nLlNlY3VyaXR5RXhjZXB0aW9uOworCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCkBAIC0xMDcsNyArMTA4LDcgQEAKICAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldENhY2hlTW9kZX0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9OT19DQUNIRSA9IDI7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBEb24ndCB1c2UgdGhlIG5ldHdvcmssIGxvYWQgZnJvbSBjYWNoZSBvbmx5LgogICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0Q2FjaGVNb2RlfS4KQEAgLTE3NiwxNCArMTc3LDE5IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRG91YmxlVHJlZSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1Vc2VXaWRlVmlld3BvcnQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtVXNlRml4ZWRWaWV3cG9ydCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0TXVsdGlwbGVXaW5kb3dzID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVNocmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGxvbmcgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSAwOyAvLyAwIG1lYW5zIGRlZmF1bHQKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TeW50aGV0aWNMaW5rc0VuYWJsZWQgPSB0cnVlOwogICAgIC8vIEhUTUw1IEFQSSBmbGFncwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1BcHBDYWNoZUVuYWJsZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGF0YWJhc2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbURvbVN0b3JhZ2VFbmFibGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVdvcmtlcnNFbmFibGVkID0gZmFsc2U7ICAvLyBvbmx5IGFmZmVjdHMgVjguCiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUdlb2xvY2F0aW9uRW5hYmxlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVhTU0F1ZGl0b3JFbmFibGVkID0gZmFsc2U7CiAgICAgLy8gSFRNTDUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgcHJpdmF0ZSBsb25nICAgICAgICAgICAgbUFwcENhY2hlTWF4U2l6ZSA9IExvbmcuTUFYX1ZBTFVFOwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1BcHBDYWNoZVBhdGggPSAiIjsKQEAgLTIwNSw5ICsyMTEsMTAgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtTmF2RHVtcCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1TdXBwb3J0Wm9vbSA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUJ1aWx0SW5ab29tQ29udHJvbHMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBtRGlzcGxheVpvb21Db250cm9scyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUFsbG93RmlsZUFjY2VzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbUxvYWRXaXRoT3ZlcnZpZXdNb2RlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgIG1FbmFibGVTbW9vdGhUcmFuc2l0aW9uID0gZmFsc2U7CiAKICAgICAvLyBwcml2YXRlIFdlYlNldHRpbmdzLCBub3QgYWNjZXNzaWJsZSBieSB0aGUgaG9zdCBhY3Rpdml0eQogICAgIHN0YXRpYyBwcml2YXRlIGludCAgICAgIG1Eb3VibGVUYXBUb2FzdENvdW50ID0gMzsKQEAgLTI5NywxMyArMzA0LDEzIEBACiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgSW50ZWwgTWFjIE9TIFggMTBfNV83OyBlbi11cykiCiAgICAgICAgICAgICArICIgQXBwbGVXZWJLaXQvNTMwLjE3IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAiCiAgICAgICAgICAgICArICIgU2FmYXJpLzUzMC4xNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQSE9ORV9VU0VSQUdFTlQgPSAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVBIT05FX1VTRVJBR0VOVCA9CiAgICAgICAgICAgICAiTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIgogICAgICAgICAgICAgKyAiIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIgogICAgICAgICAgICAgKyAiIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2IjsKICAgICBwcml2YXRlIHN0YXRpYyBMb2NhbGUgc0xvY2FsZTsKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc0xvY2tGb3JMb2NhbGVTZXR0aW5nczsKLSAgICAKKwogICAgIC8qKgogICAgICAqIFBhY2thZ2UgY29uc3RydWN0b3IgdG8gcHJldmVudCBjbGllbnRzIGZyb20gY3JlYXRpbmcgYSBuZXcgc2V0dGluZ3MKICAgICAgKiBpbnN0YW5jZS4KQEAgLTMxNSw2ICszMjIsMTEgQEAKICAgICAgICAgbURlZmF1bHRUZXh0RW5jb2RpbmcgPSBjb250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5kZWZhdWx0X3RleHRfZW5jb2RpbmcpOwogCisgICAgICAgIC8vIERldGVjdCB0YWJsZXQgZGV2aWNlIGZvciBmaXhlZCB2aWV3cG9ydCBtb2RlLgorICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICBtVXNlRml4ZWRWaWV3cG9ydCA9IChtZXRyaWNzLmRlbnNpdHkgPT0gMS4wZiAKKyAgICAgICAgICAgICYmIChtZXRyaWNzLndpZHRoUGl4ZWxzID49IDgwMCB8fG1ldHJpY3MuaGVpZ2h0UGl4ZWxzID49IDgwMCkpOworCiAgICAgICAgIGlmIChzTG9ja0ZvckxvY2FsZVNldHRpbmdzID09IG51bGwpIHsKICAgICAgICAgICAgIHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgICAgICBzTG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKQEAgLTMyOCw2ICszNDAsOCBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQ7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUgPSAiZW4tVVMiOworCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgcmV0dXJucyBjdXJyZW50IEFjY2VwdExhbmd1YWdlIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIEN1cnJlbnQgQWNjZXB0TGFuZ3VhZ2UgU3RyaW5nLgpAQCAtMzM3LDMyICszNTEsNTMgQEAKICAgICAgICAgc3luY2hyb25pemVkKHNMb2NrRm9yTG9jYWxlU2V0dGluZ3MpIHsKICAgICAgICAgICAgIGxvY2FsZSA9IHNMb2NhbGU7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKGxhbmd1YWdlKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShidWZmZXIsIGxvY2FsZSk7CisKKyAgICAgICAgaWYgKCFMb2NhbGUuVVMuZXF1YWxzKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWxvY2FsZS5lcXVhbHMoTG9jYWxlLlVTKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUgdXMgPSBMb2NhbGUuVVM7Ci0gICAgICAgICAgICBpZiAodXMuZ2V0TGFuZ3VhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cy5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IHVzLmdldENvdW50cnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb3VudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEFDQ0VQVF9MQU5HX0ZPUl9VU19MT0NBTEUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb2Jzb2xldGUgbGFuZ3VhZ2UgY29kZXMsIGluY2x1ZGluZyBIZWJyZXcvSW5kb25lc2lhbi9ZaWRkaXNoLAorICAgICAqIHRvIG5ldyBzdGFuZGFyZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydE9ic29sZXRlTGFuZ3VhZ2VDb2RlVG9OZXcoU3RyaW5nIGxhbmdDb2RlKSB7CisgICAgICAgIGlmIChsYW5nQ29kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIml3Ii5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBIZWJyZXcKKyAgICAgICAgICAgIHJldHVybiAiaGUiOworICAgICAgICB9IGVsc2UgaWYgKCJpbiIuZXF1YWxzKGxhbmdDb2RlKSkgeworICAgICAgICAgICAgLy8gSW5kb25lc2lhbgorICAgICAgICAgICAgcmV0dXJuICJpZCI7CisgICAgICAgIH0gZWxzZSBpZiAoImppIi5lcXVhbHMobGFuZ0NvZGUpKSB7CisgICAgICAgICAgICAvLyBZaWRkaXNoCisgICAgICAgICAgICByZXR1cm4gInlpIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFuZ0NvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRMb2NhbGVUb0h0dHBBY2NlcHRMYW5ndWFnZShTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxvY2FsZS5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGxhbmd1YWdlKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvdW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTG9va3MgYXQgc0xvY2FsZSBhbmQgbUNvbnRleHQgYW5kIHJldHVybnMgY3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgogICAgICAqIEByZXR1cm4gQ3VycmVudCBVc2VyQWdlbnQgU3RyaW5nLgpAQCAtMzgwLDExICs0MTUsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gIjEuMCIKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjEuMCIpOwotICAgICAgICB9ICAKKyAgICAgICAgfQogICAgICAgICBidWZmZXIuYXBwZW5kKCI7ICIpOwogICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbnZlcnRPYnNvbGV0ZUxhbmd1YWdlQ29kZVRvTmV3KGxhbmd1YWdlKSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7CiAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLSIpOwpAQCAtNDA3LDExICs0NDIsMTMgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiBCdWlsZC8iKTsKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaWQpOwogICAgICAgICB9CisgICAgICAgIFN0cmluZyBtb2JpbGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRUZXh0KAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcud2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQpLnRvU3RyaW5nKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0VGV4dCgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy53ZWJfdXNlcl9hZ2VudCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoYmFzZSwgYnVmZmVyLCBtb2JpbGUpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIEVuYWJsZXMgZHVtcGluZyB0aGUgcGFnZXMgbmF2aWdhdGlvbiBjYWNoZSB0byBhIHRleHQgZmlsZS4KICAgICAgKi8KQEAgLTQyNyw2ICs0NjQsMjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJZiBXZWJWaWV3IG9ubHkgc3VwcG9ydHMgdG91Y2gsIGEgZGlmZmVyZW50IG5hdmlnYXRpb24gbW9kZWwgd2lsbCBiZQorICAgICAqIGFwcGxpZWQuIE90aGVyd2lzZSwgdGhlIG5hdmlnYXRpb24gdG8gc3VwcG9ydCBib3RoIHRvdWNoIGFuZCBrZXlib2FyZAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAaGlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRUb3VjaE9ubHkoYm9vbGVhbiB0b3VjaE9ubHkpIHsKKyAgICAgICAgbVN1cHBvcnRUb3VuY2hPbmx5ID0gdG91Y2hPbmx5OworICAgIH0KKyAgICAgKi8KKworICAgIGJvb2xlYW4gc3VwcG9ydFRvdWNoT25seSgpIHsKKyAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHksIHVzZSBtTGlnaHRUb3VjaEVuYWJsZWQgZm9yIG1TdXBwb3J0VG91bmNoT25seQorICAgICAgICByZXR1cm4gbUxpZ2h0VG91Y2hFbmFibGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIHRoZSBXZWJWaWV3IHN1cHBvcnRzIHpvb20KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0Wm9vbShib29sZWFuIHN1cHBvcnQpIHsKQEAgLTQ0OCwxNCArNTAwLDM0IEBACiAgICAgICAgIG1CdWlsdEluWm9vbUNvbnRyb2xzID0gZW5hYmxlZDsKICAgICAgICAgbVdlYlZpZXcudXBkYXRlTXVsdGlUb3VjaFN1cHBvcnQobUNvbnRleHQpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9vbSBtZWNoYW5pc20gYnVpbHQgaW50byBXZWJWaWV3IGlzIGJlaW5nIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0QnVpbHRJblpvb21Db250cm9scygpIHsKICAgICAgICAgcmV0dXJuIG1CdWlsdEluWm9vbUNvbnRyb2xzOwogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgb24gc2NyZWVuIHpvb20gYnV0dG9ucyBhcmUgdXNlZC4KKyAgICAgKiBBIGNvbWJpbmF0aW9uIG9mIGJ1aWx0IGluIHpvb20gY29udHJvbHMgZW5hYmxlZAorICAgICAqIGFuZCBvbiBzY3JlZW4gem9vbSBjb250cm9scyBkaXNhYmxlZCBhbGxvd3MgZm9yIHBpbmNoIHRvIHpvb20KKyAgICAgKiB0byB3b3JrIHdpdGhvdXQgdGhlIG9uIHNjcmVlbiBjb250cm9scworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheVpvb21Db250cm9scyhib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbURpc3BsYXlab29tQ29udHJvbHMgPSBlbmFibGVkOworICAgICAgICBtV2ViVmlldy51cGRhdGVNdWx0aVRvdWNoU3VwcG9ydChtQ29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvbiBzY3JlZW4gem9vbSBidXR0b25zIGFyZSBiZWluZyB1c2VkLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzcGxheVpvb21Db250cm9scygpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5Wm9vbUNvbnRyb2xzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGZpbGUgYWNjZXNzIHdpdGhpbiBXZWJWaWV3LiBGaWxlIGFjY2VzcyBpcyBlbmFibGVkIGJ5CiAgICAgICogZGVmYXVsdC4KQEAgLTQ4NiwyMCArNTU4LDIyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhlIFdlYlZpZXcgdXNlcyBpdHMgYmFja2dyb3VuZCBmb3Igb3ZlciBzY3JvbGwgYmFja2dyb3VuZC4KLSAgICAgKiBJZiB0cnVlLCBpdCB3aWxsIHVzZSB0aGUgV2ViVmlldydzIGJhY2tncm91bmQuIElmIGZhbHNlLCBpdCB3aWxsIHVzZSBhbgotICAgICAqIGludGVybmFsIHBhdHRlcm4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAgICAgKiBTZXQgd2hldGhlciB0aGUgV2ViVmlldyB3aWxsIGVuYWJsZSBzbW9vdGggdHJhbnNpdGlvbiB3aGlsZSBwYW5uaW5nIG9yCisgICAgICogem9vbWluZy4gSWYgaXQgaXMgdHJ1ZSwgV2ViVmlldyB3aWxsIGNob29zZSBhIHNvbHV0aW9uIHRvIG1heGltaXplIHRoZQorICAgICAqIHBlcmZvcm1hbmNlLiBlLmcuIHRoZSBXZWJWaWV3J3MgY29udGVudCBtYXkgbm90IGJlIHVwZGF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRyYW5zaXRpb24uIElmIGl0IGlzIGZhbHNlLCBXZWJWaWV3IHdpbGwga2VlcCBpdHMgZmlkZWxpdHkuIFRoZSBkZWZhdWx0CisgICAgICogdmFsdWUgaXMgZmFsc2UuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZChib29sZWFuIHZpZXcpIHsKLSAgICAgICAgbVVzZVdlYlZpZXdCYWNrZ3JvdW5kT3ZlcnNjcm9sbEJhY2tncm91bmQgPSB2aWV3OworICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZVNtb290aFRyYW5zaXRpb24oYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUVuYWJsZVNtb290aFRyYW5zaXRpb24gPSBlbmFibGU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgV2ViVmlldyB1c2VzIFdlYlZpZXcncyBiYWNrZ3JvdW5kIGluc3RlYWQgb2YKLSAgICAgKiBpbnRlcm5hbCBwYXR0ZXJuIGZvciBvdmVyIHNjcm9sbCBiYWNrZ3JvdW5kLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViVmlldyBlbmFibGVzIHNtb290aCB0cmFuc2l0aW9uIHdoaWxlIHBhbm5pbmcgb3IKKyAgICAgKiB6b29taW5nLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtVXNlV2ViVmlld0JhY2tncm91bmRPdmVyc2Nyb2xsQmFja2dyb3VuZDsKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVTbW9vdGhUcmFuc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gbUVuYWJsZVNtb290aFRyYW5zaXRpb247CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDAyLDggKzEwNzYsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5ldHdvcmtBY2Nlc3MoKSB7CiAgICAgICAgIGlmICghbUJsb2NrTmV0d29ya0xvYWRzKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiLCAKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5vcy5Qcm9jZXNzLm15UGlkKCksIGFuZHJvaWQub3MuUHJvY2Vzcy5teVVpZCgpKSAhPSAKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpLCBhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgKCJQZXJtaXNzaW9uIGRlbmllZCAtICIgKwpAQCAtMTAyOSw2ICsxMTAzLDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICAgICogICAgICAgICAgICAge0BsaW5rICNzZXRQbHVnaW5TdGF0ZX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKICAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOwogICAgIH0KQEAgLTExOTksNiArMTI3NCwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBYU1MgQXVkaXRvciBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgWFNTIEF1ZGl0b3Igc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IExheW91dFRlc3RDb250cm9sbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpIHsKKyAgICAgICAgaWYgKG1YU1NBdWRpdG9yRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtWFNTQXVkaXRvckVuYWJsZWQgPSBmbGFnOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIGphdmFzY3JpcHQgaXMgZW5hYmxlZC4gPGI+Tm90ZTogVGhlIGRlZmF1bHQgaXMgZmFsc2UuPC9iPgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBqYXZhc2NyaXB0IGlzIGVuYWJsZWQuCiAgICAgICovCkBAIC0xMjExLDYgKzEyOTgsNyBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBwbHVnaW5zIGFyZSBlbmFibGVkLgogICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UGx1Z2luU3RhdGV9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0UGx1Z2luc0VuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtUGx1Z2luU3RhdGUgPT0gUGx1Z2luU3RhdGUuT047CiAgICAgfQpAQCAtMTI4NCw3ICsxMzcyLDcgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXNlckFnZW50U3RyaW5nKFN0cmluZyB1YSkgewogICAgICAgICBpZiAodWEgPT0gbnVsbCB8fCB1YS5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc0xvY2tGb3JMb2NhbGVTZXR0aW5ncykgewotICAgICAgICAgICAgICAgIExvY2FsZSBjdXJyZW50TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsgCisgICAgICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgIGlmICghc0xvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc0xvY2FsZSA9IGN1cnJlbnRMb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgIG1BY2NlcHRMYW5ndWFnZSA9IGdldEN1cnJlbnRBY2NlcHRMYW5ndWFnZSgpOwpAQCAtMTMzOSwxMSArMTQyNywxMSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQWNjZXB0TGFuZ3VhZ2U7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgV2ViVmlldyB3aGV0aGVyIGl0IG5lZWRzIHRvIHNldCBhIG5vZGUgdG8gaGF2ZSBmb2N1cyB3aGVuCiAgICAgICoge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzKGludCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KX0gaXMgY2FsbGVkLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGZsYWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROZWVkSW5pdGlhbEZvY3VzKGJvb2xlYW4gZmxhZykgewpAQCAtMTM3MCw3ICsxNDU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyLlBSSU9SSVRZKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBPdmVycmlkZSB0aGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkLiBUaGUgd2F5IHRoZSBjYWNoZSBpcyB1c2VkIGlzIGJhc2VkCiAgICAgICogb24gdGhlIG5hdmlnYXRpb24gb3B0aW9uLiBGb3IgYSBub3JtYWwgcGFnZSBsb2FkLCB0aGUgY2FjaGUgaXMgY2hlY2tlZApAQCAtMTM4NCw3ICsxNDcyLDcgQEAKICAgICAgICAgICAgIG1PdmVycmlkZUNhY2hlTW9kZSA9IG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igb3ZlcnJpZGluZyB0aGUgY2FjaGUgbW9kZS4gRm9yIGEgZnVsbAogICAgICAqIGRlc2NyaXB0aW9uLCBzZWUgdGhlIHtAbGluayAjc2V0Q2FjaGVNb2RlKGludCl9IGZ1bmN0aW9uLgpAQCAtMTM5Miw3ICsxNDgwLDcgQEAKICAgICBwdWJsaWMgaW50IGdldENhY2hlTW9kZSgpIHsKICAgICAgICAgcmV0dXJuIG1PdmVycmlkZUNhY2hlTW9kZTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHdlYmtpdCBhbHRlcm5hdGVseSBzaHJpbmtzIGFuZCBleHBhbmRzIGltYWdlcyB2aWV3ZWQgb3V0c2lkZQogICAgICAqIG9mIGFuIEhUTUwgcGFnZSB0byBmaXQgdGhlIHNjcmVlbi4gVGhpcyBjb25mbGljdHMgd2l0aCBhdHRlbXB0cyBieQpAQCAtMTQwNyw2ICsxNDk1LDUxIEBACiAgICAgICAgIH0KICAgICAgfQogCisgICAgLyoqCisgICAgICogU3BlY2lmeSB0aGUgbWF4aW11bSBkZWNvZGVkIGltYWdlIHNpemUuIFRoZSBkZWZhdWx0IGlzCisgICAgICogMiBtZWdzIGZvciBzbWFsbCBtZW1vcnkgZGV2aWNlcyBhbmQgOCBtZWdzIGZvciBsYXJnZSBtZW1vcnkgZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbWF4aW11bSBkZWNvZGVkIHNpemUsIG9yIHplcm8gdG8gc2V0IHRvIHRoZSBkZWZhdWx0LgorICAgICAqIEBoaWRlIHBlbmRpbmcgYXBpIGNvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRGVjb2RlZEltYWdlU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgaWYgKG1NYXhpbXVtRGVjb2RlZEltYWdlU2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBtTWF4aW11bURlY29kZWRJbWFnZVNpemUgPSBzaXplOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0byB1c2UgZml4ZWQgdmlld3BvcnQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGdldFVzZUZpeGVkVmlld3BvcnQoKSB7CisgICAgICAgIHJldHVybiBtVXNlRml4ZWRWaWV3cG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmbGFnIFdoZXRoZXIgcHJpdmF0ZSBicm93c2luZyBzaG91bGQgYmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCB2b2lkIHNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmIChtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCA9IGZsYWc7CisgICAgICAgICAgICBwb3N0U3luYygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgc2V0U3ludGhldGljTGlua3NFbmFibGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICBpZiAobVN5bnRoZXRpY0xpbmtzRW5hYmxlZCAhPSBmbGFnKSB7CisgICAgICAgICAgICBtU3ludGhldGljTGlua3NFbmFibGVkID0gZmxhZzsKKyAgICAgICAgICAgIHBvc3RTeW5jKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQgZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIG1Eb3VibGVUYXBUb2FzdENvdW50OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKaW5kZXggMTlhYmVjMS4uZmNhNWVlMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlRleHRWaWV3LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuSW5wdXRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dDsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKQEAgLTEwOSw2ICsxMTAsMTEgQEAKICAgICAvLyBGSVhNRTogVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBUZXh0Vmlldy5OT19GSUxURVJTIGlmIHRoYXQKICAgICAvLyBpcyBtYWRlIHB1YmxpYy9wcm90ZWN0ZWQuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRGaWx0ZXJbXSBOT19GSUxURVJTID0gbmV3IElucHV0RmlsdGVyWzBdOworICAgIC8vIEZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGRlbGV0ZSBrZXkgd2FzIHByZXNzZWQsIHNvCisgICAgLy8gd2UgY2FuIHNpbXBseSBwYXNzIGEgZGVsZXRlIGtleSBpbnN0ZWFkIG9mIGNhbGxpbmcgZGVsZXRlU2VsZWN0aW9uLgorICAgIHByaXZhdGUgYm9vbGVhbiBtR290RGVsZXRlOworICAgIHByaXZhdGUgaW50IG1EZWxTZWxTdGFydDsKKyAgICBwcml2YXRlIGludCBtRGVsU2VsRW5kOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IFdlYlRleHRWaWV3LgpAQCAtMTUyLDEzICsxNTgsMjIgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIFNwYW5uYWJsZSB0ZXh0ID0gKFNwYW5uYWJsZSkgZ2V0VGV4dCgpOwotICAgICAgICBpbnQgb2xkTGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgaW50IG9sZFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHRleHQpOworICAgICAgICBpbnQgb2xkRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZCh0ZXh0KTsKICAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGRlbGV0ZSBrZXkncyBkb20gZXZlbnRzIGFyZSBzZW50IHZpYSBvblRleHRDaGFuZ2VkLgotICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgbGVuZ3RoIGlzIHplcm8sIHRoZSB0ZXh0IGRpZCBub3QgY2hhbmdlLCBzbyB3ZQotICAgICAgICAvLyBnbyBhaGVhZCBhbmQgcGFzcyB0aGUga2V5IGRvd24gaW1tZWRpYXRlbHkuCi0gICAgICAgIGlmIChLZXlFdmVudC5LRVlDT0RFX0RFTCA9PSBrZXlDb2RlICYmIDAgPT0gb2xkTGVuZ3RoKSB7Ci0gICAgICAgICAgICBzZW5kRG9tRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmllbGQsIHdoaWNoCisgICAgICAgIC8vIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIGl0IGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiB0aGUgdGV4dCBpcyBub3QKKyAgICAgICAgLy8gY2hhbmdlZCwgc28gc2VuZCB0aGUgZXZlbnRzIGltbWVkaWF0ZWx5LgorICAgICAgICBpZiAoS2V5RXZlbnQuS0VZQ09ERV9ERUwgPT0ga2V5Q29kZSkgeworICAgICAgICAgICAgaWYgKG9sZFN0YXJ0ID09IDAgJiYgb2xkRW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kRG9tRXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBtR290RGVsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRGVsU2VsU3RhcnQgPSBvbGRTdGFydDsKKyAgICAgICAgICAgICAgICBtRGVsU2VsRW5kID0gb2xkRW5kOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKChtU2luZ2xlICYmIEtleUV2ZW50LktFWUNPREVfRU5URVIgPT0ga2V5Q29kZSkpIHsKQEAgLTE5Niw5ICsyMTEsOCBAQAogICAgICAgICBpZiAoZ2V0TGF5b3V0KCkgPT0gbnVsbCkgewogICAgICAgICAgICAgbWVhc3VyZShtV2lkdGhTcGVjLCBtSGVpZ2h0U3BlYyk7CiAgICAgICAgIH0KLSAgICAgICAgaW50IG9sZFN0YXJ0ID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvblN0YXJ0KHRleHQpOwotICAgICAgICBpbnQgb2xkRW5kID0gU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZCh0ZXh0KTsKIAorICAgICAgICBpbnQgb2xkTGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKICAgICAgICAgYm9vbGVhbiBtYXhlZE91dCA9IG1NYXhMZW5ndGggIT0gLTEgJiYgb2xkTGVuZ3RoID09IG1NYXhMZW5ndGg7CiAgICAgICAgIC8vIElmIHdlIGFyZSBhdCBtYXggbGVuZ3RoLCBhbmQgdGhlcmUgaXMgYSBzZWxlY3Rpb24gcmF0aGVyIHRoYW4gYQogICAgICAgICAvLyBjdXJzb3IsIHdlIG5lZWQgdG8gc3RvcmUgdGhlIHRleHQgdG8gY29tcGFyZSBsYXRlciwgc2luY2UgdGhlIGtleQpAQCAtMzAwLDYgKzMxNCwzMyBAQAogICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbiBnZW5lcmFsLCBUZXh0VmlldyBtYWtlcyBhIGNhbGwgdG8gSW5wdXRNZXRob2RNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbgorICAgICAqIGluIG9uRHJhdy4gIEhvd2V2ZXIsIGluIHRoZSBnZW5lcmFsIGNhc2Ugb2YgV2ViVGV4dFZpZXcsIHdlIGRvIG5vdCBkcmF3LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBXZWJWaWV3Lm9uRHJhdyB0byB0YWtlIGNhcmUgb2YgdGhlIHBhcnQgdGhhdAorICAgICAqIG5lZWRzIHRvIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgb25EcmF3U3Vic3RpdHV0ZSgpIHsKKyAgICAgICAgaWYgKCF3aWxsTm90RHJhdygpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgV2ViVGV4dFZpZXcgaXMgc2V0IHRvIGRyYXcsIHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYQorICAgICAgICAgICAgLy8gcGFzc3dvcmQsIG9uRHJhdyBjYWxscyB1cGRhdGVTZWxlY3Rpb24oKSwgc28gdGhpcyBjb2RlIHBhdGggaXMKKyAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKKyAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCisgICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgorICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7CisgICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VsU3RhcnQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uU3RhcnQoc3ApOworICAgICAgICAgICAgaW50IHNlbEVuZCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoc3ApOworICAgICAgICAgICAgaW50IGNhbmRTdGFydCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5TdGFydChzcCk7CisgICAgICAgICAgICBpbnQgY2FuZEVuZCA9IEVkaXRhYmxlSW5wdXRDb25uZWN0aW9uLmdldENvbXBvc2luZ1NwYW5FbmQoc3ApOworICAgICAgICAgICAgaW1tLnVwZGF0ZVNlbGVjdGlvbih0aGlzLCBzZWxTdGFydCwgc2VsRW5kLCBjYW5kU3RhcnQsIGNhbmRFbmQpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgLy8gb25EcmF3IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgcGFzc3dvcmQgZmllbGRzLiAgSWYgV2ViVGV4dFZpZXcgaXMKQEAgLTMyMiw5ICszNjMsNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKICAgICAgICAgY2FzZSBFZGl0b3JJbmZvLklNRV9BQ1RJT05fTkVYVDoKICAgICAgICAgICAgIGlmIChtV2ViVmlldy5uYXRpdmVNb3ZlQ3Vyc29yVG9OZXh0VGV4dElucHV0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgY3Vyc29yIHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZQotICAgICAgICAgICAgICAgIC8vIGZvY3VzLCBzZXQgdGhlIGZvY3VzIGNvbnRyb2xsZXIgYmFjayB0byBpbmFjdGl2ZQotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgLy8gUHJlZW1wdGl2ZWx5IHJlYnVpbGQgdGhlIFdlYlRleHRWaWV3LCBzbyB0aGF0IHRoZSBhY3Rpb24gd2lsbAogICAgICAgICAgICAgICAgIC8vIGJlIHNldCBwcm9wZXJseS4KICAgICAgICAgICAgICAgICBtV2ViVmlldy5yZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM2MCwxOSArMzk4LDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2VsZWN0aW9uQ2hhbmdlZChpbnQgc2VsU3RhcnQsIGludCBzZWxFbmQpIHsKLSAgICAgICAgaWYgKG1JblNldFRleHRBbmRLZWVwU2VsZWN0aW9uKSByZXR1cm47Ci0gICAgICAgIC8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBUZXh0Vmlldy5vbkRyYXcoKS4gIFRoYXQgY29kZSBkb2VzIG5vdCBnZXQKLSAgICAgICAgLy8gZXhlY3V0ZWQsIGhvd2V2ZXIsIGJlY2F1c2UgdGhlIFdlYlRleHRWaWV3IGRvZXMgbm90IGRyYXcsIGFsbG93aW5nCi0gICAgICAgIC8vIHdlYmtpdCdzIGRyYXdpbmcgdG8gc2hvdyB0aHJvdWdoLgotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOwotICAgICAgICBpZiAoaW1tICE9IG51bGwgJiYgaW1tLmlzQWN0aXZlKHRoaXMpKSB7Ci0gICAgICAgICAgICBTcGFubmFibGUgc3AgPSAoU3Bhbm5hYmxlKSBnZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgY2FuZFN0YXJ0ID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhblN0YXJ0KHNwKTsKLSAgICAgICAgICAgIGludCBjYW5kRW5kID0gRWRpdGFibGVJbnB1dENvbm5lY3Rpb24uZ2V0Q29tcG9zaW5nU3BhbkVuZChzcCk7Ci0gICAgICAgICAgICBpbW0udXBkYXRlU2VsZWN0aW9uKHRoaXMsIHNlbFN0YXJ0LCBzZWxFbmQsIGNhbmRTdGFydCwgY2FuZEVuZCk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCFtRnJvbVdlYktpdCAmJiAhbUZyb21Gb2N1c0NoYW5nZSAmJiAhbUZyb21TZXRJbnB1dFR5cGUKLSAgICAgICAgICAgICAgICAmJiBtV2ViVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgJiYgbVdlYlZpZXcgIT0gbnVsbCAmJiAhbUluU2V0VGV4dEFuZEtlZXBTZWxlY3Rpb24pIHsKICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9URVhUX1ZJRVcpIHsKICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJvblNlbGVjdGlvbkNoYW5nZWQgc2VsU3RhcnQ9IiArIHNlbFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsRW5kPSIgKyBzZWxFbmQpOwpAQCAtMzk3LDE3ICs0MjQsMzggQEAKICAgICAgICAgbVByZUNoYW5nZSA9IHBvc3RDaGFuZ2U7CiAgICAgICAgIGlmICgwID09IGNvdW50KSB7CiAgICAgICAgICAgICBpZiAoYmVmb3JlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEZvciB0aGlzIGFuZCBhbGwgY2hhbmdlcyB0byB0aGUgdGV4dCwgdXBkYXRlIG91ciBjYWNoZQorICAgICAgICAgICAgICAgIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpOworICAgICAgICAgICAgICAgIGlmIChtR290RGVsZXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Hb3REZWxldGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9sZEVuZCA9IHN0YXJ0ICsgYmVmb3JlOworICAgICAgICAgICAgICAgICAgICBpZiAobURlbFNlbEVuZCA9PSBvbGRFbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobURlbFNlbFN0YXJ0ID09IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1EZWxTZWxTdGFydCA9PSBvbGRFbmQgJiYgYmVmb3JlID09IDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBzZXQgdXAgcHJvcGVybHkgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlLCBzZW5kIHRoZSBET00gZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZERvbUV2ZW50KG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuS0VZQ09ERV9ERUwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmREb21FdmVudChuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5LRVlDT0RFX0RFTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFRoaXMgd2FzIHNpbXBseSBhIGRlbGV0ZSBvciBhIGN1dCwgc28ganVzdCBkZWxldGUgdGhlCiAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRlbGV0ZVNlbGVjdGlvbihzdGFydCwgc3RhcnQgKyBiZWZvcmUpOwotICAgICAgICAgICAgICAgIC8vIEZvciB0aGlzIGFuZCBhbGwgY2hhbmdlcyB0byB0aGUgdGV4dCwgdXBkYXRlIG91ciBjYWNoZQotICAgICAgICAgICAgICAgIHVwZGF0ZUNhY2hlZFRleHRmaWVsZCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbUdvdERlbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gYmVmb3JlIHNob3VsZCBuZXZlciBiZSBuZWdhdGl2ZSwgc28gd2hldGhlciBpdCB3YXMgYSBjdXQKICAgICAgICAgICAgIC8vIChoYW5kbGVkIGFib3ZlKSwgb3IgYmVmb3JlIGlzIDAsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBoYXMKICAgICAgICAgICAgIC8vIGNoYW5nZWQsIHdlIHNob3VsZCByZXR1cm4uCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBmbGFnIGdldHMgY2xlYXJlZCwgc2luY2Ugd2l0aCBhdXRvY29ycmVjdCBvbiwgYQorICAgICAgICAvLyBkZWxldGUga2V5IHByZXNzIG1heSBoYXZlIGEgbW9yZSBjb21wbGV4IHJlc3VsdCB0aGFuIGRlbGV0aW5nIG9uZQorICAgICAgICAvLyBjaGFyYWN0ZXIgb3IgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiwgc28gaXQgd2lsbCBub3QgZ2V0IGNsZWFyZWQKKyAgICAgICAgLy8gYWJvdmUuCisgICAgICAgIG1Hb3REZWxldGUgPSBmYWxzZTsKICAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVpbmcgcmVwbGFjZWQuICBJZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKICAgICAgICAgLy8gZXZlbnRzLCB3ZSB3aWxsIHBhc3MgdGhlbSB0byBuYXRpdmUgKGFmdGVyIHJlcGxhY2luZyB0aGUgYmVnaW5uaW5nCiAgICAgICAgIC8vIG9mIHRoZSBjaGFuZ2VkIHRleHQpLCBzbyB3ZSBjYW4gc2VlIGphdmFzY3JpcHQgZXZlbnRzLgpAQCAtNDgxLDkgKzUyOSwxMCBAQAogICAgICAgICAgICAgLy8gdG8gYmlnIGZvciB0aGUgY2FzZSBvZiBhIHNtYWxsIHRleHRmaWVsZC4KICAgICAgICAgICAgIGludCBzbWFsbGVyU2xvcCA9IHNsb3AvMjsKICAgICAgICAgICAgIGlmIChkeCA+IHNtYWxsZXJTbG9wIHx8IGR5ID4gc21hbGxlclNsb3ApIHsKLSAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhTY3JvbGxYID0gKGZsb2F0KSBUb3VjaC5nZXRNYXhTY3JvbGxYKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dCgpLCBtU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IGdldExheW91dCgpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFNjcm9sbFggPSAoZmxvYXQpIFRvdWNoLmdldE1heFNjcm9sbFgodGhpcywgbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1RFWFRfVklFVykgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAib25Ub3VjaEV2ZW50IHg9IiArIG1TY3JvbGxYICsgIiB5PSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU2Nyb2xsWSArICIgbWF4WD0iICsgbWF4U2Nyb2xsWCk7CkBAIC01NzgsMTYgKzYyNywzMSBAQAogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZW1vdmUoKSB7CiAgICAgICAgIC8vIGhpZGUgdGhlIHNvZnQga2V5Ym9hcmQgd2hlbiB0aGUgZWRpdCB0ZXh0IGlzIG91dCBvZiBmb2N1cwotICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KAotICAgICAgICAgICAgICAgIGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgaWYgKGltbS5pc0FjdGl2ZSh0aGlzKSkgeworICAgICAgICAgICAgaW1tLmhpZGVTb2Z0SW5wdXRGcm9tV2luZG93KGdldFdpbmRvd1Rva2VuKCksIDApOworICAgICAgICB9CiAgICAgICAgIG1XZWJWaWV3LnJlbW92ZVZpZXcodGhpcyk7CiAgICAgICAgIG1XZWJWaWV3LnJlcXVlc3RGb2N1cygpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1vdmUgdGhlIGNhcmV0L3NlbGVjdGlvbiBpbnRvIHZpZXcuCisgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIGJyaW5nSW50b1ZpZXcoKSB7Ci0gICAgICAgIGlmIChnZXRMYXlvdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBicmluZ1BvaW50SW50b1ZpZXcoU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChnZXRUZXh0KCkpKTsKKyAgICAgICAgYnJpbmdQb2ludEludG9WaWV3KFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQoZ2V0VGV4dCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYnJpbmdQb2ludEludG9WaWV3KGludCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3ID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG1XZWJWaWV3Lm5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TGF5b3V0KCkgIT0gbnVsbCAmJiBzdXBlci5icmluZ1BvaW50SW50b1ZpZXcob2Zmc2V0KTsKICAgICAgICAgfQorICAgICAgICAvLyBGb3Igbm9uIHBhc3N3b3JkIHRleHQgaW5wdXQsIHRlbGwgd2Via2l0IHRvIG1vdmUgdGhlIGNhcmV0L3NlbGVjdGlvbgorICAgICAgICAvLyBvbiBzY3JlZW4sIHNpbmNlIHdlYmtpdCBkcmF3cyB0aGVtLgorICAgICAgICBtV2ViVmlldy5yZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NjcsNiArNzMxLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24odGV4dCwgc2VsZWN0aW9uLCBzZWxlY3Rpb24pOwogICAgICAgICB9CisgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSBtV2ViVmlldy5pbmNyZW1lbnRUZXh0R2VuZXJhdGlvbigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTE5LDE0ICs5ODQsNCBAQAogICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoKSB7CiAgICAgICAgIG1XZWJWaWV3LnVwZGF0ZUNhY2hlZFRleHRmaWVsZChnZXRUZXh0KCkudG9TdHJpbmcoKSk7CiAgICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWVzdFJlY3RhbmdsZU9uU2NyZWVuKFJlY3QgcmVjdGFuZ2xlKSB7Ci0gICAgICAgIC8vIGRvbid0IHNjcm9sbCB3aGlsZSBpbiB6b29tIGFuaW1hdGlvbi4gV2hlbiBpdCBpcyBkb25lLCB3ZSB3aWxsIGFkanVzdAotICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgaWYgaXQgaXMgaW4gZWRpdGluZyBtb2RlLgotICAgICAgICBpZiAoIW1XZWJWaWV3LmluQW5pbWF0ZVpvb20oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RSZWN0YW5nbGVPblNjcmVlbihyZWN0YW5nbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQppbmRleCBhNzQ1NzAyLi5hM2E0YzQzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKQEAgLTE2LDM5ICsxNiw0MCBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5XaWRnZXQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhU2V0T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db3JuZXJQYXRoRWZmZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuRHJhd0ZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnRGbGFnc0RyYXdGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaWN0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5uZXQuaHR0cC5Tc2xDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnRleHQuSUNsaXBib2FyZDsKK2ltcG9ydCBhbmRyb2lkLnNwZWVjaC50dHMuVGV4dFRvU3BlZWNoOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TZWxlY3Rpb247CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwpAQCAtNjYsNDEgKzY3LDQxIEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVGV4dFZpZXcuQXV0b0NvbXBsZXRlQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5FdmVudEh1YjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEV2ZW50RGF0YTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5Ub3VjaEhpZ2hsaWdodERhdGE7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWJzb2x1dGVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja2VkVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRnZUdsb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TY3JvbGxlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5ab29tQnV0dG9uc0NvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCiAvKioKICAqIDxwPkEgVmlldyB0aGF0IGRpc3BsYXlzIHdlYiBwYWdlcy4gVGhpcyBjbGFzcyBpcyB0aGUgYmFzaXMgdXBvbiB3aGljaCB5b3UKICAqIGNhbiByb2xsIHlvdXIgb3duIHdlYiBicm93c2VyIG9yIHNpbXBseSBkaXNwbGF5IHNvbWUgb25saW5lIGNvbnRlbnQgd2l0aGluIHlvdXIgQWN0aXZpdHkuCkBAIC0xMTYsNyArMTE3LDcgQEAKICAqIDxwcmU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz48L3ByZT4KICAqCiAgKiA8cD5UaGlzIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgPGEKLSAqIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sIj57QGNvZGUgJmx0O21hbmlmZXN0Jmd0O308L2E+CisgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+e0Bjb2RlIDxtYW5pZmVzdD59PC9hPgogICogZWxlbWVudC48L3A+CiAgKgogICogPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy92aWV3cy9oZWxsby13ZWJ2aWV3Lmh0bWwiPldlYiBWaWV3CkBAIC0xMzksNyArMTQwLDcgQEAKICAqIDwvcHJlPgogICogPHA+U2VlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CiAgKgotICogPHA+VG8gcHJvdmlkZSBhIFdlYlZpZXcgaW4geW91ciBvd24gQWN0aXZpdHksIGluY2x1ZGUgYSB7QGNvZGUgJmx0O1dlYlZpZXcmZ3Q7fSBpbiB5b3VyIGxheW91dCwKKyAqIDxwPlRvIHByb3ZpZGUgYSBXZWJWaWV3IGluIHlvdXIgb3duIEFjdGl2aXR5LCBpbmNsdWRlIGEge0Bjb2RlIDxXZWJWaWV3Pn0gaW4geW91ciBsYXlvdXQsCiAgKiBvciBzZXQgdGhlIGVudGlyZSBBY3Rpdml0eSB3aW5kb3cgYXMgYSBXZWJWaWV3IGR1cmluZyB7QGxpbmsKICAqIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQ3JlYXRlKEJ1bmRsZSkgb25DcmVhdGUoKX06PC9wPgogICogPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgpAQCAtMjg2LDcgKzI4Nyw3IEBACiAgKiBsb3cgZGVuc2l0eSBzY3JlZW5zIHNjYWxlIGRvd24uIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCBiZWhhdmlvci48L2xpPgogICogPGxpPntAY29kZSBsb3ctZHBpfSAtIFVzZSBsZHBpIGFzIHRoZSB0YXJnZXQgZHBpLiBNZWRpdW0gYW5kIGhpZ2ggZGVuc2l0eSBzY3JlZW5zIHNjYWxlIHVwCiAgKiBhcyBhcHByb3ByaWF0ZS48L2xpPgotICogPGxpPjxlbT57QGNvZGUgJmx0O3ZhbHVlJmd0O308L2VtPiAtIFNwZWNpZnkgYSBkcGkgdmFsdWUgdG8gdXNlIGFzIHRoZSB0YXJnZXQgZHBpIChhY2NlcHRlZAorICogPGxpPjxlbT57QGNvZGUgPHZhbHVlPn08L2VtPiAtIFNwZWNpZnkgYSBkcGkgdmFsdWUgdG8gdXNlIGFzIHRoZSB0YXJnZXQgZHBpIChhY2NlcHRlZAogICogdmFsdWVzIGFyZSA3MC00MDApLjwvbGk+CiAgKiA8L3VsPgogICogPHA+SGVyZSdzIGFuIGV4YW1wbGUgbWV0YSB0YWcgdG8gc3BlY2lmeSB0aGUgdGFyZ2V0IGRlbnNpdHk6PC9wPgpAQCAtMjk4LDcgKzI5OSw3IEBACiAgKiBwcm9wZXJ0eSB0byB7QGNvZGUgZGV2aWNlLWRwaX0uIFRoaXMgc3RvcHMgQW5kcm9pZCBmcm9tIHBlcmZvcm1pbmcgc2NhbGluZyBpbiB5b3VyIHdlYiBwYWdlIGFuZAogICogYWxsb3dzIHlvdSB0byBtYWtlIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgZm9yIGVhY2ggZGVuc2l0eSB2aWEgQ1NTIGFuZCBKYXZhU2NyaXB0LjwvcD4KICAqCi0gKiAKKyAqCiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBXZWJWaWV3IGV4dGVuZHMgQWJzb2x1dGVMYXlvdXQKQEAgLTMxNSw0OSArMzE2LDcgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIndlYnZpZXciOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRab29tQ29udHJvbHMgZXh0ZW5kcyBGcmFtZUxheW91dCB7Ci0gICAgICAgIHB1YmxpYyBFeHRlbmRlZFpvb21Db250cm9scyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuem9vbV9tYWduaWZ5LCB0aGlzLCB0cnVlKTsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMgPSAoWm9vbUNvbnRyb2xzKSBmaW5kVmlld0J5SWQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbUNvbnRyb2xzKTsKLSAgICAgICAgICAgIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnpvb21NYWduaWZ5KS5zZXRWaXNpYmlsaXR5KAotICAgICAgICAgICAgICAgICAgICBWaWV3LkdPTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdyhib29sZWFuIHNob3dab29tLCBib29sZWFuIGNhblpvb21PdXQpIHsKLSAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgc2hvd1pvb20gPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgZmFkZShWaWV3LlZJU0lCTEUsIDAuMGYsIDEuMGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgICAgIGZhZGUoVmlldy5HT05FLCAxLjBmLCAwLjBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBmYWRlKGludCB2aXNpYmlsaXR5LCBmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgQWxwaGFBbmltYXRpb24gYW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbihzdGFydEFscGhhLCBlbmRBbHBoYSk7Ci0gICAgICAgICAgICBhbmltLnNldER1cmF0aW9uKDUwMCk7Ci0gICAgICAgICAgICBzdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLmhhc0ZvY3VzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21JbkNsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scy5zZXRPblpvb21PdXRDbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFpvb21Db250cm9scyAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzOwotICAgIH0KKyAgICBwcml2YXRlIFpvb21NYW5hZ2VyIG1ab29tTWFuYWdlcjsKIAogICAgIC8qKgogICAgICAqICBUcmFuc3BvcnRhdGlvbiBvYmplY3QgZm9yIHJldHVybmluZyBXZWJWaWV3IGFjcm9zcyB0aHJlYWQgYm91bmRhcmllcy4KQEAgLTQwMyw2ICszNjIsOCBAQAogICAgIC8vIG1vcmUga2V5IGV2ZW50cy4KICAgICBwcml2YXRlIGludCBtVGV4dEdlbmVyYXRpb247CiAKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgaW5jcmVtZW50VGV4dEdlbmVyYXRpb24oKSB7IG1UZXh0R2VuZXJhdGlvbisrOyB9CisKICAgICAvLyBVc2VkIGJ5IFdlYlZpZXdDb3JlIHRvIGNyZWF0ZSBjaGlsZCB2aWV3cy4KICAgICAvKiBwYWNrYWdlICovIGZpbmFsIFZpZXdNYW5hZ2VyIG1WaWV3TWFuYWdlcjsKIApAQCAtNDUwLDYgKzQxMSwxNCBAQAogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxYOwogICAgIHByaXZhdGUgZmxvYXQgbUxhc3RWZWxZOwogCisgICAgLy8gQSBwb2ludGVyIHRvIHRoZSBuYXRpdmUgc2Nyb2xsYWJsZSBsYXllciB3aGVuIGRyYWdnaW5nIGxheWVycy4gIE9ubHkKKyAgICAvLyB2YWxpZCB3aGVuIG1Ub3VjaE1vZGUgaXMgVE9VQ0hfRFJBR19MQVlFUl9NT0RFLgorICAgIHByaXZhdGUgaW50IG1TY3JvbGxpbmdMYXllcjsKKworICAgIC8vIG9ubHkgdHJpZ2dlciBhY2NlbGVyYXRlZCBmbGluZyBpZiB0aGUgbmV3IHZlbG9jaXR5IGlzIGF0IGxlYXN0CisgICAgLy8gTUlOSU1VTV9WRUxPQ0lUWV9SQVRJT19GT1JfQUNDRUxFUkFUSU9OIHRpbWVzIG9mIHRoZSBwcmV2aW91cyB2ZWxvY2l0eQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTiA9IDAuMmY7CisKICAgICAvKioKICAgICAgKiBUb3VjaCBtb2RlCiAgICAgICovCkBAIC00NjIsMTEgKzQzMSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPVUJMRV9UQVBfTU9ERSA9IDY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX0RPTkVfTU9ERSA9IDc7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPVUNIX1BJTkNIX0RSQUcgPSA4OwotCi0gICAgLyoqCi0gICAgICogVHJ1ZSBpZiB3ZSBoYXZlIGEgdG91Y2ggcGFuZWwgY2FwYWJsZSBvZiBkZXRlY3Rpbmcgc21vb3RoIHBhbi9zY2FsZSBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BbGxvd1BhbkFuZFNjYWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9EUkFHX0xBWUVSX01PREUgPSA5OwogCiAgICAgLy8gV2hldGhlciB0byBmb3J3YXJkIHRoZSB0b3VjaCBldmVudHMgdG8gV2ViQ29yZQogICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yd2FyZFRvdWNoRXZlbnRzID0gZmFsc2U7CkBAIC01MDUsMTAgKzQ3MCw2IEBACiAgICAgLy8gdHJ1ZSBpZiBvblBhdXNlIGhhcyBiZWVuIGNhbGxlZCAoYW5kIG5vdCBvblJlc3VtZSkKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzUGF1c2VkOwogCi0gICAgLy8gdHJ1ZSBpZiwgZHVyaW5nIGEgdHJhbnNpdGlvbiB0byBhIG5ldyBwYWdlLCB3ZSdyZSBkZWxheWluZwotICAgIC8vIGRlbGV0aW5nIGEgcm9vdCBsYXllciB1bnRpbCB0aGVyZSdzIHNvbWV0aGluZyB0byBkcmF3IG9mIHRoZSBuZXcgcGFnZS4KLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGF5ZWREZWxldGVSb290TGF5ZXI7Ci0KICAgICAvKioKICAgICAgKiBDdXN0b21pemFibGUgY29uc3RhbnQKICAgICAgKi8KQEAgLTUzMCw5ICs0OTEsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fRkxJTkdfVElNRSA9IDI1MDsKICAgICAvLyBkcmF3IHVuZmlsdGVyZWQgYWZ0ZXIgZHJhZyBpcyBoZWxkIHdpdGhvdXQgbW92ZW1lbnQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9USU9OTEVTU19USU1FID0gMTAwOwotICAgIC8vIFRoZSB0aW1lIHRoYXQgdGhlIFpvb20gQ29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQotICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOwogICAgIC8vIFRoZSBhbW91bnQgb2YgY29udGVudCB0byBvdmVybGFwIGJldHdlZW4gdHdvIHNjcmVlbnMgd2hlbiBnb2luZyB0aHJvdWdoCiAgICAgLy8gcGFnZXMgd2l0aCB0aGUgc3BhY2UgYmFyLCBpbiBwaXhlbHMuCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0NST0xMX09WRVJMQVAgPSAyNDsKQEAgLTU2NCwxMCArNTIyLDcgQEAKICAgICAvLyB0aW1lIGZvciB0aGUgbG9uZ2VzdCBzY3JvbGwgYW5pbWF0aW9uCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9EVVJBVElPTiA9IDc1MDsgICAvLyBtaWxsaXNlY29uZHMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0xJREVfVElUTEVfRFVSQVRJT04gPSA1MDA7ICAgLy8gbWlsbGlzZWNvbmRzCi0gICAgcHJpdmF0ZSBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5PdmVyU2Nyb2xsTW9kZSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIFBhaW50IG1PdmVyU2Nyb2xsQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIHN0YXRpYyBQYWludCBtT3ZlclNjcm9sbEJvcmRlcjsKKyAgICBwcml2YXRlIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtV3JhcENvbnRlbnQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfRkFMU0UgICAgICAgICAgID0gMDsKQEAgLTU3NiwxNSArNTMxLDI0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVElPTkxFU1NfSUdOT1JFICAgICAgICAgID0gMzsKICAgICBwcml2YXRlIGludCBtSGVsZE1vdGlvbmxlc3M7CiAKLSAgICAvLyB3aGV0aGVyIHN1cHBvcnQgbXVsdGktdG91Y2gKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1cHBvcnRNdWx0aVRvdWNoOwotICAgIC8vIHVzZSB0aGUgZnJhbWV3b3JrJ3MgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgdG8gaGFuZGxlIG11bHRpLXRvdWNoCi0gICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKyAgICAvLyBBbiBpbnN0YW5jZSBmb3IgaW5qZWN0aW5nIGFjY2Vzc2liaWxpdHkgaW4gV2ViVmlld3Mgd2l0aCBkaXNhYmxlZAorICAgIC8vIEphdmFTY3JpcHQgb3Igb25lcyBmb3Igd2hpY2ggbm8gYWNjZXNzaWJpbGl0eSBzY3JpcHQgZXhpc3RzCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5SW5qZWN0b3IgbUFjY2Vzc2liaWxpdHlJbmplY3RvcjsKIAotICAgIC8vIHRoZSBhbmNob3IgcG9pbnQgaW4gdGhlIGRvY3VtZW50IHNwYWNlIHdoZXJlIFZJRVdfU0laRV9DSEFOR0VEIHNob3VsZAotICAgIC8vIGFwcGx5IHRvCi0gICAgcHJpdmF0ZSBpbnQgbUFuY2hvclg7Ci0gICAgcHJpdmF0ZSBpbnQgbUFuY2hvclk7CisgICAgLy8gdGhlIGNvbG9yIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSB0b3VjaCByZWN0YW5nbGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1IaWdodGxpZ2h0Q29sb3IgPSAweDMzMDAwMDAwOworICAgIC8vIHRoZSByb3VuZCBjb3JuZXIgZm9yIHRoZSBoaWdobGlnaHQgcGF0aAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFRPVUNIX0hJR0hMSUdIVF9BUkMgPSA1LjBmOworICAgIC8vIHRoZSByZWdpb24gaW5kaWNhdGluZyB3aGVyZSB0aGUgdXNlciB0b3VjaGVkIG9uIHRoZSBzY3JlZW4KKyAgICBwcml2YXRlIFJlZ2lvbiBtVG91Y2hIaWdobGlnaHRSZWdpb24gPSBuZXcgUmVnaW9uKCk7CisgICAgLy8gdGhlIHBhaW50IGZvciB0aGUgdG91Y2ggaGlnaGxpZ2h0CisgICAgcHJpdmF0ZSBQYWludCBtVG91Y2hIaWdodGxpZ2h0UGFpbnQ7CisgICAgLy8gZGVidWcgb25seQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVE9VQ0hfSElHSExJR0hUID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FID0gMjAwMDsKKyAgICBwcml2YXRlIFBhaW50IG1Ub3VjaENyb3NzSGFpckNvbG9yOworICAgIHByaXZhdGUgaW50IG1Ub3VjaEhpZ2hsaWdodFg7CisgICAgcHJpdmF0ZSBpbnQgbVRvdWNoSGlnaGxpZ2h0WTsKIAogICAgIC8qCiAgICAgICogUHJpdmF0ZSBtZXNzYWdlIGlkcwpAQCAtNjE4LDcgKzU4Miw3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRCAgICAgICAgID0gMTA3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRCAgICAgICA9IDEwODsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9aT09NX1JBTkdFICAgICAgICAgICAgICAgICAgPSAxMDk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNT1ZFX09VVF9PRl9QTFVHSU4gICAgICAgICAgICAgICAgID0gMTEwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5IQU5ETEVEX05BVl9LRVkgICAgICAgICAgICAgICAgICA9IDExMDsKICAgICBzdGF0aWMgZmluYWwgaW50IENMRUFSX1RFWFRfRU5UUlkgICAgICAgICAgICAgICAgICAgPSAxMTE7CiAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfVEVYVF9TRUxFQ1RJT05fTVNHX0lEICAgICAgID0gMTEyOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19SRUNUX01TR19JRCAgICAgICAgICAgICAgICAgICA9IDExMzsKQEAgLTYzMiwxNiArNTk2LDE5IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX0ZVTExTQ1JFRU4gICAgICAgICAgICAgICAgICAgID0gMTIwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgSElERV9GVUxMU0NSRUVOICAgICAgICAgICAgICAgICAgICA9IDEyMTsKICAgICBzdGF0aWMgZmluYWwgaW50IERPTV9GT0NVU19DSEFOR0VEICAgICAgICAgICAgICAgICAgPSAxMjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBJTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQgICAgICAgICAgID0gMTIzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VUX1JPT1RfTEFZRVJfTVNHX0lEICAgICAgICAgICAgICA9IDEyNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfQkFTRV9DT05URU5UICAgICAgICAgICAgICAgPSAxMjM7CisgICAgLy8gMTI0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVUVVJOX0xBQkVMICAgICAgICAgICAgICAgICAgICAgICA9IDEyNTsKICAgICBzdGF0aWMgZmluYWwgaW50IEZJTkRfQUdBSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjY7CiAgICAgc3RhdGljIGZpbmFsIGludCBDRU5URVJfRklUX1JFQ1QgICAgICAgICAgICAgICAgICAgID0gMTI3OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQgPSAxMjg7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVRfU0NST0xMQkFSX01PREVTICAgICAgICAgICAgICAgID0gMTI5OworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OX1NUUklOR19DSEFOR0VEICAgICAgICAgICA9IDEzMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMgICAgICAgICAgPSAxMzE7CisgICAgc3RhdGljIGZpbmFsIGludCBTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQgICAgICAgICAgID0gMTMyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BBQ0tBR0VfTVNHX0lEID0gU0NST0xMX1RPX01TR19JRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QQUNLQUdFX01TR19JRCA9IFNFVF9TQ1JPTExCQVJfTU9ERVM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhhbmRsZXJQcml2YXRlRGVidWdTdHJpbmcgPSB7CiAgICAgICAgICJSRU1FTUJFUl9QQVNTV09SRCIsIC8vICAgICAgICAgICAgICA9IDE7CkBAIC02NjYsNyArNjMzLDcgQEAKICAgICAgICAgIldFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEIiwgLy8gICAgID0gMTA3OwogICAgICAgICAiVVBEQVRFX1RFWFRGSUVMRF9URVhUX01TR19JRCIsIC8vICAgPSAxMDg7CiAgICAgICAgICJVUERBVEVfWk9PTV9SQU5HRSIsIC8vICAgICAgICAgICAgICA9IDEwOTsKLSAgICAgICAgIk1PVkVfT1VUX09GX1BMVUdJTiIsIC8vICAgICAgICAgICAgID0gMTEwOworICAgICAgICAiVU5IQU5ETEVEX05BVl9LRVkiLCAvLyAgICAgICAgICAgICAgPSAxMTA7CiAgICAgICAgICJDTEVBUl9URVhUX0VOVFJZIiwgLy8gICAgICAgICAgICAgICA9IDExMTsKICAgICAgICAgIlVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQiLCAvLyAgID0gMTEyOwogICAgICAgICAiU0hPV19SRUNUX01TR19JRCIsIC8vICAgICAgICAgICAgICAgPSAxMTM7CkBAIC02NzksMTggKzY0NiwyMSBAQAogICAgICAgICAiU0hPV19GVUxMU0NSRUVOIiwgLy8gICAgICAgICAgICAgICAgPSAxMjA7CiAgICAgICAgICJISURFX0ZVTExTQ1JFRU4iLCAvLyAgICAgICAgICAgICAgICA9IDEyMTsKICAgICAgICAgIkRPTV9GT0NVU19DSEFOR0VEIiwgLy8gICAgICAgICAgICAgID0gMTIyOwotICAgICAgICAiSU1NRURJQVRFX1JFUEFJTlRfTVNHX0lEIiwgLy8gICAgICAgPSAxMjM7Ci0gICAgICAgICJTRVRfUk9PVF9MQVlFUl9NU0dfSUQiLCAvLyAgICAgICAgICA9IDEyNDsKKyAgICAgICAgIlJFUExBQ0VfQkFTRV9DT05URU5UIiwgLy8gICAgICAgICAgID0gMTIzOworICAgICAgICAiMTI0IiwgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjQ7CiAgICAgICAgICJSRVRVUk5fTEFCRUwiLCAvLyAgICAgICAgICAgICAgICAgICA9IDEyNTsKICAgICAgICAgIkZJTkRfQUdBSU4iLCAvLyAgICAgICAgICAgICAgICAgICAgID0gMTI2OwogICAgICAgICAiQ0VOVEVSX0ZJVF9SRUNUIiwgLy8gICAgICAgICAgICAgICAgPSAxMjc7CiAgICAgICAgICJSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRCIsIC8vID0gMTI4OwotICAgICAgICAiU0VUX1NDUk9MTEJBUl9NT0RFUyIgLy8gICAgICAgICAgICAgPSAxMjk7CisgICAgICAgICJTRVRfU0NST0xMQkFSX01PREVTIiwgLy8gICAgICAgICAgICA9IDEyOTsKKyAgICAgICAgIlNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCIsIC8vICAgICAgID0gMTMwOworICAgICAgICAiU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyIsIC8vICAgICAgPSAxMzE7CisgICAgICAgICJTQVZFX1dFQkFSQ0hJVkVfRklOSVNIRUQiIC8vICAgICAgICA9IDEzMjsKICAgICB9OwogCiAgICAgLy8gSWYgdGhlIHNpdGUgZG9lc24ndCB1c2UgdGhlIHZpZXdwb3J0IG1ldGEgdGFnIHRvIHNwZWNpZnkgdGhlIHZpZXdwb3J0LAogICAgIC8vIHVzZSBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIIGFzIHRoZSBkZWZhdWx0IHZpZXdwb3J0IHdpZHRoCi0gICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIID0gODAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WSUVXUE9SVF9XSURUSCA9IDEwNDA7CiAKICAgICAvLyBub3JtYWxseSB3ZSB0cnkgdG8gZml0IHRoZSBjb250ZW50IHRvIHRoZSBtaW5pbXVtIHByZWZlcnJlZCB3aWR0aAogICAgIC8vIGNhbGN1bGF0ZWQgYnkgdGhlIFdlYmtpdC4gVG8gYXZvaWQgdGhlIGJhZCBiZWhhdmlvciB3aGVuIHNvbWUgc2l0ZSdzCkBAIC02OTgsNDkgKzY2OCw5IEBACiAgICAgLy8gdGhlIG1pbmltdW0gcHJlZmVycmVkIHdpZHRoIGlzIGh1Z2UsIGFuIHVwcGVyIGxpbWl0IGlzIG5lZWRlZC4KICAgICBzdGF0aWMgaW50IHNNYXhWaWV3cG9ydFdpZHRoID0gREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKIAotICAgIC8vIGRlZmF1bHQgc2NhbGUgbGltaXQuIERlcGVuZGluZyBvbiB0aGUgZGlzcGxheSBkZW5zaXR5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBERUZBVUxUX01JTl9aT09NX1NDQUxFOwotICAgIC8vIHNjYWxlIGxpbWl0LCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggdmlld3BvcnQgbWV0YSB0YWcgaW4gdGhlIHdlYiBwYWdlCi0gICAgcHJpdmF0ZSBmbG9hdCBtTWF4Wm9vbVNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbU1pblpvb21TY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLQogICAgIC8vIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4gMCBtZWFucyB1c2luZyBkZWZhdWx0LgogICAgIHByaXZhdGUgaW50IG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSAwOwogCi0gICAgLy8gd2hpbGUgaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZSwgdGhlIHBhZ2UncyB3aWR0aCBpcyBmdWxseSBmaXQgdG8gdGhlCi0gICAgLy8gY3VycmVudCB3aW5kb3cuIFRoZSBwYWdlIGlzIGFsaXZlLCBpbiBhbm90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvCi0gICAgLy8gZm9sbG93IHRoZSBsaW5rcy4gRG91YmxlIHRhcCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHpvb20gb3ZlcnZpZXcgbW9kZSBhbmQKLSAgICAvLyB0aGUgbGFzdCB6b29tIHNjYWxlLgotICAgIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0KLSAgICAvLyBpZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UgZXNwbiwKLSAgICAvLyBlbmdhZGdldCBhbHdheXMgaGF2ZSB3aWRlciBtQ29udGVudFdpZHRoIG5vIG1hdHRlciB3aGF0IHZpZXdwb3J0IHNpemUgaXMuCi0gICAgaW50IG1ab29tT3ZlcnZpZXdXaWR0aCA9IERFRkFVTFRfVklFV1BPUlRfV0lEVEg7Ci0gICAgZmxvYXQgbVRleHRXcmFwU2NhbGU7Ci0KLSAgICAvLyBkZWZhdWx0IHNjYWxlLiBEZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgZGVuc2l0eS4KLSAgICBzdGF0aWMgaW50IERFRkFVTFRfU0NBTEVfUEVSQ0VOVDsKLSAgICBwcml2YXRlIGZsb2F0IG1EZWZhdWx0U2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCA9IDAuMDFmOwotCi0gICAgLy8gc2V0IHRvIHRydWUgdGVtcG9yYXJpbHkgZHVyaW5nIFNjYWxlR2VzdHVyZSB0cmlnZ2VyZWQgem9vbQotICAgIHByaXZhdGUgYm9vbGVhbiBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7Ci0KLSAgICAvLyBjb21wdXRlZCBzY2FsZSBhbmQgaW52ZXJzZSwgZnJvbSBtWm9vbVdpZHRoLgotICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOwotICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOwotICAgIC8vIGlmIHRoaXMgaXMgbm9uLXplcm8sIGl0IGlzIHVzZWQgb24gZHJhd2luZyByYXRoZXIgdGhhbiBtQWN0dWFsU2NhbGUKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKLSAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7Ci0gICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOwotICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX0FOSU1BVElPTl9MRU5HVEggPSA1MDA7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbVVzZXJTY3JvbGwgPSBmYWxzZTsKIAogICAgIHByaXZhdGUgaW50IG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfTk9ORTsKQEAgLTc2NCwyNiArNjk0LDE4IEBACiAgICAgcHJpdmF0ZSBpbnQgbUhvcml6b250YWxTY3JvbGxCYXJNb2RlID0gU0NST0xMQkFSX0FVVE87CiAgICAgcHJpdmF0ZSBpbnQgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9IFNDUk9MTEJBUl9BVVRPOwogCi0gICAgLyoqCi0gICAgICogTWF4IGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgYnkgaW4gcGl4ZWxzLgotICAgICAqIFRoaXMgaG93IGZhciBjb250ZW50IGNhbiBiZSBwdWxsZWQgYmV5b25kIGl0cyBub3JtYWwgYm91bmRzIGJ5IHRoZSB1c2VyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyc2Nyb2xsRGlzdGFuY2U7CisgICAgLy8gdGhlIGFsaWFzIHZpYSB3aGljaCBhY2Nlc3NpYmlsaXR5IEphdmFTY3JpcHQgaW50ZXJmYWNlIGlzIGV4cG9zZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfQUNDRVNTSUJJTElUWV9KU19JTlRFUkZBQ0UgPSAiYWNjZXNzaWJpbGl0eSI7CiAKLSAgICAvKioKLSAgICAgKiBNYXggZGlzdGFuY2UgdG8gb3ZlcmZsaW5nIGJ5IGluIHBpeGVscy4KLSAgICAgKiBUaGlzIGlzIGhvdyBmYXIgZmxpbmdlZCBjb250ZW50IGNhbiBtb3ZlIGJleW9uZCB0aGUgZW5kIG9mIGl0cyBub3JtYWwgYm91bmRzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKLQotICAgIC8qCi0gICAgICogVGhlc2UgbWFuYWdlIHRoZSBlZGdlIGdsb3cgZWZmZWN0IHdoZW4gZmx1bmcgb3IgcHVsbGVkIGJleW9uZCB0aGUgZWRnZXMuCi0gICAgICogSWYgb25lIGlzIG5vdCBudWxsLCBhbGwgYXJlIG5vdCBudWxsLiBDaGVja2luZyBvbmUgZm9yIG51bGwgaXMgYXMgZ29vZCBhcyBjaGVja2luZyBlYWNoLgotICAgICAqLwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93Qm90dG9tOwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93TGVmdDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1JpZ2h0OworICAgIC8vIEphdmFTY3JpcHQgdG8gaW5qZWN0IHRoZSBzY3JpcHQgY2hvb3NlciB3aGljaCB3aWxsCisgICAgLy8gcGljayB0aGUgcmlnaHQgc2NyaXB0IGZvciB0aGUgY3VycmVudCBVUkwKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTSUJJTElUWV9TQ1JJUFRfQ0hPT1NFUl9KQVZBU0NSSVBUID0KKyAgICAgICAgImphdmFzY3JpcHQ6KGZ1bmN0aW9uKCkgeyIgKworICAgICAgICAiICAgIHZhciBjaG9vc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IiArCisgICAgICAgICIgICAgY2hvb3Nlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IiArCisgICAgICAgICIgICAgY2hvb3Nlci5zcmMgPSAnaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vYWNjZXNzaWJpbGl0eS9qYXZhc2NyaXB0L2FuZHJvaWQvQW5kcm9pZFNjcmlwdENob29zZXIudXNlci5qcyc7IiArCisgICAgICAgICIgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChjaG9vc2VyKTsiICsKKyAgICAgICAgIiAgfSkoKTsiOwogCiAgICAgLy8gVXNlZCB0byBtYXRjaCBrZXkgZG93bnMgYW5kIGtleSB1cHMKICAgICBwcml2YXRlIGJvb2xlYW4gbUdvdEtleURvd247CkBAIC04ODksNDMgKzgxMSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGUgVmlldyBjb250YWluaW5nIHRoZSB6b29tIGNvbnRyb2xzCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBtWm9vbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVpvb21Db250cm9sUnVubmFibGU7Ci0KLSAgICAvLyBtWm9vbUJ1dHRvbnNDb250cm9sbGVyIHdpbGwgYmUgbGF6eSBpbml0aWFsaXplZCBpbgotICAgIC8vIGdldFpvb21CdXR0b25zQ29udHJvbGxlcigpIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCi0gICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgbVpvb21CdXR0b25zQ29udHJvbGxlcjsKLQotICAgIC8vIFRoZXNlIGtlZXAgdHJhY2sgb2YgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbS4gIFRoZXkgYXJlIHVzZWQgdG8KLSAgICAvLyBkZXRlcm1pbmUgdGhlIHBvaW50IGFyb3VuZCB3aGljaCB3ZSBzaG91bGQgem9vbS4KLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWDsKLSAgICBwcml2YXRlIGZsb2F0IG1ab29tQ2VudGVyWTsKLQotICAgIHByaXZhdGUgWm9vbUJ1dHRvbnNDb250cm9sbGVyLk9uWm9vbUxpc3RlbmVyIG1ab29tTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lcigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKGJvb2xlYW4gdmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwotICAgICAgICAgICAgICAgIC8vIEJyaW5nIGJhY2sgdGhlIGhpZGRlbiB6b29tIGNvbnRyb2xzLgotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuZ2V0Wm9vbUNvbnRyb2xzKCkuc2V0VmlzaWJpbGl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblpvb20oYm9vbGVhbiB6b29tSW4pIHsKLSAgICAgICAgICAgIGlmICh6b29tSW4pIHsKLSAgICAgICAgICAgICAgICB6b29tSW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgfQotICAgIH07Ci0KICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgV2ViVmlldyB3aXRoIGEgQ29udGV4dCBvYmplY3QuCiAgICAgICogQHBhcmFtIGNvbnRleHQgQSBDb250ZXh0IG9iamVjdCB1c2VkIHRvIGFjY2VzcyBhcHBsaWNhdGlvbiBhc3NldHMuCkBAIC05NTAsNyArODM1LDE4IEBACiAgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZSBkZWZhdWx0IHN0eWxlIHJlc291cmNlIElELgogICAgICAqLwogICAgIHB1YmxpYyBXZWJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIG51bGwpOworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBXZWJWaWV3IHdpdGggbGF5b3V0IHBhcmFtZXRlcnMgYW5kIGEgZGVmYXVsdCBzdHlsZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KKyAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAorICAgICAgICAgICAgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIG51bGwsIHByaXZhdGVCcm93c2luZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NjEsNTMgKzg1NywxMzQgQEAKICAgICAgKiBAcGFyYW0gY29udGV4dCBBIENvbnRleHQgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIGFwcGxpY2F0aW9uIGFzc2V0cy4KICAgICAgKiBAcGFyYW0gYXR0cnMgQW4gQXR0cmlidXRlU2V0IHBhc3NlZCB0byBvdXIgcGFyZW50LgogICAgICAqIEBwYXJhbSBkZWZTdHlsZSBUaGUgZGVmYXVsdCBzdHlsZSByZXNvdXJjZSBJRC4KLSAgICAgKiBAcGFyYW0gamF2YXNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50YXJlZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIGlzIGEgTWFwIG9mIGludGVyZmFjZSBuYW1lcywgYXMga2V5cywgYW5kCiAgICAgICogb2JqZWN0IGltcGxlbWVudGluZyB0aG9zZSBpbnRlcmZhY2VzLCBhcyB2YWx1ZXMuCiAgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgV2ViVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcykgeworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqYXZhc2NyaXB0SW50ZXJmYWNlcywgYm9vbGVhbiBwcml2YXRlQnJvd3NpbmcpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKLSAgICAgICAgaW5pdCgpOworCisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShjb250ZXh0KS5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqYXZhc2NyaXB0SW50ZXJmYWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhwb3NlQWNjZXNzaWJpbGl0eUphdmFTY3JpcHRBcGkoamF2YXNjcmlwdEludGVyZmFjZXMpOworICAgICAgICB9CiAKICAgICAgICAgbUNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eShjb250ZXh0LCB0aGlzKTsKICAgICAgICAgbVZpZXdNYW5hZ2VyID0gbmV3IFZpZXdNYW5hZ2VyKHRoaXMpOwogICAgICAgICBtV2ViVmlld0NvcmUgPSBuZXcgV2ViVmlld0NvcmUoY29udGV4dCwgdGhpcywgbUNhbGxiYWNrUHJveHksIGphdmFzY3JpcHRJbnRlcmZhY2VzKTsKICAgICAgICAgbURhdGFiYXNlID0gV2ViVmlld0RhdGFiYXNlLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGNvbnRleHQpOworICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoY29udGV4dCk7CisgICAgICAgIG1ab29tTWFuYWdlciA9IG5ldyBab29tTWFuYWdlcih0aGlzLCBtQ2FsbGJhY2tQcm94eSk7CiAKKyAgICAgICAgLyogVGhlIGluaXQgbWV0aG9kIG11c3QgZm9sbG93IHRoZSBjcmVhdGlvbiBvZiBjZXJ0YWluIG1lbWJlciB2YXJpYWJsZXMsCisgICAgICAgICAqIHN1Y2ggYXMgdGhlIG1ab29tTWFuYWdlci4KKyAgICAgICAgICovCisgICAgICAgIGluaXQoKTsKKyAgICAgICAgc2V0dXBQYWNrYWdlTGlzdGVuZXIoY29udGV4dCk7CiAgICAgICAgIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KGNvbnRleHQpOworCisgICAgICAgIGlmIChwcml2YXRlQnJvd3NpbmcpIHsKKyAgICAgICAgICAgIHN0YXJ0UHJpdmF0ZUJyb3dzaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBpbnRlbnQgcmVjZWl2ZXIgdGhhdCBtb25pdG9ycyBmb3IgY2hhbmdlcyB0byByZWxldmFudCBwYWNrYWdlcyAoZS5nLiwKKyAgICAgKiBzR29vZ2xlQXBwcykgYW5kIG5vdGlmaWVzIFdlYlZpZXdDb3JlIG9mIHRoZWlyIGV4aXN0ZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCcm9hZGNhc3RSZWNlaXZlciBzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyID0gbnVsbDsKKworICAgIC8qCisgICAgICogQSBzZXQgb2YgR29vZ2xlIHBhY2thZ2VzIHdlIG1vbml0b3IgZm9yIHRoZQorICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLiBBZGQgYWRkaXRpb25hbCBwYWNrYWdlcyBhcworICAgICAqIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBzR29vZ2xlQXBwczsKKyAgICBzdGF0aWMgeworICAgICAgICBzR29vZ2xlQXBwcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgc0dvb2dsZUFwcHMuYWRkKCJjb20uZ29vZ2xlLmFuZHJvaWQueW91dHViZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFBhY2thZ2VMaXN0ZW5lcihDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiB3ZSBtdXN0IHN5bmNocm9uaXplIHRoZSBpbnN0YW5jZSBjaGVjayBhbmQgdGhlIGNyZWF0aW9uIG9mIHRoZQorICAgICAgICAgKiByZWNlaXZlciB0byBlbnN1cmUgdGhhdCBvbmx5IE9ORSByZWNlaXZlciBleGlzdHMgZm9yIGFsbCBXZWJWaWV3CisgICAgICAgICAqIGluc3RhbmNlcy4KKyAgICAgICAgICovCisgICAgICAgIHN5bmNocm9uaXplZCAoV2ViVmlldy5jbGFzcykgeworCisgICAgICAgICAgICAvLyBpZiB0aGUgcmVjZWl2ZXIgYWxyZWFkeSBleGlzdHMgdGhlbiB3ZSBkbyBub3QgbmVlZCB0byByZWdpc3RlciBpdAorICAgICAgICAgICAgLy8gYWdhaW4KKyAgICAgICAgICAgIGlmIChzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7CisgICAgICAgICAgICBzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBpbnRlbnQuZ2V0RGF0YSgpLmdldFNjaGVtZVNwZWNpZmljUGFydCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlcGxhY2luZyA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQuZXF1YWxzKGFjdGlvbikgJiYgcmVwbGFjaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyByZXBsYWNpbmcsIHJlZnJlc2hQbHVnaW5zKCkgd2hlbiBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzR29vZ2xlQXBwcy5jb250YWlucyhwYWNrYWdlTmFtZSkgJiYgbVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQURERUQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVNT1ZFX1BBQ0tBR0VfTkFNRSwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUGx1Z2luTWFuYWdlciBwbSA9IFBsdWdpbk1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwbS5jb250YWluc1BsdWdpblBlcm1pc3Npb25BbmRTaWduYXR1cmVzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG0ucmVmcmVzaFBsdWdpbnMoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhhY3Rpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihzUGFja2FnZUluc3RhbGxhdGlvblJlY2VpdmVyLCBmaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgaWYgYW55IG9mIHRoZSBtb25pdG9yZWQgYXBwcyBhcmUgYWxyZWFkeSBpbnN0YWxsZWQKKyAgICAgICAgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFNldDxTdHJpbmc+PiB0YXNrID0gbmV3IEFzeW5jVGFzazxWb2lkLCBWb2lkLCBTZXQ8U3RyaW5nPj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gdW51c2VkKSB7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaW5zdGFsbGVkUGFja2FnZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgICAgIExpc3Q8UGFja2FnZUluZm8+IHBhY2thZ2VzID0gcG0uZ2V0SW5zdGFsbGVkUGFja2FnZXMoMCk7CisgICAgICAgICAgICAgICAgZm9yIChQYWNrYWdlSW5mbyBwIDogcGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNHb29nbGVBcHBzLmNvbnRhaW5zKHAucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWRQYWNrYWdlcy5hZGQocC5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZFBhY2thZ2VzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeGVjdXRlcyBvbiB0aGUgVUkgdGhyZWFkCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoU2V0PFN0cmluZz4gaW5zdGFsbGVkUGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkFERF9QQUNLQUdFX05BTUVTLCBpbnN0YWxsZWRQYWNrYWdlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0YXNrLmV4ZWN1dGUoKTsKICAgICB9CiAKICAgICB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7Ci0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBtU3VwcG9ydE11bHRpVG91Y2ggPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5zdXBwb3J0Wm9vbSgpICYmIHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKTsKLSAgICAgICAgbUFsbG93UGFuQW5kU2NhbGUgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9ESVNUSU5DVCk7Ci0gICAgICAgIGlmIChtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yID09IG51bGwpKSB7Ci0gICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG5ldyBTY2FsZUdlc3R1cmVEZXRlY3Rvcihjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBuZXcgU2NhbGVEZXRlY3Rvckxpc3RlbmVyKCkpOwotICAgICAgICB9IGVsc2UgaWYgKCFtU3VwcG9ydE11bHRpVG91Y2ggJiYgKG1TY2FsZURldGVjdG9yICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtU2NhbGVEZXRlY3RvciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgIGJvb2xlYW4gY2FuWm9vbUluID0gbUFjdHVhbFNjYWxlIDwgbU1heFpvb21TY2FsZTsKLSAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbUFjdHVhbFNjYWxlID4gbU1pblpvb21TY2FsZSAmJiAhbUluWm9vbU92ZXJ2aWV3OwotICAgICAgICBpZiAoIWNhblpvb21JbiAmJiAhY2FuWm9vbU91dCkgewotICAgICAgICAgICAgLy8gSGlkZSB0aGUgem9vbSBpbiBhbmQgb3V0IGJ1dHRvbnMsIGFzIHdlbGwgYXMgdGhlIGZpdCB0byBwYWdlCi0gICAgICAgICAgICAvLyBidXR0b24sIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCi0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluCi0gICAgICAgICAgICAvLyBvciBvdXQuCi0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21JbkVuYWJsZWQoY2FuWm9vbUluKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0Wm9vbU91dEVuYWJsZWQoY2FuWm9vbU91dCk7Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLnVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KGNvbnRleHQpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewpAQCAtMTAyNyw1NyArMTAwNCwzOCBAQAogICAgICAgICAvLyB1c2Ugb25lIGxpbmUgaGVpZ2h0LCAxNiBiYXNlZCBvbiBvdXIgY3VycmVudCBkZWZhdWx0IGZvbnQsIGZvciBob3cKICAgICAgICAgLy8gZmFyIHdlIGFsbG93IGEgdG91Y2ggYmUgYXdheSBmcm9tIHRoZSBlZGdlIG9mIGEgbGluawogICAgICAgICBtTmF2U2xvcCA9IChpbnQpICgxNiAqIGRlbnNpdHkpOwotICAgICAgICAvLyBkZW5zaXR5IGFkanVzdGVkIHNjYWxlIGZhY3RvcnMKLSAgICAgICAgREVGQVVMVF9TQ0FMRV9QRVJDRU5UID0gKGludCkgKDEwMCAqIGRlbnNpdHkpOwotICAgICAgICBtRGVmYXVsdFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUFjdHVhbFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIGRlbnNpdHk7Ci0gICAgICAgIG1UZXh0V3JhcFNjYWxlID0gZGVuc2l0eTsKLSAgICAgICAgREVGQVVMVF9NQVhfWk9PTV9TQ0FMRSA9IDQuMGYgKiBkZW5zaXR5OwotICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgbU1pblpvb21TY2FsZSA9IERFRkFVTFRfTUlOX1pPT01fU0NBTEU7CisgICAgICAgIG1ab29tTWFuYWdlci5pbml0KGRlbnNpdHkpOwogICAgICAgICBtTWF4aW11bUZsaW5nID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpOworCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGludmVyc2Ugb2YgdGhlIGRlbnNpdHkgc3F1YXJlZC4KKyAgICAgICAgRFJBR19MQVlFUl9JTlZFUlNFX0RFTlNJVFlfU1FVQVJFRCA9IDEgLyAoZGVuc2l0eSAqIGRlbnNpdHkpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIHN1cGVyLnNldE92ZXJzY3JvbGxNb2RlKG1vZGUpOwotICAgICAgICBpZiAobW9kZSAhPSBPVkVSU0NST0xMX05FVkVSKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodCA9IG5ldyBFZGdlR2xvdyhlZGdlLCBnbG93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1FZGdlR2xvd1RvcCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20gPSBudWxsOwotICAgICAgICAgICAgbUVkZ2VHbG93TGVmdCA9IG51bGw7Ci0gICAgICAgICAgICBtRWRnZUdsb3dSaWdodCA9IG51bGw7CisgICAgLyoqCisgICAgICogRXhwb3NlcyBhY2Nlc3NpYmlsaXR5IEFQSXMgdG8gSmF2YVNjcmlwdCBieSBhcHBlbmRpbmcgdGhlbSB0byB0aGUgSmF2YVNjcmlwdAorICAgICAqIGludGVyZmFjZXMgbWFwIHByb3ZpZGVkIGJ5IHRoZSBXZWJWaWV3IGNsaWVudC4gSW4gY2FzZSBvZiBjb25mbGljdGluZworICAgICAqIGFsaWFzIHdpdGggdGhlIG9uZSBvZiB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgdGhlIHVzZXIgc3BlY2lmaWVkIG9uZSB3aW5zLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFzY3JpcHRJbnRlcmZhY2VzIEEgbWFwIHdpdGggaW50ZXJmYWNlcyB0byBiZSBleHBvc2VkIHRvIEphdmFTY3JpcHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cG9zZUFjY2Vzc2liaWxpdHlKYXZhU2NyaXB0QXBpKE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YXNjcmlwdEludGVyZmFjZXMpIHsKKyAgICAgICAgaWYgKGphdmFzY3JpcHRJbnRlcmZhY2VzLmNvbnRhaW5zS2V5KEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFKSkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiSmF2YVNjcmlwdCBpbnRlcmZhY2UgbWFwcGVkIHRvIFwiIiArIEFMSUFTX0FDQ0VTU0lCSUxJVFlfSlNfSU5URVJGQUNFCisgICAgICAgICAgICAgICAgICAgICsgIlwiIG92ZXJyaWRlcyB0aGUgYWNjZXNzaWJpbGl0eSBBUEkgSmF2YVNjcmlwdCBpbnRlcmZhY2UuIE5vIGFjY2Vzc2liaWxpdHkiCisgICAgICAgICAgICAgICAgICAgICsgIkFQSSB3aWxsIGJlIGV4cG9zZWQgdG8gSmF2YVNjcmlwdCEiKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCisgICAgICAgIC8vIGV4cG9zZSB0aGUgVFRTIGZvciBub3cgLi4uCisgICAgICAgIGphdmFzY3JpcHRJbnRlcmZhY2VzLnB1dChBTElBU19BQ0NFU1NJQklMSVRZX0pTX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICBuZXcgVGV4dFRvU3BlZWNoKGdldENvbnRleHQoKSwgbnVsbCkpOwogICAgIH0KIAogICAgIC8qIHBhY2thZ2UgKi92b2lkIHVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShpbnQgem9vbURlbnNpdHkpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkKKyAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eQogICAgICAgICAgICAgICAgICogMTAwIC8gem9vbURlbnNpdHk7Ci0gICAgICAgIGlmIChNYXRoLmFicyhkZW5zaXR5IC0gbURlZmF1bHRTY2FsZSkgPiAwLjAxKSB7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGRlbnNpdHkgLyBtRGVmYXVsdFNjYWxlOwotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW1pdHMKLSAgICAgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX1NDQUxFX1BFUkNFTlQgPSAoaW50KSAoMTAwICogZGVuc2l0eSk7Ci0gICAgICAgICAgICBERUZBVUxUX01BWF9aT09NX1NDQUxFID0gNC4wZiAqIGRlbnNpdHk7Ci0gICAgICAgICAgICBERUZBVUxUX01JTl9aT09NX1NDQUxFID0gMC4yNWYgKiBkZW5zaXR5OwotICAgICAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlbnNpdHk7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlICo9IHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZSAqPSBzY2FsZUZhY3RvcjsKLSAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtQWN0dWFsU2NhbGUgKiBzY2FsZUZhY3RvciwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB9CisgICAgICAgIG1OYXZTbG9wID0gKGludCkgKDE2ICogZGVuc2l0eSk7CisgICAgICAgIG1ab29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZGVuc2l0eSk7CiAgICAgfQogCiAgICAgLyogcGFja2FnZSAqLyBib29sZWFuIG9uU2F2ZVBhc3N3b3JkKFN0cmluZyBzY2hlbWVQbHVzSG9zdCwgU3RyaW5nIHVzZXJuYW1lLApAQCAtMTE5NCwxNiArMTE1MiwxNyBAQAogICAgICAqIHJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgdGl0bGViYXJ2aWV3IChpZiBhbnkpLiBEb2VzIG5vdCBjYXJlIGFib3V0CiAgICAgICogc2Nyb2xsaW5nCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7CisgICAgaW50IGdldFRpdGxlSGVpZ2h0KCkgewogICAgICAgICByZXR1cm4gbVRpdGxlQmFyICE9IG51bGwgPyBtVGl0bGVCYXIuZ2V0SGVpZ2h0KCkgOiAwOwogICAgIH0KIAogICAgIC8qCiAgICAgICogUmV0dXJuIHRoZSBhbW91bnQgb2YgdGhlIHRpdGxlYmFydmlldyAoaWYgYW55KSB0aGF0IGlzIHZpc2libGUKKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgewotICAgICAgICAvLyBuZWVkIHRvIHJlc3RyaWN0IG1TY3JvbGxZIGR1ZSB0byBvdmVyIHNjcm9sbAotICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIE1hdGgubWF4KDAsIG1TY3JvbGxZKSwgMCk7CisgICAgcHVibGljIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBNYXRoLm1heChnZXRUaXRsZUhlaWdodCgpIC0gbVNjcm9sbFksIDApOwogICAgIH0KIAogICAgIC8qCkBAIC0xMjkwLDcgKzEyNDksNyBAQAogICAgICAqIG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBvbiBhIFdlYlZpZXcgYWZ0ZXIgZGVzdHJveS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gU2V0IHRoZSBoYW5kbGVycyB0byBudWxsIGJlZm9yZSBkZXN0cm95aW5nIFdlYlZpZXdDb3JlIHNvIG5vCiAgICAgICAgICAgICAvLyBtb3JlIG1lc3NhZ2VzIHdpbGwgYmUgcG9zdGVkLgpAQCAtMTQxOCw2ICsxMzc3LDggQEAKICAgICAgICAgICAgIG91dFN0YXRlLnB1dEJ1bmRsZSgiY2VydGlmaWNhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbENlcnRpZmljYXRlLnNhdmVTdGF0ZShtQ2VydGlmaWNhdGUpKTsKICAgICAgICAgfQorICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKCJwcml2YXRlQnJvd3NpbmdFbmFibGVkIiwgaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpOworICAgICAgICBtWm9vbU1hbmFnZXIuc2F2ZVpvb21TdGF0ZShvdXRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBsaXN0OwogICAgIH0KIApAQCAtMTQ2MywyOSArMTQyNCwyMyBAQAogICAgICAgICAvLyBub3cgdXBkYXRlIHRoZSBidW5kbGUKICAgICAgICAgYi5wdXRJbnQoInNjcm9sbFgiLCBtU2Nyb2xsWCk7CiAgICAgICAgIGIucHV0SW50KCJzY3JvbGxZIiwgbVNjcm9sbFkpOwotICAgICAgICBiLnB1dEZsb2F0KCJzY2FsZSIsIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgIGIucHV0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBtVGV4dFdyYXBTY2FsZSk7Ci0gICAgICAgIGIucHV0Qm9vbGVhbigib3ZlcnZpZXciLCBtSW5ab29tT3ZlcnZpZXcpOworICAgICAgICBtWm9vbU1hbmFnZXIuc2F2ZVpvb21TdGF0ZShiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVIaXN0b3J5UGljdHVyZUZpZWxkcyhQaWN0dXJlIHAsIEJ1bmRsZSBiKSB7CiAgICAgICAgIGludCBzeCA9IGIuZ2V0SW50KCJzY3JvbGxYIiwgMCk7CiAgICAgICAgIGludCBzeSA9IGIuZ2V0SW50KCJzY3JvbGxZIiwgMCk7Ci0gICAgICAgIGZsb2F0IHNjYWxlID0gYi5nZXRGbG9hdCgic2NhbGUiLCAxLjBmKTsKKwogICAgICAgICBtRHJhd0hpc3RvcnkgPSB0cnVlOwogICAgICAgICBtSGlzdG9yeVBpY3R1cmUgPSBwOwogICAgICAgICBtU2Nyb2xsWCA9IHN4OwogICAgICAgICBtU2Nyb2xsWSA9IHN5OworICAgICAgICBtWm9vbU1hbmFnZXIucmVzdG9yZVpvb21TdGF0ZShiKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKTsKICAgICAgICAgbUhpc3RvcnlXaWR0aCA9IE1hdGgucm91bmQocC5nZXRXaWR0aCgpICogc2NhbGUpOwogICAgICAgICBtSGlzdG9yeUhlaWdodCA9IE1hdGgucm91bmQocC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgLy8gYXMgZ2V0V2lkdGgoKSAvIGdldEhlaWdodCgpIG9mIHRoZSB2aWV3IGFyZSBub3QgYXZhaWxhYmxlIHlldCwgc2V0IHVwCi0gICAgICAgIC8vIG1BY3R1YWxTY2FsZSwgc28gdGhhdCB3aGVuIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQsIHRoZSByZXN0IHdpbGwKLSAgICAgICAgLy8gYmUgc2V0IGNvcnJlY3RseQotICAgICAgICBtQWN0dWFsU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGIuZ2V0RmxvYXQoInRleHR3cmFwU2NhbGUiLCBzY2FsZSk7Ci0gICAgICAgIG1Jblpvb21PdmVydmlldyA9IGIuZ2V0Qm9vbGVhbigib3ZlcnZpZXciKTsKKwogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCkBAIC0xNTg2LDYgKzE1NDEsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvcHkgdG8gaGF2ZSB0aGUgY29ycmVjdCBpbmRleC4KICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LnNldEN1cnJlbnRJbmRleChpbmRleCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXN0b3JlIHByaXZhdGUgYnJvd3Npbmcgc2V0dGluZy4KKyAgICAgICAgICAgIGlmIChpblN0YXRlLmdldEJvb2xlYW4oInByaXZhdGVCcm93c2luZ0VuYWJsZWQiKSkgeworICAgICAgICAgICAgICAgIGdldFNldHRpbmdzKCkuc2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5yZXN0b3JlWm9vbVN0YXRlKGluU3RhdGUpOwogICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBwZW5kaW5nIG1lc3NhZ2VzIGJlY2F1c2Ugd2UgYXJlIHJlc3RvcmluZyBwcmV2aW91cwogICAgICAgICAgICAgLy8gc3RhdGUuCiAgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoKTsKQEAgLTE2MDgsNyArMTU2OCw3IEBACiAgICAgICAgIGFyZy5tVXJsID0gdXJsOwogICAgICAgICBhcmcubUV4dHJhSGVhZGVycyA9IGV4dHJhSGVhZGVyczsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkxPQURfVVJMLCBhcmcpOwotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjM3LDcgKzE1OTcsNyBAQAogICAgICAgICAgICAgYXJnLm1VcmwgPSB1cmw7CiAgICAgICAgICAgICBhcmcubVBvc3REYXRhID0gcG9zdERhdGE7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUE9TVF9VUkwsIGFyZyk7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9hZFVybCh1cmwpOwogICAgICAgICB9CkBAIC0xNjkzLDcgKzE2NTMsNDYgQEAKICAgICAgICAgYXJnLm1FbmNvZGluZyA9IGVuY29kaW5nOwogICAgICAgICBhcmcubUhpc3RvcnlVcmwgPSBoaXN0b3J5VXJsOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuTE9BRF9EQVRBLCBhcmcpOwotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgdmlldyBhcyBhIHdlYiBhcmNoaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB3aGVyZSB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcGxhY2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVXZWJBcmNoaXZlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBzYXZlV2ViQXJjaGl2ZShmaWxlbmFtZSwgZmFsc2UsIG51bGwpOworICAgIH0KKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSB7CisgICAgICAgIFNhdmVXZWJBcmNoaXZlTWVzc2FnZSAoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1CYXNlbmFtZSA9IGJhc2VuYW1lOworICAgICAgICAgICAgbUF1dG9uYW1lID0gYXV0b25hbWU7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgU3RyaW5nIG1CYXNlbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBib29sZWFuIG1BdXRvbmFtZTsKKyAgICAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gbUNhbGxiYWNrOworICAgICAgICAvKiBwYWNrYWdlICovIFN0cmluZyBtUmVzdWx0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBiYXNlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGJhc2VuYW1lCisgICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdGhlIHdlYiBhcmNoaXZlIGhhcyBiZWVuIHNhdmVkLiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGZvciBvblJlY2VpdmVWYWx1ZSB3aWxsIGVpdGhlciBiZSB0aGUgZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkLCBvciBudWxsIGlmIHNhdmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgZmlsZSBmYWlsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNBVkVfV0VCQVJDSElWRSwKKyAgICAgICAgICAgIG5ldyBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2UoYmFzZW5hbWUsIGF1dG9uYW1lLCBjYWxsYmFjaykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxMCw3ICsxNzA5LDcgQEAKICAgICAgKiBSZWxvYWQgdGhlIGN1cnJlbnQgdXJsLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKLSAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICBjbGVhclRleHRFbnRyeSgpOwogICAgICAgICBzd2l0Y2hPdXREcmF3SGlzdG9yeSgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVMT0FEKTsKICAgICB9CkBAIC0xNzkwLDEyICsxNzg5LDQ2IEBACiAKICAgICBwcml2YXRlIHZvaWQgZ29CYWNrT3JGb3J3YXJkKGludCBzdGVwcywgYm9vbGVhbiBpZ25vcmVTbmFwc2hvdCkgewogICAgICAgICBpZiAoc3RlcHMgIT0gMCkgewotICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoZmFsc2UpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5HT19CQUNLX0ZPUldBUkQsIHN0ZXBzLAogICAgICAgICAgICAgICAgICAgICBpZ25vcmVTbmFwc2hvdCA/IDEgOiAwKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBwcml2YXRlIGJyb3dzaW5nIGlzIGVuYWJsZWQgaW4gdGhpcyBXZWJWaWV3LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNldHRpbmdzKCkuaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UHJpdmF0ZUJyb3dzaW5nKCkgeworICAgICAgICBib29sZWFuIHdhc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKTsKKworICAgICAgICBnZXRTZXR0aW5ncygpLnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQodHJ1ZSk7CisKKyAgICAgICAgaWYgKCF3YXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAgICAgICBsb2FkVXJsKCJicm93c2VyOmluY29nbml0byIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhbnkgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBsYXN0IHByaXZhdGUKKyAgICAgKiBicm93c2luZyBzZXNzaW9uIGFuZCBjbGVhcnMgYW55IGludGVybmFsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGF0CisgICAgICogc2Vzc2lvbi4gVGhlIGNvbnNlcXVlbmNlcyBvZiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdoaWxlIGEgcHJpdmF0ZQorICAgICAqIGJyb3dzaW5nIHNlc3Npb24gaXMgYWN0aXZlIGFyZSB1bnNwZWNpZmllZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgc2FtZSBjb250ZXh0IHdoaWNoIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJpdmF0ZQorICAgICAqICAgICAgICAgICAgICAgIGJyb3dzaW5nIFdlYlZpZXcuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwcml2YXRlIGJyb3dzaW5nIGZpbGVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYW51cFByaXZhdGVCcm93c2luZ0ZpbGVzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gbmF0aXZlQ2xlYW51cFByaXZhdGVCcm93c2luZ0ZpbGVzKGNvbnRleHQuZ2V0RmlsZXNEaXIoKS5nZXRQYXJlbnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlQ2xlYW51cFByaXZhdGVCcm93c2luZ0ZpbGVzKFN0cmluZyBkYXRhRGlyZWN0b3J5KTsKKwogICAgIHByaXZhdGUgYm9vbGVhbiBleHRlbmRTY3JvbGwoaW50IHkpIHsKICAgICAgICAgaW50IGZpbmFsWSA9IG1TY3JvbGxlci5nZXRGaW5hbFkoKTsKICAgICAgICAgaW50IG5ld1kgPSBwaW5Mb2NZKGZpbmFsWSArIHkpOwpAQCAtMTg0Myw3ICsxODc2LDcgQEAKICAgICAgICAgfQogICAgICAgICBuYXRpdmVDbGVhckN1cnNvcigpOyAvLyBzdGFydCBuZXh0IHRyYWNrYmFsbCBtb3ZlbWVudCBmcm9tIHBhZ2UgZWRnZQogICAgICAgICBpZiAoYm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGluU2Nyb2xsVG8obVNjcm9sbFgsIGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpLCB0cnVlLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBwaW5TY3JvbGxUbyhtU2Nyb2xsWCwgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSwgdHJ1ZSwgMCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUGFnZSBkb3duLgogICAgICAgICBpbnQgaCA9IGdldEhlaWdodCgpOwpAQCAtMTg2NSw2ICsxODk4LDcgQEAKICAgICBwdWJsaWMgdm9pZCBjbGVhclZpZXcoKSB7CiAgICAgICAgIG1Db250ZW50V2lkdGggPSAwOwogICAgICAgICBtQ29udGVudEhlaWdodCA9IDA7CisgICAgICAgIG5hdGl2ZVNldEJhc2VMYXllcigwKTsKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkNMRUFSX0NPTlRFTlQpOwogICAgIH0KIApAQCAtMTg3OCw4ICsxOTEyLDkgQEAKICAgICAgKiAgICAgICAgIGJvdW5kcyBvZiB0aGUgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgUGljdHVyZSBjYXB0dXJlUGljdHVyZSgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gbVdlYlZpZXdDb3JlKSByZXR1cm4gbnVsbDsgLy8gY2hlY2sgZm9yIG91dCBvZiBtZW1vcnkgdGFiCi0gICAgICAgIHJldHVybiBtV2ViVmlld0NvcmUuY29weUNvbnRlbnRQaWN0dXJlKCk7CisgICAgICAgIFBpY3R1cmUgcmVzdWx0ID0gbmV3IFBpY3R1cmUoKTsKKyAgICAgICAgbmF0aXZlQ29weUJhc2VDb250ZW50VG9QaWN0dXJlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODkxLDE1ICsxOTI2LDEzIEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmUgdGhlIFdlYlRleHRWaWV3LgotICAgICAqIEBwYXJhbSBkaXNhYmxlRm9jdXNDb250cm9sbGVyIElmIHRydWUsIHNlbmQgYSBtZXNzYWdlIHRvIHdlYmtpdAotICAgICAqICAgICBkaXNhYmxpbmcgdGhlIGZvY3VzIGNvbnRyb2xsZXIsIHNvIHRoZSBjYXJldCBzdG9wcyBibGlua2luZy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xlYXJUZXh0RW50cnkoYm9vbGVhbiBkaXNhYmxlRm9jdXNDb250cm9sbGVyKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyVGV4dEVudHJ5KCkgewogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpKSB7CiAgICAgICAgICAgICBtV2ViVGV4dFZpZXcucmVtb3ZlKCk7Ci0gICAgICAgICAgICBpZiAoZGlzYWJsZUZvY3VzQ29udHJvbGxlcikgewotICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckluYWN0aXZlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUga2V5Ym9hcmQgbWF5IGJlIG9wZW4gd2l0aCB0aGUgV2ViVmlldyBhcyB0aGUgc2VydmVkIHZpZXcKKyAgICAgICAgICAgIGhpZGVTb2Z0S2V5Ym9hcmQoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkwOCw3ICsxOTQxLDcgQEAKICAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNjYWxlLgogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCBnZXRTY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkyMCw3ICsxOTUzLDcgQEAKICAgICAgKiBAcGFyYW0gc2NhbGVJblBlcmNlbnQgVGhlIGluaXRpYWwgc2NhbGUgaW4gcGVyY2VudC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2NhbGUoaW50IHNjYWxlSW5QZXJjZW50KSB7Ci0gICAgICAgIG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPSBzY2FsZUluUGVyY2VudDsKKyAgICAgICAgbVpvb21NYW5hZ2VyLnNldEluaXRpYWxTY2FsZUluUGVyY2VudChzY2FsZUluUGVyY2VudCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTMzLDE0ICsxOTY2LDggQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7Ci0gICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAotICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOwotICAgICAgICB9CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgIG1ab29tTWFuYWdlci5pbnZva2Vab29tUGlja2VyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDU1LDcgKzIwODIsNyBAQAogICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBpbkxvYyhpbnQgeCwgaW50IHZpZXdNYXgsIGludCBkb2NNYXgpIHsKKyAgICBzdGF0aWMgaW50IHBpbkxvYyhpbnQgeCwgaW50IHZpZXdNYXgsIGludCBkb2NNYXgpIHsKIC8vICAgICAgICBMb2cuZChMT0dUQUcsICItLSBwaW5Mb2MgIiArIHggKyAiICIgKyB2aWV3TWF4ICsgIiAiICsgZG9jTWF4KTsKICAgICAgICAgaWYgKGRvY01heCA8IHZpZXdNYXgpIHsgICAvLyB0aGUgZG9jIGhhcyByb29tIG9uIHRoZSBzaWRlcyBmb3IgImJsYW5rIgogICAgICAgICAgICAgLy8gcGluIHRoZSBzaG9ydCBkb2N1bWVudCB0byB0aGUgdG9wL2xlZnQgb2YgdGhlIHNjcmVlbgpAQCAtMjA3MiwxNiArMjA5OSwxNCBAQAogICAgIH0KIAogICAgIC8vIEV4cGVjdHMgeCBpbiB2aWV3IGNvb3JkaW5hdGVzCi0gICAgcHJpdmF0ZSBpbnQgcGluTG9jWChpbnQgeCkgewotICAgICAgICBpZiAobUluT3ZlclNjcm9sbE1vZGUpIHJldHVybiB4OwotICAgICAgICByZXR1cm4gcGluTG9jKHgsIGdldFZpZXdXaWR0aCgpLCBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpKTsKKyAgICBpbnQgcGluTG9jWChpbnQgeCkgeworICAgICAgICByZXR1cm4gcGluTG9jKHgsIGdldFZpZXdXaWR0aCgpLCBjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkpOwogICAgIH0KIAogICAgIC8vIEV4cGVjdHMgeSBpbiB2aWV3IGNvb3JkaW5hdGVzCi0gICAgcHJpdmF0ZSBpbnQgcGluTG9jWShpbnQgeSkgewotICAgICAgICBpZiAobUluT3ZlclNjcm9sbE1vZGUpIHJldHVybiB5OworICAgIGludCBwaW5Mb2NZKGludCB5KSB7CiAgICAgICAgIHJldHVybiBwaW5Mb2MoeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjEwNiw2ICsyMTMxLDE1IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbWJlZGRlZFRpdGxlQmFyKFZpZXcgdikgeworICAgICAgICBpZiAobnVsbCA9PSB2KSB7CisgICAgICAgICAgICAvLyBJZiBvbmUgb2Ygb3VyIGNhbGxiYWNrcyBpcyBob2xkaW5nIG9udG8gdGhlIHRpdGxlYmFyIHRvIHJlcGxhY2UKKyAgICAgICAgICAgIC8vIGl0IHdoZW4gaXRzIEFjdGlvbk1vZGUgZW5kcywgcmVtb3ZlIGl0LgorICAgICAgICAgICAgaWYgKG1TZWxlY3RDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdENhbGxiYWNrLnNldFRpdGxlQmFyKG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmluZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRmluZENhbGxiYWNrLnNldFRpdGxlQmFyKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChtVGl0bGVCYXIgPT0gdikgcmV0dXJuOwogICAgICAgICBpZiAobVRpdGxlQmFyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlQmFyKTsKQEAgLTIxMjksNyArMjE2Myw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oaW50IGQpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZCAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTU1LDcgKzIxODksNyBAQAogICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBhcyBhIGZsb2F0LgogICAgICAqLwogICAgIHByaXZhdGUgZmxvYXQgdmlld1RvQ29udGVudFhmKGludCB4KSB7Ci0gICAgICAgIHJldHVybiB4ICogbUludkFjdHVhbFNjYWxlOworICAgICAgICByZXR1cm4geCAqIG1ab29tTWFuYWdlci5nZXRJbnZTY2FsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE2NCw3ICsyMTk4LDcgQEAKICAgICAgKiBlbWJlZGRlZCBpbnRvIHRoZSBXZWJWaWV3LiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBmbG9hdC4KICAgICAgKi8KICAgICBwcml2YXRlIGZsb2F0IHZpZXdUb0NvbnRlbnRZZihpbnQgeSkgewotICAgICAgICByZXR1cm4gKHkgLSBnZXRUaXRsZUhlaWdodCgpKSAqIG1JbnZBY3R1YWxTY2FsZTsKKyAgICAgICAgcmV0dXJuICh5IC0gZ2V0VGl0bGVIZWlnaHQoKSkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNzQsNyArMjIwOCw3IEBACiAgICAgICogaGVpZ2h0LgogICAgICAqLwogICAgIC8qcGFja2FnZSovIGludCBjb250ZW50VG9WaWV3RGltZW5zaW9uKGludCBkKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGQgKiBtQWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjIxNSw3ICsyMjQ5LDcgQEAKICAgICAvLyBDYWxsZWQgYnkgSk5JIHRvIGludmFsaWRhdGUgdGhlIFZpZXcsIGdpdmVuIHJlY3RhbmdsZSBjb29yZGluYXRlcyBpbgogICAgIC8vIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGUoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CiAgICAgICAgIGZpbmFsIGludCBkeSA9IGdldFRpdGxlSGVpZ2h0KCk7CiAgICAgICAgIGludmFsaWRhdGUoKGludClNYXRoLmZsb29yKGwgKiBzY2FsZSksCiAgICAgICAgICAgICAgICAgICAgKGludClNYXRoLmZsb29yKHQgKiBzY2FsZSkgKyBkeSwKQEAgLTIyMjYsNyArMjI2MCw3IEBACiAgICAgLy8gQ2FsbGVkIGJ5IEpOSSB0byBpbnZhbGlkYXRlIHRoZSBWaWV3IGFmdGVyIGEgZGVsYXksIGdpdmVuIHJlY3RhbmdsZQogICAgIC8vIGNvb3JkaW5hdGVzIGluIGNvbnRlbnQgc3BhY2UKICAgICBwcml2YXRlIHZvaWQgdmlld0ludmFsaWRhdGVEZWxheWVkKGxvbmcgZGVsYXksIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOwogICAgICAgICBmaW5hbCBpbnQgZHkgPSBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICBwb3N0SW52YWxpZGF0ZURlbGF5ZWQoZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KU1hdGguZmxvb3IobCAqIHNjYWxlKSwKQEAgLTIyNjQsMTMgKzIyOTgsNyBAQAogICAgICAgICAgICAgLy8gdXBkYXRlZCB3aGVuIHdlIGdldCBvdXQgb2YgdGhhdCBtb2RlLgogICAgICAgICAgICAgaWYgKCFtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgICAgICAvLyByZXBpbiBvdXIgc2Nyb2xsLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY29udGVudCBzaXplCi0gICAgICAgICAgICAgICAgaW50IG9sZFggPSBtU2Nyb2xsWDsKLSAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIG1TY3JvbGxYID0gcGluTG9jWChtU2Nyb2xsWCk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFkgPSBwaW5Mb2NZKG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVTY3JvbGxDb29yZGluYXRlcyhwaW5Mb2NYKG1TY3JvbGxYKSwgcGluTG9jWShtU2Nyb2xsWSkpOwogICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyLmlzRmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNjcm9sbC4gIFJlcGluIHRoZSBmaW5hbCBzY3JvbGwKICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uCkBAIC0yMjgyLDc3ICsyMzEwLDEyIEBACiAgICAgICAgIGNvbnRlbnRTaXplQ2hhbmdlZCh1cGRhdGVMYXlvdXQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXROZXdab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZm9yY2UpIHsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICAgICAgLy8gc2V0IG1Jblpvb21PdmVydmlldyBmb3Igbm9uIG1vYmlsZSBzaXRlcwotICAgICAgICAgICAgaWYgKHNjYWxlIDwgbURlZmF1bHRTY2FsZSkgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBzY2FsZTsKLSAgICAgICAgICAgIC8vIHJlc2V0IG1MYXN0SGVpZ2h0U2VudCB0byBmb3JjZSBWSUVXX1NJWkVfQ0hBTkdFRCBzZW50IHRvIFdlYktpdAotICAgICAgICAgICAgbUxhc3RIZWlnaHRTZW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlIHx8IGZvcmNlKSB7Ci0gICAgICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaGlzdG9yeSBQaWN0dXJlIGlzIGRyYXduLCBkb24ndCB1cGRhdGUgc2Nyb2xsLiBUaGV5IHdpbGwKLSAgICAgICAgICAgICAgICAvLyBiZSB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG1BY3R1YWxTY2FsZSAmJiAhbVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIHNjYWxlOwotICAgICAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBzY3JvbGwgc28gd2UgZG9uJ3QgYXBwZWFyIHRvIGp1bXAKLSAgICAgICAgICAgICAgICAvLyBpLmUuIGtlZXAgdGhlIGNlbnRlciBvZiB0aGUgZG9jIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcKLQotICAgICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IHNjYWxlICogbUludkFjdHVhbFNjYWxlOyAgIC8vIG9sZCBpbnZlcnNlCi0gICAgICAgICAgICAgICAgZmxvYXQgc3ggPSByYXRpbyAqIG9sZFggKyAocmF0aW8gLSAxKSAqIG1ab29tQ2VudGVyWDsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeSA9IHJhdGlvICogb2xkWSArIChyYXRpbyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIChtWm9vbUNlbnRlclkgLSBnZXRUaXRsZUhlaWdodCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3VyIG5ldyBzY2FsZSBhbmQgaW52ZXJzZQotICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSBtQWN0dWFsU2NhbGUgJiYgIW1QcmV2aWV3Wm9vbU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrUHJveHkub25TY2FsZUNoYW5nZWQobUFjdHVhbFNjYWxlLCBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3R1YWxTY2FsZSA9IHNjYWxlOwotICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSA9IDEgLyBzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8vIFNjYWxlIGFsbCB0aGUgY2hpbGQgdmlld3MKLSAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIuc2NhbGVBbGwoKTsKLQotICAgICAgICAgICAgICAgIC8vIGFzIHdlIGRvbid0IGhhdmUgYW5pbWF0aW9uIGZvciBzY2FsaW5nLCBkb24ndCBkbyBhbmltYXRpb24KLSAgICAgICAgICAgICAgICAvLyBmb3Igc2Nyb2xsaW5nLCBhcyBpdCBjYXVzZXMgd2VpcmQgaW50ZXJtZWRpYXRlIHN0YXRlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIHBpblNjcm9sbFRvKE1hdGgucm91bmQoc3gpLCBNYXRoLnJvdW5kKHN5KSk7Ci0gICAgICAgICAgICAgICAgbVNjcm9sbFggPSBwaW5Mb2NYKE1hdGgucm91bmQoc3gpKTsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHBpbkxvY1koTWF0aC5yb3VuZChzeSkpOwotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHdlYmtpdAotICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBhZGp1c3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyB6b29tIGFuaW1hdGlvbi4gQnV0IHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBXZWJLaXQgYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiB0aGUgem9vbSBhbmltYXRpb24uIFNlZSBjb21tZW50cyBpbiBvblNjYWxlRW5kKCkuCi0gICAgICAgICAgICAgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBVc2VkIHRvIGF2b2lkIHNlbmRpbmcgbWFueSB2aXNpYmxlIHJlY3QgbWVzc2FnZXMuCiAgICAgcHJpdmF0ZSBSZWN0IG1MYXN0VmlzaWJsZVJlY3RTZW50OwogICAgIHByaXZhdGUgUmVjdCBtTGFzdEdsb2JhbFJlY3Q7CiAKLSAgICBwcml2YXRlIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OworICAgIFJlY3Qgc2VuZE91clZpc2libGVSZWN0KCkgeworICAgICAgICBpZiAobVpvb21NYW5hZ2VyLmlzUHJldmVudGluZ1dlYmtpdFVwZGF0ZXMoKSkgcmV0dXJuIG1MYXN0VmlzaWJsZVJlY3RTZW50OwogCiAgICAgICAgIFJlY3QgcmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgIGNhbGNPdXJDb250ZW50VmlzaWJsZVJlY3QocmVjdCk7CkBAIC0yMzg1LDE1ICsyMzQ4LDEyIEBACiAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgZ2V0R2xvYmFsVmlzaWJsZVJlY3QociwgcCk7CiAgICAgICAgIHIub2Zmc2V0KC1wLngsIC1wLnkpOwotICAgICAgICBpZiAobUZpbmRJc1VwKSB7Ci0gICAgICAgICAgICByLmJvdHRvbSAtPSBtRmluZEhlaWdodDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFNldHMgciB0byBiZSBvdXIgdmlzaWJsZSByZWN0YW5nbGUgaW4gY29udGVudCBjb29yZGluYXRlcwogICAgIHByaXZhdGUgdm9pZCBjYWxjT3VyQ29udGVudFZpc2libGVSZWN0KFJlY3QgcikgewogICAgICAgICBjYWxjT3VyVmlzaWJsZVJlY3Qocik7Ci0gICAgICAgIC8vIHNpbmNlIHdlIG1pZ2h0IG92ZXJzY3JvbGwsIHBpbiB0aGUgcmVjdCB0byB0aGUgYm91bmRzIG9mIHRoZSBjb250ZW50CisgICAgICAgIC8vIHBpbiB0aGUgcmVjdCB0byB0aGUgYm91bmRzIG9mIHRoZSBjb250ZW50CiAgICAgICAgIHIubGVmdCA9IE1hdGgubWF4KHZpZXdUb0NvbnRlbnRYKHIubGVmdCksIDApOwogICAgICAgICAvLyB2aWV3VG9Db250ZW50WSB3aWxsIHJlbW92ZSB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoZSB0aXRsZSBiYXIuICBBZGQKICAgICAgICAgLy8gdGhlIHZpc2libGUgaGVpZ2h0IGJhY2sgaW4gdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBpZiB0aGUgdGl0bGUKQEAgLTI0MzQsMTYgKzIzOTQsMTkgQEAKIAogICAgIC8qKgogICAgICAqIENvbXB1dGUgdW56b29tZWQgd2lkdGggYW5kIGhlaWdodCwgYW5kIGlmIHRoZXkgZGlmZmVyIGZyb20gdGhlIGxhc3QKLSAgICAgKiB2YWx1ZXMgd2Ugc2VudCwgc2VuZCB0aGVtIHRvIHdlYmtpdCAodG8gYmUgdXNlZCBoYXMgbmV3IHZpZXdwb3J0KQorICAgICAqIHZhbHVlcyB3ZSBzZW50LCBzZW5kIHRoZW0gdG8gd2Via2l0ICh0byBiZSB1c2VkIGFzIG5ldyB2aWV3cG9ydCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JjZSBlbnN1cmVzIHRoYXQgdGhlIG1lc3NhZ2UgaXMgc2VudCB0byB3ZWJraXQgZXZlbiBpZiB0aGUgd2lkdGgKKyAgICAgKiBvciBoZWlnaHQgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IG1lc3NhZ2UKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgdmFsdWVzIHdlcmUgc2VudAogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kVmlld1NpemVab29tKCkgewotICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgcmV0dXJuIGZhbHNlOworICAgIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbShib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgaW50IHZpZXdXaWR0aCA9IGdldFZpZXdXaWR0aCgpOwotICAgICAgICBpbnQgbmV3V2lkdGggPSBNYXRoLnJvdW5kKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSk7Ci0gICAgICAgIGludCBuZXdIZWlnaHQgPSBNYXRoLnJvdW5kKGdldFZpZXdIZWlnaHQoKSAqIG1JbnZBY3R1YWxTY2FsZSk7CisgICAgICAgIGludCBuZXdXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoICogbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChnZXRWaWV3SGVpZ2h0KCkgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEJlY2F1c2UgdGhlIG5hdGl2ZSBzaWRlIG1heSBoYXZlIGFscmVhZHkgZG9uZSBhIGxheW91dCBiZWZvcmUgdGhlCiAgICAgICAgICAqIFZpZXcgc3lzdGVtIHdhcyBhYmxlIHRvIG1lYXN1cmUgdXMsIHdlIGhhdmUgdG8gc2VuZCBhIGhlaWdodCBvZiAwIHRvCkBAIC0yNDU2LDg1ICsyNDE5LDUxIEBACiAgICAgICAgICAgICBuZXdIZWlnaHQgPSAwOwogICAgICAgICB9CiAgICAgICAgIC8vIEF2b2lkIHNlbmRpbmcgYW5vdGhlciBtZXNzYWdlIGlmIHRoZSBkaW1lbnNpb25zIGhhdmUgbm90IGNoYW5nZWQuCi0gICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50KSB7CisgICAgICAgIGlmIChuZXdXaWR0aCAhPSBtTGFzdFdpZHRoU2VudCB8fCBuZXdIZWlnaHQgIT0gbUxhc3RIZWlnaHRTZW50IHx8IGZvcmNlKSB7CiAgICAgICAgICAgICBWaWV3U2l6ZURhdGEgZGF0YSA9IG5ldyBWaWV3U2l6ZURhdGEoKTsKICAgICAgICAgICAgIGRhdGEubVdpZHRoID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBkYXRhLm1IZWlnaHQgPSBuZXdIZWlnaHQ7Ci0gICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh2aWV3V2lkdGggLyBtVGV4dFdyYXBTY2FsZSk7OwotICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBtWm9vbVNjYWxlICE9IDAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1BbmNob3JYOwotICAgICAgICAgICAgZGF0YS5tQW5jaG9yWSA9IG1BbmNob3JZOworICAgICAgICAgICAgZGF0YS5tVGV4dFdyYXBXaWR0aCA9IE1hdGgucm91bmQodmlld1dpZHRoIC8gbVpvb21NYW5hZ2VyLmdldFRleHRXcmFwU2NhbGUoKSk7CisgICAgICAgICAgICBkYXRhLm1TY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZGF0YS5tSWdub3JlSGVpZ2h0ID0gbVpvb21NYW5hZ2VyLmlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1IZWlnaHRDYW5NZWFzdXJlOworICAgICAgICAgICAgZGF0YS5tQW5jaG9yWCA9IG1ab29tTWFuYWdlci5nZXREb2N1bWVudEFuY2hvclgoKTsKKyAgICAgICAgICAgIGRhdGEubUFuY2hvclkgPSBtWm9vbU1hbmFnZXIuZ2V0RG9jdW1lbnRBbmNob3JZKCk7CiAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVklFV19TSVpFX0NIQU5HRUQsIGRhdGEpOwogICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSBuZXdXaWR0aDsKICAgICAgICAgICAgIG1MYXN0SGVpZ2h0U2VudCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgIG1BbmNob3JYID0gbUFuY2hvclkgPSAwOworICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmNsZWFyRG9jdW1lbnRBbmNob3IoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGludCBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7CiAgICAgICAgIGlmIChtRHJhd0hpc3RvcnkpIHsKICAgICAgICAgICAgIHJldHVybiBtSGlzdG9yeVdpZHRoOwogICAgICAgICB9IGVsc2UgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7CisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKICAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCiAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9yIGNhdXNlZCB1bm5lY2Vzc2FyeSBzY3JvbGxiYXIsIHVzZSBmbG9vcgotICAgICAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguZmxvb3IobUNvbnRlbnRXaWR0aCAqIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKSB7Ci0gICAgICAgIGludCByYW5nZSA9IGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7Ci0KLSAgICAgICAgLy8gQWRqdXN0IHJlcG9ydGVkIHJhbmdlIGlmIG92ZXJzY3JvbGxlZCB0byBjb21wcmVzcyB0aGUgc2Nyb2xsIGJhcnMKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgIGlmIChzY3JvbGxYIDwgMCkgewotICAgICAgICAgICAgcmFuZ2UgLT0gc2Nyb2xsWDsKLSAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxYID4gb3ZlcnNjcm9sbFJpZ2h0KSB7Ci0gICAgICAgICAgICByYW5nZSArPSBzY3JvbGxYIC0gb3ZlcnNjcm9sbFJpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJhbmdlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsWCwgMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCi0gICAgICAgICAgICAgICAgJiYgKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUgPD0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGhvbm9yIHRoZSBzY3JvbGxiYXIgbW9kZSB3aGVuIGl0IGlzIGF0IG1pbmltdW0gem9vbSBsZXZlbAotICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdG8gYXZvaWQgcm91bmRpbmcgZXJyb3IgY2F1c2VkIHVubmVjZXNzYXJ5IHNjcm9sbGJhciwgdXNlIGZsb29yCi0gICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudEhlaWdodCAqIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKGludCkgTWF0aC5mbG9vcihtQ29udGVudFdpZHRoICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaW50IHJhbmdlID0gY29tcHV0ZVJlYWxWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7Ci0KLSAgICAgICAgLy8gQWRqdXN0IHJlcG9ydGVkIHJhbmdlIGlmIG92ZXJzY3JvbGxlZCB0byBjb21wcmVzcyB0aGUgc2Nyb2xsIGJhcnMKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxCb3R0b20gPSBjb21wdXRlTWF4U2Nyb2xsWSgpOwotICAgICAgICBpZiAoc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgIHJhbmdlIC09IHNjcm9sbFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWSA+IG92ZXJzY3JvbGxCb3R0b20pIHsKLSAgICAgICAgICAgIHJhbmdlICs9IHNjcm9sbFkgLSBvdmVyc2Nyb2xsQm90dG9tOworICAgICAgICBpZiAobURyYXdIaXN0b3J5KSB7CisgICAgICAgICAgICByZXR1cm4gbUhpc3RvcnlIZWlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAobVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSA9PSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgJiYgIW1ab29tTWFuYWdlci5jYW5ab29tT3V0KCkpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgaG9ub3IgdGhlIHNjcm9sbGJhciBtb2RlIHdoZW4gaXQgaXMgYXQgbWluaW11bSB6b29tIGxldmVsCisgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0byBhdm9pZCByb3VuZGluZyBlcnJvciBjYXVzZWQgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFyLCB1c2UgZmxvb3IKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBNYXRoLmZsb29yKG1Db250ZW50SGVpZ2h0ICogbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjU1MiwzMSArMjQ4MSwxMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhd1ZlcnRpY2FsU2Nyb2xsQmFyKENhbnZhcyBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgc2Nyb2xsQmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgIGlmIChtU2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgIHQgLT0gbVNjcm9sbFk7Ci0gICAgICAgIH0KICAgICAgICAgc2Nyb2xsQmFyLnNldEJvdW5kcyhsLCB0ICsgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCksIHIsIGIpOwogICAgICAgICBzY3JvbGxCYXIuZHJhdyhjYW52YXMpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uT3ZlcnNjcm9sbGVkKGludCBzY3JvbGxYLCBpbnQgc2Nyb2xsWSwgYm9vbGVhbiBjbGFtcGVkWCwKLSAgICAgICAgICAgIGJvb2xlYW4gY2xhbXBlZFkpIHsKLSAgICAgICAgbUluT3ZlclNjcm9sbE1vZGUgPSBmYWxzZTsKLSAgICAgICAgaW50IG1heFggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICBpZiAobWF4WCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgb3ZlciBzY3JvbGwgeCBpZiB0aGUgcGFnZSBqdXN0IGZpdHMgdGhlIHNjcmVlbgotICAgICAgICAgICAgc2Nyb2xsWCA9IHBpbkxvY1goc2Nyb2xsWCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsWCA8IDAgfHwgc2Nyb2xsWCA+IG1heFgpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Nyb2xsWSA8IDAgfHwgc2Nyb2xsWSA+IGNvbXB1dGVNYXhTY3JvbGxZKCkpIHsKLSAgICAgICAgICAgIG1Jbk92ZXJTY3JvbGxNb2RlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgdXJsIGZvciB0aGUgY3VycmVudCBwYWdlLiBUaGlzIGlzIG5vdCBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHVybAogICAgICAqIHBhc3NlZCB0byBXZWJWaWV3Q2xpZW50Lm9uUGFnZVN0YXJ0ZWQgYmVjYXVzZSBhbHRob3VnaCB0aGUgbG9hZCBmb3IKQEAgLTI2MjIsNyArMjUzMCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQuCisgICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQsIG9yCisgICAgICogYSBVUkwgb24gdGhpcyBzaXRlJ3Mgc2VydmVyIHBvaW50aW5nIHRvIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvZiBhCisgICAgICogdG91Y2ggaWNvbi4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG91Y2hJY29uVXJsKCkgewpAQCAtMjc5NSwyMiArMjcwNSw0OSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogU3RhcnQgYW4gQWN0aW9uTW9kZSBmb3IgZmluZGluZyB0ZXh0IGluIHRoaXMgV2ViVmlldy4KKyAgICAgKiBAcGFyYW0gdGV4dCBJZiBub24tbnVsbCwgd2lsbCBiZSB0aGUgaW5pdGlhbCB0ZXh0IHRvIHNlYXJjaCBmb3IuCisgICAgICogICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgbGFzdCBTdHJpbmcgc2VhcmNoZWQgZm9yIGluIHRoaXMgV2ViVmlldyB3aWxsCisgICAgICogICAgICAgICAgICAgYmUgdXNlZCB0byBzdGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kSXNVcChib29sZWFuIGlzVXApIHsKLSAgICAgICAgbUZpbmRJc1VwID0gaXNVcDsKLSAgICAgICAgaWYgKGlzVXApIHsKLSAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKG1Db250ZW50V2lkdGgsIG1Db250ZW50SGVpZ2h0ICsgbUZpbmRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBwdWJsaWMgdm9pZCBzaG93RmluZERpYWxvZyhTdHJpbmcgdGV4dCkgeworICAgICAgICBtRmluZENhbGxiYWNrID0gbmV3IEZpbmRBY3Rpb25Nb2RlQ2FsbGJhY2sobUNvbnRleHQpOworICAgICAgICBzZXRGaW5kSXNVcCh0cnVlKTsKKyAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRXZWJWaWV3KHRoaXMpOworICAgICAgICBWaWV3IHRpdGxlQmFyID0gbVRpdGxlQmFyOworICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBlbWJlZGRlZCB0aXRsZSBiYXIgZHVyaW5nIGZpbmQgb3IKKyAgICAgICAgLy8gc2VsZWN0LCBidXQga2VlcCB0cmFjayBvZiBpdCBzbyB0aGF0IGl0IGNhbiBiZSByZXBsYWNlZCB3aGVuIHRoZQorICAgICAgICAvLyBtb2RlIGlzIGV4aXRlZC4KKyAgICAgICAgc2V0RW1iZWRkZWRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgbUZpbmRDYWxsYmFjay5zZXRUaXRsZUJhcih0aXRsZUJhcik7CisgICAgICAgIHN0YXJ0QWN0aW9uTW9kZShtRmluZENhbGxiYWNrKTsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGV4dCA9IG1MYXN0RmluZDsKICAgICAgICAgfQorICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRmluZENhbGxiYWNrLnNldFRleHQodGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHRoZSBmaW5kIGNhbGxiYWNrIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBpdHMgdGl0bGViYXIgaWYKKyAgICAgKiBuZWNlc3NhcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBGaW5kQWN0aW9uTW9kZUNhbGxiYWNrIG1GaW5kQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBUb2dnbGUgd2hldGhlciB0aGUgZmluZCBkaWFsb2cgaXMgc2hvd2luZywgZm9yIGJvdGggbmF0aXZlIGFuZCBKYXZhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRGaW5kSXNVcChib29sZWFuIGlzVXApIHsKKyAgICAgICAgbUZpbmRJc1VwID0gaXNVcDsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZAogICAgICAgICBuYXRpdmVTZXRGaW5kSXNVcChpc1VwKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBtYXRjaC4KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRJbmRleCgpIHsKKyAgICBpbnQgZmluZEluZGV4KCkgewogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybiAtMTsKICAgICAgICAgcmV0dXJuIG5hdGl2ZUZpbmRJbmRleCgpOwogICAgIH0KQEAgLTI4MTksOSArMjc1Niw4IEBACiAgICAgLy8gb3Igbm90IHdlIGRyYXcgdGhlIGhpZ2hsaWdodHMgZm9yIG1hdGNoZXMuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1GaW5kSXNVcDsKIAotICAgIHByaXZhdGUgaW50IG1GaW5kSGVpZ2h0OwotICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgc3RyaW5nIHNlbnQsIHNvIHdlIGNhbiBzZWFyY2ggYWdhaW4gYWZ0ZXIgYW4KLSAgICAvLyBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgdGhlIGRpc21pc3NhbCBvZiB0aGUgc29mdCBrZXlib2FyZC4KKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN0cmluZyBzZW50LCBzbyB3ZSBjYW4gc2VhcmNoIGFnYWluIHdoZW4gZmluZCBpcworICAgIC8vIHJlb3BlbmVkLgogICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0RmluZDsKIAogICAgIC8qKgpAQCAtMjg3OCw3ICsyODE0LDYgQEAKICAgICAgKiBDbGVhciB0aGUgaGlnaGxpZ2h0aW5nIHN1cnJvdW5kaW5nIHRleHQgbWF0Y2hlcyBjcmVhdGVkIGJ5IGZpbmRBbGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJNYXRjaGVzKCkgewotICAgICAgICBtTGFzdEZpbmQgPSAiIjsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBuYXRpdmVTZXRGaW5kSXNFbXB0eSgpOwpAQCAtMjg4NiwxNiArMjgyMSwxNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGZpbmQgQWN0aW9uTW9kZSBlbmRzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUZpbmREaWFsb2dEaXNtaXNzZWQoKSB7CisgICAgdm9pZCBub3RpZnlGaW5kRGlhbG9nRGlzbWlzc2VkKCkgeworICAgICAgICBtRmluZENhbGxiYWNrID0gbnVsbDsKICAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xlYXJNYXRjaGVzKCk7CiAgICAgICAgIHNldEZpbmRJc1VwKGZhbHNlKTsKLSAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUobUNvbnRlbnRXaWR0aCwgbUNvbnRlbnRIZWlnaHQgLSBtRmluZEhlaWdodCwKLSAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBkaWFsb2cgaGFzIGJlZW4gcmVtb3ZlZCwgZW5zdXJlIHRoYXQgd2Ugc2Nyb2xsIHRvIGEKICAgICAgICAgLy8gbG9jYXRpb24gdGhhdCBpcyBub3QgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhZ2UuCiAgICAgICAgIHBpblNjcm9sbFRvKG1TY3JvbGxYLCBtU2Nyb2xsWSwgZmFsc2UsIDApOwpAQCAtMjkwMywxNiArMjgzNyw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5kRGlhbG9nSGVpZ2h0KGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgIExvZy52KExPR1RBRywgInNldEZpbmREaWFsb2dIZWlnaHQgaGVpZ2h0PSIgKyBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIG1GaW5kSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFF1ZXJ5IHRoZSBkb2N1bWVudCB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGltYWdlIHJlZmVyZW5jZXMuIFRoZQogICAgICAqIG1lc3NhZ2Ugb2JqZWN0IHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFyZzEgYmVpbmcgc2V0IHRvIDEgaWYgaW1hZ2VzCiAgICAgICogd2VyZSBmb3VuZCBhbmQgMCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBpbWFnZXMuCkBAIC0yOTI1LDQyICsyODQ5LDMxIEBACiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5ET0NfSEFTX0lNQUdFUywgcmVzcG9uc2UpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIHNjcm9sbGVyIHRvIGFib3J0IGFueSBvbmdvaW5nIGFuaW1hdGlvbgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wU2Nyb2xsKCkgeworICAgICAgICBtU2Nyb2xsZXIuZm9yY2VGaW5pc2hlZCh0cnVlKTsKKyAgICAgICAgbUxhc3RWZWxvY2l0eSA9IDA7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZVNjcm9sbCgpIHsKICAgICAgICAgaWYgKG1TY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKICAgICAgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CiAgICAgICAgICAgICBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKLSAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7ICAvLyBTbyB3ZSBkcmF3IGFnYWluCi0KLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWCA9IGNvbXB1dGVNYXhTY3JvbGxYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWSA9IGNvbXB1dGVNYXhTY3JvbGxZKCk7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlWCwgcmFuZ2VZLAotICAgICAgICAgICAgICAgICAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VZID4gMCB8fCBnZXRPdmVyc2Nyb2xsTW9kZSgpID09IE9WRVJTQ1JPTExfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IDAgJiYgb2xkWSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPiByYW5nZVkgJiYgb2xkWSA8PSByYW5nZVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgJiYgb2xkWCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4ID4gcmFuZ2VYICYmIG9sZFggPD0gcmFuZ2VYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOworICAgICAgICAgICAgbVNjcm9sbFggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKKyAgICAgICAgICAgIG1TY3JvbGxZID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CisgICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOyAgLy8gU28gd2UgZHJhdyBhZ2FpbgorICAgICAgICAgICAgaWYgKG9sZFggIT0gbVNjcm9sbFggfHwgb2xkWSAhPSBtU2Nyb2xsWSkgeworICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhYm9ydEFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CisgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5jb21wdXRlU2Nyb2xsKCk7CkBAIC0zMDQ5LDYgKzI5NjIsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYWdlVGhhdE5lZWRzVG9TbGlkZVRpdGxlQmFyT2ZmU2NyZWVuID0gbnVsbDsKICAgICAgICAgfQorCisgICAgICAgIGluamVjdEFjY2Vzc2liaWxpdHlGb3JVcmwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpbmplY3RzIGFjY2Vzc2liaWxpdHkgaW4gdGhlIGxvYWRlZCBkb2N1bWVudCBpZiBhY2Nlc3NpYmlsaXR5CisgICAgICogaXMgZW5hYmxlZC4gSWYgSmF2YVNjcmlwdCBpcyBlbmFibGVkIHdlIHRyeSB0byBpbmplY3QgYSBVUkwgc3BlY2lmaWMgc2NyaXB0LgorICAgICAqIElmIG5vIFVSTCBzcGVjaWZpYyBzY3JpcHQgaXMgZm91bmQgb3IgSmF2YVNjcmlwdCBpcyBkaXNhYmxlZCB3ZSBmYWxsYmFjayB0bworICAgICAqIHRoZSBkZWZhdWx0IHtAbGluayBBY2Nlc3NpYmlsaXR5SW5qZWN0b3J9IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIGxvYWRlZCBieSB0aGlzIHtAbGluayBXZWJWaWV3fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5qZWN0QWNjZXNzaWJpbGl0eUZvclVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtQ29udGV4dCkuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldEphdmFTY3JpcHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2FkVXJsKEFDQ0VTU0lCSUxJVFlfU0NSSVBUX0NIT09TRVJfSkFWQVNDUklQVCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3IgPSBuZXcgQWNjZXNzaWJpbGl0eUluamVjdG9yKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBhY2Nlc3NpYmlsaXR5IHdhcyB0dXJuZWQgb2ZmIGJldHdlZW4gcmVsb2FkcworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3RvciA9IG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMxNjUsNyArMzEwMSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCByZXF1ZXN0IGEgbGF5b3V0LCB0cnkgdG8gc2VuZCBvdXIgdmlldyBzaXplIHRvIHRoZQogICAgICAgICAgICAgLy8gbmF0aXZlIHNpZGUgdG8gZW5zdXJlIHRoYXQgV2ViQ29yZSBoYXMgdGhlIGNvcnJlY3QgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMjk1LDQ2ICszMjMxLDcgQEAKICAgICAgKiAgICAgICAgIHNldHRpbmdzLgogICAgICAqLwogICAgIHB1YmxpYyBXZWJTZXR0aW5ncyBnZXRTZXR0aW5ncygpIHsKLSAgICAgICAgcmV0dXJuIG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBpbmZvcm0gdGhlIHdlYnZpZXcgYWJvdXQgcGFja2FnZXMgdGhhdCBhcmUgaW5zdGFsbGVkCi0gICAgICogaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lcyBpcyBhIHNldCBvZiBwYWNrYWdlIG5hbWVzIHRoYXQgYXJlIGtub3duIHRvIGJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFja2FnZU5hbWVzKFNldDxTdHJpbmc+IHBhY2thZ2VOYW1lcykgewotICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQUREX1BBQ0tBR0VfTkFNRVMsIHBhY2thZ2VOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBzaW5nbGUgcGFja2FnZXMgdGhhdCBhcmUKLSAgICAgKiBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlCi0gICAgICogbmF2aWdhdG9yLmlzQXBwbGljYXRpb25JbnN0YWxsZWQoKSBBUEkuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIGlzIHRoZSBuYW1lIG9mIGEgcGFja2FnZSB0aGF0IGlzIGtub3duIHRvIGJlCi0gICAgICogaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5BRERfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGluZm9ybSB0aGUgd2VidmlldyBhYm91dCBwYWNrYWdlcyB0aGF0IGFyZSB1bmluc3RhbGxlZAotICAgICAqIGluIHRoZSBzeXN0ZW0uIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZQotICAgICAqIG5hdmlnYXRvci5pc0FwcGxpY2F0aW9uSW5zdGFsbGVkKCkgQVBJLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBpcyB0aGUgbmFtZSBvZiBhIHBhY2thZ2UgdGhhdCBoYXMgYmVlbiB1bmluc3RhbGxlZCBpbgotICAgICAqIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAaGlkZSBub3QgYSBwdWJsaWMgQVBJCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfUEFDS0FHRV9OQU1FLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIHJldHVybiAobVdlYlZpZXdDb3JlICE9IG51bGwpID8gbVdlYlZpZXdDb3JlLmdldFNldHRpbmdzKCkgOiBudWxsOwogICAgIH0KIAogICAgLyoqCkBAIC0zNDA4LDM2ICszMzA1LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICBpZiAobUluT3ZlclNjcm9sbE1vZGUgJiYgIWdldFNldHRpbmdzKCkKLSAgICAgICAgICAgICAgICAuZ2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZCgpKSB7Ci0gICAgICAgICAgICBpZiAobU92ZXJTY3JvbGxCYWNrZ3JvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJhY2tncm91bmQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXR1c19iYXJfYmFja2dyb3VuZCk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCYWNrZ3JvdW5kLnNldFNoYWRlcihuZXcgQml0bWFwU2hhZGVyKGJtLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCkpOwotICAgICAgICAgICAgICAgIG1PdmVyU2Nyb2xsQm9yZGVyID0gbmV3IFBhaW50KCk7Ci0gICAgICAgICAgICAgICAgbU92ZXJTY3JvbGxCb3JkZXIuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRTdHJva2VXaWR0aCgwKTsKLSAgICAgICAgICAgICAgICBtT3ZlclNjcm9sbEJvcmRlci5zZXRDb2xvcigweGZmYmJiYmJiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRvcCA9IDA7Ci0gICAgICAgICAgICBpbnQgcmlnaHQgPSBjb21wdXRlUmVhbEhvcml6b250YWxTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgaW50IGJvdHRvbSA9IHRvcCArIGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgLy8gZmlyc3QgZHJhdyB0aGUgYmFja2dyb3VuZCBhbmQgYW5jaG9yIHRvIHRoZSB0b3Agb2YgdGhlIHZpZXcKLSAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKG1TY3JvbGxYLCBtU2Nyb2xsWSk7Ci0gICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoLW1TY3JvbGxYLCB0b3AgLSBtU2Nyb2xsWSwgcmlnaHQgLSBtU2Nyb2xsWCwgYm90dG9tCi0gICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFksIFJlZ2lvbi5PcC5ESUZGRVJFTkNFKTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UGFpbnQobU92ZXJTY3JvbGxCYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgICAgICAvLyB0aGVuIGRyYXcgdGhlIGJvcmRlcgotICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KC0xLCB0b3AgLSAxLCByaWdodCwgYm90dG9tLCBtT3ZlclNjcm9sbEJvcmRlcik7Ci0gICAgICAgICAgICAvLyBuZXh0IGNsaXAgdGhlIHJlZ2lvbiBmb3IgdGhlIGNvbnRlbnQKLSAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgwLCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgICAgICB9CiAgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLCAoaW50KSBtVGl0bGVCYXIuZ2V0SGVpZ2h0KCkpOwogICAgICAgICB9CkBAIC0zNDYzLDcxICszMzMwLDUwIEBACiAgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZICsgaGVpZ2h0KTsKICAgICAgICAgICAgIG1UaXRsZVNoYWRvdy5kcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoQVVUT19SRURSQVdfSEFDSyAmJiBtQXV0b1JlZHJhdykgewogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIG1XZWJUZXh0Vmlldy5vbkRyYXdTdWJzdGl0dXRlKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zaWduYWxSZXBhaW50RG9uZSgpOwotICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCAmJiBkcmF3RWRnZUdsb3dzKGNhbnZhcykpIHsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgLy8gcGFpbnQgdGhlIGhpZ2hsaWdodCBpbiB0aGUgZW5kCisgICAgICAgIGlmICghbVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaEhpZ2h0bGlnaHRQYWludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldENvbG9yKG1IaWdodGxpZ2h0Q29sb3IpOworICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2h0bGlnaHRQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICAgICAgbVRvdWNoSGlnaHRsaWdodFBhaW50LnNldFBhdGhFZmZlY3QobmV3IENvcm5lclBhdGhFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9ISUdITElHSFRfQVJDKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kYXJ5UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdodGxpZ2h0UGFpbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVR19UT1VDSF9ISUdITElHSFQpIHsKKyAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLmdldE5hdkR1bXAoKSkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoSGlnaGxpZ2h0WCB8IG1Ub3VjaEhpZ2hsaWdodFkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaENyb3NzSGFpckNvbG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaENyb3NzSGFpckNvbG9yID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hDcm9zc0hhaXJDb2xvci5zZXRDb2xvcihDb2xvci5SRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShtVG91Y2hIaWdobGlnaHRYIC0gbU5hdlNsb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1OYXZTbG9wICsgMSwgbVRvdWNoSGlnaGxpZ2h0WSArIG1OYXZTbG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEsIG1Ub3VjaENyb3NzSGFpckNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKG1Ub3VjaEhpZ2hsaWdodFggKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WSAtIG1OYXZTbG9wLCBtVG91Y2hIaWdobGlnaHRYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1OYXZTbG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgKyBtTmF2U2xvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoQ3Jvc3NIYWlyQ29sb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIERyYXcgdGhlIGdsb3cgZWZmZWN0IGFsb25nIHRoZSBzaWRlcyBvZiB0aGUgd2lkZ2V0LiBtRWRnZUdsb3cqIG11c3QgYmUgbm9uLW51bGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FudmFzIENhbnZhcyB0byBkcmF3IGludG8sIHRyYW5zZm9ybWVkIGludG8gdmlldyBjb29yZGluYXRlcy4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ2xvdyBlZmZlY3RzIGFyZSBzdGlsbCBhbmltYXRpbmcgYW5kIHRoZSB2aWV3IHNob3VsZCBpbnZhbGlkYXRlIGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkcmF3RWRnZUdsb3dzKENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgIGJvb2xlYW4gaW52YWxpZGF0ZUZvckdsb3cgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLQotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtd2lkdGggLyAyICsgc2Nyb2xsWCwgTWF0aC5taW4oMCwgc2Nyb2xsWSkpOwotICAgICAgICAgICAgbUVkZ2VHbG93VG9wLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOworICAgIHByaXZhdGUgdm9pZCByZW1vdmVUb3VjaEhpZ2hsaWdodChib29sZWFuIHJlbW92ZVBlbmRpbmdNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZW1vdmVQZW5kaW5nTWVzc2FnZSkgeworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnJlbW92ZU1lc3NhZ2VzKEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghbUVkZ2VHbG93Qm90dG9tLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiArIHNjcm9sbFgsIE1hdGgubWF4KGNvbXB1dGVNYXhTY3JvbGxZKCksIHNjcm9sbFkpICsgaGVpZ2h0KTsKLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20uc2V0U2l6ZSh3aWR0aCAqIDIsIGhlaWdodCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWhlaWdodCAqIDEuNWYgLSBzY3JvbGxZLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0LnNldFNpemUoaGVpZ2h0ICogMiwgd2lkdGgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUZvckdsb3cgfD0gbUVkZ2VHbG93TGVmdC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoOTApOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiArIHNjcm9sbFksCi0gICAgICAgICAgICAgICAgICAgIC0oTWF0aC5tYXgoY29tcHV0ZU1heFNjcm9sbFgoKSwgc2Nyb2xsWCkgKyB3aWR0aCkpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlRm9yR2xvdyB8PSBtRWRnZUdsb3dSaWdodC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQocmVzdG9yZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW52YWxpZGF0ZUZvckdsb3c7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM1NDQsMTIgKzMzOTAsMjAgQEAKICAgICAgICAgLy8gdG8gd2luZG93cyBvdmVydmlldywgdGhlIFdlYlZpZXcgd2lsbCBiZSB0ZW1wb3JhcmlseSByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgIC8vIHZpZXcgc3lzdGVtLiBJbiB0aGF0IGNhc2UsIGRvIG5vdGhpbmcuCiAgICAgICAgIGlmIChnZXRQYXJlbnQoKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQSBtdWx0aS1maW5nZXIgZ2VzdHVyZSBjYW4gbG9vayBsaWtlIGEgbG9uZyBwcmVzczsgbWFrZSBzdXJlIHdlIGRvbid0IHRha2UKKyAgICAgICAgLy8gbG9uZyBwcmVzcyBhY3Rpb25zIGlmIHdlJ3JlIHNjYWxpbmcuCisgICAgICAgIGZpbmFsIFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yID0gbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgaWYgKGRldGVjdG9yICE9IG51bGwgJiYgZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwICYmIG5hdGl2ZUN1cnNvcklzVGV4dElucHV0KCkpIHsKICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNsaWNrIHNvIHRoYXQgdGhlIHRleHRmaWVsZCBpcyBpbiBmb2N1cwogICAgICAgICAgICAgY2VudGVyS2V5UHJlc3NPblRleHRGaWVsZCgpOwogICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1XZWJUZXh0Vmlldy5wZXJmb3JtTG9uZ0NsaWNrKCk7CkBAIC0zNTcwLDI2ICszNDI0LDE3IEBACiAgICAgICAgIHNldFVwU2VsZWN0KCk7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgIT0gMCAmJiBuYXRpdmVXb3JkU2VsZWN0aW9uKHgsIHkpKSB7CiAgICAgICAgICAgICBuYXRpdmVTZXRFeHRlbmRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSBnZXRXZWJDaHJvbWVDbGllbnQoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgY2xpZW50Lm9uU2VsZWN0aW9uU3RhcnQodGhpcyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKKyAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbGVhbiBpbkFuaW1hdGVab29tKCkgewotICAgICAgICByZXR1cm4gbVpvb21TY2FsZSAhPSAwOwotICAgIH0KLQogICAgIC8qKgotICAgICAqIE5lZWQgdG8gYWRqdXN0IHRoZSBXZWJUZXh0VmlldyBhZnRlciBhIGNoYW5nZSBpbiB6b29tLCBzaW5jZSBtQWN0dWFsU2NhbGUKLSAgICAgKiBoYXMgY2hhbmdlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHBhc3N3b3JkIGZpZWxkcywgd2hpY2ggYXJlCi0gICAgICogZHJhd24gYnkgdGhlIFdlYlRleHRWaWV3LCBzaW5jZSBpdCBjb252ZXlzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB3aGF0Ci0gICAgICogd2Via2l0IGRyYXdzLiAgVGh1cyB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gaXQgdG8gc2hvdyBpbiB0aGUgY29ycmVjdAotICAgICAqIHBsYWNlLgorICAgICAqIEtlZXAgdHJhY2sgb2YgdGhlIENhbGxiYWNrIHNvIHdlIGNhbiBlbmQgaXRzIEFjdGlvbk1vZGUgb3IgcmVtb3ZlIGl0cworICAgICAqIHRpdGxlYmFyLgogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXc7CisgICAgcHJpdmF0ZSBTZWxlY3RBY3Rpb25Nb2RlQ2FsbGJhY2sgbVNlbGVjdENhbGxiYWNrOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGJvb2xlYW4gYWxsb3dJbnRlcnNlY3QpIHsKICAgICAgICAgUmVjdCBjb250ZW50Qm91bmRzID0gbmF0aXZlRm9jdXNDYW5kaWRhdGVOb2RlQm91bmRzKCk7CkBAIC0zNjE4LDI1ICszNDYzLDU0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmFzLCBib29sZWFuIGFuaW1hdGlvbnNSdW5uaW5nKSB7Ci0gICAgICAgIC8vIElmIG1OYXRpdmVDbGFzcyBpcyAwLCB3ZSBzaG91bGQgbm90IHJlYWNoIGhlcmUsIHNvIHdlIGRvIG5vdAotICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGl0IGFnYWluLgotICAgICAgICBpZiAoYW5pbWF0aW9uc1J1bm5pbmcpIHsKLSAgICAgICAgICAgIGNhbnZhcy5zZXREcmF3RmlsdGVyKG1XZWJWaWV3Q29yZS5tWm9vbUZpbHRlcik7CisgICAgcHJpdmF0ZSB2b2lkIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCkgeworICAgICAgICAvLyBJZiBpdCBpcyBpbiBwYXNzd29yZCBtb2RlLCB0dXJuIGl0IG9mZiBzbyBpdCBkb2VzIG5vdCBkcmF3IG1pc3BsYWNlZC4KKyAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZURyYXdFeHRyYXMoY2FudmFzLCBleHRyYXMpOwotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgb25ab29tQW5pbWF0aW9uRW5kKCkgeworICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAorICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKSAmJiBuYXRpdmVGb2N1c0NhbmRpZGF0ZUlzUGFzc3dvcmQoKSkgeworICAgICAgICAgICAgLy8gSWYgaXQgaXMgYSBwYXNzd29yZCBmaWVsZCwgc3RhcnQgZHJhd2luZyB0aGUgV2ViVGV4dFZpZXcgb25jZQorICAgICAgICAgICAgLy8gYWdhaW4uCisgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25TdGFydCgpIHsKKyAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKGdldFdlYlZpZXdDb3JlKCkpOworICAgICAgICBvblpvb21BbmltYXRpb25TdGFydCgpOworICAgIH0KKworICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKSB7CisgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKKyAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50LkRJVEhFUl9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuU1VCUElYRUxfVEVYVF9GTEFHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUc7CisKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVpvb21GaWx0ZXIgPQorICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFpPT01fQklUUywgUGFpbnQuTElORUFSX1RFWFRfRkxBRyk7CisgICAgLy8gSWYgd2UgbmVlZCB0byB0cmFkZSBiZXR0ZXIgcXVhbGl0eSBmb3Igc3BlZWQsIHNldCBtU2Nyb2xsRmlsdGVyIHRvIG51bGwKKyAgICBwcml2YXRlIGZpbmFsIERyYXdGaWx0ZXIgbVNjcm9sbEZpbHRlciA9CisgICAgICAgICAgICBuZXcgUGFpbnRGbGFnc0RyYXdGaWx0ZXIoU0NST0xMX0JJVFMsIDApOworCiAgICAgcHJpdmF0ZSB2b2lkIGRyYXdDb3JlQW5kQ3Vyc29yUmluZyhDYW52YXMgY2FudmFzLCBpbnQgY29sb3IsCiAgICAgICAgIGJvb2xlYW4gZHJhd0N1cnNvclJpbmcpIHsKICAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgY2FudmFzLnNjYWxlKG1BY3R1YWxTY2FsZSwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSwgbVpvb21NYW5hZ2VyLmdldFNjYWxlKCkpOwogICAgICAgICAgICAgY2FudmFzLmRyYXdQaWN0dXJlKG1IaXN0b3J5UGljdHVyZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47CiAKLSAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tU2NhbGUgIT0gMDsKKyAgICAgICAgYm9vbGVhbiBhbmltYXRlWm9vbSA9IG1ab29tTWFuYWdlci5pc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpOwogICAgICAgICBib29sZWFuIGFuaW1hdGVTY3JvbGwgPSAoKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpCiAgICAgICAgICAgICAgICAgfHwgbVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKQogICAgICAgICAgICAgICAgICYmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSB8fApAQCAtMzY1NSw1OSArMzUyOSw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFuaW1hdGVab29tKSB7Ci0gICAgICAgICAgICBmbG9hdCB6b29tU2NhbGU7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSAoaW50KSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtWm9vbVN0YXJ0KTsKLSAgICAgICAgICAgIGlmIChpbnRlcnZhbCA8IFpPT01fQU5JTUFUSU9OX0xFTkdUSCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSBpbnRlcnZhbCAvIFpPT01fQU5JTUFUSU9OX0xFTkdUSDsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSAxLjBmIC8gKG1JbnZJbml0aWFsWm9vbVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICArIChtSW52RmluYWxab29tU2NhbGUgLSBtSW52SW5pdGlhbFpvb21TY2FsZSkgKiByYXRpbyk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB6b29tU2NhbGUgPSBtWm9vbVNjYWxlOwotICAgICAgICAgICAgICAgIC8vIHNldCBtWm9vbVNjYWxlIHRvIGJlIDAgYXMgd2UgaGF2ZSBkb25lIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIG1ab29tU2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSBhZ2FpbiB0byBkcmF3IHdpdGggdGhlIGZpbmFsIGZpbHRlcnMKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVG9BZGp1c3RXZWJUZXh0VmlldykgewotICAgICAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFVwZGF0ZVRleHRWaWV3Qm91bmRzKGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2ViVGV4dFZpZXcgb25jZSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLiBBcyB3ZSBuZWVkIHRvIHVzZQotICAgICAgICAgICAgLy8gem9vbVNjYWxlLCB3ZSBjYW4ndCB1c2UgcGluTG9jWC9ZIGRpcmVjdGx5LiBDb3B5IHRoZSBsb2dpYyBoZXJlLgotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSB6b29tU2NhbGUgKiBtSW52SW5pdGlhbFpvb21TY2FsZTsKLSAgICAgICAgICAgIGludCB0eCA9IE1hdGgucm91bmQoc2NhbGUgKiAobUluaXRpYWxTY3JvbGxYICsgbVpvb21DZW50ZXJYKQotICAgICAgICAgICAgICAgICAgICAtIG1ab29tQ2VudGVyWCk7Ci0gICAgICAgICAgICB0eCA9IC1waW5Mb2ModHgsIGdldFZpZXdXaWR0aCgpLCBNYXRoLnJvdW5kKG1Db250ZW50V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgKiB6b29tU2NhbGUpKSArIG1TY3JvbGxYOwotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGludCB0eSA9IE1hdGgucm91bmQoc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgKiAobUluaXRpYWxTY3JvbGxZICsgbVpvb21DZW50ZXJZIC0gdGl0bGVIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1ab29tQ2VudGVyWSAtIHRpdGxlSGVpZ2h0KSk7Ci0gICAgICAgICAgICB0eSA9IC0odHkgPD0gdGl0bGVIZWlnaHQgPyBNYXRoLm1heCh0eSwgMCkgOiBwaW5Mb2ModHkKLSAgICAgICAgICAgICAgICAgICAgLSB0aXRsZUhlaWdodCwgZ2V0Vmlld0hlaWdodCgpLCBNYXRoLnJvdW5kKG1Db250ZW50SGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyB0aXRsZUhlaWdodCkgKyBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHgsIHR5KTsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZSh6b29tU2NhbGUsIHpvb21TY2FsZSk7Ci0gICAgICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmICFtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgJiYgbVpvb21TY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIFdlYlRleHRWaWV3IGlzIHVwLiAgS2VlcCB0cmFjayBvZiB0aGlzIHNvIHdlIGNhbiBhZGp1c3QKLSAgICAgICAgICAgICAgICAvLyBpdHMgc2l6ZSBhbmQgcGxhY2VtZW50IHdoZW4gd2UgZmluaXNoIHpvb21pbmcKLSAgICAgICAgICAgICAgICBtTmVlZFRvQWRqdXN0V2ViVGV4dFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgICAgICAvLyBtaXNwbGFjZWQuCi0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJUZXh0Vmlldy5zZXRJblBhc3N3b3JkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuYW5pbWF0ZVpvb20oY2FudmFzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbnZhcy5zY2FsZShtQWN0dWFsU2NhbGUsIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUobVpvb21NYW5hZ2VyLmdldFNjYWxlKCksIG1ab29tTWFuYWdlci5nZXRTY2FsZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gVUlBbmltYXRpb25zUnVubmluZyA9IGZhbHNlOwpAQCAtMzcxOSwyMyArMzU0MywzOCBAQAogICAgICAgICAgICAgLy8gd2UgYXNrIGZvciBhIHJlcGFpbnQuCiAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXdDb3JlLmRyYXdDb250ZW50UGljdHVyZShjYW52YXMsIGNvbG9yLAotICAgICAgICAgICAgICAgIChhbmltYXRlWm9vbSB8fCBtUHJldmlld1pvb21Pbmx5IHx8IFVJQW5pbWF0aW9uc1J1bm5pbmcpLAotICAgICAgICAgICAgICAgIGFuaW1hdGVTY3JvbGwpOwotICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHJldHVybjsKKwogICAgICAgICAvLyBkZWNpZGUgd2hpY2ggYWRvcm5tZW50cyB0byBkcmF3CiAgICAgICAgIGludCBleHRyYXMgPSBEUkFXX0VYVFJBU19OT05FOworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAibUZpbmRJc1VwPSIgKyBtRmluZElzVXAKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1TZWxlY3RpbmdUZXh0PSIgKyBtU2VsZWN0aW5nVGV4dAorICAgICAgICAgICAgICAgICAgICArICIgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCk9IgorICAgICAgICAgICAgICAgICAgICArIG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpCisgICAgICAgICAgICAgICAgICAgICsgIiBhbmltYXRlWm9vbT0iICsgYW5pbWF0ZVpvb20pOworICAgICAgICB9CiAgICAgICAgIGlmIChtRmluZElzVXApIHsKLSAgICAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19GSU5EOworICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfRklORDsKICAgICAgICAgfSBlbHNlIGlmIChtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgZXh0cmFzID0gRFJBV19FWFRSQVNfU0VMRUNUSU9OOwogICAgICAgICAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihtRHJhd1NlbGVjdGlvblBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgIG1JbnZBY3R1YWxTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldEludlNjYWxlKCksCiAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RYLCBtU2VsZWN0WSAtIGdldFRpdGxlSGVpZ2h0KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRyYXdDdXJzb3JSaW5nKSB7CiAgICAgICAgICAgICBleHRyYXMgPSBEUkFXX0VYVFJBU19DVVJTT1JfUklORzsKICAgICAgICAgfQotICAgICAgICBkcmF3RXh0cmFzKGNhbnZhcywgZXh0cmFzLCBVSUFuaW1hdGlvbnNSdW5uaW5nKTsKKyAgICAgICAgRHJhd0ZpbHRlciBkZiA9IG51bGw7CisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNab29tQW5pbWF0aW5nKCkgfHwgVUlBbmltYXRpb25zUnVubmluZykgeworICAgICAgICAgICAgZGYgPSBtWm9vbUZpbHRlcjsKKyAgICAgICAgfSBlbHNlIGlmIChhbmltYXRlU2Nyb2xsKSB7CisgICAgICAgICAgICBkZiA9IG1TY3JvbGxGaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIoZGYpOworICAgICAgICBpbnQgY29udGVudCA9IG5hdGl2ZURyYXcoY2FudmFzLCBjb2xvciwgZXh0cmFzLCB0cnVlKTsKKyAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7CisgICAgICAgIGlmIChjb250ZW50ICE9IDApIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCwgY29udGVudCwgMCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXh0cmFzID09IERSQVdfRVhUUkFTX0NVUlNPUl9SSU5HKSB7CiAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREUpIHsKQEAgLTM3NjQsMTAgKzM2MDMsMTQgQEAKICAgICAgICAgcmV0dXJuIG1EcmF3SGlzdG9yeTsKICAgICB9CiAKKyAgICBpbnQgZ2V0SGlzdG9yeVBpY3R1cmVXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtSGlzdG9yeVBpY3R1cmUgIT0gbnVsbCkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKSA6IDA7CisgICAgfQorCiAgICAgLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIFVJIHRocmVhZAogICAgIHZvaWQgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKSB7CiAgICAgICAgIGlmIChudWxsID09IG1XZWJWaWV3Q29yZSkgcmV0dXJuOyAvLyBDYWxsYmFja1Byb3h5IG1heSB0cmlnZ2VyIHRoaXMKLSAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSAmJiBtV2ViVmlld0NvcmUucGljdHVyZVJlYWR5KCkpIHsKKyAgICAgICAgaWYgKG1EcmF3SGlzdG9yeSAmJiAoZ2V0UHJvZ3Jlc3MoKSA9PSAxMDAgfHwgbmF0aXZlSGFzQ29udGVudCgpKSkgewogICAgICAgICAgICAgbURyYXdIaXN0b3J5ID0gZmFsc2U7CiAgICAgICAgICAgICBtSGlzdG9yeVBpY3R1cmUgPSBudWxsOwogICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMzgxOCw3ICszNjYxLDkgQEAKICAgICAgKiAgQHBhcmFtICBlbmQgICAgIEVuZCBvZiBzZWxlY3Rpb24uCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyB2b2lkIHNldFNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9TRUxFQ1RJT04sIHN0YXJ0LCBlbmQpOworICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0VMRUNUSU9OLCBzdGFydCwgZW5kKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzgzNiwxNCArMzY4MSwxMSBAQAogICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKIAotICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0IHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAotICAgICAgICBib29sZWFuIHpvb20gPSBtQWN0dWFsU2NhbGUgPCBtRGVmYXVsdFNjYWxlOworICAgICAgICAvLyBicmluZyBpdCBiYWNrIHRvIHRoZSByZWFkaW5nIGxldmVsIHNjYWxlIHNvIHRoYXQgdXNlciBjYW4gZW50ZXIgdGV4dAorICAgICAgICBib29sZWFuIHpvb20gPSBtWm9vbU1hbmFnZXIuZ2V0U2NhbGUoKSA8IG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICAgICAgaWYgKHpvb20pIHsKLSAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBtTGFzdFRvdWNoWTsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBjaGFuZ2UgdGV4dCB3cmFwIHNjYWxlIHNvIHRoYXQgdGhlcmUgaXMgbm8gcmVmbG93Ci0gICAgICAgICAgICBzZXROZXdab29tU2NhbGUobURlZmF1bHRTY2FsZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc2V0Wm9vbVNjYWxlKG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1RleHRWaWV3KSB7CiAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKQEAgLTM4NTUsNyArMzY5Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIFVzZWQgYnkgcGx1Z2lucy4KKyAgICAgICAgLy8gVXNlZCBieSBwbHVnaW5zIGFuZCBjb250ZW50RWRpdGFibGUuCiAgICAgICAgIC8vIEFsc28gdXNlZCBpZiB0aGUgbmF2aWdhdGlvbiBjYWNoZSBpcyBvdXQgb2YgZGF0ZSwgYW5kCiAgICAgICAgIC8vIGRvZXMgbm90IHJlY29nbml6ZSB0aGF0IGEgdGV4dGZpZWxkIGlzIGluIGZvY3VzLiAgSW4gdGhhdAogICAgICAgICAvLyBjYXNlLCB1c2UgV2ViVmlldyBhcyB0aGUgdGFyZ2V0ZWQgdmlldy4KQEAgLTM4NjcsOCArMzcwOSwxMCBAQAogICAgIHByaXZhdGUgdm9pZCBoaWRlU29mdEtleWJvYXJkKCkgewogICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gKElucHV0TWV0aG9kTWFuYWdlcikKICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LklOUFVUX01FVEhPRF9TRVJWSUNFKTsKLQotICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3codGhpcy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgaWYgKGltbS5pc0FjdGl2ZSh0aGlzKQorICAgICAgICAgICAgICAgIHx8IChpbkVkaXRpbmdNb2RlKCkgJiYgaW1tLmlzQWN0aXZlKG1XZWJUZXh0VmlldykpKSB7CisgICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3codGhpcy5nZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qCkBAIC0zOTQ2LDYgKzM3OTAsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUZWxsIHdlYmtpdCB0byBwdXQgdGhlIGN1cnNvciBvbiBzY3JlZW4uCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyB2b2lkIHJldmVhbFNlbGVjdGlvbigpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3Q29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUkVWRUFMX1NFTEVDVElPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgV2ViVGV4dFZpZXcgdG8gZmluZCBzYXZlZCBmb3JtIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQogICAgICAqIHRleHRmaWVsZAogICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRleHRmaWVsZC4KQEAgLTQwMzIsNiArMzg4NSwyNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSBEUlQgb24gVUkgdGhyZWFkLCBuZWVkIHRvIHByb3h5IHRvIFdlYkNvcmUgdGhyZWFkLgorICAgICAqCisgICAgICogQGhpZGUgZGVidWcgb25seQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpIHsKKyAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlVTRV9NT0NLX0RFVklDRV9PUklFTlRBVElPTik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IERSVCBvbiBXZWJDb3JlIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBoaWRlIGRlYnVnIG9ubHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbGVhbiBjYW5Qcm92aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuUHJvdmlkZUJldGEsIGRvdWJsZSBiZXRhLCBib29sZWFuIGNhblByb3ZpZGVHYW1tYSwgZG91YmxlIGdhbW1hKSB7CisgICAgICAgIG1XZWJWaWV3Q29yZS5zZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRHVtcCB0aGUgVjggY291bnRlcnMgdG8gc3RhbmRhcmQgb3V0cHV0LgogICAgICAqIE5vdGUgdGhhdCB5b3UgbmVlZCBhIGJ1aWxkIHdpdGggVjggYW5kIFdFQkNPUkVfSU5TVFJVTUVOVEFUSU9OIHNldCB0bwogICAgICAqIHRydWUuIE90aGVyd2lzZSwgdGhpcyB3aWxsIGRvIG5vdGhpbmcuCkBAIC00MDgyLDE0ICszOTU1LDE2IEBACiAgICAgICAgIC8vIEJ1YmJsZSB1cCB0aGUga2V5IGV2ZW50IGlmCiAgICAgICAgIC8vIDEuIGl0IGlzIGEgc3lzdGVtIGtleTsgb3IKICAgICAgICAgLy8gMi4gdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICAvLyAzLiB0aGUgYWNjZXNzaWJpbGl0eSBpbmplY3RvciBpcyBwcmVzZW50IGFuZCB3YW50cyB0byBoYW5kbGUgaXQ7CiAgICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpCi0gICAgICAgICAgICAgICAgfHwgbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZUtleUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYXRpdmVDdXJzb3JXYW50c0tleUV2ZW50cygpICYmICFtU2VsZWN0aW5nVGV4dCkgewogICAgICAgICAgICAgICAgIHNldFVwU2VsZWN0KCk7CkBAIC00MTA5LDggKzM5ODQsOCBAQAogICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAmJiBrZXlDb2RlIDw9IEtleUV2ZW50LktFWUNPREVfRFBBRF9SSUdIVCkgewogICAgICAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoa2V5Q29kZSwgZXZlbnQuZ2V0RXZlbnRUaW1lKCksIHRydWUpOworICAgICAgICAgICAgaWYgKG5hdGl2ZVBhZ2VTaG91bGRIYW5kbGVTaGlmdEFuZEFycm93cygpKSB7CisgICAgICAgICAgICAgICAgbGV0UGFnZUhhbmRsZU5hdktleShrZXlDb2RlLCBldmVudC5nZXRFdmVudFRpbWUoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKQEAgLTQyMzQsMTMgKzQxMDksMTYgQEAKICAgICAgICAgLy8gQnViYmxlIHVwIHRoZSBrZXkgZXZlbnQgaWYKICAgICAgICAgLy8gMS4gaXQgaXMgYSBzeXN0ZW0ga2V5OyBvcgogICAgICAgICAvLyAyLiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB3YW50cyB0byBoYW5kbGUgaXQ7Ci0gICAgICAgIGlmIChldmVudC5pc1N5c3RlbSgpIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkpIHsKKyAgICAgICAgLy8gMy4gdGhlIGFjY2Vzc2liaWxpdHkgaW5qZWN0b3IgaXMgcHJlc2VudCBhbmQgd2FudHMgdG8gaGFuZGxlIGl0OworICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKQorICAgICAgICAgICAgICAgIHx8IG1DYWxsYmFja1Byb3h5LnVpT3ZlcnJpZGVLZXlFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICB8fCAobUFjY2Vzc2liaWxpdHlJbmplY3RvciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5SW5qZWN0b3Iub25LZXlFdmVudChldmVudCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1NISUZUX0xFRlQKICAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfU0hJRlRfUklHSFQpIHsKLSAgICAgICAgICAgIGlmIChuYXRpdmVGb2N1c0lzUGx1Z2luKCkpIHsKKyAgICAgICAgICAgIGlmIChuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkgewogICAgICAgICAgICAgICAgIG1TaGlmdElzUHJlc3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChjb3B5U2VsZWN0aW9uKCkpIHsKICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CkBAIC00MjUwLDggKzQxMjgsOCBAQAogCiAgICAgICAgIGlmIChrZXlDb2RlID49IEtleUV2ZW50LktFWUNPREVfRFBBRF9VUAogICAgICAgICAgICAgICAgICYmIGtleUNvZGUgPD0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKSB7Ci0gICAgICAgICAgICBpZiAobmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAobmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKKyAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KGtleUNvZGUsIGV2ZW50LmdldEV2ZW50VGltZSgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBhbHdheXMgaGFuZGxlIHRoZSBuYXZpZ2F0aW9uIGtleXMgaW4gdGhlIFVJIHRocmVhZApAQCAtNDI5NCw4ICs0MTcyLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhclRleHRFbnRyeSh0cnVlKTsKLSAgICAgICAgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayh0cnVlKTsKKyAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgICAgICBuYXRpdmVTaG93Q3Vyc29yVGltZWQoKTsKICAgICAgICAgICAgIGlmICghbUNhbGxiYWNrUHJveHkudWlPdmVycmlkZVVybExvYWRpbmcobmF0aXZlQ3Vyc29yVGV4dCgpKSkgewogICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5DTElDSywgZGF0YS5tRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDdXJzb3JOb2RlUG9pbnRlcigpKTsKQEAgLTQzMTUsMTAgKzQxOTMsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcFNlbGVjdCgpIHsKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBTZWxlY3QoKSB7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgcmV0dXJuOwogICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHJldHVybjsKQEAgLTQzMzksNiArNDIxNCwxNSBAQAogICAgICAgICAgICAgbVNlbGVjdFkgPSBtU2Nyb2xsWSArIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAvIDI7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOworICAgICAgICBtU2VsZWN0Q2FsbGJhY2sgPSBuZXcgU2VsZWN0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIG1TZWxlY3RDYWxsYmFjay5zZXRXZWJWaWV3KHRoaXMpOworICAgICAgICBWaWV3IHRpdGxlQmFyID0gbVRpdGxlQmFyOworICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBlbWJlZGRlZCB0aXRsZSBiYXIgZHVyaW5nIGZpbmQgb3IKKyAgICAgICAgLy8gc2VsZWN0LCBidXQga2VlcCB0cmFjayBvZiBpdCBzbyB0aGF0IGl0IGNhbiBiZSByZXBsYWNlZCB3aGVuIHRoZQorICAgICAgICAvLyBtb2RlIGlzIGV4aXRlZC4KKyAgICAgICAgc2V0RW1iZWRkZWRUaXRsZUJhcihudWxsKTsKKyAgICAgICAgbVNlbGVjdENhbGxiYWNrLnNldFRpdGxlQmFyKHRpdGxlQmFyKTsKKyAgICAgICAgc3RhcnRBY3Rpb25Nb2RlKG1TZWxlY3RDYWxsYmFjayk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzUwLDkgKzQyMzQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogU2VsZWN0IGFsbCBvZiB0aGUgdGV4dCBpbiB0aGlzIFdlYlZpZXcuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0QWxsKCkgeworICAgIHZvaWQgc2VsZWN0QWxsKCkgewogICAgICAgICBpZiAoMCA9PSBtTmF0aXZlQ2xhc3MpIHJldHVybjsgLy8gY2xpZW50IGlzbid0IGluaXRpYWxpemVkCiAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHJldHVybjsKICAgICAgICAgaWYgKCFtU2VsZWN0aW5nVGV4dCkgc2V0VXBTZWxlY3QoKTsKQEAgLTQzNjMsMzYgKzQyNDcsMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3REaWFsb2dJc1VwKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdGluZ1RleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGhpZGUgcGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKSB7Ci0gICAgICAgIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7Ci0gICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkRvbmUoKSB7CisgICAgdm9pZCBzZWxlY3Rpb25Eb25lKCkgewogICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKLSAgICAgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSBnZXRXZWJDaHJvbWVDbGllbnQoKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgY2xpZW50Lm9uU2VsZWN0aW9uRG9uZSh0aGlzKTsKKyAgICAgICAgICAgIG1TZWxlY3RpbmdUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAvLyBmaW5pc2ggaXMgaWRlbXBvdGVudCwgc28gdGhpcyBpcyBmaW5lIGV2ZW4gaWYgc2VsZWN0aW9uRG9uZSB3YXMKKyAgICAgICAgICAgIC8vIGNhbGxlZCBieSBtU2VsZWN0Q2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZQorICAgICAgICAgICAgbVNlbGVjdENhbGxiYWNrLmZpbmlzaCgpOworICAgICAgICAgICAgbVNlbGVjdENhbGxiYWNrID0gbnVsbDsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVkcmF3IHdpdGhvdXQgc2VsZWN0aW9uCi0gICAgICAgICAgICBub3RpZnlTZWxlY3REaWFsb2dEaXNtaXNzZWQoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwuCisgICAgICogQ29weSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjb3B5U2VsZWN0aW9uKCkgeworICAgIGJvb2xlYW4gY29weVNlbGVjdGlvbigpIHsKICAgICAgICAgYm9vbGVhbiBjb3BpZWRTb21ldGhpbmcgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwogICAgICAgICBpZiAoc2VsZWN0aW9uICE9ICIiKSB7CkBAIC00NDAzLDIyICs0Mjc1LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dF9jb3BpZWQKICAgICAgICAgICAgICAgICAgICAgLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKICAgICAgICAgICAgIGNvcGllZFNvbWV0aGluZyA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDbGlwYm9hcmQgY2xpcCA9IElDbGlwYm9hcmQuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImNsaXBib2FyZCIpKTsKLSAgICAgICAgICAgICAgICBjbGlwLnNldENsaXBib2FyZFRleHQoc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDbGlwYm9hcmQgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNtID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworICAgICAgICAgICAgY20uc2V0VGV4dChzZWxlY3Rpb24pOwogICAgICAgICB9CiAgICAgICAgIGludmFsaWRhdGUoKTsgLy8gcmVtb3ZlIHNlbGVjdGlvbiByZWdpb24gYW5kIHBvaW50ZXIKICAgICAgICAgcmV0dXJuIGNvcGllZFNvbWV0aGluZzsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSBjb3VuY2lsIGFwcHJvdmFsLgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCB0ZXh0IGFzIGEgc3RyaW5nLgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgeworICAgIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuICIiOwogICAgICAgICByZXR1cm4gbmF0aXZlR2V0U2VsZWN0aW9uKCk7CiAgICAgfQpAQCAtNDQzMSwxMiArNDI5OSwyMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7CisgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CisgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOwogICAgICAgICBpZiAoaGFzV2luZG93Rm9jdXMoKSkgc2V0QWN0aXZlKGZhbHNlKTsKICAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblZpc2liaWxpdHlDaGFuZ2VkKFZpZXcgY2hhbmdlZFZpZXcsIGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUNoYW5nZWQoY2hhbmdlZFZpZXcsIHZpc2liaWxpdHkpOworICAgICAgICAvLyBUaGUgem9vbU1hbmFnZXIgbWF5IGJlIG51bGwgaWYgdGhlIHdlYnZpZXcgaXMgY3JlYXRlZCBmcm9tIFhNTCB0aGF0CisgICAgICAgIC8vIHNwZWNpZmllcyB0aGUgdmlldydzIHZpc2liaWxpdHkgcGFyYW0gYXMgbm90IHZpc2libGUgKHNlZSBodHRwOi8vYi8yNzk0ODQxKQorICAgICAgICBpZiAodmlzaWJpbGl0eSAhPSBWaWV3LlZJU0lCTEUgJiYgbVpvb21NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5kaXNtaXNzWm9vbVBpY2tlcigpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgV2ViVmlldyBubyBsb25nZXIgbmVlZHMgdG8gaW1wbGVtZW50CiAgICAgICogVmlld0dyb3VwLk9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIuICBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgbm93LgpAQCAtNDQ2NiwzMiArNDM0NCwzMCBAQAogICAgICAgICAgICAgICAgIC8vIElmIG91ciB3aW5kb3cgcmVnYWluZWQgZm9jdXMsIGFuZCB3ZSBoYXZlIGZvY3VzLCB0aGVuIGJlZ2luCiAgICAgICAgICAgICAgICAgLy8gZHJhd2luZyB0aGUgY3Vyc29yIHJpbmcKICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZSh0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyh0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBnYWluZWQgZm9jdXMsIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCwgZG8gbm90Ci0gICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgY3Vyc29yIHJpbmcuCi0gICAgICAgICAgICAgICAgbURyYXdDdXJzb3JSaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFpbkVkaXRpbmdNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBnYWluZWQgZm9jdXMsIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCwgZG8gbm90CisgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGN1cnNvciByaW5nLgorICAgICAgICAgICAgICAgICAgICBtRHJhd0N1cnNvclJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGNhbGwgbmF0aXZlUmVjb3JkQnV0dG9ucyBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lCiAgICAgICAgICAgICAgICAgLy8gdGhhdCB3aGVuIHdlIGxvc3QgZm9jdXMsIG9yIHdpbmRvdyBmb2N1cywgaXQgZ290IGNhbGxlZCB3aXRoCiAgICAgICAgICAgICAgICAgLy8gZmFsc2UgZm9yIHRoZSBmaXJzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtV2ViVmlld0NvcmUgIT0gbnVsbCAmJiBnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKQotICAgICAgICAgICAgICAgICAgICAmJiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCkpKSB7CisgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5pc1pvb21QaWNrZXJWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyIHdpbmRvdwotICAgICAgICAgICAgICAgICAqIGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZyBpZgotICAgICAgICAgICAgICAgICAqIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQorICAgICAgICAgICAgICAgICAqIFRoZSBleHRlcm5hbCB6b29tIGNvbnRyb2xzIGNvbWUgaW4gdGhlaXIgb3duIHdpbmRvdywgc28gb3VyCisgICAgICAgICAgICAgICAgICogd2luZG93IGxvc2VzIGZvY3VzLiBPdXIgcG9saWN5IGlzIHRvIG5vdCBkcmF3IHRoZSBjdXJzb3IgcmluZworICAgICAgICAgICAgICAgICAqIGlmIG91ciB3aW5kb3cgaXMgbm90IGZvY3VzZWQsIGJ1dCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaW5jZQogICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyIGNhbiBzdGlsbCBuYXZpZ2F0ZSB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGUgem9vbQogICAgICAgICAgICAgICAgICAqIGNvbnRyb2xzIHNob3dpbmcuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy8gSWYgb3VyIHdpbmRvdyBoYXMgbG9zdCBmb2N1cywgc3RvcCBkcmF3aW5nIHRoZSBjdXJzb3IgcmluZwogICAgICAgICAgICAgICAgIG1EcmF3Q3Vyc29yUmluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdvdEtleURvd24gPSBmYWxzZTsKQEAgLTQ1MDEsNyArNDM3Nyw3IEBACiAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICBuYXRpdmVSZWNvcmRCdXR0b25zKGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpOworICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQpAQCAtNDUxMiw5ICs0Mzg4LDkgQEAKICAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc1dpbmRvd0ZvY3VzKSB7CiAgICAgICAgIHNldEFjdGl2ZShoYXNXaW5kb3dGb2N1cyk7CiAgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cykgewotICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnNldEFjdGl2ZVdlYlZpZXcodGhpcyk7CisgICAgICAgICAgICBKV2ViQ29yZUphdmFCcmlkZ2Uuc2V0QWN0aXZlV2ViVmlldyh0aGlzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5yZW1vdmVBY3RpdmVXZWJWaWV3KHRoaXMpOworICAgICAgICAgICAgSldlYkNvcmVKYXZhQnJpZGdlLnJlbW92ZUFjdGl2ZVdlYlZpZXcodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgc3VwZXIub25XaW5kb3dGb2N1c0NoYW5nZWQoaGFzV2luZG93Rm9jdXMpOwogICAgIH0KQEAgLTQ1MjUsMTEgKzQ0MDEsOSBAQAogICAgICAqIG5vdCBkcmF3IHRoZSBibGlua2luZyBjdXJzb3IuICBJdCBnZXRzIHNldCB0byAiYWN0aXZlIiB0byBkcmF3IHRoZSBjdXJzb3IKICAgICAgKiBpbiBXZWJWaWV3Q29yZS5jcHAsIHdoZW4gdGhlIFdlYkNvcmUgdGhyZWFkIHJlY2VpdmVzIGtleSBldmVudHMvY2xpY2tzLgogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBzZXRGb2N1c0NvbnRyb2xsZXJJbmFjdGl2ZSgpIHsKLSAgICAgICAgLy8gRG8gbm90IG5lZWQgdG8gYWxzbyBjaGVjayB3aGV0aGVyIG1XZWJWaWV3Q29yZSBpcyBudWxsLCBiZWNhdXNlCi0gICAgICAgIC8vIG1OYXRpdmVDbGFzcyBpcyBvbmx5IHNldCBpZiBtV2ViVmlld0NvcmUgaXMgbm9uIG51bGwKLSAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSByZXR1cm47Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfQUNUSVZFLCAwLCAwKTsKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0Rm9jdXNDb250cm9sbGVyQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIGlmIChtV2ViVmlld0NvcmUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX0FDVElWRSwgYWN0aXZlID8gMSA6IDAsIDApOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDU0Niw2ICs0NDIwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmVjb3JkQnV0dG9ucyh0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZSh0cnVlKTsKICAgICAgICAgICAgIC8vfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgV2ViVmlldyBoYXMgZ2FpbmVkIGZvY3VzIHdoaWxlIHdlIGRvIG5vdCBoYXZlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93Zm9jdXMuICBXaGVuIG91ciB3aW5kb3cgbG9zdCBmb2N1cywgd2Ugc2hvdWxkIGhhdmUKQEAgLTQ1NTksNyArNDQzNCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlY29yZEJ1dHRvbnMoZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Rm9jdXNDb250cm9sbGVySW5hY3RpdmUoKTsKKyAgICAgICAgICAgICAgICBzZXRGb2N1c0NvbnRyb2xsZXJBY3RpdmUoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUdvdEtleURvd24gPSBmYWxzZTsKICAgICAgICAgfQpAQCAtNDU4MCw5NCArNDQ1NSwzNSBAQAogICAgICAgICAgICAgLy8gc3lzdGVtIHdvbid0IGNhbGwgb25TaXplQ2hhbmdlZCBpZiB0aGUgZGltZW5zaW9uIGlzIG5vdCBjaGFuZ2VkLgogICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNhbGwgc2VuZFZpZXdTaXplWm9vbSgpIGV4cGxpY2l0bHkgdG8KICAgICAgICAgICAgIC8vIG5vdGlmeSB0aGUgV2ViS2l0IGFib3V0IHRoZSBuZXcgZGltZW5zaW9ucy4KLSAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oKTsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RTY2FsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBtVXBkYXRlVGV4dFdyYXA7Ci0KLSAgICAgICAgcHVibGljIFBvc3RTY2FsZShXZWJWaWV3IHdlYlZpZXcsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXApIHsKLSAgICAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKLSAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCA9IHVwZGF0ZVRleHRXcmFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1XZWJWaWV3Lm1XZWJWaWV3Q29yZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGZvcmNlLCBpbiBjYXNlIG91ciBoZWlnaHQgY2hhbmdlZCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gc2VuZCB0aGUgbm90aWZpY2F0aW9uIG92ZXIgdG8gd2Via2l0LgotICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNldE5ld1pvb21TY2FsZShtV2ViVmlldy5tQWN0dWFsU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAsIHRydWUpOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy51cGRhdGVab29tQnV0dG9uc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG93LCBpbnQgb2gpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvdywgb2gpOwotICAgICAgICAvLyBDZW50ZXIgem9vbWluZyB0byB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChtWm9vbVNjYWxlID09IDApIHsgLy8gdW5sZXNzIHdlJ3JlIGFscmVhZHkgem9vbWluZwotICAgICAgICAgICAgLy8gVG8gYW5jaG9yIGF0IHRvcCBsZWZ0IGNvcm5lci4KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICBtWm9vbUNlbnRlclkgPSBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIG1BbmNob3JYID0gdmlld1RvQ29udGVudFgoKGludCkgbVpvb21DZW50ZXJYICsgbVNjcm9sbFgpOwotICAgICAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIH0KIAogICAgICAgICAvLyBhZGp1c3QgdGhlIG1heCB2aWV3cG9ydCB3aWR0aCBkZXBlbmRpbmcgb24gdGhlIHZpZXcgZGltZW5zaW9ucy4gVGhpcwogICAgICAgICAvLyBpcyB0byBlbnN1cmUgdGhlIHNjYWxpbmcgaXMgbm90IGdvaW5nIGluc2FuZS4gU28gZG8gbm90IHNocmluayBpdCBpZgogICAgICAgICAvLyB0aGUgdmlldyBzaXplIGlzIHRlbXBvcmFyaWx5IHNtYWxsZXIsIGUuZy4gd2hlbiBzb2Z0IGtleWJvYXJkIGlzIHVwLgotICAgICAgICBpbnQgbmV3TWF4Vmlld3BvcnRXaWR0aCA9IChpbnQpIChNYXRoLm1heCh3LCBoKSAvIERFRkFVTFRfTUlOX1pPT01fU0NBTEUpOworICAgICAgICBpbnQgbmV3TWF4Vmlld3BvcnRXaWR0aCA9IChpbnQpIChNYXRoLm1heCh3LCBoKSAvIG1ab29tTWFuYWdlci5nZXREZWZhdWx0TWluWm9vbVNjYWxlKCkpOwogICAgICAgICBpZiAobmV3TWF4Vmlld3BvcnRXaWR0aCA+IHNNYXhWaWV3cG9ydFdpZHRoKSB7CiAgICAgICAgICAgICBzTWF4Vmlld3BvcnRXaWR0aCA9IG5ld01heFZpZXdwb3J0V2lkdGg7CiAgICAgICAgIH0KIAotICAgICAgICAvLyB1cGRhdGUgbU1pblpvb21TY2FsZSBpZiB0aGUgbWluaW11bSB6b29tIHNjYWxlIGlzIG5vdCBmaXhlZAotICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2UgZnJvbSBuYXJyb3cgc2NyZWVuIHRvIHdpZGUgc2NyZWVuLCB0aGUgbmV3IHZpZXdXaWR0aAotICAgICAgICAgICAgLy8gY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9sZCBjb250ZW50IHdpZHRoLiBXZSBsaW1pdCB0aGUgbWluaW11bQotICAgICAgICAgICAgLy8gc2NhbGUgdG8gMS4wZi4gVGhlIHByb3BlciBtaW5pbXVtIHNjYWxlIHdpbGwgYmUgY2FsY3VsYXRlZCB3aGVuCi0gICAgICAgICAgICAvLyB0aGUgbmV3IHBpY3R1cmUgc2hvd3MgdXAuCi0gICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gTWF0aC5taW4oMS4wZiwgKGZsb2F0KSBnZXRWaWV3V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAvIChtRHJhd0hpc3RvcnkgPyBtSGlzdG9yeVBpY3R1cmUuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVpvb21PdmVydmlld1dpZHRoKSk7Ci0gICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZUluUGVyY2VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgbWluWm9vbVNjYWxlIHRvIHRoZSBpbml0aWFsU2NhbGUgaWYgaXQgaXMgc2V0Ci0gICAgICAgICAgICAgICAgZmxvYXQgaW5pdGlhbFNjYWxlID0gbUluaXRpYWxTY2FsZUluUGVyY2VudCAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAobU1pblpvb21TY2FsZSA+IGluaXRpYWxTY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gaW5pdGlhbFNjYWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGRpc21pc3Nab29tQ29udHJvbCgpOwotCi0gICAgICAgIC8vIG9uU2l6ZUNoYW5nZWQoKSBpcyBjYWxsZWQgZHVyaW5nIFdlYlZpZXcgbGF5b3V0LiBBbmQgYW55Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKSBpcyBibG9ja2VkIGR1cmluZyBsYXlvdXQuIEFzIHNldE5ld1pvb21TY2FsZSgpIHdpbGwKLSAgICAgICAgLy8gY2FsbCBpdHMgY2hpbGQgVmlldyB0byByZXBvc2l0aW9uIGl0c2VsZiB0aHJvdWdoIFZpZXdNYW5hZ2VyJ3MKLSAgICAgICAgLy8gc2NhbGVBbGwoKSwgd2UgbmVlZCB0byBwb3N0IGEgUnVubmFibGUgdG8gZW5zdXJlIHJlcXVlc3RMYXlvdXQoKS4KLSAgICAgICAgLy8gPGIvPgotICAgICAgICAvLyBvbmx5IHVwZGF0ZSB0aGUgdGV4dCB3cmFwIHNjYWxlIGlmIHdpZHRoIGNoYW5nZWQuCi0gICAgICAgIHBvc3QobmV3IFBvc3RTY2FsZSh0aGlzLCB3ICE9IG93KSk7CisgICAgICAgIG1ab29tTWFuYWdlci5vblNpemVDaGFuZ2VkKHcsIGgsIG93LCBvaCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TY3JvbGxDaGFuZ2VkKGludCBsLCBpbnQgdCwgaW50IG9sZGwsIGludCBvbGR0KSB7CiAgICAgICAgIHN1cGVyLm9uU2Nyb2xsQ2hhbmdlZChsLCB0LCBvbGRsLCBvbGR0KTsKLSAgICAgICAgaWYgKCFtSW5PdmVyU2Nyb2xsTW9kZSkgewotICAgICAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7Ci0gICAgICAgICAgICAvLyB1cGRhdGUgV2ViS2l0IGlmIHZpc2libGUgdGl0bGUgYmFyIGhlaWdodCBjaGFuZ2VkLiBUaGUgbG9naWMgaXMgc2FtZQotICAgICAgICAgICAgLy8gYXMgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0LgotICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKLSAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNlbmRPdXJWaXNpYmxlUmVjdCgpOworICAgICAgICAvLyB1cGRhdGUgV2ViS2l0IGlmIHZpc2libGUgdGl0bGUgYmFyIGhlaWdodCBjaGFuZ2VkLiBUaGUgbG9naWMgaXMgc2FtZQorICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCisgICAgICAgIGludCB0aXRsZUhlaWdodCA9IGdldFRpdGxlSGVpZ2h0KCk7CisgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKKyAgICAgICAgICAgIHNlbmRWaWV3U2l6ZVpvb20oZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00Njc1LDkgKzQ0OTEsMTEgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGJvb2xlYW4gZGlzcGF0Y2ggPSB0cnVlOwogCi0gICAgICAgIC8vIFRleHRmaWVsZHMgYW5kIHBsdWdpbnMgbmVlZCB0byByZWNlaXZlIHRoZSBzaGlmdCB1cCBrZXkgZXZlbiBpZgotICAgICAgICAvLyBhbm90aGVyIGtleSB3YXMgcmVsZWFzZWQgd2hpbGUgdGhlIHNoaWZ0IGtleSB3YXMgaGVsZCBkb3duLgotICAgICAgICBpZiAoIWluRWRpdGluZ01vZGUoKSAmJiAobU5hdGl2ZUNsYXNzID09IDAgfHwgIW5hdGl2ZUZvY3VzSXNQbHVnaW4oKSkpIHsKKyAgICAgICAgLy8gVGV4dGZpZWxkcywgcGx1Z2lucywgYW5kIGNvbnRlbnRFZGl0YWJsZSBub2RlcyBuZWVkIHRvIHJlY2VpdmUgdGhlCisgICAgICAgIC8vIHNoaWZ0IHVwIGtleSBldmVuIGlmIGFub3RoZXIga2V5IHdhcyByZWxlYXNlZCB3aGlsZSB0aGUgc2hpZnQga2V5CisgICAgICAgIC8vIHdhcyBoZWxkIGRvd24uCisgICAgICAgIGlmICghaW5FZGl0aW5nTW9kZSgpICYmIChtTmF0aXZlQ2xhc3MgPT0gMAorICAgICAgICAgICAgICAgIHx8ICFuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKSkpIHsKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgICAgIG1Hb3RLZXlEb3duID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00NzM3LDcgKzQ1NTUsNyBAQAogICAgICAgICBwdWJsaWMgRHJhZ1RyYWNrZXJIYW5kbGVyKGZsb2F0IHgsIGZsb2F0IHksIERyYWdUcmFja2VyIHByb3h5KSB7CiAgICAgICAgICAgICBtUHJveHkgPSBwcm94eTsKIAotICAgICAgICAgICAgaW50IGRvY0JvdHRvbSA9IGNvbXB1dGVSZWFsVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGludCBkb2NCb3R0b20gPSBjb21wdXRlVmVydGljYWxTY3JvbGxSYW5nZSgpICsgZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgICAgIGludCB2aWV3VG9wID0gZ2V0U2Nyb2xsWSgpOwogICAgICAgICAgICAgaW50IHZpZXdCb3R0b20gPSB2aWV3VG9wICsgZ2V0SGVpZ2h0KCk7CiAKQEAgLTQ3NTAsNyArNDU2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIiB1cC9kb3duPSAiICsgbU1pbkRZICsgIiAiICsgbU1heERZKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50IGRvY1JpZ2h0ID0gY29tcHV0ZVJlYWxIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKKyAgICAgICAgICAgIGludCBkb2NSaWdodCA9IGNvbXB1dGVIb3Jpem9udGFsU2Nyb2xsUmFuZ2UoKTsKICAgICAgICAgICAgIGludCB2aWV3TGVmdCA9IGdldFNjcm9sbFgoKTsKICAgICAgICAgICAgIGludCB2aWV3UmlnaHQgPSB2aWV3TGVmdCArIGdldFdpZHRoKCk7CiAgICAgICAgICAgICBtU3RhcnRYID0geDsKQEAgLTQ5MTEsODEgKzQ3MjksNiBAQAogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXIgbURyYWdUcmFja2VyOwogICAgIHByaXZhdGUgRHJhZ1RyYWNrZXJIYW5kbGVyIG1EcmFnVHJhY2tlckhhbmRsZXI7CiAKLSAgICBwcml2YXRlIGNsYXNzIFNjYWxlRGV0ZWN0b3JMaXN0ZW5lciBpbXBsZW1lbnRzCi0gICAgICAgICAgICBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCi0gICAgICAgICAgICBjYW5jZWxUb3VjaCgpOwotICAgICAgICAgICAgZGlzbWlzc1pvb21Db250cm9sKCk7Ci0gICAgICAgICAgICAvLyByZXNldCB0aGUgem9vbSBvdmVydmlldyBtb2RlIHNvIHRoYXQgdGhlIHBhZ2Ugd29uJ3QgYXV0byBncm93Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcKLSAgICAgICAgICAgIC8vIG1pc3BsYWNlZC4KLSAgICAgICAgICAgIGlmIChpbkVkaXRpbmdNb2RlKCkgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICBtV2ViVGV4dFZpZXcuc2V0SW5QYXNzd29yZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WaWV3TWFuYWdlci5zdGFydFpvb20oKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjYWxlRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZpZXdab29tT25seSkgewotICAgICAgICAgICAgICAgIG1QcmV2aWV3Wm9vbU9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgICAgICAgICBtQW5jaG9yWSA9IHZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1TY3JvbGxZKTsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCByZWZsb3cgd2hlbiB6b29tIGluOyB3aGVuIHpvb20gb3V0LCBkbyByZWZsb3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHNjYWxlIGlzIGFsbW9zdCBtaW5pbXVtIHNjYWxlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVmbG93Tm93ID0gKG1BY3R1YWxTY2FsZSAtIG1NaW5ab29tU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpKTsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSB6b29tIGFmdGVyIG1QcmV2aWV3Wm9vbU9ubHkgaXMgc2V0IHRvIGZhbHNlIHNvIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IHZpZXcgc2l6ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV2ViS2l0Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgcmVmbG93Tm93LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIGludmFsaWRhdGUoKSB0byBkcmF3IHdpdGhvdXQgem9vbSBmaWx0ZXIKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGVkaXQgdGV4dCB2aWV3IGlmIG5lZWRlZAotICAgICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSAmJiBkaWRVcGRhdGVUZXh0Vmlld0JvdW5kcyhmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbmF0aXZlRm9jdXNDYW5kaWRhdGVJc1Bhc3N3b3JkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkLCBzdGFydCBkcmF3aW5nIHRoZQotICAgICAgICAgICAgICAgIC8vIFdlYlRleHRWaWV3IG9uY2UgYWdhaW4uCi0gICAgICAgICAgICAgICAgbVdlYlRleHRWaWV3LnNldEluUGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMgaXQKLSAgICAgICAgICAgIC8vIG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBjbGljaywgY2FuJ3QgdXNlIFRPVUNIX0RSQUdfTU9ERSBhcyBpdAotICAgICAgICAgICAgLy8gbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGZsaW5nLgotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7Ci0gICAgICAgICAgICBtQ29uZmlybU1vdmUgPSB0cnVlOwotICAgICAgICAgICAgc3RhcnRUb3VjaChkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCksCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lKTsKLQotICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmVuZFpvb20oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uU2NhbGUoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKLSAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gKGZsb2F0KSAoTWF0aC5yb3VuZChkZXRlY3Rvci5nZXRTY2FsZUZhY3RvcigpCi0gICAgICAgICAgICAgICAgICAgICogbUFjdHVhbFNjYWxlICogMTAwKSAvIDEwMC4wKTsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCi0gICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gZGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgbVpvb21DZW50ZXJZID0gZGV0ZWN0b3IuZ2V0Rm9jdXNZKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgYm9vbGVhbiBoaXRGb2N1c2VkUGx1Z2luKGludCBjb250ZW50WCwgaW50IGNvbnRlbnRZKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJuYXRpdmVGb2N1c0lzUGx1Z2luKCk9IiArIG5hdGl2ZUZvY3VzSXNQbHVnaW4oKSk7CkBAIC01MDA3LDYgKzQ3NTAsNDEgQEAKICAgICAgICAgcmV0dXJuIG1GdWxsU2NyZWVuSG9sZGVyICE9IG51bGw7CiAgICAgfQogCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKSB7CisgICAgICAgIC8vIGNhbmNlbCB0aGUgc2luZ2xlIHRvdWNoIGhhbmRsaW5nCisgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgfQorCisgICAgdm9pZCBvblBpbmNoVG9ab29tQW5pbWF0aW9uRW5kKFNjYWxlR2VzdHVyZURldGVjdG9yIGRldGVjdG9yKSB7CisgICAgICAgIG9uWm9vbUFuaW1hdGlvbkVuZCgpOworICAgICAgICAvLyBzdGFydCBhIGRyYWcsIFRPVUNIX1BJTkNIX0RSQUcsIGNhbid0IHVzZSBUT1VDSF9JTklUX01PREUgYXMKKyAgICAgICAgLy8gaXQgbWF5IHRyaWdnZXIgdGhlIHVud2FudGVkIGNsaWNrLCBjYW4ndCB1c2UgVE9VQ0hfRFJBR19NT0RFCisgICAgICAgIC8vIGFzIGl0IG1heSB0cmlnZ2VyIHRoZSB1bndhbnRlZCBmbGluZy4KKyAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX1BJTkNIX0RSQUc7CisgICAgICAgIG1Db25maXJtTW92ZSA9IHRydWU7CisgICAgICAgIHN0YXJ0VG91Y2goZGV0ZWN0b3IuZ2V0Rm9jdXNYKCksIGRldGVjdG9yLmdldEZvY3VzWSgpLCBtTGFzdFRvdWNoVGltZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2Nyb2xsaW5nTGF5ZXIoZmxvYXQgZ2VzdHVyZVgsIGZsb2F0IGdlc3R1cmVZKSB7CisgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERSkgeworICAgICAgICAgICAgaW50IGNvbnRlbnRYID0gdmlld1RvQ29udGVudFgoKGludCkgZ2VzdHVyZVggKyBtU2Nyb2xsWCk7CisgICAgICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBnZXN0dXJlWSArIG1TY3JvbGxZKTsKKyAgICAgICAgICAgIG1TY3JvbGxpbmdMYXllciA9IG5hdGl2ZVNjcm9sbGFibGVMYXllcihjb250ZW50WCwgY29udGVudFkpOworICAgICAgICAgICAgaWYgKG1TY3JvbGxpbmdMYXllciAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RSQUdfTEFZRVJfTU9ERTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDEvKGRlbnNpdHkgKiBkZW5zaXR5KSB1c2VkIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzLgorICAgIC8vIENvbXB1dGVkIGluIGluaXQoKS4KKyAgICBwcml2YXRlIGZsb2F0IERSQUdfTEFZRVJfSU5WRVJTRV9ERU5TSVRZX1NRVUFSRUQ7CisKKyAgICAvLyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzIHJlcG9ydGVkIGluIG9uVG91Y2hFdmVudCBzY2FsZWQgYnkgdGhlCisgICAgLy8gZGVuc2l0eSBvZiB0aGUgc2NyZWVuLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSA9IDIwMDAwOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCB8fCAhaXNDbGlja2FibGUoKSB8fCAhaXNMb25nQ2xpY2thYmxlKCkpIHsKQEAgLTUwMTgsNTcgKzQ3OTYsMTE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgbVRvdWNoTW9kZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgYWN0aW9uOwotICAgICAgICBmbG9hdCB4LCB5OworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKCk7CisgICAgICAgIGZsb2F0IHkgPSBldi5nZXRZKCk7CiAgICAgICAgIGxvbmcgZXZlbnRUaW1lID0gZXYuZ2V0RXZlbnRUaW1lKCk7CiAKKyAgICAgICAgZmluYWwgU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IgPQorICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5nZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCk7CisgICAgICAgIGJvb2xlYW4gc2tpcFNjYWxlR2VzdHVyZSA9IGZhbHNlOworICAgICAgICAvLyBTZXQgdG8gdGhlIG1pZC1wb2ludCBvZiBhIHR3by1maW5nZXIgZ2VzdHVyZSB1c2VkIHRvIGRldGVjdCBpZiB0aGUKKyAgICAgICAgLy8gdXNlciBoYXMgdG91Y2hlZCBhIGxheWVyLgorICAgICAgICBmbG9hdCBnZXN0dXJlWCA9IHg7CisgICAgICAgIGZsb2F0IGdlc3R1cmVZID0geTsKKyAgICAgICAgaWYgKGRldGVjdG9yID09IG51bGwgfHwgIWRldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7CisgICAgICAgICAgICAvLyBUaGUgZ2VzdHVyZSBmb3Igc2Nyb2xsaW5nIGEgbGF5ZXIgaXMgdHdvIGZpbmdlcnMgY2xvc2UgdG9nZXRoZXIuCisgICAgICAgICAgICAvLyBGSVhNRTogd2UgbWF5IGNvbnNpZGVyIGdpdmluZyBXZWJLaXQgYW4gb3B0aW9uIHRvIGhhbmRsZQorICAgICAgICAgICAgLy8gbXVsdGktdG91Y2ggZXZlbnRzIGxhdGVyLgorICAgICAgICAgICAgaWYgKGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgIGZsb2F0IGR4ID0gZXYuZ2V0WCgxKSAtIGV2LmdldFgoMCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZHkgPSBldi5nZXRZKDEpIC0gZXYuZ2V0WSgwKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaXN0ID0gKGR4ICogZHggKyBkeSAqIGR5KSAqCisgICAgICAgICAgICAgICAgICAgICAgICBEUkFHX0xBWUVSX0lOVkVSU0VfREVOU0lUWV9TUVVBUkVEOworICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXBwcm94aW1hdGUgY2VudGVyIHRvIGRldGVybWluZSBpZiB0aGUgZ2VzdHVyZSBpcyBpbgorICAgICAgICAgICAgICAgIC8vIGEgbGF5ZXIuCisgICAgICAgICAgICAgICAgZ2VzdHVyZVggPSBldi5nZXRYKDApICsgKGR4ICogLjVmKTsKKyAgICAgICAgICAgICAgICBnZXN0dXJlWSA9IGV2LmdldFkoMCkgKyAoZHkgKiAuNWYpOworICAgICAgICAgICAgICAgIC8vIE5vdyB1c2UgYSBjb25zaXN0ZW50IHBvaW50IGZvciB0cmFja2luZyBtb3ZlbWVudC4KKyAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0WCgwKSA8IGV2LmdldFgoMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgoMCk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBldi5nZXRZKDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHggPSBldi5nZXRYKDEpOworICAgICAgICAgICAgICAgICAgICB5ID0gZXYuZ2V0WSgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPCBEUkFHX0xBWUVSX0ZJTkdFUl9ESVNUQU5DRSkgeworICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGVHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmdlcnMgbW92ZWQgdG9vIGZhciBhcGFydCB3aGlsZSBkcmFnZ2luZywgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgdHJ5aW5nIHRvIHpvb20uCisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gRklYTUU6IHdlIG1heSBjb25zaWRlciB0byBnaXZlIFdlYktpdCBhbiBvcHRpb24gdG8gaGFuZGxlIG11bHRpLXRvdWNoCiAgICAgICAgIC8vIGV2ZW50cyBsYXRlci4KLSAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiBldi5nZXRQb2ludGVyQ291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIGlmIChtQWxsb3dQYW5BbmRTY2FsZSB8fCBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgICAgIG1TY2FsZURldGVjdG9yLm9uVG91Y2hFdmVudChldik7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY2FsZURldGVjdG9yLmlzSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hUaW1lID0gZXZlbnRUaW1lOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1BbGxvd1BhbkFuZFNjYWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ID0gbVNjYWxlRGV0ZWN0b3IuZ2V0Rm9jdXNYKCk7Ci0gICAgICAgICAgICAgICAgeSA9IG1TY2FsZURldGVjdG9yLmdldEZvY3VzWSgpOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgeCBvciB5IGluZGljYXRlIGl0IGlzIG9uIHRoZSBlZGdlLCBza2lwIGl0LgotICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBkaXNhbGxvdyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuc3VwcG9ydHNNdWx0aVRvdWNoWm9vbSgpICYmIGV2LmdldFBvaW50ZXJDb3VudCgpID4gMSAmJgorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFICYmICFza2lwU2NhbGVHZXN0dXJlKSB7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBwYWdlIGRpc2FsbG93cyB6b29tLCBza2lwIG11bHRpLXBvaW50ZXIgYWN0aW9uCisgICAgICAgICAgICBpZiAoIW1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSAmJiBtWm9vbU1hbmFnZXIuaXNab29tU2NhbGVGaXhlZCgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIHggPSBldi5nZXRYKCk7Ci0gICAgICAgICAgICB5ID0gZXYuZ2V0WSgpOworCisgICAgICAgICAgICBpZiAoIWRldGVjdG9yLmlzSW5Qcm9ncmVzcygpICYmCisgICAgICAgICAgICAgICAgICAgIGV2LmdldEFjdGlvbk1hc2tlZCgpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pIHsKKyAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBmYWtlIHBvaW50ZXIgZG93biBldmVudCBpbiBvcmRlciB0byBzdGFydAorICAgICAgICAgICAgICAgIC8vIHRoZSB6b29tIHNjYWxlIGRldGVjdG9yLgorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50IHRlbXAgPSBNb3Rpb25FdmVudC5vYnRhaW4oZXYpOworICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBvcmlnaW5hbCBldmVudCBhbmQgc2V0IGl0IHRvCisgICAgICAgICAgICAgICAgLy8gQUNUSU9OX1BPSU5URVJfRE9XTi4KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldEFjdGlvbih0ZW1wLmdldEFjdGlvbigpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TW90aW9uRXZlbnQuQUNUSU9OX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0RPV04pOworICAgICAgICAgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQodGVtcCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcC5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXRlY3Rvci5vblRvdWNoRXZlbnQoZXYpOworCisgICAgICAgICAgICBpZiAoZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKKyAgICAgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoU1dJVENIX1RPX0xPTkdQUkVTUyk7CisgICAgICAgICAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIuc3VwcG9ydHNQYW5EdXJpbmdab29tKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9EUkFHX01PREU7CisgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeCA9IGRldGVjdG9yLmdldEZvY3VzWCgpOworICAgICAgICAgICAgeSA9IGRldGVjdG9yLmdldEZvY3VzWSgpOworICAgICAgICAgICAgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCkgJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSzsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRvdWNoKCk7CisgICAgICAgICAgICAgICAgYWN0aW9uID0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV047CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIC8vIHNldCBtTGFzdFRvdWNoWC9ZIHRvIHRoZSByZW1haW5pbmcgcG9pbnQKKyAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICAvLyBuZWdhdGl2ZSB4IG9yIHkgaW5kaWNhdGUgaXQgaXMgb24gdGhlIGVkZ2UsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIER1ZSB0byB0aGUgdG91Y2ggc2NyZWVuIGVkZ2UgZWZmZWN0LCBhIHRvdWNoIGNsb3NlciB0byB0aGUgZWRnZQogICAgICAgICAvLyBhbHdheXMgc25hcHBlZCB0byB0aGUgZWRnZS4gQXMgZ2V0Vmlld1dpZHRoKCkgY2FuIGJlIGRpZmZlcmVudCBmcm9tCiAgICAgICAgIC8vIGdldFdpZHRoKCkgZHVlIHRvIHRoZSBzY3JvbGxiYXIsIGFkanVzdGluZyB0aGUgcG9pbnQgdG8gbWF0Y2gKICAgICAgICAgLy8gZ2V0Vmlld1dpZHRoKCkuIFNhbWUgYXBwbGllZCB0byB0aGUgaGVpZ2h0LgotICAgICAgICBpZiAoeCA+IGdldFZpZXdXaWR0aCgpIC0gMSkgewotICAgICAgICAgICAgeCA9IGdldFZpZXdXaWR0aCgpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSA+IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIDEpIHsKLSAgICAgICAgICAgIHkgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCkgLSAxOwotICAgICAgICB9CisgICAgICAgIHggPSBNYXRoLm1pbih4LCBnZXRWaWV3V2lkdGgoKSAtIDEpOworICAgICAgICB5ID0gTWF0aC5taW4oeSwgZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gMSk7CiAKICAgICAgICAgZmxvYXQgZkRlbHRhWCA9IG1MYXN0VG91Y2hYIC0geDsKICAgICAgICAgZmxvYXQgZkRlbHRhWSA9IG1MYXN0VG91Y2hZIC0geTsKQEAgLTUwOTEsNiArNDkyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhSRVNVTUVfV0VCQ09SRV9QUklPUklUWSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJpdmF0ZUhhbmRsZXIuaGFzTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKSkgewogICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVMRUFTRV9TSU5HTEVfVEFQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZIDwgbURvdWJsZVRhcFNsb3BTcXVhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET1VCTEVfVEFQX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01MTAyLDEzICs0OTQyLDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgICAgICBtUHJldmlld1pvb21Pbmx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICghaW5GdWxsU2NyZWVuTW9kZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykgPyBoaXRGb2N1c2VkUGx1Z2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUb3VjaEhpZ2hsaWdodERhdGEgZGF0YSA9IG5ldyBUb3VjaEhpZ2hsaWdodERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVggPSBjb250ZW50WDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVkgPSBjb250ZW50WTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubVNsb3AgPSB2aWV3VG9Db250ZW50RGltZW5zaW9uKG1OYXZTbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZURlbGF5ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLkdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFMsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFkgPSAoaW50KSB5ICsgbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoSGlnaGxpZ2h0WCA9IG1Ub3VjaEhpZ2hsaWdodFkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVE9VQ0hfSElHSExJR0hUX0VMQVBTRV9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb2dFdmVudCAmJiBldmVudFRpbWUgLSBtTGFzdFRvdWNoVXBUaW1lIDwgMTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQlJPV1NFUl9ET1VCTEVfVEFQX0RVUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RUb3VjaFVwVGltZSksIGV2ZW50VGltZSk7CkBAIC01MTQ0LDE3ICs1MDA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gZXYuZ2V0TWV0YVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5UT1VDSF9FVkVOVCwgdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBuZWVkcyB0byBzZXQgdGhlbSBmb3IgY29tcHV0ZSBkZWx0YVgvWQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobVByaXZhdGVIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub2J0YWluTWVzc2FnZShQUkVWRU5UX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLCAwKSwgVEFQX1RJTUVPVVQpOwpAQCAtNTE3NSwyNCArNTAzMywyNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9ET1VCTEVfVEFQX01PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuc3VwcG9ydFRvdWNoT25seSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUb3VjaEhpZ2hsaWdodCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSAmJiBtQ29uZmlybU1vdmUgJiYgKGZpcnN0TW92ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRUaW1lIC0gbUxhc3RTZW50VG91Y2hUaW1lID4gbUN1cnJlbnRUb3VjaEludGVydmFsKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IG5ldyBUb3VjaEV2ZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgIHRlZC5tWSA9IGNvbnRlbnRZOwogICAgICAgICAgICAgICAgICAgICB0ZWQubU1ldGFTdGF0ZSA9IGV2LmdldE1ldGFTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFNlbnRUb3VjaFRpbWUgPSBldmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vdmUgJiYgIWluRnVsbFNjcmVlbk1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtUHJpdmF0ZUhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9idGFpbk1lc3NhZ2UoUFJFVkVOVF9ERUZBVUxUX1RJTUVPVVQsCkBAIC01MjIxLDExICs1MDc5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSkgeworICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlICE9IFRPVUNIX0RSQUdfTU9ERSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1Db25maXJtTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtUHJldmVudERlZmF1bHQgPT0gUFJFVkVOVF9ERUZBVUxUX05PX0ZST01fVE9VQ0hfRE9XTikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgbUxhc3RUb3VjaFRpbWUgYXMgd2UgbWF5IG5lZWQgdG8gZG8gZmxpbmcgYXQKQEAgLTUyMzUsOSArNTA5NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGxvY2sgZHJhZ2dpbmcgdG8gb25lIGF4aXMgaWYgd2UgZG9uJ3QgaGF2ZSBhIHNjYWxlIGluIHByb2dyZXNzLgotICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nIGltcGxpZXMgZnJlZS1yb2FtaW5nIG1vdmVtZW50LiBOb3RlIHdlJ2xsIG9ubHkgZXZlciBnZXQgaGVyZQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBtQWxsb3dQYW5BbmRTY2FsZSBpcyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCAmJiAhbVNjYWxlRGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZyBpbXBsaWVzIGZyZWUtcm9hbWluZyBtb3ZlbWVudC4gTm90ZSB0aGlzIGlzIG9ubHkgZXZlciBhIHF1ZXN0aW9uCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSBpcyB0cnVlLgorICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0b3IgIT0gbnVsbCAmJiAhZGV0ZWN0b3IuaXNJblByb2dyZXNzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IHN0YXJ0cyBuZWFybHkgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCwgZW5mb3JjZSBpdAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF4ID0gTWF0aC5hYnMoZGVsdGFYKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBheSA9IE1hdGguYWJzKGRlbHRhWSk7CkBAIC01MjU4LDYgKzUxMTgsOSBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwOwogICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwOwogCisgICAgICAgICAgICAgICAgICAgIGlmIChza2lwU2NhbGVHZXN0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjcm9sbGluZ0xheWVyKGdlc3R1cmVYLCBnZXN0dXJlWSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmFnKCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC01MjY2LDYgKzUxMjksMjAgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBkbyBwYW4KKyAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSAhPSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1Njcm9sbFggPSBwaW5Mb2NYKG1TY3JvbGxYICsgZGVsdGFYKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0RlbHRhWCA9IG5ld1Njcm9sbFggLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSBuZXdEZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZEZWx0YVggPSAoZmxvYXQpIG5ld0RlbHRhWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U2Nyb2xsWSA9IHBpbkxvY1kobVNjcm9sbFkgKyBkZWx0YVkpOworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3RGVsdGFZID0gbmV3U2Nyb2xsWSAtIG1TY3JvbGxZOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZICE9IG5ld0RlbHRhWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgZkRlbHRhWSA9IChmbG9hdCkgbmV3RGVsdGFZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4ga2VlcFNjcm9sbEJhcnNWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGZEZWx0YVgpIDwgMS4wZiAmJiBNYXRoLmFicyhmRGVsdGFZKSA8IDEuMGYpIHsKQEAgLTUzMzIsNyArNTIwOSw5IEBACiAKICAgICAgICAgICAgICAgICBkb0RyYWcoZGVsdGFYLCBkZWx0YVkpOwogCi0gICAgICAgICAgICAgICAgaWYgKGtlZXBTY3JvbGxCYXJzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIC8vIFR1cm4gb2ZmIHNjcm9sbGJhcnMgd2hlbiBkcmFnZ2luZyBhIGxheWVyLgorICAgICAgICAgICAgICAgIGlmIChrZWVwU2Nyb2xsQmFyc1Zpc2libGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSGVsZE1vdGlvbmxlc3MgIT0gTU9USU9OTEVTU19UUlVFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVsZE1vdGlvbmxlc3MgPSBNT1RJT05MRVNTX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC01MzQ3LDYgKzUyMjYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSByZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSkgewogICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKQEAgLTUzNTUsMTAgKzUyMzUsNiBAQAogICAgICAgICAgICAgICAgICAgICB0ZWQubVkgPSBjb250ZW50WTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgdGVkLm1SZXByb2Nlc3MgPSBtRGVmZXJUb3VjaFByb2Nlc3M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaFByb2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1WaWV3WSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVXBUaW1lID0gZXZlbnRUaW1lOwpAQCAtNTM3MywxMyArNTI0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVkLm1NZXRhU3RhdGUgPSBldi5nZXRNZXRhU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVJlcHJvY2VzcyA9IG1EZWZlclRvdWNoUHJvY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlZmVyVG91Y2hQcm9jZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX0VWRU5ULCB0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Eb3VibGVUYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaGFuZGxlRG91YmxlVGFwKG1MYXN0VG91Y2hYLCBtTGFzdFRvdWNoWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX0RPTkVfTU9ERTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTM5NCw5ICs1MjY2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfWUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29tcHV0ZU1heFNjcm9sbFgoKSA+IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcHV0ZU1heFNjcm9sbFkoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVJIHRha2VzIGNvbnRyb2wgYmFjaywgY2FuY2VsIFdlYkNvcmUgdG91Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsV2ViQ29yZVRvdWNoRXZlbnQoY29udGVudFgsIGNvbnRlbnRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcGVyZm9ybWVkIGEgdmVyeSBxdWljayB0b3VjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIG1heSBnZXQgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgV2ViQ29yZSBoYXMgaGFkIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhbnkgY2FsbCB0byBwcmV2ZW50RGVmYXVsdCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSlMgdG91Y2ggaGFuZGxlciB3aWxsIG5vdCBoYXZlIGJlZW4gZXhlY3V0ZWQgeWV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZW5jZSB3ZSB3aWxsIHNlZSBib3RoIHRoZSBVSSAobm93KSBhbmQgV2ViQ29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2hlbiBjb250ZXh0IHN3aXRjaGVzKSBoYW5kbGluZyB0aGUgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgd2ViIGRldmVsb3BlciBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzZXMgcHJldmVudERlZmF1bHQgaW4gdGhlaXIgdG91Y2ggaGFuZGxlci4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbmF0dXJlIG9mIG91ciBhc3luY2hyb25vdXMgdG91Y2ggbW9kZWwuCisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgcmV3cml0ZSBkcmFnIGNvZGUgaGVyZSwgYnV0IHdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgdHJ5IGZsaW5nIGlmIGl0IGFwcGxpZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlZHVjZVByaW9yaXR5KCk7CkBAIC01NDE0LDEzICs1Mjk0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGluZ1RleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhcHBpbmcgb24gc2VsZWN0aW9uIG9yIGNvbnRyb2xzIGRvZXMgbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZUhpdFNlbGVjdGlvbihjb250ZW50WCwgY29udGVudFkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Eb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfSU5JVF9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmlnZ2VyIGRvdWJsZSB0YXAgaWYgdGhlIFdlYlZpZXcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX0lOSVRfTU9ERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhblpvb21JbigpIHx8IGNhblpvb21PdXQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTEVBU0VfU0lOR0xFX1RBUCwgVmlld0NvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb3VibGVUYXBUaW1lb3V0KCkpOwpAQCAtNTQ0OSwxOCArNTMzMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWxkTW90aW9ubGVzcyA9IE1PVElPTkxFU1NfSUdOT1JFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmxpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkcmF3IGluIGhpZ2gtcXVhbGl0eSwgYXMgd2UncmUgZG9uZSBkcmFnZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgVE9VQ0hfRFJBR19TVEFSVF9NT0RFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFRPVUNIX0RSQUdfTEFZRVJfTU9ERToKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPVUNIX0RSQUdfU1RBUlRfTU9ERSBzaG91bGQgbm90IGhhcHBlbiBmb3IgdGhlIHJlYWwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBhcyB3ZSBhbG1vc3QgY2VydGFpbiB3aWxsIGdldCBhIE1PVkUuIEJ1dCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwb3NzaWJsZSBvbiBlbXVsYXRvci4KQEAgLTU0NzQsOCArNTM1Miw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbmNlbFdlYkNvcmVUb3VjaEV2ZW50KGNvbnRlbnRYLCBjb250ZW50WSwgZmFsc2UpOwpAQCAtNTUxOSw2NyArNTM5NSwyNiBAQAogICAgICAgICBpZiAoIW1EcmFnRnJvbVRleHRJbnB1dCkgewogICAgICAgICAgICAgbmF0aXZlSGlkZUN1cnNvcigpOwogICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLnN1cHBvcnRab29tKCkKLSAgICAgICAgICAgICAgICAmJiBzZXR0aW5ncy5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkKLSAgICAgICAgICAgICAgICAmJiAhZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkuaXNWaXNpYmxlKCkKLSAgICAgICAgICAgICAgICAmJiBtTWluWm9vbVNjYWxlIDwgbU1heFpvb21TY2FsZQotICAgICAgICAgICAgICAgICYmIChtSG9yaXpvbnRhbFNjcm9sbEJhck1vZGUgIT0gU0NST0xMQkFSX0FMV0FZU09GRgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSkgewotICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gc2V0dGluZ3MuZ2V0RG91YmxlVGFwVG9hc3RDb3VudCgpOwotICAgICAgICAgICAgaWYgKG1Jblpvb21PdmVydmlldyAmJiBjb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXREb3VibGVUYXBUb2FzdENvdW50KC0tY291bnQpOwotICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Ib3Jpem9udGFsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGCisgICAgICAgICAgICAgICAgfHwgbVZlcnRpY2FsU2Nyb2xsQmFyTW9kZSAhPSBTQ1JPTExCQVJfQUxXQVlTT0ZGKSB7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuaW52b2tlWm9vbVBpY2tlcigpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvRHJhZyhpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKSB7CiAgICAgICAgIGlmICgoZGVsdGFYIHwgZGVsdGFZKSAhPSAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgZmluYWwgaW50IG9sZFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGZpbmFsIGludCByYW5nZVggPSBjb21wdXRlTWF4U2Nyb2xsWCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlWSA9IGNvbXB1dGVNYXhTY3JvbGxZKCk7Ci0gICAgICAgICAgICBvdmVyc2Nyb2xsQnkoZGVsdGFYLCBkZWx0YVksIG9sZFgsIG9sZFksCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlWCwgcmFuZ2VZLAotICAgICAgICAgICAgICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLQotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBsZWZ0L3JpZ2h0IGdsb3dzIGlmIHdlIGZpdCB0aGUgd2hvbGUgY29udGVudC4KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VYID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHVsbGVkVG9YID0gb2xkWCArIGRlbHRhWDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25QdWxsKChmbG9hdCkgZGVsdGFYIC8gZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHVsbGVkVG9YID4gcmFuZ2VYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblB1bGwoKGZsb2F0KSBkZWx0YVggLyBnZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19MQVlFUl9NT0RFKSB7CisgICAgICAgICAgICAgICAgZGVsdGFYID0gdmlld1RvQ29udGVudERpbWVuc2lvbihkZWx0YVgpOworICAgICAgICAgICAgICAgIGRlbHRhWSA9IHZpZXdUb0NvbnRlbnREaW1lbnNpb24oZGVsdGFZKTsKKyAgICAgICAgICAgICAgICBpZiAobmF0aXZlU2Nyb2xsTGF5ZXIobVNjcm9sbGluZ0xheWVyLCBkZWx0YVgsIGRlbHRhWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZVkgPiAwIHx8IGdldE92ZXJzY3JvbGxNb2RlKCkgPT0gT1ZFUlNDUk9MTF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWSA9IG9sZFkgKyBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwdWxsZWRUb1kgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25QdWxsKChmbG9hdCkgZGVsdGFZIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWSA+IHJhbmdlWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzY3JvbGxCeShkZWx0YVgsIGRlbHRhWSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBzaG93UGx1c01pbnVzID0gbU1pblpvb21TY2FsZSA8IG1NYXhab29tU2NhbGU7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9scyAhPSBudWxsICYmIHNob3dQbHVzTWludXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobVpvb21Db250cm9scy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuc2hvdyhzaG93UGx1c01pbnVzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVpvb21NYW5hZ2VyLmtlZXBab29tUGlja2VyVmlzaWJsZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzdG9wVG91Y2goKSB7CkBAIC01NTkzLDE0ICs1NDI4LDYgQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FuY2VsVG91Y2goKSB7CkBAIC01NjE0LDE2ICs1NDQxLDggQEAKICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBSZWxlYXNlIGFueSBwdWxsZWQgZ2xvd3MKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQub25SZWxlYXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX01PREUpIHsKKyAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19NT0RFIHx8CisgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9PSBUT1VDSF9EUkFHX0xBWUVSX01PREUpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgIH0KQEAgLTU2MzEsNiArNTQ1MCw5IEBACiAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKERSQUdfSEVMRF9NT1RJT05MRVNTKTsKICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEFXQUtFTl9TQ1JPTExfQkFSUyk7CisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgcmVtb3ZlVG91Y2hIaWdobGlnaHQodHJ1ZSk7CisgICAgICAgIH0KICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19UUlVFOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICBuYXRpdmVIaWRlQ3Vyc29yKCk7CkBAIC01ODk2LDExICs1NzE4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNrYmFsbFJlbWFpbnNYPSIgKyBtVHJhY2tiYWxsUmVtYWluc1gKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tiYWxsUmVtYWluc1k9IiArIG1UcmFja2JhbGxSZW1haW5zWSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDAgJiYgbmF0aXZlRm9jdXNJc1BsdWdpbigpKSB7CisgICAgICAgICAgICBpZiAobU5hdGl2ZUNsYXNzICE9IDAgJiYgbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsZXRQYWdlSGFuZGxlTmF2S2V5KHNlbGVjdEtleUNvZGUsIHRpbWUsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZXRQbHVnaW5IYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGxldFBhZ2VIYW5kbGVOYXZLZXkoc2VsZWN0S2V5Q29kZSwgdGltZSwgZmFsc2UpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYXZIYW5kbGVkS2V5KHNlbGVjdEtleUNvZGUsIGNvdW50LCBmYWxzZSwgdGltZSkpIHsKICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3Qoa2V5Q29kZVRvU291bmRzRWZmZWN0KHNlbGVjdEtleUNvZGUpKTsKICAgICAgICAgICAgIH0KQEAgLTU5MzEsMTcgKzU3NTMsMzAgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGludCBjb21wdXRlTWF4U2Nyb2xsWCgpIHsKLSAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVSZWFsSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgLSBnZXRWaWV3V2lkdGgoKSwgMCk7CisgICAgICAgIHJldHVybiBNYXRoLm1heChjb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCkgLSBnZXRWaWV3V2lkdGgoKSwgMCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZU1heFNjcm9sbFkoKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChjb21wdXRlUmVhbFZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSArIGdldFRpdGxlSGVpZ2h0KCkKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCkgKyBnZXRUaXRsZUhlaWdodCgpCiAgICAgICAgICAgICAgICAgLSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCksIDApOwogICAgIH0KIAorICAgIGJvb2xlYW4gdXBkYXRlU2Nyb2xsQ29vcmRpbmF0ZXMoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBvbGRYID0gbVNjcm9sbFg7CisgICAgICAgIGludCBvbGRZID0gbVNjcm9sbFk7CisgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICBpZiAob2xkWCAhPSBtU2Nyb2xsWCB8fCBvbGRZICE9IG1TY3JvbGxZKSB7CisgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZmxpbmdTY3JvbGwoaW50IHZ4LCBpbnQgdnkpIHsKICAgICAgICAgbVNjcm9sbGVyLmZsaW5nKG1TY3JvbGxYLCBtU2Nyb2xsWSwgdngsIHZ5LCAwLCBjb21wdXRlTWF4U2Nyb2xsWCgpLCAwLAotICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCksIG1PdmVyZmxpbmdEaXN0YW5jZSwgbU92ZXJmbGluZ0Rpc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBjb21wdXRlTWF4U2Nyb2xsWSgpKTsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIApAQCAtNTk3MSwyMCArNTgwNiwxOSBAQAogICAgICAgICBpZiAoKG1heFggPT0gMCAmJiB2eSA9PSAwKSB8fCAobWF4WSA9PSAwICYmIHZ4ID09IDApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVQcmlvcml0eSgpOwogICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOwotICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgY29tcHV0ZU1heFNjcm9sbFgoKSwKLSAgICAgICAgICAgICAgICAgICAgMCwgY29tcHV0ZU1heFNjcm9sbFkoKSkpIHsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZmxvYXQgY3VycmVudFZlbG9jaXR5ID0gbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkgeworICAgICAgICBmbG9hdCB2ZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOworICAgICAgICBpZiAobUxhc3RWZWxvY2l0eSA+IDAgJiYgY3VycmVudFZlbG9jaXR5ID4gMCAmJiB2ZWxvY2l0eQorICAgICAgICAgICAgICAgID4gbUxhc3RWZWxvY2l0eSAqIE1JTklNVU1fVkVMT0NJVFlfUkFUSU9fRk9SX0FDQ0VMRVJBVElPTikgewogICAgICAgICAgICAgZmxvYXQgZGVsdGFSID0gKGZsb2F0KSAoTWF0aC5hYnMoTWF0aC5hdGFuMihtTGFzdFZlbFksIG1MYXN0VmVsWCkKICAgICAgICAgICAgICAgICAgICAgLSBNYXRoLmF0YW4yKHZ5LCB2eCkpKTsKICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGNpcmNsZSA9IChmbG9hdCkgKE1hdGguUEkpICogMi4wZjsKICAgICAgICAgICAgIGlmIChkZWx0YVIgPiBjaXJjbGUgKiAwLjlmIHx8IGRlbHRhUiA8IGNpcmNsZSAqIDAuMWYpIHsKICAgICAgICAgICAgICAgICB2eCArPSBjdXJyZW50VmVsb2NpdHkgKiBtTGFzdFZlbFggLyBtTGFzdFZlbG9jaXR5OwogICAgICAgICAgICAgICAgIHZ5ICs9IGN1cnJlbnRWZWxvY2l0eSAqIG1MYXN0VmVsWSAvIG1MYXN0VmVsb2NpdHk7CisgICAgICAgICAgICAgICAgdmVsb2NpdHkgPSAoZmxvYXQpIE1hdGguaHlwb3QodngsIHZ5KTsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJkb0ZsaW5nIHZ4PSAiICsgdnggKyAiIHZ5PSIgKyB2eSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTk5OCw2NyArNTgzMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICArICIgbWF4WD0iICsgbWF4WCArICIgbWF4WT0iICsgbWF4WQogICAgICAgICAgICAgICAgICAgICArICIgbVNjcm9sbFg9IiArIG1TY3JvbGxYICsgIiBtU2Nyb2xsWT0iICsgbVNjcm9sbFkpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsb3cgc2xvcHB5IGZsaW5ncyB3aXRob3V0IG92ZXJzY3JvbGxpbmcgYXQgdGhlIGVkZ2VzLgotICAgICAgICBpZiAoKG1TY3JvbGxYID09IDAgfHwgbVNjcm9sbFggPT0gbWF4WCkgJiYgTWF0aC5hYnModngpIDwgTWF0aC5hYnModnkpKSB7Ci0gICAgICAgICAgICB2eCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtU2Nyb2xsWSA9PSAwIHx8IG1TY3JvbGxZID09IG1heFkpICYmIE1hdGguYWJzKHZ5KSA8IE1hdGguYWJzKHZ4KSkgewotICAgICAgICAgICAgdnkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1PdmVyc2Nyb2xsRGlzdGFuY2UgPCBtT3ZlcmZsaW5nRGlzdGFuY2UpIHsKLSAgICAgICAgICAgIGlmIChtU2Nyb2xsWCA9PSAtbU92ZXJzY3JvbGxEaXN0YW5jZSB8fCBtU2Nyb2xsWCA9PSBtYXhYICsgbU92ZXJzY3JvbGxEaXN0YW5jZSkgewotICAgICAgICAgICAgICAgIHZ4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2Nyb2xsWSA9PSAtbU92ZXJzY3JvbGxEaXN0YW5jZSB8fCBtU2Nyb2xsWSA9PSBtYXhZICsgbU92ZXJzY3JvbGxEaXN0YW5jZSkgewotICAgICAgICAgICAgICAgIHZ5ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIG1MYXN0VmVsWCA9IHZ4OwogICAgICAgICBtTGFzdFZlbFkgPSB2eTsKLSAgICAgICAgbUxhc3RWZWxvY2l0eSA9IChmbG9hdCkgTWF0aC5oeXBvdCh2eCwgdnkpOworICAgICAgICBtTGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7CiAKLSAgICAgICAgLy8gbm8gaG9yaXpvbnRhbCBvdmVyc2Nyb2xsIGlmIHRoZSBjb250ZW50IGp1c3QgZml0cwotICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAtdngsIC12eSwgMCwgbWF4WCwgMCwgbWF4WSwKLSAgICAgICAgICAgICAgICBtYXhYID09IDAgPyAwIDogbU92ZXJmbGluZ0Rpc3RhbmNlLCBtT3ZlcmZsaW5nRGlzdGFuY2UpOwotICAgICAgICAvLyBEdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHZlbG9jaXR5LiBXaXRoIHJhbmdlIGJvdW5kYXJpZXMgYW5kIG92ZXJzY3JvbGwKLSAgICAgICAgLy8gd2UgbWF5IG5vdCBrbm93IGhvdyBsb25nIHRoZSBmaW5hbCBhbmltYXRpb24gd2lsbCB0YWtlLiAoSGVuY2UgdGhlIGRlcHJlY2F0aW9uCi0gICAgICAgIC8vIHdhcm5pbmcgb24gdGhlIGNhbGwgYmVsb3cuKSBJdCdzIG5vdCBhIGJpZyBkZWFsIGZvciBzY3JvbGwgYmFycyBidXQgaWYgd2ViY29yZQotICAgICAgICAvLyByZXN1bWVzIGR1cmluZyB0aGlzIGVmZmVjdCB3ZSB3aWxsIHRha2UgYSBwZXJmb3JtYW5jZSBoaXQuIFNlZSBjb21wdXRlU2Nyb2xsOwotICAgICAgICAvLyB3ZSByZXN1bWUgd2ViY29yZSB0aGVyZSB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuCisgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIC12eCwgLXZ5LCAwLCBtYXhYLCAwLCBtYXhZKTsKICAgICAgICAgZmluYWwgaW50IHRpbWUgPSBtU2Nyb2xsZXIuZ2V0RHVyYXRpb24oKTsKKyAgICAgICAgbVByaXZhdGVIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKFJFU1VNRV9XRUJDT1JFX1BSSU9SSVRZLCB0aW1lKTsKICAgICAgICAgYXdha2VuU2Nyb2xsQmFycyh0aW1lKTsKICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB6b29tV2l0aFByZXZpZXcoZmxvYXQgc2NhbGUsIGJvb2xlYW4gdXBkYXRlVGV4dFdyYXBTY2FsZSkgewotICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKLSAgICAgICAgbUluaXRpYWxTY3JvbGxYID0gbVNjcm9sbFg7Ci0gICAgICAgIG1Jbml0aWFsU2Nyb2xsWSA9IG1TY3JvbGxZOwotCi0gICAgICAgIC8vIHNuYXAgdG8gREVGQVVMVF9TQ0FMRSBpZiBpdCBpcyBjbG9zZQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtRGVmYXVsdFNjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICBzY2FsZSA9IG1EZWZhdWx0U2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXROZXdab29tU2NhbGUoc2NhbGUsIHVwZGF0ZVRleHRXcmFwU2NhbGUsIGZhbHNlKTsKLQotICAgICAgICBpZiAob2xkU2NhbGUgIT0gbUFjdHVhbFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyB1c2UgbVpvb21QaWNrZXJTY2FsZSB0byBzZWUgem9vbSBwcmV2aWV3IGZpcnN0Ci0gICAgICAgICAgICBtWm9vbVN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtSW52SW5pdGlhbFpvb21TY2FsZSA9IDEuMGYgLyBvbGRTY2FsZTsKLSAgICAgICAgICAgIG1JbnZGaW5hbFpvb21TY2FsZSA9IDEuMGYgLyBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICBtWm9vbVNjYWxlID0gbUFjdHVhbFNjYWxlOwotICAgICAgICAgICAgV2ViVmlld0NvcmUucGF1c2VVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSB2aWV3IGNvbnRhaW5pbmcgem9vbSBjb250cm9scyBpLmUuICsvLSBidXR0b25zLiBUaGUgY2FsbGVyIGlzCiAgICAgICogaW4gY2hhcmdlIG9mIGluc3RhbGxpbmcgdGhpcyB2aWV3IHRvIHRoZSB2aWV3IGhpZXJhcmNoeS4gVGhpcyB2aWV3IHdpbGwKQEAgLTYwNzgsODEgKzU4NjIsMjkgQEAKICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlRoaXMgV2ViVmlldyBkb2Vzbid0IHN1cHBvcnQgem9vbS4iKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtWm9vbUNvbnRyb2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbHMgPSBjcmVhdGVab29tQ29udHJvbHMoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc2V0IHRvIFZJU0lCTEUgZmlyc3Qgc28gdGhhdCBnZXRNZWFzdXJlZEhlaWdodCgpIGluCi0gICAgICAgICAgICAgKiB7QGxpbmsgI29uU2l6ZUNoYW5nZWQoKX0gY2FuIHJldHVybiB0aGUgbWVhc3VyZWQgdmFsdWUgZm9yIHByb3BlcgotICAgICAgICAgICAgICogbGF5b3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtWm9vbUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1ab29tQ29udHJvbFJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNtaXNzIHRoZSBjb250cm9scyBpZiB0aGUgdXNlciBoYXMKLSAgICAgICAgICAgICAgICAgICAgICogZm9jdXMgb24gdGhlbS4gV2FpdCBhbmQgY2hlY2sgYWdhaW4gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ab29tQ29udHJvbHMuaGFzRm9jdXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21Db250cm9scy5oaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ab29tQ29udHJvbHM7CisgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuZ2V0RXh0ZXJuYWxab29tUGlja2VyKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBFeHRlbmRlZFpvb21Db250cm9scyBjcmVhdGVab29tQ29udHJvbHMoKSB7Ci0gICAgICAgIEV4dGVuZGVkWm9vbUNvbnRyb2xzIHpvb21Db250cm9scyA9IG5ldyBFeHRlbmRlZFpvb21Db250cm9scyhtQ29udGV4dAotICAgICAgICAgICAgLCBudWxsKTsKLSAgICAgICAgem9vbUNvbnRyb2xzLnNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbUluKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7Ci0gICAgICAgICAgICAgICAgem9vbU91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHpvb21Db250cm9sczsKKyAgICB2b2lkIGRpc21pc3Nab29tQ29udHJvbCgpIHsKKyAgICAgICAgbVpvb21NYW5hZ2VyLmRpc21pc3Nab29tUGlja2VyKCk7CisgICAgfQorCisgICAgZmxvYXQgZ2V0RGVmYXVsdFpvb21TY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5nZXREZWZhdWx0U2NhbGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgWm9vbUJ1dHRvbnNDb250cm9sbGVyfSB3aGljaCBjYW4gYmUgdXNlZCB0byBhZGQKLSAgICAgKiBhZGRpdGlvbmFsIGJ1dHRvbnMgdG8gdGhlIHpvb20gY29udHJvbHMgd2luZG93LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFpvb21CdXR0b25zQ29udHJvbGxlcn0gdXNlZCBieSB0aGlzIGNsYXNzLAotICAgICAqICAgICAgICAgb3IgbnVsbCBpZiBpdCBpcyB1bmF2YWlsYWJsZS4KLSAgICAgKiBAaGlkZQorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIGluLgogICAgICAqLwotICAgIHB1YmxpYyBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Wm9vbUJ1dHRvbnNDb250cm9sbGVyKCkgewotICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyID0gbmV3IFpvb21CdXR0b25zQ29udHJvbGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobVpvb21MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBab29tQnV0dG9uc0NvbnRyb2xsZXIgcG9zaXRpb25zIHRoZSBidXR0b25zIGF0IHRoZSBib3R0b20sIGJ1dCBpbgotICAgICAgICAgICAgLy8gdGhlIG1pZGRsZS4gQ2hhbmdlIHRoZWlyIGxheW91dCBwYXJhbWV0ZXJzIHNvIHRoZXkgYXBwZWFyIG9uIHRoZQotICAgICAgICAgICAgLy8gcmlnaHQuCi0gICAgICAgICAgICBWaWV3IGNvbnRyb2xzID0gbVpvb21CdXR0b25zQ29udHJvbGxlci5nZXRab29tQ29udHJvbHMoKTsKLSAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gY29udHJvbHMuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGZyYW1lUGFyYW1zID0gKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zOwotICAgICAgICAgICAgICAgIGZyYW1lUGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LlJJR0hUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworICAgIHB1YmxpYyBib29sZWFuIGNhblpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIFdlYlZpZXcgY2FuIGJlIHpvb21lZCBvdXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MTYwLDE1ICs1ODkyLDcgQEAKICAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBpbiBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKLSAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmVseSB3ZSBjYW4gZGlzYWxsb3cgdGhpcyBkdXJpbmcgZHJhdyBoaXN0b3J5IG1vZGUKLSAgICAgICAgc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKLSAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDEuMjVmLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci56b29tSW4oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNzYsMTQgKzU5MDAsNyBAQAogICAgICAqIEByZXR1cm4gVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcy4gRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7Ci0gICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCi0gICAgICAgIHN3aXRjaE91dERyYXdIaXN0b3J5KCk7Ci0gICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KLSAgICAgICAgbVpvb21DZW50ZXJYID0gZ2V0Vmlld1dpZHRoKCkgKiAuNWY7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IGdldFZpZXdIZWlnaHQoKSAqIC41ZjsKLSAgICAgICAgbUFuY2hvclggPSB2aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtU2Nyb2xsWCk7Ci0gICAgICAgIG1BbmNob3JZID0gdmlld1RvQ29udGVudFkoKGludCkgbVpvb21DZW50ZXJZICsgbVNjcm9sbFkpOwotICAgICAgICByZXR1cm4gem9vbVdpdGhQcmV2aWV3KG1BY3R1YWxTY2FsZSAqIDAuOGYsIHRydWUpOworICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21PdXQoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewpAQCAtNjI4NCw3ICs2MDAxLDE0IEBACiAgICAgICAgIC8vIG1MYXN0VG91Y2hYIGFuZCBtTGFzdFRvdWNoWSBhcmUgdGhlIHBvaW50IGluIHRoZSBjdXJyZW50IHZpZXdwb3J0CiAgICAgICAgIGludCBjb250ZW50WCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1MYXN0VG91Y2hYICsgbVNjcm9sbFgpOwogICAgICAgICBpbnQgY29udGVudFkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtTGFzdFRvdWNoWSArIG1TY3JvbGxZKTsKLSAgICAgICAgaWYgKG5hdGl2ZVBvaW50SW5OYXZDYWNoZShjb250ZW50WCwgY29udGVudFksIG1OYXZTbG9wKSkgeworICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgIFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhIHRvdWNoVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlLlRvdWNoVXBEYXRhKCk7CisgICAgICAgICAgICAvLyB1c2UgIjAiIGFzIGdlbmVyYXRpb24gaWQgdG8gaW5mb3JtIFdlYktpdCB0byB1c2UgdGhlIHNhbWUgeC95IGFzCisgICAgICAgICAgICAvLyBpdCB1c2VkIHdoZW4gcHJvY2Vzc2luZyBHRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTCisgICAgICAgICAgICB0b3VjaFVwRGF0YS5tTW92ZUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlRPVUNIX1VQLCB0b3VjaFVwRGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlUG9pbnRJbk5hdkNhY2hlKGNvbnRlbnRYLCBjb250ZW50WSwgbU5hdlNsb3ApKSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5Nb3Rpb25VcERhdGEgbW90aW9uVXBEYXRhID0gbmV3IFdlYlZpZXdDb3JlCiAgICAgICAgICAgICAgICAgICAgIC5Nb3Rpb25VcERhdGEoKTsKICAgICAgICAgICAgIG1vdGlvblVwRGF0YS5tRnJhbWUgPSBuYXRpdmVDYWNoZUhpdEZyYW1lUG9pbnRlcigpOwpAQCAtNjMxMiwyNyArNjAzNiwxNiBAQAogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB2aWV3IChQbHVnaW4pIGlzIGZ1bGx5IHZpc2libGUgYW5kIG1heGltaXplZCBpbnNpZGUKICAgICAgKiB0aGUgV2ViVmlldy4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbHVnaW5GaXRPblNjcmVlbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgdmlldykgewotICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwotICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gdmlldy53aWR0aCwKLSAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7Ci0gICAgICAgIGlmIChzY2FsZSA8IG1NaW5ab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1pblpvb21TY2FsZTsKLSAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IG1NYXhab29tU2NhbGUpIHsKLSAgICAgICAgICAgIHNjYWxlID0gbU1heFpvb21TY2FsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTWF0aC5hYnMoc2NhbGUgLSBtQWN0dWFsU2NhbGUpIDwgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRUb1ZpZXdYKHZpZXcueCArIHZpZXcud2lkdGgpIDw9IG1TY3JvbGxYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2aWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55KSA+PSBtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkgKyB2aWV3LmhlaWdodCkgPD0gbVNjcm9sbFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgYm9vbGVhbiBpc1BsdWdpbkZpdE9uU2NyZWVuKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyB2aWV3KSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKKyAgICAgICAgZmluYWwgaW50IHZpZXdIZWlnaHQgPSBnZXRWaWV3SGVpZ2h0V2l0aFRpdGxlKCk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4oKGZsb2F0KSB2aWV3V2lkdGggLyB2aWV3LndpZHRoLCAoZmxvYXQpIHZpZXdIZWlnaHQgLyB2aWV3LmhlaWdodCk7CisgICAgICAgIHNjYWxlID0gbVpvb21NYW5hZ2VyLmNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworICAgICAgICByZXR1cm4gIW1ab29tTWFuYWdlci53aWxsU2NhbGVUcmlnZ2VyWm9vbShzY2FsZSkKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WCh2aWV3LngpID49IG1TY3JvbGxYCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1godmlldy54ICsgdmlldy53aWR0aCkgPD0gbVNjcm9sbFggKyB2aWV3V2lkdGgKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VG9WaWV3WSh2aWV3LnkpID49IG1TY3JvbGxZCisgICAgICAgICAgICAgICAgJiYgY29udGVudFRvVmlld1kodmlldy55ICsgdmlldy5oZWlnaHQpIDw9IG1TY3JvbGxZICsgdmlld0hlaWdodDsKICAgICB9CiAKICAgICAvKgpAQCAtNjM0MSwyMiArNjA1NCwxOSBAQAogICAgICAqIGFuaW1hdGVkIHNjcm9sbCB0byBjZW50ZXIgaXQuIElmIHRoZSB6b29tIG5lZWRzIHRvIGJlIGNoYW5nZWQsIGZpbmQgdGhlCiAgICAgICogem9vbSBjZW50ZXIgYW5kIGRvIGEgc21vb3RoIHpvb20gdHJhbnNpdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgeworICAgIHZvaWQgY2VudGVyRml0UmVjdChpbnQgZG9jWCwgaW50IGRvY1ksIGludCBkb2NXaWR0aCwgaW50IGRvY0hlaWdodCkgewogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CiAgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpOwogICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKChmbG9hdCkgdmlld1dpZHRoIC8gZG9jV2lkdGgsIChmbG9hdCkgdmlld0hlaWdodAogICAgICAgICAgICAgICAgIC8gZG9jSGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjYWxlIDwgbU1pblpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWluWm9vbVNjYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gbU1heFpvb21TY2FsZSkgewotICAgICAgICAgICAgc2NhbGUgPSBtTWF4Wm9vbVNjYWxlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNYXRoLmFicyhzY2FsZSAtIG1BY3R1YWxTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCkgeworICAgICAgICBzY2FsZSA9IG1ab29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKHNjYWxlKTsKKyAgICAgICAgaWYgKCFtWm9vbU1hbmFnZXIud2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CiAgICAgICAgICAgICBwaW5TY3JvbGxUbyhjb250ZW50VG9WaWV3WChkb2NYICsgZG9jV2lkdGggLyAyKSAtIHZpZXdXaWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUb1ZpZXdZKGRvY1kgKyBkb2NIZWlnaHQgLyAyKSAtIHZpZXdIZWlnaHQgLyAyLAogICAgICAgICAgICAgICAgICAgICB0cnVlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblggPSBkb2NYICogbUFjdHVhbFNjYWxlIC0gbVNjcm9sbFg7CisgICAgICAgICAgICBmbG9hdCBhY3R1YWxTY2FsZSA9IG1ab29tTWFuYWdlci5nZXRTY2FsZSgpOworICAgICAgICAgICAgZmxvYXQgb2xkU2NyZWVuWCA9IGRvY1ggKiBhY3R1YWxTY2FsZSAtIG1TY3JvbGxYOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdYID0gZG9jWCAqIHNjYWxlOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdXaWR0aCA9IGRvY1dpZHRoICogc2NhbGU7CiAgICAgICAgICAgICBmbG9hdCBuZXdNYXhXaWR0aCA9IG1Db250ZW50V2lkdGggKiBzY2FsZTsKQEAgLTYzNjcsOSArNjA3Nyw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblggPiAobmV3TWF4V2lkdGggLSByZWN0Vmlld1ggLSByZWN0Vmlld1dpZHRoKSkgewogICAgICAgICAgICAgICAgIG5ld1NjcmVlblggPSB2aWV3V2lkdGggLSAobmV3TWF4V2lkdGggLSByZWN0Vmlld1gpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVpvb21DZW50ZXJYID0gKG9sZFNjcmVlblggKiBzY2FsZSAtIG5ld1NjcmVlblggKiBtQWN0dWFsU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKHNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogbUFjdHVhbFNjYWxlICsgZ2V0VGl0bGVIZWlnaHQoKQorICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclggPSAob2xkU2NyZWVuWCAqIHNjYWxlIC0gbmV3U2NyZWVuWCAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIGZsb2F0IG9sZFNjcmVlblkgPSBkb2NZICogYWN0dWFsU2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICBmbG9hdCByZWN0Vmlld1kgPSBkb2NZICogc2NhbGUgKyBnZXRUaXRsZUhlaWdodCgpOwogICAgICAgICAgICAgZmxvYXQgcmVjdFZpZXdIZWlnaHQgPSBkb2NIZWlnaHQgKiBzY2FsZTsKQEAgLTYzODEsMTA5ICs2MDkxLDEwIEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjcmVlblkgPiAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZIC0gcmVjdFZpZXdIZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgbmV3U2NyZWVuWSA9IHZpZXdIZWlnaHQgLSAobmV3TWF4SGVpZ2h0IC0gcmVjdFZpZXdZKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ab29tQ2VudGVyWSA9IChvbGRTY3JlZW5ZICogc2NhbGUgLSBuZXdTY3JlZW5ZICogbUFjdHVhbFNjYWxlKQotICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICB6b29tV2l0aFByZXZpZXcoc2NhbGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGlzbWlzc1pvb21Db250cm9sKCkgewotICAgICAgICBpZiAobVdlYlZpZXdDb3JlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1heWJlIGNhbGxlZCBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpLiBBcyB3ZSBjYW4ndCBnZXQgc2V0dGluZ3MsCi0gICAgICAgICAgICAvLyBqdXN0IGhpZGUgem9vbSBjb250cm9sIGZvciBib3RoIHN0eWxlcy4KLSAgICAgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgewotICAgICAgICAgICAgaWYgKG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ab29tQ29udHJvbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUnVsZSBmb3IgZG91YmxlIHRhcDoKLSAgICAvLyAxLiBpZiB0aGUgY3VycmVudCBzY2FsZSBpcyBub3Qgc2FtZSBhcyB0aGUgdGV4dCB3cmFwIHNjYWxlIGFuZCBsYXlvdXQKLSAgICAvLyAgICBhbGdvcml0aG0gaXMgTkFSUk9XX0NPTFVNTlMsIGZpdCB0byBjb2x1bW47Ci0gICAgLy8gMi4gaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgbm90IG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBvdmVydmlldyBtb2RlOwotICAgIC8vIDMuIGlmIHRoZSBjdXJyZW50IHN0YXRlIGlzIG92ZXJ2aWV3IG1vZGUsIGNoYW5nZSB0byBkZWZhdWx0IHNjYWxlLgotICAgIHByaXZhdGUgdm9pZCBkb0RvdWJsZVRhcCgpIHsKLSAgICAgICAgaWYgKG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVpvb21DZW50ZXJYID0gbUxhc3RUb3VjaFg7Ci0gICAgICAgIG1ab29tQ2VudGVyWSA9IG1MYXN0VG91Y2hZOwotICAgICAgICBtQW5jaG9yWCA9IHZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1TY3JvbGxYKTsKLSAgICAgICAgbUFuY2hvclkgPSB2aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtU2Nyb2xsWSk7Ci0gICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0RG91YmxlVGFwVG9hc3RDb3VudCgwKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSB6b29tIGNvbnRyb2wgYWZ0ZXIgZG91YmxlIHRhcAotICAgICAgICBkaXNtaXNzWm9vbUNvbnRyb2woKTsKLSAgICAgICAgVmlld01hbmFnZXIuQ2hpbGRWaWV3IHBsdWdpbiA9IG1WaWV3TWFuYWdlci5oaXRUZXN0KG1BbmNob3JYLCBtQW5jaG9yWSk7Ci0gICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzUGx1Z2luRml0T25TY3JlZW4ocGx1Z2luKSkgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHRpdGxlYmFyIGZ1bGx5IHJldmVhbCBpbiBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZIDwgZ2V0VGl0bGVIZWlnaHQoKSkgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgIHpvb21XaXRoUHJldmlldygoZmxvYXQpIGdldFZpZXdXaWR0aCgpIC8gbVpvb21PdmVydmlld1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3QocGx1Z2luLngsIHBsdWdpbi55LCBwbHVnaW4ud2lkdGgsIHBsdWdpbi5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gem9vbVRvRGVmYXVsdCA9IGZhbHNlOwotICAgICAgICBpZiAoKHNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09IFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUykKLSAgICAgICAgICAgICAgICAmJiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbVRleHRXcmFwU2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSkgewotICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmbG9hdCBvdmVydmlld1NjYWxlID0gKGZsb2F0KSBnZXRWaWV3V2lkdGgoKSAvIG1ab29tT3ZlcnZpZXdXaWR0aDsKLSAgICAgICAgICAgIGlmIChNYXRoLmFicyhtQWN0dWFsU2NhbGUgLSBvdmVydmlld1NjYWxlKSA8IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICBmbG9hdCBuZXdTY2FsZSA9IChmbG9hdCkgZ2V0Vmlld1dpZHRoKCkgLyBtWm9vbU92ZXJ2aWV3V2lkdGg7Ci0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbmV3U2NhbGUpID49IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdGl0bGViYXIgZnVsbHkgcmV2ZWFsIGluIG92ZXJ2aWV3IG1vZGUKLSAgICAgICAgICAgICAgICBpZiAobVNjcm9sbFkgPCBnZXRUaXRsZUhlaWdodCgpKSBtU2Nyb2xsWSA9IDA7Ci0gICAgICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG5ld1NjYWxlLCB0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMobUFjdHVhbFNjYWxlIC0gbURlZmF1bHRTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQpIHsKLSAgICAgICAgICAgICAgICB6b29tVG9EZWZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHpvb21Ub0RlZmF1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6b29tVG9EZWZhdWx0KSB7Ci0gICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBsZWZ0ID0gbmF0aXZlR2V0QmxvY2tMZWZ0RWRnZShtQW5jaG9yWCwgbUFuY2hvclksIG1BY3R1YWxTY2FsZSk7Ci0gICAgICAgICAgICBpZiAobGVmdCAhPSBOT19MRUZURURHRSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCBhIDVwdCBwYWRkaW5nIHRvIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSB6b29tIGNlbnRlciBzbyB0aGF0IHRoZSBuZXcgc2Nyb2xsIHggd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGVkZ2UuCi0gICAgICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSB2aWV3TGVmdCAqIG1EZWZhdWx0U2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChtRGVmYXVsdFNjYWxlIC0gbUFjdHVhbFNjYWxlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSh2aWV3TGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgem9vbVdpdGhQcmV2aWV3KG1EZWZhdWx0U2NhbGUsIHRydWUpOworICAgICAgICAgICAgZmxvYXQgem9vbUNlbnRlclkgPSAob2xkU2NyZWVuWSAqIHNjYWxlIC0gbmV3U2NyZWVuWSAqIGFjdHVhbFNjYWxlKQorICAgICAgICAgICAgICAgICAgICAvIChzY2FsZSAtIGFjdHVhbFNjYWxlKTsKKyAgICAgICAgICAgIG1ab29tTWFuYWdlci5zZXRab29tQ2VudGVyKHpvb21DZW50ZXJYLCB6b29tQ2VudGVyWSk7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIuc3RhcnRab29tQW5pbWF0aW9uKHNjYWxlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY0OTUsNiArNjEwNiw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Rm9jdXMoaW50IGRpcmVjdGlvbiwgUmVjdCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpIHsKKyAgICAgICAgLy8gRklYTUU6IElmIGEgc3Vid2luZG93IGlzIHNob3dpbmcgZmluZCwgYW5kIHRoZSB1c2VyIHRvdWNoZXMgdGhlCisgICAgICAgIC8vIGJhY2tncm91bmQgd2luZG93LCBpdCBjYW4gc3RlYWwgZm9jdXMuCisgICAgICAgIGlmIChtRmluZElzVXApIHJldHVybiBmYWxzZTsKICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgaWYgKGluRWRpdGluZ01vZGUoKSkgewogICAgICAgICAgICAgcmVzdWx0ID0gbVdlYlRleHRWaWV3LnJlcXVlc3RGb2N1cyhkaXJlY3Rpb24sCkBAIC02NTgyLDYgKzYxOTYsMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0Q2hpbGRSZWN0YW5nbGVPblNjcmVlbihWaWV3IGNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltbWVkaWF0ZSkgeworICAgICAgICAvLyBkb24ndCBzY3JvbGwgd2hpbGUgaW4gem9vbSBhbmltYXRpb24uIFdoZW4gaXQgaXMgZG9uZSwgd2Ugd2lsbCBhZGp1c3QKKyAgICAgICAgLy8gdGhlIG5lY2Vzc2FyeSBjb21wb25lbnRzIChlLmcuLCBXZWJUZXh0VmlldyBpZiBpdCBpcyBpbiBlZGl0aW5nIG1vZGUpCisgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNGaXhlZExlbmd0aEFuaW1hdGlvbkluUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmVjdC5vZmZzZXQoY2hpbGQuZ2V0TGVmdCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWCgpLAogICAgICAgICAgICAgICAgIGNoaWxkLmdldFRvcCgpIC0gY2hpbGQuZ2V0U2Nyb2xsWSgpKTsKIApAQCAtNjcyNCw3ICs2MzQ0LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBTV0lUQ0hfVE9fU0hPUlRQUkVTUzogewogICAgICAgICAgICAgICAgICAgICBpZiAobVRvdWNoTW9kZSA9PSBUT1VDSF9JTklUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX1lFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9TSE9SVFBSRVNTX1NUQVJUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjczOCw2ICs2MzU5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgU1dJVENIX1RPX0xPTkdQUkVTUzogeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5zdXBwb3J0VG91Y2hPbmx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRvdWNoSGlnaGxpZ2h0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaW5GdWxsU2NyZWVuTW9kZSgpIHx8IG1EZWZlclRvdWNoUHJvY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hFdmVudERhdGEgdGVkID0gbmV3IFRvdWNoRXZlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubUFjdGlvbiA9IFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M7CkBAIC02NzQ5LDE1ICs2MzczLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGljaXR5IGZvciBub3csIHdlIGRvbid0IHNldCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tTWV0YVN0YXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tUmVwcm9jZXNzID0gbURlZmVyVG91Y2hQcm9jZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWZlclRvdWNoUHJvY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZC5tVmlld1ggPSBtTGFzdFRvdWNoWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWQubVZpZXdZID0gbUxhc3RUb3VjaFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuVE9VQ0hfRVZFTlQsIHRlZCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXZlbnREZWZhdWx0ICE9IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9ET05FX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtTG9uZ0NsaWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC02NzkwLDcwICs2NDA5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIHNwYXduQ29udGVudFNjcm9sbFRvKG1zZy5hcmcxLCBtc2cuYXJnMik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX1pPT01fUkFOR0U6IHsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IChXZWJWaWV3Q29yZS5WaWV3U3RhdGUpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1TY3JvbGxYIGNvbnRhaW5zIHRoZSBuZXcgbWluUHJlZldpZHRoCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIGdldFZpZXdXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtWm9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKHZpZXdTdGF0ZSwgZ2V0Vmlld1dpZHRoKCksIHZpZXdTdGF0ZS5tU2Nyb2xsWCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIFJFUExBQ0VfQkFTRV9DT05URU5UOiB7CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChtc2cuYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIE5FV19QSUNUVVJFX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBwcmV2aW91c2x5IGRlbGF5ZWQgZGVsZXRpbmcgYSByb290Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxheWVyLCBkbyBpdCBub3cuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVsYXllZERlbGV0ZVJvb3RMYXllcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcigwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3Q29yZS5nZXRTZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZm9yIG5ldyBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBnZXRWaWV3V2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3ID0gKFdlYlZpZXdDb3JlLkRyYXdEYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVTZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3Lm1WaWV3UG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlV2lkZVZpZXdwb3J0ID0gc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBkcmF3Lm1SZXN0b3JlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZXN0b3JlU3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVpvb21SYW5nZShyZXN0b3JlU3RhdGUsIHZpZXdTaXplLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcubU1pblByZWZXaWR0aCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsU2NhbGVJblBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZShtSW5pdGlhbFNjYWxlSW5QZXJjZW50IC8gMTAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxTY2FsZUluUGVyY2VudCAhPSBtVGV4dFdyYXBTY2FsZSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXcgPSB1c2VXaWRlVmlld3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUluWm9vbU92ZXJ2aWV3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSByZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmV3Wm9vbVNjYWxlKHNjYWxlLCBNYXRoLmFicyhzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPj0gTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyhyZXN0b3JlU3RhdGUubVNjcm9sbFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ3MoKS5nZXRCdWlsdEluWm9vbUNvbnRyb2xzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlWm9vbUJ1dHRvbnNFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKQEAgLTY4NjEsNDUgKzY0NDYsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7CiAgICAgICAgICAgICAgICAgICAgIHJlY29yZE5ld0NvbnRlbnRTaXplKGRyYXcubVdpZHRoSGVpZ2h0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG1GaW5kSXNVcCA/IG1GaW5kSGVpZ2h0IDogMCksIHVwZGF0ZUxheW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5tV2lkdGhIZWlnaHQueSwgdXBkYXRlTGF5b3V0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOworCiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVdpZGVWaWV3cG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgbVpvb21PdmVydmlld1dpZHRoIHVwcGVyIGJvdW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzTWF4Vmlld3BvcnRXaWR0aCBzbyB0aGF0IGlmIHRoZSBwYWdlIGRvZXNuJ3QgYmVoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLCB0aGUgV2ViVmlldyB3b24ndCBnbyBpbnNhbmUuIGxpbWl0IHRoZSBsb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmQgdG8gbWF0Y2ggdGhlIGRlZmF1bHQgc2NhbGUgZm9yIG1vYmlsZSBzaXRlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tT3ZlcnZpZXdXaWR0aCA9IE1hdGgubWluKHNNYXhWaWV3cG9ydFdpZHRoLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoKGludCkgKHZpZXdXaWR0aCAvIG1EZWZhdWx0U2NhbGUpLCBNYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heChkcmF3Lm1NaW5QcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3UG9pbnQueCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChmbG9hdCkgdmlld1dpZHRoIC8gbVpvb21PdmVydmlld1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5ICYmIG1Jblpvb21PdmVydmlldykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kaW5nIGVycm9yIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5ld1pvb21TY2FsZSgoZmxvYXQpIHZpZXdXaWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBtWm9vbU92ZXJ2aWV3V2lkdGgsIE1hdGguYWJzKG1BY3R1YWxTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtVGV4dFdyYXBTY2FsZSkgPCBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHBpY3R1cmUKKyAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uTmV3UGljdHVyZShkcmF3KTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5tRm9jdXNTaXplQ2hhbmdlZCAmJiBpbkVkaXRpbmdNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb2N1c1NpemVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVzdG9yZVN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02OTMzLDE0ICs2NDk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0tFWUJPQVJEX1dJVEhfU0VMRUNUSU9OX01TR19JRDoKICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNvZnRLZXlib2FyZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX1NFTEVDVElPTl9NU0dfSUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIHRleHRmaWVsZCB3YXMgaW4gZm9jdXMsIGFuZCB0aGUgdXNlciB0b3VjaGVkIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyBpdCB0byBzZW5kIHRoaXMgbWVzc2FnZSwgdGhlbiBXZWJUZXh0VmlldyBoYXMgbm90Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gc2V0IHVwIHlldC4gIFJlYnVpbGQgaXQgc28gaXQgY2FuIHNldCBpdHMgc2VsZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICByZWJ1aWxkV2ViVGV4dFZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV4dFNlbGVjdGlvbkZyb21NZXNzYWdlKG1zZy5hcmcxLCBtc2cuYXJnMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViVmlld0NvcmUuVGV4dFNlbGVjdGlvbkRhdGEpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY5NTgsNyArNjUxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNT1ZFX09VVF9PRl9QTFVHSU46CisgICAgICAgICAgICAgICAgY2FzZSBVTkhBTkRMRURfTkFWX0tFWToKICAgICAgICAgICAgICAgICAgICAgbmF2SGFuZGxlZEtleShtc2cuYXJnMSwgMSwgZmFsc2UsIDApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9URVhUX0VOVFJZX01TR19JRDoKQEAgLTY5NzAsNyArNjUyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDTEVBUl9URVhUX0VOVFJZOgotICAgICAgICAgICAgICAgICAgICBjbGVhclRleHRFbnRyeShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxfUkVDVF9NU0dfSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKQEAgLTY5ODMsMjMgKzY1NDIsNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIElNTUVESUFURV9SRVBBSU5UX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9ST09UX0xBWUVSX01TR19JRDogewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBtc2cuYXJnMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgZGVsZXRpbmcgdGhlIG9sZCBsYXllciwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBkbyBzbyB1bnRpbCB3ZSd2ZSBnb3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcGFnZSB0byBkaXNwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5ZWREZWxldGVSb290TGF5ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFJvb3RMYXllcihtc2cuYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GT1JNX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZUFkYXB0ZXIgYWRhcHRlciA9IChBdXRvQ29tcGxldGVBZGFwdGVyKSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlRleHRWaWV3LmlzU2FtZVRleHRGaWVsZChtc2cuYXJnMSkpIHsKQEAgLTcwNDMsNDMgKzY1ODUsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBtc2cuYXJnMiA9PSAxID8gUFJFVkVOVF9ERUZBVUxUX1lFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVByZXZlbnREZWZhdWx0ID09IFBSRVZFTlRfREVGQVVMVF9ZRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hIaWdobGlnaHRSZWdpb24uc2V0RW1wdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cuYXJnMiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgaXMgbm90IGNhbGxlZCBpbiBXZWJDb3JlLCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgcmVwcm9jZXNzZWQgaW4gVUkKICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoRXZlbnREYXRhIHRlZCA9IChUb3VjaEV2ZW50RGF0YSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGVkLm1BY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFggPSBjb250ZW50VG9WaWV3WCh0ZWQubVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWSA9IGNvbnRlbnRUb1ZpZXdZKHRlZC5tWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TY3JvbGxZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc25hcHBpbmcgaW4gZGVmZXIgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGNvbnRlbnRUb1ZpZXdYKHRlZC5tWCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaE1vZGUgIT0gVE9VQ0hfRFJBR19NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaE1vZGUgPSBUT1VDSF9EUkFHX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RGVmZXJUb3VjaFkgPSB0ZWQubVZpZXdZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdERlZmVyVG91Y2hZID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVggPSBwaW5Mb2NYKChpbnQpIChtU2Nyb2xsWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHRlZC5tVmlld1gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWCAtIHgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBwaW5Mb2NZKChpbnQpIChtU2Nyb2xsWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHRlZC5tVmlld1kpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUxhc3REZWZlclRvdWNoWSAtIHkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNjcm9sbFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRHJhZyhkZWx0YVgsIGRlbHRhWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHRlZC5tVmlld1g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHRlZC5tVmlld1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVggIT0gMCkgbUxhc3REZWZlclRvdWNoWCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YVkgIT0gMCkgbUxhc3REZWZlclRvdWNoWSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVmZXJUb3VjaE1vZGUgPT0gVE9VQ0hfRFJBR19NT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBmbGluZyBpbiBkZWZlciBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxYKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhTY3JvbGxZKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVVwZGF0ZVBpY3R1cmUobVdlYlZpZXdDb3JlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzA4Nyw5ICs2NjMyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXZWJWaWV3Q29yZS5BQ1RJT05fRE9VQkxFVEFQOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb0RvdWJsZVRhcCgpIG5lZWRzIG1MYXN0VG91Y2hYL1kgYXMgYW5jaG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0gdGVkLm1WaWV3WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB0ZWQubVZpZXdZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0RvdWJsZVRhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoWCA9IGNvbnRlbnRUb1ZpZXdYKHRlZC5tWCkgLSBtU2Nyb2xsWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSBjb250ZW50VG9WaWV3WSh0ZWQubVkpIC0gbVNjcm9sbFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5oYW5kbGVEb3VibGVUYXAobUxhc3RUb3VjaFgsIG1MYXN0VG91Y2hZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdlYlZpZXdDb3JlLkFDVElPTl9MT05HUFJFU1M6CkBAIC03MDk3LDcgKzY2NDIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0VGVzdCAhPSBudWxsICYmIGhpdFRlc3QubVR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBIaXRUZXN0UmVzdWx0LlVOS05PV05fVFlQRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybUxvbmdDbGljaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFdlYlRleHRWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVyVG91Y2hNb2RlID0gVE9VQ0hfRE9ORV9NT0RFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTcxMTUsOCArNjY1OSw4IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIEZJTkRfQUdBSU46CiAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBpZiBmaW5kIGhhcyBiZWVuIGRpc21pc3NlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaW5kSXNVcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluZEFsbChtTGFzdEZpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZpbmRJc1VwICYmIG1GaW5kQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpbmRDYWxsYmFjay5maW5kQWxsKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcyMjEsNyArNjc2NSw2IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIENFTlRFUl9GSVRfUkVDVDoKICAgICAgICAgICAgICAgICAgICAgUmVjdCByID0gKFJlY3QpbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGNlbnRlckZpdFJlY3Qoci5sZWZ0LCByLnRvcCwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTcyMzAsNiArNjc3Myw0MyBAQAogICAgICAgICAgICAgICAgICAgICBtVmVydGljYWxTY3JvbGxCYXJNb2RlID0gbXNnLmFyZzI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgY2FzZSBTRUxFQ1RJT05fU1RSSU5HX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eUluamVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb25TdHJpbmcgPSAoU3RyaW5nKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbmplY3Rvci5vblNlbGVjdGlvblN0cmluZ0NoYW5nZShzZWxlY3Rpb25TdHJpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTOgorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5zZXRFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8UmVjdD4gcmVjdHMgPSAoQXJyYXlMaXN0PFJlY3Q+KSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWN0IHJlY3QgOiByZWN0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3Qgdmlld1JlY3QgPSBjb250ZW50VG9WaWV3UmVjdChyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIHNpdGVzLCBsaWtlIHN0b3JpZXMgaW4gbnl0aW1lcy5jb20sIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdXNlIGV2ZW50IGhhbmRsZXIgaW4gdGhlIHRvcCBkaXYuIEl0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgZnJpZW5kbHkgdG8gaGlnaGxpZ2h0IHRoZSBkaXYgaWYgaXQgY292ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGhhbGYgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld1JlY3Qud2lkdGgoKSA8IGdldFdpZHRoKCkgPj4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdmlld1JlY3QuaGVpZ2h0KCkgPCBnZXRIZWlnaHQoKSA+PiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi51bmlvbih2aWV3UmVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUodmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlNraXAgdGhlIGh1Z2Ugc2VsZWN0aW9uIHJlY3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmlld1JlY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0FWRV9XRUJBUkNISVZFX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBTYXZlV2ViQXJjaGl2ZU1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPSAoU2F2ZVdlYkFyY2hpdmVNZXNzYWdlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlTWVzc2FnZS5tQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU1lc3NhZ2UubUNhbGxiYWNrLm9uUmVjZWl2ZVZhbHVlKHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NTM3LDM3ICs3MTE3LDYgQEAKICAgICAgICAgICAgICAgICBuZXcgSW52b2tlTGlzdEJveChhcnJheSwgZW5hYmxlZEFycmF5LCBzZWxlY3RlZEFycmF5KSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVpvb21SYW5nZShXZWJWaWV3Q29yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlLAotICAgICAgICAgICAgaW50IHZpZXdXaWR0aCwgaW50IG1pblByZWZXaWR0aCwgYm9vbGVhbiB1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVab29tT3ZlcnZpZXcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9IHNldHRpbmdzLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldExvYWRXaXRoT3ZlcnZpZXdNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gcmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gREVGQVVMVF9NSU5fWk9PTV9TQ0FMRTsKLSAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1pblNjYWxlOwotICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdG9yZVN0YXRlLm1NYXhTY2FsZSA9PSAwKSB7Ci0gICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gREVGQVVMVF9NQVhfWk9PTV9TQ0FMRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSByZXN0b3JlU3RhdGUubU1heFNjYWxlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoKICAgICAgKiBSZXF1ZXN0IGEgZHJvcGRvd24gbWVudSBmb3IgYSBsaXN0Ym94IHdpdGggc2luZ2xlIHNlbGVjdGlvbiBvciBhIHNpbmdsZQogICAgICAqIDxzZWxlY3Q+IGVsZW1lbnQuCkBAIC03NjA2LDcgKzcxNTUsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZW5kTW92ZU1vdXNlSWZMYXRlc3QoYm9vbGVhbiByZW1vdmVGb2N1cykgewogICAgICAgICBpZiAocmVtb3ZlRm9jdXMpIHsKLSAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KHRydWUpOworICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKICAgICAgICAgfQogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX01PVkVfTU9VU0VfSUZfTEFURVNULAogICAgICAgICAgICAgICAgIGN1cnNvckRhdGEoKSk7CkBAIC03NjUwLDcgKzcxOTksNyBAQAogICAgICAgICAvLyBGSVhNRSB0aGUgZGl2aXNvciBzaG91bGQgYmUgcmV0cmlldmVkIGZyb20gc29tZXdoZXJlCiAgICAgICAgIC8vIHRoZSBjbG9zZXN0IHRoaW5nIHRvZGF5IGlzIGhhcmQtY29kZWQgaW50byBTY3JvbGxWaWV3LmphdmEKICAgICAgICAgLy8gKGZyb20gU2Nyb2xsVmlldy5qYXZhLCBsaW5lIDM2MykgICBpbnQgbWF4SnVtcCA9IGhlaWdodC8yOwotICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtSW52QWN0dWFsU2NhbGUpOworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgKiBtWm9vbU1hbmFnZXIuZ2V0SW52U2NhbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjYxLDEwICs3MjEwLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGFzcyB0aGUga2V5IHRvIHRoZSBwbHVnaW4uICBUaGlzIGFzc3VtZXMgdGhhdCBuYXRpdmVGb2N1c0lzUGx1Z2luKCkKLSAgICAgKiByZXR1cm5lZCB0cnVlLgorICAgICAqIFBhc3MgdGhlIGtleSBkaXJlY3RseSB0byB0aGUgcGFnZS4gIFRoaXMgYXNzdW1lcyB0aGF0CisgICAgICogbmF0aXZlUGFnZVNob3VsZEhhbmRsZVNoaWZ0QW5kQXJyb3dzKCkgcmV0dXJuZWQgdHJ1ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbGV0UGx1Z2luSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgeworICAgIHByaXZhdGUgdm9pZCBsZXRQYWdlSGFuZGxlTmF2S2V5KGludCBrZXlDb2RlLCBsb25nIHRpbWUsIGJvb2xlYW4gZG93bikgewogICAgICAgICBpbnQga2V5RXZlbnRBY3Rpb247CiAgICAgICAgIGludCBldmVudEh1YkFjdGlvbjsKICAgICAgICAgaWYgKGRvd24pIHsKQEAgLTc3NjEsNyArNzMxMCw3IEBACiAgICAgICogQGhpZGUgb25seSBuZWVkcyB0byBiZSBhY2Nlc3NpYmxlIHRvIEJyb3dzZXIgYW5kIHRlc3RpbmcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkcmF3UGFnZShDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIG1XZWJWaWV3Q29yZS5kcmF3Q29udGVudFBpY3R1cmUoY2FudmFzLCAwLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcywgMCwgMCwgZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzgwNSwxMCArNzM1NCwxOCBAQAogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZUN1cnNvcldhbnRzS2V5RXZlbnRzKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRGVidWdEdW1wKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRGVzdHJveSgpOworCisgICAgLyoqCisgICAgICogRHJhdyB0aGUgcGljdHVyZSBzZXQgd2l0aCBhIGJhY2tncm91bmQgY29sb3IgYW5kIGV4dHJhLiBJZgorICAgICAqICJzcGxpdElmTmVlZGVkIiBpcyB0cnVlIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vdCAwLCB0aGUgcmV0dXJuIHZhbHVlCisgICAgICogTVVTVCBiZSBwYXNzZWQgdG8gV2ViVmlld0NvcmUgd2l0aCBTUExJVF9QSUNUVVJFX1NFVCBtZXNzYWdlIHNvIHRoYXQgdGhlCisgICAgICogbmF0aXZlIGFsbG9jYXRpb24gY2FuIGJlIGZyZWVkLgorICAgICAqLworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVEcmF3KENhbnZhcyBjYW52YXMsIGludCBjb2xvciwgaW50IGV4dHJhLAorICAgICAgICAgICAgYm9vbGVhbiBzcGxpdElmTmVlZGVkKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVEdW1wRGlzcGxheVRyZWUoU3RyaW5nIHVybE9yTnVsbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiAgbmF0aXZlRXZhbHVhdGVMYXllcnNBbmltYXRpb25zKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRXh0ZW5kU2VsZWN0aW9uKGludCB4LCBpbnQgeSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlRHJhd0V4dHJhcyhDYW52YXMgY2FudmFzLCBpbnQgZXh0cmEpOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUR1bXBEaXNwbGF5VHJlZShTdHJpbmcgdXJsT3JOdWxsKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVGaW5kQWxsKFN0cmluZyBmaW5kTG93ZXIsIFN0cmluZyBmaW5kVXBwZXIpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZUZpbmROZXh0KGJvb2xlYW4gZm9yd2FyZCk7CiAgICAgLyogcGFja2FnZSAqLyBuYXRpdmUgaW50ICAgICAgbmF0aXZlRm9jdXNDYW5kaWRhdGVGcmFtZVBvaW50ZXIoKTsKQEAgLTc4NDYsNiArNzQwMywxNCBAQAogICAgICAgICAgICAgYm9vbGVhbiBub1Njcm9sbCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50ICAgICAgbmF0aXZlTW92ZUdlbmVyYXRpb24oKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVNb3ZlU2VsZWN0aW9uKGludCB4LCBpbnQgeSk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwYWdlIHNob3VsZCBnZXQgdGhlIHNoaWZ0IGFuZCBhcnJvdyBrZXlzLCByYXRoZXIKKyAgICAgKiB0aGFuIHNlbGVjdCB0ZXh0L25hdmlnYXRpb24uCisgICAgICoKKyAgICAgKiBJZiB0aGUgZm9jdXMgaXMgYSBwbHVnaW4sIG9yIGlmIHRoZSBmb2N1cyBhbmQgY3Vyc29yIG1hdGNoIGFuZCBhcmUKKyAgICAgKiBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50LCB0aGVuIHRoZSBwYWdlIHNob3VsZCBoYW5kbGUgdGhlc2Uga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVQYWdlU2hvdWxkSGFuZGxlU2hpZnRBbmRBcnJvd3MoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVQb2ludEluTmF2Q2FjaGUoaW50IHgsIGludCB5LCBpbnQgc2xvcCk7CiAgICAgLy8gTGlrZSBtYW55IG90aGVyIG9mIG91ciBuYXRpdmUgbWV0aG9kcywgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQKICAgICAvLyBtTmF0aXZlQ2xhc3MgaXMgbm90IG51bGwgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCkBAIC03ODYwLDEzICs3NDI1LDE1IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RXh0ZW5kU2VsZWN0aW9uKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0RmluZElzRW1wdHkoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRGaW5kSXNVcChib29sZWFuIGlzVXApOwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNldEZvbGxvd2VkTGluayhib29sZWFuIGZvbGxvd2VkKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKGJvb2xlYW4gbWVhc3VyZSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0Um9vdExheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0QmFzZUxheWVyKGludCBsYXllcik7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2hvd0N1cnNvclRpbWVkKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlUmVwbGFjZUJhc2VDb250ZW50KGludCBjb250ZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVDb3B5QmFzZUNvbnRlbnRUb1BpY3R1cmUoUGljdHVyZSBwaWN0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuICBuYXRpdmVIYXNDb250ZW50KCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUG9pbnRlcihib29sZWFuIHNldCwKICAgICAgICAgICAgIGZsb2F0IHNjYWxlLCBpbnQgeCwgaW50IHkpOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVN0YXJ0U2VsZWN0aW9uKGludCB4LCBpbnQgeSk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0U2VsZWN0aW9uUmVnaW9uKGJvb2xlYW4gc2V0KTsKICAgICBwcml2YXRlIG5hdGl2ZSBSZWN0ICAgICBuYXRpdmVTdWJ0cmFjdExheWVycyhSZWN0IGNvbnRlbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVRleHRHZW5lcmF0aW9uKCk7CiAgICAgLy8gTmV2ZXIgY2FsbCB0aGlzIHZlcnNpb24gZXhjZXB0IGJ5IHVwZGF0ZUNhY2hlZFRleHRmaWVsZChTdHJpbmcpIC0KQEAgLTc4NzUsNiArNzQ0MiwxMCBAQAogICAgICAgICAgICAgaW50IGdlbmVyYXRpb24pOwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVdvcmRTZWxlY3Rpb24oaW50IHgsIGludCB5KTsKICAgICAvLyByZXR1cm4gTk9fTEVGVEVER0UgbWVhbnMgZmFpbHVyZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKLSAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVHZXRCbG9ja0xlZnRFZGdlKGludCB4LCBpbnQgeSwgZmxvYXQgc2NhbGUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fTEVGVEVER0UgPSAtMTsKKyAgICBuYXRpdmUgaW50IG5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UoaW50IHgsIGludCB5LCBmbG9hdCBzY2FsZSk7CisKKyAgICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2Nyb2xsYWJsZSBMYXllckFuZHJvaWQgYXQgdGhlIGdpdmVuIHBvaW50LgorICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZVNjcm9sbGFibGVMYXllcihpbnQgeCwgaW50IHkpOworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVNjcm9sbExheWVyKGludCBsYXllciwgaW50IGR4LCBpbnQgZHkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEKaW5kZXggMDJjNzIxMC4uMWY4ZWViYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhCkBAIC04OSw2ICs4OSw3IEBACiAgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIGNhbGxlZC4gV2hlbiB0aGUgV2ViVmlldyBlbmNvdW50ZXJzCiAgICAgICogICAgICAgICAgICAgYSByZWRpcmVjdCBsb29wLCBpdCB3aWxsIGNhbmNlbCB0aGUgbG9hZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIG9uVG9vTWFueVJlZGlyZWN0cyhXZWJWaWV3IHZpZXcsIE1lc3NhZ2UgY2FuY2VsTXNnLAogICAgICAgICAgICAgTWVzc2FnZSBjb250aW51ZU1zZykgewogICAgICAgICBjYW5jZWxNc2cuc2VuZFRvVGFyZ2V0KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IGJmNGQ5NWIuLjYwZGRmMDggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCkBAIC0xNywxNCArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkRyYXdGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGljdHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKQEAgLTMzLDE0ICsyNywxNCBAQAogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Ccm93c2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuT3BlbmFibGVDb2x1bW5zOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTExNywxMyArMTExLDE2IEBACiAgICAgcHJpdmF0ZSBpbnQgbVZpZXdwb3J0RGVuc2l0eURwaSA9IC0xOwogCiAgICAgcHJpdmF0ZSBpbnQgbVJlc3RvcmVkU2NhbGUgPSAwOwotICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSAwOworICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFggPSAwOwogICAgIHByaXZhdGUgaW50IG1SZXN0b3JlZFkgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbVdlYmtpdFNjcm9sbFggPSAwOwogICAgIHByaXZhdGUgaW50IG1XZWJraXRTY3JvbGxZID0gMDsKIAorICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIgPSBuZXcgRGV2aWNlT3JpZW50YXRpb25NYW5hZ2VyKHRoaXMpOworICAgIHByaXZhdGUgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2U7CisKICAgICAvLyBUaGUgdGhyZWFkIG5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgV2ViQ29yZSB0aHJlYWQgYW5kIGZvciB1c2UgaW4KICAgICAvLyBkZWJ1Z2dpbmcgb3RoZXIgY2xhc3NlcyB0aGF0IHJlcXVpcmUgb3BlcmF0aW9uIHdpdGhpbiB0aGUgV2ViQ29yZSB0aHJlYWQuCiAgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FID0gIldlYlZpZXdDb3JlVGhyZWFkIjsKQEAgLTI3OSwzNCArMjc2LDM2IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JLiAgT3BlbiBhIGZpbGUgY2hvb3NlciB0byB1cGxvYWQgYSBmaWxlLgotICAgICAqIEByZXR1cm4gU3RyaW5nIHZlcnNpb24gb2YgdGhlIFVSSSBwbHVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEZJWE1FOiBKdXN0IHJldHVybiB0aGUgVVJJIGhlcmUsIGFuZCBpbiBGaWxlU3lzdGVtOjpwYXRoR2V0RmlsZU5hbWUsIGNhbGwKLSAgICAgKiBpbnRvIEphdmEgdG8gZ2V0IHRoZSBmaWxlbmFtZS4KKyAgICAgKiBAcGFyYW0gYWNjZXB0VHlwZSBUaGUgdmFsdWUgb2YgdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgKiAgICAgICAgIGlucHV0IHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIHBpY2tlci4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBVUkkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlbkZpbGVDaG9vc2VyKCkgewotICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgcmV0dXJuICIiOwotICAgICAgICAvLyBGaW5kIG91dCB0aGUgbmFtZSwgYW5kIGFwcGVuZCBpdCB0byB0aGUgVVJJLgotICAgICAgICAvLyBXZWJraXQgd2lsbCB0cmVhdCB0aGUgbmFtZSBhcyB0aGUgZmlsZW5hbWUsIGFuZAotICAgICAgICAvLyB0aGUgVVJJIGFzIHRoZSBwYXRoLiAgVGhlIFVSSSB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gaW4gQnJvd3NlckZyYW1lIHRvIGdldCB0aGUgYWN0dWFsIGRhdGEuCi0gICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKLSAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgT3BlbmFibGVDb2x1bW5zLkRJU1BMQVlfTkFNRSB9LAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJzb3IuZ2V0U3RyaW5nKDApOworICAgIHByaXZhdGUgU3RyaW5nIG9wZW5GaWxlQ2hvb3NlcihTdHJpbmcgYWNjZXB0VHlwZSkgeworICAgICAgICBVcmkgdXJpID0gbUNhbGxiYWNrUHJveHkub3BlbkZpbGVDaG9vc2VyKGFjY2VwdFR5cGUpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9ICIiOworICAgICAgICAgICAgLy8gTm90ZSAtIHF1ZXJ5aW5nIGZvciBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBCisgICAgICAgICAgICAvLyBzZWVtcyB0byB3b3JrIGZvciBhbGwgY29udGVudCBVUklzLCBub3QganVzdCBpbWFnZXMKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNZWRpYVN0b3JlLkltYWdlcy5NZWRpYS5EQVRBIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gY3Vyc29yLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gdXJpLmdldExhc3RQYXRoU2VnbWVudCgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHVyaVN0cmluZyA9IHVyaS50b1N0cmluZygpOworICAgICAgICAgICAgQnJvd3NlckZyYW1lLnNKYXZhQnJpZGdlLnN0b3JlRmlsZVBhdGhGb3JDb250ZW50VXJpKGZpbGVQYXRoLCB1cmlTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuIHVyaVN0cmluZzsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOworICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MjQsNiArNDIzLDEzIEBACiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5vbkpzVGltZW91dCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgd2VidmlldyB0aGF0IHRoaXMgaXMgYW4gaW5zdGFsbGFibGUgd2ViIGFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnN0YWxsYWJsZVdlYkFwcCgpIHsKKyAgICAgICAgbUNhbGxiYWNrUHJveHkuc2V0SW5zdGFsbGFibGVXZWJBcHAoKTsKKyAgICB9CisKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAvLyBKTkkgbWV0aG9kcwogICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM1LDM2ICs0NDEsMjEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNsZWFyQ29udGVudCgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZmxhdCBwaWN0dXJlIGZyb20gdGhlIHNldCBvZiBwaWN0dXJlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdHVyZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEcmF3IHRoZSBwaWN0dXJlIHNldCB3aXRoIGEgYmFja2dyb3VuZCBjb2xvci4gUmV0dXJucyB0cnVlCi0gICAgICogaWYgc29tZSBpbmRpdmlkdWFsIHBpY3R1cmUgdG9vayB0b28gbG9uZyB0byBkcmF3IGFuZCBjYW4gYmUKLSAgICAgKiBzcGxpdCBpbnRvIHBhcnRzLiBDYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLgotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRHJhd0NvbnRlbnQoQ2FudmFzIGNhbnZhcywgaW50IGNvbG9yKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRvIHNlZSBpZiBwaWN0dXJlIGlzIGJsYW5rIGFuZCBpbiBwcm9ncmVzcwotICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gbmF0aXZlUGljdHVyZVJlYWR5KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOwogCiAgICAgLyoqCiAgICAgICogUmVkcmF3IGEgcG9ydGlvbiBvZiB0aGUgcGljdHVyZSBzZXQuIFRoZSBQb2ludCB3aCByZXR1cm5zIHRoZQogICAgICAqIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG92ZXJhbGwgcGljdHVyZS4KICAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZVJlY29yZENvbnRlbnQoUmVnaW9uIGludmFsUmVnaW9uLCBQb2ludCB3aCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZUZvY3VzQm91bmRzQ2hhbmdlZCgpOwogCiAgICAgLyoqCi0gICAgICogU3BsaXRzIHNsb3cgcGFydHMgb2YgdGhlIHBpY3R1cmUgc2V0LiBDYWxsZWQgZnJvbSB0aGUgd2Via2l0Ci0gICAgICogdGhyZWFkIGFmdGVyIG5hdGl2ZURyYXdDb250ZW50IHJldHVybnMgdHJ1ZS4KKyAgICAgKiBTcGxpdHMgc2xvdyBwYXJ0cyBvZiB0aGUgcGljdHVyZSBzZXQuIENhbGxlZCBmcm9tIHRoZSB3ZWJraXQgdGhyZWFkIGFmdGVyCisgICAgICogV2ViVmlldy5uYXRpdmVEcmF3KCkgcmV0dXJucyBjb250ZW50IHRvIGJlIHNwbGl0LgogICAgICAqLwotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlU3BsaXRDb250ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpOwogCiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVLZXkoaW50IGtleUNvZGUsIGludCB1bmljaGFyLAogICAgICAgICAgICAgaW50IHJlcGVhdENvdW50LCBib29sZWFuIGlzU2hpZnQsIGJvb2xlYW4gaXNBbHQsIGJvb2xlYW4gaXNTeW0sCkBAIC00ODAsMTIgKzQ3MSwxMiBAQAogICAgICAgICBvZiBsYXlvdXQvbGluZS1icmVha2luZy4gVGhlc2UgY29vcmRpbmF0ZXMgYXJlIGluIGRvY3VtZW50IHNwYWNlLAogICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBhcyBWaWV3IGNvb3JkcyB1bmxlc3Mgd2UgaGF2ZSB6b29tZWQgdGhlIGRvY3VtZW50CiAgICAgICAgIChzZWUgbmF0aXZlU2V0Wm9vbSkuCi0gICAgICAgIHNjcmVlbldpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcwotICAgICAgICBmaXhlZCBzaXplLCBzY3JlZW5XaWR0aCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2lkdGggd2l0aCB6b29taW5nLgorICAgICAgICB0ZXh0V3JhcFdpZHRoIGlzIHVzZWQgYnkgbGF5b3V0IHRvIHdyYXAgY29sdW1uIGFyb3VuZC4gSWYgdmlld3BvcnQgdXNlcworICAgICAgICBmaXhlZCBzaXplLCB0ZXh0V3JhcFdpZHRoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aCB3aXRoIHpvb21pbmcuCiAgICAgICAgIHNob3VsZCB0aGlzIGJlIGNhbGxlZCBuYXRpdmVTZXRWaWV3UG9ydFNpemU/CiAgICAgKi8KLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHJlYWxTY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwgaW50IGFuY2hvclgsCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRleHRXcmFwV2lkdGgsCisgICAgICAgICAgICBmbG9hdCBzY2FsZSwgaW50IHNjcmVlbldpZHRoLCBpbnQgc2NyZWVuSGVpZ2h0LCBpbnQgYW5jaG9yWCwKICAgICAgICAgICAgIGludCBhbmNob3JZLCBib29sZWFuIGlnbm9yZUhlaWdodCk7CiAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpOwpAQCAtNTc2LDcgKzU2NywxOCBAQAogICAgIC8qKgogICAgICAqIFByb3ZpZGUgV2ViQ29yZSB3aXRoIHRoZSBwcmV2aW91c2x5IHZpc3RlZCBsaW5rcyBmcm9tIHRoZSBoaXN0b3J5IGRhdGFiYXNlCiAgICAgICovCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvdmlkZVZpc2l0ZWRIaXN0b3J5KFN0cmluZ1tdIGhpc3RvcnkpOworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVyIFNwZWNpZmllcyBob3cgdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdG8gYWx0ZXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gZ3JhbnVsYXJpdHkgVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBzZWxlY3Rpb24gbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0aW9uIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgbmF0aXZlTW9kaWZ5U2VsZWN0aW9uKFN0cmluZyBhbHRlciwgU3RyaW5nIGRpcmVjdGlvbiwgU3RyaW5nIGdyYW51bGFyaXR5KTsKIAogICAgIC8vIEV2ZW50SHViIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEh1YiBtRXZlbnRIdWI7CkBAIC02OTcsNiArNjk5LDEyIEBACiAgICAgICAgIGludCBtWTsKICAgICB9CiAKKyAgICBzdGF0aWMgY2xhc3MgVG91Y2hIaWdobGlnaHREYXRhIHsKKyAgICAgICAgaW50IG1YOworICAgICAgICBpbnQgbVk7CisgICAgICAgIGludCBtU2xvcDsKKyAgICB9CisKICAgICAvLyBtQWN0aW9uIG9mIFRvdWNoRXZlbnREYXRhIGNhbiBiZSBNb3Rpb25FdmVudC5nZXRBY3Rpb24oKSB3aGljaCB1c2VzIHRoZQogICAgIC8vIGxhc3QgdHdvIGJ5dGVzIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0xPTkdQUkVTUyA9IDB4MTAwOwpAQCAtNzA4LDggKzcxNiw2IEBACiAgICAgICAgIGludCBtWTsKICAgICAgICAgaW50IG1NZXRhU3RhdGU7CiAgICAgICAgIGJvb2xlYW4gbVJlcHJvY2VzczsKLSAgICAgICAgZmxvYXQgbVZpZXdYOwotICAgICAgICBmbG9hdCBtVmlld1k7CiAgICAgfQogCiAgICAgc3RhdGljIGNsYXNzIEdlb2xvY2F0aW9uUGVybWlzc2lvbnNEYXRhIHsKQEAgLTcxOCw5ICs3MjQsMTQgQEAKICAgICAgICAgYm9vbGVhbiBtUmVtZW1iZXI7CiAgICAgfQogCi0KKyAgICBzdGF0aWMgY2xhc3MgTW9kaWZ5U2VsZWN0aW9uRGF0YSB7CisgICAgICAgIFN0cmluZyBtQWx0ZXI7CisgICAgICAgIFN0cmluZyBtRGlyZWN0aW9uOworICAgICAgICBTdHJpbmcgbUdyYW51bGFyaXR5OworICAgIH0KIAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gSGFuZGxlckRlYnVnU3RyaW5nID0geworICAgICAgICAgICAgIlJFVkVBTF9TRUxFQ1RJT04iLCAvLyA5NgogICAgICAgICAgICAgIlJFUVVFU1RfTEFCRUwiLCAvLyA5NwogICAgICAgICAgICAgIlVQREFURV9GUkFNRV9DQUNIRV9JRl9MT0FESU5HIiwgLy8gPSA5OAogICAgICAgICAgICAgIlNDUk9MTF9URVhUX0lOUFVUIiwgLy8gPSA5OQpAQCAtNzcxLDEwICs3ODIsMTIgQEAKICAgICAgICAgICAgICJPTl9SRVNVTUUiLCAgICAvLyA9IDE0NAogICAgICAgICAgICAgIkZSRUVfTUVNT1JZIiwgIC8vID0gMTQ1CiAgICAgICAgICAgICAiVkFMSURfTk9ERV9CT1VORFMiLCAvLyA9IDE0NgorICAgICAgICAgICAgIlNBVkVfV0VCQVJDSElWRSIsIC8vID0gMTQ3CiAgICAgICAgIH07CiAKICAgICBjbGFzcyBFdmVudEh1YiB7CiAgICAgICAgIC8vIE1lc3NhZ2UgSWRzCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVWRUFMX1NFTEVDVElPTiA9IDk2OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfTEFCRUwgPSA5NzsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBVUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyA9IDk4OwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9URVhUX0lOUFVUID0gOTk7CkBAIC04MzcsNiArODUwLDkgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBGUkVFX01FTU9SWSA9IDE0NTsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBWQUxJRF9OT0RFX0JPVU5EUyA9IDE0NjsKIAorICAgICAgICAvLyBMb2FkIGFuZCBzYXZlIHdlYiBhcmNoaXZlcworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNBVkVfV0VCQVJDSElWRSA9IDE0NzsKKwogICAgICAgICAvLyBOZXR3b3JrLWJhc2VkIG1lc3NhZ2luZwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IENMRUFSX1NTTF9QUkVGX1RBQkxFID0gMTUwOwogCkBAIC04NjUsNiArODgxLDE0IEBACiAgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUREX1BBQ0tBR0VfTkFNRSA9IDE4NTsKICAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfUEFDS0FHRV9OQU1FID0gMTg2OwogCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUyA9IDE4NzsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfVE9VQ0hfSElHSExJR0hUX1JFQ1RTID0gMTg4OworCisgICAgICAgIC8vIGFjY2Vzc2liaWxpdHkgc3VwcG9ydAorICAgICAgICBzdGF0aWMgZmluYWwgaW50IE1PRElGWV9TRUxFQ1RJT04gPSAxOTA7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBVU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT04gPSAxOTE7CisKICAgICAgICAgLy8gcHJpdmF0ZSBtZXNzYWdlIGlkcwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTVFJPWSA9ICAgICAyMDA7CiAKQEAgLTg4NSw2ICs5MDksOSBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBFdmVudEh1YigpIHt9CiAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX1BBQ0tBR0VfTVNHX0lEID0gUkVWRUFMX1NFTEVDVElPTjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBU1RfUEFDS0FHRV9NU0dfSUQgPSBWQUxJRF9OT0RFX0JPVU5EUzsKKwogICAgICAgICAvKioKICAgICAgICAgICogVHJhbnNmZXIgYWxsIG1lc3NhZ2VzIHRvIHRoZSBuZXdseSBjcmVhdGVkIHdlYmNvcmUgdGhyZWFkIGhhbmRsZXIuCiAgICAgICAgICAqLwpAQCAtODk2LDExICs5MjMsMTEgQEAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgKG1zZy53aGF0IDwgUkVRVUVTVF9MQUJFTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtc2cud2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IFZBTElEX05PREVfQk9VTkRTID8gSW50ZWdlci50b1N0cmluZyhtc2cud2hhdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgKG1zZy53aGF0IDwgRklSU1RfUEFDS0FHRV9NU0dfSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbXNnLndoYXQgPiBMQVNUX1BBQ0tBR0VfTVNHX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50ZWdlci50b1N0cmluZyhtc2cud2hhdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBIYW5kbGVyRGVidWdTdHJpbmdbbXNnLndoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFJFUVVFU1RfTEFCRUxdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRklSU1RfUEFDS0FHRV9NU0dfSURdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJnMT0iICsgbXNnLmFyZzEgKyAiIGFyZzI9IiArIG1zZy5hcmcyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvYmo9IiArIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MjEsNiArOTQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFVkVBTF9TRUxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlUmV2ZWFsU2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9MQUJFTDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9kZVBvaW50ZXIgPSBtc2cuYXJnMjsKQEAgLTEyMzgsNiArMTI2OSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNldFNlbGVjdGlvbihtc2cuYXJnMSwgbXNnLmFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1PRElGWV9TRUxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5U2VsZWN0aW9uRGF0YSBtb2RpZnlTZWxlY3Rpb25EYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1vZGlmeVNlbGVjdGlvbkRhdGEpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvblN0cmluZyA9IG5hdGl2ZU1vZGlmeVNlbGVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeVNlbGVjdGlvbkRhdGEubUFsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uRGF0YS5tRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5U2VsZWN0aW9uRGF0YS5tR3JhbnVsYXJpdHkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFTEVDVElPTl9TVFJJTkdfQ0hBTkdFRCwgc2VsZWN0aW9uU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1RCT1hfQ0hPSUNFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hvaWNlcyA9IChTcGFyc2VCb29sZWFuQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cub2JqOwpAQCAtMTI3OCw2ICsxMzIyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlU2V0SnNGbGFncygoU3RyaW5nKW1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNBVkVfV0VCQVJDSElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSBzYXZlTWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJWaWV3LlNhdmVXZWJBcmNoaXZlTWVzc2FnZSltc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVNZXNzYWdlLm1SZXN1bHRGaWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVdlYkFyY2hpdmUoc2F2ZU1lc3NhZ2UubUJhc2VuYW1lLCBzYXZlTWVzc2FnZS5tQXV0b25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNBVkVfV0VCQVJDSElWRV9GSU5JU0hFRCwgc2F2ZU1lc3NhZ2UpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFT0xPQ0FUSU9OX1BFUk1JU1NJT05TX1BST1ZJREU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEgZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2VvbG9jYXRpb25QZXJtaXNzaW9uc0RhdGEpIG1zZy5vYmo7CkBAIC0xMjkxLDcgKzEzNDQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNQTElUX1BJQ1RVUkVfU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNwbGl0Q29udGVudChtc2cuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlJFUExBQ0VfQkFTRV9DT05URU5ULCBtc2cuYXJnMSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNwbGl0UGljdHVyZUlzU2NoZWR1bGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTEzNTcsNiArMTQxMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5zSmF2YUJyaWRnZS5yZW1vdmVQYWNrYWdlTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZy5vYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9UT1VDSF9ISUdITElHSFRfUkVDVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hIaWdobGlnaHREYXRhIGQgPSAoVG91Y2hIaWdobGlnaHREYXRhKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxSZWN0PiByZWN0cyA9IG5hdGl2ZUdldFRvdWNoSGlnaGxpZ2h0UmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkLm1YLCBkLm1ZLCBkLm1TbG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgcmVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1RPVUNIX0hJR0hMSUdIVF9SRUNUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuU0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBVU0VfTU9DS19ERVZJQ0VfT1JJRU5UQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwpAQCAtMTU2Miw2ICsxNjM2LDEzIEBACiAgICAgICAgIG1Ccm93c2VyRnJhbWUubG9hZFVybCh1cmwsIGV4dHJhSGVhZGVycyk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGF1dG9uYW1lKSB7CisgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXX0NPUkUpIHsKKyAgICAgICAgICAgIExvZy52KExPR1RBRywgIiBDT1JFIHNhdmVXZWJBcmNoaXZlICIgKyBmaWxlbmFtZSArICIgIiArIGF1dG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJyb3dzZXJGcmFtZS5zYXZlV2ViQXJjaGl2ZShmaWxlbmFtZSwgYXV0b25hbWUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBrZXkoS2V5RXZlbnQgZXZ0LCBib29sZWFuIGlzRG93bikgewogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJDT1JFIGtleSBhdCAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLCAiCkBAIC0xNTgyLDExICsxNjYzLDEyIEBACiAgICAgICAgICAgICBpZiAoa2V5Q29kZSA+PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAKICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSA8PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQpIHsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgImtleTogYXJyb3cgdW51c2VkIGJ5IHBsdWdpbjogIiArIGtleUNvZGUpOworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXk6IGFycm93IHVudXNlZCBieSBwYWdlOiAiICsga2V5Q29kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmIGV2dC5pc0Rvd24oKSkgewogICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5NT1ZFX09VVF9PRl9QTFVHSU4sIGtleUNvZGUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlZpZXcuVU5IQU5ETEVEX05BVl9LRVksIGtleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTE2MTcsNyArMTY5OSw3IEBACiAgICAgICAgIGlmIChtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKICAgICAgICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCA9PSAtMSkgewogICAgICAgICAgICAgICAgIGlmIChtU2V0dGluZ3MuZ2V0TGF5b3V0QWxnb3JpdGhtKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OT1JNQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OT1JNQUwgfHwgbVNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSkgewogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTY4Miw2ICsxNzY0LDE0IEBACiAgICAgICAgIHJldHVybiB1c2VkUXVvdGE7CiAgICAgfQogCisgICAgLy8gY2FsbGVkIGZyb20gVUkgdGhyZWFkCisgICAgdm9pZCBzcGxpdENvbnRlbnQoaW50IGNvbnRlbnQpIHsKKyAgICAgICAgaWYgKCFtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQpIHsKKyAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IHRydWU7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCwgY29udGVudCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBVc2VkIHRvIGF2b2lkIHBvc3RpbmcgbW9yZSB0aGFuIG9uZSBkcmF3IG1lc3NhZ2UuCiAgICAgcHJpdmF0ZSBib29sZWFuIG1EcmF3SXNTY2hlZHVsZWQ7CiAKQEAgLTE2OTEsMTEgKzE3ODEsMTEgQEAKICAgICAvLyBVc2VkIHRvIHN1c3BlbmQgZHJhd2luZy4KICAgICBwcml2YXRlIGJvb2xlYW4gbURyYXdJc1BhdXNlZDsKIAotICAgIC8vIG1SZXN0b3JlU3RhdGUgaXMgc2V0IGluIGRpZEZpcnN0TGF5b3V0KCksIGFuZCByZXNldCBpbiB0aGUgbmV4dAotICAgIC8vIHdlYmtpdERyYXcgYWZ0ZXIgcGFzc2luZyBpdCB0byB0aGUgVUkgdGhyZWFkLgotICAgIHByaXZhdGUgUmVzdG9yZVN0YXRlIG1SZXN0b3JlU3RhdGUgPSBudWxsOworICAgIC8vIG1Jbml0aWFsVmlld1N0YXRlIGlzIHNldCBieSBkaWRGaXJzdExheW91dCgpIGFuZCB0aGVuIHJlc2V0IGluIHRoZQorICAgIC8vIG5leHQgd2Via2l0RHJhdyBhZnRlciBwYXNzaW5nIHRoZSBzdGF0ZSB0byB0aGUgVUkgdGhyZWFkLgorICAgIHByaXZhdGUgVmlld1N0YXRlIG1Jbml0aWFsVmlld1N0YXRlID0gbnVsbDsKIAotICAgIHN0YXRpYyBjbGFzcyBSZXN0b3JlU3RhdGUgeworICAgIHN0YXRpYyBjbGFzcyBWaWV3U3RhdGUgewogICAgICAgICBmbG9hdCBtTWluU2NhbGU7CiAgICAgICAgIGZsb2F0IG1NYXhTY2FsZTsKICAgICAgICAgZmxvYXQgbVZpZXdTY2FsZTsKQEAgLTE3MDgsMTUgKzE3OTgsMTcgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBEcmF3RGF0YSB7CiAgICAgICAgIERyYXdEYXRhKCkgeworICAgICAgICAgICAgbUJhc2VMYXllciA9IDA7CiAgICAgICAgICAgICBtSW52YWxSZWdpb24gPSBuZXcgUmVnaW9uKCk7CiAgICAgICAgICAgICBtV2lkdGhIZWlnaHQgPSBuZXcgUG9pbnQoKTsKICAgICAgICAgfQorICAgICAgICBpbnQgbUJhc2VMYXllcjsKICAgICAgICAgUmVnaW9uIG1JbnZhbFJlZ2lvbjsKICAgICAgICAgUG9pbnQgbVZpZXdQb2ludDsKICAgICAgICAgUG9pbnQgbVdpZHRoSGVpZ2h0OwogICAgICAgICBpbnQgbU1pblByZWZXaWR0aDsKLSAgICAgICAgUmVzdG9yZVN0YXRlIG1SZXN0b3JlU3RhdGU7IC8vIG9ubHkgbm9uLW51bGwgaWYgaXQgaXMgZm9yIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICAvLyBvbmx5IG5vbi1udWxsIGlmIGl0IGlzIGZvciB0aGUgZmlyc3QgcGljdHVyZSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IGxheW91dAorICAgICAgICBWaWV3U3RhdGUgbVZpZXdTdGF0ZTsKICAgICAgICAgYm9vbGVhbiBtRm9jdXNTaXplQ2hhbmdlZDsKICAgICB9CiAKQEAgLTE3MjQsOCArMTgxNiw4IEBACiAgICAgICAgIG1EcmF3SXNTY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAgRHJhd0RhdGEgZHJhdyA9IG5ldyBEcmF3RGF0YSgpOwogICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IHN0YXJ0Iik7Ci0gICAgICAgIGlmIChuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCkKLSAgICAgICAgICAgICAgICA9PSBmYWxzZSkgeworICAgICAgICBkcmF3Lm1CYXNlTGF5ZXIgPSBuYXRpdmVSZWNvcmRDb250ZW50KGRyYXcubUludmFsUmVnaW9uLCBkcmF3Lm1XaWR0aEhlaWdodCk7CisgICAgICAgIGlmIChkcmF3Lm1CYXNlTGF5ZXIgPT0gMCkgewogICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVdfQ09SRSkgTG9nLnYoTE9HVEFHLCAid2Via2l0RHJhdyBhYm9ydCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNzQxLDkgKzE4MzMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVZpZXdwb3J0V2lkdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlR2V0Q29udGVudE1pblByZWZXaWR0aCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmVzdG9yZVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkcmF3Lm1SZXN0b3JlU3RhdGUgPSBtUmVzdG9yZVN0YXRlOwotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUgPSBudWxsOworICAgICAgICAgICAgaWYgKG1Jbml0aWFsVmlld1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkcmF3Lm1WaWV3U3RhdGUgPSBtSW5pdGlhbFZpZXdTdGF0ZTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSBMb2cudihMT0dUQUcsICJ3ZWJraXREcmF3IE5FV19QSUNUVVJFX01TR19JRCIpOwogICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLApAQCAtMTc1OCw1MSArMTg1MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUaGVzZSBhcmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCwgbm90IG91ciB0aHJlYWQKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgWk9PTV9CSVRTID0gUGFpbnQuRklMVEVSX0JJVE1BUF9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUcgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludC5TVUJQSVhFTF9URVhUX0ZMQUc7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfQklUUyA9IFBhaW50LkZJTFRFUl9CSVRNQVBfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnQuRElUSEVSX0ZMQUc7Ci0KLSAgICBmaW5hbCBEcmF3RmlsdGVyIG1ab29tRmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFpPT01fQklUUywgUGFpbnQuTElORUFSX1RFWFRfRkxBRyk7Ci0gICAgLy8gSWYgd2UgbmVlZCB0byB0cmFkZSBiZXR0ZXIgcXVhbGl0eSBmb3Igc3BlZWQsIHNldCBtU2Nyb2xsRmlsdGVyIHRvIG51bGwKLSAgICBmaW5hbCBEcmF3RmlsdGVyIG1TY3JvbGxGaWx0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBQYWludEZsYWdzRHJhd0ZpbHRlcihTQ1JPTExfQklUUywgMCk7Ci0KLSAgICAvKiBwYWNrYWdlICovIHZvaWQgZHJhd0NvbnRlbnRQaWN0dXJlKENhbnZhcyBjYW52YXMsIGludCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYW5pbWF0aW5nWm9vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYW5pbWF0aW5nU2Nyb2xsKSB7Ci0gICAgICAgIERyYXdGaWx0ZXIgZGYgPSBudWxsOwotICAgICAgICBpZiAoYW5pbWF0aW5nWm9vbSkgewotICAgICAgICAgICAgZGYgPSBtWm9vbUZpbHRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChhbmltYXRpbmdTY3JvbGwpIHsKLSAgICAgICAgICAgIGRmID0gbVNjcm9sbEZpbHRlcjsKLSAgICAgICAgfQotICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihkZik7Ci0gICAgICAgIGJvb2xlYW4gdG9va1Rvb0xvbmcgPSBuYXRpdmVEcmF3Q29udGVudChjYW52YXMsIGNvbG9yKTsKLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobnVsbCk7Ci0gICAgICAgIGlmICh0b29rVG9vTG9uZyAmJiBtU3BsaXRQaWN0dXJlSXNTY2hlZHVsZWQgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIG1TcGxpdFBpY3R1cmVJc1NjaGVkdWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBzZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwYWNrYWdlICovIHN5bmNocm9uaXplZCBib29sZWFuIHBpY3R1cmVSZWFkeSgpIHsKLSAgICAgICAgcmV0dXJuIDAgIT0gbU5hdGl2ZUNsYXNzID8gbmF0aXZlUGljdHVyZVJlYWR5KCkgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKnBhY2thZ2UqLyBzeW5jaHJvbml6ZWQgUGljdHVyZSBjb3B5Q29udGVudFBpY3R1cmUoKSB7Ci0gICAgICAgIFBpY3R1cmUgcmVzdWx0ID0gbmV3IFBpY3R1cmUoKTsKLSAgICAgICAgaWYgKDAgIT0gbU5hdGl2ZUNsYXNzKSB7Ci0gICAgICAgICAgICBuYXRpdmVDb3B5Q29udGVudFRvUGljdHVyZShyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCiAgICAgc3RhdGljIHZvaWQgcmVkdWNlUHJpb3JpdHkoKSB7CiAgICAgICAgIC8vIHJlbW92ZSB0aGUgcGVuZGluZyBSRURVQ0VfUFJJT1JJVFkgYW5kIFJFU1VNRV9QUklPUklUWSBtZXNzYWdlcwogICAgICAgICBzV2ViQ29yZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoV2ViQ29yZVRocmVhZC5SRURVQ0VfUFJJT1JJVFkpOwpAQCAtMTgyNCw2ICsxODcxLDggQEAKICAgICAgICAgLy8gY2FsbGVkIGZyb20gVUkgdGhyZWFkIHdoaWxlIFdFQktJVF9EUkFXIGlzIGp1c3QgcHVsbGVkIG91dCBvZiB0aGUKICAgICAgICAgLy8gcXVldWUgaW4gV2ViQ29yZSB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuIFRoZW4gdXBkYXRlIHdvbid0IGJlIGJsb2NrZWQuCiAgICAgICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghY29yZS5nZXRTZXR0aW5ncygpLmVuYWJsZVNtb290aFRyYW5zaXRpb24oKSkgcmV0dXJuOworCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvcmUpIHsKICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlmIChjb3JlLm1EcmF3SXNTY2hlZHVsZWQpIHsKQEAgLTE4MzYsMTIgKzE4ODUsMTYgQEAKIAogICAgIHN0YXRpYyB2b2lkIHJlc3VtZVVwZGF0ZVBpY3R1cmUoV2ViVmlld0NvcmUgY29yZSkgewogICAgICAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpZiBtRHJhd0lzUGF1c2VkIGlzIHRydWUsIGlnbm9yZSB0aGUgc2V0dGluZywgY29udGludWUgdG8gcmVzdW1lCisgICAgICAgICAgICBpZiAoIWNvcmUubURyYXdJc1BhdXNlZAorICAgICAgICAgICAgICAgICAgICAmJiAhY29yZS5nZXRTZXR0aW5ncygpLmVuYWJsZVNtb290aFRyYW5zaXRpb24oKSkgcmV0dXJuOworCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNvcmUpIHsKICAgICAgICAgICAgICAgICBjb3JlLm1EcmF3SXNQYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoY29yZS5tRHJhd0lzU2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcmUubURyYXdJc1NjaGVkdWxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjb3JlLmNvbnRlbnREcmF3KCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsd2F5cyByZWRyYXcgb24gcmVzdW1lIHRvIHJlZW5hYmxlIGdpZiBhbmltYXRpb25zCisgICAgICAgICAgICAgICAgY29yZS5tRHJhd0lzU2NoZWR1bGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29yZS5uYXRpdmVDb250ZW50SW52YWxpZGF0ZUFsbCgpOworICAgICAgICAgICAgICAgIGNvcmUuY29udGVudERyYXcoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE5NzgsMjQgKzIwMzEsNiBAQAogICAgICAgICBtUmVwYWludFNjaGVkdWxlZCA9IGZhbHNlOwogICAgIH0KIAotICAgIC8vIGNhbGxlZCBieSBKTkkKLSAgICBwcml2YXRlIHZvaWQgc2VuZEltbWVkaWF0ZVJlcGFpbnQoKSB7Ci0gICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsICYmICFtUmVwYWludFNjaGVkdWxlZCkgewotICAgICAgICAgICAgbVJlcGFpbnRTY2hlZHVsZWQgPSB0cnVlOwotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlldy5JTU1FRElBVEVfUkVQQUlOVF9NU0dfSUQpLnNlbmRUb1RhcmdldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2FsbGVkIGJ5IEpOSQotICAgIHByaXZhdGUgdm9pZCBzZXRSb290TGF5ZXIoaW50IGxheWVyKSB7Ci0gICAgICAgIGlmIChtV2ViVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtV2ViVmlldy5tUHJpdmF0ZUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlNFVF9ST09UX0xBWUVSX01TR19JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qIHBhY2thZ2UgKi8gV2ViVmlldyBnZXRXZWJWaWV3KCkgewogICAgICAgICByZXR1cm4gbVdlYlZpZXc7CiAgICAgfQpAQCAtMjAxMiwxOCArMjA0NywyNCBAQAogCiAgICAgICAgIGlmIChtV2ViVmlldyA9PSBudWxsKSByZXR1cm47CiAKLSAgICAgICAgYm9vbGVhbiB1cGRhdGVSZXN0b3JlU3RhdGUgPSBzdGFuZGFyZExvYWQgfHwgbVJlc3RvcmVkU2NhbGUgPiAwOwotICAgICAgICBzZXR1cFZpZXdwb3J0KHVwZGF0ZVJlc3RvcmVTdGF0ZSk7CisgICAgICAgIGJvb2xlYW4gdXBkYXRlVmlld1N0YXRlID0gc3RhbmRhcmRMb2FkIHx8IG1SZXN0b3JlZFNjYWxlID4gMDsKKyAgICAgICAgc2V0dXBWaWV3cG9ydCh1cGRhdGVWaWV3U3RhdGUpOwogICAgICAgICAvLyBpZiB1cGRhdGVSZXN0b3JlU3RhdGUgaXMgdHJ1ZSwgVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCkgd2lsbAotICAgICAgICAvLyBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFdlYlZpZXcgcmVzdG9yZSB0aGUgc3RhdGUuIElmIHVwZGF0ZVJlc3RvcmVTdGF0ZQorICAgICAgICAvLyBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFdlYlZpZXcgdXBkYXRlcyBpdHMgc3RhdGUuIElmIHVwZGF0ZVJlc3RvcmVTdGF0ZQogICAgICAgICAvLyBpcyBmYWxzZSwgc3RhcnQgdG8gZHJhdyBub3cgYXMgaXQgaXMgcmVhZHkuCi0gICAgICAgIGlmICghdXBkYXRlUmVzdG9yZVN0YXRlKSB7CisgICAgICAgIGlmICghdXBkYXRlVmlld1N0YXRlKSB7CiAgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIucG9zdFJlYWR5VG9EcmF3QWxsKCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZW1vdmUgdGhlIHRvdWNoIGhpZ2hsaWdodCB3aGVuIG1vdmluZyB0byBhIG5ldyBwYWdlCisgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgeworICAgICAgICAgICAgbUV2ZW50SHViLnNlbmRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKG51bGwsCisgICAgICAgICAgICAgICAgICAgIEV2ZW50SHViLlJFTU9WRV9UT1VDSF9ISUdITElHSFRfUkVDVFMpKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHJlc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24sIHRoZSByZXN0b3JlZCBvZmZzZXQgYW5kIHNjYWxlcwogICAgICAgICBtV2Via2l0U2Nyb2xsWCA9IG1XZWJraXRTY3JvbGxZID0gbVJlc3RvcmVkWCA9IG1SZXN0b3JlZFkKLSAgICAgICAgICAgICAgICA9IG1SZXN0b3JlZFNjYWxlID0gbVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA9IDA7CisgICAgICAgICAgICAgICAgPSBtUmVzdG9yZWRTY2FsZSA9IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgPSAwOwogICAgIH0KIAogICAgIC8vIGNhbGxlZCBieSBKTkkKQEAgLTIwMzcsMTUgKzIwNzgsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXR1cFZpZXdwb3J0KGJvb2xlYW4gdXBkYXRlUmVzdG9yZVN0YXRlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNldHVwVmlld3BvcnQoYm9vbGVhbiB1cGRhdGVWaWV3U3RhdGUpIHsKICAgICAgICAgLy8gc2V0IHRoZSB2aWV3cG9ydCBzZXR0aW5ncyBmcm9tIFdlYktpdAogICAgICAgICBzZXRWaWV3cG9ydFNldHRpbmdzRnJvbU5hdGl2ZSgpOwogCiAgICAgICAgIC8vIGFkanVzdCB0aGUgZGVmYXVsdCBzY2FsZSB0byBtYXRjaCB0aGUgZGVuc2l0eURwaQogICAgICAgICBmbG9hdCBhZGp1c3QgPSAxLjBmOwogICAgICAgICBpZiAobVZpZXdwb3J0RGVuc2l0eURwaSA9PSAtMSkgewotICAgICAgICAgICAgaWYgKFdlYlZpZXcuREVGQVVMVF9TQ0FMRV9QRVJDRU5UICE9IDEwMCkgewotICAgICAgICAgICAgICAgIGFkanVzdCA9IFdlYlZpZXcuREVGQVVMVF9TQ0FMRV9QRVJDRU5UIC8gMTAwLjBmOworICAgICAgICAgICAgLy8gY29udmVydCBkZWZhdWx0IHpvb20gc2NhbGUgdG8gYSBpbnRlZ2VyIChwZXJjZW50YWdlKSB0byBhdm9pZCBhbnkKKyAgICAgICAgICAgIC8vIGlzc3VlcyB3aXRoIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb25zCisgICAgICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCAmJiAoaW50KShtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCkgKiAxMDApICE9IDEwMCkgeworICAgICAgICAgICAgICAgIGFkanVzdCA9IG1XZWJWaWV3LmdldERlZmF1bHRab29tU2NhbGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtVmlld3BvcnREZW5zaXR5RHBpID4gMCkgewogICAgICAgICAgICAgYWRqdXN0ID0gKGZsb2F0KSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHlEcGkKQEAgLTIwODcsMTcgKzIxMzAsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGlmIG1WaWV3cG9ydFdpZHRoIGlzIDAsIGl0IG1lYW5zIGRldmljZS13aWR0aCwgYWx3YXlzIHVwZGF0ZS4KLSAgICAgICAgaWYgKG1WaWV3cG9ydFdpZHRoICE9IDAgJiYgIXVwZGF0ZVJlc3RvcmVTdGF0ZSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlIHJlc3RvcmVTdGF0ZSA9IG5ldyBSZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tTWluU2NhbGUgPSBtVmlld3BvcnRNaW5pbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgICByZXN0b3JlU3RhdGUubU1heFNjYWxlID0gbVZpZXdwb3J0TWF4aW11bVNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgICAgcmVzdG9yZVN0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7CisgICAgICAgIGlmIChtVmlld3BvcnRXaWR0aCAhPSAwICYmICF1cGRhdGVWaWV3U3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBuZXcgVmlld1N0YXRlKCk7CisgICAgICAgICAgICB2aWV3U3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICAgICAgdmlld1N0YXRlLm1NYXhTY2FsZSA9IG1WaWV3cG9ydE1heGltdW1TY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICAgIHZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlID0gYWRqdXN0OwogICAgICAgICAgICAgLy8gYXMgbVZpZXdwb3J0V2lkdGggaXMgbm90IDAsIGl0IGlzIG5vdCBtb2JpbGUgc2l0ZS4KLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tTW9iaWxlU2l0ZSA9IGZhbHNlOworICAgICAgICAgICAgdmlld1N0YXRlLm1Nb2JpbGVTaXRlID0gZmFsc2U7CiAgICAgICAgICAgICAvLyBmb3Igbm9uLW1vYmlsZSBzaXRlLCB3ZSBkb24ndCBuZWVkIG1pblByZWZXaWR0aCwgc2V0IGl0IGFzIDAKLSAgICAgICAgICAgIHJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCA9IDA7CisgICAgICAgICAgICB2aWV3U3RhdGUubVNjcm9sbFggPSAwOwogICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVQREFURV9aT09NX1JBTkdFLCByZXN0b3JlU3RhdGUpLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgICAgICAgICBXZWJWaWV3LlVQREFURV9aT09NX1JBTkdFLCB2aWV3U3RhdGUpLnNlbmRUb1RhcmdldCgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTIxMTgsMzIgKzIxNjEsMzEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdlYlZpZXdXaWR0aCA9IE1hdGgucm91bmQodmlld3BvcnRXaWR0aCAqIG1DdXJyZW50Vmlld1NjYWxlKTsKICAgICAgICAgfQotICAgICAgICBtUmVzdG9yZVN0YXRlID0gbmV3IFJlc3RvcmVTdGF0ZSgpOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1NaW5TY2FsZSA9IG1WaWV3cG9ydE1pbmltdW1TY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubURlZmF1bHRTY2FsZSA9IGFkanVzdDsKLSAgICAgICAgbVJlc3RvcmVTdGF0ZS5tU2Nyb2xsWCA9IG1SZXN0b3JlZFg7Ci0gICAgICAgIG1SZXN0b3JlU3RhdGUubVNjcm9sbFkgPSBtUmVzdG9yZWRZOwotICAgICAgICBtUmVzdG9yZVN0YXRlLm1Nb2JpbGVTaXRlID0gKDAgPT0gbVZpZXdwb3J0V2lkdGgpOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZSA9IG5ldyBWaWV3U3RhdGUoKTsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubU1pblNjYWxlID0gbVZpZXdwb3J0TWluaW11bVNjYWxlIC8gMTAwLjBmOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtVmlld3BvcnRNYXhpbXVtU2NhbGUgLyAxMDAuMGY7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1EZWZhdWx0U2NhbGUgPSBhZGp1c3Q7CisgICAgICAgIG1Jbml0aWFsVmlld1N0YXRlLm1TY3JvbGxYID0gbVJlc3RvcmVkWDsKKyAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVNjcm9sbFkgPSBtUmVzdG9yZWRZOworICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSA9ICgwID09IG1WaWV3cG9ydFdpZHRoKTsKICAgICAgICAgaWYgKG1SZXN0b3JlZFNjYWxlID4gMCkgewotICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgICBpZiAobVJlc3RvcmVkU2NyZWVuV2lkdGhTY2FsZSA+IDApIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID0gbVJlc3RvcmVkU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgICBpZiAobVJlc3RvcmVkVGV4dFdyYXBTY2FsZSA+IDApIHsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IG1SZXN0b3JlZFRleHRXcmFwU2NhbGUgLyAxMDAuMGY7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUgPSBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGU7CisgICAgICAgICAgICAgICAgbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPSBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1WaWV3cG9ydEluaXRpYWxTY2FsZSA+IDApIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0KKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdwb3J0SW5pdGlhbFNjYWxlIC8gMTAwLjBmOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtVmlld3BvcnRXaWR0aCA+IDAgJiYgbVZpZXdwb3J0V2lkdGggPCB3ZWJWaWV3V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPSBtUmVzdG9yZVN0YXRlLm1UZXh0V3JhcFNjYWxlID0KKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVRleHRXcmFwU2NhbGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSB3ZWJWaWV3V2lkdGggLyBtVmlld3BvcnRXaWR0aDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IGFkanVzdDsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSA9IGFkanVzdDsKICAgICAgICAgICAgICAgICAvLyAwIHdpbGwgdHJpZ2dlciBXZWJWaWV3IHRvIHR1cm4gb24gem9vbSBvdmVydmlldyBtb2RlCi0gICAgICAgICAgICAgICAgbVJlc3RvcmVTdGF0ZS5tVmlld1NjYWxlID0gMDsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFZpZXdTdGF0ZS5tVmlld1NjYWxlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMTg0LDE1ICsyMjI2LDE1IEBACiAgICAgICAgICAgICAgICAgLy8gbVZpZXdTY2FsZSBhcyAwIG1lYW5zIGl0IGlzIGluIHpvb20gb3ZlcnZpZXcgbW9kZS4gU28gd2UgZG9uJ3QKICAgICAgICAgICAgICAgICAvLyBrbm93IHRoZSBleGFjdCBzY2FsZS4gSWYgbVJlc3RvcmVkU2NhbGUgaXMgbm9uLXplcm8sIHVzZSBpdDsKICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UganVzdCB1c2UgbVRleHRXcmFwU2NhbGUgYXMgdGhlIGluaXRpYWwgc2NhbGUuCi0gICAgICAgICAgICAgICAgZGF0YS5tU2NhbGUgPSBtUmVzdG9yZVN0YXRlLm1WaWV3U2NhbGUgPT0gMAorICAgICAgICAgICAgICAgIGRhdGEubVNjYWxlID0gbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZSA9PSAwCiAgICAgICAgICAgICAgICAgICAgICAgICA/IChtUmVzdG9yZWRTY2FsZSA+IDAgPyBtUmVzdG9yZWRTY2FsZSAvIDEwMC4wZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbUluaXRpYWxWaWV3U3RhdGUubVZpZXdTY2FsZTsKICAgICAgICAgICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFV19DT1JFKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgInNldHVwVmlld3BvcnQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtUmVzdG9yZWRTY2FsZT0iICsgbVJlc3RvcmVkU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3U2NhbGU9IiArIG1SZXN0b3JlU3RhdGUubVZpZXdTY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbVRleHRXcmFwU2NhbGU9IiArIG1SZXN0b3JlU3RhdGUubVRleHRXcmFwU2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3U2NhbGU9IiArIG1Jbml0aWFsVmlld1N0YXRlLm1WaWV3U2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1UZXh0V3JhcFNjYWxlPSIgKyBtSW5pdGlhbFZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkYXRhLm1XaWR0aCA9IE1hdGgucm91bmQod2ViVmlld1dpZHRoIC8gZGF0YS5tU2NhbGUpOwpAQCAtMjIwNSw3ICsyMjQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Vmlld0hlaWdodCgpIC8gZGF0YS5tU2NhbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICA6IG1DdXJyZW50Vmlld0hlaWdodCAqIGRhdGEubVdpZHRoIC8gdmlld3BvcnRXaWR0aDsKICAgICAgICAgICAgICAgICBkYXRhLm1UZXh0V3JhcFdpZHRoID0gTWF0aC5yb3VuZCh3ZWJWaWV3V2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gbVJlc3RvcmVTdGF0ZS5tVGV4dFdyYXBTY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvIG1Jbml0aWFsVmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlKTsKICAgICAgICAgICAgICAgICBkYXRhLm1JZ25vcmVIZWlnaHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBkYXRhLm1BbmNob3JYID0gZGF0YS5tQW5jaG9yWSA9IDA7CiAgICAgICAgICAgICAgICAgLy8gc2VuZCBWSUVXX1NJWkVfQ0hBTkdFRCB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIHNvIHRoYXQgd2UKQEAgLTIyMTgsMjAgKzIyNjAsMTIgQEAKICAgICB9CiAKICAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY2FsZShpbnQgc2NhbGUpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNjYWxlKGludCBzY2FsZSwgaW50IHRleHRXcmFwU2NhbGUpIHsKICAgICAgICAgaWYgKG1Ccm93c2VyRnJhbWUuZmlyc3RMYXlvdXREb25lKCkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1SZXN0b3JlZFNjYWxlID0gc2NhbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYWxsZWQgYnkgSk5JCi0gICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVTY3JlZW5XaWR0aFNjYWxlKGludCBzY2FsZSkgewotICAgICAgICBpZiAoIW1TZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Ccm93c2VyRnJhbWUuZmlyc3RMYXlvdXREb25lKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIG1SZXN0b3JlZFNjcmVlbldpZHRoU2NhbGUgPSBzY2FsZTsKKyAgICAgICAgICAgIGlmIChtU2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKKyAgICAgICAgICAgICAgICBtUmVzdG9yZWRUZXh0V3JhcFNjYWxlID0gdGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjI4MSw2ICsyMzE1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVVwZGF0ZUZyYW1lQ2FjaGVJZkxvYWRpbmcoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVJldmVhbFNlbGVjdGlvbigpOwogICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBuYXRpdmVSZXF1ZXN0TGFiZWwoaW50IGZyYW1lUHRyLCBpbnQgbm9kZVB0cik7CiAgICAgLyoqCiAgICAgICogU2Nyb2xsIHRoZSBmb2N1c2VkIHRleHRmaWVsZCB0byAoeFBlcmNlbnQsIHkpIGluIGRvY3VtZW50IHNwYWNlCkBAIC0yNDY5LDYgKzI1MDQsMjQgQEAKICAgICAgICAgICAgICAgICBoTW9kZSwgdk1vZGUpLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB1c2VNb2NrRGV2aWNlT3JpZW50YXRpb24oKSB7CisgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIudXNlTW9jaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbURldmljZU9yaWVudGF0aW9uTWFuYWdlci5zZXRNb2NrT3JpZW50YXRpb24oY2FuUHJvdmlkZUFscGhhLCBhbHBoYSwgY2FuUHJvdmlkZUJldGEsIGJldGEsCisgICAgICAgICAgICAgICAgY2FuUHJvdmlkZUdhbW1hLCBnYW1tYSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIERldmljZU9yaWVudGF0aW9uU2VydmljZSBnZXREZXZpY2VPcmllbnRhdGlvblNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VPcmllbnRhdGlvblNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgRGV2aWNlT3JpZW50YXRpb25TZXJ2aWNlKG1EZXZpY2VPcmllbnRhdGlvbk1hbmFnZXIsIG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldmljZU9yaWVudGF0aW9uU2VydmljZTsKKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVBhdXNlKCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVSZXN1bWUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUZyZWVNZW1vcnkoKTsKQEAgLTI0NzYsNCArMjUyOSw2IEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBuYXRpdmVWYWxpZE5vZGVBbmRCb3VuZHMoaW50IGZyYW1lLCBpbnQgbm9kZSwKICAgICAgICAgICAgIFJlY3QgYm91bmRzKTsKIAorICAgIHByaXZhdGUgbmF0aXZlIEFycmF5TGlzdDxSZWN0PiBuYXRpdmVHZXRUb3VjaEhpZ2hsaWdodFJlY3RzKGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgIGludCBzbG9wKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3RGF0YWJhc2UuamF2YQppbmRleCA3YWNkOWJhLi5kN2I0NDUyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0RhdGFiYXNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdEYXRhYmFzZS5qYXZhCkBAIC0xNzMsMTEyICsxNzMsMTQwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNhY2hlVHJhbnNhY3Rpb25SZWZjb3VudDsKIAotICAgIHByaXZhdGUgV2ViVmlld0RhdGFiYXNlKCkgeworICAgIC8vIEluaXRpYWxseSB0cnVlIHVudGlsIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0ZXMuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBXZWJWaWV3RGF0YWJhc2UoZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbml0KGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKICAgICAgICAgLy8gU2luZ2xldG9uIG9ubHksIHVzZSBnZXRJbnN0YW5jZSgpCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgV2ViVmlld0RhdGFiYXNlIGdldEluc3RhbmNlKENvbnRleHQgY29udGV4dCkgewogICAgICAgICBpZiAobUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBXZWJWaWV3RGF0YWJhc2UoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW5PckNyZWF0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKERBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgV2ViVmlld0RhdGFiYXNlKGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQogCi0gICAgICAgICAgICAvLyBtRGF0YWJhc2Ugc2hvdWxkIG5vdCBiZSBudWxsLCAKLSAgICAgICAgICAgIC8vIHRoZSBvbmx5IGNhc2UgaXMgUmVxdWVzdEFQSSB0ZXN0IGhhcyBwcm9ibGVtIHRvIGNyZWF0ZSBkYiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCAmJiBtRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IERBVEFCQVNFX1ZFUlNJT04pIHsKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtRGF0YWJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcwotICAgICAgICAgICAgICAgIC8vIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFzIGRhdGFiYXNlJ3MgUmVlbnRyYW50TG9jayBpcyBleHBhbnNpdmUKLSAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0RBVEFCQVNFX0ZJTEUsIDAsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmRlbGV0ZURhdGFiYXNlKENBQ0hFX0RBVEFCQVNFX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwgCi0gICAgICAgICAgICAvLyB0aGUgb25seSBjYXNlIGlzIFJlcXVlc3RBUEkgdGVzdCBoYXMgcHJvYmxlbSB0byBjcmVhdGUgZGIgCi0gICAgICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtQ2FjaGVEYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gQ0FDSEVfREFUQUJBU0VfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cGdyYWRlQ2FjaGVEYXRhYmFzZSgpOwotICAgICAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEVyYXNlIHRoZSBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbSBpbiB0aGUgCi0gICAgICAgICAgICAgICAgLy8gY2FzZSB0aGF0IHRoZSBkYXRhYmFzZSB3YXMgdXBkYXRlZCBhbmQgdGhlIAotICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAotICAgICAgICAgICAgICAgIENhY2hlTWFuYWdlci5yZW1vdmVBbGxDYWNoZUZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHJlYWRfdW5jb21taXR0ZWQgdG8gc3BlZWQgdXAgUkVBRAotICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmV4ZWNTUUwoIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gdHJ1ZTsiKTsKLSAgICAgICAgICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWRfdW5jb21taXR0ZWQgaXMgdXNlZCwgd2UgY2FuIHR1cm4gb2ZmIGRhdGFiYXNlIGxvY2sKLSAgICAgICAgICAgICAgICAvLyB0byB1c2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgLy8gdXNlIEluc2VydEhlbHBlciBmb3IgZmFzdGVyIGluc2VydGlvbgotICAgICAgICAgICAgICAgIG1DYWNoZUluc2VydGVyID0gbmV3IERhdGFiYXNlVXRpbHMuSW5zZXJ0SGVscGVyKG1DYWNoZURhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIik7Ci0gICAgICAgICAgICAgICAgbUNhY2hlVXJsQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUZpbGVQYXRoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0ZJTEVfUEFUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTEFTVF9NT0RJRllfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFVGFnQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VYUElSRVNfU1RSSU5HX0NPTCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlTWltZVR5cGVDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVFbmNvZGluZ0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FTkNPRElOR19DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfSFRUUF9TVEFUVVNfQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVMb2NhdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnRMZW5ndGhDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVExFTkdUSF9DT0wpOwotICAgICAgICAgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5URElTUE9TSVRJT05fQ09MKTsKLSAgICAgICAgICAgICAgICBtQ2FjaGVDcm9zc0RvbWFpbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBieSBkZWxldGluZyB0aGUgb2xkIGRiIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICBpZiAoY29udGV4dC5kZWxldGVEYXRhYmFzZShEQVRBQkFTRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoREFUQUJBU0VfRklMRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgLy8gbURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhYmFzZS5nZXRWZXJzaW9uKCkgIT0gREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwZXIgdGFibGUgTXV0ZXggbG9jaywgdHVybiBvZmYgZGF0YWJhc2UgbG9jaywgdGhpcworICAgICAgICAvLyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhcyBkYXRhYmFzZSdzIFJlZW50cmFudExvY2sgaXMKKyAgICAgICAgLy8gZXhwYW5zaXZlCisgICAgICAgIG1EYXRhYmFzZS5zZXRMb2NraW5nRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgQ0FDSEVfREFUQUJBU0VfRklMRSwgMCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4gYnkgZGVsZXRpbmcgdGhlIG9sZCBkYiBhbmQgY3JlYXRlIGEgbmV3IG9uZQorICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZXRlRGF0YWJhc2UoQ0FDSEVfREFUQUJBU0VfRklMRSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGVEYXRhYmFzZSA9IGNvbnRleHQub3Blbk9yQ3JlYXRlRGF0YWJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9EQVRBQkFTRV9GSUxFLCAwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1DYWNoZURhdGFiYXNlIHNob3VsZCBub3QgYmUgbnVsbCwKKyAgICAgICAgLy8gdGhlIG9ubHkgY2FzZSBpcyBSZXF1ZXN0QVBJIHRlc3QgaGFzIHByb2JsZW0gdG8gY3JlYXRlIGRiCisgICAgICAgIGlmIChtQ2FjaGVEYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UuZ2V0VmVyc2lvbigpICE9IENBQ0hFX0RBVEFCQVNFX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXBncmFkZUNhY2hlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBib290c3RyYXBDYWNoZURhdGFiYXNlKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1DYWNoZURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFcmFzZSB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gaW4gdGhlCisgICAgICAgICAgICAvLyBjYXNlIHRoYXQgdGhlIGRhdGFiYXNlIHdhcyB1cGRhdGVkIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIHRoZXJlIHdlcmUgZXhpc3RpbmcgY2FjaGUgY29udGVudAorICAgICAgICAgICAgQ2FjaGVNYW5hZ2VyLnJlbW92ZUFsbENhY2hlRmlsZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSByZWFkX3VuY29tbWl0dGVkIHRvIHNwZWVkIHVwIFJFQUQKKyAgICAgICAgbUNhY2hlRGF0YWJhc2UuZXhlY1NRTCgiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlOyIpOworICAgICAgICAvLyBhcyBvbmx5IFJFQUQgY2FuIGJlIGNhbGxlZCBpbiB0aGUKKyAgICAgICAgLy8gbm9uLVdlYlZpZXdXb3JrZXJUaHJlYWQsIGFuZCByZWFkX3VuY29tbWl0dGVkIGlzIHVzZWQsCisgICAgICAgIC8vIHdlIGNhbiB0dXJuIG9mZiBkYXRhYmFzZSBsb2NrIHRvIHVzZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgbUNhY2hlRGF0YWJhc2Uuc2V0TG9ja2luZ0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIC8vIHVzZSBJbnNlcnRIZWxwZXIgZm9yIGZhc3RlciBpbnNlcnRpb24KKyAgICAgICAgbUNhY2hlSW5zZXJ0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBEYXRhYmFzZVV0aWxzLkluc2VydEhlbHBlcihtQ2FjaGVEYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWNoZSIpOworICAgICAgICBtQ2FjaGVVcmxDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX1VSTF9DT0wpOworICAgICAgICBtQ2FjaGVGaWxlUGF0aENvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRklMRV9QQVRIX0NPTCk7CisgICAgICAgIG1DYWNoZUxhc3RNb2RpZnlDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0xBU1RfTU9ESUZZX0NPTCk7CisgICAgICAgIG1DYWNoZUVUYWdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VUQUdfQ09MKTsKKyAgICAgICAgbUNhY2hlRXhwaXJlc0NvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfRVhQSVJFU19DT0wpOworICAgICAgICBtQ2FjaGVFeHBpcmVzU3RyaW5nQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9FWFBJUkVTX1NUUklOR19DT0wpOworICAgICAgICBtQ2FjaGVNaW1lVHlwZUNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfTUlNRVRZUEVfQ09MKTsKKyAgICAgICAgbUNhY2hlRW5jb2RpbmdDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0VOQ09ESU5HX0NPTCk7CisgICAgICAgIG1DYWNoZUh0dHBTdGF0dXNDb2xJbmRleCA9IG1DYWNoZUluc2VydGVyCisgICAgICAgICAgICAgICAgLmdldENvbHVtbkluZGV4KENBQ0hFX0hUVFBfU1RBVFVTX0NPTCk7CisgICAgICAgIG1DYWNoZUxvY2F0aW9uQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9MT0NBVElPTl9DT0wpOworICAgICAgICBtQ2FjaGVDb250ZW50TGVuZ3RoQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DT05URU5UTEVOR1RIX0NPTCk7CisgICAgICAgIG1DYWNoZUNvbnRlbnREaXNwb3NpdGlvbkNvbEluZGV4ID0gbUNhY2hlSW5zZXJ0ZXIKKyAgICAgICAgICAgICAgICAuZ2V0Q29sdW1uSW5kZXgoQ0FDSEVfQ09OVEVOVERJU1BPU0lUSU9OX0NPTCk7CisgICAgICAgIG1DYWNoZUNyb3NzRG9tYWluQ29sSW5kZXggPSBtQ2FjaGVJbnNlcnRlcgorICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5JbmRleChDQUNIRV9DUk9TU0RPTUFJTl9DT0wpOworCisgICAgICAgIC8vIFRocmVhZCBkb25lLCBub3RpZnkuCisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIG5vdGlmeSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBncmFkZURhdGFiYXNlKCkgewpAQCAtMzkxLDggKzQxOSwyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2FpdCBmb3IgdGhlIGJhY2tncm91bmQgaW5pdGlhbGl6YXRpb24gdGhyZWFkIHRvIGNvbXBsZXRlIGFuZCBjaGVjayB0aGUKKyAgICAvLyBkYXRhYmFzZSBjcmVhdGlvbiBzdGF0dXMuCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsICJDYXVnaHQgZXhjZXB0aW9uIHdoaWxlIGNoZWNraW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXphdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dUQUcsIExvZy5nZXRTdGFja1RyYWNlU3RyaW5nKGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EYXRhYmFzZSAhPSBudWxsOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFbnRyaWVzKGludCB0YWJsZUlkKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTQyMiw3ICs0NjcsNyBAQAogICAgICAqLwogICAgIEFycmF5TGlzdDxDb29raWU+IGdldENvb2tpZXNGb3JEb21haW4oU3RyaW5nIGRvbWFpbikgewogICAgICAgICBBcnJheUxpc3Q8Q29va2llPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb29raWU+KCk7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgICAgIH0KIApAQCAtNDgxLDcgKzUyNiw3IEBACiAgICAgICogICAgICAgICAgICBkZWxldGVkLgogICAgICAqLwogICAgIHZvaWQgZGVsZXRlQ29va2llcyhTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTAxLDcgKzU0Niw3IEBACiAgICAgICovCiAgICAgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgewogICAgICAgICBpZiAoY29va2llLmRvbWFpbiA9PSBudWxsIHx8IGNvb2tpZS5wYXRoID09IG51bGwgfHwgY29va2llLm5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTUzNCw3ICs1NzksNyBAQAogICAgICAqIENsZWFyIGNvb2tpZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDb29raWVzKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC01NDcsNyArNTkyLDcgQEAKICAgICAgKiBDbGVhciBzZXNzaW9uIGNvb2tpZXMsIHdoaWNoIG1lYW5zIGNvb2tpZSBkb2Vzbid0IGhhdmUgRVhQSVJFUy4KICAgICAgKi8KICAgICB2b2lkIGNsZWFyU2Vzc2lvbkNvb2tpZXMoKSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTU2NCw3ICs2MDksNyBAQAogICAgICAqIEBwYXJhbSBub3cgVGltZSBmb3Igbm93CiAgICAgICovCiAgICAgdm9pZCBjbGVhckV4cGlyZWRDb29raWVzKGxvbmcgbm93KSB7Ci0gICAgICAgIGlmIChtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTYyMCw3ICs2NjUsNyBAQAogICAgICAqIEByZXR1cm4gQ2FjaGVSZXN1bHQgVGhlIENhY2hlTWFuYWdlci5DYWNoZVJlc3VsdAogICAgICAqLwogICAgIENhY2hlUmVzdWx0IGdldENhY2hlKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTY2MCw3ICs3MDUsNyBAQAogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybAogICAgICAqLwogICAgIHZvaWQgcmVtb3ZlQ2FjaGUoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTY3NCw3ICs3MTksNyBAQAogICAgICAqIEBwYXJhbSBjIFRoZSBDYWNoZU1hbmFnZXIuQ2FjaGVSZXN1bHQKICAgICAgKi8KICAgICB2b2lkIGFkZENhY2hlKFN0cmluZyB1cmwsIENhY2hlUmVzdWx0IGMpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDAsNyArNzQ1LDcgQEAKICAgICAgKiBDbGVhciBjYWNoZSBkYXRhYmFzZQogICAgICAqLwogICAgIHZvaWQgY2xlYXJDYWNoZSgpIHsKLSAgICAgICAgaWYgKG1DYWNoZURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC03MDgsNyArNzUzLDcgQEAKICAgICB9CiAKICAgICBib29sZWFuIGhhc0NhY2hlKCkgewotICAgICAgICBpZiAobUNhY2hlRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAoIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTgzNCw3ICs4NzksNyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0VXNlcm5hbWVQYXNzd29yZChTdHJpbmcgc2NoZW1lUGx1c0hvc3QsIFN0cmluZyB1c2VybmFtZSwKICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgbURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKHNjaGVtZVBsdXNIb3N0ID09IG51bGwgfHwgIWNoZWNrSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTg1Niw3ICs5MDEsNyBAQAogICAgICAqICAgICAgICAgU3RyaW5nWzFdIGlzIHBhc3N3b3JkLiBSZXR1cm4gbnVsbCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nLgogICAgICAqLwogICAgIFN0cmluZ1tdIGdldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIHNjaGVtZVBsdXNIb3N0KSB7Ci0gICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChzY2hlbWVQbHVzSG9zdCA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTkwMiw3ICs5NDcsNyBAQAogICAgICAqIENsZWFyIHBhc3N3b3JkIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJVc2VybmFtZVBhc3N3b3JkKCkgewotICAgICAgICBpZiAobURhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgaWYgKCFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05MjcsNyArOTcyLDcgQEAKICAgICAgKi8KICAgICB2b2lkIHNldEh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZChTdHJpbmcgaG9zdCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCiAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgcmVhbG0gPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtOTUyLDcgKzk5Nyw3IEBACiAgICAgICogICAgICAgICBTdHJpbmdbMV0gaXMgcGFzc3dvcmQuIFJldHVybiBudWxsIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcuCiAgICAgICovCiAgICAgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8IG1EYXRhYmFzZSA9PSBudWxsKXsKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByZWFsbSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIApAQCAtOTk5LDcgKzEwNDQsNyBAQAogICAgICAqIENsZWFyIEhUVFAgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGF0YWJhc2UKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckh0dHBBdXRoVXNlcm5hbWVQYXNzd29yZCgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTAyMCw3ICsxMDY1LDcgQEAKICAgICAgKiBAcGFyYW0gZm9ybWRhdGEgVGhlIGZvcm0gZGF0YSBpbiBIYXNoTWFwCiAgICAgICovCiAgICAgdm9pZCBzZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtZGF0YSkgewotICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgZm9ybWRhdGEgPT0gbnVsbCB8fCAhY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMTA2OSw3ICsxMTE0LDcgQEAKICAgICAgKi8KICAgICBBcnJheUxpc3Q8U3RyaW5nPiBnZXRGb3JtRGF0YShTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCB8fCBtRGF0YWJhc2UgPT0gbnVsbCkgeworICAgICAgICBpZiAodXJsID09IG51bGwgfHwgbmFtZSA9PSBudWxsIHx8ICFjaGVja0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgICAgIH0KIApAQCAtMTEyOSw3ICsxMTc0LDcgQEAKICAgICAgKiBDbGVhciBmb3JtIGRhdGFiYXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKLSAgICAgICAgaWYgKG1EYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgIGlmICghY2hlY2tJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWU4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xCYXNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbnRlcmZhY2UgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIC8qKgorICAgICAqIENhdXNlcyB0aGUgb24tc2NyZWVuIHpvb20gY29udHJvbCB0byBiZSBtYWRlIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIG9uLXNjcmVlbiB6b29tIGNvbnRyb2wgdG8gZGlzYXBwZWFyCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGlkZSgpOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGUgY29udHJvbCB0byB1cGRhdGUgaXRzIHN0YXRlIGlmIG5lY2Vzc2FyeSBpbiByZXNwb25zZSB0byBhCisgICAgICogY2hhbmdlIGluIHRoZSBwYWdlcyB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSwgaWYgdGhlIG1heCB6b29tIGxldmVsIGlzCisgICAgICogcmVhY2hlZCB0aGVuIHRoZSBjb250cm9sIGNhbiBkaXNhYmxlIHRoZSBidXR0b24gZm9yIHpvb21pbmcgaW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21Db250cm9sRW1iZWRkZWQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5ZTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLndlYmtpdDsKKworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCitjbGFzcyBab29tQ29udHJvbEVtYmVkZGVkIGltcGxlbWVudHMgWm9vbUNvbnRyb2xCYXNlIHsKKworICAgIHByaXZhdGUgZmluYWwgWm9vbU1hbmFnZXIgbVpvb21NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIC8vIFRoZSBjb250cm9sbGVyIGlzIGxhemlseSBpbml0aWFsaXplZCBpbiBnZXRDb250cm9scygpIGZvciBwZXJmb3JtYW5jZS4KKyAgICBwcml2YXRlIFpvb21CdXR0b25zQ29udHJvbGxlciBtWm9vbUJ1dHRvbnNDb250cm9sbGVyOworCisgICAgcHVibGljIFpvb21Db250cm9sRW1iZWRkZWQoWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIsIFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtWm9vbU1hbmFnZXIgPSB6b29tTWFuYWdlcjsKKyAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIGlmICghZ2V0Q29udHJvbHMoKS5pc1Zpc2libGUoKSAmJiAhbVpvb21NYW5hZ2VyLmlzWm9vbVNjYWxlRml4ZWQoKSkgeworCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNldHRpbmdzLmdldERvdWJsZVRhcFRvYXN0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChtWm9vbU1hbmFnZXIuaXNJblpvb21PdmVydmlldygpICYmIGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoLS1jb3VudCk7CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQobVdlYlZpZXcuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZG91YmxlX3RhcF90b2FzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9MT05HKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlciAhPSBudWxsICYmIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuaXNWaXNpYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgeworICAgICAgICBpZiAobVpvb21CdXR0b25zQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNhblpvb21JbiA9IG1ab29tTWFuYWdlci5jYW5ab29tSW4oKTsKKyAgICAgICAgYm9vbGVhbiBjYW5ab29tT3V0ID0gbVpvb21NYW5hZ2VyLmNhblpvb21PdXQoKSAmJiAhbVpvb21NYW5hZ2VyLmlzSW5ab29tT3ZlcnZpZXcoKTsKKyAgICAgICAgaWYgKCFjYW5ab29tSW4gJiYgIWNhblpvb21PdXQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgdGhlIHpvb20gaW4gYW5kIG91dCBidXR0b25zIGlmIHRoZSBwYWdlIGNhbm5vdCB6b29tCisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNldCBlYWNoIG9uZSBpbmRpdmlkdWFsbHksIGFzIGEgcGFnZSBtYXkgYmUgYWJsZSB0byB6b29tIGluIG9yIG91dAorICAgICAgICAgICAgbVpvb21CdXR0b25zQ29udHJvbGxlci5zZXRab29tSW5FbmFibGVkKGNhblpvb21Jbik7CisgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLnNldFpvb21PdXRFbmFibGVkKGNhblpvb21PdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBab29tQnV0dG9uc0NvbnRyb2xsZXIgZ2V0Q29udHJvbHMoKSB7CisgICAgICAgIGlmIChtWm9vbUJ1dHRvbnNDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIgPSBuZXcgWm9vbUJ1dHRvbnNDb250cm9sbGVyKG1XZWJWaWV3KTsKKyAgICAgICAgICAgIG1ab29tQnV0dG9uc0NvbnRyb2xsZXIuc2V0T25ab29tTGlzdGVuZXIobmV3IFpvb21MaXN0ZW5lcigpKTsKKyAgICAgICAgICAgIC8vIFpvb21CdXR0b25zQ29udHJvbGxlciBwb3NpdGlvbnMgdGhlIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSwgYnV0IGluCisgICAgICAgICAgICAvLyB0aGUgbWlkZGxlLiBDaGFuZ2UgdGhlaXIgbGF5b3V0IHBhcmFtZXRlcnMgc28gdGhleSBhcHBlYXIgb24gdGhlCisgICAgICAgICAgICAvLyByaWdodC4KKyAgICAgICAgICAgIFZpZXcgY29udHJvbHMgPSBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpOworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMgPSBjb250cm9scy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAoKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcykgcGFyYW1zKS5ncmF2aXR5ID0gR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21CdXR0b25zQ29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFpvb21MaXN0ZW5lciBpbXBsZW1lbnRzIFpvb21CdXR0b25zQ29udHJvbGxlci5Pblpvb21MaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuc3dpdGNoT3V0RHJhd0hpc3RvcnkoKTsKKyAgICAgICAgICAgICAgICAvLyBCcmluZyBiYWNrIHRoZSBoaWRkZW4gem9vbSBjb250cm9scy4KKyAgICAgICAgICAgICAgICBtWm9vbUJ1dHRvbnNDb250cm9sbGVyLmdldFpvb21Db250cm9scygpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uWm9vbShib29sZWFuIHpvb21JbikgeworICAgICAgICAgICAgaWYgKHpvb21JbikgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lnpvb21JbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9ab29tQ29udHJvbEV4dGVybmFsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbUNvbnRyb2xFeHRlcm5hbC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQERlcHJlY2F0ZWQKK2NsYXNzIFpvb21Db250cm9sRXh0ZXJuYWwgaW1wbGVtZW50cyBab29tQ29udHJvbEJhc2UgeworCisgICAgLy8gVGhlIHRpbWUgdGhhdCB0aGUgZXh0ZXJuYWwgY29udHJvbHMgYXJlIHZpc2libGUgYmVmb3JlIGZhZGluZyBhd2F5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBaT09NX0NPTlRST0xTX1RJTUVPVVQgPQorICAgICAgICAgICAgVmlld0NvbmZpZ3VyYXRpb24uZ2V0Wm9vbUNvbnRyb2xzVGltZW91dCgpOworICAgIC8vIFRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIGV4dGVybmFsIHpvb20gY29udHJvbHMKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIG1ab29tQ29udHJvbHM7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtWm9vbUNvbnRyb2xSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVByaXZhdGVIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKKworICAgIHB1YmxpYyBab29tQ29udHJvbEV4dGVybmFsKFdlYlZpZXcgd2ViVmlldykgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgaWYobVpvb21Db250cm9sUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtWm9vbUNvbnRyb2xSdW5uYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29udHJvbHMoKS5zaG93KHRydWUpOworICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGlkZSgpIHsKKyAgICAgICAgaWYgKG1ab29tQ29udHJvbFJ1bm5hYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtWm9vbUNvbnRyb2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ab29tQ29udHJvbHMuaGlkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgeworICAgICAgICByZXR1cm4gbVpvb21Db250cm9scyAhPSBudWxsICYmIG1ab29tQ29udHJvbHMuaXNTaG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsgfQorCisgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGdldENvbnRyb2xzKCkgeworICAgICAgICBpZiAobVpvb21Db250cm9scyA9PSBudWxsKSB7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xzID0gY3JlYXRlWm9vbUNvbnRyb2xzKCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBuZWVkIHRvIGJlIHNldCB0byBWSVNJQkxFIGZpcnN0IHNvIHRoYXQgZ2V0TWVhc3VyZWRIZWlnaHQoKSBpbgorICAgICAgICAgICAgICoge0BsaW5rICNvblNpemVDaGFuZ2VkKCl9IGNhbiByZXR1cm4gdGhlIG1lYXN1cmVkIHZhbHVlIGZvciBwcm9wZXIKKyAgICAgICAgICAgICAqIGxheW91dC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVpvb21Db250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtWm9vbUNvbnRyb2xSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc21pc3MgdGhlIGNvbnRyb2xzIGlmIHRoZSB1c2VyIGhhcworICAgICAgICAgICAgICAgICAgICAgKiBmb2N1cyBvbiB0aGVtLiBXYWl0IGFuZCBjaGVjayBhZ2FpbiBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbVpvb21Db250cm9scy5oYXNGb2N1cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbUNvbnRyb2xzLmhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3REZWxheWVkKG1ab29tQ29udHJvbFJ1bm5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaT09NX0NPTlRST0xTX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVpvb21Db250cm9sczsKKyAgICB9CisKKyAgICBwcml2YXRlIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGNyZWF0ZVpvb21Db250cm9scygpIHsKKyAgICAgICAgRXh0ZW5kZWRab29tQ29udHJvbHMgem9vbUNvbnRyb2xzID0gbmV3IEV4dGVuZGVkWm9vbUNvbnRyb2xzKG1XZWJWaWV3LmdldENvbnRleHQoKSk7CisgICAgICAgIHpvb21Db250cm9scy5zZXRPblpvb21JbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1ab29tQ29udHJvbFJ1bm5hYmxlKTsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdERlbGF5ZWQobVpvb21Db250cm9sUnVubmFibGUsIFpPT01fQ09OVFJPTFNfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgbVdlYlZpZXcuem9vbUluKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB6b29tQ29udHJvbHMuc2V0T25ab29tT3V0Q2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCB0aW1lIG91dAorICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVpvb21Db250cm9sUnVubmFibGUpOworICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0RGVsYXllZChtWm9vbUNvbnRyb2xSdW5uYWJsZSwgWk9PTV9DT05UUk9MU19USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlldy56b29tT3V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gem9vbUNvbnRyb2xzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkWm9vbUNvbnRyb2xzIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIHByaXZhdGUgYW5kcm9pZC53aWRnZXQuWm9vbUNvbnRyb2xzIG1QbHVzTWludXNab29tQ29udHJvbHM7CisKKyAgICAgICAgcHVibGljIEV4dGVuZGVkWm9vbUNvbnRyb2xzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCk7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC56b29tX21hZ25pZnksIHRoaXMsIHRydWUpOworICAgICAgICAgICAgbVBsdXNNaW51c1pvb21Db250cm9scyA9IChhbmRyb2lkLndpZGdldC5ab29tQ29udHJvbHMpIGZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC56b29tQ29udHJvbHMpOworICAgICAgICAgICAgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuem9vbU1hZ25pZnkpLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KGJvb2xlYW4gc2hvd1pvb20pIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0VmlzaWJpbGl0eShzaG93Wm9vbSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBmYWRlKFZpZXcuVklTSUJMRSwgMC4wZiwgMS4wZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICAgICAgZmFkZShWaWV3LkdPTkUsIDEuMGYsIDAuMGYpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZhZGUoaW50IHZpc2liaWxpdHksIGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBBbHBoYUFuaW1hdGlvbiBhbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKHN0YXJ0QWxwaGEsIGVuZEFscGhhKTsKKyAgICAgICAgICAgIGFuaW0uc2V0RHVyYXRpb24oNTAwKTsKKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbHVzTWludXNab29tQ29udHJvbHMuaGFzRm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbUluQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1QbHVzTWludXNab29tQ29udHJvbHMuc2V0T25ab29tSW5DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIoT25DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtUGx1c01pbnVzWm9vbUNvbnRyb2xzLnNldE9uWm9vbU91dENsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzYwZTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw5MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TY2FsZUdlc3R1cmVEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBUaGUgWm9vbU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBXZWJWaWV3J3MgY3VycmVudCB6b29tCisgKiBsZXZlbCBzdGF0ZS4gIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBvbi1zY3JlZW4gem9vbSBjb250cm9scworICogYXMgd2VsbCBhcyBhbnkgYW5pbWF0aW9uIG9mIHRoZSBXZWJWaWV3IGR1ZSB0byB6b29taW5nLgorICoKKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHR3byBtZXRob2RzIGZvciBhbmltYXRpbmcgdGhlIHpvb20gb2YgYSBXZWJWaWV3LgorICoKKyAqICgxKSBUaGUgZmlyc3QgbWV0aG9kIGlzIHRyaWdnZXJlZCBieSBzdGFydFpvb21BbmltYXRpb24oLi4uKSBhbmQgaXMgYSBmaXhlZAorICogbGVuZ3RoIGFuaW1hdGlvbiB3aGVyZSB0aGUgZmluYWwgem9vbSBzY2FsZSBpcyBrbm93biBhdCBzdGFydHVwLiAgVGhpcyB0eXBlIG9mCisgKiBhbmltYXRpb24gbm90aWZpZXMgd2Via2l0IG9mIHRoZSBmaW5hbCBzY2FsZSBCRUZPUkUgaXQgYW5pbWF0ZXMuIFRoZSBhbmltYXRpb24KKyAqIGlzIHRoZW4gZG9uZSBieSBzY2FsaW5nIHRoZSBDQU5WQVMgaW5jcmVtZW50YWxseSBiYXNlZCBvbiBhIHN0ZXBwaW5nIGZ1bmN0aW9uLgorICoKKyAqICgyKSBUaGUgc2Vjb25kIG1ldGhvZCBpcyB0cmlnZ2VyZWQgYnkgYSBtdWx0aS10b3VjaCBwaW5jaCBhbmQgdGhlIG5ldyBzY2FsZQorICogaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgdXNlcidzIGdlc3R1cmUuIFRoaXMgdHlwZSBvZiBhbmltYXRpb24KKyAqIG9ubHkgbm90aWZpZXMgd2Via2l0IG9mIG5ldyBzY2FsZSBBRlRFUiB0aGUgZ2VzdHVyZSBpcyBjb21wbGV0ZS4gVGhlIGFuaW1hdGlvbgorICogZWZmZWN0IGlzIGFjaGlldmVkIGJ5IHNjYWxpbmcgdGhlIFZJRVdTIChib3RoIFdlYlZpZXcgYW5kIFZpZXdNYW5hZ2VyLkNoaWxkVmlldykKKyAqIHRvIHRoZSBuZXcgc2NhbGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIHVzZXIncyBnZXN0dXJlLgorICovCitjbGFzcyBab29tTWFuYWdlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1RBRyA9ICJ3ZWJ2aWV3Wm9vbSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFja1Byb3h5IG1DYWxsYmFja1Byb3h5OworCisgICAgLy8gV2lkZ2V0cyByZXNwb25zaWJsZSBmb3IgdGhlIG9uLXNjcmVlbiB6b29tIGZ1bmN0aW9ucyBvZiB0aGUgV2ViVmlldy4KKyAgICBwcml2YXRlIFpvb21Db250cm9sRW1iZWRkZWQgbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgcHJpdmF0ZSBab29tQ29udHJvbEV4dGVybmFsIG1FeHRlcm5hbFpvb21Db250cm9sOworCisgICAgLyoKKyAgICAgKiBGb3IgbGFyZ2Ugc2NyZWVuIGRldmljZXMsIHRoZSBkZWZhdWx0U2NhbGUgdXN1YWxseSBzZXQgdG8gMS4wIGFuZAorICAgICAqIGVxdWFsIHRvIHRoZSBvdmVydmlldyBzY2FsZSwgdG8gZGlmZmVyZW50aWF0ZSB0aGUgem9vbSBsZXZlbCBmb3IgZG91YmxlIHRhcHBpbmcsCisgICAgICogYSBtaW5pbXVtIHJlYWRpbmcgbGV2ZWwgc2NhbGUgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNSU5fUkVBRElOR19MRVZFTF9TQ0FMRSA9IDEuNWY7CisKKyAgICAvKgorICAgICAqIFRoZSBzY2FsZSBmYWN0b3JzIHRoYXQgZGV0ZXJtaW5lIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGZvciB0aGUKKyAgICAgKiBkZWZhdWx0IHpvb20gc2NhbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiA9IDQuMDBmOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgPSAwLjI1ZjsKKworICAgIC8vIFRoZSBkZWZhdWx0IHNjYWxlIGxpbWl0cywgd2hpY2ggYXJlIGRlcGVuZGVudCBvbiB0aGUgZGlzcGxheSBkZW5zaXR5LgorICAgIHByaXZhdGUgZmxvYXQgbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdE1pblpvb21TY2FsZTsKKworICAgIC8vIFRoZSBhY3R1YWwgc2NhbGUgbGltaXRzLCB3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggYSB3ZWJwYWdlJ3Mgdmlld3BvcnQKKyAgICAvLyBtZXRhLXRhZy4KKyAgICBwcml2YXRlIGZsb2F0IG1NYXhab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtTWluWm9vbVNjYWxlOworCisgICAgLy8gTG9ja3MgdGhlIG1pbmltdW0gWm9vbVNjYWxlIHRvIHRoZSB2YWx1ZSBjdXJyZW50bHkgc2V0IGluIG1NaW5ab29tU2NhbGUuCisgICAgcHJpdmF0ZSBib29sZWFuIG1NaW5ab29tU2NhbGVGaXhlZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZW4gbG9hZGluZyBhIG5ldyBwYWdlIHRoZSBXZWJWaWV3IGRvZXMgbm90IGluaXRpYWxseSBrbm93IHRoZSBmaW5hbAorICAgICAqIHdpZHRoIG9mIHRoZSBwYWdlLiBUaGVyZWZvcmUsIHdoZW4gYSBuZXcgcGFnZSBpcyBsb2FkZWQgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAqIHRoZSBvdmVydmlldyBzY2FsZSBpcyBpbml0aWFsaXplZCB0byBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgZmxhZyBpcyB0aGVuCisgICAgICogc2V0IGFuZCB1c2VkIHRvIG5vdGlmeSB0aGUgWm9vbU1hbmFnZXIgdG8gdGFrZSB0aGUgd2lkdGggb2YgdGhlIG5leHQKKyAgICAgKiBwaWN0dXJlIGZyb20gd2Via2l0IGFuZCB1c2UgdGhhdCB3aWR0aCB0byBlbnRlciBpbnRvIHpvb20gb3ZlcnZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogV2hlbiBpbiB0aGUgem9vbSBvdmVydmlldyBtb2RlLCB0aGUgcGFnZSdzIHdpZHRoIGlzIGZ1bGx5IGZpdCB0byB0aGUKKyAgICAgKiBjdXJyZW50IHdpbmRvdy4gQWRkaXRpb25hbGx5IHdoaWxlIHRoZSBwYWdlIGlzIGluIHRoaXMgc3RhdGUgaXQgaXMKKyAgICAgKiBhY3RpdmUsIGluIG90aGVyIHdvcmRzLCB5b3UgY2FuIGNsaWNrIHRvIGZvbGxvdyB0aGUgbGlua3MuIFdlIGNhY2hlIGEKKyAgICAgKiBib29sZWFuIHRvIGVuYWJsZSB1cyB0byBxdWlja2x5IGNoZWNrIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBvdmVydmlldworICAgICAqIG1vZGUsIGJ1dCB0aGlzIHZhbHVlIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIGJ5IGNoYW5nZXMgdG8gdGhlIHpvb20KKyAgICAgKiBzY2FsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUluWm9vbU92ZXJ2aWV3ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbVpvb21PdmVydmlld1dpZHRoOworICAgIHByaXZhdGUgZmxvYXQgbUludlpvb21PdmVydmlld1dpZHRoOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YXJpYWJsZXMgdHJhY2sgdGhlIGNlbnRlciBwb2ludCBvZiB0aGUgem9vbSBhbmQgdGhleSBhcmUgdXNlZCB0bworICAgICAqIGRldGVybWluZSB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIHdlIHNob3VsZCB6b29tLiBUaGV5IGFyZSBzdG9yZWQgaW4gdmlldworICAgICAqIGNvb3JkaW5hdGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJYOworICAgIHByaXZhdGUgZmxvYXQgbVpvb21DZW50ZXJZOworCisgICAgLyoKKyAgICAgKiBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHNjcmVlbiBzaG91bGQgYmUKKyAgICAgKiBjZW50ZXJlZCBhZnRlciB6b29taW5nLiBJbiBvdGhlciB3b3JkcyBpdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgY2VudGVyCisgICAgICogcG9pbnQgb2YgdGhlIHZpc2libGUgZG9jdW1lbnQgYWZ0ZXIgdGhlIHBhZ2UgaGFzIGZpbmlzaGVkIHpvb21pbmcuIFRoaXMKKyAgICAgKiBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgem9vbSBtYXkgaGF2ZSBwb3RlbnRpYWxseSByZWZsb3dlZCB0aGUgdGV4dCBhbmQKKyAgICAgKiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgcHJvcGVyIHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IHJlbWFpbnMgb24gdGhlCisgICAgICogc2NyZWVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1BbmNob3JYOworICAgIHByaXZhdGUgaW50IG1BbmNob3JZOworCisgICAgLy8gVGhlIHNjYWxlIGZhY3RvciB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb2x1bW4gd2lkdGggZm9yIHRleHQKKyAgICBwcml2YXRlIGZsb2F0IG1UZXh0V3JhcFNjYWxlOworCisgICAgLyoKKyAgICAgKiBUaGUgZGVmYXVsdCB6b29tIHNjYWxlIGlzIHRoZSBzY2FsZSBmYWN0b3IgdXNlZCB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEKKyAgICAgKiB6b29tIGluIGJ5IGRvdWJsZSB0YXBwaW5nIG9uIHRoZSBXZWJWaWV3LiBUaGUgdmFsdWUgaXMgaW5pdGlhbGx5IHNldAorICAgICAqIGJhc2VkIG9uIHRoZSBkaXNwbGF5IGRlbnNpdHksIGJ1dCBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSB2aWEgdGhlCisgICAgICogV2ViU2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtRGVmYXVsdFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkRlZmF1bHRTY2FsZTsKKworICAgIC8vIHRoZSBjdXJyZW50IGNvbXB1dGVkIHpvb20gc2NhbGUgYW5kIGl0cyBpbnZlcnNlLgorICAgIHByaXZhdGUgZmxvYXQgbUFjdHVhbFNjYWxlOworICAgIHByaXZhdGUgZmxvYXQgbUludkFjdHVhbFNjYWxlOworICAgIAorICAgIC8qCisgICAgICogVGhlIGluaXRpYWwgc2NhbGUgZm9yIHRoZSBXZWJWaWV3LiAwIG1lYW5zIGRlZmF1bHQuIElmIGluaXRpYWwgc2NhbGUgaXMKKyAgICAgKiBncmVhdGVyIHRoYW4gMCB0aGUgV2ViVmlldyBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGFzIGl0cyBpbml0aWFsIHNjYWxlLiBUaGUKKyAgICAgKiB2YWx1ZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbnRlZ2VyIHBlcmNlbnRhZ2Ugc28gaXQgaXMgZ3VhcmVudGVlZCB0byBoYXZlCisgICAgICogbm8gbW9yZSB0aGFuIDIgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAgVGhpcyByZXN0cmljdGlvbgorICAgICAqIGFsbG93cyB1cyB0byBjb252ZXJ0IHRoZSBzY2FsZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBwZXJjZW50YWdlIGJ5IHNpbXBseQorICAgICAqIG11bHRpcGx5aW5nIHRoZSB2YWx1ZSBieSAxMDAuCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFNjYWxlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgTUlOSU1VTV9TQ0FMRV9JTkNSRU1FTlQgPSAwLjAxZjsKKworICAgIC8qCisgICAgICogVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IHRvIGJlIHVzZWQgZm9yIGFuaW1hdGluZyB6b29tLiBJZgorICAgICAqIG1ab29tU2NhbGUgaXMgbm9uLXplcm8gdGhlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHpvb20gYW5pbWF0aW9uLiBUaGUKKyAgICAgKiBvdGhlciB2YXJpYWJsZXMgYXJlIHVzZWQgYXMgYSBjYWNoZSAoZS5nLiBpbnZlcnNlKSBvciBhcyBhIHdheSB0byBzdG9yZQorICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgdmlldyBwcmlvciB0byBhbmltYXRpbmcgKGUuZy4gaW5pdGlhbCBzY3JvbGwgY29vcmRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZsb2F0IG1ab29tU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW52SW5pdGlhbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGZsb2F0IG1JbnZGaW5hbFpvb21TY2FsZTsKKyAgICBwcml2YXRlIGludCBtSW5pdGlhbFNjcm9sbFg7CisgICAgcHJpdmF0ZSBpbnQgbUluaXRpYWxTY3JvbGxZOworICAgIHByaXZhdGUgbG9uZyBtWm9vbVN0YXJ0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpPT01fQU5JTUFUSU9OX0xFTkdUSCA9IDUwMDsKKworICAgIC8vIHdoZXRoZXIgc3VwcG9ydCBtdWx0aS10b3VjaAorICAgIHByaXZhdGUgYm9vbGVhbiBtU3VwcG9ydE11bHRpVG91Y2g7CisgICAgCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB3ZSBoYXZlIGEgdG91Y2ggcGFuZWwgY2FwYWJsZSBvZiBkZXRlY3Rpbmcgc21vb3RoIHBhbi9zY2FsZSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1BbGxvd1BhbkFuZFNjYWxlOworCisgICAgLy8gdXNlIHRoZSBmcmFtZXdvcmsncyBTY2FsZUdlc3R1cmVEZXRlY3RvciB0byBoYW5kbGUgbXVsdGktdG91Y2gKKyAgICBwcml2YXRlIFNjYWxlR2VzdHVyZURldGVjdG9yIG1TY2FsZURldGVjdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBtUGluY2hUb1pvb21BbmltYXRpbmcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBab29tTWFuYWdlcihXZWJWaWV3IHdlYlZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgeworICAgICAgICBtV2ViVmlldyA9IHdlYlZpZXc7CisgICAgICAgIG1DYWxsYmFja1Byb3h5ID0gY2FsbGJhY2tQcm94eTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZGVhbGx5IG1ab29tT3ZlcnZpZXdXaWR0aCBzaG91bGQgYmUgbUNvbnRlbnRXaWR0aC4gQnV0IHNpdGVzIGxpa2UKKyAgICAgICAgICogRVNQTiBhbmQgRW5nYWRnZXQgYWx3YXlzIGhhdmUgd2lkZXIgbUNvbnRlbnRXaWR0aCBubyBtYXR0ZXIgd2hhdCB0aGUKKyAgICAgICAgICogdmlld3BvcnQgc2l6ZSBpcy4KKyAgICAgICAgICovCisgICAgICAgIHNldFpvb21PdmVydmlld1dpZHRoKFdlYlZpZXcuREVGQVVMVF9WSUVXUE9SVF9XSURUSCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBib3RoIHRoZSBkZWZhdWx0IGFuZCBhY3R1YWwgem9vbSBzY2FsZSB0byB0aGUgZ2l2ZW4gZGVuc2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZW5zaXR5IFRoZSBsb2dpY2FsIGRlbnNpdHkgb2YgdGhlIGRpc3BsYXkuIFRoaXMgaXMgYSBzY2FsaW5nIGZhY3RvcgorICAgICAqIGZvciB0aGUgRGVuc2l0eSBJbmRlcGVuZGVudCBQaXhlbCB1bml0LCB3aGVyZSBvbmUgRElQIGlzIG9uZSBwaXhlbCBvbiBhbgorICAgICAqIGFwcHJveGltYXRlbHkgMTYwIGRwaSBzY3JlZW4gKHNlZSBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3MuZGVuc2l0eSkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIGFzc2VydCBkZW5zaXR5ID4gMDsKKworICAgICAgICBzZXREZWZhdWx0Wm9vbVNjYWxlKGRlbnNpdHkpOworICAgICAgICBtQWN0dWFsU2NhbGUgPSBkZW5zaXR5OworICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gZGVuc2l0eTsKKyAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBkZW5zaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgZGVmYXVsdCB6b29tIHNjYWxlIHVzaW5nIHRoZSBnaXZlbiBkZW5zaXR5LiBJdCB3aWxsIGFsc28gcmVzZXQKKyAgICAgKiB0aGUgY3VycmVudCBtaW4gYW5kIG1heCB6b29tIHNjYWxlcyB0byB0aGUgZGVmYXVsdCBib3VuZGFyaWVzIGFzIHdlbGwgYXMKKyAgICAgKiBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhbGxzIHdpdGhpbiB0aG9zZSBib3VuZGFyaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbnNpdHkgVGhlIGxvZ2ljYWwgZGVuc2l0eSBvZiB0aGUgZGlzcGxheS4gVGhpcyBpcyBhIHNjYWxpbmcgZmFjdG9yCisgICAgICogZm9yIHRoZSBEZW5zaXR5IEluZGVwZW5kZW50IFBpeGVsIHVuaXQsIHdoZXJlIG9uZSBESVAgaXMgb25lIHBpeGVsIG9uIGFuCisgICAgICogYXBwcm94aW1hdGVseSAxNjAgZHBpIHNjcmVlbiAoc2VlIGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljcy5kZW5zaXR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoZmxvYXQgZGVuc2l0eSkgeworICAgICAgICBhc3NlcnQgZGVuc2l0eSA+IDA7CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRlbnNpdHkgLSBtRGVmYXVsdFNjYWxlKSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UKSB7CisgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyBkZWZhdWx0IGRlbnNpdHkKKyAgICAgICAgICAgIHNldERlZmF1bHRab29tU2NhbGUoZGVuc2l0eSk7CisgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIHNjYWxlIGlmIGl0IGZhbGxzIG91dHNpZGUgdGhlIG5ldyB6b29tIGJvdW5kcworICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKG1BY3R1YWxTY2FsZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFpvb21TY2FsZShmbG9hdCBkZWZhdWx0U2NhbGUpIHsKKyAgICAgICAgbURlZmF1bHRTY2FsZSA9IGRlZmF1bHRTY2FsZTsKKyAgICAgICAgbUludkRlZmF1bHRTY2FsZSA9IDEgLyBkZWZhdWx0U2NhbGU7CisgICAgICAgIG1EZWZhdWx0TWF4Wm9vbVNjYWxlID0gZGVmYXVsdFNjYWxlICogREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1I7CisgICAgICAgIG1EZWZhdWx0TWluWm9vbVNjYWxlID0gZGVmYXVsdFNjYWxlICogREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1I7CisgICAgICAgIG1NYXhab29tU2NhbGUgPSBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICAgICAgbU1pblpvb21TY2FsZSA9IG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRTY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0SW52U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtSW52QWN0dWFsU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldFRleHRXcmFwU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFdyYXBTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0TWF4Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbU1heFpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0TWluWm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbU1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0RGVmYXVsdFNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRTY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgZ2V0UmVhZGluZ0xldmVsU2NhbGUoKSB7CisgICAgICByZXR1cm4gTWF0aC5tYXgobURlZmF1bHRTY2FsZSwgTUlOX1JFQURJTkdfTEVWRUxfU0NBTEUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXRJbnZEZWZhdWx0U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtSW52RGVmYXVsdFNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBmbG9hdCBnZXREZWZhdWx0TWF4Wm9vbVNjYWxlKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRNYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGZsb2F0IGdldERlZmF1bHRNaW5ab29tU2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdE1pblpvb21TY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgaW50IGdldERvY3VtZW50QW5jaG9yWCgpIHsKKyAgICAgICAgcmV0dXJuIG1BbmNob3JYOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RG9jdW1lbnRBbmNob3JZKCkgeworICAgICAgICByZXR1cm4gbUFuY2hvclk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJEb2N1bWVudEFuY2hvcigpIHsKKyAgICAgICAgbUFuY2hvclggPSBtQW5jaG9yWSA9IDA7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Wm9vbUNlbnRlcihmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1ab29tQ2VudGVyWCA9IHg7CisgICAgICAgIG1ab29tQ2VudGVyWSA9IHk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0SW5pdGlhbFNjYWxlSW5QZXJjZW50KGludCBzY2FsZUluUGVyY2VudCkgeworICAgICAgICBtSW5pdGlhbFNjYWxlID0gc2NhbGVJblBlcmNlbnQgKiAwLjAxZjsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgZmxvYXQgY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhmbG9hdCBzY2FsZSkgeworICAgICAgICBpZiAoc2NhbGUgPCBtTWluWm9vbVNjYWxlKSB7CisgICAgICAgICAgICBzY2FsZSA9IG1NaW5ab29tU2NhbGU7CisgICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiBtTWF4Wm9vbVNjYWxlKSB7CisgICAgICAgICAgICBzY2FsZSA9IG1NYXhab29tU2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNjYWxlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzWm9vbVNjYWxlRml4ZWQoKSB7CisgICAgICAgIHJldHVybiBtTWluWm9vbVNjYWxlID49IG1NYXhab29tU2NhbGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChmbG9hdCBzY2FsZUEsIGZsb2F0IHNjYWxlQikgeworICAgICAgICByZXR1cm4gTWF0aC5hYnMoc2NhbGVBIC0gc2NhbGVCKSA+PSBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShmbG9hdCBzY2FsZSkgeworICAgICAgICByZXR1cm4gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KHNjYWxlLCBtQWN0dWFsU2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNhblpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIG1NYXhab29tU2NhbGUgLSBtQWN0dWFsU2NhbGUgPiBNSU5JTVVNX1NDQUxFX0lOQ1JFTUVOVDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjYW5ab29tT3V0KCkgeworICAgICAgICByZXR1cm4gbUFjdHVhbFNjYWxlIC0gbU1pblpvb21TY2FsZSA+IE1JTklNVU1fU0NBTEVfSU5DUkVNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHpvb21JbigpIHsKKyAgICAgICAgcmV0dXJuIHpvb20oMS4yNWYpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7CisgICAgICAgIHJldHVybiB6b29tKDAuOGYpOworICAgIH0KKworICAgIC8vIHJldHVybnMgVFJVRSBpZiB6b29tIG91dCBzdWNjZWVkcyBhbmQgRkFMU0UgaWYgbm8gem9vbSBjaGFuZ2VzLgorICAgIHByaXZhdGUgYm9vbGVhbiB6b29tKGZsb2F0IHpvb21NdWx0aXBsaWVyKSB7CisgICAgICAgIC8vIFRPRE86IGFsdGVybmF0aXZlbHkgd2UgY2FuIGRpc2FsbG93IHRoaXMgZHVyaW5nIGRyYXcgaGlzdG9yeSBtb2RlCisgICAgICAgIG1XZWJWaWV3LnN3aXRjaE91dERyYXdIaXN0b3J5KCk7CisgICAgICAgIC8vIENlbnRlciB6b29taW5nIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgbVpvb21DZW50ZXJYID0gbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgKiAuNWY7CisgICAgICAgIG1ab29tQ2VudGVyWSA9IG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSAqIC41ZjsKKyAgICAgICAgbUFuY2hvclggPSBtV2ViVmlldy52aWV3VG9Db250ZW50WCgoaW50KSBtWm9vbUNlbnRlclggKyBtV2ViVmlldy5nZXRTY3JvbGxYKCkpOworICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKChpbnQpIG1ab29tQ2VudGVyWSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgIHJldHVybiBzdGFydFpvb21BbmltYXRpb24obUFjdHVhbFNjYWxlICogem9vbU11bHRpcGxpZXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlcyBhbiBhbmltYXRlZCB6b29tIG9mIHRoZSBXZWJWaWV3LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBuZXcgc2NhbGUgdHJpZ2dlcmVkIGFuIGFuaW1hdGlvbiBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0Wm9vbUFuaW1hdGlvbihmbG9hdCBzY2FsZSwgYm9vbGVhbiByZWZsb3dUZXh0KSB7CisgICAgICAgIGZsb2F0IG9sZFNjYWxlID0gbUFjdHVhbFNjYWxlOworICAgICAgICBtSW5pdGlhbFNjcm9sbFggPSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgIG1Jbml0aWFsU2Nyb2xsWSA9IG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKworICAgICAgICAvLyBzbmFwIHRvIHJlYWRpbmcgbGV2ZWwgc2NhbGUgaWYgaXQgaXMgY2xvc2UKKyAgICAgICAgaWYgKCFleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoc2NhbGUsIGdldFJlYWRpbmdMZXZlbFNjYWxlKCkpKSB7CisgICAgICAgICAgICBzY2FsZSA9IGdldFJlYWRpbmdMZXZlbFNjYWxlKCk7CisgICAgICAgIH0KKworICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIHJlZmxvd1RleHQpOworCisgICAgICAgIGlmIChvbGRTY2FsZSAhPSBtQWN0dWFsU2NhbGUpIHsKKyAgICAgICAgICAgIC8vIHVzZSBtWm9vbVBpY2tlclNjYWxlIHRvIHNlZSB6b29tIHByZXZpZXcgZmlyc3QKKyAgICAgICAgICAgIG1ab29tU3RhcnQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIG1JbnZJbml0aWFsWm9vbVNjYWxlID0gMS4wZiAvIG9sZFNjYWxlOworICAgICAgICAgICAgbUludkZpbmFsWm9vbVNjYWxlID0gMS4wZiAvIG1BY3R1YWxTY2FsZTsKKyAgICAgICAgICAgIG1ab29tU2NhbGUgPSBtQWN0dWFsU2NhbGU7CisgICAgICAgICAgICBtV2ViVmlldy5vbkZpeGVkTGVuZ3RoWm9vbUFuaW1hdGlvblN0YXJ0KCk7CisgICAgICAgICAgICBtV2ViVmlldy5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgV2ViVmlldydzIGRyYXdpbmcgY29kZSB3aGVuIGEgZml4ZWQgbGVuZ3RoIHpvb20KKyAgICAgKiBhbmltYXRpb24gaXMgb2NjdXJyaW5nLiBJdHMgcHVycG9zZSBpcyB0byBhbmltYXRlIHRoZSB6b29taW5nIG9mIHRoZSBjYW52YXMKKyAgICAgKiB0byB0aGUgZGVzaXJlZCBzY2FsZSB3aGljaCB3YXMgc3BlY2lmaWVkIGluIHN0YXJ0Wm9vbUFuaW1hdGlvbiguLi4pLgorICAgICAqCisgICAgICogQSBmaXhlZCBsZW5ndGggYW5pbWF0aW9uIGJlZ2lucyB3aGVuIHN0YXJ0Wm9vbUFuaW1hdGlvbiguLi4pIGlzIGNhbGxlZCBhbmQKKyAgICAgKiBjb250aW51ZXMgdW50aWwgdGhlIFpPT01fQU5JTUFUSU9OX0xFTkdUSCB0aW1lIGhhcyBlbGFwc2VkLiBEdXJpbmcgdGhhdAorICAgICAqIGludGVydmFsIGVhY2ggdGltZSB0aGUgV2ViVmlldyBkcmF3cyBpdCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoaWNoIGlzIAorICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBhbmltYXRpb24uCisgICAgICoKKyAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBXZWJWaWV3IGNhbiBjaGVjayB0byBzZWUgaWYgc3VjaCBhbiBhbmltYXRpb24gaXMgY3VycmVudGx5CisgICAgICogaW4gcHJvZ3Jlc3MgYnkgY2FsbGluZyBpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVab29tKENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgaWYgKG1ab29tU2NhbGUgPT0gMCkgeworICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiQSBXZWJWaWV3IGlzIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIGZpeGVkIGxlbmd0aCAiCisgICAgICAgICAgICAgICAgICAgICsgInpvb20gYW5pbWF0aW9uIHdoZW4gbm8gem9vbSBpcyBpbiBwcm9ncmVzcyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgem9vbVNjYWxlOworICAgICAgICBpbnQgaW50ZXJ2YWwgPSAoaW50KSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtWm9vbVN0YXJ0KTsKKyAgICAgICAgaWYgKGludGVydmFsIDwgWk9PTV9BTklNQVRJT05fTEVOR1RIKSB7CisgICAgICAgICAgICBmbG9hdCByYXRpbyA9IChmbG9hdCkgaW50ZXJ2YWwgLyBaT09NX0FOSU1BVElPTl9MRU5HVEg7CisgICAgICAgICAgICB6b29tU2NhbGUgPSAxLjBmIC8gKG1JbnZJbml0aWFsWm9vbVNjYWxlCisgICAgICAgICAgICAgICAgICAgICsgKG1JbnZGaW5hbFpvb21TY2FsZSAtIG1JbnZJbml0aWFsWm9vbVNjYWxlKSAqIHJhdGlvKTsKKyAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpvb21TY2FsZSA9IG1ab29tU2NhbGU7CisgICAgICAgICAgICAvLyBzZXQgbVpvb21TY2FsZSB0byBiZSAwIGFzIHdlIGhhdmUgZmluaXNoZWQgYW5pbWF0aW5nCisgICAgICAgICAgICBtWm9vbVNjYWxlID0gMDsKKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uRml4ZWRMZW5ndGhab29tQW5pbWF0aW9uRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBpbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLiBTaW5jZSB3ZSBuZWVkIHRvIHVzZQorICAgICAgICAvLyB6b29tU2NhbGUsIHdlIGNhbid0IHVzZSB0aGUgV2ViVmlldydzIHBpbkxvY1gvWSBmdW5jdGlvbnMgZGlyZWN0bHkuCisgICAgICAgIGZsb2F0IHNjYWxlID0gem9vbVNjYWxlICogbUludkluaXRpYWxab29tU2NhbGU7CisgICAgICAgIGludCB0eCA9IE1hdGgucm91bmQoc2NhbGUgKiAobUluaXRpYWxTY3JvbGxYICsgbVpvb21DZW50ZXJYKSAtIG1ab29tQ2VudGVyWCk7CisgICAgICAgIHR4ID0gLVdlYlZpZXcucGluTG9jKHR4LCBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSwgTWF0aC5yb3VuZChtV2ViVmlldy5nZXRDb250ZW50V2lkdGgoKQorICAgICAgICAgICAgICAgICogem9vbVNjYWxlKSkgKyBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgIGludCB0aXRsZUhlaWdodCA9IG1XZWJWaWV3LmdldFRpdGxlSGVpZ2h0KCk7CisgICAgICAgIGludCB0eSA9IE1hdGgucm91bmQoc2NhbGUKKyAgICAgICAgICAgICAgICAqIChtSW5pdGlhbFNjcm9sbFkgKyBtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkKKyAgICAgICAgICAgICAgICAtIChtWm9vbUNlbnRlclkgLSB0aXRsZUhlaWdodCkpOworICAgICAgICB0eSA9IC0odHkgPD0gdGl0bGVIZWlnaHQgPyBNYXRoLm1heCh0eSwgMCkgOiBXZWJWaWV3LnBpbkxvYyh0eQorICAgICAgICAgICAgICAgIC0gdGl0bGVIZWlnaHQsIG1XZWJWaWV3LmdldFZpZXdIZWlnaHQoKSwgTWF0aC5yb3VuZChtV2ViVmlldy5nZXRDb250ZW50SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAqIHpvb21TY2FsZSkpICsgdGl0bGVIZWlnaHQpICsgbVdlYlZpZXcuZ2V0U2Nyb2xsWSgpOworCisgICAgICAgIGNhbnZhcy50cmFuc2xhdGUodHgsIHR5KTsKKyAgICAgICAgY2FudmFzLnNjYWxlKHpvb21TY2FsZSwgem9vbVNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1pvb21BbmltYXRpbmcoKSB7CisgICAgICAgIHJldHVybiBpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpIHx8IG1QaW5jaFRvWm9vbUFuaW1hdGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkTGVuZ3RoQW5pbWF0aW9uSW5Qcm9ncmVzcygpIHsKKyAgICAgICAgcmV0dXJuIG1ab29tU2NhbGUgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoWm9vbVNjYWxlKGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBzZXRab29tU2NhbGUobUFjdHVhbFNjYWxlLCByZWZsb3dUZXh0LCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRab29tU2NhbGUoZmxvYXQgc2NhbGUsIGJvb2xlYW4gcmVmbG93VGV4dCkgeworICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIHJlZmxvd1RleHQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Wm9vbVNjYWxlKGZsb2F0IHNjYWxlLCBib29sZWFuIHJlZmxvd1RleHQsIGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1NjYWxlTGVzc1RoYW5NaW5ab29tID0gc2NhbGUgPCBtTWluWm9vbVNjYWxlOworICAgICAgICBzY2FsZSA9IGNvbXB1dGVTY2FsZVdpdGhMaW1pdHMoc2NhbGUpOworCisgICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gdGhlIHpvb20gb3ZlcnZpZXcgbW9kZQorICAgICAgICBpZiAoaXNTY2FsZUxlc3NUaGFuTWluWm9vbSAmJiBtTWluWm9vbVNjYWxlIDwgbURlZmF1bHRTY2FsZSkgeworICAgICAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Jblpvb21PdmVydmlldyA9ICFleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQoc2NhbGUsIGdldFpvb21PdmVydmlld1NjYWxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlZmxvd1RleHQpIHsKKyAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gc2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlIHx8IGZvcmNlKSB7CisgICAgICAgICAgICBmbG9hdCBvbGRTY2FsZSA9IG1BY3R1YWxTY2FsZTsKKyAgICAgICAgICAgIGZsb2F0IG9sZEludlNjYWxlID0gbUludkFjdHVhbFNjYWxlOworCisgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbUFjdHVhbFNjYWxlICYmICFtUGluY2hUb1pvb21BbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tQcm94eS5vblNjYWxlQ2hhbmdlZChtQWN0dWFsU2NhbGUsIHNjYWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUFjdHVhbFNjYWxlID0gc2NhbGU7CisgICAgICAgICAgICBtSW52QWN0dWFsU2NhbGUgPSAxIC8gc2NhbGU7CisKKyAgICAgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgaGlzdG9yeSBQaWN0dXJlIGlzIGRyYXduLCBkb24ndCB1cGRhdGUgc2Nyb2xsLiBUaGV5IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBiZSB1cGRhdGVkIHdoZW4gd2UgZ2V0IG91dCBvZiB0aGF0IG1vZGUuCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG91ciBzY3JvbGwgc28gd2UgZG9uJ3QgYXBwZWFyIHRvIGp1bXAKKyAgICAgICAgICAgICAgICAvLyBpLmUuIGtlZXAgdGhlIGNlbnRlciBvZiB0aGUgZG9jIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcKKyAgICAgICAgICAgICAgICBpbnQgb2xkWCA9IG1XZWJWaWV3LmdldFNjcm9sbFgoKTsKKyAgICAgICAgICAgICAgICBpbnQgb2xkWSA9IG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCByYXRpbyA9IHNjYWxlICogb2xkSW52U2NhbGU7CisgICAgICAgICAgICAgICAgZmxvYXQgc3ggPSByYXRpbyAqIG9sZFggKyAocmF0aW8gLSAxKSAqIG1ab29tQ2VudGVyWDsKKyAgICAgICAgICAgICAgICBmbG9hdCBzeSA9IHJhdGlvICogb2xkWSArIChyYXRpbyAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAqIChtWm9vbUNlbnRlclkgLSBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFNjYWxlIGFsbCB0aGUgY2hpbGQgdmlld3MKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIuc2NhbGVBbGwoKTsKKworICAgICAgICAgICAgICAgIC8vIGFzIHdlIGRvbid0IGhhdmUgYW5pbWF0aW9uIGZvciBzY2FsaW5nLCBkb24ndCBkbyBhbmltYXRpb24KKyAgICAgICAgICAgICAgICAvLyBmb3Igc2Nyb2xsaW5nLCBhcyBpdCBjYXVzZXMgd2VpcmQgaW50ZXJtZWRpYXRlIHN0YXRlCisgICAgICAgICAgICAgICAgaW50IHNjcm9sbFggPSBtV2ViVmlldy5waW5Mb2NYKE1hdGgucm91bmQoc3gpKTsKKyAgICAgICAgICAgICAgICBpbnQgc2Nyb2xsWSA9IG1XZWJWaWV3LnBpbkxvY1koTWF0aC5yb3VuZChzeSkpOworICAgICAgICAgICAgICAgIGlmKCFtV2ViVmlldy51cGRhdGVTY3JvbGxDb29yZGluYXRlcyhzY3JvbGxYLCBzY3JvbGxZKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGlzIGFkanVzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHpvb20gYW5pbWF0aW9uLiBCdXQgd2Ugd2FudCB0byB1cGRhdGUgdGhlIFdlYktpdCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSB6b29tIGFuaW1hdGlvbi4gU2VlIGNvbW1lbnRzIGluIG9uU2NhbGVFbmQoKS4KKyAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcuc2VuZE91clZpc2libGVSZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGUgd2UgbmVlZCB0byByZWZsb3cgdGhlIHRleHQgdGhlbiBmb3JjZSB0aGUgVklFV19TSVpFX0NIQU5HRUQKKyAgICAgICAgICAgIC8vIGV2ZW50IHRvIGJlIHNlbnQgdG8gV2ViS2l0CisgICAgICAgICAgICBtV2ViVmlldy5zZW5kVmlld1NpemVab29tKHJlZmxvd1RleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRvdWJsZSB0YXAgZ2VzdHVyZSBjYW4gcmVzdWx0IGluIGRpZmZlcmVudCBiZWhhdmlvcnMgZGVwZW5kaW5nIG9uIHRoZQorICAgICAqIGNvbnRlbnQgdGhhdCBpcyB0YXBwZWQuCisgICAgICoKKyAgICAgKiAoMSkgUExVR0lOUzogSWYgdGhlIHRhcHMgb2NjdXIgb24gYSBwbHVnaW4gdGhlbiB3ZSBtYXhpbWl6ZSB0aGUgcGx1Z2luIG9uCisgICAgICogdGhlIHNjcmVlbi4gSWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IG1heGltaXplZCB0aGVuIHpvb20gdGhlIHVzZXIgaW50bworICAgICAqIG92ZXJ2aWV3IG1vZGUuCisgICAgICoKKyAgICAgKiAoMikgSFRNTC9PVEhFUjogSWYgdGhlIHRhcHMgb2NjdXIgb3V0c2lkZSBhIHBsdWdpbiB0aGVuIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBoZXVyaXN0aWMgaXMgdXNlZC4KKyAgICAgKiAgIEEuIElmIHRoZSBjdXJyZW50IHNjYWxlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgdGV4dCB3cmFwIHNjYWxlIGFuZCB0aGUKKyAgICAgKiAgICAgIGxheW91dCBhbGdvcml0aG0gc3BlY2lmaWVzIHRoZSB1c2Ugb2YgTkFSUk9XX0NPTFVNTlMsIHRoZW4gZml0IHRvCisgICAgICogICAgICBjb2x1bW4gYnkgcmVmbG93aW5nIHRoZSB0ZXh0LgorICAgICAqICAgQi4gSWYgdGhlIHBhZ2UgaXMgbm90IGluIG92ZXJ2aWV3IG1vZGUgdGhlbiBjaGFuZ2UgdG8gb3ZlcnZpZXcgbW9kZS4KKyAgICAgKiAgIEMuIElmIHRoZSBwYWdlIGlzIGluIG92ZXJtb2RlIHRoZW4gY2hhbmdlIHRvIHRoZSBkZWZhdWx0IHNjYWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZURvdWJsZVRhcChmbG9hdCBsYXN0VG91Y2hYLCBmbG9hdCBsYXN0VG91Y2hZKSB7CisgICAgICAgIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwgfHwgc2V0dGluZ3MuZ2V0VXNlV2lkZVZpZXdQb3J0KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNldFpvb21DZW50ZXIobGFzdFRvdWNoWCwgbGFzdFRvdWNoWSk7CisgICAgICAgIG1BbmNob3JYID0gbVdlYlZpZXcudmlld1RvQ29udGVudFgoKGludCkgbGFzdFRvdWNoWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgIG1BbmNob3JZID0gbVdlYlZpZXcudmlld1RvQ29udGVudFkoKGludCkgbGFzdFRvdWNoWSArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgIHNldHRpbmdzLnNldERvdWJsZVRhcFRvYXN0Q291bnQoMCk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSB6b29tIGNvbnRyb2wgYWZ0ZXIgZG91YmxlIHRhcAorICAgICAgICBkaXNtaXNzWm9vbVBpY2tlcigpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBkb3VibGUgdGFwIHdhcyBvbiBhIHBsdWdpbiB0aGVuIGVpdGhlciB6b29tIHRvIG1heGltaXplIHRoZQorICAgICAgICAgKiBwbHVnaW4gb24gdGhlIHNjcmVlbiBvciBzY2FsZSB0byBvdmVydmlldyBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgVmlld01hbmFnZXIuQ2hpbGRWaWV3IHBsdWdpbiA9IG1XZWJWaWV3Lm1WaWV3TWFuYWdlci5oaXRUZXN0KG1BbmNob3JYLCBtQW5jaG9yWSk7CisgICAgICAgIGlmIChwbHVnaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmlzUGx1Z2luRml0T25TY3JlZW4ocGx1Z2luKSkgeworICAgICAgICAgICAgICAgIHpvb21Ub092ZXJ2aWV3KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmNlbnRlckZpdFJlY3QocGx1Z2luLngsIHBsdWdpbi55LCBwbHVnaW4ud2lkdGgsIHBsdWdpbi5oZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNldHRpbmdzLmdldExheW91dEFsZ29yaXRobSgpID09IFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUworICAgICAgICAgICAgICAgICYmIHdpbGxTY2FsZVRyaWdnZXJab29tKG1UZXh0V3JhcFNjYWxlKQorICAgICAgICAgICAgICAgIC8vIEZvciB0YWJsZXQsIG5vdCBtdWNoIG5lZWQgdG8gcmVmbG93IHRleHQgdy9vIGRvdWJsZSB0YXBwaW5nLgorICAgICAgICAgICAgICAgICYmICFzZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpIHsKKyAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldykgeworICAgICAgICAgICAgem9vbVRvT3ZlcnZpZXcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHpvb21Ub1JlYWRpbmdMZXZlbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFpvb21PdmVydmlld1dpZHRoKGludCB3aWR0aCkgeworICAgICAgICBtWm9vbU92ZXJ2aWV3V2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUludlpvb21PdmVydmlld1dpZHRoID0gMS4wZiAvIHdpZHRoOworICAgIH0KKworICAgIHByaXZhdGUgZmxvYXQgZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKSB7CisgICAgICAgIHJldHVybiBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKSAqIG1JbnZab29tT3ZlcnZpZXdXaWR0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luWm9vbU92ZXJ2aWV3KCkgeworICAgICAgICByZXR1cm4gbUluWm9vbU92ZXJ2aWV3OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB6b29tVG9PdmVydmlldygpIHsKKyAgICAgICAgaWYgKCF3aWxsU2NhbGVUcmlnZ2VyWm9vbShnZXRab29tT3ZlcnZpZXdTY2FsZSgpKSkgcmV0dXJuOworCisgICAgICAgIC8vIEZvcmNlIHRoZSB0aXRsZWJhciBmdWxseSByZXZlYWwgaW4gb3ZlcnZpZXcgbW9kZQorICAgICAgICBpbnQgc2Nyb2xsWSA9IG1XZWJWaWV3LmdldFNjcm9sbFkoKTsKKyAgICAgICAgaWYgKHNjcm9sbFkgPCBtV2ViVmlldy5nZXRUaXRsZUhlaWdodCgpKSB7CisgICAgICAgICAgICBtV2ViVmlldy51cGRhdGVTY3JvbGxDb29yZGluYXRlcyhtV2ViVmlldy5nZXRTY3JvbGxYKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXJ0Wm9vbUFuaW1hdGlvbihnZXRab29tT3ZlcnZpZXdTY2FsZSgpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgem9vbVRvUmVhZGluZ0xldmVsKCkgeworICAgICAgICBmaW5hbCBmbG9hdCByZWFkaW5nU2NhbGUgPSBnZXRSZWFkaW5nTGV2ZWxTY2FsZSgpOworICAgICAgICBpbnQgbGVmdCA9IG1XZWJWaWV3Lm5hdGl2ZUdldEJsb2NrTGVmdEVkZ2UobUFuY2hvclgsIG1BbmNob3JZLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBpZiAobGVmdCAhPSBXZWJWaWV3Lk5PX0xFRlRFREdFKSB7CisgICAgICAgICAgICAvLyBhZGQgYSA1cHQgcGFkZGluZyB0byB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaW50IHZpZXdMZWZ0ID0gbVdlYlZpZXcuY29udGVudFRvVmlld1gobGVmdCA8IDUgPyAwIDogKGxlZnQgLSA1KSkKKyAgICAgICAgICAgICAgICAgICAgLSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHpvb20gY2VudGVyIHNvIHRoYXQgdGhlIG5ldyBzY3JvbGwgeCB3aWxsIGJlCisgICAgICAgICAgICAvLyBvbiB0aGUgbGVmdCBlZGdlLgorICAgICAgICAgICAgaWYgKHZpZXdMZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IHZpZXdMZWZ0ICogcmVhZGluZ1NjYWxlIC8gKHJlYWRpbmdTY2FsZSAtIG1BY3R1YWxTY2FsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1XZWJWaWV3LnNjcm9sbEJ5KHZpZXdMZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICBtWm9vbUNlbnRlclggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0Wm9vbUFuaW1hdGlvbihyZWFkaW5nU2NhbGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU11bHRpVG91Y2hTdXBwb3J0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBjaGVjayB0aGUgcHJlY29uZGl0aW9ucworICAgICAgICBhc3NlcnQgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKSAhPSBudWxsOworCisgICAgICAgIGZpbmFsIFdlYlNldHRpbmdzIHNldHRpbmdzID0gbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKTsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1TdXBwb3J0TXVsdGlUb3VjaCA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIKQorICAgICAgICAgICAgICAgICYmIHNldHRpbmdzLnN1cHBvcnRab29tKCkgJiYgc2V0dGluZ3MuZ2V0QnVpbHRJblpvb21Db250cm9scygpOworICAgICAgICBtQWxsb3dQYW5BbmRTY2FsZSA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9UT1VDSFNDUkVFTl9NVUxUSVRPVUNIX0RJU1RJTkNUKTsKKyAgICAgICAgaWYgKG1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbmV3IFNjYWxlR2VzdHVyZURldGVjdG9yKGNvbnRleHQsIG5ldyBTY2FsZURldGVjdG9yTGlzdGVuZXIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1TdXBwb3J0TXVsdGlUb3VjaCAmJiAobVNjYWxlRGV0ZWN0b3IgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIG1TY2FsZURldGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTXVsdGlUb3VjaFpvb20oKSB7CisgICAgICAgIHJldHVybiBtU3VwcG9ydE11bHRpVG91Y2g7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQYW5EdXJpbmdab29tKCkgeworICAgICAgICByZXR1cm4gbUFsbG93UGFuQW5kU2NhbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIGNhbGxlciB0aGF0IHRoZSBab29tTWFuYWdlciBpcyByZXF1ZXN0aW5nIHRoYXQgc2NhbGUgcmVsYXRlZAorICAgICAqIHVwZGF0ZXMgc2hvdWxkIG5vdCBiZSBzZW50IHRvIHdlYmtpdC4gVGhpcyBjYW4gb2NjdXIgaW4gY2FzZXMgd2hlcmUgdGhlCisgICAgICogWm9vbU1hbmFnZXIgaXMgcGVyZm9ybWluZyBhbiBhbmltYXRpb24gYW5kIGRvZXMgbm90IHdhbnQgd2Via2l0IHRvIHVwZGF0ZQorICAgICAqIHVudGlsIHRoZSBhbmltYXRpb24gaXMgY29tcGxldGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2NhbGUgcmVsYXRlZCB1cGRhdGVzIHNob3VsZCBub3QgYmUgc2VudCB0byB3ZWJraXQgYW5kCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmV2ZW50aW5nV2Via2l0VXBkYXRlcygpIHsKKyAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgYW5pbWF0aW5nIGEgbXVsdGktdG91Y2ggem9vbSBwcmV2ZW50cyB1cGRhdGVzLCBidXQKKyAgICAgICAgLy8gb3RoZXJzIGNhbiBhZGQgdGhlaXIgb3duIGNvbmRpdGlvbnMgdG8gdGhpcyBtZXRob2QgaWYgbmVjZXNzYXJ5LgorICAgICAgICByZXR1cm4gbVBpbmNoVG9ab29tQW5pbWF0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBTY2FsZUdlc3R1cmVEZXRlY3RvciBnZXRNdWx0aVRvdWNoR2VzdHVyZURldGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNjYWxlRGV0ZWN0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTY2FsZURldGVjdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBTY2FsZUdlc3R1cmVEZXRlY3Rvci5PblNjYWxlR2VzdHVyZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblNjYWxlQmVnaW4oU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGRpc21pc3Nab29tUGlja2VyKCk7CisgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIuc3RhcnRab29tKCk7CisgICAgICAgICAgICBtV2ViVmlldy5vblBpbmNoVG9ab29tQW5pbWF0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLnJvdW5kKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkgKiBtQWN0dWFsU2NhbGUgKiAxMDApICogMC4wMWY7CisgICAgICAgICAgICBpZiAod2lsbFNjYWxlVHJpZ2dlclpvb20oc2NhbGUpKSB7CisgICAgICAgICAgICAgICAgbVBpbmNoVG9ab29tQW5pbWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0aGUgc2NhbGUgY2hhbmdlIHBlciBzdGVwCisgICAgICAgICAgICAgICAgaWYgKHNjYWxlID4gbUFjdHVhbFNjYWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oc2NhbGUsIG1BY3R1YWxTY2FsZSAqIDEuMjVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtQWN0dWFsU2NhbGUgKiAwLjhmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0Wm9vbUNlbnRlcihkZXRlY3Rvci5nZXRGb2N1c1goKSwgZGV0ZWN0b3IuZ2V0Rm9jdXNZKCkpOworICAgICAgICAgICAgICAgIHNldFpvb21TY2FsZShzY2FsZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2NhbGVFbmQoU2NhbGVHZXN0dXJlRGV0ZWN0b3IgZGV0ZWN0b3IpIHsKKyAgICAgICAgICAgIGlmIChtUGluY2hUb1pvb21BbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtUGluY2hUb1pvb21BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKChpbnQpIG1ab29tQ2VudGVyWCArIG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgICAgICAgICAgbUFuY2hvclkgPSBtV2ViVmlldy52aWV3VG9Db250ZW50WSgoaW50KSBtWm9vbUNlbnRlclkgKyBtV2ViVmlldy5nZXRTY3JvbGxZKCkpOworICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlZmxvdyB3aGVuIHpvb20gaW47IHdoZW4gem9vbSBvdXQsIGRvIHJlZmxvdyBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgc2NhbGUgaXMgYWxtb3N0IG1pbmltdW0gc2NhbGU7CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZWZsb3dOb3cgPSAhY2FuWm9vbU91dCgpIHx8IChtQWN0dWFsU2NhbGUgPD0gMC44ICogbVRleHRXcmFwU2NhbGUpOworICAgICAgICAgICAgICAgIC8vIGZvcmNlIHpvb20gYWZ0ZXIgbVByZXZpZXdab29tT25seSBpcyBzZXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXcgdmlldyBzaXplIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBXZWJLaXQKKyAgICAgICAgICAgICAgICByZWZyZXNoWm9vbVNjYWxlKHJlZmxvd05vdyk7CisgICAgICAgICAgICAgICAgLy8gY2FsbCBpbnZhbGlkYXRlKCkgdG8gZHJhdyB3aXRob3V0IHpvb20gZmlsdGVyCisgICAgICAgICAgICAgICAgbVdlYlZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtV2ViVmlldy5tVmlld01hbmFnZXIuZW5kWm9vbSgpOworICAgICAgICAgICAgbVdlYlZpZXcub25QaW5jaFRvWm9vbUFuaW1hdGlvbkVuZChkZXRlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG93LCBpbnQgb2gpIHsKKyAgICAgICAgLy8gcmVzZXQgem9vbSBhbmQgYW5jaG9yIHRvIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmVlbgorICAgICAgICAvLyB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgem9vbWluZworICAgICAgICBpZiAoIWlzRml4ZWRMZW5ndGhBbmltYXRpb25JblByb2dyZXNzKCkpIHsKKyAgICAgICAgICAgIGludCB2aXNpYmxlVGl0bGVIZWlnaHQgPSBtV2ViVmlldy5nZXRWaXNpYmxlVGl0bGVIZWlnaHQoKTsKKyAgICAgICAgICAgIG1ab29tQ2VudGVyWCA9IDA7CisgICAgICAgICAgICBtWm9vbUNlbnRlclkgPSB2aXNpYmxlVGl0bGVIZWlnaHQ7CisgICAgICAgICAgICBtQW5jaG9yWCA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRYKG1XZWJWaWV3LmdldFNjcm9sbFgoKSk7CisgICAgICAgICAgICBtQW5jaG9yWSA9IG1XZWJWaWV3LnZpZXdUb0NvbnRlbnRZKHZpc2libGVUaXRsZUhlaWdodCArIG1XZWJWaWV3LmdldFNjcm9sbFkoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgbU1pblpvb21TY2FsZSBpZiB0aGUgbWluaW11bSB6b29tIHNjYWxlIGlzIG5vdCBmaXhlZAorICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2UgZnJvbSBuYXJyb3cgc2NyZWVuIHRvIHdpZGUgc2NyZWVuLCB0aGUgbmV3IHZpZXdXaWR0aAorICAgICAgICAgICAgLy8gY2FuIGJlIHdpZGVyIHRoYW4gdGhlIG9sZCBjb250ZW50IHdpZHRoLiBXZSBsaW1pdCB0aGUgbWluaW11bQorICAgICAgICAgICAgLy8gc2NhbGUgdG8gMS4wZi4gVGhlIHByb3BlciBtaW5pbXVtIHNjYWxlIHdpbGwgYmUgY2FsY3VsYXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgbmV3IHBpY3R1cmUgc2hvd3MgdXAuCisgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gTWF0aC5taW4oMS4wZiwgKGZsb2F0KSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKQorICAgICAgICAgICAgICAgICAgICAvIChtV2ViVmlldy5kcmF3SGlzdG9yeSgpID8gbVdlYlZpZXcuZ2V0SGlzdG9yeVBpY3R1cmVXaWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWm9vbU92ZXJ2aWV3V2lkdGgpKTsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBtaW5ab29tU2NhbGUgdG8gdGhlIGluaXRpYWxTY2FsZSBpZiBpdCBpcyBzZXQKKyAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCAmJiBtSW5pdGlhbFNjYWxlIDwgbU1pblpvb21TY2FsZSkgeworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSBtSW5pdGlhbFNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGlzbWlzc1pvb21QaWNrZXIoKTsKKworICAgICAgICAvLyBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkIGR1cmluZyBXZWJWaWV3IGxheW91dC4gQW5kIGFueQorICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCkgaXMgYmxvY2tlZCBkdXJpbmcgbGF5b3V0LiBBcyByZWZyZXNoWm9vbVNjYWxlKCkgd2lsbAorICAgICAgICAvLyBjYXVzZSBpdHMgY2hpbGQgVmlldyB0byByZXBvc2l0aW9uIGl0c2VsZiB0aHJvdWdoIFZpZXdNYW5hZ2VyJ3MKKyAgICAgICAgLy8gc2NhbGVBbGwoKSwgd2UgbmVlZCB0byBwb3N0IGEgUnVubmFibGUgdG8gZW5zdXJlIHJlcXVlc3RMYXlvdXQoKS4KKyAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBvbmx5IHVwZGF0ZSB0aGUgdGV4dCB3cmFwIHNjYWxlIGlmIHRoZSB3aWR0aCBjaGFuZ2VkLgorICAgICAgICBtV2ViVmlldy5wb3N0KG5ldyBQb3N0U2NhbGUodyAhPSBvdykpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUG9zdFNjYWxlIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBmaW5hbCBib29sZWFuIG1VcGRhdGVUZXh0V3JhcDsKKworICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKGJvb2xlYW4gdXBkYXRlVGV4dFdyYXApIHsKKyAgICAgICAgICAgIG1VcGRhdGVUZXh0V3JhcCA9IHVwZGF0ZVRleHRXcmFwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFdlYlZpZXdDb3JlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBmb3JjZSwgaW4gY2FzZSBvdXIgaGVpZ2h0IGNoYW5nZWQsIGluIHdoaWNoIGNhc2Ugd2UKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KKyAgICAgICAgICAgICAgICBzZXRab29tU2NhbGUoTWF0aC5tYXgobUFjdHVhbFNjYWxlLCBnZXRab29tT3ZlcnZpZXdTY2FsZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZVRleHRXcmFwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICB1cGRhdGVab29tUGlja2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVab29tUmFuZ2UoV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSwKKyAgICAgICAgICAgIGludCB2aWV3V2lkdGgsIGludCBtaW5QcmVmV2lkdGgpIHsKKyAgICAgICAgaWYgKHZpZXdTdGF0ZS5tTWluU2NhbGUgPT0gMCkgeworICAgICAgICAgICAgaWYgKHZpZXdTdGF0ZS5tTW9iaWxlU2l0ZSkgeworICAgICAgICAgICAgICAgIGlmIChtaW5QcmVmV2lkdGggPiBNYXRoLm1heCgwLCB2aWV3V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGUgPSAoZmxvYXQpIHZpZXdXaWR0aCAvIG1pblByZWZXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZUZpeGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHZpZXdTdGF0ZS5tRGVmYXVsdFNjYWxlOworICAgICAgICAgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IG1EZWZhdWx0TWluWm9vbVNjYWxlOworICAgICAgICAgICAgICAgIG1NaW5ab29tU2NhbGVGaXhlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IHZpZXdTdGF0ZS5tTWluU2NhbGU7CisgICAgICAgICAgICBtTWluWm9vbVNjYWxlRml4ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh2aWV3U3RhdGUubU1heFNjYWxlID09IDApIHsKKyAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSBtRGVmYXVsdE1heFpvb21TY2FsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NYXhab29tU2NhbGUgPSB2aWV3U3RhdGUubU1heFNjYWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB6b29tIHZhbHVlcyB3aGVuIFdlYmtpdCBwcm9kdWNlcyBhIG5ldyBwaWN0dXJlLiBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBVSSB0aHJlYWQncyBtZXNzYWdlIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25OZXdQaWN0dXJlKFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXdEYXRhKSB7CisgICAgICAgIGZpbmFsIGludCB2aWV3V2lkdGggPSBtV2ViVmlldy5nZXRWaWV3V2lkdGgoKTsKKworICAgICAgICBpZiAoIW1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlRml4ZWRWaWV3cG9ydCgpCisgICAgICAgICAgICAmJiBtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpKSB7CisgICAgICAgICAgICAvLyBsaW1pdCBtWm9vbU92ZXJ2aWV3V2lkdGggdXBwZXIgYm91bmQgdG8KKyAgICAgICAgICAgIC8vIHNNYXhWaWV3cG9ydFdpZHRoIHNvIHRoYXQgaWYgdGhlIHBhZ2UgZG9lc24ndCBiZWhhdmUKKyAgICAgICAgICAgIC8vIHdlbGwsIHRoZSBXZWJWaWV3IHdvbid0IGdvIGluc2FuZS4gbGltaXQgdGhlIGxvd2VyCisgICAgICAgICAgICAvLyBib3VuZCB0byBtYXRjaCB0aGUgZGVmYXVsdCBzY2FsZSBmb3IgbW9iaWxlIHNpdGVzLgorICAgICAgICAgICAgc2V0Wm9vbU92ZXJ2aWV3V2lkdGgoTWF0aC5taW4oV2ViVmlldy5zTWF4Vmlld3BvcnRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoKGludCkgKHZpZXdXaWR0aCAqIG1JbnZEZWZhdWx0U2NhbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGRyYXdEYXRhLm1NaW5QcmVmV2lkdGgsIGRyYXdEYXRhLm1WaWV3UG9pbnQueCkpKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCB6b29tT3ZlcnZpZXdTY2FsZSA9IGdldFpvb21PdmVydmlld1NjYWxlKCk7CisgICAgICAgIGlmICghbU1pblpvb21TY2FsZUZpeGVkKSB7CisgICAgICAgICAgICBtTWluWm9vbVNjYWxlID0gem9vbU92ZXJ2aWV3U2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgLy8gZml0IHRoZSBjb250ZW50IHdpZHRoIHRvIHRoZSBjdXJyZW50IHZpZXcuIElnbm9yZSB0aGUgcm91bmRpbmcgZXJyb3IgY2FzZS4KKyAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpICYmIChtSW5pdGlhbFpvb21PdmVydmlldyB8fCAobUluWm9vbU92ZXJ2aWV3CisgICAgICAgICAgICAgICAgJiYgTWF0aC5hYnMoKHZpZXdXaWR0aCAqIG1JbnZBY3R1YWxTY2FsZSkgLSBtWm9vbU92ZXJ2aWV3V2lkdGgpID4gMSkpKSB7CisgICAgICAgICAgICBtSW5pdGlhbFpvb21PdmVydmlldyA9IGZhbHNlOworICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKHpvb21PdmVydmlld1NjYWxlLCAhd2lsbFNjYWxlVHJpZ2dlclpvb20obVRleHRXcmFwU2NhbGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgem9vbSB2YWx1ZXMgYWZ0ZXIgV2Via2l0IGNvbXBsZXRlcyB0aGUgaW5pdGlhbCBwYWdlIGxheW91dC4gSXQKKyAgICAgKiBpcyBjYWxsZWQgd2hlbiB2aXNpdGluZyBhIHBhZ2UgZm9yIHRoZSBmaXJzdCB0aW1lIGFzIHdlbGwgYXMgd2hlbiB0aGUKKyAgICAgKiB1c2VyIG5hdmlnYXRlcyBiYWNrIHRvIGEgcGFnZSAoaW4gd2hpY2ggY2FzZSB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZQorICAgICAqIHpvb20gbGV2ZWxzIHRvIHRoZSBzdGF0ZSB0aGV5IHdlcmUgd2hlbiB5b3UgbGVmdCB0aGUgcGFnZSkuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCdzIG1lc3NhZ2UgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkZpcnN0TGF5b3V0KFdlYlZpZXdDb3JlLkRyYXdEYXRhIGRyYXdEYXRhKSB7CisgICAgICAgIC8vIHByZWNvbmRpdGlvbiBjaGVjaworICAgICAgICBhc3NlcnQgZHJhd0RhdGEgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGRyYXdEYXRhLm1WaWV3U3RhdGUgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbDsKKworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgdmlld1N0YXRlID0gZHJhd0RhdGEubVZpZXdTdGF0ZTsKKyAgICAgICAgZmluYWwgUG9pbnQgdmlld1NpemUgPSBkcmF3RGF0YS5tVmlld1BvaW50OworICAgICAgICB1cGRhdGVab29tUmFuZ2Uodmlld1N0YXRlLCB2aWV3U2l6ZS54LCBkcmF3RGF0YS5tTWluUHJlZldpZHRoKTsKKworICAgICAgICBpZiAoIW1XZWJWaWV3LmRyYXdIaXN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWZsb3dUZXh0OworCisgICAgICAgICAgICBpZiAobUluaXRpYWxTY2FsZSA+IDApIHsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IG1Jbml0aWFsU2NhbGU7CisgICAgICAgICAgICAgICAgcmVmbG93VGV4dCA9IGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChtVGV4dFdyYXBTY2FsZSwgc2NhbGUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2aWV3U3RhdGUubVZpZXdTY2FsZSA+IDApIHsKKyAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IHZpZXdTdGF0ZS5tVGV4dFdyYXBTY2FsZTsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IHZpZXdTdGF0ZS5tVmlld1NjYWxlOworICAgICAgICAgICAgICAgIHJlZmxvd1RleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKQorICAgICAgICAgICAgICAgICAgICAmJiAoc2V0dGluZ3MuZ2V0TG9hZFdpdGhPdmVydmlld01vZGUoKSB8fCBzZXR0aW5ncy5nZXRVc2VGaXhlZFZpZXdwb3J0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWm9vbU92ZXJ2aWV3ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAoZmxvYXQpIG1XZWJWaWV3LmdldFZpZXdXaWR0aCgpIC8gV2ViVmlldy5ERUZBVUxUX1ZJRVdQT1JUX1dJRFRIOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gdmlld1N0YXRlLm1UZXh0V3JhcFNjYWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWZsb3dUZXh0ID0gZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBzY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRab29tU2NhbGUoc2NhbGUsIHJlZmxvd1RleHQpOworCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gYnV0dG9ucyBhcyB0aGUgc2NhbGUgY2FuIGJlIGNoYW5nZWQKKyAgICAgICAgICAgIHVwZGF0ZVpvb21QaWNrZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmVab29tU3RhdGUoQnVuZGxlIGIpIHsKKyAgICAgICAgYi5wdXRGbG9hdCgic2NhbGUiLCBtQWN0dWFsU2NhbGUpOworICAgICAgICBiLnB1dEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbVRleHRXcmFwU2NhbGUpOworICAgICAgICBiLnB1dEJvb2xlYW4oIm92ZXJ2aWV3IiwgbUluWm9vbU92ZXJ2aWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXN0b3JlWm9vbVN0YXRlKEJ1bmRsZSBiKSB7CisgICAgICAgIC8vIGFzIGdldFdpZHRoKCkgLyBnZXRIZWlnaHQoKSBvZiB0aGUgdmlldyBhcmUgbm90IGF2YWlsYWJsZSB5ZXQsIHNldCB1cAorICAgICAgICAvLyBtQWN0dWFsU2NhbGUsIHNvIHRoYXQgd2hlbiBvblNpemVDaGFuZ2VkKCkgaXMgY2FsbGVkLCB0aGUgcmVzdCB3aWxsCisgICAgICAgIC8vIGJlIHNldCBjb3JyZWN0bHkKKyAgICAgICAgbUFjdHVhbFNjYWxlID0gYi5nZXRGbG9hdCgic2NhbGUiLCAxLjBmKTsKKyAgICAgICAgbUludkFjdHVhbFNjYWxlID0gMSAvIG1BY3R1YWxTY2FsZTsKKyAgICAgICAgbVRleHRXcmFwU2NhbGUgPSBiLmdldEZsb2F0KCJ0ZXh0d3JhcFNjYWxlIiwgbUFjdHVhbFNjYWxlKTsKKyAgICAgICAgbUluWm9vbU92ZXJ2aWV3ID0gYi5nZXRCb29sZWFuKCJvdmVydmlldyIpOworICAgIH0KKworICAgIHByaXZhdGUgWm9vbUNvbnRyb2xCYXNlIGdldEN1cnJlbnRab29tQ29udHJvbCgpIHsKKyAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkgIT0gbnVsbCAmJiBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnN1cHBvcnRab29tKCkpIHsKKyAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldEJ1aWx0SW5ab29tQ29udHJvbHMoKSkgeworICAgICAgICAgICAgICAgIGlmICgobUVtYmVkZGVkWm9vbUNvbnRyb2wgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0RGlzcGxheVpvb21Db250cm9scygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1FbWJlZGRlZFpvb21Db250cm9sID0gbmV3IFpvb21Db250cm9sRW1iZWRkZWQodGhpcywgbVdlYlZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUVtYmVkZGVkWm9vbUNvbnRyb2w7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtRXh0ZXJuYWxab29tQ29udHJvbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1FeHRlcm5hbFpvb21Db250cm9sID0gbmV3IFpvb21Db250cm9sRXh0ZXJuYWwobVdlYlZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUV4dGVybmFsWm9vbUNvbnRyb2w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52b2tlWm9vbVBpY2tlcigpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udHJvbC5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzWm9vbVBpY2tlcigpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udHJvbC5oaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1pvb21QaWNrZXJWaXNpYmxlKCkgeworICAgICAgICBab29tQ29udHJvbEJhc2UgY29udHJvbCA9IGdldEN1cnJlbnRab29tQ29udHJvbCgpOworICAgICAgICByZXR1cm4gKGNvbnRyb2wgIT0gbnVsbCkgPyBjb250cm9sLmlzVmlzaWJsZSgpIDogZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlWm9vbVBpY2tlcigpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udHJvbC51cGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbWJlZGRlZCB6b29tIGNvbnRyb2wgaW50ZXJjZXB0cyB0b3VjaCBldmVudHMgYW5kIGF1dG9tYXRpY2FsbHkgc3RheXMKKyAgICAgKiB2aXNpYmxlLiBUaGUgZXh0ZXJuYWwgY29udHJvbCBuZWVkcyB0byBjb25zdGFudGx5IHJlZnJlc2ggaXRzIGludGVybmFsCisgICAgICogdGltZXIgdG8gc3RheSB2aXNpYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGtlZXBab29tUGlja2VyVmlzaWJsZSgpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiBjb250cm9sID09IG1FeHRlcm5hbFpvb21Db250cm9sKSB7CisgICAgICAgICAgICBjb250cm9sLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEV4dGVybmFsWm9vbVBpY2tlcigpIHsKKyAgICAgICAgWm9vbUNvbnRyb2xCYXNlIGNvbnRyb2wgPSBnZXRDdXJyZW50Wm9vbUNvbnRyb2woKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiBjb250cm9sID09IG1FeHRlcm5hbFpvb21Db250cm9sKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dGVybmFsWm9vbUNvbnRyb2wuZ2V0Q29udHJvbHMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2VicnVudGltZS9XZWJSdW50aW1lQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4YzYwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYnJ1bnRpbWUvV2ViUnVudGltZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2VicnVudGltZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJDaHJvbWVDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIFRoZSBydW50aW1lIHVzZWQgdG8gZGlzcGxheSBpbnN0YWxsZWQgd2ViIGFwcGxpY2F0aW9ucy4KKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJSdW50aW1lQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dUQUcgPSAiV2ViUnVudGltZUFjdGl2aXR5IjsKKworICAgIHByaXZhdGUgV2ViVmlldyBtV2ViVmlldzsKKyAgICBwcml2YXRlIFVSTCBtQmFzZVVybDsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtU3BsYXNoU2NyZWVuOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZW5zaXRpdmVGZWF0dXJlcyB7CisgICAgICAgIC8vIEFsbCBvZiB0aGUgc2Vuc2l0aXZlIGZlYXR1cmVzCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb247CisgICAgICAgIC8vIE9uIEFuZHJvaWQsIHRoZSBCcm93c2VyIGRvZXNuJ3QgcHJvbXB0IGZvciBkYXRhYmFzZSBhY2Nlc3MsIHNvIHdlIGRvbid0IHJlcXVpcmUgYW4KKyAgICAgICAgLy8gZXhwbGljaXQgcGVybWlzc2lvbiBoZXJlIGluIHRoZSBXZWJSdW50aW1lQWN0aXZpdHksIGFuZCB0aGVyZSdzIG5vIEFuZHJvaWQgc3lzdGVtCisgICAgICAgIC8vIHBlcm1pc3Npb24gcmVxdWlyZWQgZm9yIGl0IGVpdGhlci4KKyAgICAgICAgLy9wcml2YXRlIGJvb2xlYW4gbURhdGFiYXNlOworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEdlb2xvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG1HZW9sb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvbihib29sZWFuIGdlb2xvY2F0aW9uKSB7CisgICAgICAgICAgICBtR2VvbG9jYXRpb24gPSBnZW9sb2NhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDYW4ndCBnZXQgbWV0YSBkYXRhIHVzaW5nIGdldEFwcGxpY2F0aW9uSW5mbygpIGFzIGl0IGRvZXNuJ3QgcGFzcyBHRVRfTUVUQV9EQVRBCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBhY2thZ2VNYW5hZ2VyID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUodGhpcywgZ2V0Q2xhc3MoKSk7CisgICAgICAgIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm8gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZpdHlJbmZvID0gcGFja2FnZU1hbmFnZXIuZ2V0QWN0aXZpdHlJbmZvKGNvbXBvbmVudE5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiRmFpbGVkIHRvIGZpbmQgY29tcG9uZW50Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2aXR5SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZChMT0dUQUcsICJGYWlsZWQgdG8gZ2V0IGFjdGl2aXR5IGluZm8iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bmRsZSBtZXRhRGF0YSA9IGFjdGl2aXR5SW5mby5tZXRhRGF0YTsKKyAgICAgICAgaWYgKG1ldGFEYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIG1ldGEgZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVybCA9IG1ldGFEYXRhLmdldFN0cmluZygiYW5kcm9pZC53ZWJydW50aW1lLnVybCIpOworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5kKExPR1RBRywgIk5vIFVSTCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXNlVXJsID0gbmV3IFVSTCh1cmwpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoTE9HVEFHLCAiSW52YWxpZCBVUkwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbCBmYWxzZSBieSBkZWZhdWx0LCBhbmQgcmVhZGluZyBub24tZXhpc3RlbnQgYnVuZGxlIHByb3BlcnRpZXMgZ2l2ZXMgZmFsc2UgdG9vLgorICAgICAgICBmaW5hbCBTZW5zaXRpdmVGZWF0dXJlcyBzZW5zaXRpdmVGZWF0dXJlcyA9IG5ldyBTZW5zaXRpdmVGZWF0dXJlcygpOworICAgICAgICBzZW5zaXRpdmVGZWF0dXJlcy5zZXRHZW9sb2NhdGlvbihtZXRhRGF0YS5nZXRCb29sZWFuKCJhbmRyb2lkLndlYnJ1bnRpbWUuU2Vuc2l0aXZlRmVhdHVyZXNHZW9sb2NhdGlvbiIpKTsKKworICAgICAgICBnZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LndlYl9ydW50aW1lKTsKKyAgICAgICAgbVdlYlZpZXcgPSAoV2ViVmlldykgZmluZFZpZXdCeUlkKFIuaWQud2Vidmlldyk7CisgICAgICAgIG1TcGxhc2hTY3JlZW4gPSAoSW1hZ2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zcGxhc2hzY3JlZW4pOworICAgICAgICBtU3BsYXNoU2NyZWVuLnNldEltYWdlUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0SWRlbnRpZmllcigic3BsYXNoX3NjcmVlbiIsICJkcmF3YWJsZSIsIGdldFBhY2thZ2VOYW1lKCkpKTsKKyAgICAgICAgbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbVdlYlZpZXcuc2V0V2ViVmlld0NsaWVudChuZXcgV2ViVmlld0NsaWVudCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVSTCBuZXdPcmlnaW4gPSBuZXcgVVJMKHVybCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmVTYW1lT3JpZ2luKG1CYXNlVXJsLCBuZXdPcmlnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzaW1wbGUgc2FtZSBvcmlnaW4gdGVzdCBwYXNzZXMsIGxvYWQgaW4gdGhlIHdlYnZpZXcuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGxvYWQgYW55dGhpbmcgaWYgdGhpcyB3YXNuJ3QgYSBwcm9wZXIgVVJMLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyBpcyBhIFVSTCB0aGF0IGlzIG5vdCBzYW1lIG9yaWdpbiBzbyBwYXNzIGl0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIEJyb3dzZXIgdG8gbG9hZC4KKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UodXJsKSkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgeworICAgICAgICAgICAgICAgIGlmIChtU3BsYXNoU2NyZWVuICE9IG51bGwgJiYgbVNwbGFzaFNjcmVlbi5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIG1TcGxhc2hTY3JlZW4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICBtU3BsYXNoU2NyZWVuID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIFVzZSBhIGN1c3RvbSBXZWJDaHJvbWVDbGllbnQgd2l0aCBnZW9sb2NhdGlvbiBwZXJtaXNzaW9ucyBoYW5kbGluZy4KKyAgICAgICAgbVdlYlZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlb2xvY2F0aW9uUGVybWlzc2lvbnNTaG93UHJvbXB0KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbiwgR2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoaXMgb3JpZ2luIGlmIGl0IGhhcyBHZW9sb2NhdGlvbiBwZXJtaXNzaW9ucywgb3RoZXJ3aXNlIGRlbnkuCisgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHNlbnNpdGl2ZUZlYXR1cmVzLmdldEdlb2xvY2F0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBvcmlnaW5VcmwgPSBuZXcgVVJMKG9yaWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gYXJlU2FtZU9yaWdpbihtQmFzZVVybCwgb3JpZ2luVXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIGFsbG93ZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBEQiBsb2NhdGlvbi4gT3B0aW9uYWwuIEdlb2xvY2F0aW9uIHdvcmtzIHdpdGhvdXQgREJzLgorICAgICAgICBtV2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEdlb2xvY2F0aW9uRGF0YWJhc2VQYXRoKAorICAgICAgICAgICAgICAgIGdldERpcigiZ2VvbG9jYXRpb24iLCBNT0RFX1BSSVZBVEUpLmdldFBhdGgoKSk7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gbWV0YURhdGEuZ2V0U3RyaW5nKCJhbmRyb2lkLndlYnJ1bnRpbWUudGl0bGUiKTsKKyAgICAgICAgLy8gV2UgdHVybmVkIG9mZiB0aGUgdGl0bGUgYmFyIHRvIGdvIGZ1bGwgc2NyZWVuIHNvIGRpc3BsYXkgdGhlCisgICAgICAgIC8vIHdlYmFwcCdzIHRpdGxlIGFzIGEgdG9hc3QuCisgICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCB0aXRsZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSB3ZWJhcHAncyBiYXNlIFVSTC4KKyAgICAgICAgbVdlYlZpZXcubG9hZFVybCh1cmwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIG1XZWJWaWV3LmNhbkdvQmFjaygpKSB7CisgICAgICAgICAgICBtV2ViVmlldy5nb0JhY2soKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIG1lbnUuYWRkKDAsIDAsIDAsICJNZW51IGl0ZW0gMSIpOworICAgICAgICBtZW51LmFkZCgwLCAxLCAwLCAiTWVudSBpdGVtIDIiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcmVTYW1lT3JpZ2luKFVSTCBhLCBVUkwgYikgeworICAgICAgICBpbnQgYVBvcnQgPSBhLmdldFBvcnQoKSA9PSAtMSA/IGEuZ2V0RGVmYXVsdFBvcnQoKSA6IGEuZ2V0UG9ydCgpOworICAgICAgICBpbnQgYlBvcnQgPSBiLmdldFBvcnQoKSA9PSAtMSA/IGIuZ2V0RGVmYXVsdFBvcnQoKSA6IGIuZ2V0UG9ydCgpOworICAgICAgICByZXR1cm4gYS5nZXRQcm90b2NvbCgpLmVxdWFscyhiLmdldFByb3RvY29sKCkpICYmIGFQb3J0ID09IGJQb3J0ICYmIGEuZ2V0SG9zdCgpLmVxdWFscyhiLmdldEhvc3QoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Fic0xpc3RWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQppbmRleCA4ZjVjMzVlLi5kODdmNTVmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YQpAQCAtMTYsMTIgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlRyYW5zaXRpb25EcmF3YWJsZTsKQEAgLTM0LDExICszMywxNiBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudS5Db250ZXh0TWVudUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwpAQCAtNDYsMTMgKzUwLDE0IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkJhc2VJbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uV3JhcHBlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTcwLDEwICs3NSwxMiBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQWJzTGlzdFZpZXdfY2FjaGVDb2xvckhpbnQKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Zhc3RTY3JvbGxFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBYnNMaXN0Vmlld19zbW9vdGhTY3JvbGxiYXIKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0Fic0xpc3RWaWV3X2Nob2ljZU1vZGUKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic0xpc3RWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXc8TGlzdEFkYXB0ZXI+IGltcGxlbWVudHMgVGV4dFdhdGNoZXIsCiAgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciwgRmlsdGVyLkZpbHRlckxpc3RlbmVyLAotICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBWaWV3VHJlZU9ic2VydmVyLk9uVG91Y2hNb2RlQ2hhbmdlTGlzdGVuZXIsCisgICAgICAgIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKIAogICAgIC8qKgogICAgICAqIERpc2FibGVzIHRoZSB0cmFuc2NyaXB0IG1vZGUuCkBAIC0xMzAsMTcgKzEzNyw2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX0ZMSU5HID0gNDsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdG91Y2ggZ2VzdHVyZSBpcyBhbiBvdmVyc2Nyb2xsIC0gYSBzY3JvbGwgYmV5b25kIHRoZSBiZWdpbm5pbmcgb3IgZW5kLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9PVkVSU0NST0xMID0gNTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdmlldyBpcyBiZWluZyBmbHVuZyBvdXRzaWRlIG9mIG5vcm1hbCBjb250ZW50IGJvdW5kcwotICAgICAqIGFuZCB3aWxsIHNwcmluZyBiYWNrLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9VQ0hfTU9ERV9PVkVSRkxJTkcgPSA2OwotCi0gICAgLyoqCiAgICAgICogUmVndWxhciBsYXlvdXQgLSB1c3VhbGx5IGFuIHVuc29saWNpdGVkIGxheW91dCBmcm9tIHRoZSB2aWV3IHN5c3RlbQogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX05PUk1BTCA9IDA7CkBAIC0xNzgsNiArMTc0LDU3IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfTU9WRV9TRUxFQ1RJT04gPSA2OwogCiAgICAgLyoqCisgICAgICogTm9ybWFsIGxpc3QgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjaG9pY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTk9ORSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgdXAgdG8gb25lIGNob2ljZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX1NJTkdMRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9NT0RFX01VTFRJUExFID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzIGluIGEgbW9kYWwgc2VsZWN0aW9uIG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCA9IDM7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBpZi9ob3cgdGhlIHVzZXIgbWF5IGNob29zZS9jaGVjayBpdGVtcyBpbiB0aGUgbGlzdAorICAgICAqLworICAgIGludCBtQ2hvaWNlTW9kZSA9IENIT0lDRV9NT0RFX05PTkU7CisKKyAgICAvKioKKyAgICAgKiBDb250cm9scyBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTC4gbnVsbCB3aGVuIGluYWN0aXZlLgorICAgICAqLworICAgIEFjdGlvbk1vZGUgbUNob2ljZUFjdGlvbk1vZGU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVyIGZvciB0aGUgbXVsdGlwbGUgY2hvaWNlIG1vZGUgY2FsbGJhY2s7IEFic0xpc3RWaWV3IG5lZWRzIHRvIHBlcmZvcm0KKyAgICAgKiBhIGZldyBleHRyYSBhY3Rpb25zIGFyb3VuZCB3aGF0IGFwcGxpY2F0aW9uIGNvZGUgZG9lcy4KKyAgICAgKi8KKyAgICBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjazsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgY291bnQgb2YgaG93IG1hbnkgaXRlbXMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgaW50IG1DaGVja2VkSXRlbUNvdW50OworCisgICAgLyoqCisgICAgICogUnVubmluZyBzdGF0ZSBvZiB3aGljaCBwb3NpdGlvbnMgYXJlIGN1cnJlbnRseSBjaGVja2VkCisgICAgICovCisgICAgU3BhcnNlQm9vbGVhbkFycmF5IG1DaGVja1N0YXRlczsKKworICAgIC8qKgorICAgICAqIFJ1bm5pbmcgc3RhdGUgb2Ygd2hpY2ggSURzIGFyZSBjdXJyZW50bHkgY2hlY2tlZAorICAgICAqLworICAgIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBtQ2hlY2tlZElkU3RhdGVzOworCisgICAgLyoqCiAgICAgICogQ29udHJvbHMgaG93IHRoZSBuZXh0IGxheW91dCB3aWxsIGhhcHBlbgogICAgICAqLwogICAgIGludCBtTGF5b3V0TW9kZSA9IExBWU9VVF9OT1JNQUw7CkBAIC0xOTMsNiArMjQwLDExIEBACiAgICAgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVtb3RlIGFkYXB0ZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyB2aWV3IHRvIGJlIHNldAorICAgICAqLworICAgIHByaXZhdGUgUmVtb3RlVmlld3NBZGFwdGVyIG1SZW1vdGVBZGFwdGVyOworCisgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3Qgc2VsZWN0b3Igc2hvdWxkIGJlIGRyYXduIG9uIHRvcCBvZiB0aGUgY2hpbGRyZW4gb3IgYmVoaW5kCiAgICAgICovCiAgICAgYm9vbGVhbiBtRHJhd1NlbGVjdG9yT25Ub3AgPSBmYWxzZTsKQEAgLTM4MiwxNiArNDM0LDYgQEAKICAgICBwcml2YXRlIENvbnRleHRNZW51SW5mbyBtQ29udGV4dE1lbnVJbmZvID0gbnVsbDsKICAgICAKICAgICAvKioKLSAgICAgKiBNYXhpbXVtIGRpc3RhbmNlIHRvIHJlY29yZCBvdmVyc2Nyb2xsCi0gICAgICovCi0gICAgaW50IG1PdmVyc2Nyb2xsTWF4OwotCi0gICAgLyoqCi0gICAgICogQ29udGVudCBoZWlnaHQgZGl2aWRlZCBieSB0aGlzIGlzIHRoZSBvdmVyc2Nyb2xsIGxpbWl0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlNDUk9MTF9MSU1JVF9ESVZJU09SID0gMzsKLQotICAgIC8qKgogICAgICAqIFVzZWQgdG8gcmVxdWVzdCBhIGxheW91dCB3aGVuIHdlIGNoYW5nZWQgdG91Y2ggbW9kZQogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT1VDSF9NT0RFX1VOS05PV04gPSAtMTsKQEAgLTQ4NCw0MyArNTI2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QT0lOVEVSID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBNYXhpbXVtIGRpc3RhbmNlIHRvIG92ZXJzY3JvbGwgYnkgZHVyaW5nIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBkaXN0YW5jZSB0byBvdmVyZmxpbmcgZHVyaW5nIGVkZ2UgZWZmZWN0cwotICAgICAqLwotICAgIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0KLSAgICAvLyBUaGVzZSB0d28gRWRnZUdsb3dzIGFyZSBhbHdheXMgc2V0IGFuZCB1c2VkIHRvZ2V0aGVyLgotICAgIC8vIENoZWNraW5nIG9uZSBmb3IgbnVsbCBpcyBhcyBnb29kIGFzIGNoZWNraW5nIGJvdGguCi0KLSAgICAvKioKLSAgICAgKiBUcmFja3MgdGhlIHN0YXRlIG9mIHRoZSB0b3AgZWRnZSBnbG93LgotICAgICAqLwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93VG9wOwotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgYm90dG9tIGVkZ2UgZ2xvdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0JvdHRvbTsKLQotICAgIC8qKgotICAgICAqIEFuIGVzdGltYXRlIG9mIGhvdyBtYW55IHBpeGVscyBhcmUgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZAotICAgICAqIHRoZSB0b3Agb2YgdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBhZGFwdGVyLCBiYXNlZCBvbiB0aGUgbGFzdCB0aW1lCi0gICAgICogd2Ugc2F3IGl0LiBVc2VkIHRvIGhpbnQgd2hlcmUgdG8gZHJhdyBlZGdlIGdsb3dzLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzczsKLQotICAgIC8qKgotICAgICAqIEFuIGVzdGltYXRlIG9mIGhvdyBtYW55IHBpeGVscyBhcmUgYmV0d2VlbiB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IGFuZAotICAgICAqIHRoZSBib3R0b20gb2YgdGhlIGxhc3QgcG9zaXRpb24gaW4gdGhlIGFkYXB0ZXIsIGJhc2VkIG9uIHRoZSBsYXN0IHRpbWUKLSAgICAgKiB3ZSBzYXcgaXQuIFVzZWQgdG8gaGludCB3aGVyZSB0byBkcmF3IGVkZ2UgZ2xvd3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3M7Ci0KLSAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpc3Qgb3IgZ3JpZAogICAgICAqIGhhcyBiZWVuIHNjcm9sbGVkLgogICAgICAqLwpAQCAtNjE5LDYgKzYyNCwxOCBAQAogCiAgICAgICAgIGJvb2xlYW4gc21vb3RoU2Nyb2xsYmFyID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkFic0xpc3RWaWV3X3Ntb290aFNjcm9sbGJhciwgdHJ1ZSk7CiAgICAgICAgIHNldFNtb290aFNjcm9sbGJhckVuYWJsZWQoc21vb3RoU2Nyb2xsYmFyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBhZGFwdGVySWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfYWRhcHRlciwgMCk7CisgICAgICAgIGlmIChhZGFwdGVySWQgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjID0gY29udGV4dDsKKyAgICAgICAgICAgIHBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWRhcHRlcihBZGFwdGVycy5sb2FkQWRhcHRlcihjLCBhZGFwdGVySWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuQWJzTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOwogICAgIH0KQEAgLTYzNSwzOSArNjUyLDMxMiBAQAogICAgICAgICBtVG91Y2hTbG9wID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgbU1pbmltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWluaW11bUZsaW5nVmVsb2NpdHkoKTsKICAgICAgICAgbU1heGltdW1WZWxvY2l0eSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkTWF4aW11bUZsaW5nVmVsb2NpdHkoKTsKLSAgICAgICAgbU92ZXJzY3JvbGxEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcnNjcm9sbERpc3RhbmNlKCk7Ci0gICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkT3ZlcmZsaW5nRGlzdGFuY2UoKTsKLQogICAgICAgICBtRGVuc2l0eVNjYWxlID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoTGlzdEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7CisKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbGwgbGlzdCBjb250ZW50IGN1cnJlbnRseSBmaXRzIHdpdGhpbiB0aGUgdmlldyBib3VuZGFyaWVzCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGN1cnJlbnRseSBzZWxlY3RlZC4gVGhpcyB3aWxsIG9ubHkgYmUgdmFsaWQKKyAgICAgKiBpZiB0aGUgY2hvaWNlIG1vZGUgaXMgbm90IHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0gKGRlZmF1bHQpLgorICAgICAqCisgICAgICogPHA+VG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBpdGVtcyB0aGF0IGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQsIHVzZSBvbmUgb2YKKyAgICAgKiB0aGUgPGNvZGU+Z2V0Q2hlY2tlZCo8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaXRlbXMgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpCisgICAgICogQHNlZSAjZ2V0Q2hlY2tlZEl0ZW1JZHMoKQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50Rml0cygpIHsKLSAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGlmIChjaGlsZENvdW50ICE9IG1JdGVtQ291bnQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtQ2hlY2tlZEl0ZW1Db3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQorICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9CisgICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KKyAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKKyAgICAgKiAgICAgICAgIGlzIGludmFsaWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRBdCgwKS5nZXRUb3AoKSA+PSAwICYmIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9IG1Cb3R0b207CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIGNob2ljZQorICAgICAqIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgY2hlY2tlZCBpdGVtIG9yCisgICAgICogICAgICAgICB7QGxpbmsgI0lOVkFMSURfUE9TSVRJT059IGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCAmJiBtQ2hlY2tTdGF0ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXMua2V5QXQoMCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSU5WQUxJRF9QT1NJVElPTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgY2hlY2tlZCBpdGVtcyBpbiB0aGUgbGlzdC4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmCisgICAgICogdGhlIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gIEEgU3BhcnNlQm9vbGVhbkFycmF5IHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgZm9yIGVhY2ggY2FsbCB0bworICAgICAqICAgICAgICAgIGdldChpbnQgcG9zaXRpb24pIHdoZXJlIHBvc2l0aW9uIGlzIGEgcG9zaXRpb24gaW4gdGhlIGxpc3QsCisgICAgICogICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNob2ljZSBtb2RlIGlzIHNldCB0bworICAgICAqICAgICAgICAgIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCisgICAgICovCisgICAgcHVibGljIFNwYXJzZUJvb2xlYW5BcnJheSBnZXRDaGVja2VkSXRlbVBvc2l0aW9ucygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2hlY2tTdGF0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaWRzLiBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlCisgICAgICogY2hvaWNlIG1vZGUgaGFzIG5vdCBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9IGFuZCB0aGUgYWRhcHRlcgorICAgICAqIGhhcyBzdGFibGUgSURzLiAoe0BsaW5rIExpc3RBZGFwdGVyI2hhc1N0YWJsZUlkcygpfSA9PSB7QGNvZGUgdHJ1ZX0pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbmV3IGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBvZiBlYWNoIGNoZWNrZWQgaXRlbSBpbiB0aGUKKyAgICAgKiAgICAgICAgIGxpc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja2VkSXRlbUlkcygpIHsKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX05PTkUgfHwgbUNoZWNrZWRJZFN0YXRlcyA9PSBudWxsIHx8IG1BZGFwdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgbG9uZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxCb29sZWFuPiBpZFN0YXRlcyA9IG1DaGVja2VkSWRTdGF0ZXM7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGlkU3RhdGVzLnNpemUoKTsKKyAgICAgICAgZmluYWwgbG9uZ1tdIGlkcyA9IG5ldyBsb25nW2NvdW50XTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbnkgY2hvaWNlcyBwcmV2aW91c2x5IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2hvaWNlcygpIHsKKyAgICAgICAgaWYgKG1DaGVja1N0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gVGhlIGlzIG9ubHkgdmFsaWQgaWYKKyAgICAgKiB0aGUgY2hvaWNlIG1vZGUgaGFzIGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSBvcgorICAgICAqIHtAbGluayAjQ0hPSUNFX01PREVfTVVMVElQTEV9LgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCBzZWxlY3Rpb24gbW9kZSBpZiBuZWVkZWQuIFdlIGRvbid0IG5lZWQgdG8gaWYgd2UncmUgdW5jaGVja2luZyBzb21ldGhpbmcuCisgICAgICAgIGlmICh2YWx1ZSAmJiBtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTCAmJiBtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IHN0YXJ0QWN0aW9uTW9kZShtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFIHx8IG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5kZWxldGUobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSXRlbUNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1DaG9pY2VBY3Rpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sIGlkLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKKyAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGVja1N0YXRlcy5zaXplKCkgPT0gMCB8fCAhbUNoZWNrU3RhdGVzLnZhbHVlQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgYSBkYXRhIGNoYW5nZSB3aGlsZSB3ZSBhcmUgaW4gdGhlIGxheW91dCBwaGFzZQorICAgICAgICBpZiAoIW1JbkxheW91dCAmJiAhbUJsb2NrTGF5b3V0UmVxdWVzdHMpIHsKKyAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUl0ZW1DbGljayhWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgeworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9NVUxUSVBMRSB8fAorICAgICAgICAgICAgICAgICAgICAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgJiYgbUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sub25JdGVtQ2hlY2tlZFN0YXRlQ2hhbmdlZChtQ2hvaWNlQWN0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgaWQsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX1NJTkdMRSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3VmFsdWUgPSAhbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJdGVtQ291bnQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoZWNrU3RhdGVzLnNpemUoKSA9PSAwIHx8ICFtQ2hlY2tTdGF0ZXMudmFsdWVBdCgwKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZEl0ZW1Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZWQgfD0gc3VwZXIucGVyZm9ybUl0ZW1DbGljayh2aWV3LCBwb3NpdGlvbiwgaWQpOworCisgICAgICAgIHJldHVybiBoYW5kbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKKyAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKKyAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKKyAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOworICAgICAgICBpZiAobUNob2ljZUFjdGlvbk1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICBtQ2hvaWNlQWN0aW9uTW9kZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChtQ2hlY2tTdGF0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgJiYgbUFkYXB0ZXIgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgeworICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNb2RhbCBtdWx0aS1jaG9pY2UgbW9kZSBvbmx5IGhhcyBjaG9pY2VzIHdoZW4gdGhlIG1vZGUgaXMgYWN0aXZlLiBDbGVhciB0aGVtLgorICAgICAgICAgICAgaWYgKG1DaG9pY2VNb2RlID09IENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKSB7CisgICAgICAgICAgICAgICAgY2xlYXJDaG9pY2VzKCk7CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHtAbGluayBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcn0gdGhhdCB3aWxsIG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIHRoZQorICAgICAqIHNlbGVjdGlvbiB7QGxpbmsgQWN0aW9uTW9kZX0uIE9ubHkgdXNlZCB3aGVuIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFX01PREFMfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgbWFuYWdlIHRoZSBzZWxlY3Rpb24gbW9kZQorICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hvaWNlTW9kZShpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICBtTXVsdGlDaG9pY2VNb2RlQ2FsbGJhY2sgPSBuZXcgTXVsdGlDaG9pY2VNb2RlV3JhcHBlcigpOworICAgICAgICB9CisgICAgICAgIG1NdWx0aUNob2ljZU1vZGVDYWxsYmFjay5zZXRXcmFwcGVkKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4OCw2ICsxMTc4LDggQEAKICAgICAgICAgaW50IHBvc2l0aW9uOwogICAgICAgICBpbnQgaGVpZ2h0OwogICAgICAgICBTdHJpbmcgZmlsdGVyOworICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKKyAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIEFic0xpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KQEAgLTkwNyw2ICsxMTk5LDEzIEBACiAgICAgICAgICAgICBwb3NpdGlvbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGhlaWdodCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGZpbHRlciA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUgPSBpbi5yZWFkU3BhcnNlQm9vbGVhbkFycmF5KCk7CisgICAgICAgICAgICBsb25nW10gaWRTdGF0ZSA9IGluLmNyZWF0ZUxvbmdBcnJheSgpOworCisgICAgICAgICAgICBpZiAoaWRTdGF0ZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgY2hlY2tJZFN0YXRlID0gbmV3IExvbmdTcGFyc2VBcnJheTxCb29sZWFuPigpOworICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZS5zZXRWYWx1ZXMoaWRTdGF0ZSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtOTE4LDYgKzEyMTcsOCBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KHBvc2l0aW9uKTsKICAgICAgICAgICAgIG91dC53cml0ZUludChoZWlnaHQpOwogICAgICAgICAgICAgb3V0LndyaXRlU3RyaW5nKGZpbHRlcik7CisgICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7CisgICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC05MjksNyArMTIzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgIiB2aWV3VG9wPSIgKyB2aWV3VG9wCiAgICAgICAgICAgICAgICAgICAgICsgIiBwb3NpdGlvbj0iICsgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgKyAiIGhlaWdodD0iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiBmaWx0ZXI9IiArIGZpbHRlciArICJ9IjsKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZpbHRlcj0iICsgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgpAQCAtOTkzLDYgKzEyOTUsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3MuY2hlY2tTdGF0ZSA9IG1DaGVja1N0YXRlczsKKyAgICAgICAgc3MuY2hlY2tJZFN0YXRlID0gbUNoZWNrZWRJZFN0YXRlczsKKwogICAgICAgICByZXR1cm4gc3M7CiAgICAgfQogCkBAIC0xMDI0LDYgKzEzMjksMTQgQEAKIAogICAgICAgICBzZXRGaWx0ZXJUZXh0KHNzLmZpbHRlcik7CiAKKyAgICAgICAgaWYgKHNzLmNoZWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gc3MuY2hlY2tTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcy5jaGVja0lkU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IHNzLmNoZWNrSWRTdGF0ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKQEAgLTExNjYsMTAgKzE0NzksNiBAQAogICAgICAgICBpbnQgcmVzdWx0OwogICAgICAgICBpZiAobVNtb290aFNjcm9sbGJhckVuYWJsZWQpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1JdGVtQ291bnQgKiAxMDAsIDApOwotICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBvdmVyc2Nyb2xsCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiBtSXRlbUNvdW50ICogMTAwKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtSXRlbUNvdW50OwogICAgICAgICB9CkBAIC0xMjQyLDggKzE1NTEsNiBAQAogCiAgICAgICAgIGxheW91dENoaWxkcmVuKCk7CiAgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOwotCi0gICAgICAgIG1PdmVyc2Nyb2xsTWF4ID0gKGIgLSB0KSAvIE9WRVJTQ1JPTExfTElNSVRfRElWSVNPUjsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NzMsNiArMTk4MCwxMSBAQAogICAgICAgICAgICAgICAgIHRyZWVPYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtRGF0YVNldE9ic2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2OTMsNiArMjAwNSwxMSBAQAogICAgICAgICAgICAgICAgIG1HbG9iYWxMYXlvdXRMaXN0ZW5lckFkZGVkRmlsdGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzEwLDcgKzIwMjcsNiBAQAogICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLmVuZEZsaW5nKCk7CiAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxZICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSAwOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2hHbG93cygpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTg0NCwxMCArMjE2MCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKKyAgICBib29sZWFuIHBlcmZvcm1Mb25nUHJlc3MoZmluYWwgVmlldyBjaGlsZCwKICAgICAgICAgICAgIGZpbmFsIGludCBsb25nUHJlc3NQb3NpdGlvbiwgZmluYWwgbG9uZyBsb25nUHJlc3NJZCkgewotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBmYWxzZTsKKyAgICAgICAgLy8gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwgdGFrZXMgb3ZlciBsb25nIHByZXNzLgorICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpIHsKKyAgICAgICAgICAgIGlmIChtQ2hvaWNlQWN0aW9uTW9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUobU11bHRpQ2hvaWNlTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBzZXRJdGVtQ2hlY2tlZChsb25nUHJlc3NQb3NpdGlvbiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBzZWxlY3QgdGhlIGxvbmcgcHJlc3NlZCBpdGVtIGlmIHdlIHdlcmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgLy8gc2VsZWN0aW9uIG1vZGU/IChpLmUuIHRyZWF0IGl0IGxpa2UgYW4gaXRlbSBjbGljaz8pCisgICAgICAgICAgICBwZXJmb3JtSGFwdGljRmVlZGJhY2soSGFwdGljRmVlZGJhY2tDb25zdGFudHMuTE9OR19QUkVTUyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICBpZiAobU9uSXRlbUxvbmdDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGhhbmRsZWQgPSBtT25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIub25JdGVtTG9uZ0NsaWNrKEFic0xpc3RWaWV3LnRoaXMsIGNoaWxkLAogICAgICAgICAgICAgICAgICAgICBsb25nUHJlc3NQb3NpdGlvbiwgbG9uZ1ByZXNzSWQpOwpAQCAtMjAyMCwxMCArMjM0Nyw5IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbW92ZWQgZmFyIGVub3VnaCB0aGF0IGl0IGxvb2tzIG1vcmUgbGlrZSBhCiAgICAgICAgIC8vIHNjcm9sbCB0aGFuIGEgdGFwCiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IE1hdGguYWJzKGRlbHRhWSk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gb3ZlcnNjcm9sbCA9IG1TY3JvbGxZICE9IDA7Ci0gICAgICAgIGlmIChvdmVyc2Nyb2xsIHx8IGRpc3RhbmNlID4gbVRvdWNoU2xvcCkgeworICAgICAgICBpZiAoZGlzdGFuY2UgPiBtVG91Y2hTbG9wKSB7CiAgICAgICAgICAgICBjcmVhdGVTY3JvbGxpbmdDYWNoZSgpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IG92ZXJzY3JvbGwgPyBUT1VDSF9NT0RFX09WRVJTQ1JPTEwgOiBUT1VDSF9NT0RFX1NDUk9MTDsKKyAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gZGVsdGFZOwogICAgICAgICAgICAgZmluYWwgSGFuZGxlciBoYW5kbGVyID0gZ2V0SGFuZGxlcigpOwogICAgICAgICAgICAgLy8gSGFuZGxlciBzaG91bGQgbm90IGJlIG51bGwgdW5sZXNzIHRoZSBBYnNMaXN0VmlldyBpcyBub3QgYXR0YWNoZWQgdG8gYQpAQCAtMjA1OSwxOSArMjM4NSw2IEBACiAgICAgICAgICAgICAgICAgLy8gdG91Y2ggbW9kZSkuIEZvcmNlIGFuIGluaXRpYWwgbGF5b3V0IHRvIGdldCByaWQgb2YgdGhlIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICBsYXlvdXRDaGlsZHJlbigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHRvdWNoTW9kZSA9IG1Ub3VjaE1vZGU7Ci0gICAgICAgICAgICBpZiAodG91Y2hNb2RlID09IFRPVUNIX01PREVfT1ZFUlNDUk9MTCB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSRkxJTkcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZS5lbmRGbGluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY3JvbGxZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoR2xvd3MoKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjEwMiw2MyArMjQxNSw0OSBAQAogCiAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewotICAgICAgICAgICAgc3dpdGNoIChtVG91Y2hNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0gbUxhc3RZID0gKGludCkgZXYuZ2V0WSgpOwotICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZCgwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB4ID0gKGludCkgZXYuZ2V0WCgpOworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7CisgICAgICAgICAgICBpbnQgbW90aW9uUG9zaXRpb24gPSBwb2ludFRvUG9zaXRpb24oeCwgeSk7CisgICAgICAgICAgICBpZiAoIW1EYXRhQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChnZXRBZGFwdGVyKCkuaXNFbmFibGVkKG1vdGlvblBvc2l0aW9uKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjbGlja2VkIG9uIGFuIGFjdHVhbCB2aWV3IChhbmQgd2FzIG5vdCBzdG9wcGluZyBhIGZsaW5nKS4gSXQgbWlnaHQgYmUgYQorICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9ET1dOOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBEZWJvdW5jZQorICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NoZWNrRm9yVGFwID0gbmV3IENoZWNrRm9yVGFwKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXYuZ2V0RWRnZUZsYWdzKCkgIT0gMCAmJiBtb3Rpb25Qb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSwgd2Ugd2lsbCBiYWlsIG91dCBhbmQgdHJ5IGFnYWluLiBUaGlzIGFsbG93cyB0aGUgZWRnZSBjb3JyZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGluIFZpZXdSb290IHRvIHRyeSB0byBmaW5kIGEgbmVhcmJ5IHZpZXcgdG8gc2VsZWN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldi5nZXRYKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KSBldi5nZXRZKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gcG9pbnRUb1Bvc2l0aW9uKHgsIHkpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobVRvdWNoTW9kZSAhPSBUT1VDSF9NT0RFX0ZMSU5HKSAmJiAobW90aW9uUG9zaXRpb24gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZ2V0QWRhcHRlcigpLmlzRW5hYmxlZChtb3Rpb25Qb3NpdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNsaWNrZWQgb24gYW4gYWN0dWFsIHZpZXcgKGFuZCB3YXMgbm90IHN0b3BwaW5nIGEgZmxpbmcpLiBJdCBtaWdodCBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGljayBvciBhIHNjcm9sbC4gQXNzdW1lIGl0IGlzIGEgY2xpY2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZQotICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIERlYm91bmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdDaGVja0ZvclRhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDaGVja0ZvclRhcCA9IG5ldyBDaGVja0ZvclRhcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVBlbmRpbmdDaGVja0ZvclRhcCwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5nZXRFZGdlRmxhZ3MoKSAhPSAwICYmIG1vdGlvblBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYSB2aWV3IHRvIGNsaWNrIG9uLCBidXQgdGhlIGRvd24gZXZlbnQgd2FzIHRvdWNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2UsIHdlIHdpbGwgYmFpbCBvdXQgYW5kIHRyeSBhZ2Fpbi4gVGhpcyBhbGxvd3MgdGhlIGVkZ2UgY29ycmVjdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gVmlld1Jvb3QgdG8gdHJ5IHRvIGZpbmQgYSBuZWFyYnkgdmlldyB0byBzZWxlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hNb2RlID09IFRPVUNIX01PREVfRkxJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIGEgZmxpbmcuIEl0IGlzIGEgc2Nyb2xsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfU0NST0xMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0U2Nyb2xsU3RhdGVDaGFuZ2UoT25TY3JvbGxMaXN0ZW5lci5TQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9GTElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcHBlZCBhIGZsaW5nLiBJdCBpcyBhIHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjcm9sbGluZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9TQ1JPTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uQ29ycmVjdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRNb3Rpb25Sb3coeSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9UT1VDSF9TQ1JPTEwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCi0gICAgICAgICAgICAgICAgICAgIHYgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gdi5nZXRUb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1vdGlvblggPSB4OwotICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBtTGFzdFkgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgd2hlcmUgdGhlIG1vdGlvbiBldmVudCBzdGFydGVkCisgICAgICAgICAgICAgICAgdiA9IGdldENoaWxkQXQobW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbU1vdGlvblZpZXdPcmlnaW5hbFRvcCA9IHYuZ2V0VG9wKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtTW90aW9uWCA9IHg7CisgICAgICAgICAgICBtTW90aW9uWSA9IHk7CisgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKKyAgICAgICAgICAgIG1MYXN0WSA9IEludGVnZXIuTUlOX1ZBTFVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjE5MSwyNSArMjQ5MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGlzYWxsb3dJbnRlcmNlcHRUb3VjaEV2ZW50KHRydWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vdGlvbkluZGV4OwotICAgICAgICAgICAgICAgICAgICBpZiAobU1vdGlvblBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbkluZGV4ID0gbU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbW90aW9uIHBvc2l0aW9uIHRoYXQgd2UgY2FuIHJlbGlhYmx5IHRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayBzb21ldGhpbmcgaW4gdGhlIG1pZGRsZSB0byBtYWtlIGEgYmVzdCBndWVzcyBhdCB0aGluZ3MgYmVsb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25JbmRleCA9IGdldENoaWxkQ291bnQoKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uVmlld1ByZXZUb3AgPSAwOwotICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3UHJldlRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFsbCB0aGlzIHdvcmsgaWYgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgYW55d2F5CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXRFZGdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7CkBAIC0yMjE3LDk5ICsyNTAwLDIzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobW90aW9uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdG9wIG9mIHRoZSBtb3Rpb24gdmlldyBpcyB3aGVyZSBpdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9zZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25WaWV3UmVhbFRvcCA9IG1vdGlvblZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgb3ZlcnNjcm9sbAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJzY3JvbGwgPSAtaW5jcmVtZW50YWxEZWx0YVkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdGlvblZpZXdSZWFsVG9wIC0gbW90aW9uVmlld1ByZXZUb3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCBvdmVyc2Nyb2xsLCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhtT3ZlcnNjcm9sbERpc3RhbmNlKSA9PSBNYXRoLmFicyhtU2Nyb2xsWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgb3ZlcmZsaW5nIGlmIHdlJ3JlIGF0IHRoZSBlZGdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlcnNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMUyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29udGVudEZpdHMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUlNDUk9MTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0RlbHRhWSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblB1bGwoKGZsb2F0KSBvdmVyc2Nyb2xsIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblB1bGwoKGZsb2F0KSBvdmVyc2Nyb2xsIC8gZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYXRFZGdlICYmIGdldENoaWxkQ291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IHRoaXMgbGlrZSB3ZSdyZSBzdGFydGluZyBhIG5ldyBzY3JvbGwgZnJvbSB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24uIFRoaXMgd2lsbCBsZXQgdGhlIHVzZXIgc3RhcnQgc2Nyb2xsaW5nIGJhY2sgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBuZWVkaW5nIHRvIHNjcm9sbCBiYWNrIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgd2hlcmUgdGhleSBoaXQgdGhlIGxpbWl0IGZpcnN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvblBvc2l0aW9uID0gZmluZE1vdGlvblJvdyh5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3Rpb25Qb3NpdGlvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtb3Rpb25Qb3NpdGlvbiAtIG1GaXJzdFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uVmlld09yaWdpbmFsVG9wID0gbW90aW9uVmlldy5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25Qb3NpdGlvbiA9IG1vdGlvblBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0WSA9IHk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUlNDUk9MTDoKLSAgICAgICAgICAgICAgICBpZiAoeSAhPSBtTGFzdFkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJhd0RlbHRhWSA9IGRlbHRhWTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGFZIC09IG1Nb3Rpb25Db3JyZWN0aW9uOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50YWxEZWx0YVkgPSBtTGFzdFkgIT0gSW50ZWdlci5NSU5fVkFMVUUgPyB5IC0gbUxhc3RZIDogZGVsdGFZOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRTY3JvbGwgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld1Njcm9sbCA9IG9sZFNjcm9sbCAtIGluY3JlbWVudGFsRGVsdGFZOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgob2xkU2Nyb2xsID49IDAgJiYgbmV3U2Nyb2xsIDw9IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNjcm9sbCA8PSAwICYmIG5ld1Njcm9sbCA+PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29taW5nIGJhY2sgdG8gJ3JlYWwnIGxpc3Qgc2Nyb2xsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbERlbHRhWSA9IC1uZXdTY3JvbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYWxsIHRoaXMgd29yayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnRhbERlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNb3Rpb25TY3JvbGwoaW5jcmVtZW50YWxEZWx0YVksIGluY3JlbWVudGFsRGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBiYWNrIGluCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1NDUk9MTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZCBub3Qgc2Nyb2xsIHRoZSBmdWxsIGFtb3VudC4gVHJlYXQgdGhpcyBlc3NlbnRpYWxseSBsaWtlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGEgbmV3IHRvdWNoIHNjcm9sbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3Rpb25Qb3NpdGlvbiA9IGZpbmRDbG9zZXN0TW90aW9uUm93KHkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvblZpZXcgPSBnZXRDaGlsZEF0KG1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25WaWV3T3JpZ2luYWxUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Nb3Rpb25ZID0geTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW90aW9uUG9zaXRpb24gPSBtb3Rpb25Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJzY3JvbGxCeSgwLCAtaW5jcmVtZW50YWxEZWx0YVksIDAsIG1TY3JvbGxZLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcnNjcm9sbERpc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnRGaXRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd0RlbHRhWSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhd0RlbHRhWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIC1pbmNyZW1lbnRhbERlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKG1PdmVyc2Nyb2xsRGlzdGFuY2UpID09IE1hdGguYWJzKG1TY3JvbGxZKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFsbG93IG92ZXJmbGluZyBpZiB3ZSdyZSBhdCB0aGUgZWRnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxhc3RZID0geTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM4MSwyOSArMjU4OCwxOCBAQAogICAgICAgICAgICAgY2FzZSBUT1VDSF9NT0RFX1NDUk9MTDoKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2hpbGRDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0Q2hpbGRUb3AgPSBnZXRDaGlsZEF0KDApLmdldFRvcCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdENoaWxkQm90dG9tID0gZ2V0Q2hpbGRBdChjaGlsZENvdW50IC0gMSkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50VG9wID0gbUxpc3RQYWRkaW5nLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbnRlbnRCb3R0b20gPSBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0Q2hpbGRUb3AgPj0gY29udGVudFRvcCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0UG9zaXRpb24gPT0gMCAmJiBnZXRDaGlsZEF0KDApLmdldFRvcCgpID49IG1MaXN0UGFkZGluZy50b3AgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPCBtSXRlbUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkQm90dG9tIDw9IGdldEhlaWdodCgpIC0gY29udGVudEJvdHRvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENoaWxkQXQoY2hpbGRDb3VudCAtIDEpLmdldEJvdHRvbSgpIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQoKSAtIG1MaXN0UGFkZGluZy5ib3R0b20pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX1JFU1Q7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlbG9jaXR5VHJhY2tlciB2ZWxvY2l0eVRyYWNrZXIgPSBtVmVsb2NpdHlUcmFja2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxpbmcgaWYgd2UgaGF2ZSBlbm91Z2ggdmVsb2NpdHkgYW5kIHdlIGFyZW4ndCBhdCBhIGJvdW5kYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2FuIHBvdGVudGlhbGx5IG92ZXJmbGluZyBtb3JlIHRoYW4gd2UgY2FuIG92ZXJzY3JvbGwsIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyB0aGUgd2VpcmQgYmVoYXZpb3Igd2hlcmUgeW91IGNhbiBzY3JvbGwgdG8gYSBib3VuZGFyeSB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGluZyBmdXJ0aGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoKG1GaXJzdFBvc2l0aW9uID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkVG9wID09IGNvbnRlbnRUb3AgLSBtT3ZlcnNjcm9sbERpc3RhbmNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZEJvdHRvbSA9PSBjb250ZW50Qm90dG9tICsgbU92ZXJzY3JvbGxEaXN0YW5jZSkpKSB7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsaW5nUnVubmFibGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxpbmdSdW5uYWJsZSA9IG5ldyBGbGluZ1J1bm5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjQyMCwzMiArMjYxNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9JRExFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgVmVsb2NpdHlUcmFja2VyIHZlbG9jaXR5VHJhY2tlciA9IG1WZWxvY2l0eVRyYWNrZXI7Ci0gICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGluaXRpYWxWZWxvY2l0eSA9IChpbnQpIHZlbG9jaXR5VHJhY2tlci5nZXRZVmVsb2NpdHkobUFjdGl2ZVBvaW50ZXJJZCk7Ci0KLSAgICAgICAgICAgICAgICByZXBvcnRTY3JvbGxTdGF0ZUNoYW5nZShPblNjcm9sbExpc3RlbmVyLlNDUk9MTF9TVEFURV9GTElORyk7Ci0gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0T3ZlcmZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U3ByaW5nYmFjaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKIAotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gTmVlZCB0byByZWRyYXcgc2luY2Ugd2UgcHJvYmFibHkgYXJlbid0IGRyYXdpbmcgdGhlIHNlbGVjdG9yIGFueW1vcmUKICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKIApAQCAtMjQ3MSw0MiArMjY0NSwyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1Ub3VjaE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSU0NST0xMOgotICAgICAgICAgICAgICAgIGlmIChtRmxpbmdSdW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GbGluZ1J1bm5hYmxlID0gbmV3IEZsaW5nUnVubmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUZsaW5nUnVubmFibGUuc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOworICAgICAgICAgICAgc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICBWaWV3IG1vdGlvblZpZXcgPSB0aGlzLmdldENoaWxkQXQobU1vdGlvblBvc2l0aW9uIC0gbUZpcnN0UG9zaXRpb24pOworICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1vdGlvblZpZXcuc2V0UHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAKLSAgICAgICAgICAgIGNhc2UgVE9VQ0hfTU9ERV9PVkVSRkxJTkc6Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyAtIGxldCBpdCBwbGF5IG91dC4KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciA9IGdldEhhbmRsZXIoKTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIFZpZXcgbW90aW9uVmlldyA9IHRoaXMuZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb3Rpb25WaWV3LnNldFByZXNzZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBnZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUGVuZGluZ0NoZWNrRm9yTG9uZ1ByZXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dCb3R0b20ub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1MzEsNjEgKzI2ODcsMTAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk92ZXJzY3JvbGxlZChpbnQgc2Nyb2xsWCwgaW50IHNjcm9sbFksCi0gICAgICAgICAgICBib29sZWFuIGNsYW1wZWRYLCBib29sZWFuIGNsYW1wZWRZKSB7Ci0gICAgICAgIG1TY3JvbGxZID0gc2Nyb2xsWTsKLQotICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgIC8vIFZlbG9jaXR5IGlzIGJyb2tlbiBieSBoaXR0aW5nIHRoZSBsaW1pdDsgZG9uJ3Qgc3RhcnQgYSBmbGluZyBvZmYgb2YgdGhpcy4KLSAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmICghbUVkZ2VHbG93VG9wLmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsIE1hdGgubWluKDAsIHNjcm9sbFkgKyBtRmlyc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MpKTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Auc2V0U2l6ZSh3aWR0aCAqIDIsIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wLmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dCb3R0b20uaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC13aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChoZWlnaHQsIHNjcm9sbFkgKyBtTGFzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcykpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1GYXN0U2Nyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgIGlmIChzY3JvbGxZICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaW4gdG8gdGhlIHRvcC9ib3R0b20gZHVyaW5nIG92ZXJzY3JvbGwKLSAgICAgICAgICAgICAgICBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIChmbG9hdCkgc2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GYXN0U2Nyb2xsZXIuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZhc3RTY3JvbGxlci5kcmF3KGNhbnZhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MDQsMTAgKzI3MDksNiBAQAogICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CiAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKICAgICAgICAgICAgIGludCB0b3VjaE1vZGUgPSBtVG91Y2hNb2RlOwotICAgICAgICAgICAgaWYgKHRvdWNoTW9kZSA9PSBUT1VDSF9NT0RFX09WRVJGTElORyB8fCB0b3VjaE1vZGUgPT0gVE9VQ0hfTU9ERV9PVkVSU0NST0xMKSB7Ci0gICAgICAgICAgICAgICAgbU1vdGlvbkNvcnJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBmaW5hbCBpbnQgeCA9IChpbnQpIGV2LmdldFgoKTsKICAgICAgICAgICAgIGZpbmFsIGludCB5ID0gKGludCkgZXYuZ2V0WSgpOwpAQCAtMjY3Miw3ICsyNzczLDYgQEAKICAgICAgICAgICAgIGZpbmFsIGludCBuZXdQb2ludGVySW5kZXggPSBwb2ludGVySW5kZXggPT0gMCA/IDEgOiAwOwogICAgICAgICAgICAgbU1vdGlvblggPSAoaW50KSBldi5nZXRYKG5ld1BvaW50ZXJJbmRleCk7CiAgICAgICAgICAgICBtTW90aW9uWSA9IChpbnQpIGV2LmdldFkobmV3UG9pbnRlckluZGV4KTsKLSAgICAgICAgICAgIG1Nb3Rpb25Db3JyZWN0aW9uID0gMDsKICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQobmV3UG9pbnRlckluZGV4KTsKICAgICAgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7CkBAIC0yNzI4LDcgKzI4MjgsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogVHJhY2tzIHRoZSBkZWNheSBvZiBhIGZsaW5nIHNjcm9sbAogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgICAgICAvKioKICAgICAgICAgICogWSB2YWx1ZSByZXBvcnRlZCBieSBtU2Nyb2xsZXIgb24gdGhlIHByZXZpb3VzIGZsaW5nCkBAIC0yNzM2LDcgKzI4MzYsNyBAQAogICAgICAgICBwcml2YXRlIGludCBtTGFzdEZsaW5nWTsKIAogICAgICAgICBGbGluZ1J1bm5hYmxlKCkgewotICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbVNjcm9sbGVyID0gbmV3IFNjcm9sbGVyKGdldENvbnRleHQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHN0YXJ0KGludCBpbml0aWFsVmVsb2NpdHkpIHsKQEAgLTI3NTUsNDIgKzI4NTUsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBzdGFydFNwcmluZ2JhY2soKSB7Ci0gICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2soMCwgbVNjcm9sbFksIDAsIDAsIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydE92ZXJmbGluZyhpbnQgaW5pdGlhbFZlbG9jaXR5KSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWluID0gbVNjcm9sbFkgPiAwID8gSW50ZWdlci5NSU5fVkFMVUUgOiAwOwotICAgICAgICAgICAgZmluYWwgaW50IG1heCA9IG1TY3JvbGxZID4gMCA/IDAgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZygwLCBtU2Nyb2xsWSwgMCwgaW5pdGlhbFZlbG9jaXR5LCAwLCAwLCBtaW4sIG1heCwgMCwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfT1ZFUkZMSU5HOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZWRnZVJlYWNoZWQoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsZXIubm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChtU2Nyb2xsWSwgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmICFjb250ZW50Rml0cygpKSkgewotICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX09WRVJGTElORzsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVsID0gKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpOwotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93VG9wLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKHZlbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgcG9zdCh0aGlzKTsKLSAgICAgICAgfQotCiAgICAgICAgIHZvaWQgc3RhcnRTY3JvbGwoaW50IGRpc3RhbmNlLCBpbnQgZHVyYXRpb24pIHsKICAgICAgICAgICAgIGludCBpbml0aWFsWSA9IGRpc3RhbmNlIDwgMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMDsKICAgICAgICAgICAgIG1MYXN0RmxpbmdZID0gaW5pdGlhbFk7CkBAIC0yODIzLDcgKzI4ODcsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOworICAgICAgICAgICAgICAgIGZpbmFsIFNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gbW9yZSA9IHNjcm9sbGVyLmNvbXB1dGVTY3JvbGxPZmZzZXQoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IHNjcm9sbGVyLmdldEN1cnJZKCk7CiAKQEAgLTI4NTIsMjQgKzI5MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IE1hdGgubWF4KC0oZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wIC0gMSksIGRlbHRhKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBidW1wZWQgaW50byB0aGUgc2Nyb2xsIGxpbWl0Ci0gICAgICAgICAgICAgICAgVmlldyBtb3Rpb25WaWV3ID0gZ2V0Q2hpbGRBdChtTW90aW9uUG9zaXRpb24gLSBtRmlyc3RQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IG9sZFRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKG1vdGlvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRUb3AgPSBtb3Rpb25WaWV3LmdldFRvcCgpOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRFbmQgPSB0cmFja01vdGlvblNjcm9sbChkZWx0YSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChhdEVuZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW90aW9uVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUd2VhayB0aGUgc2Nyb2xsIGZvciBob3cgZmFyIHdlIG92ZXJzaG90Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnNob290ID0gLShkZWx0YSAtIChtb3Rpb25WaWV3LmdldFRvcCgpIC0gb2xkVG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoMCwgb3ZlcnNob290LCAwLCBtU2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWRnZVJlYWNoZWQoZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobW9yZSAmJiAhYXRFbmQpIHsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwpAQCAtMjg4NywyNCArMjkzNCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFRPVUNIX01PREVfT1ZFUkZMSU5HOiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT3ZlclNjcm9sbGVyIHNjcm9sbGVyID0gbVNjcm9sbGVyOwotICAgICAgICAgICAgICAgIGlmIChzY3JvbGxlci5jb21wdXRlU2Nyb2xsT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNjcm9sbFkgPSBtU2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWSA9IHNjcm9sbGVyLmdldEN1cnJZKCkgLSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KDAsIGRlbHRhWSwgMCwgc2Nyb2xsWSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3ZlcmZsaW5nRGlzdGFuY2UsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0KHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRmxpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgfQpAQCAtMjkxOCw2ICsyOTQ3LDcgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfVVBfUE9TID0gMjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfRE9XTl9CT1VORCA9IDM7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT1ZFX1VQX0JPVU5EID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PVkVfT0ZGU0VUID0gNTsKICAgICAgICAgCiAgICAgICAgIHByaXZhdGUgaW50IG1Nb2RlOwogICAgICAgICBwcml2YXRlIGludCBtVGFyZ2V0UG9zOwpAQCAtMjkyNSw2ICsyOTU1LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUxhc3RTZWVuUG9zOwogICAgICAgICBwcml2YXRlIGludCBtU2Nyb2xsRHVyYXRpb247CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1FeHRyYVNjcm9sbDsKKworICAgICAgICBwcml2YXRlIGludCBtT2Zmc2V0RnJvbVRvcDsKICAgICAgICAgCiAgICAgICAgIFBvc2l0aW9uU2Nyb2xsZXIoKSB7CiAgICAgICAgICAgICBtRXh0cmFTY3JvbGwgPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQobUNvbnRleHQpLmdldFNjYWxlZEZhZGluZ0VkZ2VMZW5ndGgoKTsKQEAgLTMwMTYsMTIgKzMwNDgsNDYgQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgcG9zdCh0aGlzKTsKICAgICAgICAgfQotICAgICAgICAKKworICAgICAgICB2b2lkIHN0YXJ0V2l0aE9mZnNldChpbnQgcG9zaXRpb24sIGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIG1UYXJnZXRQb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIG1PZmZzZXRGcm9tVG9wID0gb2Zmc2V0OworICAgICAgICAgICAgbUJvdW5kUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIG1MYXN0U2VlblBvcyA9IElOVkFMSURfUE9TSVRJT047CisgICAgICAgICAgICBtTW9kZSA9IE1PVkVfT0ZGU0VUOworCisgICAgICAgICAgICBmaW5hbCBpbnQgZmlyc3RQb3MgPSBtRmlyc3RQb3NpdGlvbjsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxhc3RQb3MgPSBmaXJzdFBvcyArIGNoaWxkQ291bnQgLSAxOworCisgICAgICAgICAgICBpbnQgdmlld1RyYXZlbENvdW50ID0gMDsKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IGZpcnN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gZmlyc3RQb3MgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPiBsYXN0UG9zKSB7CisgICAgICAgICAgICAgICAgdmlld1RyYXZlbENvdW50ID0gcG9zaXRpb24gLSBsYXN0UG9zOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbi1zY3JlZW4sIGp1c3Qgc2Nyb2xsLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRUb3AgPSBnZXRDaGlsZEF0KHBvc2l0aW9uIC0gZmlyc3RQb3MpLmdldFRvcCgpOworICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG9mZnNldCwgU0NST0xMX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVzdGltYXRlIGhvdyBtYW55IHNjcmVlbnMgd2Ugc2hvdWxkIHRyYXZlbAorICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NyZWVuVHJhdmVsQ291bnQgPSAoZmxvYXQpIHZpZXdUcmF2ZWxDb3VudCAvIGNoaWxkQ291bnQ7CisgICAgICAgICAgICBtU2Nyb2xsRHVyYXRpb24gPSAoaW50KSAoU0NST0xMX0RVUkFUSU9OIC8gc2NyZWVuVHJhdmVsQ291bnQpOworICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gSU5WQUxJRF9QT1NJVElPTjsKKyAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHN0b3AoKSB7CiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1Ub3VjaE1vZGUgIT0gVE9VQ0hfTU9ERV9GTElORyAmJiBtTGFzdFNlZW5Qb3MgIT0gSU5WQUxJRF9QT1NJVElPTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvcyA9IG1GaXJzdFBvc2l0aW9uOwogICAgICAgICAgICAgCkBAIC0zMTQ2LDYgKzMyMTIsMjcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNT1ZFX09GRlNFVDogeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZENvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgICAgICAgICAgbUxhc3RTZWVuUG9zID0gZmlyc3RQb3M7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uID0gbVRhcmdldFBvczsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdFBvcyA9IGZpcnN0UG9zICsgY2hpbGRDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBmaXJzdFBvcykgeworICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxCeSgtZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IGxhc3RQb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsQnkoZ2V0SGVpZ2h0KCksIG1TY3JvbGxEdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHBvc3QodGhpcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT24tc2NyZWVuLCBqdXN0IHNjcm9sbC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhcmdldFRvcCA9IGdldENoaWxkQXQocG9zaXRpb24gLSBmaXJzdFBvcykuZ2V0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbEJ5KHRhcmdldFRvcCAtIG1PZmZzZXRGcm9tVG9wLCBtU2Nyb2xsRHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTMxNjUsNiArMzI1MiwyNCBAQAogICAgIH0KICAgICAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsIHNjcm9sbAorICAgICAqIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBpeGVscyBmcm9tCisgICAgICogdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3LiBJZiB0aGlzIGlzIGltcG9zc2libGUsIChlLmcuIHRoZSBvZmZzZXQgd291bGQgc2Nyb2xsCisgICAgICogdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGxpc3QpIGl0IHdpbGwgZ2V0IGFzIGNsb3NlCisgICAgICogYXMgcG9zc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gdG8gc2Nyb2xsIHRvCisgICAgICogQHBhcmFtIG9mZnNldCBEZXNpcmVkIGRpc3RhbmNlIGluIHBpeGVscyBvZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gZnJvbSB0aGUgdG9wCisgICAgICogICAgICAgICAgICAgICBvZiB0aGUgdmlldyB3aGVuIHNjcm9sbGluZyBpcyBmaW5pc2hlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNtb290aFNjcm9sbFRvUG9zaXRpb25Gcm9tVG9wKGludCBwb3NpdGlvbiwgaW50IG9mZnNldCkgeworICAgICAgICBpZiAobVBvc2l0aW9uU2Nyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVBvc2l0aW9uU2Nyb2xsZXIgPSBuZXcgUG9zaXRpb25TY3JvbGxlcigpOworICAgICAgICB9CisgICAgICAgIG1Qb3NpdGlvblNjcm9sbGVyLnN0YXJ0V2l0aE9mZnNldChwb3NpdGlvbiwgb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCiAgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZCwgYnV0IGl0IHdpbGwKICAgICAgKiBzdG9wIGVhcmx5IGlmIHNjcm9sbGluZyBmdXJ0aGVyIHdvdWxkIHNjcm9sbCBib3VuZFBvc2l0aW9uIG91dCBvZgpAQCAtMzE5NCw2ICszMjk5LDQyIEBACiAgICAgICAgIG1GbGluZ1J1bm5hYmxlLnN0YXJ0U2Nyb2xsKGRpc3RhbmNlLCBkdXJhdGlvbik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWxsb3dzIFJlbW90ZVZpZXdzIHRvIHNjcm9sbCByZWxhdGl2ZWx5IHRvIGEgcG9zaXRpb24uCisgICAgICovCisgICAgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaW50IGluZGV4ID0gLTE7CisgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IDApIHsKKyAgICAgICAgICAgIGluZGV4ID0gZ2V0TGFzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4IC0gZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5nZXRHbG9iYWxWaXNpYmxlUmVjdCh2aXNpYmxlUmVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGlzIHBhcnRpYWxseSB2aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGludCBjaGlsZFJlY3RBcmVhID0gY2hpbGQuZ2V0V2lkdGgoKSAqIGNoaWxkLmdldEhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlzaWJsZVJlY3RBcmVhID0gdmlzaWJsZVJlY3Qud2lkdGgoKSAqIHZpc2libGVSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB2aXNpYmxlQXJlYSA9ICh2aXNpYmxlUmVjdEFyZWEgLyAoZmxvYXQpIGNoaWxkUmVjdEFyZWEpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB2aXNpYmxlVGhyZXNob2xkID0gMC43NWY7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9zaXRpb24gPCAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRvcCBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCB0b3AgaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocG9zaXRpb24gPiAwKSAmJiAodmlzaWJsZUFyZWEgPCB2aXNpYmxlVGhyZXNob2xkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJvdHRvbSBpbmRleCBpcyBub3QgcGVyY2VpdmFibHkgdmlzaWJsZSBzbyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIHNob3dpbmcgdGhhdCBib3R0b20gaW5kZXggYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKE1hdGgubWF4KDAsIE1hdGgubWluKGdldENvdW50KCksIGluZGV4ICsgcG9zaXRpb24pKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2Nyb2xsaW5nQ2FjaGUoKSB7CiAgICAgICAgIGlmIChtU2Nyb2xsaW5nQ2FjaGVFbmFibGVkICYmICFtQ2FjaGluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIHNldENoaWxkcmVuRHJhd25XaXRoQ2FjaGVFbmFibGVkKHRydWUpOwpAQCAtMzI2MSwyOSArMzQwMiwxNiBAQAogCiAgICAgICAgIGZpbmFsIGludCBmaXJzdFBvc2l0aW9uID0gbUZpcnN0UG9zaXRpb247CiAKLSAgICAgICAgLy8gVXBkYXRlIG91ciBndWVzc2VzIGZvciB3aGVyZSB0aGUgZmlyc3QgYW5kIGxhc3Qgdmlld3MgYXJlCi0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uID09IDApIHsKLSAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyA9IGZpcnN0VG9wIC0gbUxpc3RQYWRkaW5nLnRvcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaXJzdFBvc2l0aW9uRGlzdGFuY2VHdWVzcyArPSBpbmNyZW1lbnRhbERlbHRhWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCkgewotICAgICAgICAgICAgbUxhc3RQb3NpdGlvbkRpc3RhbmNlR3Vlc3MgPSBsYXN0Qm90dG9tICsgbUxpc3RQYWRkaW5nLmJvdHRvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1MYXN0UG9zaXRpb25EaXN0YW5jZUd1ZXNzICs9IGluY3JlbWVudGFsRGVsdGFZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gMCAmJiBmaXJzdFRvcCA+PSBsaXN0UGFkZGluZy50b3AgJiYgaW5jcmVtZW50YWxEZWx0YVkgPj0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiA9PSAwICYmIGZpcnN0VG9wID49IGxpc3RQYWRkaW5nLnRvcCAmJiBkZWx0YVkgPj0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIGRvd24gaWYgdGhlIHRvcCBvZiB0aGUgZmlyc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmaXJzdFBvc2l0aW9uICsgY2hpbGRDb3VudCA9PSBtSXRlbUNvdW50ICYmIGxhc3RCb3R0b20gPD0gZW5kICYmCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50YWxEZWx0YVkgPD0gMCkgeworICAgICAgICBpZiAoZmlyc3RQb3NpdGlvbiArIGNoaWxkQ291bnQgPT0gbUl0ZW1Db3VudCAmJiBsYXN0Qm90dG9tIDw9IGVuZCAmJiBkZWx0YVkgPD0gMCkgewogICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBtb3ZlIHZpZXdzIHVwIGlmIHRoZSBib3R0b20gb2YgdGhlIGxhc3QgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgdmlzaWJsZQotICAgICAgICAgICAgcmV0dXJuIGluY3JlbWVudGFsRGVsdGFZICE9IDA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZG93biA9IGluY3JlbWVudGFsRGVsdGFZIDwgMDsKQEAgLTM1NjUsNiArMzY5Myw3IEBACiAKICAgICAgICAgbVJlc3VycmVjdFRvUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICByZW1vdmVDYWxsYmFja3MobUZsaW5nUnVubmFibGUpOworICAgICAgICByZW1vdmVDYWxsYmFja3MobVBvc2l0aW9uU2Nyb2xsZXIpOwogICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfTU9ERV9SRVNUOwogICAgICAgICBjbGVhclNjcm9sbGluZ0NhY2hlKCk7CiAgICAgICAgIG1TcGVjaWZpY1RvcCA9IHNlbGVjdGVkVG9wOwpAQCAtNDEwNyw3ICs0MjM2LDExIEBACiAKICAgICAvKioKICAgICAgKiBXaGVuIHNldCB0byBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgY2FjaGUgY29sb3IgaGludCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGxpc3QgaXMgYWx3YXlzIGRyYXduCi0gICAgICogb24gdG9wIG9mIGEgc29saWQsIHNpbmdsZS1jb2xvciwgb3BhcXVlIGJhY2tncm91bmQKKyAgICAgKiBvbiB0b3Agb2YgYSBzb2xpZCwgc2luZ2xlLWNvbG9yLCBvcGFxdWUgYmFja2dyb3VuZC4KKyAgICAgKgorICAgICAqIFplcm8gbWVhbnMgdGhhdCB3aGF0J3MgYmVoaW5kIHRoaXMgb2JqZWN0IGlzIHRyYW5zbHVjZW50IChub24gc29saWQpIG9yIGlzIG5vdCBtYWRlIG9mIGEKKyAgICAgKiBzaW5nbGUgY29sb3IuIFRoaXMgaGludCB3aWxsIG5vdCBhZmZlY3QgYW55IGV4aXN0aW5nIGJhY2tncm91bmQgZHJhd2FibGUgc2V0IG9uIHRoaXMgdmlldyAoCisgICAgICogdHlwaWNhbGx5IHNldCB2aWEge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfSkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29sb3IgVGhlIGJhY2tncm91bmQgY29sb3IKICAgICAgKi8KQEAgLTQyMTcsMTAgKzQzNTAsMzEgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZmluaXNoR2xvd3MoKSB7Ci0gICAgICAgIGlmIChtRWRnZUdsb3dUb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wLmZpbmlzaCgpOwotICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLmZpbmlzaCgpOworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBYnNMaXN0VmlldyB0byB1c2UgYSByZW1vdGUgdmlld3MgYWRhcHRlciB3aGljaCBjb25uZWN0cyB0byBhIFJlbW90ZVZpZXdzU2VydmljZQorICAgICAqIHRocm91Z2ggdGhlIHNwZWNpZmllZCBpbnRlbnQuCisgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHVzZWQgdG8gaWRlbnRpZnkgdGhlIFJlbW90ZVZpZXdzU2VydmljZSBmb3IgdGhlIGFkYXB0ZXIgdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVWaWV3c0FkYXB0ZXIoSW50ZW50IGludGVudCkgeworICAgICAgICBtUmVtb3RlQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBiYWNrIHdoZW4gdGhlIGFkYXB0ZXIgY29ubmVjdHMgdG8gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciAhPSBtQWRhcHRlcikgeworICAgICAgICAgICAgc2V0QWRhcHRlcihtUmVtb3RlQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlQWRhcHRlciA9PSBtQWRhcHRlcikgeworICAgICAgICAgICAgbVJlbW90ZUFkYXB0ZXIgPSBudWxsOworICAgICAgICAgICAgc2V0QWRhcHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDI0MCw2ICs0Mzk0LDc1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQSBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciByZWNlaXZlcyBldmVudHMgZm9yIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9NVUxUSVBMRV9NT0RBTH0uCisgICAgICogSXQgYWN0cyBhcyB0aGUge0BsaW5rIEFjdGlvbk1vZGUuQ2FsbGJhY2t9IGZvciB0aGUgc2VsZWN0aW9uIG1vZGUgYW5kIGFsc28gcmVjZWl2ZXMKKyAgICAgKiB7QGxpbmsgI29uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSwgaW50LCBsb25nLCBib29sZWFuKX0gZXZlbnRzIHdoZW4gdGhlIHVzZXIKKyAgICAgKiBzZWxlY3RzIGFuZCBkZXNlbGVjdHMgbGlzdCBpdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIGV4dGVuZHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhbiBpdGVtIGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkIGR1cmluZyBzZWxlY3Rpb24gbW9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGUgVGhlIHtAbGluayBBY3Rpb25Nb2RlfSBwcm92aWRpbmcgdGhlIHNlbGVjdGlvbiBtb2RlCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBpZCBBZGFwdGVyIElEIG9mIHRoZSBpdGVtIHRoYXQgd2FzIGNoZWNrZWQgb3IgdW5jaGVja2VkCisgICAgICAgICAqIEBwYXJhbSBjaGVja2VkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpdGVtIGlzIG5vdyBjaGVja2VkLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGl0ZW0gaXMgbm93IHVuY2hlY2tlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKTsKKyAgICB9CisKKyAgICBjbGFzcyBNdWx0aUNob2ljZU1vZGVXcmFwcGVyIGltcGxlbWVudHMgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIG1XcmFwcGVkOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWQoTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIgd3JhcHBlZCkgeworICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICBpZiAobVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpKSB7CisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGVja2VkIGdyYXBoaWMgc3RhdGU/CisgICAgICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25QcmVwYXJlQWN0aW9uTW9kZShtb2RlLCBtZW51KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25BY3Rpb25JdGVtQ2xpY2tlZChtb2RlLCBpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkRlc3Ryb3lBY3Rpb25Nb2RlKG1vZGUpOworICAgICAgICAgICAgbUNob2ljZUFjdGlvbk1vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBFbmRpbmcgc2VsZWN0aW9uIG1vZGUgbWVhbnMgZGVzZWxlY3RpbmcgZXZlcnl0aGluZy4KKyAgICAgICAgICAgIGNsZWFyQ2hvaWNlcygpOworCisgICAgICAgICAgICBtRGF0YUNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgcmVtZW1iZXJTeW5jU3RhdGUoKTsKKyAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKworICAgICAgICAgICAgc2V0TG9uZ0NsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBtV3JhcHBlZC5vbkl0ZW1DaGVja2VkU3RhdGVDaGFuZ2VkKG1vZGUsIHBvc2l0aW9uLCBpZCwgY2hlY2tlZCk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcyBzZWxlY3RlZCB3ZSBubyBsb25nZXIgbmVlZCB0aGUgc2VsZWN0aW9uIG1vZGUuCisgICAgICAgICAgICBpZiAoZ2V0Q2hlY2tlZEl0ZW1Db3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtb2RlLmZpbmlzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWJzTGlzdFZpZXcgZXh0ZW5kcyBMYXlvdXRQYXJhbXMgdG8gcHJvdmlkZSBhIHBsYWNlIHRvIGhvbGQgdGhlIHZpZXcgdHlwZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgewpAQCAtNDYwNyw3ICs0ODMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IHNjcmFwID0gbVNjcmFwVmlld3NbaV07CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JhcENvdW50ID0gc2NyYXAuc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjcmFwQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXAuZ2V0KGkpLnNldERyYXdpbmdDYWNoZUJhY2tncm91bmRDb2xvcihjb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JhcC5nZXQoaikuc2V0RHJhd2luZ0NhY2hlQmFja2dyb3VuZENvbG9yKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKaW5kZXggOGZjYzJlOC4uYWI3NTQyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEKQEAgLTIyOCw3ICsyMjgsNiBAQAogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGl0ZW0gaW4gdGhpcwogICAgICAqIEFkYXB0ZXJWaWV3IGhhcyBiZWVuIGNsaWNrZWQuCkBAIC02MjksNiArNjI4LDcgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2aWV3IHRvIHNob3cgaWYgdGhlIGFkYXB0ZXIgaXMgZW1wdHkKICAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKICAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoVmlldyBlbXB0eVZpZXcpIHsKICAgICAgICAgbUVtcHR5VmlldyA9IGVtcHR5VmlldzsKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxMGEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0FuaW1hdG9yLmphdmEKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgYSB7QGxpbmsgQWRhcHRlclZpZXd9IHRoYXQgd2lsbCBwZXJmb3JtIGFuaW1hdGlvbnMKKyAqIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gaXRzIHZpZXdzLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3JfaW5BbmltYXRpb24KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3QW5pbWF0b3Jfb3V0QW5pbWF0aW9uCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNBZGFwdGVyVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFkYXB0ZXJWaWV3QW5pbWF0b3IgZXh0ZW5kcyBBZGFwdGVyVmlldzxBZGFwdGVyPgorICAgICAgICBpbXBsZW1lbnRzIFJlbW90ZVZpZXdzQWRhcHRlci5SZW1vdGVBZGFwdGVyQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVZpZXdBbmltYXRvciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hpbGQsIHdoaWNoIGFwcGVhcnMgYW55d2hlcmUgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICogdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4sIGFzIHNwZWNpZmllZCBieSB7QGxpbmsgI21BY3RpdmVPZmZzZXR9CisgICAgICovCisgICAgaW50IG1XaGljaENoaWxkID0gMDsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBmaXJzdCB2aWV3KHMpIHNob3VsZCBiZSBhbmltYXRlZCBpbgorICAgICAqLworICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogIFJlcHJlc2VudHMgd2hlcmUgdGhlIGluIHRoZSBjdXJyZW50IHdpbmRvdyBvZgorICAgICAqICB2aWV3cyB0aGUgY3VycmVudCA8Y29kZT5tRGlzcGxheWVkQ2hpbGQ8L2NvZGU+IHNpdHMKKyAgICAgKi8KKyAgICBpbnQgbUFjdGl2ZU9mZnNldCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpZXdzIHRoYXQgdGhlIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfSBrZWVwcyBhcyBjaGlsZHJlbiBhdCBhbnkKKyAgICAgKiBnaXZlbiB0aW1lIChub3QgY291bnRpbmcgdmlld3MgdGhhdCBhcmUgcGVuZGluZyByZW1vdmFsLCBzZWUge0BsaW5rICNtUHJldmlvdXNWaWV3c30pLgorICAgICAqLworICAgIGludCBtTnVtQWN0aXZlVmlld3MgPSAxOworCisgICAgLyoqCisgICAgICogQXJyYXkgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0uIFRoaXMgYXJyYXkKKyAgICAgKiBpcyBhY2Nlc3NlZCBpbiBhIGNpcmN1bGFyIGZhc2hpb24KKyAgICAgKi8KKyAgICBWaWV3W10gbUFjdGl2ZVZpZXdzOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiB2aWV3cyBwZW5kaW5nIHJlbW92YWwgZnJvbSB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgQXJyYXlMaXN0PFZpZXc+IG1QcmV2aW91c1ZpZXdzOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4LCByZWxhdGl2ZSB0byB0aGUgYWRhcHRlciwgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgd2luZG93IG9mIHZpZXdzCisgICAgICovCisgICAgaW50IG1DdXJyZW50V2luZG93U3RhcnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4LCByZWxhdGl2ZSB0byB0aGUgYWRhcHRlciwgb2YgdGhlIGVuZCBvZiB0aGUgd2luZG93IG9mIHZpZXdzCisgICAgICovCisgICAgaW50IG1DdXJyZW50V2luZG93RW5kID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2FtZSBhcyB7QGxpbmsgI21DdXJyZW50V2luZG93U3RhcnR9LCBleGNlcHQgd2hlbiB0aGUgd2UgaGF2ZSBib3VuZGVkCisgICAgICoge0BsaW5rICNtQ3VycmVudFdpbmRvd1N0YXJ0fSB0byBiZSBub24tbmVnYXRpdmUKKyAgICAgKi8KKyAgICBpbnQgbUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIHRvIHBvc3QgZXZlbnRzIHRvIHRoZSBtYWluIHRocmVhZAorICAgICAqLworICAgIEhhbmRsZXIgbU1haW5RdWV1ZTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIGRhdGEgY2hhbmdlcyBmcm9tIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgQWRhcHRlckRhdGFTZXRPYnNlcnZlciBtRGF0YVNldE9ic2VydmVyOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBBZGFwdGVyfSBmb3IgdGhpcyB7QGxpbmsgQWRhcHRlclZpZXdBbmltYXRvcn0KKyAgICAgKi8KKyAgICBBZGFwdGVyIG1BZGFwdGVyOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBSZW1vdGVWaWV3c0FkYXB0ZXJ9IGZvciB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIFJlbW90ZVZpZXdzQWRhcHRlciBtUmVtb3RlVmlld3NBZGFwdGVyOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgYW5pbWF0b3IgaXMgc2hvd2luZyB2aWV3cworICAgICAqLworICAgIGJvb2xlYW4gbUZpcnN0VGltZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGFuaW1hdG9yIHNob3VsZCB3cmFwIGZyb20gMCB0byB0aGUgZW5kIGFuZCB2aWNlIHZlcnNhCisgICAgICogb3IgaGF2ZSBoYXJkIGJvdW5kYXJpZXMgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kCisgICAgICovCisgICAgYm9vbGVhbiBtU2hvdWxkTG9vcCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBzb21lIGNoaWxkLCB1c2VkIGFzIGEgc2l6ZSByZWZlcmVuY2UgaW4tY2FzZSBvdXIKKyAgICAgKiBkaW1lbnNpb25zIGFyZSB1bnNwZWNpZmllZCBieSB0aGUgcGFyZW50LgorICAgICAqLworICAgIGludCBtUmVmZXJlbmNlQ2hpbGRXaWR0aCA9IC0xOworICAgIGludCBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFuaW1hdGlvbiBzdHVmZiBpcyBzdGlsbCBpbiBmbHV4LCB3YWl0aW5nIG9uIHRoZSBuZXcgZnJhbWV3b3JrIHRvIHNldHRsZSBhIGJpdC4KKyAgICAgKi8KKyAgICBBbmltYXRpb24gbUluQW5pbWF0aW9uOworICAgIEFuaW1hdGlvbiBtT3V0QW5pbWF0aW9uOworICAgIHByaXZhdGUgIEFycmF5TGlzdDxWaWV3PiBtVmlld3NUb0JyaW5nVG9Gcm9udDsKKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdFZpZXdBbmltYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0FuaW1hdG9yKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yKTsKKyAgICAgICAgaW50IHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbiwgMCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKKyAgICAgICAgICAgIHNldEluQW5pbWF0aW9uKGNvbnRleHQsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc291cmNlID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9vdXRBbmltYXRpb24sIDApOworICAgICAgICBpZiAocmVzb3VyY2UgPiAwKSB7CisgICAgICAgICAgICBzZXRPdXRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBmbGFnID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdBbmltYXRvcl9hbmltYXRlRmlyc3RWaWV3LCB0cnVlKTsKKyAgICAgICAgc2V0QW5pbWF0ZUZpcnN0VmlldyhmbGFnKTsKKworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBpbml0Vmlld0FuaW1hdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Vmlld0FuaW1hdG9yKCkgeworICAgICAgICBtTWFpblF1ZXVlID0gbmV3IEhhbmRsZXIoTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICBtQWN0aXZlVmlld3MgPSBuZXcgVmlld1ttTnVtQWN0aXZlVmlld3NdOworICAgICAgICBtUHJldmlvdXNWaWV3cyA9IG5ldyBBcnJheUxpc3Q8Vmlldz4oKTsKKyAgICAgICAgbVZpZXdzVG9CcmluZ1RvRnJvbnQgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGNvbmZpZ3VyZSB0aGUgYW5pbWF0b3IgdG8gZGlzcGxheSB0aGUKKyAgICAgKiBkZXNpcmVkIG51bWJlciBvZiB2aWV3cywgYW5kIHNwZWNpZnkgdGhlIG9mZnNldAorICAgICAqCisgICAgICogQHBhcmFtIG51bVZpc2libGVWaWV3cyBUaGUgbnVtYmVyIG9mIHZpZXdzIHRoZSBhbmltYXRvciBrZWVwcyBpbiB0aGUge0BsaW5rIFZpZXdHcm91cH0KKyAgICAgKiBAcGFyYW0gYWN0aXZlT2Zmc2V0IFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGVyZSB0aGUgY3VycmVudCBpbmRleCAoe0BsaW5rICNtV2hpY2hDaGlsZH0pCisgICAgICogICAgICAgIHNpdHMgd2l0aGluIHRoZSB3aW5kb3cuIEZvciBleGFtcGxlIGlmIGFjdGl2ZU9mZnNldCBpcyAxLCBhbmQgbnVtVmlzaWJsZVZpZXdzIGlzIDMsCisgICAgICogICAgICAgIGFuZCB7QGxpbmsgI3NldERpc3BsYXllZENoaWxkKGludCl9IGlzIGNhbGxlZCB3aXRoIDEwLCB0aGVuIHRoZSBlZmZlY3RpdmUgd2luZG93IHdpbGwKKyAgICAgKiAgICAgICAgYmUgdGhlIGluZGV4ZXMgOSwgMTAsIGFuZCAxMS4gSW4gdGhlIHNhbWUgZXhhbXBsZSwgaWYgYWN0aXZlT2Zmc2V0IHdlcmUgMCwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgd2luZG93IHdvdWxkIGluc3RlYWQgY29udGFpbiBpbmRleGVzIDEwLCAxMSBhbmQgMTIuCisgICAgICogQHBhcmFtIHNob3VsZExvb3AgSWYgdGhlIGFuaW1hdG9yIGlzIHNob3cgdmlldyAwLCBhbmQgc2V0UHJldmlvdXMoKSBpcyBjYWxsZWQsIGRvIHdlCisgICAgICogICAgICAgIHdlIGxvb3AgYmFjayB0byB0aGUgZW5kLCBvciBkbyB3ZSBkbyBub3RoaW5nCisgICAgICovCisgICAgIHZvaWQgY29uZmlndXJlVmlld0FuaW1hdG9yKGludCBudW1WaXNpYmxlVmlld3MsIGludCBhY3RpdmVPZmZzZXQsIGJvb2xlYW4gc2hvdWxkTG9vcCkgeworICAgICAgICBpZiAoYWN0aXZlT2Zmc2V0ID4gbnVtVmlzaWJsZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gVGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUuCisgICAgICAgIH0KKyAgICAgICAgbU51bUFjdGl2ZVZpZXdzID0gbnVtVmlzaWJsZVZpZXdzOworICAgICAgICBtQWN0aXZlT2Zmc2V0ID0gYWN0aXZlT2Zmc2V0OworICAgICAgICBtQWN0aXZlVmlld3MgPSBuZXcgVmlld1ttTnVtQWN0aXZlVmlld3NdOworICAgICAgICBtUHJldmlvdXNWaWV3cy5jbGVhcigpOworICAgICAgICByZW1vdmVBbGxWaWV3c0luTGF5b3V0KCk7CisgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnQgPSAwOworICAgICAgICBtQ3VycmVudFdpbmRvd0VuZCA9IC0xOworICAgICAgICBtU2hvdWxkTG9vcCA9IHNob3VsZExvb3A7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIGN1c3RvbWl6ZSB2aWV3IHRyYW5zaXRpb25zIHdpdGhpbgorICAgICAqIHRoZSBzZXQgb2YgdmlzaWJsZSB2aWV3cworICAgICAqCisgICAgICogQHBhcmFtIGZyb21JbmRleCBUaGUgcmVsYXRpdmUgaW5kZXggd2l0aGluIHRoZSB3aW5kb3cgdGhhdCB0aGUgdmlldyB3YXMgaW4sIC0xIGlmIGl0IHdhc24ndAorICAgICAqICAgICAgICBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIHRvSW5kZXggVGhlIHJlbGF0aXZlIGluZGV4IHdpdGhpbiB0aGUgd2luZG93IHRoYXQgdGhlIHZpZXcgaXMgZ29pbmcgdG8sIC0xIGlmIGl0IGlzCisgICAgICogICAgICAgIGJlaW5nIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IGlzIGJlaW5nIGFuaW1hdGVkCisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBPYmplY3RBbmltYXRvciBwYTsKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKDQwMCwgdmlldywgImFscGhhIiwgMC4wZiwgMS4wZik7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKDQwMCwgdmlldywgImFscGhhIiwgMS4wZiwgMC4wZik7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGljaCBjaGlsZCB2aWV3IHdpbGwgYmUgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHdoaWNoQ2hpbGQgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCB2aWV3IHRvIGRpc3BsYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5ZWRDaGlsZChpbnQgd2hpY2hDaGlsZCkgeworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSB3aGljaENoaWxkOworICAgICAgICAgICAgaWYgKHdoaWNoQ2hpbGQgPj0gbUFkYXB0ZXIuZ2V0Q291bnQoKSkgeworICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gbVNob3VsZExvb3AgPyAwIDogbUFkYXB0ZXIuZ2V0Q291bnQoKSAtIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoQ2hpbGQgPCAwKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtU2hvdWxkTG9vcCA/IG1BZGFwdGVyLmdldENvdW50KCkgLSAxIDogMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2N1cyA9IGdldEZvY3VzZWRDaGlsZCgpICE9IG51bGw7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgY2xlYXIgb2xkIGZvY3VzIGlmIHdlIGhhZCBpdAorICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJldGFrZSBmb2N1cyBpZiB3ZSBoYWQgaXQKKyAgICAgICAgICAgICAgICByZXF1ZXN0Rm9jdXMoRk9DVVNfRk9SV0FSRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVmYXVsdCBpbkFuaW1hdGlvbi4gVG8gYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlZmF1bHQgb3V0QW5pbWF0aW9uLiBUbyBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQW5pbWF0aW9uIGdldERlZmF1bHRPdXRBbmltYXRpb24oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gVGhpcyBtZXRob2QgYXBwbGllcyBhIHZpZXcgLyBpbmRleCBzcGVjaWZpYworICAgICAqIHRyYW5zZm9ybSB0byB0aGUgY2hpbGQgdmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZAorICAgICAqIEBwYXJhbSByZWxhdGl2ZUluZGV4CisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkIHZpZXcuCisgICAgICovCisgICAgcHVibGljIGludCBnZXREaXNwbGF5ZWRDaGlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG1XaGljaENoaWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBuZXh0IGNoaWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbnVhbGx5IHNob3dzIHRoZSBwcmV2aW91cyBjaGlsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93UHJldmlvdXMoKSB7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1vZHVsbyhpbnQgcG9zLCBpbnQgc2l6ZSkgeworICAgICAgICByZXR1cm4gKHNpemUgKyAocG9zICUgc2l6ZSkpICUgc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZpZXcgYXQgdGhpcyBpbmRleCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3aW5kb3cncyBzdGFydAorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlSW5kZXggUG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd2luZG93J3Mgc3RhcnQKKyAgICAgKiBAcmV0dXJuIFZpZXcgYXQgdGhpcyBpbmRleCwgbnVsbCBpZiB0aGUgaW5kZXggaXMgb3V0c2lkZSB0aGUgYm91bmRzCisgICAgICovCisgICAgVmlldyBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGludCByZWxhdGl2ZUluZGV4KSB7CisgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ID49IDAgJiYgcmVsYXRpdmVJbmRleCA8PSBtTnVtQWN0aXZlVmlld3MgLSAxKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgcmVsYXRpdmVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlVmlld3NbbW9kdWxvKGluZGV4LCBtTnVtQWN0aXZlVmlld3MpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBMYXlvdXRQYXJhbXMgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhWaWV3IHYpIHsKKyAgICAgICAgZmluYWwgVmlld0dyb3VwLkxheW91dFBhcmFtcyBjdXJyZW50THAgPSB2LmdldExheW91dFBhcmFtcygpOworICAgICAgICBpZiAoY3VycmVudExwIGluc3RhbmNlb2YgVmlld0dyb3VwLkxheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY3VycmVudExwOworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygwLCAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkgeworICAgICAgICBmb3IgKGludCBpID0gbUN1cnJlbnRXaW5kb3dTdGFydDsgaSA8PSBtQ3VycmVudFdpbmRvd0VuZDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtb2R1bG8oaSwgbU51bUFjdGl2ZVZpZXdzKTsKKworICAgICAgICAgICAgLy8gZ2V0IHRoZSBmcmVzaCBjaGlsZCBmcm9tIHRoZSBhZGFwdGVyCisgICAgICAgICAgICBWaWV3IHVwZGF0ZWRDaGlsZCA9IG1BZGFwdGVyLmdldFZpZXcoaSwgbnVsbCwgdGhpcyk7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlVmlld3NbaW5kZXhdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGcmFtZUxheW91dCBmbCA9IChGcmFtZUxheW91dCkgbUFjdGl2ZVZpZXdzW2luZGV4XTsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBvdXQgdGhlIG9sZCBjaGlsZAorICAgICAgICAgICAgICAgIGZsLnJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG5ldyBjaGlsZCB0byB0aGUgZnJhbWUsIGlmIGl0IGV4aXN0cworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmbC5hZGRWaWV3KHVwZGF0ZWRDaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCBzdWJjbGFzc2VzIGNhbiBwcm92aWRlIGEgY3VzdG9tIGZyYW1lIGluIHdoaWNoIHRoZWlyCisgICAgICogY2hpbGRyZW4gY2FuIGxpdmUuIEZvciBleGFtcGxlLCBTdGFja1ZpZXcgYWRkcyBwYWRkaW5nIHRvIGl0cyBjaGlsZHJlbnMnIGZyYW1lcyBzbyBhcyB0bworICAgICAqIGFjY29tb2RhdGUgZm9yIHRoZSBoaWdobGlnaHQgZWZmZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgRnJhbWVMYXlvdXQgaW50byB3aGljaCBjaGlsZHJlbiBjYW4gYmUgcGxhY2VkLgorICAgICAqLworICAgIEZyYW1lTGF5b3V0IGdldEZyYW1lRm9yQ2hpbGQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRnJhbWVMYXlvdXQobUNvbnRleHQpOworICAgIH0KKworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgsIGJvb2xlYW4gYW5pbWF0ZSwgYm9vbGVhbiBvbkxheW91dCkgeworICAgICAgICBpZiAobUFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVByZXZpb3VzVmlld3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgdmlld1RvUmVtb3ZlID0gbVByZXZpb3VzVmlld3MuZ2V0KGkpOworICAgICAgICAgICAgdmlld1RvUmVtb3ZlLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBpZiAodmlld1RvUmVtb3ZlIGluc3RhbmNlb2YgVmlld0dyb3VwKSB7CisgICAgICAgICAgICAgICAgVmlld0dyb3VwIHZnID0gKFZpZXdHcm91cCkgdmlld1RvUmVtb3ZlOworICAgICAgICAgICAgICAgIHZnLnJlbW92ZUFsbFZpZXdzSW5MYXlvdXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4IGhlcmUganVzdCBhbGxvd3MgZm9yIGFueSBjbGVhbnVwCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWV3IHRoYXQgbWF5IG5lZWQgdG8gYmUgZG9uZSBieSBhIHN1YmNsYXNzCisgICAgICAgICAgICBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleCh2aWV3VG9SZW1vdmUsIC0xKTsKKworICAgICAgICAgICAgcmVtb3ZlVmlld0luTGF5b3V0KHZpZXdUb1JlbW92ZSk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzVmlld3MuY2xlYXIoKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkID0gY2hpbGRJbmRleCAtIG1BY3RpdmVPZmZzZXQ7CisgICAgICAgIGludCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZCArIG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgIGludCBuZXdXaW5kb3dTdGFydCA9IE1hdGgubWF4KDAsIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkKTsKKyAgICAgICAgaW50IG5ld1dpbmRvd0VuZCA9IE1hdGgubWluKG1BZGFwdGVyLmdldENvdW50KCksIG5ld1dpbmRvd0VuZFVuYm91bmRlZCk7CisKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGNsZWFycyBvdXQgYW55IGl0ZW1zIHRoYXQgYXJlIGluIG91ciBtQWN0aXZlVmlld3MgbGlzdAorICAgICAgICAvLyBidXQgYXJlIG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBib3VuZHMgb2Ygb3VyIHdpbmRvdyAodGhpcyBpcyBiZWNvbWVzIGFuIGlzc3VlCisgICAgICAgIC8vIGF0IHRoZSBleHRyZW1pdGllcyBvZiB0aGUgbGlzdCwgZWcuIHdoZXJlIG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkIDwgMCBvcgorICAgICAgICAvLyBuZXdXaW5kb3dFbmRVbmJvdW5kZWQgPiBtQWRhcHRlci5nZXRDb3VudCgpIC0gMQorICAgICAgICBmb3IgKGludCBpID0gbmV3V2luZG93U3RhcnRVbmJvdW5kZWQ7IGkgPCBuZXdXaW5kb3dFbmRVbmJvdW5kZWQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPCBuZXdXaW5kb3dTdGFydCB8fCBpID4gbmV3V2luZG93RW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxvKGksIG1OdW1BY3RpdmVWaWV3cyk7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVWaWV3c1tpbmRleF0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZpZXdzLmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBpbnQgcHJldmlvdXNWaWV3UmVsYXRpdmVJbmRleCA9IG1vZHVsbyhpbmRleCAtIG1DdXJyZW50V2luZG93U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKHByZXZpb3VzVmlld1JlbGF0aXZlSW5kZXgsIC0xLCBwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVmlld3NbaW5kZXhdID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgd2luZG93IGhhcyBjaGFuZ2VkCisgICAgICAgIGlmICghIChuZXdXaW5kb3dTdGFydCA9PSBtQ3VycmVudFdpbmRvd1N0YXJ0ICYmIG5ld1dpbmRvd0VuZCA9PSBtQ3VycmVudFdpbmRvd0VuZCkpIHsKKyAgICAgICAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBpbmRpY2VzIGluIHRoZSBuZXcgcmFuZ2UKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBuZXdXaW5kb3dTdGFydDsgaSA8PSBuZXdXaW5kb3dFbmQ7IGkrKykgeworCisgICAgICAgICAgICAgICAgaW50IG9sZFJlbGF0aXZlSW5kZXggPSBpIC0gbUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgICAgICAgICBpbnQgbmV3UmVsYXRpdmVJbmRleCA9IGkgLSBuZXdXaW5kb3dTdGFydFVuYm91bmRlZDsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtb2R1bG8oaSwgbU51bUFjdGl2ZVZpZXdzKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXRlbSBpcyBpbiB0aGUgY3VycmVudCB3aW5kb3csIGdyZWF0LCB3ZSBqdXN0IG5lZWQgdG8gYXBwbHkKKyAgICAgICAgICAgICAgICAvLyB0aGUgdHJhbnNmb3JtIGZvciBpdCdzIG5ldyByZWxhdGl2ZSBwb3NpdGlvbiBpbiB0aGUgd2luZG93LCBhbmQgYW5pbWF0ZQorICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gaXQncyBjdXJyZW50IGFuZCBuZXcgcmVsYXRpdmUgcG9zaXRpb25zCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gbUN1cnJlbnRXaW5kb3dTdGFydCAmJiBpIDw9IG1DdXJyZW50V2luZG93RW5kKSB7CisgICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KHZpZXcsIG5ld1JlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24ob2xkUmVsYXRpdmVJbmRleCwgbmV3UmVsYXRpdmVJbmRleCwgdmlldyk7CisKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhpcyB2aWV3IGlzIG5ldywgc28gZmlyc3Qgd2UgaGF2ZSB0byBkaXNwbGFjZSB0aGUgdmlldyB0aGF0J3MKKyAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIG5ldyB2aWV3J3MgcGxhY2Ugd2l0aGluIG91ciBjYWNoZSAoYSBjaXJjdWxhciBhcnJheSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVZpZXdzW2luZGV4XSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IHByZXZpb3VzVmlldyA9IG1BY3RpdmVWaWV3c1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNWaWV3cy5hZGQocHJldmlvdXNWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4ID0gbW9kdWxvKGluZGV4IC0gbUN1cnJlbnRXaW5kb3dTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVWaWV3Rm9yVHJhbnNpdGlvbihwcmV2aW91c1ZpZXdSZWxhdGl2ZUluZGV4LCAtMSwgcHJldmlvdXNWaWV3KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50V2luZG93U3RhcnQgPiBuZXdXaW5kb3dTdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3c1RvQnJpbmdUb0Zyb250LmFkZChwcmV2aW91c1ZpZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgY2xlYXJlZCBhIHNwb3QgZm9yIHRoZSBuZXcgdmlldy4gR2V0IGl0IGZyb20gdGhlIGFkYXB0ZXIsIGFkZCBpdAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXBwbHkgYW55IHRyYW5zZm9ybSAvIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgICAgICBWaWV3IG5ld1ZpZXcgPSBtQWRhcHRlci5nZXRWaWV3KGksIG51bGwsIHRoaXMpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdyYXAgdGhlIG5ldyB2aWV3IGluIGEgRnJhbWVMYXlvdXQgc28gYXMgdG8gcmVzcGVjdCB0aGUgY29udHJhY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgYWRhcHRlciwgdGhhdCBpcywgdGhhdCB3ZSBkb24ndCBtb2RpZnkgdGhpcyB2aWV3IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsID0gZ2V0RnJhbWVGb3JDaGlsZCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2aWV3IGZyb20gdGhlIGFkYXB0ZXIgaXMgbnVsbCwgd2Ugc3RpbGwga2VlcCBhbiBlbXB0eSBmcmFtZSBpbiBwbGFjZQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGZsLmFkZFZpZXcobmV3Vmlldyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVZpZXdzW2luZGV4XSA9IGZsOworICAgICAgICAgICAgICAgICAgICBhZGRDaGlsZChmbCk7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5VHJhbnNmb3JtRm9yQ2hpbGRBdEluZGV4KGZsLCBuZXdSZWxhdGl2ZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZVZpZXdGb3JUcmFuc2l0aW9uKC0xLCBuZXdSZWxhdGl2ZUluZGV4LCBmbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3RpdmVWaWV3c1tpbmRleF0uYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdzVG9CcmluZ1RvRnJvbnQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBWaWV3IHYgPSBtVmlld3NUb0JyaW5nVG9Gcm9udC5nZXQoaSk7CisgICAgICAgICAgICAgICAgdi5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1WaWV3c1RvQnJpbmdUb0Zyb250LmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1DdXJyZW50V2luZG93U3RhcnQgPSBuZXdXaW5kb3dTdGFydDsKKyAgICAgICAgICAgIG1DdXJyZW50V2luZG93RW5kID0gbmV3V2luZG93RW5kOworICAgICAgICAgICAgbUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCA9IG5ld1dpbmRvd1N0YXJ0VW5ib3VuZGVkOworICAgICAgICB9CisKKyAgICAgICAgbUZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICBpZiAoIW9uTGF5b3V0KSB7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgQWRhcHRlciB0cmllcyB0byBsYXlvdXQgdGhlIGN1cnJlbnQgdmlldyB3aGVuIHdlIGdldCBpdCB1c2luZyBnZXRWaWV3CisgICAgICAgICAgICAvLyBhYm92ZSB0aGUgbGF5b3V0IHdpbGwgZW5kIHVwIGJlaW5nIGlnbm9yZWQgc2luY2Ugd2UgYXJlIGN1cnJlbnRseSBsYXlpbmcgb3V0LCBzbworICAgICAgICAgICAgLy8gd2UgcG9zdCBhIGRlbGF5ZWQgcmVxdWVzdExheW91dCBhbmQgaW52YWxpZGF0ZQorICAgICAgICAgICAgbU1haW5RdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZENoaWxkKFZpZXcgY2hpbGQpIHsKKyAgICAgICAgYWRkVmlld0luTGF5b3V0KGNoaWxkLCAtMSwgY3JlYXRlT3JSZXVzZUxheW91dFBhcmFtcyhjaGlsZCkpOworCisgICAgICAgIC8vIFRoaXMgY29kZSBpcyB1c2VkIHRvIG9idGFpbiBhIHJlZmVyZW5jZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEgY2hpbGQgaW4gY2FzZSB3ZSBuZWVkCisgICAgICAgIC8vIHRvIGRlY2lkZSBvdXIgb3duIHNpemUuIFRPRE86IERvIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjaGlsZCB0aGF0IHdlJ3JlCisgICAgICAgIC8vIHVzaW5nIGZvciByZWZlcmVuY2Ugc2l6ZT8gSWYgc28sIHdoZW4/CisgICAgICAgIGlmIChtUmVmZXJlbmNlQ2hpbGRXaWR0aCA9PSAtMSB8fCBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgPT0gLTEpIHsKKyAgICAgICAgICAgIGludCBtZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7CisgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKG1lYXN1cmVTcGVjLCBtZWFzdXJlU3BlYyk7CisgICAgICAgICAgICBtUmVmZXJlbmNlQ2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgIG1SZWZlcmVuY2VDaGlsZEhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWVhc3VyZUNoaWxkcmVuKCkgeworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoID0gbU1lYXN1cmVkV2lkdGggLSBtUGFkZGluZ0xlZnQgLSBtUGFkZGluZ1JpZ2h0OworICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHQgPSBtTWVhc3VyZWRIZWlnaHQgLSBtUGFkZGluZ1RvcCAtIG1QYWRkaW5nQm90dG9tOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjaGlsZFdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgd2lkdGhTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGJvb2xlYW4gaGF2ZUNoaWxkUmVmU2l6ZSA9IChtUmVmZXJlbmNlQ2hpbGRXaWR0aCAhPSAtMSAmJiBtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgIT0gLTEpOworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIG91ciBwYXJlbnQgaGFzbid0IHRvbGQgdXMgaG93CisgICAgICAgIC8vIGJpZyB3ZSBzaG91bGQgYmUuIEluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gdXNlIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIGZpcnN0CisgICAgICAgIC8vIGNoaWxkIGFkZGVkLgorICAgICAgICBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIGhlaWdodFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IG1SZWZlcmVuY2VDaGlsZEhlaWdodCArIG1QYWRkaW5nVG9wICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdCb3R0b20gOiAwOworICAgICAgICB9IGVsc2UgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIGhlaWdodFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IE1hdGgubWluKG1SZWZlcmVuY2VDaGlsZEhlaWdodCArIG1QYWRkaW5nVG9wICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdCb3R0b20sIGhlaWdodFNwZWNTaXplKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGhTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQgOiAwOworICAgICAgICB9IGVsc2UgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLkFUX01PU1QpIHsKKyAgICAgICAgICAgIHdpZHRoU3BlY1NpemUgPSBoYXZlQ2hpbGRSZWZTaXplID8gTWF0aC5taW4obVJlZmVyZW5jZUNoaWxkV2lkdGggKyBtUGFkZGluZ0xlZnQgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1JpZ2h0LCB3aWR0aFNwZWNTaXplKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aFNwZWNTaXplLCBoZWlnaHRTcGVjU2l6ZSk7CisgICAgICAgIG1lYXN1cmVDaGlsZHJlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSAwOworCisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVmcmVzaENoaWxkcmVuKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworCisgICAgICAgICAgICBpbnQgY2hpbGRSaWdodCA9IG1QYWRkaW5nTGVmdCArIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgIGludCBjaGlsZEJvdHRvbSA9IG1QYWRkaW5nVG9wICsgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKworICAgICAgICAgICAgY2hpbGQubGF5b3V0KG1QYWRkaW5nTGVmdCwgbVBhZGRpbmdUb3AsIGNoaWxkUmlnaHQsIGNoaWxkQm90dG9tKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YUNoYW5nZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2F2ZWRTdGF0ZSBleHRlbmRzIEJhc2VTYXZlZFN0YXRlIHsKKyAgICAgICAgaW50IHdoaWNoQ2hpbGQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayBBZGFwdGVyVmlld0FuaW1hdG9yI29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KKyAgICAgICAgICovCisgICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBpbnQgd2hpY2hDaGlsZCkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgICAgICB0aGlzLndoaWNoQ2hpbGQgPSB3aGljaENoaWxkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayAjQ1JFQVRPUn0KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU2F2ZWRTdGF0ZShQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgICAgIHdoaWNoQ2hpbGQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQod2hpY2hDaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQWRhcHRlclZpZXdBbmltYXRvci5TYXZlZFN0YXRleyB3aGljaENoaWxkID0gIiArIHdoaWNoQ2hpbGQgKyAiIH0iOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgorICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgeworICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CisgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShQYXJjZWxhYmxlIHN0YXRlKSB7CisgICAgICAgIFNhdmVkU3RhdGUgc3MgPSAoU2F2ZWRTdGF0ZSkgc3RhdGU7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKKworICAgICAgICAvLyBIZXJlIHdlIHNldCBtV2hpY2hDaGlsZCBpbiBhZGRpdGlvbiB0byBzZXREaXNwbGF5ZWRDaGlsZAorICAgICAgICAvLyBXZSBkbyB0aGUgZm9ybWVyIGluIGNhc2UgbUFkYXB0ZXIgaXMgbnVsbCwgYW5kIGhlbmNlIHNldERpc3BsYXllZENoaWxkIHdvbid0CisgICAgICAgIC8vIHNldCBtV2hpY2hDaGlsZAorICAgICAgICBtV2hpY2hDaGlsZCA9IHNzLndoaWNoQ2hpbGQ7CisgICAgICAgIHNldERpc3BsYXllZENoaWxkKG1XaGljaENoaWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KKyAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCisgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqLworICAgIHZvaWQgc2hvd09ubHkoaW50IGNoaWxkSW5kZXgpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhbmltYXRlID0gKCFtRmlyc3RUaW1lIHx8IG1BbmltYXRlRmlyc3RUaW1lKTsKKyAgICAgICAgc2hvd09ubHkoY2hpbGRJbmRleCwgYW5pbWF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVmlldyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNoaWxkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVmlldyBjdXJyZW50bHkgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0RGlzcGxheWVkQ2hpbGQoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldEN1cnJlbnRWaWV3KCkgeworICAgICAgICByZXR1cm4gZ2V0Vmlld0F0UmVsYXRpdmVJbmRleChtQWN0aXZlT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQW5pbWF0aW9uIGdldEluQW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbUluQW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbkFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZW50ZXJzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJbkFuaW1hdGlvbigpCisgICAgICogQHNlZSAjc2V0SW5BbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbkFuaW1hdGlvbihBbmltYXRpb24gaW5BbmltYXRpb24pIHsKKyAgICAgICAgbUluQW5pbWF0aW9uID0gaW5BbmltYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXRzIHRoZSBzY3JlZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIEFuaW1hdGlvbiBvciBudWxsIGlmIG5vbmUgaXMgc2V0LgorICAgICAqCisgICAgICogQHNlZSAjc2V0T3V0QW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqIEBzZWUgI3NldE91dEFuaW1hdGlvbihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBBbmltYXRpb24gZ2V0T3V0QW5pbWF0aW9uKCkgeworICAgICAgICByZXR1cm4gbU91dEFuaW1hdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuaW1hdGlvbiB1c2VkIHRvIGFuaW1hdGUgYSBWaWV3IHRoYXQgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHBhcmFtIG91dEFuaW1hdGlvbiBUaGUgYW5pbWF0aW9uIHN0YXJ0ZWQgd2hlbiBhIFZpZXcgZXhpdCB0aGUgc2NyZWVuLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRBbmltYXRpb24oQW5pbWF0aW9uIG91dEFuaW1hdGlvbikgeworICAgICAgICBtT3V0QW5pbWF0aW9uID0gb3V0QW5pbWF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5pbWF0aW9uIHVzZWQgdG8gYW5pbWF0ZSBhIFZpZXcgdGhhdCBlbnRlcnMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5BbmltYXRpb24oKQorICAgICAqIEBzZWUgI3NldEluQW5pbWF0aW9uKGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluQW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0SW5BbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZUlEKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhbmltYXRpb24gdXNlZCB0byBhbmltYXRlIGEgVmlldyB0aGF0IGV4aXQgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZUlEIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0T3V0QW5pbWF0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRPdXRBbmltYXRpb24oYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0QW5pbWF0aW9uKENvbnRleHQgY29udGV4dCwgaW50IHJlc291cmNlSUQpIHsKKyAgICAgICAgc2V0T3V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oY29udGV4dCwgcmVzb3VyY2VJRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IFZpZXcgc2hvdWxkIGJlIGFuaW1hdGVkIHRoZSBmaXJzdCB0aW1lCisgICAgICogdGhlIFZpZXdBbmltYXRpb24gaXMgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW1hdGUgVHJ1ZSB0byBhbmltYXRlIHRoZSBjdXJyZW50IFZpZXcgdGhlIGZpcnN0IHRpbWUgaXQgaXMgZGlzcGxheWVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmltYXRlRmlyc3RWaWV3KGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICBtQW5pbWF0ZUZpcnN0VGltZSA9IGFuaW1hdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXNlbGluZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50VmlldygpICE9IG51bGwpID8gZ2V0Q3VycmVudFZpZXcoKS5nZXRCYXNlbGluZSgpIDogc3VwZXIuZ2V0QmFzZWxpbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWRhcHRlciBnZXRBZGFwdGVyKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbURhdGFTZXRPYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBjaGVja0ZvY3VzKCk7CisKKyAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EYXRhU2V0T2JzZXJ2ZXIgPSBuZXcgQWRhcHRlckRhdGFTZXRPYnNlcnZlcigpOworICAgICAgICAgICAgbUFkYXB0ZXIucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdXAgdGhpcyBBZGFwdGVyVmlld0FuaW1hdG9yIHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEKKyAgICAgKiBSZW1vdGVWaWV3c1NlcnZpY2UgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvCisgICAgICogICAgICAgIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbVJlbW90ZVZpZXdzQWRhcHRlciA9IG5ldyBSZW1vdGVWaWV3c0FkYXB0ZXIoZ2V0Q29udGV4dCgpLCBpbnRlbnQsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0RGlzcGxheWVkQ2hpbGQocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZpZXdBdFJlbGF0aXZlSW5kZXgobUFjdGl2ZU9mZnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJhY2sgd2hlbiB0aGUgYWRhcHRlciBjb25uZWN0cyB0byB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpIHsKKyAgICAgICAgaWYgKG1SZW1vdGVWaWV3c0FkYXB0ZXIgIT0gbUFkYXB0ZXIpIHsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmFjayB3aGVuIHRoZSBhZGFwdGVyIGRpc2Nvbm5lY3RzIGZyb20gdGhlIFJlbW90ZVZpZXdzU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtUmVtb3RlVmlld3NBZGFwdGVyICE9IG1BZGFwdGVyKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NBZGFwdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHNldEFkYXB0ZXIobVJlbW90ZVZpZXdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXdGbGlwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NjgzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVyVmlld0ZsaXBwZXIuamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKKy8qKgorICogU2ltcGxlIHtAbGluayBWaWV3QW5pbWF0b3J9IHRoYXQgd2lsbCBhbmltYXRlIGJldHdlZW4gdHdvIG9yIG1vcmUgdmlld3MKKyAqIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGl0LiAgT25seSBvbmUgY2hpbGQgaXMgc2hvd24gYXQgYSB0aW1lLiAgSWYKKyAqIHJlcXVlc3RlZCwgY2FuIGF1dG9tYXRpY2FsbHkgZmxpcCBiZXR3ZWVuIGVhY2ggY2hpbGQgYXQgYSByZWd1bGFyIGludGVydmFsLgorICoKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3RmxpcHBlcl9mbGlwSW50ZXJ2YWwKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FkYXB0ZXJWaWV3RmxpcHBlcl9hdXRvU3RhcnQKKyAqLworQFJlbW90ZVZpZXcKK3B1YmxpYyBjbGFzcyBBZGFwdGVyVmlld0ZsaXBwZXIgZXh0ZW5kcyBBZGFwdGVyVmlld0FuaW1hdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZXdGbGlwcGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR0QgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOVEVSVkFMID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQU5JTUFUSU9OX0RVUkFUSU9OID0gMjAwOworCisgICAgcHJpdmF0ZSBpbnQgbUZsaXBJbnRlcnZhbCA9IERFRkFVTFRfSU5URVJWQUw7CisgICAgcHJpdmF0ZSBpbnQgbUFuaW1hdGlvbkR1cmF0aW9uID0gREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT047CisgICAgcHJpdmF0ZSBib29sZWFuIG1BdXRvU3RhcnQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlclByZXNlbnQgPSB0cnVlOworCisgICAgcHVibGljIEFkYXB0ZXJWaWV3RmxpcHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXREZWZhdWx0QW5pbWF0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBBZGFwdGVyVmlld0ZsaXBwZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcik7CisgICAgICAgIG1GbGlwSW50ZXJ2YWwgPSBhLmdldEludCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3RmxpcHBlcl9mbGlwSW50ZXJ2YWwsIERFRkFVTFRfSU5URVJWQUwpOworICAgICAgICBtQXV0b1N0YXJ0ID0gYS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdGbGlwcGVyX2F1dG9TdGFydCwgZmFsc2UpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgaW5pdERlZmF1bHRBbmltYXRpb25zKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXREZWZhdWx0QW5pbWF0aW9ucygpIHsKKyAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGFuaW1hdGlvbnMgdG8gYmUgZmFkZSBpbi9vdXQKKyAgICAgICAgaWYgKG1JbkFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtSW5BbmltYXRpb24gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7CisgICAgICAgICAgICBtSW5BbmltYXRpb24uc2V0RHVyYXRpb24obUFuaW1hdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dEFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0QW5pbWF0aW9uID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpOworICAgICAgICAgICAgbU91dEFuaW1hdGlvbi5zZXREdXJhdGlvbihtQW5pbWF0aW9uRHVyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fU0NSRUVOX09GRi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIG1Vc2VyUHJlc2VudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgLy8gTGlzdGVuIGZvciBicm9hZGNhc3RzIHJlbGF0ZWQgdG8gdXNlci1wcmVzZW5jZQorICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQpOworICAgICAgICBnZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgaWYgKG1BdXRvU3RhcnQpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgc3RhcnQgd2hlbiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIHN0YXJ0RmxpcHBpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOworCisgICAgICAgIGdldENvbnRleHQoKS51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgc3VwZXIub25XaW5kb3dWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKKyAgICAgICAgbVZpc2libGUgPSAodmlzaWJpbGl0eSA9PSBWSVNJQkxFKTsKKyAgICAgICAgdXBkYXRlUnVubmluZyhmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgdXBkYXRlUnVubmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGZsaXBwaW5nIHRvIHRoZSBuZXh0IHZpZXcKKyAgICAgKgorICAgICAqIEBwYXJhbSBtaWxsaXNlY29uZHMKKyAgICAgKiAgICAgICAgICAgIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmxpcEludGVydmFsKGludCBtaWxsaXNlY29uZHMpIHsKKyAgICAgICAgbUZsaXBJbnRlcnZhbCA9IG1pbGxpc2Vjb25kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIHRpbWVyIHRvIGN5Y2xlIHRocm91Z2ggY2hpbGQgdmlld3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBtb3JlIGZsaXBzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcEZsaXBwaW5nKCkgeworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dOZXh0KCkgeworICAgICAgIC8vIGlmIHRoZSBmbGlwcGVyIGlzIGN1cnJlbnRseSBmbGlwcGluZyBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvd05leHQoKSBpcyBjYWxsZWQKKyAgICAgICAvLyB3ZSBzaG91bGQgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byByZXNldCB0aGUgdGltZXIKKyAgICAgICBpZiAobVJ1bm5pbmcpIHsKKyAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoRkxJUF9NU0cpOworICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOworICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBtRmxpcEludGVydmFsKTsKKyAgICAgICB9CisgICAgICAgc3VwZXIuc2hvd05leHQoKTsKKyAgIH0KKworICAgLyoqCisgICAgKiB7QGluaGVyaXREb2N9CisgICAgKi8KKyAgIEBPdmVycmlkZQorICAgQFJlbW90YWJsZVZpZXdNZXRob2QKKyAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cygpIHsKKyAgICAgICAvLyBpZiB0aGUgZmxpcHBlciBpcyBjdXJyZW50bHkgZmxpcHBpbmcgYXV0b21hdGljYWxseSwgYW5kIHNob3dQcmV2aW91cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHdlIHNob3VsZCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSB0aW1lcgorICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhGTElQX01TRyk7CisgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOworICAgICAgIH0KKyAgICAgICBzdXBlci5zaG93UHJldmlvdXMoKTsKKyAgIH0KKworICAgLyoqCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gc3RhcnQgb3Igc3RvcCBkaXNwYXRjaGluZyBmbGlwIHtAbGluayBNZXNzYWdlfSBiYXNlZAorICAgICAqIG9uIHtAbGluayAjbVJ1bm5pbmd9IGFuZCB7QGxpbmsgI21WaXNpYmxlfSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUnVubmluZygpIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCB3aGVuIHdlIHVwZGF0ZSBydW5uaW5nLCB3ZSB3YW50IHRoZQorICAgICAgICAvLyBjdXJyZW50IHZpZXcgdG8gYW5pbWF0ZSBpbgorICAgICAgICB1cGRhdGVSdW5uaW5nKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdGFydCBvciBzdG9wIGRpc3BhdGNoaW5nIGZsaXAge0BsaW5rIE1lc3NhZ2V9IGJhc2VkCisgICAgICogb24ge0BsaW5rICNtUnVubmluZ30gYW5kIHtAbGluayAjbVZpc2libGV9IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGZsaXBOb3cgRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gbm93LCBpbgorICAgICAqICAgICAgICAgICAgYWRkaXRpb24gdG8gcXVldWluZyBmdXR1cmUgZmxpcHMuIElmIG9taXR0ZWQsIGRlZmF1bHRzIHRvCisgICAgICogICAgICAgICAgICB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdW5uaW5nKGJvb2xlYW4gZmxpcE5vdykgeworICAgICAgICBib29sZWFuIHJ1bm5pbmcgPSBtVmlzaWJsZSAmJiBtU3RhcnRlZCAmJiBtVXNlclByZXNlbnQgJiYgbUFkYXB0ZXIgIT0gbnVsbDsKKyAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKKyAgICAgICAgICAgIGlmIChydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIGZsaXBOb3cpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShGTElQX01TRyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgbUZsaXBJbnRlcnZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEZMSVBfTVNHKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SdW5uaW5nID0gcnVubmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoTE9HRCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlUnVubmluZygpIG1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsIG1TdGFydGVkPSIgKyBtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICArICIsIG1Vc2VyUHJlc2VudD0iICsgbVVzZXJQcmVzZW50ICsgIiwgbVJ1bm5pbmc9IiArIG1SdW5uaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hpbGQgdmlld3MgYXJlIGZsaXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmxpcHBpbmcoKSB7CisgICAgICAgIHJldHVybiBtU3RhcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgaWYgdGhpcyB2aWV3IGF1dG9tYXRpY2FsbHkgY2FsbHMge0BsaW5rICNzdGFydEZsaXBwaW5nKCl9IHdoZW4gaXQKKyAgICAgKiBiZWNvbWVzIGF0dGFjaGVkIHRvIGEgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9TdGFydChib29sZWFuIGF1dG9TdGFydCkgeworICAgICAgICBtQXV0b1N0YXJ0ID0gYXV0b1N0YXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZpZXcgYXV0b21hdGljYWxseSBjYWxscyB7QGxpbmsgI3N0YXJ0RmxpcHBpbmcoKX0KKyAgICAgKiB3aGVuIGl0IGJlY29tZXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBdXRvU3RhcnQoKSB7CisgICAgICAgIHJldHVybiBtQXV0b1N0YXJ0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgaW50IEZMSVBfTVNHID0gMTsKKworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IEZMSVBfTVNHKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkN2ZiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BZGFwdGVycy5qYXZhCkBAIC0wLDAgKzEsMTIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gbG9hZCB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlciBhZGFwdGVyc30gZGVmaW5lZCBpbgorICogWE1MIHJlc291cmNlcy4gWE1MLWRlZmluZWQgYWRhcHRlcnMgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGNyZWF0ZSBhZGFwdGVycyBpbiB5b3VyCisgKiBvd24gYXBwbGljYXRpb24gb3IgdG8gcGFzcyBhZGFwdGVycyB0byBvdGhlciBwcm9jZXNzZXMuPC9wPgorICogCisgKiA8aDI+VHlwZXMgb2YgYWRhcHRlcnM8L2gyPgorICogPHA+QWRhcHRlcnMgZGVmaW5lZCB1c2luZyBYTUwgcmVzb3VyY2VzIGNhbiBvbmx5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN1cHBvcnRlZAorICogdHlwZXMuIEFyYml0cmFyeSBhZGFwdGVycyBhcmUgbm90IHN1cHBvcnRlZCB0byBndWFyYW50ZWUgdGhlIHNhZmV0eSBvZiB0aGUgbG9hZGVkCisgKiBjb2RlIHdoZW4gYWRhcHRlcnMgYXJlIGxvYWRlZCBhY3Jvc3MgcGFja2FnZXMuPC9wPgorICogPHVsPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyIj5DdXJzb3IgYWRhcHRlcjwvYT46IGEgY3Vyc29yIGFkYXB0ZXIgY2FuIGJlIHVzZWQKKyAqICB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgY3Vyc29yLCBtb3N0IG9mdGVuIGNvbWluZyBmcm9tIGEgY29udGVudCBwcm92aWRlcjwvbGk+CisgKiA8L3VsPgorICogPHA+VGhlIGNvbXBsZXRlIFhNTCBmb3JtYXQgZGVmaW5pdGlvbiBvZiBlYWNoIGFkYXB0ZXIgdHlwZSBpcyBhdmFpbGFibGUgYmVsb3cuPC9wPgorICogCisgKiA8YSBuYW1lPSJ4bWwtY3Vyc29yLWFkYXB0ZXIiIC8+CisgKiA8aDI+Q3Vyc29yIGFkYXB0ZXI8L2gyPgorICogPHA+QSBjdXJzb3IgYWRhcHRlciBYTUwgZGVmaW5pdGlvbiBzdGFydHMgd2l0aCB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItdGFnIj48Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+PC9hPgorICogdGFnIGFuZCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2YgdGhlIGZvbGxvd2luZyB0YWdzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICogIDxsaT48YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIj48Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT48L2E+PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci10YWciIC8+CisgKiA8aDM+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5lcyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogZG9jdW1lbnQgYW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6bGF5b3V0PC9jb2RlPjogUmVmZXJlbmNlIHRvIHRoZSBYTUwgbGF5b3V0IHRvIGJlIGluZmxhdGVkIGZvcgorICogIGVhY2ggaXRlbSBvZiB0aGUgYWRhcHRlci4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6c2VsZWN0aW9uPC9jb2RlPjogU2VsZWN0aW9uIGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpzb3J0T3JkZXI8L2NvZGU+OiBTb3J0IGV4cHJlc3Npb24sIHVzZWQgd2hlbiB0aGUKKyAqICA8Y29kZT5hbmRyb2lkOnVyaTwvY29kZT4gYXR0cmlidXRlIGlzIGRlZmluZWQgb3Igd2hlbiB0aGUgYWRhcHRlciBpcyBsb2FkZWQgd2l0aAorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycyNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBTdHJpbmcsIE9iamVjdFtdKX0uCisgKiAgVGhpcyBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuPC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp1cmk8L2NvZGU+OiBVUkkgb2YgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gcXVlcnkgdG8gcmV0cmlldmUgYSBjdXJzb3IuCisgKiAgU3BlY2lmeWluZyB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9LgorICogIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kLCB0aGUgdmFsdWUgb2YgdGhlIFhNTCBhdHRyaWJ1dGUgaXMgaWdub3JlZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAqICBvcHRpb25hbC48L2xpPgorICogPC91bD4KKyAqIDxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCisgKiA8YSBocmVmPSIjeG1sLWN1cnNvci1hZGFwdGVyLXNlbGVjdC10YWciPjxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+PC9hPiBhbmQKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC10YWciPjxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPjwvYT4gdGFncyBhcyBjaGlsZHJlbgorICogb2YgPGNvZGU+Jmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7PC9jb2RlPi48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIiAvPgorICogPGgzPiZsdDtzZWxlY3QgLyZndDs8L2gzPgorICogPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IHRhZyBpcyB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGN1cnNvcgorICogd2hlbiBkb2luZyB0aGUgcXVlcnkuIFRoaXMgY2FuIGJlIHZlcnkgdXNlZnVsIHdoZW4gdXNpbmcgdHJhbnNmb3JtYXRpb25zIGluIHRoZQorICogPGNvZGU+Jmx0O2JpbmQgLyZndDs8L2NvZGU+IGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSB2ZXJ5IHVzZWZ1bCBpZiB5b3UgYXJlIHByb3ZpZGluZworICogeW91ciBvd24gPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmJpbmRlcjwvYT4gb3IKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXR5cGVzIj50cmFuc2Zvcm1hdGlvbjwvYT4gY2xhc3Nlcy4KKyAqIDxjb2RlPiZsdDtzZWxlY3QgLyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBpZ25vcmVkIGlmIHlvdSBzdXBwbHkgdGhlIGN1cnNvciB5b3Vyc2VsZi48L3A+CisgKiA8cD5UaGUgPGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpjb2x1bW48L2NvZGU+OiBOYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0IGluIHRoZSBjdXJzb3IgZHVyaW5nIHRoZQorICogIHF1ZXJ5IG9wZXJhdGlvbjwvbGk+CisgKiA8L3VsPgorICogPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY29sdW1uIG5hbWVkIDxjb2RlPl9pZDwvY29kZT4gaXMgYWx3YXlzIGltcGxpY2l0bHkKKyAqIHNlbGVjdGVkLjwvcD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdGFnIiAvPgorICogPGgzPiZsdDtiaW5kIC8mZ3Q7PC9oMz4KKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIGlzIHVzZWQgdG8gYmluZCBhIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IgdG8KKyAqIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS4gQSBjb2x1bW4gYm91bmQgdXNpbmcgdGhpcyB0YWcgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZAorICogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYSBtYXRjaGluZworICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1zZWxlY3QtdGFnIj48Y29kZT4mbHQ7c2VsZWN0IC8mZ3Q7PC9jb2RlPiB0YWcgaXMgdGhlcmVmb3JlCisgKiBub3QgcmVxdWlyZWQuPC9wPgorICogCisgKiA8cD5FYWNoIGJpbmRpbmcgaXMgZGVjbGFyZWQgYXMgYSBvbmUgdG8gb25lIG1hdGNoaW5nIGJ1dAorICogY3VzdG9tIGJpbmRlciBjbGFzc2VzIG9yIHNwZWNpYWwKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItYmluZC1kYXRhLXRyYW5zZm9ybWF0aW9uIj5kYXRhIHRyYW5zZm9ybWF0aW9uczwvYT4gY2FuCisgKiBhbGxvdyB5b3UgdG8gYmluZCBzZXZlcmFsIGNvbHVtbnMgdG8gYSBzaW5nbGUgdmlldy4gSW4gdGhpcyBjYXNlIHlvdSBtdXN0IHVzZSB0aGUKKyAqIDxhIGhyZWY9IiN4bWwtY3Vyc29yLWFkYXB0ZXItc2VsZWN0LXRhZyI+PGNvZGU+Jmx0O3NlbGVjdCAvJmd0OzwvY29kZT4gdGFnIHRvIG1ha2UKKyAqIHN1cmUgYW55IHJlcXVpcmVkIGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBxdWVyeS48L3A+CisgKiAKKyAqIDxwPlRoZSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gdGFnIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6ZnJvbTwvY29kZT46IFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLgorICogIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeS4gTm90ZSB0aGF0IDxjb2RlPkA8L2NvZGU+IHdoaWNoIGFyZSBub3QgdXNlZCB0byByZWZlcmVuY2UgcmVzb3VyY2VzCisgKiAgc2hvdWxkIGJlIGJhY2tzbGFzaCBwcm90ZWN0ZWQgYXMgaW4gPGNvZGU+XEA8L2NvZGU+LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6dG88L2NvZGU+OiBUaGUgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6YXM8L2NvZGU+OiBUaGUgPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHlwZXMiPmRhdGEgdHlwZTwvYT4KKyAqICBvZiB0aGUgYmluZGluZy4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LjwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD5JbiBhZGRpdGlvbiwgYSA8Y29kZT4mbHQ7YmluZCAvJmd0OzwvY29kZT4gY2FuIGNvbnRhaW4gemVybyBvciBtb3JlIGluc3RhbmNlcyBvZgorICogPGEgaHJlZj0iI3htbC1jdXJzb3ItYWRhcHRlci1iaW5kLWRhdGEtdHJhbnNmb3JtYXRpb24iPmRhdGEgdHJhbnNmb3JtYXRpb25zPC9hPiBjaGlsZHJlbgorICogdGFncy48L3A+CisgKgorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtZGF0YS10eXBlcyIgLz4KKyAqIDxoND5CaW5kaW5nIGRhdGEgdHlwZXM8L2g0PgorICogPHA+Rm9yIGEgYmluZGluZyB0byBvY2N1ciB0aGUgZGF0YSB0eXBlIG9mIHRoZSBib3VuZCBjb2x1bW4vdmlldyBwYWlyIG11c3QgYmUgc3BlY2lmaWVkLgorICogVGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+c3RyaW5nPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgbXVzdCBiZQorICogIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fTwvbGk+CisgKiAgPGxpPjxjb2RlPmltYWdlPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIGJsb2IgZGVzY3JpYmluZyBhbgorICogIGltYWdlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+aW1hZ2UtdXJpPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIFVSSSB0byBhbiBpbWFnZQorICogIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+ZHJhd2FibGU8L2NvZGU+OiBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYQorICogIGRyYXdhYmxlIGFuZCBtdXN0IGJlIGJvdW5kIHRvIGFuIHtAbGluayBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXd9PC9saT4KKyAqICA8bGk+PGNvZGU+dGFnPC9jb2RlPjogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiBpcyBpbnRlcnByZXRlZCBhcyBhIHN0cmluZyBhbmQgd2lsbCBiZSBzZXQgYXMKKyAqICB0aGUgdGFnICh1c2luZyB7QGxpbmsgVmlldyNzZXRUYWcoT2JqZWN0KX0gb2YgdGhlIGFzc29jaWF0ZWQgVmlldy4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogIGFzc29jaWF0ZSBtZXRhLWRhdGEgdG8geW91ciB2aWV3LCB0aGF0IGNhbiBiZSB1c2VkIGZvciBpbnN0YW5jZSBieSBhIGxpc3RlbmVyLjwvbGk+CisgKiAgPGxpPkEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU6IFRoZSBuYW1lIG9mIGEgY2xhc3MgY29ycmVzcG9uZGluZyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICogIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVycy5DdXJzb3JCaW5kZXJ9LiBDdXJzb3IgYmluZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgYmluZGluZ3Mgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBDdXN0b20gYmluZGVycyBjYW5ub3QgYmUgdXNlZCB3aXRoCisgKiAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2lzUmVzdHJpY3RlZCgpIHJlc3RyaWN0ZWQgY29udGV4dHN9LCBmb3IgaW5zdGFuY2UgaW4gYW4KKyAqICBhcHBsaWNhdGlvbiB3aWRnZXQ8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24iIC8+CisgKiA8aDQ+QmluZGluZyB0cmFuc2Zvcm1hdGlvbnM8L2g0PgorICogPHA+V2hlbiBkZWZpbmluZyBhIGRhdGEgYmluZGluZyB5b3UgY2FuIHNwZWNpZnkgYW4gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gYnkgdXNpbmcgb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHRhZ3MgYXMgYSBjaGlsZCBvZiBhIDxjb2RlPiZsdDtiaW5kIC8mZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+CisgKiA8dWw+CisgKiAgPGxpPjxjb2RlPiZsdDttYXAgLyZndDs8L2NvZGU+OiBNYXBzIGEgY29uc3RhbnQgc3RyaW5nIHRvIGEgc3RyaW5nIG9yIGEgcmVzb3VyY2UuIFVzZQorICogIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHRhZyBwZXIgdmFsdWUgeW91IHdhbnQgdG8gbWFwPC9saT4KKyAqICA8bGk+PGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT46IFRyYW5zZm9ybXMgYSBjb2x1bW4ncyB2YWx1ZSB1c2luZyBhbiBleHByZXNzaW9uCisgKiAgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufTwvbGk+CisgKiA8L3VsPgorICogPHA+V2hpbGUgc2V2ZXJhbCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiB0YWdzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIHlvdSBjYW5ub3QKKyAqIG1peCA8Y29kZT4mbHQ7bWFwIC8mZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncy4gSWYgc2V2ZXJhbAorICogPGNvZGU+Jmx0O3RyYW5zZm9ybSAvJmd0OzwvY29kZT4gdGFncyBhcmUgc3BlY2lmaWVkLCBvbmx5IHRoZSBsYXN0IG9uZSBpcyByZXRhaW5lZC48L3A+CisgKiAKKyAqIDxhIG5hbWU9InhtbC1jdXJzb3ItYWRhcHRlci1iaW5kLXRyYW5zZm9ybWF0aW9uLW1hcCIgLz4KKyAqIDxwPjxzdHJvbmc+Jmx0O21hcCAvJmd0Ozwvc3Ryb25nPjwvcD4KKyAqIDxwPkEgbWFwIGVsZW1lbnQgc2ltcGx5IHNwZWNpZmllcyBhIHZhbHVlIHRvIG1hdGNoIGZyb20gYW5kIGEgdmFsdWUgdG8gbWF0Y2ggdG8uIFdoZW4KKyAqIGEgY29sdW1uJ3MgdmFsdWUgZXF1YWxzIHRoZSB2YWx1ZSB0byBtYXRjaCBmcm9tLCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSB0byBtYXRjaAorICogdG8uIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAqIDx1bD4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDpmcm9tVmFsdWU8L2NvZGU+OiBUaGUgdmFsdWUgdG8gbWF0Y2ggZnJvbS4gVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5PC9saT4KKyAqICA8bGk+PGNvZGU+YW5kcm9pZDp0b1ZhbHVlPC9jb2RlPjogVGhlIHZhbHVlIHRvIG1hdGNoIHRvLiBUaGlzIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcKKyAqICBvciBhIHJlc291cmNlIGlkZW50aWZpZXIuIFRoaXMgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSByZXNvdXJjZSBpZGVudGlmaWVyIHdoZW4gdGhlCisgKiAgZGF0YSBiaW5kaW5nIGlzIG9mIHR5cGUgPGNvZGU+ZHJhd2FibGU8L2NvZGU+LiBUaGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnk8L2xpPgorICogPC91bD4KKyAqIAorICogPGEgbmFtZT0ieG1sLWN1cnNvci1hZGFwdGVyLWJpbmQtdHJhbnNmb3JtYXRpb24tdHJhbnNmb3JtIiAvPgorICogPHA+PHN0cm9uZz4mbHQ7dHJhbnNmb3JtIC8mZ3Q7PC9zdHJvbmc+PC9wPgorICogPHA+QSBzaW1wbGUgdHJhbnNmb3JtIHRoYXQgb2NjdXJzIGVpdGhlciBieSBjYWxsaW5nIGEgc3BlY2lmaWVkIGNsYXNzIG9yIGJ5IHBlcmZvcm1pbmcKKyAqIHNpbXBsZSB0ZXh0IHN1YnN0aXR1dGlvbi4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICogPHVsPgorICogIDxsaT48Y29kZT5hbmRyb2lkOndpdGhFeHByZXNzaW9uPC9jb2RlPjogVGhlIHRyYW5zZm9ybWF0aW9uIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzCisgKiAgYSBzdHJpbmcgY29udGFpbmluZyBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCB3aXRoIGN1cmx5IGJyYWNlcyB7IGFuZCB9LiBEdXJpbmcgdGhlCisgKiAgdHJhbnNmb3JtYXRpb24gZWFjaCBjb2x1bW4gbmFtZSBpcyByZXBsYWNlZCBieSBpdHMgdmFsdWUuIEFsbCBjb2x1bW5zIG11c3QgaGF2ZSBiZWVuCisgKiAgc2VsZWN0ZWQgaW4gdGhlIHF1ZXJ5LiBBbiBleGFtcGxlIG9mIGV4cHJlc3Npb24gaXMgPGNvZGU+IkZpcnN0IG5hbWU6IHtmaXJzdF9uYW1lfSwKKyAqICBsYXN0IG5hbWU6IHtsYXN0X25hbWV9IjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIGlzIG1hbmRhdG9yeQorICogIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpZ25vcmVkIGlmIDxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPgorICogIGlzIHNwZWNpZmllZDwvbGk+CisgKiAgPGxpPjxjb2RlPmFuZHJvaWQ6d2l0aENsYXNzPC9jb2RlPjogQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGFuCisgKiAgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9ufS4gQ3VzdG9tCisgKiAgdHJhbnNmb3JtYXRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGgKKyAqICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjaXNSZXN0cmljdGVkKCkgcmVzdHJpY3RlZCBjb250ZXh0c30sIGZvciBpbnN0YW5jZSBpbgorICogIGFuIGFwcCB3aWRnZXQgVGhpcyBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGlmIDxjb2RlPmFuZHJvaWQ6d2l0aEV4cHJlc3Npb248L2NvZGU+IGlzCisgKiAgbm90IHNwZWNpZmllZDwvbGk+CisgKiA8L3VsPgorICogCisgKiA8aDM+RXhhbXBsZTwvaDM+CisgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGN1cnNvciBhZGFwdGVyIHRoYXQgcXVlcmllcyBhbGwgdGhlIGNvbnRhY3RzIHdpdGgKKyAqIGEgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBjb250YWN0cyBjb250ZW50IHByb3ZpZGVyLiBFYWNoIGNvbnRhY3QgaXMgZGlzcGxheWVkIHdpdGgKKyAqIGl0cyBkaXNwbGF5IG5hbWUsIGl0cyBmYXZvcml0ZSBzdGF0dXMgYW5kIGl0cyBwaG90by4gVG8gZGlzcGxheSBwaG90b3MsIGEgY3VzdG9tIGRhdGEKKyAqIGJpbmRlciBpcyBkZWNsYXJlZDo8L3A+CisgKiAKKyAqIDxwcmUgY2xhc3M9InByZXR0eXByaW50Ij4KKyAqICZsdDtjdXJzb3ItYWRhcHRlciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAqICAgICBhbmRyb2lkOnNlbGVjdGlvbj0iaGFzX3Bob25lX251bWJlcj0xIgorICogICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2NvbnRhY3RfaXRlbSImZ3Q7CisgKgorICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iZGlzcGxheV9uYW1lIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIgYW5kcm9pZDphcz0ic3RyaW5nIiAvJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0ic3RhcnJlZCIgYW5kcm9pZDp0bz0iQGlkL3N0YXIiIGFuZHJvaWQ6YXM9ImRyYXdhYmxlIiZndDsKKyAqICAgICAgICAgJmx0O21hcCBhbmRyb2lkOmZyb21WYWx1ZT0iMCIgYW5kcm9pZDp0b1ZhbHVlPSJAYW5kcm9pZDpkcmF3YWJsZS9zdGFyX2JpZ19vZmYiIC8mZ3Q7CisgKiAgICAgICAgICZsdDttYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjEiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb24iIC8mZ3Q7CisgKiAgICAgJmx0Oy9iaW5kJmd0OworICogICAgICZsdDtiaW5kIGFuZHJvaWQ6ZnJvbT0iX2lkIiBhbmRyb2lkOnRvPSJAaWQvbmFtZSIKKyAqICAgICAgICAgICAgICBhbmRyb2lkOmFzPSJjb20uZ29vZ2xlLmFuZHJvaWQudGVzdC5hZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8mZ3Q7CisgKgorICogJmx0Oy9jdXJzb3ItYWRhcHRlciZndDsKKyAqIDwvcHJlPgorICogCisgKiA8aDM+UmVsYXRlZCBBUElzPC9oMz4KKyAqIDx1bD4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IsIE9iamVjdFtdKX08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMjbG9hZEN1cnNvckFkYXB0ZXIoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCwgU3RyaW5nLCBPYmplY3RbXSl9PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcn08L2xpPgorICogIDxsaT57QGxpbmsgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnMuQ3Vyc29yVHJhbnNmb3JtYXRpb259PC9saT4KKyAqICA8bGk+e0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9PC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzZWUgYW5kcm9pZC53aWRnZXQuQWRhcHRlcgorICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgKiAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfbGF5b3V0IAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9zZWxlY3Rpb24gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX3NvcnRPcmRlciAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfdXJpIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9CaW5kSXRlbV9hcyAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfQmluZEl0ZW1fdG8KKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUgCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX01hcEl0ZW1fdG9WYWx1ZSAKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0N1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4gCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNDdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzIAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtX3dpdGhFeHByZXNzaW9uIAorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFkb2NSZWZlcmVuY2UifSkKK3B1YmxpYyBjbGFzcyBBZGFwdGVycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SID0gImN1cnNvci1hZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIGJpbmQgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9IGNvbHVtbiB0byBhIFZpZXcuIFRoaXMKKyAgICAgKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBiaW5kaW5ncyBmb3IgZGF0YSB0eXBlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAqIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLndpZGdldC5BZGFwdGVyc30uPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgYmluZGVyIGlzIHByb3ZpZGVkIHdpdGggYSBjdXJzb3IgdHJhbnNmb3JtYXRpb24gd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgdXNlZAorICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGN1cnNvci4gVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGd1YXJhbnRlZWQKKyAgICAgKiB0byBuZXZlciBiZSBudWxsIHNvIGl0J3MgYWx3YXlzIHNhZmUgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgYmluZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIENvbnRleHQgYnV0IGNhbiBiZSByZS11c2VkIHdpdGggbXVsdGlwbGUgY3Vyc29ycy4KKyAgICAgKiBBcyBzdWNoLCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugbm8gYXNzdW1wdGlvbiBhYm91dCB0aGUgQ3Vyc29yIGluIHVzZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5WaWV3IAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXJzb3JCaW5kZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLjwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5UaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIG5ldmVyCisgICAgICAgICAqIG51bGwgYW5kIG1heSBvciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gdGhlIEN1cnNvciBkYXRhIGR1cmluZyB0aGUKKyAgICAgICAgICoge0BsaW5rICNiaW5kKGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgaW50KX0gb3BlcmF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBzZWUgI2JpbmQoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yLCBpbnQpIAorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1UcmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+Q3JlYXRlcyBhIG5ldyBDdXJzb3IgYmluZGVyLjwvcD4gCisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kZXIuCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBUaGUgdHJhbnNmb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmluZGVyLiBUaGlzCisgICAgICAgICAqICAgICAgICB0cmFuc2Zvcm1hdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBhcHBsaWVkIGJ5IHRoZSBiaW5kZXIgYW5kIGlzIGd1YXJhbnRlZWQKKyAgICAgICAgICogICAgICAgIHRvIG5vdCBiZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvckJpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5CaW5kcyB0aGUgc3BlY2lmaWVkIEN1cnNvciBjb2x1bW4gdG8gdGhlIHN1cHBsaWVkIFZpZXcuIFRoZSBiaW5kaW5nIG9wZXJhdGlvbgorICAgICAgICAgKiBjYW4gcXVlcnkgb3RoZXIgQ3Vyc29yIGNvbHVtbnMgYXMgbmVlZGVkLiBEdXJpbmcgdGhlIGJpbmRpbmcgb3BlcmF0aW9uLCB2YWx1ZXMKKyAgICAgICAgICogcmV0cmlldmVkIGZyb20gdGhlIEN1cnNvciBtYXkgb3IgbWF5IG5vdCBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGlzIGJpbmRlcidzCisgICAgICAgICAqIGN1cnNvciB0cmFuc2Zvcm1hdGlvbi48L3A+CisgICAgICAgICAqIAorICAgICAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciB0byBiaW5kIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvciB3aGVyZSB0aGUgZGF0YSB0byBiaW5kIHJlc2lkZXMuCisgICAgICAgICAqIAorICAgICAgICAgKiBAc2VlICNtVHJhbnNmb3JtYXRpb24KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29sdW1uIHdhcyBzdWNjZXNzZnVsbHkgYm91bmQgdG8gdGhlIFZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkludGVyZmFjZSB1c2VkIHRvIHRyYW5zZm9ybSBkYXRhIGNvbWluZyBvdXQgb2YgYSB7QGxpbmsgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3J9CisgICAgICogYmVmb3JlIGl0IGlzIGJvdW5kIHRvIGEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3fS48L3A+CisgICAgICogCisgICAgICogPHA+VHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIHRvIHRyYW5zZm9ybSB0ZXh0LWJhc2VkIGRhdGEgKGluIHRoZSBmb3JtIG9mIGEgU3RyaW5nKSwKKyAgICAgKiBvciB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGEgcmVzb3VyY2UgaWRlbnRpZmllci4gQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisgICAgICogdG8gZ2VuZXJhdGUgcmVzb3VyY2UgaWRlbnRpZmllcnMuPC9wPgorICAgICAqIAorICAgICAqIEBzZWUgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3IKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogPHA+VGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmb3JtYXRpb24uPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgQ3Vyc29yIHRyYW5zZm9ybWF0aW9uLjwvcD4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZm9ybWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1cnNvclRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSBTdHJpbmcuIFRoZSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAgKiBjYW4gc2ltcGx5IHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uIGFzIGEgU3RyaW5nICh0aGlzIGlzIGtub3duCisgICAgICAgICAqIGFzIHRoZSBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbikgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudC4gRm9yIGluc3RhbmNlLAorICAgICAgICAgKiBhIHRyYW5zZm9ybWF0aW9uIGNhbiBwZXJmb3JtIHRleHQgc3Vic3RpdHV0aW9ucyBvciBjb25jYXRlbmF0ZSBvdGhlcgorICAgICAgICAgKiBjb2x1bW5zIHdpdGggdGhlIHNwZWNpZmllZCBjb2x1bW4uPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSBTdHJpbmcgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgb2YgdGhlIGNvbHVtbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlRyYW5zZm9ybXMgdGhlIHNwZWNpZmllZCBDdXJzb3IgY29sdW1uIGludG8gYSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW50ZXJwcmV0cyB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uCisgICAgICAgICAqIGFzIGFuIGludGVnZXIuPC9wPgorICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gdHJhbnNmb3JtLiAKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgICogCisgICAgICAgICAqIEByZXR1cm4gQSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRJbnQoY29sdW1uSW5kZXgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzdXBwbGllZCBVUkkuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIHN1cHBsaWVkIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gaXMKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0aGUgY3Vyc29yIHJldHVybmVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyCisgICAgICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQuIE90aGVyd2lzZSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAgICogY3Vyc29yIHlvdXJzZWxmLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgZm9ybWF0IG9mIHRoZSBYTUwgZGVmaW5pdGlvbiBvZiB0aGUgY3Vyc29yIGFkYXB0ZXIgaXMgZG9jdW1lbnRlZCBhdAorICAgICAqIHRoZSB0b3Agb2YgdGhpcyBwYWdlLjwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBsb2FkIHRoZSBYTUwgcmVzb3VyY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIFhNTCByZXNvdXJjZSBkZWNsYXJpbmcgdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgQ3Vyc29yQWRhcHRlciwgdXNlZAorICAgICAqICAgICAgICB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbiB0aGUgc2VsZWN0aW9uIGV4cHJlc3Npb24uCisgICAgICogCisgICAgICogQHJldHVybiBBIHtAbGluayBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyfQorICAgICAqIAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBYTUwgcmVzb3VyY2UgZG9lcyBub3QgY29udGFpbgorICAgICAqICAgICAgICAgYSB2YWxpZCAmbHQ7Y3Vyc29yLWFkYXB0ZXIgLyZndDsgZGVmaW5pdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAc2VlIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIKKyAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIKKyAgICAgKiBAc2VlICNsb2FkQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBPYmplY3RbXSkgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDdXJzb3JBZGFwdGVyIGxvYWRDdXJzb3JBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgdXJpLAorICAgICAgICAgICAgT2JqZWN0Li4uIHBhcmFtZXRlcnMpIHsKKworICAgICAgICBYbWxDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSAoWG1sQ3Vyc29yQWRhcHRlcikgbG9hZEFkYXB0ZXIoY29udGV4dCwgaWQsIEFEQVBURVJfQ1VSU09SLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5zZXRVcmkodXJpKTsKKyAgICAgICAgfQorICAgICAgICBhZGFwdGVyLmxvYWQoKTsKKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Mb2FkcyB0aGUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9IGRlZmluZWQgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIFhNTCByZXNvdXJjZS4gVGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIgaXMgbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBjdXJzb3IuCisgICAgICogWW91IGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHN1cHBsaWVkIGN1cnNvci48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGZvcm1hdCBvZiB0aGUgWE1MIGRlZmluaXRpb24gb2YgdGhlIGN1cnNvciBhZGFwdGVyIGlzIGRvY3VtZW50ZWQgYXQKKyAgICAgKiB0aGUgdG9wIG9mIHRoaXMgcGFnZS48L3A+CisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gbG9hZCB0aGUgWE1MIHJlc291cmNlIGZyb20uCisgICAgICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYTUwgcmVzb3VyY2UgZGVjbGFyaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBjdXJzb3IgVGhlIGN1cnNvciBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEN1cnNvckFkYXB0ZXIsIHVzZWQKKyAgICAgKiAgICAgICAgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW4gdGhlIHNlbGVjdGlvbiBleHByZXNzaW9uLgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQ3Vyc29yQWRhcHRlcn0KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgWE1MIHJlc291cmNlIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgKiAgICAgICAgIGEgdmFsaWQgJmx0O2N1cnNvci1hZGFwdGVyIC8mZ3Q7IGRlZmluaXRpb24uCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcgorICAgICAqIEBzZWUgI2xvYWRBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIE9iamVjdFtdKSAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEN1cnNvckFkYXB0ZXIgbG9hZEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICBPYmplY3QuLi4gcGFyYW1ldGVycykgeworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IChYbWxDdXJzb3JBZGFwdGVyKSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgQURBUFRFUl9DVVJTT1IsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisKKyAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGFwdGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+TG9hZHMgdGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWVkIFhNTCByZXNvdXJjZS4gVGhlIFhNTCBkZWZpbml0aW9uIG9mCisgICAgICogdGhlIGFkYXB0ZXIgbXVzdCBmb2xsb3cgdGhlIGZvcm1hdCBkZWZpbml0aW9uIG9mIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGFkYXB0ZXIKKyAgICAgKiB0eXBlcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHBhZ2UuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgdGhlIGxvYWRlZCBhZGFwdGVyIGlzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXJ9CisgICAgICogYW5kIHRoZSBzdXBwbGllZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IGlzIGFuIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sCisgICAgICogdGhlIGN1cnNvciByZXR1cm5lZCBieSB0aGUgY29udGVudCBwcm92aWRlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgbWFuYWdlZC4gT3RoZXJ3aXNlLAorICAgICAqIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBjdXJzb3IgeW91cnNlbGYuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGxvYWQgdGhlIFhNTCByZXNvdXJjZSBmcm9tLgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgWE1MIHJlc291cmNlIGRlY2xhcmluZyB0aGUgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogIAorICAgICAqIEByZXR1cm4gQW4gYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNsb2FkQ3Vyc29yQWRhcHRlcihhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgaW50LCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvciwgT2JqZWN0W10pIAorICAgICAqIEBzZWUgI2xvYWRDdXJzb3JBZGFwdGVyKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBpbnQsIFN0cmluZywgT2JqZWN0W10pIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzZUFkYXB0ZXIgbG9hZEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgaWQsIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIEJhc2VBZGFwdGVyIGFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjb250ZXh0LCBpZCwgbnVsbCwgcGFyYW1ldGVycyk7CisgICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgTWFuYWdlZEFkYXB0ZXIpIHsKKyAgICAgICAgICAgICgoTWFuYWdlZEFkYXB0ZXIpIGFkYXB0ZXIpLmxvYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhbiBhZGFwdGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgcmVzb3VyY2UuIFRoZSBvcHRpb25hbCBhc3NlcnROYW1lIGNhbgorICAgICAqIGJlIHVzZWQgdG8gZXhpdCBlYXJseSBpZiB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHRoZSBYTUwgcmVzb3VyY2UgaXMgbm90IG9mIHRoZQorICAgICAqIGV4cGVjdGVkIHR5cGUuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGlkIFRoZSByZXNvdXJjZSBpZCBvZiB0aGUgWE1MIGRvY3VtZW50IGRlZmluaW5nIHRoZSBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBhc3NlcnROYW1lIFRoZSBtYW5kYXRvcnkgbmFtZSBvZiB0aGUgYWRhcHRlciBpbiB0aGUgWE1MIGRvY3VtZW50LgorICAgICAqICAgICAgICBJZ25vcmVkIGlmIG51bGwuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgT3B0aW9uYWwgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGFkYXB0ZXIuCisgICAgICogCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJhc2VBZGFwdGVyIGxvYWRBZGFwdGVyKENvbnRleHQgY29udGV4dCwgaW50IGlkLCBTdHJpbmcgYXNzZXJ0TmFtZSwKKyAgICAgICAgICAgIE9iamVjdC4uLiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0WG1sKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRnJvbVhtbChjb250ZXh0LCBwYXJzZXIsIFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpLAorICAgICAgICAgICAgICAgICAgICBpZCwgcGFyYW1ldGVycywgYXNzZXJ0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBybmYgPSBuZXcgUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgbG9hZCBhZGFwdGVyIHJlc291cmNlIElEICIgKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICBybmYuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IHJuZjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYWRhcHRlciB1c2luZyB0aGUgc3BlY2lmaWVkIFhNTCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCisgICAgICogZm9yIGNob29zaW5nIHRoZSB0eXBlIG9mIHRoZSBhZGFwdGVyIHRvIGNyZWF0ZSBiYXNlZCBvbiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBYTUwgcGFyc2VyLgorICAgICAqIAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYKKyAgICAgKiA8Y29kZT5hc3NlcnROYW1lPC9jb2RlPiBpcyBub3QgbnVsbCBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwKKyAgICAgKiBkb2N1bWVudC4gCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQmFzZUFkYXB0ZXIgY3JlYXRlQWRhcHRlckZyb21YbWwoQ29udGV4dCBjLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGlkLCBPYmplY3RbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgU3RyaW5nIGFzc2VydE5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQmFzZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBvbiBhIHN0YXJ0IHRhZy4KKyAgICAgICAgaW50IHR5cGU7CisgICAgICAgIGludCBkZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworCisgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChhc3NlcnROYW1lICE9IG51bGwgJiYgIWFzc2VydE5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFkYXB0ZXIgZGVmaW5lZCBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUoaWQpICsgIiBtdXN0IGJlIGEgPCIgKyBuYW1lICsgIiAvPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1IuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWRhcHRlciA9IGNyZWF0ZUN1cnNvckFkYXB0ZXIoYywgcGFyc2VyLCBhdHRycywgaWQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0ZXIgbmFtZSAiICsgcGFyc2VyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBjLmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKGlkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRhcHRlcjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gWG1sQ3Vyc29yQWRhcHRlciB1c2luZyBhbiBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFhtbEN1cnNvckFkYXB0ZXIgY3JlYXRlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAorICAgICAgICAgICAgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgaWQsIE9iamVjdFtdIHBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihjLCBwYXJzZXIsIGF0dHJzLCBpZCkucGFyc2UocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VyIHRoYXQgY2FuIGdlbmVyYXRlIFhtbEN1cnNvckFkYXB0ZXIgaW5zdGFuY2VzLiBUaGlzIHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBoYW5kbGluZyBhbGwgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkIG5vZGVzIGZvciBhICZsdDtjdXJzb3ItYWRhcHRlciAvJmd0Oy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyUGFyc2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0JJTkQgPSAiYmluZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9TRUxFQ1QgPSAic2VsZWN0IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX1NUUklORyA9ICJzdHJpbmciOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UgPSAiaW1hZ2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfQVNfVEFHID0gInRhZyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSX0NVUlNPUl9BU19JTUFHRV9VUkkgPSAiaW1hZ2UtdXJpIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX0FTX0RSQVdBQkxFID0gImRyYXdhYmxlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfQ1VSU09SX01BUCA9ICJtYXAiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9DVVJTT1JfVFJBTlNGT1JNID0gInRyYW5zZm9ybSI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFhtbFB1bGxQYXJzZXIgbVBhcnNlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVTZXQgbUF0dHJzOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtSWQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQ3Vyc29yQmluZGVyPiBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRnJvbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZWdlcj4gbVRvOworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvclRyYW5zZm9ybWF0aW9uIG1JZGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKworICAgICAgICBwdWJsaWMgWG1sQ3Vyc29yQWRhcHRlclBhcnNlcihDb250ZXh0IGMsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBpZCkgeworICAgICAgICAgICAgbUNvbnRleHQgPSBjOworICAgICAgICAgICAgbVBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgICAgIG1BdHRycyA9IGF0dHJzOworICAgICAgICAgICAgbUlkID0gaWQ7CisKKyAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIG1CaW5kZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+KCk7CisgICAgICAgICAgICBtRnJvbSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgbVRvID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICAgICAgbUlkZW50aXR5ID0gbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24obUNvbnRleHQpOyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEN1cnNvckFkYXB0ZXIgcGFyc2UoT2JqZWN0W10gcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLCBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXIpOworCisgICAgICAgICAgICBTdHJpbmcgdXJpID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3VyaSk7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NlbGVjdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgc29ydE9yZGVyID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX3NvcnRPcmRlcik7CisgICAgICAgICAgICBpbnQgbGF5b3V0ID0gYS5nZXRSZXNvdXJjZUlkKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9sYXlvdXQsIDApOworICAgICAgICAgICAgaWYgKGxheW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGxheW91dCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbVBhcnNlcjsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaW50IGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9UQUcgfHwgcGFyc2VyLmdldERlcHRoKCkgPiBkZXB0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKEFEQVBURVJfQ1VSU09SX0JJTkQuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlQmluZFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfU0VMRUNULmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZVNlbGVjdFRhZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRhZyBuYW1lICIgKyBwYXJzZXIuZ2V0TmFtZSgpICsgIiBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBmcm9tQXJyYXkgPSBtRnJvbS50b0FycmF5KG5ldyBTdHJpbmdbbUZyb20uc2l6ZSgpXSk7CisgICAgICAgICAgICBpbnRbXSB0b0FycmF5ID0gbmV3IGludFttVG8uc2l6ZSgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9BcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRvQXJyYXlbaV0gPSBtVG8uZ2V0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25BcmdzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3NbaV0gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxDdXJzb3JBZGFwdGVyKG1Db250ZXh0LCBsYXlvdXQsIHVyaSwgZnJvbUFycmF5LCB0b0FycmF5LCBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIHNvcnRPcmRlciwgbUJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0VGFnKCkgeworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbVJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfU2VsZWN0SXRlbV9jb2x1bW4pOworICAgICAgICAgICAgaWYgKGZyb21OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHNlbGVjdCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICdjb2x1bW4nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQoVmlldy5OT19JRCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcGFyc2VCaW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gcmVzb3VyY2VzLm9idGFpbkF0dHJpYnV0ZXMobUF0dHJzLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgZnJvbU5hbWUgPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfQmluZEl0ZW1fZnJvbSk7CisgICAgICAgICAgICBpZiAoZnJvbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbScgYXR0cmlidXRlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB0b05hbWUgPSBhLmdldFJlc291cmNlSWQoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX3RvLCAwKTsKKyAgICAgICAgICAgIGlmICh0b05hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYSAndG8nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYXNUeXBlID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX0JpbmRJdGVtX2FzKTsKKyAgICAgICAgICAgIGlmIChhc1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgYmluZCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiIGRvZXMgbm90IGhhdmUgYW4gJ2FzJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZyb20uYWRkKGZyb21OYW1lKTsKKyAgICAgICAgICAgIG1Uby5hZGQodG9OYW1lKTsKKyAgICAgICAgICAgIG1CaW5kZXJzLnB1dChmcm9tTmFtZSwgZmluZEJpbmRlcihhc1R5cGUpKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvckJpbmRlciBmaW5kQmluZGVyKFN0cmluZyB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBtUGFyc2VyOworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisgICAgICAgICAgICBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IG1JZGVudGl0eTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGU7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKTsKKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0RyYXdhYmxlID0gQURBUFRFUl9DVVJTT1JfQVNfRFJBV0FCTEUuZXF1YWxzKHR5cGUpOyAgICAgICAgICAgIAorCisgICAgICAgICAgICB3aGlsZSAoKCh0YWdUeXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8IHBhcnNlci5nZXREZXB0aCgpID4gZGVwdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHRhZ1R5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKworICAgICAgICAgICAgICAgIGlmICh0YWdUeXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChBREFQVEVSX0NVUlNPUl9UUkFOU0ZPUk0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uID0gZmluZFRyYW5zZm9ybWF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBREFQVEVSX0NVUlNPUl9NQVAuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHRyYW5zZm9ybWF0aW9uIGluc3RhbmNlb2YgTWFwVHJhbnNmb3JtYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiA9IG5ldyBNYXBUcmFuc2Zvcm1hdGlvbihjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5kTWFwKCgoTWFwVHJhbnNmb3JtYXRpb24pIHRyYW5zZm9ybWF0aW9uKSwgaXNEcmF3YWJsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGFnIG5hbWUgIiArIHBhcnNlci5nZXROYW1lKCkgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQURBUFRFUl9DVVJTT1JfQVNfU1RSSU5HLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfVEFHLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFnQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQURBUFRFUl9DVVJTT1JfQVNfSU1BR0UuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUJpbmRlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7ICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKEFEQVBURVJfQ1VSU09SX0FTX0lNQUdFX1VSSS5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlVXJpQmluZGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNEcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRHJhd2FibGVCaW5kZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGVyKHR5cGUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ3Vyc29yQmluZGVyIGNyZWF0ZUJpbmRlcihTdHJpbmcgdHlwZSwgQ3Vyc29yVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHR5cGUsIHRydWUsIG1Db250ZXh0LmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChDdXJzb3JCaW5kZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gYyA9IGtsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5jbGFzcywgQ3Vyc29yVHJhbnNmb3JtYXRpb24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEN1cnNvckJpbmRlcikgYy5uZXdJbnN0YW5jZShtQ29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgYmluZGVyIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIHR5cGUsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIGJpbmRlciB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyB0eXBlLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSBiaW5kZXIgdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgdHlwZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXAoTWFwVHJhbnNmb3JtYXRpb24gdHJhbnNmb3JtYXRpb24sIGJvb2xlYW4gZHJhd2FibGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlcyByZXNvdXJjZXMgPSBtUmVzb3VyY2VzOworCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhtQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtKTsKKworICAgICAgICAgICAgU3RyaW5nIGZyb20gPSBhLmdldFN0cmluZyhhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV9mcm9tVmFsdWUpOworICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAnZnJvbVZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkcmF3YWJsZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGEuZ2V0U3RyaW5nKGFuZHJvaWQuUi5zdHlsZWFibGUuQ3Vyc29yQWRhcHRlcl9NYXBJdGVtX3RvVmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0byA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgbWFwIGl0ZW0gaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgaGF2ZSBhICd0b1ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uYWRkU3RyaW5nTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB0byA9IGEuZ2V0UmVzb3VyY2VJZChhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfTWFwSXRlbV90b1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodG8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIG1hcCBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGhhdmUgYSAndG9WYWx1ZScgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLmFkZFJlc291cmNlTWFwcGluZyhmcm9tLCB0byk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGEucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmFuc2Zvcm1hdGlvbiBmaW5kVHJhbnNmb3JtYXRpb24oKSB7CisgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVJlc291cmNlczsKKyAgICAgICAgICAgIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHJlc291cmNlcy5vYnRhaW5BdHRyaWJ1dGVzKG1BdHRycywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW0pOworCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYS5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0eWxlYWJsZS5DdXJzb3JBZGFwdGVyX1RyYW5zZm9ybUl0ZW1fd2l0aENsYXNzKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGVhYmxlLkN1cnNvckFkYXB0ZXJfVHJhbnNmb3JtSXRlbV93aXRoRXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSBjcmVhdGVFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29udGV4dC5pc1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbUNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDdXJzb3JUcmFuc2Zvcm1hdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjID0ga2xhcy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbnRleHQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gPSAoQ3Vyc29yVHJhbnNmb3JtYXRpb24pIGMubmV3SW5zdGFuY2UobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW5jaWF0ZSB0cmFuc2Zvcm0gdHlwZSBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFJlc291cmNlRW50cnlOYW1lKG1JZCkgKyAiOiAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbmNpYXRlIHRyYW5zZm9ybSB0eXBlIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICI6ICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgaW5zdGFuY2lhdGUgdHJhbnNmb3JtIHR5cGUgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZUVudHJ5TmFtZShtSWQpICsgIjogIiArIGNsYXNzTmFtZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBIHRyYW5zZm9ybSBpdGVtIGluICIgKworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0UmVzb3VyY2VFbnRyeU5hbWUobUlkKSArICIgbXVzdCBoYXZlIGEgJ3dpdGhDbGFzcycgb3IgIiArCisgICAgICAgICAgICAgICAgICAgICInd2l0aEV4cHJlc3Npb24nIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEN1cnNvclRyYW5zZm9ybWF0aW9uIGNyZWF0ZUV4cHJlc3Npb25UcmFuc2Zvcm1hdGlvbihTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24obUNvbnRleHQsIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgYWRhcHRlcnMgdGhhdCByZXF1aXJlIHRvIGJlIGxvYWRlZCBhZnRlciBjcmVhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWFuYWdlZEFkYXB0ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogTG9hZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGFkYXB0ZXIsIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2FkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYSBDdXJzb3IgYWRhcHRlciBkZWZpbmVkIGluIFhNTC4gVGhpcyBjbGFzcyBpcyBhIHRoaW4gd3JhcHBlcgorICAgICAqIG9mIGEgU2ltcGxlQ3Vyc29yQWRhcHRlci4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGUgYWJpbGl0eSB0byBoYW5kbGUgQ3Vyc29yQmluZGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBYbWxDdXJzb3JBZGFwdGVyIGV4dGVuZHMgU2ltcGxlQ3Vyc29yQWRhcHRlciBpbXBsZW1lbnRzIE1hbmFnZWRBZGFwdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlbGVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtU2VsZWN0aW9uQXJnczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNvcnRPcmRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtQ29sdW1uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3JCaW5kZXJbXSBtQmluZGVyczsKKyAgICAgICAgcHJpdmF0ZSBBc3luY1Rhc2s8Vm9pZCxWb2lkLEN1cnNvcj4gbUxvYWRUYXNrOworCisgICAgICAgIFhtbEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgbGF5b3V0LCBTdHJpbmcgdXJpLCBTdHJpbmdbXSBmcm9tLCBpbnRbXSB0bywKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgc29ydE9yZGVyLAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDdXJzb3JCaW5kZXI+IGJpbmRlcnMpIHsKKworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbGF5b3V0LCBudWxsLCBmcm9tLCB0byk7CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICAgICAgbVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgICAgIG1TZWxlY3Rpb25BcmdzID0gc2VsZWN0aW9uQXJnczsKKyAgICAgICAgICAgIG1Tb3J0T3JkZXIgPSBzb3J0T3JkZXI7CisgICAgICAgICAgICBtQ29sdW1ucyA9IG5ldyBTdHJpbmdbZnJvbS5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbWFuZGF0b3J5IGluIEN1cnNvckFkYXB0ZXIKKyAgICAgICAgICAgIG1Db2x1bW5zWzBdID0gIl9pZCI7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZyb20sIDAsIG1Db2x1bW5zLCAxLCBmcm9tLmxlbmd0aCk7CisKKyAgICAgICAgICAgIEN1cnNvckJpbmRlciBiYXNpYyA9IG5ldyBTdHJpbmdCaW5kZXIoY29udGV4dCwgbmV3IElkZW50aXR5VHJhbnNmb3JtYXRpb24oY29udGV4dCkpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZnJvbS5sZW5ndGg7CisgICAgICAgICAgICBtQmluZGVycyA9IG5ldyBDdXJzb3JCaW5kZXJbY291bnRdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDdXJzb3JCaW5kZXIgYmluZGVyID0gYmluZGVycy5nZXQoZnJvbVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSBiaW5kZXIgPSBiYXNpYzsKKyAgICAgICAgICAgICAgICBtQmluZGVyc1tpXSA9IGJpbmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kVmlldyhWaWV3IHZpZXcsIENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVRvLmxlbmd0aDsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIGZyb20gPSBtRnJvbTsKKyAgICAgICAgICAgIGZpbmFsIGludFtdIHRvID0gbVRvOworICAgICAgICAgICAgZmluYWwgQ3Vyc29yQmluZGVyW10gYmluZGVycyA9IG1CaW5kZXJzOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHYgPSB2aWV3LmZpbmRWaWV3QnlJZCh0b1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kZXJzW2ldLmJpbmQodiwgY3Vyc29yLCBmcm9tW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgeworICAgICAgICAgICAgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2FkVGFzayA9IG5ldyBRdWVyeVRhc2soKS5leGVjdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBtVXJpID0gdXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZUN1cnNvcihDdXJzb3IgYykgeworICAgICAgICAgICAgaWYgKG1Mb2FkVGFzayAhPSBudWxsICYmIG1Mb2FkVGFzay5nZXRTdGF0dXMoKSAhPSBRdWVyeVRhc2suU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgbUxvYWRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9hZFRhc2sgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgUXVlcnlUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEN1cnNvcj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ3Vyc29yIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQWN0aXZpdHkpIG1Db250ZXh0KS5tYW5hZ2VkUXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpLnBhcnNlKG1VcmkpLCBtQ29sdW1ucywgbVNlbGVjdGlvbiwgbVNlbGVjdGlvbkFyZ3MsIG1Tb3J0T3JkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmkucGFyc2UobVVyaSksIG1Db2x1bW5zLCBtU2VsZWN0aW9uLCBtU2VsZWN0aW9uQXJncywgbVNvcnRPcmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICAgICAgICAgIGlmICghaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBYbWxDdXJzb3JBZGFwdGVyLnN1cGVyLmNoYW5nZUN1cnNvcihjdXJzb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElkZW50aXR5IHRyYW5zZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGFzIGEgU3RyaW5nLAorICAgICAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgbWFuaXB1bGF0aW9uLiBUaGlzIGlzIHVzZWQgd2hlbiBubyB0cmFuc2Zvcm1hdGlvbiBpcyBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRlbnRpdHlUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEN1cnNvclRyYW5zZm9ybWF0aW9uIHsKKyAgICAgICAgcHVibGljIElkZW50aXR5VHJhbnNmb3JtYXRpb24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24gaXMgYSBzaW1wbGUgdGVtcGxhdGUgYmFzZWQgcmVwbGFjZW1lbnQgdXRpbGl0eS4KKyAgICAgKiBJbiBhbiBleHByZXNzaW9uLCBlYWNoIHNlZ21lbnQgb2YgdGhlIGZvcm0gPGNvZGU+eyhbXn1dKyl9PC9jb2RlPiBpcyByZXBsYWNlZAorICAgICAqIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gb2YgbmFtZSAkMS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeHByZXNzaW9uVHJhbnNmb3JtYXRpb24gZXh0ZW5kcyBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbk5vZGUgbUZpcnN0Tm9kZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKCIiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1CdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwdWJsaWMgRXhwcmVzc2lvblRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCwgU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworCisgICAgICAgICAgICBwYXJzZShleHByZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICBpbnQgc2VnbWVudFN0YXJ0OworICAgICAgICAgICAgaW50IGNvdW50ID0gZXhwcmVzc2lvbi5sZW5ndGgoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYSBjb2x1bW4gbmFtZSBzZWdtZW50CisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjb3VudCAmJiAoYyA9IGV4cHJlc3Npb24uY2hhckF0KGkpKSAhPSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQsIGJ1dCB0aGUgZXhwcmVzc2lvbiBkaWRuJ3QgY2xvc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdHJhbnNmb3JtIGV4cHJlc3Npb24gY29udGFpbnMgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1jbG9zZWQgY29sdW1uIG5hbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLnN1YnN0cmluZyhzZWdtZW50U3RhcnQgKyAxLCBpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3IENvbHVtbkV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCArIDEsIGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNvdW50ICYmIChjID0gZXhwcmVzc2lvbi5jaGFyQXQoaSkpICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dCA9IG5ldyBDb25zdGFudEV4cHJlc3Npb25Ob2RlKGV4cHJlc3Npb24uc3Vic3RyaW5nKHNlZ21lbnRTdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgaWYgd2UndmUgcmVhY2hlZCBhIGNvbHVtbiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgaS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbUJ1aWxkZXI7CisgICAgICAgICAgICBidWlsZGVyLmRlbGV0ZSgwLCBidWlsZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgRXhwcmVzc2lvbk5vZGUgbm9kZSA9IG1GaXJzdE5vZGU7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBub2RlCisgICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChub2RlLmFzU3RyaW5nKGN1cnNvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHB1YmxpYyBFeHByZXNzaW9uTm9kZSBuZXh0OworCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbk5vZGUgZXh0ZW5kcyBFeHByZXNzaW9uTm9kZSB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ29uc3RhbnQ7CisKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbk5vZGUoU3RyaW5nIGNvbnN0YW50KSB7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50ID0gY29uc3RhbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhc1N0cmluZyhDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBDb2x1bW5FeHByZXNzaW9uTm9kZSBleHRlbmRzIEV4cHJlc3Npb25Ob2RlIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db2x1bW5OYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBDdXJzb3IgbVNpZ25hdHVyZTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1Db2x1bW5JbmRleCA9IC0xOworCisgICAgICAgICAgICBDb2x1bW5FeHByZXNzaW9uTm9kZShTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgICAgIG1Db2x1bW5OYW1lID0gY29sdW1uTmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFzU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG1TaWduYXR1cmUgfHwgbUNvbHVtbkluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2x1bW5JbmRleCA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChtQ29sdW1uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYXR1cmUgPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcobUNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWFwIHRyYW5zZm9ybWF0aW9uIG9mZmVycyBhIHNpbXBsZSBtYXBwaW5nIGJldHdlZW4gc3BlY2lmaWVkIFN0cmluZyB2YWx1ZXMKKyAgICAgKiB0byBTdHJpbmdzIG9yIGludGVnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFRyYW5zZm9ybWF0aW9uIGV4dGVuZHMgQ3Vyc29yVHJhbnNmb3JtYXRpb24geworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1TdHJpbmdNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gbVJlc291cmNlTWFwcGluZ3M7CisKKyAgICAgICAgcHVibGljIE1hcFRyYW5zZm9ybWF0aW9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtU3RyaW5nTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1SZXNvdXJjZU1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRTdHJpbmdNYXBwaW5nKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKyAgICAgICAgICAgIG1TdHJpbmdNYXBwaW5ncy5wdXQoZnJvbSwgdG8pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhZGRSZXNvdXJjZU1hcHBpbmcoU3RyaW5nIGZyb20sIGludCB0bykgeworICAgICAgICAgICAgbVJlc291cmNlTWFwcGluZ3MucHV0KGZyb20sIHRvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGN1cnNvci5nZXRTdHJpbmcoY29sdW1uSW5kZXgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRyYW5zZm9ybWVkID0gbVN0cmluZ01hcHBpbmdzLmdldCh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQgPT0gbnVsbCA/IHZhbHVlIDogdHJhbnNmb3JtZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2Zvcm1Ub1Jlc291cmNlKEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHRyYW5zZm9ybWVkID0gbVJlc291cmNlTWFwcGluZ3MuZ2V0KHZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkID09IG51bGwgPyBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSA6IHRyYW5zZm9ybWVkOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgU3RyaW5nIHRvIGEgVGV4dFZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBUZXh0VmlldykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMgYW4gaW1hZ2UgYmxvYiB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBjdXJzb3IuZ2V0QmxvYihjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlQml0bWFwKEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxlbmd0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnQmluZGVyIGV4dGVuZHMgQ3Vyc29yQmluZGVyIHsKKyAgICAgICAgcHVibGljIFRhZ0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChWaWV3IHZpZXcsIEN1cnNvciBjdXJzb3IsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBtVHJhbnNmb3JtYXRpb24udHJhbnNmb3JtKGN1cnNvciwgY29sdW1uSW5kZXgpOworICAgICAgICAgICAgdmlldy5zZXRUYWcodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIGltYWdlIFVSSSB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VVcmlCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgSW1hZ2VVcmlCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIHZpZXcpLnNldEltYWdlVVJJKFVyaS5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1hdGlvbi50cmFuc2Zvcm0oY3Vyc29yLCBjb2x1bW5JbmRleCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgZHJhd2FibGUgcmVzb3VyY2UgaWRlbnRpZmllciB0byBhbiBJbWFnZVZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHJhd2FibGVCaW5kZXIgZXh0ZW5kcyBDdXJzb3JCaW5kZXIgeworICAgICAgICBwdWJsaWMgRHJhd2FibGVCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgdHJhbnNmb3JtYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoVmlldyB2aWV3LCBDdXJzb3IgY3Vyc29yLCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybVRvUmVzb3VyY2UoY3Vyc29yLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IDApIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3KS5zZXRJbWFnZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcnJheUFkYXB0ZXIuamF2YQppbmRleCAwM2FkYTk0Li5iNGVjZTI0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXJyYXlBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FycmF5QWRhcHRlci5qYXZhCkBAIC0zMCwxNyArMzAsMTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiAKIC8qKgotICogQSBMaXN0QWRhcHRlciB0aGF0IG1hbmFnZXMgYSBMaXN0VmlldyBiYWNrZWQgYnkgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5CisgKiBBIGNvbmNyZXRlIEJhc2VBZGFwdGVyIHRoYXQgaXMgYmFja2VkIGJ5IGFuIGFycmF5IG9mIGFyYml0cmFyeQogICogb2JqZWN0cy4gIEJ5IGRlZmF1bHQgdGhpcyBjbGFzcyBleHBlY3RzIHRoYXQgdGhlIHByb3ZpZGVkIHJlc291cmNlIGlkIHJlZmVyZW5jZXMKICAqIGEgc2luZ2xlIFRleHRWaWV3LiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgbW9yZSBjb21wbGV4IGxheW91dCwgdXNlIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdAogICogYWxzbyB0YWtlcyBhIGZpZWxkIGlkLiAgVGhhdCBmaWVsZCBpZCBzaG91bGQgcmVmZXJlbmNlIGEgVGV4dFZpZXcgaW4gdGhlIGxhcmdlciBsYXlvdXQKICAqIHJlc291cmNlLgogICoKLSAqIEhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KKyAqIDxwPkhvd2V2ZXIgdGhlIFRleHRWaWV3IGlzIHJlZmVyZW5jZWQsIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgZWFjaCBvYmplY3QgaW4KICAqIHRoZSBhcnJheS4gWW91IGNhbiBhZGQgbGlzdHMgb3IgYXJyYXlzIG9mIGN1c3RvbSBvYmplY3RzLiBPdmVycmlkZSB0aGUgdG9TdHJpbmcoKSBtZXRob2QKICAqIG9mIHlvdXIgb2JqZWN0cyB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkIGZvciB0aGUgaXRlbSBpbiB0aGUgbGlzdC4KICAqCi0gKiBUbyB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gVGV4dFZpZXdzIGZvciB0aGUgYXJyYXkgZGlzcGxheSwgZm9yIGluc3RhbmNlLCBJbWFnZVZpZXdzLAorICogPHA+VG8gdXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIFRleHRWaWV3cyBmb3IgdGhlIGFycmF5IGRpc3BsYXksIGZvciBpbnN0YW5jZSwgSW1hZ2VWaWV3cywKICAqIG9yIHRvIGhhdmUgc29tZSBvZiBkYXRhIGJlc2lkZXMgdG9TdHJpbmcoKSByZXN1bHRzIGZpbGwgdGhlIHZpZXdzLAogICogb3ZlcnJpZGUge0BsaW5rICNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKX0gdG8gcmV0dXJuIHRoZSB0eXBlIG9mIHZpZXcgeW91IHdhbnQuCiAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BdXRvQ29tcGxldGVUZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKaW5kZXggMzk3MTQ4Ny4uZTA3YmVmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0F1dG9Db21wbGV0ZVRleHRWaWV3LmphdmEKQEAgLTI5LDEzICsyOSwxMiBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIApAQCAtOTMsNDUgKzkyLDIxIEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRvQ29tcGxldGVUZXh0VmlldyI7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9WSUVXX0lEID0gMHgxNzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKLSAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAotICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOwotCiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbUhpbnRUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbUhpbnRWaWV3OwogICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CiAKICAgICBwcml2YXRlIExpc3RBZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgRmlsdGVyIG1GaWx0ZXI7CiAgICAgcHJpdmF0ZSBpbnQgbVRocmVzaG9sZDsKIAotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOwotICAgIHByaXZhdGUgRHJvcERvd25MaXN0VmlldyBtRHJvcERvd25MaXN0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OwotICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOwogICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkFuY2hvcklkOwotICAgIHByaXZhdGUgVmlldyBtRHJvcERvd25BbmNob3JWaWV3OyAgLy8gdmlldyBpcyByZXRyaWV2ZWQgbGF6aWx5IGZyb20gaWQgb25jZSBuZWVkZWQKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQ7CiAKICAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbUl0ZW1DbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKLSAgICBwcml2YXRlIGZpbmFsIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgbURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZmFsc2U7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGludCBtTGFzdEtleUNvZGUgPSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV047CiAgICAgcHJpdmF0ZSBib29sZWFuIG1PcGVuQmVmb3JlOwpAQCAtMTQwLDEwICsxMTUsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1CbG9ja0NvbXBsZXRpb247CiAKLSAgICBwcml2YXRlIExpc3RTZWxlY3RvckhpZGVyIG1IaWRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7Ci0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7Ci0KICAgICBwcml2YXRlIFBhc3NUaHJvdWdoQ2xpY2tMaXN0ZW5lciBtUGFzc1Rocm91Z2hDbGlja0xpc3RlbmVyOwogICAgIHByaXZhdGUgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgbU9ic2VydmVyOwogCkBAIC0xNTgsOSArMTI5LDEwIEBACiAgICAgcHVibGljIEF1dG9Db21wbGV0ZVRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAotICAgICAgICBtUG9wdXAgPSBuZXcgUG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCisgICAgICAgIG1Qb3B1cCA9IG5ldyBMaXN0UG9wdXBXaW5kb3coY29udGV4dCwgYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmF1dG9Db21wbGV0ZVRleHRWaWV3U3R5bGUpOwogICAgICAgICBtUG9wdXAuc2V0U29mdElucHV0TW9kZShXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5TT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpOworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0UG9zaXRpb24oTGlzdFBvcHVwV2luZG93LlBPU0lUSU9OX1BST01QVF9CRUxPVyk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKQEAgLTE2OSwxNCArMTQxLDExIEBACiAgICAgICAgIG1UaHJlc2hvbGQgPSBhLmdldEludCgKICAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19jb21wbGV0aW9uVGhyZXNob2xkLCAyKTsKIAotICAgICAgICBtSGludFRleHQgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpOwotCi0gICAgICAgIG1Ecm9wRG93bkxpc3RIaWdobGlnaHQgPSBhLmdldERyYXdhYmxlKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duU2VsZWN0b3IpOwotICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCA9IChpbnQpCi0gICAgICAgICAgICAgICAgYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25WZXJ0aWNhbE9mZnNldCwgMC4wZik7Ci0gICAgICAgIG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQgPSAoaW50KQotICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgMC4wZik7CisgICAgICAgIG1Qb3B1cC5zZXRMaXN0U2VsZWN0b3IoYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93blNlbGVjdG9yKSk7CisgICAgICAgIG1Qb3B1cC5zZXRWZXJ0aWNhbE9mZnNldCgoaW50KQorICAgICAgICAgICAgICAgIGEuZ2V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDAuMGYpKTsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoKGludCkKKyAgICAgICAgICAgICAgICBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDAuMGYpKTsKICAgICAgICAgCiAgICAgICAgIC8vIEdldCB0aGUgYW5jaG9yJ3MgaWQgbm93LCBidXQgdGhlIHZpZXcgd29uJ3QgYmUgcmVhZHksIHNvIHdhaXQgdG8gYWN0dWFsbHkgZ2V0IHRoZQogICAgICAgICAvLyB2aWV3IGFuZCBzdG9yZSBpdCBpbiBtRHJvcERvd25BbmNob3JWaWV3IGxhemlseSBpbiBnZXREcm9wRG93bkFuY2hvclZpZXcgbGF0ZXIuCkBAIC0xODcsMTMgKzE1NiwxOCBAQAogICAgICAgICAKICAgICAgICAgLy8gRm9yIGRyb3Bkb3duIHdpZHRoLCB0aGUgZGV2ZWxvcGVyIGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgd2lkdGgsIG9yIE1BVENIX1BBUkVOVAogICAgICAgICAvLyAoZm9yIGZ1bGwgc2NyZWVuIHdpZHRoKSBvciBXUkFQX0NPTlRFTlQgKHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgYW5jaG9yZWQgdmlldykuCi0gICAgICAgIG1Ecm9wRG93bldpZHRoID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25XaWR0aCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGEuZ2V0TGF5b3V0RGltZW5zaW9uKFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duSGVpZ2h0LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgbVBvcHVwLnNldFdpZHRoKGEuZ2V0TGF5b3V0RGltZW5zaW9uKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLkF1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpKTsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChhLmdldExheW91dERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5BdXRvQ29tcGxldGVUZXh0Vmlld19kcm9wRG93bkhlaWdodCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwogCiAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnRWaWV3LAogICAgICAgICAgICAgICAgIFIubGF5b3V0LnNpbXBsZV9kcm9wZG93bl9oaW50KTsKKyAgICAgICAgCisgICAgICAgIG1Qb3B1cC5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBEcm9wRG93bkl0ZW1DbGlja0xpc3RlbmVyKCkpOworICAgICAgICBzZXRDb21wbGV0aW9uSGludChhLmdldFRleHQoUi5zdHlsZWFibGUuQXV0b0NvbXBsZXRlVGV4dFZpZXdfY29tcGxldGlvbkhpbnQpKTsKIAogICAgICAgICAvLyBBbHdheXMgdHVybiBvbiB0aGUgYXV0byBjb21wbGV0ZSBpbnB1dCB0eXBlIGZsYWcsIHNpbmNlIGl0CiAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGlzIHdpZGdldCB3aXRob3V0IGl0LgpAQCAtMjQxLDYgKzIxNSwyMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbXBsZXRpb25IaW50KENoYXJTZXF1ZW5jZSBoaW50KSB7CiAgICAgICAgIG1IaW50VGV4dCA9IGhpbnQ7CisgICAgICAgIGlmIChoaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtSGludFZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5zZXRUZXh0KG1IaW50VGV4dCk7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3ID0gaGludFZpZXc7CisgICAgICAgICAgICAgICAgbVBvcHVwLnNldFByb21wdFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGludFZpZXcuc2V0VGV4dChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRQcm9tcHRWaWV3KG51bGwpOworICAgICAgICAgICAgbUhpbnRWaWV3ID0gbnVsbDsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI1Myw3ICsyNDEsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRXaWR0aCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTI2Niw3ICsyNTQsNyBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0F1dG9Db21wbGV0ZVRleHRWaWV3X2Ryb3BEb3duV2lkdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bldpZHRoKGludCB3aWR0aCkgewotICAgICAgICBtRHJvcERvd25XaWR0aCA9IHdpZHRoOworICAgICAgICBtUG9wdXAuc2V0V2lkdGgod2lkdGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDcgKzI2OCw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSGVpZ2h0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhlaWdodCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjk0LDcgKzI4Miw3IEBACiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQXV0b0NvbXBsZXRlVGV4dFZpZXdfZHJvcERvd25IZWlnaHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREcm9wRG93bkhlaWdodChpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVBvcHVwLnNldEhlaWdodChoZWlnaHQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTMxOSw3ICszMDcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQW5jaG9yKGludCBpZCkgewogICAgICAgICBtRHJvcERvd25BbmNob3JJZCA9IGlkOwotICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gbnVsbDsKKyAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobnVsbCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzYxLDcgKzM0OSw3IEBACiAgICAgICogQHBhcmFtIG9mZnNldCB0aGUgdmVydGljYWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25WZXJ0aWNhbE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtUG9wdXAuc2V0VmVydGljYWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNzAsNyArMzU4LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERyb3BEb3duVmVydGljYWxPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25WZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRWZXJ0aWNhbE9mZnNldCgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTM3OSw3ICszNjcsNyBAQAogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGhvcml6b250YWwgb2Zmc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKLSAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbVBvcHVwLnNldEhvcml6b250YWxPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zODgsNyArMzc2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBob3Jpem9udGFsIG9mZnNldAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRIb3Jpem9udGFsT2Zmc2V0KCk7CiAgICAgfQogCiAgICAgIC8qKgpAQCAtNDI1LDcgKzQxMyw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbURyb3BEb3duQWx3YXlzVmlzaWJsZTsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQyLDcgKzQzMCw3IEBACiAgICAgICogQGhpZGUgUGVuZGluZyBBUEkgY291bmNpbCBhcHByb3ZhbAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgICAgICBtUG9wdXAuc2V0RHJvcERvd25BbHdheXNWaXNpYmxlKGRyb3BEb3duQWx3YXlzVmlzaWJsZSk7CiAgICAgfQogICAgCiAgICAgLyoqCkBAIC02MDksMTUgKzU5NywxMyBAQAogICAgICAgICAgICAgbUZpbHRlciA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVByZUltZShpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLICYmIGlzUG9wdXBTaG93aW5nKCkKLSAgICAgICAgICAgICAgICAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CiAgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTiAmJiBldmVudC5nZXRSZXBlYXRDb3VudCgpID09IDApIHsKQEAgLTYzNiwxOCArNjIyLDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSAmJiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkgPj0gMCkgewotICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZCA9IG1Ecm9wRG93bkxpc3Qub25LZXlVcChrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3QgYWNjZXB0cyB0aGUga2V5IGV2ZW50cyBhbmQgdGhlIGtleSBldmVudAotICAgICAgICAgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRyb3AgZG93biBhcyBpdHMgY29udGVudAotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1Db21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBtUG9wdXAub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAvLyB3YXMgYSBjbGljaywgdGhlIHRleHQgdmlldyBnZXRzIHRoZSBzZWxlY3RlZCBpdGVtCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkcm9wIGRvd24gYXMgaXRzIGNvbnRlbnQKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKQEAgLTY1NSw4NyArNjM5LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIC8vIHdoZW4gdGhlIGRyb3AgZG93biBpcyBzaG93biwgd2UgZHJpdmUgaXQgZGlyZWN0bHkKLSAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3Ci0gICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgotICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0Ci0gICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAotICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKLSAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KLSAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBpcyBkZWNsYXJlZAotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3VtZWQgPSBtRHJvcERvd25MaXN0Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJLZXkgZG93bjogY29kZT0iICsga2V5Q29kZSArICIgbGlzdCBjb25zdW1lZD0iICsgY29uc3VtZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhbmRsZWQgdGhlIGtleSBldmVudCwgdGhlbiB0aGUgdXNlciBpcwotICAgICAgICAgICAgICAgICAgICAvLyBuYXZpZ2F0aW5nIGluIHRoZSBsaXN0LCBzbyB3ZSBzaG91bGQgcHV0IGl0IGluIGZyb250LgotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSdzIGEgbGl0dGxlIHRyaWNrIHdlIG5lZWQgdG8gZG8gdG8gbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpc3QgdmlldyBpcyBhY3R1YWxseSBzaG93aW5nIGl0cyBmb2N1cyBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGVuc3VyaW5nIGl0IGhhcyBmb2N1cyBhbmQgZ2V0dGluZyBpdHMgd2luZG93IG91dAotICAgICAgICAgICAgICAgICAgICAvLyBvZiB0b3VjaCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnJlcXVlc3RGb2N1c0Zyb21Ub3VjaCgpOwotICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIHBhc3NpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHRleHQgdmlldyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBib3R0b20sIHdlIGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gYXZvaWQgZ29pbmcgdG8gdGhlIG5leHQgZm9jdXNhYmxlIHdpZGdldAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckluZGV4ID09IGxhc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW5kZXggPT0gZmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Qb3B1cC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSkgewogICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKICAgICAgICAgICAgICAgICBwZXJmb3JtVmFsaWRhdGlvbigpOwpAQCAtNzQ2LDcgKzY1NCw3IEBACiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CiAgICAgICAgIG1MYXN0S2V5Q29kZSA9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTjsKIAotICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICBpZiAoaGFuZGxlZCAmJiBpc1BvcHVwU2hvd2luZygpKSB7CiAgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICAgICAgfQogCkBAIC04MDcsMTEgKzcxNSwxMiBAQAogICAgICAgICBpZiAoZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKG1GaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1GaWx0ZXJpbmcoZ2V0VGV4dCgpLCBtTGFzdEtleUNvZGUpOworICAgICAgICAgICAgICAgIGJ1aWxkSW1lQ29tcGxldGlvbnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRyb3AgZG93biBpcyBhdXRvbWF0aWNhbGx5IGRpc21pc3NlZCB3aGVuIGVub3VnaCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAvLyBhcmUgZGVsZXRlZCBmcm9tIHRoZSB0ZXh0IHZpZXcKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgZGlzbWlzc0Ryb3BEb3duKCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpKSBkaXNtaXNzRHJvcERvd24oKTsKICAgICAgICAgICAgIGlmIChtRmlsdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsdGVyLmZpbHRlcihudWxsKTsKICAgICAgICAgICAgIH0KQEAgLTg0NCwxMyArNzUzLDcgQEAKICAgICAgKiBpdCBiYWNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdFNlbGVjdGlvbigpIHsKLSAgICAgICAgZmluYWwgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIGxpc3QubUxpc3RTZWxlY3Rpb25IaWRkZW4gPSB0cnVlOwotICAgICAgICAgICAgbGlzdC5oaWRlU2VsZWN0b3IoKTsKLSAgICAgICAgICAgIGxpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb3B1cC5jbGVhckxpc3RTZWxlY3Rpb24oKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC04NTksMTEgKzc2Miw3IEBACiAgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRoZSBzZWxlY3RvciB0by4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0Lm1MaXN0U2VsZWN0aW9uSGlkZGVuID0gZmFsc2U7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAvLyBMaXN0Vmlldy5zZXRTZWxlY3Rpb24oKSB3aWxsIGNhbGwgcmVxdWVzdExheW91dCgpCi0gICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NzcsMTAgKzc3Niw3IEBACiAgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRMaXN0U2VsZWN0aW9uKCkgewotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpICYmIChtRHJvcERvd25MaXN0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURyb3BEb3duTGlzdC5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTQsMTMgKzgxMCw3IEBACiAgICAgICAgICAgICByZXBsYWNlVGV4dChjb21wbGV0aW9uLmdldFRleHQoKSk7CiAgICAgICAgICAgICBtQmxvY2tDb21wbGV0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBWaWV3IGhlcmUsIHNvIHdlIHdpbGwgbmVlZCB0bwotICAgICAgICAgICAgICAgIC8vIHN1cHBseSBudWxsLiAgSG9wZWZ1bGx5IG5vIGV4aXN0aW5nIGFwcHMgY3Jhc2guLi4KLSAgICAgICAgICAgICAgICBtSXRlbUNsaWNrTGlzdGVuZXIub25JdGVtQ2xpY2sobGlzdCwgbnVsbCwgY29tcGxldGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cC5wZXJmb3JtSXRlbUNsaWNrKGNvbXBsZXRpb24uZ2V0UG9zaXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyOCw3ICs4MTgsNyBAQAogICAgICAgICBpZiAoaXNQb3B1cFNob3dpbmcoKSkgewogICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkSXRlbTsKICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IG1Qb3B1cC5nZXRTZWxlY3RlZEl0ZW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtID0gbUFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7CiAgICAgICAgICAgICB9CkBAIC05NDIsMTggKzgzMiwxOCBAQAogICAgICAgICAgICAgbUJsb2NrQ29tcGxldGlvbiA9IGZhbHNlOyAgICAgICAgICAgIAogCiAgICAgICAgICAgICBpZiAobUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RQb3B1cFdpbmRvdyBsaXN0ID0gbVBvcHVwOwogCiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmlldyA9PSBudWxsIHx8IHBvc2l0aW9uIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPSBsaXN0LmdldFNlbGVjdGVkVmlldygpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaWQgPSBsaXN0LmdldFNlbGVjdGVkSXRlbUlkKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBzZWxlY3RlZFZpZXcsIHBvc2l0aW9uLCBpZCk7CisgICAgICAgICAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyLm9uSXRlbUNsaWNrKGxpc3QuZ2V0TGlzdFZpZXcoKSwgc2VsZWN0ZWRWaWV3LCBwb3NpdGlvbiwgaWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Ecm9wRG93bkRpc21pc3NlZE9uQ29tcGxldGlvbiAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBpZiAobURyb3BEb3duRGlzbWlzc2VkT25Db21wbGV0aW9uICYmICFtUG9wdXAuaXNEcm9wRG93bkFsd2F5c1Zpc2libGUoKSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDAzLDcgKzg5Myw2IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvbkZpbHRlckNvbXBsZXRlKGludCBjb3VudCkgewogICAgICAgICB1cGRhdGVEcm9wRG93bkZvckZpbHRlcihjb3VudCk7Ci0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHJvcERvd25Gb3JGaWx0ZXIoaW50IGNvdW50KSB7CkBAIC0xMDE3LDExICs5MDYsMTIgQEAKICAgICAgICAgICogdG8gZmlsdGVyLgogICAgICAgICAgKi8KIAotICAgICAgICBpZiAoKGNvdW50ID4gMCB8fCBtRHJvcERvd25BbHdheXNWaXNpYmxlKSAmJiBlbm91Z2hUb0ZpbHRlcigpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZHJvcERvd25BbHdheXNWaXNpYmxlID0gbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCk7CisgICAgICAgIGlmICgoY291bnQgPiAwIHx8IGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgJiYgZW5vdWdoVG9GaWx0ZXIoKSkgewogICAgICAgICAgICAgaWYgKGhhc0ZvY3VzKCkgJiYgaGFzV2luZG93Rm9jdXMoKSkgewogICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIWRyb3BEb3duQWx3YXlzVmlzaWJsZSkgewogICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDI5LDcgKzkxOSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25XaW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBoYXNXaW5kb3dGb2N1cykgewogICAgICAgICBzdXBlci5vbldpbmRvd0ZvY3VzQ2hhbmdlZChoYXNXaW5kb3dGb2N1cyk7Ci0gICAgICAgIGlmICghaGFzV2luZG93Rm9jdXMgJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpIHsKKyAgICAgICAgaWYgKCFoYXNXaW5kb3dGb2N1cyAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAzOSw3ICs5MjksNyBAQAogICAgICAgICBzdXBlci5vbkRpc3BsYXlIaW50KGhpbnQpOwogICAgICAgICBzd2l0Y2ggKGhpbnQpIHsKICAgICAgICAgICAgIGNhc2UgSU5WSVNJQkxFOgotICAgICAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIGlmICghbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA1Myw3ICs5NDMsNyBAQAogICAgICAgICBpZiAoIWZvY3VzZWQpIHsKICAgICAgICAgICAgIHBlcmZvcm1WYWxpZGF0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb2N1c2VkICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKSB7CisgICAgICAgIGlmICghZm9jdXNlZCAmJiAhbVBvcHVwLmlzRHJvcERvd25BbHdheXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAgIGRpc21pc3NEcm9wRG93bigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA3OCw4ICs5NjgsNiBAQAogICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICBtUG9wdXAuZGlzbWlzcygpOwotICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7Ci0gICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTA5MiwxOCArOTgwLDYgQEAKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiA8cD5Vc2VkIGZvciBsYXp5IGluc3RhbnRpYXRpb24gb2YgdGhlIGFuY2hvciB2aWV3IGZyb20gdGhlIGlkIHdlIGhhdmUuIElmIHRoZSB2YWx1ZSBvZgotICAgICAqIHRoZSBpZCBpcyBOT19JRCBvciB3ZSBjYW4ndCBmaW5kIGEgdmlldyBmb3IgdGhlIGdpdmVuIGlkLCB3ZSByZXR1cm4gdGhpcyBUZXh0VmlldyBhcwotICAgICAqIHRoZSBkZWZhdWx0IGFuY2hvcmluZyBwb2ludC48L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBWaWV3IGdldERyb3BEb3duQW5jaG9yVmlldygpIHsKLSAgICAgICAgaWYgKG1Ecm9wRG93bkFuY2hvclZpZXcgPT0gbnVsbCAmJiBtRHJvcERvd25BbmNob3JJZCAhPSBWaWV3Lk5PX0lEKSB7Ci0gICAgICAgICAgICBtRHJvcERvd25BbmNob3JWaWV3ID0gZ2V0Um9vdFZpZXcoKS5maW5kVmlld0J5SWQobURyb3BEb3duQW5jaG9ySWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRHJvcERvd25BbmNob3JWaWV3ID09IG51bGwgPyB0aGlzIDogbURyb3BEb3duQW5jaG9yVmlldzsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBJc3N1ZXMgYSBydW5uYWJsZSB0byBzaG93IHRoZSBkcm9wZG93biBhcyBzb29uIGFzIHBvc3NpYmxlLgpAQCAtMTExMSw3ICs5ODcsNyBAQAogICAgICAqIEBoaWRlIGludGVybmFsIHVzZWQgb25seSBieSBTZWFyY2hEaWFsb2cKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzaG93RHJvcERvd25BZnRlckxheW91dCgpIHsKLSAgICAgICAgcG9zdChtU2hvd0Ryb3BEb3duUnVubmFibGUpOworICAgICAgICBtUG9wdXAucG9zdFNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMTIyLDcgKzk5OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5zdXJlSW1lVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZSh2aXNpYmxlCi0gICAgICAgICAgICAgICAgPyBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTkVFREVEIDogUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOworICAgICAgICAgICAgICAgID8gTGlzdFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQgOiBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQpOwogICAgICAgICBzaG93RHJvcERvd24oKTsKICAgICB9CiAKQEAgLTExMzAsODkgKzEwMDYsMjEgQEAKICAgICAgKiBAaGlkZSBpbnRlcm5hbCB1c2VkIG9ubHkgaGVyZSBhbmQgU2VhcmNoRGlhbG9nCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBMaXN0UG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogPHA+RGlzcGxheXMgdGhlIGRyb3AgZG93biBvbiBzY3JlZW4uPC9wPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNob3dEcm9wRG93bigpIHsKLSAgICAgICAgaW50IGhlaWdodCA9IGJ1aWxkRHJvcERvd24oKTsKLQotICAgICAgICBpbnQgd2lkdGhTcGVjID0gMDsKLSAgICAgICAgaW50IGhlaWdodFNwZWMgPSAwOwotCi0gICAgICAgIGJvb2xlYW4gbm9JbnB1dE1ldGhvZCA9IGlzSW5wdXRNZXRob2ROb3ROZWVkZWQoKTsKLQotICAgICAgICBpZiAobVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbCB0byBQb3B1cFdpbmRvdydzIHVwZGF0ZSBtZXRob2QgYmVsb3cgY2FuIGFjY2VwdCAtMSBmb3IgYW55Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgeW91IGRvIG5vdCB3YW50IHRvIHVwZGF0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSAtMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICBpZiAobVBvcHVwLmdldEFuY2hvclZpZXcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobURyb3BEb3duQW5jaG9ySWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KGdldFJvb3RWaWV3KCkuZmluZFZpZXdCeUlkKG1Ecm9wRG93bkFuY2hvcklkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IG1Ecm9wRG93bldpZHRoOworICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRBbmNob3JWaWV3KHRoaXMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gUG9wdXBXaW5kb3cncyB1cGRhdGUgbWV0aG9kIGJlbG93IGNhbiBhY2NlcHQgLTEgZm9yIGFueQotICAgICAgICAgICAgICAgIC8vIHZhbHVlIHlvdSBkbyBub3Qgd2FudCB0byB1cGRhdGUuCi0gICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG5vSW5wdXRNZXRob2QgPyBoZWlnaHQgOiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgICAgICBpZiAobm9JbnB1dE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaW5kb3dMYXlvdXRNb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gaGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWlnaHRTcGVjID0gbURyb3BEb3duSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9wdXAuc2V0T3V0c2lkZVRvdWNoYWJsZSghbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoICYmICFtRHJvcERvd25BbHdheXNWaXNpYmxlKTsKLQotICAgICAgICAgICAgbVBvcHVwLnVwZGF0ZShnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bldpZHRoID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRXaWR0aChnZXREcm9wRG93bkFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewotICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCi0gICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKLSAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOwotICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobmV3IFBvcHVwVG91Y2hJbnRlcmNlcHRvcigpKTsKLSAgICAgICAgICAgIG1Qb3B1cC5zaG93QXNEcm9wRG93bihnZXREcm9wRG93bkFuY2hvclZpZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7Ci0gICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgIHBvc3QobUhpZGVTZWxlY3Rvcik7CiAgICAgICAgIH0KKyAgICAgICAgbVBvcHVwLnNob3coKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xMjIzLDE5ICsxMDMxLDEwIEBACiAgICAgICogQGhpZGUgdXNlZCBvbmx5IGJ5IFNlYXJjaERpYWxvZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKGJvb2xlYW4gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2gpIHsKLSAgICAgICAgbUZvcmNlSWdub3JlT3V0c2lkZVRvdWNoID0gZm9yY2VJZ25vcmVPdXRzaWRlVG91Y2g7CisgICAgICAgIG1Qb3B1cC5zZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChmb3JjZUlnbm9yZU91dHNpZGVUb3VjaCk7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+QnVpbGRzIHRoZSBwb3B1cCB3aW5kb3cncyBjb250ZW50IGFuZCByZXR1cm5zIHRoZSBoZWlnaHQgdGhlIHBvcHVwCi0gICAgICogc2hvdWxkIGhhdmUuIFJldHVybnMgLTEgd2hlbiB0aGUgY29udGVudCBhbHJlYWR5IGV4aXN0cy48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50J3MgaGVpZ2h0IG9yIC0xIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBidWlsZERyb3BEb3duKCkgewotICAgICAgICBWaWV3R3JvdXAgZHJvcERvd25WaWV3OwotICAgICAgICBpbnQgb3RoZXJIZWlnaHRzID0gMDsKLQorICAgIAorICAgIHByaXZhdGUgdm9pZCBidWlsZEltZUNvbXBsZXRpb25zKCkgewogICAgICAgICBmaW5hbCBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CiAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIucGVla0luc3RhbmNlKCk7CkBAIC0xMjYzLDEzNSArMTA2Miw2IEBACiAgICAgICAgICAgICAgICAgaW1tLmRpc3BsYXlDb21wbGV0aW9ucyh0aGlzLCBjb21wbGV0aW9ucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG1IaWRlU2VsZWN0b3IgPSBuZXcgTGlzdFNlbGVjdG9ySGlkZXIoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGlzIFJ1bm5hYmxlIGV4aXN0cyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjaGVja2luZyBpZiB0aGUgdmlldyBsYXlvdXQgaGFzIGdvdAotICAgICAgICAgICAgICogY29tcGxldGVkIGFuZCBpZiBzbyBjYWxsIHNob3dEcm9wRG93biB0byBkaXNwbGF5IHRoZSBkcm9wIGRvd24uIFRoaXMgaXMgdXNlZCB0byBzaG93Ci0gICAgICAgICAgICAgKiB0aGUgZHJvcCBkb3duIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdXNlciBvcGVucyB1cCB0aGUgc2VhcmNoIGRpYWxvZywgd2l0aG91dAotICAgICAgICAgICAgICogd2FpdGluZyBmb3IgdGhlIG5vcm1hbCBVSSBwaXBlbGluZSB0byBkbyBpdCdzIGpvYiB3aGljaCBpcyBzbG93ZXIgdGhhbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbVNob3dEcm9wRG93blJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVmlldyBsYXlvdXQgc2hvdWxkIGJlIGFsbCBkb25lIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBkcm9wIGRvd24uCi0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGdldERyb3BEb3duQW5jaG9yVmlldygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsICYmIHZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaG93RHJvcERvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0KTsKLSAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0U2VsZWN0b3IobURyb3BEb3duTGlzdEhpZ2hsaWdodCk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFZlcnRpY2FsRmFkaW5nRWRnZUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobURyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobmV3IFBvcHVwU2Nyb2xsTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSXRlbVNlbGVjdGVkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtU2VsZWN0ZWRMaXN0ZW5lcihtSXRlbVNlbGVjdGVkTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkcm9wRG93blZpZXcgPSBtRHJvcERvd25MaXN0OwotCi0gICAgICAgICAgICBWaWV3IGhpbnRWaWV3ID0gZ2V0SGludFZpZXcoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoaGludFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGFuIGhpbnQgaGFzIGJlZW4gc3BlY2lmaWVkLCB3ZSBhY2NvbW9kYXRlIG1vcmUgc3BhY2UgZm9yIGl0IGFuZAotICAgICAgICAgICAgICAgIC8vIGFkZCBhIHRleHQgdmlldyBpbiB0aGUgZHJvcCBkb3duIG1lbnUsIGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgaGludENvbnRhaW5lciA9IG5ldyBMaW5lYXJMYXlvdXQoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwotCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgMCwgMS4wZgotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGRyb3BEb3duVmlldywgaGludFBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKLQotICAgICAgICAgICAgICAgIC8vIG1lYXN1cmUgdGhlIGhpbnQncyBoZWlnaHQgdG8gZmluZCBob3cgbXVjaCBtb3JlIHZlcnRpY2FsIHNwYWNlCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdG8gdGhlIGRyb3AgZG93bidzIGhlaWdodAotICAgICAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2lkdGgoKSwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKLSAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7Ci0KLSAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgotICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBkcm9wRG93blZpZXcuZmluZFZpZXdCeUlkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBoaW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IHZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGhpbnRQYXJhbXMudG9wTWFyZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhpbnRQYXJhbXMuYm90dG9tTWFyZ2luOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWF4IGhlaWdodCBhdmFpbGFibGUgb24gdGhlIHNjcmVlbiBmb3IgYSBwb3B1cC4KLSAgICAgICAgYm9vbGVhbiBpZ25vcmVCb3R0b21EZWNvcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbVBvcHVwLmdldElucHV0TWV0aG9kTW9kZSgpID09IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEOwotICAgICAgICBmaW5hbCBpbnQgbWF4SGVpZ2h0ID0gbVBvcHVwLmdldE1heEF2YWlsYWJsZUhlaWdodCgKLSAgICAgICAgICAgICAgICBnZXREcm9wRG93bkFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKLQotICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAotICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKLSAgICAgICAgaW50IHBhZGRpbmcgPSAwOwotICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgewotICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7Ci0gICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKLSAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKLSAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKLSAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKLSAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7Ci0KLSAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOwotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBnZXRIaW50VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG1IaW50VGV4dCAhPSBudWxsICYmIG1IaW50VGV4dC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFRleHRWaWV3IGhpbnRWaWV3ID0gKFRleHRWaWV3KSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmluZmxhdGUoCi0gICAgICAgICAgICAgICAgICAgIG1IaW50UmVzb3VyY2UsIG51bGwpLmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHQxKTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldFRleHQobUhpbnRUZXh0KTsKLSAgICAgICAgICAgIGhpbnRWaWV3LnNldElkKEhJTlRfVklFV19JRCk7Ci0gICAgICAgICAgICByZXR1cm4gaGludFZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0Myw0NyArMTExMyw2IEBACiAgICAgICAgIHJldHVybiBtRmlsdGVyOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTGlzdFNlbGVjdG9ySGlkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGNsZWFyTGlzdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZXNpemVQb3B1cFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBtUG9wdXAuc2V0SW5wdXRNZXRob2RNb2RlKFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9OT1RfTkVFREVEKTsKLSAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBPblRvdWNoTGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoKFZpZXcgdiwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04gJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvcHVwICE9IG51bGwgJiYgbVBvcHVwLmlzU2hvd2luZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdERlbGF5ZWQobVJlc2l6ZVBvcHVwUnVubmFibGUsIEVYUEFORF9MSVNUX1RJTUVPVVQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1SZXNpemVQb3B1cFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCi0gICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7Ci0gICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGNsYXNzIERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewogICAgICAgICAgICAgcGVyZm9ybUNvbXBsZXRpb24odiwgcG9zaXRpb24sIGlkKTsKQEAgLTE0OTEsMTIzICsxMTIwLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiA8cD5XcmFwcGVyIGNsYXNzIGZvciBhIExpc3RWaWV3LiBUaGlzIHdyYXBwZXIgaGlqYWNrcyB0aGUgZm9jdXMgdG8KLSAgICAgKiBtYWtlIHN1cmUgdGhlIGxpc3QgdXNlcyB0aGUgYXBwcm9wcmlhdGUgZHJhd2FibGVzIGFuZCBzdGF0ZXMgd2hlbgotICAgICAqIGRpc3BsYXllZCBvbiBzY3JlZW4gd2l0aGluIGEgZHJvcCBkb3duLiBUaGUgZm9jdXMgaXMgbmV2ZXIgYWN0dWFsbHkKLSAgICAgKiBwYXNzZWQgdG8gdGhlIGRyb3AgZG93bjsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgICAgICAvKgotICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSB0b3VjaCBtb2RlIGlzc3VlLgotICAgICAgICAgKgotICAgICAgICAgKiBUb3VjaCBtb2RlIGlzIHByb3BhZ2F0ZWQgbGF6aWx5IHRvIHdpbmRvd3MuIFRoaXMgY2F1c2VzIHByb2JsZW1zIGluCi0gICAgICAgICAqIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86Ci0gICAgICAgICAqIC0gVHlwZSBzb21ldGhpbmcgaW4gdGhlIEF1dG9Db21wbGV0ZVRleHRWaWV3IGFuZCBnZXQgc29tZSByZXN1bHRzCi0gICAgICAgICAqIC0gTW92ZSBkb3duIHdpdGggdGhlIGQtcGFkIHRvIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBsaXN0Ci0gICAgICAgICAqIC0gTW92ZSB1cCB3aXRoIHRoZSBkLXBhZCB1bnRpbCB0aGUgc2VsZWN0aW9uIGRpc2FwcGVhcnMKLSAgICAgICAgICogLSBUeXBlIG1vcmUgdGV4dCBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgKnVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkKgotICAgICAgICAgKiAgIGFuZCBnZXQgbmV3IHJlc3VsdHM7IHlvdSBhcmUgbm93IGluIHRvdWNoIG1vZGUKLSAgICAgICAgICogLSBUaGUgc2VsZWN0aW9uIGNvbWVzIGJhY2sgb24gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIGV2ZW4gdGhvdWdoCi0gICAgICAgICAqICAgdGhlIGxpc3QgaXMgc3VwcG9zZWQgdG8gYmUgaW4gdG91Y2ggbW9kZQotICAgICAgICAgKgotICAgICAgICAgKiBVc2luZyB0aGUgc29mdCBrZXlib2FyZCB0cmlnZ2VycyB0aGUgdG91Y2ggbW9kZSBjaGFuZ2UgYnV0IHRoYXQgY2hhbmdlCi0gICAgICAgICAqIGlzIHByb3BhZ2F0ZWQgdG8gb3VyIHdpbmRvdyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBsaXN0IGxheW91dCwgdGhlcmVmb3JlCi0gICAgICAgICAqIGFmdGVyIHRoZSBsaXN0IGF0dGVtcHRzIHRvIHJlc3VycmVjdCB0aGUgc2VsZWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgdHJpY2sgdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSBpcyB0byBwcmV0ZW5kIHRoZSBsaXN0IGlzIGluIHRvdWNoCi0gICAgICAgICAqIG1vZGUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIHNlbGVjdGlvbiBzaG91bGQgbm90IGFwcGVhciwgdGhhdCBpcyB3aGVuCi0gICAgICAgICAqIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlIHNlbGVjdGlvbiBhd2F5IGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBzZXQgdG8gdHJ1ZSB3aGVuZXZlciB3ZSBleHBsaWNpdGVseSBoaWRlIHRoZSBsaXN0J3MKLSAgICAgICAgICogc2VsZWN0aW9uIGFuZCByZXNldCB0byBmYWxzZSB3aGVudmVyIHdlIGtub3cgdGhlIHVzZXIgbW92ZWQgdGhlCi0gICAgICAgICAqIHNlbGVjdGlvbiBiYWNrIHRvIHRoZSBsaXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBXaGVuIHRoaXMgYm9vbGVhbiBpcyB0cnVlLCBpc0luVG91Y2hNb2RlKCkgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgaXQKLSAgICAgICAgICogcmV0dXJucyBzdXBlci5pc0luVG91Y2hNb2RlKCkuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxpc3RTZWxlY3Rpb25IaWRkZW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPkF2b2lkcyBqYXJyaW5nIHNjcm9sbGluZyBlZmZlY3QgYnkgZW5zdXJpbmcgdGhhdCBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAqIG1hZGUgb2YgYSB0ZXh0IHZpZXcgZml0IG9uIGEgc2luZ2xlIGxpbmUuPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIGl0ZW0gaW5kZXggaW4gdGhlIGxpc3QgdG8gZ2V0IGEgdmlldyBmb3IKLSAgICAgICAgICogQHJldHVybiB0aGUgdmlldyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgVmlldyBvYnRhaW5WaWV3KGludCBwb3NpdGlvbiwgYm9vbGVhbltdIGlzU2NyYXApIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IHN1cGVyLm9idGFpblZpZXcocG9zaXRpb24sIGlzU2NyYXApOwotCi0gICAgICAgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFRleHRWaWV3KSB7Ci0gICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0SG9yaXpvbnRhbGx5U2Nyb2xsaW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCkgewotICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4gaXMgZGVjbGFyZWQKLSAgICAgICAgICAgIHJldHVybiBtTGlzdFNlbGVjdGlvbkhpZGRlbiB8fCBzdXBlci5pc0luVG91Y2hNb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogPHA+UmV0dXJucyB0aGUgZm9jdXMgc3RhdGUgaW4gdGhlIGRyb3AgZG93bi48L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBhbHdheXMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgICAgICBpbnRbXSByZXMgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSk7Ci0gICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNyZWF0ZWQgZHJhd2FibGUgc3RhdGU6IFsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjB4Iik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJlc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIFRleHRWaWV3IGNvbXBsaWVzIHRvCiAgICAgICogYSBjZXJ0YWluIGZvcm1hdC4gIFNpbmNlIHRoZXJlIGlzIG5vIGZvb2xwcm9vZiB3YXkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGxlYXZpbmcKICAgICAgKiB0aGlzIFZpZXcgd2l0aCBhbiBpbmNvcnJlY3QgdmFsdWUgaW4gaXQsIGFsbCB3ZSBjYW4gZG8gaXMgdHJ5IHRvIGZpeCBpdCBvdXJzZWx2ZXMKQEAgLTE2NTUsMTAgKzExNjcsNyBAQAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhU2V0T2JzZXJ2ZXIgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgICAgICAgaWYgKGlzUG9wdXBTaG93aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVzaXplIHRoZSBwb3B1cCB0byBmaXQgdGhlIG5ldyBhZGFwdGVyJ3MgY29udGVudAotICAgICAgICAgICAgICAgIHNob3dEcm9wRG93bigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb3B1cCBpcyBub3Qgc2hvd2luZyBhbHJlYWR5LCBzaG93aW5nIGl0IHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBkYXRhIHNldCBvYnNlcnZlcnMgYXR0YWNoZWQgdG8gdGhlIGFkYXB0ZXIgdG8KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UuIFdlIGNhbid0IGRvIGl0IGZyb20gaGVyZSwgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1pZGRsZQpAQCAtMTY3MywxNCArMTE4Miw1IEBACiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbnZhbGlkYXRlZCgpIHsKLSAgICAgICAgICAgIGlmICghbURyb3BEb3duQWx3YXlzVmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZGF0YSB0byBkaXNwbGF5IHNvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2hvd2luZwotICAgICAgICAgICAgICAgIC8vIHRoZSBkcm9wIGRvd24gYW5kIGl0cyBsaXN0Ci0gICAgICAgICAgICAgICAgZGlzbWlzc0Ryb3BEb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0N1cnNvckFkYXB0ZXIuamF2YQppbmRleCBiYWE2ODMzLi40Y2Y4Nzg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ3Vyc29yQWRhcHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DdXJzb3JBZGFwdGVyLmphdmEKQEAgLTgwLDYgKzgwLDE4IEBACiAgICAgcHJvdGVjdGVkIEZpbHRlclF1ZXJ5UHJvdmlkZXIgbUZpbHRlclF1ZXJ5UHJvdmlkZXI7CiAKICAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlIGFkYXB0ZXIgd2lsbCBjYWxsIHJlcXVlcnkoKSBvbiB0aGUgY3Vyc29yIHdoZW5ldmVyIGEgY29udGVudCBjaGFuZ2UKKyAgICAgKiBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiBJbXBsaWVzIHtAbGluayAjRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfQVVUT19SRVFVRVJZID0gMHgwMTsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgYWRhcHRlciB3aWxsIHJlZ2lzdGVyIGEgY29udGVudCBvYnNlcnZlciBvbiB0aGUgY3Vyc29yIGFuZCB3aWxsIGNhbGwKKyAgICAgKiB7QGxpbmsgI29uQ29udGVudENoYW5nZWQoKX0gd2hlbiBhIG5vdGlmaWNhdGlvbiBjb21lcyBpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIgPSAweDAyOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuIFRoZSBhZGFwdGVyIHdpbGwgY2FsbCByZXF1ZXJ5KCkgb24gdGhlIGN1cnNvciB3aGVuZXZlcgogICAgICAqIGl0IGNoYW5nZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnQgZGF0YSBpcyBhbHdheXMgZGlzcGxheWVkLgogICAgICAqCkBAIC04Nyw3ICs5OSw3IEBACiAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKICAgICAgKi8KICAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEN1cnNvciBjKSB7Ci0gICAgICAgIGluaXQoY29udGV4dCwgYywgdHJ1ZSk7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgRkxBR19BVVRPX1JFUVVFUlkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTksMTkgKzExMSw0MyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIGFsd2F5cyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgewotICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5KTsKKyAgICAgICAgaW5pdChjb250ZXh0LCBjLCBhdXRvUmVxdWVyeSA/IEZMQUdfQVVUT19SRVFVRVJZIDogRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBjIFRoZSBjdXJzb3IgZnJvbSB3aGljaCB0byBnZXQgdGhlIGRhdGEuCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGluaXQoY29udGV4dCwgYywgZmxhZ3MpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgYm9vbGVhbiBhdXRvUmVxdWVyeSkgeworICAgICAgICBpbml0KGNvbnRleHQsIGMsIGF1dG9SZXF1ZXJ5ID8gRkxBR19BVVRPX1JFUVVFUlkgOiBGTEFHX1JFR0lTVEVSX0NPTlRFTlRfT0JTRVJWRVIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYywgaW50IGZsYWdzKSB7CisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FVVE9fUkVRVUVSWSkgPT0gRkxBR19BVVRPX1JFUVVFUlkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUjsKKyAgICAgICAgICAgIG1BdXRvUmVxdWVyeSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXV0b1JlcXVlcnkgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBib29sZWFuIGN1cnNvclByZXNlbnQgPSBjICE9IG51bGw7Ci0gICAgICAgIG1BdXRvUmVxdWVyeSA9IGF1dG9SZXF1ZXJ5OwogICAgICAgICBtQ3Vyc29yID0gYzsKICAgICAgICAgbURhdGFWYWxpZCA9IGN1cnNvclByZXNlbnQ7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJvd0lEQ29sdW1uID0gY3Vyc29yUHJlc2VudCA/IGMuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKSA6IC0xOwotICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEZMQUdfUkVHSVNURVJfQ09OVEVOVF9PQlNFUlZFUikgPT0gRkxBR19SRUdJU1RFUl9DT05URU5UX09CU0VSVkVSKSB7CisgICAgICAgICAgICBtQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgQ2hhbmdlT2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DaGFuZ2VPYnNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3Vyc29yUHJlc2VudCkgewotICAgICAgICAgICAgYy5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ2hhbmdlT2JzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKG1DaGFuZ2VPYnNlcnZlciAhPSBudWxsKSBjLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1EYXRhU2V0T2JzZXJ2ZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ2LDEzICsyODIsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgbUN1cnNvci51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLnVucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtQ3Vyc29yLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnNvciA9IGN1cnNvcjsKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobUNoYW5nZU9ic2VydmVyKTsKKyAgICAgICAgICAgIGlmIChtQ2hhbmdlT2JzZXJ2ZXIgIT0gbnVsbCkgY3Vyc29yLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1DaGFuZ2VPYnNlcnZlcik7CiAgICAgICAgICAgICBjdXJzb3IucmVnaXN0ZXJEYXRhU2V0T2JzZXJ2ZXIobURhdGFTZXRPYnNlcnZlcik7CiAgICAgICAgICAgICBtUm93SURDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJfaWQiKTsKICAgICAgICAgICAgIG1EYXRhVmFsaWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0VkZ2VHbG93LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMjJlMS4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRWRnZUdsb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwZXJmb3JtcyB0aGUgZ2xvdyBlZmZlY3QgdXNlZCBhdCB0aGUgZWRnZXMgb2Ygc2Nyb2xsYWJsZSB3aWRnZXRzLgotICogQGhpZGUKLSAqLwotcHVibGljIGNsYXNzIEVkZ2VHbG93IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVkZ2VHbG93IjsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIHRoZSBlZmZlY3QgdG8gZnVsbHkgcmVjZWRlIGluIG1zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VERV9USU1FID0gMTAwMDsKLQotICAgIC8vIFRpbWUgaXQgd2lsbCB0YWtlIGJlZm9yZSBhIHB1bGxlZCBnbG93IGJlZ2lucyByZWNlZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUxMX1RJTUUgPSAyNTA7Ci0KLSAgICAvLyBUaW1lIGl0IHdpbGwgdGFrZSBmb3IgYSBwdWxsZWQgZ2xvdyB0byBkZWNheSB0byBwYXJ0aWFsIHN0cmVuZ3RoIGJlZm9yZSByZWxlYXNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBVTExfREVDQVlfVElNRSA9IDEwMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0VER0VfQUxQSEEgPSAwLjdmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfRURHRV9TQ0FMRV9ZID0gMC41ZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIRUxEX0dMT1dfQUxQSEEgPSAwLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhFTERfR0xPV19TQ0FMRV9ZID0gMC41ZjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1BWF9HTE9XX0hFSUdIVCA9IDAuMzNmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgUFVMTF9HTE9XX0JFR0lOID0gMC41ZjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBQVUxMX0VER0VfQkVHSU4gPSAwLjZmOwotCi0gICAgLy8gTWluaW11bSB2ZWxvY2l0eSB0aGF0IHdpbGwgYmUgYWJzb3JiZWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZFTE9DSVRZID0gNzUwOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVQU0lMT04gPSAwLjAwMWY7Ci0KLSAgICBwcml2YXRlIERyYXdhYmxlIG1FZGdlOwotICAgIHByaXZhdGUgRHJhd2FibGUgbUdsb3c7Ci0gICAgcHJpdmF0ZSBpbnQgbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7Ci0KLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlQWxwaGE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZVNjYWxlWTsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93QWxwaGE7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd1NjYWxlWTsKLQotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VBbHBoYVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUVkZ2VBbHBoYUZpbmlzaDsKLSAgICBwcml2YXRlIGZsb2F0IG1FZGdlU2NhbGVZU3RhcnQ7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRWRnZVNjYWxlWUZpbmlzaDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93QWxwaGFTdGFydDsKLSAgICBwcml2YXRlIGZsb2F0IG1HbG93QWxwaGFGaW5pc2g7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtR2xvd1NjYWxlWVN0YXJ0OwotICAgIHByaXZhdGUgZmxvYXQgbUdsb3dTY2FsZVlGaW5pc2g7Ci0KLSAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZTsKLSAgICBwcml2YXRlIGludCBtRHVyYXRpb247Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QVUxMID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQUJTT1JCID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVDRURFID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFVMTF9ERUNBWSA9IDQ7Ci0KLSAgICBwcml2YXRlIGludCBtU3RhdGUgPSBTVEFURV9JRExFOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtUHVsbERpc3RhbmNlOwotCi0gICAgcHVibGljIEVkZ2VHbG93KERyYXdhYmxlIGVkZ2UsIERyYXdhYmxlIGdsb3cpIHsKLSAgICAgICAgbUVkZ2UgPSBlZGdlOwotICAgICAgICBtR2xvdyA9IGdsb3c7Ci0KLSAgICAgICAgbUludGVycG9sYXRvciA9IG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9JRExFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHdoZW4gdGhlIG9iamVjdCBpcyBwdWxsZWQgYnkgdGhlIHVzZXIuCi0gICAgICogQHBhcmFtIGRlbHRhRGlzdGFuY2UgQ2hhbmdlIGluIGRpc3RhbmNlIHNpbmNlIHRoZSBsYXN0IGNhbGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblB1bGwoZmxvYXQgZGVsdGFEaXN0YW5jZSkgewotICAgICAgICBmaW5hbCBsb25nIG5vdyA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfUFVMTF9ERUNBWSAmJiBub3cgLSBtU3RhcnRUaW1lIDwgbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9QVUxMKSB7Ci0gICAgICAgICAgICBtR2xvd1NjYWxlWSA9IFBVTExfR0xPV19CRUdJTjsKLSAgICAgICAgfQotICAgICAgICBtU3RhdGUgPSBTVEFURV9QVUxMOwotCi0gICAgICAgIG1TdGFydFRpbWUgPSBub3c7Ci0gICAgICAgIG1EdXJhdGlvbiA9IFBVTExfVElNRTsKLQotICAgICAgICBtUHVsbERpc3RhbmNlICs9IGRlbHRhRGlzdGFuY2U7Ci0gICAgICAgIGZsb2F0IGRpc3RhbmNlID0gTWF0aC5hYnMobVB1bGxEaXN0YW5jZSk7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYSA9IG1FZGdlQWxwaGFTdGFydCA9IE1hdGgubWF4KFBVTExfRURHRV9CRUdJTiwgTWF0aC5taW4oZGlzdGFuY2UsIDEuZikpOwotICAgICAgICBtRWRnZVNjYWxlWSA9IG1FZGdlU2NhbGVZU3RhcnQgPSBNYXRoLm1heChIRUxEX0VER0VfU0NBTEVfWSwgTWF0aC5taW4oZGlzdGFuY2UsIDIuZikpOwotCi0gICAgICAgIG1HbG93QWxwaGEgPSBtR2xvd0FscGhhU3RhcnQgPSBNYXRoLm1heCgwLjVmLAotICAgICAgICAgICAgICAgIE1hdGgubWluKG1HbG93QWxwaGEgKyBNYXRoLmFicyhkZWx0YURpc3RhbmNlKSwgMS5mKSk7Ci0KLSAgICAgICAgZmxvYXQgZ2xvd0NoYW5nZSA9IE1hdGguYWJzKGRlbHRhRGlzdGFuY2UpOwotICAgICAgICBpZiAoZGVsdGFEaXN0YW5jZSA+IDAgJiYgbVB1bGxEaXN0YW5jZSA8IDApIHsKLSAgICAgICAgICAgIGdsb3dDaGFuZ2UgPSAtZ2xvd0NoYW5nZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVB1bGxEaXN0YW5jZSA9PSAwKSB7Ci0gICAgICAgICAgICBtR2xvd1NjYWxlWSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUdsb3dTY2FsZVkgPSBtR2xvd1NjYWxlWVN0YXJ0ID0gTWF0aC5tYXgoMCwgbUdsb3dTY2FsZVkgKyBnbG93Q2hhbmdlICogMik7Ci0KLSAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IG1FZGdlQWxwaGE7Ci0gICAgICAgIG1FZGdlU2NhbGVZRmluaXNoID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBtR2xvd0FscGhhOwotICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IG1HbG93U2NhbGVZOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGwgd2hlbiB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkIGFmdGVyIGJlaW5nIHB1bGxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIG1QdWxsRGlzdGFuY2UgPSAwOwotCi0gICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFVMTCAmJiBtU3RhdGUgIT0gU1RBVEVfUFVMTF9ERUNBWSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVDRURFOwotICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSBtRWRnZUFscGhhOwotICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gbUVkZ2VTY2FsZVk7Ci0gICAgICAgIG1HbG93QWxwaGFTdGFydCA9IG1HbG93QWxwaGE7Ci0gICAgICAgIG1HbG93U2NhbGVZU3RhcnQgPSBtR2xvd1NjYWxlWTsKLQotICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gMC5mOwotICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDAuMWY7Ci0gICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSAwLmY7Ci0gICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gMC4xZjsKLQotICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgbUR1cmF0aW9uID0gUkVDRURFX1RJTUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB3aGVuIHRoZSBlZmZlY3QgYWJzb3JicyBhbiBpbXBhY3QgYXQgdGhlIGdpdmVuIHZlbG9jaXR5LgotICAgICAqIEBwYXJhbSB2ZWxvY2l0eSBWZWxvY2l0eSBhdCBpbXBhY3QgaW4gcGl4ZWxzIHBlciBzZWNvbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25BYnNvcmIoaW50IHZlbG9jaXR5KSB7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCU09SQjsKLSAgICAgICAgdmVsb2NpdHkgPSBNYXRoLm1heChNSU5fVkVMT0NJVFksIE1hdGguYWJzKHZlbG9jaXR5KSk7Ci0KLSAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICh2ZWxvY2l0eSAqIDAuMDNmKTsKLQotICAgICAgICBtRWRnZUFscGhhU3RhcnQgPSAwLjVmOwotICAgICAgICBtRWRnZVNjYWxlWVN0YXJ0ID0gMC4yZjsKLSAgICAgICAgbUdsb3dBbHBoYVN0YXJ0ID0gMC41ZjsKLSAgICAgICAgbUdsb3dTY2FsZVlTdGFydCA9IDAuZjsKLQotICAgICAgICBtRWRnZUFscGhhRmluaXNoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmVsb2NpdHkgKiAwLjAxZiwgMSkpOwotICAgICAgICBtRWRnZVNjYWxlWUZpbmlzaCA9IDEuZjsKLSAgICAgICAgbUdsb3dBbHBoYUZpbmlzaCA9IDEuZjsKLSAgICAgICAgbUdsb3dTY2FsZVlGaW5pc2ggPSBNYXRoLm1pbih2ZWxvY2l0eSAqIDAuMDAxZiwgMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHJhdyBpbnRvIHRoZSBwcm92aWRlZCBjYW52YXMuCi0gICAgICogQXNzdW1lcyB0aGF0IHRoZSBjYW52YXMgaGFzIGJlZW4gcm90YXRlZCBhY2NvcmRpbmdseSBhbmQgdGhlIHNpemUgaGFzIGJlZW4gc2V0LgotICAgICAqIFRoZSBlZmZlY3Qgd2lsbCBiZSBkcmF3biB0aGUgZnVsbCB3aWR0aCBvZiBYPTAgdG8gWD13aWR0aCwgZW1pdHRpbmcgZnJvbSBZPTAgYW5kIGV4dGVuZGluZwotICAgICAqIHRvIHNvbWUgZmFjdG9yIDwgMS5mIG9mIGhlaWdodC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYW52YXMgQ2FudmFzIHRvIGRyYXcgaW50bwotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkcmF3aW5nIHNob3VsZCBjb250aW51ZSBiZXlvbmQgdGhpcyBmcmFtZSB0byBjb250aW51ZSB0aGUgYW5pbWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHVwZGF0ZSgpOwotCi0gICAgICAgIGZpbmFsIGludCBlZGdlSGVpZ2h0ID0gbUVkZ2UuZ2V0SW50cmluc2ljSGVpZ2h0KCk7Ci0gICAgICAgIGZpbmFsIGludCBnbG93SGVpZ2h0ID0gbUdsb3cuZ2V0SW50cmluc2ljSGVpZ2h0KCk7Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgZGlzdFNjYWxlID0gKGZsb2F0KSBtSGVpZ2h0IC8gbVdpZHRoOwotCi0gICAgICAgIG1HbG93LnNldEFscGhhKChpbnQpIChNYXRoLm1heCgwLCBNYXRoLm1pbihtR2xvd0FscGhhLCAxKSkgKiAyNTUpKTsKLSAgICAgICAgbUdsb3cuc2V0Qm91bmRzKDAsIDAsIG1XaWR0aCwgKGludCkgTWF0aC5taW4oZ2xvd0hlaWdodCAqIG1HbG93U2NhbGVZICogZGlzdFNjYWxlICogMC42ZiwKLSAgICAgICAgICAgICAgICBtSGVpZ2h0ICogTUFYX0dMT1dfSEVJR0hUKSk7Ci0gICAgICAgIG1HbG93LmRyYXcoY2FudmFzKTsKLQotICAgICAgICBtRWRnZS5zZXRBbHBoYSgoaW50KSAoTWF0aC5tYXgoMCwgTWF0aC5taW4obUVkZ2VBbHBoYSwgMSkpICogMjU1KSk7Ci0gICAgICAgIG1FZGdlLnNldEJvdW5kcygwLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgbVdpZHRoLAotICAgICAgICAgICAgICAgIChpbnQpIChlZGdlSGVpZ2h0ICogbUVkZ2VTY2FsZVkpKTsKLSAgICAgICAgbUVkZ2UuZHJhdyhjYW52YXMpOwotCi0gICAgICAgIHJldHVybiBtU3RhdGUgIT0gU1RBVEVfSURMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBmaW5hbCBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICBmaW5hbCBmbG9hdCB0ID0gTWF0aC5taW4oKGZsb2F0KSAodGltZSAtIG1TdGFydFRpbWUpIC8gbUR1cmF0aW9uLCAxLmYpOwotCi0gICAgICAgIGZpbmFsIGZsb2F0IGludGVycCA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbih0KTsKLQotICAgICAgICBtRWRnZUFscGhhID0gbUVkZ2VBbHBoYVN0YXJ0ICsgKG1FZGdlQWxwaGFGaW5pc2ggLSBtRWRnZUFscGhhU3RhcnQpICogaW50ZXJwOwotICAgICAgICBtRWRnZVNjYWxlWSA9IG1FZGdlU2NhbGVZU3RhcnQgKyAobUVkZ2VTY2FsZVlGaW5pc2ggLSBtRWRnZVNjYWxlWVN0YXJ0KSAqIGludGVycDsKLSAgICAgICAgbUdsb3dBbHBoYSA9IG1HbG93QWxwaGFTdGFydCArIChtR2xvd0FscGhhRmluaXNoIC0gbUdsb3dBbHBoYVN0YXJ0KSAqIGludGVycDsKLSAgICAgICAgbUdsb3dTY2FsZVkgPSBtR2xvd1NjYWxlWVN0YXJ0ICsgKG1HbG93U2NhbGVZRmluaXNoIC0gbUdsb3dTY2FsZVlTdGFydCkgKiBpbnRlcnA7Ci0KLSAgICAgICAgaWYgKHQgPj0gMS5mIC0gRVBTSUxPTikgewotICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0FCU09SQjoKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUkVDRURFOwotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gUkVDRURFX1RJTUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IDAuZjsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSAwLjFmOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhRmluaXNoID0gMC5mOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWUZpbmlzaCA9IG1HbG93U2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1BVTEw6Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BVTExfREVDQVk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBQVUxMX0RFQ0FZX1RJTUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYVN0YXJ0ID0gbUVkZ2VBbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlTdGFydCA9IG1FZGdlU2NhbGVZOwotICAgICAgICAgICAgICAgICAgICBtR2xvd0FscGhhU3RhcnQgPSBtR2xvd0FscGhhOwotICAgICAgICAgICAgICAgICAgICBtR2xvd1NjYWxlWVN0YXJ0ID0gbUdsb3dTY2FsZVk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VBbHBoYUZpbmlzaCA9IE1hdGgubWluKG1FZGdlQWxwaGFTdGFydCwgSEVMRF9FREdFX0FMUEhBKTsKLSAgICAgICAgICAgICAgICAgICAgbUVkZ2VTY2FsZVlGaW5pc2ggPSBNYXRoLm1pbihtRWRnZVNjYWxlWVN0YXJ0LCBIRUxEX0VER0VfU0NBTEVfWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93QWxwaGFGaW5pc2ggPSBNYXRoLm1pbihtR2xvd0FscGhhU3RhcnQsIEhFTERfR0xPV19BTFBIQSk7Ci0gICAgICAgICAgICAgICAgICAgIG1HbG93U2NhbGVZRmluaXNoID0gTWF0aC5taW4obUdsb3dTY2FsZVksIEhFTERfR0xPV19TQ0FMRV9ZKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QVUxMX0RFQ0FZOgotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nOyB3YWl0IGZvciByZWxlYXNlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUkVDRURFOgotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GcmFtZUxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKaW5kZXggZTQ0NTE4MC4uNTU5YTVmZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEKQEAgLTMyLDggKzMyLDggQEAKIAogLyoqCiAgKiBGcmFtZUxheW91dCBpcyBkZXNpZ25lZCB0byBibG9jayBvdXQgYW4gYXJlYSBvbiB0aGUgc2NyZWVuIHRvIGRpc3BsYXkKLSAqIGEgc2luZ2xlIGl0ZW0uIFlvdSBjYW4gYWRkIG11bHRpcGxlIGNoaWxkcmVuIHRvIGEgRnJhbWVMYXlvdXQsIGJ1dCBhbGwKLSAqIGNoaWxkcmVuIGFyZSBwZWdnZWQgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSBzY3JlZW4uCisgKiBhIHNpbmdsZSBpdGVtLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBjaGlsZHJlbiB0byBhIEZyYW1lTGF5b3V0IGFuZCBjb250cm9sIHRoZWlyCisgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIEZyYW1lTGF5b3V0IHVzaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dC5MYXlvdXRQYXJhbXMjZ3Jhdml0eX0uCiAgKiBDaGlsZHJlbiBhcmUgZHJhd24gaW4gYSBzdGFjaywgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjaGlsZCBvbiB0b3AuCiAgKiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgbGF5b3V0IGlzIHRoZSBzaXplIG9mIGl0cyBsYXJnZXN0IGNoaWxkIChwbHVzIHBhZGRpbmcpLCB2aXNpYmxlCiAgKiBvciBub3QgKGlmIHRoZSBGcmFtZUxheW91dCdzIHBhcmVudCBwZXJtaXRzKS4gVmlld3MgdGhhdCBhcmUgR09ORSBhcmUgdXNlZCBmb3Igc2l6aW5nCkBAIC00NDAsNiArNDQwLDggQEAKICAgICAgKiBQZXItY2hpbGQgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBsYXlvdXRzIHRoYXQgc3VwcG9ydCBtYXJnaW5zLgogICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXQgRnJhbWVMYXlvdXQgTGF5b3V0IEF0dHJpYnV0ZXN9CiAgICAgICogZm9yIGEgbGlzdCBvZiBhbGwgY2hpbGQgdmlldyBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBjbGFzcyBzdXBwb3J0cy4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dFBhcmFtcyBleHRlbmRzIE1hcmdpbkxheW91dFBhcmFtcyB7CiAgICAgICAgIC8qKgpAQCAtNDQ3LDYgKzQ0OSw4IEBACiAgICAgICAgICAqIGFyZSBhc3NvY2lhdGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5HcmF2aXR5CisgICAgICAgICAqIAorICAgICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNGcmFtZUxheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ3Jhdml0eSA9IC0xOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dhbGxlcnkuamF2YQppbmRleCBjY2QzN2QzLi45Nzg5NjU4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR2FsbGVyeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HYWxsZXJ5LmphdmEKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAKICAgICAgICAgLy8gV2UgdW5mb2N1cyB0aGUgb2xkIGNoaWxkIGRvd24gaGVyZSBzbyB0aGUgYWJvdmUgaGFzRm9jdXMgY2hlY2sKICAgICAgICAgLy8gcmV0dXJucyB0cnVlCi0gICAgICAgIGlmIChvbGRTZWxlY3RlZENoaWxkICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG9sZFNlbGVjdGVkQ2hpbGQgIT0gbnVsbCAmJiBvbGRTZWxlY3RlZENoaWxkICE9IGNoaWxkKSB7CiAKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBpdHMgZHJhd2FibGUgc3RhdGUgZG9lc24ndCBjb250YWluICdzZWxlY3RlZCcKICAgICAgICAgICAgIG9sZFNlbGVjdGVkQ2hpbGQuc2V0U2VsZWN0ZWQoZmFsc2UpOwpAQCAtMTI2Niw2ICsxMjY2LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChnYWluRm9jdXMgJiYgbVNlbGVjdGVkQ2hpbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgbVNlbGVjdGVkQ2hpbGQucmVxdWVzdEZvY3VzKGRpcmVjdGlvbik7CisgICAgICAgICAgICBtU2VsZWN0ZWRDaGlsZC5zZXRTZWxlY3RlZCh0cnVlKTsKICAgICAgICAgfQogCiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQppbmRleCBhNzMwMGMyLi5kZmZlNjg1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQpAQCAtMTcsMTUgKzE3LDE4IEBACiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3RGVidWc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkdyaWRMYXlvdXRBbmltYXRpb25Db250cm9sbGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CiAKIAogLyoqCkBAIC0zNSw2ICszOCw3IEBACiAgKiA8cD5TZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2hlbGxvLWdyaWR2aWV3Lmh0bWwiPkdyaWQKICAqIFZpZXcgdHV0b3JpYWw8L2E+LjwvcD4KICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBHcmlkVmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19TVFJFVENIID0gMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFVENIX1NQQUNJTkcgPSAxOwpAQCAtMTAzLDE5ICsxMDcsNDkgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0IGhvdyB0aGUgdXNlciBtYXkgc2VsZWN0IGl0ZW1zIGZyb20gdGhlIGdyaWQuCisgICAgICoKKyAgICAgKiA8cD5HcmlkVmlldyBvbmx5IHN1cHBvcnRzIHtAbGluayBBYnNMaXN0VmlldyNDSE9JQ0VfTU9ERV9OT05FfSBhbmQKKyAgICAgKiB7QGxpbmsgQWJzTGlzdFZpZXcjQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUx9LiBBdHRlbXB0aW5nIHRvIHNldCBhbiB1bnN1cHBvcnRlZCBjaG9pY2UKKyAgICAgKiBtb2RlIHdpbGwgdGhyb3cgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlTW9kZShpbnQgY2hvaWNlTW9kZSkgeworICAgICAgICBzd2l0Y2ggKGNob2ljZU1vZGUpIHsKKyAgICAgICAgY2FzZSBDSE9JQ0VfTU9ERV9OT05FOgorICAgICAgICBjYXNlIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMOgorICAgICAgICAgICAgc3VwZXIuc2V0Q2hvaWNlTW9kZShjaG9pY2VNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIGNob2ljZSBtb2RlICIgKyBjaG9pY2VNb2RlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0QWRhcHRlciBnZXRBZGFwdGVyKCkgewogICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGlzIEFic0xpc3RWaWV3IHRvIHVzZSBhIHJlbW90ZSB2aWV3cyBhZGFwdGVyIHdoaWNoIGNvbm5lY3RzIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlCisgICAgICogdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGludGVudC4KKyAgICAgKiBAcGFyYW0gaW50ZW50IHRoZSBpbnRlbnQgdXNlZCB0byBpZGVudGlmeSB0aGUgUmVtb3RlVmlld3NTZXJ2aWNlIGZvciB0aGUgYWRhcHRlciB0byBjb25uZWN0IHRvLgorICAgICAqLworICAgIEBhbmRyb2lkLnZpZXcuUmVtb3RhYmxlVmlld01ldGhvZAorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHN1cGVyLnNldFJlbW90ZVZpZXdzQWRhcHRlcihpbnRlbnQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRhdGEgYmVoaW5kIHRoaXMgR3JpZFZpZXcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYWRhcHRlciB0aGUgYWRhcHRlciBwcm92aWRpbmcgdGhlIGdyaWQncyBkYXRhCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC0xMjUsNyArMTU5LDEwIEBACiAKICAgICAgICAgbU9sZFNlbGVjdGVkUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtT2xkU2VsZWN0ZWRSb3dJZCA9IElOVkFMSURfUk9XX0lEOwotICAgICAgICAKKworICAgICAgICAvLyBBYnNMaXN0VmlldyNzZXRBZGFwdGVyIHdpbGwgdXBkYXRlIGNob2ljZSBtb2RlIHN0YXRlcy4KKyAgICAgICAgc3VwZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKwogICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbU9sZEl0ZW1Db3VudCA9IG1JdGVtQ291bnQ7CiAgICAgICAgICAgICBtSXRlbUNvdW50ID0gbUFkYXB0ZXIuZ2V0Q291bnQoKTsKQEAgLTc0Miw2ICs3NzksMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGdyaWQgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZAogICAgICAqIHNlbGVjdGlvbi4gVGhlIG5ldyBzZWxlY3Rpb24gd2lsbCBiZSBwbGFjZWQgYXQsIGFib3ZlLCBvciBiZWxvdyB0aGUKICAgICAgKiBsb2NhdGlvbiBvZiB0aGUgbmV3IHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gaG93IHRoZSBzZWxlY3Rpb24gaXMgbW92aW5nLgpAQCAtMTI4MSw2ICsxMzM4LDEyIEBACiAgICAgICAgICAgICBjaGlsZC5zZXRQcmVzc2VkKGlzUHJlc3NlZCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSAmJiBtQ2hlY2tTdGF0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CisgICAgICAgICAgICAgICAgKChDaGVja2FibGUpIGNoaWxkKS5zZXRDaGVja2VkKG1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZWVkVG9NZWFzdXJlKSB7CiAgICAgICAgICAgICBpbnQgY2hpbGRIZWlnaHRTcGVjID0gVmlld0dyb3VwLmdldENoaWxkTWVhc3VyZVNwZWMoCiAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygwLCBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCksIDAsIHAuaGVpZ2h0KTsKQEAgLTE0OTEsOSArMTU1NCw5IEBACiAgICAgICAgIGludCBuZXh0UGFnZSA9IC0xOwogCiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRk9DVVNfVVApIHsKLSAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIG5leHRQYWdlID0gTWF0aC5tYXgoMCwgbVNlbGVjdGVkUG9zaXRpb24gLSBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGT0NVU19ET1dOKSB7Ci0gICAgICAgICAgICBuZXh0UGFnZSA9IE1hdGgubWluKG1JdGVtQ291bnQgLSAxLCBtU2VsZWN0ZWRQb3NpdGlvbiArIGdldENoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgbmV4dFBhZ2UgPSBNYXRoLm1pbihtSXRlbUNvdW50IC0gMSwgbVNlbGVjdGVkUG9zaXRpb24gKyBnZXRDaGlsZENvdW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRQYWdlID49IDApIHsKQEAgLTE3NzcsNiArMTg0MCwxOSBAQAogICAgICAgICAgICAgcmVxdWVzdExheW91dElmTmVjZXNzYXJ5KCk7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4gCisgICAgICogUmV0dXJucyB7QGxpbmsgI0FVVE9fRklUfSBpZiB0aGUgR3JpZCBoYXMgbmV2ZXIgYmVlbiBsYWlkIG91dC4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRWaWV3X251bUNvbHVtbnMKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXROdW1Db2x1bW5zKGludCkKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkKKyAgICBwdWJsaWMgaW50IGdldE51bUNvbHVtbnMoKSB7ICAKKyAgICAgICAgcmV0dXJuIG1OdW1Db2x1bW5zOworICAgIH0KIAogICAgIC8qKgogICAgICAqIE1ha2Ugc3VyZSB2aWV3cyBhcmUgdG91Y2hpbmcgdGhlIHRvcCBvciBib3R0b20gZWRnZSwgYXMgYXBwcm9wcmlhdGUgZm9yCkBAIC0xODc2LDEyICsxOTUyLDcgQEAKICAgICAgICAgLy8gVE9ETzogQWNjb3VudCBmb3IgdmVydGljYWwgc3BhY2luZyB0b28KICAgICAgICAgZmluYWwgaW50IG51bUNvbHVtbnMgPSBtTnVtQ29sdW1uczsKICAgICAgICAgZmluYWwgaW50IHJvd0NvdW50ID0gKG1JdGVtQ291bnQgKyBudW1Db2x1bW5zIC0gMSkgLyBudW1Db2x1bW5zOwotICAgICAgICBpbnQgcmVzdWx0ID0gTWF0aC5tYXgocm93Q291bnQgKiAxMDAsIDApOwotICAgICAgICBpZiAobVNjcm9sbFkgIT0gMCkgewotICAgICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3Igb3ZlcnNjcm9sbAotICAgICAgICAgICAgcmVzdWx0ICs9IE1hdGguYWJzKChpbnQpICgoZmxvYXQpIG1TY3JvbGxZIC8gZ2V0SGVpZ2h0KCkgKiByb3dDb3VudCAqIDEwMCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBNYXRoLm1heChyb3dDb3VudCAqIDEwMCwgMCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCmluZGV4IDBiYjk3ZGQuLmUzMGQ0YzggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Ib3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCkBAIC0xNiwyNCArMTYsMTkgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNTgsNiArNTMsOCBAQAogICogd2l0aGluIGEgbGFyZ2VyIGNvbnRhaW5lci4KICAqCiAgKiA8cD5Ib3Jpem9udGFsU2Nyb2xsVmlldyBvbmx5IHN1cHBvcnRzIGhvcml6b250YWwgc2Nyb2xsaW5nLgorICogCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNIb3Jpem9udGFsU2Nyb2xsVmlld19maWxsVmlld3BvcnQgCiAgKi8KIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsU2Nyb2xsVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQU5JTUFURURfU0NST0xMX0dBUCA9IFNjcm9sbFZpZXcuQU5JTUFURURfU0NST0xMX0dBUDsKQEAgLTY4LDkgKzY1LDcgQEAKICAgICBwcml2YXRlIGxvbmcgbUxhc3RTY3JvbGw7CiAKICAgICBwcml2YXRlIGZpbmFsIFJlY3QgbVRlbXBSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIE92ZXJTY3JvbGxlciBtU2Nyb2xsZXI7Ci0gICAgcHJpdmF0ZSBFZGdlR2xvdyBtRWRnZUdsb3dMZWZ0OwotICAgIHByaXZhdGUgRWRnZUdsb3cgbUVkZ2VHbG93UmlnaHQ7CisgICAgcHJpdmF0ZSBTY3JvbGxlciBtU2Nyb2xsZXI7CiAKICAgICAvKioKICAgICAgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIG1vdmluZyBmb2N1cyBvdXJzZWx2ZXMuIFRoaXMgaXMgc28gdGhlCkBAIC0xMjQsOSArMTE5LDYgQEAKICAgICBwcml2YXRlIGludCBtTWluaW11bVZlbG9jaXR5OwogICAgIHByaXZhdGUgaW50IG1NYXhpbXVtVmVsb2NpdHk7CiAgICAgCi0gICAgcHJpdmF0ZSBpbnQgbU92ZXJzY3JvbGxEaXN0YW5jZTsKLSAgICBwcml2YXRlIGludCBtT3ZlcmZsaW5nRGlzdGFuY2U7Ci0KICAgICAvKioKICAgICAgKiBJRCBvZiB0aGUgYWN0aXZlIHBvaW50ZXIuIFRoaXMgaXMgdXNlZCB0byByZXRhaW4gY29uc2lzdGVuY3kgZHVyaW5nCiAgICAgICogZHJhZ3MvZmxpbmdzIGlmIG11bHRpcGxlIHBvaW50ZXJzIGFyZSB1c2VkLgpAQCAtMTk5LDcgKzE5MSw3IEBACiAKIAogICAgIHByaXZhdGUgdm9pZCBpbml0U2Nyb2xsVmlldygpIHsKLSAgICAgICAgbVNjcm9sbGVyID0gbmV3IE92ZXJTY3JvbGxlcihnZXRDb250ZXh0KCkpOworICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgU2Nyb2xsZXIoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KEZPQ1VTX0FGVEVSX0RFU0NFTkRBTlRTKTsKICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwpAQCAtMjA3LDggKzE5OSw2IEBACiAgICAgICAgIG1Ub3VjaFNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZFRvdWNoU2xvcCgpOwogICAgICAgICBtTWluaW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNaW5pbXVtRmxpbmdWZWxvY2l0eSgpOwogICAgICAgICBtTWF4aW11bVZlbG9jaXR5ID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRNYXhpbXVtRmxpbmdWZWxvY2l0eSgpOwotICAgICAgICBtT3ZlcnNjcm9sbERpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyc2Nyb2xsRGlzdGFuY2UoKTsKLSAgICAgICAgbU92ZXJmbGluZ0Rpc3RhbmNlID0gY29uZmlndXJhdGlvbi5nZXRTY2FsZWRPdmVyZmxpbmdEaXN0YW5jZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjYwLDIwICsyNTAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIEhvcml6b250YWxTY3JvbGxWaWV3J3MgY29udGVudCBpcyBzdHJldGNoZWQgdG8KKyAgICAgKiBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgdGhpcyBTY3JvbGxWaWV3IHdoZXRoZXIgaXQgc2hvdWxkIHN0cmV0Y2ggaXRzIGNvbnRlbnQgd2lkdGggdG8gZmlsbAotICAgICAqIHRoZSB2aWV3cG9ydCBvciBub3QuCisgICAgICogSW5kaWNhdGVzIHRoaXMgSG9yaXpvbnRhbFNjcm9sbFZpZXcgd2hldGhlciBpdCBzaG91bGQgc3RyZXRjaCBpdHMgY29udGVudCB3aWR0aAorICAgICAqIHRvIGZpbGwgdGhlIHZpZXdwb3J0IG9yIG5vdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxsVmlld3BvcnQgVHJ1ZSB0byBzdHJldGNoIHRoZSBjb250ZW50J3Mgd2lkdGggdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0hvcml6b250YWxTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbGxWaWV3cG9ydChib29sZWFuIGZpbGxWaWV3cG9ydCkgewogICAgICAgICBpZiAoZmlsbFZpZXdwb3J0ICE9IG1GaWxsVmlld3BvcnQpIHsKQEAgLTQ2OCw5ICs0NjMsNiBAQAogICAgICAgICAgICAgICAgIC8qIFJlbGVhc2UgdGhlIGRyYWcgKi8KICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwotICAgICAgICAgICAgICAgIGlmIChtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOgogICAgICAgICAgICAgICAgIG9uU2Vjb25kYXJ5UG9pbnRlclVwKGV2KTsKQEAgLTUyOCwyNiArNTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlbHRhWCA9IChpbnQpIChtTGFzdE1vdGlvblggLSB4KTsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RNb3Rpb25YID0geDsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2xkWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbEJ5KGRlbHRhWCwgMCwgbVNjcm9sbFgsIDAsIHJhbmdlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UsIDAsIHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBvdXIgdmVsb2NpdHkgaWYgd2UgaGl0IGEgc2Nyb2xsIGJhcnJpZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxNb2RlID0gZ2V0T3ZlcnNjcm9sbE1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwdWxsZWRUb1ggPSBvbGRYICsgZGVsdGFYOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB1bGxlZFRvWCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dMZWZ0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdWxsZWRUb1ggPiByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUHVsbCgoZmxvYXQpIGRlbHRhWCAvIGdldFdpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbEJ5KGRlbHRhWCwgMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CkBAIC01NTYsMTUgKzUyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAsIG1NYXhpbXVtVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFZlbG9jaXR5ID0gKGludCkgdmVsb2NpdHlUcmFja2VyLmdldFhWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChNYXRoLmFicyhpbml0aWFsVmVsb2NpdHkpID4gbU1pbmltdW1WZWxvY2l0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCByaWdodCwgMCwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldENoaWxkQ291bnQoKSA+IDAgJiYgTWF0aC5hYnMoaW5pdGlhbFZlbG9jaXR5KSA+IG1NaW5pbXVtVmVsb2NpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwpAQCAtNTc0LDI3ICs1NDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0Lm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgIGlmIChtSXNCZWluZ0RyYWdnZWQgJiYgZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLCAwLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CiAgICAgICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAobVZlbG9jaXR5VHJhY2tlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MjEsMjIgKzU3Niw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFgpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIGdldFNjcm9sbFJhbmdlKCksIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewogICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwogICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewpAQCAtMTAxOSwxNiArOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBjb250ZW50V2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0UmlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcm9sbFggPSBtU2Nyb2xsWDsKLSAgICAgICAgZmluYWwgaW50IG92ZXJzY3JvbGxSaWdodCA9IE1hdGgubWF4KDAsIHNjcm9sbFJhbmdlIC0gY29udGVudFdpZHRoKTsKLSAgICAgICAgaWYgKHNjcm9sbFggPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxYOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFggPiBvdmVyc2Nyb2xsUmlnaHQpIHsKLSAgICAgICAgICAgIHNjcm9sbFJhbmdlICs9IHNjcm9sbFggLSBvdmVyc2Nyb2xsUmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7CisgICAgICAgIHJldHVybiBnZXRDaGlsZEF0KDApLmdldFJpZ2h0KCk7CiAgICAgfQogICAgIAogICAgIEBPdmVycmlkZQpAQCAtMTA4OSwyMCArMTAxOSwxNCBAQAogICAgICAgICAgICAgaW50IHggPSBtU2Nyb2xsZXIuZ2V0Q3VyclgoKTsKICAgICAgICAgICAgIGludCB5ID0gbVNjcm9sbGVyLmdldEN1cnJZKCk7CiAKLSAgICAgICAgICAgIGlmIChvbGRYICE9IHggfHwgb2xkWSAhPSB5KSB7Ci0gICAgICAgICAgICAgICAgb3ZlcnNjcm9sbEJ5KHggLSBvbGRYLCB5IC0gb2xkWSwgb2xkWCwgb2xkWSwgZ2V0U2Nyb2xsUmFuZ2UoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVyZmxpbmdEaXN0YW5jZSwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZChtU2Nyb2xsWCwgbVNjcm9sbFksIG9sZFgsIG9sZFkpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJhbmdlID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsTW9kZSA9PSBPVkVSU0NST0xMX0FMV0FZUyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTICYmIHJhbmdlID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwICYmIG9sZFggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHggPiByYW5nZSAmJiBvbGRYIDw9IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dSaWdodC5vbkFic29yYigoaW50KSBtU2Nyb2xsZXIuZ2V0Q3VyclZlbG9jaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KDApOworICAgICAgICAgICAgICAgIHggPSBjbGFtcCh4LCBnZXRXaWR0aCgpIC0gbVBhZGRpbmdSaWdodCAtIG1QYWRkaW5nTGVmdCwgY2hpbGQuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICAgICAgeSA9IGNsYW1wKHksIGdldEhlaWdodCgpIC0gbVBhZGRpbmdCb3R0b20gLSBtUGFkZGluZ1RvcCwgY2hpbGQuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IG9sZFggfHwgeSAhPSBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgIG1TY3JvbGxYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFkgPSB5OworICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQoeCwgeSwgb2xkWCwgb2xkWSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwpAQCAtMTMzOSw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIGludCByaWdodCA9IGdldENoaWxkQXQoMCkuZ2V0V2lkdGgoKTsKICAgICAKICAgICAgICAgICAgIG1TY3JvbGxlci5mbGluZyhtU2Nyb2xsWCwgbVNjcm9sbFksIHZlbG9jaXR5WCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIHJpZ2h0IC0gd2lkdGgpLCAwLCAwLCB3aWR0aC8yLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgcmlnaHQgLSB3aWR0aCksIDAsIDApOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdSaWdodCA9IHZlbG9jaXR5WCA+IDA7CiAgICAgCkBAIC0xMzc3LDU2ICsxMzAxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtb2RlICE9IE9WRVJTQ1JPTExfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChtRWRnZUdsb3dMZWZ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGVkZ2UgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2VkZ2UpOwotICAgICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlIGdsb3cgPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5vdmVyc2Nyb2xsX2dsb3cpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd0xlZnQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRWRnZUdsb3dMZWZ0ID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd1JpZ2h0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRPdmVyc2Nyb2xsTW9kZShtb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIuZHJhdyhjYW52YXMpOwotICAgICAgICBpZiAobUVkZ2VHbG93TGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWCA9IG1TY3JvbGxYOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dMZWZ0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMjcwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1oZWlnaHQgKiAxLjVmLCBNYXRoLm1pbigwLCBzY3JvbGxYKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93TGVmdC5zZXRTaXplKGdldEhlaWdodCgpICogMiwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd0xlZnQuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd1JpZ2h0LmlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXN0b3JlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgY2FudmFzLnJvdGF0ZSg5MCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtaGVpZ2h0IC8gMiwgLShNYXRoLm1heChnZXRTY3JvbGxSYW5nZSgpLCBzY3JvbGxYKSArIHdpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93UmlnaHQuc2V0U2l6ZShoZWlnaHQgKiAyLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1JpZ2h0LmRyYXcoY2FudmFzKSkgewotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBpbnQgY2xhbXAoaW50IG4sIGludCBteSwgaW50IGNoaWxkKSB7CiAgICAgICAgIGlmIChteSA+PSBjaGlsZCB8fCBuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCmluZGV4IDEyYTY4ZGIuLmQ2ODBmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZUJ1dHRvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQnV0dG9ufSwgd2l0aCB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQKICAqIHRoYXQgY2hhbmdlcyBjb2xvciBkdXJpbmcgZGlmZmVyZW50IGJ1dHRvbiBzdGF0ZXMuIFRoZSBpbWFnZSBvbiB0aGUgc3VyZmFjZQogICogb2YgdGhlIGJ1dHRvbiBpcyBkZWZpbmVkIGVpdGhlciBieSB0aGUge0Bjb2RlIGFuZHJvaWQ6c3JjfSBhdHRyaWJ1dGUgaW4gdGhlCi0gKiB7QGNvZGUgJmx0O0ltYWdlQnV0dG9uJmd0O30gWE1MIGVsZW1lbnQgb3IgYnkgdGhlIAorICoge0Bjb2RlIDxJbWFnZUJ1dHRvbj59IFhNTCBlbGVtZW50IG9yIGJ5IHRoZQogICoge0BsaW5rICNzZXRJbWFnZVJlc291cmNlKGludCl9IG1ldGhvZC48L3A+CiAgKiAKICAqIDxwPlRvIHJlbW92ZSB0aGUgc3RhbmRhcmQgYnV0dG9uIGJhY2tncm91bmQgaW1hZ2UsIGRlZmluZSB5b3VyIG93biAKQEAgLTU3LDcgKzU3LDcgQEAKICAqIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbWFnZXMKICAqIGRlZmluZWQgaW4gdGhlIFhNTC48L3A+CiAgKgotICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgJmx0O2l0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQorICogPHA+VGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgPGl0ZW0+fSBlbGVtZW50cyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGV5IGFyZQogICogZXZhbHVhdGVkIGluIG9yZGVyLiBUaGlzIGlzIHdoeSB0aGUgIm5vcm1hbCIgYnV0dG9uIGltYWdlIGNvbWVzIGxhc3QsIGJlY2F1c2UKICAqIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIGFmdGVyIHtAY29kZSBhbmRyb2lkOnN0YXRlX3ByZXNzZWR9IGFuZCB7QGNvZGUKICAqIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZH0gaGF2ZSBib3RoIGV2YWx1YXRlZCBmYWxzZS48L3A+CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggZmFmMDgyZC4uMWU1NDg5YSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtNDMsNiArNDMsMTMgQEAKICAqIDxwPgogICogQWxzbyBzZWUge0BsaW5rIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0LkxheW91dFBhcmFtc30KICAqIGZvciBsYXlvdXQgYXR0cmlidXRlcyA8L3A+CisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9ncmF2aXR5CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfbWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQKKyAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0xpbmVhckxheW91dF9vcmllbnRhdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X3dlaWdodFN1bQogICovCiBAUmVtb3RlVmlldwogcHVibGljIGNsYXNzIExpbmVhckxheW91dCBleHRlbmRzIFZpZXdHcm91cCB7CkBAIC0xMTcsNyArMTI0LDExIEBACiAgICAgfQogCiAgICAgcHVibGljIExpbmVhckxheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGluZWFyTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKIAogICAgICAgICBUeXBlZEFycmF5IGEgPSAKICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0KTsKQEAgLTE0Miw4ICsxNTMsNyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA9CiAgICAgICAgICAgICAgICAgYS5nZXRJbnQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X2Jhc2VsaW5lQWxpZ25lZENoaWxkSW5kZXgsIC0xKTsKIAotICAgICAgICAvLyBUT0RPOiBCZXR0ZXIgbmFtZSwgYWRkIEphdmEgQVBJcywgbWFrZSBpdCBwdWJsaWMKLSAgICAgICAgbVVzZUxhcmdlc3RDaGlsZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaW5lYXJMYXlvdXRfdXNlTGFyZ2VzdENoaWxkLCBmYWxzZSk7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBhLmdldEJvb2xlYW4oUi5zdHlsZWFibGUuTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkLCBmYWxzZSk7CiAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQpAQCAtMTcyLDYgKzE4MiwzMyBAQAogICAgICAgICBtQmFzZWxpbmVBbGlnbmVkID0gYmFzZWxpbmVBbGlnbmVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFdoZW4gdHJ1ZSwgYWxsIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgd2lsbCBiZSBjb25zaWRlcmVkIGhhdmluZworICAgICAqIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQuIElmIGZhbHNlLCBhbGwgY2hpbGRyZW4gYXJlCisgICAgICogbWVhc3VyZWQgbm9ybWFsbHkuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQorICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVVzZUxhcmdlc3RDaGlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIHNldCB0byB0cnVlLCBhbGwgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB3aWxsIGJlIGNvbnNpZGVyZWQgaGF2aW5nCisgICAgICogdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZC4gSWYgZmFsc2UsIGFsbCBjaGlsZHJlbiBhcmUKKyAgICAgKiBtZWFzdXJlZCBub3JtYWxseS4KKyAgICAgKiAKKyAgICAgKiBEaXNhYmxlZCBieSBkZWZhdWx0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBlbmFibGVkIFRydWUgdG8gbWVhc3VyZSBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHVzaW5nIHRoZQorICAgICAqICAgICAgICBtaW5pbXVtIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1Vc2VMYXJnZXN0Q2hpbGQgPSBlbmFibGVkOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0QmFzZWxpbmUoKSB7CiAgICAgICAgIGlmIChtQmFzZWxpbmVBbGlnbmVkQ2hpbGRJbmRleCA8IDApIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDY0ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PblRvdWNoTGlzdGVuZXI7CisKKy8qKgorICogQSBMaXN0UG9wdXBXaW5kb3cgYW5jaG9ycyBpdHNlbGYgdG8gYSBob3N0IHZpZXcgYW5kIGRpc3BsYXlzIGEKKyAqIGxpc3Qgb2YgY2hvaWNlcy4KKyAqIAorICogPHA+TGlzdFBvcHVwV2luZG93IGNvbnRhaW5zIGEgbnVtYmVyIG9mIHRyaWNreSBiZWhhdmlvcnMgc3Vycm91bmRpbmcKKyAqIHBvc2l0aW9uaW5nLCBzY3JvbGxpbmcgcGFyZW50cyB0byBmaXQgdGhlIGRyb3Bkb3duLCBpbnRlcmFjdGluZworICogc2FuZWx5IHdpdGggdGhlIElNRSBpZiBwcmVzZW50LCBhbmQgb3RoZXJzLgorICogCisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3CisgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LlNwaW5uZXIKKyAqLworcHVibGljIGNsYXNzIExpc3RQb3B1cFdpbmRvdyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMaXN0UG9wdXBXaW5kb3ciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIHVzZXIKKyAgICAgKiBtdXN0IGxlYXZlIGEgcG9pbnRlciBkb3duIHdpdGhvdXQgc2Nyb2xsaW5nIHRvIGV4cGFuZAorICAgICAqIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gbGlzdCB0byBjb3ZlciB0aGUgSU1FLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBBTkRfTElTVF9USU1FT1VUID0gMjUwOworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBEcm9wRG93bkxpc3RWaWV3IG1Ecm9wRG93bkxpc3Q7CisKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25IZWlnaHQgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICBwcml2YXRlIGludCBtRHJvcERvd25XaWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOworICAgIHByaXZhdGUgaW50IG1Ecm9wRG93bkhvcml6b250YWxPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbURyb3BEb3duVmVydGljYWxPZmZzZXQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyb3BEb3duQWx3YXlzVmlzaWJsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggPSBmYWxzZTsKKworICAgIHByaXZhdGUgVmlldyBtUHJvbXB0VmlldzsKKyAgICBwcml2YXRlIGludCBtUHJvbXB0UG9zaXRpb24gPSBQT1NJVElPTl9QUk9NUFRfQUJPVkU7CisKKyAgICBwcml2YXRlIERhdGFTZXRPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICBwcml2YXRlIFZpZXcgbURyb3BEb3duQW5jaG9yVmlldzsKKworICAgIHByaXZhdGUgRHJhd2FibGUgbURyb3BEb3duTGlzdEhpZ2hsaWdodDsKKworICAgIHByaXZhdGUgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciBtSXRlbUNsaWNrTGlzdGVuZXI7CisgICAgcHJpdmF0ZSBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyIG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVzaXplUG9wdXBSdW5uYWJsZSBtUmVzaXplUG9wdXBSdW5uYWJsZSA9IG5ldyBSZXNpemVQb3B1cFJ1bm5hYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFRvdWNoSW50ZXJjZXB0b3IgbVRvdWNoSW50ZXJjZXB0b3IgPSBuZXcgUG9wdXBUb3VjaEludGVyY2VwdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQb3B1cFNjcm9sbExpc3RlbmVyIG1TY3JvbGxMaXN0ZW5lciA9IG5ldyBQb3B1cFNjcm9sbExpc3RlbmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0U2VsZWN0b3JIaWRlciBtSGlkZVNlbGVjdG9yID0gbmV3IExpc3RTZWxlY3RvckhpZGVyKCk7CisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtU2hvd0Ryb3BEb3duUnVubmFibGU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbU1vZGFsOworCisgICAgLyoqCisgICAgICogVGhlIHByb3ZpZGVkIHByb21wdCB2aWV3IHNob3VsZCBhcHBlYXIgYWJvdmUgbGlzdCBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzZWUgI3NldFByb21wdFBvc2l0aW9uKGludCkKKyAgICAgKiBAc2VlICNnZXRQcm9tcHRQb3NpdGlvbigpCisgICAgICogQHNlZSAjc2V0UHJvbXB0VmlldyhWaWV3KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU0lUSU9OX1BST01QVF9BQk9WRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvdmlkZWQgcHJvbXB0IHZpZXcgc2hvdWxkIGFwcGVhciBiZWxvdyBsaXN0IGNvbnRlbnQuCisgICAgICogCisgICAgICogQHNlZSAjc2V0UHJvbXB0UG9zaXRpb24oaW50KQorICAgICAqIEBzZWUgI2dldFByb21wdFBvc2l0aW9uKCkKKyAgICAgKiBAc2VlICNzZXRQcm9tcHRWaWV3KFZpZXcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TSVRJT05fUFJPTVBUX0JFTE9XID0gMTsKKworICAgIC8qKgorICAgICAqIEFsaWFzIGZvciB7QGxpbmsgVmlld0dyb3VwLkxheW91dFBhcmFtcyNNQVRDSF9QQVJFTlR9LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIHdpZHRoLCB0aGUgcG9wdXAgd2lsbCBtYXRjaCB0aGUgd2lkdGggb2YgdGhlIGFuY2hvciB2aWV3LgorICAgICAqIElmIHVzZWQgdG8gc3BlY2lmeSBhIHBvcHVwIGhlaWdodCwgdGhlIHBvcHVwIHdpbGwgZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUEFSRU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogQWxpYXMgZm9yIHtAbGluayBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zI1dSQVBfQ09OVEVOVH0uCisgICAgICogSWYgdXNlZCB0byBzcGVjaWZ5IGEgcG9wdXAgd2lkdGgsIHRoZSBwb3B1cCB3aWxsIHVzZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUF9DT05URU5UID0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoZQorICAgICAqIGlucHV0IG1ldGhvZCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGZvY3VzYWJpbGl0eSBvZiB0aGUgcG9wdXAuICBUaGF0IGlzCisgICAgICogaWYgaXQgaXMgZm9jdXNhYmxlIHRoYW4gaXQgbmVlZHMgdG8gd29yayB3aXRoIHRoZSBpbnB1dCBtZXRob2QsIGVsc2UKKyAgICAgKiBpdCBkb2Vzbid0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRSA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9GUk9NX0ZPQ1VTQUJMRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBNb2RlIGZvciB7QGxpbmsgI3NldElucHV0TWV0aG9kTW9kZShpbnQpfTogdGhpcyBwb3B1cCBhbHdheXMgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGFsc28gb3BlcmF0ZQorICAgICAqIHRoZSBpbnB1dCBtZXRob2Qgd2hpbGUgaXQgaXMgc2hvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfTUVUSE9EX05FRURFRCA9IFBvcHVwV2luZG93LklOUFVUX01FVEhPRF9ORUVERUQ7CisgICAgCisgICAgLyoqCisgICAgICogTW9kZSBmb3Ige0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX06IHRoaXMgcG9wdXAgbmV2ZXIgbmVlZHMgdG8KKyAgICAgKiB3b3JrIHdpdGggYW4gaW5wdXQgbWV0aG9kLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZm9jdXNhYmxlLiAgVGhpcworICAgICAqIG1lYW5zIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgZGlzcGxheWVkIHRvIHVzZSBhcyBtdWNoIHNwYWNlIG9uIHRoZQorICAgICAqIHNjcmVlbiBhcyBuZWVkZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGNvdmVycyB0aGUgaW5wdXQgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX01FVEhPRF9OT1RfTkVFREVEID0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcsIGVtcHR5IHBvcHVwIHdpbmRvdyBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgaXRlbXMgZnJvbSBhIExpc3RBZGFwdGVyLgorICAgICAqIEJhY2tncm91bmRzIHNob3VsZCBiZSBzZXQgdXNpbmcge0BsaW5rICNzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUpfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHVzZWQgZm9yIGNvbnRhaW5lZCB2aWV3cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldywgZW1wdHkgcG9wdXAgd2luZG93IGNhcGFibGUgb2YgZGlzcGxheWluZyBpdGVtcyBmcm9tIGEgTGlzdEFkYXB0ZXIuCisgICAgICogQmFja2dyb3VuZHMgc2hvdWxkIGJlIHNldCB1c2luZyB7QGxpbmsgI3NldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSl9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdXNlZCBmb3IgY29udGFpbmVkIHZpZXdzLgorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGZyb20gaW5mbGF0aW5nIHBhcmVudCB2aWV3cyB1c2VkIHRvIHN0eWxlIHRoZSBwb3B1cC4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGVBdHRyIERlZmF1bHQgc3R5bGUgYXR0cmlidXRlIHRvIHVzZSBmb3IgcG9wdXAgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFBvcHVwV2luZG93KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3LCBlbXB0eSBwb3B1cCB3aW5kb3cgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGl0ZW1zIGZyb20gYSBMaXN0QWRhcHRlci4KKyAgICAgKiBCYWNrZ3JvdW5kcyBzaG91bGQgYmUgc2V0IHVzaW5nIHtAbGluayAjc2V0QmFja2dyb3VuZERyYXdhYmxlKERyYXdhYmxlKX0uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB1c2VkIGZvciBjb250YWluZWQgdmlld3MuCisgICAgICogQHBhcmFtIGF0dHJzIEF0dHJpYnV0ZXMgZnJvbSBpbmZsYXRpbmcgcGFyZW50IHZpZXdzIHVzZWQgdG8gc3R5bGUgdGhlIHBvcHVwLgorICAgICAqIEBwYXJhbSBkZWZTdHlsZUF0dHIgU3R5bGUgYXR0cmlidXRlIHRvIHJlYWQgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqIEBwYXJhbSBkZWZTdHlsZVJlcyBTdHlsZSByZXNvdXJjZSBJRCB0byB1c2UgZm9yIGRlZmF1bHQgc3R5bGluZyBvZiBwb3B1cCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0UG9wdXBXaW5kb3coQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Qb3B1cCA9IG5ldyBQb3B1cFdpbmRvdyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHRoZSBkYXRhIGFuZCB0aGUgdmlld3MgdG8gcmVwcmVzZW50IHRoZSBkYXRhCisgICAgICogaW4gdGhpcyBwb3B1cCB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgYWRhcHRlciB0byB1c2UgdG8gY3JlYXRlIHRoaXMgd2luZG93J3MgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBuZXcgUG9wdXBEYXRhU2V0T2JzZXJ2ZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtQWRhcHRlci51bnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG1PYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobURyb3BEb3duTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLiBUaGUgZGVmYXVsdCBpcworICAgICAqIHtAbGluayAjUE9TSVRJT05fUFJPTVBUX0FCT1ZFfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gQSBwb3NpdGlvbiBjb25zdGFudCBkZWNsYXJpbmcgd2hlcmUgdGhlIHByb21wdCBzaG91bGQgYmUgZGlzcGxheWVkLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFBvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBtUHJvbXB0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXJlIHRoZSBvcHRpb25hbCBwcm9tcHQgdmlldyBzaG91bGQgYXBwZWFyLgorICAgICAqIAorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9BQk9WRQorICAgICAqIEBzZWUgI1BPU0lUSU9OX1BST01QVF9CRUxPVworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UHJvbXB0UG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtUHJvbXB0UG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhpcyB3aW5kb3cgc2hvdWxkIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogPHA+SWYgYSBwb3B1cCB3aW5kb3cgaXMgbW9kYWwsIGl0IHdpbGwgcmVjZWl2ZSBhbGwgdG91Y2ggYW5kIGtleSBpbnB1dC4KKyAgICAgKiBJZiB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgdGhlIHBvcHVwIHdpbmRvdydzIGNvbnRlbnQgYXJlYSB0aGUgcG9wdXAgd2luZG93CisgICAgICogd2lsbCBiZSBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1vZGFsIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgd2luZG93IHNob3VsZCBiZSBtb2RhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kYWwoYm9vbGVhbiBtb2RhbCkgeworICAgICAgICBtTW9kYWwgPSB0cnVlOworICAgICAgICBtUG9wdXAuc2V0Rm9jdXNhYmxlKG1vZGFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsIHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBvcHVwIHdpbmRvdyB3aWxsIGJlIG1vZGFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGFsKCkgeworICAgICAgICByZXR1cm4gbU1vZGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlcyBvdXRzaWRlIHRvdWNoZXMgdG8gYmUgaWdub3JlZC4gTm9ybWFsbHkgaWYge0BsaW5rICNpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpfSBpcworICAgICAqIGZhbHNlLCB3ZSBhbGxvdyBvdXRzaWRlIHRvdWNoIHRvIGRpc21pc3MgdGhlIGRyb3Bkb3duLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVuIHdlCisgICAgICogaWdub3JlIG91dHNpZGUgdG91Y2ggZXZlbiB3aGVuIHRoZSBkcm9wIGRvd24gaXMgbm90IHNldCB0byBhbHdheXMgdmlzaWJsZS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSBVc2VkIG9ubHkgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdG8gaGFuZGxlIHNvbWUgaW50ZXJuYWwgc3BlY2lhbCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZUlnbm9yZU91dHNpZGVUb3VjaChib29sZWFuIGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoKSB7CisgICAgICAgIG1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCA9IGZvcmNlSWdub3JlT3V0c2lkZVRvdWNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgZHJvcC1kb3duIHNob3VsZCByZW1haW4gdmlzaWJsZSB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgICAgICoKKyAgICAgKiBUaGUgZHJvcC1kb3duIHdpbGwgb2NjdXB5IHRoZSBlbnRpcmUgc2NyZWVuIGJlbG93IHtAbGluayAjZ2V0QW5jaG9yVmlld30gcmVnYXJkbGVzcworICAgICAqIG9mIHRoZSBzaXplIG9yIGNvbnRlbnQgb2YgdGhlIGxpc3QuICB7QGxpbmsgI2dldEJhY2tncm91bmQoKX0gd2lsbCBmaWxsIGFueSBzcGFjZQorICAgICAqIHRoYXQgaXMgbm90IHVzZWQgYnkgdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJvcERvd25BbHdheXNWaXNpYmxlIFdoZXRoZXIgdG8ga2VlcCB0aGUgZHJvcC1kb3duIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAaGlkZSBPbmx5IHVzZWQgYnkgQXV0b0NvbXBsZXRlVGV4dFZpZXcgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyb3BEb3duQWx3YXlzVmlzaWJsZShib29sZWFuIGRyb3BEb3duQWx3YXlzVmlzaWJsZSkgeworICAgICAgICBtRHJvcERvd25BbHdheXNWaXNpYmxlID0gZHJvcERvd25BbHdheXNWaXNpYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZHJvcC1kb3duIGlzIHZpc2libGUgdW5kZXIgc3BlY2lhbCBjb25kaXRpb25zLgorICAgICAqCisgICAgICogQGhpZGUgT25seSB1c2VkIGJ5IEF1dG9Db21wbGV0ZVRleHRWaWV3IHVuZGVyIHNwZWNpYWwgY29uZGl0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Ryb3BEb3duQWx3YXlzVmlzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFsd2F5c1Zpc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzb2Z0IGlucHV0IGFyZWEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgZGVzaXJlZCBtb2RlLCBzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlfQorICAgICAqICAgICAgICBmb3IgdGhlIGZ1bGwgbGlzdAorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMjc29mdElucHV0TW9kZQorICAgICAqIEBzZWUgI2dldFNvZnRJbnB1dE1vZGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNvZnRJbnB1dE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldFNvZnRJbnB1dE1vZGUobW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBpbiB7QGxpbmsgI3NldFNvZnRJbnB1dE1vZGUoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb2Z0SW5wdXRNb2RlKGludCkKKyAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNzb2Z0SW5wdXRNb2RlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb2Z0SW5wdXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldFNvZnRJbnB1dE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSBsaXN0IGl0ZW0gc2VsZWN0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHNlbGVjdG9yIExpc3Qgc2VsZWN0b3IgZHJhd2FibGUgdG8gdXNlIGluIHRoZSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0U2VsZWN0b3IoRHJhd2FibGUgc2VsZWN0b3IpIHsKKyAgICAgICAgbURyb3BEb3duTGlzdEhpZ2hsaWdodCA9IHNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgZHJhd2FibGUgZm9yIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldEJhY2tncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byBiZSB0aGUgYmFja2dyb3VuZCBmb3IgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZCBBIGRyYXdhYmxlIHRvIHNldCBhcyB0aGUgYmFja2dyb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBtUG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhbiBhbmltYXRpb24gc3R5bGUgdG8gdXNlIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyBzaG93biBvciBkaXNtaXNzZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGFuaW1hdGlvblN0eWxlIEFuaW1hdGlvbiBzdHlsZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5pbWF0aW9uU3R5bGUoaW50IGFuaW1hdGlvblN0eWxlKSB7CisgICAgICAgIG1Qb3B1cC5zZXRBbmltYXRpb25TdHlsZShhbmltYXRpb25TdHlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW5pbWF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcworICAgICAqIHNob3duIG9yIGRpc21pc3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuaW1hdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFuaW1hdGlvblN0eWxlKCkgeworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEFuaW1hdGlvblN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmlldyB0aGF0IHdpbGwgYmUgdXNlZCB0byBhbmNob3IgdGhpcyBwb3B1cC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSBwb3B1cCdzIGFuY2hvciB2aWV3CisgICAgICovCisgICAgcHVibGljIFZpZXcgZ2V0QW5jaG9yVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9wdXAncyBhbmNob3Igdmlldy4gVGhpcyBwb3B1cCB3aWxsIGFsd2F5cyBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvCisgICAgICogdGhlIGFuY2hvciB2aWV3IHdoZW4gc2hvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGFuY2hvciBUaGUgdmlldyB0byB1c2UgYXMgYW4gYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvclZpZXcoVmlldyBhbmNob3IpIHsKKyAgICAgICAgbURyb3BEb3duQW5jaG9yVmlldyA9IGFuY2hvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhpcyBwb3B1cCBmcm9tIGl0cyBhbmNob3IgdmlldyBpbiBwaXhlbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIHBvcHVwIGZyb20gaXRzIGFuY2hvciBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWZXJ0aWNhbE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoaXMgcG9wdXAgZnJvbSBpdHMgYW5jaG9yIHZpZXcgaW4gcGl4ZWxzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgcG9wdXAgZnJvbSBpdHMgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgbURyb3BEb3duVmVydGljYWxPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bldpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cgaW4gcGl4ZWxzLiBDYW4gYWxzbyBiZSB7QGxpbmsgI01BVENIX1BBUkVOVH0KKyAgICAgKiBvciB7QGxpbmsgI1dSQVBfQ09OVEVOVH0uCisgICAgICogCisgICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7CisgICAgICAgIG1Ecm9wRG93bldpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIHBvcHVwIHdpbmRvdyBieSB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC4gVGhlIGZpbmFsIHdpZHRoIG1heSBiZQorICAgICAqIGxhcmdlciB0byBhY2NvbW1vZGF0ZSBzdHlsZWQgd2luZG93IGRyZXNzaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoIERlc2lyZWQgd2lkdGggb2YgY29udGVudCBpbiBwaXhlbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFdpZHRoKGludCB3aWR0aCkgeworICAgICAgICBEcmF3YWJsZSBwb3B1cEJhY2tncm91bmQgPSBtUG9wdXAuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAocG9wdXBCYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ecm9wRG93bldpZHRoID0gcG9wdXBCYWNrZ3JvdW5kLmdldEludHJpbnNpY1dpZHRoKCkgKyB3aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIGhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93IGluIHBpeGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHBvcHVwIHdpbmRvdyBpbiBwaXhlbHMuIENhbiBhbHNvIGJlIHtAbGluayAjTUFUQ0hfUEFSRU5UfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Ecm9wRG93bkhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbGlja0xpc3RlbmVyIExpc3RlbmVyIHRvIHJlZ2lzdGVyCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNzZXRPbkl0ZW1DbGlja0xpc3RlbmVyKGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIGNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUl0ZW1DbGlja0xpc3RlbmVyID0gY2xpY2tMaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIGxpc3QgaXRlbSBpcyBzZWxlY3RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWRMaXN0ZW5lciBMaXN0ZW5lciB0byByZWdpc3Rlci4KKyAgICAgKiAKKyAgICAgKiBAc2VlIExpc3RWaWV3I3NldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIgc2VsZWN0ZWRMaXN0ZW5lcikgeworICAgICAgICBtSXRlbVNlbGVjdGVkTGlzdGVuZXIgPSBzZWxlY3RlZExpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIHZpZXcgdG8gYWN0IGFzIGEgdXNlciBwcm9tcHQgZm9yIHRoaXMgcG9wdXAgd2luZG93LiBXaGVyZSB0aGUgcHJvbXB0IHZpZXcgd2lsbCBhcHBlYXIKKyAgICAgKiBpcyBjb250cm9sbGVkIGJ5IHtAbGluayAjc2V0UHJvbXB0UG9zaXRpb24oaW50KX0uCisgICAgICogCisgICAgICogQHBhcmFtIHByb21wdCBWaWV3IHRvIHVzZSBhcyBhbiBpbmZvcm1hdGlvbmFsIHByb21wdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRWaWV3KFZpZXcgcHJvbXB0KSB7CisgICAgICAgIGJvb2xlYW4gc2hvd2luZyA9IGlzU2hvd2luZygpOworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICB9CisgICAgICAgIG1Qcm9tcHRWaWV3ID0gcHJvbXB0OworICAgICAgICBpZiAoc2hvd2luZykgeworICAgICAgICAgICAgc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9zdCBhIHtAbGluayAjc2hvdygpfSBjYWxsIHRvIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9zdFNob3coKSB7CisgICAgICAgIG1IYW5kbGVyLnBvc3QobVNob3dEcm9wRG93blJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBwb3B1cCBsaXN0LiBJZiB0aGUgbGlzdCBpcyBhbHJlYWR5IHNob3dpbmcsIHRoaXMgbWV0aG9kCisgICAgICogd2lsbCByZWNhbGN1bGF0ZSB0aGUgcG9wdXAncyBzaXplIGFuZCBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpbnQgaGVpZ2h0ID0gYnVpbGREcm9wRG93bigpOworCisgICAgICAgIGludCB3aWR0aFNwZWMgPSAwOworICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IDA7CisKKyAgICAgICAgYm9vbGVhbiBub0lucHV0TWV0aG9kID0gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpOworCisgICAgICAgIGlmIChtUG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aWR0aFNwZWMgPSBtRHJvcERvd25XaWR0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsIHRvIFBvcHVwV2luZG93J3MgdXBkYXRlIG1ldGhvZCBiZWxvdyBjYW4gYWNjZXB0IC0xIGZvciBhbnkKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSB5b3UgZG8gbm90IHdhbnQgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBub0lucHV0TWV0aG9kID8gaGVpZ2h0IDogVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICAgICAgaWYgKG5vSW5wdXRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgOiAwLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2luZG93TGF5b3V0TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobURyb3BEb3duSGVpZ2h0ID09IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IGhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0U3BlYyA9IG1Ecm9wRG93bkhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldE91dHNpZGVUb3VjaGFibGUoIW1Gb3JjZUlnbm9yZU91dHNpZGVUb3VjaCAmJiAhbURyb3BEb3duQWx3YXlzVmlzaWJsZSk7CisKKyAgICAgICAgICAgIG1Qb3B1cC51cGRhdGUoZ2V0QW5jaG9yVmlldygpLCBtRHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBtRHJvcERvd25WZXJ0aWNhbE9mZnNldCwgd2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25XaWR0aCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIHdpZHRoU3BlYyA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobURyb3BEb3duV2lkdGggPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldFdpZHRoKGdldEFuY2hvclZpZXcoKS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0V2lkdGgobURyb3BEb3duV2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgIGhlaWdodFNwZWMgPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1Ecm9wRG93bkhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgeworICAgICAgICAgICAgICAgICAgICBtUG9wdXAuc2V0SGVpZ2h0KGhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldEhlaWdodChtRHJvcERvd25IZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBvcHVwLnNldFdpbmRvd0xheW91dE1vZGUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHVzZSBvdXRzaWRlIHRvdWNoYWJsZSB0byBkaXNtaXNzIGRyb3AgZG93biB3aGVuIHRvdWNoaW5nIG91dHNpZGUgb2YgaXQsIHNvCisgICAgICAgICAgICAvLyBvbmx5IHNldCB0aGlzIGlmIHRoZSBkcm9wZG93biBpcyBub3QgYWx3YXlzIHZpc2libGUKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRPdXRzaWRlVG91Y2hhYmxlKCFtRm9yY2VJZ25vcmVPdXRzaWRlVG91Y2ggJiYgIW1Ecm9wRG93bkFsd2F5c1Zpc2libGUpOworICAgICAgICAgICAgbVBvcHVwLnNldFRvdWNoSW50ZXJjZXB0b3IobVRvdWNoSW50ZXJjZXB0b3IpOworICAgICAgICAgICAgbVBvcHVwLnNob3dBc0Ryb3BEb3duKGdldEFuY2hvclZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duSG9yaXpvbnRhbE9mZnNldCwgbURyb3BEb3duVmVydGljYWxPZmZzZXQpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRTZWxlY3Rpb24oTGlzdFZpZXcuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghbU1vZGFsIHx8IG1Ecm9wRG93bkxpc3QuaXNJblRvdWNoTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Nb2RhbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobUhpZGVTZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNtaXNzIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzbWlzcygpIHsKKyAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgcmVtb3ZlUHJvbXB0VmlldygpOworICAgICAgICBtUG9wdXAuc2V0Q29udGVudFZpZXcobnVsbCk7CisgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgYSBjYWxsYmFjayB3aGVuIHRoZSBwb3B1cCBpcyBkaXNtaXNzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHBvcHVwIGlzIGRpc21pc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPbkRpc21pc3NMaXN0ZW5lcihQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtUG9wdXAuc2V0T25EaXNtaXNzTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVQcm9tcHRWaWV3KCkgeworICAgICAgICBpZiAobVByb21wdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVmlld1BhcmVudCBwYXJlbnQgPSBtUHJvbXB0Vmlldy5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWaWV3R3JvdXAgZ3JvdXAgPSAoVmlld0dyb3VwKSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgZ3JvdXAucmVtb3ZlVmlldyhtUHJvbXB0Vmlldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250cm9sIGhvdyB0aGUgcG9wdXAgb3BlcmF0ZXMgd2l0aCBhbiBpbnB1dCBtZXRob2Q6IG9uZSBvZgorICAgICAqIHtAbGluayAjSU5QVVRfTUVUSE9EX0ZST01fRk9DVVNBQkxFfSwge0BsaW5rICNJTlBVVF9NRVRIT0RfTkVFREVEfSwKKyAgICAgKiBvciB7QGxpbmsgI0lOUFVUX01FVEhPRF9OT1RfTkVFREVEfS4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiB0aGUgcG9wdXAgaXMgc2hvd2luZywgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHRha2UgZWZmZWN0IG9ubHkKKyAgICAgKiB0aGUgbmV4dCB0aW1lIHRoZSBwb3B1cCBpcyBzaG93biBvciB0aHJvdWdoIGEgbWFudWFsIGNhbGwgdG8gdGhlIHtAbGluayAjc2hvdygpfQorICAgICAqIG1ldGhvZC48L3A+CisgICAgICogCisgICAgICogQHNlZSAjZ2V0SW5wdXRNZXRob2RNb2RlKCkKKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dE1ldGhvZE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShtb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgaW4ge0BsaW5rICNzZXRJbnB1dE1ldGhvZE1vZGUoaW50KX0uCisgICAgICogCisgICAgICogQHNlZSAjc2V0SW5wdXRNZXRob2RNb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldElucHV0TWV0aG9kTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlbGVjdGVkIHBvc2l0aW9uIG9mIHRoZSBsaXN0LgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICogCisgICAgICogQHBhcmFtIHBvc2l0aW9uIExpc3QgcG9zaXRpb24gdG8gc2V0IGFzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgRHJvcERvd25MaXN0VmlldyBsaXN0ID0gbURyb3BEb3duTGlzdDsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgbGlzdC5zZXRTZWxlY3Rpb24ocG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGxpc3QuZ2V0Q2hvaWNlTW9kZSgpICE9IExpc3RWaWV3LkNIT0lDRV9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBsaXN0LnNldEl0ZW1DaGVja2VkKHBvc2l0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGFueSBjdXJyZW50IGxpc3Qgc2VsZWN0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgd2hlbiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgdHJ1ZX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJMaXN0U2VsZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBEcm9wRG93bkxpc3RWaWV3IGxpc3QgPSBtRHJvcERvd25MaXN0OworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgbGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IHRydWU7CisgICAgICAgICAgICBsaXN0LmhpZGVTZWxlY3RvcigpOworICAgICAgICAgICAgbGlzdC5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcG9wdXAgaXMgY3VycmVudGx5IHNob3dpbmcsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5pc1Nob3dpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHBvcHVwIGlzIGNvbmZpZ3VyZWQgdG8gYXNzdW1lIHRoZSB1c2VyIGRvZXMgbm90IG5lZWQKKyAgICAgKiB0byBpbnRlcmFjdCB3aXRoIHRoZSBJTUUgd2hpbGUgaXQgaXMgc2hvd2luZywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dE1ldGhvZE5vdE5lZWRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cC5nZXRJbnB1dE1ldGhvZE1vZGUoKSA9PSBJTlBVVF9NRVRIT0RfTk9UX05FRURFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFuIGl0ZW0gY2xpY2sgb3BlcmF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBhZGFwdGVyIHBvc2l0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBBZGFwdGVyIHBvc2l0aW9uIGZvciBwZXJmb3JtaW5nIHRoZSBjbGljaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpY2sgYWN0aW9uIGNvdWxkIGJlIHBlcmZvcm1lZCwgZmFsc2UgaWYgbm90LgorICAgICAqICAgICAgICAgKGUuZy4gaWYgdGhlIHBvcHVwIHdhcyBub3Qgc2hvd2luZywgdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIGZhbHNlLikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSXRlbUNsaWNrKGludCBwb3NpdGlvbikgeworICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChtSXRlbUNsaWNrTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIERyb3BEb3duTGlzdFZpZXcgbGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGxpc3QuZ2V0Q2hpbGRBdChwb3NpdGlvbiAtIGxpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IGxpc3QuZ2V0QWRhcHRlcigpOworICAgICAgICAgICAgICAgIG1JdGVtQ2xpY2tMaXN0ZW5lci5vbkl0ZW1DbGljayhsaXN0LCBjaGlsZCwgcG9zaXRpb24sIGFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZiB0aGUgcG9wdXAgaXMgbm90IHNob3dpbmcuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBvciB7QGxpbmsgTGlzdFZpZXcjSU5WQUxJRF9QT1NJVElPTn0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSB7CisgICAgICAgIGlmICghaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0Vmlldy5JTlZBTElEX1BPU0lUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgSUQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIG9yIHtAbGluayBMaXN0VmlldyNJTlZBTElEX1JPV19JRH0KKyAgICAgKiBpZiB7QGxpbmsgI2lzU2hvd2luZygpfSA9PSB7QGNvZGUgZmFsc2V9LgorICAgICAqIAorICAgICAqIEBzZWUgTGlzdFZpZXcjZ2V0U2VsZWN0ZWRJdGVtSWQoKQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFNlbGVjdGVkSXRlbUlkKCkgeworICAgICAgICBpZiAoIWlzU2hvd2luZygpKSB7CisgICAgICAgICAgICByZXR1cm4gTGlzdFZpZXcuSU5WQUxJRF9ST1dfSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtSWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBWaWV3IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0gb3IgbnVsbCBpZgorICAgICAqIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSBmYWxzZX0uCisgICAgICogCisgICAgICogQHNlZSBMaXN0VmlldyNnZXRTZWxlY3RlZFZpZXcoKQorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldFNlbGVjdGVkVmlldygpIHsKKyAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRWaWV3KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIExpc3RWaWV3fSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBwb3B1cCB3aW5kb3cuCisgICAgICogT25seSB2YWxpZCB3aGVuIHtAbGluayAjaXNTaG93aW5nKCl9ID09IHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdFZpZXcgZ2V0TGlzdFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtRHJvcERvd25MaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleURvd24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCBmYWxzZSBpZiBpdCB3YXMgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXRNb2RhbChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gd2hlbiB0aGUgZHJvcCBkb3duIGlzIHNob3duLCB3ZSBkcml2ZSBpdCBkaXJlY3RseQorICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIC8vIHRoZSBrZXkgZXZlbnRzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIGxpc3QgaW4gdGhlIGRyb3AgZG93biB2aWV3CisgICAgICAgICAgICAvLyBub3RlIHRoYXQgTGlzdFZpZXcgaGFuZGxlcyBzcGFjZSBidXQgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbgorICAgICAgICAgICAgLy8gYWxzbyBpZiBzZWxlY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbiB0aGUgZHJvcCBkb3duLCB0aGVuIGRvbid0CisgICAgICAgICAgICAvLyBsZXQgY2VudGVyIG9yIGVudGVyIHByZXNzZXMgZ28gdGhlcmUgc2luY2UgdGhhdCB3b3VsZCBjYXVzZSBpdAorICAgICAgICAgICAgLy8gdG8gc2VsZWN0IG9uZSBvZiBpdHMgaXRlbXMKKyAgICAgICAgICAgIGlmIChrZXlDb2RlICE9IEtleUV2ZW50LktFWUNPREVfU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGtleUNvZGUgIT0gS2V5RXZlbnQuS0VZQ09ERV9FTlRFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYga2V5Q29kZSAhPSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VySW5kZXggPSBtRHJvcERvd25MaXN0LmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lZDsKKworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmVsb3cgPSAhbVBvcHVwLmlzQWJvdmVBbmNob3IoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RBZGFwdGVyIGFkYXB0ZXIgPSBtQWRhcHRlcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sZWFuIGFsbEVuYWJsZWQ7CisgICAgICAgICAgICAgICAgaW50IGZpcnN0SXRlbSA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIGludCBsYXN0SXRlbSA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxFbmFibGVkID0gYWRhcHRlci5hcmVBbGxJdGVtc0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtID0gYWxsRW5hYmxlZCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QubG9va0ZvclNlbGVjdGFibGVQb3NpdGlvbigwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBhbGxFbmFibGVkID8gYWRhcHRlci5nZXRDb3VudCgpIC0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5sb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKGFkYXB0ZXIuZ2V0Q291bnQoKSAtIDEsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKGJlbG93ICYmIGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQICYmIGN1ckluZGV4IDw9IGZpcnN0SXRlbSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTiAmJiBjdXJJbmRleCA+PSBsYXN0SXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSB0b3AsIHdlIGJsb2NrIHRoZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdG8gcHJldmVudCBmb2N1cyBmcm9tIG1vdmluZy4KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJMaXN0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIG1Qb3B1cC5zZXRJbnB1dE1ldGhvZE1vZGUoUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV0FSTklORzogUGxlYXNlIHJlYWQgdGhlIGNvbW1lbnQgd2hlcmUgbUxpc3RTZWxlY3Rpb25IaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgaXMgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiS2V5IGRvd246IGNvZGU9IiArIGtleUNvZGUgKyAiIGxpc3QgY29uc3VtZWQ9IiArIGNvbnN1bWVkKTsKKworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBoYW5kbGVkIHRoZSBrZXkgZXZlbnQsIHRoZW4gdGhlIHVzZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbmF2aWdhdGluZyBpbiB0aGUgbGlzdCwgc28gd2Ugc2hvdWxkIHB1dCBpdCBpbiBmcm9udC4KKyAgICAgICAgICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUncyBhIGxpdHRsZSB0cmljayB3ZSBuZWVkIHRvIGRvIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0IHZpZXcgaXMgYWN0dWFsbHkgc2hvd2luZyBpdHMgZm9jdXMgaW5kaWNhdG9yLAorICAgICAgICAgICAgICAgICAgICAvLyBieSBlbnN1cmluZyBpdCBoYXMgZm9jdXMgYW5kIGdldHRpbmcgaXRzIHdpbmRvdyBvdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdG91Y2ggbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5yZXF1ZXN0Rm9jdXNGcm9tVG91Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvdygpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgcGFzc2luZyB0aGUgZm9jdXMgZnJvbSB0aGUgdGV4dCB2aWV3IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfRFBBRF9VUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiZWxvdyAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfRFBBRF9ET1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGJvdHRvbSwgd2UgYmxvY2sgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCB0byBhdm9pZCBnb2luZyB0byB0aGUgbmV4dCBmb2N1c2FibGUgd2lkZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VySW5kZXggPT0gbGFzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYmVsb3cgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0RQQURfVVAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJJbmRleCA9PSBmaXJzdEl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBrZXkgZG93biBldmVudHMuIEJ5IGZvcndhcmRpbmcga2V5IHVwIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHZpZXdzIHVzaW5nIG5vbi1tb2RhbCBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgaGFuZGxlIGtleSBzZWxlY3Rpb24gb2YgaXRlbXMuCisgICAgICogIAorICAgICAqIEBwYXJhbSBrZXlDb2RlIGtleUNvZGUgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVVwCisgICAgICogQHBhcmFtIGV2ZW50IGV2ZW50IHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlVcAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGlzU2hvd2luZygpICYmIG1Ecm9wRG93bkxpc3QuZ2V0U2VsZWN0ZWRJdGVtUG9zaXRpb24oKSA+PSAwKSB7CisgICAgICAgICAgICBib29sZWFuIGNvbnN1bWVkID0gbURyb3BEb3duTGlzdC5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChjb25zdW1lZCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGlzdCBhY2NlcHRzIHRoZSBrZXkgZXZlbnRzIGFuZCB0aGUga2V5IGV2ZW50CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBhIGNsaWNrLCB0aGUgdGV4dCB2aWV3IGdldHMgdGhlIHNlbGVjdGVkIGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZHJvcCBkb3duIGFzIGl0cyBjb250ZW50CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9FTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgcHJlLUlNRSBrZXkgZXZlbnRzLiBCeSBmb3J3YXJkaW5nIHtAbGluayBWaWV3I29uS2V5UHJlSW1lKGludCwgS2V5RXZlbnQpfQorICAgICAqIGV2ZW50cyB0byB0aGlzIGZ1bmN0aW9uLCB2aWV3cyB1c2luZyBMaXN0UG9wdXBXaW5kb3cgY2FuIGhhdmUgaXQgZGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgKiB3aGVuIHRoZSBiYWNrIGtleSBpcyBwcmVzc2VkLgorICAgICAqICAKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBrZXlDb2RlIHBhcmFtIHBhc3NlZCB0byB0aGUgaG9zdCB2aWV3J3Mgb25LZXlQcmVJbWUKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgcGFyYW0gcGFzc2VkIHRvIHRoZSBob3N0IHZpZXcncyBvbktleVByZUltZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIGZhbHNlIGlmIGl0IHdhcyBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBzZWUgI3NldE1vZGFsKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlQcmVJbWUoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfQkFDSyAmJiBpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgYmFjayBrZXksIHdlIGRvIG5vdCBldmVuIHRyeSB0byBzZW5kIGl0CisgICAgICAgICAgICAvLyB0byB0aGUgZHJvcCBkb3duIGxpc3QgYnV0IGluc3RlYWQsIGNvbnN1bWUgaXQgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgYW5jaG9yVmlldyA9IG1Ecm9wRG93bkFuY2hvclZpZXc7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV04gJiYgZXZlbnQuZ2V0UmVwZWF0Q291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5zdGFydFRyYWNraW5nKGV2ZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgYW5jaG9yVmlldy5nZXRLZXlEaXNwYXRjaGVyU3RhdGUoKS5oYW5kbGVVcEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuaXNUcmFja2luZygpICYmICFldmVudC5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkJ1aWxkcyB0aGUgcG9wdXAgd2luZG93J3MgY29udGVudCBhbmQgcmV0dXJucyB0aGUgaGVpZ2h0IHRoZSBwb3B1cAorICAgICAqIHNob3VsZCBoYXZlLiBSZXR1cm5zIC0xIHdoZW4gdGhlIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMuPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudCdzIGhlaWdodCBvciAtMSBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnVpbGREcm9wRG93bigpIHsKKyAgICAgICAgVmlld0dyb3VwIGRyb3BEb3duVmlldzsKKyAgICAgICAgaW50IG90aGVySGVpZ2h0cyA9IDA7CisKKyAgICAgICAgaWYgKG1Ecm9wRG93bkxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbUNvbnRleHQ7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhpcyBSdW5uYWJsZSBleGlzdHMgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgY2hlY2tpbmcgaWYgdGhlIHZpZXcgbGF5b3V0IGhhcyBnb3QKKyAgICAgICAgICAgICAqIGNvbXBsZXRlZCBhbmQgaWYgc28gY2FsbCBzaG93RHJvcERvd24gdG8gZGlzcGxheSB0aGUgZHJvcCBkb3duLiBUaGlzIGlzIHVzZWQgdG8gc2hvdworICAgICAgICAgICAgICogdGhlIGRyb3AgZG93biBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHVzZXIgb3BlbnMgdXAgdGhlIHNlYXJjaCBkaWFsb2csIHdpdGhvdXQKKyAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIHRoZSBub3JtYWwgVUkgcGlwZWxpbmUgdG8gZG8gaXQncyBqb2Igd2hpY2ggaXMgc2xvd2VyIHRoYW4gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1TaG93RHJvcERvd25SdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZpZXcgbGF5b3V0IHNob3VsZCBiZSBhbGwgZG9uZSBiZWZvcmUgZGlzcGxheWluZyB0aGUgZHJvcCBkb3duLgorICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXRBbmNob3JWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwgJiYgdmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3QgPSBuZXcgRHJvcERvd25MaXN0Vmlldyhjb250ZXh0LCAhbU1vZGFsKTsKKyAgICAgICAgICAgIGlmIChtRHJvcERvd25MaXN0SGlnaGxpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldFNlbGVjdG9yKG1Ecm9wRG93bkxpc3RIaWdobGlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0VmVydGljYWxGYWRpbmdFZGdlRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIG1Ecm9wRG93bkxpc3Quc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtSXRlbUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEcm9wRG93bkxpc3RWaWV3IGRyb3BEb3duTGlzdCA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRG93bkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BEb3duTGlzdC5tTGlzdFNlbGVjdGlvbkhpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtRHJvcERvd25MaXN0LnNldE9uU2Nyb2xsTGlzdGVuZXIobVNjcm9sbExpc3RlbmVyKTsKKworICAgICAgICAgICAgaWYgKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURyb3BEb3duTGlzdC5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKG1JdGVtU2VsZWN0ZWRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IG1Ecm9wRG93bkxpc3Q7CisKKyAgICAgICAgICAgIFZpZXcgaGludFZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmIChoaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgYW4gaGludCBoYXMgYmVlbiBzcGVjaWZpZWQsIHdlIGFjY29tb2RhdGUgbW9yZSBzcGFjZSBmb3IgaXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRkIGEgdGV4dCB2aWV3IGluIHRoZSBkcm9wIGRvd24gbWVudSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdAorICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBoaW50Q29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCAwLCAxLjBmCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Qcm9tcHRQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0JFTE9XOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgaGludENvbnRhaW5lci5hZGRWaWV3KGhpbnRWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgUE9TSVRJT05fUFJPTVBUX0FCT1ZFOgorICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoaGludFZpZXcpOworICAgICAgICAgICAgICAgICAgICBoaW50Q29udGFpbmVyLmFkZFZpZXcoZHJvcERvd25WaWV3LCBoaW50UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgaGludCBwb3NpdGlvbiAiICsgbVByb21wdFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgaGludCdzIGhlaWdodCB0byBmaW5kIGhvdyBtdWNoIG1vcmUgdmVydGljYWwgc3BhY2UKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCB0byB0aGUgZHJvcCBkb3duJ3MgaGVpZ2h0CisgICAgICAgICAgICAgICAgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhtRHJvcERvd25XaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodFNwZWMgPSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDsKKyAgICAgICAgICAgICAgICBoaW50Vmlldy5tZWFzdXJlKHdpZHRoU3BlYywgaGVpZ2h0U3BlYyk7CisKKyAgICAgICAgICAgICAgICBoaW50UGFyYW1zID0gKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIGhpbnRWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIG90aGVySGVpZ2h0cyA9IGhpbnRWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBoaW50UGFyYW1zLnRvcE1hcmdpbgorICAgICAgICAgICAgICAgICAgICAgICAgKyBoaW50UGFyYW1zLmJvdHRvbU1hcmdpbjsKKworICAgICAgICAgICAgICAgIGRyb3BEb3duVmlldyA9IGhpbnRDb250YWluZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRDb250ZW50Vmlldyhkcm9wRG93blZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHJvcERvd25WaWV3ID0gKFZpZXdHcm91cCkgbVBvcHVwLmdldENvbnRlbnRWaWV3KCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBtUHJvbXB0VmlldzsKKyAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGhpbnRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgb3RoZXJIZWlnaHRzID0gdmlldy5nZXRNZWFzdXJlZEhlaWdodCgpICsgaGludFBhcmFtcy50b3BNYXJnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgaGludFBhcmFtcy5ib3R0b21NYXJnaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXggaGVpZ2h0IGF2YWlsYWJsZSBvbiB0aGUgc2NyZWVuIGZvciBhIHBvcHVwLgorICAgICAgICBib29sZWFuIGlnbm9yZUJvdHRvbURlY29yYXRpb25zID0KKyAgICAgICAgICAgICAgICBtUG9wdXAuZ2V0SW5wdXRNZXRob2RNb2RlKCkgPT0gUG9wdXBXaW5kb3cuSU5QVVRfTUVUSE9EX05PVF9ORUVERUQ7CisgICAgICAgIGZpbmFsIGludCBtYXhIZWlnaHQgPSBtUG9wdXAuZ2V0TWF4QXZhaWxhYmxlSGVpZ2h0KAorICAgICAgICAgICAgICAgIGdldEFuY2hvclZpZXcoKSwgbURyb3BEb3duVmVydGljYWxPZmZzZXQsIGlnbm9yZUJvdHRvbURlY29yYXRpb25zKTsKKworICAgICAgICAvLyBnZXRNYXhBdmFpbGFibGVIZWlnaHQoKSBzdWJ0cmFjdHMgdGhlIHBhZGRpbmcsIHNvIHdlIHB1dCBpdCBiYWNrLAorICAgICAgICAvLyB0byBnZXQgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB3aG9sZSB3aW5kb3cKKyAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbVBvcHVwLmdldEJhY2tncm91bmQoKTsKKyAgICAgICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRQYWRkaW5nKG1UZW1wUmVjdCk7CisgICAgICAgICAgICBwYWRkaW5nID0gbVRlbXBSZWN0LnRvcCArIG1UZW1wUmVjdC5ib3R0b207CisgICAgICAgIH0KKworICAgICAgICBpZiAobURyb3BEb3duQWx3YXlzVmlzaWJsZSB8fCBtRHJvcERvd25IZWlnaHQgPT0gVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCBMaXN0Vmlldy5OT19QT1NJVElPTiwgbWF4SGVpZ2h0IC0gb3RoZXJIZWlnaHRzLCAyKTsKKyAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKKyAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKKyAgICAgICAgaWYgKGxpc3RDb250ZW50ID4gMCkgb3RoZXJIZWlnaHRzICs9IHBhZGRpbmc7CisKKyAgICAgICAgcmV0dXJuIGxpc3RDb250ZW50ICsgb3RoZXJIZWlnaHRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIGEgTGlzdFZpZXcuIFRoaXMgd3JhcHBlciBjYW4gaGlqYWNrIHRoZSBmb2N1cyB0bworICAgICAqIG1ha2Ugc3VyZSB0aGUgbGlzdCB1c2VzIHRoZSBhcHByb3ByaWF0ZSBkcmF3YWJsZXMgYW5kIHN0YXRlcyB3aGVuCisgICAgICogZGlzcGxheWVkIG9uIHNjcmVlbiB3aXRoaW4gYSBkcm9wIGRvd24uIFRoZSBmb2N1cyBpcyBuZXZlciBhY3R1YWxseQorICAgICAqIHBhc3NlZCB0byB0aGUgZHJvcCBkb3duIGluIHRoaXMgbW9kZTsgdGhlIGxpc3Qgb25seSBsb29rcyBmb2N1c2VkLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEcm9wRG93bkxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTGlzdFBvcHVwV2luZG93LlRBRyArICIuRHJvcERvd25MaXN0VmlldyI7CisgICAgICAgIC8qCisgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHRvdWNoIG1vZGUgaXNzdWUuCisgICAgICAgICAqCisgICAgICAgICAqIFRvdWNoIG1vZGUgaXMgcHJvcGFnYXRlZCBsYXppbHkgdG8gd2luZG93cy4gVGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4KKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBzY2VuYXJpbzoKKyAgICAgICAgICogLSBUeXBlIHNvbWV0aGluZyBpbiB0aGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgYW5kIGdldCBzb21lIHJlc3VsdHMKKyAgICAgICAgICogLSBNb3ZlIGRvd24gd2l0aCB0aGUgZC1wYWQgdG8gc2VsZWN0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKKyAgICAgICAgICogLSBNb3ZlIHVwIHdpdGggdGhlIGQtcGFkIHVudGlsIHRoZSBzZWxlY3Rpb24gZGlzYXBwZWFycworICAgICAgICAgKiAtIFR5cGUgbW9yZSB0ZXh0IGluIHRoZSBBdXRvQ29tcGxldGVUZXh0VmlldyAqdXNpbmcgdGhlIHNvZnQga2V5Ym9hcmQqCisgICAgICAgICAqICAgYW5kIGdldCBuZXcgcmVzdWx0czsgeW91IGFyZSBub3cgaW4gdG91Y2ggbW9kZQorICAgICAgICAgKiAtIFRoZSBzZWxlY3Rpb24gY29tZXMgYmFjayBvbiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCwgZXZlbiB0aG91Z2gKKyAgICAgICAgICogICB0aGUgbGlzdCBpcyBzdXBwb3NlZCB0byBiZSBpbiB0b3VjaCBtb2RlCisgICAgICAgICAqCisgICAgICAgICAqIFVzaW5nIHRoZSBzb2Z0IGtleWJvYXJkIHRyaWdnZXJzIHRoZSB0b3VjaCBtb2RlIGNoYW5nZSBidXQgdGhhdCBjaGFuZ2UKKyAgICAgICAgICogaXMgcHJvcGFnYXRlZCB0byBvdXIgd2luZG93IG9ubHkgYWZ0ZXIgdGhlIGZpcnN0IGxpc3QgbGF5b3V0LCB0aGVyZWZvcmUKKyAgICAgICAgICogYWZ0ZXIgdGhlIGxpc3QgYXR0ZW1wdHMgdG8gcmVzdXJyZWN0IHRoZSBzZWxlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSB0cmljayB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGlzIHRvIHByZXRlbmQgdGhlIGxpc3QgaXMgaW4gdG91Y2gKKyAgICAgICAgICogbW9kZSB3aGVuIHdlIGtub3cgdGhhdCB0aGUgc2VsZWN0aW9uIHNob3VsZCBub3QgYXBwZWFyLCB0aGF0IGlzIHdoZW4KKyAgICAgICAgICogd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUgc2VsZWN0aW9uIGF3YXkgZnJvbSB0aGUgbGlzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBib29sZWFuIGlzIHNldCB0byB0cnVlIHdoZW5ldmVyIHdlIGV4cGxpY2l0bHkgaGlkZSB0aGUgbGlzdCdzCisgICAgICAgICAqIHNlbGVjdGlvbiBhbmQgcmVzZXQgdG8gZmFsc2Ugd2hlbmV2ZXIgd2Uga25vdyB0aGUgdXNlciBtb3ZlZCB0aGUKKyAgICAgICAgICogc2VsZWN0aW9uIGJhY2sgdG8gdGhlIGxpc3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gdGhpcyBib29sZWFuIGlzIHRydWUsIGlzSW5Ub3VjaE1vZGUoKSByZXR1cm5zIHRydWUsIG90aGVyd2lzZSBpdAorICAgICAgICAgKiByZXR1cm5zIHN1cGVyLmlzSW5Ub3VjaE1vZGUoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTGlzdFNlbGVjdGlvbkhpZGRlbjsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoaXMgd3JhcHBlciBzaG91bGQgZmFrZSBmb2N1cy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSGlqYWNrRm9jdXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPkNyZWF0ZXMgYSBuZXcgbGlzdCB2aWV3IHdyYXBwZXIuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGlzIHZpZXcncyBjb250ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRHJvcERvd25MaXN0VmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGlqYWNrRm9jdXMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5kcm9wRG93bkxpc3RWaWV3U3R5bGUpOworICAgICAgICAgICAgbUhpamFja0ZvY3VzID0gaGlqYWNrRm9jdXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+QXZvaWRzIGphcnJpbmcgc2Nyb2xsaW5nIGVmZmVjdCBieSBlbnN1cmluZyB0aGF0IGxpc3QgZWxlbWVudHMKKyAgICAgICAgICogbWFkZSBvZiBhIHRleHQgdmlldyBmaXQgb24gYSBzaW5nbGUgbGluZS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgaXRlbSBpbmRleCBpbiB0aGUgbGlzdCB0byBnZXQgYSB2aWV3IGZvcgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2aWV3IGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBWaWV3IG9idGFpblZpZXcoaW50IHBvc2l0aW9uLCBib29sZWFuW10gaXNTY3JhcCkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gc3VwZXIub2J0YWluVmlldyhwb3NpdGlvbiwgaXNTY3JhcCk7CisKKyAgICAgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgVGV4dFZpZXcpIHsKKyAgICAgICAgICAgICAgICAoKFRleHRWaWV3KSB2aWV3KS5zZXRIb3Jpem9udGFsbHlTY3JvbGxpbmcodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2aWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Ub3VjaE1vZGUoKSB7CisgICAgICAgICAgICAvLyBXQVJOSU5HOiBQbGVhc2UgcmVhZCB0aGUgY29tbWVudCB3aGVyZSBtTGlzdFNlbGVjdGlvbkhpZGRlbiBpcyBkZWNsYXJlZAorICAgICAgICAgICAgcmV0dXJuIChtSGlqYWNrRm9jdXMgJiYgbUxpc3RTZWxlY3Rpb25IaWRkZW4pIHx8IHN1cGVyLmlzSW5Ub3VjaE1vZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNXaW5kb3dGb2N1cygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGlqYWNrRm9jdXMgfHwgc3VwZXIuaGFzV2luZG93Rm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiA8cD5SZXR1cm5zIHRoZSBmb2N1cyBzdGF0ZSBpbiB0aGUgZHJvcCBkb3duLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGFsd2F5cyBpZiBoaWphY2tpbmcgZm9jdXMKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUhpamFja0ZvY3VzIHx8IHN1cGVyLmlzRm9jdXNlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPlJldHVybnMgdGhlIGZvY3VzIHN0YXRlIGluIHRoZSBkcm9wIGRvd24uPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzIGlmIGhpamFja2luZyBmb2N1cworICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaWphY2tGb2N1cyB8fCBzdXBlci5oYXNGb2N1cygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQb3B1cERhdGFTZXRPYnNlcnZlciBleHRlbmRzIERhdGFTZXRPYnNlcnZlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoKSB7CisgICAgICAgICAgICBpZiAoaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXNpemUgdGhlIHBvcHVwIHRvIGZpdCBuZXcgY29udGVudAorICAgICAgICAgICAgICAgIHNob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZWQoKSB7CisgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIExpc3RTZWxlY3RvckhpZGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckxpc3RTZWxlY3Rpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVzaXplUG9wdXBSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgbVBvcHVwLnNldElucHV0TWV0aG9kTW9kZShQb3B1cFdpbmRvdy5JTlBVVF9NRVRIT0RfTk9UX05FRURFRCk7CisgICAgICAgICAgICBzaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwVG91Y2hJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE9uVG91Y2hMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgaW50IHggPSAoaW50KSBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgeSA9IChpbnQpIGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTiAmJgorICAgICAgICAgICAgICAgICAgICBtUG9wdXAgIT0gbnVsbCAmJiBtUG9wdXAuaXNTaG93aW5nKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHggPj0gMCAmJiB4IDwgZ2V0V2lkdGgoKSAmJiB5ID49IDAgJiYgeSA8IGdldEhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1SZXNpemVQb3B1cFJ1bm5hYmxlLCBFWFBBTkRfTElTVF9USU1FT1VUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFBvcHVwU2Nyb2xsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Vmlldy5PblNjcm9sbExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25TY3JvbGwoQWJzTGlzdFZpZXcgdmlldywgaW50IGZpcnN0VmlzaWJsZUl0ZW0sIGludCB2aXNpYmxlSXRlbUNvdW50LAorICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1Db3VudCkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblNjcm9sbFN0YXRlQ2hhbmdlZChBYnNMaXN0VmlldyB2aWV3LCBpbnQgc2Nyb2xsU3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChzY3JvbGxTdGF0ZSA9PSBTQ1JPTExfU1RBVEVfVE9VQ0hfU0NST0xMICYmCisgICAgICAgICAgICAgICAgICAgICFpc0lucHV0TWV0aG9kTm90TmVlZGVkKCkgJiYgbVBvcHVwLmdldENvbnRlbnRWaWV3KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUmVzaXplUG9wdXBSdW5uYWJsZSk7CisgICAgICAgICAgICAgICAgbVJlc2l6ZVBvcHVwUnVubmFibGUucnVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCmluZGV4IDQ2Y2Q0NWEuLmY5YmRjNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0Vmlldy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwpAQCAtMjcsMTAgKzI4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5Db2xvckRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5Gb2N1c0ZpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CkBAIC00MSw2ICszOSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTY0LDEwICs2MywxMCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZW50cmllcwogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZGl2aWRlcgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfZGl2aWRlckhlaWdodAotICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfY2hvaWNlTW9kZQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGlzdFZpZXdfaGVhZGVyRGl2aWRlcnNFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaXN0Vmlld19mb290ZXJEaXZpZGVyc0VuYWJsZWQKICAqLworQFJlbW90ZVZpZXcKIHB1YmxpYyBjbGFzcyBMaXN0VmlldyBleHRlbmRzIEFic0xpc3RWaWV3IHsKICAgICAvKioKICAgICAgKiBVc2VkIHRvIGluZGljYXRlIGEgbm8gcHJlZmVyZW5jZSBmb3IgYSBwb3NpdGlvbiB0eXBlLgpAQCAtNzUsMjEgKzc0LDYgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IE5PX1BPU0lUSU9OID0gLTE7CiAKICAgICAvKioKLSAgICAgKiBOb3JtYWwgbGlzdCB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNob2ljZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfTU9ERV9OT05FID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IGFsbG93cyB1cCB0byBvbmUgY2hvaWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfU0lOR0xFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IGFsbG93cyBtdWx0aXBsZSBjaG9pY2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX01PREVfTVVMVElQTEUgPSAyOwotCi0gICAgLyoqCiAgICAgICogV2hlbiBhcnJvdyBzY3JvbGxpbmcsIExpc3RWaWV3IHdpbGwgbmV2ZXIgc2Nyb2xsIG1vcmUgdGhhbiB0aGlzIGZhY3RvcgogICAgICAqIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIGxpc3QuCiAgICAgICovCkBAIC0xMjEsOSArMTA1LDYgQEAKICAgICBEcmF3YWJsZSBtRGl2aWRlcjsKICAgICBpbnQgbURpdmlkZXJIZWlnaHQ7CiAgICAgCi0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgRHJhd2FibGUgbU92ZXJzY3JvbGxGb290ZXI7Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ2FjaGVDb2xvck9wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbURpdmlkZXJJc09wYXF1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbUNsaXBEaXZpZGVyOwpAQCAtMTM1LDExICsxMTYsNiBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1JdGVtc0NhbkZvY3VzID0gZmFsc2U7CiAKLSAgICBwcml2YXRlIGludCBtQ2hvaWNlTW9kZSA9IENIT0lDRV9NT0RFX05PTkU7Ci0KLSAgICBwcml2YXRlIFNwYXJzZUJvb2xlYW5BcnJheSBtQ2hlY2tTdGF0ZXM7Ci0gICAgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbUNoZWNrZWRJZFN0YXRlczsKLQogICAgIC8vIHVzZWQgZm9yIHRlbXBvcmFyeSBjYWxjdWxhdGlvbnMuCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgcHJpdmF0ZSBQYWludCBtRGl2aWRlclBhaW50OwpAQCAtMTUwLDcgKzEyNiw3IEBACiAKICAgICAvLyBLZWVwcyBmb2N1c2VkIGNoaWxkcmVuIHZpc2libGUgdGhyb3VnaCByZXNpemVzCiAgICAgcHJpdmF0ZSBGb2N1c1NlbGVjdG9yIG1Gb2N1c1NlbGVjdG9yOwotICAgIAorCiAgICAgcHVibGljIExpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwogICAgIH0KQEAgLTE3OCwxNiArMTU0LDYgQEAKICAgICAgICAgICAgIHNldERpdmlkZXIoZCk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIG9zSGVhZGVyID0gYS5nZXREcmF3YWJsZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0Vmlld19vdmVyc2Nyb2xsSGVhZGVyKTsKLSAgICAgICAgaWYgKG9zSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldE92ZXJzY3JvbGxIZWFkZXIob3NIZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRHJhd2FibGUgb3NGb290ZXIgPSBhLmdldERyYXdhYmxlKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkxpc3RWaWV3X292ZXJzY3JvbGxGb290ZXIpOwotICAgICAgICBpZiAob3NGb290ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0T3ZlcnNjcm9sbEZvb3Rlcihvc0Zvb3Rlcik7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBVc2UgdGhlIGhlaWdodCBzcGVjaWZpZWQsIHplcm8gYmVpbmcgdGhlIGRlZmF1bHQKICAgICAgICAgZmluYWwgaW50IGRpdmlkZXJIZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5MaXN0Vmlld19kaXZpZGVySGVpZ2h0LCAwKTsKQEAgLTE5NSw4ICsxNjEsNiBAQAogICAgICAgICAgICAgc2V0RGl2aWRlckhlaWdodChkaXZpZGVySGVpZ2h0KTsKICAgICAgICAgfQogCi0gICAgICAgIHNldENob2ljZU1vZGUoYS5nZXRJbnQoUi5zdHlsZWFibGUuTGlzdFZpZXdfY2hvaWNlTW9kZSwgQ0hPSUNFX01PREVfTk9ORSkpOwotICAgICAgICAKICAgICAgICAgbUhlYWRlckRpdmlkZXJzRW5hYmxlZCA9IGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5MaXN0Vmlld19oZWFkZXJEaXZpZGVyc0VuYWJsZWQsIHRydWUpOwogICAgICAgICBtRm9vdGVyRGl2aWRlcnNFbmFibGVkID0gYS5nZXRCb29sZWFuKFIuc3R5bGVhYmxlLkxpc3RWaWV3X2Zvb3RlckRpdmlkZXJzRW5hYmxlZCwgdHJ1ZSk7CiAKQEAgLTQxNyw2ICszODEsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIHVwIHRoaXMgQWJzTGlzdFZpZXcgdG8gdXNlIGEgcmVtb3RlIHZpZXdzIGFkYXB0ZXIgd2hpY2ggY29ubmVjdHMgdG8gYSBSZW1vdGVWaWV3c1NlcnZpY2UKKyAgICAgKiB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAqIEBwYXJhbSBpbnRlbnQgdGhlIGludGVudCB1c2VkIHRvIGlkZW50aWZ5IHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgZm9yIHRoZSBhZGFwdGVyIHRvIGNvbm5lY3QgdG8uCisgICAgICovCisgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlVmlld3NBZGFwdGVyKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3VwZXIuc2V0UmVtb3RlVmlld3NBZGFwdGVyKGludGVudCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZGF0YSBiZWhpbmQgdGhpcyBMaXN0Vmlldy4KICAgICAgKgogICAgICAqIFRoZSBhZGFwdGVyIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBtYXkgYmUgd3JhcHBlZCBieSBhIHtAbGluayBXcmFwcGVyTGlzdEFkYXB0ZXJ9LApAQCAtNDMxLDcgKzQwNSw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChudWxsICE9IG1BZGFwdGVyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsICYmIG1EYXRhU2V0T2JzZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUFkYXB0ZXIudW5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihtRGF0YVNldE9ic2VydmVyKTsKICAgICAgICAgfQogCkBAIC00NDYsNiArNDIwLDEwIEBACiAKICAgICAgICAgbU9sZFNlbGVjdGVkUG9zaXRpb24gPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtT2xkU2VsZWN0ZWRSb3dJZCA9IElOVkFMSURfUk9XX0lEOworCisgICAgICAgIC8vIEFic0xpc3RWaWV3I3NldEFkYXB0ZXIgd2lsbCB1cGRhdGUgY2hvaWNlIG1vZGUgc3RhdGVzLgorICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtQXJlQWxsSXRlbXNTZWxlY3RhYmxlID0gbUFkYXB0ZXIuYXJlQWxsSXRlbXNFbmFibGVkKCk7CiAgICAgICAgICAgICBtT2xkSXRlbUNvdW50ID0gbUl0ZW1Db3VudDsKQEAgLTQ3MCwxMyArNDQ4LDYgQEAKICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmCi0gICAgICAgICAgICAgICAgICAgIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpICYmCi0gICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BcmVBbGxJdGVtc1NlbGVjdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgY2hlY2tGb2N1cygpOwpAQCAtNDg0LDE0ICs0NTUsNiBAQAogICAgICAgICAgICAgY2hlY2tTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobUNoZWNrZWRJZFN0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQogICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CiAgICAgfQogCkBAIC04NzksNiArODQyLDI1IEBACiAgICAgICAgIHJldHVybiB0b3BTZWxlY3Rpb25QaXhlbDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uLiBUaGUgdmlldyB3aWxsCisgICAgICogc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uIGlzIGRpc3BsYXllZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gU2Nyb2xsIHRvIHRoaXMgYWRhcHRlciBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCBwb3NpdGlvbikgeworICAgICAgICBzdXBlci5zbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbW9vdGhseSBzY3JvbGwgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyIHBvc2l0aW9uIG9mZnNldC4gVGhlIHZpZXcgd2lsbAorICAgICAqIHNjcm9sbCBzdWNoIHRoYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbiBpcyBkaXNwbGF5ZWQuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IHRvIG9mZnNldCBmcm9tIHRoZSBhZGFwdGVyIHBvc2l0aW9uIHRvIHNjcm9sbCB0by4KKyAgICAgKi8KKyAgICBAYW5kcm9pZC52aWV3LlJlbW90YWJsZVZpZXdNZXRob2QKKyAgICBwdWJsaWMgdm9pZCBzbW9vdGhTY3JvbGxCeU9mZnNldChpbnQgb2Zmc2V0KSB7CisgICAgICAgIHN1cGVyLnNtb290aFNjcm9sbEJ5T2Zmc2V0KG9mZnNldCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmlsbHMgdGhlIGxpc3QgYmFzZWQgb24gcG9zaXRpb25pbmcgdGhlIG5ldyBzZWxlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIG9sZApAQCAtMjk1OCw1MiArMjk0MCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHN1cGVyLnNldENhY2hlQ29sb3JIaW50KGNvbG9yKTsKICAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gYm91bmRzLmJvdHRvbSAtIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRyYXdPdmVyc2Nyb2xsRm9vdGVyKENhbnZhcyBjYW52YXMsIERyYXdhYmxlIGRyYXdhYmxlLCBSZWN0IGJvdW5kcykgewotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpOwotCi0gICAgICAgIGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgIGNhbnZhcy5jbGlwUmVjdChib3VuZHMpOwotCi0gICAgICAgIGZpbmFsIGludCBzcGFuID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3A7Ci0gICAgICAgIGlmIChzcGFuIDwgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm91bmRzLnRvcCArIGhlaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcyhib3VuZHMpOwotICAgICAgICBkcmF3YWJsZS5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLSAgICB9Ci0KKyAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaERyYXcoQ2FudmFzIGNhbnZhcykgewogICAgICAgICAvLyBEcmF3IHRoZSBkaXZpZGVycwogICAgICAgICBmaW5hbCBpbnQgZGl2aWRlckhlaWdodCA9IG1EaXZpZGVySGVpZ2h0OwotICAgICAgICBmaW5hbCBEcmF3YWJsZSBvdmVyc2Nyb2xsSGVhZGVyID0gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgICAgIGZpbmFsIERyYXdhYmxlIG92ZXJzY3JvbGxGb290ZXIgPSBtT3ZlcnNjcm9sbEZvb3RlcjsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEhlYWRlciA9IG92ZXJzY3JvbGxIZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3T3ZlcnNjcm9sbEZvb3RlciA9IG92ZXJzY3JvbGxGb290ZXIgIT0gbnVsbDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBkcmF3RGl2aWRlcnMgPSBkaXZpZGVySGVpZ2h0ID4gMCAmJiBtRGl2aWRlciAhPSBudWxsOwogCi0gICAgICAgIGlmIChkcmF3RGl2aWRlcnMgfHwgZHJhd092ZXJzY3JvbGxIZWFkZXIgfHwgZHJhd092ZXJzY3JvbGxGb290ZXIpIHsKKyAgICAgICAgaWYgKGRyYXdEaXZpZGVycykgewogICAgICAgICAgICAgLy8gT25seSBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIGluIHRoZSBsb29wLCB3ZSBzZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGhlcmUKICAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gbVRlbXBSZWN0OwogICAgICAgICAgICAgYm91bmRzLmxlZnQgPSBtUGFkZGluZ0xlZnQ7CkBAIC0zMDIyLDcgKzI5NjYsNyBAQAogICAgICAgICAgICAgLy8gZmlsbCBhIHJlY3Qgd2hlcmUgdGhlIGRpdmlkZXJzIHdvdWxkIGJlIGZvciBub24tc2VsZWN0YWJsZSBpdGVtcwogICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgb3BhcXVlIGFuZCB0aGUgYmFja2dyb3VuZCBpcyBhbHNvIG9wYXF1ZSwgd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIG5lZWQgdG8gZHJhdyBhbnl0aGluZyBzaW5jZSB0aGUgYmFja2dyb3VuZCB3aWxsIGRvIGl0IGZvciB1cwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWxsRm9yTWlzc2luZ0RpdmlkZXJzID0gZHJhd0RpdmlkZXJzICYmIGlzT3BhcXVlKCkgJiYgIXN1cGVyLmlzT3BhcXVlKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMgPSBpc09wYXF1ZSgpICYmICFzdXBlci5pc09wYXF1ZSgpOwogCiAgICAgICAgICAgICBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycyAmJiBtRGl2aWRlclBhaW50ID09IG51bGwgJiYgbUlzQ2FjaGVDb2xvck9wYXF1ZSkgewogICAgICAgICAgICAgICAgIG1EaXZpZGVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKQEAgLTMwMzIsNzIgKzI5NzYsNDEgQEAKIAogICAgICAgICAgICAgZmluYWwgaW50IGxpc3RCb3R0b20gPSBtQm90dG9tIC0gbVRvcCAtIG1MaXN0UGFkZGluZy5ib3R0b20gKyBtU2Nyb2xsWTsKICAgICAgICAgICAgIGlmICghbVN0YWNrRnJvbUJvdHRvbSkgewotICAgICAgICAgICAgICAgIGludCBib3R0b20gPSAwOworICAgICAgICAgICAgICAgIGludCBib3R0b207CiAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRHJhdyB0b3AgZGl2aWRlciBvciBoZWFkZXIgZm9yIG92ZXJzY3JvbGwKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDAgJiYgc2Nyb2xsWSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdPdmVyc2Nyb2xsSGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy50b3AgPSBzY3JvbGxZOwotICAgICAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxIZWFkZXIoY2FudmFzLCBvdmVyc2Nyb2xsSGVhZGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyYXdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gLWRpdmlkZXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaGVhZGVyRGl2aWRlcnMgfHwgZmlyc3QgKyBpID49IGhlYWRlckNvdW50KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb290ZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPCBmb290ZXJMaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gY2hpbGQuZ2V0Qm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkcmF3IGRpdmlkZXJzIG5leHQgdG8gaXRlbXMgdGhhdCBhcmUgbm90IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmF3RGl2aWRlcnMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdHRvbSA8IGxpc3RCb3R0b20gJiYgIShkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBpID09IGNvdW50IC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhcmVBbGxJdGVtc1NlbGVjdGFibGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkgKyAxKSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbEZvck1pc3NpbmdEaXZpZGVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KGJvdW5kcywgcGFpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGFwdGVyLmlzRW5hYmxlZChmaXJzdCArIGkpICYmIChpID09IGNvdW50IC0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNFbmFibGVkKGZpcnN0ICsgaSArIDEpKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGl2aWRlcihjYW52YXMsIGJvdW5kcywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxGb3JNaXNzaW5nRGl2aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBib3R0b20gKyBkaXZpZGVySGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChib3VuZHMsIHBhaW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyRm9vdGVyQm90dG9tID0gbUJvdHRvbSArIG1TY3JvbGxZOwotICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlciAmJiBmaXJzdCArIGNvdW50ID09IGl0ZW1Db3VudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgb3ZlckZvb3RlckJvdHRvbSA+IGJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gb3ZlckZvb3RlckJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd092ZXJzY3JvbGxGb290ZXIoY2FudmFzLCBvdmVyc2Nyb2xsRm9vdGVyLCBib3VuZHMpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IHRvcDsKICAgICAgICAgICAgICAgICBpbnQgbGlzdFRvcCA9IG1MaXN0UGFkZGluZy50b3A7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwogCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCAmJiBkcmF3T3ZlcnNjcm9sbEhlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gc2Nyb2xsWTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdPdmVyc2Nyb2xsSGVhZGVyKGNhbnZhcywgb3ZlcnNjcm9sbEhlYWRlciwgYm91bmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBkcmF3T3ZlcnNjcm9sbEhlYWRlciA/IDEgOiAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXJEaXZpZGVycyB8fCBmaXJzdCArIGkgPj0gaGVhZGVyQ291bnQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvb3RlckRpdmlkZXJzIHx8IGZpcnN0ICsgaSA8IGZvb3RlckxpbWl0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBjaGlsZC5nZXRUb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRyYXcgZGl2aWRlcnMgbmV4dCB0byBpdGVtcyB0aGF0IGFyZSBub3QgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdEaXZpZGVycyAmJiB0b3AgPiBsaXN0VG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wID4gbGlzdFRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJlQWxsSXRlbXNTZWxlY3RhYmxlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpKSAmJiAoaSA9PSBjb3VudCAtIDEgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci5pc0VuYWJsZWQoZmlyc3QgKyBpICsgMSkpKSkpIHsKQEAgLTMxMTgsMTYgKzMwMzEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmIHNjcm9sbFkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3T3ZlcnNjcm9sbEZvb3RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic0xpc3RCb3R0b20gPSBtQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGFic0xpc3RCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tID0gYWJzTGlzdEJvdHRvbSArIHNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcmF3T3ZlcnNjcm9sbEZvb3RlcihjYW52YXMsIG92ZXJzY3JvbGxGb290ZXIsIGJvdW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJhd0RpdmlkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMudG9wID0gbGlzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdEaXZpZGVyKGNhbnZhcywgYm91bmRzLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcCA9IGxpc3RCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPSBsaXN0Qm90dG9tICsgZGl2aWRlckhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0RpdmlkZXIoY2FudmFzLCBib3VuZHMsIC0xKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyMzYsNDUgKzMxNDIsNiBAQAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRyYXdhYmxlIHRoYXQgd2lsbCBiZSBkcmF3biBhYm92ZSBhbGwgb3RoZXIgbGlzdCBjb250ZW50LgotICAgICAqIFRoaXMgYXJlYSBjYW4gYmVjb21lIHZpc2libGUgd2hlbiB0aGUgdXNlciBvdmVyc2Nyb2xscyB0aGUgbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgVGhlIGRyYXdhYmxlIHRvIHVzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE92ZXJzY3JvbGxIZWFkZXIoRHJhd2FibGUgaGVhZGVyKSB7Ci0gICAgICAgIG1PdmVyc2Nyb2xsSGVhZGVyID0gaGVhZGVyOwotICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYWJvdmUgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxIZWFkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZHJhd2FibGUgdGhhdCB3aWxsIGJlIGRyYXduIGJlbG93IGFsbCBvdGhlciBsaXN0IGNvbnRlbnQuCi0gICAgICogVGhpcyBhcmVhIGNhbiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIG92ZXJzY3JvbGxzIHRoZSBsaXN0LAotICAgICAqIG9yIHdoZW4gdGhlIGxpc3QncyBjb250ZW50IGRvZXMgbm90IGZ1bGx5IGZpbGwgdGhlIGNvbnRhaW5lciBhcmVhLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvb3RlciBUaGUgZHJhd2FibGUgdG8gdXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbEZvb3RlcihEcmF3YWJsZSBmb290ZXIpIHsKLSAgICAgICAgbU92ZXJzY3JvbGxGb290ZXIgPSBmb290ZXI7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkcmF3YWJsZSB0aGF0IHdpbGwgYmUgZHJhd24gYmVsb3cgYWxsIG90aGVyIGxpc3QgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBEcmF3YWJsZSBnZXRPdmVyc2Nyb2xsRm9vdGVyKCkgewotICAgICAgICByZXR1cm4gbU92ZXJzY3JvbGxGb290ZXI7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25Gb2N1c0NoYW5nZWQoYm9vbGVhbiBnYWluRm9jdXMsIGludCBkaXJlY3Rpb24sIFJlY3QgcHJldmlvdXNseUZvY3VzZWRSZWN0KSB7CiAgICAgICAgIHN1cGVyLm9uRm9jdXNDaGFuZ2VkKGdhaW5Gb2N1cywgZGlyZWN0aW9uLCBwcmV2aW91c2x5Rm9jdXNlZFJlY3QpOwpAQCAtMzQ0NSwxNzcgKzMzMTIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBjaG9pY2UgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2hvaWNlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DaG9pY2VNb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgdGhlIGNob2ljZSBiZWhhdmlvciBmb3IgdGhlIExpc3QuIEJ5IGRlZmF1bHQsIExpc3RzIGRvIG5vdCBoYXZlIGFueSBjaG9pY2UgYmVoYXZpb3IKLSAgICAgKiAoe0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSkuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9LCB0aGUKLSAgICAgKiBMaXN0IGFsbG93cyB1cCB0byBvbmUgaXRlbSB0byAgYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgotICAgICAqCi0gICAgICogQHBhcmFtIGNob2ljZU1vZGUgT25lIG9mIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0sIHtAbGluayAjQ0hPSUNFX01PREVfU0lOR0xFfSwgb3IKLSAgICAgKiB7QGxpbmsgI0NIT0lDRV9NT0RFX01VTFRJUExFfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZU1vZGUoaW50IGNob2ljZU1vZGUpIHsKLSAgICAgICAgbUNob2ljZU1vZGUgPSBjaG9pY2VNb2RlOwotICAgICAgICBpZiAobUNob2ljZU1vZGUgIT0gQ0hPSUNFX01PREVfTk9ORSkgewotICAgICAgICAgICAgaWYgKG1DaGVja1N0YXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgPT0gbnVsbCAmJiBtQWRhcHRlciAhPSBudWxsICYmIG1BZGFwdGVyLmhhc1N0YWJsZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1JdGVtQ2xpY2soVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1DaG9pY2VNb2RlICE9IENIT0lDRV9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlID0gIW1DaGVja1N0YXRlcy5nZXQocG9zaXRpb24sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMucHV0KG1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbiksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFtQ2hlY2tTdGF0ZXMuZ2V0KHBvc2l0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tTdGF0ZXMucHV0KHBvc2l0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EYXRhQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICByZW1lbWJlclN5bmNTdGF0ZSgpOwotICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlZCB8PSBzdXBlci5wZXJmb3JtSXRlbUNsaWNrKHZpZXcsIHBvc2l0aW9uLCBpZCk7Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiBUaGUgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9IG9yCi0gICAgICoge0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpdGVtIHdob3NlIGNoZWNrZWQgc3RhdGUgaXMgdG8gYmUgY2hlY2tlZAotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUgZm9yIHRoZSBpdGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTVVMVElQTEUpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5wdXQocG9zaXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5wdXQobUFkYXB0ZXIuZ2V0SXRlbUlkKHBvc2l0aW9uKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLmRlbGV0ZShtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZUlkcyA9IG1DaGVja2VkSWRTdGF0ZXMgIT0gbnVsbCAmJiBtQWRhcHRlci5oYXNTdGFibGVJZHMoKTsKLSAgICAgICAgICAgIC8vIENsZWFyIGFsbCB2YWx1ZXMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nLCBvciB1bmNoZWNraW5nIHRoZSBjdXJyZW50bHkKLSAgICAgICAgICAgIC8vIHNlbGVjdGVkIGl0ZW0KLSAgICAgICAgICAgIGlmICh2YWx1ZSB8fCBpc0l0ZW1DaGVja2VkKHBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNoZWNrZWRJZFN0YXRlcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoaXMgbWF5IGVuZCB1cCBzZWxlY3RpbmcgdGhlIHZhbHVlIHdlIGp1c3QgY2xlYXJlZCBidXQgdGhpcyB3YXkKLSAgICAgICAgICAgIC8vIHdlIGVuc3VyZSBsZW5ndGggb2YgbUNoZWNrU3RhdGVzIGlzIDEsIGEgZmFjdCBnZXRDaGVja2VkSXRlbVBvc2l0aW9uIHJlbGllcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbUNoZWNrU3RhdGVzLnB1dChwb3NpdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUlkcykgewotICAgICAgICAgICAgICAgICAgICBtQ2hlY2tlZElkU3RhdGVzLnB1dChtQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBhIGRhdGEgY2hhbmdlIHdoaWxlIHdlIGFyZSBpbiB0aGUgbGF5b3V0IHBoYXNlCi0gICAgICAgIGlmICghbUluTGF5b3V0ICYmICFtQmxvY2tMYXlvdXRSZXF1ZXN0cykgewotICAgICAgICAgICAgbURhdGFDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlbWVtYmVyU3luY1N0YXRlKCk7Ci0gICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFRoZSByZXN1bHQgaXMgb25seQotICAgICAqIHZhbGlkIGlmIHRoZSBjaG9pY2UgbW9kZSBoYXMgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9TSU5HTEV9Ci0gICAgICogb3Ige0BsaW5rICNDSE9JQ0VfTU9ERV9NVUxUSVBMRX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGl0ZW0gd2hvc2UgY2hlY2tlZCBzdGF0ZSB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIFRoZSBpdGVtJ3MgY2hlY2tlZCBzdGF0ZSBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgY2hvaWNlIG1vZGUKLSAgICAgKiAgICAgICAgIGlzIGludmFsaWQKLSAgICAgKgotICAgICAqIEBzZWUgI3NldENob2ljZU1vZGUoaW50KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSXRlbUNoZWNrZWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FICYmIG1DaGVja1N0YXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmdldChwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbS4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBjaG9pY2UKLSAgICAgKiBtb2RlIGhhcyBiZWVuIHNldCB0byB7QGxpbmsgI0NIT0lDRV9NT0RFX1NJTkdMRX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgaXRlbSBvcgotICAgICAqICAgICAgICAge0BsaW5rICNJTlZBTElEX1BPU0lUSU9OfSBpZiBub3RoaW5nIGlzIHNlbGVjdGVkCi0gICAgICoKLSAgICAgKiBAc2VlICNzZXRDaG9pY2VNb2RlKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENoZWNrZWRJdGVtUG9zaXRpb24oKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSA9PSBDSE9JQ0VfTU9ERV9TSU5HTEUgJiYgbUNoZWNrU3RhdGVzICE9IG51bGwgJiYgbUNoZWNrU3RhdGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzLmtleUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElOVkFMSURfUE9TSVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNoZWNrZWQgaXRlbXMgaW4gdGhlIGxpc3QuIFRoZSByZXN1bHQgaXMgb25seSB2YWxpZCBpZgotICAgICAqIHRoZSBjaG9pY2UgbW9kZSBoYXMgbm90IGJlZW4gc2V0IHRvIHtAbGluayAjQ0hPSUNFX01PREVfTk9ORX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBIFNwYXJzZUJvb2xlYW5BcnJheSB3aGljaCB3aWxsIHJldHVybiB0cnVlIGZvciBlYWNoIGNhbGwgdG8KLSAgICAgKiAgICAgICAgICBnZXQoaW50IHBvc2l0aW9uKSB3aGVyZSBwb3NpdGlvbiBpcyBhIHBvc2l0aW9uIGluIHRoZSBsaXN0LAotICAgICAqICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjaG9pY2UgbW9kZSBpcyBzZXQgdG8KLSAgICAgKiAgICAgICAgICB7QGxpbmsgI0NIT0lDRV9NT0RFX05PTkV9LgotICAgICAqLwotICAgIHB1YmxpYyBTcGFyc2VCb29sZWFuQXJyYXkgZ2V0Q2hlY2tlZEl0ZW1Qb3NpdGlvbnMoKSB7Ci0gICAgICAgIGlmIChtQ2hvaWNlTW9kZSAhPSBDSE9JQ0VfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNoZWNrU3RhdGVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQogICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfS4KICAgICAgKiAKQEAgLTM2MjQsNiArMzMyMCw3IEBACiAgICAgICogICAgICAgICAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGVja2VkSXRlbUlkcygpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGxvbmdbXSBnZXRDaGVja0l0ZW1JZHMoKSB7CiAgICAgICAgIC8vIFVzZSBuZXcgYmVoYXZpb3IgdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBzdGFibGUgSUQgbWFwcGluZy4KICAgICAgICAgaWYgKG1BZGFwdGVyICE9IG51bGwgJiYgbUFkYXB0ZXIuaGFzU3RhYmxlSWRzKCkpIHsKQEAgLTM2NTgsMTE1ICszMzU1LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IGxvbmdbMF07CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBjaGVja2VkIGl0ZW1zIGlkcy4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZQotICAgICAqIGNob2ljZSBtb2RlIGhhcyBub3QgYmVlbiBzZXQgdG8ge0BsaW5rICNDSE9JQ0VfTU9ERV9OT05FfSBhbmQgdGhlIGFkYXB0ZXIKLSAgICAgKiBoYXMgc3RhYmxlIElEcy4gKHtAbGluayBMaXN0QWRhcHRlciNoYXNTdGFibGVJZHMoKX0gPT0ge0Bjb2RlIHRydWV9KQotICAgICAqIAotICAgICAqIEByZXR1cm4gQSBuZXcgYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGlkIG9mIGVhY2ggY2hlY2tlZCBpdGVtIGluIHRoZQotICAgICAqICAgICAgICAgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGdldENoZWNrZWRJdGVtSWRzKCkgewotICAgICAgICBpZiAobUNob2ljZU1vZGUgPT0gQ0hPSUNFX01PREVfTk9ORSB8fCBtQ2hlY2tlZElkU3RhdGVzID09IG51bGwgfHwgbUFkYXB0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBsb25nWzBdOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gaWRTdGF0ZXMgPSBtQ2hlY2tlZElkU3RhdGVzOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBpZFN0YXRlcy5zaXplKCk7Ci0gICAgICAgIGZpbmFsIGxvbmdbXSBpZHMgPSBuZXcgbG9uZ1tjb3VudF07Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlkc1tpXSA9IGlkU3RhdGVzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaWRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIGFueSBjaG9pY2VzIHByZXZpb3VzbHkgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDaG9pY2VzKCkgewotICAgICAgICBpZiAobUNoZWNrU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja1N0YXRlcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hlY2tlZElkU3RhdGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZTsKLSAgICAgICAgTG9uZ1NwYXJzZUFycmF5PEJvb2xlYW4+IGNoZWNrSWRTdGF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIExpc3RWaWV3I29uU2F2ZUluc3RhbmNlU3RhdGUoKX0KLSAgICAgICAgICovCi0gICAgICAgIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlLCBTcGFyc2VCb29sZWFuQXJyYXkgY2hlY2tTdGF0ZSwKLSAgICAgICAgICAgICAgICBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4gY2hlY2tJZFN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGU7Ci0gICAgICAgICAgICB0aGlzLmNoZWNrSWRTdGF0ZSA9IGNoZWNrSWRTdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSB7QGxpbmsgI0NSRUFUT1J9Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNhdmVkU3RhdGUoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgICAgICBjaGVja1N0YXRlID0gaW4ucmVhZFNwYXJzZUJvb2xlYW5BcnJheSgpOwotICAgICAgICAgICAgbG9uZ1tdIGlkU3RhdGUgPSBpbi5jcmVhdGVMb25nQXJyYXkoKTsKLQotICAgICAgICAgICAgaWYgKGlkU3RhdGUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrSWRTdGF0ZSA9IG5ldyBMb25nU3BhcnNlQXJyYXk8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaGVja0lkU3RhdGUuc2V0VmFsdWVzKGlkU3RhdGUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7Ci0gICAgICAgICAgICBvdXQud3JpdGVTcGFyc2VCb29sZWFuQXJyYXkoY2hlY2tTdGF0ZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVMb25nQXJyYXkoY2hlY2tJZFN0YXRlICE9IG51bGwgPyBjaGVja0lkU3RhdGUuZ2V0S2V5cygpIDogbmV3IGxvbmdbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxpc3RWaWV3LlNhdmVkU3RhdGV7IgotICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjaGVja1N0YXRlPSIgKyBjaGVja1N0YXRlICsgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUgotICAgICAgICAgICAgICAgID0gbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShzdXBlclN0YXRlLCBtQ2hlY2tTdGF0ZXMsIG1DaGVja2VkSWRTdGF0ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgewotICAgICAgICBTYXZlZFN0YXRlIHNzID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotCi0gICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3MuZ2V0U3VwZXJTdGF0ZSgpKTsKLQotICAgICAgICBpZiAoc3MuY2hlY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgIG1DaGVja1N0YXRlcyA9IHNzLmNoZWNrU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3MuY2hlY2tJZFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DaGVja2VkSWRTdGF0ZXMgPSBzcy5jaGVja0lkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvT3ZlclNjcm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTczYWQuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L092ZXJTY3JvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdE1hdGg7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgc2Nyb2xsaW5nIHdpdGggdGhlIGFiaWxpdHkgdG8gb3ZlcnNob290IHRoZSBib3VuZHMKLSAqIG9mIGEgc2Nyb2xsaW5nIG9wZXJhdGlvbi4gVGhpcyBjbGFzcyBpcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yCi0gKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuU2Nyb2xsZXJ9IGluIG1vc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVyU2Nyb2xsZXIgewotICAgIHByaXZhdGUgaW50IG1Nb2RlOwotCi0gICAgcHJpdmF0ZSBNYWduZXRpY092ZXJTY3JvbGxlciBtU2Nyb2xsZXJYOwotICAgIHByaXZhdGUgTWFnbmV0aWNPdmVyU2Nyb2xsZXIgbVNjcm9sbGVyWTsKLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9EVVJBVElPTiA9IDI1MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01PREUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTElOR19NT0RFID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggYSB2aXNjb3VzIGZsdWlkIHNjcm9sbCBpbnRlcnBvbGF0b3IuCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyIHdpdGggZGVmYXVsdCBlZGdlIGJvdW5jZSBjb2VmZmljaWVudHMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhpcyBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJwb2xhdG9yIFRoZSBzY3JvbGwgaW50ZXJwb2xhdG9yLiBJZiBudWxsLCBhIGRlZmF1bHQgKHZpc2NvdXMpIGludGVycG9sYXRvciB3aWxsCi0gICAgICogYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3ZlclNjcm9sbGVyKENvbnRleHQgY29udGV4dCwgSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGludGVycG9sYXRvciwgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQsCi0gICAgICAgICAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gT3ZlclNjcm9sbGVyLgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoaXMgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgc2Nyb2xsIGludGVycG9sYXRvci4gSWYgbnVsbCwgYSBkZWZhdWx0ICh2aXNjb3VzKSBpbnRlcnBvbGF0b3Igd2lsbAotICAgICAqIGJlIHVzZWQuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WCBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0aGF0IHdpbGwgZGV0ZXJtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHRoZQotICAgICAqIHZlbG9jaXR5IHdoaWNoIGlzIHByZXNlcnZlZCBpbiB0aGUgYm91bmNlIHdoZW4gdGhlIGhvcml6b250YWwgZWRnZSBpcyByZWFjaGVkLiBBIG51bGwgdmFsdWUKLSAgICAgKiBtZWFucyBubyBib3VuY2UuCi0gICAgICogQHBhcmFtIGJvdW5jZUNvZWZmaWNpZW50WSBTYW1lIGFzIGJvdW5jZUNvZWZmaWNpZW50WCBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIE92ZXJTY3JvbGxlcihDb250ZXh0IGNvbnRleHQsIEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsCi0gICAgICAgICAgICBmbG9hdCBib3VuY2VDb2VmZmljaWVudFgsIGZsb2F0IGJvdW5jZUNvZWZmaWNpZW50WSkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0gaW50ZXJwb2xhdG9yOwotICAgICAgICBtU2Nyb2xsZXJYID0gbmV3IE1hZ25ldGljT3ZlclNjcm9sbGVyKCk7Ci0gICAgICAgIG1TY3JvbGxlclkgPSBuZXcgTWFnbmV0aWNPdmVyU2Nyb2xsZXIoKTsKLSAgICAgICAgTWFnbmV0aWNPdmVyU2Nyb2xsZXIuaW5pdGlhbGl6ZUZyb21Db250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIG1TY3JvbGxlclguc2V0Qm91bmNlQ29lZmZpY2llbnQoYm91bmNlQ29lZmZpY2llbnRYKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zZXRCb3VuY2VDb2VmZmljaWVudChib3VuY2VDb2VmZmljaWVudFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY3JvbGxlciBoYXMgZmluaXNoZWQgc2Nyb2xsaW5nLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmlzaGVkICYmIG1TY3JvbGxlclkubUZpbmlzaGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBmaW5pc2hlZCBmaWVsZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuIENvbnRyYXJ5IHRvCi0gICAgICoge0BsaW5rICNhYm9ydEFuaW1hdGlvbigpfSwgZm9yY2luZyB0aGUgYW5pbWF0aW9uIHRvIGZpbmlzaGVkCi0gICAgICogZG9lcyBOT1QgY2F1c2UgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaW5pc2hlZCBUaGUgbmV3IGZpbmlzaGVkIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlRmluaXNoZWQoYm9vbGVhbiBmaW5pc2hlZCkgewotICAgICAgICBtU2Nyb2xsZXJYLm1GaW5pc2hlZCA9IG1TY3JvbGxlclkubUZpbmlzaGVkID0gZmluaXNoZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBYIG9mZnNldCBpbiB0aGUgc2Nyb2xsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJYKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWC5tQ3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWSBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRDdXJyWSgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclkubUN1cnJlbnRQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAaGlkZQotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmVsb2NpdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBvcmlnaW5hbCB2ZWxvY2l0eSBsZXNzIHRoZSBkZWNlbGVyYXRpb24sIG5vcm0gb2YgdGhlIFggYW5kIFkgdmVsb2NpdHkgdmVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRDdXJyVmVsb2NpdHkoKSB7Ci0gICAgICAgIGZsb2F0IHNxdWFyZWROb3JtID0gbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5ICogbVNjcm9sbGVyWC5tQ3VyclZlbG9jaXR5OwotICAgICAgICBzcXVhcmVkTm9ybSArPSBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHkgKiBtU2Nyb2xsZXJZLm1DdXJyVmVsb2NpdHk7Ci0gICAgICAgIHJldHVybiBGbG9hdE1hdGguc3FydChzcXVhcmVkTm9ybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhcnQgWCBvZmZzZXQgaW4gdGhlIHNjcm9sbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXJ0WCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubVN0YXJ0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IFkgb2Zmc2V0IGluIHRoZSBzY3JvbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRTdGFydFkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Nyb2xsZXJZLm1TdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXJlIHRoZSBzY3JvbGwgd2lsbCBlbmQuIFZhbGlkIG9ubHkgZm9yICJmbGluZyIgc2Nyb2xscy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIFggb2Zmc2V0IGFzIGFuIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IGdldEZpbmFsWCgpIHsKLSAgICAgICAgcmV0dXJuIG1TY3JvbGxlclgubUZpbmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlcmUgdGhlIHNjcm9sbCB3aWxsIGVuZC4gVmFsaWQgb25seSBmb3IgImZsaW5nIiBzY3JvbGxzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZmluYWwgWSBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RmluYWxZKCkgewotICAgICAgICByZXR1cm4gbVNjcm9sbGVyWS5tRmluYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBob3cgbG9uZyB0aGUgc2Nyb2xsIGV2ZW50IHdpbGwgdGFrZSwgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgbGllIHRvIHRoZSBiZXN0IG9mIGl0cyBhYmlsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heChtU2Nyb2xsZXJYLm1EdXJhdGlvbiwgbVNjcm9sbGVyWS5tRHVyYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgc2Nyb2xsIGFuaW1hdGlvbi4gVGhpcyBhbGxvd3MgYSBydW5uaW5nIGFuaW1hdGlvbiB0byBzY3JvbGwKLSAgICAgKiBmdXJ0aGVyIGFuZCBsb25nZXIsIHdoZW4gdXNlZCB3aXRoIHtAbGluayAjc2V0RmluYWxYKGludCl9IG9yIHtAbGluayAjc2V0RmluYWxZKGludCl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuZCBBZGRpdGlvbmFsIHRpbWUgdG8gc2Nyb2xsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBAc2VlICNzZXRGaW5hbFgoaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWShpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXJzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBmaXhlZCBkdXJhdGlvbi4KLSAgICAgKiAgICAgICAgICAgICBJbnN0ZWFkIG9mIHNldHRpbmcgYSBuZXcgZmluYWwgcG9zaXRpb24gYW5kIGV4dGVuZGluZwotICAgICAqICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBvZiBhbiBleGlzdGluZyBzY3JvbGwsIHVzZSBzdGFydFNjcm9sbAotICAgICAqICAgICAgICAgICAgIHRvIGJlZ2luIGEgbmV3IGFuaW1hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleHRlbmREdXJhdGlvbihpbnQgZXh0ZW5kKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZXh0ZW5kRHVyYXRpb24oZXh0ZW5kKTsKLSAgICAgICAgbVNjcm9sbGVyWS5leHRlbmREdXJhdGlvbihleHRlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbmFsIHBvc2l0aW9uIChYKSBmb3IgdGhpcyBzY3JvbGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdYIFRoZSBuZXcgWCBvZmZzZXQgYXMgYW4gYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLgotICAgICAqIEBzZWUgI2V4dGVuZER1cmF0aW9uKGludCkKLSAgICAgKiBAc2VlICNzZXRGaW5hbFkoaW50KQotICAgICAqCi0gICAgICogQGhpZGUgUGVuZGluZyByZW1vdmFsIG9uY2Ugbm90aGluZyBkZXBlbmRzIG9uIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgT3ZlclNjcm9sbGVyJ3MgZmluYWwgcG9zaXRpb24gbWF5IGNoYW5nZSBkdXJpbmcgYW4gYW5pbWF0aW9uLgotICAgICAqICAgICAgICAgICAgIEluc3RlYWQgb2Ygc2V0dGluZyBhIG5ldyBmaW5hbCBwb3NpdGlvbiBhbmQgZXh0ZW5kaW5nCi0gICAgICogICAgICAgICAgICAgdGhlIGR1cmF0aW9uIG9mIGFuIGV4aXN0aW5nIHNjcm9sbCwgdXNlIHN0YXJ0U2Nyb2xsCi0gICAgICogICAgICAgICAgICAgdG8gYmVnaW4gYSBuZXcgYW5pbWF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbmFsWChpbnQgbmV3WCkgewotICAgICAgICBtU2Nyb2xsZXJYLnNldEZpbmFsUG9zaXRpb24obmV3WCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmluYWwgcG9zaXRpb24gKFkpIGZvciB0aGlzIHNjcm9sbGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld1kgVGhlIG5ldyBZIG9mZnNldCBhcyBhbiBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4uCi0gICAgICogQHNlZSAjZXh0ZW5kRHVyYXRpb24oaW50KQotICAgICAqIEBzZWUgI3NldEZpbmFsWChpbnQpCi0gICAgICoKLSAgICAgKiBAaGlkZSBQZW5kaW5nIHJlbW92YWwgb25jZSBub3RoaW5nIGRlcGVuZHMgb24gaXQKLSAgICAgKiBAZGVwcmVjYXRlZCBPdmVyU2Nyb2xsZXIncyBmaW5hbCBwb3NpdGlvbiBtYXkgY2hhbmdlIGR1cmluZyBhbiBhbmltYXRpb24uCi0gICAgICogICAgICAgICAgICAgSW5zdGVhZCBvZiBzZXR0aW5nIGEgbmV3IGZpbmFsIHBvc2l0aW9uIGFuZCBleHRlbmRpbmcKLSAgICAgKiAgICAgICAgICAgICB0aGUgZHVyYXRpb24gb2YgYW4gZXhpc3Rpbmcgc2Nyb2xsLCB1c2Ugc3RhcnRTY3JvbGwKLSAgICAgKiAgICAgICAgICAgICB0byBiZWdpbiBhIG5ldyBhbmltYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxZKGludCBuZXdZKSB7Ci0gICAgICAgIG1TY3JvbGxlclkuc2V0RmluYWxQb3NpdGlvbihuZXdZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgd2hlbiB5b3Ugd2FudCB0byBrbm93IHRoZSBuZXcgbG9jYXRpb24uIElmIGl0IHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgICogYW5pbWF0aW9uIGlzIG5vdCB5ZXQgZmluaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcHV0ZVNjcm9sbE9mZnNldCgpIHsKLSAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBTQ1JPTExfTU9ERToKLSAgICAgICAgICAgICAgICBsb25nIHRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIC8vIEFueSBzY3JvbGxlciBjYW4gYmUgdXNlZCBmb3IgdGltZSwgc2luY2UgdGhleSB3ZXJlIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICAvLyB0b2dldGhlciBpbiBzY3JvbGwgbW9kZS4gV2UgdXNlIFggaGVyZS4KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lID0gdGltZSAtIG1TY3JvbGxlclgubVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBkdXJhdGlvbiA9IG1TY3JvbGxlclgubUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlbGFwc2VkVGltZSA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IHEgPSAoZmxvYXQpIChlbGFwc2VkVGltZSkgLyBkdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUludGVycG9sYXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IFNjcm9sbGVyLnZpc2NvdXNGbHVpZChxKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG1JbnRlcnBvbGF0b3IuZ2V0SW50ZXJwb2xhdGlvbihxKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLnVwZGF0ZVNjcm9sbChxKTsKLSAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS51cGRhdGVTY3JvbGwocSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRkxJTkdfTU9ERToKLSAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclgubUZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWC51cGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJYLmNvbnRpbnVlV2hlbkZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsZXJYLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TY3JvbGxlclkudXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVNjcm9sbGVyWS5jb250aW51ZVdoZW5GaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJ5IHByb3ZpZGluZyBhIHN0YXJ0aW5nIHBvaW50IGFuZCB0aGUgZGlzdGFuY2UgdG8gdHJhdmVsLgotICAgICAqIFRoZSBzY3JvbGwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMjUwIG1pbGxpc2Vjb25kcyBmb3IgdGhlCi0gICAgICogZHVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgZHgsIGludCBkeSkgewotICAgICAgICBzdGFydFNjcm9sbChzdGFydFgsIHN0YXJ0WSwgZHgsIGR5LCBERUZBVUxUX0RVUkFUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBzY3JvbGxpbmcgYnkgcHJvdmlkaW5nIGEgc3RhcnRpbmcgcG9pbnQgYW5kIHRoZSBkaXN0YW5jZSB0byB0cmF2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nIGhvcml6b250YWwgc2Nyb2xsIG9mZnNldCBpbiBwaXhlbHMuIFBvc2l0aXZlCi0gICAgICogICAgICAgIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyB2ZXJ0aWNhbCBzY3JvbGwgb2Zmc2V0IGluIHBpeGVscy4gUG9zaXRpdmUgbnVtYmVycwotICAgICAqICAgICAgICB3aWxsIHNjcm9sbCB0aGUgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHggSG9yaXpvbnRhbCBkaXN0YW5jZSB0byB0cmF2ZWwuIFBvc2l0aXZlIG51bWJlcnMgd2lsbCBzY3JvbGwgdGhlCi0gICAgICogICAgICAgIGNvbnRlbnQgdG8gdGhlIGxlZnQuCi0gICAgICogQHBhcmFtIGR5IFZlcnRpY2FsIGRpc3RhbmNlIHRvIHRyYXZlbC4gUG9zaXRpdmUgbnVtYmVycyB3aWxsIHNjcm9sbCB0aGUKLSAgICAgKiAgICAgICAgY29udGVudCB1cC4KLSAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgdGhlIHNjcm9sbCBpbiBtaWxsaXNlY29uZHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTY3JvbGwoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IGR4LCBpbnQgZHksIGludCBkdXJhdGlvbikgewotICAgICAgICBtTW9kZSA9IFNDUk9MTF9NT0RFOwotICAgICAgICBtU2Nyb2xsZXJYLnN0YXJ0U2Nyb2xsKHN0YXJ0WCwgZHgsIGR1cmF0aW9uKTsKLSAgICAgICAgbVNjcm9sbGVyWS5zdGFydFNjcm9sbChzdGFydFksIGR5LCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGlzIHdoZW4geW91IHdhbnQgdG8gJ3NwcmluZyBiYWNrJyBpbnRvIGEgdmFsaWQgY29vcmRpbmF0ZSByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydFggU3RhcnRpbmcgWCBjb29yZGluYXRlCi0gICAgICogQHBhcmFtIHN0YXJ0WSBTdGFydGluZyBZIGNvb3JkaW5hdGUKLSAgICAgKiBAcGFyYW0gbWluWCBNaW5pbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIHZhbGlkIFggdmFsdWUKLSAgICAgKiBAcGFyYW0gbWluWSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWF4WSBNaW5pbXVtIHZhbGlkIFkgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzcHJpbmdiYWNrIHdhcyBpbml0aWF0ZWQsIGZhbHNlIGlmIHN0YXJ0WCBhbmQgc3RhcnRZIHdlcmUKLSAgICAgKiAgICAgICAgICBhbHJlYWR5IHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3ByaW5nYmFjayhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgbWluWCwgaW50IG1heFgsIGludCBtaW5ZLCBpbnQgbWF4WSkgewotICAgICAgICBtTW9kZSA9IEZMSU5HX01PREU7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGJvdGggbWV0aG9kcyBhcmUgY2FsbGVkLgotICAgICAgICBmaW5hbCBib29sZWFuIHNwaW5nYmFja1ggPSBtU2Nyb2xsZXJYLnNwcmluZ2JhY2soc3RhcnRYLCBtaW5YLCBtYXhYKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBzcGluZ2JhY2tZID0gbVNjcm9sbGVyWS5zcHJpbmdiYWNrKHN0YXJ0WSwgbWluWSwgbWF4WSk7Ci0gICAgICAgIHJldHVybiBzcGluZ2JhY2tYIHx8IHNwaW5nYmFja1k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxpbmcoaW50IHN0YXJ0WCwgaW50IHN0YXJ0WSwgaW50IHZlbG9jaXR5WCwgaW50IHZlbG9jaXR5WSwKLSAgICAgICAgICAgIGludCBtaW5YLCBpbnQgbWF4WCwgaW50IG1pblksIGludCBtYXhZKSB7Ci0gICAgICAgIGZsaW5nKHN0YXJ0WCwgc3RhcnRZLCB2ZWxvY2l0eVgsIHZlbG9jaXR5WSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgc2Nyb2xsaW5nIGJhc2VkIG9uIGEgZmxpbmcgZ2VzdHVyZS4gVGhlIGRpc3RhbmNlIHRyYXZlbGVkIHdpbGwKLSAgICAgKiBkZXBlbmQgb24gdGhlIGluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0WCBTdGFydGluZyBwb2ludCBvZiB0aGUgc2Nyb2xsIChYKQotICAgICAqIEBwYXJhbSBzdGFydFkgU3RhcnRpbmcgcG9pbnQgb2YgdGhlIHNjcm9sbCAoWSkKLSAgICAgKiBAcGFyYW0gdmVsb2NpdHlYIEluaXRpYWwgdmVsb2NpdHkgb2YgdGhlIGZsaW5nIChYKSBtZWFzdXJlZCBpbiBwaXhlbHMgcGVyCi0gICAgICogICAgICAgICAgICBzZWNvbmQuCi0gICAgICogQHBhcmFtIHZlbG9jaXR5WSBJbml0aWFsIHZlbG9jaXR5IG9mIHRoZSBmbGluZyAoWSkgbWVhc3VyZWQgaW4gcGl4ZWxzIHBlcgotICAgICAqICAgICAgICAgICAgc2Vjb25kCi0gICAgICogQHBhcmFtIG1pblggTWluaW11bSBYIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJYID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1pblggYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gbWF4WCBNYXhpbXVtIFggdmFsdWUuIFRoZSBzY3JvbGxlciB3aWxsIG5vdCBzY3JvbGwgcGFzdCB0aGlzIHBvaW50Ci0gICAgICogICAgICAgICAgICB1bmxlc3Mgb3ZlclggPiAwLiBJZiBvdmVyZmxpbmcgaXMgYWxsb3dlZCwgaXQgd2lsbCB1c2UgbWF4WCBhcwotICAgICAqICAgICAgICAgICAgYSBzcHJpbmdiYWNrIGJvdW5kYXJ5LgotICAgICAqIEBwYXJhbSBtaW5ZIE1pbmltdW0gWSB2YWx1ZS4gVGhlIHNjcm9sbGVyIHdpbGwgbm90IHNjcm9sbCBwYXN0IHRoaXMgcG9pbnQKLSAgICAgKiAgICAgICAgICAgIHVubGVzcyBvdmVyWSA+IDAuIElmIG92ZXJmbGluZyBpcyBhbGxvd2VkLCBpdCB3aWxsIHVzZSBtaW5ZIGFzCi0gICAgICogICAgICAgICAgICBhIHNwcmluZ2JhY2sgYm91bmRhcnkuCi0gICAgICogQHBhcmFtIG1heFkgTWF4aW11bSBZIHZhbHVlLiBUaGUgc2Nyb2xsZXIgd2lsbCBub3Qgc2Nyb2xsIHBhc3QgdGhpcyBwb2ludAotICAgICAqICAgICAgICAgICAgdW5sZXNzIG92ZXJZID4gMC4gSWYgb3ZlcmZsaW5nIGlzIGFsbG93ZWQsIGl0IHdpbGwgdXNlIG1heFkgYXMKLSAgICAgKiAgICAgICAgICAgIGEgc3ByaW5nYmFjayBib3VuZGFyeS4KLSAgICAgKiBAcGFyYW0gb3ZlclggT3ZlcmZsaW5nIHJhbmdlLiBJZiA+IDAsIGhvcml6b250YWwgb3ZlcmZsaW5nIGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgZGlyZWN0aW9uIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICogQHBhcmFtIG92ZXJZIE92ZXJmbGluZyByYW5nZS4gSWYgPiAwLCB2ZXJ0aWNhbCBvdmVyZmxpbmcgaW4gZWl0aGVyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rpb24gd2lsbCBiZSBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmbGluZyhpbnQgc3RhcnRYLCBpbnQgc3RhcnRZLCBpbnQgdmVsb2NpdHlYLCBpbnQgdmVsb2NpdHlZLAotICAgICAgICAgICAgaW50IG1pblgsIGludCBtYXhYLCBpbnQgbWluWSwgaW50IG1heFksIGludCBvdmVyWCwgaW50IG92ZXJZKSB7Ci0gICAgICAgIG1Nb2RlID0gRkxJTkdfTU9ERTsKLSAgICAgICAgbVNjcm9sbGVyWC5mbGluZyhzdGFydFgsIHZlbG9jaXR5WCwgbWluWCwgbWF4WCwgb3ZlclgpOwotICAgICAgICBtU2Nyb2xsZXJZLmZsaW5nKHN0YXJ0WSwgdmVsb2NpdHlZLCBtaW5ZLCBtYXhZLCBvdmVyWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBzY3JvbGxlciB0aGF0IHdlJ3ZlIHJlYWNoZWQgYSBob3Jpem9udGFsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNpdGlvbiB0aGUgY3VycmVudCBtb3Rpb24gYW5kCi0gICAgICogYW5pbWF0ZSBmcm9tIHN0YXJ0WCB0byBmaW5hbFggYXMgYXBwcm9wcmlhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRYIFN0YXJ0aW5nL2N1cnJlbnQgWCBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFggRGVzaXJlZCBmaW5hbCBYIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJYIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFguIEFic29sdXRlIHZhbHVlIC0gbXVzdCBiZSBwb3NpdGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlIb3Jpem9udGFsRWRnZVJlYWNoZWQoaW50IHN0YXJ0WCwgaW50IGZpbmFsWCwgaW50IG92ZXJYKSB7Ci0gICAgICAgIG1TY3JvbGxlclgubm90aWZ5RWRnZVJlYWNoZWQoc3RhcnRYLCBmaW5hbFgsIG92ZXJYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZnkgdGhlIHNjcm9sbGVyIHRoYXQgd2UndmUgcmVhY2hlZCBhIHZlcnRpY2FsIGJvdW5kYXJ5LgotICAgICAqIE5vcm1hbGx5IHRoZSBpbmZvcm1hdGlvbiB0byBoYW5kbGUgdGhpcyB3aWxsIGFscmVhZHkgYmUga25vd24KLSAgICAgKiB3aGVuIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZCwgc3VjaCBhcyBpbiBhIGNhbGwgdG8gb25lIG9mIHRoZQotICAgICAqIGZsaW5nIGZ1bmN0aW9ucy4gSG93ZXZlciB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhpcyBjYW5ub3QgYmUga25vd24KLSAgICAgKiBpbiBhZHZhbmNlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYW5pbWF0ZSBhIHBhcmFib2xpYyBtb3Rpb24gZnJvbQotICAgICAqIHN0YXJ0WSB0byBmaW5hbFkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRZIFN0YXJ0aW5nL2N1cnJlbnQgWSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaW5hbFkgRGVzaXJlZCBmaW5hbCBZIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIG92ZXJZIE1hZ25pdHVkZSBvZiBvdmVyc2Nyb2xsIGFsbG93ZWQuIFRoaXMgc2hvdWxkIGJlIHRoZSBtYXhpbXVtCi0gICAgICogICAgICAgICAgICAgIGRlc2lyZWQgZGlzdGFuY2UgZnJvbSBmaW5hbFkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5VmVydGljYWxFZGdlUmVhY2hlZChpbnQgc3RhcnRZLCBpbnQgZmluYWxZLCBpbnQgb3ZlclkpIHsKLSAgICAgICAgbVNjcm9sbGVyWS5ub3RpZnlFZGdlUmVhY2hlZChzdGFydFksIGZpbmFsWSwgb3ZlclkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBTY3JvbGxlciBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIHRvIGEgdmFsaWQgcG9zaXRpb24uCi0gICAgICogVmFsaWQgYm91bmRzIHdlcmUgcHJvdmlkZWQgYnkgdGhlCi0gICAgICoge0BsaW5rICNmbGluZyhpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQpfSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBPbmUgc2hvdWxkIGNoZWNrIHRoaXMgdmFsdWUgYmVmb3JlIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI3N0YXJ0U2Nyb2xsKGludCwgaW50LCBpbnQsIGludCl9IGFzIHRoZSBpbnRlcnBvbGF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAqIHRvIHJlc3RvcmUgYSB2YWxpZCBwb3NpdGlvbiB3aWxsIHRoZW4gYmUgc3RvcHBlZC4gVGhlIGNhbGxlciBoYXMgdG8gdGFrZSBpbnRvIGFjY291bnQKLSAgICAgKiB0aGUgZmFjdCB0aGF0IHRoZSBzdGFydGVkIHNjcm9sbCB3aWxsIHN0YXJ0IGZyb20gYW4gb3ZlcnNjcm9sbGVkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgb3ZlcnNjcm9sbGVkIGFuZCBpbiB0aGUgcHJvY2VzcyBvZgotICAgICAqICAgICAgICAgaW50ZXJwb2xhdGluZyBiYWNrIHRvIGEgdmFsaWQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdmVyc2Nyb2xsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoKCFtU2Nyb2xsZXJYLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgIG1TY3JvbGxlclgubVN0YXRlICE9IE1hZ25ldGljT3ZlclNjcm9sbGVyLlRPX0VER0UpIHx8Ci0gICAgICAgICAgICAgICAgKCFtU2Nyb2xsZXJZLm1GaW5pc2hlZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVNjcm9sbGVyWS5tU3RhdGUgIT0gTWFnbmV0aWNPdmVyU2Nyb2xsZXIuVE9fRURHRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3BzIHRoZSBhbmltYXRpb24uIENvbnRyYXJ5IHRvIHtAbGluayAjZm9yY2VGaW5pc2hlZChib29sZWFuKX0sCi0gICAgICogYWJvcnRpbmcgdGhlIGFuaW1hdGluZyBjYXVzZXMgdGhlIHNjcm9sbGVyIHRvIG1vdmUgdG8gdGhlIGZpbmFsIHggYW5kIHkKLSAgICAgKiBwb3NpdGlvbnMuCi0gICAgICoKLSAgICAgKiBAc2VlICNmb3JjZUZpbmlzaGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWJvcnRBbmltYXRpb24oKSB7Ci0gICAgICAgIG1TY3JvbGxlclguZmluaXNoKCk7Ci0gICAgICAgIG1TY3JvbGxlclkuZmluaXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjcm9sbGluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGVsYXBzZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgdGltZVBhc3NlZCgpIHsKLSAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBNYXRoLm1pbihtU2Nyb2xsZXJYLm1TdGFydFRpbWUsIG1TY3JvbGxlclkubVN0YXJ0VGltZSk7Ci0gICAgICAgIHJldHVybiAoaW50KSAodGltZSAtIHN0YXJ0VGltZSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIE1hZ25ldGljT3ZlclNjcm9sbGVyIHsKLSAgICAgICAgLy8gSW5pdGlhbCBwb3NpdGlvbgotICAgICAgICBpbnQgbVN0YXJ0OwotCi0gICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgaW50IG1DdXJyZW50UG9zaXRpb247Ci0KLSAgICAgICAgLy8gRmluYWwgcG9zaXRpb24KLSAgICAgICAgaW50IG1GaW5hbDsKLQotICAgICAgICAvLyBJbml0aWFsIHZlbG9jaXR5Ci0gICAgICAgIGludCBtVmVsb2NpdHk7Ci0KLSAgICAgICAgLy8gQ3VycmVudCB2ZWxvY2l0eQotICAgICAgICBmbG9hdCBtQ3VyclZlbG9jaXR5OwotCi0gICAgICAgIC8vIENvbnN0YW50IGN1cnJlbnQgZGVjZWxlcmF0aW9uCi0gICAgICAgIGZsb2F0IG1EZWNlbGVyYXRpb247Ci0KLSAgICAgICAgLy8gQW5pbWF0aW9uIHN0YXJ0aW5nIHRpbWUsIGluIHN5c3RlbSBtaWxsaXNlY29uZHMKLSAgICAgICAgbG9uZyBtU3RhcnRUaW1lOwotCi0gICAgICAgIC8vIEFuaW1hdGlvbiBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgIGludCBtRHVyYXRpb247Ci0KLSAgICAgICAgLy8gV2hldGhlciB0aGUgYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcwotICAgICAgICBib29sZWFuIG1GaW5pc2hlZDsKLQotICAgICAgICAvLyBDb25zdGFudCBncmF2aXR5IHZhbHVlLCB1c2VkIHRvIHNjYWxlIGRlY2VsZXJhdGlvbgotICAgICAgICBzdGF0aWMgZmxvYXQgR1JBVklUWTsKLQotICAgICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwcGkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSAqIDE2MC4wZjsKLSAgICAgICAgICAgIEdSQVZJVFkgPSBTZW5zb3JNYW5hZ2VyLkdSQVZJVFlfRUFSVEggLy8gZyAobS9zXjIpCi0gICAgICAgICAgICAgICAgICAgICogMzkuMzdmIC8vIGluY2gvbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgKiBwcGkgLy8gcGl4ZWxzIHBlciBpbmNoCi0gICAgICAgICAgICAgICAgICAgICogVmlld0NvbmZpZ3VyYXRpb24uZ2V0U2Nyb2xsRnJpY3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT19FREdFID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5EQVJZID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0JPVU5DRSA9IDI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlID0gVE9fRURHRTsKLQotICAgICAgICAvLyBUaGUgYWxsb3dlZCBvdmVyc2hvdCBkaXN0YW5jZSBiZWZvcmUgYm91bmRhcnkgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgbU92ZXI7Ci0KLSAgICAgICAgLy8gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGdvIGJhY2sgZnJvbSBlZGdlIHRvIGVkZ2UuIFNwcmluZ2JhY2sgaXMgaGFsZiBvZiBpdC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9WRVJTQ1JPTExfU1BSSU5HQkFDS19EVVJBVElPTiA9IDIwMDsKLQotICAgICAgICAvLyBPc2NpbGxhdGlvbiBwZXJpb2QKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVElNRV9DT0VGID0KLSAgICAgICAgICAgIDEwMDAuMGYgKiAoZmxvYXQpIE1hdGguUEkgLyBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT047Ci0KLSAgICAgICAgLy8gSWYgdGhlIHZlbG9jaXR5IGlzIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLCBubyBib3VuY2UgaXMgdHJpZ2dlcmVkCi0gICAgICAgIC8vIHdoZW4gdGhlIGVkZ2UgbGltaXRzIGFyZSByZWFjaGVkICh3b3VsZCByZXN1bHQgaW4gYSB6ZXJvIHBpeGVscwotICAgICAgICAvLyBkaXNwbGFjZW1lbnQgYW55d2F5KS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOSU1VTV9WRUxPQ0lUWV9GT1JfQk9VTkNFID0gRmxvYXQuTUFYX1ZBTFVFOy8vMTQwLjBmOwotCi0gICAgICAgIC8vIFByb3BvcnRpb24gb2YgdGhlIHZlbG9jaXR5IHRoYXQgaXMgcHJlc2VydmVkIHdoZW4gdGhlIGVkZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9CT1VOQ0VfQ09FRkZJQ0lFTlQgPSAwLjE2ZjsKLQotICAgICAgICBwcml2YXRlIGZsb2F0IG1Cb3VuY2VDb2VmZmljaWVudCA9IERFRkFVTFRfQk9VTkNFX0NPRUZGSUNJRU5UOwotCi0gICAgICAgIE1hZ25ldGljT3ZlclNjcm9sbGVyKCkgewotICAgICAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlU2Nyb2xsKGZsb2F0IHEpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSBtU3RhcnQgKyBNYXRoLnJvdW5kKHEgKiAobUZpbmFsIC0gbVN0YXJ0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgYSBzaWduZWQgZGVjZWxlcmF0aW9uIHRoYXQgd2lsbCByZWR1Y2UgdGhlIHZlbG9jaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGZsb2F0IGdldERlY2VsZXJhdGlvbihpbnQgdmVsb2NpdHkpIHsKLSAgICAgICAgICAgIHJldHVybiB2ZWxvY2l0eSA+IDAgPyAtR1JBVklUWSA6IEdSQVZJVFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIGl0IHdpbGwgdGFrZSB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBpbnQgY29tcHV0ZUR1cmF0aW9uKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXQgaW5pdGlhbFZlbG9jaXR5LCBmbG9hdCBkZWNlbGVyYXRpb24pIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZSA9IHN0YXJ0IC0gZW5kOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzY3JpbWluYW50ID0gaW5pdGlhbFZlbG9jaXR5ICogaW5pdGlhbFZlbG9jaXR5IC0gMi4wZiAqIGRlY2VsZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAqIGRpc3RhbmNlOwotICAgICAgICAgICAgaWYgKGRpc2NyaW1pbmFudCA+PSAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZmxvYXQpIE1hdGguc3FydChkaXNjcmltaW5hbnQpOwotICAgICAgICAgICAgICAgIGlmIChkZWNlbGVyYXRpb24gPCAwLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKDEwMDAuMGYgKiAoLWluaXRpYWxWZWxvY2l0eSAtIGRlbHRhKSAvIGRlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVuZCBwb3NpdGlvbiBjYW4gbm90IGJlIHJlYWNoZWQKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdGFydFNjcm9sbChpbnQgc3RhcnQsIGludCBkaXN0YW5jZSwgaW50IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbVN0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCArIGRpc3RhbmNlOwotCi0gICAgICAgICAgICBtU3RhcnRUaW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotCi0gICAgICAgICAgICAvLyBVbnVzZWQKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSAwLjBmOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmxpbmcoaW50IHN0YXJ0LCBpbnQgdmVsb2NpdHksIGludCBtaW4sIGludCBtYXgpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBtVmVsb2NpdHkgPSB2ZWxvY2l0eTsKLQotICAgICAgICAgICAgbURlY2VsZXJhdGlvbiA9IGdldERlY2VsZXJhdGlvbih2ZWxvY2l0eSk7Ci0KLSAgICAgICAgICAgIC8vIEEgc3RhcnQgZnJvbSBhbiBpbnZhbGlkIHBvc2l0aW9uIGltbWVkaWF0ZWx5IGJyaW5ncyBiYWNrIHRvIGEgdmFsaWQgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1heDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIER1cmF0aW9uIGFyZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoLTEwMDAuMGYgKiB2ZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotCi0gICAgICAgICAgICBtRmluYWwgPSBzdGFydCAtIE1hdGgucm91bmQoKHZlbG9jaXR5ICogdmVsb2NpdHkpIC8gKDIuMGYgKiBtRGVjZWxlcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIENsYW1wIHRvIGEgdmFsaWQgZmluYWwgcG9zaXRpb24KLSAgICAgICAgICAgIGlmIChtRmluYWwgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtaW47Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWluLCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUZpbmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbWF4OwotICAgICAgICAgICAgICAgIG1EdXJhdGlvbiA9IGNvbXB1dGVEdXJhdGlvbihtU3RhcnQsIG1heCwgbVZlbG9jaXR5LCBtRGVjZWxlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmluaXNoKCkgewotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1GaW5hbDsKLSAgICAgICAgICAgIC8vIE5vdCByZXNldCBzaW5jZSBXZWJWaWV3IHJlbGllcyBvbiB0aGlzIHZhbHVlIGZvciBmYXN0IGZsaW5nLgotICAgICAgICAgICAgLy8gbUN1cnJWZWxvY2l0eSA9IDAuMGY7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRGaW5hbFBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgbUZpbmFsID0gcG9zaXRpb247Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXh0ZW5kRHVyYXRpb24oaW50IGV4dGVuZCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbGFwc2VkVGltZSA9IChpbnQpICh0aW1lIC0gbVN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBlbGFwc2VkVGltZSArIGV4dGVuZDsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRCb3VuY2VDb2VmZmljaWVudChmbG9hdCBjb2VmZmljaWVudCkgewotICAgICAgICAgICAgbUJvdW5jZUNvZWZmaWNpZW50ID0gY29lZmZpY2llbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHNwcmluZ2JhY2soaW50IHN0YXJ0LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICBtRmluaXNoZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBtU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IDA7Ci0KLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBBbmltYXRpb25VdGlscy5jdXJyZW50QW5pbWF0aW9uVGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gMDsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKHN0YXJ0LCBtaW4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNwcmluZ2JhY2soc3RhcnQsIG1heCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAhbUZpbmlzaGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3ByaW5nYmFjayhpbnQgc3RhcnQsIGludCBlbmQsIGJvb2xlYW4gcG9zaXRpdmUpIHsKLSAgICAgICAgICAgIG1GaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkNFOwotICAgICAgICAgICAgbVN0YXJ0ID0gbUZpbmFsID0gZW5kOwotICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgbVN0YXJ0VGltZSAtPSBPVkVSU0NST0xMX1NQUklOR0JBQ0tfRFVSQVRJT04gLyAyOwotICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKE1hdGguYWJzKGVuZCAtIHN0YXJ0KSAqIFRJTUVfQ09FRiAqIChwb3NpdGl2ZSA/IDEuMCA6IC0xLjBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGZsaW5nKGludCBzdGFydCwgaW50IHZlbG9jaXR5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgb3ZlcikgewotICAgICAgICAgICAgbVN0YXRlID0gVE9fRURHRTsKLSAgICAgICAgICAgIG1PdmVyID0gb3ZlcjsKLQotICAgICAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgbVN0YXJ0VGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IHZlbG9jaXR5OwotCi0gICAgICAgICAgICBtRGVjZWxlcmF0aW9uID0gZ2V0RGVjZWxlcmF0aW9uKHZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gRHVyYXRpb24gYXJlIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIHZlbG9jaXR5IC8gbURlY2VsZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIG1GaW5hbCA9IHN0YXJ0IC0gTWF0aC5yb3VuZCgodmVsb2NpdHkgKiB2ZWxvY2l0eSkgLyAoMi4wZiAqIG1EZWNlbGVyYXRpb24pKTsKLQotICAgICAgICAgICAgLy8gQ2xhbXAgdG8gYSB2YWxpZCBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKG1GaW5hbCA8IG1pbikgewotICAgICAgICAgICAgICAgIG1GaW5hbCA9IG1pbjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSBjb21wdXRlRHVyYXRpb24obVN0YXJ0LCBtaW4sIG1WZWxvY2l0eSwgbURlY2VsZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRmluYWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtYXg7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gY29tcHV0ZUR1cmF0aW9uKG1TdGFydCwgbWF4LCBtVmVsb2NpdHksIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gbWF4ICsgb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBzcHJpbmdiYWNrKG1heCArIG92ZXIsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhzdGFydCwgbWluLCBtYXgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBkdXJhdGlvblNpbmNlRWRnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hdGFuKChzdGFydC1tYXgpICogVElNRV9DT0VGIC8gdmVsb2NpdHkpIC8gVElNRV9DT0VGOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0ID0gbWF4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvbkVkZ2VSZWFjaGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IG1pbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gbWluIC0gb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nYmFjayhtaW4gLSBvdmVyLCBtaW4sIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmluZ2JhY2soc3RhcnQsIG1pbiwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZHVyYXRpb25TaW5jZUVkZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4oKHN0YXJ0LW1pbikgKiBUSU1FX0NPRUYgLyB2ZWxvY2l0eSkgLyBUSU1FX0NPRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZSA9IChpbnQpICh0aW1lIC0gMTAwMC4wZiAqIGR1cmF0aW9uU2luY2VFZGdlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgYm91bmNlIHRoYXQgc3RhcnRlZCBmcm9tIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnQgPSBtaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSAoaW50KSAodmVsb2NpdHkgLyBNYXRoLmNvcyhkdXJhdGlvblNpbmNlRWRnZSAqIFRJTUVfQ09FRikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG5vdGlmeUVkZ2VSZWFjaGVkKGludCBzdGFydCwgaW50IGVuZCwgaW50IG92ZXIpIHsKLSAgICAgICAgICAgIG1EZWNlbGVyYXRpb24gPSBnZXREZWNlbGVyYXRpb24obVZlbG9jaXR5KTsKLQotICAgICAgICAgICAgLy8gTG9jYWwgdGltZSwgdXNlZCB0byBjb21wdXRlIGVkZ2UgY3Jvc3NpbmcgdGltZS4KLSAgICAgICAgICAgIGZsb2F0IHRpbWVDdXJyZW50ID0gbUN1cnJWZWxvY2l0eSAvIG1EZWNlbGVyYXRpb247Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2UgPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGZsb2F0IHRpbWVFZGdlID0gLShmbG9hdCkgTWF0aC5zcXJ0KCgyLjBmICogZGlzdGFuY2UgLyBtRGVjZWxlcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICArICh0aW1lQ3VycmVudCAqIHRpbWVDdXJyZW50KSk7Ci0KLSAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtRGVjZWxlcmF0aW9uICogdGltZUVkZ2UpOwotCi0gICAgICAgICAgICAvLyBTaW11bGF0ZSBhIHN5bW1ldHJpYyBib3VuY2UgdGhhdCBzdGFydGVkIGZyb20gZWRnZQotICAgICAgICAgICAgbVN0YXJ0ID0gZW5kOwotCi0gICAgICAgICAgICBtT3ZlciA9IG92ZXI7Ci0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IEFuaW1hdGlvblV0aWxzLmN1cnJlbnRBbmltYXRpb25UaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gKGludCkgKHRpbWUgLSAxMDAwLjBmICogKHRpbWVDdXJyZW50IC0gdGltZUVkZ2UpKTsKLQotICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uRWRnZVJlYWNoZWQoKSB7Ci0gICAgICAgICAgICAvLyBtU3RhcnQsIG1WZWxvY2l0eSBhbmQgbVN0YXJ0VGltZSB3ZXJlIGFkanVzdGVkIHRvIHRoZWlyIHZhbHVlcyB3aGVuIGVkZ2Ugd2FzIHJlYWNoZWQuCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBkaXN0YW5jZSA9IG1WZWxvY2l0eSAvIFRJTUVfQ09FRjsKLQotICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IG1PdmVyKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3ByaW5nIGZvcmNlIHdpbGwgYnJpbmcgdXMgYmFjayB0byBmaW5hbCBwb3NpdGlvbgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0JPVU5DRTsKLSAgICAgICAgICAgICAgICBtRmluYWwgPSBtU3RhcnQ7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gT1ZFUlNDUk9MTF9TUFJJTkdCQUNLX0RVUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBWZWxvY2l0eSBpcyB0b28gaGlnaCwgd2Ugd2lsbCBoaXQgdGhlIGJvdW5kYXJ5IGxpbWl0Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gVE9fQk9VTkRBUlk7Ci0gICAgICAgICAgICAgICAgaW50IG92ZXIgPSBtVmVsb2NpdHkgPiAwID8gbU92ZXIgOiAtbU92ZXI7Ci0gICAgICAgICAgICAgICAgbUZpbmFsID0gbVN0YXJ0ICsgb3ZlcjsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSAoMTAwMC4wZiAqIE1hdGguYXNpbihvdmVyIC8gZGlzdGFuY2UpIC8gVElNRV9DT0VGKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY29udGludWVXaGVuRmluaXNoZWQoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVE9fRURHRToKLSAgICAgICAgICAgICAgICAgICAgLy8gRHVyYXRpb24gZnJvbSBzdGFydCB0byBudWxsIHZlbG9jaXR5Ci0gICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpICgtMTAwMC4wZiAqIG1WZWxvY2l0eSAvIG1EZWNlbGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobUR1cmF0aW9uIDwgZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhbmltYXRpb24gd2FzIGNsYW1wZWQsIHdlIHJlYWNoZWQgdGhlIGVkZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydCA9IG1GaW5hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWVkIHdoZW4gZWRnZSB3YXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiBtRHVyYXRpb24gLyAxMDAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgb25FZGdlUmVhY2hlZCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsIHN0b3AsIG5vIG5lZWQgdG8gY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRPX0JPVU5EQVJZOgotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lICs9IG1EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRTcHJpbmdiYWNrKG1GaW5hbCwgbUZpbmFsIC0gKG1WZWxvY2l0eSA+IDAgPyBtT3ZlcjotbU92ZXIpLCBtVmVsb2NpdHkgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUT19CT1VOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIC8vbVZlbG9jaXR5ID0gKGludCkgKG1WZWxvY2l0eSAqIEJPVU5DRV9DT0VGRklDSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eSA9IChpbnQpIChtVmVsb2NpdHkgKiBtQm91bmNlQ29lZmZpY2llbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobVZlbG9jaXR5KSA8IE1JTklNVU1fVkVMT0NJVFlfRk9SX0JPVU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWUgKz0gbUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgdmVsb2NpdHkgZm9yIGN1cnJlbnQgdGltZS4gUmV0dXJucwotICAgICAgICAgKiB0cnVlIGlmIHVwZGF0ZSBoYXMgYmVlbiBkb25lIGFuZCBmYWxzZSBpZiBhbmltYXRpb24gZHVyYXRpb24gaGFzIGJlZW4KLSAgICAgICAgICogcmVhY2hlZC4KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gdXBkYXRlKCkgewotICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gQW5pbWF0aW9uVXRpbHMuY3VycmVudEFuaW1hdGlvblRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24gPSB0aW1lIC0gbVN0YXJ0VGltZTsKLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uID4gbUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkb3VibGUgZGlzdGFuY2U7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCB0ID0gZHVyYXRpb24gLyAxMDAwLjBmOwotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBUT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJWZWxvY2l0eSA9IG1WZWxvY2l0eSArIG1EZWNlbGVyYXRpb24gKiB0OwotICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbVZlbG9jaXR5ICogdCArIG1EZWNlbGVyYXRpb24gKiB0ICogdCAvIDIuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGQgPSB0ICogVElNRV9DT0VGOwotICAgICAgICAgICAgICAgIG1DdXJyVmVsb2NpdHkgPSBtVmVsb2NpdHkgKiAoZmxvYXQpTWF0aC5jb3MoZCk7Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBtVmVsb2NpdHkgLyBUSU1FX0NPRUYgKiBNYXRoLnNpbihkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IG1TdGFydCArIChpbnQpIGRpc3RhbmNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUG9wdXBNZW51LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3NzBhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cE1lbnUuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBIFBvcHVwTWVudSBkaXNwbGF5cyBhIHtAbGluayBNZW51fSBpbiBhIG1vZGFsIHBvcHVwIHdpbmRvdyBhbmNob3JlZCB0byBhIHtAbGluayBWaWV3fS4KKyAqIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIHZpZXcgaWYgdGhlcmUgaXMgcm9vbSwgb3IgYWJvdmUgaXQgaWYgdGhlcmUgaXMgbm90LgorICogSWYgdGhlIElNRSBpcyB2aXNpYmxlIHRoZSBwb3B1cCB3aWxsIG5vdCBvdmVybGFwIGl0IHVudGlsIGl0IGlzIHRvdWNoZWQuIFRvdWNoaW5nIG91dHNpZGUKKyAqIG9mIHRoZSBwb3B1cCB3aWxsIGRpc21pc3MgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBWaWV3IG1BbmNob3I7CisgICAgcHJpdmF0ZSBNZW51UG9wdXBIZWxwZXIgbVBvcHVwOworICAgIHByaXZhdGUgT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgbU1lbnVJdGVtQ2xpY2tMaXN0ZW5lcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQb3B1cE1lbnUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgUG9wdXBNZW51LgorICAgICAqIEBwYXJhbSBhbmNob3IgQW5jaG9yIHZpZXcgZm9yIHRoaXMgcG9wdXAuIFRoZSBwb3B1cCB3aWxsIGFwcGVhciBiZWxvdyB0aGUgYW5jaG9yIGlmIHRoZXJlCisgICAgICogICAgICAgICAgICAgICBpcyByb29tLCBvciBhYm92ZSBpdCBpZiB0aGVyZSBpcyBub3QuCisgICAgICovCisgICAgcHVibGljIFBvcHVwTWVudShDb250ZXh0IGNvbnRleHQsIFZpZXcgYW5jaG9yKSB7CisgICAgICAgIC8vIFRPRE8gVGhlbWU/CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoY29udGV4dCk7CisgICAgICAgIG1NZW51LnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtUG9wdXAgPSBuZXcgTWVudVBvcHVwSGVscGVyKGNvbnRleHQsIG1NZW51LCBhbmNob3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBNZW51fSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwb3B1cC4gUG9wdWxhdGUgdGhlIHJldHVybmVkIE1lbnUgd2l0aAorICAgICAqIGl0ZW1zIGJlZm9yZSBjYWxsaW5nIHtAbGluayAjc2hvdygpfS4KKyAgICAgKgorICAgICAqIEBzZWUgI3Nob3coKQorICAgICAqIEBzZWUgI2dldE1lbnVJbmZsYXRlcigpCisgICAgICovCisgICAgcHVibGljIE1lbnUgZ2V0TWVudSgpIHsKKyAgICAgICAgcmV0dXJuIG1NZW51OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWVudUluZmxhdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluZmxhdGUgbWVudSBpdGVtcyBmcm9tIFhNTCBpbnRvIHRoZQorICAgICAqIG1lbnUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRNZW51KCl9LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0TWVudSgpCisgICAgICovCisgICAgcHVibGljIE1lbnVJbmZsYXRlciBnZXRNZW51SW5mbGF0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IHRoZSBtZW51IHBvcHVwIGFuY2hvcmVkIHRvIHRoZSB2aWV3IHNwZWNpZmllZCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgICAqIEBzZWUgI2Rpc21pc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIG1Qb3B1cC5zaG93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzbWlzcyB0aGUgbWVudSBwb3B1cC4KKyAgICAgKiBAc2VlICNzaG93KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNtaXNzKCkgeworICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1NZW51SXRlbUNsaWNrTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChtTWVudUl0ZW1DbGlja0xpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudUl0ZW1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayhpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICBpZiAoIXN1Yk1lbnUuaGFzVmlzaWJsZUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3VycmVudCBtZW51IHdpbGwgYmUgZGlzbWlzc2VkIGJ5IHRoZSBub3JtYWwgaGVscGVyLCBzdWJtZW51IHdpbGwgYmUgc2hvd24gaW4gaXRzIHBsYWNlLgorICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKG1Db250ZXh0LCBzdWJNZW51LCBtQW5jaG9yKS5zaG93KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbWVudSBpdGVtIGNsaWNrIGV2ZW50cyBpZiB0aGUgaXRlbXMgdGhlbXNlbHZlcworICAgICAqIGRvIG5vdCBoYXZlIGluZGl2aWR1YWwgaXRlbSBjbGljayBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkIGlmIHRoZSBpdGVtIGl0c2VsZiBkaWQKKyAgICAgICAgICogbm90IGFscmVhZHkgaGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGl0ZW0ge0BsaW5rIE1lbnVJdGVtfSB0aGF0IHdhcyBjbGlja2VkCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Qb3B1cFdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKaW5kZXggMDM3ODMyOC4uNGEzZTJhOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1BvcHVwV2luZG93LmphdmEKQEAgLTE5LDIyICsxOSwyNCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uVG91Y2hMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICBwcml2YXRlIE9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1PblNjcm9sbENoYW5nZWRMaXN0ZW5lciA9CiAgICAgICAgIG5ldyBPblNjcm9sbENoYW5nZWRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBWaWV3IGFuY2hvciA9IG1BbmNob3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgVmlldyBhbmNob3IgPSBtQW5jaG9yICE9IG51bGwgPyBtQW5jaG9yLmdldCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IG51bGwgJiYgbVBvcHVwVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHAgPSAoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcHVwVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKQEAgLTE1NywxMiArMTU5LDIxIEBACiAgICAgICogPHA+VGhlIHBvcHVwIGRvZXMgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgogICAgICAqLwogICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGEgbmV3LCBlbXB0eSwgbm9uIGZvY3VzYWJsZSBwb3B1cCB3aW5kb3cgb2YgZGltZW5zaW9uICgwLDApLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgcG9wdXAgZG9lcyBub3QgcHJvdmlkZSBhIGJhY2tncm91bmQuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBQb3B1cFdpbmRvdyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSAoV2luZG93TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAKICAgICAgICAgVHlwZWRBcnJheSBhID0KICAgICAgICAgICAgIGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgICAgICAgICBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUG9wdXBXaW5kb3csIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwogCiAgICAgICAgIG1CYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5Qb3B1cFdpbmRvd19wb3B1cEJhY2tncm91bmQpOwogCkBAIC0xMDIyLDcgKzEwMzMsOSBAQAogICAgICAgICAKICAgICAgICAgaW50IGJvdHRvbUVkZ2UgPSBkaXNwbGF5RnJhbWUuYm90dG9tOwogICAgICAgICBpZiAoaWdub3JlQm90dG9tRGVjb3JhdGlvbnMpIHsKLSAgICAgICAgICAgIGJvdHRvbUVkZ2UgPSBhbmNob3IuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGFuY2hvci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBib3R0b21FZGdlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkuaGVpZ2h0UGl4ZWxzIC0KKyAgICAgICAgICAgICAgICAgICAgKGludCkgcmVzLmdldERpbWVuc2lvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnNjcmVlbl9tYXJnaW5fYm90dG9tKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgZGlzdGFuY2VUb0JvdHRvbSA9IGJvdHRvbUVkZ2UgLSAoYW5jaG9yUG9zWzFdICsgYW5jaG9yLmdldEhlaWdodCgpKSAtIHlPZmZzZXQ7CiAgICAgICAgIGZpbmFsIGludCBkaXN0YW5jZVRvVG9wID0gYW5jaG9yUG9zWzFdIC0gZGlzcGxheUZyYW1lLnRvcCArIHlPZmZzZXQ7CkBAIC0xMzE1LDYgKzEzMjgsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUG9wdXBWaWV3Q29udGFpbmVyIGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBvcHVwV2luZG93LlBvcHVwVmlld0NvbnRhaW5lciI7CiAKICAgICAgICAgcHVibGljIFBvcHVwVmlld0NvbnRhaW5lcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlYzdkOTI3Li4zYTQ0ODdjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtNzE2LDggKzcxNiw4IEBACiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldER1cmF0aW9uKG1EdXJhdGlvbik7CiAgICAgICAgICAgICBtQW5pbWF0aW9uLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKICAgICAgICAgICAgIG1BbmltYXRpb24uc2V0U3RhcnRUaW1lKEFuaW1hdGlvbi5TVEFSVF9PTl9GSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgICAgICB9CisgICAgICAgIHBvc3RJbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MzAsNiArNzMwLDcgQEAKICAgICAgICAgICAgICgoQW5pbWF0YWJsZSkgbUluZGV0ZXJtaW5hdGVEcmF3YWJsZSkuc3RvcCgpOwogICAgICAgICAgICAgbVNob3VsZFN0YXJ0QW5pbWF0aW9uRHJhd2FibGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBwb3N0SW52YWxpZGF0ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1F1aWNrQ29udGFjdEJhZGdlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQppbmRleCA0YmJiNTQwLi41NTk4YzY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUXVpY2tDb250YWN0QmFkZ2UuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CiAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtQmFkZ2VCYWNrZ3JvdW5kOwogICAgIHByaXZhdGUgRHJhd2FibGUgbU5vQmFkZ2VCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgRHJhd2FibGUgbURlZmF1bHRBdmF0YXI7CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gbUV4Y2x1ZGVNaW1lcyA9IG51bGw7CiAKQEAgLTExNyw2ICsxMTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBzaXplKSB7CiAgICAgICAgIG1Nb2RlID0gc2l6ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb250YWN0IHBob3RvIHRvIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEltYWdlVG9EZWZhdWx0KCkgeworICAgICAgICBpZiAobURlZmF1bHRBdmF0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbURlZmF1bHRBdmF0YXIgPSBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRGVmYXVsdEF2YXRhcik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBjb250YWN0IHVyaSB0aGF0IHRoaXMgUXVpY2tDb250YWN0QmFkZ2Ugc2hvdWxkIGJlIGFzc29jaWF0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3cy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKaW5kZXggN2E3MGM4MC4uMGNhNzFlMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwd2lkZ2V0LkFwcFdpZGdldEhvc3RWaWV3OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKQEAgLTYwLDEyICs2MSwxMiBAQAogICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgbGF5b3V0IAogICAgICAqIHJlc291cmNlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZTsKICAgICAKICAgICAvKioKICAgICAgKiBUaGUgcmVzb3VyY2UgSUQgb2YgdGhlIGxheW91dCBmaWxlLiAoQWRkZWQgdG8gdGhlIHBhcmNlbCkKICAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTGF5b3V0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUxheW91dElkOwogCiAgICAgLyoqCiAgICAgICogQW4gYXJyYXkgb2YgYWN0aW9ucyB0byBwZXJmb3JtIG9uIHRoZSB2aWV3IHRyZWUgb25jZSBpdCBoYXMgYmVlbgpAQCAtMTEwLDYgKzExMSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBTZXRFbXB0eVZpZXcgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBpbnQgZW1wdHlWaWV3SWQ7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEFHID0gNjsKKworICAgICAgICBTZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMuZW1wdHlWaWV3SWQgPSBlbXB0eVZpZXdJZDsKKyAgICAgICAgfQorCisgICAgICAgIFNldEVtcHR5VmlldyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5lbXB0eVZpZXdJZCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoVEFHKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0aGlzLnZpZXdJZCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodGhpcy5lbXB0eVZpZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVmlldyByb290KSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSByb290LmZpbmRWaWV3QnlJZCh2aWV3SWQpOworICAgICAgICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3PD8+KSkgcmV0dXJuOworCisgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBhZGFwdGVyVmlldyA9IChBZGFwdGVyVmlldzw/PikgdmlldzsKKworICAgICAgICAgICAgZmluYWwgVmlldyBlbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChlbXB0eVZpZXdJZCk7CisgICAgICAgICAgICBpZiAoZW1wdHlWaWV3ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgYWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3KGVtcHR5Vmlldyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjc2V0T25DbGlja0xpc3RlbmVyKGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcil9CkBAIC0yNjYsNiArMzAzLDYzIEBACiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRBRyA9IDM7CiAgICAgfQogICAgIAorICAgIHByaXZhdGUgY2xhc3MgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMgZXh0ZW5kcyBBY3Rpb24geworICAgICAgICBpbnQgdmlld0lkOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUQUcgPSA1OworCisgICAgICAgIFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKGludCB2aWV3SWQsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnZpZXdJZCA9IHZpZXdJZDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcyhQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHRoaXMudmlld0lkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChUQUcpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHRoaXMudmlld0lkKTsKKyAgICAgICAgICAgIG91dC53cml0ZVN0cmluZyh0aGlzLm1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFZpZXcgcm9vdCkgeworICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJjYW4ndCBmaW5kIHZpZXc6IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcodmlld0lkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gdmlldy5nZXRDbGFzcygpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0ga2xhc3MuZ2V0TWV0aG9kKHRoaXMubWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWN0aW9uRXhjZXB0aW9uKCJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBkb2Vzbid0IGhhdmUgbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMubWV0aG9kTmFtZSArICIoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFJlbW90YWJsZVZpZXdNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvbkV4Y2VwdGlvbigidmlldzogIiArIGtsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbid0IHVzZSBtZXRob2Qgd2l0aCBSZW1vdGVWaWV3czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudElmU3RhdGVtZW50CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKCJSZW1vdGVWaWV3cyIsICJ2aWV3OiAiICsga2xhc3MuZ2V0TmFtZSgpICsgIiBjYWxsaW5nIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLm1ldGhvZE5hbWUgKyAiKCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZSh2aWV3KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQmFzZSBjbGFzcyBmb3IgdGhlIHJlZmxlY3Rpb24gYWN0aW9ucy4KICAgICAgKi8KQEAgLTI4NSw2ICszNzksNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDExOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJJVE1BUCA9IDEyOwogICAgICAgICBzdGF0aWMgZmluYWwgaW50IEJVTkRMRSA9IDEzOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IElOVEVOVCA9IDE0OwogCiAgICAgICAgIGludCB2aWV3SWQ7CiAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwpAQCAtMzQ3LDYgKzQ0Miw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBpbi5yZWFkQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5URU5UOgorICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gSW50ZW50LkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDAyLDYgKzUwMCw5IEBACiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ1bmRsZSgoQnVuZGxlKSB0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgICgoSW50ZW50KXRoaXMudmFsdWUpLndyaXRlVG9QYXJjZWwob3V0LCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNDM1LDYgKzUzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY2xhc3M7CiAgICAgICAgICAgICAgICAgY2FzZSBCVU5ETEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCdW5kbGUuY2xhc3M7CisgICAgICAgICAgICAgICAgY2FzZSBJTlRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlbnQuY2xhc3M7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC01NjIsNiArNjY1LDEyIEBACiAgICAgICAgICAgICAgICAgY2FzZSBWaWV3R3JvdXBBY3Rpb24uVEFHOgogICAgICAgICAgICAgICAgICAgICBtQWN0aW9ucy5hZGQobmV3IFZpZXdHcm91cEFjdGlvbihwYXJjZWwpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWZsZWN0aW9uQWN0aW9uV2l0aG91dFBhcmFtcy5UQUc6CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25zLmFkZChuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXMocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2V0RW1wdHlWaWV3LlRBRzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbnMuYWRkKG5ldyBTZXRFbXB0eVZpZXcocGFyY2VsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25FeGNlcHRpb24oIlRhZyAiICsgdGFnICsgIiBub3QgZm91bmQiKTsKICAgICAgICAgICAgICAgICB9CkBAIC01NjksNiArNjc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBjbG9uZSgpIHsKICAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgdGhhdCA9IG5ldyBSZW1vdGVWaWV3cyhtUGFja2FnZSwgbUxheW91dElkKTsKICAgICAgICAgaWYgKG1BY3Rpb25zICE9IG51bGwpIHsKQEAgLTYyMiw2ICs3MzIsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIEFkYXB0ZXJWaWV3RmxpcHBlciNzaG93TmV4dCgpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dOZXh0KCl9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvd05leHQoaW50IHZpZXdJZCkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb25XaXRob3V0UGFyYW1zKHZpZXdJZCwgInNob3dOZXh0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgb24gd2hpY2ggdG8gY2FsbCB7QGxpbmsgQWRhcHRlclZpZXdGbGlwcGVyI3Nob3dQcmV2aW91cygpfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNob3dQcmV2aW91cyhpbnQgdmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgUmVmbGVjdGlvbkFjdGlvbldpdGhvdXRQYXJhbXModmlld0lkLCAic2hvd1ByZXZpb3VzIikpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBWaWV3LnNldFZpc2liaWxpdHkKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB2aXNpYmlsaXR5IHNob3VsZCBjaGFuZ2UKQEAgLTY3Miw2ICs4MDAsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgQWRhcHRlclZpZXcuc2V0RW1wdHlWaWV3CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyBvbiB3aGljaCB0byBzZXQgdGhlIGVtcHR5IHZpZXcKKyAgICAgKiBAcGFyYW0gZW1wdHlWaWV3SWQgVGhlIHZpZXcgaWQgb2YgdGhlIGVtcHR5IHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbXB0eVZpZXcoaW50IHZpZXdJZCwgaW50IGVtcHR5Vmlld0lkKSB7CisgICAgICAgIGFkZEFjdGlvbihuZXcgU2V0RW1wdHlWaWV3KHZpZXdJZCwgZW1wdHlWaWV3SWQpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIENocm9ub21ldGVyI3NldEJhc2UgQ2hyb25vbWV0ZXIuc2V0QmFzZX0sCiAgICAgICoge0BsaW5rIENocm9ub21ldGVyI3NldEZvcm1hdCBDaHJvbm9tZXRlci5zZXRGb3JtYXR9LAogICAgICAqIGFuZCB7QGxpbmsgQ2hyb25vbWV0ZXIjc3RhcnQgQ2hyb25vbWV0ZXIuc3RhcnQoKX0gb3IKQEAgLTc2OSw2ICs5MDcsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldFJlbW90ZVZpZXdzQWRhcHRlcihJbnRlbnQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3SWQgVGhlIGlkIG9mIHRoZSB2aWV3IHdob3NlIHRleHQgc2hvdWxkIGNoYW5nZQorICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIGludGVudCBvZiB0aGUgc2VydmljZSB3aGljaCB3aWxsIGJlCisgICAgICogICAgICAgICAgICBwcm92aWRpbmcgZGF0YSB0byB0aGUgUmVtb3RlVmlld3NBZGFwdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRhcHRlcihpbnQgdmlld0lkLCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIHNldEludGVudCh2aWV3SWQsICJzZXRSZW1vdGVWaWV3c0FkYXB0ZXIiLCBpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcjc21vb3RoU2Nyb2xsVG9Qb3NpdGlvbihpbnQsIGludCl9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdJZCBUaGUgaWQgb2YgdGhlIHZpZXcgd2hvc2UgdGV4dCBzaG91bGQgY2hhbmdlCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFNjcm9sbCB0byB0aGlzIGFkYXB0ZXIgcG9zaXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc2V0SW50KHZpZXdJZCwgInNtb290aFNjcm9sbFRvUG9zaXRpb24iLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldyNzbW9vdGhTY3JvbGxUb1Bvc2l0aW9uKGludCwgaW50KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFNjcm9sbCBieSB0aGlzIGFkYXB0ZXIgcG9zaXRpb24gb2Zmc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVTY3JvbGxQb3NpdGlvbihpbnQgdmlld0lkLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHNldEludCh2aWV3SWQsICJzbW9vdGhTY3JvbGxCeU9mZnNldCIsIG9mZnNldCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2FsbCBhIG1ldGhvZCB0YWtpbmcgb25lIGJvb2xlYW4gb24gYSB2aWV3IGluIHRoZSBsYXlvdXQgZm9yIHRoaXMgUmVtb3RlVmlld3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdmlld0lkIFRoZSBpZCBvZiB0aGUgdmlldyB3aG9zZSB0ZXh0IHNob3VsZCBjaGFuZ2UKQEAgLTkxNSw2ICsxMDg0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld0lkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlbnQoaW50IHZpZXdJZCwgU3RyaW5nIG1ldGhvZE5hbWUsIEludGVudCB2YWx1ZSkgeworICAgICAgICBhZGRBY3Rpb24obmV3IFJlZmxlY3Rpb25BY3Rpb24odmlld0lkLCBtZXRob2ROYW1lLCBSZWZsZWN0aW9uQWN0aW9uLklOVEVOVCwgdmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB0aGUgdmlldyBoaWVyYXJjaHkgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFwcGxpZXMKICAgICAgKiBhbGwgb2YgdGhlIGFjdGlvbnMuCiAgICAgICogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiOWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBBbiBhZGFwdGVyIHRvIGEgUmVtb3RlVmlld3NTZXJ2aWNlIHdoaWNoIGZldGNoZXMgYW5kIGNhY2hlcyBSZW1vdGVWaWV3cworICogdG8gYmUgbGF0ZXIgaW5mbGF0ZWQgYXMgY2hpbGQgdmlld3MuCisgKi8KKy8qKiBAaGlkZSAqLworcHVibGljIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVZpZXdzQWRhcHRlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIFJlbW90ZVZpZXdzQ2FjaGUgbVZpZXdDYWNoZTsKKworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtV29ya2VyVGhyZWFkOworICAgIC8vIGl0ZW1zIG1heSBiZSBpbnRlcnJ1cHRlZCB3aXRoaW4gdGhlIG5vcm1hbGx5IHByb2Nlc3NlZCBxdWV1ZXMKKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclF1ZXVlOworICAgIHByaXZhdGUgSGFuZGxlciBtTWFpblF1ZXVlOworICAgIC8vIGl0ZW1zIGFyZSBuZXZlciBkZXF1ZXVlZCBmcm9tIHRoZSBwcmlvcml0eSBxdWV1ZSBhbmQgbXVzdCBydW4KKyAgICBwcml2YXRlIEhhbmRsZXIgbVdvcmtlclByaW9yaXR5UXVldWU7CisgICAgcHJpdmF0ZSBIYW5kbGVyIG1NYWluUHJpb3JpdHlRdWV1ZTsKKworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSBmb3IgdGhlIFJlbW90ZUFkYXB0ZXIgdG8gbm90aWZ5IG90aGVyIGNsYXNzZXMgd2hlbiBhZGFwdGVycworICAgICAqIGFyZSBhY3R1YWxseSBjb25uZWN0ZWQgdG8vZGlzY29ubmVjdGVkIGZyb20gdGhlaXIgYWN0dWFsIHNlcnZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gdGhhdCBnZXRzIHBvcHVsYXRlZCB3aGVuIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgaXMKKyAgICAgKiBib3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3RlZDsKKyAgICAgICAgcHJpdmF0ZSBJUmVtb3RlVmlld3NGYWN0b3J5IG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgUmVtb3RlQWRhcHRlckNvbm5lY3Rpb25DYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzQWRhcHRlclNlcnZpY2VDb25uZWN0aW9uKFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICBtUmVtb3RlVmlld3NGYWN0b3J5ID0gSVJlbW90ZVZpZXdzRmFjdG9yeS5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIG5vdGlmeURhdGFTZXRDaGFuZ2VkIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAgICAgLy8gdmlld3MgYXJlIG5vdCB1cGRhdGVkIHR3aWNlCisgICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIGRhdGEsIHRoZW4gY2FsbGJhY2sKKyAgICAgICAgICAgIG1Xb3JrZXJQcmlvcml0eVF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIHZpZXdUeXBlQ291bnQgc3BlY2lmaWNhbGx5LCBzbyBqdXN0IGdldCBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGUucmVxdWVzdE1ldGFEYXRhKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcG9zdCBhIHJ1bm5hYmxlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIG9uIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBtTWFpblByaW9yaXR5UXVldWUucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdGFydEJhY2tncm91bmRMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIG1SZW1vdGVWaWV3c0ZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBjbGVhciB0aGUgbWFpbi93b3JrZXIgcXVldWVzCisgICAgICAgICAgICBtTWFpblF1ZXVlLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzdG9wIHRoZSBiYWNrZ3JvdW5kIGxvYWRlcgorICAgICAgICAgICAgbVZpZXdDYWNoZS5zdG9wQmFja2dyb3VuZExvYWRlcigpOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uUmVtb3RlQWRhcHRlckRpc2Nvbm5lY3RlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElSZW1vdGVWaWV3c0ZhY3RvcnkgZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVWaWV3c0ZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgY2FjaGUgb2YgcmVtb3RlIHZpZXdzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgUmVtb3RlVmlld3NDYWNoZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlVmlld3NDYWNoZSI7CisKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3c0luZm8gbVZpZXdDYWNoZUluZm87CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NJbmRleEluZm9bXSBtVmlld0NhY2hlOworICAgICAgICBwcml2YXRlIGludFtdIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlczsKKyAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0PEludGVnZXI+IG1WaWV3Q2FjaGVMb2FkSW5kaWNlczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZDsKKworICAgICAgICAvLyBpZiBhIHVzZXIgbG9hZGluZyB2aWV3IGlzIG5vdCBwcm92aWRlZCwgdGhlbiB3ZSBjcmVhdGUgYSB0ZW1wb3Jhcnkgb25lCisgICAgICAgIC8vIGZvciB0aGUgdXNlciB1c2luZyB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCB2aWV3CisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3MgbVVzZXJMb2FkaW5nVmlldzsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVWaWV3cyBtRmlyc3RWaWV3OworICAgICAgICBwcml2YXRlIGludCBtRmlyc3RWaWV3SGVpZ2h0OworCisgICAgICAgIC8vIGRldGVybWluZXMgd2hlbiB0aGUgY3VycmVudCBjYWNoZSB3aW5kb3cgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIG5ldworICAgICAgICAvLyBpdGVtcyAoaWUuIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzbGFjaykKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb247CisgICAgICAgIHByaXZhdGUgaW50IG1WaWV3Q2FjaGVFbmRQb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUhhbGZDYWNoZVNpemU7CisgICAgICAgIHByaXZhdGUgaW50IG1DYWNoZVNsYWNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1DYWNoZVNsYWNrUGVyY2VudGFnZSA9IDAuNzVmOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGF0IGVhY2ggaW5kZXggb2YgdGhlIGNhY2hlLiBBbnkgbWVtYmVyIAorICAgICAgICAgKiB0aGF0IGlzIG5vdCBpbnZhbGlkYXRlZCBwZXJzaXN0cyB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgY2FjaGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzSW5kZXhJbmZvIHsKKyAgICAgICAgICAgIEZyYW1lTGF5b3V0IGZsaXBwZXI7CisgICAgICAgICAgICBSZW1vdGVWaWV3cyB2aWV3OworICAgICAgICAgICAgbG9uZyBpdGVtSWQ7CisgICAgICAgICAgICBpbnQgdHlwZUlkOworCisgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbygpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgc2V0KFJlbW90ZVZpZXdzIHYsIGxvbmcgaWQpIHsKKyAgICAgICAgICAgICAgICB2aWV3ID0gdjsKKyAgICAgICAgICAgICAgICBpdGVtSWQgPSBpZDsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0eXBlSWQgPSB2LmdldExheW91dElkKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0eXBlSWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgaXRlbUlkID0gMDsKKyAgICAgICAgICAgICAgICB0eXBlSWQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2aWV3ICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW90ZSBhZGFwdGVyIG1ldGFkYXRhLiBVc2VmdWwgZm9yIHdoZW4gd2UgaGF2ZSB0byBsb2NrIG9uIHNvbWV0aGluZworICAgICAgICAgKiBiZWZvcmUgdXBkYXRpbmcgdGhlIG1ldGFkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVWaWV3c0luZm8geworICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgaW50IHZpZXdUeXBlQ291bnQ7CisgICAgICAgICAgICBib29sZWFuIGhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNEYXRhRGlydHk7CisgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbVR5cGVJZEluZGV4TWFwOworCisgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8oKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGR1bW15IHZpZXcgdHlwZQorICAgICAgICAgICAgICAgIHZpZXdUeXBlQ291bnQgPSAxOworICAgICAgICAgICAgICAgIGhhc1N0YWJsZUlkcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVHlwZUlkSW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlbW90ZVZpZXdzQ2FjaGUoaW50IGhhbGZDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIG1IYWxmQ2FjaGVTaXplID0gaGFsZkNhY2hlU2l6ZTsKKyAgICAgICAgICAgIG1DYWNoZVNsYWNrID0gTWF0aC5yb3VuZChtQ2FjaGVTbGFja1BlcmNlbnRhZ2UgKiBtSGFsZkNhY2hlU2l6ZSk7CisgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICBtVmlld0NhY2hlRW5kUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWNoZQorICAgICAgICAgICAgaW50IGNhY2hlU2l6ZSA9IDIgKiBtSGFsZkNhY2hlU2l6ZSArIDE7CisgICAgICAgICAgICBtVmlld0NhY2hlSW5mbyA9IG5ldyBSZW1vdGVWaWV3c0luZm8oKTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGUgPSBuZXcgUmVtb3RlVmlld3NJbmRleEluZm9bY2FjaGVTaXplXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbaV0gPSBuZXcgUmVtb3RlVmlld3NJbmRleEluZm8oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlcyA9IG5ldyBpbnRbY2FjaGVTaXplXTsKKyAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uIDw9IHBvc2l0aW9uKSAmJiAocG9zaXRpb24gPD0gbVZpZXdDYWNoZUVuZFBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb250YWluc0FuZElzVmFsaWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbnMocG9zaXRpb24pKSB7CisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3NJbmRleEluZm8gaW5kZXhJbmZvID0gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV07CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mby5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZ2V0Q2FjaGVJbmRleChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIHRha2UgdGhlIG1vZHVsbyBvZiB0aGUgcG9zaXRpb24KKyAgICAgICAgICAgIGZpbmFsIGludCBjYWNoZVNpemUgPSBtVmlld0NhY2hlLmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiAoY2FjaGVTaXplICsgKHBvc2l0aW9uICUgY2FjaGVTaXplKSkgJSBjYWNoZVNpemU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TWV0YURhdGEoKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0aWVzL2ZpcnN0IHZpZXcgKHNvIHRoYXQgd2UgY2FuIHVzZSBpdCB0bworICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlIG91ciBkdW1teSB2aWV3cykKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMgPSBmYWN0b3J5Lmhhc1N0YWJsZUlkcygpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlld1R5cGVDb3VudCA9IGZhY3RvcnkuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBmYWN0b3J5LmdldENvdW50KCk7CisgICAgICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzIGxvYWRpbmdWaWV3ID0gZmFjdG9yeS5nZXRMb2FkaW5nVmlldygpOworICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3cyBmaXJzdFZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoKGNvdW50ID4gMCkgJiYgKGxvYWRpbmdWaWV3ID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8gaW5mbyA9IG1WaWV3Q2FjaGVJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5oYXNTdGFibGVJZHMgPSBoYXNTdGFibGVJZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnZpZXdUeXBlQ291bnQgPSB2aWV3VHlwZUNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VyTG9hZGluZ1ZpZXcgPSBsb2FkaW5nVmlldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFZpZXcgPSBmaXJzdFZpZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0Vmlld0hlaWdodCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGluIHJlcXVlc3RNZXRhRGF0YSgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGFueSBtZW1iZXJzIGFmdGVyIHRoZSBmYWlsZWQgY2FsbAorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZm8gaW5mbyA9IG1WaWV3Q2FjaGVJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5oYXNTdGFibGVJZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udmlld1R5cGVDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VyTG9hZGluZ1ZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgLy8gd2UgbWFyayB0aGUgZGF0YSBhcyBkaXJ0eSBzbyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gZmV0Y2ggdmlld3Mgd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICAgIC8vIGFuIG9uRGF0YVNldERpcnR5KCkgY2FsbCBmcm9tIHRoZSBhZGFwdGVyCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAgICAgLy8gYWN0dWFsbHkgY2FsbHMgdGhyb3VnaCB0byB0aGUgZmFjdG9yeSB0byBub3RpZnkgaXQgdG8gdXBkYXRlCisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCBiYWNrIHRvIHRoZSBmYWN0b3J5CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnkub25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBpbiB1cGRhdGVOb3RpZnlEYXRhU2V0Q2hhbmdlZCgpOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlYXJseSB0byBwcmV2ZW50IGNvbnRhaW5lciBmcm9tIGJlaW5nIG5vdGlmaWVkIChub3RoaW5nIGhhcyBjaGFuZ2VkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZS1yZXF1ZXN0IHRoZSBuZXcgbWV0YWRhdGEgKG9ubHkgYWZ0ZXIgdGhlIG5vdGlmaWNhdGlvbiB0byB0aGUgZmFjdG9yeSkKKyAgICAgICAgICAgIHJlcXVlc3RNZXRhRGF0YSgpOworCisgICAgICAgICAgICAvLyBwb3N0IGEgbmV3IHJ1bm5hYmxlIG9uIHRoZSBtYWluIHRocmVhZCB0byBwcm9wYWdhdGUgdGhlIG5vdGlmaWNhdGlvbiBiYWNrCisgICAgICAgICAgICAvLyB0byB0aGUgYmFzZSBhZGFwdGVyCisgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZW1vdGVWaWV3c0luZm8oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBJUmVtb3RlVmlld3NGYWN0b3J5IGZhY3RvcnkgPSBtU2VydmljZUNvbm5lY3Rpb24uZ2V0UmVtb3RlVmlld3NGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBsb2FkIHRoZSBpdGVtIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgbG9uZyBpdGVtSWQgPSAwOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZVZpZXcgPSBmYWN0b3J5LmdldFZpZXdBdChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1JZCA9IGZhY3RvcnkuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBwcmludCB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgaW4gdXBkYXRlUmVtb3RlVmlld3NJbmZvKCIgKyBwb3NpdGlvbiArICIpOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGVhcmx5IHRvIHByZXZlbnQgYWRkaXRpb25hbCB3b3JrIGluIHJlLWNlbnRlcmluZyB0aGUgdmlldyBjYWNoZSwgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIHN3YXBwaW5nIGZyb20gdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgaWYgdGhlIHdpbmRvdyBoYXMgbW92ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gfHwgcG9zaXRpb24gPiBtVmlld0NhY2hlRW5kUG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvc2l0aW9uSW5kZXggPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhY2hlSW5kZXggPSBnZXRDYWNoZUluZGV4KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtjYWNoZUluZGV4XS5zZXQocmVtb3RlVmlldywgaXRlbUlkKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIG1haW4gdGhyZWFkIHdoZW4gZG9uZSBsb2FkaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHBlbmRpbmcgdXBkYXRlcworICAgICAgICAgICAgICAgICAgICBtTWFpblF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhcCB0aGUgbG9hZGVyIHZpZXcgZm9yIHRoaXMgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVWaWV3c0luZGV4SW5mbyBpbmRleEluZm8gPSBtVmlld0NhY2hlW2NhY2hlSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IGluZGV4SW5mby5mbGlwcGVyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZsaXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdCgwKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFkZE5ld1ZpZXcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsaXBwZXIuZ2V0Q2hpbGRDb3VudCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdiA9IGZsaXBwZXIuZ2V0Q2hpbGRBdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZUlkID0gKChJbnRlZ2VyKSB2LmdldFRhZygpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlSWQgPT0gaW5kZXhJbmZvLnR5cGVJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gcmVhcHBseSBzaW5jZSBpdCBpcyB0aGUgc2FtZSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SW5mby52aWV3LnJlYXBwbHkobUNvbnRleHQsIHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0QW5pbWF0aW9uKCkgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmJ1aWxkRHJhd2luZ0NhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5ld1ZpZXcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLnJlbW92ZVZpZXdBdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkTmV3VmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgdiA9IGluZGV4SW5mby52aWV3LmFwcGx5KG1Db250ZXh0LCBmbGlwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnNldFRhZyhuZXcgSW50ZWdlcihpbmRleEluZm8udHlwZUlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5hZGRWaWV3KHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlbW90ZVZpZXdzSW5kZXhJbmZvIHJlcXVlc3RDYWNoZWRJbmRleEluZm8oZmluYWwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgaW5kaWNlc1RvTG9hZENvdW50ID0gMDsKKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zQW5kSXNWYWxpZChwb3NpdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBpbmZvIGlmIGl0IGV4aXN0cyBpbiB0aGUgd2luZG93IGFuZCBpcyBsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChwb3NpdGlvbildOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSB1cGRhdGUgdGhlIHdpbmRvdyBhbmQgbG9hZCB0aGUgbmV3IGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgaW50IGNlbnRlclBvc2l0aW9uID0gKG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiArIG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uKSAvIDI7CisgICAgICAgICAgICAgICAgaWYgKChtVmlld0NhY2hlRW5kUG9zaXRpb24gPD0gbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24pIHx8IChNYXRoLmFicyhwb3NpdGlvbiAtIGNlbnRlclBvc2l0aW9uKSA+IG1DYWNoZVNsYWNrKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3U3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uIC0gbUhhbGZDYWNoZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdFbmRQb3NpdGlvbiA9IHBvc2l0aW9uICsgbUhhbGZDYWNoZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZVNpemUgPSBtSGFsZkNhY2hlU2l6ZSAvIDQ7CisgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ID0gKGludCkgTWF0aC5jZWlsKG1WaWV3Q2FjaGUubGVuZ3RoIC8gKGZsb2F0KSBmcmFtZVNpemUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHBydW5lL2FkZCBiZWZvcmUgdGhlIGN1cnJlbnQgc3RhcnQgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVN0YXJ0ID0gTWF0aC5tYXgobmV3U3RhcnRQb3NpdGlvbiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBlZmZlY3RpdmVFbmQgPSBNYXRoLm1pbihuZXdFbmRQb3NpdGlvbiwgZ2V0Q291bnQoKSAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgaXRlbXMgaW4gdGhlIHF1ZXVlCisgICAgICAgICAgICAgICAgICAgIGludCBvdmVybGFwU3RhcnQgPSBNYXRoLm1heChtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiwgZWZmZWN0aXZlU3RhcnQpOworICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcmxhcEVuZCA9IE1hdGgubWluKE1hdGgubWF4KG1WaWV3Q2FjaGVTdGFydFBvc2l0aW9uLCBtVmlld0NhY2hlRW5kUG9zaXRpb24pLCBlZmZlY3RpdmVFbmQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChmcmFtZVNpemUgKiBmcmFtZUNvdW50KTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuZXdTdGFydFBvc2l0aW9uICsgKChpICUgZnJhbWVTaXplKSAqIGZyYW1lQ291bnQgKyAoaSAvIGZyYW1lU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPD0gbmV3RW5kUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG92ZXJsYXBTdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IG92ZXJsYXBFbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgdGhlIHN0dWZmIGluIHRoZSBtaWRkbGUgdGhhdCBoYXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVmlld0NhY2hlW2dldENhY2hlSW5kZXgoaW5kZXgpXS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UbXBWaWV3Q2FjaGVMb2FkSW5kaWNlc1tpbmRpY2VzVG9Mb2FkQ291bnQrK10gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVmZmVjdGl2ZVN0YXJ0IDw9IGluZGV4KSAmJiAoaW5kZXggPD0gZWZmZWN0aXZlRW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIGFuZCBsb2FkIGFsbCBuZXcgZWZmZWN0aXZlIGl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChpbmRleCldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzW2luZGljZXNUb0xvYWRDb3VudCsrXSA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUgYWxsIG90aGVyIGNhY2hlIGluZGljZXMgKG91dHNpZGUgdGhlIGVmZmVjdGl2ZSBzdGFydC9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb24ndCBsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVbZ2V0Q2FjaGVJbmRleChpbmRleCldLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlU3RhcnRQb3NpdGlvbiA9IG5ld1N0YXJ0UG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IG5ld0VuZFBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcG9zdCBpdGVtcyB0byBiZSBsb2FkZWQKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IG1WaWV3Q2FjaGVJbmZvLmNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGljZXNUb0xvYWRDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVMb2FkSW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRpY2VzVG9Mb2FkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gbVRtcFZpZXdDYWNoZUxvYWRJbmRpY2VzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlTG9hZEluZGljZXMuYWRkTGFzdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJldHVybiBudWxsIHNvIHRoYXQgYSBkdW1teSB2aWV3IGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmxpcHBlciB2aWV3cyBpZiBuZWNlc3NhcnkgKHdlIGhhdmUgdG8gZG8gdGhpcyBub3cKKyAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRoZSBmbGlwcGVycyB3aGlsZSB3ZSBoYXZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCkKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplTG9hZGluZ1ZpZXdzKHBhcmVudCk7CisKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHRoZSBpdGVtIGZyb20gdGhlIGNhY2hlIChxdWV1ZWluZyBpdCB0byBsb2FkIGlmIG5vdAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjYWNoZSBhbHJlYWR5KQorICAgICAgICAgICAgICAgIFJlbW90ZVZpZXdzSW5kZXhJbmZvIGluZGV4SW5mbyA9IHJlcXVlc3RDYWNoZWRJbmRleEluZm8ocG9zaXRpb24pOworCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBmbGlwcGVyIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlSW5kZXggPSBnZXRDYWNoZUluZGV4KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IG1WaWV3Q2FjaGVbY2FjaGVJbmRleF0uZmxpcHBlcjsKKyAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuc2V0QWxwaGEoMS4wZik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBpdGVtIHZpZXcgYW5kIHNob3cgdGhlIGxvYWRpbmcgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlci5nZXRDaGlsZEF0KDApLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZmxpcHBlci5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdChpKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBsb2FkaW5nIHZpZXcgYW5kIHNob3cgdGhlIGl0ZW0gdmlldworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGlwcGVyLmdldENoaWxkQ291bnQoKSAtIDE7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuZ2V0Q2hpbGRBdChpKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmdldENoaWxkQXQoZmxpcHBlci5nZXRDaGlsZENvdW50KCkgLSAxKS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsaXBwZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3KG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTG9hZGluZ1ZpZXdzKFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBjYWNoZSBoYXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgZmxpcHBlcgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1WaWV3Q2FjaGVbMF0uZmxpcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZpZXdDYWNoZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQgZmxpcHBlciA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVzZXJMb2FkaW5nVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB1c2VyLXNwZWNpZmllZCBsb2FkaW5nIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVyLmFkZFZpZXcobVVzZXJMb2FkaW5nVmlldy5hcHBseShtQ29udGV4dCwgcGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgZmlyc3Qgcm93IGZvciB0aGUgbG9hZGVyIHZpZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RWaWV3SGVpZ2h0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBmaXJzdFZpZXcgPSBtRmlyc3RWaWV3LmFwcGx5KG1Db250ZXh0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RWaWV3Lm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RWaWV3SGVpZ2h0ID0gZmlyc3RWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgYSBuZXcgbG9hZGVyIGFuZCBhZGQgaXQgdG8gdGhlIGZsaXBwZXIgYXMgdGhlIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB2aWV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcobUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoIkxvYWRpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRIZWlnaHQobUZpcnN0Vmlld0hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMIHwgR3Jhdml0eS5DRU5URVJfVkVSVElDQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHRTaXplKDE4LjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0Q29sb3IoQ29sb3IuYXJnYig5NiwgMjU1LCAyNTUsIDI1NSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFNoYWRvd0xheWVyKDIuMGYsIDAuMGYsIDEuMGYsIENvbG9yLkJMQUNLKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZXIuYWRkVmlldyh0ZXh0Vmlldyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlld0NhY2hlW2ldLmZsaXBwZXIgPSBmbGlwcGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRCYWNrZ3JvdW5kTG9hZGVyKCkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgd29ya2VyIHJ1bm5hYmxlCisgICAgICAgICAgICBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgbVdvcmtlclF1ZXVlLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1CYWNrZ3JvdW5kTG9hZGVyRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBSZW1vdGVWaWV3cyBmYWN0b3J5IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFEaXJ0eSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGF0YURpcnR5ID0gbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUluZm8uaXNEYXRhRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RhdGFEaXJ0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtVmlld0NhY2hlTG9hZEluZGljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtVmlld0NhY2hlTG9hZEluZGljZXMucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgd2VyZSBubyBpdGVtcyB0byBsb2FkLCBzbyBzbGVlcCBmb3IgYSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdHJ5IGFuZCBsb2FkIHRoZSBpdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmVtb3RlVmlld3NJbmZvKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcEJhY2tncm91bmRMb2FkZXIoKSB7CisgICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBtQmFja2dyb3VuZExvYWRlckVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUxvYWRJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZUxvYWRJbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV0uaXRlbUlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJdGVtVmlld1R5cGUoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHlwZSBpZC9pbmRleCBtYXAgaXMgdXBkYXRlZCBzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbmRJc1ZhbGlkKHBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmlld0lkID0gbVZpZXdDYWNoZVtnZXRDYWNoZUluZGV4KHBvc2l0aW9uKV0udHlwZUlkOworICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdHlwZU1hcCA9IG1WaWV3Q2FjaGVJbmZvLm1UeXBlSWRJbmRleE1hcDsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgKzEgYmVjYXVzZSB0aGUgZGVmYXVsdCBkdW1teSB2aWV3IGdldCB2aWV3IHR5cGUgMAorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleSh2aWV3SWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZU1hcC5nZXQodmlld0lkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJbmRleCA9IHR5cGVNYXAuc2l6ZSgpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAucHV0KHZpZXdJZCwgbmV3SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0luZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBkZWZhdWx0IGl0ZW0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVZpZXdDYWNoZUluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZpZXdDYWNoZUluZm8uY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVJbmZvLnZpZXdUeXBlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGVJbmZvLmhhc1N0YWJsZUlkczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoQ2FjaGUoKSB7CisgICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlbXMgdG8gYmUgbG9hZGVkCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGVMb2FkSW5kaWNlcykgeworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVMb2FkSW5kaWNlcy5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1WaWV3Q2FjaGUpIHsKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCB0aGUgaW50ZXJuYWwgY2FjaGUgYW5kIGludmFsaWRhdGUgdGhlIGFkYXB0ZXIgZm9yIGZ1dHVyZSBsb2FkcworICAgICAgICAgICAgICAgIG1NYWluUXVldWUucmVtb3ZlTWVzc2FnZXMoMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WaWV3Q2FjaGUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVtpXS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVZpZXdDYWNoZVN0YXJ0UG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIG1WaWV3Q2FjaGVFbmRQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFJlbW90ZVZpZXdzQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQsIFJlbW90ZUFkYXB0ZXJDb25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSW50ZW50ID0gaW50ZW50OworCisgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHdvcmtlciB0aHJlYWQKKyAgICAgICAgbVdvcmtlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJSZW1vdGVWaWV3c0NhY2hlLWxvYWRlciIpOworICAgICAgICBtV29ya2VyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1Xb3JrZXJRdWV1ZSA9IG5ldyBIYW5kbGVyKG1Xb3JrZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtV29ya2VyUHJpb3JpdHlRdWV1ZSA9IG5ldyBIYW5kbGVyKG1Xb3JrZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtTWFpblF1ZXVlID0gbmV3IEhhbmRsZXIoTG9vcGVyLm15TG9vcGVyKCkpOworICAgICAgICBtTWFpblByaW9yaXR5UXVldWUgPSBuZXcgSGFuZGxlcihMb29wZXIubXlMb29wZXIoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUgYW5kIHRoZSBzZXJ2aWNlIGNvbm5lY3Rpb24gb24gc3RhcnR1cAorICAgICAgICBtVmlld0NhY2hlID0gbmV3IFJlbW90ZVZpZXdzQ2FjaGUoMjUpOworICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgUmVtb3RlVmlld3NBZGFwdGVyU2VydmljZUNvbm5lY3Rpb24oY2FsbGJhY2spOworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyByZW1lbWJlciB0byB1bmJpbmQgZnJvbSB0aGUgc2VydmljZSB3aGVuIGZpbmFsaXppbmcKKyAgICAgICAgdW5iaW5kU2VydmljZSgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5nZXRDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgLy8gZGlzYWxsb3cgYXJiaXRyYXJ5IG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbSBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgeworICAgICAgICByZXF1ZXN0QmluZFNlcnZpY2UoKTsKKyAgICAgICAgcmV0dXJuIG1WaWV3Q2FjaGUuZ2V0SXRlbUlkKHBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1WaWV3VHlwZShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldEl0ZW1WaWV3VHlwZShwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpIHsKKyAgICAgICAgcmVxdWVzdEJpbmRTZXJ2aWNlKCk7CisgICAgICAgIHJldHVybiBtVmlld0NhY2hlLmdldFZpZXdUeXBlQ291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7CisgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOworICAgICAgICByZXR1cm4gbVZpZXdDYWNoZS5oYXNTdGFibGVJZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gZ2V0Q291bnQoKSA8PSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRDaGFuZ2VkKCkgeworICAgICAgICAvLyBmbHVzaCB0aGUgY2FjaGUgc28gdGhhdCB3ZSBjYW4gcmVsb2FkIG5ldyBpdGVtcyBmcm9tIHRoZSBzZXJ2aWNlCisgICAgICAgIG1WaWV3Q2FjaGUuZmx1c2hDYWNoZSgpOworCisgICAgICAgIC8vIG5vdGlmeSB0aGUgZmFjdG9yeSB0aGF0IGl0J3MgZGF0YSBtYXkgbm8gbG9uZ2VyIGJlIHZhbGlkCisgICAgICAgIG1WaWV3Q2FjaGUub25Ob3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlTm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIHN1cGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVlc3RCaW5kU2VydmljZSgpIHsKKyAgICAgICAgLy8gdHJ5IGJpbmRpbmcgdGhlIHNlcnZpY2UgKHdoaWNoIHdpbGwgc3RhcnQgaXQgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nKQorICAgICAgICBpZiAoIW1TZXJ2aWNlQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICBtQ29udGV4dC5iaW5kU2VydmljZShtSW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVNlcnZpY2VDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVuYmluZFNlcnZpY2UoKSB7CisgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShtU2VydmljZUNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NGZhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuSVJlbW90ZVZpZXdzRmFjdG9yeTsKKworLyoqCisgKiBUaGUgc2VydmljZSB0byBiZSBjb25uZWN0ZWQgdG8gZm9yIGEgcmVtb3RlIGFkYXB0ZXIgdG8gcmVxdWVzdCBSZW1vdGVWaWV3cy4gIFVzZXJzIHNob3VsZAorICogZXh0ZW5kIHRoZSBSZW1vdGVWaWV3c1NlcnZpY2UgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgUmVtb3RlVmlld3NGYWN0b3J5J3MgdXNlZCB0bworICogcG9wdWxhdGUgdGhlIHJlbW90ZSBjb2xsZWN0aW9uIHZpZXcgKExpc3RWaWV3LCBHcmlkVmlldywgZXRjKS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlbW90ZVZpZXdzU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiUmVtb3RlVmlld3NTZXJ2aWNlIjsKKworICAgIC8vIG11bHRpbWFwIGltcGxlbWVudGF0aW9uIGZvciByZWZlcmVuY2UgY291bnRpbmcKKyAgICBwcml2YXRlIEhhc2hNYXA8SW50ZW50LCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+IG1SZW1vdGVWaWV3RmFjdG9yaWVzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogQW4gaW50ZXJmYWNlIGZvciBhbiBhZGFwdGVyIGJldHdlZW4gYSByZW1vdGUgY29sbGVjdGlvbiB2aWV3IChMaXN0VmlldywgR3JpZFZpZXcsIGV0YykgYW5kCisgICAgICogdGhlIHVuZGVybHlpbmcgZGF0YSBmb3IgdGhhdCB2aWV3LiAgVGhlIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBSZW1vdGVWaWV3CisgICAgICogZm9yIGVhY2ggaXRlbSBpbiB0aGUgZGF0YSBzZXQuCisgICAgICogCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5BZGFwdGVyCisgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW1vdGVWaWV3c0ZhY3RvcnkgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4geW91ciBmYWN0b3J5IGlzIGZpcnN0IGNvbnN0cnVjdGVkLiBUaGUgc2FtZSBmYWN0b3J5IG1heSBiZSBzaGFyZWQgYWNyb3NzCisgICAgICAgICAqIG11bHRpcGxlIFJlbW90ZVZpZXdBZGFwdGVycyBkZXBlbmRpbmcgb24gdGhlIGludGVudCBwYXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gbm90aWZ5RGF0YVNldENoYW5nZWQoKSBpcyB0cmlnZ2VyZWQgb24gdGhlIHJlbW90ZSBhZGFwdGVyLiBUaGlzIGFsbG93cyBhCisgICAgICAgICAqIFJlbW90ZVZpZXdzRmFjdG9yeSB0byByZXNwb25kIHRvIGRhdGEgY2hhbmdlcyBieSB1cGRhdGluZyBhbnkgaW50ZXJuYWwgcmVmZXJlbmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBhbmRyb2lkLmFwcHdpZGdldC5BcHBXaWRnZXRNYW5hZ2VyI25vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSwgaW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgUmVtb3RlVmlld3NBZGFwdGVyIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmFjdG9yeSBpcworICAgICAgICAgKiB1bmJvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCk7CisKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpOworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRMb2FkaW5nVmlldygpOworICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcHJpdmF0ZSBwcm94eSBjbGFzcyBmb3IgdGhlIHByaXZhdGUgSVJlbW90ZVZpZXdzRmFjdG9yeSBpbnRlcmZhY2UgdGhyb3VnaCB0aGUKKyAgICAgKiBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJlbW90ZVZpZXdzRmFjdG9yeUFkYXB0ZXIgZXh0ZW5kcyBJUmVtb3RlVmlld3NGYWN0b3J5LlN0dWIgeworICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihSZW1vdGVWaWV3c0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICAgICAgbUZhY3RvcnkgPSBmYWN0b3J5OworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgICAgICBtRmFjdG9yeS5vbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBSZW1vdGVWaWV3cyBnZXRWaWV3QXQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0Vmlld0F0KHBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgUmVtb3RlVmlld3MgZ2V0TG9hZGluZ1ZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0TG9hZGluZ1ZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUZhY3RvcnkuZ2V0Vmlld1R5cGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5nZXRJdGVtSWQocG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtRmFjdG9yeS5oYXNTdGFibGVJZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVtb3RlVmlld3NGYWN0b3J5IG1GYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBSZW1vdGVWaWV3c1NlcnZpY2UoKSB7CisgICAgICAgIG1SZW1vdGVWaWV3RmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8SW50ZW50LCBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4+KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgdG8gdGhlIHBhcnRpY3VsYXIgZmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnRlbnQKKyAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBmYWN0b3J5UmVmID0gbnVsbDsKKyAgICAgICAgICAgIFJlbW90ZVZpZXdzRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmICghbVJlbW90ZVZpZXdGYWN0b3JpZXMuY29udGFpbnNLZXkoaW50ZW50KSkgeworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbkdldFZpZXdGYWN0b3J5KGludGVudCk7CisgICAgICAgICAgICAgICAgZmFjdG9yeVJlZiA9IG5ldyBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4oZmFjdG9yeSwgMSk7CisgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGludGVudCwgZmFjdG9yeVJlZik7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5vbkNyZWF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQYWlyPFJlbW90ZVZpZXdzRmFjdG9yeSwgSW50ZWdlcj4gb2xkRmFjdG9yeVJlZiA9IG1SZW1vdGVWaWV3RmFjdG9yaWVzLmdldChpbnRlbnQpOworICAgICAgICAgICAgICAgIGZhY3RvcnkgPSBvbGRGYWN0b3J5UmVmLmZpcnN0OworICAgICAgICAgICAgICAgIGludCBuZXdSZWZDb3VudCA9IG9sZEZhY3RvcnlSZWYuc2Vjb25kLmludFZhbHVlKCkgKyAxOworICAgICAgICAgICAgICAgIGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlVmlld0ZhY3Rvcmllcy5wdXQoaW50ZW50LCBmYWN0b3J5UmVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3RlVmlld3NGYWN0b3J5QWRhcHRlcihmYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVW5iaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1SZW1vdGVWaWV3RmFjdG9yaWVzLmNvbnRhaW5zS2V5KGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbGV2aWF0ZXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSBvZiBoYXZpbmcgdG8gY2xlYXIgYWxsIGZhY3RvcmllcworICAgICAgICAgICAgICAgIFBhaXI8UmVtb3RlVmlld3NGYWN0b3J5LCBJbnRlZ2VyPiBvbGRGYWN0b3J5UmVmID0gbVJlbW90ZVZpZXdGYWN0b3JpZXMuZ2V0KGludGVudCk7CisgICAgICAgICAgICAgICAgaW50IG5ld1JlZkNvdW50ID0gb2xkRmFjdG9yeVJlZi5zZWNvbmQuaW50VmFsdWUoKSAtIDE7CisgICAgICAgICAgICAgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRmFjdG9yeVJlZi5maXJzdC5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucmVtb3ZlKGludGVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+IGZhY3RvcnlSZWYgPSBuZXcgUGFpcjxSZW1vdGVWaWV3c0ZhY3RvcnksIEludGVnZXI+KG9sZEZhY3RvcnlSZWYuZmlyc3QsIG5ld1JlZkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgbVJlbW90ZVZpZXdGYWN0b3JpZXMucHV0KGludGVudCwgZmFjdG9yeVJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXJpdmVkIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZmFjdG9yaWVzIGZvcgorICAgICAqIHRoZSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZW1vdGVWaWV3c0ZhY3Rvcnkgb25HZXRWaWV3RmFjdG9yeShJbnRlbnQgaW50ZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZXNvdXJjZUN1cnNvckFkYXB0ZXIuamF2YQppbmRleCBjOWMyMTdhLi5hZWU0MTFlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVzb3VyY2VDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Jlc291cmNlQ3Vyc29yQWRhcHRlci5qYXZhCkBAIC0zNiw5ICszNiw4IEBACiAgICAgCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICogICAgICAgICAgICBTaW1wbGVMaXN0SXRlbUZhY3RvcnkgaXMgcnVubmluZworICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhlIExpc3RWaWV3IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFkYXB0ZXIgaXMgcnVubmluZwogICAgICAqIEBwYXJhbSBsYXlvdXQgcmVzb3VyY2UgaWRlbnRpZmllciBvZiBhIGxheW91dCBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgdmlld3MKICAgICAgKiAgICAgICAgICAgIGZvciB0aGlzIGxpc3QgaXRlbS4gIFVubGVzcyB5b3Ugb3ZlcnJpZGUgdGhlbSBsYXRlciwgdGhpcyB3aWxsCiAgICAgICogICAgICAgICAgICBkZWZpbmUgYm90aCB0aGUgaXRlbSB2aWV3cyBhbmQgdGhlIGRyb3AgZG93biB2aWV3cy4KQEAgLTUxLDkgKzUwLDggQEAKICAgICAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgKiAgICAgICAgICAgIFNpbXBsZUxpc3RJdGVtRmFjdG9yeSBpcyBydW5uaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGUgTGlzdFZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWRhcHRlciBpcyBydW5uaW5nCiAgICAgICogQHBhcmFtIGxheW91dCByZXNvdXJjZSBpZGVudGlmaWVyIG9mIGEgbGF5b3V0IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSB2aWV3cwogICAgICAqICAgICAgICAgICAgZm9yIHRoaXMgbGlzdCBpdGVtLiAgVW5sZXNzIHlvdSBvdmVycmlkZSB0aGVtIGxhdGVyLCB0aGlzIHdpbGwKICAgICAgKiAgICAgICAgICAgIGRlZmluZSBib3RoIHRoZSBpdGVtIHZpZXdzIGFuZCB0aGUgZHJvcCBkb3duIHZpZXdzLgpAQCAtNjksNiArNjcsMjIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoZSBMaXN0VmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBhZGFwdGVyIGlzIHJ1bm5pbmcKKyAgICAgKiBAcGFyYW0gbGF5b3V0IHJlc291cmNlIGlkZW50aWZpZXIgb2YgYSBsYXlvdXQgZmlsZSB0aGF0IGRlZmluZXMgdGhlIHZpZXdzCisgICAgICogICAgICAgICAgICBmb3IgdGhpcyBsaXN0IGl0ZW0uICBVbmxlc3MgeW91IG92ZXJyaWRlIHRoZW0gbGF0ZXIsIHRoaXMgd2lsbAorICAgICAqICAgICAgICAgICAgZGVmaW5lIGJvdGggdGhlIGl0ZW0gdmlld3MgYW5kIHRoZSBkcm9wIGRvd24gdmlld3MuCisgICAgICogQHBhcmFtIGMgVGhlIGN1cnNvciBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZGF0YS4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBhZGFwdGVyCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ3Vyc29yQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIGludCBsYXlvdXQsIEN1cnNvciBjLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYywgZmxhZ3MpOworICAgICAgICBtTGF5b3V0ID0gbURyb3BEb3duTGF5b3V0ID0gbGF5b3V0OworICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbmZsYXRlcyB2aWV3KHMpIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgZmlsZS4KICAgICAgKiAKICAgICAgKiBAc2VlIGFuZHJvaWQud2lkZ2V0LkN1cnNvckFkYXB0ZXIjbmV3VmlldyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxCYXJEcmF3YWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKaW5kZXggM2IxMTNhZS4uOTNhMTE3OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbEJhckRyYXdhYmxlLmphdmEKQEAgLTExMSw4ICsxMTEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgUmVjdCByID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIGlmIChjYW52YXMucXVpY2tSZWplY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIAotICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5BQSkpIHsKKyAgICAgICAgaWYgKGNhbnZhcy5xdWlja1JlamVjdChyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSwgQ2FudmFzLkVkZ2VUeXBlLkFBKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChkcmF3VHJhY2spIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsVmlldy5qYXZhCmluZGV4IDJiYTFjNDcuLmViNTI3ZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Njcm9sbFZpZXcuamF2YQpAQCAtMTksMTEgKzE5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkZvY3VzRmluZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTUyLDYgKzQ5LDggQEAKICAqIHdpdGhpbiBhIGxhcmdlciBjb250YWluZXIuCiAgKiAKICAqIDxwPlNjcm9sbFZpZXcgb25seSBzdXBwb3J0cyB2ZXJ0aWNhbCBzY3JvbGxpbmcuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU2Nyb2xsVmlld19maWxsVmlld3BvcnQKICAqLwogcHVibGljIGNsYXNzIFNjcm9sbFZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAgICAgc3RhdGljIGZpbmFsIGludCBBTklNQVRFRF9TQ1JPTExfR0FQID0gMjUwOwpAQCAtNjIsOSArNjEsNyBAQAogICAgIHByaXZhdGUgbG9uZyBtTGFzdFNjcm9sbDsKIAogICAgIHByaXZhdGUgZmluYWwgUmVjdCBtVGVtcFJlY3QgPSBuZXcgUmVjdCgpOwotICAgIHByaXZhdGUgT3ZlclNjcm9sbGVyIG1TY3JvbGxlcjsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd1RvcDsKLSAgICBwcml2YXRlIEVkZ2VHbG93IG1FZGdlR2xvd0JvdHRvbTsKKyAgICBwcml2YXRlIFNjcm9sbGVyIG1TY3JvbGxlcjsKIAogICAgIC8qKgogICAgICAqIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgbW92aW5nIGZvY3VzIG91cnNlbHZlcy4gVGhpcyBpcyBzbyB0aGUKQEAgLTExOCw5ICsxMTUsNiBAQAogICAgIHByaXZhdGUgaW50IG1NaW5pbXVtVmVsb2NpdHk7CiAgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKICAgICAKLSAgICBwcml2YXRlIGludCBtT3ZlcnNjcm9sbERpc3RhbmNlOwotICAgIHByaXZhdGUgaW50IG1PdmVyZmxpbmdEaXN0YW5jZTsKLQogICAgIC8qKgogICAgICAqIElEIG9mIHRoZSBhY3RpdmUgcG9pbnRlci4gVGhpcyBpcyB1c2VkIHRvIHJldGFpbiBjb25zaXN0ZW5jeSBkdXJpbmcKICAgICAgKiBkcmFncy9mbGluZ3MgaWYgbXVsdGlwbGUgcG9pbnRlcnMgYXJlIHVzZWQuCkBAIC0xOTMsNyArMTg3LDcgQEAKIAogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTY3JvbGxWaWV3KCkgewotICAgICAgICBtU2Nyb2xsZXIgPSBuZXcgT3ZlclNjcm9sbGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIG1TY3JvbGxlciA9IG5ldyBTY3JvbGxlcihnZXRDb250ZXh0KCkpOwogICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CiAgICAgICAgIHNldERlc2NlbmRhbnRGb2N1c2FiaWxpdHkoRk9DVVNfQUZURVJfREVTQ0VOREFOVFMpOwogICAgICAgICBzZXRXaWxsTm90RHJhdyhmYWxzZSk7CkBAIC0yMDEsOCArMTk1LDYgQEAKICAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CiAgICAgICAgIG1NaW5pbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1pbmltdW1GbGluZ1ZlbG9jaXR5KCk7CiAgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7Ci0gICAgICAgIG1PdmVyc2Nyb2xsRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJzY3JvbGxEaXN0YW5jZSgpOwotICAgICAgICBtT3ZlcmZsaW5nRGlzdGFuY2UgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE92ZXJmbGluZ0Rpc3RhbmNlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNTcsNiArMjQ5LDggQEAKICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIFNjcm9sbFZpZXcncyBjb250ZW50IGlzIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB2aWV3cG9ydC4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udGVudCBmaWxscyB0aGUgdmlld3BvcnQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTY3JvbGxWaWV3X2ZpbGxWaWV3cG9ydAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsbFZpZXdwb3J0KCkgewogICAgICAgICByZXR1cm4gbUZpbGxWaWV3cG9ydDsKQEAgLTI2OCw2ICsyNjIsOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGxWaWV3cG9ydCBUcnVlIHRvIHN0cmV0Y2ggdGhlIGNvbnRlbnQncyBoZWlnaHQgdG8gdGhlIHZpZXdwb3J0J3MKICAgICAgKiAgICAgICAgYm91bmRhcmllcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1Njcm9sbFZpZXdfZmlsbFZpZXdwb3J0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsbFZpZXdwb3J0KGJvb2xlYW4gZmlsbFZpZXdwb3J0KSB7CiAgICAgICAgIGlmIChmaWxsVmlld3BvcnQgIT0gbUZpbGxWaWV3cG9ydCkgewpAQCAtNDYzLDkgKzQ1OSw2IEBACiAgICAgICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgZHJhZyAqLwogICAgICAgICAgICAgICAgIG1Jc0JlaW5nRHJhZ2dlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7Ci0gICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CiAgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOwpAQCAtNTIzLDI2ICs1MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVsdGFZID0gKGludCkgKG1MYXN0TW90aW9uWSAtIHkpOwogICAgICAgICAgICAgICAgICAgICBtTGFzdE1vdGlvblkgPSB5OwogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRYID0gbVNjcm9sbFg7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBvbGRZID0gbVNjcm9sbFk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByYW5nZSA9IGdldFNjcm9sbFJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyc2Nyb2xsQnkoMCwgZGVsdGFZLCAwLCBtU2Nyb2xsWSwgMCwgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJzY3JvbGxEaXN0YW5jZSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyZWFrIG91ciB2ZWxvY2l0eSBpZiB3ZSBoaXQgYSBzY3JvbGwgYmFycmllci4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvblNjcm9sbENoYW5nZWQobVNjcm9sbFgsIG1TY3JvbGxZLCBvbGRYLCBvbGRZKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb3ZlcnNjcm9sbE1vZGUgPSBnZXRPdmVyc2Nyb2xsTW9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9BTFdBWVMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHB1bGxlZFRvWSA9IG9sZFkgKyBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHVsbGVkVG9ZIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblB1bGwoKGZsb2F0KSBkZWx0YVkgLyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxlZFRvWSA+IHJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uUHVsbCgoZmxvYXQpIGRlbHRhWSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxCeSgwLCBkZWx0YVkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiAKQEAgLTU1MSwxNSArNTI1LDggQEAKICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlUcmFja2VyLmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMTAwMCwgbU1heGltdW1WZWxvY2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsVmVsb2NpdHkgPSAoaW50KSB2ZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KG1BY3RpdmVQb2ludGVySWQpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaW5nKC1pbml0aWFsVmVsb2NpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gZ2V0U2Nyb2xsUmFuZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNjcm9sbGVyLnNwcmluZ2JhY2sobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCAwLCAwLCBib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwICYmIE1hdGguYWJzKGluaXRpYWxWZWxvY2l0eSkgPiBtTWluaW11bVZlbG9jaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGluZygtaW5pdGlhbFZlbG9jaXR5KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CkBAIC01NjksMjcgKzUzNiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKICAgICAgICAgICAgICAgICBpZiAobUlzQmVpbmdEcmFnZ2VkICYmIGdldENoaWxkQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JvbGxlci5zcHJpbmdiYWNrKG1TY3JvbGxYLCBtU2Nyb2xsWSwgMCwgMCwgMCwgZ2V0U2Nyb2xsUmFuZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOwogICAgICAgICAgICAgICAgICAgICBtSXNCZWluZ0RyYWdnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUVkZ2VHbG93VG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6CkBAIC02MTYsMzIgKzU3Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PdmVyc2Nyb2xsZWQoaW50IHNjcm9sbFgsIGludCBzY3JvbGxZLAotICAgICAgICAgICAgYm9vbGVhbiBjbGFtcGVkWCwgYm9vbGVhbiBjbGFtcGVkWSkgewotICAgICAgICAvLyBUcmVhdCBhbmltYXRpbmcgc2Nyb2xscyBkaWZmZXJlbnRseTsgc2VlICNjb21wdXRlU2Nyb2xsKCkgZm9yIHdoeS4KLSAgICAgICAgaWYgKCFtU2Nyb2xsZXIuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICBtU2Nyb2xsWCA9IHNjcm9sbFg7Ci0gICAgICAgICAgICBtU2Nyb2xsWSA9IHNjcm9sbFk7Ci0gICAgICAgICAgICBpZiAoY2xhbXBlZFkpIHsKLSAgICAgICAgICAgICAgICBtU2Nyb2xsZXIuc3ByaW5nYmFjayhtU2Nyb2xsWCwgbVNjcm9sbFksIDAsIDAsIDAsIGdldFNjcm9sbFJhbmdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG8oc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXdha2VuU2Nyb2xsQmFycygpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNjcm9sbFJhbmdlKCkgewotICAgICAgICBpbnQgc2Nyb2xsUmFuZ2UgPSAwOwotICAgICAgICBpZiAoZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSA9IE1hdGgubWF4KDAsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldEhlaWdodCgpIC0gZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Nyb2xsUmFuZ2U7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogPHA+CiAgICAgICogRmluZHMgdGhlIG5leHQgZm9jdXNhYmxlIGNvbXBvbmVudCB0aGF0IGZpdHMgaW4gdGhpcyBWaWV3J3MgYm91bmRzCkBAIC0xMDE4LDE2ICs5NDgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRIZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGludCBzY3JvbGxSYW5nZSA9IGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7Ci0gICAgICAgIGZpbmFsIGludCBzY3JvbGxZID0gbVNjcm9sbFk7Ci0gICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsQm90dG9tID0gTWF0aC5tYXgoMCwgc2Nyb2xsUmFuZ2UgLSBjb250ZW50SGVpZ2h0KTsKLSAgICAgICAgaWYgKHNjcm9sbFkgPCAwKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSAtPSBzY3JvbGxZOwotICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFkgPiBvdmVyc2Nyb2xsQm90dG9tKSB7Ci0gICAgICAgICAgICBzY3JvbGxSYW5nZSArPSBzY3JvbGxZIC0gb3ZlcnNjcm9sbEJvdHRvbTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY3JvbGxSYW5nZTsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkQXQoMCkuZ2V0Qm90dG9tKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMDg4LDIwICsxMDA5LDE0IEBACiAgICAgICAgICAgICBpbnQgeCA9IG1TY3JvbGxlci5nZXRDdXJyWCgpOwogICAgICAgICAgICAgaW50IHkgPSBtU2Nyb2xsZXIuZ2V0Q3VyclkoKTsKIAotICAgICAgICAgICAgaWYgKG9sZFggIT0geCB8fCBvbGRZICE9IHkpIHsKLSAgICAgICAgICAgICAgICBvdmVyc2Nyb2xsQnkoeCAtIG9sZFgsIHkgLSBvbGRZLCBvbGRYLCBvbGRZLCAwLCBnZXRTY3JvbGxSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbU92ZXJmbGluZ0Rpc3RhbmNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgb25TY3JvbGxDaGFuZ2VkKG1TY3JvbGxYLCBtU2Nyb2xsWSwgb2xkWCwgb2xkWSk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmFuZ2UgPSBnZXRTY3JvbGxSYW5nZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBvdmVyc2Nyb2xsTW9kZSA9IGdldE92ZXJzY3JvbGxNb2RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG92ZXJzY3JvbGxNb2RlID09IE9WRVJTQ1JPTExfQUxXQVlTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3ZlcnNjcm9sbE1vZGUgPT0gT1ZFUlNDUk9MTF9JRl9DT05URU5UX1NDUk9MTFMgJiYgcmFuZ2UgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IDAgJiYgb2xkWSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3Aub25BYnNvcmIoKGludCkgbVNjcm9sbGVyLmdldEN1cnJWZWxvY2l0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5ID4gcmFuZ2UgJiYgb2xkWSA8PSByYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLm9uQWJzb3JiKChpbnQpIG1TY3JvbGxlci5nZXRDdXJyVmVsb2NpdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRDaGlsZENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoMCk7CisgICAgICAgICAgICAgICAgeCA9IGNsYW1wKHgsIGdldFdpZHRoKCkgLSBtUGFkZGluZ1JpZ2h0IC0gbVBhZGRpbmdMZWZ0LCBjaGlsZC5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICB5ID0gY2xhbXAoeSwgZ2V0SGVpZ2h0KCkgLSBtUGFkZGluZ0JvdHRvbSAtIG1QYWRkaW5nVG9wLCBjaGlsZC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gb2xkWCB8fCB5ICE9IG9sZFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNjcm9sbFggPSB4OworICAgICAgICAgICAgICAgICAgICBtU2Nyb2xsWSA9IHk7CisgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsQ2hhbmdlZCh4LCB5LCBvbGRYLCBvbGRZKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhd2FrZW5TY3JvbGxCYXJzKCk7CkBAIC0xMzM5LDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgaW50IGJvdHRvbSA9IGdldENoaWxkQXQoMCkuZ2V0SGVpZ2h0KCk7CiAgICAgCiAgICAgICAgICAgICBtU2Nyb2xsZXIuZmxpbmcobVNjcm9sbFgsIG1TY3JvbGxZLCAwLCB2ZWxvY2l0eVksIDAsIDAsIDAsIAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLCBib3R0b20gLSBoZWlnaHQpLCAwLCBoZWlnaHQvMik7CisgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIGJvdHRvbSAtIGhlaWdodCkpOwogICAgIAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtb3ZpbmdEb3duID0gdmVsb2NpdHlZID4gMDsKICAgICAKQEAgLTEzNzcsNTUgKzEyOTIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnNjcm9sbE1vZGUoaW50IG1vZGUpIHsKLSAgICAgICAgaWYgKG1vZGUgIT0gT1ZFUlNDUk9MTF9ORVZFUikgewotICAgICAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBlZGdlID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9lZGdlKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBnbG93ID0gcmVzLmdldERyYXdhYmxlKFIuZHJhd2FibGUub3ZlcnNjcm9sbF9nbG93KTsKLSAgICAgICAgICAgICAgICBtRWRnZUdsb3dUb3AgPSBuZXcgRWRnZUdsb3coZWRnZSwgZ2xvdyk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tID0gbmV3IEVkZ2VHbG93KGVkZ2UsIGdsb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUVkZ2VHbG93VG9wID0gbnVsbDsKLSAgICAgICAgICAgIG1FZGdlR2xvd0JvdHRvbSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0T3ZlcnNjcm9sbE1vZGUobW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1FZGdlR2xvd1RvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsWSA9IG1TY3JvbGxZOwotICAgICAgICAgICAgaWYgKCFtRWRnZUdsb3dUb3AuaXNGaW5pc2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3RvcmVDb3VudCA9IGNhbnZhcy5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5taW4oMCwgc2Nyb2xsWSkpOwotICAgICAgICAgICAgICAgIG1FZGdlR2xvd1RvcC5zZXRTaXplKHdpZHRoICogMiwgZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dUb3AuZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGdlR2xvd0JvdHRvbS5pc0ZpbmlzaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLXdpZHRoIC8gMiwgTWF0aC5tYXgoZ2V0U2Nyb2xsUmFuZ2UoKSwgc2Nyb2xsWSkgKyBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoMTgwLCB3aWR0aCwgMCk7Ci0gICAgICAgICAgICAgICAgbUVkZ2VHbG93Qm90dG9tLnNldFNpemUod2lkdGggKiAyLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChtRWRnZUdsb3dCb3R0b20uZHJhdyhjYW52YXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KHJlc3RvcmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBjbGFtcChpbnQgbiwgaW50IG15LCBpbnQgY2hpbGQpIHsKICAgICAgICAgaWYgKG15ID49IGNoaWxkIHx8IG4gPCAwKSB7CiAgICAgICAgICAgICAvKiBteSA+PSBjaGlsZCBpcyB0aGlzIGNhc2U6CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2Nyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCmluZGV4IDIzZjcyYjYuLjRjYjA4MzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TY3JvbGxlci5qYXZhCkBAIC01MCw2ICs1MCw4IEBACiAgICAgcHJpdmF0ZSBmbG9hdCBtRHVyYXRpb25SZWNpcHJvY2FsOwogICAgIHByaXZhdGUgZmxvYXQgbURlbHRhWDsKICAgICBwcml2YXRlIGZsb2F0IG1EZWx0YVk7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkU2NhbGU7CisgICAgcHJpdmF0ZSBmbG9hdCBtVmlzY291c0ZsdWlkTm9ybWFsaXplOwogICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CiAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKIApAQCAtNjMsMTcgKzY1LDYgQEAKIAogICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURlY2VsZXJhdGlvbjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZsb2F0IHNWaXNjb3VzRmx1aWRTY2FsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmbG9hdCBzVmlzY291c0ZsdWlkTm9ybWFsaXplOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gVGhpcyBjb250cm9scyB0aGUgdmlzY291cyBmbHVpZCBlZmZlY3QgKGhvdyBtdWNoIG9mIGl0KQotICAgICAgICBzVmlzY291c0ZsdWlkU2NhbGUgPSA4LjBmOwotICAgICAgICAvLyBtdXN0IGJlIHNldCB0byAxLjAgKHVzZWQgaW4gdmlzY291c0ZsdWlkKCkpCi0gICAgICAgIHNWaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmOwotICAgICAgICBzVmlzY291c0ZsdWlkTm9ybWFsaXplID0gMS4wZiAvIHZpc2NvdXNGbHVpZCgxLjBmKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBTY3JvbGxlciB3aXRoIHRoZSBkZWZhdWx0IGR1cmF0aW9uIGFuZCBpbnRlcnBvbGF0b3IuCiAgICAgICovCkBAIC0yODYsNiArMjc3LDExIEBACiAgICAgICAgIG1EZWx0YVggPSBkeDsKICAgICAgICAgbURlbHRhWSA9IGR5OwogICAgICAgICBtRHVyYXRpb25SZWNpcHJvY2FsID0gMS4wZiAvIChmbG9hdCkgbUR1cmF0aW9uOworICAgICAgICAvLyBUaGlzIGNvbnRyb2xzIHRoZSB2aXNjb3VzIGZsdWlkIGVmZmVjdCAoaG93IG11Y2ggb2YgaXQpCisgICAgICAgIG1WaXNjb3VzRmx1aWRTY2FsZSA9IDguMGY7CisgICAgICAgIC8vIG11c3QgYmUgc2V0IHRvIDEuMCAodXNlZCBpbiB2aXNjb3VzRmx1aWQoKSkKKyAgICAgICAgbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZSA9IDEuMGY7CisgICAgICAgIG1WaXNjb3VzRmx1aWROb3JtYWxpemUgPSAxLjBmIC8gdmlzY291c0ZsdWlkKDEuMGYpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQzLDkgKzMzOSwxMSBAQAogICAgICAgICBtRmluYWxZID0gTWF0aC5tYXgobUZpbmFsWSwgbU1pblkpOwogICAgIH0KICAgICAKLSAgICBzdGF0aWMgZmxvYXQgdmlzY291c0ZsdWlkKGZsb2F0IHgpCisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmbG9hdCB2aXNjb3VzRmx1aWQoZmxvYXQgeCkKICAgICB7Ci0gICAgICAgIHggKj0gc1Zpc2NvdXNGbHVpZFNjYWxlOworICAgICAgICB4ICo9IG1WaXNjb3VzRmx1aWRTY2FsZTsKICAgICAgICAgaWYgKHggPCAxLjBmKSB7CiAgICAgICAgICAgICB4IC09ICgxLjBmIC0gKGZsb2F0KU1hdGguZXhwKC14KSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zNTMsNyArMzUxLDcgQEAKICAgICAgICAgICAgIHggPSAxLjBmIC0gKGZsb2F0KU1hdGguZXhwKDEuMGYgLSB4KTsKICAgICAgICAgICAgIHggPSBzdGFydCArIHggKiAoMS4wZiAtIHN0YXJ0KTsKICAgICAgICAgfQotICAgICAgICB4ICo9IHNWaXNjb3VzRmx1aWROb3JtYWxpemU7CisgICAgICAgIHggKj0gbVZpc2NvdXNGbHVpZE5vcm1hbGl6ZTsKICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxYzlkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKQEAgLTAsMCArMSw2NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDb2x1bW5TdHJpbmc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuT25FZGl0b3JBY3Rpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworLyoqCisgKiBQcm92aWRlcyB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgZm9yIHRoZSB1c2VyIHRvIGVudGVyIGEgc2VhcmNoIHF1ZXJ5IGFuZCBzdWJtaXQgYQorICogcmVxdWVzdCB0byBhIHNlYXJjaCBwcm92aWRlci4gU2hvd3MgYSBsaXN0IG9mIHF1ZXJ5IHN1Z2dlc3Rpb25zIG9yIHJlc3VsdHMsIGlmCisgKiBhdmFpbGFibGUgYW5kIGFsbG93cyB0aGUgdXNlciB0byBwaWNrIGEgc3VnZ2VzdGlvbiBvciByZXN1bHQgdG8gbGF1bmNoIGludG8uCisgKi8KK3B1YmxpYyBjbGFzcyBTZWFyY2hWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiU2VhcmNoVmlldyI7CisKKyAgICBwcml2YXRlIE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciBtT25RdWVyeUNoYW5nZUxpc3RlbmVyOworICAgIHByaXZhdGUgT25DbG9zZUxpc3RlbmVyIG1PbkNsb3NlTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUljb25pZmllZEJ5RGVmYXVsdDsKKyAgICBwcml2YXRlIEN1cnNvckFkYXB0ZXIgbVN1Z2dlc3Rpb25zQWRhcHRlcjsKKyAgICBwcml2YXRlIFZpZXcgbVNlYXJjaEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbVN1Ym1pdEJ1dHRvbjsKKyAgICBwcml2YXRlIFZpZXcgbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtU2VhcmNoRWRpdEZyYW1lOworICAgIHByaXZhdGUgQXV0b0NvbXBsZXRlVGV4dFZpZXcgbVF1ZXJ5VGV4dFZpZXc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdWJtaXRCdXR0b25FbmFibGVkOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1RdWVyeUhpbnQ7CisKKyAgICBwcml2YXRlIFNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlOworCisgICAgLy8gQSB3ZWFrIG1hcCBvZiBkcmF3YWJsZXMgd2UndmUgZ290dGVuIGZyb20gb3RoZXIgcGFja2FnZXMsIHNvIHdlIGRvbid0IGxvYWQgdGhlbQorICAgIC8vIG1vcmUgdGhhbiBvbmNlLgorICAgIHByaXZhdGUgZmluYWwgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtT3V0c2lkZURyYXdhYmxlc0NhY2hlID0KKyAgICAgICAgICAgIG5ldyBXZWFrSGFzaE1hcDxTdHJpbmcsIERyYXdhYmxlLkNvbnN0YW50U3RhdGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZm9yIGNoYW5nZXMgdG8gdGhlIHF1ZXJ5IHRleHQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBPblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzdWJtaXRzIHRoZSBxdWVyeS4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBrZXkgcHJlc3Mgb24gdGhlCisgICAgICAgICAqIGtleWJvYXJkIG9yIGR1ZSB0byBwcmVzc2luZyBhIHN1Ym1pdCBidXR0b24uCisgICAgICAgICAqIFRoZSBsaXN0ZW5lciBjYW4gb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIGJ5IHJldHVybmluZyB0cnVlCisgICAgICAgICAqIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIGhhbmRsZWQgdGhlIHN1Ym1pdCByZXF1ZXN0LiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlIHRvCisgICAgICAgICAqIGxldCB0aGUgU2VhcmNoVmlldyBoYW5kbGUgdGhlIHN1Ym1pc3Npb24gYnkgbGF1bmNoaW5nIGFueSBhc3NvY2lhdGVkIGludGVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBxdWVyeSB0ZXh0IHRoYXQgaXMgdG8gYmUgc3VibWl0dGVkCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcXVlcnkgaGFzIGJlZW4gaGFuZGxlZCBieSB0aGUgbGlzdGVuZXIsIGZhbHNlIHRvIGxldCB0aGUKKyAgICAgICAgICogU2VhcmNoVmlldyBwZXJmb3JtIHRoZSBkZWZhdWx0IGFjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25TdWJtaXRRdWVyeShTdHJpbmcgcXVlcnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcXVlcnkgdGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmV3VGV4dCB0aGUgbmV3IGNvbnRlbnQgb2YgdGhlIHF1ZXJ5IHRleHQgZmllbGQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIFNlYXJjaFZpZXcgc2hvdWxkIHBlcmZvcm0gdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHNob3dpbmcgYW55CisgICAgICAgICAqIHN1Z2dlc3Rpb25zIGlmIGF2YWlsYWJsZSwgdHJ1ZSBpZiB0aGUgYWN0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZSBsaXN0ZW5lci4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25RdWVyeVRleHRDaGFuZ2VkKFN0cmluZyBuZXdUZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2xvc2VMaXN0ZW5lciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gY2xvc2UgdGhlIFNlYXJjaFZpZXcuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdGVuZXIgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY2xlYXJpbmcgdGhlCisgICAgICAgICAqIHRleHQgZmllbGQgYW5kIGRpc21pc3NpbmcgaXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gb25DbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZWFyY2hWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTZWFyY2hWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgY29udGV4dAorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnNlYXJjaF92aWV3LCB0aGlzLCB0cnVlKTsKKworICAgICAgICBtU2VhcmNoQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2J1dHRvbik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3ID0gKEF1dG9Db21wbGV0ZVRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zZWFyY2hfc3JjX3RleHQpOworICAgICAgICBtU2VhcmNoRWRpdEZyYW1lID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2VkaXRfZnJhbWUpOworICAgICAgICBtU3VibWl0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc2VhcmNoX2dvX2J0bik7CisgICAgICAgIG1DbG9zZUJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnNlYXJjaF9jbG9zZV9idG4pOworCisgICAgICAgIG1TZWFyY2hCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1PbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBtU3VibWl0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihtVGV4dFdhdGNoZXIpOworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKG1PbkVkaXRvckFjdGlvbkxpc3RlbmVyKTsKKyAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtT25JdGVtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobU9uSXRlbVNlbGVjdGVkTGlzdGVuZXIpOworCisgICAgICAgIG1TdWJtaXRCdXR0b25FbmFibGVkID0gZmFsc2U7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5TZWFyY2hWaWV3LCAwLCAwKTsKKyAgICAgICAgc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGEuZ2V0Qm9vbGVhbihSLnN0eWxlYWJsZS5TZWFyY2hWaWV3X2ljb25pZmllZEJ5RGVmYXVsdCwgdHJ1ZSkpOworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgU2VhcmNoYWJsZUluZm8gZm9yIHRoaXMgU2VhcmNoVmlldy4gUHJvcGVydGllcyBpbiB0aGUgU2VhcmNoYWJsZUluZm8gYXJlIHVzZWQKKyAgICAgKiB0byBkaXNwbGF5IGxhYmVscywgaGludHMsIHN1Z2dlc3Rpb25zLCBjcmVhdGUgaW50ZW50cyBmb3IgbGF1bmNoaW5nIHNlYXJjaCByZXN1bHRzIHNjcmVlbnMKKyAgICAgKiBhbmQgY29udHJvbGxpbmcgb3RoZXIgYWZmb3JkYW5jZXMgc3VjaCBhcyBhIHZvaWNlIGJ1dHRvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWFyY2hhYmxlIGEgU2VhcmNoYWJsZUluZm8gY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBTZWFyY2hNYW5hZ2VyLCBmb3IgYSBzcGVjaWZpYworICAgICAqIGFjdGl2aXR5IG9yIGEgZ2xvYmFsIHNlYXJjaCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbyBzZWFyY2hhYmxlKSB7CisgICAgICAgIG1TZWFyY2hhYmxlID0gc2VhcmNoYWJsZTsKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwZGF0ZVNlYXJjaEF1dG9Db21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShtSWNvbmlmaWVkQnlEZWZhdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgbGlzdGVuZXIgZm9yIHVzZXIgYWN0aW9ucyB3aXRoaW4gdGhlIFNlYXJjaFZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIG9iamVjdCB0aGF0IHJlY2VpdmVzIGNhbGxiYWNrcyB3aGVuIHRoZSB1c2VyIHBlcmZvcm1zCisgICAgICogYWN0aW9ucyBpbiB0aGUgU2VhcmNoVmlldyBzdWNoIGFzIGNsaWNraW5nIG9uIGJ1dHRvbnMgb3IgdHlwaW5nIGEgcXVlcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25RdWVyeUNoYW5nZUxpc3RlbmVyKE9uUXVlcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25RdWVyeUNoYW5nZUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHF1ZXJ5IHN0cmluZyBpbiB0aGUgdGV4dCBmaWVsZCBhbmQgb3B0aW9uYWxseSBzdWJtaXRzIHRoZSBxdWVyeSBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5IHRoZSBxdWVyeSBzdHJpbmcuIFRoaXMgcmVwbGFjZXMgYW55IHF1ZXJ5IHRleHQgYWxyZWFkeSBwcmVzZW50IGluIHRoZQorICAgICAqIHRleHQgZmllbGQuCisgICAgICogQHBhcmFtIHN1Ym1pdCB3aGV0aGVyIHRvIHN1Ym1pdCB0aGUgcXVlcnkgcmlnaHQgbm93IG9yIG9ubHkgdXBkYXRlIHRoZSBjb250ZW50cyBvZgorICAgICAqIHRleHQgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnkoQ2hhclNlcXVlbmNlIHF1ZXJ5LCBib29sZWFuIHN1Ym1pdCkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5KTsKKyAgICAgICAgLy8gSWYgdGhlIHF1ZXJ5IGlzIG5vdCBlbXB0eSBhbmQgc3VibWl0IGlzIHJlcXVlc3RlZCwgc3VibWl0IHRoZSBxdWVyeQorICAgICAgICBpZiAoc3VibWl0ICYmICFUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhpbnQgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBxdWVyeSB0ZXh0IGZpZWxkLiBUaGlzIG92ZXJyaWRlcyBhbnkgaGludCBzcGVjaWZpZWQKKyAgICAgKiBpbiB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGludCB0aGUgaGludCB0ZXh0IHRvIGRpc3BsYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUhpbnQoQ2hhclNlcXVlbmNlIGhpbnQpIHsKKyAgICAgICAgbVF1ZXJ5SGludCA9IGhpbnQ7CisgICAgICAgIHVwZGF0ZVF1ZXJ5SGludCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlZmF1bHQgb3IgcmVzdGluZyBzdGF0ZSBvZiB0aGUgc2VhcmNoIGZpZWxkLiBJZiB0cnVlLCBhIHNpbmdsZSBzZWFyY2ggaWNvbiBpcworICAgICAqIHNob3duIGJ5IGRlZmF1bHQgYW5kIGV4cGFuZHMgdG8gc2hvdyB0aGUgdGV4dCBmaWVsZCBhbmQgb3RoZXIgYnV0dG9ucyB3aGVuIHByZXNzZWQuIEFsc28sCisgICAgICogaWYgdGhlIGRlZmF1bHQgc3RhdGUgaXMgaWNvbmlmaWVkLCB0aGVuIGl0IGNvbGxhcHNlcyB0byB0aGF0IHN0YXRlIHdoZW4gdGhlIGNsb3NlIGJ1dHRvbgorICAgICAqIGlzIHByZXNzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWNvbmlmaWVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWNvbmlmaWVkQnlEZWZhdWx0KGJvb2xlYW4gaWNvbmlmaWVkKSB7CisgICAgICAgIG1JY29uaWZpZWRCeURlZmF1bHQgPSBpY29uaWZpZWQ7CisgICAgICAgIHVwZGF0ZVZpZXdzVmlzaWJpbGl0eShpY29uaWZpZWQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSWNvbmZpZWRCeURlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBtSWNvbmlmaWVkQnlEZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgc2hvd2luZyBhIHN1Ym1pdCBidXR0b24gd2hlbiB0aGUgcXVlcnkgaXMgbm9uLWVtcHR5LiBJbiBjYXNlcyB3aGVyZSB0aGUgU2VhcmNoVmlldworICAgICAqIGlzIGJlaW5nIHVzZWQgdG8gZmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhY3Rpdml0eSBhbmQgZG9lc24ndCBsYXVuY2ggYSBzZXBhcmF0ZQorICAgICAqIHJlc3VsdHMgYWN0aXZpdHksIHRoZW4gdGhlIHN1Ym1pdCBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSB0byBzaG93IGEgc3VibWl0IGJ1dHRvbiBmb3Igc3VibWl0dGluZyBxdWVyaWVzLCBmYWxzZSBpZiBhIHN1Ym1pdAorICAgICAqIGJ1dHRvbiBpcyBub3QgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VibWl0QnV0dG9uRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgbVN1Ym1pdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KGVuYWJsZWQgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIG1TdWJtaXRCdXR0b25FbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN1Ym1pdCBidXR0b24gaXMgZW5hYmxlZCB3aGVuIG5lY2Vzc2FyeSBvciBuZXZlciBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHN1Ym1pdCBidXR0b24gaXMgZW5hYmxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gbmVjZXNzYXJ5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdWJtaXRCdXR0b25FbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVN1Ym1pdEJ1dHRvbkVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBGaWx0ZXJhYmxlTGlzdEFkYXB0ZXIgZXh0ZW5kcyBMaXN0QWRhcHRlciwgRmlsdGVyYWJsZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogWW91IGNhbiBzZXQgYSBjdXN0b20gYWRhcHRlciBpZiB5b3Ugd2lzaC4gT3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGFkYXB0ZXIgaXMgdXNlZCB0bworICAgICAqIGRpc3BsYXkgdGhlIHN1Z2dlc3Rpb25zIGZyb20gdGhlIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VhcmNoYWJsZUluZm8uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTZWFyY2hhYmxlSW5mbyhTZWFyY2hhYmxlSW5mbykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWdnZXN0aW9uc0FkYXB0ZXIoQ3Vyc29yQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIG1TdWdnZXN0aW9uc0FkYXB0ZXIgPSBhZGFwdGVyOworCisgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWRhcHRlciB1c2VkIGZvciBzdWdnZXN0aW9ucywgaWYgYW55LgorICAgICAqIEByZXR1cm4gdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3Vyc29yQWRhcHRlciBnZXRTdWdnZXN0aW9uc0FkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBtU3VnZ2VzdGlvbnNBZGFwdGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWaWV3c1Zpc2liaWxpdHkoYm9vbGVhbiBjb2xsYXBzZWQpIHsKKyAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiB2aWV3cyB0aGF0IGFyZSB2aXNpYmxlIHdoZW4gY29sbGFwc2VkCisgICAgICAgIGludCB2aXNDb2xsYXBzZWQgPSBjb2xsYXBzZWQ/IFZJU0lCTEUgOiBHT05FOworICAgICAgICAvLyBWaXNpYmlsaXR5IG9mIHZpZXdzIHRoYXQgYXJlIHZpc2libGUgd2hlbiBleHBhbmRlZAorICAgICAgICBpbnQgdmlzRXhwYW5kZWQgPSBjb2xsYXBzZWQ/IEdPTkUgOiBWSVNJQkxFOworCisgICAgICAgIG1TZWFyY2hCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNDb2xsYXBzZWQpOworICAgICAgICBtU3VibWl0QnV0dG9uLnNldFZpc2liaWxpdHkobVN1Ym1pdEJ1dHRvbkVuYWJsZWQgPyB2aXNFeHBhbmRlZCA6IEdPTkUpOworICAgICAgICBtU2VhcmNoRWRpdEZyYW1lLnNldFZpc2liaWxpdHkodmlzRXhwYW5kZWQpOworCisgICAgICAgIHNldEltZVZpc2liaWxpdHkoIWNvbGxhcHNlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEltZVZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIC8vIFdlIG1hZGUgc3VyZSB0aGUgSU1FIHdhcyBkaXNwbGF5ZWQsIHNvIGFsc28gbWFrZSBzdXJlIGl0IGlzIGNsb3NlZAorICAgICAgICAvLyB3aGVuIHdlIGdvIGF3YXkuCisgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuSU5QVVRfTUVUSE9EX1NFUlZJQ0UpOworICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgaW1tLnNob3dTb2Z0SW5wdXRVbmNoZWNrZWQoMCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltbS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhnZXRXaW5kb3dUb2tlbigpLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT25DbGlja0xpc3RlbmVyIG1PbkNsaWNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpZiAodiA9PSBtU2VhcmNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25TZWFyY2hDbGlja2VkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbUNsb3NlQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25DbG9zZUNsaWNrZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtU3VibWl0QnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25TdWJtaXRRdWVyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgdGhlIGtleSBkb3duIGV2ZW50IGZvciBkZWFsaW5nIHdpdGggYWN0aW9uIGtleXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5Q29kZSBUaGlzIGlzIHRoZSBrZXljb2RlIG9mIHRoZSB0eXBlZCBrZXksIGFuZCBpcyB0aGUgc2FtZSB2YWx1ZSBhcworICAgICAqICAgICAgICBmb3VuZCBpbiB0aGUgS2V5RXZlbnQgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgY29tcGxldGUgZXZlbnQgcmVjb3JkIGZvciB0aGUgdHlwZWQga2V5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkIGhlcmUsIG9yIGZhbHNlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtU2VhcmNoYWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBpdCdzIGFuIGFjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaGFibGUgYWN0aXZpdHksIGxhdW5jaCB0aGUKKyAgICAgICAgLy8gZW50ZXJlZCBxdWVyeSB3aXRoIHRoZSBhY3Rpb24ga2V5CisgICAgICAgIFNlYXJjaGFibGVJbmZvLkFjdGlvbktleUluZm8gYWN0aW9uS2V5ID0gbVNlYXJjaGFibGUuZmluZEFjdGlvbktleShrZXlDb2RlKTsKKyAgICAgICAgaWYgKChhY3Rpb25LZXkgIT0gbnVsbCkgJiYgKGFjdGlvbktleS5nZXRRdWVyeUFjdGlvbk1zZygpICE9IG51bGwpKSB7CisgICAgICAgICAgICBsYXVuY2hRdWVyeVNlYXJjaChrZXlDb2RlLCBhY3Rpb25LZXkuZ2V0UXVlcnlBY3Rpb25Nc2coKSwgbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUXVlcnlIaW50KCkgeworICAgICAgICBpZiAobVF1ZXJ5SGludCAhPSBudWxsKSB7CisgICAgICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRIaW50KG1RdWVyeUhpbnQpOworICAgICAgICB9IGVsc2UgaWYgKG1TZWFyY2hhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBoaW50ID0gbnVsbDsKKyAgICAgICAgICAgIGludCBoaW50SWQgPSBtU2VhcmNoYWJsZS5nZXRIaW50SWQoKTsKKyAgICAgICAgICAgIGlmIChoaW50SWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGhpbnQgPSBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKGhpbnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGludCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0SGludChoaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGF1dG8tY29tcGxldGUgdGV4dCB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hBdXRvQ29tcGxldGUoKSB7CisgICAgICAgIC8vIGNsb3NlIGFueSBleGlzdGluZyBzdWdnZXN0aW9ucyBhZGFwdGVyCisgICAgICAgIC8vY2xvc2VTdWdnZXN0aW9uc0FkYXB0ZXIoKTsKKworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXREcm9wRG93bkFuaW1hdGlvblN0eWxlKDApOyAvLyBubyBhbmltYXRpb24KKworICAgICAgICAvLyBhdHRhY2ggdGhlIHN1Z2dlc3Rpb25zIGFkYXB0ZXIsIGlmIHN1Z2dlc3Rpb25zIGFyZSBhdmFpbGFibGUKKyAgICAgICAgLy8gVGhlIGV4aXN0ZW5jZSBvZiBhIHN1Z2dlc3Rpb25zIGF1dGhvcml0eSBpcyB0aGUgcHJveHkgZm9yICJzdWdnZXN0aW9ucyBhdmFpbGFibGUgaGVyZSIKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLmdldFN1Z2dlc3RBdXRob3JpdHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VnZ2VzdGlvbnNBZGFwdGVyID0gbmV3IFN1Z2dlc3Rpb25zQWRhcHRlcihnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1TZWFyY2hhYmxlLCBtT3V0c2lkZURyYXdhYmxlc0NhY2hlKTsKKyAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldEFkYXB0ZXIobVN1Z2dlc3Rpb25zQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgbU9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgPSBuZXcgT25FZGl0b3JBY3Rpb25MaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGlucHV0IG1ldGhvZCBkZWZhdWx0IGFjdGlvbiBrZXkgaXMgcHJlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uRWRpdG9yQWN0aW9uKFRleHRWaWV3IHYsIGludCBhY3Rpb25JZCwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIG9uU3VibWl0UXVlcnkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBuZXdUZXh0KSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBib29sZWFuIGhhc1RleHQgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGV4dCk7CisgICAgICAgIGlmIChpc1N1Ym1pdEJ1dHRvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgbVN1Ym1pdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KGhhc1RleHQgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25RdWVyeVRleHRDaGFuZ2VkKG5ld1RleHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uU3VibWl0UXVlcnkoKSB7CisgICAgICAgIENoYXJTZXF1ZW5jZSBxdWVyeSA9IG1RdWVyeVRleHRWaWV3LmdldFRleHQoKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIGlmIChtT25RdWVyeUNoYW5nZUxpc3RlbmVyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgfHwgIW1PblF1ZXJ5Q2hhbmdlTGlzdGVuZXIub25TdWJtaXRRdWVyeShxdWVyeS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIGlmIChtU2VhcmNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdW5jaFF1ZXJ5U2VhcmNoKEtleUV2ZW50LktFWUNPREVfVU5LTk9XTiwgbnVsbCwgcXVlcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ2xvc2VDbGlja2VkKCkgeworICAgICAgICBpZiAobU9uQ2xvc2VMaXN0ZW5lciA9PSBudWxsIHx8ICFtT25DbG9zZUxpc3RlbmVyLm9uQ2xvc2UoKSkgeworICAgICAgICAgICAgbVF1ZXJ5VGV4dFZpZXcuc2V0VGV4dCgiIik7CisgICAgICAgICAgICB1cGRhdGVWaWV3c1Zpc2liaWxpdHkobUljb25pZmllZEJ5RGVmYXVsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25TZWFyY2hDbGlja2VkKCkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgdXBkYXRlVmlld3NWaXNpYmlsaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uSXRlbUNsaWNrTGlzdGVuZXIgPSBuZXcgT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wbGVtZW50cyBPbkl0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbkl0ZW1DbGljaygpIHBvc2l0aW9uICIgKyBwb3NpdGlvbik7CisgICAgICAgICAgICBsYXVuY2hTdWdnZXN0aW9uKHBvc2l0aW9uLCBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04sIG51bGwpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciA9IG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbXBsZW1lbnRzIE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3PD8+IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpCisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIm9uSXRlbVNlbGVjdGVkKCkgcG9zaXRpb24gIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIC8vIEEgc3VnZ2VzdGlvbiBoYXMgYmVlbiBzZWxlY3RlZCwgcmV3cml0ZSB0aGUgcXVlcnkgaWYgcG9zc2libGUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHF1ZXJ5LgorICAgICAgICAgICAgcmV3cml0ZVF1ZXJ5RnJvbVN1Z2dlc3Rpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEltcGxlbWVudHMgT25JdGVtU2VsZWN0ZWRMaXN0ZW5lcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICBpZiAoREJHKQorICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvbk5vdGhpbmdTZWxlY3RlZCgpIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUXVlcnkgcmV3cml0aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXdyaXRlUXVlcnlGcm9tU3VnZ2VzdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIG9sZFF1ZXJ5ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBDdXJzb3IgYyA9IG1TdWdnZXN0aW9uc0FkYXB0ZXIuZ2V0Q3Vyc29yKCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy5tb3ZlVG9Qb3NpdGlvbihwb3NpdGlvbikpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV3IHF1ZXJ5IGZyb20gdGhlIHN1Z2dlc3Rpb24uCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmV3UXVlcnkgPSBtU3VnZ2VzdGlvbnNBZGFwdGVyLmNvbnZlcnRUb1N0cmluZyhjKTsKKyAgICAgICAgICAgIGlmIChuZXdRdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHN1Z2dlc3Rpb24gcmV3cml0ZXMgdGhlIHF1ZXJ5LgorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGV4dCBmaWVsZCwgd2l0aG91dCBnZXR0aW5nIG5ldyBzdWdnZXN0aW9ucy4KKyAgICAgICAgICAgICAgICBzZXRRdWVyeShuZXdRdWVyeSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWdnZXN0aW9uIGRvZXMgbm90IHJld3JpdGUgdGhlIHF1ZXJ5LCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICAgICAgc2V0UXVlcnkob2xkUXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgZ290IGEgYmFkIHBvc2l0aW9uLCByZXN0b3JlIHRoZSB1c2VyJ3MgcXVlcnkuCisgICAgICAgICAgICBzZXRRdWVyeShvbGRRdWVyeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2hlcyBhbiBpbnRlbnQgYmFzZWQgb24gYSBzdWdnZXN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBpbmRleCBvZiB0aGUgc3VnZ2VzdGlvbiB0byBjcmVhdGUgdGhlIGludGVudCBmcm9tLgorICAgICAqIEBwYXJhbSBhY3Rpb25LZXkgVGhlIGtleSBjb2RlIG9mIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIHtAbGluayBLZXlFdmVudCNLRVlDT0RFX1VOS05PV059IGlmIG5vbmUuCisgICAgICogQHBhcmFtIGFjdGlvbk1zZyBUaGUgbWVzc2FnZSBmb3IgdGhlIGFjdGlvbiBrZXkgdGhhdCB3YXMgcHJlc3NlZCwKKyAgICAgKiAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzdWNjZXNzZnVsIGxhdW5jaCwgZmFsc2UgaWYgY291bGQgbm90IChlLmcuIGJhZCBwb3NpdGlvbikuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxhdW5jaFN1Z2dlc3Rpb24oaW50IHBvc2l0aW9uLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIEN1cnNvciBjID0gbVN1Z2dlc3Rpb25zQWRhcHRlci5nZXRDdXJzb3IoKTsKKyAgICAgICAgaWYgKChjICE9IG51bGwpICYmIGMubW92ZVRvUG9zaXRpb24ocG9zaXRpb24pKSB7CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihjLCBhY3Rpb25LZXksIGFjdGlvbk1zZyk7CisKKyAgICAgICAgICAgIC8vIGxhdW5jaCB0aGUgaW50ZW50CisgICAgICAgICAgICBsYXVuY2hJbnRlbnQoaW50ZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaGVzIGFuIGludGVudCwgaW5jbHVkaW5nIGFueSBzcGVjaWFsIGludGVudCBoYW5kbGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaWYgKGludGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnRlbnQgd2FzIGNyZWF0ZWQgZnJvbSBhIHN1Z2dlc3Rpb24sIGl0IHdpbGwgYWx3YXlzIGhhdmUgYW4gZXhwbGljaXQKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBoZXJlLgorICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkZhaWxlZCBsYXVuY2ggYWN0aXZpdHk6ICIgKyBpbnRlbnQsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRleHQgaW4gdGhlIHF1ZXJ5IGJveCwgd2l0aG91dCB1cGRhdGluZyB0aGUgc3VnZ2VzdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFF1ZXJ5KENoYXJTZXF1ZW5jZSBxdWVyeSkgeworICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxhdW5jaFF1ZXJ5U2VhcmNoKGludCBhY3Rpb25LZXksIFN0cmluZyBhY3Rpb25Nc2csIFN0cmluZyBxdWVyeSkgeworICAgICAgICBTdHJpbmcgYWN0aW9uID0gSW50ZW50LkFDVElPTl9TRUFSQ0g7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBjcmVhdGVJbnRlbnQoYWN0aW9uLCBudWxsLCBudWxsLCBxdWVyeSwgbnVsbCwgYWN0aW9uS2V5LCBhY3Rpb25Nc2cpOworICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW50ZW50IGZyb20gdGhlIGdpdmVuIGluZm9ybWF0aW9uIGFuZCB0aGUgc2VhcmNoIGRpYWxvZyBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24gSW50ZW50IGFjdGlvbi4KKyAgICAgKiBAcGFyYW0gZGF0YSBJbnRlbnQgZGF0YSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGV4dHJhRGF0YSBEYXRhIGZvciB7QGxpbmsgU2VhcmNoTWFuYWdlciNFWFRSQV9EQVRBX0tFWX0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIHF1ZXJ5IEludGVudCBxdWVyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWUgRGF0YSBmb3Ige0BsaW5rIFNlYXJjaE1hbmFnZXIjQ09NUE9ORU5UX05BTUVfS0VZfSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHBhcmFtIG1vZGUgVGhlIHNlYXJjaCBtb2RlLCBvbmUgb2YgdGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvcgorICAgICAqICAgICAgICAgICAgIHtAbGluayBTZWFyY2hNYW5hZ2VyI1NFQVJDSF9NT0RFfSwgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gVGhlIGludGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnQoU3RyaW5nIGFjdGlvbiwgVXJpIGRhdGEsIFN0cmluZyBleHRyYURhdGEsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lLCBpbnQgYWN0aW9uS2V5LCBTdHJpbmcgYWN0aW9uTXNnKSB7CisgICAgICAgIC8vIE5vdyBidWlsZCB0aGUgSW50ZW50CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIC8vIFdlIG5lZWQgQ0xFQVJfVE9QIHRvIGF2b2lkIHJldXNpbmcgYW4gb2xkIHRhc2sgdGhhdCBoYXMgb3RoZXIgYWN0aXZpdGllcworICAgICAgICAvLyBvbiB0b3Agb2YgdGhlIG9uZSB3ZSB3YW50LiBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgaW4gaW4tYXBwIHNlYXJjaCB0aG91Z2gsCisgICAgICAgIC8vIGFzIGl0IGNhbiBiZSBkZXN0cnVjdGl2ZSB0byB0aGUgYWN0aXZpdHkgc3RhY2suCisgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlVTRVJfUVVFUlksIHF1ZXJ5KTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlFVRVJZLCBxdWVyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4dHJhRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5FWFRSQV9EQVRBX0tFWSwgZXh0cmFEYXRhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uS2V5ICE9IEtleUV2ZW50LktFWUNPREVfVU5LTk9XTikgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuQUNUSU9OX0tFWSwgYWN0aW9uS2V5KTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLkFDVElPTl9NU0csIGFjdGlvbk1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChtU2VhcmNoYWJsZS5nZXRTZWFyY2hBY3Rpdml0eSgpKTsKKyAgICAgICAgcmV0dXJuIGludGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgcGFydGljdWxhciBzdWdnZXN0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLCBwZXJmb3JtIHRoZSB2YXJpb3VzIGxvb2t1cHMgcmVxdWlyZWQKKyAgICAgKiB0byB1c2UgdGhlIHN1Z2dlc3Rpb24uICBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoZSBjdXJzb3IgZm9yIHN1Z2dlc3Rpb24tc3BlY2lmaWMgZGF0YSwKKyAgICAgKiBhbmQvb3IgZmFsbGluZyBiYWNrIHRvIHRoZSBYTUwgZm9yIGRlZmF1bHRzOyAgSXQgYWxzbyBjcmVhdGVzIFJFU1Qgc3R5bGUgVXJpIGRhdGEgd2hlbgorICAgICAqIHRoZSBzdWdnZXN0aW9uIGluY2x1ZGVzIGEgZGF0YSBpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdWdnZXN0aW9ucyBjdXJzb3IsIG1vdmVkIHRvIHRoZSByb3cgb2YgdGhlIHVzZXIncyBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gYWN0aW9uS2V5IFRoZSBrZXkgY29kZSBvZiB0aGUgYWN0aW9uIGtleSB0aGF0IHdhcyBwcmVzc2VkLAorICAgICAqICAgICAgICBvciB7QGxpbmsgS2V5RXZlbnQjS0VZQ09ERV9VTktOT1dOfSBpZiBub25lLgorICAgICAqIEBwYXJhbSBhY3Rpb25Nc2cgVGhlIG1lc3NhZ2UgZm9yIHRoZSBhY3Rpb24ga2V5IHRoYXQgd2FzIHByZXNzZWQsCisgICAgICogICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisgICAgICogQHJldHVybiBBbiBpbnRlbnQgZm9yIHRoZSBzdWdnZXN0aW9uIGF0IHRoZSBjdXJzb3IncyBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEludGVudCBjcmVhdGVJbnRlbnRGcm9tU3VnZ2VzdGlvbihDdXJzb3IgYywgaW50IGFjdGlvbktleSwgU3RyaW5nIGFjdGlvbk1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGFjdGlvbiBpZiBzdXBwbGllZCwgb3IgZGVmYXVsdCBhY3Rpb24gaWYgc3VwcGxpZWQsIG9yIGZpeGVkIGRlZmF1bHQKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfQUNUSU9OKTsKKworICAgICAgICAgICAgLy8gc29tZSBpdGVtcyBhcmUgZGlzcGxheSBvbmx5LCBvciBoYXZlIGVmZmVjdCB2aWEgdGhlIGN1cnNvciByZXNwb25kIGNsaWNrIHJlcG9ydGluZy4KKyAgICAgICAgICAgIGlmIChTZWFyY2hNYW5hZ2VyLklOVEVOVF9BQ1RJT05fTk9ORS5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBtU2VhcmNoYWJsZS5nZXRTdWdnZXN0SW50ZW50QWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBJbnRlbnQuQUNUSU9OX1NFQVJDSDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIHNwZWNpZmljIGRhdGEgaWYgc3VwcGxpZWQsIG9yIGRlZmF1bHQgZGF0YSBpZiBzdXBwbGllZAorICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQSk7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG1TZWFyY2hhYmxlLmdldFN1Z2dlc3RJbnRlbnREYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0aGVuLCBpZiBhbiBJRCB3YXMgcHJvdmlkZWQsIGFwcGVuZCBpdC4KKyAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRDb2x1bW5TdHJpbmcoYywgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQV9JRCk7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyAiLyIgKyBVcmkuZW5jb2RlKGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVcmkgZGF0YVVyaSA9IChkYXRhID09IG51bGwpID8gbnVsbCA6IFVyaS5wYXJzZShkYXRhKTsKKworICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRDb2x1bW5TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FKTsKKworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0Q29sdW1uU3RyaW5nKGMsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fUVVFUlkpOworICAgICAgICAgICAgU3RyaW5nIGV4dHJhRGF0YSA9IGdldENvbHVtblN0cmluZyhjLCBTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lOVEVOVF9FWFRSQV9EQVRBKTsKKworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudChhY3Rpb24sIGRhdGFVcmksIGV4dHJhRGF0YSwgcXVlcnksIGNvbXBvbmVudE5hbWUsIGFjdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlICkgeworICAgICAgICAgICAgaW50IHJvd051bTsKKyAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSByZWFsbHkgcGFyYW5vaWQgbm93CisgICAgICAgICAgICAgICAgcm93TnVtID0gYy5nZXRQb3NpdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMiApIHsKKyAgICAgICAgICAgICAgICByb3dOdW0gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggU3VnZ2VzdGlvbnMgY3Vyc29yIGF0IHJvdyAiICsgcm93TnVtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybmVkIGV4Y2VwdGlvbiIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byB3YXRjaCB0aGUgdGV4dCBmaWVsZCBmb3IgZW1wdHkvbm9uLWVtcHR5CisgICAgICovCisgICAgcHJpdmF0ZSBUZXh0V2F0Y2hlciBtVGV4dFdhdGNoZXIgPSBuZXcgVGV4dFdhdGNoZXIoKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGFmdGVyKSB7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgaW50IGJlZm9yZSwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICBTZWFyY2hWaWV3LnRoaXMub25UZXh0Q2hhbmdlZChzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2ltcGxlQ3Vyc29yQWRhcHRlci5qYXZhCmluZGV4IDdkMzQ1OWUuLmQxYzIyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TaW1wbGVDdXJzb3JBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NpbXBsZUN1cnNvckFkYXB0ZXIuamF2YQpAQCAtNjIsNyArNjIsOCBAQAogICAgIHByaXZhdGUgaW50IG1TdHJpbmdDb252ZXJzaW9uQ29sdW1uID0gLTE7CiAgICAgcHJpdmF0ZSBDdXJzb3JUb1N0cmluZ0NvbnZlcnRlciBtQ3Vyc29yVG9TdHJpbmdDb252ZXJ0ZXI7CiAgICAgcHJpdmF0ZSBWaWV3QmluZGVyIG1WaWV3QmluZGVyOwotICAgIHByaXZhdGUgU3RyaW5nW10gbU9yaWdpbmFsRnJvbTsKKworICAgIFN0cmluZ1tdIG1PcmlnaW5hbEZyb207CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDhkZGIwNmMuLmMwY2JiMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFTZXRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCkBAIC00MCwyNyArNDEsMTUxIEBACiAgKi8KIEBXaWRnZXQKIHB1YmxpYyBjbGFzcyBTcGlubmVyIGV4dGVuZHMgQWJzU3Bpbm5lciBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTcGlubmVyIjsKICAgICAKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OwotICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbVBvcHVwOworICAgIC8qKgorICAgICAqIFVzZSBhIGRpYWxvZyB3aW5kb3cgZm9yIHNlbGVjdGluZyBzcGlubmVyIG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ESUFMT0cgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSBhIGRyb3Bkb3duIGFuY2hvcmVkIHRvIHRoZSBTcGlubmVyIGZvciBzZWxlY3Rpbmcgc3Bpbm5lciBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfRFJPUERPV04gPSAxOworICAgIAorICAgIC8qKgorICAgICAqIFVzZSB0aGUgdGhlbWUtc3VwcGxpZWQgdmFsdWUgdG8gc2VsZWN0IHRoZSBkcm9wZG93biBtb2RlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1RIRU1FID0gLTE7CisgICAgCisgICAgcHJpdmF0ZSBTcGlubmVyUG9wdXAgbVBvcHVwOworICAgIHByaXZhdGUgRHJvcERvd25BZGFwdGVyIG1UZW1wQWRhcHRlcjsKIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICovCiAgICAgcHVibGljIFNwaW5uZXIoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQKKyAgICAgKiBtb2RlIG9mIGRpc3BsYXlpbmcgY2hvaWNlcy4gPGNvZGU+bW9kZTwvY29kZT4gbWF5IGJlIG9uZSBvZgorICAgICAqIHtAbGluayAjTU9ERV9ESUFMT0d9IG9yIHtAbGluayAjTU9ERV9EUk9QRE9XTn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIGludCBtb2RlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnNwaW5uZXJTdHlsZSwgbW9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNwaW5uZXIgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCdzIHRoZW1lIGFuZCB0aGUgc3VwcGxpZWQgYXR0cmlidXRlIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoZSB2aWV3IGlzIHJ1bm5pbmcgaW4sIHRocm91Z2ggd2hpY2ggaXQgY2FuCisgICAgICogICAgICAgIGFjY2VzcyB0aGUgY3VycmVudCB0aGVtZSwgcmVzb3VyY2VzLCBldGMuCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBYTUwgdGFnIHRoYXQgaXMgaW5mbGF0aW5nIHRoZSB2aWV3LgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5zcGlubmVyU3R5bGUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqLwogICAgIHB1YmxpYyBTcGlubmVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIE1PREVfVEhFTUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzcGlubmVyIHdpdGggdGhlIGdpdmVuIGNvbnRleHQncyB0aGVtZSwgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZSBzZXQsCisgICAgICogYW5kIGRlZmF1bHQgc3R5bGUuIDxjb2RlPm1vZGU8L2NvZGU+IG1heSBiZSBvbmUgb2Yge0BsaW5rICNNT0RFX0RJQUxPR30gb3IKKyAgICAgKiB7QGxpbmsgI01PREVfRFJPUERPV059IGFuZCBkZXRlcm1pbmVzIGhvdyB0aGUgdXNlciB3aWxsIHNlbGVjdCBjaG9pY2VzIGZyb20gdGhlIHNwaW5uZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0aGUgdmlldyBpcyBydW5uaW5nIGluLCB0aHJvdWdoIHdoaWNoIGl0IGNhbgorICAgICAqICAgICAgICBhY2Nlc3MgdGhlIGN1cnJlbnQgdGhlbWUsIHJlc291cmNlcywgZXRjLgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBvZiB0aGUgWE1MIHRhZyB0aGF0IGlzIGluZmxhdGluZyB0aGUgdmlldy4KKyAgICAgKiBAcGFyYW0gZGVmU3R5bGUgVGhlIGRlZmF1bHQgc3R5bGUgdG8gYXBwbHkgdG8gdGhpcyB2aWV3LiBJZiAwLCBubyBzdHlsZQorICAgICAqICAgICAgICB3aWxsIGJlIGFwcGxpZWQgKGJleW9uZCB3aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0aGVtZSkuIFRoaXMgbWF5CisgICAgICogICAgICAgIGVpdGhlciBiZSBhbiBhdHRyaWJ1dGUgcmVzb3VyY2UsIHdob3NlIHZhbHVlIHdpbGwgYmUgcmV0cmlldmVkCisgICAgICogICAgICAgIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUsIG9yIGFuIGV4cGxpY2l0IHN0eWxlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBtb2RlIENvbnN0YW50IGRlc2NyaWJpbmcgaG93IHRoZSB1c2VyIHdpbGwgc2VsZWN0IGNob2ljZXMgZnJvbSB0aGUgc3Bpbm5lci4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNNT0RFX0RJQUxPRworICAgICAqIEBzZWUgI01PREVfRFJPUERPV04KKyAgICAgKi8KKyAgICBwdWJsaWMgU3Bpbm5lcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlLCBpbnQgbW9kZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOwogCiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyLCBkZWZTdHlsZSwgMCk7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9USEVNRSkgeworICAgICAgICAgICAgbW9kZSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfc3Bpbm5lck1vZGUsIE1PREVfRElBTE9HKTsKKyAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgbVByb21wdCA9IGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcHJvbXB0KTsKKyAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9ESUFMT0c6IHsKKyAgICAgICAgICAgIG1Qb3B1cCA9IG5ldyBEaWFsb2dQb3B1cCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1PREVfRFJPUERPV046IHsKKyAgICAgICAgICAgIGZpbmFsIGludCBoaW50UmVzb3VyY2UgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBQcm9tcHRWaWV3LCAwKTsKKworICAgICAgICAgICAgRHJvcGRvd25Qb3B1cCBwb3B1cCA9IG5ldyBEcm9wZG93blBvcHVwKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgaGludFJlc291cmNlKTsKKworICAgICAgICAgICAgcG9wdXAuc2V0QmFja2dyb3VuZERyYXdhYmxlKGEuZ2V0RHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlNwaW5uZXJfcG9wdXBCYWNrZ3JvdW5kKSk7CisgICAgICAgICAgICBwb3B1cC5zZXRWZXJ0aWNhbE9mZnNldChhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX2Ryb3BEb3duVmVydGljYWxPZmZzZXQsIDApKTsKKyAgICAgICAgICAgIHBvcHVwLnNldEhvcml6b250YWxPZmZzZXQoYS5nZXREaW1lbnNpb25QaXhlbE9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3Bpbm5lcl9kcm9wRG93bkhvcml6b250YWxPZmZzZXQsIDApKTsKKworICAgICAgICAgICAgbVBvcHVwID0gcG9wdXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TcGlubmVyX3Byb21wdCkpOwogCiAgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIEJhc2UgY29uc3RydWN0b3IgY2FuIGNhbGwgc2V0QWRhcHRlciBiZWZvcmUgd2UgaW5pdGlhbGl6ZSBtUG9wdXAuCisgICAgICAgIC8vIEZpbmlzaCBzZXR0aW5nIHRoaW5ncyB1cCBpZiB0aGlzIGhhcHBlbmVkLgorICAgICAgICBpZiAobVRlbXBBZGFwdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Qb3B1cC5zZXRBZGFwdGVyKG1UZW1wQWRhcHRlcik7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBzdXBlci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIGlmIChtUG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIobmV3IERyb3BEb3duQWRhcHRlcihhZGFwdGVyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGVtcEFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04Nyw3ICsyMTIsNiBAQAogICAgICAgICAKICAgICAgICAgaWYgKG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKSkgewogICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKLSAgICAgICAgICAgIG1Qb3B1cCA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5Nyw4ICszMjEsNiBAQAogICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBmb3IgbWFrZUFuZEFkZFZpZXcgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiBhIHZpZXcKICAgICAgKiBhbmQgZmlsbCBvdXQgaXRzIGxheW91dCBwYXJhbXRlcnMuCkBAIC0yNDksMTUgKzM3MSwxMCBAQAogICAgICAgICAKICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgRHJvcERvd25BZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRHJvcERvd25BZGFwdGVyKGdldEFkYXB0ZXIoKSk7CiAKLSAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG1Qcm9tcHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGl0bGUobVByb21wdCk7CisgICAgICAgICAgICBpZiAoIW1Qb3B1cC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIG1Qb3B1cC5zaG93KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUG9wdXAgPSBidWlsZGVyLnNldFNpbmdsZUNob2ljZUl0ZW1zKGFkYXB0ZXIsIGdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCksIHRoaXMpLnNob3coKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBoYW5kbGVkOwpAQCAtMjY2LDcgKzM4Myw2IEBACiAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKICAgICAgICAgc2V0U2VsZWN0aW9uKHdoaWNoKTsKICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTsKLSAgICAgICAgbVBvcHVwID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTI3NCw3ICszOTAsNyBAQAogICAgICAqIEBwYXJhbSBwcm9tcHQgdGhlIHByb21wdCB0byBzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHQoQ2hhclNlcXVlbmNlIHByb21wdCkgewotICAgICAgICBtUHJvbXB0ID0gcHJvbXB0OworICAgICAgICBtUG9wdXAuc2V0UHJvbXB0VGV4dChwcm9tcHQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgyLDE0ICszOTgsMTQgQEAKICAgICAgKiBAcGFyYW0gcHJvbXB0SWQgdGhlIHJlc291cmNlIElEIG9mIHRoZSBwcm9tcHQgdG8gZGlzcGxheSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9tcHRJZChpbnQgcHJvbXB0SWQpIHsKLSAgICAgICAgbVByb21wdCA9IGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKTsKKyAgICAgICAgc2V0UHJvbXB0KGdldENvbnRleHQoKS5nZXRUZXh0KHByb21wdElkKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQcm9tcHQoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICByZXR1cm4gbVBvcHVwLmdldEhpbnRUZXh0KCk7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMzg3LDQgKzUwMywxMjQgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRDb3VudCgpID09IDA7CiAgICAgICAgIH0KICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyBzb21lIHNvcnQgb2YgcG9wdXAgc2VsZWN0aW9uIGludGVyZmFjZSBmb3Igc2VsZWN0aW5nIGEgc3Bpbm5lciBvcHRpb24uCisgICAgICogQWxsb3dzIGZvciBkaWZmZXJlbnQgc3Bpbm5lciBtb2Rlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludGVyZmFjZSBTcGlubmVyUG9wdXAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKExpc3RBZGFwdGVyIGFkYXB0ZXIpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNob3cgdGhlIHBvcHVwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzaG93KCk7CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogRGlzbWlzcyB0aGUgcG9wdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKTsKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvcHVwIGlzIHNob3dpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpOworICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBoaW50IHRleHQgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGlzIHNob3VsZCBwcm92aWRlCisgICAgICAgICAqIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNob2ljZSBiZWluZyBtYWRlLgorICAgICAgICAgKiBAcGFyYW0gaGludFRleHQgSGludCB0ZXh0IHRvIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb21wdFRleHQoQ2hhclNlcXVlbmNlIGhpbnRUZXh0KTsKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIERpYWxvZ1BvcHVwIGltcGxlbWVudHMgU3Bpbm5lclBvcHVwLCBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtUG9wdXA7CisgICAgICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUxpc3RBZGFwdGVyOworICAgICAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtUHJvbXB0OworCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgbVBvcHVwID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9wdXAgIT0gbnVsbCA/IG1Qb3B1cC5pc1Nob3dpbmcoKSA6IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihMaXN0QWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgICAgICBtTGlzdEFkYXB0ZXIgPSBhZGFwdGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1Qcm9tcHQgPSBoaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRIaW50VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvbXB0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgICAgIEFsZXJ0RGlhbG9nLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpZiAobVByb21wdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaXRsZShtUHJvbXB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb3B1cCA9IGJ1aWxkZXIuc2V0U2luZ2xlQ2hvaWNlSXRlbXMobUxpc3RBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBnZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpLCB0aGlzKS5zaG93KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24od2hpY2gpOworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgY2xhc3MgRHJvcGRvd25Qb3B1cCBleHRlbmRzIExpc3RQb3B1cFdpbmRvdyBpbXBsZW1lbnRzIFNwaW5uZXJQb3B1cCB7CisgICAgICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1IaW50VGV4dDsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtSGludFZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1IaW50UmVzb3VyY2U7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgRHJvcGRvd25Qb3B1cChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywKKyAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMsIGludCBoaW50UmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCAwLCBkZWZTdHlsZVJlcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1IaW50UmVzb3VyY2UgPSBoaW50UmVzb3VyY2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldEFuY2hvclZpZXcoU3Bpbm5lci50aGlzKTsKKyAgICAgICAgICAgIHNldE1vZGFsKHRydWUpOworICAgICAgICAgICAgc2V0UHJvbXB0UG9zaXRpb24oUE9TSVRJT05fUFJPTVBUX0JFTE9XKTsKKyAgICAgICAgICAgIHNldE9uSXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXcgcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBTcGlubmVyLnRoaXMuc2V0U2VsZWN0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEhpbnRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1IaW50VGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvbXB0VGV4dChDaGFyU2VxdWVuY2UgaGludFRleHQpIHsKKyAgICAgICAgICAgIG1IaW50VGV4dCA9IGhpbnRUZXh0OworICAgICAgICAgICAgaWYgKG1IaW50VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhpbnRWaWV3LnNldFRleHQoaGludFRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgICAgICBpZiAobUhpbnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXh0VmlldyB0ZXh0VmlldyA9IChUZXh0VmlldykgTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGludFJlc291cmNlLCBudWxsKS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtSGludFRleHQpOworICAgICAgICAgICAgICAgIHNldFByb21wdFZpZXcodGV4dFZpZXcpOworICAgICAgICAgICAgICAgIG1IaW50VmlldyA9IHRleHRWaWV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2hvdygpOworICAgICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oU3Bpbm5lci50aGlzLmdldFNlbGVjdGVkSXRlbVBvc2l0aW9uKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N0YWNrVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3RhY2tWaWV3LmphdmEKQEAgLTAsMCArMSwxMDEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UYWJsZU1hc2tGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkxpbmVhckludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZW1vdGVWaWV3cy5SZW1vdGVWaWV3OworCitAUmVtb3RlVmlldworLyoqCisgKiBBIHZpZXcgdGhhdCBkaXNwbGF5cyBpdHMgY2hpbGRyZW4gaW4gYSBzdGFjayBhbmQgYWxsb3dzIHVzZXJzIHRvIGRpc2NyZXRlbHkgc3dpcGUKKyAqIHRocm91Z2ggdGhlIGNoaWxkcmVuLgorICovCitwdWJsaWMgY2xhc3MgU3RhY2tWaWV3IGV4dGVuZHMgQWRhcHRlclZpZXdBbmltYXRvciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YWNrVmlldyI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04gPSA0MDA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUlOSU1VTV9BTklNQVRJT05fRFVSQVRJT04gPSA1MDsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgZWZmZWN0aW5nIHRoZSBwZXJzcGVjdGl2ZSB2aXN1YWxzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SID0gMC4xMmY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SID0gMC4zNWY7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnQgdGhlIHR3byBwb3NzaWJsZSBzdGFjayBtb2Rlcywgb25lIHdoZXJlIGl0ZW1zIHNsaWRlIHVwLCBhbmQgdGhlIG90aGVyCisgICAgICogd2hlcmUgaXRlbXMgc2xpZGUgZG93bi4gVGhlIHBlcnNwZWN0aXZlIGlzIGFsc28gaW52ZXJ0ZWQgYmV0d2VlbiB0aGVzZSB0d28gbW9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1TX1NMSURFX1VQID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFTVNfU0xJREVfRE9XTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGVzZSBzcGVjaWZ5IHRoZSBkaWZmZXJlbnQgZ2VzdHVyZSBzdGF0ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9OT05FID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VTVFVSRV9TTElERV9VUCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFU1RVUkVfU0xJREVfRE9XTiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgaG93IGZhciB5b3UgbmVlZCB0byBzd2lwZSAodXAgb3IgZG93bikgYmVmb3JlIGl0CisgICAgICogd2lsbCBiZSBjb25zaWRlciBhIGNvbXBsZXRlZCBnZXN0dXJlIHdoZW4geW91IGxpZnQgeW91ciBmaW5nZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTV0lQRV9USFJFU0hPTERfUkFUSU8gPSAwLjM1ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTTElERV9VUF9SQVRJTyA9IDAuN2Y7CisKKyAgICAvKioKKyAgICAgKiBTZW50aW5lbCB2YWx1ZSBmb3Igbm8gY3VycmVudCBhY3RpdmUgcG9pbnRlci4KKyAgICAgKiBVc2VkIGJ5IHtAbGluayAjbUFjdGl2ZVBvaW50ZXJJZH0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUE9JTlRFUiA9IC0xOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGFjdGl2ZSB2aWV3cyBpbiB0aGUgc3RhY2suIE9uZSBmZXdlciB2aWV3IGlzIGFjdHVhbGx5IHZpc2libGUsIGFzIG9uZSBpcyBoaWRkZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9BQ1RJVkVfVklFV1MgPSA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1BBRERJTkcgPSA0OworCisgICAgLyoqCisgICAgICogVGhlc2UgdmFyaWFibGVzIGFyZSBhbGwgcmVsYXRlZCB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0b3VjaCBpbnRlcmFjdGlvbgorICAgICAqIHdpdGggdGhlIHN0YWNrCisgICAgICovCisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFk7CisgICAgcHJpdmF0ZSBmbG9hdCBtSW5pdGlhbFg7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVBvaW50ZXJJZDsKKyAgICBwcml2YXRlIGludCBtWVZlbG9jaXR5ID0gMDsKKyAgICBwcml2YXRlIGludCBtU3dpcGVHZXN0dXJlVHlwZSA9IEdFU1RVUkVfTk9ORTsKKyAgICBwcml2YXRlIGludCBtU2xpZGVBbW91bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVN3aXBlVGhyZXNob2xkOworICAgIHByaXZhdGUgaW50IG1Ub3VjaFNsb3A7CisgICAgcHJpdmF0ZSBpbnQgbU1heGltdW1WZWxvY2l0eTsKKyAgICBwcml2YXRlIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSG9sb2dyYXBoaWNIZWxwZXIgc0hvbG9ncmFwaGljSGVscGVyOworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1IaWdobGlnaHQ7CisgICAgcHJpdmF0ZSBTdGFja1NsaWRlciBtU3RhY2tTbGlkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GaXJzdExheW91dEhhcHBlbmVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBtQW5jZXN0b3JIZWlnaHQgPSAwOworICAgIHByaXZhdGUgaW50IG1TdGFja01vZGU7CisgICAgcHJpdmF0ZSBpbnQgbUZyYW1lUGFkZGluZzsKKworICAgIHB1YmxpYyBTdGFja1ZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICBpbml0U3RhY2tWaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIFN0YWNrVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXRTdGFja1ZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFN0YWNrVmlldygpIHsKKyAgICAgICAgY29uZmlndXJlVmlld0FuaW1hdG9yKE5VTV9BQ1RJVkVfVklFV1MsIE5VTV9BQ1RJVkVfVklFV1MgLSAyLCBmYWxzZSk7CisgICAgICAgIHNldFN0YXRpY1RyYW5zZm9ybWF0aW9uc0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVRvdWNoU2xvcCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NhbGVkVG91Y2hTbG9wKCk7CisgICAgICAgIG1NYXhpbXVtVmVsb2NpdHkgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZE1heGltdW1GbGluZ1ZlbG9jaXR5KCk7CisgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBJTlZBTElEX1BPSU5URVI7CisKKyAgICAgICAgbUhpZ2hsaWdodCA9IG5ldyBJbWFnZVZpZXcoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbUhpZ2hsaWdodC5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIGFkZFZpZXdJbkxheW91dChtSGlnaGxpZ2h0LCAtMSwgbmV3IExheW91dFBhcmFtcyhtSGlnaGxpZ2h0KSk7CisgICAgICAgIG1TdGFja1NsaWRlciA9IG5ldyBTdGFja1NsaWRlcigpOworCisgICAgICAgIGlmIChzSG9sb2dyYXBoaWNIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgc0hvbG9ncmFwaGljSGVscGVyID0gbmV3IEhvbG9ncmFwaGljSGVscGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBzZXRDbGlwQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICBzZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIHNldHMgdGhlIGZvcm0gb2YgdGhlIFN0YWNrVmlldywgd2hpY2ggaXMgY3VycmVudGx5IHRvIGhhdmUgdGhlIHBlcnNwZWN0aXZlLXNoaWZ0ZWQKKyAgICAgICAgLy8gdmlld3MgYWJvdmUgdGhlIGFjdGl2ZSB2aWV3LCBhbmQgaGF2ZSBpdGVtcyBzbGlkZSBkb3duIHdoZW4gc2xpZGluZyBvdXQuIFRoZSBvcHBvc2l0ZSBpcworICAgICAgICAvLyBhdmFpbGFibGUgYnkgdXNpbmcgSVRFTVNfU0xJREVfVVAuCisgICAgICAgIG1TdGFja01vZGUgPSBJVEVNU19TTElERV9ET1dOOworCisgICAgICAgIC8vIFRoaXMgaXMgYSBmbGFnIHRvIGluZGljYXRlIHRoZSB0aGUgc3RhY2sgaXMgbG9hZGluZyBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgbVdoaWNoQ2hpbGQgPSAtMTsKKworICAgICAgICAvLyBBZGp1c3QgdGhlIGZyYW1lIHBhZGRpbmcgYmFzZWQgb24gdGhlIGRlbnNpdHksIHNpbmNlIHRoZSBoaWdobGlnaHQgY2hhbmdlcyBiYXNlZAorICAgICAgICAvLyBvbiB0aGUgZGVuc2l0eQorICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5OworICAgICAgICBtRnJhbWVQYWRkaW5nID0gKGludCkgTWF0aC5jZWlsKGRlbnNpdHkgKiBGUkFNRV9QQURESU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmltYXRlIHRoZSB2aWV3cyBiZXR3ZWVuIGRpZmZlcmVudCByZWxhdGl2ZSBpbmRleGVzIHdpdGhpbiB0aGUge0BsaW5rIEFkYXB0ZXJWaWV3QW5pbWF0b3J9CisgICAgICovCisgICAgdm9pZCBhbmltYXRlVmlld0ZvclRyYW5zaXRpb24oaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xICYmIHRvSW5kZXggPT0gMCkgeworICAgICAgICAgICAgLy8gRmFkZSBpdGVtIGluCisgICAgICAgICAgICBpZiAodmlldy5nZXRBbHBoYSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICB2aWV3LnNldEFscGhhKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBPYmplY3RBbmltYXRvcjxGbG9hdD4gZmFkZUluID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PihERUZBVUxUX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdmlldywgImFscGhhIiwgdmlldy5nZXRBbHBoYSgpLCAxLjBmKTsKKyAgICAgICAgICAgIGZhZGVJbi5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAxICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMikgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBpbgorICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworCisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaW50IGR1cmF0aW9uID0gTWF0aC5yb3VuZChtU3RhY2tTbGlkZXIuZ2V0RHVyYXRpb25Gb3JOZXV0cmFsUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZUluWSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oIllQcm9ncmVzcyIsIDAuMGYpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNsaWRlSW5YID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbGlkZUluWCwgc2xpZGVJblkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSBtTnVtQWN0aXZlVmlld3MgLSAyICYmIHRvSW5kZXggPT0gbU51bUFjdGl2ZVZpZXdzIC0gMSkgeworICAgICAgICAgICAgLy8gU2xpZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IChMYXlvdXRQYXJhbXMpIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IE1hdGgucm91bmQobVN0YWNrU2xpZGVyLmdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24obVlWZWxvY2l0eSkpOworCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFkgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCAxLjBmKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbGlkZU91dFggPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJYUHJvZ3Jlc3MiLCAwLjBmKTsKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKGR1cmF0aW9uLCBhbmltYXRpb25TbGlkZXIsCisgICAgICAgICAgICAgICAgICAgc2xpZGVPdXRYLCBzbGlkZU91dFkpOworICAgICAgICAgICAgcGEuc2V0SW50ZXJwb2xhdG9yKG5ldyBMaW5lYXJJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA9PSAtMSAmJiB0b0luZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtIDEpIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHZpZXcgdGhhdCBpcyAid2FpdGluZyBpbiB0aGUgd2luZ3MiIGlzIGludmlzaWJsZQorICAgICAgICAgICAgdmlldy5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VmlzaWJpbGl0eShJTlZJU0lCTEUpOworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KC1tU2xpZGVBbW91bnQpOworICAgICAgICB9IGVsc2UgaWYgKHRvSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEZhZGUgaXRlbSBvdXQKKyAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yPEZsb2F0PiBmYWRlT3V0ID0gbmV3IE9iamVjdEFuaW1hdG9yPEZsb2F0PgorICAgICAgICAgICAgICAgICAgICAoREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04sIHZpZXcsICJhbHBoYSIsIHZpZXcuZ2V0QWxwaGEoKSwgMC4wZik7CisgICAgICAgICAgICBmYWRlT3V0LnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbXBsZW1lbnQgdGhlIGZha2VkIHBlcnNwZWN0aXZlCisgICAgICAgIGlmICh0b0luZGV4ICE9IC0xKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1WaWV3QXRJbmRleCh0b0luZGV4LCB2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0cmFuc2Zvcm1WaWV3QXRJbmRleChpbnQgaW5kZXgsIFZpZXcgdmlldykgeworICAgICAgICBmbG9hdCBtYXhQZXJwZWN0aXZlU2hpZnQgPSBtTWVhc3VyZWRIZWlnaHQgKiBQRVJTUEVDVElWRV9TSElGVF9GQUNUT1I7CisKKyAgICAgICAgaWYgKGluZGV4ID09IG1OdW1BY3RpdmVWaWV3cyAtMSkgaW5kZXgtLTsKKworICAgICAgICBmbG9hdCByID0gKGluZGV4ICogMS4wZikgLyAobU51bUFjdGl2ZVZpZXdzIC0gMik7CisKKyAgICAgICAgZmxvYXQgc2NhbGUgPSAxIC0gUEVSU1BFQ1RJVkVfU0NBTEVfRkFDVE9SICogKDEgLSByKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWCIsIHNjYWxlKTsKKyAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+IHNjYWxlWSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInNjYWxlWSIsIHNjYWxlKTsKKworICAgICAgICByID0gKGZsb2F0KSBNYXRoLnBvdyhyLCAyKTsKKworICAgICAgICBpbnQgc3RhY2tEaXJlY3Rpb24gPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgPyAxIDogLTE7CisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVHJhbnNsYXRpb24gPSAtc3RhY2tEaXJlY3Rpb24gKiByICogbWF4UGVycGVjdGl2ZVNoaWZ0OworICAgICAgICBmbG9hdCBzY2FsZVNoaWZ0Q29ycmVjdGlvbiA9IHN0YWNrRGlyZWN0aW9uICogKDEgLSBzY2FsZSkgKgorICAgICAgICAgICAgICAgIChtTWVhc3VyZWRIZWlnaHQgKiAoMSAtIFBFUlNQRUNUSVZFX1NISUZUX0ZBQ1RPUikgLyAyLjBmKTsKKyAgICAgICAgZmxvYXQgdHJhbnNZID0gcGVyc3BlY3RpdmVUcmFuc2xhdGlvbiArIHNjYWxlU2hpZnRDb3JyZWN0aW9uOworCisgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiB0cmFuc2xhdGlvblkgPQorICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4oInRyYW5zbGF0aW9uWSIsIHRyYW5zWSk7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIHBhID0gbmV3IE9iamVjdEFuaW1hdG9yKDEwMCwgdmlldywgc2NhbGVYLCBzY2FsZVksIHRyYW5zbGF0aW9uWSk7CisgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoaWxkVHJhbnNmb3JtcygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtQWN0aXZlVmlld3MgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoaSk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtVmlld0F0SW5kZXgoaSwgdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGcmFtZUxheW91dCBnZXRGcmFtZUZvckNoaWxkKCkgeworICAgICAgICBGcmFtZUxheW91dCBmbCA9IG5ldyBGcmFtZUxheW91dChtQ29udGV4dCk7CisgICAgICAgIGZsLnNldFBhZGRpbmcobUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZywgbUZyYW1lUGFkZGluZyk7CisgICAgICAgIHJldHVybiBmbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBseSBhbnkgbmVjZXNzYXJ5IHRyYW5mb3JtcyBmb3IgdGhlIGNoaWxkIHRoYXQgaXMgYmVpbmcgYWRkZWQuCisgICAgICovCisgICAgdm9pZCBhcHBseVRyYW5zZm9ybUZvckNoaWxkQXRJbmRleChWaWV3IGNoaWxkLCBpbnQgcmVsYXRpdmVJbmRleCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRpc3BhdGNoRHJhdyhjYW52YXMpOworICAgIH0KKworICAgIC8vIFRPRE86IHJpZ2h0IG5vdywgdGhpcyBjb2RlIHdhbGtzIHVwIHRoZSBoaWVyYXJjaHkgYXMgZmFyIGFzIG5lZWRlZCBhbmQgZGlzYWJsZXMgY2xpcHBpbmcKKyAgICAvLyBzbyB0aGF0IHRoZSBzdGFjaydzIGNoaWxkcmVuIGNhbiBkcmF3IG91dHNpZGUgb2YgdGhlIHN0YWNrJ3MgYm91bmRzLiBUaGlzIGlzIGZpbmUgd2l0aGluCisgICAgLy8gdGhlIGNvbnRleHQgb2Ygd2lkZ2V0cyBpbiB0aGUgbGF1bmNoZXIsIGJ1dCBpcyBkZXN0cnVjdGl2ZSBpbiBnZW5lcmFsLCBhcyB0aGUgY2xpcHBpbmcKKyAgICAvLyB2YWx1ZXMgYXJlIG5vdCBiZWluZyByZXNldC4gRm9yIHRoaXMgdG8gYmUgYSBmdWxsIGZyYW1ld29yayBsZXZlbCB3aWRnZXQsIHdlIHdpbGwgbmVlZAorICAgIC8vIGZyYW1ld29yayBsZXZlbCBzdXBwb3J0IGZvciBkcmF3aW5nIG91dHNpZGUgb2YgYSBwYXJlbnQncyBib3VuZHMuCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCkgeworICAgICAgICBpZiAobUFuY2VzdG9yQ29udGFpbmluZ0FsbENoaWxkcmVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIkRpc2FibGluZyBwYXJlbnRhbCBjbGlwcGluZy4iKTsKKyAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IHRoaXM7CisgICAgICAgICAgICB3aGlsZSAodmcuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2Zy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXdHcm91cCkgeworICAgICAgICAgICAgICAgIGlmICh2ZyA9PSBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4pIGJyZWFrOworICAgICAgICAgICAgICAgIHZnID0gKFZpZXdHcm91cCkgdmcuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgdmcuc2V0Q2xpcENoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB2Zy5zZXRDbGlwVG9QYWRkaW5nKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkxheW91dCgpIHsKKyAgICAgICAgaWYgKCFtRmlyc3RMYXlvdXRIYXBwZW5lZCkgeworICAgICAgICAgICAgbVNsaWRlQW1vdW50ID0gTWF0aC5yb3VuZChTTElERV9VUF9SQVRJTyAqIGdldE1lYXN1cmVkSGVpZ2h0KCkpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRUcmFuc2Zvcm1zKCk7CisgICAgICAgICAgICBtU3dpcGVUaHJlc2hvbGQgPSBNYXRoLnJvdW5kKFNXSVBFX1RIUkVTSE9MRF9SQVRJTyAqIG1TbGlkZUFtb3VudCk7CisgICAgICAgICAgICBtRmlyc3RMYXlvdXRIYXBwZW5lZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBzd2l0Y2goYWN0aW9uICYgTW90aW9uRXZlbnQuQUNUSU9OX01BU0spIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVBvaW50ZXJJZCA9PSBJTlZBTElEX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYID0gZXYuZ2V0WCgpOworICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbFkgPSBldi5nZXRZKCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICAgICAgICAgIGlmIChwb2ludGVySW5kZXggPT0gSU5WQUxJRF9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgZm9yIG91ciBwcmltYXJ5IHBvaW50ZXIsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgbG9nIGl0CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2F0IG5ld1kgPSBldi5nZXRZKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKworICAgICAgICAgICAgICAgIGJlZ2luR2VzdHVyZUlmTmVlZGVkKGRlbHRhWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICAgICAgb25TZWNvbmRhcnlQb2ludGVyVXAoZXYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Td2lwZUdlc3R1cmVUeXBlICE9IEdFU1RVUkVfTk9ORTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZmxvYXQgZGVsdGFZKSB7CisgICAgICAgIGlmICgoaW50KSBNYXRoLmFicyhkZWx0YVkpID4gbVRvdWNoU2xvcCAmJiBtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX05PTkUpIHsKKyAgICAgICAgICAgIGludCBzd2lwZUdlc3R1cmVUeXBlID0gZGVsdGFZIDwgMCA/IEdFU1RVUkVfU0xJREVfVVAgOiBHRVNUVVJFX1NMSURFX0RPV047CisgICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKKyAgICAgICAgICAgIHJlcXVlc3REaXNhbGxvd0ludGVyY2VwdFRvdWNoRXZlbnQodHJ1ZSk7CisKKyAgICAgICAgICAgIGludCBhY3RpdmVJbmRleDsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSW5kZXggPSAoc3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1BY3RpdmVWaWV3cyAtIDEgOiBtTnVtQWN0aXZlVmlld3MgLSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikgPworICAgICAgICAgICAgICAgICAgICAgICAgbU51bUFjdGl2ZVZpZXdzIC0gMiA6IG1OdW1BY3RpdmVWaWV3cyAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFdpbmRvd1N0YXJ0VW5ib3VuZGVkICsgYWN0aXZlSW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkJFR0lOTklOR19PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1cnJlbnRXaW5kb3dTdGFydFVuYm91bmRlZCArIGFjdGl2ZUluZGV4ID09IG1BZGFwdGVyLmdldENvdW50KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVJbmRleC0tOworICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRNb2RlKFN0YWNrU2xpZGVyLkVORF9PRl9TVEFDS19NT0RFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldE1vZGUoU3RhY2tTbGlkZXIuTk9STUFMX01PREUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWaWV3IHYgPSBnZXRWaWV3QXRSZWxhdGl2ZUluZGV4KGFjdGl2ZUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRJbWFnZUJpdG1hcChzSG9sb2dyYXBoaWNIZWxwZXIuY3JlYXRlT3V0bGluZSh2KSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uKHYuZ2V0Um90YXRpb24oKSk7CisgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFRyYW5zbGF0aW9uWSh2LmdldFRyYW5zbGF0aW9uWSgpKTsKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgICAgICB2LmJyaW5nVG9Gcm9udCgpOworICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFZpZXcodik7CisKKyAgICAgICAgICAgIGlmIChzd2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTikKKyAgICAgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgcmVnaXN0ZXIgdGhpcyBnZXN0dXJlIGlmIHdlJ3ZlIG1hZGUgaXQgdGhpcyBmYXIgd2l0aG91dCBhIHByb2JsZW0KKyAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gc3dpcGVHZXN0dXJlVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBpZiAocG9pbnRlckluZGV4ID09IElOVkFMSURfUE9JTlRFUikgeworICAgICAgICAgICAgLy8gbm8gZGF0YSBmb3Igb3VyIHByaW1hcnkgcG9pbnRlciwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBsb2cgaXQKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiBObyBkYXRhIGZvciBvdXIgcHJpbWFyeSBwb2ludGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgbmV3WSA9IGV2LmdldFkocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgbmV3WCA9IGV2LmdldFgocG9pbnRlckluZGV4KTsKKyAgICAgICAgZmxvYXQgZGVsdGFZID0gbmV3WSAtIG1Jbml0aWFsWTsKKyAgICAgICAgZmxvYXQgZGVsdGFYID0gbmV3WCAtIG1Jbml0aWFsWDsKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgfQorICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2KTsKKworICAgICAgICBzd2l0Y2ggKGFjdGlvbiAmIE1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSB7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOiB7CisgICAgICAgICAgICAgICAgYmVnaW5HZXN0dXJlSWZOZWVkZWQoZGVsdGFZKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHJ4ID0gZGVsdGFYIC8gKG1TbGlkZUFtb3VudCAqIDEuMGYpOworICAgICAgICAgICAgICAgIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IChkZWx0YVkgLSBtVG91Y2hTbG9wICogMS4wZikgLyBtU2xpZGVBbW91bnQgKiAxLjBmOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSByID0gMSAtIHI7CisgICAgICAgICAgICAgICAgICAgIG1TdGFja1NsaWRlci5zZXRZUHJvZ3Jlc3MoMSAtIHIpOworICAgICAgICAgICAgICAgICAgICBtU3RhY2tTbGlkZXIuc2V0WFByb2dyZXNzKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHIgPSAtKGRlbHRhWSArIG1Ub3VjaFNsb3AgKiAxLjBmKSAvIG1TbGlkZUFtb3VudCAqIDEuMGY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04pIHIgPSAxIC0gcjsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFlQcm9ncmVzcyhyKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YWNrU2xpZGVyLnNldFhQcm9ncmVzcyhyeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9pbnRlclVwKGV2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVA6IHsKKyAgICAgICAgICAgICAgICBvblNlY29uZGFyeVBvaW50ZXJVcChldik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6IHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSOworICAgICAgICAgICAgICAgIG1Td2lwZUdlc3R1cmVUeXBlID0gR0VTVFVSRV9OT05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVjdCB0b3VjaFJlY3QgPSBuZXcgUmVjdCgpOworICAgIHByaXZhdGUgdm9pZCBvblNlY29uZGFyeVBvaW50ZXJVcChNb3Rpb25FdmVudCBldikgeworICAgICAgICBmaW5hbCBpbnQgYWN0aXZlUG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgZmluYWwgaW50IHBvaW50ZXJJZCA9IGV2LmdldFBvaW50ZXJJZChhY3RpdmVQb2ludGVySW5kZXgpOworICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKworICAgICAgICAgICAgaW50IGFjdGl2ZVZpZXdJbmRleCA9IChtU3dpcGVHZXN0dXJlVHlwZSA9PSBHRVNUVVJFX1NMSURFX0RPV04pID8gbU51bUFjdGl2ZVZpZXdzIC0gMQorICAgICAgICAgICAgICAgICAgICA6IG1OdW1BY3RpdmVWaWV3cyAtIDI7CisKKyAgICAgICAgICAgIFZpZXcgdiA9IGdldFZpZXdBdFJlbGF0aXZlSW5kZXgoYWN0aXZlVmlld0luZGV4KTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHJldHVybjsKKworICAgICAgICAgICAgLy8gT3VyIHByaW1hcnkgcG9pbnRlciBoYXMgZ29uZSB1cCAtLSBsZXQncyBzZWUgaWYgd2UgY2FuIGZpbmQKKyAgICAgICAgICAgIC8vIGFub3RoZXIgcG9pbnRlciBvbiB0aGUgdmlldy4gSWYgc28sIHRoZW4gd2Ugc2hvdWxkIHJlcGxhY2UKKyAgICAgICAgICAgIC8vIG91ciBwcmltYXJ5IHBvaW50ZXIgd2l0aCB0aGlzIG5ldyBwb2ludGVyIGFuZCBhZGp1c3QgdGhpbmdzCisgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSB2aWV3IGRvZXNuJ3QganVtcAorICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGV2LmdldFBvaW50ZXJDb3VudCgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IGFjdGl2ZVBvaW50ZXJJbmRleCkgeworCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHggPSBldi5nZXRYKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUmVjdC5zZXQodi5nZXRMZWZ0KCksIHYuZ2V0VG9wKCksIHYuZ2V0UmlnaHQoKSwgdi5nZXRCb3R0b20oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VjaFJlY3QuY29udGFpbnMoTWF0aC5yb3VuZCh4KSwgTWF0aC5yb3VuZCh5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9sZFggPSBldi5nZXRYKGFjdGl2ZVBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvbGRZID0gZXYuZ2V0WShhY3RpdmVQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGp1c3Qgb3VyIGZyYW1lIG9mIHJlZmVyZW5jZSB0byBhdm9pZCBhIGp1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsWSArPSAoeSAtIG9sZFkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRpYWxYICs9ICh4IC0gb2xkWCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rLCB3ZSdyZSBnb29kLCB3ZSBmb3VuZCBhIG5ldyBwb2ludGVyIHdoaWNoIGlzIHRvdWNoaW5nIHRoZSBhY3RpdmUgdmlldworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgaXQgbWVhbnMgd2UgZGlkbid0IGZpbmQgYSBzYXRpc2ZhY3RvcnkgbmV3IHBvaW50ZXIgOigsCisgICAgICAgICAgICAvLyBzbyBlbmQgdGhlIGdlc3R1cmUKKyAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJVcChldik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUG9pbnRlclVwKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGludCBwb2ludGVySW5kZXggPSBldi5maW5kUG9pbnRlckluZGV4KG1BY3RpdmVQb2ludGVySWQpOworICAgICAgICBmbG9hdCBuZXdZID0gZXYuZ2V0WShwb2ludGVySW5kZXgpOworICAgICAgICBpbnQgZGVsdGFZID0gKGludCkgKG5ld1kgLSBtSW5pdGlhbFkpOworCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIuY29tcHV0ZUN1cnJlbnRWZWxvY2l0eSgxMDAwLCBtTWF4aW11bVZlbG9jaXR5KTsKKyAgICAgICAgICAgIG1ZVmVsb2NpdHkgPSAoaW50KSBtVmVsb2NpdHlUcmFja2VyLmdldFlWZWxvY2l0eShtQWN0aXZlUG9pbnRlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVmVsb2NpdHlUcmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIucmVjeWNsZSgpOworICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVsdGFZID4gbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfRE9XTgorICAgICAgICAgICAgICAgICYmIG1TdGFja1NsaWRlci5tTW9kZSA9PSBTdGFja1NsaWRlci5OT1JNQUxfTU9ERSkgeworICAgICAgICAgICAgLy8gU3dpcGUgdGhyZXNob2xkIGV4Y2VlZGVkLCBzd2lwZSBkb3duCisgICAgICAgICAgICBpZiAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9VUCkgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dQcmV2aW91cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhpZ2hsaWdodC5icmluZ1RvRnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWx0YVkgPCAtbVN3aXBlVGhyZXNob2xkICYmIG1Td2lwZUdlc3R1cmVUeXBlID09IEdFU1RVUkVfU0xJREVfVVAKKyAgICAgICAgICAgICAgICAmJiBtU3RhY2tTbGlkZXIubU1vZGUgPT0gU3RhY2tTbGlkZXIuTk9STUFMX01PREUpIHsKKyAgICAgICAgICAgIC8vIFN3aXBlIHRocmVzaG9sZCBleGNlZWRlZCwgc3dpcGUgdXAKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX1VQKSB7CisgICAgICAgICAgICAgICAgc2hvd1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3dOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1IaWdobGlnaHQuYnJpbmdUb0Zyb250KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9VUCApIHsKKyAgICAgICAgICAgIC8vIERpZG4ndCBzd2lwZSB1cCBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgZG93bgorICAgICAgICAgICAgaW50IGR1cmF0aW9uOworICAgICAgICAgICAgZmxvYXQgZmluYWxZUHJvZ3Jlc3MgPSAobVN0YWNrTW9kZSA9PSBJVEVNU19TTElERV9ET1dOKSA/IDEgOiAwOworICAgICAgICAgICAgaWYgKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVAgfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zZXRJbnRlcnBvbGF0b3IobmV3IExpbmVhckludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIHBhLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN3aXBlR2VzdHVyZVR5cGUgPT0gR0VTVFVSRV9TTElERV9ET1dOKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc3dpcGUgZG93biBmYXIgZW5vdWdoLCBzbmFwIGJhY2sgdXAKKyAgICAgICAgICAgIGZsb2F0IGZpbmFsWVByb2dyZXNzID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfRE9XTikgPyAwIDogMTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtU3RhY2tNb2RlID09IElURU1TX1NMSURFX0RPV04gfHwgbVN0YWNrU2xpZGVyLm1Nb2RlICE9IFN0YWNrU2xpZGVyLk5PUk1BTF9NT0RFKSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLnJvdW5kKG1TdGFja1NsaWRlci5nZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdGFja1NsaWRlciBhbmltYXRpb25TbGlkZXIgPSBuZXcgU3RhY2tTbGlkZXIobVN0YWNrU2xpZGVyKTsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PiBzbmFwQmFja1kgPQorICAgICAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXI8RmxvYXQ+KCJZUHJvZ3Jlc3MiLCBmaW5hbFlQcm9ncmVzcyk7CisgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlcjxGbG9hdD4gc25hcEJhY2tYID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyPEZsb2F0PigiWFByb2dyZXNzIiwgMC4wZik7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBwYSA9IG5ldyBPYmplY3RBbmltYXRvcihkdXJhdGlvbiwgYW5pbWF0aW9uU2xpZGVyLAorICAgICAgICAgICAgICAgICAgICBzbmFwQmFja1gsIHNuYXBCYWNrWSk7CisgICAgICAgICAgICBwYS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUjsKKyAgICAgICAgbVN3aXBlR2VzdHVyZVR5cGUgPSBHRVNUVVJFX05PTkU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdGFja1NsaWRlciB7CisgICAgICAgIFZpZXcgbVZpZXc7CisgICAgICAgIGZsb2F0IG1ZUHJvZ3Jlc3M7CisgICAgICAgIGZsb2F0IG1YUHJvZ3Jlc3M7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfTU9ERSA9IDA7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkVHSU5OSU5HX09GX1NUQUNLX01PREUgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9TVEFDS19NT0RFID0gMjsKKworICAgICAgICBpbnQgbU1vZGUgPSBOT1JNQUxfTU9ERTsKKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhY2tTbGlkZXIoU3RhY2tTbGlkZXIgY29weSkgeworICAgICAgICAgICAgbVZpZXcgPSBjb3B5Lm1WaWV3OworICAgICAgICAgICAgbVlQcm9ncmVzcyA9IGNvcHkubVlQcm9ncmVzczsKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSBjb3B5Lm1YUHJvZ3Jlc3M7CisgICAgICAgICAgICBtTW9kZSA9IGNvcHkubU1vZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZsb2F0IGN1YmljKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpIChNYXRoLnBvdygyICogciAtIDEsIDMpICsgMSkgLyAyLjBmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihmbG9hdCByKSB7CisgICAgICAgICAgICBmbG9hdCBwaXZvdCA9IDAuNGY7CisgICAgICAgICAgICBpZiAociA8IHBpdm90KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMociAvIHBpdm90KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAuODVmICogY3ViaWMoMSAtIChyIC0gcGl2b3QpIC8gKDEgLSBwaXZvdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjNmOworICAgICAgICAgICAgaWYgKHIgPiBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAociAtIHBpdm90KSAvICgxIC0gcGl2b3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXQgcm90YXRpb25JbnRlcnBvbGF0b3IoZmxvYXQgcikgeworICAgICAgICAgICAgZmxvYXQgcGl2b3QgPSAwLjJmOworICAgICAgICAgICAgaWYgKHIgPCBwaXZvdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHIgLSBwaXZvdCkgLyAoMSAtIHBpdm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VmlldyhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1WaWV3ID0gdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFlQcm9ncmVzcyhmbG9hdCByKSB7CisgICAgICAgICAgICAvLyBlbmZvcmNlIHIgYmV0d2VlbiAwIGFuZCAxCisgICAgICAgICAgICByID0gTWF0aC5taW4oMS4wZiwgcik7CisgICAgICAgICAgICByID0gTWF0aC5tYXgoMCwgcik7CisKKyAgICAgICAgICAgIG1ZUHJvZ3Jlc3MgPSByOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGhpZ2hsaWdodExwID0gKExheW91dFBhcmFtcykgbUhpZ2hsaWdodC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgaW50IHN0YWNrRGlyZWN0aW9uID0gKG1TdGFja01vZGUgPT0gSVRFTVNfU0xJREVfVVApID8gMSA6IC0xOworCisgICAgICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1JNQUxfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgdmlld0xwLnNldFZlcnRpY2FsT2Zmc2V0KE1hdGgucm91bmQoLXIgKiBzdGFja0RpcmVjdGlvbiAqIG1TbGlkZUFtb3VudCkpOworICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1yICogc3RhY2tEaXJlY3Rpb24gKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB2aWV3QWxwaGFJbnRlcnBvbGF0b3IoMSAtIHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1ha2Ugc3VyZSB0aGF0IHZpZXdzIHdoaWNoIGNhbid0IGJlIHNlZW4gKGhhdmUgMCBhbHBoYSkgYXJlIGFsc28gaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUgd2l0aCBjbGljayBldmVudHMuCisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlldy5nZXRBbHBoYSgpID09IDAgJiYgYWxwaGEgIT0gMCAmJiBtVmlldy5nZXRWaXNpYmlsaXR5KCkgIT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHBoYSA9PSAwICYmIG1WaWV3LmdldEFscGhhKCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtVmlldy5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBtSGlnaGxpZ2h0LnNldFJvdGF0aW9uWChzdGFja0RpcmVjdGlvbiAqIDkwLjBmICogcm90YXRpb25JbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJFR0lOTklOR19PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gciAqIDAuMmY7CisgICAgICAgICAgICAgICAgICAgIHZpZXdMcC5zZXRWZXJ0aWNhbE9mZnNldChNYXRoLnJvdW5kKC1zdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZCgtc3RhY2tEaXJlY3Rpb24gKiByICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgICAgICAgICAgICAgIG1IaWdobGlnaHQuc2V0QWxwaGEoaGlnaGxpZ2h0QWxwaGFJbnRlcnBvbGF0b3IocikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVORF9PRl9TVEFDS19NT0RFOgorICAgICAgICAgICAgICAgICAgICByID0gKDEtcikgKiAwLjJmOworICAgICAgICAgICAgICAgICAgICB2aWV3THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0THAuc2V0VmVydGljYWxPZmZzZXQoTWF0aC5yb3VuZChzdGFja0RpcmVjdGlvbiAqIHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhpZ2hsaWdodC5zZXRBbHBoYShoaWdobGlnaHRBbHBoYUludGVycG9sYXRvcihyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WFByb2dyZXNzKGZsb2F0IHIpIHsKKyAgICAgICAgICAgIC8vIGVuZm9yY2UgciBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgICAgIHIgPSBNYXRoLm1pbigyLjBmLCByKTsKKyAgICAgICAgICAgIHIgPSBNYXRoLm1heCgtMi4wZiwgcik7CisKKyAgICAgICAgICAgIG1YUHJvZ3Jlc3MgPSByOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgdmlld0xwID0gKExheW91dFBhcmFtcykgbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgaGlnaGxpZ2h0THAgPSAoTGF5b3V0UGFyYW1zKSBtSGlnaGxpZ2h0LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICByICo9IDAuMmY7CisgICAgICAgICAgICB2aWV3THAuc2V0SG9yaXpvbnRhbE9mZnNldChNYXRoLnJvdW5kKHIgKiBtU2xpZGVBbW91bnQpKTsKKyAgICAgICAgICAgIGhpZ2hsaWdodExwLnNldEhvcml6b250YWxPZmZzZXQoTWF0aC5yb3VuZChyICogbVNsaWRlQW1vdW50KSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldE1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yTmV1dHJhbFBvc2l0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldER1cmF0aW9uRm9yT2Zmc2NyZWVuUG9zaXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck5ldXRyYWxQb3NpdGlvbihmbG9hdCB2ZWxvY2l0eSkgeworICAgICAgICAgICAgcmV0dXJuIGdldER1cmF0aW9uKGZhbHNlLCB2ZWxvY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBnZXREdXJhdGlvbkZvck9mZnNjcmVlblBvc2l0aW9uKGZsb2F0IHZlbG9jaXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RHVyYXRpb24odHJ1ZSwgdmVsb2NpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBnZXREdXJhdGlvbihib29sZWFuIGludmVydCwgZmxvYXQgdmVsb2NpdHkpIHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIHZpZXdMcCA9IChMYXlvdXRQYXJhbXMpIG1WaWV3LmdldExheW91dFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgZmxvYXQgZCA9IChmbG9hdCkgTWF0aC5zcXJ0KE1hdGgucG93KHZpZXdMcC5ob3Jpem9udGFsT2Zmc2V0LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh2aWV3THAudmVydGljYWxPZmZzZXQsIDIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhkID0gKGZsb2F0KSBNYXRoLnNxcnQoTWF0aC5wb3cobVNsaWRlQW1vdW50LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdygwLjRmICogbVNsaWRlQW1vdW50LCAyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmVsb2NpdHkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGludmVydCA/ICgxIC0gZCAvIG1heGQpIDogZCAvIG1heGQpICogREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT047CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHVyYXRpb24gPSBpbnZlcnQgPyBkIC8gTWF0aC5hYnModmVsb2NpdHkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4ZCAtIGQpIC8gTWF0aC5hYnModmVsb2NpdHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPCBNSU5JTVVNX0FOSU1BVElPTl9EVVJBVElPTiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID4gREVGQVVMVF9BTklNQVRJT05fRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREdXJhdGlvbihpbnZlcnQsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WVByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ZUHJvZ3Jlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WFByb2dyZXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YUHJvZ3Jlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbW90ZUFkYXB0ZXJDb25uZWN0ZWQoKSB7CisgICAgICAgIHN1cGVyLm9uUmVtb3RlQWRhcHRlckNvbm5lY3RlZCgpOworICAgICAgICAvLyBPbiBmaXJzdCBydW4sIHdlIHdhbnQgdG8gc2V0IHRoZSBzdGFjayB0byB0aGUgZW5kLgorICAgICAgICBpZiAobUFkYXB0ZXIgIT0gbnVsbCAmJiBtV2hpY2hDaGlsZCA9PSAtMSkgeworICAgICAgICAgICAgbVdoaWNoQ2hpbGQgPSBtQWRhcHRlci5nZXRDb3VudCgpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBzZXREaXNwbGF5ZWRDaGlsZChtV2hpY2hDaGlsZCk7CisgICAgfQorCisgICAgTGF5b3V0UGFyYW1zIGNyZWF0ZU9yUmV1c2VMYXlvdXRQYXJhbXMoVmlldyB2KSB7CisgICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgY3VycmVudExwID0gdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMcCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY3VycmVudExwOworICAgICAgICAgICAgbHAuc2V0SG9yaXpvbnRhbE9mZnNldCgwKTsKKyAgICAgICAgICAgIGxwLnNldFZlcnRpY2FsT2Zmc2V0KDApOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgbHAud2lkdGggPSAwOworICAgICAgICAgICAgcmV0dXJuIGxwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTGF5b3V0UGFyYW1zKHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBib29sZWFuIGRhdGFDaGFuZ2VkID0gbURhdGFDaGFuZ2VkOworICAgICAgICBpZiAoZGF0YUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZURhdGFDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGNoYW5nZXMsIG1XaGljaENoaWxkIG1pZ2h0IGJlIG91dCBvZiB0aGUgYm91bmRzIG9mIHRoZSBhZGFwdGVyCisgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIHJlc2V0IG1XaGljaENoaWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGlmIChtV2hpY2hDaGlsZCA+PSBtQWRhcHRlci5nZXRDb3VudCgpKQorICAgICAgICAgICAgICAgIG1XaGljaENoaWxkID0gMDsKKworICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQsIHRydWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgaW50IGNoaWxkUmlnaHQgPSBtUGFkZGluZ0xlZnQgKyBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY2hpbGRCb3R0b20gPSBtUGFkZGluZ1RvcCArIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSAoTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKKworICAgICAgICAgICAgY2hpbGQubGF5b3V0KG1QYWRkaW5nTGVmdCArIGxwLmhvcml6b250YWxPZmZzZXQsIG1QYWRkaW5nVG9wICsgbHAudmVydGljYWxPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkUmlnaHQgKyBscC5ob3Jpem9udGFsT2Zmc2V0LCBjaGlsZEJvdHRvbSArIGxwLnZlcnRpY2FsT2Zmc2V0KTsKKworICAgICAgICB9CisKKyAgICAgICAgbURhdGFDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIG9uTGF5b3V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1lYXN1cmVDaGlsZHJlbigpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aCA9IG1NZWFzdXJlZFdpZHRoIC0gbVBhZGRpbmdMZWZ0IC0gbVBhZGRpbmdSaWdodDsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0ID0gTWF0aC5yb3VuZChtTWVhc3VyZWRIZWlnaHQqKDEtUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SKSkKKyAgICAgICAgICAgICAgICAtIG1QYWRkaW5nVG9wIC0gbVBhZGRpbmdCb3R0b207CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGNoaWxkV2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAorICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY2hpbGRIZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodFNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgYm9vbGVhbiBoYXZlQ2hpbGRSZWZTaXplID0gKG1SZWZlcmVuY2VDaGlsZFdpZHRoICE9IC0xICYmIG1SZWZlcmVuY2VDaGlsZEhlaWdodCAhPSAtMSk7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgb3VyIHBhcmVudCBoYXNuJ3QgdG9sZCB1cyBob3cKKyAgICAgICAgLy8gYmlnIHdlIHNob3VsZCBiZS4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZAorICAgICAgICBmbG9hdCBmYWN0b3IgPSAxLygxIC0gUEVSU1BFQ1RJVkVfU0hJRlRfRkFDVE9SKTsKKyAgICAgICAgaWYgKGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPworICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKG1SZWZlcmVuY2VDaGlsZEhlaWdodCAqICgxICsgZmFjdG9yKSkgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ1RvcCArIG1QYWRkaW5nQm90dG9tIDogMDsKKyAgICAgICAgfSBlbHNlIGlmIChoZWlnaHRTcGVjTW9kZSA9PSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICBoZWlnaHRTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbigKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChtUmVmZXJlbmNlQ2hpbGRIZWlnaHQgKiAoMSArIGZhY3RvcikpICsgbVBhZGRpbmdUb3AgKworICAgICAgICAgICAgICAgICAgICBtUGFkZGluZ0JvdHRvbSwgaGVpZ2h0U3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICB3aWR0aFNwZWNTaXplID0gaGF2ZUNoaWxkUmVmU2l6ZSA/IG1SZWZlcmVuY2VDaGlsZFdpZHRoICsgbVBhZGRpbmdMZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgbVBhZGRpbmdSaWdodCA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuQVRfTU9TVCkgeworICAgICAgICAgICAgd2lkdGhTcGVjU2l6ZSA9IGhhdmVDaGlsZFJlZlNpemUgPyBNYXRoLm1pbihtUmVmZXJlbmNlQ2hpbGRXaWR0aCArIG1QYWRkaW5nTGVmdCArCisgICAgICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQsIHdpZHRoU3BlY1NpemUpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoU3BlY1NpemUsIGhlaWdodFNwZWNTaXplKTsKKyAgICAgICAgbWVhc3VyZUNoaWxkcmVuKCk7CisgICAgfQorCisgICAgY2xhc3MgTGF5b3V0UGFyYW1zIGV4dGVuZHMgVmlld0dyb3VwLkxheW91dFBhcmFtcyB7CisgICAgICAgIGludCBob3Jpem9udGFsT2Zmc2V0OworICAgICAgICBpbnQgdmVydGljYWxPZmZzZXQ7CisgICAgICAgIFZpZXcgbVZpZXc7CisKKyAgICAgICAgTGF5b3V0UGFyYW1zKFZpZXcgdmlldykgeworICAgICAgICAgICAgc3VwZXIoMCwgMCk7CisgICAgICAgICAgICB3aWR0aCA9IDA7CisgICAgICAgICAgICBoZWlnaHQgPSAwOworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IDA7CisgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IDA7CisgICAgICAgICAgICBtVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBMYXlvdXRQYXJhbXMoQ29udGV4dCBjLCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMsIGF0dHJzKTsKKyAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQgPSAwOworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwOworICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgaGVpZ2h0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVjdCBwYXJlbnRSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKFZpZXcgdiwgUmVjdCByKSB7CisgICAgICAgICAgICBWaWV3IHAgPSB2OworICAgICAgICAgICAgaWYgKCEodi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIHYuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBWaWV3KSkgcmV0dXJuOworCisgICAgICAgICAgICBWaWV3IGdwID0gKFZpZXcpIHYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0UGFzcyA9IHRydWU7CisgICAgICAgICAgICBwYXJlbnRSZWN0LnNldCgwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGludCBkZXB0aCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZ3AuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBncC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFZpZXcKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmVudFJlY3QuY29udGFpbnMocikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgeworICAgICAgICAgICAgICAgICAgICByLm9mZnNldChwLmdldExlZnQoKSAtIGdwLmdldFNjcm9sbFgoKSwgcC5nZXRUb3AoKSAtIGdwLmdldFNjcm9sbFkoKSk7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAgPSAoVmlldykgcC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncCA9IChWaWV3KSBwLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIHBhcmVudFJlY3Quc2V0KHAuZ2V0TGVmdCgpIC0gZ3AuZ2V0U2Nyb2xsWCgpLCBwLmdldFRvcCgpIC0gZ3AuZ2V0U2Nyb2xsWSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRSaWdodCgpIC0gZ3AuZ2V0U2Nyb2xsWCgpLCBwLmdldEJvdHRvbSgpIC0gZ3AuZ2V0U2Nyb2xsWSgpKTsKKworICAgICAgICAgICAgICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gc3RvcCBlYXJseSBoZXJlIGlmIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuCisgICAgICAgICAgICAgICAgLy8gc28gYXMgdG8gcHJldmVudCB1cyBmcm9tIHdhbGtpbmcgdG9vIGhpZ2ggaW4gdGhlIGhpZXJhcmNoeS4gQSBsb3Qgb2YgdGhpcworICAgICAgICAgICAgICAgIC8vIGNvZGUgbWlnaHQgYmVjb21lIGEgbG90IG1vcmUgc3RyYWlnaHRmb3J3YXJkLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVwdGggPiBtQW5jZXN0b3JIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtQW5jZXN0b3JDb250YWluaW5nQWxsQ2hpbGRyZW4gPSAoVmlld0dyb3VwKSBwOworICAgICAgICAgICAgICAgIG1BbmNlc3RvckhlaWdodCA9IGRlcHRoOworICAgICAgICAgICAgICAgIGRpc2FibGVQYXJlbnRhbENsaXBwaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAuaW52YWxpZGF0ZShyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlY3QgaW52YWxpZGF0ZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBwcml2YXRlIFJlY3RGIGludmFsaWRhdGVSZWN0ZiA9IG5ldyBSZWN0RigpOworICAgICAgICAvLyBUaGlzIGlzIHB1YmxpYyBzbyB0aGF0IE9iamVjdEFuaW1hdG9yIGNhbiBhY2Nlc3MgaXQKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmVydGljYWxPZmZzZXQoaW50IG5ld1ZlcnRpY2FsT2Zmc2V0KSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0RGVsdGEgPSBuZXdWZXJ0aWNhbE9mZnNldCAtIHZlcnRpY2FsT2Zmc2V0OworICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSBuZXdWZXJ0aWNhbE9mZnNldDsKKworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICAgICAgaW50IHRvcCA9IE1hdGgubWluKG1WaWV3LmdldFRvcCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldFRvcCgpKTsKKyAgICAgICAgICAgICAgICBpbnQgYm90dG9tID0gTWF0aC5tYXgobVZpZXcuZ2V0Qm90dG9tKCkgKyBvZmZzZXREZWx0YSwgbVZpZXcuZ2V0Qm90dG9tKCkpOworCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3RmLnNldChtVmlldy5nZXRMZWZ0KCksICB0b3AsIG1WaWV3LmdldFJpZ2h0KCksIGJvdHRvbSk7CisKKyAgICAgICAgICAgICAgICBmbG9hdCB4b2Zmc2V0ID0gLWludmFsaWRhdGVSZWN0Zi5sZWZ0OworICAgICAgICAgICAgICAgIGZsb2F0IHlvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLnRvcDsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KHhvZmZzZXQsIHlvZmZzZXQpOworICAgICAgICAgICAgICAgIG1WaWV3LmdldE1hdHJpeCgpLm1hcFJlY3QoaW52YWxpZGF0ZVJlY3RmKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYub2Zmc2V0KC14b2Zmc2V0LCAteW9mZnNldCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5mbG9vcihpbnZhbGlkYXRlUmVjdGYudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgTWF0aC5jZWlsKGludmFsaWRhdGVSZWN0Zi5ib3R0b20pKTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVHbG9iYWxSZWdpb24obVZpZXcsIGludmFsaWRhdGVSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxPZmZzZXQoaW50IG5ld0hvcml6b250YWxPZmZzZXQpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXREZWx0YSA9IG5ld0hvcml6b250YWxPZmZzZXQgLSBob3Jpem9udGFsT2Zmc2V0OworICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCA9IG5ld0hvcml6b250YWxPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVZpZXcucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgIGludCBsZWZ0ID0gTWF0aC5taW4obVZpZXcuZ2V0TGVmdCgpICsgb2Zmc2V0RGVsdGEsIG1WaWV3LmdldExlZnQoKSk7CisgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gTWF0aC5tYXgobVZpZXcuZ2V0UmlnaHQoKSArIG9mZnNldERlbHRhLCBtVmlldy5nZXRSaWdodCgpKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUmVjdGYuc2V0KGxlZnQsICBtVmlldy5nZXRUb3AoKSwgcmlnaHQsIG1WaWV3LmdldEJvdHRvbSgpKTsKKworICAgICAgICAgICAgICAgIGZsb2F0IHhvZmZzZXQgPSAtaW52YWxpZGF0ZVJlY3RmLmxlZnQ7CisgICAgICAgICAgICAgICAgZmxvYXQgeW9mZnNldCA9IC1pbnZhbGlkYXRlUmVjdGYudG9wOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoeG9mZnNldCwgeW9mZnNldCk7CisgICAgICAgICAgICAgICAgbVZpZXcuZ2V0TWF0cml4KCkubWFwUmVjdChpbnZhbGlkYXRlUmVjdGYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0Zi5vZmZzZXQoLXhvZmZzZXQsIC15b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnNldCgoaW50KSBNYXRoLmZsb29yKGludmFsaWRhdGVSZWN0Zi5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguZmxvb3IoaW52YWxpZGF0ZVJlY3RmLnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmNlaWwoaW52YWxpZGF0ZVJlY3RmLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChpbnZhbGlkYXRlUmVjdGYuYm90dG9tKSk7CisKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKG1WaWV3LCBpbnZhbGlkYXRlUmVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIb2xvZ3JhcGhpY0hlbHBlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUhvbG9ncmFwaGljUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtRXJhc2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKworICAgICAgICBIb2xvZ3JhcGhpY0hlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVQYWludHMoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGluaXRpYWxpemVQYWludHMoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBkZW5zaXR5ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CisKKyAgICAgICAgICAgIG1Ib2xvZ3JhcGhpY1BhaW50LnNldENvbG9yKDB4ZmY2Njk5ZmYpOworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgbUhvbG9ncmFwaGljUGFpbnQuc2V0TWFza0ZpbHRlcihUYWJsZU1hc2tGaWx0ZXIuQ3JlYXRlQ2xpcFRhYmxlKDAsIDMwKSk7CisgICAgICAgICAgICBtRXJhc2VQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5EU1RfT1VUKSk7CisgICAgICAgICAgICBtRXJhc2VQYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgICAgICBtQmx1clBhaW50LnNldE1hc2tGaWx0ZXIobmV3IEJsdXJNYXNrRmlsdGVyKDIqZGVuc2l0eSwgQmx1ck1hc2tGaWx0ZXIuQmx1ci5OT1JNQUwpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJpdG1hcCBjcmVhdGVPdXRsaW5lKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKHYuZ2V0TWVhc3VyZWRXaWR0aCgpID09IDAgfHwgdi5nZXRNZWFzdXJlZEhlaWdodCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAodi5nZXRNZWFzdXJlZFdpZHRoKCksIHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsKKworICAgICAgICAgICAgZmxvYXQgcm90YXRpb25YID0gdi5nZXRSb3RhdGlvblgoKTsKKyAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uID0gdi5nZXRSb3RhdGlvbigpOworICAgICAgICAgICAgZmxvYXQgdHJhbnNsYXRpb25ZID0gdi5nZXRUcmFuc2xhdGlvblkoKTsKKyAgICAgICAgICAgIHYuc2V0Um90YXRpb25YKDApOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvbigwKTsKKyAgICAgICAgICAgIHYuc2V0VHJhbnNsYXRpb25ZKDApOworICAgICAgICAgICAgdi5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB2LnNldFJvdGF0aW9uWChyb3RhdGlvblgpOworICAgICAgICAgICAgdi5zZXRSb3RhdGlvbihyb3RhdGlvbik7CisgICAgICAgICAgICB2LnNldFRyYW5zbGF0aW9uWSh0cmFuc2xhdGlvblkpOworCisgICAgICAgICAgICBkcmF3T3V0bGluZShjYW52YXMsIGJpdG1hcCk7CisgICAgICAgICAgICByZXR1cm4gYml0bWFwOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWF0cml4IGlkID0gbmV3IE1hdHJpeCgpOworICAgICAgICB2b2lkIGRyYXdPdXRsaW5lKENhbnZhcyBkZXN0LCBCaXRtYXAgc3JjKSB7CisgICAgICAgICAgICBpbnRbXSB4eSA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICBCaXRtYXAgbWFzayA9IHNyYy5leHRyYWN0QWxwaGEobUJsdXJQYWludCwgeHkpOworICAgICAgICAgICAgQ2FudmFzIG1hc2tDYW52YXMgPSBuZXcgQ2FudmFzKG1hc2spOworICAgICAgICAgICAgbWFza0NhbnZhcy5kcmF3Qml0bWFwKHNyYywgLXh5WzBdLCAteHlbMV0sIG1FcmFzZVBhaW50KTsKKyAgICAgICAgICAgIGRlc3QuZHJhd0NvbG9yKDAsIFBvcnRlckR1ZmYuTW9kZS5DTEVBUik7CisgICAgICAgICAgICBkZXN0LnNldE1hdHJpeChpZCk7CisgICAgICAgICAgICBkZXN0LmRyYXdCaXRtYXAobWFzaywgeHlbMF0sIHh5WzFdLCBtSG9sb2dyYXBoaWNQYWludCk7CisgICAgICAgICAgICBtYXNrLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TdWdnZXN0aW9uc0FkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjI0NDllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N1Z2dlc3Rpb25zQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VhcmNoTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZWFyY2hhYmxlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIuT3BlblJlc291cmNlSWRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU3RhdGVMaXN0RHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5UZXh0QXBwZWFyYW5jZVNwYW47CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIGNvbnRlbnRzIGZvciB0aGUgc3VnZ2VzdGlvbiBkcm9wLWRvd24gbGlzdC5pbiB7QGxpbmsgU2VhcmNoRGlhbG9nfS4KKyAqCisgKiBAaGlkZQorICovCitjbGFzcyBTdWdnZXN0aW9uc0FkYXB0ZXIgZXh0ZW5kcyBSZXNvdXJjZUN1cnNvckFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdWdnZXN0aW9uc0FkYXB0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBRVUVSWV9MSU1JVCA9IDUwOworCisgICAgcHJpdmF0ZSBTZWFyY2hNYW5hZ2VyIG1TZWFyY2hNYW5hZ2VyOworICAgIHByaXZhdGUgU2VhcmNoVmlldyBtU2VhcmNoVmlldzsKKyAgICBwcml2YXRlIFNlYXJjaGFibGVJbmZvIG1TZWFyY2hhYmxlOworICAgIHByaXZhdGUgQ29udGV4dCBtUHJvdmlkZXJDb250ZXh0OworICAgIHByaXZhdGUgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBtT3V0c2lkZURyYXdhYmxlc0NhY2hlOworICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gbUJhY2tncm91bmRzQ2FjaGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DbG9zZWQgPSBmYWxzZTsKKworICAgIC8vIFVSTCBjb2xvcgorICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbVVybENvbG9yOworCisgICAgLy8gQ2FjaGVkIGNvbHVtbiBpbmRleGVzLCB1cGRhdGVkIHdoZW4gdGhlIGN1cnNvciBjaGFuZ2VzLgorICAgIHByaXZhdGUgaW50IG1UZXh0MUNvbDsKKyAgICBwcml2YXRlIGludCBtVGV4dDJDb2w7CisgICAgcHJpdmF0ZSBpbnQgbVRleHQyVXJsQ29sOworICAgIHByaXZhdGUgaW50IG1JY29uTmFtZTFDb2w7CisgICAgcHJpdmF0ZSBpbnQgbUljb25OYW1lMkNvbDsKKyAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yQ29sOworCisgICAgc3RhdGljIGZpbmFsIGludCBOT05FID0gLTE7CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdGFydFNwaW5uZXJSdW5uYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdG9wU3Bpbm5lclJ1bm5hYmxlOworCisgICAgLyoqCisgICAgICogVGhlIGFtb3VudCBvZiB0aW1lIHdlIGRlbGF5IGluIHRoZSBmaWx0ZXIgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBkZWxldGUga2V5LgorICAgICAqIEBzZWUgRmlsdGVyI3NldERlbGF5ZXIoYW5kcm9pZC53aWRnZXQuRmlsdGVyLkRlbGF5ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMRVRFX0tFWV9QT1NUX0RFTEFZID0gNTAwTDsKKworICAgIHB1YmxpYyBTdWdnZXN0aW9uc0FkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBTZWFyY2hWaWV3IHNlYXJjaFZpZXcsCisgICAgICAgICAgICBTZWFyY2hhYmxlSW5mbyBzZWFyY2hhYmxlLAorICAgICAgICAgICAgV2Vha0hhc2hNYXA8U3RyaW5nLCBEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBvdXRzaWRlRHJhd2FibGVzQ2FjaGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zZWFyY2hfZHJvcGRvd25faXRlbV9pY29uc18ybGluZSwKKyAgICAgICAgICAgICAgICBudWxsLCAgIC8vIG5vIGluaXRpYWwgY3Vyc29yCisgICAgICAgICAgICAgICAgdHJ1ZSk7ICAvLyBhdXRvLXJlcXVlcnkKKyAgICAgICAgbVNlYXJjaE1hbmFnZXIgPSAoU2VhcmNoTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlNFQVJDSF9TRVJWSUNFKTsKKyAgICAgICAgbVNlYXJjaFZpZXcgPSBzZWFyY2hWaWV3OworICAgICAgICBtU2VhcmNoYWJsZSA9IHNlYXJjaGFibGU7CisKKyAgICAgICAgLy8gc2V0IHVwIHByb3ZpZGVyIHJlc291cmNlcyAoZ2l2ZXMgdXMgaWNvbnMsIGV0Yy4pCisgICAgICAgIENvbnRleHQgYWN0aXZpdHlDb250ZXh0ID0gbVNlYXJjaGFibGUuZ2V0QWN0aXZpdHlDb250ZXh0KG1Db250ZXh0KTsKKyAgICAgICAgbVByb3ZpZGVyQ29udGV4dCA9IG1TZWFyY2hhYmxlLmdldFByb3ZpZGVyQ29udGV4dChtQ29udGV4dCwgYWN0aXZpdHlDb250ZXh0KTsKKworICAgICAgICBtT3V0c2lkZURyYXdhYmxlc0NhY2hlID0gb3V0c2lkZURyYXdhYmxlc0NhY2hlOworICAgICAgICBtQmFja2dyb3VuZHNDYWNoZSA9IG5ldyBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPigpOworCisgICAgICAgIG1TdGFydFNwaW5uZXJSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgLy8gbVNlYXJjaFZpZXcuc2V0V29ya2luZyh0cnVlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIG1TdG9wU3Bpbm5lclJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LnNldFdvcmtpbmcoZmFsc2UpOyAvLyBUT0RPOgorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGRlbGF5IDUwMG1zIHdoZW4gZGVsZXRpbmcKKyAgICAgICAgZ2V0RmlsdGVyKCkuc2V0RGVsYXllcihuZXcgRmlsdGVyLkRlbGF5ZXIoKSB7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1QcmV2aW91c0xlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFBvc3RpbmdEZWxheShDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW50ID09IG51bGwpIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgbG9uZyBkZWxheSA9IGNvbnN0cmFpbnQubGVuZ3RoKCkgPCBtUHJldmlvdXNMZW5ndGggPyBERUxFVEVfS0VZX1BPU1RfREVMQVkgOiAwOworICAgICAgICAgICAgICAgIG1QcmV2aW91c0xlbmd0aCA9IGNvbnN0cmFpbnQubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGF5OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZGVuIHRvIGFsd2F5cyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBzaW5jZSB3ZSBjYW5ub3QgYmUgc3VyZSB0aGF0CisgICAgICogc3VnZ2VzdGlvbiBzb3VyY2VzIHJldHVybiBzdGFibGUgSURzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZSB0aGUgc2VhcmNoIHN1Z2dlc3Rpb25zIHByb3ZpZGVyIHRvIG9idGFpbiBhIGxpdmUgY3Vyc29yLiAgVGhpcyB3aWxsIGJlIGNhbGxlZAorICAgICAqIGluIGEgd29ya2VyIHRocmVhZCwgc28gaXQncyBPSyBpZiB0aGUgcXVlcnkgaXMgc2xvdyAoZS5nLiByb3VuZCB0cmlwIGZvciBzdWdnZXN0aW9ucykuCisgICAgICogVGhlIHJlc3VsdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIFVJIHRocmVhZCBhbmQgY2hhbmdlQ3Vyc29yKCkgd2lsbCBiZSBjYWxsZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEN1cnNvciBydW5RdWVyeU9uQmFja2dyb3VuZFRocmVhZChDaGFyU2VxdWVuY2UgY29uc3RyYWludCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAicnVuUXVlcnlPbkJhY2tncm91bmRUaHJlYWQoIiArIGNvbnN0cmFpbnQgKyAiKSIpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSAoY29uc3RyYWludCA9PSBudWxsKSA/ICIiIDogY29uc3RyYWludC50b1N0cmluZygpOworICAgICAgICAvKioKKyAgICAgICAgICogZm9yIGluIGFwcCBzZWFyY2ggd2Ugc2hvdyB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lciB1bnRpbCB0aGUgY3Vyc29yIGlzIHJldHVybmVkIHdpdGgKKyAgICAgICAgICogdGhlIHJlc3VsdHMuCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbnVsbDsKKyAgICAgICAgLy9tU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdGFydFNwaW5uZXJSdW5uYWJsZSk7IC8vIFRPRE86CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXJzb3IgPSBtU2VhcmNoTWFuYWdlci5nZXRTdWdnZXN0aW9ucyhtU2VhcmNoYWJsZSwgcXVlcnksIFFVRVJZX0xJTUlUKTsKKyAgICAgICAgICAgIC8vIHRyaWdnZXIgZmlsbCB3aW5kb3cgc28gdGhlIHNwaW5uZXIgc3RheXMgdXAgdW50aWwgdGhlIHJlc3VsdHMgYXJlIGNvcGllZCBvdmVyIGFuZAorICAgICAgICAgICAgLy8gY2xvc2VyIHRvIGJlaW5nIHJlYWR5CisgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJTZWFyY2ggc3VnZ2VzdGlvbnMgcXVlcnkgdGhyZXcgYW4gZXhjZXB0aW9uLiIsIGUpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGN1cnNvciBpcyBudWxsIG9yIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCBzdG9wIHRoZSBzcGlubmVyIGFuZCByZXR1cm4gbnVsbC4KKyAgICAgICAgLy8gY2hhbmdlQ3Vyc29yIGRvZXNuJ3QgZ2V0IGNhbGxlZCBpZiBjdXJzb3IgaXMgbnVsbAorICAgICAgICAvLyBtU2VhcmNoVmlldy5nZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5wb3N0KG1TdG9wU3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjbG9zZSgpIik7CisgICAgICAgIGNoYW5nZUN1cnNvcihudWxsKTsKKyAgICAgICAgbUNsb3NlZCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YVNldENoYW5nZWQoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJub3RpZnlEYXRhU2V0Q2hhbmdlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworCisgICAgICAgIC8vIG1TZWFyY2hWaWV3Lm9uRGF0YVNldENoYW5nZWQoKTsgLy8gVE9ETzoKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCgpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5vdGlmeURhdGFTZXRJbnZhbGlkYXRlZCIpOworICAgICAgICBzdXBlci5ub3RpZnlEYXRhU2V0SW52YWxpZGF0ZWQoKTsKKworICAgICAgICB1cGRhdGVTcGlubmVyU3RhdGUoZ2V0Q3Vyc29yKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTcGlubmVyU3RhdGUoQ3Vyc29yIGN1cnNvcikgeworICAgICAgICBCdW5kbGUgZXh0cmFzID0gY3Vyc29yICE9IG51bGwgPyBjdXJzb3IuZ2V0RXh0cmFzKCkgOiBudWxsOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAidXBkYXRlU3Bpbm5lclN0YXRlIC0gZXh0cmEgPSAiCisgICAgICAgICAgICAgICAgKyAoZXh0cmFzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gZXh0cmFzLmdldEJvb2xlYW4oU2VhcmNoTWFuYWdlci5DVVJTT1JfRVhUUkFfS0VZX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEN1cnNvciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgaXMgbm90IGNvbXBsZXRlIGFuZCBzaG93IHRoZSBzcGlubmVyCisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGV4dHJhcy5nZXRCb29sZWFuKFNlYXJjaE1hbmFnZXIuQ1VSU09SX0VYVFJBX0tFWV9JTl9QUk9HUkVTUykpIHsKKyAgICAgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0YXJ0U3Bpbm5lclJ1bm5hYmxlKTsgLy8gVE9ETzoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBjdXJzb3IgaXMgbnVsbCBvciBpcyBkb25lLCBzdG9wIHRoZSBzcGlubmVyCisgICAgICAgIC8vIG1TZWFyY2hWaWV3LmdldFdpbmRvdygpLmdldERlY29yVmlldygpLnBvc3QobVN0b3BTcGlubmVyUnVubmFibGUpOyAvLyBUT0RPOgorICAgIH0KKworICAgIC8qKgorICAgICAqIENhY2hlIGNvbHVtbnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbmdlQ3Vyc29yKEN1cnNvciBjKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJjaGFuZ2VDdXJzb3IoIiArIGMgKyAiKSIpOworCisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVHJpZWQgdG8gY2hhbmdlIGN1cnNvciBhZnRlciBhZGFwdGVyIHdhcyBjbG9zZWQuIik7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSBjLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuY2hhbmdlQ3Vyc29yKGMpOworCisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRleHQxQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMSk7CisgICAgICAgICAgICAgICAgbVRleHQyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMik7CisgICAgICAgICAgICAgICAgbVRleHQyVXJsQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX1RFWFRfMl9VUkwpOworICAgICAgICAgICAgICAgIG1JY29uTmFtZTFDb2wgPSBjLmdldENvbHVtbkluZGV4KFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSUNPTl8xKTsKKyAgICAgICAgICAgICAgICBtSWNvbk5hbWUyQ29sID0gYy5nZXRDb2x1bW5JbmRleChTZWFyY2hNYW5hZ2VyLlNVR0dFU1RfQ09MVU1OX0lDT05fMik7CisgICAgICAgICAgICAgICAgbUJhY2tncm91bmRDb2xvckNvbCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjLmdldENvbHVtbkluZGV4KFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fQkFDS0dST1VORF9DT0xPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiZXJyb3IgY2hhbmdpbmcgY3Vyc29yIGFuZCBjYWNoaW5nIGNvbHVtbnMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRhZ3MgdGhlIHZpZXcgd2l0aCBjYWNoZWQgY2hpbGQgdmlldyBsb29rLXVwcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBuZXdWaWV3KENvbnRleHQgY29udGV4dCwgQ3Vyc29yIGN1cnNvciwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBWaWV3IHYgPSBzdXBlci5uZXdWaWV3KGNvbnRleHQsIGN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgdi5zZXRUYWcobmV3IENoaWxkVmlld0NhY2hlKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FjaGUgb2YgdGhlIGNoaWxkIHZpZXdzIG9mIGRyb3AtZHJvd24gbGlzdCBpdGVtcywgdG8gYXZvaWQgbG9va2luZyB1cCB0aGUgY2hpbGRyZW4KKyAgICAgKiBlYWNoIHRpbWUgdGhlIGNvbnRlbnRzIG9mIGEgbGlzdCBpdGVtIGFyZSBjaGFuZ2VkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIENoaWxkVmlld0NhY2hlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MTsKKyAgICAgICAgcHVibGljIGZpbmFsIFRleHRWaWV3IG1UZXh0MjsKKyAgICAgICAgcHVibGljIGZpbmFsIEltYWdlVmlldyBtSWNvbjE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBJbWFnZVZpZXcgbUljb24yOworCisgICAgICAgIHB1YmxpYyBDaGlsZFZpZXdDYWNoZShWaWV3IHYpIHsKKyAgICAgICAgICAgIG1UZXh0MSA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MSk7CisgICAgICAgICAgICBtVGV4dDIgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudGV4dDIpOworICAgICAgICAgICAgbUljb24xID0gKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pY29uMSk7CisgICAgICAgICAgICBtSWNvbjIgPSAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmljb24yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgIENoaWxkVmlld0NhY2hlIHZpZXdzID0gKENoaWxkVmlld0NhY2hlKSB2aWV3LmdldFRhZygpOworCisgICAgICAgIGludCBiYWNrZ3JvdW5kQ29sb3IgPSAwOworICAgICAgICBpZiAobUJhY2tncm91bmRDb2xvckNvbCAhPSAtMSkgeworICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yID0gY3Vyc29yLmdldEludChtQmFja2dyb3VuZENvbG9yQ29sKTsKKyAgICAgICAgfQorICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gZ2V0SXRlbUJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKKyAgICAgICAgdmlldy5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CisKKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dDEgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDFDb2wpOworICAgICAgICAgICAgc2V0Vmlld1RleHQodmlld3MubVRleHQxLCB0ZXh0MSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1UZXh0MiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBURVhUXzJfVVJMCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dDIgPSBnZXRTdHJpbmdPck51bGwoY3Vyc29yLCBtVGV4dDJVcmxDb2wpOworICAgICAgICAgICAgaWYgKHRleHQyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0MiA9IGZvcm1hdFVybCh0ZXh0Mik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQyID0gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgbVRleHQyQ29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSWYgbm8gc2Vjb25kIGxpbmUgb2YgdGV4dCBpcyBpbmRpY2F0ZWQsIGFsbG93IHRoZSBmaXJzdCBsaW5lIG9mIHRleHQKKyAgICAgICAgICAgIC8vIHRvIGJlIHVwIHRvIHR3byBsaW5lcyBpZiBpdCB3YW50cyB0byBiZS4KKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh0ZXh0MikpIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB2aWV3cy5tVGV4dDEuc2V0TWF4TGluZXMoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodmlld3MubVRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlld3MubVRleHQxLnNldFNpbmdsZUxpbmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHZpZXdzLm1UZXh0MS5zZXRNYXhMaW5lcygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRWaWV3VGV4dCh2aWV3cy5tVGV4dDIsIHRleHQyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWV3cy5tSWNvbjEgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vmlld0RyYXdhYmxlKHZpZXdzLm1JY29uMSwgZ2V0SWNvbjEoY3Vyc29yKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXdzLm1JY29uMiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRWaWV3RHJhd2FibGUodmlld3MubUljb24yLCBnZXRJY29uMihjdXJzb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIGZvcm1hdFVybChDaGFyU2VxdWVuY2UgdXJsKSB7CisgICAgICAgIGlmIChtVXJsQ29sb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTGF6aWx5IGdldCB0aGUgVVJMIGNvbG9yIGZyb20gdGhlIGN1cnJlbnQgdGhlbWUuCisgICAgICAgICAgICBUeXBlZFZhbHVlIGNvbG9yVmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICAgICAgbUNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKFIuYXR0ci50ZXh0Q29sb3JTZWFyY2hVcmwsIGNvbG9yVmFsdWUsIHRydWUpOworICAgICAgICAgICAgbVVybENvbG9yID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3JTdGF0ZUxpc3QoY29sb3JWYWx1ZS5yZXNvdXJjZUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIFNwYW5uYWJsZVN0cmluZyB0ZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZyh1cmwpOworICAgICAgICB0ZXh0LnNldFNwYW4obmV3IFRleHRBcHBlYXJhbmNlU3BhbihudWxsLCAwLCAwLCBtVXJsQ29sb3IsIG51bGwpLAorICAgICAgICAgICAgICAgIDAsIHVybC5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGRyYXdhYmxlIHdpdGggbm8gY29sb3Igd2hlbiBzZWxlY3RlZCBvciBwcmVzc2VkLCBhbmQgdGhlIGdpdmVuIGNvbG9yIHdoZW4KKyAgICAgKiBuZWl0aGVyIHNlbGVjdGVkIG5vciBwcmVzc2VkLgorICAgICAqCisgICAgICogQHJldHVybiBBIGRyYXdhYmxlLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGdpdmVuIGNvbG9yIGlzIHRyYW5zcGFyZW50LgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SXRlbUJhY2tncm91bmQoaW50IGJhY2tncm91bmRDb2xvcikgeworICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWRCZyA9IG1CYWNrZ3JvdW5kc0NhY2hlLmdldChiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgaWYgKGNhY2hlZEJnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiQmFja2dyb3VuZCBjYWNoZSBoaXQgZm9yIGNvbG9yICIgKyBiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRCZy5uZXdEcmF3YWJsZShtUHJvdmlkZXJDb250ZXh0LmdldFJlc291cmNlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJDcmVhdGluZyBuZXcgYmFja2dyb3VuZCBmb3IgY29sb3IgIiArIGJhY2tncm91bmRDb2xvcik7CisgICAgICAgICAgICBDb2xvckRyYXdhYmxlIHRyYW5zcGFyZW50ID0gbmV3IENvbG9yRHJhd2FibGUoMCk7CisgICAgICAgICAgICBDb2xvckRyYXdhYmxlIGJhY2tncm91bmQgPSBuZXcgQ29sb3JEcmF3YWJsZShiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgU3RhdGVMaXN0RHJhd2FibGUgbmV3QmcgPSBuZXcgU3RhdGVMaXN0RHJhd2FibGUoKTsKKyAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9zZWxlY3RlZH0sIHRyYW5zcGFyZW50KTsKKyAgICAgICAgICAgIG5ld0JnLmFkZFN0YXRlKG5ldyBpbnRbXXthbmRyb2lkLlIuYXR0ci5zdGF0ZV9wcmVzc2VkfSwgdHJhbnNwYXJlbnQpOworICAgICAgICAgICAgbmV3QmcuYWRkU3RhdGUobmV3IGludFtde30sIGJhY2tncm91bmQpOworICAgICAgICAgICAgbUJhY2tncm91bmRzQ2FjaGUucHV0KGJhY2tncm91bmRDb2xvciwgbmV3QmcuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdCZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3VGV4dChUZXh0VmlldyB2LCBDaGFyU2VxdWVuY2UgdGV4dCkgeworICAgICAgICAvLyBTZXQgdGhlIHRleHQgZXZlbiBpZiBpdCdzIG51bGwsIHNpbmNlIHdlIG5lZWQgdG8gY2xlYXIgYW55IHByZXZpb3VzIHRleHQuCisgICAgICAgIHYuc2V0VGV4dCh0ZXh0KTsKKworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGV4dCkpIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTFDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTFDb2wpOworICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUodmFsdWUpOworICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbjEoY3Vyc29yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb24yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKG1JY29uTmFtZTJDb2wgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKG1JY29uTmFtZTJDb2wpOworICAgICAgICByZXR1cm4gZ2V0RHJhd2FibGVGcm9tUmVzb3VyY2VWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZHJhd2FibGUgaW4gYW4gaW1hZ2UgdmlldywgbWFrZXMgc3VyZSB0aGUgdmlldyBpcyBvbmx5IHZpc2libGUgaWYgdGhlcmUKKyAgICAgKiBpcyBhIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRWaWV3RHJhd2FibGUoSW1hZ2VWaWV3IHYsIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIC8vIFNldCB0aGUgaWNvbiBldmVuIGlmIHRoZSBkcmF3YWJsZSBpcyBudWxsLCBzaW5jZSB3ZSBuZWVkIHRvIGNsZWFyIGFueQorICAgICAgICAvLyBwcmV2aW91cyBpY29uLgorICAgICAgICB2LnNldEltYWdlRHJhd2FibGUoZHJhd2FibGUpOworCisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBnZXQgYW55IGFuaW1hdGVkIGRyYXdhYmxlcyAobGlrZSBhICd3b3JraW5nJyBzcGlubmVyKQorICAgICAgICAgICAgLy8gdG8gYW5pbWF0ZS4gWW91IGhhdmUgdG8gc2V0VmlzaWJsZSB0cnVlIG9uIGFuIEFuaW1hdGlvbkRyYXdhYmxlIHRvIGdldAorICAgICAgICAgICAgLy8gaXQgdG8gc3RhcnQgYW5pbWF0aW5nLCBidXQgaXQgbXVzdCBmaXJzdCBoYXZlIGJlZW4gZmFsc2Ugb3IgZWxzZSB0aGUKKyAgICAgICAgICAgIC8vIGNhbGwgdG8gc2V0VmlzaWJsZSB3aWxsIGJlIGluZWZmZWN0aXZlLiBXZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBzdG9yeQorICAgICAgICAgICAgLy8gYWJvdXQgYW5pbWF0ZWQgZHJhd2FibGVzIGluIHRoZSBmdXR1cmUsIHNlZSBodHRwOi8vYi8xODc4NDMwLgorICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgZHJhd2FibGUuc2V0VmlzaWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0ZXh0IHRvIHNob3cgaW4gdGhlIHF1ZXJ5IGZpZWxkIHdoZW4gYSBzdWdnZXN0aW9uIGlzIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBUaGUgQ3Vyc29yIHRvIHJlYWQgdGhlIHN1Z2dlc3Rpb24gZGF0YSBmcm9tLiBUaGUgQ3Vyc29yIHNob3VsZCBhbHJlYWR5CisgICAgICogICAgICAgIGJlIG1vdmVkIHRvIHRoZSBzdWdnZXN0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZCBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIHRleHQgdG8gc2hvdywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHF1ZXJ5IHNob3VsZCBub3QgYmUKKyAgICAgKiAgICAgICAgIGNoYW5nZWQgd2hlbiBzZWxlY3RpbmcgdGhpcyBzdWdnZXN0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY29udmVydFRvU3RyaW5nKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgaWYgKGN1cnNvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBxdWVyeSA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fUVVFUlkpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TZWFyY2hhYmxlLnNob3VsZFJld3JpdGVRdWVyeUZyb21EYXRhKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkYXRhID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9JTlRFTlRfREFUQSk7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNlYXJjaGFibGUuc2hvdWxkUmV3cml0ZVF1ZXJ5RnJvbVRleHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRleHQxID0gZ2V0Q29sdW1uU3RyaW5nKGN1cnNvciwgU2VhcmNoTWFuYWdlci5TVUdHRVNUX0NPTFVNTl9URVhUXzEpOworICAgICAgICAgICAgaWYgKHRleHQxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIHB1cmVseSB0byBwcm92aWRlIGEgYml0IG9mIHByb3RlY3Rpb24gYWdhaW5zdAorICAgICAqIGZsYWt5IGNvbnRlbnQgcHJvdmlkZXJzLgorICAgICAqCisgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciNnZXRWaWV3KGludCwgVmlldywgVmlld0dyb3VwKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Vmlldyhwb3NpdGlvbiwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIlNlYXJjaCBzdWdnZXN0aW9ucyBjdXJzb3IgdGhyZXcgZXhjZXB0aW9uLiIsIGUpOworICAgICAgICAgICAgLy8gUHV0IGV4Y2VwdGlvbiBzdHJpbmcgaW4gaXRlbSB0aXRsZQorICAgICAgICAgICAgVmlldyB2ID0gbmV3VmlldyhtQ29udGV4dCwgbUN1cnNvciwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDaGlsZFZpZXdDYWNoZSB2aWV3cyA9IChDaGlsZFZpZXdDYWNoZSkgdi5nZXRUYWcoKTsKKyAgICAgICAgICAgICAgICBUZXh0VmlldyB0diA9IHZpZXdzLm1UZXh0MTsKKyAgICAgICAgICAgICAgICB0di5zZXRUZXh0KGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBkcmF3YWJsZSBnaXZlbiBhIHZhbHVlIHByb3ZpZGVkIGJ5IGEgc3VnZ2VzdGlvbiBwcm92aWRlci4KKyAgICAgKgorICAgICAqIFRoaXMgdmFsdWUgY291bGQgYmUganVzdCB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgcmVzb3VyY2UgaWQKKyAgICAgKiAoZS5nLiwgIjIxMzA4Mzc1MjQiKSwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIHRyeSB0byByZXRyaWV2ZSBhIGRyYXdhYmxlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlkZXIncyByZXNvdXJjZXMuIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlciwgaXQgaXMKKyAgICAgKiB0cmVhdGVkIGFzIGEgVXJpIGFuZCBvcGVuZWQgd2l0aAorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjb3Blbk91dHB1dFN0cmVhbShhbmRyb2lkLm5ldC5VcmksIFN0cmluZyl9LgorICAgICAqCisgICAgICogQWxsIHJlc291cmNlcyBhbmQgVVJJcyBhcmUgcmVhZCB1c2luZyB0aGUgc3VnZ2VzdGlvbiBwcm92aWRlcidzIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgYXMgZXhwZWN0ZWQsIG9yIG5vIGRyYXdhYmxlIGNhbiBiZSBmb3VuZCBmb3IKKyAgICAgKiB0aGUgcHJvdmlkZWQgdmFsdWUsIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcmF3YWJsZUlkIGEgc3RyaW5nIGxpa2UgIjIxMzA4Mzc1MjQiLAorICAgICAqICAgICAgICAiYW5kcm9pZC5yZXNvdXJjZTovL2NvbS5hbmRyb2lkLmFsYXJtY2xvY2svMjEzMDgzNzUyNCIsCisgICAgICogICAgICAgIG9yICJjb250ZW50Oi8vY29udGFjdHMvcGhvdG9zLzI1MyIuCisgICAgICogQHJldHVybiBhIERyYXdhYmxlLCBvciBudWxsIGlmIG5vbmUgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlRnJvbVJlc291cmNlVmFsdWUoU3RyaW5nIGRyYXdhYmxlSWQpIHsKKyAgICAgICAgaWYgKGRyYXdhYmxlSWQgPT0gbnVsbCB8fCBkcmF3YWJsZUlkLmxlbmd0aCgpID09IDAgfHwgIjAiLmVxdWFscyhkcmF3YWJsZUlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBzZWUgaWYgaXQncyBqdXN0IGFuIGludGVnZXIKKyAgICAgICAgICAgIGludCByZXNvdXJjZUlkID0gSW50ZWdlci5wYXJzZUludChkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIC8vIEl0J3MgYW4gaW50LCBsb29rIGZvciBpdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgIFN0cmluZyBkcmF3YWJsZVVyaSA9IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRQorICAgICAgICAgICAgICAgICAgICArICI6Ly8iICsgbVByb3ZpZGVyQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIi8iICsgcmVzb3VyY2VJZDsKKyAgICAgICAgICAgIC8vIE11c3QgdXNlIFVSSSBhcyBjYWNoZSBrZXksIHNpbmNlIGludHMgYXJlIGFwcC1zcGVjaWZpYworICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBjaGVja0ljb25DYWNoZShkcmF3YWJsZVVyaSk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdCBjYWNoZWQsIGZpbmQgaXQgYnkgcmVzb3VyY2UgSUQKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShyZXNvdXJjZUlkKTsKKyAgICAgICAgICAgIC8vIFN0aWNrIGl0IGluIHRoZSBjYWNoZSwgdXNpbmcgdGhlIFVSSSBhcyBrZXkKKyAgICAgICAgICAgIHN0b3JlSW5JY29uQ2FjaGUoZHJhd2FibGVVcmksIGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgLy8gSXQncyBub3QgYW4gaW50ZWdlciwgdXNlIGl0IGFzIGEgVVJJCisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGNoZWNrSWNvbkNhY2hlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKGRyYXdhYmxlSWQpOworICAgICAgICAgICAgZHJhd2FibGUgPSBnZXREcmF3YWJsZSh1cmkpOworICAgICAgICAgICAgc3RvcmVJbkljb25DYWNoZShkcmF3YWJsZUlkLCBkcmF3YWJsZSk7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIC8vIEl0IHdhcyBhbiBpbnRlZ2VyLCBidXQgaXQgY291bGRuJ3QgYmUgZm91bmQsIGJhaWwgb3V0CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSWNvbiByZXNvdXJjZSBub3QgZm91bmQ6ICIgKyBkcmF3YWJsZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGRyYXdhYmxlIGJ5IFVSSSwgd2l0aG91dCB1c2luZyB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZHJhd2FibGUgY291bGQgbm90IGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldERyYXdhYmxlKFVyaSB1cmkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gTG9hZCBkcmF3YWJsZXMgdGhyb3VnaCBSZXNvdXJjZXMsIHRvIGdldCB0aGUgc291cmNlIGRlbnNpdHkgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBPcGVuUmVzb3VyY2VJZFJlc3VsdCByID0KKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5nZXRSZXNvdXJjZUlkKHVyaSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuci5nZXREcmF3YWJsZShyLmlkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiUmVzb3VyY2UgZG9lcyBub3QgZXhpc3Q6ICIgKyB1cmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBDb250ZW50UmVzb2x2ZXIgaGFuZGxlIGNvbnRlbnQgYW5kIGZpbGUgVVJJcy4KKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBtUHJvdmlkZXJDb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gb3BlbiAiICsgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgY2xvc2luZyBpY29uIHN0cmVhbSBmb3IgIiArIHVyaSwgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkljb24gbm90IGZvdW5kOiAiICsgdXJpICsgIiwgIiArIGZuZmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBjaGVja0ljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmkpIHsKKyAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChyZXNvdXJjZVVyaSk7CisgICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIkZvdW5kIGljb24gaW4gY2FjaGU6ICIgKyByZXNvdXJjZVVyaSk7CisgICAgICAgIHJldHVybiBjYWNoZWQubmV3RHJhd2FibGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVJbkljb25DYWNoZShTdHJpbmcgcmVzb3VyY2VVcmksIERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLnB1dChyZXNvdXJjZVVyaSwgZHJhd2FibGUuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxlZnQtaGFuZCBzaWRlIGljb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24KKyAgICAgKiBpZiB0aGUgc3VnZ2VzdGlvbiBjb250YWlucyBhbiBpY29uIGNvbHVtbiBidXQgbm8gaWNvbiBvciBhIGJyb2tlbiBpY29uLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBBIGN1cnNvciBwb3NpdGlvbmVkIGF0IHRoZSBjdXJyZW50IHN1Z2dlc3Rpb24uCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIGRyYXdhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb24xKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGNvbXBvbmVudCB0aGF0IHRoZSBzdWdnZXN0aW9uIGlzIG9yaWdpbmFsbHkgZnJvbQorICAgICAgICBTdHJpbmcgYyA9IGdldENvbHVtblN0cmluZyhjdXJzb3IsIFNlYXJjaE1hbmFnZXIuU1VHR0VTVF9DT0xVTU5fSU5URU5UX0NPTVBPTkVOVF9OQU1FKTsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjb21wb25lbnQgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoYyk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGdldEFjdGl2aXR5SWNvbldpdGhDYWNoZShjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJCYWQgY29tcG9uZW50IG5hbWU6ICIgKyBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZW4gY2hlY2sgdGhlIGNvbXBvbmVudCB0aGF0IGdhdmUgdXMgdGhlIHN1Z2dlc3Rpb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUobVNlYXJjaGFibGUuZ2V0U2VhcmNoQWN0aXZpdHkoKSk7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZHJhd2FibGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gYSBkZWZhdWx0IGljb24KKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0RGVmYXVsdEFjdGl2aXR5SWNvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24gZm9yIGFuIGFjdGl2aXR5LgorICAgICAqIFVzZXMgdGhlIGxvY2FsIGljb24gY2FjaGUgZm9yIGZhc3QgcmVwZWF0ZWQgbG9va3Vwcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY3Rpdml0eSBub3IgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICBoYXMgYW4gaWNvbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXRBY3Rpdml0eUljb25XaXRoQ2FjaGUoQ29tcG9uZW50TmFtZSBjb21wb25lbnQpIHsKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGljb24gY2FjaGUKKyAgICAgICAgU3RyaW5nIGNvbXBvbmVudEljb25LZXkgPSBjb21wb25lbnQuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgLy8gVXNpbmcgY29udGFpbnNLZXkoKSBzaW5jZSB3ZSBhbHNvIHN0b3JlIG51bGwgdmFsdWVzLgorICAgICAgICBpZiAobU91dHNpZGVEcmF3YWJsZXNDYWNoZS5jb250YWluc0tleShjb21wb25lbnRJY29uS2V5KSkgeworICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSBjYWNoZWQgPSBtT3V0c2lkZURyYXdhYmxlc0NhY2hlLmdldChjb21wb25lbnRJY29uS2V5KTsKKyAgICAgICAgICAgIHJldHVybiBjYWNoZWQgPT0gbnVsbCA/IG51bGwgOiBjYWNoZWQubmV3RHJhd2FibGUobVByb3ZpZGVyQ29udGV4dC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlbiB0cnkgdGhlIGFjdGl2aXR5IG9yIGFwcGxpY2F0aW9uIGljb24KKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBnZXRBY3Rpdml0eUljb24oY29tcG9uZW50KTsKKyAgICAgICAgLy8gU3RpY2sgaXQgaW4gdGhlIGNhY2hlIHNvIHdlIGRvbid0IGRvIHRoaXMgbG9va3VwIGFnYWluLgorICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHRvQ2FjaGUgPSBkcmF3YWJsZSA9PSBudWxsID8gbnVsbCA6IGRyYXdhYmxlLmdldENvbnN0YW50U3RhdGUoKTsKKyAgICAgICAgbU91dHNpZGVEcmF3YWJsZXNDYWNoZS5wdXQoY29tcG9uZW50SWNvbktleSwgdG9DYWNoZSk7CisgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhY3Rpdml0eSBvciBhcHBsaWNhdGlvbiBpY29uIGZvciBhbiBhY3Rpdml0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgTmFtZSBvZiBhbiBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIEEgZHJhd2FibGUsIG9yIHtAY29kZSBudWxsfSBpZiBuZWl0aGVyIHRoZSBhY2l0aXZ5IG9yIHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgaGF2ZSBhbiBpY29uIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIERyYXdhYmxlIGdldEFjdGl2aXR5SWNvbihDb21wb25lbnROYW1lIGNvbXBvbmVudCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEFjdGl2aXR5SW5mbyBhY3Rpdml0eUluZm87CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3Rpdml0eUluZm8gPSBwbS5nZXRBY3Rpdml0eUluZm8oY29tcG9uZW50LCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBpY29uSWQgPSBhY3Rpdml0eUluZm8uZ2V0SWNvblJlc291cmNlKCk7CisgICAgICAgIGlmIChpY29uSWQgPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBwa2cgPSBjb21wb25lbnQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBwbS5nZXREcmF3YWJsZShwa2csIGljb25JZCwgYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgIGlmIChkcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiSW52YWxpZCBpY29uIHJlc291cmNlICIgKyBpY29uSWQgKyAiIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgY29tcG9uZW50LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRyYXdhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3RyaW5nIGNvbHVtbiBieSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnNvciBDdXJzb3IgdG8gcmVhZCB0aGUgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gY29sdW1uTmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHJlYWQuCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiwgb3IgPGNvZGU+bnVsbDwvbnVsbD4KKyAgICAgKiAgICAgICAgIGlmIHRoZSBjdXJzb3IgZG9lcyBub3QgY29udGFpbiB0aGUgZ2l2ZW4gY29sdW1uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbHVtblN0cmluZyhDdXJzb3IgY3Vyc29yLCBTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICBpbnQgY29sID0gY3Vyc29yLmdldENvbHVtbkluZGV4KGNvbHVtbk5hbWUpOworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nT3JOdWxsKGN1cnNvciwgY29sKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nT3JOdWxsKEN1cnNvciBjdXJzb3IsIGludCBjb2wpIHsKKyAgICAgICAgaWYgKGNvbCA9PSBOT05FKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRTdHJpbmcoY29sKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVycm9yIHJldHJpZXZpbmcgdmFsaWQgY29sdW1uIGZyb20gY3Vyc29yLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlkIHRoZSByZW1vdGUgcHJvY2VzcyBkaWU/IiwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggMjE5YmRmOS4uMmZiMmQ2ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTIxLDggKzIxLDkgQEAKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGE7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKQEAgLTM2LDYgKzM3LDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuRXh0cmFjdEVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNDQsNyArNDYsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnRleHQuQm9yaW5nTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5DbGlwYm9hcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5EeW5hbWljTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuR2V0Q2hhcnM7CkBAIC04NSwxMCArODYsMTMgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRmxvYXRNYXRoOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwogaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CkBAIC0xOTIsOCArMTk2LDkgQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dFZpZXciOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VYVFJBQ1QgPSBmYWxzZTsKICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgUFJJT1JJVFkgPSAxMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZID0gMTAwOwogCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRBbHBoYSA9IDI1NTsgICAgCiAgICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtVGV4dENvbG9yOwogICAgIHByaXZhdGUgaW50IG1DdXJUZXh0Q29sb3I7CiAgICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtSGludFRleHRDb2xvcjsKQEAgLTI3OTcsNiArMjgwMiwxNCBAQAogICAgICAgICAgICAgYy5kcmF3VGV4dChtQ2hhcnMsIHN0YXJ0ICsgbVN0YXJ0LCBlbmQgLSBzdGFydCwgeCwgeSwgcCk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDYW52YXMgYywgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgICAgIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBjLmRyYXdUZXh0UnVuKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGNvdW50LCBjb250ZXh0U3RhcnQgKyBtU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDb3VudCwgeCwgeSwgZmxhZ3MsIHApOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIGZsb2F0IG1lYXN1cmVUZXh0KGludCBzdGFydCwgaW50IGVuZCwgUGFpbnQgcCkgewogICAgICAgICAgICAgcmV0dXJuIHAubWVhc3VyZVRleHQobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQpOwogICAgICAgICB9CkBAIC0yODA0LDYgKzI4MTcsMjMgQEAKICAgICAgICAgcHVibGljIGludCBnZXRUZXh0V2lkdGhzKGludCBzdGFydCwgaW50IGVuZCwgZmxvYXRbXSB3aWR0aHMsIFBhaW50IHApIHsKICAgICAgICAgICAgIHJldHVybiBwLmdldFRleHRXaWR0aHMobUNoYXJzLCBzdGFydCArIG1TdGFydCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CiAgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLCBmbG9hdFtdIGFkdmFuY2VzLCBpbnQgYWR2YW5jZXNJbmRleCwKKyAgICAgICAgICAgICAgICBQYWludCBwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFJ1bkFkdmFuY2VzKG1DaGFycywgc3RhcnQgKyBtU3RhcnQsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQgKyBtU3RhcnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsIGFkdmFuY2VzLAorICAgICAgICAgICAgICAgICAgICBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFJ1bkN1cnNvcihpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dEVuZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQsIFBhaW50IHApIHsKKyAgICAgICAgICAgIGludCBjb250ZXh0Q291bnQgPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICAgICAgcmV0dXJuIHAuZ2V0VGV4dFJ1bkN1cnNvcihtQ2hhcnMsIGNvbnRleHRTdGFydCArIG1TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dENvdW50LCBmbGFncywgb2Zmc2V0ICsgbVN0YXJ0LCBjdXJzb3JPcHQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzE2LDcgKzM3NDYsNyBAQAogICAgICAgICAvLyAgIGFsbG93IHRvIHRlc3QgZm9yIGhhc1NlbGVjdGlvbiBpbiBvbkZvY3VzQ2hhbmdlZCwgd2hpY2ggd291bGQgdHJpZ2dlciBhCiAgICAgICAgIC8vICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSBoZXJlLiBUT0RPCiAgICAgICAgIGlmIChzZWxlY3Rpb25Db250cm9sbGVyICE9IG51bGwgJiYgaGFzU2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKTsKKyAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICB9CiAKICAgICAgICAgbVByZURyYXdTdGF0ZSA9IFBSRURSQVdfRE9ORTsKQEAgLTM4MzgsNiArMzg2OCwyMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIG9uU2V0QWxwaGEoaW50IGFscGhhKSB7CisgICAgICAgIGlmIChtTW92ZW1lbnQgPT0gbnVsbCAmJiBnZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IGFscGhhOworICAgICAgICAgICAgZmluYWwgRHJhd2FibGVzIGRyID0gbURyYXdhYmxlczsKKyAgICAgICAgICAgIGlmIChkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZUxlZnQgIT0gbnVsbCkgZHIubURyYXdhYmxlTGVmdC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZVRvcCAhPSBudWxsKSBkci5tRHJhd2FibGVUb3Auc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgICAgIGlmIChkci5tRHJhd2FibGVSaWdodCAhPSBudWxsKSBkci5tRHJhd2FibGVSaWdodC5zZXRBbHBoYShhbHBoYSk7CisgICAgICAgICAgICAgICAgaWYgKGRyLm1EcmF3YWJsZUJvdHRvbSAhPSBudWxsKSBkci5tRHJhd2FibGVCb3R0b20uc2V0QWxwaGEoYWxwaGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CiAgICAgICAgIHJlc3RhcnRNYXJxdWVlSWZOZWVkZWQoKTsKIApAQCAtMzkzNCw2ICszOTgwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1UZXh0UGFpbnQuc2V0Q29sb3IoY29sb3IpOworICAgICAgICBtVGV4dFBhaW50LnNldEFscGhhKG1DdXJyZW50QWxwaGEpOwogICAgICAgICBtVGV4dFBhaW50LmRyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7CiAKICAgICAgICAgY2FudmFzLnNhdmUoKTsKQEAgLTQzMTcsOCArNDM2NCw4IEBACiAKICAgICAgICAgICAgICAgICAvLyBIYXMgdG8gYmUgZG9uZSBvbiBrZXkgZG93biAoYW5kIG5vdCBvbiBrZXkgdXApIHRvIGNvcnJlY3RseSBiZSBpbnRlcmNlcHRlZC4KICAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9CQUNLOgotICAgICAgICAgICAgICAgIGlmIChtSXNJblRleHRTZWxlY3Rpb25Nb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00ODE0LDcgKzQ4NjEsNyBAQAogICAgICAgICAgICAgICAgIG1ha2VCbGluaygpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGNoZWNrRm9yUmVzaXplKCk7CiAgICAgfQogICAgIApAQCAtNDkwNSw2ICs0OTUyLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LlJJR0hUOgorICAgICAgICAgICAgICAgIC8vIE5vdGUsIExheW91dCByZXNvbHZlcyBBTElHTl9PUFBPU0lURSB0byBsZWZ0IG9yCisgICAgICAgICAgICAgICAgLy8gcmlnaHQgYmFzZWQgb24gdGhlIHBhcmFncmFwaCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgYWxpZ25tZW50ID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTA2OSw2ICs1MTE4LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29tcHJlc3NUZXh0KGZsb2F0IHdpZHRoKSB7CisgICAgICAgIGlmIChpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAKICAgICAgICAgLy8gT25seSBjb21wcmVzcyB0aGUgdGV4dCBpZiBpdCBoYXNuJ3QgYmVlbiBjb21wcmVzc2VkIGJ5IHRoZSBwcmV2aW91cyBwYXNzCiAgICAgICAgIGlmICh3aWR0aCA+IDAuMGYgJiYgbUxheW91dCAhPSBudWxsICYmIGdldExpbmVDb3VudCgpID09IDEgJiYgIW1Vc2VyU2V0VGV4dFNjYWxlWCAmJgogICAgICAgICAgICAgICAgIG1UZXh0UGFpbnQuZ2V0VGV4dFNjYWxlWCgpID09IDEuMGYpIHsKQEAgLTU3MjksMTEgKzU3ODAsMTUgQEAKICAgICAgICAgZmluYWwgaW50IGxlZnRDaGFyID0gbUxheW91dC5nZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIGhzKTsKICAgICAgICAgZmluYWwgaW50IHJpZ2h0Q2hhciA9IG1MYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lLCBoc3BhY2UraHMpOwogICAgICAgICAKKyAgICAgICAgLy8gbGluZSBtaWdodCBjb250YWluIGJpZGlyZWN0aW9uYWwgdGV4dAorICAgICAgICBmaW5hbCBpbnQgbG93Q2hhciA9IGxlZnRDaGFyIDwgcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisgICAgICAgIGZpbmFsIGludCBoaWdoQ2hhciA9IGxlZnRDaGFyID4gcmlnaHRDaGFyID8gbGVmdENoYXIgOiByaWdodENoYXI7CisKICAgICAgICAgaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGlmIChuZXdTdGFydCA8IGxlZnRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IGxlZnRDaGFyOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gcmlnaHRDaGFyKSB7Ci0gICAgICAgICAgICBuZXdTdGFydCA9IHJpZ2h0Q2hhcjsKKyAgICAgICAgaWYgKG5ld1N0YXJ0IDwgbG93Q2hhcikgeworICAgICAgICAgICAgbmV3U3RhcnQgPSBsb3dDaGFyOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXJ0ID4gaGlnaENoYXIpIHsKKyAgICAgICAgICAgIG5ld1N0YXJ0ID0gaGlnaENoYXI7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGlmIChuZXdTdGFydCAhPSBzdGFydCkgewpAQCAtNjU2MCwxMSArNjYxNSwxNCBAQAogCiAgICAgICAgICAgICBoaWRlSW5zZXJ0aW9uUG9pbnRDdXJzb3JDb250cm9sbGVyKCk7CiAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEV4dHJhY3RFZGl0VGV4dCkgewotICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlIHdvdWxkIHJlbW92ZSBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGVybWluYXRlVGV4dFNlbGVjdGlvbk1vZGUgcmVtb3ZlcyBzZWxlY3Rpb24sIHdoaWNoIHdlIHdhbnQgdG8ga2VlcCB3aGVuCiAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdEVkaXRUZXh0IGdvZXMgb3V0IG9mIGZvY3VzLgotICAgICAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2VsU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsU3RhcnQsIHNlbEVuZCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgdGVybWluYXRlU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY2NDMsNyArNjcwMSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG91dHNpZGUgc3RvcHMgc2VsZWN0aW9uIG1vZGUsIGlmIGFueQotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAKICAgICAgICAgICAgICAgICBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwpAQCAtNjY1NCwxMyArNjcxMiwxMyBAQAogCiAgICAgY2xhc3MgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBSZXN1bHRSZWNlaXZlciB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QcmV2U3RhcnQsIG1QcmV2RW5kOwotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgQ29tbWl0U2VsZWN0aW9uUmVjZWl2ZXIoaW50IHByZXZTdGFydCwgaW50IHByZXZFbmQpIHsKICAgICAgICAgICAgIHN1cGVyKGdldEhhbmRsZXIoKSk7CiAgICAgICAgICAgICBtUHJldlN0YXJ0ID0gcHJldlN0YXJ0OwogICAgICAgICAgICAgbVByZXZFbmQgPSBwcmV2RW5kOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVSZXN1bHQoaW50IHJlc3VsdENvZGUsIEJ1bmRsZSByZXN1bHREYXRhKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIHRhcCB3YXMgYWN0dWFsbHkgdXNlZCB0byBzaG93IHRoZSBJTU0sIGxlYXZlIGN1cnNvciBvciBzZWxlY3Rpb24gdW5jaGFuZ2VkCkBAIC02NjcyLDE0ICs2NzMwLDE0IEBACiAgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKW1UZXh0LCBzdGFydCwgZW5kKTsKIAogICAgICAgICAgICAgICAgIGlmIChoYXNTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUluc2VydGlvblBvaW50Q3Vyc29yQ29udHJvbGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIuc2hvdygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uTWFza2VkKCk7CkBAIC02NzE2LDcgKzY3NzQsNyBAQAogICAgICAgICAgICAgLy8gU2F2ZSBwcmV2aW91cyBzZWxlY3Rpb24sIGluIGNhc2UgdGhpcyBldmVudCBpcyB1c2VkIHRvIHNob3cgdGhlIElNRS4KICAgICAgICAgICAgIGludCBvbGRTZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CiAgICAgICAgICAgICBpbnQgb2xkU2VsRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1Nb3ZlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlZCB8PSBtTW92ZW1lbnQub25Ub3VjaEV2ZW50KHRoaXMsIChTcGFubmFibGUpIG1UZXh0LCBldmVudCk7CiAgICAgICAgICAgICB9CkBAIC02NzY0LDcgKzY4MjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gU3RvcCBzZWxlY3Rpb24gbW9kZSBpZiB0aGUgY29udHJvbGxlciBiZWNvbWVzIHVuYXZhaWxhYmxlLgotICAgICAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgbVNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CkBAIC02OTA0LDggKzY5NjIsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIHsKLSAgICAgICAgaWYgKG1MYXlvdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtTGF5b3V0LmdldFdpZHRoKCk7CisgICAgICAgIGlmIChtTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2luZ2xlTGluZSAmJiAobUdyYXZpdHkgJiBHcmF2aXR5LkhPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSBHcmF2aXR5LkxFRlQgPworICAgICAgICAgICAgICAgICAgICAoaW50KSBtTGF5b3V0LmdldExpbmVXaWR0aCgwKSA6IG1MYXlvdXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlSG9yaXpvbnRhbFNjcm9sbFJhbmdlKCk7CiAgICAgfQpAQCAtNzA1Miw3ICs3MTEyLDcgQEAKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25TdGFydCgpID49IDAgJiYKICAgICAgICAgICAgICAgICBnZXRTZWxlY3Rpb25FbmQoKSA+PSAwICYmCiAgICAgICAgICAgICAgICAgKChDbGlwYm9hcmRNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpKS4KLSAgICAgICAgICAgICAgICBoYXNUZXh0KCkpOworICAgICAgICAgICAgICAgIGhhc1ByaW1hcnlDbGlwKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzE0NCw3ICs3MjA0LDcgQEAKICAgICAgICAgLy8gVHdvIGludHMgcGFja2VkIGluIGEgbG9uZwogICAgICAgICByZXR1cm4gKCgobG9uZykgc3RhcnQpIDw8IDMyKSB8IGVuZDsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgc2VsZWN0Q3VycmVudFdvcmQoKSB7CiAgICAgICAgIC8vIEluIGNhc2Ugc2VsZWN0aW9uIG1vZGUgaXMgc3RhcnRlZCBhZnRlciBhbiBvcmllbnRhdGlvbiBjaGFuZ2Ugb3IgYWZ0ZXIgYSBzZWxlY3QgYWxsLAogICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgb25lCkBAIC03MjE5LDIyICs3Mjc5LDcgQEAKIAogICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29yZEZvckRpY3Rpb25hcnkoKSB7Ci0gICAgICAgIGlmIChtTGFzdFRvdWNoT2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KIAotICAgICAgICBsb25nIHdvcmRMaW1pdHMgPSBnZXRXb3JkTGltaXRzQXQobUxhc3RUb3VjaE9mZnNldCk7Ci0gICAgICAgIGlmICh3b3JkTGltaXRzID49IDApIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IChpbnQpICh3b3JkTGltaXRzID4+PiAzMik7Ci0gICAgICAgICAgICBpbnQgZW5kID0gKGludCkgKHdvcmRMaW1pdHMgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICAgICAgICAgIHJldHVybiBtVHJhbnNmb3JtZWQuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmICghaXNTaG93bigpKSB7CkBAIC03Mjc2LDk4ICs3MzIxLDM0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSk7CiAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKIAotICAgICAgICBpZiAobUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY2FuQ3V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DVVQsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmN1dCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICBNZW51SGFuZGxlciBoYW5kbGVyID0gbmV3IE1lbnVIYW5kbGVyKCk7CisKKyAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgeworICAgICAgICAgICAgaW50IHNlbFN0YXJ0ID0gZ2V0U2VsZWN0aW9uU3RhcnQoKTsKKyAgICAgICAgICAgIGludCBzZWxFbmQgPSBnZXRTZWxlY3Rpb25FbmQoKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOworICAgICAgICAgICAgaW50IG1heCA9IE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpOworCisgICAgICAgICAgICBVUkxTcGFuW10gdXJscyA9ICgoU3Bhbm5lZCkgbVRleHQpLmdldFNwYW5zKG1pbiwgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWV9VUkwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7CisKICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYW5Db3B5KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb3B5KS4KLSAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdjJyk7Ci0gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1BBU1RFLCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wYXN0ZSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAoIWlzRm9jdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkgJiYgbUlucHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkNvcHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVudUhhbmRsZXIgaGFuZGxlciA9IG5ldyBNZW51SGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuZWRpdFRleHRNZW51VGl0bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9yZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE1lbnVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgTWVudUhhbmRsZXIoKTsKLQotICAgICAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NUQVJUX1NFTEVDVElOR19URVhULCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5zZWxlY3RUZXh0KS4KLSAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgewotICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKS4KLSAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgnYScpOwotICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1UZXh0IGluc3RhbmNlb2YgU3Bhbm5lZCkgewotICAgICAgICAgICAgICAgIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOwotCi0gICAgICAgICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHNlbFN0YXJ0LCBzZWxFbmQpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBNYXRoLm1heChzZWxTdGFydCwgc2VsRW5kKTsKLQotICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9DT1BZX1VSTCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weVVybCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFBhc3RlIGxvY2F0aW9uIGlzIHRvbyBpbXByZWNpc2UuIE9ubHkgYWxsb3cgb24gZW1wdHkgdGV4dCBmaWVsZHMuCi0gICAgICAgICAgICBpZiAoY2FuUGFzdGUoKSAmJiB0ZXh0SXNPbmx5U3BhY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgotICAgICAgICAgICAgICAgICAgICAgc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoaGFuZGxlcikuCi0gICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ3YnKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0lucHV0TWV0aG9kVGFyZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9TV0lUQ0hfSU5QVVRfTUVUSE9ELCAwLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5pbnB1dE1ldGhvZCkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gZ2V0V29yZEZvckRpY3Rpb25hcnkoKTsKLSAgICAgICAgICAgIGlmICh3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZW51LmFkZCgxLCBJRF9BRERfVE9fRElDVElPTkFSWSwgMCwKLSAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRkVG9EaWN0aW9uYXJ5LCB3b3JkKSkuCi0gICAgICAgICAgICAgICAgICAgICBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVGhlIGNvbnRleHQgbWVudSBpcyBub3QgZW1wdHksIHdoaWNoIHdpbGwgcHJldmVudCB0aGUgc2VsZWN0aW9uIG1vZGUgZnJvbSBzdGFydGluZy4KKyAgICAgICAgLy8gQWRkIGEgZW50cnkgdG8gc3RhcnQgaXQgaW4gdGhlIGNvbnRleHQgbWVudS4KKyAgICAgICAgLy8gVE9ETyBEb2VzIG5vdCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzdWJjbGFzcyBkb2VzIG5vdCBjYWxsIHN1cGVyLnRoaXNNZXRob2Qgb3IKKyAgICAgICAgLy8gcG9wdWxhdGVzIHRoZSBtZW51IEFGVEVSIHRoaXMgY2FsbC4KKyAgICAgICAgaWYgKG1lbnUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfU0VMRUNUSU9OX01PREUsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdFRleHRNb2RlKS4KKyAgICAgICAgICAgIHNldE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKGhhbmRsZXIpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFkZGVkKSB7CkBAIC03Mzc1LDE2ICs3MzU2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXh0SXNPbmx5U3BhY2VzKCkgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbVRyYW5zZm9ybWVkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IHZpZXcgaXMgYSBjdXJyZW50IGlucHV0IG1ldGhvZCB0YXJnZXQuICBUaGUKICAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgY2hlY2tzIHdpdGgge0BsaW5rIElucHV0TWV0aG9kTWFuYWdlcn0uCkBAIC03Mzk0LDE1ICs3MzY1LDE0IEBACiAgICAgICAgIHJldHVybiBpbW0gIT0gbnVsbCAmJiBpbW0uaXNBY3RpdmUodGhpcyk7CiAgICAgfQogICAgIAotICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCisgICAgLy8gU2VsZWN0aW9uIGNvbnRleHQgbW9kZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1RfQUxMID0gYW5kcm9pZC5SLmlkLnNlbGVjdEFsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQgPSBhbmRyb2lkLlIuaWQuc3RhcnRTZWxlY3RpbmdUZXh0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DVVQgPSBhbmRyb2lkLlIuaWQuY3V0OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gYW5kcm9pZC5SLmlkLmNvcHk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1BBU1RFID0gYW5kcm9pZC5SLmlkLnBhc3RlOworICAgIC8vIENvbnRleHQgbWVudSBlbnRyaWVzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0NPUFlfVVJMID0gYW5kcm9pZC5SLmlkLmNvcHlVcmw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX1NXSVRDSF9JTlBVVF9NRVRIT0QgPSBhbmRyb2lkLlIuaWQuc3dpdGNoSW5wdXRNZXRob2Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElEX0FERF9UT19ESUNUSU9OQVJZID0gYW5kcm9pZC5SLmlkLmFkZFRvRGljdGlvbmFyeTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUSU9OX01PREUgPSBhbmRyb2lkLlIuaWQuc2VsZWN0VGV4dE1vZGU7CiAKICAgICBwcml2YXRlIGNsYXNzIE1lbnVIYW5kbGVyIGltcGxlbWVudHMgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgewogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soTWVudUl0ZW0gaXRlbSkgewpAQCAtNzQxMiwxMSArNzM4Miw3IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRleHQgbWVudSBvcHRpb24gZm9yIHRoZSB0ZXh0IHZpZXcgaXMgc2VsZWN0ZWQuICBDdXJyZW50bHkKLSAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mOiB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdEFsbH0sCi0gICAgICoge0BsaW5rIGFuZHJvaWQuUi5pZCNzdGFydFNlbGVjdGluZ1RleHR9LAotICAgICAqIHtAbGluayBhbmRyb2lkLlIuaWQjY3V0fSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5fSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmlkI3Bhc3RlfSwge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSwKLSAgICAgKiBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3N3aXRjaElucHV0TWV0aG9kfS4KKyAgICAgKiB0aGlzIHdpbGwgYmUge0BsaW5rIGFuZHJvaWQuUi5pZCNjb3B5VXJsfSBvciB7QGxpbmsgYW5kcm9pZC5SLmlkI3NlbGVjdFRleHRNb2RlfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBvblRleHRDb250ZXh0TWVudUl0ZW0oaW50IGlkKSB7CiAgICAgICAgIGludCBtaW4gPSAwOwpAQCAtNzQzMCw5MyArNzM5NiwzMSBAQAogICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgoMCwgTWF0aC5tYXgoc2VsU3RhcnQsIHNlbEVuZCkpOwogICAgICAgICB9CiAKLSAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCisgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0Q29udGV4dCgpCiAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CiAKICAgICAgICAgc3dpdGNoIChpZCkgewotICAgICAgICAgICAgY2FzZSBJRF9TRUxFQ1RfQUxMOgotICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIDAsIG1UZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydFRleHRTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgSURfU1RBUlRfU0VMRUNUSU5HX1RFWFQ6Ci0gICAgICAgICAgICAgICAgc3RhcnRUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NVVDogICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5kZWxldGUobWluLCBtYXgpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX0NPUFk6Ci0gICAgICAgICAgICAgICAgY2xpcC5zZXRUZXh0KG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpOwotICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBjYXNlIElEX1BBU1RFOgotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBwYXN0ZSA9IGNsaXAuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhc3RlICE9IG51bGwgJiYgcGFzdGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFBhc3RlIGFkZHMvcmVtb3ZlcyBzcGFjZXMgYmVmb3JlIG9yIGFmdGVyIGluc2VydGlvbiBhcyBuZWVkZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1NwYWNlQ2hhcihwYXN0ZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gMCAmJiBDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUd28gc3BhY2VzIGF0IGJlZ2lubmluZyBvZiBwYXN0ZTogcmVtb3ZlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiAtIDEsIG1pbiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbWF4IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIobVRyYW5zZm9ybWVkLmNoYXJBdChtaW4gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBiZWdpbm5pbmcgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1pbiwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBtaW4gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKHBhc3RlLmNoYXJBdChwYXN0ZS5sZW5ndGgoKSAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IG1UZXh0Lmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1NwYWNlQ2hhcihtVHJhbnNmb3JtZWQuY2hhckF0KG1heCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIHNwYWNlcyBhdCBlbmQgb2YgcGFzdGU6IHJlbW92ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCArIDEsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXggPCBtVGV4dC5sZW5ndGgoKSAmJiAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKG1UcmFuc2Zvcm1lZC5jaGFyQXQobWF4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzcGFjZSBhdCBlbmQgb2YgcGFzdGU6IGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtYXgsIG1heCwgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgICgoRWRpdGFibGUpIG1UZXh0KS5yZXBsYWNlKG1pbiwgbWF4LCBwYXN0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgICAgICAgICAgY2FzZSBJRF9DT1BZX1VSTDoKKwogICAgICAgICAgICAgICAgIFVSTFNwYW5bXSB1cmxzID0gKChTcGFubmVkKSBtVGV4dCkuZ2V0U3BhbnMobWluLCBtYXgsIFVSTFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh1cmxzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaXAuc2V0VGV4dCh1cmxzWzBdLmdldFVSTCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodXJscy5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAgICAgICAgICBDbGlwRGF0YSBjbGlwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UodXJsc1swXS5nZXRVUkwoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IENsaXBEYXRhLm5ld1Jhd1VyaShudWxsLCBudWxsLCB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLmFkZEl0ZW0obmV3IENsaXBEYXRhLkl0ZW0odXJpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKGNsaXApOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgICAgICBjYXNlIElEX1NXSVRDSF9JTlBVVF9NRVRIT0Q6Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1tLnNob3dJbnB1dE1ldGhvZFBpY2tlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBJRF9BRERfVE9fRElDVElPTkFSWToKLSAgICAgICAgICAgICAgICBTdHJpbmcgd29yZCA9IGdldFdvcmRGb3JEaWN0aW9uYXJ5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpID0gbmV3IEludGVudCgiY29tLmFuZHJvaWQuc2V0dGluZ3MuVVNFUl9ESUNUSU9OQVJZX0lOU0VSVCIpOwotICAgICAgICAgICAgICAgICAgICBpLnB1dEV4dHJhKCJ3b3JkIiwgd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIGkuc2V0RmxhZ3MoaS5nZXRGbGFncygpIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuc3RhcnRBY3Rpdml0eShpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIElEX1NFTEVDVElPTl9NT0RFOgorICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCkBAIC03NTI5LDM1ICs3NDMzLDgxIEBACiAgICAgICAgICAgICBtRWF0VG91Y2hSZWxlYXNlID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRTZWxlY3Rpb25BY3Rpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgIHBlcmZvcm1IYXB0aWNGZWVkYmFjayhIYXB0aWNGZWVkYmFja0NvbnN0YW50cy5MT05HX1BSRVNTKTsKKyAgICAgICAgICAgIG1FYXRUb3VjaFJlbGVhc2UgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0VGV4dFNlbGVjdGlvbk1vZGUoKSB7Ci0gICAgICAgIGlmICghbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgcHJpdmF0ZSBib29sZWFuIHRvdWNoUG9zaXRpb25Jc0luU2VsZWN0aW9uKCkgeworICAgICAgICBpbnQgc2VsZWN0aW9uU3RhcnQgPSBnZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICBpbnQgc2VsZWN0aW9uRW5kID0gZ2V0U2VsZWN0aW9uRW5kKCk7CiAKLSAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdEN1cnJlbnRXb3JkKCk7Ci0gICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKLSAgICAgICAgICAgIG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUgPSB0cnVlOworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT0gc2VsZWN0aW9uRW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiBzZWxlY3Rpb25FbmQpIHsKKyAgICAgICAgICAgIGludCB0bXAgPSBzZWxlY3Rpb25TdGFydDsKKyAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uRW5kOworICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gdG1wOworICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbigoU3Bhbm5hYmxlKSBtVGV4dCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyID0KKyAgICAgICAgICAgICgoU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKSBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyKTsKKyAgICAgICAgaW50IG1pbk9mZnNldCA9IHNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlci5nZXRNaW5Ub3VjaE9mZnNldCgpOworICAgICAgICBpbnQgbWF4T2Zmc2V0ID0gc2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmdldE1heFRvdWNoT2Zmc2V0KCk7CisKKyAgICAgICAgcmV0dXJuICgobWluT2Zmc2V0ID49IHNlbGVjdGlvblN0YXJ0KSAmJiAobWF4T2Zmc2V0IDwgc2VsZWN0aW9uRW5kKSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgI3N0b3BUZXh0U2VsZWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKKyAgICAgKiBQcm92aWRlcyB0aGUgY2FsbGJhY2sgdXNlZCB0byBzdGFydCBhIHNlbGVjdGlvbiBhY3Rpb24gbW9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBjYWxsYmFjayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdGFydCBzZWxlY3Rpb24gbW9kZSwgb3IgbnVsbCBpZiBzZWxlY3Rpb24KKyAgICAgKiBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIGdldEFjdGlvbk1vZGVDYWxsYmFjaygpIHsKKyAgICAgICAgLy8gTG9uZyBwcmVzcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgICAgIC8vIFNob3VsZCBpbml0aWF0ZSBhIGRyYWcuIFJldHVybiBmYWxzZSwgdG8gcmVseSBvbiBjb250ZXh0IG1lbnUgZm9yIG5vdy4KKyAgICAgICAgaWYgKGNhblNlbGVjdFRleHQoKSAmJiAhdG91Y2hQb3NpdGlvbklzSW5TZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIG1vZGUgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2VsZWN0aW9uQWN0aW9uTW9kZSgpIHsKKyAgICAgICAgaWYgKG1TZWxlY3Rpb25BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNlbGVjdGlvbiBhY3Rpb24gbW9kZSBpcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgYWN0aW9uTW9kZUNhbGxiYWNrID0gZ2V0QWN0aW9uTW9kZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChhY3Rpb25Nb2RlQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBzdGFydEFjdGlvbk1vZGUoYWN0aW9uTW9kZUNhbGxiYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICNzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpfSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gY3Vyc29yIGNvbnRyb2xsZXIKICAgICAgKiBmYWRlIG91dCBhbmltYXRpb24uIE5lZWRlZCBzaW5jZSB0aGUgZHJhd2FibGUgYW5kIHRoZWlyIGFscGhhIHZhbHVlcyBhcmUgc2hhcmVkIGJ5IGFsbAogICAgICAqIFRleHRWaWV3cy4gU3dpdGNoaW5nIGZyb20gb25lIFRleHRWaWV3IHRvIGFub3RoZXIgd291bGQgZmFkZSB0aGUgY3Vyc29yIGNvbnRyb2xsZXJzIGluIHRoZQogICAgICAqIG5ldyBvbmUgb3RoZXJ3aXNlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXJtaW5hdGVUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgcHJpdmF0ZSB2b2lkIHRlcm1pbmF0ZVNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIFNlbGVjdGlvbk1vZGlmaWVyQ3Vyc29yQ29udHJvbGxlciBzZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPQogICAgICAgICAgICAgICAgIChTZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIpIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXI7CkBAIC03NTY1LDE0ICs3NTE1LDE0NiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3BUZXh0U2VsZWN0aW9uTW9kZSgpIHsKLSAgICAgICAgaWYgKG1Jc0luVGV4dFNlbGVjdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIGdldFNlbGVjdGlvbkVuZCgpKTsKKyAgICBwcml2YXRlIHZvaWQgc3RvcFNlbGVjdGlvbkFjdGlvbk1vZGUoKSB7CisgICAgICAgIGlmIChtU2VsZWN0aW9uQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2VsZWN0aW9uQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQWN0aW9uTW9kZUNhbGxiYWNrIGltcGxlbWVudHMgQWN0aW9uTW9kZS5DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJUZXh0VmlldyBoYXMgbm8gc2VsZWN0aW9uIGNvbnRyb2xsZXIuIEFjdGlvbiBtb2RlIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdEZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnRleHRTZWxlY3Rpb25DQUJUaXRsZSkpOworICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKworICAgICAgICAgICAgc2VsZWN0Q3VycmVudFdvcmQoKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhdExlYXN0T25lID0gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChjYW5TZWxlY3RBbGwoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2NoYXRfZGFzaGJvYXJkKS4KKyAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJyk7CisgICAgICAgICAgICAgICAgYXRMZWFzdE9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYW5DdXQoKSkgeworICAgICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX0NVVCwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY3V0KS4KKyAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY29tcG9zZSkuCisgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgneCcpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2FuQ29weSgpKSB7CisgICAgICAgICAgICAgICAgbWVudS5hZGQoMCwgSURfQ09QWSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29weSkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5pY19tZW51X2F0dGFjaG1lbnQpLgorICAgICAgICAgICAgICAgICAgICBzZXRBbHBoYWJldGljU2hvcnRjdXQoJ2MnKTsKKyAgICAgICAgICAgICAgICBhdExlYXN0T25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblBhc3RlKCkpIHsKKyAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBJRF9QQVNURSwgMCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucGFzdGUpLgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLmljX21lbnVfY2FtZXJhKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEFscGhhYmV0aWNTaG9ydGN1dCgndicpOworICAgICAgICAgICAgICAgIGF0TGVhc3RPbmUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXRMZWFzdE9uZSkgeworICAgICAgICAgICAgICAgIG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIuc2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlQWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUsIE1lbnUgbWVudSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpdGVtSWQgPSBpdGVtLmdldEl0ZW1JZCgpOworCisgICAgICAgICAgICBpZiAoaXRlbUlkID09IElEX1NFTEVDVF9BTEwpIHsKKyAgICAgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCAwLCBtVGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRyb2xsZXIgcG9zaXRpb25zIGFmdGVyIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3Rpb25Nb2RpZmllckN1cnNvckNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLnNob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsaXBib2FyZE1hbmFnZXIgY2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpIGdldENvbnRleHQoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgaW50IG1pbiA9IDA7CisgICAgICAgICAgICBpbnQgbWF4ID0gbVRleHQubGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IGdldFNlbGVjdGlvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbEVuZCA9IGdldFNlbGVjdGlvbkVuZCgpOworCisgICAgICAgICAgICAgICAgbWluID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VsU3RhcnQsIHNlbEVuZCkpOworICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KDAsIE1hdGgubWF4KHNlbFN0YXJ0LCBzZWxFbmQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJRF9QQVNURToKKyAgICAgICAgICAgICAgICAgICAgQ2xpcERhdGEgY2xpcCA9IGNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRpZGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2xpcC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHBhc3RlID0gY2xpcC5nZXRJdGVtKGkpLmNvZXJjZVRvVGV4dChnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGlkZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oKFNwYW5uYWJsZSkgbVRleHQsIG1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShtaW4sIG1heCwgcGFzdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmluc2VydChnZXRTZWxlY3Rpb25FbmQoKSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkuaW5zZXJ0KGdldFNlbGVjdGlvbkVuZCgpLCBwYXN0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIElEX0NVVDoKKyAgICAgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKENsaXBEYXRhLm5ld1BsYWluVGV4dChudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2Zvcm1lZC5zdWJTZXF1ZW5jZShtaW4sIG1heCkpKTsKKyAgICAgICAgICAgICAgICAgICAgKChFZGl0YWJsZSkgbVRleHQpLmRlbGV0ZShtaW4sIG1heCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBJRF9DT1BZOgorICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAoQ2xpcERhdGEubmV3UGxhaW5UZXh0KG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYW5zZm9ybWVkLnN1YlNlcXVlbmNlKG1pbiwgbWF4KSkpOworICAgICAgICAgICAgICAgICAgICBzdG9wU2VsZWN0aW9uQWN0aW9uTW9kZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKChTcGFubmFibGUpIG1UZXh0LCBnZXRTZWxlY3Rpb25TdGFydCgpKTsKICAgICAgICAgICAgIGlmIChtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyLmhpZGUoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGUgPSBudWxsOwogICAgICAgICB9CiAgICAgfQogCkBAIC03ODUzLDggKzc5MzUsNiBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0SXNEcmFnZ2VkID0gZmFsc2U7CiAgICAgICAgIC8vIFN0YXJ0aW5nIHRpbWUgb2YgdGhlIGZhZGUgdGltZXIKICAgICAgICAgcHJpdmF0ZSBsb25nIG1GYWRlT3V0VGltZXJTdGFydDsKLSAgICAgICAgLy8gVXNlZCB0byBkZXRlY3QgYSB0YXAgKHZzIGRyYWcpIG9uIHRoZSBjb250cm9sbGVyCi0gICAgICAgIHByaXZhdGUgbG9uZyBtT25Eb3duVGltZXJTdGFydDsKICAgICAgICAgLy8gVGhlIGN1cnNvciBjb250cm9sbGVyIGltYWdlcwogICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZSBtU3RhcnRIYW5kbGUsIG1FbmRIYW5kbGU7CiAgICAgICAgIC8vIE9mZnNldCBiZXR3ZWVuIGZpbmdlciBob3QgcG9pbnQgb24gYWN0aXZlIGN1cnNvciBjb250cm9sbGVyIGFuZCBhY3R1YWwgY3Vyc29yCkBAIC03OTY1LDggKzgwNDUsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KHNlbGVjdGlvblN0YXJ0KSA9PQotICAgICAgICAgICAgICAgIG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25FbmQpOworICAgICAgICAgICAgYm9vbGVhbiBvbmVMaW5lU2VsZWN0aW9uID0KKyAgICAgICAgICAgICAgICBtTGF5b3V0LmdldExpbmVGb3JPZmZzZXQoc2VsZWN0aW9uU3RhcnQpID09IG1MYXlvdXQuZ2V0TGluZUZvck9mZnNldChzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICAgbVN0YXJ0SGFuZGxlLnBvc2l0aW9uQXRDdXJzb3Ioc2VsZWN0aW9uU3RhcnQsIG9uZUxpbmVTZWxlY3Rpb24pOwogICAgICAgICAgICAgbUVuZEhhbmRsZS5wb3NpdGlvbkF0Q3Vyc29yKHNlbGVjdGlvbkVuZCwgdHJ1ZSk7CiAKQEAgLTgwMDcsMjIgKzgwODcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXRYICs9IHZpZXdwb3J0VG9Db250ZW50SG9yaXpvbnRhbE9mZnNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9mZnNldFkgKz0gdmlld3BvcnRUb0NvbnRlbnRWZXJ0aWNhbE9mZnNldCgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT25Eb3duVGltZXJTdGFydCA9IGV2ZW50LmdldEV2ZW50VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJvd0tleU1vdmVtZW50TWV0aG9kKW1Nb3ZlbWVudCkuc2V0Q3Vyc29yQ29udHJvbGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWUgPSAoaW50KSAoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgLSBtT25Eb3duVGltZXJTdGFydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDw9IFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGFwIG9uIHRoZSBjb250cm9sbGVyIChub3QgYSBkcmFnKSBvcGVucyB0aGUgY29udGV4dHVhbCBDb3B5IG1lbnUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29udGV4dE1lbnUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTjoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBtdWx0aS1wb2ludCBnZXN0dXJlcy4gS2VlcCBtaW4gYW5kIG1heCBvZmZzZXQgcG9zaXRpb25zLgpAQCAtODA4Miw3ICs4MTUyLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBoaWRlQ29udHJvbGxlcnMoKSB7CiAgICAgICAgIGhpZGVJbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXIoKTsKLSAgICAgICAgc3RvcFRleHRTZWxlY3Rpb25Nb2RlKCk7CisgICAgICAgIHN0b3BTZWxlY3Rpb25BY3Rpb25Nb2RlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChpbnQgbGluZSwgaW50IHgpIHsKQEAgLTgxNDUsNyArODIxNSw4IEBACiAgICAgICAgIHJldHVybiBnZXRPZmZzZXRGb3JIb3Jpem9udGFsKGxpbmUsIHgpOwogICAgIH0KIAotICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eQorCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gInRleHQiKQogICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlICAgICAgICAgICAgbVRleHQ7CiAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgICAgICAgICAgICBtVHJhbnNmb3JtZWQ7CiAgICAgcHJpdmF0ZSBCdWZmZXJUeXBlICAgICAgICAgICAgICBtQnVmZmVyVHlwZSA9IEJ1ZmZlclR5cGUuTk9STUFMOwpAQCAtODE3Niw3ICs4MjQ3LDcgQEAKICAgICAvLyBDdXJzb3IgQ29udHJvbGxlcnMuIE51bGwgd2hlbiBkaXNhYmxlZC4KICAgICBwcml2YXRlIEN1cnNvckNvbnRyb2xsZXIgICAgICAgIG1JbnNlcnRpb25Qb2ludEN1cnNvckNvbnRyb2xsZXI7CiAgICAgcHJpdmF0ZSBDdXJzb3JDb250cm9sbGVyICAgICAgICBtU2VsZWN0aW9uTW9kaWZpZXJDdXJzb3JDb250cm9sbGVyOwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbUlzSW5UZXh0U2VsZWN0aW9uTW9kZSA9IGZhbHNlOworICAgIHByaXZhdGUgQWN0aW9uTW9kZSAgICAgICAgICAgICAgbVNlbGVjdGlvbkFjdGlvbk1vZGU7CiAgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoT2Zmc2V0ID0gLTE7CiAgICAgLy8gQ3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZGlmZmVyZW50IEN1cnNvckNvbnRyb2xsZXIgaGVscGVyIG1ldGhvZHMuCiAgICAgLy8gT25seSBvbmUgY3Vyc29yIGNvbnRyb2xsZXIgaXMgYWN0aXZlIGF0IGFueSB0aW1lIHdoaWNoIHByZXZlbnQgcmFjZSBjb25kaXRpb25zLgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdBbmltYXRvci5qYXZhCmluZGV4IDkwN2NmYjMuLjdiNjY4OTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9WaWV3QW5pbWF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0FuaW1hdG9yLmphdmEKQEAgLTMxLDExICszMSwxMyBAQAogICoKICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdBbmltYXRvcl9pbkFuaW1hdGlvbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX291dEFuaW1hdGlvbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcKICAqLwogcHVibGljIGNsYXNzIFZpZXdBbmltYXRvciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKIAogICAgIGludCBtV2hpY2hDaGlsZCA9IDA7CiAgICAgYm9vbGVhbiBtRmlyc3RUaW1lID0gdHJ1ZTsKKwogICAgIGJvb2xlYW4gbUFuaW1hdGVGaXJzdFRpbWUgPSB0cnVlOwogCiAgICAgQW5pbWF0aW9uIG1JbkFuaW1hdGlvbjsKQEAgLTU5LDYgKzYxLDEwIEBACiAgICAgICAgIGlmIChyZXNvdXJjZSA+IDApIHsKICAgICAgICAgICAgIHNldE91dEFuaW1hdGlvbihjb250ZXh0LCByZXNvdXJjZSk7CiAgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGZsYWcgPSBhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld0FuaW1hdG9yX2FuaW1hdGVGaXJzdFZpZXcsIHRydWUpOworICAgICAgICBzZXRBbmltYXRlRmlyc3RWaWV3KGZsYWcpOworCiAgICAgICAgIGEucmVjeWNsZSgpOwogCiAgICAgICAgIGluaXRWaWV3QW5pbWF0b3IoY29udGV4dCwgYXR0cnMpOwpAQCAtODQsMTAgKzkwLDEwIEBACiAgICAgICAgIHNldE1lYXN1cmVBbGxDaGlsZHJlbihtZWFzdXJlQWxsQ2hpbGRyZW4pOwogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBTZXRzIHdoaWNoIGNoaWxkIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gd2hpY2hDaGlsZCB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHZpZXcgdG8gZGlzcGxheQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXllZENoaWxkKGludCB3aGljaENoaWxkKSB7CkBAIC0xMDUsMTQgKzExMSwxNCBAQAogICAgICAgICAgICAgcmVxdWVzdEZvY3VzKEZPQ1VTX0ZPUldBUkQpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgY2hpbGQgdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldERpc3BsYXllZENoaWxkKCkgewogICAgICAgICByZXR1cm4gbVdoaWNoQ2hpbGQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogTWFudWFsbHkgc2hvd3MgdGhlIG5leHQgY2hpbGQuCiAgICAgICovCkBAIC0xMjgsNiArMTM0LDM1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hvd3Mgb25seSB0aGUgc3BlY2lmaWVkIGNoaWxkLiBUaGUgb3RoZXIgZGlzcGxheXMgVmlld3MgZXhpdCB0aGUgc2NyZWVuLAorICAgICAqIG9wdGlvbmFsbHkgd2l0aCB0aGUgd2l0aCB0aGUge0BsaW5rICNnZXRPdXRBbmltYXRpb24oKSBvdXQgYW5pbWF0aW9ufSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoaWxkIGVudGVycyB0aGUgc2NyZWVuLCBvcHRpb25hbGx5IHdpdGggdGhlCisgICAgICoge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSBhbmltYXRlIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgaW4gYW5kIG91dCBhbmltYXRpb25zLCBkZWZhdWx0cworICAgICAqICAgICAgICAgICAgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4LCBib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGkgPT0gY2hpbGRJbmRleCkgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1JbkFuaW1hdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1JbkFuaW1hdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RUaW1lID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1PdXRBbmltYXRpb24gIT0gbnVsbCAmJiBjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0YXJ0QW5pbWF0aW9uKG1PdXRBbmltYXRpb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuZ2V0QW5pbWF0aW9uKCkgPT0gbUluQW5pbWF0aW9uKQorICAgICAgICAgICAgICAgICAgICBjaGlsZC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIGNoaWxkLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKioKICAgICAgKiBTaG93cyBvbmx5IHRoZSBzcGVjaWZpZWQgY2hpbGQuIFRoZSBvdGhlciBkaXNwbGF5cyBWaWV3cyBleGl0IHRoZSBzY3JlZW4KICAgICAgKiB3aXRoIHRoZSB7QGxpbmsgI2dldE91dEFuaW1hdGlvbigpIG91dCBhbmltYXRpb259IGFuZCB0aGUgc3BlY2lmaWVkIGNoaWxkCiAgICAgICogZW50ZXJzIHRoZSBzY3JlZW4gd2l0aCB0aGUge0BsaW5rICNnZXRJbkFuaW1hdGlvbigpIGluIGFuaW1hdGlvbn0uCkBAIC0xMzUsMjQgKzE3MCw4IEBACiAgICAgICogQHBhcmFtIGNoaWxkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjaGlsZCB0byBiZSBzaG93bi4KICAgICAgKi8KICAgICB2b2lkIHNob3dPbmx5KGludCBjaGlsZEluZGV4KSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGb3JGaXJzdCA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBjaGlsZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbUluQW5pbWF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obUluQW5pbWF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GaXJzdFRpbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrRm9yRmlyc3QgJiYgbU91dEFuaW1hdGlvbiAhPSBudWxsICYmIGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RhcnRBbmltYXRpb24obU91dEFuaW1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBbmltYXRpb24oKSA9PSBtSW5BbmltYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSA9ICghbUZpcnN0VGltZSB8fCBtQW5pbWF0ZUZpcnN0VGltZSk7CisgICAgICAgIHNob3dPbmx5KGNoaWxkSW5kZXgsIGFuaW1hdGUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1ZpZXdGbGlwcGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQppbmRleCA4MDM0OTYxLi5jNmY2ZTgxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVmlld0ZsaXBwZXIuamF2YQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9VU0VSX1BSRVNFTlQuZXF1YWxzKGFjdGlvbikpIHsKICAgICAgICAgICAgICAgICBtVXNlclByZXNlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmcoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd1Zpc2liaWxpdHlDaGFuZ2VkKGludCB2aXNpYmlsaXR5KSB7CiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1WaXNpYmxlID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwotICAgICAgICB1cGRhdGVSdW5uaW5nKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcoZmFsc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDEwICsxNDQsMjIgQEAKICAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoKSB7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmcodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHN0YXJ0IG9yIHN0b3AgZGlzcGF0Y2hpbmcgZmxpcCB7QGxpbmsgTWVzc2FnZX0gYmFzZWQKKyAgICAgKiBvbiB7QGxpbmsgI21SdW5uaW5nfSBhbmQge0BsaW5rICNtVmlzaWJsZX0gc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxpcE5vdyBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBub3csIGluCisgICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byBxdWV1aW5nIGZ1dHVyZSBmbGlwcy4gSWYgb21pdHRlZCwgZGVmYXVsdHMgdG8KKyAgICAgKiAgICAgICAgICAgIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bm5pbmcoYm9vbGVhbiBmbGlwTm93KSB7CiAgICAgICAgIGJvb2xlYW4gcnVubmluZyA9IG1WaXNpYmxlICYmIG1TdGFydGVkICYmIG1Vc2VyUHJlc2VudDsKICAgICAgICAgaWYgKHJ1bm5pbmcgIT0gbVJ1bm5pbmcpIHsKICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgc2hvd09ubHkobVdoaWNoQ2hpbGQpOworICAgICAgICAgICAgICAgIHNob3dPbmx5KG1XaGljaENoaWxkLCBmbGlwTm93KTsKICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRkxJUF9NU0cpOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2csIG1GbGlwSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9ab29tQnV0dG9uc0NvbnRyb2xsZXIuamF2YQppbmRleCAzZGY0MTlhLi40NTBjOTY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvWm9vbUJ1dHRvbnNDb250cm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1pvb21CdXR0b25zQ29udHJvbGxlci5qYXZhCkBAIC02Niw4ICs2Niw5IEBACiAgKiB7QGxpbmsgI3NldFpvb21JbkVuYWJsZWQoYm9vbGVhbil9IGFuZCB7QGxpbmsgI3NldFpvb21PdXRFbmFibGVkKGJvb2xlYW4pfS4KICAqIDxwPgogICogSWYgeW91IGFyZSB1c2luZyB0aGlzIHdpdGggYSBjdXN0b20gVmlldywgcGxlYXNlIGNhbGwKLSAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbSB0aGUKLSAqIHtAbGluayBWaWV3I29uRGV0YWNoZWRGcm9tV2luZG93fS4KKyAqIHtAbGluayAjc2V0VmlzaWJsZShib29sZWFuKSBzZXRWaXNpYmxlKGZhbHNlKX0gZnJvbQorICoge0BsaW5rIFZpZXcjb25EZXRhY2hlZEZyb21XaW5kb3d9IGFuZCBmcm9tIHtAbGluayBWaWV3I29uVmlzaWJpbGl0eUNoYW5nZWR9CisgKiB3aGVuIDxjb2RlPnZpc2liaWxpdHkgIT0gVmlldy5WSVNJQkxFPC9jb2RlPi4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBab29tQnV0dG9uc0NvbnRyb2xsZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDI5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FjdGlvbkJhckltcGwuamF2YQpAQCAtMCwwICsxLDU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlld0FuaW1hdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQWN0aW9uQmFySW1wbCBpcyB0aGUgQWN0aW9uQmFyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAqIGJ5IGRldmljZXMgb2YgYWxsIHNjcmVlbiBzaXplcy4gSWYgaXQgZGV0ZWN0cyBhIGNvbXBhdGlibGUgZGVjb3IsCisgKiBpdCB3aWxsIHNwbGl0IGNvbnRleHR1YWwgbW9kZXMgYWNyb3NzIGJvdGggdGhlIEFjdGlvbkJhclZpZXcgYXQKKyAqIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBhbmQgYSBob3Jpem9udGFsIExpbmVhckxheW91dCBhdCB0aGUgYm90dG9tCisgKiB3aGljaCBpcyBub3JtYWxseSBoaWRkZW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMX1ZJRVcgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URVhUX1ZJRVcgPSAxOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJfU1dJVENIX1NIT1dfSElERSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9TV0lUQ0hfQUREX1JFTU9WRSA9IDE7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBY3Rpdml0eSBtQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBEaWFsb2cgbURpYWxvZzsKKworICAgIHByaXZhdGUgVmlld0FuaW1hdG9yIG1BbmltYXRvclZpZXc7CisgICAgcHJpdmF0ZSBBY3Rpb25CYXJWaWV3IG1BY3Rpb25WaWV3OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbVVwcGVyQ29udGV4dFZpZXc7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxvd2VyQ29udGV4dFZpZXc7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxUYWJJbXBsPiBtVGFicyA9IG5ldyBBcnJheUxpc3Q8VGFiSW1wbD4oKTsKKworICAgIHByaXZhdGUgaW50IG1UYWJDb250YWluZXJWaWV3SWQgPSBhbmRyb2lkLlIuaWQuY29udGVudDsKKyAgICBwcml2YXRlIFRhYkltcGwgbVNlbGVjdGVkVGFiOworICAgIHByaXZhdGUgaW50IG1UYWJTd2l0Y2hNb2RlID0gVEFCX1NXSVRDSF9BRERfUkVNT1ZFOworICAgIAorICAgIHByaXZhdGUgQWN0aW9uTW9kZSBtQWN0aW9uTW9kZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFWFRfRElTUExBWV9TUExJVCA9IDE7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUNvbnRleHREaXNwbGF5TW9kZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQ2xvc2luZ0NvbnRleHQ7CisKKyAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICBmaW5hbCBSdW5uYWJsZSBtQ2xvc2VDb250ZXh0ID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5jbG9zZU1vZGUoKTsKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DbG9zaW5nQ29udGV4dCA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBBY3Rpb25CYXJJbXBsKEFjdGl2aXR5IGFjdGl2aXR5KSB7CisgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICBpbml0KGFjdGl2aXR5LmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uQmFySW1wbChEaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIG1EaWFsb2cgPSBkaWFsb2c7CisgICAgICAgIGluaXQoZGlhbG9nLmdldFdpbmRvdygpLmdldERlY29yVmlldygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChWaWV3IGRlY29yKSB7CisgICAgICAgIG1Db250ZXh0ID0gZGVjb3IuZ2V0Q29udGV4dCgpOworICAgICAgICBtQWN0aW9uVmlldyA9IChBY3Rpb25CYXJWaWV3KSBkZWNvci5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hY3Rpb25fYmFyKTsKKyAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcgPSAoQWN0aW9uQmFyQ29udGV4dFZpZXcpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9jb250ZXh0X2Jhcik7CisgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3ID0gKExpbmVhckxheW91dCkgZGVjb3IuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubG93ZXJfYWN0aW9uX2NvbnRleHRfYmFyKTsKKyAgICAgICAgbUFuaW1hdG9yVmlldyA9IChWaWV3QW5pbWF0b3IpIGRlY29yLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmFjdGlvbl9iYXJfYW5pbWF0b3IpOworCisgICAgICAgIGlmIChtQWN0aW9uVmlldyA9PSBudWxsIHx8IG1VcHBlckNvbnRleHRWaWV3ID09IG51bGwgfHwgbUFuaW1hdG9yVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhIGNvbXBhdGlibGUgd2luZG93IGRlY29yIGxheW91dCIpOworICAgICAgICB9CisKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q29udGV4dFZpZXcobVVwcGVyQ29udGV4dFZpZXcpOworICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUxvd2VyQ29udGV4dFZpZXcgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgQ09OVEVYVF9ESVNQTEFZX05PUk1BTCA6IENPTlRFWFRfRElTUExBWV9TUExJVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25Nb2RlKFZpZXcgdmlldykgeworICAgICAgICBjbGVhbnVwVGFicygpOworICAgICAgICBtQWN0aW9uVmlldy5zZXRDdXN0b21OYXZpZ2F0aW9uVmlldyh2aWV3KTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShTcGlubmVyQWRhcHRlciBhZGFwdGVyLCBOYXZpZ2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgc2V0RHJvcGRvd25OYXZpZ2F0aW9uTW9kZShhZGFwdGVyLCBjYWxsYmFjaywgLTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3Bkb3duTmF2aWdhdGlvbk1vZGUoU3Bpbm5lckFkYXB0ZXIgYWRhcHRlciwgTmF2aWdhdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgaW50IGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKSB7CisgICAgICAgIGNsZWFudXBUYWJzKCk7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldE5hdmlnYXRpb25Nb2RlKE5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25BZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkUG9zaXRpb24gPj0gMCkgeworICAgICAgICAgICAgbUFjdGlvblZpZXcuc2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKGRlZmF1bHRTZWxlY3RlZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhbmRhcmROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgY2xlYW51cFRhYnMoKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0TmF2aWdhdGlvbk1vZGUoTkFWSUdBVElPTl9NT0RFX1NUQU5EQVJEKTsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0Q2FsbGJhY2sobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBzZWxlY3RUYWIobVRhYnMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOQVZJR0FUSU9OX01PREVfRFJPUERPV05fTElTVDoKKyAgICAgICAgICAgIG1BY3Rpb25WaWV3LnNldERyb3Bkb3duU2VsZWN0ZWRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXRTZWxlY3RlZE5hdmlnYXRpb25JdGVtIG5vdCB2YWxpZCBmb3IgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWROYXZpZ2F0aW9uSXRlbSgpIHsKKyAgICAgICAgc3dpdGNoIChtQWN0aW9uVmlldy5nZXROYXZpZ2F0aW9uTW9kZSgpKSB7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkVGFiLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGNhc2UgTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICByZXR1cm4gbUFjdGlvblZpZXcuZ2V0RHJvcGRvd25TZWxlY3RlZFBvc2l0aW9uKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xlYW51cFRhYnMoKSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1UYWJzLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUFjdGlvblZpZXcuc2V0U3VidGl0bGUoc3VidGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldERpc3BsYXlPcHRpb25zKG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlPcHRpb25zKGludCBvcHRpb25zLCBpbnQgbWFzaykgeworICAgICAgICBmaW5hbCBpbnQgY3VycmVudCA9IG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7IAorICAgICAgICBtQWN0aW9uVmlldy5zZXREaXNwbGF5T3B0aW9ucygob3B0aW9ucyAmIG1hc2spIHwgKGN1cnJlbnQgJiB+bWFzaykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmREcmF3YWJsZShEcmF3YWJsZSBkKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LnNldEJhY2tncm91bmREcmF3YWJsZShkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21OYXZpZ2F0aW9uVmlldygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdWJ0aXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldFN1YnRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROYXZpZ2F0aW9uTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldE5hdmlnYXRpb25Nb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXNwbGF5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25WaWV3LmdldERpc3BsYXlPcHRpb25zKCk7CisgICAgfQorCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlLmZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCBmb3IgdGhlIGNsb3NlIGNvbnRleHQgbW9kZSBhbmltYXRpb24gdG8gZmluaXNoLgorICAgICAgICBpZiAobUNsb3NpbmdDb250ZXh0KSB7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUNsb3NlQ29udGV4dCk7CisgICAgICAgICAgICBtQ2xvc2VDb250ZXh0LnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuaW5pdEZvck1vZGUobW9kZSk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKENPTlRFWFRfVklFVyk7CisgICAgICAgICAgICBpZiAobUxvd2VyQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSB0aGlzCisgICAgICAgICAgICAgICAgbUxvd2VyQ29udGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgVGFiSW1wbCB0YWJpID0gKFRhYkltcGwpIHRhYjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0ZpcnN0VGFiID0gbVRhYnMuaXNFbXB0eSgpOworICAgICAgICBmaW5hbCBBY3Rpb25CYXIuVGFiTGlzdGVuZXIgY2FsbGJhY2sgPSB0YWJpLmdldENhbGxiYWNrKCk7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFjdGlvbiBCYXIgVGFiIG11c3QgaGF2ZSBhIENhbGxiYWNrIik7CisgICAgICAgIH0KKworICAgICAgICB0YWJpLnNldFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgbVRhYnMuYWRkKHBvc2l0aW9uLCB0YWJpKTsKKworICAgICAgICBpZiAoaXNGaXJzdFRhYikgeworICAgICAgICAgICAgZmluYWwgRnJhZ21lbnRUcmFuc2FjdGlvbiB0cmFucyA9IG1BY3Rpdml0eS5nZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIG1TZWxlY3RlZFRhYiA9IHRhYmk7CisgICAgICAgICAgICBjYWxsYmFjay5vblRhYlNlbGVjdGVkKHRhYiwgdHJhbnMpOworICAgICAgICAgICAgaWYgKCF0cmFucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiKSB7CisgICAgICAgIG1BY3Rpb25WaWV3LmFkZFRhYih0YWIpOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBtVGFicy5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFRhYihUYWIgdGFiLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcuYWRkVGFiKHRhYiwgcG9zaXRpb24pOworICAgICAgICBjb25maWd1cmVUYWIodGFiLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYiBuZXdUYWIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGFiSW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhYihUYWIgdGFiKSB7CisgICAgICAgIHJlbW92ZVRhYkF0KHRhYi5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbUFjdGlvblZpZXcucmVtb3ZlVGFiQXQocG9zaXRpb24pOworICAgICAgICBtVGFicy5yZW1vdmUocG9zaXRpb24pOworCisgICAgICAgIGZpbmFsIGludCBuZXdUYWJDb3VudCA9IG1UYWJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHBvc2l0aW9uOyBpIDwgbmV3VGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbVRhYnMuZ2V0KGkpLnNldFBvc2l0aW9uKGkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZWN0VGFiKG1UYWJzLmlzRW1wdHkoKSA/IG51bGwgOiBtVGFicy5nZXQoTWF0aC5tYXgoMCwgcG9zaXRpb24gLSAxKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRhYk5hdmlnYXRpb25Nb2RlKCkgeworICAgICAgICBpZiAobUFjdGl2aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUYWIgbmF2aWdhdGlvbiBtb2RlIGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gQWN0aXZpdHkiKTsKKyAgICAgICAgfQorICAgICAgICBtQWN0aW9uVmlldy5zZXROYXZpZ2F0aW9uTW9kZShOQVZJR0FUSU9OX01PREVfVEFCUyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VsZWN0VGFiKFRhYiB0YWIpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRhYiA9PSB0YWIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25WaWV3LnNldFRhYlNlbGVjdGVkKHRhYiAhPSBudWxsID8gdGFiLmdldFBvc2l0aW9uKCkgOiBUYWIuSU5WQUxJRF9QT1NJVElPTik7CisgICAgICAgIGZpbmFsIEZyYWdtZW50VHJhbnNhY3Rpb24gdHJhbnMgPSBtQWN0aXZpdHkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJVbnNlbGVjdGVkKG1TZWxlY3RlZFRhYiwgdHJhbnMpOworICAgICAgICB9CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IChUYWJJbXBsKSB0YWI7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUYWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVGFiLmdldENhbGxiYWNrKCkub25UYWJTZWxlY3RlZChtU2VsZWN0ZWRUYWIsIHRyYW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdHJhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cmFucy5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUYWIgZ2V0U2VsZWN0ZWRUYWIoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0ZWRUYWI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtQWN0aW9uVmlldy5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBUT0RPIGFuaW1hdGUhCisgICAgICAgIG1BbmltYXRvclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIC8vIFRPRE8gYW5pbWF0ZSEKKyAgICAgICAgbUFuaW1hdG9yVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTaG93aW5nKCkgeworICAgICAgICByZXR1cm4gbUFuaW1hdG9yVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIAorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBBY3Rpb25Nb2RlSW1wbCBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3PiBtQ3VzdG9tVmlldzsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBBY3Rpb25Nb2RlSW1wbChBY3Rpb25Nb2RlLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1NZW51ID0gbmV3IE1lbnVCdWlsZGVyKG1BY3Rpb25WaWV3LmdldENvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVudUluZmxhdGVyKG1Db250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHRoZSBhY3RpdmUgYWN0aW9uIG1vZGUgLSBuby1vcAorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzdHJveUFjdGlvbk1vZGUodGhpcyk7CisgICAgICAgICAgICBtQW5pbWF0b3JWaWV3LnNldERpc3BsYXllZENoaWxkKE5PUk1BTF9WSUVXKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBjb250ZXh0IG1vZGUgdmlld3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBmaW5pc2hlcworICAgICAgICAgICAgbUNsb3NpbmdDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1DbG9zZUNvbnRleHQsIG1BbmltYXRvclZpZXcuZ2V0T3V0QW5pbWF0aW9uKCkuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgICAgIGlmIChtTG93ZXJDb250ZXh0VmlldyAhPSBudWxsICYmIG1Mb3dlckNvbnRleHRWaWV3LmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIEFuaW1hdGUgdGhpcworICAgICAgICAgICAgICAgIG1Mb3dlckNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KSkgeworICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggY29udGVudCBpbiBib3RoIGNvbnRleHQgdmlld3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21WaWV3KFZpZXcgdmlldykgeworICAgICAgICAgICAgbVVwcGVyQ29udGV4dFZpZXcuc2V0Q3VzdG9tVmlldyh2aWV3KTsKKyAgICAgICAgICAgIG1DdXN0b21WaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlldz4odmlldyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRTdWJ0aXRsZShzdWJ0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zZXRUaXRsZSh0aXRsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRUaXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgICAgICBzZXRTdWJ0aXRsZShtQWN0aXZpdHkuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVXBwZXJDb250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVVwcGVyQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxiYWNrLm9uQWN0aW9uSXRlbUNsaWNrZWQodGhpcywgaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdWJNZW51U2VsZWN0ZWQoU3ViTWVudUJ1aWxkZXIgc3ViTWVudSkgeworICAgICAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25NZW51TW9kZUNoYW5nZShNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtVXBwZXJDb250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBUYWJJbXBsIGV4dGVuZHMgQWN0aW9uQmFyLlRhYiB7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyLlRhYkxpc3RlbmVyIG1DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICAgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21WaWV3OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRhZyhPYmplY3QgdGFnKSB7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjdGlvbkJhci5UYWJMaXN0ZW5lciBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGFiTGlzdGVuZXIoQWN0aW9uQmFyLlRhYkxpc3RlbmVyIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21WaWV3OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgIG1JY29uID0gaWNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgeworICAgICAgICAgICAgc2VsZWN0VGFiKHRoaXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9Mb2NhbGVQaWNrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZDY5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvTG9jYWxlUGlja2VyLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuQmFja3VwTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIExvY2FsZVBpY2tlciBleHRlbmRzIExpc3RGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJMb2NhbGVQaWNrZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIExvY2FsZVNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLy8gWW91IGNhbiBhZGQgYW55IGFyZ3VtZW50IGlmIHlvdSByZWFsbHkgbmVlZCBpdC4uLgorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZVNlbGVjdGVkKCk7CisgICAgfQorCisgICAgTG9jW10gbUxvY2FsZXM7CisgICAgU3RyaW5nW10gbVNwZWNpYWxMb2NhbGVDb2RlczsKKyAgICBTdHJpbmdbXSBtU3BlY2lhbExvY2FsZU5hbWVzOworCisKKyAgICBMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBtTGlzdGVuZXI7ICAvLyBkZWZhdWx0IHRvIG51bGwKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvYyBpbXBsZW1lbnRzIENvbXBhcmFibGU8TG9jPiB7CisgICAgICAgIHN0YXRpYyBDb2xsYXRvciBzQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFN0cmluZyBsYWJlbDsKKyAgICAgICAgTG9jYWxlIGxvY2FsZTsKKworICAgICAgICBwdWJsaWMgTG9jKFN0cmluZyBsYWJlbCwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKExvYyBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gc0NvbGxhdG9yLmNvbXBhcmUodGhpcy5sYWJlbCwgYW5vdGhlci5sYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBMb2NhbGVMaXN0KCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBhY3Rpdml0eS5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVDb2RlcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX2NvZGVzKTsKKyAgICAgICAgbVNwZWNpYWxMb2NhbGVOYW1lcyA9IHJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5LnNwZWNpYWxfbG9jYWxlX25hbWVzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2NhbGVzID0gYWN0aXZpdHkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworICAgICAgICBBcnJheXMuc29ydChsb2NhbGVzKTsKKyAgICAgICAgZmluYWwgaW50IG9yaWdTaXplID0gbG9jYWxlcy5sZW5ndGg7CisgICAgICAgIExvY1tdIHByZXByb2Nlc3MgPSBuZXcgTG9jW29yaWdTaXplXTsKKyAgICAgICAgaW50IGZpbmFsU2l6ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG9yaWdTaXplOyBpKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGxvY2FsZXNbaV07CisgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IHMuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gcy5zdWJzdHJpbmcoMywgNSk7CisgICAgICAgICAgICAgICAgTG9jYWxlIGwgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChmaW5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyBpbml0aWFsICIrIHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2ModG9UaXRsZUNhc2UobC5nZXREaXNwbGF5TGFuZ3VhZ2UobCkpLCBsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBwcmV2aW91cyBlbnRyeToKKyAgICAgICAgICAgICAgICAgICAgLy8gIHNhbWUgbGFuZyBhbmQgYSBjb3VudHJ5IC0+IHVwZ3JhZGUgdG8gZnVsbCBuYW1lIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyAgICBpbnNlcnQgb3VycyB3aXRoIGZ1bGwgbmFtZQorICAgICAgICAgICAgICAgICAgICAvLyAgZGlmZiBsYW5nIC0+IGluc2VydCBvdXJzIHdpdGggbGFuZy1vbmx5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NbZmluYWxTaXplLTFdLmxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImJhY2tpbmcgdXAgYW5kIGZpeGluZyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubGFiZWwrIiB0byAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlzcGxheU5hbWUocHJlcHJvY2Vzc1tmaW5hbFNpemUtMV0ubG9jYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sYWJlbCA9IHRvVGl0bGVDYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXNwbGF5TmFtZShwcmVwcm9jZXNzW2ZpbmFsU2l6ZS0xXS5sb2NhbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIiAgYW5kIGFkZGluZyAiKyB0b1RpdGxlQ2FzZShnZXREaXNwbGF5TmFtZShsKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc1tmaW5hbFNpemUrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jKHRvVGl0bGVDYXNlKGdldERpc3BsYXlOYW1lKGwpKSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5lcXVhbHMoInp6X1paIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9ICJQc2V1ZG8uLi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IHRvVGl0bGVDYXNlKGwuZ2V0RGlzcGxheUxhbmd1YWdlKGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImFkZGluZyAiK2Rpc3BsYXlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NbZmluYWxTaXplKytdID0gbmV3IExvYyhkaXNwbGF5TmFtZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsZXMgPSBuZXcgTG9jW2ZpbmFsU2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxTaXplIDsgaSsrKSB7CisgICAgICAgICAgICBtTG9jYWxlc1tpXSA9IHByZXByb2Nlc3NbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQobUxvY2FsZXMpOworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0SWQgPSBSLmxheW91dC5sb2NhbGVfcGlja2VyX2l0ZW07CisgICAgICAgIGZpbmFsIGludCBmaWVsZElkID0gUi5pZC5sb2NhbGU7CisgICAgICAgIGZpbmFsIEFycmF5QWRhcHRlcjxMb2M+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUFkYXB0ZXI8TG9jPihhY3Rpdml0eSwgbGF5b3V0SWQsIGZpZWxkSWQsIG1Mb2NhbGVzKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoZmluYWwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZChzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRVcExvY2FsZUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lcihMb2NhbGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9UaXRsZUNhc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHMuY2hhckF0KDApKSArIHMuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlOYW1lKExvY2FsZSBsKSB7CisgICAgICAgIFN0cmluZyBjb2RlID0gbC50b1N0cmluZygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNwZWNpYWxMb2NhbGVDb2Rlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TcGVjaWFsTG9jYWxlQ29kZXNbaV0uZXF1YWxzKGNvZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVjaWFsTG9jYWxlTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbC5nZXREaXNwbGF5TmFtZShsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5yZXF1ZXN0Rm9jdXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElBY3Rpdml0eU1hbmFnZXIgYW0gPSBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSBhbS5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgICAgIExvYyBsb2MgPSBtTG9jYWxlc1twb3NpdGlvbl07CisgICAgICAgICAgICBjb25maWcubG9jYWxlID0gbG9jLmxvY2FsZTsKKworICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhpcyBpc24ndCBzb21lIHBhc3NpbmcgZGVmYXVsdCAtIHRoZSB1c2VyIHdhbnRzIHRoaXMgcmVtZW1iZXJlZAorICAgICAgICAgICAgY29uZmlnLnVzZXJTZXRMb2NhbGUgPSB0cnVlOworCisgICAgICAgICAgICBhbS51cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkaXJ0eSBiaXQgZm9yIHRoZSBTZXR0aW5ncyBQcm92aWRlci4KKyAgICAgICAgICAgIEJhY2t1cE1hbmFnZXIuZGF0YUNoYW5nZWQoImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncyIpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rCisgICAgICAgIH0KKworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci5vbkxvY2FsZVNlbGVjdGVkKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0SG9zdC5haWRsCmluZGV4IDJlZDQ3NzMuLjIxNmQ5ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldEhvc3QuYWlkbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRIb3N0LmFpZGwKQEAgLTI0LDUgKzI0LDYgQEAKIG9uZXdheSBpbnRlcmZhY2UgSUFwcFdpZGdldEhvc3QgewogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0KGludCBhcHBXaWRnZXRJZCwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgcHJvdmlkZXJDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW4gQXBwV2lkZ2V0UHJvdmlkZXJJbmZvIGluZm8pOworICAgIHZvaWQgdmlld0RhdGFDaGFuZ2VkKGludCBhcHBXaWRnZXRJZCwgaW50IHZpZXdJZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHB3aWRnZXQvSUFwcFdpZGdldFNlcnZpY2UuYWlkbAppbmRleCA0OTZhYTFhLi40ZDU2NzQ1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwd2lkZ2V0L0lBcHBXaWRnZXRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcHdpZGdldC9JQXBwV2lkZ2V0U2VydmljZS5haWRsCkBAIC00MCw3ICs0MCw5IEBACiAgICAgLy8gZm9yIEFwcFdpZGdldE1hbmFnZXIKICAgICAvLwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGluIGludFtdIGFwcFdpZGdldElkcywgaW4gUmVtb3RlVmlld3Mgdmlld3MpOwogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0UHJvdmlkZXIoaW4gQ29tcG9uZW50TmFtZSBwcm92aWRlciwgaW4gUmVtb3RlVmlld3Mgdmlld3MpOworICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkKGluIGludFtdIGFwcFdpZGdldElkcywgaW50IHZpZXdJZCk7CiAgICAgTGlzdDxBcHBXaWRnZXRQcm92aWRlckluZm8+IGdldEluc3RhbGxlZFByb3ZpZGVycygpOwogICAgIEFwcFdpZGdldFByb3ZpZGVySW5mbyBnZXRBcHBXaWRnZXRJbmZvKGludCBhcHBXaWRnZXRJZCk7CiAgICAgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBpbiBDb21wb25lbnROYW1lIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvZGF0YWJhc2UvU29ydEN1cnNvci5qYXZhCmluZGV4IDk5NDEwYmMuLjAwMjU1MTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9kYXRhYmFzZS9Tb3J0Q3Vyc29yLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2RhdGFiYXNlL1NvcnRDdXJzb3IuamF2YQpAQCAtMTgyLDI0ICsxODIsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZVJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gbUN1cnNvci5kZWxldGVSb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb21taXRVcGRhdGVzKCkgewotICAgICAgICBpbnQgbGVuZ3RoID0gbUN1cnNvcnMubGVuZ3RoOwotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBsZW5ndGggOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQ3Vyc29yc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnNvcnNbaV0uY29tbWl0VXBkYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG9uQ2hhbmdlKHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbik7CkBAIC0yMzYsNiArMjE4LDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1DdXJzb3IuZ2V0VHlwZShjb2x1bW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChpbnQgY29sdW1uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1DdXJzb3IuaXNOdWxsKGNvbHVtbik7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvUnVudGltZUluaXQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCmluZGV4IDU5NjAwZGMuLjU3Njc4MzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9SdW50aW1lSW5pdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5GaW5hbGl6ZXJzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiAKQEAgLTE0MSw2ICsxNDIsMTIgQEAKICAgICAgICAgICAgIERlYnVnLmVuYWJsZUVtdWxhdG9yVHJhY2VPdXRwdXQoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgdXNlZCB0byByZWNsYWltIHJlc291cmNlcyB3aXRob3V0CisgICAgICAgICAqIGdvaW5nIHRocm91Z2ggZmluYWxpemVycy4KKyAgICAgICAgICovCisgICAgICAgIEZpbmFsaXplcnMuaW5pdCgpOworCiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKQEAgLTMzMSw5ICszMzgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBwcmV2ZW50IHJlZW50cmFuY3kgaW4ge0BsaW5rICNyZXBvcnRFeGNlcHRpb259LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc0luUmVwb3J0RXhjZXB0aW9uID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoaXMgYXBwbGljYXRpb24vcHJvY2VzcywgZm9yIHJlcG9ydGluZyBWTQogICAgICAqIGVycm9ycy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uamF2YQppbmRleCBlYTI3OGE2Li5iODdhYzkwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1NhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi5qYXZhCkBAIC0yNiw3ICsyNiw5IEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZUluZm87CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLm9zLio7CiAKQEAgLTM3LDE1ICszOSwyNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24iOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RfRElSID0gIi9kYXRhL3NuYXBzaG90cyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3Igc25hcHNob3RXcml0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNhbXBsaW5nUHJvZmlsZXJIejsKKworICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB3ZSd2ZSBjcmVhdGVkIHRoZSBzbmFwc2hvdHMgZGlyLiAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOworCisgICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gcGVuZGluZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGVuYWJsZWQgPSAiMSIuZXF1YWxzKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnNhbXBsaW5nX3Byb2ZpbGVyIikpOwotICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzYW1wbGluZ1Byb2ZpbGVySHogPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC5zeXMucHJvZmlsZXJfaHoiLCAwKTsKKyAgICAgICAgaWYgKHNhbXBsaW5nUHJvZmlsZXJIeiA+IDApIHsKICAgICAgICAgICAgIHNuYXBzaG90V3JpdGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiIpOworICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBlbmFibGVkLiBTYW1wbGluZyBQcm9maWxlciBIejogIiArIHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICBMb2cuaShUQUcsICJQcm9maWxlciBpcyBkaXNhYmxlZC4iKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY5LDQ4ICs4Myw0NyBAQAogICAgICAgICBUaHJlYWRHcm91cCBncm91cCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0VGhyZWFkR3JvdXAoKTsKICAgICAgICAgU2FtcGxpbmdQcm9maWxlci5UaHJlYWRTZXQgdGhyZWFkU2V0ID0gU2FtcGxpbmdQcm9maWxlci5uZXdUaHJlYWRHcm91cFRoZWFkU2V0KGdyb3VwKTsKICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgU2FtcGxpbmdQcm9maWxlcig0LCB0aHJlYWRTZXQpOwotICAgICAgICBJTlNUQU5DRS5zdGFydCgxMCk7CisgICAgICAgIElOU1RBTkNFLnN0YXJ0KHNhbXBsaW5nUHJvZmlsZXJIeik7CiAgICAgfQogCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IHdlJ3ZlIGNyZWF0ZWQgdGhlIHNuYXBzaG90cyBkaXIuICovCi0gICAgc3RhdGljIGJvb2xlYW4gZGlyTWFkZSA9IGZhbHNlOwotCi0gICAgLyoqIFdoZXRoZXIgb3Igbm90IGEgc25hcHNob3QgaXMgYmVpbmcgcGVyc2lzdGVkLiAqLwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHBlbmRpbmc7Ci0KICAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCB0byB0aGUgU0QgY2FyZCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KKyAgICAgKiBXcml0ZXMgYSBzbmFwc2hvdCBpZiBwcm9maWxpbmcgaXMgZW5hYmxlZC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNuYXBzaG90KGZpbmFsIFN0cmluZyBwcm9jZXNzTmFtZSwgZmluYWwgUGFja2FnZUluZm8gcGFja2FnZUluZm8pIHsKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvKgotICAgICAgICAgKiBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgYSBzbmFwc2hvdCwgZG9uJ3QgYm90aGVyIGVucXVlaW5nIGFub3RoZXIKKyAgICAgICAgICogSWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIGEgc25hcHNob3QsIGRvbid0IGJvdGhlciBlbnF1ZXVlaW5nIGFub3RoZXIKICAgICAgICAgICogcmVxdWVzdCByaWdodCBub3cuIFRoaXMgd2lsbCByZWR1Y2UgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFsCiAgICAgICAgICAqIHNuYXBzaG90cyBhbmQgaW4gdHVybiB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBjb25zdW1lZCAob25lIGJpZwogICAgICAgICAgKiBzbmFwc2hvdCBpcyBzbWFsbGVyIHRoYW4gTiBzdWJzZXQgc25hcHNob3RzKS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghcGVuZGluZykgewotICAgICAgICAgICAgcGVuZGluZyA9IHRydWU7CisgICAgICAgIGlmIChwZW5kaW5nLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICAgICBzbmFwc2hvdFdyaXRlci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgIi9zbmFwc2hvdHMiOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRpck1hZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGlyKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHdyaXRhYmxlIHRvIGFueWJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRXcml0YWJsZSh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGV4ZWN1dGFibGUgdG8gYW55Ym9keQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyB3aHkgeWV0LCBidXQgbW9kZSA3MjMgd291bGQgd29yaywgd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUgNzIyIHRocm93cyBGaWxlTm90Rm91bmRFeGVjcHRpb24gYXQgbGluZSAxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShTTkFQU0hPVF9ESVIpLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJNYWRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ3JlYXRpb24gb2YgIiArIGRpciArICIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNyZWF0aW9uIG9mICIgKyBTTkFQU0hPVF9ESVIgKyAiIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNuYXBzaG90KFNOQVBTSE9UX0RJUiwgcHJvY2Vzc05hbWUsIHBhY2thZ2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuc2V0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwpAQCAtMTI0LDE1ICsxMzcsMTUgQEAKICAgICAgICAgaWYgKCFlbmFibGVkKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGlyID0gIi9kYXRhL3p5Z290ZS9zbmFwc2hvdHMiOwotICAgICAgICBuZXcgRmlsZShkaXIpLm1rZGlycygpOwotICAgICAgICB3cml0ZVNuYXBzaG90KGRpciwgInp5Z290ZSIpOworICAgICAgICB3cml0ZVNuYXBzaG90KCJ6eWdvdGUiLCBudWxsKTsKICAgICAgICAgSU5TVEFOQ0Uuc2h1dGRvd24oKTsKICAgICAgICAgSU5TVEFOQ0UgPSBudWxsOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgIC8qKgorICAgICAqIHBhc3MgaW4gUGFja2FnZUluZm8gdG8gcmV0cmlldmUgdmFyaW91cyB2YWx1ZXMgZm9yIHNuYXBzaG90IGhlYWRlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTbmFwc2hvdChTdHJpbmcgZGlyLCBTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvKSB7CiAgICAgICAgIGlmICghZW5hYmxlZCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xNDQsNDAgKzE1Nyw1NSBAQAogICAgICAgICAgKiB3ZSBjYXB0dXJlIHR3byBzbmFwc2hvdHMgaW4gcmFwaWQgc3VjY2Vzc2lvbi4KICAgICAgICAgICovCiAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkaXIgKyAiLyIgKyBuYW1lLnJlcGxhY2UoJzonLCAnLicpICsgIi0iCi0gICAgICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuc25hcHNob3QiOwotCi0gICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBmaWxlIGEgZmV3IHRpbWVzLiBUaGUgU0QgY2FyZCBtYXkgbm90IGJlIG1vdW50ZWQuCi0gICAgICAgIFByaW50U3RyZWFtIG91dDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA+IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgYml0IGFuZCB0aGVuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjUwMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsgLyogaWdub3JlICovIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJvY2Vzc05hbWUucmVwbGFjZUFsbCgiOiIsICIuIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gZGlyICsgIi8iICsgbmFtZSArICItIiArU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLnNuYXBzaG90IjsKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCkpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IG9wZW4gIiArIHBhdGggKyAiOiIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihuYW1lLCBwYWNrYWdlSW5mbywgb3V0KTsKICAgICAgICAgICAgIElOU1RBTkNFLndyaXRlSHByb2ZEYXRhKG91dCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBpZiAob3V0LmNoZWNrRXJyb3IoKSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3Igd3JpdGluZyBzbmFwc2hvdC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJXcm90ZSBzbmFwc2hvdCBmb3IgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICsgIiBpbiAiICsgZWxhcHNlZCArICJtcy4iKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICAvLyBzZXQgZmlsZSByZWFkYWJsZSB0byB0aGUgd29ybGQgc28gdGhhdCBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZQorICAgICAgICAvLyBjYW4gcHV0IGl0IHRvIGRyb3Bib3gKKyAgICAgICAgbmV3IEZpbGUocGF0aCkuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQ7CisgICAgICAgIExvZy5pKFRBRywgIldyb3RlIHNuYXBzaG90IGZvciAiICsgbmFtZSArICIgaW4gIiArIGVsYXBzZWQgKyAibXMuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2VuZXJhdGUgaGVhZGVyIGZvciBzbmFwc2hvdHMsIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQgKGxpa2UgaHR0cCBoZWFkZXIpOgorICAgICAqCisgICAgICogVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGVyPlxuCisgICAgICogUHJvY2VzczogPHByb2Nlc3MgbmFtZT5cbgorICAgICAqIFBhY2thZ2U6IDxwYWNrYWdlIG5hbWUsIGlmIGV4aXN0cz5cbgorICAgICAqIFBhY2thZ2UtVmVyc2lvbjogPHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlLCBpZiBleGlzdHM+XG4KKyAgICAgKiBCdWlsZDogPGZpbmdlcnByaW50PlxuCisgICAgICogXG4KKyAgICAgKiA8dGhlIGFjdHVhbCBzbmFwc2hvdCBjb250ZW50IGJlZ2lucyBoZXJlLi4uPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVTbmFwc2hvdEhlYWRlcihTdHJpbmcgcHJvY2Vzc05hbWUsIFBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvLAorICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIC8vIHByb2ZpbGVyIHZlcnNpb24KKyAgICAgICAgb3V0LnByaW50bG4oIlZlcnNpb246IDIiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIlByb2Nlc3M6ICIgKyBwcm9jZXNzTmFtZSk7CisgICAgICAgIGlmIChwYWNrYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiUGFja2FnZTogIiArIHBhY2thZ2VJbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJQYWNrYWdlLVZlcnNpb246ICIgKyBwYWNrYWdlSW5mby52ZXJzaW9uQ29kZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIkJ1aWxkOiAiICsgQnVpbGQuRklOR0VSUFJJTlQpOworICAgICAgICAvLyBzaW5nbGUgYmxhbmsgbGluZSBtZWFucyB0aGUgZW5kIG9mIHNuYXBzaG90IGhlYWRlci4KKyAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQppbmRleCBhNDA5ZWM4Li5mMGYzMzg3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LkxvY2FsU2VydmVyU29ja2V0OwogaW1wb3J0IGFuZHJvaWQub3MuRGVidWc7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKQEAgLTUwNiw2ICs1MDcsOSBAQAogCiAgICAgICAgIGNsb3NlU2VydmVyU29ja2V0KCk7CiAKKyAgICAgICAgLy8gc2V0IHVtYXNrIHRvIDAwNzcgc28gbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aWxsIGRlZmF1bHQgdG8gb3duZXItb25seSBwZXJtaXNzaW9ucy4KKyAgICAgICAgRmlsZVV0aWxzLnNldFVNYXNrKEZpbGVVdGlscy5TX0lSV1hHIHwgRmlsZVV0aWxzLlNfSVJXWE8pOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIFBhc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gU3lzdGVtU2VydmVyLgogICAgICAgICAgKiAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciBjb20uYW5kcm9pZC5zZXJ2ZXIuU3lzdGVtU2VydmVyIgpAQCAtNTIzLDcgKzUyNyw3IEBACiAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7CiAgICAgICAgICAgICAiLS1zZXR1aWQ9MTAwMCIsCiAgICAgICAgICAgICAiLS1zZXRnaWQ9MTAwMCIsCi0gICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwzMDAxLDMwMDIsMzAwMyIsCisgICAgICAgICAgICAiLS1zZXRncm91cHM9MTAwMSwxMDAyLDEwMDMsMTAwNCwxMDA1LDEwMDYsMTAwNywxMDA4LDEwMDksMTAxMCwxMDE4LDMwMDEsMzAwMiwzMDAzIiwKICAgICAgICAgICAgICItLWNhcGFiaWxpdGllcz0xMzAxMDQzNTIsMTMwMTA0MzUyIiwKICAgICAgICAgICAgICItLXJ1bnRpbWUtaW5pdCIsCiAgICAgICAgICAgICAiLS1uaWNlLW5hbWU9c3lzdGVtX3NlcnZlciIsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXIuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCmluZGV4IDQ1MDFiZDcuLmU4ODRhZjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCkBAIC0zMCw1ICszMCw2IEBACiAgICAgdm9pZCBkaXNhYmxlKGludCBzdGF0ZSk7CiAgICAgdm9pZCBhbmltYXRlRXhwYW5kKCk7CiAgICAgdm9pZCBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKaW5kZXggODUyNjMwZC4uMDc2M2Y1ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbApAQCAtMzAsMTQgKzMwLDE4IEBACiAgICAgdm9pZCBzZXRJY29uKFN0cmluZyBzbG90LCBTdHJpbmcgaWNvblBhY2thZ2UsIGludCBpY29uSWQsIGludCBpY29uTGV2ZWwpOwogICAgIHZvaWQgc2V0SWNvblZpc2liaWxpdHkoU3RyaW5nIHNsb3QsIGJvb2xlYW4gdmlzaWJsZSk7CiAgICAgdm9pZCByZW1vdmVJY29uKFN0cmluZyBzbG90KTsKKyAgICB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pOwogCiAgICAgLy8gLS0tLSBNZXRob2RzIGJlbG93IGFyZSBmb3IgdXNlIGJ5IHRoZSBzdGF0dXMgYmFyIHBvbGljeSBzZXJ2aWNlcyAtLS0tCiAgICAgLy8gWW91IG5lZWQgdGhlIFNUQVRVU19CQVJfU0VSVklDRSBwZXJtaXNzaW9uCiAgICAgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGNhbGxiYWNrcywgb3V0IFN0YXR1c0Jhckljb25MaXN0IGljb25MaXN0LAotICAgICAgICAgICAgb3V0IExpc3Q8SUJpbmRlcj4gbm90aWZpY2F0aW9uS2V5cywgb3V0IExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgIG91dCBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIG91dCBMaXN0PFN0YXR1c0Jhck5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9ucywKKyAgICAgICAgICAgIG91dCBib29sZWFuW10gbGlnaHRzT24pOwogICAgIHZvaWQgb25QYW5lbFJldmVhbGVkKCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CiAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkVycm9yKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCwKICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CiAgICAgdm9pZCBvbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOworICAgIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCmluZGV4IGM1OTlkNjguLmQzOGMwM2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5qYXZhCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICB9CiAKICAgICBjbGFzcyBTdGF0ZTEgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIkhlbGxvIFdvcmxkIik7CiAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKICAgICAgICAgfQpAQCAtMjU3LDEwICsyNTcsMTAgQEAKICAgICB9CiAKICAgICBjbGFzcyBQMSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAxLmVudGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgYm9vbGVhbiByZXRWYWw7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDEucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKQEAgLTI3OCwxNiArMjc4LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUDEuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY2xhc3MgUzEgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMS5lbnRlciIpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlMxLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBpZiAobWVzc2FnZS53aGF0ID09IENNRF8xKSB7CiAgICAgICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBvdXJzZWxmIHRvIHNob3cgdGhhdCBlbnRlci9leGl0IGlzIGNhbGxlZApAQCAtMjk4LDE2ICsyOTgsMTYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgIFxAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1TMS5leGl0Iik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjbGFzcyBTMiBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVMyLmVudGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgYm9vbGVhbiByZXRWYWw7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzIucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKQEAgLTMyNiwxNyArMzI2LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICBcQE92ZXJyaWRlIHB1YmxpYyB2b2lkIGV4aXQoKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJtUzIuZXhpdCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY2xhc3MgUDIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIm1QMi5lbnRlciIpOwogICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfNSkpOwogICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIExvZy5kKFRBRywgIlAyLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICBjYXNlKENNRF8zKToKQEAgLTM0OSwxMiArMzQ5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKICAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgXEBPdmVycmlkZSBwdWJsaWMgdm9pZCBleGl0KCkgewogICAgICAgICAgICAgTG9nLmQoVEFHLCAibVAyLmV4aXQiKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQorICAgIFxAT3ZlcnJpZGUKICAgICB2b2lkIGhhbHRpbmcoKSB7CiAgICAgICAgIExvZy5kKFRBRywgImhhbHRpbmciKTsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC0xMTk3LDYgKzExOTcsMzUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEgYW5kIGFyZzIKKyAgICAgKgorICAgICAqIEBwYXJhbSB3aGF0ICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLndoYXQKKyAgICAgKiBAcGFyYW0gYXJnMSAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcxCisgICAgICogQHBhcmFtIGFyZzIgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2UuYXJnMgorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGFuZCBzZXQgTWVzc2FnZS50YXJnZXQgPSB0aGlzLAorICAgICAqIHdoYXQsIGFyZzEsIGFyZzIgYW5kIG9iagorICAgICAqCisgICAgICogQHBhcmFtIHdoYXQgIGlzIGFzc2lnbmVkIHRvIE1lc3NhZ2Uud2hhdAorICAgICAqIEBwYXJhbSBhcmcxICBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLmFyZzEKKyAgICAgKiBAcGFyYW0gYXJnMiAgaXMgYXNzaWduZWQgdG8gTWVzc2FnZS5hcmcyCisgICAgICogQHBhcmFtIG9iaiBpcyBhc3NpZ25lZCB0byBNZXNzYWdlLm9iagorICAgICAqIEByZXR1cm4gIEEgTWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1lc3NhZ2Ugb2J0YWluTWVzc2FnZShpbnQgd2hhdCwgaW50IGFyZzEsIGludCBhcmcyLCBPYmplY3Qgb2JqKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uub2J0YWluKG1Ic21IYW5kbGVyLCB3aGF0LCBhcmcxLCBhcmcyLCBvYmopOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVucXVldWUgYSBtZXNzYWdlIHRvIHRoaXMgc3RhdGUgbWFjaGluZS4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvVHlwZWRQcm9wZXJ0aWVzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQppbmRleCBjMmNlMjEwLi41NjEzOTk5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9UeXBlZFByb3BlcnRpZXMuamF2YQpAQCAtNDEyLDcgKzQxMiw3IEBACiAgICAgICovCiAKICAgICAvKioKLSAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldCZsdDtUWVBFJmd0OygpfSBtZXRob2QKKyAgICAgKiBBbiB1bmNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIGEge0Bjb2RlIGdldDxUWVBFPigpfSBtZXRob2QKICAgICAgKiBpcyB1c2VkIHRvIHJldHJpZXZlIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIG1ldGhvZCBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZUV4Y2VwdGlvbiBleHRlbmRzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvWG1sVXRpbHMuamF2YQppbmRleCA4ZDhkZjE2Li5lMDBhODUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9YbWxVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1htbFV0aWxzLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjg0LDYgKzI4NSwyNiBAQAogCiAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgImxpc3QiKTsKICAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHdyaXRlU2V0WG1sKFNldCB2YWwsIFN0cmluZyBuYW1lLCBYbWxTZXJpYWxpemVyIG91dCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm51bGwiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzZXQiKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibmFtZSIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKE9iamVjdCB2IDogdmFsKSB7CisgICAgICAgICAgICB3cml0ZVZhbHVlWG1sKHYsIG51bGwsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInNldCIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIEZsYXR0ZW4gYSBieXRlW10gaW50byBhbiBYbWxTZXJpYWxpemVyLiAgVGhlIGxpc3QgY2FuIGxhdGVyIGJlIHJlYWQgYmFjawpAQCAtNDI2LDYgKzQ0Nyw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIExpc3QpIHsKICAgICAgICAgICAgIHdyaXRlTGlzdFhtbCgoTGlzdCl2LCBuYW1lLCBvdXQpOwogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBTZXQpIHsKKyAgICAgICAgICAgIHdyaXRlU2V0WG1sKChTZXQpdiwgbmFtZSwgb3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CiAgICAgICAgICAgICAvLyBYWFggVGhpcyBpcyB0byBhbGxvdyB1cyB0byBhdCBsZWFzdCB3cml0ZSBzb21ldGhpbmcgaWYKICAgICAgICAgICAgIC8vIHdlIGVuY291bnRlciBzdHlsZWQgdGV4dC4uLiAgYnV0IGl0IG1lYW5zIHdlIHdpbGwgZHJvcCBhbGwKQEAgLTQ3Niw3ICs1MDAsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGluIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQuCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgVGhlIHJlc3VsdGluZyBsaXN0LgorICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IFRoZSByZXN1bHRpbmcgbGlzdC4KICAgICAgKgogICAgICAqIEBzZWUgI3JlYWRNYXBYbWwKICAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKQEAgLTQ5MCw2ICs1MTQsMjkgQEAKICAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKICAgICAgICAgcmV0dXJuIChBcnJheUxpc3QpcmVhZFZhbHVlWG1sKHBhcnNlciwgbmV3IFN0cmluZ1sxXSk7CiAgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IGZyb20gYW4gSW5wdXRTdHJlYW0gY29udGFpbmluZyBYTUwuIFRoZSBzdHJlYW0gY2FuCisgICAgICogcHJldmlvdXNseSBoYXZlIGJlZW4gd3JpdHRlbiBieSB3cml0ZVNldFhtbCgpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpbiBUaGUgSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gSGFzaFNldCBUaGUgcmVzdWx0aW5nIHNldC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2VlICNyZWFkVmFsdWVYbWwKKyAgICAgKiBAc2VlICNyZWFkVGhpc1NldFhtbAorICAgICAqIEBzZWUgI3dyaXRlU2V0WG1sCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBIYXNoU2V0IHJlYWRTZXRYbWwoSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gWG1sLm5ld1B1bGxQYXJzZXIoKTsKKyAgICAgICAgcGFyc2VyLnNldElucHV0KGluLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIChIYXNoU2V0KSByZWFkVmFsdWVYbWwocGFyc2VyLCBuZXcgU3RyaW5nWzFdKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSZWFkIGEgSGFzaE1hcCBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC01NzMsNiArNjIwLDQ3IEBACiAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKAogICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlYWQgYSBIYXNoU2V0IG9iamVjdCBmcm9tIGFuIFhtbFB1bGxQYXJzZXIuIFRoZSBYTUwgZGF0YSBjb3VsZCBwcmV2aW91c2x5CisgICAgICogaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB3cml0ZVNldFhtbCgpLiBUaGUgWG1sUHVsbFBhcnNlciBtdXN0IGJlIHBvc2l0aW9uZWQKKyAgICAgKiA8ZW0+YWZ0ZXI8L2VtPiB0aGUgdGFnIHRoYXQgYmVnaW5zIHRoZSBzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIHBhcnNlciBUaGUgWG1sUHVsbFBhcnNlciBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIHNldCBkYXRhLgorICAgICAqIEBwYXJhbSBlbmRUYWcgTmFtZSBvZiB0aGUgdGFnIHRoYXQgd2lsbCBlbmQgdGhlIHNldCwgdXN1YWxseSAic2V0Ii4KKyAgICAgKiBAcGFyYW0gbmFtZSBBbiBhcnJheSBvZiBvbmUgc3RyaW5nLCB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBhdHRyaWJ1dGUKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGUgc2V0J3MgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiBIYXNoU2V0IFRoZSBuZXdseSBnZW5lcmF0ZWQgc2V0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqIAorICAgICAqIEBzZWUgI3JlYWRTZXRYbWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2hTZXQgcmVhZFRoaXNTZXRYbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFN0cmluZyBlbmRUYWcsIFN0cmluZ1tdIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgCisgICAgICAgIGludCBldmVudFR5cGUgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gcGFyc2VyLlNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSByZWFkVGhpc1ZhbHVlWG1sKHBhcnNlciwgbmFtZSk7CisgICAgICAgICAgICAgICAgc2V0LmFkZCh2YWwpOworICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgdG8gc2V0OiAiICsgdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09IHBhcnNlci5FTkRfVEFHKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlci5nZXROYW1lKCkuZXF1YWxzKGVuZFRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgIiArIGVuZFRhZyArICIgZW5kIHRhZyBhdDogIiArIHBhcnNlci5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnRUeXBlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfSB3aGlsZSAoZXZlbnRUeXBlICE9IHBhcnNlci5FTkRfRE9DVU1FTlQpOworICAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRvY3VtZW50IGVuZGVkIGJlZm9yZSAiICsgZW5kVGFnICsgIiBlbmQgdGFnIik7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZCBhbiBpbnRbXSBvYmplY3QgZnJvbSBhbiBYbWxQdWxsUGFyc2VyLiAgVGhlIFhNTCBkYXRhIGNvdWxkCkBAIC03NDAsNiArODI4LDEyIEBACiAgICAgICAgICAgICBuYW1lWzBdID0gdmFsdWVOYW1lOwogICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJldHVybmluZyB2YWx1ZSBmb3IgIiArIHZhbHVlTmFtZSArICI6ICIgKyByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscygic2V0IikpIHsKKyAgICAgICAgICAgIHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICByZXMgPSByZWFkVGhpc1NldFhtbChwYXJzZXIsICJzZXQiLCBuYW1lKTsKKyAgICAgICAgICAgIG5hbWVbMF0gPSB2YWx1ZU5hbWU7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmV0dXJuaW5nIHZhbHVlIGZvciAiICsgdmFsdWVOYW1lICsgIjogIiArIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlVua25vd24gdGFnOiAiICsgdGFnTmFtZSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9TdGFuZGFsb25lQWN0aW9uTW9kZS5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgxOTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvU3RhbmRhbG9uZUFjdGlvbk1vZGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVQb3B1cEhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBTdGFuZGFsb25lQWN0aW9uTW9kZSBleHRlbmRzIEFjdGlvbk1vZGUgaW1wbGVtZW50cyBNZW51QnVpbGRlci5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUNvbnRleHRWaWV3OworICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1DdXN0b21WaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtRmluaXNoZWQ7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1NZW51OworCisgICAgcHVibGljIFN0YW5kYWxvbmVBY3Rpb25Nb2RlKENvbnRleHQgY29udGV4dCwgQWN0aW9uQmFyQ29udGV4dFZpZXcgdmlldywKKyAgICAgICAgICAgIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGV4dFZpZXcgPSB2aWV3OworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihjb250ZXh0KS5zZXREZWZhdWx0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICBtTWVudS5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFRpdGxlKHRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShDaGFyU2VxdWVuY2Ugc3VidGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFN1YnRpdGxlKHN1YnRpdGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgc2V0VGl0bGUobUNvbnRleHQuZ2V0U3RyaW5nKHJlc0lkKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN1YnRpdGxlKG1Db250ZXh0LmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIG1Db250ZXh0Vmlldy5zZXRDdXN0b21WaWV3KHZpZXcpOworICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXcgIT0gbnVsbCA/IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXc+KHZpZXcpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICBpZiAobUZpbmlzaGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKworICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgbUNvbnRleHRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICByZXR1cm4gbU1lbnU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0Vmlldy5nZXRUaXRsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dFZpZXcuZ2V0U3VidGl0bGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBnZXRDdXN0b21WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbVZpZXcgIT0gbnVsbCA/IG1DdXN0b21WaWV3LmdldCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUluZmxhdGVyIGdldE1lbnVJbmZsYXRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIobUNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uTWVudUl0ZW1TZWxlY3RlZChNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2sub25BY3Rpb25JdGVtQ2xpY2tlZCh0aGlzLCBpdGVtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNsb3NlTWVudShNZW51QnVpbGRlciBtZW51LCBib29sZWFuIGFsbE1lbnVzQXJlQ2xvc2luZykgeworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIG9uU3ViTWVudVNlbGVjdGVkKFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUpIHsKKyAgICAgICAgaWYgKCFzdWJNZW51Lmhhc1Zpc2libGVJdGVtcygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5ldyBNZW51UG9wdXBIZWxwZXIobUNvbnRleHQsIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbG9zZVN1Yk1lbnUoU3ViTWVudUJ1aWxkZXIgbWVudSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIG1Db250ZXh0Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3ViTWVudTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudSBpbXBsZW1lbnRzIE1lbnUgeworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUXdlcnR5OworICAgIAorICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBtSXRlbXM7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoMCwgMCwgMCwgdGl0bGVSZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgaW50IHRpdGxlUmVzKSB7CisgICAgICAgIHJldHVybiBhZGQoZ3JvdXBJZCwgaXRlbUlkLCBvcmRlciwgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKHRpdGxlUmVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZW51SXRlbSBhZGQoaW50IGdyb3VwSWQsIGludCBpdGVtSWQsIGludCBvcmRlciwgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBuZXcgQWN0aW9uTWVudUl0ZW0oZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIGdyb3VwSWQsIGl0ZW1JZCwgMCwgb3JkZXIsIHRpdGxlKTsKKyAgICAgICAgbUl0ZW1zLmFkZChvcmRlciwgaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkSW50ZW50T3B0aW9ucyhpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLAorICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBjYWxsZXIsIEludGVudFtdIHNwZWNpZmljcywgSW50ZW50IGludGVudCwgaW50IGZsYWdzLAorICAgICAgICAgICAgTWVudUl0ZW1bXSBvdXRTcGVjaWZpY0l0ZW1zKSB7CisgICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvbHZlSW5mbz4gbHJpID0KKyAgICAgICAgICAgICAgICBwbS5xdWVyeUludGVudEFjdGl2aXR5T3B0aW9ucyhjYWxsZXIsIHNwZWNpZmljcywgaW50ZW50LCAwKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBscmkgIT0gbnVsbCA/IGxyaS5zaXplKCkgOiAwOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBGTEFHX0FQUEVORF9UT19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgcmVtb3ZlR3JvdXAoZ3JvdXBJZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByaSA9IGxyaS5nZXQoaSk7CisgICAgICAgICAgICBJbnRlbnQgcmludGVudCA9IG5ldyBJbnRlbnQoCisgICAgICAgICAgICAgICAgcmkuc3BlY2lmaWNJbmRleCA8IDAgPyBpbnRlbnQgOiBzcGVjaWZpY3Nbcmkuc3BlY2lmaWNJbmRleF0pOworICAgICAgICAgICAgcmludGVudC5zZXRDb21wb25lbnQobmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8ucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIHJpLmFjdGl2aXR5SW5mby5uYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBNZW51SXRlbSBpdGVtID0gYWRkKGdyb3VwSWQsIGl0ZW1JZCwgb3JkZXIsIHJpLmxvYWRMYWJlbChwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKHJpLmxvYWRJY29uKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEludGVudChyaW50ZW50KTsKKyAgICAgICAgICAgIGlmIChvdXRTcGVjaWZpY0l0ZW1zICE9IG51bGwgJiYgcmkuc3BlY2lmaWNJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0U3BlY2lmaWNJdGVtc1tyaS5zcGVjaWZpY0luZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCB0aXRsZVJlcykgeworICAgICAgICAvLyBUT0RPIEltcGxlbWVudCBzdWJtZW51cworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3ViTWVudSBhZGRTdWJNZW51KGludCBncm91cElkLCBpbnQgaXRlbUlkLCBpbnQgb3JkZXIsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN1Yk1lbnUgYWRkU3ViTWVudShpbnQgZ3JvdXBJZCwgaW50IGl0ZW1JZCwgaW50IG9yZGVyLCBpbnQgdGl0bGVSZXMpIHsKKyAgICAgICAgLy8gVE9ETyBJbXBsZW1lbnQgc3VibWVudXMKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1JdGVtcy5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBmaW5kSXRlbUluZGV4KGludCBpZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXRlbXMuZ2V0KGkpLmdldEl0ZW1JZCgpID09IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZmluZEl0ZW0oaW50IGlkKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuZ2V0KGZpbmRJdGVtSW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Zpc2libGVJdGVtcygpIHsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVJdGVtIGZpbmRJdGVtV2l0aFNob3J0Y3V0KGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAvLyBUT0RPIE1ha2UgdGhpcyBzbWFydGVyLgorICAgICAgICBmaW5hbCBib29sZWFuIHF3ZXJ0eSA9IG1Jc1F3ZXJ0eTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFjdGlvbk1lbnVJdGVtPiBpdGVtcyA9IG1JdGVtczsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1Db3VudCA9IGl0ZW1zLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjdGlvbk1lbnVJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBmaW5hbCBjaGFyIHNob3J0Y3V0ID0gcXdlcnR5ID8gaXRlbS5nZXRBbHBoYWJldGljU2hvcnRjdXQoKSA6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TnVtZXJpY1Nob3J0Y3V0KCk7CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBzaG9ydGN1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dChrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtSWRlbnRpZmllckFjdGlvbihpbnQgaWQsIGludCBmbGFncykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmaW5kSXRlbUluZGV4KGlkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1TaG9ydGN1dChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQsIGludCBmbGFncykgeworICAgICAgICBBY3Rpb25NZW51SXRlbSBpdGVtID0gZmluZEl0ZW1XaXRoU2hvcnRjdXQoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBpdGVtLmludm9rZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKGludCBncm91cElkKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpb25NZW51SXRlbT4gaXRlbXMgPSBtSXRlbXM7CisgICAgICAgIGludCBpdGVtQ291bnQgPSBpdGVtcy5zaXplKCk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpdGVtQ291bnQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtcy5nZXQoaSkuZ2V0R3JvdXBJZCgpID09IGdyb3VwSWQpIHsKKyAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgaXRlbUNvdW50LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oaW50IGlkKSB7CisgICAgICAgIG1JdGVtcy5yZW1vdmUoZmluZEl0ZW1JbmRleChpZCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwQ2hlY2thYmxlKGludCBncm91cCwgYm9vbGVhbiBjaGVja2FibGUsCisgICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2thYmxlKGNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRFeGNsdXNpdmVDaGVja2FibGUoZXhjbHVzaXZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwRW5hYmxlZChpbnQgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwVmlzaWJsZShpbnQgZ3JvdXAsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8QWN0aW9uTWVudUl0ZW0+IGl0ZW1zID0gbUl0ZW1zOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXMuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWN0aW9uTWVudUl0ZW0gaXRlbSA9IGl0ZW1zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEdyb3VwSWQoKSA9PSBncm91cCkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF3ZXJ0eU1vZGUoYm9vbGVhbiBpc1F3ZXJ0eSkgeworICAgICAgICBtSXNRd2VydHkgPSBpc1F3ZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg1MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtIGltcGxlbWVudHMgTWVudUl0ZW0geworICAgIHByaXZhdGUgZmluYWwgaW50IG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNhdGVnb3J5T3JkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU9yZGVyaW5nOworICAgIAorICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGVDb25kZW5zZWQ7CisgICAgcHJpdmF0ZSBJbnRlbnQgbUludGVudDsKKyAgICBwcml2YXRlIGNoYXIgbVNob3J0Y3V0TnVtZXJpY0NoYXI7CisgICAgcHJpdmF0ZSBjaGFyIG1TaG9ydGN1dEFscGhhYmV0aWNDaGFyOworICAgIAorICAgIHByaXZhdGUgRHJhd2FibGUgbUljb25EcmF3YWJsZTsKKyAgICBwcml2YXRlIGludCBtSWNvblJlc0lkID0gTk9fSUNPTjsKKyAgICAKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgCisgICAgcHJpdmF0ZSBNZW51SXRlbS5Pbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtQ2xpY2tMaXN0ZW5lcjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgbUZsYWdzID0gRU5BQkxFRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tBQkxFICAgICAgPSAweDAwMDAwMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVDS0VEICAgICAgICA9IDB4MDAwMDAwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYQ0xVU0lWRSAgICAgID0gMHgwMDAwMDAwNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElEREVOICAgICAgICAgPSAweDAwMDAwMDA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICAgICAgICA9IDB4MDAwMDAwMTA7CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtKENvbnRleHQgY29udGV4dCwgaW50IGdyb3VwLCBpbnQgaWQsIGludCBjYXRlZ29yeU9yZGVyLCBpbnQgb3JkZXJpbmcsCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKKyAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXRBbHBoYWJldGljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7CisgICAgICAgIHJldHVybiBtR3JvdXA7CisgICAgfQorCisgICAgcHVibGljIERyYXdhYmxlIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBtSWNvbkRyYXdhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50KCkgeworICAgICAgICByZXR1cm4gbUludGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dE1lbnVJbmZvIGdldE1lbnVJbmZvKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgY2hhciBnZXROdW1lcmljU2hvcnRjdXQoKSB7CisgICAgICAgIHJldHVybiBtU2hvcnRjdXROdW1lcmljQ2hhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE9yZGVyKCkgeworICAgICAgICByZXR1cm4gbU9yZGVyaW5nOworICAgIH0KKworICAgIHB1YmxpYyBTdWJNZW51IGdldFN1Yk1lbnUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZUNvbmRlbnNlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZUNvbmRlbnNlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJNZW51KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2FibGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tBQkxFKSAhPSAwOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0hFQ0tFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgRU5BQkxFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiAobUZsYWdzICYgSElEREVOKSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBbHBoYWJldGljU2hvcnRjdXQoY2hhciBhbHBoYUNoYXIpIHsKKyAgICAgICAgbVNob3J0Y3V0QWxwaGFiZXRpY0NoYXIgPSBhbHBoYUNoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2FibGUoYm9vbGVhbiBjaGVja2FibGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIH5DSEVDS0FCTEUpIHwgKGNoZWNrYWJsZSA/IENIRUNLQUJMRSA6IDApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbk1lbnVJdGVtIHNldEV4Y2x1c2l2ZUNoZWNrYWJsZShib29sZWFuIGV4Y2x1c2l2ZSkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVYQ0xVU0lWRSkgfCAoZXhjbHVzaXZlID8gRVhDTFVTSVZFIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkNIRUNLRUQpIHwgKGNoZWNrZWQgPyBDSEVDS0VEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtRmxhZ3MgPSAobUZsYWdzICYgfkVOQUJMRUQpIHwgKGVuYWJsZWQgPyBFTkFCTEVEIDogMCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRJY29uKERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IGljb247CisgICAgICAgIG1JY29uUmVzSWQgPSBOT19JQ09OOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SWNvbihpbnQgaWNvblJlcykgeworICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlczsKKyAgICAgICAgbUljb25EcmF3YWJsZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKGljb25SZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0SW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldE51bWVyaWNTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyKSB7CisgICAgICAgIG1TaG9ydGN1dE51bWVyaWNDaGFyID0gbnVtZXJpY0NoYXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lciBtZW51SXRlbUNsaWNrTGlzdGVuZXIpIHsKKyAgICAgICAgbUNsaWNrTGlzdGVuZXIgPSBtZW51SXRlbUNsaWNrTGlzdGVuZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyIG51bWVyaWNDaGFyLCBjaGFyIGFscGhhQ2hhcikgeworICAgICAgICBtU2hvcnRjdXROdW1lcmljQ2hhciA9IG51bWVyaWNDaGFyOworICAgICAgICBtU2hvcnRjdXRBbHBoYWJldGljQ2hhciA9IGFscGhhQ2hhcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtIHNldFRpdGxlKGludCB0aXRsZSkgeworICAgICAgICBtVGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcodGl0bGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VGl0bGVDb25kZW5zZWQoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZUNvbmRlbnNlZCA9IHRpdGxlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgbUZsYWdzID0gKG1GbGFncyAmIEhJRERFTikgfCAodmlzaWJsZSA/IDAgOiBISURERU4pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2UoKSB7CisgICAgICAgIGlmIChtQ2xpY2tMaXN0ZW5lciAhPSBudWxsICYmIG1DbGlja0xpc3RlbmVyLm9uTWVudUl0ZW1DbGljayh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTaG93QXNBY3Rpb24oaW50IHNob3cpIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4gQWN0aW9uTWVudUl0ZW1zIGFsd2F5cyBzaG93IGFzIGFjdGlvbiBidXR0b25zLgorICAgIH0KKworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KFZpZXcgYWN0aW9uVmlldykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MzhjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbk1lbnVJdGVtVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0CisgICAgICAgIGltcGxlbWVudHMgTWVudVZpZXcuSXRlbVZpZXcsIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGlvbk1lbnVJdGVtVmlldyI7CisKKyAgICBwcml2YXRlIE1lbnVJdGVtSW1wbCBtSXRlbURhdGE7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVRpdGxlOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgbUl0ZW1JbnZva2VyOworCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtSW1hZ2VCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbVRleHRCdXR0b247CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBY3Rpb25NZW51SXRlbVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJ1dHRvblN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWN0aW9uTWVudUl0ZW1WaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbiA9IChJbWFnZUJ1dHRvbikgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaW1hZ2VCdXR0b24pOworICAgICAgICBtVGV4dEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnRleHRCdXR0b24pOworICAgICAgICBtSW1hZ2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtVGV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVJdGVtSW1wbCBnZXRJdGVtRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1JdGVtRGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKE1lbnVJdGVtSW1wbCBpdGVtRGF0YSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1JdGVtRGF0YSA9IGl0ZW1EYXRhOworCisgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOworICAgICAgICBzZXRJY29uKGl0ZW1EYXRhLmdldEljb24oKSk7CisgICAgICAgIHNldFRpdGxlKGl0ZW1EYXRhLmdldFRpdGxlKCkpOyAvLyBUaXRsZSBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGVyZSBpcyBubyBpY29uCisgICAgICAgIHNldElkKGl0ZW1EYXRhLmdldEl0ZW1JZCgpKTsKKworICAgICAgICBzZXRWaXNpYmlsaXR5KGl0ZW1EYXRhLmlzVmlzaWJsZSgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgc2V0RW5hYmxlZChpdGVtRGF0YS5pc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgbUltYWdlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIG1UZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JdGVtSW52b2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSXRlbUludm9rZXIuaW52b2tlSXRlbShtSXRlbURhdGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbUludm9rZXIoTWVudUJ1aWxkZXIuSXRlbUludm9rZXIgaW52b2tlcikgeworICAgICAgICBtSXRlbUludm9rZXIgPSBpbnZva2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHByZWZlcnNDb25kZW5zZWRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICAvLyBUT0RPIFN1cHBvcnQgY2hlY2thYmxlIGFjdGlvbiBpdGVtcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1hZ2VCdXR0b24uc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNob3J0Y3V0KGJvb2xlYW4gc2hvd1Nob3J0Y3V0LCBjaGFyIHNob3J0Y3V0S2V5KSB7CisgICAgICAgIC8vIEFjdGlvbiBidXR0b25zIGRvbid0IHNob3cgdGV4dCBmb3Igc2hvcnRjdXQga2V5cy4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisKKyAgICAgICAgLy8gcG9wdWxhdGUgYWNjZXNzaWJpbGl0eSBkZXNjcmlwdGlvbiB3aXRoIHRpdGxlCisgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7CisKKyAgICAgICAgaWYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93c0ljb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkzOWFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uTWVudVZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgaW1wbGVtZW50cyBNZW51QnVpbGRlci5JdGVtSW52b2tlciwgTWVudVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uTWVudVZpZXciOworICAgIAorICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICBwcml2YXRlIGludCBtSXRlbVBhZGRpbmc7CisgICAgcHJpdmF0ZSBpbnQgbUl0ZW1NYXJnaW47CisgICAgcHJpdmF0ZSBpbnQgbU1heEl0ZW1zOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIHByaXZhdGUgT3ZlcmZsb3dNZW51QnV0dG9uIG1PdmVyZmxvd0J1dHRvbjsKKyAgICBwcml2YXRlIE1lbnVQb3B1cEhlbHBlciBtT3ZlcmZsb3dQb3B1cDsKKworICAgIHByaXZhdGUgUnVubmFibGUgbVNob3dPdmVyZmxvdyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfTsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uTWVudVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25NZW51VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIAorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVGhlbWUpOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbkJ1dHRvblBhZGRpbmcsIDApOworICAgICAgICBtSXRlbU1hcmdpbiA9IG1JdGVtUGFkZGluZyAvIDI7CisgICAgICAgIGEucmVjeWNsZSgpOworCisgICAgICAgIC8vIE1lYXN1cmUgZm9yIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICBtTWF4SXRlbXMgPSBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpOworCisgICAgICAgIC8vIFRPRE8gVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0byBpbmRpY2F0ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBoYXJkIG1lbnUga2V5LgorICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBmaW5hbCBpbnQgc2NyZWVuID0gbmV3Q29uZmlnLnNjcmVlbkxheW91dDsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IChzY3JlZW4gJiBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spID09CisgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CisgICAgICAgIG1NYXhJdGVtcyA9IG1lYXN1cmVNYXhBY3Rpb25CdXR0b25zKCk7CisgICAgICAgIGlmIChtTWVudSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWVudS5zZXRNYXhBY3Rpb25JdGVtcyhtTWF4SXRlbXMpOworICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdmVyZmxvd1BvcHVwICE9IG51bGwgJiYgbU92ZXJmbG93UG9wdXAuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgIG1PdmVyZmxvd1BvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgICAgIHBvc3QobVNob3dPdmVyZmxvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlTWF4QWN0aW9uQnV0dG9ucygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5hY3Rpb25faWNvbl9zaXplKTsKKyAgICAgICAgZmluYWwgaW50IHNwYWNlQXZhaWxhYmxlID0gcmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyOworICAgICAgICBmaW5hbCBpbnQgaXRlbVNwYWNlID0gc2l6ZSArIG1JdGVtUGFkZGluZzsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzcGFjZUF2YWlsYWJsZSAvIChpdGVtU3BhY2UgPiAwID8gaXRlbVNwYWNlIDogMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd1Jlc2VydmVkKCkgeworICAgICAgICByZXR1cm4gbVJlc2VydmVPdmVyZmxvdzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcmZsb3dSZXNlcnZlZChib29sZWFuIHJlc2VydmVPdmVyZmxvdykgeworICAgICAgICBtUmVzZXJ2ZU92ZXJmbG93ID0gcmVzZXJ2ZU92ZXJmbG93OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcCkgeworICAgICAgICBpZiAocCBpbnN0YW5jZW9mIExheW91dFBhcmFtcykgeworICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgcDsKKyAgICAgICAgICAgIHJldHVybiBscC5sZWZ0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmIGxwLnJpZ2h0TWFyZ2luID09IG1JdGVtTWFyZ2luICYmCisgICAgICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPT0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgJiYKKyAgICAgICAgICAgICAgICAgICAgbHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCAmJiBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOworICAgICAgICBwYXJhbXMubGVmdE1hcmdpbiA9IG1JdGVtTWFyZ2luOworICAgICAgICBwYXJhbXMucmlnaHRNYXJnaW4gPSBtSXRlbU1hcmdpbjsKKyAgICAgICAgcGFyYW1zLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEl0ZW1NYXJnaW4oKSB7CisgICAgICAgIHJldHVybiBtSXRlbU1hcmdpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VJdGVtKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBtTWVudS5wZXJmb3JtSXRlbUFjdGlvbihpdGVtLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdpbmRvd0FuaW1hdGlvbnMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWVudUJ1aWxkZXIgbWVudSwgaW50IG1lbnVUeXBlKSB7CisgICAgICAgIG1lbnUuc2V0TWF4QWN0aW9uSXRlbXMobU1heEl0ZW1zKTsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICB1cGRhdGVDaGlsZHJlbih0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDaGlsZHJlbihib29sZWFuIGNsZWFyZWQpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNlcnZlT3ZlcmZsb3cgPSBtUmVzZXJ2ZU92ZXJmbG93OworICAgICAgICByZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gaXRlbXNUb1Nob3cgPSBtTWVudS5nZXRBY3Rpb25JdGVtcyhyZXNlcnZlT3ZlcmZsb3cpOworICAgICAgICBmaW5hbCBpbnQgaXRlbUNvdW50ID0gaXRlbXNUb1Nob3cuc2l6ZSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW1JbXBsIGl0ZW1EYXRhID0gaXRlbXNUb1Nob3cuZ2V0KGkpOworICAgICAgICAgICAgZmluYWwgVmlldyBhY3Rpb25WaWV3ID0gaXRlbURhdGEuZ2V0QWN0aW9uVmlldygpOworICAgICAgICAgICAgaWYgKGFjdGlvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFZpZXcoYWN0aW9uVmlldyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZEl0ZW1WaWV3KChBY3Rpb25NZW51SXRlbVZpZXcpIGl0ZW1EYXRhLmdldEl0ZW1WaWV3KAorICAgICAgICAgICAgICAgICAgICAgICAgTWVudUJ1aWxkZXIuVFlQRV9BQ1RJT05fQlVUVE9OLCB0aGlzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzZXJ2ZU92ZXJmbG93KSB7CisgICAgICAgICAgICBpZiAobU1lbnUuZ2V0Tm9uQWN0aW9uSXRlbXModHJ1ZSkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIE92ZXJmbG93TWVudUJ1dHRvbiBidXR0b24gPSBuZXcgT3ZlcmZsb3dNZW51QnV0dG9uKG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KGJ1dHRvbik7CisgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uID0gYnV0dG9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51UG9wdXBIZWxwZXIgcG9wdXAgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVudVBvcHVwSGVscGVyKGdldENvbnRleHQoKSwgbU1lbnUsIG1PdmVyZmxvd0J1dHRvbiwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBQb3N0IHRoaXMgZm9yIGxhdGVyOyB3ZSBtaWdodCBzdGlsbCBuZWVkIGEgbGF5b3V0IGZvciB0aGUgYW5jaG9yIHRvIGJlIHJpZ2h0LgorICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBwb3B1cC5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dQb3B1cCA9IHBvcHVwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgTWVudVBvcHVwSGVscGVyIHBvcHVwID0gbU92ZXJmbG93UG9wdXA7CisgICAgICAgIGlmIChwb3B1cCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcG9wdXAuaXNTaG93aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIE1lbnVQb3B1cEhlbHBlciBwb3B1cCA9IG1PdmVyZmxvd1BvcHVwOworICAgICAgICBpZiAocG9wdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgcG9wdXAuZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtVmlldyhBY3Rpb25NZW51SXRlbVZpZXcgdmlldykgeworICAgICAgICB2aWV3LnNldEl0ZW1JbnZva2VyKHRoaXMpOworICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT3ZlcmZsb3dNZW51QnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24geworICAgICAgICBwdWJsaWMgT3ZlcmZsb3dNZW51QnV0dG9uKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBzZXRFbmFibGVkKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKKyAgICAgICAgICAgIGlmIChzdXBlci5wZXJmb3JtQ2xpY2soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGFuZ2UgdG8gb3ZlcmZsb3cgbW9kZQorICAgICAgICAgICAgbU1lbnUuZ2V0Q2FsbGJhY2soKS5vbk1lbnVNb2RlQ2hhbmdlKG1NZW51KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvSWNvbk1lbnVWaWV3LmphdmEKaW5kZXggYmViNTdiYS4uMTc4ZGNkZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51Vmlldy5qYXZhCkBAIC0zMzcsNyArMzM3LDkgQEAKICAgICAgICAgLy8gVGhpcyBtZXRob2QgZG9lcyBhIGNsZWFyIHJlZnJlc2ggb2YgY2hpbGRyZW4KICAgICAgICAgcmVtb3ZlQWxsVmlld3MoKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGl0ZW1zVG9TaG93ID0gbU1lbnUuZ2V0VmlzaWJsZUl0ZW1zKCk7CisgICAgICAgIC8vIEljb25NZW51VmlldyBuZXZlciB3YW50cyBjb250ZW50IHNvcnRlZCBmb3IgYW4gb3ZlcmZsb3cgYWN0aW9uIGJ1dHRvbiwgc2luY2UKKyAgICAgICAgLy8gaXQgaXMgbmV2ZXIgdXNlZCBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gb3ZlcmZsb3cgYnV0dG9uLgorICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBpdGVtc1RvU2hvdyA9IG1NZW51LmdldE5vbkFjdGlvbkl0ZW1zKGZhbHNlKTsKICAgICAgICAgZmluYWwgaW50IG51bUl0ZW1zID0gaXRlbXNUb1Nob3cuc2l6ZSgpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSXRlbXNUaGF0Q2FuRml0ID0gbU1heEl0ZW1zOwogICAgICAgICAvLyBNaW5pbXVtIG9mIHRoZSBudW0gdGhhdCBjYW4gZml0IGFuZCB0aGUgbnVtIHRoYXQgd2UgaGF2ZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCmluZGV4IDIyOGQ1ZDAuLjc0OTI1N2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKQEAgLTI3LDE2ICsyNywxNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlDaGFyYWN0ZXJNYXA7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKQEAgLTU0LDcgKzU1LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVEFHID0gIk1lbnVCdWlsZGVyIjsKICAgICAKICAgICAvKiogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgbWVudSB0eXBlcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTV9UWVBFUyA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RZUEVTID0gNTsKICAgICAvKiogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIGljb24gbWVudSB2aWV3ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JQ09OID0gMDsKICAgICAvKiogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgdGhlIGV4cGFuZGVkIG1lbnUgdmlldyAqLwpAQCAtNjUsMTQgKzY2LDI3IEBACiAgICAgICogaGF2ZSBhbiBJdGVtVmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RJQUxPRyA9IDI7CisgICAgLyoqCisgICAgICogVGhlIG1lbnUgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBidXR0b24gaW4gdGhlIGFwcGxpY2F0aW9uJ3MgYWN0aW9uIGJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0FDVElPTl9CVVRUT04gPSAzOworICAgIC8qKgorICAgICAqIFRoZSBtZW51IHR5cGUgdGhhdCByZXByZXNlbnRzIGEgbWVudSBwb3B1cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BPUFVQID0gNDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXU19UQUcgPSAiYW5kcm9pZDp2aWV3cyI7Ci0gICAgCisKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKKyAgICAvLyBTcGVjaWFsIHZhbHVlczoKKyAgICAvLyAwOiBVc2UgdGhlIHN5c3RlbSBkZWZhdWx0IHRoZW1lCisgICAgLy8gLTE6IFVzZSB0aGUgYXBwJ3Mgb3duIHRoZW1lCiAgICAgc3RhdGljIGZpbmFsIGludCBUSEVNRV9SRVNfRk9SX1RZUEVbXSA9IG5ldyBpbnRbXSB7CiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfSWNvbk1lbnUsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfRXhwYW5kZWRNZW51LAogICAgICAgICAwLAorICAgICAgICAtMSwKKyAgICAgICAgLTEsCiAgICAgfTsKICAgICAKICAgICAvLyBPcmRlciBtdXN0IGJlIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBUWVBFXyoKQEAgLTgwLDYgKzk0LDggQEAKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuaWNvbl9tZW51X2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuZXhwYW5kZWRfbWVudV9sYXlvdXQsCiAgICAgICAgIDAsCisgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LmFjdGlvbl9tZW51X2xheW91dCwKKyAgICAgICAgMCwKICAgICB9OwogCiAgICAgLy8gT3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBvcmRlciBhcyB0aGUgVFlQRV8qCkBAIC04Nyw2ICsxMDMsOCBAQAogICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5pY29uX21lbnVfaXRlbV9sYXlvdXQsCiAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0Lmxpc3RfbWVudV9pdGVtX2xheW91dCwKICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAorICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hY3Rpb25fbWVudV9pdGVtX2xheW91dCwKKyAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQubGlzdF9tZW51X2l0ZW1fbGF5b3V0LAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSAgc0NhdGVnb3J5VG9PcmRlciA9IG5ldyBpbnRbXSB7CkBAIC0xMzAsNiArMTQ4LDM1IEBACiAgICAgICogZmV0Y2hlZCBmcm9tIHtAbGluayAjZ2V0VmlzaWJsZUl0ZW1zKCl9CiAgICAgICovIAogICAgIHByaXZhdGUgYm9vbGVhbiBtSXNWaXNpYmxlSXRlbXNTdGFsZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvbmx5IHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIEFjdGlvbiBCYXIsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBtQWN0aW9uSXRlbXM7CisgICAgLyoqCisgICAgICogQ29udGFpbnMgaXRlbXMgdGhhdCBzaG91bGQgTk9UIGFwcGVhciBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IG1Ob25BY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZpc2libGUgYWN0aW9uIGJ1dHRvbnMgcGVybWl0dGVkIGluIHRoaXMgbWVudQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1NYXhBY3Rpb25JdGVtczsKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbXMgKG9yIGFueSBvbmUgaXRlbSdzIGFjdGlvbiBzdGF0ZSkgaGFzIGNoYW5nZWQgc2luY2UgaXQgd2FzCisgICAgICogbGFzdCBmZXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25JdGVtc1N0YWxlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgcHJvY2VzcyBvZiBncmFudGluZyBzcGFjZSBhcyBhY3Rpb24gaXRlbXMgc2hvdWxkIHJlc2VydmUgYSBzcGFjZSBmb3IKKyAgICAgKiBhbiBvdmVyZmxvdyBvcHRpb24gaW4gdGhlIGFjdGlvbiBsaXN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZUFjdGlvbk92ZXJmbG93OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgaG93IGFkZGVkIGl0ZW1zIHNob3VsZCBzaG93IGluIHRoZSBhY3Rpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtRGVmYXVsdFNob3dBc0FjdGlvbiA9IE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX05FVkVSOwogCiAgICAgLyoqCiAgICAgICogQ3VycmVudCB1c2UgY2FzZSBpcyBDb250ZXh0IE1lbnVzOiBBcyBWaWV3cyBwb3B1bGF0ZSB0aGUgY29udGV4dCBtZW51LCBlYWNoIG9uZSBoYXMKQEAgLTE3Niw4ICsyMjMsOSBAQAogICAgICAgICBMYXlvdXRJbmZsYXRlciBnZXRJbmZsYXRlcigpIHsKICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbmZsYXRlciB0aGF0IHVzZXMgdGhlIGdpdmVuIHRoZW1lIGZvciB0aGUgVmlld3MgaXQgaW5mbGF0ZXMKICAgICAgICAgICAgIGlmIChtSW5mbGF0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdKTsgCisgICAgICAgICAgICAgICAgaW50IHRoZW1lUmVzRm9yVHlwZSA9IFRIRU1FX1JFU19GT1JfVFlQRVttTWVudVR5cGVdOworICAgICAgICAgICAgICAgIENvbnRleHQgd3JhcHBlZENvbnRleHQgPSB0aGVtZVJlc0ZvclR5cGUgPCAwID8gbUNvbnRleHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIobUNvbnRleHQsIHRoZW1lUmVzRm9yVHlwZSk7CiAgICAgICAgICAgICAgICAgbUluZmxhdGVyID0gKExheW91dEluZmxhdGVyKSB3cmFwcGVkQ29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CiAgICAgICAgICAgICB9CkBAIC0yODEsMTAgKzMyOSwxOSBAQAogICAgICAgICBtVmlzaWJsZUl0ZW1zID0gbmV3IEFycmF5TGlzdDxNZW51SXRlbUltcGw+KCk7CiAgICAgICAgIG1Jc1Zpc2libGVJdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCisgICAgICAgIG1BY3Rpb25JdGVtcyA9IG5ldyBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4oKTsKKyAgICAgICAgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgIAogICAgICAgICBtU2hvcnRjdXRzVmlzaWJsZSA9CiAgICAgICAgICAgICAgICAgKG1SZXNvdXJjZXMuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkICE9IENvbmZpZ3VyYXRpb24uS0VZQk9BUkRfTk9LRVlTKTsKICAgICB9CiAgICAgCisgICAgcHVibGljIE1lbnVCdWlsZGVyIHNldERlZmF1bHRTaG93QXNBY3Rpb24oaW50IGRlZmF1bHRTaG93QXNBY3Rpb24pIHsKKyAgICAgICAgbURlZmF1bHRTaG93QXNBY3Rpb24gPSBkZWZhdWx0U2hvd0FzQWN0aW9uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCiAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQpAQCAtMzY4LDcgKzQyNSw4IEBACiAgICAgcHJpdmF0ZSBNZW51SXRlbSBhZGRJbnRlcm5hbChpbnQgZ3JvdXAsIGludCBpZCwgaW50IGNhdGVnb3J5T3JkZXIsIENoYXJTZXF1ZW5jZSB0aXRsZSkgewogICAgICAgICBmaW5hbCBpbnQgb3JkZXJpbmcgPSBnZXRPcmRlcmluZyhjYXRlZ29yeU9yZGVyKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsIG9yZGVyaW5nLCB0aXRsZSk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbmV3IE1lbnVJdGVtSW1wbCh0aGlzLCBncm91cCwgaWQsIGNhdGVnb3J5T3JkZXIsCisgICAgICAgICAgICAgICAgb3JkZXJpbmcsIHRpdGxlLCBtRGVmYXVsdFNob3dBc0FjdGlvbik7CiAKICAgICAgICAgaWYgKG1DdXJyZW50TWVudUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gUGFzcyBhbG9uZyB0aGUgY3VycmVudCBtZW51IGluZm8KQEAgLTYzMyw2ICs2OTEsMTEgQEAKICAgICAgICAgcmV0dXJuIG1JdGVtcy5nZXQoaW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBNZW51SXRlbSBnZXRPdmVyZmxvd0l0ZW0oaW50IGluZGV4KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtcy5nZXQoaW5kZXgpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hvcnRjdXRLZXkoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHJldHVybiBmaW5kSXRlbVdpdGhTaG9ydGN1dEZvcktleShrZXlDb2RlLCBldmVudCkgIT0gbnVsbDsKICAgICB9CkBAIC05MDAsNiArOTYzLDcgQEAKICAgICBwcml2YXRlIHZvaWQgb25JdGVtc0NoYW5nZWQoYm9vbGVhbiBjbGVhcmVkKSB7CiAgICAgICAgIGlmICghbVByZXZlbnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc1Zpc2libGVJdGVtc1N0YWxlID09IGZhbHNlKSBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlzQWN0aW9uSXRlbXNTdGFsZSA9PSBmYWxzZSkgbUlzQWN0aW9uSXRlbXNTdGFsZSA9IHRydWU7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIE1lbnVUeXBlW10gbWVudVR5cGVzID0gbU1lbnVUeXBlczsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RZUEVTOyBpKyspIHsKQEAgLTkyMCw2ICs5ODQsMTUgQEAKICAgICAgICAgb25JdGVtc0NoYW5nZWQoZmFsc2UpOwogICAgIH0KICAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lbnVJdGVtSW1wbH0gd2hlbiBpdHMgYWN0aW9uIHJlcXVlc3Qgc3RhdHVzIGlzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdGhhdCBoYXMgZ29uZSB0aHJvdWdoIGEgY2hhbmdlIGluIGFjdGlvbiByZXF1ZXN0IHN0YXR1cy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSXRlbUFjdGlvblJlcXVlc3RDaGFuZ2VkKE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIC8vIE5vdGlmeSBvZiBpdGVtcyBiZWluZyBjaGFuZ2VkCisgICAgICAgIG9uSXRlbXNDaGFuZ2VkKGZhbHNlKTsKKyAgICB9CisgICAgCiAgICAgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gZ2V0VmlzaWJsZUl0ZW1zKCkgewogICAgICAgICBpZiAoIW1Jc1Zpc2libGVJdGVtc1N0YWxlKSByZXR1cm4gbVZpc2libGVJdGVtczsKICAgICAgICAgCkBAIC05MzQsOSArMTAwNyw4MyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBtSXNWaXNpYmxlSXRlbXNTdGFsZSA9IGZhbHNlOworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIHJldHVybiBtVmlzaWJsZUl0ZW1zOwogICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmxhZ0FjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGlmIChyZXNlcnZlQWN0aW9uT3ZlcmZsb3cgIT0gbVJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICAgICAgbVJlc2VydmVBY3Rpb25PdmVyZmxvdyA9IHJlc2VydmVBY3Rpb25PdmVyZmxvdzsKKyAgICAgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNBY3Rpb25JdGVtc1N0YWxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiB2aXNpYmxlSXRlbXMgPSBnZXRWaXNpYmxlSXRlbXMoKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1zU2l6ZSA9IHZpc2libGVJdGVtcy5zaXplKCk7CisgICAgICAgIGludCBtYXhBY3Rpb25zID0gbU1heEFjdGlvbkl0ZW1zOworCisgICAgICAgIGludCByZXF1aXJlZEl0ZW1zID0gMDsKKyAgICAgICAgaW50IHJlcXVlc3RlZEl0ZW1zID0gMDsKKyAgICAgICAgYm9vbGVhbiBoYXNPdmVyZmxvdyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IHZpc2libGVJdGVtcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnJlcXVlc3RzQWN0aW9uQnV0dG9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJdGVtcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXNPdmVyZmxvdyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNlcnZlIGEgc3BvdCBmb3IgdGhlIG92ZXJmbG93IGl0ZW0gaWYgbmVlZGVkLgorICAgICAgICBpZiAocmVzZXJ2ZUFjdGlvbk92ZXJmbG93ICYmCisgICAgICAgICAgICAgICAgKGhhc092ZXJmbG93IHx8IHJlcXVpcmVkSXRlbXMgKyByZXF1ZXN0ZWRJdGVtcyA+IG1heEFjdGlvbnMpKSB7CisgICAgICAgICAgICBtYXhBY3Rpb25zLS07CisgICAgICAgIH0KKyAgICAgICAgbWF4QWN0aW9ucyAtPSByZXF1aXJlZEl0ZW1zOworCisgICAgICAgIC8vIEZsYWcgYXMgbWFueSBtb3JlIHJlcXVlc3RlZCBpdGVtcyBhcyB3aWxsIGZpdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0ucmVxdWVzdHNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXNBY3Rpb25CdXR0b24obWF4QWN0aW9ucyA+IDApOworICAgICAgICAgICAgICAgIG1heEFjdGlvbnMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3Rpb25JdGVtcy5jbGVhcigpOworICAgICAgICBtTm9uQWN0aW9uSXRlbXMuY2xlYXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtc1NpemU7IGkrKykgeworICAgICAgICAgICAgTWVudUl0ZW1JbXBsIGl0ZW0gPSB2aXNpYmxlSXRlbXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW0uaXNBY3Rpb25CdXR0b24oKSkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ob25BY3Rpb25JdGVtcy5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtSXNBY3Rpb25JdGVtc1N0YWxlID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIEFycmF5TGlzdDxNZW51SXRlbUltcGw+IGdldEFjdGlvbkl0ZW1zKGJvb2xlYW4gcmVzZXJ2ZUFjdGlvbk92ZXJmbG93KSB7CisgICAgICAgIGZsYWdBY3Rpb25JdGVtcyhyZXNlcnZlQWN0aW9uT3ZlcmZsb3cpOworICAgICAgICByZXR1cm4gbUFjdGlvbkl0ZW1zOworICAgIH0KKyAgICAKKyAgICBBcnJheUxpc3Q8TWVudUl0ZW1JbXBsPiBnZXROb25BY3Rpb25JdGVtcyhib29sZWFuIHJlc2VydmVBY3Rpb25PdmVyZmxvdykgeworICAgICAgICBmbGFnQWN0aW9uSXRlbXMocmVzZXJ2ZUFjdGlvbk92ZXJmbG93KTsKKyAgICAgICAgcmV0dXJuIG1Ob25BY3Rpb25JdGVtczsKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRNYXhBY3Rpb25JdGVtcyhpbnQgbWF4QWN0aW9uSXRlbXMpIHsKKyAgICAgICAgbU1heEFjdGlvbkl0ZW1zID0gbWF4QWN0aW9uSXRlbXM7CisgICAgICAgIG1Jc0FjdGlvbkl0ZW1zU3RhbGUgPSB0cnVlOworICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFySGVhZGVyKCkgewogICAgICAgICBtSGVhZGVySWNvbiA9IG51bGw7CkBAIC0xMDc4LDYgKzEyMjUsMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBNZW51QWRhcHRlcihtZW51VHlwZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyBhbiBhZGFwdGVyIGZvciBwcm92aWRpbmcgb3ZlcmZsb3cgKG5vbi1hY3Rpb24pIGl0ZW1zIGFuZCB0aGVpciB2aWV3cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51VHlwZSBUaGUgdHlwZSBvZiBtZW51IHRvIGdldCBhbiBhZGFwdGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIEEge0BsaW5rIE1lbnVBZGFwdGVyfSBmb3IgdGhpcyBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUFkYXB0ZXIgZ2V0T3ZlcmZsb3dNZW51QWRhcHRlcihpbnQgbWVudVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVyZmxvd01lbnVBZGFwdGVyKG1lbnVUeXBlKTsKKyAgICB9CisKICAgICB2b2lkIHNldE9wdGlvbmFsSWNvbnNWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewogICAgICAgICBtT3B0aW9uYWxJY29uc1Zpc2libGUgPSB2aXNpYmxlOwogICAgIH0KQEAgLTExNTUsOCArMTMxMiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbikpLmdldEl0ZW1WaWV3KG1NZW51VHlwZSwgcGFyZW50KTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVudVZpZXcuSXRlbVZpZXcgaXRlbVZpZXcgPSAoTWVudVZpZXcuSXRlbVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGl0ZW1WaWV3LmdldEl0ZW1EYXRhKCkuc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKworICAgICAgICAgICAgICAgIE1lbnVJdGVtSW1wbCBpdGVtID0gKE1lbnVJdGVtSW1wbCkgZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgaXRlbVZpZXcuaW5pdGlhbGl6ZShpdGVtLCBtTWVudVR5cGUpOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBpdGVtVmlldyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZW51SXRlbUltcGwgaXRlbSA9IChNZW51SXRlbUltcGwpIGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgICAgIGl0ZW0uc2V0SXRlbVZpZXcobU1lbnVUeXBlLCBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRJdGVtVmlldyhtTWVudVR5cGUsIHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIGFuIHtAbGluayBBZGFwdGVyVmlld30gdG8gdXNlIHRoaXMge0BsaW5rIE1lbnVCdWlsZGVyfSBhcyBhIGRhdGEKKyAgICAgKiBzb3VyY2UgZm9yIG92ZXJmbG93IG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBsaXN0IG9mIGFjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJmbG93TWVudUFkYXB0ZXIgZXh0ZW5kcyBNZW51QWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lbnVJdGVtSW1wbD4gbU92ZXJmbG93SXRlbXM7CisKKyAgICAgICAgcHVibGljIE92ZXJmbG93TWVudUFkYXB0ZXIoaW50IG1lbnVUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihtZW51VHlwZSk7CisgICAgICAgICAgICBtT3ZlcmZsb3dJdGVtcyA9IGdldE5vbkFjdGlvbkl0ZW1zKHRydWUpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SXRlbUltcGwgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtT3ZlcmZsb3dJdGVtcy5nZXQocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbU92ZXJmbG93SXRlbXMuc2l6ZSgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggOWI1ODIwNS4uNDJmOTc3MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC03NCw2ICs3NCwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWENMVVNJVkUgICAgICA9IDB4MDAwMDAwMDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJRERFTiAgICAgICAgID0gMHgwMDAwMDAwODsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFRCAgICAgICAgPSAweDAwMDAwMDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU19BQ1RJT04gICAgICA9IDB4MDAwMDAwMjA7CisKKyAgICBwcml2YXRlIGludCBtU2hvd0FzQWN0aW9uID0gU0hPV19BU19BQ1RJT05fTkVWRVI7CisKKyAgICBwcml2YXRlIFZpZXcgbUFjdGlvblZpZXc7CiAKICAgICAvKiogVXNlZCBmb3IgdGhlIGljb24gcmVzb3VyY2UgSUQgaWYgdGhpcyBpdGVtIGRvZXMgbm90IGhhdmUgYW4gaWNvbiAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fSUNPTiA9IDA7CkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgdG8gZGlzcGxheSBmb3IgdGhlIGl0ZW0uCiAgICAgICovCiAgICAgTWVudUl0ZW1JbXBsKE1lbnVCdWlsZGVyIG1lbnUsIGludCBncm91cCwgaW50IGlkLCBpbnQgY2F0ZWdvcnlPcmRlciwgaW50IG9yZGVyaW5nLAotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUsIGludCBzaG93QXNBY3Rpb24pIHsKIAogICAgICAgICBpZiAoc1ByZXBlbmRTaG9ydGN1dExhYmVsID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFVJIHRocmVhZCwgc28gbm8gY2hhbmNlIG9mIHN5bmMgaXNzdWVzIApAQCAtMTI2LDYgKzEzMSw3IEBACiAgICAgICAgIG1DYXRlZ29yeU9yZGVyID0gY2F0ZWdvcnlPcmRlcjsKICAgICAgICAgbU9yZGVyaW5nID0gb3JkZXJpbmc7CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBtU2hvd0FzQWN0aW9uID0gc2hvd0FzQWN0aW9uOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTU4MCw2ICs1ODYsMTAgQEAKICAgICAgICAgcmV0dXJuIChWaWV3KSBtSXRlbVZpZXdzW21lbnVUeXBlXS5nZXQoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldEl0ZW1WaWV3KGludCBtZW51VHlwZSwgSXRlbVZpZXcgdmlldykgeworICAgICAgICBtSXRlbVZpZXdzW21lbnVUeXBlXSA9IG5ldyBXZWFrUmVmZXJlbmNlPEl0ZW1WaWV3Pih2aWV3KTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemVzIGEgbWVudSBpdGVtIHZpZXcgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBNZW51Vmlldy5JdGVtVmlld30uCiAgICAgICogQHBhcmFtIG1lbnVUeXBlIFRoZSB0eXBlIG9mIG1lbnUgdG8gZ2V0IGEgVmlldyBmb3IgKG11c3QgYmUgb25lIG9mCkBAIC02MjgsNiArNjM4LDQzIEBACiAgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBnaXZlbiBtZW51IHR5cGUgc2hvdWxkIHNob3cgaWNvbnMgZm9yIG1lbnUgaXRlbXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2hvd0ljb24oaW50IG1lbnVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBtZW51VHlwZSA9PSBNZW51QnVpbGRlci5UWVBFX0lDT04gfHwgbU1lbnUuZ2V0T3B0aW9uYWxJY29uc1Zpc2libGUoKTsKKyAgICAgICAgcmV0dXJuIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfSUNPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfQUNUSU9OX0JVVFRPTiB8fAorICAgICAgICAgICAgICAgIG1lbnVUeXBlID09IE1lbnVCdWlsZGVyLlRZUEVfUE9QVVAgfHwKKyAgICAgICAgICAgICAgICBtTWVudS5nZXRPcHRpb25hbEljb25zVmlzaWJsZSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBJU19BQ1RJT04pID09IElTX0FDVElPTiB8fCByZXF1aXJlc0FjdGlvbkJ1dHRvbigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1ZXN0c0FjdGlvbkJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TaG93QXNBY3Rpb24gPT0gU0hPV19BU19BQ1RJT05fSUZfUk9PTTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBY3Rpb25CdXR0b24oKSB7CisgICAgICAgIHJldHVybiBtU2hvd0FzQWN0aW9uID09IFNIT1dfQVNfQUNUSU9OX0FMV0FZUzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGlvbkJ1dHRvbihib29sZWFuIGlzQWN0aW9uQnV0dG9uKSB7CisgICAgICAgIGlmIChpc0FjdGlvbkJ1dHRvbikgeworICAgICAgICAgICAgbUZsYWdzIHw9IElTX0FDVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+SVNfQUNUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2hvd0FzQWN0aW9uKGludCBhY3Rpb25FbnVtKSB7CisgICAgICAgIG1TaG93QXNBY3Rpb24gPSBhY3Rpb25FbnVtOworICAgICAgICBtTWVudS5vbkl0ZW1BY3Rpb25SZXF1ZXN0Q2hhbmdlZCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0QWN0aW9uVmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgbUFjdGlvblZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUFjdGlvblZpZXc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyYTRkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlci5NZW51QWRhcHRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RQb3B1cFdpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cFdpbmRvdzsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTWVudVBvcHVwSGVscGVyIGltcGxlbWVudHMgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciwgVmlldy5PbktleUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lbnVQb3B1cEhlbHBlciI7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMaXN0UG9wdXBXaW5kb3cgbVBvcHVwOworICAgIHByaXZhdGUgTWVudUJ1aWxkZXIgbU1lbnU7CisgICAgcHJpdmF0ZSBpbnQgbVBvcHVwTWF4V2lkdGg7CisgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPFZpZXc+IG1BbmNob3JWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dPbmx5OworCisgICAgcHJpdmF0ZSBQb3B1cFdpbmRvdy5PbkRpc21pc3NMaXN0ZW5lciBtRGlzbWlzc0xpc3RlbmVyID0gbmV3IFBvcHVwV2luZG93Lk9uRGlzbWlzc0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoKSB7CisgICAgICAgICAgICBtUG9wdXAgPSBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbWVudSwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZW51UG9wdXBIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBNZW51QnVpbGRlciBtZW51LCBWaWV3IGFuY2hvclZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBtZW51LCBhbmNob3JWaWV3LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lbnVQb3B1cEhlbHBlcihDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUsCisgICAgICAgICAgICBWaWV3IGFuY2hvclZpZXcsIGJvb2xlYW4gb3ZlcmZsb3dPbmx5KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbU1lbnUgPSBtZW51OworICAgICAgICBtT3ZlcmZsb3dPbmx5ID0gb3ZlcmZsb3dPbmx5OworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIG1Qb3B1cE1heFdpZHRoID0gbWV0cmljcy53aWR0aFBpeGVscyAvIDI7CisKKyAgICAgICAgaWYgKGFuY2hvclZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFuY2hvclZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3PihhbmNob3JWaWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisgICAgICAgIC8vIFRPRE8gVXNlIGEgc3R5bGUgZnJvbSB0aGUgdGhlbWUgaGVyZQorICAgICAgICBtUG9wdXAgPSBuZXcgTGlzdFBvcHVwV2luZG93KG1Db250ZXh0LCBudWxsLCAwLAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuV2lkZ2V0X1NwaW5uZXIpOworICAgICAgICBtUG9wdXAuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVBvcHVwLnNldE9uRGlzbWlzc0xpc3RlbmVyKG1EaXNtaXNzTGlzdGVuZXIpOworCisgICAgICAgIGZpbmFsIE1lbnVBZGFwdGVyIGFkYXB0ZXIgPSBtT3ZlcmZsb3dPbmx5ID8KKyAgICAgICAgICAgICAgICBtTWVudS5nZXRPdmVyZmxvd01lbnVBZGFwdGVyKE1lbnVCdWlsZGVyLlRZUEVfUE9QVVApIDoKKyAgICAgICAgICAgICAgICBtTWVudS5nZXRNZW51QWRhcHRlcihNZW51QnVpbGRlci5UWVBFX1BPUFVQKTsKKyAgICAgICAgbVBvcHVwLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIG1Qb3B1cC5zZXRNb2RhbCh0cnVlKTsKKworICAgICAgICBpZiAobUFuY2hvclZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBvcHVwLnNldEFuY2hvclZpZXcobUFuY2hvclZpZXcuZ2V0KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1NZW51IGluc3RhbmNlb2YgU3ViTWVudUJ1aWxkZXIpIHsKKyAgICAgICAgICAgIFN1Yk1lbnVCdWlsZGVyIHN1Yk1lbnUgPSAoU3ViTWVudUJ1aWxkZXIpIG1NZW51OworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW1JbXBsIGl0ZW1JbXBsID0gKE1lbnVJdGVtSW1wbCkgc3ViTWVudS5nZXRJdGVtKCk7CisgICAgICAgICAgICBtUG9wdXAuc2V0QW5jaG9yVmlldyhpdGVtSW1wbC5nZXRJdGVtVmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIG51bGwpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lbnVQb3B1cEhlbHBlciBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGFuIGFuY2hvciIpOworICAgICAgICB9CisKKyAgICAgICAgbVBvcHVwLnNldENvbnRlbnRXaWR0aChNYXRoLm1pbihtZWFzdXJlQ29udGVudFdpZHRoKGFkYXB0ZXIpLCBtUG9wdXBNYXhXaWR0aCkpOworICAgICAgICBtUG9wdXAuc2hvdygpOworICAgICAgICBtUG9wdXAuZ2V0TGlzdFZpZXcoKS5zZXRPbktleUxpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc21pc3MoKSB7CisgICAgICAgIGlmIChpc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgbVBvcHVwLmRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2hvd2luZygpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3B1cCAhPSBudWxsICYmIG1Qb3B1cC5pc1Nob3dpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBudWxsOworICAgICAgICBpZiAobU92ZXJmbG93T25seSkgeworICAgICAgICAgICAgaXRlbSA9IG1NZW51LmdldE92ZXJmbG93SXRlbShwb3NpdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdGVtID0gbU1lbnUuZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgbU1lbnUucGVyZm9ybUl0ZW1BY3Rpb24oaXRlbSwgMCk7CisgICAgICAgIG1Qb3B1cC5kaXNtaXNzKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25LZXkoVmlldyB2LCBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9VUCAmJiBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfTUVOVSkgeworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVDb250ZW50V2lkdGgoTWVudUFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAvLyBNZW51cyBkb24ndCB0ZW5kIHRvIGJlIGxvbmcsIHNvIHRoaXMgaXMgbW9yZSBzYW5lIHRoYW4gaXQgbG9va3MuCisgICAgICAgIGludCB3aWR0aCA9IDA7CisgICAgICAgIFZpZXcgaXRlbVZpZXcgPSBudWxsOworICAgICAgICBmaW5hbCBpbnQgd2lkdGhNZWFzdXJlU3BlYyA9CisgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoMCwgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMgPQorICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKDAsIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYWRhcHRlci5nZXRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGl0ZW1WaWV3ID0gYWRhcHRlci5nZXRWaWV3KGksIGl0ZW1WaWV3LCBudWxsKTsKKyAgICAgICAgICAgIGl0ZW1WaWV3Lm1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgaXRlbVZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2lkdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTU3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQWN0aW9uQmFyQ29udGV4dFZpZXcgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIHByaXZhdGUgaW50IG1JdGVtUGFkZGluZzsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uU3BhY2luZzsKKyAgICBwcml2YXRlIGludCBtQ29udGVudEhlaWdodDsKKyAgICAKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVGl0bGU7CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1YnRpdGxlOworICAgIAorICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tVmlldzsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtVGl0bGVMYXlvdXQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKKyAgICBwcml2YXRlIGludCBtVGl0bGVTdHlsZVJlczsKKyAgICBwcml2YXRlIGludCBtU3VidGl0bGVTdHlsZVJlczsKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGV4dFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBY3Rpb25CYXJDb250ZXh0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuYWN0aW9uTW9kZVN0eWxlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFjdGlvbkJhckNvbnRleHRWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICAgICAgCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuQWN0aW9uTW9kZSwgZGVmU3R5bGUsIDApOworICAgICAgICBtSXRlbVBhZGRpbmcgPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfaXRlbVBhZGRpbmcsIDApOworICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoYS5nZXREcmF3YWJsZSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY3Rpb25Nb2RlX2JhY2tncm91bmQpKTsKKyAgICAgICAgbVRpdGxlU3R5bGVSZXMgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV90aXRsZVRleHRTdHlsZSwgMCk7CisgICAgICAgIG1TdWJ0aXRsZVN0eWxlUmVzID0gYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjdGlvbk1vZGVfc3VidGl0bGVUZXh0U3R5bGUsIDApOworCisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gYS5nZXRMYXlvdXREaW1lbnNpb24oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uTW9kZV9oZWlnaHQsIDApOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBjaGlsZCwgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAvLyBObyBzdGFydGluZyBhbiBhY3Rpb24gbW9kZSBmb3IgYW4gZXhpc3RpbmcgYWN0aW9uIG1vZGUgVUkgY2hpbGQhIChXaGVyZSB3b3VsZCBpdCBnbz8pCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1DdXN0b21WaWV3KTsKKyAgICAgICAgfQorICAgICAgICBtQ3VzdG9tVmlldyA9IHZpZXc7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRWaWV3KHZpZXcpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgbVRpdGxlID0gdGl0bGU7CisgICAgICAgIGluaXRUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlKENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSkgeworICAgICAgICBtU3VidGl0bGUgPSBzdWJ0aXRsZTsKKyAgICAgICAgaW5pdFRpdGxlKCk7CisgICAgfQorCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UaXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICByZXR1cm4gbVN1YnRpdGxlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0VGl0bGUoKSB7CisgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGl0bGVfaXRlbSwgbnVsbCk7CisgICAgICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7CisgICAgICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtVGl0bGVTdHlsZVJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7CisgICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KG1TdWJ0aXRsZSAhPSBudWxsID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dC5nZXRQYXJlbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtVGl0bGVMYXlvdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdEZvck1vZGUoZmluYWwgQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgIGlmIChtQ2xvc2VCdXR0b24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUNsb3NlQnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKGdldENvbnRleHQoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIG1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhZGRWaWV3KG1DbG9zZUJ1dHRvbik7CisKKyAgICAgICAgZmluYWwgTWVudUJ1aWxkZXIgbWVudSA9IChNZW51QnVpbGRlcikgbW9kZS5nZXRNZW51KCk7CisgICAgICAgIG1NZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgbWVudS5nZXRNZW51VmlldyhNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIHRoaXMpOworICAgICAgICBtTWVudVZpZXcuc2V0T3ZlcmZsb3dSZXNlcnZlZCh0cnVlKTsKKyAgICAgICAgbU1lbnVWaWV3LnVwZGF0ZUNoaWxkcmVuKGZhbHNlKTsKKyAgICAgICAgYWRkVmlldyhtTWVudVZpZXcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlTW9kZSgpIHsKKyAgICAgICAgcmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgbUN1c3RvbVZpZXcgPSBudWxsOworICAgICAgICBtTWVudVZpZXcgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKKyAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnVWaWV3LmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtcygpIHsKKyAgICAgICAgLy8gVXNlZCBieSBjdXN0b20gdmlld3MgaWYgdGhleSBkb24ndCBzdXBwbHkgbGF5b3V0IHBhcmFtcy4gRXZlcnl0aGluZyBlbHNlCisgICAgICAgIC8vIGFkZGVkIHRvIGFuIEFjdGlvbkJhckNvbnRleHRWaWV3IHNob3VsZCBoYXZlIHRoZW0gYWxyZWFkeS4KKyAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGlmICh3aWR0aE1vZGUgIT0gTWVhc3VyZVNwZWMuRVhBQ1RMWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgY2FuIG9ubHkgYmUgdXNlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpdGggYW5kcm9pZDpsYXlvdXRfd2lkdGg9XCJtYXRjaF9wYXJlbnRcIiAob3IgZmlsbF9wYXJlbnQpIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBpZiAoaGVpZ2h0TW9kZSAhPSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF9oZWlnaHQ9XCJ3cmFwX2NvbnRlbnRcIiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBpbnQgY29udGVudFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1NYXJnaW4gPSBtSXRlbVBhZGRpbmc7CisKKyAgICAgICAgaW50IG1heEhlaWdodCA9IG1Db250ZW50SGVpZ2h0ID4gMCA/CisgICAgICAgICAgICAgICAgbUNvbnRlbnRIZWlnaHQgOiBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxQYWRkaW5nID0gZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOworICAgICAgICBpbnQgYXZhaWxhYmxlV2lkdGggPSBjb250ZW50V2lkdGggLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBtYXhIZWlnaHQgLSB2ZXJ0aWNhbFBhZGRpbmc7CisgICAgICAgIGZpbmFsIGludCBjaGlsZFNwZWNIZWlnaHQgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtQ2xvc2VCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1DbG9zZUJ1dHRvbiwgYXZhaWxhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbUN1c3RvbVZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCwgaXRlbU1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgY2hpbGRDb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGNoaWxkID09IG1DbG9zZUJ1dHRvbiB8fCBjaGlsZCA9PSBtVGl0bGVMYXlvdXQgfHwgY2hpbGQgPT0gbUN1c3RvbVZpZXcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KGNoaWxkLCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBpdGVtTWFyZ2luKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ3VzdG9tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21XaWR0aE1vZGUgPSBscC53aWR0aCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VzdG9tV2lkdGggPSBscC53aWR0aCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAud2lkdGgsIGF2YWlsYWJsZVdpZHRoKSA6IGF2YWlsYWJsZVdpZHRoOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbUhlaWdodE1vZGUgPSBscC5oZWlnaHQgIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgZmluYWwgaW50IGN1c3RvbUhlaWdodCA9IGxwLmhlaWdodCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAuaGVpZ2h0LCBoZWlnaHQpIDogaGVpZ2h0OworICAgICAgICAgICAgbUN1c3RvbVZpZXcubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tV2lkdGgsIGN1c3RvbVdpZHRoTW9kZSksCisgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21IZWlnaHQsIGN1c3RvbUhlaWdodE1vZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ29udGVudEhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQgPSAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICBpbnQgcGFkZGVkVmlld0hlaWdodCA9IHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIHZlcnRpY2FsUGFkZGluZzsKKyAgICAgICAgICAgICAgICBpZiAocGFkZGVkVmlld0hlaWdodCA+IG1lYXN1cmVkSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gcGFkZGVkVmlld0hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWF4SGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IHggPSBnZXRQYWRkaW5nTGVmdCgpOworICAgICAgICBmaW5hbCBpbnQgeSA9IGdldFBhZGRpbmdUb3AoKTsKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRIZWlnaHQgPSBiIC0gdCAtIGdldFBhZGRpbmdUb3AoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgZmluYWwgaW50IGl0ZW1NYXJnaW4gPSBtSXRlbVBhZGRpbmc7CisgICAgICAgIAorICAgICAgICBpZiAobUNsb3NlQnV0dG9uICE9IG51bGwgJiYgbUNsb3NlQnV0dG9uLmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUNsb3NlQnV0dG9uLCB4LCB5LCBjb250ZW50SGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsICYmIG1DdXN0b21WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGl0bGVMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgaXRlbU1hcmdpbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG1DdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtQ3VzdG9tVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBpdGVtTWFyZ2luOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB4ID0gciAtIGwgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHggLT0gcG9zaXRpb25DaGlsZEludmVyc2UobU1lbnVWaWV3LCB4ICsgbUFjdGlvblNwYWNpbmcsIHksIGNvbnRlbnRIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIC0gbUFjdGlvblNwYWNpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtZWFzdXJlQ2hpbGRWaWV3KFZpZXcgY2hpbGQsIGludCBhdmFpbGFibGVXaWR0aCwgaW50IGNoaWxkU3BlY0hlaWdodCwgaW50IHNwYWNpbmcpIHsKKyAgICAgICAgY2hpbGQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCk7CisKKyAgICAgICAgYXZhaWxhYmxlV2lkdGggLT0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBzcGFjaW5nOworCisgICAgICAgIHJldHVybiBhdmFpbGFibGVXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZChWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4LCBjaGlsZFRvcCwgeCArIGNoaWxkV2lkdGgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbkNoaWxkSW52ZXJzZShWaWV3IGNoaWxkLCBpbnQgeCwgaW50IHksIGludCBjb250ZW50SGVpZ2h0KSB7CisgICAgICAgIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICBpbnQgY2hpbGRIZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICBpbnQgY2hpbGRUb3AgPSB5ICsgKGNvbnRlbnRIZWlnaHQgLSBjaGlsZEhlaWdodCkgLyAyOworCisgICAgICAgIGNoaWxkLmxheW91dCh4IC0gY2hpbGRXaWR0aCwgY2hpbGRUb3AsIHgsIGNoaWxkVG9wICsgY2hpbGRIZWlnaHQpOworCisgICAgICAgIHJldHVybiBjaGlsZFdpZHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YTcwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQWN0aW9uTWVudVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhci5OYXZpZ2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ib3Jpem9udGFsU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3Bpbm5lckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkJhclZpZXcgZXh0ZW5kcyBWaWV3R3JvdXAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQWN0aW9uQmFyVmlldyI7CisgICAgCisgICAgLy8gVE9ETzogVGhpcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGRlZmF1bHQgdGhlbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9QQURESU5HX0RJUCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfU1BBQ0lOR19ESVAgPSA2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0FDVElPTl9TUEFDSU5HX0RJUCA9IDEyOworICAgIAorICAgIC8qKgorICAgICAqIERpc3BsYXkgb3B0aW9ucyBhcHBsaWVkIGJ5IGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNQTEFZX0RFRkFVTFQgPSAwOworCisgICAgLyoqCisgICAgICogRGlzcGxheSBvcHRpb25zIHRoYXQgcmVxdWlyZSByZS1sYXlvdXQgYXMgb3Bwb3NlZCB0byBhIHNpbXBsZSBpbnZhbGlkYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfUkVMQVlPVVRfTUFTSyA9CisgICAgICAgICAgICBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUgfAorICAgICAgICAgICAgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR087CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRlbnRIZWlnaHQ7CisKKyAgICBwcml2YXRlIGludCBtTmF2aWdhdGlvbk1vZGU7CisgICAgcHJpdmF0ZSBpbnQgbURpc3BsYXlPcHRpb25zOworICAgIHByaXZhdGUgaW50IG1TcGFjaW5nOworICAgIHByaXZhdGUgaW50IG1BY3Rpb25TcGFjaW5nOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UaXRsZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VidGl0bGU7CisgICAgcHJpdmF0ZSBEcmF3YWJsZSBtSWNvbjsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1Mb2dvOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUljb25WaWV3OworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1Mb2dvVmlldzsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtVGl0bGVMYXlvdXQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKKyAgICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7CisgICAgcHJpdmF0ZSBIb3Jpem9udGFsU2Nyb2xsVmlldyBtVGFiU2Nyb2xsVmlldzsKKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtVGFiTGF5b3V0OworICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tTmF2VmlldzsKKyAgICAKKyAgICBwcml2YXRlIGludCBtVGl0bGVTdHlsZVJlczsKKyAgICBwcml2YXRlIGludCBtU3VidGl0bGVTdHlsZVJlczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd01lbnU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VyVGl0bGU7CisKKyAgICBwcml2YXRlIE1lbnVCdWlsZGVyIG1PcHRpb25zTWVudTsKKyAgICBwcml2YXRlIEFjdGlvbk1lbnVWaWV3IG1NZW51VmlldzsKKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkJhckNvbnRleHRWaWV3IG1Db250ZXh0VmlldzsKKworICAgIHByaXZhdGUgQWN0aW9uTWVudUl0ZW0gbUxvZ29OYXZJdGVtOworICAgIAorICAgIHByaXZhdGUgTmF2aWdhdGlvbkNhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5vbk5hdmlnYXRpb25JdGVtU2VsZWN0ZWQocG9zaXRpb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdGhpbmdTZWxlY3RlZChBZGFwdGVyVmlldyBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtSG9tZUNsaWNrTGlzdGVuZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbVRhYkNsaWNrTGlzdGVuZXIgPSBudWxsOworCisgICAgcHVibGljIEFjdGlvbkJhclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5BY3Rpb25CYXIpOworCisgICAgICAgIGZpbmFsIGludCBjb2xvckZpbHRlciA9IGEuZ2V0Q29sb3IoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2NvbG9yRmlsdGVyLCAwKTsKKworICAgICAgICBpZiAoY29sb3JGaWx0ZXIgIT0gMCkgeworICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgZCA9IGdldEJhY2tncm91bmQoKTsKKyAgICAgICAgICAgIGQuc2V0RGl0aGVyKHRydWUpOworICAgICAgICAgICAgZC5zZXRDb2xvckZpbHRlcihuZXcgUG9ydGVyRHVmZkNvbG9yRmlsdGVyKGNvbG9yRmlsdGVyLCBQb3J0ZXJEdWZmLk1vZGUuT1ZFUkxBWSkpOworICAgICAgICB9CisKKyAgICAgICAgQXBwbGljYXRpb25JbmZvIGluZm8gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uSW5mbygpOworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgbU5hdmlnYXRpb25Nb2RlID0gYS5nZXRJbnQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX25hdmlnYXRpb25Nb2RlLAorICAgICAgICAgICAgICAgIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQpOworICAgICAgICBtVGl0bGUgPSBhLmdldFRleHQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3RpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlID0gYS5nZXRUZXh0KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9zdWJ0aXRsZSk7CisgICAgICAgIG1EaXNwbGF5T3B0aW9ucyA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLkFjdGlvbkJhcl9kaXNwbGF5T3B0aW9ucywgRElTUExBWV9ERUZBVUxUKTsKKyAgICAgICAgCisgICAgICAgIG1Mb2dvID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfbG9nbyk7CisgICAgICAgIGlmIChtTG9nbyA9PSBudWxsKSB7CisgICAgICAgICAgICBtTG9nbyA9IGluZm8ubG9hZExvZ28ocG0pOworICAgICAgICB9CisgICAgICAgIG1JY29uID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaWNvbik7CisgICAgICAgIGlmIChtSWNvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBtSWNvbiA9IGluZm8ubG9hZEljb24ocG0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBEcmF3YWJsZSBiYWNrZ3JvdW5kID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5BY3Rpb25CYXJfYmFja2dyb3VuZCk7CisgICAgICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbVRpdGxlU3R5bGVSZXMgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3RpdGxlVGV4dFN0eWxlLCAwKTsKKyAgICAgICAgbVN1YnRpdGxlU3R5bGVSZXMgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX3N1YnRpdGxlVGV4dFN0eWxlLCAwKTsKKworICAgICAgICBmaW5hbCBpbnQgY3VzdG9tTmF2SWQgPSBhLmdldFJlc291cmNlSWQoUi5zdHlsZWFibGUuQWN0aW9uQmFyX2N1c3RvbU5hdmlnYXRpb25MYXlvdXQsIDApOworICAgICAgICBpZiAoY3VzdG9tTmF2SWQgIT0gMCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSAoVmlldykgaW5mbGF0ZXIuaW5mbGF0ZShjdXN0b21OYXZJZCwgbnVsbCk7CisgICAgICAgICAgICBtTmF2aWdhdGlvbk1vZGUgPSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTTsKKyAgICAgICAgfQorCisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gYS5nZXRMYXlvdXREaW1lbnNpb24oUi5zdHlsZWFibGUuQWN0aW9uQmFyX2hlaWdodCwgMCk7CisKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgLy8gVE9ETzogU2V0IHRoaXMgaW4gdGhlIHRoZW1lCisgICAgICAgIG1TcGFjaW5nID0gKGludCkgKENPTlRFTlRfU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgbUFjdGlvblNwYWNpbmcgPSAoaW50KSAoQ09OVEVOVF9BQ1RJT05fU1BBQ0lOR19ESVAgKiBtZXRyaWNzLmRlbnNpdHkgKyAwLjVmKTsKKyAgICAgICAgCisgICAgICAgIGlmIChtTG9nbyAhPSBudWxsIHx8IG1JY29uICE9IG51bGwgfHwgbVRpdGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2dvTmF2SXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShjb250ZXh0LCAwLCBhbmRyb2lkLlIuaWQuaG9tZSwgMCwgMCwgbVRpdGxlKTsKKyAgICAgICAgICAgIG1Ib21lQ2xpY2tMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgY29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChtTG9nb05hdkl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY3Rpb25Nb2RlIHN0YXJ0QWN0aW9uTW9kZUZvckNoaWxkKFZpZXcgY2hpbGQsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgLy8gTm8gc3RhcnRpbmcgYW4gYWN0aW9uIG1vZGUgZm9yIGFuIGFjdGlvbiBiYXIgY2hpbGQhIChXaGVyZSB3b3VsZCBpdCBnbz8pCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKE5hdmlnYXRpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51QnVpbGRlciBidWlsZGVyID0gKE1lbnVCdWlsZGVyKSBtZW51OworICAgICAgICBtT3B0aW9uc01lbnUgPSBidWlsZGVyOworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZVZpZXcobU1lbnVWaWV3KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBY3Rpb25NZW51VmlldyBtZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgYnVpbGRlci5nZXRNZW51VmlldygKKyAgICAgICAgICAgICAgICBNZW51QnVpbGRlci5UWVBFX0FDVElPTl9CVVRUT04sIG51bGwpOworICAgICAgICBtQWN0aW9uU3BhY2luZyA9IG1lbnVWaWV3LmdldEl0ZW1NYXJnaW4oKTsKKyAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgbWVudVZpZXcuc2V0TGF5b3V0UGFyYW1zKGxheW91dFBhcmFtcyk7CisgICAgICAgIGFkZFZpZXcobWVudVZpZXcpOworICAgICAgICBtTWVudVZpZXcgPSBtZW51VmlldzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0U2hvd092ZXJmbG93TWVudSgpIHsKKyAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgeworICAgICAgICBpZiAobU1lbnVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVudVZpZXcuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJmbG93TWVudVNob3dpbmcoKSB7CisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51Vmlldy5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd1Jlc2VydmVkKCkgeworICAgICAgICByZXR1cm4gbU1lbnVWaWV3ICE9IG51bGwgJiYgbU1lbnVWaWV3LmlzT3ZlcmZsb3dSZXNlcnZlZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbU5hdmlnYXRpb25WaWV3KFZpZXcgdmlldykgeworICAgICAgICBtQ3VzdG9tTmF2VmlldyA9IHZpZXc7CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldE5hdmlnYXRpb25Nb2RlKEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtVGl0bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIHRpdGxlLiBUaGlzIHdpbGwgYWx3YXlzIHJlcGxhY2Ugb3Igb3ZlcnJpZGUgd2luZG93IHRpdGxlcy4KKyAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRXaW5kb3dUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1Vc2VyVGl0bGUgPSB0cnVlOworICAgICAgICBzZXRUaXRsZUltcGwodGl0bGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgd2luZG93IHRpdGxlLiBBIHdpbmRvdyB0aXRsZSB3aWxsIGFsd2F5cyBiZSByZXBsYWNlZCBvciBvdmVycmlkZGVuIGJ5IGEgdXNlciB0aXRsZS4KKyAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUgdG8gc2V0CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRUaXRsZShDaGFyU2VxdWVuY2UpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIGlmICghbVVzZXJUaXRsZSkgeworICAgICAgICAgICAgc2V0VGl0bGVJbXBsKHRpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRUaXRsZUltcGwoQ2hhclNlcXVlbmNlIHRpdGxlKSB7CisgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICBpZiAobVRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTG9nb05hdkl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgbUxvZ29OYXZJdGVtLnNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3VidGl0bGUoKSB7CisgICAgICAgIHJldHVybiBtU3VidGl0bGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgIG1TdWJ0aXRsZSA9IHN1YnRpdGxlOworICAgICAgICBpZiAobVN1YnRpdGxlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU9wdGlvbnMoaW50IG9wdGlvbnMpIHsKKyAgICAgICAgZmluYWwgaW50IGZsYWdzQ2hhbmdlZCA9IG9wdGlvbnMgXiBtRGlzcGxheU9wdGlvbnM7CisgICAgICAgIG1EaXNwbGF5T3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIGlmICgoZmxhZ3NDaGFuZ2VkICYgRElTUExBWV9SRUxBWU9VVF9NQVNLKSAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgdmlzID0gKG9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9ISURFX0hPTUUpICE9IDAgPyBHT05FIDogVklTSUJMRTsKKyAgICAgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRWaXNpYmlsaXR5KHZpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUljb25WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0VmlzaWJpbGl0eSh2aXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYXZpZ2F0aW9uTW9kZShpbnQgbW9kZSkgeworICAgICAgICBmaW5hbCBpbnQgb2xkTW9kZSA9IG1OYXZpZ2F0aW9uTW9kZTsKKyAgICAgICAgaWYgKG1vZGUgIT0gb2xkTW9kZSkgeworICAgICAgICAgICAgc3dpdGNoIChvbGRNb2RlKSB7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6CisgICAgICAgICAgICAgICAgaWYgKG1UaXRsZUxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlTGF5b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVZpZXcobVNwaW5uZXIpOworICAgICAgICAgICAgICAgICAgICBtU3Bpbm5lciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgorICAgICAgICAgICAgICAgIGlmIChtVGFiTGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGFiU2Nyb2xsVmlldyk7CisgICAgICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9EUk9QRE9XTl9MSVNUOgorICAgICAgICAgICAgICAgIG1TcGlubmVyID0gbmV3IFNwaW5uZXIobUNvbnRleHQsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuZHJvcERvd25TcGlubmVyU3R5bGUpOworICAgICAgICAgICAgICAgIG1TcGlubmVyLnNldE9uSXRlbVNlbGVjdGVkTGlzdGVuZXIobU5hdkl0ZW1TZWxlY3RlZExpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1TcGlubmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldyA9IG5ldyBIb3Jpem9udGFsU2Nyb2xsVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1UYWJMYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KGdldENvbnRleHQoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25CYXJUYWJCYXJTdHlsZSk7CisgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcuYWRkVmlldyhtVGFiTGF5b3V0KTsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1UYWJTY3JvbGxWaWV3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OYXZpZ2F0aW9uTW9kZSA9IG1vZGU7CisgICAgICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RHJvcGRvd25BZGFwdGVyKFNwaW5uZXJBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgbVNwaW5uZXIuc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIG1TcGlubmVyLnNldFNlbGVjdGlvbihwb3NpdGlvbik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREcm9wZG93blNlbGVjdGVkUG9zaXRpb24oKSB7CisgICAgICAgIHJldHVybiBtU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBWaWV3IGdldEN1c3RvbU5hdmlnYXRpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gbUN1c3RvbU5hdlZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TmF2aWdhdGlvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiBtTmF2aWdhdGlvbk1vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGxheU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtRGlzcGxheU9wdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWJWaWV3IGNyZWF0ZVRhYlZpZXcoQWN0aW9uQmFyLlRhYiB0YWIpIHsKKyAgICAgICAgZmluYWwgVGFiVmlldyB0YWJWaWV3ID0gbmV3IFRhYlZpZXcoZ2V0Q29udGV4dCgpLCB0YWIpOworICAgICAgICB0YWJWaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKworICAgICAgICBpZiAobVRhYkNsaWNrTGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVRhYkNsaWNrTGlzdGVuZXIgPSBuZXcgVGFiQ2xpY2tMaXN0ZW5lcigpOworICAgICAgICB9CisgICAgICAgIHRhYlZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1UYWJDbGlja0xpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHRhYlZpZXc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGFiKEFjdGlvbkJhci5UYWIgdGFiKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaXJzdCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpID09IDA7CisgICAgICAgIFZpZXcgdGFiVmlldyA9IGNyZWF0ZVRhYlZpZXcodGFiKTsKKyAgICAgICAgbVRhYkxheW91dC5hZGRWaWV3KHRhYlZpZXcpOworICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgdGFiVmlldy5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRhYihBY3Rpb25CYXIuVGFiIHRhYiwgaW50IHBvc2l0aW9uKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaXJzdCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpID09IDA7CisgICAgICAgIGZpbmFsIFRhYlZpZXcgdGFiVmlldyA9IGNyZWF0ZVRhYlZpZXcodGFiKTsKKyAgICAgICAgbVRhYkxheW91dC5hZGRWaWV3KHRhYlZpZXcsIHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGlzRmlyc3QpIHsKKyAgICAgICAgICAgIHRhYlZpZXcuc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVUYWJBdChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgbVRhYkxheW91dC5yZW1vdmVWaWV3QXQocG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zKCkgeworICAgICAgICAvLyBVc2VkIGJ5IGN1c3RvbSBuYXYgdmlld3MgaWYgdGhleSBkb24ndCBzdXBwbHkgbGF5b3V0IHBhcmFtcy4gRXZlcnl0aGluZyBlbHNlCisgICAgICAgIC8vIGFkZGVkIHRvIGFuIEFjdGlvbkJhclZpZXcgc2hvdWxkIGhhdmUgdGhlbSBhbHJlYWR5LgorICAgICAgICByZXR1cm4gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uRmluaXNoSW5mbGF0ZSgpOworCisgICAgICAgIGlmICgobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSElERV9IT01FKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobUxvZ28gIT0gbnVsbCAmJiAobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR08pICE9IDApIHsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcgPSBuZXcgSW1hZ2VWaWV3KGdldENvbnRleHQoKSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldEFkanVzdFZpZXdCb3VuZHModHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldEltYWdlRHJhd2FibGUobUxvZ28pOworICAgICAgICAgICAgICAgIG1Mb2dvVmlldy5zZXRDbGlja2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxvZ29WaWV3LnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBtTG9nb1ZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG1Ib21lQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtTG9nb1ZpZXcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUljb25WaWV3ID0gbmV3IEltYWdlVmlldyhnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRBZGp1c3RWaWV3Qm91bmRzKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1JY29uKTsKKyAgICAgICAgICAgICAgICBtSWNvblZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworICAgICAgICAgICAgICAgIG1JY29uVmlldy5zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgbUljb25WaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihtSG9tZUNsaWNrTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUljb25WaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobU5hdmlnYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgIGlmIChtTG9nb1ZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluaXRUaXRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbmZsYXRpbmcgZHJvcGRvd24gbGlzdCBuYXZpZ2F0aW9uIGlzbid0IHN1cHBvcnRlZCB5ZXQhIik7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbmZsYXRpbmcgdGFiIG5hdmlnYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIHlldCEiKTsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1DdXN0b21OYXZWaWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBpbml0VGl0bGUoKSB7CisgICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShnZXRDb250ZXh0KCkpOworICAgICAgICBtVGl0bGVMYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmFjdGlvbl9iYXJfdGl0bGVfaXRlbSwgbnVsbCk7CisgICAgICAgIG1UaXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3RpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlVmlldyA9IChUZXh0VmlldykgbVRpdGxlTGF5b3V0LmZpbmRWaWV3QnlJZChSLmlkLmFjdGlvbl9iYXJfc3VidGl0bGUpOworCisgICAgICAgIGlmIChtVGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtVGl0bGVTdHlsZVJlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3VidGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtU3VidGl0bGVTdHlsZVJlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdWJ0aXRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWJTZWxlY3RlZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgZmluYWwgaW50IHRhYkNvdW50ID0gbVRhYkxheW91dC5nZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiQ291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGNoaWxkLnNldFNlbGVjdGVkKGkgPT0gcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFZpZXcoQWN0aW9uQmFyQ29udGV4dFZpZXcgdmlldykgeworICAgICAgICBtQ29udGV4dFZpZXcgPSB2aWV3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBpZiAod2lkdGhNb2RlICE9IE1lYXN1cmVTcGVjLkVYQUNUTFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiIGNhbiBvbmx5IGJlIHVzZWQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPVwibWF0Y2hfcGFyZW50XCIgKG9yIGZpbGxfcGFyZW50KSIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBpZiAoaGVpZ2h0TW9kZSAhPSBNZWFzdXJlU3BlYy5BVF9NT1NUKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIiBjYW4gb25seSBiZSB1c2VkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhbmRyb2lkOmxheW91dF9oZWlnaHQ9XCJ3cmFwX2NvbnRlbnRcIiIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRlbnRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgaW50IG1heEhlaWdodCA9IG1Db250ZW50SGVpZ2h0ID4gMCA/CisgICAgICAgICAgICAgICAgbUNvbnRlbnRIZWlnaHQgOiBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCB2ZXJ0aWNhbFBhZGRpbmcgPSBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRlbnRXaWR0aCAtIGdldFBhZGRpbmdMZWZ0KCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IG1heEhlaWdodCAtIHZlcnRpY2FsUGFkZGluZzsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkU3BlY0hlaWdodCA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkFUX01PU1QpOworCisgICAgICAgIGlmIChtTG9nb1ZpZXcgIT0gbnVsbCAmJiBtTG9nb1ZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtTG9nb1ZpZXcsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIG1TcGFjaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUljb25WaWV3ICE9IG51bGwgJiYgbUljb25WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IG1lYXN1cmVDaGlsZFZpZXcobUljb25WaWV3LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1NZW51VmlldywgYXZhaWxhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkU3BlY0hlaWdodCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAobU5hdmlnYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1lYXN1cmVDaGlsZFZpZXcobVRpdGxlTGF5b3V0LCBhdmFpbGFibGVXaWR0aCwgY2hpbGRTcGVjSGVpZ2h0LCBtU3BhY2luZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TcGlubmVyLm1lYXN1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuQVRfTU9TVCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9DVVNUT006CisgICAgICAgICAgICBpZiAobUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG1DdXN0b21OYXZWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZXaWR0aE1vZGUgPSBscC53aWR0aCAhPSBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkVYQUNUTFkgOiBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZXaWR0aCA9IGxwLndpZHRoID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4obHAud2lkdGgsIGF2YWlsYWJsZVdpZHRoKSA6IGF2YWlsYWJsZVdpZHRoOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGlvbiBiYXIgaXMgd3JhcHBpbmcgdG8gaXRzIGNvbnRlbnQgaGVpZ2h0LCBkb24ndCBhbGxvdyBhIGN1c3RvbQorICAgICAgICAgICAgICAgIC8vIHZpZXcgdG8gTUFUQ0hfUEFSRU5ULgorICAgICAgICAgICAgICAgIGludCBjdXN0b21OYXZIZWlnaHRNb2RlOworICAgICAgICAgICAgICAgIGlmIChtQ29udGVudEhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbU5hdkhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5BVF9NT1NUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbU5hdkhlaWdodE1vZGUgPSBscC5oZWlnaHQgIT0gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSA6IE1lYXN1cmVTcGVjLkFUX01PU1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBjdXN0b21OYXZIZWlnaHQgPSBscC5oZWlnaHQgPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihscC5oZWlnaHQsIGhlaWdodCkgOiBoZWlnaHQ7CisgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21OYXZXaWR0aCwgY3VzdG9tTmF2V2lkdGhNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhjdXN0b21OYXZIZWlnaHQsIGN1c3RvbU5hdkhlaWdodE1vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ29udGVudEhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQgPSAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICBpbnQgcGFkZGVkVmlld0hlaWdodCA9IHYuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIHZlcnRpY2FsUGFkZGluZzsKKyAgICAgICAgICAgICAgICBpZiAocGFkZGVkVmlld0hlaWdodCA+IG1lYXN1cmVkSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gcGFkZGVkVmlld0hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihjb250ZW50V2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKGNvbnRlbnRXaWR0aCwgbWF4SGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ29udGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRleHRWaWV3LnNldEhlaWdodChnZXRNZWFzdXJlZEhlaWdodCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IG1lYXN1cmVDaGlsZFZpZXcoVmlldyBjaGlsZCwgaW50IGF2YWlsYWJsZVdpZHRoLCBpbnQgY2hpbGRTcGVjSGVpZ2h0LCBpbnQgc3BhY2luZykgeworICAgICAgICBjaGlsZC5tZWFzdXJlKE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCisgICAgICAgICAgICAgICAgY2hpbGRTcGVjSGVpZ2h0KTsKKworICAgICAgICBhdmFpbGFibGVXaWR0aCAtPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgIGF2YWlsYWJsZVdpZHRoIC09IHNwYWNpbmc7CisKKyAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVdpZHRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IHggPSBnZXRQYWRkaW5nTGVmdCgpOworICAgICAgICBmaW5hbCBpbnQgeSA9IGdldFBhZGRpbmdUb3AoKTsKKyAgICAgICAgZmluYWwgaW50IGNvbnRlbnRIZWlnaHQgPSBiIC0gdCAtIGdldFBhZGRpbmdUb3AoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKKworICAgICAgICBpZiAobUxvZ29WaWV3ICE9IG51bGwgJiYgbUxvZ29WaWV3LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUxvZ29WaWV3LCB4LCB5LCBjb250ZW50SGVpZ2h0KSArIG1TcGFjaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChtSWNvblZpZXcgIT0gbnVsbCAmJiBtSWNvblZpZXcuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtSWNvblZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAobU5hdmlnYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGl0bGVMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0RST1BET1dOX0xJU1Q6CisgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtU3Bpbm5lciwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobUN1c3RvbU5hdlZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbVNwYWNpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICBpZiAobVRhYlNjcm9sbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGFiU2Nyb2xsVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtU3BhY2luZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHggPSByIC0gbCAtIGdldFBhZGRpbmdSaWdodCgpOworCisgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgeCAtPSBwb3NpdGlvbkNoaWxkSW52ZXJzZShtTWVudVZpZXcsIHggKyBtQWN0aW9uU3BhY2luZywgeSwgY29udGVudEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLSBtQWN0aW9uU3BhY2luZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHBvc2l0aW9uQ2hpbGQoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCwgY2hpbGRUb3AsIHggKyBjaGlsZFdpZHRoLCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb25DaGlsZEludmVyc2UoVmlldyBjaGlsZCwgaW50IHgsIGludCB5LCBpbnQgY29udGVudEhlaWdodCkgeworICAgICAgICBpbnQgY2hpbGRXaWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgaW50IGNoaWxkSGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgaW50IGNoaWxkVG9wID0geSArIChjb250ZW50SGVpZ2h0IC0gY2hpbGRIZWlnaHQpIC8gMjsKKworICAgICAgICBjaGlsZC5sYXlvdXQoeCAtIGNoaWxkV2lkdGgsIGNoaWxkVG9wLCB4LCBjaGlsZFRvcCArIGNoaWxkSGVpZ2h0KTsKKworICAgICAgICByZXR1cm4gY2hpbGRXaWR0aDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWJWaWV3IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25CYXIuVGFiIG1UYWI7CisKKyAgICAgICAgcHVibGljIFRhYlZpZXcoQ29udGV4dCBjb250ZXh0LCBBY3Rpb25CYXIuVGFiIHRhYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbnVsbCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmFjdGlvbkJhclRhYlN0eWxlKTsKKyAgICAgICAgICAgIG1UYWIgPSB0YWI7CisKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY3VzdG9tID0gdGFiLmdldEN1c3RvbVZpZXcoKTsKKyAgICAgICAgICAgIGlmIChjdXN0b20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFZpZXcoY3VzdG9tKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBTdHlsZSB0YWJzIGJhc2VkIG9uIHRoZSB0aGVtZQorCisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgaWNvbiA9IHRhYi5nZXRJY29uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQgPSB0YWIuZ2V0VGV4dCgpOworCisgICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSBuZXcgSW1hZ2VWaWV3KGNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDsKKyAgICAgICAgICAgICAgICAgICAgaWNvblZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkVmlldyhpY29uVmlldyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IG5ldyBUZXh0Vmlldyhjb250ZXh0LCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5hY3Rpb25CYXJUYWJUZXh0U3R5bGUpOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KHRleHQpOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRTaW5nbGVMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldEVsbGlwc2l6ZShUcnVuY2F0ZUF0LkVORCk7CisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKyAgICAgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMOworICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOworICAgICAgICAgICAgICAgICAgICBhZGRWaWV3KHRleHRWaWV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldExheW91dFBhcmFtcyhuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY3Rpb25CYXIuVGFiIGdldFRhYigpIHsKKyAgICAgICAgICAgIHJldHVybiBtVGFiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUYWJDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHZpZXcpIHsKKyAgICAgICAgICAgIFRhYlZpZXcgdGFiVmlldyA9IChUYWJWaWV3KSB2aWV3OworICAgICAgICAgICAgdGFiVmlldy5nZXRUYWIoKS5zZWxlY3QoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0YWJDb3VudCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1UYWJMYXlvdXQuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXRTZWxlY3RlZChjaGlsZCA9PSB2aWV3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQ29udGFjdEhlYWRlcldpZGdldC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjE0NjYuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Db250YWN0SGVhZGVyV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLQotaW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLk5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlBob25lTG9va3VwOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5SYXdDb250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuU3RhdHVzVXBkYXRlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBIZWFkZXIgdXNlZCBhY3Jvc3Mgc3lzdGVtIGZvciBkaXNwbGF5aW5nIGEgdGl0bGUgYmFyIHdpdGggY29udGFjdCBpbmZvLiBZb3UKLSAqIGNhbiBiaW5kIHNwZWNpZmljIHZhbHVlcyBvbiB0aGUgaGVhZGVyLCBvciB1c2UgaGVscGVyIG1ldGhvZHMgbGlrZQotICoge0BsaW5rICNiaW5kRnJvbUNvbnRhY3RJZChsb25nKX0gdG8gcG9wdWxhdGUgYXN5bmNocm9ub3VzbHkuCi0gKiA8cD4KLSAqIFRoZSBwYXJlbnQgbXVzdCByZXF1ZXN0IHRoZSB7QGxpbmsgTWFuaWZlc3QucGVybWlzc2lvbiNSRUFEX0NPTlRBQ1RTfQotICogcGVybWlzc2lvbiB0byBhY2Nlc3MgY29udGFjdCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGFjdEhlYWRlcldpZGdldCBleHRlbmRzIEZyYW1lTGF5b3V0IGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDb250YWN0SGVhZGVyV2lkZ2V0IjsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbURpc3BsYXlOYW1lVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFnZ3JlZ2F0ZUJhZGdlOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVBob25ldGljTmFtZVZpZXc7Ci0gICAgcHJpdmF0ZSBDaGVja0JveCBtU3RhcnJlZFZpZXc7Ci0gICAgcHJpdmF0ZSBRdWlja0NvbnRhY3RCYWRnZSBtUGhvdG9WaWV3OwotICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1QcmVzZW5jZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXNBdHRyaWJ1dGlvblZpZXc7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vUGhvdG9SZXNvdXJjZTsKLSAgICBwcml2YXRlIFF1ZXJ5SGFuZGxlciBtUXVlcnlIYW5kbGVyOwotCi0gICAgcHJvdGVjdGVkIFVyaSBtQ29udGFjdFVyaTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtRXhjbHVkZU1pbWVzID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIGludm9rZWQgd2hlbiB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCBhIGhlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvbnRhY3RIZWFkZXJMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGhvdG9DbGljayhWaWV3IHZpZXcpOwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlOYW1lQ2xpY2soVmlldyB2aWV3KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbnRhY3RIZWFkZXJMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLQotICAgIHByaXZhdGUgaW50ZXJmYWNlIENvbnRhY3RRdWVyeSB7Ci0gICAgICAgIC8vUHJvamVjdGlvbiB1c2VkIGZvciB0aGUgc3VtbWFyeSBpbmZvIGluIHRoZSBoZWFkZXIuCi0gICAgICAgIFN0cmluZ1tdIENPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQ29udGFjdHMuX0lELAotICAgICAgICAgICAgQ29udGFjdHMuTE9PS1VQX0tFWSwKLSAgICAgICAgICAgIENvbnRhY3RzLlBIT1RPX0lELAotICAgICAgICAgICAgQ29udGFjdHMuRElTUExBWV9OQU1FLAotICAgICAgICAgICAgQ29udGFjdHMuUEhPTkVUSUNfTkFNRSwKLSAgICAgICAgICAgIENvbnRhY3RzLlNUQVJSRUQsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1BSRVNFTkNFLAotICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVU19USU1FU1RBTVAsCi0gICAgICAgICAgICBDb250YWN0cy5DT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSwKLSAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTX0xBQkVMLAotICAgICAgICB9OwotICAgICAgICBpbnQgX0lEID0gMDsKLSAgICAgICAgaW50IExPT0tVUF9LRVkgPSAxOwotICAgICAgICBpbnQgUEhPVE9fSUQgPSAyOwotICAgICAgICBpbnQgRElTUExBWV9OQU1FID0gMzsKLSAgICAgICAgaW50IFBIT05FVElDX05BTUUgPSA0OwotICAgICAgICAvL1RPRE86IFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgd2UncmUgZ29pbmcgdG8gZ2V0IHRoZSBwaG9uZXRpYyBuYW1lLgotICAgICAgICAvL3N0YXRpYyBmaW5hbCBpbnQgSEVBREVSX1BIT05FVElDX05BTUVfQ09MVU1OX0lOREVYCi0gICAgICAgIGludCBTVEFSUkVEID0gNTsKLSAgICAgICAgaW50IENPTlRBQ1RfUFJFU0VOQ0VfU1RBVFVTID0gNjsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTID0gNzsKLSAgICAgICAgaW50IENPTlRBQ1RfU1RBVFVTX1RJTUVTVEFNUCA9IDg7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVU19SRVNfUEFDS0FHRSA9IDk7Ci0gICAgICAgIGludCBDT05UQUNUX1NUQVRVU19MQUJFTCA9IDEwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50ZXJmYWNlIFBob3RvUXVlcnkgewotICAgICAgICBTdHJpbmdbXSBDT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIFBob3RvLlBIT1RPCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IFBIT1RPID0gMDsKLSAgICB9Ci0KLSAgICAvL1Byb2plY3Rpb24gdXNlZCBmb3IgbG9va2luZyB1cCBjb250YWN0IGlkIGZyb20gcGhvbmUgbnVtYmVyCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSE9ORV9MT09LVVBfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgIFBob25lTG9va3VwLl9JRCwKLSAgICAgICAgUGhvbmVMb29rdXAuTE9PS1VQX0tFWSwKLSAgICB9OwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBIT05FX0xPT0tVUF9DT05UQUNUX0lEX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUEhPTkVfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVggPSAxOwotCi0gICAgLy9Qcm9qZWN0aW9uIHVzZWQgZm9yIGxvb2tpbmcgdXAgY29udGFjdCBpZCBmcm9tIGVtYWlsIGFkZHJlc3MKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNQUlMX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgUmF3Q29udGFjdHMuQ09OVEFDVF9JRCwKLSAgICAgICAgQ29udGFjdHMuTE9PS1VQX0tFWSwKLSAgICB9OwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVNQUlMX0xPT0tVUF9DT05UQUNUX0lEX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU1BSUxfTE9PS1VQX0NPTlRBQ1RfTE9PS1VQX0tFWV9DT0xVTU5fSU5ERVggPSAxOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05UQUNUX0xPT0tVUF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQ29udGFjdHMuX0lELAotICAgIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFDVF9MT09LVVBfSURfQ09MVU1OX0lOREVYID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9DT05UQUNUX0lORk8gPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9QSE9ORV9MT09LVVAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9FTUFJTF9MT09LVVAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9QSE9UT19RVUVSWSA9IDM7Ci0KLSAgICBwdWJsaWMgQ29udGFjdEhlYWRlcldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGFjdEhlYWRlcldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGFjdEhlYWRlcldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0KLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0KLSAgICAgICAgICAgIChMYXlvdXRJbmZsYXRlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5jb250YWN0X2hlYWRlciwgdGhpcyk7Ci0KLSAgICAgICAgbURpc3BsYXlOYW1lVmlldyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubmFtZSk7Ci0gICAgICAgIG1BZ2dyZWdhdGVCYWRnZSA9IGZpbmRWaWV3QnlJZChSLmlkLmFnZ3JlZ2F0ZV9iYWRnZSk7Ci0KLSAgICAgICAgbVBob25ldGljTmFtZVZpZXcgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnBob25ldGljX25hbWUpOwotCi0gICAgICAgIG1TdGFycmVkVmlldyA9IChDaGVja0JveClmaW5kVmlld0J5SWQoUi5pZC5zdGFyKTsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBtUGhvdG9WaWV3ID0gKFF1aWNrQ29udGFjdEJhZGdlKSBmaW5kVmlld0J5SWQoUi5pZC5waG90byk7Ci0KLSAgICAgICAgbVByZXNlbmNlVmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnByZXNlbmNlKTsKLQotICAgICAgICBtU3RhdHVzVmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMpOwotICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c19kYXRlKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHBob3RvIHdpdGggYSByYW5kb20gIm5vIGNvbnRhY3QiIGltYWdlCi0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgIGludCBudW0gPSAoaW50KSBub3cgJiAweGY7Ci0gICAgICAgIGlmIChudW0gPCA5KSB7Ci0gICAgICAgICAgICAvLyBMZWFuaW5nIGluIGZyb20gcmlnaHQsIGNvbW1vbgotICAgICAgICAgICAgbU5vUGhvdG9SZXNvdXJjZSA9IFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlOwotICAgICAgICB9IGVsc2UgaWYgKG51bSA8IDE0KSB7Ci0gICAgICAgICAgICAvLyBMZWFuaW5nIGluIGZyb20gbGVmdCB1bmNvbW1vbgotICAgICAgICAgICAgbU5vUGhvdG9SZXNvdXJjZSA9IFIuZHJhd2FibGUuaWNfY29udGFjdF9waWN0dXJlXzI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDb21pbmcgaW4gZnJvbSB0aGUgdG9wLCByYXJlCi0gICAgICAgICAgICBtTm9QaG90b1Jlc291cmNlID0gUi5kcmF3YWJsZS5pY19jb250YWN0X3BpY3R1cmVfMzsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVDbGlja0xpc3RlbmVycygpIHsKLSAgICAgICAgbURpc3BsYXlOYW1lVmlldy5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1QaG90b1ZpZXcuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZ2l2ZW4ge0BsaW5rIENvbnRhY3RIZWFkZXJMaXN0ZW5lcn0gdG8gaGFuZGxlIGhlYWRlciBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGFjdEhlYWRlckxpc3RlbmVyKENvbnRhY3RIZWFkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVBob3RvQ2xpY2soKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uUGhvdG9DbGljayhtUGhvdG9WaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtRGlzcGxheU5hbWVDbGljaygpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5TmFtZUNsaWNrKG1EaXNwbGF5TmFtZVZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBRdWVyeUhhbmRsZXIgZXh0ZW5kcyBBc3luY1F1ZXJ5SGFuZGxlciB7Ci0KLSAgICAgICAgcHVibGljIFF1ZXJ5SGFuZGxlcihDb250ZW50UmVzb2x2ZXIgY3IpIHsKLSAgICAgICAgICAgIHN1cGVyKGNyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblF1ZXJ5Q29tcGxldGUoaW50IHRva2VuLCBPYmplY3QgY29va2llLCBDdXJzb3IgY3Vyc29yKSB7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMgIT0gbVF1ZXJ5SGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblF1ZXJ5Q29tcGxldGU6IGRpc2NhcmQgcmVzdWx0LCB0aGUgcXVlcnkgaGFuZGxlciBpcyByZXNldCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9QSE9UT19RVUVSWTogewotICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIHBob3RvCi0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgcGhvdG9CaXRtYXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjdXJzb3IuaXNOdWxsKFBob3RvUXVlcnkuUEhPVE8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBob3RvRGF0YSA9IGN1cnNvci5nZXRCbG9iKFBob3RvUXVlcnkuUEhPVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBob3RvQml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkocGhvdG9EYXRhLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9EYXRhLmxlbmd0aCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaG90b0JpdG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvdG9CaXRtYXAgPSBsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuc2V0SW1hZ2VCaXRtYXAocGhvdG9CaXRtYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsICYmIGNvb2tpZSBpbnN0YW5jZW9mIFVyaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaG90b1ZpZXcuYXNzaWduQ29udGFjdFVyaSgoVXJpKSBjb29raWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9DT05UQUNUX0lORk86IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRDb250YWN0SW5mbyhjdXJzb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVyaSBsb29rdXBVcmkgPSBDb250YWN0cy5nZXRMb29rdXBVcmkoY3Vyc29yLmdldExvbmcoQ29udGFjdFF1ZXJ5Ll9JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5MT09LVVBfS0VZKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBob3RvSWQgPSBjdXJzb3IuZ2V0TG9uZyhDb250YWN0UXVlcnkuUEhPVE9fSUQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBob3RvSWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGhvdG9WaWV3LnNldEltYWdlQml0bWFwKGxvYWRQbGFjZWhvbGRlclBob3RvKG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsICYmIGNvb2tpZSBpbnN0YW5jZW9mIFVyaSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0VXJpKChVcmkpIGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UGhvdG9RdWVyeShwaG90b0lkLCBsb29rdXBVcmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGhvdG8obG9hZFBsYWNlaG9sZGVyUGhvdG8obnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUT0tFTl9QSE9ORV9MT09LVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCAmJiBjdXJzb3IubW92ZVRvRmlyc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGFjdElkID0gY3Vyc29yLmdldExvbmcoUEhPTkVfTE9PS1VQX0NPTlRBQ1RfSURfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwS2V5ID0gY3Vyc29yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIT05FX0xPT0tVUF9DT05UQUNUX0xPT0tVUF9LRVlfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRnJvbUNvbnRhY3RVcmlJbnRlcm5hbChDb250YWN0cy5nZXRMb29rdXBVcmkoY29udGFjdElkLCBsb29rdXBLZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9uJ3QgcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciA9IChTdHJpbmcpIGNvb2tpZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5TmFtZShwaG9uZU51bWJlciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0RnJvbVBob25lKHBob25lTnVtYmVyLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVE9LRU5fRU1BSUxfTE9PS1VQOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbnRhY3RJZCA9IGN1cnNvci5nZXRMb25nKEVNQUlMX0xPT0tVUF9DT05UQUNUX0lEX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvb2t1cEtleSA9IGN1cnNvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTUFJTF9MT09LVVBfQ09OVEFDVF9MT09LVVBfS0VZX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoQ29udGFjdHMuZ2V0TG9va3VwVXJpKGNvbnRhY3RJZCwgbG9va3VwS2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRvbid0IHJlc2V0IHF1ZXJ5IGhhbmRsZXIgKi8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW1haWxBZGRyZXNzID0gKFN0cmluZykgY29va2llOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlOYW1lKGVtYWlsQWRkcmVzcywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U29jaWFsU25pcHBldChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBob3RvVmlldy5hc3NpZ25Db250YWN0RnJvbUVtYWlsKGVtYWlsQWRkcmVzcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm4gb24vb2ZmIHNob3dpbmcgb2YgdGhlIGFnZ3JlZ2F0ZSBiYWRnZSBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dBZ2dyZWdhdGVCYWRnZShib29sZWFuIHNob3dCYWdkZSkgewotICAgICAgICBtQWdncmVnYXRlQmFkZ2Uuc2V0VmlzaWJpbGl0eShzaG93QmFnZGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm4gb24vb2ZmIHNob3dpbmcgb2YgdGhlIHN0YXIgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93U3Rhcihib29sZWFuIHNob3dTdGFyKSB7Ci0gICAgICAgIG1TdGFycmVkVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdGFyID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHN0YXJyZWQgc3RhdGUgb2YgdGhpcyBoZWFkZXIgd2lkZ2V0LiBUaGlzIGRvZXNuJ3QgY2hhbmdlCi0gICAgICogdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRhY3RzfSB2YWx1ZSwgb25seSB0aGUgVUkgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcmVkKGJvb2xlYW4gc3RhcnJlZCkgewotICAgICAgICBtU3RhcnJlZFZpZXcuc2V0Q2hlY2tlZChzdGFycmVkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW51YWxseSBzZXQgdGhlIHByZXNlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZXNlbmNlKGludCBwcmVzZW5jZSkgewotICAgICAgICBtUHJlc2VuY2VWaWV3LnNldEltYWdlUmVzb3VyY2UoU3RhdHVzVXBkYXRlcy5nZXRQcmVzZW5jZUljb25SZXNvdXJjZUlkKHByZXNlbmNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBjb250YWN0IHVyaQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhY3RVcmkoVXJpIHVyaSkgewotICAgICAgICBzZXRDb250YWN0VXJpKHVyaSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBjb250YWN0IHVyaQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRhY3RVcmkoVXJpIHVyaSwgYm9vbGVhbiBzZW5kVG9GYXN0cmFjaykgewotICAgICAgICBtQ29udGFjdFVyaSA9IHVyaTsKLSAgICAgICAgaWYgKHNlbmRUb0Zhc3RyYWNrKSB7Ci0gICAgICAgICAgICBtUGhvdG9WaWV3LmFzc2lnbkNvbnRhY3RVcmkodXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbnVhbGx5IHNldCB0aGUgcGhvdG8gdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZQotICAgICAqIHVuZGVybHlpbmcge0BsaW5rIENvbnRhY3RzfSwgb25seSB0aGUgVUkgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGhvdG8oQml0bWFwIGJpdG1hcCkgewotICAgICAgICBtUGhvdG9WaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBkaXNwbGF5IG5hbWUgYW5kIHBob25ldGljIG5hbWUgdG8gc2hvdyBpbiB0aGUgaGVhZGVyLgotICAgICAqIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIHVuZGVybHlpbmcge0BsaW5rIENvbnRhY3RzfSwgb25seSB0aGUgVUkgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoQ2hhclNlcXVlbmNlIGRpc3BsYXlOYW1lLCBDaGFyU2VxdWVuY2UgcGhvbmV0aWNOYW1lKSB7Ci0gICAgICAgIG1EaXNwbGF5TmFtZVZpZXcuc2V0VGV4dChkaXNwbGF5TmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkocGhvbmV0aWNOYW1lKSkgewotICAgICAgICAgICAgbVBob25ldGljTmFtZVZpZXcuc2V0VGV4dChwaG9uZXRpY05hbWUpOwotICAgICAgICAgICAgbVBob25ldGljTmFtZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBob25ldGljTmFtZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFudWFsbHkgc2V0IHRoZSBzb2NpYWwgc25pcHBldCB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2NpYWxTbmlwcGV0KENoYXJTZXF1ZW5jZSBzbmlwcGV0KSB7Ci0gICAgICAgIGlmIChzbmlwcGV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXNBdHRyaWJ1dGlvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VGV4dChzbmlwcGV0KTsKLSAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIGxpc3Qgb2Ygc3BlY2lmaWMgTUlNRS10eXBlcyB0byBleGNsdWRlIGFuZCBub3QgZGlzcGxheS4gRm9yCi0gICAgICogZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBoaWRlIHRoZSB7QGxpbmsgQ29udGFjdHMjQ09OVEVOVF9JVEVNX1RZUEV9Ci0gICAgICogcHJvZmlsZSBpY29uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVNaW1lcyhTdHJpbmdbXSBleGNsdWRlTWltZXMpIHsKLSAgICAgICAgbUV4Y2x1ZGVNaW1lcyA9IGV4Y2x1ZGVNaW1lczsKLSAgICAgICAgbVBob3RvVmlldy5zZXRFeGNsdWRlTWltZXMoZXhjbHVkZU1pbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RMb29rdXBVcmkgYSB7Q29udGFjdHMuQ09OVEVOVF9MT09LVVBfVVJJfSBzdHlsZSBVUkkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmluZEZyb21Db250YWN0TG9va3VwVXJpKFVyaSBjb250YWN0TG9va3VwVXJpKSB7Ci0gICAgICAgIGJpbmRGcm9tQ29udGFjdFVyaUludGVybmFsKGNvbnRhY3RMb29rdXBVcmksIHRydWUgLyogcmVzZXQgcXVlcnkgaGFuZGxlciAqLyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWN0VXJpIGEge0NvbnRhY3RzLkNPTlRFTlRfVVJJfSBzdHlsZSBVUkkuCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYmluZEZyb21Db250YWN0VXJpSW50ZXJuYWwoVXJpIGNvbnRhY3RVcmksIGJvb2xlYW4gcmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgbUNvbnRhY3RVcmkgPSBjb250YWN0VXJpOwotICAgICAgICBzdGFydENvbnRhY3RRdWVyeShjb250YWN0VXJpLCByZXNldFF1ZXJ5SGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBiaW5kaW5nIGFsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGFuIGV4aXN0aW5nCi0gICAgICogY29udGFjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbWFpbEFkZHJlc3MgVGhlIGVtYWlsIGFkZHJlc3MgdXNlZCB0byBkbyBhIHJldmVyc2UgbG9va3VwIGluCi0gICAgICogdGhlIGNvbnRhY3RzIGRhdGFiYXNlLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhY3QgY29udGFpbnMgdGhpcyBlbWFpbAotICAgICAqIGFkZHJlc3MsIG9uZSBvZiB0aGVtIHdpbGwgYmUgY2hvc2VuIHRvIGJpbmQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmluZEZyb21FbWFpbChTdHJpbmcgZW1haWxBZGRyZXNzKSB7Ci0gICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fRU1BSUxfTE9PS1VQLCBlbWFpbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoRW1haWwuQ09OVEVOVF9MT09LVVBfVVJJLCBVcmkuZW5jb2RlKGVtYWlsQWRkcmVzcykpLAotICAgICAgICAgICAgICAgIEVNQUlMX0xPT0tVUF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGJpbmRpbmcgYWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gYW4gZXhpc3RpbmcKLSAgICAgKiBjb250YWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG51bWJlciBUaGUgcGhvbmUgbnVtYmVyIHVzZWQgdG8gZG8gYSByZXZlcnNlIGxvb2t1cCBpbgotICAgICAqIHRoZSBjb250YWN0cyBkYXRhYmFzZS4gSWYgbW9yZSB0aGFuIG9uZSBjb250YWN0IGNvbnRhaW5zIHRoaXMgcGhvbmUKLSAgICAgKiBudW1iZXIsIG9uZSBvZiB0aGVtIHdpbGwgYmUgY2hvc2VuIHRvIGJpbmQgdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmluZEZyb21QaG9uZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0gICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLQotICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fUEhPTkVfTE9PS1VQLCBudW1iZXIsCi0gICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoUGhvbmVMb29rdXAuQ09OVEVOVF9GSUxURVJfVVJJLCBVcmkuZW5jb2RlKG51bWJlcikpLAotICAgICAgICAgICAgICAgIFBIT05FX0xPT0tVUF9QUk9KRUNUSU9OLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzdGFydENvbnRhY3RRdWVyeQotICAgICAqCi0gICAgICogaW50ZXJuYWwgbWV0aG9kIHRvIHF1ZXJ5IGNvbnRhY3QgYnkgVXJpLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRhY3RVcmkgdGhlIGNvbnRhY3QgdXJpCi0gICAgICogQHBhcmFtIHJlc2V0UXVlcnlIYW5kbGVyIHdoZXRoZXIgdG8gdXNlIGEgbmV3IEFzeW5jUXVlcnlIYW5kbGVyIG9yIG5vdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydENvbnRhY3RRdWVyeShVcmkgY29udGFjdFVyaSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBpZiAocmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9DT05UQUNUX0lORk8sIGNvbnRhY3RVcmksIGNvbnRhY3RVcmksIENvbnRhY3RRdWVyeS5DT0xVTU5TLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0YXJ0UGhvdG9RdWVyeQotICAgICAqCi0gICAgICogaW50ZXJuYWwgbWV0aG9kIHRvIHF1ZXJ5IGNvbnRhY3QgcGhvdG8gYnkgcGhvdG8gaWQgYW5kIHVyaS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaG90b0lkIHRoZSBwaG90byBpZC4KLSAgICAgKiBAcGFyYW0gbG9va3VwS2V5IHRoZSBsb29rdXAgdXJpLgotICAgICAqIEBwYXJhbSByZXNldFF1ZXJ5SGFuZGxlciB3aGV0aGVyIHRvIHVzZSBhIG5ldyBBc3luY1F1ZXJ5SGFuZGxlciBvciBub3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRQaG90b1F1ZXJ5KGxvbmcgcGhvdG9JZCwgVXJpIGxvb2t1cEtleSwgYm9vbGVhbiByZXNldFF1ZXJ5SGFuZGxlcikgewotICAgICAgICBpZiAocmVzZXRRdWVyeUhhbmRsZXIpIHsKLSAgICAgICAgICAgIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9QSE9UT19RVUVSWSwgbG9va3VwS2V5LAotICAgICAgICAgICAgICAgIENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKERhdGEuQ09OVEVOVF9VUkksIHBob3RvSWQpLCBQaG90b1F1ZXJ5LkNPTFVNTlMsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIGZvcmNlIHRoaXMgd2lkZ2V0IHRvIGZvcmdldCBldmVyeXRoaW5nIGl0IGtub3dzIGFib3V0IHRoZSBjb250YWN0LgotICAgICAqIFdlIG5lZWQgdG8gc3RvcCBhbnkgZXhpc3RpbmcgYXN5bmMgcXVlcmllcyBmb3IgcGhvbmUsIGVtYWlsLCBjb250YWN0LCBhbmQgcGhvdG9zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpcGVDbGVhbigpIHsKLSAgICAgICAgcmVzZXRBc3luY1F1ZXJ5SGFuZGxlcigpOwotCi0gICAgICAgIHNldERpc3BsYXlOYW1lKG51bGwsIG51bGwpOwotICAgICAgICBzZXRQaG90byhsb2FkUGxhY2Vob2xkZXJQaG90byhudWxsKSk7Ci0gICAgICAgIHNldFNvY2lhbFNuaXBwZXQobnVsbCk7Ci0gICAgICAgIHNldFByZXNlbmNlKDApOwotICAgICAgICBtQ29udGFjdFVyaSA9IG51bGw7Ci0gICAgICAgIG1FeGNsdWRlTWltZXMgPSBudWxsOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXN5bmNRdWVyeUhhbmRsZXIoKSB7Ci0gICAgICAgIC8vIHRoZSBhcGkgQXN5bmNRdWVyeUhhbmRsZXIuY2FuY2VsT3BlcmF0aW9uKCkgZG9lc24ndCByZWFsbHkgd29yay4gU2luY2Ugd2UgcmVhbGx5Ci0gICAgICAgIC8vIG5lZWQgdGhlIG9sZCBhc3luYyBxdWVyaWVzIHRvIGJlIGNhbmNlbGxlZCwgbGV0J3MgZG8gaXQgdGhlIGhhcmQgd2F5LgotICAgICAgICBtUXVlcnlIYW5kbGVyID0gbmV3IFF1ZXJ5SGFuZGxlcihtQ29udGVudFJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCaW5kIHRoZSBjb250YWN0IGRldGFpbHMgcHJvdmlkZWQgYnkgdGhlIGdpdmVuIHtAbGluayBDdXJzb3J9LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJpbmRDb250YWN0SW5mbyhDdXJzb3IgYykgewotICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcGxheU5hbWUgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuRElTUExBWV9OQU1FKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBob25ldGljTmFtZSA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5QSE9ORVRJQ19OQU1FKTsKLSAgICAgICAgdGhpcy5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSwgcGhvbmV0aWNOYW1lKTsKLQotICAgICAgICBmaW5hbCBib29sZWFuIHN0YXJyZWQgPSBjLmdldEludChDb250YWN0UXVlcnkuU1RBUlJFRCkgIT0gMDsKLSAgICAgICAgbVN0YXJyZWRWaWV3LnNldENoZWNrZWQoc3RhcnJlZCk7Ci0KLSAgICAgICAgLy9TZXQgdGhlIHByZXNlbmNlIHN0YXR1cwotICAgICAgICBpZiAoIWMuaXNOdWxsKENvbnRhY3RRdWVyeS5DT05UQUNUX1BSRVNFTkNFX1NUQVRVUykpIHsKLSAgICAgICAgICAgIGludCBwcmVzZW5jZSA9IGMuZ2V0SW50KENvbnRhY3RRdWVyeS5DT05UQUNUX1BSRVNFTkNFX1NUQVRVUyk7Ci0gICAgICAgICAgICBtUHJlc2VuY2VWaWV3LnNldEltYWdlUmVzb3VyY2UoU3RhdHVzVXBkYXRlcy5nZXRQcmVzZW5jZUljb25SZXNvdXJjZUlkKHByZXNlbmNlKSk7Ci0gICAgICAgICAgICBtUHJlc2VuY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QcmVzZW5jZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TZXQgdGhlIHN0YXR1cyB1cGRhdGUKLSAgICAgICAgU3RyaW5nIHN0YXR1cyA9IGMuZ2V0U3RyaW5nKENvbnRhY3RRdWVyeS5DT05UQUNUX1NUQVRVUyk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3RhdHVzKSkgewotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VGV4dChzdGF0dXMpOwotICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGltZXN0YW1wID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKCFjLmlzTnVsbChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QKSkgewotICAgICAgICAgICAgICAgIGxvbmcgZGF0ZSA9IGMuZ2V0TG9uZyhDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfVElNRVNUQU1QKTsKLQotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGF0ZS90aW1lIGZpZWxkIGJ5IG1peGluZyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUKLSAgICAgICAgICAgICAgICAvLyB0aW1lcy4KLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBEYXRlVXRpbHMuRk9STUFUX0FCQlJFVl9SRUxBVElWRTsKLQotICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IERhdGVVdGlscy5nZXRSZWxhdGl2ZVRpbWVTcGFuU3RyaW5nKGRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgRGF0ZVV0aWxzLk1JTlVURV9JTl9NSUxMSVMsIGZsYWdzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKCFjLmlzTnVsbChDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfTEFCRUwpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc1BhY2thZ2UgPSBjLmdldFN0cmluZyhDb250YWN0UXVlcnkuQ09OVEFDVF9TVEFUVVNfUkVTX1BBQ0tBR0UpOwotICAgICAgICAgICAgICAgIGludCBsYWJlbFJlc291cmNlID0gYy5nZXRJbnQoQ29udGFjdFF1ZXJ5LkNPTlRBQ1RfU1RBVFVTX0xBQkVMKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzOwotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShyZXNQYWNrYWdlKSkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldENvbnRleHQoKS5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gcG0uZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24ocmVzUGFja2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250YWN0IHN0YXR1cyB1cGRhdGUgcmVzb3VyY2UgcGFja2FnZSBub3QgZm91bmQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNQYWNrYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzb3VyY2VzLmdldFN0cmluZyhsYWJlbFJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udGFjdCBzdGF0dXMgdXBkYXRlIHJlc291cmNlIG5vdCBmb3VuZDogIiArIHJlc1BhY2thZ2UgKyAiQCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYWJlbFJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGF0dHJpYnV0aW9uOwotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCAhPSBudWxsICYmIGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5jb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBsYWJlbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcCA9PSBudWxsICYmIGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGlvbiA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5jb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRpb24gPSB0aW1lc3RhbXA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRUZXh0KGF0dHJpYnV0aW9uKTsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0F0dHJpYnV0aW9uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzQXR0cmlidXRpb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgIHN3aXRjaCAodmlldy5nZXRJZCgpKSB7Ci0gICAgICAgICAgICBjYXNlIFIuaWQuc3RhcjogewotICAgICAgICAgICAgICAgIC8vIFRvZ2dsZSAic3RhcnJlZCIgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgYSBjb250YWN0Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250YWN0VXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChDb250YWN0cy5TVEFSUkVELCBtU3RhcnJlZFZpZXcuaXNDaGVja2VkKCkpOwotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFJlc29sdmVyLnVwZGF0ZShtQ29udGFjdFVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFIuaWQucGhvdG86IHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtUGhvdG9DbGljaygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBSLmlkLm5hbWU6IHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtRGlzcGxheU5hbWVDbGljaygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCaXRtYXAgbG9hZFBsYWNlaG9sZGVyUGhvdG8oQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgaWYgKG1Ob1Bob3RvUmVzb3VyY2UgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCi0gICAgICAgICAgICAgICAgbU5vUGhvdG9SZXNvdXJjZSwgb3B0aW9ucyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKaW5kZXggZmE0N2ZmNi4uMjNlMjI3NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwpAQCAtMzksNyArMzksNyBAQAogLyoqCiAgKiBEaXNwbGF5cyB0aGUgdGltZQogICovCi1wdWJsaWMgY2xhc3MgRGlnaXRhbENsb2NrIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKK3B1YmxpYyBjbGFzcyBEaWdpdGFsQ2xvY2sgZXh0ZW5kcyBSZWxhdGl2ZUxheW91dCB7CiAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTTEyID0gImg6bW0iOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNMjQgPSAia2s6bW0iOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9FZGl0U3R5bGVkVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE5N2MwLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRWRpdFN0eWxlZFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2cuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlJlY3RTaGFwZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkVkaXRhYmxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5IdG1sOwotaW1wb3J0IGFuZHJvaWQudGV4dC5MYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5lZDsKLWltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkFycm93S2V5TW92ZW1lbnRNZXRob2Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFic29sdXRlU2l6ZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkFsaWdubWVudFNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLkNoYXJhY3RlclN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5Gb3JlZ3JvdW5kQ29sb3JTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5JbWFnZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlBhcmFncmFwaFN0eWxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5RdW90ZVNwYW47Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotLyoqCi0gKiBFZGl0U3R5bGVkVGV4dCBleHRlbmRzIEVkaXRUZXh0IGZvciBtYW5hZ2luZyB0aGUgZmxvdyBhbmQgc3RhdHVzIHRvIGVkaXQKLSAqIHRoZSBzdHlsZWQgdGV4dC4gVGhpcyBtYW5hZ2VzIHRoZSBzdGF0ZXMgYW5kIGZsb3dzIG9mIGVkaXRpbmcsIHN1cHBvcnRzCi0gKiBpbnNlcnRpbmcgaW1hZ2UsIGltcG9ydC9leHBvcnQgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRWRpdFN0eWxlZFRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbW9kZXMgb2YgZWRpdGluZyBhY3Rpb25zLgotICAgICAqLwotICAgIC8qKiBUaGUgbW9kZSB0aGF0IG5vIGVkaXRpbmcgYWN0aW9uIGlzIGRvbmUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9OT1RISU5HID0gMDsKLSAgICAvKiogVGhlIG1vZGUgb2YgY29weS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NPUFkgPSAxOwotICAgIC8qKiBUaGUgbW9kZSBvZiBwYXN0ZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1BBU1RFID0gMjsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgc2l6ZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NJWkUgPSAzOwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBjb2xvci4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0NPTE9SID0gNDsKLSAgICAvKiogVGhlIG1vZGUgb2Ygc2VsZWN0aW9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU0VMRUNUID0gNTsKLSAgICAvKiogVGhlIG1vZGUgb2YgY2hhbmdpbmcgYWxpZ25tZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfQUxJR04gPSA2OwotICAgIC8qKiBUaGUgbW9kZSBvZiBjaGFuZ2luZyBjdXQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9DVVQgPSA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIHN0YXRlIG9mIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzbid0IHN0YXJ0ZWQuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VMRUNUX09GRiA9IDA7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBzdGFydGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVF9PTiA9IDE7Ci0gICAgLyoqIFRoZSBzdGF0ZSB0aGF0IHNlbGVjdGlvbiBpcyBkb25lLCBidXQgbm90IGZpeGVkLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NFTEVDVEVEID0gMjsKLSAgICAvKiogVGhlIHN0YXRlIHRoYXQgc2VsZWN0aW9uIGlzIGRvbmUgYW5kIG5vdCBmaXhlZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9TRUxFQ1RfRklYID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBoZWxwIG1lc3NhZ2Ugc3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19OVUxMID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19DT1BZX0JVRl9CTEFOSyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElOVF9NU0dfU0VMRUNUX1NUQVJUID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19TRUxFQ1RfRU5EID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBISU5UX01TR19QVVNIX0NPTVBFVEUgPSA0OwotCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGhlbHAgbWVzc2FnZSBzdHJpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiA9IDB4MDBGRkZGRkY7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dEludGVyZmFjZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIG5vdGlmeWluZyBtZXNzYWdlcyB0bwotICAgICAqIGNhbGxpbmcgY2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5SGludE1zZyhpbnQgbXNnSWQpOwotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlTdGF0ZUNoYW5nZWQoaW50IG1vZGUsIGludCBzdGF0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIG1FU1RJbnRlcmZhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBFZGl0U3R5bGVkVGV4dEVkaXRvck1hbmFnZXIgbWFuYWdlcyB0aGUgZmxvdyBhbmQgc3RhdHVzIG9mIGVhY2gKLSAgICAgKiBmdW5jdGlvbiBmb3IgZWRpdGluZyBzdHlsZWQgdGV4dC4KLSAgICAgKi8KLSAgICBwcml2YXRlIEVkaXRvck1hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0Q29udmVydGVyIG1Db252ZXJ0ZXI7Ci0gICAgcHJpdmF0ZSBTdHlsZWRUZXh0RGlhbG9nIG1EaWFsb2c7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtRGVmYXVsdEJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLQotICAgIC8qKgotICAgICAqIEVkaXRTdHlsZWRUZXh0IGV4dGVuZHMgRWRpdFRleHQgZm9yIG1hbmFnaW5nIGZsb3cgb2YgZWFjaCBlZGl0aW5nCi0gICAgICogYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBFZGl0U3R5bGVkVGV4dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWRpdFN0eWxlZFRleHQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVkaXRTdHlsZWRUZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBOb3RpZmllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb3RpZmllcihFZGl0U3R5bGVkVGV4dE5vdGlmaWVyIGVzdEludGVyZmFjZSkgewotICAgICAgICBtRVNUSW50ZXJmYWNlID0gZXN0SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBCdWlsZGVyIGZvciBBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRlcgotICAgICAqICAgICAgICAgICAgQnVpbGRlciBmb3Igb3BlbmluZyBBbGVydCBEaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnVpbGRlcihCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgbURpYWxvZy5zZXRCdWlsZGVyKGJ1aWxkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBQYXJhbWV0ZXJzIGZvciBDb2xvckFsZXJ0RGlhbG9nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcnRpdGxlCi0gICAgICogICAgICAgICAgICBUaXRsZSBmb3IgQWxlcnQgRGlhbG9nLgotICAgICAqIEBwYXJhbSBjb2xvcm5hbWVzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIG5hbWUgb2Ygc2VsZWN0aW5nIGNvbG9yLgotICAgICAqIEBwYXJhbSBjb2xvcmludHMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgaW50IG9mIGNvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbG9yQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIGNvbG9ydGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBjb2xvcm5hbWVzLCBDaGFyU2VxdWVuY2VbXSBjb2xvcmludHMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRDb2xvckFsZXJ0UGFyYW1zKGNvbG9ydGl0bGUsIGNvbG9ybmFtZXMsIGNvbG9yaW50cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFBhcmFtZXRlcnMgZm9yIFNpemVBbGVydERpYWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2l6ZXRpdGxlCi0gICAgICogICAgICAgICAgICBUaXRsZSBmb3IgQWxlcnQgRGlhbG9nLgotICAgICAqIEBwYXJhbSBzaXplbmFtZXMKLSAgICAgKiAgICAgICAgICAgIExpc3Qgb2YgbmFtZSBvZiBzZWxlY3Rpbmcgc2l6ZS4KLSAgICAgKiBAcGFyYW0gc2l6ZWRpc3BsYXlpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBzaXplIGRpc3BsYXllZCBpbiBUZXh0Vmlldy4KLSAgICAgKiBAcGFyYW0gc2l6ZXNlbmRpbnRzCi0gICAgICogICAgICAgICAgICBMaXN0IG9mIGludCBvZiBzaXplIGV4cG9ydGVkIHRvIEhUTUwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZUFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBzaXpldGl0bGUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplbmFtZXMsIENoYXJTZXF1ZW5jZVtdIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIHNpemVzZW5kaW50cykgewotICAgICAgICBtRGlhbG9nLnNldFNpemVBbGVydFBhcmFtcyhzaXpldGl0bGUsIHNpemVuYW1lcywgc2l6ZWRpc3BsYXlpbnRzLAotICAgICAgICAgICAgICAgIHNpemVzZW5kaW50cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxpZ25BbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgYWxpZ250aXRsZSwKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGFsaWdubmFtZXMpIHsKLSAgICAgICAgbURpYWxvZy5zZXRBbGlnbkFsZXJ0UGFyYW1zKGFsaWdudGl0bGUsIGFsaWdubmFtZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBpZiAobU1hbmFnZXIuaXNTb2Z0S2V5QmxvY2tlZCgpICYmCi0gICAgICAgICAgICAgICAgZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICBjYW5jZWxMb25nUHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBib29sZWFuIHN1cGVyUmVzdWx0ID0gc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKLSAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25Ub3VjaEV2ZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyUmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGVkaXRpbmcuIFRoaXMgZnVuY3Rpb24gaGF2ZSB0byBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIGVkaXRpbmcKLSAgICAgKiBhY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFZGl0KCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0RWRpdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZCBlZGl0aW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5kRWRpdCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25FbmRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIkNvcHkiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29weSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydENvcHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiQ3V0IiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydEN1dCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEN1dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0ICJQYXN0ZSIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQYXN0ZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFBhc3RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIlNpemUiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2l6ZSgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBjaGFuZ2luZyAiQ29sb3IiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0Q29sb3IoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRDb2xvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGNoYW5naW5nICJCYWNrZ3JvdW5kQ29sb3IiIGFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN0YXJ0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICBtTWFuYWdlci5vblN0YXJ0QmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgY2hhbmdpbmcgIkFsaWdubWVudCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRBbGlnbigpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydEFsaWduKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgIlNlbGVjdCIgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTZWxlY3QoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uU3RhcnRTZWxlY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCAiU2VsZWN0QWxsIiBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdEFsbCgpIHsKLSAgICAgICAgbU1hbmFnZXIub25TdGFydFNlbGVjdEFsbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpeCBTZWxlY3RlZCBJdGVtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRml4U2VsZWN0ZWRJdGVtKCkgewotICAgICAgICBtTWFuYWdlci5vbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydEltYWdlIHRvIFRleHRWaWV3IGJ5IHVzaW5nIFVSSQotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIFVSSSBvZiB0aGUgaWFtZ2UgaW5zZXJ0ZWQgdG8gVGV4dFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShVcmkgdXJpKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SW1hZ2UodXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRJbWFnZSB0byBUZXh0VmlldyBieSB1c2luZyByZXNvdXJjZSBJRAotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNJZAotICAgICAqICAgICAgICAgICAgUmVzb3VyY2UgSUQgb2YgdGhlIGlhbWdlIGluc2VydGVkIHRvIFRleHRWaWV3LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SW1hZ2UoaW50IHJlc0lkKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SW1hZ2UocmVzSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKSB7Ci0gICAgICAgIG1NYW5hZ2VyLm9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNsZWFyU3R5bGVzKCkgewotICAgICAgICBtTWFuYWdlci5vbkNsZWFyU3R5bGVzKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldCBTaXplIG9mIHRoZSBJdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtU2l6ZShpbnQgc2l6ZSkgewotICAgICAgICBtTWFuYWdlci5zZXRJdGVtU2l6ZShzaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQ29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgY29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbUNvbG9yKGludCBjb2xvcikgewotICAgICAgICBtTWFuYWdlci5zZXRJdGVtQ29sb3IoY29sb3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBBbGlnbm1lbnQgb2YgdGhlIEl0ZW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbG9yCi0gICAgICogICAgICAgICAgICBUaGUgY29sb3Igb2YgdGhlIEl0ZW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWxpZ25tZW50KExheW91dC5BbGlnbm1lbnQgYWxpZ24pIHsKLSAgICAgICAgbU1hbmFnZXIuc2V0QWxpZ25tZW50KGFsaWduKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb2xvcgotICAgICAqICAgICAgICAgICAgVGhlIGJhY2tncm91bmQgY29sb3Igb2Ygdmlldy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIHN1cGVyLnNldEJhY2tncm91bmRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgaHRtbCB0byBFZGl0U3R5bGVkVGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaHRtbAotICAgICAqICAgICAgICAgICAgVGhlIGh0bWwgdG8gYmUgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEh0bWwoU3RyaW5nIGh0bWwpIHsKLSAgICAgICAgbUNvbnZlcnRlci5TZXRIdG1sKGh0bWwpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIGVkaXRpbmcgaXMgc3RhcnRlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBXaGV0aGVyIGVkaXRpbmcgaXMgc3RhcnRlZCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0dGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzRWRpdHRpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIHN0eWxlZCB0ZXh0IG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgc3R5bGVkIHRleHQgb3Igbm90LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3R5bGVkVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzU3R5bGVkVGV4dCgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDaGVjayB3aGV0aGVyIFNvZnRLZXkgaXMgQmxvY2tlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIFNvZnRLZXkgaXMgQmxvY2tlZCBvciBub3QuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTb2Z0S2V5QmxvY2tlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmlzU29mdEtleUJsb2NrZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1vZGUgb2YgdGhlIGFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBtb2RlIG9mIHRoZSBhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFZGl0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmdldEVkaXRNb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdGF0ZSBvZiB0aGUgc2VsZWN0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZWxlY3RTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1NYW5hZ2VyLmdldFNlbGVjdFN0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRJbnB1dEV4dHJhcyhib29sZWFuIGNyZWF0ZSkgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tZ2V0SW5wdXRFeHRyYXMiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYnVuZGxlID0gc3VwZXIuZ2V0SW5wdXRFeHRyYXMoY3JlYXRlKTsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oImFsbG93RW1vamkiLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udmVydGVyLmdldEh0bWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0YXRlIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaXMKLSAgICAgKiAgICAgICAgICAgIFRoZSBhcnJheSBvZiB1c2VkIHVyaXMuCi0gICAgICogQHJldHVybiBUaGUgc3RhdGUgb2YgdGhlIHNlbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWwoQXJyYXlMaXN0PFVyaT4gdXJpcykgewotICAgICAgICBtQ29udmVydGVyLmdldFVyaUFycmF5KHVyaXMsIGdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybiBtQ29udmVydGVyLmdldEh0bWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQmFja2dyb3VuZCBjb2xvciBvZiBWaWV3LgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgcmV0dXJuIG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEZvcmVncm91bmQgY29sb3Igb2YgVmlldy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIFZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRGb3JlR3JvdW5kQ29sb3IoaW50IHBvcykgewotICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tZ2V0Rm9yZUdyb3VuZENvbG9yOiAiICsgcG9zKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zIDwgMCB8fCBwb3MgPiBnZXRUZXh0KCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS1nZXRGb3JlR3JvdW5kQ29sb3I6IElsbGlnYWwgcG9zaXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm4gREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRm9yZWdyb3VuZENvbG9yU3BhbltdIHNwYW5zID0KLSAgICAgICAgICAgICAgICBnZXRUZXh0KCkuZ2V0U3BhbnMocG9zLCBwb3MsIEZvcmVncm91bmRDb2xvclNwYW4uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHNwYW5zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3BhbnNbMF0uZ2V0Rm9yZWdyb3VuZENvbG9yKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIG1lbWJlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5pdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJlcXVlc3RGb2N1cygpOwotICAgICAgICBtRGVmYXVsdEJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIG1NYW5hZ2VyID0gbmV3IEVkaXRvck1hbmFnZXIodGhpcyk7Ci0gICAgICAgIG1Db252ZXJ0ZXIgPSBuZXcgU3R5bGVkVGV4dENvbnZlcnRlcih0aGlzKTsKLSAgICAgICAgbURpYWxvZyA9IG5ldyBTdHlsZWRUZXh0RGlhbG9nKHRoaXMpOwotICAgICAgICBzZXRNb3ZlbWVudE1ldGhvZChuZXcgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kKG1NYW5hZ2VyKSk7Ci0gICAgICAgIG1NYW5hZ2VyLmJsb2NrU29mdEtleSgpOwotICAgICAgICBtTWFuYWdlci51bmJsb2NrU29mdEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgRm9yZWdyb3VuZCBDb2xvciBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dGb3JlZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgQmFja2dyb3VuZCBDb2xvciBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydERpYWxvZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3cgU2l6ZSBTZWxlY3RpbmcgRGlhbG9nLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvblNob3dTaXplQWxlcnQoKSB7Ci0gICAgICAgIG1EaWFsb2cub25TaG93U2l6ZUFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyBBbGlnbm1lbnQgU2VsZWN0aW5nIERpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgb25TaG93QWxpZ25BbGVydCgpIHsKLSAgICAgICAgbURpYWxvZy5vblNob3dBbGlnbkFsZXJ0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IGhpbnQgbWVzc2FnZXMgd2hhdCBhY3Rpb24gaXMgZXhwZWN0ZWQgdG8gY2FsbGluZyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnSWQKLSAgICAgKiAgICAgICAgICAgIElkIG9mIHRoZSBoaW50IG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEhpbnRNZXNzYWdlKGludCBtc2dJZCkgewotICAgICAgICBpZiAobUVTVEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRVNUSW50ZXJmYWNlLm5vdGlmeUhpbnRNc2cobXNnSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBldmVudCB0aGF0IHRoZSBtb2RlIGFuZCBzdGF0ZSBhcmUgY2hhbmdlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICAgICAgICAgICAgTW9kZSBvZiB0aGUgZWRpdGluZyBhY3Rpb24uCi0gICAgICogQHBhcmFtIHN0YXRlCi0gICAgICogICAgICAgICAgICBNb2RlIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlZChpbnQgbW9kZSwgaW50IHN0YXRlKSB7Ci0gICAgICAgIGlmIChtRVNUSW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FU1RJbnRlcmZhY2Uubm90aWZ5U3RhdGVDaGFuZ2VkKG1vZGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVkaXRvck1hbmFnZXIgbWFuYWdlcyB0aGUgZmxvdyBhbmQgc3RhdHVzIG9mIGVkaXRpbmcgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEVkaXRvck1hbmFnZXIgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVkaXRGbGFnID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU29mdEtleUJsb2NrRmxhZyA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGludCBtTW9kZSA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1TdGF0ZSA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DdXJTdGFydCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DdXJFbmQgPSAwOwotICAgICAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgRWRpdG9yTWFuYWdlcihFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRFZGl0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uc3RhcnRlZGl0OiIpOwotICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRW5kRWRpdCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uRW5kRWRpdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb3B5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydENvcHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUNvcHkoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEN1dCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU3RhcnRDdXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUN1dCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0UGFzdGUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvblN0YXJ0UGFzdGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVBhc3RlKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRTaXplKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydFNpemUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVNpemUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEFsaWduKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TdGFydEFsaWduUmlnaHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUFsaWduKCk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29sb3IoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5vblNob3dCYWNrZ3JvdW5kQ29sb3JBbGVydCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0U2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NlbGVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1NFTEVDVDsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09GRikgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1bnNldFNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnNvck1vdmVkKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1ZpZXciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09OIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFNlbGVjdEFsbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tTZWxlY3RBbGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVNlbGVjdEFsbCgpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZpeFNlbGVjdGVkSXRlbSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb21wbGV0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlQ29tcGxldGUoKTsKLSAgICAgICAgICAgIG1FU1Qubm90aWZ5U3RhdGVDaGFuZ2VkKG1Nb2RlLCBtU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25JbnNlcnRJbWFnZShVcmkgdXJpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEltYWdlIGJ5IFVSSTogIiArIHVyaS5nZXRQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgdXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBJbWFnZVNwYW4obUVTVC5nZXRDb250ZXh0KCksIHVyaSkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluc2VydEltYWdlKGludCByZXNJRCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25JbnNlcnRJbWFnZSBieSByZXNJRCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBJbWFnZVNwYW4obUVTVC5nZXRDb250ZXh0KCksIHJlc0lEKSk7Ci0gICAgICAgICAgICBtRVNULm5vdGlmeVN0YXRlQ2hhbmdlZChtTW9kZSwgbVN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW5zZXJ0SG9yaXpvbnRhbExpbmUoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBvbkluc2VydEhvcml6b250YWxMaW5lOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zZXJ0SW1hZ2VTcGFuKG5ldyBIb3Jpem9udGFsTGluZVNwYW4oMHhGRjAwMDAwMCwgbUVTVCkpOwotICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsZWFyU3R5bGVzKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGVhclN0eWxlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRWRpdGFibGUgdHh0ID0gbUVTVC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gdHh0Lmxlbmd0aCgpOwotICAgICAgICAgICAgT2JqZWN0W10gc3R5bGVzID0gdHh0LmdldFNwYW5zKDAsIGxlbiwgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHN0eWxlIDogc3R5bGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlIGluc3RhbmNlb2YgUGFyYWdyYXBoU3R5bGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlIGluc3RhbmNlb2YgUXVvdGVTcGFuIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSBpbnN0YW5jZW9mIENoYXJhY3RlclN0eWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSBpbnN0YW5jZW9mIEltYWdlU3BhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gdHh0LmdldFNwYW5TdGFydChzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gdHh0LmdldFNwYW5FbmQoc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHh0LnJlcGxhY2Uoc3RhcnQsIGVuZCwgIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5yZW1vdmVTcGFuKHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNldEJhY2tncm91bmREcmF3YWJsZShtRVNULm1EZWZhdWx0QmFja2dyb3VuZCk7Ci0gICAgICAgICAgICBtRVNULm1CYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJdGVtU2l6ZShpbnQgc2l6ZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja1NpemVJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlU2l6ZVNlbGVjdGVkVGV4dChzaXplKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1Db2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uQ2xpY2tDb2xvckl0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNURUQgfHwgbVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VDb2xvclNlbGVjdGVkVGV4dChjb2xvcik7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzZXRFZGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnQoTGF5b3V0LkFsaWdubWVudCBhbGlnbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25DbGlja0NvbG9ySXRlbSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fCBtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIGNoYW5nZUFsaWduKGFsaWduKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdHRpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVkaXRGbGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlIHN0eWxlIG9mIHRoZSBzcGFuIGlzIGFkZGVkLCBhZGQgY2hlY2sgY2FzZSBmb3IgdGhhdCBzdHlsZSAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0eWxlZFRleHQoKSB7Ci0gICAgICAgICAgICBFZGl0YWJsZSB0eHQgPSBtRVNULmdldFRleHQoKTsKLSAgICAgICAgICAgIGludCBsZW4gPSB0eHQubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAodHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgUGFyYWdyYXBoU3R5bGUuY2xhc3MpLmxlbmd0aCA+IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgdHh0LmdldFNwYW5zKDAsIGxlbiAtMSwgUXVvdGVTcGFuLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHR4dC5nZXRTcGFucygwLCBsZW4gLTEsIENoYXJhY3RlclN0eWxlLmNsYXNzKS5sZW5ndGggPiAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1FU1QubUJhY2tncm91bmRDb2xvciAhPSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU29mdEtleUJsb2NrZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNvZnRLZXlCbG9ja0ZsYWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Nb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZWxlY3RTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFNlbGVjdGlvblN0YXJ0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJTdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uRW5kKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJFbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZG9OZXh0SGFuZGxlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZG9OZXh0SGFuZGxlOiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNT0RFX0NPUFk6Ci0gICAgICAgICAgICAgICAgaGFuZGxlQ29weSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0NVVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVDdXQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTU9ERV9QQVNURToKLSAgICAgICAgICAgICAgICBoYW5kbGVQYXN0ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX1NJWkU6Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2l6ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNT0RFX0NPTE9SOgotICAgICAgICAgICAgICAgIGhhbmRsZUNvbG9yKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1PREVfQUxJR046Ci0gICAgICAgICAgICAgICAgaGFuZGxlQWxpZ24oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2FuY2VsKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ2FuY2VsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTW9kZSA9IE1PREVfTk9USElORzsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9PRkY7Ci0gICAgICAgICAgICBtRWRpdEZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ2FuY2VsOiIgKyBtRVNULmdldElucHV0VHlwZSgpKTsKLSAgICAgICAgICAgIHVuYmxvY2tTb2Z0S2V5KCk7Ci0gICAgICAgICAgICB1bnNldFNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbXBsZXRlKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVF9GSVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUZXh0Vmlld0Z1bmMoaW50IG1vZGUsIGludCBpZCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlVGV4dFZpZXc6ICIgKyBtTW9kZSArICIsIiArIG1TdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCIgKyBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05PVEhJTkcgfHwgbU1vZGUgPT0gTU9ERV9TRUxFQ1QpIHsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMobW9kZSwgaWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgIT0gbW9kZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVUZXh0Vmlld0Z1bmMobW9kZSwgaWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX0ZJWCkgewotICAgICAgICAgICAgICAgIG1FU1Qub25UZXh0Q29udGV4dE1lbnVJdGVtKGlkKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXNldEVkaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDb3B5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlQ29weTogIiArIG1Nb2RlICsgIiwiICsgbVN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZVRleHRWaWV3RnVuYyhNT0RFX0NPUFksIGFuZHJvaWQuUi5pZC5jb3B5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDdXQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVDb3B5OiAiICsgbU1vZGUgKyAiLCIgKyBtU3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlVGV4dFZpZXdGdW5jKE1PREVfQ1VULCBhbmRyb2lkLlIuaWQuY3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYXN0ZSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVBhc3RlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FU1Qub25UZXh0Q29udGV4dE1lbnVJdGVtKGFuZHJvaWQuUi5pZC5wYXN0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2V0U3BhbihpbnQgbW9kZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjoiICsgbUVkaXRGbGFnICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0ZSArICcsJyArIG1Nb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUVkaXRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBoYW5kbGVTZXRTcGFuOiBFZGl0aW5nIGlzIG5vdCBzdGFydGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05PVEhJTkcgfHwgbU1vZGUgPT0gTU9ERV9TRUxFQ1QpIHsKLSAgICAgICAgICAgICAgICBtTW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfRklYOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRTcGFuKG1vZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgIT0gbW9kZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUNhbmNlbCgpOwotICAgICAgICAgICAgICAgIG1Nb2RlID0gbW9kZTsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZXRTcGFuKG1vZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVF9GSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19OVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTU9ERV9DT0xPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1PREVfU0laRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FU1Qub25TaG93U2l6ZUFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNT0RFX0FMSUdOOgotICAgICAgICAgICAgICAgICAgICAgICAgbUVTVC5vblNob3dBbGlnbkFsZXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaGFuZGxlU2V0U3BhbjogaW52YWxpZCBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNldFNwYW46IGRvIG5vdGhpbmcuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNpemUoKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29sb3IoKSB7Ci0gICAgICAgICAgICBoYW5kbGVTZXRTcGFuKE1PREVfQ09MT1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFsaWduKCkgewotICAgICAgICAgICAgaGFuZGxlU2V0U3BhbihNT0RFX0FMSUdOKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3QoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBoYW5kbGVTZWxlY3Q6IiArIG1FZGl0RmxhZyArICIsIiArIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1FZGl0RmxhZykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09GRikgewotICAgICAgICAgICAgICAgIGlmIChpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gaXMgb2ZmLCBidXQgc2VsZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0U2VsZWN0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICBibG9ja1NvZnRLZXkoKTsKLSAgICAgICAgICAgICAgICBtRVNULnNldEhpbnRNZXNzYWdlKEhJTlRfTVNHX1NFTEVDVF9FTkQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU0VMRUNUX09OKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGV4dFNlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlbGVjdGlvbiBub3cgc3RhcnQsIGJ1dCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcygpOwotICAgICAgICAgICAgICAgIG1FU1Quc2V0SGludE1lc3NhZ2UoSElOVF9NU0dfUFVTSF9DT01QRVRFKTsKLSAgICAgICAgICAgICAgICBkb05leHRIYW5kbGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1RleHRTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJTZWxlY3Rpb24gaXMgZG9uZSwgYnV0IG5vdCBzZWxlY3RlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcygpOwotICAgICAgICAgICAgICAgIGRvTmV4dEhhbmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbCgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGhhbmRsZVNlbGVjdEFsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtRWRpdEZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzZXRFZGl0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJSZXNldCBFZGl0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJsb2NrU29mdEtleSgpOwotICAgICAgICAgICAgaGFuZGxlQ2FuY2VsKCk7Ci0gICAgICAgICAgICBtRWRpdEZsYWcgPSB0cnVlOwotICAgICAgICAgICAgbUVTVC5zZXRIaW50TWVzc2FnZShISU5UX01TR19TRUxFQ1RfU1RBUlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2VsZWN0OiIgKyBtQ3VyU3RhcnQgKyAiLCIgKyBtQ3VyRW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ3VyU3RhcnQgPj0gMCAmJiBtQ3VyU3RhcnQgPD0gbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUN1ckVuZCA+PSAwICYmIG1DdXJFbmQgPD0gbUVTVC5nZXRUZXh0KCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUN1clN0YXJ0IDwgbUN1ckVuZCkgewotICAgICAgICAgICAgICAgICAgICBtRVNULnNldFNlbGVjdGlvbihtQ3VyU3RhcnQsIG1DdXJFbmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKG1DdXJFbmQsIG1DdXJTdGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NFTEVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdCBpcyBvbiwgYnV0IGN1cnNvciBwb3NpdGlvbnMgYXJlIGlsbGlnYWwuOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRVNULmdldFRleHQoKS5sZW5ndGgoKSArICIsIiArIG1DdXJTdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIiArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVuc2V0U2VsZWN0KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb2ZmU2VsZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgY3VycnBvcyA9IG1FU1QuZ2V0U2VsZWN0aW9uU3RhcnQoKTsKLSAgICAgICAgICAgIG1FU1Quc2V0U2VsZWN0aW9uKGN1cnJwb3MsIGN1cnJwb3MpOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU0VMRUNUX09GRjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RTdGFydFBvcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHNldFNlbGVjdFN0YXJ0UG9zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VyU3RhcnQgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TRUxFQ1RfT047Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRFbmRQb3MoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTZWxlY3RFbmRQb3M6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUVTVC5nZXRTZWxlY3Rpb25TdGFydCgpID09IG1DdXJTdGFydCkgewotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkRW5kUG9zKG1FU1QuZ2V0U2VsZWN0aW9uRW5kKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZEVuZFBvcyhtRVNULmdldFNlbGVjdGlvblN0YXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRFbmRQb3MoaW50IHBvcykgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0U2VsZWN0ZWRFbmRQb3M6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VyRW5kID0gcG9zOwotICAgICAgICAgICAgc2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNUZXh0U2VsZWN0ZWQoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpc1RleHRTZWxlY3RlZDoiICsgbUN1clN0YXJ0ICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1DdXJFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChtQ3VyU3RhcnQgIT0gbUN1ckVuZCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9PSBTVEFURV9TRUxFQ1RfRklYKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTdHlsZWRUZXh0U3BhbihPYmplY3Qgc3BhbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBzZXRTdHlsZWRUZXh0U3BhbjoiICsgbU1vZGUgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhcnQgKyAiLCIgKyBlbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuc2V0U3BhbihzcGFuLCBzdGFydCwgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3BhbiwgZW5kLCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVNpemVTZWxlY3RlZFRleHQoaW50IHNpemUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZVNpemU6IiArIHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEFic29sdXRlU2l6ZVNwYW4oc2l6ZSksCi0gICAgICAgICAgICAgICAgbUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VDb2xvclNlbGVjdGVkVGV4dChpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoYW5nZUNvbG9yOiIgKyBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHlsZWRUZXh0U3BhbihuZXcgRm9yZWdyb3VuZENvbG9yU3Bhbihjb2xvciksCi0gICAgICAgICAgICAgICAgbUN1clN0YXJ0LCBtQ3VyRW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VBbGlnbihMYXlvdXQuQWxpZ25tZW50IGFsaWduKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGFuZ2VBbGlnbjoiICsgYWxpZ24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3R5bGVkVGV4dFNwYW4obmV3IEFsaWdubWVudFNwYW4uU3RhbmRhcmQoYWxpZ24pLAotICAgICAgICAgICAgICAgICAgICBmaW5kTGluZVN0YXJ0KG1FU1QuZ2V0VGV4dCgpLCBtQ3VyU3RhcnQpLAotICAgICAgICAgICAgICAgICAgICBmaW5kTGluZUVuZChtRVNULmdldFRleHQoKSwgbUN1ckVuZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZExpbmVTdGFydChFZGl0YWJsZSB0ZXh0LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZmluZExpbmVTdGFydDogY3VycjoiICsgY3VycmVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBsZW5ndGg6IiArIHRleHQubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHBvcyA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBmb3IgKDsgcG9zID4gMDsgcG9zLS0pIHsKLSAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQocG9zIC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydEltYWdlU3BhbihJbWFnZVNwYW4gc3BhbikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gaW5zZXJ0SW1hZ2VTcGFuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3BhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBpbnNlcnRpbWFnZXNwYW46IiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRJbnRyaW5zaWNIZWlnaHQoKSArICIsIiArIHNwYW4uZ2V0RHJhd2FibGUoKS5nZXRJbnRyaW5zaWNXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGluc2VydGltYWdlc3BhbjoiICsgc3Bhbi5nZXREcmF3YWJsZSgpLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgIGludCBjdXJwb3MgPSBtRVNULmdldFNlbGVjdGlvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbUVTVC5nZXRUZXh0KCkuaW5zZXJ0KGN1cnBvcywgIlx1RkZGQyIpOwotICAgICAgICAgICAgICAgIG1FU1QuZ2V0VGV4dCgpLnNldFNwYW4oc3BhbiwgY3VycG9zLCBjdXJwb3MgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgbUVTVC5ub3RpZnlTdGF0ZUNoYW5nZWQobU1vZGUsIG1TdGF0ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gaW5zZXJ0SW1hZ2VTcGFuOiBudWxsIHNwYW4gd2FzIGluc2VydGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kTGluZUVuZChFZGl0YWJsZSB0ZXh0LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZmluZExpbmVFbmQ6IGN1cnI6IiArIGN1cnJlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbGVuZ3RoOiIgKyB0ZXh0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBwb3MgPSBjdXJyZW50OwotICAgICAgICAgICAgZm9yICg7IHBvcyA8IHRleHQubGVuZ3RoKCk7IHBvcysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDAgJiYgdGV4dC5jaGFyQXQocG9zIC0gMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGJsb2NrU29mdEtleSgpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGJsb2NrU29mdEtleToiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKSBtRVNULmdldENvbnRleHQoKS4KLSAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7Ci0gICAgICAgICAgICBpbW0uaGlkZVNvZnRJbnB1dEZyb21XaW5kb3cobUVTVC5nZXRXaW5kb3dUb2tlbigpLCAwKTsKLSAgICAgICAgICAgIG1FU1Quc2V0T25DbGlja0xpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9udHJhY2tiYWxsY2xpY2s6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaXhTZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbVNvZnRLZXlCbG9ja0ZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVuYmxvY2tTb2Z0S2V5KCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gdW5ibG9ja1NvZnRLZXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRVNULnNldE9uQ2xpY2tMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgICAgIG1Tb2Z0S2V5QmxvY2tGbGFnID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHRDb252ZXJ0ZXIgewotICAgICAgICBwcml2YXRlIEVkaXRTdHlsZWRUZXh0IG1FU1Q7Ci0KLSAgICAgICAgcHVibGljIFN0eWxlZFRleHRDb252ZXJ0ZXIoRWRpdFN0eWxlZFRleHQgZXN0KSB7Ci0gICAgICAgICAgICBtRVNUID0gZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgewotICAgICAgICAgICAgU3RyaW5nIGh0bWxCb2R5ID0gSHRtbC50b0h0bWwobUVTVC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0Q29udmVydGVkQm9keToiICsgaHRtbEJvZHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGh0bWxCb2R5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZ2V0VXJpQXJyYXkoQXJyYXlMaXN0PFVyaT4gdXJpcywgRWRpdGFibGUgdGV4dCkgewotICAgICAgICAgICAgdXJpcy5jbGVhcigpOwotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0VXJpQXJyYXk6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBuZXh0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpID0gbmV4dCkgewotICAgICAgICAgICAgICAgIG5leHQgPSB0ZXh0Lm5leHRTcGFuVHJhbnNpdGlvbihpLCBsZW4sIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuW10gaW1hZ2VzID0gdGV4dC5nZXRTcGFucyhpLCBuZXh0LCBJbWFnZVNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW1hZ2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0VXJpQXJyYXk6IGZvdW5kQXJyYXkiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJbWFnZVNwYW4pIGltYWdlc1tqXSkuZ2V0U291cmNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVyaXMuYWRkKFVyaS5wYXJzZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEltYWdlU3BhbikgaW1hZ2VzW2pdKS5nZXRTb3VyY2UoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldEh0bWwgKFN0cmluZyBodG1sKSB7Ci0gICAgICAgICAgICBmaW5hbCBTcGFubmVkIHNwYW5uZWQgPSBIdG1sLmZyb21IdG1sKGh0bWwsIG5ldyBIdG1sLkltYWdlR2V0dGVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBnZXREcmF3YWJsZShTdHJpbmcgc3JjKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gc2V0aHRtbDogc3JjPSIrc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyYy5zdGFydHNXaXRoKCJjb250ZW50Oi8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2Uoc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBtRVNULmdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLnNldEJvdW5kcygwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBzZXQgaHRtbDogRmFpbGVkIHRvIGxvYWRlZCBjb250ZW50ICIgKyB1cmksIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgIHVua25vd24gc3JjPSIrc3JjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgbnVsbCk7Ci0gICAgICAgICAgICBtRVNULnNldFRleHQoc3Bhbm5lZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFN0eWxlZFRleHREaWFsb2cgewotICAgICAgICBCdWlsZGVyIG1CdWlsZGVyOwotICAgICAgICBDaGFyU2VxdWVuY2UgbUNvbG9yVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZSBtU2l6ZVRpdGxlOwotICAgICAgICBDaGFyU2VxdWVuY2UgbUFsaWduVGl0bGU7Ci0gICAgICAgIENoYXJTZXF1ZW5jZVtdIG1Db2xvck5hbWVzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQ29sb3JJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZU5hbWVzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZURpc3BsYXlJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtU2l6ZVNlbmRJbnRzOwotICAgICAgICBDaGFyU2VxdWVuY2VbXSBtQWxpZ25OYW1lczsKLSAgICAgICAgRWRpdFN0eWxlZFRleHQgbUVTVDsKLQotICAgICAgICBwdWJsaWMgU3R5bGVkVGV4dERpYWxvZyhFZGl0U3R5bGVkVGV4dCBlc3QpIHsKLSAgICAgICAgICAgIG1FU1QgPSBlc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICAgICAgbUJ1aWxkZXIgPSBidWlsZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JBbGVydFBhcmFtcyhDaGFyU2VxdWVuY2UgY29sb3J0aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBjb2xvcm5hbWVzLCBDaGFyU2VxdWVuY2VbXSBjb2xvcmludHMpIHsKLSAgICAgICAgICAgIG1Db2xvclRpdGxlID0gY29sb3J0aXRsZTsKLSAgICAgICAgICAgIG1Db2xvck5hbWVzID0gY29sb3JuYW1lczsKLSAgICAgICAgICAgIG1Db2xvckludHMgPSBjb2xvcmludHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaXplQWxlcnRQYXJhbXMoQ2hhclNlcXVlbmNlIHNpemV0aXRsZSwKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplbmFtZXMsIENoYXJTZXF1ZW5jZVtdIHNpemVkaXNwbGF5aW50cywKLSAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2VbXSBzaXplc2VuZGludHMpIHsKLSAgICAgICAgICAgIG1TaXplVGl0bGUgPSBzaXpldGl0bGU7Ci0gICAgICAgICAgICBtU2l6ZU5hbWVzID0gc2l6ZW5hbWVzOwotICAgICAgICAgICAgbVNpemVEaXNwbGF5SW50cyA9IHNpemVkaXNwbGF5aW50czsKLSAgICAgICAgICAgIG1TaXplU2VuZEludHMgPSBzaXplc2VuZGludHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbkFsZXJ0UGFyYW1zKENoYXJTZXF1ZW5jZSBhbGlnbnRpdGxlLAotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZVtdIGFsaWdubmFtZXMpIHsKLSAgICAgICAgICAgIG1BbGlnblRpdGxlID0gYWxpZ250aXRsZTsKLSAgICAgICAgICAgIG1BbGlnbk5hbWVzID0gYWxpZ25uYW1lczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NvbG9yQWxlcnRQYXJhbXMoKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSBjaGVja1BhcmFtcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGJ1aWxkZXIgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db2xvclRpdGxlID09IG51bGwgfHwgbUNvbG9yTmFtZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBtQ29sb3JJbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tIGNvbG9yIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db2xvck5hbWVzLmxlbmd0aCAhPSBtQ29sb3JJbnRzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gdGhlIGxlbmd0aCBvZiBjb2xvciBhbGVydCBwYXJhbXMgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpZmZlcmVudC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NpemVBbGVydFBhcmFtcygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGNoZWNrUGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVNpemVUaXRsZSA9PSBudWxsIHx8IG1TaXplTmFtZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBtU2l6ZURpc3BsYXlJbnRzID09IG51bGwgfHwgbVNpemVTZW5kSW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSBzaXplIGFsZXJ0IHBhcmFtcyBhcmUgbnVsbC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1TaXplTmFtZXMubGVuZ3RoICE9IG1TaXplRGlzcGxheUludHMubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICYmIG1TaXplU2VuZEludHMubGVuZ3RoICE9IG1TaXplRGlzcGxheUludHMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIi0tLSB0aGUgbGVuZ3RoIG9mIHNpemUgYWxlcnQgcGFyYW1zIGFyZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJkaWZmZXJlbnQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tBbGlnbkFsZXJ0UGFyYW1zKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gY2hlY2tBbGlnbkFsZXJ0UGFyYW1zIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYnVpbGRlciBpcyBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFsaWduVGl0bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICItLS0gYWxpZ24gYWxlcnQgcGFyYW1zIGFyZSBudWxsLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0ZvcmVncm91bmRDb2xvckFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93Rm9yZWdyb3VuZENvbG9yQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQ29sb3JUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQ29sb3JOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkVFVFZNIiwgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtQ29sb3JJbnRzW3doaWNoXSwgMTYpIC0gMHgwMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRJdGVtQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd0JhY2tncm91bmRDb2xvckFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93QmFja2dyb3VuZENvbG9yQWxlcnREaWFsb2ciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hlY2tDb2xvckFsZXJ0UGFyYW1zKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRUaXRsZShtQ29sb3JUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtQ29sb3JOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkVFVFZNIiwgIm1CdWlsZGVyLm9uY2xpY2s6IiArIHdoaWNoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gSW50ZWdlci5wYXJzZUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtQ29sb3JJbnRzW3doaWNoXSwgMTYpIC0gMHgwMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG9uU2hvd1NpemVBbGVydERpYWxvZygpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIG9uU2hvd1NpemVBbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja1NpemVBbGVydFBhcmFtcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1aWxkZXIuc2V0VGl0bGUobVNpemVUaXRsZSk7Ci0gICAgICAgICAgICBtQnVpbGRlci5zZXRJY29uKDApOwotICAgICAgICAgICAgbUJ1aWxkZXIuCi0gICAgICAgICAgICBzZXRJdGVtcyhtU2l6ZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IEludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgLnBhcnNlSW50KChTdHJpbmcpIG1TaXplRGlzcGxheUludHNbd2hpY2hdKTsKLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRJdGVtU2l6ZShzaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBvblNob3dBbGlnbkFsZXJ0RGlhbG9nKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gb25TaG93QWxpZ25BbGVydERpYWxvZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjaGVja0FsaWduQWxlcnRQYXJhbXMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWlsZGVyLnNldFRpdGxlKG1BbGlnblRpdGxlKTsKLSAgICAgICAgICAgIG1CdWlsZGVyLnNldEljb24oMCk7Ci0gICAgICAgICAgICBtQnVpbGRlci4KLSAgICAgICAgICAgIHNldEl0ZW1zKG1BbGlnbk5hbWVzLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAibUJ1aWxkZXIub25jbGljazoiICsgd2hpY2gpOwotICAgICAgICAgICAgICAgICAgICBMYXlvdXQuQWxpZ25tZW50IGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9OT1JNQUw7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IExheW91dC5BbGlnbm1lbnQuQUxJR05fQ0VOVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gTGF5b3V0LkFsaWdubWVudC5BTElHTl9PUFBPU0lURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUVTVC5zZXRBbGlnbm1lbnQoYWxpZ24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbUJ1aWxkZXIuc2hvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHlsZWRUZXh0QXJyb3dLZXlNZXRob2QgZXh0ZW5kcyBBcnJvd0tleU1vdmVtZW50TWV0aG9kIHsKLSAgICAgICAgRWRpdG9yTWFuYWdlciBtTWFuYWdlcjsKLSAgICAgICAgU3R5bGVkVGV4dEFycm93S2V5TWV0aG9kKEVkaXRvck1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyLAotICAgICAgICAgICAgICAgIGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKCFtTWFuYWdlci5pc1NvZnRLZXlCbG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKHdpZGdldCwgYnVmZmVyLCBrZXlDb2RlLCBldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhlY3V0ZURvd24od2lkZ2V0LCBidWZmZXIsIGtleUNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBnZXRFbmRQb3MoVGV4dFZpZXcgd2lkZ2V0KSB7Ci0gICAgICAgICAgICBpbnQgZW5kOwotICAgICAgICAgICAgaWYgKHdpZGdldC5nZXRTZWxlY3Rpb25TdGFydCgpID09IG1NYW5hZ2VyLmdldFNlbGVjdGlvblN0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB3aWRnZXQuZ2V0U2VsZWN0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVuZCA9IHdpZGdldC5nZXRTZWxlY3Rpb25TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiB1cChUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHVwOiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGF5b3V0IGxheW91dCA9IHdpZGdldC5nZXRMYXlvdXQoKTsKLSAgICAgICAgICAgIGludCBlbmQgPSBnZXRFbmRQb3Mod2lkZ2V0KTsKLSAgICAgICAgICAgIGludCBsaW5lID0gbGF5b3V0LmdldExpbmVGb3JPZmZzZXQoZW5kKTsKLSAgICAgICAgICAgIGlmIChsaW5lID4gMCkgewotICAgICAgICAgICAgICAgIGludCB0bzsKLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0LmdldFBhcmFncmFwaERpcmVjdGlvbihsaW5lKSA9PQotICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUgLSAxKSkgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gbGF5b3V0LmdldFByaW1hcnlIb3Jpem9udGFsKGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldE9mZnNldEZvckhvcml6b250YWwobGluZSAtIDEsIGgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gbGF5b3V0LmdldExpbmVTdGFydChsaW5lIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkN1cnNvck1vdmVkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZG93bihUZXh0VmlldyB3aWRnZXQsIFNwYW5uYWJsZSBidWZmZXIpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRvd246Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMYXlvdXQgbGF5b3V0ID0gd2lkZ2V0LmdldExheW91dCgpOwotICAgICAgICAgICAgaW50IGVuZCA9IGdldEVuZFBvcyh3aWRnZXQpOwotICAgICAgICAgICAgaW50IGxpbmUgPSBsYXlvdXQuZ2V0TGluZUZvck9mZnNldChlbmQpOwotICAgICAgICAgICAgaWYgKGxpbmUgPCBsYXlvdXQuZ2V0TGluZUNvdW50KCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRvOwotICAgICAgICAgICAgICAgIGlmIChsYXlvdXQuZ2V0UGFyYWdyYXBoRGlyZWN0aW9uKGxpbmUpID09Ci0gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXRQYXJhZ3JhcGhEaXJlY3Rpb24obGluZSArIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGggPSBsYXlvdXQuZ2V0UHJpbWFyeUhvcml6b250YWwoZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0Rm9ySG9yaXpvbnRhbChsaW5lICsgMSwgaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdG8gPSBsYXlvdXQuZ2V0TGluZVN0YXJ0KGxpbmUgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBsZWZ0KFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlcikgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gbGVmdDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0VG9MZWZ0T2YoZ2V0RW5kUG9zKHdpZGdldCkpOwotICAgICAgICAgICAgbU1hbmFnZXIuc2V0U2VsZWN0ZWRFbmRQb3ModG8pOwotICAgICAgICAgICAgbU1hbmFnZXIub25DdXJzb3JNb3ZlZCgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmlnaHQoVGV4dFZpZXcgd2lkZ2V0LCBTcGFubmFibGUgYnVmZmVyKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByaWdodDoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExheW91dCBsYXlvdXQgPSB3aWRnZXQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBpbnQgdG8gPSBsYXlvdXQuZ2V0T2Zmc2V0VG9SaWdodE9mKGdldEVuZFBvcyh3aWRnZXQpKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLnNldFNlbGVjdGVkRW5kUG9zKHRvKTsKLSAgICAgICAgICAgIG1NYW5hZ2VyLm9uQ3Vyc29yTW92ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVEb3duKFRleHRWaWV3IHdpZGdldCwgU3Bhbm5hYmxlIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICBpbnQga2V5Q29kZSkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZXhlY3V0ZURvd246ICIgKyBrZXlDb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQOgotICAgICAgICAgICAgICAgIGhhbmRsZWQgfD0gdXAod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfRE9XTjoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGRvd24od2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfTEVGVDoKLSAgICAgICAgICAgICAgICBoYW5kbGVkIHw9IGxlZnQod2lkZ2V0LCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfUklHSFQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCB8PSByaWdodCh3aWRnZXQsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSOgotICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkZpeFNlbGVjdGVkSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsTGluZVNwYW4gZXh0ZW5kcyBJbWFnZVNwYW4gewotICAgICAgICBwdWJsaWMgSG9yaXpvbnRhbExpbmVTcGFuKGludCBjb2xvciwgVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgSG9yaXpvbnRhbExpbmVEcmF3YWJsZShjb2xvciwgdmlldykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBjbGFzcyBIb3Jpem9udGFsTGluZURyYXdhYmxlIGV4dGVuZHMgU2hhcGVEcmF3YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgVmlldyBtVmlldzsKLSAgICAgICAgcHVibGljIEhvcml6b250YWxMaW5lRHJhd2FibGUoaW50IGNvbG9yLCBWaWV3IHZpZXcpIHsKLSAgICAgICAgICAgIHN1cGVyKG5ldyBSZWN0U2hhcGUoKSk7Ci0gICAgICAgICAgICBtVmlldyA9IHZpZXc7Ci0gICAgICAgICAgICByZW5ld0NvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgIHJlbmV3Qm91bmRzKHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIGRyYXc6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZW5ld0NvbG9yKCk7Ci0gICAgICAgICAgICByZW5ld0JvdW5kcyhtVmlldyk7Ci0gICAgICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdCb3VuZHMoVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoID0gbVZpZXcuZ2V0QmFja2dyb3VuZCgpLmdldEJvdW5kcygpLndpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IG1WaWV3LmdldEJhY2tncm91bmQoKS5nZXRCb3VuZHMoKS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Qm91bmRzOiIgKyB3aWR0aCArICIsIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0JvdW5kczoiICsgbVZpZXcuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgd2lkdGggPSBtVmlldy5nZXRXaWR0aCgpOwotICAgICAgICAgICAgaWYgKHdpZHRoID4gMjApIHsKLSAgICAgICAgICAgICAgICB3aWR0aCAtPSAyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldEJvdW5kcygwLCAwLCB3aWR0aCwgMik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbmV3Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIi0tLSByZW5ld0NvbG9yOiIgKyBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRQYWludCgpLnNldENvbG9yKGNvbG9yKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcmVuZXdDb2xvcigpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiLS0tIHJlbmV3Q29sb3I6Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VTcGFuIHBhcmVudCA9IGdldFBhcmVudFNwYW4oKTsKLSAgICAgICAgICAgICAgICBFZGl0YWJsZSB0ZXh0ID0gKChFZGl0U3R5bGVkVGV4dCltVmlldykuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHRleHQuZ2V0U3BhblN0YXJ0KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgRm9yZWdyb3VuZENvbG9yU3BhbltdIHNwYW5zID0gdGV4dC5nZXRTcGFucyhzdGFydCwgc3RhcnQsIEZvcmVncm91bmRDb2xvclNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChzcGFucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbmV3Q29sb3Ioc3BhbnNbc3BhbnMubGVuZ3RoIC0gMV0uZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEltYWdlU3BhbiBnZXRQYXJlbnRTcGFuKCkgewotICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICItLS0gZ2V0UGFyZW50U3BhbjoiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVmlldyBpbnN0YW5jZW9mIEVkaXRTdHlsZWRUZXh0KSB7Ci0gICAgICAgICAgICAgICAgRWRpdGFibGUgdGV4dCA9ICgoRWRpdFN0eWxlZFRleHQpbVZpZXcpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBJbWFnZVNwYW5bXSBpbWFnZXMgPSB0ZXh0LmdldFNwYW5zKDAsIHRleHQubGVuZ3RoKCksIEltYWdlU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSW1hZ2VTcGFuIGltYWdlOiBpbWFnZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS5nZXREcmF3YWJsZSgpID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiLS0tcmVuZXdCb3VuZHM6IENvdWxkbid0IGZpbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTk5MDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NGYWN0b3J5LmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CisKKy8qKiB7QGhpZGV9ICovCitpbnRlcmZhY2UgSVJlbW90ZVZpZXdzRmFjdG9yeSB7CisgICAgdm9pZCBvbkRhdGFTZXRDaGFuZ2VkKCk7CisgICAgaW50IGdldENvdW50KCk7CisgICAgUmVtb3RlVmlld3MgZ2V0Vmlld0F0KGludCBwb3NpdGlvbik7CisgICAgUmVtb3RlVmlld3MgZ2V0TG9hZGluZ1ZpZXcoKTsKKyAgICBpbnQgZ2V0Vmlld1R5cGVDb3VudCgpOworICAgIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbik7CisgICAgYm9vbGVhbiBoYXNTdGFibGVJZHMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblV0aWxzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQppbmRleCBjNzg4NjA1Li45MDQyM2JlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YQpAQCAtOTYsNiArOTYsOCBAQAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBU1NXT1JEX1RZUEVfS0VZID0gImxvY2tzY3JlZW4ucGFzc3dvcmRfdHlwZSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQ0tfUEFTU1dPUkRfU0FMVF9LRVkgPSAibG9ja3NjcmVlbi5wYXNzd29yZF9zYWx0IjsKIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVNTV09SRF9ISVNUT1JZX0tFWSA9ICJsb2Nrc2NyZWVuLnBhc3N3b3JkaGlzdG9yeSI7CisKICAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKICAgICBwcml2YXRlIERldmljZVBvbGljeU1hbmFnZXIgbURldmljZVBvbGljeU1hbmFnZXI7CkBAIC0xNjMsNiArMTY1LDMzIEBACiAgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bUxldHRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RlZFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZXF1ZXN0ZWRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoKSB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCkuZ2V0UGFzc3dvcmRNaW5pbXVtTG93ZXJDYXNlKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTnVtZXJpYygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtU3ltYm9scygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5nZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdGVkUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpLmdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKKyAgICB9CiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYWN0dWFsIHBhc3N3b3JkIG1vZGUsIGFzIHNldCBieSBrZXlndWFyZCBhZnRlciB1cGRhdGluZyB0aGUgcGFzc3dvcmQuCiAgICAgICoKQEAgLTIyNyw2ICsyNTYsMzMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBwYXNzd29yZCBtYXRjaGVzIGFueSBvZiB0aGUgcGFzc3dvcmRzIHN0b3JlZCBpbiB0aGUKKyAgICAgKiBwYXNzd29yZCBoaXN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHBhc3N3b3JkIG1hdGNoZXMgYW55IGluIHRoZSBoaXN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrUGFzc3dvcmRIaXN0b3J5KFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBTdHJpbmcgcGFzc3dvcmRIYXNoU3RyaW5nID0gbmV3IFN0cmluZyhwYXNzd29yZFRvSGFzaChwYXNzd29yZCkpOworICAgICAgICBTdHJpbmcgcGFzc3dvcmRIaXN0b3J5ID0gZ2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZKTsKKyAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gUGFzc3dvcmQgSGlzdG9yeSBtYXkgYmUgdG9vIGxvbmcuLi4KKyAgICAgICAgaW50IHBhc3N3b3JkSGFzaExlbmd0aCA9IHBhc3N3b3JkSGFzaFN0cmluZy5sZW5ndGgoKTsKKyAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IGdldFJlcXVlc3RlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCgpOworICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGggPSBwYXNzd29yZEhhc2hMZW5ndGggKiBwYXNzd29yZEhpc3RvcnlMZW5ndGgKKyAgICAgICAgICAgICAgICArIHBhc3N3b3JkSGlzdG9yeUxlbmd0aCAtIDE7CisgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnkubGVuZ3RoKCkgPiBuZWVkZWRQYXNzd29yZEhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IHBhc3N3b3JkSGlzdG9yeS5zdWJzdHJpbmcoMCwgbmVlZGVkUGFzc3dvcmRIaXN0b3J5TGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFzc3dvcmRIaXN0b3J5LmNvbnRhaW5zKHBhc3N3b3JkSGFzaFN0cmluZyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGhhcyBzdG9yZWQgYSBsb2NrIHBhdHRlcm4uCiAgICAgICogQHJldHVybiBXaGV0aGVyIGEgc2F2ZWQgcGF0dGVybiBleGlzdHMuCiAgICAgICovCkBAIC0yNzksNiArMzM1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKKyAgICAgICAgICAgICAgICBpZiAoaXNMb2NrUGFzc3dvcmRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhY3RpdmVQYXNzd29yZFF1YWxpdHk7CiAgICAgfQpAQCAtMjg3LDggKzM0OCw2IEBACiAgICAgICogQ2xlYXIgYW55IGxvY2sgcGF0dGVybiBvciBwYXNzd29yZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhckxvY2soKSB7Ci0gICAgICAgIGdldERldmljZVBvbGljeU1hbmFnZXIoKS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAotICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CiAgICAgICAgIHNhdmVMb2NrUGFzc3dvcmQobnVsbCwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7CiAgICAgICAgIHNldExvY2tQYXR0ZXJuRW5hYmxlZChmYWxzZSk7CiAgICAgICAgIHNhdmVMb2NrUGF0dGVybihudWxsKTsKQEAgLTMwMSw3ICszNjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNhdmVMb2NrUGF0dGVybihMaXN0PExvY2tQYXR0ZXJuVmlldy5DZWxsPiBwYXR0ZXJuKSB7CiAgICAgICAgIC8vIENvbXB1dGUgdGhlIGhhc2gKLSAgICAgICAgZmluYWwgYnl0ZVtdIGhhc2ggID0gTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9IYXNoKHBhdHRlcm4pOworICAgICAgICBmaW5hbCBieXRlW10gaGFzaCA9IExvY2tQYXR0ZXJuVXRpbHMucGF0dGVyblRvSGFzaChwYXR0ZXJuKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBoYXNoIHRvIGZpbGUKICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoc0xvY2tQYXR0ZXJuRmlsZW5hbWUsICJydyIpOwpAQCAtMzE2LDE0ICszNzUsMTUgQEAKICAgICAgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXRCb29sZWFuKFBBVFRFUk5fRVZFUl9DSE9TRU5fS0VZLCB0cnVlKTsKICAgICAgICAgICAgICAgICBzZXRMb25nKFBBU1NXT1JEX1RZUEVfS0VZLCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HKTsKLSAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsIHBhdHRlcm4uc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfU09NRVRISU5HLCBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDApOworICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzIHByb3ZpZGVyCisgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gsIHVubGVzcyB3ZSB3YW50IHRvIGZhaWwgb3ZlciB0byB1c2luZyB0aGUgc2V0dGluZ3MKKyAgICAgICAgICAgIC8vIHByb3ZpZGVyCiAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gc2F2ZSBsb2NrIHBhdHRlcm4gdG8gIiArIHNMb2NrUGF0dGVybkZpbGVuYW1lKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAvLyBDYW50IGRvIG11Y2gKQEAgLTM4MSwxNyArNDQxLDU5IEBACiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IGdldERldmljZVBvbGljeU1hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW50IGNvbXB1dGVkUXVhbGl0eSA9IGNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIGNvbXB1dGVkUXVhbGl0eSk7CisgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgTWF0aC5tYXgocXVhbGl0eSwgY29tcHV0ZWRRdWFsaXR5KSk7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkUXVhbGl0eSAhPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoY29tcHV0ZWRRdWFsaXR5LCBwYXNzd29yZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXR0ZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBsb3dlcmNhc2UgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vbmxldHRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFzc3dvcmQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0dGVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZShNYXRoLm1heChxdWFsaXR5LCBjb21wdXRlZFF1YWxpdHkpLCBwYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSwgbGV0dGVycywgdXBwZXJjYXNlLCBsb3dlcmNhc2UsIG51bWJlcnMsIHN5bWJvbHMsIG5vbmxldHRlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBhc3N3b3JkIGlzIG5vdCBhbnl0aGluZy4KICAgICAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHBhc3N3b3JkIHRvIHRoZSBwYXNzd29yZCBoaXN0b3J5LiBXZSBhc3N1bWUgYWxsCisgICAgICAgICAgICAgICAgLy8gcGFzc3dvcmQKKyAgICAgICAgICAgICAgICAvLyBoYXNoZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggZm9yIHNpbXBsaWNpdHkgb2YgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkSGlzdG9yeSA9IGdldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSk7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkSGlzdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkSGlzdG9yeSA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHBhc3N3b3JkSGlzdG9yeUxlbmd0aCA9IGdldFJlcXVlc3RlZFBhc3N3b3JkSGlzdG9yeUxlbmd0aCgpOworICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZEhpc3RvcnlMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBuZXcgU3RyaW5nKGhhc2gpICsgIiwiICsgcGFzc3dvcmRIaXN0b3J5OworICAgICAgICAgICAgICAgICAgICAvLyBDdXQgaXQgdG8gY29udGFpbiBwYXNzd29yZEhpc3RvcnlMZW5ndGggaGFzaGVzCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwYXNzd29yZEhpc3RvcnlMZW5ndGggLTEgY29tbWFzLgorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZEhpc3RvcnkgPSBwYXNzd29yZEhpc3Rvcnkuc3Vic3RyaW5nKDAsIE1hdGgubWluKGhhc2gubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXNzd29yZEhpc3RvcnlMZW5ndGggKyBwYXNzd29yZEhpc3RvcnlMZW5ndGggLSAxLCBwYXNzd29yZEhpc3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0U3RyaW5nKFBBU1NXT1JEX0hJU1RPUllfS0VZLCBwYXNzd29yZEhpc3RvcnkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkcG0uc2V0QWN0aXZlUGFzc3dvcmRTdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQsIDAsIDAsIDAsIDAsIDAsIDAsIDApOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewogICAgICAgICAgICAgLy8gQ2FudCBkbyBtdWNoLCB1bmxlc3Mgd2Ugd2FudCB0byBmYWlsIG92ZXIgdG8gdXNpbmcgdGhlIHNldHRpbmdzIHByb3ZpZGVyCkBAIC01MzEsNyArNjMzLDggQEAKICAgICAgICAgcmV0dXJuIHNhdmVkUGFzc3dvcmRFeGlzdHMoKSAmJgogICAgICAgICAgICAgICAgIChtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NSwxMiArNzU4LDIxIEBACiAgICAgICAgIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLnB1dExvbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSwgdmFsdWUpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgc2VjdXJlU2V0dGluZ0tleSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZW50UmVzb2x2ZXIsIHNlY3VyZVNldHRpbmdLZXkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHNlY3VyZVNldHRpbmdLZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcobUNvbnRlbnRSZXNvbHZlciwgc2VjdXJlU2V0dGluZ0tleSwgdmFsdWUpOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgewogICAgICAgICBsb25nIG1vZGUgPSBnZXRLZXlndWFyZFN0b3JlZFBhc3N3b3JkUXVhbGl0eSgpOwogICAgICAgICBmaW5hbCBib29sZWFuIGlzUGF0dGVybiA9IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzsKICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Bhc3N3b3JkID0gbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQwogICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMKLSAgICAgICAgICAgICAgICB8fCBtb2RlID09IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM7CisgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDCisgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDsKICAgICAgICAgZmluYWwgYm9vbGVhbiBzZWN1cmUgPSBpc1BhdHRlcm4gJiYgaXNMb2NrUGF0dGVybkVuYWJsZWQoKSAmJiBzYXZlZFBhdHRlcm5FeGlzdHMoKQogICAgICAgICAgICAgICAgIHx8IGlzUGFzc3dvcmQgJiYgc2F2ZWRQYXNzd29yZEV4aXN0cygpOwogICAgICAgICByZXR1cm4gc2VjdXJlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkLmphdmEKaW5kZXggZTFhNjczNy4uZmFjZGEzNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmQuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZC5qYXZhCkBAIC02Nyw4ICs2NywyMiBAQAogICAgICAgICB0aGlzKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCAwKTsKICAgICB9CiAKKyAgICBwdWJsaWMgUGFzc3dvcmRFbnRyeUtleWJvYXJkKENvbnRleHQgY29udGV4dCwgaW50IHhtbExheW91dFJlc0lkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCB4bWxMYXlvdXRSZXNJZCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorCiAgICAgcHVibGljIFBhc3N3b3JkRW50cnlLZXlib2FyZChDb250ZXh0IGNvbnRleHQsIGludCB4bWxMYXlvdXRSZXNJZCwgaW50IG1vZGUpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgeG1sTGF5b3V0UmVzSWQsIG1vZGUpOworICAgICAgICBpbml0KGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQoQ29udGV4dCBjb250ZXh0LCBpbnQgeG1sTGF5b3V0UmVzSWQsIGludCBtb2RlLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHhtbExheW91dFJlc0lkLCBtb2RlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaW5pdChjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIG1SZXMgPSByZXM7CiAgICAgICAgIG1TaGlmdEljb24gPSByZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zeW1fa2V5Ym9hcmRfc2hpZnQpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyLmphdmEKaW5kZXggNTM3MjBlNC4uMzg0ZjdiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9QYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1Bhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5qYXZhCkBAIC01NCwxMCArNTQsMjAgQEAKICAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKIAogICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBLZXlib2FyZFZpZXcga2V5Ym9hcmRWaWV3LCBWaWV3IHRhcmdldFZpZXcpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBrZXlib2FyZFZpZXcsIHRhcmdldFZpZXcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoQ29udGV4dCBjb250ZXh0LCBLZXlib2FyZFZpZXcga2V5Ym9hcmRWaWV3LCBWaWV3IHRhcmdldFZpZXcsCisgICAgICAgICAgICBib29sZWFuIHVzZUZ1bGxTY3JlZW5XaWR0aCkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1UYXJnZXRWaWV3ID0gdGFyZ2V0VmlldzsKICAgICAgICAgbUtleWJvYXJkVmlldyA9IGtleWJvYXJkVmlldzsKLSAgICAgICAgY3JlYXRlS2V5Ym9hcmRzKCk7CisgICAgICAgIGlmICh1c2VGdWxsU2NyZWVuV2lkdGggfHwgbUtleWJvYXJkVmlldy5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCA9PSAtMSkgeworICAgICAgICAgICAgY3JlYXRlS2V5Ym9hcmRzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcmVhdGVLZXlib2FyZHNXaXRoU3BlY2lmaWNTaXplKG1LZXlib2FyZFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0KTsKKyAgICAgICAgfQogICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldE9uS2V5Ym9hcmRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVZpYnJhdG9yID0gbmV3IFZpYnJhdG9yKCk7CiAgICAgfQpAQCAtNjYsNiArNzYsMjkgQEAKICAgICAgICAgcmV0dXJuIG1LZXlib2FyZE1vZGUgPT0gS0VZQk9BUkRfTU9ERV9BTFBIQTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlS2V5Ym9hcmRzV2l0aFNwZWNpZmljU2l6ZShpbnQgdmlld1dpZHRoLCBpbnQgdmlld0hlaWdodCkgeworICAgICAgICBtTnVtZXJpY0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX251bWVyaWMsCisgICAgICAgICAgICAgICAgdmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLnhtbC5wYXNzd29yZF9rYmRfcXdlcnR5LCBSLmlkLm1vZGVfbm9ybWFsLCB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtUXdlcnR5S2V5Ym9hcmQuZW5hYmxlU2hpZnRMb2NrKCk7CisKKyAgICAgICAgbVF3ZXJ0eUtleWJvYXJkU2hpZnRlZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsCisgICAgICAgICAgICAgICAgUi54bWwucGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLAorICAgICAgICAgICAgICAgIFIuaWQubW9kZV9ub3JtYWwsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZFNoaWZ0ZWQuZW5hYmxlU2hpZnRMb2NrKCk7CisgICAgICAgIG1Rd2VydHlLZXlib2FyZFNoaWZ0ZWQuc2V0U2hpZnRlZCh0cnVlKTsgLy8gYWx3YXlzIHNoaWZ0ZWQuCisKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZCA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmQobUNvbnRleHQsIFIueG1sLnBhc3N3b3JkX2tiZF9zeW1ib2xzLAorICAgICAgICAgICAgICAgIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIG1TeW1ib2xzS2V5Ym9hcmQuZW5hYmxlU2hpZnRMb2NrKCk7CisKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZFNoaWZ0ZWQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LAorICAgICAgICAgICAgICAgIFIueG1sLnBhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LCB2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBtU3ltYm9sc0tleWJvYXJkU2hpZnRlZC5lbmFibGVTaGlmdExvY2soKTsKKyAgICAgICAgbVN5bWJvbHNLZXlib2FyZFNoaWZ0ZWQuc2V0U2hpZnRlZCh0cnVlKTsgLy8gYWx3YXlzIHNoaWZ0ZWQKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlS2V5Ym9hcmRzKCkgewogICAgICAgICBtTnVtZXJpY0tleWJvYXJkID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZChtQ29udGV4dCwgUi54bWwucGFzc3dvcmRfa2JkX251bWVyaWMpOwogICAgICAgICBtUXdlcnR5S2V5Ym9hcmQgPSBuZXcgUGFzc3dvcmRFbnRyeUtleWJvYXJkKG1Db250ZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TbGlkaW5nVGFiLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQppbmRleCA5MTUyNzI5Li4zODY1NTEwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L1NsaWRpbmdUYWIuamF2YQpAQCAtMTcsMTAgKzE3LDggQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwpAQCAtMzgsNiArMzYsNyBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCkBAIC02OSwyMSArNjgsMjEgQEAKICAgICBwcml2YXRlIGludCBtR3JhYmJlZFN0YXRlID0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVHJpZ2dlcmVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBWaWJyYXRvciBtVmlicmF0b3I7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRGVuc2l0eTsgLy8gdXNlZCB0byBzY2FsZSBkaW1lbnNpb25zIGZvciBiaXRtYXBzLgorICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURlbnNpdHk7IC8vIHVzZWQgdG8gc2NhbGUgZGltZW5zaW9ucyBmb3IgYml0bWFwcy4KIAogICAgIC8qKgogICAgICAqIEVpdGhlciB7QGxpbmsgI0hPUklaT05UQUx9IG9yIHtAbGluayAjVkVSVElDQUx9LgogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1PcmllbnRhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtT3JpZW50YXRpb247CiAKLSAgICBwcml2YXRlIFNsaWRlciBtTGVmdFNsaWRlcjsKLSAgICBwcml2YXRlIFNsaWRlciBtUmlnaHRTbGlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTbGlkZXIgbUxlZnRTbGlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTbGlkZXIgbVJpZ2h0U2xpZGVyOwogICAgIHByaXZhdGUgU2xpZGVyIG1DdXJyZW50U2xpZGVyOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgcHJpdmF0ZSBmbG9hdCBtVGhyZXNob2xkOwogICAgIHByaXZhdGUgU2xpZGVyIG1PdGhlclNsaWRlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbUFuaW1hdGluZzsKLSAgICBwcml2YXRlIFJlY3QgbVRtcFJlY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UbXBSZWN0OwogCiAgICAgLyoqCiAgICAgICogTGlzdGVuZXIgdXNlZCB0byByZXNldCB0aGUgdmlldyB3aGVuIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBjb21wbGV0ZXMuCkBAIC00MTcsNyArNDE2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydCBhbmltYXRpbmcgdGhlIHNsaWRlci4gTm90ZSB3ZSBuZWVkIHR3byBhbmltYXRpb25zIHNpbmNlIGFuIEFuaW1hdG9yCisgICAgICAgICAqIFN0YXJ0IGFuaW1hdGluZyB0aGUgc2xpZGVyLiBOb3RlIHdlIG5lZWQgdHdvIGFuaW1hdGlvbnMgc2luY2UgYW4gVmFsdWVBbmltYXRvcgogICAgICAgICAgKiBrZWVwcyBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgaW52YWxpZGF0aW9uIHJlZ2lvbiB3aGljaCBpcyBqdXN0IHRoZSB2aWV3IGJlaW5nIGFuaW1hdGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gYW5pbTEKQEAgLTQ3NSwxMCArNDc0LDEzIEBACiAgICAgICAgIGludCBoZWlnaHRTcGVjTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwogICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSAgTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAKLSAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgfHwgaGVpZ2h0U3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgICAgIExvZy5lKCJTbGlkaW5nVGFiIiwgIlNsaWRpbmdUYWIgY2Fubm90IGhhdmUgVU5TUEVDSUZJRUQgTWVhc3VyZVNwZWMiCi0gICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAotICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZUV4Y2VwdGlvbihMT0dfVEFHICsgInN0YWNrOiIpKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgaWYgKHdpZHRoU3BlY01vZGUgPT0gTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQgCisgICAgICAgICAgICAgICAgICAgIHx8IGhlaWdodFNwZWNNb2RlID09IE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoIlNsaWRpbmdUYWIiLCAiU2xpZGluZ1RhYiBjYW5ub3QgaGF2ZSBVTlNQRUNJRklFRCBNZWFzdXJlU3BlYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsiKHdzcGVjPSIgKyB3aWR0aFNwZWNNb2RlICsgIiwgaHNwZWM9IiArIGhlaWdodFNwZWNNb2RlICsgIikiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTE9HX1RBRyArICJzdGFjazoiKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBtTGVmdFNsaWRlci5tZWFzdXJlKCk7CkBAIC02MDgsMTQgKzYxMCw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6Ci0gICAgICAgICAgICAgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICAgICAgICAgICAgICAgICAgY2FuY2VsR3JhYigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIzLDYgKzYxOCwxNyBAQAogICAgICAgICByZXR1cm4gbVRyYWNraW5nIHx8IHN1cGVyLm9uVG91Y2hFdmVudChldmVudCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEdyYWIoKSB7CisgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICBtVHJpZ2dlcmVkID0gZmFsc2U7CisgICAgICAgIG1PdGhlclNsaWRlci5zaG93KHRydWUpOworICAgICAgICBtQ3VycmVudFNsaWRlci5yZXNldChmYWxzZSk7CisgICAgICAgIG1DdXJyZW50U2xpZGVyLmhpZGVUYXJnZXQoKTsKKyAgICAgICAgbUN1cnJlbnRTbGlkZXIgPSBudWxsOworICAgICAgICBtT3RoZXJTbGlkZXIgPSBudWxsOworICAgICAgICBzZXRHcmFiYmVkU3RhdGUoT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKTsKKyAgICB9CisKICAgICB2b2lkIHN0YXJ0QW5pbWF0aW5nKGZpbmFsIGJvb2xlYW4gaG9sZEFmdGVyKSB7CiAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwogICAgICAgICBmaW5hbCBBbmltYXRpb24gdHJhbnMxOwpAQCAtODMyLDYgKzgzOCwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25WaXNpYmlsaXR5Q2hhbmdlZChWaWV3IGNoYW5nZWRWaWV3LCBpbnQgdmlzaWJpbGl0eSkgeworICAgICAgICBzdXBlci5vblZpc2liaWxpdHlDaGFuZ2VkKGNoYW5nZWRWaWV3LCB2aXNpYmlsaXR5KTsKKyAgICAgICAgLy8gV2hlbiB2aXNpYmlsaXR5IGNoYW5nZXMgYW5kIHRoZSB1c2VyIGhhcyBhIHRhYiBzZWxlY3RlZCwgdW5zZWxlY3QgaXQgYW5kCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVpciBjYWxsYmFjayBnZXRzIGNhbGxlZC4KKyAgICAgICAgaWYgKGNoYW5nZWRWaWV3ID09IHRoaXMgJiYgdmlzaWJpbGl0eSAhPSBWSVNJQkxFCisgICAgICAgICAgICAgICAgJiYgbUdyYWJiZWRTdGF0ZSAhPSBPblRyaWdnZXJMaXN0ZW5lci5OT19IQU5ETEUpIHsKKyAgICAgICAgICAgIGNhbmNlbEdyYWIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZ3JhYmJlZCBzdGF0ZSwgYW5kIGRpc3BhdGNoZXMgYSBncmFiYmVkIHN0YXRlIGNoYW5nZQogICAgICAqIGV2ZW50IHRvIG91ciBsaXN0ZW5lci4KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWQubWsgYi9jb3JlL2puaS9BbmRyb2lkLm1rCmluZGV4IGEwMzhjYzUuLjgzMTBlNTYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWQubWsKKysrIGIvY29yZS9qbmkvQW5kcm9pZC5tawpAQCAtMTksMTIgKzE5LDE1IEBACiAgIExPQ0FMX0NGTEFHUyArPSAtRENVU1RPTV9SVU5USU1FX0hFQVBfTUFYPSQoVVNFX0NVU1RPTV9SVU5USU1FX0hFQVBfTUFYKQogZW5kaWYKIAoraWZlcSAoJChVU0VfT1BFTkdMX1JFTkRFUkVSKSx0cnVlKQorCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKK2VuZGlmCisKIExPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCUFjdGl2aXR5TWFuYWdlci5jcHAgXAogCUFuZHJvaWRSdW50aW1lLmNwcCBcCi0JQ3Vyc29yV2luZG93LmNwcCBcCiAJVGltZS5jcHAgXAogCWNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsLmNwcCBcCiAJY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAuYXJtIFwKQEAgLTQ4LDYgKzUxLDcgQEAKIAlhbmRyb2lkX3ZpZXdfSW5wdXRDaGFubmVsLmNwcCBcCiAJYW5kcm9pZF92aWV3X0lucHV0UXVldWUuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfS2V5RXZlbnQuY3BwIFwKKwlhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBcCiAJYW5kcm9pZF92aWV3X01vdGlvbkV2ZW50LmNwcCBcCiAJYW5kcm9pZF90ZXh0X0FuZHJvaWRDaGFyYWN0ZXIuY3BwIFwKIAlhbmRyb2lkX3RleHRfQW5kcm9pZEJpZGkuY3BwIFwKQEAgLTEwNSw2ICsxMDksNyBAQAogCWFuZHJvaWQvZ3JhcGhpY3MvUmFzdGVyaXplci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL1R5cGVmYWNlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvWXV2VG9KcGVnRW5jb2Rlci5jcHAgXApAQCAtMTIzLDcgKzEyOCw2IEBACiAJYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcCBcCiAJYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoQXVkaW9HYXRld2F5LmNwcCBcCiAJYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0LmNwcCBcCi0JYW5kcm9pZF9ibHVldG9vdGhfU2NvU29ja2V0LmNwcCBcCiAJYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAgXAogCWFuZHJvaWRfc2VydmVyX0JsdWV0b290aEEyZHBTZXJ2aWNlLmNwcCBcCkBAIC0xNDIsNiArMTQ2LDcgQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCSQoTE9DQUxfUEFUSCkvYW5kcm9pZC9ncmFwaGljcyBcCisJJChMT0NBTF9QQVRIKS8uLi8uLi9saWJzL2h3dWkgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBibHVlZHJvaWQpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmUpL2hhcmR3YXJlIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgbGliaGFyZHdhcmVfbGVnYWN5KS9oYXJkd2FyZV9sZWdhY3kgXApAQCAtMTkyLDYgKzE5NywxMCBAQAogCWxpYndwYV9jbGllbnQgXAogCWxpYmpwZWcKIAoraWZlcSAoJChVU0VfT1BFTkdMX1JFTkRFUkVSKSx0cnVlKQorCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaHd1aQorZW5kaWYKKwogaWZlcSAoJChCT0FSRF9IQVZFX0JMVUVUT09USCksdHJ1ZSkKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogCWV4dGVybmFsL2RidXMgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IDI3NTFhODIuLmM5ZDdlN2YgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWRSdW50aW1lLmNwcAorKysgYi9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKQEAgLTExNSw2ICsxMTUsNyBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpeGVsRm9ybWF0KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY29tX2FuZHJvaWRfaW50ZXJuYWxfZ3JhcGhpY3NfTmF0aXZlVXRpbHMoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfRGlzcGxheShKTklFbnYqIGVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfU3VyZmFjZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3Um9vdChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiogZW52KTsKQEAgLTE1MSw3ICsxNTIsNiBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aEF1ZGlvR2F0ZXdheShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX0JsdWV0b290aFNvY2tldChKTklFbnYgKmVudik7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldChKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZShKTklFbnYqIGVudik7CkBAIC0xMjMyLDYgKzEyMzIsNyBAQAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9uaW9fdXRpbHMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QaXhlbEZvcm1hdCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX0dyYXBoaWNzKSwKKyAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2NvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9FR0xJbXBsKSwKQEAgLTEzMDMsNyArMTMwNCw2IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9IZWFkc2V0QmFzZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2JsdWV0b290aF9CbHVldG9vdGhBdWRpb0dhdGV3YXkpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ibHVldG9vdGhfQmx1ZXRvb3RoU29ja2V0KSwKLSAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhBMmRwU2VydmljZSksCmRpZmYgLS1naXQgYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NzkyMS4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9DdXJzb3JXaW5kb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSA8Sk5JSGVscC5oPgotCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgotICAgIG1NYXhTaXplKG1heFNpemUpCi17Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKLXsKLSAgICBtTWVtb3J5ID0gbWVtb3J5OwotICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKLQotICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKLSAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKLSAgICBtU2l6ZSA9IHNpemU7Ci0gICAgbU1heFNpemUgPSBzaXplOwotICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKLUxPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQotewotICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5Ci0KLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKLSAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7Ci0gICAgaWYgKGhlYXAgIT0gTlVMTCkgewotICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgICAgIGlmIChtRGF0YSkgewotICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOwotICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7Ci0KLSAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKLSAgICAgICAgICAgICAgICBjbGVhcigpOwotICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLUN1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCi17Ci0gICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCi19Ci0KLXZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCi17Ci0gICAgbUhlYWRlci0+bnVtUm93cyA9IDA7Ci0gICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7Ci0gICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7Ci0gICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCi0gICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Ci19Ci0KLWludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQotewotICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKLSAgICBpZiAoZnJlZVNwYWNlIDwgMCkgewotICAgICAgICBmcmVlU3BhY2UgPSAwOwotICAgIH0KLSAgICByZXR1cm4gZnJlZVNwYWNlOwotfQotCi1maWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKLXsKLSAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAotICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7Ci0gICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKLSAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOwotICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKLSAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7Ci0gICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKLSAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKLQotTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7Ci0gICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7Ci0KLSAgICByZXR1cm4gZmllbGREaXI7Ci19Ci0KLXVpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKLXsKLSAgICBpbnQzMl90IHNpemU7Ci0gICAgdWludDMyX3QgcGFkZGluZzsKLSAgICBpZiAoYWxpZ25lZCkgewotICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYWRkaW5nID0gMDsKLSAgICB9Ci0KLSAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7Ci0KLSAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7Ci0gICAgICAgIExPR0UoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOwotICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0Ci0gICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgewotTE9HRSgibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsIG1NYXhTaXplKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KLSAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7Ci0gICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgewotICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOwotICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgewotICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLUxPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKLSAgICAgICAgbVNpemUgPSBuZXdTaXplOwotICAgIH0KLQotICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKLSAgICBtRnJlZU9mZnNldCArPSBzaXplOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXJvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKLXsKLSAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOwotICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOwotICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7Ci0gICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOwotICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOwotICAgIH0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLSAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAotfQotCi1yb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQotewotICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKLSAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7Ci0gICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOwotTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOwotTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKLSAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKLSAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOwotICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7Ci1MT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7Ci0gICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOwotICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAotICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLUxPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOwotICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOwotICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSGVhZGVyLT5udW1Sb3dzKys7Ci0KLSAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKLX0KLQotZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKLXsKLSAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgewotICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0gICAgICAgIAotICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKLSAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfSAgCi0gIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKLSAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAotfQotCi11aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQotewotICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKLSAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSAgICAgICAgCi0gICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7Ci0gICAgaWYgKCFyb3dTbG90KSB7Ci0gICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgewotICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLUxPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOwotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7Ci1MT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7Ci0KLSAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKLSAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOwotICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKLSAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOwotICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKLX0KLQotdm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Ci19Ci0KLXZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQotewotICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOwotfQotCi1pbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQotewotICAgIGludDY0X3QgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7Ci0gICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1kb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBkb3VibGUgdmFsdWU7Ci0gICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKLSAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOwotI2VuZGlmCi0gICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOwotI2Vsc2UKLSAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKLSAgICBpZiAoIW9mZnNldCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29weUluKG9mZnNldCwgdmFsdWUpOwotCi0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7Ci0jZW5kaWYKLSAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKLSAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7Ci0gICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUwotICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOwotI2Vsc2UKLSAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKLXsKLSAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOwotICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKLSAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKLSNlbHNlCi0gICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQotewotICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7Ci0gICAgaWYgKCFmaWVsZFNsb3QpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgewotICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0N1cnNvcldpbmRvdy5oIGIvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2I1NjAuLjAwMDAwMDAKLS0tIGEvY29yZS9qbmkvQ3Vyc29yV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKLSNkZWZpbmUgX0FORFJPSURfX0RBVEFCQVNFX1dJTkRPV19ICi0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGpuaS5oPgotCi0jZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgotI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQotI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKLQotI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgotCi0vLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCi0vLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuawotI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKLQotCi0jaWYgTE9HX05ERUJVRwotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCi0jZGVmaW5lIExPR19XSU5ET1coLi4uKQotCi0jZWxzZQotCi0jZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKLSNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLQotLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2Ci0jZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQotCi0vLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKLSNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG51bVJvd3M7Ci0gICAgdWludDMyX3QgbnVtQ29sdW1uczsKLX0gd2luZG93X2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHVpbnQzMl90IG9mZnNldDsKLX0gcm93X3Nsb3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50OF90IHR5cGU7Ci0gICAgdW5pb24gewotICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgaW50NjRfdCBsOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OwotICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKLSAgICAgICAgfSBidWZmZXI7Ci0gICAgfSBkYXRhOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7Ci0KLSNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKLSNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCi0jZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKLSNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKLSNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDUKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQotICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5Ci0gKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKLSAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQotICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KLSAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgotICovCi1jbGFzcyBDdXJzb3JXaW5kb3cKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7Ci0gICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQotCi0gICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9Ci0gICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9Ci0gICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KLSAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQotICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKLQotICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKLSAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKLQotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOwotICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKLSAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKLQotICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KLQotICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7Ci0KLSAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMIGlmIEZhaWxlZCB0byBmaW5kIHJvd1Nsb3Qgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEludmFsaWQgcm93U2xvdAotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbik7Ci0gICAgZmllbGRfc2xvdF90ICogICAgICBnZXRGaWVsZFNsb3QoaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZERpck9mZnNldCA9IGdldFJvd1Nsb3Qocm93KS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChmaWVsZF9zbG90X3QgKilvZmZzZXRUb1B0cihmaWVsZERpck9mZnNldCkpICsgY29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotcHJpdmF0ZToKLSAgICB1aW50OF90ICogbURhdGE7Ci0gICAgc2l6ZV90IG1TaXplOwotICAgIHNpemVfdCBtTWF4U2l6ZTsKLSAgICB3aW5kb3dfaGVhZGVyX3QgKiBtSGVhZGVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgb2YgdGhlIGxvd2VzdCB1bnVzZWQgZGF0YSBieXRlIGluIHRoZSBhcnJheS4KLSAgICAgKi8KLSAgICB1aW50MzJfdCBtRnJlZU9mZnNldDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuY3BwCmluZGV4IDg4YmJhZmQuLjg4MGZiNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5jcHAKQEAgLTEyLDYgKzEyLDggQEAKIA0KICNpbmNsdWRlIDxqbmkuaD4NCiANCisjaW5jbHVkZSA8Q2FjaGVzLmg+DQorDQogI2lmIDANCiAgICAgI2RlZmluZSBUUkFDRV9CSVRNQVAoY29kZSkgIGNvZGUNCiAjZWxzZQ0KQEAgLTI1MSw2ICsyNTMsMTEgQEAKIH0NCiANCiBzdGF0aWMgdm9pZCBCaXRtYXBfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgU2tCaXRtYXAqIGJpdG1hcCkgew0KKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSDQorICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsNCisgICAgICAgIGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6Z2V0SW5zdGFuY2UoKS50ZXh0dXJlQ2FjaGUucmVtb3ZlKGJpdG1hcCk7DQorICAgIH0NCisjZW5kaWYNCiAgICAgZGVsZXRlIGJpdG1hcDsNCiB9DQogDQpAQCAtMzEzLDYgKzMyMCwxMCBAQAogICAgIHJldHVybiBiaXRtYXAtPmNvbmZpZygpOw0KIH0NCiANCitzdGF0aWMgaW50IEJpdG1hcF9nZXRHZW5lcmF0aW9uSWQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCisgICAgcmV0dXJuIGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCk7DQorfQ0KKw0KIHN0YXRpYyBqYm9vbGVhbiBCaXRtYXBfaGFzQWxwaGEoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQml0bWFwKiBiaXRtYXApIHsNCiAgICAgcmV0dXJuICFiaXRtYXAtPmlzT3BhcXVlKCk7DQogfQ0KQEAgLTYwNiw2ICs2MTcsNyBAQAogICAgICAgICAodm9pZCopQml0bWFwX3dyaXRlVG9QYXJjZWwgfSwNCiAgICAgeyAgICJuYXRpdmVFeHRyYWN0QWxwaGEiLCAgICAgICAiKElJW0kpTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOyIsDQogICAgICAgICAodm9pZCopQml0bWFwX2V4dHJhY3RBbHBoYSB9LA0KKyAgICB7ICAgIm5hdGl2ZUdlbmVyYXRpb25JZCIsICAgICAgICIoSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRHZW5lcmF0aW9uSWQgfSwNCiAgICAgeyAgICJuYXRpdmVHZXRQaXhlbCIsICAgICAgICAgICAiKElJSSlJIiwgKHZvaWQqKUJpdG1hcF9nZXRQaXhlbCB9LA0KICAgICB7ICAgIm5hdGl2ZUdldFBpeGVscyIsICAgICAgICAgICIoSVtJSUlJSUlJKVYiLCAodm9pZCopQml0bWFwX2dldFBpeGVscyB9LA0KICAgICB7ICAgIm5hdGl2ZVNldFBpeGVsIiwgICAgICAgICAgICIoSUlJSSlWIiwgKHZvaWQqKUJpdG1hcF9zZXRQaXhlbCB9LA0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAppbmRleCBlMWU5NTM2Li5iZjE1MGE5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJTa0NhbnZhcy5oIgogI2luY2x1ZGUgIlNrRGV2aWNlLmgiCi0jaW5jbHVkZSAiU2tHTENhbnZhcy5oIgogI2luY2x1ZGUgIlNrR3JhcGhpY3MuaCIKICNpbmNsdWRlICJTa0ltYWdlUmVmX0dsb2JhbFBvb2wuaCIKICNpbmNsdWRlICJTa1BvcnRlckR1ZmYuaCIKQEAgLTMwLDYgKzI5LDEzIEBACiAjaW5jbHVkZSAiU2tCb3VuZGFyeVBhdGNoLmgiCiAjaW5jbHVkZSAiU2tNZXNoVXRpbHMuaCIKIAorI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNkZWZpbmUgVElNRV9EUkFXeAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X3RocmVhZF9tc2VjKCkgewpAQCAtNjAsMTMgKzY2LDggQEAKICAgICAgICAgcmV0dXJuIGJpdG1hcCA/IG5ldyBTa0NhbnZhcygqYml0bWFwKSA6IG5ldyBTa0NhbnZhczsKICAgICB9CiAgICAgCi0gICAgc3RhdGljIFNrQ2FudmFzKiBpbml0R0woSk5JRW52KiBlbnYsIGpvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTa0dMQ2FudmFzOwotICAgIH0KLSAgICAKICAgICBzdGF0aWMgdm9pZCBmcmVlQ2FjaGVzKEpOSUVudiogZW52LCBqb2JqZWN0KSB7CiAgICAgICAgIC8vIHRoZXNlIGFyZSBjYWxsZWQgaW4gbm8gcGFydGljdWxhciBvcmRlcgotICAgICAgICBTa0dMQ2FudmFzOjpEZWxldGVBbGxUZXh0dXJlcygpOwogICAgICAgICBTa0ltYWdlUmVmX0dsb2JhbFBvb2w6OlNldFJBTVVzZWQoMCk7CiAgICAgICAgIFNrR3JhcGhpY3M6OlNldEZvbnRDYWNoZVVzZWQoMCk7CiAgICAgfQpAQCAtMTAzLDExICsxMDQsNiBAQAogICAgICAgICByZXR1cm4gY2FudmFzLT5nZXREZXZpY2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKS5oZWlnaHQoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBzZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgY2FudmFzLT5zZXRWaWV3cG9ydCh3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgCiAgICAgc3RhdGljIHZvaWQgc2V0Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JpdG1hcCogYml0bWFwKSB7CiAgICAgICAgIGNhbnZhcy0+c2V0Qml0bWFwRGV2aWNlKCpiaXRtYXApOwpAQCAtNzQzLDQ1ICs3MzksNDkgQEAKICAgICAgICAgY2FudmFzLT5kcmF3VmVydGljZXMobW9kZSwgcHRDb3VudCwgdmVydHMsIHRleHMsIGNvbG9ycywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywgaW5kZXhDb3VudCwgKnBhaW50KTsKICAgICB9Ci0gICAgCi0gICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX19DSUlGRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAorCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dF9fX0NJSUZGSVBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LCBTa0NhbnZhcyogY2FudmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKLSAgICAgICAganNpemUgdGV4dENvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aCh0ZXh0KTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHRleHRBcnJheSArIGluZGV4LCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgMCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CiAgICAgfQotIAotICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0X19TdHJpbmdJSUZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGFpbnQqIHBhaW50KSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7Ci0gICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0KChjb25zdCB1aW50MTZfdCopdGV4dF8gKyBzdGFydCwgKGVuZCAtIHN0YXJ0KSA8PCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHhfLCB5XywgKnBhaW50KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgKGNvbnN0IGpjaGFyKikgdGV4dF8pOworCisgICAgc3RhdGljIHZvaWQgZHJhd1RleHRfX1N0cmluZ0lJRkZJUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0KHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgdm9pZCBkcmF3U3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywganN0cmluZyB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBqb2JqZWN0IHBhaW50KSB7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIGNhbnZhcyk7Ci0gICAgICAgIE5QRV9DSEVDS19SRVRVUk5fVk9JRChlbnYsIHBhaW50KTsKLSAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgdGV4dCk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpOwotICAgICAgICBpZiAoMCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0XyA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7Ci0gICAgICAgIFNrQ2FudmFzKiBjID0gR3JhcGhpY3NKTkk6OmdldE5hdGl2ZUNhbnZhcyhlbnYsIGNhbnZhcyk7Ci0gICAgICAgIGMtPmRyYXdUZXh0KHRleHRfLCBjb3VudCA8PCAxLCBTa0Zsb2F0VG9TY2FsYXIoeCksIFNrRmxvYXRUb1NjYWxhcih5KSwKLSAgICAgICAgICAgICAgICAgICAgKkdyYXBoaWNzSk5JOjpnZXROYXRpdmVQYWludChlbnYsIHBhaW50KSk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRfKTsKKworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludCgKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LAorICAgICAgICBpbnQgY291bnQsIGludCBjb250ZXh0SW5kZXgsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLCBTa1BhaW50KiBwYWludCkgeworCisgICAgICAgIGpjaGFyKiBjaGFycyA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKHBhaW50LCBjaGFycyArIGNvbnRleHRJbmRleCwgaW5kZXggLSBjb250ZXh0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIGRpckZsYWdzLCB4LCB5LCBjYW52YXMpOworICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjaGFycywgSk5JX0FCT1JUKTsKICAgICB9Ci0gICAgCisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFJ1bl9fU3RyaW5nSUlJSUZGSVBhaW50KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCBvYmosIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwgamludCBzdGFydCwKKyAgICAgICAgamludCBlbmQsIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRFbmQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgamludCBkaXJGbGFncywgU2tQYWludCogcGFpbnQpIHsKKworICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGppbnQgY29udGV4dENvdW50ID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY29uc3QgamNoYXIqIGNoYXJzID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRSdW4ocGFpbnQsIGNoYXJzICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MsIHgsIHksIGNhbnZhcyk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIGNoYXJzKTsKKyAgICB9CisKICAgICBzdGF0aWMgdm9pZCBkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsIFNrQ2FudmFzKiBjYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IHBvcywgU2tQYWludCogcGFpbnQpIHsKQEAgLTgwNCwxMCArODA0LDExIEBACiAgICAgICAgIH0KICAgICAgICAgZGVsZXRlW10gcG9zUHRyOwogICAgIH0KLSAKKwogICAgIHN0YXRpYyB2b2lkIGRyYXdQb3NUZXh0X19TdHJpbmdfRlBhaW50KEpOSUVudiogZW52LCBqb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpzdHJpbmcgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXRBcnJheSBwb3MsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KSB7CiAgICAgICAgIGNvbnN0IHZvaWQqIHRleHRfID0gdGV4dCA/IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCkgOiBOVUxMOwogICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IHRleHQgPyBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KSA6IDA7CiAgICAgICAgIGZsb2F0KiBwb3NBcnJheSA9IHBvcyA/IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHBvcywgTlVMTCkgOiBOVUxMOwpAQCAtODI3LDI3ICs4MjgsMjcgQEAKICAgICAgICAgfQogICAgICAgICBkZWxldGVbXSBwb3NQdHI7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgZHJhd1RleHRPblBhdGhfX19DSUlQYXRoRkZQYWludChKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgICAgICAgICBTa0NhbnZhcyogY2FudmFzLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogCiAgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOwotICAgICAgICBjYW52YXMtPmRyYXdUZXh0T25QYXRoSFYodGV4dEFycmF5ICsgaW5kZXgsIGNvdW50IDw8IDEsICpwYXRoLAotICAgICAgICAgICAgICAgICAgICBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCksIFNrRmxvYXRUb1NjYWxhcih2T2Zmc2V0KSwgKnBhaW50KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRBcnJheSwgY291bnQsIGJpZGlGbGFncywgaE9mZnNldCwgdk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2FudmFzKTsKICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgdGV4dEFycmF5LCAwKTsKICAgICB9Ci0gCisKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnQoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0IGhPZmZzZXQsIGpmbG9hdCB2T2Zmc2V0LCBTa1BhaW50KiBwYWludCkgeworICAgICAgICAgICAgU2tDYW52YXMqIGNhbnZhcywganN0cmluZyB0ZXh0LCBTa1BhdGgqIHBhdGgsCisgICAgICAgICAgICBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsIGppbnQgYmlkaUZsYWdzLCBTa1BhaW50KiBwYWludCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dF8gPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOwotICAgICAgICBpbnQgYnl0ZUxlbmd0aCA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHRleHQpIDw8IDE7Ci0gICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0XywgYnl0ZUxlbmd0aCwgKnBhdGgsCi0gICAgICAgICAgICAgICAgICAgIFNrRmxvYXRUb1NjYWxhcihoT2Zmc2V0KSwgU2tGbG9hdFRvU2NhbGFyKHZPZmZzZXQpLCAqcGFpbnQpOworICAgICAgICBpbnQgY291bnQgPSBlbnYtPkdldFN0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgICAgICAgVGV4dExheW91dDo6ZHJhd1RleHRPblBhdGgocGFpbnQsIHRleHRfLCBjb3VudCwgYmlkaUZsYWdzLCBoT2Zmc2V0LCB2T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBjYW52YXMpOwogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0Xyk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIGJvb2wgZ2V0Q2xpcEJvdW5kcyhKTklFbnYqIGVudiwgam9iamVjdCwgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgYm91bmRzKSB7CiAgICAgICAgIFNrUmVjdCAgIHI7CkBAIC04NjgsMTIgKzg2OSwxMCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ2FudmFzTWV0aG9kc1tdID0gewogICAgIHsiZmluYWxpemVyIiwgIihJKVYiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZmluYWxpemVyfSwKICAgICB7ImluaXRSYXN0ZXIiLCIoSSlJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRSYXN0ZXJ9LAotICAgIHsiaW5pdEdMIiwiKClJIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmluaXRHTH0sCiAgICAgeyJpc09wYXF1ZSIsIigpWiIsICh2b2lkKikgU2tDYW52YXNHbHVlOjppc09wYXF1ZX0sCiAgICAgeyJnZXRXaWR0aCIsIigpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpnZXRXaWR0aH0sCiAgICAgeyJnZXRIZWlnaHQiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6Z2V0SGVpZ2h0fSwKICAgICB7Im5hdGl2ZV9zZXRCaXRtYXAiLCIoSUkpViIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzZXRCaXRtYXB9LAotICAgIHsibmF0aXZlU2V0Vmlld3BvcnQiLCAiKElJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OnNldFZpZXdwb3J0fSwKICAgICB7InNhdmUiLCIoKUkiLCAodm9pZCopIFNrQ2FudmFzR2x1ZTo6c2F2ZUFsbH0sCiAgICAgeyJzYXZlIiwiKEkpSSIsICh2b2lkKikgU2tDYW52YXNHbHVlOjpzYXZlfSwKICAgICB7Im5hdGl2ZV9zYXZlTGF5ZXIiLCIoSUxhbmRyb2lkL2dyYXBoaWNzL1JlY3RGO0lJKUkiLApAQCAtOTQwLDI2ICs5MzksMjcgQEAKICAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBSUn0sCiAgICAgeyJuYXRpdmVfZHJhd0JpdG1hcCIsICIoSVtJSUlGRklJWkkpViIsCiAgICAgKHZvaWQqKVNrQ2FudmFzR2x1ZTo6ZHJhd0JpdG1hcEFycmF5fSwKLSAgICAKICAgICB7Im5hdGl2ZURyYXdCaXRtYXBNYXRyaXgiLCAiKElJSUkpViIsCiAgICAgICAgICh2b2lkKilTa0NhbnZhc0dsdWU6OmRyYXdCaXRtYXBNYXRyaXh9LAogICAgIHsibmF0aXZlRHJhd0JpdG1hcE1lc2giLCAiKElJSUlbRklbSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3Qml0bWFwTWVzaH0sCiAgICAgeyJuYXRpdmVEcmF3VmVydGljZXMiLCAiKElJSVtGSVtGSVtJSVtTSUlJKVYiLAogICAgICAgICAodm9pZCopU2tDYW52YXNHbHVlOjpkcmF3VmVydGljZXN9LAotICAgIHsibmF0aXZlX2RyYXdUZXh0IiwiKElbQ0lJRkZJKVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsCi0gICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dF9fU3RyaW5nSUlGRlBhaW50fSwKLSAgICB7ImRyYXdUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO0ZGTGFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQ7KVYiLAotICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1N0cmluZ30sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSVtDSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRfX19DSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHQiLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0X19TdHJpbmdJSUZGSVBhaW50fSwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dFJ1biIsIihJW0NJSUlJRkZJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdUZXh0UnVuX19fQ0lJSUlGRklQYWludH0sCisgICAgeyJuYXRpdmVfZHJhd1RleHRSdW4iLCIoSUxqYXZhL2xhbmcvU3RyaW5nO0lJSUlGRklJKVYiLAorICAgICAgICAodm9pZCopIFNrQ2FudmFzR2x1ZTo6ZHJhd1RleHRSdW5fX1N0cmluZ0lJSUlGRklQYWludH0sCiAgICAgeyJuYXRpdmVfZHJhd1Bvc1RleHQiLCIoSVtDSUlbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fX0NJSV9GUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQb3NUZXh0IiwiKElMamF2YS9sYW5nL1N0cmluZztbRkkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3UG9zVGV4dF9fU3RyaW5nX0ZQYWludH0sCi0gICAgeyJuYXRpdmVfZHJhd1RleHRPblBhdGgiLCIoSVtDSUlJRkZJKVYiLAorICAgIHsibmF0aXZlX2RyYXdUZXh0T25QYXRoIiwiKElbQ0lJSUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fX0NJSVBhdGhGRlBhaW50fSwKLSAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSSlWIiwKKyAgICB7Im5hdGl2ZV9kcmF3VGV4dE9uUGF0aCIsIihJTGphdmEvbGFuZy9TdHJpbmc7SUZGSUkpViIsCiAgICAgICAgICh2b2lkKikgU2tDYW52YXNHbHVlOjpkcmF3VGV4dE9uUGF0aF9fU3RyaW5nUGF0aEZGUGFpbnR9LAogICAgIHsibmF0aXZlX2RyYXdQaWN0dXJlIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NhbnZhc0dsdWU6OmRyYXdQaWN0dXJlfSwKIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAppbmRleCBlYmZiMjA5Li5mM2JlOGIwIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmNwcApAQCAtMjMsMjggKzIzLDY5IEBACiAjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZpbHRlci5oIgogI2luY2x1ZGUgIlNrUG9ydGVyRHVmZi5oIgogCisjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CisKIGNsYXNzIFNrQ29sb3JGaWx0ZXJHbHVlIHsKIHB1YmxpYzoKLQotICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplcihKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tDb2xvckZpbHRlciogb2JqKSB7CisgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa0NvbG9yRmlsdGVyKiBvYmosIFNraWFDb2xvckZpbHRlciogZikgeworICAgICAgICBkZWxldGUgZjsKICAgICAgICAgb2JqLT5zYWZlVW5yZWYoKTsKICAgICB9CiAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgewotICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTW9kZUZpbHRlcihzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgc3JjQ29sb3IsCisgICAgICAgICAgICBTa1BvcnRlckR1ZmY6Ok1vZGUgbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhQmxlbmRGaWx0ZXIoc3JjQ29sb3IsIFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUobW9kZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKICAgICB9Ci0gCi0gICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUxpZ2h0aW5nRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IG11bCwgamludCBhZGQpIHsKKworICAgIHN0YXRpYyBTa2lhQ29sb3JGaWx0ZXIqIGdsQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgcmV0dXJuIG5ldyBTa2lhTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tpYUNvbG9yRmlsdGVyKiBnbENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvQXJyYXkoZW52LCBqYXJyYXksIDIwKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IGF1dG9BcnJheS5wdHIoKTsKKworICAgICAgICBmbG9hdCogY29sb3JNYXRyaXggPSBuZXcgZmxvYXRbMTZdOworICAgICAgICBtZW1jcHkoY29sb3JNYXRyaXgsIHNyYywgNCAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBtZW1jcHkoJmNvbG9yTWF0cml4WzRdLCAmc3JjWzVdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbOF0sICZzcmNbMTBdLCA0ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIG1lbWNweSgmY29sb3JNYXRyaXhbMTJdLCAmc3JjWzE1XSwgNCAqIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGZsb2F0KiBjb2xvclZlY3RvciA9IG5ldyBmbG9hdFs0XTsKKyAgICAgICAgY29sb3JWZWN0b3JbMF0gPSBzcmNbNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzFdID0gc3JjWzldOworICAgICAgICBjb2xvclZlY3RvclsyXSA9IHNyY1sxNF07CisgICAgICAgIGNvbG9yVmVjdG9yWzNdID0gc3JjWzE5XTsKKworICAgICAgICByZXR1cm4gbmV3IFNraWFDb2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCwgY29sb3JWZWN0b3IpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihKTklFbnYqIGVudiwgam9iamVjdCwgamludCBzcmNDb2xvciwKKyAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6TW9kZSBtb2RlKSB7CisgICAgICAgIHJldHVybiBTa0NvbG9yRmlsdGVyOjpDcmVhdGVNb2RlRmlsdGVyKHNyY0NvbG9yLCBTa1BvcnRlckR1ZmY6OlRvWGZlcm1vZGVNb2RlKG1vZGUpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsIGppbnQgbXVsLCBqaW50IGFkZCkgewogICAgICAgICByZXR1cm4gU2tDb2xvckZpbHRlcjo6Q3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOwogICAgIH0KLSAgICAKLSAgICBzdGF0aWMgU2tDb2xvckZpbHRlciogQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdEFycmF5IGphcnJheSkgeworCisgICAgc3RhdGljIFNrQ29sb3JGaWx0ZXIqIENyZWF0ZUNvbG9yTWF0cml4RmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0LCBqZmxvYXRBcnJheSBqYXJyYXkpIHsKICAgICAgICAgQXV0b0phdmFGbG9hdEFycmF5IGF1dG9BcnJheShlbnYsIGphcnJheSwgMjApOwogICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gYXV0b0FycmF5LnB0cigpOwogCkBAIC01OCwyNiArOTksMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKHNyYyk7CiAjZW5kaWYKICAgICB9Ci0gCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9yZmlsdGVyX21ldGhvZHNbXSA9IHsKLSAgICB7ImZpbmFsaXplciIsICIoSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQorICAgIHsiZmluYWxpemVyIiwgIihJSSlWIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6ZmluYWxpemVyfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBwb3J0ZXJkdWZmX21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwiKElJKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVQb3J0ZXJEdWZmRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyIiwgIihJSSlJIiwgKHZvaWQqKSBTa0NvbG9yRmlsdGVyR2x1ZTo6Q3JlYXRlUG9ydGVyRHVmZkZpbHRlciAgIH0sCisgICAgeyAibkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIgfQogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBsaWdodGluZ19tZXRob2RzW10gPSB7Ci0gICAgeyJuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCIoSUkpSSIsCi0gICAgICAgICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyfQorICAgIHsgIm5hdGl2ZV9DcmVhdGVMaWdodGluZ0ZpbHRlciIsICIoSUkpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUxpZ2h0aW5nRmlsdGVyICAgfSwKKyAgICB7ICJuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIiLCAgICAgICAiKElJKUkiLCAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpnbENyZWF0ZUxpZ2h0aW5nRmlsdGVyIH0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGNvbG9ybWF0cml4X21ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNvbG9yTWF0cml4RmlsdGVyIiwiKFtGKUkiLAotICAgICAgICAodm9pZCopIFNrQ29sb3JGaWx0ZXJHbHVlOjpDcmVhdGVDb2xvck1hdHJpeEZpbHRlcn0KKyAgICB7ICJuYXRpdmVDb2xvck1hdHJpeEZpbHRlciIsICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OkNyZWF0ZUNvbG9yTWF0cml4RmlsdGVyICAgfSwKKyAgICB7ICJuQ29sb3JNYXRyaXhGaWx0ZXIiLCAgICAgICIoW0YpSSIsICh2b2lkKikgU2tDb2xvckZpbHRlckdsdWU6OmdsQ3JlYXRlQ29sb3JNYXRyaXhGaWx0ZXIgfQogfTsKIAogI2RlZmluZSBSRUcoZW52LCBuYW1lLCBhcnJheSkgXApAQCAtODUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS19BUlJBWV9DT1VOVChhcnJheSkpOyAgXAogICAgIGlmIChyZXN1bHQgPCAwKSByZXR1cm4gcmVzdWx0CiAKLQogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfQ29sb3JGaWx0ZXIoSk5JRW52KiBlbnYpIHsKICAgICBpbnQgcmVzdWx0OwogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYWludC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAppbmRleCA3ODBiYWRjLi5jYTlmMzcxIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhaW50LmNwcApAQCAtMzEsNiArMzEsMTEgQEAKICNpbmNsdWRlICJTa1NoYWRlci5oIgogI2luY2x1ZGUgIlNrVHlwZWZhY2UuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2hhcGUuaCIKKyNpbmNsdWRlICJUZXh0TGF5b3V0LmgiCisKKy8vIHRlbXBvcmFyeSBmb3IgZGVidWdnaW5nCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTcsNiArNjIsOSBAQAogCiBjbGFzcyBTa1BhaW50R2x1ZSB7CiBwdWJsaWM6CisgICAgZW51bSBNb3ZlT3B0IHsKKyAgICAgICAgQUZURVIsIEFUX09SX0FGVEVSLCBCRUZPUkUsIEFUX09SX0JFRk9SRSwgQVQKKyAgICB9OwogCiAgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBvYmopIHsKICAgICAgICAgZGVsZXRlIG9iajsKQEAgLTM5NSwyMCArNDAzLDE2MSBAQAogICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyh0ZXh0LCB0ZXh0QXJyYXkpOwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQ0lJRkZQYXRoKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhaW50KiBwYWludCwgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKLSAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7Ci0gICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh0ZXh0QXJyYXkgKyBpbmRleCwgY291bnQgPDwgMSwgU2tGbG9hdFRvU2NhbGFyKHgpLCBTa0Zsb2F0VG9TY2FsYXIoeSksIHBhdGgpOwotICAgICAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBjb25zdF9jYXN0PGpjaGFyKj4odGV4dEFycmF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk5JX0FCT1JUKTsKKworICAgIHN0YXRpYyBqZmxvYXQgZG9UZXh0UnVuQWR2YW5jZXMoSk5JRW52ICplbnYsIFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgeworICAgICAgICBqZmxvYXQgYWR2YW5jZXNBcnJheVtjb3VudF07CisgICAgICAgIGpmbG9hdCB0b3RhbEFkdmFuY2U7CisKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFJ1bkFkdmFuY2VzKHBhaW50LCB0ZXh0LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlc0FycmF5LCB0b3RhbEFkdmFuY2UpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnYtPlNldEZsb2F0QXJyYXlSZWdpb24oYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIGNvdW50LCBhZHZhbmNlc0FycmF5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxBZHZhbmNlOwogICAgIH0KLSAKLSAgICBzdGF0aWMgdm9pZCBnZXRUZXh0UGF0aF9fU3RyaW5nSUlGRlBhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKworICAgIHN0YXRpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXNfX19DSUlJSUlfRkkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBqaW50IGluZGV4LCBqaW50IGNvdW50LCBqaW50IGNvbnRleHRJbmRleCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBqaW50IGZsYWdzLCBqZmxvYXRBcnJheSBhZHZhbmNlcywgamludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqZmxvYXQgcmVzdWx0ID0gZG9UZXh0UnVuQWR2YW5jZXMoZW52LCBwYWludCwgdGV4dEFycmF5ICsgY29udGV4dEluZGV4LAorICAgICAgICAgICAgaW5kZXggLSBjb250ZXh0SW5kZXgsIGNvdW50LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzX19TdHJpbmdJSUlJSV9GSShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsCisgICAgICAgICAgICBqc3RyaW5nIHRleHQsIGppbnQgc3RhcnQsIGppbnQgZW5kLCBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLAorICAgICAgICAgICAgamZsb2F0QXJyYXkgYWR2YW5jZXMsIGppbnQgYWR2YW5jZXNJbmRleCkgewogICAgICAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKLSAgICAgICAgcGFpbnQtPmdldFRleHRQYXRoKHRleHRBcnJheSArIHN0YXJ0LCAoZW5kIC0gc3RhcnQpIDw8IDEsIFNrRmxvYXRUb1NjYWxhcih4KSwgU2tGbG9hdFRvU2NhbGFyKHkpLCBwYXRoKTsKKyAgICAgICAgamZsb2F0IHJlc3VsdCA9IGRvVGV4dFJ1bkFkdmFuY2VzKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIHN0YXJ0IC0gY29udGV4dFN0YXJ0LCBlbmQgLSBzdGFydCwgY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCwgZmxhZ3MsIGFkdmFuY2VzLAorICAgICAgICAgICAgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGppbnQgZG9UZXh0UnVuQ3Vyc29yKEpOSUVudiAqZW52LCBTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIgKnRleHQsIGppbnQgc3RhcnQsCisgICAgICAgICAgICBqaW50IGNvdW50LCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBvcHQpIHsKKyAgICAgICAgU2tTY2FsYXIgc2NhbGFyQXJyYXlbY291bnRdOworICAgICAgICBqY2hhciBidWZmZXJbY291bnRdOworCisgICAgICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UnZCBjYWxsIGhhcmZidXp6CisgICAgICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMgYW5kIHdpZHRocyByZXR1cm5lZCBmcm9tIHNraWEKKworICAgICAgICBpbnQgd2lkdGhzOworICAgICAgICBpZiAoZmxhZ3MgJiAweDEpIHsgLy8gcnRsLCBjYWxsIGFyYWJpYyBzaGFwaW5nIGluIGNhc2UKKyAgICAgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgICAgLy8gVXNlIGZpeGVkIGxlbmd0aCBzaW5jZSB3ZSBuZWVkIHRvIGtlZXAgc3RhcnQgYW5kIGNvdW50IHZhbGlkCisgICAgICAgICAgICB1X3NoYXBlQXJhYmljKHRleHQgKyBzdGFydCwgY291bnQsIGJ1ZmZlciwgY291bnQsCisgICAgICAgICAgICAgICAgICAgIFVfU0hBUEVfTEVOR1RIX0ZJWEVEX1NQQUNFU19ORUFSIHwgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwKKyAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwgVV9TSEFQRV9YX0xBTUFMRUZfU1VCX0FMVEVSTkFURSwgJnN0YXR1cyk7CisgICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3QgZmFpbCB1bmxlc3MgdGhlcmUncyBhbiBvdXQgb2YgbWVtb3J5IGNvbmRpdGlvbiwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXSA9PSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2lkdGhzID0gcGFpbnQtPmdldFRleHRXaWR0aHMoYnVmZmVyLCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0ICsgc3RhcnQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aHMgPCBjb3VudCkgeworICAgICAgICAgICAgLy8gU2tpYSBvcGVyYXRlcyBvbiBjb2RlIHBvaW50cywgbm90IGNvZGUgdW5pdHMsIHNvIHN1cnJvZ2F0ZSBwYWlycyByZXR1cm4gb25seSBvbmUKKyAgICAgICAgICAgIC8vIHZhbHVlLiBFeHBhbmQgdGhlIHJlc3VsdCBzbyB3ZSBoYXZlIG9uZSB2YWx1ZSBwZXIgVVRGLTE2IGNvZGUgdW5pdC4KKworICAgICAgICAgICAgLy8gTm90ZSwgc2tpYSdzIGdldFRleHRXaWR0aCBnZXRzIGNvbmZ1c2VkIGlmIGl0IGVuY291bnRlcnMgYSBzdXJyb2dhdGUgcGFpciwKKyAgICAgICAgICAgIC8vIGxlYXZpbmcgdGhlIHJlbWFpbmluZyB3aWR0aHMgemVyby4gIE5vdCBuaWNlLgorICAgICAgICAgICAgY29uc3QgamNoYXIgKmNoYXJzID0gdGV4dCArIHN0YXJ0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGNvdW50LCBwID0gd2lkdGhzIC0gMTsgLS1pID4gcDspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPj0gMHhkYzAwICYmIGNoYXJzW2ldIDwgMHhlMDAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc1tpLTFdID49IDB4ZDgwMCAmJiBjaGFyc1tpLTFdIDwgMHhkYzAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYWxhckFycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc2NhbGFyQXJyYXlbaV0gPSBzY2FsYXJBcnJheVstLXBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGppbnQgcG9zID0gb2Zmc2V0IC0gc3RhcnQ7CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgIGNhc2UgQUZURVI6CisgICAgICAgICAgaWYgKHBvcyA8IGNvdW50KSB7CisgICAgICAgICAgICBwb3MgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgQVRfT1JfQUZURVI6CisgICAgICAgICAgd2hpbGUgKHBvcyA8IGNvdW50ICYmIHNjYWxhckFycmF5W3Bvc10gPT0gMCkgeworICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFRk9SRToKKyAgICAgICAgICBpZiAocG9zID4gMCkgeworICAgICAgICAgICAgLS1wb3M7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIEFUX09SX0JFRk9SRToKKyAgICAgICAgICB3aGlsZSAocG9zID4gMCAmJiBzY2FsYXJBcnJheVtwb3NdID09IDApIHsKKyAgICAgICAgICAgIC0tcG9zOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoc2NhbGFyQXJyYXlbcG9zXSA9PSAwKSB7CisgICAgICAgICAgICBwb3MgPSAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9zICE9IC0xKSB7CisgICAgICAgICAgcG9zICs9IHN0YXJ0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGpjaGFyQXJyYXkgdGV4dCwKKyAgICAgICAgICAgIGppbnQgY29udGV4dFN0YXJ0LCBqaW50IGNvbnRleHRDb3VudCwgamludCBmbGFncywgamludCBvZmZzZXQsIGppbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgICAgICBqaW50IHJlc3VsdCA9IGRvVGV4dFJ1bkN1cnNvcihlbnYsIHBhaW50LCB0ZXh0QXJyYXksIGNvbnRleHRTdGFydCwgY29udGV4dENvdW50LCBmbGFncywKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKHRleHQsIHRleHRBcnJheSwgSk5JX0FCT1JUKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0aWMgamludCBnZXRUZXh0UnVuQ3Vyc29yX19TdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIFNrUGFpbnQqIHBhaW50LCBqc3RyaW5nIHRleHQsCisgICAgICAgICAgICBqaW50IGNvbnRleHRTdGFydCwgamludCBjb250ZXh0RW5kLCBqaW50IGZsYWdzLCBqaW50IG9mZnNldCwgamludCBjdXJzb3JPcHQpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0U3RyaW5nQ2hhcnModGV4dCwgTlVMTCk7CisgICAgICAgIGppbnQgcmVzdWx0ID0gZG9UZXh0UnVuQ3Vyc29yKGVudiwgcGFpbnQsIHRleHRBcnJheSwgY29udGV4dFN0YXJ0LAorICAgICAgICAgICAgICAgIGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQsIGZsYWdzLCBvZmZzZXQsIGN1cnNvck9wdCk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGgoSk5JRW52KiBlbnYsIFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwgamludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGggKnBhdGgpIHsKKyAgICAgICAgVGV4dExheW91dDo6Z2V0VGV4dFBhdGgocGFpbnQsIHRleHQsIGNvdW50LCBiaWRpRmxhZ3MsIHgsIHksIHBhdGgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoX19fQyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAgamNoYXJBcnJheSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgamZsb2F0IHgsIGpmbG9hdCB5LCBTa1BhdGgqIHBhdGgpIHsKKyAgICAgICAgY29uc3QgamNoYXIqIHRleHRBcnJheSA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHModGV4dCwgTlVMTCk7CisgICAgICAgIGdldFRleHRQYXRoKGVudiwgcGFpbnQsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgYmlkaUZsYWdzLCB4LCB5LCBwYXRoKTsKKyAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHModGV4dCwgY29uc3RfY2FzdDxqY2hhcio+KHRleHRBcnJheSksIEpOSV9BQk9SVCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFBhdGhfX1N0cmluZyhKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgU2tQYWludCogcGFpbnQsIGppbnQgYmlkaUZsYWdzLAorICAgICAgICAgICAganN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tQYXRoKiBwYXRoKSB7CisgICAgICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgICAgICBnZXRUZXh0UGF0aChlbnYsIHBhaW50LCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIGJpZGlGbGFncywgeCwgeSwgcGF0aCk7CiAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKHRleHQsIHRleHRBcnJheSk7CiAgICAgfQotIAorCiAgICAgc3RhdGljIHZvaWQgc2V0U2hhZG93TGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QganBhaW50LCBqZmxvYXQgcmFkaXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBpbnQgY29sb3IpIHsKICAgICAgICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwganBhaW50KTsKQEAgLTU3NiwxMyArNzI1LDIwIEBACiAgICAgeyJuYXRpdmVfYnJlYWtUZXh0IiwiKExqYXZhL2xhbmcvU3RyaW5nO1pGW0YpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmJyZWFrVGV4dFN9LAogICAgIHsibmF0aXZlX2dldFRleHRXaWR0aHMiLCIoSVtDSUlbRilJIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFdpZHRoc19fX0NJSV9GfSwKICAgICB7Im5hdGl2ZV9nZXRUZXh0V2lkdGhzIiwiKElMamF2YS9sYW5nL1N0cmluZztJSVtGKUkiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0V2lkdGhzX19TdHJpbmdJSV9GfSwKLSAgICB7Im5hdGl2ZV9nZXRUZXh0UGF0aCIsIihJW0NJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX19DSUlGRlBhdGh9LAotICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUZGSSlWIiwgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFBhdGhfX1N0cmluZ0lJRkZQYXRofSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMiLCIoSVtDSUlJSUlbRkkpRiIsICh2b2lkKikKKyAgICAgICAgU2tQYWludEdsdWU6OmdldFRleHRSdW5BZHZhbmNlc19fX0NJSUlJSV9GSX0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzIiwiKElMamF2YS9sYW5nL1N0cmluZztJSUlJSVtGSSlGIiwKKyAgICAgICAgKHZvaWQqKSBTa1BhaW50R2x1ZTo6Z2V0VGV4dFJ1bkFkdmFuY2VzX19TdHJpbmdJSUlJSV9GSX0sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvciIsICIoSVtDSUlJSUkpSSIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX19DfSwKKyAgICB7Im5hdGl2ZV9nZXRUZXh0UnVuQ3Vyc29yIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlJSUkpSSIsCisgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRSdW5DdXJzb3JfX1N0cmluZ30sCisgICAgeyJuYXRpdmVfZ2V0VGV4dFBhdGgiLCIoSUlbQ0lJRkZJKVYiLCAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRUZXh0UGF0aF9fX0N9LAorICAgIHsibmF0aXZlX2dldFRleHRQYXRoIiwiKElJTGphdmEvbGFuZy9TdHJpbmc7SUlGRkkpViIsICh2b2lkKikgU2tQYWludEdsdWU6OmdldFRleHRQYXRoX19TdHJpbmd9LAogICAgIHsibmF0aXZlR2V0U3RyaW5nQm91bmRzIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIFNrUGFpbnRHbHVlOjpnZXRTdHJpbmdCb3VuZHMgfSwKICAgICB7Im5hdGl2ZUdldENoYXJBcnJheUJvdW5kcyIsICIoSVtDSUlMYW5kcm9pZC9ncmFwaGljcy9SZWN0OylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgU2tQYWludEdsdWU6OmdldENoYXJBcnJheUJvdW5kcyB9LAotICAgIHsic2V0U2hhZG93TGF5ZXIiLCAiKEZGRkkpViIsICh2b2lkKilTa1BhaW50R2x1ZTo6c2V0U2hhZG93TGF5ZXJ9CisgICAgeyJuU2V0U2hhZG93TGF5ZXIiLCAiKEZGRkkpViIsICh2b2lkKilTa1BhaW50R2x1ZTo6c2V0U2hhZG93TGF5ZXJ9CiB9OwogCiBzdGF0aWMgamZpZWxkSUQgcmVxX2ZpZWxkSUQoamZpZWxkSUQgaWQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguY3BwCmluZGV4IGI4YjJhMTAuLmFiZTMzZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcApAQCAtMjYsMTIgKzI2LDE5IEBACiAKICNpbmNsdWRlICJTa1BhdGguaCIKIAorI2luY2x1ZGUgPENhY2hlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIFNrUGF0aEdsdWUgewogcHVibGljOgogCiAgICAgc3RhdGljIHZvaWQgZmluYWxpemVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBTa1BhdGgqIG9iaikgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICAgICAgaWYgKGFuZHJvaWQ6OnVpcmVuZGVyZXI6OkNhY2hlczo6aGFzSW5zdGFuY2UoKSkgeworICAgICAgICAgICAgYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpnZXRJbnN0YW5jZSgpLnBhdGhDYWNoZS5yZW1vdmUob2JqKTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIGRlbGV0ZSBvYmo7CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5jcHAKaW5kZXggYjA5YzYyYi4uOTIwMjQyOSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmNwcApAQCAtOCw2ICs4LDE2IEBACiAjaW5jbHVkZSAiU2tUZW1wbGF0ZXMuaCIKICNpbmNsdWRlICJTa1hmZXJtb2RlLmgiCiAKKyNpbmNsdWRlIDxTa2lhU2hhZGVyLmg+CisjaW5jbHVkZSA8Q2FjaGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjp1aXJlbmRlcmVyOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBqY2xhc3MgY2xheno7CisgICAgamZpZWxkSUQgc2hhZGVyOworfSBnU2hhZGVyQ2xhc3NJbmZvOworCiBzdGF0aWMgdm9pZCBUaHJvd0lBRV9JZk51bGwoSk5JRW52KiBlbnYsIHZvaWQqIHB0cikgewogICAgIGlmIChOVUxMID09IHB0cikgewogICAgICAgICBkb1Rocm93SUFFKGVudik7CkBAIC00MSw4ICs1MSwxNCBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgdm9pZCBTaGFkZXJfZGVzdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgU2tTaGFkZXIqIHNoYWRlcikKK3N0YXRpYyB2b2lkIFNoYWRlcl9kZXN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIFNrU2hhZGVyKiBzaGFkZXIsIFNraWFTaGFkZXIqIHNraWFTaGFkZXIpCiB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIGlmIChhbmRyb2lkOjp1aXJlbmRlcmVyOjpDYWNoZXM6Omhhc0luc3RhbmNlKCkpIHsKKyAgICAgICAgYW5kcm9pZDo6dWlyZW5kZXJlcjo6Q2FjaGVzOjpnZXRJbnN0YW5jZSgpLmdyYWRpZW50Q2FjaGUucmVtb3ZlKHNoYWRlcik7CisgICAgfQorI2VuZGlmCisgICAgZGVsZXRlIHNraWFTaGFkZXI7CiAgICAgc2hhZGVyLT5zYWZlVW5yZWYoKTsKIH0KIApAQCAtNTEsNyArNjcsOCBAQAogICAgIHJldHVybiBzaGFkZXIgPyBzaGFkZXItPmdldExvY2FsTWF0cml4KG1hdHJpeCkgOiBmYWxzZTsKIH0KICAKLXN0YXRpYyB2b2lkIFNoYWRlcl9zZXRMb2NhbE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCwgU2tTaGFkZXIqIHNoYWRlciwgY29uc3QgU2tNYXRyaXgqIG1hdHJpeCkKK3N0YXRpYyB2b2lkIFNoYWRlcl9zZXRMb2NhbE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLCBTa2lhU2hhZGVyKiBza2lhU2hhZGVyLAorICAgICAgICBjb25zdCBTa01hdHJpeCogbWF0cml4KQogewogICAgIGlmIChzaGFkZXIpIHsKICAgICAgICAgaWYgKE5VTEwgPT0gbWF0cml4KSB7CkBAIC02MCwyNCArNzcsNDAgQEAKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBzaGFkZXItPnNldExvY2FsTWF0cml4KCptYXRyaXgpOwogICAgICAgICB9CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICAgICBza2lhU2hhZGVyLT5zZXRNYXRyaXgoY29uc3RfY2FzdDxTa01hdHJpeCo+KG1hdHJpeCkpOworI2VuZGlmCiAgICAgfQogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgU2tTaGFkZXIqIEJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCwgY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwKK3N0YXRpYyBTa1NoYWRlciogQml0bWFwU2hhZGVyX2NvbnN0cnVjdG9yKEpOSUVudiogZW52LCBqb2JqZWN0IG8sIGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZU1vZGVYLCBpbnQgdGlsZU1vZGVZKQogewogICAgIFNrU2hhZGVyKiBzID0gU2tTaGFkZXI6OkNyZWF0ZUJpdG1hcFNoYWRlcigqYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTa1NoYWRlcjo6VGlsZU1vZGUpdGlsZU1vZGVYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTa1NoYWRlcjo6VGlsZU1vZGUpdGlsZU1vZGVZKTsKKwogICAgIFRocm93SUFFX0lmTnVsbChlbnYsIHMpOwogICAgIHJldHVybiBzOwogfQorCitzdGF0aWMgU2tpYVNoYWRlciogQml0bWFwU2hhZGVyX3Bvc3RDb25zdHJ1Y3RvcihKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBTa0JpdG1hcCogYml0bWFwLCBpbnQgdGlsZU1vZGVYLCBpbnQgdGlsZU1vZGVZKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNraWFTaGFkZXIqIHNraWFTaGFkZXIgPSBuZXcgU2tpYUJpdG1hcFNoYWRlcihiaXRtYXAsIHNoYWRlciwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGVYKSwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZVkpLAorICAgICAgICAgICAgTlVMTCwgKHNoYWRlci0+Z2V0RmxhZ3MoKSAmIFNrU2hhZGVyOjprT3BhcXVlQWxwaGFfRmxhZykgPT0gMCk7CisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CiAgICAgCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QsCitzdGF0aWMgU2tTaGFkZXIqIExpbmVhckdyYWRpZW50X2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50QXJyYXkgY29sb3JBcnJheSwgamZsb2F0QXJyYXkgcG9zQXJyYXksIGludCB0aWxlTW9kZSkKIHsKQEAgLTg1LDMxICsxMTgsOTUgQEAKICAgICBwdHNbMF0uc2V0KFNrRmxvYXRUb1NjYWxhcih4MCksIFNrRmxvYXRUb1NjYWxhcih5MCkpOwogICAgIHB0c1sxXS5zZXQoU2tGbG9hdFRvU2NhbGFyKHgxKSwgU2tGbG9hdFRvU2NhbGFyKHkxKSk7CiAKLSAgICBzaXplX3QgICAgICBjb3VudCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoY29sb3JBcnJheSk7CisgICAgc2l6ZV90IGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKICAgICBjb25zdCBqaW50KiBjb2xvclZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBOVUxMKTsKIAogICAgIFNrQXV0b1NUTWFsbG9jPDgsIFNrU2NhbGFyPiBzdG9yYWdlKHBvc0FycmF5ID8gY291bnQgOiAwKTsKICAgICBTa1NjYWxhciogICAgICAgICAgICAgICAgICAgcG9zID0gTlVMTDsKLSAgICAKKwogICAgIGlmIChwb3NBcnJheSkgewogICAgICAgICBBdXRvSmF2YUZsb2F0QXJyYXkgYXV0b1BvcyhlbnYsIHBvc0FycmF5LCBjb3VudCk7CiAgICAgICAgIGNvbnN0IGZsb2F0KiBwb3NWYWx1ZXMgPSBhdXRvUG9zLnB0cigpOwogICAgICAgICBwb3MgPSAoU2tTY2FsYXIqKXN0b3JhZ2UuZ2V0KCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBwb3NbaV0gPSBTa0Zsb2F0VG9TY2FsYXIocG9zVmFsdWVzW2ldKTsKKyAgICAgICAgfQogICAgIH0KLQorICAgIAogICAgIFNrU2hhZGVyKiBzaGFkZXIgPSBTa0dyYWRpZW50U2hhZGVyOjpDcmVhdGVMaW5lYXIocHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvclZhbHVlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNrU2hhZGVyOjpUaWxlTW9kZT4odGlsZU1vZGUpKTsKLSAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSV9BQk9SVCk7CisKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGNvbG9yQXJyYXksIGNvbnN0X2Nhc3Q8amludCo+KGNvbG9yVmFsdWVzKSwgSk5JX0FCT1JUKTsKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzaGFkZXIpOwogICAgIHJldHVybiBzaGFkZXI7CiB9CiAKLXN0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCwKK3N0YXRpYyBTa2lhU2hhZGVyKiBMaW5lYXJHcmFkaWVudF9wb3N0Q3JlYXRlMShKTklFbnYqIGVudiwgam9iamVjdCBvLCBTa1NoYWRlciogc2hhZGVyLAorICAgICAgICBmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwgamludEFycmF5IGNvbG9yQXJyYXksCisgICAgICAgIGpmbG9hdEFycmF5IHBvc0FycmF5LCBpbnQgdGlsZU1vZGUpIHsKKyNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCisgICAgc2l6ZV90IGNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChjb2xvckFycmF5KTsKKyAgICBjb25zdCBqaW50KiBjb2xvclZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhjb2xvckFycmF5LCBOVUxMKTsKKworICAgIGpmbG9hdCogc3RvcmVkQm91bmRzID0gbmV3IGpmbG9hdFs0XTsKKyAgICBzdG9yZWRCb3VuZHNbMF0gPSB4MDsgc3RvcmVkQm91bmRzWzFdID0geTA7CisgICAgc3RvcmVkQm91bmRzWzJdID0geDE7IHN0b3JlZEJvdW5kc1szXSA9IHkxOworICAgIGpmbG9hdCogc3RvcmVkUG9zaXRpb25zID0gbmV3IGpmbG9hdFtjb3VudF07CisgICAgdWludDMyX3QqIHN0b3JlZENvbG9ycyA9IG5ldyB1aW50MzJfdFtjb3VudF07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHN0b3JlZENvbG9yc1tpXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb2xvclZhbHVlc1tpXSk7CisgICAgfQorCisgICAgaWYgKHBvc0FycmF5KSB7CisgICAgICAgIEF1dG9KYXZhRmxvYXRBcnJheSBhdXRvUG9zKGVudiwgcG9zQXJyYXksIGNvdW50KTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHBvc1ZhbHVlcyA9IGF1dG9Qb3MucHRyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3RvcmVkUG9zaXRpb25zW2ldID0gcG9zVmFsdWVzW2ldOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcmVkUG9zaXRpb25zWzBdID0gMC4wZjsKKyAgICAgICAgc3RvcmVkUG9zaXRpb25zWzFdID0gMS4wZjsKKyAgICB9CisKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihzdG9yZWRCb3VuZHMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgY291bnQsIHNoYWRlciwgc3RhdGljX2Nhc3Q8U2tTaGFkZXI6OlRpbGVNb2RlPih0aWxlTW9kZSksIE5VTEwsCisgICAgICAgICAgICAoc2hhZGVyLT5nZXRGbGFncygpICYgU2tTaGFkZXI6OmtPcGFxdWVBbHBoYV9GbGFnKSA9PSAwKTsKKworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoY29sb3JBcnJheSwgY29uc3RfY2FzdDxqaW50Kj4oY29sb3JWYWx1ZXMpLCBKTklfQUJPUlQpOworICAgIHJldHVybiBza2lhU2hhZGVyOworI2Vsc2UKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCitzdGF0aWMgU2tpYVNoYWRlciogTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBmbG9hdCogc3RvcmVkQm91bmRzID0gbmV3IGZsb2F0WzRdOworICAgIHN0b3JlZEJvdW5kc1swXSA9IHgwOyBzdG9yZWRCb3VuZHNbMV0gPSB5MDsKKyAgICBzdG9yZWRCb3VuZHNbMl0gPSB4MTsgc3RvcmVkQm91bmRzWzNdID0geTE7CisKKyAgICBmbG9hdCogc3RvcmVkUG9zaXRpb25zID0gbmV3IGZsb2F0WzJdOworICAgIHN0b3JlZFBvc2l0aW9uc1swXSA9IDAuMGY7CisgICAgc3RvcmVkUG9zaXRpb25zWzFdID0gMS4wZjsKKworICAgIHVpbnQzMl90KiBzdG9yZWRDb2xvcnMgPSBuZXcgdWludDMyX3RbMl07CisgICAgc3RvcmVkQ29sb3JzWzBdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yMCk7CisgICAgc3RvcmVkQ29sb3JzWzFdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbG9yMSk7CisKKyAgICBTa2lhU2hhZGVyKiBza2lhU2hhZGVyID0gbmV3IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihzdG9yZWRCb3VuZHMsIHN0b3JlZENvbG9ycywKKyAgICAgICAgICAgIHN0b3JlZFBvc2l0aW9ucywgMiwgc2hhZGVyLCBzdGF0aWNfY2FzdDxTa1NoYWRlcjo6VGlsZU1vZGU+KHRpbGVNb2RlKSwgTlVMTCwKKyAgICAgICAgICAgIChzaGFkZXItPmdldEZsYWdzKCkgJiBTa1NoYWRlcjo6a09wYXF1ZUFscGhhX0ZsYWcpID09IDApOworCisgICAgcmV0dXJuIHNraWFTaGFkZXI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBTa1NoYWRlciogTGluZWFyR3JhZGllbnRfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcjAsIGludCBjb2xvcjEsIGludCB0aWxlTW9kZSkKIHsKQEAgLTEyMCw4ICsyMTcsOSBAQAogICAgIFNrQ29sb3IgY29sb3JzWzJdOwogICAgIGNvbG9yc1swXSA9IGNvbG9yMDsKICAgICBjb2xvcnNbMV0gPSBjb2xvcjE7Ci0KKyAgICAKICAgICBTa1NoYWRlciogcyA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwdHMsIGNvbG9ycywgTlVMTCwgMiwgKFNrU2hhZGVyOjpUaWxlTW9kZSl0aWxlTW9kZSk7CisKICAgICBUaHJvd0lBRV9JZk51bGwoZW52LCBzKTsKICAgICByZXR1cm4gczsKIH0KQEAgLTIyMiwxOCArMzIwLDQyIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBTa1NoYWRlciogQ29tcG9zZVNoYWRlcl9jcmVhdGUxKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKQorc3RhdGljIFNrU2hhZGVyKiBDb21wb3NlU2hhZGVyX2NyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywKKyAgICAgICAgU2tTaGFkZXIqIHNoYWRlckEsIFNrU2hhZGVyKiBzaGFkZXJCLCBTa1hmZXJtb2RlKiBtb2RlKQogewogICAgIHJldHVybiBuZXcgU2tDb21wb3NlU2hhZGVyKHNoYWRlckEsIHNoYWRlckIsIG1vZGUpOwogfQogCi1zdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrU2hhZGVyKiBzaGFkZXJBLCBTa1NoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIG1vZGUpCitzdGF0aWMgU2tTaGFkZXIqIENvbXBvc2VTaGFkZXJfY3JlYXRlMihKTklFbnYqIGVudiwgam9iamVjdCBvLAorICAgICAgICBTa1NoYWRlciogc2hhZGVyQSwgU2tTaGFkZXIqIHNoYWRlckIsIFNrUG9ydGVyRHVmZjo6TW9kZSBwb3J0ZXJEdWZmTW9kZSkKIHsKLSAgICBTa0F1dG9VbnJlZiBhdShTa1BvcnRlckR1ZmY6OkNyZWF0ZVhmZXJtb2RlKG1vZGUpKTsKKyAgICBTa0F1dG9VbnJlZiBhdShTa1BvcnRlckR1ZmY6OkNyZWF0ZVhmZXJtb2RlKHBvcnRlckR1ZmZNb2RlKSk7CisgICAgU2tYZmVybW9kZSogbW9kZSA9IChTa1hmZXJtb2RlKikgYXUuZ2V0KCk7CisgICAgcmV0dXJuIG5ldyBTa0NvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSk7Cit9CiAKLSAgICByZXR1cm4gbmV3IFNrQ29tcG9zZVNoYWRlcihzaGFkZXJBLCBzaGFkZXJCLCAoU2tYZmVybW9kZSopYXUuZ2V0KCkpOworc3RhdGljIFNraWFTaGFkZXIqIENvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTIoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tpYVNoYWRlciogc2hhZGVyQSwgU2tpYVNoYWRlciogc2hhZGVyQiwgU2tQb3J0ZXJEdWZmOjpNb2RlIHBvcnRlckR1ZmZNb2RlKSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSA9IFNrUG9ydGVyRHVmZjo6VG9YZmVybW9kZU1vZGUocG9ydGVyRHVmZk1vZGUpOworICAgIHJldHVybiBuZXcgU2tpYUNvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgbW9kZSwgc2hhZGVyKTsKKyNlbHNlCisgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKK30KKworc3RhdGljIFNraWFTaGFkZXIqIENvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTEoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgU2tTaGFkZXIqIHNoYWRlciwKKyAgICAgICAgU2tpYVNoYWRlciogc2hhZGVyQSwgU2tpYVNoYWRlciogc2hhZGVyQiwgU2tYZmVybW9kZSogbW9kZSkgeworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICBTa1hmZXJtb2RlOjpNb2RlIHNraWFNb2RlOworICAgIGlmICghU2tYZmVybW9kZTo6SXNNb2RlKG1vZGUsICZza2lhTW9kZSkpIHsKKyAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBvdGhlciBtb2RlcworICAgICAgICBza2lhTW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgfQorICAgIHJldHVybiBuZXcgU2tpYUNvbXBvc2VTaGFkZXIoc2hhZGVyQSwgc2hhZGVyQiwgc2tpYU1vZGUsIHNoYWRlcik7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0yNDQsMTggKzM2NiwyMSBAQAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnU2hhZGVyTWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZURlc3RydWN0b3IiLCAgICAgICAgIihJKVYiLCAgICAgKHZvaWQqKVNoYWRlcl9kZXN0cnVjdG9yICAgICAgICB9LAorICAgIHsgIm5hdGl2ZURlc3RydWN0b3IiLCAgICAgICAgIihJSSlWIiwgICAgKHZvaWQqKVNoYWRlcl9kZXN0cnVjdG9yICAgICAgICB9LAogICAgIHsgIm5hdGl2ZUdldExvY2FsTWF0cml4IiwgICAgIihJSSlaIiwgICAgKHZvaWQqKVNoYWRlcl9nZXRMb2NhbE1hdHJpeCAgICB9LAotICAgIHsgIm5hdGl2ZVNldExvY2FsTWF0cml4IiwgICAgIihJSSlWIiwgICAgKHZvaWQqKVNoYWRlcl9zZXRMb2NhbE1hdHJpeCAgICB9CisgICAgeyAibmF0aXZlU2V0TG9jYWxNYXRyaXgiLCAgICAiKElJSSlWIiwgICAodm9pZCopU2hhZGVyX3NldExvY2FsTWF0cml4ICAgIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0JpdG1hcFNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7ICJuYXRpdmVDcmVhdGUiLCAgICIoSUlJKUkiLCAgKHZvaWQqKUJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvciB9CisgICAgeyAibmF0aXZlQ3JlYXRlIiwgICAgICIoSUlJKUkiLCAgKHZvaWQqKUJpdG1hcFNoYWRlcl9jb25zdHJ1Y3RvciB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUiLCAiKElJSUkpSSIsICh2b2lkKilCaXRtYXBTaGFkZXJfcG9zdENvbnN0cnVjdG9yIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ0xpbmVhckdyYWRpZW50TWV0aG9kc1tdID0gewotICAgIHsgIm5hdGl2ZUNyZWF0ZTEiLCAgIihGRkZGW0lbRkkpSSIsICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUxICAgfSwKLSAgICB7ICJuYXRpdmVDcmVhdGUyIiwgICIoRkZGRklJSSlJIiwgICAodm9pZCopTGluZWFyR3JhZGllbnRfY3JlYXRlMiAgIH0KKyAgICB7ICJuYXRpdmVDcmVhdGUxIiwgICAgICIoRkZGRltJW0ZJKUkiLCAgKHZvaWQqKUxpbmVhckdyYWRpZW50X2NyZWF0ZTEgICAgIH0sCisgICAgeyAibmF0aXZlQ3JlYXRlMiIsICAgICAiKEZGRkZJSUkpSSIsICAgICh2b2lkKilMaW5lYXJHcmFkaWVudF9jcmVhdGUyICAgICB9LAorICAgIHsgIm5hdGl2ZVBvc3RDcmVhdGUxIiwgIihJRkZGRltJW0ZJKUkiLCAodm9pZCopTGluZWFyR3JhZGllbnRfcG9zdENyZWF0ZTEgfSwKKyAgICB7ICJuYXRpdmVQb3N0Q3JlYXRlMiIsICIoSUZGRkZJSUkpSSIsICAgKHZvaWQqKUxpbmVhckdyYWRpZW50X3Bvc3RDcmVhdGUyIH0KIH07CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ1JhZGlhbEdyYWRpZW50TWV0aG9kc1tdID0gewpAQCAtMjY5LDggKzM5NCwxMCBAQAogfTsKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnQ29tcG9zZVNoYWRlck1ldGhvZHNbXSA9IHsKLSAgICB7Im5hdGl2ZUNyZWF0ZTEiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTEgfSwKLSAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgIihJSUkpSSIsICAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgfQorICAgIHsibmF0aXZlQ3JlYXRlMSIsICAgICAgIihJSUkpSSIsICAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfY3JlYXRlMSAgICAgfSwKKyAgICB7Im5hdGl2ZUNyZWF0ZTIiLCAgICAgICIoSUlJKUkiLCAgICh2b2lkKilDb21wb3NlU2hhZGVyX2NyZWF0ZTIgICAgIH0sCisgICAgeyJuYXRpdmVQb3N0Q3JlYXRlMSIsICAiKElJSUkpSSIsICAodm9pZCopQ29tcG9zZVNoYWRlcl9wb3N0Q3JlYXRlMSB9LAorICAgIHsibmF0aXZlUG9zdENyZWF0ZTIiLCAgIihJSUlJKUkiLCAgKHZvaWQqKUNvbXBvc2VTaGFkZXJfcG9zdENyZWF0ZTIgfQogfTsKIAogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZTFmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVGV4dExheW91dC5oIgorCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisKKyNpbmNsdWRlICJTa1RlbXBsYXRlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWJpZGkuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzaGFwZS5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBtaWdodCBuZWVkIGxheW91dC4gIElmIGJpZGlGbGFncyBmb3JjZSBMVFIsIGFzc3VtZSBubyBsYXlvdXQsIGlmCisvLyBiaWRpRmxhZ3MgaW5kaWNhdGUgdGhlcmUgcHJvYmFibHkgaXMgUlRMLCBhc3N1bWUgd2UgZG8sIG90aGVyd2lzZSBzY2FuIHRoZSB0ZXh0CisvLyBsb29raW5nIGZvciBhIGNoYXJhY3RlciA+PSB0aGUgZmlyc3QgUlRMIGNoYXJhY3RlciBpbiB1bmljb2RlIGFuZCBhc3N1bWUgd2UgZG8gaWYKKy8vIHdlIGZpbmQgb25lLgorYm9vbCBUZXh0TGF5b3V0OjpuZWVkc0xheW91dChjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgYmlkaUZsYWdzKSB7CisgICAgaWYgKGJpZGlGbGFncyA9PSBrQmlkaV9Gb3JjZV9MVFIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKGJpZGlGbGFncyA9PSBrQmlkaV9SVEwpIHx8IChiaWRpRmxhZ3MgPT0ga0JpZGlfRGVmYXVsdF9SVEwpIHx8CisgICAgICAgICAgICBiaWRpRmxhZ3MgPT0ga0JpZGlfRm9yY2VfUlRMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIGlmICh0ZXh0W2ldID49IDB4MDU5MCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIENoYXJhY3Rlci1iYXNlZCBBcmFiaWMgc2hhcGluZy4KKyAqCisgKiBXZSdsbCB1c2UgaGFyZmJ1enogYW5kIGdseXBoLWJhc2VkIHNoYXBpbmcgaW5zdGVhZCBvbmNlIHdlJ3JlIHNldCB1cCBmb3IgaXQuCisgKgorICogQGNvbnRleHQgdGhlIHRleHQgY29udGV4dAorICogQHN0YXJ0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZW5kZXIKKyAqIEBjb3VudCB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIHJlbmRlciwgc3RhcnQgKyBjb3VudCAgbXVzdCBiZSA8PSBjb250ZXh0Q291bnQKKyAqIEBjb250ZXh0Q291bnQgdGhlIGxlbmd0aCBvZiB0aGUgY29udGV4dAorICogQHNoYXBlZCB3aGVyZSB0byBwdXQgdGhlIHNoYXBlZCB0ZXh0LCBtdXN0IGhhdmUgY2FwYWNpdHkgZm9yIGNvdW50IHVjaGFycworICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzaGFwZWQgdGV4dCwgb3IgLTEgaWYgZXJyb3IKKyAqLworaW50IFRleHRMYXlvdXQ6OnNoYXBlUnRsVGV4dChjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplIGNvdW50LCBqc2l6ZSBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBqY2hhciogc2hhcGVkLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBqY2hhciBidWZmZXJbY29udGV4dENvdW50XTsKKworICAgIC8vIFVzZSBmaXhlZCBsZW5ndGggc2luY2Ugd2UgbmVlZCB0byBrZWVwIHN0YXJ0IGFuZCBjb3VudCB2YWxpZAorICAgIHVfc2hhcGVBcmFiaWMoY29udGV4dCwgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKworICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAvLyB0cmltIG91dCAweGZmZmYgZm9sbG93aW5nIGxpZ2F0dXJlcywgaWYgYW55CisgICAgICAgIGludCBlbmQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW2ldICE9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltlbmQrK10gPSBidWZmZXJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSBlbmQ7CisgICAgICAgIC8vIExPRyhMT0dfSU5GTywgIkNTUlRMIiwgInN0YXJ0ICVkIGNvdW50ICVkIGNjb3VudCAlZFxuIiwgc3RhcnQsIGNvdW50LCBjb250ZXh0Q291bnQpOworICAgICAgICB1YmlkaV93cml0ZVJldmVyc2UoYnVmZmVyLCBjb3VudCwgc2hhcGVkLCBjb3VudCwgVUJJRElfRE9fTUlSUk9SSU5HIHwgVUJJRElfT1VUUFVUX1JFVkVSU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVUJJRElfS0VFUF9CQVNFX0NPTUJJTklORywgJnN0YXR1cyk7CisgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvKioKKyAqIEJhc2ljIGNoYXJhY3Rlci1iYXNlZCBsYXlvdXQgc3VwcG9ydGluZyBydGwgYW5kIGFyYWJpYyBzaGFwaW5nLgorICogUnVucyBiaWRpIG9uIHRoZSB0ZXh0IGFuZCBnZW5lcmF0ZXMgYSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lIGluIGJ1ZmZlciwgcmV0dXJuaW5nCisgKiB0aGUgbGVuZ3RoLgorICogQHRleHQgdGhlIHRleHQKKyAqIEBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB1Y2hhcnMKKyAqIEBkaXIgcmVjZWl2ZXMgdGhlIHJlc29sdmVkIHBhcmFncmFwaCBkaXJlY3Rpb24KKyAqIEBidWZmZXIgdGhlIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lLiAgTXVzdCBoYXZlIGNhcGFjaXR5IG9mCisgKiBhdCBsZWFzdCBsZW4gamNoYXJzLgorICogQGZsYWdzIGxpbmUgYmlkaSBmbGFncworICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZW9yZGVyZWQsIHNoYXBlZCBsaW5lLCBvciAtMSBpZiBlcnJvcgorICovCitqaW50IFRleHRMYXlvdXQ6OmxheW91dExpbmUoY29uc3QgamNoYXIqIHRleHQsIGppbnQgbGVuLCBqaW50IGZsYWdzLCBpbnQgJmRpciwgamNoYXIqIGJ1ZmZlciwKKyAgICAgICAgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgICAgc3RhdGljIGNvbnN0IGludCBSVExfT1BUUyA9IFVCSURJX0RPX01JUlJPUklORyB8IFVCSURJX0tFRVBfQkFTRV9DT01CSU5JTkcgfAorICAgICAgICAgICAgVUJJRElfUkVNT1ZFX0JJRElfQ09OVFJPTFMgfCBVQklESV9PVVRQVVRfUkVWRVJTRTsKKworICAgIFVCaURpTGV2ZWwgYmlkaVJlcSA9IDA7CisgICAgc3dpdGNoIChmbGFncykgeworICAgIGNhc2Uga0JpZGlfTFRSOiBiaWRpUmVxID0gMDsgYnJlYWs7IC8vIG5vIElDVSBjb25zdGFudCwgY2Fub25pY2FsIExUUiBsZXZlbAorICAgIGNhc2Uga0JpZGlfUlRMOiBiaWRpUmVxID0gMTsgYnJlYWs7IC8vIG5vIElDVSBjb25zdGFudCwgY2Fub25pY2FsIFJUTCBsZXZlbAorICAgIGNhc2Uga0JpZGlfRGVmYXVsdF9MVFI6IGJpZGlSZXEgPSBVQklESV9ERUZBVUxUX0xUUjsgYnJlYWs7CisgICAgY2FzZSBrQmlkaV9EZWZhdWx0X1JUTDogYmlkaVJlcSA9IFVCSURJX0RFRkFVTFRfUlRMOyBicmVhazsKKyAgICBjYXNlIGtCaWRpX0ZvcmNlX0xUUjogbWVtY3B5KGJ1ZmZlciwgdGV4dCwgbGVuICogc2l6ZW9mKGpjaGFyKSk7IHJldHVybiBsZW47CisgICAgY2FzZSBrQmlkaV9Gb3JjZV9SVEw6IHJldHVybiBzaGFwZVJ0bFRleHQodGV4dCwgMCwgbGVuLCBsZW4sIGJ1ZmZlciwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc3VsdCA9IC0xOworCisgICAgVUJpRGkqIGJpZGkgPSB1YmlkaV9vcGVuKCk7CisgICAgaWYgKGJpZGkpIHsKKyAgICAgICAgdWJpZGlfc2V0UGFyYShiaWRpLCB0ZXh0LCBsZW4sIGJpZGlSZXEsIE5VTEwsICZzdGF0dXMpOworICAgICAgICBpZiAoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIGRpciA9IHViaWRpX2dldFBhcmFMZXZlbChiaWRpKSAmIDB4MTsgLy8gMCBpZiBsdHIsIDEgaWYgcnRsCisKKyAgICAgICAgICAgIGludCByYyA9IHViaWRpX2NvdW50UnVucyhiaWRpLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIC8vIExPRyhMT0dfSU5GTywgIkxBWU9VVCIsICJwYXJhIGJpZGlSZXE9JWQgZGlyPSVkIHJjPSVkXG4iLCBiaWRpUmVxLCBkaXIsIHJjKTsKKworICAgICAgICAgICAgICAgIGludDMyX3Qgc2xlbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBVQmlEaURpcmVjdGlvbiBydW5EaXIgPSB1YmlkaV9nZXRWaXN1YWxSdW4oYmlkaSwgaSwgJnN0YXJ0LCAmbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnVuRGlyID09IFVCSURJX1JUTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBzaGFwZVJ0bFRleHQodGV4dCArIHN0YXJ0LCAwLCBsZW5ndGgsIGxlbmd0aCwgYnVmZmVyICsgc2xlbiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIgKyBzbGVuLCB0ZXh0ICsgc3RhcnQsIGxlbmd0aCAqIHNpemVvZihqY2hhcikpOworICAgICAgICAgICAgICAgICAgICAgICAgc2xlbiArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHViaWRpX2Nsb3NlKGJpZGkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgVGV4dExheW91dDo6cHJlcGFyZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sIGppbnQgYmlkaUZsYWdzLAorICAgICAgICBjb25zdCBqY2hhcioqIG91dFRleHQsIGludDMyX3QqIG91dEJ5dGVzLCBqY2hhcioqIG91dEJ1ZmZlcikgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dCA9IHRleHQ7CisgICAgamNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgaW50IGRpciA9IGtEaXJlY3Rpb25fTFRSOworICAgIGlmIChuZWVkc0xheW91dCh0ZXh0LCBsZW4sIGJpZGlGbGFncykpIHsKKyAgICAgICAgYnVmZmVyID0oamNoYXIgKikgbWFsbG9jKGxlbiAqIHNpemVvZihqY2hhcikpOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBsZW4gPSBsYXlvdXRMaW5lKHRleHQsIGxlbiwgYmlkaUZsYWdzLCBkaXIsIGJ1ZmZlciwgc3RhdHVzKTsgLy8gbWlnaHQgY2hhbmdlIGxlbiwgZGlyCisgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgIkxBWU9VVCIsICJkcmF3VGV4dCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuJ3QgcmVuZGVyCisgICAgICAgIH0KKworICAgICAgICB3b3JrVGV4dCA9IGJ1ZmZlcjsgLy8gdXNlIHRoZSBzaGFwZWQgdGV4dAorICAgIH0KKworICAgIGJvb2wgdHJpbUxlZnQgPSBmYWxzZTsKKyAgICBib29sIHRyaW1SaWdodCA9IGZhbHNlOworCisgICAgU2tQYWludDo6QWxpZ24gaG9yaXogPSBwYWludC0+Z2V0VGV4dEFsaWduKCk7CisgICAgc3dpdGNoIChob3JpeikgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtMZWZ0X0FsaWduOiB0cmltTGVmdCA9IGRpciAmIGtEaXJlY3Rpb25fTWFzazsgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYWludDo6a0NlbnRlcl9BbGlnbjogdHJpbUxlZnQgPSB0cmltUmlnaHQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246IHRyaW1SaWdodCA9ICEoZGlyICYga0RpcmVjdGlvbl9NYXNrKTsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICAgIGNvbnN0IGpjaGFyKiB3b3JrTGltaXQgPSB3b3JrVGV4dCArIGxlbjsKKworICAgIGlmICh0cmltTGVmdCkgeworICAgICAgICB3aGlsZSAod29ya1RleHQgPCB3b3JrTGltaXQgJiYgKndvcmtUZXh0ID09ICcgJykgeworICAgICAgICAgICAgKyt3b3JrVGV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodHJpbVJpZ2h0KSB7CisgICAgICAgIHdoaWxlICh3b3JrTGltaXQgPiB3b3JrVGV4dCAmJiAqKHdvcmtMaW1pdCAtIDEpID09ICcgJykgeworICAgICAgICAgICAgLS13b3JrTGltaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0Qnl0ZXMgPSAod29ya0xpbWl0IC0gd29ya1RleHQpIDw8IDE7CisgICAgKm91dFRleHQgPSB3b3JrVGV4dDsKKyAgICAqb3V0QnVmZmVyID0gYnVmZmVyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIERyYXdzIG9yIGdldHMgdGhlIHBhdGggb2YgYSBwYXJhZ3JhcGggb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBydW5uaW5nIGJpZGkgYW5kIHNoYXBpbmcuCisvLyBUaGlzIHdpbGwgZHJhdyBpZiBjYW52YXMgaXMgbm90IG51bGwsIG90aGVyd2lzZSBwYXRoIG11c3QgYmUgbm9uLW51bGwgYW5kIGl0IHdpbGwgY3JlYXRlCisvLyBhIHBhdGggcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRoYXQgd291bGQgaGF2ZSBiZWVuIGRyYXduLgordm9pZCBUZXh0TGF5b3V0OjpoYW5kbGVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksU2tDYW52YXMgKmNhbnZhcywgU2tQYXRoICpwYXRoKSB7CisgICAgY29uc3QgamNoYXIgKndvcmtUZXh0OworICAgIGpjaGFyICpidWZmZXIgPSBOVUxMOworICAgIGludDMyX3Qgd29ya0J5dGVzOworICAgIGlmIChwcmVwYXJlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsICZ3b3JrVGV4dCwgJndvcmtCeXRlcywgJmJ1ZmZlcikpIHsKKyAgICAgICAgU2tTY2FsYXIgeF8gPSBTa0Zsb2F0VG9TY2FsYXIoeCk7CisgICAgICAgIFNrU2NhbGFyIHlfID0gU2tGbG9hdFRvU2NhbGFyKHkpOworICAgICAgICBpZiAoY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KHdvcmtUZXh0LCB3b3JrQnl0ZXMsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhaW50LT5nZXRUZXh0UGF0aCh3b3JrVGV4dCwgd29ya0J5dGVzLCB4XywgeV8sIHBhdGgpOworICAgICAgICB9CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICB9Cit9CisKK2Jvb2wgVGV4dExheW91dDo6cHJlcGFyZVJ0bFRleHRSdW4oY29uc3QgamNoYXIqIGNvbnRleHQsIGpzaXplIHN0YXJ0LCBqc2l6ZSYgY291bnQsCisgICAgICAgIGpzaXplIGNvbnRleHRDb3VudCwgamNoYXIqIHNoYXBlZCkgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGNvdW50ID0gc2hhcGVSdGxUZXh0KGNvbnRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQsIHN0YXR1cyk7CisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhMT0dfV0FSTiwgIkxBWU9VVCIsICJkcmF3VGV4dFJ1biBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0UnVuKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgIFNrU2NhbGFyIHhfID0gU2tGbG9hdFRvU2NhbGFyKHgpOworICAgICBTa1NjYWxhciB5XyA9IFNrRmxvYXRUb1NjYWxhcih5KTsKKworICAgICB1aW50OF90IHJ0bCA9IGRpckZsYWdzICYgMHgxOworICAgICBpZiAocnRsKSB7CisgICAgICAgICBTa0F1dG9TVE1hbGxvYzw4MCwgamNoYXI+IGJ1ZmZlcihjb250ZXh0Q291bnQpOworICAgICAgICAgaWYgKHByZXBhcmVSdGxUZXh0UnVuKGNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgYnVmZmVyLmdldCgpKSkgeworICAgICAgICAgICAgIGNhbnZhcy0+ZHJhd1RleHQoYnVmZmVyLmdldCgpLCBjb3VudCA8PCAxLCB4XywgeV8sICpwYWludCk7CisgICAgICAgICB9CisgICAgIH0gZWxzZSB7CisgICAgICAgICBjYW52YXMtPmRyYXdUZXh0KGNoYXJzICsgc3RhcnQsIGNvdW50IDw8IDEsIHhfLCB5XywgKnBhaW50KTsKKyAgICAgfQorIH0KKwordm9pZCBUZXh0TGF5b3V0OjpnZXRUZXh0UnVuQWR2YW5jZXMoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICpjaGFycywgamludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGRpckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZsb2F0ICpyZXN1bHRBZHZhbmNlcywgamZsb2F0ICZyZXN1bHRUb3RhbEFkdmFuY2UpIHsKKyAgICBqY2hhciBidWZmZXJbY29udGV4dENvdW50XTsKKworICAgIFNrU2NhbGFyKiBzY2FsYXJBcnJheSA9IChTa1NjYWxhciAqKXJlc3VsdEFkdmFuY2VzOworICAgIHJlc3VsdFRvdGFsQWR2YW5jZSA9IDA7CisKKyAgICAvLyB0aGlzIGlzIHdoZXJlIHdlJ2QgY2FsbCBoYXJmYnV6egorICAgIC8vIGZvciBub3cgd2UganVzdCB1c2UgdXNoYXBlLmMKKworICAgIGludCB3aWR0aHM7CisgICAgY29uc3QgamNoYXIqIHRleHQ7CisgICAgaWYgKGRpckZsYWdzICYgMHgxKSB7IC8vIHJ0bCwgY2FsbCBhcmFiaWMgc2hhcGluZyBpbiBjYXNlCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAvLyBVc2UgZml4ZWQgbGVuZ3RoIHNpbmNlIHdlIG5lZWQgdG8ga2VlcCBzdGFydCBhbmQgY291bnQgdmFsaWQKKyAgICAgICAgdV9zaGFwZUFyYWJpYyhjaGFycywgY29udGV4dENvdW50LCBidWZmZXIsIGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX0xFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICAgICAgICAgICAgVV9TSEFQRV9URVhUX0RJUkVDVElPTl9MT0dJQ0FMIHwgVV9TSEFQRV9MRVRURVJTX1NIQVBFIHwKKyAgICAgICAgICAgICAgICAgICAgICBVX1NIQVBFX1hfTEFNQUxFRl9TVUJfQUxURVJOQVRFLCAmc3RhdHVzKTsKKyAgICAgICAgLy8gd2Ugc2hvdWxkbid0IGZhaWwgdW5sZXNzIHRoZXJlJ3MgYW4gb3V0IG9mIG1lbW9yeSBjb25kaXRpb24sCisgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UncmUgaG9zZWQgYW55d2F5CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7ICsraSkgeworICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgICAgICBidWZmZXJbaV0gPSAweDIwMGI7IC8vIHplcm8td2lkdGgtc3BhY2UgZm9yIHNraWEKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGV4dCA9IGJ1ZmZlciArIHN0YXJ0OworICAgICAgICB3aWR0aHMgPSBwYWludC0+Z2V0VGV4dFdpZHRocyh0ZXh0LCBjb3VudCA8PCAxLCBzY2FsYXJBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dCA9IGNoYXJzICsgc3RhcnQ7CisgICAgICAgIHdpZHRocyA9IHBhaW50LT5nZXRUZXh0V2lkdGhzKHRleHQsIGNvdW50IDw8IDEsIHNjYWxhckFycmF5KTsKKyAgICB9CisKKyAgICBpZiAod2lkdGhzIDwgY291bnQpIHsKKyAgICAgICAgLy8gU2tpYSBvcGVyYXRlcyBvbiBjb2RlIHBvaW50cywgbm90IGNvZGUgdW5pdHMsIHNvIHN1cnJvZ2F0ZSBwYWlycyByZXR1cm4gb25seQorICAgICAgICAvLyBvbmUgdmFsdWUuIEV4cGFuZCB0aGUgcmVzdWx0IHNvIHdlIGhhdmUgb25lIHZhbHVlIHBlciBVVEYtMTYgY29kZSB1bml0LgorCisgICAgICAgIC8vIE5vdGUsIHNraWEncyBnZXRUZXh0V2lkdGggZ2V0cyBjb25mdXNlZCBpZiBpdCBlbmNvdW50ZXJzIGEgc3Vycm9nYXRlIHBhaXIsCisgICAgICAgIC8vIGxlYXZpbmcgdGhlIHJlbWFpbmluZyB3aWR0aHMgemVyby4gIE5vdCBuaWNlLgorICAgICAgICBmb3IgKGludCBpID0gMCwgcCA9IDA7IGkgPCB3aWR0aHM7ICsraSkgeworICAgICAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlICs9IHJlc3VsdEFkdmFuY2VzW3ArK10gPSBTa1NjYWxhclRvRmxvYXQoc2NhbGFyQXJyYXlbaV0pOworICAgICAgICAgICAgaWYgKHAgPCBjb3VudCAmJiB0ZXh0W3BdID49IDB4ZGMwMCAmJiB0ZXh0W3BdIDwgMHhlMDAwICYmCisgICAgICAgICAgICAgICAgICAgIHRleHRbcC0xXSA+PSAweGQ4MDAgJiYgdGV4dFtwLTFdIDwgMHhkYzAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0QWR2YW5jZXNbcCsrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFRvdGFsQWR2YW5jZSArPSByZXN1bHRBZHZhbmNlc1tpXSA9IFNrU2NhbGFyVG9GbG9hdChzY2FsYXJBcnJheVtpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLy8gRHJhd3MgYSBwYXJhZ3JhcGggb2YgdGV4dCBvbiBhIHNpbmdsZSBsaW5lLCBydW5uaW5nIGJpZGkgYW5kIHNoYXBpbmcKK3ZvaWQgVGV4dExheW91dDo6ZHJhd1RleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWRpRmxhZ3MsIGpmbG9hdCB4LCBqZmxvYXQgeSwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgaGFuZGxlVGV4dChwYWludCwgdGV4dCwgbGVuLCBiaWRpRmxhZ3MsIHgsIHksIGNhbnZhcywgTlVMTCk7Cit9CisKK3ZvaWQgVGV4dExheW91dDo6Z2V0VGV4dFBhdGgoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyICp0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCkgeworICAgIGhhbmRsZVRleHQocGFpbnQsIHRleHQsIGxlbiwgYmlkaUZsYWdzLCB4LCB5LCBOVUxMLCBwYXRoKTsKK30KKworCit2b2lkIFRleHRMYXlvdXQ6OmRyYXdUZXh0T25QYXRoKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogdGV4dCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogcGF0aCwgU2tDYW52YXMqIGNhbnZhcykgeworCisgICAgU2tTY2FsYXIgaF8gPSBTa0Zsb2F0VG9TY2FsYXIoaE9mZnNldCk7CisgICAgU2tTY2FsYXIgdl8gPSBTa0Zsb2F0VG9TY2FsYXIodk9mZnNldCk7CisKKyAgICBpZiAoIW5lZWRzTGF5b3V0KHRleHQsIGNvdW50LCBiaWRpRmxhZ3MpKSB7CisgICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVih0ZXh0LCBjb3VudCA8PCAxLCAqcGF0aCwgaF8sIHZfLCAqcGFpbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY291bnQpOworICAgIGludCBkaXIgPSBrRGlyZWN0aW9uX0xUUjsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjb3VudCA9IGxheW91dExpbmUodGV4dCwgY291bnQsIGJpZGlGbGFncywgZGlyLCBidWZmZXIuZ2V0KCksIHN0YXR1cyk7CisgICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CisgICAgICAgIGNhbnZhcy0+ZHJhd1RleHRPblBhdGhIVihidWZmZXIuZ2V0KCksIGNvdW50IDw8IDEsICpwYXRoLCBoXywgdl8sICpwYWludCk7CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaCBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImpuaS5oIgorCisjaW5jbHVkZSAiU2tDYW52YXMuaCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUZXh0TGF5b3V0IHsKK3B1YmxpYzoKKworICAgIGVudW0geworICAgICAgICBrRGlyZWN0aW9uX0xUUiA9IDAsCisgICAgICAgIGtEaXJlY3Rpb25fUlRMID0gMSwKKworICAgICAgICBrRGlyZWN0aW9uX01hc2sgPSAweDEKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtCaWRpX0xUUiA9IDAsCisgICAgICAgIGtCaWRpX1JUTCA9IDEsCisgICAgICAgIGtCaWRpX0RlZmF1bHRfTFRSID0gMiwKKyAgICAgICAga0JpZGlfRGVmYXVsdF9SVEwgPSAzLAorICAgICAgICBrQmlkaV9Gb3JjZV9MVFIgPSA0LAorICAgICAgICBrQmlkaV9Gb3JjZV9SVEwgPSA1LAorCisgICAgICAgIGtCaWRpX01hc2sgPSAweDcKKyAgICB9OworCisgICAgLyoKKyAgICAgKiBEcmF3cyBhIHVuaWRpcmVjdGlvbmFsIHJ1biBvZiB0ZXh0LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRyYXdUZXh0UnVuKFNrUGFpbnQqIHBhaW50LCBjb25zdCBqY2hhciogY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBzdGFydCwgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpckZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrQ2FudmFzKiBjYW52YXMpOworCisgICAgc3RhdGljIHZvaWQgZ2V0VGV4dFJ1bkFkdmFuY2VzKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqY2hhcnMsIGppbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqaW50IGRpckZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQgKnJlc3VsdEFkdmFuY2VzLCBqZmxvYXQgJnJlc3VsdFRvdGFsQWR2YW5jZSk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGJpZGlGbGFncywgamZsb2F0IHgsIGpmbG9hdCB5LCBTa0NhbnZhcyogY2FudmFzKTsKKworICAgIHN0YXRpYyB2b2lkIGdldFRleHRQYXRoKFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciAqdGV4dCwganNpemUgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksIFNrUGF0aCAqcGF0aCk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dE9uUGF0aChTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIHRleHQsIGpzaXplIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgaE9mZnNldCwgamZsb2F0IHZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tQYXRoKiBwYXRoLCBTa0NhbnZhcyogY2FudmFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIHN0YXRpYyBib29sIHByZXBhcmVUZXh0KFNrUGFpbnQgKnBhaW50LCBjb25zdCBqY2hhciogdGV4dCwganNpemUgbGVuLCBqaW50IGJpZGlGbGFncywKKyAgICAgICAgY29uc3QgamNoYXIqKiBvdXRUZXh0LCBpbnQzMl90KiBvdXRCeXRlcywgamNoYXIqKiBvdXRCdWZmZXIpOworICAgIHN0YXRpYyBib29sIHByZXBhcmVSdGxUZXh0UnVuKGNvbnN0IGpjaGFyKiBjb250ZXh0LCBqc2l6ZSBzdGFydCwganNpemUmIGNvdW50LAorICAgICAgICBqc2l6ZSBjb250ZXh0Q291bnQsIGpjaGFyKiBzaGFwZWQpOworICAgICAgICAKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBuZWVkc0xheW91dChjb25zdCBqY2hhciogdGV4dCwgamludCBsZW4sIGppbnQgYmlkaUZsYWdzKTsKKyAgICBzdGF0aWMgaW50IHNoYXBlUnRsVGV4dChjb25zdCBqY2hhciogY29udGV4dCwganNpemUgc3RhcnQsIGpzaXplIGNvdW50LCBqc2l6ZSBjb250ZXh0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamNoYXIqIHNoYXBlZCwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgICBzdGF0aWMgamludCBsYXlvdXRMaW5lKGNvbnN0IGpjaGFyKiB0ZXh0LCBqaW50IGxlbiwgamludCBmbGFncywgaW50ICZkaXIsIGpjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICZzdGF0dXMpOworICAgIHN0YXRpYyB2b2lkIGhhbmRsZVRleHQoU2tQYWludCAqcGFpbnQsIGNvbnN0IGpjaGFyKiB0ZXh0LCBqc2l6ZSBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlkaUZsYWdzLCBqZmxvYXQgeCwgamZsb2F0IHksU2tDYW52YXMgKmNhbnZhcywgU2tQYXRoICpwYXRoKTsKK307CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVHlwZWZhY2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKaW5kZXggN2M3YmZlYi4uMWZlNzJlNiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UeXBlZmFjZS5jcHAKQEAgLTEzMCw3ICsxMzAsMTMgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIAotICAgIHJldHVybiBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKG5ldyBBc3NldFN0cmVhbShhc3NldCwgdHJ1ZSkpOworICAgIFNrU3RyZWFtKiBzdHJlYW0gPSBuZXcgQXNzZXRTdHJlYW0oYXNzZXQsIHRydWUpOworICAgIFNrVHlwZWZhY2UqIGZhY2UgPSBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKHN0cmVhbSk7CisgICAgLy8gU2tUeXBlRmFjZTo6Q3JlYXRlRnJvbVN0cmVhbSBjYWxscyByZWYoKSBvbiB0aGUgc3RyZWFtLCBzbyB3ZQorICAgIC8vIG5lZWQgdG8gdW5yZWYgaXQgaGVyZSBvciBpdCB3b24ndCBiZSBmcmVlZCBsYXRlciBvbgorICAgIHN0cmVhbS0+dW5yZWYoKTsKKworICAgIHJldHVybiBmYWNlOwogfQogCiBzdGF0aWMgU2tUeXBlZmFjZSogVHlwZWZhY2VfY3JlYXRlRnJvbUZpbGUoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpzdHJpbmcganBhdGgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9TY29Tb2NrZXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGU0NDA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgImJsdWV0b290aF9TY29Tb2NrZXQuY3BwIgotCi0jaW5jbHVkZSAiYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCi0jaW5jbHVkZSAiSk5JSGVscC5oIgotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgInV0aWxzL21pc2MuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgotCi0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLSNpbmNsdWRlIDxibHVldG9vdGgvYmx1ZXRvb3RoLmg+Ci0jaW5jbHVkZSA8Ymx1ZXRvb3RoL3Njby5oPgotI2luY2x1ZGUgPGJsdWV0b290aC9oY2kuaD4KLQotI2RlZmluZSBNQVhfTElORSAyNTUKLQotLyoKLSAqIERlZmluZXMgdGhlIG1vZHVsZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGJsYWNrbGlzdCBmaWxlLgotICogVGhlc2UgYXJlIHVzZWQgYnkgY29uc3VtZXJzIG9mIHRoZSBibGFja2xpc3QgZmlsZSB0byBzZWUgaWYgdGhlIGxpbmUgaXMKLSAqIHVzZWQgYnkgdGhhdCBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgU0NPX0JMQUNLTElTVF9NT0RVTEVfTkFNRSAic2NvU29ja2V0IgotCi0KLS8qIERlZmluZSB0aGUgdHlwZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGJsYWNrbGlzdCBmaWxlLiAqLwotI2RlZmluZSBCTEFDS0xJU1RfQllfTkFNRSAibmFtZSIKLSNkZWZpbmUgQkxBQ0tMSVNUX0JZX1BBUlRJQUxfTkFNRSAicGFydGlhbF9uYW1lIgotI2RlZmluZSBCTEFDS0xJU1RfQllfT1VJICJ2ZW5kb3Jfb3VpIgotCi0jZW5kaWYKLQotLyogSWRlYWxseSwgYmxvY2tpbmcgSS9PIG9uIGEgU0NPIHNvY2tldCB3b3VsZCByZXR1cm4gd2hlbiBhbm90aGVyIHRocmVhZAotICogY2FsbHMgY2xvc2UoKS4gSG93ZXZlciBpdCBkb2VzIG5vdCByaWdodCBub3csIGluIGZhY3QgY2xvc2UoKSBvbiBhIFNDTwotICogc29ja2V0IGhhcyBzdHJhbmdlIGJlaGF2aW9yIChyZXR1cm5zIGEgYm9ndXMgdmFsdWUpIHdoZW4gb3RoZXIgdGhyZWFkcwotICogYXJlIHBlcmZvcm1pbmcgYmxvY2tpbmcgSS9PIG9uIHRoYXQgc29ja2V0LiBTbywgdG8gd29ya2Fyb3VuZCwgd2UgYWx3YXlzCi0gKiBjYWxsIGNsb3NlKCkgZnJvbSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBkb2VzIGJsb2NraW5nIEkvTy4gVGhpcyByZXF1aXJlcyB0aGUKLSAqIHVzZSBvZiBhIHNvY2tldHBhaXIgdG8gc2lnbmFsIHRoZSBibG9ja2luZyBJL08gdG8gYWJvcnQuCi0gKgotICogVW5mb3J0dW5hdGVseSBJIGRvbid0IGtub3cgYSB3YXkgdG8gYWJvcnQgY29ubmVjdCgpIHlldCwgYnV0IGF0IGxlYXN0IHRoaXMKLSAqIHRpbWVzIG91dCBhZnRlciB0aGUgQlQgcGFnZSB0aW1lb3V0ICgxMCBzZWNvbmRzIGN1cnJlbnRseSksIHNvIHRoZSB0aHJlYWQKLSAqIHdpbGwgZGllIGV2ZW50dWFsbHkuIFRoZSBmYWN0IHRoYXQgdGhlIHRocmVhZCBjYW4gb3V0bGl2ZQotICogdGhlIEphdmEgb2JqZWN0IGZvcmNlcyB1cyB0byB1c2UgYSBtdXRleCBpbiBkZXN0b3J5TmF0aXZlKCkuCi0gKgotICogVGhlIEpOSSBBUEkgaXMgZW50aXJlbHkgYXN5bmMuCi0gKgotICogQWxzbyBub3RlIHRoaXMgY2xhc3MgZGVhbHMgb25seSB3aXRoIFNDTyBjb25uZWN0aW9ucywgbm90IHdpdGggZGF0YQotICogdHJhbnNtaXNzaW9uLgotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLQotc3RhdGljIEphdmFWTSAqanZtOwotc3RhdGljIGpmaWVsZElEIGZpZWxkX21OYXRpdmVEYXRhOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BY2NlcHRlZDsKLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uQ29ubmVjdGVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25DbG9zZWQ7Ci0KLXN0cnVjdCB0aHJlYWRfZGF0YV90Owotc3RhdGljIHZvaWQgKndvcmtfdGhyZWFkKHZvaWQgKmFyZyk7Ci1zdGF0aWMgaW50IGNvbm5lY3Rfd29yayhjb25zdCBjaGFyICphZGRyZXNzLCB1aW50MTZfdCBzY29fcGt0X3R5cGUpOwotc3RhdGljIGludCBhY2NlcHRfd29yayhpbnQgc2lnbmFsX3NrKTsKLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2Nsb3NlKGludCBzaywgaW50IHNpZ25hbF9zayk7Ci1zdGF0aWMgdm9pZCBjbG9zZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpOwotCi1zdGF0aWMgdm9pZCBwYXJzZUJsYWNrbGlzdCh2b2lkKTsKLXN0YXRpYyB1aW50MTZfdCBnZXRTY29UeXBlKGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0jZGVmaW5lIENPTVBBUkVfU1RSSU5HKGtleSwgcykgKCFzdHJuY21wKGtleSwgcywgc3RybGVuKHMpKSkKLQotLyogQmxhY2tsaXN0IGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IHNjb0JsYWNrbGlzdCB7Ci0gICAgaW50IGZpZWxkVHlwZTsKLSAgICBjaGFyICp2YWx1ZTsKLSAgICB1aW50MTZfdCBzY29UeXBlOwotICAgIHN0cnVjdCBzY29CbGFja2xpc3QgKm5leHQ7Ci19IHNjb0JsYWNrbGlzdF90OwotCi0jZGVmaW5lIEJMX1RZUEVfTkFNRSAxICAgLy8gRmllbGQgdHlwZSBpcyBuYW1lIHN0cmluZwotCi1zdGF0aWMgc2NvQmxhY2tsaXN0X3QgKmJsYWNrbGlzdCA9IE5VTEw7Ci0KLS8qIHNoYXJlZCBuYXRpdmUgZGF0YSAtIHByb3RlY3RlZCBieSBtdXRleCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKLSAgICBpbnQgc2lnbmFsX3NrOyAgICAgICAgLy8gc29ja2V0IHRvIHNpZ25hbCBibG9ja2VkIEkvTyB0byB1bmJsb2NrCi0gICAgam9iamVjdCBvYmplY3Q7ICAgICAgIC8vIEpOSSBnbG9iYWwgcmVmIHRvIHRoZSBKYXZhIG9iamVjdAotICAgIHRocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhOyAgLy8gcG9pbnRlciB0byB0aHJlYWQgbG9jYWwgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4IDEgdGhyZWFkIHBlciBzY28gc29ja2V0Ci19IG5hdGl2ZV9kYXRhX3Q7Ci0KLS8qIHRocmVhZCBsb2NhbCBkYXRhICovCi1zdHJ1Y3QgdGhyZWFkX2RhdGFfdCB7Ci0gICAgbmF0aXZlX2RhdGFfdCAqbmF0OwotICAgIGJvb2wgaXNfYWNjZXB0OyAgICAgICAgLy8gYWNjZXB0IChsaXN0ZW5pbmcpIG9yIGNvbm5lY3QgKG91dGdvaW5nKSB0aHJlYWQKLSAgICBpbnQgc2lnbmFsX3NrOyAgICAgICAgIC8vIHNvY2tldCBmb3IgdGhyZWFkIHRvIGxpc3RlbiBmb3IgdW5ibG9jayBzaWduYWwKLSAgICBjaGFyIGFkZHJlc3NbQlRBRERSX1NJWkVdOyAgLy8gQlQgYWRkcmVzIGFzIHN0cmluZwotICAgIHVpbnQxNl90IHNjb19wa3RfdHlwZTsgICAvLyBTQ08gcGFja2V0IHR5cGVzIHN1cHBvcnRlZAotfTsKLQotc3RhdGljIGlubGluZSBuYXRpdmVfZGF0YV90ICogZ2V0X25hdGl2ZV9kYXRhKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIHJldHVybiAobmF0aXZlX2RhdGFfdCAqKShlbnYtPkdldEludEZpZWxkKG9iamVjdCwgZmllbGRfbU5hdGl2ZURhdGEpKTsKLX0KLQotc3RhdGljIHVpbnQxNl90IHN0cjJzY29UeXBlIChjaGFyICprZXkpIHsKLSAgICBMT0dWKCIlczoga2V5ID0gJXMiLCBfX0ZVTkNUSU9OX18sIGtleSk7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fSFYxIikpCi0gICAgICAgIHJldHVybiBFU0NPX0hWMTsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19IVjIiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fSFYyOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0hWMyIpKQotICAgICAgICByZXR1cm4gRVNDT19IVjM7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fRVYzIikpCi0gICAgICAgIHJldHVybiBFU0NPX0VWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT19FVjQiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fRVY0OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPX0VWNSIpKQotICAgICAgICByZXR1cm4gRVNDT19FVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fMkVWMyIpKQotICAgICAgICByZXR1cm4gRVNDT18yRVYzOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFU0NPXzNFVjMiKSkKLSAgICAgICAgcmV0dXJuIEVTQ09fM0VWMzsKLSAgICBpZiAoQ09NUEFSRV9TVFJJTkcoa2V5LCAiRVNDT18yRVY1IikpCi0gICAgICAgIHJldHVybiBFU0NPXzJFVjU7Ci0gICAgaWYgKENPTVBBUkVfU1RSSU5HKGtleSwgIkVTQ09fM0VWNSIpKQotICAgICAgICByZXR1cm4gRVNDT18zRVY1OwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJTQ09fRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBTQ09fRVNDT19NQVNLOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJFRFJfRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBFRFJfRVNDT19NQVNLOwotICAgIGlmIChDT01QQVJFX1NUUklORyhrZXksICJBTExfRVNDT19NQVNLIikpCi0gICAgICAgIHJldHVybiBBTExfRVNDT19NQVNLOwotICAgIExPR0UoIlVua25vd24gU0NPIFR5cGUgKCVzKSBza2lwcGluZyIsa2V5KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2VCbGFja2xpc3Qodm9pZCkgewotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gIi9ldGMvYmx1ZXRvb3RoL2JsYWNrbGlzdC5jb25mIjsKLSAgICBjaGFyIGxpbmVbTUFYX0xJTkVdOwotICAgIHNjb0JsYWNrbGlzdF90ICpsaXN0ID0gTlVMTDsKLSAgICBzY29CbGFja2xpc3RfdCAqbmV3ZWxlbTsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLQotICAgIC8qIE9wZW4gZmlsZSAqLwotICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0gICAgaWYoIWZwKSB7Ci0gICAgICAgIExPR0UoIkVycm9yKCVzKW9wZW5pbmcgYmxhY2tsaXN0IGZpbGUiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIE1BWF9MSU5FLCBmcCkgIT0gTlVMTCkgewotICAgICAgICBpZiAoKENPTVBBUkVfU1RSSU5HKGxpbmUsICIvLyIpKSB8fCAoIXN0cmNtcChsaW5lLCAiIikpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNoYXIgKm1vZHVsZSA9IHN0cnRvayhsaW5lLCI6Iik7Ci0gICAgICAgIGlmIChDT01QQVJFX1NUUklORyhtb2R1bGUsIFNDT19CTEFDS0xJU1RfTU9EVUxFX05BTUUpKSB7Ci0gICAgICAgICAgICBuZXdlbGVtID0gKHNjb0JsYWNrbGlzdF90ICopY2FsbG9jKDEsIHNpemVvZihzY29CbGFja2xpc3RfdCkpOwotICAgICAgICAgICAgaWYgKG5ld2VsZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcGFyc2UgbGluZQotICAgICAgICAgICAgY2hhciAqdHlwZSA9IHN0cnRvayhOVUxMLCAiLCIpOwotICAgICAgICAgICAgY2hhciAqdmFsdWVMaXN0ID0gc3RydG9rKE5VTEwsICIsIik7Ci0gICAgICAgICAgICBjaGFyICpwYXJhbUxpc3QgPSBzdHJ0b2soTlVMTCwgIiwiKTsKLSAgICAgICAgICAgIGlmIChDT01QQVJFX1NUUklORyh0eXBlLCBCTEFDS0xJU1RfQllfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IE5hbWUgZnJvbSBWYWx1ZSBsaXN0Ci0gICAgICAgICAgICAgICAgbmV3ZWxlbS0+ZmllbGRUeXBlID0gQkxfVFlQRV9OQU1FOwotICAgICAgICAgICAgICAgIG5ld2VsZW0tPnZhbHVlID0gKGNoYXIgKiljYWxsb2MoMSwgc3RybGVuKHZhbHVlTGlzdCkpOwotICAgICAgICAgICAgICAgIGlmIChuZXdlbGVtLT52YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZUxpc3QrKzsgIC8vIFNraXAgb3BlbiBxdW90ZQotICAgICAgICAgICAgICAgIHN0cm5jcHkobmV3ZWxlbS0+dmFsdWUsIHZhbHVlTGlzdCwgc3RybGVuKHZhbHVlTGlzdCkgLSAxKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCBTY28gU2V0dGluZ3MgZnJvbSBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBzdHJ0b2socGFyYW1MaXN0LCAiOyIpOwotICAgICAgICAgICAgICAgIHVpbnQxNl90IHNjb1R5cGVzID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGFyYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzY287Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVswXSA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgJj0gfnNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVswXSA9PSAnKycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY28gPSBzdHIyc2NvVHlwZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvVHlwZXMgfD0gc2NvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtWzBdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjbyA9IHN0cjJzY29UeXBlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY28gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29UeXBlcyA9IHNjbzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgU0NPIHR5cGUgbXVzdCBiZSA9LCArIG9yIC0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IHN0cnRvayhOVUxMLCAiOyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdlbGVtLT5zY29UeXBlID0gc2NvVHlwZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR0UoIlVua25vd24gU0NPIHR5cGUgZW50cnkgaW4gQmxhY2tsaXN0IGZpbGUiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlzdC0+bmV4dCA9IG5ld2VsZW07Ci0gICAgICAgICAgICAgICAgbGlzdCA9IG5ld2VsZW07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IGxpc3QgPSBuZXdlbGVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HSSgiRW50cnkgbmFtZSA9ICVzIFNjb1R5cGVzID0gMHgleCIsIG5ld2VsZW0tPnZhbHVlLAotICAgICAgICAgICAgICAgICBuZXdlbGVtLT5zY29UeXBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmY2xvc2UoZnApOwotICAgIHJldHVybjsKLX0KLXN0YXRpYyB1aW50MTZfdCBnZXRTY29UeXBlKGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICB1aW50MTZfdCByZXQgPSAwOwotICAgIHNjb0JsYWNrbGlzdF90ICpsaXN0ID0gYmxhY2tsaXN0OwotCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotICAgICAgICBpZiAobGlzdC0+ZmllbGRUeXBlID09IEJMX1RZUEVfTkFNRSkgewotICAgICAgICAgICAgaWYgKENPTVBBUkVfU1RSSU5HKG5hbWUsIGxpc3QtPnZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGxpc3QtPnNjb1R5cGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICAgIExPR0koIiVzICVzIC0gMHgleCIsICBfX0ZVTkNUSU9OX18sIG5hbWUsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjbGFzc0luaXROYXRpdmUoSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eikgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIGlmIChlbnYtPkdldEphdmFWTSgmanZtKSA8IDApIHsKLSAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCBoYW5kbGUgdG8gdGhlIFZNIik7Ci0gICAgfQotICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZ2V0X2ZpZWxkKGVudiwgY2xhenosICJtTmF0aXZlRGF0YSIsICJJIik7Ci0gICAgbWV0aG9kX29uQWNjZXB0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25BY2NlcHRlZCIsICIoSSlWIik7Ci0gICAgbWV0aG9kX29uQ29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uQ29ubmVjdGVkIiwgIihJKVYiKTsKLSAgICBtZXRob2Rfb25DbG9zZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25DbG9zZWQiLCAiKClWIik7Ci0KLSAgICAvKiBSZWFkIHRoZSBibGFja2xpc3QgZmlsZSBpbiBoZXJlICovCi0gICAgcGFyc2VCbGFja2xpc3QoKTsKLSNlbmRpZgotfQotCi0vKiBSZXR1cm5zIGZhbHNlIGlmIGEgc2VyaW91cyBlcnJvciBvY2N1cmVkICovCi1zdGF0aWMgamJvb2xlYW4gaW5pdE5hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0jaWZkZWYgSEFWRV9CTFVFVE9PVEgKLQotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IChuYXRpdmVfZGF0YV90ICopIGNhbGxvYygxLCBzaXplb2YobmF0aXZlX2RhdGFfdCkpOwotICAgIGlmIChuYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCIlczogb3V0IG9mIG1lbW9yeSEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbmF0LT5tdXRleCwgTlVMTCk7Ci0gICAgZW52LT5TZXRJbnRGaWVsZChvYmplY3QsIGZpZWxkX21OYXRpdmVEYXRhLCAoamludCluYXQpOwotICAgIG5hdC0+c2lnbmFsX3NrID0gLTE7Ci0gICAgbmF0LT5vYmplY3QgPSBOVUxMOwotICAgIG5hdC0+dGhyZWFkX2RhdGEgPSBOVUxMOwotCi0jZW5kaWYKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lOYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICAKLSAgICBjbG9zZU5hdGl2ZShlbnYsIG9iamVjdCk7Ci0gICAgCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT50aHJlYWRfZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIG5hdC0+dGhyZWFkX2RhdGEtPm5hdCA9IE5VTEw7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm5hdC0+bXV0ZXgpOwotCi0gICAgZnJlZShuYXQpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBqYm9vbGVhbiBhY2NlcHROYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0KSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0gICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKLSAgICBpbnQgc2lnbmFsX3Nrc1syXTsKLSAgICBwdGhyZWFkX3QgdGhyZWFkOwotICAgIHN0cnVjdCB0aHJlYWRfZGF0YV90ICpkYXRhID0gTlVMTDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgaWYgKG5hdC0+c2lnbmFsX3NrICE9IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBzZXR1cCBzb2NrZXRwYWlyIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiB0aHJlYWRzCi0gICAgaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNpZ25hbF9za3MpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogc29ja2V0cGFpcigpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgbmF0LT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzBdOwotICAgIG5hdC0+b2JqZWN0ID0gZW52LT5OZXdHbG9iYWxSZWYob2JqZWN0KTsKLQotICAgIGRhdGEgPSAodGhyZWFkX2RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YodGhyZWFkX2RhdGFfdCkpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IG91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+dGhyZWFkX2RhdGEgPSBkYXRhOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGRhdGEtPnNpZ25hbF9zayA9IHNpZ25hbF9za3NbMV07Ci0gICAgZGF0YS0+bmF0ID0gbmF0OwotICAgIGRhdGEtPmlzX2FjY2VwdCA9IHRydWU7Ci0KLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgJndvcmtfdGhyZWFkLCAodm9pZCAqKWRhdGEpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyBqYm9vbGVhbiBjb25uZWN0TmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBhZGRyZXNzLAotICAgICAgICBqc3RyaW5nIG5hbWUpIHsKLQotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9za3NbMl07Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkX2RhdGFfdCAqZGF0YTsKLSAgICBjb25zdCBjaGFyICpjX2FkZHJlc3M7Ci0gICAgY29uc3QgY2hhciAqY19uYW1lOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZuYXQtPm11dGV4KTsKLSAgICBpZiAobmF0LT5zaWduYWxfc2sgIT0gLTEpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIHNldHVwIHNvY2tldHBhaXIgdG8gcGFzcyBtZXNzYWdlcyBiZXR3ZWVuIHRocmVhZHMKLSAgICBpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2lnbmFsX3NrcykgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXRwYWlyKCkgZmFpbGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0gICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgfQotICAgIG5hdC0+c2lnbmFsX3NrID0gc2lnbmFsX3Nrc1swXTsKLSAgICBuYXQtPm9iamVjdCA9IGVudi0+TmV3R2xvYmFsUmVmKG9iamVjdCk7Ci0KLSAgICBkYXRhID0gKHRocmVhZF9kYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKHRocmVhZF9kYXRhX3QpKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm5hdC0+bXV0ZXgpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbmF0LT5tdXRleCk7Ci0KLSAgICBkYXRhLT5zaWduYWxfc2sgPSBzaWduYWxfc2tzWzFdOwotICAgIGRhdGEtPm5hdCA9IG5hdDsKLSAgICBjX2FkZHJlc3MgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFkZHJlc3MsIE5VTEwpOwotICAgIHN0cmxjcHkoZGF0YS0+YWRkcmVzcywgY19hZGRyZXNzLCBCVEFERFJfU0laRSk7Ci0gICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoYWRkcmVzcywgY19hZGRyZXNzKTsKLSAgICBkYXRhLT5pc19hY2NlcHQgPSBmYWxzZTsKLQotICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiJXM6IE51bGwgcG9pbnRlciBwYXNzZWQgaW4gZm9yIGRldmljZSBuYW1lIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGF0YS0+c2NvX3BrdF90eXBlID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBjX25hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOwotICAgICAgICAvKiBTZWUgaWYgdGhpcyBkZXZpY2UgaXMgaW4gdGhlIGJsYWNrIGxpc3QgKi8KLSAgICAgICAgZGF0YS0+c2NvX3BrdF90eXBlID0gZ2V0U2NvVHlwZShkYXRhLT5hZGRyZXNzLCBjX25hbWUpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBjX25hbWUpOwotICAgIH0KLSAgICBpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgJndvcmtfdGhyZWFkLCAodm9pZCAqKWRhdGEpIDwgMCkgewotICAgICAgICBMT0dFKCIlczogcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gSk5JX1RSVUU7Ci0KLSNlbmRpZgotICAgIHJldHVybiBKTklfRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlTmF0aXZlKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iamVjdCkgewotICAgIExPR1YoX19GVU5DVElPTl9fKTsKLSNpZmRlZiBIQVZFX0JMVUVUT09USAotICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7Ci0gICAgaW50IHNpZ25hbF9zazsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbmF0LT5tdXRleCk7Ci0gICAgc2lnbmFsX3NrID0gbmF0LT5zaWduYWxfc2s7Ci0gICAgbmF0LT5zaWduYWxfc2sgPSAtMTsKLSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihuYXQtPm9iamVjdCk7Ci0gICAgbmF0LT5vYmplY3QgPSBOVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZuYXQtPm11dGV4KTsKLQotICAgIGlmIChzaWduYWxfc2sgPj0gMCkgewotICAgICAgICBMT0dWKCIlczogc2lnbmFsX3NrID0gJWQiLCBfX0ZVTkNUSU9OX18sIHNpZ25hbF9zayk7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZHVtbXk7Ci0gICAgICAgIHdyaXRlKHNpZ25hbF9zaywgJmR1bW15LCBzaXplb2YoZHVtbXkpKTsKLSAgICAgICAgY2xvc2Uoc2lnbmFsX3NrKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEhBVkVfQkxVRVRPT1RICi0vKiB0aHJlYWQgZW50cnkgcG9pbnQgKi8KLXN0YXRpYyB2b2lkICp3b3JrX3RocmVhZCh2b2lkICphcmcpIHsKLSAgICBKTklFbnYqIGVudjsKLSAgICB0aHJlYWRfZGF0YV90ICpkYXRhID0gKHRocmVhZF9kYXRhX3QgKilhcmc7Ci0gICAgaW50IHNrOwotCi0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIGlmIChqdm0tPkF0dGFjaEN1cnJlbnRUaHJlYWQoJmVudiwgTlVMTCkgIT0gSk5JX09LKSB7Ci0gICAgICAgIExPR0UoIiVzOiBBdHRhY2hDdXJyZW50VGhyZWFkKCkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogY29ubmVjdCB0aGUgU0NPIHNvY2tldCAqLwotICAgIGlmIChkYXRhLT5pc19hY2NlcHQpIHsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCBBQ0NFUFQgIyMjIyMiLCBkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgICAgIHNrID0gYWNjZXB0X3dvcmsoZGF0YS0+c2lnbmFsX3NrKTsKLSAgICAgICAgTE9HVigiU0NPIE9CSkVDVCAlcCBFTkQgQUNDRVBUICoqKioqIiwgZGF0YS0+bmF0LT5vYmplY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrID0gY29ubmVjdF93b3JrKGRhdGEtPmFkZHJlc3MsIGRhdGEtPnNjb19wa3RfdHlwZSk7Ci0gICAgfQotCi0gICAgLyogY2FsbGJhY2sgd2l0aCBjb25uZWN0aW9uIHJlc3VsdCAqLwotICAgIGlmIChkYXRhLT5uYXQgPT0gTlVMTCkgewotICAgICAgICBMT0dWKCIlczogb2JqZWN0IGRlc3Ryb3llZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGF0YS0+bmF0LT5tdXRleCk7Ci0gICAgaWYgKGRhdGEtPm5hdC0+b2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgICAgICBMT0dWKCIlczogY2FsbGJhY2sgY2FuY2VsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBpZiAoZGF0YS0+aXNfYWNjZXB0KSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkFjY2VwdGVkLCBzayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChkYXRhLT5uYXQtPm9iamVjdCwgbWV0aG9kX29uQ29ubmVjdGVkLCBzayk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLQotICAgIGlmIChzayA8IDApIHsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgJWQgQ09OTkVDVEVEICsrKyAoJXMpIiwgZGF0YS0+bmF0LT5vYmplY3QsIHNrLAotICAgICAgICAgZGF0YS0+aXNfYWNjZXB0ID8gImluIiA6ICJvdXQiKTsKLQotICAgIC8qIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gY2xvc2UgKi8KLSAgICBMT0dWKCJ3YWl0X2Zvcl9jbG9zZSgpLi4uIik7Ci0gICAgd2FpdF9mb3JfY2xvc2Uoc2ssIGRhdGEtPnNpZ25hbF9zayk7Ci0gICAgTE9HVigid2FpdF9mb3JfY2xvc2UoKSByZXR1cm5lZCIpOwotCi0gICAgLyogY2FsbGJhY2sgd2l0aCBjbG9zZSByZXN1bHQgKi8KLSAgICBpZiAoZGF0YS0+bmF0ID09IE5VTEwpIHsKLSAgICAgICAgTE9HVigiJXM6IG9iamVjdCBkZXN0cm95ZWQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgIGlmIChkYXRhLT5uYXQtPm9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR1YoIiVzOiBjYWxsYmFjayBjYW5jZWxsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoZGF0YS0+bmF0LT5vYmplY3QsIG1ldGhvZF9vbkNsb3NlZCk7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLQotZG9uZToKLSAgICBpZiAoc2sgPj0gMCkgewotICAgICAgICBjbG9zZShzayk7Ci0gICAgICAgIExPR1YoIlNDTyBPQkpFQ1QgJXAgJWQgQ0xPU0VEIC0tLSAoJXMpIiwgZGF0YS0+bmF0LT5vYmplY3QsIHNrLCBkYXRhLT5pc19hY2NlcHQgPyAiaW4iIDogIm91dCIpOwotICAgIH0KLSAgICBpZiAoZGF0YS0+c2lnbmFsX3NrID49IDApIHsKLSAgICAgICAgY2xvc2UoZGF0YS0+c2lnbmFsX3NrKTsKLSAgICB9Ci0gICAgTE9HVigiU0NPIHNvY2tldCBjbG9zZWQiKTsKLQotICAgIGlmIChkYXRhLT5uYXQgIT0gTlVMTCkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmRhdGEtPm5hdC0+bXV0ZXgpOwotICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihkYXRhLT5uYXQtPm9iamVjdCk7Ci0gICAgICAgIGRhdGEtPm5hdC0+b2JqZWN0ID0gTlVMTDsKLSAgICAgICAgZGF0YS0+bmF0LT50aHJlYWRfZGF0YSA9IE5VTEw7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYXRhLT5uYXQtPm11dGV4KTsKLSAgICB9Ci0KLSAgICBmcmVlKGRhdGEpOwotICAgIGlmIChqdm0tPkRldGFjaEN1cnJlbnRUaHJlYWQoKSAhPSBKTklfT0spIHsKLSAgICAgICAgTE9HRSgiJXM6IERldGFjaEN1cnJlbnRUaHJlYWQoKSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLQotICAgIExPR1YoIndvcmtfdGhyZWFkKCkgZG9uZSIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGFjY2VwdF93b3JrKGludCBzaWduYWxfc2spIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgaW50IHNrOwotICAgIGludCBuc2s7Ci0gICAgaW50IGFkZHJfc3o7Ci0gICAgaW50IG1heF9mZDsKLSAgICBmZF9zZXQgZmRzOwotICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gYWRkcjsKLQotICAgIHNrID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fU0NPKTsKLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzIHNvY2tldCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIG1lbWNweSgmYWRkci5zY29fYmRhZGRyLCBCREFERFJfQU5ZLCBzaXplb2YoYmRhZGRyX3QpKTsKLSAgICBpZiAoYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKLSAgICAgICAgTE9HRSgiJXMgYmluZCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKGxpc3RlbihzaywgMSkpIHsKLSAgICAgICAgTE9HRSgiJXM6IGxpc3RlbigpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHJfc3ogPSBzaXplb2YoYWRkcik7Ci0KLSAgICBGRF9aRVJPKCZmZHMpOwotICAgIEZEX1NFVChzaywgJmZkcyk7Ci0gICAgRkRfU0VUKHNpZ25hbF9zaywgJmZkcyk7Ci0KLSAgICBtYXhfZmQgPSAoc2sgPiBzaWduYWxfc2spID8gc2sgOiBzaWduYWxfc2s7Ci0gICAgTE9HSSgiTGlzdGVuaW5nIFNDTyBzb2NrZXQuLi4iKTsKLSAgICB3aGlsZSAoc2VsZWN0KG1heF9mZCArIDEsICZmZHMsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBzZWxlY3QoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogc2VsZWN0KCkgRUlOVFIsIHJldHJ5aW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgTE9HVigic2VsZWN0KCkgcmV0dXJuZWQiKTsKLSAgICBpZiAoRkRfSVNTRVQoc2lnbmFsX3NrLCAmZmRzKSkgewotICAgICAgICAvLyBzaWduYWwgdG8gY2FuY2VsIGxpc3RlbmluZwotICAgICAgICBMT0dWKCJjYW5jZWxsZWQgbGlzdGVuaW5nIHNvY2tldCwgY2xvc2luZyIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBpZiAoIUZEX0lTU0VUKHNrLCAmZmRzKSkgewotICAgICAgICBMT0dFKCJlcnJvcjogc2VsZWN0KCkgcmV0dXJuZWQgPj0gMCB3aXRoIG5vIGZkcyBzZXQiKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBuc2sgPSBhY2NlcHQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJfc3opOwotICAgIGlmIChuc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBhY2NlcHQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBMT0dJKCJDb25uZWN0ZWQgU0NPIHNvY2tldCAoaW5jb21pbmcpIik7Ci0gICAgY2xvc2Uoc2spOyAgLy8gVGhlIGxpc3RlbmluZyBzb2NrZXQKLQotICAgIHJldHVybiBuc2s7Ci0KLWVycm9yOgotICAgIGNsb3NlKHNrKTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBjb25uZWN0X3dvcmsoY29uc3QgY2hhciAqYWRkcmVzcywgdWludDE2X3Qgc2NvX3BrdF90eXBlKSB7Ci0gICAgTE9HVihfX0ZVTkNUSU9OX18pOwotICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gYWRkcjsKLSAgICBpbnQgc2sgPSAtMTsKLQotICAgIHNrID0gc29ja2V0KFBGX0JMVUVUT09USCwgU09DS19TRVFQQUNLRVQsIEJUUFJPVE9fU0NPKTsKLSAgICBpZiAoc2sgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBzb2NrZXQoKSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogQmluZCB0byBsb2NhbCBhZGRyZXNzICovCi0gICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotICAgIGFkZHIuc2NvX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLSAgICBtZW1jcHkoJmFkZHIuc2NvX2JkYWRkciwgQkRBRERSX0FOWSwgc2l6ZW9mKGJkYWRkcl90KSk7Ci0gICAgaWYgKGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7Ci0gICAgICAgIExPR0UoIiVzOiBiaW5kKCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zY29fZmFtaWx5ID0gQUZfQkxVRVRPT1RIOwotICAgIGdldF9iZGFkZHIoYWRkcmVzcywgJmFkZHIuc2NvX2JkYWRkcik7Ci0gICAgYWRkci5zY29fcGt0X3R5cGUgPSBzY29fcGt0X3R5cGU7Ci0gICAgTE9HSSgiQ29ubmVjdGluZyB0byBzb2NrZXQiKTsKLSAgICB3aGlsZSAoY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKLSAgICAgICAgICAgIExPR0UoIiVzOiBjb25uZWN0KCkgZmFpbGVkOiAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HVigiJXM6IGNvbm5lY3QoKSBFSU5UUiwgcmV0cnlpbmciLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLSAgICBMT0dJKCJTQ08gc29ja2V0IGNvbm5lY3RlZCAob3V0Z29pbmcpIik7Ci0KLSAgICByZXR1cm4gc2s7Ci0KLWVycm9yOgotICAgIGlmIChzayA+PSAwKSBjbG9zZShzayk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9jbG9zZShpbnQgc2ssIGludCBzaWduYWxfc2spIHsKLSAgICBMT0dWKF9fRlVOQ1RJT05fXyk7Ci0gICAgcG9sbGZkIHBbMl07Ci0KLSAgICBtZW1zZXQocCwgMCwgMiAqIHNpemVvZihwb2xsZmQpKTsKLSAgICBwWzBdLmZkID0gc2s7Ci0gICAgcFsxXS5mZCA9IHNpZ25hbF9zazsKLSAgICBwWzFdLmV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkk7Ci0KLSAgICBMT0dWKCJwb2xsLi4uIik7Ci0KLSAgICB3aGlsZSAocG9sbChwLCAyLCAtMSkgPCAwKSB7ICAvLyBibG9ja3MKLSAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICAgICAgICBMT0dFKCIlczogcG9sbCgpIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBMT0dWKCIlczogcG9sbCgpIEVJTlRSLCByZXRyeWluZyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgTE9HVigicG9sbCgpIHJldHVybmVkIik7Ci19Ci0jZW5kaWYKLQotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewotICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LAotICAgIHsiaW5pdE5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWluaXROYXRpdmV9LAotICAgIHsiZGVzdHJveU5hdGl2ZSIsICIoKVYiLCAodm9pZCAqKWRlc3Ryb3lOYXRpdmV9LAotICAgIHsiY29ubmVjdE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWNvbm5lY3ROYXRpdmV9LAotICAgIHsiYWNjZXB0TmF0aXZlIiwgIigpWiIsICh2b2lkICopYWNjZXB0TmF0aXZlfSwKLSAgICB7ImNsb3NlTmF0aXZlIiwgIigpViIsICh2b2lkICopY2xvc2VOYXRpdmV9LAotfTsKLQotaW50IHJlZ2lzdGVyX2FuZHJvaWRfYmx1ZXRvb3RoX1Njb1NvY2tldChKTklFbnYgKmVudikgewotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKLSAgICAgICAgICAgICJhbmRyb2lkL2JsdWV0b290aC9TY29Tb2NrZXQiLCBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfYmx1ZXRvb3RoX2NvbW1vbi5jcHAKaW5kZXggNDNjM2E5NS4uYWFlMGYyMSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uY3BwCkBAIC02OSw2ICs2OSwxNiBAQAogICAgIHsiVVVJRHMiLCBEQlVTX1RZUEVfQVJSQVl9LAogfTsKIAorc3RhdGljIFByb3BlcnRpZXMgaW5wdXRfcHJvcGVydGllc1tdID0geworICAgIHsiQ29ubmVjdGVkIiwgREJVU19UWVBFX0JPT0xFQU59LAorfTsKKworc3RhdGljIFByb3BlcnRpZXMgcGFuX3Byb3BlcnRpZXNbXSA9IHsKKyAgICB7IkNvbm5lY3RlZCIsIERCVVNfVFlQRV9CT09MRUFOfSwKKyAgICB7IkludGVyZmFjZSIsIERCVVNfVFlQRV9TVFJJTkd9LAorICAgIHsiVVVJRCIsIERCVVNfVFlQRV9TVFJJTkd9LAorfTsKKwogdHlwZWRlZiB1bmlvbiB7CiAgICAgY2hhciAqc3RyX3ZhbDsKICAgICBpbnQgaW50X3ZhbDsKQEAgLTE4Nyw2ICsxOTcsNyBAQAogICAgIGRidXNfYm9vbF90IHJldDsKICAgICB2YV9saXN0IGxzdDsKICAgICB2YV9zdGFydChsc3QsIGZpcnN0X2FyZ190eXBlKTsKKwogICAgIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jX3ZhbGlzdChlbnYsIGNvbm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LCB1c2VyLCBuYXQsCkBAIC02OTksNiArNzEwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKIH0KIAoram9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZykgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2csIChQcm9wZXJ0aWVzICopICZpbnB1dF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5wdXRfcHJvcGVydGllcykgLyBzaXplb2YoUHJvcGVydGllcykpOworfQorCitqb2JqZWN0QXJyYXkgcGFyc2VfcGFuX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZykgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2csIChQcm9wZXJ0aWVzICopICZwYW5fcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhbl9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKIGpvYmplY3RBcnJheSBwYXJzZV9hZGFwdGVyX3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcikgewogICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0aWVzKGVudiwgaXRlciwgKFByb3BlcnRpZXMgKikgJmFkYXB0ZXJfcHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYWRhcHRlcl9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7CkBAIC03MDksNiArNzMwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVfZGV2aWNlX3Byb3BlcnRpZXMpIC8gc2l6ZW9mKFByb3BlcnRpZXMpKTsKIH0KIAoram9iamVjdEFycmF5IHBhcnNlX2lucHV0X3Byb3BlcnRpZXMoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlSXRlciAqaXRlcikgeworICAgIHJldHVybiBwYXJzZV9wcm9wZXJ0aWVzKGVudiwgaXRlciwgKFByb3BlcnRpZXMgKikgJmlucHV0X3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnB1dF9wcm9wZXJ0aWVzKSAvIHNpemVvZihQcm9wZXJ0aWVzKSk7Cit9CisKIGludCBnZXRfYmRhZGRyKGNvbnN0IGNoYXIgKnN0ciwgYmRhZGRyX3QgKmJhKSB7CiAgICAgY2hhciAqZCA9ICgoY2hhciAqKWJhKSArIDUsICplbmRwOwogICAgIGludCBpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmggYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaAppbmRleCAzNzhiYjZmLi45MjIyZTFhIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2JsdWV0b290aF9jb21tb24uaApAQCAtMTYyLDYgKzE2Miw5IEBACiBqb2JqZWN0QXJyYXkgcGFyc2VfcmVtb3RlX2RldmljZV9wcm9wZXJ0aWVzKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZUl0ZXIgKml0ZXIpOwogam9iamVjdEFycmF5IHBhcnNlX3JlbW90ZV9kZXZpY2VfcHJvcGVydHlfY2hhbmdlKEpOSUVudiAqZW52LCBEQnVzTWVzc2FnZSAqbXNnKTsKIGpvYmplY3RBcnJheSBwYXJzZV9hZGFwdGVyX3Byb3BlcnR5X2NoYW5nZShKTklFbnYgKmVudiwgREJ1c01lc3NhZ2UgKm1zZyk7Citqb2JqZWN0QXJyYXkgcGFyc2VfaW5wdXRfcHJvcGVydGllcyhKTklFbnYgKmVudiwgREJ1c01lc3NhZ2VJdGVyICppdGVyKTsKK2pvYmplY3RBcnJheSBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOworam9iamVjdEFycmF5IHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoSk5JRW52ICplbnYsIERCdXNNZXNzYWdlICptc2cpOwogdm9pZCBhcHBlbmRfdmFyaWFudChEQnVzTWVzc2FnZUl0ZXIgKml0ZXIsIGludCB0eXBlLCB2b2lkICp2YWwpOwogaW50IGdldF9iZGFkZHIoY29uc3QgY2hhciAqc3RyLCBiZGFkZHJfdCAqYmEpOwogdm9pZCBnZXRfYmRhZGRyX2FzX3N0cmluZyhjb25zdCBiZGFkZHJfdCAqYmEsIGNoYXIgKnN0cik7CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX0N1cnNvcldpbmRvdy5jcHAKaW5kZXggOTE0NDliYy4uMDQwZGFjMyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3cuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93LmNwcApAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiYW5kcm9pZF91dGlsX0JpbmRlci5oIgogCkBAIC0yMjUsNzAgKzIyNSw2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBqYm9vbGVhbiBpc0Jsb2JfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgYmxvYiBvciBudWxsIGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7Ci0KLSAgICBmaWVsZF9zbG90X3QgZmllbGQ7Ci0gICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9CTE9CIHx8IGZpZWxkLnR5cGUgPT0gRklFTERfVFlQRV9OVUxMOwotfQotCi1zdGF0aWMgamJvb2xlYW4gaXNTdHJpbmdfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgc3RyaW5nIG9yIG51bGwgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX1NUUklORyB8fCBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfTlVMTDsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzSW50ZWdlcl9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCi17Ci0gICAgaW50MzJfdCBlcnI7Ci0gICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7Ci1MT0dfV0lORE9XKCJDaGVja2luZyBpZiBjb2x1bW4gaXMgYW4gaW50ZWdlciBmb3IgJWQsJWQgZnJvbSAlcCIsIHJvdywgY29sdW1uLCB3aW5kb3cpOwotCi0gICAgZmllbGRfc2xvdF90IGZpZWxkOwotICAgIGVyciA9IHdpbmRvdy0+cmVhZF9maWVsZF9zbG90KHJvdywgY29sdW1uLCAmZmllbGQpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbldpdGhSb3dDb2woZW52LCByb3csIGNvbHVtbik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZC50eXBlID09IEZJRUxEX1RZUEVfSU5URUdFUjsKLX0KLQotc3RhdGljIGpib29sZWFuIGlzRmxvYXRfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQotewotICAgIGludDMyX3QgZXJyOwotICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdyA9IEdFVF9XSU5ET1coZW52LCBvYmplY3QpOwotTE9HX1dJTkRPVygiQ2hlY2tpbmcgaWYgY29sdW1uIGlzIGEgZmxvYXQgZm9yICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKLQotICAgIGZpZWxkX3Nsb3RfdCBmaWVsZDsKLSAgICBlcnIgPSB3aW5kb3ctPnJlYWRfZmllbGRfc2xvdChyb3csIGNvbHVtbiwgJmZpZWxkKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoUm93Q29sKGVudiwgcm93LCBjb2x1bW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmllbGQudHlwZSA9PSBGSUVMRF9UWVBFX0ZMT0FUOwotfQotCiBzdGF0aWMganN0cmluZyBnZXRTdHJpbmdfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwgamludCByb3csIGppbnQgY29sdW1uKQogewogICAgIGludDMyX3QgZXJyOwpAQCAtNDg3LDEwICs0MjMsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIGpib29sZWFuIGlzTnVsbF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCitib29sIGlzTnVsbF9uYXRpdmUoQ3Vyc29yV2luZG93ICp3aW5kb3csIGppbnQgcm93LCBqaW50IGNvbHVtbikKIHsKLSAgICBDdXJzb3JXaW5kb3cgKiB3aW5kb3cgPSBHRVRfV0lORE9XKGVudiwgb2JqZWN0KTsKLUxPR19XSU5ET1coIkNoZWNraW5nIGZvciBOVUxMIGF0ICVkLCVkIGZyb20gJXAiLCByb3csIGNvbHVtbiwgd2luZG93KTsKKyAgICBMT0dfV0lORE9XKCJDaGVja2luZyBmb3IgTlVMTCBhdCAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CiAKICAgICBib29sIGlzTnVsbDsKICAgICBpZiAod2luZG93LT5nZXROdWxsKHJvdywgY29sdW1uLCAmaXNOdWxsKSkgewpAQCAtNjUyLDYgKzU4NywyNiBAQAogICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKIH0KIAorc3RhdGljIGppbnQgZ2V0VHlwZV9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJvdywgamludCBjb2x1bW4pCit7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ3Vyc29yV2luZG93ICogd2luZG93ID0gR0VUX1dJTkRPVyhlbnYsIG9iamVjdCk7CisgICAgTE9HX1dJTkRPVygicmV0dXJuaW5nIGNvbHVtbiB0eXBlIGFmZmluaXR5IGZvciAlZCwlZCBmcm9tICVwIiwgcm93LCBjb2x1bW4sIHdpbmRvdyk7CisKKyAgICBpZiAoaXNOdWxsX25hdGl2ZSh3aW5kb3csIHJvdywgY29sdW1uKSkgeworICAgICAgcmV0dXJuIEZJRUxEX1RZUEVfTlVMTDsKKyAgICB9CisKKyAgICBmaWVsZF9zbG90X3QgZmllbGQ7CisgICAgZXJyID0gd2luZG93LT5yZWFkX2ZpZWxkX3Nsb3Qocm93LCBjb2x1bW4sICZmaWVsZCk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFJvd0NvbChlbnYsIHJvdywgY29sdW1uKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGZpZWxkLnR5cGU7Cit9CisKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwpAQCAtNjYyLDExICs2MTcsOSBAQAogICAgIHsiY2xvc2VfbmF0aXZlIiwgIigpViIsICh2b2lkICopbmF0aXZlX2Nsb3NlfSwKICAgICB7ImdldExvbmdfbmF0aXZlIiwgIihJSSlKIiwgKHZvaWQgKilnZXRMb25nX25hdGl2ZX0sCiAgICAgeyJnZXRCbG9iX25hdGl2ZSIsICIoSUkpW0IiLCAodm9pZCAqKWdldEJsb2JfbmF0aXZlfSwKLSAgICB7ImlzQmxvYl9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKWlzQmxvYl9uYXRpdmV9LAogICAgIHsiZ2V0U3RyaW5nX25hdGl2ZSIsICIoSUkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKilnZXRTdHJpbmdfbmF0aXZlfSwKICAgICB7ImNvcHlTdHJpbmdUb0J1ZmZlcl9uYXRpdmUiLCAiKElJSUxhbmRyb2lkL2RhdGFiYXNlL0NoYXJBcnJheUJ1ZmZlcjspW0MiLCAodm9pZCAqKWNvcHlTdHJpbmdUb0J1ZmZlcl9uYXRpdmV9LAogICAgIHsiZ2V0RG91YmxlX25hdGl2ZSIsICIoSUkpRCIsICh2b2lkICopZ2V0RG91YmxlX25hdGl2ZX0sCi0gICAgeyJpc051bGxfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc051bGxfbmF0aXZlfSwKICAgICB7ImdldE51bVJvd3NfbmF0aXZlIiwgIigpSSIsICh2b2lkICopZ2V0TnVtUm93c30sCiAgICAgeyJzZXROdW1Db2x1bW5zX25hdGl2ZSIsICIoSSlaIiwgKHZvaWQgKilzZXROdW1Db2x1bW5zfSwKICAgICB7ImFsbG9jUm93X25hdGl2ZSIsICIoKVoiLCAodm9pZCAqKWFsbG9jUm93fSwKQEAgLTY3Niw5ICs2MjksNyBAQAogICAgIHsicHV0RG91YmxlX25hdGl2ZSIsICIoRElJKVoiLCAodm9pZCAqKXB1dERvdWJsZV9uYXRpdmV9LAogICAgIHsiZnJlZUxhc3RSb3dfbmF0aXZlIiwgIigpViIsICh2b2lkICopZnJlZUxhc3RSb3d9LAogICAgIHsicHV0TnVsbF9uYXRpdmUiLCAiKElJKVoiLCAodm9pZCAqKXB1dE51bGxfbmF0aXZlfSwKLSAgICB7ImlzU3RyaW5nX25hdGl2ZSIsICIoSUkpWiIsICh2b2lkICopaXNTdHJpbmdfbmF0aXZlfSwKLSAgICB7ImlzRmxvYXRfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0Zsb2F0X25hdGl2ZX0sCi0gICAgeyJpc0ludGVnZXJfbmF0aXZlIiwgIihJSSlaIiwgKHZvaWQgKilpc0ludGVnZXJfbmF0aXZlfSwKKyAgICB7ImdldFR5cGVfbmF0aXZlIiwgIihJSSlJIiwgKHZvaWQgKilnZXRUeXBlX25hdGl2ZX0sCiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9DdXJzb3JXaW5kb3coSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZUNvbXBpbGVkU3FsLmNwcAppbmRleCA4ZDFjMzllZS4uZGU0YzVjOCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbC5jcHAKQEAgLTkxLDIyICs5MSwxMSBAQAogICAgIGNvbXBpbGUoZW52LCBvYmplY3QsIEdFVF9IQU5ETEUoZW52LCBvYmplY3QpLCBzcWxTdHJpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBuYXRpdmVfZmluYWxpemUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQotewotICAgIGludCBlcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7Ci0KLSAgICBpZiAoc3RhdGVtZW50ICE9IE5VTEwpIHsKLSAgICAgICAgc3FsaXRlM19maW5hbGl6ZShzdGF0ZW1lbnQpOwotICAgICAgICBlbnYtPlNldEludEZpZWxkKG9iamVjdCwgZ1N0YXRlbWVudEZpZWxkLCAwKTsKLSAgICB9Ci19CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2Qgc01ldGhvZHNbXSA9CiB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsibmF0aXZlX2NvbXBpbGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfY29tcGlsZX0sCi0gICAgeyJuYXRpdmVfZmluYWxpemUiLCAiKClWIiwgKHZvaWQgKiluYXRpdmVfZmluYWxpemV9LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlQ29tcGlsZWRTcWwoSk5JRW52ICogZW52KQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVEYXRhYmFzZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAppbmRleCAzNjIzNGE5Li4zNmU5MDg5IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZURhdGFiYXNlLmNwcApAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIkRhdGFiYXNlIgorI2RlZmluZSBMT0dfVEFHICJTcWxpdGVEYXRhYmFzZUNwcCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTYyLDkgKzYyLDExIEBACiB9OwogCiBzdGF0aWMgamZpZWxkSUQgb2Zmc2V0X2RiX2hhbmRsZTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjazsKK3N0YXRpYyBqY2xhc3Mgc3RyaW5nX2NsYXNzID0gTlVMTDsKIAotc3RhdGljIGNoYXIgKmNyZWF0ZVN0cihjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKK3N0YXRpYyBjaGFyICpjcmVhdGVTdHIoY29uc3QgY2hhciAqcGF0aCwgc2hvcnQgZXh0cmEpIHsKKyAgICBpbnQgbGVuID0gc3RybGVuKHBhdGgpICsgZXh0cmE7CiAgICAgY2hhciAqc3RyID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7CiAgICAgc3RybmNweShzdHIsIHBhdGgsIGxlbik7CiAgICAgc3RyW2xlbl0gPSBOVUxMOwpAQCAtODUsNyArODcsNyBAQAogICAgIH0KIAogICAgIExPR1YoIlJlZ2lzdGVyaW5nIHNxbGl0ZSBsb2dnaW5nIGZ1bmMgXG4iKTsKLSAgICBpbnQgZXJyID0gc3FsaXRlM19jb25maWcoU1FMSVRFX0NPTkZJR19MT0csICZzcWxMb2dnZXIsICh2b2lkICopY3JlYXRlU3RyKHBhdGgpKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jb25maWcoU1FMSVRFX0NPTkZJR19MT0csICZzcWxMb2dnZXIsICh2b2lkICopY3JlYXRlU3RyKHBhdGgsIDApKTsKICAgICBpZiAoZXJyICE9IFNRTElURV9PSykgewogICAgICAgICBMT0dFKCJzcWxpdGVfY29uZmlnIGZhaWxlZCBlcnJvcl9jb2RlID0gJWQuIFRISVMgU0hPVUxEIE5FVkVSIG9jY3VyLlxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTc2LDEzICsxNzgsMTcgQEAKICAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHNxbGl0ZTNfY2xvc2UoaGFuZGxlKTsKIH0KIAotc3RhdGljIGNoYXIgKmdldERhdGFiYXNlTmFtZShKTklFbnYqIGVudiwgc3FsaXRlMyAqIGhhbmRsZSwganN0cmluZyBkYXRhYmFzZU5hbWUpIHsKK3N0YXRpYyBjaGFyICpnZXREYXRhYmFzZU5hbWUoSk5JRW52KiBlbnYsIHNxbGl0ZTMgKiBoYW5kbGUsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBzaG9ydCBjb25uTnVtKSB7CiAgICAgY2hhciBjb25zdCAqcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZGF0YWJhc2VOYW1lLCBOVUxMKTsKICAgICBpZiAocGF0aCA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIkZhaWx1cmUgaW4gZ2V0RGF0YWJhc2VOYW1lKCkuIFZNIHJhbiBvdXQgb2YgbWVtb3J5P1xuIik7CiAgICAgICAgIHJldHVybiBOVUxMOyAvLyBWTSB3b3VsZCBoYXZlIHRocm93biBPdXRPZk1lbW9yeUVycm9yCiAgICAgfQotICAgIGNoYXIgKmRiTmFtZVN0ciA9IGNyZWF0ZVN0cihwYXRoKTsKKyAgICBjaGFyICpkYk5hbWVTdHIgPSBjcmVhdGVTdHIocGF0aCwgNCk7CisgICAgaWYgKGNvbm5OdW0gPiA5OTkpIHsgLy8gVE9ETzogaWYgbnVtYmVyIG9mIHBvb2xlZCBjb25uZWN0aW9ucyA+IDk5OSwgZml4IHRoaXMgbGluZS4KKyAgICAgIGNvbm5OdW0gPSAtMTsKKyAgICB9CisgICAgc3ByaW50ZihkYk5hbWVTdHIgKyBzdHJsZW4ocGF0aCksICJ8JTAzZCIsIGNvbm5OdW0pOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRhdGFiYXNlTmFtZSwgcGF0aCk7CiAgICAgcmV0dXJuIGRiTmFtZVN0cjsKIH0KQEAgLTE5MiwxMCArMTk4LDEwIEBACiB9CiAKIC8qIHB1YmxpYyBuYXRpdmUgdm9pZCBlbmFibGVTcWxUcmFjaW5nKCk7ICovCi1zdGF0aWMgdm9pZCBlbmFibGVTcWxUcmFjaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUpCitzdGF0aWMgdm9pZCBlbmFibGVTcWxUcmFjaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwganN0cmluZyBkYXRhYmFzZU5hbWUsIGpzaG9ydCBjb25uVHlwZSkKIHsKICAgICBzcWxpdGUzICogaGFuZGxlID0gKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgb2Zmc2V0X2RiX2hhbmRsZSk7Ci0gICAgc3FsaXRlM190cmFjZShoYW5kbGUsICZzcWxUcmFjZSwgKHZvaWQgKilnZXREYXRhYmFzZU5hbWUoZW52LCBoYW5kbGUsIGRhdGFiYXNlTmFtZSkpOworICAgIHNxbGl0ZTNfdHJhY2UoaGFuZGxlLCAmc3FsVHJhY2UsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUsIGNvbm5UeXBlKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNxbFByb2ZpbGUodm9pZCAqZGF0YWJhc2VOYW1lLCBjb25zdCBjaGFyICpzcWwsIHNxbGl0ZTNfdWludDY0IHRtKSB7CkBAIC0yMDQsMTMgKzIxMCwxMyBAQAogfQogCiAvKiBwdWJsaWMgbmF0aXZlIHZvaWQgZW5hYmxlU3FsUHJvZmlsaW5nKCk7ICovCi1zdGF0aWMgdm9pZCBlbmFibGVTcWxQcm9maWxpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIGRhdGFiYXNlTmFtZSkKK3N0YXRpYyB2b2lkIGVuYWJsZVNxbFByb2ZpbGluZyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgZGF0YWJhc2VOYW1lLCBqc2hvcnQgY29ublR5cGUpCiB7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotICAgIHNxbGl0ZTNfcHJvZmlsZShoYW5kbGUsICZzcWxQcm9maWxlLCAodm9pZCAqKWdldERhdGFiYXNlTmFtZShlbnYsIGhhbmRsZSwgZGF0YWJhc2VOYW1lKSk7CisgICAgc3FsaXRlM19wcm9maWxlKGhhbmRsZSwgJnNxbFByb2ZpbGUsICh2b2lkICopZ2V0RGF0YWJhc2VOYW1lKGVudiwgaGFuZGxlLCBkYXRhYmFzZU5hbWUsCisgICAgICAgICAgICBjb25uVHlwZSkpOwogfQogCi0KIC8qIHB1YmxpYyBuYXRpdmUgdm9pZCBjbG9zZSgpOyAqLwogc3RhdGljIHZvaWQgZGJjbG9zZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCiB7CkBAIC0yNDAsNzMgKzI0Niw2IEBACiAgICAgfQogfQogCi0vKiBwdWJsaWMgbmF0aXZlIHZvaWQgbmF0aXZlX2V4ZWNTUUwoU3RyaW5nIHNxbCk7ICovCi1zdGF0aWMgdm9pZCBuYXRpdmVfZXhlY1NRTChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgc3FsU3RyaW5nKQotewotICAgIGludCBlcnI7Ci0gICAgaW50IHN0ZXBFcnI7Ci0gICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gTlVMTDsKLSAgICBzcWxpdGUzICogaGFuZGxlID0gKHNxbGl0ZTMgKillbnYtPkdldEludEZpZWxkKG9iamVjdCwgb2Zmc2V0X2RiX2hhbmRsZSk7Ci0gICAgamNoYXIgY29uc3QgKiBzcWwgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAganNpemUgc3FsTGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3FsU3RyaW5nKTsKLQotICAgIGlmIChzcWwgPT0gTlVMTCB8fCBzcWxMZW4gPT0gMCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIllvdSBtdXN0IHN1cHBseSBhbiBTUUwgc3RyaW5nIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBlcnIgPSBzcWxpdGUzX3ByZXBhcmUxNl92MihoYW5kbGUsIHNxbCwgc3FsTGVuICogMiwgJnN0YXRlbWVudCwgTlVMTCk7Ci0KLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhzcWxTdHJpbmcsIHNxbCk7Ci0KLSAgICBpZiAoZXJyICE9IFNRTElURV9PSykgewotICAgICAgICBjaGFyIGNvbnN0ICogc3FsOCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBOVUxMKTsKLSAgICAgICAgTE9HRSgiRmFpbHVyZSAlZCAoJXMpIG9uICVwIHdoZW4gcHJlcGFyaW5nICclcycuXG4iLCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSksIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgaGFuZGxlLCBzcWw4KTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZXBFcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKLSAgICBlcnIgPSBzcWxpdGUzX2ZpbmFsaXplKHN0YXRlbWVudCk7Ci0KLSAgICBpZiAoc3RlcEVyciAhPSBTUUxJVEVfRE9ORSkgewotICAgICAgICBpZiAoc3RlcEVyciA9PSBTUUxJVEVfUk9XKSB7Ci0gICAgICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsICJRdWVyaWVzIGNhbm5vdCBiZSBwZXJmb3JtZWQgdXNpbmcgZXhlY1NRTCgpLCB1c2UgcXVlcnkoKSBpbnN0ZWFkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciBjb25zdCAqIHNxbDggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgTlVMTCk7Ci0gICAgICAgICAgICBMT0dFKCJGYWlsdXJlICVkICglcykgb24gJXAgd2hlbiBleGVjdXRpbmcgJyVzJ1xuIiwgZXJyLCBzcWxpdGUzX2Vycm1zZyhoYW5kbGUpLCBoYW5kbGUsIHNxbDgpOwotICAgICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb24oZW52LCBoYW5kbGUsIHNxbDgpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3FsU3RyaW5nLCBzcWw4KTsKLQotICAgICAgICB9Ci0gICAgfSBlbHNlCi0jaWZuZGVmIERCX0xPR19TVEFURU1FTlRTCi0gICAgSUZfTE9HVigpCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIGNoYXIgY29uc3QgKiBzcWw4ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcWxTdHJpbmcsIE5VTEwpOwotICAgICAgICBMT0dWKCJTdWNjZXNzIG9uICVwIHdoZW4gZXhlY3V0aW5nICclcydcbiIsIGhhbmRsZSwgc3FsOCk7Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHNxbFN0cmluZywgc3FsOCk7Ci0gICAgfQotfQotCi0vKiBuYXRpdmUgbG9uZyBsYXN0SW5zZXJ0Um93KCk7ICovCi1zdGF0aWMgamxvbmcgbGFzdEluc2VydFJvdyhKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCi17Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotCi0gICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoaGFuZGxlKTsKLX0KLQotLyogbmF0aXZlIGludCBsYXN0Q2hhbmdlQ291bnQoKTsgKi8KLXN0YXRpYyBqaW50IGxhc3RDaGFuZ2VDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCi17Ci0gICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOwotCi0gICAgcmV0dXJuIHNxbGl0ZTNfY2hhbmdlcyhoYW5kbGUpOwotfQotCiAvKiBuYXRpdmUgaW50IG5hdGl2ZV9nZXREYkxvb2thc2lkZSgpOyAqLwogc3RhdGljIGppbnQgbmF0aXZlX2dldERiTG9va2FzaWRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKIHsKQEAgLTQ0MywxOSArMzgyLDkzIEBACiAgICAgcmV0dXJuIHNxbGl0ZTNfcmVsZWFzZV9tZW1vcnkoU1FMSVRFX1NPRlRfSEVBUF9MSU1JVCk7CiB9CiAKK3N0YXRpYyB2b2lkIG5hdGl2ZV9maW5hbGl6ZShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QsIGppbnQgc3RhdGVtZW50SWQpCit7CisgICAgaWYgKHN0YXRlbWVudElkID4gMCkgeworICAgICAgICBzcWxpdGUzX2ZpbmFsaXplKChzcWxpdGUzX3N0bXQgKilzdGF0ZW1lbnRJZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICogY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUgKiogYXJndikgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGlmICghZW52KSB7CisgICAgICAgIExPR0UoImN1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayBjYW5ub3QgY2FsbCBpbnRvIEphdmEgb24gdGhpcyB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBnZXQgZ2xvYmFsIHJlZiB0byBDdXN0b21GdW5jdGlvbiBvYmplY3QgZnJvbSBvdXIgdXNlciBkYXRhCisgICAgam9iamVjdCBmdW5jdGlvbiA9IChqb2JqZWN0KXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOworCisgICAgLy8gcGFjayB1cCB0aGUgYXJndW1lbnRzIGludG8gYSBzdHJpbmcgYXJyYXkKKyAgICBpZiAoIXN0cmluZ19jbGFzcykKKyAgICAgICAgc3RyaW5nX2NsYXNzID0gKGpjbGFzcyllbnYtPk5ld0dsb2JhbFJlZihlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpKTsKKyAgICBqb2JqZWN0QXJyYXkgc3RyQXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KGFyZ2MsIHN0cmluZ19jbGFzcywgTlVMTCk7CisgICAgaWYgKCFzdHJBcnJheSkKKyAgICAgICAgZ290byBkb25lOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNoYXIqIGFyZyA9IChjaGFyICopc3FsaXRlM192YWx1ZV90ZXh0KGFyZ3ZbaV0pOworICAgICAgICBpZiAoIWFyZykgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBhcmd1bWVudCBpbiBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2suICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGpvYmplY3Qgb2JqID0gZW52LT5OZXdTdHJpbmdVVEYoYXJnKTsKKyAgICAgICAgaWYgKCFvYmopCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHN0ckFycmF5LCBpLCBvYmopOworICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7CisgICAgfQorCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChmdW5jdGlvbiwgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjaywgc3RyQXJyYXkpOworCitkb25lOgorICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY3VzdG9tIHNxbGl0ZTMgZnVuY3Rpb24uIik7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworc3RhdGljIGppbnQgbmF0aXZlX2FkZEN1c3RvbUZ1bmN0aW9uKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCwKKyAgICAgICAganN0cmluZyBuYW1lLCBqaW50IG51bUFyZ3MsIGpvYmplY3QgZnVuY3Rpb24pCit7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IChzcWxpdGUzICopZW52LT5HZXRJbnRGaWVsZChvYmplY3QsIG9mZnNldF9kYl9oYW5kbGUpOworICAgIGNoYXIgY29uc3QgKm5hbWVTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKG5hbWUsIE5VTEwpOworICAgIGpvYmplY3QgcmVmID0gZW52LT5OZXdHbG9iYWxSZWYoZnVuY3Rpb24pOworICAgIExPR0QoIm5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbiAlcyByZWY6ICVwIiwgbmFtZVN0ciwgcmVmKTsKKyAgICBpbnQgZXJyID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oaGFuZGxlLCBuYW1lU3RyLCBudW1BcmdzLCBTUUxJVEVfVVRGOCwKKyAgICAgICAgICAgICh2b2lkICopcmVmLCBjdXN0b21fZnVuY3Rpb25fY2FsbGJhY2ssIE5VTEwsIE5VTEwpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKG5hbWUsIG5hbWVTdHIpOworCisgICAgaWYgKGVyciA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiAoaW50KXJlZjsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgic3FsaXRlM19jcmVhdGVfZnVuY3Rpb24gcmV0dXJuZWQgJWQiLCBlcnIpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihyZWYpOworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAwOworICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb24oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0LCBqaW50IHJlZikKK3sKKyAgICBMT0dEKCJuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uICVkIiwgcmVmKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZigoam9iamVjdClyZWYpOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPQogewogICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsiZGJvcGVuIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAodm9pZCAqKWRib3Blbn0sCiAgICAgeyJkYmNsb3NlIiwgIigpViIsICh2b2lkICopZGJjbG9zZX0sCi0gICAgeyJlbmFibGVTcWxUcmFjaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopZW5hYmxlU3FsVHJhY2luZ30sCi0gICAgeyJlbmFibGVTcWxQcm9maWxpbmciLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKillbmFibGVTcWxQcm9maWxpbmd9LAotICAgIHsibmF0aXZlX2V4ZWNTUUwiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKiluYXRpdmVfZXhlY1NRTH0sCi0gICAgeyJsYXN0SW5zZXJ0Um93IiwgIigpSiIsICh2b2lkICopbGFzdEluc2VydFJvd30sCi0gICAgeyJsYXN0Q2hhbmdlQ291bnQiLCAiKClJIiwgKHZvaWQgKilsYXN0Q2hhbmdlQ291bnR9LAorICAgIHsiZW5hYmxlU3FsVHJhY2luZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7UylWIiwgKHZvaWQgKillbmFibGVTcWxUcmFjaW5nfSwKKyAgICB7ImVuYWJsZVNxbFByb2ZpbGluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7UylWIiwgKHZvaWQgKillbmFibGVTcWxQcm9maWxpbmd9LAogICAgIHsibmF0aXZlX3NldExvY2FsZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIiwgKHZvaWQgKiluYXRpdmVfc2V0TG9jYWxlfSwKICAgICB7Im5hdGl2ZV9nZXREYkxvb2thc2lkZSIsICIoKUkiLCAodm9pZCAqKW5hdGl2ZV9nZXREYkxvb2thc2lkZX0sCiAgICAgeyJyZWxlYXNlTWVtb3J5IiwgIigpSSIsICh2b2lkICopbmF0aXZlX3JlbGVhc2VNZW1vcnl9LAorICAgIHsibmF0aXZlX2ZpbmFsaXplIiwgIihJKVYiLCAodm9pZCAqKW5hdGl2ZV9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfYWRkQ3VzdG9tRnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0lMYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2UkQ3VzdG9tRnVuY3Rpb247KUkiLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW5hdGl2ZV9hZGRDdXN0b21GdW5jdGlvbn0sCisgICAgeyJuYXRpdmVfcmVsZWFzZUN1c3RvbUZ1bmN0aW9uIiwgIihJKVYiLCAodm9pZCAqKW5hdGl2ZV9yZWxlYXNlQ3VzdG9tRnVuY3Rpb259LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UoSk5JRW52ICplbnYpCkBAIC00NzQsNyArNDg3LDE5IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlJEN1c3RvbUZ1bmN0aW9uIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSRDdXN0b21GdW5jdGlvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2N1c3RvbV9mdW5jdGlvbl9jYWxsYmFjayA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJjYWxsYmFjayIsICIoW0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgaWYgKG1ldGhvZF9jdXN0b21fZnVuY3Rpb25fY2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIG1ldGhvZCBTUUxpdGVEYXRhYmFzZS5DdXN0b21GdW5jdGlvbi5jYWxsYmFja1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZSIsCisgICAgICAgICAgICBzTWV0aG9kcywgTkVMRU0oc01ldGhvZHMpKTsKIH0KIAogLyogdGhyb3cgYSBTUUxpdGVFeGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgYXBwcm9wcmlhdGUgZm9yIHRoZSBlcnJvciBpbiBoYW5kbGUgKi8KQEAgLTUyMyw2ICs1NDgsNyBAQAogICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGlza0lPRXhjZXB0aW9uIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNRTElURV9DT1JSVVBUOgorICAgICAgICBjYXNlIFNRTElURV9OT1RBREI6IC8vIHRyZWF0ICJ1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdCIgZXJyb3IgYXMgY29ycnVwdGlvbiBhbHNvCiAgICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVEYXRhYmFzZUNvcnJ1cHRFeGNlcHRpb24iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1FMSVRFX0NPTlNUUkFJTlQ6CkBAIC01NDAsNiArNTY2LDM2IEBACiAgICAgICAgIGNhc2UgU1FMSVRFX01JU1VTRToKICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlTWlzdXNlRXhjZXB0aW9uIjsKICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1FMSVRFX1BFUk06CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUFjY2Vzc1Blcm1FeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfQlVTWToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VMb2NrZWRFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTE9DS0VEOgorICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVUYWJsZUxvY2tlZEV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9SRUFET05MWToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUmVhZE9ubHlEYXRhYmFzZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9DQU5UT1BFTjoKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ2FudE9wZW5EYXRhYmFzZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9UT09CSUc6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJsb2JUb29CaWdFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfUkFOR0U6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUJpbmRPckNvbHVtbkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRTElURV9OT01FTToKKyAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3MgPSAiYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlT3V0T2ZNZW1vcnlFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfTUlTTUFUQ0g6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGF0eXBlTWlzbWF0Y2hFeGNlcHRpb24iOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTUUxJVEVfVU5DTE9TRUQ6CisgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gImFuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVVuZmluYWxpemVkT2JqZWN0c0V4Y2VwdGlvbiI7CisgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBleGNlcHRpb25DbGFzcyA9ICJhbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVFeGNlcHRpb24iOwogICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVRdWVyeS5jcHAKaW5kZXggNDQyNzE2ODMuLmQxOGNmZDggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlUXVlcnkuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIAogI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yIgorI2RlZmluZSBMT0dfVEFHICJTcWxpdGVDdXJzb3IuY3BwIgogCiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8Sk5JSGVscC5oPgpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSAiQ3Vyc29yV2luZG93LmgiCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAKIApAQCAtMTE2LDYgKzExNiw3IEBACiAgICAgaW50IHJldHJ5Q291bnQ7CiAgICAgaW50IGJvdW5kUGFyYW1zOwogICAgIEN1cnNvcldpbmRvdyAqIHdpbmRvdzsKKyAgICBib29sIGdvdEFsbFJvd3MgPSB0cnVlOwogICAgIAogICAgIGlmIChzdGF0ZW1lbnQgPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJJbnZhbGlkIHN0YXRlbWVudCBpbiBmaWxsV2luZG93KCkiKTsKQEAgLTEzMSw4ICsxMzIsNyBAQAogICAgICAgICBlcnIgPSBzcWxpdGUzX2JpbmRfaW50KHN0YXRlbWVudCwgb2Zmc2V0UGFyYW0sIHN0YXJ0UG9zKTsKICAgICAgICAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBiaW5kIG9mZnNldCBwb3NpdGlvbiwgb2Zmc2V0UGFyYW0gPSAlZCIsIG9mZnNldFBhcmFtKTsKLSAgICAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlM19lcnJtc2coR0VUX0hBTkRMRShlbnYsIG9iamVjdCkpKTsKKyAgICAgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uKGVudiwgR0VUX0hBTkRMRShlbnYsIG9iamVjdCkpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgTE9HX1dJTkRPVygiQm91bmQgdG8gc3RhcnRQb3MgJWQiLCBzdGFydFBvcyk7CkBAIC0xODIsNyArMTgyLDggQEAKICAgICAgICAgICAgICAgICBmaWVsZF9zbG90X3QgKiBmaWVsZERpciA9IHdpbmRvdy0+YWxsb2NSb3coKTsKICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIGZpZWxkRGlyIGF0IHN0YXJ0UG9zICVkIHJvdyAlZCIsIHN0YXJ0UG9zLCBudW1Sb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93cyArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX2NvdW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjA1LDkgKzIwNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0ZXh0L2Jsb2IgYXQgJWQsJWQiLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiRmFpbGVkIGFsbG9jYXRpbmcgJXUgYnl0ZXMgZm9yIHRleHQvYmxvYiBhdCAlZCwlZCIsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zICsgbnVtUm93cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RBbGxSb3dzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9jb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29weUluKG9mZnNldCwgdGV4dCwgc2l6ZSk7CkBAIC0yMjYsNyArMjI4LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3ctPnB1dExvbmcobnVtUm93cywgaSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZyZWVMYXN0Um93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UG9zICsgbnVtUm93cyArIGZpbmlzaF9wcm9ncmFtX2FuZF9nZXRfcm93X2NvdW50KHN0YXRlbWVudCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290QWxsUm93cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fY291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgTE9HX1dJTkRPVygiJWQsJWQgaXMgSU5URUdFUiAweCUwMTZsbHgiLCBzdGFydFBvcyArIG51bVJvd3MsIGksIHZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU1FMSVRFX0ZMT0FUKSB7CkBAIC0yMzUsNyArMjM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3ctPnB1dERvdWJsZShudW1Sb3dzLCBpLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIGRvdWJsZSBpbiBjb2x1bW4gJWQiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFBvcyArIG51bVJvd3MgKyBmaW5pc2hfcHJvZ3JhbV9hbmRfZ2V0X3Jvd19jb3VudChzdGF0ZW1lbnQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdEFsbFJvd3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX2NvdW50OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIExPR19XSU5ET1coIiVkLCVkIGlzIEZMT0FUICVsZiIsIHN0YXJ0UG9zICsgbnVtUm93cywgaSwgdmFsdWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBTUUxJVEVfQkxPQikgewpAQCAtMjQ1LDkgKzI0OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciBibG9iIGF0ICVkLCVkIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciBibG9iIGF0ICVkLCVkIiwgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgKyBudW1Sb3dzLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydFBvcyArIG51bVJvd3MgKyBmaW5pc2hfcHJvZ3JhbV9hbmRfZ2V0X3Jvd19jb3VudChzdGF0ZW1lbnQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdEFsbFJvd3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0dXJuX2NvdW50OwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgd2luZG93LT5jb3B5SW4ob2Zmc2V0LCBibG9iLCBzaXplKTsKQEAgLTMwNiwxMiArMzExLDI0IEBACiAKICAgICBMT0dfV0lORE9XKCJSZXNldHRpbmcgc3RhdGVtZW50ICVwIGFmdGVyIGZldGNoaW5nICVkIHJvd3MgaW4gJWQgYnl0ZXNcblxuXG5cbiIsIHN0YXRlbWVudCwKICAgICAgICAgICAgIG51bVJvd3MsIHdpbmRvdy0+c2l6ZSgpIC0gd2luZG93LT5mcmVlU3BhY2UoKSk7Ci0vLyAgICBMT0dJKCJGaWxsZWQgd2luZG93IHdpdGggJWQgcm93cyBpbiAlZCBieXRlcyIsIG51bVJvd3MsIHdpbmRvdy0+c2l6ZSgpIC0gd2luZG93LT5mcmVlU3BhY2UoKSk7CisgICAgTE9HX1dJTkRPVygiRmlsbGVkIHdpbmRvdyB3aXRoICVkIHJvd3MgaW4gJWQgYnl0ZXMiLCBudW1Sb3dzLAorICAgICAgICAgICAgd2luZG93LT5zaXplKCkgLSB3aW5kb3ctPmZyZWVTcGFjZSgpKTsKICAgICBpZiAoZXJyID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGJlIHJldHVybmVkLiBsZXQgdGhlIGNhbGxlciBrbm93IGJ5IHJldHVybmluZyAtMQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgIHJldHVybl9jb3VudDoKKyAgICBpZiAoc3RhcnRQb3MpIHsKICAgICAgICAgc3FsaXRlM19yZXNldChzdGF0ZW1lbnQpOwotICAgICAgICByZXR1cm4gc3RhcnRQb3MgKyBudW1Sb3dzOworICAgICAgICBMT0dfV0lORE9XKCJOb3QgZG9pbmcgY291bnQoKikgYmVjYXVzZSBzdGFydFBvcyAlZCBpcyBub24temVybyIsIHN0YXJ0UG9zKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChnb3RBbGxSb3dzKSB7CisgICAgICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKKyAgICAgICAgTE9HX1dJTkRPVygiTm90IGRvaW5nIGNvdW50KCopIGJlY2F1c2Ugd2UgYWxyZWFkeSBrbm93IHRoZSBjb3VudCgqKSIpOworICAgICAgICByZXR1cm4gbnVtUm93czsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBzaW5jZSBzdGFydFBvcyA9PSAwLCB3ZSBuZWVkIHRvIGdldCB0aGUgY291bnQoKikgb2YgdGhlIHJlc3VsdCBzZXQKKyAgICAgICAgcmV0dXJuIG51bVJvd3MgKyAxICsgZmluaXNoX3Byb2dyYW1fYW5kX2dldF9yb3dfY291bnQoc3RhdGVtZW50KTsKICAgICB9CiB9CiAKQEAgLTMzNiw3ICszNTMsOCBAQAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZmlsbF93aW5kb3ciLCAiKExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdztJSUlJKUkiLCAodm9pZCAqKW5hdGl2ZV9maWxsX3dpbmRvd30sCisgICAgeyJuYXRpdmVfZmlsbF93aW5kb3ciLCAiKExhbmRyb2lkL2RhdGFiYXNlL0N1cnNvcldpbmRvdztJSUlJKUkiLAorICAgICAgICAgICAgKHZvaWQgKiluYXRpdmVfZmlsbF93aW5kb3d9LAogICAgIHsibmF0aXZlX2NvbHVtbl9jb3VudCIsICIoKUkiLCAodm9pZCopbmF0aXZlX2NvbHVtbl9jb3VudH0sCiAgICAgeyJuYXRpdmVfY29sdW1uX25hbWUiLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKiluYXRpdmVfY29sdW1uX25hbWV9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50LmNwcAppbmRleCBmZjJlZDVkLi4wZjMxMTRiIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2RhdGFiYXNlX1NRTGl0ZVN0YXRlbWVudC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVTdGF0ZW1lbnQuY3BwCkBAIC0xNiw3ICsxNiw5IEBACiAqLwogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJDdXJzb3IiCisjZGVmaW5lIExPR19UQUcgIlNRTGl0ZVN0YXRlbWVudENwcCIKKworI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKIAogI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPEpOSUhlbHAuaD4KQEAgLTI0LDExICsyNiwxNiBAQAogCiAjaW5jbHVkZSA8c3FsaXRlMy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogI2luY2x1ZGUgInNxbGl0ZTNfZXhjZXB0aW9uLmgiCiAKQEAgLTQ4LDIyICs1NSw0MCBAQAogICAgICAgICAoc3FsaXRlMyAqKWVudi0+R2V0SW50RmllbGQob2JqZWN0LCBnSGFuZGxlRmllbGQpCiAKIAotc3RhdGljIHZvaWQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQorc3RhdGljIGppbnQgbmF0aXZlX2V4ZWN1dGUoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KQogewogICAgIGludCBlcnI7CiAgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOwogICAgIHNxbGl0ZTNfc3RtdCAqIHN0YXRlbWVudCA9IEdFVF9TVEFURU1FTlQoZW52LCBvYmplY3QpOworICAgIGludCBudW1DaGFuZ2VzID0gLTE7CiAKICAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKICAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKIAotICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cmVkCi0gICAgaWYgKGVyciAhPSBTUUxJVEVfRE9ORSkgeworICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgIGlmIChlcnIgPT0gU1FMSVRFX1JPVykgeworICAgICAgICB0aHJvd19zcWxpdGUzX2V4Y2VwdGlvbihlbnYsCisgICAgICAgICAgICAgICAgIlF1ZXJpZXMgY2FuIGJlIHBlcmZvcm1lZCB1c2luZyBTUUxpdGVEYXRhYmFzZSBxdWVyeSBvciByYXdRdWVyeSBtZXRob2RzIG9ubHkuIik7CisgICAgfSBlbHNlIGlmIChlcnIgIT0gU1FMSVRFX0RPTkUpIHsKICAgICAgICAgdGhyb3dfc3FsaXRlM19leGNlcHRpb25fZXJyY29kZShlbnYsIGVyciwgc3FsaXRlM19lcnJtc2coaGFuZGxlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtQ2hhbmdlcyA9IHNxbGl0ZTNfY2hhbmdlcyhoYW5kbGUpOwogICAgIH0KIAotICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIC8vIFJlc2V0IHRoZSBzdGF0ZW1lbnQgc28gaXQncyByZWFkeSB0byB1c2UgYWdhaW4KICAgICBzcWxpdGUzX3Jlc2V0KHN0YXRlbWVudCk7CisgICAgcmV0dXJuIG51bUNoYW5nZXM7Cit9CisKK3N0YXRpYyBqbG9uZyBuYXRpdmVfZXhlY3V0ZUluc2VydChKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgc3FsaXRlMyAqIGhhbmRsZSA9IEdFVF9IQU5ETEUoZW52LCBvYmplY3QpOworICAgIGppbnQgbnVtQ2hhbmdlcyA9IG5hdGl2ZV9leGVjdXRlKGVudiwgb2JqZWN0KTsKKyAgICBpZiAobnVtQ2hhbmdlcyA+IDApIHsKKyAgICAgICAgcmV0dXJuIHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgamxvbmcgbmF0aXZlXzF4MV9sb25nKEpOSUVudiogZW52LCBqb2JqZWN0IG9iamVjdCkKQEAgLTExNSwxMyArMTQwLDExMyBAQAogICAgIHJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGpvYmplY3QgY3JlYXRlUGFyY2VsRmlsZURlc2NyaXB0b3IoSk5JRW52ICogZW52LCBpbnQgZmQpCit7CisgICAgLy8gQ3JlYXRlIEZpbGVEZXNjcmlwdG9yIG9iamVjdAorICAgIGpvYmplY3QgZmlsZURlc2MgPSBuZXdGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKKyAgICBpZiAoZmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIGpvYmplY3QgcGFyY2VsRmlsZURlc2MgPSBuZXdQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZpbGVEZXNjKTsKKyAgICBpZiAocGFyY2VsRmlsZURlc2MgPT0gTlVMTCkgeworICAgICAgICAvLyBQYXJjZWxGaWxlRGVzY3JpcHRvciBjb25zdHJ1Y3RvciBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwYXJjZWxGaWxlRGVzYzsKK30KKworLy8gQ3JlYXRlcyBhbiBhc2htZW0gYXJlYSwgY29waWVzIHNvbWUgZGF0YSBpbnRvIGl0LCBhbmQgcmV0dXJucworLy8gYSBQYXJjZWxGaWxlRGVzY3JpcHRvciBmb3IgdGhlIGFzaG1lbSBhcmVhLgorc3RhdGljIGpvYmplY3QgY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKEpOSUVudiAqIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICAvLyBDcmVhdGUgYXNobWVtIGFyZWEKKyAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihOVUxMLCBsZW5ndGgpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HRSgiYXNobWVtX2NyZWF0ZV9yZWdpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGpuaVRocm93SU9FeGNlcHRpb24oZW52LCBlcnJubyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgIC8vIG1tYXAgdGhlIGFzaG1lbSBhcmVhCisgICAgICAgIHZvaWQgKiBhc2htZW1fcHRyID0KKyAgICAgICAgICAgICAgICBtbWFwKE5VTEwsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOworICAgICAgICBpZiAoYXNobWVtX3B0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJtbWFwIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgam5pVGhyb3dJT0V4Y2VwdGlvbihlbnYsIGVycm5vKTsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBkYXRhIHRvIGFzaG1lbSBhcmVhCisgICAgICAgIG1lbWNweShhc2htZW1fcHRyLCBkYXRhLCBsZW5ndGgpOworCisgICAgICAgIC8vIG11bm1hcCBhc2htZW0gYXJlYQorICAgICAgICBpZiAobXVubWFwKGFzaG1lbV9wdHIsIGxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJtdW5tYXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNYWtlIGFzaG1lbSBhcmVhIHJlYWQtb25seQorICAgIGlmIChhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQpIDwgMCkgeworICAgICAgICBMT0dFKCJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBqbmlUaHJvd0lPRXhjZXB0aW9uKGVudiwgZXJybm8pOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFdyYXAgaXQgaW4gYSBQYXJjZWxGaWxlRGVzY3JpcHRvcgorICAgIHJldHVybiBjcmVhdGVQYXJjZWxGaWxlRGVzY3JpcHRvcihlbnYsIGZkKTsKK30KKworc3RhdGljIGpvYmplY3QgbmF0aXZlXzF4MV9ibG9iX2FzaG1lbShKTklFbnYqIGVudiwgam9iamVjdCBvYmplY3QpCit7CisgICAgaW50IGVycjsKKyAgICBzcWxpdGUzICogaGFuZGxlID0gR0VUX0hBTkRMRShlbnYsIG9iamVjdCk7CisgICAgc3FsaXRlM19zdG10ICogc3RhdGVtZW50ID0gR0VUX1NUQVRFTUVOVChlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCB2YWx1ZSA9IE5VTEw7CisKKyAgICAvLyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKKyAgICBlcnIgPSBzcWxpdGUzX3N0ZXAoc3RhdGVtZW50KTsKKworICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0CisgICAgaWYgKGVyciA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIC8vIE5vIGVycm9ycywgcmVhZCB0aGUgZGF0YSBhbmQgcmV0dXJuIGl0CisgICAgICAgIGNvbnN0IHZvaWQgKiBibG9iID0gc3FsaXRlM19jb2x1bW5fYmxvYihzdGF0ZW1lbnQsIDApOworICAgICAgICBpZiAoYmxvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gc3FsaXRlM19jb2x1bW5fYnl0ZXMoc3RhdGVtZW50LCAwKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY3JlYXRlX2FzaG1lbV9yZWdpb25fd2l0aF9kYXRhKGVudiwgYmxvYiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93X3NxbGl0ZTNfZXhjZXB0aW9uX2VycmNvZGUoZW52LCBlcnIsIHNxbGl0ZTNfZXJybXNnKGhhbmRsZSkpOworICAgIH0KKworICAgIC8vIFJlc2V0IHRoZSBzdGF0bWVudCBzbyBpdCdzIHJlYWR5IHRvIHVzZSBhZ2FpbgorICAgIHNxbGl0ZTNfcmVzZXQoc3RhdGVtZW50KTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0KIHsKICAgICAgLyogbmFtZSwgc2lnbmF0dXJlLCBmdW5jUHRyICovCi0gICAgeyJuYXRpdmVfZXhlY3V0ZSIsICIoKVYiLCAodm9pZCAqKW5hdGl2ZV9leGVjdXRlfSwKKyAgICB7Im5hdGl2ZV9leGVjdXRlIiwgIigpSSIsICh2b2lkICopbmF0aXZlX2V4ZWN1dGV9LAorICAgIHsibmF0aXZlX2V4ZWN1dGVJbnNlcnQiLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfZXhlY3V0ZUluc2VydH0sCiAgICAgeyJuYXRpdmVfMXgxX2xvbmciLCAiKClKIiwgKHZvaWQgKiluYXRpdmVfMXgxX2xvbmd9LAogICAgIHsibmF0aXZlXzF4MV9zdHJpbmciLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfc3RyaW5nfSwKKyAgICB7Im5hdGl2ZV8xeDFfYmxvYl9hc2htZW0iLCAiKClMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLCAodm9pZCAqKW5hdGl2ZV8xeDFfYmxvYl9hc2htZW19LAogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlU3RhdGVtZW50KEpOSUVudiAqIGVudikKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbmV0X05ldFV0aWxzLmNwcAppbmRleCA2NTc1YjlhLi4zNTFmMjY0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX25ldF9OZXRVdGlscy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfTmV0VXRpbHMuY3BwCkBAIC0yMjQsNyArMjI0LDggQEAKICAgICB7ICJhZGRSb3V0ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvU3RyaW5nOylJIiwKICAgICAgICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2FkZFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlSG9zdFJvdXRlcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAgKHZvaWQgKilhbmRyb2lkX25ldF91dGlsc19yZW1vdmVIb3N0Um91dGVzIH0sCi0gICAgeyAiZ2V0RGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX2dldERlZmF1bHRSb3V0ZSB9LAorICAgIHsgImdldERlZmF1bHRSb3V0ZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLAorICAgICAgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfZ2V0RGVmYXVsdFJvdXRlIH0sCiAgICAgeyAicmVtb3ZlRGVmYXVsdFJvdXRlIiwgIihMamF2YS9sYW5nL1N0cmluZzspSSIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3JlbW92ZURlZmF1bHRSb3V0ZSB9LAogICAgIHsgInJlc2V0Q29ubmVjdGlvbnMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgICh2b2lkICopYW5kcm9pZF9uZXRfdXRpbHNfcmVzZXRDb25uZWN0aW9ucyB9LAogICAgIHsgInJ1bkRoY3AiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICAodm9pZCAqKWFuZHJvaWRfbmV0X3V0aWxzX3J1bkRoY3AgfSwKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25ldF93aWZpX1dpZmkuY3BwCmluZGV4IGZiMDI5ZTYuLmM1Y2NjNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbmV0X3dpZmlfV2lmaS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9uZXRfd2lmaV9XaWZpLmNwcApAQCAtOTgsNiArOTgsMTEgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2lzRHJpdmVyTG9hZGVkKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQoreworICAgIHJldHVybiAoamJvb2xlYW4pKDo6aXNfd2lmaV9kcml2ZXJfbG9hZGVkKCkgPT0gMSk7Cit9CisKIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2xvYWREcml2ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopCiB7CiAgICAgcmV0dXJuIChqYm9vbGVhbikoOjp3aWZpX2xvYWRfZHJpdmVyKCkgPT0gMCk7CkBAIC00MDYsNiArNDExLDMwIEBACiAgICAgcmV0dXJuIChqaW50KXBvd2VyOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9zZXRCYW5kQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBiYW5kKQoreworICAgIGNoYXIgY21kc3RyWzI1XTsKKworICAgIGludCBudW1Xcml0dGVuID0gc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIkRSSVZFUiBTRVRCQU5EICVkIiwgYmFuZCk7CisgICAgaW50IGNtZFRvb0xvbmcgPSBudW1Xcml0dGVuID49IChpbnQpc2l6ZW9mKGNtZHN0cik7CisKKyAgICByZXR1cm4gKGpib29sZWFuKSFjbWRUb29Mb25nICYmIGRvQm9vbGVhbkNvbW1hbmQoY21kc3RyLCAiT0siKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF9uZXRfd2lmaV9nZXRCYW5kQ29tbWFuZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKK3sKKyAgICBjaGFyIHJlcGx5WzI1XTsKKyAgICBpbnQgYmFuZDsKKworICAgIGlmIChkb0NvbW1hbmQoIkRSSVZFUiBHRVRCQU5EIiwgcmVwbHksIHNpemVvZihyZXBseSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIChqaW50KS0xOworICAgIH0KKyAgICAvLyByZXBseSBjb21lcyBiYWNrIGluIHRoZSBmb3JtICJCYW5kIFgiIHdoZXJlIFggaXMgdGhlCisgICAgLy8gbnVtYmVyIHdlJ3JlIGludGVyZXN0ZWQgaW4uCisgICAgc3NjYW5mKHJlcGx5LCAiJSpzICV1IiwgJmJhbmQpOworICAgIHJldHVybiAoamludCliYW5kOworfQorCiBzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9zZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IG51bUNoYW5uZWxzKQogewogICAgIGNoYXIgY21kc3RyWzI1Nl07CkBAIC00OTMsMTUgKzUyMiw2IEBACiAgICAgcmV0dXJuIGRvQm9vbGVhbkNvbW1hbmQoIkJMQUNLTElTVCBjbGVhciIsICJPSyIpOwogfQogCi1zdGF0aWMgamJvb2xlYW4gYW5kcm9pZF9uZXRfd2lmaV9zZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpib29sZWFuIGVuYWJsZWQpCi17Ci0gICAgY2hhciBjbWRzdHJbMjVdOwotCi0gICAgc25wcmludGYoY21kc3RyLCBzaXplb2YoY21kc3RyKSwgIkRSSVZFUiBTRVRTVVNQRU5ET1BUICVkIiwgZW5hYmxlZCA/IDAgOiAxKTsKLSAgICByZXR1cm4gZG9Cb29sZWFuQ29tbWFuZChjbWRzdHIsICJPSyIpOwotfQotCi0KIHN0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX25ldF93aWZpX2RvRGhjcFJlcXVlc3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpvYmplY3QgaW5mbykKIHsKICAgICBqaW50IGlwYWRkciwgZ2F0ZXdheSwgbWFzaywgZG5zMSwgZG5zMiwgc2VydmVyLCBsZWFzZTsKQEAgLTUzMyw2ICs1NTMsNyBAQAogICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogCiAgICAgeyAibG9hZERyaXZlciIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX2xvYWREcml2ZXIgfSwKKyAgICB7ICJpc0RyaXZlckxvYWRlZCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX2lzRHJpdmVyTG9hZGVkfSwKICAgICB7ICJ1bmxvYWREcml2ZXIiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV91bmxvYWREcml2ZXIgfSwKICAgICB7ICJzdGFydFN1cHBsaWNhbnQiLCAiKClaIiwgICh2b2lkICopYW5kcm9pZF9uZXRfd2lmaV9zdGFydFN1cHBsaWNhbnQgfSwKICAgICB7ICJzdG9wU3VwcGxpY2FudCIsICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX25ldF93aWZpX3N0b3BTdXBwbGljYW50IH0sCkBAIC01NjQsNiArNTg1LDggQEAKICAgICB7ICJzdG9wUGFja2V0RmlsdGVyaW5nIiwgIigpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zdG9wUGFja2V0RmlsdGVyaW5nIH0sCiAgICAgeyAic2V0UG93ZXJNb2RlQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldFBvd2VyTW9kZUNvbW1hbmQgfSwKICAgICB7ICJnZXRQb3dlck1vZGVDb21tYW5kIiwgIigpSSIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9nZXRQb3dlck1vZGVDb21tYW5kIH0sCisgICAgeyAic2V0QmFuZENvbW1hbmQiLCAiKEkpWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9zZXRCYW5kQ29tbWFuZH0sCisgICAgeyAiZ2V0QmFuZENvbW1hbmQiLCAiKClJIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldEJhbmRDb21tYW5kfSwKICAgICB7ICJzZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kIiwgIihJKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0TnVtQWxsb3dlZENoYW5uZWxzQ29tbWFuZCB9LAogICAgIHsgImdldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQiLCAiKClJIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQgfSwKICAgICB7ICJzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kIiwgIihJKVoiLApAQCAtNTgwLDcgKzYwMyw2IEBACiAgICAgeyAic2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZCIsICIoSSlaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX3NldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQgfSwKICAgICB7ICJhZGRUb0JsYWNrbGlzdENvbW1hbmQiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2FkZFRvQmxhY2tsaXN0Q29tbWFuZCB9LAogICAgIHsgImNsZWFyQmxhY2tsaXN0Q29tbWFuZCIsICIoKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfY2xlYXJCbGFja2xpc3RDb21tYW5kIH0sCi0gICAgeyAic2V0U3VzcGVuZE9wdGltaXphdGlvbnNDb21tYW5kIiwgIihaKVoiLCAodm9pZCopIGFuZHJvaWRfbmV0X3dpZmlfc2V0U3VzcGVuZE9wdGltaXphdGlvbnNDb21tYW5kfSwKIAogICAgIHsgImRvRGhjcFJlcXVlc3QiLCAiKExhbmRyb2lkL25ldC9EaGNwSW5mbzspWiIsICh2b2lkKikgYW5kcm9pZF9uZXRfd2lmaV9kb0RoY3BSZXF1ZXN0IH0sCiAgICAgeyAiZ2V0RGhjcEVycm9yIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQqKSBhbmRyb2lkX25ldF93aWZpX2dldERoY3BFcnJvciB9LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9vc19EZWJ1Zy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX0RlYnVnLmNwcAppbmRleCAzZWU0MDRhLi40YTg3N2QyIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX29zX0RlYnVnLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX29zX0RlYnVnLmNwcApAQCAtMTQsNiArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLm9zLkRlYnVnIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJqbmkuaCIKICNpbmNsdWRlICJ1dGlscy9taXNjLmgiCkBAIC0yNCw2ICsyNSw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2lmZGVmIEhBVkVfTUFMTE9DX0gKICNpbmNsdWRlIDxtYWxsb2MuaD4KQEAgLTI3NCw2ICsyNzcsMTc2IEBACiBqaW50IGFuZHJvaWRfb3NfRGVidWdfZ2V0UHJveHlPYmplY3RDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eik7CiBqaW50IGFuZHJvaWRfb3NfRGVidWdfZ2V0RGVhdGhPYmplY3RDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eik7CiAKKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworLyogcHVsbGVkIG91dCBvZiBiaW9uaWMgKi8KK2V4dGVybiAiQyIgdm9pZCBnZXRfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiogaW5mbywgc2l6ZV90KiBvdmVyYWxsU2l6ZSwKKyAgICBzaXplX3QqIGluZm9TaXplLCBzaXplX3QqIHRvdGFsTWVtb3J5LCBzaXplX3QqIGJhY2t0cmFjZVNpemUpOworZXh0ZXJuICJDIiB2b2lkIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiBpbmZvKTsKKyNkZWZpbmUgU0laRV9GTEFHX1pZR09URV9DSElMRCAgKDE8PDMxKQorI2RlZmluZSBCQUNLVFJBQ0VfU0laRSAgICAgICAgICAzMgorCisvKgorICogVGhpcyBpcyBhIHFzb3J0KCkgY2FsbGJhY2suCisgKgorICogU2VlIGR1bXBOYXRpdmVIZWFwKCkgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBkYXRhIGZvcm1hdCBhbmQgc29ydCBvcmRlci4KKyAqLworc3RhdGljIGludCBjb21wYXJlSGVhcFJlY29yZHMoY29uc3Qgdm9pZCogdnJlYzEsIGNvbnN0IHZvaWQqIHZyZWMyKQoreworICAgIGNvbnN0IHNpemVfdCogcmVjMSA9IChjb25zdCBzaXplX3QqKSB2cmVjMTsKKyAgICBjb25zdCBzaXplX3QqIHJlYzIgPSAoY29uc3Qgc2l6ZV90KikgdnJlYzI7CisgICAgc2l6ZV90IHNpemUxID0gKnJlYzE7CisgICAgc2l6ZV90IHNpemUyID0gKnJlYzI7CisKKyAgICBpZiAoc2l6ZTEgPCBzaXplMikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKHNpemUxID4gc2l6ZTIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludHB0cl90KiBidDEgPSAoaW50cHRyX3QqKShyZWMxICsgMik7CisgICAgaW50cHRyX3QqIGJ0MiA9IChpbnRwdHJfdCopKHJlYzIgKyAyKTsKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBCQUNLVFJBQ0VfU0laRTsgaWR4KyspIHsKKyAgICAgICAgaW50cHRyX3QgYWRkcjEgPSBidDFbaWR4XTsKKyAgICAgICAgaW50cHRyX3QgYWRkcjIgPSBidDJbaWR4XTsKKyAgICAgICAgaWYgKGFkZHIxID09IGFkZHIyKSB7CisgICAgICAgICAgICBpZiAoYWRkcjEgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRyMSA8IGFkZHIyKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkcjEgPiBhZGRyMikgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBnZXRfbWFsbG9jX2xlYWtfaW5mbygpIGNhbGwgcmV0dXJucyBhbiBhcnJheSBvZiBzdHJ1Y3RzIHRoYXQKKyAqIGxvb2sgbGlrZSB0aGlzOgorICoKKyAqICAgc2l6ZV90IHNpemUKKyAqICAgc2l6ZV90IGFsbG9jYXRpb25zCisgKiAgIGludHB0cl90IGJhY2t0cmFjZVszMl0KKyAqCisgKiAic2l6ZSIgaXMgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24sICJiYWNrdHJhY2UiIGlzIGEgZml4ZWQtc2l6ZQorICogYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMsIGFuZCAiYWxsb2NhdGlvbnMiIGlzIHRoZSBudW1iZXIgb2YKKyAqIGFsbG9jYXRpb25zIHdpdGggdGhlIGV4YWN0IHNhbWUgc2l6ZSBhbmQgYmFja3RyYWNlLgorICoKKyAqIFRoZSBlbnRyaWVzIGFyZSBzb3J0ZWQgYnkgZGVzY2VuZGluZyB0b3RhbCBzaXplIChpLmUuIHNpemUqYWxsb2NhdGlvbnMpCisgKiB0aGVuIGFsbG9jYXRpb24gY291bnQuICBGb3IgYmVzdCByZXN1bHRzIHdpdGggImRpZmYiIHdlJ2QgbGlrZSB0byBzb3J0CisgKiBwcmltYXJpbHkgYnkgaW5kaXZpZHVhbCBzaXplIHRoZW4gc3RhY2sgdHJhY2UuICBTaW5jZSB0aGUgZW50cmllcyBhcmUKKyAqIGZpeGVkLXNpemUsIGFuZCB3ZSdyZSBhbGxvd2VkIChieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikgdG8gbWFuZ2xlCisgKiB0aGVtLCB3ZSBjYW4gZG8gdGhpcyBpbiBwbGFjZS4KKyAqLworc3RhdGljIHZvaWQgZHVtcE5hdGl2ZUhlYXAoRklMRSogZnApCit7CisgICAgdWludDhfdCogaW5mbyA9IE5VTEw7CisgICAgc2l6ZV90IG92ZXJhbGxTaXplLCBpbmZvU2l6ZSwgdG90YWxNZW1vcnksIGJhY2t0cmFjZVNpemU7CisKKyAgICBnZXRfbWFsbG9jX2xlYWtfaW5mbygmaW5mbywgJm92ZXJhbGxTaXplLCAmaW5mb1NpemUsICZ0b3RhbE1lbW9yeSwKKyAgICAgICAgJmJhY2t0cmFjZVNpemUpOworICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIk5hdGl2ZSBoZWFwIGR1bXAgbm90IGF2YWlsYWJsZS4gVG8gZW5hYmxlLCBydW4gdGhlc2UiCisgICAgICAgICAgICAgICAgICAgICIgY29tbWFuZHMgKHJlcXVpcmVzIHJvb3QpOlxuIik7CisgICAgICAgIGZwcmludGYoZnAsICIkIGFkYiBzaGVsbCBzZXRwcm9wIGxpYmMuZGVidWcubWFsbG9jIDFcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiJCBhZGIgc2hlbGwgc3RvcFxuIik7CisgICAgICAgIGZwcmludGYoZnAsICIkIGFkYiBzaGVsbCBzdGFydFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXNzZXJ0KGluZm9TaXplICE9IDApOworICAgIGFzc2VydChvdmVyYWxsU2l6ZSAlIGluZm9TaXplID09IDApOworCisgICAgZnByaW50ZihmcCwgIkFuZHJvaWQgTmF0aXZlIEhlYXAgRHVtcCB2MS4wXG5cbiIpOworCisgICAgc2l6ZV90IHJlY29yZENvdW50ID0gb3ZlcmFsbFNpemUgLyBpbmZvU2l6ZTsKKyAgICBmcHJpbnRmKGZwLCAiVG90YWwgbWVtb3J5OiAlenVcbiIsIHRvdGFsTWVtb3J5KTsKKyAgICBmcHJpbnRmKGZwLCAiQWxsb2NhdGlvbiByZWNvcmRzOiAlemRcbiIsIHJlY29yZENvdW50KTsKKyAgICBpZiAoYmFja3RyYWNlU2l6ZSAhPSBCQUNLVFJBQ0VfU0laRSkgeworICAgICAgICBmcHJpbnRmKGZwLCAiV0FSTklORzogbWlzbWF0Y2hlZCBiYWNrdHJhY2Ugc2l6ZXMgKCVkIHZzLiAlZClcbiIsCisgICAgICAgICAgICBiYWNrdHJhY2VTaXplLCBCQUNLVFJBQ0VfU0laRSk7CisgICAgfQorICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgLyogcmUtc29ydCB0aGUgZW50cmllcyAqLworICAgIHFzb3J0KGluZm8sIHJlY29yZENvdW50LCBpbmZvU2l6ZSwgY29tcGFyZUhlYXBSZWNvcmRzKTsKKworICAgIC8qIGR1bXAgdGhlIGVudHJpZXMgdG8gdGhlIGZpbGUgKi8KKyAgICBjb25zdCB1aW50OF90KiBwdHIgPSBpbmZvOworICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IHJlY29yZENvdW50OyBpZHgrKykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9ICooc2l6ZV90KikgcHRyOworICAgICAgICBzaXplX3QgYWxsb2NhdGlvbnMgPSAqKHNpemVfdCopIChwdHIgKyBzaXplb2Yoc2l6ZV90KSk7CisgICAgICAgIGludHB0cl90KiBiYWNrdHJhY2UgPSAoaW50cHRyX3QqKSAocHRyICsgc2l6ZW9mKHNpemVfdCkgKiAyKTsKKworICAgICAgICBmcHJpbnRmKGZwLCAieiAlZCAgc3ogJTh6dSAgbnVtICU0enUgIGJ0IiwKKyAgICAgICAgICAgICAgICAoc2l6ZSAmIFNJWkVfRkxBR19aWUdPVEVfQ0hJTEQpICE9IDAsCisgICAgICAgICAgICAgICAgc2l6ZSAmIH5TSVpFX0ZMQUdfWllHT1RFX0NISUxELAorICAgICAgICAgICAgICAgIGFsbG9jYXRpb25zKTsKKyAgICAgICAgZm9yIChzaXplX3QgYnQgPSAwOyBidCA8IGJhY2t0cmFjZVNpemU7IGJ0KyspIHsKKyAgICAgICAgICAgIGlmIChiYWNrdHJhY2VbYnRdID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAlMDh4IiwgYmFja3RyYWNlW2J0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihmcCwgIlxuIik7CisKKyAgICAgICAgcHRyICs9IGluZm9TaXplOworICAgIH0KKworICAgIGZwcmludGYoZnAsICJFTkRcbiIpOworICAgIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyhpbmZvKTsKK30KKyNlbmRpZiAvKkhBVkVfQU5EUk9JRF9PUyovCisKKy8qCisgKiBEdW1wIHRoZSBuYXRpdmUgaGVhcCwgd3JpdGluZyBodW1hbi1yZWFkYWJsZSBvdXRwdXQgdG8gdGhlIHNwZWNpZmllZAorICogZmlsZSBkZXNjcmlwdG9yLgorICovCitzdGF0aWMgdm9pZCBhbmRyb2lkX29zX0RlYnVnX2R1bXBOYXRpdmVIZWFwKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IpCit7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBvcmlnRmQgPSBqbmlHZXRGREZyb21GaWxlRGVzY3JpcHRvcihlbnYsIGZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAob3JpZ0ZkIDwgMCkgeworICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGR1cCgpIHRoZSBkZXNjcmlwdG9yIHNvIHdlIGRvbid0IGNsb3NlIHRoZSBvcmlnaW5hbCB3aXRoIGZjbG9zZSgpICovCisgICAgaW50IGZkID0gZHVwKG9yaWdGZCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0dXKCJkdXAoJWQpIGZhaWxlZDogJXNcbiIsIG9yaWdGZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgam5pVGhyb3dSdW50aW1lRXhjZXB0aW9uKGVudiwgImR1cCgpIGZhaWxlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRklMRSogZnAgPSBmZG9wZW4oZmQsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiZmRvcGVuKCVkKSBmYWlsZWQ6ICVzXG4iLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBqbmlUaHJvd1J1bnRpbWVFeGNlcHRpb24oZW52LCAiZmRvcGVuKCkgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJOYXRpdmUgaGVhcCBkdW1wIHN0YXJ0aW5nLi4uXG4iKTsKKyAgICBkdW1wTmF0aXZlSGVhcChmcCk7CisgICAgTE9HRCgiTmF0aXZlIGhlYXAgZHVtcCBjb21wbGV0ZS5cbiIpOworI2Vsc2UKKyAgICBmcHJpbnRmKGZwLCAiTmF0aXZlIGhlYXAgZHVtcCBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm1cbiIpOworI2VuZGlmCisKKyAgICBmY2xvc2UoZnApOworfQorCisKIC8qCiAgKiBKTkkgcmVnaXN0cmF0aW9uLgogICovCkBAIC0yODksNiArNDYyLDggQEAKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9vc19EZWJ1Z19nZXREaXJ0eVBhZ2VzIH0sCiAgICAgeyAiZ2V0TWVtb3J5SW5mbyIsICAgICAgICAgICIoSUxhbmRyb2lkL29zL0RlYnVnJE1lbW9yeUluZm87KVYiLAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0RlYnVnX2dldERpcnR5UGFnZXNQaWQgfSwKKyAgICB7ICJkdW1wTmF0aXZlSGVhcCIsICAgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjspViIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZHVtcE5hdGl2ZUhlYXAgfSwKICAgICB7ICJnZXRCaW5kZXJTZW50VHJhbnNhY3Rpb25zIiwgIigpSSIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRGVidWdfZ2V0QmluZGVyU2VudFRyYW5zYWN0aW9ucyB9LAogICAgIHsgImdldEJpbmRlclJlY2VpdmVkVHJhbnNhY3Rpb25zIiwgIigpSSIsCkBAIC0zMjAsNCArNDk1LDQgQEAKICAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImFuZHJvaWQvb3MvRGVidWciLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKIH0KIAotfTsKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX29zX0ZpbGVVdGlscy5jcHAKaW5kZXggMjFjYjkxOS4uZDNmYWEyZiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9vc19GaWxlVXRpbHMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfb3NfRmlsZVV0aWxzLmNwcApAQCAtMTEzLDYgKzExMywxMSBAQAogICAgICNlbmRpZgogfQogCitqaW50IGFuZHJvaWRfb3NfRmlsZVV0aWxzX3NldFVNYXNrKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IG1hc2spCit7CisgICAgcmV0dXJuIHVtYXNrKG1hc2spOworfQorCiBqaW50IGFuZHJvaWRfb3NfRmlsZVV0aWxzX2dldEZhdFZvbHVtZUlkKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqc3RyaW5nIHBhdGgpCiB7CiAgICAgI2lmIEhBVkVfQU5EUk9JRF9PUwpAQCAtMTcwLDYgKzE3NSw3IEBACiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIG1ldGhvZHNbXSA9IHsKICAgICB7InNldFBlcm1pc3Npb25zIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7SUlJKUkiLCAodm9pZCopYW5kcm9pZF9vc19GaWxlVXRpbHNfc2V0UGVybWlzc2lvbnN9LAogICAgIHsiZ2V0UGVybWlzc2lvbnMiLCAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX2dldFBlcm1pc3Npb25zfSwKKyAgICB7InNldFVNYXNrIiwgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19zZXRVTWFza30sCiAgICAgeyJnZXRGYXRWb2x1bWVJZCIsICAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgKHZvaWQqKWFuZHJvaWRfb3NfRmlsZVV0aWxzX2dldEZhdFZvbHVtZUlkfSwKICAgICB7ImdldEZpbGVTdGF0dXMiLCAgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9vcy9GaWxlVXRpbHMkRmlsZVN0YXR1czspWiIsICh2b2lkKilhbmRyb2lkX29zX0ZpbGVVdGlsc19nZXRGaWxlU3RhdHVzfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX29zX1BhcmNlbEZpbGVEZXNjcmlwdG9yLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3IuY3BwCmluZGV4IDg0OGE1N2EuLmVjZWVmMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3IuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3IuY3BwCkBAIC02Niw2ICs2NiwyNiBAQAogICAgIHJldHVybiBmaWxlRGVzY3JpcHRvckNsb25lOwogfQogCitzdGF0aWMgaW50IGFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfY3JlYXRlUGlwZU5hdGl2ZShKTklFbnYqIGVudiwKKyAgICBqb2JqZWN0IGNsYXp6LCBqb2JqZWN0QXJyYXkgb3V0RmRzKQoreworICAgIGludCBmZHNbMl07CisgICAgaWYgKHBpcGUoZmRzKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICBmb3IgKGludCBpPTA7IGk8MjsgaSsrKSB7CisgICAgICAgIGpvYmplY3QgZmRPYmogPSBlbnYtPk5ld09iamVjdChnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcywKKyAgICAgICAgICAgICAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3Rvcik7CisgICAgICAgIGlmIChmZE9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICBlbnYtPlNldEludEZpZWxkKGZkT2JqLCBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yLCBmZHNbaV0pOworICAgICAgICB9CisgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KG91dEZkcywgaSwgZmRPYmopOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgamludCBnZXRGZChKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eikKIHsKICAgICBqb2JqZWN0IGRlc2NyaXB0b3IgPSBlbnYtPkdldE9iamVjdEZpZWxkKGNsYXp6LCBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1GaWxlRGVzY3JpcHRvcik7CkBAIC0xMDksNiArMTI5LDggQEAKIHN0YXRpYyBjb25zdCBKTklOYXRpdmVNZXRob2QgZ1BhcmNlbEZpbGVEZXNjcmlwdG9yTWV0aG9kc1tdID0gewogICAgIHsiZ2V0RmlsZURlc2NyaXB0b3JGcm9tU29ja2V0IiwgIihMamF2YS9uZXQvU29ja2V0OylMamF2YS9pby9GaWxlRGVzY3JpcHRvcjsiLAogICAgICAgICAodm9pZCopYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvcl9nZXRGaWxlRGVzY3JpcHRvckZyb21Tb2NrZXR9LAorICAgIHsiY3JlYXRlUGlwZU5hdGl2ZSIsICIoW0xqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylJIiwKKyAgICAgICAgKHZvaWQqKWFuZHJvaWRfb3NfUGFyY2VsRmlsZURlc2NyaXB0b3JfY3JlYXRlUGlwZU5hdGl2ZX0sCiAgICAgeyJnZXRTdGF0U2l6ZSIsICIoKUoiLAogICAgICAgICAodm9pZCopYW5kcm9pZF9vc19QYXJjZWxGaWxlRGVzY3JpcHRvcl9nZXRTdGF0U2l6ZX0sCiAgICAgeyJzZWVrVG8iLCAiKEopSiIsCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoRXZlbnRMb29wLmNwcAppbmRleCBkYjQ1ZDZkLi4xMzA3ZWMzIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhFdmVudExvb3AuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aEV2ZW50TG9vcC5jcHAKQEAgLTUwLDYgKzUwLDggQEAKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uRGV2aWNlQ3JlYXRlZDsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uRGV2aWNlUmVtb3ZlZDsKIHN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uRGV2aWNlRGlzY29ubmVjdFJlcXVlc3RlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uTmV0d29ya0RldmljZUNvbm5lY3RlZDsKIAogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQ7CiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkNyZWF0ZURldmljZVJlc3VsdDsKQEAgLTY0LDYgKzY2LDExIEBACiBzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vbkFnZW50QXV0aG9yaXplOwogc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25BZ2VudENhbmNlbDsKIAorc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfb25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9vblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQ7CisKIHR5cGVkZWYgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90IG5hdGl2ZV9kYXRhX3Q7CiAKICNkZWZpbmUgRVZFTlRfTE9PUF9SRUZTIDEwCkBAIC05NSw2ICsxMDIsMTAgQEAKICAgICBtZXRob2Rfb25EZXZpY2VSZW1vdmVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGV2aWNlUmVtb3ZlZCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uRGV2aWNlRGlzY29ubmVjdFJlcXVlc3RlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICBtZXRob2Rfb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uTmV0d29ya0RldmljZUNvbm5lY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7SSlWIik7CisgICAgbWV0aG9kX29uTmV0d29ya0RldmljZURpc2Nvbm5lY3RlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CiAKICAgICBtZXRob2Rfb25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25DcmVhdGVQYWlyZWREZXZpY2VSZXN1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKQEAgLTExNiw2ICsxMjcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiKTsKICAgICBtZXRob2Rfb25EaXNwbGF5UGFzc2tleSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJvbkRpc3BsYXlQYXNza2V5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJSSlWIik7CisgICAgbWV0aG9kX29uSW5wdXREZXZpY2VQcm9wZXJ0eUNoYW5nZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0ID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIm9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztaKVYiKTsKKyAgICBtZXRob2Rfb25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25QYW5EZXZpY2VQcm9wZXJ0eUNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIG1ldGhvZF9vblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAib25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztaKVYiKTsKIAogICAgIGZpZWxkX21OYXRpdmVEYXRhID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZURhdGEiLCAiSSIpOwogI2VuZGlmCkBAIC0yMjYsNiArMjQ1LDI3IEBACiAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZGJ1c19idXNfYWRkX21hdGNoKG5hdC0+Y29ubiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5OZXR3b3JrJyIsCisgICAgICAgICAgICAgICAgJmVycik7CisgICAgICAgIGlmIChkYnVzX2Vycm9yX2lzX3NldCgmZXJyKSkgeworICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX2FkZF9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuTmV0d29ya1NlcnZlciciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19hZGRfbWF0Y2gobmF0LT5jb25uLAogICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkF1ZGlvU2luayciLAogICAgICAgICAgICAgICAgICZlcnIpOwogICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKQEAgLTM4MiwxMyArNDIyLDMxIEBACiAgICAgICAgIGRidXNfY29ubmVjdGlvbl91bnJlZ2lzdGVyX29iamVjdF9wYXRoKG5hdC0+Y29ubiwgYWdlbnRfcGF0aCk7CiAKICAgICAgICAgZGJ1c19idXNfcmVtb3ZlX21hdGNoKG5hdC0+Y29ubiwKLSAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9J29yZy5ibHVlei5BdWRpb1NpbmsnIiwKKyAgICAgICAgICAgICAgICAidHlwZT0nc2lnbmFsJyxpbnRlcmZhY2U9JyJCTFVFWl9EQlVTX0JBU0VfSUZDIi5BdWRpb1NpbmsnIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKICAgICAgICAgfQogICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAotICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nb3JnLmJsdWV6LkRldmljZSciLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLkRldmljZSciLAorICAgICAgICAgICAgICAgICZlcnIpOworICAgICAgICBpZiAoZGJ1c19lcnJvcl9pc19zZXQoJmVycikpIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SKCZlcnIpOworICAgICAgICB9CisgICAgICAgIGRidXNfYnVzX3JlbW92ZV9tYXRjaChuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgInR5cGU9J3NpZ25hbCcsaW50ZXJmYWNlPSciQkxVRVpfREJVU19CQVNFX0lGQyIuSW5wdXQnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmsnIiwKKyAgICAgICAgICAgICAgICAmZXJyKTsKKyAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CisgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgfQorICAgICAgICBkYnVzX2J1c19yZW1vdmVfbWF0Y2gobmF0LT5jb25uLAorICAgICAgICAgICAgICAgICJ0eXBlPSdzaWduYWwnLGludGVyZmFjZT0nIkJMVUVaX0RCVVNfQkFTRV9JRkMiLk5ldHdvcmtTZXJ2ZXInIiwKICAgICAgICAgICAgICAgICAmZXJyKTsKICAgICAgICAgaWYgKGRidXNfZXJyb3JfaXNfc2V0KCZlcnIpKSB7CiAgICAgICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKQEAgLTg1Myw2ICs5MTEsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25EZXZpY2VEaXNjb25uZWN0UmVxdWVzdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKHJlbW90ZV9kZXZpY2VfcGF0aCkpOwogICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgfSBlbHNlIGlmIChkYnVzX21lc3NhZ2VfaXNfc2lnbmFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5JbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9wZXJ0eUNoYW5nZWQiKSkgeworCisgICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICBwYXJzZV9pbnB1dF9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgICBpZiAoc3RyX2FycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGRidXNfbWVzc2FnZV9nZXRfcGF0aChtc2cpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25JbnB1dERldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2FycmF5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTkRfRlJFRV9EQlVTX0VSUk9SX1dJVEhfTVNHKCZlcnIsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHlDaGFuZ2VkIikpIHsKKworICAgICAgIGpvYmplY3RBcnJheSBzdHJfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgIHBhcnNlX3Bhbl9wcm9wZXJ0eV9jaGFuZ2UoZW52LCBtc2cpOworICAgICAgIGlmIChzdHJfYXJyYXkgIT0gTlVMTCkgeworICAgICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBkYnVzX21lc3NhZ2VfZ2V0X3BhdGgobXNnKTsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vblBhbkRldmljZVByb3BlcnR5Q2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihjX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9hcnJheSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlRGlzY29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgaWYgKGRidXNfbWVzc2FnZV9nZXRfYXJncyhtc2csICZlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vbk5ldHdvcmtEZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5OZXdTdHJpbmdVVEYoY19hZGRyZXNzKSk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOworICAgIH0gZWxzZSBpZiAoZGJ1c19tZXNzYWdlX2lzX3NpZ25hbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5ibHVlei5OZXR3b3JrU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGV2aWNlQ29ubmVjdGVkIikpIHsKKyAgICAgICBjaGFyICpjX2FkZHJlc3M7CisgICAgICAgdWludDE2X3QgdXVpZDsKKworICAgICAgIGlmIChkYnVzX21lc3NhZ2VfZ2V0X2FyZ3MobXNnLCAmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9TVFJJTkcsICZjX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1VJTlQxNiwgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpKSB7CisgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobmF0LT5tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfb25OZXR3b3JrRGV2aWNlQ29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+TmV3U3RyaW5nVVRGKGNfYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZCk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKKyAgICAgICB9CisgICAgICAgZ290byBzdWNjZXNzOwogICAgIH0KIAogICAgIHJldCA9IGEyZHBfZXZlbnRfZmlsdGVyKG1zZywgZW52KTsKQEAgLTEyMTAsNiArMTMzMiw1NyBAQAogICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoYWRkcik7CiAgICAgZnJlZSh1c2VyKTsKIH0KKwordm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworCisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gKG5hdGl2ZV9kYXRhX3QgKiluOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSAoY29uc3QgY2hhciAqKXVzZXI7CisgICAgREJ1c0Vycm9yIGVycjsKKyAgICBkYnVzX2Vycm9yX2luaXQoJmVycik7CisgICAgSk5JRW52ICplbnY7CisgICAgbmF0LT52bS0+R2V0RW52KCh2b2lkKiopJmVudiwgbmF0LT5lbnZWZXIpOworCisgICAgYm9vbCByZXN1bHQgPSBKTklfVFJVRTsKKyAgICBpZiAoZGJ1c19zZXRfZXJyb3JfZnJvbV9tZXNzYWdlKCZlcnIsIG1zZykpIHsKKyAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1IoJmVycik7CisgICAgICAgIHJlc3VsdCA9IEpOSV9GQUxTRTsKKyAgICB9CisgICAgTE9HVigiLi4uIERldmljZSBQYXRoID0gJXMsIHJlc3VsdCA9ICVkIiwgcGF0aCwgcmVzdWx0KTsKKyAgICBqc3RyaW5nIGpQYXRoID0gZW52LT5OZXdTdHJpbmdVVEYocGF0aCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgalBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoalBhdGgpOworICAgIGZyZWUodXNlcik7Cit9CisKK3ZvaWQgb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm4pIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSAobmF0aXZlX2RhdGFfdCAqKW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IChjb25zdCBjaGFyICopdXNlcjsKKyAgICBEQnVzRXJyb3IgZXJyOworICAgIGRidXNfZXJyb3JfaW5pdCgmZXJyKTsKKyAgICBKTklFbnYgKmVudjsKKyAgICBuYXQtPnZtLT5HZXRFbnYoKHZvaWQqKikmZW52LCBuYXQtPmVudlZlcik7CisKKyAgICBib29sIHJlc3VsdCA9IEpOSV9UUlVFOworICAgIGlmIChkYnVzX3NldF9lcnJvcl9mcm9tX21lc3NhZ2UoJmVyciwgbXNnKSkgeworICAgICAgICBMT0dfQU5EX0ZSRUVfREJVU19FUlJPUigmZXJyKTsKKyAgICAgICAgcmVzdWx0ID0gSk5JX0ZBTFNFOworICAgIH0KKyAgICBMT0dWKCIuLi4gUGFuIERldmljZSBQYXRoID0gJXMsIHJlc3VsdCA9ICVkIiwgcGF0aCwgcmVzdWx0KTsKKyAgICBqc3RyaW5nIGpQYXRoID0gZW52LT5OZXdTdHJpbmdVVEYocGF0aCk7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChuYXQtPm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX29uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpQYXRoKTsKKyAgICBmcmVlKHVzZXIpOworfQorCiAjZW5kaWYKIAogc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBzTWV0aG9kc1tdID0gewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAppbmRleCA0NDIwYWNhLi43NDEyN2NmIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3NlcnZlcl9CbHVldG9vdGhTZXJ2aWNlLmNwcApAQCAtMTYsNiArMTYsMTEgQEAKIAogI2RlZmluZSBEQlVTX0FEQVBURVJfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLkFkYXB0ZXIiCiAjZGVmaW5lIERCVVNfREVWSUNFX0lGQUNFIEJMVUVaX0RCVVNfQkFTRV9JRkMgIi5EZXZpY2UiCisjZGVmaW5lIERCVVNfSU5QVVRfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLklucHV0IgorI2RlZmluZSBEQlVTX05FVFdPUktfSUZBQ0UgQkxVRVpfREJVU19CQVNFX0lGQyAiLk5ldHdvcmsiCisjZGVmaW5lIERCVVNfTkVUV09SS1NFUlZFUl9JRkFDRSBCTFVFWl9EQlVTX0JBU0VfSUZDICIuTmV0d29ya1NlcnZlciIKKworCiAjZGVmaW5lIExPR19UQUcgIkJsdWV0b290aFNlcnZpY2UuY3BwIgogCiAjaW5jbHVkZSAiYW5kcm9pZF9ibHVldG9vdGhfY29tbW9uLmgiCkBAIC02OCw2ICs3Myw5IEBACiB2b2lkIG9uQ3JlYXRlUGFpcmVkRGV2aWNlUmVzdWx0KERCdXNNZXNzYWdlICptc2csIHZvaWQgKnVzZXIsIHZvaWQgKm5hdCk7CiB2b2lkIG9uRGlzY292ZXJTZXJ2aWNlc1Jlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwogdm9pZCBvbkNyZWF0ZURldmljZVJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwordm9pZCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwordm9pZCBvbkNvbm5lY3RQYW5SZXN1bHQoREJ1c01lc3NhZ2UgKm1zZywgdm9pZCAqdXNlciwgdm9pZCAqbik7Cit2b2lkIG9uUGFuRGV2aWNlQ29ubmVjdGlvblJlc3VsdChEQnVzTWVzc2FnZSAqbXNnLCB2b2lkICp1c2VyLCB2b2lkICpuYXQpOwogCiAKIC8qKiBHZXQgbmF0aXZlIGRhdGEgc3RvcmVkIGluIHRoZSBvcGFxdWUgKEphdmEgY29kZSBtYWludGFpbmVkKSBwb2ludGVyIG1OYXRpdmVEYXRhCkBAIC04ODEsNiArODg5LDE2MCBAQAogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbiBjb25uZWN0SW5wdXREZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqc3RyaW5nIHBhdGgpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsIG9uSW5wdXREZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsIERCVVNfSU5QVVRfSUZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgbmF0aXZlX2RhdGFfdCAqbmF0ID0gZ2V0X25hdGl2ZV9kYXRhKGVudiwgb2JqZWN0KTsKKyAgICBqb2JqZWN0IGV2ZW50TG9vcCA9IGVudi0+R2V0T2JqZWN0RmllbGQob2JqZWN0LCBmaWVsZF9tRXZlbnRMb29wKTsKKyAgICBzdHJ1Y3QgZXZlbnRfbG9vcF9uYXRpdmVfZGF0YV90ICpldmVudExvb3BOYXQgPQorICAgICAgICAgICAgZ2V0X0V2ZW50TG9vcF9uYXRpdmVfZGF0YShlbnYsIGV2ZW50TG9vcCk7CisKKyAgICBpZiAobmF0ICYmIGV2ZW50TG9vcE5hdCkgeworICAgICAgICBjb25zdCBjaGFyICpjX3BhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOworCisgICAgICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChwYXRoKSArIDE7CisgICAgICAgIGNoYXIgKmNvbnRleHRfcGF0aCA9IChjaGFyICopY2FsbG9jKGxlbiwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgc3RybGNweShjb250ZXh0X3BhdGgsIGNfcGF0aCwgbGVuKTsgIC8vIGZvciBjYWxsYmFjaworCisgICAgICAgIGJvb2wgcmV0ID0gZGJ1c19mdW5jX2FyZ3NfYXN5bmMoZW52LCBuYXQtPmNvbm4sIC0xLCBvbklucHV0RGV2aWNlQ29ubmVjdGlvblJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3BhdGgsIGV2ZW50TG9vcE5hdCwgY19wYXRoLCBEQlVTX0lOUFVUX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjb25uZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgY19wYXRoKTsKKyAgICAgICAgcmV0dXJuIHJldCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBKTklfRkFMU0U7Cit9CisKK3N0YXRpYyBqYm9vbGVhbiBzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LCBqYm9vbGVhbiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBzcmNfcm9sZSwganN0cmluZyBicmlkZ2UpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CisjaWZkZWYgSEFWRV9CTFVFVE9PVEgKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGlmIChuYXQpIHsKKyAgICAgICAgREJ1c01lc3NhZ2UgKnJlcGx5OworICAgICAgICBjb25zdCBjaGFyICpjX3JvbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHNyY19yb2xlLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqY19icmlkZ2UgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGJyaWRnZSwgTlVMTCk7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgTE9HRSgic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlIHRydWUiKTsKKyAgICAgICAgICAgIHJlcGx5ID0gZGJ1c19mdW5jX2FyZ3MoZW52LCBuYXQtPmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FkYXB0ZXJfcGF0aChlbnYsIG9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLU0VSVkVSX0lGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmY19icmlkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nTmF0aXZlIGZhbHNlIik7CisgICAgICAgICAgICByZXBseSA9IGRidXNfZnVuY19hcmdzKGVudiwgbmF0LT5jb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hZGFwdGVyX3BhdGgoZW52LCBvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfTkVUV09SS1NFUlZFUl9JRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmNfcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfSU5WQUxJRCk7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoc3JjX3JvbGUsIGNfcm9sZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGJyaWRnZSwgY19icmlkZ2UpOworICAgICAgICByZXR1cm4gcmVwbHkgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCitzdGF0aWMgamJvb2xlYW4gY29ubmVjdFBhbkRldmljZU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QsIGpzdHJpbmcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgc3JjUm9sZSwganN0cmluZyBkc3RSb2xlKSB7CisgICAgTE9HVihfX0ZVTkNUSU9OX18pOworI2lmZGVmIEhBVkVfQkxVRVRPT1RICisgICAgTE9HRSgiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIpOworICAgIG5hdGl2ZV9kYXRhX3QgKm5hdCA9IGdldF9uYXRpdmVfZGF0YShlbnYsIG9iamVjdCk7CisgICAgam9iamVjdCBldmVudExvb3AgPSBlbnYtPkdldE9iamVjdEZpZWxkKG9iamVjdCwgZmllbGRfbUV2ZW50TG9vcCk7CisgICAgc3RydWN0IGV2ZW50X2xvb3BfbmF0aXZlX2RhdGFfdCAqZXZlbnRMb29wTmF0ID0KKyAgICAgICAgICAgIGdldF9FdmVudExvb3BfbmF0aXZlX2RhdGEoZW52LCBldmVudExvb3ApOworCisgICAgaWYgKG5hdCAmJiBldmVudExvb3BOYXQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY19wYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwYXRoLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3JjID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzcmNSb2xlLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqZHN0ID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkc3RSb2xlLCBOVUxMKTsKKworICAgICAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgocGF0aCkgKyAxOworICAgICAgICBjaGFyICpjb250ZXh0X3BhdGggPSAoY2hhciAqKWNhbGxvYyhsZW4sIHNpemVvZihjaGFyKSk7CisgICAgICAgIHN0cmxjcHkoY29udGV4dF9wYXRoLCBjX3BhdGgsIGxlbik7ICAvLyBmb3IgY2FsbGJhY2sKKworICAgICAgICBib29sIHJldCA9IGRidXNfZnVuY19hcmdzX2FzeW5jKGVudiwgbmF0LT5jb25uLCAtMSxvblBhbkRldmljZUNvbm5lY3Rpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3BhdGgsIGV2ZW50TG9vcE5hdCwgY19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLX0lGQUNFLCAiQ29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlVTX1RZUEVfU1RSSU5HLCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX1NUUklORywgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVVNfVFlQRV9JTlZBTElEKTsKKworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwYXRoLCBjX3BhdGgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzcmNSb2xlLCBzcmMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhkc3RSb2xlLCBkc3QpOworICAgICAgICByZXR1cm4gcmV0ID8gSk5JX1RSVUUgOiBKTklfRkFMU0U7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKK30KKworc3RhdGljIGpib29sZWFuIGRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgcGF0aCkgeworICAgIExPR1YoX19GVU5DVElPTl9fKTsKKyNpZmRlZiBIQVZFX0JMVUVUT09USAorICAgIExPR0UoImRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmUiKTsKKyAgICBuYXRpdmVfZGF0YV90ICpuYXQgPSBnZXRfbmF0aXZlX2RhdGEoZW52LCBvYmplY3QpOworICAgIGpvYmplY3QgZXZlbnRMb29wID0gZW52LT5HZXRPYmplY3RGaWVsZChvYmplY3QsIGZpZWxkX21FdmVudExvb3ApOworICAgIHN0cnVjdCBldmVudF9sb29wX25hdGl2ZV9kYXRhX3QgKmV2ZW50TG9vcE5hdCA9CisgICAgICAgICAgICBnZXRfRXZlbnRMb29wX25hdGl2ZV9kYXRhKGVudiwgZXZlbnRMb29wKTsKKworICAgIGlmIChuYXQgJiYgZXZlbnRMb29wTmF0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNfcGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGF0aCwgTlVMTCk7CisKKyAgICAgICAgaW50IGxlbiA9IGVudi0+R2V0U3RyaW5nTGVuZ3RoKHBhdGgpICsgMTsKKyAgICAgICAgY2hhciAqY29udGV4dF9wYXRoID0gKGNoYXIgKiljYWxsb2MobGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBzdHJsY3B5KGNvbnRleHRfcGF0aCwgY19wYXRoLCBsZW4pOyAgLy8gZm9yIGNhbGxiYWNrCisKKyAgICAgICAgYm9vbCByZXQgPSBkYnVzX2Z1bmNfYXJnc19hc3luYyhlbnYsIG5hdC0+Y29ubiwgLTEsb25QYW5EZXZpY2VDb25uZWN0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfcGF0aCwgZXZlbnRMb29wTmF0LCBjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19ORVRXT1JLX0lGQUNFLCAiRGlzY29ubmVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJVU19UWVBFX0lOVkFMSUQpOworCisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIGNfcGF0aCk7CisgICAgICAgIHJldHVybiByZXQgPyBKTklfVFJVRSA6IEpOSV9GQUxTRTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gSk5JX0ZBTFNFOworfQorCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIHNNZXRob2RzW10gPSB7CiAgICAgIC8qIG5hbWUsIHNpZ25hdHVyZSwgZnVuY1B0ciAqLwogICAgIHsiY2xhc3NJbml0TmF0aXZlIiwgIigpViIsICh2b2lkKiljbGFzc0luaXROYXRpdmV9LApAQCAtOTI2LDggKzEwODgsMTggQEAKICAgICB7ImFkZFJmY29tbVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0pKUylJIiwgKHZvaWQgKilhZGRSZmNvbW1TZXJ2aWNlUmVjb3JkTmF0aXZlfSwKICAgICB7InJlbW92ZVNlcnZpY2VSZWNvcmROYXRpdmUiLCAiKEkpWiIsICh2b2lkICopcmVtb3ZlU2VydmljZVJlY29yZE5hdGl2ZX0sCiAgICAgeyJzZXRMaW5rVGltZW91dE5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlaIiwgKHZvaWQgKilzZXRMaW5rVGltZW91dE5hdGl2ZX0sCisgICAgLy8gSElEIGZ1bmN0aW9ucworICAgIHsiY29ubmVjdElucHV0RGV2aWNlTmF0aXZlIiwgIihMamF2YS9sYW5nL1N0cmluZzspWiIsICh2b2lkICopY29ubmVjdElucHV0RGV2aWNlTmF0aXZlfSwKKyAgICB7ImRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RJbnB1dERldmljZU5hdGl2ZX0sCisKKyAgICB7InNldEJsdWV0b290aFRldGhlcmluZ05hdGl2ZSIsICIoWkxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIiwKKyAgICAgICAgICAgICAgKHZvaWQgKilzZXRCbHVldG9vdGhUZXRoZXJpbmdOYXRpdmV9LAorICAgIHsiY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVoiLAorICAgICAgICAgICAgICAodm9pZCAqKWNvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAorICAgIHsiZGlzY29ubmVjdFBhbkRldmljZU5hdGl2ZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCAodm9pZCAqKWRpc2Nvbm5lY3RQYW5EZXZpY2VOYXRpdmV9LAogfTsKIAorCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZShKTklFbnYgKmVudikgewogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKICAgICAgICAgICAgICAgICAiYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZSIsIHNNZXRob2RzLCBORUxFTShzTWV0aG9kcykpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcy5jcHAKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrQ2FudmFzLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NjYWxlckNvbnRleHQuaD4KKyNpbmNsdWRlIDxTa1RlbXBsYXRlcy5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPE9wZW5HTFJlbmRlcmVyLmg+CisjaW5jbHVkZSA8U2tpYVNoYWRlci5oPgorI2luY2x1ZGUgPFNraWFDb2xvckZpbHRlci5oPgorI2luY2x1ZGUgPFJlY3QuaD4KKworI2luY2x1ZGUgIlRleHRMYXlvdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBuYW1lc3BhY2UgdWlyZW5kZXJlcjsKKworLyoqCisgKiBOb3RlOiBPcGVuR0xSZW5kZXJlciBKTkkgbGF5ZXIgaXMgZ2VuZXJhdGVkIGFuZCBjb21waWxlZCBvbmx5IG9uIHN1cHBvcnRlZAorICogICAgICAgZGV2aWNlcy4gVGhpcyBtZWFucyBhbGwgdGhlIGxvZ2ljIG11c3QgYmUgY29tcGlsZWQgb25seSB3aGVuIHRoZQorICogICAgICAgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIFVTRV9PUEVOR0xfUkVOREVSRVIgaXMgZGVmaW5lZC4KKyAqLworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSmF2YSBBUElzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGpjbGFzcyBjbGF6ejsKKyAgICBqbWV0aG9kSUQgc2V0OworfSBnUmVjdENsYXNzSW5mbzsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uc3RydWN0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBPcGVuR0xSZW5kZXJlciogYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMpIHsKKyAgICByZXR1cm4gbmV3IE9wZW5HTFJlbmRlcmVyOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2Rlc3Ryb3lSZW5kZXJlcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIGRlbGV0ZSByZW5kZXJlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2V0dXAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRWaWV3cG9ydChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCB3aWR0aCwgamludCBoZWlnaHQpIHsKKyAgICByZW5kZXJlci0+c2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlcGFyZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5wcmVwYXJlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfYWNxdWlyZUNvbnRleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+YWNxdWlyZUNvbnRleHQoKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19yZWxlYXNlQ29udGV4dChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZWxlYXNlQ29udGV4dCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdGF0ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLCBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsCisgICAgICAgIGppbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmUoZmxhZ3MpOworfQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJldHVybiByZW5kZXJlci0+Z2V0U2F2ZUNvdW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlcikgeworICAgIHJlbmRlcmVyLT5yZXN0b3JlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGppbnQgc2F2ZUNvdW50KSB7CisgICAgcmVuZGVyZXItPnJlc3RvcmVUb0NvdW50KHNhdmVDb3VudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExheWVycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamludCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllcihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQsIGppbnQgc2F2ZUZsYWdzKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5zYXZlTGF5ZXIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCwgc2F2ZUZsYWdzKTsKK30KKworc3RhdGljIGppbnQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXJBbHBoYShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgamludCBhbHBoYSwgamludCBzYXZlRmxhZ3MpIHsKKyAgICByZXR1cm4gcmVuZGVyZXItPnNhdmVMYXllckFscGhhKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgYWxwaGEsIHNhdmVGbGFncyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsaXBwaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcXVpY2tSZWplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBsZWZ0LCBqZmxvYXQgdG9wLCBqZmxvYXQgcmlnaHQsIGpmbG9hdCBib3R0b20sCisgICAgICAgIFNrQ2FudmFzOjpFZGdlVHlwZSBlZGdlKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5xdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0RihKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgcmV0dXJuIHJlbmRlcmVyLT5jbGlwUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIG9wKTsKK30KKworc3RhdGljIGJvb2wgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamludCBsZWZ0LCBqaW50IHRvcCwgamludCByaWdodCwgamludCBib3R0b20sCisgICAgICAgIFNrUmVnaW9uOjpPcCBvcCkgeworICAgIHJldHVybiByZW5kZXJlci0+Y2xpcFJlY3QoZmxvYXQobGVmdCksIGZsb2F0KHRvcCksIGZsb2F0KHJpZ2h0KSwgZmxvYXQoYm90dG9tKSwgb3ApOworfQorCitzdGF0aWMgYm9vbCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldENsaXBCb3VuZHMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpvYmplY3QgcmVjdCkgeworICAgIGNvbnN0IGFuZHJvaWQ6OnVpcmVuZGVyZXI6OlJlY3QmIGJvdW5kcyhyZW5kZXJlci0+Z2V0Q2xpcEJvdW5kcygpKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QocmVjdCwgZ1JlY3RDbGFzc0luZm8uc2V0LAorICAgICAgICAgICAgaW50KGJvdW5kcy5sZWZ0KSwgaW50KGJvdW5kcy50b3ApLCBpbnQoYm91bmRzLnJpZ2h0KSwgaW50KGJvdW5kcy5ib3R0b20pKTsKKworICAgIHJldHVybiAhYm91bmRzLmlzRW1wdHkoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZShKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGR4LCBqZmxvYXQgZHkpIHsKKyAgICByZW5kZXJlci0+dHJhbnNsYXRlKGR4LCBkeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqZmxvYXQgZGVncmVlcykgeworICAgIHJlbmRlcmVyLT5yb3RhdGUoZGVncmVlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2NhbGUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCBzeCwgamZsb2F0IHN5KSB7CisgICAgcmVuZGVyZXItPnNjYWxlKHN4LCBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0TWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa01hdHJpeCogbWF0cml4KSB7CisgICAgcmVuZGVyZXItPnNldE1hdHJpeChtYXRyaXgpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIHJlbmRlcmVyLT5nZXRNYXRyaXgobWF0cml4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb25jYXRNYXRyaXgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrTWF0cml4KiBtYXRyaXgpIHsKKyAgICByZW5kZXJlci0+Y29uY2F0TWF0cml4KG1hdHJpeCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERyYXdpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBsZWZ0LCB0b3AsIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwUmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgU2tCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICBmbG9hdCBkc3RMZWZ0LCBmbG9hdCBkc3RUb3AsIGZsb2F0IGRzdFJpZ2h0LCBmbG9hdCBkc3RCb3R0b20sIFNrUGFpbnQqIHBhaW50KSB7CisgICAgcmVuZGVyZXItPmRyYXdCaXRtYXAoYml0bWFwLCBzcmNMZWZ0LCBzcmNUb3AsIHNyY1JpZ2h0LCBzcmNCb3R0b20sCisgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20sIHBhaW50KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBTa01hdHJpeCogbWF0cml4LCBTa1BhaW50KiBwYWludCkgeworICAgIHJlbmRlcmVyLT5kcmF3Qml0bWFwKGJpdG1hcCwgbWF0cml4LCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGNoKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa0JpdG1hcCogYml0bWFwLCBqYnl0ZUFycmF5IGNodW5rcywKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1BhaW50KiBwYWludCkgeworICAgIGpieXRlKiBzdG9yYWdlID0gZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhjaHVua3MsIE5VTEwpOworICAgIFJlc19wbmdfOXBhdGNoKiBwYXRjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVzX3BuZ185cGF0Y2gqPihzdG9yYWdlKTsKKyAgICBSZXNfcG5nXzlwYXRjaDo6ZGVzZXJpYWxpemUocGF0Y2gpOworCisgICAgcmVuZGVyZXItPmRyYXdQYXRjaChiaXRtYXAsIHBhdGNoLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKworICAgIGVudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGNodW5rcywgc3RvcmFnZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0NvbG9yKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICByZW5kZXJlci0+ZHJhd0NvbG9yKGNvbG9yLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UmVjdChKTklFbnYqIGVudiwgam9iamVjdCBjYW52YXMsCisgICAgICAgIE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgamZsb2F0IGxlZnQsIGpmbG9hdCB0b3AsIGpmbG9hdCByaWdodCwgamZsb2F0IGJvdHRvbSwKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1JlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBwYWludCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3RzKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa1JlZ2lvbiogcmVnaW9uLCBTa1BhaW50KiBwYWludCkgeworICAgIFNrUmVnaW9uOjpJdGVyYXRvciBpdCgqcmVnaW9uKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBjb25zdCBTa0lSZWN0JiByID0gaXQucmVjdCgpOworICAgICAgICByZW5kZXJlci0+ZHJhd1JlY3Qoci5mTGVmdCwgci5mVG9wLCByLmZSaWdodCwgci5mQm90dG9tLCBwYWludCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGgoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICByZW5kZXJlci0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFkZXJzIGFuZCBjb2xvciBmaWx0ZXJzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIpIHsKKyAgICByZW5kZXJlci0+cmVzZXRTaGFkZXIoKTsKKyAgICByZW5kZXJlci0+cmVzZXRDb2xvckZpbHRlcigpOworICAgIHJlbmRlcmVyLT5yZXNldFNoYWRvdygpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhU2hhZGVyKiBzaGFkZXIpIHsKKyAgICByZW5kZXJlci0+c2V0dXBTaGFkZXIoc2hhZGVyKTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIHJlbmRlcmVyLT5zZXR1cENvbG9yRmlsdGVyKGZpbHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2V0dXBTaGFkb3coSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpmbG9hdCByYWRpdXMsIGpmbG9hdCBkeCwgamZsb2F0IGR5LCBqaW50IGNvbG9yKSB7CisgICAgcmVuZGVyZXItPnNldHVwU2hhZG93KHJhZGl1cywgZHgsIGR5LCBjb2xvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgcmVuZGVyVGV4dChPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKKyAgICBqY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICBpbnQzMl90IHdvcmtCeXRlczsKKyAgICBpZiAoVGV4dExheW91dDo6cHJlcGFyZVRleHQocGFpbnQsIHRleHQsIGNvdW50LCBmbGFncywgJndvcmtUZXh0LCAmd29ya0J5dGVzLCAmYnVmZmVyKSkgeworICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSB3b3JrVGV4dCwgd29ya0J5dGVzLCBjb3VudCwgeCwgeSwgcGFpbnQpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW5kZXJUZXh0UnVuKE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsCisgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksCisgICAgICAgIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOworICAgIGlmIChydGwpIHsKKyAgICAgICAgU2tBdXRvU1RNYWxsb2M8ODAsIGpjaGFyPiBidWZmZXIoY29udGV4dENvdW50KTsKKyAgICAgICAgamNoYXIqIHNoYXBlZCA9IGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgaWYgKFRleHRMYXlvdXQ6OnByZXBhcmVSdGxUZXh0UnVuKHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBzaGFwZWQpKSB7CisgICAgICAgICAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBzaGFwZWQsIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJkcmF3VGV4dFJ1biBlcnJvciIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgKHRleHQgKyBzdGFydCksIGNvdW50IDw8IDEsIGNvdW50LCB4LCB5LCBwYWludCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0QXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpjaGFyQXJyYXkgdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgeworICAgIGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKHRleHQsIE5VTEwpOworICAgIHJlbmRlclRleHQocmVuZGVyZXIsIHRleHRBcnJheSArIGluZGV4LCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1RleHQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FudmFzLAorICAgICAgICBPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGpzdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRTdHJpbmdDaGFycyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0KHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1bkFycmF5KEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqY2hhckFycmF5IHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksIGludCBkaXJGbGFncywKKyAgICAgICAgU2tQYWludCogcGFpbnQpIHsKKyAgICBqY2hhciogdGV4dEFycmF5ID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCBOVUxMKTsKKyAgICByZW5kZXJUZXh0UnVuKHJlbmRlcmVyLCB0ZXh0QXJyYXkgKyBjb250ZXh0SW5kZXgsIGluZGV4IC0gY29udGV4dEluZGV4LAorICAgICAgICAgICAgY291bnQsIGNvbnRleHRDb3VudCwgeCwgeSwgZGlyRmxhZ3MsIHBhaW50KTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyh0ZXh0LCB0ZXh0QXJyYXksIEpOSV9BQk9SVCk7CisgfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuKEpOSUVudiogZW52LCBqb2JqZWN0IGNhbnZhcywKKyAgICAgICAgT3BlbkdMUmVuZGVyZXIqIHJlbmRlcmVyLCBqc3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGRpckZsYWdzLAorICAgICAgICBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IGpjaGFyKiB0ZXh0QXJyYXkgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHRleHQsIE5VTEwpOworICAgIGppbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICBqaW50IGNvbnRleHRDb3VudCA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgcmVuZGVyVGV4dFJ1bihyZW5kZXJlciwgdGV4dEFycmF5ICsgY29udGV4dFN0YXJ0LCBzdGFydCAtIGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGNvdW50LCBjb250ZXh0Q291bnQsIHgsIHksIGRpckZsYWdzLCBwYWludCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnModGV4dCwgdGV4dEFycmF5KTsKK30KKworI2VuZGlmIC8vIFVTRV9PUEVOR0xfUkVOREVSRVIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqYm9vbGVhbiBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KSB7CisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgIHJldHVybiBKTklfVFJVRTsKKyNlbHNlCisgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKTkkgR2x1ZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsgIm5Jc0F2YWlsYWJsZSIsICAgICAgICIoKVoiLCAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfaXNBdmFpbGFibGUgfSwKKworI2lmZGVmIFVTRV9PUEVOR0xfUkVOREVSRVIKKyAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCisgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKKyAgICB7ICJuU2V0Vmlld3BvcnQiLCAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldFZpZXdwb3J0IH0sCisgICAgeyAiblByZXBhcmUiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVwYXJlIH0sCisgICAgeyAibkFjcXVpcmVDb250ZXh0IiwgICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19hY3F1aXJlQ29udGV4dCB9LAorICAgIHsgIm5SZWxlYXNlQ29udGV4dCIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVsZWFzZUNvbnRleHQgfSwKKworICAgIHsgIm5TYXZlIiwgICAgICAgICAgICAgICIoSUkpSSIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfc2F2ZSB9LAorICAgIHsgIm5SZXN0b3JlIiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZSB9LAorICAgIHsgIm5SZXN0b3JlVG9Db3VudCIsICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzdG9yZVRvQ291bnQgfSwKKyAgICB7ICJuR2V0U2F2ZUNvdW50IiwgICAgICAiKEkpSSIsICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldFNhdmVDb3VudCB9LAorCisgICAgeyAiblNhdmVMYXllciIsICAgICAgICAgIihJRkZGRklJKUkiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zYXZlTGF5ZXIgfSwKKyAgICB7ICJuU2F2ZUxheWVyQWxwaGEiLCAgICAiKElGRkZGSUkpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NhdmVMYXllckFscGhhIH0sCisKKyAgICB7ICJuUXVpY2tSZWplY3QiLCAgICAgICAiKElGRkZGSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3F1aWNrUmVqZWN0IH0sCisgICAgeyAibkNsaXBSZWN0IiwgICAgICAgICAgIihJRkZGRkkpWiIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jbGlwUmVjdEYgfSwKKyAgICB7ICJuQ2xpcFJlY3QiLCAgICAgICAgICAiKElJSUlJSSlaIiwgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NsaXBSZWN0IH0sCisKKyAgICB7ICJuVHJhbnNsYXRlIiwgICAgICAgICAiKElGRilWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3RyYW5zbGF0ZSB9LAorICAgIHsgIm5Sb3RhdGUiLCAgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcm90YXRlIH0sCisgICAgeyAiblNjYWxlIiwgICAgICAgICAgICAgIihJRkYpViIsICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zY2FsZSB9LAorCisgICAgeyAiblNldE1hdHJpeCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXRNYXRyaXggfSwKKyAgICB7ICJuR2V0TWF0cml4IiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2dldE1hdHJpeCB9LAorICAgIHsgIm5Db25jYXRNYXRyaXgiLCAgICAgICIoSUkpViIsICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29uY2F0TWF0cml4IH0sCisKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZJKVYiLCAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXAgfSwKKyAgICB7ICJuRHJhd0JpdG1hcCIsICAgICAgICAiKElJRkZGRkZGRkZJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdCaXRtYXBSZWN0IH0sCisgICAgeyAibkRyYXdCaXRtYXAiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3Qml0bWFwTWF0cml4IH0sCisgICAgeyAibkRyYXdQYXRjaCIsICAgICAgICAgIihJSVtCRkZGRkkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3UGF0Y2ggfSwKKyAgICB7ICJuRHJhd0NvbG9yIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdDb2xvciB9LAorICAgIHsgIm5EcmF3UmVjdCIsICAgICAgICAgICIoSUZGRkZJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1JlY3QgfSwKKyAgICB7ICJuRHJhd1JlY3RzIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdSZWN0cyB9LAorICAgIHsgIm5EcmF3UGF0aCIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd1BhdGggfSwKKworICAgIHsgIm5SZXNldE1vZGlmaWVycyIsICAgICIoSSlWIiwgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzZXRNb2RpZmllcnMgfSwKKyAgICB7ICJuU2V0dXBTaGFkZXIiLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3NldHVwU2hhZGVyIH0sCisgICAgeyAiblNldHVwQ29sb3JGaWx0ZXIiLCAgIihJSSlWIiwgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cENvbG9yRmlsdGVyIH0sCisgICAgeyAiblNldHVwU2hhZG93IiwgICAgICAgIihJRkZGSSlWIiwgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19zZXR1cFNoYWRvdyB9LAorCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJW0NJSUZGSUkpViIsICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dEFycmF5IH0sCisgICAgeyAibkRyYXdUZXh0IiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUlGRklJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0IH0sCisKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElbQ0lJSUlGRklJKVYiLCAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2RyYXdUZXh0UnVuQXJyYXkgfSwKKyAgICB7ICJuRHJhd1RleHRSdW4iLCAgICAgICAiKElMamF2YS9sYW5nL1N0cmluZztJSUlJRkZJSSlWIiwKKyAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kcmF3VGV4dFJ1biB9LAorCisgICAgeyAibkdldENsaXBCb3VuZHMiLCAgICAgIihJTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDspWiIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZ2V0Q2xpcEJvdW5kcyB9LAorI2VuZGlmCit9OworCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgorICAgICNkZWZpbmUgRklORF9DTEFTUyh2YXIsIGNsYXNzTmFtZSkgXAorICAgICAgICAgICAgdmFyID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsgXAorICAgICAgICAgICAgTE9HX0ZBVEFMX0lGKCEgdmFyLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgIiBjbGFzc05hbWUpOyBcCisgICAgICAgICAgICB2YXIgPSBqY2xhc3MoZW52LT5OZXdHbG9iYWxSZWYodmFyKSk7CisgICAgCisgICAgI2RlZmluZSBHRVRfTUVUSE9EX0lEKHZhciwgY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpIFwKKyAgICAgICAgICAgIHZhciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosIG1ldGhvZE5hbWUsIG1ldGhvZERlc2NyaXB0b3IpOyBcCisgICAgICAgICAgICBMT0dfRkFUQUxfSUYoISB2YXIsICJVbmFibGUgdG8gZmluZCBtZXRob2QgIiBtZXRob2ROYW1lKTsKKyNlbHNlCisgICAgI2RlZmluZSBGSU5EX0NMQVNTKHZhciwgY2xhc3NOYW1lKQorICAgICNkZWZpbmUgR0VUX01FVEhPRF9JRCh2YXIsIGNsYXp6LCBtZXRob2ROYW1lLCBtZXRob2REZXNjcmlwdG9yKQorI2VuZGlmCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzKEpOSUVudiogZW52KSB7CisgICAgRklORF9DTEFTUyhnUmVjdENsYXNzSW5mby5jbGF6eiwgImFuZHJvaWQvZ3JhcGhpY3MvUmVjdCIpOworICAgIEdFVF9NRVRIT0RfSUQoZ1JlY3RDbGFzc0luZm8uc2V0LCBnUmVjdENsYXNzSW5mby5jbGF6eiwgInNldCIsICIoSUlJSSlWIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld1Jvb3QuY3BwCmluZGV4IDUxNzNiYjguLjI5ODhhZTggMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19WaWV3Um9vdC5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdSb290LmNwcApAQCAtNzYsMTAgKzc2LDYgQEAKICAgICBjYW52YXMtPnJlc3RvcmUoKTsKIH0KIAotc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X1ZpZXdSb290X2FiYW5kb25HbENhY2hlcyhKTklFbnYqIGVudiwgam9iamVjdCkgewotICAgIFNrR0xDYW52YXM6OkFiYW5kb25BbGxUZXh0dXJlcygpOwotfQotCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtODcsOSArODMsNyBAQAogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CiAgICAgeyAgICJuYXRpdmVTaG93RlBTIiwgIihMYW5kcm9pZC9ncmFwaGljcy9DYW52YXM7SSlWIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF92aWV3X1ZpZXdSb290X3Nob3dGUFMgfSwKLSAgICB7ICAgIm5hdGl2ZUFiYW5kb25HbENhY2hlcyIsICIoKVYiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3Um9vdF9hYmFuZG9uR2xDYWNoZXMgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3ZpZXdfVmlld1Jvb3Rfc2hvd0ZQUyB9CiB9OwogCiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdSb290KEpOSUVudiogZW52KSB7CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkLm1rIGIvY29yZS9yZXMvQW5kcm9pZC5tawppbmRleCA3ZDExMTQ4Li4yMmY0ZmRjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkLm1rCisrKyBiL2NvcmUvcmVzL0FuZHJvaWQubWsKQEAgLTMzLDggKzMzLDE2IEBACiAjIFBST0RVQ1QtYWdub3N0aWMgcmVzb3VyY2UgZGF0YSBsaWtlIElEcyBhbmQgdHlwZSBkZWZpbml0aW9ucy4KIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyA6PSB0cnVlCiAKKyMgSW5jbHVkZSByZXNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHN5c3RlbSBSZW5kZXJTY3JpcHQgZmlsZXMuCitmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUyxmcmFtZXdvcmssLENPTU1PTikvc3JjCitmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUgOj0gJChmcmFtZXdvcmtfR0VORVJBVEVEX1NPVVJDRV9ESVIpL1JlbmRlclNjcmlwdC5zdGFtcAorI0xPQ0FMX1JFU09VUkNFX0RJUiA6PSAkKGZyYW1ld29ya19HRU5FUkFURURfU09VUkNFX0RJUikvcmVuZGVyc2NyaXB0L3JlcyAkKExPQ0FMX1BBVEgpL3JlcworCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKIAorIyBNYWtlIHN1cmUgdGhlIHN5c3RlbSAucnMgZmlsZXMgZ2V0IGNvbXBpbGVkIGJlZm9yZSBidWlsZGluZyB0aGUgcGFja2FnZS1leHBvcnQuYXBrLgorIyAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogJChmcmFtZXdvcmtfUmVuZGVyU2NyaXB0X1NUQU1QX0ZJTEUpCisKICMgZGVmaW5lIGEgZ2xvYmFsIGludGVybWVkaWF0ZSB0YXJnZXQgdGhhdCBvdGhlciBtb2R1bGUgbWF5IGRlcGVuZCBvbi4KIC5QSE9OWTogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldAogZnJhbWV3b3JrLXJlcy1wYWNrYWdlLXRhcmdldDogJChMT0NBTF9CVUlMVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBhOWU0OTcxMy4uODkyOThlYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC04NSw2ICs4NSw4IEBACiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ09OTkVDVEVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0RJU0NPTk5FQ1RFRCIgLz4KICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9TVEFURSIgLz4KKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYWN0aW9uLlVTQl9DQU1FUkFfQVRUQUNIRUQiIC8+CisgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmFjdGlvbi5VU0JfQ0FNRVJBX0RFVEFDSEVEIiAvPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIFBlcm1pc3Npb25zIGZvciB0aGluZ3MgdGhhdCBjb3N0IG1vbmV5IC0tPgpAQCAtMzM2LDYgKzMzOCwxMyBAQAogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX2FjY291bnRNYW5hZ2VyU2VydmljZSIKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX2FjY291bnRNYW5hZ2VyU2VydmljZSIgLz4KIAorICAgIDwhLS0gQWxsb3dzIGFuIGludGVybmFsIHVzZXIgdG8gdXNlIHByaXZhbGVkZ2VkIENvbm5lY3Rpdml0eU1hbmFnZXIKKyAgICBBUElzLgorICAgICAgICBAaGlkZSAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DT05ORUNUSVZJVFlfSU5URVJOQUwiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuTkVUV09SSyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZU9yU3lzdGVtIiAvPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gUGVybWlzc2lvbnMgZm9yIGFjY2Vzc2luZyBhY2NvdW50cyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xMjY3LDcgKzEyNzYsNyBAQAogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhjbHVkZUZyb21SZWNlbnRzPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlBsYXRMb2dvQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiI+CisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL1RoZW1lLldhbGxwYXBlci5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iPgogICAgICAgICA8L2FjdGl2aXR5PgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuRGlzYWJsZUNhck1vZGVBY3Rpdml0eSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUuTm9EaXNwbGF5IgpAQCAtMTMwNCw2ICsxMzEzLDEwIEBACiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5BQ1RJT05fUkVRVUVTVF9TSFVURE9XTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5SRUJPT1QiIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLk5ldEluaXRpYXRlZEFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS9UaGVtZS5EaWFsb2cuQWxlcnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LWRpc2FibGVkLnBuZyBiL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTIyMGU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL2Fzc2V0cy9pbWFnZXMvY29tYm9ib3gtZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvYXNzZXRzL2ltYWdlcy9jb21ib2JveC1ub0hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJjZGY3Mi4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9hc3NldHMvaW1hZ2VzL2NvbWJvYm94LW5vSGlnaGxpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaHlwaF9lbl9VUy5kaWMgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MTIwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2h5cGhfZW5fVVMuZGljCkBAIC0wLDAgKzEsOTc4NCBAQAorSVNPODg1OS0xCitMRUZUSFlQSEVOTUlOIDIKK1JJR0hUSFlQSEVOTUlOIDMKKy5hMmNoNAorLmFkNGRlcgorLmEyZAorLmFkMWQ0CisuYTJmMXQKKy5hMmYKKy5hNGwzdAorLmFtNWF0CisuNGExbWEKKy5hbjVjCisuYTJuCisuMmFuZzQKKy5hbjFpNW0KKy5hbjF0NAorLmFuM3RlCisuYW50aTVzCisuYW50MmkKKy5hNHI1czIKKy4yYTJyCisuYXI0dDJpZTQKKy5hcjF0aQorLmFyNHR5CisuYXMzYworLmFzMXAKKy5hMnMxcworLmFzdGVyNQorLmEydG9tNQorLmExdG8KKy5hdTFkCisuYXY0aQorLmF3bjQKKy5iYTRnCisuYmE1bmEKKy5iYTJuCisuYmFzNGUKKy5iZXI0CisuYmU1cjFhCisuYmUzczFtCisuNGJlczQKKy5iNGU1czJ0bworLmJyaTIKKy5idXQ0dGkKKy5idTR0M3QyCisuY2FtNHBlCisuMWNhCisuY2E0bTFwCisuY2FuNWMKKy5jYTJuCisuY2FwYTViCisuY2ExcGEKKy5jYXI1b2wKKy5jMmEycgorLmNhNHQKKy5jZTRsYQorLjJjaDQKKy5jaGlsbDVpCisuY2g0aWwyCisuY2hpbDFsCisuMWNpMgorLmNpdDVyCisuMmMxaXQKKy5jbzNlMgorLjFjbworLmNvNHIKKy5jb3I1bjFlcgorLmNvcm4yZQorLmRlNG1vaTIKKy5kNGVtCisuZGUxbW8KKy5kZTNvCisuZGUzcjFhCisuZGUzcjFpCisuZGUxczRjCisuZGVzMgorLmRpYzF0MmlvNQorLjNkaTJjMXQKKy5kbzR0CisuMWRvCisuZHU0YworLjFkdQorLmR1NG0xYjUKKy5lYXJ0aDUKKy5lYXIydAorLmUyYTJyCisuZWFzM2kKKy4yZTFiNAorLmVlcjQKKy5lZzIKKy5lMmw1ZAorLmVsM2VtCisuZW5hbTMKKy5lMW5hCisuZW4zZworLmUybjNzMgorLmVxNXVpNXQKKy5lMXEKKy5lcXUyCisuZXEydWkyCisuZXI0cmkKKy5lcjFyNAorLmVzMworLjRldTMKKy5leWU1CisuZmVzMworLmZvcjVtZXIKKy4xZm8KKy5mbzJyCisuZm9yMW0KKy5mb3IybWUKKy4xZ2EyCisuZ2UyCisuZ2VuM3Q0CisuMWdlbgorLmdlNW8yZworLjFnZW8KKy4xZzJpNWEKKy5naTRiCisuZ280cgorLjFnbworLmhhbmQ1aQorLmhhMm4KKy5oNGFuZAorLmhhNG41azIKKy5oZTIKKy5oZXJvNWkyCisuaDJlcm8KKy5oMWVzMworLmhlNHQzCisuaGkzYgorLmhpM2VyCisuaDJpZTQKKy5ob241ZXkKKy5obzJuCisuaG9uM28KKy5ob3Y1CisuaWQ0bAorLjJpZAorLmlkb2wzCisuaTFkbworLmltM20KKy5pbTVwMWkybgorLmk0bTFwCisuaW0ycGkKKy5pbjEKKy5pbjNjaQorLjJpbmUyCisuNGk0bjJrMgorLjJpMm4zczIKKy5pcjVyNAorLjRpcgorLmlzNGkKKy5qdTNyCisubGE0Y3kKKy5sYTRtCisubGF0NWVyCisubDRhdGg1CisubGUyCisubGVnNWUKKy5sZW40CisubGVwNQorLmxldjEKKy5sMmk0ZworLmxpMWc1YQorLmxpMm4KKy5sMmkzbworLmwxaTR0CisubWExZzVhNQorLjFtYQorLm1hbDVvCisubWExbjVhCisubWEybgorLm1hcjV0aQorLm0yYTJyCisubWUyCisubWVyM2MKKy5tZTV0ZXIKKy5tZTF0ZQorLm0yaXMxCisubWlzNHQ1aQorLm1vbjNlCisuMW1vCisubW8ybgorLm1vM3JvCisubW8ycgorLm11NXRhCisuMW11CisubXUydGE1YgorLm5pNGMKKy5vZDIKKy5vZDFkNQorLm9mNXRlCisubzJmdAorLm9yNWExdG8KKy5vMXJhCisub3IzYworLm9yMWQKKy5vcjN0Cisub3MzCisub3M0dGwKKy40b3RoMworLm91dDMKKy5vdTIKKy5wZWQ1YWwKKy4ycDJlZAorLnAyZTJkMmEKKy5wZTV0ZQorLnBlMnQKKy5wZTV0aXQKKy5wMmk0ZTQKKy5waW81bjQKKy4zcDJpMW8KKy5waTJ0CisucHJlM20KKy5wcjIKKy5yYTRjCisucmFuNHQKKy5yYTJuCisucmF0aW81bjFhCisucmF0aW8ybjQKKy5yYTF0MmlvCisucmVlMgorLnJlNW1pdAorLnJlczIKKy5yZTVzdGF0CisucmVzMnQKKy5yZXMxdGEKKy5yMmk0ZworLnJpMnQ1dQorLnJvNHEKKy5yb3M1dAorLnJvdzVkCisucnU0ZAorLjNzNGMyaTNlNAorLnMxY2kKKy41c2UybDJmNQorLnNlbDFsNQorLnNlMm4KKy5zZTVyMmllNAorLnNlcjFpCisuczJoMgorLnNpMgorLnMzaW5nNAorLjJzMWluCisuc3Q0Cisuc3RhNWIybDIKKy5zMXRhCisuczJ0YWIKKy5zNHkyCisuMXRhNAorLnRlNAorLjN0ZW41YTJuCisudGUxbmEKKy50aDIKKy50aTIKKy50aWw0CisudGkxbTVvNQorLjF0aW0KKy50aW5nNAorLjJ0MWluCisudDRpNG41azIKKy50bzFuNGEKKy4xdG8KKy50bzJuCisudG80cAorLnRvcDVpCisudG8ydTVzCisudG91MgorLnRyaWI1dXQKKy50cjRpYgorLnUxbjFhCisudW4zY2UKKy51bmRlcjUKKy51bjFkZQorLnUybjFlCisudTRuNWsyCisudW41bworLnVuM3U0CisudXAzCisudXJlMworLnVzNWEyCisuMnVzCisudmVuNGRlCisudmU1cjFhCisud2lsNWkKKy53aTIKKy53aWwyCisueWU0Cis0YWIuCithNWJhbAorYTViYTJuCithYmUyCithYjVlcmQKK2FiMmk1YQorYWI1aTJ0NWFiCithYmkydAorYWJpMXRhCithYjVsYXQKK2FiMmwyCithYjVvNWwxaXoKK2Fib2wyaQorNGFicgorYWI1cm9nCithYjN1bAorYTRjMmEycgorYTFjYQorYWM1YXJkCithYzVhcm8KK2E1Y2VvdTIKK2FjMWVyCithNWNoZTR0CithMmNoCithY2hlMgorNGEyY2kKK2EzYzJpZTQKK2EyYzFpbgorYTNjMmlvCithYzVyb2IKK2FjdDVpZjIKK2EyYzF0CithYzN1bAorYWM0dW0KK2EyZAorYWQ0ZDFpbgorYWQxZDQKK2FkNWVyLgorMmFkaQorYTNkNGkzYQorYWQzaTFjYQorYWRpNGVyCithZDJpZTQKK2EzZDJpbworYTNkaXQKK2E1ZGkxdQorYWQ0bGUKK2FkM293CithMWRvCithZDVyYTJuCithMWRyCithZDRzdQorYTJkMXMyCis0YTFkdQorYTNkdTJjCithZDV1bQorYWU0cgorYWVyMmk0ZTQKK2FlcjFpCithMmYKK2E0ZjFmNAorYTRnYWIKK2ExZ2EKK2FnYTRuCithZzVlbDFsCithMWdlNG8KKzRhZzRldQorYWcxaQorNGFnNGwyCithZzFuCithMmdvCiszYTNnNG80ZworYWczbzNuaQorYWdvMm4yCithNWd1ZXIKK2EyZ3VlCithZzV1bAorYTRneQorYTNoYQorYTNoZQorYTRoNGw0CithM2hvCithaTIKK2E1aTFhCithM2ljLgorYWk1bHkKK2E0aTRuCithaW41aW4KK2EyaW5pCithMmkxbjVvCithaXQ1ZW4KK2EyaXRlCithMWoKK2FrMWVuCithbDVhYgorYWwzYTJkCithNGwyYTJyCis0YWxkaTQKK2EybGQKKzJhbGUKK2FsM2VuZAorYTRsZW50MmkKK2ExbGVuMXQKK2E1bGU1bworYWwxaQorYWw0aWEuCithbDJpMWEKK2FsMmk0ZTQKK2FsNWxldgorYWwxbAorYWwybGUKKzRhbGxpYworYWxsMmkKKzRhMmxtCithNWxvZy4KK2E0bHkuCithMWx5Cis0YTJseXM0Cis1YTVseXMxdAorNWFseXQKKzNhbHl6Cis0YTFtYQorYTJtNWFiCithbTNhZworYW1hNXJhCithbTJhMnIKK2FtNWFzYworYTRtYTN0aXMKK2E0bTVhMXRvCithbTVlcjFhCithbTNpYworYW01aWYKK2FtNWkxbHkKK2FtMWluCithbTJpNG5vCithMm1vCithNW1vMm4KK2Ftb3I1aQorYW1vMnIKK2FtcDVlbgorYTRtMXAKK2EybgorYW4zYWdlCithMW5hCiszYW5hMWx5CithM24yYTJyCithbjNhcjNjCithbmFyNGkKK2EzbmF0aQorYW4yYXQKKzRhbmQKK2FuZGU0czIKK2FuMWRlCithbjNkaXMxCithbjFkbAorYW40ZG93CithbjFkbworYTVuZWUKK2EzbmVuCithbjVlMnN0LgorYTFuZXMKK2EybmVzdAorYTNuNGV1CisyYW5nCithbmc1aWU0CithbjFnbDIKK2E0bjFpYworYTNuaWVzCithbjJpZTQKK2FuM2kzZgorYW40aW1lCithbjFpbQorYTVuaW0xaQorYTVuMmluZQorYW4xaW4KK2FuM2k0bworYTNuMmlwCithbjNpczJoCithbjNpdAorYTNuaTF1CithbjRrbGkKK2E0bmsyCithbjFrMWwKKzVhbm5pegorYTRuMW4yCithbm80CithbjVvdAorYW40b3RoNQorYW4yc2EyCithMm4xczIKK2FuNHMxY28KK2FuczRjCithbjRzMW40CithbjJzcAorYW5zM3BvCithbjRzdAorYW40c3UycgorYW4xc3UKK2FudGEybDQKK2FuMXQKK2FuMXRhCithbjR0MmllNAorYW50MmkKKzRhbjF0bworYW4ydHIKK2FuNHR3NAorYW4zdTFhCithbjN1bAorYTVudXIKKzRhbworYXAyYTJyNAorYTFwYQorYXA1YXQKK2FwNWVyM28KK2EzcGg0ZXIKKzRhcGhpCithNHBpbGxhCithcGlsMWwKK2FwNWlsbDJhMnIKK2FwM2kybgorYXAzaTF0YQorYTNwaTJ0dQorYTJwMmwyCithcG80YzUKK2FwNW8xbGEKK2Fwb3I1aQorYTFwNG9yCithcG9zM3QKK2ExcG9zCithcHM1ZTRzCithMnAxczIKK2FwMnNlCithM3B1CithcXVlNQorYXF1MgorMmEycgorYXIzYTJjMXQKK2E1cmFkZQorYXJhMmQKK2FyNWFkaXMxCithcjJhZGkKK2FyM2FsCithNXJhbWUxdGUKK2FyYW0zZXQKK2FyMmFuNGcKK2FyYTJuCithcmEzcAorYXI0YXQKK2E1cmExdDJpbworYXI1YTF0Mml2CithNXJhdQorYXI1YXY0CithcmF3NAorYXJiYWw0CithcjFiCithcjRjaGEybgorYXIxYworYXIzY2hhCithcjJjaAorYXI1ZDJpbmUKK2FyZDJpCithcmQxaW40CithcjRkcgorYXI1ZWFzCithM3JlZQorYXIzZW4xdAorYTVyMmUyc3MKK2FyNGZpCithcjFmCithcjRmNGwyCithcjFpCithcjVpMmFsCithcjJpM2EKK2FyM2kyYTJuCithM3JpNWV0CithcjJpZTQKK2FyNGltCithcjVpbjJhdAorYXIyaTFuYQorYXIzaTFvCithcjJpegorYXIybWkKK2FyMW0KK2FyNW81ZAorYTVyb25pCithcm8ybgorYTNyb28yCithcjJwCithcjNxCithcnJlNAorYXIxcjQKK2FyNHNhMgorYTRyczIKK2FyMnMyaAorNGFzLgorYTJzNGFiCithc2EyCithczNhbjF0Cithc2EybgorYXNoaTQKK2FzMmgKK2E1c2lhLgorYXMyaTFhCithM3NpMWIKK2Ezc2ljCis1YTVzaTR0Cithc2szaQorYXNrMgorYXM0bDIKK2E0c29jCithMXNvCithczVwaAorYXM0czJoCithMnNzCithczN0ZW4KK2FzMXQ0cgorYXN1MXI1YQorYTFzdQorYXN1MnIKK2EydGEKK2F0M2FiMmwyCithMnRhYgorYXQ1YWMKK2F0M2FsbworYXRhMmwKK2F0NWFwCithdGU1YworYXQ1ZTJjaAorYXQzZTFnbworYXRlZzQKK2F0M2VuLgorYXQzZXIxYQorYXRlcjVuCithNXRlcjFuYQorYXQzZXN0CithdDVldgorNGF0aAorYXRoNWVtCithdGgyZQorYTV0aGUybgorYXQ0aG8KK2F0aDVvbQorNGF0aS4KK2E1dDJpMWEKK2EydDVpNWIKK2F0MWljCithdDNpZjIKK2F0aW9uNWEycgorYTF0MmlvCithdGlvMm4KK2F0aW8xbjFhCithdDNpMXR1CithNHRvZworYTF0bworYTJ0b20KK2F0NW9tMml6CithNHRvcAorYTR0b3MyCithMXRyCithdDVyb3AKK2F0NHNrMgorYTR0MXMyCithdDR0YWcKK2E0dDN0MgorYXQxdGEKK2F0NXRlCithdDR0aAorYTJ0dQorYXQ1dTFhCithNHQ1dWUKK2F0M3VsCithdDN1MXJhCithMnR5CithdTRiCithdWdoMworYXUzZ3UKK2F1NGwyCithdW41ZAorYXUzcgorYXU1c2kxYgorYTJ1cworYTR1dDVlbgorYXUxdGgKK2EydmEKK2F2M2FnNAorYTV2YTJuCithdjRlNG5vCithdjNlcjFhCithdjVlcm4KK2F2NWVyeQorYXYxaQorYXZpNGVyCithdjJpZTQKK2F2M2lnCithdjVvYworYTF2b3IKKzNhd2F5CithdzNpMgorYXc0bHkKK2F3czQKK2F4NGk1YworYXgzaQorYXg0aWQKK2F5NWFsCitheWU0CitheXM0Cithemk0ZXIKK2EyejFpCithejJpZTQKK2F6Mno1aQorYTR6MXoyCis1YmEuCitiYWQ1Z2VyCitiYTJkCitiYTRnZQorYmFsMWEKK2JhbjVkYWcKK2JhMm4KK2I0YW5kCitiYW4xZDJhCitiYW40ZQorYmFuM2kKK2JhcmJpNQorYjJhMnIKK2JhcjFiCitiYXIyaTRhCitiYXIxaQorYmFzNHNpCitiYTJzcworMWJhdAorYmE0egorMmIxYgorYjJiZQorYjNiZXIKK2JiaTRuYQorNGIxZAorNGJlLgorYmVhazQKK2JlYTJ0MworNGJlMmQKK2IyZTNkMmEKK2JlM2RlCitiNGUzZGkKK2JlM2dpCitiZTVndQorMWJlbAorYmUxbDJpCitiZTNsbworNGJlNW0KK2JlNW4yaWcKK2JlNW51Cis0YmVzNAorYmUzc3AKK2IyZTVzdDRyCiszYmV0CitiZTF0NWl6CitiZTV0cgorYmUzdHc0CitiZTN3CitiZTV5MW80CisyYmYKKzRiM2gKK2JpMmIKK2IyaTRkCiszYjJpZTQKK2JpNWVuCitiaTRlcgorMmIzaWYKKzFiaWwKK2JpM2wyaXoKK2JpbDFpCitiaW4yYTVyNAorYmkxbmEKK2I0aW40ZAorYmk1bmV0CitiMmluZQorYmkzbzJncgorYjJpbworYmk1b3UyCitiaTJ0CiszYjJpM3QyaW8KK2JpMXRpCitiaTN0cgorM2JpdDV1MWEKK2JpMXR1CitiNWk0dHoKK2IxagorYms0CitiMmwyCitibDRhdGg1CitiNGxlLgorYmxlbjQKKzVibGUxc3AKK2JsZXMyCitiM2xpcworYjRsbworYmx1bjR0Cis0YjFtCis0YjNuCitibmU1ZworM2JvZAorYm9kM2kKK2JvNGUKK2JvbDNpYworYm9sMmkKK2JvbTRiaQorYm80bTFiCitibzFuNGEKK2JvMm4KK2JvbjVhdAorM2JvbzIKKzVib3IuCis0YjFvMXJhCitib3I1ZAorNWJvcmUKKzVib3JpCis1Ym9zNAorYjVvMXRhCitiNG90aDUKK2JvNHRvCitib3VuMmQzCitib3UyCis0YnAKKzRicml0CiticjRvdGgzCisyYjVzMgorYnNvcjQKK2Ixc28KKzJidAorYjJ0NGwKK2I0dG8KK2IzdHIKK2J1ZjRmZXIxCitidTRmMWYKK2J1NGdhCitidTNsMmkKK2J1MW1pNAorYnU0bgorYnVudDRpCitidW4xdAorYnUzcmUKK2J1czVpZTQKK2IydXMKK2J1c3M0ZQorYnUyc3MKKzVidXN0Cis0YnUxdGEKKzNidTF0MmlvCitiNHUxdDJpCitiNXUxdG8KK2IxdgorNGI1dworNWJ5LgorYnlzNAorMWNhCitjYWIzaW4KK2NhMWIybDIKK2NhMmNoNAorY2E1ZGVuCitjYTJkCis0Y2FnNAorMmM1YWgKK2NhM2xhdAorY2FsNGxhCitjYWwxbAorY2FsMmw1aW40CitjYWxsMmkKKzRjYWxvCitjNGFuNWQKK2NhMm4KK2NhbjRlCitjYTRuNGljCitjYW41aXMKK2NhbjNpegorY2FuNHR5CitjYW4xdAorY2FueTQKK2NhNXBlcgorY2FyNW9tCitjMmEycgorY2FzdDVlcgorY2FzNXQyaWcKK2Nhc3QyaQorNGNhczR5CitjNGE0dGgKKzRjYTF0Mml2CitjYXY1YWwKK2NhMnZhCitjM2MKK2NjaGE1CitjMmNoCitjM2MyaTRhCitjMWNpCitjY29tMXBhNQorYzFjbworY2NvNG0xcAorY2NvMm40CitjY291M3QKK2Njb3UyCisyY2UuCis0Y2VkLgorNGNlMWRlbgorM2NlaTIKKzVjZWwuCiszY2VsMWwKKzFjZW4KKzNjZW5jCisyY2VuNGUKKzRjZW5pCiszY2VuMXQKKzNjZXAKK2NlNXJhbQorY2VyMWEKKzRjZTFzNGEyCiszY2VzMXNpCitjMmUyc3MKK2NlczVzaTViCitjZXM1dAorY2V0NAorYzVlNHRhCitjZXc0CisyY2gKKzRjaC4KKzRjaDNhYgorNWNoYTRuMWljCitjaGEybgorY2g1YTVuaXMKK2NoZTIKK2NoZWFwMworNGNoNGVkCitjaDVlNWxvCiszY2hlbWkKK2NoNWVuZQorY2hlMm4KK2NoM2VyLgorY2gzZTRyMXMyCis0Y2gxaW4KKzVjaGkybmUuCitjaDJpbmUKK2NoNWk1bjJlMnNzCitjaGkxbmVzCis1Y2gyaW5pCis1Y2gyaW8KKzNjaGl0CitjaGkyegorM2NobzIKK2NoNHRpCisxY2kKKzNjMmkxYQorY2kyYTViCitjaTJhNXIKK2NpNWMKKzRjaWVyCitjMmllNAorNWM0aTJmM2ljLgorY2kxZmkKKzRjNGk1aTQKK2NpNGxhCiszY2lsMWkKKzJjaW0KKzJjaW4KK2M0aTFuYQorM2NpbjJhdAorY2luM2VtCitjMmluZQorYzFpbmcKK2M1aW5nLgorNWMyaTFubworY2lvMm40CitjMmlvCis0Y2lwZTQKK2MyaXAKK2NpM3BoCis0Y2lwNGljCitjaXAzaQorNGNpczF0YQorNGNpczF0MmkKKzJjMWl0CitjaTF0M2l6CitjaTF0aQorNWNpegorY2sxCitjazNpCisxYzRsNAorNGNsMmEycgorYzVsYTVyYTF0MmlvCitjbGFyNGF0Cis1Y2xhcmUKK2NsZTRtCis0Y2xpYworY2xpbTQKK2MxbHk0CitjNW4KKzFjbworY281YWcKK2M0b2EKK2NvZTIKKzJjb2cKK2NvNGdyCitjb2k0CitjbzNpbmMKK2NvbDVpCis1Y29sbworY29sM280cgorY29tNWVyCitjbzJtZQorY28xbjRhCitjbzJuCitjNG9uZQorY29uM2cKK2NvbjV0CitjbzNwYQorY29wM2ljCitjbzRwMmwyCis0Y29yMWIKK2Nvcm8zbgorY29zNGUKK2NvdjEKK2NvdmU0Citjb3c1YQorY28yejVlCitjbzV6MWkKK2MxcQorY3JhczV0CitjcjJhcworNWNyYXQuCis1Y3JhdDFpYworY3JlM2EydAorNWMycjJlZAorNGMzcmUxdGEKK2NyZTR2MgorY3JpMgorY3JpNWYKK2M0cmluCitjcjJpczQKKzVjcmkxdGkKK2NybzRwMmwyCitjcm9wNW8KK2Nyb3M0ZQorY3J1NGQKKzRjM3MyCisyYzF0CitjMnRhNGIKK2MxdGEKK2N0NWFuZworY3RhMm4KK2M1dGFuMXQKK2MydGUKK2MzdGVyCitjNHQ0aWMxdQorY3RpbTNpCitjMXRpbQorY3R1NHIKK2MxdHUKK2M0dHc0CitjdWQ1CitjNHVmCitjNHVpMgorY3U1aTF0eQorNWN1bDJpCitjdWw0dGlzNAorY3VsMXRpCitjdTRsdAorM2M0dWwxdHUyCitjdTJtYQorYzN1bWUKK2N1NG1pCiszY3VuCitjdTNwaQorY3U1cHkKK2N1MnI1YTRiCitjdTFyYQorY3U1cjJpM2EKKzFjMnVzCitjdXMxczRpCitjdTJzcworM2M0dXQKK2N1NHQyaWU0CitjNHUxdDJpCis0YzV1MXQyaXYKKzRjdXRyCisxY3kKK2MyemU0CisxZDJhCis1ZGEuCisyZDNhNGIKK2RhMmNoNAorNGRhMmYKKzJkYWcKK2RhMm0yCitkMmFuM2cKK2RhMm4KK2RhcmQ1CitkMmEycgorZGFyazUKKzRkYXJ5CiszZGF0Cis0ZGExdDJpdgorNGRhMXRvCis1ZGF2NAorZGF2NWUKKzVkYXkKK2QxYgorZDVjCitkMWQ0CisyZGUuCitkZWEyZjUKK2RlNGI1aTJ0CitkMmUxYgorZGU0Ym8ybgorZGVjYTJuNAorZGUxY2EKK2RlNGNpbAorZGUxYzJpCitkZTVjb20KK2RlMWNvCisyZDFlZAorNGRlZS4KK2RlNWlmCitkZWkyCitkZWwyaTRlNAorZGVsMmkKK2RlNGw1aTVxCitkZTVsbworZDRlbQorNWRlbS4KKzNkZW1pYworZGVtNWljLgorZGU1bWlsCitkZTRtbzJuM3MyCitkZTFtbworZGVtbzJuCitkZW1vMnI1CisxZGVuCitkZTRuMmEycgorZGUxbmEKK2Q0ZTNubworZGVudGk1ZjIKK2RlbjF0CitkZW50MmkKK2RlM251CitkZTFwCitkZTNwYQorZGVwaTQKK2RlMnB1CitkM2UxcQorZDRlcjFoNAorNWRlcjNtNAorZDVlcm41aXoKK2RlNHI1czIKK2RlczIKK2QyZXMuCitkZTFzMmMKK2RlMnM1bworZGVzM3QyaQorZDJlM3N0NHIKK2RlNHN1CitkZTF0CitkZTJ0bworZGUxdgorZGUydjNpNGwKK2RlMXZpCis0ZGV5Cis0ZDFmCitkNGdhCitkM2dlNHQKK2RnMWkKK2QyZ3kKK2QxaDIKKzVkaS4KKzFkNGkzYQorZGlhNWIKK2Q0aTRjYW0KK2RpMWNhCitkNGljZQorM2RpMmMxdAorM2QyaWQKKzVkaTNlbgorZDJpZTQKK2QxaWYKK2RpM2dlCitkMmlnCitkaTRsYTF0bworZGkxbGEKK2QxaW4KKzFkaTFuYQorM2RpMm5lLgorZDJpbmUKKzVkMmluaQorZGk1bml6CisxZDJpbworZGlvNWcKK2RpNHAybDIKK2QyaXAKK2Q0aXIyCitkaTFyZQorZGlyMXQ1aQorZGlzMQorNWRpc2kKK2Q0aXMzdAorZDJpMXRpCisxZDJpMXYKK2QxagorZDVrMgorNGQ1bGEKKzNkbGUuCiszZGxlZAorM2RsZXMuCitkbGVzMgorNGQzbDJlMnNzCisyZDNsbworNGQ1bHUKKzJkMWx5CitkMW0KKzRkMW40CisxZG8KKzNkby4KK2RvNWRlCis1ZG9lCisyZDVvZgorZDRvZworZG80bGEKK2RvbDJpNAorZG81bG80cgorZG9tNWl6CitkbzNuMmF0CitkbzJuCitkbzFuMWEKK2Rvbmk0Citkb28zZAorZG9vMgorZG80cDRwCitkNG9yCiszZG9zCis0ZDVvdXQKK2RvdTIKK2RvNHYKKzNkb3gKK2QxcAorMWRyCitkcmFnNW8ybjIKK2RyYTJnbworNGRyMmFpMgorZHJlNAorZHJlMmE1cgorNWRyZW4KK2RyNGk0YgorZHJpbDQKK2RybzRwCis0ZHJvdworNWRydXBsaQorZHJ1M3AybDIKKzRkcnkKKzJkMXMyCitkczRwCitkNHN3MgorZDRzNHkKK2QydGgKKzFkdQorZDF1MWEKK2R1MmMKK2QxdTNjYQorZHVjNWVyCis0ZHVjdC4KK2R1MmMxdAorNGR1YzR0MXMyCitkdTVlbAorZHU0ZworZDN1bDRlCitkdW00YmUKK2R1NG0xYgorZHU0bgorNGR1cAorZHU0cGUKK2QxdgorZDF3CitkMnkKKzVkeW4KK2R5NHMyZQorZHlzNXAKK2UxYTRiCitlM2EyYzF0CitlYTJkMQorZWFkNWllNAorZTJhZGkKK2VhNGdlCitlYTVnZXIKK2VhNGwKK2VhbDVlcgorZTJhbGUKK2VhbDNvdTIKK2VhbTNlcgorZTVhbmQKK2VhMm4KK2VhcjNhCitlMmEycgorZWFyNGMKK2VhcjVlcworZWFyNGljCitlYXIxaQorZWFyNGlsCitlYXI1aworZWFyMnQKK2VhcnQzZQorZWE1c3AKK2UzYTJzcworZWFzdDMKK2VhMnQKK2VhdDVlbgorZWF0aDNpCitlNGF0aAorZTVhdDNpZjIKK2U0YTN0dQorZWEydgorZWF2M2VuCitlYXY1aQorZWF2NW8KKzJlMWIKK2U0YmVsLgorZTFiZWwKK2U0YmUybDFzMgorZTRiZW4KK2U0YmkydAorZTNicgorZTRjYTJkCitlMWNhCitlY2FuNWMKK2VjYTJuCitlYzFjYTUKK2VjM2MKK2UxY2UKK2VjNWVzMXNhMgorZWMyZTJzcworZTFjMmkKK2U0Y2liCitlYzVpZmljYXQKK2VjaTFmaQorZWNpZmkxY2EKK2VjNWkzZjJpZTQKK2VjNWkxZnkKK2UyYzNpbQorZTJjMWk0dAorZTVjMml0ZQorZTRjbGFtCitlMWM0bDQKK2U0Y2wydXMKK2UyY29sCitlMWNvCitlNGNvbTFtCitlNGNvbXBlCitlY280bTFwCitlNGNvbjFjCitlY28ybgorZTJjb3IKK2VjM28xcmEKK2VjbzVybworZTFjcgorZTRjcmVtCitlYzR0YTJuCitlMmMxdAorZWMxdGEKK2VjNHRlCitlMWN1CitlNGN1bAorZWMzdTFsYQorMmUyZDJhCis0ZWQzZDQKK2U0ZDFlcgorZWRlNHMyCis0ZWRpCitlM2Q0aTNhCitlZDNpYgorZWQzaTFjYQorZWQzaW0KK2VkMWl0CitlZGk1egorNGUxZG8KK2U0ZG9sCitlZG8ybjIKK2U0ZHJpCitlMWRyCitlNGR1bAorZTFkdQorZWQ1dTFsNG8KK2VlMmMKK2U0ZWQzaQorZWUyZgorZWVsM2kKK2VlNGx5CitlZTJtCitlZTRuYQorZWU0cDEKK2VlMnM0CitlZXN0NAorZWU0dHkKK2U1ZXgKK2UxZgorZTRmM2VyZQorZWZlcjEKKzFlNGYxZgorZTRmaWMKK2UxZmkKKzVlZjJpMWM0aQorZWZpbDQKK2UzZjJpMm5lCitlMmZpbgorZWY1aTVuMml0ZQorZWYyaW5pCitlZmluMml0CiszZWZpdAorZWZvcjVlcworZTFmbworZWZvMnIKK2U0ZnU0c2UuCitlM2Z1CitlZjJ1cworNGVnYWwKK2UxZ2EKK2VnZXI0CitlZzVpYgorZWc0aWMKK2VnNWluZworZTVnaXQ1CitlZzVuCitlNGdvLgorZTFnbworZTRnb3MKK2VnMXVsCitlNWd1cgorNWUxZ3kKK2UxaDQKK2VoZXI0CitlaTIKK2U1aWMKK2UyaTVkCitlMmlnMgorZWk1ZzRsMgorZTNpNG0xYgorZTNpbjNmCitlMWluZworZTVpbnN0CitlMmkybjFzMgorZWlyNGQKK2U0aXIKK2UyaXQzZQorZTJpM3RoCitlNWkxdHkKK2UxagorZTRqdWQKK2VqNXVkaQorZWtpNG4KK2VrMWkKK2VrNGxhCitlazFsCitlMWxhCitlNGxhLgorZTRsYWMKK2UzbDRhbjRkCitlbGEybgorZTRsNWExdDJpdgorZTRsYXcKK2VsYXgxYTQKK2UzbGUyYQorZWw1ZWJyYQorZWwyZTFiCitlbGUzYnIKKzVlbGVjCitlNGxlZAorZWwzZTFnYQorZTVsZW4KK2U0bDFlcgorZTFsZXMyCitlMmwyZgorZWwyaQorZTNsaWJlNAorZTRsNWljLgorZWwzaTFjYQorZTNsaWVyCitlbDJpZTQKK2VsNWkzZ2liCitlbDJpZworZWw0aWdpCitlNWxpbQorZTRsM2luZworZTNsMmlvCitlMmxpcworZWw1aXMyaAorZTNsMml2MworNGVsbGEKK2VsMWwKK2VsNGxhYgorZWxsNG80CitlNWxvYworZWw1b2cKK2VsM29wLgorZWwyczJoCitlMmwxczIKK2VsNHRhCitlNGx0CitlNWx1ZAorZWw1dWcKK2U0bWFjCitlMW1hCitlNG1hZworZTVtYTJuCitlbTVhMW5hCitlNG01YgorZTFtZQorZTJtZWwKK2U0bWV0CitlbTNpMWNhCitlbTJpNGU0CitlbTVpZ3JhCitlbTJpZzQKK2VtaTFncgorZW0xaW4yCitlbTVpbmUKK2VtM2kzbmkKK2U0bTJpcworZW01aXMyaAorZTVtNGkyczFzCitlbTNpegorNWVtbml6CitlNG0xbgorZW1vNGcKK2UxbW8KK2VtbzNuMmk1bworZW1vMm4KK2VtM3BpCitlNG0xcAorZTRtdWwKK2UxbXUKK2VtNXUxbGEKK2VtdTNuMgorZTNteQorZW41YTJtbworZTFuYQorZTRuYW4xdAorZW4yYTJuCitlbmNoNGVyCitlbjJjaAorZW5jaGUyCitlbjNkaWMKK2U1bmVhCitlNW5lZQorZW4zZW0KK2VuNWVybworZW4xZXIKK2VuNWUxc2kKK2UxbmVzCitlMm41ZXN0CitlbjNldHIKK2UzbmU0dworZW41aTRjM3MyCitlNW4yaWU0CitlNW5pbAorZTNuMmk0bworZW4zaXMyaAorZW4zaXQKK2U1bmkxdQorNWVuaXoKKzRlNG4xbjIKKzRlbm8KK2U0bm80ZworZTRub3MKK2VuM292CitlbjRzdzIKK2UybjFzMgorZW50NWFnZQorZW4xdAorZW4xdGEKKzRlbnRoMWVzCitlbnRoMmUKK2VuM3UxYQorZW41dWYKK2UzbnkuCis0ZTRuM3oKK2U1b2YKK2VvMmcKK2U0b2k0CitlM29sCitlb3AzYTJyCitlbzJwYQorZTFvcgorZW8zcmUKK2VvNXJvbAorZW9zNAorZTRvdAorZW80dG8KK2U1b3V0Citlb3UyCitlNW93CitlMnBhCitlM3A0YWkyCitlcDVhbmMKK2VwYTJuCitlNXBlbAorZTNwZW4xdAorZXA1ZTV0MmkxdDJpbworZXBlMnQKK2VwZXRpMXRpCitlcGhlNAorZTRwbGkKK2UxcDJsMgorZTFwbworZTRwcmVjCitlcHIyCitlcDVyZTFjYQorZTRwMnIyZWQKK2VwM3JlMWg0CitlM3BybworZTRwcm9iCitlcDRzNGgKK2UycDFzMgorZXA1dGk1YgorZTJwMXQKK2U0cHUydAorZXA1dTF0YQorZTFxCitlcXVpM2wKK2VxdTIKK2VxMnVpMgorZTRxM3VpM3MKK2VyMWEKK2UycmE0YgorNGVyNGFuZAorZXJhMm4KK2VyM2EycgorNGVyNGF0aS4KKzJlcjFiCitlcjRiMmwyCitlcjNjaAorZXIxYworZXI0Y2hlMgorMmUycmUuCitlM3JlMWE0bAorZXJlNWNvCitlcmUzaW4KK2VyZWkyCitlcjVlbC4KK2VyM2UxbW8KK2VyNWUxbmEKK2VyNWVuY2UKKzRlcmVuZQorZXIzZW4xdAorZXJlNHEKK2VyNWUyc3MKK2VyM2VzMnQKK2VyZXQ0CitlcjFoNAorZXIxaQorZTFyMmkzYTQKKzVlcmljazEKK2UzcmllbgorZXIyaWU0Citlcmk0ZXIKK2VyM2luNGUKK2UxcjJpMW8KKzRlcml0CitlcjRpMXUKK2VyMmk0dgorZTRyaTF2YQorZXIzbTQKK2VyNG5pczQKKzRlcjNuMml0Cis1ZXJuaXoKK2VyM25vNAorMmVybworZXI1b2IKK2U1cjJvYworZXJvNHIKK2VyMW91MgorZTRyMXMyCitlcjNzZXQKK2VyMnNlCitlcnQzZXIKKzRlcjJ0bAorZXIzdHc0Cis0ZXJ1CitlcnU0dAorNWVyd2F1CitlcjF3CitlMXM0YTIKK2U0c2EyZ2UuCitlNHNhZ2VzCitlczJjCitlMnMxY2EKK2VzNWNhMm4KK2Uzc2NyCitlczVjdQorZTFzMmUKK2Uyc2VjCitlczVlMWNyCitlNHM1ZW5jCitlNHNlcnQuCitlNHNlcjR0MXMyCitlNHNlcjF2YQorNGVzMmgKK2Uzc2hhCitlc2g1ZTJuCitlMXNpCitlMnNpYworZTJzMmlkCitlczVpMWRlbgorZTRzNWlnMW40YQorZXMyaWcKK2UyczVpbQorZTJzNGk0bgorZXNpczR0ZQorZTFzaXMKK2U1c2k0dQorZTVza2luCitlc2syCitlc2sxaQorZXM0bWkKK2UyczFtCitlMnNvbAorZTFzbworZXMzb2x1CitlMnNvMm4KK2VzNW8xbjFhNAorZTFzcAorZTJzM3BlcgorZXM1cGkxcmEKK2VzcDRpcgorZXM0cHJlCitlc3ByMgorMmUyc3MKK2VzNHNpNGIKK2VzMXNpCitlc3RhMm40CitlczF0YQorZXMzdDJpZworZXN0MmkKK2VzNXRpbQorNGVzMnRvCitlM3N0bzJuCisyZXN0NHIKK2U1c3RybworZXN0cnVjNQorZTJzdTJyCitlMXN1CitlczV1cjFyNAorZXM0dzIKK2UydGE0YgorZTF0YQorZTN0ZW40ZAorZTN0ZW8KK2V0aG9kMworZXQxaWMKK2U1dGlkZQorZXQyaWQKK2UydDFpbjQKK2V0Mmk0bm8KK2U1dDRpcgorZTV0MmkxdDJpbworZXRpMXRpCitldDVpMXQyaXYKKzRlMnQxbjIKK2V0NW8xbjFhCitlMXRvCitldG8ybgorZTN0cmEKK2UzdHJlCitldDNyaWMKK2V0NXJpZgorZXQzcm9nCitldDVyb3MKK2V0M3UxYQorZTF0dQorZXQ1eW0KK2UxdHkKK2U0dDV6Cis0ZXUKK2U1dW4KK2UzdXAKK2V1M3JvCitlMnVzNAorZXV0ZTQKK2V1dGk1bAorZTR1MXQyaQorZXU1dHIKK2V2YTJwNQorZTF2YQorZTJ2YXMKK2V2NWFzdAorZTV2ZWEKK2V2M2VsMWwKK2V2ZTRsM28KK2U1dmVuZworZXZlbjRpCitldjFlcgorZTV2MmVyMWIKK2UxdmkKK2V2M2lkCitlMnZpNGwKK2U0djFpbgorZTN2Mmk0dgorZTV2b2MKK2U1dnUKK2Uxd2EKK2U0d2FnCitlNXdlZQorZTN3aAorZXdpbDUKK2V3aTIKK2V3M2luNGcKK2Uzd2l0CisxZXgzcAorNWV5MWMKKzVleWUuCitleXM0CisxZmEKK2ZhM2IybDIKK2Y0YWIzcgorZmE0Y2UKKzRmYWcKK2ZhNGk0bjQKK2ZhaTIKK2ZhbDJsNWUKK2ZhbDFsCis0ZjRhNG1hCitmYW01aXMKKzVmMmEycgorZmFyNXRoCitmYTN0YQorZmEzdGgyZQorZjRhdGgKKzRmYTF0bworZmF1NGx0NQorZmF1NGwyCis0ZjViCis0ZmQKKzRmZS4KK2ZlYXM0CitmZTRhdGgzCitmZWEydAorZjJlNGIKKzRmZTFjYQorNWZlMmMxdAorMmZlZAorZmUzbDJpCitmZTRtbworZmVuMmQKK2ZlbjFkNWUKK2ZlcjEKKzVmZXIxcjQKK2ZldjQKKzRmMWYKK2Y0ZmVzCitmNGYyaWU0CitmMWZpCitmNWYyaW4uCitmMmZpbgorZjJmNWlzCitmNGYybHk1CitmZjRsMgorZjJmeQorNGZoCisxZmkKK2YyaTNhCisyZjNpYy4KKzRmM2ljYWwKK2ZpMWNhCitmM2ljYTJuCis0ZmljYXRlCitmM2kxY2VuCitmaTNjZXIKK2YyaTFjNGkKKzVmaTNjMmkxYQorNWZpYzJpZTQKKzRmaTRjM3MyCitmaTNjdQorZmk1ZGVsCitmMmlkCitmaWdodDUKK2YyaWcKK2ZpbDVpCitmaWwybDVpbjQKK2ZpbDFsCitmaWxsMmkKKzRmaTFseQorMmZpbgorNWZpMW5hCitmNGluMmQ1CitmMmkybmUKK2YxaW4zZworZjJpNG40bjIKK2ZpczR0MmkKK2Y0bDIKK2Y1bDJlMnNzCitmbGVzMgorZmxpbjQKK2ZsbzNyZQorZjJseTUKKzRmbQorNGZuCisxZm8KKzVmbzJuCitmb240ZGUKK2Yyb25kCitmb240dAorZm8ycgorZm81cmF0CitmbzFyYQorZm9yNWF5Citmb3JlNXQKK2ZvcjRpCitmb3IxdDVhCitmb3M1Cis0ZjVwCitmcmE0dAorZjVyZWEKK2ZyZXM1YworZnJpMgorZnJpbDQKK2Zyb2w1CisyZjNzCisyZnQKK2Y0dG8KK2YydHkKKzNmdQorZnU1ZWwKKzRmdWcKK2Z1NG1pbgorZnUxbWkKK2Z1NW5lCitmdTNyaQorZnVzaTQKK2YydXMKK2Z1MnM0cworNGZ1MXRhCisxZnkKKzFnYQorZ2EyZjQKKzVnYWwuCiszZ2FsMWkKK2dhM2xvCisyZ2FtCitnYTVtZXQKK2c1YTJtbworZ2FuNWlzCitnYTJuCitnYTNuaXoKK2dhbmk1emExCis0Z2FubzQKK2dhcjVuNAorZzJhMnIKK2dhMnNzNAorZzRhdGgzCis0Z2ExdDJpdgorNGdhegorZzNiCitnZDQKKzJnZS4KKzJnZWQKK2dlZXo0CitnZWw0aW4KK2dlbDJpCitnZTVsaXMKK2dlNWwxaXoKKzRnZTFseQorMWdlbgorZ2U0bjJhdAorZ2UxbmEKK2c1ZTVuaXoKKzRnNGVubworNGdlbnkKKzFnZW8KK2dlM29tCitnNGVyeQorNWdlMXNpCitnZXRoNQorNGdlMXRvCitnZTR0eQorZ2U0dgorNGcxZzIKK2cyZ2UKK2czZ2VyCitnZ2x1NQorZ2dsMgorZzFnbzQKK2doM2luCitnaDVvdXQKK2dob3UyCitnaDR0bworNWdpLgorMWcyaTRhCitnaTJhNXIKK2cxaWMKKzVnaTNjMmkxYQorZzJpMWNpCitnNGkxY28KK2dpZW41CitnMmllNAorNWdpZXMuCitnaWw0CitnM2kxbWVuCiszZzRpbi4KK2c0aW41Z2UKKzVnNGkybjFzMgorNWcyaW8KKzNnNGlyCitnaXI0bAorZzNpczFsMgorZ2k0dQorNWcyaXYKKzNnaXoKK2dsMgorZ2xhNAorZ2wyYWQ1aQorZ2xhMmQKKzVnbGFzCisxZ2xlCitnbGk0YgorZzNsMmlnCiszZ2xvCitnbG8zcgorZzFtCitnNG15CitnMW40YQorZzRuYS4KK2duZTR0NHQyCitnMW5pCitnMm4xaW4KK2c0bjJpNG8KK2cxbm8KK2c0bm80bgorMWdvCiszZ28uCitnb2I1Cis1Z29lCiszZzRvNGcKK2dvM2lzCitnb2kyCitnbzJuMgorNGczbzNuMWEKK2dvbjVkbzUKK2cyb25kCitnbzNuaQorNWdvbzIKK2dvNXJpegorZ29yNW91MgorNWdvcy4KK2dvdjEKK2czcAorMWdyCis0Z3JhMWQyYQorZ3JhMmQKK2c0cjJhaTIKK2dyYTJuMgorNWdyYTRwaC4KK2c1cmEzcGg0ZXIKKzVncmFwaDFpYworZ3I0YXBoaQorNGczcmExcGh5Cis0Z3JheQorZ3JlNG4KKzRncmVzcy4KK2dyMmUyc3MKKzRncml0CitnNHJvCitncnVmNAorZ3MyCitnNXN0ZQorZ3RoMworZ3U0YQorM2d1YXIyZAorZ3UyYTJyCisyZ3VlCis1Z3VpNXQKK2cydWkyCiszZ3VuCiszZzJ1cworNGd1NHQKK2czdworMWd5CisyZzV5M24KK2d5NXJhCitoM2FiNGwyCitoYTJjaDQKK2hhZTRtCitoYWU0dAoraDVhZ3UKK2hhM2xhCitoYWxhM20KK2hhNG0KK2hhbjRjaQoraGEybgoraGFuNGN5Cis1aGFuZC4KK2g0YW5kCitoMmFuNGcKK2hhbmc1ZXIKK2hhbjFnNW8KK2g1YTVuaXoKK2hhNG40azIKK2hhbjR0ZQoraGFuMXQKK2hhMnAzbDIKK2hhMnA1dAoraGEzcmEybgoraDJhMnIKK2hhNXIyYXMKK2hhcjJkCitoYXJkM2UKK2hhcjRsZTQKK2hhcjFsCitoYXJwNWVuCitoYXIycAoraGFyNXRlcgoraGEyczVzCitoYXVuNAorNWhhegoraGF6M2ExCitoMWIKKzFoZWEyZDEKKzNoZTJhMnIKK2hlNGNhMm4KK2hlMWNhCitoNWVjYXQKK2g0ZWQKK2g0ZTVkbzUKK2hlM2w0aQoraGVsNGxpcworaGVsMWwKK2hlbGwyaQoraGVsNGx5CitoNWVsbworaGU0bTRwCitoZTJuCitoZTFuYTQKK2hlbjVhdAoraGUxbzVyCitoZXA1CitoNGVyMWEKK2hlcmEzcAoraGVyNGJhCitoMmVyMWIKK2hlcmU1YQoraDNlcm4KK2g1ZXIxb3UyCitoMmVybworaDNlcnkKK2gxZXMKK2hlMnM1cAoraGU0dAoraGUydDRlZAoraDRldTQKK2gxZgoraDFoCitoaTVhMm4KK2gyaTFhCitoaTRjbworaGlnaDUKK2gyaWcKK2g0aWwyCitoaW1lcjQKK2g0aTFuYQoraGlvbjRlCitoMmlvCitoaW8ybgoraDJpNHAKK2hpcjRsCitoNGlyCitoaTNybworaGlyNHAKK2hpcjRyNAoraGlzM2VsCitoNGlzZQoraDRpMnM0cworaGl0aDVlcgoraDJpdGgKK2hpdGgyZQoraDJpMnYKKzRoaworNGgxbDQKK2hsYTJuNAoraDJsbworaGxvM3JpCis0aDFtCitobWV0NAorMmgxbgoraDVvZGl6CitoNW8yZDFzMgoraG80ZworaG8xZ2U0Citob2w1YTJyCitobzFsYQorM2hvbDRlCitobzRtYQoraG8ybWUzCitobzFuNGEKK2hvMm4KK2hvNW55CiszaG9vZAoraG9vMgoraG9vMm40Citob3I1YXQKK2hvMXJhCitobzVyMmlzCitob3J0M2UKK2hvNXJ1Citob3M0ZQoraG81c2VuCitob3MxcAorMWhvMnVzCitob3UyCitob3VzZTMKK2hvdjVlbAorNGg1cAorNGhyNAoraHJlZTUKK2hybzVuaXoKK2hybzJuCitocm8zcG8KKzRoMXMyCitoNHMyaAoraDR0MmEycgoraDF0YQoraHQxZW4KK2h0NWVzCitoNHR5CitodTRnCitodTRtaW4KK2h1MW1pCitodW41a2UKK2h1NG5rMgoraHVuNHQKK2h1czN0NAoraDJ1cworaHU0dAoraDF3CitoNHdhcjR0CitodzJhMnIKK2h5M3BlCitoeTNwaAoraHkycworMmkxYQoraTJhbAoraWFtNAoraWFtNWUxdGUKK2kyYTJuCis0aWFuYworaWFuM2kKKzRpYW40dAoraWE1cGUKK2lhMnNzNAoraTRhMXQyaXYKK2lhNHRyaWMKK2lhMXRyCitpNGEydHUKK2liZTQKK2liM2VyMWEKK2liNWVydAoraWI1aTFhCitpYjNpbgoraWI1aXQuCitpYmkydAoraWI1aXRlCitpMWIybDIKK2liM2xpCitpNWJvCitpMWJyCitpMmI1cmkKK2k1YnU0bgorNGljYW0KK2kxY2EKKzVpY2FwCis0aWMyYTJyCitpNGNhci4KK2k0Y2FyYQoraWNhczUKK2k0Y2F5CitpY2N1NAoraWMzYworNGljZW8KKzRpMmNoCisyaTFjaQoraTVjMmlkCitpYzVpMW5hCitpMmNpbgoraTJjMmlwCitpYzNpMXBhCitpNGMxbHk0CitpMWM0bDQKK2kyYzVvYworaTFjbworNGkxY3IKKzVpY3JhCitpNGNyeQoraWM0dGUKK2kyYzF0CitpYzF0dTIKK2ljNHQzdTFhCitpYzN1MWxhCitpYzR1bQoraWM1dW8KK2kzY3VyCisyaWQKK2k0ZGFpMgoraTFkMmEKK2lkNWFuYworaWRhMm4KK2lkNWQ0CitpZGUzYTRsCitpZGU0czIKK2kyZGkKK2lkNWkyYTJuCitpMWQ0aTNhCitpZGk0YTJyCitpNWQyaWU0CitpMWQzaW8KK2lkaTVvdTIKK2lkMWl0CitpZDVpMXUKK2kzZGxlCitpNGRvbQoraTFkbworaWQzb3cKK2k0ZHIKK2kyZHUKK2lkNXVvCisyaWU0CitpZWQ0ZQorNWllNWdhCitpZTJsZDMKK2llMW41YTQKK2llbjRlCitpNWU0bjFuMgoraTNlbnQyaQoraWVuMXQKK2kxZXIuCitpM2VzMmMKK2kxZXN0CitpM2V0Cis0aWYuCitpZjVlcm8KK2lmZXIxCitpZmY1ZW4KK2k0ZjFmCitpZjRmcgorNGkyZjNpYy4KK2kxZmkKK2kzZjJpZTQKK2kzZjRsMgorNGkyZnQKKzJpZworaWdhNWIKK2kxZ2EKK2lnM2VyMWEKK2lnaHQzaQorNGlnaQoraTNnaWIKK2lnM2lsNAoraWczaW4KK2lnM2l0CitpNGc0bDIKK2kyZ28KK2lnM29yCitpZzVvdAoraTVncmUKK2kxZ3IKK2lnMnU1aTIKK2lnMXVyCitpM2gKKzRpNWk0CitpM2oKKzRpaworaTFsYQoraWwzYTRiCitpNGw0YWRlCitpbGEyZAoraTJsNWFtCitpbGE1cmEKK2lsMmEycgoraTNsZWcKK2lsMWVyCitpbGV2NAoraTJsNWYKK2lsMWkKK2lsM2kxYQoraWwyaWIKK2lsM2lvCitpbDRpc3QKKzJpbDFpdAoraWwyaXoKK2lsbDVhYgoraWwxbAorNGkybDFuMgoraWwzbzFxCitpbDR0eQoraTRsdAoraWw1dXIKK2lsM3YKK2k0bWFnCitpMW1hCitpbTNhZ2UKK2ltYTVyeQoraW0yYTJyCitpbWVudDJhNXIKK2kxbWVuCitpM21lbjF0CitpbWVuMXRhCis0aW1ldAoraW0xaQoraW01aTFkNGEKK2ltMmlkCitpbWk1bGUKK2k1bTJpbmkKKzRpbWl0CitpbTRuaQoraTRtMW4KK2kzbW8ybgoraTFtbworaTJtdQoraW0zdTFsYQorMmluLgoraTRuM2F1CitpMW5hCis0aW5hdgoraW5jZWw0CitpbjNjZXIKKzRpbmQKK2luNWRsaW5nCisyaW5lCitpM25lZQoraW40ZXI0YTJyCitpbjFlcgoraW5lcjFhCitpNW4yZTJzcworaTFuZXMKKzRpbjFnYQorNGluZ2UKK2luNWdlbgorNGluZ2kKK2luNWdsaW5nCitpbmdsMgorNGluMWdvCis0aW4xZ3UKKzJpbmkKK2k1bmkuCitpNG40aTFhCitpbjNpNG8KK2luMWlzCitpNW5pNHRlLgoraW4yaXQKK2luMml0ZQorNWkzbjJpMXQyaW8KK2luaTF0aQoraW4zaTF0eQorNGk0bmsyCis0aTRuMWwKKzJpNG4xbjIKKzJpMW5vCitpNG5vNGMKK2lubzRzCitpNG5vdAorMmkybjFzMgoraW4zc2UKK2luc3UxcjVhCitpbjFzdQoraW5zdTJyCisyaW50LgoraW4xdAorMmluNHRoCitpbjF1CitpNW4ydXMKKzRpbnkKKzJpbworNGlvLgoraW8xZ2U0CitpbzJncgoraTFvbAoraW80bQoraW9uM2F0CitpbzJuCitpbzFuMWEKK2lvbjRlcnkKK2lvbjFlcgoraW9uM2kKK2kybzVwaAoraW9yM2kKK2k0b3MKK2k0bzV0aAoraTVvdGkKK2lvNHRvCitpNG91cgoraW91MgorMmlwCitpcGU0CitpcGhyMmFzNAoraXA0aHI0CitpcDNpCitpcDRpYworaXA0cmU0CitpcHIyCitpcDN1bAoraTNxdWEKK2lxdTIKK2lxNXVlMWYKK2lxM3UyaWQKK2lxMnVpMgoraXEzdWkzdAorNGlyCitpMXJhCitpMnJhNGIKK2k0cmFjCitpcmQ1ZQoraXJlNGRlCitpMnIyZWQKK2k0cmUxZgoraTRyZWw0CitpNHJlcworaXI1Z2kKK2lyZzIKK2lyMWkKK2lyaTVkZQoraXIyaWQKK2lyNGlzCitpcmkzdHUKKzVpNXIyaXoKK2lyNG1pbgoraXIxbQoraXJvNGcKKzVpcm9uLgoraXJvMm4KK2lyNXVsCisyaXMuCitpczVhZworaXNhMgoraXMzYTJyCitpc2FzNQorMmlzMWMKK2lzM2NoMgorNGlzZQoraXMzZXIKKzNpNHMzZgoraXM1aGEybgoraXMyaAoraXMzaG8ybjMKK2lzaG80Citpc2g1b3AKK2lzM2kxYgoraXMyaTRkCitpNXNpcworaXM1aTF0Mml2Citpc2kxdGkKKzRpczRrMgoraXNsYTJuNAoraXMxbDIKKzRpczRtMXMyCitpMnMxbQoraTJzbworaXNvNW1lcgoraTNzb20KK2lzbzJtZQoraXMxcAoraXMycGkKK2lzNHB5Cis0aTJzMXMKK2lzNHNhbAoraXMxc2EyCitpc3NlbjQKK2lzNHMxZTRzCitpczR0YS4KK2lzMXRhCitpczF0ZQoraXMxdDJpCitpc3Q0bHkKK2lzMnRsCis0aXN0cmFsCitpc3Q0cgoraXMxdHJhCitpMnN1CitpczV1cworNGkzdGEuCitpMXRhCitpdGE0YmkKK2kydGFiCitpNHRhZworNGl0YTVtCitpM3RhMm4KK2kzdGF0CisyaXRlCitpdDNlcjFhCitpNXRlcjFpCitpdDRlcworMml0aAoraTF0aQorNGkxdDJpMWEKKzRpMnRpYworaXQzaTFjYQorNWk1dGljazEKK2kydDNpZworaXQ1aWwxbAoraTJ0aW0KKzJpMXQyaW8KKzRpdGlzCitpNHRpMnM0bQoraTJ0NW81bQoraTF0bworNGl0bzJuCitpNHRyYW0KK2kxdHJhCitpdDVyeQorNGk0dDN0MgoraXQzdTFhdAoraTF0dQoraXR1MWEKK2k1dHVkMgoraXQzdWwKKzRpdHouCitpNHR6CitpMXUKKzJpdgoraXYzZWwxbAoraXYzZW4uCitpNHYzZXIuCitpNHZlcnMuCitpdmU0cjFzMgoraXY1aWwuCitpMnZpbAoraXY1aW8KK2l2MWl0CitpNXZvcmUKK2l2M28zcm8KK2k0djNvdAorNGk1dworaXg0bworNGl5Cis0aXoyYTJyMgoraXphMQoraTJ6MWk0Cis1aXpvbjF0CitpMXpvCitpem8ybgorNWphCitqYWM0cQoramE0cAorMWplCitqZTRyNXMyCis0amVzNHQyaWU0CitqZXN0MmkKKzRqZXMydHkKK2pldzMKK2pvNHAKKzVqdWRnCisza2EuCitrM2FiCitrNWFnCitrYWlzNAora2FpMgora2FsNAorazFiCitrMmVkCisxa2VlCitrZTRnCitrZTVsMmkKK2szZW40ZAorazFlcgora2VzNAorazNlMnN0Lgora2U0dHkKK2szZgora2g0CitrMWkKKzVraS4KKzVrMmljCitrNGlsMWwKK2tpbG81CitrNGltCitrNGluLgora2luNGRlCitrNGluZAorazVpNW4yZTJzcworazJpbmUKK2tpMW5lcwora2luNGcKK2syaTRwCitraXM0CitrNWlzMmgKK2trNAorazFsCis0azNsZXkKKzRrMWx5CitrMW0KK2s1bmVzCisxazJubwora281cgora29zMmg0CitrM291Mgora3JvNW4KKzRrMXMyCitrNHNjCitrczRsMgorazRzNHkKK2s1dAorazF3CitsYWIzaWMKK2w0YWJvCitsNGEyY2k0CitsNGFkZQorbGEyZAorbGEzZDJ5CitsYWc0bgorbGEybTNvCiszbDRhbmQKK2xhMm4KK2xhbjRkbAorbGFuNWV0CitsYW40dGUKK2xhbjF0CitsYXI0ZzIKK2wyYTJyCitsYXIzaQorbGFzNGUKK2xhNXRhMm4KK2xhMnRhCis0bGF0ZWwyaTQKKzRsYTF0Mml2Cis0bGF2CitsYTR2NGEKKzJsMWIKK2xiaW40Cis0bDFjMgorbGNlNAorbDNjaQorMmxkCitsMmRlCitsZDRlcmUKK2xkNGVyMWkKK2xkaTQKK2xkNWlzMQorbDNkcgorbDRkcmkKK2xlMmEKK2xlNGJpCitsMmUxYgorbGUyZnQ1CitsZTFmCis1bGVnLgorNWxlNGcxZzIKK2xlNG1hdAorbGUxbWEKK2xlbTVhdDFpYworNGxlbi4KKzNsZW5jCis1bGUybmUuCisxbGVuMXQKK2xlM3BoCitsZTRwcjIKK2xlMnJhNWIKK2xlcjFhCitsZXI0ZQorM2xlcmcyCiszbDRlcjFpCitsNGVybworbGVzMgorbGU1czFjbworbGVzMmMKKzVsZXNxCiszbDJlMnNzCis1bGVzcy4KK2wzZTF2YQorbGV2NGVyLgorbGV2MWVyCitsZXY0ZXIxYQorbGV2NGU0cjFzMgorM2xleQorNGxleWUKKzJsZgorbDVmcgorNGwxZzQKK2w1Z2EKK2xnMmEycjMKK2w0Z2VzCitsMWdvMworMmwzaAorbGk0YWcKK2wyaTFhCitsaTJhbTQKK2xpYXI1aXoKK2xpMmEycgorbGlhcjFpCitsaTRhcworbGk0YTF0bworbGk1YmkKKzVsaWMyaW8KK2wyaTFjaQorbGk0Y29yCitsaTFjbworNGxpNGMzczIKKzRsaWN0LgorbGkyYzF0CitsNGljdQorbDNpMWN5CitsM2kxZDJhCitsMmlkCitsaWQ1ZXIKKzNsaTJkaQorbGlmM2VyMQorbDRpNGYxZgorbGk0ZjRsMgorNWxpZ2F0ZQorbDJpZworbGkxZ2EKKzNsaWdoCitsaTRncmEKK2xpMWdyCiszbDRpaworNGw0aTRsCitsaW00YjJsMgorbGk0bTFiCitsaW0zaQorbGk0bW8KK2w0aTRtNHAKK2w0aTFuYQorMWw0aW5lCitsaW4zZWEKK2wyaW4zaQorbGluazVlcgorbDRpNG5rMgorbGk1b2cKK2wyaW8KKzRsNGlxCitsaXM0cAorbDFpdAorbDJpdC4KKzVsaXQzaTFjYQorbGkxdGkKK2w0aTJ0aWMKK2w1aTV0aTRjM3MyCitsaXYzZXIKK2wyaXYKK2wxaXoKKzRsagorbGthMworbDNrYWw0Citsa2E0dAorbDFsCitsNGxhdworbDJsZQorbDVsZTJhCitsM2xlYworbDNsZWcKK2wzbGVsCitsM2xlNG4KK2wzbGU0dAorbGwyaQorbDJsaW40CitsNWw0aTFuYQorbGw0bworbGxvcTJ1aTUKK2xsbzFxCitsbG9xdTIKK2wybDVvdXQKK2xsb3UyCitsNWxvdworMmxtCitsNW1ldAorbG0zaW5nCitsNG1vMmQxCitsMW1vCitsbW8ybjQKKzJsMW4yCiszbG8uCitsb2I1YWwKK2xvNGNpCis0bG9mCiszbG9nMWljCitsNW8xZ28KKzNsb2d1Citsb20zZXIKK2xvMm1lCis1bG9uZworbG8ybgorbG9uNGkKK2wzbzNuaXoKK2xvb2Q1Citsb28yCis1bG80cGUuCitsb3AzaQorbDNvNHAxbQorbG8xcmE0CitsbzRyYTF0bworbG81cjJpZTQKK2xvcjVvdTIKKzVsb3MuCitsb3M1ZXQKKzVsb3M1bzNwaGl6CitsbzJzbworbG9zNG9wCitsb3Myb3BoCis1bG9zNW8xcGh5Citsb3M0dAorbG80dGEKK2xvdW41ZAorbG91MgorMmxvdXQKKzRsb3YKKzJscAorbHBhNWIKK2wxcGEKK2wzcGhhCitsNXBoaQorbHA1aW5nCitscGkybgorbDNwaXQKK2w0cDJsMgorbDVwcjIKKzRsMXIKKzJsMXMyCitsNHNjCitsMnNlCitsNHMyaWU0Cis0bHQKK2x0NWFnCitsMXRhCitsdGFuZTUKK2x0YTJuCitsMXRlCitsdGVuNAorbHRlcjFhNAorbHRoM2kKK2w1dGllcy4KK2x0MmllNAorbHRpczQKK2wxdHIKK2wxdHUyCitsdHUxcjNhCitsdTVhCitsdTNicgorbHUyY2g0CitsdTNjaQorbHUzZW4KK2x1ZjQKK2x1NWlkCitsMnVpMgorbHU0bWEKKzVsdTFtaQorbDV1bW4uCitsdTRtMW4KKzVsdW0zbjRpMWEKK2x1M28KK2x1bzNyCis0bHVwCitsdTJzczQKK2wydXMKK2x1czN0ZQorMWx1dAorbDV2ZW4KK2w1dmV0NAorMmwxdworMWx5Cis0bHlhCis0bHkxYgorbHk1bWU0CitseTNubworMmx5czQKK2w1eTNzMmUKKzFtYQorMm1hYgorbWEyY2EKK21hNWNoMmluZQorbWEyY2gKK21hNGNoMWluCittYTRjNGw0CittYWc1aW4KK21hZzFpCis1bWFnMW4KKzJtYWgKK21hMmlkNQorbWFpMgorNG1hMmxkCittYTNsMmlnCittYWwxaQorbWE1bGluCittYWw0bDJpCittYWwxbAorbWFsNHR5CittYTRsdAorNW1hM240aTFhCittYTJuCittYW41aXMKK21hbjNpegorNG1hcAorbWE1cmkybmUuCittMmEycgorbWFyMWkKK21hcjJpbjRlCittYTVyMml6CittYXI0bHkKK21hcjFsCittYXIzdgorbWE1c2NlCittYXM0ZQorbWFzMXQKKzVtYXRlCittNGF0aDMKK21hM3RpcworNG1hdGkzemExCittYTF0aXoKKzRtMWIKK20xYmE0dDUKK201YmlsCittNGIzaW5nCittYjJpNHYKKzRtNWMKKzRtZS4KKzJtZWQKKzRtZWQuCis1bWUzZDRpM2EKK200ZWRpCittZTNkMmllNAorbTVlNWQyeQorbWUyZworbWVsNW8ybgorbWU0bDR0CittZTJtCittZTFtMW8zCisxbWVuCittZTFuNGEKK21lbjVhYworbWVuNGRlCis0bWVuZQorbWVuNGkKK21lMm4xczQKK21lbjFzdTUKKzNtZW4xdAorbWVuNHRlCittZTVvMm4KK201ZXIxc2EyCittZTRyMXMyCisybWVzCiszbWVzdDJpCittZTR0YQorbWV0M2EybAorbWUxdGUKK21lNXRoaQorbTRldHIKKzVtZXQzcmljCittZTV0cjJpZTQKK21lM3RyeQorbWU0dgorNG0xZgorMm1oCis1bWkuCittMmkzYQorbWkxZDRhCittMmlkCittaWQ0ZworbTJpZzQKKzNtaWwzaTFhCittaWwxaQorbTVpNWwyaWU0CittNGlsMWwKK21pMW40YQorM200aW5kCittNWkzbmVlCittMmluZQorbTRpbmdsMgorbWluNWdsaQorbTVpbmcxbHkKK21pbjR0CittNGluMXUKK21pb3Q0CittMmlvCittMmlzCittaTRzNGVyLgorbTRpc2UKK21pczNlcgorbWlzNWwyCittaXM0dDJpCittNWk0c3RyeQorbWlzdDRyCis0bTJpdGgKK20yaXoKKzRtaworNG0xbAorbTFtCittbWE1cnkKK20xbWEKK21tMmEycgorNG0xbgorbTFuNGEKK200bjFpbgorbW40bworMW1vCis0bW9jcgorNW1vYzVyYTF0aXoKK21vMmQxCittbzRnbworbW9pczIKK21vaTIKK21vNGk1c2UKKzRtMm9rCittbzVsZXN0Cittb2xlczIKK21vM21lCittb241ZXQKK21vMm4KK21vbjVnZQorbW8zbjRpM2EKK21vbjRpMnMxbQorbW9uMWlzCittb240aXN0CittbzNuaXoKK21vbm9sNAorbW8zbnkuCittbzJyCis0bW81cmEuCittbzFyYQorbW9zMgorbW81c2V5CittbzNzcAorbTRvdGgzCittNW91ZgorbW91MgorM21vMnVzCittbzJ2Cis0bTFwCittcGFyYTUKK20xcGEKK21wMmEycgorbXBhNXJhYgorbXA0YTRyNWkKK20zcGUydAorbXBoYXM0CittMnBpCittcDJpNGEKK21wNWllcworbXAyaWU0CittNHAxaTJuCittNXA0aXIKK21wNWlzCittcG8zcmkKK20xcDRvcgorbXBvczVpdGUKK20xcG9zCittNHBvMnVzCittcG91MgorbXBvdjUKK21wNHRyCittMnAxdAorbTJweQorNG0zcgorNG0xczIKK200czJoCittNXNpCis0bXQKKzFtdQorbXVsMmE1cjQKK211MWxhCis1bXU0bHQKK211bDF0aTMKKzNtdW0KK211bjIKKzRtdXAKK211NHUKKzRtdworMW5hCisybjFhMmIKK240YWJ1Cis0bmFjLgorbmE0Y2EKK241YTJjMXQKK25hZzVlci4KK25hazQKK25hNGwxaQorbmE1bDJpMWEKKzRuYTRsdAorbmE1bWl0CituMmEybgorbmFuMWNpNAorbmFuNGl0CituYTRuazQKK25hcjNjCituMmEycgorNG5hcmUKK25hcjNpCituYXI0bAorbjVhcjFtCituNGFzCituYXM0YworbmFzNXQyaQorbjJhdAorbmEzdGEybAorbmEydGEKK25hdDVvNW0yaXoKK25hMnRvbQorbmExdG8KK24yYXUKK25hdTNzZQorbmEydXMKKzNuYXV0CituYXY0ZQorNG4xYjQKK25jMmEycjUKK24xY2EKK240Y2VzLgorbjNjaGEKK24yY2gKK241Y2hlbworbmNoZTIKK241Y2g0aWwyCituM2NoaXMKK24yYzFpbgorbjFjaQorbjJjNGl0CituY291MXI1YQorbjFjbworbmNvdTIKK24xY3IKK24xY3UKK240ZGFpMgorbjFkMmEKK241ZGEybgorbjFkZQorbmQ1ZTJzdC4KK25kZXMyCituZGk0YgorbjVkMmlmCituMWRpdAorbjNkaXoKK241ZHUyYworbjFkdQorbmR1NHIKK25kMndlCituZDF3CisybmUuCituM2UyYTJyCituMmUyYgorbmViM3UKK25lMmMKKzVuZWNrMQorMm5lZAorbmU0Z2F0CituZTFnYQorbmU0ZzVhMXQyaXYKKzVuZWdlCituZTRsYQorbmVsNWl6CituZWwyaQorbmU1bWkKK25lNG1vCisxbmVuCis0bmVuZQorM25lbworbmU0cG8KK25lMnEKK24xZXIKK25lMnJhNWIKK25lcjFhCituNGVyM2EycgorbjJlcmUKK240ZXI1aQorbmVyNHI0CisxbmVzCisybmVzLgorNG5lMXNwCisybmVzdAorNG5lczR3MgorM25ldDFpYworbmU0dgorbjVldmUKK25lNHcKK24zZgorbjRnYWIKK24xZ2EKK24zZ2VsCituZ2U0bjRlCituMWdlbgorbjVnZXJlCituM2dlcjFpCituZzVoYQorbjNnaWIKK25nMWluCituNWdpdAorbjRnbGE0CituZ2wyCituZ292NAorbjFnbworbmc1czJoCituZ3MyCituMWd1CituNGd1bQorbjJneQorNG4xaDQKK25oYTQKK25oYWIzCituaGU0CiszbjRpMWEKK25pM2Eybgorbmk0YXAKK25pM2JhCituaTRiMmwyCituMmk0ZAorbmk1ZGkKK25pNGVyCituMmllNAorbmkyZmkKK25pNWZpY2F0CituaWZpMWNhCituNWkxZ3IKK24yaWcKK240aWs0CituMWltCituaTNtMml6CituaW0xaQorbjFpbgorNW5pMm5lLgorbjJpbmUKK25pbjRnCituMmk0bworNW4yaXMuCituaXM0dGEKK24yaXQKK240aXRoCiszbjJpMXQyaW8KK25pMXRpCituM2l0b3IKK25pMXRvCituaTN0cgorbjFqCis0bmsyCituNWsyZXJvCituazFlcgorbjNrZXQKK25rM2luCituazFpCituMWsxbAorNG4xbAorbjVtCitubWU0CitubWV0NAorNG4xbjIKK25uZTQKK25uaTNhbAorbjNuNGkxYQorbm4yaTR2Citub2I0bDIKK25vM2JsZQorbjVvMWM0bDQKKzRuM28yZAorM25vZQorNG5vZworbm8xZ2U0Citub2lzNWkKK25vaTIKK25vNWw0aQorNW5vbDFvMWdpcworM25vbWljCituNW81bTJpegorbm80bW8KK25vM215CitubzRuCitub240YWcKK25vMW4xYQorbm9uNWkKK241b25pegorNG5vcAorNW5vcDVvNWwyaQorbm8ycjVhYgorbm8xcmEKK25vNHJhcnkKK25vcjJhMnIKKzRub3MyYworbm9zNGUKK25vczV0CitubzV0YQorMW5vdTIKKzNub3VuCitub3YzZWwzCitub3dsMworbjFwNAorbnBpNAorbnByZTRjCitucHIyCituMXEKK24xcgorbnJ1NAorMm4xczIKK24yczVhYgorbnNhMgorbnNhdGk0CituczRjCituMnNlCituNHMzZTRzCituczJpZDEKK25zMmlnNAorbjJzMWwyCituMnMzbQorbjRzb2MKK24xc28KK25zNHBlCituNXNwaQorbnN0YTViMmwyCituczF0YQorbnMydGFiCituMXQKK24ydGE0YgorbjF0YQorbnRlNHIzczIKK250MmkKK241dGkyYgorbnRpNGVyCitudDJpZTQKK250aTJmMgorbjN0MmluZQorbjJ0MWluCituNHQzaW5nCitudDJpNHAKK250cm9sNWwyaQorbnRyb2wxbAorbjR0NHMyCitudHUzbWUKK24xdHUKK24zdHVtCitudTFhCitudTRkCitudTVlbgorbnVmNGZlCitudTRmMWYKK24zdWk0bgorbjJ1aTIKKzNudTNpdAorbjR1bQorbnUxbWUKK241dTFtaQorM251NG4KK24zdW8KK251M3RyCituMXYyCituMXc0CitueW00CitueXA0Cis0bnoKK24zemExCis0b2EKK29hMmQzCitvNWE1bGVzMgorbzJhbGUKK29hcmQzCitvMmEycgorb2FzNGUKK29hc3Q1ZQorb2F0NWkKK29iM2EzYgorbzViMmEycgorbzFiZTRsCitvMWJpCitvMmJpbgorb2I1aW5nCitvM2JyCitvYjN1bAorbzFjZQorbzJjaDQKK28zY2hlNHQKK29jaGUyCitvY2lmMworbzFjaQorbzRjaWwKK280Y2xhbQorbzFjNGw0CitvNGNvZAorbzFjbworb2MzcmFjCitvYzVyYTF0aXoKK29jcmUzCis1b2NyaXQKK29jcmkyCitvY3RvMnI1YQorbzJjMXQKK29jMXRvCitvYzN1MWxhCitvNWN1cmUKK29kNWQxZWQKK29kMWQ0CitvZDNpYworbzFkMmkzbworbzJkbzQKK29kNG9yMworbzRkNXVjdC4KK28xZHUKK29kdTJjCitvZHUyYzF0CitvNGQ1dWM0dDFzMgorbzRlbAorbzVlbmcKK28zZXIKK29lNHRhCitvM2V2CitvMmZpCitvZjVpdGUKK29mNGk0dDR0MgorbzJnNWE1cgorbzFnYQorbzRnNWExdDJpdgorbzRnYTF0bworbzFnZQorbzVnZW5lCitvMWdlbgorbzVnZW8KK280Z2VyCitvM2cyaWU0CisxbzFnaXMKK29nM2l0CitvNGdsMgorbzVnMmx5Ciszb2duaXoKK29nMW5pCitvNGc0cm8KK28xZ3IKK29nMnU1aTIKKzFvMWd5CisybzJnNXkzbgorbzFoMgorb2hhYjUKK29pMgorb2ljM2VzCitvaTNkZXIKK28yaWQKK29pNGYxZjQKK28yaWc0CitvaTVsZXQKK28zaW5nCitvaW50NWVyCitvaW4xdAorbzVpMnMxbQorb2k1c28ybgorb2kyc28KK29pc3Q1ZW4KK29pczF0ZQorb2kzdGVyCitvMml0ZQorbzVqCisyb2sKK28za2VuCitvazVpZTQKK29rMWkKK28xbGEKK280bGEybgorb2xhMnNzNAorbzJsMmQKK29sMmQxZQorb2wzZXIKK28zbGVzMmMKK29sZXMyCitvM2xldAorb2w0ZmkKK28ybGYKK29sMmkKK28zbDJpMWEKK28zbGljZQorb2w1aWQuCitvbDJpZAorbzNsaTRmCitvNWw0aTRsCitvbDNpbmcKK281bDJpbworbzVsMmlzLgorb2wzaXMyaAorbzVsMml0ZQorb2wxaXQKK281bDJpMXQyaW8KK29saTF0aQorbzVsMml2CitvbGwyaTRlNAorb2wxbAorb2xsMmkKK29sNW8zZ2l6CitvbG80cgorb2w1cDJsMgorbzJscAorbzRsMnQKK29sM3ViCitvbDN1bWUKK29sM3VuCitvNWwydXMKK29sMnYKK28ybHkKK28ybTVhaAorbzFtYQorb21hNWwKK29tNWExdGl6CitvbTJiZQorbzRtMWIKK29tNGIybDIKK28ybWUKK29tM2UxbjRhCitvMW1lbgorb201ZXIyc2UKK29tZTRyMXMyCitvNG1ldAorb201ZTN0cnkKK29tNGV0cgorbzNtMmkzYQorb20zaWMuCitvbTNpMWNhCitvNW0yaWQKK29tMWluCitvNW0yaW5pCis1b21tZW5kCitvbTFtCitvbTFtZW4KK29tbzRnZQorbzFtbworbzRtbzJuCitvbTNwaQorbzRtMXAKK29tcHJvNQorb21wcjIKK28ybgorbzFuMWEKK29uNGFjCitvM24yYTJuCitvbjFjCiszb25jaWwKK29uMWNpCisyb25kCitvbjVkbworbzNuZW4KK28ybjVlc3QKK28xbmVzCitvbjRndQorb24xaWMKK28zbjJpNG8KK29uMWlzCitvNW5pMXUKK29uM2tleQorbzRuazIKK29uNG9kaQorbzRuM28yZAorb24zbzNteQorbzJuM3MyCitvbjVzcGk0CitvbnNwaTFyNWEKK29uc3A0aXIKK29uMXN1NAorb250ZW40CitvbjF0CitvbjN0NGkKK29udGkyZjUKK29uNXVtCitvbjF2YTUKK29uMXYyCitvbzIKK29vZDVlCitvb2Q1aQorbzJvNGsKK29vcDNpCitvM29yZAorb29zdDUKK28ycGEKK28ycDJlNWQKK29wMWVyCiszb3BlcjFhCis0b3A0ZXJhZworMm9waAorbzVwaGEybgorbzVwaDRlcgorb3AzaW5nCitvcGkybgorbzNwaXQKK281cG8ybgorbzRwb3NpCitvMXBvcworbzFwcjIKK29wMXUKK29weTUKK28xcQorbzFyYQorbzVyYS4KK280cjNhZworb3I1YWwxaXoKK29yYWwxaQorb3I1YW40Z2UKK29yYTJuCitvcjJhbmcKK29yZTVhCitvNXJlMWE0bAorb3IzZWkyCitvcjRlNXMyaAorb3I1ZTJzdC4KK29yZXMydAorb3JldzQKK29yNGd1CitvcmcyCis0bzVyMmkzYQorb3IzaTFjYQorbzVyaWwKK29yMWluCitvMXIyaTFvCitvcjNpMXR5CitvM3JpMXUKK29yMm1pCitvcjFtCitvcm4yZQorbzVyb2YKK29yM291Zworb3JvdTIKK29yNXBlCitvcjFwCiszb3JyaDQKK29yMXI0CitvcjRzZQorbzRyczIKK29yczVlbgorb3JzdDQKK29yM3RoaQorb3IzdGh5CitvcjR0eQorbzVydW0KK28xcnkKK29zM2FsCitvc2EyCitvczJjCitvczRjZQorbzNzY29wCitvczFjbworNG9zY29waQorbzVzY3IKK29zNGk0ZTQKK29zNWkxdDJpdgorb3NpMXRpCitvczNpMXRvCitvczNpMXR5CitvNXNpNHUKK29zNGwyCitvMnNvCitvMnM0cGEKK29zNHBvCitvczJ0YQorbzVzdGF0aQorb3M1dGlsCitvc3QyaQorb3M1dGl0CitvNHRhMm4KK28xdGEKK290ZWxlNGcKK290M2VyLgorb3Q1ZTRyMXMyCitvNHRlcworNG90aAorb3RoNWUxc2kKK290aDJlCitvdGgxZXMKK290aDNpNAorb3QzaWMuCitvdDVpMWNhCitvM3RpY2UKK28zdGlmMgorbzN0aXMKK290bzVzMgorbzF0bworb3UyCitvdTNiMmwyCitvdWNoNWkKK291MmNoCitvdTVldAorb3U0bAorb3VuYzVlcgorb3VuMmQKK291NXYyCitvdjRlbgorb3ZlcjRuZQorb3ZlNHIzczIKK292NGVydAorbzN2aXMKK280dmkxdGk0CitvNXY0b2wKK293M2Rlcgorb3czZWwKK293NWVzdDMKK293MWkyCitvd241aQorbzR3bzIKK295MWEKKzFwYQorcGE0Y2EKK3BhNGNlCitwYTJjNHQKK3A0YTJkCis1cGFnYTRuCitwYTFnYQorcDNhZ2F0CitwNGFpMgorcGE0aTRuNAorcDRhbAorcGExbjRhCitwYTJuCitwYW4zZWwKK3BhbjR0eQorcGFuMXQKK3BhM255CitwYTFwCitwYTRwdQorcGFyYTViMmwyCitwMmEycgorcGEycmFiCitwYXI1YWdlCitwYXI1ZDJpCiszcGFyZQorcGFyNWVsCitwNGE0cjFpCitwYXI0aXMKK3BhMnRlCitwYTV0ZXIKKzVwYXRoaWMKK3A0YXRoCitwYTV0aHkKK3BhNHRyaWMKK3BhMXRyCitwYXY0CiszcGF5Cis0cDFiCitwZDQKKzRwZS4KKzNwZTRhCitwZWFyNGwKK3BlMmEycgorcGUyYworMnAyZWQKKzNwZWRlCiszcDRlZGkKK3BlM2Q0aTNhNAorcGVkNGljCitwNGVlCitwZWU0ZAorcGVrNAorcGU0bGEKK3BlbDJpNGU0CitwZWwyaQorcGU0bjJhMm4KK3BlMW5hCitwNGVuYworcGVuNHRoCitwZW4xdAorcGU1bzJuCitwNGVyYS4KK3BlcjFhCitwZXJhNWIybDIKK3BlMnJhNGIKK3A0ZXJhZworcDRlcjFpCitwZXJpNXN0CitwZXIyaXMKK3BlcjRtYWwKK3BlcjNtNAorcGVyMW1hCitwZXIybWU1CitwNGVybgorcDJlcjNvCitwZXIzdGkKK3A0ZTVydQorcGVyMXYKK3BlMnQKK3BlNXRlbgorcGU1dGl6Cis0cGYKKzRwZworNHBoLgorcGhhcjVpCitwaDJhMnIKK3BoNGUzbm8KK3BoZTJuCitwaDRlcgorcGg0ZXMuCitwaDFlcworcGgxaWMKKzVwaDJpZTQKK3BoNWluZworNXBoaXMxdDJpCiszcGhpegorcDRoMmw0CiszcGhvYgorM3Bob25lCitwaG8ybgorNXBob25pCitwaG80cgorNHA0aDFzMgorcGgzdAorNXBodQorMXBoeQorcDJpM2EKK3BpMmEybjQKK3BpNGMyaWU0CitwMmkxY2kKK3BpNGN5CitwNGlkCitwNWkxZDJhCitwaTNkZQorNXBpMmRpCiszcGllYworcDJpZTQKK3BpM2VuCitwaTRncmFwCitwMmlnCitwaTFncgorcGkzbG8KK3BpMm4KK3A0aW4uCitwNGluZDQKK3A0aTFubworM3AyaTFvCitwaW8ybjQKK3AzaXRoCitwaTV0aGEKK3BpMnR1CisycDNrMgorMXAybDIKKzNwbGEybgorcGxhczV0CitwbDJpM2EKK3BsaTVlcgorcGwyaWU0Cis0cGwyaWcKK3BsaTRuCitwbG9pNAorcGx1NG0KK3BsdTRtNGIKKzRwMW0KKzJwM24KK3BvNGMKKzVwb2QuCitwbzVlbQorcG8zZXQ1Cis1cG80ZworcG9pbjIKK3BvaTIKKzVwb2luMXQKK3BvbHk1dAorcG8ybHkKK3BvNG5pCitwbzJuCitwbzRwCisxcDRvcgorcG80cnkKKzFwb3MKK3BvMnMxcworcDRvdAorcG80dGEKKzVwb3VuCitwb3UyCis0cDFwCitwcGE1cmEKK3AxcGEKK3BwMmEycgorcDJwZQorcDRwMmVkCitwNXBlbAorcDNwZW4KK3AzcGVyCitwM3BlMnQKK3BwbzVzMml0ZQorcDFwb3MKK3ByMgorcHJheTRlNAorNXByZTFjMmkKK3ByZTVjbworcHJlM2UybQorcHJlNGY1YWMKK3ByZTFmCitwcmUxZmEKK3ByZTRsYQorcHIxZTNyNAorcDNyZTFzMmUKKzNwcjJlMnNzCitwcmU1dGVuCitwcmUzdjIKKzVwcjJpNGU0CitwcmluNHQzCitwcjJpNHMKK3ByaTJzM28KK3Azcm8xY2EKK3ByMm9jCitwcm9mNWl0Citwcm8yZmkKK3BybzNsCitwcm9zM2UKK3BybzF0CisycDFzMgorcDJzZQorcHM0aAorcDRzaTFiCisycDF0CitwMnQ1YTRiCitwMXRhCitwMnRlCitwMnRoCitwMXRpM20KK3B0dTRyCitwMXR1CitwNHR3NAorcHViMworcHVlNAorcHVmNAorcHU0bDNjMgorcHU0bQorcHUybgorcHVyNHI0Cis1cDJ1cworcHUydAorNXB1dGUKK3B1dDNlcgorcHUzdHIKK3B1dDR0MWVkCitwdTR0M3QyCitwdXQ0dDFpbgorcDN3CitxdTIKK3F1YTV2NAorMnF1ZS4KKzNxdWVyCiszcXVldAorMnJhYgorcmEzYmkKK3JhY2g0ZTIKK3JhMmNoCityNWExYzRsNAorcmFmNWZpCityYTJmCityYTRmMWY0CityYTJmNHQKK3IyYWkyCityYTRsbworcmFtM2V0CityMmFtaQorcmEzbmU1bworcmEybgorcmFuNGdlCityMmFuZworcjRhbmkKK3JhNW5vNAorcmFwM2VyCiszcmExcGh5CityYXI1YworcjJhMnIKK3JhcmU0CityYXI1ZTFmCis0cmFyaWwKK3JhcjFpCityMmFzCityYXRpbzJuNAorcmExdDJpbworcmF1NHQKK3JhNXZhaTIKK3JhMnZhCityYXYzZWwKK3JhNXoyaWU0CityYTJ6MWkKK3IxYgorcjRiYWIKK3I0YmFnCityYmkyCityMmIzaTRmCityMmJpbgorcjViMmluZQorcmI1aW5nLgorcmI0bworcjFjCityMmNlCityMWNlbjQKK3IzY2hhCityMmNoCityY2g0ZXIKK3JjaGUyCityNGNpNGIKK3IxY2kKK3IyYzRpdAorcmN1bTMKK3I0ZGFsCityMWQyYQorcmQyaQorcjFkNGk0YQorcmRpNGVyCityZDJpZTQKK3JkMWluNAorcmQzaW5nCisycmUuCityZTFhNGwKK3JlM2EybgorcmU1YXIxcjQKK3JlMmEycgorNXJlYTJ2CityZTRhdworcjVlYnJhdAorcjJlMWIKK3JlM2JyCityZWM1b2wxbAorcmUyY29sCityZTFjbworcmU0YzVvbXBlCityZWNvNG0xcAorcmU0Y3JlCityZTFjcgorMnIyZWQKK3JlMWRlCityZTNkaXMxCityNGVkaQorcmVkNWl0CityZTRmYWMKK3JlMWYKK3JlMWZhCityZTJmZQorcmU1ZmVyLgorcmVmZXIxCityZTNmaQorcmU0ZnkKK3JlZzNpcworcmU1aXQKK3JlaTIKK3JlMWwyaQorcmU1bHUKK3I0ZW40dGEKK3JlbjF0CityZW40dGUKK3JlMW8KK3JlNXBpMm4KK3JlNHBvc2kKK3JlMXBvCityZTFwb3MKK3JlMXB1CityMWVyNAorcjRlcjFpCityMmVybzQKK3I0ZTVydQorcjRlcy4KK3JlNHNwaQorcmUxc3AKK3JlczRzNWk0YgorcjJlMnNzCityZXMxc2kKK3JlczJ0CityZTVzMnRhMmwKK3JlczF0YQorcjJlM3N0NHIKK3JlNHRlcgorcmU0dGk0egorcmUzdHJpCityNGV1MgorcmU1dTF0MmkKK3JldjIKK3JlNHZhbAorcmUxdmEKK3JldjNlbAorcjVldjVlci4KK3JldjFlcgorcmU1dmU0cjFzMgorcmU1dmVydAorcmU1dmk0bAorcmUxdmkKK3JldjVvbHUKK3JlNHdoCityMWYKK3IzZnU0CityNGZ5CityZzIKK3JnM2VyCityM2dldAorcjNnMWljCityZ2k0bgorcmczaW5nCityNWdpcworcjVnaXQKK3IxZ2wyCityZ280bjIKK3IxZ28KK3IzZ3UKK3JoNAorNHJoLgorNHJoYWwKK3IyaTNhCityaWE0Ygorcmk0YWcKK3I0aWIKK3JpYjNhCityaWM1YXM1CityaTFjYQorcjRpY2UKKzRyMmkxY2kKKzVyaTVjMmlkCityaTRjMmllNAorcjRpMWNvCityaWQ1ZXIKK3IyaWQKK3JpM2VuYworcjJpZTQKK3JpM2VuMXQKK3JpMWVyCityaTVldAorcmlnNWEybgorcjJpZworcmkxZ2EKKzVyNGlnaQorcmlsM2l6CityaWwxaQorNXJpbWEybgorcmkxbWEKK3JpbTVpCiszcmkxbW8KK3JpbTRwZQorcmk0bTFwCityMmkxbmEKKzVyaW5hLgorcjRpbjRkCityMmluNGUKK3JpbjRnCityMmkxbworNXJpcGgKK3IyaXAKK3JpcGg1ZQorcmkycDJsMgorcmlwNWxpYworcjRpcQorcjJpcworcjRpcy4KK3IyaXM0YworcjNpczJoCityaXM0cAorcmkzdGEzYgorcmkxdGEKK3I1aXRlZC4KK3IyaXRlCityaTJ0MWVkCityaXQ1ZXIuCityaXQ1ZTRyMXMyCityNGkydDNpYworcmkxdGkKK3JpMnR1CityaXQ1dXIKK3JpdjVlbAorcjJpdgorcml2M2V0CityaXYzaQorcjNqCityM2tldAorcms0bGUKK3JrMWwKK3JrNGxpbgorcjFsCitybGU0CityMmxlZAorcjRsMmlnCityNGxpcworcmw1aXMyaAorcjNsbzQKK3IxbQorcm1hNWMKK3IxbWEKK3IybWUKK3IzbWVuCitybTVlNHIxczIKK3JtM2luZworcjRtaW5nLgorcjRtMmlvCityM21pdAorcjRteQorcjRuMmEycgorcjFuYQorcjNuZWwKK3I0bjFlcgorcjVuZXQKK3IzbmV5CityNW5pYworcjFuaXM0CityM24yaXQKK3IzbjJpdgorcm5vNAorcjRub3UyCityM251Cityb2IzbDIKK3Iyb2MKK3JvM2NyCitybzRlCitybzFmZQorcm81ZmlsCitybzJmaQorcjJvazIKK3JvNWsxZXIKKzVyb2xlLgorcm9tNWUxdGUKK3JvMm1lCitybzRtZXQKK3JvbTRpCitybzRtNHAKK3JvbjRhbAorcm8ybgorcm8xbjFhCityb240ZQorcm81bjRpcworcm9uNHRhCityb24xdAorMXJvb20KK3JvbzIKKzVyb290CitybzNwZWwKK3JvcDNpYworcm9yM2kKK3JvNXJvCitybzJzNXBlcgorcm8yczRzCitybzR0aDJlCityNG90aAorcm80dHkKK3JvNHZhCityb3Y1ZWwKK3JveDUKK3IxcAorcjRwZTRhCityNXBlbjF0CitycDVlci4KK3IzcGUydAorcnA0aDQKK3JwM2luZworcnBpMm4KK3IzcG8KK3IxcjQKK3JyZTRjCitycmU0ZgorcjRyZTFvCitycmU0czJ0CitycjJpNG8KK3JyMmk0dgorcnJvMm40Citycm9zNAorcnJ5czQKKzRyczIKK3Ixc2EyCityc2E1dGkKK3JzNGMKK3Iyc2UKK3Izc2VjCityc2U0Y3IKK3I0czVlci4KK3JzM2U0cworcjVzZTV2MgorcjFzMmgKK3I1c2hhCityMXNpCityNHNpNGIKK3JzbzJuMworcjFzbworcjFzcAorcjVzdzIKK3J0YTJjaDQKK3IxdGEKK3I0dGFnCityM3QyZTFiCityM3RlbjRkCityMXRlNW8KK3IxdGkKK3IydDVpMmIKK3J0Mmk0ZAorcjR0aWVyCitydDJpZTQKK3IzdDJpZworcnRpbDNpCitydGlsNGwKK3I0dGkxbHkKK3I0dGlzdAorcjR0Mml2CityM3RyaQorcnRyMm9waDQKK3J0NHMyaDQKK3I0dDFzMgorcnUzYQorcnUzZTRsCitydTNlbgorcnU0Z2wyCitydTNpNG4KK3IydWkyCitydW0zcDJsMgorcnU0bTJwCitydTJuCitydTRuazUKK3J1bjR0eQorcnVuMXQKK3I1dXNjMgorcjJ1cworcnUydDFpNW4KK3I0dTF0MmkKK3J2NGUKK3J2ZWw0aQorcjN2ZW4KK3J2NWVyLgorcjV2ZXN0CitydjRlMnMKK3IzdmV5CityM3ZpYworcjN2Mmk0dgorcjN2bworcjF3CityeTRjCis1cnluZ2UKK3J5bjVnCityeTN0CitzYTIKKzJzMWFiCis1c2FjazEKK3NhYzNyaTIKK3MzYTJjMXQKKzVzYWkyCitzYTRsMmEycjQKK3M0YTJsNG0KK3NhNWxvCitzYTRsNHQKKzNzYW5jCitzYTJuCitzYW40ZGUKK3M0YW5kCitzMWFwCitzYTV0YQorNXNhM3QyaW8KK3NhMnQzdQorc2F1NAorc2E1dm9yCis1c2F3Cis0czViCitzY2FuNHQ1CitzMWNhCitzY2Eybgorc2NhNHAKK3NjYXY1CitzNGNlZAorNHMzY2VpMgorczRjZXMKK3MyY2gyCitzNGNobzIKKzNzNGMyaWU0CitzMWNpCis1c2M0aW40ZAorczJjaW4KK3NjbGU1CitzMWM0bDQKK3M0Y2xpCitzY29mNAorczFjbworNHNjb3B5NQorc2NvdTFyNWEKK3Njb3UyCitzMWN1Cis0czVkCis0c2UuCitzZTRhCitzZWFzNAorc2VhNXcKK3NlMmMzbworM3NlMmMxdAorNHM0ZWQKK3NlNGQ0ZQorczVlZGwKK3NlMmcKK3NlMWczcgorNXNlaTIKK3NlMWxlCis1c2UybDJmCis1c2VsdgorNHNlMW1lCitzZTRtb2wKK3NlMW1vCitzZW41YXQKK3NlMW5hCis0c2VuYworc2VuNGQKK3M1ZTJuZWQKK3NlbjVnCitzNWVuMWluCis0c2VuNHQxZAorc2VuMXQKKzRzZW4ydGwKK3NlMnAzYTMKKzRzMWVyLgorczRlcjFsCitzMmVyNG8KKzRzZXIzdm8KK3MxZTRzCitzNGU1czJoCitzZXM1dAorNXNlNXVtCitzNGV1Cis1c2V2CitzZXYzZW4KK3NldzRpMgorNXNleAorNHMzZgorMnMzZworczJoCisyc2guCitzaDFlcgorNXNoZXYKK3NoMWluCitzaDNpbworM3NoMmk0cAorc2gyaTJ2NQorc2hvNAorc2g1bzJsMmQKK3NobzJuMworc2hvcjQKK3Nob3J0NQorNHNoMXcKK3NpMWIKK3M1aWMzYworM3NpMmRlLgorczJpZAorNXNpZGU0czIKKzVzaTJkaQorc2k1ZGl6Cis0c2lnMW40YQorczJpZworc2lsNGUKKzRzaTFseQorMnMxaW4KK3MyaTFuYQorNXNpMm5lLgorczJpbmUKK3MzaW5nCisxczJpbworNXNpbzJuCitzaW8xbjVhCitzNGkycgorc2kxcjVhCisxc2lzCiszczJpMXQyaW8KK3NpMXRpCis1c2kxdQorMXMyaXYKKzVzaXoKK3NrMgorNHNrZQorczNrZXQKK3NrNWluZQorc2sxaQorc2s1aW40ZworczFsMgorczNsYXQKK3MybGUKK3NsMml0aDUKK3NsMWl0CisyczFtCitzM21hCitzbWFsMWwzCitzbWEybjMKK3NtZWw0CitzNW1lbgorNXM0bTJpdGgKK3NtbzJsNWQ0CitzMW1vCitzMW40Cisxc28KK3NvNGNlCitzbzJmdDMKK3NvNGxhYgorc28xbGEKK3NvMmwzZDIKK3NvM2xpYworc29sMmkKKzVzb2wydgorM3NvbQorM3M0b24uCitzbzJuCitzbzFuMWE0Citzb240ZworczRvcAorNXNvcGgxaWMKK3Myb3BoCitzNW8zcGhpegorczVvMXBoeQorc29yNWMKK3NvcjVkCis0c292CitzbzV2aQorMnMxcGEKKzVzcDRhaTIKK3NwYTRuCitzcGVuNGQKKzJzNXBlbworMnNwZXIKK3MycGhlCiszc3BoNGVyCitzcGhvNQorc3BpbDQKK3NwNWluZworc3BpMm4KKzRzM3AyaTFvCitzNHAxbHkKK3MxcDJsMgorczRwbzJuCitzMXA0b3I0Cis0c3A0b3QKK3NxdWFsNGwKK3NxdTIKK3MxcgorMnNzCitzMXNhMgorc3NhczMKK3MyczVjCitzM3NlbAorczVzZW41ZworczRzZXMuCitzczFlNHMKK3M1c2V0CitzMXNpCitzNHMyaWU0Citzc2k0ZXIKK3M0czVpMWx5CitzNHMxbDIKK3NzNGxpCitzNHMxbjQKK3NzcGVuNGQ0CitzczJ0Citzc3UxcjVhCitzMXN1Citzc3Uycgorc3M1dzIKKzJzdC4KK3MydGFnCitzMXRhCitzMnRhMmwKK3N0YW00aQorNXN0NGFuZAorc3RhMm4KK3M0dGE0cAorNXN0YXQuCitzNHQxZWQKK3N0ZXJuNWkKK3M1dDJlcm8KK3N0ZTJ3CitzdGUxdzVhCitzM3RoMmUKK3N0MmkKK3M0dGkuCitzNXQyaTFhCitzMXRpYworNXM0dGljazEKK3M0dDJpZTQKK3MzdGlmMgorc3QzaW5nCitzMnQxaW4KKzVzdDRpcgorczF0bGUKK3MydGwKKzVzdG9jazEKK3MxdG8KK3N0bzJtM2EKKzVzdG9uZQorc3RvMm4KK3M0dG9wCiszc3RvcmUKK3N0NHIKK3M0dHJhMmQKK3MxdHJhCis1c3RyYTJ0dQorczR0cmF5CitzNHRyMmlkCis0c3RyeQorNHN0M3c0CitzMnR5Cisxc3UKK3N1MWFsCitzdTRiMworc3UyZzMKK3N1NWlzCitzMnVpMgorc3VpdDMKK3M0dWwKK3N1Mm0KK3N1MW0zaQorc3Uybgorc3UycgorNHN2CitzdzIKKzRzMXdvMgorczR5Cis0c3kxYworM3N5bAorc3luNW8KK3N5NXJpbgorMXRhCiszdGEuCisydGFiCit0YTVibGVzMgordGFiMmwyCis1dGFiNW81bDFpegordGFib2wyaQorNHQ0YTJjaQordGE1ZG8KK3RhMmQKKzR0YTJmNAordGFpNWxvCit0YWkyCit0YTJsCit0YTVsYQordGFsNWVuCit0MmFsZQordGFsM2kKKzR0YWxrCit0YWw0bGlzCit0YWwxbAordGFsbDJpCit0YTVsb2cKK3RhNW1vCit0YW40ZGUKK3RhMm4KK3Q0YW5kCisxdGFuMXRhMwordGFuMXQKK3RhNXBlcgordGE1cDJsMgordGFyNGEKK3QyYTJyCis0dGFyMWMKKzR0YXJlCit0YTNyMml6Cit0YXIxaQordGFzNGUKK3RhNXM0eQorNHRhdDFpYwordGE0dHVyCit0YTJ0dQordGF1bjQKK3RhdjQKKzJ0YXcKK3RheDRpcwordGF4M2kKKzJ0MWIKKzR0YwordDRjaAordGNoNWU0dAordGNoZTIKKzR0MWQKKzR0ZS4KK3RlMmFkNGkKK3RlYTJkMQorNHRlYTJ0Cit0ZTFjZTQKKzV0ZTJjMXQKKzJ0MWVkCit0NGU1ZGkKKzF0ZWUKK3RlZzQKK3RlNWdlcjQKK3RlNWdpCiszdGVsLgordGVsMmk0Cis1dGUybDFzMgordGUybWEyCit0ZW0zYXQKKzN0ZW4yYTJuCit0ZTFuYQorM3RlbmMKKzN0ZW5kCis0dGUxbmVzCisxdGVuMXQKK3RlbjR0YWcKK3RlbjF0YQorMXRlbwordGU0cAordGU1cGUKK3RlcjNjCis1dGVyM2QKKzF0ZXIxaQordGVyNWllcwordGVyMmllNAordGVyM2lzCit0ZXJpNXphMQorNXQ0ZXIzbjJpdAordGVyNXYKKzR0ZXMuCis0dDJlMnNzCit0M2Vzcy4KK3RldGg1ZQorM3Q0ZXUKKzN0ZXgKKzR0ZXkKKzJ0MWYKKzR0MWcKKzJ0aC4KK3RoYTJuNAordGgyZQorNHRoZWEKK3RoM2VhcwordGhlNWEydAordGhlM2lzCit0aGVpMgorM3RoZTR0Cit0aDVpYy4KK3RoNWkxY2EKKzR0aDRpbDIKKzV0aDRpNG5rMgorNHQ0aDFsNAordGg1b2RlCis1dGhvZDNpYworNHRob28yCit0aG9yNWl0Cit0aG81cml6CisydDRoMXMyCisxdDJpMWEKK3RpNGFiCit0aTRhMXRvCisydGkyYgorNHRpY2sxCit0NGkxY28KK3Q0aWMxdQorNXRpMmRpCit0MmlkCiszdGllbgordDJpZTQKK3RpZjIKK3RpNWZ5CisydDJpZworNXRpZ3UKK3RpbDJsNWluNAordGlsMWwKK3RpbGwyaQorMXRpbQorNHRpNG0xcAordGltNXVsCit0aTJtdQorMnQxaW4KK3QyaTFuYQorM3RpMm5lLgordDJpbmUKKzN0MmluaQorMXQyaW8KK3RpNW9jCit0aW9uNWVlCit0aW8ybgorNXRpcQordGkzc2EyCiszdDRpc2UKK3RpMnM0bQordGk1c28KK3RpczRwCis1dGlzdGkxY2EKK3RpczF0MmkKK3RpczF0aWMKK3RpM3RsCit0aTR1CisxdDJpdgordGkxdjRhCisxdGl6Cit0aTN6YTEKK3RpM3plNG4KK3RpMnplCisydGwKK3Q1bGEKK3RsYTJuNAorM3RsZS4KKzN0bGVkCiszdGxlcy4KK3RsZXMyCit0NWxldC4KK3Q1bG8KKzR0MW0KK3RtZTQKKzJ0MW4yCisxdG8KK3RvM2IKK3RvNWNyYXQKKzR0bzJkbzQKKzJ0b2YKK3RvMmdyCit0bzVpYwordG9pMgordG8ybWEKK3RvNG00YgordG8zbXkKK3RvbjRhNGwxaQordG8ybgordG8xbjFhCit0bzNuMmF0Cis0dG9ubworNHRvbnkKK3RvMnJhCit0bzNyMmllNAordG9yNWl6Cit0b3MyCis1dG91cgordG91MgorNHRvdXQKK3RvM3cyYTJyCis0dDFwCisxdHJhCit0MnJhM2IKK3RyYTVjaAordHI0YTJjaTQKK3RyYTJjNGl0Cit0cmFjNHRlCit0cmEyYzF0Cit0cjJhczQKK3RyYTV2ZW4KK3RyYXY1ZTJzNQordHJlNWYKK3RyZTRtCit0cmVtNWkKKzV0cjJpM2EKK3RyaTVjZXMKK3RyNGljZQorNXRyaTNjMmkxYQordDRyMmkxY2kKKzR0cmk0YzNzMgorMnRyaW0KK3RyMmk0dgordHJvNW00aQordHJvbjVpCit0cm8ybgorNHRyb255Cit0cm81cGhlCit0cjJvcGgKK3RybzNzcAordHJvM3YKK3RyMnU1aTIKK3RyMnVzNAorNHQxczIKK3Q0c2MKK3RzMmg0Cit0NHN3MgorNHQzdDIKK3Q0dGVzCit0NXRvCit0MXR1NAorMXR1Cit0dTFhCit0dTNhMnIKK3R1NGI0aQordHVkMgorNHR1ZQorNHR1ZjQKKzV0MnUzaTIKKzN0dW0KK3R1NG5pcwordHUxbmkKKzJ0M3VwLgorM3R1cmUKKzV0dXJpCit0dXIzaXMKK3R1cjVvCit0dTVyeQorM3QydXMKKzR0dgordHc0Cis0dDF3YQordHdpczQKK3R3aTIKKzR0MXdvMgorMXR5Cis0dHlhCisydHlsCit0eXBlMwordHk1cGgKKzR0egordDJ6NGUKKzR1YWIKK3VhYzQKK3VhNW5hCit1YTJuCit1YW40aQordWFyNWFuMXQKK3UyYTJyCit1YXJhMm4KK3VhcjJkCit1YXIzaQordWFyM3QKK3UxYXQKK3VhdjQKK3ViNGUKK3U0YmVsCit1M2JlcgordTRiMmVybwordTFiNGkKK3U0YjVpbmcKK3UzYjRsZS4KK3ViMmwyCit1M2NhCit1Y2k0YgordTFjaQordTJjNGl0Cit1Y2xlMwordTFjNGw0Cit1M2NyCit1M2N1Cit1NGN5Cit1ZDVkNAordWQzZXIKK3VkNWVzdAordWRlczIKK3VkZTF2NAordTFkaWMKK3VkM2llZAordWQyaWU0Cit1ZDNpZXMKK3VkNWlzMQordTVkaXQKK3U0ZG8ybgordTFkbwordWQ0c2kKK3UyZDFzMgordTRkdQordTRlbmUKK3VlMm4xczQKK3VlbjR0ZQordWVuMXQKK3VlcjRpbAordWVyMWkKKzN1MWZhCit1M2Y0bDIKK3VnaDNlMm4KK3VnNWluCisydWkyCit1aWw1aXoKK3VpbDFpCit1aTRuCit1MWluZwordWlyNG0KK3U0aXIKK3VpMXRhNAordTJpdjMKK3VpNHY0ZXIuCit1NWoKKzR1awordTFsYQordWxhNWIKK3U1bGF0aQordWwyY2g0Cit1NGwxYzIKKzV1bGNoZTIKK3VsM2RlcgordTJsZAordWwyZGUKK3VsNGUKK3UxbGVuCit1bDRnaQordTRsMWc0Cit1bDJpCit1NWwyaTFhCit1bDNpbmcKK3VsNWlzMmgKK3VsNGwyYTJyCit1bDFsCit1bDRsaTRiCit1bGwyaQordWw0bGlzCis0dTJsM20KK3UxbDRvCis0dTJsMXMyCit1bHM1ZTRzCit1bDJzZQordWwxdGkKK3U0bHQKK3VsMXRyYTMKK3VsMXRyCis0dWwxdHUyCit1M2x1Cit1bDV1bAordWw1dgordTJtNWFiCit1MW1hCit1bTRiaQordTRtMWIKK3VtNGIxbHkKK3VtYjJsMgordTFtaQordTRtM2luZwordW1vcjVvCit1MW1vCit1bW8ycgordTRtMnAKK3VuMmF0NAordTFuYQordTJuZQordW40ZXIKK3UxbmkKK3VuNGltCit1Mm4xaW4KK3VuNWlzMmgKK3VuMmkzdgordTJuM3M0Cit1bjRzdzIKK3VuMnQzYTRiCit1bjF0Cit1bjF0YQordW40dGVyLgordW40dGVzCit1bnU0Cit1bjV5Cit1NG41egordTRvNHJzMgordTVvcwordTFvdTIKK3UxcGUKK3VwZTRyNXMyCit1NXAyaTNhCit1cDNpbmcKK3VwaTJuCit1M3AybDIKK3U0cDNwCit1cHBvcnQ1Cit1cDFwNG9yCit1cDJ0NWkyYgordTJwMXQKK3VwMXR1NAordTFyYQorNHVyYS4KK3U0cmFnCit1NHIyYXMKK3VyNGJlCit1cjFiCit1cjFjNAordXIxZAordXJlNWEydAordXI0ZmVyMQordXIxZgordXI0ZnIKK3UzcmlmCit1cmk0ZmljCit1cmkxZmkKK3VyMWluCit1M3IyaTFvCit1MXJpdAordXIzaXoKK3VyMmwKK3VybDVpbmcuCit1cjRubzQKK3Vyb3M0Cit1cjRwZQordXIxcAordXI0cGkKK3VyczVlcgordTRyczIKK3VyMnNlCit1cjV0ZXMKK3VyM3RoMmUKK3VyMXRpNAordXI0dDJpZTQKK3UzcnUKKzJ1cwordTVzYTJkCit1c2EyCit1NXNhMm4KK3VzNGFwCit1c2MyCit1czNjaQordXNlNWEKK3U1czJpMWEKK3Uzc2ljCit1czRsaW4KK3VzMWwyCit1czFwCit1czVzMWwyCit1MnNzCit1czV0ZXJlCit1czF0NHIKK3Uyc3UKK3VzdTJyNAordTJ0YTRiCit1MXRhCit1M3RhdAorNHU0dGUuCis0dXRlbAorNHV0ZW4KK3V0ZW40aQorNHUxdDJpCit1dGk1bDJpegordXRpbDFpCit1M3QyaW5lCit1MnQxaW4KK3V0M2luZwordXRpbzFuNWEKK3UxdDJpbwordXRpbzJuCit1NHRpcworNXU1dGl6Cit1NHQxbAordTJ0NW9mCit1MXRvCit1dG81ZwordXRvNW1hdDFpYwordXRvMm1hCit1NXRvMm4KK3U0dG91MgordTR0MXM0Cit1M3UKK3V1NG0KK3UxdjIKK3V4MXUzCit1Mno0ZQorMXZhCis1dmEuCisydjFhNGIKK3ZhYzVpbAordjRhMmNpCit2YWMzdQordmFnNAordmE0Z2UKK3ZhNWwyaTRlNAordmFsMWkKK3ZhbDVvCit2YWwxdQordmE1bW8KK3ZhNW5pegordmEybgordmE1cGkKK3ZhcjVpZWQKK3YyYTJyCit2YXIxaQordmFyMmllNAorM3ZhdAorNHZlLgorNHZlZAordmVnMwordjNlbC4KK3ZlbDNsMmkKK3ZlbDFsCit2ZTRsbwordjRlMWx5Cit2ZW4zb20KK3Y0ZW5vCit2NWVudWUKK3Y0ZXJkCis1djJlMnJlLgordjRlcmVsCit2M2VyZW4KK3ZlcjVlbmMKK3Y0ZXJlcwordmVyM2llNAordmVyMWkKK3Zlcm1pNG4KK3ZlcjNtNAorM3ZlcjJzZQordmU0cjFzMgordmVyM3RoCit2NGUycworNHZlcy4KK3ZlczR0ZQordmU0dGUKK3ZldDNlcgordmU0dHkKK3ZpNWFsMWkKK3YyaTFhCit2aTJhbAorNXZpMmEybgorNXZpMmRlLgordjJpZAorNXZpMmQxZWQKKzR2M2kxZGVuCis1dmlkZTRzMgorNXZpMmRpCit2M2lmCit2aTVnbgordjJpZwordjRpazQKKzJ2aWwKKzV2MmlsMWl0Cit2aWwxaQordjNpM2wyaXoKK3YxaW4KKzR2aTRuYQordjJpbmMKK3Y0aW41ZAorNHZpbmcKK3ZpMW8zbAordjJpbwordjNpbzRyCit2aTFvdTIKK3YyaTRwCit2aTVybwordjRpcgordmlzM2l0Cit2aTNzbwordmkzc3UKKzR2aTF0aQordml0M3IKKzR2aTF0eQorM3YyaXYKKzV2by4KK3ZvaTQKKzN2Mm9rCit2bzRsYQordjVvbGUKKzV2bzRsMnQKKzN2b2wydgordm9tNWkKK3ZvMnI1YWIKK3ZvMXJhCit2b3JpNAordm80cnkKK3ZvNHRhCis0dm8xdGVlCis0dnY0Cit2NHkKK3c1YWIybDIKKzJ3YWMKK3dhNWdlcgord2EyZzVvCit3YWl0NQord2FpMgordzVhbC4KK3dhbTQKK3dhcjR0Cit3MmEycgord2FzNHQKK3dhMXRlCit3YTV2ZXIKK3cxYgord2VhNXIyaWU0Cit3ZTJhMnIKK3dlYXIxaQord2U0YXRoMword2VhMnQKK3dlNGQ0bjQKK3dlZXQzCit3ZWU1dgord2VsNGwKK3cxZXIKK3dlc3QzCit3M2V2Cit3aGk0Cit3aTIKK3dpbDIKK3dpbDJsNWluNAord2lsMWwKK3dpbGwyaQord2luNGRlCit3NGluZAord2luNGcKK3c0aXI0CiszdzRpc2UKK3cyaXRoMword2l6NQordzRrCit3bDRlczIKK3dsM2luCit3NG5vCisxd28yCit3b20xCit3bzV2NGVuCit3NXAKK3dyYTQKK3dyaTQKK3dyaTF0YTQKK3czczJoCit3czRsMgord3M0cGUKK3c1czR0Cis0d3QKK3d5NAoreDFhCit4YWM1ZQoreDRhMmdvCit4YW0zCit4NGFwCit4YXM1Cit4M2MyCit4MWUKK3hlNGN1MXRvCit4ZTFjdQoreGUzYzR1dAoreDJlZAoreGVyNGkKK3gyZTVybworeDFoCit4aGkyCit4aDRpbDUKK3hodTQKK3gzaQoreDJpNWEKK3hpNWMKK3hpNWRpCit4MmlkCit4NGltZQoreGk1bTJpegoreGltMWkKK3gzbworeDRvYgoreDNwCit4cDRhbjRkCit4MXBhCit4cGEybgoreHBlYzF0bzUKK3hwZTJjCit4cGUyYzF0Cit4MnAyZTNkCit4MXQyCit4M3RpCit4MXUKK3h1M2EKK3h4NAoreTVhYworM3kyYTJyNAoreTVhdAoreTFiCit5MWMKK3kyY2UKK3ljNWVyCit5M2NoCit5Y2g0ZTIKK3ljb200Cit5MWNvCit5Y290NAoreTFkCit5NWVlCit5MWVyCit5NGVyMWYKK3llczQKK3llNHQKK3k1Z2kKKzR5M2gKK3kxaQoreTNsYQoreWxsYTViMmwyCit5bDFsCit5M2xvCit5NWx1Cit5bWJvbDUKK3k0bTFiCit5bWU0Cit5bTFwYTMKK3k0bTFwCit5bjNjNGhyNAoreW4yY2gKK3luNWQKK3luNWcKK3luNWljCis1eW54Cit5MW80Cit5bzVkCit5NG81ZworeW9tNAoreW81bmV0Cit5bzJuCit5NG8ybjNzMgoreTRvcworeTRwMmVkCit5cGVyNQoreXAzaQoreTNwbworeTRwbzRjCit5cDJ0YQoreTJwMXQKK3k1cHUKK3lyYTVtCit5cjVpM2EKK3kzcm8KK3lyNHI0Cit5czRjCit5M3MyZQoreXMzaTFjYQoreTFzM2lvCiszeTFzaXMKK3k0c28KK3kyc3M0Cit5czF0Cit5czN0YQoreXN1MnI0Cit5MXN1Cit5M3RoaW4KK3l0M2ljCit5MXcKK3phMQorejVhMmIKK3oyYTJyMgorNHpiCisyemUKK3plNG4KK3plNHAKK3oxZXIKK3oyZTNybworemV0NAorMnoxaQorejRpbAorejRpcworNXpsCis0em0KKzF6bworem80bQorem81b2wKK3pvbzIKK3p0ZTQKKzR6MXoyCit6NHp5CisuYXM5czhvOWM4aThhOHRlLgorLmFzMXNvCisuYXNzbzFjaQorLmFzc28zYzJpMWEKKy5hczlzOG85YzhpOGE4dDhlcy4KKy5kZThjOWw4aTluOGE5dDhpOG9uLgorLmRlMWM0bDQKKy5kZWNsNGkxbmEKKy5kZWNsaW4yYXQKKy5kZWNsaW5hMXQyaW8KKy5kZWNsaW5hdGlvMm4KKy5vYjhsOGk4ZzlhOXQ4bzhyeS4KKy5vYjJsMgorLm9ibDJpZworLm9ibGkxZ2EKKy5vYmxpZ2ExdG8KKy5vYmxpZ2F0bzFyeQorLnBoOGk4bDlhOG45dDhoOHI4bzhwOGljLgorLnBoNGlsMgorLnBoaTFsYQorLnBoaWxhMm4KKy5waGlsYW4xdAorLnBoaWxhbnQ0aHI0CisucGhpbGFudGhyb3AzaWMKKy5wcjhlOHM4ZThudC4KKy5wM3JlMXMyZQorLnByZXNlbjF0CisucHI4ZThzOGU4bjh0cy4KKy5wcmVzZW40dDRzMgorLnByOG84ajhlOGN0LgorLnBybzVqCisucHJvMWplCisucHJvamUyYzF0CisucHI4bzhqOGU4Yzh0cy4KKy5wcm9qZWM0dDFzMgorLnJlOGM5aTlwOHI4bzhjOWk5dDh5LgorLnJlMWMyaQorLnJlYzJpcAorLnJlY2lwcjIKKy5yZWNpcHIyb2MKKy5yZTFjaXBybzFjaQorLnJlY2lwcm8yYzFpdAorLnJlY2lwcm9jaTF0eQorLnJlOWM4bzhnOW44aTl6OGE4bjhjZS4KKy5yZTFjbworLnJlMmNvZworLnJlYzNvZ25pegorLnJlY29nMW5pCisucmVjb2duaXphMQorLnJlY29nbml6YTJuCisucmU4ZjlvOHI5bThhOXQ4aThvbi4KKy5yZTFmCisucmUxZm8KKy5yZWZvMnIKKy5yZWZvcjFtCisucmVmb3IxbWEKKy5yZWZvcm1hMXQyaW8KKy5yZWZvcm1hdGlvMm4KKy5yZTh0OXI4aTliOHU5dDhpOG9uLgorLnJlM3RyaQorLnJldHI0aWIKKy5yZXRyaTNidTF0MmlvCisucmV0cmliNHUxdDJpCisucmV0cmlidXRpbzJuCisudGE5YjhsZS4KKy4ydGFiCisudGFiMmwyCisuYWM4YThkOWU5bTh5LgorLmExY2EKKy5hY2EyZAorLmFjYWQ0ZW0KKy5hY2FkZTNteQorLmFjOGE4ZDllOW04aThlOHMuCisuYWNhZGVtMmk0ZTQKKy5hYzljOHU5czhhOXQ4aTh2OGUuCisuYWMzYworLmFjMWMydXMKKy5hY2N1c2EyCisuYWNjdXNhMXQyaXYKKy5hYzhyOG85bjh5OG0uCisuYWNybzJuCisuYWNyb255bTQKKy5hYzhyOHk4bDlhOG04aThkOGUuCisuYWNyeTNsYQorLmFjcnlsYW0yaWQKKy5hYzhyOHk4bDlhOG04aThkOGU4cy4KKy5hY3J5bGFtaWRlNHMyCisuYWM4cjh5OGw5YThsOGQ4ZTloOHk4ZDhlLgorLmFjcnlsYTJsZAorLmFjcnlsYWwyZGUKKy5hY3J5bGFsZGUxaDQKKy5hY3J5bGFsZGVoeTFkCisuYWQ4ZDlhOWI4bDhlLgorLmFkMWQyYQorLmFkMmQzYTRiCisuYWRkYWIybDIKKy5hZDhkOWk5YjhsOGUuCisuYWRkaTFiMmwyCisuYWQ4cjhlOG45YTlsOGk4bjhlLgorLmExZHIKKy5hZHJlNAorLmE1ZHJlbgorLmFkcmUxbmEKKy5hZHJlbmE0bDFpCisuYWRyZW5hMWw0aW5lCisuYWU4cjhvOXM4cDhhOGM4ZS4KKy5hZTRyCisuYTJlcm8KKy5hZXJvMnM0cGEKKy5hZXJvc3BhNGNlCisuYWY5dDhlOHI5dDhoOG84dThnOGg4dC4KKy5hZnRlcnRob3UyCisuYWY5dDhlOHI5dDhoOG84dThnOGg4dDhzLgorLmFmdGVydGhvdWdoNHQxczIKKy5hZzhyOG84bjlvOW04aThzOHQuCisuYTFncgorLmFnNHJvCisuYWdybzJuCisuYWdyb25vbTJpcworLmFnOHI4bzhuOW85bThpOHM4dDhzLgorLmFncm9ub21pczR0MXMyCisuYWw5ZzhlOWI4cjhhOWk5YzhhOGw5bDh5LgorLmE0bDFnNAorLmFsZzJlMWIKKy5hbGdlM2JyCisuYWxnZWJyMmFpMgorLmFsZ2VicmFpMWNhCisuYWxnZWJyYWljYWwxbAorLmFsZ2VicmFpY2FsMWx5CisuYW05cDhoOGU4dDlhOW04aThuOGUuCisuYTRtMXAKKy5hbXBoZTR0CisuYW1waGUxdGEKKy5hbXBoZXRhbTFpbgorLmFtcGhldGFtMmluZQorLmFtOXA4aDhlOHQ5YTltOGk4bjhlOHMuCisuYW1waGV0YW1pMW5lcworLmFuOWE5bDh5OHM4ZS4KKy4zYW5hMWx5CisuYTFuYQorLmFuNGEybHlzNAorLmFuYWw1eTNzMmUKKy5hbjlhOWw4eThzOGU4ZC4KKy5hbmFseTRzNGVkCisuYW44YThsOHk5czhlOHMuCisuYW5hbHlzMWU0cworLmFuOWk4czhvOXQ4cjhvOHA5aThjLgorLmFuaTJzbworLmFuaXNvdHJvcDNpYworLmFuOWk4czhvOXQ4cjhvOHA5aTljOGE4bDlsOHkuCisuYW5pc290cm9waTFjYQorLmFuaXNvdHJvcGljYWwxbAorLmFuaXNvdHJvcGljYWwxbHkKKy5hbjlpOHM4bzh0OXI4bzlwOGk4czhtLgorLmFuaXNvdHJvcGkyczFtCisuYW45aThzOG84dDlyOG84cDh5LgorLmFuaXNvdHJvcHk1CisuYW44bzhtOWE4bDh5LgorLmFubzQKKy5hbm9tYTVsCisuYW5vMW1hCisuYW5vbWExbHkKKy5hbjhvOG05YThsOGk4ZThzLgorLmFub21hbDFpCisuYW5vbWFsMmk0ZTQKKy5hbjh0OGk5ZDhlOHI4aTh2OWE5dDhpOHY4ZS4KKy5hbnQyaWQKKy5hbnRpZGVyMWkKKy5hbnRpZGVyMmk0dgorLmFudGlkZTRyaTF2YQorLmFudGlkZXJpM3ZhdAorLmFudGlkZXIyaXZhMXQyaXYKKy5hbjh0OGk5ZDhlOHI4aTh2OWE5dDhpOHY4ZThzLgorLmFudGlkZXJpdmF0aXY0ZTJzCisuYW44dDhpOWg4bzhsOG85bThvOHI5cDhoOGk4Yy4KKy5hbnRpM2gKKy5hbnRpaG9sbzFtbworLmFudGlob2xvbW8ycgorLmFudGlob2xvbW9yMXAKKy5hbnRpaG9sb21vcnA0aDQKKy5hbnRpaG9sb21vcnBoMWljCisuYW45dDhpOG45bzltOHkuCisuYW4ydDFpbgorLmFudDJpMW5vCisuYW50aW5vM215CisuYW45dDhpOG45bzltOGk4ZThzLgorLmFudGlub20yaWU0CisuYW45dDhpOW44dTljOGw4ZThhOHIuCisuYW50aW4xdQorLmFudGludWNsZTMKKy5hbnRpbnUxYzRsNAorLmFudGludWNsZTJhCisuYW50aW51Y2xlMmEycgorLmFuOXQ4aTluOHU5YzhsOGU5bzhuLgorLmFudGludWNsZW8ybgorLmFuOXQ4aTlyOGU4djlvOWw4dTl0OGk4bzhuOWE4cjh5LgorLmFudDRpcgorLmFudGlyZXYyCisuYW50aXJldjVvbHUKKy5hbnRpcmV2bzFsdXQKKy5hbnRpcmV2b2w0dTF0MmkKKy5hbnRpcmV2b2x1dGlvMW41YQorLmFudGlyZXZvbHUxdDJpbworLmFudGlyZXZvbHV0aW8ybgorLmFudGlyZXZvbHV0aW9uMmEycgorLmFwOG84dDhoOWU5bzlzOGU4cy4KKy5hcDRvdAorLmFwNG90aAorLmFwb3RoMmUKKy5hcG90aGVvczQKKy5hcG90aGVvczFlNHMKKy5hcDhvOHQ4aDllOW85czhpOHMuCisuYXBvdGhlbzFzaXMKKy5hcDlwOGU4bjlkOGk4eC4KKy5hNHAxcAorLmFwMnBlCisuYXAzcGVuCisuYXI5YzhoOGk5bThlOWQ4ZThhOG4uCisuYXIxYworLmFyMmNoCisuYXJjaGkybWVkCisuYXJjaGltZWRlYTJuCisuYXI5YzhoOGk5cDhlOGw5YThnOG8uCisuYXJjaDJpNHAKKy5hcmNoaXBlNAorLmFyY2hpcGU0bGEKKy5hcmNoaXBlbGEyZ28KKy5hcjljOGg4aTlwOGU4bDlhOWc4bzhzLgorLmFyOWM4aDhpOHY4ZS4KKy5hcmNoMmkydgorLmFyOWM4aDhpOHY4ZThzLgorLmFyY2hpdjRlMnMKKy5hcjljOGg4aTh2OWk4bjhnLgorLmFyY2hpdjFpbgorLmFyY2hpNHZpbmcKKy5hcjljOGg4aTh2OWk4czh0LgorLmFyOWM4aDhpOHY5aThzOHQ4cy4KKy5hcmNoaXZpczR0MXMyCisuYXI5YzhoOGU5dDh5OHA5YThsLgorLmFyY2hlMgorLmFyY2hlNHQKKy5hcmNoZTF0eQorLmFyY2hldHkxcGEKKy5hcmNoZXR5cDRhbAorLmFyOWM4aDhlOXQ4eThwOWk5YzhhOGwuCisuYXJjaGV0eXAzaQorLmFyY2hldHlwaTFjYQorLmFyOGM5dDhhOG45ZzhlOG44dC4KKy5hcjJjMXQKKy5hcmN0NWFuZworLmFyYzF0YQorLmFyY3RhMm4KKy5hcmN0YW4xZ2VuCisuYXJjdGFuZ2VuMXQKKy5hcjhjOXQ4YThuOWc4ZThuOHQ4cy4KKy5hcmN0YW5nZW40dDRzMgorLmFzOXM4aThnOG45YTliOGw4ZS4KKy5hczFzaQorLmFzNHNpZzFuNGEKKy5hc3MyaWcKKy5hc3NpZzJuMWEyYgorLmFzc2lnbmFiMmwyCisuYXM5czhpOGc4bjlvOHIuCisuYXNzaWcxbm8KKy5hczlzOGk4ZzhuOW84cjhzLgorLmFzc2lnbm80cnMyCisuYXM5czhpOHM4dDlhOG44dDlzOGg4aThwLgorLmFzMXNpcworLmFzc2lzMXRhCisuYXNzaXN0YTJuCisuYXNzaXN0YW4xdAorLmFzc2lzdGFuNHQ0czIKKy5hc3Npc3RhbnRzMmg0CisuYXNzaXN0YW50M3NoMmk0cAorLmFzOXM4aThzOHQ5YThuOHQ5czhoOGk4cDhzLgorLmFzc2lzdGFudHNoaTJwMXMyCisuYXM4eThtOHA5dDhvOW04YTh0OGk4Yy4KKy5hczR5CisuYXN5NG0xcAorLmFzeW0ycDF0CisuYXN5bXAxdG8KKy5hc3ltcHRvMm1hCisuYXN5bXB0b21hdDFpYworLmFzOXk4bThwOXQ4bzh0OWk4Yy4KKy5hczh5OG45YzhoOHI4bzluOG84dThzLgorLmFzeW4zYzRocjQKKy5hc3luMmNoCisuYXN5bmNocm8ybgorLmFzeW5jaHJvMW5vdTIKKy5hc3luY2hyb25vMnVzCisuYXQ4aDllOHI5bzlzOGM4bDhlOXI4bzlzOGk4cy4KKy40YXRoCisuYXRoMmUKKy5hdGgyZXJvCisuYXRoZXJvczJjCisuYXRoZXJvc2NsZTUKKy5hdGhlcm9zMWM0bDQKKy5hdGgyZXJvc2NsNGVybworLmF0aGVyb3NjbGVybzFzaXMKKy5hdDltOG84czlwOGg4ZThyOGUuCisuYTR0MW0KKy5hdDFtbworLmF0bW9zMgorLmF0bW8zc3AKKy5hdG1vczJwaGUKKy5hdG1vM3NwaDRlcgorLmF0OW04bzhzOXA4aDhlOHI4ZThzLgorLmF0OXQ4cjhpOGI5dTh0OGU4ZC4KKy5hNHQzdDIKKy5hdHRyNGliCisuYXR0cmlidTJ0MWVkCisuYXQ5dDhyOGk4Yjl1OHQ5YThiOGw4ZS4KKy5hdHRyaTRidTF0YQorLmF0dHJpYnUydGE0YgorLmF0dHJpYnV0YWIybDIKKy5hdTl0OG85bThhOXQ4aThvOG4uCisuYXUxdG8KKy5hdXRvMm1hCisuYXV0b21hMXQyaW8KKy5hdXRvbWF0aW8ybgorLmF1OXQ4bzhtOWE5dDhvOG4uCisuYXV0b21hMXRvCisuYXV0b21hdG8ybgorLmF1OXQ4bzhtOWE5dDhhLgorLmF1dG9tYTJ0YQorLmF1OXQ4bzluOHU4bTliOGU4cjlpOG44Zy4KKy5hdTV0bzJuCisuYXV0b241dW0KKy5hdXRvbnU0bTFiCisuYXV0b251bWJlcjFpCisuYXV0b251bWJlcmluNGcKKy5hdTl0OG84bjlvOW04bzh1OHMuCisuYXU0dG9ubworLmF1dG9ubzRtbworLmF1dG9ubzNtbzJ1cworLmF1dG9ub21vdTIKKy5hdTh0OG85cjhvOHU4bjhkOWk4bjhnLgorLmF1dG9yb3UyCisuYXV0b3JvdW4yZAorLmF1dG9yb3VuZDFpbgorLmF2OW84aThyOWQ4dTlwOG84aThzLgorLmF2b2k0CisuYXZvNGlyCisuYXZvaXIxZHUKKy5hdm9pcjRkdXAKKy5hdm9pcmR1cG9pMgorLmJhOG44ZDlsOGU4YThkOGU4ci4KKy5iNGFuZAorLmJhbjFkbAorLmJhbmRsZTJhCisuYmFuZGxlYTJkMQorLmJhOG44ZDlsOGU4YThkOGU4cjhzLgorLmJhbmRsZWFkZTRyNXMyCisuYmE4bjhrOXI4dThwOHQuCisuYmE0bmsyCisuYmFua3J1MnAxdAorLmJhOG44azlyOHU4cDh0OWM4eS4KKy5iYW5rcnVwNHRjCisuYmFua3J1cHQxY3kKKy5iYThuOGs5cjh1OHA4dDljOGk4ZThzLgorLmJhbmtydXB0MWNpCisuYmFua3J1cHRjMmllNAorLmJhOHI5bzhuOGk4ZThzLgorLmIyYTJyCisuYmE1cm9uaQorLmJhcm8ybgorLmJhcm9uMmllNAorLmJhOHM4ZTlsOGk4bjhlOXM4azhpOHAuCisuYmFzZWwyaQorLmJhc2UxbDRpbmUKKy5iYXNlbGkxbmVzCisuYmFzZWxpbmVzazIKKy5iYXNlbGluZXNrMWkKKy5iYXNlbGluZXNrMmk0cAorLmJhOXQ4aDh5OG05ZTl0OHI4eS4KKy4xYmF0CisuYjRhdGgKKy5iYXRoeW1lNAorLmJhdGh5bTRldHIKKy5iYXRoeW1lM3RyeQorLmJhOHQ4aDh5OXM4YzhhOHA4aDhlLgorLmJhdGh5MnMKKy5iYXRoeXM0YworLmJhdGh5c2NhNHAKKy5iYXRoeXMxY2EKKy5iZThhOG45aThlOHMuCisuYmVhMm4KKy5iZWEzbmllcworLmJlYW4yaWU0CisuYmU5aDhhOHY5aThvOHU4ci4KKy5iZTFoNAorLmJlaGF2MWkKKy5iZWhhdmkxb3UyCisuYmVoYXYyaW8KKy5iZWhhdmk0b3VyCisuYmU5aDhhOHY5aThvOHU4cjhzLgorLmJlaGF2aW91NHJzMgorLmJlOHY4aThlOHMuCisuYmUxdmkKKy5iZXYyaWU0CisuYmk4YjlsOGk5bzhnOXI4YTlwOGg4eTlzOHQ4eThsOGUuCisuYmkyYgorLmJpMWIybDIKKy5iaWIzbGkKKy5iaWJsaTVvZworLmJpYmwyaW8KKy5iaWJsaW8yZ3IKKy5iaWJsaW80ZzNyYTFwaHkKKy5iaWJsaW9ncmFwaHkycworLmJpYmxpb2dyYXBoeXMxdAorLmJpYmxpb2dyYXBoeXMydHkKKy5iaWJsaW9ncmFwaHlzMnR5bAorLmJpOWQ4aThmOWY4ZThyOWU4bjl0OGk4YThsLgorLmIyaTRkCisuYmkyZGkKKy5iaWQxaWYKKy5iaWRpNGYxZgorLmJpZGlmZmVyMQorLmJpZGlmZmVyM2VuMXQKKy5iaWRpZmZlcmVudDJpCisuYmlkaWZmZXJlbjF0MmkxYQorLmJpZGlmZmVyZW50aTJhbAorLmJpOGc5ZzhlOHM4dC4KKy5iMmlnCisuYmk0ZzFnMgorLmJpZzJnZQorLmJpOGw4bDlhOGI4bDhlLgorLjFiaWwKKy5iaWxsNWFiCisuYmlsMWwKKy5iaWxsYWIybDIKKy5iaThvOW04YTh0OGg5ZTltOGE4dDlpOGM4cy4KKy5iMmlvCisuYmlvNG0KKy5iaW8xbWEKKy5iaW9tNGF0aDMKKy5iaW9tYXRoNWVtCisuYmlvbWF0aDJlCisuYmlvbWF0aGUxbWEKKy5iaW9tYXRoZW1hdDFpYworLmJpb21hdGhlbWF0aTRjM3MyCisuYmk4bzltOGU4ZDlpOWM4YThsLgorLmJpbzJtZQorLmJpbzJtZWQKKy5iaW9tNGVkaQorLmJpb21lZDNpMWNhCisuYmk4bzltOGU4ZDlpOWM4aThuOGUuCisuYmlvbWVkMmkxY2kKKy5iaW9tZWRpMmNpbgorLmJpb21lZGljMmluZQorLmJpOG85cjhoOHk4dDhoOG04cy4KKy5iaW9yaDQKKy5iaW9yaHl0NGgxbQorLmJpb3JoeXRoNG0xczIKKy5iaTh0OW04YThwLgorLmJpMnQKKy5iaTR0MW0KKy5iaXQxbWEKKy5iaXQ0bWFwCisuYmk4dDltOGE4cDhzLgorLmJpdG1hMnAxczIKKy5ibDhhOG44ZDllOHIuCisuYjJsMgorLmIzbDRhbmQKKy5ibGEybgorLmJsYW4xZGUKKy5ibDhhOG44ZDllOHM4dC4KKy5ibGFuZGU0czIKKy5ibDhpOG44ZDllOHIuCisuYmw0aW5kCisuYmxpbjFkZQorLmJsOG84bjhkOGU4cy4KKy5iNGxvCisuYmxvMm4KKy5ibDJvbmQKKy5ibG9uMWRlCisuYmxvbmRlczIKKy5ibDh1OGU5cDhyOGk4bjh0LgorLmJsdWVwcjIKKy5ibHVlcHJpbjR0MworLmJsOHU4ZTlwOHI4aThuOHQ4cy4KKy5ibHVlcHJpbjR0NHMyCisuYm85bDhvOG05ZTl0OGU4ci4KKy5ib2xvMm1lCisuYm9sbzRtZXQKKy5ib2xvbWUxdGUKKy5ibzhvOGs5czhlOGw4bDllOHIuCisuM2JvbzIKKy5ibzJvNGsKKy5ib280azFzMgorLmJvb2tzZWwxbAorLmJvb2tzZWwybGUKKy5ibzhvOGs5czhlOGw4bDllOHI4cy4KKy5ib29rc2VsbGU0cjFzMgorLmJvOG84bDllOGE4bi4KKy5ib29sZTJhCisuYm9vbGVhMm4KKy5ibzhvOGw5ZThhOG44cy4KKy5ib29sZWEybjFzMgorLmJvOHI5bjhvOWw4bzhnOWk5YzhhOGwuCisuYm9ybm80CisuYm9ybm8zbG9nMWljCisuYm9ybm9sb2dpMWNhCisuYm84dDl1OWw4aThzOG0uCisuYm8xdHUKKy5ib3R1bDJpCisuYm90dWxpMnMxbQorLmJyOHU4czhxOHU4ZThyLgorLmJyMnVzCisuYnJ1c3F1MgorLmJydXMzcXVlcgorLmJ1OGY5ZjhlOHIuCisuYnVmNGZlcjEKKy5idTRmMWYKKy5idThmOWY4ZThyOHMuCisuYnVmZmU0cjFzMgorLmJ1OHM4aThlOHIuCisuYnVzNWllNAorLmIydXMKKy5idThzOGk4ZThzOHQuCisuYnVzaTFlc3QKKy5idThzOHM4aThuOGcuCisuYnUyc3MKKy5idXMxc2kKKy5idXMyczFpbgorLmJ1c3MzaW5nCisuYnU4dDh0OGU4ZC4KKy5idXQydDFlZAorLmJ1OHo4ejl3OG84cjhkLgorLmJ1NHoxejIKKy5idXp6MXdvMgorLmJ1OHo4ejl3OG84cjhkOHMuCisuYnV6endvcjJkMXMyCisuY2E5YzhvOHA4aDlvOW44eS4KKy5jYTFjbworLmNhYzJvcGgKKy5jYWNvcGhvNW55CisuY2Fjb3BobzJuCisuY2E5YzhvOHA4aDlvOW44aThlOHMuCisuY2FjbzVwaG9uaQorLmNhY29waG9uMmllNAorLmNhOGw4bDllOHIuCisuY2FsMWwKKy5jYWwybGUKKy5jYThsOGw5ZThyOHMuCisuY2FsbGU0cjFzMgorLmNhOG05ZThyOGE5bThlOG4uCisuY2FtNWVyMWEKKy5jYW1lcmExbWVuCisuY2E4cjh0OXc4aDhlOGU4bC4KKy5jYXJ0dzQKKy5jYThyOHQ5dzhoOGU4ZThsOHMuCisuY2FydHdoZWUybDFzMgorLmNhOXQ4YThyOHI4aDhzLgorLmNhMnRhCisuY2F0MmEycgorLmNhdGFyMXI0CisuY2F0YXJyaDQKKy5jYXRhcnI0aDFzMgorLmNhOHQ5YTlzOHQ4cjhvOHA4aDlpOGMuCisuY2F0YXMxdDRyCisuY2F0YXN0cjJvcGgKKy5jYXRhc3Ryb3BoMWljCisuY2E4dDlhOXM4dDhyOG84cDhoOWk5YzhhOGw4bDh5LgorLmNhdGFzdHJvcGhpMWNhCisuY2F0YXN0cm9waGljYWwxbAorLmNhdGFzdHJvcGhpY2FsMWx5CisuY2E4dDllOW44bzhpOGQuCisuY2F0NGVubworLmNhdGVub2kyCisuY2F0ZW5vMmlkCisuY2E4dDllOW44bzhpOGQ4cy4KKy5jYXRlbm9pMmQxczIKKy5jYTh1OWw4aTlmOGw4bzh3OWU4ci4KKy5jYXU0bDIKKy5jYXVsMmkKKy5jYXVsaTRmNGwyCisuY2F1bGlmbG93MWVyCisuY2g4YThwOWE4cjlyOGE4bC4KKy5jaGFwMmEycjQKKy5jaGExcGEKKy5jaGFwYXIxcjQKKy5jaDhhOHI5dDhyOGU4dThzOGUuCisuY2gyYTJyCisuY2hhcnRyNGV1MgorLmNoYXJ0cmUydXM0CisuY2g4ZThtOG85dDhoOGU4cjlhOHA4eS4KKy5jaGUyCisuY2hlMW1vCisuY2hlbTRvdGgzCisuY2hlbW90aDJlCisuY2hlbW90aDRlcjFhCisuY2hlbW90aGVyYTNwCisuY2g4ZThtOG85dDhoOGU4cjlhOXA4aThlOHMuCisuY2hlbW90aGVyYXAyaWU0CisuY2g4bDhvOHI4bzltOGU4dDhoOWE4bjhlLgorLmM0aDFsNAorLmNoMmxvCisuY2hsb3JvMm1lCisuY2hsb3JvNG1ldAorLmNobG9yb21ldGhhMm40CisuY2g4bDhvOHI4bzltOGU4dDhoOWE4bjhlOHMuCisuY2hsb3JvbWV0aGExbmVzCisuY2g4bzlsOGU4czl0OGU4cjhpOGMuCisuM2NobzIKKy5jM2hvbDRlCisuY2hvbGVzMgorLmNob2xlczF0ZXIxaQorLmNpOGc5YTlyOGU4dDh0OGUuCisuYzJpZworLmNpMWdhCisuY2lnMmEycgorLmNpZ2FyZTR0M3QyCisuY2k4ZzlhOXI4ZTh0OHQ4ZThzLgorLmNpZ2FyZXQ0dGVzCisuY2k4bjhxOHU4ZTlmOG84aThsLgorLjJjaW4KKy5jaW4xcQorLmNpbnF1MgorLmNpbnF1ZTFmCisuY2lucXVlMWZvCisuY2lucXVlZm9pMgorLmNvOWE4czhzOG85YzhpOGE5dDhpOHY4ZS4KKy5jNG9hCisuY29hMnNzCisuY29hczFzbworLmNvYXNzbzFjaQorLmNvYXNzbzNjMmkxYQorLmNvYXNzb2NpNGExdDJpdgorLmNvOWc4bjhhOGMuCisuMmNvZworLmNvZzFuNGEKKy5jbzlnOG44YThjOHMuCisuY29nbmE0YzNzMgorLmNvOWs4ZThyOW44ZThsLgorLmMyb2sKKy5jb2sxZXIKKy5jb2tlcjNuZWwKKy5jbzlrOGU4cjluOGU4bDhzLgorLmNva2VybmUybDFzMgorLmNvOGw5bDhpOG45ZThhOXQ4aThvOG4uCisuY29sMWwKKy5jb2xsMmkKKy5jb2wybGluNAorLmNvbDFsNGluZQorLmNvbGxpbjNlYQorLmNvbGxpbmVhMnQKKy5jb2xsaW5lYTF0MmlvCisuY29sbGluZWF0aW8ybgorLmNvOGw5dThtOG44cy4KKy5jb2x1NG0xbgorLmNvbHVtMm4xczIKKy5jbzhtOXA4YThyOWE4bjhkLgorLmNvNG0xcAorLmNvbXBhcmE1CisuY29tMXBhCisuY29tcDJhMnIKKy5jb21wYXJhMm4KKy5jb21wYXI0YW5kCisuY284bTlwOGE4cjlhOG44ZDhzLgorLmNvbXBhcmFuMmQxczIKKy5jbzhtOXA4ZThuOWQ4aTh1OG0uCisuY29tcGVuZGkxdQorLmNvOG05cDhvOW44ZThuOHQ5dzhpOHM4ZS4KKy5jb21wbzJuCisuY29tcG8zbmVuCisuY29tcG9uZW4xdAorLmNvbXBvbmVudHc0CisuY29tcG9uZW50d2lzNAorLmNvbXBvbmVudHdpMgorLmNvbXBvbmVudDN3NGlzZQorLmNvOG04cDl0OHI4bzhsOWw4ZThyLgorLmNvbXA0dHIKKy5jb20ycDF0CisuY29tcHRyb2wxbAorLmNvbXB0cm9sMmxlCisuY284bThwOXQ4cjhvOGw5bDhlOHI4cy4KKy5jb21wdHJvbGxlNHIxczIKKy5jbzhuOWY4bzhyOG05YThiOGw4ZS4KKy5jbzJuCisuY29uM2YKKy5jb24xZm8KKy5jb25mbzJyCisuY29uZm9yMW0KKy5jb25mb3IxbWEKKy5jb25mb3IybWFiCisuY29uZm9ybWFiMmwyCisuY284bjlmOG84cjhtOWk4czh0LgorLmNvbmZvcjJtaQorLmNvbmZvcm0yaXMKKy5jbzhuOWY4bzhyOG05aThzOHQ4cy4KKy5jb25mb3JtaXM0dDFzMgorLmNvOG45ZjhvOHI4bTlpOHQ4eS4KKy5jb25mb3IzbWl0CisuY29uZm9ybWkxdHkKKy5jbzhuOWc4cjhlOHM4cy4KKy5jb24zZworLmNvbjFncgorLmNvbmdyMmUyc3MKKy5jbzhuOWc4cjhlOHM4czhlOHMuCisuY29uZ3Jlc3MxZTRzCisuY284bjl0OHI4aThiOXU4dDhlLgorLmNvbjV0CisuY29udHI0aWIKKy5jbzhuOXQ4cjhpOGI5dTh0OGU4cy4KKy5jbzhuOXQ4cjhpOGI5dTh0OGU4ZC4KKy5jb250cmlidTJ0MWVkCisuY285cjhlOWw4YTl0OGk4bzhuLgorLmNvcmUxbGEKKy5jb3JlbGExdDJpbworLmNvcmVsYXRpbzJuCisuY285cjhlOWw4YTl0OGk4bzhuOHMuCisuY29yZWxhdGlvMm4zczIKKy5jbzlyOGU5bDhpOWc4aThvOG45aThzOHQuCisuY29yZTFsMmkKKy5jb3JlbDJpZworLmNvcmVsNGlnaQorLmNvcmVsaTVnMmlvCisuY29yZWxpZ2lvbjNpCisuY29yZWxpZ2lvMm4KKy5jb3JlbGlnaW9uMWlzCisuY285cjhlOWw4aTlnOGk4bzhuOWk4czh0OHMuCisuY29yZWxpZ2lvbmlzNHQxczIKKy5jbzlyOGU5bzhwOXM4aThzLgorLmNvcmUxbworLmNvcmVvMnAxczIKKy5jb3Jlb3Axc2lzCisuY285cjhlOXM4cDhvOG45ZDhlOG44dC4KKy5jb3JlMXNwCisuY29yZXM0cG8ybgorLmNvcmVzcDJvbmQKKy5jb3Jlc3BvbjFkZQorLmNvcmVzcG9uMWRlbgorLmNvcmVzcG9uZGVuMXQKKy5jbzlyOGU5czhwOG84bjlkOGU4bjh0OHMuCisuY29yZXNwb25kZW40dDRzMgorLmNvOXM4ZTljOGE4bjh0LgorLmNvczRlCisuY29zZTFjYQorLmNvc2VjYTJuCisuY29zZWNhbjF0CisuY285dDhhOG45ZzhlOG44dC4KKy5jbzR0YTJuCisuY28xdGEKKy5jb3QyYW5nCisuY290YW4xZ2VuCisuY290YW5nZW4xdAorLmNvOHU4cjlzOGU4cy4KKy5jb3UyCisuY291NHJzMgorLmNvdXIyc2UKKy5jb3VyczNlNHMKKy5jbzl3OG84cjhrOWU4ci4KKy5jbzR3bzIKKy5jb3dvcmsxZXIKKy5jbzl3OG84cjhrOWU4cjhzLgorLmNvd29ya2U0cjFzMgorLmNyOGE4bjhrOWM4YThzOGUuCisuY3JhMm4KKy5jcmE0bmsyCisuY3JhbmsxY2EKKy5jcjhhOG44azlzOGg4YThmOHQuCisuY3JhbjRrMXMyCisuY3JhbmtzMmgKKy5jcmFua3NoYTJmCisuY3JhbmtzaGEyZnQKKy5jcjhvOGM5bzlkOGk4bDhlLgorLmNyMm9jCisuY3JvNGNvZAorLmNybzFjbworLmNyOG84YzlvOWQ4aThsOGU4cy4KKy5jcm9jb2RpbGVzMgorLmNyOG84czhzOWg4YTh0OGM4aC4KKy5jcm8yczRzCisuY3Jvc3MyaAorLmNyb3NzaGE0dGMKKy5jcm9zc2hhdDRjaAorLmNyOG84czhzOWg4YTh0OGM4aDhlOGQuCisuY3Jvc3NoYXRjaGUyCisuY3Jvc3NoYXQ0Y2g0ZWQKKy5jcjhvOHM4czlvOHY4ZThyLgorLmNyb3Mxc28KKy5jcm9zNHNvdgorLmNyOHk4cDl0OG85ZzhyOGE4bS4KKy5jcnkycDF0CisuY3J5cDF0bworLmNyeXB0bzJncgorLmNyOHk4cDl0OG85ZzhyOGE4bThzLgorLmNyeXB0b2dyYTRtMXMyCisuY3U4ZjhmOWw4aThuOGsuCisuYzR1ZgorLmN1NGYxZgorLmN1ZmY0bDIKKy5jdWZmbGluNAorLmN1ZmZsNGk0bmsyCisuY3U4ZjhmOWw4aThuOGs4cy4KKy5jdWZmbGluNGsxczIKKy5jdTluOGU4aTlmOG84cjhtLgorLjNjdW4KKy5jdTJuZQorLmN1bmVpMgorLmN1bmVpMWZvCisuY3VuZWlmbzJyCisuY3VuZWlmb3IxbQorLmN1OHM5dDhvOG05aTh6OWE5YjhsOGUuCisuMWMydXMKKy5jdXMxdG8KKy5jdXN0b20yaXoKKy5jdXN0b21pemExCisuY3VzdG9taXo1YTJiCisuY3VzdG9taXphYjJsMgorLmN1OHM5dDhvOG05aTh6OGUuCisuY3VzdG9taTJ6ZQorLmN1OHM5dDhvOG05aTh6OGU4cy4KKy5jdThzOXQ4bzhtOWk4ejhlOGQuCisuZGE4YzhoOHM5aDh1OG44ZC4KKy4xZDJhCisuZGEyY2g0CisuZGFjNGgxczIKKy5kYWNoNHMyaAorLmRhOG05czhlOGw5ZjhsOHkuCisuZGEybTIKKy5kYTRtMXMyCisuZGFtNXNlMmwyZgorLmRhbXNlbGY0bDIKKy5kYW1zZWxmMmx5NQorLmRhOG05czhlOGw5ZjhsOGk4ZThzLgorLmRhbXNlbGZsMmllNAorLmRhOGM4dDh5OGw5bzlnOHI4YThtLgorLmRhMmMxdAorLmRhYzF0eQorLmRhYzJ0eWwKKy5kYWN0eTNsbworLmRhY3R5bG8xZ3IKKy5kYThjOHQ4eThsOW85ZzhyOGE4cDhoLgorLmRhOHQ4YTliOGE4czhlLgorLjNkYXQKKy5kYTJ0YQorLmRhMnRhYgorLmRhOHQ4YTliOGE4czhlOHMuCisuZGF0YWJhczFlNHMKKy5kYTh0OGE5cDhhOHQ4aC4KKy5kYXQ1YXAKKy5kYXRhcDVhdAorLmRhdGExcGEKKy5kYXRhcDRhdGgKKy5kYTh0OGE5cDhhOHQ4aDhzLgorLmRhdGFwYTJ0NGgxczIKKy5kYTh0OGU5czh0OGE4bThwLgorLmRhdDNlc3QKKy5kYXRlczF0YQorLmRhdGVzdGE0bTFwCisuZGE4dDhlOXM4dDhhOG04cDhzLgorLmRhdGVzdGFtMnAxczIKKy5kZTljOGw4YThyOWE4YjhsOGUuCisuZGU0Y2wyYTJyCisuZGVjbGEycmFiCisuZGVjbGFyYWIybDIKKy5kZTlmOGk4bjlpOXQ4aTh2OGUuCisuZGUxZgorLmRlMWZpCisuZGUyZmluCisuZGVmMmluaQorLmRlZmluMml0CisuZGVmaW5pMXRpCisuZGVmaW5pMXQyaXYKKy5kZTlsOGU4Yzl0OGE5YjhsOGUuCisuZDVlbGVjCisuZGVsZTJjMXQKKy5kZWxlYzJ0YTRiCisuZGVsZWMxdGEKKy5kZWxlY3RhYjJsMgorLmRlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyLgorLmRlNG0yaXMKKy5kZW00aXNlCisuZGVtaXNlbWkzcXVhCisuZGVtaXNlbWlxdTIKKy5kZW1pc2VtaXF1YTV2NAorLmRlOG04aTlzOGU4bThpOXE4dThhOXY4ZThyOHMuCisuZGVtaXNlbWlxdWF2ZTRyMXMyCisuZGU5bThvOGM5cjhhOXQ4aThzOG0uCisuZGU0bW9jcgorLmRlbW9jcmF0aTJzNG0KKy5kZThtOG84cy4KKy5kZW1vczIKKy5kZTlyOGk4djlhOXQ4aTh2OGUuCisuZGVyMmk0dgorLmRlNHJpMXZhCisuZGVyaTN2YXQKKy5kZXIyaXZhMXQyaXYKKy5kZTlyOGk4djlhOXQ4aTh2OGU4cy4KKy5kZXJpdmF0aXY0ZTJzCisuZGk4YTlsOGU4Yzl0OGk4Yy4KKy4xZDRpM2EKKy5kaTJhbAorLmRpMmFsZQorLmRpYWxlMmMxdAorLmRpOGE5bDhlOGM5dDhpOGM4cy4KKy5kaWFsZWN0aTRjM3MyCisuZGk4YTlsOGU4Yzl0OGk5YzhpOGE4bi4KKy5kaWFsZWN0MmkxY2kKKy5kMmkxYWxlY3RpM2MyaTFhCisuZGlhbGVjdGljaTJhMm4KKy5kaThhOWw4ZThjOXQ4aTljOGk4YThuOHMuCisuZGlhbGVjdGljaWEybjFzMgorLmRpOWM4aDhsOG84cjhvOW04ZTh0OGg5YThuOGUuCisuZDRpMmNoCisuZGljNGgxbDQKKy5kaWNoMmxvCisuZGljaGxvcm8ybWUKKy5kaWNobG9ybzRtZXQKKy5kaWNobG9yb21ldGhhMm40CisuZGk4ZjlmOHI4YThjOHQuCisuZDFpZgorLmRpZjRmcgorLmRpNGYxZgorLmRpZmZyYTJjMXQKKy5kaThmOWY4cjhhOGM4dDhzLgorLmRpZmZyYWM0dDFzMgorLmRpOGY5ZjhyOGE4Yzl0OGk4bzhuLgorLmRpZmZyYWMxdDJpbworLmRpZmZyYWN0aW8ybgorLmRpOGY5ZjhyOGE4Yzl0OGk4bzhuOHMuCisuZGlmZnJhY3RpbzJuM3MyCisuZGk4cjhlOHIuCisuZDRpcjIKKy5kaTFyZQorLmRpcjFlcjQKKy5kaThyOGU5bjhlOHM4cy4KKy5kaXJlMW5lcworLmRpcmVuMmUyc3MKKy5kaThzOXA4YThyOWE4bjhkLgorLmRpczEKKy5kaXMxcAorLmRpMnMxcGEKKy5kaXNwMmEycgorLmRpc3BhcmEybgorLmRpc3BhcjRhbmQKKy5kaThzOXA4YThyOWE4bjhkOHMuCisuZGlzcGFyYW4yZDFzMgorLmRpOHM5dDhyOGE4dThnOGg4dDlsOHkuCisuZDRpczN0CisuZGlzdDRyCisuZGlzMXRyYQorLmRpc3RyYXVnaDMKKy5kaXN0cmF1Z2gydGwKKy5kaXN0cmF1Z2h0MWx5CisuZGk4czl0OHI4aThiOXU4dDhlLgorLmRpc3RyNGliCisuZGk4czl0OHI4aThiOXU4dDhlOHMuCisuZGk4czl0OHI4aThiOXU4dDhlOGQuCisuZGlzdHJpYnUydDFlZAorLmRvOHU5YjhsOGU5czhwOGE4YzhlLgorLmRvdTIKKy5kb3UzYjJsMgorLmRvdTVibGUxc3AKKy5kb3VibGVzMgorLmRvdWJsZTJzMXBhCisuZG91Ymxlc3BhNGNlCisuZG84dTliOGw4ZTlzOHA4YThjOWk4bjhnLgorLmRvdWJsZXNwNGEyY2kKKy5kb3VibGVzcGEyYzFpbgorLmRvdWJsZXNwYWMxaW5nCisuZG84bDhsOWk4czhoLgorLmRvbDFsCisuZG9sbDJpCisuZG9sbGlzMmgKKy5kcjhpOGY4dDlhOGc4ZS4KKy4xZHIKKy5kcjRpMmZ0CisuZHJpZjF0YQorLmRyOGk4djllOHI4cy4KKy5kcjJpdgorLmRyaXZlNHIxczIKKy5kcjhvOG05ZTlkOGE4cjh5LgorLmRybzJtZQorLmRybzJtZWQKKy5kcm9tMmUyZDJhCisuZHJvbWU0ZGFyeQorLmRyb21lZDJhMnIKKy5kcjhvOG05ZTlkOGE4cjhpOGU4cy4KKy5kcm9tZWRhcjFpCisuZHJvbWVkYXIyaWU0CisuZHU5bzhwOW85bDhpOHM4dC4KKy5kdW9wb2wyaQorLmR1OW84cDlvOWw4aThzOHQ4cy4KKy5kdW9wb2xpczR0MXMyCisuZHU5bzhwOW84bDh5LgorLmR1b3BvMmx5CisuZHk4czlsOGU4eDhpOGEuCisuZDJ5CisuZHlzMWwyCisuZHlzMmxlCisuZHlzbGV4M2kKKy5keXNsZXgyaTVhCisuZHk4czlsOGU4Yzl0OGk4Yy4KKy5keXNsZTJjMXQKKy5lYThzOHQ5ZThuOGQ5ZThyOHMuCisuZWFzdDMKKy5lYXMzdGVuCisuZWFzM3RlbmQKKy5lYXN0ZW4xZGUKKy5lYXN0ZW5kZTRyNXMyCisuZWM4bzluOG84bTlpOGM4cy4KKy5lMWNvCisuZWNvMm4KKy5lY28zbm9taWMKKy5lY29ub21pNGMzczIKKy5lYzhvOG45bzltOGk4czh0LgorLmVjb25vbTJpcworLmVjOG84bjlvOW04aThzOHQ4cy4KKy5lY29ub21pczR0MXMyCisuZWk5ZzhlOG45YzhsOGE4czhzLgorLmVpMgorLmUyaWcyCisuZWkxZ2VuCisuZWlnZW4xYzRsNAorLmVpZ2VuY2xhMnNzCisuZWk5ZzhlOG45YzhsOGE4czhzOGU4cy4KKy5laWdlbmNsYXNzMWU0cworLmVpOWc4ZThuOXY4YThsOXU4ZS4KKy5laWdlbjF2MgorLmVpZ2VuMXZhCisuZWlnZW52YWwxdQorLmVpOWc4ZThuOXY4YThsOXU4ZThzLgorLmVsOGU4Yzh0OHI4bzltOGU4YzhoOGE4bjlpOWM4YThsLgorLjVlbGVjCisuZWxlMmMxdAorLmVsZWN0cm8ybWUKKy5lbGVjdHJvbWUyY2gKKy5lbGVjdHJvbWU1Y2hhNG4xaWMKKy5lbGVjdHJvbWVjaGEybgorLmVsZWN0cm9tZWNoYW5pMWNhCisuZWw4ZThjOHQ4cjhvOW04ZThjOGg4YThuOG85YThjOG84dThzOHQ4aThjLgorLmVsZWN0cm9tZWNoYW5vNAorLmVsZWN0cm9tZWNoYW40b2EKKy5lbGVjdHJvbWVjaGFub2ExY28KKy5lbGVjdHJvbWVjaGFub2Fjb3UyCisuZWxlY3Ryb21lY2hhbm9hY28ydXMKKy5lbGVjdHJvbWVjaGFub2Fjb3VzdDJpCisuZWxlY3Ryb21lY2hhbm9hY291czF0aWMKKy5lbDhpOHQ5aThzOHQuCisuZWwyaQorLmVsMWl0CisuZWxpMXRpCisuZWw0aXRpcworLmVsOGk4dDlpOHM4dDhzLgorLmVsaXRpczR0MXMyCisuZW45dDhyOGU5cDhyOGU5bjhlOHU4ci4KKy5lbjF0CisuZW50cmVwcjIKKy5lbnRyZXByZW40ZXUKKy5lbjl0OHI4ZTlwOHI4ZTluOGU4dThyOWk4YThsLgorLmVudHJlcHJlbmV1cjJpM2EKKy5lbnRyZXByZW5ldXJpMmFsCisuZXA5aTluOGU4cDhoOXI4aThuOGUuCisuZXBpMm4KKy5lcDJpbmUKKy5lcGluZXA0aHI0CisuZXAyaW5lcGhyMmluNGUKKy5lcTh1OGk5djhhOHI4aTlhOG44dC4KKy5lcXUyaXYzCisuZXF1aTF2YQorLmVxdWl2MmEycgorLmVxdWl2YXIxaQorLmVxdWl2YXIzaTJhMm4KKy5lcXVpdmFyMmkzYQorLmVxdWl2YXI0aWFuNHQKKy5lcTh1OGk5djhhOHI4aTlhOG44YzhlLgorLmVxdWl2YXI0aWFuYworLmV0OGg5YThuOGUuCisuZXRoYTJuNAorLmV0OGg5eThsOWU4bjhlLgorLmV2OGU4cjlzOGk5YjhsOGUuCisuZXYxZXIKKy5ldmU0cjFzMgorLmV2ZXIxc2kKKy5ldmVyNHNpNGIKKy5ldmVyc2kxYjJsMgorLmV2OGU4cjh0LgorLmV2OGU4cjh0OHMuCisuZXZlcjR0MXMyCisuZXY4ZThyOHQ5ZThkLgorLmV2ZXIydDFlZAorLmV2OGU4cjh0OWk4bjhnLgorLmV2ZXIxdGkKKy5ldmVyMnQxaW4KKy5leDlxOHU4aThzOWk4dDhlLgorLmV4cXUyCisuZXhxMnVpMgorLmV4cXVpczJpdGUKKy5leDl0OHI4YTlvOHI5ZDhpOW44YThyOHkuCisuZXgxdDIKKy5leDF0cmEKKy5leHRyNGFvCisuZXh0cmFvcmQyaQorLmV4dHJhb3JkMWluNAorLmV4dHJhb3IxZGkxbmEKKy5leHRyYW9yZGluMmEycgorLmZhOGw4bDlpOG44Zy4KKy4xZmEKKy5mYWwxbAorLmZhbGwyaQorLmZhbDJsaW40CisuZmU4cjhtOGk5bzhuOHMuCisuZmVyMQorLmZlcjNtNAorLmZlcjRtMmlvCisuZmVybWlvMm4KKy5mZXJtaW8ybjNzMgorLmZpOW44aTh0OGU5bDh5LgorLjFmaQorLjJmaW4KKy5mMmluaQorLmZpbjJpdAorLmZpbjJpdGUKKy5maW5pdGUxbHkKKy5mbDhhOWc4ZThsOWw4dThtLgorLmY0bDIKKy5mbGFnNWVsMWwKKy5mbDhhOWc4ZThsOWw4YS4KKy5mbGFnNGVsbGEKKy5mbDhhOG05bThhOWI4bDhlOHMuCisuZmxhbTFtCisuZmxhbTFtYQorLmZsYW0ybWFiCisuZmxhbW1hYjJsMgorLmZsYW1tYWJsZXMyCisuZmw4ZThkOGc5bDhpOG44Zy4KKy5mbGVkZ2wyCisuZmw4bzh3OWM4aDhhOHI4dC4KKy5mbG93MmNoCisuZmxvd2NoMmEycgorLmZsOG84dzljOGg4YThyOHQ4cy4KKy5mbG93Y2hhcjR0MXMyCisuZmw4dThvOHI4bzljOGE4cjliOG84bi4KKy5mbHUzbworLmZsdW8zcgorLmZsdW9yMm9jCisuZmx1b3JvMWNhCisuZmx1b3JvYzJhMnIKKy5mbHVvcm9jYXIxYgorLmZsdW9yb2NhcmI0bworLmZsdW9yb2NhcmJvMm4KKy5mbzhyOW04aTlkOGE5YjhsOGUuCisuZm9yMm1pCisuZm9ybWkxZDRhCisuZm9ybTJpZAorLmZvcm1pMmQzYTRiCisuZm9ybWlkYWIybDIKKy5mbzhyOW04aTlkOGE5YjhsOHkuCisuZm9ybWlkYWIxbHkKKy5mbzhyOXM4eTh0OGg5aThhLgorLmZvNHJzMgorLmZvcnM0eQorLmZvcnN5dGgyaTFhCisuZm84cjh0OGg5cjhpOGc4aDh0LgorLmZvcnQ0aHI0CisuZm9ydGhyMmlnCisuZnI4ZThlOWw4bzhhOGQ4ZThyLgorLmZyZWVsNG9hCisuZnJlZWxvYTJkMworLmZyOGU4ZTlsOG84YThkOGU4cjhzLgorLmZyZWVsb2FkZTRyNXMyCisuZnI4aThlOG44ZDlsOGk4ZThyLgorLmZyaTIKKy5mcjJpZTQKKy5mcmllbmRsMmllNAorLmZyOGk5djhvOGw5aTh0OHkuCisuZnIyaXYKKy5mcml2b2wyaQorLmZyaXZvbDFpdAorLmZyaXZvbGkxdHkKKy5mcjhpOXY4bzhsOWk5dDhpOGU4cy4KKy5mcml2b2xpMXRpCisuZnJpdm9saXQyaWU0CisuZnI4aTh2OW85bDhvOHU4cy4KKy5mcml2b2xvdTIKKy5mcml2b2xvMnVzCisuZ2E5bDhhOGM5dDhpOGMuCisuZ2FsYTJjMXQKKy5nYThsOWE4eDh5LgorLmdhOGw5YTh4OWk4ZThzLgorLmdhbGF4M2kKKy5nYWxheDJpZTQKKy5nYThzOW84bTllOXQ4ZThyLgorLmdhMXNvCisuZ2Ezc29tCisuZ2FzbzJtZQorLmdhc280bWV0CisuZ2Fzb21lMXRlCisuZ2U5bzlkOGU4czlpOGMuCisuZ2VvZGVzMgorLmdlb2RlMXNpCisuZ2VvZGUyc2ljCisuZ2U5bzlkOGU4dDlpOGMuCisuZ2VvZGUxdAorLmdlb2RldDFpYworLmdlOG85bThlOHQ5cjhpOGMuCisuZ2Uzb20KKy5nZW8ybWUKKy5nZW80bWV0CisuZ2VvbTRldHIKKy5nZW81bWV0M3JpYworLmdlOG85bThlOHQ5cjhpOGM4cy4KKy5nZW9tZTR0cmk0YzNzMgorLmdlOW85czh0OHI4bzhwOGg4aThjLgorLmdlb3M0CisuZ2Vvc3Q0cgorLmdlb3N0cjJvcGgKKy5nZW9zdHJvcGgxaWMKKy5nZThvOXQ4aDhlOHI5bThhOGwuCisuZ2U0b3QKKy5nZTRvdGgKKy5nZW90aDJlCisuZ2VvdGhlcjNtNAorLmdlb3RoZXIxbWEKKy5nZTlvOHQ5cjhvOXA4aThzOG0uCisuZ2VvdHJvcGkyczFtCisuZ244bzltOG84bi4KKy5nMW5vCisuZ25vNG1vCisuZ25vNG1vMm4KKy5nbjhvOW04bzhuOHMuCisuZ25vbW8ybjNzMgorLmdyOGE4bjhkOXU4bjhjOGw4ZS4KKy4xZ3IKKy5ncmEybjIKKy5ncjRhbmQKKy5ncmFuMWR1CisuZ3JhbmR1NG4KKy5ncmFuZHVuMWM0bDQKKy5ncjhhOG44ZDl1OG44YzhsOGU4cy4KKy5ncmFuZHVuY2xlczIKKy5ncjhpOGU4djlhOG44YzhlLgorLmdyMmllNAorLmdyaWUxdmEKKy5ncmlldmEybgorLmdyOGk4ZTh2OWE4bjhjOGU4cy4KKy5ncjhpOGU4djlvOHU4cy4KKy5ncmlldm91MgorLmdyaWV2bzJ1cworLmdyOGk4ZTh2OW84dThzOWw4eS4KKy5ncmlldm91czFsMgorLmdyaWV2b3VzMWx5CisuaGE4aThyOXM4dDh5OGw4ZS4KKy5oYWkyCisuaGE0aXIKKy5oYWk0cnMyCisuaGFpcnMydHkKKy5oYWlyczJ0eWwKKy5oYThpOHI5czh0OHk4bDhlOHMuCisuaGFpcnN0eWxlczIKKy5oYThpOHI5czh0OHk4bDlpOHM4dC4KKy5oYThpOHI5czh0OHk4bDlpOHM4dDhzLgorLmhhaXJzdHlsaXM0dDFzMgorLmhhOGw4ZjlzOHA4YThjOGUuCisuaGEybGYKKy5oYWwyZjNzCisuaGFsZjJzMXBhCisuaGFsZnNwYTRjZQorLmhhOGw4ZjlzOHA4YThjOGU4cy4KKy5oYThsOGY5dzhhOHkuCisuaGE4cjliOGk4bjlnOGU4ci4KKy5oMmEycgorLmhhcjFiCisuaGFyYmkyCisuaGFyMmJpbgorLmhhcmI0aW5nZQorLmhhOHI5YjhpOG45ZzhlOHI4cy4KKy5oYXJiaW5nZTRyMXMyCisuaGE4cjlsOGU5cTh1OGk4bi4KKy5oYXI0bGU0CisuaGFyMWwKKy5oYXJsZTFxCisuaGFybGVxdTIKKy5oYXJsZXEydWkyCisuaGFybGVxdWk0bgorLmhhOHI5bDhlOXE4dThpOG44cy4KKy5oYXJsZXF1MmkybjFzMgorLmhhOHQ4YzhoOWU4cjhpOGU4cy4KKy5oYTR0YworLmhhdDRjaAorLmhhdGNoZTIKKy5oYXRjaGVyMWkKKy5oYXRjaGVyMmllNAorLmhlOG04aTlkOGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHIuCisuaGVtMmlkCisuaGVtaWQ0ZW0KKy5oZW1pZGU0bTJpcworLmhlbWlkZW00aXNlCisuaGVtaWRlbWlzZW1pM3F1YQorLmhlbWlkZW1pc2VtaXF1MgorLmhlbWlkZW1pc2VtaXF1YTV2NAorLmhlOG04aTlkOGU4bThpOXM4ZThtOGk5cTh1OGE5djhlOHI4cy4KKy5oZW1pZGVtaXNlbWlxdWF2ZTRyMXMyCisuaGU5bThvOWc4bDhvOWI4aThuLgorLmhlbW80ZworLmhlMW1vCisuaGVtbzRnbDIKKy5oZW1vM2dsbworLmhlbW9nbG8xYmkKKy5oZW1vZ2xvMmJpbgorLmhlOW04bzlwOGg4aThsOWk4YS4KKy5oZW0yb3BoCisuaGVtb3BoNGlsMgorLmhlbW9waGlsMWkKKy5oZW1vcGhpbDNpMWEKKy5oZTltOG85cDhoOGk4bDlpOGE4Yy4KKy5oZTltOG85cDhoOGk4bDlpOGE4YzhzLgorLmhlbW9waGlsaWE0YzNzMgorLmhlOG04bzlyOGg4ZTlvOGw5bzhnOHkuCisuaGVtbzJyCisuaGVtb3JoNAorLmhlbW9yaGUzb2wKKy5oZW1vcmhlb2wxbzFneQorLmhlOXA4YTh0OWk4Yy4KKy5oZXA1CisuaGUycGEKKy5oZXBhdDFpYworLmhlOHI5bThhOHA4aDlyOG85ZDhpOHQ4ZS4KKy5oZXIzbTQKKy5oZXIxbWEKKy5oZXI0bWFwCisuaGVybWFwNGhyNAorLmhlcm1hcGhyb2QyaXRlCisuaGU4cjltOGE4cDhoOXI4bzlkOGk4dDlpOGMuCisuaGVybWFwaHJvZDJpMXRpCisuaGVybWFwaHJvZDRpMnRpYworLmhlOXI4bzhlOHMuCisuaGVybzRlCisuaGU4eDhhOWQ4ZThjOWk5bThhOGwuCisuaGV4MWEKKy5oZXhhMmQKKy5oZXhhZGUxYzJpCisuaGV4YWRlMmMzaW0KKy5oZXhhZGVjaTFtYQorLmhvOWw4bzluOG85bTh5LgorLmhvbG8ybgorLmhvbG9uM28zbXkKKy5obzltOGU4bzltOG84cjlwOGg4aThjLgorLmhvMm1lMworLmhvbWVvMW1vCisuaG9tZW9tbzJyCisuaG9tZW9tb3IxcAorLmhvbWVvbW9ycDRoNAorLmhvbWVvbW9ycGgxaWMKKy5obzltOGU4bzltOG84cjlwOGg4aThzOG0uCisuaG9tZW9tb3JwaGkyczFtCisuaG85bThvOXQ4aDhlOHQ4aThjLgorLmhvMW1vCisuaG9tNG90aDMKKy5ob21vdGgyZQorLmhvbW8zdGhlNHQKKy5ob21vdGhldDFpYworLmhvOHI4czhlOXI4YThkOWk4czhoLgorLmhvcjRzZQorLmhvNHJzMgorLmhvcnNlcjFhCisuaG9yc2VyYTJkCisuaG9yc2VyMmFkaQorLmhvcnNlcmFkaXMxCisuaG9yc2VyYWRpczJoCisuaG84dDliOGU4ZC4KKy5obzJ0MWIKKy5ob3Q0YmUyZAorLmhvOHQ5YjhlOGQ4cy4KKy5ob3RiZTJkMXMyCisuaHk5ZDhyOG85dDhoOGU4cjltOGE4bC4KKy5oeTFkCisuaHkxZHIKKy5oeWRybzR0aDJlCisuaHlkcjRvdGgKKy5oeWRyb3RoZXIzbTQKKy5oeWRyb3RoZXIxbWEKKy5oeTlwOG85dDhoOGE4bDlhOW04dThzLgorLmh5M3BvCisuaHlwNG90CisuaHlwNG90aAorLmh5cG90aGEzbGEKKy5oeXBvdGhhbGEzbQorLmh5cG90aGFsYTFtdQorLmh5cG90aGFsYW0ydXMKKy5pZDhlOGE4bDhzLgorLmlkZTNhNGwKKy5pZGVhMmwxczIKKy5pZDhlOG85ZzhyOGE4cDhoOHMuCisuaWRlbzJnCisuaWRlbzFncgorLmlkZW9ncmE0cDRoMXMyCisuaWQ4aThvOXM4eThuOWM4cjhhOHM4eS4KKy5pMmRpCisuaTFkM2lvCisuaWRpNG9zCisuaWRpb3M0eQorLmlkaW9zeW4xY3IKKy5pZGlvc3luY3IyYXMKKy5pZGlvc3luY3JhczR5CisuaWQ4aThvOXM4eThuOWM4cjhhOXM4aThlOHMuCisuaWRpb3N5bmNyYXMyaWU0CisuaWQ4aThvOXM4eThuOWM4cjhhOHQ4aThjLgorLmlkaW9zeW41Y3JhdDFpYworLmlkOGk4bzlzOHk4bjljOHI4YTh0OWk5YzhhOGw5bDh5LgorLmlkaW9zeW5jcmF0aTFjYQorLmlkaW9zeW5jcmF0aWNhbDFsCisuaWRpb3N5bmNyYXRpY2FsMWx5CisuaWc5bjhpOHQ5ZThyLgorLjJpZworLmlnMW5pCisuaWduMml0CisuaWduMml0ZQorLmlnOW44aTh0OWU4cjhzLgorLmlnbml0ZTRyMXMyCisuaWc5bjhpOXQ4bzhyLgorLmlnbjNpdG9yCisuaWduaTF0bworLmlnOG44bzhyOGU5czhwOGE4YzhlOHMuCisuaWcxbm8KKy5pZ25vcmUxc3AKKy5pZ25vcmUyczFwYQorLmlnbm9yZXNwYTRjZQorLmltOXA4ZThkOWE4bjhjOGUuCisuaW0ycDJlZAorLmltcDJlMmQyYQorLmltcGVkYTJuCisuaW05cDhlOGQ5YThuOGM4ZThzLgorLmluOWQ4dTliOGk5dDhhOWI4bDhlLgorLjRpbmQKKy5pbjFkdQorLmluZHUxYjRpCisuaW5kdWJpMnQKKy5pbmR1YmkxdGEKKy5pbmR1YmkydGFiCisuaW5kdWJpdGFiMmwyCisuaW45ZjhpOG45aTh0OGU5bDh5LgorLmluM2YKKy5pbjFmaQorLmluMmZpbgorLmluZjJpbmkKKy5pbmZpbjJpdAorLmluZmluMml0ZQorLmluZmluaXRlMWx5CisuaW45ZjhpOG45aTl0OGU4czlpOW04YThsLgorLmluZmluaXQ0ZXMKKy5pbmZpbml0ZTFzaQorLmluZmluaXRlMnM1aW0KKy5pbmZpbml0ZXNpMW1hCisuaW45ZjhyOGE5czh0OHI4dThjOXQ4dThyOGUuCisuaW5mcjJhcworLmluZnJhczF0NHIKKy5pbmZyYXN0cnUyYzF0CisuaW5mcmFzdHJ1Y3R1NHIKKy5pbmZyYXN0cnVjMXR1CisuaW5mcmFzdHJ1YzN0dXJlCisuaW45ZjhyOGE5czh0OHI4dThjOXQ4dThyOGU4cy4KKy5pbjlzOHQ4YThsOGw5ZThyLgorLmluczJ0YTJsCisuaW5zMXRhCisuaW5zdGFsMWwKKy5pbnN0YWwybGUKKy5pbjlzOHQ4YThsOGw5ZThyOHMuCisuaW5zdGFsbGU0cjFzMgorLmluOXQ4ZThyOWQ4aThzOWM4aTlwOGw4aTluOGE4cjh5LgorLmluMXQKKy5pbjV0ZXIzZAorLmludGVyZDJpCisuaW50ZXJkaXMxCisuaW50ZXJkMmlzMWMKKy5pbnRlcmRpczFjaQorLmludGVyZGlzYzJpcAorLmludGVyZGlzY2kxcDJsMgorLmludGVyZGlzY2lwbGk0bgorLmludGVyZGlzY2lwbDRpMW5hCisuaW50ZXJkaXNjaXBsaW4yYTJyCisuaW45dDhlOHI5ZzhhOWw4YThjOXQ4aThjLgorLmludGVyZzIKKy5pbnRlcjFnYQorLmludGVyZ2FsYTJjMXQKKy5pbjl1OHQ4aThsOGUuCisuaW4xdQorLmluNHUxdDJpCisuaW45dTh0OGk4bDlpOXQ4eS4KKy5pbnV0aWwxaQorLmludXQyaWwxaXQKKy5pbnV0aWxpMXR5CisuaXI5cjhlOWQ4dThjOWk4YjhsOGUuCisuaXIycjJlZAorLmlycmUxZHUKKy5pcnJlZHUyYworLmlycmVkdWNpNGIKKy5pcnJlZHUxY2kKKy5pcnJlZHVjaTFiMmwyCisuaXI5cjhlOWQ4dThjOWk4YjhsOHkuCisuaXJyZWR1Y2liMWx5CisuaXI5cjhlOHY5bzljOGE5YjhsOGUuCisuaXJyZXYyCisuaXJyZTV2b2MKKy5pcnJldm8xY2EKKy5pcnJldm9jYTFiMmwyCisuaXM4bzh0OXI4bzhwOHkuCisuaTJzbworLmlzb3Ryb3B5NQorLmlzOG85dDhyOG84cDlpOGMuCisuaXNvdHJvcDNpYworLml0OGk4bjllOHI5YThyOHkuCisuaTF0aQorLmkydDFpbgorLml0MmluZQorLml0aW40ZXI0YTJyCisuaXRpbjFlcgorLml0aW5lcjFhCisuaXQ4aThuOWU4cjlhOHI5aThlOHMuCisuaXRpbmVyYXIxaQorLml0aW5lcmFyMmllNAorLmplOXI4ZTltOGk5YThkOHMuCisuMWplCisuamVyZW0yaTNhCisuamVyZW1pYTJkCisuamVyZW1pYTJkMXMyCisua2U4eTluOG84dDhlLgorLmtlOHk5bjhvOHQ4ZThzLgorLmtleW5vNHRlcworLmtlOHk5czh0OHI4bzhrOGUuCisua2V5czQKKy5rZXlzMXQKKy5rZXlzdDRyCisua2V5c3RyMm9rMgorLmtlOHk5czh0OHI4bzhrOGU4cy4KKy5rZXlzdHJva2VzNAorLmtpOGw4bjlpOG44Zy4KKy5rMWkKKy5rNGkybDFuMgorLmtpbG4xaW4KKy5raWxuaW40ZworLmxhOGM5aTllOHM4dC4KKy5sNGEyY2k0CisubGEzYzJpZTQKKy5sYWNpMWVzdAorLmxhOG05ZThuOXQ4YTliOGw4ZS4KKy5sYTFtZW4KKy5sYTNtZW4xdAorLmxhbWVuMnRhNGIKKy5sYW1lbjF0YQorLmxhbWVudGFiMmwyCisubGE4bjhkOXM4YzhhOHA5ZThyLgorLjNsNGFuZAorLmxhMm4KKy5sYW4yZDFzMgorLmxhbmRzY2E0cAorLmxhbmRzMWNhCisubGFuZHNjYTVwZXIKKy5sYThuOGQ5czhjOGE4cDllOHI4cy4KKy5sYW5kc2NhcGU0cjFzMgorLmxhOHI5YzhlOW44eS4KKy5sMmEycgorLmxhcjFjCisubGFyMmNlCisubGFyMWNlbjQKKy5sYThyOWM4ZTluOWk4czh0LgorLmxhcjRjZW5pCisubGU4YThmOWg4bzhwOXA4ZThyLgorLmxlMmEKKy5sZWEyZgorLmxlYTRmaAorLmxlYWZobzRwMXAKKy5sZWFmaG9wMnBlCisubGVhZmhvcDNwZXIKKy5sZThhOGY5aDhvOHA5cDhlOHI4cy4KKy5sZWFmaG9wcGU0cjFzMgorLmxlOHQ5dDhlOHI5czhwOGE4YzlpOG44Zy4KKy5sZTR0M3QyCisubGV0dGU0cjFzMgorLmxldHRlcjFzcAorLmxldHRlcjJzMXBhCisubGV0dGVyc3A0YTJjaQorLmxldHRlcnNwYTJjMWluCisubGV0dGVyc3BhYzFpbmcKKy5saThmOGU5czhwOGE4bi4KKy5saWZlMXNwCisubGlmZTJzMXBhCisubGlmZXNwYTRuCisubGk4ZjhlOXM4cDhhOG44cy4KKy5saWZlc3BhMm4xczIKKy5saThmOGU5czh0OHk4bDhlLgorLmxpZmVzMnR5CisubGlmZXMydHlsCisubGk4ZjhlOXM4dDh5OGw4ZThzLgorLmxpZmVzdHlsZXMyCisubGk4ZzhoOHQ5dzhlOGk4ZzhoOHQuCisuM2xpZ2gKKy5saWdodHc0CisubGlnaHR3ZWkyCisubDJpZ2h0d2UyaWcyCisubGk4bTlvOHU5czhpOG44ZThzLgorLmxpNG1vCisubGkzbW8ydXMKKy5saW1vdTIKKy5saW1vdTJzMWluCisubGltb3VzMmluZQorLmxpbW91c2kxbmVzCisubGk4bjhlOWI4YThjOGs4ZThyLgorLjFsNGluZQorLmxpbjJlMmIKKy5saW5lYmFjazEKKy5saW5lYmFjazFlcgorLmxpOG44ZTlzOHA4YThjOGk4bjhnLgorLmxpMW5lcworLmxpNG5lMXNwCisubGluZTJzMXBhCisubGluZXNwNGEyY2kKKy5saW5lc3BhMmMxaW4KKy5saW5lc3BhYzFpbmcKKy5saTlvOG45ZThzOHMuCisubGlvMm4KKy5saW8xbmVzCisubGlvbjJlMnNzCisubGk4dDhoOW85ZzhyOGE4cDhoOGU4ZC4KKy5sMml0aAorLmxpdGhvNGcKKy5saXRobzFncgorLmxpdGhvZ3JhcGg0ZWQKKy5saTh0OGg5bzlnOHI4YThwOGg4cy4KKy5saXRob2dyYTRwNGgxczIKKy5sbzliOG84dDlvOG04eS4KKy5sb2JvNHRvCisubG9ib3RvM215CisubG85YjhvOHQ5bzhtOWk4ejhlLgorLmxvYm90b20yaXoKKy5sb2JvdG9taTJ6ZQorLmxvOGc4ZThzLgorLmxvMWdlCisubG84bjhnOWU4czh0LgorLjVsb25nCisubG8ybgorLmxvOXE4dThhOGM5aTh0OHkuCisubG8xcQorLmxvcXUyCisubG9xdWFjNAorLmxvcXU0YTJjaQorLmxvcXVhMmMxaXQKKy5sb3F1YWNpMXR5CisubG84djhlOXM4dDhyOHU4YzhrLgorLjRsb3YKKy5sb3Y0ZTJzCisubG92MmVzdDRyCisubG92ZXN0cnVjNQorLmxvdmVzdHJ1Y2sxCisubWE4YzhyOG85ZThjOG85bjhvOG04aThjOHMuCisubWFjcm80ZQorLm1hY3JvZTFjbworLm1hY3JvZWNvMm4KKy5tYWNyb2VjbzNub21pYworLm1hY3JvZWNvbm9taTRjM3MyCisubWE4bDlhOXA4cjhvOHA5aThzOG0uCisubWFsYXByMgorLm1hbGFwcm9waTJzMW0KKy5tYThsOWE5cDhyOG84cDlpOHM4bThzLgorLm1hbGFwcm9wNGlzNG0xczIKKy5tYThuOXM4bDhhOHU4ZzhoOXQ4ZThyLgorLm1hMm4xczIKKy5tYW4yczFsMgorLm1hbnNsYXVnaDMKKy5tYThuOXU5czhjOHI4aThwOHQuCisubWFuMnVzCisubWFudXNjMgorLm1hbnVzY3JpMgorLm1hbnVzY3IyaXAKKy5tYW51c2NyaTJwMXQKKy5tYThyOWc4aThuOWE4bC4KKy5tYXJnMgorLm1hcmdpNG4KKy5tYXJnaTFuYQorLm1hOHQ4aDllOW04YTl0OGk5YzhpOGE4bi4KKy5tNGF0aDMKKy5tYXRoNWVtCisubWF0aDJlCisuMW1hdGhlMW1hCisubWF0aGVtYXQxaWMKKy5tYXRoZW1hdDJpMWNpCisubWF0aGVtYXRpM2MyaTFhCisubWF0aGVtYXRpY2kyYTJuCisubWE4dDhoOWU5bThhOXQ4aTljOGk4YThuOHMuCisubWF0aGVtYXRpY2lhMm4xczIKKy5tYTh0OHQ4ZThzLgorLm1hdDV0ZQorLm1hNHQzdDIKKy5tYXQ0dGVzCisubWU4ZDlpOGM5YThpOGQuCisuMm1lZAorLm00ZWRpCisubWVkM2kxY2EKKy5tZWRpY2FpMgorLm1lZGljYTJpZAorLm1lOGQ4aTlvOGM4cjhlLgorLm1lMWQyaW8KKy5tZWRpb2NyZTMKKy5tZThkOGk5bzhjOXI4aTl0OGk4ZThzLgorLm1lZGk1b2NyaXQKKy5tZWRpb2NyaTIKKy5tZWRpbzVjcmkxdGkKKy5tZWRpb2NyaXQyaWU0CisubWU4ZzhhOWw4aTh0OGguCisubWUyZworLm00ZWdhbAorLm1lMWdhCisubWUzZ2FsMWkKKy5tZWdhbDFpdAorLm1lZ2FsMml0aAorLm1lOGc4YTlsOGk4dDhoOHMuCisubWVnYWxpMnQ0aDFzMgorLm1lOHQ4YTliOG84bDlpOGMuCisubWU0dGEKKy5tZTJ0YTRiCisubWV0YWJvbDNpYworLm1ldGFib2wyaQorLm1lOXQ4YThiOW85bDhpOHM4bS4KKy5tZXRhYm9saTJzMW0KKy5tZTl0OGE4YjlvOWw4aThzOG04cy4KKy5tZXRhYm9sNGlzNG0xczIKKy5tZTl0OGE4YjlvOWw4aTh0OGUuCisubWV0YWJvNWwyaXRlCisubWV0YWJvbDFpdAorLm1lOXQ4YThiOW85bDhpOHQ4ZThzLgorLm1ldGFib2xpdDRlcworLm1lOHQ4YTlsOGE4bjlnOHU4YThnOGUuCisubWV0M2EybAorLm1ldGE1bGEKKy5tZXRhbGEybgorLm1ldGFsMmFuZworLm1ldGFsYW4xZ3UKKy5tZXRhbGFuZ3U0YQorLm1lOHQ4YTlsOGE4bjlnOHU4YThnOGU4cy4KKy5tZTh0OGE5cDhoOG84cjlpOGMuCisubWV0YXBobzRyCisubWU4dDhoOWE4bjhlLgorLm1ldGhhMm40CisubWU5dDhyOG84cDlvOWw4aThzLgorLm00ZXRyCisubWV0cm9wb2wyaQorLm1lOXQ4cjhvOHA5bzlsOGk4czhlOHMuCisubWV0cm9wb2w0aXNlCisubWV0cm9wb2xpczFlNHMKKy5tZTh0OXI4bzlwOG84bDlpOXQ4YThuLgorLm1ldHJvcG9sMWl0CisubWV0cm9wb2xpM3RhMm4KKy5tZXRyb3BvbGkxdGEKKy5tZTh0OXI4bzlwOG84bDlpOXQ4YThuOHMuCisubWV0cm9wb2xpdGEybjFzMgorLm1pOGM4cjhvOWU4YzhvOW44bzhtOGk4YzhzLgorLm00aTFjcgorLm1pY3JvNGUKKy5taWNyb2UxY28KKy5taWNyb2VjbzJuCisubWljcm9lY28zbm9taWMKKy5taWNyb2Vjb25vbWk0YzNzMgorLm1pOWM4cjhvOWY4aThjOGg4ZS4KKy5taWNybzJmaQorLm1pY3JvZjRpMmNoCisubWljcm9maWNoZTIKKy5taTljOHI4bzlmOGk4YzhoOGU4cy4KKy5taWNyb2ZpY2gxZXMKKy5taThjOHI4bzlvOHI4ZzhhOG45aThzOG0uCisubWljcm9vMgorLm1pY3Jvb3JnMgorLm1pY3Jvb3IxZ2EKKy5taWNyb29yZ2FuNWlzCisubWljcm9vcmdhMm4KKy5taWNyb29yZ2FuaTJzMW0KKy5taThjOHI4bzlvOHI4ZzhhOG45aThzOG04cy4KKy5taWNyb29yZ2FuNGlzNG0xczIKKy5taThsOGw5YThnOGUuCisubTRpbDFsCisubWk4bDlsOGk5bDhpOHQ4ZThyLgorLm1pbGwyaQorLm1pbDRsNGk0bAorLm1pbGxpbDFpCisubWlsbDJpbDFpdAorLm1pbGxpbDJpdGUKKy5taThtOGU4bzlnOHI4YThwOGg4ZThkLgorLm1pbWVvMmcKKy5taW1lbzFncgorLm1pbWVvZ3JhcGg0ZWQKKy5taThtOGU4bzlnOHI4YThwOGg4cy4KKy5taW1lb2dyYTRwNGgxczIKKy5taThtOWk4YzlyOGk4ZThzLgorLm1pbTFpCisubWltNGkxY3IKKy5taW1pY3JpMgorLm1pbWljcjJpZTQKKy5taThuOWk4cy4KKy5tMmluaQorLm1pbjFpcworLm1pOG44aTlzOHk4bTlwOG85czhpOHU4bS4KKy5taW5pczR5CisubWluaXN5NG0xcAorLm1pbmlzeW0xcG9zCisubWluaXN5bXBvNXNpNHUKKy5taThuOGk5czh5OG05cDhvOXM4aThhLgorLm1pbmlzeW1wb3MyaTFhCisubWk5bjh1OHQ5ZThyLgorLm00aW4xdQorLm1pOW44dTh0OWU4czh0LgorLm1pOHM5YzhoOGk4ZTl2OG84dThzOWw4eS4KKy5tMmlzMWMKKy5taXMzY2gyCisubWlzY2gyaWU0CisubWlzY2hpZXZvdTIKKy5taXNjaGlldm8ydXMKKy5taXNjaGlldm91czFsMgorLm1pc2NoaWV2b3VzMWx5CisubWk5czhlOHI4cy4KKy5tNGlzZQorLm1pczNlcgorLm1pc2U0cjFzMgorLm1pOXM4bzhnOWE5bTh5LgorLm1pMnNvCisubWlzbzFnYQorLm1pc28yZ2FtCisubW84ZDllOGw5bDhpOG44Zy4KKy5tbzJkMQorLm1vZGVsMWwKKy5tb2RlbGwyaQorLm1vZGVsMmxpbjQKKy5tbzhsOWU5Yzh1OGw4ZS4KKy5tb2xlMWN1CisubW9sZTRjdWwKKy5tb2xlY3VsNGUKKy5tbzhsOWU5Yzh1OGw4ZThzLgorLm1vbGVjdWxlczIKKy5tbzhuOWE4cjhjOGg4cy4KKy5tbzFuMWEKKy5tb25hcjNjCisubW9uMmEycgorLm1vbmFyMmNoCisubW9uYXJjNGgxczIKKy5tbzhuOGU4eTlsOGU4bjlkOGU4ci4KKy5tb25leWxlbjFkZQorLm1vOG44ZTh5OWw4ZThuOWQ4ZThyOHMuCisubW9uZXlsZW5kZTRyNXMyCisubW84bjhvOWM4aDhyOG84bThlLgorLm1vbm8yY2g0CisubW9ub2M0aHI0CisubW9ub2Nocm8ybWUKKy5tbzhuOG85ZThuOWU4cjlnOGU4dDhpOGMuCisubW8zbm9lCisubW9ub2VuMWVyCisubW9ub2VuZXJnMgorLm1vbm9lbmVyM2dldAorLm1vbm9lbmVyZ2V0MWljCisubW84bjlvOGk4ZC4KKy5tb25vaTIKKy5tb25vMmlkCisubW84bjhvOXA4bzhsOGUuCisubW80bm9wCisubW84bjhvOXA4bzhsOGU4cy4KKy5tb25vcG9sZXMyCisubW85bjhvOHA5bzhsOHkuCisubW9ub3BvMmx5CisubW84bjhvOXM4cDhsOGk4bjhlLgorLm1vbm9zMXAybDIKKy5tb25vc3BsaTRuCisubW9ub3NwMWw0aW5lCisubW84bjhvOXM4cDhsOGk4bjhlOHMuCisubW9ub3NwbGkxbmVzCisubW84bjhvOXM4dDhyOG84ZjhpOGMuCisubW9ub3M1dAorLm1vbm9zdDRyCisubW9ub3N0cm8yZmkKKy5tbzluOG84dDlvOW44aThlOHMuCisubW9ubzF0bworLm1vMm5vdG8ybgorLm1vbm90b24yaWU0CisubW85bjhvOHQ5bzluOG84dThzLgorLm1vbm80dG9ubworLm1vbm90bzFub3UyCisubW9ub3Rvbm8ydXMKKy5tbzlyOG84bjlpOHM4bS4KKy5tb3JvNW40aXMKKy5tb3JvMm4KKy5tb3JvbmkyczFtCisubW84czlxOHU4aTl0OG8uCisubW9zMgorLm1vc3F1MgorLm1vc3EydWkyCisubW9zcXVpMXRvCisubW84czlxOHU4aTl0OG84cy4KKy5tb3NxdWl0b3MyCisubW84czlxOHU4aTl0OG84ZThzLgorLm11OGQ5cjhvOG84bS4KKy5tdTFkcgorLm11ZDFyb29tCisubXVkcm9vMgorLm11OGQ5cjhvOG84bThzLgorLm11ZHJvbzRtMXMyCisubXU4bDl0OGk5ZjhhOGM5ZTh0OGU4ZC4KKy41bXU0bHQKKy5tdWwxdGkzCisubXVsdGlmMgorLm11bHRpMWZhCisubXVsdGlmYTRjZQorLm11bHRpZmFjZXQ0CisubXVsdGlmYWNlMnQxZWQKKy5tdThsOXQ4aTlwOGw4aThjOWE4YjhsOGUuCisubXVsdDJpcAorLm11bHRpMXAybDIKKy5tdWx0aXBsaTFjYQorLm11bHRpcGxpY2ExYjJsMgorLm11OGw4dDhpOXU4czhlOHIuCisubXVsdGk0dQorLm11bHRpMnVzCisubmU4bzlmOGk4ZThsOGQ4cy4KKy4zbmVvCisubmU1b2YKKy5uZW8yZmkKKy5uZW9mMmllNAorLm5lb2ZpZTJsZDMKKy5uZW9maWVsMmQxczIKKy5uZThvOW44YTh6OGkuCisubmVvMm4KKy5uZW8xbjFhCisubmVvbmEyejFpCisubmU4bzluOGE4ejhpOHMuCisubmVvbmF6NGlzCisubmU4cDhoOWU4dzhzLgorLm5lcGhlNAorLm5lOHA4aDlyOGk4dDhlLgorLm5lcDRocjQKKy5uZXBocjJpdGUKKy5uZThwOGg5cjhpOHQ4aThjLgorLm5lcGhyNGkydDNpYworLm5lcGhyaTF0aQorLm5lOHc5ZThzOHQuCisubmU0dworLm5ld2VzdDMKKy5uZTh3OHM5bDhlOHQ5dDhlOHIuCisubmV3czRsMgorLm5ld3MybGUKKy5uZXdzbGU0dDN0MgorLm5lOHc4czlsOGU4dDl0OGU4cjhzLgorLm5ld3NsZXR0ZTRyMXMyCisubmk4dDhyOG85bThlOHQ4aDlhOG44ZS4KKy5uMml0CisubmkzdHIKKy5uaXRybzJtZQorLm5pdHJvNG1ldAorLm5pdHJvbWV0aGEybjQKKy5ubzluOGE4bThlLgorLm5vNG4KKy5ubzFuMWEKKy5ubzhuOWE4cjlpOHQ4aDltOGU4dDlpOGMuCisubm9uYXIzaQorLm5vbjJhMnIKKy5ub25hcjJpdGgKKy5ub25hcml0NGgxbQorLm5vbmFyaXRobWV0NAorLm5vbmFyaXRobWV0MWljCisubm84bjllOG04ZThyOWc4ZThuOGM4eS4KKy5ub25lMW1lCisubm9uZW1lcmcyCisubm9uZW1lcjFnZW4KKy5ub25lbWVyZ2VuMWN5Cisubm84bjllOHE4dThpOXY4YThyOGk5YThuOGM4ZS4KKy5ub25lMnEKKy5ub25lcXUyCisubm9uZXEydWkyCisubm9uZXF1Mml2MworLm5vbmVxdWkxdmEKKy5ub25lcXVpdjJhMnIKKy5ub25lcXVpdmFyMWkKKy5ub25lcXVpdmFyM2kyYTJuCisubm9uZXF1aXZhcjJpM2EKKy5ub25lcXVpdmFyNGlhbmMKKy5ubzhuOGU5dDhoOGU5bDhlOHM4cy4KKy5ub25ldGgyZQorLm5vbmV0aGUxbGVzMgorLm5vbmV0aGUzbDJlMnNzCisubm84bjllOHU4YzhsOGk4ZDllOGE4bi4KKy5ub240ZXUKKy5ub25ldTFjNGw0Cisubm9uZXVjbDJpZAorLm5vbmV1Y2xpZGVhMm4KKy5ubzhuOWk4czhvOW04bzhyOXA4aDhpOGMuCisubm9uNWkKKy5ub24xaXMKKy5ub25pMnNvCisubm9uaTNzb20KKy5ub25pc28xbW8KKy5ub25pc29tbzJyCisubm9uaXNvbW9yMXAKKy5ub25pc29tb3JwNGg0Cisubm9uaXNvbW9ycGgxaWMKKy5ubzhuOXA4czhlOHU4ZDhvOWM4bzhtOXA4YThjOHQuCisubm9uMXA0Cisubm9uMnAxczIKKy5ub25wMnNlCisubm9ucHM0ZXUKKy5ub25wc2V1MWRvCisubm9ucHNldWRvMWNvCisubm9ucHNldWRvY280bTFwCisubm9ucHNldWRvY29tMXBhCisubm9ucHNldWRvY29tcGEyYzR0Cisubm84bjlzOG04bzhvOHQ4aC4KKy5ubzJuM3MyCisubm9uMnMzbQorLm5vbnMxbW8KKy5ub25zbW9vMgorLm5vbnNtbzRvdGgKKy5ubzhuOXU4bjhpOWY4bzhyOG0uCisubm8zbnU0bgorLm5vbnUxbmkKKy5ub251bmkxZm8KKy5ub251bmlmbzJyCisubm9udW5pZm9yMW0KKy5ubzhuOXU4bjhpOWY4bzhyOG05bDh5LgorLm5vbnVuaWZvcjRtMWwKKy5ub251bmlmb3JtMWx5Cisubm84cjllOHA5aTluOGU4cDhoOXI4aThuOGUuCisubm9yZTVwaTJuCisubm9yZXAyaW5lCisubm9yZXBpbmVwNGhyNAorLm5vcmVwMmluZXBocjJpbjRlCisubm84dDl3OGk4dDhoOXM4dDhhOG44ZDlpOG44Zy4KKy5ub3R3NAorLm5vdHdpMgorLm5vdHcyaXRoMworLm5vdHdpMnQ0aDFzMgorLm5vdHdpdGg1c3Q0YW5kCisubm90d2l0aHMxdGEKKy5ub3R3aXRoc3RhMm4KKy5ub3R3aXRoc3RhbmQxaW4KKy5udTljOGw4ZThvOXQ4aThkOGUuCisubnVjbGUzCisubnUxYzRsNAorLm51Y2xlNG90CisubnVjbGVvdDJpZAorLm51OWM4bDhlOG85dDhpOGQ4ZThzLgorLm51Y2xlb3RpZGU0czIKKy5udTh0OWM4cjhhOGM4azllOHIuCisubnU0dGMKKy5udXRjcmFjazEKKy5udXRjcmFjazFlcgorLm51OHQ5YzhyOGE4YzhrOWU4cjhzLgorLm51dGNyYWNrZTRyMXMyCisub2U4cjlzOHQ4ZThkOHMuCisubzNlcgorLm9lNHIxczIKKy5vZXJzNHQxZWQKKy5vZXJzdGUyZDFzMgorLm9mOGY5bDhpOG44ZS4KKy5vNGYxZgorLm9mZjRsMgorLm9mZmxpbjQKKy5vZmYxbDRpbmUKKy5vZjhmOWw4bzhhOGQuCisub2ZmbDRvYQorLm9mZmxvYTJkMworLm9mOGY5bDhvOGE4ZDhzLgorLm9mZmxvYTJkMXMyCisub2Y4ZjlsOG84YThkOGU4ZC4KKy5vZmZsb2EyZDFlZAorLm9sOGk5ZzhvOHA5bzlsOGk4czh0LgorLm9sMmkKKy5vbDJpZworLm9saTJnbworLm9sMmlnb3BvbDJpCisub2w4aTlnOG84cDlvOWw4aThzOHQ4cy4KKy5vbGlnb3BvbGlzNHQxczIKKy5vbDhpOWc4bzhwOW84bDh5LgorLm9saWdvcG8ybHkKKy5vbDhpOWc4bzhwOW84bDlpOGU4cy4KKy5vbGlnb3BvbDJpZTQKKy5vcDllOHI5YThuOGQuCisub3AxZXIKKy4zb3BlcjFhCisub3A0ZXI0YW5kCisub3BlcmEybgorLm9wOWU4cjlhOG44ZDhzLgorLm9wZXJhbjJkMXMyCisub3I4YThuOGc5dTh0OGE4bi4KKy5vcmEybgorLm9yMmFuZworLm9yYW4xZ3UKKy5vcmFuNGd1NHQKKy5vcmFuZ3UxdGEKKy5vcmEybmd1dGEybgorLm9yOGE4bjhnOXU4dDhhOG44cy4KKy5vcmFuZ3V0YTJuMXMyCisub3I5dDhoOG85ZDhvOG45dDhpOHM4dC4KKy5vcnRobzJkbzQKKy5vcnRob2RvMm4KKy5vcnRob2RvbjN0NGkKKy5vcnRob2RvbjF0Cisub3I5dDhoOG85ZDhvOG45dDhpOHM4dDhzLgorLm9ydGhvZG9udGlzNHQxczIKKy5vcjl0OGg4bzlrOGU4cjlhOXQ4bzhsOW84Zzh5LgorLm9ydGgyb2sKKy5vcnRob2sxZXIKKy5vcnRob2tlcjFhCisub3J0aG9rZXJhMXRvCisub3J0aG9rZXJhdG9sMW8xZ3kKKy5vcjh0OGg4bzluOGk4dDhyOG85dDhvOGw4dThlOG44ZS4KKy5vcnRobzJuCisub3J0aG9uMml0Cisub3J0aG9uaTN0cgorLm9ydGhvbml0cm8xdG8KKy5vcnRob25pdHJvdG9sdTNlbgorLm9ydGhvbml0cm90b2x1NGVuZQorLm92OGU4cjl2OGk4ZTh3LgorLm92ZXJ2MmllNAorLm92OGU4cjl2OGk4ZTh3OHMuCisub3g5aThkOWk4Yy4KKy5veDNpCisub3hpNWRpCisub3gyaWQKKy5wYThkOWQ4aThuOGcuCisuMXBhCisucDRhMmQKKy5wYWQ0ZDFpbgorLnBhZDFkNAorLnBhOGk4bjlsOGU4czhzOWw4eS4KKy5wNGFpMgorLnBhNGk0bjQKKy5wYTRpNG4xbAorLnBhaW5sZXMyCisucGFpbjNsMmUyc3MKKy5wYWlubGVzNHMxbDIKKy5wYWlubGVzczFseQorLnBhOGw5ZTh0OHQ4ZS4KKy5wNGFsCisucDJhbGUKKy5wYWxlNHQzdDIKKy5wYThsOWU4dDh0OGU4cy4KKy5wYWxldDR0ZXMKKy5wYThyOWE5YjhvOGw4YS4KKy5wMmEycgorLnBhMnJhYgorLnBhcmFibzFsYQorLnBhOHI5YTliOG84bDlpOGMuCisucGFyYWJvbDNpYworLnBhcmFib2wyaQorLnBhOXI4YThiOW85bDhvOGk4ZC4KKy5wYXJhYm9sb2kyCisucGFyYWJvbG8yaWQKKy5wYThyOWE5ZDhpOGc4bS4KKy5wYXJhMmQKKy5wYXIyYWRpCisucGFyYWQyaWcKKy5wYXJhZGlnMW0KKy5wYThyOWE5ZDhpOGc4bThzLgorLnBhcmFkaWc0bTFzMgorLnBhOHI4YTljOGg4dTh0OGUuCisucGFyYTJjaAorLnBhcmFjaHU0dAorLnBhOHI4YTljOGg4dTh0OGU4cy4KKy5wYThyOGE5ZDhpOW04ZTh0OGg4eThsOWI4ZThuOHo4ZThuOGUuCisucGFyYWQ0aW1ldAorLnBhcmFkaW1ldGh5MmwxYgorLnBhcmFkaW1ldGh5bGI0ZTRuM3oKKy5wYXJhZGltZXRoeWxiZW4yemUKKy5wYXJhZGltZXRoeWxiZW56ZTRuCisucGE4cjhhOWY4bDh1OG84cjhvOXQ4bzhsOHU4ZThuOGUuCisucGFyYTJmCisucGFyYWY0bDIKKy5wYXJhZmx1M28KKy5wYXJhZmx1bzNyCisucGFyYWZsdW9ybzF0bworLnBhcmFmbHVvcm90b2x1M2VuCisucGFyYWZsdW9yb3RvbHU0ZW5lCisucGE4cjhhOWc4cjhhOHA4aDllOHIuCisucGFyYTFncgorLnBhcmFnNXJhM3BoNGVyCisucGE4cjhhOWw4ZTlnOGE4bC4KKy5wYXIzYWwKKy5wYXIyYWxlCisucGFyYWw0ZWdhbAorLnBhcmFsZTFnYQorLnBhOHI5YThsOWw4ZThsOWk4czhtLgorLnBhcmFsMWwKKy5wYXJhbDJsZQorLnBhcmFsM2xlbAorLnBhcmFsbGVsMmkKKy5wYXJhbGxlMmxpcworLnBhcmFsbGVsaTJzMW0KKy5wYThyOGE5bThhOGc5bjhlOHQ5aThzOG0uCisucGFyNGExbWEKKy5wYXJhbTNhZworLnBhcmE1bWFnMW4KKy5wYXJhbWFnbmV0aTJzNG0KKy5wYThyOGE5bThlOGQ4aThjLgorLnBhcmEybWVkCisucGFyYW00ZWRpCisucGE4cjhhOW04ZTh0OGg4eThsOWE4bjhpOHM4bzhsOGUuCisucGFyYW0zZXQKKy5wYXJhbWV0aHkzbGEKKy5wYXJhbWV0aHlsYTJuCisucGFyYW1ldGh5bGFuaTJzbworLnBhOXI4YThtOWU5dDhyOGk4ejhlLgorLnBhcmFtNGV0cgorLnBhcmFtZXRyaTJ6ZQorLnBhOHI4YTltOGk4bDlpOXQ4YThyOHkuCisucGFyMmFtaQorLnBhcmFtaWwxaQorLnBhcmFtMmlsMWl0CisucGFyYW1pbGkxdGEKKy5wYXJhbWlsaXQyYTJyCisucGE4cjhhOW04bzh1OG44dC4KKy5wYXJhMm1vCisucGFyYW1vdTIKKy5wYXJhbW91bjF0CisucGE4dDhoOW85ZzhlOG45aThjLgorLnA0YXRoCisucGF0NGhvCisucGF0aG80ZworLnBhdGhvMWdlNAorLnBhdGhvMWdlbgorLnBlOGU4djlpOHM4aC4KKy5wNGVlCisucGVlMXZpCisucGVldmlzMmgKKy5wZThlOHY5aThzOGg5bjhlOHM4cy4KKy5wZWV2aXMyaDFuCisucGVldmlzaDFuZXMKKy5wZWV2aXNobjJlMnNzCisucGU4bjl0OGE5ZzhvOG4uCisucGVuMXQKKy5wZW4xdGEKKy5wZW50YTJnbworLnBlbnRhZ28ybjIKKy5wZThuOXQ4YTlnOG84bjhzLgorLnBlbnRhZ28ybjNzMgorLnBlOXQ4cjhvOWw4ZTl1OG0uCisucGV0cm9sNGV1CisucGg4ZTluOG84bTllOW44bzhuLgorLnBoNGUzbm8KKy5waGUybgorLnBoZW5vMm1lCisucGhlbm8xbWVuCisucGhlbm9tNGVubworLnBoZW5vbWVubzRuCisucGg4ZThuOHk4bDlhOGw4YTluOGk4bjhlLgorLnBoZW55M2xhCisucGhlbnlsYWxhMm4KKy5waGVueWxhbGE1bjJpbmUKKy5waGVueWxhbGFuMWluCisucGg4aTlsOGE4dDllOWw4aThzOHQuCisucGhpNGxhdGVsMmk0CisucGhpbGF0ZTJsaXMKKy5waDhpOWw4YTh0OWU5bDhpOHM4dDhzLgorLnBoaWxhdGVsaXM0dDFzMgorLnBoOG85bjhlOG04ZS4KKy4zcGhvbmUKKy5waG8ybgorLnBob25lMW1lCisucGg4bzluOGU4bThlOHMuCisucGhvbmUybWVzCisucGg4bzluOGU5bThpOGMuCisucGhvbmU1bWkKKy5waDhvOHM5cDhoOG84cjlpOGMuCisucGhvczFwCisucGhvc3BobzUKKy5waG9zcGhvNHIKKy5waDhvOXQ4bzlnOHI4YThwOGg4cy4KKy5waG8xdG8KKy5waG90bzJncgorLnBob3RvZ3JhNHA0aDFzMgorLnBoOG85dDhvOW84ZjhmOXM4ZTh0LgorLnBob3RvbzIKKy5waG90b280ZjFmCisucGhvdG9vZjJmM3MKKy5waThjOWE5ZDhvOHIuCisucGkxY2EKKy5waWNhMmQKKy5waWNhMWRvCisucGljYWQ0b3IKKy5waThjOWE5ZDhvOHI4cy4KKy5waWNhZG80cnMyCisucGk4cDhlOWw4aThuOGUuCisucDJpcAorLnBpcGU0CisucGlwZWwyaQorLnBpcGUxbDRpbmUKKy5waThwOGU5bDhpOG44ZThzLgorLnBpcGVsaTFuZXMKKy5waThwOGU5bDhpOG45aThuOGcuCisucGlwZWwyaW4zaQorLnBpcGVsaW4xaW4KKy5waXBlbGluaW40ZworLnBpOXI4YTluOGg4YThzLgorLnA0aXIKKy5waTFyYQorLnBpcmEybgorLnBpcmE0bjFoNAorLnBpcmFuaGE0CisucGw4YThjOGE5YjhsOGUuCisuMXAybDIKKy5wbGExY2EKKy5wbGFjYTFiMmwyCisucGw4YThuOHQ5aDhvOHA5cDhlOHIuCisuM3BsYTJuCisucGxhbjF0CisucGxhbnRobzRwMXAKKy5wbGFudGhvcDJwZQorLnBsYW50aG9wM3BlcgorLnBsOGE4bjh0OWg4bzhwOXA4ZThyOHMuCisucGxhbnRob3BwZTRyMXMyCisucGw4ZThhOHM5YThuOGM4ZS4KKy5wbGUyYQorLnBsZWFzYTIKKy5wbGVhM3NhbmMKKy5wbGVhc2EybgorLnBsOHU4ZzlpOG4uCisucGx1ZzVpbgorLnBsOHU4ZzlpOG44cy4KKy5wbHU1ZzRpMm4xczIKKy5wbzhsOXQ4ZThyOWc4ZThpOHM4dC4KKy5wbzRsMnQKKy5wb2wxdGUKKy5wb2x0ZXJnMgorLnBvbHRlcmdlaTIKKy5wbzhsOHk5ZThuOGUuCisucG8ybHkKKy5wbzhsOHk5ZTh0OGg5eThsOWU4bjhlLgorLnBvbHllNHQKKy5wbzlsOHk4ZzlhOW04aThzOHQuCisucG9seTFnYQorLnBvbHkyZ2FtCisucG9seWdhbTJpcworLnBvOWw4eThnOWE5bThpOHM4dDhzLgorLnBvbHlnYW1pczR0MXMyCisucG84bDh5OGc5bzhuOWk5ejhhOXQ4aThvOG4uCisucG9seTFnbworLnBvbHlnbzJuMgorLnBvbHlnbzNuaQorLnBvbHlnb25pemExCisucG9seWdvbml6YTF0MmlvCisucG9seWdvbml6YXRpbzJuCisucG85bDh5OHA4aDlvOW44bzh1OHMuCisucG9seXBobzJuCisucG9seXBobzFub3UyCisucG9seXBob25vMnVzCisucG84bDh5OXM4dDh5OHI4ZThuOGUuCisucG8ybHlzNAorLnBvbHlzMXQKKy5wb2x5czJ0eQorLnBvOG04ZTlnOHI4YThuOWE4dDhlLgorLnBvMm1lCisucG9tZTJnCisucG9tZTFncgorLnBvbWVncmEybjIKKy5wb21lZ3JhMW5hCisucG9tZWdyYW4yYXQKKy5wbzhyOG85ZThsOGE4czl0OGk4Yy4KKy4xcDRvcgorLnBvcm80ZQorLnBvcm80ZWwKKy5wb3JvZTFsYQorLnBvcm9lbGFzdDJpCisucG9yb2VsYXMxdGljCisucG84cjlvOHU4cy4KKy5wb3JvdTIKKy5wb3JvMnVzCisucG84cjl0OGE5YjhsOGUuCisucG9yMXRhCisucG9yMnRhYgorLnBvcnRhYjJsMgorLnBvOHM4dDlhOG05YjhsOGUuCisuMXBvcworLnBvczJ0YQorLnBvc3RhNG0xYgorLnBvc3RhbWIybDIKKy5wbzhzOHQ5YThtOWI4bDhlOHMuCisucG9zdGFtYmxlczIKKy5wbzhzOHQ5aDh1OW04bzh1OHMuCisucG9zdGh1MW1vCisucG9zdGh1M21vMnVzCisucG9zdGh1bW91MgorLnBvOHM4dDlzOGM4cjhpOHA4dC4KKy5wb3M0dDFzMgorLnBvc3Q0c2MKKy5wb3N0c2NyaTIKKy5wb3N0c2NyMmlwCisucG9zdHNjcmkycDF0CisucG84czh0OXM4YzhyOGk4cDh0OHMuCisucG9zdHNjcmlwNHQxczIKKy5wbzhzOXQ4dThyOWE4bC4KKy5wb3MxdHUKKy5wb3N0dTFyYQorLnByOGU5YThtOWI4bDhlLgorLnByZWE0bTFiCisucHJlYW1iMmwyCisucHI4ZTlhOG05YjhsOGU4cy4KKy5wcmVhbWJsZXMyCisucHI4ZTlsOG84YThkOGU4ZC4KKy5wcmVsNG9hCisucHJlbG9hMmQzCisucHJlbG9hMmQxZWQKKy5wcjhlOXA4YThyOWk4bjhnLgorLnByZTJwYQorLnByZXA0YTRyMWkKKy5wcmVwMmEycgorLnByZXBhcmluNGcKKy5wcjhlOXA4cjhpOG44dC4KKy5wcjJlcHIyCisucHJlcHJpbjR0MworLnByOGU5cDhyOGk4bjh0OHMuCisucHJlcHJpbjR0NHMyCisucHI4ZTlwOHI4bzhjOGU4czlzOG84ci4KKy5wcmUzcHJvCisucHJlcHIyb2MKKy5wcmVwcm8xY2UKKy5wcmVwcm9jMmUyc3MKKy5wcmVwcm9jZXMxc28KKy5wcjhlOXA4cjhvOGM4ZThzOXM4bzhyOHMuCisucHJlcHJvY2Vzc280cnMyCisucHI4ZTlzOHA4bDhpOHQ5dDhpOG44Zy4KKy5wcmUxc3AKKy5wcmVzMXAybDIKKy5wcmVzcGwxaXQKKy5wcmVzcGw0aTR0M3QyCisucHJlc3BsaXQydDFpbgorLnByOGU5dzhyOGE4cC4KKy5wcmV3cmE0CisucHI4ZTl3OHI4YThwOHA4ZThkLgorLnByZXdyYTRwMXAKKy5wcmV3cmFwMnBlCisucHJld3JhcDRwMmVkCisucHI4aThlOHM4dDllOHM4czhlOHMuCisuNXByMmk0ZTQKKy5wcmkxZXN0CisucHJpZXM0dDJlMnNzCisucHJpZXN0ZXNzMWU0cworLnByOGU4dDl0OHk5cDhyOGk4bjl0OGU4ci4KKy5wcmU0dDN0MgorLnByZXQxdHkKKy5wcjJldHR5cHIyCisucHJldHR5cHJpbjR0MworLnByOGU4dDl0OHk5cDhyOGk4bjl0OGk4bjhnLgorLnByZXR0eXByaW50MmkKKy5wcmV0dHlwcmluNHQzaW5nCisucHJldHR5cHJpbjJ0MWluCisucHI4bzljOGU5ZDh1OHI5YThsLgorLnByMm9jCisucHJvMWNlCisucHJvY2UxZHUKKy5wcm9jZWR1MXJhCisucHI4bzhjOGU4czhzLgorLnByb2MyZTJzcworLnByOG85Yzh1OHI5YThuOGM4ZS4KKy5wcm9jdTFyYQorLnByb2N1cmEybgorLnByOG84ZzllOW44aThlOHMuCisucHJvMWdlCisucHJvMWdlbgorLnByb2dlNW4yaWU0CisucHI4bzhnOWU5bjh5LgorLnBybzRnZW55CisucHI4bzlnOHI4YThtOW04YThiOGw4ZS4KKy5wcm8xZ3IKKy5wcm9ncmFtMW0KKy5wcm9ncmFtMW1hCisucHJvZ3JhbTJtYWIKKy5wcm9ncmFtbWFiMmwyCisucHI4bzhtOWk5bjhlOG44dC4KKy5wcm9tNGkKKy5wcm9tMWluCisucHJvbTJpbmUKKy5wcm9taTFuZW4KKy5wcm9taW5lbjF0CisucHI4bzltOGk4czljOHU5bzh1OHMuCisucHJvbTJpcworLnByb20yaXMxYworLnByb21pczFjdQorLnByb21pc2N1MW91MgorLnByb21pc2N1bzJ1cworLnByOG84bTlpOHM5czhvOHI4eS4KKy5wcm9tNGkyczFzCisucHJvbWlzMXNvCisucHJvbWlzc28xcnkKKy5wcjhvOG05aThzOGUuCisucHJvbTRpc2UKKy5wcjhvOG05aThzOGU4cy4KKy5wcm9taXMxZTRzCisucHI4bzlwOGU4bDlsOGU4ci4KKy5wcm8zcGVsCisucHJvcGVsMWwKKy5wcm9wZWwybGUKKy5wcjhvOXA4ZThsOWw4ZThyOHMuCisucHJvcGVsbGU0cjFzMgorLnByOG85cDhlOGw5bDhpOG44Zy4KKy5wcm9wZWxsMmkKKy5wcm9wZWwybGluNAorLnByOG85aDhpOGI5aTl0OGk4djhlLgorLnBybzFoMgorLnByb2hpYmkydAorLnByb2hpYmkxdGkKKy5wcm9oaWJpMXQyaXYKKy5wcjhvOWg4aThiOWk5dDhpOHY4ZTlsOHkuCisucHJvaGliaXRpdjRlMWx5CisucHI4bzlzOGM4aTh1OHQ5dDhvLgorLnByb3MyYworLnByb3MxY2kKKy5wcm9zY2kxdQorLnByb3NjaXU0dDN0MgorLnByb3NjaXV0NXRvCisucHI4bzl0OGU4czh0OWU4ci4KKy5wcm8xdAorLnBybzR0ZXMKKy5wcjhvOXQ4ZThzOHQ5ZThyOHMuCisucHJvdGVzdGU0cjFzMgorLnByOG85dDhlOHM5dDhvOHIuCisucHJvdDRlczJ0bworLnByOG85dDhlOHM5dDhvOHI4cy4KKy5wcm90ZXN0bzRyczIKKy5wcjhvOXQ4bzlsOGE4bjlnOHU4YThnOGUuCisucHJvMXRvCisucHJvdG8xbGEKKy5wcm90bzRsYTJuCisucHJvdG9sMmFuZworLnByb3RvbGFuMWd1CisucHJvdG9sYW5ndTRhCisucHI4bzl0OG85dDh5OHA5YThsLgorLnByb3RvMXR5CisucHJvdG90eTFwYQorLnByb3RvdHlwNGFsCisucHI4bzh2OWk4bjhjOGUuCisucHJvdjFpbgorLnByb3YyaW5jCisucHI4bzh2OWk4bjhjOGU4cy4KKy5wcjhvOXY4aThuOWM4aThhOGwuCisucHJvdmluMWNpCisucHJvdmluM2MyaTFhCisucHJvdmluY2kyYWwKKy5wcjhvOHc5ZThzOHMuCisucHJvdzJlMnNzCisucHM4ZTh1OWQ4bzlkOGk4ZjlmOGU4cjllOG45dDhpOGE4bC4KKy4ycDFzMgorLnAyc2UKKy5wczRldQorLnBzZXUxZG8KKy5wc2V1ZG9kMWlmCisucHNldWRvZGk0ZjFmCisucHNldWRvZGlmZmVyMQorLnBzZXVkb2RpZmZlcjNlbjF0CisucHNldWRvZGlmZmVyZW50MmkKKy5wc2V1ZG9kaWZmZXJlbjF0MmkxYQorLnBzZXVkb2RpZmZlcmVudGkyYWwKKy5wczhlOHU5ZDhvOWY4aTluOGk4dDhlLgorLnBzZXUyZDVvZgorLnBzZXVkbzJmaQorLnBzZXVkbzJmaW4KKy5wc2V1ZG9mMmluaQorLnBzZXVkb2ZpbjJpdAorLnBzZXVkb2ZpbjJpdGUKKy5wczhlOHU5ZDhvOWY4aTluOGk4dDhlOWw4eS4KKy5wc2V1ZG9maW5pdGUxbHkKKy5wczhlOHU5ZDhvOWY4bzhyOGM4ZThzLgorLnBzZXVkbzFmbworLnBzZXVkb2ZvMnIKKy5wc2V1ZG9mb3IxYworLnBzZXVkb2ZvcjJjZQorLnBzOGU4dTlkOG84ZzlyOGE5cDhoOGU4ci4KKy5wc2V1ZDRvZworLnBzZXVkbzFncgorLnBzZXVkb2c1cmEzcGg0ZXIKKy5wczhlOHU5ZDhvOWc4cjhvOHU4cC4KKy5wc2V1ZG80ZzRybworLnBzZXVkb2dyb3UyCisucHM4ZTh1OWQ4bzlnOHI4bzh1OHA4cy4KKy5wc2V1ZG9ncm91MnAxczIKKy5wczhlOHU5ZDhvOW44eThtLgorLnBzZXU0ZG8ybgorLnBzZXVkb255bTQKKy5wczhlOHU5ZDhvOW44eThtOHMuCisucHNldWRvbnk0bTFzMgorLnBzOGU4dTlkOG85dzhvOHI4ZC4KKy5wc2V1ZG80d28yCisucHM4ZTh1OWQ4bzl3OG84cjhkOHMuCisucHNldWRvd29yMmQxczIKKy5wczh5OWM4aDhlOWQ4ZThsOWk4Yy4KKy5wczR5CisucDRzeTFjCisucHN5M2NoCisucHN5Y2g0ZTIKKy5wc3k0Y2g0ZWQKKy5wc3ljaGVkZWwyaQorLnBzOHk4YzhoOHMuCisucHN5YzRoMXMyCisucHU5YjhlOHM5YzhlOG44YzhlLgorLnB1YjMKKy5wdWI0ZQorLnB1NGJlczQKKy5wdWJlczJjCisucHViZXMxY2VuCisucHViZXMzY2VuYworLnF1OGE4ZDlkOGk4bjhnLgorLnF1MgorLnF1YTJkCisucXVhZDRkMWluCisucXVhZDFkNAorLnF1OGE5ZDhyOGE4dDlpOGMuCisucXVhMWRyCisucXVhZHJhdDFpYworLnF1OGE5ZDhyOGE4dDlpOGM4cy4KKy5xdWFkcmF0aTRjM3MyCisucXU4YThkOXI4YTl0OHU4cjhlLgorLnF1YWRyYTJ0dQorLnF1YWRyYTN0dXJlCisucXU4YThkOXI4aTlwOGw4ZThnOWk4Yy4KKy5xdWFkcmkycDJsMgorLnF1YWRyMmlwCisucXVhZHJpcGxlZzRpYworLnF1OGE4aThuOHQ5ZThyLgorLnF1YWkyCisucXVhNGk0bgorLnF1YWluMXQKKy5xdThhOGk4bjh0OWU4czh0LgorLnF1OGE5czhpOWU4cTh1OGk4djlhOWw4ZThuOGM4ZS4KKy5xdWFzMmllNAorLnF1YXNpZTFxCisucXUyYXNpZXF1MgorLnF1YXNpZXEydWkyCisucXVhc2llcXUyaXYzCisucXVhc2llcXVpMXZhCisucXVhc2llcXVpdjJhbGUKKy5xdWFzaWVxdWl2YTNsZW5jCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44YzhlOHMuCisucXU4YTlzOGk5ZThxOHU4aTh2OWE5bDhlOG44dC4KKy5xdWFzaWVxdWl2YTFsZW4xdAorLnF1OGE5czhpOWg4eTlwOG85bjhvOHI5bThhOGwuCisucXVhc2kzaAorLnF1YXNpaHkzcG8KKy5xdWFzaWh5cG8ybgorLnF1YXNpaHlwb25vcjFtCisucXVhc2loeXBvbm9yMW1hCisucXU4YTlzOGk5cjhhOGQ5aTljOGE4bC4KKy5xdWFzNGkycgorLnF1YXNpMXI1YQorLnF1YXNpcmEyZAorLnF1YXNpcjJhZGkKKy5xdWFzaXJhZDNpMWNhCisucXU4YTlzOGk5cjhlOHM4aThkOXU4YThsLgorLnF1YXNpNHJlcworLnF1YXNpcmUxc2kKKy5xdWFzaXJlMnMyaWQKKy5xdWFzaXJlc2kyZHUKKy5xdWFzaXJlc2lkMXUxYQorLnF1OGE5czhpOXM4bThvOG84dDhoLgorLnF1YTFzaXMKKy5xdWFzaTJzMW0KKy5xdWFzaXMxbW8KKy5xdWFzaXNtb28yCisucXVhc2lzbW80b3RoCisucXU4YTlzOGk5czh0OGE5dDhpOG84bjlhOHI4eS4KKy5xdWFzaXMxdGEKKy5xdWFzaXN0YXRpb241YTJyCisucXVhc2lzdGExdDJpbworLnF1YXNpc3RhdGlvMm4KKy5xdWFzaXN0YXRpbzFuMWEKKy5xdThhOXM4aTl0OG84cDhvOHMuCisucXU1YTVzaTR0CisucXVhc2kxdG8KKy5xdWFzaXRvMXBvcworLnF1OGE5czhpOXQ4cjhpOWE4bjlnOHU5bDhhOHIuCisucXVhc2k1dHIyaTNhCisucXVhc2l0cmkyYTJuCisucXVhc2l0cmkyYW5nCisucXVhc2l0cmlhbjFndQorLnF1YXNpdHJpYW5ndTFsYQorLnF1YXNpdHJpYW5ndWwyYTJyCisucXU4YTlzOGk5dDhyOGk4djlpOGE4bC4KKy5xdWFzaXRyMmk0dgorLnF1YXNpdHJpdjNpCisucXVhc2l0cml2MmkxYQorLnF1YXNpdHJpdmkyYWwKKy5xdThpOG45dDhlOHM5czhlOG44YzhlLgorLnEydWkyCisucXVpNG4KKy5xdWluMXQKKy5xdWluNHQyZTJzcworLnF1aW50ZXM0c2VuYworLnF1OGk4bjl0OGU4czlzOGU4bjhjOGU4cy4KKy5xdThpOG45dDhlOHM5czhlOG45dDhpOGE4bC4KKy5xdWludGVzc2VuMXQKKy5xdWludGVzc2VudDJpCisucXVpbnRlc3NlbjF0MmkxYQorLnF1aW50ZXNzZW50aTJhbAorLnJhOGI5YjhpOHQ5cjh5LgorLjJyYWIKKy5yYTJiMWIKKy5yYWJiaTJ0CisucmFiYmkzdHIKKy5yYWJiaXQ1cnkKKy5yYTlkOGk5bzhnOXI4YTlwOGg4eS4KKy5yYTJkCisucjJhZGkKKy5yYTNkMmlvCisucmFkaW81ZworLnJhZGlvMmdyCisucmFkaW80ZzNyYTFwaHkKKy5yYThmOGY5aThzOGguCisucmFmNWZpCisucmEyZgorLnJhNGYxZjQKKy5yYWYyZjVpcworLnJhZmZpczJoCisucmE4ZjhmOWk4czhoOWw4eS4KKy5yYWZmaXM0aDFsNAorLnJhZmZpc2gxbHkKKy5yYThtOXM4aDhhOGM4azhsOGUuCisucmE0bTFzMgorLnJhbTRzMmgKKy5yYW1zaGFjazEKKy5yYW1zaGFjazFsCisucmE4djllOG45bzh1OHMuCisucmF2NGU0bm8KKy5yYXZlMW5vdTIKKy5yYXZlbm8ydXMKKy5yZTlhOHI4cjhhOG44ZzhlOW04ZThuOHQuCisucmU1YXIxcjQKKy5yZTJhMnIKKy5yZWFycmFuNGdlCisucmVhcnJhMm4KKy5yZWFycjJhbmcKKy5yZWFycmFuZ2UxbWUKKy5yZWFycmFuZ2UxbWVuCisucmVhcnJhbmdlM21lbjF0CisucmU5YThyOHI4YThuOGc4ZTltOGU4bjh0OHMuCisucmVhcnJhbmdlbWVuNHQ0czIKKy5yZThjOWk5cDhyOG84YzlpOXQ4aThlOHMuCisucmVjaXByb2NpMXRpCisucmVjaXByb2NpdDJpZTQKKy5yZThjOXQ4YThuOWc4bDhlLgorLnJlYzR0YTJuCisucmUyYzF0CisucmVjdDVhbmcKKy5yZWMxdGEKKy5yZWN0YW4xZ2wyCisucmVjdGFuMWdsZQorLnJlOGM5dDhhOG45ZzhsOGU4cy4KKy5yZWN0YW5nbGVzMgorLnJlOGM5dDhhOG45Zzh1OWw4YThyLgorLnJlY3RhbjFndQorLnJlY3Rhbmd1MWxhCisucmVjdGFuZ3VsMmEycgorLnJlOWQ4aTlyOGU4Yzh0LgorLjJyMmVkCisucjRlZGkKKy5yZWQ0aXIyCisucmVkaTFyZQorLnJlZGlyZTJjMXQKKy5yZTlkOGk5cjhlOGM4dDlpOG84bi4KKy5yZWRpcmVjMXQyaW8KKy5yZWRpcmVjdGlvMm4KKy5yZTlkOHU4YzlpOGI4bDhlLgorLnJlMWR1CisucmVkdTJjCisucmVkdWNpNGIKKy5yZWR1MWNpCisucmVkdWNpMWIybDIKKy5yZTllOGM4aDhvLgorLnJlZTJjCisucmVlMmNoCisucmVlM2NobzIKKy5yZTlwOGg4cjhhOHM4ZS4KKy5yZXA0aHI0CisucmVwaHIyYXMKKy5yZTlwOGg4cjhhOHM4ZThzLgorLnJlcGhyYXMxZTRzCisucmU5cDhoOHI4YThzOGU4ZC4KKy5yZXBocmE0czRlZAorLnJlOXA4bzlzOGk5dDhpOG84bi4KKy5yZTRwb3NpCisucmUxcG8KKy5yZTFwb3MKKy5yZXBvM3MyaTF0MmlvCisucmVwb3NpMXRpCisucmVwb3NpdGlvMm4KKy5yZTlwOG85czhpOXQ4aThvOG44cy4KKy5yZXBvc2l0aW8ybjNzMgorLnJlOXA4cjhpOG44dC4KKy5yZXByMgorLnJlcHJpbjR0MworLnJlOXA4cjhpOG44dDhzLgorLnJlcHJpbjR0NHMyCisucmU5czh0OG84cjlhOGI4bDhlLgorLnI0ZXMydG8KKy5yZXN0bzJyYQorLnJlc3RvMnJhYgorLnJlc3RvcmFiMmwyCisucmU4dDhyOG85ZjhpOHQuCisucmV0cm8yZmkKKy5yZTh0OHI4bzlmOGk4dDl0OGU4ZC4KKy5yZXRyb2Y0aTR0NHQyCisucmV0cm9maXQydDFlZAorLnJlOXU4czlhOGI4bDhlLgorLnI0ZXUyCisucmUydXM0CisucmV1c2EyCisucmV1MnMxYWIKKy5yZXVzYWIybDIKKy5yZTl1OHM4ZS4KKy5yZTl3OGk4cjhlLgorLnJld2kyCisucmV3NGlyNAorLnJlOXc4cjhhOHAuCisucmV3cmE0CisucmU5dzhyOGE4cDhwOGU4ZC4KKy5yZXdyYTRwMXAKKy5yZXdyYXAycGUKKy5yZXdyYXA0cDJlZAorLnJlOXc4cjhpOHQ4ZS4KKy5yZXdyaTQKKy5yZXdyMml0ZQorLnJoOGk5bjhvOGM5ZThyOW84cy4KKy5yaDQKKy5yaDJpMW5vCisucmhpNG5vNGMKKy5yaGlubzFjZQorLnJoaW5vYzJlcm8KKy5yaThnOGg4dDllOG84dThzLgorLnJpZ2gxdGVvCisucmlnaHRlb3UyCisucmlnaHRlbzJ1cworLnJpOGc4aDh0OWU4bzh1OHM5bjhlOHM4cy4KKy5yaWdodGVvdXMxbjQKKy5yaWdodGVvdXMxbmVzCisucmlnaHRlb3VzbjJlMnNzCisucmk4bjhnOWw4ZThhOGQ4ZThyLgorLnJpbjRnCisucmluZ2wyCisucmluMWdsZQorLnJpbmdsZTJhCisucmluZ2xlYTJkMQorLnJpOG44ZzlsOGU4YThkOGU4cjhzLgorLnJpbmdsZWFkZTRyNXMyCisucm85YjhvOHQuCisucm85YjhvOHQ4cy4KKy5yb2JvNHQxczIKKy5ybzliOG84dDhpOGMuCisucm85YjhvOHQ5aThjOHMuCisucm9ib3RpNGMzczIKKy5ybzh1OG44ZDl0OGE4YjhsOGUuCisucm91MgorLnJvdW4yZAorLnJvdW5kMXRhCisucm91bmQydGFiCisucm91bmR0YWIybDIKKy5ybzh1OG44ZDl0OGE4YjhsOGU4cy4KKy5yb3VuZHRhNWJsZXMyCisuc2E4bDhlOHM5YzhsOGU4cjhrLgorLnNhMgorLnMyYWxlCisuc2FsZXMyCisuc2FsZXMyYworLnNhbGVzY2xlNQorLnNhbGVzMWM0bDQKKy5zYThsOGU4czljOGw4ZThyOGs4cy4KKy5zYWxlc2NsZXI0azFzMgorLnNhOGw4ZThzOXc4bzhtOGE4bi4KKy5zYWxlczR3MgorLnNhbGU0czF3bzIKKy5zYWxlc3dvbTEKKy5zYWxlc3dvMW1hCisuc2FsZXN3b21hMm4KKy5zYThsOGU4czl3OG84bThlOG4uCisuc2FsZXN3bzJtZQorLnNhbGVzd28xbWVuCisuc2E4bDltOG85bjhlOGw5bDhhLgorLnM0YTJsNG0KKy5zYWxtbzJuNAorLnNhbDFtbworLnNhbG1vbjRlbGxhCisuc2FsbW9uZWwxbAorLnNhOGw5dDhhOXQ4aThvOG4uCisuc2E0bDR0Cisuc2FsMXRhCisuc2FsdGExdDJpbworLnNhbHRhdGlvMm4KKy5zYThyOXM4YTlwOGE4cjlpOGw5bDhhLgorLnMyYTJyCisuc2EycjRzYTIKKy5zYTRyczIKKy5zYXJzMWFwCisuczJhMnJzYXAyYTJyNAorLnNhcnNhMXBhCisuc2Fyc2FwNGE0cjFpCisuc2Fyc2FwYXJpbDFsCisuc2E4dThlOHI5azhyOGE4dTh0LgorLnNhdTQKKy5zYXVlcmtyYXU0dAorLnNjOGE4dDlvOWw4bzhnOWk5YzhhOGwuCisuczFjYQorLnNjYTF0bworLnNjYXRvM2xvZzFpYworLnNjYXRvbG9naTFjYQorLnNjOGg4ZThkOXU4bDlpOG44Zy4KKy5zMmNoMgorLnNjaGUyCisuczRjaDRlZAorLnNjaGU0ZHVsCisuc2NoZTFkdQorLnNjaGVkdWwyaQorLnNjaGVkdWwzaW5nCisuc2M4aDhpOHo5bzlwOGg4cjhlOG44aThjLgorLnNjaGkyegorLnNjaGkxem8KKy5zY2hpejJvcGgKKy5zY2hpem9wNGhyNAorLnNjOGg4bjhhOHU5ejhlOHIuCisuc2MyaDFuCisuc2NoMW5hCisuc2NobjJhdQorLnNjaG5hdTJ6NGUKKy5zY2huYXV6MWVyCisuc2M4aDhvOG84bDljOGg4aThsOGQuCisuczRjaG8yCisuc2Nob28yCisuc2Nob280bDFjMgorLnMyY2hvb2wyY2gKKy5zY2hvb2xjaDRpbDIKKy5zY2hvb2xjaGkybGQKKy5zYzhoOG84bzhsOWM4aDhpOGw4ZDlyOGU4bi4KKy5zY2hvb2xjaGlsM2RyCisuc2Nob29sY2hpbGRyZTQKKy5zY2hvb2xjaGlsNWRyZW4KKy5zYzhoOG84bzhsOXQ4ZThhOGM4aDhlOHIuCisuc2Nob280bDJ0Cisuc2Nob29sMXRlCisuczJjaG9vbHRlYTJjaAorLnNjaG9vbHRlYWNoZTIKKy5zYzhoOG84bzhsOXQ4ZThhOGM4aDllOHI4cy4KKy5zY2hvb2x0ZWFjaDNlNHIxczIKKy5zYzhyOHU5dDhpOW44eS4KKy5zY3J1MnQxaTVuCisuc2NyNHUxdDJpCisuc2NydXQ0aW55Cisuc2M4eTh0OGg5aThuOGcuCisuczFjeQorLnNjeTN0aGluCisuc2U4bDhsOWU4ci4KKy5zZWwybGUKKy5zZThsOGw5ZThyOHMuCisuc2VsbGU0cjFzMgorLnNlOGM5cjhlOXQ4YThyOWk4YTh0LgorLnNlMWNyCisuc2U0YzNyZTF0YQorLnNlY3JldDJhMnIKKy5zZWNyZXRhcjFpCisuc2VjcmV0YXIyaTNhCisuc2U4YzlyOGU5dDhhOHI5aThhOHQ4cy4KKy5zZWNyZXRhcmlhNHQxczIKKy5zZThtOWE5cDhoOG84cjhlLgorLnNlMW1hCisuc2U0bWFwCisuc2VtYXBobzRyCisuc2U4bTlhOXA4aDhvOHI4ZThzLgorLnNlOW04ZThzOXQ4ZThyLgorLjRzZTFtZQorLnNlMm1lcworLnNlOG04aTlkOGU4ZjlpOW44aTh0OGUuCisuc2VtMmlkCisuc2VtaWRlMWYKKy5zZW1pZGVmNWk1bjJpdGUKKy5zZW1pZGUxZmkKKy5zZW1pZGUyZmluCisuc2VtaWRlZjJpbmkKKy5zZW1pZGVmaW4yaXQKKy5zZThtOGk5ZDhpOXI4ZThjOHQuCisuc2VtaTJkaQorLnNlbWlkNGlyMgorLnNlbWlkaTFyZQorLnNlbWlkaXJlMmMxdAorLnNlOG04aTloOG85bThvOXQ4aDhlOHQ5aThjLgorLnNlbWkzaAorLnNlbWlobzFtbworLnNlbWlob200b3RoMworLnNlbWlob21vdGgyZQorLnNlbWlob21vM3RoZTR0Cisuc2VtaWhvbW90aGV0MWljCisuc2U4bThpOXI4aThuOGcuCisuc2VtNGlyCisuc2VtaXIxaQorLnNlbWlyaW40ZworLnNlOG04aTlyOGk4bjhnOHMuCisuc2VtaXJpbmdzMgorLnNlOG04aTlzOGk4bTlwOGw4ZS4KKy5zZTRtMmlzCisuc2VtaXNpNG0xcAorLnNlbWlzaW0xcDJsMgorLnNlOG04aTlzOGs4aThsOGw4ZThkLgorLnNlbTRpczRrMgorLnNlbWlzazFpCisuc2VtaXNrNGlsMWwKKy5zZW1pc2tpbDJsZQorLnNlOHI4bzllOHA4aTlkOGU5bThpOW85bDhvOGc5aTljOGE4bC4KKy5zMmVyNG8KKy5zZXJvNGUKKy5zZXJvZXA0aWQKKy5zZXJvZXBpM2RlCisuc2Vyb2VwaWQ0ZW0KKy5zZXJvZXBpZGVtMmlvCisuc2Vyb2VwaWRlbWkxb2wKKy5zZXJvZXBpZGVtaW8zbG9nMWljCisuc2Vyb2VwaWRlbWlvbG9naTFjYQorLnNlOHI5djhvOW04ZThjOGg5YThuOGk4czhtLgorLjRzZXIzdm8KKy5zZXJ2bzJtZQorLnNlcnZvbWUyY2gKKy5zZXJ2b21lY2g1YTVuaXMKKy5zZXJ2b21lY2hhMm4KKy5zZXJ2b21lY2hhbmkyczFtCisuc2U4cjl2OG85bThlOGM4aDlhOG44aThzOG04cy4KKy5zZXJ2b21lY2hhbjRpczRtMXMyCisuc2U4czlxOHU4aTlwOGU5ZDhhOWw4aThhOG4uCisuczFlNHMKKy5zZXNxdTIKKy5zZXNxMnVpMgorLnNlc3F1MmlwCisuc2VzcXVpcGU0Cisuc2VzcXVpMnAyZWQKKy5zZXNxdWlwMmUyZDJhCisuc2VzcXVpcGVkYWwxaQorLnNlc3F1aXBlZGFsMmkxYQorLnNlc3F1aXBlZGFsaTJhMm4KKy5zZTh0OXU4cC4KKy5zZTF0dQorLnNlOHQ5dThwOHMuCisuc2V0dTJwMXMyCisuc2U5djhlOHI4ZTlsOHkuCisuNXNldgorLnNldjFlcgorLnNldjRlcmVsCisuc2V2ZXJlMWx5Cisuc2g4YThwOGU5YThiOGw4ZS4KKy5zaGEzcGU0YQorLnNoYXBlMWE0YgorLnNoYXBlYWIybDIKKy5zaDhvOGU5czh0OHI4aThuOGcuCisuc2hvNAorLnNobzJlc3Q0cgorLnNob2VzdHJpbjRnCisuc2g4bzhlOXM4dDhyOGk4bjhnOHMuCisuc2hvZXN0cmluZ3MyCisuc2k4ZDhlOXM4dDhlOHAuCisuNXNpZGU0czIKKy5zMmlkCisuc2lkZXN0ZTRwCisuc2k4ZDhlOXM4dDhlOHA4cy4KKy5zaWRlc3RlMnAxczIKKy5zaThkOGU5czh3OGk4cDhlLgorLnNpZGVzNHcyCisuc2lkZXN3aTIKKy5zaWRlc3cyaXAKKy5zaWRlc3dpcGU0Cisuc2s4eTlzOGM4cjhhOHA4ZThyLgorLnNrMgorLnNreXM0YworLnNreXNjcmFwM2VyCisuc2s4eTlzOGM4cjhhOHA4ZThyOHMuCisuc2t5c2NyYXBlNHIxczIKKy5zbThvOGs4ZTlzOHQ4YThjOGsuCisuMnMxbQorLnMxbW8KKy5zNG0yb2sKKy5zbW9rZXM0Cisuc21va2VzMXRhCisuc21va2VzdGFjazEKKy5zbThvOGs4ZTlzOHQ4YThjOGs4cy4KKy5zbW9rZXN0YWM0azFzMgorLnNuOG84cjlrOGU4bDlpOG44Zy4KKy5zMW40Cisuc25vcmtlNWwyaQorLnNub3JrZTRsM2luZworLnNvOWw4ZTluOG84aThkLgorLjFzbworLnNvbDRlbm8KKy5zb2xlbm9pMgorLnNvbGVubzJpZAorLnNvOWw4ZTluOG84aThkOHMuCisuc29sZW5vaTJkMXMyCisuc284bDh1OHQ4ZS4KKy5zbzFsdXQKKy5zbzhsOHU4dDhlOHMuCisuc284djllOHI5ZThpOGc4bi4KKy40c292Cisuc292ZXJlaTIKKy5zb3ZlcmUyaWcyCisuc284djllOHI5ZThpOGc4bjhzLgorLnNvdmVyZWlnMm4xczIKKy5zcDhhOWM4ZThzLgorLjJzMXBhCisuc3BhNGNlCisuc3A4ZTljOGk4bzh1OHMuCisuc3BlMmMKKy5zcGUxYzJpCisuc3BlYzJpbworLnNwZWNpb3UyCisuc3BlY2lvMnVzCisuc3A4ZThsOGw5ZThyLgorLnNwZWwxbAorLnNwZWwybGUKKy5zcDhlOGw4bDllOHI4cy4KKy5zcGVsbGU0cjFzMgorLnNwOGU4bDhsOWk4bjhnLgorLnNwZWxsMmkKKy5zcGVsMmxpbjQKKy5zcDhlOWw4dThuOGs5ZThyLgorLnNwZWx1NG5rMgorLnNwZWx1bmsxZXIKKy5zcDhlOG44ZDl0OGg4cjhpOGY4dC4KKy5zcGVuNGQKKy5zcGVuZDJ0aAorLnNwZW5kdDRocjQKKy5zcGVuZHRocjRpMmZ0Cisuc3A4aDhlOHI5bzhpOGQuCisuczJwaGUKKy4zc3BoNGVyCisuc3BoMmVybworLnNwaGVyb2kyCisuc3BoZXJvMmlkCisuc3A4aDhlOHI5bzhpOGQ5YThsLgorLnNwaGVyb2kxZDJhCisuc3A4aDhpOG45ZzhlOHMuCisuc3BoNWluZworLnNwaDRpbmdlCisuc3A4aThjOWk5bDh5LgorLnNwMmkxY2kKKy5zcGljaTFseQorLnNwOGk4bjlvOHI4cy4KKy5zcGkybgorLnNwNGkxbm8KKy5zcGlubzRyczIKKy5zcDhvOGs4ZThzOXc4bzhtOGE4bi4KKy5zcDJvaworLnNwb2tlczQKKy5zcG9rZXM0dzIKKy5zcG9rZTRzMXdvMgorLnNwb2tlc3dvbTEKKy5zcG9rZXN3bzFtYQorLnNwb2tlc3dvbWEybgorLnNwOG84azhlOHM5dzhvOG04ZThuLgorLnNwb2tlc3dvMm1lCisuc3Bva2Vzd28xbWVuCisuc3A4bzhyOHQ4czljOGE4czh0LgorLnMxcDRvcjQKKy5zcG9yNHQxczIKKy5zcG9ydDRzYworLnNwb3J0czFjYQorLnNwOG84cjh0OHM5YzhhOHM4dDllOHIuCisuc3BvcnRzY2FzdDVlcgorLnNwOG84cjl0OGk4djhlOWw4eS4KKy5zcG9yMXRpCisuc3BvcjR0Mml2Cisuc3BvcnRpdjRlMWx5Cisuc3A4bzhyOHQ4czl3OGU4YThyLgorLnNwb3J0NHN3MgorLnNwb3J0c3dlMmEycgorLnNwOG84cjh0OHM5dzhyOGk4dDhlOHIuCisuc3BvcnRzd3JpNAorLnNwb3J0c3dyMml0ZQorLnNwOG84cjh0OHM5dzhyOGk4dDhlOHI4cy4KKy5zcG9ydHN3cml0NWU0cjFzMgorLnNwOHI4aThnOGg4dDlsOGk4ZThyLgorLnNwcjIKKy5zcHIyaWcKKy5zcHJpZ2gydGwKKy5zcHJpZ2h0bDJpZTQKKy5zcTh1OGU4YTltOGk4czhoLgorLnNxdTIKKy5zcXVlYW0yaXMKKy5zcXVlYW1pczJoCisuc3Q4YThuOGQ5YThsOG84bjhlLgorLjVzdDRhbmQKKy5zdGEybgorLnN0YW4xZDJhCisuc3RhbmRhbG8ybgorLnN0OGE4cjl0OGw4aThuOGcuCisuc3QyYTJyCisuc3RhcjJ0bAorLnN0OGE4cjl0OGw4aThuOGc5bDh5LgorLnN0YXJ0bGluZ2wyCisuc3RhcnRsaW5nMWx5Cisuc3Q4YTl0OGk4czl0OGk4YzhzLgorLnN0YXRpczF0MmkKKy5zdGF0aXMxdGljCisuc3RhdGlzdGk0YzNzMgorLnN0OGU4YThsOHQ4aDlpOGw4eS4KKy5zdGVhNGwKKy5zdGVhNGx0Cisuc3RlYWx0aDNpCisuc3RlYWw0dGg0aWwyCisuc3RlYWx0aGkxbHkKKy5zdDhlOGU4cDhsOGU5YzhoOGE4czhlLgorLnMxdGVlCisuc3RlZTRwMQorLnN0ZWUxcDJsMgorLnN0ZWVwbGUyY2gKKy5zdDhlOHI4ZThvOWc4cjhhOHA4aDlpOGMuCisuc3RlcmUxbworLnN0ZXJlbzJnCisuc3RlcmVvMWdyCisuc3RlcmVvNWdyYXBoMWljCisuc3RlcmVvZ3I0YXBoaQorLnN0OG85YzhoOGE4czl0OGk4Yy4KKy5zMXRvCisuc3RvMmNoNAorLnN0b2NoYXN0MmkKKy5zdG9jaGFzMXRpYworLnN0OHI4YThuOGc4ZTluOGU4czhzLgorLnN0NHIKKy5zMXRyYQorLnN0cmFuNGdlCisuc3RyYTJuCisuc3RyMmFuZworLnN0cmFuZ2U0bjRlCisuc3RyYW4xZ2VuCisuc3RyYW5nZTFuZXMKKy5zdHJhbmdlbjJlMnNzCisuc3Q4cjhhOHA5aDhhOG44ZzhlOHIuCisuc3RyYXBoMmFuNGcKKy5zdHJhcGhhbmc1ZXIKKy5zdHJhcGhhMm4KKy5zdDhyOGE4dDlhOWc4ZThtLgorLnN0cmEydGEKKy5zdDhyOGE4dDlhOWc4ZThtOHMuCisuc3RyYXRhZ2U0bTFzMgorLnN0OHI4ZTh0OGM4aDlpOWU4ci4KKy5zdHJlNHRjCisuc3RyZXQ0Y2gKKy5zdHJldGNoMmllNAorLnN0OHI4aThwOXQ4ZThhOHM4ZS4KKy5zdHIyaXAKKy5zdHJpMnAxdAorLnN0cmlwMnRlCisuc3Q4cjhvOG44ZzloOG84bDhkLgorLnN0cm8ybgorLnN0cm9uZ2hvMmwyZAorLnN0OHI4bzhuOGc5ZThzOHQuCisuc3Q4dTlwOGk4ZDllOHIuCisuczF0dQorLnN0dXA0aWQKKy5zdHVwaTNkZQorLnN0OHU5cDhpOGQ5ZThzOHQuCisuc3R1cGlkZTRzMgorLnN1OGI5ZDhpOGY5ZjhlOHI5ZThuOXQ4aThhOGwuCisuMXN1Cisuc3U0YjMKKy5zdTRiMWQKKy5zdWJkMWlmCisuc3ViZGk0ZjFmCisuc3ViZGlmZmVyMQorLnN1YmRpZmZlcjNlbjF0Cisuc3ViZGlmZmVyZW50MmkKKy5zdWJkaWZmZXJlbjF0MmkxYQorLnN1YmRpZmZlcmVudGkyYWwKKy5zdThiOWU4eDlwOHI4ZThzOXM4aThvOG4uCisuc3ViNGUKKy5zdWIxZXgzcAorLnN1YmV4cHIyCisuc3ViZXgzcHIyZTJzcworLnN1YmV4cHJlczFzaQorLnN1YmV4cHJlczFzMmlvCisuc3ViZXhwcmVzNXNpbzJuCisuc3U4YjllOHg5cDhyOGU4czlzOGk4bzhuOHMuCisuc3ViZXhwcmVzc2lvMm4zczIKKy5zdThtOW04YTliOGw4ZS4KKy5zdTJtCisuc3VtMW0KKy5zdW0xbWEKKy5zdW0ybWFiCisuc3VtbWFiMmwyCisuc3U4cDhlOHI5ZThnOG8uCisuc3UxcGUKKy5zdXBlcmUxZ28KKy5zdThwOGU4cjllOGc4bzhzLgorLnN1cGVyZTRnb3MKKy5zdTlwOHI4ZThtOWE5YzhpOHM4dC4KKy5zdXByMgorLnN1cHJlNG1hYworLnN1cHJlMW1hCisuc3VwcmVtNGEyY2kKKy5zdTlwOHI4ZThtOWE5YzhpOHM4dDhzLgorLnN1cHJlbWFjaXM0dDFzMgorLnN1OHI5djhlOGk4bDlsOGE4bjhjOGUuCisuc3UycgorLnN1cnY0ZQorLnN1cnZlaTIKKy5zdXJ2ZWlsMWwKKy5zdXJ2ZWlsbGEybgorLnN3OGk4bTltOGk4bjhnOWw4eS4KKy5zdzIKKy5zd2kyCisuc3dpbTFtCisuc3dpbW00aW5nbDIKKy5zd2ltbTVpbmcxbHkKKy5zeThtOHA5dDhvOW04YTh0OGk4Yy4KKy5zeTRtMXAKKy5zeW0ycDF0Cisuc3ltcDF0bworLnN5bXB0bzJtYQorLnN5bXB0b21hdDFpYworLnN5OG45YzhoOHI4bzltOGU4czhoLgorLnN5bjNjNGhyNAorLnN5bjJjaAorLnN5bmNocm8ybWUKKy5zeW5jaHJvMm1lcworLnN5bmNocm9tNGVzMmgKKy5zeThuOWM4aDhyOG85bjhvOHU4cy4KKy5zeW5jaHJvMm4KKy5zeW5jaHJvMW5vdTIKKy5zeW5jaHJvbm8ydXMKKy5zeThuOWM4aDhyOG85dDhyOG84bi4KKy5zeW5jaHJvdHJvMm4KKy50YThmOGY5cjhhOGk4bC4KKy40dGEyZjQKKy50YTRmMWY0CisudGFmZnIyYWkyCisudGE4bDhrOWE5dDhpOHY4ZS4KKy50YTJsCisuNHRhbGsKKy50YWxrYTMKKy50YWxrYTR0CisudGFsa2ExdDJpdgorLnRhOXA4ZThzOXQ4cjh5LgorLnRhcDJlc3Q0cgorLnRhcGU0c3RyeQorLnRhOXA4ZThzOXQ4cjhpOGU4cy4KKy50YXBlc3RyMmllNAorLnRhOHI5cDhhOHU5bDhpOG4uCisudDJhMnIKKy50YXIycAorLnRhcjFwYQorLnRhcnBhdTRsMgorLnRhcnBhdWwyaQorLnRhOHI5cDhhOHU5bDhpOG44cy4KKy50YXJwYXVsMmkybjFzMgorLnRlOWw4ZThnOXI4YTlwOGg4ZThyLgorLnRlbGUxZ3IKKy50ZWxlZzVyYTNwaDRlcgorLnRlOWw4ZThnOXI4YTlwOGg4ZThyOHMuCisudGVsZWdyYXBoZTRyMXMyCisudGU4bDhlOWs4aTluOGU4dDlpOGMuCisudGVsZWtpNG4KKy50ZWxlazFpCisudGVsZWsyaW5lCisudGVsZWtpM25ldDFpYworLnRlOGw4ZTlrOGk5bjhlOHQ5aThjOHMuCisudGVsZWtpbmV0aTRjM3MyCisudGU4bDhlOXI4bzliOG84dDlpOGM4cy4KKy50ZTRsMWVyCisudGVsNGVybworLnRlbGVyNW9iCisudGVsZXJvYm90aTRjM3MyCisudGU4bDhsOWU4ci4KKy50ZWwxbAorLnRlbDJsZQorLnRlOGw4bDllOHI4cy4KKy50ZWxsZTRyMXMyCisudGU4bTlwOG85cjhhOHI5aThsOHkuCisudGU0bTFwCisudGVtMXA0b3IKKy50ZW1wbzFyYQorLnRlbXBvNHJhcmlsCisudGVtcG9yMmEycgorLnRlbXBvcmFyMWkKKy50ZW1wb3JhcmkxbHkKKy50ZThuOXU4cjhlLgorLnRlOHM4dDliOGU4ZC4KKy50ZXMydDFiCisudGVzdDRiZTJkCisudGU4eDh0OXc4aThkOHQ4aC4KKy4zdGV4CisudGV4MXQyCisudGV4dHc0CisudGV4dHdpMgorLnRleHR3MmlkCisudGV4dHdpZDJ0aAorLnRoOGE4bDlhOW04dThzLgorLnRoYTNsYQorLnRoYWxhM20KKy50aGFsYTFtdQorLnRoYWxhbTJ1cworLnRoOGU4cjltOG85ZThsOGE4czl0OGk4Yy4KKy50aDJlCisudGhlcjNtNAorLnRoZXIxbW8KKy50aGVybW80ZWwKKy50aGVybW9lMWxhCisudGhlcm1vZWxhc3QyaQorLnRoZXJtb2VsYXMxdGljCisudGk4bThlOXM4dDhhOG04cC4KKy50aTJtZXMKKy50aW1lczF0YQorLnRpbWVzdGE0bTFwCisudGk4bThlOXM4dDhhOG04cDhzLgorLnRpbWVzdGFtMnAxczIKKy50bzhvOGw5azhpOHQuCisudG9vMgorLnRvb2xrMWkKKy50bzhvOGw5azhpOHQ4cy4KKy50b29sa2k0dDFzMgorLnRvOHA4bzlnOHI4YThwOGg5aTljOGE4bC4KKy50bzVwbzRnCisudG9wbzFncgorLnRvcG81Z3JhcGgxaWMKKy50b3BvZ3I0YXBoaQorLnRvcG9ncmFwaGkxY2EKKy50bzhxOHU4ZThzLgorLnRvMXEKKy50b3F1MgorLnRyOGE4aTl0OG84cjlvOHU4cy4KKy4xdHJhCisudHIyYWkyCisudHJhaTF0bworLnRyYWl0b3JvdTIKKy50cmFpdG9ybzJ1cworLnRyOGE4bjhzOWM4ZThpOHY4ZThyLgorLnRyYTJuCisudHJhMm4xczIKKy50cmFuczRjCisudHJhbjRzM2NlaTIKKy50cmFuc2NlMml2CisudHI4YThuOHM5YzhlOGk4djhlOHI4cy4KKy50cmFuc2NlaXZlNHIxczIKKy50cjhhOG44czlnOHI4ZThzOHMuCisudHJhbjJzM2cKKy50cmFuczFncgorLnRyYW5zZ3IyZTJzcworLnRyOGE4bjhzOXY4ZThyOXM4YThsLgorLnRyYW40c3YKKy50cmFuc3ZlNHIxczIKKy50cmFuc3ZlcjFzYTIKKy50cjhhOG44czl2OGU4cjlzOGE4bDhzLgorLnRyYW5zdmVyc2EybDFzMgorLnRyOGE4bjhzOXY4ZThzOXQ4aTh0OGUuCisudHJhbnN2NGUycworLnRyYW5zdmVzdDJpCisudHJhbnN2ZXN0Mml0ZQorLnRyOGE4bjhzOXY4ZThzOXQ4aTh0OGU4cy4KKy50cmFuc3Zlc3RpdDRlcworLnRyOGE5djhlOHI4czlhOWI4bDhlLgorLnRyYXZlNHIxczIKKy50cmF2ZXIxc2EyCisudHJhdmVyMnMxYWIKKy50cmF2ZXJzYWIybDIKKy50cjhhOXY4ZThyOXM4YThsLgorLnRyOGE5djhlOHI5czhhOGw4cy4KKy50cmF2ZXJzYTJsMXMyCisudHI4aTllOHQ4aDh5OGw5YThtOGk4bjhlLgorLnRyaTVldAorLnRyMmllNAorLnRyaWV0aHkzbGEKKy50cmlldGh5bGFtMWluCisudHJpZXRoeWxhbTJpbmUKKy50cjhlOGE4YzhoOWU4cjhpOGU4cy4KKy50cmVhMmNoCisudHJlYWNoZTIKKy50cmVhY2hlcjFpCisudHJlYWNoZXIyaWU0CisudHI4bzh1OWI4YTlkOG84dThyLgorLnRyb3UyCisudHJvdWJhMmQKKy50cm91YmExZG8KKy50cm91YmFkb3UyCisudHU4cjlrOGU4eS4KKy4xdHUKKy50dThyOWs4ZTh5OHMuCisudHVya2V5czQKKy50dThyOG45YThyOG84dThuOGQuCisudHVyNG4yYTJyCisudHVyMW5hCisudHVybmFyb3UyCisudHVybmFyb3VuMmQKKy50dThyOG45YThyOG84dThuOGQ4cy4KKy50dXJuYXJvdW4yZDFzMgorLnR5OHA5YThsLgorLjF0eQorLnR5MXBhCisudHlwNGFsCisudW45YTh0OXQ4YThjOGg4ZThkLgorLnVuMmF0NAorLnVuYTR0M3QyCisudW5hdDF0YQorLnVuYXR0YTJjaAorLnVuYXR0YWNoZTIKKy51bmF0dGE0Y2g0ZWQKKy51bjllOHI4cjlpOG44ZzlsOHkuCisudW40ZXIKKy51bmVyNHI0CisudW5lcnJpbjRnCisudW5lcnJpbmdsMgorLnVuZXJyaW5nMWx5CisudW45ZjhyOGk4ZThuOGQ5bDh5LgorLnVuM2YKKy51bmZyaTIKKy51bmZyMmllNAorLnVuZnJpZW4yZDFseQorLnVuOWY4cjhpOGU4bjhkOWw4aTllOHIuCisudW5mcmllbmRsMmllNAorLnZhOGc4dThlOHIuCisuMXZhCisudmFnNAorLnZhNWd1ZXIKKy52YTJndWUKKy52YTh1OGQ4ZTl2OGk4bDhsOGUuCisudmF1ZGUxdjQKKy52YXVkZTJ2M2k0bAorLnZhdWRlMXZpCisudmF1ZGV2aWwxbAorLnZhdWRldmlsMmxlCisudmk4YzlhOHI4cy4KKy52NGljMmEycgorLnZpMWNhCisudmljYTRyczIKKy52aThsOWw4YThpOG45ZThzOHMuCisuMnZpbAorLnZpbDFsCisudmlsbGFpMgorLnZpbGxhNGk0bgorLnZpbGxhMmluZQorLnZpbGxhaTVuMmUyc3MKKy52aWxsYWkxbmVzCisudmk4czl1OGE4bC4KKy52aTNzdQorLnZpc3UxYWwKKy52aThzOXU4YThsOWw4eS4KKy52aXN1YWwxbAorLnZpc3VhbDFseQorLnZpOXY4aThwOWE5cjhvOHU4cy4KKy4zdjJpdgorLnZpdjJpNHAKKy52aXZpMXBhCisudml2aXAyYTJyCisudml2aXBhcm91MgorLnZpdmlwYXJvMnVzCisudm84aThjOGU5cDhyOGk4bjh0LgorLnZvaTQKKy52b2kzY2VwCisudm9pY2VwcjIKKy52b2ljZXByaW40dDMKKy52czhwOGE4YzhlLgorLnYyczFwYQorLnZzcGE0Y2UKKy53YThkOWQ4aThuOGcuCisud2EyZAorLndhZDRkMWluCisud2FkMWQ0Cisud2E4bDhsOWY4bDhvOHc4ZThyLgorLndhbDFsCisud2FsMmxmCisud2FsbGY0bDIKKy53YWxsZmxvdzFlcgorLndhOGw4bDlmOGw4bzh3OWU4cjhzLgorLndhbGxmbG93ZTRyMXMyCisud2E4cjhtOWU4czh0LgorLncyYTJyCisud2FyMW0KKy53YXIybWUKKy53YXIybWVzCisud2E4czh0OGU5dzhhOHQ4ZThyLgorLndhczR0Cisud2FzdGUydworLndhc3RlMXc1YQorLndhc3Rld2ExdGUKKy53YTh2OGU5Zzh1OGk4ZDhlLgorLndhdmVnMworLndhdmVnMnVpMgorLndhdmVndTJpZAorLndhOHY4ZTlnOHU4aThkOGU4cy4KKy53YXZlZ3VpZGU0czIKKy53YTh2OGU5bDhlOHQuCisud2E4djhlOWw4ZTh0OHMuCisud2F2ZWxlNHQxczIKKy53ZThiOWw4aThrOGUuCisudzJlMWIKKy53ZWIybDIKKy53ZWIzbDRpaworLndlOGU4azluOGk4ZzhoOHQuCisud2Vla24yaWcKKy53ZThlOGs5bjhpOGc4aDh0OHMuCisud2Vla25pZ2g0dDFzMgorLndoOGU4ZThsOWM4aDhhOGk4ci4KKy53aGVlNGwxYzIKKy53aGVlbDJjaAorLndoZWVsY2hhaTIKKy53aGVlbGNoYTRpcgorLndoOGU4ZThsOWM4aDhhOGk4cjhzLgorLndoZWVsY2hhaTRyczIKKy53aDhpOGM4aDllOHY4ZThyLgorLndoaTQKKy53aDRpMmNoCisud2hpY2hlMgorLndoaWNoZXYxZXIKKy53aDhpOHQ4ZTlzOGk4ZDhlOGQuCisud2gyaXRlCisud2hpdDRlcworLndoaXRlMXNpCisud2hpdGUyczJpZAorLndoaXRlc2kyZDFlZAorLndoOGk4dDhlOXM4cDhhOGM4ZS4KKy53aGl0ZTFzcAorLndoaXRlMnMxcGEKKy53aGl0ZXNwYTRjZQorLndoOGk4dDhlOXM4cDhhOGM4ZThzLgorLndpOGQ4ZTlzOHA4cjhlOGE4ZC4KKy53MmlkCisud2lkZTRzMgorLndpZGUxc3AKKy53aWRlczRwcmUKKy53aWRlc3ByMgorLndpZGVzcHJlYTJkMQorLndpOG44ZzlzOHA4YThuLgorLndpbjRnCisud2luZ3MyCisud2luZzJzMXBhCisud2luZ3NwYTRuCisud2k4bjhnOXM4cDhhOG44cy4KKy53aW5nc3BhMm4xczIKKy53aThuOGc5czhwOHI4ZThhOGQuCisud2luZ3NwcjIKKy53aW5nc3ByZWEyZDEKKy53aTh0OGM4aDljOHI4YThmOHQuCisud2k0dGMKKy53aXQ0Y2gKKy53aXRjaGNyYTJmNHQKKy53aXRjaGNyYTJmCisud284cjhkOXM4cDhhOGM5aThuOGcuCisuMXdvMgorLndvcjJkMXMyCisud29yZHM0cAorLndvcmQyczFwYQorLndvcmRzcDRhMmNpCisud29yZHNwYTJjMWluCisud29yZHNwYWMxaW5nCisud284cjhrOWE4cjhvOHU4bjhkLgorLndvcmsyYTJyCisud29ya2Fyb3UyCisud29ya2Fyb3VuMmQKKy53bzhyOGs5YThyOG84dThuOGQ4cy4KKy53b3JrYXJvdW4yZDFzMgorLndvOHI4azloOG84cjhzOGUuCisud29ya2g0Cisud29ya2hvcjRzZQorLndvcmtobzRyczIKKy53bzhyOGs5aDhvOHI4czhlOHMuCisud29ya2hvcnMzZTRzCisud3I4YThwOWE4cjhvOHU4bjhkLgorLndyYTQKKy53cmFwMmEycjQKKy53cmExcGEKKy53cmFwYXJvdTIKKy53cmFwYXJvdW4yZAorLndyOGU4dDhjOGg5ZThkLgorLndyZTR0YworLndyZXQ0Y2gKKy53cmV0Y2hlMgorLndyZXQ0Y2g0ZWQKKy53cjhlOHQ4YzhoOWU4ZDlsOHkuCisud3JldGNoZTJkMWx5CisueWU4czl0OGU4cjl5OGU4YThyLgorLnllczQKKy55ZXN0ZXJ5ZTJhMnIKKy5hbDlnOGU5YjhyOGE4aTlzOGM4aDhlLgorLmFsZ2VicmEyaXMxYworLmFsZ2VicmFpczNjaDIKKy5hbGdlYnJhaXNjaGUyCisuYWw5bDhlOWc4aDhlOW44eS4KKy5hbDFsCisuYWwybGUKKy5hbDNsZWcKKy5hbGxlZ2hlMm4KKy5hcjlrOGE4bjlzOGE4cy4KKy5hcmthMm4KKy5hcmthbjJzYTIKKy5hcmthMm4xczIKKy5hdDhwOWE4czhlLgorLmE0dDFwCisuYXQxcGEKKy5hdDhwOWE4czhlOHMuCisuYXRwYXMxZTRzCisuYXU4czl0OHI4YThsOWE4czhpOGE4bi4KKy5hMnVzCisuYXVzMXQ0cgorLmF1czF0cmEKKy5hdXN0cmFsYXMyaTFhCisuYXVzdHJhbGFzaTJhMm4KKy5hdTh0OG85bThhOHQ4aTlzOGk4ZThyOXQ4ZThyLgorLmF1dG9tYTN0aXMKKy5hdXRvbWF0aXMyaWU0CisuYXV0b21hdGlzaWVydDNlcgorLmJlOWQ4aThlOW44dThuOGcuCisuNGJlMmQKKy5iNGUzZGkKKy5iZTVkaTNlbgorLmJlZDJpZTQKKy5iZWRpZTNudTRuCisuYmU4bThiOG8uCisuNGJlNW0KKy5iZTRtNWIKKy5iaThiOWw4aTlvOWc4cjhhOXA4aDhpOXM4YzhoOGUuCisuYmlibGlvZ3I0YXBoaQorLmJpYmxpb2dyYXBoMmlzMWMKKy5iaWJsaW9ncmFwaGlzM2NoMgorLmJpYmxpb2dyYXBoaXNjaGUyCisuYm84czl0OG84bi4KKy41Ym9zNAorLmJvczF0bworLmJvc3RvMm4KKy5icjhvOHc4bjlpOGE4bi4KKy5icm93bjVpCisuYnJvdzNuNGkxYQorLmJyb3duaTNhMm4KKy5icjh1OG44czl3OGk4YzhrLgorLmJydTJuCisuYnJ1Mm4zczQKKy5icnVuNHN3MgorLmJydW5zd2kyCisuYnJ1bnN3aWNrMQorLmJ1OWQ4YTlwOGU4czh0LgorLmJ1MWQyYQorLmNhOHI5aThiOWI4ZThhOG4uCisuY2FyMWkKKy5jYXI0aWIKKy5jYXJpMmIxYgorLmNhcmliMmJlCisuY2FyaWJiZWEybgorLmNoOGE4cjhsOGU4czl0OG84bi4KKy5jaGFyNGxlNAorLmNoYXIxbAorLmNoYXJsZXMyCisuY2hhcmw0ZXMydG8KKy5jaGFybGUzc3RvMm4KKy5jaDhhOHI5bDhvOHQ4dDhlOHM5djhpOGw4bDhlLgorLmNoYXIzbG80CisuY2hhcmxvNHQzdDIKKy5jaGFybG90NHRlcworLmNoYXJsb3R0ZTRzdgorLmNoYXJsb3R0ZXMydmlsCisuY2hhcmxvdHRlc3ZpbDFsCisuY2hhcmxvdHRlc3ZpbDJsZQorLmNvOWw4dThtOWI4aThhLgorLmNvbHVtNGJpCisuY29sdTRtMWIKKy5jb2x1bWIyaTFhCisuY3o4ZThjOGg4bzlzOGw4bzl2OGE5azhpOGEuCisuYzJ6ZTQKKy5jemUyY2gKKy5jemUzY2hvMgorLmN6ZWNob3M0bDIKKy5jemVjaG9zNGxvdgorLmN6ZWNob3NsbzF2YQorLmN6ZWNob3Nsb3ZhazFpCisuY3plY2hvc2xvdmFrMmkxYQorLmRlOGw5YTl3OGE4cjhlLgorLmRlMWxhCisuZGU0bGF3CisuZGVsYXcyYTJyCisuZGk4ajhrOXM4dDhyOGEuCisuZGkzagorLmRpajRrMXMyCisuZGlqa3N0NHIKKy5kaWprczF0cmEKKy5kdThhOG44ZS4KKy5kMXUxYQorLmR1YTJuCisuZHk5bjhhOW04aTlzOGM4aDhlLgorLjVkeW4KKy5keTFuYQorLmR5bmFtMmlzCisuZHluYW0yaXMxYworLmR5bmFtaXMzY2gyCisuZHluYW1pc2NoZTIKKy5lbjhnOWw4aThzOGguCisuZW5nbDIKKy5lbmdsaXMyaAorLmV1OGw4ZThyOWk4YThuLgorLmV1bDRlCisuZXUzbDRlcjFpCisuZXVsZTFyMmkzYTQKKy5ldWxlcmkyYTJuCisuZXY4YThuOXM4dDhvOG4uCisuZTF2YQorLmV2YTJuCisuZXZhbjRzdAorLmV2YTJuMXMyCisuZXZhbnMxdG8KKy5ldmFuc3RvMm4KKy5mZThiOXI4dTlhOHI4eS4KKy5mMmU0YgorLmZlM2JyCisuZmVicnUzYQorLmZlYnJ1MmEycgorLmZlOHM4dDlzOGM4aDhyOGk4Zjh0LgorLmZlczR0MXMyCisuZmVzdDRzYworLmZlc3RzMmNoMgorLmZlc3RzYzRocjQKKy5mZXN0c2NocjRpMmZ0CisuZmw4bzhyOWk5ZDhhLgorLmZsb3IyaWQKKy5mbG9yaTFkMmEKKy5mbDhvOHI5aTlkOWk4YThuLgorLmZsb3JpMmRpCisuZmxvcmlkNWkyYTJuCisuZmxvcmkxZDRpM2EKKy5mbzhyOXM4YzhoOHU4bjhnOHM5aThuOXM4dDhpOXQ4dTh0LgorLmZvcnM0YworLmZvcnMyY2gyCisuZm9yc2NodW5nczIKKy5mb3JzY2h1bmcyczFpbgorLmZvcnNjaHVuZ3MyaTJuMXMyCisuZm9yc2NodW5nc2luc3QyaQorLmZvcnNjaHVuZ3NpbnN0aTF0dQorLmZyOGU4ZTliOHM4ZC4KKy5mcmUyZTFiCisuZnJlZTJiNXMyCisuZnJlZWI0czVkCisuZnU4bjhrOXQ4czhpOG84bjhhOGwuCisuM2Z1CisuZnU0bmsyCisuZnVuazV0CisuZnVuazR0MXMyCisuZnVua3QxczJpbworLmZ1bmt0NXNpbzJuCisuZnVua3RzaW8xbjVhCisuZ2E4dThzOHM5aThhOG4uCisuZ2EydXMKKy5nYXUyc3MKKy5nYXVzMXNpCisuZ2F1c3MyaTFhCisuZ2F1c3NpMmEybgorLmdoOG84czh0OXM4YzhyOGk4cDh0LgorLmdob3M0dDFzMgorLmdob3N0NHNjCisuZ2hvc3RzY3JpMgorLmdob3N0c2NyMmlwCisuZ2hvc3RzY3JpMnAxdAorLmdoOG84czh0OXY4aThlOHcuCisuZ2hvczR0dgorLmdob3N0djJpZTQKKy5ncjhhOHM4czltOGE4bjhuOWk4YThuLgorLmdyMmFzCisuZ3JhMnNzCisuZ3JhczJzMW0KKy5ncmFzczNtYQorLmdyYXNzbWEybjMKKy5ncmFzc21hNG4xbjIKKy5ncmFzc21hbjNuNGkxYQorLmdyYXNzbWEybm5pM2EybgorLmdyOGU4aThmOHM5dzhhOGw4ZC4KKy5ncmVpMgorLmdyZWkyZjNzCisuZ3JlaWZzdzIKKy5ncmVpZnN3YTJsZAorLmdyOG84dDhoOGU4bjlkOGk4ZThjOGsuCisuZzRybworLmdybzR0aDJlCisuZ3I0b3RoCisuZ3JvdGhlMm4KKy5ncm90aGVuZDJpZTQKKy5ncm90aGVuZGllY2sxCisuZ3I4dThuOGQ5bDhlOGg5cjhlOG4uCisuZ3J1Mm4KKy5ncnVuZGxlMWg0CisuZ3J1bmRsZTRocjQKKy5oYTlkOGE5bThhOHI4ZC4KKy5oYTJkCisuaGExZDJhCisuaGFkYTJtMgorLmhhZDRhMW1hCisuaGFkYW0yYTJyCisuaGE4aTlmOGEuCisuaGFpMWZhCisuaGE4bThpOGw5dDhvOG45aThhOG4uCisuaGE0bQorLmhhbWk0bHQKKy5oYW1pbDF0bworLmhhbWlsdG8ybgorLmhhbWlsdG8zbjRpMWEKKy5oYW1pbHRvbmkzYTJuCisuaGU4bDlzOGk4bjhrOGkuCisuaGUybDFzMgorLmhlbDJzMWluCisuaGVsczRpNG5rMgorLmhlbHNpbmsxaQorLmhlOHI5bThpOHQ5aThhOG4uCisuaGVyM21pdAorLmhlcm1pMXRpCisuaGVybTRpMXQyaTFhCisuaGVybWl0aTJhMm4KKy5oaThiOGI4cy4KKy5oaTJiMWIKKy5oaWIyYjVzMgorLmhvOGs5azhhOGk5ZDhvLgorLmgyb2sKKy5ob2trNAorLmhva2thaTIKKy5ob2trYTJpZAorLmhva2thaTFkbworLmphOGM5azhvOHc5czhrOGkuCisuNWphCisuamFjazEKKy5qYWNrb3dzazIKKy5qYWNrb3dzazFpCisuamE4bjl1OWE4cjh5LgorLmphMm4KKy5qYW4zdTFhCisuamFudTJhMnIKKy5qYTlwOGE5bjhlOHM4ZS4KKy5qYTRwCisuamExcGEKKy5qYXBhMm4KKy5qYXBhMW5lcworLmphcGFuZTFzMmUKKy5rYThkOW84bTl0OHM4ZTh2LgorLmthMmQKKy5rYTFkbworLmthZG80bXQKKy5rYWRvbTR0MXMyCisua2Fkb210NXNldgorLmthOG45czhhOHMuCisua2EybgorLmthbjJzYTIKKy5rYTJuMXMyCisua2E4cjhsOHM5cjh1OGg4ZS4KKy5rMmEycgorLmthcjFsCisua2FyMmwxczIKKy5rYXJsczFyCisua284cjl0OGU5dzhlOGcuCisua281cgorLmtyOGk4czhoOG44YS4KKy5rcjJpcworLmtyM2lzMmgKKy5rcmlzMmgxbgorLmtyaXNoMW5hCisua3I4aThzOGg5bjhhOWk4czhtLgorLmtyaXNobmFpMgorLmtyaXNobmFpMnMxbQorLmtyOGk4czhoOW44YThuLgorLmtyaXNobjJhMm4KKy5sYThuOWM4YThzOXQ4ZThyLgorLmxhbjFjYQorLmxhbmNhc3Q1ZXIKKy5sZTlnOGU4bjhkOHI4ZS4KKy5sZTFnZW4KKy5sZWdlbjFkcgorLmxlZ2VuZHJlNAorLmxlOGk4YzhlOHM5dDhlOHIuCisubGVpMgorLmxlNWljCisubGVpY2VzNXQKKy5saThwOXM4YzhoOGk4dDh6LgorLmwyaXAKKy5saTJwMXMyCisubGlwczJjaDIKKy5saXBzM2NoaXQKKy5saXBzY2hpNHR6CisubGk4cDlzOGM4aDhpOHQ4ejlpOGE4bi4KKy5saXBzY2hpdDJ6MWkKKy5saXBzY2hpdHoyaTFhCisubGlwc2NoaXR6aTJhMm4KKy5sbzhqOWI4YThuLgorLmxvNWoKKy5sb2piYTJuCisubG84dTlpOXM4aTlhOG44YS4KKy5sb3UyCisubG8ydWkyCisubG91aXMyaTFhCisubG91aXNpMmEybgorLmxvdWlzaWExbmEKKy5tYThjOW84cy4KKy5tYTFjbworLm1hOG45YzhoOGU4czl0OGU4ci4KKy5tYW4yY2gKKy5tYW5jaGUyCisubWFuY2gxZXMKKy5tYThyOWs4bzh2OWk4YThuLgorLm1hcmtvNXZpMmEybgorLm1hcmtvdjJpMWEKKy5tYThyOGs4dDlvOGI4ZThyOWQ4bzhyOGYuCisubWFyazV0CisubWFyazF0bworLm1hcmt0bzNiCisubWFya3RvYmVyMWRvCisubWFya3RvYmVyZDRvcgorLm1hcmt0b2JlcmRvcjFmCisubWE4czhzOWE5YzhoOHU5czhlOHQ4dDhzLgorLm1hMnNzCisubWFzMXNhMgorLm1hc3NhMmNoCisubWFzc2FjaDJ1cworLm1hc3NhY2h1c2U0dDN0MgorLm1hc3NhY2h1c2V0NHQxczIKKy5tYTh4OXc4ZThsOGwuCisubWF4d2VsNGwKKy5taTljOHI4bzlzOG84Zjh0LgorLm1pY3JvMnNvCisubWljcm9zbzJmdDMKKy5taThuOW44ZTlhOHA5bzlsOGk4cy4KKy5tMmk0bjFuMgorLm1pbm5lNAorLm1pbm5lYXBvbDJpCisubWk4bjluOGU5czhvOHQ4YS4KKy5taW4xbmVzCisubWlubmUxc28KKy5taW5uZXNvMXRhCisubW84czljOG84dy4KKy5tb3MyYworLm1vczFjbworLm5hOGM4aDlyOGk4YzhoOHQ4ZThuLgorLjFuYQorLm5hMmNoCisubmFjNGhyNAorLm5hMmNocjRpMmNoCisubmFjaHJpY2h0MWVuCisubmE4czhoOXY4aThsOGw4ZS4KKy5uNGFzCisubmFzMmgKKy5uYXNoMnZpbAorLm5hc2h2aWwxbAorLm5hc2h2aWwybGUKKy5uZTh0OWI4czhkLgorLm5lMnQxYgorLm5ldDJiNXMyCisubmV0YjRzNWQKKy5uZTh0OXM4YzhhOHA4ZS4KKy5uZTR0MXMyCisubmV0NHNjCisubmV0c2NhNHAKKy5uZXRzMWNhCisubmk4ajltOGU5ZzhlOG4uCisubmkzagorLm5pam1lMmcKKy5uaWptZTFnZW4KKy5ubzhlOXQ4aDhlOHI5aThhOG4uCisuM25vZQorLm5vZXRoMmUKKy5ub2V0aGVyMWkKKy5ub2V0aGUxcjJpM2E0Cisubm9ldGhlcmkyYTJuCisubm84bzhyOGQ5dzhpOGo4azhlOHI5aDhvOHU4dC4KKy5ub28yCisubm8zb3JkCisubm9vcmQxdworLm5vb3Jkd2kyCisubm9vcmR3aTNqCisubm9vcmR3aWprMWVyCisubm9vcmR3aWprZXIxaDQKKy5ub29yZHdpamtlcmhvdTIKKy5ubzl2OGU4bTliOGU4ci4KKy5ub3ZlNG01YgorLm9wOGU4bjliOHM4ZC4KKy5vcGU0bjFiNAorLm9wZW4yYjVzMgorLm9wZW5iNHM1ZAorLm9wOGU4bjlvOGY4ZjhpOGM4ZS4KKy5vcDRlbm8KKy5vcGVubzRmMWYKKy5vcGVub2YxZmkKKy5wYThsOGE5dDhpOG44by4KKy5wYWxhMnQxaW4KKy5wYWxhdDJpMW5vCisucGE5bDhlOHI5bThvLgorLnBhbGVyM200CisucGFsZXIxbW8KKy5wZTl0OHI4bzh2OXM4azhpLgorLnBldHJvM3YKKy5wZXRyb3ZzazIKKy5wZXRyb3ZzazFpCisucGY4YThmOGY5aThhOG4uCisuNHBmCisucDFmYQorLnBmYTJmCisucGZhNGYxZjQKKy5wZmFmMWZpCisucGZhZmYyaTNhCisucGZhZmZpMmEybgorLnBoOGk4bDlhOWQ4ZThsOXA4aDhpOGEuCisucGhpNGw0YWRlCisucGhpbGEyZAorLnBoaWxhZGUybHAKKy5waGlsYWRlbDVwaGkKKy5waGlsYWRlbHBoMmkxYQorLnBoOGk4bDlvOXM4bzhwOGg5aTlzOGM4aDhlLgorLnBoaWxvMnNvCisucGhpbG9zNG9wCisucGhpbG9zMm9waAorLnBoaWxvc29waDJpczFjCisucGhpbG9zb3BoaXMzY2gyCisucGhpbG9zb3BoaXNjaGUyCisucG84aThuOWM4YThyOGUuCisucG9pbjIKKy5wb2kyCisucG9pbmMyYTJyNQorLnBvaW4xY2EKKy5wbzl0OGU4bjl0OGk4YThsOWc4bDhlOGk5YzhoOHU4bjhnLgorLnA0b3QKKy5wbzF0ZW4xdAorLnBvdGVudDJpCisucG90ZW4xdDJpMWEKKy5wb3RlbnRpMmFsCisucG90ZW50aWE0bDFnNAorLnBvdGVudGlhbGdsMgorLnBvdGVudGlhbDFnbGUKKy5wb3RlbnRpYWxnbGVpMgorLnBvdGVudGlhbGdsZTVpYworLnBvdGVudGlhbGdsZTRpMmNoCisucmE5ZDhoOGE5azhyOGk4czhoOW44YThuLgorLnJhZDFoMgorLnJhZGhha3IyaXMKKy5yYWRoYWtyM2lzMmgKKy5yYWRoYWtyaXMyaDFuCisucmFkaGFrcmlzaDFuYQorLnJhZGhha3Jpc2huMmEybgorLnJhOHQ4aDhzOWs4ZThsOWw4ZThyLgorLnI0YXRoCisucmEydDRoMXMyCisucmF0aHNrMgorLnJhdGg0c2tlCisucmF0aHNrZWwxbAorLnJhdGhza2VsMmxlCisucmk4ZTltOGE4bjhuOWk4YThuLgorLnIyaWU0CisucmllNW1hMm4KKy5yaWUxbWEKKy5yaWVtYTRuMW4yCisucmllbWFuM240aTFhCisucmllbWEybm5pM2EybgorLnJ5OGQ5YjhlOHI4Zy4KKy5yeTFkCisucnlkMWIKKy5yeWRiZXJnMgorLnNjOGg4bzh0OXQ4aThzOGM4aDhlLgorLnNjaG80dDN0MgorLnNjaG90dDJpczFjCisuczJjaDJvdHRpczNjaDIKKy5zY2hvdHRpc2NoZTIKKy5zYzhoOHI4bzlkOGk4bjhnOWU4ci4KKy5zYzRocjQKKy5zY2hyb2QxaW4KKy5zY2hyb2Q0aW5nZQorLnNjOGg4dzhhOWI4YTljOGg4ZThyLgorLnNjaDF3Cisuc2Nod2FiYTJjaAorLnNjaHdhYmFjaGUyCisuc2M4aDh3OGE4cjh6OXM4YzhoOGk4bDhkLgorLnNjaHcyYTJyCisuczJjaHdhcnpzMmNoMgorLnNjaHdhcnpzY2g0aWwyCisuc2Nod2FyenNjaGkybGQKKy5zZThwOXQ4ZThtOWI4ZThyLgorLnNlMnAxdAorLnNlcDJ0ZQorLnNlcHRlNG01YgorLnN0OG84azhlOHM5czhjOGg4ZS4KKy5zdDJvaworLnN0b2tlczQKKy5zdG9rMmUyc3MKKy5zdG9rZXMyczVjCisuc3Rva2VzczJjaDIKKy5zdG9rZXNzY2hlMgorLnN0OHU4dDh0OWc4YThyOHQuCisuc3R1NHQzdDIKKy5zdHV0NHQxZworLnN0dXR0MWdhCisuc3R1dHRnMmEycgorLnN1OHM5cTh1OGU5aDhhOG45bjhhLgorLnMydXMKKy5zdXNxdTIKKy5zdXNxdWUxaDQKKy5zdXNxdWVoYTJuCisuc3VzcXVlaGE0bjFuMgorLnN1c3F1ZWhhbjFuYQorLnRhOHU5YjhlOHI5aThhOG4uCisudGF1NGIKKy50YXViNGUKKy50YXUzYmVyCisudGF1YmVyMWkKKy50YXViZTFyMmkzYTQKKy50YXViZXJpMmEybgorLnRlOGM4aDluOGk5czhjOGg4ZS4KKy50ZTJjaAorLnRlYzJoMW4KKy50ZWNobjJpczFjCisudGUyY2huaXMzY2gyCisudGVjaG5pc2NoZTIKKy50ZThuOW44ZThzOXM4ZThlLgorLnQ0ZTRuMW4yCisudGVubmU0CisudGVuMW5lcworLnRlbm4yZTJzcworLnRvOW04YTlzOHo4ZTh3OXM4azhpLgorLnRvMm1hCisudG9tYXMyemUKKy50b21hc3pld3NrMgorLnRvbWFzemV3c2sxaQorLnR5OXA4bzlnOHI4YThwOGg4aThxOHU4ZS4KKy50eTNwbworLnR5NXBvNGcKKy50eXBvMWdyCisudHlwb2dyNGFwaGkKKy50eXBvZ3JhcGhpcXUyCisudWs4cjhhOGk4bjlpOGE4bi4KKy40dWsKKy51a3IyYWkyCisudWtyYTRpNG4KKy51a3JhMmluaQorLnVrcmFpNG40aTFhCisudWtyYWluaTNhMm4KKy52ZThyOWE4bDhsOWc4ZTltOGU4aThuOWU4cjh0OGUuCisudmVyYWwxbAorLnZlcmFsNGwxZzQKKy52ZXJhbGxnZTFtZQorLnZlcmFsbGdlbWVpMgorLnZlcmFsbGdlbWUyaW5lCisudmVyYWxsZ2VtZWluMWVyCisudmU4cjllOGk4bjlpOWc4dThuOGcuCisudmVyZTNpbgorLnZlcmVpMgorLnZlcmUyaW5pCisudmVyZWluMmlnCisudmVyZWluaTNndW4KKy52ZThyOXQ4ZThpOWw4dThuOWc4ZThuLgorLnZlcnRlaTIKKy52ZXJ0ZWlsdW4xZ2VuCisudmk4aThpOHQ4aC4KKy52NGk1aTQKKy52aTRpNWk0CisudmlpMml0aAorLnZpOGk4dDhoLgorLnZpMml0aAorLndhOGg4cjlzOGM4aDhlOGk4bjlsOGk4YzhoOWs4ZThpOHQ4czl0OGg4ZThvOXI4aThlLgorLndhNGhyNAorLndhaDRyczIKKy53YWhyczRjCisud2FocnMyY2gyCisud2FocnNjaGUyCisud2FocnNjaGVpMgorLndhaHJzY2hlNGk0bjFsCisud2FocnMyY2hlaW5sNGkyY2gKKy53YWhyc2NoZWlubGljNGhrCisud2FocnNjaGVpbmxpY2hrZWkyCisud2FocnNjaGVpbmxpY2hrZWk0dDFzMgorLndhaHJzY2hlaW5saWNoa2VpdHMzdGgyZQorLndhaHJzY2hlaW5saWNoa2VpdHN0aGUxbzVyCisud2FocnNjaGVpbmxpY2hrZWl0c3RoZW9yMmllNAorLndlOHI5bjhlOHIuCisudzFlcgorLndlcjRuMWVyCisud2U4cjl0OGg4ZThyOWk4YThuLgorLndlcnRoMmUKKy53ZXJ0aGVyMWkKKy53ZXJ0aGUxcjJpM2E0Cisud2VydGhlcmkyYTJuCisud2k4bjljOGg4ZThzOXQ4ZThyLgorLndpbjJjaAorLndpbmNoZTIKKy53aW5jaDFlcworLndpOHI4dDlzOGM4aDhhOGY4dC4KKy53NGlyNAorLndpcjR0MXMyCisud2lydDRzYworLndpcnRzMmNoMgorLndpcnRzY2hhMmYKKy53aXJ0c2NoYTJmdAorLndpOHM5czhlOG45czhjOGg4YThmOHQ5bDhpOGM4aC4KKy53NGkyczFzCisud2lzc2VuNAorLndpc3NlMm4xczIKKy53aXNzZW5zNGMKKy53aXNzZW5zMmNoMgorLndpc3NlbnNjaGEyZgorLndpc3NlbnNjaGEyZnQKKy53aXNzZW5zY2hhZjJ0bAorLndpc3NlbnMyY2hhZnRsNGkyY2gKKy54djhpOGk4aTh0OGguCisueHY0aTVpNAorLnh2aTRpNWk0CisueHZpaTJpdGgKKy54djhpOGk4dDhoLgorLnh2aTJpdGgKKy54eDhpOGk4aThyOGQuCisueHg0CisueHgzaQorLnh4NGk1aTQKKy54eGk0aTVpNAorLnh4aWk0aXIKKy54eDhpOGk4bjhkLgorLnh4aTRpbmQKKy55aThuOGc5eThvOG44Zy4KKy55MWkKKy55aW4yZ3kKKy55aW5neTFvNAorLnlpbmd5bzJuCisuc2g4dTl4OHU4ZS4KKy5zaHV4MXUzCisuamk5czh1OGE4bi4KKy5qaTJzdQorLmppc3VhMm4KKy56ZThhOWw4YThuOGQuCisuMnplCisuemVhNGwKKy56ZWEzbDRhbmQKKy56ZWFsYTJuCisuemU4aTh0OXM4YzhoOHI4aThmOHQuCisuemVpMgorLnplaTR0MXMyCisuemVpdDRzYworLnplaXRzMmNoMgorLnplaXRzYzRocjQKKy56ZWl0c2NocjRpMmZ0CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2luY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UuaHRtbCBiL2NvcmUvcmVzL2Fzc2V0cy93ZWJraXQvaW5jb2duaXRvX21vZGVfc3RhcnRfcGFnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzBjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9hc3NldHMvd2Via2l0L2luY29nbml0b19tb2RlX3N0YXJ0X3BhZ2UuaHRtbApAQCAtMCwwICsxLDI0IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iLz4KKyAgICA8dGl0bGU+TmV3IGluY29nbml0byB3aW5kb3c8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPjxzdHJvbmc+WW91J3ZlIGdvbmUgaW5jb2duaXRvPC9zdHJvbmc+LiBQYWdlcyB5b3UgdmlldyBpbiB0aGlzIHdpbmRvdworICAgICAgd29uJ3QgYXBwZWFyIGluIHlvdXIgYnJvd3NlciBoaXN0b3J5IG9yIHNlYXJjaCBoaXN0b3J5LCBhbmQgdGhleSB3b24ndAorICAgICAgbGVhdmUgb3RoZXIgdHJhY2VzLCBsaWtlIGNvb2tpZXMsIG9uIHlvdXIgY29tcHV0ZXIgYWZ0ZXIgeW91IGNsb3NlIHRoZQorICAgICAgaW5jb2duaXRvIHdpbmRvdy4gQW55IGZpbGVzIHlvdSBkb3dubG9hZCBvciBib29rbWFya3MgeW91IGNyZWF0ZSB3aWxsIGJlCisgICAgICBwcmVzZXJ2ZWQsIGhvd2V2ZXIuPC9wPgorCisgICAgPHA+PHN0cm9uZz5Hb2luZyBpbmNvZ25pdG8gZG9lc24ndCBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIG90aGVyIHBlb3BsZSwKKwlzZXJ2ZXJzLCBvciBzb2Z0d2FyZS4gQmUgd2FyeSBvZjo8L3N0cm9uZz48L3A+CisKKyAgICA8dWw+CisgICAgICA8bGk+V2Vic2l0ZXMgdGhhdCBjb2xsZWN0IG9yIHNoYXJlIGluZm9ybWF0aW9uIGFib3V0IHlvdTwvbGk+CisgICAgICA8bGk+SW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMgb3IgZW1wbG95ZXJzIHRoYXQgdHJhY2sgdGhlIHBhZ2VzIHlvdSB2aXNpdDwvbGk+CisgICAgICA8bGk+TWFsaWNpb3VzIHNvZnR3YXJlIHRoYXQgdHJhY2tzIHlvdXIga2V5c3Ryb2tlcyBpbiBleGNoYW5nZSBmb3IgZnJlZSBzbWlsZXlzPC9saT4KKyAgICAgIDxsaT5TdXJ2ZWlsbGFuY2UgYnkgc2VjcmV0IGFnZW50czwvbGk+CisgICAgICA8bGk+UGVvcGxlIHN0YW5kaW5nIGJlaGluZCB5b3U8L2xpPgorICAgIDwvdWw+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfaW4ueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vYW5pbWF0b3JfZmFkZV9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPG9iamVjdEFuaW1hdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIKKy8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX291dC54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9hbmltYXRvcl9mYWRlX291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNjU5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2FuaW1hdG9yX2ZhZGVfb3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxvYmplY3RBbmltYXRvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2FjY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxLjAiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIwLjAiCisgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2VudGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FmYTJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXIueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVYIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9kZWNlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMSIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSItNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ0cmFuc2xhdGlvblgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+Cis8L3NldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9leGl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X2Nsb3NlX2V4aXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTRhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvYW5pbS9mcmFnbWVudF9jbG9zZV9leGl0LnhtbApAQCAtMCwwICsxLDQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iLjUiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iLjUiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InRyYW5zbGF0aW9uWCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKzwvc2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZW50ZXIueG1sIGIvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9lbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyZjYwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZW50ZXIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2RlY2VsZXJhdGVfaW50ZXJwb2xhdG9yIgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ic2NhbGVYIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vZGVjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIyIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVkiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjQwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vZnJhZ21lbnRfb3Blbl9leGl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyNjBiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL2ZyYWdtZW50X29wZW5fZXhpdC54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vYWNjZWxlcmF0ZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSIxIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjIiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJzY2FsZVgiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIi8+CisgICAgPG9iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6aW50ZXJwb2xhdG9yPSJAYW5pbS9hY2NlbGVyYXRlX2ludGVycG9sYXRvciIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMiIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InNjYWxlWSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiLz4KKyAgICA8b2JqZWN0QW5pbWF0b3IKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImZsb2F0VHlwZSIKKyAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9ImFscGhhIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorICAgIDxvYmplY3RBbmltYXRvcgorICAgICAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSItNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0idHJhbnNsYXRpb25YIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19tZWRpdW1BbmltVGltZSIvPgorPC9zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX2luX25vX2FscGhhLnhtbCBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZDY5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9hbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCTx0cmFuc2xhdGUgYW5kcm9pZDpmcm9tWURlbHRhPSItMTAwJXAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiLz4KKzwvc2V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYS54bWwgYi9jb3JlL3Jlcy9yZXMvYW5pbS9wdXNoX2Rvd25fb3V0X25vX2FscGhhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI0NzRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2FuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYS54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNldCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCTx0cmFuc2xhdGUgYW5kcm9pZDpmcm9tWURlbHRhPSIwIiBhbmRyb2lkOnRvWURlbHRhPSIxMDAlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtZW4taGRwaS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1lbi1oZHBpL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTc2Mzc1Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1lbi1oZHBpL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyZTJiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJlMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGEwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMWUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhM2M1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY0MTgxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc1NGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTA2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA1NDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDU0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyNjhkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjNGFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTM5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyOWU0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZWFjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGY0NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NoZWNrX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFjOTdkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2M4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ZWYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJiZjExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFhZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YmQxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwZGJlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWFlMzZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTBkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyMjM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNWY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdmYTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGViNDVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfZGlzYWJsZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDYwMzAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvY29tYm9ib3hfbm9oaWdobGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCmluZGV4IDk5YTY3YjkuLjQxYjc3NmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IGNmZTI1OGIuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKaW5kZXggMzM4ZDg0MC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmluZGV4IGQyMWFhZDIuLjYwZTJjYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCmluZGV4IDYzODU5ZjcuLmNmMzQ2MTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwppbmRleCA5OWE2N2I5Li40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKaW5kZXggNWM1MzdlZS4uZWI3NWEyMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKaW5kZXggNzAyYjg3OC4uNTVhNWU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA4ZjM1MzE1Li42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3ZGFmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhMTViMS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9iYWNrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGIzMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5NmE2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MGM1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM2ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYnRuX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfZmluZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZpbmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWM2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X2ZpbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjNjI0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwppbmRleCBjNDAyMzNlLi5hYjM3N2Q4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRjOWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMTZiOTkuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3ZGExNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCmluZGV4IDE2NzZjYTcuLmJkNzQ0MjYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJiYTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IGJhNzljZjcuLmQxOGQ2ZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3ODZlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVhODZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNDNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCmluZGV4IGJkY2IzNzguLjRmYmZhNGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKaW5kZXggZmEyN2VlNC4uODEwYzk1MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaXRlbV9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvc3ltX2FjdGlvbl9jYWxsLnBuZwppbmRleCAxMDVmN2QwLi5kYThhZmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9zeW1fYWN0aW9uX2NhbGwucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3N5bV9hY3Rpb25fY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRfc2VsZWN0X2hhbmRsZS5wbmcKaW5kZXggODBkNDhhYi4uOTNhNWExNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dF9zZWxlY3RfaGFuZGxlLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0X3NlbGVjdF9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdkMDRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTJlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMjRiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjE4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2NDM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY1M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDliOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjUzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0OWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb2ZmLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDczZGI0OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29mZi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbGFuZC1oZHBpL2ljX2pvZ19kaWFsX3NvdW5kX29uLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGRhNmUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfc291bmRfb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhbmQtaGRwaS9pY19qb2dfZGlhbF91bmxvY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOWFmMWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYW5kLWhkcGkvaWNfam9nX2RpYWxfdW5sb2NrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDNmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllOWZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwM2ZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMmVjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExYmIxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTBlYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyOGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGUxMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9mb2N1c2VkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2VmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5NzJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9kaXNhYmxlX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGQ1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3ODA4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc1M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NoZWNrX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGRkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODY4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MDFjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMWM2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI4N2YzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNTIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3ByZXNzZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzYjliMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmNzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb2ZmX3NlbGVjdGVkX2hvbG9fbGlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc1NGUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDc0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25faG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y5MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTM1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fcHJlc3NlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjZmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fcmFkaW9fb25fc2VsZWN0ZWRfaG9sb19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkZDhlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyZGI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X2Rpc2FibGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9jb21ib2JveF9ub2hpZ2hsaWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2MzMxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbWJvYm94X25vaGlnaGxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodC45LnBuZwppbmRleCAzOTUyMjdhLi40MWI3NzZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodF9vcGFxdWUuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwppbmRleCA1YzUzN2VlLi5lYjc1YTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfYnJpZ2h0X29wYXF1ZS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCmluZGV4IGJmNDVlMzguLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwppbmRleCA5NDQ0ZjBkLi42MGUyY2IyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kaW1fZGFyay45LnBuZwppbmRleCAwODgzOGNhLi5jZjM0NjEzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX2hvcml6b250YWxfZGltX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2RpbV9kYXJrLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKaW5kZXggMzk1MjI3YS4uNDFiNzc2YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9icmlnaHRfb3BhcXVlLjkucG5nCmluZGV4IDVjNTM3ZWUuLmViNzVhMjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfYnJpZ2h0X29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2JyaWdodF9vcGFxdWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrLjkucG5nCmluZGV4IDcwMmI4NzguLjU1YTVlNTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfdmVydGljYWxfZGFya19vcGFxdWUuOS5wbmcKaW5kZXggOGYzNTMxNS4uNjBlMmNiMiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl92ZXJ0aWNhbF9kYXJrX29wYXF1ZS45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaXZpZGVyX3ZlcnRpY2FsX2Rhcmtfb3BhcXVlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lbW9faW1fZW1iYXJyYXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZW1vX2ltX2VtYmFycmFzc2VkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9yZXMvcmVzL2RyYXdhYmxlL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKcmVuYW1lIHRvIGNvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2Vtb19pbV9lbWJhcnJhc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYWdncmVnYXRlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZTJiMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19hZ2dyZWdhdGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmZjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2JhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX25leHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYzI0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX2ZpbmRfcHJldi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzZGExZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9maW5kX3ByZXYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2J0bl9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNmNmNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYnRuX25leHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfZmluZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZpbmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTYzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X2ZpbmQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjNzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2RlZmF1bHRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZGZmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kZWZhdWx0X2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZC45LnBuZwppbmRleCBiZjk3MGIwLi42MGYxOWZlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk5MjYxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXMuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTI0MTU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1cy45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzZWRfc2VsZWN0ZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMGMxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzLjkucG5nCmluZGV4IDVjYmIyNTEuLjc4MTc2NjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9sb25ncHJlc3MuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzcy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZmYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xvbmdwcmVzc19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCmluZGV4IDAyYjRlOWEuLjE1MzFkOWQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3ByZXNzZWRfbGlnaHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjMWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9zZWxlY3RlZF9saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg2MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfZm9jdXMuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWM1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X2ZvY3VzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfcHJlc3MuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjY1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfc2VsZWN0ZWQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmEyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9taW5pdGFiX2x0X3NlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDUxY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL21pbml0YWJfbHRfdW5zZWxlY3RlZF9wcmVzcy45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTQ0NGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvcXVpY2tjb250YWN0X25vYmFkZ2UuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3F1aWNrY29udGFjdF9ub2JhZGdlLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCmluZGV4IGJkY2IzNzguLmMwNzk2MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaXRlbV9hcHBfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhMmNjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAwM2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM4MmRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWIxMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU5MjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfZGlzYWJsZWRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2RhcmsuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfcHJlc3NlZF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUwOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTdjMjRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RleHRmaWVsZF9zZWxlY3RlZF9ob2xvX2xpZ2h0LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTA5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3NzgwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbm9kcGkvcGxhdGxvZ28uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW5vZHBpL3BsYXRsb2dvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1ub2RwaS9wbGF0bG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNhZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmE4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWY1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb2NrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDVlMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG9jay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDliNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI5ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZDFkMmQ0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY4NTg3OGEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg5ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfY29udGV4dF9iYWNrZ3JvdW5kLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8Z3JhZGllbnQKKyAgICAgICAgYW5kcm9pZDpzdGFydENvbG9yPSIjZmYwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6Y2VudGVyQ29sb3I9IiNmZmQxZDJkNCIKKyAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iI2ZmODU4NzhhIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSIyNzAiIC8+Cis8L3NoYXBlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYWN0aW9uX2Jhcl9kaXZpZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzMDlmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2FjdGlvbl9iYXJfZGl2aWRlci54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGdyYWRpZW50CisgICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iI2ZmZTFlMmU0IgorICAgICAgICBhbmRyb2lkOmVuZENvbG9yPSIjZmY5NTk3OWEiCisgICAgICAgIGFuZHJvaWQ6YW5nbGU9IjI3MCIgLz4KKzwvc2hhcGU+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDwhLS0gRW5hYmxlZCBzdGF0ZXMgLS0+CisgICAgICAgIAorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25faG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9ob2xvX2RhcmsiIC8+CisKKworICAgIDwhLS0gRGlzYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfZGlzYWJsZV9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19kYXJrIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMTZmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfaG9sb19saWdodC54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8IS0tIEVuYWJsZWQgc3RhdGVzIC0tPgorICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9jaGVja19vZmZfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2hvbG9fbGlnaHQiIC8+CisKKworICAgIDwhLS0gRGlzYWJsZWQgc3RhdGVzIC0tPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2hvbG9fbGlnaHQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29uX2Rpc2FibGVfZm9jdXNlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX2NoZWNrX29mZl9kaXNhYmxlX2ZvY3VzZWRfaG9sb19saWdodCIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb2ZmX2Rpc2FibGVfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fY2hlY2tfb25fZGlzYWJsZV9ob2xvX2xpZ2h0IiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODRmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvYnRuX3JhZGlvX2hvbG9fZGFyay54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9ob2xvX2RhcmsiIC8+CisgICAgICAgICAgCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9wcmVzc2VkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2RhcmsiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfc2VsZWN0ZWRfaG9sb19kYXJrIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9ob2xvX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNTA4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9idG5fcmFkaW9faG9sb19saWdodC54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICAgICAgICAKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29uX3ByZXNzZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9ImZhbHNlIiBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfcHJlc3NlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiCisgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vbl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnRuX3JhZGlvX29mZl9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J0bl9yYWRpb19vZmZfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9idG5fcmFkaW9fb25faG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkMjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19kYXJrLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV93aW5kb3dfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kZWZhdWx0X2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3ByZXNzZWRfaG9sb19kYXJrIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX3NlbGVjdGVkX2hvbG9fZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2Rpc2FibGVkX2hvbG9fZGFyayIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTM5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvZWRpdF90ZXh0X2hvbG9fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvdGV4dGZpZWxkX2RlZmF1bHRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9wcmVzc2VkX2hvbG9fbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfc2VsZWN0ZWRfaG9sb19saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGVmYXVsdF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3RleHRmaWVsZF9kaXNhYmxlZF9zZWxlY3RlZF9ob2xvX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS90ZXh0ZmllbGRfZGlzYWJsZWRfaG9sb19saWdodCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiNjU5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdGVkX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9zZWxlY3RlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3NlbGVjdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWZjMWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZF9saWdodC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9mb2N1c2VkX3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiICBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfc2VsZWN0ZWRfbGlnaHQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCmluZGV4IGJjYTk5NmMuLjBhNTExNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQueG1sCkBAIC0xNiwyMiArMTYsMTQgQEAKIAogPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfd2luZG93X2ZvY3VzZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAY29sb3IvdHJhbnNwYXJlbnQiIC8+CiAKICAgICA8IS0tIEV2ZW4gdGhvdWdoIHRoZXNlIHR3byBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSwgaGF2ZSB0d28gc3RhdGVzIHNvIHRoZSBkcmF3YWJsZSB3aWxsIGludmFsaWRhdGUgaXRzZWxmIHdoZW4gY29taW5nIG91dCBvZiBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGlzYWJsZWQiIC8+Ci0KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF90cmFuc2l0aW9uIiAvPgotCi0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2ZvY3VzIiAvPgotCisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdCIgLz4KKyAgICAKIDwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzk4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3dpbmRvd19mb2N1c2VkPSJmYWxzZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGNvbG9yL3RyYW5zcGFyZW50IiAvPgorCisgICAgPCEtLSBFdmVuIHRob3VnaCB0aGVzZSB0d28gcG9pbnQgdG8gdGhlIHNhbWUgcmVzb3VyY2UsIGhhdmUgdHdvIHN0YXRlcyBzbyB0aGUgZHJhd2FibGUgd2lsbCBpbnZhbGlkYXRlIGl0c2VsZiB3aGVuIGNvbWluZyBvdXQgb2YgcHJlc3NlZCBzdGF0ZS4gLS0+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJ0cnVlIiAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJmYWxzZSIgYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX2Rpc2FibGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0iZmFsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9kaXNhYmxlZF9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9InRydWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZm9jdXNlZF9saWdodCIgLz4KKyAgICA8aXRlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfZGVmYXVsdF9saWdodCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfdHJhbnNpdGlvbl9saWdodC54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbGlzdF9zZWxlY3Rvcl9iYWNrZ3JvdW5kX3RyYW5zaXRpb25fbGlnaHQueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8dHJhbnNpdGlvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0b3JfYmFja2dyb3VuZF9wcmVzc2VkX2xpZ2h0IiAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbG9uZ3ByZXNzX2xpZ2h0IiAgLz4KKzwvdHJhbnNpdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9taW5pdGFiX2x0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL21pbml0YWJfbHQueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9zZWxlY3RlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF9wcmVzcyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIgorICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3NlbGVjdGVkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIKKyAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbWluaXRhYl9sdF91bnNlbGVjdGVkX3ByZXNzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9taW5pdGFiX2x0X3Vuc2VsZWN0ZWQiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZWRnZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvb3ZlcnNjcm9sbF9lZGdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwYzgyNy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvb3ZlcnNjcm9sbF9lZGdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9vdmVyc2Nyb2xsX2dsb3cucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjQ1NmQuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL292ZXJzY3JvbGxfZ2xvdy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZmEwZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGJ1YmJsZV93aXRoX2NoYXRzLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBHb29nbGUgSW5jLgotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3NlbGVjdGVkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfaGlnaGxpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9ImZhbHNlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9oaWdobGlnaHQuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjUwYjMuLjAwMDAwMDAKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL3F1aWNrY29udGFjdF9ub2JhZGdlX2hpZ2hsaWdodC45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2Vfbm9ybWFsLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjOWRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9ub3JtYWwuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvcXVpY2tjb250YWN0X25vYmFkZ2VfcHJlc3NlZC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyYzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9xdWlja2NvbnRhY3Rfbm9iYWRnZV9wcmVzc2VkLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjI5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9sYXlvdXQva2V5Z3VhcmQueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjBkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyMGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjBkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIyMGRpcCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNmZjAwMDAwMCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIgCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2tleWd1YXJkX2xhYmVsX3RleHQiIC8+Cis8L0xpbmVhckxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX2dsb2dpbl91bmxvY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fZ2xvZ2luX3VubG9jay54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICAgICAgPgorICAgIDxTY3JvbGxWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAK2lkL2VtZXJnZW5jeUNhbGwiPgorICAgICAgICA8UmVsYXRpdmVMYXlvdXQgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyAKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RvcEhlYWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfbG9ja19pZGxlX2xvY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjVkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgICAgICA8IS0tIHNwYWNlciBiZWxvdyBoZWFkZXIgLS0+CisgICAgICAgICAgICA8VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyVG9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdG9wSGVhZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIi8+CisgICAgICAgIAorICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQCtpZC9zcGFjZXJUb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjlkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZ2xvZ2luX2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbG9naW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2luc3RydWN0aW9ucyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2dsb2dpbl91c2VybmFtZV9oaW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0RW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIAorICAgICAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbG9naW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5fcGFzc3dvcmRfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5leHRGb2N1c1JpZ2h0PSJAK2lkL29rIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmV4dEZvY3VzRG93bj0iQCtpZC9vayIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgICAgIDwhLS0gb2sgYmVsb3cgcGFzc3dvcmQsIGFsaWduZWQgdG8gcmlnaHQgb2Ygc2NyZWVuIC0tPgorICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Ijg1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI3ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9nbG9naW5fc3VibWl0X2J1dHRvbiIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAKKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICA8L1Njcm9sbFZpZXc+CisgICAgCisgICAgPCEtLSBzcGFjZXIgYWJvdmUgZW1lcmdlbmN5IGNhbGwgLS0+CisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjRkaXAiCisKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKworICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIGF0IGJvdHRvbSBjZW50ZXIgLS0+CisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fbG9jay54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fbG9jay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzYTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9sb2NrLnhtbApAQCAtMCwwICsxLDIyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisgICAgICAgIAorPCEtLSBUaGlzIGlzIHRoZSBnZW5lcmFsIGxvY2sgc2NyZWVuIHdoaWNoIHNob3dzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICBzdGF0ZSBvZiB0aGUgZGV2aWNlLCBhcyB3ZWxsIGFzIGluc3RydWN0aW9ucyBvbiBob3cgdG8gZ2V0IHBhc3QgaXQKKyAgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLiAgSXQgaXMgdGhlIHNhbWUgZm9yIGxhbmRzY2FwZQorICBhbmQgcG9ydHJhaXQuLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmODAwMDAwIgorICAgICAgICA+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjE1ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjIwZGlwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3BvcHVwX2Z1bGxfZGFyayIKKyAgICAgICAgPgorCisgICAgICAgIDwhLS0gd2hlbiBzaW0gaXMgcHJlc2VudCAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltT2sxIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzNHNwIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbU9rMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzRzcCIvPgorCisgICAgICAgIDwhLS0gd2hlbiBzaW0gaXMgbWlzc2luZyAvIGxvY2tlZCAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyU2ltQmFkMSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclNpbUJhZDIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjdkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjdkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIi8+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgY2FycmllciBpbmZvIC8gc2ltIG1lc3NhZ2VzIC0tPgorICAgICAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiLz4KKworICAgICAgICA8IS0tIHRpbWUgYW5kIGRhdGUgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjM0c3AiLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIi8+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgdGltZSBhbmQgZGF0ZSAtLT4KKyAgICAgICAgPFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBiYXR0ZXJ5IGluZm8gLS0+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5SW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgID4KKworICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvSWNvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeUluZm9UZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgYmF0dGVyeSBpbmZvIC0tPgorICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnlJbmZvU3BhY2VyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tIG5leHQgYWxhcm0gaW5mbyAtLT4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbmV4dEFsYXJtSW5mbyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgID4KKworICAgICAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYXNlbGluZUFsaWduZWQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2xvY2tfaWRsZV9hbGFybSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25leHRBbGFybVRleHQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPCEtLSBzcGFjZXIgYWZ0ZXIgYWxhcm0gaW5mbyAtLT4KKyAgICAgICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uZXh0QWxhcm1TcGFjZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIvPgorCisgICAgICAgIDwhLS0gbG9jayBpY29uIHdpdGggJ3NjcmVlbiBsb2NrZWQnIG1lc3NhZ2UKKyAgICAgICAgICAgICAoc2hvd24gd2hlbiBTSU0gY2FyZCBpcyBwcmVzZW50KSAtLT4KKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3NjcmVlbkxvY2tlZEluZm8iCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICA+CisKKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19sb2NrX2lkbGVfbG9jayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX3NjcmVlbl9sb2NrZWQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDwhLS0gbWVzc2FnZSBhYm91dCBob3cgdG8gdW5sb2NrCisgICAgICAgICAgICAgKHNob3duIHdoZW4gU0lNIGNhcmQgaXMgcHJlc2VudCkgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2tJbnN0cnVjdGlvbnMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiLz4KKworCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIG1pc3Npbmcgb3IgUFVLZCAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDg3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbApAQCAtMCwwICsxLDkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICA+CisgICAgCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8IS0tIHJpZ2h0IHNpZGU6IHBhc3N3b3JkIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciI+CisKKyAgICAgICAgPCEtLSBQYXNzd29yZCBlbnRyeSBmaWVsZCAtLT4KKyAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRFbnRyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiCisgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcGFzc3dvcmRfZmllbGRfZGVmYXVsdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjZmZmZmZmZmYiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gTnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiMwMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5QmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9rZXlib2FyZF9rZXlfZnVsbHRyYW5zIgorICAgICAgICAvPgorICAgICAgICA8IS0tIEFscGhhbnVtZXJpYyBrZXlib2FyZCAtLT4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5QYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5Ym9hcmRBbHBoYSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0NTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjIzMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTI3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgID4KKyAgICAKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDwhLS0gcmlnaHQgc2lkZTogcGFzc3dvcmQgLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIj4KKworICAgICAgICA8IS0tIFBhc3N3b3JkIGVudHJ5IGZpZWxkIC0tPgorICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZEVudHJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9wYXNzd29yZF9maWVsZF9kZWZhdWx0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNmZmZmZmZmZiIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPCEtLSBOdW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMzBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDprZXlCYWNrZ3JvdW5kPSJAZHJhd2FibGUvYnRuX2tleWJvYXJkX2tleV9mdWxsdHJhbnMiCisgICAgICAgIC8+CisgICAgICAgIDwhLS0gQWxwaGFudW1lcmljIGtleWJvYXJkIC0tPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXlib2FyZEFscGhhIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjMwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjMDAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUJhY2tncm91bmQ9IkBkcmF3YWJsZS9idG5fa2V5Ym9hcmRfa2V5X2Z1bGx0cmFucyIKKyAgICAgICAgLz4KKworICAgICAgICA8IS0tIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc2ltX3Bpbl9sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGNiZTUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fbGFuZHNjYXBlLnhtbApAQCAtMCwwICsxLDEyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2RhcmsiCisgICAgICAgID4KKworICAKKyAgICA8IS0tIHJpZ2h0IHNpZGUgLS0+CisgICAgPCEtLSBoZWFkZXIgdGV4dCAoJ0VudGVyIFBpbiBDb2RlJykgLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0c3AiCisgICAgICAgICAgICAvPgorCisgICAgPCEtLSBDYXJyaWVyIGluZm8gLS0+CisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWJvdmU9IkAraWQvcGluRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjlkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdHxib3R0b20iCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgLz4KKworICAgIDwhLS0gZGlzcGxheXMgZG90cyBhcyB1c2VyIGVudGVycyBwaW4gLS0+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3BpbkRpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmFkZFN0YXRlc0Zyb21DaGlsZHJlbj0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0IgorICAgID4KKworICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9waW5EaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tzcGFjZSIKKyAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyZGlwIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyZGlwIgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMmRpcCIKKyAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL29rIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySG9yaXpvbnRhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zaW1fcGluX3BvcnRyYWl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDkxNDhmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3NpbV9waW5fcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2RhcmsiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCI+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvdG9wRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgIDwhLS0gaGVhZGVyIHRleHQgKCdFbnRlciBQaW4gQ29kZScpIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXJUZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2UiLz4KKworICAgICAgICA8IS0tIENhcnJpZXIgaW5mbyAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI5ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iLz4KKworICAgICAgICA8IS0tIHBhc3N3b3JkIGVudHJ5IC0tPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dCI+CisKKyAgICAgICAgICAgIDwhLS0gZGlzcGxheXMgZG90cyBhcyB1c2VyIGVudGVycyBwaW4gLS0+CisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9waW5EaXNwbGF5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZUludmVyc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tzcGFjZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9Ii0zZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iLTNkaXAiCisgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPGluY2x1ZGUKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9rZXlQYWQiCisgICAgICAgIGxheW91dD0iQGFuZHJvaWQ6bGF5b3V0L3R3ZWx2ZV9rZXlfZW50cnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdG9wRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZGlwIgorICAgIC8+CisKKyAgICA8IS0tIHNwYWNlciBiZWxvdyBrZXlwYWQgLS0+CisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXJCb3R0b20iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgLz4KKworICAgIDwhLS0gVGhlIGVtZXJnZW5jeSBidXR0b24gc2hvdWxkIHRha2UgdGhlIHJlc3Qgb2YgdGhlIHNwYWNlIGFuZCBiZSBjZW50ZXJlZCB2ZXJ0aWNhbGx5IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAYW5kcm9pZDpkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4OTg2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwKQEAgLTAsMCArMSwxMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFN0YXR1cyB0byBzaG93IG9uIHRoZSBsZWZ0IHNpZGUgb2YgbG9jayBzY3JlZW4gLS0+Cis8TGluZWFyTGF5b3V0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE3c3AiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMyZGlwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgID4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0MwMDAwMDAwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHk9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iMy4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICAgICAgLz4KKworCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMwc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2s+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIC8+CisKKyAgICA8IS0tIHVzZWQgZm9yIGluc3RydWN0aW9ucyBzdWNoIGFzICJkcmF3IHBhdHRlcm4gdG8gdW5sb2NrIiwgdGhlIG5leHQgYWxhcm0sIGFuZCBjaGFyZ2luZworICAgICAgICAgc3RhdHVzLiAgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgLz4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxNWRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgLz4KKyAgICAgICAgCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvcGVydHlPZiIKKyAgICAgICAgYW5kcm9pZDpsaW5lU3BhY2luZ0V4dHJhPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODk4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBTdGF0dXMgdG8gc2hvdyBvbiB0aGUgbGVmdCBzaWRlIG9mIGxvY2sgc2NyZWVuIC0tPgorPExpbmVhckxheW91dAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgID4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxN3NwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMmRpcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgLz4KKworICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICA+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyMHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93Q29sb3I9IiNDMDAwMDAwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93RHg9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R5PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjMuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIC8+CisKKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMHNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjQzAwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0R4PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dEeT0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIzLjAiCisgICAgICAgICAgICAvPgorCisgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdGltZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMnNwIgorICAgICAgICAvPgorCisgICAgPCEtLSB1c2VkIGZvciBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZHJhdyBwYXR0ZXJuIHRvIHVubG9jayIsIHRoZSBuZXh0IGFsYXJtLCBhbmQgY2hhcmdpbmcKKyAgICAgICAgIHN0YXR1cy4gIC0tPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyc3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIC8+CisgICAgICAgIAorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb3BlcnR5T2YiCisgICAgICAgIGFuZHJvaWQ6bGluZVNwYWNpbmdFeHRyYT0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2MTgwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4gIEl0IGlzIHRoZSBzYW1lIGZvciBsYW5kc2NhcGUKKyAgYW5kIHBvcnRyYWl0Li0tPgorPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0YWJ1bmxvY2s9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQudGFidW5sb2NrIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjNzAwMDAwMDAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3N0YXR1czIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90YWJfc2VsZWN0b3IiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8IS0tICJlbWVyZ2VuY3kgY2FsbHMgb25seSIgc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2NhcnJpZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxzX29ubHkiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgorICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9SZWxhdGl2ZUxheW91dD4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM5OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgZ2VuZXJhbCBsb2NrIHNjcmVlbiB3aGljaCBzaG93cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgc3RhdGUgb2YgdGhlIGRldmljZSwgYXMgd2VsbCBhcyBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGdldCBwYXN0IGl0CisgIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmljZS4tLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnRhYnVubG9jaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC50YWJ1bmxvY2siCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzcwMDAwMDAwIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCI+CisKKyAgICA8IS0tIGxlZnQgc2lkZTogc3RhdHVzIGFuZCBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgPgorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSByaWdodCBzaWRlIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2NyZWVuTG9ja2VkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9zdGF0dXMyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90YWJfc2VsZWN0b3IiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgICAgICAvPgorICAgICAgICAgICAgCisgICAgICAgIDwhLS0gImVtZXJnZW5jeSBjYWxscyBvbmx5IiBzaG93biB3aGVuIHNpbSBpcyBtaXNzaW5nIG9yIFBVS2QgLS0+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbHNfb25seSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICAgICAvPgorCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcworICAgICAgICAgICAgIGhpZGRlbiAtLT4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNjM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKKyAgICAgdGhlIHVzZXIgaG93IHRvIHVubG9jayB0aGVpciBkZXZpY2UsIG9yIG1ha2UgYW4gZW1lcmdlbmN5IGNhbGwuICBUaGlzCisgICAgIGlzIHRoZSBwb3J0cmFpdCBsYXlvdXQuICAtLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorCisgICAgPCEtLSBsZWZ0IHNpZGU6IHN0YXR1cyBhbmQgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgCisgICAgICAgIDxpbmNsdWRlIGxheW91dD0iQGxheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQiIC8+CisKKyAgICAgICAgPCEtLSBmb290ZXIgLS0+CisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgorICAgICAgICAgICAgPgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAxOiBhIHNpbmdsZSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJOb3JtYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQWxvbmUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgICAgIDwhLS0gb3B0aW9uIDI6IGFuIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiwgYW5kIGEgJ2ZvcmdvdCBwYXR0ZXJuPycgYnV0dG9uIC0tPgorICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3RlckZvcmdvdFBhdHRlcm4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVG9nZXRoZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPCEtLSByaWdodCBzaWRlOiBsb2NrIHBhdHRlcm4gLS0+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgID4KKyAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcgYW5kcm9pZDppZD0iQCtpZC9sb2NrUGF0dGVybiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOTBkaXAiCisgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZDc5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgID4KKworICAgIDwhLS0gbGVmdCBzaWRlOiBzdGF0dXMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICA+CisgICAgICAgIAorICAgICAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0IiAvPgorCisgICAgICAgIDwhLS0gZm9vdGVyIC0tPgorICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE0MGRpcCIKKyAgICAgICAgICAgID4KKworICAgICAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgorICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyTm9ybWFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgICAgICA8IS0tIG9wdGlvbiAyOiBhbiBlbWVyZ2VuY3kgY2FsbCBidXR0b24sIGFuZCBhICdmb3Jnb3QgcGF0dGVybj8nIGJ1dHRvbiAtLT4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gcmlnaHQgc2lkZTogbG9jayBwYXR0ZXJuIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9ja1BhdHRlcm4iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzUwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjUwZGlwIgorICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxpbmVhckxheW91dFdpdGhEZWZhdWx0VG91Y2hSZWNlcGllbnQ+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAyNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgYW4gb3B0aW1pemVkIGxheW91dCBmb3IgYSBzY3JlZW4gd2l0aCB0aGUgQWN0aW9uIEJhciBlbmFibGVkLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDppbkFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX2luX25vX2FscGhhIgorICAgICAgICBhbmRyb2lkOm91dEFuaW1hdGlvbj0iQGFuaW0vcHVzaF9kb3duX291dF9ub19hbHBoYSI+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU3R5bGUiIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQWN0aW9uQmFyQ29udGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2NvbnRleHRfYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZVN0eWxlIiAvPgorICAgIDwvVmlld0FuaW1hdG9yPgorICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kR3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsfHRvcCIKKyAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGgKK3RoZSBBY3Rpb24gQmFyIGVuYWJsZWQgb3ZlcmxheWluZyBhcHBsaWNhdGlvbiBjb250ZW50LgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3AiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IgorICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIiAvPgorPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC14bGFyZ2Uvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0YjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iN2RwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZHAiCisgICAgICAgID4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RwIgorICAgICAgICA+CisgICAgICAgIDwhLS1jb20uYW5kcm9pZC5zZXJ2ZXIuc3RhdHVzLkFuaW1hdGVkSW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIgLS0+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9hcnJvd19kb3duX2Zsb2F0Ii8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkcCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxhbmRyb2lkLndpZGdldC5EYXRlVGltZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRwIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3RpdGxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIiAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfc3VidGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LkFjdGlvbk1lbnVJdGVtVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ltYWdlQnV0dG9uIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICBzdHlsZT0iP2F0dHIvYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3RleHRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Cis8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tZW51X2xheW91dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkNTUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfbGF5b3V0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbW9kZV9iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9tb2RlX2Jhci54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJDb250ZXh0VmlldworICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nLnhtbAppbmRleCAyNWE0MWY4Li5iNzQ2ZDI4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbGVydF9kaWFsb2cueG1sCkBAIC04MCw4ICs4MCw3IEBACiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjEyZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTRkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOm92ZXJzY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCI+CiAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tZXNzYWdlIgogICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCkBAIC0xMTMsNyArMTEyLDcgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iNGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dXNlTGFyZ2VzdENoaWxkPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgogICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9jb250YWN0X2hlYWRlci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0NjdkMy4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2NvbnRhY3RfaGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhbm5lciIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvdGl0bGVfYmFyX21lZGl1bSIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCI+Ci0KLSAgICA8YW5kcm9pZC53aWRnZXQuUXVpY2tDb250YWN0QmFkZ2UgYW5kcm9pZDppZD0iQCtpZC9waG90byIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iLTFkaXAiCi0gICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlF1aWNrQ29udGFjdEJhZGdlLldpbmRvd1NtYWxsIiAvPgotICAgIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FnZ3JlZ2F0ZV9iYWRnZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iM2RpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2FnZ3JlZ2F0ZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0JCMDAwMDAwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hhZG93UmFkaXVzPSIyLjc1IgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Bob25ldGljX25hbWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXNfZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcmVzZW5jZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAvPgotCi0gICAgPENoZWNrQm94Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9kZXNjcmlwdGlvbl9zdGFyIgotICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9zdGFyU3R5bGUiIC8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZS54bWwKaW5kZXggYWI2NzVjNy4uM2Q1MmY3MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9sYW5kc2NhcGUueG1sCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KICAgICAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9lbnRlcl9wYXNzd29yZF9sYWJlbCIKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9wYXNzd29yZF9wb3J0cmFpdC54bWwKaW5kZXggOWVlODc4MS4uYWY4YTNlZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fcGFzc3dvcmRfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX3BvcnRyYWl0LnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgogCiAgICAgPCEtLSAiRW50ZXIgUElOKFBhc3N3b3JkKSB0byB1bmxvY2siIC0tPgotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3Bhc3N3b3JkX2xhYmVsIgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBjMWI0MDZmLi44MzM4MWExIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbApAQCAtNTgsMTggKzU4LDE5IEBACiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgogICAgICAgICAgICAgLz4KKwogICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKICAgICAgICAgICAgID4KIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKQEAgLTg0LDggKzg1LDkgQEAKIAogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXkiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIyc3AiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAppbmRleCA3NGEwZWVlLi44ZGFjZmFmIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTU1LDEyICs1NSwxMiBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCiAgICAgICAgICAgICA+CiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjU2c3AiCkBAIC03NCw4ICs3NCw5IEBACiAKICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FtX3BtIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvdGltZURpc3BsYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnQueG1sCmluZGV4IDZmOWYxZTAuLjE0MTQwMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudC54bWwKQEAgLTEsOCArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPCEtLQotLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCkBAIC0xNyw4ICsxNSw0MiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogLS0+Ci08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9saXN0IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIAotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIC8+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzQ29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiPgorICAgICAgICAKKyAgICAgICAgPFByb2dyZXNzQmFyIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVMYXJnZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvYWRpbmciCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAKKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0Q29udGFpbmVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisgICAgICAgICAgICAKKyAgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaW50ZXJuYWxFbXB0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIgLz4KKyAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICAKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2xpc3RfY29udGVudF9zaW1wbGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjlmMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9saXN0X2NvbnRlbnRfc2ltcGxlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vYXNzZXRzL3Jlcy9sYXlvdXQvbGlzdF9jb250ZW50LnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpkcmF3U2VsZWN0b3JPblRvcD0iZmFsc2UiCisgICAgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvbG9jYWxlX3BpY2tlcl9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNmNWFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9sb2NhbGVfcGlja2VyX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjVkaXAiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbG9jYWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIC8+Cis8L0xpbmVhckxheW91dCA+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfZGlhbG9nX2VkaXR0ZXh0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9kaWFsb2dfZWRpdHRleHQueG1sCmluZGV4IGI0MWU3NzQuLjViZTU3NzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9kaWFsb2dfZWRpdHRleHQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9kaWFsb2dfZWRpdHRleHQueG1sCkBAIC0xNyw4ICsxNyw3IEBACiA8IS0tIExheW91dCB1c2VkIGFzIHRoZSBkaWFsb2cncyBjb250ZW50IFZpZXcgZm9yIEVkaXRUZXh0UHJlZmVyZW5jZS4gLS0+CiA8U2Nyb2xsVmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm92ZXJzY3JvbGxNb2RlPSJpZkNvbnRlbnRTY3JvbGxzIj4KKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CiAKICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9lZGl0dGV4dF9jb250YWluZXIiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2VfbGlzdF9jb250ZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCmluZGV4IDhmODY5ODEuLmZlOTUwYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2NvbnRlbnQueG1sCkBAIC00LDIyICs0LDk2IEBACiAqKgogKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAtLT4KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9ImZhbHNlIgotICAgIGFuZHJvaWQ6c2Nyb2xsYmFyQWx3YXlzRHJhd1ZlcnRpY2FsVHJhY2s9InRydWUiCi0gICAgLz4KKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgICAgICA8TGlzdFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJmYWxzZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhckFsd2F5c0RyYXdWZXJ0aWNhbFRyYWNrPSJ0cnVlIiAvPgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9saXN0X2Zvb3RlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9wcmVmcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9idXR0b25fYmFyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JhY2tfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19idG5fYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2JhY2tfYnV0dG9uX2xhYmVsIgorICAgICAgICAvPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSI+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9za2lwX2J1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2tpcF9idXR0b25fbGFiZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHRfYnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVSaWdodD0iQGRyYXdhYmxlL2ljX2J0bl9uZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSIzZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9uZXh0X2J1dHRvbl9sYWJlbCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2l0ZW0ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4ODhiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV9saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IGZvciBhIHByZWZlcmVuY2UgY2F0ZWdvcnkgaXRlbSwgY29udGFpbmluZyBhbiBpY29uIGFuZCBsYWJlbC4gLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvd2lkZ2V0X2ZyYW1lIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9Ij9hbmRyb2lkOmF0dHIvc2Nyb2xsYmFyU2l6ZSI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuLnhtbAppbmRleCBkZmE5NzMxLi43MmY3MzkyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbi54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW4ueG1sCkBAIC0yNSw2ICsyNSwxMyBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiA+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKICAgICA8IS0tIFRpdGxlIGJhciAtLT4KICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGVfY29udGFpbmVyIgogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1ODQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2FjdGlvbl9iYXIueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGggdGhlIEFjdGlvbiBCYXIgZW5hYmxlZC4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8Vmlld0FuaW1hdG9yIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9hbmltYXRvciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICBhbmRyb2lkOmZvcmVncm91bmQ9Ij9hbmRyb2lkOmF0dHIvd2luZG93Q29udGVudE92ZXJsYXkiIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xvd2VyX2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9hY3Rpb25fYmFyX292ZXJsYXkueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmExZWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fYWN0aW9uX2Jhcl9vdmVybGF5LnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGlzIGlzIGFuIG9wdGltaXplZCBsYXlvdXQgZm9yIGEgc2NyZWVuIHdpdGgKK3RoZSBBY3Rpb24gQmFyIGVuYWJsZWQgb3ZlcmxheWluZyBhcHBsaWNhdGlvbiBjb250ZW50LgorLS0+CisKKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIDxWaWV3QW5pbWF0b3IgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3AiCisgICAgICAgIGFuZHJvaWQ6aW5BbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9pbl9ub19hbHBoYSIKKyAgICAgICAgYW5kcm9pZDpvdXRBbmltYXRpb249IkBhbmltL3B1c2hfZG93bl9vdXRfbm9fYWxwaGEiPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhclZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJhclN0eWxlIiAvPgorICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9jb250ZXh0X2JhciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVTdHlsZSIgLz4KKyAgICA8L1ZpZXdBbmltYXRvcj4KKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IgorICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hY3Rpb25fYmFyX2FuaW1hdG9yIiAvPgorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9sb3dlcl9hY3Rpb25fY29udGV4dF9iYXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9hY3Rpb25CYXJTdHlsZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fY3VzdG9tX3RpdGxlLnhtbAppbmRleCAzNGM5ZGUwLi5jNjJhMDZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9jdXN0b21fdGl0bGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX2N1c3RvbV90aXRsZS54bWwKQEAgLTIxLDYgKzIxLDEzIEBACiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIj4KKyAgICA8IS0tIFBvcG91dCBiYXIgZm9yIGFjdGlvbiBtb2RlcyAtLT4KKyAgICA8Vmlld1N0dWIgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXJfc3R1YiIKKyAgICAgICAgICAgICAgYW5kcm9pZDppbmZsYXRlZElkPSJAK2lkL2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKwogICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiIAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU2l6ZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3Byb2dyZXNzLnhtbAppbmRleCA2ZTY5NGMxLi5jM2Y0MWZhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9wcm9ncmVzcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fcHJvZ3Jlc3MueG1sCkBAIC0yNiw2ICsyNiwxMyBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiA+CisgICAgPCEtLSBQb3BvdXQgYmFyIGZvciBhY3Rpb24gbW9kZXMgLS0+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGVfY29udGFpbmVyIiAKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3NpbXBsZS54bWwKaW5kZXggZGY1MTFjNi4uODdjMjlmNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fc2ltcGxlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl9zaW1wbGUueG1sCkBAIC0yMSw5ICsyMSwxOSBAQAogZW5hYmxlZC4KIC0tPgogCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2NvbnRlbnQiCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmZpdHNTeXN0ZW1XaW5kb3dzPSJ0cnVlIgotICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEluc2lkZVBhZGRpbmc9ImZhbHNlIgotICAgIGFuZHJvaWQ6Zm9yZWdyb3VuZEdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbHx0b3AiCi0gICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPFZpZXdTdHViIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyX3N0dWIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6aW5mbGF0ZWRJZD0iQCtpZC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0PSJAbGF5b3V0L2FjdGlvbl9tb2RlX2JhciIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9jb250ZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kSW5zaWRlUGFkZGluZz0iZmFsc2UiCisgICAgICAgICBhbmRyb2lkOmZvcmVncm91bmRHcmF2aXR5PSJmaWxsX2hvcml6b250YWx8dG9wIgorICAgICAgICAgYW5kcm9pZDpmb3JlZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3dpbmRvd0NvbnRlbnRPdmVybGF5IiAvPgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZS54bWwKaW5kZXggMzllYTEzMS4uZjUxMzRmOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlLnhtbApAQCAtMjIsNiArMjIsMTIgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6Zml0c1N5c3RlbVdpbmRvd3M9InRydWUiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgogICAgIDxGcmFtZUxheW91dAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU2l6ZSIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2NyZWVuX3RpdGxlX2ljb25zLnhtbAppbmRleCA2MmEwMjI4Li41MWQ2YTE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NjcmVlbl90aXRsZV9pY29ucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zY3JlZW5fdGl0bGVfaWNvbnMueG1sCkBAIC0yMyw2ICsyMywxMiBAQAogICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDwhLS0gUG9wb3V0IGJhciBmb3IgYWN0aW9uIG1vZGVzIC0tPgorICAgIDxWaWV3U3R1YiBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9tb2RlX2Jhcl9zdHViIgorICAgICAgICAgICAgICBhbmRyb2lkOmluZmxhdGVkSWQ9IkAraWQvYWN0aW9uX21vZGVfYmFyIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9hY3Rpb25fbW9kZV9iYXIiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgogICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZV9jb250YWluZXIiCiAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlQmFja2dyb3VuZFN0eWxlIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlYXJjaF92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI5YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWFyY2hfdmlldy54bWwKQEAgLTAsMCArMSwxMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLS0+Cis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhciIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIj4KKworICAgIDwhLS0gVGhpcyBpcyBhY3R1YWxseSB1c2VkIGZvciB0aGUgYmFkZ2UgaWNvbiAqb3IqIHRoZSBiYWRnZSBsYWJlbCAob3IgbmVpdGhlcikgLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2JhZGdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyZGlwIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZSIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjM2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NlYXJjaCIKKyAgICAvPgorCisgICAgPCEtLSBJbm5lciBsYXlvdXQgY29udGFpbnMgdGhlIGFwcCBpY29uLCBidXR0b24ocykgYW5kIEVkaXRUZXh0IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaF9hcHBfaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iN2RpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fc2VhcmNoIgorICAgICAgICAvPgorCisgICAgICAgIDxBdXRvQ29tcGxldGVUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfc3JjX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgorICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHR8dGV4dEF1dG9Db21wbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uU2VhcmNoIgorICAgICAgICAgICAgYW5kcm9pZDpkcm9wRG93bldpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25IZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25BbmNob3I9IkBpZC9zZWFyY2hfZWRpdF9mcmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwb3B1cEJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL3NlYXJjaF9kcm9wZG93bl9iYWNrZ3JvdW5kIgorICAgICAgICAvPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2VhcmNoX2Nsb3NlX2J0biIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jbG9zZSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfZ29fYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19idG5fZmluZF9uZXh0IgorICAgIC8+CisKKyAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZWFyY2hfdm9pY2VfYnRuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItNi41ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii03ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTVkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2J0bl9zZWFyY2hfZGlhbG9nX3ZvaWNlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfYnRuX3NwZWFrX25vdyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2cueG1sCmluZGV4IDZlNGU1ZTEuLmM2NjVmN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nLnhtbApAQCAtMzEsNSArMzEsNCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNXB4IgogICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBudWxsIgogICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2JyaWdodCIKLSAgICBhbmRyb2lkOnNjcm9sbGJhcnM9InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6b3ZlcnNjcm9sbE1vZGU9ImlmQ29udGVudFNjcm9sbHMiIC8+CisgICAgYW5kcm9pZDpzY3JvbGxiYXJzPSJ2ZXJ0aWNhbCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2UueG1sCmluZGV4IDU3ODVkM2IuLmI2NDZhNGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlLnhtbApAQCAtMjQsNyArMjQsNyBAQAogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgogICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI3ZGlwIgotICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSJAYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2siCisgICAgYW5kcm9pZDpjaGVja01hcms9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIgogICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogLz4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfc2luZ2xlY2hvaWNlLnhtbAppbmRleCAzNTYwZmVlLi5jM2MyMDczIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfc2luZ2xlY2hvaWNlLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfc2luZ2xlY2hvaWNlLnhtbApAQCAtMjQsNiArMjQsNiBAQAogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgogICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZGlwIgogICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI3ZGlwIgotICAgIGFuZHJvaWQ6Y2hlY2tNYXJrPSJAYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW8iCisgICAgYW5kcm9pZDpjaGVja01hcms9Ij9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZSIKICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YmNkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2ltcGxlX3NlbGVjdGFibGVfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPENoZWNrZWRUZXh0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI5ZGlwIgorLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJfcnVudGltZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMDk2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2ViX3J1bnRpbWUueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgPgorICAgIDxXZWJWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2VidmlldyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BsYXNoc2NyZWVuIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRTdGFydCIKKyAgICAvPgorCis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfZmluZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlZGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19maW5kLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgPgorICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VkaXQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHQiCisgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9maW5kX29uX3BhZ2UiCisgICAgICAgIGFuZHJvaWQ6aW1lT3B0aW9ucz0iYWN0aW9uRG9uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21hdGNoZXMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZSIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19jb3B5LnhtbCBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ZjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfY29weS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2NvcHkiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfYXR0YWNobWVudCIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NoYXJlIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X3NoYXJlIgorICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iYWx3YXlzIgorICAgICAgICAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2VsZWN0X2FsbCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbWVudV9jaGF0X2Rhc2hib2FyZCIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2ZpbmQiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljX21lbnVfZmluZCIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKzwvbWVudT4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL21lbnUvd2Vidmlld19maW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfZmluZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhNDBhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9tZW51L3dlYnZpZXdfZmluZC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2ZpbmRfcHJldiIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfYnRuX2ZpbmRfcHJldiIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2ZpbmRfbmV4dCIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfYnRuX2ZpbmRfbmV4dCIKKyAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9yYXctcm0vbG9hZGVycm9yLmh0bWwgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL2xvYWRlcnJvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNGEzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL2xvYWRlcnJvci5odG1sCkBAIC0wLDAgKzEsMTggQEAKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+UGFnaW5hIGQnaW50ZXJuZXQgYmV0ZyBkaXNwb25pYmxhPC90aXRsZT4KKyAgICAgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgIGJvZHkgeyBtYXJnaW4tdG9wOiAwcHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgICAgIGgyICAgeyBtYXJnaW4tdG9wOiA1cHg7IHBhZGRpbmctdG9wOiAwcHg7IH0KKyAgICAgICAgPC9zdHlsZT4KKworICAgICAgICA8Ym9keT4KKworICAgICAgICAgICAgPGltZyBzcmM9ImZpbGU6Ly8vYW5kcm9pZF9hc3NldC93ZWJraXQvYW5kcm9pZC13ZWJlcnJvci5wbmciIGFsaWduPSJ0b3AiIC8+CisgICAgICAgICAgICA8aDI+UGFnaW5hIGQnaW50ZXJuZXQgYmV0ZyBkaXNwb25pYmxhPC9oMj4KKyAgICAgICAgICAgIDxwPkltcHVzc2liZWwgZGEgY2hhcmdpYXIgbGEgcGFnaW5hIGQnaW50ZXJuZXQgc3V0IDxhIGhyZWY9IiVzIj4lczwvYT4uIEVycnVyOjwvcD4KKyAgICAgICAgICAgIDwhLS0gVGhlICVlIGlzIHJlcGxhY2VkIGJ5IGEgbG9jYWxpemVkIGVycm9yIHN0cmluZyAtLT4KKyAgICAgICAgICAgIDxwPiVlPC9wPgorICAgICAgICA8L2JvZHk+CisgICAgPC9oZWFkPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3Jhdy1ybS9ub2RvbWFpbi5odG1sIGIvY29yZS9yZXMvcmVzL3Jhdy1ybS9ub2RvbWFpbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjgzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvcmF3LXJtL25vZG9tYWluLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L3RpdGxlPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICAgICAgYm9keSB7IG1hcmdpbi10b3A6IDBweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICAgICAgaDIgICB7IG1hcmdpbi10b3A6IDVweDsgcGFkZGluZy10b3A6IDBweDsgfQorICAgICAgICA8L3N0eWxlPgorCisgICAgICAgIDxib2R5PgorCisgICAgICAgICAgICA8aW1nIHNyYz0iZmlsZTovLy9hbmRyb2lkX2Fzc2V0L3dlYmtpdC9hbmRyb2lkLXdlYmVycm9yLnBuZyIgYWxpZ249InRvcCIgLz4KKyAgICAgICAgICAgIDxoMj5QYWdpbmEgZCdpbnRlcm5ldCBiZXRnIGRpc3BvbmlibGE8L2gyPgorICAgICAgICAgICAgPHA+TGEgcGFnaW5hIGQnaW50ZXJuZXQgc3V0IDxhIGhyZWY9IiVzIj4lczwvYT4gJmVncmF2ZTsgZXZlbnR1YWxtYWluIGRlYWN0aXZhZGEgdGVtcG9yYXJtYWluIHUgc3B1c3RhZGEgZGVmaW5pdGl2YW1haW4gYWQgaW5hIG5vdmEgYWRyZXNzYSBkYSB3ZWIuPC9wPgorCisgICAgICAgICAgICA8cD48Yj5RdWEgaW4gcCZlZ3JhdmU7ciBwcm9wb3N0YXM6PC9iPjwvcD4KKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+Q29udHJvbGxhaSBjaGUgVm9zcyBhcHBhcmF0IHJlY2VwZXNjaGEgaW4gc2lnbmFsIGUgZGlzcG9uYSBkJ2luYSBjb25uZXhpdW4gZGEgZGF0YXMuPC9saT4KKyAgICAgICAgICAgICAgICA8bGk+Q2hhcmdpYWkgcGxpIHRhcmQgZGFub3ZhbWFpbiBsYSBwYWdpbmEgZCdpbnRlcm5ldC48L2xpPgorICAgICAgICAgICAgICAgIDxsaT5DaGFyZ2lhaSBpbmEgY29waWEgZGEgbGEgcGFnaW5hIGRhIHdlYiBtZW1vcmlzYWRhIGVuIGlsIGNhY2hlIGRhIEdvb2dsZS48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaGVhZD4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmluZGV4IGRkYTFmYzUuLjA1ZTlmYWEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IlVtb8W+xYh1amUgYXBsaWthY2kgbmHEjcOtc3QgdsWhZWNobmEgZGF0YSBrb250YWt0xa8gKGFkcmVzeSkgdWxvxb5lbsOhIHZlIHZhxaFlbSB0ZWxlZm9udS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBwb3TDqSBtb2hvdSBkYWzFocOtbSBsaWRlbSBvZGVzbGF0IHZhxaFlIGRhdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iesOhcGlzIGRhdCBrb250YWt0xa8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IlVtb8W+xYh1amUgYXBsaWthY2kgem3Em25pdCBrb250YWt0bsOtIMO6ZGFqZSAoYWRyZXN1KSB1bG/FvmVuw6kgdiB0ZWxlZm9udS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSBwb21vY8OtIHRvaG90byBuYXN0YXZlbsOtIHZ5bWF6YXQgxI1pIHBvem3Em25pdCBrb250YWt0bsOtIMO6ZGFqZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+InrDoXBpcyBpbmZvcm1hY8OtIG8gdmxhc3Ruw61rb3ZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVPd25lckRhdGEiIG1zZ2lkPSIyMzQ0MDU1MzE3OTY5Nzg3MTI0Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB6bcSbbml0IGluZm9ybWFjZSBvIHZsYXN0bsOta292aSB0ZWxlZm9udSB1bG/FvmVuw6kgdiB0ZWxlZm9udS4gxaBrb2RsaXbDqSBhcGxpa2FjZSBtb2hvdSBwb21vY8OtIHRvaG90byBuYXN0YXZlbsOtIHZ5bWF6YXQgxI1pIHBvem3Em25pdCBpbmZvcm1hY2UgbyB2bGFzdG7DrWtvdmkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+IsSNdGVuw60gaW5mb3JtYWPDrSBvIHZsYXN0bsOta292aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRPd25lckRhdGEiIG1zZ2lkPSIzMDg4NDg2MzgzMTI4NDM0NTA3Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSDEjcOtc3QgaW5mb3JtYWNlIG8gdmxhc3Ruw61rb3ZpIHRlbGVmb251IHVsb8W+ZW7DoSB2IHRlbGVmb251LiDFoGtvZGxpdsOpIGFwbGlrYWNlIG1vaG91IHBvbW9jw60gdG9ob3RvIG5hc3RhdmVuw60gbmHEjcOtc3QgaW5mb3JtYWNlIG8gdmxhc3Ruw61rb3ZpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+IsSMdGVuw60gdWTDoWxvc3TDrSB2IGthbGVuZMOhxZlpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTUzMzAyOTEzOTY1MjA5NTczNCI+IlVtb8W+xYh1amUgYXBsaWthY2kgbmHEjcOtc3QgdsWhZWNobnkgdWTDoWxvc3RpIGthbGVuZMOhxZllIHVsb8W+ZW7DqSB2ZSB2YcWhZW0gdGVsZWZvbnUuIMWga29kbGl2w6kgYXBsaWthY2UgcG90w6kgbW9ob3UgZGFsxaHDrW0gbGlkZW0gb2Rlc2xhdCB1ZMOhbG9zdGkgeiB2YcWhZWhvIGthbGVuZMOhxZllLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDYWxlbmRhciIgbXNnaWQ9IjM4OTQ4NzkzNTI1OTQ5MDQzNjEiPiJQxZlpZMOhdsOhbsOtIG5lYm8gw7pwcmF2YSB1ZMOhbG9zdMOtIHYga2FsZW5kw6HFmWkgYSBvZGVzw61sw6Fuw60gZS1tYWlsxa8gaG9zdMWvbSI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IlVyxI11amUsIGtkeSBkb2pkZSBrIHV6YW3EjWVuw60gemHFmcOtemVuw60gYSBidWRlIHBvxb5hZG92w6FubyBvcMSbdG92bsOpIHphZMOhbsOtIGhlc2xhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJWeW1hesOhbsOtIHbFoWVjaCBkYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkJleiBkYWzFocOtaG8gcG90dnJ6ZW7DrSBvYm5vdsOtIHbDvWNob3rDrSBuYXN0YXZlbsOtIHogdsO9cm9ieSBhIHNtYcW+ZSB2xaFlY2huYSBkYXRhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbcWvIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IlByw6FjZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJKaW7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJWbGFzdG7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJwb21vY8OtIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gcG9tb2PDrSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlphZGVqdGUga8OzZCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlphZGVqdGUgaGVzbG8gcHJvIG9kYmxva292w6Fuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IlphZGVqdGUga8OzZCBQSU4gcHJvIG9kYmxva292w6Fuw60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJOZXNwcsOhdm7DvSBrw7NkIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJDaGNldGUtbGkgdGVsZWZvbiBvZGVta25vdXQsIHN0aXNrbsSbdGUgTWVudSBhIHBvdMOpIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IsSMw61zbG8gdMOtc8WIb3bDqSBsaW5reSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJaYXZvbGF0IHpwxJt0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iU3Byw6F2bsSbISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJaa3VzdGUgdG8gcHJvc8OtbSB6bm92dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iWmt1c3RlIHRvIHByb3PDrW0gem5vdnUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJOYWLDrWplbsOtICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYWJpdG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJLYXJ0YSBTSU0gamUgemFibG9rb3bDoW5hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Ik9kYmxva292w6Fuw60ga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz5rcsOhdCBqc3RlIG5ha3Jlc2xpbGkgbmVzcHLDoXZuw6kgYmV6cGXEjW5vc3Ruw60gZ2VzdG8uICJcblxuIk9wYWt1anRlIHByb3PDrW0gYWtjaSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlbDrWNla3LDoXQgKDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+KSBqc3RlIG5lc3Byw6F2bsSbIHphZGFsaSBoZXNsby4gIlxuXG4iWmt1c3RlIHRvIHpub3Z1IHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlbDrWNla3LDoXQgKDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+KSBqc3RlIG5lc3Byw6F2bsSbIHphZGFsaSBrw7NkIFBJTi4gIlxuXG4iWmt1c3RlIHRvIHpub3Z1IHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPmtyw6F0IGpzdGUgbmVzcHLDoXZuxJsgbmFrcmVzbGlsaSBzdsOpIGJlenBlxI1ub3N0bsOtIGdlc3RvLiBQbyBkYWzFocOtY2ggbmXDunNwxJvFoW7DvWNoIHBva3VzZWNoICg8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPikgYnVkZXRlIHBvxb7DoWTDoW5pIG8gb2RlbcSNZW7DrSB0ZWxlZm9udSBwb21vY8OtIHDFmWlobMOhxaFlbsOtIGRvIMO6xI10dSBHb29nbGUuIlxuXG4iIEFrY2kgcHJvc8OtbSBvcGFrdWp0ZSB6YSBuxJtrb2xpayBzZWt1bmQgKDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+KS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iU2VrdW5keSB6YsO9dmFqw61jw60gZG8gZGFsxaHDrWhvIHBva3VzdTogPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uxJtsaSBqc3RlIGdlc3RvPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVnlicmF0IHbFoWUiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ik96bmHEjWl0IHRleHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iVnlqbW91dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29ww61yb3ZhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IlZsb8W+aXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IktvcMOtcm92YXQgYWRyZXN1IFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZGEgemFkw6F2w6Fuw60gZGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IlDFmWlkYXQgc2xvdm8g4oCePHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnCBkbyBzbG92bsOta3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLDmnByYXZ5IHRleHR1Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJNw6FsbyBwYW3Em3RpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iViB0ZWxlZm9udSB6YsO9dsOhIG3DoWxvIG3DrXN0YSBwcm8gdWtsw6Fkw6Fuw60gZGF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJacnXFoWl0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IlVwb3pvcm7Em27DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTmHEjcOtdMOhbsOtLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJaQVBOVVRPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iVllQTk9VVCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iRG9rb27EjWl0IGFrY2kgcG9tb2PDrSBhcGxpa2FjZSI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlVrb27EjWl0IGFwbGlrYWNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+Ik5haGzDoXNpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iUG/EjWthdCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBwb3J1xaFpbGEgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gcG9ydcWhaWwgc3bDqSB2bGFzdG7DrSB2eW51Y2Vuw6kgesOhc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iQsSbxb7DrSBhcGxpa2FjZSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBwxZllZHNkw61sZW7DvW0ga2zDrcSNZW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iU8OtxaUgVlBOIEwyVFAvSVBTZWMgcyBjZXJ0aWZpa8OhdGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iWnZvbGl0IHNvdWJvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lbsOtIHZ5YnLDoW4gxb7DoWRuw70gc291Ym9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXRvdmF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+Ik9kZXNsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+Im9ibMOtYmVuw6kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJBa3Rpdm92w6FuIHJlxb5pbSBWIGF1dMSbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlZ5YmVydGUsIGNoY2V0ZS1saSB1a29uxI1pdCByZcW+aW0gTmEgY2VzdMSbLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZSBha3Rpdm7DrSB0ZXRoZXJpbmcgbmVibyBob3RzcG90Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90eWtlbSB6YWjDoWrDrXRlIGtvbmZpZ3VyYWNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iWnDEm3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJEYWzFocOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iUMWZZXNrb8SNaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJWeXNva8OpIHZ5dcW+aXTDrSBtb2JpbG7DrWNoIGRhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iRG90eWtlbSB6b2JyYXrDrXRlIGRhbMWhw60gaW5mb3JtYWNlIG8gdnl1xb5pdMOtIG1vYmlsbsOtY2ggZGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJCeWwgcMWZZWtyb8SNZW4gbGltaXQgbW9iaWxuw61jaCBkYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCA3YjNlODJjLi5mNTMzMWU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBsw6ZzZXIgYWxsZSBrb250YWt0ZGF0YSAoYWRyZXNzZXIpLCBkZXIgZXIgZ2VtdCBww6UgZGluIHRlbGVmb24uIE9uZHNpbmRlZGUgcHJvZ3JhbW1lciBrYW4gYnJ1Z2UgZGV0dGUgdGlsIGF0IHNlbmRlIGRpbmUgZGF0YSB0aWwgYW5kcmUgbWVubmVza2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InNrcml2IGtvbnRha3RkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSDDpm5kcmVyIGtvbnRha3RkYXRhIChhZHJlc3NlciksIGRlciBlciBnZW10IHDDpSBkaW4gdGVsZWZvbi4gT25kc2luZGVkZSBwcm9ncmFtbWVyIGthbiBicnVnZSBkZXR0ZSB0aWwgYXQgc2xldHRlIGVsbGVyIMOmbmRyZSBrb250YWt0ZGF0YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+InNrcml2IGVqZXJkYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVPd25lckRhdGEiIG1zZ2lkPSIyMzQ0MDU1MzE3OTY5Nzg3MTI0Ij4iVGlsbGFkZXIsIGF0IGV0IHByb2dyYW0gw6ZuZHJlciBydGVsZWZvbmVucyBlamVyZGF0YSwgZGVyIGVyIGdlbXQgcMOlIGRpbiB0ZWxlZm9uLiBPbmRzaW5kZWRlIHByb2dyYW1tZXIga2FuIGJydWdlIGRldHRlIHRpbCBhdCBzbGV0dGUgZWxsZXIgw6ZuZHJlIGVqZXJkYXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiJsw6ZzIGVqZXJkYXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiJUaWxsYWRlciwgYXQgZXQgcHJvZ3JhbSBsw6ZzZXIgdGVsZWZvbmVucyBlamVyZGF0YSwgZGVyIGVyIGdlbXQgcMOlIGRpbiB0ZWxlZm9uLiBPbmRzaW5kZWRlIHByb2dyYW1tZXIga2FuIGJydWdlIGRldHRlIHRpbCBhdCBsw6ZzZSBlamVyZGF0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJsw6ZzIGthbGVuZGVyYmVnaXZlbmhlZGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTUzMzAyOTEzOTY1MjA5NTczNCI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIGzDpnNlciBhbGxlIGthbGVuZGVyYmVnaXZlbmhlZGVyLCBkZXIgZXIgZ2VtdCBww6UgZGluIHRlbGVmb24uIE9uZHNpbmRlZGUgcHJvZ3JhbW1lciBrYW4gYnJ1Z2UgZGV0dGUgdGlsIGF0IHNlbmRlIGRpbmUga2FsZW5kZXJiZWdpdmVuaGVkZXIgdGlsIGFuZHJlIG1lbm5lc2tlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiIG1zZ2lkPSIzODk0ODc5MzUyNTk0OTA0MzYxIj4idGlsZsO4aiBlbGxlciByZWRpZ2VyIGthbGVuZGVyYmVnaXZlbmhlZGVyLCBvZyBzZW5kIGUtbWFpbCB0aWwgZ8Omc3RlciI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2wgbsOlciBlbmhlZGVuIGzDpXNlcywgc8OlIGR1IHNrYWwgaW5kdGFzdGUgYWRnYW5nc2tvZGVuIGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlNsZXQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJGb3JldGFnIGVuIGZhYnJpa3NudWxzdGlsbGluZywgZGVyIHNsZXR0ZXIgYWxsZSBkaW5lIGRhdGEgdWRlbiBiZWtyw6ZmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik1vYmlsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJBcmJlamRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFuZHJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlRpbHBhc3NldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmR0YXN0IFBJTi1rb2RlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbmR0YXN0IGFkZ2FuZ3Nrb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5kdGFzdCBwaW5rb2RlIGZvciBhdCBsw6VzZSBvcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkZvcmtlcnQgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWsgcMOlIE1lbnUgb2cgZGVybsOmc3QgcMOlIDAgZm9yIGF0IGzDpXNlIG9wLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJhZ2UgdGlsIG9wa2FsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IlJpZ3RpZ3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyISBQcsO4diBpZ2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJCZWtsYWdlciEgUHLDuHYgaWdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Ik9wbGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Ik9wbGFkdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIFNJTS1rb3J0ZXQgb3AgLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iRHUgaGFyIHRlZ25ldCBkaXQgb3Bsw6VzbmluZ3Ntw7huc3RlciBmb3JrZXJ0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGdhbmdlLiAiXG5cbiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIGFkZ2FuZ3Nrb2RlIGZvcmtlcnQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2UuICJcblxuIlByw7h2IGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkR1IGhhciBpbmR0YXN0ZXQgZGluIHBpbmtvZGUgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gIlxuXG4iUHLDuHYgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciB0ZWduZXQgZGl0IG9wbMOlc25pbmdzbcO4bnN0ZXIgZm9ya2VydCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZS4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZm9yc8O4ZyBtZXJlIHZpbCBkdSBibGl2ZSBiZWR0IG9tIGF0IGzDpXNlIGRpbiB0ZWxlZm9uIG9wIHZlZCBoasOmbHAgYWYgZGl0IEdvb2dsZS1sb2dpbiJcblxuIiBQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJQcsO4diBpZ2VuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhciBkdSBnbGVtdCBtw7huc3RyZXQ/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJWw6ZsZyBhbGxlIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJNYXJrZXIgdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iS2xpcCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iSW5kc8OmdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyIHdlYmFkcmVzc2UiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iSW5wdXRtZXRvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iRsO4aiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB0aWwgb3JkYm9nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iRGVyIGVyIGlra2Ugc8OlIG1lZ2V0IHBsYWRzIHRpbGJhZ2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJEZXIgZXIgbsOmc3RlbiBpa2tlIG1lcmUgcGxhZHMgcMOlIHRlbGVmb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxsZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQmVtw6ZyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iSW5kbMOmc2VyLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJUSUwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJGUkEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkZ1bGRmw7hyIGhhbmRsaW5nIHZlZCBoasOmbHAgYWYiPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZyB0aWwgYXQgbHVra2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJWZW50Ijwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1tZXQgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFyIG92ZXJ0csOlZHQgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpdGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZXIgaSBnYW5nIjwvc3RyaW5nPgpAQCAtODU0LDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJMMlRQL0lQU2VjIFZQTiBiYXNlcmV0IHDDpSBmb3Jow6VuZHNkZWx0IG7DuGdsZWtvZG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdGJhc2VyZXQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWw6ZsZyBmaWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJJbmdlbiBmaWwgZXIgdmFsZ3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJOdWxzdGlsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWx0aWxzdGFuZCBlciBha3RpdmVyZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iVsOmbGcgZm9yIGF0IGFmc2x1dHRlIGJpbHRpbHN0YW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgZWxsZXIgaG90c3BvdCBlciBha3RpdnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUcnlrIGZvciBhdCBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJhZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOw6ZzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJTcHJpbmcgb3ZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuGp0IG1vYmlsZGF0YWZvcmJydWciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRyeWsgZm9yIG9wbHlzbmluZ2VyIG9tIGJydWcgYWYgbW9iaWxkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOmbnNlbiBmb3IgbW9iaWxkYXRhIGVyIG92ZXJza3JlZGV0Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggNGM1Y2M4Yy4uNTJhZTNiNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC0yODgsNiArMjg4LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ29udGFjdHMiIG1zZ2lkPSIzMzcxNTkxNTEyODk2NTQ1OTc1Ij4iRXJtw7ZnbGljaHQgZWluZXIgQW53ZW5kdW5nLCBhbGxlIGF1ZiBJaHJlbSBUZWxlZm9uIGdlc3BlaWNoZXJ0ZW4gS29udGFrdGRhdGVuIChBZHJlc3NlbikgenUgbGVzZW4uIFNjaMOkZGxpY2hlIEFud2VuZHVuZ2VuIGvDtm5uZW4gc28gSWhyZSBEYXRlbiBhbiBhbmRlcmUgUGVyc29uZW4gc2VuZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+IktvbnRha3RkYXRlbiBzY2hyZWliZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGllIGF1ZiBJaHJlbSBUZWxlZm9uIGdlc3BlaWNoZXJ0ZW4gS29udGFrdGRhdGVuIChBZHJlc3NlbikgenUgw6RuZGVybi4gU2Now6RkbGljaGUgQW53ZW5kdW5nZW4ga8O2bm5lbiBzbyBJaHJlIEtvbnRha3RkYXRlbiBsw7ZzY2hlbiBvZGVyIHZlcsOkbmRlcm4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJFaWdlbnTDvG1lcmRhdGVuIHNjaHJlaWJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IkVybcO2Z2xpY2h0IGVpbmVyIEFud2VuZHVuZywgZGllIGF1ZiBJaHJlbSBUZWxlZm9uIGdlc3BlaWNoZXJ0ZW4gRWlnZW50w7xtZXJkYXRlbiB6dSDDpG5kZXJuLiBTY2jDpGRsaWNoZSBBbndlbmR1bmdlbiBrw7ZubmVuIHNvIEVpZ2VudMO8bWVyZGF0ZW4gbMO2c2NoZW4gb2RlciB2ZXLDpG5kZXJuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiJFaWdlbnTDvG1lcmRhdGVuIGxlc2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGRpZSBhdWYgSWhyZW0gVGVsZWZvbiBnZXNwZWljaGVydGVuIEVpZ2VudMO8bWVyZGF0ZW4genUgbGVzZW4uIFNjaMOkZGxpY2hlIEFud2VuZHVuZ2VuIGvDtm5uZW4gc28gRWlnZW50w7xtZXJkYXRlbiBsZXNlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJLYWxlbmRlcmVpbnRyw6RnZSBsZXNlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiJFcm3DtmdsaWNodCBlaW5lciBBbndlbmR1bmcsIGFsbGUgYXVmIElocmVtIFRlbGVmb24gZ2VzcGVpY2hlcnRlbiBLYWxlbmRlcmVyZWlnbmlzc2UgenUgbGVzZW4uIFNjaMOkZGxpY2hlIEFud2VuZHVuZ2VuIGvDtm5uZW4gc28gSWhyZSBLYWxlbmRlcmVyZWlnbmlzc2UgYW4gYW5kZXJlIFBlcnNvbmVuIHNlbmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiIG1zZ2lkPSIzODk0ODc5MzUyNTk0OTA0MzYxIj4iS2FsZW5kZXJlaW50csOkZ2UgaGluenVmw7xnZW4gb2RlciDDpG5kZXJuIHVuZCBFLU1haWxzIGFuIEfDpHN0ZSBzZW5kZW4iPC9zdHJpbmc+CkBAIC00MzIsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJTdGV1ZXJ1bmcgZGVyIEdlcsOkdGVzcGVycmU7IGVyZm9yZGVydCBkaWUgZXJuZXV0ZSBQYXNzd29ydGVpbmdhYmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iQWxsZSBEYXRlbiBsw7ZzY2hlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iWnVyw7xja3NldHplbiBhdWYgZGllIFdlcmtzZWluc3RlbGx1bmdlbi4gRGFiZWkgd2VyZGVuIGFsbGUgSWhyZSBEYXRlbiBvaG5lIE5hY2hmcmFnZSBnZWzDtnNjaHQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUHJpdmF0IjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkJlcnVmbGljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbmRlcmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iQmVudXR6ZXJkZWZpbmllcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iw7xiZXIgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiDDvGJlciA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJQYXNzd29ydCB6dW0gRW50c3BlcnJlbiBlaW5nZWJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iUElOIHp1bSBFbnRzcGVycmVuIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRmFsc2NoZXIgUElOLUNvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkRyw7xja2VuIFNpZSB6dW0gRW50c3BlcnJlbiBkaWUgTWVuw7x0YXN0ZSB1bmQgZGFubiBhdWYgXCIwXCIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik5vdHJ1Zm51bW1lciI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJadXLDvGNrIHp1bSBBbnJ1ZiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IktvcnJla3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlR1dCB1bnMgbGVpZC4gVmVyc3VjaGVuIFNpZSBlcyBub2NoIGVpbm1hbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJXaXJkIGdlbGFkZW4gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkF1ZmdlbGFkZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkJpdHRlIFBJTi1Db2RlIGVpbmdlYmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLUthcnRlIHdpcmQgZW50c3BlcnJ0Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiAiXG5cbiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IFNla3VuZGVuIGVybmV1dC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJTaWUgaGFiZW4gSWhyIFBhc3N3b3J0IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IE1hbCBmYWxzY2ggZWluZ2VnZWJlbi4gIlxuXG4iVmVyc3VjaGVuIFNpZSBlcyBpbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlNpZSBoYWJlbiBJaHJlIFBJTiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBNYWwgZmFsc2NoIGVpbmdlZ2ViZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iU2llIGhhYmVuIElociBFbnRzcGVycnVuZ3NtdXN0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4tbWFsIGZhbHNjaCBnZXplaWNobmV0LiBOYWNoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHdlaXRlcmVuIGVyZm9sZ2xvc2VuIFZlcnN1Y2hlbiB3ZXJkZW4gU2llIGF1ZmdlZm9yZGVydCwgSWhyIFRlbGVmb24gbWl0aGlsZmUgSWhyZXIgR29vZ2xlLUFubWVsZGVpbmZvcm1hdGlvbmVuIHp1IGVudHNwZXJyZW4uICJcblxuIlZlcnN1Y2hlbiBTaWUgZXMgaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gU2VrdW5kZW4gZXJuZXV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJWZXJzdWNoZW4gU2llIGVzIGluIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBTZWt1bmRlbiBlcm5ldXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJNdXN0ZXIgdmVyZ2Vzc2VuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iQWxsZXMgYXVzd8OkaGxlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iVGV4dCBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkF1c3NjaG5laWRlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iS29waWVyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJFaW5mw7xnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCBrb3BpZXJlbiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJFaW5nYWJlbWV0aG9kZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiB6dW0gV8O2cnRlcmJ1Y2ggaGluenVmw7xnZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJUZXh0IGJlYXJiZWl0ZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkdlcmluZ2VyIFNwZWljaGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iS2F1bSBub2NoIGZyZWllciBUZWxlZm9uc3BlaWNoZXIgdmVyZsO8Z2Jhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQWJicmVjaGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkFjaHR1bmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IldpcmQgZ2VsYWRlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRUlOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVVTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJBa3Rpb24gZHVyY2hmw7xocmVuIG1pdCI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlNjaGxpZcOfZW4gZXJ6d2luZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IkJlcmljaHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IldhcnRlbiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJEaWUgQW53ZW5kdW5nIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKFByb3plc3MgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYXQgZ2VnZW4gaWhyZSBzZWxic3Rlcnp3dW5nZW5lIFN0cmljdE1vZGUtUmljaHRsaW5pZSB2ZXJzdG/Dn2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkRlciBQcm96ZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYXQgZ2VnZW4gc2VpbmUgc2VsYnN0ZXJ6d3VuZ2VuZSBTdHJpY3RNb2RlLVJpY2h0bGluaWUgdmVyc3Rvw59lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGzDpHVmdCI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYy1WUE4gbWl0IHZvcmluc3RhbGxpZXJ0ZW0gU2NobMO8c3NlbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJaZXJ0aWZpa2F0IG1pdCB2b3JpbnN0YWxsaWVydGVtIFNjaGzDvHNzZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEYXRlaSBhdXN3w6RobGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iS2VpbmUgRGF0ZWkgYXVzZ2V3w6RobHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJadXLDvGNrc2V0emVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iRmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkF1dG9tb2R1cyBha3RpdmllcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iWnVtIEJlZW5kZW4gZGVzIEF1dG9tb2R1cyBhdXN3w6RobGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlRldGhlcmluZyBvZGVyIEhvdHNwb3QgYWt0aXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJadW0gS29uZmlndXJpZXJlbiBiZXLDvGhyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJadXLDvGNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iV2VpdGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iw5xiZXJzcHJpbmdlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkhvaGUgTW9iaWxkYXRlbm51dHp1bmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IldlaXRlcmUgSW5mb3JtYXRpb25lbiDDvGJlciBkaWUgTW9iaWxkYXRlbm51dHp1bmcgZHVyY2ggQmVyw7xocmVuIGF1ZnJ1ZmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpbGRhdGVubGltaXQgw7xiZXJzY2hyaXR0ZW4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAppbmRleCA0NTg2M2U3Li5jMjEzMjFkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDPhM63zr0gzrHOvc6szrPOvc+Jz4POtyDPjM67z4nOvSDPhM+Jzr0gzrTOtc60zr/OvM6tzr3Pic69IM61z4DOsc+Gzq7PgiAozrTOuc61z43OuM+Fzr3Pg863z4IpIM+Azr/PhSDOtc6vzr3Osc65IM6xz4DOv864zrfOus61z4XOvM6tzr3OsSDPg8+Ezr8gz4TOt867zq3Phs+Jzr3PjCDPg86xz4IuIM6azrHOus+MzrLOv8+FzrvOtc+CIM61z4bOsc+BzrzOv86zzq3PgiDOvM+Azr/Pgc6/z43OvSDOvc6xIM+Ezr8gz4fPgc63z4POuc68zr/PgM6/zrnOrs+Dzr/Phc69IM6zzrnOsSDOvc6xIM6xz4DOv8+Dz4TOtc6vzrvOv8+Fzr0gz4TOsSDOtM61zrTOv868zq3Ovc6xIM+DzrHPgiDPg861IM+Ez4HOr8+Ezr/Phc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+Is61zrPOs8+BzrHPhs6uIM60zrXOtM6/zrzOrc69z4nOvSDOtc+AzrHPhs6uz4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg861IM68zrnOsSDOtc+GzrHPgc68zr/Os86uIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc61zq8gz4TOsSDOtM61zrTOv868zq3Ovc6xIM61z4DOsc+Gzq7PgiAozrTOuc61z43OuM+Fzr3Pg863z4IpIM+Azr/PhSDOtc6vzr3Osc65IM6xz4DOv864zrfOus61z4XOvM6tzr3OsSDPg8+Ezr8gz4TOt867zq3Phs+Jzr3PjCDPg86xz4IuIM6azrHOus+MzrLOv8+FzrvOtc+CIM61z4bOsc+BzrzOv86zzq3PgiDOvM+Azr/Pgc6/z43OvSDOvc6xIM+Ezr8gz4fPgc63z4POuc68zr/PgM6/zrnOrs+Dzr/Phc69IM6zzrnOsSDOvc6xIM60zrnOsc6zz4HOrM+Izr/Phc69IM6uIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc6uz4POv8+Fzr0gz4TOsSDOtM61zrTOv868zq3Ovc6xIM61z4DOsc+Gz47OvSDPg86xz4IuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiLOtc6zzrPPgc6xz4bOriDOtM61zrTOv868zq3Ovc+Jzr0gzrrOsc+Ez4zPh86/z4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDOvc6xIM+Ez4HOv8+Azr/PgM6/zrnOrs+DzrXOuSDPhM6xIM60zrXOtM6/zrzOrc69zrEgzrrOsc+Ez4zPh86/z4Ugz4TOt867zrXPhs+Ozr3Ov8+FIM+Dz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgi4gzprOsc66z4zOss6/z4XOu861z4IgzrXPhs6xz4HOvM6/zrPOrc+CIM68z4DOv8+Bzr/Pjc69IM69zrEgz4TOvyDPh8+BzrfPg865zrzOv8+Azr/Ouc6uz4POv8+Fzr0gzrPOuc6xIM69zrEgz4TPgc6/z4DOv8+Azr/Ouc6uz4POv8+Fzr0gz4TOsSDOtM61zrTOv868zq3Ovc6xIM66zrHPhM+Mz4fOv8+FLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiLOsc69zqzOs869z4nPg863IM60zrXOtM6/zrzOrc69z4nOvSDOus6xz4TPjM+Hzr/PhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRPd25lckRhdGEiIG1zZ2lkPSIzMDg4NDg2MzgzMTI4NDM0NTA3Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xzr3OrM6zzr3Pic+Dzrcgz4TPic69IM60zrXOtM6/zrzOrc69z4nOvSDOus6xz4TPjM+Hzr/PhSDPhM63zrvOtc+Gz47Ovc6/z4Ugz4DOv8+FIM61zq/Ovc6xzrkgzrHPgM6/zrjOt866zrXPhc68zq3Ovc6xIM+Dz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgi4gzprOsc66z4zOss6/z4XOu861z4IgzrXPhs6xz4HOvM6/zrPOrc+CIM68z4DOv8+Bzr/Pjc69IM69zrEgz4TOvyDPh8+BzrfPg865zrzOv8+Azr/Ouc6uz4POv8+Fzr0gzrPOuc6xIM+EzrfOvSDOsc69zqzOs869z4nPg863IM60zrXOtM6/zrzOrc69z4nOvSDOus6xz4TPjM+Hzr/PhSDPhM63zrvOtc+Gz47Ovc6/z4UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI2ODk4OTg3Nzk4MzAzODQwNTM0Ij4izrHOvc6szrPOvc+Jz4POtyDPg8+FzrzOss6szr3PhM+Jzr0gzrfOvM61z4HOv867zr/Os86vzr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiLOlc+AzrnPhM+Bzq3PgM61zrkgz4POtSDOvM65zrEgzrXPhs6xz4HOvM6/zrPOriDOvc6xIM6xzr3Osc6zzr3Pjs+DzrXOuSDPjM67zrEgz4TOsSDPg8+FzrzOss6szr3PhM6xIM63zrzOtc+Bzr/Ou86/zrPOr86/z4Ugz4DOv8+FIM61zq/Ovc6xzrkgzrHPgM6/zrjOt866zrXPhc68zq3Ovc6xIM+Dz4TOvyDPhM63zrvOrc+Gz4nOvc+MIM+DzrHPgi4gzprOsc66z4zOss6/z4XOu861z4IgzrXPhs6xz4HOvM6/zrPOrc+CIM68z4DOv8+Bzr/Pjc69IM69zrEgz4TOvyDPh8+BzrfPg865zrzOv8+Azr/Ouc6uz4POv8+Fzr0gzrPOuc6xIM69zrEgzrHPgM6/z4PPhM61zq/Ou86/z4XOvSDPg8+FzrzOss6szr3PhM6xIM63zrzOtc+Bzr/Ou86/zrPOr86/z4Ugz4POtSDOrM67zrvOv8+Fz4Igz4fPgc6uz4PPhM61z4IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+Is+Az4HOv8+DzrjOrs66zrcgzq4gz4TPgc6/z4DOv8+Azr/Or863z4POtyDPg8+FzrzOss6szr3PhM+Jzr0gz4TOv8+FIM63zrzOtc+Bzr/Ou86/zrPOr86/z4UgzrrOsc65IM6xz4DOv8+Dz4TOv867zq4gzrzOt869z4XOvM6sz4TPic69IM63zrvOtc66z4TPgc6/zr3Ouc66zr/PjSDPhM6xz4fPhc60z4HOv868zrXOr86/z4Ugz4PPhM6/z4XPgiDPgM+Bzr/Pg866zrXOus67zrfOvM6tzr3Ov8+Fz4IiPC9zdHJpbmc+CkBAIC00MzIsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLOlc67zq3Os8+HzrXOuSDPgM+Mz4TOtSDOus67zrXOuc60z47Ovc61zrkgzrcgz4PPhc+DzrrOtc+Fzq4sIM6xz4DOsc65z4TPjs69z4TOsc+CIM66z4nOtM65zrrPjCDPgM+Bz4zPg86yzrHPg863z4IgzrPOuc6xIM61z4DOsc69zrXOr8+Dzr/OtM6/LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLOlM65zrHOs8+BzrHPhs6uIM+MzrvPic69IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Is6gz4HOsc6zzrzOsc+Ezr/PgM6/zrnOtc6vz4TOsc65IM61z4DOsc69zrHPhs6/z4HOrCDOtc+BzrPOv8+Dz4TOsc+DzrnOsc66z47OvSDPgc+FzrjOvM6vz4POtc+Jzr0sIM68zrUgz4TOtyDOtM65zrHOs8+BzrHPhs6uIM+MzrvPic69IM+Ez4nOvSDOtM61zrTOv868zq3Ovc+Jzr0gz4POsc+CIM+Hz4nPgc6vz4IgzrXPgM65zrLOtc6yzrHOr8+Jz4POty4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLOn865zrrOr86xIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4izprOuc69zrfPhM+MIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiLOlc+BzrPOsc+Dzq/OsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLOhs67zrvOvyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLOoM+Bzr/Pg86xz4HOvM6/z4POvM6tzr3OvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLOvM6tz4PPiSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IM68zq3Pg8+JIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4izqDOu863zrrPhM+Bzr/Ou86/zrPOrs+Dz4TOtSDPhM6/zr0gzrrPic60zrnOus+MIM6xz4HOuc64zrzPjCBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+Is6VzrnPg86xzrPOrM6zzrXPhM61IM+Ezr/OvSDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIM6zzrnOsSDOvs61zrrOu861zq/OtM+JzrzOsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4izpXOuc+DzrHOs86szrPOtc+EzrUgz4TOvyBQSU4gzrPOuc6xIM6+zrXOus67zrXOr860z4nOvM6xIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4izpXPg8+GzrHOu868zq3Ovc6/z4IgzrrPic60zrnOus+Mz4IgzrHPgc65zrjOvM+Mz4IgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLOk865zrEgzr7Otc66zrvOtc6vzrTPic68zrEsIM+AzrHPhM6uz4PPhM61IM+Ezr8gz4DOu86uzrrPhM+Bzr8gTWVudSDOus6xzrksIM+Dz4TOtyDPg8+Fzr3Orc+HzrXOuc6xLCDPhM6/IM+AzrvOrs66z4TPgc6/IDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Is6Rz4HOuc64zrzPjM+CIM6tzrrPhM6xzrrPhM63z4IgzrHOvc6szrPOus63z4IiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4izpXPgM65z4PPhM+Bzr/Phs6uIM+Dz4TOt869IM66zrvOrs+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLOo8+Jz4PPhM+MISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6xz4HOs8+Mz4TOtc+BzrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+Is6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzrHPgc6zz4zPhM61z4HOsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+Is6mz4zPgc+EzrnPg863ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLOps6/z4HPhM6vz4PPhM63zrrOtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4izpcgzrrOrM+Bz4TOsSBTSU0gzrXOr869zrHOuSDOus67zrXOuc60z4nOvM6tzr3Oty4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiLOns61zrrOu861zq/OtM+JzrzOsSDOus6sz4HPhM6xz4IgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4izqPPh861zrTOuc6sz4POsc+EzrUgzrXPg8+GzrHOu868zq3Ovc6xIM+Ezr8gzrzOv8+Ezq/Oss6/IM6+zrXOus67zrXOuc60z47OvM6xz4TOv8+CPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gIlxuXG4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLOms6xz4TOsc+Hz4nPgc6vz4POsc+EzrUgzrXPg8+GzrHOu868zq3Ovc6xIM+Ezr/OvSDOus+JzrTOuc66z4wgz4DPgc+Mz4POss6xz4POt8+CIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IM+Gzr/Pgc6tz4IuICJcblxuIs6gz4HOv8+Dz4DOsc64zq7Pg8+EzrUgzr7Osc69zqwgz4POtSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Is6azrHPhM6xz4fPic+Bzq/Pg86xz4TOtSDOtc+Dz4bOsc67zrzOrc69zrEgz4TOvyBQSU4gz4POsc+CPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gz4bOv8+Bzq3Pgi4gIlxuXG4izqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+Is6jz4fOtc60zrnOrM+DzrHPhM61IM+Ezr8gzrzOv8+Ezq/Oss6/IM6+zrXOus67zrXOuc60z47OvM6xz4TOv8+CIM61z4PPhs6xzrvOvM6tzr3OsSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDPhs6/z4HOrc+CLiDOnM61z4TOrCDOsc+Az4wgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gzrHOvc61z4DOuc+Ez4XPh861zq/PgiDPgM+Bzr/Pg8+AzqzOuM61zrnOtc+CIM6xzrrPjM68zrcsIM64zrEgz4POsc+CIM62zrfPhM63zrjOtc6vIM69zrEgzr7Otc66zrvOtc65zrTPjs+DzrXPhM61IM+Ezr8gz4TOt867zq3Phs+Jzr3PjCDPg86xz4IgzrzOtSDPhM63IM+Hz4HOrs+Dzrcgz4TOt8+CIM+Dz43Ovc60zrXPg86uz4Igz4POsc+CIEdvb2dsZS4iXG5cbiIgzqDPgc6/z4PPgM6xzrjOrs+Dz4TOtSDOvs6xzr3OrCDPg861IDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IFxuzrTOtc+Fz4TOtc+Bz4zOu861z4DPhM6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiLOoM+Bzr/Pg8+AzrHOuM6uz4PPhM61IM6+zrHOvc6sIM+DzrUgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+Is6ezrXPh86sz4POsc+EzrUgz4TOvyDOvM6/z4TOr86yzr87Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLOlc+AzrnOu86/zrPOriDPjM67z4nOvSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4izpXPgM65zrvOv86zzq4gzrrOtc65zrzOrc69zr/PhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLOkc+Azr/Ous6/z4DOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4izpHOvc+EzrnOs8+BzrHPhs6uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4izpXPgM65zrrPjM67zrvOt8+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+Is6Rzr3PhM65zrPPgc6xz4bOriDOtM65zrXPjc64z4XOvc+DzrfPgiBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4izpzOrc64zr/OtM6/z4IgzrXOuc+Dz4zOtM6/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4izqDPgc6/z4POuM6uzrrOtyDPhM63z4IgzrvOrc6+zrfPgiBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiDPg8+Ezr8gzrvOtc6+zrnOus+MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4izpXPgM61zr7Otc+BzrPOsc+Dzq/OsSDOus61zrnOvM6tzr3Ov8+FIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLOkc+Azr/OvM6tzr3Otc65IM67zq/Os86/z4IgzrXOu861z43OuM61z4HOv8+CIM+Hz47Pgc6/z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLOiM+HzrXOuSDOsc+Azr/OvM61zq/Ovc61zrkgzrvOr86zzr/PgiDOtc67zrXPjc64zrXPgc6/z4IgzrHPgM6/zrjOt866zrXPhc+EzrnOus+Mz4Igz4fPjs+Bzr/PgiDPg8+Ezr8gz4TOt867zq3Phs+Jzr3Ovy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4izpHOus+Nz4HPic+DzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4izqDPgc6/z4POv8+Hzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+Is6mz4zPgc+Ez4nPg863Li4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLOlc69zrXPgc6zzr/PgM6/zrnOt868zq3Ovc6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4izpHPgM61zr3Otc+BzrPOv8+Azr/Or863z4POtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4izp/Ou86/zrrOu86uz4HPic+DzrcgzrXOvc6tz4HOs861zrnOsc+CIM68zrUgz4TOtyDPh8+Bzq7Pg863Ijwvc3RyaW5nPgpAQCAtNzMyLDEyICs3NDYsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4izpHOvc6xzrPOus6xz4PPhM65zrrPjCDOus67zrXOr8+DzrnOvM6/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+Is6Rzr3Osc+Gzr/Pgc6sIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLOkc69zrHOvM6/zr3OriI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLOlyDOtc+GzrHPgc68zr/Os86uIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKM60zrnOtc+BzrPOsc+Dzq/OsSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIM+AzrHPgc6xzrLOr86xz4POtSDPhM63zr0gzrHPhc+Ezr/Otc+AzrnOss6xzrvPjM68zrXOvc63IM+Azr/Ou865z4TOuc66zq4gU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLOlyDOtM65zrXPgc6zzrHPg86vzrEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IM+AzrHPgc6xzrLOr86xz4POtSDPhM63zr0gzrHPhc+Ezr/Otc+AzrnOss6xzrvPjM68zrXOvc63IM+Azr/Ou865z4TOuc66zq4gU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Is6XIM61z4bOsc+BzrzOv86zzq4gPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gzrXOus+EzrXOu861zq/PhM6xzrkiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+Is6azrvOtc65zrTOryBwcmUtc2hhcmVkIM6yzqzPg861zrkgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4izqDOuc+Dz4TOv8+Azr/Ouc63z4TOuc66z4wgzrLOrM+DzrXOuSBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Is6Vz4DOuc67zr/Os86uIM6xz4HPh861zq/Ov8+FIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4izpTOtc69IM6tz4fOtc65IM61z4DOuc67zrXOs861zq8gzrHPgc+HzrXOr86/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4izpXPgM6xzr3Osc+Gzr/Pgc6sIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+Is6lz4DOv86yzr/Ou86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLOsc6zzrHPgM63zrzOrc69zr8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLOlyDOu861zrnPhM6/z4XPgc6zzq/OsSDOsc+Fz4TOv866zrnOvc6uz4TOv8+FIM61zq/Ovc6xzrkgzrXOvc61z4HOs86/z4DOv865zrfOvM6tzr3OtyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLOlc+AzrnOu86tzr7PhM61IM6zzrnOsSDOrc6+zr/OtM6/IM6xz4DPjCDPhM63IM67zrXOuc+Ezr/Phc+BzrPOr86xIM6xz4XPhM6/zrrOuc69zq7PhM6/z4UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Is6jz43Ovc60zrXPg863IM68zq3Pg8+JIM66zrnOvc63z4TOrs+CIM+Dz4XPg866zrXPhc6uz4Igzq4gz4POt868zrXOr86/z4Ugz4DPgc+Mz4POss6xz4POt8+CIM61zr3Otc+BzrPOriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Is6RzrPOs86vzr7PhM61IM6zzrnOsSDOvc6xIM6zzq/Ovc61zrkgzrTOuc6xzrzPjM+Bz4bPic+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLOoM6vz4PPiSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+Is6Vz4DPjM68zrXOvc6/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4izqDOsc+BzqzOss67zrXPiM63Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4izqXPiM63zrvOriDPh8+Bzq7Pg863IM60zrXOtM6/zrzOrc69z4nOvSDOus65zr3Ot8+Ezq7PgiDPhM63zrvOtc+Gz4nOvc6vzrHPgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4izpHOs86zzq/Ovs+EzrUgzrPOuc6xIM69zrEgzrzOrM64zrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+BzrEgz4PPh861z4TOuc66zqwgzrzOtSDPhM63IM+Hz4HOrs+DzrcgzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLOns61z4DOtc+BzqzPg8+EzrfOus61IM+Ezr8gz4zPgc65zr8gzrTOtc60zr/OvM6tzr3Pic69IM66zrnOvc63z4TOrs+CIM+EzrfOu861z4bPic69zq/Osc+CIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAppbmRleCAyNzY1ZTk2Li4zOGFkNDA0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IkFkbWl0ZSB1bmEgYXBsaWNhY2nDs24gcXVlIGxlZSB0b2RvcyBsb3MgZGF0b3MgZGUgKGRpcmVjY2lvbmVzKSBkZSBjb250YWN0b3MgYWxtYWNlbmFkb3MgZW4gdHUgdGVsw6lmb25vLiBMYXMgYXBsaWNhY2lvbmVzIG1hbGljaW9zYXMgcHVlZGVuIHV0aWxpemFybG8gcGFyYSBlbnZpYXIgdHVzIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBhIG90cmFzIHBlcnNvbmFzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImVzY3JpYmlyIGRhdG9zIGRlIGNvbnRhY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBtb2RpZmljYSBsb3MgZGF0b3MgZGUgKGRpcmVjY2nDs24gZGUpIGNvbnRhY3RvIGd1YXJkYWRvcyBlbiB0dSB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXJsbyBwYXJhIGJvcnJhciBvIG1vZGlmaWNhciBsb3MgZGF0b3MgZGUgY29udGFjdG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJlc2NyaWJpciBkYXRvcyBkZWwgcHJvcGlldGFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBtb2RpZmljYSBsb3MgZGF0b3MgZGVsIHByb3BpZXRhcmlvIGRlbCB0ZWzDqWZvbm8gZ3VhcmRhZG9zIGVuIHR1IHRlbMOpZm9uby4gTGFzIGFwbGljYWNpb25lcyBtYWxpY2lvc2FzIHB1ZWRlbiB1dGlsaXphcmxvIHBhcmEgYm9ycmFyIG8gbW9kaWZpY2FyIGxvcyBkYXRvcyBkZWwgcHJvcGlldGFyaW8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+ImxlZXIgZGF0b3MgZGVsIHByb3BpZXRhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiJBZG1pdGUgdW5hIGFwbGljYWNpw7NuIHF1ZSBsZWUgbG9zIGRhdG9zIGRlbCBwcm9waWV0YXJpbyBkZWwgdGVsw6lmb25vIGd1YXJkYWRvcyBlbiB0dSB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXJsbyBwYXJhIGxlZXIgbG9zIGRhdG9zIGRlbCBwcm9waWV0YXJpbyBkZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+IkxlZXIgZXZlbnRvcyBkZWwgY2FsZW5kYXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiJBZG1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBsZWEgdG9kb3MgbG9zIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyBhbG1hY2VuYWRvcyBlbiB0dSB0ZWzDqWZvbm8uIExhcyBhcGxpY2FjaW9uZXMgbWFsaWNpb3NhcyBwdWVkZW4gdXRpbGl6YXJsbyBwYXJhIGVudmlhciB0dXMgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIGEgb3RyYXMgcGVyc29uYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+IkFncmVnYXIgbyBjYW1iaWFyIGV2ZW50b3MgZGVsIGNhbGVuZGFyaW8geSBlbnZpYXIgdW4gY29ycmVvIGVsZWN0csOzbmljbyBhIGxvcyBpbnZpdGFkb3MiPC9zdHJpbmc+CkBAIC00MzIsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJDb250cm9sYXIgY3VhbmRvIHNlIGJsb3F1ZWUgZWwgZGlzcG9zaXRpdm8sIHJlcXVpZXJlIHF1ZSB2dWVsdmFzIGEgaW5ncmVzYXIgdHUgY29udHJhc2XDsWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkJvcnJhciB0b2RvcyBsb3MgZGF0b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IlJlYWxpemFyIHVuIHJlZXN0YWJsZWNpbWllbnRvIGRlIGbDoWJyaWNhIHkgYm9ycmFyIHRvZG9zIHR1cyBkYXRvcyBzaW4gbmluZ3VuYSBjb25maXJtYWNpw7NuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWx1bGFyIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJUcmFiYWpvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik90cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBhIHRyYXbDqXMgZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJJbmdyZXNhciBlbCBjw7NkaWdvIGRlIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5ncmVzYXIgbGEgY29udHJhc2XDsWEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iSW5ncmVzYSBlbCBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IsKhQ8OzZGlnbyBkZSBQSU4gaW5jb3JyZWN0byEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iUGFyYSBkZXNibG9xdWVhciwgcHJlc2lvbmEgZWwgbWVuw7ogeSBsdWVnbyAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnZW5jaWEiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmVncmVzYXIgYSBsbGFtYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmVjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iTG8gc2VudGltb3MsIHZ1ZWx2ZSBhIGludGVudGFybG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxvIHNlbnRpbW9zLCB2dWVsdmUgYSBpbnRlbnRhcmxvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FyZ2FuZG8gKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmdhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+IlNlZ21lbnRvIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIHRhcmpldGEgU0lNIGVzdMOhIGJsb3F1ZWFkYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIHRhcmpldGEgU0lN4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkhhcyBpbmdyZXNhZG8gdHUgY29udHJhc2XDsWEgZGUgbWFuZXJhIGluY29ycmVjdGEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmVjZXMuICJcblxuIlZ1ZWx2ZSBhIGludGVudGFybG8gZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkhhcyBpbmdyZXNhZG8gdHUgUElOIGRlIG1hbmVyYSBpbmNvcnJlY3RhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiAiXG5cbiJWdWVsdmUgYSBpbnRlbnRhcmxvIGVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iSGFzIGV4dHJhw61kbyBpbmNvcnJlY3RhbWVudGUgdHUgcGF0csOzbiBkZSBkZXNibG9xdWVvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlY2VzLiBMdWVnbyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBpbmNvcnJlY3Rvcywgc2UgdGUgc29saWNpdGFyw6EgcXVlIGRlc2Jsb3F1ZWVzIHR1IHRlbMOpZm9ubyBhbCBpbmljaWFyIHNlc2nDs24gZW4gR29vZ2xlLiAiXG5cbiIgVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iVnVlbHZlIGEgaW50ZW50YXJsbyBlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLCv09sdmlkYXN0ZSBlbCBwYXRyw7NuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNjaW9uYXIgdG9kb3MiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iUGVnYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFncmVnYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYWwgZGljY2lvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvY28gZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkhheSBwb2NvIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gZW4gZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kby4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iRW5jZW5kaWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQVBBR0FETyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGFyIGxhIGFjY2nDs24gbWVkaWFudGUiPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJQcm92b2NhciBhY2VyY2FtaWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iTm90aWZpY2FyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJFc3BlcmEiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gQ29ycmVyIjwvc3RyaW5nPgpAQCAtODU0LDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJDbGF2ZSBwcmV2aWFtZW50ZSBjb21wYXJ0aWRhIHNlZ8O6biBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FkbyBzZWfDum4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJFbGVnaXIgYXJjaGl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5vIHNlIHNlbGVjY2lvbsOzIHVuIGFyY2hpdm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzdGFibGVjZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iRW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJmYXZvcml0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZG8gYXV0byBoYWJpbGl0YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjY2lvbmFyIHBhcmEgc2FsaXIgZGVsIG1vZG8gYXV0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJBbmNsYWplIGEgcmVkIG8gem9uYSBhY3RpdmEgY29uZWN0YWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2FyIHBhcmEgY29uZmlndXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkF0csOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IlNpZ3VpZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik9taXRpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkFtcGxpYSB1dGlsaXphY2nDs24gZGUgZGF0b3MgbcOzdmlsZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2EgcGFyYSBvYnRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsYSB1dGlsaXphY2nDs24gZGUgZGF0b3MgbcOzdmlsZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRlIGRhdG9zIG3Ds3ZpbGVzIGV4Y2VkaWRvICI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IDBkMmY5MzIuLmJiMmRmZDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnbG9iYWxfYWN0aW9uX3NpbGVudF9tb2RlX29uX3N0YXR1cyIgbXNnaWQ9IjMyODk4NDE5MzcwMDM3NTg4MDYiPiJFbCBzb25pZG8gZXN0w6EgZGVzYWN0aXZhZG8uIEFjdGl2YXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vZmZfc3RhdHVzIiBtc2dpZD0iMTUwNjA0NjU3OTE3NzA2NjQxOSI+IkVsIHNvbmlkbyBlc3TDoSBhY3RpdmFkby4gRGVzYWN0aXZhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJnbG9iYWxfYWN0aW9uc190b2dnbGVfYWlycGxhbmVfbW9kZSIgbXNnaWQ9IjU4ODQzMzAzMDY5MjYzMDc0NTYiPiJNb2RvIGF2acOzbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Imdsb2JhbF9hY3Rpb25zX2FpcnBsYW5lX21vZGVfb25fc3RhdHVzIiBtc2dpZD0iMjcxOTU1Nzk4MjYwODkxOTc1MCI+Ik1vZG8gYXZpw7NuIGFjdGl2YWRvLiBEZXNhY3RpdmFyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imdsb2JhbF9hY3Rpb25zX2FpcnBsYW5lX21vZGVfb25fc3RhdHVzIiBtc2dpZD0iMjcxOTU1Nzk4MjYwODkxOTc1MCI+Ik1vZG8gYXZpw7NuIGRlc2FjdGl2YWRvLiBBY3RpdmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imdsb2JhbF9hY3Rpb25zX2FpcnBsYW5lX21vZGVfb2ZmX3N0YXR1cyIgbXNnaWQ9IjUwNzUwNzA0NDI4NTQ0OTAyOTYiPiJNb2RvIGF2acOzbiBkZXNhY3RpdmFkby4gQWN0aXZhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYWZlTW9kZSIgbXNnaWQ9IjI3ODgyMjgwNjE1NDc5MzAyNDYiPiJNb2RvIHNlZ3VybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFuZHJvaWRfc3lzdGVtX2xhYmVsIiBtc2dpZD0iNjU3NzM3NTMzNTcyODU1MTMzNiI+IlNpc3RlbWEgQW5kcm9pZCI8L3N0cmluZz4KQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIHRvZG9zIGxvcyBkYXRvcyBkZSBjb250YWN0byAoZGlyZWNjaW9uZXMpIGFsbWFjZW5hZG9zIGVuIGVsIHRlbMOpZm9uby4gTGFzIGFwbGljYWNpb25lcyBtYWxpbnRlbmNpb25hZGFzIHB1ZWRlbiB1dGlsaXphciBlc3RlIHBlcm1pc28gcGFyYSBlbnZpYXIgdHVzIGRhdG9zIGEgb3RyYXMgcGVyc29uYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iZXNjcmliaXIgZGF0b3MgZGUgY29udGFjdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbG9zIGRhdG9zIGRlIGNvbnRhY3RvIChkaXJlY2Npb25lcykgYWxtYWNlbmFkb3MgZW4gZWwgdGVsw6lmb25vLiBMYXMgYXBsaWNhY2lvbmVzIG1hbGludGVuY2lvbmFkYXMgcHVlZGVuIHV0aWxpemFyIGVzdGUgcGVybWlzbyBwYXJhIGJvcnJhciBvIG1vZGlmaWNhciB0dXMgZGF0b3MgZGUgY29udGFjdG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJlc2NyaWJpciBkYXRvcyBkZSBwcm9waWV0YXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBtb2RpZmlxdWUgbG9zIGRhdG9zIGRlbCBwcm9waWV0YXJpbyBkZWwgdGVsw6lmb25vIGFsbWFjZW5hZG9zIGVuIGVsIHRlbMOpZm9uby4gTGFzIGFwbGljYWNpb25lcyBtYWxpbnRlbmNpb25hZGFzIHB1ZWRlbiB1dGlsaXphciBlc3RlIHBlcm1pc28gcGFyYSBib3JyYXIgbyBtb2RpZmljYXIgbG9zIGRhdG9zIGRlbCBwcm9waWV0YXJpby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4ibGVlciBkYXRvcyBkZWwgcHJvcGlldGFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkT3duZXJEYXRhIiBtc2dpZD0iMzA4ODQ4NjM4MzEyODQzNDUwNyI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBsZWEgbG9zIGRhdG9zIGRlbCBwcm9waWV0YXJpbyBkZWwgdGVsw6lmb25vIGFsbWFjZW5hZG9zIGVuIGVsIHRlbMOpZm9uby4gTGFzIGFwbGljYWNpb25lcyBtYWxpbnRlbmNpb25hZGFzIHB1ZWRlbiB1dGlsaXphciBlc3RlIHBlcm1pc28gcGFyYSBsZWVyIGxvcyBkYXRvcyBkZWwgcHJvcGlldGFyaW8gZGVsIHRlbMOpZm9uby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJsZWVyIGV2ZW50b3MgZGUgY2FsZW5kYXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiJQZXJtaXRlIHF1ZSB1bmEgYXBsaWNhY2nDs24gbGVhIHRvZG9zIGxvcyBldmVudG9zIGRlIGNhbGVuZGFyaW8gYWxtYWNlbmFkb3MgZW4gZWwgdGVsw6lmb25vLiBMYXMgYXBsaWNhY2lvbmVzIG1hbGludGVuY2lvbmFkYXMgcHVlZGVuIHV0aWxpemFyIGVzdGUgcGVybWlzbyBwYXJhIGVudmlhciB0dXMgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIGEgb3RyYXMgcGVyc29uYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImHDsWFkaXIgbyBtb2RpZmljYXIgZXZlbnRvcyBkZSBjYWxlbmRhcmlvIHkgZW52aWFyIG1lbnNhamVzIGRlIGNvcnJlbyBlbGVjdHLDs25pY28gYSBsb3MgaW52aXRhZG9zIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iUGVybWl0ZSBjb250cm9sYXIgZWwgbW9tZW50byBkZSBibG9xdWVvIGRlbCBkaXNwb3NpdGl2byBzb2xpY2l0YW5kbyBhbCB1c3VhcmlvIHF1ZSB2dWVsdmEgYSBpbnRyb2R1Y2lyIGxhIGNvbnRyYXNlw7FhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJCb3JyYXIgdG9kb3MgbG9zIGRhdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJQZXJtaXRlIHJlYWxpemFyIHVuIHJlc3RhYmxlY2ltaWVudG8gZGUgZsOhYnJpY2EgZWxpbWluYW5kbyB0b2RvcyBsb3MgZGF0b3Mgc2luIGNvbmZpcm1hY2nDs24uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iQ2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+Ik3Ds3ZpbCI8L2l0ZW0+CkBAIC01MjUsMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4iVHJhYmFqbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJPdHJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXphZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iYSB0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gYSB0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdWNlIGVsIGPDs2RpZ28gUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJJbnRyb2R1Y2lyIGNvbnRyYXNlw7FhIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IkludHJvZHVjaXIgUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJFbCBjw7NkaWdvIFBJTiBlcyBpbmNvcnJlY3RvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQYXJhIGRlc2Jsb3F1ZWFyIGVsIHRlbMOpZm9ubywgcHVsc2EgbGEgdGVjbGEgZGUgbWVuw7ogeSwgYSBjb250aW51YWNpw7NuLCBwdWxzYSAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7ptZXJvIGRlIGVtZXJnZW5jaWEiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iVm9sdmVyIGEgbGxhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkludMOpbnRhbG8gZGUgbnVldm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkludMOpbnRhbG8gZGUgbnVldm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJDYXJnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FyZ2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iSW50cm9kdWNlIGVsIGPDs2RpZ28gUElOLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkRlc2Jsb3F1ZWFuZG8gdGFyamV0YSBTSU0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJIYXMgcmVhbGl6YWRvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIGRlIGNyZWFjacOzbiBkZSB1biBwYXRyw7NuIGRlIGRlc2Jsb3F1ZW8uICJcblxuIkludMOpbnRhbG8gZGUgbnVldm8gZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkhhcyBpbnRyb2R1Y2lkbyB1bmEgY29udHJhc2XDsWEgaW5jb3JyZWN0YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IkhhcyBpbnRyb2R1Y2lkbyB1biBQSU4gaW5jb3JyZWN0byA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZWNlcy4gIlxuXG4iSW50w6ludGFsbyBkZSBudWV2byBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJIYXMgcmVhbGl6YWRvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGludGVudG9zIGZhbGxpZG9zIGRlIGNyZWFjacOzbiBkZWwgcGF0csOzbiBkZSBkZXNibG9xdWVvLiBTaSByZWFsaXphcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBpbnRlbnRvcyBmYWxsaWRvcyBtw6FzLCBzZSB0ZSBwZWRpcsOhIHF1ZSBkZXNibG9xdWVlcyBlbCB0ZWzDqWZvbm8gY29uIHR1cyBjcmVkZW5jaWFsZXMgZGUgYWNjZXNvIGRlIEdvb2dsZS4iXG5cbiIgRXNwZXJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zIGUgaW50w6ludGFsbyBkZSBudWV2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iRXNwZXJhIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBzZWd1bmRvcyB5IHZ1ZWx2ZSBhIGludGVudGFybG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLCv0hhcyBvbHZpZGFkbyBlbCBwYXRyw7NuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iU2VsZWNjaW9uYXIgdG9kbyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZWNjaW9uYXIgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iQ29ydGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJDb3BpYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQZWdhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iQ29waWFyIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNw6l0b2RvIGRlIGludHJvZHVjY2nDs24gZGUgdGV4dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iQcOxYWRpciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbCBkaWNjaW9uYXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iUG9jbyBlc3BhY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iU2UgZXN0w6EgYWdvdGFuZG8gZWwgZXNwYWNpbyBkZSBhbG1hY2VuYW1pZW50byBkZWwgdGVsw6lmb25vLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+IkFjZXB0YXIiPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJBY2VwdGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQ2FuY2VsYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4iQXRlbmNpw7NuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJDYXJnYW5kb+KApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJEZXNjb25lY3RhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkNvbXBsZXRhciBhY2Npw7NuIHV0aWxpemFuZG8iPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJGb3J6YXIgY2llcnJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IkluZm9ybWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkVzcGVyYXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhIGluZnJpbmdpZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2FwbGljYWJsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJFbCBwcm9jZXNvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSBpbmZyaW5naWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9hcGxpY2FibGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbiBlamVjdWNpw7NuIjwvc3RyaW5nPgpAQCAtODU0LDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJSZWQgcHJpdmFkYSB2aXJ0dWFsIEwyVFAvSVBTZWMgYmFzYWRhIGVuIGNsYXZlIGNvbXBhcnRpZGEgcHJldmlhbWVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iUmVkIHByaXZhZGEgdmlydHVhbCBMMlRQL0lQU2VjIGJhc2FkYSBlbiBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNlbGVjY2lvbmFyIGFyY2hpdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJBcmNoaXZvIG5vIHNlbGVjY2lvbmFkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlc3RhYmxlY2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iU2UgaGEgaGFiaWxpdGFkbyBlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY2Npb25hIGVzdGEgb3BjacOzbiBwYXJhIHNhbGlyIGRlbCBtb2RvIGNvY2hlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJBbmNsYWplIGEgcmVkIGFjdGl2byBvIHpvbmEgV2ktRmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJUb2NhIHBhcmEgaW5pY2lhciBsYSBjb25maWd1cmFjacOzbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJBdHLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTaWd1aWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJPbWl0aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVc28gZWxldmFkbyBkYXRvcyBtw7N2aWxlcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iTcOhcyBpbmZvcm1hY2nDs24gc29icmUgdXNvIGRlIGRhdG9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMw61taXRlIGRhdG9zIHN1cGVyYWRvIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKaW5kZXggYjRmODA0Ni4uMzQzODI5YSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0yODgsNiArMjg4LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ29udGFjdHMiIG1zZ2lkPSIzMzcxNTkxNTEyODk2NTQ1OTc1Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBsaXJlIHRvdXRlcyBsZXMgZG9ubsOpZXMgZGVzIGNvbnRhY3RzIChhZHJlc3NlcykgZW5yZWdpc3Ryw6llcyBzdXIgdm90cmUgdMOpbMOpcGhvbmUuIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHV0aWxpc2VyIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGVudm95ZXIgdm9zIGRvbm7DqWVzIMOgIGRcJ2F1dHJlcyBwZXJzb25uZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4iw4lkaXRpb24gZGVzIGRvbm7DqWVzIGRcJ3VuIGNvbnRhY3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbW9kaWZpZXIgdG91dGVzIGxlcyBkb25uw6llcyBkZSBjb250YWN0IChhZHJlc3NlcykgZW5yZWdpc3Ryw6llcyBzdXIgbGUgdMOpbMOpcGhvbmUuIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHV0aWxpc2VyIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGVmZmFjZXIgb3UgbW9kaWZpZXIgdm9zIGRvbm7DqWVzIGRlIGNvbnRhY3QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiLDiWRpdGlvbiBsZXMgZG9ubsOpZXMgZHUgcHJvcHJpw6l0YWlyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbW9kaWZpZXIgbGVzIGRvbm7DqWVzIGR1IHByb3ByacOpdGFpcmUgZHUgdMOpbMOpcGhvbmUgZW5yZWdpc3Ryw6llcyBzdXIgdm90cmUgYXBwYXJlaWwuIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHV0aWxpc2VyIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGVmZmFjZXIgb3UgbW9kaWZpZXIgY2VzIGRvbm7DqWVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiJMZWN0dXJlIGRlcyBkb25uw6llcyBkdSBwcm9wcmnDqXRhaXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGxpcmUgbGVzIGRvbm7DqWVzIGR1IHByb3ByacOpdGFpcmUgZHUgdMOpbMOpcGhvbmUgZW5yZWdpc3Ryw6llcyBzdXIgdm90cmUgYXBwYXJlaWwuIERlcyBhcHBsaWNhdGlvbnMgbWFsdmVpbGxhbnRlcyBwZXV2ZW50IHV0aWxpc2VyIGNldHRlIGZvbmN0aW9ubmFsaXTDqSBwb3VyIGxpcmUgY2VzIGRvbm7DqWVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+ImxpcmUgZGVzIMOpdsOpbmVtZW50cyBkZSBsXCdhZ2VuZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBsaXJlIHRvdXMgbGVzIMOpdsOpbmVtZW50cyBkZSBsXCdhZ2VuZGEgZW5yZWdpc3Ryw6lzIHN1ciB2b3RyZSB0w6lsw6lwaG9uZS4gRGVzIGFwcGxpY2F0aW9ucyBtYWx2ZWlsbGFudGVzIHBldXZlbnQgdXRpbGlzZXIgY2V0dGUgZm9uY3Rpb25uYWxpdMOpIHBvdXIgZW52b3llciBsZXMgw6l2w6luZW1lbnRzIGRlIHZvdHJlIGFnZW5kYSDDoCBkXCdhdXRyZXMgcGVyc29ubmVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDYWxlbmRhciIgbXNnaWQ9IjM4OTQ4NzkzNTI1OTQ5MDQzNjEiPiJham91dGVyIG91IG1vZGlmaWVyIGRlcyDDqXbDqW5lbWVudHMgZFwnYWdlbmRhIGV0IGVudm95ZXIgZGVzIGUtbWFpbHMgYXV4IGludml0w6lzIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHLDtGxlIGxlIHZlcnJvdWlsbGFnZSBkdSBww6lyaXBow6lyaXF1ZSwgYXZlYyBvYmxpZ2F0aW9uIGRlIHNhaXNpciDDoCBub3V2ZWF1IGxlIG1vdCBkZSBwYXNzZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iRWZmYWNlciB0b3V0ZXMgbGVzIGRvbm7DqWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJSw6l0YWJsaXQgbGVzIHBhcmFtw6h0cmVzIGRcJ3VzaW5lLCBzdXBwcmltYW50IHRvdXRlcyB2b3MgZG9ubsOpZXMgc2FucyBkZW1hbmRlIGRlIGNvbmZpcm1hdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiJEb21pY2lsZSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IlBvcnRhYmxlIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJCdXJlYXUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iQXV0cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29ubmFsaXPDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJ2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJTYWlzaXNzZXogbGUgY29kZSBQSU4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlNhaXNpc3NleiBsZSBtb3QgZGUgcGFzc2UgcG91ciBwcm9jw6lkZXIgYXUgZMOpdmVycm91aWxsYWdlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iU2Fpc2lzc2V6IGxlIGNvZGUgUElOIHBvdXIgcHJvY8OpZGVyIGF1IGTDqXZlcnJvdWlsbGFnZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJMZSBjb2RlIFBJTiBlc3QgaW5jb3JyZWN0wqAhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBvdXIgZMOpYmxvcXVlciBsZSBjbGF2aWVyLCBhcHB1eWV6IHN1ciBcIk1lbnVcIiBwdWlzIHN1ciAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOdW3DqXJvIGRcJ3VyZ2VuY2UiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmV0b3VyIMOgIGxcJ2FwcGVsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29tYmluYWlzb24gY29ycmVjdGXCoCEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4iSW5jb3JyZWN0LiBNZXJjaSBkZSByw6llc3NheWVyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iSW5jb3JyZWN0LiBNZXJjaSBkZSByw6llc3NheWVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkNoYXJnZW1lbnQgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2hhcmfDqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz7CoDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IkxhIGNhcnRlIFNJTSBlc3QgdmVycm91aWxsw6llLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IkTDqWJsb2NhZ2UgZGUgbGEgY2FydGUgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iVm91cyBhdmV6IG1hbCByZXByb2R1aXQgbGUgc2Now6ltYSBkZSBkw6l2ZXJyb3VpbGxhZ2UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZm9pcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVzLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlZvdXMgYXZleiBzYWlzaSB1biBtb3QgZGUgcGFzc2UgaW5jb3JyZWN0IMOgIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+wqByZXByaXNlcy4gIlxuXG4iVmV1aWxsZXogcsOpZXNzYXllciBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+wqBzZWNvbmRlcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iVm91cyBhdmV6IHNhaXNpIHVuIGNvZGUgUElOIGluY29ycmVjdCDDoCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPsKgcmVwcmlzZXMuICJcblxuIlZldWlsbGV6IHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJWb3VzIGF2ZXogbWFsIHNhaXNpIGxlIHNjaMOpbWEgZGUgZMOpdmVycm91aWxsYWdlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGZvaXMuIEF1IGJvdXQgZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZlcyBzdXBwbMOpbWVudGFpcmVzLCB2b3VzIGRldnJleiBkw6libG9xdWVyIHZvdHJlIHTDqWzDqXBob25lIMOgIGxcJ2FpZGUgZGUgdm90cmUgaWRlbnRpZmlhbnQgR29vZ2xlLiJcblxuIk1lcmNpIGRlIHLDqWVzc2F5ZXIgZGFucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUsOpZXNzYXlleiBkYW5zIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgc2Vjb25kZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJTY2jDqW1hIG91Ymxpw6kgPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVG91dCBzw6lsZWN0aW9ubmVyIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJTw6lsZWN0aW9ubmVyIGxlIHRleHRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvdXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sbGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpZXIgbFwnVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik1vZGUgZGUgc2Fpc2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFqb3V0ZXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYXUgZGljdGlvbm5haXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iTW9kaWZpZXIgbGUgdGV4dGUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IkVzcGFjZSBkaXNwb25pYmxlIGZhaWJsZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkxhIG3DqW1vaXJlIGR1IHTDqWzDqXBob25lIGNvbW1lbmNlIMOgIMOqdHJlIHBsZWluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdHRlbnRpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNoYXJnZW1lbnQgZW4gY291cnMuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb250aW51ZXIgYXZlYyI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IkZvcmNlciBsYSBmZXJtZXR1cmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iQXR0ZW5kcmUiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTFwnYXBwbGljYXRpb24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc3VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgYSBlbmZyZWludCBzZXMgcHJvcHJlcyByw6hnbGVzIGR1IG1vZGUgc3RyaWN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkxlIHByb2Nlc3N1cyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gYSBlbmZyZWludCBzZXMgcHJvcHJlcyByw6hnbGVzIGR1IG1vZGUgc3RyaWN0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7CoGVuIGNvdXJzIGRcJ2V4w6ljdXRpb24iPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc8OpIHN1ciB1bmUgY2zDqSBwcsOpLXBhcnRhZ8OpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJWUE4gTDJUUC9JUFNlYyBiYXPDqSBzdXIgdW4gY2VydGlmaWNhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlPDqWxlY3Rpb25uZXIgdW4gZmljaGllciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkF1Y3VuIGZpY2hpZXIgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlLDqWluaXRpYWxpc2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudm95ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZGUgVm9pdHVyZSBhY3RpdsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlPDqWxlY3Rpb25uZXogY2V0dGUgb3B0aW9uIHBvdXIgcXVpdHRlciBsZSBtb2RlIFZvaXR1cmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlBhcnRhZ2UgZGUgY29ubmV4aW9uIG91IHBvaW50IGRcJ2FjY8OocyBzYW5zIGZpbCBhY3RpdsOpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG91Y2hlciBwb3VyIGNvbmZpZ3VyZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJSZXRvdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTdWl2YW50Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSWdub3JlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IlV0aWxpc2F0aW9uIMOpbGV2w6llIGRlcyBkb25uw6llcyBtb2JpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3VjaGV6IHBvdXIgZW4gc2F2b2lyIHBsdXMgc3VyIGxcJ3V0aWxpc2F0aW9uIGRlcyBkb25uw6llcyBtb2JpbGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJRdW90YSBkXCd1dGlsaXNhdGlvbiBkZXMgZG9ubsOpZXMgbW9iaWxlcyBkw6lwYXNzw6kiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCBkNDAxOWI2Li41OGEzNGViIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJDb25zZW50ZSBsYSBsZXR0dXJhIGRhIHBhcnRlIGRpIHVuXCdhcHBsaWNhemlvbmUgZGkgdHV0dGkgaSBkYXRpIChnbGkgaW5kaXJpenppKSBkaSBjb250YXR0byBtZW1vcml6emF0aSBzdWwgdGVsZWZvbm8uIExlIGFwcGxpY2F6aW9uaSBkYW5ub3NlIHBvc3Nvbm8gc2ZydXR0YXJlIHF1ZXN0YSBwb3NzaWJpbGl0w6AgcGVyIGludmlhcmUgaSBkYXRpIGFkIGFsdHJlIHBlcnNvbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ic2NyaXR0dXJhIGRhdGkgZGkgY29udGF0dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBtb2RpZmljYXJlIGkgZGF0aSAoZ2xpIGluZGlyaXp6aSkgZGkgY29udGF0dG8gbWVtb3JpenphdGkgc3VsIHRlbGVmb25vLiBMZSBhcHBsaWNhemlvbmkgZGFubm9zZSBwb3Nzb25vIHNmcnV0dGFyZSBxdWVzdGEgcG9zc2liaWxpdMOgIHBlciBjYW5jZWxsYXJlIG8gbW9kaWZpY2FyZSBpIGRhdGkgZGkgY29udGF0dG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJzY3JpdHR1cmEgZGF0aSBwcm9wcmlldGFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJDb25zZW50ZSBhIHVuXCdhcHBsaWNhemlvbmUgZGkgbW9kaWZpY2FyZSBpIGRhdGkgZGVsIHByb3ByaWV0YXJpbyBkZWwgdGVsZWZvbm8gbWVtb3JpenphdGkgc3VsIHRlbGVmb25vLiBMZSBhcHBsaWNhemlvbmkgZGFubm9zZSBwb3Nzb25vIHNmcnV0dGFyZSBxdWVzdGEgcG9zc2liaWxpdMOgIHBlciBjYW5jZWxsYXJlIG8gbW9kaWZpY2FyZSB0YWxpIGRhdGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+ImxldHR1cmEgZGF0aSBwcm9wcmlldGFyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkT3duZXJEYXRhIiBtc2dpZD0iMzA4ODQ4NjM4MzEyODQzNDUwNyI+IkNvbnNlbnRlIGEgdW5cJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIGkgZGF0aSBkZWwgcHJvcHJpZXRhcmlvIGRlbCB0ZWxlZm9ubyBtZW1vcml6emF0aSBzdWwgdGVsZWZvbm8uIExlIGFwcGxpY2F6aW9uaSBkYW5ub3NlIHBvc3Nvbm8gc2ZydXR0YXJlIHF1ZXN0YSBwb3NzaWJpbGl0w6AgcGVyIGxlZ2dlcmUgdGFsaSBkYXRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+ImxlZ2dlcmUgZXZlbnRpIGRpIGNhbGVuZGFyaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4iQ29uc2VudGUgbGEgbGV0dHVyYSBkYSBwYXJ0ZSBkaSB1blwnYXBwbGljYXppb25lIGRpIHR1dHRpIGdsaSBldmVudGkgZGkgY2FsZW5kYXJpbyBtZW1vcml6emF0aSBzdWwgdGVsZWZvbm8uIExlIGFwcGxpY2F6aW9uaSBkYW5ub3NlIHBvc3Nvbm8gc2ZydXR0YXJlIHF1ZXN0YSBwb3NzaWJpbGl0w6AgcGVyIGludmlhcmUgaSB0dW9pIGV2ZW50aSBkaSBjYWxlbmRhcmlvIGFkIGFsdHJlIHBlcnNvbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImFnZ2l1bmdlcmUgbyBtb2RpZmljYXJlIGV2ZW50aSBkaSBjYWxlbmRhcmlvIGUgaW52aWFyZSBlbWFpbCBhZ2xpIGludml0YXRpIjwvc3RyaW5nPgpAQCAtNDMyLDExICs0MzYsMTUgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNvbnRyb2xsYSBxdWFuZG8gaWwgZGlzcG9zaXRpdm8gc2kgYmxvY2NhLCBjaGllZGVuZG90aSBkaSByZWluc2VyaXJlIGxhIHBhc3N3b3JkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJDYW5jZWxsYSB0dXR0aSBpIGRhdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IkVzZWd1aSB1biByaXByaXN0aW5vIGRpIGZhYmJyaWNhLCBlbGltaW5hbmRvIHR1dHRpIGkgdHVvaSBkYXRpIHNlbnphIGNvbmZlcm1hLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkNhc2EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWxsdWxhcmUiPC9pdGVtPgotICAgIDxpdGVtIG1zZ2lkPSI3ODk3NTQ0NjU0MjQyODc0NTQzIj4iTGF2b3JvIjwvaXRlbT4KLSAgICA8aXRlbSBtc2dpZD0iMTEwMzYwMTQzMzM4MjE1ODE1NSI+IkZheCBsYXZvcm8iPC9pdGVtPgorICAgIDxpdGVtIG1zZ2lkPSI3ODk3NTQ0NjU0MjQyODc0NTQzIj4iVWZmaWNpbyI8L2l0ZW0+CisgICAgPGl0ZW0gbXNnaWQ9IjExMDM2MDE0MzMzODIxNTgxNTUiPiJGYXggdWZmaWNpbyI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9IjE3MzUxNzcxNDQ5NDgzMjkzNzAiPiJGYXggY2FzYSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9IjYwMzg3ODY3NDQ3NzIwNzM5NCI+IkNlcmNhcGVyc29uZSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9IjE2NTA4MjQyNzUxNzc5MzE2MzciPiJBbHRybyI8L2l0ZW0+CkBAIC00NDQsMjQgKzQ1MiwyNCBAQAogICA8L3N0cmluZy1hcnJheT4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJlbWFpbEFkZHJlc3NUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9IjgwNzM5OTQzNTI5NTYxMjkxMjciPiJDYXNhIjwvaXRlbT4KLSAgICA8aXRlbSBtc2dpZD0iNzA4NDIzNzM1NjYwMjYyNTYwNCI+Ikxhdm9ybyI8L2l0ZW0+CisgICAgPGl0ZW0gbXNnaWQ9IjcwODQyMzczNTY2MDI2MjU2MDQiPiJVZmZpY2lvIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iMTExMjA0NDQxMDY1OTAxMTAyMyI+IkFsdHJvIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iMjM3NDkxMzk1Mjg3MDExMDYxOCI+IlBlcnNvbmFsaXp6YXRvIjwvaXRlbT4KICAgPC9zdHJpbmctYXJyYXk+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icG9zdGFsQWRkcmVzc1R5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iNjg4MDI1NzYyNjc0MDA0NzI4NiI+IkNhc2EiPC9pdGVtPgotICAgIDxpdGVtIG1zZ2lkPSI1NjI5MTUzOTU2MDQ1MTA5MjUxIj4iTGF2b3JvIjwvaXRlbT4KKyAgICA8aXRlbSBtc2dpZD0iNTYyOTE1Mzk1NjA0NTEwOTI1MSI+IlVmZmljaW8iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI0OTY2NjA0MjY0NTAwMzQzNDY5Ij4iQWx0cm8iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI0OTMyNjgyODQ3NTk1Mjk5MzY5Ij4iUGVyc29uYWxpenphdG8iPC9pdGVtPgogICA8L3N0cmluZy1hcnJheT4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJpbUFkZHJlc3NUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9IjE3Mzg1ODUxOTQ2MDE0NzY2OTQiPiJDYXNhIjwvaXRlbT4KLSAgICA8aXRlbSBtc2dpZD0iMTM1OTY0NDU2NTY0NzM4MzcwOCI+Ikxhdm9ybyI8L2l0ZW0+CisgICAgPGl0ZW0gbXNnaWQ9IjEzNTk2NDQ1NjU2NDczODM3MDgiPiJVZmZpY28iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI3ODY4NTQ5NDAxMDUzNjE1Njc3Ij4iQWx0cm8iPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSIzMTQ1MTE4OTQ0NjM5ODY5ODA5Ij4iUGVyc29uYWxpenphdG8iPC9pdGVtPgogICA8L3N0cmluZy1hcnJheT4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJvcmdhbml6YXRpb25UeXBlcyI+Ci0gICAgPGl0ZW0gbXNnaWQ9Ijc1NDYzMzU2MTIxODkxMTU2MTUiPiJMYXZvcm8iPC9pdGVtPgorICAgIDxpdGVtIG1zZ2lkPSI3NTQ2MzM1NjEyMTg5MTE1NjE1Ij4iVWZmaWNpbyI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9IjQzNzgwNzQxMjkwNDk1MjAzNzMiPiJBbHRybyI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9IjM0NTUwNDc0Njg1ODM5NjUxMDQiPiJQZXJzb25hbGl6emF0byI8L2l0ZW0+CiAgIDwvc3RyaW5nLWFycmF5PgpAQCAtNDc4LDggKzQ4Niw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVDdXN0b20iIG1zZ2lkPSIxNjQ0NzM4MDU5MDUzMzU1ODIwIj4iUGVyc29uYWxpenphdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVIb21lIiBtc2dpZD0iMjU3MDkyMzQ2MzAzMzk4NTg4NyI+IkNhc2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVNb2JpbGUiIG1zZ2lkPSI2NTAxNDYzNTU3NzU0NzUxMDM3Ij4iQ2VsbHVsYXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGhvbmVUeXBlV29yayIgbXNnaWQ9Ijg4NjM5Mzk2NjcwNTk5MTE2MzMiPiJMYXZvcm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVGYXhXb3JrIiBtc2dpZD0iMzUxNzc5MjE2MDAwODg5MDkxMiI+IkZheCBsYXZvcm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVXb3JrIiBtc2dpZD0iODg2MzkzOTY2NzA1OTkxMTYzMyI+IlVmZmljaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVGYXhXb3JrIiBtc2dpZD0iMzUxNzc5MjE2MDAwODg5MDkxMiI+IkZheCB1ZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGhvbmVUeXBlRmF4SG9tZSIgbXNnaWQ9IjIwNjcyNjU5NzIzMjI5NzE0NjciPiJGYXggY2FzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBob25lVHlwZVBhZ2VyIiBtc2dpZD0iNzU4MjM1OTk1NTM5NDkyMTczMiI+IkNlcmNhcGVyc29uZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBob25lVHlwZU90aGVyIiBtc2dpZD0iMTU0NDQyNTg0Nzg2ODc2NTk5MCI+IkFsdHJvIjwvc3RyaW5nPgpAQCAtNDkzLDcgKzUwMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVUZWxleCIgbXNnaWQ9IjMzNjc4Nzk5NTI0NzYyNTA1MTIiPiJUZWxleCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBob25lVHlwZVR0eVRkZCIgbXNnaWQ9Ijg2MDY1MTQzNzg1ODUwMDAwNDQiPiJUVFkgVEREIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGhvbmVUeXBlV29ya01vYmlsZSIgbXNnaWQ9IjEzMTE0MjY5ODkxODQwNjU3MDkiPiJDZWxsdWxhcmUgbGF2b3JvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGhvbmVUeXBlV29ya1BhZ2VyIiBtc2dpZD0iNjQ5OTM4NzMxMjMxMTU3MDU2Ij4iQ2VyY2FwZXJzb25lIGxhdm9ybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBob25lVHlwZVdvcmtQYWdlciIgbXNnaWQ9IjY0OTkzODczMTIzMTE1NzA1NiI+IkNlcmNhcGVyc29uZSB1ZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGhvbmVUeXBlQXNzaXN0YW50IiBtc2dpZD0iNTU5Njc3MjYzNjEyODU2Mjg4NCI+IkFzc2lzdGVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwaG9uZVR5cGVNbXMiIG1zZ2lkPSI3MjU0NDkyMjc1NTAyNzY4OTkyIj4iTU1TIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXZlbnRUeXBlQmlydGhkYXkiIG1zZ2lkPSIyODEzMzc5ODQ0MjExMzkwNzQwIj4iQ29tcGxlYW5ubyI8L3N0cmluZz4KQEAgLTUwMSwxNiArNTA5LDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJldmVudFR5cGVPdGhlciIgbXNnaWQ9IjU4MzQyODg3OTE5NDg1NjQ1OTQiPiJFdmVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWFpbFR5cGVDdXN0b20iIG1zZ2lkPSI4NTI1OTYwMjU3ODA0MjEzODQ2Ij4iUGVyc29uYWxpenphdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWFpbFR5cGVIb21lIiBtc2dpZD0iNDQ5MjI3MjM2MTQwNDMzOTE5Ij4iQ2FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVtYWlsVHlwZVdvcmsiIG1zZ2lkPSIzNTQ4MDU4MDU5NjAxMTQ5OTczIj4iTGF2b3JvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZW1haWxUeXBlV29yayIgbXNnaWQ9IjM1NDgwNTgwNTk2MDExNDk5NzMiPiJVZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1haWxUeXBlT3RoZXIiIG1zZ2lkPSIyOTIzMDA4Njk1MjcyNjM5NTQ5Ij4iQWx0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWFpbFR5cGVNb2JpbGUiIG1zZ2lkPSIxMTk5MTkwMDUzMjExNjYyMDUiPiJDZWxsdWxhcmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb3N0YWxUeXBlQ3VzdG9tIiBtc2dpZD0iODkwMzIwNjkwMzA2MDQ3OTkwMiI+IlBlcnNvbmFsaXp6YXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9zdGFsVHlwZUhvbWUiIG1zZ2lkPSI4MTY1NzU2OTc3MTg0NDgzMDk3Ij4iQ2FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBvc3RhbFR5cGVXb3JrIiBtc2dpZD0iNTI2ODE3Mjc3MjM4NzY5NDQ5NSI+Ikxhdm9ybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvc3RhbFR5cGVXb3JrIiBtc2dpZD0iNTI2ODE3Mjc3MjM4NzY5NDQ5NSI+IlVmZmljaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb3N0YWxUeXBlT3RoZXIiIG1zZ2lkPSIyNzI2MTExOTY2NjIzNTg0MzQxIj4iQWx0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbVR5cGVDdXN0b20iIG1zZ2lkPSIyMDc0MDI4NzU1NTI3ODI2MDQ2Ij4iUGVyc29uYWxpenphdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbVR5cGVIb21lIiBtc2dpZD0iNjI0MTE4MTAzMjk1NDI2Mzg5MiI+IkNhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJpbVR5cGVXb3JrIiBtc2dpZD0iMTM3MTQ4OTI5MDI0MjQzMzA5MCI+Ikxhdm9ybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImltVHlwZVdvcmsiIG1zZ2lkPSIxMzcxNDg5MjkwMjQyNDMzMDkwIj4iVWZmaWNpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltVHlwZU90aGVyIiBtc2dpZD0iNTM3NzAwNzQ5NTczNTkxNTQ3OCI+IkFsdHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbEN1c3RvbSIgbXNnaWQ9IjY5MTk0NTM4MzY2MTg3NDk5OTIiPiJQZXJzb25hbGl6emF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xBaW0iIG1zZ2lkPSI3MDUwMzYwNjEyMzY4MzgzNDE3Ij4iQUlNIjwvc3RyaW5nPgpAQCAtNTIyLDEzICs1MzAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImltUHJvdG9jb2xJY3EiIG1zZ2lkPSIxNTc0ODcwNDMzNjA2NTE3MzE1Ij4iSUNRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW1Qcm90b2NvbEphYmJlciIgbXNnaWQ9IjIyNzk5MTc2MzA4NzU3NzE3MjIiPiJKYWJiZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJpbVByb3RvY29sTmV0TWVldGluZyIgbXNnaWQ9IjgyODc2MjU2NTU5ODY4Mjc5NzEiPiJOZXRNZWV0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+Ikxhdm9ybyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJVZmZpY2lvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IkFsdHJvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXp6YXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InRyYW1pdGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0cmFtaXRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW5zZXJpc2NpIGlsIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW5zZXJpc2NpIHBhc3N3b3JkIHBlciBzYmxvY2NhcmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ikluc2VyaXNjaSBQSU4gcGVyIHNibG9jY2FyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkNvZGljZSBQSU4gZXJyYXRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJQZXIgc2Jsb2NjYXJlLCBwcmVtaSBNZW51LCBwb2kgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXJvIGRpIGVtZXJnZW56YSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJUb3JuYSBhIGNoaWFtYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4iQ29ycmV0dGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlJpcHJvdmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlJpcHJvdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJJbiBjYXJpY2EgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmljby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTGEgU0lNIMOoIGJsb2NjYXRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNibG9jY28gU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uICJcblxuIlJpcHJvdmEgZnJhIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWxsYSBwYXNzd29yZC4gIlxuXG4iUmlwcm92YSB0cmEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGVycmF0aSBkaSBpbnNlcmltZW50byBkZWwgUElOLiAiXG5cbiJSaXByb3ZhIHRyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGRpIGluc2VyaW1lbnRvIGRlbGxhIHNlcXVlbnphIGRpIHNibG9jY28uIERvcG8gYWx0cmkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdGVudGF0aXZpIGZhbGxpdGksIHRpIHZlcnLDoCBjaGllc3RvIGRpIHNibG9jY2FyZSBpbCB0ZWxlZm9ubyB0cmFtaXRlIGkgZGF0aSBkaSBhY2Nlc3NvIGRpIEdvb2dsZS4iXG5cbiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBzZWNvbmRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJSaXByb3ZhIGZyYSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2Vjb25kaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkhhaSBkaW1lbnRpY2F0byBsYSBzZXF1ZW56YT8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGV6aW9uYSB0dXR0byI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iU2VsZXppb25hIHRlc3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IlRhZ2xpYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJJbmNvbGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYSBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTWV0b2RvIGluc2VyaW1lbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFnZ2l1bmdpIFwiPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPlwiIGFsIGRpemlvbmFyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJNb2RpZmljYSB0ZXN0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iU3BhemlvIGluIGVzYXVyaW1lbnRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iU3BhemlvIGRpIGFyY2hpdmlhemlvbmUgZGVsIHRlbGVmb25vIGluIGVzYXVyaW1lbnRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJBbm51bGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0dGVuemlvbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcmljYW1lbnRvIGluIGNvcnNvLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiJPTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+Ik9GRiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQ29tcGxldGEgbFwnYXppb25lIGNvbiI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlRlcm1pbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iU2VnbmFsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iQXR0ZW5kaSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNhemlvbmUgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSB2aW9sYXRvIGxhIG5vcm1hIFN0cmljdE1vZGUgYXV0b2ltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iSWwgcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhdG8gbGEgbm9ybWEgU3RyaWN0TW9kZSBhdXRvaW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGluIGVzZWN1emlvbmUiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjaGlhdmUgcHJlY29uZGl2aXNhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGJhc2F0YSBzdSBjZXJ0aWZpY2F0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlNjZWdsaSBmaWxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTmVzc3VuIGZpbGUgw6ggc3RhdG8gc2NlbHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVpbXBvc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkludmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiJwcmVmZXJpdGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RhbGl0w6AgYXV0b21vYmlsZSBhdHRpdmF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlemlvbmEgcGVyIHVzY2lyZSBkYWxsYSBtb2RhbGl0w6AgYXV0b21vYmlsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVGV0aGVyaW5nIG9wcHVyZSBob3RzcG90IGF0dGl2byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRvY2NhIHBlciBjb25maWd1cmFyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IkluZGlldHJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iU2FsdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXp6byBkYXRpIGNlbGwuIGVsZXZhdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+IlRvY2NhIHBlciBpbmZvcm1hemlvbmkgc3VsbFwndXRpbGl6em8gZGF0aSBjZWxsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRhdGkgY2VsbC4gc3VwZXJhdG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAppbmRleCBhZTQ0YmIyLi43ZGEzMGY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiLnq6/mnKvjgavkv53lrZjjgZfjgZ/pgKPntaHlhYjvvIjjgqLjg4njg6zjgrnvvInjg4fjg7zjgr/jga7oqq3jgb/lj5bjgorjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILmgqrmhI/jga7jgYLjgovjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgYzjg4fjg7zjgr/jgpLku5bkurrjgavpgIHkv6HjgZnjgovmgZDjgozjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLpgKPntaHlhYjjg4fjg7zjgr/jga7mm7jjgY3ovrzjgb8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+Iuerr+acq+OBq+S/neWtmOOBl+OBn+mAo+e1oeWFiO+8iOOCouODieODrOOCue+8ieODh+ODvOOCv+OBruWkieabtOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAguaCquaEj+OBruOBguOCi+OCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOmAo+e1oeWFiOODh+ODvOOCv+OCkua2iOWOuy/lpInmm7TjgZnjgovmgZDjgozjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+IuaJgOacieiAheODh+ODvOOCv+OBruabuOOBjei+vOOBvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+Iuerr+acq+OBq+S/neWtmOOBl+OBn+aJgOacieiAheOBruODh+ODvOOCv+OBruWkieabtOOCkuOCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+ioseWPr+OBl+OBvuOBmeOAguaCquaEj+OBruOBguOCi+OCouODl+ODquOCseODvOOCt+ODp+ODs+OBjOaJgOacieiAheOBruODh+ODvOOCv+OCkua2iOWOuy/lpInmm7TjgZnjgovmgZDjgozjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4i5omA5pyJ6ICF44OH44O844K/44Gu6Kqt44G/5Y+W44KKIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiLmkLrluK/pm7voqbHjgavkv53lrZjjgZfjgZ/miYDmnInogIXjg4fjg7zjgr/jga7oqq3jgb/lj5bjgorjgpLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgavoqLHlj6/jgZfjgb7jgZnjgILmgqrmhI/jga7jgYLjgovjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgYzmiYDmnInogIXjg4fjg7zjgr/jgpLoqq3jgb/lj5bjgovmgZDjgozjgYzjgYLjgorjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiLjgqvjg6zjg7Pjg4Djg7zjga7kuojlrprjga7oqq3jgb/lj5bjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4i56uv5pyr44Gr5L+d5a2Y44GX44Gf44Kr44Os44Oz44OA44O844Gu5LqI5a6a44Gu6Kqt44G/5Y+W44KK44KS44Ki44OX44Oq44Kx44O844K344On44Oz44Gr6Kix5Y+v44GX44G+44GZ44CC5oKq5oSP44Gu44GC44KL44Ki44OX44Oq44Kx44O844K344On44Oz44GM44Kr44Os44Oz44OA44O844Gu5LqI5a6a44KS5LuW5Lq644Gr6YCB5L+h44GZ44KL5oGQ44KM44GM44GC44KK44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+IuOCq+ODrOODs+ODgOODvOOBruS6iOWumuOBrui/veWKoOOChOWkieabtOOCkuihjOOBhOOAgeOCsuOCueODiOOBq+ODoeODvOODq+OCkumAgeS/oeOBmeOCiyI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IuaQuuW4r+mbu+ipseOBruODreODg+OCr+aZguOCkueuoeeQhuOBl+OBvuOBmeOAguODkeOCueODr+ODvOODieOBruWGjeWFpeWKm+OBjOW/heimgeOBqOOBquOCiuOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLjgZnjgbnjgabjga7jg4fjg7zjgr/jgpLmtojljrsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IuWHuuiNt+aZguioreWumuOBq+ODquOCu+ODg+ODiOOBl+OBvuOBmeOAgueiuuiqjeOBquOBl+OBp+ODh+ODvOOCv+OBjOOBmeOBueOBpuWJiumZpOOBleOCjOOBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuiHquWuhSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuaQuuW4ryI8L2l0ZW0+CkBAIC01MjUsMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5Yuk5YuZ5YWIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuOBneOBruS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLjgqvjgrnjgr/jg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz7ntYznlLEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPuOAgeabtOaWsOWFgzogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU7jgrPjg7zjg4njgpLlhaXlipsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IuODreODg+OCr+OCkuino+mZpOOBmeOCi+OBq+OBr+ODkeOCueODr+ODvOODieOCkuWFpeWKmyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i44Ot44OD44Kv44KS6Kej6Zmk44GZ44KL44Gr44GvUElO44KS5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElO44Kz44O844OJ44GM5q2j44GX44GP44GC44KK44G+44Gb44KT44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+Ik1FTlXjgIEw44Kt44O844Gn44Ot44OD44Kv6Kej6ZmkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iue3iuaApemAmuWgseeVquWPtyI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLpgJroqbHjgavmiLvjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLkuIDoh7TjgZfjgb7jgZfjgZ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i44KE44KK55u044GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiLjgoTjgornm7TjgZfjgabjgY/jgaDjgZXjgYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLlhYXpm7vkuK3vvIg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+77yJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOS6huOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU3jgqvjg7zjg4njga/jg63jg4Pjgq/jgZXjgozjgabjgYTjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU3jgqvjg7zjg4njga7jg63jg4Pjgq/op6PpmaTkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLjg63jg4Pjgq/op6PpmaTjga7jg5Hjgr/jg7zjg7Pjga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+aMh+WumuOBleOCjOOBpuOBhOOBvuOBm+OCk+OAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5YWl5Yqb44GX44Gf44OR44K544Ov44O844OJ44GvPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz7lm57jgajjgoLmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIIiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuenkuW+jOOBq+OCguOBhuS4gOW6puWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLlhaXlipvjgZfjgZ9QSU7jga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgiJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KC44GG5LiA5bqm5YWl5Yqb44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLmjIflrprjgZfjgZ/jg5Hjgr/jg7zjg7Pjga88eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPuWbnuOBqOOCguato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAguOBguOBqDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+5Zue5oyH5a6a44Gr5aSx5pWX44GZ44KL44Go44CB5pC65biv6Zu76Kmx44Gu44Ot44OD44Kv44Gu6Kej6Zmk44GrR29vZ2xl44G444Gu44Ot44Kw44Kk44Oz44GM5b+F6KaB44Gr44Gq44KK44G+44GZ44CCIlxuXG4iPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz7np5LlvozjgavjgoLjgYbkuIDluqbmjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+56eS5b6M44Gr44KE44KK55u044GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiLjg5Hjgr/jg7zjg7PjgpLlv5jjgozjgZ/loLTlkIgiPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuOBmeOBueOBpumBuOaKniI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4i44OG44Kt44K544OI44KS6YG45oqeIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IuWIh+OCiuWPluOCiiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4i44Kz44OU44O8Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i6LK844KK5LuY44GRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkzjgpLjgrPjg5Tjg7wiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i5YWl5Yqb5pa55rOVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+Iui+nuabuOOBq+OAjDx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7jgI3jgpLov73liqAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLjg4bjgq3jgrnjg4jjgpLnt6jpm4YiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IuepuuOBjeWuuemHj+S9juS4iyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IuaQuuW4r+mbu+ipseOBruepuuOBjeWuuemHj+OBjOWwkeOBquOBj+OBquOBo+OBpuOBhOOBvuOBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLjgq3jg6Pjg7Pjgrvjg6siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLoqq3jgb/ovrzjgb/kuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+Ik9OIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iT0ZGIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgpLpgbjmip4iPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLlvLfliLbntYLkuoYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4i44Os44Od44O844OIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLlvoXmqZ8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i44Ki44OX44Oq44Kx44O844K344On44OzPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPu+8iOODl+ODreOCu+OCuTx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPu+8ieOBp1N0cmljdE1vZGXjg53jg6rjgrfjg7zpgZXlj43jgYzjgYLjgorjgb7jgZfjgZ/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLjg5fjg63jgrvjgrk8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz7jgadTdHJpY3RNb2Rl44Od44Oq44K344O86YGV5Y+N44GM44GC44KK44G+44GX44Gf44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPuOCkuWun+ihjOS4rSI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iTDJUUC9JUFNlYyBWUE7jg5njg7zjgrnjga7kuovliY3lhbHmnInpjbUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE7jg5njg7zjgrnjga7oqLzmmI7mm7giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLjg5XjgqHjgqTjg6vjgpLpgbjmip4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLjg5XjgqHjgqTjg6vjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLjg6rjgrvjg4Pjg4giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i6YCB5L+hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLjgYrmsJfjgavlhaXjgooiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLpgYvou6Ljg6Ljg7zjg4njgpLmnInlirnjgavjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YGL6Lui44Oi44O844OJ44KS57WC5LqG44GZ44KL44Gr44Gv6YG45oqe44GX44Gm44GP44Gg44GV44GE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IuODhuOCtuODquODs+OCsOOBvuOBn+OBr+OCouOCr+OCu+OCueODneOCpOODs+ODiOOBjOacieWKueOBp+OBmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IuOCv+ODg+ODl+OBl+OBpuioreWumuOBmeOCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IuaIu+OCiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IuasoeOBuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IuOCueOCreODg+ODlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IuODouODkOOCpOODq+ODh+ODvOOCv+OBruS9v+eUqOmHj+OBjOWil+OBiOOBpuOBhOOBvuOBmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i44K/44OD44OX44GX44Gm44Oi44OQ44Kk44Or44OH44O844K/5Yip55So44Gu6Kmz57Sw44KS6KGo56S644GX44G+44GZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLjg6Ljg5DjgqTjg6vjg4fjg7zjgr/jga7liLbpmZDjgpLotoXjgYjjgb7jgZfjgZ8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAppbmRleCAwNDBmOWU4Li4xNDRlZmEwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7Zy064yA7KCE7ZmU7JeQIOyggOyepeuQnCDrqqjrk6Ag7Jew65297LKYKOyjvOyGjCkg642w7J207YSw66W8IOydveydhCDsiJgg7J6I64+E66GdIO2VqeuLiOuLpC4g7J20IOqyveyasCDslYXshLEg7JWg7ZSM66as7LyA7J207IWY7J20IOuNsOydtO2EsOulvCDri6Trpbgg7IKs656M7JeQ6rKMIOuztOuCvCDsiJgg7J6I7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+IuyXsOudveyymCDrjbDsnbTthLAg7J6R7ISxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7Zy064yA7KCE7ZmU7JeQIOyggOyepeuQnCDsl7Drnb3sspgo7KO87IaMKSDrjbDsnbTthLDrpbwg7IiY7KCV7ZWgIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDsnbQg6rK97JqwIOyVheyEsSDslaDtlIzrpqzsvIDsnbTshZjsnbQg7Jew65297LKYIOuNsOydtO2EsOulvCDsp4DsmrDqsbDrgpgg7IiY7KCV7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiLshozsnKDsnpAg642w7J207YSwIOyekeyEsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IuyVoO2UjOumrOy8gOydtOyFmOydtCDtnLTrjIDsoITtmZTsl5Ag7KCA7J6l65CcIOyGjOycoOyekCDrjbDsnbTthLDrpbwg7IiY7KCV7ZWgIOyImCDsnojrj4TroZ0g7ZWp64uI64ukLiDri6gsIOyVheyEsSDslaDtlIzrpqzsvIDsnbTshZjsnbQg7J20IOq4sOuKpeydhCDsnbTsmqntlZjsl6wg7IaM7Jyg7J6QIOuNsOydtO2EsOulvCDsp4DsmrDqsbDrgpgg7IiY7KCV7ZWgIOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+IuyGjOycoOyekCDrjbDsnbTthLAg7J296riwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7Zy064yA7KCE7ZmU7JeQIOyggOyepeuQnCDtnLTrjIDsoITtmZQg7IaM7Jyg7J6QIOuNsOydtO2EsOulvCDsnb3snYQg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIOydtCDqsr3smrAg7JWF7ISxIOyVoO2UjOumrOy8gOydtOyFmOydtCDtnLTrjIDsoITtmZQg7IaM7Jyg7J6QIOuNsOydtO2EsOulvCDsnb3snYQg7IiYIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiLsupjrprDrjZQg7J287KCVIOydveq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiLslaDtlIzrpqzsvIDsnbTshZjsnbQg7Zy064yA7KCE7ZmU7JeQIOyggOyepeuQnCDrqqjrk6Ag7LqY66aw642UIOydvOygleydhCDsnb3snYQg7IiYIOyeiOuPhOuhnSDtlanri4jri6QuIOydtCDqsr3smrAg7JWF7ISxIOyVoO2UjOumrOy8gOydtOyFmOydtCDsupjrprDrjZQg7J287KCV7J2EIOuLpOuluCDsgqzrnozsl5Dqsowg67O064K8IOyImCDsnojsirXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+Iuy6mOumsOuNlCDsnbzsoJUg7LaU6rCAL+yImOyglSDrsI8g7LC47ISd7J6Q7JeQ6rKMIOydtOuplOydvCDsoITshqEiPC9zdHJpbmc+CkBAIC00MzIsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiLquLDquLDqsIAg7J6g6rKoIOyeiOydhCDrlYwg7J6R64+Z7ZWY66Ck66m0IOu5hOuwgOuyiO2YuOulvCDri6Tsi5wg7J6F66Cl7ZW07JW8IO2VqeuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i66qo65OgIOuNsOydtO2EsCDsgq3soJwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+Iuy0iOq4sO2ZlOulvCDsiJjtlontlZjsl6wg66qo65OgIOuNsOydtO2EsOulvCDtmZXsnbjtlZjsp4Ag7JWK6rOgIOyCreygnO2VqeuLiOuLpC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5bGFiX3NldEdsb2JhbFByb3h5ICgyNzg0ODI4MjkzNzQ3NzkxNDQ2KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkgKDYzODc0OTc0NjY2NjAxNTQ5MzEpIC0tPgorICAgIDxza2lwIC8+CiAgIDxzdHJpbmctYXJyYXkgbmFtZT0icGhvbmVUeXBlcyI+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg5MDEwOTgzMzY2NTg3MTAzNTkiPiLsp5EiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLrqqjrsJTsnbwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IuyngeyepSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLquLDtg4AiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i66ee7Lak7ISk7KCVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+Ijx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+7J2EKOulvCkg7Ya17ZW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4oPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4g7IKs7JqpKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IlBJTiDsvZTrk5wg7J6F66ClIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLsnqDquIjsnYQg7ZW07KCc7ZWY66Ck66m0IOu5hOuwgOuyiO2YuCDsnoXroKUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+IuyeoOq4iOydhCDtlbTsoJztlZjroKTrqbQgUElOIOyeheugpSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IlBJTiDsvZTrk5zqsIAg7J6Y66q765CY7JeI7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLsnqDquIjtlbTsoJztlZjroKTrqbQg66mU64m066W8IOuIhOuluCDri6TsnYwgMOydhCDriITrpoXri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Iuu5hOyDgSDsoITtmZTrsojtmLgiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i7Ya17ZmU66GcIOuPjOyVhOqwgOq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IuunnuyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciIG1zZ2lkPSI0ODE3NTgzMjc5MDUzMTEyMzEyIj4i7KOE7Iah7ZWp64uI64ukLiDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i7KOE7Iah7ZWp64uI64ukLiDri6Tsi5wg7Iuc64+E7ZW0IOyjvOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLstqnsoIQg7KSRKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+Iuy2qeyghOuQmOyXiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTSDsubTrk5zqsIAg7J6g6rKoIOyeiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJTSU0g7Lm065OcIOyeoOq4iO2VtOygnCDspJEuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiLsnqDquIjtlbTsoJwg7Yyo7YS07J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDqt7jroLjsirXri4jri6QuICJcblxuIjx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+Iuu5hOuwgOuyiO2YuOulvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg7J6F66Cl7ZaI7Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlBJTuydhCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPu2ajCDsnpjrqrsg7J6F66Cl7ZaI7Iq164uI64ukLiAiXG5cbiI8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VtCDso7zshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLsnqDquIjtlbTsoJwg7Yyo7YS07J2EIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+7ZqMIOyemOuquyDqt7jroLjsirXri4jri6QuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+7ZqMIOuNlCDsi6TtjKjtlZjrqbQgR29vZ2xlIOuhnOq3uOyduOydhCDthrXtlbQg7Zy064yA7KCE7ZmU66W8IOyeoOq4iO2VtOygnO2VmOuPhOuhnSDsmpTssq3rkKnri4jri6QuICJcblxuIiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPuy0iCDtm4Tsl5Ag64uk7IucIOyLnOuPhO2VmOyEuOyalC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+7LSIIO2bhOyXkCDri6Tsi5wg7Iuc64+E7ZWY7IS47JqULiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i7Yyo7YS07J2EIOyeiuycvOyFqOuCmOyalD8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IuuqqOuRkCDshKDtg50iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Iu2FjeyKpO2KuCDshKDtg50iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i7J6Y652864K06riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLrs7XsgqwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLrtpnsl6zrhKPquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IlVSTCDrs7XsgqwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4i7J6F66ClIOuwqeuylSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLsgqzsoITsl5AgXCc8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCcg7LaU6rCAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i7YWN7Iqk7Yq4IOyImOyglSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i7KCA7J6l6rO16rCEIOu2gOyhsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Iu2ctOuMgOyghO2ZlCDsoIDsnqXqs7XqsITsnbQg67aA7KGx7ZWp64uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Iu2ZleyduCI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Iu2ZleyduCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+Iuy3qOyGjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLso7zsnZgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IuuhnOuTnCDspJEuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IuyCrOyaqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IuyCrOyaqSDslYjtlagiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuyekeyXheydhCDsiJjtlontlaAg65WMIOyCrOyaqe2VmOuKlCDslaDtlIzrpqzsvIDsnbTshZgiPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLri6vquLAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4i7Iug6rOgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLrjIDquLAiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i7JWg7ZSM66as7LyA7J207IWYIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4o7ZSE66Gc7IS47IqkIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPinsnbQo6rCAKSDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLtlITroZzshLjsiqQoPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+KeqwgCDsnpDssrQg7Iuc7ZaJIFN0cmljdE1vZGUg7KCV7LGF7J2EIOychOuwmO2WiOyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOyLpO2WiSDspJEiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IuyCrOyghCDqs7XsnKAg7YKkIOq4sOuwmCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLsnbjspp3shJwg6riw67CYIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4i7YyM7J28IOyEoO2DnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Iu2MjOydvOydhCDshKDtg53tlZjsp4Ag7JWK7JWY7Iq164uI64ukLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IuyerOyEpOyglSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLsoJzstpwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuymkOqyqOywvuq4sCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuyatOyghOuqqOuTnCDsgqzsmqkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i7Jq07KCE66qo65Oc66W8IOyiheujjO2VmOugpOuptCDshKDtg53tlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+Iu2FjOuNlOungSDrmJDripQg7ZWr7Iqk7YyfIOyCrOyaqSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+Iuq1rOyEse2VmOugpOuptCDthLDsuZjtlZjshLjsmpQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i65Kk66GcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i64uk7J2MIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i6rG064SI65uw6riwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i64aS7J2AIOuqqOuwlOydvCDrjbDsnbTthLAg7IKs7Jqp65+JIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLrqqjrsJTsnbwg642w7J207YSwIOyCrOyaqeyXkCDrjIDtlbQg7J6Q7IS47Z6IIOyVjOyVhOuztOugpOuptCDthLDsuZjtlZjshLjsmpQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiLrqqjrsJTsnbwg642w7J207YSwIOygnO2VnOydhCDstIjqs7ztlojsirXri4jri6QuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1tY2M0NTAta28vY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1Yjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbWNjNDUwLWtvL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImdzbV9hbHBoYWJldF9kZWZhdWx0X2NoYXJzZXQiPmV1Yy1rcjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCA0Y2E4NGVkLi5iNGFhNjYxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJMYXIgYXBwbGlrYXNqb25lbiBsZXNlIGFsbCBrb250YWt0LSBvZyBhZHJlc3NlaW5mb3JtYXNqb24gbGFncmV0IHDDpSB0ZWxlZm9uZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIHNlbmRlIHBlcnNvbmxpZ2UgZGF0YSB0aWwgYW5kcmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ic2tyaXZlIGtvbnRha3RpbmZvcm1hc2pvbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSIzOTI0MzgzNTc5MTA4MTgzNjAxIj4iTGFyIGFwcGxpa2Fzam9uZW4gZW5kcmUga29udGFrdC0gb2cgYWRyZXNzZWluZm9ybWFzam9uIGxhZ3JldCBww6UgdGVsZWZvbmVuLiBPbmRzaW5uZWRlIGFwcGxpa2Fzam9uZXIga2FuIGJydWtlIGRldHRlIHRpbCDDpSByZWRpZ2VyZSBlbGxlciBlbmRyZSBrb250YWt0aW5mb3JtYXNqb25lbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+InNrcml2ZSBlaWVyaW5mb3JtYXNqb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJMYXIgYXBwbGlrYXNqb25lbiBlbmRyZSBkYXRhZW5lIG9tIHRlbGVmb25laWVyZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIHNsZXR0ZSBlbGxlciByZWRpZ2VyZSB0ZWxlZm9uZW5zIGVpZXJkYXRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiJsZXNlIGVpZXJpbmZvcm1hc2pvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRPd25lckRhdGEiIG1zZ2lkPSIzMDg4NDg2MzgzMTI4NDM0NTA3Ij4iTGFyIGFwcGxpa2Fzam9uZW4gbGVzZSBkYXRhZW5lIG9tIHRlbGVmb25laWVyZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIGxlc2UgdGVsZWZvbmVucyBlaWVyZGF0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJsZXMga2FsZW5kZXJha3Rpdml0ZXRlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiJMYXIgYXBwbGlrYXNqb25lbiBsZXNlIGFsbGUga2FsZW5kZXJoZW5kZWxzZXIgbGFncmV0IHDDpSB0ZWxlZm9uZW4uIE9uZHNpbm5lZGUgYXBwbGlrYXNqb25lciBrYW4gYnJ1a2UgZGV0dGUgdGlsIMOlIHNlbmRlIGthbGVuZGVyaGVuZGVsc2VyIHRpbCBhbmRyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiIG1zZ2lkPSIzODk0ODc5MzUyNTk0OTA0MzYxIj4ibGVnZyB0aWwgZWxsZXIgZW5kcmUga2FsZW5kZXJha3Rpdml0ZXRlciBvZyBzZW5kIGUtcG9zdG1lbGRpbmcgdGlsIGdqZXN0ZW5lIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmVyIG7DpXIgZW5oZXRlbiBsw6VzZXMuIER1IG3DpSBza3JpdmUgaW5uIHBhc3NvcmRldCBww6Ugbnl0dCBmb3Igw6UgbMOlc2UgZGVuIG9wcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4iU2xldHQgYWxsZSBkYXRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJVdGbDuHJlciB0aWxiYWtlc3RpbGxpbmcgdGlsIGZhYnJpa2tzdGFuZGFyZC4gQWxsZSBkYXRhIHNsZXR0ZXMgdXRlbiB2YXJzZWwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGplbW1lbnVtbWVyIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkFyYmVpZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJBbm5lbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJFZ2VuZGVmaW5lcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iU2tyaXYgaW5uIFBJTi1rb2RlOiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iU2tyaXYgaW5uIHBhc3NvcmQgZm9yIMOlIGzDpXNlIG9wcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iU2tyaXYgaW5uIHBlcnNvbmxpZyBrb2RlIGZvciDDpSBsw6VzZSBvcHAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJHYWwgUElOLWtvZGUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IkZvciDDpSBsw6VzZSBvcHAsIHRyeWtrIHDDpSBtZW55a25hcHBlbiBvZyBkZXJldHRlciAwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJOw7hkbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRpbGJha2UgdGlsIHNhbXRhbGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJSaWt0aWchIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkJla2xhZ2VyLCBwcsO4diBpZ2plbjoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IlByw7h2IGlnamVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iTGFkZXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkZ1bGx0IGxhZGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS1rb3J0ZXQgZXIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIG9wcCBTSU0ta29ydOKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IllvdSBoYXZlIGluY29ycmVjdGx5IGRyYXduIHlvdXIgdW5sb2NrIHBhdHRlcm4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdGltZXMuICJcblxuIlBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJEdSBoYXIgb3BwZ2l0dCBmZWlsIHBhc3NvcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ2FuZ2VyLiAiXG5cbiJQcsO4diBpZ2plbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iRHUgaGFyIG9wcGdpdHQgZmVpbCBwZXJzb25saWcga29kZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBnYW5nZXIuICJcblxuIlByw7h2IGlnamVuIG9tIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iWW91IGhhdmUgaW5jb3JyZWN0bHkgZHJhd24geW91ciB1bmxvY2sgcGF0dGVybiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB0aW1lcy4gQWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbW9yZSB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMsIHlvdSB3aWxsIGJlIGFza2VkIHRvIHVubG9jayB5b3VyIHBob25lIHVzaW5nIHlvdXIgR29vZ2xlIHNpZ24taW4uIlxuXG4iIFBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2Vjb25kcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iUHLDuHYgaWdqZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iR2xlbXQgbcO4bnN0ZXJldD8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ik1lcmsgYWx0Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiJNZXJrIHRla3N0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJMaW0gaW5uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJLb3BpZXIgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IklubmRhdGFtZXRvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iTGVnZyDCqzx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz7CuyB0aWwgb3JkbGlzdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4iUmVkaWdlciB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTGl0ZSBwbGFzcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+IkRldCBiZWd5bm5lciDDpSBibGkgbGl0ZSBsYWdyaW5nc3BsYXNzIHDDpSB0ZWxlZm9uZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkF2YnJ5dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJNZXJrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMYXN0ZXIgaW5uIC4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iUMOlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iQXYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IkZ1bGxmw7hyIG1lZCI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IlR2aW5nIGF2c2x1dG5pbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydMOpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iVmVudCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtbWV0IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvc2Vzc2VuPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBicnV0dCBkZSBzZWx2cMOlbGFndGUgU3RyaWN0TW9kZS1yZXRuaW5nc2xpbmplbmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBrasO4cmVyIjwvc3RyaW5nPgpAQCAtODU0LDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJQYXNzb3JkYmFzZXJ0IEwyVFAvSVBTZWMtVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlNlcnRpZmlrYXRiYXNlcnQgTDJUUC9JUFNlYy1WUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJWZWxnIGZpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkluZ2VuIGZpbCBlciB2YWxndCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlRpbGJha2VzdGlsbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJTZW5kIGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdHQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJCaWxtb2R1cyBlciBha3RpdmVydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWZWxnIGZvciDDpSBhdnNsdXR0ZSBiaWxtb2R1cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUaWxrbnl0bmluZyBlbGxlciB0csOlZGzDuHMgc29uZSBlciBha3RpdiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IlRyeWtrIGZvciDDpSBrb25maWd1cmVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGJha2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJOZXN0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IkhvcHAgb3ZlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+IkjDuHkgbW9iaWxkYXRhYnJ1ayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iQmVyw7hyIGZvciDDpSBsZXNlIG1lciBvbSBicnVrIGF2IG1vYmlsZGF0YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iR3JlbnNlbiBmb3IgbW9iaWxkYXRhYnJ1ayBlciBvdmVyc2tyZWRldCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmluZGV4IGM4ZjAwNjguLmNjNjAxMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGFsbGUgY29udGFjdGdlZ2V2ZW5zIChhZHJlc2dlZ2V2ZW5zKSB6aWVuIGRpZSBvcCB1dyB0ZWxlZm9vbiB6aWpuIG9wZ2VzbGFnZW4uIFNjaGFkZWxpamtlIHRvZXBhc3NpbmdlbiBrdW5uZW4gaGllcnZhbiBnZWJydWlrIG1ha2VuIG9tIHV3IGdlZ2V2ZW5zIHRlIHZlcnplbmRlbiBuYWFyIGFuZGVyZSBwZXJzb25lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJjb250YWN0Z2VnZXZlbnMgc2NocmlqdmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBvcCB1dyB0ZWxlZm9vbiBvcGdlc2xhZ2VuIGNvbnRhY3RnZWdldmVucyAoYWRyZXNnZWdldmVucykgd2lqemlnZW4uIFNjaGFkZWxpamtlIHRvZXBhc3NpbmdlbiBrdW5uZW4gaGllcm1lZSB1dyBjb250YWN0Z2VnZXZlbnMgdmVyd2lqZGVyZW4gb2Ygd2lqemlnZW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJnZWdldmVucyBlaWdlbmFhciBzY2hyaWp2ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJIaWVybWVlIGthbiBlZW4gdG9lcGFzc2luZyBkZSBvcCB1dyB0ZWxlZm9vbiBvcGdlc2xhZ2VuIGdlZ2V2ZW5zIHZhbiBkZSBlaWdlbmFhciB3aWp6aWdlbi4gU2NoYWRlbGlqa2UgdG9lcGFzc2luZ2VuIGt1bm5lbiBoaWVybWVlIGdlZ2V2ZW5zIHZhbiBkZSBlaWdlbmFhciB2ZXJ3aWpkZXJlbiBvZiB3aWp6aWdlbi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4iZ2VnZXZlbnMgZWlnZW5hYXIgbGV6ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkT3duZXJEYXRhIiBtc2dpZD0iMzA4ODQ4NjM4MzEyODQzNDUwNyI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGRlIG9wIHV3IHRlbGVmb29uIG9wZ2VzbGFnZW4gZ2VnZXZlbnMgdmFuIGRlIGVpZ2VuYWFyIGxlemVuLiBTY2hhZGVsaWprZSB0b2VwYXNzaW5nZW4ga3VubmVuIGhpZXJtZWUgZ2VnZXZlbnMgdmFuIGRlIGVpZ2VuYWFyIGxlemVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+ImFnZW5kYWdlYmV1cnRlbmlzc2VuIGxlemVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTUzMzAyOTEzOTY1MjA5NTczNCI+IkhpZXJtZWUga2FuIGVlbiB0b2VwYXNzaW5nIGFsbGUgYWdlbmRhZ2ViZXVydGVuaXNzZW4gbGV6ZW4gZGllIHppam4gb3BnZXNsYWdlbiBvcCB1dyB0ZWxlZm9vbi4gU2NoYWRlbGlqa2UgdG9lcGFzc2luZ2VuIGt1bm5lbiBoaWVydmFuIGdlYnJ1aWsgbWFrZW4gb20gdXcgYWdlbmRhZ2ViZXVydGVuaXNzZW4gdGUgdmVyemVuZGVuIG5hYXIgYW5kZXJlIHBlcnNvbmVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDYWxlbmRhciIgbXNnaWQ9IjM4OTQ4NzkzNTI1OTQ5MDQzNjEiPiJhZ2VuZGFnZWJldXJ0ZW5pc3NlbiB0b2V2b2VnZW4gb2YgYWFucGFzc2VuIGVuIGUtbWFpbCB2ZXJ6ZW5kZW4gbmFhciBnYXN0ZW4iPC9zdHJpbmc+CkBAIC00MzIsNiArNDM2LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2ZvcmNlTG9jayIgbXNnaWQ9IjI4MTk4Njg2NjQ5NDYwODk3NDAiPiJCZWhlcmVuIHdhbm5lZXIgaGV0IGFwcGFyYWF0IHdvcmR0IHZlcmdyZW5kZWxkLCB3YXQgdmVyZWlzdCBkYXQgdSBoZXQgd2FjaHR3b29yZCBvcG5pZXV3IGludm9lcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFsbGUgZ2VnZXZlbnMgd2lzc2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY193aXBlRGF0YSIgbXNnaWQ9IjIzMTQwNjA5MzM3OTYzOTYyMDUiPiJEZSBmYWJyaWVrc2luc3RlbGxpbmdlbiBoZXJzdGVsbGVuLCB3YWFyYmlqIGFsbGUgZ2VnZXZlbnMgd29yZGVuIHZlcndpamRlcmQgem9uZGVyIGJldmVzdGlnaW5nLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IlRodWlzIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWVsIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJXZXJrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+Ik92ZXJpZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiJBYW5nZXBhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4idmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iUElOLWNvZGUgaW52b2VyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iOTEzODE1ODM0NDgxMzIxMzc1NCI+IlZvZXIgaGV0IHdhY2h0d29vcmQgaW4gb20gdGUgb250Z3JlbmRlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJWb2VyIGRlIFBJTi1jb2RlIGluIG9tIHRlIG9udGdyZW5kZWxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+Ik9uanVpc3RlIFBJTi1jb2RlISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJEcnVrIG9wIFwnTWVudVwnIGVuIHZlcnZvbGdlbnMgb3AgMCBvbSB0ZSBvbnRncmVuZGVsZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+IkFsYXJtbnVtbWVyIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+IlRlcnVnIG5hYXIgZ2VzcHJlayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+Ikp1aXN0ISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJQcm9iZWVyIGhldCBvcG5pZXV3Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iT3BsYWRlbiAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iT3BnZWxhZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ta2FhcnQgaXMgdmVyZ3JlbmRlbGQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iU0lNLWthYXJ0IG9udGdyZW5kZWxlbi4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IlUgaGVlZnQgdXcgb250Z3JlbmRlbGluZ3NwYXRyb29uIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtlZXIgb25qdWlzdCBnZXRla2VuZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IlUgaGVlZnQgdXcgd2FjaHR3b29yZCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZWVyIG9uanVpc3QgaW5nZXZvZXJkLiAiXG5cbiJQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+IlUgaGVlZnQgdXcgUElOLWNvZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGluZ2V2b2VyZC4gIlxuXG4iUHJvYmVlciBoZXQgb3ZlciA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWNvbmRlbiBvcG5pZXV3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVSBoZWVmdCB1dyBvbnRncmVuZGVsaW5nc3BhdHJvb24gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2VlciBvbmp1aXN0IGdldGVrZW5kLiBOYSBub2cgZWVucyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBtaXNsdWt0ZSBwb2dpbmdlbiwgd29yZHQgdSBnZXZyYWFnZCBvbSB1dyB0ZWxlZm9vbiB0ZSBvbnRncmVuZGVsZW4gbWV0IHV3IEdvb2dsZSBhYW5tZWxkaW5nLiJcblxuIiBQcm9iZWVyIGhldCBvdmVyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlByb2JlZXIgaGV0IG92ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlY29uZGVuIG9wbmlldXcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJQYXRyb29uIHZlcmdldGVuPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iQWxsZXMgc2VsZWN0ZXJlbiI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iVGVrc3Qgc2VsZWN0ZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLbmlwcGVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3Bpw6tyZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJQbGFra2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJVUkwga29wacOrcmVuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ikludm9lcm1ldGhvZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4iXCc8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCcgdG9ldm9lZ2VuIGFhbiB3b29yZGVuYm9layI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IlRla3N0IGJld2Vya2VuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJXZWluaWcgcnVpbXRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iT3BzbGFncnVpbXRlIHZhbiB0ZWxlZm9vbiByYWFrdCBvcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJPSyI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+Ik9LIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4iQW5udWxlcmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkxldCBvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iTGFkZW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFBTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IlVJVCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iQWN0aWUgdm9sdG9vaWVuIG1ldCI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+Ik51IHNsdWl0ZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwcG9ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4iV2FjaHRlbiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJEZSB0b2VwYXNzaW5nIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhlZWZ0IGhldCB6ZWxmIGFmZ2Vkd29uZ2VuIFN0cmljdE1vZGUtYmVsZWlkIGdlc2Nob25kZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iSGV0IHByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGVlZnQgaGV0IHplbGYgYWZnZWR3b25nZW4gU3RyaWN0TW9kZS1iZWxlaWQgZ2VzY2hvbmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IHdvcmR0IHVpdGdldm9lcmQiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IlZvb3JhZiBnZWRlZWxkZSBzbGV1dGVsIG9wIGJhc2lzIHZhbiBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJDZXJ0aWZpY2FhdCBvcCBiYXNpcyB2YW4gTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJCZXN0YW5kIGtpZXplbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IkdlZW4gYmVzdGFuZCBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJPcG5pZXV3IGluc3RlbGxlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJWZXJ6ZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaWV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXV0b21vZHVzIGluZ2VzY2hha2VsZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJTZWxlY3RlZXIgZGl0IG9tIGRlIGF1dG9tb2R1cyBhZiB0ZSBzbHVpdGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJUZXRoZXJpbmcgb2YgaG90c3BvdCBhY3RpZWYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiJBYW5yYWtlbiBvbSB0ZSBjb25maWd1cmVyZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiJWb3JpZ2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJWb2xnZW5kZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Ik92ZXJzbGFhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNDg5MDg5NDI2NzQ1NDg2NzI3NiI+Ikhvb2cgbW9iaWVsIGdlZ2V2ZW5zZ2VicnVpayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iUmFhayBhYW4gdm9vciBtZWVyIGluZm9ybWF0aWUgb3ZlciBtb2JpZWwgZ2VnZXZlbnNnZWJydWlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpZWxlIGdlZ2V2ZW5zbGltaWV0IG92ZXJzY2hyZWRlbiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCmluZGV4IGFlODk3YTguLmE5NjUzMTYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IlBvendhbGEgYXBsaWthY2ppIG5hIGN6eXRhbmllIHdzenlzdGtpY2ggZGFueWNoIGtvbnRha3Rvd3ljaCAoYWRyZXNvd3ljaCkgemFwaXNhbnljaCB3IHRlbGVmb25pZS4gU3prb2RsaXdlIGFwbGlrYWNqZSBtb2fEhSB0byB3eWtvcnp5c3RhxIcsIGFieSB3eXN5xYJhxIcgZGFuZSB1xbx5dGtvd25pa2EgZG8gaW5ueWNoIGx1ZHppLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+InphcGlzeXdhbmllIGRhbnljaCBrb250YWt0b3d5Y2giPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IlBvendhbGEgYXBsaWthY2ppIG5hIHptaWFuxJkgZGFueWNoIGtvbnRha3Rvd3ljaCAoYWRyZXNvd3ljaCkgemFwaXNhbnljaCB3IHRlbGVmb25pZS4gU3prb2RsaXdlIGFwbGlrYWNqZSBtb2fEhSB0byB3eWtvcnp5c3RhxIcsIGFieSB1c3VuxIXEhyBsdWIgem1pZW5pxIcgZGFuZSBrb250YWt0b3dlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVPd25lckRhdGEiIG1zZ2lkPSI0ODkyNTU1OTEzODQ5Mjk1MzkzIj4iemFwaXN5d2FuaWUgZGFueWNoIHfFgmHFm2NpY2llbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJQb3p3YWxhIGFwbGlrYWNqaSBuYSB6bWlhbsSZIGRhbnljaCB3xYJhxZtjaWNpZWxhIHphcGlzYW55Y2ggdyB0ZWxlZm9uaWUuIFN6a29kbGl3ZSBhcGxpa2FjamUgbW9nxIUgdG8gd3lrb3J6eXN0YcSHLCBhYnkgd3ltYXphxIcgbHViIHptaWVuacSHIGRhbmUgd8WCYcWbY2ljaWVsYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4iY3p5dGFuaWUgZGFueWNoIHfFgmHFm2NpY2llbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkT3duZXJEYXRhIiBtc2dpZD0iMzA4ODQ4NjM4MzEyODQzNDUwNyI+IlBvendhbGEgYXBsaWthY2ppIG5hIGN6eXRhbmllIGRhbnljaCB3xYJhxZtjaWNpZWxhIHphcGlzYW55Y2ggdyB0ZWxlZm9uaWUuIFN6a29kbGl3ZSBhcGxpa2FjamUgbW9nxIUgdG8gd3lrb3J6eXN0YcSHIGRvIG9kY3p5dGFuaWEgZGFueWNoIHfFgmHFm2NpY2llbGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI2ODk4OTg3Nzk4MzAzODQwNTM0Ij4ib2Rjenl0eXdhbmllIHd5ZGFyemXFhCB3IGthbGVuZGFyenUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4iUG96d2FsYSBhcGxpa2FjamkgbmEgb2Rjenl0eXdhbmllIHdzenlzdGtpY2ggd3lkYXJ6ZcWEIHoga2FsZW5kYXJ6YSwgemFwaXNhbnljaCB3IHRlbGVmb25pZS4gU3prb2RsaXdlIGFwbGlrYWNqZSBtb2fEhSB0byB3eWtvcnp5c3RhxIcgZG8gcm96c3nFgmFuaWEgd3lkYXJ6ZcWEIHoga2FsZW5kYXJ6YSBkbyBpbm55Y2ggbHVkemkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImRvZGF3YW5pZSBpIG1vZHlmaWtvd2FuaWUgd3lkYXJ6ZcWEIHcga2FsZW5kYXJ6dSBvcmF6IHd5c3nFgmFuaWUgd2lhZG9tb8WbY2kgZS1tYWlsIGRvIGdvxZtjaSI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IktvbnRyb2x1amUsIGtpZWR5IHVyesSFZHplbmllIGplc3QgYmxva293YW5lLCB3eW1hZ2FqxIVjIHBvbm93bmVnbyB3cHJvd2FkemVuaWEgaGFzxYJhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJVc3XFhCB3c3p5c3RraWUgZGFuZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iV3lrb251amUgcmVzZXQgZmFicnljem55LCB1c3V3YWrEhWMgd3N6eXN0a2llIGRhbmUgdcW8eXRrb3duaWthIGJleiDFvGFkbmVnbyBwb3R3aWVyZHplbmlhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IktvbcOzcmthIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJTxYJ1xbxib3d5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IklubnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iTmllc3RhbmRhcmRvd3kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icHJ6ZXogPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiBwcnpleiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Ildwcm93YWTFuiBrb2QgUElOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiJXcHJvd2FkxbogaGFzxYJvLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Ildwcm93YWTFuiBrb2QgUElOLCBhYnkgb2RibG9rb3dhxIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJCxYLEmWRueSBrb2QgUElOISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiJBYnkgb2RibG9rb3dhxIcsIG5hY2nFm25paiBNZW51LCBhIG5hc3TEmXBuaWUgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTnVtZXIgYWxhcm1vd3kiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUG93csOzdCBkbyBwb8WCxIVjemVuaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJQb3ByYXduaWUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+Ik5pZXN0ZXR5LCBzcHLDs2J1aiBwb25vd25pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iU3Byw7NidWogcG9ub3duaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iS2FydGEgU0lNIGplc3QgemFibG9rb3dhbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iT2RibG9rb3d5d2FuaWUga2FydHkgU0lNLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4iV3rDs3Igb2RibG9rb3dhbmlhIHpvc3RhxYIgbmllcHJhd2lkxYJvd28gbmFyeXNvd2FueSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiByYXp5LiAiXG5cbiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iSGFzxYJvIHpvc3RhxYJvIG5pZXByYXdpZMWCb3dvIHdwcm93YWR6b25lIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjgyNzc0OTIzMTQ2NTE0NTU5MCI+Ik5pZXBvcHJhd25pZSB3cHJvd2Fkem9ubyBrb2QgUElOIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuICJcblxuIlNwcsOzYnVqIHBvbm93bmllIHphIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJXesOzciBvZGJsb2tvd2FuaWEgem9zdGHFgiBuYXJ5c293YW55IG5pZXByYXdpZMWCb3dvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHJhenkuIFBvIGtvbGVqbnljaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBuaWV1ZGFueWNoIHByw7NiYWNoIHRlbGVmb24gdHJ6ZWJhIGLEmWR6aWUgb2RibG9rb3dhxIcgcHJ6ZXogemFsb2dvd2FuaWUgbmEga29uY2llIEdvb2dsZS4iXG5cbiIgU3Byw7NidWogcG9ub3duaWUgemEgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biIgbXNnaWQ9IjYyNTE0ODAzNDMzOTQzODk2NjUiPiJTcHLDs2J1aiBwb25vd25pZSB6YSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VrdW5kLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iWmFwb21uaWHFgmXFmyB3em9ydT8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+Ilphem5hY3ogd3N6eXN0a28iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+Ilphem5hY3ogdGVrc3QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iV3l0bmlqIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpdWoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJXa2xlaiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waXVqIGFkcmVzIFVSTCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiJNZXRvZGEgd3Byb3dhZHphbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkRvZGFqIHRlcm1pbiDigJ48eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+4oCdIGRvIHPFgm93bmlrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkeXR1aiB0ZWtzdCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iTWHFgm8gbWllanNjYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik1hbGVqZSBpbG/Fm8SHIGRvc3TEmXBuZWogcGFtacSZY2kgdGVsZWZvbnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkFudWx1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJVd2FnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iV2N6eXR5d2FuaWUuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlfFgsSFY3oiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJXecWCxIVjeiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iWmFrb8WEY3ogY3p5bm5vxZvEhyBrb3J6eXN0YWrEhWMgeiI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+Ild5bXXFmyB6YW1rbmnEmWNpZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiJaZ8WCb8WbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiJDemVrYWoiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWthY2phIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIG5hcnVzennFgmEgd3ltdXN6b25lIHByemV6IHNpZWJpZSB6YXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IG5hcnVzennFgiB3eW11c3pvbmUgcHJ6ZXogc2llYmllIHphc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iRHppYcWCYSA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iU2llxIcgVlBOIEwyVFAvSVBTZWMgeiBrbHVjemVtIFBTSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiJTaWXEhyBWUE4gTDJUUC9JUFNlYyB6IGNlcnR5ZmlrYXRlbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+Ild5YmllcnogcGxpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5pZSB3eWJyYW5vIHBsaWt1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVzZXQiIG1zZ2lkPSIyNDQ4MTY4MDgwOTY0MjA5OTA4Ij4iUmVzZXR1aiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJQcnplxZtsaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+InVsdWJpb25lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iVHJ5YiBzYW1vY2hvZG93eSB3xYLEhWN6b255Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+Ild5YmllcnosIGFieSB6YWtvxYRjennEhyB0cnliIHNhbW9jaG9kb3d5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJKZXN0IGFrdHl3bmUgcG93acSFemFuaWUgbHViIHB1bmt0IGRvc3TEmXB1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iRG90a25paiwgYWJ5IHNrb25maWd1cm93YcSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iV3LDs8SHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iRGFsZWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJQb21pxYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJXeXNva2kgcG96aW9tIHXFvHljaWEgZGFueWNoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJEb3RrbmlqLCBhYnkgem9iYWN6ecSHIHN0YXR5c3R5a2kgcHJ6ZXN5xYJ1IGRhbnljaCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iUHJ6ZWtyb2N6b25vIGxpbWl0IGRhbnljaCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggYjlmOWJlMi4uMzYwYjkxMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIGxlciB0b2RvcyBvcyBkYWRvcyBkZSBjb250YWN0b3MgKGVuZGVyZcOnb3MpIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQWxndW1hcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBlc3RlIGl0ZW0gcGFyYSBlbnZpYXIgb3Mgc2V1cyBkYWRvcyBhIG91dHJhcyBwZXNzb2FzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+ImVzY3JldmVyIGRhZG9zIGRlIGNvbnRhY3RvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIG1vZGlmaWNhciBvcyBkYWRvcyBkZSBjb250YWN0byAoZW5kZXJlw6dvKSBhcm1hemVuYWRvcyBubyBzZXUgdGVsZWZvbmUuIEFsZ3VtYXMgYXBsaWNhw6fDtWVzIG1hbGljaW9zYXMgcG9kZW0gdXRpbGl6YXIgZXN0ZXMgZGFkb3MgcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIG9zIGRhZG9zIGRvcyBzZXVzIGNvbnRhY3Rvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+ImVzY3JldmVyIGRhZG9zIGRvIHByb3ByaWV0w6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIG1vZGlmaWNhciBvcyBkYWRvcyBkbyBwcm9wcmlldMOhcmlvIGRvIHRlbGVmb25lIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQWxndW1hcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBlc3RlIGl0ZW0gcGFyYSBhcGFnYXIgb3UgbW9kaWZpY2FyIGRhZG9zIGRvIHByb3ByaWV0w6FyaW8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+ImxlciBkYWRvcyBkbyBwcm9wcmlldMOhcmlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiJQZXJtaXRlIGEgdW1hIGFwbGljYcOnw6NvIG1vZGlmaWNhciBvcyBkYWRvcyBkbyBwcm9wcmlldMOhcmlvIGRvIHRlbGVmb25lIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQWxndW1hcyBhcGxpY2HDp8O1ZXMgbWFsaWNpb3NhcyBwb2RlbSB1dGlsaXphciBlc3RlIGl0ZW0gcGFyYSBsZXIgZGFkb3MgZG8gcHJvcHJpZXTDoXJpbyBkbyB0ZWxlZm9uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJsZXIgZXZlbnRvcyBkYSBhZ2VuZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBsZXIgdG9kb3Mgb3MgZXZlbnRvcyBkbyBjYWxlbmTDoXJpbyBhcm1hemVuYWRvcyBubyBzZXUgdGVsZWZvbmUuIEFsZ3VtYXMgYXBsaWNhw6fDtWVzIG1hbGljaW9zYXMgcG9kZW0gdXRpbGl6YXIgZXN0ZSBpdGVtIHBhcmEgZW52aWFyIG9zIGV2ZW50b3MgZG8gc2V1IGNhbGVuZMOhcmlvIGEgb3V0cmFzIHBlc3NvYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImFkaWNpb25hciBvdSBhbHRlcmFyIGV2ZW50b3MgZGEgYWdlbmRhIGUgZW52aWFyIGUtbWFpbHMgcGFyYSBvcyBjb252aWRhZG9zIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGUgcXVhbmRvIG8gZGlzcG9zaXRpdm8gw6kgYmxvcXVlYWRvLCBzZW5kbyBuZWNlc3PDoXJpbyByZWludHJvZHV6aXIgYSByZXNwZWN0aXZhIHBhbGF2cmEtcGFzc2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRWZlY3R1ZSB1bWEgcmVwb3Npw6fDo28gZGUgZsOhYnJpY2EsIGVsaW1pbmFuZG8gdG9kb3Mgb3MgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWTDqm5jaWEiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNw7N2ZWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkVtcHJlZ28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3V0cm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iUGVyc29uYWxpemFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiJhdHJhdsOpcyBkbyA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IGF0cmF2w6lzIGRlIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4iSW50cm9kdXppciBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iSW50cm9kdXphIGEgcGFsYXZyYS1wYXNzZSBwYXJhIGRlc2Jsb3F1ZWFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJJbnRyb2R1emEgbyBQSU4gcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIiBtc2dpZD0iMTI5NTk4NDExNDMzODEwNzcxOCI+IkPDs2RpZ28gUElOIGluY29ycmVjdG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByaW1hIE1lbnUgZSwgZW0gc2VndWlkYSwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO6bWVybyBkZSBlbWVyZ8OqbmNpYSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiJSZWdyZXNzYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJlY3RvISI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl93cm9uZyIgbXNnaWQ9IjQ4MTc1ODMyNzkwNTMxMTIzMTIiPiJMYW1lbnRhbW9zLCB0ZW50ZSBub3ZhbWVudGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkxhbWVudGFtb3MsIHRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjYxMzM0Mzg1Mjg0Mjk0NDQzNSI+IkEgY2FycmVnYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcnJlZ2Fkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iTyBjYXJ0w6NvIFNJTSBlc3TDoSBibG9xdWVhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iQSBkZXNibG9xdWVhciBjYXJ0w6NvIFNJTS4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkVmZWN0dW91IGluY29ycmVjdGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZGVudHJvIGRlIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNDkwNjAzNDM3NjQyNTE3NTM4MSI+IkludHJvZHV6aXUgaW5jb3JyZWN0YW1lbnRlIGEgcGFsYXZyYS1wYXNzZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGRlbnRybyBkZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWd1bmRvcy4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iSW50cm9kdXppdSBpbmNvcnJlY3RhbWVudGUgbyBQSU4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gdmV6ZXMuICJcblxuIlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJFZmVjdHVvdSBpbmNvcnJlY3RhbWVudGUgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gQXDDs3Mgb3V0cmFzIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHRlbnRhdGl2YXMgc2VtIHN1Y2Vzc28sIHNlci1saGUtw6EgcGVkaWRvIHBhcmEgZGVzYmxvcXVlYXIgbyB0ZWxlZm9uZSB1dGlsaXphbmRvIG8gc2V1IGluw61jaW8gZGUgc2Vzc8OjbyBubyBHb29nbGUuIlxuXG4iIFRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBkZW50cm8gZGUgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iRXNxdWVjZXUtc2UgZG8gcGFkcsOjbz8iPC9zdHJpbmc+CkBAIC02OTksMTQgKzcwOSwxNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9tbV9zcyIgbXNnaWQ9IjQ0MzE1NTU5NDM4Mjg3MTE0NzMiPiI8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTEkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTIkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfaF9tbV9zcyIgbXNnaWQ9IjE4NDYwNzE5OTc2MTY2NTQxMjQiPiI8eGxpZmY6ZyBpZD0iSE9VUlMiPiUxJGQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMiQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMyQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0QWxsIiBtc2dpZD0iNjg3NjUxODkyNTg0NDEyOTMzMSI+IlNlbGVjY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjY2lvbmFyIHRleHRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IkNvcnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHkiIG1zZ2lkPSIyNjgxOTQ2MjI5NTMzNTExOTg3Ij4iQ29waWFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iQ29sYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IkNvcGlhciBVUkwiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2VsZWN0VGV4dE1vZGUgKDY3Mzg1NTYzNDg4NjEzNDcyNDApIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgdGV4dFNlbGVjdGlvbkNBQlRpdGxlICg1MjM2ODUwMzk0MzcwODIwMzU3KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0iaW5wdXRNZXRob2QiIG1zZ2lkPSIxNjUzNjMwMDYyMzA0NTY3ODc5Ij4iTcOpdG9kbyBkZSBlbnRyYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkFkaWNpb25hciBcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBhbyBkaWNpb27DoXJpbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+IkVkaXRhciB0ZXh0byI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4iUG91Y28gZXNwYcOnbyBsaXZyZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGV4dCIgbXNnaWQ9IjYzNTEwNjU0NDYxNjM3ODgzNiI+Ik8gZXNwYcOnbyBkZSBhcm1hemVuYW1lbnRvIGRvIHRlbGVmb25lIGVzdMOhIGEgZmljYXIgcmVkdXppZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkNhbmNlbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkF0ZW7Dp8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iQSBjYXJyZWdhci4uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb24iIG1zZ2lkPSIxNTQ0NjgyNzU1NTE0NDk0Mjk4Ij4iQWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJEZXNhY3RpdmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb25jbHVpciBhY8Onw6NvIHV0aWxpemFuZG8iPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJGb3LDp2FyIGZlY2hvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJlbGF0w7NyaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkVzcGVyYXIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQSBhcGxpY2HDp8OjbyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG8taW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJPIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvLWltcG9zdGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBlbSBleGVjdcOnw6NvIjwvc3RyaW5nPgpAQCAtODU0LDEzICs4NjIsMTYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfcHNrX3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM5NDUwNDM1NjQwMDgzMDMyMzkiPiJWUE4gTDJUUC9JUFNlYyBiYXNlYWRhIGVtIGNoYXZlIHByw6ktIHBhcnRpbGhhZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iVlBOIEwyVFAvSVBTZWMgYmFzZWFkYSBlbSBjZXJ0aWZpY2FkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IkVzY29saGVyIGZpY2hlaXJvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iTsOjbyBmb2kgc2VsZWNjaW9uYWRvIG5lbmh1bSBmaWNoZWlybyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlcG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IkVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiJNb2RvIGF1dG9tw7N2ZWwgYWN0aXZhZG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4iU2VsZWNjaW9uYXIgcGFyYSBzYWlyIGRvIG1vZG8gYXV0b23Ds3ZlbC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iTGlnYcOnw6NvIHBvbnRvIGEgcG9udG8gb3UgaG90c3BvdCBhY3Rpdm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9jYXIgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iQW50ZXJpb3IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiJTZWd1aW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+Iklnbm9yYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJVdGlsaXphw6fDo28gZWxldmFkYSBkZSBkYWRvcyBtw7N2ZWlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUb3F1ZSBwYXJhIHNhYmVyIG1haXMgc29icmUgYSB1dGlsaXphw6fDo28gZGUgZGFkb3MgbcOzdmVpcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4iTGltaXRlIGRlIGRhZG9zIG3Ds3ZlaXMgZXhjZWRpZG8iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCA3Y2MyNjZhLi5kYzVlZTE0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJQZXJtaXRlIHF1ZSB1bSBhcGxpY2F0aXZvIGxlaWEgdG9kb3Mgb3MgZGFkb3MgZGUgY29udGF0byAoZW5kZXJlw6dvKSBhcm1hemVuYWRvcyBubyBzZXUgdGVsZWZvbmUuIEFwbGljYXRpdm9zIG1hbGljaW9zb3MgcG9kZW0gdXNhciBpc3NvIHBhcmEgZW52aWFyIG9zIHNldXMgZGFkb3MgcGFyYSBvdXRyYXMgcGVzc29hcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiJncmF2YXIgZGFkb3MgZGUgY29udGF0byI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSIzOTI0MzgzNTc5MTA4MTgzNjAxIj4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBtb2RpZmlxdWUgb3MgZGFkb3MgZGUgY29udGF0byAoZW5kZXJlw6dvKSBhcm1hemVuYWRvcyBubyBzZXUgdGVsZWZvbmUuIEFwbGljYXRpdm9zIG1hbGljaW9zb3MgcG9kZW0gdXNhciBpc3NvIHBhcmEgYXBhZ2FyIG91IG1vZGlmaWNhciBvcyBzZXVzIGRhZG9zIGRlIGNvbnRhdG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJncmF2YXIgZGFkb3MgZG8gcHJvcHJpZXTDoXJpbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbW9kaWZpcXVlIG9zIGRhZG9zIGRlIHByb3ByaWV0w6FyaW8gZG8gdGVsZWZvbmUgYXJtYXplbmFkb3Mgbm8gc2V1IHRlbGVmb25lLiBBcGxpY2F0aXZvcyBtYWxpY2lvc29zIHBvZGVtIHVzYXIgaXNzbyBwYXJhIGFwYWdhciBvdSBtb2RpZmljYXIgZGFkb3MgZG8gcHJvcHJpZXTDoXJpby4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4ibGVyIGRhZG9zIGRvIHByb3ByaWV0w6FyaW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkT3duZXJEYXRhIiBtc2dpZD0iMzA4ODQ4NjM4MzEyODQzNDUwNyI+IlBlcm1pdGUgcXVlIHVtIGFwbGljYXRpdm8gbGVpYSBvcyBkYWRvcyBkZSBwcm9wcmlldMOhcmlvIGRvIHRlbGVmb25lIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGlzc28gcGFyYSBsZXIgb3MgZGFkb3MgZGUgcHJvcHJpZXTDoXJpbyBkbyB0ZWxlZm9uZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJsZXIgZXZlbnRvcyBkYSBhZ2VuZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBsZWlhIHRvZG9zIG9zIGV2ZW50b3MgZGEgYWdlbmRhIGFybWF6ZW5hZG9zIG5vIHNldSB0ZWxlZm9uZS4gQXBsaWNhdGl2b3MgbWFsaWNpb3NvcyBwb2RlbSB1c2FyIGlzc28gcGFyYSBlbnZpYXIgZXZlbnRvcyBkYSBzdWEgYWdlbmRhIHBhcmEgb3V0cmFzIHBlc3NvYXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImFkaWNpb25hciBvdSBtb2RpZmljYXIgZXZlbnRvcyBkYSBhZ2VuZGEgZSBlbnZpYXIgZS1tYWlsIGFvcyBjb252aWRhZG9zIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iQ29udHJvbGEgbyBibG9xdWVpbyBkbyBhcGFyZWxobywgZXhpZ2luZG8gcXVlIGEgc2VuaGEgc2VqYSBkaWdpdGFkYSBub3ZhbWVudGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IkFwYWdhciB0b2RvcyBvcyBkYWRvcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iRXhlY3V0ZSB1bWEgcmVkZWZpbmnDp8OjbyBkZSBmw6FicmljYSwgZXhjbHVpbmRvIHRvZG9zIG9zIHNldXMgZGFkb3Mgc2VtIHF1YWxxdWVyIGNvbmZpcm1hw6fDo28uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iUmVzaWRlbmNpYWwiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJDZWx1bGFyIjwvaXRlbT4KQEAgLTUyNSwxMCArNTMzLDkgQEAKICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVXb3JrIiBtc2dpZD0iMjkyNjg4NzA1MDUzNjM4NzIiPiJDb21lcmNpYWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlT3RoZXIiIG1zZ2lkPSIzOTUxNzgxMTMxNTcwMTI0MDgyIj4iT3V0cm9zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IlBlcnNvbmFsaXphZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4icG9yIG1laW8gZGUgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb25fd2l0aF9kYXRlIiBtc2dpZD0iNTk0NTM4NjM3NjM2OTk3OTkwOSI+Ijx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB2aWEgPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJEaWdpdGUgbyBjw7NkaWdvIFBJTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iRGlnaXRlIGEgc2VuaGEgcGFyYSBkZXNibG9xdWVhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iRGlnaXRlIG8gUElOIHBhcmEgZGVzYmxvcXVlYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJDw7NkaWdvIFBJTiBpbmNvcnJldG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlBhcmEgZGVzYmxvcXVlYXIsIHByZXNzaW9uZSBNZW51IGUsIGVtIHNlZ3VpZGEsIDAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZW1lcmdlbmN5X2NhbGxfZGlhbG9nX251bWJlcl9mb3JfZGlzcGxheSIgbXNnaWQ9IjY5NjE5MjEwMzE5NTA5MDk3MCI+Ik7Dum1lcm8gZGUgZW1lcmfDqm5jaWEiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iUmV0b3JuYXIgw6AgY2hhbWFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IkNvcnJldG8hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IlRlbnRlIG5vdmFtZW50ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4iVGVudGUgbm92YW1lbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4iQ2FycmVnYW5kbyAoPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPikiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iQ2FycmVnYWRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjM2MTc1NDkxNzg2MDMzNTQ2NTYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJPIGNhcnTDo28gU0lNIGVzdMOhIGJsb3F1ZWFkby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV91bmxvY2tfcHJvZ3Jlc3NfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI1OTUzMjMyMTQwNTI4ODEyNjQiPiJEZXNibG9xdWVhbmRvIG8gY2FydMOjbyBTSU3igKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjM1MTQ3NDIxMDYwNjY4Nzc0NzYiPiJWb2PDqiBkZXNlbmhvdSBpbmNvcnJldGFtZW50ZSBvIHNldSBwYWRyw6NvIGRlIGRlc2Jsb3F1ZWlvIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IHZlemVzLiAiXG5cbiJUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4iVm9jw6ogaW5zZXJpdSBpbmNvcnJldGFtZW50ZSBhIHN1YSBzZW5oYSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJWb2PDqiBkaWdpdG91IGluY29ycmV0YW1lbnRlIG8gc2V1IFBJTiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gIlxuXG4iVGVudGUgbm92YW1lbnRlIGVtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHNlZ3VuZG9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIG1zZ2lkPSIzMzUxMDEzODQyMzIwMTI3ODI3Ij4iVm9jw6ogZGVzZW5ob3UgbyBzZXUgcGFkcsOjbyBkZSBkZXNibG9xdWVpbyBpbmNvcnJldGFtZW50ZSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiB2ZXplcy4gTWFpcyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB0ZW50YXRpdmFzIGluY29ycmV0YXMgZSB2b2PDqiByZWNlYmVyw6EgdW1hIHNvbGljaXRhw6fDo28gcGFyYSBkZXNibG9xdWVhciBvIHNldSB0ZWxlZm9uZSB1c2FuZG8gbyBzZXUgbG9naW4gZG8gR29vZ2xlLiJcblxuIiBUZW50ZSBub3ZhbWVudGUgZW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IlRlbnRlIG5vdmFtZW50ZSBlbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gc2VndW5kb3MuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJFc3F1ZWNldSBvIHBhZHLDo28/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJTZWxlY2lvbmFyIHR1ZG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IlNlbGVjaW9uYXIgdGV4dG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4iUmVjb3J0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IkNvcGlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IkNvbGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCIgbXNnaWQ9IjI1MzgyMTE1Nzk1OTYwNjc0MDIiPiJDb3BpYXIgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Ik3DqXRvZG8gZGUgZW50cmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJBZGljaW9uYXIgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgYW8gZGljaW9uw6FyaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJFZGl0YXIgdGV4dG8iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+IlBvdWNvIGVzcGHDp28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJPIGVzcGHDp28gZGUgYXJtYXplbmFtZW50byBkbyB0ZWxlZm9uZSBlc3TDoSBmaWNhbmRvIGJhaXhvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9rIiBtc2dpZD0iNTk3MDA2MDQzMDU2MjUyNDkxMCI+Ik9LIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4iT0siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiJDYW5jZWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJBdGVuw6fDo28iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2FkaW5nIiBtc2dpZD0iMTc2MDcyNDk5ODkyODI1NTI1MCI+IkNhcnJlZ2FuZG8uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkFUSVZBRE8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJERVNBVElWQURPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJDb21wbGV0ZSBhIGHDp8OjbyB1c2FuZG8iPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJGb3LDp2FyIGZlY2hhbWVudG8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iSW5mb3JtYXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkFndWFyZGFyIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Ik8gYXBsaWNhdGl2byA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGltcG9zdGEgYXV0b21hdGljYW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Ik8gcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGltcG9zdGEgYXV0b21hdGljYW1lbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZW0gZXhlY3XDp8OjbyI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iVlBOIEwyVFAvSVBTZWMgY29tIGJhc2UgZW0gY2hhdmUgcHLDqS1jb21wYXJ0aWxoYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IlZQTiBMMlRQL0lQU2VjIGNvbSBiYXNlIGVtIGNlcnRpZmljYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iRXNjb2xoZXIgYXJxdWl2byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+Ik5lbmh1bSBhcnF1aXZvIGVzY29saGlkbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IlJlZGVmaW5pciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJFbnZpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+ImZhdm9yaXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iTW9kbyBkZSBjYXJybyBhdGl2YWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+IlNlbGVjaW9uZSBwYXJhIHNhaXIgZG8gbW9kbyBkZSBjYXJyby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4iVsOtbmN1bG8gb3UgcG9udG8gZGUgYWNlc3NvIGF0aXZvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVG9xdWUgcGFyYSBjb25maWd1cmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iVm9sdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iQXZhbsOnYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiJJZ25vcmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4iQWx0byB1c28gZGUgZGFkb3MgZG8gY2VsdWxhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4iVG9xdWUgcGFyYSBzYWJlciBtYWlzIHNvYnJlIHVzbyBkZSBkYWRvcyBkbyBjZWx1bGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJMaW1pdGUgZGUgZGFkb3MgZG8gY2VsdWxhciBleGNlZGlkbyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0tckNIL2FycmF5cy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtLXJDSC9hcnJheXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTg2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtLXJDSC9hcnJheXMueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9jb2xvcnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIEdvb2dsZSBJbmMuCisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisKKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIC0tPgorICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9Im1hcHNfc3RhcnRpbmdfbGF0X2xuZyI+CisgICAgICAgIDxpdGVtPjQ2OTQ4MDIwPC9pdGVtPgorICAgICAgICA8aXRlbT43NDQ4MjA2PC9pdGVtPgorICAgIDwvaW50ZWdlci1hcnJheT4KKyAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIC0tPgorICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9Im1hcHNfc3RhcnRpbmdfem9vbSI+CisgICAgICAgIDxpdGVtPjQ8L2l0ZW0+CisgICAgPC9pbnRlZ2VyLWFycmF5PgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vZG9ub3R0cmFuc2xhdGUtY2xkci54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWY5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sCkBAIC0wLDAgKzEsMTY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2phbnVhcnkiPnNjaGFuZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9mZWJydWFyeSI+ZmF2cmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9hcHJpbCI+YXZyaWdsPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfbWF5Ij5tYXRnPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfanVuZSI+emVyY2xhZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX3N0YW5kYWxvbmVfanVseSI+ZmFuYWR1cjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX2F1Z3VzdCI+YXZ1c3Q8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9zZXB0ZW1iZXIiPnNldHRlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zdGFuZGFsb25lX29jdG9iZXIiPm9jdG9iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9ub3ZlbWJlciI+bm92ZW1iZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfc3RhbmRhbG9uZV9kZWNlbWJlciI+ZGVjZW1iZXI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19qYW51YXJ5Ij5zY2hhbmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2ZlYnJ1YXJ5Ij5mYXZyZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfbWFyY2giPm1hcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfYXByaWwiPmF2cmlnbDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfanVuZSI+emVyY2xhZHVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX2p1bHkiPmZhbmFkdXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX2xvbmdfYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19zZXB0ZW1iZXIiPnNldHRlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19vY3RvYmVyIj5vY3RvYmVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9sb25nX25vdmVtYmVyIj5ub3ZlbWJlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbG9uZ19kZWNlbWJlciI+ZGVjZW1iZXI8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2phbnVhcnkiPnNjaGFuLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2ZlYnJ1YXJ5Ij5mYXZyLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21hcmNoIj5tYXJzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fYXByaWwiPmF2ci48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9tYXkiPm1hdGc8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9qdW5lIj56ZXJjbC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9qdWx5Ij5mYW4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fYXVndXN0Ij5hdnVzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX3NlcHRlbWJlciI+c2V0dC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9vY3RvYmVyIj5vY3QuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fbm92ZW1iZXIiPm5vdi48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9kZWNlbWJlciI+ZGVjLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9qYW51YXJ5Ij5TPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9mZWJydWFyeSI+Rjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfbWFyY2giPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2FwcmlsIj5BPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9tYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2p1bmUiPlo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2p1bHkiPkY8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3Nob3J0ZXN0X2F1Z3VzdCI+QTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3Rfc2VwdGVtYmVyIj5TPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9vY3RvYmVyIj5PPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9zaG9ydGVzdF9ub3ZlbWJlciI+Tjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfc2hvcnRlc3RfZGVjZW1iZXIiPkQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic3VuZGF5Ij5kdW1lbmdpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9uZGF5Ij5nbGluZGVzZGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InR1ZXNkYXkiPm1hcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWRuZXNkYXkiPm1lc2VtbmE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodXJzZGF5Ij5naWV2Z2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmlkYXkiPnZlbmRlcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYXR1cmRheSI+c29uZGE8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19zdW5kYXkiPmR1bWVuZ2lhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX21vbmRheSI+Z2xpbmRlc2RpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3R1ZXNkYXkiPm1hcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3dlZG5lc2RheSI+bWVzZW1uYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ190aHVyc2RheSI+Z2lldmdpYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbG9uZ19mcmlkYXkiPnZlbmRlcmRpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19sb25nX3NhdHVyZGF5Ij5zb25kYTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fc3VuZGF5Ij5kdTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX21vbmRheSI+Z2xpPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fdHVlc2RheSI+bWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV93ZWRuZXNkYXkiPm1lPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19tZWRpdW1fdGh1cnNkYXkiPmdpZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfbWVkaXVtX2ZyaWRheSI+dmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX21lZGl1bV9zYXR1cmRheSI+c288L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfc3VuZGF5Ij5kdTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRfbW9uZGF5Ij5nbGk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0X3R1ZXNkYXkiPm1hPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF93ZWRuZXNkYXkiPm1lPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF90aHVyc2RheSI+Z2llPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9mcmlkYXkiPnZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydF9zYXR1cmRheSI+c288L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl9zdW5kYXkiPkQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfbW9uZGF5Ij5HPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX3R1ZXNkYXkiPk08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXJfd2VkbmVzZGF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX3RodXJzZGF5Ij5HPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVyX2ZyaWRheSI+Vjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlcl9zYXR1cmRheSI+Uzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9zdW5kYXkiPkQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRheV9vZl93ZWVrX3Nob3J0ZXN0X21vbmRheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfdHVlc2RheSI+TTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3Rfd2VkbmVzZGF5Ij5NPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF90aHVyc2RheSI+Rzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF5X29mX3dlZWtfc2hvcnRlc3RfZnJpZGF5Ij5WPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkYXlfb2Zfd2Vla19zaG9ydGVzdF9zYXR1cmRheSI+Uzwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJ5ZXN0ZXJkYXkiPmllcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idG9kYXkiPm96PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0b21vcnJvdyI+ZGFtYXVuPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlXzI0Ij4lLWs6JU08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfbWludXRlX2FtcG0iPiUtbDolTSAlcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9taW51dGVfY2FwX2FtcG0iPiUtbDolTSAlXnA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InR3ZWx2ZV9ob3VyX3RpbWVfZm9ybWF0Ij5oOm1tIGE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InR3ZW50eV9mb3VyX2hvdXJfdGltZV9mb3JtYXQiPkg6bW08L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZSI+JWQuJW0uJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZV9mb3JtYXQiPmRkLk1NLnl5eXk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfZGF0ZV90ZW1wbGF0ZSI+IiVzLiVzLiVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfZGF5X3llYXIiPiUtZS4gJUIgJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZ1bGxfZGF0ZV9tb250aF9maXJzdCI+ZC4gTU1NTSB5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmdWxsX2RhdGVfZGF5X2ZpcnN0Ij5kLiBNTU1NIHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lZGl1bV9kYXRlX21vbnRoX2ZpcnN0Ij5kLiBNTU0geTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWVkaXVtX2RhdGVfZGF5X2ZpcnN0Ij5kLiBNTU0geTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZV9vZl9kYXkiPiVIOiVNOiVTPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3RpbWVfZm9ybWF0Ij5ISDptbTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0ZV9hbmRfdGltZSI+JUg6JU06JVMgJWQuJW0uJVk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGVfdGltZSI+JTEkcywgJTIkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGltZV9kYXRlIj4lMyRzLCAlMSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGhfZGF5X3llYXIiPiVkLiVtLiVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtb250aF9kYXkiPiUtZS4gJUI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoIj4lLUI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX3llYXIiPiVCICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGhfZGF5Ij4lLWUuICViPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhYmJyZXZfbW9udGgiPiUtYjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWJicmV2X21vbnRoX3llYXIiPiViICVZPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aW1lMV90aW1lMiI+JTEkcyAtICUyJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGUxX2RhdGUyIj4lMiRzIC0gJTUkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZDFfbWQyIj4lMyRzLiUyJHMuIC0gJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY193ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzLCAlMyRzLiUyJHMuIC0gJTYkcywgJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZHkxX21keTIiPiUzJHMuJTIkcy4lNCRzIC0gJTgkcy4lNyRzLiU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWR5MV93ZGF5Ml9tZHkyIj4lMSRzLCAlMyRzLiUyJHMuJTQkcyAtICU2JHMsICU4JHMuJTckcy4lOSRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlNCRzLSUyJHMtJTMkcyAtICUxMCRzICU2JHMsICU5JHMtJTckcy0lOCRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1lcmljX21kMV90aW1lMV9tZDJfdGltZTIiPiU1JHMgJTMkcy4lMiRzLiAtICUxMCRzICU4JHMuJTckcy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im51bWVyaWNfd2RheTFfbWQxX3RpbWUxX3dkYXkyX21kMl90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiUyJHMuIC0gJTEwJHMgJTYkcywgJTgkcy4lNyRzLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibnVtZXJpY19tZHkxX3RpbWUxX21keTJfdGltZTIiPiU1JHMgJTMkcy4lMiRzLiU0JHMgLSAlMTAkcyAlOCRzLiU3JHMuJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2RheTFfZGF0ZTFfdGltZTFfd2RheTJfZGF0ZTJfdGltZTIiPiUzJHMgJTEkcyAlMiRzIC0gJTYkcyAlNCRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndkYXkxX2RhdGUxX3dkYXkyX2RhdGUyIj4lMSRzICUyJHMgLSAlNCRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGUxX3RpbWUxX2RhdGUyX3RpbWUyIj4lMyRzICUyJHMgLSAlNiRzICU1JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfd2RheV9kYXRlIj4lMSRzICUyJHMgJTMkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0id2RheV9kYXRlIj4lMiRzICUzJHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpbWVfd2RheSI+JTEkcyAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX3llYXJfbWQxX21kMiI+JTMkcy4gJTIkcyAtICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZDFfd2RheTJfbWQyIj4lMSRzICUzJHMuICUyJHMgLSAlNiRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl9tZDFfdGltZTFfbWQyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgLSAlMTAkcyAlOCRzLiAlNyRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX21kMV90aW1lMV9tZDJfdGltZTIiPiU1JHMgJTMkcy4gJTIkcyAtICUxMCRzICU4JHMuICU3JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfeWVhcl93ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyIj4lNSRzICUxJHMgJTMkcy4gJTIkcyAtICUxMCRzICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZDFfdGltZTFfd2RheTJfbWQyX3RpbWUyIj4lNSRzICUxJHMgJTMkcy4gJTIkcyAtICUxMCRzICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21keTFfdGltZTFfbWR5Ml90aW1lMiI+JTUkcyAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfbWR5MV90aW1lMV9tZHkyX3RpbWUyIj4lNSRzICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21keTFfdGltZTFfd2RheTJfbWR5Ml90aW1lMiI+JTUkcyAlMSRzLCAlMyRzLiAlMiRzICU0JHMgLSAlMTAkcyAlNiRzLCAlOCRzLiAlNyRzICU5JHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNhbWVfbW9udGhfd2RheTFfbWR5MV90aW1lMV93ZGF5Ml9tZHkyX3RpbWUyIj4lNSRzICUxJHMsICUzJHMuICUyJHMgJTQkcyAtICUxMCRzICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF93ZGF5MV9tZHkxX3dkYXkyX21keTIiPiUxJHMsICUzJHMuICUyJHMgJTQkcyAtICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZDFfbWQyIj4lMyRzLi0lOCRzLiAlMiRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzYW1lX21vbnRoX3dkYXkxX21kMV93ZGF5Ml9tZDIiPiUxJHMgJTMkcy4gJTIkcyAtICU2JHMgJTgkcy4gJTckczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX21keTFfbWR5MiI+JTMkcy4gJTIkcyAtICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV9tb250aF9tZHkxX21keTIiPiUzJHMuLSU4JHMuICUyJHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2FtZV95ZWFyX3dkYXkxX21keTFfd2RheTJfbWR5MiI+JTEkcywgJTMkcy4gJTIkcyAtICU2JHMsICU4JHMuICU3JHMgJTkkczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2hvcnRfZm9ybWF0X21vbnRoIj4lYjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAppbmRleCAyOWI3ZTQ2Li44NDA1NzYwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINCy0YHQtSDQtNCw0L3QvdGL0LUg0LrQvtC90YLQsNC60YLQvtCyICjQsNC00YDQtdGB0L7QsiksINGB0L7RhdGA0LDQvdC10L3QvdGL0LUg0LIg0L/QsNC80Y/RgtC4INGC0LXQu9C10YTQvtC90LAuINCS0YDQtdC00L7QvdC+0YHQvdGL0LUg0L/RgNC40LvQvtC20LXQvdC40Y8g0LzQvtCz0YPRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0Y3RgtGDINCy0L7Qt9C80L7QttC90L7RgdGC0Ywg0LTQu9GPINC/0LXRgNC10LTQsNGH0Lgg0LTQsNC90L3Ri9GFINC/0L7RgdGC0L7RgNC+0L3QvdC40Lwg0LvQuNGG0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSI2NDQ2MTYyMTU4NjA5MzMyODQiPiLQv9C10YDQtdC30LDQv9C40YHRi9Cy0LDRgtGMINC00LDQvdC90YvQtSDQutC+0L3RgtCw0LrRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0LjQt9C80LXQvdGP0YLRjCDQtNCw0L3QvdGL0LUgKNCw0LTRgNC10YEpINC60L7QvdGC0LDQutGC0LAsINGB0L7RhdGA0LDQvdC10L3QvdGL0LUg0LIg0L/QsNC80Y/RgtC4INGC0LXQu9C10YTQvtC90LAuINCS0YDQtdC00L7QvdC+0YHQvdGL0LUg0L/RgNC40LvQvtC20LXQvdC40Y8g0LzQvtCz0YPRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0Y3RgtGDINCy0L7Qt9C80L7QttC90L7RgdGC0Ywg0LTQu9GPINGD0LTQsNC70LXQvdC40Y8g0LjQu9C4INC40LfQvNC10L3QtdC90LjRjyDQtNCw0L3QvdGL0YUg0LrQvtC90YLQsNC60YLQsC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+ItC/0LXRgNC10LfQsNC/0LjRgdGL0LLQsNGC0Ywg0LTQsNC90L3Ri9C1INC+INCy0LvQsNC00LXQu9GM0YbQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQuNC30LzQtdC90Y/RgtGMINGB0LLQtdC00LXQvdC40Y8g0L4g0LLQu9Cw0LTQtdC70YzRhtC1LCDRgdC+0YXRgNCw0L3QtdC90L3Ri9C1INC90LAg0YLQtdC70LXRhNC+0L3QtS4g0JLRgNC10LTQvtC90L7RgdC90YvQtSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQvNC+0LPRg9GCINC40YHQv9C+0LvRjNC30L7QstCw0YLRjCDRjdGC0YMg0LLQvtC30LzQvtC20L3QvtGB0YLRjCDQtNC70Y8g0YPQtNCw0LvQtdC90LjRjyDQuNC70Lgg0LjQt9C80LXQvdC10L3QuNGPINC00LDQvdC90YvRhSDQstC70LDQtNC10LvRjNGG0LAuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+ItGB0YfQuNGC0YvQstCw0YLRjCDQtNCw0L3QvdGL0LUg0L4g0LLQu9Cw0LTQtdC70YzRhtC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINGB0LLQtdC00LXQvdC40Y8g0L4g0LLQu9Cw0LTQtdC70YzRhtC1LCDRgdC+0YXRgNCw0L3QtdC90L3Ri9C1INCyINC/0LDQvNGP0YLQuCDRgtC10LvQtdGE0L7QvdCwLiDQktGA0LXQtNC+0L3QvtGB0L3Ri9C1INC/0YDQuNC70L7QttC10L3QuNGPINC80L7Qs9GD0YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGN0YLRgyDQstC+0LfQvNC+0LbQvdC+0YHRgtGMINC00LvRjyDRgdGH0LjRgtGL0LLQsNC90LjRjyDQtNCw0L3QvdGL0YUg0LLQu9Cw0LTQtdC70YzRhtCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIiBtc2dpZD0iNjg5ODk4Nzc5ODMwMzg0MDUzNCI+ItGB0YfQuNGC0YvQstCw0YLRjCDQvNC10YDQvtC/0YDQuNGP0YLQuNGPINCyINC60LDQu9C10L3QtNCw0YDQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU1MzMwMjkxMzk2NTIwOTU3MzQiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0YHRh9C40YLRi9Cy0LDRgtGMINCy0YHQtSDRgdC+0LHRi9GC0LjRjyDQutCw0LvQtdC90LTQsNGA0Y8sINGB0L7RhdGA0LDQvdC10L3QvdGL0LUg0L3QsCDRgtC10LvQtdGE0L7QvdC1LiDQktGA0LXQtNC+0L3QvtGB0L3Ri9C1INC/0YDQuNC70L7QttC10L3QuNGPINC80L7Qs9GD0YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGN0YLRgyDQstC+0LfQvNC+0LbQvdC+0YHRgtGMINC00LvRjyDQv9C10YDQtdC00LDRh9C4INCy0LDRiNC40YUg0YHQvtCx0YvRgtC40Lkg0LrQsNC70LXQvdC00LDRgNGPINC/0L7RgdGC0L7RgNC+0L3QvdC40Lwg0LvQuNGG0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQ2FsZW5kYXIiIG1zZ2lkPSIzODk0ODc5MzUyNTk0OTA0MzYxIj4i0LTQvtCx0LDQstC70Y/RgtGMINC4INC40LfQvNC10L3Rj9GC0Ywg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQsiDQutCw0LvQtdC90LTQsNGA0LUg0Lgg0L7RgtC/0YDQsNCy0LvRj9GC0Ywg0L/QuNGB0YzQvNCwINCz0L7RgdGC0Y/QvCI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+ItCj0L/RgNCw0LLQu9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC+0Lkg0YPRgdGC0YDQvtC50YHRgtCy0LAsINGC0YDQtdCx0YPRjtGJ0LXQuSDQstCy0L7QtNCwINC/0LDRgNC+0LvRjy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfd2lwZURhdGEiIG1zZ2lkPSIzOTEwNTQ1NDQ2NzU4NjM5NzEzIj4i0KPQtNCw0LvQuNGC0Ywg0LLRgdC1INC00LDQvdC90YvQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4i0JLRi9C/0L7Qu9C90LjRgtGMINGB0LHRgNC+0YEg0Log0L3QsNGH0LDQu9GM0L3Ri9C8INC90LDRgdGC0YDQvtC50LrQsNC8INGBINGD0LTQsNC70LXQvdC40LXQvCDQstGB0LXRhSDQtNCw0L3QvdGL0YUg0LHQtdC3INC30LDQv9GA0L7RgdCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+ItCU0L7QvNCw0YjQvdC40LkiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiLQnNC+0LHQuNC70YzQvdGL0LkiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+ItCg0LDQsdC+0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLQlNGA0YPQs9C+0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4i0KHQvtC30LTQsNGC0Ywg0YHQstC+0Lkg0Y/RgNC70YvQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbiIgbXNnaWQ9IjUxMTI1ODk4ODYwOTQ0MDI3OTUiPiLRgSDQv9C+0LzQvtGJ0YzRjiA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+INGBINC/0L7QvNC+0YnRjNGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiIG1zZ2lkPSIzNzMxNDg4ODI3MjE4ODc2MTE1Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4i0JLQstC10LTQuNGC0LUg0L/QsNGA0L7Qu9GMINC00LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4i0JLQstC10LTQuNGC0LUgUElOLdC60L7QtCDQtNC70Y8g0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60LgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiLQndC10LLQtdGA0L3Ri9C5IFBJTi3QutC+0LQhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+ItCU0LvRjyDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuCDQvdCw0LbQvNC40YLQtSBcItCc0LXQvdGOXCIsINCwINC30LDRgtC10LwgMC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4i0K3QutGB0YLRgNC10L3QvdCw0Y8g0YHQu9GD0LbQsdCwIjwvc3RyaW5nPgpAQCAtNTQxLDYgKzU0OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3JldHVybl90b19jYWxsIiBtc2dpZD0iNTI0NDI1OTc4NTUwMDA0MDAyMSI+ItCS0LXRgNC90YPRgtGM0YHRjyDQuiDQstGL0LfQvtCy0YMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiLQn9GA0LDQstC40LvRjNC90L4hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i0JjQtNC10YIg0LfQsNGA0Y/QtNC60LAgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+ItCX0LDRgNGP0LbQtdC90LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC01NTUsNiArNTYzLDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX2xvY2tlZF9tZXNzYWdlIiBtc2dpZD0iODA2NjY2MDEyOTIwNjAwMTAzOSI+IlNJTS3QutCw0YDRgtCwINC30LDQsdC70L7QutC40YDQvtCy0LDQvdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+ItCg0LDQt9Cx0LvQvtC60LjRgNC+0LLQutCwIFNJTS3QutCw0YDRgtGL4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAg0LPRgNCw0YTQuNGH0LXRgdC60L7Qs9C+INC60LvRjtGH0LAg0YDQsNC30LHQu9C+0LrQuNGA0L7QstC60Lg6IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQv9Cw0YDQvtC70Y86IDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+LiAiXG5cbiLQn9C+0LLRgtC+0YDQuNGC0LUg0L/QvtC/0YvRgtC60YMg0YfQtdGA0LXQtyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i0JrQvtC70LjRh9C10YHRgtCy0L4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LLQvtC00LAgUElOLdC60L7QtNCwOiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPi4gIlxuXG4i0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLQmtC+0LvQuNGH0LXRgdGC0LLQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC+0Log0LLQstC+0LTQsCDQs9GA0LDRhNC40YfQtdGB0LrQvtCz0L4g0LrQu9GO0YfQsCDRgNCw0LfQsdC70L7QutC40YDQvtCy0LrQuDogPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4uINCf0L7RgdC70LUgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INCy0LDQvCDQsdGD0LTQtdGCINC/0YDQtdC00LvQvtC20LXQvdC+INGA0LDQt9Cx0LvQvtC60LjRgNC+0LLQsNGC0Ywg0YLQtdC70LXRhNC+0L0g0YEg0L/QvtC80L7RidGM0Y4g0YPRh9C10YLQvdGL0YUg0LTQsNC90L3Ri9GFIEdvb2dsZS5cbiAiXG5cbiIg0J/QvtCy0YLQvtGA0LjRgtC1INC/0L7Qv9GL0YLQutGDINGH0LXRgNC10LcgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g0YEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+ItCf0L7QstGC0L7RgNC40YLQtSDQv9C+0L/Ri9GC0LrRgyDRh9C10YDQtdC3IDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDRgS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+ItCX0LDQsdGL0LvQuCDQs9GA0LDRhNC40YfQtdGB0LrQuNC5INC60LvRjtGHPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i0JLRi9Cx0YDQsNGC0Ywg0LLRgdC1Ijwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLQktGL0LHRgNCw0YLRjCDRgtC10LrRgdGCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+ItCS0YvRgNC10LfQsNGC0YwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+ItCa0L7Qv9C40YDQvtCy0LDRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4i0JLRgdGC0LDQstC40YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i0JrQvtC/0LjRgNC+0LLQsNGC0YwgVVJMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+ItCh0L/QvtGB0L7QsSDQstCy0L7QtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+ItCU0L7QsdCw0LLQuNGC0YwgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIg0LIg0YHQu9C+0LLQsNGA0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiLQmNC30LzQtdC90LjRgtGMINGC0LXQutGB0YIiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZWRpdFRleHRNZW51VGl0bGUgKDQ5MDkxMzU1NjQ5NDE4MTU0OTQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIiBtc2dpZD0iMTM5OTczMjQwODcwMTY5NzU0NiI+ItCd0LXQtNC+0YHRgtCw0YLQvtGH0L3QviDQvNC10YHRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i0JfQsNC60LDQvdGH0LjQstCw0LXRgtGB0Y8g0LzQtdGB0YLQviDQsiDQv9Cw0LzRj9GC0Lgg0YLQtdC70LXRhNC+0L3QsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLQntCaIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i0J7QmiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+ItCe0YLQvNC10L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiLQktC90LjQvNCw0L3QuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLQl9Cw0LPRgNGD0LfQutCwLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLQktCa0JsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLQktCr0JrQmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i0KfRgtC+INC40YHQv9C+0LvRjNC30L7QstCw0YLRjD8iPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiLQl9Cw0LrRgNGL0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiLQntGC0YfQtdGCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2FpdCIgbXNnaWQ9IjcxNDcxMTgyMTcyMjYzMTc3MzIiPiLQn9C+0LTQvtC20LTQsNGC0YwiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfdGl0bGUgKDgzMjM3NjE2MTYwNTIxMjE5MzYpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfcmVwbGFjZSAoNjIwMjQ5ODk0OTk3MDI4MTQxMikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KLSAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i0J/RgNC40LvQvtC20LXQvdC40LUgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo0L/RgNC+0YbQtdGB0YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDQvdCw0YDRg9GI0LjQu9C+INGB0L7QsdGB0YLQstC10L3QvdGD0Y4g0L/QvtC70LjRgtC40LrRgyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItCf0YDQvtGG0LXRgdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDQvdCw0YDRg9GI0LjQuyDRgdC+0LHRgdGC0LLQtdC90L3Rg9GOINC/0L7Qu9C40YLQuNC60YMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+ItCf0YDQuNC70L7QttC10L3QuNC1IDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+INC30LDQv9GD0YnQtdC90L4iPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDQv9GA0LXQtNCyLiDQvtCx0YkuINC60LvRjtGH0LApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IkwyVFAvSVBTZWMgVlBOICjQvdCwINC+0YHQvdC+0LLQtSDRgdC10YDRgtC40YTQuNC60LDRgtCwKSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+ItCS0YvQsdGA0LDRgtGMINGE0LDQudC7Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4i0J3QtSDQstGL0LHRgNCw0L0g0YTQsNC50LsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLQodCx0YDQvtGB0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+ItCe0YLQv9GA0LDQstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4i0LjQt9Cx0YDQsNC90L3QvtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4i0KDQtdC20LjQvCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4INCy0LrQu9GO0YfQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjY2ODY2MzYyNjcyMTY3NTYxNCI+ItCS0YvQsdC10YDQuNGC0LUg0LTQu9GPINCy0YvRhdC+0LTQsCDQuNC3INGA0LXQttC40LzQsCDQs9GA0L7QvNC60L7QuSDRgdCy0Y/Qt9C4LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNDY2OTQyMzQzOTgyMDI2MDEiPiJVU0It0LzQvtC00LXQvCDQuNC70Lgg0YLQvtGH0LrQsCDQtNC+0YHRgtGD0L/QsCBXaS1GaSDQsNC60YLQuNCy0L3RiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+ItCd0LDQttC80LjRgtC1INC00LvRjyDQvdCw0YHRgtGA0L7QudC60LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLQndCw0LfQsNC0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i0JTQsNC70LXQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+ItCf0YDQvtC/0YPRgdGC0LjRgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i0JDQutGC0LjQstC90LDRjyDQv9C10YDQtdC00LDRh9CwINC00LDQvdC90YvRhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIyNjA5NzM0NzYzODQ1NzA1NzA4Ij4i0J3QsNC20LzQuNGC0LUsINGH0YLQvtCx0Ysg0YPQt9C90LDRgtGMINCx0L7Qu9GM0YjQtSDQviDQvNC+0LHQuNC70YzQvdC+0Lkg0L/QtdGA0LXQtNCw0YfQtSDQtNCw0L3QvdGL0YUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+ItCf0YDQtdCy0YvRiNC10L0g0LvQuNC80LjRgiDQvdCwINC80L7QsdC40LvRjNC90YvQtSDQtNCw0L3QvdGL0LUiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCBiNTNmMjE5Li40NjgwNmFiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKQEAgLTI4OCw2ICsyODgsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDb250YWN0cyIgbXNnaWQ9IjMzNzE1OTE1MTI4OTY1NDU5NzUiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIGzDpHNlciBhbGxhIGtvbnRha3R1cHBnaWZ0ZXIgKGFkcmVzc2VyKSBzb20gaGFyIGxhZ3JhdHMgcMOlIGRpbiB0ZWxlZm9uLiBTa2FkbGlnYSBwcm9ncmFtIGthbiBhbnbDpG5kYSBkZXR0YSBmw7ZyIGF0dCBza2lja2EgZGluYSBkYXRhIHRpbGwgYW5kcmEgcGVyc29uZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ic2tyaXZhIGtvbnRha3R1cHBnaWZ0ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNvbnRhY3RzIiBtc2dpZD0iMzkyNDM4MzU3OTEwODE4MzYwMSI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gw6RuZHJhciBrb250YWt0dXBwZ2lmdGVyIChhZHJlc3MpIHNvbSBoYXIgbGFncmF0cyBww6UgZGluIHRlbGVmb24uIFNrYWRsaWdhIHByb2dyYW0ga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHJhZGVyYSBlbGxlciDDpG5kcmEga29udGFrdHVwcGdpZnRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iNDg5MjU1NTkxMzg0OTI5NTM5MyI+InNrcml2YSDDpGdhcmluZm9ybWF0aW9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVPd25lckRhdGEiIG1zZ2lkPSIyMzQ0MDU1MzE3OTY5Nzg3MTI0Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSDDpG5kcmFyIGluZm9ybWF0aW9uIG9tIHRlbGVmb25lbnMgw6RnYXJlIHNvbSBoYXIgbGFncmF0cyBww6UgZGluIHRlbGVmb24uIFNrYWRsaWdhIHByb2dyYW0ga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IHJhZGVyYSBlbGxlciDDpG5kcmEgw6RnYXJ1cHBnaWZ0ZXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkT3duZXJEYXRhIiBtc2dpZD0iNjY2ODUyNTk4NDczMTUyMzU2MyI+ImzDpHNhIGluZm9ybWF0aW9uIG9tIMOkZ2FyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRPd25lckRhdGEiIG1zZ2lkPSIzMDg4NDg2MzgzMTI4NDM0NTA3Ij4iVGlsbMOldGVyIGF0dCBldHQgcHJvZ3JhbSBsw6RzZXIgaW5mb3JtYXRpb24gb20gdGVsZWZvbmVucyDDpGdhcmUgc29tIGhhciBsYWdyYXRzIHDDpSB0ZWxlZm9uZW4uIFNrYWRsaWdhIHByb2dyYW0ga2FuIGFudsOkbmRhIGRldHRhIGbDtnIgYXR0IGzDpHNhIHRlbGVmb25lbnMgw6RnYXJ1cHBnaWZ0ZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI2ODk4OTg3Nzk4MzAzODQwNTM0Ij4ibMOkc2Ega2FsZW5kZXJow6RuZGVsc2VyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTUzMzAyOTEzOTY1MjA5NTczNCI+IlRpbGzDpXRlciBhdHQgZXR0IHByb2dyYW0gbMOkc2VyIGFsbGEgaMOkbmRlbHNlciBpIGthbGVuZGVybiBzb20gaGFyIGxhZ3JhdHMgcMOlIGRpbiB0ZWxlZm9uLiBTa2FkbGlnYSBwcm9ncmFtIGthbiBhbnbDpG5kYSBkZXR0YSBmw7ZyIGF0dCBza2lja2EgZGluIGthbGVuZGVyIHRpbGwgYW5kcmEgcGVyc29uZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+ImzDpGdnIHRpbGwgb2NoIMOkbmRyYSBrYWxlbmRlcmjDpG5kZWxzZXIgb2NoIHNraWNrYSBlLXBvc3QgdGlsbCBnw6RzdGVyIjwvc3RyaW5nPgpAQCAtNDMyLDYgKzQzNiwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19mb3JjZUxvY2siIG1zZ2lkPSIyODE5ODY4NjY0OTQ2MDg5NzQwIj4iS29udHJvbGxlcmEgbsOkciBlbmhldGVuIGzDpXNlcywgdmlsa2V0IGtyw6R2ZXIgYXR0IGR1IGFuZ2VyIGzDtnNlbm9yZGV0IGlnZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX3dpcGVEYXRhIiBtc2dpZD0iMzkxMDU0NTQ0Njc1ODYzOTcxMyI+IlJhZGVyYSBhbGxhIGRhdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IsOFdGVyc3TDpGxsIGZhYnJpa3NpbnN0w6RsbG5pbmdhcm5hIG9jaCB0YSBib3J0IGFsbGEgZGF0YSB1dGFuIG7DpWdvbiBiZWtyw6RmdGVsc2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iSGVtIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWwiPC9pdGVtPgpAQCAtNTI1LDEwICs1MzMsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZVdvcmsiIG1zZ2lkPSIyOTI2ODg3MDUwNTM2Mzg3MiI+IkFyYmV0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiLDlnZyaWd0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZUN1c3RvbSIgbXNnaWQ9IjIyNTUyMzQxNTM3MjA4ODMyMiI+IkFucGFzc2FkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uIiBtc2dpZD0iNTExMjU4OTg4NjA5NDQwMjc5NSI+InZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IkRBVEUiPiUxJHM8L3hsaWZmOmc+IHZpYSA8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+IkFuZ2UgUElOLWtvZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iQW5nZSBsw7ZzZW5vcmQgZsO2ciBhdHQgbMOlc2EgdXBwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI2MzgzNDcwNzU2MjU0OTE1MTQiPiJBbmdlIFBJTi1rb2QgZsO2ciBhdHQgbMOlc2EgdXBwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iRmVsIFBJTi1rb2QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfbGFiZWxfdGV4dCIgbXNnaWQ9Ijg2MTc5NjQ2MTAyODI5ODQyNCI+IlRyeWNrIHDDpSBNZW51IG9jaCBzZWRhbiBww6UgMCBvbSBkdSB2aWxsIGzDpXNhIHVwcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbWVyZ2VuY3lfY2FsbF9kaWFsb2dfbnVtYmVyX2Zvcl9kaXNwbGF5IiBtc2dpZD0iNjk2MTkyMTAzMTk1MDkwOTcwIj4iTsO2ZHNhbXRhbHNudW1tZXIiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4iw4V0ZXJnw6UgdGlsbCBzYW10YWxldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGF0dGVybl9jb3JyZWN0IiBtc2dpZD0iOTAzOTAwODY1MDM2MjI2MTIzNyI+IktvcnJla3QhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IkbDtnJzw7ZrIGlnZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Bhc3N3b3JkX3dyb25nIiBtc2dpZD0iNjIzNzQ0MzY1NzM1ODE2ODgxOSI+IkbDtnJzw7ZrIGlnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiJMYWRkYXIgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkxhZGRhZC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNLWtvcnRldCDDpHIgbMOlc3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNTk1MzIzMjE0MDUyODgxMjY0Ij4iTMOlc2VyIHVwcCBTSU0ta29ydOKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IkR1IGhhciByaXRhdCBkaXR0IGdyYWZpc2thIGzDtnNlbm9yZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiJEdSBoYXIgYW5nZXR0IGZlbCBsw7ZzZW5vcmQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4iRHUgaGFyIGFuZ2V0dCBkaW4gUElOLWtvZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gIlxuXG4iRsO2cnPDtmsgaWdlbiBvbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzZWt1bmRlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IkR1IGhhciByaXRhdCBkaXR0IGdyYWZpc2thIGzDtnNlbm9yZCBmZWwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4gZ8Olbmdlci4gRWZ0ZXIgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gZsO2cnPDtmsgdGlsbCBrb21tZXIgZHUgYXR0IHVwcG1hbmFzIGF0dCBsw6VzYSB1cHAgdGVsZWZvbmVuIG1lZCBkaW4gR29vZ2xlLWlubG9nZ25pbmcuIlxuXG4iIEbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gc2VrdW5kZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IkbDtnJzw7ZrIGlnZW4gb20gPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNla3VuZGVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4iR2zDtm10IGRpdHQgZ3JhZmlza2EgbMO2c2Vub3JkPyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4iVsOkbGogYWxsYSI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iTWFya2VyYSB0ZXh0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY3V0IiBtc2dpZD0iMzA5MjU2OTQwODQzODYyNjI2MSI+IktsaXBwIHV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiJLb3BpZXJhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzdGUiIG1zZ2lkPSI1NjI5ODgwODM2ODA1MDM2NDMzIj4iS2xpc3RyYSBpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iS29waWVyYSB3ZWJiYWRyZXNzIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkluZGF0YW1ldG9kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iYWRkVG9EaWN0aW9uYXJ5IiBtc2dpZD0iODc5MzYyNDk5MTY4Njk0ODcwOSI+IkzDpGdnIHRpbGwgXCI8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+XCIgaSBvcmRsaXN0YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSIgbXNnaWQ9IjE2NzI5ODkxNzY5NTg1ODE0NTIiPiJSZWRpZ2VyYSB0ZXh0Ijwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJEw6VsaWd0IG1lZCB1dHJ5bW1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4iVGVsZWZvbmVucyBsYWdyaW5nc3V0cnltbWUgaMOlbGxlciBww6UgYXR0IHRhIHNsdXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4iT0siPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiJPSyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vIiBtc2dpZD0iNTE0MTUzMTA0NDkzNTU0MTQ5NyI+IkF2YnJ5dCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19hbGVydF90aXRsZSIgbXNnaWQ9IjIwNDk2NTg3MDg2MDkwNDMxMDMiPiJPYnMhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiJMw6RzZXIgaW4uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IlDDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IkFWIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJTbHV0ZsO2ciDDpXRnw6RyZCBnZW5vbSBhdHQgYW52w6RuZGEiPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJUdmluZ2EgZnJhbSBlbiBzdMOkbmduaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IlJhcHBvcnRlcmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IlbDpG50YSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtbWV0IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhciBicnV0aXQgbW90IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2Nlc3NlbiA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFyIGJydXRpdCBtb3Qgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpY3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBrw7ZycyI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4iSSBmw7ZydsOkZyBkZWxhZCBMMlRQL0lQU2VjIFZQTi1ueWNrZWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iQ2VydGlmaWthdHNiYXNlcmFkIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXBsb2FkX2ZpbGUiIG1zZ2lkPSIyODk3OTU3MTcyMzY2NzMwNDE2Ij4iVsOkbGogZmlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iSW5nZW4gZmlsIGhhciB2YWx0cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IsOFdGVyc3TDpGxsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3VibWl0IiBtc2dpZD0iMTYwMjMzNTU3MjA4OTkxMTk0MSI+IlNraWNrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IkJpbGzDpGdlIGFrdGl2ZXJhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJWw6RsaiBvbSBkdSB2aWxsIGF2c2x1dGEgYmlsbMOkZ2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkludGVybmV0ZGVsbmluZyBlbGxlciBzdXJmcHVua3QgYWt0aXZlcmFkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4iVHJ5Y2sgb20gZHUgdmlsbCBrb25maWd1cmVyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMjMwMDQ3MDAwNDUwMzM0MzQzOSI+IlRpbGxiYWthIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4iTsOkc3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4iSG9wcGEgw7Z2ZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJIw7ZnIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiJUcnljayBvbSBkdSB2aWxsIHZldGEgbWVyIG9tIG1vYmlsZGF0YWFudsOkbmRuaW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJHcsOkbnNlbiBmw7ZyIG1vYmlsZGF0YSBoYXIgw7Z2ZXJza3JpZGl0cyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IGVhNDZkYjAuLmZmZmJjZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IlV5Z3VsYW1hbGFyxLFuIHRlbGVmb251bnV6ZGEgZGVwb2xhbmFuIHTDvG0ga2nFn2kgKGFkcmVzKSB2ZXJpbGVyaW5pIG9rdW1hc8SxbmEgaXppbiB2ZXJpci4gS8O2dMO8IGFtYcOnbMSxIHV5Z3VsYW1hbGFyIGJ1IGnFn2xldmkgdmVyaWxlcmluaXppIGJhxZ9rYWxhcsSxbmEgZ8O2bmRlcm1layBpw6dpbiBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNvbnRhY3RzIiBtc2dpZD0iNjQ0NjE2MjE1ODYwOTMzMjg0Ij4ia2nFn2kgdmVyaWxlcmkgeWF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjM5MjQzODM1NzkxMDgxODM2MDEiPiJVeWd1bGFtYWxhcsSxbiB0ZWxlZm9udW51emRhIGRlcG9sYW5hbiBracWfaSAoYWRyZXMpIHZlcmlsZXJpbmkgZGXEn2nFn3Rpcm1lc2luZSBpemluIHZlcmlyLiBLw7Z0w7wgYW1hw6dsxLEgdXlndWxhbWFsYXIgYnUgacWfbGV2aSBracWfaSB2ZXJpbGVyaW5pemkgc2lsbWVrIHZleWEgZGXEn2nFn3Rpcm1layBpw6dpbiBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiJzYWhpcCB2ZXJpbGVyaW5pIHlheiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlT3duZXJEYXRhIiBtc2dpZD0iMjM0NDA1NTMxNzk2OTc4NzEyNCI+IlV5Z3VsYW1hbGFyxLFuIHRlbGVmb251bnV6ZGEgZGVwb2xhbmFuIHRlbGVmb24gc2FoaWJpIHZlcmlsZXJpbmkgZGXEn2nFn3Rpcm1lc2luZSBpemluIHZlcmlyLiBLw7Z0w7wgYW1hw6dsxLEgdXlndWxhbWFsYXIgYnUgacWfbGV2aSBrdWxsYW7EsWPEsSB2ZXJpbGVyaW5pIHNpbG1layB2ZXlhIGRlxJ9pxZ90aXJtZWsgacOnaW4ga3VsbGFuYWJpbGlyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjY2Njg1MjU5ODQ3MzE1MjM1NjMiPiJzYWhpcCB2ZXJpbGVyaW5pIG9rdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRPd25lckRhdGEiIG1zZ2lkPSIzMDg4NDg2MzgzMTI4NDM0NTA3Ij4iVXlndWxhbWFsYXLEsW4gdGVsZWZvbnVudXpkYSBkZXBvbGFuYW4gdGVsZWZvbiBzYWhpYmkgdmVyaWxlcmluaSBva3VtYXPEsW5hIGl6aW4gdmVyaXIuIEvDtnTDvCBhbWHDp2zEsSB1eWd1bGFtYWxhciBidW51IHRlbGVmb24gc2FoaWJpIHZlcmlsZXJpbmkgb2t1bWFrIGnDp2luIGt1bGxhbmFiaWxpci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiJ0YWt2aW0gZXRraW5saWtsZXJpbmkgb2t1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENhbGVuZGFyIiBtc2dpZD0iNTUzMzAyOTEzOTY1MjA5NTczNCI+IlV5Z3VsYW1hbGFyxLFuIHRlbGVmb251bnV6ZGEgZGVwb2xhbmFuIHRha3ZpbSBldGtpbmxpa2xlcmluaW4gdMO8bcO8bsO8IG9rdW1hc8SxbmEgaXppbiB2ZXJpci4gS8O2dMO8IGFtYcOnbMSxIHV5Z3VsYW1hbGFyIGJ1bnUsIHRha3ZpbSBldGtpbmxpa2xlcmluaXppIGJhxZ9rYWxhcsSxbmEgZ8O2bmRlcm1layBpw6dpbiBrdWxsYW5hYmlsaXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+InRha3ZpbSBldGtpbmxpa2xlcmkgZWtsZSB2ZXlhIGRlxJ9pxZ90aXIgdmUga29udWtsYXJhIGUtcG9zdGEgZ8O2bmRlciI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IkNpaGF6IGtpbGl0bGVuZGnEn2luZGUsIMWfaWZyZXNpbmkgeWVuaWRlbiBnaXJtZW5pemkgZ2VyZWt0aXJlbiBkZW5ldGltLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiJUw7xtIHZlcmlsZXJpIHNpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfd2lwZURhdGEiIG1zZ2lkPSIyMzE0MDYwOTMzNzk2Mzk2MjA1Ij4iVMO8bSB2ZXJpbGVyaW5pemkgb25heSBvbG1hZGFuIHNpbG1layBpw6dpbiBmYWJyaWthIGF5YXJsYXLEsW5hIHPEsWbEsXJsYXnEsW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBvbGljeWxhYl9zZXRHbG9iYWxQcm94eSAoMjc4NDgyODI5Mzc0Nzc5MTQ0NikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5ICg2Mzg3NDk3NDY2NjYwMTU0OTMxKSAtLT4KKyAgICA8c2tpcCAvPgogICA8c3RyaW5nLWFycmF5IG5hbWU9InBob25lVHlwZXMiPgogICAgIDxpdGVtIG1zZ2lkPSI4OTAxMDk4MzM2NjU4NzEwMzU5Ij4iRXYiPC9pdGVtPgogICAgIDxpdGVtIG1zZ2lkPSI4Njk5MjM2NTA1MjcxMzY2MTUiPiJNb2JpbCI8L2l0ZW0+CkBAIC01MjUsMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4ixLDFnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVPdGhlciIgbXNnaWQ9IjM5NTE3ODExMzE1NzAxMjQwODIiPiJEacSfZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlQ3VzdG9tIiBtc2dpZD0iMjI1NTIzNDE1MzcyMDg4MzIyIj4iw5Z6ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTEkczwveGxpZmY6Zz4gYXJhY8SxbMSxxJ/EsXlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiIG1zZ2lkPSI1OTQ1Mzg2Mzc2MzY5OTc5OTA5Ij4iPHhsaWZmOmcgaWQ9IlNPVVJDRSI+JTIkczwveGxpZmY6Zz4gaWxlIDx4bGlmZjpnIGlkPSJEQVRFIj4lMSRzPC94bGlmZjpnPiB0YXJpaGluZGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSIgbXNnaWQ9IjM3MzE0ODg4MjcyMTg4NzYxMTUiPiJQSU4ga29kdW51IGdpciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bhc3N3b3JkX2NvZGUiIG1zZ2lkPSI5MTM4MTU4MzQ0ODEzMjEzNzU0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDFn2lmcmV5aSBnaXJpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wYXNzd29yZF9jb2RlIiBtc2dpZD0iNjM4MzQ3MDc1NjI1NDkxNTE0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiBQSU5cJ2kgZ2lyaW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF93cm9uZ19waW5fY29kZSIgbXNnaWQ9IjEyOTU5ODQxMTQzMzgxMDc3MTgiPiJZYW5sxLHFnyBQSU4ga29kdSEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9sYWJlbF90ZXh0IiBtc2dpZD0iODYxNzk2NDYxMDI4Mjk4NDI0Ij4iS2lsaWRpIGHDp21hayBpw6dpbiDDtm5jZSBNZW7DvFwneWUsIHNvbnJhIDBcJ2EgYmFzxLFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiJBY2lsIGR1cnVtIG51bWFyYXPEsSI8L3N0cmluZz4KQEAgLTU0MSw2ICs1NDgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9yZXR1cm5fdG9fY2FsbCIgbXNnaWQ9IjUyNDQyNTk3ODU1MDAwNDAwMjEiPiLDh2HEn3LEsXlhIGTDtm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fY29ycmVjdCIgbXNnaWQ9IjkwMzkwMDg2NTAzNjIyNjEyMzciPiJEb8SfcnUhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IsOcemfDvG7DvHosIGzDvHRmZW4geWVuaWRlbiBkZW5leWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyIgbXNnaWQ9IjYyMzc0NDM2NTczNTgxNjg4MTkiPiJNYWFsZXNlZiwgdGVrcmFyIGRlbmV5aW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI2MTMzNDM4NTI4NDI5NDQ0MzUiPiLFnmFyaiBvbHV5b3IgKDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IsWeYXJqIG9sZHUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iMzYxNzU0OTE3ODYwMzM1NDY1NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtNTU1LDYgKzU2Myw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3NpbV9sb2NrZWRfbWVzc2FnZSIgbXNnaWQ9IjgwNjY2NjAxMjkyMDYwMDEwMzkiPiJTSU0ga2FydCBraWxpdGxpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+IlNJTSBrYXJ0IGtpbGlkaSBhw6fEsWzEsXlvcuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iMzUxNDc0MjEwNjA2Njg3NzQ3NiI+IktpbGl0IGHDp21hIGRlc2VuaW5pemkgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2V6IHlhbmzEscWfIMOnaXpkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4ixZ5pZnJlbml6aSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrZXogeWFubMSxxZ8gZ2lyZGluaXouICJcblxuIkzDvHRmZW4gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gc2FuaXllIGnDp2luZGUgeWVuaWRlbiBkZW5leWluLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiJQSU5cJ2luaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyBnaXJkaW5pei4gIlxuXG4iTMO8dGZlbiA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBzYW5peWUgacOnaW5kZSB5ZW5pZGVuIGRlbmV5aW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiJLaWxpdCBhw6dtYSBkZXNlbmluaXppIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGtleiB5YW5sxLHFnyDDp2l6ZGluaXouIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGJhxZ9hcsSxc8SxeiBkZW5lbWVkZW4gc29ucmEgdGVsZWZvbnVudXp1IEdvb2dsZSBvdHVydW0gYcOnbWEgYmlsZ2lsZXJpbml6aSBrdWxsYW5hcmFrIGHDp21hbsSxeiBpc3RlbmlyLiJcblxuIiBMw7x0ZmVuIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHNhbml5ZSBpw6dpbmRlIHllbmlkZW4gZGVuZXlpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IkRlc2VuaSB1bnV0dHVudXogbXU/Ijwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiJUw7xtw7xuw7wgc2XDpyI8L3N0cmluZz4KLSAgICA8IS0tIG91dGRhdGVkIHRyYW5zbGF0aW9uIDM4ODkxNDkxMjM2MjY4ODg2MzcgLS0+ICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHQiIG1zZ2lkPSI0ODYyMzU5MzExMDg4ODk4ODc4Ij4iTWV0aW4gc2XDpyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiJLZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+IktvcHlhbGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiJZYXDEscWfdMSxciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4iVVJMXCd5aSBrb3B5YWxhIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+IkdpcmnFnyB5w7ZudGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiJcIjx4bGlmZjpnIGlkPSJXT1JEIj4lczwveGxpZmY6Zz5cIiBrZWxpbWVzaW5pIHPDtnpsw7zEn2UgZWtsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Ik1ldGluIGTDvHplbmxlIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiJZZXIgYXoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiJUZWxlZm9udW4gZGVwb2xhbWEgYWxhbsSxIGF6YWzEsXlvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiJUYW1hbSI8L3N0cmluZz4KQEAgLTcxNCw2ICs3MjcsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ieWVzIiBtc2dpZD0iNTM2Mjk4MjMwMzMzNzk2OTMxMiI+IlRhbWFtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4ixLBwdGFsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IkRpa2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4iWcO8a2xlbml5b3IuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkHDh0lLIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iS0FQQUxJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiLEsMWfbGVtaSDFn3VudSBrdWxsYW5hcmFrIHRhbWFtbGEiPC9zdHJpbmc+CkBAIC03MzIsMTIgKzc0Niw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJmb3JjZV9jbG9zZSIgbXNnaWQ9IjM2NTM0MTYzMTU0NTA4MDYzOTYiPiJLYXBhbm1heWEgem9ybGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBvcnQiIG1zZ2lkPSI0MDYwMjE4MjYwOTg0Nzk1NzA2Ij4iUmFwb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IkJla2xlIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+Ijx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gdXlndWxhbWFzxLEgKDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPiBpxZ9sZW1pKSBrZW5kaWxpxJ9pbmRlbiB1eWd1bGFkxLHEn8SxIFN0cmljdE1vZGUgcG9saXRpa2FzxLFuxLEgaWhsYWwgZXR0aS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiI8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gacWfbGVtaSBrZW5kaWxpxJ9pbmRlbiB1eWd1bGFkxLHEn8SxIFN0cmljdE1vZGUgcG9saXRpa2FzxLFuxLEgaWhsYWwgZXR0aS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IMOnYWzEscWfxLF5b3IiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IkwyVFAvSVBTZWMgVlBOIHRlbWVsbGkgw7ZuY2VkZW4gcGF5bGHFn8SxbG3EscWfIGFuYWh0YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSI1MzgyNzE0MDczMTAzNjUzNTc3Ij4iTDJUUC9JUFNlYyBWUE4gdGVtZWxsaSBzZXJ0aWZpa2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJEb3N5YSBzZcOnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iIG1zZ2lkPSI2MzYzNjQ4NTYyMTcwNzU5NDY1Ij4iU2XDp2lsaSBkb3N5YSB5b2siPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJTxLFmxLFybGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4iR8O2bmRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImRlc2NyaXB0aW9uX3N0YXIiIG1zZ2lkPSIyNjU0MzE5ODc0OTA4NTc2MTMzIj4iZmF2b3JpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTY0NzY4MjEyMDAzODY0MzE2Ij4iQXJhYmEgbW9kdSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiJBcmFiYSBtb2R1bmRhbiDDp8Sxa21hayBpw6dpbiBzZcOnaW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IkRvxJ9ydWRhbiBiYcSfbGFudMSxIHZleWEgb3J0YWsgZXJpxZ9pbSBub2t0YXPEsSBldGtpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMzA2NzEwODMyMzkwMzA0ODkyNyI+IllhcMSxbGFuZMSxcm1hayBpw6dpbiBkb2t1bnVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4iR2VyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5leHRfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTA4MDU1NTEwNDY3Nzk5MjQwOCI+IsSwbGVyaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNraXBfYnV0dG9uX2xhYmVsIiBtc2dpZD0iMTI3NTM2MjI5OTQ3MTYzMTgxOSI+IkF0bGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiJZw7xrc2VrIGTDvHpleWRlIG1vYmlsIHZlcmkga3VsbGFuxLFtxLEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Ik1vYmlsIHZlcmkga3VsbGFuxLFtxLEgaGFra8SxbmRhIGRhaGEgZmF6bGEgYmlsZ2kgZWRpbm1layBpw6dpbiBkb2t1bnVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVkX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjYyNjk1NDE4OTc3Mjk3ODEzMzIiPiJNb2JpbCB2ZXJpIGxpbWl0aSBhxZ/EsWxkxLEiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9jb25maWcueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTVhMjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSBUaGVzZSByZXNvdXJjZXMgYXJlIGFyb3VuZCBqdXN0IHRvIGFsbG93IHRoZWlyIHZhbHVlcyB0byBiZSBjdXN0b21pemVkCisgICAgIGZvciBkaWZmZXJlbnQgaGFyZHdhcmUgYW5kIHByb2R1Y3QgYnVpbGRzLiAtLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN0YXR1cyBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCisgICAgICAgICBpbnRlcmZhY2UuICBUaGlzIG5hbWUgaXMgaW4gdGhlIENvbXBvbmVudE5hbWUgZmxhdHRlbmVkIGZvcm1hdCAocGFja2FnZS9jbGFzcykgIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXJTZXJ2aWNlPC9zdHJpbmc+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBTaG93IHNsaWRpbmcgdGFiIGJlZm9yZSBsb2Nrc2NyZWVuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVTbGlkaW5nVGFiRmlyc3QiPmZhbHNlPC9ib29sPgorICAgIDwhLS0gRW5hYmxlIGxvY2tzY3JlZW4gcm90YXRpb24gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZUxvY2tTY3JlZW5Sb3RhdGlvbiI+dHJ1ZTwvYm9vbD4KKworICAgIDwhLS0gRW5hYmxlcyAzZCB0YXNrIHN3aXRjaGVyIG9uIHhsYXJnZSBkZXZpY2UgLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVJlY2VudEFwcHMzRCI+dHJ1ZTwvYm9vbD4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNWNiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9kaW1lbnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij40OGRpcDwvZGltZW4+CisgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9zaXplIj40OGRpcDwvZGltZW4+CisgICAgPCEtLSBNYXJnaW4gYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBpZ25vcmUgdG91Y2ggZXZlbnRzIGZvciBpbiB0aGUgd2luZG93c2hhZGUuIC0tPgorICAgIDwhLS0gTWFyZ2luIGZvciBwZXJtYW5lbnQgc2NyZWVuIGRlY29yYXRpb25zIGF0IHRoZSBib3R0b20uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzY3JlZW5fbWFyZ2luX2JvdHRvbSI+NDhkaXA8L2RpbWVuPgorICAgIAorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBhbHBoYSAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSI+MC4zNWluPC9kaW1lbj4KKyAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCBmb3IgbnVtZXJpYyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9udW1lcmljIj4wLjQ3aW48L2RpbWVuPgorCisgICAgPCEtLSBUaGUgd2lkdGggdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGh1bWJuYWlscyBvZiBhcHBsaWNhdGlvbnMuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJ0aHVtYm5haWxfd2lkdGgiPjI1NmRwPC9kaW1lbj4KKyAgICA8IS0tIFRoZSBoZWlnaHQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgdGh1bWJuYWlscyBvZiBhcHBsaWNhdGlvbnMuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJ0aHVtYm5haWxfaGVpZ2h0Ij4yNTVkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyMGJlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9zdHJpbmdzLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKworICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gIFdlYlZpZXcgVXNlciBBZ2VudCB0YXJnZXRlZCBjb250ZW50IC0tPgorICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnRfdGFyZ2V0X2NvbnRlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPjwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjkyNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFN0YXR1cyBCYXIgU3R5bGVzIC0tPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIj4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JY29uIj4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAppbmRleCBiOTYzNjEyLi5iZmY4MmI5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivu+WPluaCqOaJi+acuuS4iuWtmOWCqOeahOaJgOacieiBlOezu+S6uu+8iOWcsOWdgO+8ieaVsOaNruOAguaBtuaEj+W6lOeUqOeoi+W6j+WPr+WAn+atpOWwhuaCqOeahOaVsOaNruWPkemAgee7meWFtuS7luS6uuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+IuWGmeWFpeiBlOezu+aVsOaNriI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSIzOTI0MzgzNTc5MTA4MTgzNjAxIj4i5YWB6K645bqU55So56iL5bqP5L+u5pS55oKo5omL5py65LiK5a2Y5YKo55qE6IGU57O75Lq677yI5Zyw5Z2A77yJ5pWw5o2u44CC5oG25oSP5bqU55So56iL5bqP5Y+v5YCf5q2k5riF6Zmk5oiW5L+u5pS55oKo55qE6IGU57O75Lq65pWw5o2u44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiLlhpnlhaXmiYDmnInogIXmlbDmja4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiLlhYHorrjlupTnlKjnqIvluo/kv67mlLnmgqjmiYvmnLrkuIrlrZjlgqjnmoTmiYvmnLrmiYDmnInogIXmlbDmja7jgILmgbbmhI/lupTnlKjnqIvluo/lj6/lgJ/mraTmuIXpmaTmiJbkv67mlLnmiYDmnInogIXmlbDmja7jgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4i6K+75Y+W5omA5pyJ6ICF5pWw5o2uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiLlhYHorrjlupTnlKjnqIvluo/or7vlj5bmgqjmiYvmnLrkuIrlrZjlgqjnmoTmiYvmnLrmiYDmnInogIXmlbDmja7jgILmgbbmhI/lupTnlKjnqIvluo/lj6/lgJ/mraTor7vlj5bmiYvmnLrmiYDmnInogIXmlbDmja7jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiLor7vlj5bml6XljobmtLvliqgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4i5YWB6K645bqU55So56iL5bqP6K+75Y+W5oKo5omL5py65LiK5a2Y5YKo55qE5omA5pyJ5pel5Y6G5rS75Yqo44CC5oG25oSP5bqU55So56iL5bqP5Y+v5YCf5q2k5bCG5oKo55qE5pel5Y6G5rS75Yqo5Y+R6YCB57uZ5YW25LuW5Lq644CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+Iua3u+WKoOaIluS/ruaUueaXpeWOhua0u+WKqOS7peWPiuWQkemCgOivt+WvueixoeWPkemAgeeUteWtkOmCruS7tiI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+IuaOp+WItuS9leaXtumUgeWumuiuvuWkh++8jOi/memcgOimgeaCqOmHjeaWsOi+k+WFpeWvhueggeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInmlbDmja4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IuaBouWkjeWHuuWOguiuvue9ru+8jOi/meS8muWcqOS4jeaPkOekuuehruiupOeahOaDheWGteS4i+WIoOmZpOaCqOeahOaJgOacieaVsOaNruOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuS9j+WuhSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuaJi+acuiI8L2l0ZW0+CkBAIC01MjUsMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6rlrprkuYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCa6L+HIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiLml7bpl7TvvJo8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7vvIzmlrnlvI/vvJo8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui+k+WFpSBQSU4g56CBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovpPlhaXlr4bnoIHov5vooYzop6PplIEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui+k+WFpSBQSU4g6L+b6KGM6Kej6ZSBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeggeS4jeato+ehru+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLopoHop6PplIHvvIzor7flhYjmjIkgTUVOVSDlho3mjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLmgKXmlZHmiJbmiqXorabnlLXor50iPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6K+dIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56Gu77yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOivt+mHjeivlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6K+36YeN6K+VIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF55S1ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlt7LlhYXmu6HjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeiiq+mUgeWumiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Iuato+WcqOino+mUgSBTSU0g5Y2hLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i5oKo5bey57uPIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoee7mOmUmeS6huiHquW3seeahOino+mUgeWbvuahiOOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjQ5MDYwMzQzNzY0MjUxNzUzODEiPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6ZSZ6K+v5Zyw6L6T5YWl5LqG5a+G56CB44CCIlxuXG4i6K+35ZyoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOenkuWQjumHjeivleOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bpbl9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjY4Mjc3NDkyMzE0NjUxNDU1OTAiPiLmgqjlt7Lnu48gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh6ZSZ6K+v5Zyw6L6T5YWl5LqGIFBJTuOAgiJcblxuIuivt+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBtc2dpZD0iMzM1MTAxMzg0MjMyMDEyNzgyNyI+IuaCqOW3sue7jyA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiDmrKHnu5jplJnkuoboh6rlt7HnmoTop6PplIHlm77moYjjgILlpoLmnpzlho3lsJ3or5UgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g5qyh5ZCO5LuN5LiN5oiQ5Yqf77yM57O757uf5Lya6KaB5rGC5oKo5L2/55So6Ieq5bex55qEIEdvb2dsZSDnmbvlvZXkv6Hmga/op6PplIHmiYvmnLrjgIIiXG5cbiLor7flnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4g56eS5ZCO6YeN6K+V44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiDnp5LlkI7ph43or5XjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IiBtc2dpZD0iMjYyNjk5OTQ0OTYxMDY5NTkzMCI+IuW/mOiusOS6huWbvuahiO+8nyI8L3N0cmluZz4KQEAgLTY5OSwxNCArNzA5LDE3IEBACiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X21tX3NzIiBtc2dpZD0iNDQzMTU1NTk0MzgyODcxMTQ3MyI+Ijx4bGlmZjpnIGlkPSJNSU5VVEVTIj4lMSQwMmQ8L3hsaWZmOmc+Ojx4bGlmZjpnIGlkPSJTRUNPTkRTIj4lMiQwMmQ8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxhcHNlZF90aW1lX3Nob3J0X2Zvcm1hdF9oX21tX3NzIiBtc2dpZD0iMTg0NjA3MTk5NzYxNjY1NDEyNCI+Ijx4bGlmZjpnIGlkPSJIT1VSUyI+JTEkZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUyJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUzJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RBbGwiIG1zZ2lkPSI2ODc2NTE4OTI1ODQ0MTI5MzMxIj4i5YWo6YCJIjwvc3RyaW5nPgotICAgIDwhLS0gb3V0ZGF0ZWQgdHJhbnNsYXRpb24gMzg4OTE0OTEyMzYyNjg4ODYzNyAtLT4gICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCIgbXNnaWQ9IjQ4NjIzNTkzMTEwODg4OTg4NzgiPiLpgInmi6nmloflrZciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjdXQiIG1zZ2lkPSIzMDkyNTY5NDA4NDM4NjI2MjYxIj4i5Ymq5YiHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29weSIgbXNnaWQ9IjI2ODE5NDYyMjk1MzM1MTE5ODciPiLlpI3liLYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXN0ZSIgbXNnaWQ9IjU2Mjk4ODA4MzY4MDUwMzY0MzMiPiLnspjotLQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5VXJsIiBtc2dpZD0iMjUzODIxMTU3OTU5NjA2NzQwMiI+IuWkjeWItue9keWdgCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzZWxlY3RUZXh0TW9kZSAoNjczODU1NjM0ODg2MTM0NzI0MCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciB0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUgKDUyMzY4NTAzOTQzNzA4MjAzNTcpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJpbnB1dE1ldGhvZCIgbXNnaWQ9IjE2NTM2MzAwNjIzMDQ1Njc4NzkiPiLovpPlhaXms5UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhZGRUb0RpY3Rpb25hcnkiIG1zZ2lkPSI4NzkzNjI0OTkxNjg2OTQ4NzA5Ij4i5bCG4oCcPHhsaWZmOmcgaWQ9IldPUkQiPiVzPC94bGlmZjpnPuKAnea3u+WKoOWIsOivjeWFuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVkaXRUZXh0TWVudVRpdGxlIiBtc2dpZD0iMTY3Mjk4OTE3Njk1ODU4MTQ1MiI+Iue8lui+keaWh+WtlyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBlZGl0VGV4dE1lbnVUaXRsZSAoNDkwOTEzNTU2NDk0MTgxNTQ5NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9Imxvd19pbnRlcm5hbF9zdG9yYWdlX3ZpZXdfdGl0bGUiIG1zZ2lkPSIxMzk5NzMyNDA4NzAxNjk3NTQ2Ij4i5a2Y5YKo56m66Ze05LiN6LazIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190ZXh0IiBtc2dpZD0iNjM1MTA2NTQ0NjE2Mzc4ODM2Ij4i5omL5py65YaF5a2Y56m66Ze05omA5Ymp5LiN5aSa5LqG44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib2siIG1zZ2lkPSI1OTcwMDYwNDMwNTYyNTI0OTEwIj4i56Gu5a6aIjwvc3RyaW5nPgpAQCAtNzE0LDYgKzcyNyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJ5ZXMiIG1zZ2lkPSI1MzYyOTgyMzAzMzM3OTY5MzEyIj4i56Gu5a6aIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibm8iIG1zZ2lkPSI1MTQxNTMxMDQ0OTM1NTQxNDk3Ij4i5Y+W5raIIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX2FsZXJ0X3RpdGxlIiBtc2dpZD0iMjA0OTY1ODcwODYwOTA0MzEwMyI+IuazqOaEjyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvYWRpbmciIG1zZ2lkPSIxNzYwNzI0OTk4OTI4MjU1MjUwIj4i5q2j5Zyo6L295YWlLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vbiIgbXNnaWQ9IjE1NDQ2ODI3NTU1MTQ0OTQyOTgiPiLmiZPlvIAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiLlhbPpl60iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aGljaEFwcGxpY2F0aW9uIiBtc2dpZD0iNDUzMzE4NTk0NzA2NDc3MzM4NiI+IuS9v+eUqOS7peS4i+aWueW8j+WPkemAgSI8L3N0cmluZz4KQEAgLTczMiwxMiArNzQ2LDYgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZvcmNlX2Nsb3NlIiBtc2dpZD0iMzY1MzQxNjMxNTQ1MDgwNjM5NiI+IuW8uuihjOWFs+mXrSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlcG9ydCIgbXNnaWQ9IjQwNjAyMTgyNjA5ODQ3OTU3MDYiPiLmiqXlkYoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3YWl0IiBtc2dpZD0iNzE0NzExODIxNzIyNjMxNzczMiI+IuetieW+hSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ190aXRsZSAoODMyMzc2MTYxNjA1MjEyMTkzNikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19yZXBsYWNlICg2MjAyNDk4OTQ5OTcwMjgxNDEyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgotICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLlupTnlKjnqIvluo88eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+77yIPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IOi/m+eoi++8iei/neWPjeS6huiHquaIkeW8uuWItuaJp+ihjOeahOS4peagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i6L+b56iLIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDov53lj43kuoboh6rmiJHlvLrliLbmiafooYznmoTkuKXmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7mraPlnKjov5DooYwiPC9zdHJpbmc+CkBAIC04NTQsMTMgKzg2MiwxNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19wc2tfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzk0NTA0MzU2NDAwODMwMzIzOSI+IuWfuuS6jumihOWFseS6q+WvhumSpeeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImwydHBfaXBzZWNfY3J0X3Zwbl9kZXNjcmlwdGlvbiIgbXNnaWQ9IjUzODI3MTQwNzMxMDM2NTM1NzciPiLln7rkuo7or4HkuabnmoQgTDJUUC9JUFNlYyBWUE4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiLpgInmi6nmlofku7YiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiLmnKrpgInlrprku7vkvZXmlofku7YiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiLph43nva4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiIG1zZ2lkPSIxNjAyMzM1NTcyMDg5OTExOTQxIj4i5o+Q5LqkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciIgbXNnaWQ9IjI2NTQzMTk4NzQ5MDg1NzYxMzMiPiLmlLbol48iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjMxNjQ3NjgyMTIwMDM4NjQzMTYiPiLlt7LlkK/nlKjovabovb3mqKHlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXJfbW9kZV9kaXNhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iNjY4NjYzNjI2NzIxNjc1NjE0Ij4i6YCJ5oup6YCA5Ye66L2m6L295qih5byPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE0NjY5NDIzNDM5ODIwMjYwMSI+IlVTQiDnu5HlrprmiJbng63ngrnlt7LlkK/nlKgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjMwNjcxMDgzMjM5MDMwNDg5MjciPiLop6bmkbjlj6/ov5vooYzphY3nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJiYWNrX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjIzMDA0NzAwMDQ1MDMzNDM0MzkiPiLkuIrkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEwODA1NTUxMDQ2Nzc5OTI0MDgiPiLkuIvkuIDmraUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCIgbXNnaWQ9IjEyNzUzNjIyOTk0NzE2MzE4MTkiPiLot7Pov4ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjQ4OTA4OTQyNjc0NTQ4NjcyNzYiPiLmiYvmnLrmtYHph4/ov4flpJoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZV93YXJuaW5nX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBtc2dpZD0iMjYwOTczNDc2Mzg0NTcwNTcwOCI+Iui9u+inpuS7peS6huino+acieWFs+aJi+acuua1gemHj+ivpuaDhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI2MjY5NTQxODk3NzI5NzgxMzMyIj4i5bey6LaF5Ye65omL5py65pWw5o2u5LiK6ZmQIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCA5Mzk1MTBjLi4zMDBjZjIwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtMjg4LDYgKzI4OCwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZENvbnRhY3RzIiBtc2dpZD0iMzM3MTU5MTUxMjg5NjU0NTk3NSI+IuWFgeioseaHieeUqOeoi+W8j+iugOWPluaJi+apn+S4iuaJgOacieiBr+e1oeS6uiAo5Zyw5Z2AKeOAguiri+azqOaEj++8muaDoeaEj+eoi+W8j+WPr+iDveWIqeeUqOatpOWKn+iDveWwh+aCqOeahOizh+aWmeWCs+mAgee1puWFtuS7luS6uuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVDb250YWN0cyIgbXNnaWQ9IjY0NDYxNjIxNTg2MDkzMzI4NCI+Iui8uOWFpeiBr+e1oeS6uuizh+aWmSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ29udGFjdHMiIG1zZ2lkPSIzOTI0MzgzNTc5MTA4MTgzNjAxIj4i5YWB6Kix5oeJ55So56iL5byP5pu05pS56IGv57Wh6LOH6KiKICjlnLDlnYAp44CC6KuL5rOo5oSP77ya5oOh5oSP56iL5byP5Y+v6IO95Yip55So5q2k5Yqf6IO977yM5riF6Zmk5oiW5L+u5pS56IGv57Wh6LOH5paZ44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjQ4OTI1NTU5MTM4NDkyOTUzOTMiPiLlr6vlhaXmjIHmnInogIXnmoTos4fmlpkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZU93bmVyRGF0YSIgbXNnaWQ9IjIzNDQwNTUzMTc5Njk3ODcxMjQiPiLlhYHoqLHmh4nnlKjnqIvlvI/mm7TmlLnmiYvmqZ/mjIHmnInogIXnmoTos4fmlpnjgILoq4vms6jmhI/vvJrmg6HmhI/nqIvlvI/lj6/og73liKnnlKjmraTlip/og73vvIzmuIXpmaTmiJbkv67mlLnmjIHmnInogIXnmoTos4fmlpnjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRPd25lckRhdGEiIG1zZ2lkPSI2NjY4NTI1OTg0NzMxNTIzNTYzIj4i6K6A5Y+W5oyB5pyJ6ICF55qE6LOH5paZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE93bmVyRGF0YSIgbXNnaWQ9IjMwODg0ODYzODMxMjg0MzQ1MDciPiLlhYHoqLHmh4nnlKjnqIvlvI/oroDlj5bmiYvmqZ/mjIHmnInogIXos4fmlpnjgILoq4vms6jmhI/vvJrmg6HmhI/nqIvlvI/lj6/og73liKnnlKjmraTlip/og73oroDlj5bmjIHmnInogIXnmoTos4fmlpnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjY4OTg5ODc3OTgzMDM4NDA1MzQiPiLoroDlj5bml6Xmm4bmtLvli5UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIG1zZ2lkPSI1NTMzMDI5MTM5NjUyMDk1NzM0Ij4i5YWB6Kix5oeJ55So56iL5byP6K6A5Y+W5omL5qmf5LiK5omA5pyJ5pel5puG6LOH5paZ44CC6KuL5rOo5oSP77ya5oOh5oSP56iL5byP5Y+v6IO95Yip55So5q2k5Yqf6IO95bCH5oKo55qE5pel5puG6LOH5paZ5YKz6YCB57Wm5YW25LuW5Lq644CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIiBtc2dpZD0iMzg5NDg3OTM1MjU5NDkwNDM2MSI+IuaWsOWinuaIluS/ruaUueaXpeabhua0u+WLle+8jOS4puWCs+mAgembu+WtkOmDteS7tue1puS7luS6uiI8L3N0cmluZz4KQEAgLTQzMiw2ICs0MzYsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZm9yY2VMb2NrIiBtc2dpZD0iMjgxOTg2ODY2NDk0NjA4OTc0MCI+Iuijnee9rumOluWumuaZguWPr+WPluW+l+aOp+WItu+8jOS9huW/hemgiOmHjeaWsOi8uOWFpeWvhueivOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl93aXBlRGF0YSIgbXNnaWQ9IjM5MTA1NDU0NDY3NTg2Mzk3MTMiPiLmuIXpmaTmiYDmnInos4fmlpkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIiBtc2dpZD0iMjMxNDA2MDkzMzc5NjM5NjIwNSI+IumHjeioreeCuuWOn+W7oOioreWumiAo57O757Wx5pyD5Yiq6Zmk5omA5pyJ6LOH5paZ77yM5LiU5LiN5pyD5ZCR5oKo6YCy6KGM56K66KqNKeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkgKDI3ODQ4MjgyOTM3NDc3OTE0NDYpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcG9saWN5ZGVzY19zZXRHbG9iYWxQcm94eSAoNjM4NzQ5NzQ2NjY2MDE1NDkzMSkgLS0+CisgICAgPHNraXAgLz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IuS9j+Wutumbu+ipsSI8L2l0ZW0+CiAgICAgPGl0ZW0gbXNnaWQ9Ijg2OTkyMzY1MDUyNzEzNjYxNSI+IuihjOWLlembu+ipsSI8L2l0ZW0+CkBAIC01MjUsMTAgKzUzMyw5IEBACiAgICAgPHN0cmluZyBuYW1lPSJvcmdUeXBlV29yayIgbXNnaWQ9IjI5MjY4ODcwNTA1MzYzODcyIj4i5YWs5Y+4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ib3JnVHlwZU90aGVyIiBtc2dpZD0iMzk1MTc4MTEzMTU3MDEyNDA4MiI+IuWFtuS7liI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iIG1zZ2lkPSIyMjU1MjM0MTUzNzIwODgzMjIiPiLoh6roqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iIG1zZ2lkPSI1MTEyNTg5ODg2MDk0NDAyNzk1Ij4i6YCP6YGOIDx4bGlmZjpnIGlkPSJTT1VSQ0UiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY29udGFjdF9zdGF0dXNfdXBkYXRlX2F0dHJpYnV0aW9uX3dpdGhfZGF0ZSIgbXNnaWQ9IjU5NDUzODYzNzYzNjk5Nzk5MDkiPiI8eGxpZmY6ZyBpZD0iREFURSI+JTEkczwveGxpZmY6Zz7pgI/pgY7jgIw8eGxpZmY6ZyBpZD0iU09VUkNFIj4lMiRzPC94bGlmZjpnPuOAjSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9jb2RlIiBtc2dpZD0iMzczMTQ4ODgyNzIxODg3NjExNSI+Iui8uOWFpSBQSU4g56K8Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjkxMzgxNTgzNDQ4MTMyMTM3NTQiPiLovLjlhaXlr4bnorzljbPlj6/op6PpjpYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSIgbXNnaWQ9IjYzODM0NzA3NTYyNTQ5MTUxNCI+Iui8uOWFpSBQSU4g6YCy6KGM6Kej6Y6WIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfd3JvbmdfcGluX2NvZGUiIG1zZ2lkPSIxMjk1OTg0MTE0MzM4MTA3NzE4Ij4iUElOIOeivOmMr+iqpO+8gSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX2xhYmVsX3RleHQiIG1zZ2lkPSI4NjE3OTY0NjEwMjgyOTg0MjQiPiLlpoLopoHop6PpjpbvvIzoq4vmjIkgTWVudSDpjbXvvIznhLblvozmjIkgMOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsX2RpYWxvZ19udW1iZXJfZm9yX2Rpc3BsYXkiIG1zZ2lkPSI2OTYxOTIxMDMxOTUwOTA5NzAiPiLnt4rmgKXpm7voqbHomZ/norwiPC9zdHJpbmc+CkBAIC01NDEsNiArNTQ4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcmV0dXJuX3RvX2NhbGwiIG1zZ2lkPSI1MjQ0MjU5Nzg1NTAwMDQwMDIxIj4i6L+U5Zue6YCa6KmxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiIG1zZ2lkPSI5MDM5MDA4NjUwMzYyMjYxMjM3Ij4i5q2j56K677yBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nIiBtc2dpZD0iNDgxNzU4MzI3OTA1MzExMjMxMiI+IuW+iOaKseatie+8jOiri+WGjeippuS4gOasoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGFzc3dvcmRfd3JvbmciIG1zZ2lkPSI2MjM3NDQzNjU3MzU4MTY4ODE5Ij4i5b6I5oqx5q2J77yM6KuL5YaN6Kmm5LiA5qyhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iNjEzMzQzODUyODQyOTQ0NDM1Ij4i5q2j5Zyo5YWF6Zu7ICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlhYXpm7vlrozmiJDjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSIzNjE3NTQ5MTc4NjAzMzU0NjU2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTU1NSw2ICs1NjMsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UiIG1zZ2lkPSI4MDY2NjYwMTI5MjA2MDAxMDM5Ij4iU0lNIOWNoeW3sumOluWumuOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fc2ltX3VubG9ja19wcm9ncmVzc19kaWFsb2dfbWVzc2FnZSIgbXNnaWQ9IjU5NTMyMzIxNDA1Mjg4MTI2NCI+Iuino+mOliBTSU0g5Y2h5LitLi4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSIzNTE0NzQyMTA2MDY2ODc3NDc2Ij4i55Wr5Ye66Kej6Y6W5ZyW5b2i5bey6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoeOAgiJcblxuIiDoq4vlnKggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN5ZiX6Kmm44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGFzc3dvcmRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI0OTA2MDM0Mzc2NDI1MTc1MzgxIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahOWvhueivOOAgiJcblxuIuiri+aWvCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2ODI3NzQ5MjMxNDY1MTQ1NTkwIj4i5oKo5beyIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IOasoei8uOWFpeS4jeato+eiuueahCBQSU7jgIIiXG5cbiLoq4vmlrwgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4g56eS5b6M5YaN6Kmm5LiA5qyh44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2dsb2dpbiIgbXNnaWQ9IjMzNTEwMTM4NDIzMjAxMjc4MjciPiLnlavlh7rop6PpjpblnJblvaLlt7LpjK/oqqQgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4g5qyh44CC5YaN6Yyv6KqkIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IOasoeW+jO+8jOezu+e1seacg+imgeaxguS9v+eUqCBHb29nbGUg55m75YWl5L6G6Kej6Y6W44CCIlxuXG4iIOiri+WcqCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiDnp5Llvozlho3oqabkuIDmrKHjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19jb3VudGRvd24iIG1zZ2lkPSI2MjUxNDgwMzQzMzk0Mzg5NjY1Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IOenkuW+jOWGjeippuS4gOasoeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiIG1zZ2lkPSIyNjI2OTk5NDQ5NjEwNjk1OTMwIj4i5b+Y6KiY6Kej6Y6W5ZyW5b2i77yfIjwvc3RyaW5nPgpAQCAtNjk5LDE0ICs3MDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImVsYXBzZWRfdGltZV9zaG9ydF9mb3JtYXRfbW1fc3MiIG1zZ2lkPSI0NDMxNTU1OTQzODI4NzExNDczIj4iPHhsaWZmOmcgaWQ9Ik1JTlVURVMiPiUxJDAyZDwveGxpZmY6Zz46PHhsaWZmOmcgaWQ9IlNFQ09ORFMiPiUyJDAyZDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGFwc2VkX3RpbWVfc2hvcnRfZm9ybWF0X2hfbW1fc3MiIG1zZ2lkPSIxODQ2MDcxOTk3NjE2NjU0MTI0Ij4iPHhsaWZmOmcgaWQ9IkhPVVJTIj4lMSRkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iTUlOVVRFUyI+JTIkMDJkPC94bGlmZjpnPjo8eGxpZmY6ZyBpZD0iU0VDT05EUyI+JTMkMDJkPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCIgbXNnaWQ9IjY4NzY1MTg5MjU4NDQxMjkzMzEiPiLlhajpg6jpgbjlj5YiPC9zdHJpbmc+Ci0gICAgPCEtLSBvdXRkYXRlZCB0cmFuc2xhdGlvbiAzODg5MTQ5MTIzNjI2ODg4NjM3IC0tPiAgICAgPHN0cmluZyBuYW1lPSJzZWxlY3RUZXh0IiBtc2dpZD0iNDg2MjM1OTMxMTA4ODg5ODg3OCI+IumBuOWPluaWh+WtlyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCIgbXNnaWQ9IjMwOTI1Njk0MDg0Mzg2MjYyNjEiPiLliarkuIsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb3B5IiBtc2dpZD0iMjY4MTk0NjIyOTUzMzUxMTk4NyI+Iuikh+ijvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3RlIiBtc2dpZD0iNTYyOTg4MDgzNjgwNTAzNjQzMyI+IuiyvOS4iiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvcHlVcmwiIG1zZ2lkPSIyNTM4MjExNTc5NTk2MDY3NDAyIj4i6KSH6KO957ay5Z2AIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNlbGVjdFRleHRNb2RlICg2NzM4NTU2MzQ4ODYxMzQ3MjQwKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHRleHRTZWxlY3Rpb25DQUJUaXRsZSAoNTIzNjg1MDM5NDM3MDgyMDM1NykgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIiBtc2dpZD0iMTY1MzYzMDA2MjMwNDU2Nzg3OSI+Iui8uOWFpeaWueW8jyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSIgbXNnaWQ9Ijg3OTM2MjQ5OTE2ODY5NDg3MDkiPiLlsIfjgIw8eGxpZmY6ZyBpZD0iV09SRCI+JXM8L3hsaWZmOmc+44CN5paw5aKe6Iez5a2X5YW4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiIG1zZ2lkPSIxNjcyOTg5MTc2OTU4NTgxNDUyIj4i57eo6Lyv5paH5a2XIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGVkaXRUZXh0TWVudVRpdGxlICg0OTA5MTM1NTY0OTQxODE1NDk0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ibG93X2ludGVybmFsX3N0b3JhZ2Vfdmlld190aXRsZSIgbXNnaWQ9IjEzOTk3MzI0MDg3MDE2OTc1NDYiPiLlhLLlrZjnqbrplpPljbPlsIfkuI3otrMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RleHQiIG1zZ2lkPSI2MzUxMDY1NDQ2MTYzNzg4MzYiPiLmiYvmqZ/lhLLlrZjnqbrplpPljbPlsIfkuI3otrPjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvayIgbXNnaWQ9IjU5NzAwNjA0MzA1NjI1MjQ5MTAiPiLnorrlrpoiPC9zdHJpbmc+CkBAIC03MTQsNiArNzI3LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InllcyIgbXNnaWQ9IjUzNjI5ODIzMDMzMzc5NjkzMTIiPiLnorrlrpoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJubyIgbXNnaWQ9IjUxNDE1MzEwNDQ5MzU1NDE0OTciPiLlj5bmtogiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiIG1zZ2lkPSIyMDQ5NjU4NzA4NjA5MDQzMTAzIj4i5rOo5oSPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyIgbXNnaWQ9IjE3NjA3MjQ5OTg5MjgyNTUyNTAiPiLovInlhaXkuK0uLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IumWi+WVnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcGl0YWxfb2ZmIiBtc2dpZD0iNjgxNTg3MDM4Njk3MjgwNTgzMiI+IumXnOmWiSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4i5a6M5oiQ5pON5L2c6ZyA5L2/55SoIjwvc3RyaW5nPgpAQCAtNzMyLDEyICs3NDYsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0iZm9yY2VfY2xvc2UiIG1zZ2lkPSIzNjUzNDE2MzE1NDUwODA2Mzk2Ij4i5by35Yi26Zec6ZaJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icmVwb3J0IiBtc2dpZD0iNDA2MDIxODI2MDk4NDc5NTcwNiI+IuWbnuWgsSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndhaXQiIG1zZ2lkPSI3MTQ3MTE4MjE3MjI2MzE3NzMyIj4i562J5b6FIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3RpdGxlICg4MzIzNzYxNjE2MDUyMTIxOTM2KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX3JlcGxhY2UgKDYyMDI0OTg5NDk5NzAyODE0MTIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+Ci0gICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuaHieeUqOeoi+W8jyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjomZXnkIbnqIvluo8gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDlt7LpgZXlj43lhbboh6rooYzlvLfliLblr6bmlr3nmoTlmrTmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IuiZleeQhueoi+W6jyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g5bey6YGV5Y+N5YW26Ieq6KGM5by35Yi25a+m5pa955qE5Zq05qC85qih5byPIChTdHJpY3RNb2RlKSDmlL/nrZbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOWft+ihjOS4rSI8L3N0cmluZz4KQEAgLTg1NCwxMyArODYyLDE2IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iIG1zZ2lkPSIzOTQ1MDQzNTY0MDA4MzAzMjM5Ij4i5o6h55So6aCQ5YWI5YWx55So6YeR6ZGw55qEIEwyVFAvSVBTZWMgVlBOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibDJ0cF9pcHNlY19jcnRfdnBuX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNTM4MjcxNDA3MzEwMzY1MzU3NyI+IuaOoeeUqOaGkeitieeahCBMMlRQL0lQU2VjIFZQTiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IumBuOaTh+aqlOahiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im5vX2ZpbGVfY2hvc2VuIiBtc2dpZD0iNjM2MzY0ODU2MjE3MDc1OTQ2NSI+IuacqumBuOaTh+S7u+S9leaqlOahiCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJlc2V0IiBtc2dpZD0iMjQ0ODE2ODA4MDk2NDIwOTkwOCI+IumHjeiorSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiLmj5DkuqQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZXNjcmlwdGlvbl9zdGFyIiBtc2dpZD0iMjY1NDMxOTg3NDkwODU3NjEzMyI+IuaIkeeahOacgOaEmyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+IuW3suWVn+eUqOi7iueUqOaooeW8jyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI2Njg2NjM2MjY3MjE2NzU2MTQiPiLpgbjlj5bntZDmnZ/ou4rnlKjmqKHlvI/jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXRoZXJlZF9ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSIzMTQ2Njk0MjM0Mzk4MjAyNjAxIj4i5pW45pOa6YCj57ea5oiW54Sh57ea5Z+65Zyw5Y+w5bey5ZWf55SoIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIzMDY3MTA4MzIzOTAzMDQ4OTI3Ij4i6LyV6Ke45Lul6Kit5a6aIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmFja19idXR0b25fbGFiZWwiIG1zZ2lkPSIyMzAwNDcwMDA0NTAzMzQzNDM5Ij4i6L+U5ZueIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV4dF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMDgwNTU1MTA0Njc3OTkyNDA4Ij4i57m857qMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2tpcF9idXR0b25fbGFiZWwiIG1zZ2lkPSIxMjc1MzYyMjk5NDcxNjMxODE5Ij4i55Wl6YGOIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fdGl0bGUiIG1zZ2lkPSI0ODkwODk0MjY3NDU0ODY3Mjc2Ij4i6auY6KGM5YuV6LOH5paZ55So6YePIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGhyb3R0bGVfd2FybmluZ19ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjI2MDk3MzQ3NjM4NDU3MDU3MDgiPiLovJXop7jljbPlj6/nnq3op6Pmm7TlpJrmnInpl5zooYzli5Xos4fmlpnnlKjph4/nmoToqbPntLDos4foqIoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjI2OTU0MTg5NzcyOTc4MTMzMiI+IuW3sumBlOihjOWLleizh+aWmeS4iumZkCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAppbmRleCBhZWVlOGFmLi5iNjE4NzU2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCkBAIC0xMTcsNCArMTE3LDE2IEBACiAgICAgICAgIDxpdGVtPjM8L2l0ZW0+CiAgICAgPC9pbnRlZ2VyLWFycmF5PgogCisgICAgPCEtLSBVc2VkIGluIExvY2FsZVBpY2tlciAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9InNwZWNpYWxfbG9jYWxlX2NvZGVzIj4KKyAgICAgICAgPGl0ZW0+emhfQ048L2l0ZW0+CisgICAgICAgIDxpdGVtPnpoX1RXPC9pdGVtPgorICAgIDwvc3RyaW5nLWFycmF5PgorCisgICAgPCEtLSBVc2VkIGluIExvY2FsZVBpY2tlciAtLT4KKyAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9InNwZWNpYWxfbG9jYWxlX25hbWVzIj4KKyAgICAgICAgPGl0ZW0+5Lit5paHICjnroDkvZMpPC9pdGVtPgorICAgICAgICA8aXRlbT7kuK3mlocgKOe5gemrlCk8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCAxM2MzZTdlLi45MzYzZGI1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMTQsOCArMTQsOCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZyAKLSAgICAgdGhlIGRvY3VtZW50YXRpb24gb3V0cHV0LiBUbyBzdXBwcmVzcyBjb21tZW50IGxpbmVzIGZyb20gdGhlIGRvY3VtZW50YXRpb24gCis8IS0tIEZvcm1hdHRpbmcgbm90ZTogdGVybWluYXRlIGFsbCBjb21tZW50cyB3aXRoIGEgcGVyaW9kLCB0byBhdm9pZCBicmVha2luZworICAgICB0aGUgZG9jdW1lbnRhdGlvbiBvdXRwdXQuIFRvIHN1cHByZXNzIGNvbW1lbnQgbGluZXMgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbgogICAgICBvdXRwdXQsIGluc2VydCBhbiBlYXQtY29tbWVudCBlbGVtZW50IGFmdGVyIHRoZSBjb21tZW50IGxpbmVzLgogLS0+CiAKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICAgICAgICAgICB0aGVtZSBkb2VzIG5vdCBzZXQgdGhpcyB2YWx1ZSwgbWVhbmluZyBpdCBpcyBiYXNlZCBvbiB3aGV0aGVyIHRoZQogICAgICAgICAgICAgIHdpbmRvdyBpcyBmbG9hdGluZy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImJhY2tncm91bmREaW1FbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIAogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gVGV4dCBzdHlsZXMgLS0+CkBAIC05NSw2ICs5NiwxMiBAQAogCiAgICAgICAgIDwhLS0gVGV4dCBjb2xvciBmb3IgdXJscyBpbiBzZWFyY2ggc3VnZ2VzdGlvbnMsIHVzZWQgYnkgdGhpbmdzIGxpa2UgZ2xvYmFsIHNlYXJjaCBhbmQgdGhlIGJyb3dzZXIuIEBoaWRlIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JTZWFyY2hVcmwiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgorCisgICAgICAgIDwhLS0gQ29sb3Igb2YgaGlnaGxpZ2h0ZWQgdGV4dCwgd2hlbiB1c2VkIGluIGEgbGlnaHQgdGhlbWUuIEBoaWRlIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKyAgICAgICAgPCEtLSBDb2xvciBvZiBsaW5rIHRleHQgKFVSTHMpLCB3aGVuIHVzZWQgaW4gYSBsaWdodCB0aGVtZS4gQGhpZGUgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKyAgICAgICAgCiAgICAgICAgIDwhLS0gU2VhcmNoIHdpZGdldCBtb3JlIGNvcnB1cyByZXN1bHQgaXRlbSBiYWNrZ3JvdW5kLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogCkBAIC0xMTcsMTAgKzEyNCwxNCBAQAogICAgICAgICA8IS0tIFRleHQgY29sb3IsIHR5cGVmYWNlLCBzaXplLCBhbmQgc3R5bGUgZm9yIHN5c3RlbSBzZWFyY2ggcmVzdWx0IHN1YnRpdGxlLiBEZWZhdWx0cyB0byBwcmltYXJ5IGludmVyc2UgdGV4dCBjb2xvci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InRleHRBcHBlYXJhbmNlU2VhcmNoUmVzdWx0U3VidGl0bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCi0KICAgICAgICAgPCEtLSBUZXh0IGNvbG9yLCB0eXBlZmFjZSwgc2l6ZSwgYW5kIHN0eWxlIGZvciB0aGUgdGV4dCBpbnNpZGUgb2YgYSBidXR0b24uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUJ1dHRvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBFZGl0VGV4dCB0ZXh0IGZvcmVncm91bmQgY29sb3IuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlZGl0VGV4dENvbG9yIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KKyAgICAgICAgPCEtLSBFZGl0VGV4dCBiYWNrZ3JvdW5kIGRyYXdhYmxlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKwogICAgICAgICA8IS0tIEEgc3R5bGVkIHN0cmluZywgc3BlY2lmeWluZyB0aGUgc3R5bGUgdG8gYmUgdXNlZCBmb3Igc2hvd2luZwogICAgICAgICAgICAgIGlubGluZSBjYW5kaWRhdGUgdGV4dCB3aGVuIGNvbXBvc2luZyB3aXRoIGFuIGlucHV0IG1ldGhvZC4gIFRoZQogICAgICAgICAgICAgIHRleHQgaXRzZWxmIHdpbGwgYmUgaWdub3JlZCwgYnV0IHRoZSBzdHlsZSBzcGFucyB3aWxsIGJlIGFwcGxpZWQKQEAgLTEzNyw2ICsxNDgsOSBAQAogICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3Igc2luZ2xlIGNob2ljZSBpbmRpY2F0b3JzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGlzdENob2ljZUluZGljYXRvclNpbmdsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBEcmF3YWJsZSB1c2VkIGFzIGEgYmFja2dyb3VuZCBmb3Igc2VsZWN0ZWQgbGlzdCBpdGVtcy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RDaG9pY2VCYWNrZ3JvdW5kSW5kaWNhdG9yIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKwogICAgICAgICA8IS0tID09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gQnV0dG9uIHN0eWxlcyAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09IC0tPgpAQCAtMjQ0LDYgKzI1OCwxOSBAQAogICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI1dpbmRvd0FuaW1hdGlvbn0uIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBbmltYXRpb25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKKyAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHdpbmRvdyBzaG91bGQgaGF2ZSBhbiBBY3Rpb24gQmFyCisgICAgICAgICAgICAgaW4gcGxhY2Ugb2YgdGhlIHVzdWFsIHRpdGxlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd0FjdGlvbkJhciIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB3aW5kb3cncyBBY3Rpb24gQmFyIHNob3VsZCBvdmVybGF5CisgICAgICAgICAgICAgYXBwbGljYXRpb24gY29udGVudC4gRG9lcyBub3RoaW5nIGlmIHRoZSB3aW5kb3cgd291bGQgbm90CisgICAgICAgICAgICAgaGF2ZSBhbiBBY3Rpb24gQmFyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIgZm9ybWF0PSJib29sZWFuIiAvPgorCisgICAgICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWN0aW9uIG1vZGVzIHNob3VsZCBvdmVybGF5IHdpbmRvdyBjb250ZW50CisgICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBub3QgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZWlyIFVJIChzdWNoIGFzIGFuIEFjdGlvbiBCYXIpLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uTW9kZU92ZXJsYXkiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKwogICAgICAgICA8IS0tIERlZmluZXMgdGhlIGRlZmF1bHQgc29mdCBpbnB1dCBzdGF0ZSB0aGF0IHRoaXMgd2luZG93IHdvdWxkCiAgICAgICAgICAgICAgbGlrZSB3aGVuIGl0IGlzIGRpc3BsYXllZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiPgpAQCAtMzkwLDYgKzQxNywxMiBAQAogICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsU2Nyb2xsVmlld1N0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFNwaW5uZXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgZHJvcGRvd24gU3Bpbm5lciBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IEFjdGlvbkJhciBkcm9wZG93biBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYWN0aW9uIGJ1dHRvbiBzdHlsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBEZWZhdWx0IFN0YXIgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzdGFyU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERlZmF1bHQgVGFiV2lkZ2V0IHN0eWxlLiAtLT4KQEAgLTQyNiw2ICs0NTksMzcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TGFyZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPCEtLSBBY3Rpb24gYmFyIHN0eWxlcyAgIC0tPgorICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgICAgIDxlYXQtY29tbWVudCAvPgorICAgICAgICA8IS0tIERlZmF1bHQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdXNlIGJldHdlZW4gYWN0aW9uIGJ1dHRvbnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CdXR0b25QYWRkaW5nIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IHN0eWxlIGZvciB0YWJzIHdpdGhpbiBhbiBhY3Rpb24gYmFyIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uT3ZlcmZsb3dCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgc3R5bGUgZm9yIHRoZSBBY3Rpb24gQmFyIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU2l6ZSBvZiB0aGUgQWN0aW9uIEJhciwgaW5jbHVkaW5nIHRoZSBjb250ZXh0dWFsCisgICAgICAgICAgICAgYmFyIHVzZWQgdG8gcHJlc2VudCBBY3Rpb24gTW9kZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25CYXJTaXplIiBmb3JtYXQ9ImRpbWVuc2lvbiIgPgorICAgICAgICAgICAgPGVudW0gbmFtZT0id3JhcF9jb250ZW50IiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgPC9hdHRyPgorCisKKyAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgorICAgICAgICA8IS0tIEFjdGlvbiBtb2RlIHN0eWxlcyAgLS0+CisgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICAgICAgPGVhdC1jb21tZW50IC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBCYWNrZ3JvdW5kIGRyYXdhYmxlIHRvIHVzZSBmb3IgYWN0aW9uIG1vZGUgVUkgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBjbG9zZSBhY3Rpb24gbW9kZSBidXR0b24gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgICAgIDwhLS0gUHJlZmVyZW5jZSBzdHlsZXMgICAtLT4KICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09IC0tPgogICAgICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTk2Myw2ICsxMDI3LDkgQEAKICAgICAgICAgPGF0dHIgbmFtZT0idGV4dENvbG9yIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kRGltRW5hYmxlZCIgLz4KICAgICAgICAgPGF0dHIgbmFtZT0iYmFja2dyb3VuZERpbUFtb3VudCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBhIEFsZXJ0RGlhbG9nJ3MgdGhlbWUuIC0tPgpAQCAtOTc5LDYgKzEwNDYsMTQgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iY2VudGVyTWVkaXVtIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSBGcmFnbWVudCBhbmltYXRpb24gY2xhc3MgYXR0cmlidXRlcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkZyYWdtZW50QW5pbWF0aW9uIj4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRPcGVuRW50ZXJBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRDbG9zZUVudGVyQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJhZ21lbnRDbG9zZUV4aXRBbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFdpbmRvdyBhbmltYXRpb24gY2xhc3MgYXR0cmlidXRlcy4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IldpbmRvd0FuaW1hdGlvbiI+CiAgICAgICAgIDwhLS0gVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gYSB3aW5kb3cgaXMgYmVpbmcgYWRkZWQuIC0tPgpAQCAtOTg5LDcgKzEwNjQsNyBAQAogICAgICAgICA8YXR0ciBuYW1lPSJ3aW5kb3dTaG93QW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBUaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBhIHdpbmRvdyBpcyBnb2luZyBmcm9tIFZJU0lCTEUgdG8gSU5WSVNJQkxFLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93SGlkZUFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSwgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQgaXMKICAgICAgICAgICAgICAgcnVuIG9uIHRoZSBuZXh0IGFjdGl2aXR5ICh3aGljaCBpcyBlbnRlcmluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFjdGl2aXR5T3BlbkVudGVyQW5pbWF0aW9uIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KQEAgLTEwMzAsNyArMTEwNSw3IEBACiAgICAgICAgICAgICAgIGFuaW1hdGlvbiB0aGF0IGlzIHJ1biBvbiB0aGUgdG9wIGFjdGl2aXR5IG9mIHRoZSBjdXJyZW50IHRhc2sKICAgICAgICAgICAgICAgKHdoaWNoIGlzIGV4aXRpbmcgdGhlIHNjcmVlbikuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJ0YXNrVG9CYWNrRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSB0aGF0IHNob3dzIHRoZSB3YWxscGFwZXIsIHdoaWxlCiAgICAgICAgICAgICAgIGN1cnJlbnRseSBub3Qgc2hvd2luZyB0aGUgd2FsbHBhcGVyLCB0aGlzIGlzIHRoZSBhbmltYXRpb24gdGhhdAogICAgICAgICAgICAgICBpcyBydW4gb24gdGhlIG5ldyB3YWxscGFwZXIgYWN0aXZpdHkgKHdoaWNoIGlzIGVudGVyaW5nIHRoZSBzY3JlZW4pLiAtLT4KQEAgLTEwNDcsNyArMTEyMiw3IEBACiAgICAgICAgICAgICAgIGN1cnJlbnRseSBzaG93aW5nIHRoZSB3YWxscGFwZXIsIHRoaXMgaXMgdGhlIGFuaW1hdGlvbiB0aGF0CiAgICAgICAgICAgICAgIGlzIHJ1biBvbiB0aGUgb2xkIHdhbGxwYXBlciBhY3Rpdml0eSAod2hpY2ggaXMgZXhpdGluZyB0aGUgc2NyZWVuKS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndhbGxwYXBlckNsb3NlRXhpdEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gIFdoZW4gb3BlbmluZyBhIG5ldyBhY3Rpdml0eSB0aGF0IGlzIG9uIHRvcCBvZiB0aGUgd2FsbHBhcGVyCiAgICAgICAgICAgICAgIHdoZW4gdGhlIGN1cnJlbnQgYWN0aXZpdHkgaXMgYWxzbyBvbiB0b3Agb2YgdGhlIHdhbGxwYXBlciwKICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgYW5pbWF0aW9uIHRoYXQgaXMgcnVuIG9uIHRoZSBuZXcgYWN0aXZpdHkKQEAgLTEzMzIsMjUgKzE0MDcsMTcgQEAKICAgICAgICAgICAgICA8Y29kZT5wdWJsaWMgdm9pZCBzYXlIZWxsbyhWaWV3IHYpPC9jb2RlPiBtZXRob2Qgb2YgeW91ciBjb250ZXh0CiAgICAgICAgICAgICAgKHR5cGljYWxseSwgeW91ciBBY3Rpdml0eSkuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJvbkNsaWNrIiBmb3JtYXQ9InN0cmluZyIgLz4KLQotICAgICAgICA8IS0tIERlZmluZXMgb3ZlcnNjcm9sbGluZyBiZWhhdmlvci4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgaWYgdGhlCi0gICAgICAgICAgICAgVmlldyBpcyBzY3JvbGxhYmxlLiBPdmVyc2Nyb2xsaW5nIGlzIHRoZSBhYmlsaXR5IGZvciB0aGUgdXNlciB0bwotICAgICAgICAgICAgIHNjcm9sbCBhIFZpZXcgYmV5b25kIGl0cyBjb250ZW50IGJvdW5kYXJpZXMgaW50byBlbXB0eSBzcGFjZS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJzY3JvbGxNb2RlIj4KLSAgICAgICAgICAgIDwhLS0gQWx3YXlzIGFsbG93IHRoZSB1c2VyIHRvIG92ZXJzY3JvbGwgdGhlIGNvbnRlbnQuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iYWx3YXlzIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gT25seSBhbGxvdyB0aGUgdXNlciB0byBvdmVyc2Nyb2xsIGNvbnRlbnQgaWYgdGhlIGNvbnRlbnQgaXMgbGFyZ2UKLSAgICAgICAgICAgICAgICAgZW5vdWdoIHRvIG1lYW5pbmdmdWxseSBzY3JvbGwuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0iaWZDb250ZW50U2Nyb2xscyIgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICA8IS0tIE5ldmVyIG92ZXJzY3JvbGwuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0ibmV2ZXIiIHZhbHVlPSIyIiAvPgotICAgICAgICA8L2F0dHI+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDwhLS0gQXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggYSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cH0gb3IgYW55CiAgICAgICAgICBvZiBpdHMgc3ViY2xhc3Nlcy4gIEFsc28gc2VlIHtAbGluayAjVmlld0dyb3VwX0xheW91dH0gZm9yCiAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgdGhpcyBjbGFzcyBwcm9jZXNzZXMgaW4gaXRzIGNoaWxkcmVuLiAtLT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld0dyb3VwIj4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgY2hhbmdlcyBpbiBsYXlvdXQgKGNhdXNlZCBieSBhZGRpbmcgYW5kIHJlbW92aW5nIGl0ZW1zKSBzaG91bGQKKyAgICAgICAgICAgICBjYXVzZSBhIExheW91dFRyYW5zaXRpb24gdG8gcnVuLiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgYSBkZWZhdWx0CisgICAgICAgICAgICAgTGF5b3V0VHJhbnNpdGlvbiBvYmplY3Qgd2lsbCBiZSBzZXQgb24gdGhlIFZpZXdHcm91cCBjb250YWluZXIgYW5kIGRlZmF1bHQKKyAgICAgICAgICAgICBhbmltYXRpb25zIHdpbGwgcnVuIHdoZW4gdGhlc2UgbGF5b3V0IGNoYW5nZXMgb2NjdXIuLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFuaW1hdGVMYXlvdXRDaGFuZ2VzIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIGEgY2hpbGQgaXMgbGltaXRlZCB0byBkcmF3IGluc2lkZSBvZiBpdHMgYm91bmRzIG9yIG5vdC4KICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aXRoIGFuaW1hdGlvbnMgdGhhdCBzY2FsZSB0aGUgc2l6ZSBvZiB0aGUgY2hpbGRyZW4gdG8gbW9yZQogICAgICAgICAgICAgIHRoYW4gMTAwJSBmb3IgaW5zdGFuY2UuIEluIHN1Y2ggYSBjYXNlLCB0aGlzIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gZmFsc2UKQEAgLTE0MDQsNiArMTQ3MSwxNyBAQAogICAgICAgICAgICAgPGVudW0gbmFtZT0iYmxvY2tzRGVzY2VuZGFudHMiIHZhbHVlPSIyIiAvPgogICAgICAgICA8L2F0dHI+CiAKKyAgICAgICAgPCEtLSBTZXRzIHdoZXRoZXIgdGhpcyBWaWV3R3JvdXAgc2hvdWxkIHNwbGl0IE1vdGlvbkV2ZW50cworICAgICAgICAgICAgIHRvIHNlcGFyYXRlIGNoaWxkIHZpZXdzIGR1cmluZyB0b3VjaCBldmVudCBkaXNwYXRjaC4KKyAgICAgICAgICAgICBJZiBmYWxzZSAoZGVmYXVsdCksIHRvdWNoIGV2ZW50cyB3aWxsIGJlIGRpc3BhdGNoZWQgdG8KKyAgICAgICAgICAgICB0aGUgY2hpbGQgdmlldyB3aGVyZSB0aGUgZmlyc3QgcG9pbnRlciB3ZW50IGRvd24gdW50aWwKKyAgICAgICAgICAgICB0aGUgbGFzdCBwb2ludGVyIGdvZXMgdXAuCisgICAgICAgICAgICAgSWYgdHJ1ZSwgdG91Y2ggZXZlbnRzIG1heSBiZSBkaXNwYXRjaGVkIHRvIG11bHRpcGxlIGNoaWxkcmVuLgorICAgICAgICAgICAgIE1vdGlvbkV2ZW50cyBmb3IgZWFjaCBwb2ludGVyIHdpbGwgYmUgZGlzcGF0Y2hlZCB0byB0aGUgY2hpbGQKKyAgICAgICAgICAgICB2aWV3IHdoZXJlIHRoZSBpbml0aWFsIEFDVElPTl9ET1dOIGV2ZW50IGhhcHBlbmVkLgorICAgICAgICAgICAgIFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXdHcm91cCNzZXRNb3Rpb25FdmVudFNwbGl0dGluZ0VuYWJsZWQoYm9vbGVhbil9CisgICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzcGxpdE1vdGlvbkV2ZW50cyIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tIEEge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3U3R1Yn0gbGV0cyB5b3UgbGF6aWx5IGluY2x1ZGUgb3RoZXIgWE1MIGxheW91dHMKQEAgLTE1MDUsNiArMTU4MywyOCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJpc0RlZmF1bHQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPCEtLSBUaGlzIGlzIHRoZSBzdWJ0eXBlIG9mIElucHV0TWV0aG9kLiBTdWJ0eXBlIGNhbiBkZXNjcmliZSBsb2NhbGVzIChlLmcuIGVuX1VTLCBmcl9GUi4uLikKKyAgICAgICAgIGFuZCBtb2RlcyAoZS5nLiB2b2ljZSwga2V5Ym9hcmQuLi4pLCBhbmQgaXMgdXNlZCBmb3IgSU1FIHN3aXRjaC4gVGhpcyBzdWJ0eXBlIGFsbG93cworICAgICAgICAgdGhlIHN5c3RlbSB0byBjYWxsIHRoZSBzcGVjaWZpZWQgc3VidHlwZSBvZiB0aGUgSU1FIGRpcmVjdGx5LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iSW5wdXRNZXRob2RfU3VidHlwZSI+CisgICAgICAgIDwhLS0gVGhlIG5hbWUgb2YgdGhlIHN1YnR5cGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsYWJlbCIgLz4KKyAgICAgICAgPCEtLSBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDwhLS0gVGhlIGxvY2FsZSBvZiB0aGUgc3VidHlwZS4gVGhpcyBzdHJpbmcgc2hvdWxkIGJlIGEgbG9jYWxlIChlLmcuIGVuX1VTLCBmcl9GUi4uLikKKyAgICAgICAgICAgICBhbmQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIElNRSB3aGVuIHRoZSBmcmFtZXdvcmsgY2FsbHMgdGhlIElNRQorICAgICAgICAgICAgIHdpdGggdGhlIHN1YnR5cGUuIFRoaXMgaXMgYWxzbyB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8ga25vdyB0aGUgc3VwcG9ydGVkIGxvY2FsZXMKKyAgICAgICAgICAgICBvZiB0aGUgSU1FLiAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBtb2RlIG9mIHRoZSBzdWJ0eXBlLiBUaGlzIHN0cmluZyBjYW4gYmUgYSBtb2RlIChlLmcuIHZvaWNlLCBrZXlib2FyZC4uLikgYW5kIHRoaXMKKyAgICAgICAgICAgICBzdHJpbmcgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIElNRSB3aGVuIHRoZSBmcmFtZXdvcmsgY2FsbHMgdGhlIElNRSB3aXRoIHRoZQorICAgICAgICAgICAgIHN1YnR5cGUuICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZU1vZGUiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBleHRyYSB2YWx1ZSBvZiB0aGUgc3VidHlwZS4gVGhpcyBzdHJpbmcgY2FuIGJlIGFueSBzdHJpbmcgYW5kIHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICAgICAgICAgdGhlIElNRSB3aGVuIHRoZSBmcmFtZXdvcmsgY2FsbHMgdGhlIElNRSB3aXRoIHRoZSBzdWJ0eXBlLiAgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImltZVN1YnR5cGVFeHRyYVZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gV2lkZ2V0IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xNTU0LDYgKzE2NTQsMjggQEAKICAgICAgICAgICAgICB3aWxsIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFkYXB0ZXIgYW5kIHRoZSBudW1iZXIgb2YgaXRlbXMgdmlzaWJsZQogICAgICAgICAgICAgIG9uIHNjcmVlbiB0byBkZXRlcm1pbmUgdGhlIHNjcm9sbGJhcidzIHByb3BlcnRpZXMuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJzbW9vdGhTY3JvbGxiYXIiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBBIHJlZmVyZW5jZSB0byBhbiBYTUwgZGVzY3JpcHRpb24gb2YgdGhlIGFkYXB0ZXIgdG8gYXR0YWNoIHRvIHRoZSBsaXN0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWRhcHRlciIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgY2hvaWNlIGJlaGF2aW9yIGZvciB0aGUgdmlldy4gQnkgZGVmYXVsdCwgbGlzdHMgZG8gbm90IGhhdmUKKyAgICAgICAgICAgICBhbnkgY2hvaWNlIGJlaGF2aW9yLiBCeSBzZXR0aW5nIHRoZSBjaG9pY2VNb2RlIHRvIHNpbmdsZUNob2ljZSwgdGhlIGxpc3QKKyAgICAgICAgICAgICBhbGxvd3MgdXAgdG8gb25lIGl0ZW0gdG8gYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KKyAgICAgICAgICAgICBtdWx0aXBsZUNob2ljZSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLgorICAgICAgICAgICAgIEZpbmFsbHksIGJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8gbXVsdGlwbGVDaG9pY2VNb2RhbCB0aGUgbGlzdCBhbGxvd3MKKyAgICAgICAgICAgICBhbnkgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGNob3NlbiBpbiBhIHNwZWNpYWwgc2VsZWN0aW9uIG1vZGUuCisgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgc3VwcGx5IGEKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC53aWRnZXQuQWJzTGlzdFZpZXcuTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXJ9IHVzaW5nCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkFic0xpc3RWaWV3I3NldE11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyfSB0byBjb250cm9sIHRoZQorICAgICAgICAgICAgIHNlbGVjdGlvbiBtb2RlLiBUaGlzIHVzZXMgdGhlIHtAbGluayBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZX0gQVBJLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY2hvaWNlTW9kZSI+CisgICAgICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJub25lIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ic2luZ2xlQ2hvaWNlIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0ibXVsdGlwbGVDaG9pY2UiIHZhbHVlPSIyIiAvPgorICAgICAgICAgICAgPCEtLSBUaGUgbGlzdCBhbGxvd3MgbXVsdGlwbGUgY2hvaWNlcyBpbiBhIGN1c3RvbSBzZWxlY3Rpb24gbW9kZS4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJtdWx0aXBsZUNob2ljZU1vZGFsIiB2YWx1ZT0iMyIgLz4KKyAgICAgICAgPC9hdHRyPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFic1NwaW5uZXIiPgogICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhbiBhcnJheSByZXNvdXJjZSB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIFNwaW5uZXIuICBGb3Igc3RhdGljIGNvbnRlbnQsCkBAIC0xNzQ5LDcgKzE4NzEsNyBAQAogICAgICAgICA8IS0tIFdoZW4gc2V0IHRvIHRydWUsIGFsbCBjaGlsZHJlbiB3aXRoIGEgd2VpZ2h0IHdpbGwgYmUgY29uc2lkZXJlZCBoYXZpbmcKICAgICAgICAgICAgICB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkLiBJZiBmYWxzZSwgYWxsIGNoaWxkcmVuIGFyZQogICAgICAgICAgICAgIG1lYXN1cmVkIG5vcm1hbGx5LiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0idXNlTGFyZ2VzdENoaWxkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDxhdHRyIG5hbWU9Im1lYXN1cmVXaXRoTGFyZ2VzdENoaWxkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTGlzdFZpZXciPgogICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhbiBhcnJheSByZXNvdXJjZSB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIExpc3RWaWV3LiAgRm9yIHN0YXRpYyBjb250ZW50LApAQCAtMTc2MCwyOCArMTg4MiwxMiBAQAogICAgICAgICA8IS0tIEhlaWdodCBvZiB0aGUgZGl2aWRlci4gV2lsbCB1c2UgdGhlIGludHJpbnNpYyBoZWlnaHQgb2YgdGhlIGRpdmlkZXIgaWYgdGhpcwogICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJkaXZpZGVySGVpZ2h0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KLSAgICAgICAgPCEtLSBEZWZpbmVzIHRoZSBjaG9pY2UgYmVoYXZpb3IgZm9yIHRoZSBMaXN0Vmlldy4gQnkgZGVmYXVsdCwgbGlzdHMgZG8gbm90IGhhdmUKLSAgICAgICAgICAgICBhbnkgY2hvaWNlIGJlaGF2aW9yLiBCeSBzZXR0aW5nIHRoZSBjaG9pY2VNb2RlIHRvIHNpbmdsZUNob2ljZSwgdGhlIExpc3QKLSAgICAgICAgICAgICBhbGxvd3MgdXAgdG8gb25lIGl0ZW0gdG8gYmUgaW4gYSBjaG9zZW4gc3RhdGUuIEJ5IHNldHRpbmcgdGhlIGNob2ljZU1vZGUgdG8KLSAgICAgICAgICAgICBtdWx0aXBsZUNob2ljZSwgdGhlIGxpc3QgYWxsb3dzIGFueSBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY2hvc2VuLiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0iY2hvaWNlTW9kZSI+Ci0gICAgICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2hvaWNlcy4gLS0+Ci0gICAgICAgICAgICA8ZW51bSBuYW1lPSJub25lIiB2YWx1ZT0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gVGhlIGxpc3QgYWxsb3dzIHVwIHRvIG9uZSBjaG9pY2UuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0ic2luZ2xlQ2hvaWNlIiB2YWx1ZT0iMSIgLz4KLSAgICAgICAgICAgIDwhLS0gVGhlIGxpc3QgYWxsb3dzIG11bHRpcGxlIGNob2ljZXMuIC0tPgotICAgICAgICAgICAgPGVudW0gbmFtZT0ibXVsdGlwbGVDaG9pY2UiIHZhbHVlPSIyIiAvPgotICAgICAgICA8L2F0dHI+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBMaXN0VmlldyB3aWxsIG5vdCBkcmF3IHRoZSBkaXZpZGVyIGFmdGVyIGVhY2ggaGVhZGVyIHZpZXcuCiAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImhlYWRlckRpdmlkZXJzRW5hYmxlZCIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgICAgICA8IS0tIFdoZW4gc2V0IHRvIGZhbHNlLCB0aGUgTGlzdFZpZXcgd2lsbCBub3QgZHJhdyB0aGUgZGl2aWRlciBiZWZvcmUgZWFjaCBmb290ZXIgdmlldy4KICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZm9vdGVyRGl2aWRlcnNFbmFibGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+Ci0gICAgICAgIDwhLS0gRHJhd2FibGUgdG8gZHJhdyBhYm92ZSBsaXN0IGNvbnRlbnQuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJvdmVyc2Nyb2xsSGVhZGVyIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KLSAgICAgICAgPCEtLSBEcmF3YWJsZSB0byBkcmF3IGJlbG93IGxpc3QgY29udGVudC4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im92ZXJzY3JvbGxGb290ZXIiIGZvcm1hdD0icmVmZXJlbmNlfGNvbG9yIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lbnVWaWV3Ij4KICAgICAgICAgPCEtLSBEZWZhdWx0IGFwcGVhcmFuY2Ugb2YgbWVudSBpdGVtIHRleHQuIC0tPgpAQCAtMjE3Nyw3ICsyMjgzLDcgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZHJvcERvd25BbmNob3IiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgYmFzaWMgd2lkdGggb2YgdGhlIGRyb3Bkb3duLiBJdHMgdmFsdWUgbWF5CiAgICAgICAgICAgICAgYmUgYSBkaW1lbnNpb24gKHN1Y2ggYXMgIjEyZGlwIikgZm9yIGEgY29uc3RhbnQgd2lkdGgsCi0gICAgICAgICAgICAgZmlsbF9wYXJlbnQgb3IgbWF0Y2hfcGFyZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUgCisgICAgICAgICAgICAgZmlsbF9wYXJlbnQgb3IgbWF0Y2hfcGFyZW50IHRvIG1hdGNoIHRoZSB3aWR0aCBvZiB0aGUKICAgICAgICAgICAgICBzY3JlZW4sIG9yIHdyYXBfY29udGVudCB0byBtYXRjaCB0aGUgd2lkdGggb2YKICAgICAgICAgICAgICB0aGUgYW5jaG9yZWQgdmlldy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duV2lkdGgiIGZvcm1hdD0iZGltZW5zaW9uIj4KQEAgLTIyMTMsMTQgKzIzMTksMzMgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icG9wdXBCYWNrZ3JvdW5kIiBmb3JtYXQ9InJlZmVyZW5jZXxjb2xvciIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJWaWV3QW5pbWF0b3IiPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIHNob3duLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iaW5BbmltYXRpb24iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB3aGV0aGVyIHRvIGFuaW1hdGUgdGhlIGN1cnJlbnQgVmlldyB3aGVuIHRoZSBWaWV3QW5pbWF0aW9uCisgICAgICAgICAgICAgaXMgZmlyc3QgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5pbWF0ZUZpcnN0VmlldyIgZm9ybWF0PSJib29sZWFuIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IlZpZXdGbGlwcGVyIj4KICAgICAgICAgPGF0dHIgbmFtZT0iZmxpcEludGVydmFsIiBmb3JtYXQ9ImludGVnZXIiIG1pbj0iMCIgLz4KICAgICAgICAgPCEtLSBXaGVuIHRydWUsIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5pbWF0aW5nIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhdXRvU3RhcnQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJBZGFwdGVyVmlld0FuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBJZGVudGlmaWVyIGZvciB0aGUgYW5pbWF0aW9uIHRvIHVzZSB3aGVuIGEgdmlldyBpcyBzaG93bi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImluQW5pbWF0aW9uIiAvPgorICAgICAgICA8IS0tIElkZW50aWZpZXIgZm9yIHRoZSBhbmltYXRpb24gdG8gdXNlIHdoZW4gYSB2aWV3IGlzIGhpZGRlbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im91dEFuaW1hdGlvbiIgLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIHdoZXRoZXIgdG8gYW5pbWF0ZSB0aGUgY3VycmVudCBWaWV3IHdoZW4gdGhlIFZpZXdBbmltYXRpb24KKyAgICAgICAgICAgICBpcyBmaXJzdCBkaXNwbGF5ZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFkYXB0ZXJWaWV3RmxpcHBlciI+CisgICAgICAgIDxhdHRyIG5hbWU9ImZsaXBJbnRlcnZhbCIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHRydWUsIGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5pbWF0aW5nIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhdXRvU3RhcnQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iVmlld1N3aXRjaGVyIj4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTY3JvbGxWaWV3Ij4KQEAgLTIyMzQsNiArMjM1OSwzMCBAQAogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTcGlubmVyIj4KICAgICAgICAgPCEtLSBUaGUgcHJvbXB0IHRvIGRpc3BsYXkgd2hlbiB0aGUgc3Bpbm5lcidzIGRpYWxvZyBpcyBzaG93bi4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InByb21wdCIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gRGlzcGxheSBtb2RlIGZvciBzcGlubmVyIG9wdGlvbnMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzcGlubmVyTW9kZSIgZm9ybWF0PSJlbnVtIj4KKyAgICAgICAgICAgIDwhLS0gU3Bpbm5lciBvcHRpb25zIHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGFzIGEgZGlhbG9nIHdpbmRvdy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJkaWFsb2ciIHZhbHVlPSIwIiAvPgorICAgICAgICAgICAgPCEtLSBTcGlubmVyIG9wdGlvbnMgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYXMgYW4gaW5saW5lIGRyb3Bkb3duCisgICAgICAgICAgICAgICAgIGFuY2hvcmVkIHRvIHRoZSBzcGlubmVyIHdpZGdldCBpdHNlbGYuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iZHJvcGRvd24iIHZhbHVlPSIxIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgICAgIDwhLS0gTGlzdCBzZWxlY3RvciB0byB1c2UgZm9yIHNwaW5uZXJNb2RlPSJkcm9wZG93biIgZGlzcGxheS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duU2VsZWN0b3IiIC8+CisgICAgICAgIDwhLS0gQmFja2dyb3VuZCBkcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBkcm9wZG93biBpbiBzcGlubmVyTW9kZT0iZHJvcGRvd24iLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icG9wdXBCYWNrZ3JvdW5kIiAvPgorICAgICAgICA8IS0tIFZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBzcGlubmVyIHdpZGdldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duIGluCisgICAgICAgICAgICAgc3Bpbm5lck1vZGU9ImRyb3Bkb3duIi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyb3BEb3duVmVydGljYWxPZmZzZXQiIC8+CisgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgc3Bpbm5lciB3aWRnZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcm9wZG93bgorICAgICAgICAgICAgIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bkhvcml6b250YWxPZmZzZXQiIC8+CisgICAgICAgIDwhLS0gV2lkdGggb2YgdGhlIGRyb3Bkb3duIGluIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJkcm9wRG93bldpZHRoIiAvPgorICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIGxheW91dCB0byB1c2UgZm9yIGRpc3BsYXlpbmcgYSBwcm9tcHQgaW4gdGhlIGRyb3Bkb3duIGZvcgorICAgICAgICAgICAgIHNwaW5uZXJNb2RlPSJkcm9wZG93biIuIFRoaXMgbGF5b3V0IG11c3QgY29udGFpbiBhIFRleHRWaWV3IHdpdGggdGhlIGlkCisgICAgICAgICAgICAgQGFuZHJvaWQ6aWQvdGV4dDEgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIHByb21wdCB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icG9wdXBQcm9tcHRWaWV3IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJEYXRlUGlja2VyIj4KICAgICAgICAgPCEtLSBUaGUgZmlyc3QgeWVhciAoaW5jbHVzaXZlKSwgZm9yIGV4YW1wbGUgIjE5NDAiLiAtLT4KQEAgLTI1NDQsNiArMjY5MywxMCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJkcmF3YWJsZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1pcG1hcERyYXdhYmxlSXRlbSI+CisgICAgICAgIDxhdHRyIG5hbWU9ImRyYXdhYmxlIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUm90YXRlRHJhd2FibGUiPgogICAgICAgICA8YXR0ciBuYW1lPSJ2aXNpYmxlIiAvPgogICAgICAgICA8YXR0ciBuYW1lPSJmcm9tRGVncmVlcyIgZm9ybWF0PSJmbG9hdCIgLz4KQEAgLTI4NjcsNiArMzAyMCw2OSBAQAogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gVmFsdWVBbmltYXRvciBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisKKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQW5pbWF0b3IiPgorICAgICAgICA8IS0tIERlZmluZXMgdGhlIGludGVycG9sYXRvciB1c2VkIHRvIHNtb290aCB0aGUgYW5pbWF0aW9uIG1vdmVtZW50IGluIHRpbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpbnRlcnBvbGF0b3IiIC8+CisgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgZmlsbEFmdGVyIGlzIHRha2VuIGludG8gYWNjb3VudC4gLS0+CisgICAgICAgIDwhLS0gQW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgZm9yIHRoZSBhbmltYXRpb24gdG8gcnVuLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZHVyYXRpb24iIC8+CisgICAgICAgIDwhLS0gRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHJ1bnMsIG9uY2Ugc3RhcnQgdGltZSBpcyByZWFjaGVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3RhcnRPZmZzZXQiLz4KKyAgICAgICAgPCEtLSBEZWZpbmVzIGhvdyBtYW55IHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIHJlcGVhdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJlcGVhdENvdW50Ii8+CisgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgYW5pbWF0aW9uIGJlaGF2aW9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIGFuZCB0aGUgcmVwZWF0IGNvdW50IGlzCisgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIDAgb3IgaW5maW5pdGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHJlc3RhcnQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJyZXBlYXRNb2RlIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBzdGFydHMgZnJvbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlRnJvbSIgZm9ybWF0PSJmbG9hdHxpbnRlZ2VyIi8+CisgICAgICAgIDwhLS0gVmFsdWUgdGhlIGFuaW1hdGlvbiBhbmltYXRlcyB0by4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVG8iIGZvcm1hdD0iZmxvYXR8aW50ZWdlciIvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIHZhbHVlRnJvbSBhbmQgdmFsdWVUby4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZhbHVlVHlwZSI+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgZmxvYXRzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImZsb2F0VHlwZSIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIHZhbHVlRnJvbSBhbmQgdmFsdWVUbyBhcmUgaW50ZWdlcnMuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iaW50VHlwZSIgICB2YWx1ZT0iMSIgLz4KKyAgICAgICAgICAgIDwhLS0gdmFsdWVGcm9tIGFuZCB2YWx1ZVRvIGFyZSBkb3VibGVzLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRvdWJsZVR5cGUiIHZhbHVlPSIyIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGNvbG9ycy4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJjb2xvclR5cGUiIHZhbHVlPSIzIiAvPgorICAgICAgICAgICAgPCEtLSB2YWx1ZUZyb20gYW5kIHZhbHVlVG8gYXJlIGEgY3VzdG9tIHR5cGUuIC0tPgorICAgICAgICAgICAgPGVudW0gbmFtZT0iY3VzdG9tVHlwZSIgdmFsdWU9IjQiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIE9iamVjdEFuaW1hdG9yIGNsYXNzIGF0dHJpYnV0ZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJQcm9wZXJ0eUFuaW1hdG9yIj4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InByb3BlcnR5TmFtZSIgZm9ybWF0PSJzdHJpbmciLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisKKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQW5pbWF0b3JTZXQgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFuaW1hdG9yU2V0Ij4KKyAgICAgICAgPCEtLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyaW5nIj4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHRvZ2V0aGVyLiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRvZ2V0aGVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDwhLS0gY2hpbGQgYW5pbWF0aW9ucyBzaG91bGQgYmUgcGxheWVkIHNlcXVlbnRpYWxseSwgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHhtbC4gLS0+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJzZXF1ZW50aWFsbHkiIHZhbHVlPSIxIiAvPgorICAgICAgICA8L2F0dHI+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBTdGF0ZSBhdHRyaWJ1dGVzICAgICAgICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgpAQCAtMzI3NSw2ICszNDkxLDI3IEBACiAgICAgICAgIDwhLS0gV2hldGhlciB0aGUgaXRlbSBpcyBlbmFibGVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0iZW5hYmxlZCIgLz4KIAorICAgICAgICA8IS0tIE5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIENvbnRleHQgdXNlZCB0byBpbmZsYXRlIHRoZSBtZW51IHRoYXQgd2lsbCBiZQorICAgICAgICAgICAgIGNhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIGNsaWNrZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJvbkNsaWNrIiAvPgorCisgICAgICAgIDwhLS0gSG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgQWN0aW9uIEJhciwgaWYgcHJlc2VudC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNob3dBc0FjdGlvbiIgZm9ybWF0PSJlbnVtIj4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5ldmVyIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImlmUm9vbSIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8ZW51bSBuYW1lPSJhbHdheXMiIHZhbHVlPSIyIiAvPgorICAgICAgICA8L2F0dHI+CisKKyAgICAgICAgPCEtLSBBbiBvcHRpb25hbCBsYXlvdXQgdG8gYmUgdXNlZCBhcyBhbiBhY3Rpb24gdmlldy4KKyAgICAgICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQudmlldy5NZW51SXRlbSNzZXRBY3Rpb25WaWV3KGFuZHJvaWQudmlldy5WaWV3KX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTGF5b3V0IiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIGFuIG9wdGlvbmFsIFZpZXcgY2xhc3MgdG8gaW5zdGFudGlhdGUgYW5kIHVzZSBhcyBhbgorICAgICAgICAgICAgIGFjdGlvbiB2aWV3LiBTZWUge0BsaW5rIGFuZHJvaWQudmlldy5NZW51SXRlbSNzZXRBY3Rpb25WaWV3KGFuZHJvaWQudmlldy5WaWV3KX0KKyAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uVmlld0NsYXNzIiBmb3JtYXQ9InN0cmluZyIgLz4KKwogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CkBAIC0zMjkwLDYgKzM1MjcsMTkgQEAKICAgICAgICAgPGF0dHIgbmFtZT0ib3JkZXJpbmdGcm9tWG1sIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDwhLS0gQXR0cmlidXRlIGZvciBhIGhlYWRlciBkZXNjcmliaW5nIHRoZSBpdGVtIHNob3duIGluIHRoZSB0b3AtbGV2ZWwgbGlzdAorICAgICAgICAgZnJvbSB3aGljaCB0aGUgc2VsZWN0cyB0aGUgc2V0IG9mIHByZWZlcmVuY2UgdG8gZGlnIGluIHRvLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iUHJlZmVyZW5jZUhlYWRlciI+CisgICAgICAgIDwhLS0gVGhlIHRpdGxlIG9mIHRoZSBpdGVtIHRoYXQgaXMgc2hvd24gdG8gdGhlIHVzZXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZSIgLz4KKyAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBBbiBpY29uIGZvciB0aGUgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb24iIC8+CisgICAgICAgIDwhLS0gVGhlIGZyYWdtZW50IHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGlzIGl0ZW0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcmFnbWVudCIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gV0FSTklORzogIElmIGFkZGluZyBhdHRyaWJ1dGVzIHRvIFByZWZlcmVuY2UsIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjb25mbGljdAogICAgICAgICAgICAgICAgICAgIHdpdGggYSBWaWV3J3MgYXR0cmlidXRlcy4gIFNvbWUgc3ViY2xhc3NlcyAoZS5nLiwgRWRpdFRleHRQcmVmZXJlbmNlKQogICAgICAgICAgICAgICAgICAgIHByb3h5IGFsbCBhdHRyaWJ1dGVzIHRvIGl0cyBFZGl0VGV4dCB3aWRnZXQuIC0tPgpAQCAtMzMwMiwxMCArMzU1MiwxMyBAQAogICAgICAgICA8IS0tIFRoZSB0aXRsZSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CiAgICAgICAgIDwhLS0gVGhlIHN1bW1hcnkgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnkiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJzdW1tYXJ5IiAvPgogICAgICAgICA8IS0tIFRoZSBvcmRlciBmb3IgdGhlIFByZWZlcmVuY2UgKGxvd2VyIHZhbHVlcyBhcmUgdG8gYmUgb3JkZXJlZCBmaXJzdCkuIElmIHRoaXMgaXMgbm90CiAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvcmRlcmluIHdpbGwgYmUgYWxwaGFiZXRpYy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im9yZGVyIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgICAgIDwhLS0gV2hlbiB1c2VkIGluc2lkZSBvZiBhIG1vZGVybiBQcmVmZXJlbmNlQWN0aXZpdHksIHRoaXMgZGVjbGFyZXMKKyAgICAgICAgICAgICBhIG5ldyBQcmVmZXJlbmNlRnJhZ21lbnQgdG8gYmUgc2hvd24gd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoaXMgaXRlbS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZyYWdtZW50IiAvPgogICAgICAgICA8IS0tIFRoZSBsYXlvdXQgZm9yIHRoZSBQcmVmZXJlbmNlIGluIGEgUHJlZmVyZW5jZUFjdGl2aXR5IHNjcmVlbi4gVGhpcyBzaG91bGQKICAgICAgICAgICAgICByYXJlbHkgbmVlZCB0byBiZSBjaGFuZ2VkLCBsb29rIGF0IHdpZGdldExheW91dCBpbnN0ZWFkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0IiAvPgpAQCAtMzM3Nyw2ICszNjMwLDE2IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImVudHJ5VmFsdWVzIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik11bHRpU2VsZWN0TGlzdFByZWZlcmVuY2UiPgorICAgICAgICA8IS0tIFRoZSBodW1hbi1yZWFkYWJsZSBhcnJheSB0byBwcmVzZW50IGFzIGEgbGlzdC4gRWFjaCBlbnRyeSBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgaW5kZXggaW4gZW50cnlWYWx1ZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJlbnRyaWVzIiAvPgorICAgICAgICA8IS0tIFRoZSBhcnJheSB0byBmaW5kIHRoZSB2YWx1ZSB0byBzYXZlIGZvciBhIHByZWZlcmVuY2Ugd2hlbiBhbiBlbnRyeSBmcm9tCisgICAgICAgICAgICAgZW50cmllcyBpcyBzZWxlY3RlZC4gSWYgYSB1c2VyIGNsaWNrcyB0aGUgc2Vjb25kIGl0ZW0gaW4gZW50cmllcywgdGhlCisgICAgICAgICAgICAgc2Vjb25kIGl0ZW0gaW4gdGhpcyBhcnJheSB3aWxsIGJlIHNhdmVkIHRvIHRoZSBwcmVmZXJlbmNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZW50cnlWYWx1ZXMiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKwogICAgIDwhLS0gQmFzZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSB0byBSaW5ndG9uZVByZWZlcmVuY2UuIC0tPgogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJSaW5ndG9uZVByZWZlcmVuY2UiPgogICAgICAgICA8IS0tIFdoaWNoIHJpbmd0b25lIHR5cGUocykgdG8gc2hvdyBpbiB0aGUgcGlja2VyLiAtLT4KQEAgLTM1MjgsNyArMzc5MSw3IEBACiAgICAgPCEtLSBBcHBXaWRnZXQgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFwcHdpZGdldC1wcm92aWRlcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIEFwcFdpZGdldCBwcm92aWRlci4gIFNlZSB7QGxpbmsgYW5kcm9pZC5hcHB3aWRnZXQgYW5kcm9pZC5hcHB3aWRnZXR9CiAgICAgICAgICBwYWNrYWdlIGZvciBtb3JlIGluZm8uCkBAIC0zNTQ1LDEzICszODA4LDQ5IEBACiAgICAgICAgIDwhLS0gQSBjbGFzcyBuYW1lIGluIHRoZSBBcHBXaWRnZXQncyBwYWNrYWdlIHRvIGJlIGxhdW5jaGVkIHRvIGNvbmZpZ3VyZS4KICAgICAgICAgICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZW4gbm8gYWN0aXZpdHkgd2lsbCBiZSBsYXVuY2hlZC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImNvbmZpZ3VyZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gQSBwcmV2aWV3IG9mIHdoYXQgdGhlIEFwcFdpZGdldCB3aWxsIGxvb2sgbGlrZSBhZnRlciBpdCdzIGNvbmZpZ3VyZWQuCisgICAgICAgCSAgICAgSWYgbm90IHN1cHBsaWVkLCB0aGUgQXBwV2lkZ2V0J3MgaWNvbiB3aWxsIGJlIHVzZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwcmV2aWV3SW1hZ2UiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSBBcHAgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBWaWV3IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCA8Y29kZT4mbHQ7ZnJhZ21lbnQmZ3Q7PC9jb2RlPgorICAgICAgICAgdGFncyBpbnNpZGUgb2YgdGhlIGxheW91dCBvZiBhbiBBY3Rpdml0eS4gIFRoaXMgaW5zdGFudGlhdGVzCisgICAgICAgICB0aGUgZ2l2ZW4ge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQgaW5zZXJ0cyBpdHMgY29udGVudAorICAgICAgICAgdmlldyBpbnRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBsYXlvdXQuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJGcmFnbWVudCI+CisgICAgICAgIDwhLS0gU3VwcGx5IHRoZSBuYW1lIG9mIHRoZSBmcmFnbWVudCBjbGFzcyB0byBpbnN0YW50aWF0ZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im5hbWUiIC8+CisKKyAgICAgICAgPCEtLSBTdXBwbHkgYW4gaWRlbnRpZmllciBuYW1lIGZvciB0aGUgdG9wLWxldmVsIHZpZXcsIHRvIGxhdGVyIHJldHJpZXZlIGl0CisgICAgICAgICAgICAgd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZmluZFZpZXdCeUlkIFZpZXcuZmluZFZpZXdCeUlkKCl9IG9yCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I2ZpbmRWaWV3QnlJZCBBY3Rpdml0eS5maW5kVmlld0J5SWQoKX0uCisgICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGEKKyAgICAgICAgICAgICByZXNvdXJjZSByZWZlcmVuY2U7IHR5cGljYWxseSB5b3Ugc2V0IHRoaXMgdXNpbmcgdGhlCisgICAgICAgICAgICAgPGNvZGU+QCs8L2NvZGU+IHN5bnRheCB0byBjcmVhdGUgYSBuZXcgSUQgcmVzb3VyY2VzLgorICAgICAgICAgICAgIEZvciBleGFtcGxlOiA8Y29kZT5hbmRyb2lkOmlkPSJAK2lkL215X2lkIjwvY29kZT4gd2hpY2gKKyAgICAgICAgICAgICBhbGxvd3MgeW91IHRvIGxhdGVyIHJldHJpZXZlIHRoZSB2aWV3CisgICAgICAgICAgICAgd2l0aCA8Y29kZT5maW5kVmlld0J5SWQoUi5pZC5teV9pZCk8L2NvZGU+LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaWQiIC8+CisKKyAgICAgICAgPCEtLSBTdXBwbHkgYSB0YWcgZm9yIHRoZSB0b3AtbGV2ZWwgdmlldyBjb250YWluaW5nIGEgU3RyaW5nLCB0byBiZSByZXRyaWV2ZWQKKyAgICAgICAgICAgICBsYXRlciB3aXRoIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNnZXRUYWcgVmlldy5nZXRUYWcoKX0gb3IKKyAgICAgICAgICAgICBzZWFyY2hlZCBmb3Igd2l0aCB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZmluZFZpZXdXaXRoVGFnCisgICAgICAgICAgICAgVmlldy5maW5kVmlld1dpdGhUYWcoKX0uICBJdCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2UKKyAgICAgICAgICAgICBJRHMgKHRocm91Z2ggdGhlIGFuZHJvaWQ6aWQgYXR0cmlidXRlKSBpbnN0ZWFkIG9mIHRhZ3MgYmVjYXVzZQorICAgICAgICAgICAgIHRoZXkgYXJlIGZhc3RlciBhbmQgYWxsb3cgZm9yIGNvbXBpbGUtdGltZSB0eXBlIGNoZWNraW5nLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGFnIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKICAgICA8IS0tIFVzZSA8Y29kZT5kZXZpY2UtYWRtaW48L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKICAgICAgICAgIGRlc2NyaWJlcyBhCiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuYWRtaW4uRGV2aWNlQWRtaW5SZWNlaXZlcn0sIHdoaWNoIGlzCkBAIC0zNTkxLDcgKzM4OTAsNyBAQAogICAgIDwhLS0gQWNjb3VudHMgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFjY291bnQtYXV0aGVudGljYXRvcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIGFjY291bnQgYXV0aGVudGljYXRvci4KICAgICAgLS0+CkBAIC0zNjEyLDcgKzM5MTEsNyBAQAogICAgIDwhLS0gQWNjb3VudHMgcGFja2FnZSBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICAKKwogICAgIDwhLS0gVXNlIDxjb2RlPmFjY291bnQtYXV0aGVudGljYXRvcjwvY29kZT4gYXMgdGhlIHJvb3QgdGFnIG9mIHRoZSBYTUwgcmVzb3VyY2UgdGhhdAogICAgICAgICAgZGVzY3JpYmVzIGFuIGFjY291bnQgYXV0aGVudGljYXRvci4KICAgICAgLS0+CkBAIC0zNjI4LDcgKzM5MjcsNyBAQAogICAgIDwhLS0gQ29udGFjdHMgbWV0YS1kYXRhIGF0dHJpYnV0ZXMgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDxlYXQtY29tbWVudCAvPgotICAgIAorCiAgICAgPCEtLSBUT0RPOiByZW1vdmUgdGhpcyBkZXByZWNhdGVkIHN0eWxlYWJsZS4gLS0+CiAgICAgPGVhdC1jb21tZW50IC8+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ikljb24iPgpAQCAtMzY1NCw2ICszOTUzLDkgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iZGV0YWlsQ29sdW1uIiBmb3JtYXQ9InN0cmluZyIgLz4KICAgICAgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgdGhhdCBkZXRhaWwgc2hvdWxkIGJlIGJ1aWx0IGZyb20gU29jaWFsUHJvdmlkZXIuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJkZXRhaWxTb2NpYWxTdW1tYXJ5IiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgICAgIDwhLS0gUmVzb3VyY2UgcmVwcmVzZW50aW5nIHRoZSB0ZXJtICJBbGwgQ29udGFjdHMiIChlLmcuICJBbGwgRnJpZW5kcyIgb3IKKyAgICAgICAgIkFsbCBjb25uZWN0aW9ucyIpLiBPcHRpb25hbCAoRGVmYXVsdCBpcyAiQWxsIENvbnRhY3RzIikuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbGxDb250YWN0c05hbWUiIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0zNjg1LDQgKzM5ODcsMTI1IEBACiAgICAgICAgIDxhdHRyIG5hbWU9InNldHRpbmdzQWN0aXZpdHkiIC8+CiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEFkYXB0ZXJzIGF0dHJpYnV0ZXMgICAgICAgICAgICAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorCisgICAgPCEtLSBBZGFwdGVyIHVzZWQgdG8gYmluZCBjdXJzb3JzLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlciI+CisgICAgICAgIDwhLS0gVVJJIHRvIGdldCB0aGUgY3Vyc29yIGZyb20uIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idXJpIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTZWxlY3Rpb24gc3RhdGVtZW50IGZvciB0aGUgcXVlcnkuIE9wdGlvbmFsLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic2VsZWN0aW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTb3J0IG9yZGVyIHN0YXRlbWVudCBmb3IgdGhlIHF1ZXJ5LiBPcHRpb25hbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InNvcnRPcmRlciIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gTGF5b3V0IHJlc291cmNlIHVzZWQgdG8gZGlzcGxheSBlYWNoIHJvdyBmcm9tIHRoZSBjdXJzb3IuIE1hbmRhdG9yeS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPCEtLSBBdHRyaWJ1dGVzIHVzZWQgaW4gYmluZCBpdGVtcyBmb3IgWE1MIGN1cnNvciBhZGFwdGVycy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfQmluZEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gYmluZCBmcm9tLiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJmcm9tIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgcmVzb3VyY2UgaWQgb2YgdGhlIHZpZXcgdG8gYmluZCB0by4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idG8iIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFRoZSB0eXBlIG9mIGJpbmRpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIHR5cGUgd2lsbCBiZQorICAgICAgICAgICAgIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlICJ0byIgdGFyZ2V0IHZpZXcuIE1hbmRhdG9yeS4KKworICAgICAgICAgICAgIFRoZSB0eXBlIGNhbiBiZSBvbmUgb2Y6CisgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgIDxsaT5zdHJpbmcsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UsIFRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4gaXMgaW50ZXJwcmV0ZWQgYXMgYSBibG9iIGRlc2NyaWJpbmcgYW4gaW1hZ2UuPC9saT4KKyAgICAgICAgICAgICA8bGk+aW1hZ2UtdXJpLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgVVJJIHRvIGFuIGltYWdlLjwvbGk+CisgICAgICAgICAgICAgPGxpPmRyYXdhYmxlLCBUaGUgY29udGVudCBvZiB0aGUgY29sdW1uIGlzIGludGVycHJldGVkIGFzIGEgcmVzb3VyY2UgaWQgdG8gYSBkcmF3YWJsZS48L2xpPgorICAgICAgICAgICAgIDxsaT5BIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBjb3JyZXNwb25kaW5nIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvckJpbmRlci48L2xpPgorICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYXMiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCBpbiBzZWxlY3QgaXRlbXMgZm9yIFhNTCBjdXJzb3IgYWRhcHRlcnMuIC0tPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJDdXJzb3JBZGFwdGVyX1NlbGVjdEl0ZW0iPgorICAgICAgICA8IS0tIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc2VsZWN0LiBNYW5kYXRvcnkuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjb2x1bW4iIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBtYXAgdmFsdWVzIHRvIG5ldyB2YWx1ZXMgaW4gWE1MIGN1cnNvciBhZGFwdGVycycgYmluZCBpdGVtcy4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkN1cnNvckFkYXB0ZXJfTWFwSXRlbSI+CisgICAgICAgIDwhLS0gVGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGNvbHVtbi4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZnJvbVZhbHVlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgbmV3IHZhbHVlIGZyb20gdGhlIGNvbHVtbi4gTWFuZGF0b3J5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idG9WYWx1ZSIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gQXR0cmlidXRlcyB1c2VkIHRvIG1hcCB2YWx1ZXMgdG8gbmV3IHZhbHVlcyBpbiBYTUwgY3Vyc29yIGFkYXB0ZXJzJyBiaW5kIGl0ZW1zLiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQ3Vyc29yQWRhcHRlcl9UcmFuc2Zvcm1JdGVtIj4KKyAgICAgICAgPCEtLSBUaGUgdHJhbnNmb3JtYXRpb24gZXhwcmVzc2lvbi4gTWFuZGF0b3J5IGlmICJ3aXRoQ2xhc3MiIGlzIG5vdCBzcGVjaWZpZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aXRoRXhwcmVzc2lvbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHRyYW5zZm9ybWF0aW9uIGNsYXNzLCBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICAgICAgIGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uLiBNYW5kYXRvcnkgaWYgIndpdGhFeHByZXNzaW9uIgorICAgICAgICAgICAgIGlzIG5vdCBzcGVjaWZpZWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ3aXRoQ2xhc3MiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CisKKyAgICA8IS0tIEF0dHJpYnV0ZXMgdXNlZCB0byBzdHlsZSB0aGUgQWN0aW9uIEJhci4gLS0+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFjdGlvbkJhciI+CisgICAgICAgIDwhLS0gVGhlIHR5cGUgb2YgbmF2aWdhdGlvbiB0byB1c2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJuYXZpZ2F0aW9uTW9kZSI+CisgICAgICAgICAgICA8IS0tIE5vcm1hbCBzdGF0aWMgdGl0bGUgdGV4dCAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9Im5vcm1hbCIgdmFsdWU9IjAiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBhY3Rpb24gYmFyIHdpbGwgdXNlIGEgZHJvcC1kb3duIHNlbGVjdGlvbiBpbiBwbGFjZSBvZiB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9ImRyb3Bkb3duTGlzdCIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8IS0tIFRoZSBhY3Rpb24gYmFyIHdpbGwgdXNlIGEgc2VyaWVzIG9mIGhvcml6b250YWwgdGFicyBpbiBwbGFjZSBvZiB0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgICAgIDxlbnVtIG5hbWU9InRhYkJhciIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBPcHRpb25zIGFmZmVjdGluZyBob3cgdGhlIGFjdGlvbiBiYXIgaXMgZGlzcGxheWVkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZGlzcGxheU9wdGlvbnMiPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idXNlTG9nbyIgdmFsdWU9IjEiIC8+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJoaWRlSG9tZSIgdmFsdWU9IjIiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhlIGNvbG9yIHVzZWQgdG8gc3R5bGUgdGhlIGFjdGlvbiBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjb2xvckZpbHRlciIgZm9ybWF0PSJjb2xvciIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGl0bGUgdGV4dCB1c2VkIGZvciBuYXZpZ2F0aW9uTW9kZT0ibm9ybWFsIiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0idGl0bGUiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIHN1YnRpdGxlIHRleHQgdXNlZCBmb3IgbmF2aWdhdGlvbk1vZGU9Im5vcm1hbCIgLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBzdHlsZSB0byB1c2UgZm9yIHRpdGxlIHRleHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0aXRsZVRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgc3R5bGUgdG8gdXNlIGZvciBzdWJ0aXRsZSB0ZXh0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGljb24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpY29uIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgdGhlIGFwcGxpY2F0aW9uIGxvZ28uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsb2dvIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyB0aGUgZHJhd2FibGUgdXNlZCBmb3IgaXRlbSBkaXZpZGVycy4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImRpdmlkZXIiIC8+CisgICAgICAgIDwhLS0gU3BlY2lmaWVzIGEgYmFja2dyb3VuZCBkcmF3YWJsZSBmb3IgdGhlIGFjdGlvbiBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGxheW91dCBmb3IgY3VzdG9tIG5hdmlnYXRpb24uIE92ZXJyaWRlcyBuYXZpZ2F0aW9uTW9kZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGZpeGVkIGhlaWdodC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImhlaWdodCIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFjdGlvbk1vZGUiPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3IgdGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InRpdGxlVGV4dFN0eWxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIHN0eWxlIHRvIHVzZSBmb3Igc3VidGl0bGUgdGV4dC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1YnRpdGxlVGV4dFN0eWxlIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGJhY2tncm91bmQgZm9yIHRoZSBhY3Rpb24gbW9kZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJiYWNrZ3JvdW5kIiAvPgorICAgICAgICA8IS0tIFNwZWNpZmllcyBhIGZpeGVkIGhlaWdodCBmb3IgdGhlIGFjdGlvbiBtb2RlIGJhci4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImhlaWdodCIgLz4KKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgYSBwYWRkaW5nIHRvIHVzZSBiZXR3ZWVuIGVsZW1lbnRzIG9uIHRoZSBiYXIuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJpdGVtUGFkZGluZyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTZWFyY2hWaWV3Ij4KKyAgICAgICAgPCEtLSBUaGUgZGVmYXVsdCBzdGF0ZSBvZiB0aGUgU2VhcmNoVmlldy4gSWYgdHJ1ZSwgaXQgd2lsbCBiZSBpY29uaWZpZWQgd2hlbiBub3QgaW4KKyAgICAgICAgICAgICB1c2UgYW5kIGV4cGFuZGVkIHdoZW4gY2xpY2tlZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imljb25pZmllZEJ5RGVmYXVsdCIgZm9ybWF0PSJib29sZWFuIi8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAppbmRleCBmYjQ5MTIwLi44Y2Y2NWFlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzX21hbmlmZXN0LnhtbApAQCAtMjM1LDYgKzIzNSwxMCBAQAogICAgICAgICAgdGhlIHNhZmUgbW9kZS4gIC0tPgogICAgIDxhdHRyIG5hbWU9InZtU2FmZU1vZGUiIGZvcm1hdD0iYm9vbGVhbiIgLz4KIAorICAgIDwhLS0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uJ3MgcmVuZGVyaW5nIHNob3VsZCBiZSBoYXJkd2FyZQorICAgICAgICAgYWNjZWxlcmF0ZWQgaWYgcG9zc2libGUuICAtLT4KKyAgICA8YXR0ciBuYW1lPSJoYXJkd2FyZUFjY2VsZXJhdGVkIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisKICAgICA8IS0tIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBjb21wb25lbnQgaXMgYXZhaWxhYmxlCiAgICAgICAgICB0byBvdGhlciBhcHBsaWNhdGlvbnMuICBJZiBmYWxzZSwgaXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYnkKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGl0cyBzYW1lIHVzZXIgaWQgKHdoaWNoIHVzdWFsbHkgbWVhbnMgb25seSBieQpAQCAtNzM0LDYgKzczOCw3IEBACiAgICAgICAgIDxhdHRyIG5hbWU9ImVuYWJsZWQiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImRlYnVnZ2FibGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9InZtU2FmZU1vZGUiIC8+CisgICAgICAgIDxhdHRyIG5hbWU9ImhhcmR3YXJlQWNjZWxlcmF0ZWQiIC8+CiAgICAgICAgIDwhLS0gTmFtZSBvZiBhY3Rpdml0eSB0byBiZSBsYXVuY2hlZCBmb3IgbWFuYWdpbmcgdGhlIGFwcGxpY2F0aW9uJ3Mgc3BhY2Ugb24gdGhlIGRldmljZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im1hbmFnZVNwYWNlQWN0aXZpdHkiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFsbG93Q2xlYXJVc2VyRGF0YSIgLz4KQEAgLTEyMDcsNiArMTIxMiw3IEBACiAgICAgICAgICAgICAgYW55IHZhbHVlIGluIHRoZSB0aGVtZS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9IndpbmRvd1NvZnRJbnB1dE1vZGUiIC8+CiAgICAgICAgIDxhdHRyIG5hbWU9ImltbWVyc2l2ZSIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogICAgIAogICAgIDwhLS0gVGhlIDxjb2RlPmFjdGl2aXR5LWFsaWFzPC9jb2RlPiB0YWcgZGVjbGFyZXMgYSBuZXcKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAppbmRleCBiNmFmNmIyLi5lOWE0Y2EzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCkBAIC0xOCw4ICsxOCw4IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzPgotCTxkcmF3YWJsZSBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9saWdodCI+I2ZmZmZmZmZmPC9kcmF3YWJsZT4KLQk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfZGFyayI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KKwk8ZHJhd2FibGUgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHQiPiNmZmVmZWZlZjwvZHJhd2FibGU+CisJPGRyYXdhYmxlIG5hbWU9InNjcmVlbl9iYWNrZ3JvdW5kX2RhcmsiPiNmZjEwMTAxMDwvZHJhd2FibGU+CiAgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfY2xvc2VkX2RlZmF1bHRfYmFja2dyb3VuZCI+I2ZmMDAwMDAwPC9kcmF3YWJsZT4KICAgICA8ZHJhd2FibGUgbmFtZT0ic3RhdHVzX2Jhcl9vcGVuZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIj4jZmYwMDAwMDA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzZWFyY2hfYmFyX2RlZmF1bHRfY29sb3IiPiNmZjAwMDAwMDwvZHJhd2FibGU+CkBAIC0zNiwyNCArMzYsMzAgQEAKICAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmZmZjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImJsYWNrIj4jZmYwMDAwMDA8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJ0cmFuc3BhcmVudCI+IzAwMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmFja2dyb3VuZF9kYXJrIj4jZmYwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9kYXJrIj4jZmZmZmZmZmY8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJiYWNrZ3JvdW5kX2RhcmsiPiNmZjEwMTAxMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfbGlnaHQiPiNmZmVmZWZlZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2RhcmsiPkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfbGlnaHQ8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodCI+QGFuZHJvaWQ6Y29sb3IvYmFja2dyb3VuZF9kYXJrPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCI+IzgwZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj4jZmYwMDAwMDA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYnJpZ2h0X2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2JyaWdodF9mb3JlZ3JvdW5kX2Rhcms8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9kYXJrIj4jYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19kaXNhYmxlZCI+IzgwYmViZWJlPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlIj4jMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfZGFya19pbnZlcnNlX2Rpc2FibGVkIj4jODAzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJoaW50X2ZvcmVncm91bmRfZGFyayI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJhY2tncm91bmRfbGlnaHQiPiNmZmZmZmZmZjwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJyaWdodF9mb3JlZ3JvdW5kX2xpZ2h0Ij4jZmYwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9pbnZlcnNlIj4jZmZmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJicmlnaHRfZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMDAwMDAwPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHQiPiMzMjMyMzI8L2NvbG9yPgogICAgIDxjb2xvciBuYW1lPSJkaW1fZm9yZWdyb3VuZF9saWdodF9kaXNhYmxlZCI+IzgwMzIzMjMyPC9jb2xvcj4KICAgICA8Y29sb3IgbmFtZT0iZGltX2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZSI+I2JlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImRpbV9mb3JlZ3JvdW5kX2xpZ2h0X2ludmVyc2VfZGlzYWJsZWQiPiM4MGJlYmViZTwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9ImhpbnRfZm9yZWdyb3VuZF9saWdodCI+IzgwODA4MDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodF9iYWNrZ3JvdW5kIj4jY2M0NzU5MjU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRfYmFja2dyb3VuZF9pbnZlcnNlIj4jY2NkMmU0NjE8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJoaWdobGlnaHRlZF90ZXh0X2RhcmsiPiNjYzQ3NTkyNTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImhpZ2hsaWdodGVkX3RleHRfbGlnaHQiPiNjY2QyZTQ2MTwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImxpbmtfdGV4dF9kYXJrIj4jNWM1Y2ZmPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0ibGlua190ZXh0X2xpZ2h0Ij4jMDAwMGVlPC9jb2xvcj4KIAogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0X25vdGlmeV9zeW5jX25vYW5pbSI+QGRyYXdhYmxlL3N0YXRfbm90aWZ5X3N5bmNfYW5pbTA8L2RyYXdhYmxlPgogICAgIDxkcmF3YWJsZSBuYW1lPSJzdGF0X3N5c19kb3dubG9hZF9kb25lIj5AZHJhd2FibGUvc3RhdF9zeXNfZG93bmxvYWRfYW5pbTA8L2RyYXdhYmxlPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDgwMGVkMTMuLmFjNTgyOGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTIyLDcgKzIyLDggQEAKIDxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgogICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN0YXR1cyBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCiAgICAgICAgICBpbnRlcmZhY2UuICBUaGlzIG5hbWUgaXMgaW4gdGhlIENvbXBvbmVudE5hbWUgZmxhdHRlbmVkIGZvcm1hdCAocGFja2FnZS9jbGFzcykgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCI+Y29tLmFuZHJvaWQuc3lzdGVtdWkvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJDb21wb25lbnQiPmNvbS5hbmRyb2lkLnN5c3RlbXVpL2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5QaG9uZVN0YXR1c0JhclNlcnZpY2U8L3N0cmluZz4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+dHJ1ZTwvYm9vbD4KIAogICAgIDwhLS0gRG8gbm90IHRyYW5zbGF0ZS4gRGVmaW5lcyB0aGUgc2xvdHMgZm9yIHRoZSByaWdodC1oYW5kIHNpZGUgaWNvbnMuICBUaGF0IGlzIHRvIHNheSwgdGhlCiAgICAgICAgICBpY29ucyBpbiB0aGUgc3RhdHVzIGJhciB0aGF0IGFyZSBub3Qgbm90aWZpY2F0aW9ucy4gLS0+CkBAIC03Miw2ICs3MywxNyBAQAogICAgICAgICAgd2hlbiB0aGVyZSdzIG5vIG5ldHdvcmsgY29ubmVjdGlvbi4gSWYgdGhlIHNjYW4gZG9lc24ndCB0aW1lb3V0LCB1c2UgemVybyAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfcmFkaW9TY2FubmluZ1RpbWVvdXQiPjA8L2ludGVnZXI+CiAKKyAgICA8IS0tIFNldCB0byB0cnVlIGlmIHRoZSBsb2NhdGlvbiByZXR1cm5lZCBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKQorICAgICAgICAgaXMgYWN0dWFsbHkgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGludGVybmFsIHN0b3JhZ2UuCisgICAgICAgICBJZiB0aGlzIGlzIHNldCB0aGVuIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZVN0YXRlKCkgd2lsbCBhbHdheXMgcmV0dXJuCisgICAgICAgICBNRURJQV9NT1VOVEVEIGFuZCBJbnRlbnQuQUNUSU9OX01FRElBX01PVU5URUQgd2lsbCBiZSBicm9hZGNhc3QgYXQgYm9vdCB0aW1lCisgICAgICAgICBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGFwcHMgdGhhdCByZXF1aXJlIGV4dGVybmFsIHN0b3JhZ2UuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbXVsYXRlRXh0ZXJuYWxTdG9yYWdlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gU2V0IHRvIHRydWUgaWYgZXh0ZXJuYWwgc3RvcmFnZSBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgIFR5cGljYWxseSBleHRlcm5hbCBzdG9yYWdlIGlzIEZBVCwgd2hpY2ggaXMgY2FzZSBpbnNlbnNpdGl2ZS4gLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2Nhc2VTZW5zaXRpdmVFeHRlcm5hbFN0b3JhZ2UiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBYWFhYWCBOT1RFIFRIRSBGT0xMT1dJTkcgUkVTT1VSQ0VTIFVTRSBUSEUgV1JPTkcgTkFNSU5HIENPTlZFTlRJT04uCiAgICAgICAgICBQbGVhc2UgZG9uJ3QgY29weSB0aGVtLCBjb3B5IGFueXRoaW5nIGVsc2UuIC0tPgogCkBAIC05OCw2ICsxMTAsOSBAQAogICAgICAgICA8aXRlbT4iMCwxIjwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gVGhlIG1heGltdW0gZHVyYXRpb24gKGluIG1pbGxpc2Vjb25kcykgd2UgZXhwZWN0IGEgbmV0d29yayB0cmFuc2l0aW9uIHRvIHRha2UgLS0+CisgICAgPGludGVnZXIgbmFtZT0iY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCI+NjAwMDA8L2ludGVnZXI+CisKICAgICA8IS0tIExpc3Qgb2YgcmVnZXhwcmVzc2lvbnMgZGVzY3JpYmluZyB0aGUgaW50ZXJmYWNlIChpZiBhbnkpIHRoYXQgcmVwcmVzZW50IHRldGhlcmFibGUKICAgICAgICAgIFVTQiBpbnRlcmZhY2VzLiAgSWYgdGhlIGRldmljZSBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCB0ZXRoaW5nIG92ZXIgVVNCIHRoaXMgc2hvdWxkCiAgICAgICAgICBiZSBlbXB0eS4gIEFuIGV4YW1wbGUgd291bGQgYmUgInVzYi4qIiAtLT4KQEAgLTExMCw2ICsxMjUsMTIgQEAKICAgICA8c3RyaW5nLWFycmF5IHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9ImNvbmZpZ190ZXRoZXJfd2lmaV9yZWdleHMiPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBMaXN0IG9mIHJlZ2V4cHJlc3Npb25zIGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSAoaWYgYW55KSB0aGF0IHJlcHJlc2VudCB0ZXRoZXJhYmxlCisgICAgICAgICBibHVldG9vdGggaW50ZXJmYWNlcy4gIElmIHRoZSBkZXZpY2UgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgdGV0aGVyaW5nIG92ZXIgYmx1ZXRvb3RoIHRoaXMKKyAgICAgICAgIHNob3VsZCBiZSBlbXB0eS4gLS0+CisgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX2JsdWV0b290aF9yZWdleHMiPgorICAgIDwvc3RyaW5nLWFycmF5PgorCiAgICAgPCEtLSBEaGNwIHJhbmdlIChtaW4sIG1heCkgdG8gdXNlIGZvciB0ZXRoZXJpbmcgcHVycG9zZXMgLS0+CiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UiPgogICAgIDwvc3RyaW5nLWFycmF5PgpAQCAtMTkxLDYgKzIxMiw5IEBACiAgICAgPCEtLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBTRCBjYXJkIGlzIGFjY2Vzc2libGUgd2l0aG91dCByZW1vdmluZyB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2JhdHRlcnlTZENhcmRBY2Nlc3NpYmlsaXR5Ij5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gSW5kaWNhdGUgd2hldGhlciB0aGUgZGV2aWNlIGhhcyBVU0IgaG9zdCBzdXBwb3J0LiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfaGFzVXNiSG9zdFN1cHBvcnQiPmZhbHNlPC9ib29sPgorCiAgICAgPCEtLSBWaWJyYXRvciBwYXR0ZXJuIGZvciBmZWVkYmFjayBhYm91dCBhIGxvbmcgc2NyZWVuL2tleSBwcmVzcyAtLT4KICAgICA8aW50ZWdlci1hcnJheSBuYW1lPSJjb25maWdfbG9uZ1ByZXNzVmliZVBhdHRlcm4iPgogICAgICAgICA8aXRlbT4wPC9pdGVtPgpAQCAtMjczLDYgKzI5NywxNSBAQAogICAgIDwhLS0gQWxsb3cgdGhlIG1lbnUgaGFyZCBrZXkgdG8gYmUgZGlzYWJsZWQgaW4gTG9ja1NjcmVlbiBvbiBzb21lIGRldmljZXMgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2Rpc2FibGVNZW51S2V5SW5Mb2NrU2NyZWVuIj5mYWxzZTwvYm9vbD4KIAorICAgIDwhLS0gU2hvdyBzbGlkaW5nIHRhYiBiZWZvcmUgbG9ja3NjcmVlbiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZW5hYmxlU2xpZGluZ1RhYkZpcnN0Ij50cnVlPC9ib29sPgorCisgICAgPCEtLSBEaWFibGUgbG9ja3NjcmVlbiByb3RhdGlvbiBieSBkZWZhdWx0IC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24iPmZhbHNlPC9ib29sPgorCisgICAgPCEtLSBFbmFibGUgM0QgUmVjZW50QXBwbGljYXRpb25zIHZpZXcgLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZVJlY2VudEFwcHMzRCI+ZmFsc2U8L2Jvb2w+CisKICAgICA8IS0tIEFycmF5IG9mIGxpZ2h0IHNlbnNvciBMVVggdmFsdWVzIHRvIGRlZmluZSBvdXIgbGV2ZWxzIGZvciBhdXRvIGJhY2tsaWdodCBicmlnaHRuZXNzIHN1cHBvcnQuCiAgICAgICAgICBUaGUgTiBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgZGVmaW5lIE4gKyAxIHpvbmVzIGFzIGZvbGxvd3M6CiAKQEAgLTM1Nyw0ICszOTAsMjMgQEAKICAgICA8IS0tIDIgbWVhbnMgZ2l2ZSB3YXJuaW5nIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19kYXRhdXNlX25vdGlmaWNhdGlvbl90eXBlIj4yPC9pbnRlZ2VyPgogCisgICAgPCEtLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgY3VycmVudCBkZXZpY2UgaXMgInZvaWNlIGNhcGFibGUiLgorICAgICAgICAgSWYgdHJ1ZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBkZXZpY2Ugc3VwcG9ydHMgY2lyY3VpdC1zd2l0Y2hlZAorICAgICAgICAgKGkuZS4gdm9pY2UpIHBob25lIGNhbGxzIG92ZXIgdGhlIHRlbGVwaG9ueSBuZXR3b3JrLCBhbmQgaXMKKyAgICAgICAgIGFsbG93ZWQgdG8gZGlzcGxheSB0aGUgaW4tY2FsbCBVSSB3aGlsZSBhIGNlbGx1bGFyIHZvaWNlIGNhbGwgaXMKKyAgICAgICAgIGFjdGl2ZS4gIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gdG8gZmFsc2UgZm9yICJkYXRhIG9ubHkiIGRldmljZXMKKyAgICAgICAgIHdoaWNoIGNhbid0IG1ha2Ugdm9pY2UgY2FsbHMgYW5kIGRvbid0IHN1cHBvcnQgYW55IGluLWNhbGwgVUkuCisKKyAgICAgICAgIE5vdGU6IHRoaXMgZmxhZyBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgICAgICBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSBzeXN0ZW0gZmVhdHVyZSwgd2hpY2ggaXMKKyAgICAgICAgIGF2YWlsYWJsZSBvbiAqYW55KiBkZXZpY2Ugd2l0aCBhIHRlbGVwaG9ueSByYWRpbywgZXZlbiBpZiB0aGUKKyAgICAgICAgIGRldmljZSBpcyBkYXRhLW9ubHkuIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ192b2ljZV9jYXBhYmxlIj50cnVlPC9ib29sPgorCisgICAgPCEtLSBJUCBhZGRyZXNzIG9mIHRoZSBkbnMgc2VydmVyIHRvIHVzZSBpZiBub2JvZHkgZWxzZSBzdWdnZXN0cyBvbmUgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfZGVmYXVsdF9kbnNfc2VydmVyIj44LjguOC44PC9zdHJpbmc+CisKKyAgICA8IS0tIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBzZXQgZm9yIEdzbUFscGhhYmV0IC0tPgorICAgIDwhLS0gRW1wdHkgc3RyaW5nIG1lYW5zIE1CQ1MgaXMgbm90IGNvbnNpZGVyZWQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJnc21fYWxwaGFiZXRfZGVmYXVsdF9jaGFyc2V0Ij48L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmluZGV4IDExZjNlNTAuLmQzYWEyZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTI1LDYgKzI1LDkgQEAKICAgICA8IS0tIFRoZSBzdGFuZGFyZCBzaXplIChib3RoIHdpZHRoIGFuZCBoZWlnaHQpIG9mIGFuIGFwcGxpY2F0aW9uIGljb24gdGhhdAogICAgICAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGFwcCBsYXVuY2hlciBhbmQgZWxzZXdoZXJlLiAtLT4KICAgICA8ZGltZW4gbmFtZT0iYXBwX2ljb25fc2l6ZSI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gVGhlIHN0YW5kYXJkIHNpemUgKGJvdGggd2lkdGggYW5kIGhlaWdodCkgb2YgYW4gYWN0aW9uIGljb24gdGhhdCB3aWxsCisgICAgICAgICBiZSBkaXNwbGF5ZWQgaW4gYXBwbGljYXRpb24gYWN0aW9uIGJhcnMuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJhY3Rpb25faWNvbl9zaXplIj40OGRpcDwvZGltZW4+CiAgICAgPGRpbWVuIG5hbWU9InRvYXN0X3lfb2Zmc2V0Ij42NGRpcDwvZGltZW4+CiAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij4yNWRpcDwvZGltZW4+CkBAIC0zMiwxNCArMzUsMTggQEAKICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjI1ZGlwPC9kaW1lbj4KICAgICA8IS0tIE1hcmdpbiBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIGlnbm9yZSB0b3VjaCBldmVudHMgZm9yIGluIHRoZSB3aW5kb3dzaGFkZS4gLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfZWRnZV9pZ25vcmUiPjVkcDwvZGltZW4+CisgICAgPCEtLSBNYXJnaW4gZm9yIHBlcm1hbmVudCBzY3JlZW4gZGVjb3JhdGlvbnMgYXQgdGhlIGJvdHRvbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9InNjcmVlbl9tYXJnaW5fYm90dG9tIj4wZGlwPC9kaW1lbj4KICAgICA8IS0tIFNpemUgb2YgdGhlIGZhc3RzY3JvbGwgaGludCBsZXR0ZXIgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImZhc3RzY3JvbGxfb3ZlcmxheV9zaXplIj4xMDRkcDwvZGltZW4+CiAgICAgPCEtLSBXaWR0aCBvZiB0aGUgZmFzdHNjcm9sbCB0aHVtYiAtLT4KICAgICA8ZGltZW4gbmFtZT0iZmFzdHNjcm9sbF90aHVtYl93aWR0aCI+NjRkcDwvZGltZW4+CiAgICAgPCEtLSBIZWlnaHQgb2YgdGhlIGZhc3RzY3JvbGwgdGh1bWIgLS0+CiAgICAgPGRpbWVuIG5hbWU9ImZhc3RzY3JvbGxfdGh1bWJfaGVpZ2h0Ij41MmRwPC9kaW1lbj4KLSAgICA8IS0tIERlZmF1bHQgaGVpZ2h0IG9mIGEga2V5IGluIHRoZSBwYXNzd29yZCBrZXlib2FyZCAtLT4KLSAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCI+NTZkaXA8L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBhbHBoYSAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSI+NTZkaXA8L2RpbWVuPgorICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIGZvciBudW1lcmljIC0tPgorICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiPjU2ZGlwPC9kaW1lbj4KICAgICA8IS0tIERlZmF1bHQgY29ycmVjdGlvbiBmb3IgdGhlIHNwYWNlIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX3NwYWNlYmFyX3ZlcnRpY2FsX2NvcnJlY3Rpb24iPjRkaXA8L2RpbWVuPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2lkcy54bWwKaW5kZXggOGI2YWY3MS4uMzNjZDEwMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9pZHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvaWRzLnhtbApAQCAtNTksNiArNTksNyBAQAogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY29weSIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InBhc3RlIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0iY29weVVybCIgLz4KKyAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InNlbGVjdFRleHRNb2RlIiAvPgogICA8aXRlbSB0eXBlPSJpZCIgbmFtZT0ic3dpdGNoSW5wdXRNZXRob2QiIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJrZXlib2FyZFZpZXciIC8+CiAgIDxpdGVtIHR5cGU9ImlkIiBuYW1lPSJjbG9zZUJ1dHRvbiIgLz4KQEAgLTY4LDQgKzY5LDUgQEAKICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImFjY291bnRQcmVmZXJlbmNlcyIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9InNtYWxsSWNvbiIgLz4KICAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImN1c3RvbSIgLz4KKyAgPGl0ZW0gdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbAppbmRleCAyOGE3Y2NhLi44NmU1NTc5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCkBAIC0xMTgzLDcgKzExODMsNyBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNvbG9yQmFja2dyb3VuZENhY2hlSGludCIgaWQ9IjB4MDEwMTAyYWIiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZHJvcERvd25Ib3Jpem9udGFsT2Zmc2V0IiBpZD0iMHgwMTAxMDJhYyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJkcm9wRG93blZlcnRpY2FsT2Zmc2V0IiBpZD0iMHgwMTAxMDJhZCIgLz4KLSAgCisKICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyIiBpZD0iMHgwMTAzMDA1ZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuV2FsbHBhcGVyLk5vVGl0bGVCYXIiIGlkPSIweDAxMDMwMDVmIiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5XYWxscGFwZXIuTm9UaXRsZUJhci5GdWxsc2NyZWVuIiBpZD0iMHgwMTAzMDA2MCIgLz4KQEAgLTExOTEsNyArMTE5MSw3IEBACiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkxpZ2h0LldhbGxwYXBlclNldHRpbmdzIiBpZD0iMHgwMTAzMDA2MiIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU2VhcmNoUmVzdWx0LlRpdGxlIiBpZD0iMHgwMTAzMDA2MyIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU2VhcmNoUmVzdWx0LlN1YnRpdGxlIiBpZD0iMHgwMTAzMDA2NCIgLz4KLSAgCisKICAgPCEtLSBTZW1pLXRyYW5zcGFyZW50IGJhY2tncm91bmQgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHBsYWNpbmcgYSBkYXJrCiAgICAgICAgdGhlbWVkIFVJIG9uIHRvcCBvZiBzb21lIGFyYml0cmFyeSBiYWNrZ3JvdW5kIChzdWNoIGFzIHRoZQogICAgICAgIHdhbGxwYXBlcikuICBUaGlzIGRhcmtlbnMgdGhlIGJhY2tncm91bmQgc3VmZmljaWVudGx5IHRoYXQgdGhlIFVJCkBAIC0xMTk5LDcgKzExOTksNyBAQAogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzY3JlZW5fYmFja2dyb3VuZF9kYXJrX3RyYW5zcGFyZW50IiBpZD0iMHgwMTA4MDBhOSIgLz4KICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ic2NyZWVuX2JhY2tncm91bmRfbGlnaHRfdHJhbnNwYXJlbnQiIGlkPSIweDAxMDgwMGFhIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJzdGF0X25vdGlmeV9zZGNhcmRfcHJlcGFyZSIgaWQ9IjB4MDEwODAwYWIiIC8+Ci0gIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA2IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIDIuMC4xKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTIxMSw3ICsxMjExLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dTbWFsbCIgaWQ9IjB4MDEwMTAyYjEiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icXVpY2tDb250YWN0QmFkZ2VTdHlsZVNtYWxsV2luZG93TWVkaXVtIiBpZD0iMHgwMTAxMDJiMiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJxdWlja0NvbnRhY3RCYWRnZVN0eWxlU21hbGxXaW5kb3dMYXJnZSIgaWQ9IjB4MDEwMTAyYjMiIC8+Ci0gIAorCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiA3IG9mIHRoZSBwbGF0Zm9ybSAoRWNsYWlyIE1SMSkuCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTEyMjAsNyArMTIyMCw3IEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXV0aG9yIiBpZD0iMHgwMTAxMDJiNCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhdXRvU3RhcnQiIGlkPSIweDAxMDEwMmI1IiAvPgogCi0gICAgCisKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDggb2YgdGhlIHBsYXRmb3JtIChFY2xhaXIgTVIyKS4KICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgpAQCAtMTI0MSwyMyArMTI0MSwyMCBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRhYlN0cmlwRW5hYmxlZCIgaWQ9IjB4MDEwMTAyYmQiIC8+CiAKICAgPHB1YmxpYyB0eXBlPSJpZCIgbmFtZT0iY3VzdG9tIiBpZD0iMHgwMTAyMDAyYiIgLz4KLSAgICAKKwogICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImN5Y2xlX2ludGVycG9sYXRvciIgaWQ9IjB4MDEwYTAwMGMiIC8+CiAKIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFJlc291cmNlcyBpbnRyb2R1Y2VkIGluIEdpbmdlcmJyZWFkLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgIAorICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsb2dvIiBpZD0iMHgwMTAxMDJiZSIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ4bGFyZ2VTY3JlZW5zIiBpZD0iMHgwMTAxMDJiZiIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpbW1lcnNpdmUiIGlkPSIweDAxMDEwMmMwIiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im92ZXJzY3JvbGxNb2RlIiBpZD0iMHgwMTAxMDJjMSIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvdmVyc2Nyb2xsSGVhZGVyIiBpZD0iMHgwMTAxMDJjMiIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJvdmVyc2Nyb2xsRm9vdGVyIiBpZD0iMHgwMTAxMDJjMyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmaWx0ZXJUb3VjaGVzV2hlbk9ic2N1cmVkIiBpZD0iMHgwMTAxMDJjNCIgLz4KIAogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iYXR0ciIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDEwMzAwIiAvPgotICAKKwogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iaWQiIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTAyMDA0MCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImFuaW0iIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTBhMDAyMCIgLz4KIApAQCAtMTI2OCw5ICsxMjY1LDggQEAKICAgPHB1YmxpYyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0icHJlc2VuY2VfYXVkaW9fYXdheSIgaWQ9IjB4MDEwODAwYWYiIC8+CiAgIDxwdWJsaWMgdHlwZT0iZHJhd2FibGUiIG5hbWU9InByZXNlbmNlX2F1ZGlvX2J1c3kiIGlkPSIweDAxMDgwMGIwIiAvPgogICA8cHVibGljIHR5cGU9ImRyYXdhYmxlIiBuYW1lPSJwcmVzZW5jZV9hdWRpb19vbmxpbmUiIGlkPSIweDAxMDgwMGIxIiAvPgotCiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJkcmF3YWJsZSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDgwMTAwIiAvPgotICAKKwogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiIGlkPSIweDAxMDMwMDY1IiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiIgaWQ9IjB4MDEwMzAwNjYiIC8+CiAgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiIGlkPSIweDAxMDMwMDY3IiAvPgpAQCAtMTI4NCw0ICsxMjgwLDEwNCBAQAogICA8cHVibGljLXBhZGRpbmcgdHlwZT0iZGltZW4iIG5hbWU9ImtyYWtlbl9yZXNvdXJjZV9wYWQiIGVuZD0iMHgwMTA1MDAxMCIgLz4KICAgPHB1YmxpYy1wYWRkaW5nIHR5cGU9ImNvbG9yIiBuYW1lPSJrcmFrZW5fcmVzb3VyY2VfcGFkIiBlbmQ9IjB4MDEwNjAwMjAiIC8+CiAgIDxwdWJsaWMtcGFkZGluZyB0eXBlPSJhcnJheSIgbmFtZT0ia3Jha2VuX3Jlc291cmNlX3BhZCIgZW5kPSIweDAxMDcwMDEwIiAvPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXNvdXJjZXMgcHJvcG9zZWQgZm9yIEhvbmV5Y29tYi4KKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8ZWF0LWNvbW1lbnQgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhZGFwdGVyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InNlbGVjdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzb3J0T3JkZXIiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idXJpIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyb20iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idG8iIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJvbVZhbHVlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29sdW1uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhFeHByZXNzaW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpdGhDbGFzcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbGxDb250YWN0c05hbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJhclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im5hdmlnYXRpb25Nb2RlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRpc3BsYXlPcHRpb25zIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN1YnRpdGxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImN1c3RvbU5hdmlnYXRpb25MYXlvdXQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaGFyZHdhcmVBY2NlbGVyYXRlZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJtZWFzdXJlV2l0aExhcmdlc3RDaGlsZCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbmltYXRlRmlyc3RWaWV3IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImRyb3BEb3duU3Bpbm5lclN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkRyb3BEb3duU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic2hvd0FzQWN0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icHJldmlld0ltYWdlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlRnJvbSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2YWx1ZVRvIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InZhbHVlVHlwZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJwcm9wZXJ0eU5hbWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ib3JkZXJpbmciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iZnJhZ21lbnQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2luZG93QWN0aW9uQmFyT3ZlcmxheSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudE9wZW5FbnRlckFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmcmFnbWVudENsb3NlRXhpdEFuaW1hdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25CYXJTaXplIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImltZVN1YnR5cGVMb2NhbGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZU1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3BsaXRNb3Rpb25FdmVudHMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3Bpbm5lck1vZGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYW5pbWF0ZUxheW91dENoYW5nZXMiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaXRlbVBhZGRpbmciIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGl0bGVUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VidGl0bGVUZXh0U3R5bGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaWNvbmlmaWVkQnlEZWZhdWx0IiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkxheW91dCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25WaWV3Q2xhc3MiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhbmltIiBuYW1lPSJhbmltYXRvcl9mYWRlX2luIiAvPgorICA8cHVibGljIHR5cGU9ImFuaW0iIG5hbWU9ImFuaW1hdG9yX2ZhZGVfb3V0IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iaWQiIG5hbWU9ImhvbWUiIC8+CisgIDwhLS0gQ29udGV4dCBtZW51IElEIGZvciB0aGUgIlNlbGVjdCB0ZXh0Li4uIiBtZW51IGl0ZW0gdG8gc3dpdGNoIHRvIHRleHQKKyAgICAgICBzZWxlY3Rpb24gY29udGV4dCBtb2RlIGluIHRleHQgdmlld3MuIC0tPgorICA8cHVibGljIHR5cGU9ImlkIiBuYW1lPSJzZWxlY3RUZXh0TW9kZSIgLz4KKyAgCisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLldpdGhBY3Rpb25CYXIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5TcGlubmVyLkRyb3BEb3duIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5EaWFsb2cuTm9GcmFtZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTm9UaXRsZUJhci5PdmVybGF5QWN0aW9uTW9kZXMiIC8+CisKKyAgPCEtLSBTdGFuZGFyZCBjb250ZW50IHZpZXcgZm9yIGEge0BsaW5rIGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudH0uCisgICAgICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYSBzdWJjbGFzcyBvZiBMaXN0RnJhZ21lbnQgd2l0aCB5b3VyCisgICAgICAgb3duIGN1c3RvbWl6ZWQgY29udGVudCwgeW91IGNhbiBpbmNsdWRlIHRoaXMgbGF5b3V0IGluIHRoYXQKKyAgICAgICBjb250ZW50IHRvIHN0aWxsIHJldGFpbiBhbGwgb2YgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uYWxpdHkgb2YKKyAgICAgICB0aGUgYmFzZSBjbGFzcy4gLS0+CisgIDxwdWJsaWMgdHlwZT0ibGF5b3V0IiBuYW1lPSJsaXN0X2NvbnRlbnQiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuTGlnaHQuSG9sbyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhciIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5Ob0FjdGlvbkJhci5GdWxsc2NyZWVuIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iIC8+CisKKyAgPCEtLSBBIHNpbXBsZSBMaXN0VmlldyBpdGVtIGxheW91dCB3aGljaCBjYW4gY29udGFpbiB0ZXh0IGFuZCBzdXBwb3J0IChzaW5nbGUgb3IgbXVsdGlwbGUpIGl0ZW0gc2VsZWN0aW9uLiAtLT4KKyAgPHB1YmxpYyB0eXBlPSJsYXlvdXQiIG5hbWU9InNpbXBsZV9zZWxlY3RhYmxlX2xpc3RfaXRlbSIgaWQ9IjB4MDEwOTAwMjIiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHJpbmciIG5hbWU9InNlbGVjdFRleHRNb2RlIiBpZD0iMHgwMTA0MDAzMCIgLz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA1OTEzNjM5Li40MzNjMDA1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTI4Myw5ICsyODMsMTUgQEAKICAgICA8IS0tIFNodXRkb3duIENvbmZpcm1hdGlvbiBEaWFsb2cuICBXaGVuIHRoZSB1c2VyIGNob29zZXMgdG8gcG93ZXIgb2ZmIHRoZSBwaG9uZSwgdGhlcmUgd2lsbCBiZSBhIGNvbmZpcm1hdGlvbiBkaWFsb2cuICBUaGlzIGlzIHRoZSBtZXNzYWdlLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNodXRkb3duX2NvbmZpcm0iPllvdXIgcGhvbmUgd2lsbCBzaHV0IGRvd24uPC9zdHJpbmc+CiAKLSAgICA8IS0tIFJlY2VudCBUYXNrcyBkaWFsb2c6IHRpdGxlIC0tPgorICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogdGl0bGUKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KICAgICA8c3RyaW5nIG5hbWU9InJlY2VudF90YXNrc190aXRsZSI+UmVjZW50PC9zdHJpbmc+Ci0gICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIHJlY2VudCBhcHBsaWNhdGlvbnMgLS0+CisgICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIHJlY2VudCBhcHBsaWNhdGlvbnMKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im5vX3JlY2VudF90YXNrcyI+Tm8gcmVjZW50IGFwcGxpY2F0aW9ucy48L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgb2YgdGhlIEdsb2JhbCBBY3Rpb25zIERpYWxvZyAtLT4KQEAgLTc5Myw4ICs3OTksOCBAQAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGVuZGFyIj5hZGQgb3IgbW9kaWZ5IGNhbGVuZGFyIGV2ZW50cyBhbmQgc2VuZCBlbWFpbCB0byBndWVzdHM8L3N0cmluZz4KICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsZW5kYXIiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBhZGQgb3IgY2hhbmdlIHRoZSAKLSAgICAgICAgZXZlbnRzIG9uIHlvdXIgY2FsZW5kYXIsIHdoaWNoIG1heSBzZW5kIGVtYWlsIHRvIGd1ZXN0cy4gTWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMgCisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNhbGVuZGFyIj5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gYWRkIG9yIGNoYW5nZSB0aGUKKyAgICAgICAgZXZlbnRzIG9uIHlvdXIgY2FsZW5kYXIsIHdoaWNoIG1heSBzZW5kIGVtYWlsIHRvIGd1ZXN0cy4gTWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRoaXMKICAgICAgICAgdG8gZXJhc2Ugb3IgbW9kaWZ5IHlvdXIgY2FsZW5kYXIgZXZlbnRzIG9yIHRvIHNlbmQgZW1haWwgdG8gZ3Vlc3RzLjwvc3RyaW5nPgogCiAgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CkBAIC0xMjM4LDYgKzEyNDQsMTEgQEAKICAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gd2lwZSB0aGUgdXNlcidzIGRhdGEgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3dpcGVEYXRhIj5QZXJmb3JtIGEgZmFjdG9yeSByZXNldCwgZGVsZXRpbmcKICAgICAgICAgYWxsIG9mIHlvdXIgZGF0YSB3aXRob3V0IGFueSBjb25maXJtYXRpb24uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgcG9saWN5IGFjY2VzcyB0byB3aXBlIHRoZSB1c2VyJ3MgZGF0YSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2Nfc2V0R2xvYmFsUHJveHkiPlNldCB0aGUgZGV2aWNlIGdsb2JhbCBwcm94eQorICAgICAgICB0byBiZSB1c2VkIHdoaWxlIHBvbGljeSBpcyBlbmFibGVkLiBPbmx5IHRoZSBmaXJzdCBkZXZpY2UgYWRtaW4KKyAgICAgICAgc2V0cyB0aGUgZWZmZWN0aXZlIGdsb2JhbCBwcm94eS48L3N0cmluZz4KIAogICAgIDwhLS0gVGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudCwgZG9uJ3QgcmVvcmRlciB3aXRob3V0IGNoYW5naW5nIENvbnRhY3RzLmphdmEgLS0+IDxza2lwIC8+CiAgICAgPCEtLSBQaG9uZSBudW1iZXIgdHlwZXMgZnJvbSBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLiBUaGlzIGNvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgcGhvbmUgbnVtYmVyIGZvciBhIGNvbnRhY3QsIGZvciBleGFtcGxlLiAtLT4KQEAgLTE0MDcsMjAgKzE0MTgsMTggQEAKICAgICA8IS0tIEN1c3RvbSBvcmdhbml6YXRpb24gdHlwZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im9yZ1R5cGVDdXN0b20iPkN1c3RvbTwvc3RyaW5nPgogCi0gICAgPCEtLSBBdHRidXRpb24gb2YgYSBjb250YWN0IHN0YXR1cyB1cGRhdGUsIHdoZW4gdGhlIHRpbWUgb2YgdXBkYXRlIGlzIHVua25vd24gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJjb250YWN0X3N0YXR1c191cGRhdGVfYXR0cmlidXRpb24iPnZpYSA8eGxpZmY6ZyBpZD0ic291cmNlIiBleGFtcGxlPSJHb29nbGUgVGFsayI+JTEkczwveGxpZmY6Zz48L3N0cmluZz4KLQotICAgIDwhLS0gQXR0YnV0aW9uIG9mIGEgY29udGFjdCBzdGF0dXMgdXBkYXRlLCB3aGVuIHRoZSB0aW1lIG9mIHVwZGF0ZSBpcyBrbm93biAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3Rfc3RhdHVzX3VwZGF0ZV9hdHRyaWJ1dGlvbl93aXRoX2RhdGUiPjx4bGlmZjpnIGlkPSJkYXRlIiBleGFtcGxlPSIzIGhvdXJzIGFnbyI+JTEkczwveGxpZmY6Zz4gdmlhIDx4bGlmZjpnIGlkPSJzb3VyY2UiIGV4YW1wbGU9Ikdvb2dsZSBUYWxrIj4lMiRzPC94bGlmZjpnPjwvc3RyaW5nPgotCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciBTSU0gUElOIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSI+RW50ZXIgUElOIGNvZGU8L3N0cmluZz4KIAotICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVpciB0ZXh0IHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCiAgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlIj5FbnRlciBwYXNzd29yZCB0byB1bmxvY2s8L3N0cmluZz4KIAorICAgIDwhLS0gSW5zdHJ1Y3Rpb25zIHRlbGxpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlaXIgUElOIHBhc3N3b3JkIHRvIHVubG9jayB0aGUga2V5Z3VhcmQuCisgICAgICAgICBEaXNwbGF5ZWQgaW4gb25lIGxpbmUgaW4gYSBsYXJnZSBmb250LiAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSI+RW50ZXIgUElOIHRvIHVubG9jazwvc3RyaW5nPgorCiAgICAgPCEtLSBJbnN0cnVjdGlvbnMgdGVsbGluZyB0aGUgdXNlciB0aGF0IHRoZXkgZW50ZXJlZCB0aGUgd3JvbmcgcGluIHdoaWxlIHRyeWluZwogICAgICAgICAgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4gIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlIj5JbmNvcnJlY3QgUElOIGNvZGUhPC9zdHJpbmc+CkBAIC0xNDU3LDYgKzE0NjYsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXR0ZXJuX2NvcnJlY3QiPkNvcnJlY3QhPC9zdHJpbmc+CiAgICAgPCEtLSBPbiB0aGUgdW5sb2NrIHBhdHRlcm4gc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXR0ZXJuIGFuZCBtdXN0IHRyeSBhZ2Fpbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BhdHRlcm5fd3JvbmciPlNvcnJ5LCB0cnkgYWdhaW48L3N0cmluZz4KKyAgICA8IS0tIE9uIHRoZSB1bmxvY2sgcGFzc3dvcmQgc2NyZWVuLCBzaG93biB3aGVuIHRoZSB1c2VyIGVudGVycyB0aGUgd3JvbmcgbG9jayBwYXNzd29yZCBhbmQgbXVzdCB0cnkgYWdhaW4uIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyI+U29ycnksIHRyeSBhZ2Fpbjwvc3RyaW5nPgogCiAgICAgPCEtLSBXaGVuIHRoZSBsb2NrIHNjcmVlbiBpcyBzaG93aW5nIGFuZCB0aGUgcGhvbmUgcGx1Z2dlZCBpbiwgYW5kIHRoZSBiYXR0ZXJ5CiAgICAgICAgICBpcyBub3QgZnVsbHkgY2hhcmdlZCwgc2hvdyB0aGUgY3VycmVudCBjaGFyZ2UgJS4gIC0tPgpAQCAtMTUwMCwxMiArMTUxMSwyNyBAQAogICAgICAgICAgcHJvZ3Jlc3MgZGlhbG9nIGluIHRoZSBtZWFudGltZS4gIHRoaXMgaXMgdGhlIGVtc3NhZ2UuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlIj5VbmxvY2tpbmcgU0lNIGNhcmRcdTIwMjY8L3N0cmluZz4KIAotICAgIDwhLS0gRm9yIHRoZSB1bmxvY2sgc2NyZWVuLCBJbmZvcm1hdGlvbiBtZXNzYWdlIHNob3duIGluIGRpYWxvZyB3aGVuIHVzZXIgaGFzIHRvbyBtYW55IGZhaWxlZCBhdHRlbXB0cyAtLT4KKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGRyYXdpbmcgdGhlIHVubG9jayBwYXR0ZXJuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgogICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBkcmF3biB5b3VyIHVubG9jayBwYXR0ZXJuIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KICAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCiAgICAgPC9zdHJpbmc+CiAKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBwYXNzd29yZCAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX3Bhc3N3b3JkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIj4KKyAgICAgICAgWW91IGhhdmUgaW5jb3JyZWN0bHkgZW50ZXJlZCB5b3VyIHBhc3N3b3JkIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGhhcyB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgYXQKKyAgICAgICAgIGVudGVyaW5nIHRoZSBQSU4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiPgorICAgICAgICBZb3UgaGF2ZSBpbmNvcnJlY3RseSBlbnRlcmVkIHlvdXIgUElOIDx4bGlmZjpnIGlkPSJudW1iZXIiPiVkPC94bGlmZjpnPiB0aW1lcy4KKyAgICAgICAgXG5cblBsZWFzZSB0cnkgYWdhaW4gaW4gPHhsaWZmOmcgaWQ9Im51bWJlciI+JWQ8L3hsaWZmOmc+IHNlY29uZHMuCisgICAgPC9zdHJpbmc+CisKICAgICA8IS0tIEZvciB0aGUgdW5sb2NrIHNjcmVlbiwgSW5mb3JtYXRpb24gbWVzc2FnZSBzaG93biBpbiBkaWFsb2cgd2hlbiB1c2VyIGlzIGFsbW9zdCBhdCB0aGUgbGltaXQKICAgICAgICAgIHdoZXJlIHRoZXkgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZCBtYXkgaGF2ZSB0byBlbnRlciBhbiBhbHRlcm5hdGUgdXNlcm5hbWUvcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBwaG9uZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iPgpAQCAtMTU3NSw4ICsxNjAxLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9yZWJvb3QiPlJlYm9vdDwvc3RyaW5nPgogCiAgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHN0cmluZyAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj48eGxpZmY6ZyBpZD0ieCI+TW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkICVzKQotICAgICAgICBBcHBsZVdlYktpdC81MzMuMSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZSBTYWZhcmkvNTMzLjE8L3hsaWZmOmc+PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+TW96aWxsYS81LjAgKExpbnV4OyBVOyA8eGxpZmY6ZyBpZD0ieCI+QW5kcm9pZCAlczwveGxpZmY6Zz4pCisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC43IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgPHhsaWZmOmcgaWQ9Im1vYmlsZSI+JXM8L3hsaWZmOmc+U2FmYXJpLzUzNC43PC9zdHJpbmc+CisgICAgPCEtLSBEbyBub3QgdHJhbnNsYXRlLiAgV2ViVmlldyBVc2VyIEFnZW50IHRhcmdldGVkIGNvbnRlbnQgLS0+CisgICAgPHN0cmluZyBuYW1lPSJ3ZWJfdXNlcl9hZ2VudF90YXJnZXRfY29udGVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Ik1vYmlsZSAiPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIGZvciBhIEphdmFTY3JpcHQgZGlhbG9nLiAiVGhlIHBhZ2UgYXQgPHVybCBvZiBjdXJyZW50IHBhZ2U+IHNheXM6IiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImpzX2RpYWxvZ190aXRsZSI+VGhlIHBhZ2UgYXQgXCc8eGxpZmY6ZyBpZD0idGl0bGUiPiVzPC94bGlmZjpnPlwnIHNheXM6PC9zdHJpbmc+CkBAIC0xODM5LDkgKzE4NjcsNiBAQAogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIFRoaXMgYWN0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGFsbCB0ZXh0IGluIHRoZSBlZGl0IGZpZWxkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNlbGVjdEFsbCI+U2VsZWN0IGFsbDwvc3RyaW5nPgogCi0gICAgPCEtLSBJdGVtIG9uIEVkaXRUZXh0IGNvbnRleHQgbWVudS4gVGhpcyBhY3Rpb24gaXMgdXNlZCB0byBzdGFydCBzZWxlY3RpbmcgdGV4dCBpbiB0aGUgZWRpdCBmaWVsZC4gW0NIQVIgTElNSVQ9MjBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ic2VsZWN0VGV4dCI+U2VsZWN0IHdvcmQ8L3N0cmluZz4KLQogICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuICBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIGN1dCBzZWxlY3RlZCB0aGUgdGV4dCBpbnRvIHRoZSBjbGlwYm9hcmQuICAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImN1dCI+Q3V0PC9zdHJpbmc+CiAKQEAgLTE4NTQsMTUgKzE4NzksMTcgQEAKICAgICA8IS0tIEl0ZW0gb24gRWRpdFRleHQgY29udGV4dCBtZW51LiBUaGlzIGFjdGlvbiBpcyB1c2VkIHRvIGNvcHkgYSBVUkwgZnJvbSB0aGUgZWRpdCBmaWVsZCBpbnRvIHRoZSBjbGlwYm9hcmQuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY29weVVybCI+Q29weSBVUkw8L3N0cmluZz4KIAorICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUuIEFkZGVkIG9ubHkgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG5vdCBlbXB0eSwgaXQgZW5hYmxlIHNlbGVjdGlvbiBjb250ZXh0IG1vZGUuIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNlbGVjdFRleHRNb2RlIj5TZWxlY3QgdGV4dC4uLjwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHNlbGVjdGlvbiBjb250ZXh0dWFsIG1vZGUgdGl0bGUsIGRpc3BsYXllZCBpbiB0aGUgQ0FCLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ0ZXh0U2VsZWN0aW9uQ0FCVGl0bGUiPlRleHQgc2VsZWN0aW9uPC9zdHJpbmc+CisKICAgICA8IS0tIEVkaXRUZXh0IGNvbnRleHQgbWVudSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImlucHV0TWV0aG9kIj5JbnB1dCBtZXRob2Q8L3N0cmluZz4KIAotICAgIDwhLS0gSXRlbSBvbiBFZGl0VGV4dCBjb250ZXh0IG1lbnUsIHVzZWQgdG8gYWRkIGEgd29yZCB0byB0aGUKLSAgICAgICAgIGlucHV0IG1ldGhvZCBkaWN0aW9uYXJ5LiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImFkZFRvRGljdGlvbmFyeSI+IkFkZCBcIjx4bGlmZjpnIGlkPSJ3b3JkIiBleGFtcGxlPSJyaWNrcm9sbCI+JXM8L3hsaWZmOmc+XCIgdG8gZGljdGlvbmFyeTwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBmb3IgRWRpdFRleHQgY29udGV4dCBtZW51IC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZWRpdFRleHRNZW51VGl0bGUiPkVkaXQgdGV4dDwvc3RyaW5nPgorICAgIDwhLS0gVGl0bGUgZm9yIEVkaXRUZXh0IGNvbnRleHQgbWVudSBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJlZGl0VGV4dE1lbnVUaXRsZSI+VGV4dCBhY3Rpb25zPC9zdHJpbmc+CiAKICAgICA8IS0tIElmIHRoZSBkZXZpY2UgaXMgZ2V0dGluZyBsb3cgb24gaW50ZXJuYWwgc3RvcmFnZSwgYSBub3RpZmljYXRpb24gaXMgc2hvd24gdG8gdGhlIHVzZXIuICBUaGlzIGlzIHRoZSB0aXRsZSBvZiB0aGF0IG5vdGlmaWNhdGlvbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJsb3dfaW50ZXJuYWxfc3RvcmFnZV92aWV3X3RpdGxlIj5Mb3cgb24gc3BhY2U8L3N0cmluZz4KQEAgLTE4ODEsNiArMTkwOCw5IEBACiAgICAgICAgICBjb21iaW5lZCB3aXRoIHNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCkgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfYWxlcnRfdGl0bGUiPkF0dGVudGlvbjwvc3RyaW5nPgogCisgICAgPCEtLSBUZXh0IHNob3duIGJ5IGxpc3QgZnJhZ21lbnQgd2hlbiB3YWl0aW5nIGZvciBkYXRhIHRvIGRpc3BsYXkuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibG9hZGluZyI+TG9hZGluZy4uLjwvc3RyaW5nPgorCiAgICAgPCEtLSBEZWZhdWx0IHRleHQgZm9yIGEgYnV0dG9uIHRoYXQgY2FuIGJlIHRvZ2dsZWQgb24gYW5kIG9mZi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIj5PTjwvc3RyaW5nPgogICAgIDwhLS0gRGVmYXVsdCB0ZXh0IGZvciBhIGJ1dHRvbiB0aGF0IGNhbiBiZSB0b2dnbGVkIG9uIGFuZCBvZmYuIC0tPgpAQCAtMTkzNywyMyArMTk2NywyMyBAQAogCiAgICAgPCEtLSBOb3RpZmljYXRpb24gdGV4dCB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgYSBoZWF2eS13ZWlnaHQgYXBwbGljYXRpb24gaXMgcnVubmluZy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIj48eGxpZmY6ZyBpZD0iYXBwIj4lMSRzPC94bGlmZjpnPiBydW5uaW5nPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIE5vdGlmaWNhdGlvbiBkZXRhaWxzIHRvIHRlbGwgdGhlIHVzZXIgdGhhdCBhIGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb25fZGV0YWlsIj5TZWxlY3QgdG8gc3dpdGNoIHRvIGFwcGxpY2F0aW9uPC9zdHJpbmc+Ci0gICAgCisKICAgICA8IS0tIFRpdGxlIG9mIGRpYWxvZyBwcm9tcHRpbmcgd2hldGhlciB1c2VyIHdhbnRzIHRvIHN3aXRjaCBiZXR3ZWVuIGhlYXZ5LXdlaWdodCBhcHBzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9zd2l0Y2hlcl90aXRsZSI+U3dpdGNoIGFwcGxpY2F0aW9ucz88L3N0cmluZz4KLSAgICAKKwogICAgIDwhLS0gRGVzY3JpcHRpdmUgdGV4dCBmb3Igc3dpdGNoaW5nIHRvIGEgbmV3IGhlYXZ5LXdlaWdodCBhcHBsaWNhdGlvbi4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfc3dpdGNoZXJfdGV4dCI+QW5vdGhlciBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcKICAgICB0aGF0IG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgeW91IGNhbiBzdGFydCBhIG5ldyBvbmUuPC9zdHJpbmc+Ci0gICAgCisKICAgICA8c3RyaW5nIG5hbWU9Im9sZF9hcHBfYWN0aW9uIj5SZXR1cm4gdG8gPHhsaWZmOmcgaWQ9Im9sZF9hcHAiPiUxJHM8L3hsaWZmOmc+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJvbGRfYXBwX2Rlc2NyaXB0aW9uIj5Eb25cJ3Qgc3RhcnQgdGhlIG5ldyBhcHBsaWNhdGlvbi48L3N0cmluZz4KLSAgICAKKwogICAgIDxzdHJpbmcgbmFtZT0ibmV3X2FwcF9hY3Rpb24iPlN0YXJ0IDx4bGlmZjpnIGlkPSJvbGRfYXBwIj4lMSRzPC94bGlmZjpnPjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibmV3X2FwcF9kZXNjcmlwdGlvbiI+U3RvcCB0aGUgb2xkIGFwcGxpY2F0aW9uIHdpdGhvdXQgc2F2aW5nLjwvc3RyaW5nPgotICAgIAorCiAgICAgPCEtLSBEaXNwbGF5ZWQgaW4gdGhlIHRpdGxlIG9mIHRoZSBjaG9vc2VyIGZvciB0aGluZ3MgdG8gZG8gd2l0aCB0ZXh0IHRoYXQKICAgICAgICAgIGlzIHRvIGJlIHNlbnQgdG8gYW5vdGhlciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIEkgY2FuIHNlbmQKICAgICAgICAgIHRleHQgdGhyb3VnaCBTTVMgb3IgSU0uICBBIGRpYWxvZyB3aXRoIHRob3NlIGNob2ljZXMgd291bGQgYmUgc2hvd24sCkBAIC0yMjI1LDE3ICsyMjU1LDEzIEBACiAgICAgPCEtLSBMb2NhbGl6ZWQgc3RyaW5ncyBmb3IgV2ViVmlldyAtLT4KICAgICA8IS0tIExhYmVsIGZvciBidXR0b24gaW4gYSBXZWJWaWV3IHRoYXQgd2lsbCBvcGVuIGEgY2hvb3NlciB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIj5DaG9vc2UgZmlsZTwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHRoZSBmaWxlIHVwbG9hZCBjb250cm9sIHdoZW4gbm8gZmlsZSBoYXMgYmVlbiBjaG9zZW4geWV0IC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fZmlsZV9jaG9zZW4iPk5vIGZpbGUgY2hvc2VuPC9zdHJpbmc+CiAgICAgPCEtLSBMYWJlbCBmb3IgPGlucHV0IHR5cGU9InJlc2V0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCI+UmVzZXQ8L3N0cmluZz4KICAgICA8IS0tIExhYmVsIGZvciA8aW5wdXQgdHlwZT0ic3VibWl0Ij4gYnV0dG9uIGluIGh0bWwgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzdWJtaXQiPlN1Ym1pdDwvc3RyaW5nPgogCi0gICAgPCEtLSBTdHJpbmcgZGVzY3JpYmluZyB0aGUgU3Rhci9GYXZvcml0ZSBjaGVja2JveAotCi0gICAgICAgICBVc2VkIGJ5IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHRvIGFubm91bmNlIHRoZSBwdXJwb3NlIG9mIHRoZSB2aWV3LgotICAgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZGVzY3JpcHRpb25fc3RhciI+ZmF2b3JpdGU8L3N0cmluZz4KLQogICAgIDwhLS0gU3RyaW5ncyBmb3IgY2FyIG1vZGUgbm90aWZpY2F0aW9uIC0tPgogICAgIDwhLS0gU2hvd24gd2hlbiBjYXIgbW9kZSBpcyBlbmFibGVkIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iY2FyX21vZGVfZGlzYWJsZV9ub3RpZmljYXRpb25fdGl0bGUiPkNhciBtb2RlIGVuYWJsZWQ8L3N0cmluZz4KQEAgLTIyNDYsNiArMjI3MiwxMyBAQAogICAgIDxzdHJpbmcgbmFtZT0idGV0aGVyZWRfbm90aWZpY2F0aW9uX3RpdGxlIj5UZXRoZXJpbmcgb3IgaG90c3BvdCBhY3RpdmU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5Ub3VjaCB0byBjb25maWd1cmU8L3N0cmluZz4KIAorICAgIDwhLS0gIFN0cmluZ3MgZm9yIHBvc3NpYmxlIFByZWZlcmVuY2VBY3Rpdml0eSBCYWNrL05leHQgYnV0dG9ucyAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImJhY2tfYnV0dG9uX2xhYmVsIj5CYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJuZXh0X2J1dHRvbl9sYWJlbCI+TmV4dDwvc3RyaW5nPgorCisgICAgPCEtLSBPcHRpb25hbCBidXR0b24gdG8gU2tpcCBhIFByZWZlcmVuY2VBY3Rpdml0eSBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJza2lwX2J1dHRvbl9sYWJlbCI+U2tpcDwvc3RyaW5nPgorCiAgICAgPCEtLSBTdHJpbmdzIGZvciB0aHJvdHRsaW5nIG5vdGlmaWNhdGlvbiAtLT4KICAgICA8IS0tIFNob3duIHdoZW4gdGhlIHVzZXIgaXMgaW4gZGFuZ2VyIG9mIGJlaW5nIHRocm90dGxlZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlX3dhcm5pbmdfbm90aWZpY2F0aW9uX3RpdGxlIj5IaWdoIG1vYmlsZSBkYXRhIHVzZTwvc3RyaW5nPgpAQCAtMjI1NSw0ICsyMjg4LDIxIEBACiAgICAgPCEtLSBTaG93biB3aGVuIHRoZSB1c2VycyBiYW5kd2lkdGggaXMgcmVkdWNlZCBiZWNhdXNlIG9mIGV4Y2Vzc2l2ZSBkYXRhIHVzZSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InRocm90dGxlZF9ub3RpZmljYXRpb25fdGl0bGUiPk1vYmlsZSBkYXRhIGxpbWl0IGV4Y2VlZGVkPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aHJvdHRsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiPlRvdWNoIHRvIGxlYXJuIG1vcmUgYWJvdXQgbW9iaWxlIGRhdGEgdXNlPC9zdHJpbmc+CisKKyAgICA8IS0tIERpc3BsYXllZCBvbiB0aGUgRmluZCBkaWFsb2cgd2hlbiB0aGVyZSBhcmUgbm8gbWF0Y2hlcyBbQ0hBUiBMSU1JVD1OT05FXS0tPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fbWF0Y2hlcyI+Tm8gbWF0Y2hlczwvc3RyaW5nPgorCisgICAgPCEtLSBGaW5kIGRpYWxvZyBoaW50IHRleHQuICBBbHNvIHVzZWQgaW4gdGhlIG1lbnUgaXRlbSB0byBvcGVuIGZpbmQgb24gcGFnZSBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbmRfb25fcGFnZSI+RmluZCBvbiBwYWdlPC9zdHJpbmc+CisKKyAgICA8IS0tIERpc3BsYXllZCBvbiB0aGUgRmluZCBkaWFsb2cgdG8gZGlzcGxheSB0aGUgaW5kZXggb2YgdGhlIGhpZ2hsaWdodGVkCisgICAgICAgICBtYXRjaCBhbmQgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgcGFnZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHBsdXJhbHMgbmFtZT0ibWF0Y2hlc19mb3VuZCI+CisgICAgICAgIDwhLS0gQ2FzZSBvZiBvbmUgbWF0Y2ggLS0+CisgICAgICAgIDxpdGVtIHF1YW50aXR5PSJvbmUiPjEgbWF0Y2g8L2l0ZW0+CisgICAgICAgIDwhLS0gQ2FzZSBvZiBtdWx0aXBsZSB0b3RhbCBtYXRjaGVzIC0tPgorICAgICAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiPjx4bGlmZjpnIGlkPSJpbmRleCIgZXhhbXBsZT0iMiI+JWQ8L3hsaWZmOmc+IG9mIDx4bGlmZjpnIGlkPSJ0b3RhbCIgZXhhbXBsZT0iMTM3Ij4lZDwveGxpZmY6Zz48L2l0ZW0+CisgICAgPC9wbHVyYWxzPgorCisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmluZGV4IDFjNjBiYTAuLjMxYWE0OWEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTc0LDYgKzc0LDEwIEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhT3BlbkV4aXRBbmltYXRpb24iPkBhbmltL3dhbGxwYXBlcl9pbnRyYV9vcGVuX2V4aXQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndhbGxwYXBlckludHJhQ2xvc2VFbnRlckFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX2Nsb3NlX2VudGVyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ3YWxscGFwZXJJbnRyYUNsb3NlRXhpdEFuaW1hdGlvbiI+QGFuaW0vd2FsbHBhcGVyX2ludHJhX2Nsb3NlX2V4aXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50T3BlbkVudGVyQW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9vcGVuX2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJmcmFnbWVudE9wZW5FeGl0QW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9vcGVuX2V4aXQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50Q2xvc2VFbnRlckFuaW1hdGlvbiI+QGFuaW0vZnJhZ21lbnRfY2xvc2VfZW50ZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImZyYWdtZW50Q2xvc2VFeGl0QW5pbWF0aW9uIj5AYW5pbS9mcmFnbWVudF9jbG9zZV9leGl0PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8IS0tIFN0YW5kYXJkIGFuaW1hdGlvbnMgZm9yIGEgbm9uLWZ1bGwtc2NyZWVuIHdpbmRvdyBvciBhY3Rpdml0eS4gLS0+CkBAIC04OCw2ICs5MiwxMyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dFeGl0QW5pbWF0aW9uIj5AYW5pbS9zdGF0dXNfYmFyX2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDwhLS0ge0BoaWRlfSAtLT4KKyAgICA8c3R5bGUgbmFtZT0iQW5pbWF0aW9uLlN0YXR1c0Jhci5JbnRydWRlckFsZXJ0IgorICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL0FuaW1hdGlvbi5TdGF0dXNCYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0VudGVyQW5pbWF0aW9uIj5AYW5pbS9wcmlvcml0eV9hbGVydF9lbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dFeGl0QW5pbWF0aW9uIj5AYW5pbS9wcmlvcml0eV9hbGVydF9leGl0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKICAgICA8IS0tIFN0YW5kYXJkIGFuaW1hdGlvbnMgZm9yIGEgdHJhbnNsdWNlbnQgd2luZG93IG9yIGFjdGl2aXR5LiAgVGhpcwogICAgICAgICAgc3R5bGUgaXMgPGVtPm5vdDxlbT4gdXNlZCBieSBkZWZhdWx0IGZvciB0aGUgdHJhbnNsdWNlbnQgdGhlbWUKICAgICAgICAgIChzaW5jZSB0cmFuc2x1Y2VudCBhY3Rpdml0aWVzIGFyZSBhIHNwZWNpYWwgY2FzZSB0aGF0IGhhdmUgbm8KQEAgLTE4OCw4ICsxOTksNyBAQAogICAgIDwhLS0gU3RhdHVzIEJhciBTdHlsZXMgLS0+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiPgpAQCAtMjAyLDkgKzIxMiwxMCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE2c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKQEAgLTI2OSwxMiArMjgwLDEyIEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLkNoZWNrQm94Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2tfbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVjazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvck11bHRpcGxlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlJhZGlvQnV0dG9uIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fcmFkaW9fbGFiZWxfYmFja2dyb3VuZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpidXR0b24iPj9hbmRyb2lkOmF0dHIvbGlzdENob2ljZUluZGljYXRvclNpbmdsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Db21wb3VuZEJ1dHRvbi5TdGFyIj4KQEAgLTQwNCw5ICs0MTUsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpmb2N1c2FibGVJblRvdWNoTW9kZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRCYWNrZ3JvdW5kPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvZWRpdFRleHRDb2xvcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWw8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKQEAgLTQzMiwxNCArNDQzLDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZGVmYXVsdDwvaXRlbT4KICAgICA8L3N0eWxlPgogCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Zm9jdXNhYmxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmZvY3VzYWJsZUluVG91Y2hNb2RlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQ8L2l0ZW0+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BdXRvQ29tcGxldGVUZXh0VmlldyIgcGFyZW50PSJXaWRnZXQuRWRpdFRleHQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbXBsZXRpb25IaW50VmlldyI+QGFuZHJvaWQ6bGF5b3V0L3NpbXBsZV9kcm9wZG93bl9oaW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtSW52ZXJzZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29tcGxldGlvblRocmVzaG9sZCI+MjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zcGlubmVyX2Ryb3Bkb3duX2JhY2tncm91bmQ8L2l0ZW0+CkBAIC00NTEsNiArNDU2LDE4IEBACiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5TcGlubmVyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fZHJvcGRvd248L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2xpY2thYmxlIj50cnVlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNwaW5uZXJNb2RlIj5kaWFsb2c8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93blNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9zcGlubmVyX2Ryb3Bkb3duX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZHJvcERvd25WZXJ0aWNhbE9mZnNldCI+LTEwZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRyb3BEb3duSG9yaXpvbnRhbE9mZnNldCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkcm9wRG93bldpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cG9wdXBQcm9tcHRWaWV3Ij5AYW5kcm9pZDpsYXlvdXQvc2ltcGxlX2Ryb3Bkb3duX2hpbnQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuU3Bpbm5lci5Ecm9wRG93biI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3Bpbm5lck1vZGUiPmRyb3Bkb3duPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlRleHRWaWV3LlBvcHVwTWVudSI+CkBAIC00NzAsNyArNDg3LDcgQEAKICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuRHJvcERvd25JdGVtLlNwaW5uZXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNoZWNrTWFyayI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX3JhZGlvPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNoZWNrTWFyayI+P2FuZHJvaWQ6YXR0ci9saXN0Q2hvaWNlSW5kaWNhdG9yU2luZ2xlPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LlNjcm9sbFZpZXciPgpAQCAtNDkwLDcgKzUwNyw3IEBACiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0Lkxpc3RWaWV3LldoaXRlIiBwYXJlbnQ9IldpZGdldC5BYnNMaXN0VmlldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGlzdFNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGlzdFNlbGVjdG9yIj5AYW5kcm9pZDpkcmF3YWJsZS9saXN0X3NlbGVjdG9yX2JhY2tncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQiPj9hbmRyb2lkOmF0dHIvY29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmRpdmlkZXIiPkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHRfb3BhcXVlPC9pdGVtPgogICAgIDwvc3R5bGU+ICAgIApAQCAtNTY3LDYgKzU4NCw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvcXVpY2tjb250YWN0X2JhZGdlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNsaWNrYWJsZSI+dHJ1ZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdENlbnRlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX2NvbnRhY3RfcGljdHVyZTwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuUXVpY2tDb250YWN0QmFkZ2VTbWFsbCI+CkBAIC02MDYsOSArNjI0LDkgQEAKIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPiNGRkZGOTIwMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGludCI+P3RleHRDb2xvckhpbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+IzVDNUNGRjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGluazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTZzcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICA8L3N0eWxlPgpAQCAtNjE2LDcgKzYzNCw4IEBACiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yTGluayI+IzAwMDBFRTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlRoZW1lIj4KQEAgLTYyNCw0MSArNjQzLDQwIEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuRGlhbG9nV2luZG93VGl0bGUiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5MYXJnZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjIyc3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkxhcmdlLkludmVyc2UiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnlJbnZlcnNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckhpbnQiPj90ZXh0Q29sb3JIaW50SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaWdobGlnaHQiPj90ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvckxpbmsiPj90ZXh0Q29sb3JMaW5rSW52ZXJzZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGl1bSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGl1bS5JbnZlcnNlIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TbWFsbCI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yU2Vjb25kYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU21hbGwuSW52ZXJzZSI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/dGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JIaW50Ij4/dGV4dENvbG9ySGludEludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9ySGlnaGxpZ2h0Ij4/dGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3JMaW5rIj4/dGV4dENvbG9yTGlua0ludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5UaGVtZS5EaWFsb2ciIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuVGhlbWUiPgpAQCAtODU0LDQgKzg3Miw2OSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdCb3R0b20iPjFkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYm90dG9tX2JhcjwvaXRlbT4KICAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2FjdGlvbl9iYXJfYmFja2dyb3VuZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXNwbGF5T3B0aW9ucyI+dXNlTG9nbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj5AYW5kcm9pZDpkcmF3YWJsZS9hY3Rpb25fYmFyX2RpdmlkZXI8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aGVpZ2h0Ij4/YW5kcm9pZDphdHRyL2FjdGlvbkJhclNpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0xlZnQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1RvcCI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjNkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0JvdHRvbSI+MGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbkJhci5UaXRsZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzdWJ0aXRsZVRleHRTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25Nb2RlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj4/YW5kcm9pZDphdHRyL2FjdGlvbk1vZGVCYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmhlaWdodCI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25CYXJTaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOml0ZW1QYWRkaW5nIj4/YW5kcm9pZDphdHRyL2FjdGlvbkJ1dHRvblBhZGRpbmc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGl0bGVUZXh0U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN1YnRpdGxlVGV4dFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuQWN0aW9uTW9kZS5TdWJ0aXRsZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25CYXIuVGl0bGUiCisgICAgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaXVtLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZSIKKyAgICAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TbWFsbC5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGl1bS5JbnZlcnNlIj4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIgorICAgICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2UiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJ1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQnV0dG9uLk92ZXJmbG93Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19tZW51X21vcmU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21vcmVfaXRlbV9sYWJlbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPj9hbmRyb2lkOmF0dHIvYWN0aW9uTW9kZUNsb3NlRHJhd2FibGU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AZHJhd2FibGUvbWluaXRhYl9sdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+NGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjRkaXA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJCYXIiPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5XaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKaW5kZXggMjMxMWJkZC4uOGE5ZWJmMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbApAQCAtNTMsNiArNTMsMTAgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludCI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaW50X2ZvcmVncm91bmRfbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvclNlYXJjaFVybCI+QGFuZHJvaWQ6Y29sb3Ivc2VhcmNoX3VybF90ZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHQiPkBhbmRyb2lkOmNvbG9yL2hpZ2hsaWdodGVkX3RleHRfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGlnaGxpZ2h0ZWRfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGluayI+QGFuZHJvaWQ6Y29sb3IvbGlua190ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmtJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9saW5rX3RleHRfbGlnaHQ8L2l0ZW0+CiAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuTGFyZ2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlTWVkaXVtIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpdW08L2l0ZW0+CkBAIC02NSw2ICs2OSw5IEBACiAgICAgICAgIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUJ1dHRvbiI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkJ1dHRvbjwvaXRlbT4KICAgICAgICAgCisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0QmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0PC9pdGVtPgorICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0iY2FuZGlkYXRlc1RleHRTdHlsZVNwYW5zIj5AYW5kcm9pZDpzdHJpbmcvY2FuZGlkYXRlc19zdHlsZTwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2Rhcms8L2l0ZW0+CkBAIC04NCw5ICs5MSwxMSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3REaXZpZGVyIj5AZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvcjwvaXRlbT4gICAKLSAgICAgICAgCi0JCTxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KLSAgICAJPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+ICAgIAorCisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpbzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUluZGljYXRvck11bHRpcGxlIj5AYW5kcm9pZDpkcmF3YWJsZS9idG5fY2hlY2s8L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdENob2ljZUJhY2tncm91bmRJbmRpY2F0b3IiPkBhbmRyb2lkOmRyYXdhYmxlL2xpc3Rfc2VsZWN0ZWRfYmFja2dyb3VuZDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJleHBhbmRhYmxlTGlzdFByZWZlcnJlZEl0ZW1QYWRkaW5nTGVmdCI+NDBkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImV4cGFuZGFibGVMaXN0UHJlZmVycmVkQ2hpbGRQYWRkaW5nTGVmdCI+CkBAIC0xMTUsNiArMTI0LDggQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVCYWNrZ3JvdW5kU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpbmRvd1RpdGxlQmFja2dyb3VuZDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBbmltYXRpb25TdHlsZSI+QGFuZHJvaWQ6c3R5bGUvQW5pbWF0aW9uLkFjdGl2aXR5PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGUiPnN0YXRlVW5zcGVjaWZpZWR8YWRqdXN0VW5zcGVjaWZpZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0FjdGlvbk1vZGVPdmVybGF5Ij5mYWxzZTwvaXRlbT4KIAogICAgICAgICA8IS0tIERpYWxvZyBhdHRyaWJ1dGVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJhbGVydERpYWxvZ1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbGVydERpYWxvZzwvaXRlbT4KQEAgLTE1OCw4ICsxNjksOCBAQAogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxUaXRsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLlRpdGxlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5MYXJnZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5JbnZlcnNlPC9pdGVtPgotCQk8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KLQkgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+IAorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlU21hbGxJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InNlZWtCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNlZWtCYXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InJhdGluZ0JhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUmF0aW5nQmFyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJyYXRpbmdCYXJTdHlsZUluZGljYXRvciI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlJhdGluZ0Jhci5JbmRpY2F0b3I8L2l0ZW0+CkBAIC0xNjgsNiArMTc5LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ic2Nyb2xsVmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU2Nyb2xsVmlldzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJzcGlubmVyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5TcGlubmVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJkcm9wRG93blNwaW5uZXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlNwaW5uZXIuRHJvcERvd248L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InN0YXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkNvbXBvdW5kQnV0dG9uLlN0YXI8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRhYldpZGdldFN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGFiV2lkZ2V0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXc8L2l0ZW0+CkBAIC0xOTksNiArMjExLDIxIEBACiAKICAgICAgICAgPCEtLSBTZWFyY2ggd2lkZ2V0IHN0eWxlcyAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoV2lkZ2V0Q29ycHVzSXRlbUJhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3NlYXJjaF93aWRnZXRfY29ycHVzX2l0ZW1fYmFja2dyb3VuZDwvaXRlbT4KKworICAgICAgICA8IS0tIEFjdGlvbiBiYXIgc3R5bGVzIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Ecm9wRG93blN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuU3Bpbm5lci5Ecm9wRG93bjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b248L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJ1dHRvblBhZGRpbmciPjEyZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQmFja2dyb3VuZCI+QGFuZHJvaWQ6ZHJhd2FibGUvYWN0aW9uX2Jhcl9jb250ZXh0X2JhY2tncm91bmQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2Nsb3NlX2NsZWFyX2NhbmNlbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXJWaWV3X1RhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbk1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJ1dHRvbi5DbG9zZU1vZGU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuQWN0aW9uQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJTaXplIj41MGRpcDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIAogICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgZGVmYXVsdCAoZGFyaykgdGhlbWUgd2l0aCBubyB0aXRsZSBiYXIgLS0+CkBAIC0yMjIsNyArMjQ5LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJjb2xvckZvcmVncm91bmQiPkBjb2xvci9icmlnaHRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JGb3JlZ3JvdW5kSW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvYnJpZ2h0X2ZvcmVncm91bmRfbGlnaHRfaW52ZXJzZTwvaXRlbT4KLQorICAgICAgICAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeSI+QGFuZHJvaWQ6Y29sb3IvcHJpbWFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JTZWNvbmRhcnkiPkBhbmRyb2lkOmNvbG9yL3NlY29uZGFyeV90ZXh0X2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JUZXJ0aWFyeSI+QGFuZHJvaWQ6Y29sb3IvdGVydGlhcnlfdGV4dF9saWdodDwvaXRlbT4KQEAgLTIzNiw4ICsyNjMsMTUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yUHJpbWFyeUludmVyc2VOb0Rpc2FibGUiPkBhbmRyb2lkOmNvbG9yL3ByaW1hcnlfdGV4dF9kYXJrX25vZGlzYWJsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yU2Vjb25kYXJ5SW52ZXJzZU5vRGlzYWJsZSI+QGFuZHJvaWQ6Y29sb3Ivc2Vjb25kYXJ5X3RleHRfZGFya19ub2Rpc2FibGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckhpbnQiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGludEludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2hpbnRfZm9yZWdyb3VuZF9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaW50SW52ZXJzZSI+QGFuZHJvaWQ6Y29sb3IvaGludF9mb3JlZ3JvdW5kX2Rhcms8L2l0ZW0+ICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9ySGlnaGxpZ2h0Ij5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0Q29sb3JIaWdobGlnaHRJbnZlcnNlIj5AYW5kcm9pZDpjb2xvci9oaWdobGlnaHRlZF90ZXh0X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InRleHRDb2xvckxpbmsiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0idGV4dENvbG9yTGlua0ludmVyc2UiPkBhbmRyb2lkOmNvbG9yL2xpbmtfdGV4dF9kYXJrPC9pdGVtPgogICAgICAgICAKKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlQmFja2dyb3VuZEluZGljYXRvciI+QGFuZHJvaWQ6ZHJhd2FibGUvbGlzdF9zZWxlY3RlZF9iYWNrZ3JvdW5kX2xpZ2h0PC9pdGVtPgorCiAgICAgICAgIDxpdGVtIG5hbWU9InBvcHVwV2luZG93U3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qb3B1cFdpbmRvdzwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRDaGVja01hcmsiPkBhbmRyb2lkOmRyYXdhYmxlL2luZGljYXRvcl9jaGVja19tYXJrX2xpZ2h0PC9pdGVtPgpAQCAtMjQ4LDEzICsyODIsMTMgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFZpZXdTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0Lkxpc3RWaWV3LldoaXRlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0RGl2aWRlciI+QGRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RTZXBhcmF0b3JUZXh0Vmlld1N0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuVGV4dFZpZXcuTGlzdFNlcGFyYXRvci5XaGl0ZTwvaXRlbT4KLSAgICAgICAgCisKICAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbCI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVMYXJnZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlLkludmVyc2U8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXI8L2l0ZW0+Ci0JCTxpdGVtIG5hbWU9InByb2dyZXNzQmFyU3R5bGVTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0Jhci5TbWFsbDwvaXRlbT4KLQkJPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLkxhcmdlPC9pdGVtPiAKKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuU21hbGwuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUxhcmdlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2UuSW52ZXJzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Qcm9ncmVzc0JhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0icHJvZ3Jlc3NCYXJTdHlsZVNtYWxsSW52ZXJzZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LlByb2dyZXNzQmFyLlNtYWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJwcm9ncmVzc0JhclN0eWxlTGFyZ2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuUHJvZ3Jlc3NCYXIuTGFyZ2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KICAgICAKICAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGxpZ2h0IHRoZW1lIHdpdGggbm8gdGl0bGUgYmFyIC0tPgpAQCAtNDE3LDEzICs0NTEsMjUgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlNtYWxsLkludmVyc2U8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDwhLS0gVmFyaWF0aW9uIG9mIFRoZW1lLkRpYWxvZyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBmcmFtZSAob3IgYmFja2dyb3VuZCkuCisgICAgICAgICBUaGUgdmlldyBoaWVyYXJjaHkgb2YgdGhlIGRpYWxvZyBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyBhbGwgb2YKKyAgICAgICAgIGl0cyBwaXhlbHMuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuTm9GcmFtZSI+CisgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0JhY2tncm91bmQiPkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0ZyYW1lIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kRGltRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93SXNUcmFuc2x1Y2VudCI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKICAgICA8IS0tIERlZmF1bHQgdGhlbWUgZm9yIGFsZXJ0IGRpYWxvZyB3aW5kb3dzLCB3aGljaCBpcyB1c2VkIGJ5IHRoZQogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nfSBjbGFzcy4gIFRoaXMgaXMgYmFzaWNhbGx5IGEgZGlhbG9nCiAgICAgICAgICBidXQgc2V0cyB0aGUgYmFja2dyb3VuZCB0byBlbXB0eSBzbyBpdCBjYW4gZG8gdHdvLXRvbmUgYmFja2dyb3VuZHMuIC0tPgogICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5EaWFsb2cuQWxlcnQiPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dCYWNrZ3JvdW5kIj5AYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0lzRmxvYXRpbmciPnRydWU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIApAQCAtNTI5LDUgKzU3NSw2NyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FuaW1hdGlvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9BbmltYXRpb24uVG9hc3Q8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZERpbUVuYWJsZWQiPmZhbHNlPC9pdGVtPgogICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIERlZmF1bHQgdGhlbWUgd2l0aCBhbiBBY3Rpb24gQmFyLiAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIE5vIHRpdGxlIGJhciwgYnV0IEFjdGlvbiBNb2RlIGJhcnMgd2lsbCBvdmVybGF5IGFwcGxpY2F0aW9uIGNvbnRlbnQKKyAgICAgICAgIGluc3RlYWQgb2YgcHVzaGluZyBpdCBkb3duIHRvIG1ha2Ugcm9vbS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk5vVGl0bGVCYXIuT3ZlcmxheUFjdGlvbk1vZGVzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25Nb2RlT3ZlcmxheSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgogICAgIAorICAgIDwhLS0gTmV3IEhvbmV5Y29tYiBob2xvZ3JhcGhpYyB0aGVtZS4gRGFyayB2ZXJzaW9uLiAgVGhlIHdpZGdldHMgaW4gdGhlCisgICAgICAgICBob2xvZ3JhcGhpYyB0aGVtZSBhcmUgdHJhbnNsdWNlbnQgb24gdGhlaXIgYnJhY2tncm91bmQsIHNvIGFwcGxpY2F0aW9ucworICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCBhbnkgYmFja2dyb3VuZCB0aGV5IHVzZSB3aXRoIHRoaXMgdGhlbWUgaXMgaXRzZWxmCisgICAgICAgICBkYXJrOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZGlmZmljdWx0IHRvIHNlZSB0aGUgd2lkZ2V0cy4gIFRoZSBuZXcKKyAgICAgICAgIFVJIHN0eWxlIGFsc28gaW5jbHVkZXMgYSBmdWxsIGFjdGlvbiBiYXIgYnkgZGVmYXVsdC4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8iPgorICAgICAgICA8aXRlbSBuYW1lPSJlZGl0VGV4dEJhY2tncm91bmQiPkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dF9ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JNdWx0aXBsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvYnRuX2NoZWNrX2hvbG9fZGFyazwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBOZXcgSG9uZXljb21iIGhvbG9ncmFwaGljIHRoZW1lLiBMaWdodCB2ZXJzaW9uLiAgVGhlIHdpZGdldHMgaW4gdGhlCisgICAgICAgICBob2xvZ3JhcGhpYyB0aGVtZSBhcmUgdHJhbnNsdWNlbnQgb24gdGhlaXIgYnJhY2tncm91bmQsIHNvIGFwcGxpY2F0aW9ucworICAgICAgICAgbXVzdCBlbnN1cmUgdGhhdCBhbnkgYmFja2dyb3VuZCB0aGV5IHVzZSB3aXRoIHRoaXMgdGhlbWUgaXMgaXRzZWxmCisgICAgICAgICBsaWdodDsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBzZWUgdGhlIHdpZGdldHMuICBUaGUgbmV3CisgICAgICAgICBVSSBzdHlsZSBhbHNvIGluY2x1ZGVzIGEgZnVsbCBhY3Rpb24gYmFyIGJ5IGRlZmF1bHQuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHRfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dBY3Rpb25CYXIiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RDaG9pY2VJbmRpY2F0b3JTaW5nbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9yYWRpb19ob2xvX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0Q2hvaWNlSW5kaWNhdG9yTXVsdGlwbGUiPkBhbmRyb2lkOmRyYXdhYmxlL2J0bl9jaGVja19ob2xvX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgICAgIAorICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgKGRhcmspIHRoZW1lIHdpdGggbm8gYWN0aW9uIGJhci4gLS0+CisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTm9BY3Rpb25CYXIiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorICAgIAorICAgIDwhLS0gVmFyaWFudCBvZiB0aGUgaG9sb2dyYXBoaWMgKGRhcmspIHRoZW1lIHRoYXQgaGFzIG5vIHRpdGxlIGJhciBhbmQgZmlsbHMKKyAgICAgICAgIHRoZSBlbnRpcmUgc2NyZWVuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0Z1bGxzY3JlZW4iPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIGxpZ2h0IHRoZW1lIHdpdGggbm8gYWN0aW9uIGJhciAtLT4KKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTGlnaHQuSG9sby5Ob0FjdGlvbkJhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QWN0aW9uQmFyIj5mYWxzZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIFZhcmlhbnQgb2YgdGhlIGhvbG9ncmFwaGljIGxpZ2h0IHRoZW1lIHRoYXQgaGFzIG5vIHRpdGxlIGJhciBhbmQgZmlsbHMKKyAgICAgICAgIHRoZSBlbnRpcmUgc2NyZWVuIC0tPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5MaWdodC5Ib2xvLk5vQWN0aW9uQmFyLkZ1bGxzY3JlZW4iPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0Z1bGxzY3JlZW4iPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisgCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbGFuZC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCA3MDBjNTI3Li5mZDhiZDQ5IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1sYW5kL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCAxZTM3YjZjLi45ZmY2ZmQ3IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLWxhbmQvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwtbWRwaS9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAppbmRleCBiYWUxYjQyLi44MmE3Yzc1IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC1tZHBpL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAppbmRleCA2MTJkZjljLi45ZmZmM2NjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sLW1kcGkvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCiAgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCiAgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgotICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCiAgICAgPgogCiAgICAgPFJvdz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGEzNTA0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwteGxhcmdlL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8S2V5Ym9hcmQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiCisgICAgYW5kcm9pZDpob3Jpem9udGFsR2FwPSIwcHgiCisgICAgYW5kcm9pZDp2ZXJ0aWNhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKKyAgICA+CisKKyAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iMiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iNSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSI3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iOCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ3Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJpIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJhIiBhbmRyb2lkOmhvcml6b250YWxHYXA9IjUlcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0icyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJmIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImgiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iayIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImwiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCisgICAgPFJvdz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItMSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NoaWZ0IgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDppc01vZGlmaWVyPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aXNTdGlja3k9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ieiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IngiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJjIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImIiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJuIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii01IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTUlcCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19kZWxldGUiCisgICAgICAgICAgICBhbmRyb2lkOmlzUmVwZWF0YWJsZT0idHJ1ZSIvPgorICAgIDwvUm93PgorCisgICAgPFJvdyBhbmRyb2lkOmtleWJvYXJkTW9kZT0iQCtpZC9tb2RlX25vcm1hbCIgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9ImJvdHRvbSI+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTIiIGFuZHJvaWQ6a2V5TGFiZWw9IkBzdHJpbmcvcGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLCIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSItIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjMyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfc3BhY2UiCisgICAgICAgICAgICBhbmRyb2lkOmljb25QcmV2aWV3PSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2ZlZWRiYWNrX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDprZXlXaWR0aD0iMjAlcCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ij0iIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLiIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjEwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sLXhsYXJnZS9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTlkYjgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL3htbC14bGFyZ2UvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgorICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgorICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKKyAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHRfYWxwaGEiCisgICAgPgorCisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcQCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJcIyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIlIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iJmFtcDsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIqIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iLSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IisiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iKSIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CisgICAgPC9Sb3c+CisKKyAgICA8Um93PgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImUiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJyIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0idCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ1Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaSIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im8iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYSIgYW5kcm9pZDpob3Jpem9udGFsR2FwPSI1JXAiCisgICAgICAgICAgICBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJkIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iZiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImciLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJoIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iaiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImsiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJsIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3c+CisgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iLTEiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9zaGlmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6aXNNb2RpZmllcj0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfc2hpZnQiCisgICAgICAgICAgICBhbmRyb2lkOmlzU3RpY2t5PSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InoiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ4Ii8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iYyIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9InYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJiIi8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0ibiIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Im0iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjE1JXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiLz4KKyAgICA8L1Jvdz4KKworICAgIDxSb3cgYW5kcm9pZDprZXlib2FyZE1vZGU9IkAraWQvbW9kZV9ub3JtYWwiIGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgorICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9Ii0yIiBhbmRyb2lkOmtleUxhYmVsPSJAc3RyaW5nL3Bhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiCisgICAgICAgICAgICBhbmRyb2lkOmtleVdpZHRoPSIyMCVwIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IiwiIC8+CisgICAgICAgIDxLZXkgYW5kcm9pZDprZXlMYWJlbD0iXyIgLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIzMiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX3NwYWNlIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19zcGFjZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIrIiAvPgorICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9Ii4iLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgYW5kcm9pZDppY29uUHJldmlldz0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9mZWVkYmFja19vayIKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5V2lkdGg9IjIwJXAiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgIDwvUm93PgorCis8L0tleWJvYXJkPgorCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfZXh0ZW5zaW9uLnhtbAppbmRleCAyOGI3ZWZlLi5mM2ZhNTdiIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9leHRlbnNpb24ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX2V4dGVuc2lvbi54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9udW1lcmljLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCmluZGV4IGUzZjE2MTIuLjIyNzBiOGEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX251bWVyaWMueG1sCkBAIC0xOSwzNSArMTksNDEgQEAKIC0tPgogPEtleWJvYXJkIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmtleVdpZHRoPSIzMy4zMyVwIgotICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMnB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X251bWVyaWMiCiAgICAgPgogCi0gICAgPFJvdz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI0OSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTEiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTIiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTMiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjUyIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNCIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTQiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1MyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTUiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTYiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93PgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjU1IiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfbnVtNyIgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTciCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9ImxlZnQiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NiIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTgiLz4KLSAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSI1NyIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX251bTkiCisgICAgICAgICAgICAgYW5kcm9pZDprZXlFZGdlRmxhZ3M9InJpZ2h0Ii8+CiAgICAgPC9Sb3c+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJib3R0b20iPgotICAgICAgICA8S2V5IGFuZHJvaWQ6Y29kZXM9IjEwIiBhbmRyb2lkOmtleUljb249IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfb2siLz4KKyAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSIxMCIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX29rIgorICAgICAgICAgICAgIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJsZWZ0Ii8+CiAgICAgICAgIDxLZXkgYW5kcm9pZDpjb2Rlcz0iNDgiIGFuZHJvaWQ6a2V5SWNvbj0iQGRyYXdhYmxlL3N5bV9rZXlib2FyZF9udW0wX25vX3BsdXMiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmNvZGVzPSItNSIgYW5kcm9pZDprZXlJY29uPSJAZHJhd2FibGUvc3ltX2tleWJvYXJkX2RlbGV0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgotICAgICAgICAgICAgYW5kcm9pZDppc1JlcGVhdGFibGU9InRydWUiIGFuZHJvaWQ6a2V5RWRnZUZsYWdzPSJyaWdodCIvPgorICAgICAgICAgICAgIGFuZHJvaWQ6aWNvblByZXZpZXc9IkBkcmF3YWJsZS9zeW1fa2V5Ym9hcmRfZmVlZGJhY2tfZGVsZXRlIgorICAgICAgICAgICAgIGFuZHJvaWQ6aXNSZXBlYXRhYmxlPSJ0cnVlIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0icmlnaHQiLz4KICAgICA8L1Jvdz4KIAogPC9LZXlib2FyZD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3BvcHVwX3RlbXBsYXRlLnhtbAppbmRleCA1ZGRmZDNlLi45Yjg1M2UyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9wb3B1cF90ZW1wbGF0ZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcG9wdXBfdGVtcGxhdGUueG1sCkBAIC0yMiw2ICsyMiw2IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiA8L0tleWJvYXJkPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eS54bWwKaW5kZXggNWZhOWI4YS4uMGEzNTA0MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHkueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgYW5kcm9pZDprZXlXaWR0aD0iMTAlcCIKICAgICBhbmRyb2lkOmhvcml6b250YWxHYXA9IjBweCIKICAgICBhbmRyb2lkOnZlcnRpY2FsR2FwPSIwcHgiCi0gICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0IgorICAgIGFuZHJvaWQ6a2V5SGVpZ2h0PSJAZGltZW4vcGFzc3dvcmRfa2V5Ym9hcmRfa2V5X2hlaWdodF9hbHBoYSIKICAgICA+CiAKICAgICA8Um93IGFuZHJvaWQ6cm93RWRnZUZsYWdzPSJ0b3AiPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sIGIvY29yZS9yZXMvcmVzL3htbC9wYXNzd29yZF9rYmRfcXdlcnR5X3NoaWZ0ZWQueG1sCmluZGV4IGU0OTFhZmYuLjllOWRiODEgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3F3ZXJ0eV9zaGlmdGVkLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9xd2VydHlfc2hpZnRlZC54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAogICAgIDxSb3cgYW5kcm9pZDpyb3dFZGdlRmxhZ3M9InRvcCI+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzLnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCmluZGV4IDE0YTdlYzguLjlhOTQ5MzAgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHMueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIxIiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9IjIiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSIzIi8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMveG1sL3Bhc3N3b3JkX2tiZF9zeW1ib2xzX3NoaWZ0LnhtbCBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCmluZGV4IDRiODRmNGIuLmE5NzJlYjIgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy94bWwvcGFzc3dvcmRfa2JkX3N5bWJvbHNfc2hpZnQueG1sCkBAIC0yMiwxMCArMjIsMTAgQEAKICAgICBhbmRyb2lkOmtleVdpZHRoPSIxMCVwIgogICAgIGFuZHJvaWQ6aG9yaXpvbnRhbEdhcD0iMHB4IgogICAgIGFuZHJvaWQ6dmVydGljYWxHYXA9IjBweCIKLSAgICBhbmRyb2lkOmtleUhlaWdodD0iQGRpbWVuL3Bhc3N3b3JkX2tleWJvYXJkX2tleV9oZWlnaHQiCisgICAgYW5kcm9pZDprZXlIZWlnaHQ9IkBkaW1lbi9wYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIgogICAgID4KIAotICAgIDxSb3c+CisgICAgPFJvdyBhbmRyb2lkOnJvd0VkZ2VGbGFncz0idG9wIj4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ+IiBhbmRyb2lkOmtleUVkZ2VGbGFncz0ibGVmdCIvPgogICAgICAgICA8S2V5IGFuZHJvaWQ6a2V5TGFiZWw9ImAiLz4KICAgICAgICAgPEtleSBhbmRyb2lkOmtleUxhYmVsPSJ8Ii8+CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfYmFja3NsYXNoLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzMDAyYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9iYWNrc2xhc2gudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjo7QVw7QlxcO0NcXFw7O0Q7XDpFO1xcXFw7DQotRk46QTtCXENcO0Q6RVxcDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfY29tcGxpY2F0ZWQudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM0ZTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2NvbXBsaWNhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjpHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvDQotRk46Sm9lIER1ZQ0KLU9SRzpHdW1wIFNocmltcCBDby47U2FsZXMgRGVwdC5cO01hbmFnZXI7RmlzaCBrZWVwZXINCi1ST0xFOkZpc2ggQ2FrZSBLZWVwZXIhDQotWC1DTEFTUzpQVUJMSUMNCi1USVRMRTpTaHJpbXAgTWFuDQotVEVMO1dPUks7Vk9JQ0U6KDExMSkgNTU1LTEyMTINCi1URUw7SE9NRTtWT0lDRTooNDA0KSA1NTUtMTIxMg0KLVRFTDtDRUxMOjAzMTExMTExMTENCi1URUw7VklERU86MDMyMjIyMjIyMg0KLVRFTDtWT0lDRTowMzMzMzMzMzMzDQotQURSO1dPUks6OzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2ENCi1MQUJFTDtXT1JLO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6MTAwIFdhdGVycyBFZGdlPTBEPTBBQmF5dG93biwgTEEgMzAzMTQ9MEQ9MEFVbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotQURSO0hPTUU6Ozs0MiBQbGFudGF0aW9uIFN0LjtCYXl0b3duO0xBOzMwMzE0O1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQ0KLUxBQkVMO0hPTUU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTo0MiBQbGFudGF0aW9uIFN0Lj0wRD0wQT0NCi1CYXl0b3duLCBMQSAzMDMxND0wRD0wQT0NCi1Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhDQotRU1BSUw7UFJFRjtJTlRFUk5FVDpmb3JyZXN0Z3VtcEB3YWxsYWRhbGxhLmNvbQ0KLUVNQUlMO0NFTEw6Y2VsbEBleGFtcGxlLmNvbQ0KLU5PVEU6VGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuDQotTk9URTtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOk5vdydzIHRoZSB0aW1lID0NCi1mb3IgYWxsIGZvbGsgdG8gY29tZT0NCi0gdG8gdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5Lg0KLQ0KLVBIT1RPO0VOQ09ESU5HPUJBU0U2NDtUWVBFPUpQRUc6DQotIC85ai80UW9QUlhocFpnQUFUVTBBS2dBQUFBZ0FEUUVPQUFJQUFBQVBBQUFBcWdFUEFBSUFBQUFIQUFBQXVnRVFBQUlBQUFBRw0KLSBBQUFBd2dFU0FBTUFBQUFCQUFFQUFBRWFBQVVBQUFBQkFBQUF5QUViQUFVQUFBQUJBQUFBMEFFb0FBTUFBQUFCQUFJQUFBRXgNCi0gQUFJQUFBQU9BQUFBMkFFeUFBSUFBQUFVQUFBQTVnSVRBQU1BQUFBQkFBRUFBSUtZQUFJQUFBQU9BQUFBK29kcEFBUUFBQUFCDQotIEFBQUJoTVNsQUFjQUFBQjhBQUFCQ0FBQUJCNHlNREE0TVRBeU9URXpOVFV6TVFBQVJHOURiMDF2QUFCRU9UQTFhUUFBQUFCSQ0KLSBBQUFBQVFBQUFFZ0FBQUFCUkRrd05Xa2dWbVZ5TVM0d01BQXlNREE0T2pFd09qSTVJREV6T2pVMU9qUTNBQ0FnSUNBZ0lDQWcNCi0gSUNBZ0lDQUFVSEpwYm5SSlRRQXdNekF3QUFBQUJnQUJBQlFBRkFBQ0FRQUFBQUFEQUFBQU5BRUFCUUFBQUFFQkFRQUFBQUVRDQotIGdBQUFBQUFBRVFrQUFDY1FBQUFQQ3dBQUp4QUFBQVdYQUFBbkVBQUFDTEFBQUNjUUFBQWNBUUFBSnhBQUFBSmVBQUFuRUFBQQ0KLSBBSXNBQUNjUUFBQUR5d0FBSnhBQUFCdmxBQUFuRUFBb2dwb0FCUUFBQUFFQUFBTnFncDBBQlFBQUFBRUFBQU55aUNJQUF3QUENCi0gQUFFQUFnQUFrQUFBQndBQUFBUXdNakl3a0FNQUFnQUFBQlFBQUFONmtBUUFBZ0FBQUJRQUFBT09rUUVBQndBQUFBUUJBZ01BDQotIGtRSUFCUUFBQUFFQUFBT2lrZ0VBQ2dBQUFBRUFBQU9xa2dJQUJRQUFBQUVBQUFPeWtnUUFDZ0FBQUFFQUFBTzZrZ1VBQlFBQQ0KLSBBQUVBQUFQQ2tnY0FBd0FBQUFFQUFnQUFrZ2dBQXdBQUFBRUFBQUFBa2drQUF3QUFBQUVBQUFBQWtnb0FCUUFBQUFFQUFBUEsNCi0ga253QUJ3QUFBQUVBQUFBQWtvWUFCd0FBQUJZQUFBUFNvQUFBQndBQUFBUXdNVEF3b0FFQUF3QUFBQUVBQVFBQW9BSUFBd0FBDQotIEFBRUFZQUFBb0FNQUF3QUFBQUVBU0FBQW9BVUFCQUFBQUFFQUFBUUFvZzRBQlFBQUFBRUFBQVBvb2c4QUJRQUFBQUVBQUFQdw0KLSBvaEFBQXdBQUFBRUFBZ0FBb2hjQUF3QUFBQUVBQWdBQW93QUFCd0FBQUFFREFBQUFvd0VBQndBQUFBRUJBQUFBcEFFQUF3QUENCi0gQUFFQUFBQUFwQUlBQXdBQUFBRUFBQUFBcEFNQUF3QUFBQUVBQUFBQXBBUUFCUUFBQUFFQUFBUDRwQVVBQXdBQUFBRUFIUUFBDQotIHBBWUFBd0FBQUFFQUFBQUFwQWNBQXdBQUFBRUFBQUFBcEFnQUF3QUFBQUVBQUFBQXBBa0FBd0FBQUFFQUFBQUFwQW9BQXdBQQ0KLSBBQUVBQUFBQXBBd0FBd0FBQUFFQUFnQUFBQUFBQUFBQUFGTUFBQ2NRQUFBQlhnQUFBR1F5TURBNE9qRXdPakk1SURFek9qVTENCi0gT2pNeEFESXdNRGc2TVRBNk1qa2dNVE02TlRVNk5EY0FBQUFwaUFBQUd3QUFBQUt5QUFBQVpBQUFBVjRBQUFCa0FBQUFBQUFBDQotIEFHUUFBQUFsQUFBQUNnQUFEcElBQUFQb0FBQUFBQUFBQUFBeU1EQTRNVEF5T1RFek5UVXpNUUFBSUNvQUFBQUtBQUFxNGdBQQ0KLSBBQW9BQUFBQUFBQUFBUUFDQUFFQUFnQUFBQVJTT1RnQUFBSUFCd0FBQUFRd01UQXdBQUFBQUFBR0FRTUFBd0FBQUFFQUJnQUENCi0gQVJvQUJRQUFBQUVBQUFSc0FSc0FCUUFBQUFFQUFBUjBBU2dBQXdBQUFBRUFBZ0FBQWdFQUJBQUFBQUVBQUFSOEFnSUFCQUFBDQotIEFBRUFBQVdMQUFBQUFBQUFBRWdBQUFBQkFBQUFTQUFBQUFILzJQL2JBSVFBSUJZWUhCZ1VJQndhSENRaUlDWXdVRFF3TEN3dw0KLSBZa1pLT2xCMFpucDRjbVp3Ym9DUXVKeUFpSzZLYm5DZzJxS3V2c1RPME01OG11THk0TWp3dU1yT3hnRWlKQ1F3S2pCZU5EUmUNCi0geG9Sd2hNYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHeHNiR3hzYkd4c2JHDQotIC84QUFFUWdBZUFDZ0F3RWhBQUlSQVFNUkFmL0VBYUlBQUFFRkFRRUJBUUVCQUFBQUFBQUFBQUFCQWdNRUJRWUhDQWtLQ3hBQQ0KLSBBZ0VEQXdJRUF3VUZCQVFBQUFGOUFRSURBQVFSQlJJaE1VRUdFMUZoQnlKeEZES0JrYUVJSTBLeHdSVlMwZkFrTTJKeWdna0sNCi0gRmhjWUdSb2xKaWNvS1NvME5UWTNPRGs2UTBSRlJrZElTVXBUVkZWV1YxaFpXbU5rWldabmFHbHFjM1IxZG5kNGVYcURoSVdHDQotIGg0aUppcEtUbEpXV2w1aVptcUtqcEtXbXA2aXBxckt6dExXMnQ3aTV1c0xEeE1YR3g4akp5dExUMU5YVzE5aloydUhpNCtUbA0KLSA1dWZvNmVyeDh2UDA5ZmIzK1BuNkFRQURBUUVCQVFFQkFRRUJBQUFBQUFBQUFRSURCQVVHQndnSkNnc1JBQUlCQWdRRUF3UUgNCi0gQlFRRUFBRUNkd0FCQWdNUkJBVWhNUVlTUVZFSFlYRVRJaktCQ0JSQ2thR3h3UWtqTTFMd0ZXSnkwUW9XSkRUaEpmRVhHQmthDQotIEppY29LU28xTmpjNE9UcERSRVZHUjBoSlNsTlVWVlpYV0ZsYVkyUmxabWRvYVdwemRIVjJkM2g1ZW9LRGhJV0doNGlKaXBLVA0KLSBsSldXbDVpWm1xS2pwS1dtcDZpcHFyS3p0TFcydDdpNXVzTER4TVhHeDhqSnl0TFQxTlhXMTlqWjJ1TGo1T1htNStqcDZ2THoNCi0gOVBYMjkvajUrdi9hQUF3REFRQUNFUU1SQUQ4QUZGU3FLa1pJb3FSVnBnU0tLZUJURU9BcHdGQURzVVlwZ0lSU0VVQU5JcHBGDQotIElDTmhVVENnQ01pbzJGSUNKaFVMQ2dDMG9xVmFBSkZGU3FLQmtnRk9BcGlIQ25DZ0IyS01VQ0VOSlFBMGltRVVER01LaVlVQQ0KLSBSdFViVWdJV3FKaFFCWlNwRm9BbFdwVm9HUEZQRk1RN3RTSzJPRFFBNHlLTzlIbUtlOUZ4QXpESEZJT2xBQWFZYUFHTlVUVUQNCi0gSW1xTnFRRVRWRTFBRTZWS0tBSkZOU3FhQUhnMDhHbUFOSUZGUU01WTVxSk1CdVQ2MFpOUUljcmtWWVNRTUt1TEdLYWFhc1F4DQotIHFpYWdaRTFSdFNBamFvbW9Ba1ExS3BvQWxVMUlwb0FrVTA3T0JUQXJPKzVxa1YxMlk3MWxmVUJtYUtrQ1JTdXpuclRGYmEyYQ0KLSBvQ3dHeU0wRTFxSWpZMUd4b0dSTlVaTklDTnFpYWdCeUdwbE5BRWltcEZOTUI0WUR2U3VjcHhTWUVJVTA0S2F6c0F1MXFBclUNCi0gV0VMdFBwVFNwb3NCTkVUdDVweE5hb0NOalViR2dDTmpVWm9HUnRVVFVnRlUxS3BvQWtCcVFIaWdDRm5PN3JVcU9kbFpwNmdBDQotIGMrdE9EbjFwWEFYekQ2MGVZZlduY1F2bU5TR1EwN2dPTWhDVkVKR3oxcHRnUzV5S1l4cXdHRTFHeG9BaWFtR2tNYXBxVlRRQg0KLSBLcHArZUtBSUNmbXFXTS9LYXo2Z0FOT0JxUUZ6Um1tQXVhVE5BQ3Nma3FNSG1tOXdKczhVMG10UkRHTlJzYUFJMnBocERJMU4NCi0gU3FhQUpGTlNBOFVDSVNmbXFTTS9LYXo2akFIbW5BMUlDZzB1YUFGelNacGdLeCtTbURyVGU0RTJlS2FUV29pTW1tTWFBSXpUDQotIERTR1JLYWtVMEFTS2FlRFRFUnNlYWtqUHltcytveEFhY0RVZ09CcGMwZ0Z6U1pwZ09ZL0tLWXYzcXJxSWxwcHJRQmpHb3lhQQ0KLSBHR21ta01nVTFJcHBnUEJxUUdnUXUwR240d3ZGS3dFUXB3TlpESFpwYzBBTG1pZ1JLQmxlYVFLQld0Z0EwMDFRREdxTTBnR20NCi0gbUdrTXJxYWtCb0FlcHA0Tk1SSURUd2FBRTJBMDA4R29rZ0h4amQxcHpLRnBXMHVBZzVOU0JCVGlyZ09wRFdnRFRUVFFBdzB3DQotIDBnR0dtbWdaV0JwNHBBU0thZURURU9CcDROQUR3YWpiclV5QkVrWFduU1VkQUdyMXFlaUFNU2tOV0FocGhvQWFhWWFRRERUVA0KLSBTR1ZSVHdhWUR4VHdhQkR3YWVEUUE0R2xLNW9hdUllbzIwcEdhTGFBS3FnVTZoS3dCU0dtQWhwaG9BYWFZYVF4aHBwcERLZ04NCi0gUEZNQjRwNG9FUEZPQnBnUEJwNE5BaHdwd29BV2xvQUtTZ0JEVFRRTVlhWWFRRFRUVFNHQS85bi8yd0NFQUFvSEJ3Z0hCZ29JDQotIENBZ0xDZ29MRGhnUURnME5EaDBWRmhFWUl4OGxKQ0lmSWlFbUt6Y3ZKaWswS1NFaU1FRXhORGs3UGo0K0pTNUVTVU04U0RjOQ0KLSBQanNCQ2dzTERnME9IQkFRSERzb0lpZzdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czcNCi0gT3pzN096czdPenM3T3pzN08vL0FBQkVJQUVnQVlBTUJJUUFDRVFFREVRSC94QUdpQUFBQkJRRUJBUUVCQVFBQUFBQUFBQUFBDQotIEFRSURCQVVHQndnSkNnc1FBQUlCQXdNQ0JBTUZCUVFFQUFBQmZRRUNBd0FFRVFVU0lURkJCaE5SWVFjaWNSUXlnWkdoQ0NOQw0KLSBzY0VWVXRId0pETmljb0lKQ2hZWEdCa2FKU1luS0NrcU5EVTJOemc1T2tORVJVWkhTRWxLVTFSVlZsZFlXVnBqWkdWbVoyaHANCi0gYW5OMGRYWjNlSGw2ZzRTRmhvZUlpWXFTazVTVmxwZVltWnFpbzZTbHBxZW9xYXF5czdTMXRyZTR1YnJDdzhURnhzZkl5Y3JTDQotIDA5VFYxdGZZMmRyaDR1UGs1ZWJuNk9ucThmTHo5UFgyOS9qNStnRUFBd0VCQVFFQkFRRUJBUUFBQUFBQUFBRUNBd1FGQmdjSQ0KLSBDUW9MRVFBQ0FRSUVCQU1FQndVRUJBQUJBbmNBQVFJREVRUUZJVEVHRWtGUkIyRnhFeUl5Z1FnVVFwR2hzY0VKSXpOUzhCVmkNCi0gY3RFS0ZpUTA0U1h4RnhnWkdpWW5LQ2txTlRZM09EazZRMFJGUmtkSVNVcFRWRlZXVjFoWldtTmtaV1puYUdscWMzUjFkbmQ0DQotIGVYcUNnNFNGaG9lSWlZcVNrNVNWbHBlWW1acWlvNlNscHFlb3FhcXlzN1MxdHJlNHVickN3OFRGeHNmSXljclMwOVRWMXRmWQ0KLSAyZHJpNCtUbDV1Zm82ZXJ5OC9UMTl2ZjQrZnIvMmdBTUF3RUFBaEVERVFBL0FKN1NMZ2NWcjIwSTRyTkZHdmJRQUFIRmFFVVgNCi0gU3JRaTVIQ01kS2s4b1k2VlNKWXg0aGpwVmFXTWVsQUZDNGlHRHhXUGRSOG1reG1SZHhqQnJFdkkrdFpqTjIweHRITmJOcUFjDQotIFVJRFhnNkNyMFdLdENZOFhLUU95ek9CM0ZLTldzeWNlWitsUzZzWTZOa2p2UFNkd0ltQkhVbW15NHEwNzZvQ2pPT0RXUGRnYw0KLSAwTXBHUGRBWU5ZbDRvNXJOak5Lemt5b3JadFh4aWhBYTF2SURpcDdtOUZyYjcvNGp3S2NueXhiRXpOM2llSnBwWnN5WjRVMUgNCi0gdXJ6WmF1NG1XVmxOckdrMFV1V1BWYTFZcm9YRUlrSGZyWFpoNVc5MFJXbmNBSG1zaTZiSk5kUTBaTnczQnJHdWlNR3MyTWtzDQotIHB1QnpXemJ6ZE9hRUJlT3BSMm9VdGtrOWhUcnU3aXVvNG04d2dlbUt5cVRpMDRzQnNma0VmNjhqOEtsVVFaejlvL1N1WlJqMw0KLSBKWXJpQWppNC9TcDdXNmh0YlYyYVhjdTcwcmFtb3hsZTRnTjdIY0lYamJpcys0azVOZGFhYXVobVZjdjFySHVXNjFER2lHMW0NCi0gNmMxczIwL1RtZ0F2NXZtajU3VktrMytpeG5QYzF4VlY3MGg5Q1ZKdU90U3JMNzFoRmd4elNjVWtrbitpWS8ycTFpOXhEckdUDQotIDl5MzFwSjVPdGQxTCtHaE15N21UcldYTzJTYXBqUm4yOHZUbXRhM254am1nR092SmQydzFLa3YraXB6L0FCR3VPb3ZlWWRDZQ0KLSBPYmpyVTZ5NXJsc0E4eWNVa3NuK2lqL2VOYXc2aUpMTnNXNTl6VEpuNjgxNkZQNEVKbWJPK1NhejVtNjAyVWpJZ2s0SE5hZHYNCi0gTHdLYUJsK01wSU1PTWlwcDQ5MFNDSmVGN0NvcVF2RjJKdVJxV1E0WUVHclNpUUp1S25IclhCeU1wa2k3M0dGQk5YSW9oOW4yDQotIFNybm5PSzZNUFRiZDNzU3dJVkYycU1DcWt6SG11eTFsWVJuVEhyVkdXcFphTUtCK0JXbGJ5Y1lvUU0wSVpEeHpWK0dVOGMxYQ0KLSBJWXk1WStkbkhhdEFzZnNBSGZBcm1TMW1Qb2gxZ1Q4eDlxdGsxclFYN3RDZTVESWFwekd0R0JRbTcxU2xxR1dqbklINlZvd3QNCi0gem1oQXkvRTN2VjZGNnRFTXV4bFdJeUFmclZ4Q0NBTzFWWkVFeVlBNEFBcHhOR3d5SitsVkpSVXNhS013NjFTbEZRelJBUC9aDQotDQotWC1BVFRSSUJVVEU6U29tZSBTdHJpbmcNCi1CREFZOjE5ODAwMTAxDQotR0VPOjM1LjY1NjM4NTQsMTM5LjY5OTQyMzMNCi1VUkw6aHR0cDovL3d3dy5leGFtcGxlLmNvbS8NCi1SRVY6MjAwODA0MjRUMTk1MjQzWg0KLUVORDpWQ0FSRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ltLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ltLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYWFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9pbS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotWC1BTkRST0lELUNVU1RPTTp2bmQuYW5kcm9pZC5jdXJzb3IuaXRlbS9uaWNrbmFtZTtOaWNrOzE7Ozs7Ozs7Ozs7Ozs7Ci1YLUdPT0dMRS1UQUxLOmhoaEBnbWFpbC5jb20KLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9jb21tZW50X2xpbmUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTEwNzEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfY29tbWVudF9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOnZDYXJkDQotVkVSU0lPTjoyLjENCi1VSUQ6MzU3DQotTjo7Q29uZmVyZW5jZSBDYWxsDQotRk46Q29uZmVyZW5jZSBDYWxsDQotIyBUaGlzIGxpbmUgbXVzdCBiZSBpZ25vcmVkLg0KLU5PVEU7RU5DT0RJTkc9UVVPVEVELVBSSU5UQUJMRTpUaGlzIGlzIGFuIChzaGFycCAtPj0NCi0jPC0gc2hhcnApIGV4YW1wbGUuIFRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLg0KLSMgVGhpcyBsaW5lIG11c3QgYmUgaWdub3JlZCB0b28uDQotRU5EOnZDYXJkDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODFmZDUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfaW52YWxpZF9tdWx0aXBsZV9saW5lLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotQkVHSU46VkNBUkQKLVZFUlNJT046Mi4xCi1OOjtPbWVnYTs7OwotRU1BSUw7SU5URVJORVQ6Ik9tZWdhIgotICA8b21lZ2FAZXhhbXBsZS5jb20+Ci1GTjpPbWVnYQotRU5EOlZDQVJECmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8xLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVlMmZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX2phcGFuZXNlXzEudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoOzs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3js7OzsNCi1URUw7UFJFRjtWT0lDRTowMzAwMDAwMDAwDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfamFwYW5lc2VfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NGFjYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9qYXBhbmVzZV8yLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1GTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhIIONg0ODaCAxDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhO4ONg0ODaDE7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTeszvbssTeMTs7Ow0KLUFEUjtIT01FO0NIQVJTRVQ9U0hJRlRfSklTO0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6Oz05Mz04Qz04Qj05RT05Mz03Mz0NCi09OEY9NjE9OTI9NEE9OEI9RTY9OEQ9Rjc9OEI9NzU9OTI9QUMyNi0xPTgzPTVBPTgzPThCPTgzPThBPTgzPTQxPTgzPTkzPQ0KLT04Mz01RT04Mz04Rj04MT01QjY9OEE9NEI7Ozs7MTUwLTg1MTI7DQotTk9URTtDSEFSU0VUPVNISUZUX0pJUztFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOj04Mz04MT04Mz04Mg0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX211bHRpcGxlX2VudHJ5LnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYjE5YS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9tdWx0aXBsZV9lbnRyeS52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoMzs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN4zOzs7Ow0KLVRFTDtYLU5FQy1TRUNSRVQ6OQ0KLVRFTDtYLU5FQy1IT1RFTDoxMA0KLVRFTDtYLU5FQy1TQ0hPT0w6MTENCi1URUw7SE9NRTtGQVg6MTINCi1FTkQ6VkNBUkQNCi0NCi0NCi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotTjtDSEFSU0VUPVNISUZUX0pJUzqIwJOhg42DQ4NoNDs7OzsNCi1TT1VORDtYLUlSTUMtTjtDSEFSU0VUPVNISUZUX0pJUzqx3cTes9uyxN40Ozs7Ow0KLVRFTDtNT0RFTToxMw0KLVRFTDtQQUdFUjoxNA0KLVRFTDtYLU5FQy1GQU1JTFk6MTUNCi1URUw7WC1ORUMtR0lSTDoxNg0KLUVORDpWQ0FSRA0KLQ0KLQ0KLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OO0NIQVJTRVQ9U0hJRlRfSklTOojAk6GDjYNDg2g1Ozs7Ow0KLVNPVU5EO1gtSVJNQy1OO0NIQVJTRVQ9U0hJRlRfSklTOrHdxN6z27LE3jU7Ozs7DQotVEVMO1gtTkVDLUJPWToxNw0KLVRFTDtYLU5FQy1GUklFTkQ6MTgNCi1URUw7WC1ORUMtUEhTOjE5DQotVEVMO1gtTkVDLVJFU1RBVVJBTlQ6MjANCi1FTkQ6VkNBUkQNCi0NCi0NCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9vcmdfYmVmb3JlX3RpdGxlLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmYxMTkwLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX29yZ19iZWZvcmVfdGl0bGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046Mi4xDQotRk46Tm9ybWFsIEd1eQ0KLU9SRzpDb21wYW55O09yZ2FuaXphdGlvbjtEZXZpc2lvbjtSb29tO1NoZWV0IE5vLg0KLVRJVExFOkV4Y2VsbGVudCBKYW5pdG9yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfcHJlZl9oYW5kbGluZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNTMxMC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9wcmVmX2hhbmRsaW5nLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUJFR0lOOlZDQVJECi1WRVJTSU9OOjIuMQotRk46U21pdGgKLVRFTDtIT01FOjEKLVRFTDtXT1JLO1BSRUY6MgotVEVMO0lTRE46MwotRU1BSUw7UFJFRjtIT01FOnRlc3RAZXhhbXBsZS5jb20KLUVNQUlMO0NFTEw7UFJFRjp0ZXN0MkBleGFtaW5hdGlvbi5jb20KLU9SRzpDb21wYW55Ci1USVRMRTpFbmdpbmVlcgotT1JHOk15c3RlcnkKLVRJVExFOkJsb2dnZXIKLU9SRzpQb2V0cnkKLVRJVExFOlBvZXQKLUVORDpWQ0FSRApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzEudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFiYjRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8xLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1OOkFuZG87Um9pZDsNCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMi52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDVhYjUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfc2ltcGxlXzIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLUZOOkFuZG8gUm9pZA0KLUVORDpWQ0FSRA0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3NpbXBsZV8zLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZGFiYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV9zaW1wbGVfMy52Y2YKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLUJFR0lOOlZDQVJEDQotTjpBbmRvO1JvaWQ7DQotRk46QW5kbyBSb2lkDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfdGl0bGVfYmVmb3JlX29yZy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkYzczOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YyMV90aXRsZV9iZWZvcmVfb3JnLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjIuMQ0KLUZOOk5pY2UgR3V5DQotVElUTEU6Q29vbCBUaXRsZQ0KLU9SRzpNYXJ2ZXJvdXM7UGVyZmVjdDtHcmVhdDtHb29kO0JhZDtQb29yDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MjFfd2lubW9fNjUudmNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzgwZDBkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjIxX3dpbm1vXzY1LnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUJFR0lOOlZDQVJEDQotVkVSU0lPTjoyLjENCi1OOkV4YW1wbGU7Ozs7DQotRk46RXhhbXBsZQ0KLUFOTklWRVJTQVJZO1ZBTFVFPURBVEU6MjAwOTEwMTANCi1BR0VOVDpJbnZhbGlkIGxpbmUgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseS4NCi1YLUNMQVNTOlBVQkxJQw0KLVgtUkVEVUNUSU9OOg0KLVgtTk86DQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX2NvbW1hX3NlcGFyYXRlZC52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmFmODguLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfY29tbWFfc2VwYXJhdGVkLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU47VFlQRT1QUkVGLEhPTUU6RjtHO007Ow0KLVRFTDtUWVBFPSJDT01NQSxTRVBBUkFURUQ6SU5TSURFLkRRVU9URSIsUFJFRjoxDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZiBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9yYXcvdjMwX211bHRpYnl0ZV9wYXJhbS52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjAwZTUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfbXVsdGlieXRlX3BhcmFtLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLU46RjtHO007Ow0KLVRFTDtUWVBFPSLotLkiOjENCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9wYWdlci52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9wYWdlci52Y2YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTdmMjAuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfcGFnZXIudmNmCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1CRUdJTjpWQ0FSRA0KLVZFUlNJT046My4wDQotTjpGO0c7TTs7DQotVEVMO1RZUEU9UEFHRVIsV09SSyxNU0c6NjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20NCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92MzBfc2ltcGxlLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4NjYxZi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3YzMF9zaW1wbGUudmNmCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjMuMA0KLUZOOkFuZCBSb2lkDQotTjpBbmQ7Um9pZDs7Ow0KLU9SRzpPcGVuO0hhbmRzZXQ7IEFsbGlhbmNlDQotU09SVC1TVFJJTkc6YW5kcm9pZA0KLVRFTDtUWVBFPVBSRUY7VFlQRT1WT0lDRTowMzAwMDAwMDAwDQotQ0xBU1M6UFVCTElDDQotWC1HTk86MA0KLVgtR046Z3JvdXAwDQotWC1SRURVQ1RJT046MA0KLVJFVjoyMDA4MTAzMVQwNjU4NTRaDQotRU5EOlZDQVJEDQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3Jhdy92NDBfc29ydF9hcy52Y2YgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3Y0MF9zb3J0X2FzLnZjZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2YmMzYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvcmF3L3Y0MF9zb3J0X2FzLnZjZgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQkVHSU46VkNBUkQNCi1WRVJTSU9OOjQuMA0KLUZOOuWuieiXpCDjg63jgqTjg4kNCi1OO1NPUlQtQVM9IuOBguOCk+OBqeOBhjvjgo3jgYTjgakiOuWuieiXpDvjg63jgqTjg4k7OzsNCi1PUkc7VFlQRT1XT1JLO1NPUlQtQVM9IuOBkOODvOOBkOOCizvjgZHjgpPjgZXjgY/jgbbjgoLjgpMiOuOCsOODvOOCsOODqzvmpJzntKLpg6jploANCi1FTkQ6VkNBUkQNCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTUxZWVhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGV4dCB0aGUgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgZW5kIHRvIGVuZC4KLSAqIDxwPgotICogTm90ZTogU2luY2UgYWNjZXNzaWJpbGl0eSBpcyBwcm92aWRlZCBieSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3ZSBjcmVhdGUgb25lLAotICogYW5kIGl0IGdlbmVyYXRlcyBhbiBldmVudCBhbmQgYW4gaW50ZXJydXB0aW9uIGRpc3BhdGNoaW5nIHRoZW0gdGhyb3VnaCB0aGUKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5TWFuYWdlcn0uIFdlIHZlcmlmeSB0aGUgcmVjZWl2ZWQgcmVzdWx0LiBUbyB0cmlnZ2VyIHRoZSB0ZXN0Ci0gKiBnbyB0byBTZXR0aW5ncy0+QWNjZXNzaWJpbGl0eSBhbmQgc2VsZWN0IHRoZSBlbmFibGUgYWNjZXNzaWJpbGl0eSBjaGVjayBhbmQgdGhlbgotICogc2VsZWN0IHRoZSBjaGVjayBmb3IgdGhpcyBzZXJ2aWNlIChzYW1lIG5hbWUgYXMgdGhlIGNsYXNzKS4KLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSBleHRlbmRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJmb28uYmFyLmJhei5UZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImZvby5iYXIuYmF6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJTb21lIHN0dWZmIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVGT1JFX1RFWFQgPSAiU29tZSBvdGhlciBzdHVmZiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ERVNDUklQVElPTiA9ICJDb250ZW50IGRlc2NyaXB0aW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0NPVU5UID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlJFTlRfSVRFTV9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPSAweDAwMDAwMjAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZST01fSU5ERVggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERFRF9DT1VOVCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRURfQ09VTlQgPSAxOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGSUNBVElPTl9USU1FT1VUX01JTExJUyA9IDgwOwotCi0gICAgcHJpdmF0ZSBpbnQgbVJlY2VpdmVkUmVzdWx0OwotCi0gICAgcHJpdmF0ZSBUaW1lciBtVGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7Ci0gICAgICAgIGluZm8uZXZlbnRUeXBlcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFU19BTExfTUFTSzsKLSAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKLSAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gTk9USUZJQ0FUSU9OX1RJTUVPVVRfTUlMTElTOwotICAgICAgICBpbmZvLmZsYWdzICY9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOwotICAgICAgICBzZXRTZXJ2aWNlSW5mbyhpbmZvKTsKLQotICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHN5c3RlbSBwaWNrcyBvdXIgY29uZmlndXJhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBub3Qgbm90aWZ5IHVzCi0gICAgICAgIG1UaW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbnRlcnJ1cHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3IgaW4gdGVzdGluZyBBY2Nlc3NpYmlsaXR5IGZlYXR1cmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGhlcmUgaWYgdGhlIGV2ZW50IHdlIHJlY2VpdmVkIGlzIGFjdHVhbGx5IHRoZSBvbmUgd2Ugc2VudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgYXNzZXJ0KEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEID09IGV2ZW50LmdldEV2ZW50VHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnQoZXZlbnQuZ2V0RXZlbnRUaW1lKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0KENMQVNTX05BTUUuZXF1YWxzKGV2ZW50LmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydChQQUNLQUdFX05BTUUuZXF1YWxzKGV2ZW50LmdldFBhY2thZ2VOYW1lKCkpKTsKLSAgICAgICAgYXNzZXJ0KDEgPT0gZXZlbnQuZ2V0VGV4dCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydChURVhULmVxdWFscyhldmVudC5nZXRUZXh0KCkuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydChCRUZPUkVfVEVYVC5lcXVhbHMoZXZlbnQuZ2V0QmVmb3JlVGV4dCgpKSk7Ci0gICAgICAgIGFzc2VydChldmVudC5pc0NoZWNrZWQoKSk7Ci0gICAgICAgIGFzc2VydChDT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhldmVudC5nZXRDb250ZW50RGVzY3JpcHRpb24oKSkpOwotICAgICAgICBhc3NlcnQoSVRFTV9DT1VOVCA9PSBldmVudC5nZXRJdGVtQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChDVVJSRU5UX0lURU1fSU5ERVggPT0gZXZlbnQuZ2V0Q3VycmVudEl0ZW1JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzRW5hYmxlZCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmlzUGFzc3dvcmQoKSk7Ci0gICAgICAgIGFzc2VydChGUk9NX0lOREVYID09IGV2ZW50LmdldEZyb21JbmRleCgpKTsKLSAgICAgICAgYXNzZXJ0KEFEREVEX0NPVU5UID09IGV2ZW50LmdldEFkZGVkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydChSRU1PVkVEX0NPVU5UID09IGV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0KGV2ZW50LmdldFBhcmNlbGFibGVEYXRhKCkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydCgxID09ICgoTm90aWZpY2F0aW9uKSBldmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpKS5pY29uKTsKLQotICAgICAgICAvLyBzZXQgdGhlIHR5cGUgb2YgdGhlIHJlY2V2ZWQgcmVxdWVzdAotICAgICAgICBtUmVjZWl2ZWRSZXN1bHQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYSBmbGFnIHRoYXQgd2UgcmVjZWl2ZWQgdGhlIGludGVycnVwdCByZXF1ZXN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uSW50ZXJydXB0KCkgewotCi0gICAgICAgIC8vIHNldCB0aGUgdHlwZSBvZiB0aGUgcmVjZXZlZCByZXF1ZXN0Ci0gICAgICAgIG1SZWNlaXZlZFJlc3VsdCA9IElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gaXMgc2VudCBhbmQgcmVjZWl2ZWQgY29ycmVjdGx5LgotICAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudERpc3BhdGNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KLSAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7Ci0KLSAgICAgICBhc3NlcnQoZXZlbnQgIT0gbnVsbCk7Ci0gICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKENMQVNTX05BTUUpOwotICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKFBBQ0tBR0VfTkFNRSk7Ci0gICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZChURVhUKTsKLSAgICAgICBldmVudC5zZXRCZWZvcmVUZXh0KEJFRk9SRV9URVhUKTsKLSAgICAgICBldmVudC5zZXRDaGVja2VkKHRydWUpOwotICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihDT05URU5UX0RFU0NSSVBUSU9OKTsKLSAgICAgICBldmVudC5zZXRJdGVtQ291bnQoSVRFTV9DT1VOVCk7Ci0gICAgICAgZXZlbnQuc2V0Q3VycmVudEl0ZW1JbmRleChDVVJSRU5UX0lURU1fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7Ci0gICAgICAgZXZlbnQuc2V0RnJvbUluZGV4KEZST01fSU5ERVgpOwotICAgICAgIGV2ZW50LnNldEFkZGVkQ291bnQoQURERURfQ09VTlQpOwotICAgICAgIGV2ZW50LnNldFJlbW92ZWRDb3VudChSRU1PVkVEX0NPVU5UKTsKLSAgICAgICBldmVudC5zZXRQYXJjZWxhYmxlRGF0YShuZXcgTm90aWZpY2F0aW9uKDEsICJGb28iLCAxMjM0KSk7Ci0KLSAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZSh0aGlzKS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLQotICAgICAgIGFzc2VydChtUmVjZWl2ZWRSZXN1bHQgPT0gZXZlbnQuZ2V0RXZlbnRUeXBlKCkpOwotCi0gICAgICAgTG9nLmkoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSN0ZXN0QWNjZXNzaWJpbGl0eUV2ZW50RGlzcGF0Y2hpbmc6IFN1Y2Nlc3MiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBJZiBhY2Nlc3NpYmlsaXR5IGZlZWRiYWNrIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIHJlY2VpdmVkIGNvcnJlY3RseS4KLSAgICAqLwotICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMpLmludGVycnVwdCgpOwotCi0gICAgICAgYXNzZXJ0KElOVEVSUlVQVF9JTlZPQ0FUSU9OX1RZUEUgPT0gbVJlY2VpdmVkUmVzdWx0KTsKLQotICAgICAgIExvZy5pKExPR19UQUcsICJBY2Nlc3NpYmlsaXR5VGVzdFNlcnZpY2UjdGVzdEludGVycnVwdDogU3VjY2VzcyIpOwotICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQppbmRleCAxNDk2ODVjLi5kOGQ5ZWJhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU3RyZXNzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKQEAgLTc4LDUwICs3OCw0IEBACiAKICAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWlyKCkgewotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNIZWFkc2V0QWRkcmVzcyk7Ci0KLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RBMmRwKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RBMmRwSXRlcmF0aW9uczsKLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQTJkcEFkZHJlc3MpOwotCi0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEEyZHAgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RBMmRwKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RBMmRwKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBVbnBhaXIgZnJvbSBkZXZpY2UgaWYgZGV2aWNlIGNhbiBhY2NlcHQgcGFpcmluZyBhZnRlciB1bnBhaXJpbmcKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0SGVhZHNldCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0SGVhZHNldEl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0hlYWRzZXRBZGRyZXNzKTsKLQotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RIZWFkc2V0IGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0SGVhZHNldChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0SGVhZHNldChhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogVW5wYWlyIGZyb20gZGV2aWNlIGlmIGRldmljZSBjYW4gYWNjZXB0IHBhaXJpbmcgYWZ0ZXIgdW5wYWlyaW5nCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQppbmRleCAyZTZkYWEzLi5jZjBmZjk5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKQEAgLTI2LDExICsyNiw2IEBACiAgICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZUl0ZXJhdGlvbnMgPSAxMDA7CiAgICAgcHVibGljIHN0YXRpYyBpbnQgc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnMgPSAxMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTY2FuSXRlcmF0aW9ucyA9IDEwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucyA9IDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEEyZHBJdGVyYXRpb25zID0gMTAwOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0hlYWRzZXRBZGRyZXNzID0gIiI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0EyZHBBZGRyZXNzID0gIiI7CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgewpAQCAtNzQsMzMgKzY5LDUgQEAKICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9hMmRwX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNDb25uZWN0QTJkcEl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJjb25uZWN0X2hlYWRzZXRfaXRlcmF0aW9ucyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImhlYWRzZXRfYWRkcmVzcyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNIZWFkc2V0QWRkcmVzcyA9IHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImEyZHBfYWRkcmVzcyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNBMmRwQWRkcmVzcyA9IHZhbDsKLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQppbmRleCBlOTMxMWUwLi44MmRlNTA5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CiAKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhIZWFkc2V0LlNlcnZpY2VMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKQEAgLTU4LDM2ICs1Nyw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9ESVNDT1ZFUllfVElNRU9VVCA9IDUwMDA7CiAKLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoRGV2aWNlI2NyZWF0ZUJvbmQoKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aERldmljZSNyZW1vdmVCb25kKCl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlBBSVJfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEEyZHAjY29ubmVjdFNpbmsoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQTJEUF9USU1FT1VUID0gMjAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaW1lb3V0IGZvciB7QGxpbmsgQmx1ZXRvb3RoQTJkcCNkaXNjb25uZWN0U2luayhCbHVldG9vdGhEZXZpY2UpfSBpbiBtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09OTkVDVF9BMkRQX1RJTUVPVVQgPSAyMDAwMDsKLQotICAgIC8qKgotICAgICAqIFRpbWVvdXQgZm9yIHtAbGluayBCbHVldG9vdGhIZWFkc2V0I2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aERldmljZSl9IGluIG1zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX0hFQURTRVRfVElNRU9VVCA9IDIwMDAwOwotCi0gICAgLyoqCi0gICAgICogVGltZW91dCBmb3Ige0BsaW5rIEJsdWV0b290aEhlYWRzZXQjZGlzY29ubmVjdEhlYWRzZXQoQmx1ZXRvb3RoRGV2aWNlKX0gaW4gbXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RfSEVBRFNFVF9USU1FT1VUID0gMjAwMDA7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJZX1NUQVJURURfRkxBRyA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHID0gMSA8PCAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX01PREVfTk9ORV9GTEFHID0gMSA8PCAyOwpAQCAtOTcsMjMgKzY2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PTl9GTEFHID0gMSA8PCA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9PTl9GTEFHID0gMSA8PCA3OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09GRl9GTEFHID0gMSA8PCA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX0ZMQUcgPSAxIDw8IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0ZJTEVfQTJEUF9GTEFHID0gMSA8PCAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPRklMRV9IRUFEU0VUX0ZMQUcgPSAxIDw8IDExOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfU1RBVEVfQk9OREVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFJUl9TVEFURV9CT05ESU5HID0gMSA8PCAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1NUQVRFX05PTkUgPSAxIDw8IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQTJEUF9TVEFURV9ESVNDT05ORUNURUQgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0NPTk5FQ1RJTkcgPSAxIDw8IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfQ09OTkVDVEVEID0gMSA8PCAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkcgPSAxIDw8IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEyRFBfU1RBVEVfUExBWUlORyA9IDEgPDwgNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhFQURTRVRfU1RBVEVfQ09OTkVDVElORyA9IDEgPDwgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSEVBRFNFVF9TVEFURV9DT05ORUNURUQgPSAxIDw8IDI7CiAKICAgICAvKioKICAgICAgKiBUaW1lIGJldHdlZW4gcG9sbHMgaW4gbXMuCkBAIC0xMjQsNDMgKzc2LDExIEBACiAKICAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIG1PdXRwdXRXcml0ZXI7CiAKLSAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUEyZHA7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUhlYWRzZXQ7Ci0KICAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0RmlsZTsKICAgICBwcml2YXRlIFN0cmluZyBtVGFnOwotICAgIHByaXZhdGUgY2xhc3MgSGVhZHNldFNlcnZpY2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlcnZpY2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGVkID0gZmFsc2U7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgbUhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIgPSBuZXcgSGVhZHNldFNlcnZpY2VMaXN0ZW5lcigpOwogCiAgICAgcHJpdmF0ZSBjbGFzcyBCbHVldG9vdGhSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtUGFpckZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtQTJkcEZpcmVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtSGVhZHNldEZpcmVkRmxhZ3MgPSAwOwogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CkBAIC0yMDIsNTggKzEyMiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gU1RBVEVfVFVSTklOR19PRkZfRkxBRzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9GTEFHOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX0JPTkRfU1RBVEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9CT05ERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhaXJGaXJlZEZsYWdzIHw9IFBBSVJfU1RBVEVfQk9ORElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFpckZpcmVkRmxhZ3MgfD0gUEFJUl9TVEFURV9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhBMmRwLkFDVElPTl9TSU5LX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBMmRwLkVYVFJBX1NJTktfU1RBVEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0NPTk5FQ1RFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwRmlyZWRGbGFncyB8PSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcEZpcmVkRmxhZ3MgfD0gQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzIHw9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoSGVhZHNldC5FWFRSQV9TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzdGF0ZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfRElTQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXRGaXJlZEZsYWdzIHw9IEhFQURTRVRfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjQsMzAgKzEzMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgaW50IGdldFBhaXJGaXJlZEZsYWdzKCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYWlyRmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QTJkcEZpcmVkRmxhZ3MoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHBGaXJlZEZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRIZWFkc2V0RmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldEZpcmVkRmxhZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgdm9pZCByZXNldEZpcmVkRmxhZ3MoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgICAgICBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgbVBhaXJGaXJlZEZsYWdzID0gMDsKLSAgICAgICAgICAgICAgICBtQTJkcEZpcmVkRmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgIG1IZWFkc2V0RmlyZWRGbGFncyA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NzIsMzUxICs0MTksNiBAQAogCiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQQUlSX1NUQVRFX0ZMQUc7Ci0gICAgICAgIGludCBwYWlyTWFzayA9IFBBSVJfU1RBVEVfQk9ORElORyB8IFBBSVJfU1RBVEVfQk9OREVEOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJwYWlyKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgIC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgbWFzayA9IHBhaXJNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5jcmVhdGVCb25kKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJwYWlyKCkgaW52YWxpZGUgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFBBSVJfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCkgJiBwYWlyTWFzaykgPT0gcGFpck1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgicGFpcigpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgcGFpckZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0UGFpckZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInBhaXIoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgIgotICAgICAgICAgICAgICAgICsgInBhaXJGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgbWFzaywgcGFpckZpcmVkRmxhZ3MsIHBhaXJNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5wYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBBSVJfU1RBVEVfRkxBRzsKLSAgICAgICAgaW50IHBhaXJNYXNrID0gUEFJUl9TVEFURV9OT05FOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJ1bnBhaXIoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJ1bnBhaXIoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFVOUEFJUl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlLmdldEJvbmRTdGF0ZSgpID09IEJsdWV0b290aERldmljZS5CT05EX05PTkUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCkgJiBwYWlyTWFzaykgPT0gcGFpck1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgidW5wYWlyKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IHBhaXJGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldFBhaXJGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgIgotICAgICAgICAgICAgICAgICsgInBhaXJGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgbWFzaywgcGFpckZpcmVkRmxhZ3MsIHBhaXJNYXNrKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29ubmVjdEEyZHAoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIGludCBtYXNrID0gUFJPRklMRV9BMkRQX0ZMQUc7Ci0gICAgICAgIGludCBhMmRwTWFzazEgPSBBMkRQX1NUQVRFX0NPTk5FQ1RJTkcgfCBBMkRQX1NUQVRFX0NPTk5FQ1RFRCB8IEEyRFBfU1RBVEVfUExBWUlORzsKLSAgICAgICAgaW50IGEyZHBNYXNrMiA9IGEyZHBNYXNrMSBeIEEyRFBfU1RBVEVfQ09OTkVDVEVEOwotICAgICAgICBpbnQgYTJkcE1hc2szID0gYTJkcE1hc2sxIF4gQTJEUF9TVEFURV9QTEFZSU5HOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGRldmljZSBub3QgcGFpcmVkOiBkZXZpY2U9IiArIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhdGUgPSBtQTJkcC5nZXRTaW5rU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtQTJkcC5jb25uZWN0U2luayhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBhMmRwTWFzazEgPSBhMmRwTWFzazIgPSBhMmRwTWFzazMgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0QTJkcCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfQTJEUF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfQ09OTkVDVEVEIHx8IHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgU1RBVEVfQ09OTkVDVElORyBhbmQgKFNUQVRFX0NPTk5FQ1RFRCBvciBTVEFURV9QTEFZSU5HKSBpbnRlbnRzCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBmaXJlZCBpZiB3ZSBhcmUgY2hlY2tpbmcgaWYgaW50ZW50cyBzaG91bGQgYmUgZmlyZWQuCi0gICAgICAgICAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazEpID09IGEyZHBNYXNrMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazIpID09IGEyZHBNYXNrMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYTJkcEZpcmVkRmxhZ3MgJiBhMmRwTWFzazMpID09IGEyZHBNYXNrMykpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJjb25uZWN0QTJkcCgpIGNvbXBsZXRlZCBpbiAlZCBtczogZGV2aWNlPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzKSwgZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICBpbnQgYTJkcEZpcmVkRmxhZ3MgPSBtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImNvbm5lY3RBMmRwKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkIG9yICVkKSwgIgotICAgICAgICAgICAgICAgICsgImZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpLCBhMmRwRmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCBvciAweCV4IG9yIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQsIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORywgZmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBtYXNrLCBhMmRwRmlyZWRGbGFncywgYTJkcE1hc2sxLCBhMmRwTWFzazIsIGEyZHBNYXNrMykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RBMmRwKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfQTJEUF9GTEFHOwotICAgICAgICBpbnQgYTJkcE1hc2sgPSBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBBMkRQX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEEyZHAoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEEyZHAoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQTJkcC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmlzU2lua0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1BMmRwLmRpc2Nvbm5lY3RTaW5rKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBMmRwLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUEyZHAuZGlzY29ubmVjdFNpbmsoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtQTJkcC5pc1NpbmtDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBtYXNrID0gYTJkcE1hc2sgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJkaXNjb25uZWN0QTJkcCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IERJU0NPTk5FQ1RfQTJEUF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUEyZHAuaXNTaW5rQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0QTJkcEZpcmVkRmxhZ3MoKSAmIGEyZHBNYXNrKSA9PSBhMmRwTWFzaykgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RBMmRwKCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBhMmRwRmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRBMmRwRmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGEyZHBGbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsIHN0YXRlLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuU1RBVEVfRElTQ09OTkVDVEVELCBmaXJlZEZsYWdzLCBtYXNrLCBhMmRwRmlyZWRGbGFncywgYTJkcE1hc2spKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0SGVhZHNldChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaW50IG1hc2sgPSBQUk9GSUxFX0hFQURTRVRfRkxBRzsKLSAgICAgICAgaW50IGhlYWRzZXRNYXNrID0gSEVBRFNFVF9TVEFURV9DT05ORUNUSU5HIHwgSEVBRFNFVF9TVEFURV9DT05ORUNURUQ7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoImNvbm5lY3RIZWFkc2V0KCkgZGV2aWNlIG5vdCBwYWlyZWQ6IGRldmljZT0iICsgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghbUhlYWRzZXRTZXJ2aWNlTGlzdGVuZXIuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIG1IZWFkc2V0LmNvbm5lY3RIZWFkc2V0KGRldmljZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShtSGVhZHNldC5pc0Nvbm5lY3RlZChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIG1hc2sgPSBoZWFkc2V0TWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgZmFpbCgiY29ubmVjdEhlYWRzZXQoKSBlcnJvciBzdGF0ZSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmYWlsKCJjb25uZWN0SGVhZHNldCgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSIgKyBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfSEVBRFNFVF9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1IZWFkc2V0LmdldFN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1IZWFkc2V0LmlzQ29ubmVjdGVkKGRldmljZSkpOwotICAgICAgICAgICAgICAgIGlmICgobVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVjZWl2ZXIuZ2V0SGVhZHNldEZpcmVkRmxhZ3MoKSAmIGhlYWRzZXRNYXNrKSA9PSBoZWFkc2V0TWFzaykgewotICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImNvbm5lY3RIZWFkc2V0KCkgY29tcGxldGVkIGluICVkIG1zOiBkZXZpY2U9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMpLCBkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGludCBoZWFkc2V0RmlyZWRGbGFncyA9IG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpOwotICAgICAgICBtUmVjZWl2ZXIucmVzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiY29ubmVjdEhlYWRzZXQoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCAiCi0gICAgICAgICAgICAgICAgKyAiZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCksIGhlYWRzZXRGbGFncz0weCVzIChleHBlY3RlZCAweCV4KSIsIHN0YXRlLAotICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuU1RBVEVfQ09OTkVDVEVELCBmaXJlZEZsYWdzLCBtYXNrLCBoZWFkc2V0RmlyZWRGbGFncywKLSAgICAgICAgICAgICAgICBoZWFkc2V0TWFzaykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RIZWFkc2V0KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBST0ZJTEVfSEVBRFNFVF9GTEFHOwotICAgICAgICBpbnQgaGVhZHNldE1hc2sgPSBIRUFEU0VUX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLSAgICAgICAgbVJlY2VpdmVyLnJlc2V0RmlyZWRGbGFncygpOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBkZXZpY2Ugbm90IHBhaXJlZDogZGV2aWNlPSIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFtSGVhZHNldFNlcnZpY2VMaXN0ZW5lci5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbUhlYWRzZXQuZ2V0U3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBtSGVhZHNldC5kaXNjb25uZWN0SGVhZHNldChkZXZpY2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbUhlYWRzZXQuZGlzY29ubmVjdEhlYWRzZXQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhIZWFkc2V0LlNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGZhaWwoImRpc2Nvbm5lY3RIZWFkc2V0KCkgZXJyb3Igc3RhdGUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgZmFpbCgiZGlzY29ubmVjdEhlYWRzZXQoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0iICsgc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBESVNDT05ORUNUX0hFQURTRVRfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBtSGVhZHNldC5nZXRTdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEhlYWRzZXQuU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUhlYWRzZXQuaXNDb25uZWN0ZWQoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChtUmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzawotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1SZWNlaXZlci5nZXRIZWFkc2V0RmlyZWRGbGFncygpICYgaGVhZHNldE1hc2spID09IGhlYWRzZXRNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEhlYWRzZXQoKSBjb21wbGV0ZWQgaW4gJWQgbXM6IGRldmljZT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyksIGRldmljZSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgaW50IGhlYWRzZXRGaXJlZEZsYWdzID0gbVJlY2VpdmVyLmdldEhlYWRzZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIG1SZWNlaXZlci5yZXNldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldCgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksICIKLSAgICAgICAgICAgICAgICArICJmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSwgaGVhZHNldEZsYWdzPTB4JXMgKGV4cGVjdGVkIDB4JXgpIiwgc3RhdGUsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2ssIGhlYWRzZXRGaXJlZEZsYWdzLAotICAgICAgICAgICAgICAgIGhlYWRzZXRNYXNrKSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgd3JpdGVPdXRwdXQoU3RyaW5nIHMpIHsKICAgICAgICAgTG9nLmkobVRhZywgcyk7CiAgICAgICAgIGlmIChtT3V0cHV0V3JpdGVyID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlci5qYXZhCmluZGV4IGM0YmM3NjcuLjczNTMwZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvTWVtb3J5RmlsZVByb3ZpZGVyLmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXIuamF2YQpAQCAtMTYsMTYgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5jb250ZW50OwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuVXJpTWF0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkFzc2V0RmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZU9wZW5IZWxwZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTEzNCw2NCArMTI5LDM0IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlbkFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5GaWxlKFVyaSB1cmwsIFN0cmluZyBtb2RlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgaW50IG1hdGNoID0gc1VSTE1hdGNoZXIubWF0Y2godXJsKTsKICAgICAgICAgc3dpdGNoIChtYXRjaCkgewogICAgICAgICAgICAgY2FzZSBEQVRBX0lEX0JMT0I6CiAgICAgICAgICAgICAgICAgU3RyaW5nIHNxbCA9ICJTRUxFQ1QgX2Jsb2IgRlJPTSBkYXRhIFdIRVJFIF9pZD0iICsgdXJsLmdldFBhdGhTZWdtZW50cygpLmdldCgxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmxvYkNvbHVtbkFzQXNzZXRGaWxlKHVybCwgbW9kZSwgc3FsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmxvYkNvbHVtbkFzRmlsZSh1cmwsIG1vZGUsIHNxbCk7CiAgICAgICAgICAgICBjYXNlIEhVR0U6CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTWVtb3J5RmlsZSBtZW1vcnlGaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgNTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeUZpbGUud3JpdGVCeXRlcyhURVNUX0JMT0IsIDAsIDEwMDAwMDAsIFRFU1RfQkxPQi5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtZW1vcnlGaWxlLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFzc2V0RmlsZURlc2NyaXB0b3IuZnJvbU1lbW9yeUZpbGUobWVtb3J5RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRGF0YShURVNUX0JMT0IsIG51bGwpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgIiArIHVybCArICI6IiArIGV4LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRklMRToKICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBnZXRDb250ZXh0KCkuZ2V0RmlsZVN0cmVhbVBhdGgoREFUQV9GSUxFKTsKLSAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2V0RmlsZURlc2NyaXB0b3IoZmQsIDAsIEFzc2V0RmlsZURlc2NyaXB0b3IuVU5LTk9XTl9MRU5HVEgpOworICAgICAgICAgICAgICAgIHJldHVybiBQYXJjZWxGaWxlRGVzY3JpcHRvci5vcGVuKGZpbGUsIFBhcmNlbEZpbGVEZXNjcmlwdG9yLk1PREVfUkVBRF9PTkxZKTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gZmlsZXMgc3VwcG9ydGVkIGJ5IHByb3ZpZGVyIGF0ICIgKyB1cmwpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBBc3NldEZpbGVEZXNjcmlwdG9yIGdldEJsb2JDb2x1bW5Bc0Fzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbW9kZSwgU3RyaW5nIHNxbCkKKyAgICBwcml2YXRlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGdldEJsb2JDb2x1bW5Bc0ZpbGUoVXJpIHVybCwgU3RyaW5nIG1vZGUsIFN0cmluZyBzcWwpCiAgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCEiciIuZXF1YWxzKG1vZGUpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJNb2RlICIgKyBtb2RlICsgIiBub3Qgc3VwcG9ydGVkIGZvciAiICsgdXJsKTsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICBNZW1vcnlGaWxlIGZpbGUgPSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKGRiLCBzcWwpOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm8gc3VjaCBlbnRyeTogIiArIHVybCk7Ci0gICAgICAgICAgICBBc3NldEZpbGVEZXNjcmlwdG9yIGFmZCA9IEFzc2V0RmlsZURlc2NyaXB0b3IuZnJvbU1lbW9yeUZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBmaWxlLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIC8vIG5lZWQgdG8gZHVwIGFuZCB0aGVuIGNsb3NlPyBvcGVuRmlsZUhlbHBlcigpIGRvZXNuJ3QgZG8gdGhhdCB0aG91Z2gKLSAgICAgICAgICAgIHJldHVybiBhZmQ7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nICIgKyB1cmwgKyAiOiIgKyBleC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHByaXZhdGUgTWVtb3J5RmlsZSBzaW1wbGVRdWVyeUZvckJsb2JNZW1vcnlGaWxlKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgc3FsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucmF3UXVlcnkoc3FsLCBudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGN1cnNvci5nZXRCbG9iKDApOwotICAgICAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUobnVsbCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZpbGUud3JpdGVCeXRlcyhieXRlcywgMCwgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIHJldHVybiBEYXRhYmFzZVV0aWxzLmJsb2JGaWxlRGVzY3JpcHRvckZvclF1ZXJ5KGRiLCBzcWwsIG51bGwpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9NZW1vcnlGaWxlUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQppbmRleCA2MmI0ZTdlLi5iYmU3YzEwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L01lbW9yeUZpbGVQcm92aWRlclRlc3QuamF2YQpAQCAtNTYsNyArNTYsNiBAQAogICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiY29udGVudDovL2FuZHJvaWQuY29udGVudC5NZW1vcnlGaWxlUHJvdmlkZXIvaHVnZSIpOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSByZXNvbHZlci5vcGVuSW5wdXRTdHJlYW0odXJpKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBvcGVuIHN0cmVhbSBudW1iZXIgIiArIGksIGluKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAwMDAwLCBpbi5za2lwKDEwMDAwMDApKTsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtNZW1vcnlGaWxlUHJvdmlkZXIuVEVTVF9CTE9CLmxlbmd0aF07CiAgICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkKGJ1Zik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnVmLmxlbmd0aCwgY291bnQpOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQppbmRleCBmYjVhMzZmLi4wNzMzMjI5IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUN1cnNvclRlc3QuamF2YQpAQCAtMzMsNyArMzMsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU3VwcHJlc3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIApAQCAtNDEsOCArNDAsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogcHVibGljIGNsYXNzIERhdGFiYXNlQ3Vyc29yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFBlcmZvcm1hbmNlVGVzdENhc2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNTdHJpbmcxID0gInRoaXMgaXMgYSB0ZXN0IjsKQEAgLTkyLDQzICs4OSw2IEBACiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3Vyc29yVXBkYXRlKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgKLSAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGQgSU5URUdFUiwgcyBJTlRFR0VSKTsiKTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKLSAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgSU5UTyB0ZXN0IChkLCBzKSBWQUxVRVMgKCIgKyBpICsgCi0gICAgICAgICAgICAgICAgIiwiICsgaSUyICsgIik7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KCJ0ZXN0IiwgbnVsbCwgInMgPSAwIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGludCBkQ29sID0gYy5nZXRDb2x1bW5JbmRleE9yVGhyb3coImQiKTsKLSAgICAgICAgaW50IHNDb2wgPSBjLmdldENvbHVtbkluZGV4T3JUaHJvdygicyIpOwotICAgICAgICAKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGMudXBkYXRlSW50KGRDb2wsIDMpKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb3VudCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGMuY29tbWl0VXBkYXRlcygpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoYy5yZXF1ZXJ5KCkpOwotICAgICAgICAKLSAgICAgICAgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjLmdldEludChkQ29sKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvdW50KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjLm1vdmVUb0ZpcnN0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMuZGVsZXRlUm93KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoOSwgYy5nZXRDb3VudCgpKTsKLSAgICAgICAgYy5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgKQEAgLTE2NCwyNCArMTI0LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJsb2IsIGNCbG9iKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzLCBjLmdldFN0cmluZyhzQ29sKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoZG91YmxlKWQsIGMuZ2V0RG91YmxlKGRDb2wpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKWwsIGMuZ2V0TG9uZyhsQ29sKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBuZXcgYnl0ZVtdCi0gICAgICAgIGJ5dGVbXSBuZXdibG9iID0gbmV3IGJ5dGVbMTAwMF07Ci0gICAgICAgIHZhbHVlID0gOTg7Ci0gICAgICAgIEFycmF5cy5maWxsKGJsb2IsIHZhbHVlKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgYy51cGRhdGVCbG9iKGJDb2wsIG5ld2Jsb2IpOwotICAgICAgICBjQmxvYiA9ICBjLmdldEJsb2IoYkNvbCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXdibG9iLCBjQmxvYikpOwotICAgICAgICAKLSAgICAgICAgLy8gY29tbWl0Ci0gICAgICAgIGFzc2VydFRydWUoYy5jb21taXRVcGRhdGVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGMucmVxdWVyeSgpKTsKLSAgICAgICAgYy5tb3ZlVG9OZXh0KCk7Ci0gICAgICAgIGNCbG9iID0gIGMuZ2V0QmxvYihiQ29sKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ld2Jsb2IsIGNCbG9iKSk7ICAgICAgICAKLSAgICAgICAgYy5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGxvbmcpbCwgYy5nZXRMb25nKGxDb2wpKTsgICAgICAgIAogICAgIH0KICAgICAKICAgICBATWVkaXVtVGVzdApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUVycm9ySGFuZGxlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2UvRGF0YWJhc2VFcnJvckhhbmRsZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2U7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBEYXRhYmFzZUVycm9ySGFuZGxlclRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUUgPSAiZGF0YWJhc2VfdGVzdC5kYiI7CisgICAgcHJpdmF0ZSBGaWxlIGRiRGlyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IE15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlcigpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NvcnJ1cHRpb25DYXNlKCkgeworICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkub25Db3JydXB0aW9uKG1EYXRhYmFzZSk7CisgICAgICAgIC8vIGRhdGFiYXNlIGZpbGUgc2hvdWxkIHN0aWxsIGV4aXN0CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlRmlsZS5leGlzdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdGFiYXNlSXNDb3JydXB0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0IChpIGludCk7Iik7CisgICAgICAgIC8vIHdyaXRlIGp1bmsgaW50byB0aGUgZGF0YWJhc2UgZmlsZQorICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobURhdGFiYXNlRmlsZS5nZXRQYXRoKCkpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCJibGFoIik7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpOworICAgICAgICAvLyBzaW5jZSB0aGUgZGF0YWJhc2UgZmlsZSBpcyBub3cgY29ycnVwdCwgZG9pbmcgYW55IHNxbCBvbiB0aGlzIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gc2hvdWxkIHRyaWdnZXIgY2FsbCB0byBNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIub25Db3JydXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgic2VsZWN0ICogZnJvbSB0OyIpOworICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIC8vIGFmdGVyIGNvcnJ1cHRpb24gaGFuZGxlciBpcyBjYWxsZWQsIHRoZSBkYXRhYmFzZSBmaWxlIHNob3VsZCBiZSBmcmVlIG9mCisgICAgICAgIC8vIGRhdGFiYXNlIGNvcnJ1cHRpb24KKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyKCkpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBEYXRhYmFzZUVycm9ySGFuZGxlcn0gdG8gZGVtb25zdHJhdGUKKyAgICAgKiBkYXRhYmFzZSBjb3JydXB0aW9uIGhhbmRsZXIgd2hpY2ggY2hlY2tzIHRvIG1ha2Ugc3VyZSBkYXRhYmFzZSBpcyBpbmRlZWQKKyAgICAgKiBjb3JydXB0IGJlZm9yZSBkZWxldGluZyB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTXlEYXRhYmFzZUNvcnJ1cHRpb25IYW5kbGVyIGltcGxlbWVudHMgRGF0YWJhc2VFcnJvckhhbmRsZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvcnJ1cHRpb24oU1FMaXRlRGF0YWJhc2UgZGJPYmopIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGF0YWJhc2VPayA9IGRiT2JqLmlzRGF0YWJhc2VJbnRlZ3JpdHlPaygpOworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGRhdGFiYXNlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRiT2JqLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTUUxpdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRhdGFiYXNlT2spIHsKKyAgICAgICAgICAgICAgICAvLyBkYXRhYmFzZSBpcyBqdXN0IGZpbmUuIG5vIG5lZWQgdG8gZGVsZXRlIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgICAgICAgICAgTG9nLmUoIk15RGF0YWJhc2VDb3JydXB0aW9uSGFuZGxlciIsICJubyBjb3JydXB0aW9uIGluIHRoZSBkYXRhYmFzZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIGlzIGNvcnJ1cHQuIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZQorICAgICAgICAgICAgICAgIExvZy5lKCJNeURhdGFiYXNlQ29ycnVwdGlvbkhhbmRsZXIiLCAiZGVsZXRpbmcgdGhlIGRhdGFiYXNlIGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKaW5kZXggNjU2MDI5ZC4uY2QzOGJmMDcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL0RhdGFiYXNlR2VuZXJhbFRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9EYXRhYmFzZUdlbmVyYWxUZXN0LmphdmEKQEAgLTIxLDE4ICsyMSwyMSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVN0YXRlbWVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LlBlcmZvcm1hbmNlVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLkxhcmdlVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTWVkaXVtVGVzdDsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCkBAIC0zODIsNTQgKzM4NSwyOCBAQAogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtRGF0YWJhc2U7Ci0gICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUsIG51bGwpOwotICAgICAgICBDdXJzb3IgY3Vyc29yOwotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKKyAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1EYXRhYmFzZS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY3Vyc29yKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRDb3VudCgpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgLy8gdGhpcyBjYXVzZSBleGNlcHRpb24gYmVjYXVzZSB3ZSdyZSBzdGlsbCB1c2luZyBzcWxpdGVfcHJlcGF0ZTE2IGFuZCBub3QKLSAgICAgICAgLy8gc3FsaXRlX3ByZXBhcmUxNl92Mi4gVGhlIHYyIHZhcmlhbnQgYWRkZWQgdGhlIGFiaWxpdHkgdG8gY2hlY2sgdGhlCi0gICAgICAgIC8vIHNjaGVtYSB2ZXJzaW9uIGFuZCBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgc2NoZW1hIGhhcyBjaGFuZ2VkCi0gICAgICAgIC8vIE1hcmNvIE5lbGlzc2VuIGNsYWltIGl0IHdhcyAyeCBzbG93ZXIgdG8gY29tcGlsZSBTUUwgc3RhdGVtZW50cyBzbwotICAgICAgICAvLyBJIHJldmVydGVkIGJhY2sgdG8gdGhlIHYxIHZhcmlhbnQuCi0gICAgICAgIC8qIGRiMi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIyIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLQotICAgICAgICBjdXJzb3IgPSBkYjEucXVlcnkoImRiMSIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDdXJzb3IgaXMgbnVsbCIsIGN1cnNvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjdXJzb3IuY291bnQoKSk7Ci0gICAgICAgIGN1cnNvci5kZWFjdGl2YXRlKCk7Ci0gICAgICAgICovCisgICAgICAgIGN1cnNvci5jbG9zZSgpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUNoYW5nZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbURhdGFiYXNlOwotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLCBudWxsKTsKLSAgICAgICAgQ3Vyc29yIGN1cnNvcjsKLQotCi0gICAgICAgIGRiMS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgZGIxIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKLSAgICAgICAgZGIxLmV4ZWNTUUwoIklOU0VSVCBJTlRPIGRiMSAoZGF0YSkgVkFMVUVTICgndGVzdCcpOyIpOwotCi0gICAgICAgIGN1cnNvciA9IGRiMS5xdWVyeSgiZGIxIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vIHRoaXMgY2F1c2UgZXhjZXB0aW9uIGJlY2F1c2Ugd2UncmUgc3RpbGwgdXNpbmcgc3FsaXRlX3ByZXBhdGUxNiBhbmQgbm90Ci0gICAgICAgIC8vIHNxbGl0ZV9wcmVwYXJlMTZfdjIuIFRoZSB2MiB2YXJpYW50IGFkZGVkIHRoZSBhYmlsaXR5IHRvIGNoZWNrIHRoZQotICAgICAgICAvLyBzY2hlbWEgdmVyc2lvbiBhbmQgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHNjaGVtYSBoYXMgY2hhbmdlZAotICAgICAgICAvLyBNYXJjbyBOZWxpc3NlbiBjbGFpbSBpdCB3YXMgMnggc2xvd2VyIHRvIGNvbXBpbGUgU1FMIHN0YXRlbWVudHMgc28KLSAgICAgICAgLy8gSSByZXZlcnRlZCBiYWNrIHRvIHRoZSB2MSB2YXJpYW50LgotICAgICAgICAvKiBkYjIuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIGRiMiAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGRhdGEgVEVYVCk7Iik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3Vyc29yIGlzIG51bGwiLCBjdXJzb3IpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmNvdW50KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGN1cnNvci5maXJzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgY3Vyc29yLmdldFN0cmluZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KCJkYXRhIikpKTsKLSAgICAgICAgY3Vyc29yLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgKi8KKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBkYjEgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBkYXRhIFRFWFQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIElOVE8gZGIxIChkYXRhKSBWQUxVRVMgKCd0ZXN0Jyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJBTFRFUiBUQUJMRSBkYjEgQUREIENPTFVNTiBibGFoIGludDsiKTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGJsYWggZnJvbSBkYjEiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgQ2hhbmdlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewpAQCAtNDY3LDQ1ICs0NDQsNiBAQAogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdGlmaWNhdGlvblRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIEN1cnNvciBjID0gbUNvbnRlbnRSZXNvbHZlci5xdWVyeShOb3Rlcy5DT05URU5UX1VSSSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge05vdGVzLl9JRCwgTm90ZXMuTk9URX0sCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGMucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobmV3IE15Q29udGVudE9ic2VydmVyKHRydWUpKTsKLSAgICAgICAgaW50IGNvdW50ID0gYy5jb3VudCgpOwotCi0gICAgICAgIE15Q29udGVudE9ic2VydmVyIG9ic2VydmVyID0gbmV3IE15Q29udGVudE9ic2VydmVyKGZhbHNlKTsKLSAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihOb3Rlcy5DT05URU5UX1VSSSwgdHJ1ZSwgb2JzZXJ2ZXIpOwotCi0gICAgICAgIFVyaSB1cmk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTk9URSwgInRlc3Qgbm90ZTEiKTsKLSAgICAgICAgdXJpID0gbUNvbnRlbnRSZXNvbHZlci5pbnNlcnQoTm90ZXMuQ09OVEVOVF9VUkksIHZhbHVlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBjLnJlcXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgYy5jb3VudCgpKTsKLSAgICAgICAgYy5maXJzdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgbm90ZTEiLCBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KE5vdGVzLk5PVEUpKSk7Ci0gICAgICAgIGMudXBkYXRlU3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoTm90ZXMuTk9URSksICJ0ZXN0IG5vdGUyIik7Ci0gICAgICAgIGMuY29tbWl0VXBkYXRlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLmRlbGV0ZSh1cmksIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBtQ3Vyc29yTm90aWZpY2F0aW9uQ291bnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbU5vdGlmaWNhdGlvbkNvdW50KTsKLQotICAgICAgICBtQ29udGVudFJlc29sdmVyLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICAqLwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkFyZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0ZXN0IChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgZGF0YSBURVhUKTsiKTsKICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKQEAgLTk4OSwyMSArOTI3LDYgQEAKICAgICB9CiAKICAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYkNsb3NlUmVsZWFzaW5nQWxsQ2FjaGVkU3FsKCkgewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3QgKF9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB0ZXh0MSBURVhULCB0ZXh0MiBURVhULCAiICsKLSAgICAgICAgICAgICAgICAibnVtMSBJTlRFR0VSLCBudW0yIElOVEVHRVIsIGltYWdlIEJMT0IpOyIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdGVtZW50ID0gIkRFTEVURSBGUk9NIHRlc3QgV0hFUkUgX2lkPT87IjsKLSAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0YXRlbWVudERvTm90Q2xvc2UgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKSA+IDApOwotICAgICAgICBpbnQgblN0YXRlbWVudCA9IHN0YXRlbWVudERvTm90Q2xvc2UuZ2V0VW5pcXVlSWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnREb05vdENsb3NlLmdldFVuaXF1ZUlkKCkgPT0gblN0YXRlbWVudCk7Ci0gICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4gCi0gICAgICAgICAqIFRoYXQgc2hvdWxkIGxlYXZlIGl0IGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcy4KLSAgICAgICAgICogbURhdGFiYXNlLmNsb3NlKCkgaW4gdGVhckRvd24oKSBzaG91bGQgcmVsZWFzZSBpdC4KLSAgICAgICAgICovCi0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uc0luU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHByYWdtYV90ZXN0ICgiICsKICAgICAgICAgICAgICAgICAiaSBJTlRFR0VSIERFRkFVTFQgMTIzNCwgIiArCkBAIC0xMDIzLDYgKzk0NiwzNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pb25zV2l0aEJpbmRBcmdzKCkgeworICAgICAgICAvKiBtYWtlIHN1cmUgdW5pb25zIHdpdGggYmluZGFyZ3Mgd29yayBodHRwOi8vYi9pc3N1ZT9pZD0xMDYxMjkxICovCisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgQSAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIEIgKGsgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSBDIChuIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBBIHZhbHVlcygxKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEEgdmFsdWVzKDIpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQSB2YWx1ZXMoMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBCIHZhbHVlcygyMDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQiB2YWx1ZXMoMjAyKTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIEIgdmFsdWVzKDIwMyk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byBDIHZhbHVlcyg5MDEpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gQyB2YWx1ZXMoOTAyKTsiKTsKKyAgICAgICAgU3RyaW5nIHMgPSAic2VsZWN0IGkgZnJvbSBBIHdoZXJlIGkgPiAyICIgKworICAgICAgICAgICAgICAgICJVTklPTiBzZWxlY3QgayBmcm9tIEIgd2hlcmUgayA+IDIwMSAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT05MDA7IjsKKyAgICAgICAgQ3Vyc29yIGMgPSBtRGF0YWJhc2UucmF3UXVlcnkocywgbnVsbCk7CisgICAgICAgIGludCBuID0gYy5nZXRDb3VudCgpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIFN0cmluZyBzMSA9ICJzZWxlY3QgaSBmcm9tIEEgd2hlcmUgaSA+ID8gIiArCisgICAgICAgICAgICAgICAgIlVOSU9OIHNlbGVjdCBrIGZyb20gQiB3aGVyZSBrID4gPyAiICsKKyAgICAgICAgICAgICAgICAiVU5JT04gc2VsZWN0IG4gZnJvbSBDIHdoZXJlIG4gIT0gPzsiOworICAgICAgICBDdXJzb3IgYzEgPSBtRGF0YWJhc2UucmF3UXVlcnkoczEsIG5ldyBTdHJpbmdbXXsiMiIsICIyMDEiLCAiOTAwIn0pOworICAgICAgICBhc3NlcnRFcXVhbHMobiwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyB0ZXN0IGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gdGhlIHBsYXRmb3JtIGhhcyBhIGxvY2FsZSB3aXRoIHRoZSBsYW5ndWFnZSAiamEiLgogICAgICAqIEl0IGZpbmlzaGVzIHdpdGhvdXQgZmFpbHVyZSB3aGVuIGl0IGlzIG5vdCBhdmFpbGFibGUuICAKQEAgLTExMDgsNSArMTA1OSwxMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9ICAgIAorICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWF4Q2FoZXNpemUoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEsMSk7Iik7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIHRyeSByZWR1Y2UgY2FjaGVzaXplCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKDEpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IHNldCBjYWNoZVNpemUgdG8gYSB2YWx1ZSBsZXNzIHRoYW4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpIHsKKyAgICAgICAgRGVmYXVsdERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBEZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXIoKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGFuZCBjYWxsIGNvcnJ1cHRpb24gaGFuZGxlci4KKyAgICAgICAgLy8gaXQgc2hvdWxkIGRlbGV0ZSB0aGUgZGF0YWJhc2UgZmlsZS4KKyAgICAgICAgRmlsZSBkYmZpbGUgPSBuZXcgRmlsZShtRGF0YWJhc2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9ySGFuZGxlci5vbkNvcnJ1cHRpb24obURhdGFiYXNlKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGRiZmlsZS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYW4gaW4tbWVtb3J5IGRhdGFiYXNlLiBhbmQgY29ycnVwdGlvbiBoYW5kbGVyIHNob3VsZG4ndCB0cnkgdG8gZGVsZXRlIGl0CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIG1lbW9yeURiID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UoIjptZW1vcnk6IiwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWVtb3J5RGIpOworICAgICAgICBtZW1vcnlEYi5jbG9zZSgpOworICAgICAgICBhc3NlcnRGYWxzZShtZW1vcnlEYi5pc09wZW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvckhhbmRsZXIub25Db3JydXB0aW9uKG1lbW9yeURiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhIGRhdGFiYXNlLCBrZWVwIGl0IG9wZW4sIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiT2JqID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkYk9iaik7CisgICAgICAgIGFzc2VydFRydWUoZGJPYmouaXNPcGVuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZGF0YWJhc2UsIGF0dGFjaCAyIG1vcmUgZGF0YWJhc2VzIHRvIGl0CisgICAgICAgIC8vICAgIGF0dGFjaGVkIGRhdGFiYXNlICMgMTogIjptZW1vcnk6IgorICAgICAgICAvLyAgICBhdHRhY2hlZCBkYXRhYmFzZSAjIDI6IG1EYXRhYmFzZS5nZXRQYXRoKCkgKyAiMSI7CisgICAgICAgIC8vIGNhbGwgY29ycnVwdGlvbiBoYW5kbGVyLiBkYXRhYmFzZSBmaWxlcyBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgYXR0YWNoZWQgZGF0YWJhc2UgIyAyCisgICAgICAgIC8vIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgIFN0cmluZyBhdHRhY2hlZERiMUZpbGUgPSBtRGF0YWJhc2UuZ2V0UGF0aCgpICsgIjEiOworICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJyIgKyAgYXR0YWNoZWREYjFGaWxlICsgIicgYXMgYXR0YWNoZWREYjEiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGF0dGFjaGVkRGIxRmlsZSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRiT2JqKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9iai5pc09wZW4oKSk7CisgICAgICAgIEFycmF5TGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUoYXR0YWNoZWREYjFGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhpcyBpcyBhIGJpdCBvZiBzdHJlc3MgdGVzdGluZy4gYXR0YWNoIDUgZGF0YWJhc2UgZmlsZXMKKyAgICAgICAgLy8gYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBhbGwgcmVtb3ZlZC4KKyAgICAgICAgaW50IE4gPSA1OworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdHRhY2hlZERiRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oTik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBhdHRhY2hlZERiRmlsZXMuYWRkKG1EYXRhYmFzZS5nZXRQYXRoKCkgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBkYk9iaiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBkYk9iai5leGVjU1FMKCJBVFRBQ0ggREFUQUJBU0UgJzptZW1vcnk6JyBhcyBtZW1vcnlEYiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgZGJPYmouZXhlY1NRTCgiQVRUQUNIIERBVEFCQVNFICciICsgIGF0dGFjaGVkRGJGaWxlcy5nZXQoaSkgKyAiJyBhcyBhdHRhY2hlZERiIiArIGkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZGJmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYXR0YWNoZWREYkZpbGVzLmdldChpKSkuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoZGJPYmopOworICAgICAgICBhc3NlcnRUcnVlKGRiT2JqLmlzT3BlbigpKTsKKyAgICAgICAgYXR0YWNoZWREYnMgPSBkYk9iai5nZXRBdHRhY2hlZERicygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uQ29ycnVwdGlvbihkYk9iaik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYmZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShhdHRhY2hlZERiRmlsZXMuZ2V0KGkpKS5leGlzdHMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmV4cGVjdGVkIik7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9EYXRhYmFzZUNvbm5lY3Rpb25Qb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWRkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvRGF0YWJhc2VDb25uZWN0aW9uUG9vbFRlc3QuamF2YQpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGU7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZVRlc3QuQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmc7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworcHVibGljIGNsYXNzIERhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkRhdGFiYXNlQ29ubmVjdGlvblBvb2xUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OTiA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1FMID0gInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSBpID0gPyBBTkQgaiA9IDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRFU1RfU1FMUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIFRFU1RfU1FMLCBURVNUX1NRTCArIDEsIFRFU1RfU1FMICsgMiwgVEVTVF9TUUwgKyAzLCBURVNUX1NRTCArIDQKKyAgICB9OworCisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIG1UZXN0UG9vbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7CisgICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1UZXN0UG9vbCA9IG5ldyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sKG1EYXRhYmFzZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobVRlc3RQb29sKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtVGVzdFBvb2wuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRSZWxlYXNlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICAvLyBjb25uZWN0aW9ucyBzaG91bGQgYmUgbGF6aWx5IGNyZWF0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgLy8gTUFYIHBvb2wgc2l6ZSBzaG91bGQgYmUgc2V0IHRvIE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBnZXQgYSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgYmUgb25lIC0gc2luY2Ugb25seSBvbmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGFib3ZlIGdldCgpCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICAvLyBubyBmcmVlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBhdmFpbGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYikpOworICAgICAgICAvLyByZWxlYXNlIHRoZSBjb25uZWN0aW9uCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiKSk7CisgICAgICAgIC8vIHJlbGVhc2UgdGhlIHNhbWUgb2JqZWN0IGFnYWluIGFuZCBleHBlY3QgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYik7CisgICAgICAgICAgICBmYWlsKCJpbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGUgcG9vbCBhbmQgYXNrIGZvciBvbmUgbW9yZS4KKyAgICAgKiBzaG91bGQgZ2V0IG9uZSBvZiB0aGUgY29ubmVjdGlvbnMgYWxyZWFkeSBnb3Qgc28gZmFyLiAKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFsbENvbm5BbmRPbmVNb3JlKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPiBkYk9ianMgPSBuZXcgQXJyYXlMaXN0PFNRTGl0ZURhdGFiYXNlPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5hZGQoZGIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcG9vbCBpcyBtYXhlZCBvdXQgYW5kIG5vIGZyZWUgY29ubmVjdGlvbnMuIGFzayBmb3Igb25lIG1vcmUgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMuY29udGFpbnMoZGIxKSk7CisgICAgICAgIC8vIHBvb2wgc2l6ZSBzaG91bGQgcmVtYWluIGF0IE1BWF9DT05OCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIGl0IGlzIGFsbG9jYXRlZCAyIHRpbWVzLCBpdCBzaG91bGQgc3RpbGwgcmVtYWluICdidXN5JworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gcmVsZWFzZSBhbGwgY29ubmVjdGlvbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTjsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYk9ianMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgZXhjZXB0IHRoYXQgZWFjaCBjb25uZWN0aW9uIGhhcyBkaWZmZXJlbnQgU1FMIHN0YXRlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuIAorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ublJldHJpZXZhbEZvclByZXZpb3VzbHlTZWVuU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBwb29sIGlzIG1heGVkIG91dCBhbmQgbm8gZnJlZSBjb25uZWN0aW9ucy4gYXNrIGZvciBvbmUgbW9yZSBjb25uZWN0aW9uCisgICAgICAgIC8vIHVzZSBhIHByZXZpb3VzbHkgc2VlbiBTUUwgc3RhdGVtZW50CisgICAgICAgIFN0cmluZyB0ZXN0U3FsID0gVEVTVF9TUUxTW01BWF9DT05OIC0gMV07CisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMSA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIGRiMSBpcyBvbmUgb2YgdGhlIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYXNzZXJ0VHJ1ZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYjEsIGRiT2Jqcy5nZXQodGVzdFNxbCkpOworICAgICAgICAvLyBkbyB0aGUgc2FtZSBhZ2FpbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjIgPSBtVGVzdFBvb2wuZ2V0KHRlc3RTcWwpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRFcXVhbHMoZGIyLCBkYk9ianMuZ2V0KHRlc3RTcWwpKTsKKworICAgICAgICAvLyBwb29sIHNpemUgc2hvdWxkIHJlbWFpbiBhdCBNQVhfQ09OTgorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgLy8gcmVsZWFzZSBkYjEgYnV0IHNpbmNlIHRoZSBzYW1lIGNvbm5lY3Rpb24gaXMgYWxsb2NhdGVkIDMgdGltZXMsCisgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCByZW1haW4gJ2J1c3knCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYk9ianMuZ2V0KHRlc3RTcWwpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICAvLyByZWxlYXNlIGRiMiBidXQgc2luY2UgdGhlIHNhbWUgY29ubmVjdGlvbiBpcyBhbGxvY2F0ZWQgMiB0aW1lcywKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHJlbWFpbiAnYnVzeScKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiT2Jqcy5nZXQodGVzdFNxbCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworCisgICAgICAgIC8vIHJlbGVhc2UgYWxsIGNvbm5lY3Rpb25zCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGJPYmpzLmdldChURVNUX1NRTFNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiB0aGUgcG9vbCBzaG91bGQgYmUgZnJlZWQgbm93CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAvLyBnZXQgdGhlIGdpdmVuIHNxbCBiZSBjb21waWxlZCBvbiB0aGUgZ2l2ZW4gZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgICAgLy8gdGhpcyB3aWxsIGhlbHAgRGF0YWJhc2VDb25lbmN0aW9uUG9vbCBmaWd1cmUgb3V0IGlmIGEgZ2l2ZW4gU1FMIHN0YXRlbWVudAorICAgICAgICAvLyBpcyBhbHJlYWR5IGNhY2hlZCBieSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShkYiwgc3FsKTsKKyAgICAgICAgYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldCBhIGNvbm5lY3Rpb24gZm9yIGEgU1FMIHN0YXRlbWVudCAnYmxhaCcuIChjb25uZWN0aW9uX3MpCisgICAgICogbWFrZSBzdXJlIHRoZSBwb29sIGhhcyBhdCBsZWFzdCBvbmUgZnJlZSBjb25uZWN0aW9uIGV2ZW4gYWZ0ZXIgdGhpcyBnZXQoKS4KKyAgICAgKiBhbmQgZ2V0IGEgY29ubmVjdGlvbiBmb3IgdGhlIHNhbWUgU1FMIGFnYWluLgorICAgICAqICAgIHRoaXMgY29ubmVjdGlvbiBzaG91bGQgYmUgZGlmZmVyZW50IGZyb20gY29ubmVjdGlvbl9zLgorICAgICAqICAgIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBTUUwgcHJlLWNvbXBpbGVkLCBzaW5jZSBpcyBpdCBub3QgZnJlZQorICAgICAqICAgIEFORCBzaW5jZSB0aGUgcG9vbCBoYXMgZnJlZSBjb25uZWN0aW9ucyBhdmFpbGFibGUsIHNob3VsZCBnZXQgYSBuZXcgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbm5Gb3JUaGVTYW1lU3FsKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTCk7CisgICAgICAgIGV4ZWN1dGVTcWxPbkRhdGFiYXNlQ29ubihkYiwgVEVTVF9TUUwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKworICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYjEgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRGYWxzZShkYjEuZXF1YWxzKGRiKSk7CisKKyAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkYjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHNhbWUgY29ubmVjdGlvbiBOIHRpbWVzIGFuZCByZWxlYXNlIGl0IE4gdGltZXMuCisgICAgICogdGhpcyB0ZXN0cyBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sLlBvb2xPYmoubU51bUhvbGRlcnMKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNhbWVDb25uTnRpbWVzQW5kUmVsZWFzZUl0TnRpbWVzKCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+IGRiT2JqcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU1FMaXRlRGF0YWJhc2U+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkrKykgeworICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtVGVzdFBvb2wuZ2V0KFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShkYk9ianMudmFsdWVzKCkuY29udGFpbnMoZGIpKTsKKyAgICAgICAgICAgIGRiT2Jqcy5wdXQoVEVTVF9TUUxTW2ldLCBkYik7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBldmVyeSBjb25uZWN0aW9uIGluIHRoZSBwb29sIHNob3VsZCBoYXZlIG51bUhvbGRlcnMgPSAxCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NPTk47IGkgKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChpKS5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICB9CisgICAgICAgIC8vIHBvb2wgaXMgbWF4ZWQgb3V0IGFuZCBubyBmcmVlIGNvbm5lY3Rpb25zLiBhc2sgZm9yIG9uZSBtb3JlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gdXNlIGEgcHJldmlvdXNseSBzZWVuIFNRTCBzdGF0ZW1lbnQKKyAgICAgICAgU3RyaW5nIHRlc3RTcWwgPSBURVNUX1NRTFNbTUFYX0NPTk4gLSAxXTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gbVRlc3RQb29sLmdldCh0ZXN0U3FsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgZGIxIGlzIG9uZSBvZiB0aGUgZXhpc3Rpbmcgb25lcworICAgICAgICBhc3NlcnRUcnVlKGRiT2Jqcy52YWx1ZXMoKS5jb250YWlucyhkYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRiMSwgZGJPYmpzLmdldCh0ZXN0U3FsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1UZXN0UG9vbC5pc0RhdGFiYXNlT2JqRnJlZShkYjEpKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbC5Qb29sT2JqIHBvb2xPYmogPSBtVGVzdFBvb2wuZ2V0UG9vbCgpLmdldChkYjEubUNvbm5lY3Rpb25OdW0gLSAxKTsKKyAgICAgICAgaW50IG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bUhvbGRlcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCB0aGUgc2FtZSBjb25uZWN0aW9uIE4gdGltZXMgbW9yZQorICAgICAgICBpbnQgTiA9IDEwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiMiA9IG1UZXN0UG9vbC5nZXQodGVzdFNxbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGIxLCBkYjIpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMikpOworICAgICAgICAgICAgLy8gbnVtSG9sZGVycyBmb3IgdGhpcyBvYmplY3Qgc2hvdWxkIGJlIG5vdyB1cCBieSAxCisgICAgICAgICAgICBpbnQgcHJldiA9IG51bUhvbGRlcnM7CisgICAgICAgICAgICBudW1Ib2xkZXJzID0gcG9vbE9iai5nZXROdW1Ib2xkZXJzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJldiArIDEsIG51bUhvbGRlcnMpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgaXQgTiB0aW1lcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgbVRlc3RQb29sLnJlbGVhc2UoZGIxKTsKKyAgICAgICAgICAgIGludCBwcmV2ID0gbnVtSG9sZGVyczsKKyAgICAgICAgICAgIG51bUhvbGRlcnMgPSBwb29sT2JqLmdldE51bUhvbGRlcnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmV2IC0gMSwgbnVtSG9sZGVycyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHN0aWxsIGhhdmUgMiBtb3JlIGhvbGRlcnMKKyAgICAgICAgYXNzZXJ0RmFsc2UobVRlc3RQb29sLmlzRGF0YWJhc2VPYmpGcmVlKGRiMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9vbE9iai5nZXROdW1Ib2xkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHJlbGVhc2UgMiBtb3JlIHRpbWVzCisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIG1UZXN0UG9vbC5yZWxlYXNlKGRiMSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwb29sT2JqLmdldE51bUhvbGRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtVGVzdFBvb2wuZ2V0RnJlZVBvb2xTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtVGVzdFBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIxKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlc3NUZXN0KCkgeworICAgICAgICBtVGVzdFBvb2wuc2V0TWF4UG9vbFNpemUoTUFYX0NPTk4pOworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKworICAgICAgICBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPiBkYk1hcCA9IG5ldyBIYXNoTWFwPFNRTGl0ZURhdGFiYXNlLCBJbnRlZ2VyPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DT05OOyBpKyspIHsKKyAgICAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbVRlc3RQb29sLmdldChURVNUX1NRTFNbaV0pOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgMSk7CisgICAgICAgICAgICBleGVjdXRlU3FsT25EYXRhYmFzZUNvbm4oZGIsIFRFU1RfU1FMU1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgICAgICAvLyBhc2sgZm9yIGxvdCBtb3JlIGNvbm5lY3Rpb25zIGJ1dCBzaW5jZSB0aGUgcG9vbCBpcyBtYXhlZCBvdXQsIHdlIHNob3VsZCBzdGFydCByZWNlaXZpbmcKKyAgICAgICAgLy8gY29ubmVjdGlvbnMgdGhhdCB3ZSBhbHJlYWR5IGdvdCBzbyBmYXIKKyAgICAgICAgZm9yIChpbnQgaSA9IE1BWF9DT05OOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1UZXN0UG9vbC5nZXQoVEVTVF9TUUwgKyBpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZGJNYXAuY29udGFpbnNLZXkoZGIpKTsKKyAgICAgICAgICAgIGludCBrID0gZGJNYXAuZ2V0KGRiKTsKKyAgICAgICAgICAgIGRiTWFwLnB1dChkYiwgKytrKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbVRlc3RQb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9DT05OLCBtVGVzdFBvb2wuZ2V0TWF4UG9vbFNpemUoKSk7CisgICAgICAgIC8vIHByaW50IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaGFuZGxlcyByZWNlaXZlZCwgc2hvdWxkIGJlIHVuaWZvcm0uCisgICAgICAgIGZvciAoU1FMaXRlRGF0YWJhc2UgZCA6IGRiTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJjb25uZWN0aW9uICMgIiArIGQubUNvbm5lY3Rpb25OdW0gKyAiLCBudW1Ib2xkZXJzOiAiICsgZGJNYXAuZ2V0KGQpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBwcmludCB0aGUgcG9vbCBpbmZvCisgICAgICAgIExvZy5pKFRBRywgbVRlc3RQb29sLnRvU3RyaW5nKCkpOworICAgICAgICAvLyByZWxlYXNlIGFsbAorICAgICAgICBmb3IgKFNRTGl0ZURhdGFiYXNlIGQgOiBkYk1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaW50IG51bSA9IGRiTWFwLmdldChkKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtVGVzdFBvb2wucmVsZWFzZShkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX0NPTk4sIG1UZXN0UG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfQ09OTiwgbVRlc3RQb29sLmdldE1heFBvb2xTaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVDdXJzb3JUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZmZlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlQ3Vyc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVDdXJzb3JUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EYXRhYmFzZTsKKyAgICBwcml2YXRlIEZpbGUgbURhdGFiYXNlRmlsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJ0ZXN0Q3Vyc29yIjsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAic3FsaXRlY3Vyc29yX3Rlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgdGFibGUKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEFCTEVfTkFNRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeU9ialJlYXNzaWdubWVudCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGhhdmUgYSBmZXcgY29ubmVjdGlvbnMgaW4gdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICBEYXRhYmFzZUNvbm5lY3Rpb25Qb29sIHBvb2wgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sOworICAgICAgICBwb29sLnNldE1heFBvb2xTaXplKDUpOworICAgICAgICBTUUxpdGVDdXJzb3IgY3Vyc29yID0KKyAgICAgICAgICAgICAgICAoU1FMaXRlQ3Vyc29yKSBtRGF0YWJhc2UucmF3UXVlcnkoInNlbGVjdCAqIGZyb20gIiArIFRBQkxFX05BTUUsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKGN1cnNvcik7CisgICAgICAgIC8vIGl0IHNob3VsZCB1c2UgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKHBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICAgICAgLy8gZG8gYSByZXF1ZXJ5LiBjdXJzb3Igc2hvdWxkIGNvbnRpbnVlIHRvIHVzZSB0aGUgYWJvdmUgcG9vbGVkIGNvbm5lY3Rpb24KKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGJBZ2FpbiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIsIGRiQWdhaW4pOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBzbyB0aGF0IHRoZSBwb29sZWQgY29ubmVjdGlvbiBoZWxkIGJ5IHRoZSBhYm92ZSBjdXJzb3IgaXMgY2xvc2VkCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICAvLyByZXF1ZXJ5IC0gd2hpY2ggc2hvdWxkIG1ha2UgdGhlIGN1cnNvciB1c2UgbURhdGFiYXNlIGNvbm5lY3Rpb24gc2luY2UgdGhlIHBvb2xlZAorICAgICAgICAvLyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAgICAgY3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIxID0gY3Vyc29yLmdldERhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUoZGIxLm1Db25uZWN0aW9uTnVtID09IDApOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBkYjEpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRUcnVlKGRiMS5pc09wZW4oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgLy8gZW5hYmxlIFdBTCBhbmQgcmVxdWVyeSAtIHRoaXMgdGltZSBhIHBvb2xlZCBjb25uZWN0aW9uIHNob3VsZCBiZSB1c2VkCisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBjdXJzb3IucmVxdWVyeSgpOworICAgICAgICBkYiA9IGN1cnNvci5nZXREYXRhYmFzZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRiLm1Db25uZWN0aW9uTnVtID4gMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5lcXVhbHMoZGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgZGIubVBhcmVudENvbm5PYmopOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuZ2V0Q29ubmVjdGlvbkxpc3QoKS5jb250YWlucyhkYikpOworICAgICAgICBhc3NlcnRUcnVlKGRiLmlzT3BlbigpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGxXaW5kb3coKSB7CisgICAgICAgIC8vIGNyZWF0ZSBzY2hlbWEKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RUYWJsZSA9ICJ0ZXN0ViI7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIHRlc3RUYWJsZSArICIgKGNvbDEgaW50LCBkZXNjIHRleHQgbm90IG51bGwpOyIpOworICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworCisgICAgICAgIC8vIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGRhdGEKKyAgICAgICAgLy8gY3JlYXRlIGEgYmlnIHN0cmluZyB0aGF0IHdpbGwgYWxtb3N0IGZpdCBhIHBhZ2UgYnV0IG5vdCBxdWl0ZS4KKyAgICAgICAgLy8gc2luY2Ugc3FsaXRlIHdhbnRzIHRvIG1ha2Ugc3VyZSBlYWNoIHJvdyBpcyBpbiBhIHBhZ2UsIHRoaXMgc3RyaW5nIHdpbGwgYWxsb2NhdGUKKyAgICAgICAgLy8gYSBuZXcgZGF0YWJhc2UgcGFnZSBmb3IgZWFjaCByb3cuCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGkgJSAxMCArICIiKTsKKyAgICAgICAgfQorICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoImRlc2MiLCBidWZmLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIGluc2VydCBtb3JlIHRoYW4gMU1CIG9mIGRhdGEgaW4gdGhlIHRhYmxlLiB0aGlzIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgZW50aXJlIHRhYmxlZGF0YQorICAgICAgICAvLyB3aWxsIG5lZWQgbW9yZSB0aGFuIG9uZSBDdXJzb3JXaW5kb3cKKyAgICAgICAgaW50IE4gPSA1MDAwOworICAgICAgICBTZXQ8SW50ZWdlcj4gcm93cyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb2wxIiwgaik7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KHRlc3RUYWJsZSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHJvd3MuYWRkKGopOyAvLyBzdG9yZSBpbiBhIGhhc2h0YWJsZSBzbyB3ZSBjYW4gdmVyaWZ5IHRoZSByZXN1bHRzIGZyb20gY3Vyc29yIGxhdGVyIG9uCisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE4sIHJvd3Muc2l6ZSgpKTsKKyAgICAgICAgQ3Vyc29yIGMxID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tICIgKyB0ZXN0VGFibGUsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoTiwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgIGMxLmNsb3NlKCk7CisKKyAgICAgICAgLy8gc2Nyb2xsIHRocm91Z2ggQUxMIGRhdGEgaW4gdGhlIHRhYmxlIHVzaW5nIGEgY3Vyc29yLiBzaG91bGQgY2F1c2UgbXVsdGlwbGUgY2FsbHMgdG8KKyAgICAgICAgLy8gbmF0aXZlX2ZpbGxfd2luZG93IChhbmQgcmUtZmlsbHMgb2YgdGhlIEN1cnNvcldpbmRvdyBvYmplY3QpCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnF1ZXJ5KHRlc3RUYWJsZSwgbmV3IFN0cmluZ1tdeyJjb2wxIiwgImRlc2MifSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBjLmdldEludCgwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5jb250YWlucyh2YWwpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocm93cy5yZW1vdmUodmFsKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZGlkIEkgc2VlIGFsbCB0aGUgcm93cyBpbiB0aGUgdGFibGU/CisgICAgICAgIGFzc2VydFRydWUocm93cy5pc0VtcHR5KCkpOworCisgICAgICAgIC8vIGNoYW5nZSBkYXRhIGFuZCBtYWtlIHN1cmUgdGhlIGN1cnNvciBwaWNrcyB1cCBuZXcgZGF0YSAmIGNvdW50CisgICAgICAgIHJvd3MgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbigpOworICAgICAgICBpbnQgTSA9IE4gKyAxMDAwOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgeworICAgICAgICAgICAgcm93cy5hZGQoaik7CisgICAgICAgICAgICBpZiAoaiA8IE4pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImNvbDEiLCBqKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQodGVzdFRhYmxlLCBudWxsLCB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNLCByb3dzLnNpemUoKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MuY29udGFpbnModmFsKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJvd3MucmVtb3ZlKHZhbCkpOworICAgICAgICB9CisgICAgICAgIC8vIGRpZCBJIHNlZSBhbGwgZGF0YSBmcm9tIHRoZSBtb2RpZmllZCB0YWJsZQorICAgICAgICBhc3NlcnRUcnVlKHJvd3MuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBtb3ZlIGN1cnNvciBiYWNrIHRvIDFzdCByb3cgYW5kIHNjcm9sbCB0byBhYm91dCBoYWxmd2F5IGluIHRoZSByZXN1bHQgc2V0CisgICAgICAgIC8vIGFuZCB0aGVuIGRlbGV0ZSA3NSUgb2YgZGF0YSAtIGFuZCB0aGVuIGRvIHJlcXVlcnkKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBpbnQgSyA9IE4gLyAyOworICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IEsgJiYgYy5tb3ZlVG9OZXh0KCk7IHArKykgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyAtIGp1c3Qgc2Nyb2xsaW5nIHRvIGFib3V0IGhhbGYtcG9pbnQgaW4gdGhlIHJlc3VsdHNldAorICAgICAgICB9CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5kZWxldGUodGVzdFRhYmxlLCAiY29sMSA8ID8iLCBuZXcgU3RyaW5nW117ICgzICogTSAvIDQpICsgIiJ9KTsKKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNIC8gNCwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAvLyBqdXN0IG1vdmUgdGhlIGN1cnNvciB0byBuZXh0IHJvdyAtIHRvIG1ha2Ugc3VyZSBpdCBjYW4gZ28gdGhyb3VnaCB0aGUgZW50aXJlCisgICAgICAgICAgICAvLyByZXN1bHRzZXQgd2l0aG91dCBhbnkgcHJvYmxlbXMKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZURhdGFiYXNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWRhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlRGF0YWJhc2VUZXN0LmphdmEKQEAgLTAsMCArMSw5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EZWZhdWx0RGF0YWJhc2VFcnJvckhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVTdGF0ZW1lbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIFNRTGl0ZURhdGFiYXNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEYXRhYmFzZUdlbmVyYWxUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UQUJMRSA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1VSUkVOVF9EQVRBQkFTRV9WRVJTSU9OID0gNDI7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOU0VSVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUUgPSAiZGF0YWJhc2VfdGVzdC5kYiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBkYlNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlRlYXJkb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkYlNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCBEQl9OQU1FKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwsIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgICAgIG1EYXRhYmFzZS5zZXRWZXJzaW9uKENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTik7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpIHsKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgRGF0YWJhc2VDb25uZWN0aW9uUG9vbCBwb29sID0gbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbDsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwb29sKTsKKyAgICAgICAgLy8gbWFrZSB0aGUgc2FtZSBjYWxsIGFnYWluIGFuZCBtYWtlIHN1cmUgdGhlIHBvb2wgYWxyZWFkeSBzZXR1cCBpcyBub3QgcmUtY3JlYXRlZAorICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvb2wsIG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiY3JlYXRlIHRhYmxlIHRlc3QgKGkgaW50KTsiKTsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbCk7CisgICAgICAgIC8vIGdldCBhIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbURhdGFiYXNlLmdldERiQ29ubmVjdGlvbigic2VsZWN0ICogZnJvbSB0ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGIpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuZXF1YWxzKGRiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCAtIHdoaWNoIHNob3VsZCBjbG9zZSBjb25uZWN0aW9uIHBvb2wgYW5kIGFsbCBwb29sZWQgY29ubmVjdGlvbnMKKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRGYWxzZShkYi5pc09wZW4oKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJzb3JzV2l0aENsb3NlZERiQ29ubkFmdGVyRGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJjcmVhdGUgdGFibGUgdGVzdCAoaSBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoMSk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgbURhdGFiYXNlLmVuZFRyYW5zYWN0aW9uKCk7CisgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRGcmVlUG9vbFNpemUoKSk7CisgICAgICAgIC8vIGdldCBhIGN1cnNvciB3aGljaCBzaG91bGQgdXNlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KCJzZWxlY3QgKiBmcm9tIHRlc3QiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldEZyZWVQb29sU2l6ZSgpKTsKKyAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb25MaXN0KCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5tQ29ubmVjdGlvblBvb2wuaXNEYXRhYmFzZU9iakZyZWUoZGIpKTsKKyAgICAgICAgLy8gZGlzYWJsZSBXQUwgLSB3aGljaCBzaG91bGQgY2xvc2UgY29ubmVjdGlvbiBwb29sIGFuZCBhbGwgcG9vbGVkIGNvbm5lY3Rpb25zCisgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtRGF0YWJhc2UubUNvbm5lY3Rpb25Qb29sKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZGIuaXNPcGVuKCkpOworICAgICAgICAvLyBjdXJzb3IgZGF0YSBzaG91bGQgc3RpbGwgYmUgYWNjZXNzaWJsZSBiZWNhdXNlIGl0IGlzIGZldGNoaW5nIGRhdGEgZnJvbSBDdXJzb3JXaW5kb3cKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldEludCgwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldENvbm5lY3Rpb25Qb29sU2l6ZSgpIHsKKyAgICAgICAgbURhdGFiYXNlLmVuYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIC8vIGNhbid0IHNldCBwb29sIHNpemUgdG8gemVybworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgwKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgcG9vbCBzaXplIHRvIGEgdmFsaWQgdmFsdWUKKyAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbURhdGFiYXNlLm1Db25uZWN0aW9uUG9vbC5nZXRNYXhQb29sU2l6ZSgpKTsKKyAgICAgICAgLy8gY2FuJ3Qgc2V0IHBvb2wgc2l6ZSB0byA8IHRoZSB2YWx1ZSBhYm92ZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLnNldENvbm5lY3Rpb25Qb29sU2l6ZSgxKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibGVzcyB0aGFuIHRoZSBjdXJyZW50IG1heCB2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGEgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlIGEgc3RhbmRhbG9uZS11cGRhdGUvaW5zZXJ0L2RlbGV0ZSBzdGF0ZW1lbnQKKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RGb3JTdGFydFhhY3RCZWZvcmVVcGRhdGVTcWwoSU5TRVJUKTsKKyAgICAgICAgcnVuVGVzdEZvclN0YXJ0WGFjdEJlZm9yZVVwZGF0ZVNxbChVUERBVEUpOworICAgICAgICBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKERFTEVURSk7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5UZXN0Rm9yU3RhcnRYYWN0QmVmb3JlVXBkYXRlU3FsKGludCBzdG10VHlwZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAvLyBtYWtlIHNvbWUgY2hhbmdlcyB0byBkYXRhIGluIFRFU1RfVEFCTEUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImkiLCBpKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAiaSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2UuaW5zZXJ0KFRFU1RfVEFCTEUsIG51bGwsIHZhbHVlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0bXRUeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImoiLCAidSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS51cGRhdGUoVEVTVF9UQUJMRSwgdmFsdWVzLCAiaSA9ICIgKyBpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5kZWxldGUoVEVTVF9UQUJMRSwgImkgPSAxIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRvIGEgcXVlcnkuIGV2ZW4gdGhvdWdoIHF1ZXJ5IHVzZXMgYSBkaWZmZXJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbiwKKyAgICAgICAgLy8gaXQgc2hvdWxkIHN0aWxsIHNlZSB0aGUgYWJvdmUgY2hhbmdlcyB0byBkYXRhIGJlY2F1c2UgdGhlIGFib3ZlIHN0YW5kYWxvbmUKKyAgICAgICAgLy8gaW5zZXJ0L3VwZGF0ZS9kZWxldGVzIGFyZSBkb25lIGluIHRyYW5zYWN0aW9ucyBhdXRvbWF0aWNhbGx5LgorICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHNxbCk7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFZhbHVlID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA0IDogNTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN0bXQuc2ltcGxlUXVlcnlGb3JMb25nKCkpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBjLm1vdmVUb0ZpcnN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBjLmdldExvbmcoMCkpOworICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gNSBtb3JlIGNoYW5nZXMgaW4gYSB0cmFuc2FjdGlvbiBidXQgZG8gYSBxdWVyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21taXQKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpIDwgMTU7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaSIsIGkpOworICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJpIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5pbnNlcnQoVEVTVF9UQUJMRSwgbnVsbCwgdmFsdWVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RtdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgiaiIsICJ1IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLnVwZGF0ZShURVNUX1RBQkxFLCB2YWx1ZXMsICJpID0gIiArIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgICAgICAgICAgICAgbURhdGFiYXNlLmRlbGV0ZShURVNUX1RBQkxFLCAiaSA9IDEiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOworICAgICAgICAvLyBkbyBhIHF1ZXJ5IGJlZm9yZSBjb21taXQgLSBzaG91bGQgc3RpbGwgaGF2ZSA1IHJvd3MKKyAgICAgICAgLy8gdGhpcyBxdWVyeSBzaG91bGQgcnVuIGluIGEgZGlmZmVyZW50IHRocmVhZCB0byBmb3JjZSBpdCB0byB1c2UgYSBkaWZmZXJlbnQgZGF0YWJhc2UKKyAgICAgICAgLy8gY29ubmVjdGlvbgorICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgICAgICAgICAgU1FMaXRlU3RhdGVtZW50IHN0bXQgPSBnZXREYigpLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgICAgICAgICAgc3RtdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIEN1cnNvciBjID0gZ2V0RGIoKS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICAgICAgICAgIGMubW92ZVRvRmlyc3QoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgYy5nZXRMb25nKDApKTsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgYWJvdmUgdGhyZWFkIGlzIGRvbmUKKyAgICAgICAgdC5qb2luKCk7CisgICAgICAgIC8vIGNvbW1pdCBhbmQgdGhlbiBxdWVyeS4gc2hvdWxkIHNlZSBjaGFuZ2VzIGZyb20gdGhlIHRyYW5zYWN0aW9uCisgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICBzdG10ID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmFsdWUyID0gKHN0bXRUeXBlID09IERFTEVURSkgPyA5IDogMTA7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlMiwgc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKSk7CisgICAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICAgICAgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZTIsIGMuZ2V0TG9uZygwKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU1FMaXRlRGF0YWJhc2UgZ2V0RGIoKSB7CisgICAgICAgIHJldHVybiBtRGF0YWJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBlbnN1cmUgdGhhdCByZWFkZXJzIGFyZSBhYmxlIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGRhdGEgKG9sZCB2ZXJzaW9ucykKKyAgICAgKiBFVkVOIFdIRU4gdGhlIHdyaXRlciBpcyBpbiBhIHRyYW5zYWN0aW9uIG9uIHRoZSBzYW1lIGRhdGFiYXNlLgorICAgICAqPHA+CisgICAgICogVGhpcyB0ZXN0IHN0YXJ0cyAxIFdyaXRlciBhbmQgMiBSZWFkZXJzIGFuZCBzZXRzIHVwIGNvbm5lY3Rpb24gcG9vbCBmb3IgcmVhZGVycworICAgICAqIGJ5IGNhbGxpbmcgdGhlIG1ldGhvZCB7QGxpbmsgU1FMaXRlRGF0YWJhc2UjZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKX0uCisgICAgICogPHA+CisgICAgICogV3JpdGVyIGRvZXMgdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBiZWdpbiB0cmFuc2FjdGlvbgorICAgICAqICAgICBpbnNlcnQgaW50byB0YWJsZV8xCisgICAgICogICAgIGluc2VydCBpbnRvIHRhYmxlXzIKKyAgICAgKiAgICAgY29tbWl0CisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogQXMgbG9uZyBhIHRoZSB3cml0ZXIgaXMgYWxpdmUsIFJlYWRlcnMgZG8gdGhlIGZvbGxvd2luZyBpbiBhIHRpZ2h0IGxvb3AgYXQgdGhlIHNhbWUgdGltZQorICAgICAqIDxwcmU+CisgICAgICogICAgIFJlYWRlcl9LIGRvZXMgInNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYmxlX0siICB3aGVyZSBLID0gMSBvciAyCisgICAgICogPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIHRlc3QgaXMgcnVuIGZvciBUSU1FX1RPX1JVTl9XQUxfVEVTVF9GT1Igc2VjLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZXN0IGlzIHJlcGVhdGVkIGZvciBkaWZmZXJlbnQgY29ubmVjdGlvbi1wb29sLXNpemVzICgxLi4zKQorICAgICAqIDxwPgorICAgICAqIEFuZCBhdCB0aGUgZW5kIG9mIG9mIGVhY2ggdGVzdCwgdGhlIGZvbGxvd2luZyBzdGF0aXN0aWNzIGFyZSBwcmludGVkCisgICAgICogPHVsPgorICAgICAqICAgIDxsaT5jb25uZWN0aW9uLXBvb2wtc2l6ZTwvbGk+CisgICAgICogICAgPGxpPm51bWJlci1vZi10cmFuc2FjdGlvbnMgYnkgd3JpdGVyPC9saT4KKyAgICAgKiAgICA8bGk+bnVtYmVyIG9mIHJlYWRzIGJ5IHJlYWRlcl9LIHdoaWxlIHRoZSB3cml0ZXIgaXMgSU4gb3IgTk9ULUlOIHhhY3Rpb248L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIEBTdXBwcmVzcyAvLyBydW4gdGhpcyB0ZXN0IG9ubHkgaWYgeW91IG5lZWQgdG8gY29sbGVjdCB0aGUgbnVtYmVycyBmcm9tIHRoaXMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW5jeUVmZmVjdHNPZkNvbm5Qb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJ1biB0aGUgdGVzdCB3aXRoIHNxbGl0ZSBXQUwgZW5hYmxlCisgICAgICAgIHJ1bkNvbm5lY3Rpb25Qb29sVGVzdCh0cnVlKTsKKworICAgICAgICAvLyBydW4gdGhlIHNhbWUgdGVzdCBXSVRIT1VUIHNxbGl0ZSBXQUwgZW5hYmxlZAorICAgICAgICBydW5Db25uZWN0aW9uUG9vbFRlc3QoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5Db25uZWN0aW9uUG9vbFRlc3QoYm9vbGVhbiB1c2VXYWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgTSA9IDM7CisgICAgICAgIFN0cmluZ0J1aWxkZXJbXSBidWZmID0gbmV3IFN0cmluZ0J1aWxkZXJbTV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBpZiAodXNlV2FsKSB7CisgICAgICAgICAgICAgICAgLy8gc2V0IHVwIGNvbm5lY3Rpb24gcG9vbAorICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5lbmFibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRDb25uZWN0aW9uUG9vbFNpemUoaSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHQxIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSB0MiAoaSBpbnQsIGogaW50KTsiKTsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5iZWdpblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJpbnNlcnQgaW50byB0MSB2YWx1ZXMoPyw/KTsiLCBuZXcgU3RyaW5nW10ge2srIiIsIGsrIiJ9KTsKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDIgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtrKyIiLCBrKyIifSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgYSB3cml0ZXIKKyAgICAgICAgICAgIFdyaXRlciB3ID0gbmV3IFdyaXRlcihtRGF0YWJhc2UpOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIGFuIGFycmF5IG9mIGNvdW50ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgcmVhZGVycworICAgICAgICAgICAgUmVhZGVyIHIxID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MSIsIHcsIDApOworICAgICAgICAgICAgUmVhZGVyIHIyID0gbmV3IFJlYWRlcihtRGF0YWJhc2UsICJ0MiIsIHcsIDEpOworICAgICAgICAgICAgdy5zdGFydCgpOworICAgICAgICAgICAgcjEuc3RhcnQoKTsKKyAgICAgICAgICAgIHIyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIGFsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICAgICAgdy5qb2luKCk7CisgICAgICAgICAgICByMS5qb2luKCk7CisgICAgICAgICAgICByMi5qb2luKCk7CisKKyAgICAgICAgICAgIC8vIHByaW50IHRoZSBzdGF0cworICAgICAgICAgICAgaW50W11bXSBjb3VudHMgPSBnZXRDb3VudHMoKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoImNvbm5wb29sLXNpemUgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGkgKyAxKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIG51bSB4YWN0cyBieSB3cml0ZXIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGdldE51bVhhY3RzKCkpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoIiwgbnVtLXJlYWRzLWluLXhhY3QvTk9ULWluLXhhY3QgYnkgcmVhZGVyMSA9ICIpOworICAgICAgICAgICAgYnVmZltpXS5hcHBlbmQoY291bnRzWzBdWzFdICsgIi8iICsgY291bnRzWzBdWzBdKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKCIsIGJ5IHJlYWRlcjIgPSAiKTsKKyAgICAgICAgICAgIGJ1ZmZbaV0uYXBwZW5kKGNvdW50c1sxXVsxXSArICIvIiArIGNvdW50c1sxXVswXSk7CisKKyAgICAgICAgICAgIExvZy5pKFRBRywgImRvbmUgdGVzdGluZyBmb3IgY29ubi1wb29sLXNpemUgb2YgIiArIChpKzEpKTsKKworICAgICAgICAgICAgZGJUZWFyZG93bigpOworICAgICAgICAgICAgZGJTZXRVcCgpOworICAgICAgICB9CisgICAgICAgIExvZy5pKFRBRywgImR1cmF0aW9uIG9mIHRlc3QgIiArIFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiArICIgc2VjIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsIGJ1ZmZbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5YYWN0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBpbnQgbnVtWGFjdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfVE9fUlVOX1dBTF9URVNUX0ZPUiA9IDE1OyAvLyBudW0gc2VjIHRoaXMgdGVzdCBzaG91bGQgcnVuCisgICAgcHJpdmF0ZSBpbnRbXVtdIGNvdW50cyA9IG5ldyBpbnRbMl1bMl07CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGluWGFjdCgpIHsKKyAgICAgICAgcmV0dXJuIGluWGFjdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEluWGFjdEZsYWcoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGluWGFjdCA9IGZsYWc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb3VudHMoaW50IHJlYWRlck51bSwgaW50W10gbnVtUmVhZHMpIHsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMF0gPSBudW1SZWFkc1swXTsKKyAgICAgICAgY291bnRzW3JlYWRlck51bV1bMV0gPSBudW1SZWFkc1sxXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBpbnRbXVtdIGdldENvdW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldE51bVhhY3RzKGludCBudW0pIHsKKyAgICAgICAgbnVtWGFjdHMgPSBudW07CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldE51bVhhY3RzKCkgeworICAgICAgICByZXR1cm4gbnVtWGFjdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIGRiID0gbnVsbDsKKyAgICAgICAgcHVibGljIFdyaXRlcihTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICAgdGhpcy5kYiA9IGRiOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAvLyBpbiBhIGxvb3AsIGZvciBOIHNlYywgZG8gdGhlIGZvbGxvd2luZworICAgICAgICAgICAgLy8gICAgQkVHSU4gdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIC8vICAgIGluc2VydCBpbnRvIHRhYmxlIHQxLCB0MgorICAgICAgICAgICAgLy8gICAgQ29tbWl0CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG5vdykgLyAxMDAwIDwgVElNRV9UT19SVU5fV0FMX1RFU1RfRk9SOyBrKyspIHsKKyAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uTm9uRXhjbHVzaXZlKCk7CisgICAgICAgICAgICAgICAgc2V0SW5YYWN0RmxhZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGIuZXhlY1NRTCgiaW5zZXJ0IGludG8gdDEgdmFsdWVzKD8sPyk7IiwgbmV3IFN0cmluZ1tdIHtpKyIiLCBpKyIifSk7CisgICAgICAgICAgICAgICAgICAgIGRiLmV4ZWNTUUwoImluc2VydCBpbnRvIHQyIHZhbHVlcyg/LD8pOyIsIG5ldyBTdHJpbmdbXSB7aSsiIiwgaSsiIn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgICAgICAgICBzZXRJblhhY3RGbGFnKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0TnVtWGFjdHMoayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJlYWRlciBleHRlbmRzIFRocmVhZCB7CisgICAgICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgZGIgPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyB0YWJsZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgV3JpdGVyIHcgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCByZWFkZXJOdW07CisgICAgICAgIHByaXZhdGUgaW50W10gbnVtUmVhZHMgPSBuZXcgaW50WzJdOworICAgICAgICBwdWJsaWMgUmVhZGVyKFNRTGl0ZURhdGFiYXNlIGRiLCBTdHJpbmcgdGFibGUsIFdyaXRlciB3LCBpbnQgcmVhZGVyTnVtKSB7CisgICAgICAgICAgICB0aGlzLmRiID0gZGI7CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICAgICAgdGhpcy5yZWFkZXJOdW0gPSByZWFkZXJOdW07CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB3cml0ZSBpcyBhbGl2ZSwgaW4gYSBsb29wIGRvIHRoZSBxdWVyeSBvbiBhIHRhYmxlCisgICAgICAgICAgICB3aGlsZSAody5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgdGhpcy50YWJsZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb3VudCBvZiByZWFkcworICAgICAgICAgICAgICAgICAgICBudW1SZWFkc1tpblhhY3QoKSA/IDEgOiAwXSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldENvdW50cyhyZWFkZXJOdW0sIG51bVJlYWRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgZXh0ZW5kcyBTUUxpdGVQcm9ncmFtIHsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhTUUxpdGVEYXRhYmFzZSBkYiwgU3RyaW5nIHNxbCkgeworICAgICAgICAgICAgc3VwZXIoZGIsIHNxbCk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgICAgIGRiLmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyhkYiwgc3FsKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZGIudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExydUNhY2hpbmdPZlNxbGl0ZUNvbXBpbGVkU3FsT2JqcygpIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIC8vIHNldCBjYWNoZSBzaXplCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworCisgICAgICAgIC8vIGRvIE4rMSBxdWVyaWVzIC0gYW5kIHdoZW4gdGhlIDB0aCBlbnRyeSBpcyByZW1vdmVkIGZyb20gTFJVIGNhY2hlIGR1ZSB0byB0aGUKKyAgICAgICAgLy8gaW5zZXJ0aW9uIG9mIChOKzEpdGggZW50cnksIG1ha2Ugc3VyZSAwdGggZW50cnkgaXMgY2xvc2VkCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdG10T2JqcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gc3FsU3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnQgc3RtdDAgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE4rMTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9ICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsPyk7IjsKKyAgICAgICAgICAgIHNxbFN0cmluZ3MuYWRkKHMpOworICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcgYyA9CisgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShtRGF0YWJhc2UsIHMpOworICAgICAgICAgICAgaW50IG4gPSBjLmdldFNxbFN0YXRlbWVudElkKCk7CisgICAgICAgICAgICBzdG10T2Jqcy5hZGQoaSwgbik7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgc3RhdGVtZW50SWQgb2YgdGhpcyBvYmouIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIHRocm93biBvdXQgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FjaGUgYXQgdGhlIGVuZCBvZiB0aGlzIHRlc3QuCisgICAgICAgICAgICAgICAgc3RtdDAgPSBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIC8vIGlzIDAndGggZW50cnkgb3V0IG9mIHRoZSBjYWNoZT8gaXQgc2hvdWxkIGJlIGluIHRoZSBsaXN0IG9mIHN0YXRlbWVudElkcworICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcmUtY29tcGlsZWQgc3FsIHN0YXRlbWVudHMgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCkuY29udGFpbnMoc3RtdDApKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOKzE7IGkrKykgeworICAgICAgICAgICAgU1FMaXRlQ29tcGlsZWRTcWwgY29tcFNxbCA9IG1EYXRhYmFzZS5nZXRDb21waWxlZFN0YXRlbWVudEZvclNxbChzcWxTdHJpbmdzLmdldChpKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBTcWwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzdG10T2Jqcy5jb250YWlucyhjb21wU3FsLm5TdGF0ZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBNZWRpdW1UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERiQ2xvc2VSZWxlYXNpbmdBbGxDYWNoZWRTcWwoKSB7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgdGVzdCAoX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHRleHQxIFRFWFQsIHRleHQyIFRFWFQsICIgKworICAgICAgICAgICAgICAgICJudW0xIElOVEVHRVIsIG51bTIgSU5URUdFUiwgaW1hZ2UgQkxPQik7Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQgPSAiREVMRVRFIEZST00gdGVzdCBXSEVSRSBfaWQ9PzsiOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RhdGVtZW50RG9Ob3RDbG9zZSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN0YXRlbWVudERvTm90Q2xvc2UuYmluZExvbmcoMSwgMSk7CisgICAgICAgIC8qIGRvIG5vdCBjbG9zZSBzdGF0ZW1lbnREb05vdENsb3NlIG9iamVjdC4KKyAgICAgICAgICogVGhhdCBzaG91bGQgbGVhdmUgaXQgaW4gU1FMaXRlRGF0YWJhc2UubVByb2dyYW1zLgorICAgICAgICAgKiBtRGF0YWJhc2UuY2xvc2UoKSBpbiB0ZWFyRG93bigpIHNob3VsZCByZWxlYXNlIGl0LgorICAgICAgICAgKi8KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCkgeworICAgICAgICBtRGF0YWJhc2UuZGlzYWJsZVdyaXRlQWhlYWRMb2dnaW5nKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgVEVTVF9UQUJMRSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIFRFU1RfVEFCTEUgKyAiIChpIGludCwgaiBpbnQpOyIpOworICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgLy8gZmx1c2ggdGhlIGFib3ZlIHN0YXRlbWVudCBmcm9tIGNhY2hlIGFuZCBjbG9zZSBhbGwgdGhlIHBlbmRpbmcgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBtRGF0YWJhc2UuZGVhbGxvY0NhY2hlZFNxbFN0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlUGVuZGluZ1N0YXRlbWVudHMoKTsKKyAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBzdGF0ZW1lbnQgZmluYWxpemF0aW9ucyBhcmUgbm90IGRvbmUgcmlnaHQgYXdheSBidXQKKyAgICAgKiBwaWdneS1iYWNrZWQgb250byB0aGUgbmV4dCBzcWwgc3RhdGVtZW50IGV4ZWN1dGlvbiBvbiB0aGUgc2FtZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRlbWVudENsb3NlKCkgeworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlCisgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICBtRGF0YWJhc2Uuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgaW50IHN0bXQwSWQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkgKyspIHsKKyAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIGMgPQorICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHRvIHRoZSBjYWNoZSAtIGFuZCB0aGUgYWJvdmUgJ3N0bXQwSWQnIHNob3VsZCBmYWxsIG91dCBvZiBjYWNoZQorICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxMDAsID8pOyIpOworICAgICAgICBzdG10MS5jbG9zZSgpOworCisgICAgICAgIC8vIHRoZSBhYm92ZSBjbG9zZSgpIHNob3VsZCBoYXZlIHF1ZXVlZFVwIHRoZSBzdGF0ZW1lbnQgZm9yIGZpbmFsaXphdGlvbgorICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gc3RhdGVtZW50SWRzID0gbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoc3RtdDBJZCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgc29tZXRoaW5nIHRvIHNlZSBpZiB0aGlzIHN0YXRlbWVudCBnZXRzIGZpbmFsaXplZAorICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiZGVsZXRlIGZyb20gdGVzdCB3aGVyZSBpID0gMTA7Iik7CisgICAgICAgIHN0YXRlbWVudElkcyA9IG1EYXRhYmFzZS5nZXRRdWV1ZWRVcFN0bXRMaXN0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2FtZSBhcyBhYm92ZSAtIGV4Y2VwdCB0aGF0IHRoZSBzdGF0ZW1lbnQgdG8gYmUgZmluYWxpemVkIGlzIGZyb20gVGhyZWFkICMgMS4KKyAgICAgKiBhbmQgaXQgaXMgZXZlbnR1YWxseSBmaW5hbGl6ZWQgaW4gVGhyZWFkICMgMiB3aGVuIGl0IGV4ZWN1dGVzIGEgU1FMIHN0YXRlbWVudC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZW1lbnRDbG9zZURpZmZUaHJlYWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgZmluYWwgaW50IE4gPSBTUUxpdGVEYXRhYmFzZS5NQVhfU1FMX0NBQ0hFX1NJWkU7CisgICAgICAgIG1EYXRhYmFzZS5zZXRNYXhTcWxDYWNoZVNpemUoTik7CisgICAgICAgIC8vIGZpbGwgdXAgc3RhdGVtZW50IGNhY2hlIGluIG1EYXRhYmFzZSBpbiBhIHRocmVhZAorICAgICAgICBUaHJlYWQgdDEgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nLmNyZWF0ZShnZXREYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMoIiArIGkgKyAiLCA/KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiAwdGggZW50cnkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RtdDBJZCA9IGMuZ2V0U3FsU3RhdGVtZW50SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0MS5zdGFydCgpOworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaAorICAgICAgICB0MS5qb2luKCk7CisgICAgICAgIC8vIG1EYXRhYmFzZSBzaG91bGRuJ3QgaGF2ZSBhbnkgc3RhdGVtZW50cyB0byBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbURhdGFiYXNlLmdldFF1ZXVlZFVwU3RtdExpc3QoKS5zaXplKCkpOworCisgICAgICAgIC8vIGFkZCBvbmUgbW9yZSB0byB0aGUgY2FjaGUgLSBhbmQgdGhlIGFib3ZlICdzdG10MElkJyBzaG91bGQgZmFsbCBvdXQgb2YgY2FjaGUKKyAgICAgICAgLy8ganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIGRvIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MiA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIENsYXNzVG9UZXN0U3FsQ29tcGlsYXRpb25BbmRDYWNoaW5nIHN0bXQxID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RtdDBJZCBmb3IgZmluYWxpemF0aW9uCisgICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZW1lbnRJZHMuY29udGFpbnMoZ2V0U3RtdDBJZCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBleGVjdXRlIHNvbWV0aGluZyB0byBzZWUgaWYgdGhpcyBzdGF0ZW1lbnQgZ2V0cyBmaW5hbGl6ZWQKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5leGVjU1FMKCJkZWxldGUgZnJvbSB0ZXN0IHdoZXJlIGkgPSAxMDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDMuc3RhcnQoKTsKKyAgICAgICAgdDMuam9pbigpOworCisgICAgICAgIC8vIGlzIHRoZSBzdGF0ZW1lbnQgZmluYWxpemVkPworICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RhdGVtZW50SWRzLmNvbnRhaW5zKGdldFN0bXQwSWQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHN0bXQwSWQgPSAwOworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBnZXRTdG10MElkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdG10MElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNhbWUgYXMgYWJvdmUgLSBleGNlcHQgdGhhdCB0aGUgcXVldWUgb2Ygc3RhdGVtZW50cyB0byBiZSBmaW5hbGl6ZWQgYXJlIGZpbmFsaXplZAorICAgICAqIGJ5IGRhdGFiYXNlIGNsb3NlKCkgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xvc2VCeURiQ2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgLy8gZmlsbCB1cCBzdGF0ZW1lbnQgY2FjaGUgaW4gbURhdGFiYXNlIGluIGEgdGhyZWFkCisgICAgICAgIFRocmVhZCB0MSA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGludCBOID0gU1FMaXRlRGF0YWJhc2UuTUFYX1NRTF9DQUNIRV9TSVpFOworICAgICAgICAgICAgICAgIGdldERiKCkuc2V0TWF4U3FsQ2FjaGVTaXplKE4pOworICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzdG10OworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSArKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygiICsgaSArICIsID8pOyIpOworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIDB0aCBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG10MElkID0gYy5nZXRTcWxTdGF0ZW1lbnRJZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoCisgICAgICAgIHQxLmpvaW4oKTsKKworICAgICAgICAvLyBhZGQgb25lIG1vcmUgdG8gdGhlIGNhY2hlIC0gYW5kIHRoZSBhYm92ZSAnc3RtdDBJZCcgc2hvdWxkIGZhbGwgb3V0IG9mIGNhY2hlCisgICAgICAgIC8vIGp1c3QgZm9yIHRoZSBoZWNrIG9mIGl0LCBkbyBpdCBpbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZyBzdG10MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZy5jcmVhdGUoZ2V0RGIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDEwMCwgPyk7Iik7CisgICAgICAgICAgICAgICAgc3RtdDEuYmluZExvbmcoMSwgMSk7CisgICAgICAgICAgICAgICAgc3RtdDEuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdDIuc3RhcnQoKTsKKyAgICAgICAgdDIuam9pbigpOworCisgICAgICAgIC8vIGNsb3NlKCkgaW4gdGhlIGFib3ZlIHRocmVhZCBzaG91bGQgaGF2ZSBxdWV1ZWRVcCB0aGUgc3RhdGVtZW50IGZvciBmaW5hbGl6YXRpb24KKyAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IHN0YXRlbWVudElkcyA9IGdldERiKCkuZ2V0UXVldWVkVXBTdG10TGlzdCgpOworICAgICAgICBhc3NlcnRUcnVlKGdldFN0bXQwSWQoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRlbWVudElkcy5jb250YWlucyhzdG10MElkKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdGF0ZW1lbnRJZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgZGF0YWJhc2UuIGV2ZXJ5dGhpbmcgZnJvbSBtQ2xvc2VkU3RhdGVtZW50SWRzIGluIG1EYXRhYmFzZQorICAgICAgICAvLyBzaG91bGQgYmUgZmluYWxpemVkIGFuZCBjbGVhcmVkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgLy8gYWdhaW4gZG8gaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgICAgVGhyZWFkIHQzID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZ2V0RGIoKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0My5zdGFydCgpOworICAgICAgICB0My5qb2luKCk7CisKKyAgICAgICAgLy8gY2hlY2sgbUNsb3NlZFN0YXRlbWVudElkcyBpbiBtRGF0YWJhc2UuIGl0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICBzdGF0ZW1lbnRJZHMgPSBnZXREYigpLmdldFF1ZXVlZFVwU3RtdExpc3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRlbWVudElkcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCB0ZXN0cyB1c2FnZSBleGVjU1FMKCkgdG8gYmVnaW4gdHJhbnNhY3Rpb24gd29ya3MgaW4gdGhlIGZvbGxvd2luZyB3YXkKKyAgICAgKiAgIFRocmVhZCAjMSBkb2VzCisgICAgICogICAgICAgZXhlY1NRTCgiYmVnaW4gdHJhbnNhY3Rpb24iKTsKKyAgICAgKiAgICAgICBpbnNlcnQoKQorICAgICAqICAgVGhyZWFkICMgMgorICAgICAqICAgICAgIHF1ZXJ5KCkKKyAgICAgKiAgIFRocmVhZCMxICgiZW5kIHRyYW5zYWN0aW9uIikKKyAgICAgKiBUaHJlYWQgIyAyIHF1ZXJ5IHdpbGwgZXhlY3V0ZSAtIGJlY2F1c2UgamF2YSBsYXllciB3aWxsIG5vdCBoYXZlIGxvY2tlZCB0aGUgU1FMaXRlRGF0YWJhc2UKKyAgICAgKiBvYmplY3QgYW5kIHNxbGl0ZSB3aWxsIGNvbnNpZGVyIHRoaXMgcXVlcnkgdG8gYmUgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBidXQgaWYgdGhyZWFkICMgMSB1c2VzIGJlZ2luVHJhbnNhY3Rpb24oKSBpbnN0ZWFkIG9mIGV4ZWNTUUwoKSB0byBzdGFydCB0cmFuc2FjdGlvbiwKKyAgICAgKiB0aGVuIFRocmVhZCAjIDIncyBxdWVyeSB3aWxsIGhhdmUgYmVlbiBibG9ja2VkIGJ5IGphdmEgbGF5ZXIKKyAgICAgKiB1bnRpbCBUaHJlYWQjMSBlbmRzIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIkVORCIpOworICAgICAgICAvLyBzYW1lIGFzIGFib3ZlLCBpbnN0ZWFkIG5vdyBkbyAiQ09NTUlUIiBvciAiUk9MTEJBQ0siIGluc3RlYWQgb2YgIkVORCIgdHJhbnNhY3Rpb24KKyAgICAgICAgcnVuRXhlY1NxbFRvU3RhcnRBbmRFbmRUcmFuc2FjdGlvbigiQ09NTUlUIik7CisgICAgICAgIHJ1bkV4ZWNTcWxUb1N0YXJ0QW5kRW5kVHJhbnNhY3Rpb24oIlJPTExCQUNLIik7CisgICAgfQorICAgIHByaXZhdGUgdm9pZCBydW5FeGVjU3FsVG9TdGFydEFuZEVuZFRyYW5zYWN0aW9uKFN0cmluZyBzdHIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICAvLyBkaXNhYmxlIFdBTCBqdXN0IHNvIHF1ZXJpZXMgYW5kIHVwZGF0ZXMgdXNlIHRoZSBzYW1lIGRhdGFiYXNlIGNvbm5lY3Rpb24KKyAgICAgICAgbURhdGFiYXNlLmRpc2FibGVXcml0ZUFoZWFkTG9nZ2luZygpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgLy8gZXZlbiB0aG91Z2ggbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb24oKSBpcyBub3QgY2FsbGVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9uLAorICAgICAgICAvLyBtRGF0YWJhc2UgY29ubmVjdGlvbiBzaG91bGQgbm93IGJlIGluIHRyYW5zYWN0aW9uIGFzIGEgcmVzdWx0IG9mCisgICAgICAgIC8vIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpCisgICAgICAgIC8vIGJ1dCBtRGF0YWJhc2UubUxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGJ5IGFueSB0aHJlYWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuaW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeUN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc0RiTG9ja2VkQnlPdGhlclRocmVhZHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtRGF0YWJhc2UuYW1JSW5UcmFuc2FjdGlvbigpKTsKKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg5OTksIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGdldERiKCksCisgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGogZnJvbSAiICsgVEVTVF9UQUJMRSArICIgV0hFUkUgaSA9IDEwIiwgbnVsbCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RGIoKS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGdldERiKCkuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXREYigpLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIHQuam9pbigpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5hbUlJblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoc3RyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmFtSUluVHJhbnNhY3Rpb24oKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pblRyYW5zYWN0aW9uKCkpOworICAgICAgICBhc3NlcnRGYWxzZShtRGF0YWJhc2UuaXNEYkxvY2tlZEJ5Q3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobURhdGFiYXNlLmlzRGJMb2NrZWRCeU90aGVyVGhyZWFkcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoZSBmb2xsb3dpbmcKKyAgICAgKiBodHRwOi8vYi9pc3N1ZT9pZD0yODcxMDM3CisgICAgICogICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KC4uLik7CisgICAgICogICAgICAgICAgLy8gd2l0aCBXQUwgZW5hYmxlZCwgdGhlIGFib3ZlIHVzZXMgYSBwb29sZWQgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAqICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKQorICAgICAqICAgICAgICAgIHRyeSB7CisgICAgICogICAgICAgICAgICBkYi5pbnNlcnQoLi4uLi4uKTsKKyAgICAgKiAgICAgICAgICAgIGN1cnNvci5yZXF1ZXJ5KCk7CisgICAgICogICAgICAgICAgICAvLyBzaW5jZSB0aGUgY3Vyc29yIHVzZXMgcG9vbGVkIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHRoZSBhYm92ZSByZXF1ZXJ5CisgICAgICogICAgICAgICAgICAvLyB3aWxsIG5vdCByZXR1cm4gdGhlIHJlc3VsdHMgdGhhdCB3ZXJlIGluc2VydGVkIGFib3ZlIHNpbmNlIHRoZSBpbnNlcnQgaXMKKyAgICAgKiAgICAgICAgICAgIC8vIGRvbmUgdXNpbmcgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIEFORCB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGNvbW1pdHRlZCB5ZXQuCisgICAgICogICAgICAgICAgICAvLyBmaXggaXMgdG8gbWFrZSB0aGUgYWJvdmUgY3Vyc29yIHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIC0gYW5kIE5PVAorICAgICAqICAgICAgICAgICAgLy8gdGhlIHBvb2xlZCBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICogICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKQorICAgICAqICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICogICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpCisgICAgICogICAgICAgICAgfQorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHJlcXVlcnkgb24gdGhlIHByZXZpb3VzbHkgb3BlbmVkIGN1cnNvcgorICAgICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBub3cgdXNlIHRoZSBtYWluIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHNlZSAyIHJvd3MKKyAgICAgICAgICAgIGMucmVxdWVyeSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuYmVnaW5UcmFuc2FjdGlvbk5vbkV4Y2x1c2l2ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcXVlcnkgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiB0aGF0IGNhdXNlcyB0aGUgY3Vyc29yIHRvIHVzZSBhIHBvb2xlZCBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBhbmQgc2luY2UgdGhpcyB0aHJlYWQgaGFzbid0IGNvbW1pdHRlZCBpdHMgY2hhbmdlcywgdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgc2VlIG9ubHkKKyAgICAgICAgICAgIC8vIDEgcm93CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYzEucmVxdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYzEuZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDIgcm93cyBub3cgLSBpbmNsdWRpbmcgdGhlIHRoZSByb3cgaW5zZXJ0ZWQgYWJvdmUKKyAgICAgICAgICAgIG1EYXRhYmFzZS5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5lbmRUcmFuc2FjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGlzIHNhbWUgYXMge0BsaW5rICN0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkxKCl9IGV4Y2VwdCB0aGUgZm9sbG93aW5nOgorICAgICAqIGluc3RlYWQgb2YgbURhdGFiYXNlLmJlZ2luVHJhbnNhY3Rpb25Ob25FeGNsdXNpdmUoKSwgdXNlIGV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIikKKyAgICAgKiBhbmQgaW5zdGVhZCBvZiBtRGF0YWJhc2UuZW5kVHJhbnNhY3Rpb24oKSwgdXNlIGV4ZWNTUUwoIkVORCIpOworICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBTdHJpbmcgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIFRFU1RfVEFCTEU7CisgICAgICAgIEN1cnNvciBjID0gbURhdGFiYXNlLnJhd1F1ZXJ5KHNxbCwgbnVsbCk7CisgICAgICAgIC8vIHNob3VsZCBoYXZlIDEgcm93IGluIHRoZSB0YWJsZQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkJFR0lOIHRyYW5zYWN0aW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMDAsIDk5MDkpOyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KG1EYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBjb3VudCgqKSBmcm9tICIgKyBURVNUX1RBQkxFLCBudWxsKSk7CisgICAgICAgICAgICAvLyByZXF1ZXJ5IG9uIHRoZSBwcmV2aW91c2x5IG9wZW5lZCBjdXJzb3IKKyAgICAgICAgICAgIC8vIGN1cnNvciBzaG91bGQgbm93IHVzZSB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzZWUgMiByb3dzCisgICAgICAgICAgICBjLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjLmdldENvdW50KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNvbW1pdDsiKTsKKyAgICAgICAgfQorICAgICAgICBjLmNsb3NlKCk7CisKKyAgICAgICAgLy8gZG8gdGhlIHNhbWUgdGVzdCBidXQgbm93IGRvIHRoZSByZXF1ZXJ5IGluIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICBjcmVhdGVUYWJsZUFuZENsZWFyQ2FjaGUoKTsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAsIDk5OSk7Iik7CisgICAgICAgIGZpbmFsIEN1cnNvciBjMSA9IG1EYXRhYmFzZS5yYXdRdWVyeSgic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMxLmdldENvdW50KCkpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQkVHSU4gdHJhbnNhY3Rpb24iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwMCwgOTkwOSk7Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGNvdW50KCopIGZyb20gIiArIFRFU1RfVEFCTEUsIG51bGwpKTsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGluIGEgZGlmZmVyZW50IHRocmVhZC4gYnV0IHNpbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBzdGFydGVkIHVzaW5nCisgICAgICAgICAgICAvLyBleGVjU1EoKSBpbnN0ZWFkIG9mIGJlZ2luVHJhbnNhY3Rpb24oKSwgY3Vyc29yJ3MgcXVlcnkgaXMgY29uc2lkZXJlZCBwYXJ0IG9mCisgICAgICAgICAgICAvLyB0aGUgc2FtZSB0cmFuc2FjdGlvbiAtIGFuZCBoZW5jZSBpdCBzaG91bGQgc2VlIHRoZSBhYm92ZSBpbnNlcnRlZCByb3cKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjMS5yZXF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjMS5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgICAgICAvLyBzaG91bGQgYmUgMiByb3dzIG5vdyAtIGluY2x1ZGluZyB0aGUgdGhlIHJvdyBpbnNlcnRlZCBhYm92ZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNvbW1pdCIpOworICAgICAgICB9CisgICAgICAgIGMxLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGlzIHNhbWUgYXMge0BsaW5rICN0ZXN0VHJhbnNhY3Rpb25BbmRXYWxJbnRlcnBsYXkyKCl9IGV4Y2VwdCB0aGUgZm9sbG93aW5nOgorICAgICAqIGluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZGF0YSwgZG8gcm9sbGJhY2sgYW5kIG1ha2Ugc3VyZSB0aGUgZGF0YSBzZWVuIGJ5IHRoZSBxdWVyeQorICAgICAqIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gaXMgbm93IGdvbmUuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbkFuZFdhbEludGVycGxheTMoKSB7CisgICAgICAgIGNyZWF0ZVRhYmxlQW5kQ2xlYXJDYWNoZSgpOworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiSU5TRVJUIGludG8gIiArIFRFU1RfVEFCTEUgKyAiIHZhbHVlcygxMCwgOTk5KTsiKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9ICJzZWxlY3QgKiBmcm9tICIgKyBURVNUX1RBQkxFOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5yYXdRdWVyeShzcWwsIG51bGwpOworICAgICAgICAvLyBzaG91bGQgaGF2ZSAxIHJvdyBpbiB0aGUgdGFibGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJCRUdJTiB0cmFuc2FjdGlvbiIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIklOU0VSVCBpbnRvICIgKyBURVNUX1RBQkxFICsgIiB2YWx1ZXMoMTAwLCA5OTA5KTsiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBEYXRhYmFzZVV0aWxzLmxvbmdGb3JRdWVyeShtRGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICAgICAgLy8gcmVxdWVyeSBvbiB0aGUgcHJldmlvdXNseSBvcGVuZWQgY3Vyc29yCisgICAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIG5vdyB1c2UgdGhlIG1haW4gZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2VlIDIgcm93cworICAgICAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYy5nZXRDb3VudCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJvbGxiYWNrIHRoZSBjaGFuZ2UKKyAgICAgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJyb2xsYmFjazsiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaW5jZSB0aGUgY2hhbmdlIGlzIHJvbGxlZCBiYWNrLCBkbyB0aGUgc2FtZSBxdWVyeSBhZ2FpbiBhbmQgc2hvdWxkIG5vdyBmaW5kIG9ubHkgMSByb3cKKyAgICAgICAgYy5yZXF1ZXJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkobURhdGFiYXNlLAorICAgICAgICAgICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSAiICsgVEVTVF9UQUJMRSwgbnVsbCkpOworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogaHR0cDovL2IvaXNzdWU/aWQ9Mjk0MzAyOAorICAgICAqIFNRTGl0ZU9wZW5IZWxwZXIgbWFpbnRhaW5zIGEgU2luZ2xldG9uIGV2ZW4gaWYgaXQgaXMgaW4gYmFkIHN0YXRlLgorICAgICAqLworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBbmRSZW9wZW4oKSB7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOworICAgICAgICBUZXN0T3BlbkhlbHBlciBoZWxwZXIgPSBuZXcgVGVzdE9wZW5IZWxwZXIoZ2V0Q29udGV4dCgpLCBEQl9OQU1FLCBudWxsLAorICAgICAgICAgICAgICAgIENVUlJFTlRfREFUQUJBU0VfVkVSU0lPTiwgbmV3IERlZmF1bHREYXRhYmFzZUVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgbURhdGFiYXNlID0gaGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgY3JlYXRlVGFibGVBbmRDbGVhckNhY2hlKCk7CisgICAgICAgIG1EYXRhYmFzZS5leGVjU1FMKCJJTlNFUlQgaW50byAiICsgVEVTVF9UQUJMRSArICIgdmFsdWVzKDEwLCA5OTkpOyIpOworICAgICAgICBDdXJzb3IgYyA9IG1EYXRhYmFzZS5xdWVyeShURVNUX1RBQkxFLCBuZXcgU3RyaW5nW117ImkiLCAiaiJ9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1EYXRhYmFzZS5pc09wZW4oKSk7CisgICAgICAgIG1EYXRhYmFzZSA9IGhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgIGFzc2VydFRydWUobURhdGFiYXNlLmlzT3BlbigpKTsKKyAgICAgICAgYyA9IG1EYXRhYmFzZS5xdWVyeShURVNUX1RBQkxFLCBuZXcgU3RyaW5nW117ImkiLCAiaiJ9LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGMuY2xvc2UoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0T3BlbkhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgICAgICBwdWJsaWMgVGVzdE9wZW5IZWxwZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG5hbWUsIGZhY3RvcnksIHZlcnNpb24sIGVycm9ySGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKFNRTGl0ZURhdGFiYXNlIGRiKSB7fQorICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZUdlbmVyYWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3Y2NjZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlR2VuZXJhbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkZsYWt5VGVzdDsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgU1FMaXRlR2VuZXJhbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7Ci0gICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7Ci0gICAgQm9vbGVhbiBleGNlcHRpb25SZWN2ZCA9IGZhbHNlOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZXhjZXB0aW9uUmVjdmQgPSBmYWxzZTsKLSAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOwotICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJkYXRhYmFzZV90ZXN0LmRiIik7Ci0gICAgICAgIGlmIChtRGF0YWJhc2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1EYXRhYmFzZSA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKG1EYXRhYmFzZUZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRGF0YWJhc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1EYXRhYmFzZS5jbG9zZSgpOwotICAgICAgICBtRGF0YWJhc2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlT2ZTYW1lU3FsU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKLQotICAgICAgICAvLyB0aHJlYWQgMSBjcmVhdGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7Ci0KLSAgICAgICAgLy8gc3RhcnQgMiB0aHJlYWRzIHRvIGRvIHJlcGVhdGVkbHkgZXhlY3V0ZSAic3RtdCIKLSAgICAgICAgLy8gc2luY2UgdGhlc2UgMiB0aHJlYWRzIGFyZSBleGVjdXRpbmcgdGhlIHNhbWUgc3FsLCB0aGV5IGVhY2ggc2hvdWxkIGdldAotICAgICAgICAvLyB0aGVpciBvd24gY29weSBhbmQKLSAgICAgICAgLy8gdGhlcmUgU0hPVUxEIE5PVCBiZSBhbiBlcnJvciBmcm9tIHNxbGl0ZTogInByZXBhcmVkIHN0YXRlbWVudCBpcyBidXN5IgotICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOID0gMTAwMDsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgbWFueSB0aW1lcwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgczEgPSBtRGF0YWJhc2UuY29tcGlsZVN0YXRlbWVudChzdG10KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmJpbmRMb25nKDEsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgczEuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlNRTGl0ZUV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoInJhbmRvbSB1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0gICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBARmxha3lUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVByZXBhcmVkU3RhdGVtZW50QnkyVGhyZWFkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKLQotICAgICAgICAvLyB0aHJlYWQgMSBjcmVhdGVzIGEgcHJlcGFyZWQgc3RhdGVtZW50Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdG10ID0gIlNFTEVDVCAqIEZST00gdGVzdF9wc3RtdCBXSEVSRSBpID0gPyI7Ci0gICAgICAgIGZpbmFsIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOwotCi0gICAgICAgIC8vIHN0YXJ0IDIgdGhyZWFkcyB0byBkbyByZXBlYXRlZGx5IGV4ZWN1dGUgInN0bXQiCi0gICAgICAgIC8vIHNpbmNlIHRoZXNlIDIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIHRoZSBzYW1lIHByZXBhcmVkIHN0YXRlbWVudCwKLSAgICAgICAgLy8gc2hvdWxkIHNlZSBhbiBlcnJvciBmcm9tIHNxbGl0ZTogInByZXBhcmVkIHN0YXRlbWVudCBpcyBidXN5IgotICAgICAgICBjbGFzcyBSdW5TdG10VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOID0gMTAwMDsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGUgbWFueSB0aW1lcwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdCBpdAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJsaWJyYXJ5IHJvdXRpbmUgY2FsbGVkIG91dCBvZiBzZXF1ZW5jZToiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvblJlY3ZkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoInJhbmRvbSB1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7Ci0gICAgICAgIHQyLnN0YXJ0KCk7Ci0gICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb25SZWN2ZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVN0YXRlbWVudFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NTQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVTdGF0ZW1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOworCitwdWJsaWMgY2xhc3MgU1FMaXRlU3RhdGVtZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZSBtRGF0YWJhc2U7CisgICAgcHJpdmF0ZSBGaWxlIG1EYXRhYmFzZUZpbGU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworCisgICAgICAgIEZpbGUgZGJEaXIgPSBnZXRDb250ZXh0KCkuZ2V0RGlyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIENvbnRleHQuTU9ERV9QUklWQVRFKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZSA9IG5ldyBGaWxlKGRiRGlyLCAiZGF0YWJhc2VfdGVzdC5kYiIpOworICAgICAgICBpZiAobURhdGFiYXNlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YWJhc2UgPSBTUUxpdGVEYXRhYmFzZS5vcGVuT3JDcmVhdGVEYXRhYmFzZShtRGF0YWJhc2VGaWxlLmdldFBhdGgoKSwgbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobURhdGFiYXNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuY2xvc2UoKTsKKyAgICAgICAgbURhdGFiYXNlRmlsZS5kZWxldGUoKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCAyIHRocmVhZHMgdG8gcmVwZWF0ZWRseSBleGVjdXRlIHRoZSBhYm92ZSBTUUwgc3RhdGVtZW50LgorICAgICAqIEV2ZW4gdGhvdWdoIDIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIHRoZSBzYW1lIFNRTCwgdGhleSBlYWNoIHNob3VsZCBnZXQgdGhlaXIgb3duIGNvcHkgb2YKKyAgICAgKiBwcmVwYXJlZCBTUUwgc3RhdGVtZW50IGlkIGFuZCB0aGVyZSBTSE9VTEQgTk9UIGJlIGFuIGVycm9yIGZyb20gc3FsaXRlIG9yIGFuZHJvaWQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHRlc3QgdGhyZWFkcyBzdGFydGVkIGJ5IHRoaXMgdGVzdCBhcmUgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVNxbFN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKKyAgICAgICAgY2xhc3MgUnVuU3RtdFRocmVhZCBleHRlbmRzIFRocmVhZCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIC8vIGRvIGl0IGVub3VnaCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGNvcm5lciBjYXNlcyBnb2luZyB1bnRlc3RlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBzMSA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KHN0bXQpOworICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgczEuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgICAgICBzMS5jbG9zZSgpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MSA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQxLnN0YXJ0KCk7CisgICAgICAgIFJ1blN0bXRUaHJlYWQgdDIgPSBuZXcgUnVuU3RtdFRocmVhZCgpOworICAgICAgICB0Mi5zdGFydCgpOworICAgICAgICAgd2hpbGUgKHQxLmlzQWxpdmUoKSB8fCB0Mi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNpbXBsZSB0ZXN0OiBzdGFydCAyIHRocmVhZHMgdG8gcmVwZWF0ZWRseSBleGVjdXRlIHRoZSBzYW1lIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9LgorICAgICAqIFRoZSAyIHRocmVhZHMgdGFrZSB0dXJucyB0byB1c2UgdGhlIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9OyBpLmUuLCBpdCBpcyBOT1QgaW4gdXNlCisgICAgICogYnkgYm90aCB0aGUgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHRlc3QgdGhyZWFkcyBzdGFydGVkIGJ5IHRoaXMgdGVzdCBhcmUgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZU9mU2FtZVNxbGl0ZVN0YXRlbWVudEJ5MlRocmVhZHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBtRGF0YWJhc2UuZXhlY1NRTCgiQ1JFQVRFIFRBQkxFIHRlc3RfcHN0bXQgKGkgSU5URUdFUiBQUklNQVJZIEtFWSwgaiB0ZXh0KTsiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0bXQgPSAiU0VMRUNUICogRlJPTSB0ZXN0X3BzdG10IFdIRVJFIGkgPSA/IjsKKyAgICAgICAgZmluYWwgU1FMaXRlU3RhdGVtZW50IHMxID0gbURhdGFiYXNlLmNvbXBpbGVTdGF0ZW1lbnQoc3RtdCk7CisgICAgICAgIGNsYXNzIFJ1blN0bXRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBpdCBlbm91Z2ggdGltZXMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjb3JuZXIgY2FzZXMgZ29pbmcgdW50ZXN0ZWQKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzMS5iaW5kTG9uZygxLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSdW5TdG10VGhyZWFkIHQxID0gbmV3IFJ1blN0bXRUaHJlYWQoKTsKKyAgICAgICAgdDEuc3RhcnQoKTsKKyAgICAgICAgUnVuU3RtdFRocmVhZCB0MiA9IG5ldyBSdW5TdG10VGhyZWFkKCk7CisgICAgICAgIHQyLnN0YXJ0KCk7CisgICAgICAgIHdoaWxlICh0MS5pc0FsaXZlKCkgfHwgdDIuaXNBbGl2ZSgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICB9CisgICAgfQorICAgIC8qKiBTeW5jaHJvbml6ZSBvbiB0aGlzIHdoZW4gYWNjZXNzaW5nIHRoZSBTcWxpdGVTdGF0ZW1ldCBpbiB0aGUgYWJvdmUgKi8KKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jayh0cnVlKTsKKyAgICBwcml2YXRlIHZvaWQgbG9jaygpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgdW5sb2NrKCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgZm9sbG93aW5nOiBhIHtAbGluayBTUUxpdGVTdGF0ZW1lbnR9IG9iamVjdCBzaG91bGQgbm90IHJlZmVyIHRvIGEKKyAgICAgKiBwcmUtY29tcGlsZWQgU1FMIHN0YXRlbWVudCBpZCBleGNlcHQgaW4gZHVyaW5nIHRoZSBwZXJpb2Qgb2YgYmluZGluZyB0aGUgYXJndW1lbnRzCisgICAgICogYW5kIGV4ZWN1dGluZyB0aGUgU1FMIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoImNyZWF0ZSB0YWJsZSB0IChpIGludCwgaiB0ZXh0KTsiKTsKKyAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGZhbHNlKTsKKyAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKHRydWUpOworCisgICAgICAgIC8vIGEgc21hbGwgc3RyZXNzIHRlc3QgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgb2YKKyAgICAgICAgLy8gdGhlIGFjcXVpcmUgJiByZWxlYXNlIG9mIHByZS1jb21waWxlZCBzdGF0ZW1lbnQgaWQgYnkgU1FMaXRlU3RhdGVtZW50IG9iamVjdC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgdmVyaWZ5UmVmZXJlbmNlVG9QcmVjb21waWxlZFN0YXRlbWVudElkKGZhbHNlKTsKKyAgICAgICAgICAgIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlZmVyZW5jZVRvUHJlY29tcGlsZWRTdGF0ZW1lbnRJZChib29sZWFuIHdhbCkgeworICAgICAgICBpZiAod2FsKSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuZW5hYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5kaXNhYmxlV3JpdGVBaGVhZExvZ2dpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0ZXN0IHdpdGggSU5TRVJUIHN0YXRlbWVudCAtIGRvZXNuJ3QgdXNlIGNvbm5lY3Rpb24gcG9vbCwgaWYgV0FMIGlzIHNldAorICAgICAgICBTUUxpdGVTdGF0ZW1lbnQgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJpbnNlcnQgaW50byB0IHZhbHVlcyg/LD8pOyIpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICAgICAgLy8gc3FsIHN0YXRlbWVudCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGludCBjb2xWYWx1ZSA9IG5ldyBSYW5kb20oKS5uZXh0SW50KCk7CisgICAgICAgIHN0bXQuYmluZExvbmcoMSwgY29sVmFsdWUpOworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc3FsIHN0YXRlbWVudCBpcyBzdGlsbCBub3QgY29tcGlsZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIHNob3VsZCBzdGlsbCBiZSB1c2luZyB0aGUgbURhdGFiYXNlIGNvbm5lY3Rpb24gLSB2ZXJpZnkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuYmluZFN0cmluZygyLCAiYmxhaCIgKyBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuZXhlY3V0ZUluc2VydCgpOworICAgICAgICAvLyBub3cgdGhhdCB0aGUgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCBwcmUtY29tcGlsZWQgc3RhdGVtZW50IHNob3VsZCBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIC8vIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IHNob3VsZCBzdGlsbCByZW1haW4gcmVsZWFzZWQgZnJvbSB0aGlzIG9iamVjdAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIGJ1dCB0aGUgZGF0YWJhc2UgaGFuZGxlIHNob3VsZCBzdGlsbCBiZSB0aGUgc2FtZQorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisKKyAgICAgICAgLy8gdGVzdCB3aXRoIGEgU0VMRUNUIHN0YXRlbWVudCAtIHVzZXMgY29ubmVjdGlvbiBwb29sIGlmIFdBTCBpcyBzZXQKKyAgICAgICAgc3RtdCA9IG1EYXRhYmFzZS5jb21waWxlU3RhdGVtZW50KCJzZWxlY3QgaSBmcm9tIHQgd2hlcmUgaj0/OyIpOworICAgICAgICAvLyBzcWwgc3RhdGVtZW50IHNob3VsZCBub3QgYmUgY29tcGlsZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdG10Lm5TdGF0ZW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5nZXRTcWxTdGF0ZW1lbnRJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZS5tTmF0aXZlSGFuZGxlLCBzdG10Lm5IYW5kbGUpOworICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLCBzdG10Lm1EYXRhYmFzZSk7CisgICAgICAgIHN0bXQuYmluZFN0cmluZygxLCAiYmxhaCIgKyBjb2xWYWx1ZSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzcWwgc3RhdGVtZW50IGlzIHN0aWxsIG5vdCBjb21waWxlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICAvLyBleGVjdXRlIHRoZSBzdGF0ZW1lbnQKKyAgICAgICAgTG9uZyBsID0gc3RtdC5zaW1wbGVRdWVyeUZvckxvbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFZhbHVlLCBsLmludFZhbHVlKCkpOworICAgICAgICAvLyBub3cgdGhhdCB0aGUgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCBwcmUtY29tcGlsZWQgc3RhdGVtZW50IHNob3VsZCBiZSByZWxlYXNlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UubU5hdGl2ZUhhbmRsZSwgc3RtdC5uSGFuZGxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1EYXRhYmFzZSwgc3RtdC5tRGF0YWJhc2UpOworICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgIC8vIHByZS1jb21waWxlZCBTUUwgc3RhdGVtZW50IHNob3VsZCBzdGlsbCByZW1haW4gcmVsZWFzZWQgZnJvbSB0aGlzIG9iamVjdAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RtdC5uU3RhdGVtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0bXQuZ2V0U3FsU3RhdGVtZW50SWQoKSk7CisgICAgICAgIC8vIGJ1dCB0aGUgZGF0YWJhc2UgaGFuZGxlIHNob3VsZCBzdGlsbCByZW1haW4gYXR0YWNoZWQgdG8gdGhlIHN0YXRlbWVudAorICAgICAgICBhc3NlcnRFcXVhbHMobURhdGFiYXNlLm1OYXRpdmVIYW5kbGUsIHN0bXQubkhhbmRsZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtRGF0YWJhc2UsIHN0bXQubURhdGFiYXNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRFeGNlcHRpb25UZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlVW5maW5hbGl6ZWRFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyMDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlVGVzdC5DbGFzc1RvVGVzdFNxbENvbXBpbGF0aW9uQW5kQ2FjaGluZzsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBTUUxpdGVVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURhdGFiYXNlOworICAgIHByaXZhdGUgRmlsZSBtRGF0YWJhc2VGaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInRlc3RDdXJzb3IiOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgRmlsZSBkYkRpciA9IGdldENvbnRleHQoKS5nZXREaXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOworICAgICAgICBtRGF0YWJhc2VGaWxlID0gbmV3IEZpbGUoZGJEaXIsICJVbmZpbmFsaXplZEV4Y2VwdGlvblRlc3QuZGIiKTsKKyAgICAgICAgaWYgKG1EYXRhYmFzZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFiYXNlID0gU1FMaXRlRGF0YWJhc2Uub3Blbk9yQ3JlYXRlRGF0YWJhc2UobURhdGFiYXNlRmlsZS5nZXRQYXRoKCksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1EYXRhYmFzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbURhdGFiYXNlLmNsb3NlKCk7CisgICAgICAgIG1EYXRhYmFzZUZpbGUuZGVsZXRlKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmZpbmFsaXplZEV4Y2VwdGlvbk5vdEV4Y3BlY3RlZCgpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEFCTEVfTkFNRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIC8vIHRoZSBhYm92ZSBzdGF0ZW1lbnQgc2hvdWxkIGJlIGluIFNRTGl0ZURhdGFiYXNlLm1Qcm9ncmFtcworICAgICAgICAvLyBhbmQgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgZmluYWxpemVkIHdoZW4gZGF0YWJhc2UgaXMgY2xvc2VkCisgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGF0YWJhc2UuY2xvc2VEYXRhYmFzZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbURhdGFiYXNlLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmZpbmFsaXplZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgbURhdGFiYXNlLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgVEFCTEVfTkFNRSArICIgKGkgaW50LCBqIGludCk7Iik7CisgICAgICAgIG1EYXRhYmFzZS5sb2NrKCk7CisgICAgICAgIG1EYXRhYmFzZS5jbG9zZVBlbmRpbmdTdGF0ZW1lbnRzKCk7IC8vIGNsZWFycyB0aGUgYWJvdmUgZnJvbSBmaW5hbGl6ZXIgcXVldWUgaW4gbWRhdGFiYXNlCisgICAgICAgIG1EYXRhYmFzZS51bmxvY2soKTsKKyAgICAgICAgQ2xhc3NUb1Rlc3RTcWxDb21waWxhdGlvbkFuZENhY2hpbmcuY3JlYXRlKG1EYXRhYmFzZSwgInNlbGVjdCAqIGZyb20gIiAgKyBUQUJMRV9OQU1FKTsKKyAgICAgICAgLy8gc2luY2UgdGhlIGFib3ZlIGlzIE5PVCBjbG9zZWQsIGNsb3NpbmcgZGF0YWJhc2Ugc2hvdWxkIGZhaWwKKyAgICAgICAgbURhdGFiYXNlLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1EYXRhYmFzZS5jbG9zZURhdGFiYXNlKCk7CisgICAgICAgICAgICBmYWlsKCJleGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMaXRlVW5maW5hbGl6ZWRPYmplY3RzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGF0YWJhc2UudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1VyaVRlc3QuamF2YQppbmRleCBhNWZkYTIwLi5jOGFkNjBkIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvVXJpVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9VcmlUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDkgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgVXJpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKIApAQCAtNTIsMjAgKzU1LDIwIEBACiAKICAgICBwcml2YXRlIHZvaWQgcGFyY2VsQW5kVW5wYXJjZWwoVXJpIHUpIHsKICAgICAgICAgUGFyY2VsIHAgPSBQYXJjZWwub2J0YWluKCk7Ci0JdHJ5IHsKLQkJVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7Ci0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQlhc3NlcnRFcXVhbHModSwgVXJpLkNSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmkud3JpdGVUb1BhcmNlbChwLCB1KTsKKyAgICAgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOwogCi0JCXAuc2V0RGF0YVBvc2l0aW9uKDApOwotCQl1ID0gdS5idWlsZFVwb24oKS5idWlsZCgpOyAgICAgICAgCi0JCVVyaS53cml0ZVRvUGFyY2VsKHAsIHUpOwotCQlwLnNldERhdGFQb3NpdGlvbigwKTsKLQkJYXNzZXJ0RXF1YWxzKHUsIFVyaS5DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocCkpOwotCX0KLQlmaW5hbGx5IHsKLQkJcC5yZWN5Y2xlKCk7Ci0JfQorICAgICAgICAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICB1ID0gdS5idWlsZFVwb24oKS5idWlsZCgpOworICAgICAgICAgICAgVXJpLndyaXRlVG9QYXJjZWwocCwgdSk7CisgICAgICAgICAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1LCBVcmkuQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHApKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIHAucmVjeWNsZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFNtYWxsVGVzdApAQCAtMjgyLDYgKzI4NSwxNCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImMiKSk7CiAgICAgfQogCisgICAgLy8gaHR0cDovL2IvMjMzNzA0MgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdFdpdGhUcmFpbGluZ0RvdCgpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL2dvb2dsZS5jb20uL2IvYy9nIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZ29vZ2xlLmNvbS4iLCB1cmkuZ2V0SG9zdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYi9jL2ciLCB1cmkuZ2V0UGF0aCgpKTsKKyAgICB9CisKICAgICBAU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtZU9ubHkoKSB7CiAgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImVtcHR5OiIpOwpAQCAtNjAzLDQgKzYxNCwxMjIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoImIiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCJjIikpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5KCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vPz1iIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlckVtcHR5S2V5MigpIHsKKyAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1iJiZjPWQiKTsKKyAgICAgIGFzc2VydEVxdWFscygiIiwgdXJpLmdldFF1ZXJ5UGFyYW1ldGVyKCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyRW1wdHlLZXkzKCkgeworICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tPyIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFbXB0eUtleTQoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/YT1iJiIpOworICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXIoIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/PWImIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCB2YWx1ZXMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB2YWx1ZXMuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzRW1wdHlLZXkyKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20/Iik7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eUtleTMoKSB7CisgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2E9YiYmYz1kIik7CisgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVycygiIik7CisgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICBhc3NlcnRFcXVhbHMoIiIsIHZhbHVlcy5nZXQoMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vdGVzdD9hPTEiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlLZXkoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14JiZjPXoiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlLZXkyKCkgeworICAgICAgICBVcmkgdXJpID0gVXJpLnBhcnNlKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vP2E9eCY9ZCZjPXoiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlck5hbWVzRW1wdHlWYWx1ZXMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT1mb28mYj0mYz0iKTsKKyAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSB1cmkuZ2V0UXVlcnlQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJOYW1lc0VkZ2VDYXNlcygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL2Zvbz9hPWJhciZiPWJhciZjPSYmZD1iYXomZSZmJmc9YnV6eiYmJmEmYj1iYXImaCIpOworICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBuYW1lcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImUiLCBpdGVyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZiIsIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImgiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyTmFtZXNFc2NhcGVkS2V5cygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hJTIwYj1mb28mYyUyMGQ9Iik7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5hbWVzLnNpemUoKSk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSBiIiwgaXRlci5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMgZCIsIGl0ZXIubmV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJFc2NhcGVkS2V5cygpIHsKKyAgICAgICAgVXJpIHVyaSA9IFVyaS5wYXJzZSgiaHR0cDovL3d3dy5nb29nbGUuY29tLz9hJTIwYj1mb28mYyUyMGQ9Iik7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHVyaS5nZXRRdWVyeVBhcmFtZXRlcigiYSBiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJRdWVyeVBhcmFtZXRlcnMoKSB7CisgICAgICAgIFVyaSB1cmkgPSBVcmkucGFyc2UoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8/YT14JmI9eSZjPXoiKS5idWlsZFVwb24oKQorICAgICAgICAgICAgLmNsZWFyUXVlcnkoKS5hcHBlbmRRdWVyeVBhcmFtZXRlcigiZm9vIiwgImJhciIpLmJ1aWxkKCk7CisgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gdXJpLmdldFF1ZXJ5UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5hbWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgbmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9XZWJBZGRyZXNzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L1dlYkFkZHJlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhZjM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9XZWJBZGRyZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuV2ViQWRkcmVzczsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFdlYkFkZHJlc3NUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgLy8gaHR0cDovL2IvMjMzNzA0MgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdFdpdGhUcmFpbGluZ0RvdCgpIHsKKyAgICAgICAgV2ViQWRkcmVzcyB3ZWJBZGRyZXNzID0gbmV3IFdlYkFkZHJlc3MoImh0dHA6Ly9nb29nbGUuY29tLi9iL2MvZyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdvb2dsZS5jb20uIiwgd2ViQWRkcmVzcy5tSG9zdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2IvYy9nIiwgd2ViQWRkcmVzcy5tUGF0aCk7CisgICAgfQorCisgICAgLy8gaHR0cDovL2IvMTAxMTYwMgorICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFdpdGhvdXRMZWFkaW5nU2xhc2goKSB7CisgICAgICAgIFdlYkFkZHJlc3Mgd2ViQWRkcmVzcyA9IG5ldyBXZWJBZGRyZXNzKCJodHRwOi8vd3d3Lm15c3BhY2UuY29tP3NpPTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3d3cubXlzcGFjZS5jb20iLCB3ZWJBZGRyZXNzLm1Ib3N0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvP3NpPTEiLCB3ZWJBZGRyZXNzLm1QYXRoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVtb3J5RmlsZVRlc3QuamF2YQppbmRleCAwMDlhMGUyLi5lNjI3YmI0IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZW1vcnlGaWxlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lbW9yeUZpbGVUZXN0LmphdmEKQEAgLTIzNyw1MSArMjM3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNNZW1vcnlGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKCJNZW1vcnlGaWxlVGVzdCIsIDEwMDAwMDApOwotICAgICAgICBGaWxlRGVzY3JpcHRvciBmZCA9IGZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmZCk7Ci0gICAgICAgIGFzc2VydFRydWUoZmQudmFsaWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoTWVtb3J5RmlsZS5pc01lbW9yeUZpbGUoZmQpKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLmluKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKEZpbGVEZXNjcmlwdG9yLm91dCkpOwotICAgICAgICBhc3NlcnRGYWxzZShNZW1vcnlGaWxlLmlzTWVtb3J5RmlsZShGaWxlRGVzY3JpcHRvci5lcnIpKTsKLQotICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWVtb3J5RmlsZVRlc3QiLCIudG1wIiwgZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGUpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0gICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRmQgPSBvdXQuZ2V0RkQoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlsZUZkKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZpbGVGZCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZURlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVtb3J5RmlsZSBmaWxlID0gbmV3IE1lbW9yeUZpbGUoIk1lbW9yeUZpbGVUZXN0IiwgMTAwMDAwMCk7Ci0gICAgICAgIE1lbW9yeUZpbGUgcmVmID0gbmV3IE1lbW9yeUZpbGUoZmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpLCBmaWxlLmxlbmd0aCgpLCAiciIpOwotICAgICAgICBieXRlW10gYnVmZmVyOwotCi0gICAgICAgIC8vIHdyaXRlIHRvIG9yaWdpbmFsLCByZWFkIGZyb20gcmVmZXJlbmNlCi0gICAgICAgIGZpbGUud3JpdGVCeXRlcyh0ZXN0U3RyaW5nLCAwLCAyMDAwLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3Rlc3RTdHJpbmcubGVuZ3RoXTsKLSAgICAgICAgcmVmLnJlYWRCeXRlcyhidWZmZXIsIDIwMDAsIDAsIHRlc3RTdHJpbmcubGVuZ3RoKTsKLSAgICAgICAgY29tcGFyZUJ1ZmZlcnModGVzdFN0cmluZywgYnVmZmVyLCB0ZXN0U3RyaW5nLmxlbmd0aCk7Ci0KLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICByZWYuY2xvc2UoKTsgIC8vIERvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHNpbmNlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IGR1cCgyKTplZAotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSB0ZXN0U3RyaW5nID0gbmV3IGJ5dGVbXSB7CiAgICAgICAgIDMsIDEsIDQsIDEsIDUsIDksIDIsIDYsIDUsIDMsIDUsIDgsIDksIDcsIDksIDMsIDIsIDMsIDgsIDQsIDYsIDIsIDYsIDQsIDMsIDMsIDgsIDMsIDIsIDcsIDksIDUsIDAsIDIsIDgsIDgsIDQsIDEsIDksIDcsIDEsIDYsIDksIDMsIDksIDksIDMsIDcsIDUsIDEsIDAsIDUsIDgsIDIsIDAsIDksIDcsIDQsIDksIDQsIDQsIDUsIDksIDIsIDMsIDAsIDcsIDgsIDEsIDYsIDQsCiAgICAgICAgIDAsIDYsIDIsIDgsIDYsIDIsIDAsIDgsIDksIDksIDgsIDYsIDIsIDgsIDAsIDMsIDQsIDgsIDIsIDUsIDMsIDQsIDIsIDEsIDEsIDcsIDAsIDYsIDcsIDksIDgsIDIsIDEsIDQsIDgsIDAsIDgsIDYsIDUsIDEsIDMsIDIsIDgsIDIsIDMsIDAsIDYsIDYsIDQsIDcsIDAsIDksIDMsIDgsIDQsIDQsIDYsIDAsIDksIDUsIDUsIDAsIDUsIDgsIDIsIDIsIDMsIDEsIDcsIDIsCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9vcy9NZXNzYWdlUXVldWVUZXN0LmphdmEKaW5kZXggYjdjMmQxZi4uZjgyYmZjZSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvb3MvTWVzc2FnZVF1ZXVlVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL29zL01lc3NhZ2VRdWV1ZVRlc3QuamF2YQpAQCAtNDEsNiArNDEsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGlmICghbXNnLmlzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW51c2UgaXMgZmFsc2UsIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgIyIgKyBtc2cud2hhdCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1Db3VudCA8PSBtTGFzdE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICBpZiAobXNnLndoYXQgIT0gbUNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCkBAIC05OSw1ICsxMDMsMTc0IEBACiAKICAgICAgICAgdGVzdGVyLmRvVGVzdCgxMDAwKTsKICAgICB9Ci19CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyIGV4dGVuZHMgVGVzdEhhbmRsZXJUaHJlYWQgeworICAgICAgICBIYW5kbGVyIG1IYW5kbGVyOworICAgICAgICBpbnQgbUxhc3RNZXNzYWdlOworICAgICAgICBpbnQgbUNvdW50OworCisgICAgICAgIHB1YmxpYyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ28oKSB7CisgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEZpZWxkSW50ZWdyaXR5SGFuZGxlci50aGlzLmhhbmRsZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKCFtc2cuaXNJblVzZSgpKSB7CisgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuaXNJbnVzZSBpcyBmYWxzZSwgc2hvdWxkIGFsd2F5cyBiZSB0cnVlLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNvdW50IDw9IG1MYXN0TWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCAhPSBtQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbWVzc2FnZSAjIiArIG1Db3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZWNlaXZlZCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ291bnQgPT0gbUxhc3RNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSByZWNlaXZlZCBhZnRlciBkb25lLCAjIiArIG1zZy53aGF0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZEludGVncml0eSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFRlc3RIYW5kbGVyVGhyZWFkIHRlc3RlciA9IG5ldyBUZXN0RmllbGRJbnRlZ3JpdHlIYW5kbGVyKCkgeworICAgICAgICAgICAgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmdvKCk7CisgICAgICAgICAgICAgICAgbUxhc3RNZXNzYWdlID0gMTsKKyAgICAgICAgICAgICAgICBtQ291bnQgPSAwOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoMCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5mbGFncyA9IC0xOworICAgICAgICAgICAgICAgICAgICBtc2cud2hhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1zZy5hcmcxID0gNDU2OworICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMiA9IDc4OTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IHRoaXM7CisgICAgICAgICAgICAgICAgICAgIG1zZy5yZXBseVRvID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmRhdGEgPSBtQnVuZGxlOworICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5wdXRTdHJpbmcoImtleSIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbmV3TXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdNc2cuY29weUZyb20obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5pc0luVXNlKCkgIT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuaXNJblVzZSBpcyB0cnVlIHNob3VsZCBiZSBmYWxzZSBhZnRlciBjb3B5RnJvbSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLmZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZmxhZ3MgaXMgJWQgc2hvdWxkIGJlIDAgYWZ0ZXIgY29weUZyb20iLCBuZXdNc2cuZmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy53aGF0ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy53aGF0IGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGF0LCAxKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cuYXJnMSAhPSA0NTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld01zZy5hcmcxIGlzICVkIHNob3VsZCBiZSAlZCBhZnRlciBjb3B5RnJvbSIsIG1zZy5hcmcxLCA0NTYpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIGFmdGVyIGNvcHlGcm9tIiwgbXNnLmFyZzIsIDc4OSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobmV3TXNnLm9iaiAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cucmVwbHlUbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnJlcGx5VG8gc2hvdWxkIGJlIG51bGwgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5kYXRhID09IG1CdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YSBzaG91bGQgTk9UIGJlIG1CdW5kbGUgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgYWZ0ZXIgY29weUZyb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cud2hlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdNc2cud2hlbiBpcyAlZCBzaG91bGQgYmUgMCBhZnRlciBjb3B5RnJvbSIsIG5ld01zZy53aGVuKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdNc2cudGFyZ2V0ICE9IG1IYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLnRhcmdldCBpcyBOT1QgbUhhbmRsZXIgYWZ0ZXIgY29weUZyb20iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01zZy5jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3TXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIGFmdGVyIGNvcHlGcm9tIikpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobmV3TXNnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy53aGF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5pc0luVXNlKCkgIT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmlzSW5Vc2UgaXMgZmFsc2Ugc2hvdWxkIGJlIHRydWUgYWZ0ZXIgd2hlbiBwcm9jZXNzaW5nICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcxICE9IDQ1NikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzEgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsIDQ1NiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5hcmcyICE9IDc4OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmFyZzIgaXMgJWQgc2hvdWxkIGJlICVkIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzIsIDc4OSwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5vYmogIT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLm9iaiBzaG91bGQgYmUgJ3RoaXMnIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5yZXBseVRvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5yZXBseVRvIHNob3VsZCBiZSBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLmVxdWFscyhtQnVuZGxlLmdldFN0cmluZygia2V5IikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2cuZGF0YS5nZXRTdHJpbmcoXCJrZXlcIikgaXMgJXMgYW5kIGRvZXMgbm90IGVxdWFsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbUJ1bmRsZS5nZXRTdHJpbmcoXCJrZXlcIikgd2hpY2ggaXMgJXMgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZGF0YS5nZXRTdHJpbmcoImtleSIpLCAgbUJ1bmRsZS5nZXRTdHJpbmcoImtleSIpLCBtc2cud2hhdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobXNnLndoZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLndoZW4gaXMgJWQgc2hvdWxkIGJlIDAgd2hlbiBwcm9jZXNzaW5nICMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cud2hlbiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy50YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLnRhcmdldCBpcyBOT1QgbnVsbCB3aGVuIHByb2Nlc3NpbmcgIyAlZCIsIG1zZy53aGF0KSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZShuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnLmNhbGxiYWNrIGlzIE5PVCBudWxsIHdoZW4gcHJvY2Vzc2luZyAjICVkIiwgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbXNnLndoYXQgaXMgJWQiICsgbXNnLndoYXQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRlc3Rlci5kb1Rlc3QoMTAwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkRXhwb3J0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVjNDYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEV4cG9ydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLkNvbnRhY3RFbnRyeTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW07Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLlR5cGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5WQ2FyZFRlc3RzQmFzZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUgY29kZSByZWxhdGVkIHRvIHZDYXJkIGV4cG9ydGVyLCBpbmN1bGRpbmcgdkNhcmQgY29tcG9zZXIuCi0gKiBUaGlzIHRlc3QgY2xhc3MgZGVwZW5kcyBvbiB2Q2FyZCBpbXBvcnRlciBjb2RlLCBzbyBpZiB0ZXN0cyBmb3IgdkNhcmQgaW1wb3J0ZXIgZmFpbCwKLSAqIHRoZSByZXN1bHQgb2YgdGhpcyBjbGFzcyB3aWxsIG5vdCBiZSByZWxpYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkRXhwb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gc1Bob3RvQnl0ZUFycmF5ID0KLSAgICAgICAgVkNhcmRJbXBvcnRlclRlc3RzLnNQaG90b0J5dGVBcnJheUZvckNvbXBsaWNhdGVkQ2FzZTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlJvaWQiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlJvaWQgQW5kbyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJBbmRvO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kbyIsICJSb2lkIiwgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRElTUExBWSBOQU1FIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQXBwcm9wcmlhdGVGYW1pbHlOYW1lIiwgIkFwcHJvcHJpYXRlR2l2ZW5OYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkRJU1BMQVkgTkFNRSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUJhc2ljVjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVCYXNpYyhWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCBvbmx5ICJwcmltYXJ5IiBTdHJ1Y3R1cmVkTmFtZSBpcyBlbWl0dGVkLCBzbyB0aGF0IG91ciB2Q2FyZCBmaWxlCi0gICAgICogd2lsbCBub3QgY29uZnVzZSB0aGUgZXh0ZXJuYWwgaW1wb3J0ZXIsIGFzc3VtaW5nIHRoZXJlIG1heSBiZSBzb21lIGltcG9ydGVyCi0gICAgICogd2hpY2ggcHJlc3VtZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgcHJvcGVydHkgdG93YXJkIGVhY2ggb2YgICJOIiwgIkZOIiwgZXRjLgotICAgICAqIE5vdGUgdGhhdCBtb3JlIHRoYW4gb25lICJOIiwgIkZOIiwgZXRjLiBwcm9wZXJ0aWVzIGFyZSBhY2NlcHRhYmxlIGluIHZDYXJkIHNwZWMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRG9Ob3RFbWl0RGlzcGxheU5hbWUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICAvLyBXaXRoICJJU19QUklNQVJZPTEiLCBidXQgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWUsIHNpbmNlIHRoaXMgaXMgc2Vjb25kLCBub3QgZmlyc3QuCi0gICAgICAgIC8vIHZDYXJkIDIuMSBkb2VzIG5vdCBzcGVjaWZ5IGFueXRoaW5nIGFib3V0IHRoZSBudW1iZXIgb2YgTiBwcm9wZXJ0aWVzLiBXZSBjaG9vc2Ugbm90Ci0gICAgICAgIC8vIGVtaXR0aW5nIHRoaXMgcHJvcGVydHkuCi0gICAgICAgIC8vIHZDYXJkIDMuMCBkb2VzIChUaGVyZSBtdXN0IGJlIG9uZSBOIHByb3BlcnR5KQotICAgICAgICAvLyB2Q2FyZCA0LjAgKHJldjEzKSBkb2VzIChjYXJkaW5hbGl0eSAoMCwgMSkpLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVGYW1pbHlOYW1lO0FwcHJvcHJpYXRlR2l2ZW5OYW1lO0FwcHJvcHJpYXRlTWlkZGxlTmFtZTsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJBcHByb3ByaWF0ZVByZWZpeDtBcHByb3ByaWF0ZVN1ZmZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVNaWRkbGVOYW1lIiwgIkFwcHJvcHJpYXRlUHJlZml4IiwgIkFwcHJvcHJpYXRlU3VmZml4IikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlWMjEoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VQcmltYXJ5Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeVY0MCgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlUHJpbWFyeUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgb25seSAic3VwZXIgcHJpbWFyeSIgU3RydWN0dXJlZE5hbWUgaXMgZW1pdHRlZC4KLSAgICAgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiB7QGxpbmsgI3Rlc3RTdHJ1Y3R1cmVkTmFtZVVzZVByaW1hcnlDb21tb24oaW50KX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBmaW5hbCBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MSIpOwotCi0gICAgICAgIC8vIFdpdGggIklTX1BSSU1BUlk9MSIsIGJ1dCB3ZSBzaG91bGQgaWdub3JlIHRoaXMgdGltZS4KLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiRG9Ob3RFbWl0RGlzcGxheTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19TVVBFUl9QUklNQVJZLCAxKTsKLQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJEb05vdEVtaXREaXNwbGF5MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWU7IgotICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlUHJlZml4O0FwcHJvcHJpYXRlU3VmZml4IiwKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSIsICJBcHByb3ByaWF0ZVByZWZpeCIsICJBcHByb3ByaWF0ZVN1ZmZpeCIpKTsKLQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lVXNlU3VwZXJQcmltYXJ5VjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVVc2VTdXBlclByaW1hcnlWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVVzZVN1cGVyUHJpbWFyeUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHBob25ldGljIG5hbWVzIGZpZWxkIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLSAgICAgKgotICAgICAqIHZDYXJkIDIuMSBkb2VzIG5vdCBoYXZlIGFueSBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIHRoZW0uCi0gICAgICogdkNhcmQgMy4wIGhhcyBTT1JULVNUUklORyBwcm9wZXJ0eSwgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgaW5zaWRlIGl0LgotICAgICAqIHZDYXJkIDQuMCAocmV2MTMpIGhhcyBTT1JULUFTIHBhcmFtZXRlciwgd2hpY2ggaGFzIHRocmVlIHZhbHVlcyAoZmFtaWx5LCBnaXZlbiwgbWlkZGxlKQotICAgICAqIGluc2lkZSBpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQXBwcm9wcmlhdGVEaXNwbGF5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNGYW1pbHkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKTsKLSAgICAgICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIG5vdyB1c2VzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgICAgICAvLyBlaXRoZXIgMi4xIG5vciAzLjAuCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIkFwcHJvcHJpYXRlRGlzcGxheU5hbWUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZVYyMSgpIHsKLSAgICAgICAgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lUGhvbmV0aWNOYW1lVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RydWN0dXJlZE5hbWVQaG9uZXRpY05hbWVWNDAoKSB7Ci0gICAgICAgIHRlc3RTdHJ1Y3R1cmVkTmFtZVBob25ldGljTmFtZUNvbW1vbihWNDApOwotICAgIH0KLQotICAgIC8vIFRPRE86IG5lZWQgdG8gYWRkIHRlc3QgY2FzZXMgY29uZmlybWluZyBlc2NhcGluZywgZW1wdHkgdmFsdWVzLCBldGMuCi0KLSAgICAvKioKLSAgICAgKiBDb25maXJtcyBhbGwgdGhlIG90aGVyIHNpZGVzIG9mIHRoZSBoYW5kbGluZyBpcyBjb3JyZWN0bHkgaW50ZXJwcmV0ZWQgYXQgb25lIHRpbWUuCi0gICAgICoKLSAgICAgKiBBIGtpbmQgb2YgcmVncmVzc2lvbiB0ZXN0IGZvciBTdHJ1Y3R1cmVkTmFtZSBoYW5kbGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0cnVjdHVyZWROYW1lQ29tcGxpY2F0ZWRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgZmluYWwgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0RmFtaWx5TmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkRvTm90RW1pdEdpdmVuTmFtZTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJEb05vdEVtaXRNaWRkbGVOYW1lMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEb05vdEVtaXRQcmVmaXgxIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIkRvTm90RW1pdFN1ZmZpeDEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0ZhbWlseTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIkRvTm90RW1pdFBob25ldGljR2l2ZW4xIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNNaWRkbGUxIik7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfUFJJTUFSWT0xIiwgYnV0IHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lLgotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJEb05vdEVtaXRGYW1pbHlOYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0R2l2ZW5OYW1lMiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkRvTm90RW1pdE1pZGRsZU5hbWUyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRvTm90RW1pdFByZWZpeDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiRG9Ob3RFbWl0U3VmZml4MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIkRvTm90RW1pdFBob25ldGljRmFtaWx5MiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNHaXZlbjIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY01pZGRsZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgLy8gV2l0aCAiSVNfU1VQRVJfUFJJTUFSWT0xIi4gVGhpcyBpcyB3aGF0IHdlIHNob3VsZCB1c2UuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiQXBwcm9wcmlhdGVQcmVmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljRmFtaWx5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljR2l2ZW4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJBcHByb3ByaWF0ZVBob25ldGljTWlkZGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1NVUEVSX1BSSU1BUlksIDEpOwotCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkRvTm90RW1pdEZhbWlseU5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJEb05vdEVtaXRHaXZlbk5hbWUzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiRG9Ob3RFbWl0TWlkZGxlTmFtZTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRG9Ob3RFbWl0UHJlZml4MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJEb05vdEVtaXRTdWZmaXgzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiRG9Ob3RFbWl0UGhvbmV0aWNGYW1pbHkzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJEb05vdEVtaXRQaG9uZXRpY0dpdmVuMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwgIkRvTm90RW1pdFBob25ldGljTWlkZGxlMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5JU19QUklNQVJZLCAxKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KCJTT1JULUFTIiwKLSAgICAgICAgICAgICAgICAgICAgIkFwcHJvcHJpYXRlRmFtaWx5TmFtZTtBcHByb3ByaWF0ZUdpdmVuTmFtZTtBcHByb3ByaWF0ZU1pZGRsZU5hbWUiKTsKLSAgICAgICAgICAgIC8vIHZDYXJkIDQuMCAocmV2MTMpIG5vdyB1c2VzIFNPUlQtQVMgcGFyYW1ldGVyLCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgICAgICAvLyBlaXRoZXIgMi4xIG5vciAzLjAuCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZUZhbWlseU5hbWU7QXBwcm9wcmlhdGVHaXZlbk5hbWU7QXBwcm9wcmlhdGVNaWRkbGVOYW1lOyIKLSAgICAgICAgICAgICAgICAgICAgKyAiQXBwcm9wcmlhdGVQcmVmaXg7QXBwcm9wcmlhdGVTdWZmaXgiLAotICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJBcHByb3ByaWF0ZUZhbWlseU5hbWUiLCAiQXBwcm9wcmlhdGVHaXZlbk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHByb3ByaWF0ZU1pZGRsZU5hbWUiLCAiQXBwcm9wcmlhdGVQcmVmaXgiLCAiQXBwcm9wcmlhdGVTdWZmaXgiKSk7Ci0gICAgICAgICAgICBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJTT1JULVNUUklORyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQaG9uZXRpY0dpdmVuIEFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwKLSAgICAgICAgICAgICAgICAiQXBwcm9wcmlhdGVQcmVmaXggQXBwcm9wcmlhdGVHaXZlbk5hbWUgIgotICAgICAgICAgICAgICAgICsgIkFwcHJvcHJpYXRlTWlkZGxlTmFtZSBBcHByb3ByaWF0ZUZhbWlseU5hbWUgQXBwcm9wcmlhdGVTdWZmaXgiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNHaXZlbiIpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVBIT05FVElDLU1JRERMRS1OQU1FIiwgIkFwcHJvcHJpYXRlUGhvbmV0aWNNaWRkbGUiKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiQXBwcm9wcmlhdGVQaG9uZXRpY0ZhbWlseSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjIxKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjMwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3R1cmVkTmFtZUNvbXBsaWNhdGVkVjQwKCkgewotICAgICAgICB0ZXN0U3RydWN0dXJlZE5hbWVDb21wbGljYXRlZENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVY0MCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFY0MCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOSUNLTkFNRSIsICJOaWNreSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVCYXNpY0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVCYXNpY1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob25lQmFzaWNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVSZWZyYWluRm9ybWF0dGluZygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSB8IFZDYXJkQ29uZmlnLkZMQUdfUkVGUkFJTl9QSE9ORV9OVU1CRVJfRk9STUFUVElORyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSE9NRSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEyMzQ1Njc4OTAoYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXopIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgdkNhcmQgY29tcG9zZXIgZW1pdHMgY29ycmVzcG9uZGluZyB0eXBlIHBhcmFtIHdoaWNoIHdlIGV4cGVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjMwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjcwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfT1RIRVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiODAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DQVIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DT01QQU5ZX01BSU4pOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9NQUlOKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEyMCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX09USEVSX0ZBWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMzAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9URUxFWCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX01PQklMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNTAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLX1BBR0VSKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE2MCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01NUyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTAiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIyMCIsIG5ldyBUeXBlU2V0KCJXT1JLIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMwIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjUwIiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNjAiLCBuZXcgVHlwZVNldCgiUEFHRVIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzAiLCBuZXcgVHlwZVNldCgiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiODAiLCBuZXcgVHlwZVNldCgiQ0FSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjkwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMDAiLCBuZXcgVHlwZVNldCgiSVNETiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMTAiLCBuZXcgVHlwZVNldCgiUFJFRiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxMjAiLCBuZXcgVHlwZVNldCgiRkFYIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEzMCIsIG5ldyBUeXBlU2V0KCJUTFgiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTQwIiwgbmV3IFR5cGVTZXQoIldPUksiLCAiQ0VMTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNTAiLCBuZXcgVHlwZVNldCgiV09SSyIsICJQQUdFUiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIxNjAiLCBuZXcgVHlwZVNldCgiTVNHIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0KFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnQoVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVWYXJpb3VzVHlwZVN1cHBvcnRWNDAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVZhcmlvdXNUeXBlU3VwcG9ydChWNDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoYXQgIlBSRUYicyBhcmUgZW1pdHRlZCBhcHByb3ByaWF0ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9GQVhfV09SSyk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIkZBWCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiRkFYIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlBSRUYiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZVByZWZIYW5kbGluZ1YyMSgpIHsKLSAgICAgICAgdGVzdFBob25lUHJlZkhhbmRsaW5nQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25lUHJlZkhhbmRsaW5nVjMwKCkgewotICAgICAgICB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVQcmVmSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RQaG9uZVByZWZIYW5kbGluZ0NvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0TWlzY1Bob25lVHlwZUhhbmRsaW5nKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJNb2RlbSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMiIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTVNHIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJCQlMiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZJREVPIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI1IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjYiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIl9BVVRPX0NFTEwiKTsgIC8vIFRoZSBvbGQgaW5kaWNhdG9yIGZvciB0aGUgdHlwZSBtb2JpbGUuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICI3IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJcdTY0M0FcdTVFMkYiKTsgIC8vIE1vYmlsZSBwaG9uZSBpbiBKYXBhbmVzZSBLYW5qaQotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiaW52YWxpZCIpOwotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjMwKHZjYXJkVHlwZSkgfHwgVkNhcmRDb25maWcuaXNWZXJzaW9uNDAodmNhcmRUeXBlKSkgewotICAgICAgICAgICAgLy8gdkNhcmQgMy4wIGFjY2VwdHMgImludmFsaWQiLiBBbHNvIHN0b3AgdXNpbmcgdG9VcHBlcigpCi0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiTW9kZW0iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjIiLCBuZXcgVHlwZVNldCgiTVNHIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIzIiwgbmV3IFR5cGVTZXQoIkJCUyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNCIsIG5ldyBUeXBlU2V0KCJWSURFTyIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNSIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNiIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI3IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjgiLCBuZXcgVHlwZVNldCgiaW52YWxpZCIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMSIsIG5ldyBUeXBlU2V0KCJNT0RFTSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMiIsIG5ldyBUeXBlU2V0KCJNU0ciKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjMiLCBuZXcgVHlwZVNldCgiQkJTIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI0IiwgbmV3IFR5cGVTZXQoIlZJREVPIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI1IiwgbmV3IFR5cGVTZXQoIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICI2IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjciLCBuZXcgVHlwZVNldCgiQ0VMTCIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiOCIsIG5ldyBUeXBlU2V0KCJYLWludmFsaWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmVUeXBlSGFuZGxpbmdWNDAoKSB7Ci0gICAgICAgIHRlc3RNaXNjUGhvbmVUeXBlSGFuZGxpbmcoVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEVtYWlsQmFzaWNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInNhbXBsZUBleGFtcGxlLmNvbSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAic2FtcGxlQGV4YW1wbGUuY29tIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWMzAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbEJhc2ljQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfd29ya0BleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX1dPUkspOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgInR5cGVfbW9iaWxlQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX290aGVyQGV4YW1wbGUuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfT1RIRVIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgInR5cGVfaG9tZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV93b3JrQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIldPUksiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX21vYmlsZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9vdGhlckBleGFtcGxlLmNvbSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydFYyMSgpIHsKLSAgICAgICAgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsVmFyaW91c1R5cGVTdXBwb3J0VjMwKCkgewotICAgICAgICB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjMwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxWYXJpb3VzVHlwZVN1cHBvcnRWNDAoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0eXBlX2hvbWVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidHlwZV9ub3R5cGVAZXhhbXBsZS5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuSVNfUFJJTUFSWSwgMSk7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICJ0eXBlX25vdHlwZUBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJQUkVGIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAidHlwZV9ob21lQGV4YW1wbGUuY29tIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1haWxQcmVmSGFuZGxpbmdWMjEoKSB7Ci0gICAgICAgIHRlc3RFbWFpbFByZWZIYW5kbGluZ0NvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbWFpbFByZWZIYW5kbGluZ1YzMCgpIHsKLSAgICAgICAgdGVzdEVtYWlsUHJlZkhhbmRsaW5nQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtYWlsUHJlZkhhbmRsaW5nVjQwKCkgewotICAgICAgICB0ZXN0RW1haWxQcmVmSGFuZGxpbmdDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiUG9ib3giKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5ORUlHSEJPUkhPT0QsICJOZWlnaGJvcmhvb2QiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICJTdHJlZXQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIlJlZ2lvbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTAwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIkNvdW50cnkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywgIkZvcm1hdHRlZCBBZGRyZXNzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspOwotICAgICAgICAvLyBhZHItdmFsdWUgICAgPSAwKjYodGV4dC12YWx1ZSAiOyIpIHRleHQtdmFsdWUKLSAgICAgICAgLy8gICAgICAgICAgICAgIDsgUE8gQm94LCBFeHRlbmRlZCBBZGRyZXNzLCBTdHJlZXQsIExvY2FsaXR5LCBSZWdpb24sIFBvc3RhbCBDb2RlLAotICAgICAgICAvLyAgICAgICAgICAgICAgOyBDb3VudHJ5IE5hbWUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE5FSUdIQk9SSE9PRCBmaWVsZCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgQ0lUWSBmaWVsZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIlN0cmVldCIsICJDaXR5IE5laWdoYm9yaG9vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpb24iLCAiMTAwIiwgIkNvdW50cnkiKSwgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMjEoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DSVRZLCAiQ2l0eSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJDaXR5IiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjMwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uTmVpZ2hib3Job29kVjQwKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbk5laWdoYm9yaG9vZChWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLk5FSUdIQk9SSE9PRCwgIk5laWdoYm9yaG9vZCIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIiLCAiIiwgIiIsICJOZWlnaGJvcmhvb2QiLCAiIiwgIiIsICIiKSwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5VjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHkoVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc05vbkNpdHlWMzAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eShWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZGRyZXNzTm9uQ2l0eVY0MCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NOb25DaXR5KFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIiIpICAvLyBNdXN0IGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLCAiO0Zvcm1hdHRlZCBhZGRyZXNzIENBIDEyMy0zMzQgVW5pdGVkIFN0YXR1ZTs7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJGb3JtYXR0ZWQgYWRkcmVzcyBDQSAxMjMtMzM0IFVuaXRlZCBTdGF0dWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsT25seVdpdGhGb3JtYXR0ZWRBZGRyZXNzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc1YzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbE9ubHlXaXRoRm9ybWF0dGVkQWRkcmVzc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxPbmx5V2l0aEZvcm1hdHRlZEFkZHJlc3NDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGF0IHRoZSB2Q2FyZCBjb21wb3NlciBob25vcnMgZm9ybWF0dGVkIGRhdGEgd2hlbiBpdCBpcyBhdmFpbGFibGUKLSAgICAgKiBldmVuIHdoZW4gaXQgaXMgcGFydGlhbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJQb2JveCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNPVU5UUlksICJDb3VudHJ5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0dGVkIGFkZHJlc3MgQ0EgMTIzLTMzNCBVbml0ZWQgU3RhdHVlIik7ICAvLyBTaG91bGQgYmUgaWdub3JlZAotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICJQb2JveDs7Ozs7O0NvdW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiUG9ib3giLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDb3VudHJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkVjIxKCkgewotICAgICAgICB0ZXN0UG9zdGFsV2l0aEJvdGhTdHJ1Y3R1cmVkQW5kRm9ybWF0dGVkQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZFYzMCgpIHsKLSAgICAgICAgdGVzdFBvc3RhbFdpdGhCb3RoU3RydWN0dXJlZEFuZEZvcm1hdHRlZENvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRWNDAoKSB7Ci0gICAgICAgIHRlc3RQb3N0YWxXaXRoQm90aFN0cnVjdHVyZWRBbmRGb3JtYXR0ZWRDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueVgiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJEZXBhcnRtZW50WSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJUaXRsZVoiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkpPQl9ERVNDUklQVElPTiwgIkRlc2NyaXB0aW9uIFJhbWJkYSIpICAvLyBJZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLk9GRklDRV9MT0NBVElPTiwgIk1vdW50YWluIFZpZXciKSAgLy8gSWdub3JlZC4KLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5QSE9ORVRJQ19OQU1FLCAiUGhvbmV0aWNOYW1lISIpICAvLyBJZ25vcmVkCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uU1lNQk9MLCAiKF5vXikvfn4iKTsgIC8vIElnbm9yZSBoaW0gKGhlcikuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5DT01QQU5ZKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJEZXBhcnRtZW50WFgiKQotICAgICAgICAgICAgICAgIC5wdXROdWxsKE9yZ2FuaXphdGlvbi5USVRMRSk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJDb21wYW55WFlaIikKLSAgICAgICAgICAgICAgICAucHV0TnVsbChPcmdhbml6YXRpb24uREVQQVJUTUVOVCkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5USVRMRSwgIlRpdGxlWFlaWVgiKTsKLSAgICAgICAgLy8gQ3VycmVudGx5IHdlIGRvIG5vdCB1c2UgZ3JvdXAgYnV0IGRlcGVuZCBvbiB0aGUgb3JkZXIuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiT1JHIiwgIkNvbXBhbnlYO0RlcGFydG1lbnRZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkNvbXBhbnlYIiwgIkRlcGFydG1lbnRZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiVGl0bGVaIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiRGVwYXJ0bWVudFhYIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiQ29tcGFueVhZWiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiVGl0bGVYWVpZWCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmdhbml6YXRpb25WMjEoKSB7Ci0gICAgICAgIHRlc3RPcmdhbml6YXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnYW5pemF0aW9uVjMwKCkgewotICAgICAgICB0ZXN0T3JnYW5pemF0aW9uQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9yZ2FuaXphdGlvblY0MCgpIHsKLSAgICAgICAgdGVzdE9yZ2FuaXphdGlvbkNvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfTVNOKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm1zbiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX1lBSE9PKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgInlhaG9vIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfU0tZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAic2t5cGUiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9RUSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJxcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImdvb2dsZSB0YWxrIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoSW0uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChJbS5QUk9UT0NPTCwgSW0uUFJPVE9DT0xfSUNRKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImljcSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0pBQkJFUikKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJqYWJiZXIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9ORVRNRUVUSU5HKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgIm5ldG1lZXRpbmciKTsKLQotICAgICAgICAvLyBObyBkZXRlcm1pbmVkIHdheSB0byBleHByZXNzIHVua25vd24gdHlwZS4uLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtSkFCQkVSIiwgImphYmJlciIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1JQ1EiLCAiaWNxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUdPT0dMRS1UQUxLIiwgImdvb2dsZSB0YWxrIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVFRIiwgInFxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVNLWVBFLVVTRVJOQU1FIiwgInNreXBlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVlBSE9PIiwgInlhaG9vIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU1TTiIsICJtc24iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTkVUTUVFVElORyIsICJuZXRtZWV0aW5nIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFJTSIsICJhaW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpVjIxKCkgewotICAgICAgICB0ZXN0SW1WYXJpb3VzVHlwZVN1cHBvcnRDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1CYXNpY1YzMCgpIHsKLSAgICAgICAgdGVzdEltVmFyaW91c1R5cGVTdXBwb3J0Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltQmFzaWNWNDAoKSB7Ci0gICAgICAgIHRlc3RJbVZhcmlvdXNUeXBlU3VwcG9ydENvbW1vbihWNDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhJbS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLlBST1RPQ09MLCBJbS5QUk9UT0NPTF9BSU0pCi0gICAgICAgICAgICAgICAgLnB1dChJbS5EQVRBLCAiYWltMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0FJTSkKLSAgICAgICAgICAgICAgICAucHV0KEltLkRBVEEsICJhaW0yIikKLSAgICAgICAgICAgICAgICAucHV0KEltLlRZUEUsIEltLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KEltLklTX1BSSU1BUlksIDEpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BSU0iLCAiYWltMiIsIG5ldyBUeXBlU2V0KCJIT01FIiwgIlBSRUYiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltUHJlZkhhbmRsaW5nVjIxKCkgewotICAgICAgICB0ZXN0SW1QcmVmSGFuZGxpbmdDb21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1QcmVmSGFuZGxpbmdWMzAoKSB7Ci0gICAgICAgIHRlc3RJbVByZWZIYW5kbGluZ0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbVByZWZIYW5kbGluZ1Y0MCgpIHsKLSAgICAgICAgdGVzdEltUHJlZkhhbmRsaW5nQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXZWJzaXRlQ29tbW9uKGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVVJMLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0JMT0cpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImZ0cDovL2Z0cC5leGFtcGxlLmFuZHJvaWQuY29tL2luZGV4Lmh0bWwiKQotICAgICAgICAgICAgICAgIC5wdXQoV2Vic2l0ZS5UWVBFLCBXZWJzaXRlLlRZUEVfRlRQKTsKLQotICAgICAgICAvLyBXZSBkcm9wIFRZUEUgaW5mb3JtYXRpb24gc2luY2UgdkNhcmQgKGVzcGVjaWFsbHkgMy4wKSBkb2VzIG5vdCBhbGxvdyB1cyB0byBlbWl0IGl0LgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlVSTCIsICJmdHA6Ly9mdHAuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJVUkwiLCAiaHR0cDovL3dlYnNpdGUuZXhhbXBsZS5hbmRyb2lkLmNvbS9pbmRleC5odG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMjEoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWMzAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYnNpdGVWNDAoKSB7Ci0gICAgICAgIHRlc3RXZWJzaXRlQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwgSW50ZWdlciB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbmRyb2lkUHJvcFZhbHVlKG1pbWVUeXBlLCB2YWx1ZSwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QW5kcm9pZFByb3BWYWx1ZShmaW5hbCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgIEludGVnZXIgdHlwZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHJldHVybiAobWltZVR5cGUgKyAiOyIgKyB2YWx1ZSArICI7IgotICAgICAgICAgICAgICAgICsgKHR5cGUgIT0gbnVsbCA/IHR5cGUgOiAiIikgKyAiOyIKLSAgICAgICAgICAgICAgICArIChsYWJlbCAhPSBudWxsID8gbGFiZWwgOiAiIikgKyAiOzs7Ozs7Ozs7Ozs7Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RFdmVudENvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9BTk5JVkVSU0FSWSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlNUQVJUX0RBVEUsICIxOTgyLTA2LTE2Iik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDgtMTAtMjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfT1RIRVIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAxOC0wMy0xMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuVFlQRSwgRXZlbnQuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5MQUJFTCwgIlRoZSBsYXN0IGRheSIpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiV2hlbiB0aGUgVG93ZXIgb2YgSGFub2kgd2l0aCA2NCByaW5ncyBpcyBjb21wbGV0ZWQuIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5UWVBFLCBFdmVudC5UWVBFX0JJUlRIREFZKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjIwMDktMDUtMTkiKTsgIC8vIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkJEQVkiLCAiMjAwOC0xMC0yMiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmRyb2lkUHJvcFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgIjE5ODItMDYtMTYiLCBFdmVudC5UWVBFX0FOTklWRVJTQVJZKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUFORFJPSUQtQ1VTVE9NIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEFuZHJvaWRQcm9wVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFLCAiMjAxOC0wMy0xMiIsIEV2ZW50LlRZUEVfT1RIRVIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5kcm9pZFByb3BWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGVuIHRoZSBUb3dlciBvZiBIYW5vaSB3aXRoIDY0IHJpbmdzIGlzIGNvbXBsZXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5UWVBFX0NVU1RPTSwgIlRoZSBsYXN0IGRheSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRWMjEoKSB7Ci0gICAgICAgIHRlc3RFdmVudENvbW1vbihWMjEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFYzMCgpIHsKLSAgICAgICAgdGVzdEV2ZW50Q29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2ZW50VjQwKCkgewotICAgICAgICB0ZXN0RXZlbnRDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE5vdGVDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTEiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAibm90ZTIiKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5JU19QUklNQVJZLCAxKTsgIC8vIEp1c3QgaWdub3JlZC4KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIm5vdGUxIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIm5vdGUyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWMjEoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWMzAoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFYzMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVWNDAoKSB7Ci0gICAgICAgIHRlc3ROb3RlQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaG90b0NvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQiA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAodmNhcmRUeXBlKSB8fCBWQ2FyZENvbmZpZy5pc1ZlcnNpb240MCh2Y2FyZFR5cGUpKTsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlBob3RvVGVzdCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob3RvLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvdG8uUEhPVE8sIHNQaG90b0J5dGVBcnJheSk7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yUGhvdG8gPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzRm9yUGhvdG8ucHV0KCJFTkNPRElORyIsICh1c2VCID8gImIiIDogIkJBU0U2NCIpKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIlBob3RvVGVzdCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiTiIsICJQaG90b1Rlc3Q7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlBob3RvVGVzdCIsICIiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJQSE9UTyIsIG51bGwsIG51bGwsIHNQaG90b0J5dGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JQaG90bywgbmV3IFR5cGVTZXQoIkpQRUciKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob3RvVjIxKCkgewotICAgICAgICB0ZXN0UGhvdG9Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvdG9WMzAoKSB7Ci0gICAgICAgIHRlc3RQaG90b0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG90b1Y0MCgpIHsKLSAgICAgICAgdGVzdFBob3RvQ29tbW9uKFY0MCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWxhdGlvbkNvbW1vbihpbnQgdmNhcmRUeXBlKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoUmVsYXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChSZWxhdGlvbi5UWVBFLCBSZWxhdGlvbi5UWVBFX01PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFJlbGF0aW9uLk5BTUUsICJNcy4gTW90aGVyIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aW9uVjIxKCkgewotICAgICAgICB0ZXN0UmVsYXRpb25Db21tb24oVjIxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25WMzAoKSB7Ci0gICAgICAgIHRlc3RSZWxhdGlvbkNvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMzBIYW5kbGVFc2NhcGUoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMzApOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICI7IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiLCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgIC8vIFZlcmlmaWVzIHRoZSB2Q2FyZCBTdHJpbmcgY29ycmVjdGx5IGVzY2FwZXMgZWFjaCBjaGFyYWN0ZXIgd2hpY2ggbXVzdCBiZSBlc2NhcGVkLgotICAgICAgICBtVmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJOOlxcXFw7XFw7O1xcLDtcXG47IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIkZOOls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgIls8e1VuZXNjYXBlZDpBc2NpaXN9Pl0iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJcXCIsICI7IiwgIiwiLCAiXG4iLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZXJlJ3Mgbm8gIk5JQ0tOQU1FIiBwcm9wZXJ0eSBpbiB2Q2FyZCAyLjEsIHdoaWxlIHRoZXJlIGlzIGluIHZDYXJkIDMuMC4KLSAgICAgKiBXZSB1c2UgQW5kcm9pZC1zcGVjaWZpYyAiWC1BTkRST0lELUNVU1RPTSIgcHJvcGVydHkuCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmdW5jdGlvbmFsaXR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROaWNrTmFtZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYyMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUgKyAiO05pY2t5Ozs7Ozs7Ozs7Ozs7OzsiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKS5hZGRFeHBlY3RlZChOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE5pY2tuYW1lLk5BTUUsICJOaWNreSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2xlcmF0ZUJyb2tlblBob25lTnVtYmVyRW50cnlWMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWMjEpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTExLTIyMi0zMzMzIChNaWFtaSlcbjQ0NC01NTU1LTY2NiAoVG9reW8pOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjc3Ny04ODgtOTk5OSAoQ2hpY2Fnbyk7MTExLTIyMi0zMzMzIChNaWFtaSkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMTExLTIyMi0zMzMzIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNDQ0LTU1NS01NjY2IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiNzc3LTg4OC05OTk5IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpOyAgLy8gRW1wdHkgbmFtZS4gU2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTEiKSAgLy8gTm90IHByaW1hcnkuIFNob3VsZCBiZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuSVNfUFJJTUFSWSwgMSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiZmFtaWx5MiIpICAvLyBUaGlzIGVudHJ5IGlzIHdoYXQgd2Ugd2FudC4KLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgImRpc3BsYXkiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLklTX1BSSU1BUlksIDEpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgImZhbWlseTMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiZGlzcGxheSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJmYW1pbHk0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgImRpc3BsYXkiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBBcnJheXMuYXNMaXN0KCJmYW1pbHkyIiwgIiIsICIiLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkZOIiwgImRpc3BsYXkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzVjIxKCkgewotICAgICAgICB0ZXN0UGlja1VwTm9uRW1wdHlDb250ZW50VmFsdWVzQ29tbW9uKFYyMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc1YzMCgpIHsKLSAgICAgICAgdGVzdFBpY2tVcE5vbkVtcHR5Q29udGVudFZhbHVlc0NvbW1vbihWMzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNWNDAoKSB7Ci0gICAgICAgIHRlc3RQaWNrVXBOb25FbXB0eUNvbnRlbnRWYWx1ZXNDb21tb24oVjQwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlTXVsdGlCeXRlVHlwZVYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFYzMCk7Ci0gICAgICAgIGZpbmFsIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU5NkZCXHU4QTcxIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZExpbmVWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiTjoiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiRk46IikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoIlRFTDtUWVBFPVx1OTZGQlx1OEE3MToxIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIjEiLCBuZXcgVHlwZVNldCgiXHU5NkZCXHU4QTcxIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZEltcG9ydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllMjkxNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRJbXBvcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uVHlwZVNldDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVGVzdHNCYXNlOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc1ZlcmlmaWVyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWRQb3N0YWw7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5XZWJzaXRlOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotcHVibGljIGNsYXNzIFZDYXJkSW1wb3J0ZXJUZXN0cyBleHRlbmRzIFZDYXJkVGVzdHNCYXNlIHsKLSAgICAvLyBQdXNoIGRhdGEgaW50byBpbnQgYXJyYXkgYXQgZmlyc3Qgc2luY2UgdmFsdWVzIGxpa2UgMHg4MCBhcmUKLSAgICAvLyBpbnRlcnByZXRlZCBhcyBpbnQgYnkgdGhlIGNvbXBpbGVyIGFuZCBjYXN0aW5nIGFsbCBvZiB0aGVtIGlzCi0gICAgLy8gY3VtYmVyc29tZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNQaG90b0ludEFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlID0gewotICAgICAgICAweGZmLCAweGQ4LCAweGZmLCAweGUxLCAweDBhLCAweDBmLCAweDQ1LCAweDc4LCAweDY5LCAweDY2LCAweDAwLAotICAgICAgICAweDAwLCAweDRkLCAweDRkLCAweDAwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDBkLAotICAgICAgICAweDAxLCAweDBlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGFhLCAweDAxLCAweDBmLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGJhLCAweDAxLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGMyLCAweDAxLCAweDEyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGQwLCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDMxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweDAxLCAweDMyLCAweDAwLAotICAgICAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweGU2LCAweDAyLCAweDEzLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDgyLAotICAgICAgICAweDk4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweGZhLAotICAgICAgICAweDg3LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDg0LCAweGM0LCAweGE1LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDdjLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDFlLCAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDMxLAotICAgICAgICAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLCAweDAwLCAweDAwLAotICAgICAgICAweDQ0LCAweDZmLCAweDQzLCAweDZmLCAweDRkLCAweDZmLCAweDAwLCAweDAwLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQ0LCAweDM5LCAweDMwLAotICAgICAgICAweDM1LCAweDY5LCAweDIwLCAweDU2LCAweDY1LCAweDcyLCAweDMxLCAweDJlLCAweDMwLCAweDMwLCAweDAwLAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDIwLCAweDIwLAotICAgICAgICAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAotICAgICAgICAweDAwLCAweDUwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDQ5LCAweDRkLCAweDAwLCAweDMwLCAweDMzLAotICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweDE0LCAweDAwLAotICAgICAgICAweDE0LCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDM0LCAweDAxLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDEwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDExLCAweDA5LCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDBmLCAweDBiLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDA1LCAweDk3LCAweDAwLCAweDAwLCAweDI3LCAweDEwLAotICAgICAgICAweDAwLCAweDAwLCAweDA4LCAweGIwLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFjLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAyLCAweDVlLCAweDAwLCAweDAwLAotICAgICAgICAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDhiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGNiLCAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDFiLCAweGU1LAotICAgICAgICAweDAwLCAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDI4LCAweDgyLCAweDlhLCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDZhLCAweDgyLCAweDlkLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweDcyLCAweDg4LCAweDIyLCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkwLCAweDAwLAotICAgICAgICAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLCAweDMyLCAweDMyLCAweDMwLCAweDkwLAotICAgICAgICAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLCAweDdhLAotICAgICAgICAweDkwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAzLAotICAgICAgICAweDhlLCAweDkxLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDAyLAotICAgICAgICAweDAzLCAweDAwLCAweDkxLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAzLCAweGEyLCAweDkyLCAweDAxLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAzLCAweGFhLCAweDkyLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGIyLCAweDkyLCAweDA0LCAweDAwLCAweDBhLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGJhLCAweDkyLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGMyLCAweDkyLCAweDA3LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDkyLCAweDA4LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDA5LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLAotICAgICAgICAweDBhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGNhLAotICAgICAgICAweDkyLCAweDdjLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDkyLCAweDg2LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLAotICAgICAgICAweDAzLCAweGQyLCAweGEwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDMwLAotICAgICAgICAweDMxLCAweDMwLCAweDMwLCAweGEwLCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGEwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDYwLCAweDAwLCAweDAwLCAweGEwLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweGEwLCAweDA1LCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweGEyLCAweDBlLCAweDAwLCAweDA1LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGU4LCAweGEyLCAweDBmLCAweDAwLAotICAgICAgICAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGYwLCAweGEyLCAweDEwLAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweGEyLAotICAgICAgICAweDE3LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLAotICAgICAgICAweGEzLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGEzLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweGE0LCAweDAxLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA0LCAweDAwLCAweDA1LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAzLCAweGY4LCAweGE0LCAweDA1LCAweDAwLCAweDAzLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDFkLCAweDAwLCAweDAwLCAweGE0LCAweDA2LCAweDAwLCAweDAzLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA3LCAweDAwLAotICAgICAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDA4LAotICAgICAgICAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LAotICAgICAgICAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweGE0LCAweDBhLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweGE0LCAweDBjLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDUzLCAweDAwLAotICAgICAgICAweDAwLCAweDI3LCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LAotICAgICAgICAweDMyLCAweDMwLCAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLAotICAgICAgICAweDMxLCAweDMzLCAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDMzLCAweDMxLCAweDAwLCAweDMyLCAweDMwLAotICAgICAgICAweDMwLCAweDM4LCAweDNhLCAweDMxLCAweDMwLCAweDNhLCAweDMyLCAweDM5LCAweDIwLCAweDMxLCAweDMzLAotICAgICAgICAweDNhLCAweDM1LCAweDM1LCAweDNhLCAweDM0LCAweDM3LCAweDAwLCAweDAwLCAweDAwLCAweDI5LCAweDg4LAotICAgICAgICAweDAwLCAweDAwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweGIyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDY0LCAweDAwLCAweDAwLCAweDAxLCAweDVlLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDI1LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDBlLCAweDkyLCAweDAwLCAweDAwLCAweDAzLCAweGU4LAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMyLCAweDMwLCAweDMwLAotICAgICAgICAweDM4LCAweDMxLCAweDMwLCAweDMyLCAweDM5LCAweDMxLCAweDMzLCAweDM1LCAweDM1LCAweDMzLCAweDMxLAotICAgICAgICAweDAwLCAweDAwLCAweDIwLCAweDJhLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDJhLAotICAgICAgICAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA0LCAweDUyLCAweDM5LCAweDM4LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDMwLCAweDMxLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA2LAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDFhLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDA0LCAweDZjLCAweDAxLCAweDFiLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDAwLCAweDAwLCAweDA0LCAweDc0LCAweDAxLCAweDI4LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA0LCAweDdjLCAweDAyLCAweDAyLCAweDAwLCAweDA0LCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDA1LCAweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweGZmLCAweGQ4LCAweGZmLCAweGRiLCAweDAwLCAweDg0LAotICAgICAgICAweDAwLCAweDIwLCAweDE2LCAweDE4LCAweDFjLCAweDE4LCAweDE0LCAweDIwLCAweDFjLCAweDFhLCAweDFjLAotICAgICAgICAweDI0LCAweDIyLCAweDIwLCAweDI2LCAweDMwLCAweDUwLCAweDM0LCAweDMwLCAweDJjLCAweDJjLCAweDMwLAotICAgICAgICAweDYyLCAweDQ2LCAweDRhLCAweDNhLCAweDUwLCAweDc0LCAweDY2LCAweDdhLCAweDc4LCAweDcyLCAweDY2LAotICAgICAgICAweDcwLCAweDZlLCAweDgwLCAweDkwLCAweGI4LCAweDljLCAweDgwLCAweDg4LCAweGFlLCAweDhhLCAweDZlLAotICAgICAgICAweDcwLCAweGEwLCAweGRhLCAweGEyLCAweGFlLCAweGJlLCAweGM0LCAweGNlLCAweGQwLCAweGNlLCAweDdjLAotICAgICAgICAweDlhLCAweGUyLCAweGYyLCAweGUwLCAweGM4LCAweGYwLCAweGI4LCAweGNhLCAweGNlLCAweGM2LCAweDAxLAotICAgICAgICAweDIyLCAweDI0LCAweDI0LCAweDMwLCAweDJhLCAweDMwLCAweDVlLCAweDM0LCAweDM0LCAweDVlLCAweGM2LAotICAgICAgICAweDg0LCAweDcwLCAweDg0LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LAotICAgICAgICAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGM2LCAweGZmLCAweGMwLAotICAgICAgICAweDAwLCAweDExLCAweDA4LCAweDAwLCAweDc4LCAweDAwLCAweGEwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLAotICAgICAgICAweDAyLCAweDExLCAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLAotICAgICAgICAweDAwLCAweDAxLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAotICAgICAgICAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLAotICAgICAgICAweDAzLCAweDAyLCAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDdkLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLAotICAgICAgICAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLAotICAgICAgICAweDkxLCAweGExLCAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAotICAgICAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLAotICAgICAgICAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LAotICAgICAgICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAotICAgICAgICAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAotICAgICAgICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLAotICAgICAgICAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLAotICAgICAgICAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LAotICAgICAgICAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LAotICAgICAgICAweDA0LCAweDAzLCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LAotICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLAotICAgICAgICAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LAotICAgICAgICAweDQyLCAweDkxLCAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LAotICAgICAgICAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LAotICAgICAgICAweDE4LCAweDE5LCAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LAotICAgICAgICAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLAotICAgICAgICAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LAotICAgICAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLAotICAgICAgICAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLAotICAgICAgICAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LAotICAgICAgICAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAotICAgICAgICAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LAotICAgICAgICAweGRhLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLAotICAgICAgICAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLAotICAgICAgICAweDBjLCAweDAzLCAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLAotICAgICAgICAweDE0LCAweDU0LCAweGFhLCAweDJhLCAweDQ2LCAweDQ4LCAweGEyLCAweGE0LCAweDU1LCAweGE2LCAweDA0LAotICAgICAgICAweDhhLCAweDI5LCAweGUwLCAweDUzLCAweDEwLCAweGUwLCAweDI5LCAweGMwLCAweDUwLCAweDAzLCAweGIxLAotICAgICAgICAweDQ2LCAweDI5LCAweDgwLCAweDg0LCAweDUyLCAweDExLCAweDQwLCAweDBkLCAweDIyLCAweDlhLCAweDQ1LAotICAgICAgICAweDIwLCAweDIzLCAweDYxLCAweDUxLCAweDMwLCAweGEwLCAweDA4LCAweGM4LCAweGE4LCAweGQ4LCAweDUyLAotICAgICAgICAweDAyLCAweDI2LCAweDE1LCAweDBiLCAweDBhLCAweDAwLCAweGI0LCAweGEyLCAweGE1LCAweDVhLCAweDAwLAotICAgICAgICAweDkxLCAweDQ1LCAweDRhLCAweGEyLCAweDgxLCAweDkyLCAweDAxLCAweDRlLCAweDAyLCAweDk4LCAweDg3LAotICAgICAgICAweDBhLCAweDcwLCAweGEwLCAweDA3LCAweDYyLCAweDhjLCAweDUwLCAweDIxLCAweDBkLCAweDI1LCAweDAwLAotICAgICAgICAweDM0LCAweDhhLCAweDYxLCAweDE0LCAweDBjLCAweDYzLCAweDBhLCAweDg5LCAweDg1LCAweDAwLCAweDQ2LAotICAgICAgICAweGQ1LCAweDFiLCAweDUyLCAweDAyLCAweDE2LCAweGE4LCAweDk4LCAweDUwLCAweDA1LCAweDk0LCAweGE5LAotICAgICAgICAweDE2LCAweDgwLCAweDI1LCAweDVhLCAweDk1LCAweDY4LCAweDE4LCAweGYxLCAweDRmLCAweDE0LCAweGM0LAotICAgICAgICAweDNiLCAweGI1LCAweDIyLCAweGI2LCAweDM4LCAweDM0LCAweDAwLCAweGUzLCAweDIyLCAweDhlLCAweGY0LAotICAgICAgICAweDc5LCAweDhhLCAweDdiLCAweGQxLCAweDcxLCAweDAzLCAweDMwLCAweGM3LCAweDE0LCAweDgzLCAweGE1LAotICAgICAgICAweDAwLCAweDA2LCAweDk4LCAweDY4LCAweDAxLCAweDhkLCAweDUxLCAweDM1LCAweDAzLCAweDIyLCAweDZhLAotICAgICAgICAweDhkLCAweGE5LCAweDAxLCAweDEzLCAweDU0LCAweDRkLCAweDQwLCAweDEzLCAweGE1LCAweDRhLCAweDI4LAotICAgICAgICAweDAyLCAweDQ1LCAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDc4LCAweDM0LCAweGYwLCAweDY5LCAweDgwLAotICAgICAgICAweDM0LCAweDgxLCAweDQ1LCAweDQwLCAweGNlLCAweDU4LCAweGU2LCAweGEyLCAweDRjLCAweDA2LCAweGU0LAotICAgICAgICAweGZhLCAweGQxLCAweDkzLCAweDUwLCAweDIxLCAweGNhLCAweGU0LCAweDU1LCAweDg0LCAweDkwLCAweDMwLAotICAgICAgICAweGFiLCAweDhiLCAweDE4LCAweGE2LCAweDlhLCAweDZhLCAweGM0LCAweDMxLCAweGFhLCAweDI2LCAweGEwLAotICAgICAgICAweDY0LCAweDRkLCAweDUxLCAweGI1LCAweDIwLCAweDIzLCAweDZhLCAweDg5LCAweGE4LCAweDAyLCAweDQ0LAotICAgICAgICAweDM1LCAweDJhLCAweDlhLCAweDAwLCAweDk1LCAweDRkLCAweDQ4LCAweGE2LCAweDgwLCAweDI0LCAweDUzLAotICAgICAgICAweDRlLCAweGNlLCAweDA1LCAweDMwLCAweDJiLCAweDNiLCAweGVlLCAweDZhLCAweDkxLCAweDVkLCAweDc2LAotICAgICAgICAweDYzLCAweGJkLCAweDY1LCAweDdkLCAweDQwLCAweDY2LCAweDY4LCAweGE5LCAweDAyLCAweDQ1LCAweDJiLAotICAgICAgICAweGIzLCAweDllLCAweGI0LCAweGM1LCAweDZkLCAweGFkLCAweDlhLCAweGEwLCAweDJjLCAweDA2LCAweGM4LAotICAgICAgICAweGNkLCAweDA0LCAweGQ2LCAweGEyLCAweDIzLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDY0LCAweDRkLAotICAgICAgICAweDUxLCAweDkzLCAweDQ4LCAweDA4LCAweGRhLCAweGEyLCAweDZhLCAweDAwLCAweDcyLCAweDFhLCAweDk5LAotICAgICAgICAweDRkLCAweDAwLCAweDQ4LCAweGE2LCAweGE0LCAweDUzLCAweDRjLCAweDA3LCAweDg2LCAweDAzLCAweGJkLAotICAgICAgICAweDJiLCAweDljLCAweGE3LCAweDE0LCAweDk4LCAweDEwLCAweDg1LCAweDM0LCAweGUwLCAweGE2LCAweGIzLAotICAgICAgICAweGIwLCAweDBiLCAweGI1LCAweGE4LCAweDBhLCAweGQ0LCAweDU4LCAweDQyLCAweGVkLCAweDNlLCAweDk0LAotICAgICAgICAweGQyLCAweGE2LCAweDhiLCAweDAxLCAweDM0LCAweDQ0LCAweGVkLCAweGU2LCAweDljLCAweDRkLCAweDZhLAotICAgICAgICAweDgwLCAweDhkLCAweDhkLCAweDQ2LCAweGM2LCAweDgwLCAweDIzLCAweDYzLCAweDUxLCAweDlhLCAweDA2LAotICAgICAgICAweDQ2LCAweGQ1LCAweDEzLCAweDUyLCAweDAxLCAweDU0LCAweGQ0LCAweGFhLCAweDY4LCAweDAyLCAweDQwLAotICAgICAgICAweDZhLCAweDQwLCAweDc4LCAweGEwLCAweDA4LCAweDU5LCAweGNlLCAweGVlLCAweGI1LCAweDJhLCAweDM5LAotICAgICAgICAweGQ5LCAweDU5LCAweGE3LCAweGE4LCAweDAwLCAweDczLCAweGViLCAweDRlLCAweDBlLCAweDdkLCAweDY5LAotICAgICAgICAweDVjLCAweDA1LCAweGYzLCAweDBmLCAweGFkLCAweDFlLCAweDYxLCAweGY1LCAweGE3LCAweDcxLCAweDBiLAotICAgICAgICAweGU2LCAweDM1LCAweDIxLCAweDkwLCAweGQzLCAweGI4LCAweDBlLCAweDMyLCAweDEwLCAweDk1LCAweDEwLAotICAgICAgICAweDkxLCAweGIzLCAweGQ2LCAweDliLCAweDYwLCAweDRiLCAweDljLCAweDhhLCAweDYzLCAweDFhLCAweGIwLAotICAgICAgICAweDE4LCAweDRkLCAweDQ2LCAweGM2LCAweDgwLCAweDIyLCAweDZhLCAweDYxLCAweGE0LCAweDMxLCAweGFhLAotICAgICAgICAweDZhLCAweDU1LCAweDM0LCAweDAxLCAweDJhLCAweDlhLCAweDdlLCAweDc4LCAweGEwLCAweDA4LCAweDA5LAotICAgICAgICAweGY5LCAweGFhLCAweDU4LCAweGNmLCAweGNhLCAweDZiLCAweDNlLCAweGEwLCAweDAwLCAweGQzLCAweDgxLAotICAgICAgICAweGE5LCAweDAxLCAweDczLCAweDQ2LCAweDY5LCAweDgwLCAweGI5LCAweGE0LCAweGNkLCAweDAwLCAweDJiLAotICAgICAgICAweDFmLCAweDkyLCAweGEzLCAweDA3LCAweDlhLCAweDZmLCAweDcwLCAweDI2LCAweGNmLCAweDE0LCAweGQyLAotICAgICAgICAweDZiLCAweDUxLCAweDBjLCAweDYzLCAweDUxLCAweGIxLCAweGEwLCAweDA4LCAweGRhLCAweDk4LCAweDY5LAotICAgICAgICAweDBjLCAweDhkLCAweDRkLCAweDRhLCAweGE2LCAweDgwLCAweDI0LCAweDUzLCAweDUyLCAweDAzLCAweGM1LAotICAgICAgICAweDAyLCAweDIxLCAweDI3LCAweGU2LCAweGE5LCAweDIzLCAweDNmLCAweDI5LCAweGFjLCAweGZhLCAweDhjLAotICAgICAgICAweDAxLCAweGU2LCAweDljLCAweDBkLCAweDQ4LCAweDBhLCAweDBkLCAweDJlLCAweDY4LCAweDAxLCAweDczLAotICAgICAgICAweDQ5LCAweDlhLCAweDYwLCAweDJiLCAweDFmLCAweDkyLCAweDk4LCAweDNhLCAweGQzLCAweDdiLCAweDgxLAotICAgICAgICAweDM2LCAweDc4LCAweGE2LCAweDkzLCAweDVhLCAweDg4LCAweDhjLCAweDlhLCAweDYzLCAweDFhLCAweDAwLAotICAgICAgICAweDhjLCAweGQzLCAweDBkLCAweDIxLCAweDkxLCAweDI5LCAweGE5LCAweDE0LCAweGQwLCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDExLCAweDFiLCAweDFlLCAweDZhLCAweDQ4LCAweGNmLCAweGNhLCAweDZiLAotICAgICAgICAweDNlLCAweGEzLCAweDEwLCAweDFhLCAweDcwLCAweDM1LCAweDIwLCAweDM4LCAweDFhLCAweDVjLCAweGQyLAotICAgICAgICAweDAxLCAweDczLCAweDQ5LCAweDlhLCAweDYwLCAweDM5LCAweDhmLCAweGNhLCAweDI5LCAweDhiLCAweGY3LAotICAgICAgICAweGFhLCAweGJhLCAweDg4LCAweDk2LCAweDlhLCAweDZiLCAweDQwLCAweDE4LCAweGM2LCAweGEzLCAweDI2LAotICAgICAgICAweDgwLCAweDE4LCAweDY5LCAweGE2LCAweDkwLCAweGM4LCAweDE0LCAweGQ0LCAweDhhLCAweDY5LCAweDgwLAotICAgICAgICAweGYwLCAweDZhLCAweDQwLCAweDY4LCAweDEwLCAweGJiLCAweDQxLCAweGE3LCAweGUzLCAweDBiLCAweGM1LAotICAgICAgICAweDJiLCAweDAxLCAweDEwLCAweGE3LCAweDAzLCAweDU5LCAweDBjLCAweDc2LCAweDY5LCAweDczLCAweDQwLAotICAgICAgICAweDBiLCAweDlhLCAweDI4LCAweDExLCAweDI4LCAweDE5LCAweDVlLCAweDY5LCAweDAyLCAweDgxLCAweDVhLAotICAgICAgICAweGQ4LCAweDAwLCAweGQzLCAweDRkLCAweDUwLCAweDBjLCAweDZhLCAweDhjLCAweGQyLCAweDAxLCAweGE2LAotICAgICAgICAweDk4LCAweDY5LCAweDBjLCAweGFlLCAweGE2LCAweGE0LCAweDA2LCAweDgwLCAweDFlLCAweGE2LCAweDllLAotICAgICAgICAweDBkLCAweDMxLCAweDEyLCAweDAzLCAweDRmLCAweDA2LCAweDgwLCAweDEzLCAweDYwLCAweDM0LCAweGQzLAotICAgICAgICAweGMxLCAweGE4LCAweDkyLCAweDAxLCAweGYxLCAweDhkLCAweGRkLCAweDY5LCAweGNjLCAweGExLCAweDY5LAotICAgICAgICAweDViLCAweDRiLCAweDgwLCAweDgzLCAweDkzLCAweDUyLCAweDA0LCAweDE0LCAweGUyLCAweGFlLCAweDAzLAotICAgICAgICAweGE5LCAweDBkLCAweDY4LCAweDAzLCAweDRkLCAweDM0LCAweGQwLCAweDAzLCAweDBkLCAweDMwLCAweGQyLAotICAgICAgICAweDAxLCAweDg2LCAweDlhLCAweDY4LCAweDE5LCAweDU4LCAweDFhLCAweDc4LCAweGE0LCAweDA0LCAweDhhLAotICAgICAgICAweDY5LCAweGUwLCAweGQzLCAweDEwLCAweGUwLCAweDY5LCAweGUwLCAweGQwLCAweDAzLCAweGMxLCAweGE4LAotICAgICAgICAweGRiLCAweGFkLCAweDRjLCAweDgxLCAweDEyLCAweDQ1LCAweGQ2LCAweDlkLCAweDI1LCAweDFkLCAweDAwLAotICAgICAgICAweDZhLCAweGY1LCAweGE5LCAweGU4LCAweDgwLCAweDMxLCAweDI5LCAweDBkLCAweDU4LCAweDA4LCAweDY5LAotICAgICAgICAweDg2LCAweDgwLCAweDFhLCAweDY5LCAweDg2LCAweDkwLCAweDBjLCAweDM0LCAweGQzLCAweDQ4LCAweDY1LAotICAgICAgICAweDUxLCAweDRmLCAweDA2LCAweDk4LCAweDBmLCAweDE0LCAweGYwLCAweDY4LCAweDEwLCAweGYwLCAweDY5LAotICAgICAgICAweGUwLCAweGQwLCAweDAzLCAweDgxLCAweGE1LCAweDJiLCAweDlhLCAweDFhLCAweGI4LCAweDg3LCAweGE4LAotICAgICAgICAweGRiLCAweDRhLCAweDQ2LCAweDY4LCAweGI2LCAweDgwLCAweDJhLCAweGE4LCAweDE0LCAweGVhLCAweDEyLAotICAgICAgICAweGIwLCAweDA1LCAweDIxLCAweGE2LCAweDAyLCAweDFhLCAweDYxLCAweGEwLCAweDA2LCAweDlhLCAweDYxLAotICAgICAgICAweGE0LCAweDMxLCAweDg2LCAweDlhLCAweDY5LCAweDBjLCAweGE4LCAweDBkLCAweDNjLCAweDUzLCAweDAxLAotICAgICAgICAweGUyLCAweDllLCAweDI4LCAweDEwLCAweGYxLCAweDRlLCAweDA2LCAweDk4LCAweDBmLCAweDA2LCAweDllLAotICAgICAgICAweDBkLCAweDAyLCAweDFjLCAweDI5LCAweGMyLCAweDgwLCAweDE2LCAweDk2LCAweDgwLCAweDBhLCAweDRhLAotICAgICAgICAweDAwLCAweDQzLCAweDRkLCAweDM0LCAweDBjLCAweDYxLCAweGE2LCAweDFhLCAweDQwLCAweDM0LCAweGQzLAotICAgICAgICAweDRkLCAweDIxLCAweDgwLCAweGZmLCAweGQ5LCAweGZmLCAweGRiLCAweDAwLCAweDg0LCAweDAwLCAweDBhLAotICAgICAgICAweDA3LCAweDA3LCAweDA4LCAweDA3LCAweDA2LCAweDBhLCAweDA4LCAweDA4LCAweDA4LCAweDBiLCAweDBhLAotICAgICAgICAweDBhLCAweDBiLCAweDBlLCAweDE4LCAweDEwLCAweDBlLCAweDBkLCAweDBkLCAweDBlLCAweDFkLCAweDE1LAotICAgICAgICAweDE2LCAweDExLCAweDE4LCAweDIzLCAweDFmLCAweDI1LCAweDI0LCAweDIyLCAweDFmLCAweDIyLCAweDIxLAotICAgICAgICAweDI2LCAweDJiLCAweDM3LCAweDJmLCAweDI2LCAweDI5LCAweDM0LCAweDI5LCAweDIxLCAweDIyLCAweDMwLAotICAgICAgICAweDQxLCAweDMxLCAweDM0LCAweDM5LCAweDNiLCAweDNlLCAweDNlLCAweDNlLCAweDI1LCAweDJlLCAweDQ0LAotICAgICAgICAweDQ5LCAweDQzLCAweDNjLCAweDQ4LCAweDM3LCAweDNkLCAweDNlLCAweDNiLCAweDAxLCAweDBhLCAweDBiLAotICAgICAgICAweDBiLCAweDBlLCAweDBkLCAweDBlLCAweDFjLCAweDEwLCAweDEwLCAweDFjLCAweDNiLCAweDI4LCAweDIyLAotICAgICAgICAweDI4LCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLAotICAgICAgICAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNiLCAweGZmLCAweGMwLCAweDAwLCAweDExLAotICAgICAgICAweDA4LCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAzLCAweDAxLCAweDIxLCAweDAwLCAweDAyLCAweDExLAotICAgICAgICAweDAxLCAweDAzLCAweDExLCAweDAxLCAweGZmLCAweGM0LCAweDAxLCAweGEyLCAweDAwLCAweDAwLCAweDAxLAotICAgICAgICAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDEwLCAweDAwLCAweDAyLCAweDAxLCAweDAzLCAweDAzLCAweDAyLAotICAgICAgICAweDA0LCAweDAzLCAweDA1LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDdkLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAotICAgICAgICAweDEzLCAweDUxLCAweDYxLCAweDA3LCAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLAotICAgICAgICAweDA4LCAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLCAweDI0LCAweDMzLAotICAgICAgICAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LAotICAgICAgICAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LAotICAgICAgICAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LAotICAgICAgICAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LAotICAgICAgICAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLAotICAgICAgICAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLAotICAgICAgICAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweDAxLCAweDAwLCAweDAzLCAweDAxLAotICAgICAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAotICAgICAgICAweDA5LCAweDBhLCAweDBiLCAweDExLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDA0LCAweDAzLAotICAgICAgICAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDc3LCAweDAwLCAweDAxLAotICAgICAgICAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLAotICAgICAgICAweDA3LCAweDYxLCAweDcxLCAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAotICAgICAgICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLCAweDE1LCAweDYyLCAweDcyLAotICAgICAgICAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LCAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LAotICAgICAgICAweDFhLCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAotICAgICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDUzLCAweDU0LAotICAgICAgICAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgICAweDY4LCAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLAotICAgICAgICAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLAotICAgICAgICAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAotICAgICAgICAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LAotICAgICAgICAweGNhLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUyLAotICAgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLCAweGYzLCAweGY0LAotICAgICAgICAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZmLCAweGRhLCAweDAwLCAweDBjLCAweDAzLAotICAgICAgICAweDAxLCAweDAwLCAweDAyLCAweDExLCAweDAzLCAweDExLCAweDAwLCAweDNmLCAweDAwLCAweDllLCAweGQyLAotICAgICAgICAweDJlLCAweDA3LCAweDE1LCAweGFmLCAweDZkLCAweDA4LCAweGUyLCAweGIzLCAweDQ1LCAweDFhLCAweGY2LAotICAgICAgICAweGQwLCAweDAwLCAweDAxLCAweGM1LCAweDY4LCAweDQ1LCAweDE3LCAweDRhLCAweGI0LCAweDIyLCAweGU0LAotICAgICAgICAweDcwLCAweDhjLCAweDc0LCAweGE5LCAweDNjLCAweGExLCAweDhlLCAweDk1LCAweDQ4LCAweDk2LCAweDMxLAotICAgICAgICAweGUyLCAweDE4LCAweGU5LCAweDU1LCAweGE1LCAweDhjLCAweDdhLCAweDUwLCAweDA1LCAweDBiLCAweDg4LAotICAgICAgICAweDg2LCAweDBmLCAweDE1LCAweDhmLCAweDc1LCAweDFmLCAweDI2LCAweDkzLCAweDE5LCAweDkxLCAweDc3LAotICAgICAgICAweDE4LCAweGMxLCAweGFjLCAweDRiLCAweGM4LCAweGZhLCAweGQ2LCAweDYzLCAweDM3LCAweDZkLCAweDMxLAotICAgICAgICAweGI0LCAweDczLCAweDViLCAweDM2LCAweGEwLCAweDFjLCAweDUwLCAweDgwLCAweGQ3LCAweDgzLCAweGEwLAotICAgICAgICAweGFiLCAweGQxLCAweDYyLCAweGFkLCAweDA5LCAweDhmLCAweDE3LCAweDI5LCAweDAzLCAweGIyLCAweGNjLAotICAgICAgICAweGUwLCAweDc3LCAweDE0LCAweGEzLCAweDU2LCAweGIzLCAweDI3LCAweDFlLCAweDY3LCAweGU5LCAweDUyLAotICAgICAgICAweGVhLCAweGM2LCAweDNhLCAweDM2LCAweDQ4LCAweGVmLCAweDNkLCAweDI3LCAweDcwLCAweDIyLCAweDYwLAotICAgICAgICAweDQ3LCAweDUyLCAweDY5LCAweGIyLCAweGUyLCAweGFkLCAweDNiLCAweGVhLCAweDgwLCAweGEzLCAweDM4LAotICAgICAgICAweGUwLCAweGQ2LCAweDNkLCAweGQ4LCAweDFjLCAweGQwLCAweGNhLCAweDQ2LCAweDNkLCAweGQwLCAweDE4LAotICAgICAgICAweDM1LCAweDg5LCAweDc4LCAweGEzLCAweDlhLCAweGNkLCAweDhjLCAweGQyLCAweGIzLCAweDkzLCAweDJhLAotICAgICAgICAweDJiLCAweDY2LCAweGQ1LCAweGYxLCAweDhhLCAweDEwLCAweDFhLCAweGQ2LCAweGYyLCAweDAzLCAweDhhLAotICAgICAgICAweDllLCAweGU2LCAweGY0LCAweDVhLCAweGRiLCAweGVmLCAweGZlLCAweDIzLCAweGMwLCAweGE3LCAweDI3LAotICAgICAgICAweGNiLCAweDE2LCAweGM0LCAweGNjLCAweGRkLCAweGUyLCAweDc4LCAweDlhLCAweDY5LCAweDY2LCAweGNjLAotICAgICAgICAweDk5LCAweGUxLCAweDRkLCAweDQ3LCAweGJhLCAweGJjLCAweGQ5LCAweDZhLCAweGVlLCAweDI2LCAweDU5LAotICAgICAgICAweDU5LCAweDRkLCAweGFjLCAweDY5LCAweDM0LCAweDUyLCAweGU1LCAweDhmLCAweDU1LCAweGFkLCAweDU4LAotICAgICAgICAweGFlLCAweDg1LCAweGM0LCAweDIyLCAweDQxLCAweGRmLCAweGFkLCAweDc2LCAweDYxLCAweGU1LCAweDZmLAotICAgICAgICAweDc0LCAweDQ1LCAweDY5LCAweGRjLCAweDAwLCAweDc5LCAweGFjLCAweDhiLCAweGE2LCAweGM5LCAweDM1LAotICAgICAgICAweGQ0LCAweDM0LCAweDY0LCAweGRjLCAweDM3LCAweDA2LCAweGIxLCAweGFlLCAweDg4LCAweGMxLCAweGFjLAotICAgICAgICAweGQ4LCAweGM5LCAweDJjLCAweGE2LCAweGUwLCAweDczLCAweDViLCAweDM2LCAweGYzLCAweDc0LCAweGU2LAotICAgICAgICAweDg0LCAweDA1LCAweGUzLCAweGE5LCAweDQ3LCAweDZhLCAweDE0LCAweGI2LCAweDQ5LCAweDNkLCAweDg1LAotICAgICAgICAweDNhLCAweGVlLCAweGVlLCAweDJiLCAweGE4LCAweGUyLCAweDZmLCAweDMwLCAweDgxLCAweGU5LCAweDhhLAotICAgICAgICAweGNhLCAweGE0LCAweGUyLCAweGQzLCAweDhiLCAweDAxLCAweGIxLCAweGY5LCAweDA0LCAweDdmLCAweGFmLAotICAgICAgICAweDIzLCAweGYwLCAweGE5LCAweDU0LCAweDQxLCAweDljLCAweGZkLCAweGEzLCAweGY0LCAweGFlLCAweDY1LAotICAgICAgICAweDE4LCAweGY3LCAweDI1LCAweDhhLCAweGUyLCAweDAyLCAweDM4LCAweGI4LCAweGZkLCAweDJhLCAweDdiLAotICAgICAgICAweDViLCAweGE4LCAweDZkLCAweDZkLCAweDVkLCAweDlhLCAweDVkLCAweGNiLCAweGJiLCAweGQyLCAweGI2LAotICAgICAgICAweGE2LCAweGEzLCAweDE5LCAweDVlLCAweGUyLCAweDAzLCAweDdiLCAweDFkLCAweGMyLCAweDE3LCAweDhkLAotICAgICAgICAweGI4LCAweGFjLCAweGZiLCAweDg5LCAweDM5LCAweDM1LCAweGQ2LCAweDlhLCAweDZhLCAweGU4LCAweDY2LAotICAgICAgICAweDU1LCAweGNiLCAweGY1LCAweGFjLCAweDdiLCAweDk2LCAweGViLCAweDUwLCAweGM2LCAweDg4LCAweDZkLAotICAgICAgICAweDY2LCAweGU5LCAweGNkLCAweDZjLCAweGRiLCAweDRmLCAweGQzLCAweDlhLCAweDAwLCAweDJmLCAweGU2LAotICAgICAgICAweGY5LCAweGEzLCAweGU3LCAweGI1LCAweDRhLCAweDkzLCAweDdmLCAweGEyLCAweGM2LCAweDczLCAweGRjLAotICAgICAgICAweGQ3LCAweDE1LCAweDU1LCAweGVmLCAweDQ4LCAweDdkLCAweDA5LCAweDUyLCAweDZlLCAweDNhLCAweGQ0LAotICAgICAgICAweGFiLCAweDJmLCAweGJkLCAweDYxLCAweDE2LCAweDBjLCAweDczLCAweDQ5LCAweGM1LCAweDI0LCAweDkyLAotICAgICAgICAweDdmLCAweGEyLCAweDYzLCAweGZkLCAweGFhLCAweGQ2LCAweDJmLCAweDcxLCAweDBlLCAweGIxLCAweDkzLAotICAgICAgICAweGY3LCAweDJkLCAweGY1LCAweGE0LCAweDllLCAweDRlLCAweGI1LCAweGRkLCAweDRiLCAweGY4LCAweDY4LAotICAgICAgICAweDRjLCAweGNiLCAweGI5LCAweDkzLCAweGFkLCAweDY1LCAweGNlLCAweGQ5LCAweDI2LCAweGE5LCAweDhkLAotICAgICAgICAweDE5LCAweGY2LCAweGYyLCAweGY0LCAweGU2LCAweGI1LCAweGFkLCAweGU3LCAweGM2LCAweDM5LCAweGEwLAotICAgICAgICAweDE4LCAweGViLCAweGM5LCAweDc3LCAweDZjLCAweDM1LCAweDJhLCAweDRiLCAweGZlLCAweDhhLCAweDljLAotICAgICAgICAweGZmLCAweDAwLCAweDExLCAweGFlLCAweDNhLCAweDhiLCAweGRlLCAweDYxLCAweGQwLCAweDllLCAweDM5LAotICAgICAgICAweGI4LCAweGViLCAweDUzLCAweGFjLCAweGI5LCAweGFlLCAweDViLCAweDAwLCAweGYzLCAweDI3LCAweDE0LAotICAgICAgICAweDkyLCAweGM5LCAweGZlLCAweDhhLCAweDNmLCAweGRlLCAweDM1LCAweGFjLCAweDNhLCAweDg4LCAweDkyLAotICAgICAgICAweGNkLCAweGIxLCAweDZlLCAweDdkLCAweGNkLCAweDMyLCAweDY3LCAweGViLCAweGNkLCAweDdhLCAweDE0LAotICAgICAgICAweGZlLCAweDA0LCAweDI2LCAweDY2LCAweGNlLCAweGY5LCAweDI2LCAweGIzLCAweGU2LCAweDZlLCAweGI0LAotICAgICAgICAweGQ5LCAweDQ4LCAweGM4LCAweDgyLCAweDRlLCAweDA3LCAweDM1LCAweGE3LCAweDZmLCAweDJmLCAweDAyLAotICAgICAgICAweDlhLCAweDA2LCAweDVmLCAweDhjLCAweGE0LCAweDgzLCAweDBlLCAweDMyLCAweDJhLCAweDY5LCAweGUzLAotICAgICAgICAweGRkLCAweDEyLCAweDA4LCAweDk3LCAweDg1LCAweGVjLCAweDJhLCAweDJhLCAweDQyLCAweGYxLCAweDc2LAotICAgICAgICAweDI2LCAweGU0LCAweDZhLCAweDU5LCAweDBlLCAweDE4LCAweDEwLCAweDZhLCAweGQyLCAweDg5LCAweDAyLAotICAgICAgICAweDZlLCAweDJhLCAweDcxLCAweGViLCAweDVjLCAweDFjLCAweDhjLCAweGE2LCAweDQ4LCAweGJiLCAweGRjLAotICAgICAgICAweDYxLCAweDQxLCAweDM1LCAweDcyLCAweDI4LCAweDg3LCAweGQ5LCAweGY2LCAweDRhLCAweGI5LCAweGU3LAotICAgICAgICAweDM4LCAweGFlLCAweDhjLCAweDNkLCAweDM2LCAweGRkLCAweGRlLCAweGM0LCAweGIwLCAweDIxLCAweDUxLAotICAgICAgICAweDc2LCAweGE4LCAweGMwLCAweGFhLCAweDkzLCAweDMxLCAweGU2LCAweGJiLCAweDJkLCAweDY1LCAweDYxLAotICAgICAgICAweDE5LCAweGQzLCAweDFlLCAweGI1LCAweDQ2LCAweDVhLCAweDk2LCAweDVhLCAweDMwLCAweGEwLCAweDdlLAotICAgICAgICAweDA1LCAweDY5LCAweDViLCAweGM5LCAweGM2LCAweDI4LCAweDQwLCAweGNkLCAweDA4LCAweDY0LCAweDNjLAotICAgICAgICAweDczLCAweDU3LCAweGUxLCAweDk0LCAweGYxLCAweGNkLCAweDVhLCAweDIxLCAweDhjLCAweGI5LCAweDYzLAotICAgICAgICAweGU3LCAweDY3LCAweDFkLCAweGFiLCAweDQwLCAweGIxLCAweGZiLCAweDAwLCAweDFkLCAweGYwLCAweDJiLAotICAgICAgICAweDk5LCAweDJkLCAweDY2LCAweDNlLCAweDg4LCAweDc1LCAweDgxLCAweDNmLCAweDMxLCAweGY2LCAweGFiLAotICAgICAgICAweDY0LCAweGQ2LCAweGI0LCAweDE3LCAweGVlLCAweGQwLCAweDllLCAweGU0LCAweDMyLCAweDFhLCAweGE3LAotICAgICAgICAweDMxLCAweGFkLCAweDE4LCAweDE0LCAweDI2LCAweGVmLCAweDU0LCAweGE1LCAweGE4LCAweDY1LCAweGEzLAotICAgICAgICAweDljLCAweDgxLCAweGZhLCAweDU2LCAweDhjLCAweDJkLCAweGNlLCAweDY4LCAweDQwLCAweGNiLCAweGYxLAotICAgICAgICAweDM3LCAweGJkLCAweDVlLCAweDg1LCAweGVhLCAweGQxLCAweDBjLCAweGJiLCAweDE5LCAweDU2LCAweDIzLAotICAgICAgICAweDIwLCAweDFmLCAweGFkLCAweDVjLCAweDQyLCAweDA4LCAweDAzLCAweGI1LCAweDU1LCAweDkxLCAweDA0LAotICAgICAgICAweGM5LCAweDgwLCAweDM4LCAweDAwLCAweDBhLCAweDcxLCAweDM0LCAweDZjLCAweDMyLCAweDI3LCAweGU5LAotICAgICAgICAweDU1LCAweDI1LCAweDE1LCAweDJjLCAweDY4LCAweGEzLCAweDMwLCAweGViLCAweDU0LCAweGE1LCAweDE1LAotICAgICAgICAweDBjLCAweGQxLCAweDAwLCAweGZmLCAweGQ5fTsKLQotICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGJ5dGVbXSBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2U7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gc1Bob3RvSW50QXJyYXlGb3JDb21wbGljYXRlZENhc2UubGVuZ3RoOwotICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2VbaV0gPSAoYnl0ZSlzUGhvdG9JbnRBcnJheUZvckNvbXBsaWNhdGVkQ2FzZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhvdXRWZXJzaW9uKCkgIC8vIG5vICJWRVJTSU9OOjIuMSIgbGluZS4KLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIkFuZG87Um9pZDsiLCBBcnJheXMuYXNMaXN0KCJBbmRvIiwgIlJvaWQiLCAiIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0dlbmVyaWMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfc2ltcGxlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlJvaWQgQW5kbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFTaW1wbGVDYXNlMV9UeXBlX0phcGFuZXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIFIucmF3LnYyMV9zaW1wbGVfMSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiQW5kbyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJSb2lkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5hbWUtcmVsYXRlZCBzdHJpbmdzIG9ubHkgY29udGFpbnMgcHJpbnRhYmxlIEFzY2lpLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yZGVyIGlzIHJlbWFpbmVkIHRvIGJlIFVTJ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiUHJlZml4IEdpdmVuIE1pZGRsZSBGYW1pbHkgU3VmZml4IgotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJSb2lkIEFuZG8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxU2ltcGxlQ2FzZTIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX3NpbXBsZV8yKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiQW5kbyBSb2lkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMVNpbXBsZUNhc2UzKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfc2ltcGxlXzMpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZG8iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAiRk4iIGZpZWxkIHNob3VsZCBiZSBwcmVmZXJlZCBzaW5jZSBpdCBzaG91bGQgY29udGFpbiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIGludGVuZGVkIGJ5IHRoZSBhdXRob3Igb2YgdGhlIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkFuZG8gUm9pZCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzICc7JyBpcyBwcm9wZXJseSBoYW5kbGVkIGJ5IFZDYXJkUGFyc2VyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFCYWNrc2xhc2hDYXNlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICI7QTtCXFw7Q1xcOztEOzpFO1xcXFw7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJBO0JcXENcXDtEOkVcXFxcIik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGlnbm9yZXMgcmVkdW5kYW50IGZpZWxkcyBpbiAiTiIgcHJvcGVydHkgdmFsdWVzIGFuZAotICAgICAqIGluc2VydHMgbmFtZSByZWxhdGVkIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUJhY2tzbGFzaENhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9iYWNrc2xhc2gpOwotICAgICAgICBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkFNSUxZX05BTUUgaXMgZW1wdHkgYW5kIHJlbW92ZWQgaW4gdGhpcyB0ZXN0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJBO0JcXCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQ1xcOyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICI6RSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkE7QlxcQ1xcO0Q6RVxcXFwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JnQmVmb3JUaXRsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX29yZ19iZWZvcmVfdGl0bGUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiTm9ybWFsIEd1eSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiQ29tcGFueSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIk9yZ2FuaXphdGlvbiBEZXZpc2lvbiBSb29tIFNoZWV0IE5vLiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJFeGNlbGxlbnQgSmFuaXRvciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlQmVmb3JPcmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV90aXRsZV9iZWZvcmVfb3JnKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIk5pY2UgR3V5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoT3JnYW5pemF0aW9uLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkNPTVBBTlksICJNYXJ2ZXJvdXMiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLkRFUEFSVE1FTlQsICJQZXJmZWN0IEdyZWF0IEdvb2QgQmFkIFBvb3IiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiQ29vbCBUaXRsZSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB2Q2FyZCBpbXBvcnRlciBjb3JyZWN0bHkgaW50ZXJwcmV0ICJQUkVGIiBhdHRyaWJ1dGUgdG8gSVNfUFJJTUFSWS4KLSAgICAgKiBUaGUgZGF0YSBjb250YWluIHRocmVlIGNhc2VzOiBvbmUgIlBSRUYiLCBubyAiUFJFRiIgYW5kIG11bHRpcGxlICJQUkVGIiwgaW4gZWFjaCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFQcmVmVG9Jc1ByaW1hcnkoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9wcmVmX2hhbmRsaW5nKTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KERhdGEuTUlNRVRZUEUsIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiU21pdGgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjIiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIzIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfSVNETik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAidGVzdEBleGFtcGxlLmNvbSIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkRBVEEsICJ0ZXN0MkBleGFtaW5hdGlvbi5jb20iKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5JU19QUklNQVJZLCAxKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIkNvbXBhbnkiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRJVExFLCAiRW5naW5lZXIiKQotICAgICAgICAgICAgICAgIC5wdXQoT3JnYW5pemF0aW9uLlRZUEUsIE9yZ2FuaXphdGlvbi5UWVBFX1dPUkspOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiTXlzdGVyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJCbG9nZ2VyIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uQ09NUEFOWSwgIlBvZXRyeSIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJQb2V0IikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBhbGwgdGhlIHByb3BlcnRpZXMgaW4gYSBjb21wbGljYXRlZCB2Q2FyZCBhcmUgY29ycmVjdGx5IHBhcnNlZCBieSB0aGUgVkNhcmRQYXJzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUNvbXBsaWNhdGVkQ2FzZV9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJHdW1wO0ZvcnJlc3Q7SG9nZTtQb3M7VGFvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAiLCAiRm9ycmVzdCIsICJIb2dlIiwgIlBvcyIsICJUYW8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJGTiIsICJKb2UgRHVlIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLAotICAgICAgICAgICAgICAgICAgICAgICAgIkd1bXAgU2hyaW1wIENvLjtTYWxlcyBEZXB0LjtNYW5hZ2VyO0Zpc2gga2VlcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIkd1bXAgU2hyaW1wIENvLiIsICJTYWxlcyBEZXB0LjtNYW5hZ2VyIiwgIkZpc2gga2VlcGVyIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUk9MRSIsICJGaXNoIENha2UgS2VlcGVyISIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVElUTEUiLCAiU2hyaW1wIE1hbiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIoMTExKSA1NTUtMTIxMiIsIG5ldyBUeXBlU2V0KCJXT1JLIiwgIlZPSUNFIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIig0MDQpIDU1NS0xMjEyIiwgbmV3IFR5cGVTZXQoIkhPTUUiLCAiVk9JQ0UiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMxMTExMTExMSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMjIyMjIyMjIiLCBuZXcgVHlwZVNldCgiVklERU8iKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMzMzMzMzMzMyIsIG5ldyBUeXBlU2V0KCJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiOzsxMDAgV2F0ZXJzIEVkZ2U7QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICIxMDAgV2F0ZXJzIEVkZ2UiLCAiQmF5dG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQSIsICIzMDMxNCIsICJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJMQUJFTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAwIFdhdGVycyBFZGdlXHJcbkJheXRvd24sIExBIDMwMzE0XHJcblVuaXRlZCAgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JRUCwgbmV3IFR5cGVTZXQoIldPUksiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjs7NDIgUGxhbnRhdGlvbiBTdC47QmF5dG93bjtMQTszMDMxNDtVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiIiwgIiIsICI0MiBQbGFudGF0aW9uIFN0LiIsICJCYXl0b3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBIiwgIjMwMzE0IiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkxBQkVMIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LlxyXG5CYXl0b3duLCBMQSAzMDMxNFxyXG5Vbml0ZWQgIFN0YXRlcyBvZiBBbWVyaWNhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiSE9NRSIpLCBudWxsKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkVNQUlMIiwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIklOVEVSTkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRU1BSUwiLCAiY2VsbEBleGFtcGxlLmNvbSIsIG5ldyBUeXBlU2V0KCJDRUxMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTk9URSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBub3RlIGlzIHRoZSBleGFtcGxlIGZyb20gUkZDIDIwNDUuIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJOb3cncyB0aGUgdGltZSBmb3IgYWxsIGZvbGsgdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yUVAsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiUEhPVE8iLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc1Bob3RvQnl0ZUFycmF5Rm9yQ29tcGxpY2F0ZWRDYXNlLCBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJKUEVHIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1BVFRSSUJVVEUiLCAiU29tZSBTdHJpbmciKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkJEQVkiLCAiMTk4MDAxMDEiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkdFTyIsICIzNS42NTYzODU0LDEzOS42OTk0MjMzIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJVUkwiLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlJFViIsICIyMDA4MDQyNFQxOTUyNDNaIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIENvbnRhY3RTdHJ1Y3QgY29ycmVjdGx5IGluc2VydHMgdmFsdWVzIGluIGEgY29tcGxpY2F0ZWQgdkNhcmQKLSAgICAgKiBpbnRvIENvbnRlbnRSZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxQ29tcGxpY2F0ZWRDYXNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfY29tcGxpY2F0ZWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJHdW1wIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJGb3JyZXN0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiSG9nZSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJQb3MiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiVGFvIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkpvZSBEdWUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiR3VtcCBTaHJpbXAgQ28uIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiU2FsZXMgRGVwdC47TWFuYWdlciBGaXNoIGtlZXBlciIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVElUTEUsICJTaHJpbXAgTWFuIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLy8gUGhvbmUgbnVtYmVyIGlzIGV4cGVjdGVkIHRvIGJlIGZvcm1hdGVkIHdpdGggTkFNUCBmb3JtYXQgaW4gZGVmYXVsdC4KLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjExMS01NTUtMTIxMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNDA0LTU1NS0xMjEyIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX01PQklMRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMS0xMTEtMTExMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZJREVPIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMi0yMjItMjIyMiIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMy0zMzMtMzMzMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9XT1JLKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5DT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9TVENPREUsICIzMDMxNCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlJFR0lPTiwgIkxBIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ0lUWSwgIkJheXRvd24iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsICIxMDAgV2F0ZXJzIEVkZ2UiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgV2F0ZXJzIEVkZ2UgQmF5dG93biBMQSAzMDMxNCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMzAzMTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJMQSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJCYXl0b3duIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuU1RSRUVULCAiNDIgUGxhbnRhdGlvbiBTdC4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5GT1JNQVRURURfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICI0MiBQbGFudGF0aW9uIFN0LiBCYXl0b3duIExBIDMwMzE0IFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC8vICJUWVBFPUlOVEVSTkVUIiAtPiBUWVBFX0NVU1RPTSArIHRoZSBsYWJlbCAiSU5URVJORVQiCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5UWVBFLCBFbWFpbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLkxBQkVMLCAiSU5URVJORVQiKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuREFUQSwgImZvcnJlc3RndW1wQHdhbGxhZGFsbGEuY29tIikKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLklTX1BSSU1BUlksIDEpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuVFlQRSwgRW1haWwuVFlQRV9NT0JJTEUpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5EQVRBLCAiY2VsbEBleGFtcGxlLmNvbSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJUaGUgZm9sbG93aW5nIG5vdGUgaXMgdGhlIGV4YW1wbGUgZnJvbSBSRkMgMjA0NS4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vdydzIHRoZSB0aW1lIGZvciBhbGwgZm9sayB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG90by5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBObyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgaW1hZ2UgZm9ybWF0IGNhbiBiZSBpbnNlcnRlZC4KLSAgICAgICAgICAgICAgICAucHV0KFBob3RvLlBIT1RPLCBzUGhvdG9CeXRlQXJyYXlGb3JDb21wbGljYXRlZENhc2UpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEV2ZW50LkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoRXZlbnQuU1RBUlRfREFURSwgIjE5ODAwMTAxIikKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQklSVEhEQVkpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFdlYnNpdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChXZWJzaXRlLlVSTCwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKLSAgICAgICAgICAgICAgICAucHV0KFdlYnNpdGUuVFlQRSwgV2Vic2l0ZS5UWVBFX0hPTUVQQUdFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE11bHRpcGxlTGluZVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ludmFsaWRfbXVsdGlwbGVfbGluZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiT21lZ2EiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiT21lZ2EiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFbWFpbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEVtYWlsLlRZUEUsIEVtYWlsLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoRW1haWwuTEFCRUwsICJJTlRFUk5FVCIpCi0gICAgICAgICAgICAgICAgLnB1dChFbWFpbC5BRERSRVNTLCAiXCJPbWVnYVwiIDxvbWVnYUBleGFtcGxlLmNvbT4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjMwU2ltcGxlX1BhcnNpbmcoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9zaW1wbGUpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQW5kIFJvaWQiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiQW5kO1JvaWQ7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiQW5kIiwgIlJvaWQiLCAiIiwgIiIsICIiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLCAiT3BlbjtIYW5kc2V0OyBBbGxpYW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJPcGVuIiwgIkhhbmRzZXQiLCAiIEFsbGlhbmNlIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09SVC1TVFJJTkciLCAiYW5kcm9pZCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjAzMDAwMDAwMDAiLCBuZXcgVHlwZVNldCgiUFJFRiIsICJWT0lDRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1HTk8iLCAiMCIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1HTiIsICJncm91cDAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtUkVEVUNUSU9OIiwgIjAiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlJFViIsICIyMDA4MTAzMVQwNjU4NTRaIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYzMFNpbXBsZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3NpbXBsZSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkFuZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiUm9pZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJBbmQgUm9pZCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiYW5kcm9pZCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiT3BlbiIpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uREVQQVJUTUVOVCwgIkhhbmRzZXQgIEFsbGlhbmNlIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5UWVBFLCBPcmdhbml6YXRpb24uVFlQRV9XT1JLKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJWT0lDRSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIwMzAtMDAwLTAwMDAiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuSVNfUFJJTUFSWSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMV9QYXJzaW5nKCkgewotICAgICAgICAvLyBUaG91Z2ggSmFwYW5lc2UgY2FyZWVycyBhcHBlbmQgIjs7OzsiIGF0IHRoZSBlbmQgb2YgdGhlIHZhbHVlIG9mICJTT1VORCIsCi0gICAgICAgIC8vIHZDYXJkIDIuMS8zLjAgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICAgIC8vIERvIG5vdCBuZWVkIHRvIGhhbmRsZSBpdCBhcyBtdWx0aXBsZSB2YWx1ZXMuCi0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX2phcGFuZXNlXzEpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzk7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMDMwMDAwMDAwMCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiVk9JQ0UiLCAiUFJFRiIpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFYyMUphcGFuZXNlMUNvbW1vbihpbnQgcmVzSWQsIGludCB2Y2FyZFR5cGUsIGJvb2xlYW4gamFwYW5lc2UpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KHZjYXJkVHlwZSwgcmVzSWQpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5IikKLSAgICAgICAgICAgICAgICAvLyBXaGlsZSB2Q2FyZCBwYXJzZXIgZG9lcyBub3Qgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgLy8gQ29udGFjdFN0cnVjdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzNcdUZGOUJcdUZGNzJcdUZGODRcdUZGOUUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAvLyBQaG9uZSBudW1iZXIgZm9ybWF0dGluZyBpcyBkaWZmZXJlbnQuCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsIChqYXBhbmVzZSA/ICIwMy0wMDAwLTAwMDAiIDogIjAzMC0wMDAtMDAwMCIpKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIlZPSUNFIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLklTX1BSSU1BUlksIDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBjb20uYW5kcm9pZC52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9HRU5FUklDfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfR2VuZXJpY19VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdkNhcmQgd2l0aCBKYXBhbmVzZSBjYW4gYmUgcGFyc2VkIGNvcnJlY3RseSB3aXRoCi0gICAgICoge0BsaW5rIGNvbS5hbmRyb2lkLnZjYXJkLlZDYXJkQ29uZmlnI1ZDQVJEX1RZUEVfVjIxX0pBUEFORVNFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxSmFwYW5lc2UxX1R5cGVfSmFwYW5lc2VfU2ppcygpIHsKLSAgICAgICAgdGVzdFYyMUphcGFuZXNlMUNvbW1vbigKLSAgICAgICAgICAgICAgICBSLnJhdy52MjFfamFwYW5lc2VfMSwgVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHZDYXJkIHdpdGggSmFwYW5lc2UgY2FuIGJlIHBhcnNlZCBjb3JyZWN0bHkgd2l0aAotICAgICAqIHtAbGluayBjb20uYW5kcm9pZC52Y2FyZC5WQ2FyZENvbmZpZyNWQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRX0uCi0gICAgICogc2luY2UgdkNhcmQgMi4xIHNwZWNpZmllcyB0aGUgY2hhcnNldCBvZiBlYWNoIGxpbmUgaWYgaXQgY29udGFpbnMgbm9uLUFzY2lpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RWMjFKYXBhbmVzZTFfVHlwZV9KYXBhbmVzZV9VdGY4KCkgewotICAgICAgICB0ZXN0VjIxSmFwYW5lc2UxQ29tbW9uKAotICAgICAgICAgICAgICAgIFIucmF3LnYyMV9qYXBhbmVzZV8xLCBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9QYXJzaW5nKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsIFIucmF3LnYyMV9qYXBhbmVzZV8yKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0O1x1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczO1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMTs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIjtcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTRFMThcdTc1M0FcdTAwMzJcdTAwMzZcdTAwMkRcdTAwMzFcdTMwQkIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRUJcdTMwRUFcdTMwQTJcdTMwRjNcdTMwQkZcdTMwRUZcdTMwRkNcdTAwMzYiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTk2OEU7Ozs7MTUwLTg1MTI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTY3NzFcdTRFQUNcdTkwRkRcdTZFMEJcdThDMzdcdTUzM0FcdTY4NUMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NEUxOFx1NzUzQVx1MDAzMlx1MDAzNlx1MDAyRFx1MDAzMVx1MzBCQiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTAwMzZcdTk2OEUiLCAiIiwgIiIsICIiLCAiMTUwLTg1MTIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbmV3IFR5cGVTZXQoIkhPTUUiKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOT1RFIiwgIlx1MzBFMVx1MzBFMiIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFYyMUphcGFuZXNlMl9UeXBlX0dlbmVyaWNfVXRmOCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2phcGFuZXNlXzIpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU1Qjg5XHU4NUU0XHUwMDIwXHUzMEVEXHUzMEE0XHUzMEM5XHUwMDIwXHUwMDMxIikKLSAgICAgICAgICAgICAgICAvLyBDb250YWN0U3RydWN0IHNob3VsZCBjb3JyZWN0bHkgc3BsaXQgIlNPVU5EIiBwcm9wZXJ0eSBpbnRvIHNldmVyYWwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggVkNhcmRQYXJzZXIgc2lkZSBkb2VzIG5vdCBjYXJlIGl0LgotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdUZGNzFcdUZGOURcdUZGODRcdUZGOUVcdUZGNzMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPU1RDT0RFLCAiMTUwLTg1MTIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5TVFJFRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuRk9STUFUVEVEX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU2NzcxXHU0RUFDXHU5MEZEXHU2RTBCXHU4QzM3XHU1MzNBXHU2ODVDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHU0RTE4XHU3NTNBXHUwMDMyXHUwMDM2XHUwMDJEXHUwMDMxXHUzMEJCIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEVCXHUzMEVBXHUzMEEyXHUzMEYzXHUzMEJGXHUzMEVGXHUzMEZDIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUwMDM2XHU5NjhFIDE1MC04NTEyIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJcdTMwRTFcdTMwRTIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2VfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzMiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjkiLCBuZXcgVHlwZVNldCgiWC1ORUMtU0VDUkVUIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEwIiwgbmV3IFR5cGVTZXQoIlgtTkVDLUhPVEVMIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjExIiwgbmV3IFR5cGVTZXQoIlgtTkVDLVNDSE9PTCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxMiIsIG5ldyBUeXBlU2V0KCJGQVgiLCAiSE9NRSIpKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiLCAiIiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG51bGwsIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzNDs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVTZXQoIlgtSVJNQy1OIiksIG51bGwpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjEzIiwgbmV3IFR5cGVTZXQoIk1PREVNIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE0IiwgbmV3IFR5cGVTZXQoIlBBR0VSIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE1IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZBTUlMWSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxNiIsIG5ldyBUeXBlU2V0KCJYLU5FQy1HSVJMIikpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzU7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzNSIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJTT1VORCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Ozs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBtQ29udGVudFZhbHVlc0ZvclNKaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiWC1JUk1DLU4iKSwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMTciLCBuZXcgVHlwZVNldCgiWC1ORUMtQk9ZIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjE4IiwgbmV3IFR5cGVTZXQoIlgtTkVDLUZSSUVORCIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxOSIsIG5ldyBUeXBlU2V0KCJYLU5FQy1QSFMiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMjAiLCBuZXcgVHlwZVNldCgiWC1ORUMtUkVTVEFVUkFOVCIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VjIxTXVsdGlwbGVFbnRyeUNhc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgUi5yYXcudjIxX211bHRpcGxlX2VudHJ5KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDMzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1NUI4OVx1ODVFNFx1MzBFRFx1MzBBNFx1MzBDOVx1MDAzMyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY3MVx1RkY5RFx1RkY4NFx1RkY5RVx1RkY3M1x1RkY5Qlx1RkY3Mlx1RkY4NFx1RkY5RVx1MDAzMyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1TRUNSRVQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiOSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1IT1RFTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1TQ0hPT0wiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTEiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfRkFYX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxMiIpOwotCi0gICAgICAgIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM0IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM0Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTU9ERU0iKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTMiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfUEFHRVIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNCIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1GQU1JTFkiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtR0lSTCIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNiIpOwotCi0gICAgICAgIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTRcdTMwRURcdTMwQTRcdTMwQzlcdTAwMzUiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiXHU1Qjg5XHU4NUU0XHUzMEVEXHUzMEE0XHUzMEM5XHUwMDM1IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjcxXHVGRjlEXHVGRjg0XHVGRjlFXHVGRjczXHVGRjlCXHVGRjcyXHVGRjg0XHVGRjlFXHUwMDM1Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLUJPWSIpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5OVU1CRVIsICIxNyIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFBob25lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5MQUJFTCwgIk5FQy1GUklFTkQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMTgiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfQ1VTVE9NKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTEFCRUwsICJORUMtUEhTIikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjE5Iik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiTkVDLVJFU1RBVVJBTlQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiMjAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlQWdlbnRWMjFfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV93aW5tb182NSk7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlc0ZvclZhbHVlID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclZhbHVlLnB1dCgiVkFMVUUiLCAiREFURSIpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkV4YW1wbGUiLCAiIiwgIiIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiRXhhbXBsZSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQU5OSVZFUlNBUlkiLCAiMjAwOTEwMTAiLCBjb250ZW50VmFsdWVzRm9yVmFsdWUpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiQUdFTlQiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLU5PIiwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVBZ2VudFYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX3dpbm1vXzY1KTsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJFeGFtcGxlIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkV4YW1wbGUiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChFdmVudC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KEV2ZW50LlRZUEUsIEV2ZW50LlRZUEVfQU5OSVZFUlNBUlkpCi0gICAgICAgICAgICAgICAgLnB1dChFdmVudC5TVEFSVF9EQVRFLCAiMjAwOTEwMTAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9sZXJhdGVJbnZhbGlkQ29tbWVudExpa2VMaW5lVjIxKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjIxLCBSLnJhdy52MjFfaW52YWxpZF9jb21tZW50X2xpbmUpOwotICAgICAgICBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIkNvbmZlcmVuY2UgQ2FsbCIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJDb25mZXJlbmNlIENhbGwiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChOb3RlLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoTm90ZS5OT1RFLCAiVGhpcyBpcyBhbiAoc2hhcnAgLT4jPC0gc2hhcnApIGV4YW1wbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgbWVzc2FnZSBtdXN0IE5PVCBiZSBpZ25vcmVkLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdlclYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX3BhZ2VyKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCBBcnJheXMuYXNMaXN0KCJGIiwgIkciLCAiTSIsICIiLCAiIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVEVMIiwgIjYxMDEyMzEyMzRAcGFnZXJzYW1wbGUuY29tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJXT1JLIiwgIk1TRyIsICJQQUdFUiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFnZXJWMzAoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9wYWdlcik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX1BBR0VSKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuTlVNQkVSLCAiNjEwMTIzMTIzNEBwYWdlcnNhbXBsZS5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMF9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgQXJyYXlzLmFzTGlzdCgiRiIsICJHIiwgIk0iLCAiIiwgIiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlRFTCIsICIxIiwgbmV3IFR5cGVTZXQoIlx1OEQzOSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlCeXRlUHJvcFYzMCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYzMCwgUi5yYXcudjMwX211bHRpYnl0ZV9wYXJhbSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIkYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJNIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJHIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIkcgTSBGIik7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChQaG9uZS5UWVBFLCBQaG9uZS5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLkxBQkVMLCAiXHU4RDM5IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFTZXBhcmF0ZWRQYXJhbXNWMzBfUGFyc2UoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMzAsIFIucmF3LnYzMF9jb21tYV9zZXBhcmF0ZWQpOwotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsIEFycmF5cy5hc0xpc3QoIkYiLCAiRyIsICJNIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlU2V0KCJQUkVGIiwgIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJURUwiLCAiMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVNldCgiQ09NTUEsU0VQQVJBVEVEOklOU0lERS5EUVVPVEUiLCAiUFJFRiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydEFzVjQwX1BhcnNlKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckltcG9ydFRlc3QoVjQwLCBSLnJhdy52NDBfc29ydF9hcyk7Ci0KLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yU29ydEFzTiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNGb3JTb3J0QXNOLnB1dCgiU09SVC1BUyIsCi0gICAgICAgICAgICAgICAgIlx1MzA0Mlx1MzA5M1x1MzA2OVx1MzA0NjtcdTMwOERcdTMwNDRcdTMwNjkiKTsKLSAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzRm9yU29ydEFzT3JnID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc09yZy5wdXQoIlNPUlQtQVMiLAotICAgICAgICAgICAgICAgICJcdTMwNTBcdTMwRkNcdTMwNTBcdTMwOEI7XHUzMDUxXHUzMDkzXHUzMDU1XHUzMDRGXHUzMDc2XHUzMDgyXHUzMDkzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIlx1NUI4OVx1ODVFNFx1MDAyMFx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJcdTVCODlcdTg1RTQiLCAiXHUzMEVEXHUzMEE0XHUzMEM5IiwgIiIsICIiLCAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzRm9yU29ydEFzTikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJPUkciLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiXHUzMEIwXHUzMEZDXHUzMEIwXHUzMEVCIiwgIlx1NjkxQ1x1N0QyMlx1OTBFOFx1OTU4MCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlc0ZvclNvcnRBc09yZywgbmV3IFR5cGVTZXQoIldPUksiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvcnRBc1Y0MCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFY0MCwgUi5yYXcudjQwX3NvcnRfYXMpOwotICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTVCODlcdTg1RTQiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzBFRFx1MzBBNFx1MzBDOSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsICJcdTVCODlcdTg1RTRcdTAwMjBcdTMwRURcdTMwQTRcdTMwQzkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwNDJcdTMwOTNcdTMwNjlcdTMwNDYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwOERcdTMwNDRcdTMwNjkiKTsKLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZChPcmdhbml6YXRpb24uQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChPcmdhbml6YXRpb24uVFlQRSwgT3JnYW5pemF0aW9uLlRZUEVfV09SSykKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5DT01QQU5ZLCAiXHUzMEIwXHUzMEZDXHUzMEIwXHUzMEVCIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5ERVBBUlRNRU5ULCAiXHU2OTFDXHU3RDIyXHU5MEU4XHU5NTgwIikKLSAgICAgICAgICAgICAgICAucHV0KE9yZ2FuaXphdGlvbi5QSE9ORVRJQ19OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1MFx1MzBGQ1x1MzA1MFx1MzA4Qlx1MzA1MVx1MzA5M1x1MzA1NVx1MzA0Rlx1MzA3Nlx1MzA4Mlx1MzA5MyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJTVYyMV9QYXJzZSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JJbXBvcnRUZXN0KFYyMSwgUi5yYXcudjIxX2ltKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIlgtQU5EUk9JRC1DVVNUT00iLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgidm5kLmFuZHJvaWQuY3Vyc29yLml0ZW0vbmlja25hbWUiLCAiTmljayIsICIxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKSAgLy8gMTMKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJYLUdPT0dMRS1UQUxLIiwgImhoaEBnbWFpbC5jb20iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SU1WMjEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWMjEsIFIucmF3LnYyMV9pbSk7Ci0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgICAgIGVsZW0uYWRkRXhwZWN0ZWQoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiTmljayIpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5UWVBFLCAiMSIpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkKEltLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uUFJPVE9DT0wsIEltLlBST1RPQ09MX0dPT0dMRV9UQUxLKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uVFlQRSwgSW0uVFlQRV9IT01FKQotICAgICAgICAgICAgICAgIC5wdXQoSW0uREFUQSwgImhoaEBnbWFpbC5jb20iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkSmFwYW5pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5OTQxOS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRKYXBhbml6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGFjdEVudHJ5OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuQ29udGVudFZhbHVlc0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlscy5Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbS5UeXBlU2V0OwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHMuVkNhcmRUZXN0c0Jhc2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5OaWNrbmFtZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5vdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBWQ2FyZEphcGFuaXphdGlvblRlc3RzIGV4dGVuZHMgVkNhcmRUZXN0c0Jhc2UgewotICAgIHByaXZhdGUgdm9pZCB0ZXN0TmFtZVV0ZjhDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCAiXHUzMDc1XHUzMDhCXHUzMDY5IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkdJVkVOX05BTUUsICJcdTMwOTFcdTMwOEFcdTMwNEIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkRyLiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5TVUZGSVgsICJQaC5EIik7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEodmNhcmRUeXBlKSA/IG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4IDogbnVsbCk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcykKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOIiwgIlx1MzA3NVx1MzA4Qlx1MzA2OTtcdTMwOTFcdTMwOEFcdTMwNEI7QjtEci47UGguRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDc1XHUzMDhCXHUzMDY5IiwgIlx1MzA5MVx1MzA4QVx1MzA0QiIsICJCIiwgIkRyLiIsICJQaC5EIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lVXRmOFYyMSgpIHsKLSAgICAgICAgdGVzdE5hbWVVdGY4Q29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZVV0ZjhWMzAoKSB7Ci0gICAgICAgIHRlc3ROYW1lVXRmOENvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9KQVBBTkVTRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVTaGlmdEppcygpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjMwX0pBUEFORVNFLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlx1MzA3NVx1MzA4Qlx1MzA2OSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiXHUzMDkxXHUzMDhBXHUzMDRCIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLk1JRERMRV9OQU1FLCAiQiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJEci4iKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiUGguRCIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsICJEci4gXHUzMDc1XHUzMDhCXHUzMDY5IEIgXHUzMDkxXHUzMDhBXHUzMDRCIFBoLkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCAiXHUzMDc1XHUzMDhCXHUzMDY5O1x1MzA5MVx1MzA4QVx1MzA0QjtCO0RyLjtQaC5EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwNzVcdTMwOEJcdTMwNjkiLCAiXHUzMDkxXHUzMDhBXHUzMDRCIiwgIkIiLCAiRHIuIiwgIlBoLkQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb0NvTW8gcGhvbmVzIHJlcXVpcmUgYWxsIG5hbWUgZWxlbWVudHMgc2hvdWxkIGJlIGluICJmYW1pbHkgbmFtZSIgZmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5hbWVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRkFNSUxZX05BTUUsICJcdTMwNzVcdTMwOEJcdTMwNjkiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgIlx1MzA5MVx1MzA4QVx1MzA0QiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSURETEVfTkFNRSwgIkIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUFJFRklYLCAiRHIuIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlNVRkZJWCwgIlBoLkQiKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZnVsbE5hbWUgPSAiRHIuIFx1MzA3NVx1MzA4Qlx1MzA2OSBCIFx1MzA5MVx1MzA4QVx1MzA0QiBQaC5EIjsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIk4iLCBmdWxsTmFtZSArICI7Ozs7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZnVsbE5hbWUsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG1Db250ZW50VmFsdWVzRm9yU0ppcywgbnVsbCwgbnVsbCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJGTiIsIGZ1bGxOYW1lLCBtQ29udGVudFZhbHVlc0ZvclNKaXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiOzs7OyIsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkVNQUlMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiQURSIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1DTEFTUyIsICJQVUJMSUMiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtUkVEVUNUSU9OIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1OTyIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtRENNLUhNTi1NT0RFIiwgIiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lQ29tbW9uKGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0KSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUsIGNoYXJzZXQpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfRkFNSUxZX05BTUUsICJcdTMwODRcdTMwN0VcdTMwNjAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfTUlERExFX05BTUUsICJcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIpOwotCi0gICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICAoIlNISUZUX0pJUyIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSA/Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXMgOgotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzKSA6Ci0gICAgICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOiBudWxsKSk7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpOwotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1MQVNULU5BTUUiLCAiXHUzMDg0XHUzMDdFXHUzMDYwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1NSURETEUtTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWYWx1ZXMpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1QSE9ORVRJQy1GSVJTVC1OQU1FIiwgIlx1MzA1Rlx1MzA4RFx1MzA0NiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgaWYgKCFWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZSgiU09SVC1TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAiXHUzMDg0XHUzMDdFXHUzMDYwIFx1MzBERlx1MzBDOVx1MzBFQlx1MzBDRFx1MzBGQ1x1MzBFMCBcdTMwNUZcdTMwOERcdTMwNDYiLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VmFsdWVzKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZW50VmFsdWVzQnVpbGRlciBidWlsZGVyID0gbVZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA4NFx1MzA3RVx1MzA2MCBcdTMwREZcdTMwQzlcdTMwRUJcdTMwQ0RcdTMwRkNcdTMwRTAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDVGXHUzMDhEXHUzMDQ2Iik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxVXRmOCgpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBob25ldGljTmFtZUZvckphcGFuZXNlVjIxU2ppcygpIHsKLSAgICAgICAgdGVzdFBob25ldGljTmFtZUNvbW1vbihWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRSwgIlNoaWZ0X0pJUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFV0ZjgoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaG9uZXRpY05hbWVGb3JKYXBhbmVzZVYzMFNKaXMoKSB7Ci0gICAgICAgIHRlc3RQaG9uZXRpY05hbWVDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzEoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX01JRERMRV9OQU1FLCAiXHUzMERGXHUzMEM5XHUzMEVCXHUzMENEXHUzMEZDXHUzMEUwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjgwXHVGRjlCXHVGRjczOzs7OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19NSURETEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGOTBcdUZGODRcdUZGOUVcdUZGOTlcdUZGODhcdUZGNzBcdUZGOTEiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuUEhPTkVUSUNfR0lWRU5fTkFNRSwgIlx1RkY4MFx1RkY5Qlx1RkY3MyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5ESVNQTEFZX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY5MFx1RkY4NFx1RkY5RVx1RkY5OVx1RkY4OFx1RkY3MFx1RkY5MSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhvbmV0aWNOYW1lRm9yTW9iaWxlVjIxXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9KQVBBTkVTRV9NT0JJTEUsICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0ZBTUlMWV9OQU1FLCAiXHUzMDg0XHUzMDdFXHUzMDYwIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBIT05FVElDX0dJVkVOX05BTUUsICJcdTMwNUZcdTMwOERcdTMwNDYiKTsKLQotICAgICAgICBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiU09VTkQiLCAiXHVGRjk0XHVGRjhGXHVGRjgwXHVGRjlFIFx1RkY4MFx1RkY5Qlx1RkY3Mzs7OzsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclNKaXMsIG5ldyBUeXBlU2V0KCJYLUlSTUMtTiIpKTsKLSAgICAgICAgQ29udGVudFZhbHVlc0J1aWxkZXIgYnVpbGRlciA9IG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwotICAgICAgICBidWlsZGVyLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19GQU1JTFlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QSE9ORVRJQ19HSVZFTl9OQU1FLCAiXHVGRjgwXHVGRjlCXHVGRjczIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLkRJU1BMQVlfTkFNRSwgIlx1RkY5NFx1RkY4Rlx1RkY4MFx1RkY5RSBcdUZGODBcdUZGOUJcdUZGNzMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oaW50IHZjYXJkVHlwZSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KHZjYXJkVHlwZSwgY2hhcnNldCk7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzA1M1x1MzA5M1x1MzA2QVx1MzA2OFx1MzA1M1x1MzA4RFx1MzA5Mlx1ODk4QiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlx1MzA4Qlx1MzA2QVx1MzA5M1x1MzA2Nlx1NjY4N1x1NEVCQVx1MzA2N1x1MzA1OVx1MzA0Qlx1RkYxRiIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiXHUzMDRBXHUzMDgyXHUzMDYxXHUzMDRCXHUzMDQ4XHUzMDhBIik7Ci0KLSAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gKCJVVEYtOCIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSA/Ci0gICAgICAgICAgICAgICAgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKHZjYXJkVHlwZSkgPyBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA6Ci0gICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yU0ppcykgOgotICAgICAgICAgICAgICAgIChWQ2FyZENvbmZpZy5pc1ZlcnNpb24yMSh2Y2FyZFR5cGUpID8gbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjggOgotICAgICAgICAgICAgICAgICAgICBtQ29udGVudFZhbHVlc0ZvclV0ZjgpKTsKLQotICAgICAgICBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGVsZW0gPSBtVmVyaWZpZXIuYWRkUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbVdpdGhFbXB0eU5hbWUoKTsKLSAgICAgICAgLy8gTEFCRUwgbXVzdCBiZSBpZ25vcmVkIGluIHZDYXJkIDIuMS4gQXMgZm9yIHZDYXJkIDMuMCwgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMKLSAgICAgICAgLy8gc2FtZSBhcyB0aGF0IGluIHZDYXJkIDMuMCwgd2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIlx1NzlDMVx1NjZGOFx1N0JCMTA3IiwKLSAgICAgICAgICAgICAgICAiIiwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIsICJcdTlFN0ZcdTlBQThcdTVFMDIiLCAiXHUwMEQ3XHUwMEQ3XHU3NzBDIiwKLSAgICAgICAgICAgICAgICAiNDk0LTEzMTMiLCAiXHU2NUU1XHU2NzJDIiksCi0gICAgICAgICAgICAgICAgY29udGVudFZhbHVlcyk7Ci0gICAgICAgIG1WZXJpZmllci5hZGRDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKCkuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICJcdTc5QzFcdTY2RjhcdTdCQjEwNyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlNUUkVFVCwgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkNJVFksICJcdTlFN0ZcdTlBQThcdTVFMDIiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5SRUdJT04sICJcdTAwRDdcdTAwRDdcdTc3MEMiKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT1NUQ09ERSwgIjQ5NC0xMzEzIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuQ09VTlRSWSwgIlx1NjVFNVx1NjcyQyIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkZPUk1BVFRFRF9BRERSRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgIlx1NjVFNVx1NjcyQyA0OTQtMTMxMyBcdTAwRDdcdTAwRDdcdTc3MEMgXHU5RTdGXHU5QUE4XHU1RTAyICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTZEQlx1ODk4Qlx1NkNBMlx1Njc1MSAiICsgIlx1NzlDMVx1NjZGOFx1N0JCMTA3IikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGFsQWRkcmVzc3dpdGhKYXBhbmVzZVYyMSgpIHsKLSAgICAgICAgdGVzdFBvc3RhbEFkZHJlc3NXaXRoSmFwYW5lc2VDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfSkFQQU5FU0UsICJTaGlmdF9KSVMiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IG9ubHkgb25lIGFkZHJlc3MgZmllbGQgaXMgZW1pdHRlZCB0b3dhcmQgRG9Db01vIHBob25lcy4KLSAgICAgKiBQcmVmZXJlZCB0eXBlIG11c3QgKHNob3VsZD8pIGJlOiBIT01FID4gV09SSyA+IE9USEVSID4gQ1VTVE9NCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0hPTUUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMyIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICI0Iik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJIT01FIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzIoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCIyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiksIG5ldyBUeXBlU2V0KCJXT1JLIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0YWxBZHJyZXNzRm9yRG9Db01vXzMoKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9DVVNUT00pCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLkxBQkVMLCAiY3VzdG9tMSIpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlRZUEUsIFN0cnVjdHVyZWRQb3N0YWwuVFlQRV9PVEhFUikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIyIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX0NVU1RPTSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuTEFCRUwsICJjdXN0b20yIikKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0KLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsIEFycmF5cy5hc0xpc3QoIjIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhlIHZDYXJkIGV4cG9ydGVyIHRvbGVyYXRlcyBudWxsIFRZUEUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBvc3RhbEFkcnJlc3NGb3JEb0NvTW9fNCgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfRE9DT01PLCAiU2hpZnRfSklTIik7Ci0gICAgICAgIENvbnRhY3RFbnRyeSBlbnRyeSA9IG1WZXJpZmllci5hZGRJbnB1dEVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIxIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX09USEVSKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5QT0JPWCwgIjIiKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkUG9zdGFsLkNPTlRFTlRfSVRFTV9UWVBFKQotICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZFBvc3RhbC5UWVBFLCBTdHJ1Y3R1cmVkUG9zdGFsLlRZUEVfSE9NRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuUE9CT1gsICIzIik7Ci0gICAgICAgIGVudHJ5LmFkZENvbnRlbnRWYWx1ZXMoU3RydWN0dXJlZFBvc3RhbC5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWRQb3N0YWwuVFlQRSwgU3RydWN0dXJlZFBvc3RhbC5UWVBFX1dPUkspCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNCIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkUG9zdGFsLlBPQk9YLCAiNSIpOwotCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiMyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIpLCBuZXcgVHlwZVNldCgiSE9NRSIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QodmNhcmRUeXBlKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDMtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJURUwiLCAiMDkwLTEyMzQtMTIzNCIsIG5ldyBUeXBlU2V0KCJDRUxMIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyVjIxXzEoKSB7Ci0gICAgICAgIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyQ29tbW9uKFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0pBUEFORVNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmFwYW5lc2VQaG9uZU51bWJlclYzMCgpIHsKLSAgICAgICAgdGVzdEphcGFuZXNlUGhvbmVOdW1iZXJDb21tb24oVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfSkFQQU5FU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXBhbmVzZVBob25lTnVtYmVyRG9Db01vKCkgewotICAgICAgICBtVmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9ET0NPTU8sICJTaGlmdF9KSVMiKTsKLSAgICAgICAgQ29udGFjdEVudHJ5IGVudHJ5ID0gbVZlcmlmaWVyLmFkZElucHV0RW50cnkoKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjAzMTIzNDEyMzQiKQotICAgICAgICAgICAgICAgIC5wdXQoUGhvbmUuVFlQRSwgUGhvbmUuVFlQRV9IT01FKTsKLSAgICAgICAgZW50cnkuYWRkQ29udGVudFZhbHVlcyhQaG9uZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLk5VTUJFUiwgIjA5MDEyMzQxMjM0IikKLSAgICAgICAgICAgICAgICAucHV0KFBob25lLlRZUEUsIFBob25lLlRZUEVfTU9CSUxFKTsKLSAgICAgICAgbVZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJFTUFJTCIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtQ0xBU1MiLCAiUFVCTElDIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLVJFRFVDVElPTiIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlgtTk8iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLURDTS1ITU4tTU9ERSIsICIiKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIkFEUiIsICIiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwMy0xMjM0LTEyMzQiLCBuZXcgVHlwZVNldCgiSE9NRSIpKQotICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZE5vZGUoIlRFTCIsICIwOTAtMTIzNC0xMjM0IiwgbmV3IFR5cGVTZXQoIkNFTEwiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdGVEb0NvTW8oKSB7Ci0gICAgICAgIG1WZXJpZmllci5pbml0Rm9yRXhwb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX0RPQ09NTywgIlNoaWZ0X0pJUyIpOwotICAgICAgICBDb250YWN0RW50cnkgZW50cnkgPSBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMSIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMiIpOwotICAgICAgICBlbnRyeS5hZGRDb250ZW50VmFsdWVzKE5vdGUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOb3RlLk5PVEUsICJub3RlMyIpOwotCi0gICAgICAgIC8vIE1vcmUgdGhhbiBvbmUgbm90ZSBmaWVsZHMgbXVzdCBiZSBhZ2dyZWdhdGVkIGludG8gb25lIG5vdGUuCi0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiVEVMIiwgIiIsIG5ldyBUeXBlU2V0KCJIT01FIikpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiRU1BSUwiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLUNMQVNTIiwgIlBVQkxJQyIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1SRURVQ1RJT04iLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJYLU5PIiwgIiIpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1EQ00tSE1OLU1PREUiLCAiIikKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJBRFIiLCAiIiwgbmV3IFR5cGVTZXQoIkhPTUUiKSkKLSAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlKCJOT1RFIiwgIm5vdGUxXG5ub3RlMlxubm90ZTMiLCBtQ29udGVudFZhbHVlc0ZvclFQKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kcm9pZEN1c3RvbVYyMSgpIHsKLSAgICAgICAgbVZlcmlmaWVyLmluaXRGb3JFeHBvcnRUZXN0KFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjIxX0dFTkVSSUMpOwotICAgICAgICBtVmVyaWZpZXIuYWRkSW5wdXRFbnRyeSgpLmFkZENvbnRlbnRWYWx1ZXMoTmlja25hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgLnB1dChOaWNrbmFtZS5OQU1FLCAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIik7Ci0gICAgICAgIG1WZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtV2l0aEVtcHR5TmFtZSgpCi0gICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZSgiWC1BTkRST0lELUNVU1RPTSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE5pY2tuYW1lLkNPTlRFTlRfSVRFTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMDREXHUzMDgzXHUzMEZDXHUzMEE4XHUzMEMzXHUzMEMxXHUzMEZDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRUZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTQzOTMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkOwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RTdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVXNhZ2U6IGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLnZjYXJkLnRlc3RzLy5WQ2FyZFRlc3RSdW5uZXJUZXN0UnVubmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRVdGlsc1Rlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkVGVzdFV0aWxzVGVzdHMuY2xhc3MpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVkNhcmRJbXBvcnRlclRlc3RzLmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZDYXJkRXhwb3J0ZXJUZXN0cy5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWQ2FyZEphcGFuaXphdGlvblRlc3RzLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBWQ2FyZFRlc3RSdW5uZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC9WQ2FyZFRlc3RVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjVjZjcuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVGVzdFV0aWxzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzLlZDYXJkVmVyaWZpZXI7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5TdHJ1Y3R1cmVkTmFtZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGVzdHMgY29uZmlybWluZyB1dGlsaXRpZXMgZm9yIHZDYXJkIHRlc3RzIHdvcmsgZmluZS4KLSAqCi0gKiBOb3cgdGhhdCB0aGUgZm91bmRhdGlvbiBjbGFzc2VzIGZvciB2Q2FyZCB0ZXN0IGNhc2VzIGJlY2FtZSB0b28gY29tcGxpY2F0ZWQgdG8KLSAqIHJlbHkgb24gd2l0aG91dCB0ZXN0aW5nIGl0c2VsZi4KLSAqLwotcHVibGljIGNsYXNzIFZDYXJkVGVzdFV0aWxzVGVzdHMgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRQcm9wZXJ0eU5vZGVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIjtBO0JcXDtDXFw7O0Q7OkU7XFxcXDstLSIsICAvLyB3cm9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIiIsICJBO0JcXCIsICJDXFw7IiwgIkQiLCAiOkUiLCAiXFxcXCIsICIiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiQTtCXFxDXFw7RDpFXFxcXCIpOwotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYWlsdXJlRGV0ZWN0ZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRlc3QgY2FzZSB0aGF0IHNob3VsZCBmYWlsIGFjdHVhbGx5IHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRDb250ZW50VmFsdWVWZXJpZmljYXRpb24oKSB7Ci0gICAgICAgIGJvb2xlYW4gZmFpbHVyZURldGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBWQ2FyZFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZDYXJkVmVyaWZpZXIodGhpcyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5pbml0Rm9ySW1wb3J0VGVzdChWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YyMV9HRU5FUklDLCBSLnJhdy52MjFfYmFja3NsYXNoKTsKLSAgICAgICAgICAgIHZlcmlmaWVyLmFkZENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oKQotICAgICAgICAgICAgICAgICAgICAuYWRkRXhwZWN0ZWQoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiQTtCXFwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICJDXFw7IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KFN0cnVjdHVyZWROYW1lLlBSRUZJWCwgIkQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuU1VGRklYLCAiOkUiKTsKLSAgICAgICAgICAgIC8vIERJU1BMQVlfTkFNRSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRlY3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmYWlsdXJlRGV0ZWN0ZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRlc3QgY2FzZSB0aGF0IHNob3VsZCBmYWlsIGFjdHVhbGx5IHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGYWlsQXRMaW5lVmVyaWZpY2F0aW9uKCkgewotICAgICAgICBib29sZWFuIGZhaWx1cmVEZXRlY3RlZCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgVkNhcmRWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICAgICAgdmVyaWZpZXIuaW5pdEZvckV4cG9ydFRlc3QoVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMzBfR0VORVJJQyk7Ci0gICAgICAgICAgICB2ZXJpZmllci5hZGRJbnB1dEVudHJ5KCkuYWRkQ29udGVudFZhbHVlcyhTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5GQU1JTFlfTkFNRSwgIlxcIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5HSVZFTl9OQU1FLCAiOyIpCi0gICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuTUlERExFX05BTUUsICIsIikKLSAgICAgICAgICAgICAgICAgICAgLnB1dChTdHJ1Y3R1cmVkTmFtZS5QUkVGSVgsICJcbiIpCi0gICAgICAgICAgICAgICAgICAgIC5wdXQoU3RydWN0dXJlZE5hbWUuRElTUExBWV9OQU1FLCAiWzx7VW5lc2NhcGVkOkFzY2lpc30+XSIpOwotICAgICAgICAgICAgdmVyaWZpZXIuYWRkTGluZVZlcmlmaWVyRWxlbSgpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFeHBlY3RlZCgiVEVMOjEiKSAgLy8gd3JvbmcKLSAgICAgICAgICAgICAgICAgICAgLmFkZEV4cGVjdGVkKCJGTjpbPHtVbmVzY2FwZWQ6QXNjaWlzfT5dIik7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotICAgICAgICAgICAgZmFpbHVyZURldGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZhaWx1cmVEZXRlY3RlZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVGVzdCBjYXNlIHRoYXQgc2hvdWxkIGZhaWwgYWN0dWFsbHkgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvVkNhcmRVdGlsc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWZhYjIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL1ZDYXJkVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZDsKLQotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFZDYXJkVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKChTdHJpbmdbXSludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgoTGlzdDxTdHJpbmc+KW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKSk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDIwOyBpIDwgMHg3RjsgaSsrKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcilpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5UHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHJcbiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlQcmludGFibGVBc2NpaSgiXHUwMDE5IikpOwotICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seVByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgoU3RyaW5nW10pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKChMaXN0PFN0cmluZz4pbnVsbCkpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDB4MjA7IGkgPCAweDdGOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKWkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoYnVpbGRlci50b1N0cmluZygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwMTkiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcdTAwN0YiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJcciIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoIlxuIikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCkgewotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbigoU3RyaW5nKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKFN0cmluZ1tdKW51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oKExpc3Q8U3RyaW5nPiludWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKCIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVkNhcmRVdGlscy5jb250YWluc09ubHlOb25DckxmUHJpbnRhYmxlQXNjaWkoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpOwotICAgICAgICBhc3NlcnRUcnVlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5Tm9uQ3JMZlByaW50YWJsZUFzY2lpKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seU5vbkNyTGZQcmludGFibGVBc2NpaSgiMDEyMzQ1Njc4OS0iKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMHgzMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSAweDJEKSB7ICAvLyAtCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShWQ2FyZFV0aWxzLmNvbnRhaW5zT25seUFscGhhRGlnaXRIeXBoZW4oU3RyaW5nLnZhbHVlT2YoKGNoYXIpaSkpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMHgzQTsgaSA8IDB4NDE7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDB4NUI7IGkgPCAweDYxOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKFZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbihTdHJpbmcudmFsdWVPZigoY2hhcilpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAweDdCOyBpIDwgMHgxMDA7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoVkNhcmRVdGlscy5jb250YWluc09ubHlBbHBoYURpZ2l0SHlwaGVuKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdBdmFpbGFibGVBc1YzMFBhcmFtVmFsdWUoKSB7Ci0gICAgICAgIC8vIFNtb2tlIHRlc3RzLgotICAgICAgICBhc3NlcnRFcXVhbHMoIkhPTUUiLCBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJIT01FIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRFTCIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlRFTCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQUdFUiIsIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlBBR0VSIikpOwotCi0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShUZXh0VXRpbHMuaXNFbXB0eShWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKG51bGwpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoVGV4dFV0aWxzLmlzRW1wdHkoVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiIFx0IikpKTsKLQotICAgICAgICAvLyBub24tQXNjaWkgbXVzdCBiZSBhbGxvd2VkCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU0RThCXHU1MkQ5XHU2MjQwIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcdTRFOEJcdTUyRDlcdTYyNDAiKSk7Ci0gICAgICAgIC8vIFJlcG9ydGVkIGFzIGJ1ZyByZXBvcnQuCi0gICAgICAgIGFzc2VydEVxdWFscygiXHU4RDM5IiwgVkNhcmRVdGlscy50b1N0cmluZ0FzVjMwUGFyYW1WYWx1ZSgiXHU4RDM5IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY29tbWEsc2VwYXJhdGVkXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoImNvbW1hLHNlcGFyYXRlZCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImNvbG9uOmF3YXJlXCIiLAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoImNvbG9uOmF3YXJlIikpOwotICAgICAgICAvLyBDVEwgY2hhcmFjdGVycy4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDVExFeGFtcGxlIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJDVExcdTAwMDFFeGFtcGxlIikpOwotICAgICAgICBhc3NlcnRUcnVlKFRleHRVdGlscy5pc0VtcHR5KAotICAgICAgICAgICAgICAgIFZDYXJkVXRpbHMudG9TdHJpbmdBc1YzMFBhcmFtVmFsdWUoIlx1MDAwMVx1MDAwMlx1MDAwMyIpKSk7Ci0gICAgICAgIC8vIERRVU9URSBtdXN0IGJlIHJlbW92ZWQuCi0gICAgICAgIGFzc2VydEVxdWFscygicXVvdGVkIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcInF1b3RlZFwiIikpOwotICAgICAgICAvLyBEUVVPVEUgbXVzdCBiZSByZW1vdmVkIGJhc2ljYWxseSwgYnV0IHdlIHNob3VsZCBkZXRlY3QgYSBzcGFjZSwgd2hpY2gKLSAgICAgICAgLy8gcmVxdWlyZSB1cyB0byB1c2UgRFFVT1RFIGFnYWluLgotICAgICAgICAvLyBSaWdodC1zaWRlIGhhcyBvbmUgbW9yZSBpbGxlZ2FsIGRxdW90ZSB0byB0ZXN0IHF1b3RlLWhhbmRsZSBjb2RlIHRob3JvdWdobHkuCi0gICAgICAgIGFzc2VydEVxdWFscygiXCJBbHJlYWR5IHF1b3RlZFwiIiwKLSAgICAgICAgICAgICAgICBWQ2FyZFV0aWxzLnRvU3RyaW5nQXNWMzBQYXJhbVZhbHVlKCJcIkFscmVhZHkgcXVvdGVkXCJcIiIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250YWN0RW50cnkuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDM3NTBlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRhY3RFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHJlcHJlc2VudGluZyBvbmUgY29udGFjdCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gbXVsdGlwbGUgQ29udGVudFZhbHVlcyBsaWtlCi0gKiBTdHJ1Y3R1cmVkTmFtZSwgRW1haWwsIGV0Yy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRhY3RFbnRyeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbnRlbnRWYWx1ZXM+IG1Db250ZW50VmFsdWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlcz4oKTsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBhZGRDb250ZW50VmFsdWVzKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBjb250ZW50VmFsdWVzLnB1dChEYXRhLk1JTUVUWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzTGlzdC5hZGQoY29udGVudFZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGVudFZhbHVlc0J1aWxkZXIoY29udGVudFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q29udGVudFZhbHVlcz4gZ2V0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzTGlzdDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2NjZjkuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci0KLS8qKgotICogQ29udGVudFZhbHVlcy1saWtlIGNsYXNzIHdoaWNoIGVuYWJsZXMgdXNlcnMgdG8gY2hhaW4gcHV0KCkgbWV0aG9kcyBhbmQgcmVzdHJpY3RzCi0gKiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIoZmluYWwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzID0gY29udGVudFZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBCeXRlIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBTaG9ydCB2YWx1ZSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0qLwotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIExvbmcgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dChTdHJpbmcga2V5LCBEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgcHV0KFN0cmluZyBrZXksIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzQnVpbGRlciBwdXQoU3RyaW5nIGtleSwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNCdWlsZGVyIHB1dE51bGwoU3RyaW5nIGtleSkgewotICAgICAgICBtQ29udGVudFZhbHVlcy5wdXROdWxsKGtleSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjEzYzYuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvQ29udGVudFZhbHVlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50VmFsdWVzVmVyaWZpZXIgaW1wbGVtZW50cyBWQ2FyZEVudHJ5SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBMaXN0PENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0+IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8Q29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICBwcml2YXRlIGludCBtSW5kZXg7Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBhZGRFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSBlbGVtID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0oYW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LmFkZChlbGVtKTsKLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgZm9yIChDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtIGVsZW0gOiBtQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbUxpc3QpIHsKLSAgICAgICAgICAgIGVsZW0ub25QYXJzaW5nU3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW50cnlDcmVhdGVkKFZDYXJkRW50cnkgZW50cnkpIHsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbUNvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdC5nZXQobUluZGV4KS5vbkVudHJ5Q3JlYXRlZChlbnRyeSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRW5kKCkgewotICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gZWxlbSA6IG1Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtTGlzdCkgewotICAgICAgICAgICAgZWxlbS5vblBhcnNpbmdFbmQoKTsKLSAgICAgICAgICAgIGVsZW0udmVyaWZ5UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0NvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjMThlMS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Db250ZW50VmFsdWVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbW1pdHRlcjsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZEVudHJ5Q29uc3RydWN0b3I7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1UZXN0Q2FzZTsKLSAgICBwcml2YXRlIGZpbmFsIEltcG9ydFRlc3RSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWQ2FyZEVudHJ5SGFuZGxlciBtSGFuZGxlcjsKLQotICAgIHB1YmxpYyBDb250ZW50VmFsdWVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbVRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtUmVzb2x2ZXIgPSBuZXcgSW1wb3J0VGVzdFJlc29sdmVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IFZDYXJkRW50cnlDb21taXR0ZXIobVJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFZhbHVlc0J1aWxkZXIgYWRkRXhwZWN0ZWQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXMucHV0KERhdGEuTUlNRVRZUEUsIG1pbWVUeXBlKTsKLSAgICAgICAgbVJlc29sdmVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhjb250ZW50VmFsdWVzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50VmFsdWVzQnVpbGRlcihjb250ZW50VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElucHV0U3RyZWFtIGlzLCBpbnQgdmNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRQYXJzZXIgdkNhcmRQYXJzZXIgPSBWQ2FyZFV0aWxzLmdldEFwcHJvcHJpYXRlUGFyc2VyKHZjYXJkVHlwZSk7Ci0gICAgICAgIGZpbmFsIFZDYXJkRW50cnlDb25zdHJ1Y3RvciBidWlsZGVyID0gbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3Rvcih2Y2FyZFR5cGUsIG51bGwpOwotICAgICAgICBidWlsZGVyLmFkZEVudHJ5SGFuZGxlcihtSGFuZGxlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2Q2FyZFBhcnNlci5wYXJzZShpcywgYnVpbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2ZXJpZnlSZXNvbHZlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeVJlc29sdmVyKCkgewotICAgICAgICBtUmVzb2x2ZXIudmVyaWZ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25QYXJzaW5nU3RhcnQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uU3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVudHJ5Q3JlYXRlZChWQ2FyZEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW50cnlDcmVhdGVkKGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblBhcnNpbmdFbmQoKSB7Ci0gICAgICAgIG1IYW5kbGVyLm9uRW5kKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvRXhwb3J0VGVzdFByb3ZpZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NTI1OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5FbnRpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEV4cG9ydFRlc3RQcm92aWRlciBleHRlbmRzIE1vY2tDb250ZW50UHJvdmlkZXIgewotICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4gbUNvbnRhY3RFbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRhY3RFbnRyeT4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tFbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIEVudGl0eUl0ZXJhdG9yIHsKLSAgICAgICAgTGlzdDxFbnRpdHk+IG1FbnRpdHlMaXN0OwotICAgICAgICBJdGVyYXRvcjxFbnRpdHk+IG1JdGVyYXRvcjsKLQotICAgICAgICBwdWJsaWMgTW9ja0VudGl0eUl0ZXJhdG9yKExpc3Q8Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgIG1FbnRpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxFbnRpdHk+KCk7Ci0gICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShuZXcgQ29udGVudFZhbHVlcygpKTsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZW50aXR5LmFkZFN1YlZhbHVlKERhdGEuQ09OVEVOVF9VUkksIGNvbnRlbnRWYWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUVudGl0eUxpc3QuYWRkKGVudGl0eSk7Ci0gICAgICAgICAgICBtSXRlcmF0b3IgPSBtRW50aXR5TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEVudGl0eSBuZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIG1JdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInJlbW92ZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIG1JdGVyYXRvciA9IG1FbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFeHBvcnRUZXN0UHJvdmlkZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYnVpbGRJbnB1dEVudHJ5KCkgewotICAgICAgICBDb250YWN0RW50cnkgY29udGFjdEVudHJ5ID0gbmV3IENvbnRhY3RFbnRyeSgpOwotICAgICAgICBtQ29udGFjdEVudHJ5TGlzdC5hZGQoY29udGFjdEVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGNvbnRhY3RFbnRyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvbGQgbWV0aG9kIHdoaWNoIGhhZCBleGlzdGVkIGJ1dCB3YXMgcmVtb3ZlZCBmcm9tIENvbnRlbnRSZXNvbHZlci4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogV2Ugc3RpbGwga2VlcCB1c2luZyB0aGlzIG1ldGhvZCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgcHJvcGVlciB3YXkgdG8ga25vdwotICAgICAqIHdoaWNoIHZhbHVlIGluIHRoZSBDb250ZW50VmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGVudHJ5IGluIENvbnRhY3RzIGRhdGFiYXNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3IgcXVlcnlFbnRpdGllcyhVcmkgdXJpLAotICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKHVyaSAhPSBudWxsKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQuZXF1YWxzKHVyaS5nZXRTY2hlbWUoKSkpOwotICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXR5ID0gdXJpLmdldEF1dGhvcml0eSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLmVxdWFscyhhdXRob3JpdHkpKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZSgoRGF0YS5DT05UQUNUX0lEICsgIj0/IikuZXF1YWxzKHNlbGVjdGlvbikpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoMSwgc2VsZWN0aW9uQXJncy5sZW5ndGgpOwotICAgICAgICBmaW5hbCBpbnQgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlbGVjdGlvbkFyZ3NbMF0pOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGlkID49IDAgJiYgaWQgPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0VudGl0eUl0ZXJhdG9yKG1Db250YWN0RW50cnlMaXN0LmdldChpZCkuZ2V0TGlzdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksU3RyaW5nW10gcHJvamVjdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkkuZXF1YWxzKHVyaSkpOwotICAgICAgICAvLyBJbiB0aGlzIHRlc3QsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIFRlc3RDYXNlLmFzc2VydE51bGwoc2VsZWN0aW9uKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChzb3J0T3JkZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgTW9ja0N1cnNvcigpIHsKLSAgICAgICAgICAgIGludCBtQ3VycmVudFBvc2l0aW9uID0gLTE7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRhY3RFbnRyeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb0ZpcnN0KCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50UG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG1vdmVUb05leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UG9zaXRpb24gPCBtQ29udGFjdEVudHJ5TGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbisrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQmVmb3JlRmlyc3QoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb24gPCAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWZ0ZXJMYXN0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFBvc2l0aW9uID49IG1Db250YWN0RW50cnlMaXN0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKENvbnRhY3RzLl9JRCwgY29sdW1uTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBnZXRJbnQoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDAsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKG1DdXJyZW50UG9zaXRpb24gPj0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRQb3NpdGlvbiA8IG1Db250YWN0RW50cnlMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50UG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldEludChjb2x1bW5JbmRleCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9FeHBvcnRUZXN0UmVzb2x2ZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZkOTFhLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0V4cG9ydFRlc3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb21wb3NlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgRXhwb3J0VGVzdFJlc29sdmVyIGV4dGVuZHMgTW9ja0NvbnRlbnRSZXNvbHZlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHBvcnRUZXN0UHJvdmlkZXIgbVByb3ZpZGVyOwotICAgIHB1YmxpYyBFeHBvcnRUZXN0UmVzb2x2ZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgRXhwb3J0VGVzdFByb3ZpZGVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFZDYXJkQ29tcG9zZXIuVkNBUkRfVEVTVF9BVVRIT1JJVFksIG1Qcm92aWRlcik7Ci0gICAgICAgIGFkZFByb3ZpZGVyKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLmdldEF1dGhvcml0eSgpLCBtUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRDb250YWN0RW50cnkoKSB7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYnVpbGRJbnB1dEVudHJ5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4cG9ydFRlc3RQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9JbXBvcnRUZXN0UHJvdmlkZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjg5NDkxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLkVtYWlsOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5Hcm91cE1lbWJlcnNoaXA7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5JbTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk5pY2tuYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuTm90ZTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLk9yZ2FuaXphdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvdG87Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5SZWxhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlN0cnVjdHVyZWROYW1lOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuU3RydWN0dXJlZFBvc3RhbDsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLldlYnNpdGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRUZXN0UHJvdmlkZXIgZXh0ZW5kcyBNb2NrQ29udGVudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBzS25vd25NaW1lVHlwZVNldCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBOaWNrbmFtZS5DT05URU5UX0lURU1fVFlQRSwgUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgRW1haWwuQ09OVEVOVF9JVEVNX1RZUEUsIFN0cnVjdHVyZWRQb3N0YWwuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgSW0uQ09OVEVOVF9JVEVNX1RZUEUsIE9yZ2FuaXphdGlvbi5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBFdmVudC5DT05URU5UX0lURU1fVFlQRSwgUGhvdG8uQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgTm90ZS5DT05URU5UX0lURU1fVFlQRSwgV2Vic2l0ZS5DT05URU5UX0lURU1fVFlQRSwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbi5DT05URU5UX0lURU1fVFlQRSwgRXZlbnQuQ09OVEVOVF9JVEVNX1RZUEUsCi0gICAgICAgICAgICAgICAgR3JvdXBNZW1iZXJzaGlwLkNPTlRFTlRfSVRFTV9UWVBFKSk7Ci0KLSAgICBmaW5hbCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPENvbnRlbnRWYWx1ZXM+PiBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlczsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UHJvdmlkZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFjY2VwdGFuYmxlTWltZVR5cGUgOiBzS25vd25NaW1lVHlwZVNldCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBIYXNoU2V0IHNpbmNlIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdGhlIGNvbnRlbnQgb2YKLSAgICAgICAgICAgIC8vIENvbnRlbnRWYWx1ZXMgYWZ0ZXIgdGhlIGluc2VydGlvbiwgd2hpY2ggbWFrZSB0aGUgcmVzdWx0IG9mIGhhc2hDb2RlKCkKLSAgICAgICAgICAgIC8vIGNoYW5nZXMuLi4KLSAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5ibGVNaW1lVHlwZSwgbmV3IEFycmF5TGlzdDxDb250ZW50VmFsdWVzPigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcykgewotICAgICAgICBmaW5hbCBTdHJpbmcgbWltZVR5cGUgPSBleHBlY3RlZENvbnRlbnRWYWx1ZXMuZ2V0QXNTdHJpbmcoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGlmICghc0tub3duTWltZVR5cGVTZXQuY29udGFpbnMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJVbmtub3cgTWltZVR5cGUgJXMgaW4gdGhlIHRlc3QgY29kZS4gVGVzdCBjb2RlIHNob3VsZCBiZSBicm9rZW4uIiwKLSAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgIG1NaW1lVHlwZVRvRXhwZWN0ZWRDb250ZW50VmFsdWVzLmdldChtaW1lVHlwZSk7Ci0gICAgICAgIGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uLmFkZChleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBhcHBseUJhdGNoKAotICAgICAgICAgICAgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gb3BlcmF0aW9ucykgewotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJUaGVyZSBpcyBubyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IG9wZXJhdGlvbnMuc2l6ZSgpOwotICAgICAgICBDb250ZW50UHJvdmlkZXJSZXN1bHRbXSBmYWtlUmVzdWx0QXJyYXkgPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgVXJpIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCBTdHJpbmcudmFsdWVPZihpKSk7Ci0gICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXlbaV0gPSBuZXcgQ29udGVudFByb3ZpZGVyUmVzdWx0KHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzID0gb3BlcmF0aW9uLnJlc29sdmVWYWx1ZUJhY2tSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICBmYWtlUmVzdWx0QXJyYXksIGkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gb3BlcmF0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGFjdHVhbENvbnRlbnRWYWx1ZXMgPSBvcGVyYXRpb24ucmVzb2x2ZVZhbHVlQmFja1JlZmVyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgIGZha2VSZXN1bHRBcnJheSwgaSk7Ci0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpID0gb3BlcmF0aW9uLmdldFVyaSgpOwotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0TnVsbChhY3R1YWxDb250ZW50VmFsdWVzLmdldChSYXdDb250YWN0cy5BQ0NPVU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnROdWxsKGFjdHVhbENvbnRlbnRWYWx1ZXMuZ2V0KFJhd0NvbnRhY3RzLkFDQ09VTlRfVFlQRSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh1cmkuZXF1YWxzKERhdGEuQ09OVEVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gYWN0dWFsQ29udGVudFZhbHVlcy5nZXRBc1N0cmluZyhEYXRhLk1JTUVUWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNLbm93bk1pbWVUeXBlU2V0LmNvbnRhaW5zKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gTWltZVR5cGUgJXMuIFByb2JhYmx5IGFkZGVkIGFmdGVyIGRldmVsb3BpbmcgdGhpcyB0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZGF0YSBtZWFuaW5nbGVzcyBpbiB0aGlzIHVuaXQgdGVzdHMuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBEYXRhLkRBVEExIC0gREFUQTcgYXJlIHNldCB0byBudWxsIG9yIGVtcHR5IFN0cmluZwotICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0LCBidXQgaXQgbWF5IGNoYW5nZSBkZXBlbmRpbmcgb24gaG93Ci0gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXItcmVsYXRlZCBjb2RlIGhhbmRsZXMgaXQuCi0gICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgaWdub3JlIHRoZXNlIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBzcGVjcyBhbmQKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHdoZXRoZXIgdkNhcmQgaW1wb3J0ZXIgY29ycmVjdGx5IGluc2VydHMgcmVsbGV2ZW50IGRhdGEuCi0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4ga2V5VG9CZVJlbW92ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBhY3R1YWxDb250ZW50VmFsdWVzLnZhbHVlU2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVRvQmVSZW1vdmVkLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5OiBrZXlUb0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb250ZW50VmFsdWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBmb3IgdGVzdGluZwotICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiTWltZVR5cGU6ICVzLCBkYXRhOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLCBhY3R1YWxDb250ZW50VmFsdWVzLnRvU3RyaW5nKCkpKTsgKi8KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgUkFXX0NPTlRBQ1RfSUQgZW50cnkganVzdCBmb3Igc2FmZXR5LCBzaW5jZSB3ZSBkbyBub3QgY2FyZQotICAgICAgICAgICAgICAgIC8vIGhvdyByZXNvbHZlci1yZWxhdGVkIGNvZGUgaGFuZGxlcyB0aGUgZW50cnkgaW4gdGhpcyB1bml0IHRlc3QsCi0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbENvbnRlbnRWYWx1ZXMuY29udGFpbnNLZXkoRGF0YS5SQVdfQ09OVEFDVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcy5yZW1vdmUoRGF0YS5SQVdfQ09OVEFDVF9JRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29udGVudFZhbHVlcz4gY29udGVudFZhbHVlc0NvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICBtTWltZVR5cGVUb0V4cGVjdGVkQ29udGVudFZhbHVlcy5nZXQobWltZVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWVzQ29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiQ29udGVudFZhbHVlcyBmb3IgTWltZVR5cGUgIiArIG1pbWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBleHBlY3RlZCBhdCBhbGwgKCIgKyBhY3R1YWxDb250ZW50VmFsdWVzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChDb250ZW50VmFsdWVzIGV4cGVjdGVkQ29udGVudFZhbHVlcyA6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZm9yIHRlc3RpbmcKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoIkBAQCIsICJleHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKCJAQEAiLCAiYWN0dWFsICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGFjdHVhbENvbnRlbnRWYWx1ZXMpKTsqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWxzRm9yQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ29udGVudFZhbHVlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoY29udGVudFZhbHVlc0NvbGxlY3Rpb24ucmVtb3ZlKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJVbmV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoYWN0dWFsQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIkV4cGVjdGVkICA6ICIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENvbnRlbnRWYWx1ZXMgZXhwZWN0ZWRDb250ZW50VmFsdWVzIDogY29udGVudFZhbHVlc0NvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKGV4cGVjdGVkQ29udGVudFZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoYnVpbGRlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVXJpIGhhcyBjb21lOiAiICsgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmV0dXJuIGZha2VSZXN1bHRBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoQ29sbGVjdGlvbjxDb250ZW50VmFsdWVzPiBjb250ZW50VmFsdWVzQ29sbGVjdGlvbiA6Ci0gICAgICAgICAgICAgICAgbU1pbWVUeXBlVG9FeHBlY3RlZENvbnRlbnRWYWx1ZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXM6IGNvbnRlbnRWYWx1ZXNDb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoY29udmVydFRvRWFzaWx5UmVhZGFibGVTdHJpbmcoZXhwZWN0ZWRDb250ZW50VmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFpbE1zZyA9Ci0gICAgICAgICAgICAgICAgIlRoZXJlIGlzKGFyZSkgcmVtYWluaW5nIGV4cGVjdGVkIENvbnRlbnRWYWx1ZXMgaW5zdGFuY2Uocyk6IFxuIgotICAgICAgICAgICAgICAgICAgICArIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBwcmludCBDb250ZW50VmFsdWVzIHdob3NlIGNvbnRlbnQgaXMgcHJpbnRlZCB3aXRoIHNvcnRlZCBrZXlzLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0Vhc2lseVJlYWRhYmxlU3RyaW5nKENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICBpZiAoY29udGVudFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtaW1lVHlwZVZhbHVlID0gIiI7Ci0gICAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc29ydGVkTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogY29udGVudFZhbHVlcy52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyaW5nID0gKHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoRGF0YS5NSU1FVFlQRS5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlVmFsdWUgPSB2YWx1ZVN0cmluZzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChrZXkpOwotICAgICAgICAgICAgICAgIHNvcnRlZE1hcC5wdXQoa2V5LCB2YWx1ZVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoRGF0YS5NSU1FVFlQRSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1pbWVUeXBlVmFsdWUpOwotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHNvcnRlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGtleSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVwiIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNGb3JDb250ZW50VmFsdWVzKAotICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBleHBlY3RlZCwgZmluYWwgQ29udGVudFZhbHVlcyBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCB8fCBleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBleHBlY3RlZC52YWx1ZVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFhY3R1YWwuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFR5cGUgbWlzbWF0Y2ggdXN1YWxsIGhhcHBlbnMgYXMgaW1wb3J0ZXIgZG9lc24ndCBjYXJlIHRoZSB0eXBlIG9mIGVhY2ggdmFsdWUuCi0gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdmFyaWFibGUgdHlwZSBtaWdodCBiZSBJbnRlZ2VyIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlIG9mIFRFTCwKLSAgICAgICAgICAgIC8vIHdoaWxlIHZhcmlhYmxlIHR5cGUgd291bGQgYmUgU3RyaW5nIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlIG9mIFJFTEFUSU9OLgotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFjdHVhbFZhbHVlID0gYWN0dWFsLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChieXRlW10pdmFsdWUsIChieXRlW10pYWN0dWFsVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBlID0gKGJ5dGVbXSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGEgPSAoYnl0ZVtdKWFjdHVhbFZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghdmFsdWUuZXF1YWxzKGFjdHVhbFZhbHVlKSAmJgotICAgICAgICAgICAgICAgICAgICAhdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoYWN0dWFsVmFsdWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0ltcG9ydFRlc3RSZXNvbHZlci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjJhZmUuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvSW1wb3J0VGVzdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlclJlc3VsdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuUmF3Q29udGFjdHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEltcG9ydFRlc3RSZXNvbHZlciBleHRlbmRzIE1vY2tDb250ZW50UmVzb2x2ZXIgewotICAgIHByaXZhdGUgZmluYWwgSW1wb3J0VGVzdFByb3ZpZGVyIG1Qcm92aWRlcjsKLQotICAgIHB1YmxpYyBJbXBvcnRUZXN0UmVzb2x2ZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtUHJvdmlkZXIgPSBuZXcgSW1wb3J0VGVzdFByb3ZpZGVyKGFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRQcm92aWRlclJlc3VsdFtdIGFwcGx5QmF0Y2goU3RyaW5nIGF1dGhvcml0eSwKLSAgICAgICAgICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgZXF1YWxzU3RyaW5nKGF1dGhvcml0eSwgUmF3Q29udGFjdHMuQ09OVEVOVF9VUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBtUHJvdmlkZXIuYXBwbHlCYXRjaChvcGVyYXRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHBlY3RlZENvbnRlbnRWYWx1ZXMoQ29udGVudFZhbHVlcyBleHBlY3RlZENvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgbVByb3ZpZGVyLmFkZEV4cGVjdGVkQ29udGVudFZhbHVlcyhleHBlY3RlZENvbnRlbnRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKLSAgICAgICAgbVByb3ZpZGVyLnZlcmlmeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXF1YWxzU3RyaW5nKFN0cmluZyBhLCBTdHJpbmcgYikgewotICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGEubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGIgPT0gbnVsbCB8fCBiLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9MaW5lVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE0YWM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbXBvc2VyOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGluZVZlcmlmaWVyIGltcGxlbWVudHMgVkNhcmRDb21wb3Nlci5PbmVFbnRyeUhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgQW5kcm9pZFRlc3RDYXNlIG1BbmRyb2lkVGVzdENhc2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8TGluZVZlcmlmaWVyRWxlbT4gbUxpbmVWZXJpZmllckVsZW1MaXN0OwotICAgIHByaXZhdGUgaW50IG1WQ2FyZFR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZXg7Ci0KLSAgICBwdWJsaWMgTGluZVZlcmlmaWVyKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UsIGludCB2Y2FyZFR5cGUpIHsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IGFuZHJvaWRUZXN0Q2FzZTsKLSAgICAgICAgbUxpbmVWZXJpZmllckVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxMaW5lVmVyaWZpZXJFbGVtPigpOwotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZExpbmVWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllckVsZW0obUFuZHJvaWRUZXN0Q2FzZSwgbVZDYXJkVHlwZSk7Ci0gICAgICAgIG1MaW5lVmVyaWZpZXJFbGVtTGlzdC5hZGQobGluZVZlcmlmaWVyKTsKLSAgICAgICAgcmV0dXJuIGxpbmVWZXJpZmllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGlmIChpbmRleCA+PSBtTGluZVZlcmlmaWVyRWxlbUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJJbnN1ZmZpY2llbnQgbnVtYmVyIG9mIExpbmVWZXJpZmllciAoIiArIGluZGV4ICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpbmVWZXJpZmllckVsZW0gbGluZVZlcmlmaWVyID0gbUxpbmVWZXJpZmllckVsZW1MaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGxpbmVWZXJpZmllci52ZXJpZnkodmNhcmQpOwotCi0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gb25FbnRyeUNyZWF0ZWQoU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIHZlcmlmeSh2Y2FyZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvTGluZVZlcmlmaWVyRWxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNhOWNkLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL0xpbmVWZXJpZmllckVsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKLSAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0gKiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKLSAqIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTGluZVZlcmlmaWVyRWxlbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbUV4cGVjdGVkTGluZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVkNhcmRUeXBlOwotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0oQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSwgaW50IHZjYXJkVHlwZSkgewotICAgICAgICBtVkNhcmRUeXBlID0gdmNhcmRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5lVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkKGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkobGluZSkpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LmFkZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVBcnJheSA9IHZjYXJkLnNwbGl0KCJcXHI/XFxuIik7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBsaW5lQXJyYXkubGVuZ3RoOwotICAgICAgICBib29sZWFuIGJlZ2luRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZW5kRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmVyc2lvbkV4aXN0cyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gbGluZUFycmF5W2ldOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgiQkVHSU46VkNBUkQiLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJCRUdJTjpWQ0FSRFwiIGxpbmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiZWdpbkV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIkVORDpWQ0FSRCIuZXF1YWxzSWdub3JlQ2FzZShsaW5lKSkgewotICAgICAgICAgICAgICAgIGlmIChlbmRFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTXVsdGlwbGUgXCJFTkQ6VkNBUkRcIiBsaW5lIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgoVkNhcmRDb25maWcuaXNWZXJzaW9uMjEobVZDYXJkVHlwZSkgPyAiVkVSU0lPTjoyLjEiIDoKLSAgICAgICAgICAgICAgICAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkgPyAiVkVSU0lPTjozLjAiIDoKLSAgICAgICAgICAgICAgICAgICAgIlZFUlNJT046NC4wIikpLmVxdWFsc0lnbm9yZUNhc2UobGluZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbkV4aXN0cykgewotICAgICAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJNdWx0aXBsZSBWRVJTSU9OIGxpbmUgKyBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghYmVnaW5FeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJQcm9wZXJ0eSBvdGhlciB0aGFuIEJFR0lOIGNhbWUgYmVmb3JlIEJFR0lOIHByb3BlcnR5OiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVuZEV4aXN0cykgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IG90aGVyIHRoYW4gRU5EIGNhbWUgYWZ0ZXIgRU5EIHByb3BlcnR5OiAiICsgbGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IG1FeHBlY3RlZExpbmVMaXN0LmluZGV4T2YobGluZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1FeHBlY3RlZExpbmVMaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgbGluZTogIiArIGxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwZWN0ZWRMaW5lTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZExpbmUgOiBtRXhwZWN0ZWRMaW5lTGlzdCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZXhwZWN0ZWRMaW5lKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUZXN0Q2FzZS5mYWlsKCJFeHBlY3RlZCBsaW5lKHMpIG5vdCBmb3VuZDoiICsgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2RlLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3YWQ4ZS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkRW50cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyByZXByZXNlbnRpbmcgb25lIHByb3BlcnR5IChlLmcuICJOO0VOQ09ESU5HPVVURi04OmZhbWlseTpnaXZlbjptaWRkbGU6cHJlZml4OnN1ZmZpeCIpLgotICogPC9wPgotICogPHA+Ci0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEVzcGVjaWFsbHkgdXNlZnVsIGZvciB0ZXN0aW5nIHBhcnNlciBjb2RlIChWQ2FyZFBhcnNlciksIHNpbmNlIGFsbCBwcm9wZXJ0aWVzIGNhbiBiZQotICogY2hlY2tlZCB2aWEgdGhpcyBjbGFzcyB1bmxpa2Uge0BsaW5rIFZDYXJkRW50cnl9LCB3aGljaCBvbmx5IGVtaXRzIHRoZSByZXN1bHQgb2YKLSAqIGludGVycHJldGF0aW9uIG9mIHRoZSBjb250ZW50IG9mIGVhY2ggdkNhcmQuIFdlIGNhbm5vdCBrbm93IHdoZXRoZXIgdkNhcmQgcGFyc2VyIG9yCi0gKiB7QGxpbmsgVkNhcmRFbnRyeX0gaXMgd3Jvbmcgd2l0aG91dCB0aGlzIGNsYXNzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlOb2RlIHsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3BOYW1lOwotICAgIHB1YmxpYyBTdHJpbmcgcHJvcFZhbHVlOwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvcFZhbHVlX3ZlY3RvcjsKLQotICAgIC8qKiBTdG9yZSB2YWx1ZSBhcyBieXRlW10sYWZ0ZXIgZGVjb2RlLgotICAgICAqIFVzZWQgd2hlbiBwcm9wVmFsdWUgaXMgZW5jb2RlZCBieSBzb21ldGhpbmcgbGlrZSBCQVNFNjQsIFFVT1RFRC1QUklOVEFCTEUsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlczsKLQotICAgIC8qKgotICAgICAqIHBhcmFtIHN0b3JlOiBrZXk9cGFyYW1UeXBlLCB2YWx1ZT1wYXJhbVZhbHVlCi0gICAgICogTm90ZSB0aGF0IGN1cnJlbnRseSBQcm9wZXJ0eU5vZGUgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBwYXJhbS12YWx1ZXMKLSAgICAgKiBkZWZpbmVkIGluIHZDYXJkIDMuMCAoU2VlIGFsc28gUkZDIDI0MjYpLiBtdWx0aXBsZS12YWx1ZXMgYXJlIHN0b3JlZCBhcwotICAgICAqIG9uZSBTdHJpbmcgdmFsdWUgbGlrZSAiQSxCIiwgbm90IFsiQSIsICJCIl0uLi4KLSAgICAgKiBUT0RPOiBmaXggdGhpcy4gCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXA7Ci0KLSAgICAvKiogT25seSBmb3IgVFlQRT0/Pz8gcGFyYW0gc3RvcmUuICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IHBhcmFtTWFwX1RZUEU7Ci0KLSAgICAvKiogU3RvcmUgZ3JvdXAgdmFsdWVzLiBVc2VkIG9ubHkgaW4gVkNhcmQuICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IHByb3BHcm91cFNldDsKLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2RlKCkgewotICAgICAgICBwcm9wTmFtZSA9ICIiOwotICAgICAgICBwcm9wVmFsdWUgPSAiIjsKLSAgICAgICAgcHJvcFZhbHVlX3ZlY3RvciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwYXJhbU1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIHBhcmFtTWFwX1RZUEUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BHcm91cFNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZSgKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZV92ZWN0b3IsCi0gICAgICAgICAgICBieXRlW10gcHJvcFZhbHVlX2J5dGVzLCBDb250ZW50VmFsdWVzIHBhcmFtTWFwLCBTZXQ8U3RyaW5nPiBwYXJhbU1hcF9UWVBFLAotICAgICAgICAgICAgU2V0PFN0cmluZz4gcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BOYW1lID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BWYWx1ZSA9IHByb3BWYWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV92ZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wVmFsdWVfdmVjdG9yID0gcHJvcFZhbHVlX3ZlY3RvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucHJvcFZhbHVlX3ZlY3RvciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvcFZhbHVlX2J5dGVzID0gcHJvcFZhbHVlX2J5dGVzOwotICAgICAgICBpZiAocGFyYW1NYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcCA9IHBhcmFtTWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtTWFwX1RZUEUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wYXJhbU1hcF9UWVBFID0gcGFyYW1NYXBfVFlQRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucGFyYW1NYXBfVFlQRSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcEdyb3VwU2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcEdyb3VwU2V0ID0gcHJvcEdyb3VwU2V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5wcm9wR3JvdXBTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgLy8gdkNhcmQgbWF5IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBzYW1lIGxpbmUgaW4gb25lIGVudHJ5LCB3aGlsZSBIYXNoU2V0IG9yIGFueSBvdGhlcgotICAgICAgICAvLyBsaWJyYXJ5IHdoaWNoIHV0aWxpemUgaGFzaENvZGUoKSBkb2VzIG5vdCBob25vciB0aGF0LCBzbyBpbnRlbnRpb25hbGx5IHRocm93IGFuCi0gICAgICAgIC8vIEV4Y2VwdGlvbi4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm9wZXJ0eU5vZGUgZG9lcyBub3QgcHJvdmlkZSBoYXNoQ29kZSgpIGltcGxlbWVudGF0aW9uIGludGVudGlvbmFsbHkuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvcGVydHlOb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0eU5vZGUgbm9kZSA9IChQcm9wZXJ0eU5vZGUpb2JqOwotICAgICAgICAKLSAgICAgICAgaWYgKHByb3BOYW1lID09IG51bGwgfHwgIXByb3BOYW1lLmVxdWFscyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKCFwYXJhbU1hcF9UWVBFLmVxdWFscyhub2RlLnBhcmFtTWFwX1RZUEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcmFtTWFwX1RZUEUuZXF1YWxzKG5vZGUucGFyYW1NYXBfVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICghcHJvcEdyb3VwU2V0LmVxdWFscyhub2RlLnByb3BHcm91cFNldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wVmFsdWVfYnl0ZXMgIT0gbnVsbCAmJiBBcnJheXMuZXF1YWxzKHByb3BWYWx1ZV9ieXRlcywgbm9kZS5wcm9wVmFsdWVfYnl0ZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghcHJvcFZhbHVlLmVxdWFscyhub2RlLnByb3BWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpbiBwcm9wVmFsdWVfdmVjdG9yIGlzIG5vdCBkZWNvZGVkIGV2ZW4gaWYgaXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAvLyBkZWNvZGVkIGJ5IEJBU0U2NCBvciBRVU9URUQtUFJJTlRBQkxFLiBXaGVuIHRoZSBzaXplIG9mIHByb3BWYWx1ZV92ZWN0b3IKLSAgICAgICAgICAgIC8vIGlzIDEsIHRoZSBlbmNvZGVkIHZhbHVlIGlzIHN0b3JlZCBpbiBwcm9wVmFsdWUsIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgICAgICAgICAvLyBjaGVjayBpdC4KLSAgICAgICAgICAgIHJldHVybiAocHJvcFZhbHVlX3ZlY3Rvci5lcXVhbHMobm9kZS5wcm9wVmFsdWVfdmVjdG9yKSB8fAotICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA9PSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUucHJvcFZhbHVlX3ZlY3Rvci5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoInByb3BOYW1lOiAiKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQocHJvcE5hbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwYXJhbU1hcDogIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcmFtTWFwLnRvU3RyaW5nKCkpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwYXJhbU1hcF9UWVBFOiBbIik7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBlbGVtIDogcGFyYW1NYXBfVFlQRSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7Ci0gICAgICAgIGlmICghcHJvcEdyb3VwU2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgcHJvcEdyb3VwU2V0OiBbIik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtIDogcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV92ZWN0b3IgIT0gbnVsbCAmJiBwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIHByb3BWYWx1ZV92ZWN0b3Igc2l6ZTogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWVfdmVjdG9yLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BWYWx1ZV9ieXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWVfYnl0ZXMgc2l6ZTogIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwcm9wVmFsdWVfYnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFwcGVuZCgiLCBwcm9wVmFsdWU6IFwiIik7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKHByb3BWYWx1ZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIiIpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjkyODQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvUHJvcGVydHlOb2Rlc1ZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuZXhjZXB0aW9uLlZDYXJkRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5Tm9kZXNWZXJpZmllciBleHRlbmRzIFZOb2RlQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0+IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdDsKLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgaW50IG1JbmRleDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbT4oKTsKLSAgICAgICAgbUFuZHJvaWRUZXN0Q2FzZSA9IHRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IG5ldyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKG1BbmRyb2lkVGVzdENhc2UpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuYWRkKGVsZW0pOwotICAgICAgICByZXR1cm4gZWxlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoaW50IHJlc0lkLCBpbnQgdmNhcmRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFZDYXJkRXhjZXB0aW9uIHsKLSAgICAgICAgdmVyaWZ5KG1BbmRyb2lkVGVzdENhc2UuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLm9wZW5SYXdSZXNvdXJjZShyZXNJZCksIHZjYXJkVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KGludCByZXNJZCwgaW50IHZjYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeShtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpLAotICAgICAgICAgICAgICAgIHZjYXJkVHlwZSwgcGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSW5wdXRTdHJlYW0gaXMsIGludCB2Y2FyZFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgVkNhcmRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWQ2FyZFBhcnNlciBwYXJzZXIgPSBWQ2FyZFV0aWxzLmdldEFwcHJvcHJpYXRlUGFyc2VyKHZjYXJkVHlwZSk7Ci0gICAgICAgIHZlcmlmeShpcywgdmNhcmRUeXBlLCBwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZlcmlmeShJbnB1dFN0cmVhbSBpcywgaW50IHZjYXJkVHlwZSwgZmluYWwgVkNhcmRQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBWQ2FyZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoaXMsIHRoaXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgc3VwZXIuZW5kRW50cnkoKTsKLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydFRydWUobUluZGV4IDwgbVByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1MaXN0LnNpemUoKSk7Ci0gICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5hc3NlcnRUcnVlKG1JbmRleCA8IHZOb2RlTGlzdC5zaXplKCkpOwotICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbUxpc3QuZ2V0KG1JbmRleCkudmVyaWZ5KHZOb2RlTGlzdC5nZXQobUluZGV4KSk7Ci0gICAgICAgIG1JbmRleCsrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1Byb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNmFiYy4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9Qcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggdmVyaWZpZXMgaW5wdXQgVk5vZGUuCi0gKgotICogVGhpcyBjbGFzcyBmaXJzdCBjaGVja3Mgd2hldGhlciBlYWNoIHByb3BlcnR5Tm9kZSBpbiB0aGUgVk5vZGUgaXMgaW4gdGhlCi0gKiAib3JkZXJlZCBleHBlY3RlZCBwcm9wZXJ0eSBsaXN0Ii4KLSAqIElmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0IGluIHRoZSAib3JkZXJlZCBsaXN0IiwgdGhlIGNsYXNzIHJlZmVycyB0bwotICogInVub3JkZXJkIGV4cGVjdGVkIHByb3BlcnR5IHNldCIgYW5kIGNoZWNrcyB0aGUgbm9kZSBpcyBleHBlY3RlZCBzb21ld2hlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIHsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVTZXQgZXh0ZW5kcyBIYXNoU2V0PFN0cmluZz4gewotICAgICAgICBwdWJsaWMgVHlwZVNldChTdHJpbmcgLi4uIGFycmF5KSB7Ci0gICAgICAgICAgICBzdXBlcihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwU2V0IGV4dGVuZHMgSGFzaFNldDxTdHJpbmc+IHsKLSAgICAgICAgcHVibGljIEdyb3VwU2V0KFN0cmluZyAuLi4gYXJyYXkpIHsKLSAgICAgICAgICAgIHN1cGVyKEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UHJvcGVydHlOb2RlPj4gbU9yZGVyZWROb2RlTWFwOwotICAgIC8vIEludGVudGlvbmFsbHkgdXNlIEFycmF5TGlzdCBpbnN0ZWFkIG9mIFNldCwgYXNzdW1pbmcgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUKLSAgICAvLyBleGFjdGx5IHNhbWUgb2JqZWN0cy4KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm9wZXJ0eU5vZGU+IG1Vbm9yZGVyZWROb2RlTGlzdDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKEFuZHJvaWRUZXN0Q2FzZSBhbmRyb2lkVGVzdENhc2UpIHsKLSAgICAgICAgbU9yZGVyZWROb2RlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFByb3BlcnR5Tm9kZT4+KCk7Ci0gICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotICAgIH0KLQotICAgIC8vIFdpdGhPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigKLSAgICAgICAgICAgIFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwgQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgbnVsbCwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoCi0gICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUsIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUgPSBjb25jYXRpbmF0ZUxpc3RXaXRoU2VtaUNvbG9uKHByb3BWYWx1ZUxpc3QpOwotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUudG9TdHJpbmcoKSwgcHJvcFZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIG51bGwsIHByb3BWYWx1ZUxpc3QsIG51bGwsIHBhcmFtTWFwLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgQ29udGVudFZhbHVlcyBwYXJhbU1hcCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIHBhcmFtTWFwLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcihTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgYnl0ZVtdIHByb3BWYWx1ZV9ieXRlcywKLSAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcGFyYW1NYXAsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSwgR3JvdXBTZXQgcHJvcEdyb3VwU2V0KSB7Ci0gICAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCAmJiBwcm9wVmFsdWVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BWYWx1ZSA9IGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24ocHJvcFZhbHVlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgUHJvcGVydHlOb2RlIHByb3BlcnR5Tm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsCi0gICAgICAgICAgICAgICAgcGFyYW1NYXAsIHBhcmFtTWFwX1RZUEUsIHByb3BHcm91cFNldCk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZE5vZGVMaXN0ID0gbU9yZGVyZWROb2RlTWFwLmdldChwcm9wTmFtZSk7Ci0gICAgICAgIGlmIChleHBlY3RlZE5vZGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIG1PcmRlcmVkTm9kZU1hcC5wdXQocHJvcE5hbWUsIGV4cGVjdGVkTm9kZUxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIGV4cGVjdGVkTm9kZUxpc3QuYWRkKHByb3BlcnR5Tm9kZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vIFdpdGhvdXRPcmRlcgotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBDb250ZW50VmFsdWVzIGNvbnRlbnRWYWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBjb250ZW50VmFsdWVzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIENvbnRlbnRWYWx1ZXMgY29udGVudFZhbHVlcykgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLAotICAgICAgICAgICAgICAgIHByb3BWYWx1ZUxpc3QsIG51bGwsIGNvbnRlbnRWYWx1ZXMsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBwcm9wVmFsdWUsIHByb3BWYWx1ZUxpc3QsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCkgewotICAgICAgICByZXR1cm4gYWRkRXhwZWN0ZWROb2RlKHByb3BOYW1lLCBudWxsLCBwcm9wVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBUeXBlU2V0IHBhcmFtTWFwX1RZUEUpIHsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBudWxsLCBudWxsLCBudWxsLCBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZUxpc3QsIFR5cGVTZXQgcGFyYW1NYXBfVFlQRSkgewotICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgcmV0dXJuIGFkZEV4cGVjdGVkTm9kZShwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcm9wVmFsdWVMaXN0LCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBhcmFtTWFwX1RZUEUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZEV4cGVjdGVkTm9kZShTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBwcm9wVmFsdWUsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlTGlzdCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJvcFZhbHVlTGlzdCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcF9UWVBFLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyRWxlbSBhZGRFeHBlY3RlZE5vZGUoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFKSB7Ci0gICAgICAgIHJldHVybiBhZGRFeHBlY3RlZE5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBwYXJhbU1hcCwgcGFyYW1NYXBfVFlQRSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gYWRkRXhwZWN0ZWROb2RlKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHByb3BWYWx1ZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVMaXN0LCBieXRlW10gcHJvcFZhbHVlX2J5dGVzLAotICAgICAgICAgICAgQ29udGVudFZhbHVlcyBwYXJhbU1hcCwgVHlwZVNldCBwYXJhbU1hcF9UWVBFLCBHcm91cFNldCBwcm9wR3JvdXBTZXQpIHsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsICYmIHByb3BWYWx1ZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcFZhbHVlID0gY29uY2F0aW5hdGVMaXN0V2l0aFNlbWlDb2xvbihwcm9wVmFsdWVMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBtVW5vcmRlcmVkTm9kZUxpc3QuYWRkKG5ldyBQcm9wZXJ0eU5vZGUocHJvcE5hbWUsIHByb3BWYWx1ZSwKLSAgICAgICAgICAgICAgICBwcm9wVmFsdWVMaXN0LCBwcm9wVmFsdWVfYnl0ZXMsIHBhcmFtTWFwLCBwYXJhbU1hcF9UWVBFLCBwcm9wR3JvdXBTZXQpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KFZOb2RlIHZub2RlKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUgOiB2bm9kZS5wcm9wTGlzdCkgewotICAgICAgICAgICAgdmVyaWZ5Tm9kZShhY3R1YWxOb2RlLnByb3BOYW1lLCBhY3R1YWxOb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbU9yZGVyZWROb2RlTWFwLmlzRW1wdHkoKSB8fCAhbVVub3JkZXJlZE5vZGVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGV4cGVjdGVkUHJvcHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoTGlzdDxQcm9wZXJ0eU5vZGU+IG5vZGVzIDogbU9yZGVyZWROb2RlTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRQcm9wcy5jb250YWlucyhub2RlLnByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm9wcy5hZGQobm9kZS5wcm9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5Tm9kZSBub2RlIDogbVVub3JkZXJlZE5vZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZFByb3BzLmNvbnRhaW5zKG5vZGUucHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJvcHMuYWRkKG5vZGUucHJvcE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBBcnJheXMudG9TdHJpbmcoZXhwZWN0ZWRQcm9wcy50b0FycmF5KCkpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU5vZGUoZmluYWwgU3RyaW5nIHByb3BOYW1lLCBmaW5hbCBQcm9wZXJ0eU5vZGUgYWN0dWFsTm9kZSkgewotICAgICAgICBmaW5hbCBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWROb2RlTGlzdCA9IG1PcmRlcmVkTm9kZU1hcC5nZXQocHJvcE5hbWUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IChleHBlY3RlZE5vZGVMaXN0ICE9IG51bGwgPyBleHBlY3RlZE5vZGVMaXN0LnNpemUoKSA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydHlOb2RlIGV4cGVjdGVkTm9kZSA9IGV4cGVjdGVkTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UHJvcGVydHlOb2RlPiBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWROb2RlLnByb3BOYW1lLmVxdWFscyhwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZS5lcXVhbHMoYWN0dWFsTm9kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTm9kZUxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkTm9kZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JkZXJlZE5vZGVNYXAucmVtb3ZlKHByb3BOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmFkZChleHBlY3RlZE5vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gImFjdHVhbE5vZGUiIGlzIG5vdCBpbiBvcmRlcmVkIGV4cGVjdGVkIGxpc3QuCi0gICAgICAgICAgICAgICAgLy8gVHJ5IGxvb2tpbmcgb3ZlciB1bm9yZGVyZWQgZXhwZWN0ZWQgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAodHJ5Rm91bmRFeHBlY3RlZE5vZGVGcm9tVW5vcmRlcmVkTGlzdChhY3R1YWxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByb3BOYW1lIGV4aXN0cyBidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWUocykuCi0gICAgICAgICAgICAgICAgICAgIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChwcm9wTmFtZSwgYWN0dWFsTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBleHBlY3RlZCBub2RlIHdpdGggc2FtZSBwcm9wTmFtZS4KLSAgICAgICAgICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiVW5leHBlY3RlZCBwcm9wZXJ0eSBcIiIgKyBwcm9wTmFtZSArICJcIiBleGlzdHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Tm9kZT4oKTsKLSAgICAgICAgICAgIGlmICh0cnlGb3VuZEV4cGVjdGVkTm9kZUZyb21Vbm9yZGVyZWRMaXN0KGFjdHVhbE5vZGUsIGV4cGVjdGVkQnV0RGlmZmVyZW50VmFsdWVMaXN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwcm9wTmFtZSBleGlzdHMgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlKHMpLgotICAgICAgICAgICAgICAgICAgICBmYWlsV2l0aEV4cGVjdGVkTm9kZUxpc3QocHJvcE5hbWUsIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZXhwZWN0ZWQgbm9kZSB3aXRoIHNhbWUgcHJvcE5hbWUuCi0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgcHJvcGVydHkgXCIiICsgcHJvcE5hbWUgKyAiXCIgZXhpc3RzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbmNhdGluYXRlTGlzdFdpdGhTZW1pQ29sb24oTGlzdDxTdHJpbmc+IGFycmF5KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFN0cmluZyBwcm9wVmFsdWVFbGVtIDogYXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJvcFZhbHVlRWxlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyeUZvdW5kRXhwZWN0ZWROb2RlRnJvbVVub3JkZXJlZExpc3QoUHJvcGVydHlOb2RlIGFjdHVhbE5vZGUsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5Tm9kZT4gZXhwZWN0ZWRCdXREaWZmZXJlbnRWYWx1ZUxpc3QpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3BOYW1lID0gYWN0dWFsTm9kZS5wcm9wTmFtZTsKLSAgICAgICAgaW50IHVub3JkZXJlZExpc3RTaXplID0gbVVub3JkZXJlZE5vZGVMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bm9yZGVyZWRMaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU5vZGUgdW5vcmRlcmVkRXhwZWN0ZWROb2RlID0gbVVub3JkZXJlZE5vZGVMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUucHJvcE5hbWUuZXF1YWxzKHByb3BOYW1lKSkgewotICAgICAgICAgICAgICAgIGlmICh1bm9yZGVyZWRFeHBlY3RlZE5vZGUuZXF1YWxzKGFjdHVhbE5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Vbm9yZGVyZWROb2RlTGlzdC5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleHBlY3RlZEJ1dERpZmZlcmVudFZhbHVlTGlzdC5hZGQodW5vcmRlcmVkRXhwZWN0ZWROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhaWxXaXRoRXhwZWN0ZWROb2RlTGlzdChTdHJpbmcgcHJvcE5hbWUsIFByb3BlcnR5Tm9kZSBhY3R1YWxOb2RlLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eU5vZGU+IGV4cGVjdGVkTm9kZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChQcm9wZXJ0eU5vZGUgZXhwZWN0ZWROb2RlIDogZXhwZWN0ZWROb2RlTGlzdCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoImV4cGVjdGVkOiAiKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGV4cGVjdGVkTm9kZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIFRlc3RDYXNlLmZhaWwoIlByb3BlcnR5IFwiIiArIHByb3BOYW1lICsgIlwiIGhhcyB3cm9uZyB2YWx1ZS5cbiIKLSAgICAgICAgICAgICAgICArIGJ1aWxkZXIudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIiAgYWN0dWFsOiAiICsgYWN0dWFsTm9kZS50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVkNhcmRUZXN0c0Jhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MTNhYi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFRlc3RzQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGFuZHJvaWQucGltLnZjYXJkLnRlc3RfdXRpbHM7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5WQ2FyZENvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi0vKioKLSAqIEJhc2VDbGFzcyBmb3IgdkNhcmQgdW5pdCB0ZXN0cyB3aXRoIHV0aWxpdHkgY2xhc3Nlcy4KLSAqIFBsZWFzZSBkbyBub3QgYWRkIGVhY2ggdW5pdCB0ZXN0IGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBWQ2FyZFRlc3RzQmFzZSBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVjIxID0gVkNhcmRDb25maWcuVkNBUkRfVFlQRV9WMjFfR0VORVJJQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWMzAgPSBWQ2FyZENvbmZpZy5WQ0FSRF9UWVBFX1YzMF9HRU5FUklDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFY0MCA9IFZDYXJkQ29uZmlnLlZDQVJEX1RZUEVfVjQwX0dFTkVSSUM7Ci0KLSAgICAvLyBEbyBub3QgbW9kaWZ5IHRoZXNlIGR1cmluZyB0ZXN0cy4KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclFQOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZW50VmFsdWVzIG1Db250ZW50VmFsdWVzRm9yU0ppczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGVudFZhbHVlcyBtQ29udGVudFZhbHVlc0ZvclV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFNKaXM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0Zjg7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMjE7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRlbnRWYWx1ZXMgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzA7Ci0KLSAgICBwcm90ZWN0ZWQgVkNhcmRWZXJpZmllciBtVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ta2lwVmVyaWZpY2F0aW9uOwotCi0gICAgcHVibGljIFZDYXJkVGVzdHNCYXNlKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBOb3QgdXNpbmcgY29uc3RhbnRzIGluIHZDYXJkIGNvZGUgc2luY2UgaXQgbWF5IGJlIHdyb25nLgotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUC5wdXQoIkVOQ09ESU5HIiwgIlFVT1RFRC1QUklOVEFCTEUiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JTSmlzLnB1dCgiQ0hBUlNFVCIsICJTSElGVF9KSVMiKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRTSmlzLnB1dCgiRU5DT0RJTkciLCAiUVVPVEVELVBSSU5UQUJMRSIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvclFQQW5kU0ppcy5wdXQoIkNIQVJTRVQiLCAiU0hJRlRfSklTIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JRUEFuZFV0ZjgucHV0KCJFTkNPRElORyIsICJRVU9URUQtUFJJTlRBQkxFIik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yUVBBbmRVdGY4LnB1dCgiQ0hBUlNFVCIsICJVVEYtOCIpOwotICAgICAgICBtQ29udGVudFZhbHVlc0ZvckJhc2U2NFYyMSA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjIxLnB1dCgiRU5DT0RJTkciLCAiQkFTRTY0Iik7Ci0gICAgICAgIG1Db250ZW50VmFsdWVzRm9yQmFzZTY0VjMwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbUNvbnRlbnRWYWx1ZXNGb3JCYXNlNjRWMzAucHV0KCJFTkNPRElORyIsICJiIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVzdEFuZHJvaWRUZXN0Q2FzZVNldHVwUHJvcGVybHkoKSB7Ci0gICAgICAgIHN1cGVyLnRlc3RBbmRyb2lkVGVzdENhc2VTZXR1cFByb3Blcmx5KCk7Ci0gICAgICAgIG1Ta2lwVmVyaWZpY2F0aW9uID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1WZXJpZmllciA9IG5ldyBWQ2FyZFZlcmlmaWVyKHRoaXMpOwotICAgICAgICBtU2tpcFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGlmICghbVNraXBWZXJpZmljYXRpb24pIHsKLSAgICAgICAgICAgIG1WZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZDYXJkVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3OWE1Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WQ2FyZFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29tcG9zZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRDb25maWc7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRFbnRyeUNvbnN0cnVjdG9yOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRJbnRlcnByZXRlckNvbGxlY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnBpbS52Y2FyZC5leGNlcHRpb24uVkNhcmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiA8cD4KLSAqIFRoZSBjbGFzcyBsZXRzIHVzZXJzIGNoZWNrcyB0aGF0IGdpdmVuIGV4cGVjdGVkIHZDYXJkIGRhdGEgYXJlIHNhbWUgYXMgZ2l2ZW4gYWN0dWFsIHZDYXJkIGRhdGEuCi0gKiBBYmxlIHRvIHZlcmlmeSBib3RoIHZDYXJkIGltcG9ydGVyL2V4cG9ydGVyLgotICogPC9wPgotICogPHA+Ci0gKiBGaXJzdCBhIHVzZXIgaGFzIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdCBieSBjYWxsaW5nIGVpdGhlcgotICoge0BsaW5rICNpbml0Rm9ySW1wb3J0VGVzdChpbnQsIGludCl9IG9yIHtAbGluayAjaW5pdEZvckV4cG9ydFRlc3QoaW50KX0uCi0gKiAiUm91bmQgdHJpcCB0ZXN0IiAoaW1wb3J0IC0+IGV4cG9ydCAtPiBpbXBvcnQsIG9yIGV4cG9ydCAtPiBpbXBvcnQgLT4gZXhwb3J0KSBpcyBub3Qgc3VwcG9ydGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVkNhcmRWZXJpZmllciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVkNhcmRWZXJpZmllciI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21Nb2NrQ29udGV4dCBleHRlbmRzIE1vY2tDb250ZXh0IHsKLSAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKLSAgICAgICAgcHVibGljIEN1c3RvbU1vY2tDb250ZXh0KENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlc29sdmVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBWQ2FyZFZlcmlmaWVySW50ZXJuYWwgaW1wbGVtZW50cyBWQ2FyZENvbXBvc2VyLk9uZUVudHJ5SGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uSW5pdChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRW50cnlDcmVhdGVkKFN0cmluZyB2Y2FyZCkgewotICAgICAgICAgICAgdmVyaWZ5T25lVkNhcmRGb3JFeHBvcnQodmNhcmQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgb25UZXJtaW5hdGUoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFuZHJvaWRUZXN0Q2FzZSBtQW5kcm9pZFRlc3RDYXNlOwotICAgIHByaXZhdGUgZmluYWwgVkNhcmRWZXJpZmllckludGVybmFsIG1WQ2FyZFZlcmlmaWVySW50ZXJuYWw7Ci0gICAgcHJpdmF0ZSBpbnQgbVZDYXJkVHlwZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzRG9Db01vOwotCi0gICAgLy8gT25seSBvbmUgb2YgdGhlbSBtdXN0IGJlIG5vbi1lbXB0eS4KLSAgICBwcml2YXRlIEV4cG9ydFRlc3RSZXNvbHZlciBtRXhwb3J0VGVzdFJlc29sdmVyOwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbUlucHV0U3RyZWFtOwotCi0gICAgLy8gVG8gYWxsb3cgZHVwbGljYXRpb24sIHVzZSBsaXN0IGluc3RlYWQgb2Ygc2V0LgotICAgIC8vIFdoZW4gbnVsbCwgd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgdmVyaWZpY2F0aW9uLgotICAgIHByaXZhdGUgUHJvcGVydHlOb2Rlc1ZlcmlmaWVyIG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgcHJpdmF0ZSBMaW5lVmVyaWZpZXIgbUxpbmVWZXJpZmllcjsKLSAgICBwcml2YXRlIENvbnRlbnRWYWx1ZXNWZXJpZmllciBtQ29udGVudFZhbHVlc1ZlcmlmaWVyOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSW5pdGlhbGl6ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIG1DaGFyc2V0OwotCi0gICAgLy8gQ2FsbGVkIGJ5IFZDYXJkVGVzdHNCYXNlCi0gICAgcHVibGljIFZDYXJkVmVyaWZpZXIoQW5kcm9pZFRlc3RDYXNlIGFuZHJvaWRUZXN0Q2FzZSkgewotICAgICAgICBtQW5kcm9pZFRlc3RDYXNlID0gYW5kcm9pZFRlc3RDYXNlOwotICAgICAgICBtVkNhcmRWZXJpZmllckludGVybmFsID0gbmV3IFZDYXJkVmVyaWZpZXJJbnRlcm5hbCgpOwotICAgICAgICBtRXhwb3J0VGVzdFJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgbUlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIG1WZXJpZmllZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGltcG9ydCB0ZXN0LgotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JJbXBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIGludCByZXNJZCkgewotICAgICAgICBpZiAobUluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiQWxyZWFkeSBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIHNldElucHV0UmVzb3VyY2VJZChyZXNJZCk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZXhwb3J0IHRlc3QuCi0gICAgcHVibGljIHZvaWQgaW5pdEZvckV4cG9ydFRlc3QoaW50IHZjYXJkVHlwZSkgewotICAgICAgICBpbml0Rm9yRXhwb3J0VGVzdCh2Y2FyZFR5cGUsICJVVEYtOCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRGb3JFeHBvcnRUZXN0KGludCB2Y2FyZFR5cGUsIFN0cmluZyBjaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJBbHJlYWR5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cG9ydFRlc3RSZXNvbHZlciA9IG5ldyBFeHBvcnRUZXN0UmVzb2x2ZXIobUFuZHJvaWRUZXN0Q2FzZSk7Ci0gICAgICAgIG1WQ2FyZFR5cGUgPSB2Y2FyZFR5cGU7Ci0gICAgICAgIG1Jc0RvQ29NbyA9IFZDYXJkQ29uZmlnLmlzRG9Db01vKHZjYXJkVHlwZSk7Ci0gICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjaGFyc2V0KSkgewotICAgICAgICAgICAgbUNoYXJzZXQgPSAiVVRGLTgiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYXJzZXQgPSBjaGFyc2V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElucHV0UmVzb3VyY2VJZChpbnQgcmVzSWQpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBtQW5kcm9pZFRlc3RDYXNlLmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5vcGVuUmF3UmVzb3VyY2UocmVzSWQpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIldyb25nIHJlc0lkOiAiICsgcmVzSWQpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKG1FeHBvcnRUZXN0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoImFkZElucHV0RW50cnkoKSBpcyBjYWxsZWQuIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJJbnB1dFN0cmVhbSBpcyBhbHJlYWR5IHNldCIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250YWN0RW50cnkgYWRkSW5wdXRFbnRyeSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJzZXRJbnB1dFN0cmVhbSBpcyBjYWxsZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUV4cG9ydFRlc3RSZXNvbHZlci5hZGRJbnB1dENvbnRhY3RFbnRyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRob3V0VmVyc2lvbigpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb3BlcnR5Tm9kZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyID0gbmV3IFByb3BlcnR5Tm9kZXNWZXJpZmllcihtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVByb3BlcnR5Tm9kZXNWZXJpZmllci5hZGRQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKSB7Ci0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRob3V0VmVyc2lvbigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvblN0cmluZzsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjIxKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIjIuMSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiMy4wIjsKLSAgICAgICAgfSBlbHNlIGlmIChWQ2FyZENvbmZpZy5pc1ZlcnNpb240MChtVkNhcmRUeXBlKSkgewotICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9ICI0LjAiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdmNhcmQgdHlwZSBkdXJpbmcgYSB1bml0IHRlc3QiKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiVkVSU0lPTiIsIHZlcnNpb25TdHJpbmcpOwotCi0gICAgICAgIHJldHVybiBlbGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eU5vZGVzVmVyaWZpZXJFbGVtIGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW1XaXRoRW1wdHlOYW1lKCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIk5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0gZWxlbSA9IGFkZFByb3BlcnR5Tm9kZXNWZXJpZmllckVsZW0oKTsKLSAgICAgICAgaWYgKFZDYXJkQ29uZmlnLmlzVmVyc2lvbjQwKG1WQ2FyZFR5cGUpKSB7Ci0gICAgICAgICAgICBlbGVtLmFkZEV4cGVjdGVkTm9kZVdpdGhPcmRlcigiRk4iLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoVkNhcmRDb25maWcuaXNWZXJzaW9uMzAobVZDYXJkVHlwZSkpIHsKLSAgICAgICAgICAgIGVsZW0uYWRkRXhwZWN0ZWROb2RlV2l0aE9yZGVyKCJOIiwgIiIpOwotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIkZOIiwgIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG1Jc0RvQ29NbykgewotICAgICAgICAgICAgZWxlbS5hZGRFeHBlY3RlZE5vZGVXaXRoT3JkZXIoIk4iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW07Ci0gICAgfQotCi0gICAgcHVibGljIExpbmVWZXJpZmllckVsZW0gYWRkTGluZVZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxpbmVWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTGluZVZlcmlmaWVyID0gbmV3IExpbmVWZXJpZmllcihtQW5kcm9pZFRlc3RDYXNlLCBtVkNhcmRUeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUxpbmVWZXJpZmllci5hZGRMaW5lVmVyaWZpZXJFbGVtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRWYWx1ZXNWZXJpZmllckVsZW0gYWRkQ29udGVudFZhbHVlc1ZlcmlmaWVyRWxlbSgpIHsKLSAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbnRlbnRWYWx1ZXNWZXJpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udGVudFZhbHVlc1ZlcmlmaWVyID0gbmV3IENvbnRlbnRWYWx1ZXNWZXJpZmllcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1Db250ZW50VmFsdWVzVmVyaWZpZXIuYWRkRWxlbShtQW5kcm9pZFRlc3RDYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHN1Yi12ZXJpZmllcnMgY29ycmVjdGx5IGFuZCB0cnkgcGFyc2UgZ2l2ZW4gdkNhcmQgYXMgSW5wdXRTdHJlYW0uCi0gICAgICogRXJyb3JzIGFyb3VuZCBJbnB1dFN0cmVhbSBtdXN0IGJlIGhhbmRsZWQgb3V0c2lkZSB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIFVzZWQgYm90aCBmcm9tIHtAbGluayAjdmVyaWZ5Rm9ySW1wb3J0VGVzdCgpfSBhbmQgZnJvbSB7QGxpbmsgI3ZlcmlmeUZvckV4cG9ydFRlc3QoKX0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVkNhcmRJbnRlcnByZXRlciBpbnRlcnByZXRlcjsKLSAgICAgICAgaWYgKG1Db250ZW50VmFsdWVzVmVyaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgVkNhcmRFbnRyeUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gbmV3IFZDYXJkRW50cnlDb25zdHJ1Y3RvcihtVkNhcmRUeXBlKTsKLSAgICAgICAgICAgIGNvbnN0cnVjdG9yLmFkZEVudHJ5SGFuZGxlcihtQ29udGVudFZhbHVlc1ZlcmlmaWVyKTsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IG5ldyBWQ2FyZEludGVycHJldGVyQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVByb3BlcnR5Tm9kZXNWZXJpZmllciwgY29uc3RydWN0b3IpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgPSBjb25zdHJ1Y3RvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtUHJvcGVydHlOb2Rlc1ZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IG1Qcm9wZXJ0eU5vZGVzVmVyaWZpZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludGVycHJldGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB3ZSBtdXN0IG5vdCBzcGVjaWZ5IGNoYXJzZXQgdG93YXJkIHZDYXJkIHBhcnNlcnMuIFRoaXMgY29kZSBjaGVja3Mgd2hldGhlcgotICAgICAgICAgICAgLy8gdGhvc2UgcGFyc2VycyBhcmUgYWJsZSB0byBlbmNvZGUgZ2l2ZW4gYmluYXJ5IHdpdGhvdXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIGZvcgotICAgICAgICAgICAgLy8gY2hhcnNldC4KLSAgICAgICAgICAgIGZpbmFsIFZDYXJkUGFyc2VyIHBhcnNlciA9IFZDYXJkVXRpbHMuZ2V0QXBwcm9wcmlhdGVQYXJzZXIobVZDYXJkVHlwZSk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoaXMsIGludGVycHJldGVyKTsKLSAgICAgICAgfSBjYXRjaCAoVkNhcmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgVkNhcmRFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T25lVkNhcmRGb3JFeHBvcnQoZmluYWwgU3RyaW5nIHZjYXJkKSB7Ci0gICAgICAgIExvZy5kKExPR19UQUcsIHZjYXJkKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmNhcmQuZ2V0Qnl0ZXMobUNoYXJzZXQpKTsKLSAgICAgICAgICAgIHZlcmlmeVdpdGhJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KCkgewotICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTm90IGluaXRpYWxpemVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmVyaWZpZWQpIHsKLSAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoInZlcmlmeSgpIHdhcyBjYWxsZWQgdHdpY2UuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgICAgIFRlc3RDYXNlLmZhaWwoIlRoZXJlIGFyZSB0d28gaW5wdXQgc291cmNlcy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZlcmlmeUZvckltcG9ydFRlc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRXhwb3J0VGVzdFJlc29sdmVyICE9IG51bGwpewotICAgICAgICAgICAgdmVyaWZ5Rm9yRXhwb3J0VGVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVGVzdENhc2UuZmFpbCgiTm8gaW5wdXQgaXMgZGV0ZXJtaW5lZCIpOwotICAgICAgICB9Ci0gICAgICAgIG1WZXJpZmllZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUZvckltcG9ydFRlc3QoKSB7Ci0gICAgICAgIGlmIChtTGluZVZlcmlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFuZHJvaWRUZXN0Q2FzZS5mYWlsKCJOb3Qgc3VwcG9ydGVkIG5vdy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ZXJpZnlXaXRoSW5wdXRTdHJlYW0obUlucHV0U3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmZhaWwoIklPRXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobUlucHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QoCi0gICAgICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCi0gICAgICAgICAgICBmaW5hbCBVcmkgdXJpLCBmaW5hbCBTdHJpbmcgc2VsZWN0aW9uLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgZmluYWwgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBpZiAoRXhwb3J0VGVzdFJlc29sdmVyLmNsYXNzLmVxdWFscyhyZXNvbHZlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0VGVzdFJlc29sdmVyKXJlc29sdmVyKS5nZXRQcm92aWRlcigpLnF1ZXJ5RW50aXRpZXMoCi0gICAgICAgICAgICAgICAgICAgIHVyaSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBzb3J0T3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmUoTE9HX1RBRywgIlVuZXhwZWN0ZWQgcHJvdmlkZXIgZ2l2ZW4uIik7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWV0aG9kIGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpCi0gICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QiLAotICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5jbGFzcywgVXJpLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZ1tdLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlGb3JFeHBvcnRUZXN0KCkgewotICAgICAgIGZpbmFsIFZDYXJkQ29tcG9zZXIgY29tcG9zZXIgPQotICAgICAgICAgICAgbmV3IFZDYXJkQ29tcG9zZXIobmV3IEN1c3RvbU1vY2tDb250ZXh0KG1FeHBvcnRUZXN0UmVzb2x2ZXIpLCBtVkNhcmRUeXBlLCBtQ2hhcnNldCk7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobUxpbmVWZXJpZmllcik7Ci0gICAgICAgIGNvbXBvc2VyLmFkZEhhbmRsZXIobVZDYXJkVmVyaWZpZXJJbnRlcm5hbCk7Ci0gICAgICAgIGlmICghY29tcG9zZXIuaW5pdChWQ2FyZENvbXBvc2VyLkNPTlRBQ1RTX1RFU1RfQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbCgiaW5pdCgpIGZhaWxlZC4gUmVhc29uOiAiICsgY29tcG9zZXIuZ2V0RXJyb3JSZWFzb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQW5kcm9pZFRlc3RDYXNlLmFzc2VydEZhbHNlKGNvbXBvc2VyLmlzQWZ0ZXJMYXN0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFjb21wb3Nlci5pc0FmdGVyTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCA9IGdldE1vY2tHZXRFbnRpdHlJdGVyYXRvck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3Nlci5jcmVhdGVPbmVFbnRyeShtb2NrR2V0RW50aXR5SXRlcmF0b3JNZXRob2QpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBBbmRyb2lkVGVzdENhc2UuZmFpbChlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNvbXBvc2VyLnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS92Y2FyZC90ZXN0X3V0aWxzL1ZOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTBlMmMuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnBpbS52Y2FyZC50ZXN0X3V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBQcmV2aW91c2x5IHVzZWQgaW4gbWFpbiB2Q2FyZCBoYW5kbGluZyBjb2RlIGJ1dCBub3cgZXhpc3RzIG9ubHkgZm9yIHRlc3RpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBWTm9kZSB7Ci0gICAgcHVibGljIFN0cmluZyBWTmFtZTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPiBwcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlOb2RlPigpOwotCi0gICAgLyoqIDA6cGFyc2Ugb3Zlci4gMTpwYXJzaW5nLiAqLwotICAgIHB1YmxpYyBpbnQgcGFyc2VTdGF0dXMgPSAxOwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL3ZjYXJkL3Rlc3RfdXRpbHMvVk5vZGVCdWlsZGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNzAzNC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9waW0vdmNhcmQvdGVzdF91dGlscy9WTm9kZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5waW0udmNhcmQudGVzdF91dGlsczsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucGltLnZjYXJkLlZDYXJkSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5waW0udmNhcmQuVkNhcmRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQmFzZTY0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5DaGFyc2V0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDxwPgotICogVGhlIGNsYXNzIHN0b3JpbmcgdGhlIHBhcnNlIHJlc3VsdCB0byBjdXN0b20gZGF0YXN0cnVjdDoKLSAqIHtAbGluayBWTm9kZX0sIGFuZCB7QGxpbmsgUHJvcGVydHlOb2RlfS4KLSAqIE1heWJlIHNldmVyYWwgdmNhcmQgaW5zdGFuY2UsIHNvIHVzZSB2Tm9kZUxpc3QgdG8gc3RvcmUuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaXMgY2FsbGVkIFZOb2RlLCBub3QgVkNhcmROb2RlLCBzaW5jZSBpdCB3YXMgdXNlZCBmb3IgZXhwcmVzc2luZyB2Q2FsZW5kYXIgKGlDYWwpLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVk5vZGVCdWlsZGVyIGltcGxlbWVudHMgVkNhcmRJbnRlcnByZXRlciB7Ci0gICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIExPR19UQUcgPSAiVk5vZGVCdWlsZGVyIjsgCi0gICAgCi0gICAgcHVibGljIExpc3Q8Vk5vZGU+IHZOb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Vk5vZGU+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbU5vZGVMaXN0UG9zID0gMDsKLSAgICBwcml2YXRlIFZOb2RlIG1DdXJyZW50Vk5vZGU7Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0eU5vZGUgbUN1cnJlbnRQcm9wTm9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFBhcmFtVHlwZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyc2V0IHVzaW5nIHdoaWNoIFZQYXJzZXIgcGFyc2VzIHRoZSB0ZXh0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1Tb3VyY2VDaGFyc2V0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGNoYXJzZXQgd2l0aCB3aGljaCBieXRlIGFycmF5IGlzIGVuY29kZWQgdG8gU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRDaGFyc2V0OwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0TGluZUJyZWFrUGFyc2luZzsKLSAgICAKLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKCkgewotICAgICAgICB0aGlzKFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVk5vZGVCdWlsZGVyKFN0cmluZyB0YXJnZXRDaGFyc2V0LCBib29sZWFuIHN0cmljdExpbmVCcmVha1BhcnNpbmcpIHsKLSAgICAgICAgbVNvdXJjZUNoYXJzZXQgPSBWQ2FyZENvbmZpZy5ERUZBVUxUX0lOVEVSTUVESUFURV9DSEFSU0VUOwotICAgICAgICBpZiAodGFyZ2V0Q2hhcnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IHRhcmdldENoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVGFyZ2V0Q2hhcnNldCA9IFZDYXJkQ29uZmlnLkRFRkFVTFRfSU1QT1JUX0NIQVJTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0cmljdExpbmVCcmVha1BhcnNpbmcgPSBzdHJpY3RMaW5lQnJlYWtQYXJzaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZCgpIHsKLSAgICB9Ci0KLSAgICAvLyBOb3RlOiBJIGd1ZXNzIHRoYXQgdGhpcyBjb2RlIGFzc3VtZXMgdGhlIFJlY29yZCBtYXkgbmVzdCBsaWtlIHRoaXM6Ci0gICAgLy8gU1RBUlQ6VlBPUwotICAgIC8vIC4uLgotICAgIC8vIFNUQVJUOlZQT1MyCi0gICAgLy8gLi4uCi0gICAgLy8gRU5EOlZQT1MyCi0gICAgLy8gLi4uCi0gICAgLy8gRU5EOlZQT1MKLSAgICAvLwotICAgIC8vIEhvd2V2ZXIgdGhlIGZvbGxvd2luZyBjb2RlIGhhcyBhIGJ1Zy4KLSAgICAvLyBXaGVuIGVycm9yIG9jY3VycyBhZnRlciBjYWxsaW5nIHN0YXJ0UmVjb3JkKCksIHRoZSBlbnRyeSB3aGljaCBpcyBwcm9iYWJseQotICAgIC8vIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgcmVtYWlucyB0byBiZSBpbiB2Tm9kZUxpc3QsIHdoaWxlIGVuZFJlY29yZCgpIGlzIG5vdCBjYWxsZWQuCi0gICAgLy8KLSAgICAvLyBJIGxlYXZlIHRoaXMgY29kZSBhcyBpcyBzaW5jZSBJJ20gbm90IGZhbWlsaWFyIHdpdGggdmNhbGVuZGFyIHNwZWNpZmljYXRpb24uCi0gICAgLy8gQnV0IEkgYmVsaWV2ZSB3ZSBzaG91bGQgcmVmYWN0b3IgdGhpcyBjb2RlIGluIHRoZSBmdXR1cmUuCi0gICAgLy8gVW50aWwgdGhpcywgdGhlIGxhc3QgZW50cnkgaGFzIHRvIGJlIHJlbW92ZWQgd2hlbiBzb21lIGVycm9yIG9jY3Vycy4KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVudHJ5KCkgewotICAgICAgICBWTm9kZSB2bm9kZSA9IG5ldyBWTm9kZSgpOwotICAgICAgICB2bm9kZS5wYXJzZVN0YXR1cyA9IDE7Ci0gICAgICAgIHZub2RlLlZOYW1lID0gIlZDQVJEIjsKLSAgICAgICAgLy8gSSBmZWVsIHRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gZW5kUmVjb3JkKCksIGJ1dCBpdCBjYW5ub3QgYmUgZG9uZSBiZWNhdXNlIG9mCi0gICAgICAgIC8vIHRoZSByZWFzb24gYWJvdmUuCi0gICAgICAgIHZOb2RlTGlzdC5hZGQodm5vZGUpOwotICAgICAgICBtTm9kZUxpc3RQb3MgPSB2Tm9kZUxpc3Quc2l6ZSgpIC0gMTsKLSAgICAgICAgbUN1cnJlbnRWTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbnRyeSgpIHsKLSAgICAgICAgVk5vZGUgZW5kTm9kZSA9IHZOb2RlTGlzdC5nZXQobU5vZGVMaXN0UG9zKTsKLSAgICAgICAgZW5kTm9kZS5wYXJzZVN0YXR1cyA9IDA7Ci0gICAgICAgIHdoaWxlKG1Ob2RlTGlzdFBvcyA+IDApewotICAgICAgICAgICAgbU5vZGVMaXN0UG9zLS07Ci0gICAgICAgICAgICBpZigodk5vZGVMaXN0LmdldChtTm9kZUxpc3RQb3MpKS5wYXJzZVN0YXR1cyA9PSAxKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50Vk5vZGUgPSB2Tm9kZUxpc3QuZ2V0KG1Ob2RlTGlzdFBvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZSA9IG5ldyBQcm9wZXJ0eU5vZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgbUN1cnJlbnRWTm9kZS5wcm9wTGlzdC5hZGQobUN1cnJlbnRQcm9wTm9kZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUdyb3VwKFN0cmluZyBncm91cCkgewotICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BHcm91cFNldC5hZGQoZ3JvdXApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVBhcmFtVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBtQ3VycmVudFBhcmFtVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlQYXJhbVZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoIVZDYXJkVXRpbHMuY29udGFpbnNPbmx5QWxwaGFEaWdpdEh5cGhlbih2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gVkNhcmRVdGlscy5jb252ZXJ0U3RyaW5nQ2hhcnNldCh2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuREVGQVVMVF9JTlRFUk1FRElBVEVfQ0hBUlNFVCwKLSAgICAgICAgICAgICAgICAgICAgVkNhcmRDb25maWcuREVGQVVMVF9JTVBPUlRfQ0hBUlNFVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnRQYXJhbVR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIG1DdXJyZW50UGFyYW1UeXBlLmVxdWFsc0lnbm9yZUNhc2UoIlRZUEUiKSkgewotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcF9UWVBFLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnBhcmFtTWFwLnB1dChtQ3VycmVudFBhcmFtVHlwZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQYXJhbVR5cGUgPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVN0cmluZyhTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIFN0cmluZyB0YXJnZXRDaGFyc2V0KSB7Ci0gICAgICAgIGlmIChtU291cmNlQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldENoYXJzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKG1Tb3VyY2VDaGFyc2V0KTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gY2hhcnNldC5lbmNvZGUob3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAvLyBieXRlQnVmZmVyLmFycmF5KCkgIm1heSIgcmV0dXJuIGJ5dGUgYXJyYXkgd2hpY2ggaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgLy8gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKS4gSGVyZSwgd2Uga2VlcCBvbiB0aGUgc2FmZSBzaWRlLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnl0ZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHRhcmdldENoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJGYWlsZWQgdG8gZW5jb2RlOiBjaGFyc2V0PSIgKyB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZU9uZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHRhcmdldENoYXJzZXQsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscygiQkFTRTY0IikgfHwgZW5jb2RpbmcuZXF1YWxzKCJCIikpIHsKLSAgICAgICAgICAgICAgICAvLyBBc3N1bWUgQkFTRTY0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGlzIDEuCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfYnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHZhbHVlLmdldEJ5dGVzKCksIEJhc2U2NC5OT19XUkFQKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLmVxdWFscygiUVVPVEVELVBSSU5UQUJMRSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZDYXJkVXRpbHMucGFyc2VRdW90ZWRQcmludGFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbVN0cmljdExpbmVCcmVha1BhcnNpbmcsIG1Tb3VyY2VDaGFyc2V0LCB0YXJnZXRDaGFyc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVua25vd24gZW5jb2RpbmcuIEZhbGwgYmFjayB0byBkZWZhdWx0LgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVTdHJpbmcodmFsdWUsIHRhcmdldENoYXJzZXQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlcyhMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX2J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yLmFkZCgiIik7Ci0gICAgICAgICAgICBtQ3VycmVudFByb3BOb2RlLnByb3BWYWx1ZSA9ICIiOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBDb250ZW50VmFsdWVzIHBhcmFtTWFwID0gbUN1cnJlbnRQcm9wTm9kZS5wYXJhbU1hcDsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0YXJnZXRDaGFyc2V0ID0gQ2hhcnNldFV0aWxzLm5hbWVGb3JEZWZhdWx0VmVuZG9yKHBhcmFtTWFwLmdldEFzU3RyaW5nKCJDSEFSU0VUIikpOyAKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gcGFyYW1NYXAuZ2V0QXNTdHJpbmcoIkVOQ09ESU5HIik7IAotICAgICAgICAKLSAgICAgICAgaWYgKHRhcmdldENoYXJzZXQgPT0gbnVsbCB8fCB0YXJnZXRDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRhcmdldENoYXJzZXQgPSBtVGFyZ2V0Q2hhcnNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIG1DdXJyZW50UHJvcE5vZGUucHJvcFZhbHVlX3ZlY3Rvci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uZVZhbHVlKHZhbHVlLCB0YXJnZXRDaGFyc2V0LCBlbmNvZGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWUgPSBsaXN0VG9TdHJpbmcobUN1cnJlbnRQcm9wTm9kZS5wcm9wVmFsdWVfdmVjdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IGxpc3QpewotICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZUxpc3RCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHlwZUxpc3RCLmFwcGVuZCh0eXBlKS5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSB0eXBlTGlzdEIubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID4gMCAmJiB0eXBlTGlzdEIuY2hhckF0KGxlbiAtIDEpID09ICc7JykgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlTGlzdEIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHR5cGVMaXN0Qi50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCl7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMzcwYWU3OC4uYjgyZTY5OCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3NQcm92aWRlclRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5nc1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0xNDQsNCArMTQ0LDUxIEBACiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIFNldHRpbmdzLkJvb2ttYXJrcy5nZXRJbnRlbnRGb3JTaG9ydGN1dChyLCAnKicpKTsKICAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVByb3ZpZGVyTGlzdCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHIgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCBvdXQgd2hhdCB3ZSBwdXQgaW4uCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpLAorICAgICAgICAgICAgICAgICJ0ZXN0MSx0ZXN0Mix0ZXN0MyIpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgdmFsdWUKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgIiIpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgYWRkaW5nIGEgc2Vjb25kIHZhbHVlCisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiK3Rlc3QyIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisKKyAgICAgICAgLy8gVGVzdCBhZGRpbmcgYSB0aGlyZCB2YWx1ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwgIit0ZXN0MyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QxLHRlc3QyLHRlc3QzIiwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCkpOworCisgICAgICAgIC8vIFRlc3QgZGVsZXRpbmcgdGhlIGZpcnN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Mix0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBtaWRkbGUgdmFsdWUgaW4gYSAzIGl0ZW0gbGlzdAorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHIsIFNldHRpbmdzLlNlY3VyZS5MT0NBVElPTl9QUk9WSURFUlNfQUxMT1dFRCwKKyAgICAgICAgICAgICAgICAidGVzdDEsdGVzdDIsdGVzdDMiKTsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsICItdGVzdDIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0MSx0ZXN0MyIsCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQpKTsKKworICAgICAgICAvLyBUZXN0IGRlbGV0aW5nIHRoZSBsYXN0IHZhbHVlIGluIGEgMyBpdGVtIGxpc3QKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhyLCBTZXR0aW5ncy5TZWN1cmUuTE9DQVRJT05fUFJPVklERVJTX0FMTE9XRUQsCisgICAgICAgICAgICAgICAgInRlc3QxLHRlc3QyLHRlc3QzIik7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VELCAiLXRlc3QzIik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDEsdGVzdDIiLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcociwgU2V0dGluZ3MuU2VjdXJlLkxPQ0FUSU9OX1BST1ZJREVSU19BTExPV0VEKSk7CisgICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0QmlkaVRlc3QuamF2YQppbmRleCA4ZTdlNjNlLi5mYjBmMGMxIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC90ZXh0L1N0YXRpY0xheW91dEJpZGlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRCaWRpVGVzdC5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCiAvKioKLSAqIFRlc3RzIFN0YXRpY0xheW91dCBiaWRpIGltcGxlbWVudGF0aW9uLgorICogUXVpY2sgY2hlY2sgb2YgbmF0aXZlIGJpZGkgaW1wbGVtZW50YXRpb24uCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXRCaWRpVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgICAKQEAgLTQxLDczICs0MSw0NyBAQAogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMdHIoKSB7Ci0gICAgICAgIGV4cGVjdEJpZGkoUkVRX0RMLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgImEgdGVzdCIsICIwMDAwMDAiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICJhYmMgIiArIEFMRUYgKyBCRVQgKyBHSU1FTCwgIjAwMDAxMTEiLCBMKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsbFJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfREwsIEFMRUYgKyBTUCArIEFMRUYgKyBCRVQgKyBHSU1FTCArIERBTEVULCAiMTExMTExIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0RMLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnRsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEwMDAiLCBSKTsKKyAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSQWxsTHRyKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjAwMDAwMCIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYSB0ZXN0IiwgIjIyMjIyMiIsIFIpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Ukx0clJ0bCgpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfUiwgImFiYyAiICsgQUxFRiArIEJFVCArIEdJTUVMLCAiMDAwMTExMSIsIFIpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9SLCAiYWJjICIgKyBBTEVGICsgQkVUICsgR0lNRUwsICIyMjIxMTExIiwgUik7CiAgICAgfQogICAgIAogICAgIC8vQFNtYWxsVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMQWxsUnRsKCkgewotICAgICAgICBleHBlY3RCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9MLCBBTEVGICsgU1AgKyBBTEVGICsgQkVUICsgR0lNRUwgKyBEQUxFVCwgIjExMTExMSIsIEwpOwogICAgIH0KICAgICAKICAgICAvL0BTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TFJ0bEx0cigpIHsKLSAgICAgICAgZXhwZWN0QmlkaShSRVFfTCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTAwMDAiLCBMKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGV4cGVjdEJpZGkoaW50IGRpciwgU3RyaW5nIHRleHQsIAotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTGV2ZWxzLCBpbnQgZXhwZWN0ZWREaXIpIHsKLSAgICAgICAgY2hhcltdIGNocyA9IHRleHQudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IG4gPSBjaHMubGVuZ3RoOwotICAgICAgICBieXRlW10gY2hJbmZvID0gbmV3IGJ5dGVbbl07Ci0gICAgICAgIAotICAgICAgICBpbnQgcmVzdWx0RGlyID0gU3RhdGljTGF5b3V0LmJpZGkoZGlyLCBjaHMsIGNoSW5mbywgbiwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJpbmZvOiIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoY2hJbmZvW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cuaSgiQklESSIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjaGFyW10gcmVzdWx0TGV2ZWxDaGFycyA9IG5ldyBjaGFyW25dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcmVzdWx0TGV2ZWxDaGFyc1tpXSA9IChjaGFyKSgnMCcgKyBjaEluZm9baV0pOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByZXN1bHRMZXZlbHMgPSBuZXcgU3RyaW5nKHJlc3VsdExldmVsQ2hhcnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdGlvbiIsIGV4cGVjdGVkRGlyLCByZXN1bHREaXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxldmVscyIsIGV4cGVjdGVkTGV2ZWxzLCByZXN1bHRMZXZlbHMpOworICAgICAgICBleHBlY3ROYXRpdmVCaWRpKFJFUV9ETCwgIEFMRUYgKyBCRVQgKyBHSU1FTCArICIgYWJjIiwgIjExMTEyMjIiLCBSKTsKICAgICB9CiAgICAgCiAgICAgLy9AU21hbGxUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUJpZGkoKSB7Ci0gICAgICAgIC8vIG5hdGl2ZSBiaWRpIHJldHVybnMgbGV2ZWxzLCBub3Qgc2ltcGx5IGRpcmVjdGlvbnMKLSAgICAgICAgZXhwZWN0TmF0aXZlQmlkaShSRVFfREwsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTExMjIyIiwgUik7CisgICAgICAgIGV4cGVjdE5hdGl2ZUJpZGkoUkVRX0wsICBBTEVGICsgQkVUICsgR0lNRUwgKyAiIGFiYyIsICIxMTEwMDAwIiwgTCk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBleHBlY3ROYXRpdmVCaWRpKGludCBkaXIsIFN0cmluZyB0ZXh0LCAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0RGlyZWN0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgYW5kcm9pZC50ZXh0LkxheW91dC5EaXJlY3Rpb25zOworaW1wb3J0IGFuZHJvaWQudGV4dC5TdGF0aWNMYXlvdXRUZXN0LkxheW91dEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBTdGF0aWNMYXlvdXREaXJlY3Rpb25zVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEFMRUYgPSAnXHUwNWQwJzsKKworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdGlvbnMgZGlycyhpbnQgLi4uIGRpcnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3Rpb25zKGRpcnMpOworICAgIH0KKworICAgIC8vIGNvbnN0YW50cyBmcm9tIExheW91dCB0aGF0IGFyZSBwYWNrYWdlLXByb3RlY3RlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVOR1RIX01BU0sgPSAweDAzZmZmZmZmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fTEVWRUxfU0hJRlQgPSAyNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUlVOX0xFVkVMX01BU0sgPSAweDNmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fUlRMX0ZMQUcgPSAxIDw8IFJVTl9MRVZFTF9TSElGVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpcmVjdGlvbnMgRElSU19BTExfTEVGVF9UT19SSUdIVCA9CisgICAgICAgIG5ldyBEaXJlY3Rpb25zKG5ldyBpbnRbXSB7IDAsIFJVTl9MRU5HVEhfTUFTSyB9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXJlY3Rpb25zIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQgPQorICAgICAgICBuZXcgRGlyZWN0aW9ucyhuZXcgaW50W10geyAwLCBSVU5fTEVOR1RIX01BU0sgfCBSVU5fUlRMX0ZMQUcgfSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTFZMMV8xID0gMSB8ICgxIDw8IFJVTl9MRVZFTF9TSElGVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExWTDJfMSA9IDEgfCAoMiA8PCBSVU5fTEVWRUxfU0hJRlQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMVkwyXzIgPSAyIHwgKDIgPDwgUlVOX0xFVkVMX1NISUZUKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRleHRzID0geworICAgICAgICAiIiwKKyAgICAgICAgIiAiLAorICAgICAgICAiYSIsCisgICAgICAgICJhMSIsCisgICAgICAgICJhQSIsCisgICAgICAgICJhMWIiLAorICAgICAgICAiYTFBIiwKKyAgICAgICAgImFBMSIsCisgICAgICAgICJhQWIiLAorICAgICAgICAiYUExQiIsCisgICAgICAgICJhQTFCMiIsCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgICJBIiwKKyAgICAgICAgIkExIiwKKyAgICAgICAgIkFhIiwKKyAgICAgICAgIkExQiIsCisgICAgICAgICJBMWEiLAorICAgICAgICAiQWExIiwKKyAgICAgICAgIkFhQiIKKyAgICB9OworCisgICAgLy8gRXhwZWN0ZWQgZGlyZWN0aW9ucyBhcmUgYW4gYXJyYXkgb2Ygc3RhcnQvbGVuZ3RoK2xldmVsIHBhaXJzLAorICAgIC8vIGluIHZpc3VhbCBvcmRlciBmcm9tIHRoZSBsZWFkaW5nIG1hcmdpbi4KKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3Rpb25zW10gZXhwZWN0ZWQgPSB7CisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIERJUlNfQUxMX0xFRlRfVE9fUklHSFQsCisgICAgICAgIGRpcnMoMCwgMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgRElSU19BTExfTEVGVF9UT19SSUdIVCwKKyAgICAgICAgZGlycygwLCAyLCAyLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDIsIExWTDJfMSwgMSwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCAxLCAxLCBMVkwxXzEsIDIsIDEpLAorICAgICAgICBkaXJzKDAsIDEsIDMsIExWTDFfMSwgMiwgTFZMMl8xLCAxLCBMVkwxXzEpLAorICAgICAgICBkaXJzKDAsIDEsIDQsIExWTDJfMSwgMywgTFZMMV8xLCAyLCBMVkwyXzEsIDEsIExWTDFfMSksCisKKyAgICAgICAgLy8gcnRsCisgICAgICAgIERJUlNfQUxMX1JJR0hUX1RPX0xFRlQsCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzEpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgTFZMMV8xKSwKKyAgICAgICAgZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMiksCisgICAgICAgIGRpcnMoMCwgTFZMMV8xLCAxLCBMVkwyXzIpLAorICAgICAgICBkaXJzKDAsIExWTDFfMSwgMSwgTFZMMl8xLCAyLCBMVkwxXzEpLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHNldWRvQmlkaVRvUmVhbChTdHJpbmcgc3JjKSB7CisgICAgICAgIGNoYXJbXSBjaGFycyA9IHNyYy50b0NoYXJBcnJheSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjaGFyc1tqXTsKKyAgICAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdEJykgeworICAgICAgICAgICAgICAgIGNoYXJzW2pdID0gKGNoYXIpKEFMRUYgKyBjIC0gJ0EnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzLCAwLCBjaGFycy5sZW5ndGgpOworICAgIH0KKworICAgIC8vIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0aW9ucygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigiXG4iKTsKKyAgICAgICAgRm9ybWF0dGVyIGYgPSBuZXcgRm9ybWF0dGVyKGJ1Zik7CisKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKHRleHRzW2ldKSk7CisgICAgICAgICAgICBjaGVja0RpcmVjdGlvbnMoYi5idWlsZCgpLCBpLCBiLnRleHQsIGV4cGVjdGVkLCBmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgZmFpbChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWlsaW5nV2hpdGVzcGFjZSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJBYiAgIGMiKSk7CisgICAgICAgIGZsb2F0IHdpZHRoID0gYi5wYWludC5tZWFzdXJlVGV4dChiLnRleHQsIDAsIDUpOyAgLy8gZXhjbHVkZSAnYycKKyAgICAgICAgYi5zZXRXaWR0aChNYXRoLnJvdW5kKHdpZHRoKSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBpZiAobC5nZXRMaW5lQ291bnQoKSAhPSAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXhwZWN0ZWQgMiBsaW5lcywgZ290OiAiICsgbC5nZXRMaW5lQ291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgRGlyZWN0aW9ucyByZXN1bHQgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworICAgICAgICBEaXJlY3Rpb25zIGV4cGVjdGVkID0gZGlycygwLCBMVkwxXzEsIDEsIExWTDJfMSwgMiwgMyB8ICgxIDw8IExheW91dC5SVU5fTEVWRUxfU0hJRlQpKTsKKyAgICAgICAgZXhwZWN0RGlyZWN0aW9ucygic3BsaXQgbGluZSIsIGV4cGVjdGVkLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0VG9SaWdodE9mKCkgeworICAgICAgICBMYXlvdXRCdWlsZGVyIGIgPSBTdGF0aWNMYXlvdXRUZXN0LmJ1aWxkZXIoKTsKKyAgICAgICAgYi5zZXRUZXh0KHBzZXVkb0JpZGlUb1JlYWwoImFBMUIyIikpOworICAgICAgICAvLyB2aXN1YWwgYTJCMUEgcG9zaXRpb25zIDA0MzIxCisgICAgICAgIC8vIDA6IHxhMkIxQSwgc3Ryb25nIGlzIHNvbCwgYWZ0ZXIgLT4gMAorICAgICAgICAvLyAxOiBhfDJCMUEsIHN0cm9uZyBpcyBhLCBhZnRlciAtPiwgMQorICAgICAgICAvLyAyOiBhMnxCMUEsIHN0cm9uZyBpcyBCLCBhZnRlciAtPiA0CisgICAgICAgIC8vIDM6IGEyQnwxQSwgc3Ryb25nIGlzIEIsIGJlZm9yZSAtPiAzCisgICAgICAgIC8vIDQ6IGEyQjF8QSwgc3Ryb25nIGlzIEEsIGFmdGVyIC0+IDIKKyAgICAgICAgLy8gNTogYTJCMUF8LCBzdHJvbmcgaXMgZW9sLCBiZWZvcmUgLT4gNQorICAgICAgICBpbnRbXSBleHBlY3RlZCA9IHsgMCwgMSwgNCwgMywgMiwgNSB9OworICAgICAgICBMYXlvdXQgbCA9IGIuYnVpbGQoKTsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnQgdCA9IGwuZ2V0T2Zmc2V0VG9SaWdodE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byByaWdodCBvZjogIiArIG4gKyAiIGV4cGVjdGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldICsgIiBnb3Q6ICIgKyB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRUb0xlZnRPZigpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIGIuc2V0VGV4dChwc2V1ZG9CaWRpVG9SZWFsKCJhQTFCMiIpKTsKKyAgICAgICAgaW50W10gZXhwZWN0ZWQgPSB7IDAsIDEsIDQsIDMsIDIsIDUgfTsKKyAgICAgICAgTGF5b3V0IGwgPSBiLmJ1aWxkKCk7CisgICAgICAgIGludCBuID0gNTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGV4cGVjdGVkLmxlbmd0aCAtIDE7IC0taSA+PSAwOykgeworICAgICAgICAgICAgaW50IHQgPSBsLmdldE9mZnNldFRvTGVmdE9mKG4pOworICAgICAgICAgICAgaWYgKHQgIT0gZXhwZWN0ZWRbaV0pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJvZmZzZXRbIiArIGkgKyAiXSB0byBsZWZ0IG9mOiAiICsgbiArICIgZXhwZWN0ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gKyAiIGdvdDogIiArIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1dGlsaXR5LCBub3QgcmVhbGx5IGEgdGVzdAorICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdE1lYXN1cmVUZXh0MSgpIHsKKyAgICAgICAgTGF5b3V0QnVpbGRlciBiID0gU3RhdGljTGF5b3V0VGVzdC5idWlsZGVyKCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkFCQyI7IC8vICJhYkFCIgorICAgICAgICBiLnNldFRleHQocHNldWRvQmlkaVRvUmVhbCh0ZXh0KSk7CisgICAgICAgIExheW91dCBsID0gYi5idWlsZCgpOworICAgICAgICBEaXJlY3Rpb25zIGRpcmVjdGlvbnMgPSBsLmdldExpbmVEaXJlY3Rpb25zKDApOworCisgICAgICAgIFRleHRQYWludCB3b3JrUGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7CisKKyAgICAgICAgaW50IGRpciA9IC0xOyAvLyBMRUZUX1RPX1JJR0hUCisgICAgICAgIGJvb2xlYW4gdHJhaWxpbmcgPSB0cnVlOworICAgICAgICBib29sZWFuIGFsdCA9IHRydWU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGRpciA9IC1kaXI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSAhdHJhaWxpbmc7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMCwgZW5kID0gYi50ZXh0Lmxlbmd0aCgpOyBvZmZzZXQgPD0gZW5kOyArK29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IExheW91dC5tZWFzdXJlVGV4dChiLnBhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgb2Zmc2V0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLCBkaXJlY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkJJREkiLCAiZGlyOiAiICsgZGlyICsgIiB0cmFpbDogIiArIHRyYWlsaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mZnNldDogIiArIG9mZnNldCArICIgd2lkdGg6ICIgKyB3aWR0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIXRyYWlsaW5nKTsKKyAgICAgICAgfSB3aGlsZSAoZGlyID4gMCk7CisgICAgfQorICAgICovCisKKyAgICAvLyB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGFycmF5cyBpbiBoZXgKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaGV4QXJyYXkoaW50W10gYXJyYXkpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgneycpOworICAgICAgICBmb3IgKGludCBpIDogYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhpKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RpcmVjdGlvbnMoTGF5b3V0IGwsIGludCBpLCBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgIERpcmVjdGlvbnNbXSBleHBlY3RlZERpcnMsIEZvcm1hdHRlciBmKSB7CisgICAgICAgIERpcmVjdGlvbnMgZXhwZWN0ZWQgPSBleHBlY3RlZERpcnNbaV07CisgICAgICAgIERpcmVjdGlvbnMgcmVzdWx0ID0gbC5nZXRMaW5lRGlyZWN0aW9ucygwKTsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGV4cGVjdGVkLm1EaXJlY3Rpb25zLCByZXN1bHQubURpcmVjdGlvbnMpKSB7CisgICAgICAgICAgICBmLmZvcm1hdCgiJW5bJTJkXSAnJXMnLCAlcyAhPSAlcyIsIGksIHRleHQsCisgICAgICAgICAgICAgICAgICAgIGhleEFycmF5KGV4cGVjdGVkLm1EaXJlY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgaGV4QXJyYXkocmVzdWx0Lm1EaXJlY3Rpb25zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0RGlyZWN0aW9ucyhTdHJpbmcgbXNnLCBEaXJlY3Rpb25zIGV4cGVjdGVkLCBEaXJlY3Rpb25zIHJlc3VsdCkgeworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoZXhwZWN0ZWQubURpcmVjdGlvbnMsIHJlc3VsdC5tRGlyZWN0aW9ucykpIHsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkOiAiICsgaGV4QXJyYXkoZXhwZWN0ZWQubURpcmVjdGlvbnMpICsKKyAgICAgICAgICAgICAgICAgICAgIiBnb3Q6ICIgKyBoZXhBcnJheShyZXN1bHQubURpcmVjdGlvbnMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3RleHQvU3RhdGljTGF5b3V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKaW5kZXggMWY1OGEyYy4uZDU1NGE1MCAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdGV4dC9TdGF0aWNMYXlvdXRUZXN0LmphdmEKQEAgLTIyOCwxMSArMjI4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMYXlvdXRCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgTGF5b3V0QnVpbGRlciBidWlsZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IExheW91dEJ1aWxkZXIoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBMYXlvdXRCdWlsZGVyIHsKICAgICAgICAgU3RyaW5nIHRleHQgPSAiVGhpcyBpcyBhIHRlc3QiOwogICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBuZXcgVGV4dFBhaW50KCk7IC8vIGRlZmF1bHQKICAgICAgICAgaW50IHdpZHRoID0gMTAwOwpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMmIwZC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0V4cGFuZGFibGVMaXN0U2NlbmFyaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLS8qKgotICogVXRpbGl0eSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB2YXJpb3VzIEV4cGFuZGFibGUgTGlzdCBzY2VuYXJpb3MuCi0gKiA8cD4KLSAqIFdBUk5JTkc6IEEgbG90IG9mIHRoZSBmZWF0dXJlcyBhcmUgbWl4ZWQgYmV0d2VlbiBMaXN0VmlldydzIGV4cGVjdGVkIHBvc2l0aW9uCi0gKiAoZmxhdCBsaXN0IHBvc2l0aW9uKSBhbmQgYW4gRXhwYW5kYWJsZUxpc3RWaWV3J3MgZXhwZWN0ZWQgcG9zaXRpb24uICBZb3UgbXVzdCBhZGQvY2hhbmdlCi0gKiBmZWF0dXJlcyBhcyB5b3UgbmVlZCB0aGVtLgotICogCi0gKiBAc2VlIExpc3RTY2VuYXJpbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBleHRlbmRzIExpc3RTY2VuYXJpbyB7Ci0gICAgcHJvdGVjdGVkIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsgCi0gICAgcHJvdGVjdGVkIExpc3Q8TXlHcm91cD4gbUdyb3VwczsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTGlzdFZpZXcgY3JlYXRlTGlzdFZpZXcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXhwYW5kYWJsZUxpc3RWaWV3KHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBQYXJhbXMgY3JlYXRlUGFyYW1zKCkgewotICAgICAgICByZXR1cm4gbmV3IEV4cGFuZGFibGVQYXJhbXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyKExpc3RWaWV3IGxpc3RWaWV3KSB7Ci0gICAgICAgICgoRXhwYW5kYWJsZUxpc3RWaWV3KSBsaXN0Vmlldykuc2V0QWRhcHRlcihtQWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgY3JlYXRlQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNeUFkYXB0ZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEFuZFZhbGlkYXRlUGFyYW1zKFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgRXhwYW5kYWJsZVBhcmFtcyBleHBhbmRhYmxlUGFyYW1zID0gKEV4cGFuZGFibGVQYXJhbXMpIHBhcmFtczsKLSAgICAgICAgCi0gICAgICAgIGludFtdIG51bUNoaWxkcmVuID0gZXhwYW5kYWJsZVBhcmFtcy5tTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBtR3JvdXBzID0gbmV3IEFycmF5TGlzdDxNeUdyb3VwPihudW1DaGlsZHJlbi5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtR3JvdXBzLmFkZChuZXcgTXlHcm91cChudW1DaGlsZHJlbltpXSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBleHBhbmRhYmxlUGFyYW1zLnN1cGVyU2V0TnVtSXRlbXMoKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLnJlYWRBbmRWYWxpZGF0ZVBhcmFtcyhwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXhwYW5kYWJsZUxpc3RWaWV3IHdpZGdldC4KLSAgICAgKiBAcmV0dXJuIFRoZSBtYWluIHdpZGdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RWaWV3IGdldEV4cGFuZGFibGVMaXN0VmlldygpIHsKLSAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlTGlzdFZpZXcpIHN1cGVyLmdldExpc3RWaWV3KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBhbmRhYmxlUGFyYW1zIGV4dGVuZHMgUGFyYW1zIHsKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTnVtQ2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICogIAotICAgICAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW5QZXJHcm91cCBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHBlciBncm91cC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldE51bUNoaWxkcmVuKGludFtdIG51bUNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBtTnVtQ2hpbGRyZW4gPSBudW1DaGlsZHJlbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgc3VwZXJjbGFzcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mCi0gICAgICAgICAqIGdyb3VwcyBhbmQgY2hpbGRyZW4gcGVyIGdyb3VwLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBFeHBhbmRhYmxlUGFyYW1zIHN1cGVyU2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgICAgICBpbnQgbnVtSXRlbXMgPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobU51bUNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbU51bUNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zICs9IG1OdW1DaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN1cGVyLnNldE51bUl0ZW1zKG51bUl0ZW1zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUGFyYW1zIHNldE51bUl0ZW1zKGludCBudW1JdGVtcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXNlIHNldE51bUdyb3VwcyBhbmQgc2V0TnVtQ2hpbGRyZW4gaW5zdGVhZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRGYWRpbmdFZGdlU2NyZWVuU2l6ZUZhY3Rvcihkb3VibGUgZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0RmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IoZmFkaW5nRWRnZVNjcmVlblNpemVGYWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKGRvdWJsZSBpdGVtU2NyZWVuU2l6ZUZhY3RvcikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtU2NyZWVuU2l6ZUZhY3RvcihpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0SXRlbXNGb2N1c2FibGUoYm9vbGVhbiBpdGVtc0ZvY3VzYWJsZSkgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRJdGVtc0ZvY3VzYWJsZShpdGVtc0ZvY3VzYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0TXVzdEZpbGxTY3JlZW4oYm9vbGVhbiBmaWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldE11c3RGaWxsU2NyZWVuKGZpbGxTY3JlZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKGludCBwb3NpdGlvbiwgZG91YmxlIGl0ZW1TY3JlZW5TaXplRmFjdG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uU2NyZWVuU2l6ZUZhY3Rvck92ZXJyaWRlKHBvc2l0aW9uLCBpdGVtU2NyZWVuU2l6ZUZhY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0UG9zaXRpb25VbnNlbGVjdGFibGUoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEV4cGFuZGFibGVQYXJhbXMpIHN1cGVyLnNldFBvc2l0aW9uVW5zZWxlY3RhYmxlKHBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRXhwYW5kYWJsZVBhcmFtcyBzZXRTdGFja0Zyb21Cb3R0b20oYm9vbGVhbiBzdGFja0Zyb21Cb3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0U3RhY2tGcm9tQm90dG9tKHN0YWNrRnJvbUJvdHRvbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEV4cGFuZGFibGVQYXJhbXMgc2V0U3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbihpbnQgc3RhcnRpbmdTZWxlY3Rpb25Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChFeHBhbmRhYmxlUGFyYW1zKSBzdXBlci5zZXRTdGFydGluZ1NlbGVjdGlvblBvc2l0aW9uKHN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBFeHBhbmRhYmxlUGFyYW1zIHNldENvbm5lY3RBZGFwdGVyKGJvb2xlYW4gY29ubmVjdEFkYXB0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhwYW5kYWJsZVBhcmFtcykgc3VwZXIuc2V0Q29ubmVjdEFkYXB0ZXIoY29ubmVjdEFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHN0cmluZyBmb3IgdGhlIHZhbHVlIG9mIHNvbWUgaXRlbS4KLSAgICAgKiBAcGFyYW0gcGFja2VkUG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLgotICAgICAqIEByZXR1cm4gVGhlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhbHVlQXRQb3NpdGlvbihsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbikpCi0gICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbi5nZXQoRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uQ2hpbGQocGFja2VkUG9zaXRpb24pKQotICAgICAgICAgICAgICAgICAgICAubmFtZTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuIG1Hcm91cHMuZ2V0KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgLm5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYWNrZWRQb3NpdGlvbiBpcyBub3QgYSB2YWxpZCBwb3NpdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24uCi0gICAgICogQHJldHVybiBXaGV0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPdXRPZkJvdW5kcyhsb25nIHBhY2tlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFja2VkUG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcG9zaXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZ3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Hcm91cChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICBpZiAoZ3JvdXAgPj0gbUdyb3Vwcy5zaXplKCkgfHwgZ3JvdXAgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHR5cGUgPT0gRXhwYW5kYWJsZUxpc3RWaWV3LlBBQ0tFRF9QT1NJVElPTl9UWVBFX0NISUxEKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGQgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25DaGlsZChwYWNrZWRQb3NpdGlvbik7IAotICAgICAgICAgICAgaWYgKGNoaWxkID49IG1Hcm91cHMuZ2V0KGdyb3VwKS5jaGlsZHJlbi5zaXplKCkgfHwgY2hpbGQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHZpZXcgZm9yIHRoZSBwYWNrZWQgcG9zaXRpb24sIHBvc3NpYmx5IHJldXNpbmcgdGhlIGNvbnZlcnRWaWV3LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWRQb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gZ2V0IGEgdmlldyBmb3IuCi0gICAgICogQHBhcmFtIGNvbnZlcnRWaWV3IE9wdGlvbmFsIHZpZXcgdG8gY29udmVydC4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBmdXR1cmUgcGFyZW50LgotICAgICAqIEByZXR1cm4gQSB2aWV3LgotICAgICAqLwotICAgIHByaXZhdGUgVmlldyBnZXRWaWV3KGxvbmcgcGFja2VkUG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGlzT3V0T2ZCb3VuZHMocGFja2VkUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwb3NpdGlvbiBvdXQgb2YgcmFuZ2UgZm9yIGFkYXB0ZXIhIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSBnZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgZmluYWwgaW50IGZsUG9zID0gZWx2LmdldEZsYXRMaXN0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pOyAKLSAgICAgICAgCi0gICAgICAgIGlmIChjb252ZXJ0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAoKFRleHRWaWV3KSBjb252ZXJ0Vmlldykuc2V0VGV4dChnZXRWYWx1ZUF0UG9zaXRpb24ocGFja2VkUG9zaXRpb24pKTsKLSAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldElkKGZsUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gZ2V0SGVpZ2h0Rm9yUG9zaXRpb24oZmxQb3MpOwotICAgICAgICByZXR1cm4gY3JlYXRlVmlldyhwYWNrZWRQb3NpdGlvbiwgZmxQb3MsIHBhcmVudCwgZGVzaXJlZEhlaWdodCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHZpZXcgZm9yIGEgZ3JvdXAgb3IgY2hpbGQgcG9zaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhY2tlZFBvc2l0aW9uIFRoZSBwYWNrZWQgcG9zaXRpb24gKGhhcyB0eXBlLCBncm91cCBwb3MsIGFuZCBvcHRpb25hbGx5IGNoaWxkIHBvcykuCi0gICAgICogQHBhcmFtIGZsUG9zIFRoZSBmbGF0IGxpc3QgcG9zaXRpb24gKHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBMaXN0VmlldyBnb2VzIGJ5KS4KLSAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdmlldy4KLSAgICAgKiBAcGFyYW0gZGVzaXJlZEhlaWdodCBUaGUgZGVzaXJlZCBoZWlnaHQuCi0gICAgICogQHJldHVybiBBIHZpZXcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXcgY3JlYXRlVmlldyhsb25nIHBhY2tlZFBvc2l0aW9uLCBpbnQgZmxQb3MsIFZpZXdHcm91cCBwYXJlbnQsIGludCBkZXNpcmVkSGVpZ2h0KSB7Ci0gICAgICAgIFRleHRWaWV3IHJlc3VsdCA9IG5ldyBUZXh0VmlldyhwYXJlbnQuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEhlaWdodChkZXNpcmVkSGVpZ2h0KTsKLSAgICAgICAgcmVzdWx0LnNldFRleHQoZ2V0VmFsdWVBdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uKSk7Ci0gICAgICAgIGZpbmFsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgcmVzdWx0LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgICAgIHJlc3VsdC5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgcmVzdWx0LnNldFBhZGRpbmcoMzYsIDAsIDAsIDApOwotICAgICAgICByZXN1bHQuc2V0SWQoZmxQb3MpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ3JvdXAgaW5kZXggY29udGFpbmluZyBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvciBhdAotICAgICAqIGxlYXN0IG9uZSBjaGlsZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbnVtQ2hpbGRyZW4gVGhlIGdyb3VwIG11c3QgaGF2ZSB0aGlzIGFtb3VudCwgb3IgLTEgaWYgdXNpbmcKLSAgICAgKiAgICAgICAgICAgIGF0TGVhc3RPbmVDaGlsZC4KLSAgICAgKiBAcGFyYW0gYXRMZWFzdE9uZUNoaWxkIFRoZSBncm91cCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkLCBvciBmYWxzZQotICAgICAqICAgICAgICAgICAgaWYgdXNpbmcgbnVtQ2hpbGRyZW4uCi0gICAgICogQHJldHVybiBBIGdyb3VwIGluZGV4IHdpdGggdGhlIHJlcXVpcmVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihpbnQgbnVtQ2hpbGRyZW4sIGJvb2xlYW4gYXRMZWFzdE9uZUNoaWxkKSB7Ci0gICAgICAgIGZpbmFsIEV4cGFuZGFibGVMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gYWRhcHRlci5nZXRHcm91cENvdW50KCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgZmluYWwgaW50IGN1ck51bUNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVtQ2hpbGRyZW4gPT0gY3VyTnVtQ2hpbGRyZW4gfHwgYXRMZWFzdE9uZUNoaWxkICYmIGN1ck51bUNoaWxkcmVuID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PE15R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIG1Hcm91cHM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1BZGFwdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBleHBhbmRhYmxlIGxpc3QgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgTXlBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckNoaWxkKGdyb3VwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENoaWxkSWQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uZ2V0KGNoaWxkUG9zaXRpb24pLmlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGlsZHJlbkNvdW50KGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUdyb3Vwcy5nZXQoZ3JvdXBQb3NpdGlvbikuY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmlldyhFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JDaGlsZChncm91cFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICBjaGlsZFBvc2l0aW9uKSwgY29udmVydFZpZXcsIHBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEdyb3VwKGludCBncm91cFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdFBvc2l0aW9uKEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEdyb3VwSWQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtR3JvdXBzLmdldChncm91cFBvc2l0aW9uKS5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldEdyb3VwVmlldyhpbnQgZ3JvdXBQb3NpdGlvbiwgYm9vbGVhbiBpc0V4cGFuZGVkLCBWaWV3IGNvbnZlcnRWaWV3LAotICAgICAgICAgICAgICAgIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWaWV3KEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkZvckdyb3VwKGdyb3VwUG9zaXRpb24pLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VmlldywgcGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2hpbGRTZWxlY3RhYmxlKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdGFibGVJZHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15R3JvdXAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAxMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIExpc3Q8TXlDaGlsZD4gY2hpbGRyZW47Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlHcm91cChpbnQgbnVtQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAgIiArIGlkOwotICAgICAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE15Q2hpbGQ+KG51bUNoaWxkcmVuKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW47IGkrKykgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTXlDaGlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2hpbGQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1OZXh0SWQgPSAyMDAwOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIGxvbmcgaWQgPSBtTmV4dElkKys7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTXlDaGlsZCgpIHsKLSAgICAgICAgICAgIG5hbWUgPSAiQ2hpbGQgIiArIGlkOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXQoUGFyYW1zIHBhcmFtcykgewotICAgICAgICBpbml0KChFeHBhbmRhYmxlUGFyYW1zKSBwYXJhbXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgTGlzdFNjZW5hcmlvI2luaXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvblJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5MzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9Kc29uUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitwdWJsaWMgZmluYWwgY2xhc3MgSnNvblJlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSwgdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUFycmF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmhhc05leHQoKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogXCJhbmRyb2lkXCIsIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYW5hbmEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie30iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRGYWxzZShyZWFkZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNraXBPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoCisgICAgICAgICAgICAgICAgIntcImFcIjogeyBcImNcIjogW10sIFwiZFwiOiBbdHJ1ZSwgdHJ1ZSwge31dIH0sIFwiYlwiOiBcImJhbmFuYVwifSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLnNraXBWYWx1ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHJlYWRlci5za2lwVmFsdWUoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJ7XG4iICsKKyAgICAgICAgICAgICAgICAiICAgXCJoZWxsb1wiOiB0cnVlLFxuIiArCisgICAgICAgICAgICAgICAgIiAgIFwiZm9vXCI6IFtcIndvcmxkXCJdXG4iICsKKyAgICAgICAgICAgICAgICAifSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiIikpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Ub3BMZXZlbE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ0cnVlIikpLm5leHRCb29sZWFuKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyVW5lc2NhcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltcImFcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJhXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXCJcIiwiCisgICAgICAgICAgICAgICAgKyAiXCI6XCIsIgorICAgICAgICAgICAgICAgICsgIlwiLFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcYlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcZlwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcblwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcclwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdFwiLCIKKyAgICAgICAgICAgICAgICArICJcIiBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXFxcXCIsIgorICAgICAgICAgICAgICAgICsgIlwie1wiLCIKKyAgICAgICAgICAgICAgICArICJcIn1cIiwiCisgICAgICAgICAgICAgICAgKyAiXCJbXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXVwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMDBcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJcXHUwMDE5XCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MjBBQ1wiIgorICAgICAgICAgICAgICAgICsgIl0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhXCIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjoiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIsIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXGIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcZiIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXHIiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInsiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ9IiwgcmVhZGVyLm5leHRTdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIl0iLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcMCIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAxOSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjBBQyIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2Vyc1dpdGhGcmFjdGlvbmFsUGFydFNwZWNpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWzEuMCwxLjAsMS4wXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIubmV4dEludCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCByZWFkZXIubmV4dExvbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcganNvbiA9ICJbLTAuMCwiCisgICAgICAgICAgICAgICAgKyAiMS4wLCIKKyAgICAgICAgICAgICAgICArICIxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCIKKyAgICAgICAgICAgICAgICArICI0LjlFLTMyNCwiCisgICAgICAgICAgICAgICAgKyAiMC4wLCIKKyAgICAgICAgICAgICAgICArICItMC41LCIKKyAgICAgICAgICAgICAgICArICIyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOCwiCisgICAgICAgICAgICAgICAgKyAiMy4xNDE1OTI2NTM1ODk3OTMsIgorICAgICAgICAgICAgICAgICsgIjIuNzE4MjgxODI4NDU5MDQ1XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjc5NzY5MzEzNDg2MjMxNTdFMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQuOUUtMzI0LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMC41LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuMjI1MDczODU4NTA3MjAxNEUtMzA4LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzkzLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIuNzE4MjgxODI4NDU5MDQ1LCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIltOYU5dIjsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0RG91YmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGpzb24gPSAiWzAsMCwwLCIKKyAgICAgICAgICAgICAgICArICIxLDEsMSwiCisgICAgICAgICAgICAgICAgKyAiLTEsLTEsLTEsIgorICAgICAgICAgICAgICAgICsgIi05MjIzMzcyMDM2ODU0Nzc1ODA4LCIKKyAgICAgICAgICAgICAgICArICI5MjIzMzcyMDM2ODU0Nzc1ODA3XSI7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLm5leHRJbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjAsIHJlYWRlci5uZXh0RG91YmxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCByZWFkZXIubmV4dERvdWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xTCwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5uZXh0SW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEuMCwgcmVhZGVyLm5leHREb3VibGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEludCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy5NSU5fVkFMVUUsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0SW50KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLk1BWF9WQUxVRSwgcmVhZGVyLm5leHRMb25nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBmYWlscyBiZWNhdXNlIHRoZXJlJ3Mgbm8gZG91YmxlIGZvciA5MjIzMzcyMDM2ODU0Nzc1ODA2LCBhbmQKKyAgICAgKiBvdXIgbG9uZyBwYXJzaW5nIHVzZXMgRG91YmxlLnBhcnNlRG91YmxlKCkgZm9yIGZyYWN0aW9uYWwgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RIaWdoUHJlY2lzaW9uTG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIls5MjIzMzcyMDM2ODU0Nzc1ODA2LjAwMF0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwNkwsIHJlYWRlci5uZXh0TG9uZygpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bWJlcldpdGhPY3RhbFByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBqc29uID0gIlswMV0iOworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TG9uZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHREb3VibGUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsZmFsc2VdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhKc29uVG9rZW4uRU5EX0RPQ1VNRU5ULCByZWFkZXIucGVlaygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDYXNlTGl0ZXJhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIltUcnVlLFRydUUsRmFsc2UsRkFMU0UsTlVMTCxudWxMXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSnNvblRva2VuLkVORF9ET0NVTUVOVCwgcmVhZGVyLnBlZWsoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOn0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZUVuZE9mSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlLCIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZWx5Q2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOltdfSIpKTsKKyAgICAgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIubmV4dE5hbWUoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6W119IikpOworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZX0iKSk7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgcmVhZGVyLnBlZWsoKTsKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5leHRGYWlsdXJlc0RvTm90QWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U3RyaW5nKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuZW5kT2JqZWN0KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHJlYWRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpzb25Ub2tlbi5FTkRfRE9DVU1FTlQsIHJlYWRlci5wZWVrKCkpOworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTnVsbElzTm90TnVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW1wibnVsbFwiXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTGl0ZXJhbElzTm90QVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbbnVsbF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3ROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnROYW1lVmFsdWVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIj10cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigie1wiYVwiPT50cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdENvbW1lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLy8gY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyMgY29tbWVudCBcbiB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWy8qIGNvbW1lbnQgKi8gdHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50Q29tbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlsvLyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbIyBjb21tZW50IFxuIHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLyogY29tbWVudCAqLyB0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoInthOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbnF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7YTp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFNpbmdsZVF1b3RlZE5hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7J2EnOnRydWV9IikpOworICAgICAgICByZWFkZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0TmFtZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigieydhJzp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0cmljdFVucXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW2FdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTdHJpbmcoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5xdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbYV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZWFkZXIubmV4dFN0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0U2luZ2xlUXVvdGVkU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWydhJ10iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dFN0cmluZygpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTaW5nbGVRdW90ZWRTdHJpbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbJ2EnXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0U3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRTZW1pY29sb25EZWxpbWl0ZWRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWU7dHJ1ZV0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RTZW1pY29sb25EZWxpbWl0ZWROYW1lVmFsdWVQYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSnNvblJlYWRlciByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJ7XCJhXCI6dHJ1ZTtcImJcIjp0cnVlfSIpKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHROYW1lKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVuaWVudFNlbWljb2xvbkRlbGltaXRlZE5hbWVWYWx1ZVBhaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIntcImFcIjp0cnVlO1wiYlwiOnRydWV9IikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHJlYWRlci5uZXh0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRlci5uZXh0Qm9vbGVhbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVhZGVyLm5leHROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbm5lY2Vzc2FyeUFycmF5U2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiW3RydWUsLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbdHJ1ZSxdIikpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLF0iKSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5uZWNlc3NhcnlBcnJheVNlcGFyYXRvcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLCx0cnVlXSIpKTsKKyAgICAgICAgcmVhZGVyLnNldExlbmllbnQodHJ1ZSk7CisgICAgICAgIHJlYWRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKworICAgICAgICByZWFkZXIgPSBuZXcgSnNvblJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKCJbLHRydWVdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZWFkZXIubmV4dEJvb2xlYW4oKSk7CisgICAgICAgIHJlYWRlci5lbmRBcnJheSgpOworCisgICAgICAgIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIlt0cnVlLF0iKSk7CisgICAgICAgIHJlYWRlci5zZXRMZW5pZW50KHRydWUpOworICAgICAgICByZWFkZXIuYmVnaW5BcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZGVyLm5leHRCb29sZWFuKCkpOworICAgICAgICByZWFkZXIubmV4dE51bGwoKTsKKyAgICAgICAgcmVhZGVyLmVuZEFycmF5KCk7CisKKyAgICAgICAgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIobmV3IFN0cmluZ1JlYWRlcigiWyxdIikpOworICAgICAgICByZWFkZXIuc2V0TGVuaWVudCh0cnVlKTsKKyAgICAgICAgcmVhZGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgcmVhZGVyLm5leHROdWxsKCk7CisgICAgICAgIHJlYWRlci5uZXh0TnVsbCgpOworICAgICAgICByZWFkZXIuZW5kQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0pzb25Xcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4NDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvSnNvbldyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25Xcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nVG9wTGV2ZWxUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImEiKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVXaXRob3V0VmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRob3V0TmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVG9wTGV2ZWxWYWx1ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKS5lbmRBcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhZE5lc3RpbmdPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROZXN0aW5nQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIubmFtZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyaW5nVmFsdWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKG51bGwpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImFcIjpudWxsfSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRmluaXRlRG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTmFOKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKC0wLjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDEuMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoRG91YmxlLk1JTl9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMC4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgtMC41KTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShEb3VibGUuTUlOX05PUk1BTCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5QSSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoTWF0aC5FKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiWy0wLjAsIgorICAgICAgICAgICAgICAgICsgIjEuMCwiCisgICAgICAgICAgICAgICAgKyAiMS43OTc2OTMxMzQ4NjIzMTU3RTMwOCwiCisgICAgICAgICAgICAgICAgKyAiNC45RS0zMjQsIgorICAgICAgICAgICAgICAgICsgIjAuMCwiCisgICAgICAgICAgICAgICAgKyAiLTAuNSwiCisgICAgICAgICAgICAgICAgKyAiMi4yMjUwNzM4NTg1MDcyMDE0RS0zMDgsIgorICAgICAgICAgICAgICAgICsgIjMuMTQxNTkyNjUzNTg5NzkzLCIKKyAgICAgICAgICAgICAgICArICIyLjcxODI4MTgyODQ1OTA0NV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvbmdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoMSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoLTEpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKExvbmcuTUlOX1ZBTFVFKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlswLCIKKyAgICAgICAgICAgICAgICArICIxLCIKKyAgICAgICAgICAgICAgICArICItMSwiCisgICAgICAgICAgICAgICAgKyAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIgorICAgICAgICAgICAgICAgICsgIjkyMjMzNzIwMzY4NTQ3NzU4MDddIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlt0cnVlLGZhbHNlXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltudWxsXSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoImFcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcIiIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCI6Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIiwiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXGYiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXG4iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHIiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiXHQiKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiICIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJcXCIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJ7Iik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIn0iKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSgiWyIpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKCJdIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlwwIik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoIlx1MDAxOSIpOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiW1wiYVwiLCIKKyAgICAgICAgICAgICAgICArICJcImFcXFwiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxcIlwiLCIKKyAgICAgICAgICAgICAgICArICJcIjpcIiwiCisgICAgICAgICAgICAgICAgKyAiXCIsXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxiXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxmXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxuXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFxyXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx0XCIsIgorICAgICAgICAgICAgICAgICsgIlwiIFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcXFxcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJ7XCIsIgorICAgICAgICAgICAgICAgICsgIlwifVwiLCIKKyAgICAgICAgICAgICAgICArICJcIltcIiwiCisgICAgICAgICAgICAgICAgKyAiXCJdXCIsIgorICAgICAgICAgICAgICAgICsgIlwiXFx1MDAwMFwiLCIKKyAgICAgICAgICAgICAgICArICJcIlxcdTAwMTlcIl0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBKc29uV3JpdGVyIGpzb25Xcml0ZXIgPSBuZXcgSnNvbldyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltdIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0c0luQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoNSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYiIpLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImMiKS52YWx1ZSg2KTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJkIikudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbe1wiYVwiOjUsXCJiXCI6ZmFsc2V9LCIKKyAgICAgICAgICAgICAgICArICJ7XCJjXCI6NixcImRcIjp0cnVlfV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5c0luT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5BcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDUpOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKGZhbHNlKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNik7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUodHJ1ZSk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6WzUsZmFsc2VdLCIKKyAgICAgICAgICAgICAgICArICJcImJcIjpbNix0cnVlXX0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nQXJyYXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIltbW1tbW1tbW1tbW1tbW1tbW1tbXV1dXV1dXV1dXV1dXV1dXV1dXV0iLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZXBOZXN0aW5nT2JqZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKTsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuYmVnaW5PYmplY3QoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAganNvbldyaXRlci5lbmRPYmplY3QoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6IgorICAgICAgICAgICAgICAgICsgIntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7XCJhXCI6e1wiYVwiOntcImFcIjp7IgorICAgICAgICAgICAgICAgICsgIn19fX19fX19fX19fX19fX19fX19fSIsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWROYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgSnNvbldyaXRlciBqc29uV3JpdGVyID0gbmV3IEpzb25Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci5uYW1lKCJhIikudmFsdWUoZmFsc2UpOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICAvLyBKc29uV3JpdGVyIGRvZXNuJ3QgYXR0ZW1wdCB0byBkZXRlY3QgZHVwbGljYXRlIG5hbWVzCisgICAgICAgIGFzc2VydEVxdWFscygie1wiYVwiOnRydWUsXCJhXCI6ZmFsc2V9Iiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV0dHlQcmludE9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYSIpLnZhbHVlKHRydWUpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiYyIpLnZhbHVlKDUuMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZSIpLm51bGxWYWx1ZSgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImYiKS5iZWdpbkFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNi4wKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZEFycmF5KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiZyIpLmJlZ2luT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaCIpLnZhbHVlKDguMCk7CisgICAgICAgIGpzb25Xcml0ZXIubmFtZSgiaSIpLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kT2JqZWN0KCk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIntcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImFcIjogdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImJcIjogZmFsc2UsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgXCJjXCI6IDUuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImVcIjogbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICBcImZcIjogW1xuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICA3LjBcbiIKKyAgICAgICAgICAgICAgICArICIgICBdLFxuIgorICAgICAgICAgICAgICAgICsgIiAgIFwiZ1wiOiB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJoXCI6IDguMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImlcIjogOS4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfVxuIgorICAgICAgICAgICAgICAgICsgIn0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldHR5UHJpbnRBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIEpzb25Xcml0ZXIganNvbldyaXRlciA9IG5ldyBKc29uV3JpdGVyKHN0cmluZ1dyaXRlcik7CisgICAgICAgIGpzb25Xcml0ZXIuc2V0SW5kZW50KCIgICAiKTsKKworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSh0cnVlKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZShmYWxzZSk7CisgICAgICAgIGpzb25Xcml0ZXIudmFsdWUoNS4wKTsKKyAgICAgICAganNvbldyaXRlci5udWxsVmFsdWUoKTsKKyAgICAgICAganNvbldyaXRlci5iZWdpbk9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImEiKS52YWx1ZSg2LjApOworICAgICAgICBqc29uV3JpdGVyLm5hbWUoImIiKS52YWx1ZSg3LjApOworICAgICAgICBqc29uV3JpdGVyLmVuZE9iamVjdCgpOworICAgICAgICBqc29uV3JpdGVyLmJlZ2luQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci52YWx1ZSg4LjApOworICAgICAgICBqc29uV3JpdGVyLnZhbHVlKDkuMCk7CisgICAgICAgIGpzb25Xcml0ZXIuZW5kQXJyYXkoKTsKKyAgICAgICAganNvbldyaXRlci5lbmRBcnJheSgpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgdHJ1ZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBmYWxzZSxcbiIKKyAgICAgICAgICAgICAgICArICIgICA1LjAsXG4iCisgICAgICAgICAgICAgICAgKyAiICAgbnVsbCxcbiIKKyAgICAgICAgICAgICAgICArICIgICB7XG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgXCJhXCI6IDYuMCxcbiIKKyAgICAgICAgICAgICAgICArICIgICAgICBcImJcIjogNy4wXG4iCisgICAgICAgICAgICAgICAgKyAiICAgfSxcbiIKKyAgICAgICAgICAgICAgICArICIgICBbXG4iCisgICAgICAgICAgICAgICAgKyAiICAgICAgOC4wLFxuIgorICAgICAgICAgICAgICAgICsgIiAgICAgIDkuMFxuIgorICAgICAgICAgICAgICAgICsgIiAgIF1cbiIKKyAgICAgICAgICAgICAgICArICJdIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvUGF0dGVybnNUZXN0LmphdmEKaW5kZXggYjkwYzk3Yi4uYWFkM2ZlMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdXRpbC9QYXR0ZXJuc1Rlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL1BhdHRlcm5zVGVzdC5qYXZhCkBAIC02OCw2ICs2OCwxMyBAQAogICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJ4bi0tZnNxdTAwYS54bi0tMHp3bTU2ZCIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CiAKKyAgICAgICAgLy8gVXJsIGZvciB0ZXN0aW5nIHRvcCBsZXZlbCBBcmFiaWMgY291bnRyeSBjb2RlIGRvbWFpbiBpbiBQdW55Y29kZToKKyAgICAgICAgLy8gICBodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweAorICAgICAgICB0ID0gUGF0dGVybnMuV0VCX1VSTC5tYXRjaGVyKCJodHRwOi8veG4tLTRnYnJpbS54bi0tLS1ybWNrYmJhamxjNmRqN2J4bmUyYy54bi0td2diaDFjL2FyL2RlZmF1bHQuYXNweCIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CisgICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoInhuLS00Z2JyaW0ueG4tLS0tcm1ja2JiYWpsYzZkajdieG5lMmMueG4tLXdnYmgxYy9hci9kZWZhdWx0LmFzcHgiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIFVSTCIsIHQpOworCiAgICAgICAgIC8vIEludGVybmF0aW9uYWxpemVkIFVSTC4KICAgICAgICAgdCA9IFBhdHRlcm5zLldFQl9VUkwubWF0Y2hlcigiaHR0cDovL1x1RDYwNFx1QUUwOFx1QzYwMVx1QzIxOFx1Qzk5RC5rciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgVVJMIiwgdCk7CkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoIm1haWwuZXhhbXBsZS5jb20iKS5tYXRjaGVzKCk7CiAgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogCi0gICAgICAgIHQgPSBQYXR0ZXJucy5XRUJfVVJMLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKKyAgICAgICAgdCA9IFBhdHRlcm5zLkRPTUFJTl9OQU1FLm1hdGNoZXIoImdvb2dsZS5tZSIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiVmFsaWQgZG9tYWluIiwgdCk7CiAKICAgICAgICAgLy8gSW50ZXJuYXRpb25hbGl6ZWQgZG9tYWlucy4KQEAgLTExOCw2ICsxMjUsMTQgQEAKIAogICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigiX18rJjQyLnhlciIpLm1hdGNoZXMoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkludmFsaWQgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gT2Jzb2xldGUgZG9tYWluIC55dQorICAgICAgICB0ID0gUGF0dGVybnMuRE9NQUlOX05BTUUubWF0Y2hlcigidGVzdC55dSIpLm1hdGNoZXMoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9ic29sZXRlIGNvdW50cnkgY29kZSB0b3AgbGV2ZWwgZG9tYWluIiwgdCk7CisKKyAgICAgICAgLy8gVGVzdGluZyB0b3AgbGV2ZWwgQXJhYmljIGNvdW50cnkgY29kZSBkb21haW4gaW4gUHVueWNvZGU6CisgICAgICAgIHQgPSBQYXR0ZXJucy5ET01BSU5fTkFNRS5tYXRjaGVyKCJ4bi0tNGdicmltLnhuLS0tLXJtY2tiYmFqbGM2ZGo3YnhuZTJjLnhuLS13Z2JoMWMiKS5tYXRjaGVzKCk7CisgICAgICAgIGFzc2VydFRydWUoIlZhbGlkIGRvbWFpbiIsIHQpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dlYmtpdC9ab29tTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzlkZWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgWm9vbU1hbmFnZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgV2ViVmlldyB3ZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcy5nZXRDb250ZXh0KCkpOworICAgICAgICBDYWxsYmFja1Byb3h5IGNhbGxiYWNrUHJveHkgPSBuZXcgQ2FsbGJhY2tQcm94eSh0aGlzLmdldENvbnRleHQoKSwgd2ViVmlldyk7CisgICAgICAgIHpvb21NYW5hZ2VyID0gbmV3IFpvb21NYW5hZ2VyKHdlYlZpZXcsIGNhbGxiYWNrUHJveHkpOworCisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoMS4wMGYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgeworICAgICAgICB0ZXN0SW5pdCgwLjAxZik7CisgICAgICAgIHRlc3RJbml0KDEuMDBmKTsKKyAgICAgICAgdGVzdEluaXQoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5pdChmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIHpvb21NYW5hZ2VyLmluaXQoZGVuc2l0eSk7CisgICAgICAgIGFjdHVhbFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChkZW5zaXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHpvb21NYW5hZ2VyLmdldERlZmF1bHRNYXhab29tU2NhbGUoKSwgem9vbU1hbmFnZXIuZ2V0TWF4Wm9vbVNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1pblpvb21TY2FsZSgpLCB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZW5zaXR5LCB6b29tTWFuYWdlci5nZXRUZXh0V3JhcFNjYWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGJhc2ljIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVxdWFsIHRvIHRoZSBkZWZhdWx0cworICAgICAgICB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KDAuMDFmKTsKKyAgICAgICAgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eSgxLjAwZik7CisgICAgICAgIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkoMS4yNWYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGZsb2F0IGRlbnNpdHkpIHsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KGRlbnNpdHkpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KGRlbnNpdHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoU21hbGxNaW5ab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtaW5ab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPCB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWluWm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NSU5fWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtaW5WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1pblZpZXdTdGF0ZS5tTWluU2NhbGUgPSBtaW5ab29tU2NhbGUgLSAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWluVmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5V2l0aExhcmdlTWluWm9vbSgpIHsKKyAgICAgICAgLy8gdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGUgbWluWm9vbVNjYWxlIGhhcyBjaGFuZ2VkIHRvIGJlID4gdGhlIGRlZmF1bHQKKyAgICAgICAgZmxvYXQgbmV3RGVmYXVsdFNjYWxlID0gMS41MGY7CisgICAgICAgIGZsb2F0IG1pblpvb21TY2FsZSA9IFpvb21NYW5hZ2VyLkRFRkFVTFRfTUlOX1pPT01fU0NBTEVfRkFDVE9SICogbmV3RGVmYXVsdFNjYWxlOworICAgICAgICBXZWJWaWV3Q29yZS5WaWV3U3RhdGUgbWluVmlld1N0YXRlID0gbmV3IFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSgpOworICAgICAgICBtaW5WaWV3U3RhdGUubU1pblNjYWxlID0gbWluWm9vbVNjYWxlICsgMC4xZjsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlWm9vbVJhbmdlKG1pblZpZXdTdGF0ZSwgMCwgMCk7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZURlZmF1bHRab29tRGVuc2l0eShuZXdEZWZhdWx0U2NhbGUpOworICAgICAgICBkZWZhdWx0U2NhbGVUZXN0KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRab29tRGVuc2l0eVdpdGhTbWFsbE1heFpvb20oKSB7CisgICAgICAgIC8vIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIG1heFpvb21TY2FsZSBoYXMgY2hhbmdlZCB0byBiZSA8IHRoZSBkZWZhdWx0CisgICAgICAgIGZsb2F0IG5ld0RlZmF1bHRTY2FsZSA9IDEuNTBmOworICAgICAgICBmbG9hdCBtYXhab29tU2NhbGUgPSBab29tTWFuYWdlci5ERUZBVUxUX01BWF9aT09NX1NDQUxFX0ZBQ1RPUiAqIG5ld0RlZmF1bHRTY2FsZTsKKyAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIG1heFZpZXdTdGF0ZSA9IG5ldyBXZWJWaWV3Q29yZS5WaWV3U3RhdGUoKTsKKyAgICAgICAgbWF4Vmlld1N0YXRlLm1NYXhTY2FsZSA9IG1heFpvb21TY2FsZSAtIDAuMWY7CisgICAgICAgIHpvb21NYW5hZ2VyLnVwZGF0ZVpvb21SYW5nZShtYXhWaWV3U3RhdGUsIDAsIDApOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVEZWZhdWx0Wm9vbURlbnNpdHkobmV3RGVmYXVsdFNjYWxlKTsKKyAgICAgICAgZGVmYXVsdFNjYWxlVGVzdChuZXdEZWZhdWx0U2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Wm9vbURlbnNpdHlXaXRoTGFyZ2VNYXhab29tKCkgeworICAgICAgICAvLyB0ZXN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXhab29tU2NhbGUgaGFzIGNoYW5nZWQgdG8gYmUgPiB0aGUgZGVmYXVsdAorICAgICAgICBmbG9hdCBuZXdEZWZhdWx0U2NhbGUgPSAxLjUwZjsKKyAgICAgICAgZmxvYXQgbWF4Wm9vbVNjYWxlID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBuZXdEZWZhdWx0U2NhbGU7CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSBtYXhWaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIG1heFZpZXdTdGF0ZS5tTWF4U2NhbGUgPSBtYXhab29tU2NhbGUgKyAwLjFmOworICAgICAgICB6b29tTWFuYWdlci51cGRhdGVab29tUmFuZ2UobWF4Vmlld1N0YXRlLCAwLCAwKTsKKyAgICAgICAgem9vbU1hbmFnZXIudXBkYXRlRGVmYXVsdFpvb21EZW5zaXR5KG5ld0RlZmF1bHRTY2FsZSk7CisgICAgICAgIGRlZmF1bHRTY2FsZVRlc3QobmV3RGVmYXVsdFNjYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZVNjYWxlV2l0aExpbWl0cygpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgbWF4U2NhbGUgPSB6b29tTWFuYWdlci5nZXRNYXhab29tU2NhbGUoKTsKKyAgICAgICAgZmluYWwgZmxvYXQgbWluU2NhbGUgPSB6b29tTWFuYWdlci5nZXRNaW5ab29tU2NhbGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXhTY2FsZSA+IG1pblNjYWxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1heFNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1heFNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXhTY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtYXhTY2FsZSArIC4wMWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pblNjYWxlLCB6b29tTWFuYWdlci5jb21wdXRlU2NhbGVXaXRoTGltaXRzKG1pblNjYWxlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtaW5TY2FsZSwgem9vbU1hbmFnZXIuY29tcHV0ZVNjYWxlV2l0aExpbWl0cyhtaW5TY2FsZSAtIC4wMWYpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWN0dWFsU2NhbGVUZXN0KGZsb2F0IGFjdHVhbFNjYWxlKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxTY2FsZSwgem9vbU1hbmFnZXIuZ2V0U2NhbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIC8gYWN0dWFsU2NhbGUsIHpvb21NYW5hZ2VyLmdldEludlNjYWxlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZhdWx0U2NhbGVUZXN0KGZsb2F0IGRlZmF1bHRTY2FsZSkgeworICAgICAgICBmaW5hbCBmbG9hdCBtYXhEZWZhdWx0ID0gWm9vbU1hbmFnZXIuREVGQVVMVF9NQVhfWk9PTV9TQ0FMRV9GQUNUT1IgKiBkZWZhdWx0U2NhbGU7CisgICAgICAgIGZpbmFsIGZsb2F0IG1pbkRlZmF1bHQgPSBab29tTWFuYWdlci5ERUZBVUxUX01JTl9aT09NX1NDQUxFX0ZBQ1RPUiAqIGRlZmF1bHRTY2FsZTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSAvIGRlZmF1bHRTY2FsZSwgem9vbU1hbmFnZXIuZ2V0SW52RGVmYXVsdFNjYWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWF4RGVmYXVsdCwgem9vbU1hbmFnZXIuZ2V0RGVmYXVsdE1heFpvb21TY2FsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkRlZmF1bHQsIHpvb21NYW5hZ2VyLmdldERlZmF1bHRNaW5ab29tU2NhbGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdEJhc2ljVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNiNTE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvLk15R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFNpbXBsZT4gewotICAgIHByaXZhdGUgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbyBtQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIEV4cGFuZGFibGVMaXN0QWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RCYXNpY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0U2ltcGxlLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgbUV4cGFuZGFibGVMaXN0VmlldyA9IG1BY3Rpdml0eS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0QWRhcHRlcigpOwotICAgICAgICBtTGlzdFV0aWwgPSBuZXcgTGlzdFV0aWwobUV4cGFuZGFibGVMaXN0VmlldywgZ2V0SW5zdHJ1bWVudGF0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVjb25kaXRpb25zKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKG1BY3Rpdml0eSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobUV4cGFuZGFibGVMaXN0Vmlldyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGV4cGFuZEdyb3VwKGludCBudW1DaGlsZHJlbiwgYm9vbGVhbiBhdExlYXN0T25lQ2hpbGQpIHsKLSAgICAgICAgZmluYWwgaW50IGdyb3VwUG9zID0gbUFjdGl2aXR5LmZpbmRHcm91cFdpdGhOdW1DaGlsZHJlbihudW1DaGlsZHJlbiwgYXRMZWFzdE9uZUNoaWxkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZ3JvdXAgdG8gZXhwYW5kIiwgZ3JvdXBQb3MgPj0gMCk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oZ3JvdXBQb3MpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRUcnVlKCJHcm91cCBkaWQgbm90IGV4cGFuZCIsIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKGdyb3VwUG9zKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwUG9zOwotICAgIH0KLQotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZEdyb3VwKCkgewotICAgICAgICBleHBhbmRHcm91cCgtMSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbGxhcHNlR3JvdXAoKSB7Ci0gICAgICAgIGZpbmFsIGludCBncm91cFBvcyA9IGV4cGFuZEdyb3VwKC0xLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIkdyb3VwIGRpZCBub3QgY29sbGFwc2UiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cFBvcykpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRlZEdyb3VwTW92ZW1lbnQoKSB7Ci0gICAgICAgIC8vIEV4cGFuZCB0aGUgZmlyc3QgZ3JvdXAKLSAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKDApOwotICAgICAgICBzZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIGl0IGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kIiwgbUV4cGFuZGFibGVMaXN0Vmlldy5pc0dyb3VwRXhwYW5kZWQoMCkpOwotICAgICAgICAKLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGF0J3MgYWxsIGdvb2QKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgaXQgZXhwYW5kZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiR3JvdXAgZGlkIG5vdCBleHBhbmQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBJbnNlcnQgYSBjb2xsYXBzZWQgZ3JvdXAgaW4gZnJvbnQgb2YgdGhlIG9uZSBqdXN0IGV4cGFuZGVkCi0gICAgICAgIExpc3Q8TXlHcm91cD4gZ3JvdXBzID0gbUFjdGl2aXR5LmdldEdyb3VwcygpOwotICAgICAgICBNeUdyb3VwIGluc2VydGVkR3JvdXAgPSBuZXcgTXlHcm91cCgxKTsKLSAgICAgICAgZ3JvdXBzLmFkZCgwLCBpbnNlcnRlZEdyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGlmeSBkYXRhIGNoYW5nZQotICAgICAgICBhc3NlcnRUcnVlKCJBZGFwdGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBhZGFwdGVyIiwKLSAgICAgICAgICAgICAgICBtQWRhcHRlciBpbnN0YW5jZW9mIEJhc2VFeHBhbmRhYmxlTGlzdEFkYXB0ZXIpOwotICAgICAgICBmaW5hbCBCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyIGFkYXB0ZXIgPSAoQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcikgbUFkYXB0ZXI7Ci0gICAgIAotICAgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2V0SW5zdHJ1bWVudGF0aW9uKCkud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJpZ2h0IGdyb3VwIGlzIGV4cGFuZGVkCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBleHBhbmRlZCBzdGF0ZSBkaWRuJ3Qgc3RheSB3aXRoIHRoZSBwcm9wZXIgZ3JvdXAiLAotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuaXNHcm91cEV4cGFuZGVkKDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBleHBhbmRlZCBzdGF0ZSB3YXMgZ2l2ZW4gdG8gdGhlIGluc2VydGVkIGdyb3VwIiwKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udGV4dE1lbnVzKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkKCkgewotICAgICAgICBFeHBhbmRhYmxlTGlzdFRlc3RlciB0ZXN0ZXIgPSBuZXcgRXhwYW5kYWJsZUxpc3RUZXN0ZXIobUV4cGFuZGFibGVMaXN0VmlldywgdGhpcyk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFNpbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGRiMjhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RTaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlcjsKLQotaW1wb3J0IGFuZHJvaWQudXRpbC5FeHBhbmRhYmxlTGlzdFNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RTaW1wbGUgZXh0ZW5kcyBFeHBhbmRhYmxlTGlzdFNjZW5hcmlvIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBOVU1fQ0hJTERSRU4gPSB7NCwgMywgMiwgMSwgMH07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXROdW1DaGlsZHJlbihOVU1fQ0hJTERSRU4pCi0gICAgICAgICAgICAgICAgLnNldEl0ZW1TY3JlZW5TaXplRmFjdG9yKDAuMTQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0KLSAgICAgICAgbWVudS5hZGQoIkFkZCBpdGVtIikuc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIobmV3IE9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBzLmFkZCgwLCBuZXcgTXlHcm91cCgyKSk7Ci0gICAgICAgICAgICAgICAgKChCYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyKSBtQWRhcHRlcikubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L0V4cGFuZGFibGVMaXN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjEwZmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV4cGFuZGFibGVMaXN0U2NlbmFyaW87Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxpc3RVdGlsOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0VGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEV4cGFuZGFibGVMaXN0VmlldyBtRXhwYW5kYWJsZUxpc3RWaWV3OwotICAgIHByaXZhdGUgZmluYWwgRXhwYW5kYWJsZUxpc3RBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgZmluYWwgTGlzdFV0aWwgbUxpc3RVdGlsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjw/IGV4dGVuZHMgRXhwYW5kYWJsZUxpc3RTY2VuYXJpbz4KLSAgICAgICAgbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotCi0gICAgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247Ci0KLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RUZXN0ZXIoCi0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3LAotICAgICAgICAgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8PyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8+Ci0gICAgICAgICAgICBhY3Rpdml0eUluc3RydW1lbnRhdGlvbikgewotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZXhwYW5kYWJsZUxpc3RWaWV3OwotICAgICAgICBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uID0gYWN0aXZpdHlJbnN0cnVtZW50YXRpb24uZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICAgIG1MaXN0VXRpbCA9IG5ldyBMaXN0VXRpbChtRXhwYW5kYWJsZUxpc3RWaWV3LCBpbnN0cnVtZW50YXRpb24pOwotICAgICAgICBtQWRhcHRlciA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RBZGFwdGVyKCk7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbiA9IGFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uID0gbUFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uLmdldEluc3RydW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmRHcm91cChmaW5hbCBpbnQgZ3JvdXBJbmRleCwgaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkdyb3VwIGlzIGFscmVhZHkgZXhwYW5kZWQiLCBtRXhwYW5kYWJsZUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgLmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihmbGF0UG9zaXRpb24pOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBtQWN0aXZpdHlJbnN0cnVtZW50YXRpb24uc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIG1BY3Rpdml0eUluc3RydW1lbnRhdGlvbi5nZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdyb3VwIGRpZCBub3QgZXhwYW5kICIgKyBncm91cEluZGV4LCAKLSAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZChncm91cEluZGV4KSk7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0Q29udGV4dE1lbnVzKCkgewotICAgICAgICAvLyBBZGQgYSBwb3NpdGlvbiB0ZXN0ZXIgQ29udGV4dE1lbnUgbGlzdGVuZXIgdG8gdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICBQb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyID0gbmV3IFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lcigpOwotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNldE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gU2Nyb2xsaW5nIG9uIGhlYWRlciBlbGVtZW50cyBzaG91bGQgdHJpZ2dlciBhbiBBZGFwdGVyQ29udGV4dE1lbnUKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGdyb3VwIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdEFkYXB0ZXJDb250ZXh0TWVudShpKTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBoZWFkZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGhlYWRlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0KLSAgICAgICAgICAgIC8vIEV4cGFuZCBncm91cAotICAgICAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgaW5kZXgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBncm91cCBpbmRleCBpbiBjb250ZXh0IG1lbnUKLSAgICAgICAgICAgIG1lbnVMaXN0ZW5lci5leHBlY3RHcm91cENvbnRleHRNZW51KGdyb3VwSW5kZXgpOwotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBncm91cCBpcyB2aXNpYmxlIHNvIHRoYXQgZ2V0Q2hpbGQgZmluZHMgaXQKLSAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICBWaWV3IGdyb3VwQ2hpbGQgPSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldENoaWxkQXQoaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zaG93Q29udGV4dE1lbnVGb3JDaGlsZChncm91cENoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5Db3VudCA9IG1BZGFwdGVyLmdldENoaWxkcmVuQ291bnQoZ3JvdXBJbmRleCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGNoaWxkIGluZGV4IGluIGNvbnRleHQgbWVudQotICAgICAgICAgICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihpbmRleCk7Ci0gICAgICAgICAgICAgICAgbWVudUxpc3RlbmVyLmV4cGVjdENoaWxkQ29udGV4dE1lbnUoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0gICAgICAgICAgICAgICAgVmlldyBjaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgLSBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwobWVudUxpc3RlbmVyLmdldEVycm9yTWVzc2FnZSgpLCBtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTY3JvbGxpbmcgb24gZm9vdGVyIGVsZW1lbnRzIHNob3VsZCB0cmlnZ2VyIGFuIEFkYXB0ZXJDb250ZXh0TWVudQotICAgICAgICBmb3IgKGludCBpPTA7IGk8bUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGb290ZXJWaWV3c0NvdW50KCk7IGkrKykgewotICAgICAgICAgICAgLy8gQ2hlY2sgZ3JvdXAgaW5kZXggaW4gY29udGV4dCBtZW51Ci0gICAgICAgICAgICBtZW51TGlzdGVuZXIuZXhwZWN0QWRhcHRlckNvbnRleHRNZW51KGluZGV4KTsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ3JvdXAgaXMgdmlzaWJsZSBzbyB0aGF0IGdldENoaWxkIGZpbmRzIGl0Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgVmlldyBmb290ZXJDaGlsZCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Q2hpbGRBdChpbmRleAotICAgICAgICAgICAgICAgICAgICAtIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LnNob3dDb250ZXh0TWVudUZvckNoaWxkKGZvb3RlckNoaWxkKTsKLSAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24ud2FpdEZvcklkbGVTeW5jKCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChtZW51TGlzdGVuZXIuZ2V0RXJyb3JNZXNzYWdlKCksIG1lbnVMaXN0ZW5lci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2xlYW51cDogcmVtb3ZlIHRoZSBsaXN0ZW5lciB3ZSBhZGRlZC4KLSAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZXhwYW5kQUdyb3VwKCkgewotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IDI7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm90IGVub3VnaCBncm91cHMiLCBncm91cEluZGV4IDwgbUFkYXB0ZXIuZ2V0R3JvdXBDb3VudCgpKTsKLSAgICAgICAgZXhwYW5kR3JvdXAoZ3JvdXBJbmRleCwgZ3JvdXBJbmRleCArIGhlYWRlckNvdW50KTsKLSAgICAgICAgcmV0dXJuIGdyb3VwSW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25Hcm91cHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxoZWFkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUZXN0IGFsbCAobm9uIGV4cGFuZGVkKSBncm91cHMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGF0UG9zaXRpb24gPSBoZWFkZXJDb3VudCArIGdyb3VwSW5kZXg7Ci0gICAgICAgICAgICBsb25nIHBhY2tlZFBvc2l0aW9uRm9yR3JvdXAgPSBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIG5vdCBmb3VuZCBhdCBmbGF0IHBvc2l0aW9uICIgKyBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgcGFja2VkUG9zaXRpb25Gb3JHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRFeHBhbmRhYmxlTGlzdFBvc2l0aW9uKGV4cGVjdGVkRmxhdFBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGdyb3VwICIgKyBncm91cEluZGV4LAotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEZsYXRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRGbGF0TGlzdFBvc2l0aW9uKHBhY2tlZFBvc2l0aW9uRm9yR3JvdXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJOb24gTlVMTCBwb3NpdGlvbiBmb3IgaGVhZGVyIGl0ZW0iLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RXhwYW5kYWJsZUxpc3RQb3NpdGlvbihoZWFkZXJDb3VudCArIGdyb3VwQ291bnQgKyBpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RDb252ZXJ0aW9uQmV0d2VlbkZsYXRBbmRQYWNrZWRPbkNoaWxkcmVuKCkgewotICAgICAgICAvLyBUZXN0IHdpdGggYW4gZXhwYW5kZWQgZ3JvdXAKLSAgICAgICAgZmluYWwgaW50IGhlYWRlckNvdW50ID0gbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRIZWFkZXJWaWV3c0NvdW50KCk7Ci0gICAgICAgIGZpbmFsIGludCBncm91cEluZGV4ID0gZXhwYW5kQUdyb3VwKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuQ291bnQgPSBtQWRhcHRlci5nZXRDaGlsZHJlbkNvdW50KGdyb3VwSW5kZXgpOwotICAgICAgICBmb3IgKGludCBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGNoaWxkcmVuQ291bnQ7IGNoaWxkSW5kZXgrKykgewotICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhdFBvc2l0aW9uID0gaGVhZGVyQ291bnQgKyBncm91cEluZGV4ICsgMSArIGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICBsb25nIGNoaWxkUG9zID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIldyb25nIGZsYXQgcG9zaXRpb24gZm9yIGNoaWxkICIsCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkUG9zLAotICAgICAgICAgICAgICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEV4cGFuZGFibGVMaXN0UG9zaXRpb24oZXhwZWN0ZWRGbGF0UG9zaXRpb24pKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiV3JvbmcgZmxhdCBwb3NpdGlvbiBmb3IgY2hpbGQgIiwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGF0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0RmxhdExpc3RQb3NpdGlvbihjaGlsZFBvcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IE5PIGdyb3VwIGlzIGV4cGFuZGVkIHdoZW4gY2FsbGVkCi0gICAgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbk9uR3JvdXBzKCkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBoZWFkZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEhlYWRlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVhZGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gb24gZ3JvdXAgaXRlbXMKLSAgICAgICAgZmluYWwgaW50IGdyb3VwQ291bnQgPSBtQWRhcHRlci5nZXRHcm91cENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGdyb3VwSW5kZXggPSAwOyBncm91cEluZGV4IDwgZ3JvdXBDb3VudDsgZ3JvdXBJbmRleCsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR3JvdXAgaXRlbSBpcyBub3Qgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuZ2V0UGFja2VkUG9zaXRpb25Gb3JHcm91cChncm91cEluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGFibGVMaXN0Vmlldy5nZXRTZWxlY3RlZFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNjcm9sbGluZyBvbiBmb290ZXIgZWxlbWVudHMgc2hvdWxkIG5vdCBnaXZlIGEgdmFsaWQgc2VsZWN0ZWQgcG9zaXRpb24uCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxtRXhwYW5kYWJsZUxpc3RWaWV3LmdldEZvb3RlclZpZXdzQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGlzdFV0aWwuYXJyb3dTY3JvbGxUb1NlbGVjdGVkUG9zaXRpb24oaW5kZXgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9vdGVyIGl0ZW0gaXMgc2VsZWN0ZWQiLAotICAgICAgICAgICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1ZBTFVFX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgTk8gZ3JvdXAgaXMgZXhwYW5kZWQgd2hlbiBjYWxsZWQKLSAgICB2b2lkIHRlc3RTZWxlY3RlZFBvc2l0aW9uT25DaGlsZHJlbigpIHsKLSAgICAgICAgLy8gVGVzdCB3aXRoIGFuIGV4cGFuZGVkIGdyb3VwCi0gICAgICAgIGZpbmFsIGludCBoZWFkZXJDb3VudCA9IG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0SGVhZGVyVmlld3NDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgZ3JvdXBJbmRleCA9IGV4cGFuZEFHcm91cCgpOwotCi0gICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUFkYXB0ZXIuZ2V0Q2hpbGRyZW5Db3VudChncm91cEluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBjaGlsZHJlbkNvdW50OyBjaGlsZEluZGV4KyspIHsKLSAgICAgICAgICAgIGludCBjaGlsZEZsYXRQb3NpdGlvbiA9IGhlYWRlckNvdW50ICsgZ3JvdXBJbmRleCArIDEgKyBjaGlsZEluZGV4OwotICAgICAgICAgICAgbUxpc3RVdGlsLmFycm93U2Nyb2xsVG9TZWxlY3RlZFBvc2l0aW9uKGNoaWxkRmxhdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdyb3VwIGl0ZW0gaXMgbm90IHNlbGVjdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uRm9yQ2hpbGQoZ3JvdXBJbmRleCwgY2hpbGRJbmRleCksCi0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRhYmxlTGlzdFZpZXcuZ2V0U2VsZWN0ZWRQb3NpdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTFjMWQuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRXhwYW5kYWJsZUxpc3RTY2VuYXJpbzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVycyBleHRlbmRzIEV4cGFuZGFibGVMaXN0U2NlbmFyaW8gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIHNOdW1DaGlsZHJlbiA9IHsxLCA0LCAzLCAyLCA2fTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc051bU9mSGVhZGVyc0FuZEZvb3RlcnMgPSAxMjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KEV4cGFuZGFibGVQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHBhcmFtcy5zZXRTdGFja0Zyb21Cb3R0b20oZmFsc2UpCi0gICAgICAgICAgICAgICAgLnNldFN0YXJ0aW5nU2VsZWN0aW9uUG9zaXRpb24oLTEpCi0gICAgICAgICAgICAgICAgLnNldE51bUNoaWxkcmVuKHNOdW1DaGlsZHJlbikKLSAgICAgICAgICAgICAgICAuc2V0SXRlbVNjcmVlblNpemVGYWN0b3IoMC4xNCkKLSAgICAgICAgICAgICAgICAuc2V0Q29ubmVjdEFkYXB0ZXIoZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLQotICAgICAgICBmaW5hbCBFeHBhbmRhYmxlTGlzdFZpZXcgZXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0RXhwYW5kYWJsZUxpc3RWaWV3KCk7Ci0gICAgICAgIGV4cGFuZGFibGVMaXN0Vmlldy5zZXRJdGVtc0NhbkZvY3VzKHRydWUpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGhlYWRlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBoZWFkZXIuc2V0VGV4dCgiSGVhZGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEhlYWRlclZpZXcoaGVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc051bU9mSGVhZGVyc0FuZEZvb3RlcnM7IGkrKykgewotICAgICAgICAgICAgQnV0dG9uIGZvb3RlciA9IG5ldyBCdXR0b24odGhpcyk7Ci0gICAgICAgICAgICBmb290ZXIuc2V0VGV4dCgiRm9vdGVyIFZpZXcgIiArIGkpOwotICAgICAgICAgICAgZXhwYW5kYWJsZUxpc3RWaWV3LmFkZEZvb3RlclZpZXcoZm9vdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gU2V0IGFkYXB0ZXIgaGVyZSBBRlRFUiB3ZSBzZXQgaGVhZGVyIGFuZCBmb290ZXIgdmlld3MKLSAgICAgICAgc2V0QWRhcHRlcihleHBhbmRhYmxlTGlzdFZpZXcpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgaGVhZGVycyAoYW5kIHRoZSBzYW1lIG51bWJlciBvZiBmb290ZXJzKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtT2ZIZWFkZXJzQW5kRm9vdGVycygpIHsKLSAgICAgICAgcmV0dXJuIHNOdW1PZkhlYWRlcnNBbmRGb290ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9FeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRjODUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5MaXN0VXRpbDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RWaWV3OwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QgZXh0ZW5kcwotICAgICAgICBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxFeHBhbmRhYmxlTGlzdFdpdGhIZWFkZXJzPiB7Ci0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdFZpZXcgbUV4cGFuZGFibGVMaXN0VmlldzsKLSAgICBwcml2YXRlIExpc3RVdGlsIG1MaXN0VXRpbDsKLSAgICAKLSAgICBwdWJsaWMgRXhwYW5kYWJsZUxpc3RXaXRoSGVhZGVyc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEV4cGFuZGFibGVMaXN0V2l0aEhlYWRlcnMuY2xhc3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAotICAgICAgICBtRXhwYW5kYWJsZUxpc3RWaWV3ID0gZ2V0QWN0aXZpdHkoKS5nZXRFeHBhbmRhYmxlTGlzdFZpZXcoKTsKLSAgICAgICAgbUxpc3RVdGlsID0gbmV3IExpc3RVdGlsKG1FeHBhbmRhYmxlTGlzdFZpZXcsIGdldEluc3RydW1lbnRhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9ucygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtRXhwYW5kYWJsZUxpc3RWaWV3KTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kT25GaXJzdFBvc2l0aW9uKCkgewotICAgICAgICAvLyBTaG91bGQgYmUgYSBoZWFkZXIsIGFuZCBoZW5jZSB0aGUgZmlyc3QgZ3JvdXAgc2hvdWxkIE5PVCBoYXZlIGV4cGFuZGVkCi0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbigwKTsKLSAgICAgICAgc2VuZEtleXMoS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0NFTlRFUik7Ci0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLndhaXRGb3JJZGxlU3luYygpOwotICAgICAgICBhc3NlcnRGYWxzZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBhbmRPbkZpcnN0R3JvdXAoKSB7Ci0gICAgICAgIG1MaXN0VXRpbC5hcnJvd1Njcm9sbFRvU2VsZWN0ZWRQb3NpdGlvbihnZXRBY3Rpdml0eSgpLmdldE51bU9mSGVhZGVyc0FuZEZvb3RlcnMoKSk7Ci0gICAgICAgIHNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtRXhwYW5kYWJsZUxpc3RWaWV3LmlzR3JvdXBFeHBhbmRlZCgwKSk7Ci0gICAgfQotCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0TWVudXMoKSB7Ci0gICAgICAgIEV4cGFuZGFibGVMaXN0VGVzdGVyIHRlc3RlciA9IG5ldyBFeHBhbmRhYmxlTGlzdFRlc3RlcihtRXhwYW5kYWJsZUxpc3RWaWV3LCB0aGlzKTsKLSAgICAgICAgdGVzdGVyLnRlc3RDb250ZXh0TWVudXMoKTsKLSAgICB9Ci0KLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZCgpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdENvbnZlcnRpb25CZXR3ZWVuRmxhdEFuZFBhY2tlZE9uR3JvdXBzKCk7Ci0gICAgICAgIHRlc3Rlci50ZXN0Q29udmVydGlvbkJldHdlZW5GbGF0QW5kUGFja2VkT25DaGlsZHJlbigpOwotICAgIH0KLQotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRQb3NpdGlvbigpIHsKLSAgICAgICAgRXhwYW5kYWJsZUxpc3RUZXN0ZXIgdGVzdGVyID0gbmV3IEV4cGFuZGFibGVMaXN0VGVzdGVyKG1FeHBhbmRhYmxlTGlzdFZpZXcsIHRoaXMpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25Pbkdyb3VwcygpOwotICAgICAgICB0ZXN0ZXIudGVzdFNlbGVjdGVkUG9zaXRpb25PbkNoaWxkcmVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9JbmZsYXRlZEV4cGFuZGFibGVMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5ZDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3dpZGdldC9leHBhbmRhYmxlbGlzdHZpZXcvSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLndpZGdldC5leHBhbmRhYmxlbGlzdHZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BYnNMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkV4cGFuZGFibGVMaXN0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotcHVibGljIGNsYXNzIEluZmxhdGVkRXhwYW5kYWJsZUxpc3RWaWV3IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuaW5mbGF0ZWRfZXhwYW5kYWJsZWxpc3R2aWV3KTsKLSAgICAgICAgCi0gICAgICAgIEV4cGFuZGFibGVMaXN0VmlldyBlbHYgPSAoRXhwYW5kYWJsZUxpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbHYpOwotICAgICAgICBlbHYuc2V0QWRhcHRlcihuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RXhwYW5kYWJsZUxpc3RBZGFwdGVyIGV4dGVuZHMgQmFzZUV4cGFuZGFibGVMaXN0QWRhcHRlciB7Ci0gICAgICAgIC8vIFNhbXBsZSBkYXRhIHNldC4gIGNoaWxkcmVuW2ldIGNvbnRhaW5zIHRoZSBjaGlsZHJlbiAoU3RyaW5nW10pIGZvciBncm91cHNbaV0uCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gZ3JvdXBzID0geyAiUGVvcGxlIE5hbWVzIiwgIkRvZyBOYW1lcyIsICJDYXQgTmFtZXMiLCAiRmlzaCBOYW1lcyIgfTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXVtdIGNoaWxkcmVuID0gewotICAgICAgICAgICAgICAgIHsgIkFybm9sZCIsICJCYXJyeSIsICJDaHVjayIsICJEYXZpZCIgfSwKLSAgICAgICAgICAgICAgICB7ICJBY2UiLCAiQmFuZGl0IiwgIkNoYS1DaGEiLCAiRGV1Y2UiIH0sCi0gICAgICAgICAgICAgICAgeyAiRmx1ZmZ5IiwgIlNudWdnbGVzIiB9LAotICAgICAgICAgICAgICAgIHsgIkdvbGR5IiwgIkJ1YmJsZXMiIH0KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bZ3JvdXBQb3NpdGlvbl1bY2hpbGRQb3NpdGlvbl07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDaGlsZElkKGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENoaWxkcmVuQ291bnQoaW50IGdyb3VwUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltncm91cFBvc2l0aW9uXS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZ2V0R2VuZXJpY1ZpZXcoKSB7Ci0gICAgICAgICAgICAvLyBMYXlvdXQgcGFyYW1ldGVycyBmb3IgdGhlIEV4cGFuZGFibGVMaXN0VmlldwotICAgICAgICAgICAgQWJzTGlzdFZpZXcuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEFic0xpc3RWaWV3LkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIDY0KTsKLQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSBuZXcgVGV4dFZpZXcoSW5mbGF0ZWRFeHBhbmRhYmxlTGlzdFZpZXcudGhpcyk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgICAgICAgICAgLy8gQ2VudGVyIHRoZSB0ZXh0IHZlcnRpY2FsbHkKLSAgICAgICAgICAgIHRleHRWaWV3LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUwgfCBHcmF2aXR5LkxFRlQpOwotICAgICAgICAgICAgLy8gU2V0IHRoZSB0ZXh0IHN0YXJ0aW5nIHBvc2l0aW9uCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRQYWRkaW5nKDM2LCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0VmlldzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0Q2hpbGRWaWV3KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3RDaGlsZCwKLSAgICAgICAgICAgICAgICBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldENoaWxkKGdyb3VwUG9zaXRpb24sIGNoaWxkUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRHcm91cChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3Vwc1tncm91cFBvc2l0aW9uXTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0R3JvdXBDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0R3JvdXBJZChpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVmlldyBnZXRHcm91cFZpZXcoaW50IGdyb3VwUG9zaXRpb24sIGJvb2xlYW4gaXNFeHBhbmRlZCwgVmlldyBjb252ZXJ0VmlldywKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0VmlldyA9IGdldEdlbmVyaWNWaWV3KCk7Ci0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KGdldEdyb3VwKGdyb3VwUG9zaXRpb24pLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRleHRWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDaGlsZFNlbGVjdGFibGUoaW50IGdyb3VwUG9zaXRpb24sIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1N0YWJsZUlkcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvd2lkZ2V0L2V4cGFuZGFibGVsaXN0dmlldy9Qb3NpdGlvblRlc3RlckNvbnRleHRNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC93aWRnZXQvZXhwYW5kYWJsZWxpc3R2aWV3L1Bvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQud2lkZ2V0LmV4cGFuZGFibGVsaXN0dmlldzsKLQotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5FeHBhbmRhYmxlTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbzsKLQotcHVibGljIGNsYXNzIFBvc2l0aW9uVGVzdGVyQ29udGV4dE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIE9uQ3JlYXRlQ29udGV4dE1lbnVMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIGludCBncm91cFBvc2l0aW9uLCBjaGlsZFBvc2l0aW9uOwotCi0gICAgLy8gRmFrZSBjb25zdGFudCB0byBzdG9yZSBpbiB0ZXN0VHlwZSBhIHRlc3QgdHlwZSBzcGVjaWZpYyB0byBoZWFkZXJzIGFuZCBmb290ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfVFlQRSA9IC0xOwotICAgIHByaXZhdGUgaW50IHRlc3RUeXBlOyAvLyBhcyByZXR1cm5lZCBieSBnZXRQYWNrZWRQb3NpdGlvblR5cGUKLQotICAgIC8vIFdpbGwgYmUgc2V0IHRvIG51bGwgYnkgZWFjaCBjYWxsIHRvIG9uQ3JlYXRlQ29udGV4dE1lbnUsIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC4gCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R3JvdXBDb250ZXh0TWVudShpbnQgZ3JvdXBQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDaGlsZENvbnRleHRNZW51KGludCBncm91cFBvc2l0aW9uLCBpbnQgY2hpbGRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBncm91cFBvc2l0aW9uOwotICAgICAgICB0aGlzLmNoaWxkUG9zaXRpb24gPSBjaGlsZFBvc2l0aW9uOwotICAgICAgICB0ZXN0VHlwZSA9IEV4cGFuZGFibGVMaXN0Vmlldy5QQUNLRURfUE9TSVRJT05fVFlQRV9DSElMRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGFwdGVyQ29udGV4dE1lbnUoaW50IGZsYXRQb3NpdGlvbikgewotICAgICAgICB0aGlzLmdyb3VwUG9zaXRpb24gPSBmbGF0UG9zaXRpb247Ci0gICAgICAgIHRlc3RUeXBlID0gQURBUFRFUl9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKHRlc3RUeXBlID09IEFEQVBURVJfVFlQRSkgewotICAgICAgICAgICAgaWYgKCFpc1RydWUoIk1lbnVJbmZvIGlzIG5vdCBhbiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvIiwKLSAgICAgICAgICAgICAgICAgICAgbWVudUluZm8gaW5zdGFuY2VvZiBBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkYXB0ZXJDb250ZXh0TWVudUluZm8gYWRhcHRlckNvbnRleHRNZW51SW5mbyA9IChBZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGZsYXQgcG9zaXRpb24iLCBncm91cFBvc2l0aW9uLCBhZGFwdGVyQ29udGV4dE1lbnVJbmZvLnBvc2l0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghaXNUcnVlKCJNZW51SW5mbyBpcyBub3QgYW4gRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8iLAotICAgICAgICAgICAgICAgICAgICBtZW51SW5mbyBpbnN0YW5jZW9mIEV4cGFuZGFibGVMaXN0Vmlldy5FeHBhbmRhYmxlTGlzdENvbnRleHRNZW51SW5mbykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8gZWx2TWVudUluZm8gPQotICAgICAgICAgICAgICAgIChFeHBhbmRhYmxlTGlzdFZpZXcuRXhwYW5kYWJsZUxpc3RDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwotICAgICAgICAgICAgbG9uZyBwYWNrZWRQb3NpdGlvbiA9IGVsdk1lbnVJbmZvLnBhY2tlZFBvc2l0aW9uOwotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25UeXBlID0gRXhwYW5kYWJsZUxpc3RWaWV3LmdldFBhY2tlZFBvc2l0aW9uVHlwZShwYWNrZWRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBwYWNrZWQgcG9zaXRpb24gdHlwZSIsIHRlc3RUeXBlLCBwYWNrZWRQb3NpdGlvblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25Hcm91cCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkdyb3VwKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmICghYXJlRXF1YWwoIldyb25nIGdyb3VwIHBvc2l0aW9uIiwgZ3JvdXBQb3NpdGlvbiwgcGFja2VkUG9zaXRpb25Hcm91cCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZXN0VHlwZSA9PSBFeHBhbmRhYmxlTGlzdFZpZXcuUEFDS0VEX1BPU0lUSU9OX1RZUEVfQ0hJTEQpIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFja2VkUG9zaXRpb25DaGlsZCA9IEV4cGFuZGFibGVMaXN0Vmlldy5nZXRQYWNrZWRQb3NpdGlvbkNoaWxkKHBhY2tlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWFsKCJXcm9uZyBjaGlsZCBwb3NpdGlvbiIsIGNoaWxkUG9zaXRpb24sIHBhY2tlZFBvc2l0aW9uQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIG1lc3NhZ2UsIGludCBleHBlY3RlZCwgaW50IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KG1lc3NhZ2UgKyAiICglZCB2cyAlZCIsIGV4cGVjdGVkLCBhY3R1YWwpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1RydWUoU3RyaW5nIG1lc3NhZ2UsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKCF2YWx1ZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9ob3N0dGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlckhvc3RUZXN0VXRpbHMuamF2YQppbmRleCAwOWUzYmNjLi4wZjczNTFhIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2hvc3R0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VySG9zdFRlc3RVdGlscy5qYXZhCisrKyBiL2NvcmUvdGVzdHMvaG9zdHRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXJIb3N0VGVzdFV0aWxzLmphdmEKQEAgLTE1Miw3ICsxNTIsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIENvbGxlY3RpbmdUZXN0UnVuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGluZ1Rlc3RSdW5MaXN0ZW5lcigpOwotICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0UnVubmVyLnJ1bihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuY291bnRlcmVkIElPRXhjZXB0aW9uICIgKyBpb2UpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlci54bWwgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZDM5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEZlYXR1cmUgZm9yIGRldmljZXMgd2l0aCBiYXJvbWV0ZXIuIC0tPgorPHBlcm1pc3Npb25zPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlciIgLz4KKzwvcGVybWlzc2lvbnM+CmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc5NjMyCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuZ3lyb3Njb3BlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBGZWF0dXJlIGZvciBkZXZpY2VzIHdpdGggZ3lyb3Njb3BlLiAtLT4KKzxwZXJtaXNzaW9ucz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5neXJvc2NvcGUiIC8+Cis8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvcGxhdGZvcm0ueG1sIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCmluZGV4IDZmOGFmZmYuLjQzOWZjOTAgMTAwNjQ0Ci0tLSBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAorKysgYi9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKQEAgLTU4LDYgKzU4LDEwIEBACiAgICAgICAgIDxncm91cCBnaWQ9InNkY2FyZF9ydyIgLz4KICAgICA8L3Blcm1pc3Npb24+CiAKKyAgICA8cGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX1VTQiIgPgorICAgICAgICA8Z3JvdXAgZ2lkPSJ1c2IiIC8+CisgICAgPC9wZXJtaXNzaW9uPgorCiAgICAgPCEtLSBUaGUgZ3JvdXAgdGhhdCAvY2FjaGUgYmVsb25ncyB0bywgbGlua2VkIHRvIHRoZSBwZXJtaXNzaW9uCiAgICAgICAgICBzZXQgb24gdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBhY2Nlc3MgL2NhY2hlIC0tPgogICAgIDxwZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfQ0FDSEVfRklMRVNZU1RFTSIgPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmQwNzgyCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoZXNlIGFyZSB0aGUgaGFyZHdhcmUgY29tcG9uZW50cyB0aGF0IGFsbCBoYW5kaGVsZCBkZXZpY2VzCisgICAgIG11c3QgaW5jbHVkZS4gRGV2aWNlcyB3aXRoIG9wdGlvbmFsIGhhcmR3YXJlIG11c3QgYWxzbyBpbmNsdWRlIGV4dHJhCisgICAgIGhhcmR3YXJlIGZpbGVzLCBwZXIgdGhlIGNvbW1lbnRzIGJlbG93LgorCisgICAgIEhhbmRoZWxkIGRldmljZXMgaW5jbHVkZSBwaG9uZXMsIG1vYmlsZSBJbnRlcm5ldCBkZXZpY2VzIChNSURzKSwKKyAgICAgUGVyc29uYWwgTWVkaWEgUGxheWVycyAoUE1QcyksIHNtYWxsIHRhYmxldHMgKDciIG9yIGxlc3MpLCBhbmQgc2ltaWxhcgorICAgICBkZXZpY2VzLgorLS0+Cis8cGVybWlzc2lvbnM+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbiIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLm5ldHdvcmsiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuY29tcGFzcyIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5hY2NlbGVyb21ldGVyIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaC5kaXN0aW5jdCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiIC8+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggR1BTIG11c3QgaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwcy54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSByZWFyLWZhY2luZyBjYW1lcmEgbXVzdCBpbmNsdWRlIG9uZSBvZiB0aGVzZSBhcyBhcHByb3ByaWF0ZToKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnhtbCBvciAKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmF1dG9mb2N1cy54bWwgb3IgCisgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXMtZmxhc2gueG1sIC0tPgorICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgZnJvbnQgZmFjaW5nIGNhbWVyYSBtdXN0IGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZyb250LnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBXaUZpIG11c3QgYWxzbyBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUud2lmaS54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYW4gYW1iaWVudCBsaWdodCBzZW5zb3IgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmxpZ2h0LnhtbCAtLT4KKyAgICA8IS0tIGRldmljZXMgd2l0aCBhIHByb3hpbWl0eSBzZW5zb3IgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLnByb3hpbWl0eS54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBiYXJvbWV0ZXIgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmJhcm9tZXRlci54bWwgLS0+CisgICAgPCEtLSBkZXZpY2VzIHdpdGggYSBneXJvc2NvcGUgbXVzdCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmd5cm9zY29wZS54bWwgLS0+CisgICAgPCEtLSBHU00gcGhvbmVzIG11c3QgYWxzbyBpbmNsdWRlIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255LmdzbS54bWwgLS0+CisgICAgPCEtLSBDRE1BIHBob25lcyBtdXN0IGFsc28gaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueS5jZG1hLnhtbCAtLT4KKzwvcGVybWlzc2lvbnM+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy9pbmRleC5qZAppbmRleCBlYTYxY2MzLi4yMTY0NzA1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvaW5kZXguamQKQEAgLTEsNiArMSw1IEBACiBwYWdlLnRpdGxlPVRlc3RpbmcgT3ZlcnZpZXcKIEBqZDpib2R5Ci0KIDxwPgogICAgIEFuZHJvaWQgaW5jbHVkZXMgcG93ZXJmdWwgdG9vbHMgZm9yIHNldHRpbmcgdXAgYW5kIHJ1bm5pbmcgdGVzdCBhcHBsaWNhdGlvbnMuCiAgICAgV2hldGhlciB5b3UgYXJlIHdvcmtpbmcgaW4gRWNsaXBzZSB3aXRoIEFEVCBvciB3b3JraW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgdGhlc2UgdG9vbHMKQEAgLTksNyArOCw3IEBACiA8L3A+CiA8cD4KICAgICBJZiB5b3UgYXJlbid0IHlldCBmYW1pbGlhciB3aXRoIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLCBwbGVhc2UgcmVhZCB0aGUgdG9waWMKLSAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPgogICAgIGJlZm9yZSB5b3UgZ2V0IHN0YXJ0ZWQuCiAgICAgRm9yIGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byBBbmRyb2lkIHRlc3RpbmcsIHRyeSB0aGUgPGEKICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLCBUZXN0aW5nPC9hPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZAppbmRleCBkYTFjMGYwLi4zMjU4YWY5IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5qZApAQCAtMSwyOCArMSwyMyBAQAogcGFnZS50aXRsZT1UZXN0aW5nIEluIEVjbGlwc2UsIHdpdGggQURUCiBAamQ6Ym9keQotCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KLSAgPGRpdiBpZD0icXYiPgotICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0RWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFByb2plY3Q8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHBFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgQXBwbGljYXRpb248L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI1J1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9hPjwvbGk+Ci0gIDwvb2w+Ci0gIDwvZGl2PgorICAgIDxkaXYgaWQ9InF2Ij4KKyAgICAgICAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3RFY2xpcHNlIj5DcmVhdGluZyBhIFRlc3QgUHJvamVjdDwvYT48L2xpPgorICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjQ3JlYXRlVGVzdEFwcEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9hPjwvbGk+CisgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNSdW5UZXN0RWNsaXBzZSI+UnVubmluZyBUZXN0czwvYT48L2xpPgorICAgICAgICAgICAgPC9vbD4KKyAgICA8L2Rpdj4KIDwvZGl2PgogPHA+Ci0gIFRoaXMgdG9waWMgZXhwbGFpbnMgaG93IGNyZWF0ZSBhbmQgcnVuIHRlc3RzIG9mIEFuZHJvaWQgYXBwbGljYXRpb25zIGluIEVjbGlwc2Ugd2l0aCBBRFQuCi0KLSAgd2l0aCB0aGUgYmFzaWMgcHJvY2Vzc2VzIGZvciBjcmVhdGluZyBhbmQgcnVubmluZyBhcHBsaWNhdGlvbnMgd2l0aCBBRFQsIGFzIGRlc2NyaWJlZCBpbgotICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy9lY2xpcHNlLWFkdC5odG1sIj5EZXZlbG9waW5nIEluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KLQotICBCZWZvcmUgeW91IHJlYWQgdGhpcyB0b3BpYywgeW91IHNob3VsZCByZWFkIGFib3V0IGhvdyB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIHdpdGggdGhlCi0gIGJhc2ljIHByb2Nlc3NlcyBmb3IgY3JlYXRpbmcgYW5kIHJ1bm5pbmcgYXBwbGljYXRpb25zIHdpdGggQURULCBhcyBkZXNjcmliZWQgaW4KLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCi0gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L2E+LAotICB3aGljaCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yay4KKyAgICBUaGlzIHRvcGljIGV4cGxhaW5zIGhvdyBjcmVhdGUgYW5kIHJ1biB0ZXN0cyBvZiBBbmRyb2lkIGFwcGxpY2F0aW9ucyBpbiBFY2xpcHNlIHdpdGggQURULgorICAgIEJlZm9yZSB5b3UgcmVhZCB0aGlzIHRvcGljLCB5b3Ugc2hvdWxkIHJlYWQgYWJvdXQgaG93IHRvIGNyZWF0ZSBhIEFuZHJvaWQgYXBwbGljYXRpb24gd2l0aCB0aGUKKyAgICBiYXNpYyBwcm9jZXNzZXMgZm9yIGNyZWF0aW5nIGFuZCBydW5uaW5nIGFwcGxpY2F0aW9ucyB3aXRoIEFEVCwgYXMgZGVzY3JpYmVkIGluCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvZWNsaXBzZS1hZHQuaHRtbCI+RGV2ZWxvcGluZyBJbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uCisgICAgWW91IG1heSBhbHNvIHdhbnQgdG8gcmVhZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLgogPC9wPgogPHA+CiAgICAgQURUIHByb3ZpZGVzIHNldmVyYWwgZmVhdHVyZXMgdGhhdCBoZWxwIHlvdSBzZXQgdXAgYW5kIG1hbmFnZSB5b3VyIHRlc3RpbmcgZW52aXJvbm1lbnQKQEAgLTMyLDIwICsyNywyMCBAQAogICAgICAgICA8bGk+CiAgICAgICAgICAgICBJdCBsZXRzIHlvdSBxdWlja2x5IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBhbmQgbGluayBpdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KICAgICAgICAgICAgIFdoZW4gaXQgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0LCBpdCBhdXRvbWF0aWNhbGx5IGluc2VydHMgdGhlIG5lY2Vzc2FyeQotICAgICAgICAgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHRlc3QgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlLgorICAgICAgICAgICAgPGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIEl0IGxldHMgeW91IHF1aWNrbHkgaW1wb3J0IHRoZSBjbGFzc2VzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBzbyB0aGF0IHlvdXIKICAgICAgICAgICAgIHRlc3RzIGNhbiBpbnNwZWN0IHRoZW0uCiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIEl0IGxldHMgeW91IGNyZWF0ZSBydW4gY29uZmlndXJhdGlvbnMgZm9yIHlvdXIgdGVzdCBhcHBsaWNhdGlvbiBhbmQgaW5jbHVkZSBpbgorICAgICAgICAgICAgSXQgbGV0cyB5b3UgY3JlYXRlIHJ1biBjb25maWd1cmF0aW9ucyBmb3IgeW91ciB0ZXN0IHBhY2thZ2UgYW5kIGluY2x1ZGUgaW4KICAgICAgICAgICAgIHRoZW0gZmxhZ3MgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgICBJdCBsZXRzIHlvdSBydW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uIHdpdGhvdXQgbGVhdmluZyBFY2xpcHNlLiBBRFQgYnVpbGRzIGJvdGggdGhlCi0gICAgICAgICAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGFuZCB0aGUgdGVzdCBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5LCBpbnN0YWxscyB0aGVtIGlmCi0gICAgICAgICAgICBuZWNlc3NhcnkgdG8geW91ciBkZXZpY2Ugb3IgZW11bGF0b3IsIHJ1bnMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCBkaXNwbGF5cyB0aGUKKyAgICAgICAgICAgIEl0IGxldHMgeW91IHJ1biB5b3VyIHRlc3QgcGFja2FnZSB3aXRob3V0IGxlYXZpbmcgRWNsaXBzZS4gQURUIGJ1aWxkcyBib3RoIHRoZQorICAgICAgICAgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBhbmQgdGhlIHRlc3QgcGFja2FnZSBhdXRvbWF0aWNhbGx5LCBpbnN0YWxscyB0aGVtIGlmCisgICAgICAgICAgICBuZWNlc3NhcnkgdG8geW91ciBkZXZpY2Ugb3IgZW11bGF0b3IsIHJ1bnMgdGhlIHRlc3QgcGFja2FnZSwgYW5kIGRpc3BsYXlzIHRoZQogICAgICAgICAgICAgcmVzdWx0cyBpbiBhIHNlcGFyYXRlIHdpbmRvdyBpbiBFY2xpcHNlLgogICAgICAgICA8L2xpPgogICAgIDwvdWw+CkBAIC01NSwzMDUgKzUwLDM5NiBAQAogICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgogPC9wPgogPGgyIGlkPSJDcmVhdGVUZXN0UHJvamVjdEVjbGlwc2UiPkNyZWF0aW5nIGEgVGVzdCBQcm9qZWN0PC9oMj4KLSAgPHA+Cis8cD4KICAgICBUbyBzZXQgdXAgYSB0ZXN0IGVudmlyb25tZW50IGZvciB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSBhIHNlcGFyYXRlCi0gICAgYXBwbGljYXRpb24gcHJvamVjdCB0aGF0IGhvbGRzIHRoZSB0ZXN0IGNvZGUuIFRoZSBuZXcgcHJvamVjdCBmb2xsb3dzIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgcHJvamVjdCB0aGF0IGhvbGRzIHRoZSB0ZXN0IGNvZGUuIFRoZSBuZXcgcHJvamVjdCBmb2xsb3dzIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCiAgICAgdXNlZCBmb3IgYW55IEFuZHJvaWQgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHRoZSBzYW1lIHR5cGVzIG9mIGNvbnRlbnQgYW5kIGZpbGVzLCBzdWNoIGFzCi0gICAgc291cmNlIGNvZGUsIHJlc291cmNlcywgYSBtYW5pZmVzdCBmaWxlLCBhbmQgc28gZm9ydGguIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIHlvdQorICAgIHNvdXJjZSBjb2RlLCByZXNvdXJjZXMsIGEgbWFuaWZlc3QgZmlsZSwgYW5kIHNvIGZvcnRoLiBUaGUgdGVzdCBwYWNrYWdlIHlvdQogICAgIGNyZWF0ZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgYW4KICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgogICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpbiBpdHMgbWFuaWZlc3QgZmlsZS4KLSAgPC9wPgotICA8cD4KLSAgICBUaGUgPHN0cm9uZz5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L3N0cm9uZz4gZGlhbG9nIG1ha2VzIGl0IGVhc3kgZm9yIHlvdSB0byBnZW5lcmF0ZSBhCi0gICAgbmV3IHRlc3QgcHJvamVjdCB0aGF0IGhhcyB0aGUgcHJvcGVyIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZQotICAgIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBtYW5pZmVzdCBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgTmV3IEFuZHJvaWQKLSAgICBUZXN0IFByb2plY3QgZGlhbG9nIHRvIGdlbmVyYXRlIHRoZSB0ZXN0IHByb2plY3QgYXQgYW55IHRpbWUuIFRoZSBkaWFsb2cgYXBwZWFycyBqdXN0IGFmdGVyIHlvdQotICAgIGNyZWF0ZSBhIG5ldyBBbmRyb2lkIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCwgYnV0IHlvdSBjYW4gYWxzbyBydW4gaXQgdG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0Ci0gICAgZm9yIGEgcHJvamVjdCB0aGF0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHkuCi0gIDwvcD4KKzwvcD4KIDxwPgotICBUbyBjcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoIEFEVDoKKyAgICBUaGUgPGVtPk5ldyBBbmRyb2lkIFRlc3QgUHJvamVjdDwvZW0+IGRpYWxvZyBtYWtlcyBpdCBlYXN5IGZvciB5b3UgdG8gZ2VuZXJhdGUgYQorICAgIG5ldyB0ZXN0IHByb2plY3QgdGhhdCBoYXMgdGhlIHByb3BlciBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUKKyAgICA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4gWW91IGNhbiB1c2UgdGhlIE5ldworICAgIEFuZHJvaWQgVGVzdCBQcm9qZWN0IGRpYWxvZyB0byBnZW5lcmF0ZSB0aGUgdGVzdCBwcm9qZWN0IGF0IGFueSB0aW1lLiBUaGUgZGlhbG9nIGFwcGVhcnMKKyAgICBqdXN0IGFmdGVyIHlvdSBjcmVhdGUgYSBuZXcgQW5kcm9pZCBtYWluIGFwcGxpY2F0aW9uIHByb2plY3QsIGJ1dCB5b3UgY2FuIGFsc28gcnVuIGl0IHRvCisgICAgY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGZvciBhIHByb2plY3QgdGhhdCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LgorPC9wPgorPHA+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIEVjbGlwc2Ugd2l0aCBBRFQ6CiA8L3A+CiA8b2w+Ci0gIDxsaT4KLSAgICBJbiBFY2xpcHNlLCBzZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3N0cm9uZz4uIFRoaXMKLSAgICBvcGVucyB0aGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZy4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBkaWFsb2csIGluIHRoZSBXaXphcmRzIGRyb3AtZG93biBsaXN0LAotICAgIGZpbmQgdGhlIGVudHJ5IGZvciBBbmRyb2lkLCB0aGVuIGNsaWNrIHRoZSB0b2dnbGUgdG8gdGhlIGxlZnQuIFNlbGVjdAotICAgIEFuZHJvaWQgVGVzdCBQcm9qZWN0LCB0aGVuIGF0IHRoZSBib3R0b20KLSAgICBvZiB0aGUgZGlhbG9nIGNsaWNrIE5leHQuIFRoZSBOZXcgQW5kcm9pZCBUZXN0IFByb2plY3Qgd2l6YXJkIGFwcGVhcnMuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBFbnRlciBhIHByb2plY3QgbmFtZS4gWW91IG1heSB1c2UgYW55IG5hbWUsIGJ1dCB5b3UgbWF5IHdhbnQgdG8KLSAgICBhc3NvY2lhdGUgdGhlIG5hbWUgd2l0aCB0aGUgcHJvamVjdCBuYW1lIGZvciB5b3VyIEFwcGxpY2F0aW9uLiBPbmUKLSAgICB3YXkgdG8gZG8gdGhpcyBpcyB0byB0YWtlIHRoZSBBcHBsaWNhdGlvbidzIHByb2plY3QgbmFtZSwgYXBwZW5kIHRoZQotICAgIHN0cmluZyAiVGVzdCIgdG8gaXQsIGFuZCB0aGVuIHVzZSB0aGlzIGFzIHRoZSB0ZXN0IGNhc2UgcHJvamVjdCBuYW1lLgotICA8L2xpPgotICA8bGk+Ci0gICAgSW4gdGhlIFRlc3QgVGFyZ2V0IHBhbmVsLCBzZXQKLSAgICBBbiBFeGlzdGluZyBBbmRyb2lkIFByb2plY3QsIGNsaWNrCi0gICAgQnJvd3NlLCB0aGVuIHNlbGVjdCB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gZnJvbQotICAgIHRoZSBsaXN0LiBZb3Ugbm93IHNlZSB0aGF0IHRoZSB3aXphcmQgaGFzIGNvbXBsZXRlZCB0aGUgVGVzdAotICAgIFRhcmdldCBQYWNrYWdlLCBBcHBsaWNhdGlvbiBOYW1lLCBhbmQKLSAgICBQYWNrYWdlIE5hbWUgZmllbGRzIGZvciB5b3UgKHRoZSBsYXR0ZXIgdHdvIGFyZSBpbgotICAgIHRoZSBQcm9wZXJ0aWVzIHBhbmVsKS4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBCdWlsZCBUYXJnZXQgcGFuZWwsIHNlbGVjdCB0aGUgQW5kcm9pZCBTREsKLSAgICBwbGF0Zm9ybSB0aGF0IHlvdSB3aWxsIHVzZSB0byB0ZXN0IHlvdXIgYXBwbGljYXRpb24uIE1ha2UgdGhpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICBidWlsZCB0YXJnZXQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gIDwvbGk+Ci0gIDxsaT4KLSAgICBDbGljayBGaW5pc2ggdG8gY29tcGxldGUgdGhlIHdpemFyZC4gSWYKLSAgICBGaW5pc2ggaXMgZGlzYWJsZWQsIGxvb2sKLSAgICBmb3IgZXJyb3IgbWVzc2FnZXMgYXQgdGhlIHRvcCBvZiB0aGUgd2l6YXJkIGRpYWxvZywgYW5kIHRoZW4gZml4Ci0gICAgYW55IHByb2JsZW1zLgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW4gRWNsaXBzZSwgc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zdHJvbmc+LiBUaGlzIG9wZW5zIHRoZSA8ZW0+U2VsZWN0IGEKKyAgICAgICAgV2l6YXJkPC9lbT4gZGlhbG9nLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgZGlhbG9nLCBpbiB0aGUgPGVtPldpemFyZHM8L2VtPiBkcm9wLWRvd24gbGlzdCwgZmluZCB0aGUgZW50cnkgZm9yIEFuZHJvaWQsIHRoZW4KKyAgICAgICAgY2xpY2sgdGhlIHRvZ2dsZSB0byB0aGUgbGVmdC4gU2VsZWN0IDxzdHJvbmc+QW5kcm9pZCBUZXN0IFByb2plY3Q8L3N0cm9uZz4sIHRoZW4gYXQgdGhlCisgICAgICAgIGJvdHRvbSBvZiB0aGUgZGlhbG9nIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPi4gVGhlIDxlbT5OZXcgQW5kcm9pZCBUZXN0IFByb2plY3Q8L2VtPgorICAgICAgICB3aXphcmQgYXBwZWFycy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTmV4dCB0byA8ZW0+VGVzdCBQcm9qZWN0IE5hbWU8L2VtPiwgZW50ZXIgYSBuYW1lIGZvciB0aGUgcHJvamVjdC4gWW91IG1heSB1c2UgYW55IG5hbWUsCisgICAgICAgIGJ1dCB5b3UgbWF5IHdhbnQgdG8gYXNzb2NpYXRlIHRoZSBuYW1lIHdpdGggdGhlIHByb2plY3QgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0byB0YWtlIHRoZSBhcHBsaWNhdGlvbidzIHByb2plY3QgbmFtZSwgYXBwZW5kIHRoZSBzdHJpbmcgIlRlc3QiIHRvCisgICAgICAgIGl0LCBhbmQgdGhlbiB1c2UgdGhpcyBhcyB0aGUgdGVzdCBwYWNrYWdlIHByb2plY3QgbmFtZS4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIHN1Z2dlc3RlZCBwcm9qZWN0IHBhdGgsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGlzIGluIHRoZQorICAgICAgICAgICAgbmV4dCBzdGVwLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+Q29udGVudDwvZW0+IHBhbmVsLCBleGFtaW5lIHRoZSBzdWdnZXN0ZWQgcGF0aCB0byB0aGUgcHJvamVjdC4KKyAgICAgICAgSWYgPGVtPlVzZSBkZWZhdWx0IGxvY2F0aW9uPC9lbT4gaXMgc2V0LCB0aGVuIHRoZSB3aXphcmQgd2lsbCBzdWdnZXN0IGEgcGF0aCB0aGF0IGlzCisgICAgICAgIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgd29ya3NwYWNlIHBhdGggYW5kIHRoZSBwcm9qZWN0IG5hbWUgeW91IGVudGVyZWQuIEZvciBleGFtcGxlLAorICAgICAgICBpZiB5b3VyIHdvcmtzcGFjZSBwYXRoIGlzIDxjb2RlPi91c3IvbG9jYWwvd29ya3NwYWNlPC9jb2RlPiBhbmQgeW91ciBwcm9qZWN0IG5hbWUgaXMKKyAgICAgICAgPGNvZGU+TXlUZXN0QXBwPC9jb2RlPiwgdGhlbiB0aGUgd2l6YXJkIHdpbGwgc3VnZ2VzdAorICAgICAgICA8Y29kZT4vdXNyL2xvY2FsL3dvcmtzcGFjZS9NeVRlc3RBcHA8L2NvZGU+LiBUbyBlbnRlciB5b3VyIG93bgorICAgICAgICBjaG9pY2UgZm9yIGEgcGF0aCwgdW5zZWxlY3QgPGVtPlVzZSBkZWZhdWx0IGxvY2F0aW9uPC9lbT4sIHRoZW4gZW50ZXIgb3IgYnJvd3NlIHRvIHRoZQorICAgICAgICBwYXRoIHdoZXJlIHlvdSB3YW50IHlvdXIgcHJvamVjdC4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBUbyBsZWFybiBtb3JlIGFib3V0IGNob29zaW5nIHRoZSBsb2NhdGlvbiBvZiB0ZXN0IHByb2plY3RzLCBwbGVhc2UgcmVhZAorICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1Rlc3RQcm9qZWN0UGF0aHMiPgorICAgICAgICAgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBUZXN0IFRhcmdldCBwYW5lbCwgc2V0IEFuIEV4aXN0aW5nIEFuZHJvaWQgUHJvamVjdCwgY2xpY2sgQnJvd3NlLCB0aGVuIHNlbGVjdCB5b3VyCisgICAgICAgIEFuZHJvaWQgYXBwbGljYXRpb24gZnJvbSB0aGUgbGlzdC4gWW91IG5vdyBzZWUgdGhhdCB0aGUgd2l6YXJkIGhhcyBjb21wbGV0ZWQgdGhlIFRlc3QKKyAgICAgICAgVGFyZ2V0IFBhY2thZ2UsIEFwcGxpY2F0aW9uIE5hbWUsIGFuZCBQYWNrYWdlIE5hbWUgZmllbGRzIGZvciB5b3UgKHRoZSBsYXR0ZXIgdHdvIGFyZSBpbgorICAgICAgICB0aGUgUHJvcGVydGllcyBwYW5lbCkuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBCdWlsZCBUYXJnZXQgcGFuZWwsIHNlbGVjdCB0aGUgQW5kcm9pZCBTREsgcGxhdGZvcm0gdGhhdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdAorICAgICAgICB1c2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBDbGljayBGaW5pc2ggdG8gY29tcGxldGUgdGhlIHdpemFyZC4gSWYgRmluaXNoIGlzIGRpc2FibGVkLCBsb29rIGZvciBlcnJvciBtZXNzYWdlcyBhdCB0aGUKKyAgICAgICAgdG9wIG9mIHRoZSB3aXphcmQgZGlhbG9nLCBhbmQgdGhlbiBmaXggYW55IHByb2JsZW1zLgorICAgIDwvbGk+Cis8L29sPgorPGgyIGlkPSJDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IFBhY2thZ2U8L2gyPgorPHA+CisgICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgcGFja2FnZS4gVGhpcyBwYWNrYWdlIGRvZXMgbm90CisgICAgcmVxdWlyZSBhbiBBY3Rpdml0eSwgYWx0aG91Z2ggeW91IGNhbiBkZWZpbmUgb25lIGlmIHlvdSB3aXNoLiBBbHRob3VnaCB5b3VyIHRlc3QgcGFja2FnZSBjYW4KKyAgICBjb21iaW5lIEFjdGl2aXR5IGNsYXNzZXMsIHRlc3QgY2FzZSBjbGFzc2VzLCBvciBvcmRpbmFyeSBjbGFzc2VzLCB5b3VyIG1haW4gdGVzdCBjYXNlCisgICAgc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgb3IgSlVuaXQgY2xhc3NlcywgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZQorICAgIGJlc3QgdGVzdGluZyBmZWF0dXJlcy4KKzwvcD4KKzxwPgorICAgIFRlc3QgcGFja2FnZXMgZG8gbm90IG5lZWQgdG8gaGF2ZSBhbiBBbmRyb2lkIEdVSS4gV2hlbiB5b3UgcnVuIHRoZSBwYWNrYWdlIGluCisgICAgRWNsaXBzZSB3aXRoIEFEVCwgaXRzIHJlc3VsdHMgYXBwZWFyIGluIHRoZSBKVW5pdCB2aWV3LiBSdW5uaW5nIHRlc3RzIGFuZCBzZWVpbmcgdGhlIHJlc3VsdHMgaXMKKyAgICBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1J1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9hPi4KKzwvcD4KKworPHA+CisgICAgVG8gY3JlYXRlIGEgdGVzdCBwYWNrYWdlLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjYXNlIGNsYXNzZXMgZGVmaW5lZCBpbgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QgYW5kcm9pZC50ZXN0fS4gVGhlc2UgZXh0ZW5kIHRoZSBKVW5pdAorICAgIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgVGVzdENhc2V9IGNsYXNzLiBUaGUgQW5kcm9pZCB0ZXN0IGNsYXNzZXMgZm9yIEFjdGl2aXR5IG9iamVjdHMKKyAgICBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nIGFuIEFjdGl2aXR5LiBUbyBsZWFybiBtb3JlIGFib3V0IHRlc3QgY2FzZQorICAgIGNsYXNzZXMsIHBsZWFzZSByZWFkIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKzwvcD4KKzxwPgorICAgIEJlZm9yZSB5b3UgY3JlYXRlIHlvdXIgdGVzdCBwYWNrYWdlLCB5b3UgY2hvb3NlIHRoZSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciB5b3Ugd2FudCB0byB1c2UKKyAgICBmb3IgeW91ciB0ZXN0IGNhc2UgY2xhc3NlcyBhbmQgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIHlvdSB3YW50IHRvIHVzZS4gVG8gbGVhcm4gbW9yZQorICAgIGFib3V0IHRoaXMsIHBsZWFzZSByZWFkCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI1BhY2thZ2VOYW1lcyI+CisgICAgVGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LgorPC9wPgorPHA+CisgICAgVG8gYWRkIGEgdGVzdCBjYXNlIGNsYXNzIHRvIHlvdXIgcHJvamVjdDoKKzwvcD4KKzxvbD4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+UHJvamVjdCBFeHBsb3JlcjwvZW0+IHRhYiwgb3BlbiB5b3VyIHRlc3QgcHJvamVjdCwgdGhlbiBvcGVuIHRoZSA8ZW0+c3JjPC9lbT4KKyAgICAgICAgZm9sZGVyLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBGaW5kIHRoZSBKYXZhIHBhY2thZ2UgaWRlbnRpZmllciBzZXQgYnkgdGhlIHByb2plY3Rpb24gY3JlYXRpb24gd2l6YXJkLiBJZiB5b3UgaGF2ZW4ndAorICAgICAgICBhZGRlZCBjbGFzc2VzIHlldCwgdGhpcyBub2RlIHdvbid0IGhhdmUgYW55IGNoaWxkcmVuLCBhbmQgaXRzIGljb24gd2lsbCBub3QgYmUgZmlsbGVkIGluLgorICAgICAgICBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGlkZW50aWZpZXIgdmFsdWUsIHJpZ2h0LWNsaWNrIHRoZSBpZGVudGlmaWVyIGFuZCBzZWxlY3QKKyAgICAgICAgPHN0cm9uZz5SZWZhY3Rvcjwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+UmVuYW1lPC9zdHJvbmc+LCB0aGVuIGVudGVyIHRoZSBuZXcgbmFtZS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgV2hlbiB5b3UgYXJlIHJlYWR5LCByaWdodC1jbGljayB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIgYWdhaW4gYW5kIHNlbGVjdAorICAgICAgICA8c3Ryb25nPk5ldzwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+Q2xhc3M8L3N0cm9uZz4uIFRoaXMgZGlzcGxheXMgdGhlIDxlbT5OZXcgSmF2YSBDbGFzczwvZW0+CisgICAgICAgIGRpYWxvZywgd2l0aCB0aGUgPGVtPlNvdXJjZSBmb2xkZXI8L2VtPiBhbmQgPGVtPlBhY2thZ2U8L2VtPiB2YWx1ZXMgYWxyZWFkeSBzZXQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+TmFtZTwvZW0+IGZpZWxkLCBlbnRlciBhIG5hbWUgZm9yIHRoZSB0ZXN0IGNhc2UgY2xhc3MuIE9uZSB3YXkgdG8gY2hvb3NlIGEKKyAgICAgICAgY2xhc3MgbmFtZSBpcyB0byBhcHBlbmQgdGhlIHN0cmluZyAiVGVzdCIgdG8gdGhlIGNsYXNzIG9mIHRoZSBjb21wb25lbnQgeW91IGFyZSB0ZXN0aW5nLgorICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB0ZXN0aW5nIHRoZSBjbGFzcyBNeUFwcEFjdGl2aXR5LCB5b3VyIHRlc3QgY2FzZSBjbGFzcworICAgICAgICBuYW1lIHdvdWxkIGJlIE15QXBwQWN0aXZpdHlUZXN0LiBMZWF2ZSB0aGUgbW9kaWZpZXJzIHNldCB0byA8ZW0+cHVibGljPC9lbT4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSA8ZW0+U3VwZXJjbGFzczwvZW0+IGZpZWxkLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgQW5kcm9pZCB0ZXN0IGNhc2UgY2xhc3MgeW91CisgICAgICAgIGFyZSBleHRlbmRpbmcuIFlvdSBjYW4gYWxzbyBicm93c2UgdGhlIGF2YWlsYWJsZSBjbGFzc2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJbiA8ZW0+V2hpY2ggbWV0aG9kIHN0dWJzIHdvdWxkIHlvdSBsaWtlIHRvIGNyZWF0ZT88L2VtPiwgdW5zZXQgYWxsIHRoZSBvcHRpb25zLCB0aGVuCisgICAgICAgIGNsaWNrIDxzdHJvbmc+RmluaXNoPC9zdHJvbmc+LiBZb3Ugd2lsbCBzZXQgdXAgdGhlIGNvbnN0cnVjdG9yIG1hbnVhbGx5LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBZb3VyIG5ldyBjbGFzcyBhcHBlYXJzIGluIGEgbmV3IEphdmEgZWRpdG9yIHBhbmUuCisgICAgPC9saT4KIDwvb2w+CiA8cD4KLQotPC9wPgotPGgyIGlkPSJDcmVhdGVUZXN0QXBwRWNsaXBzZSI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9oMj4KLTxwPgotICBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSB0ZXN0IHByb2plY3QsIHlvdSBwb3B1bGF0ZSBpdCB3aXRoIGEgdGVzdAotICBBbmRyb2lkIGFwcGxpY2F0aW9uLiBUaGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW4ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IEFjdGl2aXR5fSwKLSAgYWx0aG91Z2ggeW91IGNhbiBkZWZpbmUgb25lIGlmIHlvdSB3aXNoLiBBbHRob3VnaCB5b3VyIHRlc3QgYXBwbGljYXRpb24gY2FuCi0gIGNvbWJpbmUgQWN0aXZpdGllcywgQW5kcm9pZCB0ZXN0IGNsYXNzIGV4dGVuc2lvbnMsIEpVbml0IGV4dGVuc2lvbnMsIG9yCi0gIG9yZGluYXJ5IGNsYXNzZXMsIHlvdSBzaG91bGQgZXh0ZW5kIG9uZSBvZiB0aGUgQW5kcm9pZCB0ZXN0IGNsYXNzZXMgb3IgSlVuaXQgY2xhc3NlcywKLSAgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZSBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCisgICAgWW91IG5vdyBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBzZXQgdXAgY29ycmVjdGx5LiBDcmVhdGUgYSBjb25zdHJ1Y3RvciBmb3IgeW91cgorICAgIGNsYXNzIHRoYXQgaGFzIG5vIGFyZ3VtZW50czsgdGhpcyBpcyByZXF1aXJlZCBieSBKVW5pdC4gQXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGlzCisgICAgY29uc3RydWN0b3IsIGFkZCBhIGNhbGwgdG8gdGhlIGJhc2UgY2xhc3MnIGNvbnN0cnVjdG9yLiBFYWNoIGJhc2UgdGVzdCBjYXNlIGNsYXNzIGhhcyBpdHMKKyAgICBvd24gY29uc3RydWN0b3Igc2lnbmF0dXJlLiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIDwvcD4KIDxwPgotICBUZXN0IGFwcGxpY2F0aW9ucyBkbyBub3QgaGF2ZSBhbiBBbmRyb2lkIEdVSS4gSW5zdGVhZCwgd2hlbiB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBpbgotICBFY2xpcHNlIHdpdGggQURULCBpdHMgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIElmIHlvdSBydW4KLSAgeW91ciB0ZXN0cyB3aXRoIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSAob3IgYSByZWxhdGVkIHRlc3QgcnVubmVyKSwKLSAgdGhlbiBpdCB3aWxsIHJ1biBhbGwgdGhlIG1ldGhvZHMgaW4gZWFjaCBjbGFzcy4gWW91IGNhbiBtb2RpZnkgdGhpcyBiZWhhdmlvcgotICBieSB1c2luZyB0aGUge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUgVGVzdFN1aXRlfSBjbGFzcy4KLTwvcD4KLQotPHA+Ci0gIFRvIGNyZWF0ZSBhIHRlc3QgYXBwbGljYXRpb24sIHN0YXJ0IHdpdGggb25lIG9mIEFuZHJvaWQncyB0ZXN0IGNsYXNzZXMgaW4gdGhlIEphdmEgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uCi0gIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MuIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzCi0gIGFsc28gcHJvdmlkZSBpbnN0cnVtZW50YXRpb24gZm9yIHRlc3RpbmcuCi08L3A+Ci08cD4KLSAgRm9yIHRlc3QgY2xhc3NlcyB0aGF0IGV4dGVuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSwgeW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUKLSAgdGhlIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZCA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzOgorICAgIFRvIGNvbnRyb2wgeW91ciB0ZXN0IGVudmlyb25tZW50LCB5b3Ugd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPiBhbmQKKyAgICA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzOgogPC9wPgogPHVsPgotICA8bGk+Ci0gICAgPGNvZGU+c2V0VXAoKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGFueSBvZiB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcy4KLSAgICAgIFVzZSBpdCB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdC4gWW91IGNhbiB1c2UgPGNvZGU+c2V0VXAoKTwvY29kZT4KLSAgICAgIHRvIGluc3RhbnRpYXRlIGEgbmV3IDxjb2RlPkludGVudDwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGFjdGlvbiA8Y29kZT5BQ1RJT05fTUFJTjwvY29kZT4uIFlvdSBjYW4KLSAgICAgIHRoZW4gdXNlIHRoaXMgaW50ZW50IHRvIHN0YXJ0IHRoZSBBY3Rpdml0eSB1bmRlciB0ZXN0LgotICAgICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBjYWxsCi0gICAgICAgIDxjb2RlPnN1cGVyLnNldFVwKCk8L2NvZGU+IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4geW91ciBjb2RlLgotICAgICAgPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPGNvZGU+dGVhckRvd24oKTwvY29kZT46IFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLiBVc2UKLSAgICBpdCB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHJlLXNldHRpbmcgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCBzZXQgb2YgdGVzdHMuCi0gICAgPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3UgbXVzdCBjYWxsCi0gICAgPGNvZGU+c3VwZXIudGVhckRvd24oKTwvY29kZT4gYXMgdGhlIDxlbT5sYXN0PC9lbT4gc3RhdGVtZW50IGluIHlvdXIgY29kZS48L3A+Ci0gIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8Y29kZT5zZXRVcCgpPC9jb2RlPjogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBiZWZvcmUgYW55IG9mIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzLgorICAgICAgICBVc2UgaXQgdG8gc2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QgKHRoZSB0ZXN0IGZpeHR1cmUuIFlvdSBjYW4gdXNlCisgICAgICAgIDxjb2RlPnNldFVwKCk8L2NvZGU+IHRvIGluc3RhbnRpYXRlIGEgbmV3IEludGVudCB3aXRoIHRoZSBhY3Rpb24gPGNvZGU+QUNUSU9OX01BSU48L2NvZGU+LgorICAgICAgICBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgaW50ZW50IHRvIHN0YXJ0IHRoZSBBY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8Y29kZT50ZWFyRG93bigpPC9jb2RlPjogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBhZnRlciBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgY2xhc3MuIFVzZQorICAgICAgICBpdCB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHRvIHJlc2V0IHRoZSB0ZXN0IGZpeHR1cmUuCisgICAgPC9saT4KIDwvdWw+CiA8cD4KLSAgQW5vdGhlciB1c2VmdWwgY29udmVudGlvbiBpcyB0byBhZGQgdGhlIG1ldGhvZCA8Y29kZT50ZXN0UHJlQ29uZGl0aW9ucygpPC9jb2RlPiB0byB5b3VyIHRlc3QKLSAgY2xhc3MuIFVzZSB0aGlzIG1ldGhvZCB0byB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LiBJZiB0aGlzCi0gIHRlc3QgZmFpbHMsIHlvdSBrbm93IHRoYXQgdGhhdCB0aGUgaW5pdGlhbCBjb25kaXRpb25zIHdlcmUgaW4gZXJyb3IuIFdoZW4gdGhpcyBoYXBwZW5zLCBmdXJ0aGVyIHRlc3QKLSAgcmVzdWx0cyBhcmUgc3VzcGVjdCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgdGVzdHMgc3VjY2VlZGVkLgorICAgIEFub3RoZXIgdXNlZnVsIGNvbnZlbnRpb24gaXMgdG8gYWRkIHRoZSBtZXRob2QgPGNvZGU+dGVzdFByZWNvbmRpdGlvbnMoKTwvY29kZT4gdG8geW91ciB0ZXN0CisgICAgY2xhc3MuIFVzZSB0aGlzIG1ldGhvZCB0byB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LiBJZiB0aGlzCisgICAgdGVzdCBmYWlscywgeW91IGtub3cgdGhhdCB0aGF0IHRoZSBpbml0aWFsIGNvbmRpdGlvbnMgd2VyZSBpbiBlcnJvci4gV2hlbiB0aGlzIGhhcHBlbnMsIGZ1cnRoZXIKKyAgICB0ZXN0IHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KIDwvcD4KIDxwPgotICBUaGUgUmVzb3VyY2VzIHRhYiBjb250YWlucyBhbiA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KLSAgdHV0b3JpYWwgd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNyZWF0aW5nIHRlc3QgY2xhc3NlcyBhbmQgbWV0aG9kcy4KKyAgICBUaGUgUmVzb3VyY2VzIHRhYiBjb250YWlucyBhbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgIHR1dG9yaWFsIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjcmVhdGluZyB0ZXN0IGNsYXNzZXMgYW5kIG1ldGhvZHMuCiA8L3A+CiA8aDIgaWQ9IlJ1blRlc3RFY2xpcHNlIj5SdW5uaW5nIFRlc3RzPC9oMj4KLTxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+Ci0gICAgPGRpdiBjbGFzcz0ic2lkZWJveCI+Ci0gICAgICAgIDxoMj5SdW5uaW5nIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZTwvaDI+Ci0gICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICBJZiB5b3UndmUgY3JlYXRlZCB5b3VyIHRlc3RzIGluIEVjbGlwc2UsIHlvdSBjYW4gc3RpbGwgcnVuIHlvdXIgdGVzdHMgYW5kIHRlc3QKLSAgICAgICAgICAgICAgICBzdWl0ZXMgYnkgdXNpbmcgY29tbWFuZC1saW5lIHRvb2xzIGluY2x1ZGVkIHdpdGggdGhlIEFuZHJvaWQgU0RLLiBZb3UgbWF5IHdhbnQgdG8KLSAgICAgICAgICAgICAgICBkbyB0aGlzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgdGVzdHMgdG8gcnVuLCBpZiB5b3UgaGF2ZSBhCi0gICAgICAgICAgICAgICAgbGFyZ2UgdGVzdCBjYXNlLCBvciBpZiB5b3Ugd2FudCBhIGZpbmUgbGV2ZWwgb2YgY29udHJvbCBvdmVyIHdoaWNoIHRlc3RzIGFyZSBydW4gYXQKLSAgICAgICAgICAgICAgICBhIHBhcnRpY3VsYXIgdGltZS4KLSAgICAgICAgICAgIDwvcD4KLSAgICAgICAgICAgIDxwPgotICAgICAgICAgICAgICAgIFRvIHJ1biB0ZXN0cyBjcmVhdGVkIGluIEVjbGlwc2Ugd2l0aCBBRFQgd2l0aCBjb21tYW5kLWxpbmUgdG9vbHMsIHlvdSBtdXN0IGZpcnN0Ci0gICAgICAgICAgICAgICAgaW5zdGFsbCBhZGRpdGlvbmFsIGZpbGVzIGludG8gdGhlIHRlc3QgcHJvamVjdCB1c2luZyB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCdzCi0gICAgICAgICAgICAgICAgImNyZWF0ZSB0ZXN0LXByb2plY3QiIG9wdGlvbi4gVG8gc2VlIGhvdyB0byBkbyB0aGlzLCByZWFkIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwjQ3JlYXRlUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgYSB0ZXN0IHByb2plY3Q8L2E+IGluIHRoZSB0b3BpYwotICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyCi0gICAgICAgICAgICAgICAgSURFczwvYT4uCi0gICAgICAgICAgICA8L3A+CisgICAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KKyAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJveCI+CisgICAgICAgICAgICA8aDI+UnVubmluZyB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmU8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UndmUgY3JlYXRlZCB5b3VyIHRlc3RzIGluIEVjbGlwc2UsIHlvdSBjYW4gc3RpbGwgcnVuIHlvdXIgdGVzdHMgYW5kIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgc3VpdGVzIGJ5IHVzaW5nIGNvbW1hbmQtbGluZSB0b29scyBpbmNsdWRlZCB3aXRoIHRoZSBBbmRyb2lkIFNESy4gWW91IG1heSB3YW50CisgICAgICAgICAgICAgICAgICAgIHRvIGRvIHRoaXMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiB0ZXN0cyB0byBydW4sIGlmIHlvdQorICAgICAgICAgICAgICAgICAgICBoYXZlIGEgbGFyZ2UgdGVzdCBjYXNlLCBvciBpZiB5b3Ugd2FudCBhIGZpbmUgbGV2ZWwgb2YgY29udHJvbCBvdmVyIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIHRlc3RzIGFyZSBydW4gYXQgYSBwYXJ0aWN1bGFyIHRpbWUuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBUbyBydW4gdGVzdHMgY3JlYXRlZCBpbiBFY2xpcHNlIHdpdGggQURUIHdpdGggY29tbWFuZC1saW5lIHRvb2xzLCB5b3UgbXVzdCBmaXJzdAorICAgICAgICAgICAgICAgICAgICBpbnN0YWxsIGFkZGl0aW9uYWwgZmlsZXMgaW50byB0aGUgdGVzdCBwcm9qZWN0IHVzaW5nIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICB0b29sJ3MgImNyZWF0ZSB0ZXN0LXByb2plY3QiIG9wdGlvbi4gVG8gc2VlIGhvdyB0byBkbyB0aGlzLCByZWFkCisgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwjQ3JlYXRlUHJvamVjdCI+CisgICAgICAgICAgICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICA8L2Rpdj4KICAgICA8L2Rpdj4KLTwvZGl2PgogPHA+Ci0gIFdoZW4geW91IHJ1biBhIHRlc3QgYXBwbGljYXRpb24gaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluCi0gIGFuIEVjbGlwc2UgdmlldyBwYW5lbC4gWW91IGNhbiBydW4gdGhlIGVudGlyZSB0ZXN0IGFwcGxpY2F0aW9uLCBvbmUgY2xhc3MsIG9yIG9uZQotICBtZXRob2Qgb2YgYSBjbGFzcy4gVG8gZG8gdGhpcywgRWNsaXBzZSBydW5zIHRoZSA8Y29kZT5hZGI8L2NvZGU+IGNvbW1hbmQgZm9yIHJ1bm5pbmcgYSB0ZXN0IGFwcGxpY2F0aW9uLCBhbmQKLSAgZGlzcGxheXMgdGhlIG91dHB1dCwgc28gdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHJ1bm5pbmcgdGVzdHMgaW5zaWRlIEVjbGlwc2UgYW5kIHJ1bm5pbmcgdGhlbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgICAgV2hlbiB5b3UgcnVuIGEgdGVzdCBwYWNrYWdlIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBvdXRwdXQgYXBwZWFycyBpbiB0aGUgRWNsaXBzZSBKVW5pdCB2aWV3LgorICAgIFlvdSBjYW4gcnVuIHRoZSBlbnRpcmUgdGVzdCBwYWNrYWdlIG9yIG9uZSB0ZXN0IGNhc2UgY2xhc3MuIFRvIGRvIHJ1biB0ZXN0cywgRWNsaXBzZSBydW5zIHRoZQorICAgIDxjb2RlPmFkYjwvY29kZT4gY29tbWFuZCBmb3IgcnVubmluZyBhIHRlc3QgcGFja2FnZSwgYW5kIGRpc3BsYXlzIHRoZSBvdXRwdXQsIHNvIHRoZXJlIGlzIG5vCisgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHJ1bm5pbmcgdGVzdHMgaW5zaWRlIEVjbGlwc2UgYW5kIHJ1bm5pbmcgdGhlbSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCiA8L3A+CiA8cD4KLSAgICBBcyB3aXRoIGFueSBvdGhlciBhcHBsaWNhdGlvbiwgdG8gcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiBpbiBFY2xpcHNlIHdpdGggQURUIHlvdSBtdXN0IGVpdGhlciBhdHRhY2ggYSBkZXZpY2UgdG8geW91cgotICAgIGNvbXB1dGVyIG9yIHVzZSB0aGUgQW5kcm9pZCBlbXVsYXRvci4gSWYgeW91IHVzZSB0aGUgZW11bGF0b3IsIHlvdSBtdXN0IGhhdmUgYW4gQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKSB0aGF0IHVzZXMKLSAgICB0aGUgc2FtZSB0YXJnZXQKKyAgICBBcyB3aXRoIGFueSBvdGhlciBwYWNrYWdlLCB0byBydW4gYSB0ZXN0IHBhY2thZ2UgaW4gRWNsaXBzZSB3aXRoIEFEVCB5b3UgbXVzdCBlaXRoZXIgYXR0YWNoIGEKKyAgICBkZXZpY2UgdG8geW91ciBjb21wdXRlciBvciB1c2UgdGhlIEFuZHJvaWQgZW11bGF0b3IuIElmIHlvdSB1c2UgdGhlIGVtdWxhdG9yLCB5b3UgbXVzdCBoYXZlIGFuCisgICAgQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKSB0aGF0IHVzZXMgdGhlIHNhbWUgdGFyZ2V0IGFzIHRoZSB0ZXN0IHBhY2thZ2UuCiA8L3A+CiA8cD4KLSAgVG8gcnVuIGEgdGVzdCBpbiBFY2xpcHNlLCB5b3UgaGF2ZSB0d28gY2hvaWNlczo8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgUnVuIGEgdGVzdCBqdXN0IGFzIHlvdSBydW4gYW4gYXBwbGljYXRpb24sIGJ5IHNlbGVjdGluZwotICA8c3Ryb25nPlJ1biBBcy4uLiAmZ3Q7IEFuZHJvaWQgSlVuaXQgVGVzdDwvc3Ryb25nPiBmcm9tIHRoZSBwcm9qZWN0J3MgY29udGV4dCBtZW51IG9yCi0gIGZyb20gdGhlIG1haW4gbWVudSdzIDxzdHJvbmc+UnVuPC9zdHJvbmc+IGl0ZW0uCi0gIDwvbGk+Ci0gIDxsaT4KLSAgQ3JlYXRlIGFuIEVjbGlwc2UgcnVuIGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgdGVzdCBwcm9qZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCBtdWx0aXBsZSB0ZXN0IHN1aXRlcywgZWFjaCBjb25zaXN0aW5nIG9mIHNlbGVjdGVkIHRlc3RzIGZyb20gdGhlIHByb2plY3QuIFRvIHJ1bgotICBhIHRlc3Qgc3VpdGUsIHlvdSBydW4gdGhlIHRlc3QgY29uZmlndXJhdGlvbi4KLSAgPHA+Ci0gICAgQ3JlYXRpbmcgYW5kIHJ1bm5pbmcgdGVzdCBjb25maWd1cmF0aW9ucyBpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KLSAgPC9wPgotICA8L2xpPgotPC9vbD4KLTxwPlRvIGNyZWF0ZSBhbmQgcnVuIGEgdGVzdCBzdWl0ZSB1c2luZyBhIHJ1biBjb25maWd1cmF0aW9uOjwvcD4KLTxvbD4KLSAgPGxpPgotICAgIEluIHRoZSBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIHRlc3QKLSAgICBwcm9qZWN0LCB0aGVuIGZyb20gdGhlIG1haW4gbWVudSwgc2VsZWN0Ci0gICAgPHN0cm9uZz5SdW4gJmd0OyBSdW4gQ29uZmlndXJhdGlvbnMuLi48L3N0cm9uZz4uIFRoZQotICAgIFJ1biBDb25maWd1cmF0aW9ucyBkaWFsb2cgYXBwZWFycy4KLSAgPC9saT4KLSAgPGxpPgotICAgIEluIHRoZSBsZWZ0LWhhbmQgcGFuZSwgZmluZCB0aGUKLSAgICBBbmRyb2lkIEpVbml0IFRlc3QgZW50cnkuCi0gICAgSW4gdGhlIHJpZ2h0LWhhbmQgcGFuZSwgY2xpY2sgdGhlIFRlc3QgdGFiLgotICAgIFRoZSBOYW1lOiB0ZXh0IGJveAotICAgIHNob3dzIHRoZSBuYW1lIG9mIHlvdXIgcHJvamVjdC4gVGhlCi0gICAgVGVzdCBjbGFzczogZHJvcGRvd24gYm94IHNob3dzIG9uZSB5b3VyIHByb2plY3QncyBjbGFzc2VzCi0gICAgdGVzdCBjbGFzc2VzIGluIHlvdXIgcHJvamVjdC4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRvIHJ1biBvbmUgdGVzdCBjbGFzcywgY2xpY2sgIFJ1biBhIHNpbmdsZSB0ZXN0LCB0aGVuIGVudGVyIHlvdXIgcHJvamVjdAotICAgIG5hbWUgaW4gdGhlIFByb2plY3Q6IHRleHQgYm94IGFuZCB0aGUgY2xhc3MgbmFtZSBpbiB0aGUKLSAgICBUZXN0IGNsYXNzOiB0ZXh0IGJveC4KLSAgICA8cD4KLSAgICAgICAgVG8gcnVuIGFsbCB0aGUgdGVzdCBjbGFzc2VzLAotICAgICAgICBjbGljayBSdW4gYWxsIHRlc3RzIGluIHRoZSBzZWxlY3RlZCBwcm9qZWN0IG9yIHBhY2thZ2UsCi0gICAgICAgIHRoZW4gZW50ZXIgdGhlIHByb2plY3Qgb3IgcGFja2FnZSBuYW1lIGluIHRoZSB0ZXh0IGJveC4KLSAgICA8L3A+Ci0gPC9saT4KLSAgPGxpPgotICAgIE5vdyBjbGljayB0aGUgVGFyZ2V0IHRhYi4KLSAgICA8dWw+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgIE9wdGlvbmFsOiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBlbXVsYXRvciwgY2xpY2sKLSAgICAgICAgICAgIEF1dG9tYXRpYywgdGhlbiBpbiB0aGUgQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKQotICAgICAgICAgICAgc2VsZWN0aW9uIHRhYmxlLCBzZWxlY3QgYW4gZXhpc3RpbmcgQVZELgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgICBJbiB0aGUgRW11bGF0b3IgTGF1bmNoIFBhcmFtZXRlcnMgcGFuZSwgc2V0IHRoZQotICAgICAgICAgICAgQW5kcm9pZCBlbXVsYXRvciBmbGFncyB5b3Ugd2FudCB0byB1c2UuIFRoZXNlIGFyZSBkb2N1bWVudGVkIGluIHRoZSB0b3BpYwotICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCNzdGFydHVwLW9wdGlvbnMiPkVtdWxhdG9yIFN0YXJ0dXAgT3B0aW9uczwvYT4uCi0gICAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPGxpPgotICAgIENsaWNrIHRoZSBDb21tb24gdGFiLiBJbiB0aGUKLSAgICBTYXZlIEFzIHBhbmUsIGNsaWNrIExvY2FsIHRvIHNhdmUKLSAgICB0aGlzIHJ1biBjb25maWd1cmF0aW9uIGxvY2FsbHksIG9yIGNsaWNrIFNoYXJlZCB0bwotICAgIHNhdmUgaXQgdG8gYW5vdGhlciBwcm9qZWN0LgotICA8L2xpPgotICA8bGk+Ci0gICAgT3B0aW9uYWw6IEFkZCB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgUnVuIHRvb2xiYXIgYW5kIHRoZSA8c3Ryb25nPkZhdm9yaXRlczwvc3Ryb25nPgotICAgIG1lbnU6IGluIHRoZSBEaXNwbGF5IGluIEZhdm9yaXRlcyBwYW5lCi0gICAgY2xpY2sgdGhlIGNoZWNrYm94IG5leHQgdG8gUnVuLgotICA8L2xpPgotICA8bGk+Ci0gICAgT3B0aW9uYWw6IFRvIGFkZCB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIDxzdHJvbmc+RGVidWc8L3N0cm9uZz4gbWVudSBhbmQgdG9vbGJhciwgY2xpY2sKLSAgICB0aGUgY2hlY2tib3ggbmV4dCB0byBEZWJ1Zy4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRvIHNhdmUgeW91ciBzZXR0aW5ncywgY2xpY2sgQ2xvc2UuPGJyLz4KLSAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBBbHRob3VnaCB5b3UgY2FuIHJ1biB0aGUgdGVzdCBpbW1lZGlhdGVseSBieQotICAgIGNsaWNraW5nIFJ1biwgeW91IHNob3VsZCBzYXZlIHRoZSB0ZXN0IGZpcnN0IGFuZCB0aGVuCi0gICAgcnVuIGl0IGJ5IHNlbGVjdGluZyBpdCBmcm9tIHRoZSBFY2xpcHNlIHN0YW5kYXJkIHRvb2xiYXIuPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgT24gdGhlIEVjbGlwc2Ugc3RhbmRhcmQgdG9vbGJhciwgY2xpY2sgdGhlIGRvd24gYXJyb3cgbmV4dCB0byB0aGUKLSAgICBncmVlbiBSdW4gYXJyb3cuIFRoaXMgZGlzcGxheXMgYSBtZW51IG9mIHNhdmVkIFJ1biBhbmQgRGVidWcKLSAgICBjb25maWd1cmF0aW9ucy4KLSAgPC9saT4KLSAgPGxpPgotICAgIFNlbGVjdCB0aGUgdGVzdCBydW4gY29uZmlndXJhdGlvbiB5b3UganVzdCBjcmVhdGVkLgotICA8L2xpPgotICA8bGk+Ci0gICAgVGhlIHByb2dyZXNzIG9mIHlvdXIgdGVzdCBhcHBlYXJzIGluIHRoZSBDb25zb2xlIHZpZXcuCi0gICAgWW91IHNob3VsZCBzZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlcywgYW1vbmcgb3RoZXJzOgotICAgIDx1bD4KLSAgICAgIDxsaT4KLSAgICAgICAgPGNvZGU+UGVyZm9ybWluZyBBbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciBKVW5pdCBsYXVuY2g8L2NvZGU+PGJyPgotICAgICAgICBUaGUgY2xhc3MgbmFtZSB0aGF0IHByb2NlZWRzICJKVW5pdCIgZGVwZW5kcyBvbiB0aGUgQW5kcm9pZCBpbnN0cnVtZW50YXRpb24KLSAgICAgICAgY2xhc3MgeW91IGhhdmUgY2hvc2VuLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgSWYgeW91IGFyZSB1c2luZyBhbiBlbXVsYXRvciBhbmQgeW91IGhhdmUgbm90IHlldCBzdGFydGVkIGl0LCB0aGVuIHlvdSB3aWxsIHNlZQotICAgICAgICB0aGUgbWVzc2FnZToKKyAgICBUbyBydW4gYSB0ZXN0IGluIEVjbGlwc2UsIHlvdSBoYXZlIHR3byBjaG9pY2VzOjwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFJ1biBhIHRlc3QganVzdCBhcyB5b3UgcnVuIGFuIGFwcGxpY2F0aW9uLCBieSBzZWxlY3RpbmcKKyAgICAgICAgPHN0cm9uZz5SdW4gQXMuLi4gJmd0OyBBbmRyb2lkIEpVbml0IFRlc3Q8L3N0cm9uZz4gZnJvbSB0aGUgcHJvamVjdCdzIGNvbnRleHQgbWVudSBvcgorICAgICAgICBmcm9tIHRoZSBtYWluIG1lbnUncyA8c3Ryb25nPlJ1bjwvc3Ryb25nPiBpdGVtLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBDcmVhdGUgYW4gRWNsaXBzZSBydW4gY29uZmlndXJhdGlvbiBmb3IgeW91ciB0ZXN0IHByb2plY3QuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50CisgICAgICAgIG11bHRpcGxlIHRlc3Qgc3VpdGVzLCBlYWNoIGNvbnNpc3Rpbmcgb2Ygc2VsZWN0ZWQgdGVzdHMgZnJvbSB0aGUgcHJvamVjdC4gVG8gcnVuCisgICAgICAgIGEgdGVzdCBzdWl0ZSwgeW91IHJ1biB0aGUgdGVzdCBjb25maWd1cmF0aW9uLgogICAgICAgICA8cD4KLSAgICAgICAgICA8Y29kZT5BdXRvbWF0aWMgVGFyZ2V0IE1vZGU6IGxhdW5jaGluZyBuZXcgZW11bGF0b3Igd2l0aCBjb21wYXRpYmxlCi0gICAgICAgICAgQVZEIDxlbT5hdmRuYW1lPC9lbT48L2NvZGU+PGJyPih3aGVyZSA8ZW0+YXZkbmFtZTwvZW0+IGlzIHRoZSBuYW1lIG9mCi0gICAgICAgICAgdGhlIEFWRCB5b3UgYXJlIHVzaW5nLikKKyAgICAgICAgICAgIENyZWF0aW5nIGFuZCBydW5uaW5nIHRlc3QgY29uZmlndXJhdGlvbnMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCiAgICAgICAgIDwvcD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGluc3RhbGxlZCB5b3VyIHRlc3QgYXBwbGljYXRpb24sIHRoZW4geW91IHdpbGwgc2VlCi0gICAgICAgIHRoZSBtZXNzYWdlOgorICAgIDwvbGk+Cis8L3VsPgorPHA+CisgICAgVG8gY3JlYXRlIGFuZCBydW4gYSB0ZXN0IHN1aXRlIHVzaW5nIGEgcnVuIGNvbmZpZ3VyYXRpb246Cis8L3A+Cis8b2w+CisgICAgPGxpPgorICAgICAgICBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSB0ZXN0IHByb2plY3QsIHRoZW4gZnJvbSB0aGUgbWFpbiBtZW51LCBzZWxlY3QKKyAgICAgICAgPHN0cm9uZz5SdW4gJmd0OyBSdW4gQ29uZmlndXJhdGlvbnMuLi48L3N0cm9uZz4uIFRoZSBSdW4gQ29uZmlndXJhdGlvbnMgZGlhbG9nIGFwcGVhcnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluIHRoZSBsZWZ0LWhhbmQgcGFuZSwgZmluZCB0aGUgQW5kcm9pZCBKVW5pdCBUZXN0IGVudHJ5LiBJbiB0aGUgcmlnaHQtaGFuZCBwYW5lLCBjbGljayB0aGUKKyAgICAgICAgVGVzdCB0YWIuIFRoZSBOYW1lOiB0ZXh0IGJveCBzaG93cyB0aGUgbmFtZSBvZiB5b3VyIHByb2plY3QuIFRoZSBUZXN0IGNsYXNzOiBkcm9wZG93biBib3gKKyAgICAgICAgc2hvd3Mgb25lIG9mIHRoZSB0ZXN0IGNsYXNzZXMgaW4geW91ciBwcm9qZWN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUbyBydW4gb25lIHRlc3QgY2xhc3MsIGNsaWNrICBSdW4gYSBzaW5nbGUgdGVzdCwgdGhlbiBlbnRlciB5b3VyIHByb2plY3QgbmFtZSBpbiB0aGUKKyAgICAgICAgUHJvamVjdDogdGV4dCBib3ggYW5kIHRoZSBjbGFzcyBuYW1lIGluIHRoZSBUZXN0IGNsYXNzOiB0ZXh0IGJveC4KICAgICAgICAgPHA+Ci0gICAgICAgICAgPGNvZGU+VXBsb2FkaW5nIDxlbT50ZXN0Y2xhc3M8L2VtPi5hcGsgb250byBkZXZpY2UgJzxlbT5kZXZpY2UtaWQ8L2VtPic8L2NvZGU+PGJyPgotICAgICAgICAgIHdoZXJlIDxlbT50ZXN0Y2xhc3M8L2VtPiBpcyB0aGUgbmFtZSBvZiB5b3VyIHVuaXQgdGVzdCBjbGFzcyBhbmQgPGVtPmRldmljZS1pZDwvZW0+Ci0gICAgICAgICAgaXMgdGhlIG5hbWUgYW5kIHBvcnQgZm9yIHlvdXIgdGVzdCBkZXZpY2Ugb3IgZW11bGF0b3IsIGZvbGxvd2VkIGJ5IHRoZSBtZXNzYWdlIDxjb2RlPkluc3RhbGxpbmcgPGVtPnRlc3RjbGFzczwvZW0+LmFwazwvY29kZT4KKyAgICAgICAgICAgIFRvIHJ1biBhbGwgdGhlIHRlc3QgY2xhc3NlcywgY2xpY2sgUnVuIGFsbCB0ZXN0cyBpbiB0aGUgc2VsZWN0ZWQgcHJvamVjdCBvciBwYWNrYWdlLAorICAgICAgICAgICAgdGhlbiBlbnRlciB0aGUgcHJvamVjdCBvciBwYWNrYWdlIG5hbWUgaW4gdGhlIHRleHQgYm94LgogICAgICAgICA8L3A+Ci0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgIDxjb2RlPkxhdW5jaGluZyBpbnN0cnVtZW50YXRpb24gQW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgb24gZGV2aWNlIDxlbT5kZXZpY2UtaWQ8L2VtPjwvY29kZT4uPGJyPgotICAgICAgIFRoaXMgaW5kaWNhdGVzIHRoYXQgQW5kcm9pZCdzIEluc3RydW1lbnRhdGlvbiBzeXN0ZW0gaXMgbm93IHRlc3RpbmcgeW91ciBjb2RlLiBBZ2FpbiwgdGhlCi0gICAgICAgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIG5hbWUgZGVwZW5kcyBvbiB0aGUgQW5kcm9pZCBpbnN0cnVtZW50YXRpb24gY2xhc3MgeW91IGhhdmUgY2hvc2VuLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICA8Y29kZT5UZXN0IHJ1biBjb21wbGV0ZTwvY29kZT4uPGJyPiBXaGVuIHlvdSBzZWUgdGhpcywgeW91ciB1bml0IHRlc3RzIGhhdmUgZmluaXNoZWQuCi0gICAgICA8L2xpPgotICAgIDwvdWw+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5vdyBjbGljayB0aGUgVGFyZ2V0IHRhYi4KKyAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgIE9wdGlvbmFsOiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBlbXVsYXRvciwgY2xpY2sgQXV0b21hdGljLCB0aGVuIGluIHRoZSBBbmRyb2lkCisgICAgICAgICAgICAgICAgVmlydHVhbCBEZXZpY2UgKEFWRCkgc2VsZWN0aW9uIHRhYmxlLCBzZWxlY3QgYW4gZXhpc3RpbmcgQVZELgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICBJbiB0aGUgRW11bGF0b3IgTGF1bmNoIFBhcmFtZXRlcnMgcGFuZSwgc2V0IHRoZSBBbmRyb2lkIGVtdWxhdG9yIGZsYWdzIHlvdSB3YW50IHRvCisgICAgICAgICAgICAgICAgdXNlLiBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgdG9waWMKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sI3N0YXJ0dXAtb3B0aW9ucyI+CisgICAgICAgICAgICAgICAgQW5kcm9pZCBFbXVsYXRvcjwvYT4uCisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8L3VsPgorICAgIDxsaT4KKyAgICAgICAgQ2xpY2sgdGhlIENvbW1vbiB0YWIuIEluIHRoZSBTYXZlIEFzIHBhbmUsIGNsaWNrIExvY2FsIHRvIHNhdmUgdGhpcyBydW4gY29uZmlndXJhdGlvbgorICAgICAgICBsb2NhbGx5LCBvciBjbGljayBTaGFyZWQgdG8gc2F2ZSBpdCB0byBhbm90aGVyIHByb2plY3QuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE9wdGlvbmFsOiBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIFJ1biB0b29sYmFyIGFuZCB0aGUgPHN0cm9uZz5GYXZvcml0ZXM8L3N0cm9uZz4KKyAgICAgICAgbWVudTogaW4gdGhlIERpc3BsYXkgaW4gRmF2b3JpdGVzIHBhbmUgY2xpY2sgdGhlIGNoZWNrYm94IG5leHQgdG8gUnVuLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBPcHRpb25hbDogVG8gYWRkIHRoaXMgY29uZmlndXJhdGlvbiB0byB0aGUgPHN0cm9uZz5EZWJ1Zzwvc3Ryb25nPiBtZW51IGFuZCB0b29sYmFyLCBjbGljaworICAgICAgICB0aGUgY2hlY2tib3ggbmV4dCB0byBEZWJ1Zy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVG8gc2F2ZSB5b3VyIHNldHRpbmdzLCBjbGljayBDbG9zZS48YnIvPgorICAgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgorICAgICAgICAgICAgQWx0aG91Z2ggeW91IGNhbiBydW4gdGhlIHRlc3QgaW1tZWRpYXRlbHkgYnkgY2xpY2tpbmcgUnVuLCB5b3Ugc2hvdWxkIHNhdmUgdGhlIHRlc3QKKyAgICAgICAgICAgIGZpcnN0IGFuZCB0aGVuIHJ1biBpdCBieSBzZWxlY3RpbmcgaXQgZnJvbSB0aGUgRWNsaXBzZSBzdGFuZGFyZCB0b29sYmFyLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE9uIHRoZSBFY2xpcHNlIHN0YW5kYXJkIHRvb2xiYXIsIGNsaWNrIHRoZSBkb3duIGFycm93IG5leHQgdG8gdGhlIGdyZWVuIFJ1biBhcnJvdy4gVGhpcworICAgICAgICBkaXNwbGF5cyBhIG1lbnUgb2Ygc2F2ZWQgUnVuIGFuZCBEZWJ1ZyBjb25maWd1cmF0aW9ucy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgU2VsZWN0IHRoZSB0ZXN0IHJ1biBjb25maWd1cmF0aW9uIHlvdSBqdXN0IGNyZWF0ZWQuIFRoZSB0ZXN0IHN0YXJ0cy4KKyAgICA8L2xpPgogPC9vbD4KIDxwPgotICAgICAgICBUaGUgdGVzdCByZXN1bHRzIGFwcGVhciBpbiB0aGUgSlVuaXQgdmlldy4gVGhpcyBpcyBkaXZpZGVkIGludG8gYW4gdXBwZXIgc3VtbWFyeSBwYW5lLAotICAgICAgICBhbmQgYSBsb3dlciBzdGFjayB0cmFjZSBwYW5lLgorICAgIFRoZSBwcm9ncmVzcyBvZiB5b3VyIHRlc3QgYXBwZWFycyBpbiB0aGUgQ29uc29sZSB2aWV3IGFzIGEgc2VyaWVzIG9mIG1lc3NhZ2VzLiBFYWNoIG1lc3NhZ2UgaXMKKyAgICBwcmVjZWRlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIEFuZHJvaWQgcGFja2FnZSBuYW1lIHRvIHdoaWNoIGl0IGFwcGxpZXMuCisgICAgSW4gdGhlIGZvbGxvd2luZyBkZXNjcmlwdGlvbiBvZiB0aGVzZSBtZXNzYWdlcywgPGNvZGU+PGVtPmRldmljZW5hbWU8L2VtPjwvY29kZT4gaXMgdGhlIG5hbWUgb2YKKyAgICB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yIHlvdSBhcmUgdXNpbmcgdG8gcnVuIHRoZSB0ZXN0LCBhbmQgPGNvZGU+PGVtPnBvcnQ8L2VtPjwvY29kZT4gaXMgdGhlCisgICAgcG9ydCBudW1iZXIgZm9yIHRoZSBkZXZpY2UuIFRoZSBuYW1lIGFuZCBwb3J0IG51bWJlciBhcmUgaW4gdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZQorICAgIDxjb2RlPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sI2RldmljZXN0YXR1cyI+YWRiIGRldmljZXM8L2E+PC9jb2RlPgorICAgIGNvbW1hbmQuIEFsc28sIDxjb2RlPjxlbT50ZXN0cGFja2FnZTwvZW0+PC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwYWNrYWdlIHlvdSBhcmUKKyAgICBydW5uaW5nLCBhbmQgPGVtPmFwcF9wYWNrYWdlPC9lbT4gaXMgdGhlIGxhYmVsIGZvciB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4KKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgYW4gZW11bGF0b3IgYW5kIHlvdSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCBpdCwgdGhlbiBFY2xpcHNlCisgICAgICAgIGZpcnN0IHN0YXJ0cyB0aGUgZW11bGF0b3IuIFdoZW4gdGhpcyBpcyBjb21wbGV0ZSwgeW91IHNlZQorICAgICAgICB0aGUgbWVzc2FnZToKKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5IT01FIGlzIHVwIG9uIGRldmljZSAnPGVtPmRldmljZW5hbWU8L2VtPi08ZW0+cG9ydDwvZW0+JzwvY29kZT4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSBpbnN0YWxsZWQgeW91ciB0ZXN0IHBhY2thZ2UsIHRoZW4geW91IHNlZQorICAgICAgICB0aGUgbWVzc2FnZToKKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5VcGxvYWRpbmcgPGVtPnRlc3RwYWNrYWdlPC9lbT4gb250byBkZXZpY2UgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPicKKyAgICAgICAgICAgIDwvY29kZT4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHRoZW4gdGhlIG1lc3NhZ2UgPGNvZGU+SW5zdGFsbGluZyA8ZW0+dGVzdHBhY2thZ2U8L2VtPjwvY29kZT4uCisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBhbmQgZmluYWxseSB0aGUgbWVzc2FnZSA8Y29kZT5TdWNjZXNzITwvY29kZT4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOZXh0LCBpZiB5b3UgaGF2ZSBub3QgeWV0IGluc3RhbGxlZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB0byB0aGUgZGV2aWNlIG9yCisgICAgICAgIGVtdWxhdG9yLCB5b3Ugc2VlIHRoZSBtZXNzYWdlCisgICAgICAgIDxwPgorICAgICAgICA8Y29kZT5Qcm9qZWN0IGRlcGVuZGVuY3kgZm91bmQsIGluc3RhbGxpbmc6IDxlbT5hcHBfcGFja2FnZTwvZW0+PC9jb2RlPgorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgdGhlbiB0aGUgbWVzc2FnZSA8Y29kZT5VcGxvYWRpbmcgPGVtPmFwcF9uYW1lPC9lbT4uYXBrPC9jb2RlPiBvbnRvIGRldmljZQorICAgICAgICAgICAgJzxlbT5kZXZpY2VuYW1lPC9lbT4tPGVtPnBvcnQ8L2VtPicKKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHRoZW4gdGhlIG1lc3NhZ2UgPGNvZGU+SW5zdGFsbGluZyA8ZW0+YXBwX25hbWU8L2VtPi5hcGs8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBhbmQgZmluYWxseSB0aGUgbWVzc2FnZSA8Y29kZT5TdWNjZXNzITwvY29kZT4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBOZXh0LCB5b3Ugc2VlIHRoZSBtZXNzYWdlCisgICAgICAgIDxjb2RlPkxhdW5jaGluZyBpbnN0cnVtZW50YXRpb24gPGVtPmluc3RydW1lbnRhdGlvbl9jbGFzczwvZW0+IG9uIGRldmljZQorICAgICAgICA8ZW0+ZGV2aWNlbmFtZTwvZW0+LTxlbT5wb3J0PC9lbT48L2NvZGU+CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+aW5zdHJ1bWVudGF0aW9uX2NsYXNzPC9jb2RlPiBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlCisgICAgICAgICAgICBpbnN0cnVtZW50YXRpb24gdGVzdCBydW5uZXIgeW91IGhhdmUgc3BlY2lmaWVkICh1c3VhbGx5CisgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE5leHQsIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gYnVpbGRzIGEgbGlzdCBvZiB0ZXN0cyB0byBydW4sCisgICAgICAgIHlvdSBzZWUgdGhlIG1lc3NhZ2UKKyAgICAgICAgPHA+CisgICAgICAgICAgICA8Y29kZT5Db2xsZWN0aW5nIHRlc3QgaW5mb3JtYXRpb248L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBmb2xsb3dlZCBieQorICAgICAgICA8L3A+CisgICAgICAgIDxwPgorICAgICAgICAgICAgPGNvZGU+U2VuZGluZyB0ZXN0IGluZm9ybWF0aW9uIHRvIEVjbGlwc2U8L2NvZGU+CisgICAgICAgIDwvcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRmluYWxseSwgeW91IHNlZSB0aGUgbWVzc2FnZSA8Y29kZT5SdW5uaW5nIHRlc3RzPC9jb2RlPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgeW91ciB0ZXN0cworICAgICAgICBhcmUgcnVubmluZy4gQXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCBzdGFydCBzZWVpbmcgdGhlIHRlc3QgcmVzdWx0cyBpbiB0aGUgSlVuaXQgdmlldy4KKyAgICAgICAgV2hlbiB0aGUgdGVzdHMgYXJlIGZpbmlzaGVkLCB5b3Ugc2VlIHRoZSBjb25zb2xlIG1lc3NhZ2UgPGNvZGU+VGVzdCBydW4gY29tcGxldGU8L2NvZGU+LgorICAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IHlvdXIgdGVzdHMgYXJlIGZpbmlzaGVkLgorICAgIDwvbGk+Cis8L3VsPgorPHA+CisgICAgVGhlIHRlc3QgcmVzdWx0cyBhcHBlYXIgaW4gdGhlIEpVbml0IHZpZXcuIFRoaXMgaXMgZGl2aWRlZCBpbnRvIGFuIHVwcGVyIHN1bW1hcnkgcGFuZSwKKyAgICBhbmQgYSBsb3dlciBzdGFjayB0cmFjZSBwYW5lLgogPC9wPgogPHA+Ci0gICAgICAgIFRoZSB1cHBlciBwYW5lIGNvbnRhaW5zIHRlc3QgaW5mb3JtYXRpb24uIEluIHRoZSBwYW5lJ3MgaGVhZGVyLCB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaW5mb3JtYXRpb246CisgICAgVGhlIHVwcGVyIHBhbmUgY29udGFpbnMgdGVzdCBpbmZvcm1hdGlvbi4gSW4gdGhlIHBhbmUncyBoZWFkZXIsIHlvdSBzZWUgdGhlIGZvbGxvd2luZworICAgIGluZm9ybWF0aW9uOgogPC9wPgotICAgIDx1bD4KLSAgICAgICAgPGxpPgotICAgICAgICAgICBUb3RhbCB0aW1lIGVsYXBzZWQgZm9yIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIChsYWJlbGVkIEZpbmlzaGVkIGFmdGVyIDxlbT54PC9lbT4gc2Vjb25kcykuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgTnVtYmVyIG9mIHJ1bnMgKFJ1bnM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGVudGlyZSB0ZXN0IGNsYXNzLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIE51bWJlciBvZiBlcnJvcnMgKEVycm9yczopIC0gdGhlIG51bWJlciBvZiBwcm9ncmFtIGVycm9ycyBhbmQgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZAotICAgICAgICAgICBkdXJpbmcgdGhlIHRlc3QgcnVuLgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgIE51bWJlciBvZiBmYWlsdXJlcyAoRmFpbHVyZXM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdCBmYWlsdXJlcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHRlc3QKLSAgICAgICAgICAgcnVuLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYXNzZXJ0aW9uIGZhaWx1cmVzLiBBIHRlc3QgY2FuIGZhaWwgZXZlbiBpZiB0aGUgcHJvZ3JhbSBkb2VzCi0gICAgICAgICAgIG5vdCBlbmNvdW50ZXIgYW4gZXJyb3IuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICAgQSBwcm9ncmVzcyBiYXIuIFRoZSBwcm9ncmVzcyBiYXIgZXh0ZW5kcyBmcm9tIGxlZnQgdG8gcmlnaHQgYXMgdGhlIHRlc3RzIHJ1bi4gSWYgYWxsIHRoZQotICAgICAgICAgICB0ZXN0cyBzdWNjZWVkLCB0aGUgYmFyIHJlbWFpbnMgZ3JlZW4uIElmIGEgdGVzdCBmYWlscywgdGhlIGJhciB0dXJucyBmcm9tIGdyZWVuIHRvIHJlZC4KLSAgICAgICAgPC9saT4KLSAgICA8L3VsPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVG90YWwgdGltZSBlbGFwc2VkIGZvciB0aGUgdGVzdCBwYWNrYWdlIChsYWJlbGVkIEZpbmlzaGVkIGFmdGVyIDxlbT54PC9lbT4gc2Vjb25kcykuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE51bWJlciBvZiBydW5zIChSdW5zOikgLSB0aGUgbnVtYmVyIG9mIHRlc3RzIGluIHRoZSBlbnRpcmUgdGVzdCBjbGFzcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgTnVtYmVyIG9mIGVycm9ycyAoRXJyb3JzOikgLSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gZXJyb3JzIGFuZCBleGNlcHRpb25zIGVuY291bnRlcmVkCisgICAgICAgIGR1cmluZyB0aGUgdGVzdCBydW4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIE51bWJlciBvZiBmYWlsdXJlcyAoRmFpbHVyZXM6KSAtIHRoZSBudW1iZXIgb2YgdGVzdCBmYWlsdXJlcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHRlc3QKKyAgICAgICAgcnVuLiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYXNzZXJ0aW9uIGZhaWx1cmVzLiBBIHRlc3QgY2FuIGZhaWwgZXZlbiBpZiB0aGUgcHJvZ3JhbSBkb2VzCisgICAgICAgIG5vdCBlbmNvdW50ZXIgYW4gZXJyb3IuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEEgcHJvZ3Jlc3MgYmFyLiBUaGUgcHJvZ3Jlc3MgYmFyIGV4dGVuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZSB0ZXN0cyBydW4uIElmIGFsbCB0aGUKKyAgICAgICAgdGVzdHMgc3VjY2VlZCwgdGhlIGJhciByZW1haW5zIGdyZWVuLiBJZiBhIHRlc3QgZmFpbHMsIHRoZSBiYXIgdHVybnMgZnJvbSBncmVlbiB0byByZWQuCisgICAgPC9saT4KKzwvdWw+CiA8cD4KICAgICBUaGUgYm9keSBvZiB0aGUgdXBwZXIgcGFuZSBjb250YWlucyB0aGUgZGV0YWlscyBvZiB0aGUgdGVzdCBydW4uIEZvciBlYWNoIHRlc3QgY2FzZSBjbGFzcwogICAgIHRoYXQgd2FzIHJ1biwgeW91IHNlZSBhIGxpbmUgd2l0aCB0aGUgY2xhc3MgbmFtZS4gVG8gbG9vayBhdCB0aGUgcmVzdWx0cyBmb3IgdGhlIGluZGl2aWR1YWwKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5qZAppbmRleCAyYmRmNGQwLi41MjNhOGU1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmpkCkBAIC0yLDEyMiArMiwxMjggQEAKIEBqZDpib2R5CiAKIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgotICA8ZGl2IGlkPSJxdiI+Ci0gIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KLSAgPG9sPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+Ci0gICAgICAgIDxvbD4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3QiPkNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPlVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBBcHBsaWNhdGlvbjwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvYT4KLSAgICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4KLSAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0iI0FNU3ludGF4Ij5Vc2luZyB0aGUgSW5zdHJ1bWVudCBDb21tYW5kPC9hPgotICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0FNT3B0aW9uc1N5bnRheCI+SW5zdHJ1bWVudCBvcHRpb25zPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KLSAgICA8L2xpPgotCi0gIDwvb2w+Ci0gIDxoMj5TZWUgQWxzbzwvaDI+Ci0gIDxvbD4KLSAgICA8bGk+Ci0gICAgICAgIDxhCi0gICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uPC9hPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgotICAgIDwvbGk+Ci0gIDwvb2w+Ci0gIDwvZGl2PgorICAgIDxkaXYgaWQ9InF2Ij4KKyAgICAgICAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+CisgICAgICAgICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQ3JlYXRlVGVzdFByb2plY3QiPkNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPlVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPC9vbD4KKyAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI0NyZWF0ZVRlc3RBcHAiPkNyZWF0aW5nIGEgVGVzdCBQYWNrYWdlPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNDb21tYW5kIj5SdW5uaW5nIFRlc3RzPC9hPgorICAgICAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI1J1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjUnVuVGVzdHNEZXZpY2UiPlJ1bm5pbmcgdGVzdHMgb24gYSBkZXZpY2Ugb3IgZW11bGF0b3I8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQU1TeW50YXgiPlVzaW5nIHRoZSBJbnN0cnVtZW50IENvbW1hbmQ8L2E+CisgICAgICAgICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjQU1PcHRpb25zU3ludGF4Ij5JbnN0cnVtZW50IG9wdGlvbnM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiNSdW5UZXN0RXhhbXBsZXMiPkluc3RydW1lbnQgZXhhbXBsZXM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L29sPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8L29sPgorICAgICAgICA8aDI+U2VlIEFsc288L2gyPgorICAgICAgICAgICAgPG9sPgorICAgICAgICAgICAgICAgIDxsaT4KKyAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPgorICAgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgICAgPGxpPgorICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+QW5kcm9pZCBEZWJ1ZyBCcmlkZ2U8L2E+CisgICAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgIDwvb2w+CisgICAgPC9kaXY+CiA8L2Rpdj4KIDxwPgotICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gY3JlYXRlIGFuZCBydW4gdGVzdHMgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICBZb3UgY2FuIHVzZSB0aGUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaGVyZSBpZiB5b3UgYXJlIGRldmVsb3BpbmcgaW4gYW4gSURFIG90aGVyIHRoYW4gRWNsaXBzZQotICBvciBpZiB5b3UgcHJlZmVyIHRvIHdvcmsgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIGRvY3VtZW50IGFzc3VtZXMgdGhhdCB5b3UgYWxyZWFkeSBrbm93IGhvdwotICB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIGluIHlvdXIgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuIEJlZm9yZSB5b3Ugc3RhcnQgdGhpcwotICBkb2N1bWVudCwgeW91IHNob3VsZCByZWFkIHRoZSBkb2N1bWVudCA8YQotICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4sCi0gIHdoaWNoIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIEFuZHJvaWQgdGVzdGluZy4KKyAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gY3JlYXRlIGFuZCBydW4gdGVzdHMgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIFlvdSBjYW4gdXNlIHRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBoZXJlIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBhbiBJREUgb3RoZXIgdGhhbiBFY2xpcHNlCisgICAgb3IgaWYgeW91IHByZWZlciB0byB3b3JrIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoYXQgeW91IGFscmVhZHkga25vdyBob3cKKyAgICB0byBjcmVhdGUgYSBBbmRyb2lkIGFwcGxpY2F0aW9uIGluIHlvdXIgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuIEJlZm9yZSB5b3Ugc3RhcnQgdGhpcworICAgIGRvY3VtZW50LCB5b3Ugc2hvdWxkIHJlYWQgdGhlIHRvcGljCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCisgICAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgQW5kcm9pZCB0ZXN0aW5nLgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgY2FuIHNldCB1cCBhbmQgcnVuIHlvdXIgdGVzdHMKLWRpcmVjdGx5IGluIEVjbGlwc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCA8YQotICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nJm5ic3A7aW4mbmJzcDtFY2xpcHNlLCZuYnNwO3dpdGgmbmJzcDtBRFQ8L2E+LgorICAgIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlIHdpdGggQURULCB5b3UgY2FuIHNldCB1cCBhbmQgcnVuIHlvdXIgdGVzdHMKKyAgICBkaXJlY3RseSBpbiBFY2xpcHNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KIDwvcD4KIDxoMiBpZD0iQ3JlYXRlVGVzdFByb2plY3RDb21tYW5kIj5Xb3JraW5nIHdpdGggVGVzdCBQcm9qZWN0czwvaDI+CiA8cD4KLSAgWW91IHVzZSB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB0byBjcmVhdGUgdGVzdCBwcm9qZWN0cy4KLSAgWW91IGFsc28gdXNlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvIGNvbnZlcnQgZXhpc3RpbmcgdGVzdCBjb2RlIGludG8gYW4gQW5kcm9pZCB0ZXN0IHByb2plY3QsCi0gIG9yIHRvIGFkZCB0aGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiBBbnQgdGFyZ2V0IHRvIGFuIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCBwcm9qZWN0LgotICBUaGVzZSBvcGVyYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gPGEKLSAgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uCi0gIFRoZSA8Y29kZT5ydW4tdGVzdHM8L2NvZGU+IHRhcmdldCBpcyBkZXNjcmliZWQgaW4gPGEKLSAgaHJlZj0iI1J1blRlc3RzQW50Ij5RdWljayBidWlsZCBhbmQgcnVuIHdpdGggQW50PC9hPi4KKyAgICBZb3UgdXNlIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0b29sIHRvIGNyZWF0ZSB0ZXN0IHByb2plY3RzLgorICAgIFlvdSBhbHNvIHVzZSA8Y29kZT5hbmRyb2lkPC9jb2RlPiB0byBjb252ZXJ0IGV4aXN0aW5nIHRlc3QgY29kZSBpbnRvIGFuIEFuZHJvaWQgdGVzdCBwcm9qZWN0LAorICAgIG9yIHRvIGFkZCB0aGUgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiBBbnQgdGFyZ2V0IHRvIGFuIGV4aXN0aW5nIEFuZHJvaWQgdGVzdCBwcm9qZWN0LgorICAgIFRoZXNlIG9wZXJhdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVXBkYXRlVGVzdFByb2plY3QiPgorICAgIFVwZGF0aW5nIGEgdGVzdCBwcm9qZWN0PC9hPi4gVGhlIDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gdGFyZ2V0IGlzIGRlc2NyaWJlZCBpbgorICAgIDxhIGhyZWY9IiNSdW5UZXN0c0FudCI+UXVpY2sgYnVpbGQgYW5kIHJ1biB3aXRoIEFudDwvYT4uCiA8L3A+CiA8aDMgaWQ9IkNyZWF0ZVRlc3RQcm9qZWN0Ij5DcmVhdGluZyBhIHRlc3QgcHJvamVjdDwvaDM+CiA8cD4KLSAgVG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0IHdpdGggdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wsIGVudGVyOgotPHByZT5hbmRyb2lkIGNyZWF0ZSB0ZXN0LXByb2plY3QgLW0gJmx0O21haW5fcGF0aCZndDsgLW4gJmx0O3Byb2plY3RfbmFtZSZndDsgLXAgJmx0O3Rlc3RfcGF0aCZndDs8L3ByZT4KKyAgICBUbyBjcmVhdGUgYSB0ZXN0IHByb2plY3Qgd2l0aCB0aGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCwgZW50ZXI6Cis8L3A+Cis8cHJlPgorYW5kcm9pZCBjcmVhdGUgdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1uICZsdDtwcm9qZWN0X25hbWUmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7Cis8L3ByZT4KIDxwPgotICBZb3UgbXVzdCBzdXBwbHkgYWxsIHRoZSBmbGFncy4gVGhlIGZvbGxvd2luZyB0YWJsZSBleHBsYWlucyB0aGVtIGluIGRldGFpbDoKKyAgICBZb3UgbXVzdCBzdXBwbHkgYWxsIHRoZSBmbGFncy4gVGhlIGZvbGxvd2luZyB0YWJsZSBleHBsYWlucyB0aGVtIGluIGRldGFpbDoKIDwvcD4KIDx0YWJsZT4KLSAgPHRyPgotICAgIDx0aD5GbGFnPC90aD4KLSAgICA8dGg+VmFsdWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gIDx0cj4KLSAgICA8dGQ+PGNvZGU+LW0sIC0tbWFpbjwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUGF0aCB0byB0aGUgcHJvamVjdCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcmVsYXRpdmUgdG8gdGhlIHRlc3QgYXBwbGljYXRpb24KLSAgICAgICAgZGlyZWN0b3J5LgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4sIGFuZCB5b3UKLSAgICAgICAgd2FudCB0byBjcmVhdGUgdGhlIHRlc3QgcHJvamVjdCBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlIHZhbHVlIG9mCi0gICAgICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gc2hvdWxkIGJlIDxjb2RlPi4uL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgPHRyPgorICAgICAgICA8dGg+RmxhZzwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT4tbSwgLS1tYWluPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFBhdGggdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIHJlbGF0aXZlIHRvIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgIGRpcmVjdG9yeS4KICAgICAgICAgPC90ZD4KLSAgPHRyPgotICAgIDx0ZD48Y29kZT4tbiwgLS1uYW1lPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPk5hbWUgdGhhdCB5b3Ugd2FudCB0byBnaXZlIHRoZSB0ZXN0IHByb2plY3QuPC90ZD4KLSAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPkRpcmVjdG9yeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIG5ldyB0ZXN0IHByb2plY3QuPC90ZD4KLSAgICA8dGQ+Ci0gICAgICBUaGUgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCBjcmVhdGVzIHRoZSB0ZXN0IHByb2plY3QgZmlsZXMgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW4gdGhpcwotICAgICAgZGlyZWN0b3J5LiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCA8Y29kZT5hbmRyb2lkPC9jb2RlPiBjcmVhdGVzIGl0LgotICAgIDwvdGQ+Ci0gIDwvdHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCisgICAgICAgICAgICB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHRlc3QgcHJvamVjdCBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlCisgICAgICAgICAgICB2YWx1ZSBvZiA8Y29kZT4tLW1haW48L2NvZGU+IHNob3VsZCBiZSA8Y29kZT4uLi9IZWxsb0FuZHJvaWQ8L2NvZGU+LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY2hvb3NpbmcgdGhlIGxvY2F0aW9uIG9mIHRlc3QgcHJvamVjdHMsIHBsZWFzZSByZWFkCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwjVGVzdFByb2plY3RzIj4KKyAgICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPi4KKyAgICAgICAgPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+LW4sIC0tbmFtZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+TmFtZSB0aGF0IHlvdSB3YW50IHRvIGdpdmUgdGhlIHRlc3QgcHJvamVjdC48L3RkPgorICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1wLCAtLXBhdGg8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPkRpcmVjdG9yeSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIG5ldyB0ZXN0IHByb2plY3QuPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgY3JlYXRlcyB0aGUgdGVzdCBwcm9qZWN0IGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgICAgICAgICBpbiB0aGlzIGRpcmVjdG9yeS4gSWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gY3JlYXRlcyBpdC4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgogPC90YWJsZT4KIDxwPgogICAgIElmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgPGNvZGU+YW5kcm9pZDwvY29kZT4gbGlzdHMgdG8gU1RET1VUIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMKQEAgLTEzNSwxMSArMTQxLDEwIEBACiAgICAgYXJlIHRlc3RpbmcgYW5kIGNvbnRyb2wgaXQgd2l0aCBpbnN0cnVtZW50YXRpb24uCiA8L3A+CiA8cD4KLSAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgY3JlYXRlIHRoZSA8YQotICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPkhlbGxvLCBXb3JsZDwvYT4gdHV0b3JpYWwgYXBwbGljYXRpb24KLSAgICBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4uIEluIHRoZSB0dXRvcmlhbCwgdGhpcyBhcHBsaWNhdGlvbiB1c2VzIHRoZQotICAgIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uZXhhbXBsZS5oZWxsb2FuZHJvaWQ8L2NvZGU+IGFuZCB0aGUgYWN0aXZpdHkgbmFtZQotICAgIDxjb2RlPkhlbGxvQW5kcm9pZDwvY29kZT4uIFlvdSBjYW4gdG8gY3JlYXRlIHRoZSB0ZXN0IGZvciB0aGlzIGluCisgICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGNyZWF0ZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCI+CisgICAgSGVsbG8sIFdvcmxkPC9hPiB0dXRvcmlhbCBhcHBsaWNhdGlvbiBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPn4vc291cmNlL0hlbGxvQW5kcm9pZDwvY29kZT4uCisgICAgSW4gdGhlIHR1dG9yaWFsLCB0aGlzIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uZXhhbXBsZS5oZWxsb2FuZHJvaWQ8L2NvZGU+CisgICAgYW5kIHRoZSBhY3Rpdml0eSBuYW1lIDxjb2RlPkhlbGxvQW5kcm9pZDwvY29kZT4uIFlvdSBjYW4gdG8gY3JlYXRlIHRoZSB0ZXN0IGZvciB0aGlzIGluCiAgICAgPGNvZGU+fi9zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4uIFRvIGRvIHNvLCB5b3UgZW50ZXI6CiA8L3A+CiA8cHJlPgpAQCAtMTk2LDcgKzIwMSw3IEBACiA8cCBjbGFzcz0ibm90ZSI+CiAgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgY2hhbmdlIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwKICAgICB5b3UgbXVzdCA8ZW0+bWFudWFsbHk8L2VtPiBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT4mbHQ7YW5kcm9pZDp0YXJnZXRQYWNrYWdlJmd0OzwvY29kZT4KLSAgICBhdHRyaWJ1dGUgd2l0aGluIHRoZSA8Y29kZT5BbmRyb2lkTWFuaWZlc3QueG1sPC9jb2RlPiBmaWxlIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLgorICAgIGF0dHJpYnV0ZSB3aXRoaW4gdGhlIDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+IGZpbGUgb2YgdGhlIHRlc3QgcGFja2FnZS4KICAgICBSdW5uaW5nIDxjb2RlPmFuZHJvaWQgdXBkYXRlIHRlc3QtcHJvamVjdDwvY29kZT4gZG9lcyBub3QgZG8gdGhpcy4KIDwvcD4KIDxwPgpAQCAtMjA1LDM4ICsyMTAsMzggQEAKIDxwcmU+YW5kcm9pZCB1cGRhdGUtdGVzdC1wcm9qZWN0IC1tICZsdDttYWluX3BhdGgmZ3Q7IC1wICZsdDt0ZXN0X3BhdGgmZ3Q7PC9wcmU+CiAKIDx0YWJsZT4KLTx0cj4KLSAgPHRoPkZsYWc8L3RoPgotICA8dGg+VmFsdWU8L3RoPgotICA8dGg+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTx0cj4KLSAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KLSAgPHRkPlRoZSBwYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwcm9qZWN0PC90ZD4KLSAgPHRkPgotICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkPC9jb2RlPiwgYW5kCi0gICAgdGhlIHRlc3QgcHJvamVjdCBpcyBpbiA8Y29kZT5zb3VyY2UvSGVsbG9BbmRyb2lkVGVzdDwvY29kZT4sIHRoZW4gdGhlIHZhbHVlIGZvcgotICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gaXMgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KLSAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZD48Y29kZT4tcCwgLS1wYXRoPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5UaGUgb2YgdGhlIHRlc3QgcHJvamVjdC48L3RkPgotICA8dGQ+Ci0gICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZQotICAgIHZhbHVlIGZvciA8Y29kZT4tLXBhdGg8L2NvZGU+IGlzIDxjb2RlPkhlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LgotICA8L3RkPgotPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0aD5GbGFnPC90aD4KKyAgICAgICAgPHRoPlZhbHVlPC90aD4KKyAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1tLCAtLW1haW48L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBwcm9qZWN0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCByZWxhdGl2ZSB0byB0aGUgdGVzdCBwcm9qZWN0PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWQ8L2NvZGU+LCBhbmQKKyAgICAgICAgICAgIHRoZSB0ZXN0IHByb2plY3QgaXMgaW4gPGNvZGU+c291cmNlL0hlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LCB0aGVuIHRoZSB2YWx1ZSBmb3IKKyAgICAgICAgICAgIDxjb2RlPi0tbWFpbjwvY29kZT4gaXMgPGNvZGU+Li4vSGVsbG9BbmRyb2lkPC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPi1wLCAtLXBhdGg8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPlRoZSBvZiB0aGUgdGVzdCBwcm9qZWN0LjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdGVzdCBwcm9qZWN0IGlzIGluIDxjb2RlPnNvdXJjZS9IZWxsb0FuZHJvaWRUZXN0PC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIHZhbHVlIGZvciA8Y29kZT4tLXBhdGg8L2NvZGU+IGlzIDxjb2RlPkhlbGxvQW5kcm9pZFRlc3Q8L2NvZGU+LgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CiA8L3RhYmxlPgogPHA+CiAgICAgSWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCA8Y29kZT5hbmRyb2lkPC9jb2RlPiBsaXN0cyB0byBTVERPVVQgdGhlIG5hbWVzIG9mIHRoZSBmaWxlcwogICAgIGFuZCBkaXJlY3RvcmllcyBpdCBoYXMgY3JlYXRlZC4KIDwvcD4KLTxoMiBpZD0iQ3JlYXRlVGVzdEFwcCI+Q3JlYXRpbmcgYSBUZXN0IEFwcGxpY2F0aW9uPC9oMj4KKzxoMiBpZD0iQ3JlYXRlVGVzdEFwcCI+Q3JlYXRpbmcgYSBUZXN0IFBhY2thZ2U8L2gyPgogPHA+Ci0gICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgYXBwbGljYXRpb24uCisgICAgT25jZSB5b3UgaGF2ZSBjcmVhdGVkIGEgdGVzdCBwcm9qZWN0LCB5b3UgcG9wdWxhdGUgaXQgd2l0aCBhIHRlc3QgcGFja2FnZS4KICAgICBUaGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgQWN0aXZpdHl9LAotICAgIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IGFwcGxpY2F0aW9uIGNhbgorICAgIGFsdGhvdWdoIHlvdSBjYW4gZGVmaW5lIG9uZSBpZiB5b3Ugd2lzaC4gQWx0aG91Z2ggeW91ciB0ZXN0IHBhY2thZ2UgY2FuCiAgICAgY29tYmluZSBBY3Rpdml0aWVzLCBBbmRyb2lkIHRlc3QgY2xhc3MgZXh0ZW5zaW9ucywgSlVuaXQgZXh0ZW5zaW9ucywgb3IKICAgICBvcmRpbmFyeSBjbGFzc2VzLCB5b3Ugc2hvdWxkIGV4dGVuZCBvbmUgb2YgdGhlIEFuZHJvaWQgdGVzdCBjbGFzc2VzIG9yIEpVbml0IGNsYXNzZXMsCiAgICAgYmVjYXVzZSB0aGVzZSBwcm92aWRlIHRoZSBiZXN0IHRlc3RpbmcgZmVhdHVyZXMuCkBAIC0yNDgsNyArMjUzLDcgQEAKIDwvcD4KIAogPHA+Ci0gICAgVG8gY3JlYXRlIGEgdGVzdCBhcHBsaWNhdGlvbiwgc3RhcnQgd2l0aCBvbmUgb2YgQW5kcm9pZCdzIHRlc3QgY2xhc3NlcyBpbiB0aGUgSmF2YSBwYWNrYWdlCisgICAgVG8gY3JlYXRlIGEgdGVzdCBwYWNrYWdlLCBzdGFydCB3aXRoIG9uZSBvZiBBbmRyb2lkJ3MgdGVzdCBjbGFzc2VzIGluIHRoZSBKYXZhIHBhY2thZ2UKICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0IGFuZHJvaWQudGVzdH0uIFRoZXNlIGV4dGVuZCB0aGUgSlVuaXQKICAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcy4gV2l0aCBhIGZldyBleGNlcHRpb25zLCB0aGUgQW5kcm9pZCB0ZXN0CiAgICAgY2xhc3NlcyBhbHNvIHByb3ZpZGUgaW5zdHJ1bWVudGF0aW9uIGZvciB0ZXN0aW5nLgpAQCAtMjgyLDI0ICsyODcsMTcgQEAKICAgICB0ZXN0IHJlc3VsdHMgYXJlIHN1c3BlY3QsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIHRlc3RzIHN1Y2NlZWRlZC4KIDwvcD4KIDxwPgotICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgY3JlYXRpbmcgdGVzdCBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgdG9waWMgPGEKLSAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgYW5kIEluc3RydW1lbnRhdGlvbjwvYT4sCisgICAgVG8gbGVhcm4gbW9yZSBhYm91dCBjcmVhdGluZyB0ZXN0IHBhY2thZ2VzLCBzZWUgdGhlIHRvcGljIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4sCiAgICAgd2hpY2ggcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgQW5kcm9pZCB0ZXN0aW5nLiBJZiB5b3UgcHJlZmVyIHRvIGZvbGxvdyBhIHR1dG9yaWFsLAogICAgIHRyeSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CiAgICAgdHV0b3JpYWwsIHdoaWNoIGxlYWRzIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiB0ZXN0cyBmb3IgYW4gYWN0dWFsIEFuZHJvaWQgYXBwbGljYXRpb24uCiA8L3A+CiA8aDIgaWQ9IlJ1blRlc3RzQ29tbWFuZCI+UnVubmluZyBUZXN0czwvaDI+CiA8cD4KLSAgICBJZiB5b3UgYXJlIG5vdCBkZXZlbG9waW5nIGluIEVjbGlwc2Ugd2l0aCBBRFQsIHlvdSBuZWVkIHRvIHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgWW91IGNhbiBkbyB0aGlzIGVpdGhlciB3aXRoIEFudCBvciB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyIEFjdGl2aXR5TWFuYWdlcn0KLSAgICBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotPC9wPgotPHA+Ci0gICAgWW91IGNhbiBhbHNvIHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgZXZlbiBpZiB5b3UgYXJlIHVzaW5nIEVjbGlwc2Ugd2l0aCBBRFQgdG8gZGV2ZWxvcAotICAgIHRoZW0uIFRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgcHJvcGVyIGZpbGVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIHRoZSB0ZXN0Ci0gICAgcHJvamVjdCwgdXNpbmcgdGhlIDxjb2RlPmFuZHJvaWQ8L2NvZGU+IHRvb2wgd2l0aCB0aGUgb3B0aW9uIDxjb2RlPmNyZWF0ZSB0ZXN0LXByb2plY3Q8L2NvZGU+LgotICAgIFRoaXMgaXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDxhCi0gICAgaHJlZj0iI0NyZWF0ZVRlc3RQcm9qZWN0Q29tbWFuZCI+V29ya2luZyB3aXRoIFRlc3QgUHJvamVjdHM8L2E+LgorICAgIFlvdSBydW4gdGVzdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBlaXRoZXIgd2l0aCBBbnQgb3Igd2l0aCBhbgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPgorICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlIChhZGIpPC9hPiBzaGVsbC4KIDwvcD4KIDxoMyBpZD0iUnVuVGVzdHNBbnQiPlF1aWNrIGJ1aWxkIGFuZCBydW4gd2l0aCBBbnQ8L2gzPgogPHA+CkBAIC0zMTYsNTcgKzMxNCw2MyBAQAogICAgIFlvdSBjYW4gdXBkYXRlIGFuIGV4aXN0aW5nIHRlc3QgcHJvamVjdCB0byB1c2UgdGhpcyBmZWF0dXJlLiBUbyBkbyB0aGlzLCB1c2UgdGhlCiAgICAgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbCB3aXRoIHRoZSA8Y29kZT51cGRhdGUgdGVzdC1wcm9qZWN0PC9jb2RlPiBvcHRpb24uIFRoaXMgaXMgZGVzY3JpYmVkCiAgICAgaW4gdGhlIHNlY3Rpb24gPGEgaHJlZj0iI1VwZGF0ZVRlc3RQcm9qZWN0Ij5VcGRhdGluZyBhIHRlc3QgcHJvamVjdDwvYT4uCis8L3A+CiA8aDMgaWQ9IlJ1blRlc3RzRGV2aWNlIj5SdW5uaW5nIHRlc3RzIG9uIGEgZGV2aWNlIG9yIGVtdWxhdG9yPC9oMz4KIDxwPgotICAgIFdoZW4geW91IHJ1biB0ZXN0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aCB0aGUgQWN0aXZpdHlNYW5hZ2VyICg8Y29kZT5hbTwvY29kZT4pCi0gICAgY29tbWFuZC1saW5lIHRvb2wsIHlvdSBnZXQgbW9yZSBvcHRpb25zIGZvciBjaG9vc2luZyB0aGUgdGVzdHMgdG8gcnVuIHRoYW4gd2l0aCBhbnkgb3RoZXIKLSAgICBtZXRob2QuIFlvdSBjYW4gc2VsZWN0IGluZGl2aWR1YWwgdGVzdCBtZXRob2RzLCBmaWx0ZXIgdGVzdHMgYWNjb3JkaW5nIHRvIHRoZWlyIGFubm90YXRpb24sIG9yCi0gICAgc3BlY2lmeSB0ZXN0aW5nIG9wdGlvbnMuIFNpbmNlIHRoZSB0ZXN0IHJ1biBpcyBjb250cm9sbGVkIGVudGlyZWx5IGZyb20gYSBjb21tYW5kIGxpbmUsIHlvdSBjYW4KLSAgICBjdXN0b21pemUgeW91ciB0ZXN0aW5nIHdpdGggc2hlbGwgc2NyaXB0cyBpbiB2YXJpb3VzIHdheXMuCisgICAgV2hlbiB5b3UgcnVuIHRlc3RzIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+CisgICAgQW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgKGFkYik8L2E+LCB5b3UgZ2V0IG1vcmUgb3B0aW9ucyBmb3IgY2hvb3NpbmcgdGhlIHRlc3RzCisgICAgdG8gcnVuIHRoYW4gd2l0aCBhbnkgb3RoZXIgbWV0aG9kLiBZb3UgY2FuIHNlbGVjdCBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kcywgZmlsdGVyIHRlc3RzCisgICAgYWNjb3JkaW5nIHRvIHRoZWlyIGFubm90YXRpb24sIG9yIHNwZWNpZnkgdGVzdGluZyBvcHRpb25zLiBTaW5jZSB0aGUgdGVzdCBydW4gaXMgY29udHJvbGxlZAorICAgIGVudGlyZWx5IGZyb20gYSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gY3VzdG9taXplIHlvdXIgdGVzdGluZyB3aXRoIHNoZWxsIHNjcmlwdHMgaW4gdmFyaW91cyB3YXlzLgogPC9wPgogPHA+Ci0gICAgWW91IHJ1biB0aGUgPGNvZGU+YW08L2NvZGU+IHRvb2wgb24gYW4gQW5kcm9pZCBkZXZpY2Ugb3IgZW11bGF0b3IgdXNpbmcgdGhlCi0gICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPgotICAgICg8Y29kZT5hZGI8L2NvZGU+KSBzaGVsbC4gV2hlbiB5b3UgZG8gdGhpcywgeW91IHVzZSB0aGUgQWN0aXZpdHlNYW5hZ2VyCi0gICAgPGNvZGU+aW5zdHJ1bWVudDwvY29kZT4gb3B0aW9uIHRvIHJ1biB5b3VyIHRlc3QgYXBwbGljYXRpb24gdXNpbmcgYW4gQW5kcm9pZCB0ZXN0IHJ1bm5lcgotICAgICh1c3VhbGx5IHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0pLiBZb3Ugc2V0IDxjb2RlPmFtPC9jb2RlPgotICAgIG9wdGlvbnMgd2l0aCBjb21tYW5kLWxpbmUgZmxhZ3MuCisgICAgVG8gcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBydW4gPGNvZGU+YWRiIHNoZWxsPC9jb2RlPiB0byBzdGFydCBhIGNvbW1hbmQtbGluZQorICAgIHNoZWxsIG9uIHlvdXIgZGV2aWNlIG9yIGVtdWxhdG9yLCBhbmQgdGhlbiBpbiB0aGUgc2hlbGwgcnVuIHRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPgorICAgIGNvbW1hbmQuIFlvdSBjb250cm9sIDxjb2RlPmFtPC9jb2RlPiBhbmQgeW91ciB0ZXN0cyB3aXRoIGNvbW1hbmQtbGluZSBmbGFncy4KIDwvcD4KIDxwPgotICAgIFRvIHJ1biBhIHRlc3Qgd2l0aCA8Y29kZT5hbTwvY29kZT46CisgICAgQXMgYSBzaG9ydGN1dCwgeW91IGNhbiBzdGFydCBhbiA8Y29kZT5hZGI8L2NvZGU+IHNoZWxsLCBjYWxsIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+LCBhbmQKKyAgICBzcGVjaWZ5IGNvbW1hbmQtbGluZSBmbGFncyBhbGwgb24gb25lIGlucHV0IGxpbmUuIFRoZSBzaGVsbCBvcGVucyBvbiB0aGUgZGV2aWNlIG9yIGVtdWxhdG9yLAorICAgIHJ1bnMgeW91ciB0ZXN0cywgcHJvZHVjZXMgb3V0cHV0LCBhbmQgdGhlbiByZXR1cm5zIHRvIHRoZSBjb21tYW5kIGxpbmUgb24geW91ciBjb21wdXRlci4KKzwvcD4KKzxwPgorICAgIFRvIHJ1biBhIHRlc3Qgd2l0aCA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPjoKIDwvcD4KIDxvbD4KLSAgPGxpPgotICAgIElmIG5lY2Vzc2FyeSwgcmUtYnVpbGQgeW91ciBtYWluIGFwcGxpY2F0aW9uIGFuZCB0ZXN0IGFwcGxpY2F0aW9uLgotICA8L2xpPgotICA8bGk+Ci0gICAgSW5zdGFsbCB5b3VyIHRlc3QgYXBwbGljYXRpb24gYW5kIG1haW4gYXBwbGljYXRpb24gQW5kcm9pZCBwYWNrYWdlIGZpbGVzCi0gICAgKDxjb2RlPi5hcGs8L2NvZGU+IGZpbGVzKSB0byB5b3VyIGN1cnJlbnQgQW5kcm9pZCBkZXZpY2Ugb3IgZW11bGF0b3I8L2xpPgotICA8bGk+Ci0gICAgQXQgdGhlIGNvbW1hbmQgbGluZSwgZW50ZXI6CisgICAgPGxpPgorICAgICAgICBJZiBuZWNlc3NhcnksIHJlYnVpbGQgeW91ciBtYWluIGFwcGxpY2F0aW9uIGFuZCB0ZXN0IHBhY2thZ2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIEluc3RhbGwgeW91ciB0ZXN0IHBhY2thZ2UgYW5kIG1haW4gYXBwbGljYXRpb24gQW5kcm9pZCBwYWNrYWdlIGZpbGVzCisgICAgICAgICg8Y29kZT4uYXBrPC9jb2RlPiBmaWxlcykgdG8geW91ciBjdXJyZW50IEFuZHJvaWQgZGV2aWNlIG9yIGVtdWxhdG9yPC9saT4KKyAgICA8bGk+CisgICAgICAgIEF0IHRoZSBjb21tYW5kIGxpbmUsIGVudGVyOgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgJmx0O3Rlc3RfcGFja2FnZV9uYW1lJmd0Oy8mbHQ7cnVubmVyX2NsYXNzJmd0OwogPC9wcmU+Ci08cD4KLSAgICB3aGVyZSA8Y29kZT4mbHQ7dGVzdF9wYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPiBpcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgb2YgeW91ciB0ZXN0Ci0gICAgYXBwbGljYXRpb24sIGFuZCA8Y29kZT4mbHQ7cnVubmVyX2NsYXNzJmd0OzwvY29kZT4gaXMgdGhlIG5hbWUgb2YgdGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICBjbGFzcyB5b3UgYXJlIHVzaW5nLiBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPgotICAgIGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIG1hbmlmZXN0IGZpbGUKLSAgICAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIG9mIHlvdXIgdGVzdCBhcHBsaWNhdGlvbi4gVGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKLSAgICBjbGFzcyBpcyB1c3VhbGx5IDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+LgotPC9wPgotPHA+WW91ciB0ZXN0IHJlc3VsdHMgYXBwZWFyIGluIDxjb2RlPlNURE9VVDwvY29kZT4uPC9wPgotICA8L2xpPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIHdoZXJlIDxjb2RlPiZsdDt0ZXN0X3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+IGlzIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB5b3VyIHRlc3QKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBhbmQgPGNvZGU+Jmx0O3J1bm5lcl9jbGFzcyZndDs8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIHRlc3QKKyAgICAgICAgICAgIHJ1bm5lciBjbGFzcyB5b3UgYXJlIHVzaW5nLiBUaGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgPGNvZGU+cGFja2FnZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT5tYW5pZmVzdDwvY29kZT4gZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZQorICAgICAgICAgICAgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBvZiB5b3VyIHRlc3QgcGFja2FnZS4gVGhlIEFuZHJvaWQgdGVzdCBydW5uZXIKKyAgICAgICAgICAgIGNsYXNzIGlzIHVzdWFsbHkge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfS4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFlvdXIgdGVzdCByZXN1bHRzIGFwcGVhciBpbiA8Y29kZT5TVERPVVQ8L2NvZGU+LgorICAgICAgICA8L3A+CisgICAgPC9saT4KIDwvb2w+CiA8cD4KLSAgICBUaGlzIG9wZXJhdGlvbiBzdGFydHMgYW4gPGNvZGU+YWRiPC9jb2RlPiBzaGVsbCwgdGhlbiBydW5zIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IGluIGl0CisgICAgVGhpcyBvcGVyYXRpb24gc3RhcnRzIGFuIDxjb2RlPmFkYjwvY29kZT4gc2hlbGwsIHRoZW4gcnVucyA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPgogICAgIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBUaGlzIHBhcnRpY3VsYXIgZm9ybSBvZiB0aGUgY29tbWFuZCB3aWxsIHJ1biBhbGwgb2YgdGhlIHRlc3RzCi0gICAgaW4geW91ciB0ZXN0IGFwcGxpY2F0aW9uLiBZb3UgY2FuIGNvbnRyb2wgdGhpcyBiZWhhdmlvciB3aXRoIGZsYWdzIHRoYXQgeW91IHBhc3MgdG8KKyAgICBpbiB5b3VyIHRlc3QgcGFja2FnZS4gWW91IGNhbiBjb250cm9sIHRoaXMgYmVoYXZpb3Igd2l0aCBmbGFncyB0aGF0IHlvdSBwYXNzIHRvCiAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4uIFRoZXNlIGZsYWdzIGFyZSBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KIDwvcD4KLTxoMiBpZD0iQU1TeW50YXgiPlVzaW5nIHRoZSBJbnN0cnVtZW50IENvbW1hbmQ8L2gyPgorPGgyIGlkPSJBTVN5bnRheCI+VXNpbmcgdGhlIGFtIGluc3RydW1lbnQgQ29tbWFuZDwvaDI+CiA8cD4KLSAgVGhlIGdlbmVyYWwgc3ludGF4IG9mIHRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBjb21tYW5kIGlzOgorICAgIFRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGUgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gY29tbWFuZCBpczoKIDwvcD4KIDxwcmU+CiAgICAgYW0gaW5zdHJ1bWVudCBbZmxhZ3NdICZsdDt0ZXN0X3BhY2thZ2UmZ3Q7LyZsdDtydW5uZXJfY2xhc3MmZ3Q7CkBAIC0zOTEsMTEgKzM5NSwxMSBAQAogICAgICAgICAgICAgPGNvZGU+Jmx0O3Rlc3RfcGFja2FnZSZndDs8L2NvZGU+CiAgICAgICAgIDwvdGQ+CiAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB0aGUgdGVzdCBwYWNrYWdlLgogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+CiAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+Ci0gICAgICAgICAgICBlbGVtZW50IGluIHRoZSB0ZXN0IGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4KKyAgICAgICAgICAgIGVsZW1lbnQgaW4gdGhlIHRlc3QgcGFja2FnZSdzIG1hbmlmZXN0IGZpbGUuCiAgICAgICAgIDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CkBAIC00MTEsNyArNDE1LDcgQEAKICAgICA8L3RyPgogPC90YWJsZT4KIDxwPgotVGhlIGZsYWdzIGZvciA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisgICAgVGhlIGZsYWdzIGZvciA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CiA8L3A+CiA8dGFibGU+CiAgICAgPHRyPgpAQCAtNDYxLDIwICs0NjUsMjEgQEAKICAgICAgICAgICAgICAmbHQ7dGVzdF9vcHRpb25zJmd0OwogICAgICAgICA8L3RkPgogICAgICAgICA8dGQ+Ci0gICAgICAgICAgICBQcm92aWRlcyB0ZXN0aW5nIG9wdGlvbnMgLCBpbiB0aGUgZm9ybSBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZQorICAgICAgICAgICAgUHJvdmlkZXMgdGVzdGluZyBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gVGhlCiAgICAgICAgICAgICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0b29sIHBhc3NlcyB0aGVzZSB0byB0aGUgc3BlY2lmaWVkIGluc3RydW1lbnRhdGlvbiBjbGFzcwogICAgICAgICAgICAgdmlhIGl0cyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QuIFlvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZgotICAgICAgICAgICAgPGNvZGU+LWUgJmx0O3Rlc3Rfb3B0aW9uczwvY29kZT4uIFRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCB0YWJsZS4KKyAgICAgICAgICAgIDxjb2RlPi1lICZsdDt0ZXN0X29wdGlvbnMmZ3Q7PC9jb2RlPi4gVGhlIGtleXMgYW5kIHZhbHVlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgc2VjdGlvbiA8YSBocmVmPSIjQU1PcHRpb25zU3ludGF4Ij5hbSBpbnN0cnVtZW50IG9wdGlvbnM8L2E+LgogICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgVGhlIG9ubHkgaW5zdHJ1bWVudGF0aW9uIGNsYXNzIHRoYXQgdW5kZXJzdGFuZHMgdGhlc2Uga2V5LXZhbHVlIHBhaXJzIGlzCi0gICAgICAgICAgICAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gKG9yIGEgc3ViY2xhc3MpLiBVc2luZyB0aGVtIHdpdGgKKyAgICAgICAgICAgICAgICBUaGUgb25seSBpbnN0cnVtZW50YXRpb24gY2xhc3MgdGhhdCB1c2VzIHRoZXNlIGtleS12YWx1ZSBwYWlycyBpcworICAgICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gKG9yIGEgc3ViY2xhc3MpLiBVc2luZyB0aGVtIHdpdGgKICAgICAgICAgICAgICAgICBhbnkgb3RoZXIgY2xhc3MgaGFzIG5vIGVmZmVjdC4KICAgICAgICAgICAgIDwvcD4KICAgICAgICAgPC90ZD4KICAgICA8L3RyPgogPC90YWJsZT4KIAotPGgzIGlkPSJBTU9wdGlvbnNTeW50YXgiPkluc3RydW1lbnQgb3B0aW9uczwvaDM+Cis8aDMgaWQ9IkFNT3B0aW9uc1N5bnRheCI+YW0gaW5zdHJ1bWVudCBvcHRpb25zPC9oMz4KIDxwPgogICAgIFRoZSA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiB0b29sIHBhc3NlcyB0ZXN0aW5nIG9wdGlvbnMgdG8KICAgICA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBvciBhIHN1YmNsYXNzIGluIHRoZSBmb3JtIG9mIGtleS12YWx1ZSBwYWlycywKQEAgLTQ4NCwxMjMgKzQ4OSwxMjcgQEAKICAgICAtZSAmbHQ7a2V5Jmd0OyAmbHQ7dmFsdWUmZ3Q7CiA8L3ByZT4KIDxwPgotICAgIFdoZXJlIGFwcGxpY2FibGUsIGEgJmx0O2tleSZndDsgbWF5IGhhdmUgbXVsdGlwbGUgdmFsdWVzIHNlcGFyYXRlZCBieSBhIGNvbW1hICgsKS4KKyAgICBTb21lIGtleXMgYWNjZXB0IG11bHRpcGxlIHZhbHVlcy4gWW91IHNwZWNpZnkgbXVsdGlwbGUgdmFsdWVzIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgaW52b2NhdGlvbiBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiBwcm92aWRlcyBtdWx0aXBsZQogICAgIHZhbHVlcyBmb3IgdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IGtleToKKzwvcD4KIDxwcmU+Ci0kIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1lIHBhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5wYWNrYWdlMSxjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UyIGNvbS5hbmRyb2lkLnRlc3QvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKyQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLWUgcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0LnBhY2thZ2UxLGNvbS5hbmRyb2lkLnRlc3QucGFja2FnZTIgXAorJmd0OyBjb20uYW5kcm9pZC50ZXN0L2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICAgIFRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBrZXktdmFsdWUgcGFpcnMgYW5kIHRoZWlyIHJlc3VsdC4gUGxlYXNlIHJldmlldyB0aGUKICAgICA8c3Ryb25nPlVzYWdlIE5vdGVzPC9zdHJvbmc+IGZvbGxvd2luZyB0aGUgdGFibGUuCiA8L3A+CiA8dGFibGU+Ci08dHI+Ci0gICAgPHRoPktleTwvdGg+Ci0gICAgPHRoPlZhbHVlPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+Ci0gICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgICZsdDtKYXZhX3BhY2thZ2VfbmFtZSZndDsKLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCA8ZW0+SmF2YTwvZW0+IHBhY2thZ2UgbmFtZSBmb3Igb25lIG9mIHRoZSBwYWNrYWdlcyBpbiB0aGUgdGVzdAotICAgICAgICBhcHBsaWNhdGlvbi4gQW55IHRlc3QgY2FzZSBjbGFzcyB0aGF0IHVzZXMgdGhpcyBwYWNrYWdlIG5hbWUgaXMgZXhlY3V0ZWQuIE5vdGljZSB0aGF0IHRoaXMKLSAgICAgICAgaXMgbm90IGFuIDxlbT5BbmRyb2lkPC9lbT4gcGFja2FnZSBuYW1lOyBhIHRlc3QgYXBwbGljYXRpb24gaGFzIGEgc2luZ2xlIEFuZHJvaWQgcGFja2FnZQotICAgICAgICBuYW1lIGJ1dCBtYXkgaGF2ZSBzZXZlcmFsIEphdmEgcGFja2FnZXMgd2l0aGluIGl0LgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZCByb3dzcGFuPSIyIj48Y29kZT5jbGFzczwvY29kZT48L3RkPgotICAgIDx0ZD4mbHQ7Y2xhc3NfbmFtZSZndDs8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZm9yIG9uZSBvZiB0aGUgdGVzdCBjYXNlIGNsYXNzZXMuIE9ubHkgdGhpcyB0ZXN0IGNhc2UKLSAgICAgICAgY2xhc3MgaXMgZXhlY3V0ZWQuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPiZsdDtjbGFzc19uYW1lJmd0OzxzdHJvbmc+Izwvc3Ryb25nPm1ldGhvZCBuYW1lPC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIEEgZnVsbHktcXVhbGlmaWVkIHRlc3QgY2FzZSBjbGFzcyBuYW1lLCBhbmQgb25lIG9mIGl0cyBtZXRob2RzLiBPbmx5IHRoaXMgbWV0aG9kIGlzCi0gICAgICAgIGV4ZWN1dGVkLiBOb3RlIHRoZSBoYXNoIG1hcmsgKCMpIGJldHdlZW4gdGhlIGNsYXNzIG5hbWUgYW5kIHRoZSBtZXRob2QgbmFtZS4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+ZnVuYzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnVuaXQ8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgZG8gPGVtPm5vdDwvZW0+IGV4dGVuZCBlaXRoZXIKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0gb3Ige0BsaW5rIGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlfS4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+c2l6ZTwvY29kZT48L3RkPgotICAgIDx0ZD5bPGNvZGU+c21hbGw8L2NvZGU+IHwgPGNvZGU+bWVkaXVtPC9jb2RlPiB8IDxjb2RlPmxhcmdlPC9jb2RlPl0KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhIHRlc3QgbWV0aG9kIGFubm90YXRlZCBieSBzaXplLiBUaGUgIGFubm90YXRpb25zIGFyZSA8Y29kZT5AU21hbGxUZXN0PC9jb2RlPiwKLSAgICAgICAgPGNvZGU+QE1lZGl1bVRlc3Q8L2NvZGU+LCBhbmQgPGNvZGU+QExhcmdlVGVzdDwvY29kZT4uCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPnBlcmY8L2NvZGU+PC90ZD4KLSAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZD4KLSAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCi0gICAgICAgIFdoZW4geW91IHVzZSB0aGlzIG9wdGlvbiwgYWxzbyBzcGVjaWZ5IHRoZSA8Y29kZT4tcjwvY29kZT4gZmxhZyBmb3IKLSAgICAgICAgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4sIHNvIHRoYXQgdGhlIG91dHB1dCBpcyBrZXB0IGluIHJhdyBmb3JtYXQgYW5kIG5vdAotICAgICAgICByZS1mb3JtYXR0ZWQgYXMgdGVzdCByZXN1bHRzLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5kZWJ1ZzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBSdW5zIHRlc3RzIGluIGRlYnVnIG1vZGUuCi0gICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICAgPHRkPjxjb2RlPmxvZzwvY29kZT48L3RkPgotICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPgotICAgICAgICBMb2FkcyBhbmQgbG9ncyBhbGwgc3BlY2lmaWVkIHRlc3RzLCBidXQgZG9lcyBub3QgcnVuIHRoZW0uIFRoZSB0ZXN0Ci0gICAgICAgIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gVXNlIHRoaXMgdG8gdmVyaWZ5IGNvbWJpbmF0aW9ucyBvZiBvdGhlciBmaWx0ZXJzCi0gICAgICAgIGFuZCB0ZXN0IHNwZWNpZmljYXRpb25zLgotICAgIDwvdGQ+Ci08L3RyPgotPHRyPgotICAgIDx0ZD48Y29kZT5lbW1hPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIFJ1bnMgYW4gRU1NQSBjb2RlIGNvdmVyYWdlIGFuYWx5c2lzIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byA8Y29kZT4vZGF0YS8vY292ZXJhZ2UuZWM8L2NvZGU+Ci0gICAgICAgIG9uIHRoZSBkZXZpY2UuIFRvIG92ZXJyaWRlIHRoZSBmaWxlIGxvY2F0aW9uLCB1c2UgdGhlIDxjb2RlPmNvdmVyYWdlRmlsZTwvY29kZT4ga2V5IHRoYXQKLSAgICAgICAgaXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgZW50cnkuCi0gICAgICAgIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgICAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gRU1NQS1pbnN0cnVtZW50ZWQgYnVpbGQgb2YgdGhlIHRlc3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uLCB3aGljaCB5b3UgY2FuIGdlbmVyYXRlIHdpdGggdGhlIDxjb2RlPmNvdmVyYWdlPC9jb2RlPiB0YXJnZXQuCi0gICAgICAgIDwvcD4KLSAgICA8L3RkPgotPC90cj4KLTx0cj4KLSAgICA8dGQ+PGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPjxjb2RlPiZsdDtmaWxlbmFtZSZndDs8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Ci0gICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgRU1NQSBjb3ZlcmFnZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFNwZWNpZnkgdGhpcwotICAgICAgICB2YWx1ZSBhcyBhIHBhdGggYW5kIGZpbGVuYW1lIGluIFVOSVggZm9ybWF0LiBUaGUgZGVmYXVsdCBmaWxlbmFtZSBpcyBkZXNjcmliZWQgaW4gdGhlCi0gICAgICAgIGVudHJ5IGZvciB0aGUgPGNvZGU+ZW1tYTwvY29kZT4ga2V5LgotICAgIDwvdGQ+Ci08L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRoPktleTwvdGg+CisgICAgICAgIDx0aD5WYWx1ZTwvdGg+CisgICAgICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICZsdDtKYXZhX3BhY2thZ2VfbmFtZSZndDsKKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCA8ZW0+SmF2YTwvZW0+IHBhY2thZ2UgbmFtZSBmb3Igb25lIG9mIHRoZSBwYWNrYWdlcyBpbiB0aGUgdGVzdAorICAgICAgICAgICAgYXBwbGljYXRpb24uIEFueSB0ZXN0IGNhc2UgY2xhc3MgdGhhdCB1c2VzIHRoaXMgcGFja2FnZSBuYW1lIGlzIGV4ZWN1dGVkLiBOb3RpY2UgdGhhdAorICAgICAgICAgICAgdGhpcyBpcyBub3QgYW4gPGVtPkFuZHJvaWQ8L2VtPiBwYWNrYWdlIG5hbWU7IGEgdGVzdCBwYWNrYWdlIGhhcyBhIHNpbmdsZQorICAgICAgICAgICAgQW5kcm9pZCBwYWNrYWdlIG5hbWUgYnV0IG1heSBoYXZlIHNldmVyYWwgSmF2YSBwYWNrYWdlcyB3aXRoaW4gaXQuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj48Y29kZT5jbGFzczwvY29kZT48L3RkPgorICAgICAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgVGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZm9yIG9uZSBvZiB0aGUgdGVzdCBjYXNlIGNsYXNzZXMuIE9ubHkgdGhpcyB0ZXN0CisgICAgICAgICAgICBjYXNlIGNsYXNzIGlzIGV4ZWN1dGVkLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+Jmx0O2NsYXNzX25hbWUmZ3Q7PHN0cm9uZz4jPC9zdHJvbmc+bWV0aG9kIG5hbWU8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBBIGZ1bGx5LXF1YWxpZmllZCB0ZXN0IGNhc2UgY2xhc3MgbmFtZSwgYW5kIG9uZSBvZiBpdHMgbWV0aG9kcy4gT25seSB0aGlzIG1ldGhvZCBpcworICAgICAgICAgICAgZXhlY3V0ZWQuIE5vdGUgdGhlIGhhc2ggbWFyayAoIykgYmV0d2VlbiB0aGUgY2xhc3MgbmFtZSBhbmQgdGhlIG1ldGhvZCBuYW1lLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+ZnVuYzwvY29kZT48L3RkPgorICAgICAgICA8dGQ+PGNvZGU+dHJ1ZTwvY29kZT48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBSdW5zIGFsbCB0ZXN0IGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT51bml0PC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYWxsIHRlc3QgY2xhc3NlcyB0aGF0IGRvIDxlbT5ub3Q8L2VtPiBleHRlbmQgZWl0aGVyCisgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlfSBvcgorICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlfS4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPnNpemU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgWzxjb2RlPnNtYWxsPC9jb2RlPiB8IDxjb2RlPm1lZGl1bTwvY29kZT4gfCA8Y29kZT5sYXJnZTwvY29kZT5dCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIFJ1bnMgYSB0ZXN0IG1ldGhvZCBhbm5vdGF0ZWQgYnkgc2l6ZS4gVGhlICBhbm5vdGF0aW9ucyBhcmUgPGNvZGU+QFNtYWxsVGVzdDwvY29kZT4sCisgICAgICAgICAgICA8Y29kZT5ATWVkaXVtVGVzdDwvY29kZT4sIGFuZCA8Y29kZT5ATGFyZ2VUZXN0PC9jb2RlPi4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPnBlcmY8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbGwgdGVzdCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHtAbGluayBhbmRyb2lkLnRlc3QuUGVyZm9ybWFuY2VUZXN0Q2FzZX0uCisgICAgICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBvcHRpb24sIGFsc28gc3BlY2lmeSB0aGUgPGNvZGU+LXI8L2NvZGU+IGZsYWcgZm9yCisgICAgICAgICAgICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiwgc28gdGhhdCB0aGUgb3V0cHV0IGlzIGtlcHQgaW4gcmF3IGZvcm1hdCBhbmQgbm90CisgICAgICAgICAgICByZS1mb3JtYXR0ZWQgYXMgdGVzdCByZXN1bHRzLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+ZGVidWc8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyB0ZXN0cyBpbiBkZWJ1ZyBtb2RlLgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+bG9nPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT50cnVlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIExvYWRzIGFuZCBsb2dzIGFsbCBzcGVjaWZpZWQgdGVzdHMsIGJ1dCBkb2VzIG5vdCBydW4gdGhlbS4gVGhlIHRlc3QKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gVXNlIHRoaXMgdG8gdmVyaWZ5IGNvbWJpbmF0aW9ucyBvZiBvdGhlcgorICAgICAgICAgICAgZmlsdGVycyBhbmQgdGVzdCBzcGVjaWZpY2F0aW9ucy4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPmVtbWE8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPjxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgUnVucyBhbiBFTU1BIGNvZGUgY292ZXJhZ2UgYW5hbHlzaXMgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvCisgICAgICAgICAgICA8Y29kZT4vZGF0YS8vY292ZXJhZ2UuZWM8L2NvZGU+IG9uIHRoZSBkZXZpY2UuIFRvIG92ZXJyaWRlIHRoZSBmaWxlIGxvY2F0aW9uLCB1c2UgdGhlCisgICAgICAgICAgICA8Y29kZT5jb3ZlcmFnZUZpbGU8L2NvZGU+IGtleSB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGVudHJ5LgorICAgICAgICAgICAgPHAgY2xhc3M9Im5vdGUiPgorICAgICAgICAgICAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBvcHRpb24gcmVxdWlyZXMgYW4gRU1NQS1pbnN0cnVtZW50ZWQgYnVpbGQgb2YgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiwgd2hpY2ggeW91IGNhbiBnZW5lcmF0ZSB3aXRoIHRoZSA8Y29kZT5jb3ZlcmFnZTwvY29kZT4gdGFyZ2V0LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+Y292ZXJhZ2VGaWxlPC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgRU1NQSBjb3ZlcmFnZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFNwZWNpZnkgdGhpcworICAgICAgICAgICAgdmFsdWUgYXMgYSBwYXRoIGFuZCBmaWxlbmFtZSBpbiBVTklYIGZvcm1hdC4gVGhlIGRlZmF1bHQgZmlsZW5hbWUgaXMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgZW50cnkgZm9yIHRoZSA8Y29kZT5lbW1hPC9jb2RlPiBrZXkuCisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KIDwvdGFibGU+CiA8c3Ryb25nPjxjb2RlPi1lPC9jb2RlPiBGbGFnIFVzYWdlIE5vdGVzPC9zdHJvbmc+CiA8dWw+CkBAIC02MTgsMTMgKzYyNywxMyBAQAogICAgICAgICBUaGUgPGNvZGU+ZnVuYzwvY29kZT4ga2V5IGFuZCA8Y29kZT51bml0PC9jb2RlPiBrZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KICAgICA8L2xpPgogPC91bD4KLTxoMyBpZD0iUnVuVGVzdEV4YW1wbGVzIj5JbnN0cnVtZW50IGV4YW1wbGVzPC9oMz4KKzxoMyBpZD0iUnVuVGVzdEV4YW1wbGVzIj5Vc2FnZSBleGFtcGxlczwvaDM+CiA8cD4KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdXNpbmcgPGNvZGU+YW0gaW5zdHJ1bWVudDwvY29kZT4gdG8gcnVuIHRlc3RzLiBUaGV5IGFyZSBiYXNlZCBvbgotdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6PC9wPgorVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwcm92aWRlIGV4YW1wbGVzIG9mIHVzaW5nIDxjb2RlPmFtIGluc3RydW1lbnQ8L2NvZGU+IHRvIHJ1biB0ZXN0cy4KK1RoZXkgYXJlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOjwvcD4KIDx1bD4KICAgICA8bGk+Ci0gICAgICAgIFRoZSB0ZXN0IGFwcGxpY2F0aW9uIGhhcyB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUgPGNvZGU+Y29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHM8L2NvZGU+CisgICAgICAgIFRoZSB0ZXN0IHBhY2thZ2UgaGFzIHRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSA8Y29kZT5jb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0czwvY29kZT4KICAgICA8L2xpPgogICAgIDxsaT4KICAgICAgICAgVGhlcmUgYXJlIHRocmVlIHRlc3QgY2xhc3NlczoKQEAgLTY0NywzNSArNjU2LDM1IEBACiAgICAgICAgIFRoZSB0ZXN0IHJ1bm5lciBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LgogICAgIDwvbGk+CiA8L3VsPgotPGg0PlJ1bm5pbmcgdGhlIEVudGlyZSBUZXN0IEFwcGxpY2F0aW9uPC9oND4KKzxoND5SdW5uaW5nIHRoZSBlbnRpcmUgdGVzdCBwYWNrYWdlPC9oND4KIDxwPgotICAgIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3QgY2xhc3NlcyBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgZW50ZXI6CisgICAgVG8gcnVuIGFsbCBvZiB0aGUgdGVzdCBjbGFzc2VzIGluIHRoZSB0ZXN0IHBhY2thZ2UsIGVudGVyOgogPC9wPgogPHByZT4KICQgYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKIDwvcHJlPgotPGg0PlJ1bm5pbmcgQWxsIFRlc3RzIGluIGEgVGVzdCBDYXNlIENsYXNzPC9oND4KKzxoND5SdW5uaW5nIGFsbCB0ZXN0cyBpbiBhIHRlc3QgY2FzZSBjbGFzczwvaDQ+CiA8cD4KICAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGUgY2xhc3MgPGNvZGU+VW5pdFRlc3RzPC9jb2RlPiwgZW50ZXI6CiA8L3A+CiA8cHJlPgogJCBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAgXAotLWUgY2xhc3MgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuVW5pdFRlc3RzIFwKLWNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCismZ3Q7IC1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyBcCismZ3Q7IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICA8Y29kZT5hbSBpbnN0cnVtZW50PC9jb2RlPiBnZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+LWU8L2NvZGU+IGZsYWcsIGRldGVjdHMgdGhlCiAgIDxjb2RlPmNsYXNzPC9jb2RlPiBrZXl3b3JkLCBhbmQgcnVucyBhbGwgdGhlIG1ldGhvZHMgaW4gdGhlIDxjb2RlPlVuaXRUZXN0czwvY29kZT4gY2xhc3MuCiA8L3A+Ci08aDQ+U2VsZWN0aW5nIGEgU3Vic2V0IG9mIFRlc3RzPC9oND4KKzxoND5TZWxlY3RpbmcgYSBzdWJzZXQgb2YgdGVzdHM8L2g0PgogPHA+Ci0gIFRvIHJ1biBhbGwgb2YgdGhlIHRlc3RzIGluIDxjb2RlPlVuaXRUZXN0czwvY29kZT4sIGFuZCB0aGUgPGNvZGU+dGVzdENhbWVyYTwvY29kZT4gbWV0aG9kIGluCi0gIDxjb2RlPkZ1bmN0aW9uVGVzdHM8L2NvZGU+LCBlbnRlcjoKKyAgICBUbyBydW4gYWxsIG9mIHRoZSB0ZXN0cyBpbiA8Y29kZT5Vbml0VGVzdHM8L2NvZGU+LCBhbmQgdGhlIDxjb2RlPnRlc3RDYW1lcmE8L2NvZGU+IG1ldGhvZCBpbgorICAgIDxjb2RlPkZ1bmN0aW9uVGVzdHM8L2NvZGU+LCBlbnRlcjoKIDwvcD4KIDxwcmU+CiAkIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IFwKLS1lIGNsYXNzIGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLlVuaXRUZXN0cyxjb20uYW5kcm9pZC5kZW1vLmFwcC50ZXN0cy5GdW5jdGlvblRlc3RzI3Rlc3RDYW1lcmEgXAotY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKyZndDsgLWUgY2xhc3MgY29tLmFuZHJvaWQuZGVtby5hcHAudGVzdHMuVW5pdFRlc3RzLGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzLkZ1bmN0aW9uVGVzdHMjdGVzdENhbWVyYSBcCismZ3Q7IGNvbS5hbmRyb2lkLmRlbW8uYXBwLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyCiA8L3ByZT4KIDxwPgogICAgIFlvdSBjYW4gZmluZCBtb3JlIGV4YW1wbGVzIG9mIHRoZSBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKaW5kZXggMzVjZTE3ZS4uOTc5Mzc0OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcworKysgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCkBAIC0yNTQsOSArMjU0LDMwIEBACiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290Pz5ndWlkZS90b3BpY3Mvc2VhcmNoL3NlYXJjaGFibGUtY29uZmlnLmh0bWwiPlNlYXJjaGFibGUgQ29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgICAgICAgIDwvdWw+CiAgICAgICA8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdD8+Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UZXN0aW5nIGFuZCBJbnN0cnVtZW50YXRpb248L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgorICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+CisgICAgICAgICAgIDxkaXY+CisgICAgICAgICAgICAgICAgPGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguaHRtbCI+CisgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UZXN0aW5nPC9zcGFuPgorICAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgorICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290Pz5ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5UZXN0aW5nIEZ1bmRhbWVudGFsczwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3Q/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BY3Rpdml0eSBUZXN0aW5nPC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmh0bWwiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+Q29udGVudCBQcm92aWRlciBUZXN0aW5nPC9zcGFuPjwvYT4KKyAgICAgICAgICAgICAgPC9saT4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5odG1sIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNlcnZpY2UgVGVzdGluZzwvc3Bhbj48L2E+CisgICAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaGF0IFRvIFRlc3Q8L3NwYW4+PC9hPgorICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICA8L3VsPgorICAgICAgPC9saT4KICAgICA8L3VsPgogICA8L2xpPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCmluZGV4IDZkNmFiZDguLmRiMDZlZmMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCkBAIC0yOTIsOCArMjkyLDggQEAKIDxsaT48cD5BIHNlcnZpY2UgaXMgc3RhcnRlZCAob3IgbmV3IGluc3RydWN0aW9ucyBhcmUgZ2l2ZW4gdG8gYW4gb25nb2luZyAKIHNlcnZpY2UpIGJ5IHBhc3NpbmcgYW4gSW50ZW50IG9iamVjdCB0byA8Y29kZT57QGxpbmsgCiBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UgQ29udGV4dC5zdGFydFNlcnZpY2UoKX08L2NvZGU+LiAgCi1BbmRyb2lkIGNhbGxzIHRoZSBzZXJ2aWNlJ3MgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydCAKLW9uU3RhcnQoKX08L2NvZGU+IG1ldGhvZCBhbmQgcGFzc2VzIGl0IHRoZSBJbnRlbnQgb2JqZWN0LjwvcD4KK0FuZHJvaWQgY2FsbHMgdGhlIHNlcnZpY2UncyA8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0Q29tbWFuZAorb25TdGFydENvbW1hbmQoKX08L2NvZGU+IG1ldGhvZCBhbmQgcGFzc2VzIGl0IHRoZSBJbnRlbnQgb2JqZWN0LjwvcD4KIAogPHA+CiBTaW1pbGFybHksIGFuIGludGVudCBjYW4gYmUgcGFzc2VkIHRvIDxjb2RlPntAbGluayAKQEAgLTE1MDgsOSArMTUwOCw5IEBACiBpbiB7QGNvZGUgb25DcmVhdGUoKX0sIGFuZCB0aGVuIHN0b3AgdGhlIHRocmVhZCBpbiB7QGNvZGUgb25EZXN0cm95KCl9LjwvbGk+CiAKIDxsaT48cD5UaGUgPGI+YWN0aXZlIGxpZmV0aW1lPC9iPiBvZiBhIHNlcnZpY2UgYmVnaW5zIHdpdGggYSBjYWxsIHRvIAotPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydCBvblN0YXJ0KCl9PC9jb2RlPi4gIFRoaXMgbWV0aG9kIAorPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQgb25TdGFydENvbW1hbmQoKX08L2NvZGU+LiAgVGhpcyBtZXRob2QKIGlzIGhhbmRlZCB0aGUgSW50ZW50IG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8ge0Bjb2RlIHN0YXJ0U2VydmljZSgpfS4KLVRoZSBtdXNpYyBzZXJ2aWNlIHdvdWxkIG9wZW4gdGhlIEludGVudCB0byBkaXNjb3ZlciB3aGljaCBtdXNpYyB0byAKK1RoZSBtdXNpYyBzZXJ2aWNlIHdvdWxkIG9wZW4gdGhlIEludGVudCB0byBkaXNjb3ZlciB3aGljaCBtdXNpYyB0bwogcGxheSwgYW5kIGJlZ2luIHRoZSBwbGF5YmFjay48L3A+CiAKIDxwPgpAQCAtMTUyNSw3ICsxNTI1LDcgQEAKIDxjb2RlPntAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UgQ29udGV4dC5zdGFydFNlcnZpY2UoKX08L2NvZGU+CiBvciAKIDxjb2RlPntAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNiaW5kU2VydmljZSBDb250ZXh0LmJpbmRTZXJ2aWNlKCl9PC9jb2RlPi4KLUhvd2V2ZXIsIHtAY29kZSBvblN0YXJ0KCl9IGlzIGNhbGxlZCBvbmx5IGZvciBzZXJ2aWNlcyBzdGFydGVkIGJ5IHtAY29kZQorSG93ZXZlciwge0Bjb2RlIG9uU3RhcnRDb21tYW5kKCl9IGlzIGNhbGxlZCBvbmx5IGZvciBzZXJ2aWNlcyBzdGFydGVkIGJ5IHtAY29kZQogc3RhcnRTZXJ2aWNlKCl9LgogPC9wPgogCkBAIC0xNjI5LDcgKzE2MjksNyBAQAogCiA8bGk+PHA+SXQgaGFzIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9IG9iamVjdCB0aGF0J3MgZXhlY3V0aW5nCiBvbmUgb2YgaXRzIGxpZmVjeWNsZSBjYWxsYmFja3MgKDxjb2RlPntAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uQ3JlYXRlIAotb25DcmVhdGUoKX08L2NvZGU+LCA8Y29kZT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0IG9uU3RhcnQoKX08L2NvZGU+LCAKK29uQ3JlYXRlKCl9PC9jb2RlPiwgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25TdGFydENvbW1hbmQgb25TdGFydENvbW1hbmQoKX08L2NvZGU+LAogb3IgPGNvZGU+e0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujb25EZXN0cm95IG9uRGVzdHJveSgpfTwvY29kZT4pLjwvcD48L2xpPgogCiA8bGk+PHA+SXQgaGFzIGEge0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gb2JqZWN0IHRoYXQncyAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3N0cmluZy1yZXNvdXJjZS5qZAppbmRleCA4MWM1ZDU1Li4yZGIzOGYxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9zdHJpbmctcmVzb3VyY2UuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvc3RyaW5nLXJlc291cmNlLmpkCkBAIC0xMiw4ICsxMiw4IEBACiAgICAgPGRkPlhNTCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlIHN0cmluZy48L2RkPgogICA8ZHQ+PGEgaHJlZj0iI1N0cmluZ0FycmF5Ij5TdHJpbmcgQXJyYXk8L2E+PC9kdD4KICAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgcHJvdmlkZXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy48L2RkPgotICA8ZHQ+PGEgaHJlZj0iI1BsdXJhbHMiPlBsdXJhbHM8L2E+PC9kdD4KLSAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgY2FycmllcyBkaWZmZXJlbnQgc3RyaW5ncyBmb3IgZGlmZmVyZW50IHBsdXJhbGl6YXRpb25zCisgIDxkdD48YSBocmVmPSIjUGx1cmFscyI+UXVhbnRpdHkgU3RyaW5ncyAoUGx1cmFscyk8L2E+PC9kdD4KKyAgICA8ZGQ+WE1MIHJlc291cmNlIHRoYXQgY2FycmllcyBkaWZmZXJlbnQgc3RyaW5ncyBmb3IgZGlmZmVyZW50IHF1YW50aXRpZXMKICAgICBvZiB0aGUgc2FtZSB3b3JkIG9yIHBocmFzZS48L2RkPgogPC9kbD4KIApAQCAtMjE4LDEzICsyMTgsMzAgQEAKIAogCiAKLTxoMiBpZD0iUGx1cmFscyI+UGx1cmFsczwvaDI+Cis8aDIgaWQ9IlBsdXJhbHMiPlF1YW50aXR5IFN0cmluZ3MgKFBsdXJhbHMpPC9oMj4KIAotPHA+QSBwYWlyIG9mIHN0cmluZ3MgdGhhdCBlYWNoIHByb3ZpZGUgYSBkaWZmZXJlbnQgcGx1cmFsIGZvcm0gb2YgdGhlIHNhbWUgd29yZCBvciBwaHJhc2UsCi13aGljaCB5b3UgY2FuIGNvbGxlY3RpdmVseSByZWZlcmVuY2UgZnJvbSB0aGUgYXBwbGljYXRpb24uIFdoZW4geW91IHJlcXVlc3QgdGhlIHBsdXJhbHMKLXJlc291cmNlIHVzaW5nIGEgbWV0aG9kIHN1Y2ggYXMge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzI2dldFF1YW50aXR5U3RyaW5nKGludCxpbnQpCi1nZXRRdWFudGl0eVN0cmluZygpfSwgeW91IG11c3QgcGFzcyBhICJjb3VudCIsIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBwbHVyYWwgZm9ybSB5b3UKLXJlcXVpcmUgYW5kIHJldHVybiB0aGF0IHN0cmluZyB0byB5b3UuPC9wPgorPHA+RGlmZmVyZW50IGxhbmd1YWdlcyBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgZ3JhbW1hdGljYWwgYWdyZWVtZW50IHdpdGggcXVhbnRpdHkuIEluIEVuZ2xpc2gsCitmb3IgZXhhbXBsZSwgdGhlIHF1YW50aXR5IDEgaXMgYSBzcGVjaWFsIGNhc2UuIFdlIHdyaXRlICIxIGJvb2siLCBidXQgZm9yIGFueSBvdGhlciBxdWFudGl0eSB3ZSdkCit3cml0ZSAiPGk+bjwvaT4gYm9va3MiLiBUaGlzIGRpc3RpbmN0aW9uIGJldHdlZW4gc2luZ3VsYXIgYW5kIHBsdXJhbCBpcyB2ZXJ5IGNvbW1vbiwgYnV0IG90aGVyCitsYW5ndWFnZXMgbWFrZSBmaW5lciBkaXN0aW5jdGlvbnMuIFRoZSBmdWxsIHNldCBzdXBwb3J0ZWQgYnkgQW5kcm9pZCBpcyA8Y29kZT56ZXJvPC9jb2RlPiwKKzxjb2RlPm9uZTwvY29kZT4sIDxjb2RlPnR3bzwvY29kZT4sIDxjb2RlPmZldzwvY29kZT4sIDxjb2RlPm1hbnk8L2NvZGU+LCBhbmQgPGNvZGU+b3RoZXI8L2NvZGU+LgorCis8cD5UaGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIGNhc2UgdG8gdXNlIGZvciBhIGdpdmVuIGxhbmd1YWdlIGFuZCBxdWFudGl0eSBjYW4gYmUgdmVyeSBjb21wbGV4LAorc28gQW5kcm9pZCBwcm92aWRlcyB5b3Ugd2l0aCBtZXRob2RzIHN1Y2ggYXMKK3tAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcyNnZXRRdWFudGl0eVN0cmluZyhpbnQsaW50KSBnZXRRdWFudGl0eVN0cmluZygpfSB0byBzZWxlY3QKK3RoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmb3IgeW91LgorCis8cD5Ob3RlIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBtYWRlIGJhc2VkIG9uIGdyYW1tYXRpY2FsIG5lY2Vzc2l0eS4gQSBzdHJpbmcgZm9yIDxjb2RlPnplcm88L2NvZGU+CitpbiBFbmdsaXNoIHdpbGwgYmUgaWdub3JlZCBldmVuIGlmIHRoZSBxdWFudGl0eSBpcyAwLCBiZWNhdXNlIDAgaXNuJ3QgZ3JhbW1hdGljYWxseSBkaWZmZXJlbnQKK2Zyb20gMiwgb3IgYW55IG90aGVyIG51bWJlciBleGNlcHQgMSAoInplcm8gYm9va3MiLCAib25lIGJvb2siLCAidHdvIGJvb2tzIiwgZXQgY2V0ZXJhKS4KK0Rvbid0IGJlIG1pc2xlZCBlaXRoZXIgYnkgdGhlIGZhY3QgdGhhdCwgc2F5LCA8Y29kZT50d288L2NvZGU+IHNvdW5kcyBsaWtlIGl0IGNvdWxkIG9ubHkgYXBwbHkgdG8KK3RoZSBxdWFudGl0eSAyOiBhIGxhbmd1YWdlIG1heSByZXF1aXJlIHRoYXQgMiwgMTIsIDEwMiAoZXQgY2V0ZXJhKSBhcmUgYWxsIHRyZWF0ZWQgbGlrZSBvbmUKK2Fub3RoZXIgYnV0IGRpZmZlcmVudGx5IHRvIG90aGVyIHF1YW50aXRpZXMuIFJlbHkgb24geW91ciB0cmFuc2xhdG9yIHRvIGtub3cgd2hhdCBkaXN0aW5jdGlvbnMKK3RoZWlyIGxhbmd1YWdlIGFjdHVhbGx5IGluc2lzdHMgdXBvbi4KKworPHA+SXQncyBvZnRlbiBwb3NzaWJsZSB0byBhdm9pZCBxdWFudGl0eSBzdHJpbmdzIGJ5IHVzaW5nIHF1YW50aXR5LW5ldXRyYWwgZm9ybXVsYXRpb25zIHN1Y2ggYXMKKyJCb29rczogMSIuIFRoaXMgd2lsbCBtYWtlIHlvdXIgbGlmZSBhbmQgeW91ciB0cmFuc2xhdG9ycycgbGl2ZXMgZWFzaWVyLCBpZiBpdCdzIGEgc3R5bGUgdGhhdCdzCitpbiBrZWVwaW5nIHdpdGggeW91ciBhcHBsaWNhdGlvbi4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQSBwbHVyYWxzIGNvbGxlY3Rpb24gaXMgYSBzaW1wbGUgcmVzb3VyY2UgdGhhdCBpcwogcmVmZXJlbmNlZCB1c2luZyB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIHtAY29kZSBuYW1lfSBhdHRyaWJ1dGUgKG5vdCB0aGUgbmFtZSBvZiB0aGUgWE1MCkBAIC0yNTEsNyArMjY4LDcgQEAKICAgICAmbHQ7PGEgaHJlZj0iI3BsdXJhbHMtZWxlbWVudCI+cGx1cmFsczwvYT4KICAgICAgICAgbmFtZT0iPGVtPnBsdXJhbF9uYW1lPC9lbT4iPgogICAgICAgICAmbHQ7PGEgaHJlZj0iI3BsdXJhbHMtaXRlbS1lbGVtZW50Ij5pdGVtPC9hPgotICAgICAgICAgICAgcXVhbnRpdHk9WyJvbmUiIHwgIm90aGVyIl0KKyAgICAgICAgICAgIHF1YW50aXR5PVsiemVybyIgfCAib25lIiB8ICJ0d28iIHwgImZldyIgfCAibWFueSIgfCAib3RoZXIiXQogICAgICAgICAgICAgJmd0OzxlbT50ZXh0X3N0cmluZzwvZW0+Jmx0Oy9pdGVtPgogICAgICZsdDsvcGx1cmFscz4KICZsdDsvcmVzb3VyY2VzPgpAQCAtMjg1LDE2ICszMDIsMjcgQEAKICAgICAgIDxwIGNsYXNzPSJjYXBzIj5hdHRyaWJ1dGVzOjwvcD4KICAgICAgIDxkbCBjbGFzcz0iYXRuLWxpc3QiPgogICAgICAgICA8ZHQ+PGNvZGU+cXVhbnRpdHk8L2NvZGU+PC9kdD4KLSAgICAgICAgPGRkPjxlbT5LZXl3b3JkPC9lbT4uIEEgdmFsdWUgaW5kaWNhdGluZyB0aGUgY2FzZSBpbiB3aGljaCB0aGlzIHN0cmluZyBzaG91bGQgYmUgdXNlZC4gVmFsaWQKLXZhbHVlczoKKyAgICAgICAgPGRkPjxlbT5LZXl3b3JkPC9lbT4uIEEgdmFsdWUgaW5kaWNhdGluZyB3aGVuIHRoaXMgc3RyaW5nIHNob3VsZCBiZSB1c2VkLiBWYWxpZAordmFsdWVzLCB3aXRoIG5vbi1leGhhdXN0aXZlIGV4YW1wbGVzIGluIHBhcmVudGhlc2VzOgogICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgIDx0cj48dGg+VmFsdWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj4KICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPntAY29kZSBvbmV9PC90ZD48dGQ+V2hlbiB0aGVyZSBpcyBvbmUgKGEgc2luZ3VsYXIgc3RyaW5nKS48L3RkPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIHplcm99PC90ZD48dGQ+V2hlbiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgb2YgdGhlIG51bWJlciAwIChhcyBpbiBBcmFiaWMpLjwvdGQ+CiAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIG90aGVyfTwvdGQ+PHRkPldoZW4gdGhlIHF1YW50aXR5IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gb25lIChhIHBsdXJhbAotc3RyaW5nLCBidXQgYWxzbyB1c2VkIHdoZW4gdGhlIGNvdW50IGlzIHplcm8pLjwvdGQ+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgb25lfTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgbGlrZSBvbmUgKGFzIHdpdGggdGhlIG51bWJlciAxIGluIEVuZ2xpc2ggYW5kIG1vc3Qgb3RoZXIgbGFuZ3VhZ2VzOyBpbiBSdXNzaWFuLCBhbnkgbnVtYmVyIGVuZGluZyBpbiAxIGJ1dCBub3QgZW5kaW5nIGluIDExIGlzIGluIHRoaXMgY2xhc3MpLjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+e0Bjb2RlIHR3b308L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBvZiBudW1iZXJzIGxpa2UgdHdvIChhcyBpbiBXZWxzaCkuPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD57QGNvZGUgZmV3fTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mICJzbWFsbCIgbnVtYmVycyAoYXMgd2l0aCAyLCAzLCBhbmQgNCBpbiBDemVjaDsgb3IgbnVtYmVycyBlbmRpbmcgMiwgMywgb3IgNCBidXQgbm90IDEyLCAxMywgb3IgMTQgaW4gUG9saXNoKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBtYW55fTwvdGQ+PHRkPldoZW4gdGhlIGxhbmd1YWdlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50IG9mICJsYXJnZSIgbnVtYmVycyAoYXMgd2l0aCBudW1iZXJzIGVuZGluZyAxMS05OSBpbiBNYWx0ZXNlKS48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPntAY29kZSBvdGhlcn08L3RkPjx0ZD5XaGVuIHRoZSBsYW5ndWFnZSBkb2VzIG5vdCByZXF1aXJlIHNwZWNpYWwgdHJlYXRtZW50IG9mIHRoZSBnaXZlbiBxdWFudGl0eS48L3RkPgogICAgICAgICAgICAgPC90cj4KICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICA8L2RkPgpAQCAtMzE1LDYgKzM0MywxNyBAQAogICAgICZsdDsvcGx1cmFscz4KICZsdDsvcmVzb3VyY2VzPgogPC9wcmU+CisgICAgPHA+WE1MIGZpbGUgc2F2ZWQgYXQge0Bjb2RlIHJlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWx9OjwvcD4KKzxwcmU+CismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorJmx0O3Jlc291cmNlcz4KKyAgICAmbHQ7cGx1cmFscyBuYW1lPSJudW1iZXJPZlNvbmdzQXZhaWxhYmxlIj4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9Im9uZSI+Wm5hbGV6aW9ubyBqZWRuJiN4MDEwNTsgcGlvc2VuayYjeDAxMTk7LiZsdDsvaXRlbT4KKyAgICAgICAgJmx0O2l0ZW0gcXVhbnRpdHk9ImZldyI+Wm5hbGV6aW9ubyAlZCBwaW9zZW5raS4mbHQ7L2l0ZW0+CisgICAgICAgICZsdDtpdGVtIHF1YW50aXR5PSJvdGhlciI+Wm5hbGV6aW9ubyAlZCBwaW9zZW5lay4mbHQ7L2l0ZW0+CisgICAgJmx0Oy9wbHVyYWxzPgorJmx0Oy9yZXNvdXJjZXM+Cis8L3ByZT4KICAgICA8cD5KYXZhIGNvZGU6PC9wPgogPHByZT4KIGludCBjb3VudCA9IGdldE51bWJlck9mc29uZ3NBdmFpbGFibGUoKTsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5MmFkNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9hY3Rpdml0eV90ZXN0aW5nLmpkCkBAIC0wLDAgKzEsMzkyIEBACitwYWdlLnRpdGxlPUFjdGl2aXR5IFRlc3RpbmcKK0BqZDpib2R5CisKKzxkaXYgaWQ9InF2LXdyYXBwZXIiPgorICA8ZGl2IGlkPSJxdiI+CisgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgPG9sPgorICAgIDxsaT4KKyAgICAgIDxhIGhyZWY9IiNBY3Rpdml0eVRlc3RBUEkiPlRoZSBBY3Rpdml0eSBUZXN0aW5nIEFQSTwvYT4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI0FjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyIj5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI0FjdGl2aXR5VW5pdFRlc3RDYXNlIj5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI1NpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2UiPlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2U8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0Tm90ZXMiPk1vY2sgb2JqZWN0cyBhbmQgYWN0aXZpdHkgdGVzdGluZzwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI0Fzc2VydGlvbk5vdGVzIj5Bc3NlcnRpb25zIGZvciBhY3Rpdml0eSB0ZXN0aW5nPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1doYXRUb1Rlc3QiPldoYXQgdG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI05leHRTdGVwcyI+TmV4dCBTdGVwczwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgIDxhIGhyZWY9IiNVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9hPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNVbmxvY2tEZXZpY2UiPlVubG9ja2luZyB0aGUgRW11bGF0b3Igb3IgRGV2aWNlPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI1VJVGVzdFRyb3VibGVzaG9vdGluZyI+VHJvdWJsZXNob290aW5nIFVJIHRlc3RzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgICA8L2xpPgorICAgIDwvb2w+Cis8aDI+S2V5IENsYXNzZXM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX08L2xpPgorICAgIDwvb2w+Cis8aDI+UmVsYXRlZCBUdXRvcmlhbHM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5IFRlc3Rpbmc8L2E+CisgICAgICA8L2xpPgorICAgIDwvb2w+Cis8aDI+U2VlIEFsc288L2gyPgorICAgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgIDwvbGk+CisgICAgICA8L29sPgorICA8L2Rpdj4KKzwvZGl2PgorPHA+CisgICAgQWN0aXZpdHkgdGVzdGluZyBpcyBwYXJ0aWN1bGFybHkgZGVwZW5kZW50IG9uIHRoZSB0aGUgQW5kcm9pZCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLgorICAgIFVubGlrZSBvdGhlciBjb21wb25lbnRzLCBhY3Rpdml0aWVzIGhhdmUgYSBjb21wbGV4IGxpZmVjeWNsZSBiYXNlZCBvbiBjYWxsYmFjayBtZXRob2RzOyB0aGVzZQorICAgIGNhbid0IGJlIGludm9rZWQgZGlyZWN0bHkgZXhjZXB0IGJ5IGluc3RydW1lbnRhdGlvbi4gQWxzbywgdGhlIG9ubHkgd2F5IHRvIHNlbmQgZXZlbnRzIHRvIHRoZQorICAgIHVzZXIgaW50ZXJmYWNlIGZyb20gYSBwcm9ncmFtIGlzIHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uLgorPC9wPgorPHA+CisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHRlc3QgYWN0aXZpdGllcyB1c2luZyBpbnN0cnVtZW50YXRpb24gYW5kIG90aGVyIHRlc3QKKyAgICBmYWNpbGl0aWVzLiBUaGUgZG9jdW1lbnQgYXNzdW1lcyB5b3UgaGF2ZSBhbHJlYWR5IHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmh0bWwiPlRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPiwKKyAgICB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgYW5kIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsuCis8L3A+Cis8aDIgaWQ9IkFjdGl2aXR5VGVzdEFQSSI+VGhlIEFjdGl2aXR5IFRlc3RpbmcgQVBJPC9oMj4KKzxwPgorICAgIFRoZSBhY3Rpdml0eSB0ZXN0aW5nIEFQSSBiYXNlIGNsYXNzIGlzIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9LAorICAgIHdoaWNoIHByb3ZpZGVzIGluc3RydW1lbnRhdGlvbiB0byB0aGUgdGVzdCBjYXNlIHN1YmNsYXNzZXMgeW91IHVzZSBmb3IgQWN0aXZpdGllcy4KKzwvcD4KKzxwPgorICAgIEZvciBhY3Rpdml0eSB0ZXN0aW5nLCB0aGlzIGJhc2UgY2xhc3MgcHJvdmlkZXMgdGhlc2UgZnVuY3Rpb25zOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgTGlmZWN5Y2xlIGNvbnRyb2w6IFdpdGggaW5zdHJ1bWVudGF0aW9uLCB5b3UgY2FuIHN0YXJ0IHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LCBwYXVzZSBpdCwKKyAgICAgICAgYW5kIGRlc3Ryb3kgaXQsIHVzaW5nIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHRlc3QgY2FzZSBjbGFzc2VzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBEZXBlbmRlbmN5IGluamVjdGlvbjogSW5zdHJ1bWVudGF0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcworICAgICAgICBDb250ZXh0cyBvciBBcHBsaWNhdGlvbnMgYW5kIHVzZSB0aGVtIHRvIHJ1biB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdC4gVGhpcworICAgICAgICBoZWxwcyB5b3UgY29udHJvbCB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgaXNvbGF0ZSBpdCBmcm9tIHByb2R1Y3Rpb24gc3lzdGVtcy4gWW91IGNhbgorICAgICAgICBhbHNvIHNldCB1cCBjdXN0b21pemVkIEludGVudHMgYW5kIHN0YXJ0IGFuIGFjdGl2aXR5IHdpdGggdGhlbS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVXNlciBpbnRlcmZhY2UgaW50ZXJhY3Rpb246IFlvdSB1c2UgaW5zdHJ1bWVudGF0aW9uIHRvIHNlbmQga2V5c3Ryb2tlcyBvciB0b3VjaCBldmVudHMKKyAgICAgICAgZGlyZWN0bHkgdG8gdGhlIFVJIG9mIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIDwvbGk+Cis8L3VsPgorPHA+CisgICAgVGhlIGFjdGl2aXR5IHRlc3RpbmcgY2xhc3NlcyBhbHNvIHByb3ZpZGUgdGhlIEpVbml0IGZyYW1ld29yayBieSBleHRlbmRpbmcKKyAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlfSBhbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9LgorPC9wPgorPHA+CisgICAgVGhlIHR3byBtYWluIHRlc3Rpbmcgc3ViY2xhc3NlcyBhcmUge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gYW5kCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0uIFRvIHRlc3QgYW4gQWN0aXZpdHkgdGhhdCBpcyBsYXVuY2hlZCBpbiBhIG1vZGUKKyAgICBvdGhlciB0aGFuIDxjb2RlPnN0YW5kYXJkPC9jb2RlPiwgeW91IHVzZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNpbmdsZUxhdW5jaEFjdGl2aXR5VGVzdENhc2V9LgorPC9wPgorPGgzIGlkPSJBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiI+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2gzPgorPHA+CisgICAgVGhlIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IHRlc3QgY2FzZSBjbGFzcyBpcyBkZXNpZ25lZCB0byBkbworICAgIGZ1bmN0aW9uYWwgdGVzdGluZyBvZiBvbmUgb3IgbW9yZSBBY3Rpdml0aWVzIGluIGFuIGFwcGxpY2F0aW9uLCB1c2luZyBhIG5vcm1hbCBzeXN0ZW0KKyAgICBpbmZyYXN0cnVjdHVyZS4gSXQgcnVucyB0aGUgQWN0aXZpdGllcyBpbiBhIG5vcm1hbCBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwKKyAgICB1c2luZyBhIHN0YW5kYXJkIHN5c3RlbSBDb250ZXh0LiBJdCBhbGxvd3MgeW91IHRvIHNlbmQgbW9jayBJbnRlbnRzIHRvIHRoZSBhY3Rpdml0eSB1bmRlcgorICAgIHRlc3QsIHNvIHlvdSBjYW4gdXNlIGl0IHRvIHRlc3QgYW4gYWN0aXZpdHkgdGhhdCByZXNwb25kcyB0byBtdWx0aXBsZSB0eXBlcyBvZiBpbnRlbnRzLCBvcgorICAgIGFuIGFjdGl2aXR5IHRoYXQgZXhwZWN0cyBhIGNlcnRhaW4gdHlwZSBvZiBkYXRhIGluIHRoZSBpbnRlbnQsIG9yIGJvdGguIE5vdGljZSwgdGhvdWdoLCB0aGF0IGl0CisgICAgZG9lcyBub3QgYWxsb3cgbW9jayBDb250ZXh0cyBvciBBcHBsaWNhdGlvbnMsIHNvIHlvdSBjYW4gbm90IGlzb2xhdGUgdGhlIHRlc3QgZnJvbSB0aGUgcmVzdCBvZgorICAgIGEgcHJvZHVjdGlvbiBzeXN0ZW0uCis8L3A+Cis8aDMgaWQ9IkFjdGl2aXR5VW5pdFRlc3RDYXNlIj5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvaDM+Cis8cD4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX0gdGVzdCBjYXNlIGNsYXNzIHRlc3RzIGEgc2luZ2xlIGFjdGl2aXR5IGluCisgICAgaXNvbGF0aW9uLiBCZWZvcmUgeW91IHN0YXJ0IHRoZSBhY3Rpdml0eSwgeW91IGNhbiBpbmplY3QgYSBtb2NrIENvbnRleHQgb3IgQXBwbGljYXRpb24sIG9yIGJvdGguCisgICAgWW91IHVzZSBpdCB0byBydW4gYWN0aXZpdHkgdGVzdHMgaW4gaXNvbGF0aW9uLCBhbmQgdG8gZG8gdW5pdCB0ZXN0aW5nIG9mIG1ldGhvZHMKKyAgICB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIEFuZHJvaWQuIFlvdSBjYW4gbm90IHNlbmQgbW9jayBJbnRlbnRzIHRvIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LAorICAgIGFsdGhvdWdoIHlvdSBjYW4gY2FsbAorICAgIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNzdGFydEFjdGl2aXR5KEludGVudCkgQWN0aXZpdHkuc3RhcnRBY3Rpdml0eShJbnRlbnQpfSBhbmQgdGhlbgorICAgIGxvb2sgYXQgYXJndW1lbnRzIHRoYXQgd2VyZSByZWNlaXZlZC4KKzwvcD4KKzxoMyBpZD0iU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZSI+U2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZTwvaDM+Cis8cD4KKyAgICBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5TaW5nbGVMYXVuY2hBY3Rpdml0eVRlc3RDYXNlfSBjbGFzcyBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIGZvcgorICAgIHRlc3RpbmcgYSBzaW5nbGUgYWN0aXZpdHkgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2Vzbid0IGNoYW5nZSBmcm9tIHRlc3QgdG8gdGVzdC4KKyAgICBJdCBpbnZva2VzIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfSBhbmQKKyAgICB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkgdGVhckRvd24oKX0gb25seSBvbmNlLCBpbnN0ZWFkIG9mIG9uY2UgcGVyCisgICAgbWV0aG9kIGNhbGwuIEl0IGRvZXMgbm90IGFsbG93IHlvdSB0byBpbmplY3QgYW55IG1vY2sgb2JqZWN0cy4KKzwvcD4KKzxwPgorICAgIFRoaXMgdGVzdCBjYXNlIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBhbiBhY3Rpdml0eSB0aGF0IHJ1bnMgaW4gYSBtb2RlIG90aGVyIHRoYW4KKyAgICA8Y29kZT5zdGFuZGFyZDwvY29kZT4uIEl0IGVuc3VyZXMgdGhhdCB0aGUgdGVzdCBmaXh0dXJlIGlzIG5vdCByZXNldCBiZXR3ZWVuIHRlc3RzLiBZb3UKKyAgICBjYW4gdGhlbiB0ZXN0IHRoYXQgdGhlIGFjdGl2aXR5IGhhbmRsZXMgbXVsdGlwbGUgY2FsbHMgY29ycmVjdGx5LgorPC9wPgorPGgzIGlkPSJNb2NrT2JqZWN0Tm90ZXMiPk1vY2sgb2JqZWN0cyBhbmQgYWN0aXZpdHkgdGVzdGluZzwvaDM+Cis8cD4KKyAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgbm90ZXMgYWJvdXQgdGhlIHVzZSBvZiB0aGUgbW9jayBvYmplY3RzIGRlZmluZWQgaW4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9IHdpdGggYWN0aXZpdHkgdGVzdHMuCis8L3A+Cis8cD4KKyAgICBUaGUgbW9jayBvYmplY3Qge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0gaXMgb25seSBhdmFpbGFibGUgZm9yIGFjdGl2aXR5CisgICAgdGVzdGluZyBpZiB5b3UgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlfSB0ZXN0IGNhc2UgY2xhc3MuCisgICAgQnkgZGVmYXVsdCwgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+LCBjcmVhdGVzIGEgaGlkZGVuIDxjb2RlPk1vY2tBcHBsaWNhdGlvbjwvY29kZT4KKyAgICBvYmplY3QgdGhhdCBpcyB1c2VkIGFzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBZb3UgY2FuIGluamVjdCB5b3VyIG93biBvYmplY3QgdXNpbmcKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5VW5pdFRlc3RDYXNlI3NldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uKSBzZXRBcHBsaWNhdGlvbigpfS4KKzwvcD4KKzxoMyBpZD0iQXNzZXJ0aW9uTm90ZXMiPkFzc2VydGlvbnMgZm9yIGFjdGl2aXR5IHRlc3Rpbmc8L2gzPgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gZGVmaW5lcyBhc3NlcnRpb25zIGZvciBWaWV3cy4gWW91IHVzZSBpdCB0byB2ZXJpZnkgdGhlCisgICAgYWxpZ25tZW50IGFuZCBwb3NpdGlvbiBvZiBWaWV3IG9iamVjdHMsIGFuZCB0byBsb29rIGF0IHRoZSBzdGF0ZSBvZiBWaWV3R3JvdXAgb2JqZWN0cy4KKzwvcD4KKzxoMiBpZD0iV2hhdFRvVGVzdCI+V2hhdCBUbyBUZXN0PC9oMj4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIElucHV0IHZhbGlkYXRpb246IFRlc3QgdGhhdCBhbiBhY3Rpdml0eSByZXNwb25kcyBjb3JyZWN0bHkgdG8gaW5wdXQgdmFsdWVzIGluIGFuCisgICAgICAgIEVkaXRUZXh0IFZpZXcuIFNldCB1cCBhIGtleXN0cm9rZSBzZXF1ZW5jZSwgc2VuZCBpdCB0byB0aGUgYWN0aXZpdHksIGFuZCB0aGVuCisgICAgICAgIHVzZSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZmluZFZpZXdCeUlkKGludCl9IHRvIGV4YW1pbmUgdGhlIHN0YXRlIG9mIHRoZSBWaWV3LiBZb3UgY2FuCisgICAgICAgIHZlcmlmeSB0aGF0IGEgdmFsaWQga2V5c3Ryb2tlIHNlcXVlbmNlIGVuYWJsZXMgYW4gT0sgYnV0dG9uLCB3aGlsZSBhbiBpbnZhbGlkIG9uZSBsZWF2ZXMgdGhlCisgICAgICAgIGJ1dHRvbiBkaXNhYmxlZC4gWW91IGNhbiBhbHNvIHZlcmlmeSB0aGF0IHRoZSBBY3Rpdml0eSByZXNwb25kcyB0byBpbnZhbGlkIGlucHV0IGJ5CisgICAgICAgIHNldHRpbmcgZXJyb3IgbWVzc2FnZXMgaW4gdGhlIFZpZXcuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIExpZmVjeWNsZSBldmVudHM6IFRlc3QgdGhhdCBlYWNoIG9mIHlvdXIgYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIGhhbmRsZXMgbGlmZWN5Y2xlIGV2ZW50cworICAgICAgICBjb3JyZWN0bHkuIEluIGdlbmVyYWwsIGxpZmVjeWNsZSBldmVudHMgYXJlIGFjdGlvbnMsIGVpdGhlciBmcm9tIHRoZSBzeXN0ZW0gb3IgZnJvbSB0aGUKKyAgICAgICAgdXNlciwgdGhhdCB0cmlnZ2VyIGEgY2FsbGJhY2sgbWV0aG9kIHN1Y2ggYXMgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gb3IKKyAgICAgICAgPGNvZGU+b25DbGljaygpPC9jb2RlPi4gRm9yIGV4YW1wbGUsIGFuIGFjdGl2aXR5IHNob3VsZCByZXNwb25kIHRvIHBhdXNlIG9yIGRlc3Ryb3kgZXZlbnRzCisgICAgICAgIGJ5IHNhdmluZyBpdHMgc3RhdGUuIFJlbWVtYmVyIHRoYXQgZXZlbiBhIGNoYW5nZSBpbiBzY3JlZW4gb3JpZW50YXRpb24gY2F1c2VzIHRoZSBjdXJyZW50CisgICAgICAgIGFjdGl2aXR5IHRvIGJlIGRlc3Ryb3llZCwgc28geW91IHNob3VsZCB0ZXN0IHRoYXQgYWNjaWRlbnRhbCBkZXZpY2UgbW92ZW1lbnRzIGRvbid0CisgICAgICAgIGFjY2lkZW50YWxseSBsb3NlIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgSW50ZW50czogVGVzdCB0aGF0IGVhY2ggYWN0aXZpdHkgY29ycmVjdGx5IGhhbmRsZXMgdGhlIGludGVudHMgbGlzdGVkIGluIHRoZSBpbnRlbnQKKyAgICAgICAgZmlsdGVyIHNwZWNpZmllZCBpbiBpdHMgbWFuaWZlc3QuIFlvdSBjYW4gdXNlCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IHRvIHNlbmQgbW9jayBJbnRlbnRzIHRvIHRoZQorICAgICAgICBhY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBSdW50aW1lIGNvbmZpZ3VyYXRpb24gY2hhbmdlczogVGVzdCB0aGF0IGVhY2ggYWN0aXZpdHkgcmVzcG9uZHMgY29ycmVjdGx5IHRvIHRoZQorICAgICAgICBwb3NzaWJsZSBjaGFuZ2VzIGluIHRoZSBkZXZpY2UncyBjb25maWd1cmF0aW9uIHdoaWxlIHlvdXIgYXBwbGljYXRpb24gaXMgcnVubmluZy4gVGhlc2UKKyAgICAgICAgaW5jbHVkZSBhIGNoYW5nZSB0byB0aGUgZGV2aWNlJ3Mgb3JpZW50YXRpb24sIGEgY2hhbmdlIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBhbmQgc28KKyAgICAgICAgZm9ydGguIEhhbmRsaW5nIHRoZXNlIGNoYW5nZXMgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBpbiB0aGUgdG9waWMKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9yZXNvdXJjZXMvcnVudGltZS1jaGFuZ2VzLmh0bWwiPkhhbmRsaW5nIFJ1bnRpbWUKKyAgICAgICAgQ2hhbmdlczwvYT4uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFNjcmVlbiBzaXplcyBhbmQgcmVzb2x1dGlvbnM6IEJlZm9yZSB5b3UgcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uLCBtYWtlIHN1cmUgdG8gdGVzdCBpdCBvbgorICAgICAgICBhbGwgb2YgdGhlIHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIG9uIHdoaWNoIHlvdSB3YW50IGl0IHRvIHJ1bi4gWW91IGNhbiB0ZXN0IHRoZQorICAgICAgICBhcHBsaWNhdGlvbiBvbiBtdWx0aXBsZSBzaXplcyBhbmQgZGVuc2l0aWVzIHVzaW5nIEFWRHMsIG9yIHlvdSBjYW4gdGVzdCB5b3VyIGFwcGxpY2F0aW9uCisgICAgICAgIGRpcmVjdGx5IG9uIHRoZSBkZXZpY2VzIHRoYXQgeW91IGFyZSB0YXJnZXRpbmcuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIHRvcGljCisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT4uCisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KKzwvcD4KKzxwPgorICAgIElmIHlvdSB3YW50IGEgc3RlcC1ieS1zdGVwIGludHJvZHVjdGlvbiB0byB0ZXN0aW5nIGFjdGl2aXRpZXMsIHRyeSBvbmUgb2YgdGhlCisgICAgdGVzdGluZyB0dXRvcmlhbHM6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEKKyAgICAgICAgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj5IZWxsbywKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaW50cm9kdWNlcyBiYXNpYyB0ZXN0aW5nIGNvbmNlcHRzIGFuZCBwcm9jZWR1cmVzIGluIHRoZQorICAgICAgICBjb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+QWN0aXZpdHkKKyAgICAgICAgVGVzdGluZzwvYT4gdHV0b3JpYWwgaXMgYW4gZXhjZWxsZW50IGZvbGxvdy11cCB0byB0aGUgSGVsbG8sIFRlc3RpbmcgdHV0b3JpYWwuCisgICAgICAgIEl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCisgICAgICAgIG1vcmUgcmVhbGlzdGljIGFjdGl2aXR5LW9yaWVudGVkIGFwcGxpY2F0aW9uLgorICAgIDwvbGk+Cis8L3VsPgorPGgyIGlkPSJVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9oMj4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgaGF2ZSB0aXBzIGZvciB0ZXN0aW5nIHRoZSBVSSBvZiB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24sIHNwZWNpZmljYWxseQorICAgIHRvIGhlbHAgeW91IGhhbmRsZSBhY3Rpb25zIHRoYXQgcnVuIGluIHRoZSBVSSB0aHJlYWQsIHRvdWNoIHNjcmVlbiBhbmQga2V5Ym9hcmQgZXZlbnRzLCBhbmQgaG9tZQorICAgIHNjcmVlbiB1bmxvY2sgZHVyaW5nIHRlc3RpbmcuCis8L3A+Cis8aDMgaWQ9IlJ1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvaDM+Cis8cD4KKyAgICBBbiBhcHBsaWNhdGlvbidzIGFjdGl2aXRpZXMgcnVuIG9uIHRoZSBhcHBsaWNhdGlvbidzIDxzdHJvbmc+VUkgdGhyZWFkPC9zdHJvbmc+LiBPbmNlIHRoZQorICAgIFVJIGlzIGluc3RhbnRpYXRlZCwgZm9yIGV4YW1wbGUgaW4gdGhlIGFjdGl2aXR5J3MgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kLCB0aGVuIGFsbAorICAgIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAorICAgIGhhcyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBhbmQgZG9lcyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorPC9wPgorPHA+CisgICAgVGhpcyBjaGFuZ2VzIHdoZW4geW91IHJ1biB0ZXN0cyBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbi4gV2l0aCBpbnN0cnVtZW50YXRpb24tYmFzZWQgY2xhc3NlcywKKyAgICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzCisgICAgZG9uJ3QgYWxsb3cgdGhpcy4gVG8gcnVuIGFuIGVudGlyZSB0ZXN0IG1ldGhvZCBvbiB0aGUgVUkgdGhyZWFkLCB5b3UgY2FuIGFubm90YXRlIHRoZSB0aHJlYWQKKyAgICB3aXRoIDxjb2RlPkBVSVRocmVhZFRlc3Q8L2NvZGU+LiBOb3RpY2UgdGhhdCB0aGlzIHdpbGwgcnVuIDxlbT5hbGw8L2VtPiBvZiB0aGUgbWV0aG9kIHN0YXRlbWVudHMKKyAgICBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSSBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UKKyAgICBjYW4ndCBpbnZva2UgPGNvZGU+SW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpPC9jb2RlPi4KKzwvcD4KKzxwPgorICAgIFRvIHJ1biBhIHN1YnNldCBvZiBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQsIGNyZWF0ZSBhbiBhbm9ueW1vdXMgY2xhc3Mgb2YgdHlwZQorICAgIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQKKyAgICBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIG1ldGhvZAorICAgIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+LnJ1bk9uVWlUaHJlYWQoKTwvY29kZT4sIHdoZXJlIDxjb2RlPjxlbT5hcHBBY3Rpdml0eTwvZW0+PC9jb2RlPiBpcworICAgIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24geW91IGFyZSB0ZXN0aW5nLgorPC9wPgorPHA+CisgICAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBpbnN0YW50aWF0ZXMgYW4gYWN0aXZpdHkgdG8gdGVzdCwgcmVxdWVzdHMgZm9jdXMgKGEgVUkgYWN0aW9uKSBmb3IgdGhlCisgICAgU3Bpbm5lciBkaXNwbGF5ZWQgYnkgdGhlIGFjdGl2aXR5LCBhbmQgdGhlbiBzZW5kcyBhIGtleSB0byBpdC4gTm90aWNlIHRoYXQgdGhlIGNhbGxzIHRvCisgICAgPGNvZGU+d2FpdEZvcklkbGVTeW5jPC9jb2RlPiBhbmQgPGNvZGU+c2VuZEtleXM8L2NvZGU+IGFyZW4ndCBhbGxvd2VkIHRvIHJ1biBvbiB0aGUgVUkgdGhyZWFkOgorPC9wPgorPHByZT4KKyAgcHJpdmF0ZSBNeUFjdGl2aXR5IG1BY3Rpdml0eTsgLy8gTXlBY3Rpdml0eSBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYXBwIHVuZGVyIHRlc3QKKyAgcHJpdmF0ZSBTcGlubmVyIG1TcGlubmVyOworCisgIC4uLgorCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgbUluc3RydW1lbnRhdGlvbiA9IGdldEluc3RydW1lbnRhdGlvbigpOworCisgICAgICBtQWN0aXZpdHkgPSBnZXRBY3Rpdml0eSgpOyAvLyBnZXQgYSByZWZlcmVuY2VzIHRvIHRoZSBhcHAgdW5kZXIgdGVzdAorCisgICAgICAvKgorICAgICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBtYWluIHdpZGdldCBvZiB0aGUgYXBwIHVuZGVyIHRlc3QsIGEgU3Bpbm5lcgorICAgICAgICovCisgICAgICBtU3Bpbm5lciA9IChTcGlubmVyKSBtQWN0aXZpdHkuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmRlbW8ubXlhY3Rpdml0eS5SLmlkLlNwaW5uZXIwMSk7CisKKyAgLi4uCisKKyAgcHVibGljIHZvaWQgYVRlc3QoKSB7CisgICAgICAvKgorICAgICAgICogcmVxdWVzdCBmb2N1cyBmb3IgdGhlIFNwaW5uZXIsIHNvIHRoYXQgdGhlIHRlc3QgY2FuIHNlbmQga2V5IGV2ZW50cyB0byBpdAorICAgICAgICogVGhpcyByZXF1ZXN0IG11c3QgYmUgcnVuIG9uIHRoZSBVSSB0aHJlYWQuIFRvIGRvIHRoaXMsIHVzZSB0aGUgcnVuT25VaVRocmVhZCBtZXRob2QKKyAgICAgICAqIGFuZCBwYXNzIGl0IGEgUnVubmFibGUgdGhhdCBjb250YWlucyBhIGNhbGwgdG8gcmVxdWVzdEZvY3VzIG9uIHRoZSBTcGlubmVyLgorICAgICAgICovCisgICAgICBtQWN0aXZpdHkucnVuT25VaVRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICBtU3Bpbm5lci5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgbUluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTsKKworICAgICAgdGhpcy5zZW5kS2V5cyhLZXlFdmVudC5LRVlDT0RFX0RQQURfQ0VOVEVSKTsKKzwvcHJlPgorCis8aDMgaWQ9Ik5vdG91Y2hNb2RlIj5UdXJuaW5nIG9mZiB0b3VjaCBtb2RlPC9oMz4KKzxwPgorICAgIFRvIGNvbnRyb2wgdGhlIGVtdWxhdG9yIG9yIGEgZGV2aWNlIHdpdGgga2V5IGV2ZW50cyB5b3Ugc2VuZCBmcm9tIHlvdXIgdGVzdHMsIHlvdSBtdXN0IHR1cm4gb2ZmCisgICAgdG91Y2ggbW9kZS4gSWYgeW91IGRvIG5vdCBkbyB0aGlzLCB0aGUga2V5IGV2ZW50cyBhcmUgaWdub3JlZC4KKzwvcD4KKzxwPgorICAgIFRvIHR1cm4gb2ZmIHRvdWNoIG1vZGUsIHlvdSBpbnZva2UKKyAgICA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+CisgICAgPGVtPmJlZm9yZTwvZW0+IHlvdSBjYWxsIDxjb2RlPmdldEFjdGl2aXR5KCk8L2NvZGU+IHRvIHN0YXJ0IHRoZSBhY3Rpdml0eS4gWW91IG11c3QgaW52b2tlIHRoZQorICAgIG1ldGhvZCBpbiBhIHRlc3QgbWV0aG9kIHRoYXQgaXMgPGVtPm5vdDwvZW0+IHJ1bm5pbmcgb24gdGhlIFVJIHRocmVhZC4gRm9yIHRoaXMgcmVhc29uLCB5b3UKKyAgICBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoCisgICAgPGNvZGU+QFVJVGhyZWFkPC9jb2RlPi4gSW5zdGVhZCwgaW52b2tlIHRoZSB0b3VjaCBtb2RlIG1ldGhvZCBmcm9tIDxjb2RlPnNldFVwKCk8L2NvZGU+LgorPC9wPgorPGgzIGlkPSJVbmxvY2tEZXZpY2UiPlVubG9ja2luZyB0aGUgZW11bGF0b3Igb3IgZGV2aWNlPC9oMz4KKzxwPgorICAgIFlvdSBtYXkgZmluZCB0aGF0IFVJIHRlc3RzIGRvbid0IHdvcmsgaWYgdGhlIGVtdWxhdG9yJ3Mgb3IgZGV2aWNlJ3MgaG9tZSBzY3JlZW4gaXMgZGlzYWJsZWQgd2l0aAorICAgIHRoZSBrZXlndWFyZCBwYXR0ZXJuLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQKKyAgICBieSA8Y29kZT5zZW5kS2V5cygpPC9jb2RlPi4gVGhlIGJlc3Qgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gc3RhcnQgeW91ciBlbXVsYXRvciBvciBkZXZpY2UKKyAgICBmaXJzdCBhbmQgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBmb3IgdGhlIGhvbWUgc2NyZWVuLgorPC9wPgorPHA+CisgICAgWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUga2V5Z3VhcmQuIFRvIGRvIHRoaXMsCisgICAgeW91IG5lZWQgdG8gYWRkIGEgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QgZmlsZSAoPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4pIGFuZAorICAgIHRoZW4gZGlzYWJsZSB0aGUga2V5Z3VhcmQgaW4geW91ciBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBOb3RlLCB0aG91Z2gsIHRoYXQgeW91IGVpdGhlciBoYXZlIHRvCisgICAgcmVtb3ZlIHRoaXMgYmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBoYXZlIHRvIGRpc2FibGUgaXQgd2l0aCBjb2RlIGluCisgICAgdGhlIHB1Ymxpc2hlZCBhcHBsaWNhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRvIGFkZCB0aGUgdGhlIHBlcm1pc3Npb24sIGFkZCB0aGUgZWxlbWVudAorICAgIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uRElTQUJMRV9LRVlHVUFSRCIvJmd0OzwvY29kZT4KKyAgICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZQorICAgIGZvbGxvd2luZyBjb2RlIHRvIHRoZSA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgYWN0aXZpdGllcyB5b3UgaW50ZW5kIHRvIHRlc3Q6Cis8L3A+Cis8cHJlPgorICBtS2V5R3VhcmRNYW5hZ2VyID0gKEtleWd1YXJkTWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShLRVlHVUFSRF9TRVJWSUNFKTsKKyAgbUxvY2sgPSBtS2V5R3VhcmRNYW5hZ2VyLm5ld0tleWd1YXJkTG9jaygiPGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+Iik7CisgIG1Mb2NrLmRpc2FibGVLZXlndWFyZCgpOworPC9wcmU+Cis8cD53aGVyZSA8Y29kZT48ZW0+YWN0aXZpdHlfY2xhc3NuYW1lPC9lbT48L2NvZGU+IGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhY3Rpdml0eS48L3A+Cis8aDMgaWQ9IlVJVGVzdFRyb3VibGVzaG9vdGluZyI+VHJvdWJsZXNob290aW5nIFVJIHRlc3RzPC9oMz4KKzxwPgorICAgIFRoaXMgc2VjdGlvbiBsaXN0cyBzb21lIG9mIHRoZSBjb21tb24gdGVzdCBmYWlsdXJlcyB5b3UgbWF5IGVuY291bnRlciBpbiBVSSB0ZXN0aW5nLCBhbmQgdGhlaXIKKyAgICBjYXVzZXM6Cis8L3A+Cis8ZGw+CisgICAgPGR0Pjxjb2RlPldyb25nVGhyZWFkRXhjZXB0aW9uPC9jb2RlPjwvZHQ+CisgICAgPGRkPgorICAgICAgPHA+PHN0cm9uZz5Qcm9ibGVtOjwvc3Ryb25nPjwvcD4KKyAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6CisgICAgICA8Y29kZT4KKyAgICAgICAgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbjogT25seSB0aGUgb3JpZ2luYWwgdGhyZWFkIHRoYXQgY3JlYXRlZAorICAgICAgICBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCisgICAgICA8L2NvZGU+CisgICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KKyAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSQorICAgICAgICB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndAorICAgICAgICB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZQorICAgICAgICB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCisgICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KKyAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUKKyAgICAgICAgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KKyAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KKyAgICA8L2RkPgorICAgIDxkdD48Y29kZT5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvY29kZT48L2R0PgorICAgIDxkZD4KKyAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+CisgICAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6CisgICAgICA8Y29kZT4KKyAgICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IFRoaXMgbWV0aG9kIGNhbiBub3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gYXBwbGljYXRpb24gdGhyZWFkCisgICAgICA8L2NvZGU+CisgICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KKyAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91ciB0ZXN0IG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aCA8Y29kZT5AVWlUaHJlYWRUZXN0PC9jb2RlPiBidXQKKyAgICAgICAgdGhlbiB0cmllcyB0byBkbyBzb21ldGhpbmcgb3V0c2lkZSB0aGUgVUkgdGhyZWFkIG9yIHRyaWVzIHRvIGludm9rZQorICAgICAgICA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+LgorICAgICAgPHA+PHN0cm9uZz5TdWdnZXN0ZWQgUmVzb2x1dGlvbjo8L3N0cm9uZz48L3A+CisgICAgICAgIFJlbW92ZSB0aGUgPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYW5ub3RhdGlvbiwgcmVtb3ZlIHRoZSA8Y29kZT5ydW5PblVpVGhyZWFkKCk8L2NvZGU+CisgICAgICAgIGNhbGwsIG9yIHJlLWZhY3RvciB5b3VyIHRlc3RzLgorICAgIDwvZGQ+Cis8L2RsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2I1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuamQKQEAgLTAsMCArMSwyMjQgQEAKK3BhZ2UudGl0bGU9Q29udGVudCBQcm92aWRlciBUZXN0aW5nCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgPGRpdiBpZD0icXYiPgorICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgIDxvbD4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNEZXNpZ25BbmRUZXN0Ij5Db250ZW50IFByb3ZpZGVyIERlc2lnbiBhbmQgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgIDxhIGhyZWY9IiNDb250ZW50UHJvdmlkZXJUZXN0QVBJIj5UaGUgQ29udGVudCBQcm92aWRlciBUZXN0aW5nIEFQSTwvYT4KKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNQcm92aWRlclRlc3RDYXNlMiI+UHJvdmlkZXJUZXN0Q2FzZTIgPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI01vY2tPYmplY3RzIj5Nb2NrIG9iamVjdCBjbGFzc2VzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgPC9vbD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1doYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI05leHRTdGVwcyI+TmV4dCBTdGVwczwvYT4KKyAgICA8L2xpPgorICA8L29sPgorICA8aDI+S2V5IENsYXNzZXM8L2gyPgorICAgIDxvbD4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn08L2xpPgorICAgIDwvb2w+CisgIDxoMj5TZWUgQWxzbzwvaDI+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YQorICAgICAgICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90b3BpY3MvdGVzdGluZ19hbmRyb2lkLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgRnVuZGFtZW50YWxzPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgIDwvbGk+CisgICAgICA8L29sPgorICA8L2Rpdj4KKzwvZGl2PgorPHA+CisgICAgQ29udGVudCBwcm92aWRlcnMsIHdoaWNoIHN0b3JlIGFuZCByZXRyaWV2ZSBkYXRhIGFuZCBtYWtlIGl0IGFjY2Vzc2libGUgYWNyb3NzIGFwcGxpY2F0aW9ucywKKyAgICBhcmUgYSBrZXkgcGFydCBvZiB0aGUgQW5kcm9pZCBBUEkuIEFzIGFuIGFwcGxpY2F0aW9uIGRldmVsb3BlciB5b3UncmUgYWxsb3dlZCB0byBwcm92aWRlIHlvdXIKKyAgICBvd24gcHVibGljIHByb3ZpZGVycyBmb3IgdXNlIGJ5IG90aGVyIGFwcGxpY2F0aW9ucy4gSWYgeW91IGRvLCB0aGVuIHlvdSBzaG91bGQgdGVzdCB0aGVtCisgICAgdXNpbmcgdGhlIEFQSSB5b3UgcHVibGlzaC4KKzwvcD4KKzxwPgorICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB0ZXN0IHB1YmxpYyBjb250ZW50IHByb3ZpZGVycywgYWx0aG91Z2ggdGhlIGluZm9ybWF0aW9uIGlzCisgICAgYWxzbyBhcHBsaWNhYmxlIHRvIHByb3ZpZGVycyB0aGF0IHlvdSBrZWVwIHByaXZhdGUgdG8geW91ciBvd24gYXBwbGljYXRpb24uIElmIHlvdSBhcmVuJ3QKKyAgICBmYW1pbGlhciB3aXRoIGNvbnRlbnQgIHByb3ZpZGVycyBvciB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Byb3ZpZGVycy9jb250ZW50LXByb3ZpZGVycy5odG1sIj5Db250ZW50IFByb3ZpZGVyczwvYT4sCisgICAgdGhlIGd1aWRlIHRvIGRldmVsb3BpbmcgY29udGVudCBwcm92aWRlcnMsIGFuZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIEFuZHJvaWQgdGVzdGluZyBhbmQgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4KKzwvcD4KKzxoMiBpZD0iRGVzaWduQW5kVGVzdCI+Q29udGVudCBQcm92aWRlciBEZXNpZ24gYW5kIFRlc3Rpbmc8L2gyPgorPHA+CisgICAgSW4gQW5kcm9pZCwgY29udGVudCBwcm92aWRlcnMgYXJlIHZpZXdlZCBleHRlcm5hbGx5IGFzIGRhdGEgQVBJcyB0aGF0IHByb3ZpZGUKKyAgICB0YWJsZXMgb2YgZGF0YSwgd2l0aCB0aGVpciBpbnRlcm5hbHMgaGlkZGVuIGZyb20gdmlldy4gQSBjb250ZW50IHByb3ZpZGVyIG1heSBoYXZlIG1hbnkKKyAgICBwdWJsaWMgY29uc3RhbnRzLCBidXQgaXQgdXN1YWxseSBoYXMgZmV3IGlmIGFueSBwdWJsaWMgbWV0aG9kcyBhbmQgbm8gcHVibGljIHZhcmlhYmxlcy4KKyAgICBUaGlzIHN1Z2dlc3RzIHRoYXQgeW91IHNob3VsZCB3cml0ZSB5b3VyIHRlc3RzIGJhc2VkIG9ubHkgb24gdGhlIHByb3ZpZGVyJ3MgcHVibGljIG1lbWJlcnMuCisgICAgQSBjb250ZW50IHByb3ZpZGVyIHRoYXQgaXMgZGVzaWduZWQgbGlrZSB0aGlzIGlzIG9mZmVyaW5nIGEgY29udHJhY3QgYmV0d2VlbiBpdHNlbGYgYW5kIGl0cworICAgIHVzZXJzLgorPC9wPgorPHA+CisgICAgVGhlIGJhc2UgdGVzdCBjYXNlIGNsYXNzIGZvciBjb250ZW50IHByb3ZpZGVycywKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSwgYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgY29udGVudCBwcm92aWRlciBpbiBhbgorICAgIGlzb2xhdGVkIGVudmlyb25tZW50LiBBbmRyb2lkIG1vY2sgb2JqZWN0cyBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBhbmQKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gYWxzbyBoZWxwIHByb3ZpZGUgYW4gaXNvbGF0ZWQgdGVzdCBlbnZpcm9ubWVudC4KKzwvcD4KKzxwPgorICAgIEFzIHdpdGggb3RoZXIgQW5kcm9pZCB0ZXN0cywgcHJvdmlkZXIgdGVzdCBwYWNrYWdlcyBhcmUgcnVuIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSB0ZXN0CisgICAgcnVubmVyIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0uIFRoZSBzZWN0aW9uCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPgorICAgIFJ1bm5pbmcgVGVzdHMgV2l0aCBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9hPiBkZXNjcmliZXMgdGhlIHRlc3QgcnVubmVyIGluCisgICAgbW9yZSBkZXRhaWwuIFRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBzaG93cyB5b3UgaG93IHRvIHJ1biBhIHRlc3QgcGFja2FnZSBpbiBFY2xpcHNlLCBhbmQgdGhlCisgICAgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KKyAgICBzaG93cyB5b3UgaG93IHRvIHJ1biBhIHRlc3QgcGFja2FnZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCis8L3A+Cis8aDIgaWQ9IkNvbnRlbnRQcm92aWRlclRlc3RBUEkiPkNvbnRlbnQgUHJvdmlkZXIgVGVzdGluZyBBUEk8L2gyPgorPHA+CisgICAgVGhlIG1haW4gZm9jdXMgb2YgdGhlIHByb3ZpZGVyIHRlc3RpbmcgQVBJIGlzIHRvIHByb3ZpZGUgYW4gaXNvbGF0ZWQgdGVzdGluZyBlbnZpcm9ubWVudC4gVGhpcworICAgIGVuc3VyZXMgdGhhdCB0ZXN0cyBhbHdheXMgcnVuIGFnYWluc3QgZGF0YSBkZXBlbmRlbmNpZXMgc2V0IGV4cGxpY2l0bHkgaW4gdGhlIHRlc3QgY2FzZS4gSXQKKyAgICBhbHNvIHByZXZlbnRzIHRlc3RzIGZyb20gbW9kaWZ5aW5nIGFjdHVhbCB1c2VyIGRhdGEuIEZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBhdm9pZCB3cml0aW5nCisgICAgYSB0ZXN0IHRoYXQgZmFpbHMgYmVjYXVzZSB0aGVyZSB3YXMgZGF0YSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIHRlc3QsIGFuZCB5b3Ugd2FudCB0bworICAgIGF2b2lkIGFkZGluZyBvciBkZWxldGluZyBjb250YWN0IGluZm9ybWF0aW9uIGluIGEgYWN0dWFsIHByb3ZpZGVyLgorPC9wPgorPHA+CisgICAgVGhlIHRlc3QgY2FzZSBjbGFzcyBhbmQgbW9jayBvYmplY3QgY2xhc3NlcyBmb3IgcHJvdmlkZXIgdGVzdGluZyBzZXQgdXAgdGhpcyBpc29sYXRlZCB0ZXN0aW5nCisgICAgZW52aXJvbm1lbnQgZm9yIHlvdS4KKzwvcD4KKzxoMyBpZD0iUHJvdmlkZXJUZXN0Q2FzZTIiPlByb3ZpZGVyVGVzdENhc2UyPC9oMz4KKzxwPgorICAgIFlvdSB0ZXN0IGEgcHJvdmlkZXIgd2l0aCBhIHN1YmNsYXNzIG9mIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9LiBUaGlzIGJhc2UgY2xhc3MKKyAgICBleHRlbmRzIHtAbGluayBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlfSwgc28gaXQgcHJvdmlkZXMgdGhlIEpVbml0IHRlc3RpbmcgZnJhbWV3b3JrIGFzIHdlbGwKKyAgICBhcyBBbmRyb2lkLXNwZWNpZmljIG1ldGhvZHMgZm9yIHRlc3RpbmcgYXBwbGljYXRpb24gcGVybWlzc2lvbnMuIFRoZSBtb3N0IGltcG9ydGFudAorICAgIGZlYXR1cmUgb2YgdGhpcyBjbGFzcyBpcyBpdHMgaW5pdGlhbGl6YXRpb24sIHdoaWNoIGNyZWF0ZXMgdGhlIGlzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnQuCis8L3A+Cis8cD4KKyAgICBUaGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUgY29uc3RydWN0b3IgZm9yIHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9LCB3aGljaAorICAgIHN1YmNsYXNzZXMgY2FsbCBpbiB0aGVpciBvd24gY29uc3RydWN0b3JzLiBUaGUge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0KKyAgICBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBvYmplY3QgdGhhdCBhbGxvd3MgZmlsZSBhbmQKKyAgICBkYXRhYmFzZSBvcGVyYXRpb25zIGJ1dCBzdHVicyBvdXQgb3RoZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIEFuZHJvaWQgc3lzdGVtLgorICAgIFRoZSBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHRoZW1zZWx2ZXMgdGFrZSBwbGFjZSBpbiBhIGRpcmVjdG9yeSB0aGF0IGlzIGxvY2FsIHRvIHRoZQorICAgIGRldmljZSBvciBlbXVsYXRvciBhbmQgaGFzIGEgc3BlY2lhbCBwcmVmaXguCis8L3A+Cis8cD4KKyAgICBUaGUgY29uc3RydWN0b3IgdGhlbiBjcmVhdGVzIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IHRvIHVzZSBhcyB0aGUKKyAgICByZXNvbHZlciBmb3IgdGhlIHRlc3QuIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gY2xhc3MgaXMgZGVzY3JpYmVkIGluCisgICAgZGV0YWlsIGluIHRoZSBzZWN0aW9uCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RfYW5kcm9pZCNNb2NrT2JqZWN0Q2xhc3NlcyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4uCis8L3A+Cis8cD4KKyAgICBMYXN0bHksIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LiBUaGlzIGlzIGEgbm9ybWFsCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9IG9iamVjdCwgYnV0IGl0IHRha2VzIGFsbCBvZiBpdHMgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24KKyAgICBmcm9tIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0sIHNvIGl0IGlzIHJlc3RyaWN0ZWQgdG8KKyAgICB3b3JraW5nIGluIHRoZSBpc29sYXRlZCB0ZXN0IGVudmlyb25tZW50LiBBbGwgb2YgdGhlIHRlc3RzIGRvbmUgaW4gdGhlIHRlc3QgY2FzZSBjbGFzcyBydW4KKyAgICBhZ2FpbnN0IHRoaXMgaXNvbGF0ZWQgb2JqZWN0LgorPC9wPgorPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Cis8cD4KKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlByb3ZpZGVyVGVzdENhc2UyfSB1c2VzIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBhbmQKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0sIHdoaWNoIGFyZSBzdGFuZGFyZCBtb2NrIG9iamVjdCBjbGFzc2VzLiBUbworICAgIGxlYXJuIG1vcmUgYWJvdXQgdGhlbSwgcGxlYXNlIHJlYWQKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdF9hbmRyb2lkI01vY2tPYmplY3RDbGFzc2VzIj4KKyAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCis8L3A+Cis8aDIgaWQ9IldoYXRUb1Rlc3QiPldoYXQgVG8gVGVzdDwvaDI+Cis8cD4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgbGlzdHMgZ2VuZXJhbCBjb25zaWRlcmF0aW9ucyBmb3IgdGVzdGluZyBBbmRyb2lkIGNvbXBvbmVudHMuCisgICAgSGVyZSBhcmUgc29tZSBzcGVjaWZpYyBndWlkZWxpbmVzIGZvciB0ZXN0aW5nIGNvbnRlbnQgcHJvdmlkZXJzLgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCB3aXRoIHJlc29sdmVyIG1ldGhvZHM6IEV2ZW4gdGhvdWdoIHlvdSBjYW4gaW5zdGFudGlhdGUgYSBwcm92aWRlciBvYmplY3QgaW4KKyAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0sIHlvdSBzaG91bGQgYWx3YXlzIHRlc3Qgd2l0aCBhIHJlc29sdmVyIG9iamVjdAorICAgICAgICB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVVJJLiBUaGlzIGVuc3VyZXMgdGhhdCB5b3UgYXJlIHRlc3RpbmcgdGhlIHByb3ZpZGVyIHVzaW5nIHRoZSBzYW1lCisgICAgICAgIGludGVyYWN0aW9uIHRoYXQgYSByZWd1bGFyIGFwcGxpY2F0aW9uIHdvdWxkIHVzZS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCBhIHB1YmxpYyBwcm92aWRlciBhcyBhIGNvbnRyYWN0OiBJZiB5b3UgaW50ZW50IHlvdXIgcHJvdmlkZXIgdG8gYmUgcHVibGljIGFuZAorICAgICAgICBhdmFpbGFibGUgdG8gb3RoZXIgYXBwbGljYXRpb25zLCB5b3Ugc2hvdWxkIHRlc3QgaXQgYXMgYSBjb250cmFjdC4gVGhpcyBpbmNsdWRlcworICAgICAgICB0aGUgZm9sbG93aW5nIGlkZWFzOgorICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgVGVzdCB3aXRoIGNvbnN0YW50cyB0aGF0IHlvdXIgcHJvdmlkZXIgcHVibGljbHkgZXhwb3Nlcy4gRm9yCisgICAgICAgICAgICAgICAgZXhhbXBsZSwgbG9vayBmb3IgY29uc3RhbnRzIHRoYXQgcmVmZXIgdG8gY29sdW1uIG5hbWVzIGluIG9uZSBvZiB0aGUgcHJvdmlkZXIncworICAgICAgICAgICAgICAgIGRhdGEgdGFibGVzLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIGNvbnN0YW50cyBwdWJsaWNseSBkZWZpbmVkIGJ5IHRoZSBwcm92aWRlci4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgVGVzdCBhbGwgdGhlIFVSSXMgb2ZmZXJlZCBieSB5b3VyIHByb3ZpZGVyLiBZb3VyIHByb3ZpZGVyIG1heSBvZmZlciBzZXZlcmFsIFVSSXMsCisgICAgICAgICAgICAgICAgZWFjaCBvbmUgcmVmZXJyaW5nIHRvIGEgZGlmZmVyZW50IGFzcGVjdCBvZiB0aGUgZGF0YS4gVGhlCisgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCI+Tm90ZSBQYWQ8L2E+IHNhbXBsZSwKKyAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSwgZmVhdHVyZXMgYSBwcm92aWRlciB0aGF0IG9mZmVycyBvbmUgVVJJIGZvciByZXRyaWV2aW5nIGEgbGlzdCBvZiBub3RlcywKKyAgICAgICAgICAgICAgICBhbm90aGVyIGZvciByZXRyaWV2aW5nIGFuIGluZGl2aWR1YWwgbm90ZSBieSBpdCdzIGRhdGFiYXNlIElELCBhbmQgYSB0aGlyZCBmb3IKKyAgICAgICAgICAgICAgICBkaXNwbGF5aW5nIG5vdGVzIGluIGEgbGl2ZSBmb2xkZXIuIFRoZSBzYW1wbGUgdGVzdCBwYWNrYWdlIGZvciBOb3RlIFBhZCwKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvTm90ZVBhZFRlc3QvaW5kZXguaHRtbCI+IE5vdGUgUGFkIFRlc3Q8L2E+LCBoYXMKKyAgICAgICAgICAgICAgICB1bml0IHRlc3RzIGZvciB0d28gb2YgdGhlc2UgVVJJcy4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgICAgICA8bGk+CisgICAgICAgICAgICAgICAgVGVzdCBpbnZhbGlkIFVSSXM6IFlvdXIgdW5pdCB0ZXN0cyBzaG91bGQgZGVsaWJlcmF0ZWx5IGNhbGwgdGhlIHByb3ZpZGVyIHdpdGggYW4KKyAgICAgICAgICAgICAgICBpbnZhbGlkIFVSSSwgYW5kIGxvb2sgZm9yIGVycm9ycy4gR29vZCBwcm92aWRlciBkZXNpZ24gaXMgdG8gdGhyb3cgYW4KKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZm9yIGludmFsaWQgVVJJcy4KKworICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGVzdCB0aGUgc3RhbmRhcmQgcHJvdmlkZXIgaW50ZXJhY3Rpb25zOiBNb3N0IHByb3ZpZGVycyBvZmZlciBzaXggYWNjZXNzIG1ldGhvZHM6CisgICAgICAgIHF1ZXJ5LCBpbnNlcnQsIGRlbGV0ZSwgdXBkYXRlLCBnZXRUeXBlLCBhbmQgb25DcmVhdGUoKS4gWW91ciB0ZXN0cyBzaG91bGQgdmVyaWZ5IHRoYXQgYWxsCisgICAgICAgIG9mIHRoZXNlIG1ldGhvZHMgd29yay4gVGhlc2UgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiB0aGUgdG9waWMKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9wcm92aWRlcnMvY29udGVudC1wcm92aWRlcnMuaHRtbCI+Q29udGVudCBQcm92aWRlcnM8L2E+LgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IGJ1c2luZXNzIGxvZ2ljOiBEb24ndCBmb3JnZXQgdG8gdGVzdCB0aGUgYnVzaW5lc3MgbG9naWMgdGhhdCB5b3VyIHByb3ZpZGVyIHNob3VsZAorICAgICAgICBlbmZvcmNlLiBCdXNpbmVzcyBsb2dpYyBpbmNsdWRlcyBoYW5kbGluZyBvZiBpbnZhbGlkIHZhbHVlcywgZmluYW5jaWFsIG9yIGFyaXRobWV0aWMKKyAgICAgICAgY2FsY3VsYXRpb25zLCBlbGltaW5hdGlvbiBvciBjb21iaW5pbmcgb2YgZHVwbGljYXRlcywgYW5kIHNvIGZvcnRoLiBBIGNvbnRlbnQgcHJvdmlkZXIKKyAgICAgICAgZG9lcyBub3QgaGF2ZSB0byBoYXZlIGJ1c2luZXNzIGxvZ2ljLCBiZWNhdXNlIGl0IG1heSBiZSBpbXBsZW1lbnRlZCBieSBhY3Rpdml0aWVzIHRoYXQKKyAgICAgICAgbW9kaWZ5IHRoZSBkYXRhLiBJZiB0aGUgcHJvdmlkZXIgZG9lcyBpbXBsZW1lbnQgYnVzaW5lc3MgbG9naWMsIHlvdSBzaG91bGQgdGVzdCBpdC4KKyAgICA8L2xpPgorPC91bD4KKzxoMiBpZD0iTmV4dFN0ZXBzIj5OZXh0IFN0ZXBzPC9oMj4KKzxwPgorICAgIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKKyAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluCisgICAgRWNsaXBzZSwgd2l0aCBBRFQ8L2E+LiBJZiB5b3UncmUgbm90IHdvcmtpbmcgaW4gRWNsaXBzZSwgcmVmZXIgdG8gPGEKKyAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgorICAgIElERXM8L2E+LgorPC9wPgorPHA+CisgICAgSWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIHRlc3RpbmcgYWN0aXZpdGllcywgdHJ5IG9uZSBvZiB0aGUKKyAgICB0ZXN0aW5nIHR1dG9yaWFsczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIFRoZSA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPkhlbGxvLAorICAgICAgICBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCisgICAgICAgIGNvbnRleHQgb2YgdGhlIEhlbGxvLCBXb3JsZCBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eQorICAgICAgICBUZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KKyAgICAgICAgSXQgZ3VpZGVzIHlvdSB0aHJvdWdoIGEgbW9yZSBjb21wbGV4IHRlc3Rpbmcgc2NlbmFyaW8gdGhhdCB5b3UgZGV2ZWxvcCBhZ2FpbnN0IGEKKyAgICAgICAgbW9yZSByZWFsaXN0aWMgYWN0aXZpdHktb3JpZW50ZWQgYXBwbGljYXRpb24uCisgICAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvaW5kZXguamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlZDVhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy9pbmRleC5qZApAQCAtMCwwICsxLDgwIEBACitwYWdlLnRpdGxlPVRlc3RpbmcKK0BqZDpib2R5Cis8cD4KKyAgICBUaGUgQW5kcm9pZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBpbmNsdWRlcyBhbiBpbnRlZ3JhdGVkIHRlc3RpbmcgZnJhbWV3b3JrIHRoYXQgaGVscHMgeW91CisgICAgdGVzdCBhbGwgYXNwZWN0cyBvZiB5b3VyIGFwcGxpY2F0aW9uLgorPC9wPgorPGg0PkZ1bmRhbWVudGFsczwvaDQ+Cis8cD4KKyAgICBUbyBzdGFydCBsZWFybmluZyBob3cgdG8gdXNlIHRoZSBmcmFtZXdvcmsgdG8gY3JlYXRlIHRlc3RzIGZvciB5b3VyIGFwcGxpY2F0aW9ucywgcGxlYXNlCisgICAgcmVhZCB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sIj4KKyAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCis8L3A+Cis8aDQ+Q29uY2VwdHM8L2g0PgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgVGVzdGluZyBUb29scyBkZXNjcmliZXMgdGhlIEVjbGlwc2Ugd2l0aCBBRFQgYW5kIGNvbW1hbmQtbGluZSB0b29scyB5b3UgdXNlIHRvIHRlc3QKKyAgICAgICAgQW5kcm9pZCBhcHBsaWNhdGlvbnMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFdoYXQgdG8gVGVzdCBpcyBhbiBvdmVydmlldyBvZiB0aGUgdHlwZXMgb2YgdGVzdGluZyB5b3Ugc2hvdWxkIGRvLiBJdCBmb2N1c2VzIG9uIHRlc3RpbmcKKyAgICAgICAgc3lzdGVtLXdpZGUgYXNwZWN0cyBvZiBBbmRyb2lkIHRoYXQgY2FuIGFmZmVjdCBldmVyeSBjb21wb25lbnQgaW4geW91ciBhcHBsaWNhdGlvbi4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+CisgICAgICAgIEFjdGl2aXR5IFRlc3Rpbmc8L2E+IGZvY3VzZXMgb24gdGVzdGluZyBhY3Rpdml0aWVzLiBJdCBkZXNjcmliZXMgaG93IGluc3RydW1lbnRhdGlvbiBhbGxvd3MKKyAgICAgICAgeW91IHRvIGNvbnRyb2wgYWN0aXZpdGllcyBvdXRzaWRlIHRoZSBub3JtYWwgYXBwbGljYXRpb24gbGlmZWN5Y2xlLiBJdCBhbHNvIGxpc3RzCisgICAgICAgIGFjdGl2aXR5LXNwZWNpZmljIGZlYXR1cmVzIHlvdSBzaG91bGQgdGVzdCwgYW5kIGl0IHByb3ZpZGVzIHRpcHMgZm9yIHRlc3RpbmcgQW5kcm9pZAorICAgICAgICB1c2VyIGludGVyZmFjZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9jb250ZW50cHJvdmlkZXJfdGVzdGluZy5odG1sIj4KKyAgICAgICAgQ29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPiBmb2N1c2VzIG9uIHRlc3RpbmcgY29udGVudCBwcm92aWRlcnMuIEl0IGRlc2NyaWJlcyB0aGUKKyAgICAgICAgbW9jayBzeXN0ZW0gb2JqZWN0cyB5b3UgY2FuIHVzZSwgcHJvdmlkZXMgdGlwcyBmb3IgZGVzaWduaW5nIHByb3ZpZGVycyBzbyB0aGF0IHRoZXkKKyAgICAgICAgY2FuIGJlIHRlc3RlZCwgYW5kIGxpc3RzIHByb3ZpZGVyLXNwZWNpZmljIGZlYXR1cmVzIHlvdSBzaG91bGQgdGVzdC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5odG1sIj4KKyAgICAgICAgU2VydmljZSBUZXN0aW5nPC9hPiBmb2N1c2VzIG9uIHRlc3Rpbmcgc2VydmljZXMuIEl0IGFsc28gbGlzdHMgc2VydmljZS1zcGVjaWZpYyBmZWF0dXJlcworICAgICAgICB5b3Ugc2hvdWxkIHRlc3QuCisgICAgPC9saT4KKzwvdWw+Cis8aDQ+UHJvY2VkdXJlczwvaDQ+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgIFRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+IGRlc2NyaWJlcyBob3cgdG8gY3JlYXRlIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSB3aXRoIEFEVC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIHRvcGljIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICAgICAgVGVzdGluZyBpbiBvdGhlciBJREVzPC9hPiBkZXNjcmliZXMgaG93IHRvIGNyZWF0ZSBhbmQgcnVuIHRlc3RzIHdpdGggY29tbWFuZC1saW5lIHRvb2xzLgorICAgIDwvbGk+Cis8L3VsPgorPGg0PlR1dG9yaWFsczwvaDQ+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBUaGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KKyAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgRm9yIGEgbW9yZSBhZHZhbmNlZCB0dXRvcmlhbCwgdHJ5CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPiwKKyAgICAgICAgd2hpY2ggZ3VpZGVzIHlvdSB0aHJvdWdoIGEgbW9yZSBjb21wbGV4IHRlc3Rpbmcgc2NlbmFyaW8uCisgICAgPC9saT4KKzwvdWw+Cis8aDQ+U2FtcGxlczwvaDQ+Cis8dWw+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvTm90ZVBhZFRlc3QuaHRtbCI+Tm90ZSBQYWQgUHJvdmlkZXIKKyAgICAgICAgVGVzdDwvYT4gaXMgYSB0ZXN0IHBhY2thZ2UgZm9yIHRoZQorICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvTm90ZVBhZC5odG1sIj5Ob3RlIFBhZDwvYT4gc2FtcGxlCisgICAgICAgIGFwcGxpY2F0aW9uLiBJdCBwcm92aWRlcyBhIHNpbXBsZSBleGFtcGxlIG9mIHVuaXQgdGVzdGluZworICAgICAgICBhIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfS4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9BbGFybVNlcnZpY2VUZXN0Lmh0bWwiPkFsYXJtIFNlcnZpY2UgVGVzdDwvYT4KKyAgICAgICAgaXMgYSB0ZXN0IHBhY2thZ2UgZm9yIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQWxhcm0uaHRtbCI+QWxhcm08L2E+CisgICAgICAgIHNhbXBsZSBhcHBsaWNhdGlvbi4gSXQgcHJvdmlkZXMgYSBzaW1wbGUgZXhhbXBsZSBvZiB1bml0CisgICAgICAgIHRlc3RpbmcgYSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uCisgICAgPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvc2VydmljZV90ZXN0aW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTc5ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3NlcnZpY2VfdGVzdGluZy5qZApAQCAtMCwwICsxLDE3OCBAQAorcGFnZS50aXRsZT1TZXJ2aWNlIFRlc3RpbmcKK0BqZDpib2R5CisKKzxkaXYgaWQ9InF2LXdyYXBwZXIiPgorICA8ZGl2IGlkPSJxdiI+CisgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKyAgPG9sPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI0Rlc2lnbkFuZFRlc3QiPlNlcnZpY2UgRGVzaWduIGFuZCBUZXN0aW5nPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjU2VydmljZVRlc3RDYXNlIj5TZXJ2aWNlVGVzdENhc2U8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0iI1Rlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9hPgorICAgIDwvbGk+CisgIDwvb2w+CisgIDxoMj5LZXkgQ2xhc3NlczwvaDI+CisgICAgPG9sPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfTwvbGk+CisgICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH08L2xpPgorICAgIDwvb2w+CisgIDxoMj5SZWxhdGVkIFR1dG9yaWFsczwvaDI+CisgICAgPG9sPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgorICAgICAgICA8L2xpPgorICAgIDwvb2w+CisgIDxoMj5TZWUgQWxzbzwvaDI+CisgICAgICA8b2w+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj4KKyAgICAgICAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgIDwvZGl2PgorPC9kaXY+Cis8cD4KKyAgICBBbmRyb2lkIHByb3ZpZGVzIGEgdGVzdGluZyBmcmFtZXdvcmsgZm9yIFNlcnZpY2Ugb2JqZWN0cyB0aGF0IGNhbiBydW4gdGhlbSBpbgorICAgIGlzb2xhdGlvbiBhbmQgcHJvdmlkZXMgbW9jayBvYmplY3RzLiBUaGUgdGVzdCBjYXNlIGNsYXNzIGZvciBTZXJ2aWNlIG9iamVjdHMgaXMKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0uIFNpbmNlIHRoZSBTZXJ2aWNlIGNsYXNzIGFzc3VtZXMgdGhhdCBpdCBpcyBzZXBhcmF0ZQorICAgIGZyb20gaXRzIGNsaWVudHMsIHlvdSBjYW4gdGVzdCBhIFNlcnZpY2Ugb2JqZWN0IHdpdGhvdXQgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLgorPC9wPgorPHA+CisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGVjaG5pcXVlcyBmb3IgdGVzdGluZyBTZXJ2aWNlIG9iamVjdHMuIElmIHlvdSBhcmVuJ3QgZmFtaWxpYXIgd2l0aCB0aGUKKyAgICBTZXJ2aWNlIGNsYXNzLCBwbGVhc2UgcmVhZCA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5odG1sIj4KKyAgICBBcHBsaWNhdGlvbiBGdW5kYW1lbnRhbHM8L2E+LiBJZiB5b3UgYXJlbid0IGZhbWlsaWFyIHdpdGggQW5kcm9pZCB0ZXN0aW5nLCBwbGVhc2UgcmVhZAorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuaHRtbCI+VGVzdGluZyBGdW5kYW1lbnRhbHM8L2E+LAorICAgIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIEFuZHJvaWQgdGVzdGluZyBhbmQgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4KKzwvcD4KKzxoMiBpZD0iRGVzaWduQW5kVGVzdCI+U2VydmljZSBEZXNpZ24gYW5kIFRlc3Rpbmc8L2gyPgorPHA+CisgICAgV2hlbiB5b3UgZGVzaWduIGEgU2VydmljZSwgeW91IHNob3VsZCBjb25zaWRlciBob3cgeW91ciB0ZXN0cyBjYW4gZXhhbWluZSB0aGUgdmFyaW91cyBzdGF0ZXMKKyAgICBvZiB0aGUgU2VydmljZSBsaWZlY3ljbGUuIElmIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyB0aGF0IHN0YXJ0IHVwIHlvdXIgU2VydmljZSwgc3VjaCBhcworICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uQ3JlYXRlKCkgb25DcmVhdGUoKX0gb3IKKyAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvblN0YXJ0Q29tbWFuZChJbnRlbnQsIGludCwgaW50KSBvblN0YXJ0Q29tbWFuZCgpfSBkbyBub3Qgbm9ybWFsbHkKKyAgICBzZXQgYSBnbG9iYWwgdmFyaWFibGUgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IHdlcmUgc3VjY2Vzc2Z1bCwgeW91IG1heSB3YW50IHRvIHByb3ZpZGUgc3VjaCBhCisgICAgdmFyaWFibGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCis8L3A+Cis8cD4KKyAgICBNb3N0IG90aGVyIHRlc3RpbmcgaXMgZmFjaWxpdGF0ZWQgYnkgdGhlIG1ldGhvZHMgaW4gdGhlIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfQorICAgIHRlc3QgY2FzZSBjbGFzcy4gRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZSNnZXRTZXJ2aWNlKCl9IG1ldGhvZAorICAgIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIFNlcnZpY2UgdW5kZXIgdGVzdCwgd2hpY2ggeW91IGNhbiB0ZXN0IHRvIGNvbmZpcm0gdGhhdCB0aGUgU2VydmljZSBpcworICAgIHJ1bm5pbmcgZXZlbiBhdCB0aGUgZW5kIG9mIHlvdXIgdGVzdHMuCis8L3A+Cis8aDIgaWQ9IlNlcnZpY2VUZXN0Q2FzZSI+U2VydmljZVRlc3RDYXNlPC9oMj4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfSBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlfSBjbGFzcworICAgIHdpdGggd2l0aCBtZXRob2RzIGZvciB0ZXN0aW5nIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zIGFuZCBmb3IgY29udHJvbGxpbmcgdGhlIGFwcGxpY2F0aW9uIGFuZAorICAgIFNlcnZpY2UgdW5kZXIgdGVzdC4gSXQgYWxzbyBwcm92aWRlcyBtb2NrIGFwcGxpY2F0aW9uIGFuZCBDb250ZXh0IG9iamVjdHMgdGhhdCBpc29sYXRlIHlvdXIKKyAgICB0ZXN0IGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKzwvcD4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfSBkZWZlcnMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgdW50aWwgeW91CisgICAgY2FsbCB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZSNzdGFydFNlcnZpY2UoSW50ZW50KSBTZXJ2aWNlVGVzdENhc2Uuc3RhcnRTZXJ2aWNlKCl9IG9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UjYmluZFNlcnZpY2UoSW50ZW50KSBTZXJ2aWNlVGVzdENhc2UuYmluZFNlcnZpY2UoKX0uIFRoaXMKKyAgICBhbGxvd3MgeW91IHRvIHNldCB1cCB5b3VyIHRlc3QgZW52aXJvbm1lbnQsIHBhcnRpY3VsYXJseSB5b3VyIG1vY2sgb2JqZWN0cywgYmVmb3JlIHRoZSBTZXJ2aWNlCisgICAgaXMgc3RhcnRlZC4KKzwvcD4KKzxwPgorICAgIE5vdGljZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIHRvIDxjb2RlPlNlcnZpY2VUZXN0Q2FzZS5iaW5kU2VydmljZSgpPC9jb2RlPmFyZSBkaWZmZXJlbnQgZnJvbQorICAgIHRob3NlIGZvciA8Y29kZT5TZXJ2aWNlLmJpbmRTZXJ2aWNlKCk8L2NvZGU+LiBGb3IgdGhlIDxjb2RlPlNlcnZpY2VUZXN0Q2FzZTwvY29kZT4gdmVyc2lvbiwKKyAgICB5b3Ugb25seSBwcm92aWRlIGFuIEludGVudC4gSW5zdGVhZCBvZiByZXR1cm5pbmcgYSBib29sZWFuLAorICAgIDxjb2RlPlNlcnZpY2VUZXN0Q2FzZS5iaW5kU2VydmljZSgpPC9jb2RlPiByZXR1cm5zIGFuIG9iamVjdCB0aGF0IHN1YmNsYXNzZXMKKyAgICB7QGxpbmsgYW5kcm9pZC5vcy5JQmluZGVyfS4KKzwvcD4KKzxwPgorICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZSNzZXRVcCgpfSBtZXRob2QgZm9yIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfQorICAgIGlzIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0LiBJdCBzZXRzIHVwIHRoZSB0ZXN0IGZpeHR1cmUgYnkgbWFraW5nIGEgY29weSBvZiB0aGUgY3VycmVudCBzeXN0ZW0KKyAgICBDb250ZXh0IGJlZm9yZSBhbnkgdGVzdCBtZXRob2RzIHRvdWNoIGl0LiBZb3UgY2FuIHJldHJpZXZlIHRoaXMgQ29udGV4dCBieSBjYWxsaW5nCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2UjZ2V0U3lzdGVtQ29udGV4dCgpfS4gSWYgeW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3UgbXVzdAorICAgIGNhbGwgPGNvZGU+c3VwZXIuc2V0VXAoKTwvY29kZT4gYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgb3ZlcnJpZGUuCis8L3A+Cis8cD4KKyAgICBUaGUgbWV0aG9kcyB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZSNzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbikgc2V0QXBwbGljYXRpb24oKX0KKyAgICBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KX0gc2V0Q29udGV4dCgpfSBhbGxvdyB5b3UgdG8gc2V0CisgICAgYSBtb2NrIENvbnRleHQgb3IgbW9jayBBcHBsaWNhdGlvbiAob3IgYm90aCkgZm9yIHRoZSBTZXJ2aWNlLCBiZWZvcmUgeW91IHN0YXJ0IGl0LiBUaGVzZSBtb2NrCisgICAgb2JqZWN0cyBhcmUgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4uCis8L3A+Cis8cD4KKyAgICBCeSBkZWZhdWx0LCB7QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX0gcnVucyB0aGUgdGVzdCBtZXRob2QKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZSN0ZXN0QW5kcm9pZFRlc3RDYXNlU2V0dXBQcm9wZXJseSgpfSwgd2hpY2ggYXNzZXJ0cyB0aGF0CisgICAgdGhlIGJhc2UgdGVzdCBjYXNlIGNsYXNzIHN1Y2Nlc3NmdWxseSBzZXQgdXAgYSBDb250ZXh0IGJlZm9yZSBydW5uaW5nLgorPC9wPgorPGgyIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDI+Cis8cD4KKyAgICA8Y29kZT5TZXJ2aWNlVGVzdENhc2U8L2NvZGU+IGFzc3VtZXMgdGhhdCB5b3Ugd2lsbCB1c2UgYSBtb2NrIENvbnRleHQgb3IgbW9jayBBcHBsaWNhdGlvbgorICAgIChvciBib3RoKSBmb3IgdGhlIHRlc3QgZW52aXJvbm1lbnQuIFRoZXNlIG9iamVjdHMgaXNvbGF0ZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBmcm9tIHRoZQorICAgIHJlc3Qgb2YgdGhlIHN5c3RlbS4gSWYgeW91IGRvbid0IHByb3ZpZGUgeW91ciBvd24gaW5zdGFuY2VzIG9mIHRoZXNlIG9iamVjdHMgYmVmb3JlIHlvdQorICAgIHN0YXJ0IHRoZSBTZXJ2aWNlLCB0aGVuIHtAbGluayBhbmRyb2lkLnRlc3QuU2VydmljZVRlc3RDYXNlfSB3aWxsIGNyZWF0ZSBpdHMgb3duIGludGVybmFsCisgICAgaW5zdGFuY2VzIGFuZCBpbmplY3QgdGhlbSBpbnRvIHRoZSBTZXJ2aWNlLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgYnkgY3JlYXRpbmcgYW5kCisgICAgaW5qZWN0aW5nIHlvdXIgb3duIGluc3RhbmNlcyBiZWZvcmUgc3RhcnRpbmcgdGhlIFNlcnZpY2UKKzwvcD4KKzxwPgorICAgIFRvIGluamVjdCBhIG1vY2sgQXBwbGljYXRpb24gb2JqZWN0IGludG8gdGhlIFNlcnZpY2UgdW5kZXIgdGVzdCwgZmlyc3QgY3JlYXRlIGEgc3ViY2xhc3Mgb2YKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9ufS4gPGNvZGU+TW9ja0FwcGxpY2F0aW9uPC9jb2RlPiBpcyBhIHN1YmNsYXNzIG9mCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9ufSBpbiB3aGljaCBhbGwgdGhlIG1ldGhvZHMgdGhyb3cgYW4gRXhjZXB0aW9uLCBzbyB0byB1c2UgaXQKKyAgICBlZmZlY3RpdmVseSB5b3Ugc3ViY2xhc3MgaXQgYW5kIG92ZXJyaWRlIHRoZSBtZXRob2RzIHlvdSBuZWVkLiBZb3UgdGhlbiBpbmplY3QgaXQgaW50byB0aGUKKyAgICBTZXJ2aWNlIHdpdGggdGhlCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2Ujc2V0QXBwbGljYXRpb24oQXBwbGljYXRpb24pIHNldEFwcGxpY2F0aW9uKCl9IG1ldGhvZC4KKyAgICBUaGlzIG1vY2sgb2JqZWN0IGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgYXBwbGljYXRpb24gdmFsdWVzIHRoYXQgdGhlIFNlcnZpY2Ugc2VlcywgYW5kCisgICAgaXNvbGF0ZXMgaXQgZnJvbSB0aGUgcmVhbCBzeXN0ZW0uIEluIGFkZGl0aW9uLCBhbnkgaGlkZGVuIGRlcGVuZGVuY2llcyB5b3VyIFNlcnZpY2UgaGFzIG9uCisgICAgaXRzIGFwcGxpY2F0aW9uIHJldmVhbCB0aGVtc2VsdmVzIGFzIGV4Y2VwdGlvbnMgd2hlbiB5b3UgcnVuIHRoZSB0ZXN0LgorPC9wPgorPHA+CisgICAgWW91IGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3Qgd2l0aCB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZSNzZXRDb250ZXh0KENvbnRleHQpIHNldENvbnRleHQoKX0gbWV0aG9kLiBUaGUgbW9jaworICAgIENvbnRleHQgY2xhc3NlcyB5b3UgY2FuIHVzZSBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5odG1sI01vY2tPYmplY3RDbGFzc2VzIj4KKyAgICBUZXN0aW5nIEZ1bmRhbWVudGFsczwvYT4uCis8L3A+Cis8aDIgaWQ9IlRlc3RBcmVhcyI+V2hhdCB0byBUZXN0PC9oMj4KKzxwPgorICAgIFRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0Lmh0bWwiPldoYXQgVG8gVGVzdDwvYT4KKyAgICBsaXN0cyBnZW5lcmFsIGNvbnNpZGVyYXRpb25zIGZvciB0ZXN0aW5nIEFuZHJvaWQgY29tcG9uZW50cy4KKyAgICBIZXJlIGFyZSBzb21lIHNwZWNpZmljIGd1aWRlbGluZXMgZm9yIHRlc3RpbmcgYSBTZXJ2aWNlOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uQ3JlYXRlKCl9IGlzIGNhbGxlZCBpbiByZXNwb25zZSB0bworICAgICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlKEludGVudCkgQ29udGV4dC5zdGFydFNlcnZpY2UoKX0gb3IKKyAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2UoSW50ZW50LFNlcnZpY2VDb25uZWN0aW9uLGludCkgQ29udGV4dC5iaW5kU2VydmljZSgpfS4KKyAgICAgICAgU2ltaWxhcmx5LCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uRGVzdHJveSgpfSBpcyBjYWxsZWQgaW4KKyAgICAgICAgcmVzcG9uc2UgdG8ge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0b3BTZXJ2aWNlKEludGVudCkgQ29udGV4dC5zdG9wU2VydmljZSgpfSwKKyAgICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3VuYmluZFNlcnZpY2UoU2VydmljZUNvbm5lY3Rpb24pIENvbnRleHQudW5iaW5kU2VydmljZSgpfSwKKyAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2Ujc3RvcFNlbGYoKX0sIG9yCisgICAgICAgIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI3N0b3BTZWxmUmVzdWx0KGludCkgc3RvcFNlbGZSZXN1bHQoKX0uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3QgdGhhdCB5b3VyIFNlcnZpY2UgY29ycmVjdGx5IGhhbmRsZXMgbXVsdGlwbGUgY2FsbHMgZnJvbQorICAgICAgICA8Y29kZT5Db250ZXh0LnN0YXJ0U2VydmljZSgpPC9jb2RlPi4gT25seSB0aGUgZmlyc3QgY2FsbCB0cmlnZ2VycworICAgICAgICA8Y29kZT5TZXJ2aWNlLm9uQ3JlYXRlKCk8L2NvZGU+LCBidXQgYWxsIGNhbGxzIHRyaWdnZXIgYSBjYWxsIHRvCisgICAgICAgIDxjb2RlPlNlcnZpY2Uub25TdGFydENvbW1hbmQoKTwvY29kZT4uCisgICAgICAgIDxwPgorICAgICAgICAgICAgSW4gYWRkaXRpb24sIHJlbWVtYmVyIHRoYXQgPGNvZGU+c3RhcnRTZXJ2aWNlKCk8L2NvZGU+IGNhbGxzIGRvbid0CisgICAgICAgICAgICBuZXN0LCBzbyBhIHNpbmdsZSBjYWxsIHRvIDxjb2RlPkNvbnRleHQuc3RvcFNlcnZpY2UoKTwvY29kZT4gb3IKKyAgICAgICAgICAgIDxjb2RlPlNlcnZpY2Uuc3RvcFNlbGYoKTwvY29kZT4gKGJ1dCBub3QgPGNvZGU+c3RvcFNlbGYoaW50KTwvY29kZT4pCisgICAgICAgICAgICB3aWxsIHN0b3AgdGhlIFNlcnZpY2UuIFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgU2VydmljZSBzdG9wcyBhdCB0aGUgY29ycmVjdCBwb2ludC4KKyAgICAgICAgPC9wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUZXN0IGFueSBidXNpbmVzcyBsb2dpYyB0aGF0IHlvdXIgU2VydmljZSBpbXBsZW1lbnRzLiBCdXNpbmVzcyBsb2dpYyBpbmNsdWRlcyBjaGVja2luZyBmb3IKKyAgICAgICAgaW52YWxpZCB2YWx1ZXMsIGZpbmFuY2lhbCBhbmQgYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGFuZCBzbyBmb3J0aC4KKyAgICA8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3RpbmcvdGVzdGluZ19hbmRyb2lkLmpkCmluZGV4IDQ2YmE3NjkuLjUxM2U0NzIgMTAwNzU1Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy90ZXN0aW5nX2FuZHJvaWQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy90ZXN0aW5nL3Rlc3RpbmdfYW5kcm9pZC5qZApAQCAtMSw0ICsxLDQgQEAKLXBhZ2UudGl0bGU9VGVzdGluZyBhbmQgSW5zdHJ1bWVudGF0aW9uCitwYWdlLnRpdGxlPVRlc3RpbmcgRnVuZGFtZW50YWxzCiBAamQ6Ym9keQogCiA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KQEAgLTYsNjUgKzYsNjIgQEAKICAgPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgogICA8b2w+CiAgICAgPGxpPgotICAgICAgICA8YSBocmVmPSIjT3ZlcnZpZXciPk92ZXJ2aWV3PC9hPgorICAgICAgICA8YSBocmVmPSIjVGVzdFN0cnVjdHVyZSI+VGVzdCBTdHJ1Y3R1cmU8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNUZXN0UHJvamVjdHMiPlRlc3QgUHJvamVjdHM8L2E+CiAgICAgPC9saT4KICAgICA8bGk+CiAgICAgICA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPgogICAgICAgPG9sPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI0V4dGVuc2lvbnMiPkpVbml0IHRlc3QgY2FzZSBjbGFzc2VzPC9hPgorICAgICAgICAgIDxhIGhyZWY9IiNKVW5pdCI+SlVuaXQ8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uIj5JbnN0cnVtZW50YXRpb24gdGVzdCBjYXNlIGNsYXNzZXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uPC9hPgogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI0Fzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2E+CisgICAgICAgICAgICA8YSBocmVmPSIjVGVzdENhc2VDbGFzc2VzIj5UZXN0IGNhc2UgY2xhc3NlczwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvYT4KKyAgICAgICAgICA8YSBocmVmPSIjQXNzZXJ0aW9uQ2xhc3NlcyI+QXNzZXJ0aW9uIGNsYXNzZXM8L2E+CiAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iI0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvYT4KLSAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8YSBocmVmPSIjTW9ja09iamVjdENsYXNzZXMiPk1vY2sgb2JqZWN0IGNsYXNzZXM8L2E+CisgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICA8YSBocmVmPSIjVGVzdEVudmlyb21lbnQiPldvcmtpbmcgaW4gdGhlIFRlc3QgRW52aXJvbm1lbnQ8L2E+CisgICAgICAgIDxhIGhyZWY9IiNJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIj5SdW5uaW5nIFRlc3RzPC9hPgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgICA8YSBocmVmPSIjVGVzdEFyZWFzIj5XaGF0IHRvIFRlc3Q8L2E+CisgICAgICAgIDxhIGhyZWY9IiNUZXN0UmVzdWx0cyI+U2VlaW5nIFRlc3QgUmVzdWx0czwvYT4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgIDxhIGhyZWY9IiNVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9hPgotICAgICAgPG9sPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNOb3RvdWNoTW9kZSI+VHVybmluZyBvZmYgdG91Y2ggbW9kZTwvYT4KLSAgICAgICAgPC9saT4KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNVbmxvY2tEZXZpY2UiPlVubG9ja2luZyB0aGUgRW11bGF0b3Igb3IgRGV2aWNlPC9hPgotICAgICAgICA8L2xpPgotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI1VJVGVzdFRyb3VibGVzaG9vdGluZyI+VHJvdWJsZXNob290aW5nIFVJIHRlc3RzPC9hPgotICAgICAgICA8L2xpPgotICAgICAgPC9vbD4KKyAgICAgICAgPGEgaHJlZj0iI01vbmtleXMiPk1vbmtleSBhbmQgTW9ua2V5UnVubmVyPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgIDxhIGhyZWY9IiNQYWNrYWdlTmFtZXMiPldvcmtpbmcgV2l0aCBQYWNrYWdlIE5hbWVzPC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjV2hhdFRvVGVzdCI+V2hhdCBUbyBUZXN0PC9hPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjTmV4dFN0ZXBzIj5OZXh0IFN0ZXBzPC9hPgogICAgIDwvbGk+CiAgIDwvb2w+Ci0gIDxoMj5LZXkgQ2xhc3NlczwvaDI+CisgIDxoMj5LZXkgQ2xhc3NlcyBhbmQgUGFja2FnZXM8L2gyPgogICAgIDxvbD4KICAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyfTwvbGk+Ci0gICAgICA8bGk+e0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eVVuaXRUZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuQXBwbGljYXRpb25UZXN0Q2FzZX08L2xpPgotICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9PC9saT4KLSAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZX08L2xpPgorICAgICAgPGxpPntAbGluayBhbmRyb2lkLnRlc3R9PC9saT4KKyAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9PC9saT4KKyAgICAgIDxsaT57QGxpbmsganVuaXQuZnJhbWV3b3JrfTwvbGk+CiAgICAgPC9vbD4KICAgPGgyPlJlbGF0ZWQgVHV0b3JpYWxzPC9oMj4KICAgICA8b2w+CiAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sIFRlc3Rpbmc8L2E+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2hlbGxvYW5kcm9pZF90ZXN0Lmh0bWwiPgorICAgICAgICAgICAgSGVsbG8sIFRlc3Rpbmc8L2E+CiAgICAgICAgIDwvbGk+CiAgICAgICAgIDxsaT4KICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdC5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPgpAQCAtNzMsNDQ1ICs3MCw1OTAgQEAKICAgPGgyPlNlZSBBbHNvPC9oMj4KICAgICAgIDxvbD4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4gRWNsaXBzZSwgd2l0aCBBRFQ8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+CisgICAgICAgICAgVGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4KICAgICAgICAgPC9saT4KICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+CisgICAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPgorICAgICAgICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4KICAgICAgICAgPC9saT4KICAgICAgIDwvb2w+CiAgIDwvZGl2PgogPC9kaXY+Ci0KLTxwPkFuZHJvaWQgaW5jbHVkZXMgYSBwb3dlcmZ1bCBzZXQgb2YgdGVzdGluZyB0b29scyB0aGF0IGV4dGVuZCB0aGUKLWluZHVzdHJ5LXN0YW5kYXJkIEpVbml0IHRlc3QgZnJhbWV3b3JrIHdpdGggZmVhdHVyZXMgc3BlY2lmaWMgdG8gdGhlIEFuZHJvaWQKLWVudmlyb25tZW50LiBBbHRob3VnaCB5b3UgY2FuIHRlc3QgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiB3aXRoIEpVbml0LCB0aGUKLUFuZHJvaWQgdG9vbHMgYWxsb3cgeW91IHRvIHdyaXRlIG11Y2ggbW9yZSBzb3BoaXN0aWNhdGVkIHRlc3RzIGZvciBldmVyeSBhc3BlY3QKLW9mIHlvdXIgYXBwbGljYXRpb24sIGJvdGggYXQgdGhlIHVuaXQgYW5kIGZyYW1ld29yayBsZXZlbHMuPC9wPgotCi08cD5LZXkgZmVhdHVyZXMgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpbmNsdWRlOjwvcD4KLQorPHA+CisgICAgVGhlIEFuZHJvaWQgdGVzdGluZyBmcmFtZXdvcmssIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50LAorICAgIHByb3ZpZGVzIGFuIGFyY2hpdGVjdHVyZSBhbmQgcG93ZXJmdWwgdG9vbHMgdGhhdCBoZWxwIHlvdSB0ZXN0IGV2ZXJ5IGFzcGVjdCBvZiB5b3VyIGFwcGxpY2F0aW9uCisgICAgYXQgZXZlcnkgbGV2ZWwgZnJvbSB1bml0IHRvIGZyYW1ld29yay4KKzwvcD4KKzxwPgorICAgIFRoZSB0ZXN0aW5nIGZyYW1ld29yayBoYXMgdGhlc2Uga2V5IGZlYXR1cmVzOgorPC9wPgogPHVsPgotICA8bGk+QW5kcm9pZCBleHRlbnNpb25zIHRvIHRoZSBKVW5pdCBmcmFtZXdvcmsgdGhhdCBwcm92aWRlIGFjY2VzcyB0byBBbmRyb2lkCi1zeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+QW4gaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yayB0aGF0IGxldHMgdGVzdHMgY29udHJvbCBhbmQgZXhhbWluZSB0aGUKLWFwcGxpY2F0aW9uLjwvbGk+Ci0gIDxsaT5Nb2NrIHZlcnNpb25zIG9mIGNvbW1vbmx5LXVzZWQgQW5kcm9pZCBzeXN0ZW0gb2JqZWN0cy48L2xpPgotICA8bGk+VG9vbHMgZm9yIHJ1bm5pbmcgc2luZ2xlIHRlc3RzIG9yIHRlc3Qgc3VpdGVzLCB3aXRoIG9yIHdpdGhvdXQKLWluc3RydW1lbnRhdGlvbi48L2xpPgotICA8bGk+U3VwcG9ydCBmb3IgbWFuYWdpbmcgdGVzdHMgYW5kIHRlc3QgcHJvamVjdHMgaW4gdGhlIEFEVCBQbHVnaW4gZm9yIEVjbGlwc2UKLWFuZCBhdCB0aGUgY29tbWFuZCBsaW5lLjwvbGk+CisgICAgPGxpPgorICAgICAgICBBbmRyb2lkIHRlc3Qgc3VpdGVzIGFyZSBiYXNlZCBvbiBKVW5pdC4gWW91IGNhbiB1c2UgcGxhaW4gSlVuaXQgdG8gdGVzdCBhIGNsYXNzIHRoYXQgZG9lc24ndAorICAgICAgICBjYWxsIHRoZSBBbmRyb2lkIEFQSSwgb3IgQW5kcm9pZCdzIEpVbml0IGV4dGVuc2lvbnMgdG8gdGVzdCBBbmRyb2lkIGNvbXBvbmVudHMuIElmIHlvdSdyZQorICAgICAgICBuZXcgdG8gQW5kcm9pZCB0ZXN0aW5nLCB5b3UgY2FuIHN0YXJ0IHdpdGggZ2VuZXJhbC1wdXJwb3NlIHRlc3QgY2FzZSBjbGFzc2VzIHN1Y2ggYXMge0BsaW5rCisgICAgICAgIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9IGFuZCB0aGVuIGdvIG9uIHRvIHVzZSBtb3JlIHNvcGhpc3RpY2F0ZWQgY2xhc3Nlcy4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgVGhlIEFuZHJvaWQgSlVuaXQgZXh0ZW5zaW9ucyBwcm92aWRlIGNvbXBvbmVudC1zcGVjaWZpYyB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhlc2UgY2xhc3NlcworICAgICAgICBwcm92aWRlIGhlbHBlciBtZXRob2RzIGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMgYW5kIG1ldGhvZHMgdGhhdCBoZWxwIHlvdSBjb250cm9sIHRoZQorICAgICAgICBsaWZlY3ljbGUgb2YgYSBjb21wb25lbnQuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRlc3Qgc3VpdGVzIGFyZSBjb250YWluZWQgaW4gdGVzdCBwYWNrYWdlcyB0aGF0IGFyZSBzaW1pbGFyIHRvIG1haW4gYXBwbGljYXRpb24gcGFja2FnZXMsIHNvCisgICAgICAgIHlvdSBkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHNldCBvZiB0b29scyBvciB0ZWNobmlxdWVzIGZvciBkZXNpZ25pbmcgYW5kIGJ1aWxkaW5nIHRlc3RzLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICBUaGUgU0RLIHRvb2xzIGZvciBidWlsZGluZyBhbmQgdGVzdHMgYXJlIGF2YWlsYWJsZSBpbiBFY2xpcHNlIHdpdGggQURULCBhbmQgYWxzbyBpbgorICAgICAgICBjb21tYW5kLWxpbmUgZm9ybSBmb3IgdXNlIHdpdGggb3RoZXIgSURFUy4gVGhlc2UgdG9vbHMgZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHByb2plY3Qgb2YKKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHRoZSBidWlsZCBmaWxlcywKKyAgICAgICAgbWFuaWZlc3QgZmlsZSwgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIFRoZSBTREsgYWxzbyBwcm92aWRlcworICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvbW9ua2V5cnVubmVyLmh0bWwiPk1vbmtleVJ1bm5lcjwvYT4sIGFuIEFQSSBmb3IKKyAgICAgICAgdGVzdGluZyBkZXZpY2VzIHdpdGggSnl0aG9uIHNjcmlwdHMsIGFuZCA8YQorICAgICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiwgYSBjb21tYW5kLWxpbmUgdG9vbCBmb3IKKyAgICAgICAgc3RyZXNzLXRlc3RpbmcgVUlzIGJ5IHNlbmRpbmcgcHNldWRvLXJhbmRvbSBldmVudHMgdG8gYSBkZXZpY2UuCisgICAgPC9saT4KIDwvdWw+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgaXMgYW4gb3ZlcnZpZXcgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBhbmQgdGhlIHdheQoteW91IHVzZSBpdC4gVGhlIGRvY3VtZW50IGFzc3VtZXMgeW91IGhhdmUgYSBiYXNpYyBrbm93bGVkZ2Ugb2YgQW5kcm9pZAotYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgYW5kIEpVbml0IHRlc3RpbmcgbWV0aG9kb2xvZ3kuPC9wPgotCi08aDIgaWQ9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvaDI+Ci0KLTxwPiBBdCB0aGUgaGVhcnQgb2YgdGhlIEFuZHJvaWQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBhbiBpbnN0cnVtZW50YXRpb24KLWZyYW1ld29yayB0aGF0IHlvdXIgdGVzdCBhcHBsaWNhdGlvbiB1c2VzIHRvIHByZWNpc2VseSBjb250cm9sIHRoZSBhcHBsaWNhdGlvbgotdW5kZXIgdGVzdC4gV2l0aCBpbnN0cnVtZW50YXRpb24sIHlvdSBjYW4gc2V0IHVwIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcwotQ29udGV4dHMgYmVmb3JlIHRoZSBtYWluIGFwcGxpY2F0aW9uIHN0YXJ0cywgY29udHJvbCB5b3VyIGFwcGxpY2F0aW9uIGF0IHZhcmlvdXMKLXBvaW50cyBvZiBpdHMgbGlmZWN5Y2xlLCBzZW5kIFVJIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24sIGFuZCBleGFtaW5lIHRoZQotYXBwbGljYXRpb24ncyBzdGF0ZSBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4gVGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsKLWFjY29tcGxpc2hlcyB0aGlzIGJ5IHJ1bm5pbmcgYm90aCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBhbmQgdGhlIHRlc3QgYXBwbGljYXRpb24KLWluIHRoZSBzYW1lIHByb2Nlc3MuIDwvcD4KLQotPHA+WW91ciB0ZXN0IGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBieSBtZWFucyBvZiBhbgotPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW5zdHJ1bWVudGF0aW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O2luc3RydW1lbnRhdGlvbiZndDs8L2NvZGU+PC9hPgotZWxlbWVudCBpbiB0aGUgdGVzdCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50Ci1zcGVjaWZ5IHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYW5kIGFsc28gdGVsbCBBbmRyb2lkIGhvdwotdG8gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uLiBJbnN0cnVtZW50YXRpb24gaXMgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZQotc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+SW5zdHJ1bWVudGF0aW9uIFRlc3QKLVJ1bm5lcjwvYT4uPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIGRpYWdyYW0gc3VtbWFyaXplcyB0aGUgQW5kcm9pZCB0ZXN0aW5nIGVudmlyb25tZW50OjwvcD4KLQotPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyIvPgotCi08cD5JbiBBbmRyb2lkLCB0ZXN0IGFwcGxpY2F0aW9ucyBhcmUgdGhlbXNlbHZlcyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc28geW91Ci13cml0ZSB0aGVtIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzIHRoZSBhcHBsaWNhdGlvbiB5b3UgYXJlIHRlc3RpbmcuIFRoZSBTREsKLXRvb2xzIGhlbHAgeW91IGNyZWF0ZSBhIG1haW4gYXBwbGljYXRpb24gcHJvamVjdCBhbmQgaXRzIHRlc3QgcHJvamVjdCBhdCB0aGUgc2FtZQotdGltZS4gWW91IGNhbiBydW4gQW5kcm9pZCB0ZXN0cyB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCBvciBmcm9tIHRoZSBjb21tYW5kCi1saW5lLiBFY2xpcHNlIHdpdGggQURUIHByb3ZpZGVzIGFuIGV4dGVuc2l2ZSBzZXQgb2YgdG9vbHMgZm9yIGNyZWF0aW5nIHRlc3RzLAotcnVubmluZyB0aGVtLCBhbmQgdmlld2luZyB0aGVpciByZXN1bHRzLiBZb3UgY2FuIGFsc28gdXNlIHRoZSA8Y29kZT5hZGI8L2NvZGU+Ci10b29sIHRvIHJ1biB0ZXN0cywgb3IgdXNlIGEgYnVpbHQtaW4gQW50IHRhcmdldC48L3A+Ci0KLTxwPlRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYW5kIHJ1biB0ZXN0cyBpbiBFY2xpcHNlLCBwbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiPlRlc3RpbmcgaW4KLUVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlcgotSURFczwvYT4uPC9wPgotCi08cD5JZiB5b3Ugd2FudCBhIHN0ZXAtYnktc3RlcCBpbnRyb2R1Y3Rpb24gdG8gQW5kcm9pZCB0ZXN0aW5nLCB0cnkgb25lIG9mIHRoZQotdGVzdGluZyB0dXRvcmlhbHM6PC9wPgotCi08dWw+Ci0gIDxsaT5UaGUgPGEKLWhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCi1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpbnRyb2R1Y2VzIGJhc2ljIHRlc3RpbmcgY29uY2VwdHMgYW5kIHByb2NlZHVyZXMgaW4gdGhlCi1jb250ZXh0IG9mIHRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlRoZSA8YQotaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5Ci1UZXN0aW5nPC9hPiB0dXRvcmlhbCBpcyBhbiBleGNlbGxlbnQgZm9sbG93LXVwIHRvIHRoZSBIZWxsbywgVGVzdGluZyB0dXRvcmlhbC4KLUl0IGd1aWRlcyB5b3UgdGhyb3VnaCBhIG1vcmUgY29tcGxleCB0ZXN0aW5nIHNjZW5hcmlvIHRoYXQgeW91IGRldmVsb3AgYWdhaW5zdCBhCi1tb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi48L2xpPgotPC91bD4KLQorPHA+CisgICAgVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZ1bmRhbWVudGFscyBvZiB0aGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yaywgaW5jbHVkaW5nIHRoZQorICAgIHN0cnVjdHVyZSBvZiB0ZXN0cywgdGhlIEFQSXMgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgdGVzdHMsIGFuZCB0aGUgdG9vbHMgdGhhdCB5b3UgdXNlIHRvIHJ1bgorICAgIHRlc3RzIGFuZCB2aWV3IHJlc3VsdHMuIFRoZSBkb2N1bWVudCBhc3N1bWVzIHlvdSBoYXZlIGEgYmFzaWMga25vd2xlZGdlIG9mIEFuZHJvaWQgYXBwbGljYXRpb24KKyAgICBwcm9ncmFtbWluZyBhbmQgSlVuaXQgdGVzdGluZyBtZXRob2RvbG9neS4KKzwvcD4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzdW1tYXJpemVzIHRoZSB0ZXN0aW5nIGZyYW1ld29yazoKKzwvcD4KKzxkaXYgc3R5bGU9IndpZHRoOiA3MCU7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyI+Cis8YSBocmVmPSJ7QGRvY1Jvb3R9aW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy90ZXN0aW5nL3Rlc3RfZnJhbWV3b3JrLnBuZyIKKyAgICAgICAgYWx0PSJUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayIvPgorPC9hPgorPC9kaXY+Cis8aDIgaWQ9IlRlc3RTdHJ1Y3R1cmUiPlRlc3QgU3RydWN0dXJlPC9oMj4KKzxwPgorICAgIEFuZHJvaWQncyBidWlsZCBhbmQgdGVzdCB0b29scyBhc3N1bWUgdGhhdCB0ZXN0IHByb2plY3RzIGFyZSBvcmdhbml6ZWQgaW50byBhIHN0YW5kYXJkCisgICAgc3RydWN0dXJlIG9mIHRlc3RzLCB0ZXN0IGNhc2UgY2xhc3NlcywgdGVzdCBwYWNrYWdlcywgYW5kIHRlc3QgcHJvamVjdHMuCis8L3A+Cis8cD4KKyAgICBBbmRyb2lkIHRlc3RpbmcgaXMgYmFzZWQgb24gSlVuaXQuIEluIGdlbmVyYWwsIGEgSlVuaXQgdGVzdCBpcyBhIG1ldGhvZCB3aG9zZQorICAgIHN0YXRlbWVudHMgdGVzdCBhIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIFlvdSBvcmdhbml6ZSB0ZXN0IG1ldGhvZHMgaW50byBjbGFzc2VzCisgICAgY2FsbGVkIHRlc3QgY2FzZXMgKG9yIHRlc3Qgc3VpdGVzKS4gRWFjaCB0ZXN0IGlzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYW4gaW5kaXZpZHVhbCBtb2R1bGUgaW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRWFjaCBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgcmVsYXRlZCB0ZXN0IG1ldGhvZHMsIGFsdGhvdWdoIGl0CisgICAgb2Z0ZW4gcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgYXMgd2VsbC4KKzwvcD4KKzxwPgorICAgIEluIEpVbml0LCB5b3UgYnVpbGQgb25lIG9yIG1vcmUgdGVzdCBzb3VyY2UgZmlsZXMgaW50byBhIGNsYXNzIGZpbGUuIFNpbWlsYXJseSwgaW4gQW5kcm9pZCB5b3UKKyAgICB1c2UgdGhlIFNESydzIGJ1aWxkIHRvb2xzIHRvIGJ1aWxkIG9uZSBvciBtb3JlIHRlc3Qgc291cmNlIGZpbGVzIGludG8gY2xhc3MgZmlsZXMgaW4gYW4KKyAgICBBbmRyb2lkIHRlc3QgcGFja2FnZS4gSW4gSlVuaXQsIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciB0byBleGVjdXRlIHRlc3QgY2xhc3Nlcy4gSW4gQW5kcm9pZCwgeW91CisgICAgdXNlIHRlc3QgdG9vbHMgdG8gbG9hZCB0aGUgdGVzdCBwYWNrYWdlIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgYW5kIHRoZSB0b29scyB0aGVuCisgICAgZXhlY3V0ZSBhbiBBbmRyb2lkLXNwZWNpZmljIHRlc3QgcnVubmVyLgorPC9wPgorPGgyIGlkPSJUZXN0UHJvamVjdHMiPlRlc3QgUHJvamVjdHM8L2gyPgorPHA+CisgICAgVGVzdHMsIGxpa2UgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFyZSBvcmdhbml6ZWQgaW50byBwcm9qZWN0cy4KKzwvcD4KKzxwPgorICAgIEEgdGVzdCBwcm9qZWN0IGlzIGEgZGlyZWN0b3J5IG9yIEVjbGlwc2UgcHJvamVjdCBpbiB3aGljaCB5b3UgY3JlYXRlIHRoZSBzb3VyY2UgY29kZSwgbWFuaWZlc3QKKyAgICBmaWxlLCBhbmQgb3RoZXIgZmlsZXMgZm9yIGEgdGVzdCBwYWNrYWdlLiBUaGUgQW5kcm9pZCBTREsgY29udGFpbnMgdG9vbHMgZm9yIEVjbGlwc2Ugd2l0aCBBRFQKKyAgICBhbmQgZm9yIHRoZSBjb21tYW5kIGxpbmUgdGhhdCBjcmVhdGUgYW5kIHVwZGF0ZSB0ZXN0IHByb2plY3RzIGZvciB5b3UuIFRoZSB0b29scyBjcmVhdGUgdGhlCisgICAgZGlyZWN0b3JpZXMgeW91IHVzZSBmb3Igc291cmNlIGNvZGUgYW5kIHJlc291cmNlcyBhbmQgdGhlIG1hbmlmZXN0IGZpbGUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgVGhlIGNvbW1hbmQtbGluZSB0b29scyBhbHNvIGNyZWF0ZSB0aGUgQW50IGJ1aWxkIGZpbGVzIHlvdSBuZWVkLgorPC9wPgorPHA+CisgICAgWW91IHNob3VsZCBhbHdheXMgdXNlIEFuZHJvaWQgdG9vbHMgdG8gY3JlYXRlIGEgdGVzdCBwcm9qZWN0LiBBbW9uZyBvdGhlciBiZW5lZml0cywKKyAgICB0aGUgdG9vbHM6Cis8L3A+CisgICAgPHVsPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IHNldCB1cCB5b3VyIHRlc3QgcGFja2FnZSB0byB1c2UKKyAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gYXMgdGhlIHRlc3QgY2FzZSBydW5uZXIuIFlvdSBtdXN0IHVzZQorICAgICAgICAgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gKG9yIGEgc3ViY2xhc3MpIHRvIHJ1biBKVW5pdCB0ZXN0cy4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgQ3JlYXRlIGFuIGFwcHJvcHJpYXRlIG5hbWUgZm9yIHRoZSB0ZXN0IHBhY2thZ2UuIElmIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgdW5kZXIgdGVzdCBoYXMgYSBwYWNrYWdlIG5hbWUgb2YgPGNvZGU+Y29tLm15ZG9tYWluLm15YXBwPC9jb2RlPiwgdGhlbiB0aGUKKyAgICAgICAgICAgIEFuZHJvaWQgdG9vbHMgc2V0IHRoZSB0ZXN0IHBhY2thZ2UgbmFtZSB0byA8Y29kZT5jb20ubXlkb21haW4ubXlhcHAudGVzdDwvY29kZT4uIFRoaXMKKyAgICAgICAgICAgIGhlbHBzIHlvdSBpZGVudGlmeSB0aGVpciByZWxhdGlvbnNoaXAsIHdoaWxlIHByZXZlbnRpbmcgY29uZmxpY3RzIHdpdGhpbiB0aGUgc3lzdGVtLgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgcHJvcGVyIGJ1aWxkIGZpbGVzLCBtYW5pZmVzdCBmaWxlLCBhbmQgZGlyZWN0b3J5CisgICAgICAgICAgICBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXN0IHByb2plY3QuIFRoaXMgaGVscHMgeW91IHRvIGJ1aWxkIHRoZSB0ZXN0IHBhY2thZ2Ugd2l0aG91dAorICAgICAgICAgICAgaGF2aW5nIHRvIG1vZGlmeSBidWlsZCBmaWxlcyBhbmQgc2V0cyB1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIHlvdXIgdGVzdCBwYWNrYWdlIGFuZAorICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgICAgICAgICAgICBUaGUKKyAgICAgICAgPC9saT4KKyAgICA8L3VsPgorPHA+CisgICAgWW91IGNhbiBjcmVhdGUgYSB0ZXN0IHByb2plY3QgYW55d2hlcmUgaW4geW91ciBmaWxlIHN5c3RlbSwgYnV0IHRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvCisgICAgYWRkIHRoZSB0ZXN0IHByb2plY3Qgc28gdGhhdCBpdHMgcm9vdCBkaXJlY3RvcnkgPGNvZGU+dGVzdHMvPC9jb2RlPiBpcyBhdCB0aGUgc2FtZSBsZXZlbAorICAgIGFzIHRoZSA8Y29kZT5zcmMvPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIG1haW4gYXBwbGljYXRpb24ncyBwcm9qZWN0LiBUaGlzIGhlbHBzIHlvdSBmaW5kIHRoZQorICAgIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCBhbiBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBwbGljYXRpb24gcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5CisgICAgaXMgPGNvZGU+TXlQcm9qZWN0PC9jb2RlPiwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6Cis8L3A+Cis8cHJlIGNsYXNzPSJjbGFzc2ljIG5vLXByZXR0eS1wcmludCI+CisgIE15UHJvamVjdC8KKyAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgIHJlcy8KKyAgICAgICAgICAuLi4gKHJlc291cmNlcyBmb3IgbWFpbiBhcHBsaWNhdGlvbikKKyAgICAgIHNyYy8KKyAgICAgICAgICAuLi4gKHNvdXJjZSBjb2RlIGZvciBtYWluIGFwcGxpY2F0aW9uKSAuLi4KKyAgICAgIHRlc3RzLworICAgICAgICAgIEFuZHJvaWRNYW5pZmVzdC54bWwKKyAgICAgICAgICByZXMvCisgICAgICAgICAgICAgIC4uLiAocmVzb3VyY2VzIGZvciB0ZXN0cykKKyAgICAgICAgICBzcmMvCisgICAgICAgICAgICAgIC4uLiAoc291cmNlIGNvZGUgZm9yIHRlc3RzKQorPC9wcmU+CiA8aDIgaWQ9IlRlc3RBUEkiPlRoZSBUZXN0aW5nIEFQSTwvaDI+CiA8cD4KLSAgICBGb3Igd3JpdGluZyB0ZXN0cyBhbmQgdGVzdCBhcHBsaWNhdGlvbnMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIEFuZHJvaWQgcHJvdmlkZXMgYQotICAgIHRlc3RpbmcgQVBJIHRoYXQgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgSlVuaXQgdGVzdCBmcmFtZXdvcmsuIEFkZGluZyB0byB0aGF0LCBBbmRyb2lkIGluY2x1ZGVzCi0gICAgYSBwb3dlcmZ1bCBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrIHRoYXQgbGV0cyB5b3VyIHRlc3RzIGFjY2VzcyB0aGUgc3RhdGUgYW5kIHJ1bnRpbWUgb2JqZWN0cwotICAgIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0cy4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIEFQSSBpcyBiYXNlZCBvbiB0aGUgSlVuaXQgQVBJIGFuZCBleHRlbmRlZCB3aXRoIGEgaW5zdHJ1bWVudGF0aW9uCisgICAgZnJhbWV3b3JrIGFuZCBBbmRyb2lkLXNwZWNpZmljIHRlc3RpbmcgY2xhc3Nlcy4KIDwvcD4KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSB0aGUgbWFqb3IgY29tcG9uZW50cyBvZiB0aGUgdGVzdGluZyBBUEkgYXZhaWxhYmxlIGluIEFuZHJvaWQuPC9wPgotPGgzIGlkPSJFeHRlbnNpb25zIj5KVW5pdCB0ZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8aDMgaWQ9IkpVbml0Ij5KVW5pdDwvaDM+CiA8cD4KLSAgU29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgdGVzdGluZyBBUEkgZXh0ZW5kIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBidXQgZG8gbm90IHVzZSB0aGUgaW5zdHJ1bWVudGF0aW9uIGZyYW1ld29yay4gVGhlc2UgY2xhc3NlcwotICBjb250YWluIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBzeXN0ZW0gb2JqZWN0cyBzdWNoIGFzIHRoZSBDb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaXRoIHRoaXMgQ29udGV4dCwgeW91IGNhbiBsb29rIGF0IGl0cyByZXNvdXJjZXMsIGZpbGVzLCBkYXRhYmFzZXMsCi0gIGFuZCBzbyBmb3J0aC4gVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCBidXQgeW91IHVzdWFsbHkgdXNlIGEgc3ViY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb21wb25lbnQuCi08cD4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgotPC9wPgotICA8dWw+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BcHBsaWNhdGlvblRlc3RDYXNlfSAtIEEgY2xhc3MgZm9yIHRlc3RpbmcgYW4gZW50aXJlIGFwcGxpY2F0aW9uLiBJdCBhbGxvd3MgeW91IHRvIGluamVjdCBhIG1vY2sgQ29udGV4dCBpbnRvIHRoZSBhcHBsaWNhdGlvbiwKLSAgICAgIHNldCB1cCBpbml0aWFsIHRlc3QgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cywgYW5kIGV4YW1pbmUgdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGl0IGZpbmlzaGVzIGJ1dCBiZWZvcmUgaXQgaXMgZGVzdHJveWVkLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMn0gLSBBIGNsYXNzIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfS4gU2luY2UgaXQgaXMgcmVzdHJpY3RlZCB0byB1c2luZyBhCi0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gZm9yIHRoZSBwcm92aWRlciwgYW5kIGl0IGluamVjdHMgYW4ge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LCB5b3VyIHByb3ZpZGVyIHRlc3RpbmcgaXMgaXNvbGF0ZWQKLSAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIE9TLgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5TZXJ2aWNlVGVzdENhc2V9IC0gYSBjbGFzcyBmb3IgaXNvbGF0ZWQgdGVzdGluZyBvZiBhIHNpbmdsZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uIFlvdSBjYW4gaW5qZWN0IGEgbW9jayBDb250ZXh0IG9yCi0gICAgICBtb2NrIEFwcGxpY2F0aW9uIChvciBib3RoKSwgb3IgbGV0IEFuZHJvaWQgcHJvdmlkZSB5b3UgYSBmdWxsIENvbnRleHQgYW5kIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0uCi0gICAgPC9saT4KLSAgPC91bD4KLTxoMyBpZD0iSW5zdHJ1bWVudGF0aW9uIj5JbnN0cnVtZW50YXRpb24gdGVzdCBjYXNlIGNsYXNzZXM8L2gzPgotPHA+Ci0gIFRoZSBBUEkgZm9yIHRlc3RpbmcgYWN0aXZpdGllcyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIFRlc3RDYXNlfSBjbGFzcyBhbmQgYWxzbyB1c2VzIHRoZSBpbnN0cnVtZW50YXRpb24gZnJhbWV3b3JrLiBXaXRoIGluc3RydW1lbnRhdGlvbiwKLSAgQW5kcm9pZCBjYW4gYXV0b21hdGUgVUkgdGVzdGluZyBieSBzZW5kaW5nIGV2ZW50cyB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCwgcHJlY2lzZWx5IGNvbnRyb2wgdGhlIHN0YXJ0IG9mIGFuIGFjdGl2aXR5LCBhbmQgbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlCi0gIGFjdGl2aXR5IGR1cmluZyBpdHMgbGlmZSBjeWNsZS4KKyAgICBZb3UgY2FuIHVzZSB0aGUgSlVuaXQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSBUZXN0Q2FzZX0gY2xhc3MgdG8gZG8gdW5pdCB0ZXN0aW5nIG9uCisgICAgYSBwbGFpbiBKYXZhIG9iamVjdC4gPGNvZGU+VGVzdENhc2U8L2NvZGU+IGlzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yCisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2V9LCB3aGljaCB5b3UgY2FuIHVzZSB0byB0ZXN0IEFuZHJvaWQtZGVwZW5kZW50IG9iamVjdHMuCisgICAgQmVzaWRlcyBwcm92aWRpbmcgdGhlIEpVbml0IGZyYW1ld29yaywgQW5kcm9pZFRlc3RDYXNlIG9mZmVycyBBbmRyb2lkLXNwZWNpZmljIHNldHVwLAorICAgIHRlYXJkb3duLCBhbmQgaGVscGVyIG1ldGhvZHMuCiA8L3A+CiA8cD4KLSAgVGhlIGJhc2UgY2xhc3MgaXMge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZX0uIEFsbCBvZiBpdHMgc3ViY2xhc3NlcyBoYXZlIHRoZSBhYmlsaXR5IHRvIHNlbmQgYSBrZXlzdHJva2Ugb3IgdG91Y2ggZXZlbnQgdG8gdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbgotICB1bmRlciB0ZXN0LiBUaGUgc3ViY2xhc3NlcyBjYW4gYWxzbyBpbmplY3QgYSBtb2NrIEludGVudC4KLSAgVGhlIHN1YmNsYXNzZXMgYXJlOgorICAgIFlvdSB1c2UgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyB0byBkaXNwbGF5IHRlc3QgcmVzdWx0cy4KKyAgICBUaGUgYXNzZXJ0IG1ldGhvZHMgY29tcGFyZSB2YWx1ZXMgeW91IGV4cGVjdCBmcm9tIGEgdGVzdCB0byB0aGUgYWN0dWFsIHJlc3VsdHMgYW5kCisgICAgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21wYXJpc29uIGZhaWxzLiBBbmRyb2lkIGFsc28gcHJvdmlkZXMgYSBjbGFzcyBvZiBhc3NlcnRpb25zIHRoYXQKKyAgICBleHRlbmQgdGhlIHBvc3NpYmxlIHR5cGVzIG9mIGNvbXBhcmlzb25zLCBhbmQgYW5vdGhlciBjbGFzcyBvZiBhc3NlcnRpb25zIGZvciB0ZXN0aW5nIHRoZSBVSS4KKyAgICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBzZWN0aW9uIDxhIGhyZWY9IiNBc3NlcnRpb25DbGFzc2VzIj4KKyAgICBBc3NlcnRpb24gY2xhc3NlczwvYT4KIDwvcD4KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGJhc2UgY2xhc3MgZm9yIGFjdGl2aXR5IHRlc3QgY2xhc3Nlcy4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuU2luZ2xlTGF1bmNoQWN0aXZpdHlUZXN0Q2FzZX0gLSBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIGEgc2luZ2xlIGFjdGl2aXR5LgotICAgICAgSXQgaW52b2tlcyB7QGxpbmsganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkgc2V0VXAoKX0gYW5kIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBvbmx5Ci0gICAgICBvbmNlLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1ldGhvZCBjYWxsLiBVc2UgaXQgd2hlbiBhbGwgb2YgeW91ciB0ZXN0IG1ldGhvZHMgcnVuIGFnYWluc3QgdGhlIHNhbWUgYWN0aXZpdHkuCi0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlN5bmNCYXNlSW5zdHJ1bWVudGF0aW9ufSAtIEEgY2xhc3MgdGhhdCB0ZXN0cyBzeW5jaHJvbml6YXRpb24gb2YgYSBjb250ZW50IHByb3ZpZGVyLiBJdCB1c2VzIGluc3RydW1lbnRhdGlvbiB0byBjYW5jZWwgYW5kIGRpc2FibGUKLSAgICAgIGV4aXN0aW5nIHN5bmNocm9uaXphdGlvbnMgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0IHN5bmNocm9uaXphdGlvbi4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9IC0gVGhpcyBjbGFzcyBkb2VzIGFuIGlzb2xhdGVkIHRlc3Qgb2YgYSBzaW5nbGUgYWN0aXZpdHkuIFdpdGggaXQsIHlvdSBjYW4gaW5qZWN0IGEgbW9jayBjb250ZXh0IG9yIGFwcGxpY2F0aW9uLCBvciBib3RoLgotICAgICAgSXQgaXMgaW50ZW5kZWQgZm9yIGRvaW5nIHVuaXQgdGVzdHMgb2YgYW4gYWN0aXZpdHksIGFuZCBpcyB0aGUgYWN0aXZpdHkgZXF1aXZhbGVudCBvZiB0aGUgdGVzdCBjbGFzc2VzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjRXh0ZW5zaW9ucyI+SlVuaXQgdGVzdCBjYXNlIGNsYXNzZXM8L2E+LgotICAgICAgPHA+IFVubGlrZSB0aGUgb3RoZXIgaW5zdHJ1bWVudGF0aW9uIGNsYXNzZXMsIHRoaXMgdGVzdCBjbGFzcyBjYW5ub3QgaW5qZWN0IGEgbW9jayBJbnRlbnQuPC9wPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gLSBUaGlzIGNsYXNzIHRlc3RzIGEgc2luZ2xlIGFjdGl2aXR5IHdpdGhpbiB0aGUgbm9ybWFsIHN5c3RlbSBlbnZpcm9ubWVudC4KLSAgICAgIFlvdSBjYW5ub3QgaW5qZWN0IGEgbW9jayBDb250ZXh0LCBidXQgeW91IGNhbiBpbmplY3QgbW9jayBJbnRlbnRzLiBBbHNvLCB5b3UgY2FuIHJ1biBhIHRlc3QgbWV0aG9kIG9uIHRoZSBVSSB0aHJlYWQgKHRoZSBtYWluIHRocmVhZCBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCksCi0gICAgICB3aGljaCBhbGxvd3MgeW91IHRvIHNlbmQga2V5IGFuZCB0b3VjaCBldmVudHMgdG8gdGhlIGFwcGxpY2F0aW9uIFVJLgotICAgIDwvbGk+Ci0gIDwvdWw+Ci08aDMgaWQ9IkFzc2VydCI+QXNzZXJ0IGNsYXNzZXM8L2gzPgogPHA+Ci0gIEFuZHJvaWQgYWxzbyBleHRlbmRzIHRoZSBKVW5pdCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0gY2xhc3MgdGhhdCBpcyB0aGUgYmFzaXMgb2YgPGNvZGU+YXNzZXJ0KCk8L2NvZGU+IGNhbGxzIGluIHRlc3RzLgotICBUaGVyZSBhcmUgdHdvIGV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcywge0BsaW5rIGFuZHJvaWQudGVzdC5Nb3JlQXNzZXJ0c30gYW5kIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHN9OgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgSlVuaXQsIHlvdSBjYW4gcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+anVuaXQub3JnPC9hPiBob21lIHBhZ2UuCisgICAgTm90ZSB0aGF0IHRoZSBBbmRyb2lkIHRlc3RpbmcgQVBJIHN1cHBvcnRzIEpVbml0IDMgY29kZSBzdHlsZSwgYnV0IG5vdCBKVW5pdCA0LiBBbHNvLCB5b3UgbXVzdAorICAgIHVzZSBBbmRyb2lkJ3MgaW5zdHJ1bWVudGVkIHRlc3QgcnVubmVyIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gdG8gcnVuCisgICAgeW91ciB0ZXN0IGNhc2UgY2xhc3Nlcy4gVGhpcyB0ZXN0IHJ1bm5lciBpcyBkZXNjcmliZWQgaW4gdGhlCisgICAgc2VjdGlvbiA8YSBocmVmPSIjSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciI+UnVubmluZyBUZXN0czwvYT4uCis8L3A+Cis8aDMgaWQ9Ikluc3RydW1lbnRhdGlvbiI+SW5zdHJ1bWVudGF0aW9uPC9oMz4KKzxwPgorICAgIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIGlzIGEgc2V0IG9mIGNvbnRyb2wgbWV0aG9kcyBvciAiaG9va3MiIGluIHRoZSBBbmRyb2lkIHN5c3RlbS4gVGhlc2UgaG9va3MKKyAgICBjb250cm9sIGFuIEFuZHJvaWQgY29tcG9uZW50IGluZGVwZW5kZW50bHkgb2YgaXRzIG5vcm1hbCBsaWZlY3ljbGUuIFRoZXkgYWxzbyBjb250cm9sIGhvdworICAgIEFuZHJvaWQgbG9hZHMgYXBwbGljYXRpb25zLgorPC9wPgorPHA+CisgICAgTm9ybWFsbHksIGFuIEFuZHJvaWQgY29tcG9uZW50IHJ1bnMgaW4gYSBsaWZlY3ljbGUgZGV0ZXJtaW5lZCBieSB0aGUgc3lzdGVtLiBGb3IgZXhhbXBsZSwgYW4KKyAgICBBY3Rpdml0eSBvYmplY3QncyBsaWZlY3ljbGUgc3RhcnRzIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGFjdGl2YXRlZCBieSBhbiBJbnRlbnQuIFRoZSBvYmplY3QncworICAgIDxjb2RlPm9uQ3JlYXRlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQsIGZvbGxvd2VkIGJ5IDxjb2RlPm9uUmVzdW1lKCk8L2NvZGU+LiBXaGVuIHRoZSB1c2VyCisgICAgc3RhcnRzIGFub3RoZXIgYXBwbGljYXRpb24sIHRoZSA8Y29kZT5vblBhdXNlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoZSBBY3Rpdml0eQorICAgIGNvZGUgY2FsbHMgdGhlIDxjb2RlPmZpbmlzaCgpPC9jb2RlPiBtZXRob2QsIHRoZSA8Y29kZT5vbkRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICBUaGUgQW5kcm9pZCBmcmFtZXdvcmsgQVBJIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIHlvdXIgY29kZSB0byBpbnZva2UgdGhlc2UgY2FsbGJhY2sKKyAgICBtZXRob2RzIGRpcmVjdGx5LCBidXQgeW91IGNhbiBkbyBzbyB1c2luZyBpbnN0cnVtZW50YXRpb24uCis8L3A+Cis8cD4KKyAgICBBbHNvLCB0aGUgc3lzdGVtIHJ1bnMgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFuIGFwcGxpY2F0aW9uIGludG8gdGhlIHNhbWUKKyAgICBwcm9jZXNzLiBZb3UgY2FuIGFsbG93IHNvbWUgY29tcG9uZW50cywgc3VjaCBhcyBjb250ZW50IHByb3ZpZGVycywgdG8gcnVuIGluIGEgc2VwYXJhdGUgcHJvY2VzcywKKyAgICBidXQgeW91IGNhbid0IGZvcmNlIGFuIGFwcGxpY2F0aW9uIHRvIHJ1biBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBpcworICAgIGFscmVhZHkgcnVubmluZy4KKzwvcD4KKzxwPgorICAgIFdpdGggQW5kcm9pZCBpbnN0cnVtZW50YXRpb24sIHRob3VnaCwgeW91IGNhbiBpbnZva2UgY2FsbGJhY2sgbWV0aG9kcyBpbiB5b3VyIHRlc3QgY29kZS4KKyAgICBUaGlzIGFsbG93cyB5b3UgdG8gcnVuIHRocm91Z2ggdGhlIGxpZmVjeWNsZSBvZiBhIGNvbXBvbmVudCBzdGVwIGJ5IHN0ZXAsIGFzIGlmIHlvdSB3ZXJlCisgICAgZGVidWdnaW5nIHRoZSBjb21wb25lbnQuIFRoZSBmb2xsb3dpbmcgdGVzdCBjb2RlIHNuaXBwZXQgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhpcyB0bworICAgIHRlc3QgdGhhdCBhbiBBY3Rpdml0eSBzYXZlcyBhbmQgcmVzdG9yZXMgaXRzIHN0YXRlOgorPC9wPgorPGEgbmFtZT0iQWN0aXZpdHlTbmlwcGV0Ij48L2E+Cis8cHJlPgorICAgIC8vIFN0YXJ0IHRoZSBtYWluIGFjdGl2aXR5IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0CisgICAgbUFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKKworICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgQWN0aXZpdHkgb2JqZWN0J3MgbWFpbiBVSSB3aWRnZXQsIGEgU3Bpbm5lcgorICAgIG1TcGlubmVyID0gKFNwaW5uZXIpbUFjdGl2aXR5LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5leGFtcGxlLnNwaW5uZXIuUi5pZC5TcGlubmVyMDEpOworCisgICAgLy8gU2V0IHRoZSBTcGlubmVyIHRvIGEga25vd24gcG9zaXRpb24KKyAgICBtQWN0aXZpdHkuc2V0U3Bpbm5lclBvc2l0aW9uKFRFU1RfU1RBVEVfREVTVFJPWV9QT1NJVElPTik7CisKKyAgICAvLyBTdG9wIHRoZSBhY3Rpdml0eSAtIFRoZSBvbkRlc3Ryb3koKSBtZXRob2Qgc2hvdWxkIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBTcGlubmVyCisgICAgbUFjdGl2aXR5LmZpbmlzaCgpOworCisgICAgLy8gUmUtc3RhcnQgdGhlIEFjdGl2aXR5IC0gdGhlIG9uUmVzdW1lKCkgbWV0aG9kIHNob3VsZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgU3Bpbm5lcgorICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7CisKKyAgICAvLyBHZXQgdGhlIFNwaW5uZXIncyBjdXJyZW50IHBvc2l0aW9uCisgICAgaW50IGN1cnJlbnRQb3NpdGlvbiA9IG1BY3Rpdml0eS5nZXRTcGlubmVyUG9zaXRpb24oKTsKKworICAgIC8vIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydGluZyBwb3NpdGlvbgorICAgIGFzc2VydEVxdWFscyhURVNUX1NUQVRFX0RFU1RST1lfUE9TSVRJT04sIGN1cnJlbnRQb3NpdGlvbik7Cis8L3ByZT4KKzxwPgorICAgIFRoZSBrZXkgbWV0aG9kIHVzZWQgaGVyZSBpcworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTIjZ2V0QWN0aXZpdHkoKX0sIHdoaWNoIGlzIGEKKyAgICBwYXJ0IG9mIHRoZSBpbnN0cnVtZW50YXRpb24gQVBJLiBUaGUgQWN0aXZpdHkgdW5kZXIgdGVzdCBpcyBub3Qgc3RhcnRlZCB1bnRpbCB5b3UgY2FsbCB0aGlzCisgICAgbWV0aG9kLiBZb3UgY2FuIHNldCB1cCB0aGUgdGVzdCBmaXh0dXJlIGluIGFkdmFuY2UsIGFuZCB0aGVuIGNhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGhlCisgICAgQWN0aXZpdHkuCis8L3A+Cis8cD4KKyAgICBBbHNvLCBpbnN0cnVtZW50YXRpb24gY2FuIGxvYWQgYm90aCBhIHRlc3QgcGFja2FnZSBhbmQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgaW50byB0aGUKKyAgICBzYW1lIHByb2Nlc3MuIFNpbmNlIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnRzIGFuZCB0aGVpciB0ZXN0cyBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywgdGhlCisgICAgdGVzdHMgY2FuIGludm9rZSBtZXRob2RzIGluIHRoZSBjb21wb25lbnRzLCBhbmQgbW9kaWZ5IGFuZCBleGFtaW5lIGZpZWxkcyBpbiB0aGUgY29tcG9uZW50cy4KKzwvcD4KKzxoMyBpZD0iVGVzdENhc2VDbGFzc2VzIj5UZXN0IGNhc2UgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBBbmRyb2lkIHByb3ZpZGVzIHNldmVyYWwgdGVzdCBjYXNlIGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZX0gYW5kCisgICAge0BsaW5rIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9IHdpdGggQW5kcm9pZC1zcGVjaWZpYyBzZXR1cCwgdGVhcmRvd24sIGFuZCBoZWxwZXIgbWV0aG9kcy4KKzwvcD4KKzxoNCBpZD0iQW5kcm9pZFRlc3RDYXNlIj5BbmRyb2lkVGVzdENhc2U8L2g0PgorPHA+CisgICAgQSB1c2VmdWwgZ2VuZXJhbCB0ZXN0IGNhc2UgY2xhc3MsIGVzcGVjaWFsbHkgaWYgeW91IGFyZQorICAgIGp1c3Qgc3RhcnRpbmcgb3V0IHdpdGggQW5kcm9pZCB0ZXN0aW5nLCBpcyB7QGxpbmsgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZX0uIEl0IGV4dGVuZHMKKyAgICBib3RoIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2V9IGFuZCB7QGxpbmsganVuaXQuZnJhbWV3b3JrLkFzc2VydH0uIEl0IHByb3ZpZGVzIHRoZQorICAgIEpVbml0LXN0YW5kYXJkIDxjb2RlPnNldFVwKCk8L2NvZGU+IGFuZCA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiBtZXRob2RzLCBhcyB3ZWxsIGFzIHdlbGwgYXMKKyAgICBhbGwgb2YgSlVuaXQncyBBc3NlcnQgbWV0aG9kcy4gSW4gYWRkaXRpb24sIGl0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHRlc3RpbmcgcGVybWlzc2lvbnMsIGFuZCBhCisgICAgbWV0aG9kIHRoYXQgZ3VhcmRzIGFnYWluc3QgbWVtb3J5IGxlYWtzIGJ5IGNsZWFyaW5nIG91dCBjZXJ0YWluIGNsYXNzIHJlZmVyZW5jZXMuCis8L3A+Cis8aDQgaWQ9IkNvbXBvbmVudFRlc3RDYXNlIj5Db21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlczwvaDQ+Cis8cD4KKyAgICBBIGtleSBmZWF0dXJlIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGlzIGl0cyBjb21wb25lbnQtc3BlY2lmaWMgdGVzdCBjYXNlIGNsYXNzZXMuCisgICAgVGhlc2UgYWRkcmVzcyBzcGVjaWZpYyBjb21wb25lbnQgdGVzdGluZyBuZWVkcyB3aXRoIG1ldGhvZHMgZm9yIGZpeHR1cmUgc2V0dXAgYW5kCisgICAgdGVhcmRvd24gYW5kIGNvbXBvbmVudCBsaWZlY3ljbGUgY29udHJvbC4gVGhleSBhbHNvIHByb3ZpZGUgbWV0aG9kcyBmb3Igc2V0dGluZyB1cCBtb2NrIG9iamVjdHMuCisgICAgVGhlc2UgY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBjb21wb25lbnQtc3BlY2lmaWMgdGVzdGluZyB0b3BpY3M6CiA8L3A+CiA8dWw+Ci0gIDxsaT4KLSAgICBUaGUgPGNvZGU+TW9yZUFzc2VydHM8L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0gdGhhdCBkb2VzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZy4KLSAgPC9saT4KLSAgPGxpPgotICAgIFRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjbGFzcyBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBBbmRyb2lkIFZpZXdzLCBzdWNoIGFzIHtAbGluayBhbmRyb2lkLnRlc3QuVmlld0Fzc2VydHMjYXNzZXJ0SGFzU2NyZWVuQ29vcmRpbmF0ZXN9IHRoYXQgdGVzdHMgaWYgYSBWaWV3IGhhcyBhIHBhcnRpY3VsYXIgWCBhbmQgWQotICAgIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgotICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3RpbmcuaHRtbCI+QWN0aXZpdHkgVGVzdGluZzwvYT4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL2NvbnRlbnRwcm92aWRlcl90ZXN0aW5nLmh0bWwiPgorICAgICAgICBDb250ZW50IFByb3ZpZGVyIFRlc3Rpbmc8L2E+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+U2VydmljZSBUZXN0aW5nPC9hPgorICAgIDwvbGk+CiA8L3VsPgotPGgzIGlkPSJNb2NrT2JqZWN0cyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Ci0gIDxwPgotICAgIEFuZHJvaWQgaGFzIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIG1vY2sgc3lzdGVtIG9iamVjdHMgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGNvbnRleHRzLCBjb250ZW50IHJlc29sdmVycywgYW5kIHJlc291cmNlcy4gQW5kcm9pZCBhbHNvIHByb3ZpZGVzCi0gICAgbWV0aG9kcyBpbiBzb21lIHRlc3QgY2xhc3NlcyBmb3IgY3JlYXRpbmcgbW9jayBJbnRlbnRzLiBVc2UgdGhlc2UgbW9ja3MgdG8gZmFjaWxpdGF0ZSBkZXBlbmRlbmN5IGluamVjdGlvbiwgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHVzZSB0aGFuIGNyZWF0aW5nIHRoZWlyCi0gICAgcmVhbCBjb3VudGVycGFydHMuIFRoZXNlIGNvbnZlbmllbmNlIGNsYXNzZXMgYXJlIGZvdW5kIGluIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LiBUaGV5IGFyZToKLSAgPC9wPgorPHA+CisgICAgQW5kcm9pZCBkb2VzIG5vdCBwcm92aWRlIGEgc2VwYXJhdGUgdGVzdCBjYXNlIGNsYXNzIGZvciBCcm9hZGNhc3RSZWNlaXZlci4gSW5zdGVhZCwgdGVzdCBhCisgICAgQnJvYWRjYXN0UmVjZWl2ZXIgYnkgdGVzdGluZyB0aGUgY29tcG9uZW50IHRoYXQgc2VuZHMgaXQgSW50ZW50IG9iamVjdHMsIHRvIHZlcmlmeSB0aGF0IHRoZQorICAgIEJyb2FkY2FzdFJlY2VpdmVyIHJlc3BvbmRzIGNvcnJlY3RseS4KKzwvcD4KKzxoNCBpZD0iQXBwbGljYXRpb25UZXN0Q2FzZSI+QXBwbGljYXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBZb3UgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0LkFwcGxpY2F0aW9uVGVzdENhc2V9IHRlc3QgY2FzZSBjbGFzcyB0byB0ZXN0IHRoZSBzZXR1cCBhbmQKKyAgICB0ZWFyZG93biBvZiB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwbGljYXRpb259IG9iamVjdHMuIFRoZXNlIG9iamVjdHMgbWFpbnRhaW4gdGhlIGdsb2JhbCBzdGF0ZSBvZgorICAgIGluZm9ybWF0aW9uIHRoYXQgYXBwbGllcyB0byBhbGwgdGhlIGNvbXBvbmVudHMgaW4gYW4gYXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHRlc3QgY2FzZSBjYW4KKyAgICBiZSB1c2VmdWwgaW4gdmVyaWZ5aW5nIHRoYXQgdGhlICZsdDthcHBsaWNhdGlvbiZndDsgZWxlbWVudCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBpcyBjb3JyZWN0bHkKKyAgICBzZXQgdXAuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyB0ZXN0IGNhc2UgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvbnRyb2wgdGVzdGluZyBvZiB0aGUKKyAgICBjb21wb25lbnRzIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHBhY2thZ2UuCis8L3A+Cis8aDQgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RDYXNlIj5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTwvaDQ+Cis8cD4KKyAgICBJZiB5b3Ugd2FudCB0byB1c2UgaW5zdHJ1bWVudGF0aW9uIG1ldGhvZHMgaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIHlvdSBtdXN0IHVzZQorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2V9IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4gVGhlCisgICAge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5fSB0ZXN0IGNhc2VzIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3Mgd2l0aCBvdGhlciBmdW5jdGlvbmFsaXR5IHRoYXQKKyAgICBhc3Npc3RzIGluIEFjdGl2aXR5IHRlc3RpbmcuCis8L3A+CisKKzxoMyBpZD0iQXNzZXJ0aW9uQ2xhc3NlcyI+QXNzZXJ0aW9uIGNsYXNzZXM8L2gzPgorPHA+CisgICAgQmVjYXVzZSBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzc2VzIGV4dGVuZCBKVW5pdCwgeW91IGNhbiB1c2UgYXNzZXJ0aW9uIG1ldGhvZHMgdG8gZGlzcGxheSB0aGUKKyAgICByZXN1bHRzIG9mIHRlc3RzLiBBbiBhc3NlcnRpb24gbWV0aG9kIGNvbXBhcmVzIGFuIGFjdHVhbCB2YWx1ZSByZXR1cm5lZCBieSBhIHRlc3QgdG8gYW4KKyAgICBleHBlY3RlZCB2YWx1ZSwgYW5kIHRocm93cyBhbiBBc3NlcnRpb25FeGNlcHRpb24gaWYgdGhlIGNvbXBhcmlzb24gdGVzdCBmYWlscy4gVXNpbmcgYXNzZXJ0aW9ucworICAgIGlzIG1vcmUgY29udmVuaWVudCB0aGFuIGRvaW5nIGxvZ2dpbmcsIGFuZCBwcm92aWRlcyBiZXR0ZXIgdGVzdCBwZXJmb3JtYW5jZS4KKzwvcD4KKzxwPgorICAgIEJlc2lkZXMgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fSBjbGFzcyBtZXRob2RzLCB0aGUgdGVzdGluZyBBUEkgYWxzbyBwcm92aWRlcworICAgIHRoZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lk1vcmVBc3NlcnRzfSBhbmQge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0c30gY2xhc3NlczoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHN9IGNvbnRhaW5zIG1vcmUgcG93ZXJmdWwgYXNzZXJ0aW9ucyBzdWNoIGFzCisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuTW9yZUFzc2VydHMjYXNzZXJ0Q29udGFpbnNSZWdleH0sIHdoaWNoIGRvZXMgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgIG1hdGNoaW5nLgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlZpZXdBc3NlcnRzfSBjb250YWlucyB1c2VmdWwgYXNzZXJ0aW9ucyBhYm91dCBWaWV3cy4gRm9yIGV4YW1wbGUKKyAgICAgICAgaXQgY29udGFpbnMge0BsaW5rIGFuZHJvaWQudGVzdC5WaWV3QXNzZXJ0cyNhc3NlcnRIYXNTY3JlZW5Db29yZGluYXRlc30gdGhhdCB0ZXN0cyBpZiBhIFZpZXcKKyAgICAgICAgaGFzIGEgcGFydGljdWxhciBYIGFuZCBZIHBvc2l0aW9uIG9uIHRoZSB2aXNpYmxlIHNjcmVlbi4gVGhlc2UgYXNzZXJ0cyBzaW1wbGlmeSB0ZXN0aW5nIG9mCisgICAgICAgIGdlb21ldHJ5IGFuZCBhbGlnbm1lbnQgaW4gdGhlIFVJLgorICAgIDwvbGk+Cis8L3VsPgorPGgzIGlkPSJNb2NrT2JqZWN0Q2xhc3NlcyI+TW9jayBvYmplY3QgY2xhc3NlczwvaDM+Cis8cD4KKyAgICBUbyBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIHRlc3RpbmcsIEFuZHJvaWQgcHJvdmlkZXMgY2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIHN5c3RlbQorICAgIG9iamVjdHMgc3VjaCBhcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IG9iamVjdHMsCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXJ9IG9iamVjdHMsIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyfQorICAgIG9iamVjdHMsIGFuZCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0gb2JqZWN0cy4gU29tZSB0ZXN0IGNhc2VzIGFsc28gcHJvdmlkZSBtb2NrCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IG9iamVjdHMuIFlvdSB1c2UgdGhlc2UgbW9ja3MgYm90aCB0byBpc29sYXRlIHRlc3RzCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtIGFuZCB0byBmYWNpbGl0YXRlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZvciB0ZXN0aW5nLiBUaGVzZSBjbGFzc2VzCisgICAgYXJlIGZvdW5kIGluIHRoZSBKYXZhIHBhY2thZ2VzIHtAbGluayBhbmRyb2lkLnRlc3R9IGFuZCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2t9LgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3RzIGlzb2xhdGUgdGVzdHMgZnJvbSBhIHJ1bm5pbmcgc3lzdGVtIGJ5IHN0dWJiaW5nIG91dCBvciBvdmVycmlkaW5nCisgICAgbm9ybWFsIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBhIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfQorICAgIHJlcGxhY2VzIHRoZSBub3JtYWwgcmVzb2x2ZXIgZnJhbWV3b3JrIHdpdGggaXRzIG93biBsb2NhbCBmcmFtZXdvcmssIHdoaWNoIGlzIGlzb2xhdGVkCisgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLiBNb2NrQ29udGVudFJlc29sdmVyIGFsc28gYWxzbyBzdHVicyBvdXQgdGhlCisgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKFVyaSwgQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0gbWV0aG9kCisgICAgc28gdGhhdCBvYnNlcnZlciBvYmplY3RzIG91dHNpZGUgdGhlIHRlc3QgZW52aXJvbm1lbnQgYXJlIG5vdCBhY2NpZGVudGFsbHkgdHJpZ2dlcmVkLgorPC9wPgorPHA+CisgICAgTW9jayBvYmplY3QgY2xhc3NlcyBhbHNvIGZhY2lsaXRhdGUgZGVwZW5kZW5jeSBpbmplY3Rpb24gYnkgcHJvdmlkaW5nIGEgc3ViY2xhc3Mgb2YgdGhlCisgICAgbm9ybWFsIG9iamVjdCB0aGF0IGlzIG5vbi1mdW5jdGlvbmFsIGV4Y2VwdCBmb3Igb3ZlcnJpZGVzIHlvdSBkZWZpbmUuIEZvciBleGFtcGxlLCB0aGUKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1Jlc291cmNlc30gb2JqZWN0IHByb3ZpZGVzIGEgc3ViY2xhc3Mgb2YKKyAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXN9IGluIHdoaWNoIGFsbCB0aGUgbWV0aG9kcyB0aHJvdyBFeGNlcHRpb25zIHdoZW4gY2FsbGVkLgorICAgIFRvIHVzZSBpdCwgeW91IG92ZXJyaWRlIG9ubHkgdGhvc2UgbWV0aG9kcyB0aGF0IG11c3QgcHJvdmlkZSBpbmZvcm1hdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoZXNlIGFyZSB0aGUgbW9jayBvYmplY3QgY2xhc3NlcyBhdmFpbGFibGUgaW4gQW5kcm9pZDoKKzwvcD4KKzxoNCBpZD0iU2ltcGxlTW9ja3MiPlNpbXBsZSBtb2NrIG9iamVjdCBjbGFzc2VzPC9oND4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb259LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHR9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFByb3ZpZGVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDdXJzb3J9LAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrRGlhbG9nSW50ZXJmYWNlfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tQYWNrYWdlTWFuYWdlcn0sIGFuZAorICAgIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrUmVzb3VyY2VzfSBwcm92aWRlIGEgc2ltcGxlIGFuZCB1c2VmdWwgbW9jayBzdHJhdGVneS4gVGhleSBhcmUKKyAgICBzdHViYmVkLW91dCB2ZXJzaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0gb2JqZWN0IGNsYXNzLCBhbmQgYWxsIG9mIHRoZWlyIG1ldGhvZHMgdGhyb3cgYW4KKyAgICB7QGxpbmsgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBleGNlcHRpb24gaWYgY2FsbGVkLiBUbyB1c2UgdGhlbSwgeW91IG92ZXJyaWRlCisgICAgdGhlIG1ldGhvZHMgeW91IG5lZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBtb2NrIGRlcGVuZGVuY2llcy4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UHJvdmlkZXJ9CisgICAgYW5kIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ3Vyc29yfSBhcmUgbmV3IGFzIG9mIEFQSSBsZXZlbCA4LgorPC9wPgorPGg0IGlkPSJSZXNvbHZlck1vY2tzIj5SZXNvbHZlciBtb2NrIG9iamVjdHM8L2g0PgorPHA+CisgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IHByb3ZpZGVzIGlzb2xhdGVkIHRlc3Rpbmcgb2YgY29udGVudCBwcm92aWRlcnMgYnkKKyAgICBtYXNraW5nIG91dCB0aGUgbm9ybWFsIHN5c3RlbSByZXNvbHZlciBmcmFtZXdvcmsuIEluc3RlYWQgb2YgbG9va2luZyBpbiB0aGUgc3lzdGVtIHRvIGZpbmQgYQorICAgIGNvbnRlbnQgcHJvdmlkZXIgZ2l2ZW4gYW4gYXV0aG9yaXR5IHN0cmluZywgTW9ja0NvbnRlbnRSZXNvbHZlciB1c2VzIGl0cyBvd24gaW50ZXJuYWwgdGFibGUuIFlvdQorICAgIG11c3QgZXhwbGljaXRseSBhZGQgcHJvdmlkZXJzIHRvIHRoaXMgdGFibGUgdXNpbmcKKyAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlciNhZGRQcm92aWRlcihTdHJpbmcsQ29udGVudFByb3ZpZGVyKX0uCis8L3A+Cis8cD4KKyAgICBXaXRoIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBhc3NvY2lhdGUgYSBtb2NrIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBhbiBhdXRob3JpdHkuIFlvdSBjYW4gY3JlYXRlCisgICAgYW4gaW5zdGFuY2Ugb2YgYSByZWFsIHByb3ZpZGVyIGJ1dCB1c2UgdGVzdCBkYXRhIGluIGl0LiBZb3UgY2FuIGV2ZW4gc2V0IHRoZSBwcm92aWRlciBmb3IgYW4KKyAgICBhdXRob3JpdHkgdG8gPGNvZGU+bnVsbDwvY29kZT4uIEluIGVmZmVjdCwgYSBNb2NrQ29udGVudFJlc29sdmVyIG9iamVjdCBpc29sYXRlcyB5b3VyIHRlc3QKKyAgICBmcm9tIHByb3ZpZGVycyB0aGF0IGNvbnRhaW4gcmVhbCBkYXRhLiBZb3UgY2FuIGNvbnRyb2wgdGhlCisgICAgZnVuY3Rpb24gb2YgdGhlIHByb3ZpZGVyLCBhbmQgeW91IGNhbiBwcmV2ZW50IHlvdXIgdGVzdCBmcm9tIGFmZmVjdGluZyByZWFsIGRhdGEuCis8L3A+Cis8aDMgaWQ9IkNvbnRleHRNb2NrcyI+Q29udGV4dHMgZm9yIHRlc3Rpbmc8L2gzPgorPHA+CisgICAgQW5kcm9pZCBwcm92aWRlcyB0d28gQ29udGV4dCBjbGFzc2VzIHRoYXQgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZzoKKzwvcD4KKzx1bD4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSBwcm92aWRlcyBhbiBpc29sYXRlZCB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9LAorICAgICAgICBGaWxlLCBkaXJlY3RvcnksIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIHRoYXQgdXNlIHRoaXMgQ29udGV4dCB0YWtlIHBsYWNlIGluIGEgdGVzdCBhcmVhLgorICAgICAgICBUaG91Z2ggaXRzIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCwgdGhpcyBDb250ZXh0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHJlc3BvbmQgdG8KKyAgICAgICAgc3lzdGVtIGNhbGxzLgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgY2xhc3MgYWxsb3dzIHlvdSB0byB0ZXN0IGFuIGFwcGxpY2F0aW9uJ3MgZGF0YSBvcGVyYXRpb25zIHdpdGhvdXQgYWZmZWN0aW5nIHJlYWwKKyAgICAgICAgICAgIGRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBvbiB0aGUgZGV2aWNlLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gcHJvdmlkZXMgYSBDb250ZXh0IGluIHdoaWNoCisgICAgICAgIG1vc3QgZnVuY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IGFuIGV4aXN0aW5nIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0sIGJ1dAorICAgICAgICBmaWxlIGFuZCBkYXRhYmFzZSBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGEge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LgorICAgICAgICBUaGUgaXNvbGF0ZWQgcGFydCB1c2VzIGEgdGVzdCBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgc3BlY2lhbCBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMuCisgICAgICAgIFlvdSBjYW4gY29udHJvbCB0aGUgbmFtaW5nIHlvdXJzZWxmLCBvciBsZXQgdGhlIGNvbnN0cnVjdG9yIGRldGVybWluZSBpdCBhdXRvbWF0aWNhbGx5LgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFRoaXMgb2JqZWN0IHByb3ZpZGVzIGEgcXVpY2sgd2F5IHRvIHNldCB1cCBhbiBpc29sYXRlZCBhcmVhIGZvciBkYXRhIG9wZXJhdGlvbnMsCisgICAgICAgICAgICB3aGlsZSBrZWVwaW5nIG5vcm1hbCBmdW5jdGlvbmFsaXR5IGZvciBhbGwgb3RoZXIgQ29udGV4dCBvcGVyYXRpb25zLgorICAgICAgICA8L3A+CisgICAgPC9saT4KKzwvdWw+Cis8aDIgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPlJ1bm5pbmcgVGVzdHM8L2gyPgorPHA+CisgICAgVGVzdCBjYXNlcyBhcmUgcnVuIGJ5IGEgdGVzdCBydW5uZXIgY2xhc3MgdGhhdCBsb2FkcyB0aGUgdGVzdCBjYXNlIGNsYXNzLCBzZXQgdXBzLAorICAgIHJ1bnMsIGFuZCB0ZWFycyBkb3duIGVhY2ggdGVzdC4gQW4gQW5kcm9pZCB0ZXN0IHJ1bm5lciBtdXN0IGFsc28gYmUgaW5zdHJ1bWVudGVkLCBzbyB0aGF0CisgICAgdGhlIHN5c3RlbSB1dGlsaXR5IGZvciBzdGFydGluZyBhcHBsaWNhdGlvbnMgY2FuIGNvbnRyb2wgaG93IHRoZSB0ZXN0IHBhY2thZ2UKKyAgICBsb2FkcyB0ZXN0IGNhc2VzIGFuZCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gWW91IHRlbGwgdGhlIEFuZHJvaWQgcGxhdGZvcm0KKyAgICB3aGljaCBpbnN0cnVtZW50ZWQgdGVzdCBydW5uZXIgdG8gdXNlIGJ5IHNldHRpbmcgYSB2YWx1ZSBpbiB0aGUgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwPgorICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0gaXMgdGhlIHByaW1hcnkgQW5kcm9pZCB0ZXN0IHJ1bm5lciBjbGFzcy4gSXQKKyAgICBleHRlbmRzIHRoZSBKVW5pdCB0ZXN0IHJ1bm5lciBmcmFtZXdvcmsgYW5kIGlzIGFsc28gaW5zdHJ1bWVudGVkLiBJdCBjYW4gcnVuIGFueSBvZiB0aGUgdGVzdAorICAgIGNhc2UgY2xhc3NlcyBwcm92aWRlZCBieSBBbmRyb2lkIGFuZCBzdXBwb3J0cyBhbGwgcG9zc2libGUgdHlwZXMgb2YgdGVzdGluZy4KKzwvcD4KKzxwPgorICAgIFlvdSBzcGVjaWZ5IDxjb2RlPkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXI8L2NvZGU+IG9yIGEgc3ViY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UncworICAgIG1hbmlmZXN0IGZpbGUsIGluIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2luc3RydW1lbnRhdGlvbi1lbGVtZW50Lmh0bWwiPgorICAgIGluc3RydW1lbnRhdGlvbjwvYT4gZWxlbWVudC4gQWxzbywgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gY29kZSByZXNpZGVzCisgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5IDxjb2RlPmFuZHJvaWQudGVzdC5ydW5uZXI8L2NvZGU+LCAgd2hpY2ggaXMgbm90IG5vcm1hbGx5IGxpbmtlZCB0bworICAgIEFuZHJvaWQgY29kZS4gVG8gaW5jbHVkZSBpdCwgeW91IG11c3Qgc3BlY2lmeSBpdCBpbiBhCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWxpYnJhcnktZWxlbWVudC5odG1sIj51c2VzLWxpYnJhcnk8L2E+IGVsZW1lbnQuCisgICAgWW91IGRvIG5vdCBoYXZlIHRvIHNldCB1cCB0aGVzZSBlbGVtZW50cyB5b3Vyc2VsZi4gQm90aCBFY2xpcHNlIHdpdGggQURUIGFuZCB0aGUKKyAgICA8Y29kZT5hbmRyb2lkPC9jb2RlPiBjb21tYW5kLWxpbmUgdG9vbCBjb25zdHJ1Y3QgdGhlbSBhdXRvbWF0aWNhbGx5IGFuZCBhZGQgdGhlbSB0byB5b3VyCisgICAgdGVzdCBwYWNrYWdlJ3MgbWFuaWZlc3QgZmlsZS4KKzwvcD4KKzxwIGNsYXNzPSJOb3RlIj4KKyAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSB1c2UgYSB0ZXN0IHJ1bm5lciBvdGhlciB0aGFuCisgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4sIHlvdSBtdXN0IGNoYW5nZSB0aGUgJmx0O2luc3RydW1lbnRhdGlvbiZndDsKKyAgICBlbGVtZW50IHRvIHBvaW50IHRvIHRoZSBjbGFzcyB5b3Ugd2FudCB0byB1c2UuCis8L3A+Cis8cD4KKyAgICBUbyBydW4ge0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSwgeW91IHVzZSBpbnRlcm5hbCBzeXN0ZW0gY2xhc3NlcyBjYWxsZWQgYnkKKyAgICBBbmRyb2lkIHRvb2xzLiBXaGVuIHlvdSBydW4gYSB0ZXN0IGluIEVjbGlwc2Ugd2l0aCBBRFQsIHRoZSBjbGFzc2VzIGFyZSBjYWxsZWQgYXV0b21hdGljYWxseS4KKyAgICBXaGVuIHlvdSBydW4gYSB0ZXN0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91IHJ1biB0aGVzZSBjbGFzc2VzIHdpdGgKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9hZGIuaHRtbCI+QW5kcm9pZCBEZWJ1ZyBCcmlkZ2UgKGFkYik8L2E+LgorPC9wPgorPHA+CisgICAgVGhlIHN5c3RlbSBjbGFzc2VzIGxvYWQgYW5kIHN0YXJ0IHRoZSB0ZXN0IHBhY2thZ2UsIGtpbGwgYW55IHByb2Nlc3NlcyB0aGF0CisgICAgYXJlIHJ1bm5pbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIGFuZCB0aGVuIGxvYWQgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCisgICAgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhleSB0aGVuIHBhc3MgY29udHJvbCB0bworICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0sIHdoaWNoIHJ1bnMKKyAgICBlYWNoIHRlc3QgY2FzZSBjbGFzcyBpbiB0aGUgdGVzdCBwYWNrYWdlLiBZb3UgY2FuIGFsc28gY29udHJvbCB3aGljaCB0ZXN0IGNhc2VzIGFuZAorICAgIG1ldGhvZHMgYXJlIHJ1biB1c2luZyBzZXR0aW5ncyBpbiBFY2xpcHNlIHdpdGggQURULCBvciB1c2luZyBmbGFncyB3aXRoIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMuCis8L3A+Cis8cD4KKyAgICBOZWl0aGVyIHRoZSBzeXN0ZW0gY2xhc3NlcyBub3Ige0BsaW5rIGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyfSBydW4KKyAgICB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gSW5zdGVhZCwgdGhlIHRlc3QgY2FzZSBkb2VzIHRoaXMgZGlyZWN0bHkuIEl0IGVpdGhlciBjYWxscyBtZXRob2RzCisgICAgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QsIG9yIGl0IGNhbGxzIGl0cyBvd24gbWV0aG9kcyB0aGF0IHRyaWdnZXIgbGlmZWN5Y2xlIGV2ZW50cyBpbgorICAgIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgYXBwbGljYXRpb24gaXMgdW5kZXIgdGhlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHRlc3QgY2FzZSwKKyAgICB3aGljaCBhbGxvd3MgaXQgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50ICh0aGUgdGVzdCBmaXh0dXJlKSBiZWZvcmUgcnVubmluZyBhIHRlc3QuIFRoaXMKKyAgICBpcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIHByZXZpb3VzIDxhIGhyZWY9IiNBY3Rpdml0eVNuaXBwZXQiPmNvZGUgc25pcHBldDwvYT4gdGhhdCB0ZXN0cyBhbgorICAgIEFjdGl2aXR5IHRoYXQgZGlzcGxheXMgYSBTcGlubmVyIHdpZGdldC4KKzwvcD4KKzxwPgorICAgIFRvIGxlYXJuIG1vcmUgYWJvdXQgcnVubmluZyB0ZXN0cywgcGxlYXNlIHJlYWQgdGhlIHRvcGljcworICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19lY2xpcHNlLmh0bWwiIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPiBvcgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj4KKyAgICBUZXN0aW5nIGluIE90aGVyIElEZXM8L2E+LgorPC9wPgorPGgyIGlkPSJUZXN0UmVzdWx0cyI+U2VlaW5nIFRlc3QgUmVzdWx0czwvaDI+Cis8cD4KKyAgICBUaGUgQW5kcm9pZCB0ZXN0aW5nIGZyYW1ld29yayByZXR1cm5zIHRlc3QgcmVzdWx0cyBiYWNrIHRvIHRoZSB0b29sIHRoYXQgc3RhcnRlZCB0aGUgdGVzdC4KKyAgICBJZiB5b3UgcnVuIGEgdGVzdCBpbiBFY2xpcHNlIHdpdGggQURULCB0aGUgcmVzdWx0cyBhcmUgZGlzcGxheWVkIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYKKyAgICB5b3UgcnVuIGEgdGVzdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHRoZSByZXN1bHRzIGFyZSBkaXNwbGF5ZWQgaW4gPGNvZGU+U1RET1VUPC9jb2RlPi4gSW4KKyAgICBib3RoIGNhc2VzLCB5b3Ugc2VlIGEgdGVzdCBzdW1tYXJ5IHRoYXQgZGlzcGxheXMgdGhlIG5hbWUgb2YgZWFjaCB0ZXN0IGNhc2UgYW5kIG1ldGhvZCB0aGF0CisgICAgd2FzIHJ1bi4gWW91IGFsc28gc2VlIGFsbCB0aGUgYXNzZXJ0aW9uIGZhaWx1cmVzIHRoYXQgb2NjdXJyZWQuIFRoZXNlIGluY2x1ZGUgcG9pbnRlcnMgdG8gdGhlCisgICAgbGluZSBpbiB0aGUgdGVzdCBjb2RlIHdoZXJlIHRoZSBmYWlsdXJlIG9jY3VycmVkLiBBc3NlcnRpb24gZmFpbHVyZXMgYWxzbyBsaXN0IHRoZSBleHBlY3RlZAorICAgIHZhbHVlIGFuZCBhY3R1YWwgdmFsdWUuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdCByZXN1bHRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgSURFIHRoYXQgeW91IGFyZSB1c2luZy4gVGhlIHRlc3QKKyAgICByZXN1bHRzIGZvcm1hdCBmb3IgRWNsaXBzZSB3aXRoIEFEVCBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sI1J1blRlc3RFY2xpcHNlIj4KKyAgICBUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gVGhlIHRlc3QgcmVzdWx0cyBmb3JtYXQgZm9yIHRlc3RzIHJ1biBmcm9tIHRoZQorICAgIGNvbW1hbmQgbGluZSBpcyBkZXNjcmliZWQgaW4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCNSdW5UZXN0c0NvbW1hbmQiPgorICAgIFRlc3RpbmcgaW4gT3RoZXIgSURFczwvYT4uCis8L3A+Cis8aDIgaWQ9Ik1vbmtleXMiPk1vbmtleSBhbmQgTW9ua2V5UnVubmVyPC9oMj4KKzxwPgorICAgIFRoZSBTREsgcHJvdmlkZXMgdHdvIHRvb2xzIGZvciBmdW5jdGlvbmFsLWxldmVsIGFwcGxpY2F0aW9uIHRlc3Rpbmc6Cis8L3A+CiAgICAgPHVsPgotICAgICAgPGxpPgotICAgICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lklzb2xhdGVkQ29udGV4dH0gLSBNb2NrcyBhIENvbnRleHQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gdXNpbmcgaXQgcnVucyBpbiBpc29sYXRpb24uCi0gICAgICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGhhcyBlbm91Z2ggc3R1YiBjb2RlIHRvIHNhdGlzZnkgT1MgY29kZSB0aGF0IHRyaWVzIHRvIGNvbW11bmljYXRlIHdpdGggY29udGV4dHMuIFRoaXMgY2xhc3MgaXMgdXNlZnVsIGluIHVuaXQgdGVzdGluZy4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIHtAbGluayBhbmRyb2lkLnRlc3QuUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0gLSBEZWxlZ2F0ZXMgbW9zdCBjb250ZXh0IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZywgbm9ybWFsIGNvbnRleHQgd2hpbGUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgZmlsZSBhbmQgZGF0YWJhc2UKLSAgICAgICAgbmFtZXMgaW4gdGhlIGNvbnRleHQuIFVzZSB0aGlzIHRvIHRlc3QgZmlsZSBhbmQgZGF0YWJhc2Ugb3BlcmF0aW9ucyB3aXRoIGEgbm9ybWFsIHN5c3RlbSBjb250ZXh0LCB1c2luZyB0ZXN0IG5hbWVzLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tBcHBsaWNhdGlvbn0sIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZXh0fSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tEaWFsb2dJbnRlcmZhY2V9LCB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyfSwKLSAgICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tSZXNvdXJjZXN9IC0gQ2xhc3NlcyB0aGF0IGNyZWF0ZSBtb2NrIEFuZHJvaWQgc3lzdGVtIG9iamVjdHMgZm9yIHVzZSBpbiB0ZXN0aW5nLiBUaGV5IGV4cG9zZSBvbmx5IHRob3NlIG1ldGhvZHMgdGhhdCBhcmUKLSAgICAgICAgdXNlZnVsIGluIG1hbmFnaW5nIHRoZSBvYmplY3QuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzIHNpbXBseSB0aHJvdyBhbiBFeGNlcHRpb24uIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXh0ZW5kIHRoZSBjbGFzc2VzIGFuZAotICAgICAgICBvdmVycmlkZSBhbnkgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCi0gICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9tb25rZXkuaHRtbCI+TW9ua2V5PC9hPiBpcyBhIGNvbW1hbmQtbGluZQorICAgICAgICAgICAgdG9vbCB0aGF0IHNlbmRzIHBzZXVkby1yYW5kb20gc3RyZWFtcyBvZiBrZXlzdHJva2VzLCB0b3VjaGVzLCBhbmQgZ2VzdHVyZXMgdG8gYQorICAgICAgICAgICAgZGV2aWNlLiBZb3UgcnVuIGl0IHdpdGggdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2FkYi5odG1sIj4KKyAgICAgICAgICAgIEFuZHJvaWQgRGVidWcgQnJpZGdlPC9hPiAoYWRiKSB0b29sLiBZb3UgdXNlIGl0IHRvIHN0cmVzcy10ZXN0IHlvdXIgYXBwbGljYXRpb24gYW5kCisgICAgICAgICAgICByZXBvcnQgYmFjayBlcnJvcnMgdGhhdCBhcmUgZW5jb3VudGVyZWQuIFlvdSBjYW4gcmVwZWF0IGEgc3RyZWFtIG9mIGV2ZW50cyBieQorICAgICAgICAgICAgcnVubmluZyB0aGUgdG9vbCBlYWNoIHRpbWUgd2l0aCB0aGUgc2FtZSByYW5kb20gbnVtYmVyIHNlZWQuCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9tb25rZXlydW5uZXIuaHRtbCI+TW9ua2V5UnVubmVyPC9hPiBpcyBhCisgICAgICAgICAgICBKeXRob24gQVBJIHRoYXQgeW91IHVzZSBpbiB0ZXN0IHByb2dyYW1zIHdyaXR0ZW4gaW4gUHl0aG9uLiBUaGUgQVBJIGluY2x1ZGVzIGZ1bmN0aW9ucworICAgICAgICAgICAgZm9yIGNvbm5lY3RpbmcgdG8gYSBkZXZpY2UsIGluc3RhbGxpbmcgYW5kIHVuaW5zdGFsbGluZyBwYWNrYWdlcywgdGFraW5nIHNjcmVlbnNob3RzLAorICAgICAgICAgICAgY29tcGFyaW5nIHR3byBpbWFnZXMsIGFuZCBydW5uaW5nIGEgdGVzdCBwYWNrYWdlIGFnYWluc3QgYW4gYXBwbGljYXRpb24uIFVzaW5nIHRoZSBBUEkKKyAgICAgICAgICAgIHdpdGggUHl0aG9uLCB5b3UgY2FuIHdyaXRlIGEgd2lkZSByYW5nZSBvZiBsYXJnZSwgcG93ZXJmdWwsIGFuZCBjb21wbGV4IHRlc3RzLgorICAgICAgICA8L2xpPgogICAgIDwvdWw+Ci08aDMgaWQ9Ikluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiPkluc3RydW1lbnRhdGlvbiBUZXN0IFJ1bm5lcjwvaDM+Cis8aDIgaWQ9IlBhY2thZ2VOYW1lcyI+V29ya2luZyBXaXRoIFBhY2thZ2UgbmFtZXM8L2gyPgogPHA+Ci0gIEFuZHJvaWQgcHJvdmlkZXMgYSBjdXN0b20gY2xhc3MgZm9yIHJ1bm5pbmcgdGVzdHMgd2l0aCBpbnN0cnVtZW50YXRpb24gY2FsbGVkIGNhbGxlZAotICB7QGxpbmsgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXJ9LiBUaGlzIGNsYXNzCi0gIGNvbnRyb2xzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBydW5zIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGFuZCB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpbiB0aGUgc2FtZSBwcm9jZXNzLCBhbmQgcm91dGVzCi0gIHRlc3Qgb3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gVXNpbmcgaW5zdHJ1bWVudGF0aW9uIGlzIGtleSB0byB0aGUgYWJpbGl0eSBvZiA8Y29kZT5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyPC9jb2RlPiB0byBjb250cm9sIHRoZSBlbnRpcmUgdGVzdAotICBlbnZpcm9ubWVudCBhdCBydW50aW1lLiBOb3RpY2UgdGhhdCB5b3UgdXNlIHRoaXMgdGVzdCBydW5uZXIgZXZlbiBpZiB5b3VyIHRlc3QgY2xhc3MgZG9lcyBub3QgaXRzZWxmIHVzZSBpbnN0cnVtZW50YXRpb24uCisgICAgSW4gdGhlIHRlc3QgZW52aXJvbm1lbnQsIHlvdSB3b3JrIHdpdGggYm90aCBBbmRyb2lkIGFwcGxpY2F0aW9uIHBhY2thZ2UgbmFtZXMgYW5kCisgICAgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXJzLiBCb3RoIHVzZSB0aGUgc2FtZSBuYW1pbmcgZm9ybWF0LCBidXQgdGhleSByZXByZXNlbnQgc3Vic3RhbnRpYWxseQorICAgIGRpZmZlcmVudCBlbnRpdGllcy4gWW91IG5lZWQgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSB0byBzZXQgdXAgeW91ciB0ZXN0cyBjb3JyZWN0bHkuCiA8L3A+CiA8cD4KLSAgV2hlbiB5b3UgcnVuIGEgdGVzdCBhcHBsaWNhdGlvbiwgeW91IGZpcnN0IHJ1biBhIHN5c3RlbSB1dGlsaXR5IGNhbGxlZCBBY3Rpdml0eSBNYW5hZ2VyLiBBY3Rpdml0eSBNYW5hZ2VyIHVzZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmcmFtZXdvcmsgdG8gc3RhcnQgYW5kIGNvbnRyb2wgdGhlIHRlc3QgcnVubmVyLCB3aGljaCBpbiB0dXJuIHVzZXMgaW5zdHJ1bWVudGF0aW9uIHRvIHNodXQgZG93biBhbnkgcnVubmluZyBpbnN0YW5jZXMKLSAgb2YgdGhlIG1haW4gYXBwbGljYXRpb24sIHN0YXJ0cyB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIHRoZW4gc3RhcnRzIHRoZSBtYWluIGFwcGxpY2F0aW9uIGluIHRoZSBzYW1lIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbiB0byB3b3JrIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gYXBwbGljYXRpb24uCisgICAgQW4gQW5kcm9pZCBwYWNrYWdlIG5hbWUgaXMgYSB1bmlxdWUgc3lzdGVtIG5hbWUgZm9yIGEgPGNvZGU+LmFwazwvY29kZT4gZmlsZSwgc2V0IGJ5IHRoZQorICAgICZxdW90O2FuZHJvaWQ6cGFja2FnZSZxdW90OyBhdHRyaWJ1dGUgb2YgdGhlICZsdDttYW5pZmVzdCZndDsgZWxlbWVudCBpbiB0aGUgcGFja2FnZSdzCisgICAgbWFuaWZlc3QuIFRoZSBBbmRyb2lkIHBhY2thZ2UgbmFtZSBvZiB5b3VyIHRlc3QgcGFja2FnZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBCeSBkZWZhdWx0LCBBbmRyb2lkIHRvb2xzIGNyZWF0ZSB0aGUKKyAgICB0ZXN0IHBhY2thZ2UgbmFtZSBieSBhcHBlbmRpbmcgIi50ZXN0IiB0byB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgogPC9wPgogPHA+Ci0gIElmIHlvdSBhcmUgZGV2ZWxvcGluZyBpbiBFY2xpcHNlLCB0aGUgQURUIHBsdWdpbiBhc3Npc3RzIHlvdSBpbiB0aGUgc2V0dXAgb2YgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4gb3Igb3RoZXIgdGVzdCBydW5uZXJzLgotICBUaGUgcGx1Z2luIFVJIHByb21wdHMgeW91IHRvIHNwZWNpZnkgdGhlIHRlc3QgcnVubmVyIGNsYXNzIHRvIHVzZSwgYXMgd2VsbCBhcyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LgotICBUaGUgcGx1Z2luIHRoZW4gYWRkcyBhbiA8Y29kZT4mbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgdG8gdGhlIG1hbmlmZXN0IGZpbGUgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uCi0gIEVjbGlwc2Ugd2l0aCBBRFQgYXV0b21hdGljYWxseSBzdGFydHMgYSB0ZXN0IGFwcGxpY2F0aW9uIHVuZGVyIHRoZSBjb250cm9sIG9mIEFjdGl2aXR5IE1hbmFnZXIgdXNpbmcgaW5zdHJ1bWVudGF0aW9uLAotICBhbmQgcmVkaXJlY3RzIHRoZSB0ZXN0IG91dHB1dCB0byB0aGUgRWNsaXBzZSB3aW5kb3cncyBKVW5pdCB2aWV3LgorICAgIFRoZSB0ZXN0IHBhY2thZ2UgYWxzbyB1c2VzIGFuIEFuZHJvaWQgcGFja2FnZSBuYW1lIHRvIHRhcmdldCB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBpdAorICAgIHRlc3RzLiBUaGlzIGlzIHNldCBpbiB0aGUgJnF1b3Q7YW5kcm9pZDp0YXJnZXRQYWNrYWdlJnF1b3Q7IGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAmbHQ7aW5zdHJ1bWVudGF0aW9uJmd0OyBlbGVtZW50IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBtYW5pZmVzdC4KIDwvcD4KIDxwPgotICBJZiB5b3UgcHJlZmVyIHdvcmtpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UgY2FuIHVzZSBBbnQgYW5kIHRoZSA8Y29kZT5hbmRyb2lkPC9jb2RlPgotICB0b29sIHRvIGhlbHAgeW91IHNldCB1cCB5b3VyIHRlc3QgcHJvamVjdHMuIFRvIHJ1biB0ZXN0cyB3aXRoIGluc3RydW1lbnRhdGlvbiwgeW91IGNhbiBhY2Nlc3MgdGhlCi0gIEFjdGl2aXR5IE1hbmFnZXIgdGhyb3VnaCB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPkFuZHJvaWQgRGVidWcKLSAgQnJpZGdlPC9hPiAoPGNvZGU+YWRiPC9jb2RlPikgdG9vbCBhbmQgdGhlIG91dHB1dCBpcyBkaXJlY3RlZCB0byA8Y29kZT5TVERPVVQ8L2NvZGU+LgotPC9wPgotPGgyIGlkPSJUZXN0RW52aXJvbWVudCI+V29ya2luZyBpbiB0aGUgVGVzdCBFbnZpcm9ubWVudDwvaDI+Ci08cD4KLSAgICBUaGUgdGVzdHMgZm9yIGFuIEFuZHJvaWQgYXBwbGljYXRpb24gYXJlIGNvbnRhaW5lZCBpbiBhIHRlc3QgYXBwbGljYXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLiBBIHRlc3QgYXBwbGljYXRpb24gcmVzaWRlcyBpbiBhIHNlcGFyYXRlIEFuZHJvaWQgcHJvamVjdCB0aGF0IGhhcyB0aGUKLSAgICBzYW1lIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcyBhIHJlZ3VsYXIgQW5kcm9pZCBhcHBsaWNhdGlvbi4gVGhlIHRlc3QgcHJvamVjdCBpcyBsaW5rZWQgdG8gdGhlIHByb2plY3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGl0IHRlc3RzCi0gICAgKGtub3duIGFzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0KSBieSBpdHMgbWFuaWZlc3QgZmlsZS4KKyAgICBBIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGFwcGxpZXMgdG8gYSBzb3VyY2UgZmlsZS4gVGhpcyBwYWNrYWdlIG5hbWUgcmVmbGVjdHMgdGhlIGRpcmVjdG9yeQorICAgIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlLiBJdCBhbHNvIGFmZmVjdHMgdGhlIHZpc2liaWxpdHkgb2YgY2xhc3NlcyBhbmQgbWVtYmVycyB0byBlYWNoIG90aGVyLgogPC9wPgogPHA+Ci0gICAgRWFjaCB0ZXN0IGFwcGxpY2F0aW9uIGNvbnRhaW5zIG9uZSBvciBtb3JlIHRlc3QgY2FzZSBjbGFzc2VzIGJhc2VkIG9uIGFuIEFuZHJvaWQgY2xhc3MgZm9yIGEKLSAgICBwYXJ0aWN1bGFyIHR5cGUgb2YgY29tcG9uZW50LiBUaGUgdGVzdCBjYXNlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBkZWZpbmUgdGVzdHMgb24gc29tZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBXaGVuIHlvdSBydW4gdGhlIHRlc3QgYXBwbGljYXRpb24sIEFuZHJvaWQKLSAgICBzdGFydHMgaXQsIGxvYWRzIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGludG8gdGhlIHNhbWUgcHJvY2VzcywgYW5kIHRoZW4gaW52b2tlcyBlYWNoIG1ldGhvZCBpbiB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgIEFuZHJvaWQgdG9vbHMgdGhhdCBjcmVhdGUgdGVzdCBwcm9qZWN0cyBzZXQgdXAgYW4gQW5kcm9pZCB0ZXN0IHBhY2thZ2UgbmFtZSBmb3IgeW91LgorICAgIEZyb20geW91ciBpbnB1dCwgdGhlIHRvb2xzIHNldCB1cCB0aGUgdGVzdCBwYWNrYWdlIG5hbWUgYW5kIHRoZSB0YXJnZXQgcGFja2FnZSBuYW1lIGZvciB0aGUKKyAgICBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgdGhlc2UgdG9vbHMgdG8gd29yaywgdGhlIGFwcGxpY2F0aW9uIHByb2plY3QgbXVzdCBhbHJlYWR5IGV4aXN0LgogPC9wPgogPHA+Ci0gICAgVGhlIHRvb2xzIGFuZCBwcm9jZWR1cmVzIHlvdSB1c2Ugd2l0aCB0ZXN0aW5nIGRlcGVuZCBvbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGFyZSB1c2luZy4gSWYgeW91IHVzZSBFY2xpcHNlLCB0aGVuIHRoZSBBRFQgcGx1ZyBpbiBmb3IgRWNsaXBzZSBwcm92aWRlcyB0b29scyB0aGF0Ci0gICAgYWxsb3cgeW91IHRvIGRldmVsb3AgYW5kIHJ1biB0ZXN0cyBlbnRpcmVseSB3aXRoaW4gRWNsaXBzZS4gVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3RpbmdfZWNsaXBzZS5odG1sIj5UZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUPC9hPi4KLSAgICBJZiB5b3UgdXNlIGFub3RoZXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHRoZW4geW91IHVzZSBBbmRyb2lkJ3MgY29tbWFuZC1saW5lIHRvb2xzLCBhcyBkb2N1bWVudGVkIGluIHRoZSB0b3BpYyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90ZXN0aW5nL3Rlc3Rpbmdfb3RoZXJpZGUuaHRtbCI+VGVzdGluZyBpbiBPdGhlciBJREVzPC9hPi4KKyAgICBCeSBkZWZhdWx0LCB0aGVzZSB0b29scyBzZXQgdGhlIEphdmEgcGFja2FnZSBpZGVudGlmaWVyIGZvciB0aGUgdGVzdCBjbGFzcyB0byBiZSB0aGUgc2FtZQorICAgIGFzIHRoZSBBbmRyb2lkIHBhY2thZ2UgaWRlbnRpZmllci4gWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvIGV4cG9zZQorICAgIG1lbWJlcnMgaW4gdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgYnkgZ2l2aW5nIHRoZW0gcGFja2FnZSB2aXNpYmlsaXR5LiBJZiB5b3UgZG8gdGhpcywKKyAgICBjaGFuZ2Ugb25seSB0aGUgSmF2YSBwYWNrYWdlIGlkZW50aWZpZXIsIG5vdCB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWVzLCBhbmQgY2hhbmdlIG9ubHkgdGhlCisgICAgdGVzdCBjYXNlIHNvdXJjZSBmaWxlcy4gRG8gbm90IGNoYW5nZSB0aGUgSmF2YSBwYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZAorICAgIDxjb2RlPlIuamF2YTwvY29kZT4gY2xhc3MgaW4geW91ciB0ZXN0IHBhY2thZ2UsIGJlY2F1c2UgaXQgd2lsbCB0aGVuIGNvbmZsaWN0IHdpdGggdGhlCisgICAgPGNvZGU+Ui5qYXZhPC9jb2RlPiBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gRG8gbm90IGNoYW5nZSB0aGUgQW5kcm9pZCBwYWNrYWdlIG5hbWUKKyAgICBvZiB5b3VyIHRlc3QgcGFja2FnZSB0byBiZSB0aGUgc2FtZSBhcyB0aGUgYXBwbGljYXRpb24gaXQgdGVzdHMsIGJlY2F1c2UgdGhlbiB0aGVpciBuYW1lcworICAgIHdpbGwgbm8gbG9uZ2VyIGJlIHVuaXF1ZSBpbiB0aGUgc3lzdGVtLgogPC9wPgotPGgzIGlkPSJUZXN0UHJvamVjdHMiPldvcmtpbmcgd2l0aCB0ZXN0IHByb2plY3RzPC9oMz4KKzxoMiBpZD0iV2hhdFRvVGVzdCI+V2hhdCB0byBUZXN0PC9oMj4KIDxwPgotICAgIFRvIHN0YXJ0IHRlc3RpbmcgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgeW91IGNyZWF0ZSBhIHRlc3QgcHJvamVjdCBmb3IgaXQgdXNpbmcgQW5kcm9pZCB0b29scy4gVGhlIHRvb2xzIGNyZWF0ZSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgYW5kIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgbmVlZGVkLgotICAgIFRoZSB0b29scyBhbHNvIGNyZWF0ZSBhIG1hbmlmZXN0IGZpbGUgdGhhdCBsaW5rcyB0aGUgYXBwbGljYXRpb24gaW4gdGhlIHRlc3QgcHJvamVjdCB0byB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdC4gVGhlIHByb2NlZHVyZSBmb3IgY3JlYXRpbmcgYSB0ZXN0IHByb2plY3QgaW4gRWNsaXBzZSB3aXRoCi0gICAgQURUIGlzIGRvY3VtZW50ZWQgaW4gPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbiBFY2xpcHNlLCB3aXRoIEFEVDwvYT4uIFRoZSBwcm9jZWR1cmUgZm9yIGNyZWF0aW5nIGEgdGVzdCBwcm9qZWN0IGZvciB1c2Ugd2l0aCBkZXZlbG9wbWVudAotICAgIHRvb2xzIG90aGVyIHRoYW4gRWNsaXBzZSBpcyBkb2N1bWVudGVkIGluIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rlc3RpbmcvdGVzdGluZ19vdGhlcmlkZS5odG1sIj5UZXN0aW5nIGluIE90aGVyIElERXM8L2E+LgotPC9wPgotPGgzIGlkPSJUZXN0Q2xhc3NlcyI+V29ya2luZyB3aXRoIHRlc3QgY2FzZSBjbGFzc2VzPC9oMz4KLTxwPgotICAgIEEgdGVzdCBhcHBsaWNhdGlvbiBjb250YWlucyBvbmUgb3IgbW9yZSB0ZXN0IGNhc2UgY2xhc3NlcyB0aGF0IGV4dGVuZCBhbiBBbmRyb2lkIHRlc3QgY2FzZSBjbGFzcy4gWW91IGNob29zZSBhIHRlc3QgY2FzZSBjbGFzcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcgYW5kIHRoZQotICAgIHRlc3RzIHlvdSBhcmUgZG9pbmcuIEEgdGVzdCBhcHBsaWNhdGlvbiBjYW4gdGVzdCBkaWZmZXJlbnQgY29tcG9uZW50cywgYnV0IGVhY2ggdGVzdCBjYXNlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHRlc3QgYSBzaW5nbGUgdHlwZSBvZiBjb21wb25lbnQuCi0gICAgVGhlIEFuZHJvaWQgdGVzdCBjYXNlIGNsYXNzZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA8YSBocmVmPSIjVGVzdEFQSSI+VGhlIFRlc3RpbmcgQVBJPC9hPi4KKyAgICBUaGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3doYXRfdG9fdGVzdC5odG1sIj5XaGF0IFRvIFRlc3Q8L2E+CisgICAgZGVzY3JpYmVzIHRoZSBrZXkgZnVuY3Rpb25hbGl0eSB5b3Ugc2hvdWxkIHRlc3QgaW4gYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiwgYW5kIHRoZSBrZXkKKyAgICBzaXR1YXRpb25zIHRoYXQgbWlnaHQgYWZmZWN0IHRoYXQgZnVuY3Rpb25hbGl0eS4KIDwvcD4KIDxwPgotICAgIFNvbWUgQW5kcm9pZCBjb21wb25lbnRzIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIHRlc3QgY2FzZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCB5b3UgY2hvb3NlIGFtb25nIHRoZSBhdmFpbGFibGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0ZXN0cyB5b3Ugd2FudCB0byBkby4gRm9yIGFjdGl2aXRpZXMsCi0gICAgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIHRoZSBjaG9pY2Ugb2YgZWl0aGVyIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTJ9IG9yIHtAbGluayBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2V9LgotPHA+Ci0gICAgPGNvZGU+QWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8L2NvZGU+IGlzIGRlc2lnbmVkIHRvIGRvIGZ1bmN0aW9uYWwgdGVzdGluZywgc28gaXQgdGVzdHMgYWN0aXZpdGllcyBpbiBhIG5vcm1hbCBzeXN0ZW0gaW5mcmFzdHJ1Y3R1cmUuIFlvdSBjYW4gaW5qZWN0IG1vY2tlZCBJbnRlbnRzLCBidXQgbm90Ci0gICAgbW9ja2VkIENvbnRleHRzLiBJbiBnZW5lcmFsLCB5b3UgY2FuJ3QgbW9jayBkZXBlbmRlbmNpZXMgZm9yIHRoZSBhY3Rpdml0eSB1bmRlciB0ZXN0LgorICAgIE1vc3QgdW5pdCB0ZXN0aW5nIGlzIHNwZWNpZmljIHRvIHRoZSBBbmRyb2lkIGNvbXBvbmVudCB5b3UgYXJlIHRlc3RpbmcuCisgICAgVGhlIHRvcGljcyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvYWN0aXZpdHlfdGVzdGluZy5odG1sIj5BY3Rpdml0eSBUZXN0aW5nPC9hPiwKKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Rlc3RpbmcvY29udGVudHByb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+CisgICAgQ29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPiwgYW5kIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdGVzdGluZy9zZXJ2aWNlX3Rlc3RpbmcuaHRtbCI+CisgICAgU2VydmljZSBUZXN0aW5nPC9hPiBlYWNoIGhhdmUgYSBzZWN0aW9uIGVudGl0bGVkICJXaGF0IFRvIFRlc3QiIHRoYXQgbGlzdHMgcG9zc2libGUgdGVzdGluZworICAgIGFyZWFzLgogPC9wPgogPHA+Ci0gICAgSW4gY29tcGFyaXNvbiwgPGNvZGU+QWN0aXZpdHlVbml0VGVzdENhc2U8L2NvZGU+IGlzIGRlc2lnbmVkIGZvciB1bml0IHRlc3RpbmcsIHNvIGl0IHRlc3RzIGFjdGl2aXRpZXMgaW4gYW4gaXNvbGF0ZWQgc3lzdGVtIGluZnJhc3RydWN0dXJlLiBZb3UgY2FuIGluamVjdCBtb2NrZWQgb3Igd3JhcHBlcmVkIGRlcGVuZGVuY2llcyBmb3IKLSAgICB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCwgcGFydGljdWxhcmx5IG1vY2tlZCBDb250ZXh0cy4gT24gdGhlIG90aGVyIGhhbmQsIHdoZW4geW91IHVzZSB0aGlzIHRlc3QgY2FzZSBjbGFzcyB0aGUgYWN0aXZpdHkgdW5kZXIgdGVzdCBydW5zIGluIGlzb2xhdGlvbiBhbmQgY2FuJ3QgaW50ZXJhY3Qgd2l0aCBvdGhlciBhY3Rpdml0aWVzLgorICAgIFdoZW4gcG9zc2libGUsIHlvdSBzaG91bGQgcnVuIHRoZXNlIHRlc3RzIG9uIGFuIGFjdHVhbCBkZXZpY2UuIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCB5b3UgY2FuCisgICAgdXNlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9lbXVsYXRvci5odG1sIj5BbmRyb2lkIEVtdWxhdG9yPC9hPiB3aXRoCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgorICAgIHRoZSBoYXJkd2FyZSwgc2NyZWVucywgYW5kIHZlcnNpb25zIHlvdSB3YW50IHRvIHRlc3QuCis8L3A+Cis8aDIgaWQ9Ik5leHRTdGVwcyI+TmV4dCBTdGVwczwvaDI+Cis8cD4KKyAgICBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGFuZCBydW4gdGVzdHMgaW4gRWNsaXBzZSwgcGxlYXNlIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX2VjbGlwc2UuaHRtbCI+VGVzdGluZyBpbgorICAgIEVjbGlwc2UsIHdpdGggQURUPC9hPi4gSWYgeW91J3JlIG5vdCB3b3JraW5nIGluIEVjbGlwc2UsIHJlZmVyIHRvIDxhCisgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdGVzdGluZy90ZXN0aW5nX290aGVyaWRlLmh0bWwiPlRlc3RpbmcgaW4gT3RoZXIKKyAgICBJREVzPC9hPi4KIDwvcD4KIDxwPgotICAgIEFzIGEgcnVsZSBvZiB0aHVtYiwgaWYgeW91IHdhbnRlZCB0byB0ZXN0IGFuIGFjdGl2aXR5J3MgaW50ZXJhY3Rpb24gd2l0aCB0aGUgcmVzdCBvZiBBbmRyb2lkLCB5b3Ugd291bGQgdXNlIDxjb2RlPkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPC9jb2RlPi4gSWYgeW91IHdhbnRlZCB0byBkbyByZWdyZXNzaW9uIHRlc3RpbmcKLSAgICBvbiBhbiBhY3Rpdml0eSwgeW91IHdvdWxkIHVzZSA8Y29kZT5BY3Rpdml0eVVuaXRUZXN0Q2FzZTwvY29kZT4uCisgICAgSWYgeW91IHdhbnQgYSBzdGVwLWJ5LXN0ZXAgaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgdGVzdGluZywgdHJ5IG9uZSBvZiB0aGUKKyAgICB0ZXN0aW5nIHR1dG9yaWFscyBvciBzYW1wbGUgdGVzdCBwYWNrYWdlczoKIDwvcD4KLTxoMyBpZD0iVGVzdHMiPldvcmtpbmcgd2l0aCB0ZXN0IG1ldGhvZHM8L2gzPgotPHA+Ci0gICAgRWFjaCB0ZXN0IGNhc2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IHlvdSB1c2UgdG8gc2V0IHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCBjb250cm9sIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBGb3IgZXhhbXBsZSwgYWxsIHRlc3QgY2FzZSBjbGFzc2VzIHByb3ZpZGUgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKSBzZXRVcCgpfQotICAgIG1ldGhvZCB0aGF0IHlvdSBjYW4gb3ZlcnJpZGUgdG8gc2V0IHVwIGZpeHR1cmVzLiBJbiBhZGRpdGlvbiwgeW91IGFkZCBtZXRob2RzIHRvIHRoZSBjbGFzcyB0byBkZWZpbmUgaW5kaXZpZHVhbCB0ZXN0cy4gRWFjaCBtZXRob2QgeW91IGFkZCBpcyBydW4gb25jZSBlYWNoIHRpbWUgeW91IHJ1biB0aGUgdGVzdCBhcHBsaWNhdGlvbi4gSWYgeW91IG92ZXJyaWRlIHRoZSA8Y29kZT5zZXRVcCgpPC9jb2RlPgotICAgIG1ldGhvZCwgaXQgcnVucyBiZWZvcmUgZWFjaCBvZiB5b3VyIG1ldGhvZHMuIFNpbWlsYXJseSwgdGhlIEpVbml0IHtAbGluayBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKSB0ZWFyRG93bigpfSBtZXRob2QgaXMgcnVuIG9uY2UgYWZ0ZXIgZWFjaCBvZiB5b3VyIG1ldGhvZHMuCi08L3A+Ci08cD4KLSAgICBUaGUgdGVzdCBjYXNlIGNsYXNzZXMgZ2l2ZSB5b3Ugc3Vic3RhbnRpYWwgY29udHJvbCBvdmVyIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBjb21wb25lbnRzLiBGb3IgdGhpcyByZWFzb24sIHlvdSBoYXZlIHRvIHNwZWNpZmljYWxseSB0ZWxsIEFuZHJvaWQgdG8gc3RhcnQgYSBjb21wb25lbnQgYmVmb3JlIHlvdSBydW4gdGVzdHMgYWdhaW5zdCBpdC4gRm9yIGV4YW1wbGUsIHlvdSB1c2UgdGhlCi0gICAge0BsaW5rIGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMiNnZXRBY3Rpdml0eSgpfSBtZXRob2QgdG8gc3RhcnQgdGhlIGFjdGl2aXR5IHVuZGVyIHRlc3QuIFlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBvbmNlIGR1cmluZyB0aGUgZW50aXJlIHRlc3QgY2FzZSwgb3Igb25jZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZC4gWW91IGNhbiBldmVuIGRlc3Ryb3kgdGhlCi0gICAgYWN0aXZpdHkgdW5kZXIgdGVzdCBieSBjYWxsaW5nIGl0cyB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjZmluaXNoKCl9IG1ldGhvZCBhbmQgdGhlbiByZXN0YXJ0IGl0IHdpdGggPGNvZGU+Z2V0QWN0aXZpdHkoKTwvY29kZT4gd2l0aGluIGEgc2luZ2xlIHRlc3QgbWV0aG9kLgotPC9wPgotPGgzIGlkPSJSdW5UZXN0cyI+UnVubmluZyB0ZXN0cyBhbmQgc2VlaW5nIHRoZSByZXN1bHRzPC9oMz4KLTxwPgotICAgIFRvIHJ1biB5b3VyIHRlc3RzLCB5b3UgYnVpbGQgeW91ciB0ZXN0IHByb2plY3QgYW5kIHRoZW4gcnVuIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBzeXN0ZW0gdXRpbGl0eSBBY3Rpdml0eSBNYW5hZ2VyIHdpdGggaW5zdHJ1bWVudGF0aW9uLiBZb3UgcHJvdmlkZSB0byBBY3Rpdml0eSBNYW5hZ2VyIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHJ1bm5lciAodXN1YWxseQotICAgIHtAbGluayBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcn0pIHlvdSBzcGVjaWZpZWQgZm9yIHlvdXIgYXBwbGljYXRpb247IHRoZSBuYW1lIGluY2x1ZGVzIGJvdGggeW91ciB0ZXN0IGFwcGxpY2F0aW9uJ3MgcGFja2FnZSBuYW1lIGFuZCB0aGUgdGVzdCBydW5uZXIgY2xhc3MgbmFtZS4gQWN0aXZpdHkgTWFuYWdlciBsb2FkcyBhbmQgc3RhcnRzIHlvdXIKLSAgICB0ZXN0IGFwcGxpY2F0aW9uLCBraWxscyBhbnkgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LCBsb2FkcyBhbiBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCBpbnRvIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIHRlc3QgYXBwbGljYXRpb24sIGFuZCB0aGVuIHBhc3NlcyBjb250cm9sIHRvIHRoZSBmaXJzdCB0ZXN0IGNhc2UKLSAgICBjbGFzcyBpbiB5b3VyIHRlc3QgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHJ1bm5lciB0aGVuIHRha2VzIGNvbnRyb2wgb2YgdGhlIHRlc3RzLCBydW5uaW5nIGVhY2ggb2YgeW91ciB0ZXN0IG1ldGhvZHMgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGVzdCB1bnRpbCBhbGwgdGhlIG1ldGhvZHMgaW4gYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbiBydW4uCi08L3A+Ci08cD4KLSAgICBJZiB5b3UgcnVuIGEgdGVzdCB3aXRoaW4gRWNsaXBzZSB3aXRoIEFEVCwgdGhlIG91dHB1dCBhcHBlYXJzIGluIGEgbmV3IEpVbml0IHZpZXcgcGFuZS4gSWYgeW91IHJ1biBhIHRlc3QgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgb3V0cHV0IGdvZXMgdG8gU1RET1VULgotPC9wPgotPGgyIGlkPSJUZXN0QXJlYXMiPldoYXQgdG8gVGVzdDwvaDI+Ci08cD4KLSAgSW4gYWRkaXRpb24gdG8gdGhlIGZ1bmN0aW9uYWwgYXJlYXMgeW91IHdvdWxkIG5vcm1hbGx5IHRlc3QsIGhlcmUgYXJlIHNvbWUgYXJlYXMKLSAgb2YgQW5kcm9pZCBhcHBsaWNhdGlvbiB0ZXN0aW5nIHRoYXQgeW91IHNob3VsZCBjb25zaWRlcjoKLTwvcD4KLSAgPHVsPgorPHVsPgogICAgIDxsaT4KLSAgICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBldmVudHM6IFlvdSBzaG91bGQgdGVzdCB0aGF0IHlvdXIgYWN0aXZpdGllcyBoYW5kbGUgbGlmZWN5Y2xlIGV2ZW50cyBjb3JyZWN0bHkuIEZvciBleGFtcGxlCi0gICAgICBhbiBhY3Rpdml0eSBzaG91bGQgcmVzcG9uZCB0byBwYXVzZSBvciBkZXN0cm95IGV2ZW50cyBieSBzYXZpbmcgaXRzIHN0YXRlLiBSZW1lbWJlciB0aGF0IGV2ZW4gYSBjaGFuZ2UgaW4gc2NyZWVuIG9yaWVudGF0aW9uCi0gICAgICBjYXVzZXMgdGhlIGN1cnJlbnQgYWN0aXZpdHkgdG8gYmUgZGVzdHJveWVkLCBzbyB5b3Ugc2hvdWxkIHRlc3QgdGhhdCBhY2NpZGVudGFsIGRldmljZSBtb3ZlbWVudHMgZG9uJ3QgYWNjaWRlbnRhbGx5IGxvc2UgdGhlCi0gICAgICBhcHBsaWNhdGlvbiBzdGF0ZS4KKyAgICAgICAgVGhlIDxhCisgICAgICAgIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvdHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCI+SGVsbG8sCisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGludHJvZHVjZXMgYmFzaWMgdGVzdGluZyBjb25jZXB0cyBhbmQgcHJvY2VkdXJlcyBpbiB0aGUKKyAgICAgICAgY29udGV4dCBvZiB0aGUgSGVsbG8sIFdvcmxkIGFwcGxpY2F0aW9uLgogICAgIDwvbGk+CiAgICAgPGxpPgotICAgICAgRGF0YWJhc2Ugb3BlcmF0aW9uczogWW91IHNob3VsZCBlbnN1cmUgdGhhdCBkYXRhYmFzZSBvcGVyYXRpb25zIGNvcnJlY3RseSBoYW5kbGUgY2hhbmdlcyB0byB0aGUgYXBwbGljYXRpb24ncyBzdGF0ZS4KLSAgICAgIFRvIGRvIHRoaXMsIHVzZSBtb2NrIG9iamVjdHMgZnJvbSB0aGUgcGFja2FnZSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2sgYW5kcm9pZC50ZXN0Lm1vY2t9LgorICAgICAgICBUaGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9hY3Rpdml0eV90ZXN0Lmh0bWwiPkFjdGl2aXR5CisgICAgICAgIFRlc3Rpbmc8L2E+IHR1dG9yaWFsIGlzIGFuIGV4Y2VsbGVudCBmb2xsb3ctdXAgdG8gdGhlIEhlbGxvLCBUZXN0aW5nIHR1dG9yaWFsLgorICAgICAgICBJdCBndWlkZXMgeW91IHRocm91Z2ggYSBtb3JlIGNvbXBsZXggdGVzdGluZyBzY2VuYXJpbyB0aGF0IHlvdSBkZXZlbG9wIGFnYWluc3QgYQorICAgICAgICBtb3JlIHJlYWxpc3RpYyBhcHBsaWNhdGlvbi4KICAgICA8L2xpPgogICAgIDxsaT4KLSAgICAgICAgU2NyZWVuIHNpemVzIGFuZCByZXNvbHV0aW9uczogQmVmb3JlIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG1ha2Ugc3VyZSB0byB0ZXN0IGl0IG9uIGFsbCBvZiB0aGUKLSAgICAgICAgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgb24gd2hpY2ggeW91IHdhbnQgaXQgdG8gcnVuLiBZb3UgY2FuIHRlc3QgdGhlIGFwcGxpY2F0aW9uIG9uIG11bHRpcGxlIHNpemVzIGFuZCBkZW5zaXRpZXMgdXNpbmcKLSAgICAgICAgQVZEcywgb3IgeW91IGNhbiB0ZXN0IHlvdXIgYXBwbGljYXRpb24gZGlyZWN0bHkgb24gdGhlIGRldmljZXMgdGhhdCB5b3UgYXJlIHRhcmdldGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQotICAgICAgICB0aGUgdG9waWMgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZSBTY3JlZW5zPC9hPi4KKyAgICAgICAgVGhlIHNhbXBsZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL05vdGVQYWRUZXN0Ij5Ob3RlIFBhZCBUZXN0PC9hPiBpcyBhbiBleGFtcGxlIG9mCisgICAgICAgIHRlc3RpbmcgYSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uIEl0IGNvbnRhaW5zIGEgc2V0IG9mIHVuaXQgdGVzdHMgZm9yIHRoZQorICAgICAgICBOb3RlIFBhZCBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0uCiAgICAgPC9saT4KLSAgPC91bD4KLTxwPgotICBXaGVuIHBvc3NpYmxlLCB5b3Ugc2hvdWxkIHJ1biB0aGVzZSB0ZXN0cyBvbiBhbiBhY3R1YWwgZGV2aWNlLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgeW91IGNhbgotICB1c2UgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwiPkFuZHJvaWQgRW11bGF0b3I8L2E+IHdpdGgKLSAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYXZkLmh0bWwiPkFuZHJvaWQgVmlydHVhbCBEZXZpY2VzPC9hPiBjb25maWd1cmVkIGZvcgotICB0aGUgaGFyZHdhcmUsIHNjcmVlbnMsIGFuZCB2ZXJzaW9ucyB5b3Ugd2FudCB0byB0ZXN0LgotPC9wPgotPGgyIGlkPSJVSVRlc3RpbmciPkFwcGVuZGl4OiBVSSBUZXN0aW5nIE5vdGVzPC9oMj4KLTxwPgotICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGhhdmUgdGlwcyBmb3IgdGVzdGluZyB0aGUgVUkgb2YgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uLCBzcGVjaWZpY2FsbHkKLSAgdG8gaGVscCB5b3UgaGFuZGxlIGFjdGlvbnMgdGhhdCBydW4gaW4gdGhlIFVJIHRocmVhZCwgdG91Y2ggc2NyZWVuIGFuZCBrZXlib2FyZCBldmVudHMsIGFuZCBob21lCi0gIHNjcmVlbiB1bmxvY2sgZHVyaW5nIHRlc3RpbmcuCi08L3A+Ci08aDMgaWQ9IlJ1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIHRocmVhZDwvaDM+Ci08cD4KLSAgQW4gYXBwbGljYXRpb24ncyBhY3Rpdml0aWVzIHJ1biBvbiB0aGUgYXBwbGljYXRpb24ncyA8c3Ryb25nPlVJIHRocmVhZDwvc3Ryb25nPi4gT25jZSB0aGUKLSAgVUkgaXMgaW5zdGFudGlhdGVkLCBmb3IgZXhhbXBsZSBpbiB0aGUgYWN0aXZpdHkncyA8Y29kZT5vbkNyZWF0ZSgpPC9jb2RlPiBtZXRob2QsIHRoZW4gYWxsCi0gIGludGVyYWN0aW9ucyB3aXRoIHRoZSBVSSBtdXN0IHJ1biBpbiB0aGUgVUkgdGhyZWFkLiBXaGVuIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIG5vcm1hbGx5LCBpdAotICBoYXMgYWNjZXNzIHRvIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KLTwvcD4KLTxwPgotICBUaGlzIGNoYW5nZXMgd2hlbiB5b3UgcnVuIHRlc3RzIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uLiBXaXRoIGluc3RydW1lbnRhdGlvbi1iYXNlZCBjbGFzc2VzLAotICB5b3UgY2FuIGludm9rZSBtZXRob2RzIGFnYWluc3QgdGhlIFVJIG9mIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBUaGUgb3RoZXIgdGVzdCBjbGFzc2VzIGRvbid0IGFsbG93IHRoaXMuCi0gIFRvIHJ1biBhbiBlbnRpcmUgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGUgdGhyZWFkIHdpdGggPGNvZGU+QFVJVGhyZWFkVGVzdDwvY29kZT4uCi0gIE5vdGljZSB0aGF0IHRoaXMgd2lsbCBydW4gPGVtPmFsbDwvZW0+IG9mIHRoZSBtZXRob2Qgc3RhdGVtZW50cyBvbiB0aGUgVUkgdGhyZWFkLiAgTWV0aG9kcyB0aGF0IGRvIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSBVSQotICBhcmUgbm90IGFsbG93ZWQ7IGZvciBleGFtcGxlLCB5b3UgY2FuJ3QgaW52b2tlIDxjb2RlPkluc3RydW1lbnRhdGlvbi53YWl0Rm9ySWRsZVN5bmMoKTwvY29kZT4uCi08L3A+Ci08cD4KLSAgVG8gcnVuIGEgc3Vic2V0IG9mIGEgdGVzdCBtZXRob2Qgb24gdGhlIFVJIHRocmVhZCwgY3JlYXRlIGFuIGFub255bW91cyBjbGFzcyBvZiB0eXBlCi0gIDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiwgcHV0IHRoZSBzdGF0ZW1lbnRzIHlvdSB3YW50IGluIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kLCBhbmQgaW5zdGFudGlhdGUgYSBuZXcKLSAgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBtZXRob2QgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT4ucnVuT25VaVRocmVhZCgpPC9jb2RlPiwgd2hlcmUKLSAgPGNvZGU+PGVtPmFwcEFjdGl2aXR5PC9lbT48L2NvZGU+IGlzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwIHlvdSBhcmUgdGVzdGluZy4KLTwvcD4KLTxwPgotICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIGluc3RhbnRpYXRlcyBhbiBhY3Rpdml0eSB0byB0ZXN0LCByZXF1ZXN0cyBmb2N1cyAoYSBVSSBhY3Rpb24pIGZvciB0aGUgU3Bpbm5lciBkaXNwbGF5ZWQKLSAgYnkgdGhlIGFjdGl2aXR5LCBhbmQgdGhlbiBzZW5kcyBhIGtleSB0byBpdC4gTm90aWNlIHRoYXQgdGhlIGNhbGxzIHRvIDxjb2RlPndhaXRGb3JJZGxlU3luYzwvY29kZT4gYW5kIDxjb2RlPnNlbmRLZXlzPC9jb2RlPgotICBhcmVuJ3QgYWxsb3dlZCB0byBydW4gb24gdGhlIFVJIHRocmVhZDo8L3A+Ci08cHJlPgotICBwcml2YXRlIE15QWN0aXZpdHkgbUFjdGl2aXR5OyAvLyBNeUFjdGl2aXR5IGlzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhcHAgdW5kZXIgdGVzdAotICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7Ci0KLSAgLi4uCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICBtSW5zdHJ1bWVudGF0aW9uID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0KLSAgICAgIG1BY3Rpdml0eSA9IGdldEFjdGl2aXR5KCk7IC8vIGdldCBhIHJlZmVyZW5jZXMgdG8gdGhlIGFwcCB1bmRlciB0ZXN0Ci0KLSAgICAgIC8qCi0gICAgICAgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG1haW4gd2lkZ2V0IG9mIHRoZSBhcHAgdW5kZXIgdGVzdCwgYSBTcGlubmVyCi0gICAgICAgKi8KLSAgICAgIG1TcGlubmVyID0gKFNwaW5uZXIpIG1BY3Rpdml0eS5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuZGVtby5teWFjdGl2aXR5LlIuaWQuU3Bpbm5lcjAxKTsKLQotICAuLi4KLQotICBwdWJsaWMgdm9pZCBhVGVzdCgpIHsKLSAgICAgIC8qCi0gICAgICAgKiByZXF1ZXN0IGZvY3VzIGZvciB0aGUgU3Bpbm5lciwgc28gdGhhdCB0aGUgdGVzdCBjYW4gc2VuZCBrZXkgZXZlbnRzIHRvIGl0Ci0gICAgICAgKiBUaGlzIHJlcXVlc3QgbXVzdCBiZSBydW4gb24gdGhlIFVJIHRocmVhZC4gVG8gZG8gdGhpcywgdXNlIHRoZSBydW5PblVpVGhyZWFkIG1ldGhvZAotICAgICAgICogYW5kIHBhc3MgaXQgYSBSdW5uYWJsZSB0aGF0IGNvbnRhaW5zIGEgY2FsbCB0byByZXF1ZXN0Rm9jdXMgb24gdGhlIFNwaW5uZXIuCi0gICAgICAgKi8KLSAgICAgIG1BY3Rpdml0eS5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgIG1TcGlubmVyLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBtSW5zdHJ1bWVudGF0aW9uLndhaXRGb3JJZGxlU3luYygpOwotCi0gICAgICB0aGlzLnNlbmRLZXlzKEtleUV2ZW50LktFWUNPREVfRFBBRF9DRU5URVIpOwotPC9wcmU+Ci0KLTxoMyBpZD0iTm90b3VjaE1vZGUiPlR1cm5pbmcgb2ZmIHRvdWNoIG1vZGU8L2gzPgotPHA+Ci0gIFRvIGNvbnRyb2wgdGhlIGVtdWxhdG9yIG9yIGEgZGV2aWNlIHdpdGgga2V5IGV2ZW50cyB5b3Ugc2VuZCBmcm9tIHlvdXIgdGVzdHMsIHlvdSBtdXN0IHR1cm4gb2ZmCi0gIHRvdWNoIG1vZGUuIElmIHlvdSBkbyBub3QgZG8gdGhpcywgdGhlIGtleSBldmVudHMgYXJlIGlnbm9yZWQuCi08L3A+Ci08cD4KLSAgVG8gdHVybiBvZmYgdG91Y2ggbW9kZSwgeW91IGludm9rZSA8Y29kZT5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMi5zZXRBY3Rpdml0eVRvdWNoTW9kZShmYWxzZSk8L2NvZGU+Ci0gIDxlbT5iZWZvcmU8L2VtPiB5b3UgY2FsbCA8Y29kZT5nZXRBY3Rpdml0eSgpPC9jb2RlPiB0byBzdGFydCB0aGUgYWN0aXZpdHkuIFlvdSBtdXN0IGludm9rZSB0aGUgbWV0aG9kIGluIGEgdGVzdCBtZXRob2QKLSAgdGhhdCBpcyA8ZW0+bm90PC9lbT4gcnVubmluZyBvbiB0aGUgVUkgdGhyZWFkLiBGb3IgdGhpcyByZWFzb24sIHlvdSBjYW4ndCBpbnZva2UgdGhlIHRvdWNoIG1vZGUgbWV0aG9kCi0gIGZyb20gYSB0ZXN0IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIDxjb2RlPkBVSVRocmVhZDwvY29kZT4uIEluc3RlYWQsIGludm9rZSB0aGUgdG91Y2ggbW9kZSBtZXRob2QgZnJvbSA8Y29kZT5zZXRVcCgpPC9jb2RlPi4KLTwvcD4KLTxoMyBpZD0iVW5sb2NrRGV2aWNlIj5VbmxvY2tpbmcgdGhlIGVtdWxhdG9yIG9yIGRldmljZTwvaDM+Ci08cD4KLSAgWW91IG1heSBmaW5kIHRoYXQgVUkgdGVzdHMgZG9uJ3Qgd29yayBpZiB0aGUgZW11bGF0b3IncyBvciBkZXZpY2UncyBob21lIHNjcmVlbiBpcyBkaXNhYmxlZCB3aXRoIHRoZSBrZXlndWFyZCBwYXR0ZXJuLgotICBUaGlzIGlzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgY2FuJ3QgcmVjZWl2ZSBrZXkgZXZlbnRzIHNlbnQgYnkgPGNvZGU+c2VuZEtleXMoKTwvY29kZT4uIFRoZSBiZXN0Ci0gIHdheSB0byBhdm9pZCB0aGlzIGlzIHRvIHN0YXJ0IHlvdXIgZW11bGF0b3Igb3IgZGV2aWNlIGZpcnN0IGFuZCB0aGVuIGRpc2FibGUgdGhlIGtleWd1YXJkIGZvciB0aGUgaG9tZSBzY3JlZW4uCi08L3A+Ci08cD4KLSAgWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgZGlzYWJsZSB0aGUga2V5Z3VhcmQuIFRvIGRvIHRoaXMsCi0gIHlvdSBuZWVkIHRvIGFkZCBhIHBlcm1pc3Npb24gaW4gdGhlIG1hbmlmZXN0IGZpbGUgKDxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+KSBhbmQKLSAgdGhlbiBkaXNhYmxlIHRoZSBrZXlndWFyZCBpbiB5b3VyIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuIE5vdGUsIHRob3VnaCwgdGhhdCB5b3UgZWl0aGVyIGhhdmUgdG8gcmVtb3ZlIHRoaXMgYmVmb3JlCi0gIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24sIG9yIHlvdSBoYXZlIHRvIGRpc2FibGUgaXQgcHJvZ3JhbW1hdGljYWxseSBpbiB0aGUgcHVibGlzaGVkIGFwcC4KLTwvcD4KLTxwPgotICBUbyBhZGQgdGhlIHRoZSBwZXJtaXNzaW9uLCBhZGQgdGhlIGVsZW1lbnQgPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ESVNBQkxFX0tFWUdVQVJEIi8mZ3Q7PC9jb2RlPgotICBhcyBhIGNoaWxkIG9mIHRoZSA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUbyBkaXNhYmxlIHRoZSBLZXlHdWFyZCwgYWRkIHRoZSBmb2xsb3dpbmcgY29kZQotICB0byB0aGUgPGNvZGU+b25DcmVhdGUoKTwvY29kZT4gbWV0aG9kIG9mIGFjdGl2aXRpZXMgeW91IGludGVuZCB0byB0ZXN0OgotPC9wPgotPHByZT4KLSAgbUtleUd1YXJkTWFuYWdlciA9IChLZXlndWFyZE1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoS0VZR1VBUkRfU0VSVklDRSk7Ci0gIG1Mb2NrID0gbUtleUd1YXJkTWFuYWdlci5uZXdLZXlndWFyZExvY2soIjxlbT5hY3Rpdml0eV9jbGFzc25hbWU8L2VtPiIpOwotICBtTG9jay5kaXNhYmxlS2V5Z3VhcmQoKTsKLTwvcHJlPgotPHA+d2hlcmUgPGNvZGU+PGVtPmFjdGl2aXR5X2NsYXNzbmFtZTwvZW0+PC9jb2RlPiBpcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYWN0aXZpdHkuPC9wPgotPGgzIGlkPSJVSVRlc3RUcm91Ymxlc2hvb3RpbmciPlRyb3VibGVzaG9vdGluZyBVSSB0ZXN0czwvaDM+Ci08cD4KLSAgVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgb2YgdGhlIGNvbW1vbiB0ZXN0IGZhaWx1cmVzIHlvdSBtYXkgZW5jb3VudGVyIGluIFVJIHRlc3RpbmcsIGFuZCB0aGVpciBjYXVzZXM6Ci08L3A+Ci08ZGw+Ci0gICAgPGR0Pjxjb2RlPldyb25nVGhyZWFkRXhjZXB0aW9uPC9jb2RlPjwvZHQ+Ci0gICAgPGRkPgotICAgICAgPHA+PHN0cm9uZz5Qcm9ibGVtOjwvc3Ryb25nPjwvcD4KLSAgICAgIEZvciBhIGZhaWxlZCB0ZXN0LCB0aGUgRmFpbHVyZSBUcmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGVycm9yIG1lc3NhZ2U6Ci0gICAgICA8Y29kZT4KLSAgICAgICAgYW5kcm9pZC52aWV3LlZpZXdSb290JENhbGxlZEZyb21Xcm9uZ1RocmVhZEV4Y2VwdGlvbjogT25seSB0aGUgb3JpZ2luYWwgdGhyZWFkIHRoYXQgY3JlYXRlZCBhIHZpZXcgaGllcmFyY2h5IGNhbiB0b3VjaCBpdHMgdmlld3MuCi0gICAgICA8L2NvZGU+Ci0gICAgICA8cD48c3Ryb25nPlByb2JhYmxlIENhdXNlOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgVGhpcyBlcnJvciBpcyBjb21tb24gaWYgeW91IHRyaWVkIHRvIHNlbmQgVUkgZXZlbnRzIHRvIHRoZSBVSSB0aHJlYWQgZnJvbSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuIFRoaXMgY29tbW9ubHkgaGFwcGVucyBpZiB5b3Ugc2VuZCBVSSBldmVudHMKLSAgICAgICAgZnJvbSB0aGUgdGVzdCBhcHBsaWNhdGlvbiwgYnV0IHlvdSBkb24ndCB1c2UgdGhlIDxjb2RlPkBVSVRocmVhZDwvY29kZT4gYW5ub3RhdGlvbiBvciB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBtZXRob2QuIFRoZSB0ZXN0IG1ldGhvZCB0cmllZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBVSSBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCi0gICAgICA8cD48c3Ryb25nPlN1Z2dlc3RlZCBSZXNvbHV0aW9uOjwvc3Ryb25nPjwvcD4KLSAgICAgICAgUnVuIHRoZSBpbnRlcmFjdGlvbiBvbiB0aGUgVUkgdGhyZWFkLiBVc2UgYSB0ZXN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgaW5zdHJ1bWVudGF0aW9uLiBTZWUgdGhlIHByZXZpb3VzIHNlY3Rpb24gPGEgaHJlZj0iI1J1bk9uVUlUaHJlYWQiPlRlc3Rpbmcgb24gdGhlIFVJIFRocmVhZDwvYT4KLSAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KLSAgICA8L2RkPgotICAgIDxkdD48Y29kZT5qYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjwvY29kZT48L2R0PgotICAgIDxkZD4KLSAgICAgIDxwPjxzdHJvbmc+UHJvYmxlbTo8L3N0cm9uZz48L3A+Ci0gICAgICBGb3IgYSBmYWlsZWQgdGVzdCwgdGhlIEZhaWx1cmUgVHJhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotICAgICAgPGNvZGU+Ci0gICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUaGlzIG1ldGhvZCBjYW4gbm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZAotICAgICAgPC9jb2RlPgotICAgICAgPHA+PHN0cm9uZz5Qcm9iYWJsZSBDYXVzZTo8L3N0cm9uZz48L3A+Ci0gICAgICAgIFRoaXMgZXJyb3IgaXMgY29tbW9uIGlmIHlvdXIgdGVzdCBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggPGNvZGU+QFVpVGhyZWFkVGVzdDwvY29kZT4gYnV0IHRoZW4gdHJpZXMgdG8KLSAgICAgICAgZG8gc29tZXRoaW5nIG91dHNpZGUgdGhlIFVJIHRocmVhZCBvciB0cmllcyB0byBpbnZva2UgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPi4KLSAgICAgIDxwPjxzdHJvbmc+U3VnZ2VzdGVkIFJlc29sdXRpb246PC9zdHJvbmc+PC9wPgotICAgICAgICBSZW1vdmUgdGhlIDxjb2RlPkBVaVRocmVhZFRlc3Q8L2NvZGU+IGFubm90YXRpb24sIHJlbW92ZSB0aGUgPGNvZGU+cnVuT25VaVRocmVhZCgpPC9jb2RlPiBjYWxsLCBvciByZS1mYWN0b3IgeW91ciB0ZXN0cy4KLSAgICA8L2RkPgotPC9kbD4KKyAgICA8bGk+CisgICAgICAgIFRoZSBzYW1wbGUgdGVzdCBwYWNrYWdlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9BbGFybVNlcnZpY2VUZXN0In0+CisgICAgICAgIEFsYXJtIFNlcnZpY2UgVGVzdDwvYT4gaXMgYW4gZXhhbXBsZSBvZiB0ZXN0aW5nIGEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LiBJdCBjb250YWlucworICAgICAgICBhIHNldCBvZiB1bml0IHRlc3RzIGZvciB0aGUgQWxhcm0gU2VydmljZSBzYW1wbGUgYXBwbGljYXRpb24ncyB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0uCisgICAgPC9saT4KKzwvdWw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdGVzdGluZy93aGF0X3RvX3Rlc3QuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Rlc3Rpbmcvd2hhdF90b190ZXN0LmpkCkBAIC0wLDAgKzEsODQgQEAKK3BhZ2UudGl0bGU9V2hhdCBUbyBUZXN0CitAamQ6Ym9keQorPHA+CisgICAgQXMgeW91IGRldmVsb3AgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGtub3dpbmcgd2hhdCB0byB0ZXN0IGlzIGFzIGltcG9ydGFudCBhcyBrbm93aW5nIGhvdyB0bworICAgIHRlc3QuIFRoaXMgZG9jdW1lbnQgbGlzdHMgc29tZSBtb3N0IGNvbW1vbiBBbmRyb2lkLXJlbGF0ZWQgc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgY29uc2lkZXIKKyAgICB3aGVuIHlvdSB0ZXN0LCBldmVuIGF0IHRoZSB1bml0IHRlc3QgbGV2ZWwuIFRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCwgYW5kIHlvdSBjb25zdWx0IHRoZQorICAgIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmZWF0dXJlcyB0aGF0IHlvdSB1c2UgZm9yIG1vcmUgaWRlYXMuIFRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWRldmVsb3BlcnMiPmFuZHJvaWQtZGV2ZWxvcGVyczwvYT4gR29vZ2xlIEdyb3VwcworICAgIHNpdGUgaXMgYW5vdGhlciByZXNvdXJjZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGVzdGluZy4KKzwvcD4KKzxoMiBpZD0iVGVzdHMiPklkZWFzIGZvciBUZXN0aW5nPC9oMj4KKzxwPgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIG9yZ2FuaXplZCBieSBiZWhhdmlvcnMgb3Igc2l0dWF0aW9ucyB0aGF0IHlvdSBzaG91bGQgdGVzdC4gRWFjaAorICAgIHNlY3Rpb24gY29udGFpbnMgYSBzY2VuYXJpbyB0aGF0IGZ1cnRoZXIgaWxsdXN0cmF0ZXMgdGhlIHNpdHVhdGlvbiBhbmQgdGhlIHRlc3Qgb3IgdGVzdHMgeW91CisgICAgc2hvdWxkIGRvLgorPC9wPgorPGg0PkNoYW5nZSBpbiBvcmllbnRhdGlvbjwvaDQ+Cis8cD4KKyAgICBGb3IgZGV2aWNlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgb3JpZW50YXRpb25zLCBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24gd2hlbgorICAgIHRoZSB1c2VyIHR1cm5zIHRoZSBkZXZpY2Ugc28gdGhhdCB0aGUgZGlzcGxheSBpcyAibGFuZHNjYXBlIiAobG9uZyBlZGdlIGlzIGhvcml6b250YWwpIGluc3RlYWQKKyAgICBvZiAicG9ydHJhaXQiIChsb25nIGVkZ2UgaXMgdmVydGljYWwpLgorPC9wPgorPHA+CisgICAgV2hlbiBBbmRyb2lkIGRldGVjdHMgYSBjaGFuZ2UgaW4gb3JpZW50YXRpb24sIGl0cyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRlc3Ryb3kgYW5kIHRoZW4KKyAgICByZS1zdGFydCB0aGUgZm9yZWdyb3VuZCBBY3Rpdml0eS4gWW91IHNob3VsZCBjb25zaWRlciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmc6Cis8L3A+Cis8dWw+CisgICAgPGxpPgorICAgICAgICBJcyB0aGUgc2NyZWVuIHJlLWRyYXduIGNvcnJlY3RseT8gQW55IGN1c3RvbSBVSSBjb2RlIHlvdSBoYXZlIHNob3VsZCBoYW5kbGUgY2hhbmdlcyBpbiB0aGUKKyAgICAgICAgb3JpZW50YXRpb24uCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIERvZXMgdGhlIGFwcGxpY2F0aW9uIG1haW50YWluIGl0cyBzdGF0ZT8gVGhlIEFjdGl2aXR5IHNob3VsZCBub3QgbG9zZSBhbnl0aGluZyB0aGF0IHRoZQorICAgICAgICB1c2VyIGhhcyBhbHJlYWR5IGVudGVyZWQgaW50byB0aGUgVUkuIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90ICJmb3JnZXQiIGl0cyBwbGFjZSBpbiB0aGUKKyAgICAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAgICA8L2xpPgorPC91bD4KKzxoND5DaGFuZ2UgaW4gY29uZmlndXJhdGlvbjwvaDQ+Cis8cD4KKyAgICBBIHNpdHVhdGlvbiB0aGF0IGlzIG1vcmUgZ2VuZXJhbCB0aGFuIGEgY2hhbmdlIGluIG9yaWVudGF0aW9uIGlzIGEgY2hhbmdlIGluIHRoZSBkZXZpY2UncworICAgIGNvbmZpZ3VyYXRpb24sIHN1Y2ggYXMgYSBjaGFuZ2UgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGtleWJvYXJkIG9yIGEgY2hhbmdlIGluIHN5c3RlbQorICAgIGxhbmd1YWdlLgorPC9wPgorPHA+CisgICAgQSBjaGFuZ2UgaW4gY29uZmlndXJhdGlvbiBhbHNvIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGRlc3Ryb3lpbmcgYW5kIHRoZW4gcmVzdGFydGluZworICAgIHRoZSBmb3JlZ3JvdW5kIEFjdGl2aXR5LiBCZXNpZGVzIHRlc3RpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gbWFpbnRhaW5zIHRoZSBVSSBhbmQgaXRzCisgICAgdHJhbnNhY3Rpb24gc3RhdGUsIHlvdSBzaG91bGQgYWxzbyB0ZXN0IHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVwZGF0ZXMgaXRzZWxmIHRvIHJlc3BvbmQKKyAgICBjb3JyZWN0bHkgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uLgorPC9wPgorPGg0PkJhdHRlcnkgbGlmZTwvaDQ+Cis8cD4KKyAgICBNb2JpbGUgZGV2aWNlcyBwcmltYXJpbHkgcnVuIG9uIGJhdHRlcnkgcG93ZXIuIEEgZGV2aWNlIGhhcyBmaW5pdGUgImJhdHRlcnkgYnVkZ2V0IiwgYW5kIHdoZW4gaXQKKyAgICBpcyBnb25lLCB0aGUgZGV2aWNlIGlzIHVzZWxlc3MgdW50aWwgaXQgaXMgcmVjaGFyZ2VkLiBZb3UgbmVlZCB0byB3cml0ZSB5b3VyIGFwcGxpY2F0aW9uIHRvCisgICAgbWluaW1pemUgYmF0dGVyeSB1c2FnZSwgeW91IG5lZWQgdG8gdGVzdCBpdHMgYmF0dGVyeSBwZXJmb3JtYW5jZSwgYW5kIHlvdSBuZWVkIHRvIHRlc3QgdGhlCisgICAgbWV0aG9kcyB0aGF0IG1hbmFnZSBiYXR0ZXJ5IHVzYWdlLgorPC9wPgorPHA+CisgICAgVGVjaG5pcXVlcyBmb3IgbWluaW1pemluZyBiYXR0ZXJ5IHVzYWdlIHdlcmUgcHJlc2VudGVkIGF0IHRoZSAyMDEwIEdvb2dsZSBJL08gY29uZmVyZW5jZSBpbiB0aGUKKyAgICBwcmVzZW50YXRpb24KKyAgICA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2V2ZW50cy9pby8yMDA5L3Nlc3Npb25zL0NvZGluZ0xpZmVCYXR0ZXJ5TGlmZS5odG1sIj4KKyAgICBDb2RpbmcgZm9yIExpZmUgLS0gQmF0dGVyeSBMaWZlLCBUaGF0IElzPC9hPi4gVGhpcyBwcmVzZW50YXRpb24gZGVzY3JpYmVzIHRoZSBpbXBhY3Qgb24gYmF0dGVyeQorICAgIGxpZmUgb2YgdmFyaW91cyBvcGVyYXRpb25zLCBhbmQgdGhlIHdheXMgeW91IGNhbiBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiB0byBtaW5pbWl6ZSB0aGVzZQorICAgIGltcGFjdHMuIFdoZW4geW91IGNvZGUgeW91ciBhcHBsaWNhdGlvbiB0byByZWR1Y2UgYmF0dGVyeSB1c2FnZSwgeW91IGFsc28gd3JpdGUgdGhlCisgICAgYXBwcm9wcmlhdGUgdW5pdCB0ZXN0cy4KKzwvcD4KKzxoND5EZXBlbmRlbmNlIG9uIGV4dGVybmFsIHJlc291cmNlczwvaDQ+Cis8cD4KKyAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGRlcGVuZHMgb24gbmV0d29yayBhY2Nlc3MsIFNNUywgQmx1ZXRvb3RoLCBvciBHUFMsIHRoZW4geW91IHNob3VsZAorICAgIHRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIHJlc291cmNlIG9yIHJlc291cmNlcyBhcmUgbm90IGF2YWlsYWJsZS4KKzwvcD4KKzxwPgorICAgIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgdGhlIG5ldHdvcmssaXQgY2FuIG5vdGlmeSB0aGUgdXNlciBpZiBhY2Nlc3MgaXMKKyAgICB1bmF2YWlsYWJsZSwgb3IgZGlzYWJsZSBuZXR3b3JrLXJlbGF0ZWQgZmVhdHVyZXMsIG9yIGRvIGJvdGguIEZvciBHUFMsIGl0IGNhbiBzd2l0Y2ggdG8KKyAgICBJUC1iYXNlZCBsb2NhdGlvbiBhd2FyZW5lc3MuIEl0IGNhbiBhbHNvIHdhaXQgZm9yIFdpRmkgYWNjZXNzIGJlZm9yZSBkb2luZyBsYXJnZSBkYXRhIHRyYW5zZmVycywKKyAgICBzaW5jZSBXaUZpIHRyYW5zZmVycyBtYXhpbWl6ZSBiYXR0ZXJ5IHVzYWdlIGNvbXBhcmVkIHRvIHRyYW5zZmVycyBvdmVyIDNHIG9yIEVER0UuCis8L3A+Cis8cD4KKyAgICBZb3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgdG8gdGVzdCBuZXR3b3JrIGFjY2VzcyBhbmQgYmFuZHdpZHRoLiBUbyBsZWFybiBtb3JlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvZW11bGF0b3IuaHRtbCNuZXRzcGVlZCI+TmV0d29yayBTcGVlZCBFbXVsYXRpb248L2E+LgorICAgIFRvIHRlc3QgR1BTLCB5b3UgY2FuIHVzZSB0aGUgZW11bGF0b3IgY29uc29sZSBhbmQge0BsaW5rIGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb25NYW5hZ2VyfS4gVG8KKyAgICBsZWFybiBtb3JlIGFib3V0IHRoZSBlbXVsYXRvciBjb25zb2xlLCBwbGVhc2Ugc2VlCisgICAgPGEgaHJlZj0ie0Bkb2NSb290fS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2VtdWxhdG9yLmh0bWwjY29uc29sZSI+CisgICAgVXNpbmcgdGhlIEVtdWxhdG9yIENvbnNvbGU8L2E+LgorPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9kaWFsb2dzLmpkCmluZGV4IDc0YjU0NGIuLmQwNDdiMmQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvZGlhbG9ncy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2RpYWxvZ3MuamQKQEAgLTQ3MiwxOCArNDcyLDI1IEBACiAgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyhOb3RpZmljYXRpb25UZXN0LnRoaXMpOwogICAgICAgICAgICAgcHJvZ3Jlc3NEaWFsb2cuc2V0UHJvZ3Jlc3NTdHlsZShQcm9ncmVzc0RpYWxvZy5TVFlMRV9IT1JJWk9OVEFMKTsKICAgICAgICAgICAgIHByb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoIkxvYWRpbmcuLi4iKTsKLSAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkID0gbmV3IFByb2dyZXNzVGhyZWFkKGhhbmRsZXIpOwotICAgICAgICAgICAgcHJvZ3Jlc3NUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc0RpYWxvZzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QcmVwYXJlRGlhbG9nKGludCBpZCwgRGlhbG9nIGRpYWxvZykgeworICAgICAgICBzd2l0Y2goaWQpIHsKKyAgICAgICAgY2FzZSBQUk9HUkVTU19ESUFMT0c6CisgICAgICAgICAgICBwcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzcygwKTsKKyAgICAgICAgICAgIHByb2dyZXNzVGhyZWFkID0gbmV3IFByb2dyZXNzVGhyZWFkKGhhbmRsZXIpOworICAgICAgICAgICAgcHJvZ3Jlc3NUaHJlYWQuc3RhcnQoKTsKKyAgICB9CisKICAgICAvLyBEZWZpbmUgdGhlIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgYW5kIHVwZGF0ZSB0aGUgcHJvZ3Jlc3MKICAgICBmaW5hbCBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgaW50IHRvdGFsID0gbXNnLmdldERhdGEoKS5nZXRJbnQoInRvdGFsIik7CisgICAgICAgICAgICBpbnQgdG90YWwgPSBtc2cuYXJnMTsKICAgICAgICAgICAgIHByb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzKHRvdGFsKTsKICAgICAgICAgICAgIGlmICh0b3RhbCA+PSAxMDApewogICAgICAgICAgICAgICAgIGRpc21pc3NEaWFsb2coUFJPR1JFU1NfRElBTE9HKTsKQEAgLTUxNCw5ICs1MjEsNyBAQAogICAgICAgICAgICAgICAgICAgICBMb2cuZSgiRVJST1IiLCAiVGhyZWFkIEludGVycnVwdGVkIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIEJ1bmRsZSBiID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgIGIucHV0SW50KCJ0b3RhbCIsIHRvdGFsKTsKLSAgICAgICAgICAgICAgICBtc2cuc2V0RGF0YShiKTsKKyAgICAgICAgICAgICAgICBtc2cuYXJnMSA9IHRvdGFsOwogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICAgdG90YWwrKzsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZyBiL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy9hbmRyb2lkX3Rlc3RfZnJhbWV3b3JrLnBuZwppbmRleCA2ZjgwNTMwLi40NTk5NzVjIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvYW5kcm9pZF90ZXN0X2ZyYW1ld29yay5wbmcKKysrIGIvZG9jcy9odG1sL2ltYWdlcy90ZXN0aW5nL2FuZHJvaWRfdGVzdF9mcmFtZXdvcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbWFnZXMvdGVzdGluZy90ZXN0X2ZyYW1ld29yay5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzVmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvaW1hZ2VzL3Rlc3RpbmcvdGVzdF9mcmFtZXdvcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYnJvd3Nlci5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9icm93c2VyLmpkCkBAIC0wLDAgKzEsNDkgQEAKK3BhZ2UudGl0bGU9VGVjaG5pY2FsIFJlc291cmNlcworQGpkOmJvZHkKKworPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAge0BsaXRlcmFsIEBpbXBvcnR9ICJ7QGRvY1Jvb3R9YXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLXJlc291cmNlLWJyb3dzZXIuY3NzIjsKKzwvc3R5bGU+CisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IntAZG9jUm9vdH1hc3NldHMvYW5kcm9pZC1kZXZlbG9wZXItcmVzb3VyY2UtYnJvd3Nlci5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL21pY3JvdGVtcGxhdGUuanMiPjwvc2NyaXB0PgorCis8ZGl2PgorICA8cCBzdHlsZT0iZGlzcGxheTogbm9uZTsgZmxvYXQ6IHJpZ2h0Ij5GaWx0ZXI6IDxpbnB1dCBpZD0icmVzb3VyY2UtYnJvd3Nlci1rZXl3b3JkLWZpbHRlciIvPjwvcD4KKyAgPHAgaWQ9InJlc291cmNlLWJyb3dzZXItc2VhcmNoLXBhcmFtcyI+U2hvd2luZyBhbGwgdGVjaG5pY2FsIHJlc291cmNlczo8L3A+Cis8L2Rpdj4KKworPG5vc2NyaXB0PgorICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5FcnJvcjo8L3N0cm9uZz4KKyAgICBZb3UgbXVzdCBoYXZlIEphdmFTY3JpcHQgZW5hYmxlZCB0byB2aWV3IHRoaXMgcGFnZS4gUmVzb3VyY2VzIGFyZSBhbHNvCisgICAgYXZhaWxhYmxlIG9mZmxpbmUgaW4gdGhlIFNESy4KKyAgPC9wPgorPC9ub3NjcmlwdD4KKworPGRpdiBpZD0icmVzb3VyY2UtYnJvd3Nlci1yZXN1bHRzIj4KKyAgPGRpdiBjbGFzcz0ibm8tcmVzdWx0cyI+Tm8gcmVzdWx0cy48L2Rpdj4KKzwvZGl2PgorCis8c2NyaXB0IHR5cGU9InRleHQvaHRtbCIgaWQ9InRtcGxfcmVzb3VyY2VfYnJvd3Nlcl9yZXN1bHQiPgorPGRpdiBjbGFzcz0icmVzdWx0Ij4KKyAgPGgzPgorICAgIDwlIGlmICgnZXh0ZXJuYWwnIGluIHRhZ3NIYXNoKSB7ICU+PHN0cm9uZz5FeHRlcm5hbDogPC9zdHJvbmc+IDwlIH0gJT4KKyAgICA8YSBocmVmPSI8JT0gcGF0aCAlPiI+PCU9IHRpdGxlLmVuICU+PC9hPgorICAgIDwlIGlmICgnbmV3JyBpbiB0YWdzSGFzaCkgeyAlPjxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+IDwlIH0gJT4KKyAgPC9oMz4KKyAgPHAgY2xhc3M9InJlc291cmNlLW1ldGEiPjwlCisgICAgdmFyIF9fZyA9IFsnJywgJyddOworICAgIGlmICgnYXJ0aWNsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnQXJ0aWNsZScsICdhYm91dCddOworICAgIH0gZWxzZSBpZiAoJ3R1dG9yaWFsJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydUdXRvcmlhbCcsICdvbiddOworICAgIH0gZWxzZSBpZiAoJ3NhbXBsZScgaW4gdGFnc0hhc2gpIHsKKyAgICAgIF9fZyA9IFsnU2FtcGxlJywgJ2ZvciddOworICAgIH0gZWxzZSBpZiAoJ3ZpZGVvJyBpbiB0YWdzSGFzaCkgeworICAgICAgX19nID0gWydWaWRlbycsICdhYm91dCddOworICAgIH0KKyAgJT4KKyAgPCU9IF9fZ1swXSAlPjwlIGlmICh0b3BpY3NIdG1sKSB7ICU+IDwlPSBfX2dbMV0gJT48JSB9ICU+IDwlPSB0b3BpY3NIdG1sICU+PC9wPgorICA8cD48JT0gZGVzY3JpcHRpb24uZW4gJT48L3A+Cis8L2Rpdj4KKzwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvaW5kZXguamQKaW5kZXggMTY2ODcyMS4uOTA1NTg2OCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2luZGV4LmpkCkBAIC0xLDM4ICsxLDkwIEBACiBwYWdlLnRpdGxlPURldmVsb3BlciBSZXNvdXJjZXMKIEBqZDpib2R5CiAKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS1saXN0LXRhYmxlIHRkIHsKKyAgICBib3JkZXI6IDA7CisgICAgcGFkZGluZzogMCAyNHB4OworICAgIHdpZHRoOiAzMyU7CisgICAgbWF4LXdpZHRoOiAyNTBweDsKKyAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOworICB9CisKKyAgI3Jlc291cmNlLWxpc3QtdGFibGUgdGQubGFzdCB7CisgICAgYm9yZGVyLXJpZ2h0OiAwOworICAgIHBhZGRpbmctcmlnaHQ6IDA7CisgIH0KKzwvc3R5bGU+CisKIDxwPgotVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRlY2huaWNhbCBhcnRpY2xlcywgdHV0b3JpYWxzLCBzYW1wbGUgY29kZSwgYW5kIG90aGVyCitUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYXJ0aWNsZXMsIHR1dG9yaWFscywgc2FtcGxlIGNvZGUsIGFuZCBvdGhlcgogaW5mb3JtYXRpb24gdG8gaGVscCB5b3UgcXVpY2tseSBpbXBsZW1lbnQgdGhlIGZlYXR1cmVzIHlvdSB3YW50IGluIHlvdXIKLWFwcGxpY2F0aW9uLgorYXBwbGljYXRpb24uIFRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiCit0YWIgd2hpbGUgYW55IFJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4KIDwvcD4KIAorPGgyPlRlY2huaWNhbCBSZXNvdXJjZXM8L2gyPgorCis8dGFibGUgaWQ9InJlc291cmNlLWxpc3QtdGFibGUiPgorPHRyPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPgorICAgICAgU2FtcGxlIENvZGUKKyAgICA8L2E+PC9oMz4KKyAgICA8cD5GdWxseS1mdW5jdGlvbmluZyBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgeW91IGNhbiBidWlsZCBhbmQgcnVuCisgICAgdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKKyAgICB0ZWNobmlxdWVzIGluIHRoZSBzYW1wbGVzLjwvcD4KKyAgPC90ZD4KKyAgPHRkPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmciLz4KKyAgICA8L2E+CisgICAgPGgzPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgIEFydGljbGVzCisgICAgPC9hPjwvaDM+CisgICAgPHA+Rm9jdXNlZCBkaXNjdXNzaW9ucyBhYm91dCBBbmRyb2lkIGRldmVsb3BtZW50IHN1YmplY3RzLCBpbmNsdWRpbmcKKyAgICBvcHRpbWl6YXRpb25zLCB0aXBzLCBpbnRlcmVzdGluZyBpbXBsZW1lbnRhdGlvbnMsICJob3ctdG9zIiwKKyAgICBhbmQgc28gb24uPC9wPgorICA8L3RkPgorICA8dGQ+CisgICAgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXR1dG9yaWFsIj4KKyAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nIi8+CisgICAgPC9hPgorICAgIDxoMz48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2Jyb3dzZXIuaHRtbD90YWc9dHV0b3JpYWwiPgorICAgICAgVHV0b3JpYWxzCisgICAgPC9hPjwvaDM+CisgICAgPHA+U3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBkZW1vbnN0cmF0aW5nIGhvdyB0byBidWlsZCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uCisgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmljIGZlYXR1cmVzIHlvdSB3YW50LjwvcD4KKyAgPC90ZD4KKyAgPCEtLSA8dGQgY2xhc3M9Imxhc3QiPgorICAgIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz12aWRlbyI+CisgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZyIvPgorICAgIDwvYT4KKyAgICA8aDM+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXZpZGVvIj4KKyAgICAgIFZpZGVvcyAmYW1wOyBTY3JlZW5jYXN0cworICAgIDwvYT48L2gzPgorICAgIDxwPlZpZGVvcyBhbmQgcHJlc2VudGF0aW9uIHNsaWRlcyBmcm9tIGRldmVsb3BlciBldmVudHMsIGFsb25nIHdpdGgKKyAgICBzY3JlZW5jYXN0cyB0byB3YWxrIHlvdSB0aHJvdWdoIGNvbW1vbiBBbmRyb2lkIGRldmVsb3BtZW50CisgICAgd29ya2Zsb3dzLjwvcD4KKyAgPC90ZD4gLS0+Cis8L3RyPgorPC90YWJsZT4KKworPGgyPk90aGVyIFJlc291cmNlczwvaDI+CisKIDxkbD4KLTxkdD48Yj5UZWNobmljYWwgQXJ0aWNsZXM8L2I+PC9kdD4KLTxkZD5Gb2N1c2VkIGRpc2N1c3Npb25zIGFib3V0IEFuZHJvaWQgZGV2ZWxvcG1lbnQgc3ViamVjdHMsIGluY2x1ZGluZwotb3B0aW1pemF0aW9ucywgdGlwcywgaW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb25zLAotYW5kIHNvIG9uLiBNb3N0IG9mIHRoZSBhcnRpY2xlcyBwcm92aWRlICJob3ctdG8iIGluc3RydWN0aW9ucyBmb3IgYWRkaW5nCi1mZWF0dXJlcyBvciBmdW5jdGlvbmFsaXR5IHRvIHlvdXIgYXBwLiBUaGUgYXJ0aWNsZXMgYXJlIGRyYXduIGZyb20gcG9zdHMgdG8gdGhlCi1BbmRyb2lkIERldmVsb3BlcnMgQmxvZy4KLTwvZGQ+Ci0KLTxkdD48Yj5UdXRvcmlhbHM8L2I+PC9kdD4KLTxkZD5TdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zIGRlbW9uc3RyYXRpbmcgaG93IHRvIGJ1aWxkIGFuIEFuZHJvaWQgYXBwbGljYXRpb24KLXRoYXQgaGFzIHRoZSBzcGVjaWZpYyBmZWF0dXJlcyB5b3Ugd2FudC4gPC9kZD4KLQotPGR0PjxiPlNhbXBsZSBDb2RlPC9iPjwvZHQ+Ci08ZGQ+RnVsbHktZnVuY3Rpb25pbmcgc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBjYW4gbG9vayBhdCBvciBidWlsZCBhbmQgcnVuLAotdG8gbGVhcm4gYWJvdXQgaG93IEFuZHJvaWQgd29ya3MuIEZlZWwgZnJlZSB0byByZXVzZSBhbnkgb2YgdGhlIGNvZGUgb3IKLXRlY2huaXF1ZXMgdGhhdCB5b3UgZmluZCBpbiB0aGUgc2FtcGxlcyE8L2RkPgotCiA8ZHQ+PGI+Q29tbXVuaXR5PC9iPjwvZHQ+CiA8ZGQ+TGlua3MgdG8gdGhlIEFuZHJvaWQgZGlzY3Vzc2lvbiBncm91cHMgYW5kIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIHdheXMgdG8KIGNvbGxhYm9yYXRlIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4gPC9kZD4KIAorPGR0PjxiPkRldmljZSBEYXNoYm9hcmQ8L2I+PC9kdD4KKzxkZD5EZXZpY2UgZGlzdHJpYnV0aW9uIGRhdGEsIGdyb3VwZWQgYnkgdmFyaW91cyBkaW1lbnNpb25zIHN1Y2ggYXMgc2NyZWVuIHNpemUKK2FuZCBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb24uIDwvZGQ+CisKIDxkdD48Yj5Nb3JlPC9iPjwvZHQ+CiA8ZGQ+UXVpY2sgZGV2ZWxvcG1lbnQgdGlwcywgdHJvdWJsZXNob290aW5nIGluZm9ybWF0aW9uLCBhbmQgZnJlcXVlbnRseSBhc2tlZAogcXVlc3Rpb25zIChGQVFzKS4gPC9kZD4KIDwvZGw+Ci0KLTxwPlRvIHJldHVybiB0byB0aGlzIHBhZ2UgbGF0ZXIsIGp1c3QgY2xpY2sgdGhlICJSZXNvdXJjZXMiIHRhYiB3aGlsZSBhbnkKLVJlc291cmNlcyBwYWdlIGlzIGxvYWRlZC4gPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmI2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCkBAIC0wLDAgKzEsNjMyIEBACit2YXIgQU5EUk9JRF9UQUdTID0geworICB0eXBlOiB7CisgICAgJ2FydGljbGUnOiAnQXJ0aWNsZScsCisgICAgJ3R1dG9yaWFsJzogJ1R1dG9yaWFsJywKKyAgICAnc2FtcGxlJzogJ1NhbXBsZScsCisgICAgJ3ZpZGVvJzogJ1ZpZGVvJywKKyAgICAnbGlicmFyeSc6ICdDb2RlIExpYnJhcnknCisgIH0sCisgIHRvcGljOiB7CisgICAgJ2FjY2Vzc2liaWxpdHknOiAnQWNjZXNzaWJpbGl0eScsCisgICAgJ2FjY291bnRzeW5jJzogJ0FjY291bnRzICZhbXA7IFN5bmMnLAorICAgICdiZXN0cHJhY3RpY2UnOiAnQmVzdCBQcmFjdGljZXMnLAorICAgICdjb21tdW5pY2F0aW9uJzogJ0NvbW11bmljYXRpb24nLAorICAgICdjb21wYXRpYmlsaXR5JzogJ0NvbXBhdGliaWxpdHknLAorICAgICdkYXRhJzogJ0RhdGEgQWNjZXNzJywKKyAgICAnZHJhd2luZyc6ICdDYW52YXMgRHJhd2luZycsCisgICAgJ2dhbWVkZXYnOiAnR2FtZSBEZXZlbG9wbWVudCcsCisgICAgJ2dsJzogJ09wZW5HTCBFUycsCisgICAgJ2lucHV0JzogJ0lucHV0IE1ldGhvZHMnLAorICAgICdpbnRlbnQnOiAnSW50ZW50cycsCisgICAgJ2xheW91dCc6ICdMYXlvdXRzL1ZpZXdzJywKKyAgICAnbWVkaWEnOiAnTXVsdGltZWRpYScsCisgICAgJ25ld2ZlYXR1cmUnOiAnTmV3IEZlYXR1cmVzJywKKyAgICAncGVyZm9ybWFuY2UnOiAnUGVyZm9ybWFuY2UnLAorICAgICdzZWFyY2gnOiAnU2VhcmNoJywKKyAgICAndGVzdGluZyc6ICdUZXN0aW5nJywKKyAgICAndWknOiAnVXNlciBJbnRlcmZhY2UnLAorICAgICd3ZWInOiAnV2ViIENvbnRlbnQnCisgIH0sCisgIG1pc2M6IHsKKyAgICAnZXh0ZXJuYWwnOiAnRXh0ZXJuYWwnLAorICAgICduZXcnOiAnTmV3JworICB9Cit9OworCit2YXIgQU5EUk9JRF9SRVNPVVJDRVMgPSBbCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVEVDSE5JQ0FMIEFSVElDTEVTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9hdm9pZGluZy1tZW1vcnktbGVha3MuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQXZvaWRpbmcgTWVtb3J5IExlYWtzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTW9iaWxlIGRldmljZXMgb2Z0ZW4gaGF2ZSBsaW1pdGVkIG1lbW9yeSwgYW5kIG1lbW9yeSBsZWFrcyBjYW4gY2F1c2UgeW91ciBhcHBsaWNhdGlvbiB0byB3YXN0ZSB0aGlzIHZhbHVhYmxlIHJlc291cmNlIHdpdGhvdXQgeW91ciBrbm93bGVkZ2UuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyB0aXBzIHRvIGhlbHAgeW91IGF2b2lkIGNvbW1vbiBjYXVzZXMgb2YgbWVtb3J5IGxlYWtzIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0JhY2t3YXJkIENvbXBhdGliaWxpdHknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgQW5kcm9pZCBwbGF0Zm9ybSBzdHJpdmVzIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSG93ZXZlciwgc29tZXRpbWVzIHlvdSB3YW50IHRvIHVzZSBuZXcgZmVhdHVyZXMgd2hpY2ggYXJlblwndCBzdXBwb3J0ZWQgb24gb2xkZXIgcGxhdGZvcm1zLiBUaGlzIGFydGljbGUgZGlzY3Vzc2VzIHN0cmF0ZWdpZXMgZm9yIHNlbGVjdGl2ZWx5IHVzaW5nIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIGF2YWlsYWJpbGl0eSwgYWxsb3dpbmcgeW91IHRvIGtlZXAgeW91ciBhcHBsaWNhdGlvbnMgcG9ydGFibGUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBkZXZpY2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDYW4gSSBVc2UgdGhpcyBJbnRlbnQ/JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW5kcm9pZCBvZmZlcnMgYSB2ZXJ5IHBvd2VyZnVsIGFuZCB5ZXQgZWFzeS10by11c2UgbWVzc2FnZSB0eXBlIGNhbGxlZCBhbiBpbnRlbnQuIFlvdSBjYW4gdXNlIGludGVudHMgdG8gdHVybiBhcHBsaWNhdGlvbnMgaW50byBoaWdoLWxldmVsIGxpYnJhcmllcyBhbmQgbWFrZSBjb2RlIG1vZHVsYXIgYW5kIHJldXNhYmxlLiBXaGlsZSBpdCBpcyBuaWNlIHRvIGJlIGFibGUgdG8gbWFrZSB1c2Ugb2YgYSBsb29zZWx5IGNvdXBsZWQgQVBJLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgaW50ZW50IHlvdSBzZW5kIHdpbGwgYmUgcmVjZWl2ZWQgYnkgYW5vdGhlciBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBhIHRlY2huaXF1ZSB5b3UgY2FuIHVzZSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBzeXN0ZW0gY29udGFpbnMgYW55IGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgcmVzcG9uZGluZyB0byB0aGUgaW50ZW50IHlvdSB3YW50IHRvIHVzZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdDcmVhdGluZyBhbiBJbnB1dCBNZXRob2QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbnB1dCBNZXRob2QgRWRpdG9ycyAoSU1FcykgcHJvdmlkZSB0aGUgbWVjaGFuaXNtIGZvciBlbnRlcmluZyB0ZXh0IGludG8gdGV4dCBmaWVsZHMgYW5kIG90aGVyIFZpZXdzLiBBbmRyb2lkIGRldmljZXMgY29tZSBidW5kbGVkIHdpdGggYXQgbGVhc3Qgb25lIElNRSwgYnV0IHVzZXJzIGNhbiBpbnN0YWxsIGFkZGl0aW9uYWwgSU1Fcy4gVGhpcyBhcnRpY2xlIGNvdmVycyB0aGUgYmFzaWNzIG9mIGRldmVsb3BpbmcgYW4gSU1FIGZvciB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2RyYXdpbmcnLCAndWknXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvZHJhd2FibGUtbXV0YXRpb25zLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0RyYXdhYmxlIE11dGF0aW9ucycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RyYXdhYmxlcyBhcmUgcGx1Z2dhYmxlIGRyYXdpbmcgY29udGFpbmVycyB0aGF0IGFsbG93IGFwcGxpY2F0aW9ucyB0byBkaXNwbGF5IGdyYXBoaWNzLiBUaGlzIGFydGljbGUgZXhwbGFpbnMgc29tZSBjb21tb24gcGl0ZmFsbHMgd2hlbiB0cnlpbmcgdG8gbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIG11bHRpcGxlIERyYXdhYmxlcy4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2Jlc3RwcmFjdGljZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mYXN0ZXItc2NyZWVuLW9yaWVudGF0aW9uLWNoYW5nZS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdGYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1doZW4gYW4gQW5kcm9pZCBkZXZpY2UgY2hhbmdlcyBpdHMgb3JpZW50YXRpb24sIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGF1dG9tYXRpY2FsbHkgcmVzdGFydCB0aGUgY3VycmVudCBhY3Rpdml0eSB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEhvd2V2ZXIsIHRoaXMgY2FuIGJlY29tZSBhIGJvdHRsZW5lY2sgaW4gYXBwbGljYXRpb25zIHRoYXQgYWNjZXNzIGEgbGFyZ2UgYW1vdW50IG9mIGV4dGVybmFsIGRhdGEuIFRoaXMgYXJ0aWNsZSBkaXNjdXNzZXMgaG93IHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoaXMgc2l0dWF0aW9uIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG1hbnVhbGx5IHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnY29tcGF0aWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnRnV0dXJlLVByb29maW5nIFlvdXIgQXBwcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgY29sbGVjdGlvbiBvZiBjb21tb24gc2Vuc2UgYWR2aWNlIHRvIGhlbHAgeW91IGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGRvblwndCBicmVhayB3aGVuIG5ldyB2ZXJzaW9ucyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBhcmUgcmVsZWFzZWQuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9nZXN0dXJlcy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdHZXN0dXJlcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RvdWNoIHNjcmVlbnMgYWxsb3cgdXNlcnMgdG8gcGVyZm9ybSBnZXN0dXJlcywgc3VjaCBhcyB0YXBwaW5nLCBkcmFnZ2luZywgZmxpbmdpbmcsIG9yIHNsaWRpbmcsIHRvIHBlcmZvcm0gdmFyaW91cyBhY3Rpb25zLiBUaGUgZ2VzdHVyZXMgQVBJIGVuYWJsZXMgeW91ciBhcHBsaWNhdGlvbiB0byByZWNvZ25pemUgZXZlbiBjb21wbGljYXRlZCBnZXN0dXJlcyB3aXRoIGVhc2UuIFRoaXMgYXJ0aWNsZSBleHBsYWlucyBob3cgdG8gaW50ZWdyYXRlIHRoaXMgQVBJIGludG8gYW4gYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdnYW1lZGV2JywgJ2dsJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2dsc3VyZmFjZXZpZXcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSW50cm9kdWNpbmcgR0xTdXJmYWNlVmlldycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiBHTFN1cmZhY2VWaWV3LCBhIGNsYXNzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBpbXBsZW1lbnQgMkQgb3IgM0QgT3BlbkdMIHJlbmRlcmluZyBpbnNpZGUgb2YgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ2xheW91dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLXJldXNlLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xheW91dCBUcmlja3M6IENyZWF0aW5nIFJldXNhYmxlIFVJIENvbXBvbmVudHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gY29tYmluZSBtdWx0aXBsZSBzdGFuZGFyZCBVSSB3aWRnZXRzIGludG8gYSBzaW5nbGUgaGlnaC1sZXZlbCBjb21wb25lbnQsIHdoaWNoIGNhbiBiZSByZXVzZWQgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbGF5b3V0JywgJ3VpJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9sYXlvdXQtdHJpY2tzLWVmZmljaWVuY3kuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogQ3JlYXRpbmcgRWZmaWNpZW50IExheW91dHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBob3cgdG8gb3B0aW1pemUgYXBwbGljYXRpb24gbGF5b3V0cyBhcyB0aGlzIGFydGljbGUgd2Fsa3MgeW91IHRocm91Z2ggY29udmVydGluZyBhIExpbmVhckxheW91dCBpbnRvIGEgUmVsYXRpdmVMYXlvdXQsIGFuZCBhbmFseXplcyB0aGUgcmVzdWx0aW5nIGltcGxpY2F0aW9ucyBvbiBwZXJmb3JtYW5jZS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2xheW91dCcsICd1aScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMYXlvdXQgVHJpY2tzOiBVc2luZyBWaWV3U3R1YnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMZWFybiBhYm91dCB1c2luZyBWaWV3U3R1YnMgaW5zaWRlIGFuIGFwcGxpY2F0aW9uXCdzIGxheW91dCBpbiBvcmRlciB0byBpbmZsYXRlIHJhcmVseSB1c2VkIFVJIGVsZW1lbnRzLCB3aXRob3V0IHRoZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGNhdXNlZCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiB0YWcuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdsYXlvdXQnLCAndWknLCAncGVyZm9ybWFuY2UnLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xheW91dC10cmlja3MtbWVyZ2UuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGF5b3V0IFRyaWNrczogTWVyZ2luZyBMYXlvdXRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnTGVhcm4gaG93IHRvIHVzZSB0aGUgPGNvZGU+Jmx0O21lcmdlJmd0OzwvY29kZT4gdGFnIGluIHlvdXIgWE1MIGxheW91dHMgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbGV2ZWxzIG9mIGhpZXJhcmNoeSB3aXRoaW4gYW4gYXBwbGljYXRpb25cJ3MgdmlldyB0cmVlLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAncGVyZm9ybWFuY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGlzdHZpZXctYmFja2dyb3VuZHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTGlzdFZpZXcgQmFja2dyb3VuZHM6IEFuIE9wdGltaXphdGlvbicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpc3RWaWV3cyBhcmUgdmVyeSBwb3B1bGFyIHdpZGdldHMgd2l0aGluIHRoZSBBbmRyb2lkIGZyYW1ld29yay4gVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBvcHRpbWl6YXRpb25zIHVzZWQgYnkgdGhlIExpc3RWaWV3IHdpZGdldCwgYW5kIGhvdyB0byBhdm9pZCBzb21lIGNvbW1vbiBpc3N1ZXMgdGhhdCB0aGlzIGNhdXNlcyB3aGVuIHRyeWluZyB0byB1c2UgYSBjdXN0b20gYmFja2dyb3VuZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xpdmUgRm9sZGVycyBhbGxvdyB1c2VycyB0byBkaXNwbGF5IGFueSBzb3VyY2Ugb2YgZGF0YSBvbiB0aGVpciBob21lIHNjcmVlbiB3aXRob3V0IGxhdW5jaGluZyBhbiBhcHBsaWNhdGlvbi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gZXhwb3J0IGFuIGFwcGxpY2F0aW9uXCdzIGRhdGEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRpc3BsYXkgaW5zaWRlIG9mIGEgbGl2ZSBmb2xkZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICduZXdmZWF0dXJlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdMaXZlIHdhbGxwYXBlcnMgYXJlIHJpY2hlciwgYW5pbWF0ZWQsIGludGVyYWN0aXZlIGJhY2tncm91bmRzIHRoYXQgdXNlcnMgY2FuIGRpc3BsYXkgaW4gdGhlaXIgaG9tZSBzY3JlZW5zLiBMZWFybiBob3cgdG8gY3JlYXRlIGEgbGl2ZSB3YWxscGFwZXIgYW5kIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdpbnB1dCddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ09uc2NyZWVuIElucHV0IE1ldGhvZHMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgSW5wdXQgTWV0aG9kIEZyYW1ld29yayAoSU1GKSBhbGxvd3MgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb24tc2NyZWVuIGlucHV0IG1ldGhvZHMsIHN1Y2ggYXMgc29mdHdhcmUga2V5Ym9hcmRzLiBUaGlzIGFydGljbGUgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgSW5wdXQgTWV0aG9kIEVkaXRvcnMgKElNRXMpIGFuZCBob3cgYXBwbGljYXRpb25zIGludGVyYWN0IHdpdGggdGhlbS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnUGFpbmxlc3MgVGhyZWFkaW5nJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyB0aGUgdGhyZWFkaW5nIG1vZGVsIHVzZWQgYnkgQW5kcm9pZCBhcHBsaWNhdGlvbnMgYW5kIGhvdyBhcHBsaWNhdGlvbnMgY2FuIGVuc3VyZSBiZXN0IFVJIHBlcmZvcm1hbmNlIGJ5IHNwYXduaW5nIHdvcmtlciB0aHJlYWRzIHRvIGhhbmRsZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucywgcmF0aGVyIHRoYW4gaGFuZGxpbmcgdGhlbSBpbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBhcnRpY2xlIGFsc28gZXhwbGFpbnMgdGhlIEFQSSB0aGF0IHlvdXIgYXBwbGljYXRpb24gY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIEFuZHJvaWQgVUkgdG9vbGtpdCBjb21wb25lbnRzIHJ1bm5pbmcgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBzcGF3biBtYW5hZ2VkIHdvcmtlciB0aHJlYWRzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnc2VhcmNoJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3FzYi5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdRdWljayBTZWFyY2ggQm94JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnUXVpY2sgU2VhcmNoIEJveCAoUVNCKSBpcyBhIHBvd2VyZnVsLCBzeXN0ZW0td2lkZSBzZWFyY2ggZnJhbWV3b3JrLiBRU0IgbWFrZXMgaXQgcG9zc2libGUgZm9yIHVzZXJzIHRvIHF1aWNrbHkgYW5kIGVhc2lseSBmaW5kIHdoYXQgdGhleVwncmUgbG9va2luZyBmb3IsIGJvdGggb24gdGhlaXIgZGV2aWNlcyBhbmQgb24gdGhlIHdlYi4gVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gd29yayB3aXRoIHRoZSBRU0IgZnJhbWV3b3JrIHRvIGFkZCBuZXcgc2VhcmNoIHJlc3VsdHMgZm9yIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVG91Y2ggTW9kZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgdG91Y2ggbW9kZSwgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwcmluY2lwbGVzIG9mIEFuZHJvaWRcJ3MgVUkgdG9vbGtpdC4gV2hlbmV2ZXIgYSB1c2VyIGludGVyYWN0cyB3aXRoIGEgZGV2aWNlXCdzIHRvdWNoIHNjcmVlbiwgdGhlIHN5c3RlbSBlbnRlcnMgdG91Y2ggbW9kZS4gV2hpbGUgc2ltcGxlIGluIGNvbmNlcHQsIHRoZXJlIGFyZSBpbXBvcnRhbnQgaW1wbGljYXRpb25zIHRvdWNoIG1vZGUgdGhhdCBhcmUgb2Z0ZW4gb3Zlcmxvb2tlZC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3BlcmZvcm1hbmNlJywgJ2Jlc3RwcmFjdGljZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90cmFjay1tZW0uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBob3cgdG8gdXNlIHRoZSBBbGxvY2F0aW9uIFRyYWNrZXIgdG9vbCB0byBvYnNlcnZlIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IGlnbm9yaW5nIHRoZSBlZmZlY3Qgb2YgRGFsdmlrXCdzIGdhcmJhZ2UgY29sbGVjdG9yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjUuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS41LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuMCBhbmQgMS4xLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnbmV3ZmVhdHVyZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91aS0xLjYuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVUkgRnJhbWV3b3JrIENoYW5nZXMgaW4gQW5kcm9pZCAxLjYnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdFeHBsb3JlIHRoZSBVSSBjaGFuZ2VzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMS42LCBjb21wYXJlZCB3aXRoIHRoZSBVSSBwcm92aWRlZCBpbiBBbmRyb2lkIDEuNS4gSW4gcGFydGljdWxhciwgdGhpcyBhcnRpY2xlIGRpc2N1c3NlcyBjaGFuZ2VzIHRvIFJlbGF0aXZlTGF5b3V0cyBhbmQgY2xpY2sgbGlzdGVuZXJzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXBkYXRpbmcgdGhlIFVJIGZyb20gYSBUaW1lcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0xlYXJuIGFib3V0IGhvdyB0byB1c2UgSGFuZGxlcnMgYXMgYSBtb3JlIGVmZmljaWVudCByZXBsYWNlbWVudCBmb3IgamF2YS51dGlsLlRpbWVyIG9uIHRoZSBBbmRyb2lkIHBsYXRmb3JtLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAndWknLCAnYWNjZXNzaWJpbGl0eSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy90dHMuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnVXNpbmcgVGV4dC10by1TcGVlY2gnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGV4dC10by1zcGVlY2ggQVBJIGxldHMgeW91ciBhcHBsaWNhdGlvbiAic3BlYWsiIHRvIHVzZXJzLCBpbiBhbnkgb2Ygc2V2ZXJhbCBsYW5ndWFnZXMuIFRoaXMgYXJ0aWNsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgVFRTIEFQSSBhbmQgaG93IHlvdSB1c2UgdG8gYWRkIHNwZWVjaCBjYXBhYmlsaXRpZXMgdG8geW91ciBhcHBsaWNhdGlvbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJywgJ3dlYiddLAorICAgIHBhdGg6ICdhcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdVc2luZyBXZWJWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1dlYlZpZXdzIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGR5bmFtaWNhbGx5IGRpc3BsYXkgSFRNTCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0LCB3aXRob3V0IHJlbGlucXVpc2hpbmcgY29udHJvbCB0byBhIHNlcGFyYXRlIGJyb3dzZXIgYXBwbGljYXRpb24uIFRoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIHRoZSBXZWJWaWV3IGNsYXNzZXMgYW5kIHByb3ZpZGVzIGEgc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGl0cyB1c2UuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aWtpbm90ZXMtbGlua2lmeS5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdXaWtpTm90ZXM6IExpbmtpZnkgeW91ciBUZXh0IScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ1RoaXMgYXJ0aWNsZSBpbnRyb2R1Y2VzIFdpa2lOb3RlcyBmb3IgQW5kcm9pZCwgcGFydCBvZiB0aGUgQXBwcyBmb3IgQW5kcm9pZCBwcm9qZWN0LiBJdCBjb3ZlcnMgdGhlIHVzZSBvZiBMaW5raWZ5IHRvIHR1cm4gb3JkaW5hcnkgdGV4dCB2aWV3cyBpbnRvIHJpY2hlciwgbGluay1vcmllbnRlZCBjb250ZW50IHRoYXQgY2F1c2VzIEFuZHJvaWQgaW50ZW50cyB0byBmaXJlIHdoZW4gYSBsaW5rIGlzIHNlbGVjdGVkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW50ZW50J10sCisgICAgcGF0aDogJ2FydGljbGVzL3dpa2lub3Rlcy1pbnRlbnRzLmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa2lOb3RlczogUm91dGluZyBJbnRlbnRzJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGlsbHVzdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiwgaW4gdGhpcyBjYXNlIHRoZSBXaWtpTm90ZXMgc2FtcGxlIGFwcCwgY2FuIHVzZSBpbnRlbnRzIHRvIHJvdXRlIHZhcmlvdXMgdHlwZXMgb2YgbGlua2VkIHRleHQgdG8gdGhlIGFwcGxpY2F0aW9uIHRoYXQgaGFuZGxlcyB0aGF0IHR5cGUgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIGFuIGFwcCBjYW4gdXNlIGludGVudHMgdG8gcm91dGUgYSBsaW5rZWQgdGVsZXBob25lIG51bWJlciB0byBhIGRpYWxlciBhcHAgYW5kIGEgd2ViIFVSTCB0byBhIGJyb3dzZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICd1aScsICdwZXJmb3JtYW5jZSddLAorICAgIHBhdGg6ICdhcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2luZG93IEJhY2tncm91bmRzICYgVUkgU3BlZWQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdTb21lIEFuZHJvaWQgYXBwbGljYXRpb25zIG5lZWQgdG8gc3F1ZWV6ZSBldmVyeSBiaXQgb2YgcGVyZm9ybWFuY2Ugb3V0IG9mIHRoZSBVSSB0b29sa2l0IGFuZCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIGRvIHNvLiBJbiB0aGlzIGFydGljbGUsIHlvdSB3aWxsIGRpc2NvdmVyIGhvdyB0byBzcGVlZCB1cCB0aGUgZHJhd2luZyBhbmQgdGhlIHBlcmNlaXZlZCBzdGFydHVwIHRpbWUgb2YgeW91ciBhY3Rpdml0aWVzLiBCb3RoIG9mIHRoZXNlIHRlY2huaXF1ZXMgcmVseSBvbiBhIHNpbmdsZSBmZWF0dXJlLCB0aGUgd2luZG93XCdzIGJhY2tncm91bmQgZHJhd2FibGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdwZXJmb3JtYW5jZScsICdiZXN0cHJhY3RpY2UnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnWmlwYWxpZ246IGFuIEVhc3kgT3B0aW1pemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIEFuZHJvaWQgU0RLIGluY2x1ZGVzIGEgdG9vbCBjYWxsZWQgemlwYWxpZ24gdGhhdCBvcHRpbWl6ZXMgdGhlIHdheSBhbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZC4gUnVubmluZyB6aXBhbGlnbiBhZ2FpbnN0IHlvdXIgYXBwbGljYXRpb24gZW5hYmxlcyBBbmRyb2lkIHRvIGludGVyYWN0IHdpdGggaXQgbW9yZSBlZmZpY2llbnRseSBhdCBydW4gdGltZSBhbmQgdGh1cyBoYXMgdGhlIHBvdGVudGlhbCB0byBtYWtlIGl0IGFuZCB0aGUgb3ZlcmFsbCBzeXN0ZW0gcnVuIGZhc3Rlci4gVGhpcyBhcnRpY2xlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgemlwYWxpZ24gdG9vbCBhbmQgaXRzIHVzZS4nCisgICAgfQorICB9LAorCisvLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gU0FNUExFIENPREUgLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FQSSBEZW1vcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBmcmFtZXdvcmsgdG9waWNzLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJywgJ25ld2ZlYXR1cmUnLCAnYWNjb3VudHN5bmMnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCYWNrdXAgYW5kIFJlc3RvcmUnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdJbGx1c3RyYXRlcyBhIGZldyBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0aGF0IGFuIGFwcGxpY2F0aW9uIGRldmVsb3BlciBjYW4gdGFrZSB3aGVuIGludGVncmF0aW5nIHdpdGggdGhlIEFuZHJvaWQgQmFja3VwIE1hbmFnZXIgdXNpbmcgdGhlIEJhY2t1cEFnZW50IEFQSSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4yLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdjb21tdW5pY2F0aW9uJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQmx1ZXRvb3RoQ2hhdC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCbHVldG9vdGggQ2hhdCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciB0d28td2F5IHRleHQgbWVzc2FnaW5nIG92ZXIgQmx1ZXRvb3RoLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdhY2NvdW50c3luYyddLAorICAgIHBhdGg6ICdzYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdCdXNpbmVzc0NhcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gbGF1bmNoIHRoZSBidWlsdC1pbiBjb250YWN0IHBpY2tlciBmcm9tIHdpdGhpbiBhbiBhY3Rpdml0eS4gVGhpcyBzYW1wbGUgYWxzbyB1c2VzIHJlZmxlY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgY29udGFjdHMgQVBJIGlzIHVzZWQsIGRlcGVuZGluZyBvbiB3aGljaCBBUEkgbGV2ZWwgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgdW5kZXIuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2FjY291bnRzeW5jJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvQ29udGFjdE1hbmFnZXIvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQ29udGFjdCBNYW5hZ2VyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQW4gYXBwbGljYXRpb24gdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIHF1ZXJ5IHRoZSBzeXN0ZW0gY29udGFjdHMgcHJvdmlkZXIgIHVzaW5nIHRoZSA8Y29kZT5Db250YWN0c0NvbnRyYWN0PC9jb2RlPiBBUEksIGFzIHdlbGwgYXMgaW5zZXJ0IGNvbnRhY3RzIGludG8gYSBzcGVjaWZpYyBhY2NvdW50LicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZSddLAorICAgIHBhdGg6ICdzYW1wbGVzL0hvbWUvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSG9tZScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgaG9tZSBzY3JlZW4gcmVwbGFjZW1lbnQgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9KZXRCb3kvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSmV0Qm95JworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBnYW1lIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBTT05pVk9YIEpFVCBpbnRlcmFjdGl2ZSBtdXNpYyB0ZWNobm9sb2d5LCB3aXRoIDxjb2RlPjxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9KZXRQbGF5ZXIuaHRtbCI+SmV0UGxheWVyPC9hPjwvY29kZT4uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ25ld2ZlYXR1cmUnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9DdWJlTGl2ZVdhbGxwYXBlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMaXZlIFdhbGxwYXBlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgYSBsaXZlIHdhbGxwYXBlciBhbmQgIGJ1bmRsZSBpdCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXJzIGNhbiBpbnN0YWxsIG9uIHRoZWlyIGRldmljZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2dhbWVkZXYnLCAnbWVkaWEnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9MdW5hckxhbmRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdMdW5hciBMYW5kZXInCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIGNsYXNzaWMgTHVuYXIgTGFuZGVyIGdhbWUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3VpJywgJ2Jlc3RwcmFjdGljZScsICdsYXlvdXQnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnTXVsdGlwbGUgUmVzb2x1dGlvbnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHNhbXBsZSBhcHBsaWNhdGlvbiB0aGF0IHNob3dzIGhvdyB0byB1c2UgcmVzb3VyY2UgZGlyZWN0b3J5IHF1YWxpZmllcnMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgcmVzb3VyY2VzIGZvciBkaWZmZXJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb25zLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdkYXRhJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvTm90ZVBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlIFBhZCcKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGFwcGxpY2F0aW9uIGZvciBzYXZpbmcgbm90ZXMuIFNpbWlsYXIgKGJ1dCBub3QgaWRlbnRpY2FsKSB0byB0aGUgPGEgaHJlZj0iL3Jlc291cmNlcy90dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sIj5Ob3RlcGFkIHR1dG9yaWFsPC9hPi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnYWNjb3VudHN5bmMnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTYW1wbGVTeW5jQWRhcHRlcicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0RlbW9uc3RyYXRlcyBob3cgYW4gYXBwbGljYXRpb24gY2FuIGNvbW11bmljYXRlIHdpdGggYSBjbG91ZC1iYXNlZCBzZXJ2aWNlIGFuZCBzeW5jaHJvbml6ZSBpdHMgZGF0YSB3aXRoIGRhdGEgc3RvcmVkIGxvY2FsbHkgaW4gYSBjb250ZW50IHByb3ZpZGVyLiBUaGUgc2FtcGxlIHVzZXMgdHdvIHJlbGF0ZWQgcGFydHMgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrICZtZGFzaDsgdGhlIGFjY291bnQgbWFuYWdlciBhbmQgdGhlIHN5bmNocm9uaXphdGlvbiBtYW5hZ2VyICh0aHJvdWdoIGEgc3luYyBhZGFwdGVyKS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknLCAnc2VhcmNoJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NlYXJjaGFibGUgRGljdGlvbmFyeSB2MicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egc2FtcGxlIGFwcGxpY2F0aW9uIHRoYXQgZGVtb25zdHJhdGVzIEFuZHJvaWRcJ3Mgc2VhcmNoIGZyYW1ld29yaywgaW5jbHVkaW5nIGhvdyB0byBwcm92aWRlIHNlYXJjaCBzdWdnZXN0aW9ucyBmb3IgUXVpY2sgU2VhcmNoIEJveC4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJ10sCisgICAgcGF0aDogJ3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU25ha2UnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xhc3NpYyBnYW1lICJTbmFrZS4iJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lci9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdTcGlubmVyJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgYW4gYXBwbGljYXRpb24gdW5kZXIgdGVzdCBmb3IgdGhlIFNwaW5uZXJUZXN0IGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU3Bpbm5lclRlc3QnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGUgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IFRlc3RpbmcgdHV0b3JpYWwuIEl0IHRlc3RzIHRoZSBTcGlubmVyIGV4YW1wbGUgYXBwbGljYXRpb24uJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1RpY1RhY1RvZUxpYicKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QsIGEgdHlwZSBvZiBwcm9qZWN0IHRoYXQgbGV0cyB5b3Ugc3RvcmUgYW5kIG1hbmFnZSBzaGFyZWQgY29kZSBhbmQgcmVzb3VyY2VzIGluIG9uZSBwbGFjZSwgdGhlbiBtYWtlIHRoZW0gYXZhaWxhYmxlIHRvIHlvdXIgb3RoZXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ25ld2ZlYXR1cmUnLCAnbmV3J10sCisgICAgcGF0aDogJ3NhbXBsZXMvVGljVGFjVG9lTWFpbi9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdUaWNUYWNUb2VNYWluJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnRGVtb25zdHJhdGVzIGhvdyBhbiBhcHBsaWNhdGlvbiBjYW4gbWFrZSB1c2Ugb2Ygc2hhcmVkIGNvZGUgYW5kIHJlc291cmNlcyBzdG9yZWQgaW4gYW4gQW5kcm9pZCBsaWJyYXJ5IHByb2plY3QuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2lucHV0J10sCisgICAgcGF0aDogJ3NhbXBsZXMvU29mdEtleWJvYXJkL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1NvZnQgS2V5Ym9hcmQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gaW5wdXQgbWV0aG9kIGZvciBhIHNvZnR3YXJlIGtleWJvYXJkLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICd1aSddLAorICAgIHBhdGg6ICdzYW1wbGVzL1dpa3Rpb25hcnkvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnV2lrdGlvbmFyeScKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0FuIGV4YW1wbGUgb2YgY3JlYXRpbmcgaW50ZXJhY3RpdmUgd2lkZ2V0cyBmb3IgZGlzcGxheSBvbiB0aGUgQW5kcm9pZCBob21lIHNjcmVlbi4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAndWknXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ1dpa3Rpb25hcnkgKFNpbXBsaWZpZWQpJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBzaW1wbGUgQW5kcm9pZCBob21lIHNjcmVlbiB3aWRnZXRzIGV4YW1wbGUuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2xheW91dCcsICduZXcnXSwKKyAgICBwYXRoOiAnc2FtcGxlcy9YbWxBZGFwdGVycy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdYTUwgQWRhcHRlcnMnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCaW5kaW5nIGRhdGEgdG8gdmlld3MgdXNpbmcgWE1MIEFkYXB0ZXJzIGV4YW1wbGVzLicKKyAgICB9CisgIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gVFVUT1JJQUxTIC8vLworLy8vLy8vLy8vLy8vLy8vLy8KKworICB7CisgICAgdGFnczogWyd0dXRvcmlhbCddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvaGVsbG8td29ybGQuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gV29ybGQnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdCZWdpbm5pbmcgYmFzaWMgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgd2l0aCB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnbGF5b3V0J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy92aWV3cy9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdIZWxsbyBWaWV3cycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0Egd2Fsay10aHJvdWdoIG9mIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGxheW91dHMgYW5kIHZpZXdzIGF2YWlsYWJsZSBpbiB0aGUgQW5kcm9pZCBTREsuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndWknLCAnYmVzdHByYWN0aWNlJ10sCisgICAgcGF0aDogJ3R1dG9yaWFscy9sb2NhbGl6YXRpb24vaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gTG9jYWxpemF0aW9uJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhlIGJhc2ljcyBvZiBsb2NhbGl6aW5nIHlvdXIgYXBwbGljYXRpb25zIGZvciBtdWx0aXBsZSBsYW5ndWFnZXMgYW5kIGxvY2FsZXMuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAnZGF0YSddLAorICAgIHBhdGg6ICd0dXRvcmlhbHMvbm90ZXBhZC9pbmRleC5odG1sJywKKyAgICB0aXRsZTogeworICAgICAgZW46ICdOb3RlcGFkIFR1dG9yaWFsJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnQSBtdWx0aS1wYXJ0IHR1dG9yaWFsIGRpc2N1c3NpbmcgaW50ZXJtZWRpYXRlLWxldmVsIGNvbmNlcHRzIHN1Y2ggYXMgZGF0YSBhY2Nlc3MuJworICAgIH0KKyAgfSwKKyAgeworICAgIHRhZ3M6IFsndHV0b3JpYWwnLCAndGVzdGluZycsICduZXcnXSwKKyAgICBwYXRoOiAndHV0b3JpYWxzL3Rlc3RpbmcvaGVsbG9hbmRyb2lkX3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnSGVsbG8gVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgYmFzaWMgaW50cm9kdWN0aW9uIHRvIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrLicKKyAgICB9CisgIH0sCisgIHsKKyAgICB0YWdzOiBbJ3R1dG9yaWFsJywgJ3Rlc3RpbmcnLCAnbmV3J10sCisgICAgcGF0aDogJ3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQWN0aXZpdHkgVGVzdGluZycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgbW9yZSBhZHZhbmNlZCBkZW1vbnN0cmF0aW9uIG9mIHRoZSBBbmRyb2lkIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCB0b29scy4nCisgICAgfQorICB9CitdOwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzIGIvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzCmluZGV4IDUyNjg5YjYuLmExNzExYjUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzX3RvYy5jcworKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlc190b2MuY3MKQEAgLTEsNSArMSw1NiBAQAogPHVsPgogICA8bGk+CisgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIFJlc291cmNlczwvc3Bhbj4KKyAgICA8L2gyPgorICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9icm93c2VyLmh0bWw/dGFnPXNhbXBsZSI+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNhbXBsZSBDb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlIiBzdHlsZT0iZGlzcGxheTpub25lIj5CZWlzcGllbGNvZGU8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkPDs2RpZ28gZGUgZWplbXBsbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXhlbXBsZSBkZSBjb2RlPC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Db2RpY2UgZGkgZXNlbXBpbzwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44K144Oz44OX44OrIOOCs+ODvOODiTwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1DTiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLVRXIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+CisgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtc2FtcGxlLWxpc3QiPgorICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9nZXQuaHRtbCI+CisgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5HZXR0aW5nIHRoZSBTYW1wbGVzPC9zcGFuPgorICAgICAgICAgICAgICA8L2E+PC9saT4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlIj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QXJ0aWNsZXM8L3NwYW4+CisgICAgICAgICAgICAgPC9hPjwvZGl2PgorICAgICAgICA8dWwgaWQ9ImRldmRvYy1uYXYtYXJ0aWNsZS1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InRvZ2dsZS1saXN0Ij4KKyAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz10dXRvcmlhbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlR1dG9yaWFsczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+TGVybnByb2dyYW1tZTwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+VHV0b3JpYWxlczwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RGlkYWN0aWNpZWxzPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Iml0IiBzdHlsZT0iZGlzcGxheTpub25lIj5Fc2VyY2l0YXppb25pPC9zcGFuPgorICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImphIiBzdHlsZT0iZGlzcGxheTpub25lIj7jg4Hjg6Xjg7zjg4jjg6rjgqLjg6s8L3NwYW4+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgorICAgICAgICAgICAgIDwvYT48L2Rpdj4KKyAgICAgICAgPHVsIGlkPSJkZXZkb2MtbmF2LXR1dG9yaWFsLWxpc3QiPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90b3BpY3MuaHRtbCI+CisgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvcGljczwvc3Bhbj4KKyAgICAgICAgICAgICA8L2E+PC9kaXY+CisgICAgICAgIDx1bCBpZD0iZGV2ZG9jLW5hdi10b3BpYy1saXN0Ij4KKyAgICAgICAgPC91bD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9saT4KKyAgPGxpPgogICAgIDxoMj48c3BhbiBjbGFzcz0iZW4iPkNvbW11bml0eTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJkZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImVzIj5Db211bmlkYWQ8L3NwYW4+CkBAIC0zNCwyNDEgKzg1LDYgQEAKICAgPC9saT48P2NzCiAgIC9pZgogPz4KLQotICA8bGk+Ci0gICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+VGVjaG5pY2FsIEFydGljbGVzPC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpIGNsYXNzPSJ0b2dnbGUtbGlzdCI+Ci0gICAgICAgIDxkaXY+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIEFydGljbGVzPC9zcGFuPgotICAgICAgICAgICAgIDwvYT48L2Rpdj4KLSAgICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2F2b2lkaW5nLW1lbW9yeS1sZWFrcy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkF2b2lkaW5nIE1lbW9yeSBMZWFrczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9iYWNrd2FyZC1jb21wYXRpYmlsaXR5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QmFja3dhcmQgQ29tcGF0aWJpbGl0eTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9jYW4taS11c2UtdGhpcy1pbnRlbnQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5DYW4gSSBVc2UgdGhpcyBJbnRlbnQ/PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NyZWF0aW5nLWlucHV0LW1ldGhvZC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNyZWF0aW5nIGFuIElucHV0IE1ldGhvZDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9kcmF3YWJsZS1tdXRhdGlvbnMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5EcmF3YWJsZSBNdXRhdGlvbnM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZmFzdGVyLXNjcmVlbi1vcmllbnRhdGlvbi1jaGFuZ2UuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GYXN0ZXIgU2NyZWVuIE9yaWVudGF0aW9uIENoYW5nZTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9mdXR1cmUtcHJvb2ZpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GdXR1cmUtUHJvb2ZpbmcgWW91ciBBcHBzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2dlc3R1cmVzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2VzdHVyZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvZ2xzdXJmYWNldmlldy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkludHJvZHVjaW5nIEdMU3VyZmFjZVZpZXc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1yZXVzZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFJldXNpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xheW91dC10cmlja3MtZWZmaWNpZW5jeS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IEVmZmljaWVuY3k8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1zdHVicy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IFZpZXdTdHVicyA8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGF5b3V0LXRyaWNrcy1tZXJnZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxheW91dCBUcmlja3M6IE1lcmdpbmcgPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpc3R2aWV3LWJhY2tncm91bmRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGlzdFZpZXcgQmFja2dyb3VuZHM8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvbGl2ZS1mb2xkZXJzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+TGl2ZSBGb2xkZXJzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkxpdmUgV2FsbHBhcGVyczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9vbi1zY3JlZW4taW5wdXRzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+T25zY3JlZW4gSW5wdXQgTWV0aG9kczwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9wYWlubGVzcy10aHJlYWRpbmcuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5QYWlubGVzcyBUaHJlYWRpbmc8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvcXNiLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UXVpY2sgU2VhcmNoIEJveDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGVlY2ggSW5wdXQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdG91Y2gtbW9kZS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlRvdWNoIE1vZGU8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvdHJhY2stbWVtLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VHJhY2tpbmcgTWVtb3J5IEFsbG9jYXRpb25zPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNS5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS41PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVJIEZyYW1ld29yayBDaGFuZ2VzIGluIEFuZHJvaWQgMS42PC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3RpbWVkLXVpLXVwZGF0ZXMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5VcGRhdGluZyB0aGUgVUkgZnJvbSBhIFRpbWVyPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3R0cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFRleHQtdG8tU3BlZWNoPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VXNpbmcgdGhlIENvbnRhY3RzIEFQSTwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy91c2luZy13ZWJ2aWV3cy5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlVzaW5nIFdlYlZpZXdzPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL2FydGljbGVzL3dpa2lub3Rlcy1saW5raWZ5Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lraU5vdGVzOiBMaW5raWZ5IHlvdXIgVGV4dCE8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvd2lraW5vdGVzLWludGVudHMuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaWtpTm90ZXM6IFJvdXRpbmcgSW50ZW50czwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9hcnRpY2xlcy93aW5kb3ctYmctc3BlZWQuaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5XaW5kb3cgQmFja2dyb3VuZHMgJmFtcDsgVUkgU3BlZWQ8L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYXJ0aWNsZXMvemlwYWxpZ24uaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5aaXBhbGlnbjogQW4gRWFzeSBPcHRpbWl6YXRpb248L3NwYW4+Ci0gICAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gICA8L2xpPgotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5UdXRvcmlhbHM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGUiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkxlcm5wcm9ncmFtbWU8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPlR1dG9yaWFsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkRpZGFjdGljaWVsczwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+RXNlcmNpdGF6aW9uaTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJqYSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+44OB44Ol44O844OI44Oq44Ki44OrPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InpoLUNOIiBzdHlsZT0iZGlzcGxheTpub25lIj48L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtVFciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICA8L2gyPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2hlbGxvLXdvcmxkLmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBXb3JsZDwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL3ZpZXdzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5IZWxsbyBWaWV3czwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL2xvY2FsaXphdGlvbi9pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gTG9jYWxpemF0aW9uPC9zcGFuPgotICAgICAgICAgIDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy90dXRvcmlhbHMvdGVzdGluZy9oZWxsb2FuZHJvaWRfdGVzdC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SGVsbG8gVGVzdGluZzwvc3Bhbj48L2E+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPgotICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvdHV0b3JpYWxzL25vdGVwYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk5vdGVwYWQgVHV0b3JpYWw8L3NwYW4+Ci0gICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3R1dG9yaWFscy90ZXN0aW5nL2FjdGl2aXR5X3Rlc3QuaHRtbCI+Ci0gICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkFjdGl2aXR5IFRlc3Rpbmc8L3NwYW4+PC9hPgotICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLQotCi0gIDxsaT4KLSAgICA8aDI+PHNwYW4gY2xhc3M9ImVuIj5TYW1wbGUgQ29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZSIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+QmVpc3BpZWxjb2RlPC9zcGFuPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVzIiBzdHlsZT0iZGlzcGxheTpub25lIj5Dw7NkaWdvIGRlIGVqZW1wbG88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZnIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPkV4ZW1wbGUgZGUgY29kZTwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+Q29kaWNlIGRpIGVzZW1waW88L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iamEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPuOCteODs+ODl+ODqyDjgrPjg7zjg4k8L3NwYW4+Ci0gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iemgtQ04iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvc3Bhbj4KLSAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ6aC1UVyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9zcGFuPgotICAgIDwvaDI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2dldC5odG1sIj4KLSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+R2V0dGluZyB0aGUgU2FtcGxlczwvc3Bhbj4KLSAgICAgICAgICA8L2E+PC9saT4KLSAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgotICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXN0IG9mIFNhbXBsZXM8L3NwYW4+Ci0gICAgICAgICAgICAgPC9hPjwvZGl2PgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0FwaURlbW9zL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QVBJIERlbW9zPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQmFja3VwUmVzdG9yZS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJhY2t1cCBhbmQgUmVzdG9yZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPiA8c3BhbiBjbGFzcz0ibmV3Ij5uZXchPC9zcGFuPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0JsdWV0b290aENoYXQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5CbHVldG9vdGggQ2hhdDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0J1c2luZXNzQ2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkJ1c2luZXNzIENhcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9Db250YWN0TWFuYWdlci9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbnRhY3QgTWFuYWdlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL0hvbWUvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ib21lPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvSmV0Qm95L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+SmV0Qm95PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvQ3ViZUxpdmVXYWxscGFwZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MaXZlIFdhbGxwYXBlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvTHVuYXJMYW5kZXIvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5MdW5hciBMYW5kZXI8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9NdWx0aVJlc29sdXRpb24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5NdWx0aXBsZSBSZXNvbHV0aW9uczwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL05vdGVQYWQvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5Ob3RlIFBhZDwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2FtcGxlIFN5bmMgQWRhcHRlcjwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NlYXJjaGFibGVEaWN0aW9uYXJ5L2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U2VhcmNoYWJsZSBEaWN0aW9uYXJ5IHYyPC9zcGFuPgotICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU25ha2UvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TbmFrZTwvc3Bhbj4KLSAgICAgICAgICAgICAgPC9hPjwvbGk+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlc291cmNlcy9zYW1wbGVzL1NvZnRLZXlib2FyZC9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlNvZnQgS2V5Ym9hcmQ8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9TcGlubmVyL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+U3Bpbm5lcjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvU3Bpbm5lclRlc3QvaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5TcGlubmVyVGVzdDwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvVGljVGFjVG9lTGliL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTGliPC9zcGFuPgotICAgICAgICAgICAgICAgIDwvYT4gPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9UaWNUYWNUb2VNYWluL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+VGljVGFjVG9lTWFpbjwvc3Bhbj4KLSAgICAgICAgICAgICAgICA8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVzb3VyY2VzL3NhbXBsZXMvV2lrdGlvbmFyeS9pbmRleC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPldpa3Rpb25hcnk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvc2FtcGxlcy9XaWt0aW9uYXJ5U2ltcGxlL2luZGV4Lmh0bWwiPgotICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+V2lrdGlvbmFyeSAoU2ltcGxpZmllZCk8L3NwYW4+Ci0gICAgICAgICAgICAgIDwvYT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotCi0KLQogICA8bGk+CiAgICAgPGgyPjxzcGFuIGNsYXNzPSJlbiI+TW9yZTwvc3Bhbj4KICAgICA8L2gyPgpAQCAtMjk3LDggKzExMyw2IEBACiAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KLQotCiA8L3VsPgogCiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE4ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9zYW1wbGVzL2ltYWdlcy9YbWxQaG90b3NBZGFwdGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL1htbFJzc1JlYWRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmODQxYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3NhbXBsZXMvaW1hZ2VzL3NhbXBsZV9ub3RlcGFkdGVzdF9qdW5pdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkYTU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvc2FtcGxlcy9pbWFnZXMvc2FtcGxlX25vdGVwYWR0ZXN0X2p1bml0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvdG9waWNzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTYwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3RvcGljcy5qZApAQCAtMCwwICsxLDcyIEBACitwYWdlLnRpdGxlPVRlY2huaWNhbCBSZXNvdXJjZSBUb3BpY3MKK0BqZDpib2R5CisKKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICNyZXNvdXJjZS10b3BpYy10YWJsZSB0ZCB7CisgICAgYm9yZGVyOiAwOworICAgIHBhZGRpbmc6IDA7CisgICAgbWFyZ2luOiAwOworICAgIHBhZGRpbmctbGVmdDogMWVtOworICAgIHdpZHRoOiAxOGVtOworICB9CisKKyAgI3Jlc291cmNlLXRvcGljLXRhYmxlIHVsIHsKKyAgICBwYWRkaW5nOiAwOworICAgIG1hcmdpbjogMDsKKyAgfQorCisgICNyZXNvdXJjZS10b3BpYy10YWJsZSBsaSB7CisgICAgbGlzdC1zdHlsZTogbm9uZTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMDsKKyAgfQorPC9zdHlsZT4KKworPHA+CitZb3UgY2FuIGJyb3dzZSB0aGUgbGlzdCBvZiB0ZWNobmljYWwgcmVzb3VyY2VzIGJ5IHRvcGljIGJ5IGNsaWNraW5nIG9uIHRoZQorbGlua3MgYmVsb3cuIE92ZXIgdGltZSwgYXMgbW9yZSB0b3BpY3MgYXJlIGFkZGVkLCB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlCitsaXN0IGJlbG93LgorPC9wPgorCis8bm9zY3JpcHQ+CisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPkVycm9yOjwvc3Ryb25nPgorICAgIFlvdSBtdXN0IGhhdmUgSmF2YVNjcmlwdCBlbmFibGVkIHRvIHZpZXcgdGhpcyBwYWdlLiBSZXNvdXJjZXMgYXJlIGFsc28KKyAgICBhdmFpbGFibGUgb2ZmbGluZSBpbiB0aGUgU0RLLgorICA8L3A+Cis8L25vc2NyaXB0PgorCis8dGFibGUgaWQ9InJlc291cmNlLXRvcGljLXRhYmxlIj4KKyAgPHRyPjwvdHI+Cis8L3RhYmxlPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8IS0tIAorKGZ1bmN0aW9uKCkgeworICB2YXIgdG9waWNzID0gW107CisgIGZvciAodmFyIHRvcGljIGluIEFORFJPSURfVEFHU1sndG9waWMnXSkgeworICAgIHRvcGljcy5wdXNoKHtuYW1lOnRvcGljLHRpdGxlOkFORFJPSURfVEFHU1sndG9waWMnXVt0b3BpY119KTsKKyAgfQorICB0b3BpY3Muc29ydChmdW5jdGlvbih4LHkpeyByZXR1cm4gKHgudGl0bGUgPCB5LnRpdGxlKSA/IC0xIDogMTsgfSk7CisgIHZhciB0b3BpY1BhcmVudCA9IG51bGw7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9waWNzLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHRvcGljUGFyZW50ID09IG51bGwgfHwgaSAlIDEwID09IDApIHsKKyAgICAgIC8vIGNyZWF0ZSBhIG5ldyBjb2x1bW4KKyAgICAgIHRvcGljUGFyZW50ID0gJCgndWwnLCAkKCc8dGQ+PHVsPicpLmFwcGVuZFRvKCcjcmVzb3VyY2UtdG9waWMtdGFibGUgdHInKSk7CisgICAgfQorCisgICAgdG9waWNQYXJlbnQuYXBwZW5kKAorICAgICAgICAkKCc8bGk+JykuYXBwZW5kKAorICAgICAgICAgICQoJzxoMz4nKS5hcHBlbmQoCisgICAgICAgICAgICAkKCc8YT4nKQorICAgICAgICAgICAgICAuYXR0cignaHJlZicsIHRvUm9vdCArICJyZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz0iICsgdG9waWNzW2ldLm5hbWUpCisgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPHNwYW4+JykKKyAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2VuJykKKyAgICAgICAgICAgICAgICAuaHRtbCh0b3BpY3NbaV0udGl0bGUpCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgICApCisgICAgICAgICk7CisgIH0KK30pKCk7CisvLy0tPgorPC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcC5qYXZhCmluZGV4IDdjYTM3NDEuLjlhMTkwNTYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXAuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwLmphdmEKQEAgLTE5LDEyICsxOSwxNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkZpbmFsaXplcnM7CiAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5JbnRCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uU2hvcnRCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBCaXRtYXAgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKICAgICAvKioKQEAgLTM1LDkgKzM5LDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9OT05FID0gMDsKICAgICAKLSAgICAvLyBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgLy8gRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZUJpdG1hcDsKKyAgICAvKioKKyAgICAgKiBOb3RlOiAgbU5hdGl2ZUJpdG1hcCBpcyB1c2VkIGJ5IEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogRG9uJ3QgY2hhbmdlL3JlbmFtZSB3aXRob3V0IHVwZGF0aW5nIEZhY2VEZXRlY3Rvcl9qbmkuY3BwCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IG1OYXRpdmVCaXRtYXA7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzTXV0YWJsZTsKICAgICBwcml2YXRlIGJ5dGVbXSBtTmluZVBhdGNoQ2h1bms7ICAgLy8gbWF5IGJlIG51bGwKQEAgLTUxLDcgKzU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXRyaXggc1NjYWxlTWF0cml4OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgaW50IHNEZWZhdWx0RGVuc2l0eSA9IC0xOwotICAgIAorCiAgICAgLyoqCiAgICAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGxvd3MgdGhlIGFwcCBsYXllciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgKiBkZW5zaXR5IHdoZW4gcnVubmluZyBvbGQgYXBwcy4KQEAgLTc3LDggKzg1LDcgQEAKIAogICAgICAgICBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBKTkkgY29kZS4KICAgICAqLwotICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssCi0gICAgICAgICAgICBpbnQgZGVuc2l0eSkgeworICAgIHByaXZhdGUgQml0bWFwKGludCBuYXRpdmVCaXRtYXAsIGJvb2xlYW4gaXNNdXRhYmxlLCBieXRlW10gbmluZVBhdGNoQ2h1bmssIGludCBkZW5zaXR5KSB7CiAgICAgICAgIGlmIChuYXRpdmVCaXRtYXAgPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludGVybmFsIGVycm9yOiBuYXRpdmUgYml0bWFwIGlzIDAiKTsKICAgICAgICAgfQpAQCAtOTAsNiArOTcsMTMgQEAKICAgICAgICAgaWYgKGRlbnNpdHkgPj0gMCkgewogICAgICAgICAgICAgbURlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGZpbmFsaXplcnMgcXVldWUgaXMgbnVsbCwgd2UgYXJlIHJ1bm5pbmcgaW4genlnb3RlIGFuZCB0aGUKKyAgICAgICAgLy8gYml0bWFwIHdpbGwgbmV2ZXIgYmUgcmVjbGFpbWVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJ1biBvdXIgbmF0aXZlCisgICAgICAgIC8vIGRlc3RydWN0b3IKKyAgICAgICAgaWYgKEZpbmFsaXplcnMuZ2V0UXVldWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXcgQml0bWFwRmluYWxpemVyKHRoaXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzIsNiArMTg2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2VuZXJhdGlvbiBJRCBvZiB0aGlzIGJpdG1hcC4gVGhlIGdlbmVyYXRpb24gSUQgY2hhbmdlcworICAgICAqIHdoZW5ldmVyIHRoZSBiaXRtYXAgaXMgbW9kaWZpZWQuIFRoaXMgY2FuIGJlIHVzZWQgYXMgYW4gZWZmaWNpZW50IHdheSB0bworICAgICAqIGNoZWNrIGlmIGEgYml0bWFwIGhhcyBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBJRCBmb3IgdGhpcyBiaXRtYXAuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdlbmVyYXRpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUdlbmVyYXRpb25JZChtTmF0aXZlQml0bWFwKTsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgbWV0aG9kcyB0aGF0IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBiaXRtYXAKICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHJlY3ljbGVkLgogICAgICAqLwpAQCAtNDE5LDI4ICs0NDYsMzAgQEAKICAgICAgICAgUmVjdCBzcmNSID0gbmV3IFJlY3QoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0KTsKICAgICAgICAgUmVjdEYgZHN0UiA9IG5ldyBSZWN0RigwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKIAorICAgICAgICBmaW5hbCBDb25maWcgbmV3Q29uZmlnID0gc291cmNlLmdldENvbmZpZygpID09IENvbmZpZy5BUkdCXzg4ODggPworICAgICAgICAgICAgICAgIENvbmZpZy5BUkdCXzg4ODggOiBDb25maWcuUkdCXzU2NTsKKwogICAgICAgICBpZiAobSA9PSBudWxsIHx8IG0uaXNJZGVudGl0eSgpKSB7Ci0gICAgICAgICAgICBiaXRtYXAgPSBjcmVhdGVCaXRtYXAobmV3dywgbmV3aCwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmhhc0FscGhhKCkgPyBDb25maWcuQVJHQl84ODg4IDogQ29uZmlnLlJHQl81NjUpOworICAgICAgICAgICAgYml0bWFwID0gY3JlYXRlQml0bWFwKG5ld3csIG5ld2gsIG5ld0NvbmZpZywgc291cmNlLmhhc0FscGhhKCkpOwogICAgICAgICAgICAgcGFpbnQgPSBudWxsOyAgIC8vIG5vdCBuZWVkZWQKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qICB0aGUgZHN0IHNob3VsZCBoYXZlIGFscGhhIGlmIHRoZSBzcmMgZG9lcywgb3IgaWYgb3VyIG1hdHJpeAotICAgICAgICAgICAgICAgIGRvZXNuJ3QgcHJlc2VydmUgcmVjdG5lc3MKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIGhhc0FscGhhID0gc291cmNlLmhhc0FscGhhKCkgfHwgIW0ucmVjdFN0YXlzUmVjdCgpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2Zvcm1lZCA9ICFtLnJlY3RTdGF5c1JlY3QoKTsKKwogICAgICAgICAgICAgUmVjdEYgZGV2aWNlUiA9IG5ldyBSZWN0RigpOwogICAgICAgICAgICAgbS5tYXBSZWN0KGRldmljZVIsIGRzdFIpOworCiAgICAgICAgICAgICBuZXd3ID0gTWF0aC5yb3VuZChkZXZpY2VSLndpZHRoKCkpOwogICAgICAgICAgICAgbmV3aCA9IE1hdGgucm91bmQoZGV2aWNlUi5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBiaXRtYXAgPSBjcmVhdGVCaXRtYXAobmV3dywgbmV3aCwgaGFzQWxwaGEgPyBDb25maWcuQVJHQl84ODg4IDogQ29uZmlnLlJHQl81NjUpOwotICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgYml0bWFwLmVyYXNlQ29sb3IoMCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpdG1hcCA9IGNyZWF0ZUJpdG1hcChuZXd3LCBuZXdoLCB0cmFuc2Zvcm1lZCA/IENvbmZpZy5BUkdCXzg4ODggOiBuZXdDb25maWcsCisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIHx8IHNvdXJjZS5oYXNBbHBoYSgpKTsKKwogICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtZGV2aWNlUi5sZWZ0LCAtZGV2aWNlUi50b3ApOwogICAgICAgICAgICAgY2FudmFzLmNvbmNhdChtKTsKKwogICAgICAgICAgICAgcGFpbnQgPSBuZXcgUGFpbnQoKTsKICAgICAgICAgICAgIHBhaW50LnNldEZpbHRlckJpdG1hcChmaWx0ZXIpOwotICAgICAgICAgICAgaWYgKCFtLnJlY3RTdGF5c1JlY3QoKSkgeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVkKSB7CiAgICAgICAgICAgICAgICAgcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NjUsOCArNDk0LDMwIEBACiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBhcmUgPD0gMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGNyZWF0ZUJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQsIENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBjb25maWcsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtdXRhYmxlIGJpdG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGggYW5kIGhlaWdodC4gIEl0cworICAgICAqIGluaXRpYWwgZGVuc2l0eSBpcyBhcyBwZXIge0BsaW5rICNnZXREZW5zaXR5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aWR0aCAgICBUaGUgd2lkdGggb2YgdGhlIGJpdG1hcAorICAgICAqIEBwYXJhbSBoZWlnaHQgICBUaGUgaGVpZ2h0IG9mIHRoZSBiaXRtYXAKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgVGhlIGJpdG1hcCBjb25maWcgdG8gY3JlYXRlLgorICAgICAqIEBwYXJhbSBoYXNBbHBoYSBJZiB0aGUgYml0bWFwIGlzIEFSR0JfODg4OCB0aGlzIGZsYWcgY2FuIGJlIHVzZWQgdG8gbWFyayB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgYml0bWFwIGFzIG9wYXF1ZS4gRG9pbmcgc28gd2lsbCBjbGVhciB0aGUgYml0bWFwIGluIGJsYWNrCisgICAgICogICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdHJhbnNwYXJlbnQuICAKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgd2lkdGggb3IgaGVpZ2h0IGFyZSA8PSAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwIGNyZWF0ZUJpdG1hcChpbnQgd2lkdGgsIGludCBoZWlnaHQsIENvbmZpZyBjb25maWcsIGJvb2xlYW4gaGFzQWxwaGEpIHsKICAgICAgICAgQml0bWFwIGJtID0gbmF0aXZlQ3JlYXRlKG51bGwsIDAsIHdpZHRoLCB3aWR0aCwgaGVpZ2h0LCBjb25maWcubmF0aXZlSW50LCB0cnVlKTsKLSAgICAgICAgYm0uZXJhc2VDb2xvcigwKTsgICAgLy8gc3RhcnQgd2l0aCBibGFjay90cmFuc3BhcmVudCBwaXhlbHMKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBDb25maWcuQVJHQl84ODg4ICYmICFoYXNBbHBoYSkgeworICAgICAgICAgICAgYm0uZXJhc2VDb2xvcigweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIG5hdGl2ZVNldEhhc0FscGhhKGJtLm1OYXRpdmVCaXRtYXAsIGhhc0FscGhhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJtLmVyYXNlQ29sb3IoMCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJtOwogICAgIH0KIApAQCAtOTk5LDEyICsxMDUwLDIyIEBACiAgICAgICAgIG5hdGl2ZVByZXBhcmVUb0RyYXcobU5hdGl2ZUJpdG1hcCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaXRtYXBGaW5hbGl6ZXIgZXh0ZW5kcyBGaW5hbGl6ZXJzLlJlY2xhaW1hYmxlUmVmZXJlbmNlPEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qml0bWFwRmluYWxpemVyPiBzRmluYWxpemVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldCgKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxCaXRtYXBGaW5hbGl6ZXI+KCkpOworCisgICAgICAgIHByaXZhdGUgaW50IG1OYXRpdmVCaXRtYXA7CisKKyAgICAgICAgQml0bWFwRmluYWxpemVyKEJpdG1hcCBiKSB7CisgICAgICAgICAgICBzdXBlcihiLCBGaW5hbGl6ZXJzLmdldFF1ZXVlKCkpOworICAgICAgICAgICAgbU5hdGl2ZUJpdG1hcCA9IGIubU5hdGl2ZUJpdG1hcDsKKyAgICAgICAgICAgIHNGaW5hbGl6ZXJzLmFkZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWNsYWltKCkgewogICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlQml0bWFwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgICAgICBzRmluYWxpemVycy5yZW1vdmUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwNDEsNiArMTEwMiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlQ29weVBpeGVsc1RvQnVmZmVyKGludCBuYXRpdmVCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBkc3QpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZUNvcHlQaXhlbHNGcm9tQnVmZmVyKGludCBuYiwgQnVmZmVyIHNyYyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVHZW5lcmF0aW9uSWQoaW50IG5hdGl2ZUJpdG1hcCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQml0bWFwIG5hdGl2ZUNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHApOwogICAgIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCkBAIC0xMDU2LDcgKzExMTgsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVByZXBhcmVUb0RyYXcoaW50IG5hdGl2ZUJpdG1hcCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0SGFzQWxwaGEoaW50IG5CaXRtYXAsIGJvb2xlYW4gaGFzQWxwaGEpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNhbWVBcyhpbnQgbmIwLCBpbnQgbmIxKTsKLQorICAgIAogICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgaW50IG5pKCkgewogICAgICAgICByZXR1cm4gbU5hdGl2ZUJpdG1hcDsKICAgICB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcEZhY3RvcnkuamF2YQppbmRleCA2MjM0ZjJjLi5kYzIxYTcyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQub3MuTWVtb3J5RmlsZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBwaXhlbCBkZW5zaXR5IHRvIHVzZSBmb3IgdGhlIGJpdG1hcC4gIFRoaXMgd2lsbCBhbHdheXMgcmVzdWx0CiAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBiaXRtYXAgaGF2aW5nIGEgZGVuc2l0eSBzZXQgZm9yIGl0IChzZWUKLSAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KSkuICBJbiBhZGRpdGlvbiwKKyAgICAgICAgICoge0BsaW5rIEJpdG1hcCNzZXREZW5zaXR5KGludCkgQml0bWFwLnNldERlbnNpdHkoaW50KX0pLiAgSW4gYWRkaXRpb24sCiAgICAgICAgICAqIGlmIHtAbGluayAjaW5TY2FsZWR9IGlzIHNldCAod2hpY2ggaXQgaXMgYnkgZGVmYXVsdH0gYW5kIHRoaXMKICAgICAgICAgICogZGVuc2l0eSBkb2VzIG5vdCBtYXRjaCB7QGxpbmsgI2luVGFyZ2V0RGVuc2l0eX0sIHRoZW4gdGhlIGJpdG1hcAogICAgICAgICAgKiB3aWxsIGJlIHNjYWxlZCB0byB0aGUgdGFyZ2V0IGRlbnNpdHkgYmVmb3JlIGJlaW5nIHJldHVybmVkLgpAQCAtNTA3LDkgKzUwNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaXMgVGhlIGlucHV0IHN0cmVhbSB0aGF0IGhvbGRzIHRoZSByYXcgZGF0YSB0byBiZSBkZWNvZGVkIGludG8gYQogICAgICAqICAgICAgICAgICBiaXRtYXAuCi0gICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIGltYWdlIGRhdGEgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBkZWNvZGVkLCBvciwgaWYgb3B0cyBpcyBub24tbnVsbCwgaWYgb3B0cyByZXF1ZXN0ZWQgb25seSB0aGUKLSAgICAgKiAgICAgICAgIHNpemUgYmUgcmV0dXJuZWQgKGluIG9wdHMub3V0V2lkdGggYW5kIG9wdHMub3V0SGVpZ2h0KQorICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYml0bWFwLCBvciBudWxsIGlmIHRoZSBpbWFnZSBkYXRhIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZVN0cmVhbShJbnB1dFN0cmVhbSBpcykgewogICAgICAgICByZXR1cm4gZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBudWxsKTsKQEAgLTUzMCwxOCArNTI3LDYgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJpdG1hcCwgb3IgbnVsbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQml0bWFwIGRlY29kZUZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkLCBSZWN0IG91dFBhZGRpbmcsIE9wdGlvbnMgb3B0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKE1lbW9yeUZpbGUuaXNNZW1vcnlGaWxlKGZkKSkgewotICAgICAgICAgICAgICAgIGludCBtYXBwZWRsZW5ndGggPSBNZW1vcnlGaWxlLmdldFNpemUoZmQpOwotICAgICAgICAgICAgICAgIE1lbW9yeUZpbGUgZmlsZSA9IG5ldyBNZW1vcnlGaWxlKGZkLCBtYXBwZWRsZW5ndGgsICJyIik7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBmaWxlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQml0bWFwIGJtID0gZGVjb2RlU3RyZWFtKGlzLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoRGVjb2RlKGJtLCBvdXRQYWRkaW5nLCBvcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIGludmFsaWQgZmlsZWRlc2NyaXB0b3IsIG5vIG5lZWQgdG8gY2FsbCBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogICAgICAgICBCaXRtYXAgYm0gPSBuYXRpdmVEZWNvZGVGaWxlRGVzY3JpcHRvcihmZCwgb3V0UGFkZGluZywgb3B0cyk7CiAgICAgICAgIHJldHVybiBmaW5pc2hEZWNvZGUoYm0sIG91dFBhZGRpbmcsIG9wdHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBTaGFkZXIuamF2YQppbmRleCA2MTJiMGFiLi40YmE2NzliIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwU2hhZGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0JpdG1hcFNoYWRlci5qYXZhCkBAIC0xNiwxMCArMTYsMTYgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCisvKioKKyAqIFNoYWRlciB1c2VkIHRvIGRyYXcgYSBiaXRtYXAgYXMgYSB0ZXh0dXJlLiBUaGUgYml0bWFwIGNhbiBiZSByZXBlYXRlZCBvcgorICogbWlycm9yZWQgYnkgc2V0dGluZyB0aGUgdGlsaW5nIG1vZGUuCisgKi8KIHB1YmxpYyBjbGFzcyBCaXRtYXBTaGFkZXIgZXh0ZW5kcyBTaGFkZXIgewotCi0gICAgLy8gd2UgaG9sZCBvbiBqdXN0IGZvciB0aGUgR0MsIHNpbmNlIG91ciBuYXRpdmUgY291bnRlcnBhcnQgaXMgdXNpbmcgaXQKLSAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwOworICAgIC8qKgorICAgICAqIFByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKIAogICAgIC8qKgogICAgICAqIENhbGwgdGhpcyB0byBjcmVhdGUgYSBuZXcgc2hhZGVyIHRoYXQgd2lsbCBkcmF3IHdpdGggYSBiaXRtYXAuCkBAIC0zMCwxMiArMzYsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQml0bWFwU2hhZGVyKEJpdG1hcCBiaXRtYXAsIFRpbGVNb2RlIHRpbGVYLCBUaWxlTW9kZSB0aWxlWSkgewogICAgICAgICBtQml0bWFwID0gYml0bWFwOwotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUoYml0bWFwLm5pKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlWC5uYXRpdmVJbnQsIHRpbGVZLm5hdGl2ZUludCk7CisgICAgICAgIGZpbmFsIGludCBiID0gYml0bWFwLm5pKCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZShiLCB0aWxlWC5uYXRpdmVJbnQsIHRpbGVZLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlKG5hdGl2ZV9pbnN0YW5jZSwgYiwgdGlsZVgubmF0aXZlSW50LCB0aWxlWS5uYXRpdmVJbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7ICAgIAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlKGludCBuYXRpdmVfYml0bWFwLCBpbnQgc2hhZGVyVGlsZU1vZGVYLAorICAgICAgICAgICAgaW50IHNoYWRlclRpbGVNb2RlWSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX2JpdG1hcCwKKyAgICAgICAgICAgIGludCBzaGFkZXJUaWxlTW9kZVgsIGludCBzaGFkZXJUaWxlTW9kZVkpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggNzZjZGU3My4uZTc1YTE5ZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQpAQCAtMTYsMTEgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmVkU3RyaW5nOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKIGltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDsKIApAQCAtNDMsMjIgKzQyLDM5IEBACiAgICAgICAgIGZvciBib3RoIHRvIGJlIG51bGwuCiAgICAgKi8KICAgICBwcml2YXRlIEJpdG1hcCAgbUJpdG1hcDsgICAgLy8gaWYgbm90IG51bGwsIG1HTCBtdXN0IGJlIG51bGwKLSAgICBwcml2YXRlIEdMICAgICAgbUdMOyAgICAgICAgLy8gaWYgbm90IG51bGwsIG1CaXRtYXAgbXVzdCBiZSBudWxsCiAgICAgCiAgICAgLy8gb3B0aW9uYWwgZmllbGQgc2V0IGJ5IHRoZSBjYWxsZXIKLSAgICBwcml2YXRlIERyYXdGaWx0ZXIgIG1EcmF3RmlsdGVyOworICAgIHByaXZhdGUgRHJhd0ZpbHRlciBtRHJhd0ZpbHRlcjsKIAotICAgIC8vIFBhY2thZ2Utc2NvcGVkIGZvciBxdWljayBhY2Nlc3MuCi0gICAgLypwYWNrYWdlKi8gaW50IG1EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbURlbnNpdHkgPSBCaXRtYXAuREVOU0lUWV9OT05FOwogCi0gICAgLy8gVXNlZCB0byBkZXRlcm1pbmUgd2hlbiBjb21wYXRpYmlsaXR5IHNjYWxpbmcgaXMgaW4gZWZmZWN0LgotICAgIHByaXZhdGUgaW50IG1TY3JlZW5EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGRldGVybWluZSB3aGVuIGNvbXBhdGliaWxpdHkgc2NhbGluZyBpcyBpbiBlZmZlY3QuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1TY3JlZW5EZW5zaXR5ID0gQml0bWFwLkRFTlNJVFlfTk9ORTsKICAgICAKICAgICAvLyBVc2VkIGJ5IG5hdGl2ZSBjb2RlCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQogICAgIHByaXZhdGUgaW50ICAgICAgICAgbVN1cmZhY2VGb3JtYXQ7CiAKICAgICAvKioKKyAgICAgKiBGbGFnIGZvciBkcmF3VGV4dFJ1biBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGRyYXdUZXh0UnVuIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisgICAgCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGVtcHR5IHJhc3RlciBjYW52YXMuIFVzZSBzZXRCaXRtYXAoKSB0byBzcGVjaWZ5IGEgYml0bWFwIHRvCiAgICAgICogZHJhdyBpbnRvLiAgVGhlIGluaXRpYWwgdGFyZ2V0IGRlbnNpdHkgaXMge0BsaW5rIEJpdG1hcCNERU5TSVRZX05PTkV9OwogICAgICAqIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgcmVwbGFjZWQgd2hlbiBhIHRhcmdldCBiaXRtYXAgaXMgc2V0IGZvciB0aGUKQEAgLTg5LDQ3ICsxMDUsMzcgQEAKICAgICAgICAgbURlbnNpdHkgPSBiaXRtYXAubURlbnNpdHk7CiAgICAgfQogICAgIAotICAgIC8qcGFja2FnZSovIENhbnZhcyhpbnQgbmF0aXZlQ2FudmFzKSB7CisgICAgQ2FudmFzKGludCBuYXRpdmVDYW52YXMpIHsKICAgICAgICAgaWYgKG5hdGl2ZUNhbnZhcyA9PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgbU5hdGl2ZUNhbnZhcyA9IG5hdGl2ZUNhbnZhczsKICAgICAgICAgbURlbnNpdHkgPSBCaXRtYXAuZ2V0RGVmYXVsdERlbnNpdHkoKTsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBjYW52YXMgd2l0aCB0aGUgc3BlY2lmaWVkIGdsIGNvbnRleHQuIEFsbCBkcmF3aW5nIHRocm91Z2gKLSAgICAgKiB0aGlzIGNhbnZhcyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gT3BlbkdMLiBOb3RlOiBzb21lIGZlYXR1cmVzIG1heSBub3QKLSAgICAgKiBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBtb2RlIChlLmcuIHNvbWUgR0wgaW1wbGVtZW50YXRpb25zIG1heSBub3Qgc3VwcG9ydAotICAgICAqIGFudGlhbGlhc2luZyBvciBjZXJ0YWluIGVmZmVjdHMgbGlrZSBDb2xvck1hdHJpeCBvciBjZXJ0YWluIFhmZXJtb2RlcykuCi0gICAgICogSG93ZXZlciwgbm8gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGluIHRob3NlIGNhc2VzLgorICAgICAqIFJldHVybnMgbnVsbC4KICAgICAgKiAKLSAgICAgKiA8cD5UaGUgaW5pdGlhbCB0YXJnZXQgZGVuc2l0eSBvZiB0aGUgY2FudmFzIGlzIHRoZSBzYW1lIGFzIHRoZSBpbml0aWFsCi0gICAgICogZGVuc2l0eSBvZiBiaXRtYXBzIGFzIHBlciB7QGxpbmsgQml0bWFwI2dldERlbnNpdHkoKSBCaXRtYXAuZ2V0RGVuc2l0eSgpfS4KKyAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgbm90IGJlIGludm9rZWQuCiAgICAgICovCi0gICAgcHVibGljIENhbnZhcyhHTCBnbCkgewotICAgICAgICBtTmF0aXZlQ2FudmFzID0gaW5pdEdMKCk7Ci0gICAgICAgIG1HTCA9IGdsOwotICAgICAgICBtRGVuc2l0eSA9IEJpdG1hcC5nZXREZWZhdWx0RGVuc2l0eSgpOworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIEdMIGdldEdMKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEdMIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYW52YXMsIG9yIG51bGwgaWYgaXQgaXMgbm90Ci0gICAgICogYmFja2VkIGJ5IEdMLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgQ2FudmFzIHVzZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgICAqIAorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgd2hhdCB0eXBlIG9mIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorICAgICAqIG1heSBvciBtYXkgbm90IGJlIHVzZWQuCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIGRyYXdpbmcgb3BlcmF0aW9ucyBhcmUgaGFyZHdhcmUgYWNjZWxlcmF0ZWQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIEdMIGdldEdMKCkgewotICAgICAgICByZXR1cm4gbUdMOworICAgIHB1YmxpYyBib29sZWFuIGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgdG8gZnJlZSB1cCBPcGVuR0wgcmVzb3VyY2VzIHRoYXQgbWF5IGJlIGNhY2hlZCBvciBhbGxvY2F0ZWQKLSAgICAgKiBvbiBiZWhhbGYgb2YgdGhlIENhbnZhcy4gQW55IHN1YnNlcXVlbnQgZHJhd2luZyB3aXRoIGEgR0wtYmFja2VkIENhbnZhcwotICAgICAqIHdpbGwgaGF2ZSB0byByZWNyZWF0ZSB0aG9zZSByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZyZWVHbENhY2hlcygpIHsKLSAgICAgICAgZnJlZUNhY2hlcygpOwotICAgIH0KLSAgICAgICAgCisKICAgICAvKioKICAgICAgKiBTcGVjaWZ5IGEgYml0bWFwIGZvciB0aGUgY2FudmFzIHRvIGRyYXcgaW50by4gIEFzIGEgc2lkZS1lZmZlY3QsIGFsc28KICAgICAgKiB1cGRhdGVzIHRoZSBjYW52YXMncyB0YXJnZXQgZGVuc2l0eSB0byBtYXRjaCB0aGF0IG9mIHRoZSBiaXRtYXAuCkBAIC0xNDMsNyArMTQ5LDcgQEAKICAgICAgICAgaWYgKCFiaXRtYXAuaXNNdXRhYmxlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUdMICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGEgYml0bWFwIGRldmljZSBvbiBhIEdMIGNhbnZhcyIpOwogICAgICAgICB9CiAgICAgICAgIHRocm93SWZSZWN5Y2xlZChiaXRtYXApOwpAQCAtMTU3LDEzICsxNjMsMTIgQEAKICAgICAgKiBTZXQgdGhlIHZpZXdwb3J0IGRpbWVuc2lvbnMgaWYgdGhpcyBjYW52YXMgaXMgR0wgYmFzZWQuIElmIGl0IGlzIG5vdCwKICAgICAgKiB0aGlzIG1ldGhvZCBpcyBpZ25vcmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICAqCi0gICAgICogIEBwYXJhbSB3aWR0aCAgICBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0Ci0gICAgICogIEBwYXJhbSBoZWlnaHQgICBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHZpZXdwb3J0CisgICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydAorICAgICAqIAorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtR0wgIT0gbnVsbCkgewotICAgICAgICAgICAgbmF0aXZlU2V0Vmlld3BvcnQobU5hdGl2ZUNhbnZhcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM3Nyw4ICszODIsOCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHN4IFRoZSBhbW91bnQgdG8gc2NhbGUgaW4gWAogICAgICAqIEBwYXJhbSBzeSBUaGUgYW1vdW50IHRvIHNjYWxlIGluIFkKLSAgICAgKiBAcGFyYW0gcHggVGhlIHgtY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSByb3RhdGlvbikKLSAgICAgKiBAcGFyYW0gcHkgVGhlIHktY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSByb3RhdGlvbikKKyAgICAgKiBAcGFyYW0gcHggVGhlIHgtY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSBzY2FsZSkKKyAgICAgKiBAcGFyYW0gcHkgVGhlIHktY29vcmQgZm9yIHRoZSBwaXZvdCBwb2ludCAodW5jaGFuZ2VkIGJ5IHRoZSBzY2FsZSkKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGZsb2F0IHB4LCBmbG9hdCBweSkgewogICAgICAgICB0cmFuc2xhdGUocHgsIHB5KTsKQEAgLTYyMSw3ICs2MjYsMTEgQEAKICAgICAgICAgRWRnZVR5cGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIAogICAgIC8qKgpAQCAtOTU4LDYgKzk2NywyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgYml0bWFwIGFzIGFuIE4tcGF0Y2ggKG1vc3Qgb2Z0ZW4sIGEgOS1wYXRjaGVzLikKKyAgICAgKgorICAgICAqIE5vdGU6IE9ubHkgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlIGFjY2VsZXJhdGVkIGNhbnZhcyBhdCB0aGUgbW9tZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGJpdG1hcCBUaGUgYml0bWFwIHRvIGRyYXcgYXMgYW4gTi1wYXRjaAorICAgICAqIEBwYXJhbSBjaHVua3MgVGhlIHBhdGNoZXMgaW5mb3JtYXRpb24gKG1hdGNoZXMgdGhlIG5hdGl2ZSBzdHJ1Y3QgUmVzX3BuZ185cGF0Y2gpCisgICAgICogQHBhcmFtIGRzdCBUaGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZHJhdyB0aGUgYml0bWFwIHdpdGguIG1heSBiZSBudWxsCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3UGF0Y2goQml0bWFwIGJpdG1hcCwgYnl0ZVtdIGNodW5rcywgUmVjdEYgZHN0LCBQYWludCBwYWludCkgeworICAgIH0gICAgCisgICAgCisgICAgLyoqCiAgICAgICogRHJhdyB0aGUgc3BlY2lmaWVkIGJpdG1hcCwgd2l0aCBpdHMgdG9wL2xlZnQgY29ybmVyIGF0ICh4LHkpLCB1c2luZwogICAgICAqIHRoZSBzcGVjaWZpZWQgcGFpbnQsIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IG1hdHJpeC4KICAgICAgKiAKQEAgLTEyNDYsOCArMTI3MCw4IEBACiAgICAgICAgICAgICAodGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjU5LDcgKzEyODMsMTAgQEAKICAgICAgKiBAcGFyYW0geSAgICAgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0ZXh0IGJlaW5nIGRyYXduCiAgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB1c2VkIGZvciB0aGUgdGV4dCAoZS5nLiBjb2xvciwgc2l6ZSwgc3R5bGUpCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSB2b2lkIGRyYXdUZXh0KFN0cmluZyB0ZXh0LCBmbG9hdCB4LCBmbG9hdCB5LCBQYWludCBwYWludCk7CisgICAgcHVibGljIHZvaWQgZHJhd1RleHQoU3RyaW5nIHRleHQsIGZsb2F0IHgsIGZsb2F0IHksIFBhaW50IHBhaW50KSB7CisgICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpLCB4LCB5LCBwYWludC5tQmlkaUZsYWdzLAorICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRHJhdyB0aGUgdGV4dCwgd2l0aCBvcmlnaW4gYXQgKHgseSksIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFpbnQuCkBAIC0xMjc3LDggKzEzMDQsOCBAQAogICAgICAgICBpZiAoKHN0YXJ0IHwgZW5kIHwgKGVuZCAtIHN0YXJ0KSB8ICh0ZXh0Lmxlbmd0aCgpIC0gZW5kKSkgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIG5hdGl2ZV9kcmF3VGV4dChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBzdGFydCwgZW5kLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIHRleHQsIHN0YXJ0LCBlbmQsIHgsIHksIHBhaW50Lm1CaWRpRmxhZ3MsCisgICAgICAgICAgICAgICAgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyOTksMTYgKzEzMjYsMTA4IEBACiAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nIHx8IHRleHQgaW5zdGFuY2VvZiBTcGFubmVkU3RyaW5nIHx8CiAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CiAgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHQobU5hdGl2ZUNhbnZhcywgdGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1OYXRpdmVQYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50Lm1CaWRpRmxhZ3MsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgIH0gZWxzZSBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgewogICAgICAgICAgICAgKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmRyYXdUZXh0KHRoaXMsIHN0YXJ0LCBlbmQsIHgsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKICAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOwotICAgICAgICAgICAgZHJhd1RleHQoYnVmLCAwLCBlbmQgLSBzdGFydCwgeCwgeSwgcGFpbnQpOworICAgICAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG1OYXRpdmVDYW52YXMsIGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHgsIHksIAorICAgICAgICAgICAgICAgICAgICBwYWludC5tQmlkaUZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHJ1biBvZiBhbGwgTFRSIG9yIGFsbCBSVEwgdGV4dCwgd2l0aCBzaGFwaW5nLiBUaGlzIGRvZXMgbm90IHJ1bgorICAgICAqIGJpZGkgb24gdGhlIHByb3ZpZGVkIHRleHQsIGJ1dCByZW5kZXJzIGl0IGFzIGEgdW5pZm9ybSByaWdodC10by1sZWZ0IG9yCisgICAgICogbGVmdC10by1yaWdodCBydW4sIGFzIGluZGljYXRlZCBieSBkaXIuIEFsaWdubWVudCBvZiB0aGUgdGV4dCBpcyBhcworICAgICAqIGRldGVybWluZWQgYnkgdGhlIFBhaW50J3MgVGV4dEFsaWduIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIGNvdW50IHRoZSBjb3VudCBvZiBjaGFycyB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gY29udGV4dEluZGV4IHRoZSBzdGFydCBvZiB0aGUgY29udGV4dCBmb3Igc2hhcGluZy4gIE11c3QgYmUKKyAgICAgKiAgICAgICAgIG5vIGdyZWF0ZXIgdGhhbiBpbmRleC4KKyAgICAgKiBAcGFyYW0gY29udGV4dENvdW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgY29udGV4dCBmb3Igc2hhcGluZy4KKyAgICAgKiAgICAgICAgIENvbnRleEluZGV4ICsgY29udGV4dENvdW50IG11c3QgYmUgbm8gbGVzcyB0aGFuIGluZGV4CisgICAgICogICAgICAgICArIGNvdW50LgorICAgICAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBhdCB3aGljaCB0byBkcmF3IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGRpciB0aGUgcnVuIGRpcmVjdGlvbiwgZWl0aGVyIHtAbGluayAjRElSRUNUSU9OX0xUUn0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayAjRElSRUNUSU9OX1JUTH0uCisgICAgICogQHBhcmFtIHBhaW50IHRoZSBwYWludAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHJhd1RleHRSdW4oY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGRpciwKKyAgICAgICAgICAgIFBhaW50IHBhaW50KSB7CisKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZXh0IGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFpbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYWludCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbmRleCB8IGNvdW50IHwgdGV4dC5sZW5ndGggLSBpbmRleCAtIGNvdW50KSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpciAhPSBESVJFQ1RJT05fTFRSICYmIGRpciAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGRpcjogIiArIGRpcik7CisgICAgICAgIH0KKworICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LAorICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgY29udGV4dENvdW50LCB4LCB5LCBkaXIsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgcnVuIG9mIGFsbCBMVFIgb3IgYWxsIFJUTCB0ZXh0LCB3aXRoIHNoYXBpbmcuIFRoaXMgZG9lcyBub3QgcnVuCisgICAgICogYmlkaSBvbiB0aGUgcHJvdmlkZWQgdGV4dCwgYnV0IHJlbmRlcnMgaXQgYXMgYSB1bmlmb3JtIHJpZ2h0LXRvLWxlZnQgb3IKKyAgICAgKiBsZWZ0LXRvLXJpZ2h0IHJ1biwgYXMgaW5kaWNhdGVkIGJ5IGRpci4gQWxpZ25tZW50IG9mIHRoZSB0ZXh0IGlzIGFzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgUGFpbnQncyBUZXh0QWxpZ24gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byByZW5kZXIKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlbmRlci4gRGF0YSBiZWZvcmUgdGhpcyBwb3NpdGlvbgorICAgICAqICAgICAgICAgICAgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVuZGVyLiBEYXRhIGF0IG9yIGFmdGVyIHRoaXMKKyAgICAgKiAgICAgICAgICAgIHBvc2l0aW9uIGNhbiBiZSB1c2VkIGZvciBzaGFwaW5nIGNvbnRleHQuCisgICAgICogQHBhcmFtIHggdGhlIHggcG9zaXRpb24gYXQgd2hpY2ggdG8gZHJhdyB0aGUgdGV4dAorICAgICAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIGF0IHdoaWNoIHRvIGRyYXcgdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBydW4gZGlyZWN0aW9uLCBlaXRoZXIgMCBmb3IgTFRSIG9yIDEgZm9yIFJUTC4KKyAgICAgKiBAcGFyYW0gcGFpbnQgdGhlIHBhaW50CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkcmF3VGV4dFJ1bihDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGZsb2F0IHgsIGZsb2F0IHksIGludCBkaXIsCisgICAgICAgICAgICBQYWludCBwYWludCkgeworCisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGV4dCBpcyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFpbnQgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCBlbmQgLSBzdGFydCB8IHRleHQubGVuZ3RoKCkgLSBlbmQpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmbGFncyA9IGRpciA9PSAwID8gMCA6IDE7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGV4dCBpbnN0YW5jZW9mIFNwYW5uZWRTdHJpbmcgfHwKKyAgICAgICAgICAgICAgICB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlU3RyaW5nKSB7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgdGV4dC50b1N0cmluZygpLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICB9IGVsc2UgaWYgKHRleHQgaW5zdGFuY2VvZiBHcmFwaGljc09wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5kcmF3VGV4dFJ1bih0aGlzLCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIHgsIHksIGZsYWdzLCBwYWludCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY29udGV4dExlbiA9IGNvbnRleHRFbmQgLSBjb250ZXh0U3RhcnQ7CisgICAgICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gVGVtcG9yYXJ5QnVmZmVyLm9idGFpbihjb250ZXh0TGVuKTsKKyAgICAgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRSdW4obU5hdGl2ZUNhbnZhcywgYnVmLCBzdGFydCAtIGNvbnRleHRTdGFydCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCB4LCB5LCBmbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICAgICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5yZWN5Y2xlKGJ1Zik7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzY4LDcgKzE0ODcsNyBAQAogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9kcmF3VGV4dE9uUGF0aChtTmF0aXZlQ2FudmFzLCB0ZXh0LCBpbmRleCwgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLm5pKCksIGhPZmZzZXQsIHZPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpbnQubUJpZGlGbGFncywgcGFpbnQubU5hdGl2ZVBhaW50KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzODgsNyArMTUwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgUGFpbnQgcGFpbnQpIHsKICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICBuYXRpdmVfZHJhd1RleHRPblBhdGgobU5hdGl2ZUNhbnZhcywgdGV4dCwgcGF0aC5uaSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsIHZPZmZzZXQsIHBhaW50Lm1OYXRpdmVQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwgdk9mZnNldCwgcGFpbnQubUJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludC5tTmF0aXZlUGFpbnQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDMxLDI4ICsxNTUxLDc0IEBACiAgICAgICAgIGRyYXdQaWN0dXJlKHBpY3R1cmUpOwogICAgICAgICByZXN0b3JlKCk7CiAgICAgfQotICAgIAorCisgICAgLyoqCisgICAgICogPHA+QWNxdWlyZXMgdGhlIENhbnZhcyBjb250ZXh0LiBBZnRlciBpbnZva2luZyB0aGlzIG1ldGhvZCwgdGhlIENhbnZhcworICAgICAqIGNvbnRleHQgIGNhbiBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBhY3F1aXJlCisgICAgICogdGhlIGNvbnRleHQgb2YgYW4gT3BlbkdMIENhbnZhcyB5b3UgY2FuIHJlc2V0IHRoZSBHTCB2aWV3cG9ydCwgc2Npc3NvciwKKyAgICAgKiBldGMuPC9wPgorICAgICAqIAorICAgICAqIDxwPkEgY2FsbCB0byB7QGxpbmsgI2FjcXVpcmVDb250ZXh0KCl9IHNob3VsZCBhd2F5cyBiZSBmb2xsb3dlZCBieQorICAgICAqIGEgY2FsbCB0byB7QGxpbmsgI3JlbGVhc2VDb250ZXh0KCl9LCBwcmVmZXJyYWJseSB1c2luZyBhIHRyeSBibG9jazo8L3A+CisgICAgICogCisgICAgICogPHByZT4KKyAgICAgKiB0cnkgeworICAgICAqICAgICBpZiAoY2FudmFzLmFjcXVpcmVDb250ZXh0KCkpIHsKKyAgICAgKiAgICAgICAgIC8vIFVzZSB0aGUgY2FudmFzIGFuZC9vciBpdHMgY29udGV4dAorICAgICAqICAgICB9CisgICAgICogfSBmaW5hbGx5IHsKKyAgICAgKiAgICAgY2FudmFzLnJlbGVhc2VDb250ZXh0KCk7CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqIAorICAgICAqIDxwPkFjcXVpcmluZyB0aGUgY29udGV4dCBjYW4gYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiBhbmQgc2hvdWxkIG5vdAorICAgICAqIGJlIGRvbmUgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5BcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVyIGludm9rZSB0aGlzIG1ldGhvZCBkaXJlY3RseS48L3A+CisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb250ZXh0IGNvdWxkIGJlIGFjcXVpcmVkIHN1Y2Nlc3NmdWxseSwgZmFsc2UKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSAoaWYgdGhlIGNvbnRleHQgaXMgYWxyZWFkeSBhY3F1aXJlZCBmb3IgaW5zdGFuY2UuKQorICAgICAqIAorICAgICAqIEBzZWUgI3JlbGVhc2VDb250ZXh0KCkgCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlJlbGVhc2UgdGhlIGNvbnRleHQgYWNxdWlyZWQgd2l0aCB7QGxpbmsgI2FjcXVpcmVDb250ZXh0KCl9LjwvcD4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNhY3F1aXJlQ29udGV4dCgpIAorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZUNvbnRleHQoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiBiZWZvcmUgc2V0dGluZyBtTmF0aXZlQ2FudmFzLCB0aGUgbmF0aXZlIGZpbmFsaXplcgotICAgICAgICAvLyBtdXN0IG5vdCBiZSBpbnZva2VkLgotICAgICAgICBpZiAobU5hdGl2ZUNhbnZhcyAhPSAwKSB7Ci0gICAgICAgICAgICBmaW5hbGl6ZXIobU5hdGl2ZUNhbnZhcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHRocmV3IGFuIGV4Y2VwdGlvbiBiZWZvcmUgc2V0dGluZyBtTmF0aXZlQ2FudmFzLAorICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBmaW5hbGl6ZXIgbXVzdCBub3QgYmUgaW52b2tlZC4KKyAgICAgICAgICAgIGlmIChtTmF0aXZlQ2FudmFzICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbGl6ZXIobU5hdGl2ZUNhbnZhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGcmVlIHVwIGFzIG11Y2ggbWVtb3J5IGFzIHBvc3NpYmxlIGZyb20gcHJpdmF0ZSBjYWNoZXMgKGUuZy4gZm9udHMsCi0gICAgICogaW1hZ2VzKQorICAgICAqIEZyZWUgdXAgYXMgbXVjaCBtZW1vcnkgYXMgcG9zc2libGUgZnJvbSBwcml2YXRlIGNhY2hlcyAoZS5nLiBmb250cywgaW1hZ2VzKQogICAgICAqCi0gICAgICogQGhpZGUgLSBmb3Igbm93CisgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIGZyZWVDYWNoZXMoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgaW5pdFJhc3RlcihpbnQgbmF0aXZlQml0bWFwT3JaZXJvKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IGluaXRHTCgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9zZXRCaXRtYXAoaW50IG5hdGl2ZUNhbnZhcywgaW50IGJpdG1hcCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0Vmlld3BvcnQoaW50IG5DYW52YXMsIGludCB3LCBpbnQgaCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfc2F2ZUxheWVyKGludCBuYXRpdmVDYW52YXMsIFJlY3RGIGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhaW50LCBpbnQgbGF5ZXJGbGFncyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfc2F2ZUxheWVyKGludCBuYXRpdmVDYW52YXMsIGZsb2F0IGwsCkBAIC0xNTU1LDEwICsxNzIxLDE5IEBACiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0KGludCBuYXRpdmVDYW52YXMsIGNoYXJbXSB0ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9kcmF3VGV4dChpbnQgbmF0aXZlQ2FudmFzLCBTdHJpbmcgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRSdW4oaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2RyYXdUZXh0UnVuKGludCBuYXRpdmVDYW52YXMsIGNoYXJbXSB0ZXh0LAorICAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0Q291bnQsCisgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCk7CisKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1Bvc1RleHQoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBmbG9hdFtdIHBvcywKQEAgLTE1NzAsMTEgKzE3NDUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgaW50IGJpZGlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1RleHRPblBhdGgoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2T2Zmc2V0LCBpbnQgcGFpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoT2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdk9mZnNldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgaW50IHBhaW50KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZHJhd1BpY3R1cmUoaW50IG5hdGl2ZUNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5hdGl2ZVBpY3R1cmUpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlQ2FudmFzKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKaW5kZXggNzZmMmM3Zi4uZTVjZjgzMCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yRmlsdGVyLmphdmEKQEAgLTIzLDEyICsyMywyMCBAQAogCiAKIHB1YmxpYyBjbGFzcyBDb2xvckZpbHRlciB7CisgICAgaW50IG5hdGl2ZV9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVDb2xvckZpbHRlcjsKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UsIG5hdGl2ZUNvbG9yRmlsdGVyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGZpbmFsaXplcihpbnQgbmF0aXZlX2luc3RhbmNlKTsKLQotICAgIGludCBuYXRpdmVfaW5zdGFuY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UsIGludCBuYXRpdmVDb2xvckZpbHRlcik7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbG9yTWF0cml4Q29sb3JGaWx0ZXIuamF2YQppbmRleCA1ZDczY2ZmLi4yNDVjNjE1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29sb3JNYXRyaXhDb2xvckZpbHRlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db2xvck1hdHJpeENvbG9yRmlsdGVyLmphdmEKQEAgLTI1LDcgKzI1LDkgQEAKICAgICAgKiAgICAgICAgICAgICAgIGlzIGNvbnN0cnVjdGVkIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgZmlsdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBDb2xvck1hdHJpeENvbG9yRmlsdGVyKENvbG9yTWF0cml4IG1hdHJpeCkgewotICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihtYXRyaXguZ2V0QXJyYXkoKSk7CisgICAgICAgIGZpbmFsIGZsb2F0W10gY29sb3JNYXRyaXggPSBtYXRyaXguZ2V0QXJyYXkoKTsKKyAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoY29sb3JNYXRyaXgpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5Db2xvck1hdHJpeEZpbHRlcihjb2xvck1hdHJpeCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MCw3ICs0Miw5IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ29sb3JNYXRyaXhGaWx0ZXIoYXJyYXkpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5Db2xvck1hdHJpeEZpbHRlcihhcnJheSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDb2xvck1hdHJpeEZpbHRlcihmbG9hdFtdIGFycmF5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5Db2xvck1hdHJpeEZpbHRlcihmbG9hdFtdIGFycmF5KTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvQ29tcG9zZVNoYWRlci5qYXZhCmluZGV4IGEwNmQzMGIuLjhkNWM5MTMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Db21wb3NlU2hhZGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0NvbXBvc2VTaGFkZXIuamF2YQpAQCAtMjAsNiArMjAsMTQgQEAKICAgICBhbiB7QGxpbmsgYW5kcm9pZC5ncmFwaGljcy5YZmVybW9kZX0gc3ViY2xhc3MuCiAqLwogcHVibGljIGNsYXNzIENvbXBvc2VTaGFkZXIgZXh0ZW5kcyBTaGFkZXIgeworICAgIC8qKgorICAgICAqIEhvbGQgb250byB0aGUgc2hhZGVycyB0byBhdm9pZCBHQy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCisgICAgcHJpdmF0ZSBmaW5hbCBTaGFkZXIgbVNoYWRlckE7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgZmluYWwgU2hhZGVyIG1TaGFkZXJCOworCiAgICAgLyoqIENyZWF0ZSBhIG5ldyBjb21wb3NlIHNoYWRlciwgZ2l2ZW4gc2hhZGVycyBBLCBCLCBhbmQgYSBjb21iaW5pbmcgbW9kZS4KICAgICAgICAgV2hlbiB0aGUgbW9kZSBpcyBhcHBsaWVkLCBpdCB3aWxsIGJlIGdpdmVuIHRoZSByZXN1bHQgZnJvbSBzaGFkZXIgQSBhcyBpdHMKICAgICAgICAgImRzdCIsIGFuZCB0aGUgcmVzdWx0IG9mIGZyb20gc2hhZGVyIEIgYXMgaXRzICJzcmMiLgpAQCAtMjksOCArMzcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG51bGwsIHRoZW4gU1JDX09WRVIgaXMgYXNzdW1lZC4KICAgICAqLwogICAgIHB1YmxpYyBDb21wb3NlU2hhZGVyKFNoYWRlciBzaGFkZXJBLCBTaGFkZXIgc2hhZGVyQiwgWGZlcm1vZGUgbW9kZSkgeworICAgICAgICBtU2hhZGVyQSA9IHNoYWRlckE7CisgICAgICAgIG1TaGFkZXJCID0gc2hhZGVyQjsKICAgICAgICAgbmF0aXZlX2luc3RhbmNlID0gbmF0aXZlQ3JlYXRlMShzaGFkZXJBLm5hdGl2ZV9pbnN0YW5jZSwgc2hhZGVyQi5uYXRpdmVfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgIT0gbnVsbCkgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICAgICAgICAgIChtb2RlICE9IG51bGwpID8gbW9kZS5uYXRpdmVfaW5zdGFuY2UgOiAwKTsKKyAgICAgICAgaWYgKG1vZGUgaW5zdGFuY2VvZiBQb3J0ZXJEdWZmWGZlcm1vZGUpIHsKKyAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZSBwZE1vZGUgPSAoKFBvcnRlckR1ZmZYZmVybW9kZSkgbW9kZSkubW9kZTsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBwZE1vZGUgIT0gbnVsbCA/IHBkTW9kZS5uYXRpdmVJbnQgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgc2hhZGVyQi5uYXRpdmVfc2hhZGVyLCBtb2RlICE9IG51bGwgPyBtb2RlLm5hdGl2ZV9pbnN0YW5jZSA6IDApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIENyZWF0ZSBhIG5ldyBjb21wb3NlIHNoYWRlciwgZ2l2ZW4gc2hhZGVycyBBLCBCLCBhbmQgYSBjb21iaW5pbmcgUG9ydGVyRHVmZiBtb2RlLgpAQCAtNDEsMTEgKzU5LDIwIEBACiAgICAgICAgIEBwYXJhbSBtb2RlICAgICBUaGUgUG9ydGVyRHVmZiBtb2RlIHRoYXQgY29tYmluZXMgdGhlIGNvbG9ycyBmcm9tIHRoZSB0d28gc2hhZGVycy4KICAgICAqLwogICAgIHB1YmxpYyBDb21wb3NlU2hhZGVyKFNoYWRlciBzaGFkZXJBLCBTaGFkZXIgc2hhZGVyQiwgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgbVNoYWRlckEgPSBzaGFkZXJBOworICAgICAgICBtU2hhZGVyQiA9IHNoYWRlckI7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTIoc2hhZGVyQS5uYXRpdmVfaW5zdGFuY2UsIHNoYWRlckIubmF0aXZlX2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUubmF0aXZlSW50KTsKKyAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMihuYXRpdmVfaW5zdGFuY2UsIHNoYWRlckEubmF0aXZlX3NoYWRlciwKKyAgICAgICAgICAgICAgICBzaGFkZXJCLm5hdGl2ZV9zaGFkZXIsIG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTEoaW50IG5hdGl2ZV9zaGFkZXJBLCBpbnQgbmF0aXZlX3NoYWRlckIsIGludCBuYXRpdmVfbW9kZSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLCBpbnQgcG9ydGVyRHVmZk1vZGUpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlckEsIGludCBuYXRpdmVfc2hhZGVyQiwKKyAgICAgICAgICAgIGludCBuYXRpdmVfbW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyQSwgaW50IG5hdGl2ZV9zaGFkZXJCLAorICAgICAgICAgICAgaW50IHBvcnRlckR1ZmZNb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUxKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXJBLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyQiwgaW50IG5hdGl2ZV9tb2RlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZVBvc3RDcmVhdGUyKGludCBuYXRpdmVfc2hhZGVyLCBpbnQgbmF0aXZlX3NraWFTaGFkZXJBLAorICAgICAgICAgICAgaW50IG5hdGl2ZV9za2lhU2hhZGVyQiwgaW50IHBvcnRlckR1ZmZNb2RlKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaWdodGluZ0NvbG9yRmlsdGVyLmphdmEKaW5kZXggNTU2MjM4OS4uNzE1Y2U4NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL0xpZ2h0aW5nQ29sb3JGaWx0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGlnaHRpbmdDb2xvckZpbHRlci5qYXZhCkBAIC0zMCw3ICszMCw5IEBACiAgICAgICovCiAgICAgcHVibGljIExpZ2h0aW5nQ29sb3JGaWx0ZXIoaW50IG11bCwgaW50IGFkZCkgewogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIobXVsLCBhZGQpOworICAgICAgICBuYXRpdmVDb2xvckZpbHRlciA9IG5DcmVhdGVMaWdodGluZ0ZpbHRlcihtdWwsIGFkZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoaW50IG11bCwgaW50IGFkZCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlTGlnaHRpbmdGaWx0ZXIoaW50IG11bCwgaW50IGFkZCk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTGluZWFyR3JhZGllbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCmluZGV4IGUzZGIxMDUuLjgyZWQxOTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9MaW5lYXJHcmFkaWVudC5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKIHB1YmxpYyBjbGFzcyBMaW5lYXJHcmFkaWVudCBleHRlbmRzIFNoYWRlciB7Ci0KIAkvKioJQ3JlYXRlIGEgc2hhZGVyIHRoYXQgZHJhd3MgYSBsaW5lYXIgZ3JhZGllbnQgYWxvbmcgYSBsaW5lLgogICAgICAgICBAcGFyYW0geDAgICAgICAgICAgIFRoZSB4LWNvb3JkaW5hdGUgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ3JhZGllbnQgbGluZQogICAgICAgICBAcGFyYW0geTAgICAgICAgICAgIFRoZSB5LWNvb3JkaW5hdGUgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ3JhZGllbnQgbGluZQpAQCAtMzgsNiArMzcsOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29sb3IgYW5kIHBvc2l0aW9uIGFycmF5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aCIpOwogICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZTEoeDAsIHkwLCB4MSwgeTEsIGNvbG9ycywgcG9zaXRpb25zLCB0aWxlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9zaGFkZXIgPSBuYXRpdmVQb3N0Q3JlYXRlMShuYXRpdmVfaW5zdGFuY2UsIHgwLCB5MCwgeDEsIHkxLCBjb2xvcnMsIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICB0aWxlLm5hdGl2ZUludCk7CiAgICAgfQogCiAJLyoqCUNyZWF0ZSBhIHNoYWRlciB0aGF0IGRyYXdzIGEgbGluZWFyIGdyYWRpZW50IGFsb25nIGEgbGluZS4KQEAgLTUyLDEyICs1MywxNiBAQAogCXB1YmxpYyBMaW5lYXJHcmFkaWVudChmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgVGlsZU1vZGUgdGlsZSkgewogICAgICAgICBuYXRpdmVfaW5zdGFuY2UgPSBuYXRpdmVDcmVhdGUyKHgwLCB5MCwgeDEsIHkxLCBjb2xvcjAsIGNvbG9yMSwgdGlsZS5uYXRpdmVJbnQpOworICAgICAgICBuYXRpdmVfc2hhZGVyID0gbmF0aXZlUG9zdENyZWF0ZTIobmF0aXZlX2luc3RhbmNlLCB4MCwgeTAsIHgxLCB5MSwgY29sb3IwLCBjb2xvcjEsCisgICAgICAgICAgICAgICAgdGlsZS5uYXRpdmVJbnQpOwogICAgIH0KIAotCi0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVDcmVhdGUxKGZsb2F0IHgwLCBmbG9hdCB5MCwgZmxvYXQgeDEsIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOwotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMihmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yMCwgaW50IGNvbG9yMSwgaW50IHRpbGVNb2RlKTsKKwlwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ3JlYXRlMShmbG9hdCB4MCwgZmxvYXQgeTAsIGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgIGludCBjb2xvcnNbXSwgZmxvYXQgcG9zaXRpb25zW10sIGludCB0aWxlTW9kZSk7CisJcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZUNyZWF0ZTIoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMShpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3JzW10sIGZsb2F0IHBvc2l0aW9uc1tdLCBpbnQgdGlsZU1vZGUpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVQb3N0Q3JlYXRlMihpbnQgbmF0aXZlX3NoYWRlciwgZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICBpbnQgY29sb3IwLCBpbnQgY29sb3IxLCBpbnQgdGlsZU1vZGUpOwogfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTWF0cml4LmphdmEKaW5kZXggZjU0OTkwMC4uYjMzNjk5NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL01hdHJpeC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9NYXRyaXguamF2YQpAQCAtMzcsNyArMzcsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNUEVSU1BfMSA9IDc7ICAgLy8hPCB1c2Ugd2l0aCBnZXRWYWx1ZXMvc2V0VmFsdWVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVBFUlNQXzIgPSA4OyAgIC8vITwgdXNlIHdpdGggZ2V0VmFsdWVzL3NldFZhbHVlcwogCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBuYXRpdmVfaW5zdGFuY2U7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvTmluZVBhdGNoLmphdmEKaW5kZXggODhkZmQ2Ny4uZGY2ZmViYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9OaW5lUGF0Y2guamF2YQpAQCAtMzUsNiArMzUsMTIgQEAKICAqIDwvcD4KICAqLwogcHVibGljIGNsYXNzIE5pbmVQYXRjaCB7CisgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtQ2h1bms7CisgICAgcHJpdmF0ZSBQYWludCBtUGFpbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNyY05hbWU7ICAvLyBVc2VmdWwgZm9yIGRlYnVnZ2luZworICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVJlY3QgPSBuZXcgUmVjdEYoKTsKKyAgICAKICAgICAvKiogCiAgICAgICogQ3JlYXRlIGEgZHJhd2FibGUgcHJvamVjdGlvbiBmcm9tIGEgYml0bWFwIHRvIG5pbmUgcGF0Y2hlcy4KICAgICAgKgpAQCAtNzQsMTAgKzgwLDE0IEBACiAgICAgICogQHBhcmFtIGxvY2F0aW9uICBXaGVyZSB0byBkcmF3IHRoZSBiaXRtYXAuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0RiBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5uaSgpLCBtQ2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgIG1QYWludCAhPSBudWxsID8gbVBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGNoKG1CaXRtYXAsIG1DaHVuaywgbG9jYXRpb24sIG51bGwpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qKiAKQEAgLTg3LDEwICs5NywxNSBAQAogICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgV2hlcmUgdG8gZHJhdyB0aGUgYml0bWFwLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcywgUmVjdCBsb2NhdGlvbikgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywKLSAgICAgICAgICAgICAgICBtUGFpbnQgIT0gbnVsbCA/IG1QYWludC5tTmF0aXZlUGFpbnQgOiAwLAotICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIGlmICghY2FudmFzLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7CisgICAgICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRtYXAubmkoKSwgbUNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhaW50ICE9IG51bGwgPyBtUGFpbnQubU5hdGl2ZVBhaW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBudWxsKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKiAKQEAgLTEwMSw5ICsxMTYsMTQgQEAKICAgICAgKiBAcGFyYW0gcGFpbnQgICAgIFRoZSBQYWludCB0byBkcmF3IHRocm91Z2guCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzLCBSZWN0IGxvY2F0aW9uLCBQYWludCBwYWludCkgewotICAgICAgICBuYXRpdmVEcmF3KGNhbnZhcy5tTmF0aXZlQ2FudmFzLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCi0gICAgICAgICAgICAgICAgY2FudmFzLm1EZW5zaXR5LCBtQml0bWFwLm1EZW5zaXR5KTsKKyAgICAgICAgaWYgKCFjYW52YXMuaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIG5hdGl2ZURyYXcoY2FudmFzLm1OYXRpdmVDYW52YXMsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBtQml0bWFwLm5pKCksIG1DaHVuaywgcGFpbnQgIT0gbnVsbCA/IHBhaW50Lm1OYXRpdmVQYWludCA6IDAsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5tRGVuc2l0eSwgbUJpdG1hcC5tRGVuc2l0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVjdC5zZXQobG9jYXRpb24pOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRjaChtQml0bWFwLCBtQ2h1bmssIG1SZWN0LCBwYWludCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMywxMSArMTUzLDYgQEAKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGlzTmluZVBhdGNoQ2h1bmsoYnl0ZVtdIGNodW5rKTsKIAotICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbUNodW5rOwotICAgIHByaXZhdGUgUGFpbnQgICAgICAgIG1QYWludDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgICBtU3JjTmFtZTsgIC8vIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0KICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCB2YWxpZGF0ZU5pbmVQYXRjaENodW5rKGludCBiaXRtYXAsIGJ5dGVbXSBjaHVuayk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRHJhdyhpbnQgY2FudmFzX2luc3RhbmNlLCBSZWN0RiBsb2MsIGludCBiaXRtYXBfaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYywgaW50IHBhaW50X2luc3RhbmNlX29yX251bGwsCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCmluZGV4IDNlM2Y4N2IuLjYyZmJmYjQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYWludC5qYXZhCkBAIC0xNiwxMCArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuR3JhcGhpY3NPcGVyYXRpb25zOwogaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmc7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uZWRTdHJpbmc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LkdyYXBoaWNzT3BlcmF0aW9uczsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogCiAvKioKICAqIFRoZSBQYWludCBjbGFzcyBob2xkcyB0aGUgc3R5bGUgYW5kIGNvbG9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkcmF3CkBAIC0yNyw3ICsyNywxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFpbnQgewogCi0gICAgLypwYWNrYWdlKi8gaW50ICAgICBtTmF0aXZlUGFpbnQ7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG1OYXRpdmVQYWludDsKKwogICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOwogICAgIHByaXZhdGUgTWFza0ZpbHRlciAgbU1hc2tGaWx0ZXI7CiAgICAgcHJpdmF0ZSBQYXRoRWZmZWN0ICBtUGF0aEVmZmVjdDsKQEAgLTM5LDYgKzQzLDMyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICBtSGFzQ29tcGF0U2NhbGluZzsKICAgICBwcml2YXRlIGZsb2F0ICAgICAgIG1Db21wYXRTY2FsaW5nOwogICAgIHByaXZhdGUgZmxvYXQgICAgICAgbUludkNvbXBhdFNjYWxpbmc7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1NoYWRvdzsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeDsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dEeTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBzaGFkb3dSYWRpdXM7CisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYWRvd0NvbG9yOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgIGludCAgICAgICAgIG1CaWRpRmxhZ3MgPSBCSURJX0RFRkFVTFRfTFRSOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0eWxlW10gc1N0eWxlQXJyYXkgPSB7CiAgICAgICAgIFN0eWxlLkZJTEwsIFN0eWxlLlNUUk9LRSwgU3R5bGUuRklMTF9BTkRfU1RST0tFCkBAIC03Niw4ICsxMDYsMTE2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFJTlRfRkxBR1MgPSBERVZfS0VSTl9URVhUX0ZMQUc7CiAKICAgICAvKioKLSAgICAgKiBUaGUgU3R5bGUgc3BlY2lmaWVzIGlmIHRoZSBwcmltaXRpdmUgYmVpbmcgZHJhd24gaXMgZmlsbGVkLAotICAgICAqIHN0cm9rZWQsIG9yIGJvdGggKGluIHRoZSBzYW1lIGNvbG9yKS4gVGhlIGRlZmF1bHQgaXMgRklMTC4KKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IExUUiBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9MVFIgPSAweDA7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gc2V0IFJUTCBwYXJhZ3JhcGggZGlyZWN0aW9uLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9SVEwgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gZGV0ZWN0IHBhcmFncmFwaCBkaXJlY3Rpb24gdmlhIGhldXJpc3RpY3MsIGRlZmF1bHRpbmcgdG8KKyAgICAgKiBMVFIuCisgICAgICogCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSURJX0RFRkFVTFRfTFRSID0gMHgyOworCisgICAgLyoqCisgICAgICogQmlkaSBmbGFnIHRvIGRldGVjdCBwYXJhZ3JhcGggZGlyZWN0aW9uIHZpYSBoZXVyaXN0aWNzLCBkZWZhdWx0aW5nIHRvCisgICAgICogUlRMLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9ERUZBVUxUX1JUTCA9IDB4MzsKKworICAgIC8qKgorICAgICAqIEJpZGkgZmxhZyB0byBvdmVycmlkZSBkaXJlY3Rpb24gdG8gYWxsIExUUiAoaWdub3JlIGJpZGkpLgorICAgICAqIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklESV9GT1JDRV9MVFIgPSAweDQ7CisKKyAgICAvKioKKyAgICAgKiBCaWRpIGZsYWcgdG8gb3ZlcnJpZGUgZGlyZWN0aW9uIHRvIGFsbCBSVEwgKGlnbm9yZSBiaWRpKS4KKyAgICAgKiAKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJRElfRk9SQ0VfUlRMID0gMHg1OworCisgICAgLyoqCisgICAgICogTWF4aW11bSBCaWRpIGZsYWcgdmFsdWUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklESV9NQVhfRkxBR19WQUxVRSA9IEJJRElfRk9SQ0VfUlRMOworCisgICAgLyoqCisgICAgICogTWFzayBmb3IgYmlkaSBmbGFncy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSURJX0ZMQUdfTUFTSyA9IDB4NzsKKworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIGdldFRleHRSdW5BZHZhbmNlcyBpbmRpY2F0aW5nIGxlZnQtdG8tcmlnaHQgcnVuIGRpcmVjdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUkVDVElPTl9MVFIgPSAwOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3IgZ2V0VGV4dFJ1bkFkdmFuY2VzIGluZGljYXRpbmcgcmlnaHQtdG8tbGVmdCBydW4gZGlyZWN0aW9uLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1JUTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGFmdGVyCisgICAgICogb2Zmc2V0IG9yIHRoZSBsaW1pdCBvZiB0aGUgY29udGV4dCwgd2hpY2hldmVyIGlzIGxlc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVJTT1JfQUZURVIgPSAwOworCisgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBhdCBvciBhZnRlcgorICAgICAqIHRoZSBvZmZzZXQgb3IgdGhlIGxpbWl0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVF9PUl9BRlRFUiA9IDE7CisKKyAgICAgLyoqCisgICAgICogT3B0aW9uIGZvciBnZXRUZXh0UnVuQ3Vyc29yIHRvIGNvbXB1dGUgdGhlIHZhbGlkIGN1cnNvciBiZWZvcmUKKyAgICAgKiBvZmZzZXQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZXh0LCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9CRUZPUkUgPSAyOworCisgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gY29tcHV0ZSB0aGUgdmFsaWQgY3Vyc29yIGF0IG9yIGJlZm9yZQorICAgICAqIG9mZnNldCBvciB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1VSU09SX0FUX09SX0JFRk9SRSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb24gZm9yIGdldFRleHRSdW5DdXJzb3IgdG8gcmV0dXJuIG9mZnNldCBpZiB0aGUgY3Vyc29yIGF0IG9mZnNldAorICAgICAqIGlzIHZhbGlkLCBvciAtMSBpZiBpdCBpc24ndC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9BVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGN1cnNvciBvcHRpb24gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENVUlNPUl9PUFRfTUFYX1ZBTFVFID0gQ1VSU09SX0FUOworCisgICAgLyoqCisgICAgICogVGhlIFN0eWxlIHNwZWNpZmllcyBpZiB0aGUgcHJpbWl0aXZlIGJlaW5nIGRyYXduIGlzIGZpbGxlZCwgc3Ryb2tlZCwgb3IKKyAgICAgKiBib3RoIChpbiB0aGUgc2FtZSBjb2xvcikuIFRoZSBkZWZhdWx0IGlzIEZJTEwuCiAgICAgICovCiAgICAgcHVibGljIGVudW0gU3R5bGUgewogICAgICAgICAvKioKQEAgLTkzLDcgKzIzMSw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZW9tZXRyeSBhbmQgdGV4dCBkcmF3biB3aXRoIHRoaXMgc3R5bGUgd2lsbCBiZSBib3RoIGZpbGxlZCBhbmQKICAgICAgICAgICogc3Ryb2tlZCBhdCB0aGUgc2FtZSB0aW1lLCByZXNwZWN0aW5nIHRoZSBzdHJva2UtcmVsYXRlZCBmaWVsZHMgb24KLSAgICAgICAgICogdGhlIHBhaW50LgorICAgICAgICAgKiB0aGUgcGFpbnQuIFRoaXMgbW9kZSBjYW4gZ2l2ZSB1bmV4cGVjdGVkIHJlc3VsdHMgaWYgdGhlIGdlb21ldHJ5CisgICAgICAgICAqIGlzIG9yaWVudGVkIGNvdW50ZXItY2xvY2t3aXNlLiBUaGlzIHJlc3RyaWN0aW9uIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICAgICAqIGVpdGhlciBGSUxMIG9yIFNUUk9LRS4KICAgICAgICAgICovCiAgICAgICAgIEZJTExfQU5EX1NUUk9LRSAoMik7CiAgICAgICAgIApAQCAtMjA4LDYgKzM0OCw3IEBACiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gcGFpbnQubUhhc0NvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gcGFpbnQubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgIG1JbnZDb21wYXRTY2FsaW5nID0gcGFpbnQubUludkNvbXBhdFNjYWxpbmc7CisgICAgICAgIG1CaWRpRmxhZ3MgPSBwYWludC5tQmlkaUZsYWdzOwogICAgIH0KIAogICAgIC8qKiBSZXN0b3JlcyB0aGUgcGFpbnQgdG8gaXRzIGRlZmF1bHQgc2V0dGluZ3MuICovCkBAIC0yMTYsNiArMzU3LDcgQEAKICAgICAgICAgc2V0RmxhZ3MoREVGQVVMVF9QQUlOVF9GTEFHUyk7CiAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gZmFsc2U7CiAgICAgICAgIG1Db21wYXRTY2FsaW5nID0gbUludkNvbXBhdFNjYWxpbmcgPSAxOworICAgICAgICBtQmlkaUZsYWdzID0gQklESV9ERUZBVUxUX0xUUjsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0yMzgsNiArMzgwLDcgQEAKICAgICAgICAgICAgIG1IYXNDb21wYXRTY2FsaW5nID0gc3JjLm1IYXNDb21wYXRTY2FsaW5nOwogICAgICAgICAgICAgbUNvbXBhdFNjYWxpbmcgICAgPSBzcmMubUNvbXBhdFNjYWxpbmc7CiAgICAgICAgICAgICBtSW52Q29tcGF0U2NhbGluZyA9IHNyYy5tSW52Q29tcGF0U2NhbGluZzsKKyAgICAgICAgICAgIG1CaWRpRmxhZ3MgICAgICA9IHNyYy5tQmlkaUZsYWdzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTIsMTAgKzM5NSwzMyBAQAogICAgICAgICAgICAgbUludkNvbXBhdFNjYWxpbmcgPSAxLjBmL2ZhY3RvcjsKICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYmlkaSBmbGFncyBvbiB0aGUgcGFpbnQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmlkaUZsYWdzKCkgeworICAgICAgICByZXR1cm4gbUJpZGlGbGFnczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJpZGkgZmxhZ3Mgb24gdGhlIHBhaW50LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmlkaUZsYWdzKGludCBmbGFncykgeworICAgICAgICAvLyBvbmx5IGZsYWcgdmFsdWUgaXMgdGhlIDMtYml0IEJJREkgY29udHJvbCBzZXR0aW5nCisgICAgICAgIGZsYWdzICY9IEJJRElfRkxBR19NQVNLOworICAgICAgICBpZiAoZmxhZ3MgPiBCSURJX01BWF9GTEFHX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGJpZGkgZmxhZzogIiArIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBtQmlkaUZsYWdzID0gZmxhZ3M7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBwYWludCdzIGZsYWdzLiBVc2UgdGhlIEZsYWcgZW51bSB0byB0ZXN0IGZsYWcgdmFsdWVzLgotICAgICAqCisgICAgICogCiAgICAgICogQHJldHVybiB0aGUgcGFpbnQncyBmbGFncyAoc2VlIGVudW1zIGVuZGluZyBpbiBfRmxhZyBmb3IgYml0IG1hc2tzKQogICAgICAqLwogICAgIHB1YmxpYyBuYXRpdmUgaW50IGdldEZsYWdzKCk7CkBAIC03ODcsMTggKzk1MywyNyBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGV4cG9zZSBsYXllciBkcmF3aW5nLiBUaGlzIGRyYXdzIGEgc2hhZG93IGxheWVyIGJlbG93Ci0gICAgICogdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZCBvZmZzZXQgYW5kIGNvbG9yLCBhbmQgYmx1ciByYWRpdXMuCi0gICAgICogSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdyBsYXllciBpcyByZW1vdmVkLgorICAgICAqIFRoaXMgZHJhd3MgYSBzaGFkb3cgbGF5ZXIgYmVsb3cgdGhlIG1haW4gbGF5ZXIsIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG9mZnNldCBhbmQgY29sb3IsIGFuZCBibHVyIHJhZGl1cy4gSWYgcmFkaXVzIGlzIDAsIHRoZW4gdGhlIHNoYWRvdworICAgICAqIGxheWVyIGlzIHJlbW92ZWQuCiAgICAgICovCi0gICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3IpOworICAgIHB1YmxpYyB2b2lkIHNldFNoYWRvd0xheWVyKGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpIHsKKyAgICAgICAgaGFzU2hhZG93ID0gcmFkaXVzID4gMC4wZjsKKyAgICAgICAgc2hhZG93UmFkaXVzID0gcmFkaXVzOworICAgICAgICBzaGFkb3dEeCA9IGR4OworICAgICAgICBzaGFkb3dEeSA9IGR5OworICAgICAgICBzaGFkb3dDb2xvciA9IGNvbG9yOworICAgICAgICBuU2V0U2hhZG93TGF5ZXIocmFkaXVzLCBkeCwgZHksIGNvbG9yKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuU2V0U2hhZG93TGF5ZXIoZmxvYXQgcmFkaXVzLCBmbG9hdCBkeCwgZmxvYXQgZHksIGludCBjb2xvcik7CiAKICAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgQVBJIHRvIGNsZWFyIHRoZSBzaGFkb3cgbGF5ZXIuCisgICAgICogQ2xlYXIgdGhlIHNoYWRvdyBsYXllci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbGVhclNoYWRvd0xheWVyKCkgewotICAgICAgICBzZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKKyAgICAgICAgaGFzU2hhZG93ID0gZmFsc2U7CisgICAgICAgIG5TZXRTaGFkb3dMYXllcigwLCAwLCAwLCAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMzIsMTAgKzE0MDcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGVuZCAtIHN0YXJ0KTsKLSAgICAJVGV4dFV0aWxzLmdldENoYXJzKHRleHQsIHN0YXJ0LCBlbmQsIGJ1ZiwgMCk7Ci0gICAgCWludCByZXN1bHQgPSBnZXRUZXh0V2lkdGhzKGJ1ZiwgMCwgZW5kIC0gc3RhcnQsIHdpZHRocyk7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBzdGFydCwgZW5kLCBidWYsIDApOworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0VGV4dFdpZHRocyhidWYsIDAsIGVuZCAtIHN0YXJ0LCB3aWR0aHMpOwogICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOwotICAgIAlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4Miw2ICsxNDU3LDI4NCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG92ZXJsb2FkIHRoYXQgdGFrZXMgYSBjaGFyIGFycmF5IGluc3RlYWQgb2YgYQorICAgICAqIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFRleHRSdW5BZHZhbmNlcyhTdHJpbmcsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdLCBpbnQpCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0VGV4dFJ1bkFkdmFuY2VzKGNoYXJbXSBjaGFycywgaW50IGluZGV4LCBpbnQgY291bnQsCisgICAgICAgICAgICBpbnQgY29udGV4dEluZGV4LCBpbnQgY29udGV4dENvdW50LCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsCisgICAgICAgICAgICBpbnQgYWR2YW5jZXNJbmRleCkgeworCisgICAgICAgIGlmICgoaW5kZXggfCBjb3VudCB8IGNvbnRleHRJbmRleCB8IGNvbnRleHRDb3VudCB8IGFkdmFuY2VzSW5kZXgKKyAgICAgICAgICAgICAgICB8IChpbmRleCAtIGNvbnRleHRJbmRleCkKKyAgICAgICAgICAgICAgICB8ICgoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSAtIChpbmRleCArIGNvdW50KSkKKyAgICAgICAgICAgICAgICB8IChjaGFycy5sZW5ndGggLSAoY29udGV4dEluZGV4ICsgY29udGV4dENvdW50KSkKKyAgICAgICAgICAgICAgICB8IChhZHZhbmNlcyA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgICAgIChhZHZhbmNlcy5sZW5ndGggLSAoYWR2YW5jZXNJbmRleCArIGNvdW50KSkpKSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICE9IERJUkVDVElPTl9MVFIgJiYgZmxhZ3MgIT0gRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBmbGFncyB2YWx1ZTogIiArIGZsYWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc0NvbXBhdFNjYWxpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKG1OYXRpdmVQYWludCwgY2hhcnMsIGluZGV4LCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgcmVzID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIGNoYXJzLCBpbmRleCwgY291bnQsCisgICAgICAgICAgICAgICAgY29udGV4dEluZGV4LCBjb250ZXh0Q291bnQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIHNldFRleHRTaXplKG9sZFNpemUpOworCisgICAgICAgIGlmIChhZHZhbmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gYWR2YW5jZXNJbmRleCwgZSA9IGkgKyBjb3VudDsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXMgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgbm90IHNpZ25pZmljYW50CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugb3ZlcmxvYWQgdGhhdCB0YWtlcyBhIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIGEKKyAgICAgKiBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgZmxvYXRbXSwgaW50KQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZsb2F0IGdldFRleHRSdW5BZHZhbmNlcyhDaGFyU2VxdWVuY2UgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywKKyAgICAgICAgICAgIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQWR2YW5jZXMoKFN0cmluZykgdGV4dCwgc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgdGV4dCBpbnN0YW5jZW9mIFNwYW5uYWJsZVN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSdW5BZHZhbmNlcyh0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIEdyYXBoaWNzT3BlcmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JhcGhpY3NPcGVyYXRpb25zKSB0ZXh0KS5nZXRUZXh0UnVuQWR2YW5jZXMoc3RhcnQsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbnRleHRMZW4gPSBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0OworICAgICAgICBpbnQgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBidWYgPSBUZW1wb3JhcnlCdWZmZXIub2J0YWluKGNvbnRleHRMZW4pOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmLCAwKTsKKyAgICAgICAgZmxvYXQgcmVzdWx0ID0gZ2V0VGV4dFJ1bkFkdmFuY2VzKGJ1Ziwgc3RhcnQgLSBjb250ZXh0U3RhcnQsIGxlbiwKKyAgICAgICAgICAgICAgICAwLCBjb250ZXh0TGVuLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBUZW1wb3JhcnlCdWZmZXIucmVjeWNsZShidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBydW4KKyAgICAgKiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQsIGFuZCBpZiBhZHZhbmNlcyBpcyBub3QgbnVsbCwgdGhlIGFkdmFuY2UKKyAgICAgKiBhc3NpZ25lZCB0byBlYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgKGphdmEgY2hhcnMpLgorICAgICAqCisgICAgICogPHA+VGhlIHRyYWlsaW5nIHN1cnJvZ2F0ZSBpbiBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyIGlzIGFzc2lnbmVkCisgICAgICogYW4gYWR2YW5jZSBvZiAwLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGFkdmFuY2VzIGlzCisgICAgICogYWx3YXlzIGVxdWFsIHRvIGNvdW50LCBub3QgdG8gdGhlIG51bWJlciBvZiB1bmljb2RlIGNvZGVwb2ludHMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgcnVuLgorICAgICAqCisgICAgICogPHA+SW4gdGhlIGNhc2Ugb2YgY29uanVuY3RzIG9yIGNvbWJpbmluZyBtYXJrcywgdGhlIHRvdGFsCisgICAgICogYWR2YW5jZSBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgbG9naWNhbCBjaGFyYWN0ZXIsIGFuZCB0aGUKKyAgICAgKiBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgYXNzaWduZWQgYW4gYWR2YW5jZSBvZiAwLgorICAgICAqCisgICAgICogPHA+VGhpcyBnZW5lcmF0ZXMgdGhlIHN1bSBvZiB0aGUgYWR2YW5jZXMgb2YgZ2x5cGhzIGZvcgorICAgICAqIGNoYXJhY3RlcnMgaW4gYSByZW9yZGVyZWQgY2x1c3RlciBhcyB0aGUgd2lkdGggb2YgdGhlIGZpcnN0CisgICAgICogbG9naWNhbCBjaGFyYWN0ZXIgaW4gdGhlIGNsdXN0ZXIsIGFuZCAwIGZvciB0aGUgd2lkdGhzIG9mIGFsbAorICAgICAqIG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIGNsdXN0ZXIuICBJbiBlZmZlY3QsIHN1Y2ggY2x1c3RlcnMgYXJlCisgICAgICogdHJlYXRlZCBsaWtlIGNvbmp1bmN0cy4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzaGFwaW5nIGJvdW5kcyBsaW1pdCB0aGUgYW1vdW50IG9mIGNvbnRleHQgYXZhaWxhYmxlCisgICAgICogb3V0c2lkZSBzdGFydCBhbmQgZW5kIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNoYXBpbmcgYW5hbHlzaXMuCisgICAgICogVGhlc2UgYm91bmRzIHR5cGljYWxseSByZWZsZWN0IGNoYW5nZXMgaW4gYmlkaSBsZXZlbCBvciBmb250CisgICAgICogbWV0cmljcyBhY3Jvc3Mgd2hpY2ggc2hhcGluZyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbWVhc3VyZQorICAgICAqIEBwYXJhbSBlbmQgdGhlIGluZGV4IHBhc3QgdGhlIGxhc3QgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKyAgICAgKiBAcGFyYW0gY29udGV4dFN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIHVzZSBmb3Igc2hhcGluZyBjb250ZXh0LAorICAgICAqIG11c3QgYmUgPD0gc3RhcnQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gdXNlIGZvciBzaGFwaW5nIGNvbnRleHQsCisgICAgICogbXVzdCBiZSA+PSBlbmQKKyAgICAgKiBAcGFyYW0gZmxhZ3MgdGhlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIGFkdmFuY2VzLCBlaXRoZXIge0BsaW5rICNESVJFQ1RJT05fTFRSfQorICAgICAqIG9yIHtAbGluayAjRElSRUNUSU9OX1JUTH0KKyAgICAgKiBAcGFyYW0gYWR2YW5jZXMgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgYWR2YW5jZXMsIG11c3QgaGF2ZSByb29tIGZvciBhbGwgYWR2YW5jZXMsCisgICAgICogY2FuIGJlIG51bGwgaWYgb25seSB0b3RhbCBhZHZhbmNlIGlzIG5lZWRlZAorICAgICAqIEBwYXJhbSBhZHZhbmNlc0luZGV4IHRoZSBwb3NpdGlvbiBpbiBhZHZhbmNlcyBhdCB3aGljaCB0byBwdXQgdGhlCisgICAgICogYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaGFyYWN0ZXIgYXQgc3RhcnQKKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBhZHZhbmNlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRUZXh0UnVuQWR2YW5jZXMoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwKKyAgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisKKyAgICAgICAgaWYgKChzdGFydCB8IGVuZCB8IGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBhZHZhbmNlc0luZGV4IHwgKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKHN0YXJ0IC0gY29udGV4dFN0YXJ0KSB8IChjb250ZXh0RW5kIC0gZW5kKQorICAgICAgICAgICAgICAgIHwgKHRleHQubGVuZ3RoKCkgLSBjb250ZXh0RW5kKQorICAgICAgICAgICAgICAgIHwgKGFkdmFuY2VzID09IG51bGwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2VzLmxlbmd0aCAtIGFkdmFuY2VzSW5kZXggLSAoZW5kIC0gc3RhcnQpKSkpIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgIT0gRElSRUNUSU9OX0xUUiAmJiBmbGFncyAhPSBESVJFQ1RJT05fUlRMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGZsYWdzIHZhbHVlOiAiICsgZmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSGFzQ29tcGF0U2NhbGluZykgeworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZV9nZXRUZXh0UnVuQWR2YW5jZXMobU5hdGl2ZVBhaW50LCB0ZXh0LCBzdGFydCwgZW5kLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGZsYWdzLCBhZHZhbmNlcywgYWR2YW5jZXNJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBvbGRTaXplID0gZ2V0VGV4dFNpemUoKTsKKyAgICAgICAgc2V0VGV4dFNpemUob2xkU2l6ZSAqIG1Db21wYXRTY2FsaW5nKTsKKyAgICAgICAgZmxvYXQgdG90YWxBZHZhbmNlID0gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhtTmF0aXZlUGFpbnQsIHRleHQsIHN0YXJ0LCBlbmQsCisgICAgICAgICAgICAgICAgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgpOworICAgICAgICBzZXRUZXh0U2l6ZShvbGRTaXplKTsKKworICAgICAgICBpZiAoYWR2YW5jZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGFkdmFuY2VzSW5kZXgsIGUgPSBpICsgKGVuZCAtIHN0YXJ0KTsgaSA8IGU7IGkrKykgeworICAgICAgICAgICAgICAgIGFkdmFuY2VzW2ldICo9IG1JbnZDb21wYXRTY2FsaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbEFkdmFuY2UgKiBtSW52Q29tcGF0U2NhbGluZzsgLy8gYXNzdW1lIGVycm9ycyBhcmUgaW5zaWduaWZpY2FudAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBydW4uICBUaGlzIGF2b2lkcyBwbGFjaW5nIHRoZQorICAgICAqIGN1cnNvciBiZXR3ZWVuIHN1cnJvZ2F0ZXMsIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGZvcm0gY29uanVuY3RzLAorICAgICAqIGJldHdlZW4gYmFzZSBjaGFyYWN0ZXJzIGFuZCBjb21iaW5pbmcgbWFya3MsIG9yIHdpdGhpbiBhIHJlb3JkZXJpbmcKKyAgICAgKiBjbHVzdGVyLgorICAgICAqCisgICAgICogPHA+Q29udGV4dFN0YXJ0IGFuZCBvZmZzZXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0ZXh0LgorICAgICAqIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dExlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoY2hhcltdIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0TGVuZ3RoLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGludCBjb250ZXh0RW5kID0gY29udGV4dFN0YXJ0ICsgY29udGV4dExlbmd0aDsKKyAgICAgICAgaWYgKCgoY29udGV4dFN0YXJ0IHwgY29udGV4dEVuZCB8IG9mZnNldCB8IChjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0KQorICAgICAgICAgICAgICAgIHwgKG9mZnNldCAtIGNvbnRleHRTdGFydCkgfCAoY29udGV4dEVuZCAtIG9mZnNldCkKKyAgICAgICAgICAgICAgICB8ICh0ZXh0Lmxlbmd0aCAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dExlbmd0aCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoQ2hhclNlcXVlbmNlIHRleHQsIGludCBjb250ZXh0U3RhcnQsCisgICAgICAgICAgIGludCBjb250ZXh0RW5kLCBpbnQgZmxhZ3MsIGludCBvZmZzZXQsIGludCBjdXJzb3JPcHQpIHsKKworICAgICAgICBpZiAodGV4dCBpbnN0YW5jZW9mIFN0cmluZyB8fCB0ZXh0IGluc3RhbmNlb2YgU3Bhbm5lZFN0cmluZyB8fAorICAgICAgICAgICAgICAgIHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGVTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0UnVuQ3Vyc29yKHRleHQudG9TdHJpbmcoKSwgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kLAorICAgICAgICAgICAgICAgICAgICBmbGFncywgb2Zmc2V0LCBjdXJzb3JPcHQpOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgR3JhcGhpY3NPcGVyYXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gKChHcmFwaGljc09wZXJhdGlvbnMpIHRleHQpLmdldFRleHRSdW5DdXJzb3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0LCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb250ZXh0TGVuID0gY29udGV4dEVuZCAtIGNvbnRleHRTdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY29udGV4dExlbik7CisgICAgICAgIFRleHRVdGlscy5nZXRDaGFycyh0ZXh0LCBjb250ZXh0U3RhcnQsIGNvbnRleHRFbmQsIGJ1ZiwgMCk7CisgICAgICAgIGludCByZXN1bHQgPSBnZXRUZXh0UnVuQ3Vyc29yKGJ1ZiwgMCwgY29udGV4dExlbiwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLnJlY3ljbGUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgcnVuLiAgVGhpcyBhdm9pZHMgcGxhY2luZyB0aGUKKyAgICAgKiBjdXJzb3IgYmV0d2VlbiBzdXJyb2dhdGVzLCBiZXR3ZWVuIGNoYXJhY3RlcnMgdGhhdCBmb3JtIGNvbmp1bmN0cywKKyAgICAgKiBiZXR3ZWVuIGJhc2UgY2hhcmFjdGVycyBhbmQgY29tYmluaW5nIG1hcmtzLCBvciB3aXRoaW4gYSByZW9yZGVyaW5nCisgICAgICogY2x1c3Rlci4KKyAgICAgKgorICAgICAqIDxwPkNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgYW5kIG9mZnNldCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCisgICAgICogdGV4dC4gIFRoZSBjb250ZXh0IGlzIHRoZSBzaGFwaW5nIGNvbnRleHQgZm9yIGN1cnNvciBtb3ZlbWVudCwgZ2VuZXJhbGx5CisgICAgICogdGhlIGJvdW5kcyBvZiB0aGUgbWV0cmljIHNwYW4gZW5jbG9zaW5nIHRoZSBjdXJzb3IgaW4gdGhlIGRpcmVjdGlvbiBvZgorICAgICAqIG1vdmVtZW50LgorICAgICAqCisgICAgICogPHA+SWYgY3Vyc29yT3B0IGlzIHtAbGluayAjQ1VSU09SX0FUfSBhbmQgdGhlIG9mZnNldCBpcyBub3QgYSB2YWxpZAorICAgICAqIGN1cnNvciBwb3NpdGlvbiwgdGhpcyByZXR1cm5zIC0xLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBuZXZlciByZXR1cm4gYQorICAgICAqIHZhbHVlIGJlZm9yZSBjb250ZXh0U3RhcnQgb3IgYWZ0ZXIgY29udGV4dEVuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHRTdGFydCB0aGUgc3RhcnQgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dEVuZCB0aGUgZW5kIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGZsYWdzIGVpdGhlciB7QGxpbmsgI0RJUkVDVElPTl9SVEx9IG9yIHtAbGluayAjRElSRUNUSU9OX0xUUn0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gbW92ZSBmcm9tCisgICAgICogQHBhcmFtIGN1cnNvck9wdCBob3cgdG8gbW92ZSB0aGUgY3Vyc29yLCBvbmUgb2Yge0BsaW5rICNDVVJTT1JfQUZURVJ9LAorICAgICAqIHtAbGluayAjQ1VSU09SX0FUX09SX0FGVEVSfSwge0BsaW5rICNDVVJTT1JfQkVGT1JFfSwKKyAgICAgKiB7QGxpbmsgI0NVUlNPUl9BVF9PUl9CRUZPUkV9LCBvciB7QGxpbmsgI0NVUlNPUl9BVH0KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgcG9zaXRpb24sIG9yIC0xCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRleHRSdW5DdXJzb3IoU3RyaW5nIHRleHQsIGludCBjb250ZXh0U3RhcnQsIGludCBjb250ZXh0RW5kLAorICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KSB7CisgICAgICAgIGlmICgoKGNvbnRleHRTdGFydCB8IGNvbnRleHRFbmQgfCBvZmZzZXQgfCAoY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCkKKyAgICAgICAgICAgICAgICB8IChvZmZzZXQgLSBjb250ZXh0U3RhcnQpIHwgKGNvbnRleHRFbmQgLSBvZmZzZXQpCisgICAgICAgICAgICAgICAgfCAodGV4dC5sZW5ndGgoKSAtIGNvbnRleHRFbmQpIHwgY3Vyc29yT3B0KSA8IDApCisgICAgICAgICAgICAgICAgfHwgY3Vyc29yT3B0ID4gQ1VSU09SX09QVF9NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5DdXJzb3IobU5hdGl2ZVBhaW50LCB0ZXh0LAorICAgICAgICAgICAgICAgIGNvbnRleHRTdGFydCwgY29udGV4dEVuZCwgZmxhZ3MsIG9mZnNldCwgY3Vyc29yT3B0KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIHBhdGggKG91dGxpbmUpIGZvciB0aGUgc3BlY2lmaWVkIHRleHQuCiAgICAgICogTm90ZToganVzdCBsaWtlIENhbnZhcy5kcmF3VGV4dCwgdGhpcyB3aWxsIHJlc3BlY3QgdGhlIEFsaWduIHNldHRpbmcgaW4KICAgICAgKiB0aGUgcGFpbnQuCkBAIC0xMjk5LDcgKzE3NTIsOCBAQAogICAgICAgICBpZiAoKGluZGV4IHwgY291bnQpIDwgMCB8fCBpbmRleCArIGNvdW50ID4gdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBuYXRpdmVfZ2V0VGV4dFBhdGgobU5hdGl2ZVBhaW50LCB0ZXh0LCBpbmRleCwgY291bnQsIHgsIHksIHBhdGgubmkoKSk7CisgICAgICAgIG5hdGl2ZV9nZXRUZXh0UGF0aChtTmF0aXZlUGFpbnQsIG1CaWRpRmxhZ3MsIHRleHQsIGluZGV4LCBjb3VudCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMjAsNyArMTc3NCw4IEBACiAgICAgICAgIGlmICgoc3RhcnQgfCBlbmQgfCAoZW5kIC0gc3RhcnQpIHwgKHRleHQubGVuZ3RoKCkgLSBlbmQpKSA8IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgcGF0aC5uaSgpKTsKKyAgICAgICAgbmF0aXZlX2dldFRleHRQYXRoKG1OYXRpdmVQYWludCwgbUJpZGlGbGFncywgdGV4dCwgc3RhcnQsIGVuZCwgeCwgeSwgCisgICAgICAgICAgICAgICAgcGF0aC5uaSgpKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0xNDA0LDkgKzE4NTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gdGV4dCwgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0W10gd2lkdGhzKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9nZXRUZXh0V2lkdGhzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0W10gd2lkdGhzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsCisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKKyAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAorICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KTsKKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0VGV4dFJ1bkN1cnNvcihpbnQgbmF0aXZlX29iamVjdCwgY2hhcltdIHRleHQsCisgICAgICAgICAgICBpbnQgY29udGV4dFN0YXJ0LCBpbnQgY29udGV4dExlbmd0aCwgaW50IGZsYWdzLCBpbnQgb2Zmc2V0LCBpbnQgY3Vyc29yT3B0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldFRleHRSdW5DdXJzb3IoaW50IG5hdGl2ZV9vYmplY3QsIFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgaW50IG9mZnNldCwgaW50IGN1cnNvck9wdCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVfZ2V0VGV4dFBhdGgoaW50IG5hdGl2ZV9vYmplY3QsIGludCBiaWRpRmxhZ3MsCiAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlX2dldFRleHRQYXRoKGludCBuYXRpdmVfb2JqZWN0LAorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV9nZXRUZXh0UGF0aChpbnQgbmF0aXZlX29iamVjdCwgaW50IGJpZGlGbGFncywKICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBmbG9hdCB4LCBmbG9hdCB5LCBpbnQgcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlR2V0U3RyaW5nQm91bmRzKGludCBuYXRpdmVQYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgUmVjdCBib3VuZHMpOwpAQCAtMTQxNCw0ICsxODgyLDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHRleHQsIGludCBpbmRleCwgaW50IGNvdW50LCBSZWN0IGJvdW5kcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVQYWludCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGF0aC5qYXZhCmluZGV4IDI4MTgyM2EuLmMzNDE2YTAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXRoLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhdGguamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CiAKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSGFyZHdhcmVSZW5kZXJlcjsKKwogLyoqCiAgKiBUaGUgUGF0aCBjbGFzcyBlbmNhcHN1bGF0ZXMgY29tcG91bmQgKG11bHRpcGxlIGNvbnRvdXIpIGdlb21ldHJpYyBwYXRocwogICogY29uc2lzdGluZyBvZiBzdHJhaWdodCBsaW5lIHNlZ21lbnRzLCBxdWFkcmF0aWMgY3VydmVzLCBhbmQgY3ViaWMgY3VydmVzLgpAQCAtMjQsMTIgKzI2LDI3IEBACiAgKiB0ZXh0IG9uIGEgcGF0aC4KICAqLwogcHVibGljIGNsYXNzIFBhdGggeworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBtTmF0aXZlUGF0aDsKKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVQYXRoID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBSZWdpb24gcmVjdHM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1EZXRlY3RTaW1wbGVQYXRoczsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBlbXB0eSBwYXRoCiAgICAgICovCiAgICAgcHVibGljIFBhdGgoKSB7CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDEoKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDMsNiArNjAsNyBAQAogICAgICAgICAgICAgdmFsTmF0aXZlID0gc3JjLm1OYXRpdmVQYXRoOwogICAgICAgICB9CiAgICAgICAgIG1OYXRpdmVQYXRoID0gaW5pdDIodmFsTmF0aXZlKTsKKyAgICAgICAgbURldGVjdFNpbXBsZVBhdGhzID0gSGFyZHdhcmVSZW5kZXJlci5pc0F2YWlsYWJsZSgpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTUwLDYgKzY4LDEwIEBACiAgICAgICogVGhpcyBkb2VzIE5PVCBjaGFuZ2UgdGhlIGZpbGwtdHlwZSBzZXR0aW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSB0cnVlOworICAgICAgICBpZiAobURldGVjdFNpbXBsZVBhdGhzKSB7CisgICAgICAgICAgICBpZiAocmVjdHMgIT0gbnVsbCkgcmVjdHMuc2V0RW1wdHkoKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfcmVzZXQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNTgsNiArODAsMTAgQEAKICAgICAgKiBrZWVwcyB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgZm9yIGZhc3RlciByZXVzZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXdpbmQoKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IHRydWU7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyAhPSBudWxsKSByZWN0cy5zZXRFbXB0eSgpOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZV9yZXdpbmQobU5hdGl2ZVBhdGgpOwogICAgIH0KIApAQCAtNjUsNiArOTEsNyBAQAogICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0KFBhdGggc3JjKSB7CiAgICAgICAgIGlmICh0aGlzICE9IHNyYykgeworICAgICAgICAgICAgaXNTaW1wbGVQYXRoID0gc3JjLmlzU2ltcGxlUGF0aDsKICAgICAgICAgICAgIG5hdGl2ZV9zZXQobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjAsNiArMTg3LDcgQEAKICAgICAgKiBAcGFyYW0gYm91bmRzIFJldHVybnMgdGhlIGNvbXB1dGVkIGJvdW5kcyBvZiB0aGUgcGF0aCdzIGNvbnRyb2wgcG9pbnRzLgogICAgICAqIEBwYXJhbSBleGFjdCBUaGlzIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCiAgICAgcHVibGljIHZvaWQgY29tcHV0ZUJvdW5kcyhSZWN0RiBib3VuZHMsIGJvb2xlYW4gZXhhY3QpIHsKICAgICAgICAgbmF0aXZlX2NvbXB1dGVCb3VuZHMobU5hdGl2ZVBhdGgsIGJvdW5kcyk7CiAgICAgfQpAQCAtMjM2LDYgKzI2NCw3IEBACiAgICAgICogQHBhcmFtIHkyIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVuZCBwb2ludCBvbiBhIHF1YWRyYXRpYyBjdXJ2ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHF1YWRUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX3F1YWRUbyhtTmF0aXZlUGF0aCwgeDEsIHkxLCB4MiwgeTIpOwogICAgIH0KIApAQCAtMjU0LDYgKzI4Myw3IEBACiAgICAgICogICAgICAgICAgICB0aGlzIGNvbnRvdXIsIGZvciB0aGUgZW5kIHBvaW50IG9mIGEgcXVhZHJhdGljIGN1cnZlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgclF1YWRUbyhmbG9hdCBkeDEsIGZsb2F0IGR5MSwgZmxvYXQgZHgyLCBmbG9hdCBkeTIpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9yUXVhZFRvKG1OYXRpdmVQYXRoLCBkeDEsIGR5MSwgZHgyLCBkeTIpOwogICAgIH0KIApAQCAtMjcxLDYgKzMwMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY3ViaWNUbyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2N1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjgxLDYgKzMxMiw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgckN1YmljVG8oZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfckN1YmljVG8obU5hdGl2ZVBhdGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOwogICAgIH0KIApAQCAtMjk5LDYgKzMzMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYXJjVG8oUmVjdEYgb3ZhbCwgZmxvYXQgc3RhcnRBbmdsZSwgZmxvYXQgc3dlZXBBbmdsZSwKICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlTW92ZVRvKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYXJjVG8obU5hdGl2ZVBhdGgsIG92YWwsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUsIGZvcmNlTW92ZVRvKTsKICAgICB9CiAgICAgCkBAIC0zMTQsNiArMzQ3LDcgQEAKICAgICAgKiBAcGFyYW0gc3dlZXBBbmdsZSAgU3dlZXAgYW5nbGUgKGluIGRlZ3JlZXMpIG1lYXN1cmVkIGNsb2Nrd2lzZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFyY1RvKFJlY3RGIG92YWwsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IHN3ZWVwQW5nbGUpIHsKKyAgICAgICAgaXNTaW1wbGVQYXRoID0gZmFsc2U7CiAgICAgICAgIG5hdGl2ZV9hcmNUbyhtTmF0aXZlUGF0aCwgb3ZhbCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSwgZmFsc2UpOwogICAgIH0KICAgICAKQEAgLTMyMiw2ICszNTYsNyBAQAogICAgICAqIGZpcnN0IHBvaW50IG9mIHRoZSBjb250b3VyLCBhIGxpbmUgc2VnbWVudCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2Nsb3NlKG1OYXRpdmVQYXRoKTsKICAgICB9CiAKQEAgLTM1MSw2ICszODYsMTEgQEAKICAgICAgICAgaWYgKHJlY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJuZWVkIHJlY3QgcGFyYW1ldGVyIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZXRlY3RTaW1wbGVQYXRocykgeworICAgICAgICAgICAgaWYgKHJlY3RzID09IG51bGwpIHJlY3RzID0gbmV3IFJlZ2lvbigpOworICAgICAgICAgICAgcmVjdHMub3AoKGludCkgcmVjdC5sZWZ0LCAoaW50KSByZWN0LnRvcCwgKGludCkgcmVjdC5yaWdodCwgKGludCkgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgIFJlZ2lvbi5PcC5VTklPTik7CisgICAgICAgIH0KICAgICAgICAgbmF0aXZlX2FkZFJlY3QobU5hdGl2ZVBhdGgsIHJlY3QsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzYzLDggKzQwMywxMSBAQAogICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBvZiBhIHJlY3RhbmdsZSB0byBhZGQgdG8gdGhlIHBhdGgKICAgICAgKiBAcGFyYW0gZGlyICAgIFRoZSBkaXJlY3Rpb24gdG8gd2luZCB0aGUgcmVjdGFuZ2xlJ3MgY29udG91cgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRpcikgeworICAgIHB1YmxpYyB2b2lkIGFkZFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlmIChtRGV0ZWN0U2ltcGxlUGF0aHMpIHsKKyAgICAgICAgICAgIGlmIChyZWN0cyA9PSBudWxsKSByZWN0cyA9IG5ldyBSZWdpb24oKTsKKyAgICAgICAgICAgIHJlY3RzLm9wKChpbnQpIGxlZnQsIChpbnQpIHRvcCwgKGludCkgcmlnaHQsIChpbnQpIGJvdHRvbSwgUmVnaW9uLk9wLlVOSU9OKTsKKyAgICAgICAgfQogICAgICAgICBuYXRpdmVfYWRkUmVjdChtTmF0aXZlUGF0aCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAKQEAgLTM3OCw2ICs0MjEsNyBAQAogICAgICAgICBpZiAob3ZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgb3ZhbCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZE92YWwobU5hdGl2ZVBhdGgsIG92YWwsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtMzkwLDYgKzQzNCw3IEBACiAgICAgICogQHBhcmFtIGRpciAgICBUaGUgZGlyZWN0aW9uIHRvIHdpbmQgdGhlIGNpcmNsZSdzIGNvbnRvdXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDaXJjbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBEaXJlY3Rpb24gZGlyKSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQ2lyY2xlKG1OYXRpdmVQYXRoLCB4LCB5LCByYWRpdXMsIGRpci5uYXRpdmVJbnQpOwogICAgIH0KIApAQCAtNDA0LDYgKzQ0OSw3IEBACiAgICAgICAgIGlmIChvdmFsID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibmVlZCBvdmFsIHBhcmFtZXRlciIpOwogICAgICAgICB9CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkQXJjKG1OYXRpdmVQYXRoLCBvdmFsLCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsKICAgICB9CiAKQEAgLTQxOSw2ICs0NjUsNyBAQAogICAgICAgICBpZiAocmVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm5lZWQgcmVjdCBwYXJhbWV0ZXIiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcngsIHJ5LCBkaXIubmF0aXZlSW50KTsKICAgICB9CiAgICAgCkBAIC00MzgsNiArNDg1LDcgQEAKICAgICAgICAgaWYgKHJhZGlpLmxlbmd0aCA8IDgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInJhZGlpW10gbmVlZHMgOCB2YWx1ZXMiKTsKICAgICAgICAgfQorICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFJvdW5kUmVjdChtTmF0aXZlUGF0aCwgcmVjdCwgcmFkaWksIGRpci5uYXRpdmVJbnQpOwogICAgIH0KICAgICAKQEAgLTQ0OCw2ICs0OTYsNyBAQAogICAgICAqIEBwYXJhbSBkeCAgVGhlIGFtb3VudCB0byB0cmFuc2xhdGUgdGhlIHBhdGggaW4gWCBhcyBpdCBpcyBhZGRlZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBzcmMsIGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCwgZHgsIGR5KTsKICAgICB9CiAKQEAgLTQ1Nyw2ICs1MDYsNyBAQAogICAgICAqIEBwYXJhbSBzcmMgVGhlIHBhdGggdGhhdCBpcyBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBwYXRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYykgeworICAgICAgICBpc1NpbXBsZVBhdGggPSBmYWxzZTsKICAgICAgICAgbmF0aXZlX2FkZFBhdGgobU5hdGl2ZVBhdGgsIHNyYy5tTmF0aXZlUGF0aCk7CiAgICAgfQogCkBAIC00NjYsNiArNTE2LDcgQEAKICAgICAgKiBAcGFyYW0gc3JjIFRoZSBwYXRoIHRvIGFkZCBhcyBhIG5ldyBjb250b3VyCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0aChQYXRoIHNyYywgTWF0cml4IG1hdHJpeCkgeworICAgICAgICBpZiAoIXNyYy5pc1NpbXBsZVBhdGgpIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfYWRkUGF0aChtTmF0aXZlUGF0aCwgc3JjLm1OYXRpdmVQYXRoLCBtYXRyaXgubmF0aXZlX2luc3RhbmNlKTsKICAgICB9CiAKQEAgLTUwMiw2ICs1NTMsNyBAQAogICAgICAqIEBwYXJhbSBkeSBUaGUgbmV3IFkgY29vcmRpbmF0ZSBmb3IgdGhlIGxhc3QgcG9pbnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMYXN0UG9pbnQoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgICAgIGlzU2ltcGxlUGF0aCA9IGZhbHNlOwogICAgICAgICBuYXRpdmVfc2V0TGFzdFBvaW50KG1OYXRpdmVQYXRoLCBkeCwgZHkpOwogICAgIH0KIApAQCAtNTM3LDggKzU4OSw4IEBACiAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIC8qcGFja2FnZSovIGZpbmFsIGludCBuaSgpIHsKKworICAgIGZpbmFsIGludCBuaSgpIHsKICAgICAgICAgcmV0dXJuIG1OYXRpdmVQYXRoOwogICAgIH0KIApAQCAtNTkyLDYgKzY0NCw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZV90cmFuc2Zvcm0oaW50IG5QYXRoLCBpbnQgbWF0cml4KTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBmaW5hbGl6ZXIoaW50IG5QYXRoKTsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IG1OYXRpdmVQYXRoOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmLmphdmEKaW5kZXggMzkwNDIzNC4uMmVmMTY2MiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZi5qYXZhCkBAIC01MywxMSArNTMsMTggQEAKICAgICAgICAgLyoqIFtTYSAqIERhLCBTYyAqIERjXSAqLwogICAgICAgICBNVUxUSVBMWSAgICAoMTQpLAogICAgICAgICAvKiogW1NhICsgRGEgLSBTYSAqIERhLCBTYyArIERjIC0gU2MgKiBEY10gKi8KLSAgICAgICAgU0NSRUVOICAgICAgKDE1KTsKKyAgICAgICAgU0NSRUVOICAgICAgKDE1KSwKKyAgICAgICAgLyoqIFNhdHVyYXRlKFMgKyBEKSAqLworICAgICAgICBBREQgICAgICAgICAoMTYpLAorICAgICAgICBPVkVSTEFZICAgICAoMTcpOwogCiAgICAgICAgIE1vZGUoaW50IG5hdGl2ZUludCkgewogICAgICAgICAgICAgdGhpcy5uYXRpdmVJbnQgPSBuYXRpdmVJbnQ7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IG5hdGl2ZUludDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbmF0aXZlSW50OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXIuamF2YQppbmRleCAwNjcyNGJkLi5iMDJkYWIxIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZkNvbG9yRmlsdGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZDb2xvckZpbHRlci5qYXZhCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgVGhlIHBvcnRlci1kdWZmIG1vZGUgdGhhdCBpcyBhcHBsaWVkCiAgICAgICovCiAgICAgcHVibGljIFBvcnRlckR1ZmZDb2xvckZpbHRlcihpbnQgc3JjQ29sb3IsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7Ci0gICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKHNyY0NvbG9yLCBtb2RlLm5hdGl2ZUludCk7CisgICAgICAgIG5hdGl2ZUNvbG9yRmlsdGVyID0gbkNyZWF0ZVBvcnRlckR1ZmZGaWx0ZXIoc3JjQ29sb3IsIG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgaW50IG5hdGl2ZV9DcmVhdGVQb3J0ZXJEdWZmRmlsdGVyKGludCBzcmNDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuYXRpdmVfQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlUG9ydGVyRHVmZkZpbHRlcihpbnQgc3JjQ29sb3IsIGludCBwb3J0ZXJEdWZmTW9kZSk7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUG9ydGVyRHVmZlhmZXJtb2RlLmphdmEKaW5kZXggY2IxMjdmZC4uNmJhMDY0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BvcnRlckR1ZmZYZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9Qb3J0ZXJEdWZmWGZlcm1vZGUuamF2YQpAQCAtMTgsMTEgKzE4LDE3IEBACiAKIHB1YmxpYyBjbGFzcyBQb3J0ZXJEdWZmWGZlcm1vZGUgZXh0ZW5kcyBYZmVybW9kZSB7CiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUG9ydGVyRHVmZi5Nb2RlIG1vZGU7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYW4geGZlcm1vZGUgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgcG9ydGVyLWR1ZmYgbW9kZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBtb2RlICAgICAgICAgICBUaGUgcG9ydGVyLWR1ZmYgbW9kZSB0aGF0IGlzIGFwcGxpZWQKICAgICAgKi8KICAgICBwdWJsaWMgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgIHRoaXMubW9kZSA9IG1vZGU7CiAgICAgICAgIG5hdGl2ZV9pbnN0YW5jZSA9IG5hdGl2ZUNyZWF0ZVhmZXJtb2RlKG1vZGUubmF0aXZlSW50KTsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUmVnaW9uLmphdmEKaW5kZXggMmIwODBhYS4uZTU0MDgwNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9SZWdpb24uamF2YQpAQCAtMjAsNiArMjAsMTAgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiAKIHB1YmxpYyBjbGFzcyBSZWdpb24gaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgbU5hdGl2ZVJlZ2lvbjsKIAogICAgIC8vIHRoZSBuYXRpdmUgdmFsdWVzIGZvciB0aGVzZSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIGVudW0gaW4gU2tSZWdpb24uaAogICAgIHB1YmxpYyBlbnVtIE9wIHsKQEAgLTMzLDcgKzM3LDExIEBACiAgICAgICAgIE9wKGludCBuYXRpdmVJbnQpIHsKICAgICAgICAgICAgIHRoaXMubmF0aXZlSW50ID0gbmF0aXZlSW50OwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBuYXRpdmVJbnQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5hdGl2ZUludDsKICAgICB9CiAKICAgICAvKiogQ3JlYXRlIGFuIGVtcHR5IHJlZ2lvbgpAQCAtMzI1LDEwICszMzMsMTQgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBuYXRpdmVEZXN0cnVjdG9yKG1OYXRpdmVSZWdpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihtTmF0aXZlUmVnaW9uKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgLypwYWNrYWdlKi8gUmVnaW9uKGludCBuaSkgeworICAgIFJlZ2lvbihpbnQgbmkpIHsKICAgICAgICAgaWYgKG5pID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTM0MSw3ICszNTMsNyBAQAogICAgICAgICB0aGlzKG5pKTsKICAgICB9CiAKLSAgICAvKnBhY2thZ2UqLyBmaW5hbCBpbnQgbmkoKSB7CisgICAgZmluYWwgaW50IG5pKCkgewogICAgICAgICByZXR1cm4gbU5hdGl2ZVJlZ2lvbjsKICAgICB9CiAKQEAgLTM3MCw2ICszODIsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsIHApOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlRXF1YWxzKGludCBuYXRpdmVfcjEsIGludCBuYXRpdmVfcjIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU5hdGl2ZVJlZ2lvbjsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9TaGFkZXIuamF2YQppbmRleCBhZTAzMDRlLi5iMzk3NjYyIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU2hhZGVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1NoYWRlci5qYXZhCkBAIC0yMyw5ICsyMywxNiBAQAogICogZHJhd24gd2l0aCB0aGF0IHBhaW50IHdpbGwgZ2V0IGl0cyBjb2xvcihzKSBmcm9tIHRoZSBzaGFkZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBTaGFkZXIgewotCi0gICAgLy8gdGhpcyBpcyBzZXQgYnkgc3ViY2xhc3NlcywgYnV0IGRvbid0IG1ha2UgaXQgcHVibGljCi0gICAgLyogcGFja2FnZSAqLyBpbnQgbmF0aXZlX2luc3RhbmNlOworICAgIC8qKgorICAgICAqIFRoaXMgaXMgc2V0IGJ5IHN1YmNsYXNzZXMsIGJ1dCBkb24ndCBtYWtlIGl0IHB1YmxpYy4KKyAgICAgKiAKKyAgICAgKiBAaGlkZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5hdGl2ZV9pbnN0YW5jZTsKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmF0aXZlX3NoYWRlcjsKIAogICAgIHB1YmxpYyBlbnVtIFRpbGVNb2RlIHsKICAgICAgICAgLyoqCkBAIC02NCwxNyArNzEsMjAgQEAKICAgICAgKiBAcGFyYW0gbG9jYWxNIFRoZSBzaGFkZXIncyBuZXcgbG9jYWwgbWF0cml4LCBvciBudWxsIHRvIHNwZWNpZnkgaWRlbnRpdHkKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1hdHJpeChNYXRyaXggbG9jYWxNKSB7Ci0gICAgICAgIG5hdGl2ZVNldExvY2FsTWF0cml4KG5hdGl2ZV9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxNICE9IG51bGwgPyBsb2NhbE0ubmF0aXZlX2luc3RhbmNlIDogMCk7CisgICAgICAgIG5hdGl2ZVNldExvY2FsTWF0cml4KG5hdGl2ZV9pbnN0YW5jZSwgbmF0aXZlX3NoYWRlciwgbG9jYWxNLm5hdGl2ZV9pbnN0YW5jZSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgbmF0aXZlRGVzdHJ1Y3RvcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG5hdGl2ZURlc3RydWN0b3IobmF0aXZlX2luc3RhbmNlLCBuYXRpdmVfc2hhZGVyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURlc3RydWN0b3IoaW50IG5hdGl2ZV9zaGFkZXIsIGludCBuYXRpdmVfc2tpYVNoYWRlcik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbmF0aXZlR2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbWF0cml4X2luc3RhbmNlKTsgCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0TG9jYWxNYXRyaXgoaW50IG5hdGl2ZV9zaGFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hdHJpeF9pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgbmF0aXZlX3NraWFTaGFkZXIsIGludCBtYXRyaXhfaW5zdGFuY2UpOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IDFkN2ZlMDEuLmM1YjgxNDMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTE4LDkgKzE4LDExIEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkFycmF5VXRpbHM7CiAKLS8qIHBhY2thZ2UgKi8gY2xhc3MgVGVtcG9yYXJ5QnVmZmVyCi17Ci0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXIgeworICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIG9idGFpbihpbnQgbGVuKSB7CiAgICAgICAgIGNoYXJbXSBidWY7CiAKICAgICAgICAgc3luY2hyb25pemVkIChUZW1wb3JhcnlCdWZmZXIuY2xhc3MpIHsKQEAgLTI4LDE1ICszMCwxNSBAQAogICAgICAgICAgICAgc1RlbXAgPSBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGJ1ZiA9PSBudWxsIHx8IGJ1Zi5sZW5ndGggPCBsZW4pCisgICAgICAgIGlmIChidWYgPT0gbnVsbCB8fCBidWYubGVuZ3RoIDwgbGVuKSB7CiAgICAgICAgICAgICBidWYgPSBuZXcgY2hhcltBcnJheVV0aWxzLmlkZWFsQ2hhckFycmF5U2l6ZShsZW4pXTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBidWY7CiAgICAgfQogCi0gICAgLyogcGFja2FnZSAqLyBzdGF0aWMgdm9pZCByZWN5Y2xlKGNoYXJbXSB0ZW1wKSB7Ci0gICAgICAgIGlmICh0ZW1wLmxlbmd0aCA+IDEwMDApCi0gICAgICAgICAgICByZXR1cm47CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlY3ljbGUoY2hhcltdIHRlbXApIHsKKyAgICAgICAgaWYgKHRlbXAubGVuZ3RoID4gMTAwMCkgcmV0dXJuOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAoVGVtcG9yYXJ5QnVmZmVyLmNsYXNzKSB7CiAgICAgICAgICAgICBzVGVtcCA9IHRlbXA7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvWGZlcm1vZGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCmluZGV4IDQyYzQxMGUuLjI0NjdiZGMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9YZmVybW9kZS5qYXZhCkBAIC0zMSw3ICszMSwxMSBAQAogcHVibGljIGNsYXNzIFhmZXJtb2RlIHsKIAogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGZpbmFsaXplcihuYXRpdmVfaW5zdGFuY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWxpemVyKG5hdGl2ZV9pbnN0YW5jZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgZmluYWxpemVyKGludCBuYXRpdmVfaW5zdGFuY2UpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YQppbmRleCAzMTI1MzIxLi43YjJkOWQ3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YQpAQCAtMTYsMjEgKzE2LDMwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZTsKIAotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk5pbmVQYXRjaDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlN0YXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiAvKioKICAqIEEgRHJhd2FibGUgaXMgYSBnZW5lcmFsIGFic3RyYWN0aW9uIGZvciAic29tZXRoaW5nIHRoYXQgY2FuIGJlIGRyYXduLiIgIE1vc3QKQEAgLTY0NSw2ICs2NTQsOCBAQAogICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgb24gYSBtdXRhYmxlIERyYXdhYmxlIHdpbGwgaGF2ZSBubyBlZmZlY3QuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoaXMgZHJhd2FibGUuCisgICAgICogQHNlZSBDb25zdGFudFN0YXRlCisgICAgICogQHNlZSAjZ2V0Q29uc3RhbnRTdGF0ZSgpCiAgICAgICovCiAgICAgcHVibGljIERyYXdhYmxlIG11dGF0ZSgpIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CkBAIC03NDksNiArNzYwLDggQEAKICAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IFN0YXRlTGlzdERyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImxldmVsLWxpc3QiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgTGV2ZWxMaXN0RHJhd2FibGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibWlwbWFwIikpIHsKKyAgICAgICAgICAgIGRyYXdhYmxlID0gbmV3IE1pcG1hcERyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImxheWVyLWxpc3QiKSkgewogICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgTGF5ZXJEcmF3YWJsZSgpOwogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJ0cmFuc2l0aW9uIikpIHsKQEAgLTc3MCw3ICs3ODMsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJpbnNldCIpKSB7CiAgICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBJbnNldERyYXdhYmxlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImJpdG1hcCIpKSB7Ci0gICAgICAgICAgICBkcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZSgpOworICAgICAgICAgICAgZHJhd2FibGUgPSBuZXcgQml0bWFwRHJhd2FibGUocik7CiAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAoKEJpdG1hcERyYXdhYmxlKSBkcmF3YWJsZSkuc2V0VGFyZ2V0RGVuc2l0eShyLmdldERpc3BsYXlNZXRyaWNzKCkpOwogICAgICAgICAgICAgfQpAQCAtODA1LDYgKzgxOCw5IEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEluZmxhdGUgdGhpcyBEcmF3YWJsZSBmcm9tIGFuIFhNTCByZXNvdXJjZS4KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbmZsYXRlKFJlc291cmNlcyByLCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgQXR0cmlidXRlU2V0IGF0dHJzKQogICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIApAQCAtODEzLDYgKzgyOSwxMiBAQAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBJbmZsYXRlIGEgRHJhd2FibGUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCiAgICAgdm9pZCBpbmZsYXRlV2l0aEF0dHJpYnV0ZXMoUmVzb3VyY2VzIHIsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLAogICAgICAgICAgICAgVHlwZWRBcnJheSBhdHRycywgaW50IHZpc2libGVBdHRyKQogICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKQEAgLTgyMCwxMiArODQyLDI3IEBACiAgICAgICAgIG1WaXNpYmxlID0gYXR0cnMuZ2V0Qm9vbGVhbih2aXNpYmxlQXR0ciwgbVZpc2libGUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgRHJhd2FibGV9cyB0byBzdG9yZSBzaGFyZWQgY29uc3RhbnQgc3RhdGUgYW5kIGRhdGEKKyAgICAgKiBiZXR3ZWVuIERyYXdhYmxlcy4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfXMgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIHJlc291cmNlIHdpbGwgZm9yIGluc3RhbmNlCisgICAgICogc2hhcmUgYSB1bmlxdWUgYml0bWFwIHN0b3JlZCBpbiB0aGVpciBDb25zdGFudFN0YXRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICoge0BsaW5rICNuZXdEcmF3YWJsZShSZXNvdXJjZXMpfSBjYW4gYmUgdXNlZCBhcyBhIGZhY3RvcnkgdG8gY3JlYXRlIG5ldyBEcmF3YWJsZSBpbnN0YW5jZXMKKyAgICAgKiBmcm9tIHRoaXMgQ29uc3RhbnRTdGF0ZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBVc2Uge0BsaW5rIERyYXdhYmxlI2dldENvbnN0YW50U3RhdGUoKX0gdG8gcmV0cmlldmUgdGhlIENvbnN0YW50U3RhdGUgb2YgYSBEcmF3YWJsZS4gQ2FsbGluZworICAgICAqIHtAbGluayBEcmF3YWJsZSNtdXRhdGUoKX0gb24gYSBEcmF3YWJsZSBzaG91bGQgdHlwaWNhbGx5IGNyZWF0ZSBhIG5ldyBDb25zdGFudFN0YXRlIGZvciB0aGF0CisgICAgICogRHJhd2FibGUuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb25zdGFudFN0YXRlIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBkcmF3YWJsZSB3aXRob3V0IHN1cHBseWluZyByZXNvdXJjZXMgdGhlIGNhbGxlcgogICAgICAgICAgKiBpcyBydW5uaW5nIGluLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgbWVhbnMgdGhlIGRlbnNpdHktZGVwZW5kZW50CiAgICAgICAgICAqIGRyYXdhYmxlcyAobGlrZSBiaXRtYXBzKSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGVpciB0YXJnZXQKLSAgICAgICAgICogZGVuc2l0eSBjb3JyZWN0bHkuCisgICAgICAgICAqIGRlbnNpdHkgY29ycmVjdGx5LiBPbmUgc2hvdWxkIHVzZSB7QGxpbmsgI25ld0RyYXdhYmxlKFJlc291cmNlcyl9CisgICAgICAgICAqIGluc3RlYWQgdG8gcHJvdmlkZSBhIHJlc291cmNlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IERyYXdhYmxlIG5ld0RyYXdhYmxlKCk7CiAgICAgICAgIC8qKgpAQCAtODQ0LDYgKzg4MSwxMyBAQAogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldENoYW5naW5nQ29uZmlndXJhdGlvbnMoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB7QGxpbmsgQ29uc3RhbnRTdGF0ZX0gaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgc2hhcmVkIHN0YXRlIG9mIHRoaXMgRHJhd2FibGUuCisgICAgICpxCisgICAgICogQHJldHVybiBUaGUgQ29uc3RhbnRTdGF0ZSBhc3NvY2lhdGVkIHRvIHRoYXQgRHJhd2FibGUuCisgICAgICogQHNlZSBDb25zdGFudFN0YXRlCisgICAgICogQHNlZSBEcmF3YWJsZSNtdXRhdGUoKQorICAgICAqLwogICAgIHB1YmxpYyBDb25zdGFudFN0YXRlIGdldENvbnN0YW50U3RhdGUoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9EcmF3YWJsZUNvbnRhaW5lci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKaW5kZXggYzZmNTdkNC4uMTI0ZDkwNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlQ29udGFpbmVyLmphdmEKQEAgLTE3LDggKzE3LDE2IEBACiBwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGU7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLio7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIAorLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0aGF0IGNvbnRhaW5zIHNldmVyYWwge0BsaW5rIERyYXdhYmxlfXMgYW5kIHNlbGVjdHMgd2hpY2ggb25lIHRvIHVzZS4KKyAqCisgKiBZb3UgY2FuIHN1YmNsYXNzIGl0IHRvIGNyZWF0ZSB5b3VyIG93biBEcmF3YWJsZUNvbnRhaW5lcnMgb3IgZGlyZWN0bHkgdXNlIG9uZSBpdHMgY2hpbGQgY2xhc3Nlcy4KKyAqLwogcHVibGljIGNsYXNzIERyYXdhYmxlQ29udGFpbmVyIGV4dGVuZHMgRHJhd2FibGUgaW1wbGVtZW50cyBEcmF3YWJsZS5DYWxsYmFjayB7CiAKICAgICAvKioKQEAgLTE5Niw4ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgIG1EcmF3YWJsZUNvbnRhaW5lclN0YXRlLmdldE9wYWNpdHkoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3REcmF3YWJsZShpbnQgaWR4KQotICAgIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3REcmF3YWJsZShpbnQgaWR4KSB7CiAgICAgICAgIGlmIChpZHggPT0gbUN1ckluZGV4KSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTI1NSw2ICsyNjIsMTIgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQSBDb25zdGFudFN0YXRlIHRoYXQgY2FuIGNvbnRhaW4gc2V2ZXJhbCB7QGxpbmsgRHJhd2FibGV9cy4KKyAgICAgKgorICAgICAqIFRoaXMgY2xhc3Mgd2FzIG1hZGUgcHVibGljIHRvIGVuYWJsZSB0ZXN0aW5nLCBhbmQgaXRzIHZpc2liaWxpdHkgbWF5IGNoYW5nZSBpbiBhIGZ1dHVyZQorICAgICAqIHJlbGVhc2UuCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBEcmF3YWJsZUNvbnRhaW5lclN0YXRlIGV4dGVuZHMgQ29uc3RhbnRTdGF0ZSB7CiAgICAgICAgIGZpbmFsIERyYXdhYmxlQ29udGFpbmVyIG1Pd25lcjsKIApAQCAtNDQzLDEyICs0NTYsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0OwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVDb25zdGFudFNpemUoKSB7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVDb25zdGFudFNpemUoKSB7CiAgICAgICAgICAgICBtQ29tcHV0ZWRDb25zdGFudFNpemUgPSB0cnVlOwogCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGdldENoaWxkQ291bnQoKTsKICAgICAgICAgICAgIGZpbmFsIERyYXdhYmxlW10gZHJhd2FibGVzID0gbURyYXdhYmxlczsKLSAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbUNvbnN0YW50SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbUNvbnN0YW50SGVpZ2h0ID0gLTE7CiAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtV2lkdGggPSBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHIgPSBkcmF3YWJsZXNbaV07CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0dyYWRpZW50RHJhd2FibGUuamF2YQppbmRleCAzM2VjYmVhLi44OGY2ZDQzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvR3JhZGllbnREcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9HcmFkaWVudERyYXdhYmxlLmphdmEKQEAgLTMxMywxOCArMzEzLDE2IEBACiAgICAgICAgICAgICBjYXNlIFJFQ1RBTkdMRToKICAgICAgICAgICAgICAgICBpZiAoc3QubVJhZGl1c0FycmF5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVBhdGgucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUm91bmRSZWN0KG1SZWN0LCBzdC5tUmFkaXVzQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoLkRpcmVjdGlvbi5DVyk7CisgICAgICAgICAgICAgICAgICAgIG1QYXRoLmFkZFJvdW5kUmVjdChtUmVjdCwgc3QubVJhZGl1c0FycmF5LCBQYXRoLkRpcmVjdGlvbi5DVyk7CiAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbUZpbGxQYWludCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1TdHJva2VQYWludCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5tUmFkaXVzID4gMC4wZikgewogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgY2FsbGVyIGlzIG9ubHkgZ2l2aW5nIHVzIDEgdmFsdWUsIHdlIHdpbGwgZm9yY2UKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdG8gYmUgc3F1YXJlIGlmIHRoZSByZWN0IGlzIHRvbyBzbWFsbCBpbiBvbmUgZGltZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHNob3cgaXQuIElmIHdlIGRpZCBub3RoaW5nLCBTa2lhIHdvdWxkIGNsYW1wIHRoZSByYWQKLSAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXBlbmRlbnRseSBhbG9uZyBlYWNoIGF4aXMsIGdpdmluZyB1cyBhIHRoaW4gZWxsaXBzCisgICAgICAgICAgICAgICAgICAgIC8vIGluZGVwZW5kZW50bHkgYWxvbmcgZWFjaCBheGlzLCBnaXZpbmcgdXMgYSB0aGluIGVsbGlwc2UKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlY3Qgd2VyZSB2ZXJ5IHdpZGUgYnV0IG5vdCB2ZXJ5IHRhbGwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmFkID0gc3QubVJhZGl1czsKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IE1hdGgubWluKG1SZWN0LndpZHRoKCksIG1SZWN0LmhlaWdodCgpKSAqIDAuNWY7CkBAIC0zMzUsNiArMzMzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JvdW5kUmVjdChtUmVjdCwgcmFkLCByYWQsIG1TdHJva2VQYWludCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QobVJlY3QsIG1GaWxsUGFpbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZVN0cm9rZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1SZWN0LCBtU3Ryb2tlUGFpbnQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBPVkFMOgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9MYXllckRyYXdhYmxlLmphdmEKaW5kZXggODA0N2RkNC4uNTAxY2NhOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0xheWVyRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTGF5ZXJEcmF3YWJsZS5qYXZhCkBAIC0yNjYsNiArMjY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzZXREcmF3YWJsZUJ5TGF5ZXJJZChpbnQgaWQsIERyYXdhYmxlIGRyYXdhYmxlKSB7CiAgICAgICAgIGZpbmFsIENoaWxkRHJhd2FibGVbXSBsYXllcnMgPSBtTGF5ZXJTdGF0ZS5tQ2hpbGRyZW47CisgICAgICAgIGRyYXdhYmxlLnNldENhbGxiYWNrKHRoaXMpOwogICAgICAgICAKICAgICAgICAgZm9yIChpbnQgaSA9IG1MYXllclN0YXRlLm1OdW0gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgaWYgKGxheWVyc1tpXS5tSWQgPT0gaWQpIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL01pcG1hcERyYXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmZGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9NaXBtYXBEcmF3YWJsZS5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHJlc291cmNlIHRoYXQgbWFuYWdlcyBhIG51bWJlciBvZiBhbHRlcm5hdGUgRHJhd2FibGVzLCBhbmQgd2hpY2ggYWN0dWFsbHkgZHJhd3MgdGhlIG9uZSB3aGljaAorICogc2l6ZSBtYXRjaGVzIHRoZSBtb3N0IGNsb3NlbHkgdGhlIGRyYXdpbmcgYm91bmRzLiBQcm92aWRpbmcgc2V2ZXJhbCBwcmUtc2NhbGVkIHZlcnNpb24gb2YgdGhlCisgKiBkcmF3YWJsZSBoZWxwcyBtaW5pbWl6aW5nIHRoZSBhbGlhc2luZyBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgaW50cm9kdWNlZCBieSB0aGUgc2NhbGluZy4KKyAqCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2FkZERyYXdhYmxlKERyYXdhYmxlKX0gdG8gZGVmaW5lIHRoZSBkaWZmZXJlbnQgRHJhd2FibGVzIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlCisgKiBtaXBtYXAgbGV2ZWxzIG9mIHRoaXMgTWlwbWFwRHJhd2FibGUuIFRoZSBtaXBtYXAgRHJhd2FibGUgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgd2hlbiB0aGlzCisgKiBNaXBtYXBEcmF3YWJsZSBpcyBkcmF3biBpcyB0aGUgb25lIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgaW50cmluc2ljIGhlaWdodCBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAqIHRoZSBib3VuZHMnIGhlaWdodC4gVGhpcyBzZWxlY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBiZXN0IGF2YWlsYWJsZSBtaXBtYXAgbGV2ZWwgaXMgc2NhbGVkIGRvd24gdG8KKyAqIGRyYXcgdGhpcyBNaXBtYXBEcmF3YWJsZS4KKyAqIDwvcD4KKyAqCisgKiBJZiB0aGUgYm91bmRzJyBoZWlnaHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgbWlwbWFwLCB0aGUgbGFyZ2VzdCBtaXBtYXAgd2lsbCBiZSBzY2FsZWQgdXAuCisgKiBOb3RlIHRoYXQgRHJhd2FibGVzIHdpdGhvdXQgaW50cmluc2ljIGhlaWdodCAoaS5lLiB3aXRoIGEgbmVnYXRpdmUgdmFsdWUsIHN1Y2ggYXMgQ29sb3IpIHdpbGwKKyAqIG9ubHkgYmUgdXNlZCBpZiBubyBvdGhlciBtaXBtYXAgRHJhd2FibGUgYXJlIHByb3ZpZGVkLiBUaGUgRHJhd2FibGVzJyBpbnRyaW5zaWMgaGVpZ2h0cyBzaG91bGQKKyAqIG5vdCBiZSBjaGFuZ2VkIGFmdGVyIHRoZSBEcmF3YWJsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIE1pcG1hcERyYXdhYmxlLgorICoKKyAqIDxwPgorICogVGhlIGRpZmZlcmVudCBtaXBtYXBzJyBwYXJhbWV0ZXJzIChvcGFjaXR5LCBwYWRkaW5nLCBjb2xvciBmaWx0ZXIsIGdyYXZpdHkuLi4pIHNob3VsZCB0eXBpY2FsbHkKKyAqIGJlIHNpbWlsYXIgdG8gZW5zdXJlIGEgY29udGludW91cyB2aXN1YWwgYXBwZWFyYW5jZSB3aGVuIHRoZSBNaXBtYXBEcmF3YWJsZSBpcyBzY2FsZWQuIFRoZSBhc3BlY3QKKyAqIHJhdGlvIG9mIHRoZSBkaWZmZXJlbnQgbWlwbWFwcyBzaG91bGQgZXNwZWNpYWxseSBiZSBlcXVhbC4KKyAqIDwvcD4KKyAqCisgKiBBIHR5cGljYWwgZXhhbXBsZSB1c2Ugb2YgYSBNaXBtYXBEcmF3YWJsZSB3b3VsZCBiZSBmb3IgYW4gaW1hZ2Ugd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgc2NhbGVkIGF0CisgKiB2YXJpb3VzIHNpemVzLCBhbmQgZm9yIHdoaWNoIG9uZSB3YW50cyB0byBwcm92aWRlIHByZS1zY2FsZWQgdmVyc2lvbnMgdG8gcHJlY2lzZWx5IGNvbnRyb2wgaXRzCisgKiBhcHBlYXJhbmNlLgorICoKKyAqIDxwPgorICogVGhlIGludHJpbnNpYyBzaXplIG9mIGEgTWlwbWFwRHJhd2FibGUgYXJlIGluZmVycmVkIGZyb20gdGhvc2Ugb2YgdGhlIGxhcmdlc3QgbWlwbWFwIChpbiB0ZXJtcyBvZgorICoge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfSkuIE9uIHRoZSBvcHBvc2l0ZSwgaXRzIG1pbmltdW0KKyAqIHNpemUgaXMgZGVmaW5lZCBieSB0aGUgc21hbGxlc3QgcHJvdmlkZWQgbWlwbWFwLgorICogPC9wPgorCisgKiBJdCBjYW4gYmUgZGVmaW5lZCBpbiBhbiBYTUwgZmlsZSB3aXRoIHRoZSA8Y29kZT4mbHQ7bWlwbWFwPjwvY29kZT4gZWxlbWVudC4KKyAqIEVhY2ggbWlwbWFwIERyYXdhYmxlIGlzIGRlZmluZWQgaW4gYSBuZXN0ZWQgPGNvZGU+Jmx0O2l0ZW0+PC9jb2RlPi4gRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogJmx0O21pcG1hcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV84IiAvPgorICogICZsdDtpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9teV9pbWFnZV8zMiIgLz4KKyAqICAmbHQ7aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXlfaW1hZ2VfMTI4IiAvPgorICogJmx0Oy9taXBtYXA+CisgKjwvcHJlPgorICogPHA+CisgKiBXaXRoIHRoaXMgWE1MIHNhdmVkIGludG8gdGhlIHJlcy9kcmF3YWJsZS8gZm9sZGVyIG9mIHRoZSBwcm9qZWN0LCBpdCBjYW4gYmUgcmVmZXJlbmNlZCBhcworICogdGhlIGRyYXdhYmxlIGZvciBhbiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3fS4gQXNzdW1pbmcgdGhhdCB0aGUgaGVpZ2h0cyBvZiB0aGUgcHJvdmlkZWQKKyAqIGRyYXdhYmxlcyBhcmUgcmVzcGVjdGl2ZWx5IDgsIDMyIGFuZCAxMjggcGl4ZWxzLCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgc2NhbGVkIGRvd24gd2hlbiB0aGUKKyAqIGJvdW5kcycgaGVpZ2h0IGlzIGxvd2VyIG9yIGVxdWFsIHRoYW4gOCBwaXhlbHMuIFRoZSBzZWNvbmQgZHJhd2FibGUgd2lsbCB0aGVuIGJlIHVzZWQgdXAgdG8gYQorICogaGVpZ2h0IG9mIDMyIHBpeGVscyBhbmQgdGhlIGxhcmdlc3QgZHJhd2FibGUgd2lsbCBiZSB1c2VkIGZvciBncmVhdGVyIGhlaWdodHMuCisgKiA8L3A+CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNNaXBtYXBEcmF3YWJsZUl0ZW1fZHJhd2FibGUKKyAqLworcHVibGljIGNsYXNzIE1pcG1hcERyYXdhYmxlIGV4dGVuZHMgRHJhd2FibGVDb250YWluZXIgeworICAgIHByaXZhdGUgZmluYWwgTWlwbWFwQ29udGFpbmVyU3RhdGUgbU1pcG1hcENvbnRhaW5lclN0YXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBtTXV0YXRlZDsKKworICAgIHB1YmxpYyBNaXBtYXBEcmF3YWJsZSgpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgRHJhd2FibGUgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1pcG1hcCBEcmF3YWJsZXMuIFRoZSBEcmF3YWJsZSBhY3R1YWxseSB1c2VkIHdoZW4KKyAgICAgKiB0aGlzIE1pcG1hcERyYXdhYmxlIGlzIGRyYXduIGlzIGRldGVybWluZWQgZnJvbSBpdHMgYm91bmRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBkcmF3YWJsZSBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZERyYXdhYmxlKERyYXdhYmxlIGRyYXdhYmxlKSB7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTWlwbWFwQ29udGFpbmVyU3RhdGUuYWRkRHJhd2FibGUoZHJhd2FibGUpOworICAgICAgICAgICAgb25EcmF3YWJsZUFkZGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25EcmF3YWJsZUFkZGVkKCkgeworICAgICAgICAvLyBzZWxlY3REcmF3YWJsZSBhc3N1bWVzIHRoYXQgdGhlIGNvbnRhaW5lciBjb250ZW50IGRvZXMgbm90IGNoYW5nZS4KKyAgICAgICAgLy8gV2hlbiBhIERyYXdhYmxlIGlzIGFkZGVkLCB0aGUgc2FtZSBpbmRleCBjYW4gY29ycmVzcG9uZCB0byBhIG5ldyBEcmF3YWJsZSwgYW5kIHNpbmNlCisgICAgICAgIC8vIHNlbGVjdERyYXdhYmxlIGhhcyBhIGZhc3QgZXhpdCBjYXNlIHdoZW4gb2xkSW5kZXg9PW5ld0luZGV4LCB0aGUgbmV3IGRyYXdhYmxlIGNvdWxkIGVuZAorICAgICAgICAvLyB1cCBub3QgYmVpbmcgdXNlZCBpbiBwbGFjZSBvZiB0aGUgcHJldmlvdXMgb25lIGlmIHRoZXkgaGFwcGVuIHRvIHNoYXJlIHRoZSBzYW1lIGluZGV4LgorICAgICAgICAvLyBUaGlzIG1ha2Ugc3VyZSB0aGUgbmV3IGNvbXB1dGVkIGluZGV4IGNhbiBhY3R1YWxseSByZXBsYWNlIHRoZSBwcmV2aW91cyBvbmUuCisgICAgICAgIHNlbGVjdERyYXdhYmxlKC0xKTsKKyAgICAgICAgb25Cb3VuZHNDaGFuZ2UoZ2V0Qm91bmRzKCkpOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlcyBmcm9tIERyYXdhYmxlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJvdW5kc0NoYW5nZShSZWN0IGJvdW5kcykgeworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtTWlwbWFwQ29udGFpbmVyU3RhdGUuaW5kZXhGb3JCb3VuZHMoYm91bmRzKTsKKworICAgICAgICAvLyBXaWxsIGNhbGwgaW52YWxpZGF0ZVNlbGYoKSBpZiBuZWVkZWQKKyAgICAgICAgc2VsZWN0RHJhd2FibGUoaW5kZXgpOworCisgICAgICAgIHN1cGVyLm9uQm91bmRzQ2hhbmdlKGJvdW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5mbGF0ZShSZXNvdXJjZXMgciwgWG1sUHVsbFBhcnNlciBwYXJzZXIsIEF0dHJpYnV0ZVNldCBhdHRycykKKyAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmluZmxhdGUociwgcGFyc2VyLCBhdHRycyk7CisKKyAgICAgICAgaW50IHR5cGU7CisKKyAgICAgICAgZmluYWwgaW50IGlubmVyRGVwdGggPSBwYXJzZXIuZ2V0RGVwdGgoKSArIDE7CisgICAgICAgIGludCBkZXB0aDsKKyAgICAgICAgd2hpbGUgKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQKKyAgICAgICAgICAgICAgICAmJiAoKGRlcHRoID0gcGFyc2VyLmdldERlcHRoKCkpID49IGlubmVyRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlcHRoID4gaW5uZXJEZXB0aCB8fCAhcGFyc2VyLmdldE5hbWUoKS5lcXVhbHMoIml0ZW0iKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSByLm9idGFpbkF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLk1pcG1hcERyYXdhYmxlSXRlbSk7CisKKyAgICAgICAgICAgIGludCBkcmF3YWJsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuTWlwbWFwRHJhd2FibGVJdGVtX2RyYXdhYmxlLCAwKTsKKworICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIERyYXdhYmxlIGRyOworICAgICAgICAgICAgaWYgKGRyYXdhYmxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBkciA9IHIuZ2V0RHJhd2FibGUoZHJhd2FibGVSZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogPGl0ZW0+IHRhZyByZXF1aXJlcyBhICdkcmF3YWJsZScgYXR0cmlidXRlIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjaGlsZCB0YWcgZGVmaW5pbmcgYSBkcmF3YWJsZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkciA9IERyYXdhYmxlLmNyZWF0ZUZyb21YbWxJbm5lcihyLCBwYXJzZXIsIGF0dHJzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLmFkZERyYXdhYmxlKGRyKTsKKyAgICAgICAgfQorCisgICAgICAgIG9uRHJhd2FibGVBZGRlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEcmF3YWJsZSBtdXRhdGUoKSB7CisgICAgICAgIGlmICghbU11dGF0ZWQgJiYgc3VwZXIubXV0YXRlKCkgPT0gdGhpcykgeworICAgICAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzID0gbU1pcG1hcENvbnRhaW5lclN0YXRlLm1NaXBtYXBIZWlnaHRzLmNsb25lKCk7CisgICAgICAgICAgICBtTXV0YXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgTWlwbWFwQ29udGFpbmVyU3RhdGUgZXh0ZW5kcyBEcmF3YWJsZUNvbnRhaW5lclN0YXRlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtTWlwbWFwSGVpZ2h0czsKKworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZShNaXBtYXBDb250YWluZXJTdGF0ZSBvcmlnLCBNaXBtYXBEcmF3YWJsZSBvd25lciwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICAgICAgc3VwZXIob3JpZywgb3duZXIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChvcmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0cyA9IG9yaWcubU1pcG1hcEhlaWdodHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzID0gbmV3IGludFtnZXRDaGlsZHJlbigpLmxlbmd0aF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgc2V0Q29uc3RhbnRTaXplKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGlsZCBtaXBtYXAgZHJhd2FibGUgdGhhdCB3aWxsIGJlc3QgZml0IHRoZSBwcm92aWRlZCBib3VuZHMuCisgICAgICAgICAqIFRoaXMgaW5kZXggaXMgZGV0ZXJtaW5lZCBieSBjb21wYXJpbmcgYm91bmRzJyBoZWlnaHQgYW5kIGNoaWxkcmVuIGludHJpbnNpYyBoZWlnaHRzLgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgbWlwbWFwIGluZGV4IGlzIHRoZSBzbWFsbGVzdCBtaXBtYXAgd2hpY2ggaGVpZ2h0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbgorICAgICAgICAgKiB0aGUgYm91bmRzJyBoZWlnaHQuIElmIHRoZSBib3VuZHMnIGhlaWdodCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBtaXBtYXAsIHRoZSBsYXJnZXN0CisgICAgICAgICAqIG1pcG1hcCBpbmRleCBpcyByZXR1cm5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJvdW5kcyBUaGUgYm91bmRzIG9mIHRoZSBNaXBNYXBEcmF3YWJsZS4KKyAgICAgICAgICogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGNoaWxkIERyYXdhYmxlIHRoYXQgd2lsbCBiZXN0IGZpdCB0aGVzZSBib3VuZHMsIG9yIC0xIGlmIHRoZXJlCisgICAgICAgICAqIGFyZSBubyBjaGlsZHJlbiBtaXBtYXBzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBpbmRleEZvckJvdW5kcyhSZWN0IGJvdW5kcykgeworICAgICAgICAgICAgZmluYWwgaW50IGJvdW5kc0hlaWdodCA9IGJvdW5kcy5oZWlnaHQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYm91bmRzSGVpZ2h0IDw9IG1NaXBtYXBIZWlnaHRzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm8gbWlwbWFwIGxhcmdlciB0aGFuIGJvdW5kcyBmb3VuZC4gVXNlIGxhcmdlc3Qgb25lIHdoaWNoIHdpbGwgYmUgc2NhbGVkIHVwLgorICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm8gRHJhd2FibGUgbWlwbWFwIGF0IGFsbAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBEcmF3YWJsZSB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbWlwbWFwIERyYXdhYmxlcy4gVGhpcyBsaXN0IGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICogdXNpbmcge0BsaW5rIERyYXdhYmxlQ29udGFpbmVyLkRyYXdhYmxlQ29udGFpbmVyU3RhdGUjZ2V0Q2hpbGRyZW4oKX0gYW5kIHRoaXMgbWV0aG9kCisgICAgICAgICAqIGVuc3VyZXMgdGhhdCBpdCBpcyBhbHdheXMgc29ydGVkIGJ5IGluY3JlYXNpbmcge0BsaW5rIERyYXdhYmxlI2dldEludHJpbnNpY0hlaWdodCgpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRyYXdhYmxlIFRoZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gY2hpbGRyZW4gbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRHJhd2FibGUoRHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBkcmF3YWJsZSBpbiBsYXN0IHBvc2l0aW9uLCBjb3JyZWN0bHkgcmVzZXR0aW5nIGNhY2hlZCB2YWx1ZXMgYW5kCisgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IG1Db21wdXRlZENvbnN0YW50U2l6ZQorICAgICAgICAgICAgaW50IHBvcyA9IGFkZENoaWxkKGRyYXdhYmxlKTsKKworICAgICAgICAgICAgLy8gQnViYmxlIHNvcnQgdGhlIGxhc3QgZHJhd2FibGUgdG8gcmVzdG9yZSB0aGUgc29ydCBieSBpbnRyaW5zaWMgaGVpZ2h0CisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd2FibGVIZWlnaHQgPSBkcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgd2hpbGUgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBwcmV2aW91c0RyYXdhYmxlID0gbURyYXdhYmxlc1twb3MtMV07CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0ID0gcHJldmlvdXNEcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKKworICAgICAgICAgICAgICAgIGlmIChkcmF3YWJsZUhlaWdodCA8IHByZXZpb3VzSW50cmluc2ljSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1EcmF3YWJsZXNbcG9zXSA9IHByZXZpb3VzRHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIG1NaXBtYXBIZWlnaHRzW3Bvc10gPSBwcmV2aW91c0ludHJpbnNpY0hlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBtRHJhd2FibGVzW3Bvcy0xXSA9IGRyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBtTWlwbWFwSGVpZ2h0c1twb3MtMV0gPSBkcmF3YWJsZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludHJpbnNpYyBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIG1pcG1hcC4KKyAgICAgICAgICogTWluaW11bSBzaXplcyBhcmUgdGhvc2Ugb2YgdGhlIHNtYWxsZXN0IGF2YWlsYWJsZSBtaXBtYXAuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUNvbnN0YW50U2l6ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRHJhd2FibGUgc21hbGxlc3REcmF3YWJsZSA9IG1EcmF3YWJsZXNbMF07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRNaW5pbXVtSGVpZ2h0ID0gc21hbGxlc3REcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZSBsYXJnZXN0RHJhd2FibGUgPSBtRHJhd2FibGVzW04tMV07CisgICAgICAgICAgICAgICAgbUNvbnN0YW50V2lkdGggPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKTsKKyAgICAgICAgICAgICAgICBtQ29uc3RhbnRIZWlnaHQgPSBsYXJnZXN0RHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db25zdGFudFdpZHRoID0gbUNvbnN0YW50SGVpZ2h0ID0gLTE7CisgICAgICAgICAgICAgICAgbUNvbnN0YW50TWluaW11bVdpZHRoID0gbUNvbnN0YW50TWluaW11bUhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tcHV0ZWRDb25zdGFudFNpemUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEcmF3YWJsZSBuZXdEcmF3YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERyYXdhYmxlIG5ld0RyYXdhYmxlKFJlc291cmNlcyByZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlwbWFwRHJhd2FibGUodGhpcywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBncm93QXJyYXkoaW50IG9sZFNpemUsIGludCBuZXdTaXplKSB7CisgICAgICAgICAgICBzdXBlci5ncm93QXJyYXkob2xkU2l6ZSwgbmV3U2l6ZSk7CisgICAgICAgICAgICBpbnRbXSBuZXdJbnRzID0gbmV3IGludFtuZXdTaXplXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1pcG1hcEhlaWdodHMsIDAsIG5ld0ludHMsIDAsIG9sZFNpemUpOworICAgICAgICAgICAgbU1pcG1hcEhlaWdodHMgPSBuZXdJbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNaXBtYXBEcmF3YWJsZShNaXBtYXBDb250YWluZXJTdGF0ZSBzdGF0ZSwgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBNaXBtYXBDb250YWluZXJTdGF0ZSBhcyA9IG5ldyBNaXBtYXBDb250YWluZXJTdGF0ZShzdGF0ZSwgdGhpcywgcmVzKTsKKyAgICAgICAgbU1pcG1hcENvbnRhaW5lclN0YXRlID0gYXM7CisgICAgICAgIHNldENvbnN0YW50U3RhdGUoYXMpOworICAgICAgICBvbkRyYXdhYmxlQWRkZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvTmluZVBhdGNoRHJhd2FibGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhCmluZGV4IGJhZDk0ZmIuLjlhOThkNTMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9OaW5lUGF0Y2hEcmF3YWJsZS5qYXZhCkBAIC0xNzUsMTYgKzE3NSw5IEBACiAgICAgICAgICAgICBkZXN0LmJvdHRvbSA9IEJpdG1hcC5zY2FsZUZyb21EZW5zaXR5KHNyYy5ib3R0b20sIHNkZW5zaXR5LCB0ZGVuc2l0eSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgLy8gb3ZlcnJpZGVzCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICBmbG9hdFtdIHB0cyA9IG5ldyBmbG9hdFsyXTsKLSAgICAgICAgICAgIGNhbnZhcy5nZXRNYXRyaXgoKS5tYXBQb2ludHMocHRzKTsKLSAgICAgICAgICAgIExvZy52KCI5cGF0Y2giLCAiRHJhd2luZyA5LXBhdGNoIEAgIiArIHB0c1swXSArICIsIiArIHB0c1sxXSArICI6ICIgKyBnZXRCb3VuZHMoKSk7Ci0gICAgICAgIH0KICAgICAgICAgbU5pbmVQYXRjaC5kcmF3KGNhbnZhcywgZ2V0Qm91bmRzKCksIG1QYWludCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvc2hhcGVzL1JvdW5kUmVjdFNoYXBlLmphdmEKaW5kZXggZjRjZjE1Yy4uYjQ2OWQyYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL3NoYXBlcy9Sb3VuZFJlY3RTaGFwZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9zaGFwZXMvUm91bmRSZWN0U2hhcGUuamF2YQpAQCAtNTcsMTMgKzU3LDExIEBACiAgICAgICovCiAgICAgcHVibGljIFJvdW5kUmVjdFNoYXBlKGZsb2F0W10gb3V0ZXJSYWRpaSwgUmVjdEYgaW5zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0W10gaW5uZXJSYWRpaSkgewotICAgICAgICBpZiAob3V0ZXJSYWRpaS5sZW5ndGggPCA4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRlciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKKyAgICAgICAgaWYgKG91dGVyUmFkaWkgIT0gbnVsbCAmJiBvdXRlclJhZGlpLmxlbmd0aCA8IDgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIm91dGVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbm5lclJhZGlpICE9IG51bGwgJiYgaW5uZXJSYWRpaS5sZW5ndGggPCA4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbm5lciByYWRpaSBtdXN0IGhhdmUgPj0gOCB2YWx1ZXMiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oImlubmVyIHJhZGlpIG11c3QgaGF2ZSA+PSA4IHZhbHVlcyIpOwogICAgICAgICB9CiAgICAgICAgIG1PdXRlclJhZGlpID0gb3V0ZXJSYWRpaTsKICAgICAgICAgbUluc2V0ID0gaW5zZXQ7CkBAIC05Nyw4ICs5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJpZ2h0IC0gbUluc2V0LnJpZ2h0LCByLmJvdHRvbSAtIG1JbnNldC5ib3R0b20pOwogICAgICAgICAgICAgaWYgKG1Jbm5lclJlY3Qud2lkdGgoKSA8IHcgJiYgbUlubmVyUmVjdC5oZWlnaHQoKSA8IGgpIHsKICAgICAgICAgICAgICAgICBpZiAobUlubmVyUmFkaWkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobUlubmVyUmVjdCwgbUlubmVyUmFkaWksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoLkRpcmVjdGlvbi5DQ1cpOworICAgICAgICAgICAgICAgICAgICBtUGF0aC5hZGRSb3VuZFJlY3QobUlubmVyUmVjdCwgbUlubmVyUmFkaWksIFBhdGguRGlyZWN0aW9uLkNDVyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVBhdGguYWRkUmVjdChtSW5uZXJSZWN0LCBQYXRoLkRpcmVjdGlvbi5DQ1cpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwOSw4ICsxMDYsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSb3VuZFJlY3RTaGFwZSBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIFJvdW5kUmVjdFNoYXBlIHNoYXBlID0gKFJvdW5kUmVjdFNoYXBlKSBzdXBlci5jbG9uZSgpOwotICAgICAgICBzaGFwZS5tT3V0ZXJSYWRpaSA9IG1PdXRlclJhZGlpLmNsb25lKCk7Ci0gICAgICAgIHNoYXBlLm1Jbm5lclJhZGlpID0gbUlubmVyUmFkaWkuY2xvbmUoKTsKKyAgICAgICAgc2hhcGUubU91dGVyUmFkaWkgPSBtT3V0ZXJSYWRpaSAhPSBudWxsID8gbU91dGVyUmFkaWkuY2xvbmUoKSA6IG51bGw7CisgICAgICAgIHNoYXBlLm1Jbm5lclJhZGlpID0gbUlubmVyUmFkaWkgIT0gbnVsbCA/IG1Jbm5lclJhZGlpLmNsb25lKCkgOiBudWxsOwogICAgICAgICBzaGFwZS5tSW5zZXQgPSBuZXcgUmVjdEYobUluc2V0KTsKICAgICAgICAgc2hhcGUubUlubmVyUmVjdCA9IG5ldyBSZWN0RihtSW5uZXJSZWN0KTsKICAgICAgICAgc2hhcGUubVBhdGggPSBuZXcgUGF0aChtUGF0aCk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCmluZGV4IGIyN2M3ZjUuLjk4NWQ3MDAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCkBAIC0zNSwxMSArMzUsMjUgQEAKICAgICBCaXRtYXAgbUJpdG1hcDsKIAogICAgIEFsbG9jYXRpb24oaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMsIFR5cGUgdCkgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICBtVHlwZSA9IHQ7CiAgICAgfQogCisgICAgQWxsb2NhdGlvbihpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgIG1OYW1lID0gbVJTLm5HZXROYW1lKG1JRCk7CisgICAgICAgIGludCB0eXBlSUQgPSBtUlMubkFsbG9jYXRpb25HZXRUeXBlKG1JRCk7CisgICAgICAgIGlmKHR5cGVJRCAhPSAwKSB7CisgICAgICAgICAgICBtVHlwZSA9IG5ldyBUeXBlKHR5cGVJRCwgbVJTKTsKKyAgICAgICAgICAgIG1UeXBlLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CiAgICAgICAgIHJldHVybiBtVHlwZTsKICAgICB9CkBAIC03NiwxMCArOTAsNTAgQEAKICAgICAgICAgc3ViRGF0YTFEKDAsIG1UeXBlLmdldEVsZW1lbnRDb3VudCgpLCBkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzdWJEYXRhKGludCB4b2ZmLCBGaWVsZFBhY2tlciBmcCkgeworICAgICAgICBpbnQgZVNpemUgPSBtVHlwZS5tRWxlbWVudC5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBmcC5nZXREYXRhKCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gZGF0YS5sZW5ndGggLyBlU2l6ZTsKKyAgICAgICAgaWYgKChlU2l6ZSAqIGNvdW50KSAhPSBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgcGFja2VyIGxlbmd0aCAiICsgZGF0YS5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5vdCBkaXZpc2libGUgYnkgZWxlbWVudCBzaXplICIgKyBlU2l6ZSArICIuIik7CisgICAgICAgIH0KKyAgICAgICAgZGF0YTFEQ2hlY2tzKHhvZmYsIGNvdW50LCBkYXRhLmxlbmd0aCwgZGF0YS5sZW5ndGgpOworICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJEYXRhMUQobUlELCB4b2ZmLCBjb3VudCwgZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc3ViRWxlbWVudERhdGEoaW50IHhvZmYsIGludCBjb21wb25lbnRfbnVtYmVyLCBGaWVsZFBhY2tlciBmcCkgeworICAgICAgICBpZiAoY29tcG9uZW50X251bWJlciA+PSBtVHlwZS5tRWxlbWVudC5tRWxlbWVudHMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb21wb25lbnRfbnVtYmVyICIgKyBjb21wb25lbnRfbnVtYmVyICsgIiBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoeG9mZiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBtdXN0IGJlID49IDAuIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGZwLmdldERhdGEoKTsKKyAgICAgICAgaW50IGVTaXplID0gbVR5cGUubUVsZW1lbnQubUVsZW1lbnRzW2NvbXBvbmVudF9udW1iZXJdLmdldFNpemVCeXRlcygpOworCisgICAgICAgIGlmIChkYXRhLmxlbmd0aCAhPSBlU2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgcGFja2VyIHNpemVsZW5ndGggIiArIGRhdGEubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBtYXRjaCBjb21wb25lbnQgc2l6ZSAiICsgZVNpemUgKyAiLiIpOworICAgICAgICB9CisKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChtSUQsIHhvZmYsIGNvbXBvbmVudF9udW1iZXIsIGRhdGEsIGRhdGEubGVuZ3RoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZGF0YTFEQ2hlY2tzKGludCBvZmYsIGludCBjb3VudCwgaW50IGxlbiwgaW50IGRhdGFTaXplKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBpZigob2ZmIDwgMCkgfHwgKGNvdW50IDwgMSkgfHwgKChvZmYgKyBjb3VudCkgPiBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBvciBDb3VudCBvdXQgb2YgYm91bmRzLiIpOworICAgICAgICBpZihvZmYgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgbXVzdCBiZSA+PSAwLiIpOworICAgICAgICB9CisgICAgICAgIGlmKGNvdW50IDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ291bnQgbXVzdCBiZSA+PSAxLiIpOworICAgICAgICB9CisgICAgICAgIGlmKChvZmYgKyBjb3VudCkgPiBtVHlwZS5nZXRFbGVtZW50Q291bnQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcmZsb3csIEF2YWlsYWJsZSBjb3VudCAiICsgbVR5cGUuZ2V0RWxlbWVudENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBnb3QgIiArIGNvdW50ICsgIiBhdCBvZmZzZXQgIiArIG9mZiArICIuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYoKGxlbikgPCBkYXRhU2l6ZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgdG9vIHNtYWxsIGZvciBhbGxvY2F0aW9uIHR5cGUuIik7CkBAIC0xMDgsNyArMTYyLDYgQEAKICAgICB9CiAKIAotCiAgICAgcHVibGljIHZvaWQgc3ViRGF0YTJEKGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwogICAgICAgICBtUlMubkFsbG9jYXRpb25TdWJEYXRhMkQobUlELCB4b2ZmLCB5b2ZmLCB3LCBoLCBkLCBkLmxlbmd0aCAqIDQpOwpAQCAtMTI5LDI1ICsxODIsMTAgQEAKICAgICAgICAgbVJTLm5BbGxvY2F0aW9uUmVhZChtSUQsIGQpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGRhdGEoT2JqZWN0IG8pIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KG1JRCwgbVR5cGUsIDAsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYWQoT2JqZWN0IG8pIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0KG1JRCwgbVR5cGUsIDAsIG8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEoaW50IG9mZnNldCwgT2JqZWN0IG8pIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KG1JRCwgbVR5cGUsIG9mZnNldCwgbyk7Ci0gICAgfQogCiAgICAgcHVibGljIGNsYXNzIEFkYXB0ZXIxRCBleHRlbmRzIEJhc2VPYmogewogICAgICAgICBBZGFwdGVyMUQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgICAgIG1JRCA9IGlkOworICAgICAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnQoRGltZW5zaW9uIGRpbSwgaW50IHZhbHVlKSB7CkBAIC0xODksOCArMjI3LDcgQEAKIAogICAgIHB1YmxpYyBjbGFzcyBBZGFwdGVyMkQgZXh0ZW5kcyBCYXNlT2JqIHsKICAgICAgICAgQWRhcHRlcjJEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KERpbWVuc2lvbiBkaW0sIGludCB2YWx1ZSkgewpAQCAtMzc3LDYgKzQxNCwyMSBAQAogICAgICAgICBCaXRtYXAgYiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCBpZCwgbUJpdG1hcE9wdGlvbnMpOwogICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUJpdG1hcEJveGVkKHJzLCBiLCBkc3RGbXQsIGdlbk1pcHMpOwogICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgQWxsb2NhdGlvbiBjcmVhdGVGcm9tU3RyaW5nKFJlbmRlclNjcmlwdCBycywgU3RyaW5nIHN0cikKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBhbGxvY0FycmF5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFsbG9jQXJyYXkgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgICAgICBBbGxvY2F0aW9uIGFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChycywgRWxlbWVudC5VOChycyksIGFsbG9jQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICAgIGFsbG9jLmRhdGEoYWxsb2NBcnJheSk7CisgICAgICAgICAgICByZXR1cm4gYWxsb2M7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIHV0Zi04Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKaW5kZXggMDAyZmM3OC4uMzE5OGUzZiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CYXNlT2JqLmphdmEKQEAgLTI0LDEwICsyNCwxMCBAQAogICoqLwogY2xhc3MgQmFzZU9iaiB7CiAKLSAgICBCYXNlT2JqKFJlbmRlclNjcmlwdCBycykgeworICAgIEJhc2VPYmooaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKICAgICAgICAgcnMudmFsaWRhdGUoKTsKICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1JRCA9IDA7CisgICAgICAgIG1JRCA9IGlkOwogICAgICAgICBtRGVzdHJveWVkID0gZmFsc2U7CiAgICAgfQogCkBAIC02Miw3ICs2Miw3IEBACiAgICAgewogICAgICAgICBpZiAoIW1EZXN0cm95ZWQpIHsKICAgICAgICAgICAgIGlmKG1JRCAhPSAwICYmIG1SUy5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgICAgICBtUlMubk9iakRlc3Ryb3lPT0IobUlEKTsKKyAgICAgICAgICAgICAgICBtUlMubk9iakRlc3Ryb3kobUlEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1SUyA9IG51bGw7CiAgICAgICAgICAgICBtSUQgPSAwOwpAQCAtODEsNSArODEsMTAgQEAKICAgICAgICAgbVJTLm5PYmpEZXN0cm95KG1JRCk7CiAgICAgfQogCisgICAgLy8gSWYgYW4gb2JqZWN0IGNhbWUgZnJvbSBhbiBhM2QgZmlsZSwgamF2YSBmaWVsZHMgbmVlZCB0byBiZQorICAgIC8vIGNyZWF0ZWQgd2l0aCBvYmplY3RzIGZyb20gdGhlIG5hdGl2ZSBsYXllcgorICAgIHZvaWQgdXBkYXRlRnJvbU5hdGl2ZSgpIHsKKyAgICB9CisKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Y2Y4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0J5dGUyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgQnl0ZTIgeworICAgIHB1YmxpYyBCeXRlMigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSB4OworICAgIHB1YmxpYyBieXRlIHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmMwY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlMy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEJ5dGUzIHsKKyAgICBwdWJsaWMgQnl0ZTMoKSB7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworICAgIHB1YmxpYyBieXRlIHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQnl0ZTQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWJmYzYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9CeXRlNC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEJ5dGU0IHsKKyAgICBwdWJsaWMgQnl0ZTQoKSB7CisgICAgfQorCisgICAgcHVibGljIGJ5dGUgeDsKKyAgICBwdWJsaWMgYnl0ZSB5OworICAgIHB1YmxpYyBieXRlIHo7CisgICAgcHVibGljIGJ5dGUgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEKaW5kZXggMTBlZjA1YS4uMDViMmQ2MCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9FbGVtZW50LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEBoaWRlCkBAIC0yNiw2ICsyNyw3IEBACiAgICAgaW50IG1TaXplOwogICAgIEVsZW1lbnRbXSBtRWxlbWVudHM7CiAgICAgU3RyaW5nW10gbUVsZW1lbnROYW1lczsKKyAgICBpbnRbXSBtQXJyYXlTaXplczsKIAogICAgIERhdGFUeXBlIG1UeXBlOwogICAgIERhdGFLaW5kIG1LaW5kOwpAQCAtNDcsMjAgKzQ5LDI2IEBACiAgICAgICAgIFVOU0lHTkVEXzMyICgxMCwgNCksCiAgICAgICAgIC8vVU5TSUdORURfNjQgKDExLCA4KSwKIAotICAgICAgICBVTlNJR05FRF81XzZfNSAoMTIsIDIpLAotICAgICAgICBVTlNJR05FRF81XzVfNV8xICgxMywgMiksCi0gICAgICAgIFVOU0lHTkVEXzRfNF80XzQgKDE0LCAyKSwKKyAgICAgICAgQk9PTEVBTigxMiwgMSksCiAKLSAgICAgICAgUlNfRUxFTUVOVCAoMTUsIDQpLAotICAgICAgICBSU19UWVBFICgxNiwgNCksCi0gICAgICAgIFJTX0FMTE9DQVRJT04gKDE3LCA0KSwKLSAgICAgICAgUlNfU0FNUExFUiAoMTgsIDQpLAotICAgICAgICBSU19TQ1JJUFQgKDE5LCA0KSwKLSAgICAgICAgUlNfTUVTSCAoMjAsIDQpLAotICAgICAgICBSU19QUk9HUkFNX0ZSQUdNRU5UICgyMSwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fVkVSVEVYICgyMiwgNCksCi0gICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgyMywgNCksCi0gICAgICAgIFJTX1BST0dSQU1fU1RPUkUgKDI0LCA0KTsKKyAgICAgICAgVU5TSUdORURfNV82XzUgKDEzLCAyKSwKKyAgICAgICAgVU5TSUdORURfNV81XzVfMSAoMTQsIDIpLAorICAgICAgICBVTlNJR05FRF80XzRfNF80ICgxNSwgMiksCisKKyAgICAgICAgTUFUUklYXzRYNCAoMTYsIDY0KSwKKyAgICAgICAgTUFUUklYXzNYMyAoMTcsIDM2KSwKKyAgICAgICAgTUFUUklYXzJYMiAoMTgsIDE2KSwKKworICAgICAgICBSU19FTEVNRU5UICgxMDAwLCA0KSwKKyAgICAgICAgUlNfVFlQRSAoMTAwMSwgNCksCisgICAgICAgIFJTX0FMTE9DQVRJT04gKDEwMDIsIDQpLAorICAgICAgICBSU19TQU1QTEVSICgxMDAzLCA0KSwKKyAgICAgICAgUlNfU0NSSVBUICgxMDA0LCA0KSwKKyAgICAgICAgUlNfTUVTSCAoMTAwNSwgNCksCisgICAgICAgIFJTX1BST0dSQU1fRlJBR01FTlQgKDEwMDYsIDQpLAorICAgICAgICBSU19QUk9HUkFNX1ZFUlRFWCAoMTAwNywgNCksCisgICAgICAgIFJTX1BST0dSQU1fUkFTVEVSICgxMDA4LCA0KSwKKyAgICAgICAgUlNfUFJPR1JBTV9TVE9SRSAoMTAwOSwgNCk7CiAKICAgICAgICAgaW50IG1JRDsKICAgICAgICAgaW50IG1TaXplOwpAQCAtNzIsMTIgKzgwLDYgQEAKIAogICAgIHB1YmxpYyBlbnVtIERhdGFLaW5kIHsKICAgICAgICAgVVNFUiAoMCksCi0gICAgICAgIENPTE9SICgxKSwKLSAgICAgICAgUE9TSVRJT04gKDIpLAotICAgICAgICBURVhUVVJFICgzKSwKLSAgICAgICAgTk9STUFMICg0KSwKLSAgICAgICAgSU5ERVggKDUpLAotICAgICAgICBQT0lOVF9TSVpFKDYpLAogCiAgICAgICAgIFBJWEVMX0wgKDcpLAogICAgICAgICBQSVhFTF9BICg4KSwKQEAgLTkxLDQxICs5MywxMzMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX1U4KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX1U4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfVTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84KTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQk9PTEVBTihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfQk9PTEVBTiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9CT09MRUFOID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuQk9PTEVBTik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfVTg7CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9CT09MRUFOOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX0k4KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX0k4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1VTRVJfSTggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFU4KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9VOCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VOCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX0k4OworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFVTRVJfVTMyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9VU0VSX1UzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9VU0VSX1UzMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlVOU0lHTkVEXzMyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0k4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0k4ID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9VU0VSX1UzMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0k4OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX0kzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9JMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9JMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfMzIpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVMTYoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1UxNiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VMTYgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8xNik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfSTMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVTE2OwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVU0VSX0YzMihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfVVNFUl9GMzIgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfVVNFUl9GMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEkxNihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfSTE2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0kxNiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlNJR05FRF8xNik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1VTRVJfRjMyOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTE2OwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBVMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1UzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5VTlNJR05FRF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1UzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgSTMyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9JMzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfSTMyID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfSTMyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBGMzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0YzMiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9GMzIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5GTE9BVF8zMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0YzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRUxFTUVOVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfRUxFTUVOVCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9FTEVNRU5UID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfRUxFTUVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0VMRU1FTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFRZUEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1RZUEUgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfVFlQRSA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1RZUEUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9UWVBFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBTExPQ0FUSU9OKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9BTExPQ0FUSU9OID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0FMTE9DQVRJT04gPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19BTExPQ0FUSU9OKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQUxMT0NBVElPTjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgU0FNUExFUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfU0FNUExFUiA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9TQU1QTEVSID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfU0FNUExFUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1NBTVBMRVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFNDUklQVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfU0NSSVBUID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1NDUklQVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1NDUklQVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1NDUklQVDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgTUVTSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfTUVTSCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9NRVNIID0gY3JlYXRlVXNlcihycywgRGF0YVR5cGUuUlNfTUVTSCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X01FU0g7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IFBST0dSQU1fRlJBR01FTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9GUkFHTUVOVCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLlJTX1BST0dSQU1fRlJBR01FTlQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9QUk9HUkFNX0ZSQUdNRU5UOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX1ZFUlRFWChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVggPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9WRVJURVggPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX1ZFUlRFWCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fVkVSVEVYOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX1JBU1RFUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfUFJPR1JBTV9SQVNURVIgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX1JBU1RFUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBQUk9HUkFNX1NUT1JFKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9QUk9HUkFNX1NUT1JFID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X1BST0dSQU1fU1RPUkUgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5SU19QUk9HUkFNX1NUT1JFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKKyAgICB9CisKKwogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBBXzgoUmVuZGVyU2NyaXB0IHJzKSB7CiAgICAgICAgIGlmKHJzLm1FbGVtZW50X0FfOCA9PSBudWxsKSB7CiAgICAgICAgICAgICBycy5tRWxlbWVudF9BXzggPSBjcmVhdGVQaXhlbChycywgRGF0YVR5cGUuVU5TSUdORURfOCwgRGF0YUtpbmQuUElYRUxfQSk7CkBAIC0xNjgsMTY4ICsyNjIsMTQxIEBACiAgICAgICAgIHJldHVybiBycy5tRWxlbWVudF9SR0JBXzg4ODg7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IElOREVYXzE2KFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9JTkRFWF8xNiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9JTkRFWF8xNiA9IGNyZWF0ZUluZGV4KHJzKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgRjMyXzIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X0ZMT0FUXzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfRkxPQVRfMiA9IGNyZWF0ZVZlY3RvcihycywgRGF0YVR5cGUuRkxPQVRfMzIsIDIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9JTkRFWF8xNjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzI7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8yKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMik7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl8zKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF8zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzMgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCAzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMjsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzM7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9QT1NJVElPTl8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9QT1NJVElPTl8zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJzLm1FbGVtZW50X1BPU0lUSU9OXzMgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5QT1NJVElPTiwgMyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEYzMl80KFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9GTE9BVF80ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X0ZMT0FUXzQgPSBjcmVhdGVWZWN0b3IocnMsIERhdGFUeXBlLkZMT0FUXzMyLCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfUE9TSVRJT05fMzsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X0ZMT0FUXzQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9URVhUVVJFXzIoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X1RFWFRVUkVfMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9URVhUVVJFXzIgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5URVhUVVJFLCAyKTsKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgVThfNChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubUVsZW1lbnRfVUNIQVJfNCA9PSBudWxsKSB7CisgICAgICAgICAgICBycy5tRWxlbWVudF9VQ0hBUl80ID0gY3JlYXRlVmVjdG9yKHJzLCBEYXRhVHlwZS5VTlNJR05FRF84LCA0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVEVYVFVSRV8yOworICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfVUNIQVJfNDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX05PUk1BTF8zKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBpZihycy5tRWxlbWVudF9OT1JNQUxfMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBycy5tRWxlbWVudF9OT1JNQUxfMyA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuRkxPQVRfMzIsIERhdGFLaW5kLk5PUk1BTCwgMyk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1BVFJJWF80WDQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01BVFJJWF80WDQgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUFUUklYXzRYNCA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLk1BVFJJWF80WDQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9OT1JNQUxfMzsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X01BVFJJWF80WDQ7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVg0WDQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHJldHVybiBNQVRSSVhfNFg0KHJzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgQVRUUklCX0NPTE9SX1U4XzQoUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIGlmKHJzLm1FbGVtZW50X0NPTE9SX1U4XzQgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfQ09MT1JfVThfNCA9IGNyZWF0ZUF0dHJpYihycywgRGF0YVR5cGUuVU5TSUdORURfOCwgRGF0YUtpbmQuQ09MT1IsIDQpOworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBNQVRSSVhfM1gzKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tRWxlbWVudF9NQVRSSVhfM1gzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJzLm1FbGVtZW50X01BVFJJWF8zWDMgPSBjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5NQVRSSVhfM1gzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcnMubUVsZW1lbnRfQ09MT1JfVThfNDsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X01BVFJJWF80WDQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IEFUVFJJQl9DT0xPUl9GMzJfNChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgaWYocnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPT0gbnVsbCkgewotICAgICAgICAgICAgcnMubUVsZW1lbnRfQ09MT1JfRjMyXzQgPSBjcmVhdGVBdHRyaWIocnMsIERhdGFUeXBlLkZMT0FUXzMyLCBEYXRhS2luZC5DT0xPUiwgNCk7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IE1BVFJJWF8yWDIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1FbGVtZW50X01BVFJJWF8yWDIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnMubUVsZW1lbnRfTUFUUklYXzJYMiA9IGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLk1BVFJJWF8yWDIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBycy5tRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICAgICAgcmV0dXJuIHJzLm1FbGVtZW50X01BVFJJWF8yWDI7CiAgICAgfQogCi0gICAgRWxlbWVudChSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnRbXSBlLCBTdHJpbmdbXSBuKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBFbGVtZW50W10gZSwgU3RyaW5nW10gbiwgaW50W10gYXMpIHsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICAgICAgbVNpemUgPSAwOwogICAgICAgICBtRWxlbWVudHMgPSBlOwogICAgICAgICBtRWxlbWVudE5hbWVzID0gbjsKLSAgICAgICAgaW50W10gaWRzID0gbmV3IGludFttRWxlbWVudHMubGVuZ3RoXTsKKyAgICAgICAgbUFycmF5U2l6ZXMgPSBhczsKICAgICAgICAgZm9yIChpbnQgY3QgPSAwOyBjdCA8IG1FbGVtZW50cy5sZW5ndGg7IGN0KysgKSB7CiAgICAgICAgICAgICBtU2l6ZSArPSBtRWxlbWVudHNbY3RdLm1TaXplOwotICAgICAgICAgICAgaWRzW2N0XSA9IG1FbGVtZW50c1tjdF0ubUlEOwogICAgICAgICB9Ci0gICAgICAgIG1JRCA9IHJzLm5FbGVtZW50Q3JlYXRlMihpZHMsIG1FbGVtZW50TmFtZXMpOwogICAgIH0KIAotICAgIEVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzLCBEYXRhVHlwZSBkdCwgRGF0YUtpbmQgZGssIGJvb2xlYW4gbm9ybSwgaW50IHNpemUpIHsKLSAgICAgICAgc3VwZXIocnMpOworICAgIEVsZW1lbnQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaywgYm9vbGVhbiBub3JtLCBpbnQgc2l6ZSkgeworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgICAgICBtU2l6ZSA9IGR0Lm1TaXplICogc2l6ZTsKICAgICAgICAgbVR5cGUgPSBkdDsKICAgICAgICAgbUtpbmQgPSBkazsKICAgICAgICAgbU5vcm1hbGl6ZWQgPSBub3JtOwogICAgICAgICBtVmVjdG9yU2l6ZSA9IHNpemU7Ci0gICAgICAgIG1JRCA9IHJzLm5FbGVtZW50Q3JlYXRlKGR0Lm1JRCwgZGsubUlELCBub3JtLCBzaXplKTsKKyAgICB9CisKKyAgICBFbGVtZW50KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworCisgICAgICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICAgICAgaW50W10gZGF0YUJ1ZmZlciA9IG5ldyBpbnRbNV07CisgICAgICAgIG1SUy5uRWxlbWVudEdldE5hdGl2ZURhdGEobUlELCBkYXRhQnVmZmVyKTsKKworICAgICAgICBtTm9ybWFsaXplZCA9IGRhdGFCdWZmZXJbMl0gPT0gMSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbVZlY3RvclNpemUgPSBkYXRhQnVmZmVyWzNdOworICAgICAgICBtU2l6ZSA9IDA7CisgICAgICAgIGZvciAoRGF0YVR5cGUgZHQ6IERhdGFUeXBlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZihkdC5tSUQgPT0gZGF0YUJ1ZmZlclswXSl7CisgICAgICAgICAgICAgICAgbVR5cGUgPSBkdDsKKyAgICAgICAgICAgICAgICBtU2l6ZSA9IG1UeXBlLm1TaXplICogbVZlY3RvclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChEYXRhS2luZCBkazogRGF0YUtpbmQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmKGRrLm1JRCA9PSBkYXRhQnVmZmVyWzFdKXsKKyAgICAgICAgICAgICAgICBtS2luZCA9IGRrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IG51bVN1YkVsZW1lbnRzID0gZGF0YUJ1ZmZlcls0XTsKKyAgICAgICAgaWYobnVtU3ViRWxlbWVudHMgPiAwKSB7CisgICAgICAgICAgICBtRWxlbWVudHMgPSBuZXcgRWxlbWVudFtudW1TdWJFbGVtZW50c107CisgICAgICAgICAgICBtRWxlbWVudE5hbWVzID0gbmV3IFN0cmluZ1tudW1TdWJFbGVtZW50c107CisKKyAgICAgICAgICAgIGludFtdIHN1YkVsZW1lbnRJZHMgPSBuZXcgaW50W251bVN1YkVsZW1lbnRzXTsKKyAgICAgICAgICAgIG1SUy5uRWxlbWVudEdldFN1YkVsZW1lbnRzKG1JRCwgc3ViRWxlbWVudElkcywgbUVsZW1lbnROYW1lcyk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtU3ViRWxlbWVudHM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBtRWxlbWVudHNbaV0gPSBuZXcgRWxlbWVudChzdWJFbGVtZW50SWRzW2ldLCBtUlMpOworICAgICAgICAgICAgICAgIG1FbGVtZW50c1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICAgICAgbVNpemUgKz0gbUVsZW1lbnRzW2ldLm1TaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYykgewotICAgICAgICBycy52YWxpZGF0ZSgpOwotICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGMuZ2V0RmllbGRzKCk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKLQotICAgICAgICBmb3IoRmllbGQgZjogZmllbGRzKSB7Ci0gICAgICAgICAgICBDbGFzcyBmYyA9IGYuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYoZmMgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYi5hZGQoY3JlYXRlVXNlcihycywgRGF0YVR5cGUuU0lHTkVEXzE2KSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZjID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBiLmFkZChjcmVhdGVVc2VyKHJzLCBEYXRhVHlwZS5TSUdORURfOCksIGYuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihmYyA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgIGIuYWRkKGNyZWF0ZVVzZXIocnMsIERhdGFUeXBlLkZMT0FUXzMyKSwgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtvd24gZmllbGQgdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiLmNyZWF0ZSgpOwotICAgIH0KLQotCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlVXNlcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIERhdGFLaW5kLlVTRVIsIGZhbHNlLCAxKTsKKyAgICAgICAgRGF0YUtpbmQgZGsgPSBEYXRhS2luZC5VU0VSOworICAgICAgICBib29sZWFuIG5vcm0gPSBmYWxzZTsKKyAgICAgICAgaW50IHZlY1NpemUgPSAxOworICAgICAgICBpbnQgaWQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgdmVjU2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChpZCwgcnMsIGR0LCBkaywgbm9ybSwgdmVjU2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZVZlY3RvcihSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBpbnQgc2l6ZSkgewogICAgICAgICBpZiAoc2l6ZSA8IDIgfHwgc2l6ZSA+IDQpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBzaXplIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgRGF0YUtpbmQuVVNFUiwgZmFsc2UsIHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVJbmRleChSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBEYXRhVHlwZS5VTlNJR05FRF8xNiwgRGF0YUtpbmQuSU5ERVgsIGZhbHNlLCAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlQXR0cmliKFJlbmRlclNjcmlwdCBycywgRGF0YVR5cGUgZHQsIERhdGFLaW5kIGRrLCBpbnQgc2l6ZSkgewotICAgICAgICBpZiAoIShkdCA9PSBEYXRhVHlwZS5GTE9BVF8zMiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzE2IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlVOU0lHTkVEXzMyIHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF84IHx8Ci0gICAgICAgICAgICAgIGR0ID09IERhdGFUeXBlLlNJR05FRF8xNiB8fAotICAgICAgICAgICAgICBkdCA9PSBEYXRhVHlwZS5TSUdORURfMzIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBEYXRhVHlwZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoZGsgPT0gRGF0YUtpbmQuQ09MT1IgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9TSVRJT04gfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuVEVYVFVSRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5OT1JNQUwgfHwKLSAgICAgICAgICAgICAgZGsgPT0gRGF0YUtpbmQuUE9JTlRfU0laRSB8fAotICAgICAgICAgICAgICBkayA9PSBEYXRhS2luZC5VU0VSKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgRGF0YUtpbmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJgotICAgICAgICAgICAgKChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiAmJiBkdCAhPSBEYXRhVHlwZS5VTlNJR05FRF84KSB8fAotICAgICAgICAgICAgIHNpemUgPCAzIHx8IHNpemUgPiA0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPU0lUSU9OICYmIChzaXplIDwgMSB8fCBzaXplID4gNCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCBjb21ibyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5URVhUVVJFICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGsgPT0gRGF0YUtpbmQuTk9STUFMICYmCi0gICAgICAgICAgICAoZHQgIT0gRGF0YVR5cGUuRkxPQVRfMzIgfHwgc2l6ZSAhPSAzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbWJvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRrID09IERhdGFLaW5kLlBPSU5UX1NJWkUgJiYKLSAgICAgICAgICAgIChkdCAhPSBEYXRhVHlwZS5GTE9BVF8zMiB8fCBzaXplICE9IDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgY29tYm8iKTsKLSAgICAgICAgfQotCisgICAgICAgIERhdGFLaW5kIGRrID0gRGF0YUtpbmQuVVNFUjsKICAgICAgICAgYm9vbGVhbiBub3JtID0gZmFsc2U7Ci0gICAgICAgIGlmIChkayA9PSBEYXRhS2luZC5DT0xPUiAmJiBkdCA9PSBEYXRhVHlwZS5VTlNJR05FRF84KSB7Ci0gICAgICAgICAgICBub3JtID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudChycywgZHQsIGRrLCBub3JtLCBzaXplKTsKKyAgICAgICAgaW50IGlkID0gcnMubkVsZW1lbnRDcmVhdGUoZHQubUlELCBkay5tSUQsIG5vcm0sIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIHJzLCBkdCwgZGssIG5vcm0sIHNpemUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVQaXhlbChSZW5kZXJTY3JpcHQgcnMsIERhdGFUeXBlIGR0LCBEYXRhS2luZCBkaykgewpAQCAtMzY3LDEzICs0MzQsMTYgQEAKICAgICAgICAgICAgIHNpemUgPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KHJzLCBkdCwgZGssIHRydWUsIHNpemUpOworICAgICAgICBib29sZWFuIG5vcm0gPSB0cnVlOworICAgICAgICBpbnQgaWQgPSBycy5uRWxlbWVudENyZWF0ZShkdC5tSUQsIGRrLm1JRCwgbm9ybSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChpZCwgcnMsIGR0LCBkaywgbm9ybSwgc2l6ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKICAgICAgICAgRWxlbWVudFtdIG1FbGVtZW50czsKICAgICAgICAgU3RyaW5nW10gbUVsZW1lbnROYW1lczsKKyAgICAgICAgaW50W10gbUFycmF5U2l6ZXM7CiAgICAgICAgIGludCBtQ291bnQ7CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CkBAIC0zODEsMjkgKzQ1MSw0OSBAQAogICAgICAgICAgICAgbUNvdW50ID0gMDsKICAgICAgICAgICAgIG1FbGVtZW50cyA9IG5ldyBFbGVtZW50WzhdOwogICAgICAgICAgICAgbUVsZW1lbnROYW1lcyA9IG5ldyBTdHJpbmdbOF07CisgICAgICAgICAgICBtQXJyYXlTaXplcyA9IG5ldyBpbnRbOF07CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSkgeworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSwgaW50IGFycmF5U2l6ZSkgeworICAgICAgICAgICAgaWYgKGFycmF5U2l6ZSA8IDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBzaXplIGNhbm5vdCBiZSBsZXNzIHRoYW4gMS4iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKG1Db3VudCA9PSBtRWxlbWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgRWxlbWVudFtdIGUgPSBuZXcgRWxlbWVudFttQ291bnQgKyA4XTsKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1ttQ291bnQgKyA4XTsKKyAgICAgICAgICAgICAgICBpbnRbXSBhcyA9IG5ldyBpbnRbbUNvdW50ICsgOF07CiAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRWxlbWVudHMsIDAsIGUsIDAsIG1Db3VudCk7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRWxlbWVudE5hbWVzLCAwLCBzLCAwLCBtQ291bnQpOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUFycmF5U2l6ZXMsIDAsIGFzLCAwLCBtQ291bnQpOwogICAgICAgICAgICAgICAgIG1FbGVtZW50cyA9IGU7CiAgICAgICAgICAgICAgICAgbUVsZW1lbnROYW1lcyA9IHM7CisgICAgICAgICAgICAgICAgbUFycmF5U2l6ZXMgPSBhczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1FbGVtZW50c1ttQ291bnRdID0gZWxlbWVudDsKICAgICAgICAgICAgIG1FbGVtZW50TmFtZXNbbUNvdW50XSA9IG5hbWU7CisgICAgICAgICAgICBtQXJyYXlTaXplc1ttQ291bnRdID0gYXJyYXlTaXplOwogICAgICAgICAgICAgbUNvdW50Kys7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgYWRkKGVsZW1lbnQsIG5hbWUsIDEpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEVsZW1lbnQgY3JlYXRlKCkgewogICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CiAgICAgICAgICAgICBFbGVtZW50W10gZWluID0gbmV3IEVsZW1lbnRbbUNvdW50XTsKICAgICAgICAgICAgIFN0cmluZ1tdIHNpbiA9IG5ldyBTdHJpbmdbbUNvdW50XTsKKyAgICAgICAgICAgIGludFtdIGFzaW4gPSBuZXcgaW50W21Db3VudF07CiAgICAgICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmFycmF5Y29weShtRWxlbWVudHMsIDAsIGVpbiwgMCwgbUNvdW50KTsKICAgICAgICAgICAgIGphdmEubGFuZy5TeXN0ZW0uYXJyYXljb3B5KG1FbGVtZW50TmFtZXMsIDAsIHNpbiwgMCwgbUNvdW50KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChtUlMsIGVpbiwgc2luKTsKKyAgICAgICAgICAgIGphdmEubGFuZy5TeXN0ZW0uYXJyYXljb3B5KG1BcnJheVNpemVzLCAwLCBhc2luLCAwLCBtQ291bnQpOworCisgICAgICAgICAgICBpbnRbXSBpZHMgPSBuZXcgaW50W2Vpbi5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgY3QgPSAwOyBjdCA8IGVpbi5sZW5ndGg7IGN0KysgKSB7CisgICAgICAgICAgICAgICAgaWRzW2N0XSA9IGVpbltjdF0ubUlEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGlkID0gbVJTLm5FbGVtZW50Q3JlYXRlMihpZHMsIHNpbiwgYXNpbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoaWQsIG1SUywgZWluLCBzaW4sIGFzaW4pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKaW5kZXggYjI2ZTQ3ZC4uYjZmODhiZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQpAQCAtMzMsMjEgKzMzLDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHJlc2V0KCkgeworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICBtUG9zID0gMDsKICAgICB9CisgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IGkpIHsKKyAgICAgICAgbVBvcyA9IGk7CisgICAgfQogCi0gICAgdm9pZCBhZGRJOChieXRlIHYpIHsKKyAgICBwdWJsaWMgdm9pZCBza2lwKGludCBpKSB7CisgICAgICAgIG1Qb3MgKz0gaTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJOChieXRlIHYpIHsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IHY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRJMTYoc2hvcnQgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEkxNihzaG9ydCB2KSB7CiAgICAgICAgIGFsaWduKDIpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkSTMyKGludCB2KSB7CisgICAgcHVibGljIHZvaWQgYWRkSTMyKGludCB2KSB7CiAgICAgICAgIGFsaWduKDQpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKHYgJiAweGZmKTsKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA4KSAmIDB4ZmYpOwpAQCAtNTUsNyArNjIsNyBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkSTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZEk2NChsb25nIHYpIHsKICAgICAgICAgYWxpZ24oOCk7CiAgICAgICAgIG1EYXRhW21Qb3MrK10gPSAoYnl0ZSkodiAmIDB4ZmYpOwogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDgpICYgMHhmZik7CkBAIC02NywxNSArNzQsMTcgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSgodiA+PiA1NikgJiAweGZmKTsKICAgICB9CiAKLSAgICB2b2lkIGFkZFU4KHNob3J0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVOChzaG9ydCB2KSB7CiAgICAgICAgIGlmICgodiA8IDApIHx8ICh2ID4gMHhmZikpIHsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAiRmllbGRQYWNrZXIuYWRkVTgoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKXY7CiAgICAgfQogCi0gICAgdm9pZCBhZGRVMTYoaW50IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoaW50IHYpIHsKICAgICAgICAgaWYgKCh2IDwgMCkgfHwgKHYgPiAweGZmZmYpKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFUxNiggIiArIHYgKyAiICkiKTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNhdmluZyB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUiKTsKICAgICAgICAgfQogICAgICAgICBhbGlnbigyKTsKQEAgLTgzLDggKzkyLDkgQEAKICAgICAgICAgbURhdGFbbVBvcysrXSA9IChieXRlKSh2ID4+IDgpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTMyKGxvbmcgdikgewotICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmZmZmZmZmYpKSB7CisgICAgcHVibGljIHZvaWQgYWRkVTMyKGxvbmcgdikgeworICAgICAgICBpZiAoKHYgPCAwKSB8fCAodiA+IDB4ZmZmZmZmZmZMKSkgeworICAgICAgICAgICAgYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJGaWVsZFBhY2tlci5hZGRVMzIoICIgKyB2ICsgIiApIik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTYXZpbmcgdmFsdWUgb3V0IG9mIHJhbmdlIGZvciB0eXBlIik7CiAgICAgICAgIH0KICAgICAgICAgYWxpZ24oNCk7CkBAIC05NCw4ICsxMDQsOSBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDI0KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkVTY0KGxvbmcgdikgeworICAgIHB1YmxpYyB2b2lkIGFkZFU2NChsb25nIHYpIHsKICAgICAgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgIkZpZWxkUGFja2VyLmFkZFU2NCggIiArIHYgKyAiICkiKTsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNhdmluZyB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUiKTsKICAgICAgICAgfQogICAgICAgICBhbGlnbig4KTsKQEAgLTEwOSwxNSArMTIwLDE1NyBAQAogICAgICAgICBtRGF0YVttUG9zKytdID0gKGJ5dGUpKCh2ID4+IDU2KSAmIDB4ZmYpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjMyKGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoZmxvYXQgdikgewogICAgICAgICBhZGRJMzIoRmxvYXQuZmxvYXRUb1Jhd0ludEJpdHModikpOwogICAgIH0KIAotICAgIHZvaWQgYWRkRjY0KGZsb2F0IHYpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRGNjQoZmxvYXQgdikgewogICAgICAgICBhZGRJNjQoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModikpOwogICAgIH0KIAotICAgIGZpbmFsIGJ5dGVbXSBnZXREYXRhKCkgeworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihCYXNlT2JqIG9iaikgeworICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEkzMihvYmouZ2V0SUQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRJMzIoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQyIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRGMzIoRmxvYXQzIHYpIHsKKyAgICAgICAgYWRkRjMyKHYueCk7CisgICAgICAgIGFkZEYzMih2LnkpOworICAgICAgICBhZGRGMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkRjMyKEZsb2F0NCB2KSB7CisgICAgICAgIGFkZEYzMih2LngpOworICAgICAgICBhZGRGMzIodi55KTsKKyAgICAgICAgYWRkRjMyKHYueik7CisgICAgICAgIGFkZEYzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEk4KEJ5dGUyIHYpIHsKKyAgICAgICAgYWRkSTgodi54KTsKKyAgICAgICAgYWRkSTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTgoQnl0ZTMgdikgeworICAgICAgICBhZGRJOCh2LngpOworICAgICAgICBhZGRJOCh2LnkpOworICAgICAgICBhZGRJOCh2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJOChCeXRlNCB2KSB7CisgICAgICAgIGFkZEk4KHYueCk7CisgICAgICAgIGFkZEk4KHYueSk7CisgICAgICAgIGFkZEk4KHYueik7CisgICAgICAgIGFkZEk4KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTgoU2hvcnQ0IHYpIHsKKyAgICAgICAgYWRkVTgodi54KTsKKyAgICAgICAgYWRkVTgodi55KTsKKyAgICAgICAgYWRkVTgodi56KTsKKyAgICAgICAgYWRkVTgodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQyIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRJMTYoU2hvcnQzIHYpIHsKKyAgICAgICAgYWRkSTE2KHYueCk7CisgICAgICAgIGFkZEkxNih2LnkpOworICAgICAgICBhZGRJMTYodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTE2KFNob3J0NCB2KSB7CisgICAgICAgIGFkZEkxNih2LngpOworICAgICAgICBhZGRJMTYodi55KTsKKyAgICAgICAgYWRkSTE2KHYueik7CisgICAgICAgIGFkZEkxNih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQyIHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMTYoSW50MyB2KSB7CisgICAgICAgIGFkZFUxNih2LngpOworICAgICAgICBhZGRVMTYodi55KTsKKyAgICAgICAgYWRkVTE2KHYueik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZFUxNihJbnQ0IHYpIHsKKyAgICAgICAgYWRkVTE2KHYueCk7CisgICAgICAgIGFkZFUxNih2LnkpOworICAgICAgICBhZGRVMTYodi56KTsKKyAgICAgICAgYWRkVTE2KHYudyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDIgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGFkZEkzMihJbnQzIHYpIHsKKyAgICAgICAgYWRkSTMyKHYueCk7CisgICAgICAgIGFkZEkzMih2LnkpOworICAgICAgICBhZGRJMzIodi56KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkSTMyKEludDQgdikgeworICAgICAgICBhZGRJMzIodi54KTsKKyAgICAgICAgYWRkSTMyKHYueSk7CisgICAgICAgIGFkZEkzMih2LnopOworICAgICAgICBhZGRJMzIodi53KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50MiB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgYWRkVTMyKEludDMgdikgeworICAgICAgICBhZGRVMzIodi54KTsKKyAgICAgICAgYWRkVTMyKHYueSk7CisgICAgICAgIGFkZFUzMih2LnopOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGRVMzIoSW50NCB2KSB7CisgICAgICAgIGFkZFUzMih2LngpOworICAgICAgICBhZGRVMzIodi55KTsKKyAgICAgICAgYWRkVTMyKHYueik7CisgICAgICAgIGFkZFUzMih2LncpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE9iaihNYXRyaXg0ZiB2KSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHYubU1hdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRjMyKHYubU1hdFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmooTWF0cml4M2YgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2Lm1NYXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEYzMih2Lm1NYXRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkT2JqKE1hdHJpeDJmIHYpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdi5tTWF0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRGMzIodi5tTWF0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEJvb2xlYW4oYm9vbGVhbiB2KSB7CisgICAgICAgIGFkZEk4KChieXRlKSh2ID8gMSA6IDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldERhdGEoKSB7CiAgICAgICAgIHJldHVybiBtRGF0YTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWxlQTNELmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNDA2MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmlsZUEzRC5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEZpbGVBM0QgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIENsYXNzSUQgeworCisgICAgICAgIFVOS05PV04sCisgICAgICAgIE1FU0gsCisgICAgICAgIFRZUEUsCisgICAgICAgIEVMRU1FTlQsCisgICAgICAgIEFMTE9DQVRJT04sCisgICAgICAgIFBST0dSQU1fVkVSVEVYLAorICAgICAgICBQUk9HUkFNX1JBU1RFUiwKKyAgICAgICAgUFJPR1JBTV9GUkFHTUVOVCwKKyAgICAgICAgUFJPR1JBTV9TVE9SRSwKKyAgICAgICAgU0FNUExFUiwKKyAgICAgICAgQU5JTUFUSU9OLAorICAgICAgICBMSUdIVCwKKyAgICAgICAgQURBUFRFUl8xRCwKKyAgICAgICAgQURBUFRFUl8yRCwKKyAgICAgICAgU0NSSVBUX0M7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzc0lEIHRvQ2xhc3NJRChpbnQgaW50SUQpIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzc0lELnZhbHVlcygpW2ludElEXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlYWQgb25seSBjbGFzcyB3aXRoIGluZGV4IGVudHJpZXMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluZGV4RW50cnkgeworICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOworICAgICAgICBpbnQgbUluZGV4OworICAgICAgICBpbnQgbUlEOworICAgICAgICBTdHJpbmcgbU5hbWU7CisgICAgICAgIENsYXNzSUQgbUNsYXNzSUQ7CisgICAgICAgIEJhc2VPYmogbUxvYWRlZE9iajsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NJRCBnZXRDbGFzc0lEKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DbGFzc0lEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJhc2VPYmogZ2V0T2JqZWN0KCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBCYXNlT2JqIG9iaiA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gb2JqOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBCYXNlT2JqIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgSW5kZXhFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgaWYoZW50cnkubUxvYWRlZE9iaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm1Mb2FkZWRPYmo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGVudHJ5Lm1DbGFzc0lEID09IENsYXNzSUQuVU5LTk9XTikgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2JqZWN0SUQgPSBycy5uRmlsZUEzREdldEVudHJ5QnlJbmRleChlbnRyeS5tSUQsIGVudHJ5Lm1JbmRleCk7CisgICAgICAgICAgICBpZihvYmplY3RJRCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZW50cnkubUNsYXNzSUQpIHsKKyAgICAgICAgICAgIGNhc2UgTUVTSDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IE1lc2gob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbmV3IFR5cGUob2JqZWN0SUQsIHJzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxMT0NBVElPTjoKKyAgICAgICAgICAgICAgICBlbnRyeS5tTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUFJPR1JBTV9WRVJURVg6CisgICAgICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iaiA9IG5ldyBQcm9ncmFtVmVydGV4KG9iamVjdElELCBycyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX0ZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQU1QTEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTklNQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExJR0hUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBREFQVEVSXzFEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBREFQVEVSXzJEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQ1JJUFRfQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnkubUxvYWRlZE9iai51cGRhdGVGcm9tTmF0aXZlKCk7CisKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5tTG9hZGVkT2JqOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhFbnRyeShSZW5kZXJTY3JpcHQgcnMsIGludCBpbmRleCwgaW50IGlkLCBTdHJpbmcgbmFtZSwgQ2xhc3NJRCBjbGFzc0lEKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1JbmRleCA9IGluZGV4OworICAgICAgICAgICAgbUlEID0gaWQ7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBtQ2xhc3NJRCA9IGNsYXNzSUQ7CisgICAgICAgICAgICBtTG9hZGVkT2JqID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEluZGV4RW50cnlbXSBtRmlsZUVudHJpZXM7CisKKyAgICBGaWxlQTNEKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRFbnRyaWVzKCkgeworICAgICAgICBpbnQgbnVtRmlsZUVudHJpZXMgPSBtUlMubkZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMobUlEKTsKKyAgICAgICAgaWYobnVtRmlsZUVudHJpZXMgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZpbGVFbnRyaWVzID0gbmV3IEluZGV4RW50cnlbbnVtRmlsZUVudHJpZXNdOworICAgICAgICBpbnRbXSBpZHMgPSBuZXcgaW50W251bUZpbGVFbnRyaWVzXTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW251bUZpbGVFbnRyaWVzXTsKKworICAgICAgICBtUlMubkZpbGVBM0RHZXRJbmRleEVudHJpZXMobUlELCBudW1GaWxlRW50cmllcywgaWRzLCBuYW1lcyk7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUZpbGVFbnRyaWVzOyBpICsrKSB7CisgICAgICAgICAgICBtRmlsZUVudHJpZXNbaV0gPSBuZXcgSW5kZXhFbnRyeShtUlMsIGksIG1JRCwgbmFtZXNbaV0sIENsYXNzSUQudG9DbGFzc0lEKGlkc1tpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXROdW1JbmRleEVudHJpZXMoKSB7CisgICAgICAgIGlmKG1GaWxlRW50cmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVFbnRyaWVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhFbnRyeSBnZXRJbmRleEVudHJ5KGludCBpbmRleCkgeworICAgICAgICBpZihnZXROdW1JbmRleEVudHJpZXMoKSA9PSAwIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtRmlsZUVudHJpZXMubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVFbnRyaWVzW2luZGV4XTsKKyAgICB9CisKKyAgICBzdGF0aWMgcHVibGljIEZpbGVBM0QgY3JlYXRlRnJvbVJlc291cmNlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgaW50IGlkKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICBycy52YWxpZGF0ZSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgICAgIGlzID0gcmVzLm9wZW5SYXdSZXNvdXJjZShpZCwgdmFsdWUpOworCisgICAgICAgICAgICBpbnQgYXNzZXQgPSAoKEFzc2V0TWFuYWdlci5Bc3NldElucHV0U3RyZWFtKSBpcykuZ2V0QXNzZXRJbnQoKTsKKworICAgICAgICAgICAgaW50IGZpbGVJZCA9IHJzLm5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGFzc2V0KTsKKworICAgICAgICAgICAgaWYoZmlsZUlkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMb2FkIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVBM0QgZmEzZCA9IG5ldyBGaWxlQTNEKGZpbGVJZCwgcnMpOworICAgICAgICAgICAgZmEzZC5pbml0RW50cmllcygpOworICAgICAgICAgICAgcmV0dXJuIGZhM2Q7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5YmY3YgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmxvYXQyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRmxvYXQyIHsKKyAgICBwdWJsaWMgRmxvYXQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBGbG9hdDIoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZKSB7CisgICAgICAgIHggPSBpbml0WDsKKyAgICAgICAgeSA9IGluaXRZOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUxNDBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDMgeworICAgIHB1YmxpYyBGbG9hdDMoKSB7CisgICAgfQorICAgIHB1YmxpYyBGbG9hdDMoZmxvYXQgaW5pdFgsIGZsb2F0IGluaXRZLCBmbG9hdCBpbml0WikgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICAgICAgeiA9IGluaXRaOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCB4OworICAgIHB1YmxpYyBmbG9hdCB5OworICAgIHB1YmxpYyBmbG9hdCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Zsb2F0NC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc3MzJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GbG9hdDQuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBGbG9hdDQgeworICAgIHB1YmxpYyBGbG9hdDQoKSB7CisgICAgfQorCisgICAgcHVibGljIEZsb2F0NChmbG9hdCBpbml0WCwgZmxvYXQgaW5pdFksIGZsb2F0IGluaXRaLCBmbG9hdCBpbml0VykgeworICAgICAgICB4ID0gaW5pdFg7CisgICAgICAgIHkgPSBpbml0WTsKKyAgICAgICAgeiA9IGluaXRaOworICAgICAgICB3ID0gaW5pdFc7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IHg7CisgICAgcHVibGljIGZsb2F0IHk7CisgICAgcHVibGljIGZsb2F0IHo7CisgICAgcHVibGljIGZsb2F0IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRm9udC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjUwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZvbnQuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgRm9udCBleHRlbmRzIEJhc2VPYmogeworCisgICAgLy9UaGVzZSBoZWxwIHVzIGNyZWF0ZSBhIGZvbnQgYnkgZmFtaWx5IG5hbWUKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBzU2Fuc05hbWVzID0geworICAgICAgICAic2Fucy1zZXJpZiIsICJhcmlhbCIsICJoZWx2ZXRpY2EiLCAidGFob21hIiwgInZlcmRhbmEiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNTZXJpZk5hbWVzID0geworICAgICAgICAic2VyaWYiLCAidGltZXMiLCAidGltZXMgbmV3IHJvbWFuIiwgInBhbGF0aW5vIiwgImdlb3JnaWEiLCAiYmFza2VydmlsbGUiLAorICAgICAgICAiZ291ZHkiLCAiZmFudGFzeSIsICJjdXJzaXZlIiwgIklUQyBTdG9uZSBTZXJpZiIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc01vbm9OYW1lcyA9IHsKKyAgICAgICAgIm1vbm9zcGFjZSIsICJjb3VyaWVyIiwgImNvdXJpZXIgbmV3IiwgIm1vbmFjbyIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9udEZhbWlseSB7CisgICAgICAgIFN0cmluZ1tdIG1OYW1lczsKKyAgICAgICAgU3RyaW5nIG1Ob3JtYWxGaWxlTmFtZTsKKyAgICAgICAgU3RyaW5nIG1Cb2xkRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtSXRhbGljRmlsZU5hbWU7CisgICAgICAgIFN0cmluZyBtQm9sZEl0YWxpY0ZpbGVOYW1lOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEZvbnRGYW1pbHk+IHNGb250RmFtaWx5TWFwOworCisgICAgcHVibGljIGVudW0gU3R5bGUgeworICAgICAgICBOT1JNQUwsCisgICAgICAgIEJPTEQsCisgICAgICAgIElUQUxJQywKKyAgICAgICAgQk9MRF9JVEFMSUM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGYW1pbHlUb01hcChGb250RmFtaWx5IGZhbWlseSkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZmFtaWx5Lm1OYW1lcy5sZW5ndGg7IGkgKyspIHsKKyAgICAgICAgICAgIHNGb250RmFtaWx5TWFwLnB1dChmYW1pbHkubU5hbWVzW2ldLCBmYW1pbHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0Rm9udEZhbWlseU1hcCgpIHsKKyAgICAgICAgc0ZvbnRGYW1pbHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEZvbnRGYW1pbHk+KCk7CisKKyAgICAgICAgRm9udEZhbWlseSBzYW5zRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgc2Fuc0ZhbWlseS5tTmFtZXMgPSBzU2Fuc05hbWVzOworICAgICAgICBzYW5zRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNhbnMudHRmIjsKKyAgICAgICAgc2Fuc0ZhbWlseS5tQm9sZEZpbGVOYW1lID0gIkRyb2lkU2Fucy1Cb2xkLnR0ZiI7CisgICAgICAgIHNhbnNGYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fucy50dGYiOworICAgICAgICBzYW5zRmFtaWx5Lm1Cb2xkSXRhbGljRmlsZU5hbWUgPSAiRHJvaWRTYW5zLUJvbGQudHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAoc2Fuc0ZhbWlseSk7CisKKyAgICAgICAgRm9udEZhbWlseSBzZXJpZkZhbWlseSA9IG5ldyBGb250RmFtaWx5KCk7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1OYW1lcyA9IHNTZXJpZk5hbWVzOworICAgICAgICBzZXJpZkZhbWlseS5tTm9ybWFsRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1SZWd1bGFyLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1Cb2xkRmlsZU5hbWUgPSAiRHJvaWRTZXJpZi1Cb2xkLnR0ZiI7CisgICAgICAgIHNlcmlmRmFtaWx5Lm1JdGFsaWNGaWxlTmFtZSA9ICJEcm9pZFNlcmlmLUl0YWxpYy50dGYiOworICAgICAgICBzZXJpZkZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2VyaWYtQm9sZEl0YWxpYy50dGYiOworICAgICAgICBhZGRGYW1pbHlUb01hcChzZXJpZkZhbWlseSk7CisKKyAgICAgICAgRm9udEZhbWlseSBtb25vRmFtaWx5ID0gbmV3IEZvbnRGYW1pbHkoKTsKKyAgICAgICAgbW9ub0ZhbWlseS5tTmFtZXMgPSBzTW9ub05hbWVzOworICAgICAgICBtb25vRmFtaWx5Lm1Ob3JtYWxGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUJvbGRGaWxlTmFtZSA9ICJEcm9pZFNhbnNNb25vLnR0ZiI7CisgICAgICAgIG1vbm9GYW1pbHkubUl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgbW9ub0ZhbWlseS5tQm9sZEl0YWxpY0ZpbGVOYW1lID0gIkRyb2lkU2Fuc01vbm8udHRmIjsKKyAgICAgICAgYWRkRmFtaWx5VG9NYXAobW9ub0ZhbWlseSk7CisgICAgfQorCisgICAgc3RhdGljIHsKKyAgICAgICAgaW5pdEZvbnRGYW1pbHlNYXAoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGdldEZvbnRGaWxlTmFtZShTdHJpbmcgZmFtaWx5TmFtZSwgU3R5bGUgc3R5bGUpIHsKKyAgICAgICAgRm9udEZhbWlseSBmYW1pbHkgPSBzRm9udEZhbWlseU1hcC5nZXQoZmFtaWx5TmFtZSk7CisgICAgICAgIGlmKGZhbWlseSAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2goc3R5bGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PUk1BTDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbWlseS5tTm9ybWFsRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBCT0xEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFtaWx5Lm1Cb2xkRmlsZU5hbWU7CisgICAgICAgICAgICAgICAgY2FzZSBJVEFMSUM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUl0YWxpY0ZpbGVOYW1lOworICAgICAgICAgICAgICAgIGNhc2UgQk9MRF9JVEFMSUM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHkubUJvbGRJdGFsaWNGaWxlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBGYWxsYmFjayBpZiB3ZSBjb3VsZCBub3QgZmluZCB0aGUgZGVzaXJlZCBmYW1pbHkKKyAgICAgICAgcmV0dXJuICJEcm9pZFNhbnMudHRmIjsKKyAgICB9CisKKyAgICBGb250KGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZXMgYSBzcGVjaWZpYyBmaWxlIG5hbWUgYXMgYW4gYXJndW1lbnQKKyAgICAgKi8KKyAgICBzdGF0aWMgcHVibGljIEZvbnQgY3JlYXRlKFJlbmRlclNjcmlwdCBycywgUmVzb3VyY2VzIHJlcywgU3RyaW5nIGZpbGVOYW1lLCBpbnQgc2l6ZSkKKyAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcnMudmFsaWRhdGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBkcGkgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOworICAgICAgICAgICAgaW50IGZvbnRJZCA9IHJzLm5Gb250Q3JlYXRlRnJvbUZpbGUoZmlsZU5hbWUsIHNpemUsIGRwaSk7CisKKyAgICAgICAgICAgIGlmKGZvbnRJZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmFpbGVkIGxvYWRpbmcgYSBmb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb250IHJzRm9udCA9IG5ldyBGb250KGZvbnRJZCwgcnMpOworCisgICAgICAgICAgICByZXR1cm4gcnNGb250OworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmFtaWx5IG5hbWVzIGFzIGFuIGFyZ3VtZW50CisgICAgICogYW5kIHdpbGwgYXR0ZW1wIHRvIHByb2R1Y2UgdGhlIGJlc3QgbWF0Y2ggd2l0aCBhIHN5c3RlbSBmb250CisgICAgICogInNhbnMtc2VyaWYiICJhcmlhbCIgImhlbHZldGljYSIgInRhaG9tYSIgInZlcmRhbmEiCisgICAgICogInNlcmlmIiAidGltZXMiICJ0aW1lcyBuZXcgcm9tYW4iICJwYWxhdGlubyIgImdlb3JnaWEiICJiYXNrZXJ2aWxsZSIKKyAgICAgKiAiZ291ZHkiICJmYW50YXN5IiAiY3Vyc2l2ZSIgIklUQyBTdG9uZSBTZXJpZiIKKyAgICAgKiAibW9ub3NwYWNlIiAiY291cmllciIgImNvdXJpZXIgbmV3IiAibW9uYWNvIgorICAgICAqIFJldHVybnMgZGVmYXVsdCBmb250IGlmIG5vIG1hdGNoIGNvdWxkIGJlIGZvdW5kCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBGb250IGNyZWF0ZUZyb21GYW1pbHkoUmVuZGVyU2NyaXB0IHJzLCBSZXNvdXJjZXMgcmVzLCBTdHJpbmcgZmFtaWx5TmFtZSwgU3R5bGUgZm9udFN0eWxlLCBpbnQgc2l6ZSkKKyAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0Rm9udEZpbGVOYW1lKGZhbWlseU5hbWUsIGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBjcmVhdGUocnMsIHJlcywgZmlsZU5hbWUsIHNpemUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlMmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50Mi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDIgeworICAgIHB1YmxpYyBJbnQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9JbnQzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyNzUwOQotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIEludDMgeworICAgIHB1YmxpYyBJbnQzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBpbnQgeDsKKyAgICBwdWJsaWMgaW50IHk7CisgICAgcHVibGljIGludCB6OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvSW50NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmYzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ludDQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBJbnQ0IHsKKyAgICBwdWJsaWMgSW50NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHg7CisgICAgcHVibGljIGludCB5OworICAgIHB1YmxpYyBpbnQgejsKKyAgICBwdWJsaWMgaW50IHc7Cit9CisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xpZ2h0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjY1NmYuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9MaWdodC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgTGlnaHQgZXh0ZW5kcyBCYXNlT2JqIHsKLSAgICBMaWdodChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uTGlnaHRTZXRDb2xvcihtSUQsIHIsIGcsIGIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIG1SUy5uTGlnaHRTZXRQb3NpdGlvbihtSUQsIHgsIHksIHopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIGJvb2xlYW4gbUlzTW9ubzsKLSAgICAgICAgYm9vbGVhbiBtSXNMb2NhbDsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbUlzTW9ubyA9IGZhbHNlOwotICAgICAgICAgICAgbUlzTG9jYWwgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGxpZ2h0U2V0SXNNb25vKGJvb2xlYW4gaXNNb25vKSB7Ci0gICAgICAgICAgICBtSXNNb25vID0gaXNNb25vOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbGlnaHRTZXRJc0xvY2FsKGJvb2xlYW4gaXNMb2NhbCkgewotICAgICAgICAgICAgbUlzTG9jYWwgPSBpc0xvY2FsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBMaWdodCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgcnMublNhbXBsZXJCZWdpbigpOwotICAgICAgICAgICAgcnMubkxpZ2h0U2V0SXNNb25vKGIubUlzTW9ubyk7Ci0gICAgICAgICAgICBycy5uTGlnaHRTZXRJc0xvY2FsKGIubUlzTG9jYWwpOwotICAgICAgICAgICAgaW50IGlkID0gcnMubkxpZ2h0Q3JlYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0KGlkLCBycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlnaHQgY3JlYXRlKCkgewotICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmcyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTG9uZzIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBMb25nMiB7CisgICAgcHVibGljIExvbmcyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHg7CisgICAgcHVibGljIGxvbmcgeTsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDQ1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmczLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzMgeworICAgIHB1YmxpYyBMb25nMygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Mb25nNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDI3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0xvbmc0LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTG9uZzQgeworICAgIHB1YmxpYyBMb25nNCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyB4OworICAgIHB1YmxpYyBsb25nIHk7CisgICAgcHVibGljIGxvbmcgejsKKyAgICBwdWJsaWMgbG9uZyB3OworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgyZi5qYXZhCmluZGV4IDRiNWU2MWIuLjk5ZDIzZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4MmYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDJmLmphdmEKQEAgLTUxLDYgKzUxLDU3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobU1hdCwgMCwgc3JjLCAwLCA0KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBsb2FkUm90YXRlKGZsb2F0IHJvdCkgeworICAgICAgICBmbG9hdCBjLCBzOworICAgICAgICByb3QgKj0gKGZsb2F0KShqYXZhLmxhbmcuTWF0aC5QSSAvIDE4MC4wZik7CisgICAgICAgIGMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguY29zKHJvdCk7CisgICAgICAgIHMgPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc2luKHJvdCk7CisgICAgICAgIG1NYXRbMF0gPSBjOworICAgICAgICBtTWF0WzFdID0gLXM7CisgICAgICAgIG1NYXRbMl0gPSBzOworICAgICAgICBtTWF0WzNdID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbM10gPSB5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4MmYgbGhzLCBNYXRyaXgyZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8MiA7IGorKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHJoc19paiA9IHJocy5nZXQoaSxqKTsKKyAgICAgICAgICAgICAgICByaTAgKz0gbGhzLmdldChqLDApICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMSArPSBsaHMuZ2V0KGosMSkgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpcGx5KE1hdHJpeDJmIHJocykgeworICAgICAgICBNYXRyaXgyZiB0bXAgPSBuZXcgTWF0cml4MmYoKTsKKyAgICAgICAgdG1wLmxvYWRNdWx0aXBseSh0aGlzLCByaHMpOworICAgICAgICBsb2FkKHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkUm90YXRlKHJvdCk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgTWF0cml4MmYgdG1wID0gbmV3IE1hdHJpeDJmKCk7CisgICAgICAgIHRtcC5sb2FkU2NhbGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZmxvYXQgdGVtcCA9IG1NYXRbMV07CisgICAgICAgIG1NYXRbMV0gPSBtTWF0WzJdOworICAgICAgICBtTWF0WzJdID0gdGVtcDsKKyAgICB9CisKICAgICBmaW5hbCBmbG9hdFtdIG1NYXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4M2YuamF2YQppbmRleCAxOWQ3YjQzLi45NjFiYzVkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDNmLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXgzZi5qYXZhCkBAIC01Nyw2ICs1NywxMjQgQEAKICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtTWF0LCAwLCBzcmMsIDAsIDkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGxvYWRSb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIGZsb2F0IGMsIHM7CisgICAgICAgIHJvdCAqPSAoZmxvYXQpKGphdmEubGFuZy5NYXRoLlBJIC8gMTgwLjBmKTsKKyAgICAgICAgYyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5jb3Mocm90KTsKKyAgICAgICAgcyA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zaW4ocm90KTsKKworICAgICAgICBmbG9hdCBsZW4gPSAoZmxvYXQpamF2YS5sYW5nLk1hdGguc3FydCh4KnggKyB5KnkgKyB6KnopOworICAgICAgICBpZiAoIShsZW4gIT0gMSkpIHsKKyAgICAgICAgICAgIGZsb2F0IHJlY2lwTGVuID0gMS5mIC8gbGVuOworICAgICAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgICAgIHkgKj0gcmVjaXBMZW47CisgICAgICAgICAgICB6ICo9IHJlY2lwTGVuOworICAgICAgICB9CisgICAgICAgIGZsb2F0IG5jID0gMS4wZiAtIGM7CisgICAgICAgIGZsb2F0IHh5ID0geCAqIHk7CisgICAgICAgIGZsb2F0IHl6ID0geSAqIHo7CisgICAgICAgIGZsb2F0IHp4ID0geiAqIHg7CisgICAgICAgIGZsb2F0IHhzID0geCAqIHM7CisgICAgICAgIGZsb2F0IHlzID0geSAqIHM7CisgICAgICAgIGZsb2F0IHpzID0geiAqIHM7CisgICAgICAgIG1NYXRbMF0gPSB4KngqbmMgKyAgYzsKKyAgICAgICAgbU1hdFszXSA9ICB4eSpuYyAtIHpzOworICAgICAgICBtTWF0WzZdID0gIHp4Km5jICsgeXM7CisgICAgICAgIG1NYXRbMV0gPSAgeHkqbmMgKyB6czsKKyAgICAgICAgbU1hdFs0XSA9IHkqeSpuYyArICBjOworICAgICAgICBtTWF0WzldID0gIHl6Km5jIC0geHM7CisgICAgICAgIG1NYXRbMl0gPSAgengqbmMgLSB5czsKKyAgICAgICAgbU1hdFs2XSA9ICB5eipuYyArIHhzOworICAgICAgICBtTWF0WzhdID0geip6Km5jICsgIGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFJvdGF0ZShmbG9hdCByb3QpIHsKKyAgICAgICAgZmxvYXQgYywgczsKKyAgICAgICAgcm90ICo9IChmbG9hdCkoamF2YS5sYW5nLk1hdGguUEkgLyAxODAuMGYpOworICAgICAgICBjID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLmNvcyhyb3QpOworICAgICAgICBzID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNpbihyb3QpOworICAgICAgICBtTWF0WzBdID0gYzsKKyAgICAgICAgbU1hdFsxXSA9IC1zOworICAgICAgICBtTWF0WzNdID0gczsKKyAgICAgICAgbU1hdFs0XSA9IGM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZFNjYWxlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbMF0gPSB4OworICAgICAgICBtTWF0WzRdID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkU2NhbGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICAgICAgbU1hdFswXSA9IHg7CisgICAgICAgIG1NYXRbNF0gPSB5OworICAgICAgICBtTWF0WzhdID0gejsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgICAgIG1NYXRbNl0gPSB4OworICAgICAgICBtTWF0WzddID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkTXVsdGlwbHkoTWF0cml4M2YgbGhzLCBNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwzIDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByaTAgPSAwOworICAgICAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPDMgOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmbG9hdCByaHNfaWogPSByaHMuZ2V0KGksaik7CisgICAgICAgICAgICAgICAgcmkwICs9IGxocy5nZXQoaiwwKSAqIHJoc19pajsKKyAgICAgICAgICAgICAgICByaTEgKz0gbGhzLmdldChqLDEpICogcmhzX2lqOworICAgICAgICAgICAgICAgIHJpMiArPSBsaHMuZ2V0KGosMikgKiByaHNfaWo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXQoaSwwLCByaTApOworICAgICAgICAgICAgc2V0KGksMSwgcmkxKTsKKyAgICAgICAgICAgIHNldChpLDIsIHJpMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBseShNYXRyaXgzZiByaHMpIHsKKyAgICAgICAgTWF0cml4M2YgdG1wID0gbmV3IE1hdHJpeDNmKCk7CisgICAgICAgIHRtcC5sb2FkTXVsdGlwbHkodGhpcywgcmhzKTsKKyAgICAgICAgbG9hZCh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCByb3RhdGUoZmxvYXQgcm90KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFJvdGF0ZShyb3QpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHkpOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzY2FsZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDNmIHRtcCA9IG5ldyBNYXRyaXgzZigpOworICAgICAgICB0bXAubG9hZFNjYWxlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh0bXApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBNYXRyaXgzZiB0bXAgPSBuZXcgTWF0cml4M2YoKTsKKyAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSk7CisgICAgICAgIG11bHRpcGx5KHRtcCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCAzOyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjMgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqMyArIGpdID0gbU1hdFtqKjMgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqMyArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NYXRyaXg0Zi5qYXZhCmluZGV4IGViZDViZGUuLjVmZmMyMWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWF0cml4NGYuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L01hdHJpeDRmLmphdmEKQEAgLTE3OSw2ICsxNzksODUgQEAKICAgICAgICAgdG1wLmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7CiAgICAgICAgIG11bHRpcGx5KHRtcCk7CiAgICAgfQorICAgIHByaXZhdGUgZmxvYXQgY29tcHV0ZUNvZmFjdG9yKGludCBpLCBpbnQgaikgeworICAgICAgICBpbnQgYzAgPSAoaSsxKSAlIDQ7CisgICAgICAgIGludCBjMSA9IChpKzIpICUgNDsKKyAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICBpbnQgcjAgPSAoaisxKSAlIDQ7CisgICAgICAgIGludCByMSA9IChqKzIpICUgNDsKKyAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgIGZsb2F0IG1pbm9yID0gKG1NYXRbYzAgKyA0KnIwXSAqIChtTWF0W2MxICsgNCpyMV0gKiBtTWF0W2MyICsgNCpyMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWF0W2MxICsgNCpyMl0gKiBtTWF0W2MyICsgNCpyMV0pKQorICAgICAgICAgICAgICAgICAgICAgLSAobU1hdFtjMCArIDQqcjFdICogKG1NYXRbYzEgKyA0KnIwXSAqIG1NYXRbYzIgKyA0KnIyXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRbYzEgKyA0KnIyXSAqIG1NYXRbYzIgKyA0KnIwXSkpCisgICAgICAgICAgICAgICAgICAgICArIChtTWF0W2MwICsgNCpyMl0gKiAobU1hdFtjMSArIDQqcjBdICogbU1hdFtjMiArIDQqcjFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hdFtjMSArIDQqcjFdICogbU1hdFtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgZmxvYXQgY29mYWN0b3IgPSAoKGkraikgJiAxKSAhPSAwID8gLW1pbm9yIDogbWlub3I7CisgICAgICAgIHJldHVybiBjb2ZhY3RvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnZlcnNlKCkgeworCisgICAgICAgIE1hdHJpeDRmIHJlc3VsdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICAgICAgICAgIHJlc3VsdC5tTWF0WzQqaSArIGpdID0gY29tcHV0ZUNvZmFjdG9yKGksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG90IHByb2R1Y3Qgb2YgMHRoIGNvbHVtbiBvZiBzb3VyY2UgYW5kIDB0aCByb3cgb2YgcmVzdWx0CisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzFdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbMl0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFszXTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldCA9IDEuMGYgLyBkZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICAgICAgbU1hdFtpXSA9IHJlc3VsdC5tTWF0W2ldICogZGV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW52ZXJzZVRyYW5zcG9zZSgpIHsKKworICAgICAgICBNYXRyaXg0ZiByZXN1bHQgPSBuZXcgTWF0cml4NGYoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICByZXN1bHQubU1hdFs0KmogKyBpXSA9IGNvbXB1dGVDb2ZhY3RvcihpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGRldCA9IG1NYXRbMF0qcmVzdWx0Lm1NYXRbMF0gKyBtTWF0WzRdKnJlc3VsdC5tTWF0WzRdICsKKyAgICAgICAgICAgICAgICAgICAgIG1NYXRbOF0qcmVzdWx0Lm1NYXRbOF0gKyBtTWF0WzEyXSpyZXN1bHQubU1hdFsxMl07CisKKyAgICAgICAgaWYgKE1hdGguYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIG1NYXRbaV0gPSByZXN1bHQubU1hdFtpXSAqIGRldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRyYW5zcG9zZSgpIHsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgZm9yKGludCBqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gbU1hdFtpKjQgKyBqXTsKKyAgICAgICAgICAgICAgICBtTWF0W2kqNCArIGpdID0gbU1hdFtqKjQgKyBpXTsKKyAgICAgICAgICAgICAgICBtTWF0W2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIGZpbmFsIGZsb2F0W10gbU1hdDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9NZXNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0YzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvTWVzaC5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgTWVzaCBleHRlbmRzIEJhc2VPYmogeworCisgICAgQWxsb2NhdGlvbltdIG1WZXJ0ZXhCdWZmZXJzOworICAgIEFsbG9jYXRpb25bXSBtSW5kZXhCdWZmZXJzOworICAgIFByaW1pdGl2ZVtdIG1QcmltaXRpdmVzOworCisgICAgTWVzaChpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBzdXBlcihpZCwgcnMpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VmVydGV4QWxsb2NhdGlvbkNvdW50KCkgeworICAgICAgICBpZihtVmVydGV4QnVmZmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVZlcnRleEJ1ZmZlcnMubGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRWZXJ0ZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtVmVydGV4QnVmZmVyc1tzbG90XTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFByaW1pdGl2ZUNvdW50KCkgeworICAgICAgICBpZihtSW5kZXhCdWZmZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzLmxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0SW5kZXhBbGxvY2F0aW9uKGludCBzbG90KSB7CisgICAgICAgIHJldHVybiBtSW5kZXhCdWZmZXJzW3Nsb3RdOworICAgIH0KKyAgICBwdWJsaWMgUHJpbWl0aXZlIGdldFByaW1pdGl2ZShpbnQgc2xvdCkgeworICAgICAgICByZXR1cm4gbVByaW1pdGl2ZXNbc2xvdF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB1cGRhdGVGcm9tTmF0aXZlKCkgeworICAgICAgICBtTmFtZSA9IG1SUy5uR2V0TmFtZShtSUQpOworICAgICAgICBpbnQgdnR4Q291bnQgPSBtUlMubk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChtSUQpOworICAgICAgICBpbnQgaWR4Q291bnQgPSBtUlMubk1lc2hHZXRJbmRleENvdW50KG1JRCk7CisKKyAgICAgICAgaW50W10gdnR4SURzID0gbmV3IGludFt2dHhDb3VudF07CisgICAgICAgIGludFtdIGlkeElEcyA9IG5ldyBpbnRbaWR4Q291bnRdOworICAgICAgICBpbnRbXSBwcmltaXRpdmVzID0gbmV3IGludFtpZHhDb3VudF07CisKKyAgICAgICAgbVJTLm5NZXNoR2V0VmVydGljZXMobUlELCB2dHhJRHMsIHZ0eENvdW50KTsKKyAgICAgICAgbVJTLm5NZXNoR2V0SW5kaWNlcyhtSUQsIGlkeElEcywgcHJpbWl0aXZlcywgdnR4Q291bnQpOworCisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bdnR4Q291bnRdOworICAgICAgICBtSW5kZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25baWR4Q291bnRdOworICAgICAgICBtUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVbaWR4Q291bnRdOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB2dHhDb3VudDsgaSArKykgeworICAgICAgICAgICAgaWYodnR4SURzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKHZ0eElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tpXS51cGRhdGVGcm9tTmF0aXZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaWR4Q291bnQ7IGkgKyspIHsKKyAgICAgICAgICAgIGlmKGlkeElEc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyc1tpXSA9IG5ldyBBbGxvY2F0aW9uKGlkeElEc1tpXSwgbVJTKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXJzW2ldLnVwZGF0ZUZyb21OYXRpdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltaXRpdmVzW2ldID0gUHJpbWl0aXZlLnZhbHVlcygpW3ByaW1pdGl2ZXNbaV1dOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKKworICAgICAgICBjbGFzcyBFbnRyeSB7CisgICAgICAgICAgICBUeXBlIHQ7CisgICAgICAgICAgICBFbGVtZW50IGU7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIFByaW1pdGl2ZSBwcmltOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgIEVudHJ5W10gbVZlcnRleFR5cGVzOworICAgICAgICBWZWN0b3IgbUluZGV4VHlwZXM7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgICAgICBtUlMgPSByczsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQgPSAwOworICAgICAgICAgICAgbVZlcnRleFR5cGVzID0gbmV3IEVudHJ5WzE2XTsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKFR5cGUgdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobVZlcnRleFR5cGVDb3VudCA+PSBtVmVydGV4VHlwZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWF4IHZlcnRleCB0eXBlcyBleGNlZWRlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggPSBtVmVydGV4VHlwZUNvdW50OworICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0udCA9IHQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0uZSA9IG51bGw7CisgICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkVmVydGV4VHlwZShFbGVtZW50IGUsIGludCBzaXplKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gbnVsbDsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5lID0gZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoVHlwZSB0LCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUudCA9IHQ7CisgICAgICAgICAgICBpbmRleFR5cGUuZSA9IG51bGw7CisgICAgICAgICAgICBpbmRleFR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS50ID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5lID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5zaXplID0gMDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSwgUHJpbWl0aXZlIHApIHsKKyAgICAgICAgICAgIGludCBhZGRlZEluZGV4ICA9IG1JbmRleFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgIEVudHJ5IGluZGV4VHlwZSA9IG5ldyBFbnRyeSgpOworICAgICAgICAgICAgaW5kZXhUeXBlLnQgPSBudWxsOworICAgICAgICAgICAgaW5kZXhUeXBlLmUgPSBlOworICAgICAgICAgICAgaW5kZXhUeXBlLnNpemUgPSBzaXplOworICAgICAgICAgICAgaW5kZXhUeXBlLnByaW0gPSBwOworICAgICAgICAgICAgbUluZGV4VHlwZXMuYWRkRWxlbWVudChpbmRleFR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBUeXBlIG5ld1R5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgeworICAgICAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIGUpOworICAgICAgICAgICAgdGIuYWRkKERpbWVuc2lvbi5YLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0Yi5jcmVhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVzaCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKHJzLCBlbnRyeS50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFsbG9jSUQgPSAoYWxsb2MgPT0gbnVsbCkgPyAwIDogYWxsb2MuZ2V0SUQoKTsKKyAgICAgICAgICAgICAgICBycy5uTWVzaEJpbmRJbmRleChpZCwgYWxsb2NJRCwgZW50cnkucHJpbS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnNbY3RdID0gYWxsb2M7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tUHJpbWl0aXZlc1tjdF0gPSBlbnRyeS5wcmltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoaW50IGN0ID0gMDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiBhbGxvYyA9IG51bGw7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBiLm1WZXJ0ZXhUeXBlc1tjdF07CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIGVudHJ5LnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZihlbnRyeS5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBlbnRyeS5lLCBlbnRyeS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnMubk1lc2hCaW5kVmVydGV4KGlkLCBhbGxvYy5nZXRJRCgpLCBjdCk7CisgICAgICAgICAgICAgICAgbmV3TWVzaC5tVmVydGV4QnVmZmVyc1tjdF0gPSBhbGxvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ld01lc2g7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVzaCBjcmVhdGUoKSB7CisgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKKyAgICAgICAgICAgIE1lc2ggc20gPSBpbnRlcm5hbENyZWF0ZShtUlMsIHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbGxvY2F0aW9uQnVpbGRlciB7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICAgICAgY2xhc3MgRW50cnkgeworICAgICAgICAgICAgQWxsb2NhdGlvbiBhOworICAgICAgICAgICAgUHJpbWl0aXZlIHByaW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgbVZlcnRleFR5cGVDb3VudDsKKyAgICAgICAgRW50cnlbXSBtVmVydGV4VHlwZXM7CisKKyAgICAgICAgVmVjdG9yIG1JbmRleFR5cGVzOworCisgICAgICAgIHB1YmxpYyBBbGxvY2F0aW9uQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgICAgIG1SUyA9IHJzOworICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCA9IDA7CisgICAgICAgICAgICBtVmVydGV4VHlwZXMgPSBuZXcgRW50cnlbMTZdOworICAgICAgICAgICAgbUluZGV4VHlwZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7CisgICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS5hID0gYTsKKyAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhZGRJbmRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhLCBQcmltaXRpdmUgcCkgeworICAgICAgICAgICAgaW50IGFkZGVkSW5kZXggID0gbUluZGV4VHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgRW50cnkgaW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7CisgICAgICAgICAgICBpbmRleFR5cGUuYSA9IGE7CisgICAgICAgICAgICBpbmRleFR5cGUucHJpbSA9IHA7CisgICAgICAgICAgICBtSW5kZXhUeXBlcy5hZGRFbGVtZW50KGluZGV4VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gYWRkZWRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkSW5kZXhUeXBlKFByaW1pdGl2ZSBwKSB7CisgICAgICAgICAgICBpbnQgYWRkZWRJbmRleCAgPSBtSW5kZXhUeXBlcy5zaXplKCk7CisgICAgICAgICAgICBFbnRyeSBpbmRleFR5cGUgPSBuZXcgRW50cnkoKTsKKyAgICAgICAgICAgIGluZGV4VHlwZS5hID0gbnVsbDsKKyAgICAgICAgICAgIGluZGV4VHlwZS5wcmltID0gcDsKKyAgICAgICAgICAgIG1JbmRleFR5cGVzLmFkZEVsZW1lbnQoaW5kZXhUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN5bmNocm9uaXplZCBNZXNoIGludGVybmFsQ3JlYXRlKFJlbmRlclNjcmlwdCBycywgQWxsb2NhdGlvbkJ1aWxkZXIgYikgeworCisgICAgICAgICAgICBpbnQgaWQgPSBycy5uTWVzaENyZWF0ZShiLm1WZXJ0ZXhUeXBlQ291bnQsIGIubUluZGV4VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIE1lc2ggbmV3TWVzaCA9IG5ldyBNZXNoKGlkLCBycyk7CisgICAgICAgICAgICBuZXdNZXNoLm1JbmRleEJ1ZmZlcnMgPSBuZXcgQWxsb2NhdGlvbltiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1QcmltaXRpdmVzID0gbmV3IFByaW1pdGl2ZVtiLm1JbmRleFR5cGVzLnNpemUoKV07CisgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzID0gbmV3IEFsbG9jYXRpb25bYi5tVmVydGV4VHlwZUNvdW50XTsKKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tSW5kZXhUeXBlcy5zaXplKCk7IGN0ICsrKSB7CisgICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpYi5tSW5kZXhUeXBlcy5lbGVtZW50QXQoY3QpOworICAgICAgICAgICAgICAgIGludCBhbGxvY0lEID0gKGVudHJ5LmEgPT0gbnVsbCkgPyAwIDogZW50cnkuYS5nZXRJRCgpOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZEluZGV4KGlkLCBhbGxvY0lELCBlbnRyeS5wcmltLm1JRCwgY3QpOworICAgICAgICAgICAgICAgIG5ld01lc2gubUluZGV4QnVmZmVyc1tjdF0gPSBlbnRyeS5hOworICAgICAgICAgICAgICAgIG5ld01lc2gubVByaW1pdGl2ZXNbY3RdID0gZW50cnkucHJpbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBjdCA9IDA7IGN0IDwgYi5tVmVydGV4VHlwZUNvdW50OyBjdCArKykgeworICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gYi5tVmVydGV4VHlwZXNbY3RdOworICAgICAgICAgICAgICAgIHJzLm5NZXNoQmluZFZlcnRleChpZCwgZW50cnkuYS5tSUQsIGN0KTsKKyAgICAgICAgICAgICAgICBuZXdNZXNoLm1WZXJ0ZXhCdWZmZXJzW2N0XSA9IGVudHJ5LmE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXdNZXNoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lc2ggY3JlYXRlKCkgeworICAgICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBNZXNoIHNtID0gaW50ZXJuYWxDcmVhdGUobVJTLCB0aGlzKTsKKyAgICAgICAgICAgIHJldHVybiBzbTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmlhbmdsZU1lc2hCdWlsZGVyIHsKKyAgICAgICAgZmxvYXQgbVZ0eERhdGFbXTsKKyAgICAgICAgaW50IG1WdHhDb3VudDsKKyAgICAgICAgc2hvcnQgbUluZGV4RGF0YVtdOworICAgICAgICBpbnQgbUluZGV4Q291bnQ7CisgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7CisgICAgICAgIEVsZW1lbnQgbUVsZW1lbnQ7CisKKyAgICAgICAgZmxvYXQgbU5YID0gMDsKKyAgICAgICAgZmxvYXQgbU5ZID0gMDsKKyAgICAgICAgZmxvYXQgbU5aID0gLTE7CisgICAgICAgIGZsb2F0IG1TMCA9IDA7CisgICAgICAgIGZsb2F0IG1UMCA9IDA7CisgICAgICAgIGZsb2F0IG1SID0gMTsKKyAgICAgICAgZmxvYXQgbUcgPSAxOworICAgICAgICBmbG9hdCBtQiA9IDE7CisgICAgICAgIGZsb2F0IG1BID0gMTsKKworICAgICAgICBpbnQgbVZ0eFNpemU7CisgICAgICAgIGludCBtRmxhZ3M7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1IgPSAweDAwMDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDB4MDAwMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVFVSRV8wID0gMHgwMTAwOworCisgICAgICAgIHB1YmxpYyBUcmlhbmdsZU1lc2hCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgaW50IHZ0eFNpemUsIGludCBmbGFncykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtVnR4Q291bnQgPSAwOworICAgICAgICAgICAgbUluZGV4Q291bnQgPSAwOworICAgICAgICAgICAgbVZ0eERhdGEgPSBuZXcgZmxvYXRbMTI4XTsKKyAgICAgICAgICAgIG1JbmRleERhdGEgPSBuZXcgc2hvcnRbMTI4XTsKKyAgICAgICAgICAgIG1WdHhTaXplID0gdnR4U2l6ZTsKKyAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOworCisgICAgICAgICAgICBpZiAodnR4U2l6ZSA8IDIgfHwgdnR4U2l6ZSA+IDMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWZXJ0ZXggc2l6ZSBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbWFrZVNwYWNlKGludCBjb3VudCkgeworICAgICAgICAgICAgaWYgKChtVnR4Q291bnQgKyBjb3VudCkgPj0gbVZ0eERhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgdFtdID0gbmV3IGZsb2F0W21WdHhEYXRhLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobVZ0eERhdGEsIDAsIHQsIDAsIG1WdHhEYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbVZ0eERhdGEgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxhdGNoKCkgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBDT0xPUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSg0KTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtRzsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQjsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1TMDsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtVDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgzKTsKKyAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlg7CisgICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5ZOworICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFrZVNwYWNlKDIpOworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgICAgIGlmIChtVnR4U2l6ZSAhPSAzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYWtlU3BhY2UoMyk7CisgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB4OworICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geTsKKyAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHo7CisgICAgICAgICAgICBsYXRjaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHVyZShmbG9hdCBzLCBmbG9hdCB0KSB7CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVMwID0gczsKKyAgICAgICAgICAgIG1UMCA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWwoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OWCA9IHg7CisgICAgICAgICAgICBtTlkgPSB5OworICAgICAgICAgICAgbU5aID0gejsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SID0gcjsKKyAgICAgICAgICAgIG1HID0gZzsKKyAgICAgICAgICAgIG1CID0gYjsKKyAgICAgICAgICAgIG1BID0gYTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRyaWFuZ2xlKGludCBpZHgxLCBpbnQgaWR4MiwgaW50IGlkeDMpIHsKKyAgICAgICAgICAgIGlmKChpZHgxID49IG1WdHhDb3VudCkgfHwgKGlkeDEgPCAwKSB8fAorICAgICAgICAgICAgICAgKGlkeDIgPj0gbVZ0eENvdW50KSB8fCAoaWR4MiA8IDApIHx8CisgICAgICAgICAgICAgICAoaWR4MyA+PSBtVnR4Q291bnQpIHx8IChpZHgzIDwgMCkpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluZGV4IHByb3ZpZGVkIGdyZWF0ZXIgdGhhbiB2ZXJ0ZXggY291bnQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1JbmRleENvdW50ICsgMykgPj0gbUluZGV4RGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzaG9ydCB0W10gPSBuZXcgc2hvcnRbbUluZGV4RGF0YS5sZW5ndGggKiAyXTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1JbmRleERhdGEsIDAsIHQsIDAsIG1JbmRleERhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtSW5kZXhEYXRhID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MTsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MjsKKyAgICAgICAgICAgIG1JbmRleERhdGFbbUluZGV4Q291bnQrK10gPSAoc2hvcnQpaWR4MzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXNoIGNyZWF0ZShib29sZWFuIHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgICAgIGludCBmbG9hdENvdW50ID0gbVZ0eFNpemU7CisgICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZ0eFNpemUpLCAicG9zaXRpb24iKTsKKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5GMzJfNChtUlMpLCAiY29sb3IiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobUZsYWdzICYgVEVYVFVSRV8wKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSAyOworICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuRjMyXzIobVJTKSwgInRleHR1cmUwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1GbGFncyAmIE5PUk1BTCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0Q291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICBiLmFkZChFbGVtZW50LkYzMl8zKG1SUyksICJub3JtYWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOworICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOworICAgICAgICAgICAgc21iLmFkZEluZGV4VHlwZShFbGVtZW50LlUxNihtUlMpLCBtSW5kZXhDb3VudCwgUHJpbWl0aXZlLlRSSUFOR0xFKTsKKworICAgICAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS5kYXRhKG1WdHhEYXRhKTsKKyAgICAgICAgICAgIGlmKHVwbG9hZFRvQnVmZmVyT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgc20uZ2V0VmVydGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzbS5nZXRJbmRleEFsbG9jYXRpb24oMCkuZGF0YShtSW5kZXhEYXRhKTsKKyAgICAgICAgICAgIHNtLmdldEluZGV4QWxsb2NhdGlvbigwKS51cGxvYWRUb0J1ZmZlck9iamVjdCgpOworCisgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKaW5kZXggMTYxNGVjNS4uYzZlZDcyYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtLmphdmEKQEAgLTE3LDYgKzE3LDExIEBACiBwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwogCiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC0zOCw4ICs0Myw3IEBACiAgICAgU3RyaW5nIG1TaGFkZXI7CiAKICAgICBQcm9ncmFtKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYmluZENvbnN0YW50cyhBbGxvY2F0aW9uIGEsIGludCBzbG90KSB7CkBAIC05MSw4ICs5NSw0NyBAQAogICAgICAgICAgICAgbVRleHR1cmVDb3VudCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRTaGFkZXIoU3RyaW5nIHMpIHsKICAgICAgICAgICAgIG1TaGFkZXIgPSBzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmFzZVByb2dyYW1CdWlsZGVyIHNldFNoYWRlcihSZXNvdXJjZXMgcmVzb3VyY2VzLCBpbnQgcmVzb3VyY2VJRCkgeworICAgICAgICAgICAgYnl0ZVtdIHN0cjsKKyAgICAgICAgICAgIGludCBzdHJMZW5ndGg7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHJlc291cmNlcy5vcGVuUmF3UmVzb3VyY2UocmVzb3VyY2VJRCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgICAgICBzdHJMZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gc3RyLmxlbmd0aCAtIHN0ckxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbc3RyLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3RyLCAwLCBidWYyLCAwLCBzdHIubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBidWYyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHN0ci5sZW5ndGggLSBzdHJMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChzdHIsIHN0ckxlbmd0aCwgYnl0ZXNMZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TaGFkZXIgPSBuZXcgU3RyaW5nKHN0ciwgMCwgc3RyTGVuZ3RoLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJSZW5kZXJzY3JpcHQgc2hhZGVyIGNyZWF0aW9uIiwgIkNvdWxkIG5vdCBkZWNvZGUgc2hhZGVyIHN0cmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KEVsZW1lbnQgZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CkBAIC0xMjAsMTIgKzE2MywxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1Db25zdGFudENvdW50Kys7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlQ291bnQoaW50IGNvdW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIEJhc2VQcm9ncmFtQnVpbGRlciBzZXRUZXh0dXJlQ291bnQoaW50IGNvdW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIFNob3VsZCBjaGVjayBmb3IgY29uc2lzdGFudCBhbmQgbm9uLWNvbmZsaWN0aW5nIG5hbWVzLi4uCiAgICAgICAgICAgICBpZihjb3VudCA+PSBNQVhfQ09OU1RBTlQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYXggdGV4dHVyZSBjb3VudCBleGNlZWRlZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1UZXh0dXJlQ291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb2dyYW0oUHJvZ3JhbSBwKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtRnJhZ21lbnQuamF2YQppbmRleCA1ZTA0ZjBjLi4wNDA5MWEzIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1GcmFnbWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbUZyYWdtZW50LmphdmEKQEAgLTY2LDYgKzY2LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1RFWFRVUkUgPSAyOwogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwogICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICAgICAgYm9vbGVhbiBtVmFyeWluZ0NvbG9yRW5hYmxlOwogCiAgICAgICAgIHB1YmxpYyBlbnVtIEVudk1vZGUgewogICAgICAgICAgICAgUkVQTEFDRSAoMSksCkBAIC0xMDYsMjEgKzEwNywyOCBAQAogICAgICAgICAgICAgbVBvaW50U3ByaXRlRW5hYmxlID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlKEVudk1vZGUgZW52LCBGb3JtYXQgZm10LCBpbnQgc2xvdCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0VGV4dHVyZShFbnZNb2RlIGVudiwgRm9ybWF0IGZtdCwgaW50IHNsb3QpCiAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmKChzbG90IDwgMCkgfHwgKHNsb3QgPj0gTUFYX1RFWFRVUkUpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTUFYX1RFWFRVUkUgZXhjZWVkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU2xvdHNbc2xvdF0gPSBuZXcgU2xvdChlbnYsIGZtdCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U3ByaXRlVGV4Q29vcmRpbmF0ZVJlcGxhY2VtZW50KGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtUG9pbnRTcHJpdGVFbmFibGUgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZhcnlpbmdDb2xvcihib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbVZhcnlpbmdDb2xvckVuYWJsZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFByb2dyYW1GcmFnbWVudCBjcmVhdGUoKSB7CiAgICAgICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGludFtdIHRtcCA9IG5ldyBpbnRbTUFYX1RFWFRVUkUgKiAyICsgMV07CisgICAgICAgICAgICBpbnRbXSB0bXAgPSBuZXcgaW50W01BWF9URVhUVVJFICogMiArIDJdOwogICAgICAgICAgICAgaWYgKG1TbG90c1swXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdG1wWzBdID0gbVNsb3RzWzBdLmVudi5tSUQ7CiAgICAgICAgICAgICAgICAgdG1wWzFdID0gbVNsb3RzWzBdLmZvcm1hdC5tSUQ7CkBAIC0xMzAsNiArMTM4LDcgQEAKICAgICAgICAgICAgICAgICB0bXBbM10gPSBtU2xvdHNbMV0uZm9ybWF0Lm1JRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcFs0XSA9IG1Qb2ludFNwcml0ZUVuYWJsZSA/IDEgOiAwOworICAgICAgICAgICAgdG1wWzVdID0gbVZhcnlpbmdDb2xvckVuYWJsZSA/IDEgOiAwOwogICAgICAgICAgICAgaW50IGlkID0gbVJTLm5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUodG1wKTsKICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQoaWQsIG1SUyk7CiAgICAgICAgICAgICBwZi5tVGV4dHVyZUNvdW50ID0gTUFYX1RFWFRVUkU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1SYXN0ZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCmluZGV4IDU2ZjliZjQuLjc5MWRhYzggMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVJhc3Rlci5qYXZhCkBAIC0yNiw3NiArMjYsMTEzIEBACiAgKgogICoqLwogcHVibGljIGNsYXNzIFByb2dyYW1SYXN0ZXIgZXh0ZW5kcyBCYXNlT2JqIHsKKworICAgIHB1YmxpYyBlbnVtIEN1bGxNb2RlIHsKKyAgICAgICAgQkFDSyAoMCksCisgICAgICAgIEZST05UICgxKSwKKyAgICAgICAgTk9ORSAoMik7CisKKyAgICAgICAgaW50IG1JRDsKKyAgICAgICAgQ3VsbE1vZGUoaW50IGlkKSB7CisgICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGJvb2xlYW4gbVBvaW50U21vb3RoOwogICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CiAgICAgYm9vbGVhbiBtUG9pbnRTcHJpdGU7Ci0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotICAgIEVsZW1lbnQgbUluOwotICAgIEVsZW1lbnQgbU91dDsKKyAgICBDdWxsTW9kZSBtQ3VsbE1vZGU7CiAKICAgICBQcm9ncmFtUmFzdGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgIHN1cGVyKHJzKTsKLSAgICAgICAgbUlEID0gaWQ7CisgICAgICAgIHN1cGVyKGlkLCBycyk7CiAKLSAgICAgICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgICAgIG1MaW5lV2lkdGggPSAxLjBmOwogICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbUxpbmVTbW9vdGggPSBmYWxzZTsKICAgICAgICAgbVBvaW50U3ByaXRlID0gZmFsc2U7CisKKyAgICAgICAgbUN1bGxNb2RlID0gQ3VsbE1vZGUuQkFDSzsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoZmxvYXQgdykgeworICAgIHZvaWQgc2V0TGluZVdpZHRoKGZsb2F0IHcpIHsKICAgICAgICAgbVJTLnZhbGlkYXRlKCk7CiAgICAgICAgIG1MaW5lV2lkdGggPSB3OwogICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgobUlELCB3KTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNpemUoZmxvYXQgcykgeworICAgIHZvaWQgc2V0Q3VsbE1vZGUoQ3VsbE1vZGUgbSkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVBvaW50U2l6ZSA9IHM7Ci0gICAgICAgIG1SUy5uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShtSUQsIHMpOworICAgICAgICBtQ3VsbE1vZGUgPSBtOworICAgICAgICBtUlMublByb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShtSUQsIG0ubUlEKTsKICAgICB9CiAKLSAgICB2b2lkIGludGVybmFsSW5pdCgpIHsKLSAgICAgICAgaW50IGluSUQgPSAwOwotICAgICAgICBpbnQgb3V0SUQgPSAwOwotICAgICAgICBpZiAobUluICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluSUQgPSBtSW4ubUlEOworICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVJhc3RlciBDVUxMX0JBQ0soUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtUmFzdGVyLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRDdWxsTW9kZShDdWxsTW9kZS5CQUNLKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSyA9IGJ1aWxkZXIuY3JlYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0SUQgPSBtT3V0Lm1JRDsKLSAgICAgICAgfQotICAgICAgICBtSUQgPSBtUlMublByb2dyYW1SYXN0ZXJDcmVhdGUoaW5JRCwgb3V0SUQsIG1Qb2ludFNtb290aCwgbUxpbmVTbW9vdGgsIG1Qb2ludFNwcml0ZSk7CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVJhc3Rlcl9DVUxMX0JBQ0s7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfRlJPTlQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVJhc3Rlci5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q3VsbE1vZGUoQ3VsbE1vZGUuRlJPTlQpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9GUk9OVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtUmFzdGVyIENVTExfTk9ORShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1SYXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1SYXN0ZXIuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEN1bGxNb2RlKEN1bGxNb2RlLk5PTkUpOworICAgICAgICAgICAgcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1SYXN0ZXJfQ1VMTF9OT05FOworICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIFByb2dyYW1SYXN0ZXIgbVBSOworICAgICAgICBib29sZWFuIG1Qb2ludFNwcml0ZTsKKyAgICAgICAgYm9vbGVhbiBtUG9pbnRTbW9vdGg7CisgICAgICAgIGJvb2xlYW4gbUxpbmVTbW9vdGg7CisgICAgICAgIEN1bGxNb2RlIG1DdWxsTW9kZTsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIEVsZW1lbnQgaW4sIEVsZW1lbnQgb3V0KSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtUFIgPSBuZXcgUHJvZ3JhbVJhc3RlcigwLCBycyk7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBmYWxzZTsKKyAgICAgICAgICAgIG1MaW5lU21vb3RoID0gZmFsc2U7CisgICAgICAgICAgICBtUG9pbnRTcHJpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IEN1bGxNb2RlLkJBQ0s7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb2ludFNwcml0ZUVuYWJsZShib29sZWFuIGVuYWJsZSkgewotICAgICAgICAgICAgbVBSLm1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UG9pbnRTcHJpdGVFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Qb2ludFNwcml0ZSA9IGVuYWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UG9pbnRTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBvaW50U21vb3RoRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICBtUG9pbnRTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldExpbmVTbW9vdGhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgICAgIG1QUi5tTGluZVNtb290aCA9IGVuYWJsZTsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TGluZVNtb290aEVuYWJsZShib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgbUxpbmVTbW9vdGggPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEN1bGxNb2RlKEN1bGxNb2RlIG0pIHsKKyAgICAgICAgICAgIG1DdWxsTW9kZSA9IG07CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgUHJvZ3JhbVJhc3RlciBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewotICAgICAgICAgICAgYi5tUFIuaW50ZXJuYWxJbml0KCk7Ci0gICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gYi5tUFI7Ci0gICAgICAgICAgICBiLm1QUiA9IG5ldyBQcm9ncmFtUmFzdGVyKDAsIGIubVJTKTsKKyAgICAgICAgICAgIGludCBpZCA9IHJzLm5Qcm9ncmFtUmFzdGVyQ3JlYXRlKGIubVBvaW50U21vb3RoLCBiLm1MaW5lU21vb3RoLCBiLm1Qb2ludFNwcml0ZSk7CisgICAgICAgICAgICBQcm9ncmFtUmFzdGVyIHByID0gbmV3IFByb2dyYW1SYXN0ZXIoaWQsIHJzKTsKKyAgICAgICAgICAgIHByLnNldEN1bGxNb2RlKGIubUN1bGxNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBwcjsKICAgICAgICAgfQogCkBAIC0xMTEsMyArMTQ4LDQgQEAKIAogCiAKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVN0b3JlLmphdmEKaW5kZXggNjliZTI0NS4uMzJjMGQwMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtU3RvcmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Byb2dyYW1TdG9yZS5qYXZhCkBAIC03NiwxMSArNzYsMTQzIEBACiAKIAogICAgIFByb2dyYW1TdG9yZShpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9OT05FX0RFUFRIX05PX0RFUFRIKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEggPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9OT05FX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19XUklURSA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuWkVSTyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEUgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5MRVNTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5TUkNfQUxQSEEsIEJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fREVQVEggPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BTFBIQV9ERVBUSF9OT19URVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fVEVTVDsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwgQmxlbmREc3RGdW5jLk9ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2soZmFsc2UpOworICAgICAgICAgICAgcnMubVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19XUklURSA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfTk9fV1JJVEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQcm9ncmFtU3RvcmUgQkxFTkRfQUREX0RFUFRIX1RFU1QoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayh0cnVlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX1RFU1QgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fREVQVEgoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIID09IG51bGwpIHsKKyAgICAgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIocnMpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLk9ORSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIOworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFByb2dyYW1TdG9yZSBCTEVORF9BRERfREVQVEhfTk9fVEVTVChSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2dyYW1TdG9yZS5CdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuQUxXQVlTKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0QmxlbmRGdW5jKEJsZW5kU3JjRnVuYy5PTkUsIEJsZW5kRHN0RnVuYy5PTkUpOworICAgICAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgYnVpbGRlci5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgICAgICBycy5tUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSCA9IGJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1RFU1Q7CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgUHJvZ3JhbVN0b3JlIEJMRU5EX0FERF9ERVBUSF9OT19XUklURShSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEUgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihycyk7CisgICAgICAgICAgICBidWlsZGVyLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkFMV0FZUyk7CisgICAgICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuT05FLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGVwdGhNYXNrKGZhbHNlKTsKKyAgICAgICAgICAgIHJzLm1Qcm9ncmFtU3RvcmVfQkxFTkRfQUREX0RFUFRIX05PX1dSSVRFID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKICAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKQEAgLTExMCwzMiArMjQyLDQ5IEBACiAgICAgICAgICAgICBtQ29sb3JNYXNrQSA9IHRydWU7CiAgICAgICAgICAgICBtQmxlbmRTcmMgPSBCbGVuZFNyY0Z1bmMuT05FOwogICAgICAgICAgICAgbUJsZW5kRHN0ID0gQmxlbmREc3RGdW5jLlpFUk87Ci0KLQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwdGhGdW5jKERlcHRoRnVuYyBmdW5jKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgICAgICBtSW4gPSBudWxsOworICAgICAgICAgICAgbU91dCA9IG51bGw7CisgICAgICAgICAgICBtRGVwdGhGdW5jID0gRGVwdGhGdW5jLkFMV0FZUzsKKyAgICAgICAgICAgIG1EZXB0aE1hc2sgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tSID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tHID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tCID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2xvck1hc2tBID0gdHJ1ZTsKKyAgICAgICAgICAgIG1CbGVuZFNyYyA9IEJsZW5kU3JjRnVuYy5PTkU7CisgICAgICAgICAgICBtQmxlbmREc3QgPSBCbGVuZERzdEZ1bmMuWkVSTzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlcHRoRnVuYyhEZXB0aEZ1bmMgZnVuYykgewogICAgICAgICAgICAgbURlcHRoRnVuYyA9IGZ1bmM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlcHRoTWFzayhib29sZWFuIGVuYWJsZSkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1EZXB0aE1hc2sgPSBlbmFibGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29sb3JNYXNrKGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSkgewogICAgICAgICAgICAgbUNvbG9yTWFza1IgPSByOwogICAgICAgICAgICAgbUNvbG9yTWFza0cgPSBnOwogICAgICAgICAgICAgbUNvbG9yTWFza0IgPSBiOwogICAgICAgICAgICAgbUNvbG9yTWFza0EgPSBhOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jIHNyYywgQmxlbmREc3RGdW5jIGRzdCkgeworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jIHNyYywgQmxlbmREc3RGdW5jIGRzdCkgewogICAgICAgICAgICAgbUJsZW5kU3JjID0gc3JjOwogICAgICAgICAgICAgbUJsZW5kRHN0ID0gZHN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGl0aGVyRW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgICAgICAgICBtRGl0aGVyID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFByb2dyYW1TdG9yZSBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIEJ1aWxkZXIgYikgewpAQCAtMTQ3LDE3ICsyOTYsMTcgQEAKICAgICAgICAgICAgIGlmIChiLm1PdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG91dElEID0gYi5tT3V0Lm1JRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKGluSUQsIG91dElEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhiLm1EZXB0aEZ1bmMubUlEKTsKLSAgICAgICAgICAgIHJzLm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhiLm1EZXB0aE1hc2spOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKGIubUNvbG9yTWFza1IsCisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQmVnaW4oaW5JRCwgb3V0SUQpOworICAgICAgICAgICAgcnMublByb2dyYW1TdG9yZURlcHRoRnVuYyhiLm1EZXB0aEZ1bmMubUlEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2soYi5tRGVwdGhNYXNrKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVDb2xvck1hc2soYi5tQ29sb3JNYXNrUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm1Db2xvck1hc2tHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubUNvbG9yTWFza0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tQ29sb3JNYXNrQSk7Ci0gICAgICAgICAgICBycy5uUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoYi5tQmxlbmRTcmMubUlELCBiLm1CbGVuZERzdC5tSUQpOwotICAgICAgICAgICAgcnMublByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGIubURpdGhlcik7CisgICAgICAgICAgICBycy5uUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGIubUJsZW5kU3JjLm1JRCwgYi5tQmxlbmREc3QubUlEKTsKKyAgICAgICAgICAgIHJzLm5Qcm9ncmFtU3RvcmVEaXRoZXIoYi5tRGl0aGVyKTsKIAotICAgICAgICAgICAgaW50IGlkID0gcnMublByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlKCk7CisgICAgICAgICAgICBpbnQgaWQgPSBycy5uUHJvZ3JhbVN0b3JlQ3JlYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFByb2dyYW1TdG9yZShpZCwgcnMpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUHJvZ3JhbVZlcnRleC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKaW5kZXggMWIxNTVkNy4uYjA3MjQzMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9Qcm9ncmFtVmVydGV4LmphdmEKQEAgLTQ2LDkgKzQ2LDEzIEBACiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycywgRWxlbWVudCBpbiwgRWxlbWVudCBvdXQpIHsKICAgICAgICAgICAgIG1SUyA9IHJzOwogICAgICAgICB9CisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICAgICAgbVJTID0gcnM7CisgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0dXJlTWF0cml4RW5hYmxlKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRleHR1cmVNYXRyaXhFbmFibGUoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgICAgIG1UZXh0dXJlTWF0cml4RW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgUHJvZ3JhbVZlcnRleCBjcmVhdGUoKSB7CkBAIC0xMDMsMTQgKzEwNywxMCBAQAogICAgICAgICBwdWJsaWMgQWxsb2NhdGlvbiBtQWxsb2M7CiAKICAgICAgICAgcHVibGljIE1hdHJpeEFsbG9jYXRpb24oUmVuZGVyU2NyaXB0IHJzKSB7Ci0gICAgICAgICAgICBtTW9kZWwgPSBuZXcgTWF0cml4NGYoKTsKLSAgICAgICAgICAgIG1Qcm9qZWN0aW9uID0gbmV3IE1hdHJpeDRmKCk7Ci0gICAgICAgICAgICBtVGV4dHVyZSA9IG5ldyBNYXRyaXg0ZigpOwotCiAgICAgICAgICAgICBtQWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKHJzLCBFbGVtZW50LmNyZWF0ZVVzZXIocnMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLCA0OCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKE1PREVMVklFV19PRkZTRVQsIDE2LCBtTW9kZWwubU1hdCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFBST0pFQ1RJT05fT0ZGU0VULCAxNiwgbVByb2plY3Rpb24ubU1hdCk7Ci0gICAgICAgICAgICBtQWxsb2Muc3ViRGF0YTFEKFRFWFRVUkVfT0ZGU0VULCAxNiwgbVRleHR1cmUubU1hdCk7CisgICAgICAgICAgICBsb2FkTW9kZWx2aWV3KG5ldyBNYXRyaXg0ZigpKTsKKyAgICAgICAgICAgIGxvYWRQcm9qZWN0aW9uKG5ldyBNYXRyaXg0ZigpKTsKKyAgICAgICAgICAgIGxvYWRUZXh0dXJlKG5ldyBNYXRyaXg0ZigpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQppbmRleCBhOTM1MjQzLi4xZjNlMTU5IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKQEAgLTU3LDE1MSArNTcsNDY2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBOb24tdGhyZWFkc2FmZSBmdW5jdGlvbnMuCiAgICAgbmF0aXZlIHZvaWQgbkluaXRFbGVtZW50cyhpbnQgYTgsIGludCByZ2JhNDQ0NCwgaW50IHJnYmE4ODg4LCBpbnQgcmdiNTY1KTsKLQogICAgIG5hdGl2ZSBpbnQgIG5EZXZpY2VDcmVhdGUoKTsKICAgICBuYXRpdmUgdm9pZCBuRGV2aWNlRGVzdHJveShpbnQgZGV2KTsKICAgICBuYXRpdmUgdm9pZCBuRGV2aWNlU2V0Q29uZmlnKGludCBkZXYsIGludCBwYXJhbSwgaW50IHZhbHVlKTsKLSAgICBuYXRpdmUgaW50ICBuQ29udGV4dENyZWF0ZUdMKGludCBkZXYsIGludCB2ZXIsIGJvb2xlYW4gdXNlRGVwdGgpOwotICAgIG5hdGl2ZSBpbnQgIG5Db250ZXh0Q3JlYXRlKGludCBkZXYsIGludCB2ZXIpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RGVzdHJveShpbnQgY29uKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dFNldFN1cmZhY2UoaW50IHcsIGludCBoLCBTdXJmYWNlIHN1cik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRTZXRQcmlvcml0eShpbnQgcCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHREdW1wKGludCBiaXRzKTsKLQotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFJvb3RTY3JpcHQoaW50IHNjcmlwdCk7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRCaW5kU2FtcGxlcihpbnQgc2FtcGxlciwgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKGludCBwZnMpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChpbnQgcGYpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IHBmKTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBwcik7Ci0gICAgbmF0aXZlIHZvaWQgbkNvbnRleHRQYXVzZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0UmVzdW1lKCk7Ci0gICAgbmF0aXZlIGludCBuQ29udGV4dEdldE1lc3NhZ2UoaW50W10gZGF0YSwgYm9vbGVhbiB3YWl0KTsKLSAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudCgpOwotICAgIG5hdGl2ZSB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoKTsKLQotICAgIG5hdGl2ZSB2b2lkIG5Bc3NpZ25OYW1lKGludCBvYmosIGJ5dGVbXSBuYW1lKTsKLSAgICBuYXRpdmUgdm9pZCBuT2JqRGVzdHJveShpbnQgaWQpOwotICAgIG5hdGl2ZSB2b2lkIG5PYmpEZXN0cm95T09CKGludCBpZCk7Ci0gICAgbmF0aXZlIGludCAgbkZpbGVPcGVuKGJ5dGVbXSBuYW1lKTsKKyAgICBuYXRpdmUgaW50ICBuQ29udGV4dEdldE1lc3NhZ2UoaW50IGNvbiwgaW50W10gZGF0YSwgYm9vbGVhbiB3YWl0KTsKKyAgICBuYXRpdmUgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChpbnQgY29uKTsKKyAgICBuYXRpdmUgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KGludCBjb24pOwogCiAKLSAgICBuYXRpdmUgaW50ICBuRWxlbWVudENyZWF0ZShpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpOwotICAgIG5hdGl2ZSBpbnQgIG5FbGVtZW50Q3JlYXRlMihpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMpOworICAgIC8vIE1ldGhvZHMgYmVsb3cgYXJlIHdyYXBwZWQgdG8gcHJvdGVjdCB0aGUgbm9uLXRocmVhZHNhZmUKKyAgICAvLyBsb2NrbGVzcyBmaWZvLgorICAgIG5hdGl2ZSBpbnQgIHJzbkNvbnRleHRDcmVhdGVHTChpbnQgZGV2LCBpbnQgdmVyLCBib29sZWFuIHVzZURlcHRoKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Db250ZXh0Q3JlYXRlR0woaW50IGRldiwgaW50IHZlciwgYm9vbGVhbiB1c2VEZXB0aCkgeworICAgICAgICByZXR1cm4gcnNuQ29udGV4dENyZWF0ZUdMKGRldiwgdmVyLCB1c2VEZXB0aCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkNvbnRleHRDcmVhdGUoaW50IGRldiwgaW50IHZlcik7CisgICAgc3luY2hyb25pemVkIGludCBuQ29udGV4dENyZWF0ZShpbnQgZGV2LCBpbnQgdmVyKSB7CisgICAgICAgIHJldHVybiByc25Db250ZXh0Q3JlYXRlKGRldiwgdmVyKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dERlc3Ryb3koaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHREZXN0cm95KCkgeworICAgICAgICByc25Db250ZXh0RGVzdHJveShtQ29udGV4dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRTZXRTdXJmYWNlKGludCBjb24sIGludCB3LCBpbnQgaCwgU3VyZmFjZSBzdXIpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0U2V0U3VyZmFjZShpbnQgdywgaW50IGgsIFN1cmZhY2Ugc3VyKSB7CisgICAgICAgIHJzbkNvbnRleHRTZXRTdXJmYWNlKG1Db250ZXh0LCB3LCBoLCBzdXIpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0U2V0UHJpb3JpdHkoaW50IGNvbiwgaW50IHApOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0U2V0UHJpb3JpdHkoaW50IHApIHsKKyAgICAgICAgcnNuQ29udGV4dFNldFByaW9yaXR5KG1Db250ZXh0LCBwKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dER1bXAoaW50IGNvbiwgaW50IGJpdHMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0RHVtcChpbnQgYml0cykgeworICAgICAgICByc25Db250ZXh0RHVtcChtQ29udGV4dCwgYml0cyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRGaW5pc2goaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRGaW5pc2goKSB7CisgICAgICAgIHJzbkNvbnRleHRGaW5pc2gobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5UeXBlQmVnaW4oaW50IGVsZW1lbnRJRCk7Ci0gICAgbmF0aXZlIHZvaWQgblR5cGVBZGQoaW50IGRpbSwgaW50IHZhbCk7Ci0gICAgbmF0aXZlIGludCAgblR5cGVDcmVhdGUoKTsKLSAgICBuYXRpdmUgdm9pZCBuVHlwZUZpbmFsRGVzdHJveShUeXBlIHQpOwotICAgIG5hdGl2ZSB2b2lkIG5UeXBlU2V0dXBGaWVsZHMoVHlwZSB0LCBpbnRbXSB0eXBlcywgaW50W10gYml0cywgRmllbGRbXSBJRHMpOworICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdChpbnQgY29uLCBpbnQgc2NyaXB0KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRSb290U2NyaXB0KGludCBzY3JpcHQpIHsKKyAgICAgICAgcnNuQ29udGV4dEJpbmRSb290U2NyaXB0KG1Db250ZXh0LCBzY3JpcHQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFNhbXBsZXIoaW50IGNvbiwgaW50IHNhbXBsZXIsIGludCBzbG90KTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRTYW1wbGVyKGludCBzYW1wbGVyLCBpbnQgc2xvdCkgeworICAgICAgICByc25Db250ZXh0QmluZFNhbXBsZXIobUNvbnRleHQsIHNhbXBsZXIsIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1TdG9yZShpbnQgY29uLCBpbnQgcGZzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoaW50IHBmcykgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1TdG9yZShtQ29udGV4dCwgcGZzKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IGNvbiwgaW50IHBmKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoaW50IHBmKSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KG1Db250ZXh0LCBwZik7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChpbnQgY29uLCBpbnQgcHYpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoaW50IHB2KSB7CisgICAgICAgIHJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChtQ29udGV4dCwgcHYpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIoaW50IGNvbiwgaW50IHByKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGludCBwcikgeworICAgICAgICByc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIobUNvbnRleHQsIHByKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQ29udGV4dFBhdXNlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Db250ZXh0UGF1c2UoKSB7CisgICAgICAgIHJzbkNvbnRleHRQYXVzZShtQ29udGV4dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkNvbnRleHRSZXN1bWUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkNvbnRleHRSZXN1bWUoKSB7CisgICAgICAgIHJzbkNvbnRleHRSZXN1bWUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoaW50IHR5cGUpOwotICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApOwotICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKGludCB0eXBlLCBCaXRtYXAgYm1wKTsKLSAgICBuYXRpdmUgaW50ICBuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApOwotICAgIG5hdGl2ZSBpbnQgIG5BbGxvY2F0aW9uQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBuYXRpdmUgdm9pZCByc25Bc3NpZ25OYW1lKGludCBjb24sIGludCBvYmosIGJ5dGVbXSBuYW1lKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQXNzaWduTmFtZShpbnQgb2JqLCBieXRlW10gbmFtZSkgeworICAgICAgICByc25Bc3NpZ25OYW1lKG1Db250ZXh0LCBvYmosIG5hbWUpOworICAgIH0KKyAgICBuYXRpdmUgU3RyaW5nIHJzbkdldE5hbWUoaW50IGNvbiwgaW50IG9iaik7CisgICAgc3luY2hyb25pemVkIFN0cmluZyBuR2V0TmFtZShpbnQgb2JqKSB7CisgICAgICAgIHJldHVybiByc25HZXROYW1lKG1Db250ZXh0LCBvYmopOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25PYmpEZXN0cm95KGludCBjb24sIGludCBpZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk9iakRlc3Ryb3koaW50IGlkKSB7CisgICAgICAgIHJzbk9iakRlc3Ryb3kobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRmlsZU9wZW4oaW50IGNvbiwgYnl0ZVtdIG5hbWUpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZpbGVPcGVuKGJ5dGVbXSBuYW1lKSB7CisgICAgICAgIHJldHVybiByc25GaWxlT3BlbihtQ29udGV4dCwgbmFtZSk7CisgICAgfQogCi0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoaW50IGFsbG9jLCBib29sZWFuIGdlbk1pcHMsIGludCBiYXNlTWlvTGV2ZWwpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoaW50IGFsbG9jKTsKKyAgICBuYXRpdmUgaW50ICByc25FbGVtZW50Q3JlYXRlKGludCBjb24sIGludCB0eXBlLCBpbnQga2luZCwgYm9vbGVhbiBub3JtLCBpbnQgdmVjU2l6ZSk7CisgICAgc3luY2hyb25pemVkIGludCBuRWxlbWVudENyZWF0ZShpbnQgdHlwZSwgaW50IGtpbmQsIGJvb2xlYW4gbm9ybSwgaW50IHZlY1NpemUpIHsKKyAgICAgICAgcmV0dXJuIHJzbkVsZW1lbnRDcmVhdGUobUNvbnRleHQsIHR5cGUsIGtpbmQsIG5vcm0sIHZlY1NpemUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25FbGVtZW50Q3JlYXRlMihpbnQgY29uLCBpbnRbXSBlbGVtZW50cywgU3RyaW5nW10gbmFtZXMsIGludFtdIGFycmF5U2l6ZXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkVsZW1lbnRDcmVhdGUyKGludFtdIGVsZW1lbnRzLCBTdHJpbmdbXSBuYW1lcywgaW50W10gYXJyYXlTaXplcykgeworICAgICAgICByZXR1cm4gcnNuRWxlbWVudENyZWF0ZTIobUNvbnRleHQsIGVsZW1lbnRzLCBuYW1lcywgYXJyYXlTaXplcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkVsZW1lbnRHZXROYXRpdmVEYXRhKGludCBjb24sIGludCBpZCwgaW50W10gZWxlbWVudERhdGEpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5FbGVtZW50R2V0TmF0aXZlRGF0YShpbnQgaWQsIGludFtdIGVsZW1lbnREYXRhKSB7CisgICAgICAgIHJzbkVsZW1lbnRHZXROYXRpdmVEYXRhKG1Db250ZXh0LCBpZCwgZWxlbWVudERhdGEpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25FbGVtZW50R2V0U3ViRWxlbWVudHMoaW50IGNvbiwgaW50IGlkLCBpbnRbXSBJRHMsIFN0cmluZ1tdIG5hbWVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuRWxlbWVudEdldFN1YkVsZW1lbnRzKGludCBpZCwgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcykgeworICAgICAgICByc25FbGVtZW50R2V0U3ViRWxlbWVudHMobUNvbnRleHQsIGlkLCBJRHMsIG5hbWVzKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIHNob3J0W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBuYXRpdmUgdm9pZCByc25UeXBlQmVnaW4oaW50IGNvbiwgaW50IGVsZW1lbnRJRCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblR5cGVCZWdpbihpbnQgZWxlbWVudElEKSB7CisgICAgICAgIHJzblR5cGVCZWdpbihtQ29udGV4dCwgZWxlbWVudElEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuVHlwZUFkZChpbnQgY29uLCBpbnQgZGltLCBpbnQgdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuVHlwZUFkZChpbnQgZGltLCBpbnQgdmFsKSB7CisgICAgICAgIHJzblR5cGVBZGQobUNvbnRleHQsIGRpbSwgdmFsKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuVHlwZUNyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5UeXBlQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuVHlwZUNyZWF0ZShtQ29udGV4dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblR5cGVHZXROYXRpdmVEYXRhKGludCBjb24sIGludCBpZCwgaW50W10gdHlwZURhdGEpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5UeXBlR2V0TmF0aXZlRGF0YShpbnQgaWQsIGludFtdIHR5cGVEYXRhKSB7CisgICAgICAgIHJzblR5cGVHZXROYXRpdmVEYXRhKG1Db250ZXh0LCBpZCwgdHlwZURhdGEpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOwotICAgIG5hdGl2ZSB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25SZWFkKGludCBpZCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25SZWFkKGludCBpZCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KGludCBpZCwgVHlwZSB0LCBpbnQgb2Zmc2V0LCBPYmplY3Qgbyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChpbnQgaWQsIFR5cGUgdCwgaW50IG9mZnNldCwgT2JqZWN0IG8pOworICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZChpbnQgY29uLCBpbnQgdHlwZSk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZVR5cGVkKGludCB0eXBlKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQobUNvbnRleHQsIHR5cGUpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChpbnQgY29uLCBpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKGludCBkc3RGbXQsIGJvb2xlYW4gZ2VuTWlwcywgQml0bWFwIGJtcCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAobUNvbnRleHQsIGRzdEZtdCwgZ2VuTWlwcywgYm1wKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgY29uLCBpbnQgdHlwZSwgQml0bWFwIGJtcCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihpbnQgdHlwZSwgQml0bWFwIGJtcCkgeworICAgICAgICByZXR1cm4gcnNuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihtQ29udGV4dCwgdHlwZSwgYm1wKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXBCb3hlZChpbnQgY29uLCBpbnQgZHN0Rm10LCBib29sZWFuIGdlbk1pcHMsIEJpdG1hcCBibXApOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBCaXRtYXAgYm1wKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkKG1Db250ZXh0LCBkc3RGbXQsIGdlbk1pcHMsIGJtcCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGNvbiwgaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYXNzZXRTdHJlYW0pOworICAgIHN5bmNocm9uaXplZCBpbnQgbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGRzdEZtdCwgYm9vbGVhbiBnZW5NaXBzLCBpbnQgYXNzZXRTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0obUNvbnRleHQsIGRzdEZtdCwgZ2VuTWlwcywgYXNzZXRTdHJlYW0pOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMUREYXRhKGludCBhZCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIxRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkKTsKLSAgICBuYXRpdmUgdm9pZCBuQWRhcHRlcjFEU3ViRGF0YShpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgZmxvYXRbXSBkKTsKLSAgICBuYXRpdmUgaW50ICBuQWRhcHRlcjFEQ3JlYXRlKCk7CisgICAgbmF0aXZlIHZvaWQgcnNuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShpbnQgY29uLCBpbnQgYWxsb2MsIGJvb2xlYW4gZ2VuTWlwcywgaW50IGJhc2VNaW9MZXZlbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUoaW50IGFsbG9jLCBib29sZWFuIGdlbk1pcHMsIGludCBiYXNlTWlvTGV2ZWwpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShtQ29udGV4dCwgYWxsb2MsIGdlbk1pcHMsIGJhc2VNaW9MZXZlbCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChpbnQgY29uLCBpbnQgYWxsb2MpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QoaW50IGFsbG9jKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChtQ29udGV4dCwgYWxsb2MpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihpbnQgYWQsIGludCBhbGxvYyk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkREYXRhKGludCBhZCwgaW50W10gZCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFkYXB0ZXIyRERhdGEoaW50IGFkLCBmbG9hdFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQpOwotICAgIG5hdGl2ZSB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCk7Ci0gICAgbmF0aXZlIGludCAgbkFkYXB0ZXIyRENyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBpbnRbXSBkLCBpbnQgc2l6ZUJ5dGVzKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQobUNvbnRleHQsIGlkLCBvZmYsIGNvdW50LCBkLCBzaXplQnl0ZXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTFEKGludCBpZCwgaW50IG9mZiwgaW50IGNvdW50LCBzaG9ydFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGExRChpbnQgaWQsIGludCBvZmYsIGludCBjb3VudCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGExRChtQ29udGV4dCwgaWQsIG9mZiwgY291bnQsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCBjb21wSWR4LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKGludCBpZCwgaW50IHhvZmYsIGludCBjb21wSWR4LCBieXRlW10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRWxlbWVudERhdGExRChtQ29udGV4dCwgaWQsIHhvZmYsIGNvbXBJZHgsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGNvbiwgaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25TdWJEYXRhMUQoaW50IGlkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCwgaW50IHNpemVCeXRlcykgeworICAgICAgICByc25BbGxvY2F0aW9uU3ViRGF0YTFEKG1Db250ZXh0LCBpZCwgb2ZmLCBjb3VudCwgZCwgc2l6ZUJ5dGVzKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0QmluZEFsbG9jYXRpb24oaW50IHNjcmlwdCwgaW50IGFsbG9jLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldENsZWFyQ29sb3IoaW50IHNjcmlwdCwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdFNldENsZWFyRGVwdGgoaW50IHNjcmlwdCwgZmxvYXQgZGVwdGgpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRDbGVhclN0ZW5jaWwoaW50IHNjcmlwdCwgaW50IHN0ZW5jaWwpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRUaW1lWm9uZShpbnQgc2NyaXB0LCBieXRlW10gdGltZVpvbmUpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRUeXBlKGludCB0eXBlLCBib29sZWFuIHdyaXRhYmxlLCBTdHJpbmcgbmFtZSwgaW50IHNsb3QpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRTZXRSb290KGJvb2xlYW4gaXNSb290KTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0U2V0SW52b2thYmxlKFN0cmluZyBuYW1lLCBpbnQgc2xvdCk7Ci0gICAgbmF0aXZlIHZvaWQgblNjcmlwdEludm9rZShpbnQgaWQsIGludCBzbG90KTsKKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQsIGludCBzaXplQnl0ZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BbGxvY2F0aW9uU3ViRGF0YTJEKGludCBpZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGludFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChtQ29udGV4dCwgaWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJEYXRhMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvblN1YkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQsIGludCBzaXplQnl0ZXMpIHsKKyAgICAgICAgcnNuQWxsb2NhdGlvblN1YkRhdGEyRChtQ29udGV4dCwgaWQsIHhvZmYsIHlvZmYsIHcsIGgsIGQsIHNpemVCeXRlcyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25SZWFkKGludCBjb24sIGludCBpZCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25SZWFkKGludCBpZCwgaW50W10gZCkgeworICAgICAgICByc25BbGxvY2F0aW9uUmVhZChtQ29udGV4dCwgaWQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BbGxvY2F0aW9uUmVhZChpbnQgY29uLCBpbnQgaWQsIGZsb2F0W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFsbG9jYXRpb25SZWFkKGludCBpZCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFsbG9jYXRpb25SZWFkKG1Db250ZXh0LCBpZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFsbG9jYXRpb25HZXRUeXBlKGludCBjb24sIGludCBpZCk7CisgICAgc3luY2hyb25pemVkIGludCBuQWxsb2NhdGlvbkdldFR5cGUoaW50IGlkKSB7CisgICAgICAgIHJldHVybiByc25BbGxvY2F0aW9uR2V0VHlwZShtQ29udGV4dCwgaWQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQmVnaW4oKTsKLSAgICBuYXRpdmUgdm9pZCBuU2NyaXB0Q1NldFNjcmlwdChieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLSAgICBuYXRpdmUgaW50ICBuU2NyaXB0Q0NyZWF0ZSgpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lSTMyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSB2b2lkIG5TY3JpcHRDQWRkRGVmaW5lRihTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOworICAgIG5hdGl2ZSBpbnQgIHJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0oaW50IGNvbiwgaW50IGFzc2V0U3RyZWFtKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGludCBhc3NldFN0cmVhbSkgeworICAgICAgICByZXR1cm4gcnNuRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShtQ29udGV4dCwgYXNzZXRTdHJlYW0pOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBjb24sIGludCBmaWxlQTNEKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKGludCBmaWxlQTNEKSB7CisgICAgICAgIHJldHVybiByc25GaWxlQTNER2V0TnVtSW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNEKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuRmlsZUEzREdldEluZGV4RW50cmllcyhpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IG51bUVudHJpZXMsIGludFtdIElEcywgU3RyaW5nW10gbmFtZXMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5GaWxlQTNER2V0SW5kZXhFbnRyaWVzKGludCBmaWxlQTNELCBpbnQgbnVtRW50cmllcywgaW50W10gSURzLCBTdHJpbmdbXSBuYW1lcykgeworICAgICAgICByc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzKG1Db250ZXh0LCBmaWxlQTNELCBudW1FbnRyaWVzLCBJRHMsIG5hbWVzKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuRmlsZUEzREdldEVudHJ5QnlJbmRleChpbnQgY29uLCBpbnQgZmlsZUEzRCwgaW50IGluZGV4KTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5GaWxlQTNER2V0RW50cnlCeUluZGV4KGludCBmaWxlQTNELCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHJzbkZpbGVBM0RHZXRFbnRyeUJ5SW5kZXgobUNvbnRleHQsIGZpbGVBM0QsIGluZGV4KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuU2FtcGxlckJlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgblNhbXBsZXJTZXQoaW50IHBhcmFtLCBpbnQgdmFsdWUpOwotICAgIG5hdGl2ZSBpbnQgIG5TYW1wbGVyQ3JlYXRlKCk7CisgICAgbmF0aXZlIGludCAgcnNuRm9udENyZWF0ZUZyb21GaWxlKGludCBjb24sIFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUsIGludCBkcGkpOworICAgIHN5bmNocm9uaXplZCBpbnQgbkZvbnRDcmVhdGVGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUsIGludCBzaXplLCBpbnQgZHBpKSB7CisgICAgICAgIHJldHVybiByc25Gb250Q3JlYXRlRnJvbUZpbGUobUNvbnRleHQsIGZpbGVOYW1lLCBzaXplLCBkcGkpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKGludCBpbiwgaW50IG91dCk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGludCBmdW5jKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soYm9vbGVhbiBlbmFibGUpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpOwotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhpbnQgc3JjLCBpbnQgZHN0KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoYm9vbGVhbiBlbmFibGUpOwotICAgIG5hdGl2ZSBpbnQgIG5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSgpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKGludCBjb24sIGludCBhZCwgaW50IGFsbG9jKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEQmluZEFsbG9jYXRpb24obUNvbnRleHQsIGFkLCBhbGxvYyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQoaW50IGNvbiwgaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRFNldENvbnN0cmFpbnQobUNvbnRleHQsIGFkLCBkaW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFERGF0YShpbnQgY29uLCBpbnQgYWQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMUREYXRhKGludCBhZCwgaW50W10gZCkgeworICAgICAgICByc25BZGFwdGVyMUREYXRhKG1Db250ZXh0LCBhZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIxRERhdGEoaW50IGNvbiwgaW50IGFkLCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMUREYXRhKGludCBhZCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIxRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjFEU3ViRGF0YShpbnQgY29uLCBpbnQgYWQsIGludCBvZmYsIGludCBjb3VudCwgaW50W10gZCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbkFkYXB0ZXIxRFN1YkRhdGEoaW50IGFkLCBpbnQgb2ZmLCBpbnQgY291bnQsIGludFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEU3ViRGF0YShtQ29udGV4dCwgYWQsIG9mZiwgY291bnQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25BZGFwdGVyMURTdWJEYXRhKGludCBjb24sIGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMURTdWJEYXRhKGludCBhZCwgaW50IG9mZiwgaW50IGNvdW50LCBmbG9hdFtdIGQpIHsKKyAgICAgICAgcnNuQWRhcHRlcjFEU3ViRGF0YShtQ29udGV4dCwgYWQsIG9mZiwgY291bnQsIGQpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25BZGFwdGVyMURDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuQWRhcHRlcjFEQ3JlYXRlKCkgeworICAgICAgICByZXR1cm4gcnNuQWRhcHRlcjFEQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVJhc3RlckNyZWF0ZShpbnQgaW4sIGludCBvdXQsIGJvb2xlYW4gcG9pbnRTbW9vdGgsIGJvb2xlYW4gbGluZVNtb290aCwgYm9vbGVhbiBwb2ludFNwcml0ZSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IHByLCBmbG9hdCB2KTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShpbnQgcHIsIGZsb2F0IHYpOworICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uKGludCBjb24sIGludCBhZCwgaW50IGFsbG9jKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oaW50IGFkLCBpbnQgYWxsb2MpIHsKKyAgICAgICAgcnNuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24obUNvbnRleHQsIGFkLCBhbGxvYyk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQoaW50IGNvbiwgaW50IGFkLCBpbnQgZGltLCBpbnQgdmFsdWUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTZXRDb25zdHJhaW50KGludCBhZCwgaW50IGRpbSwgaW50IHZhbHVlKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQobUNvbnRleHQsIGFkLCBkaW0sIHZhbHVlKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJERGF0YShpbnQgY29uLCBpbnQgYWQsIGludFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkREYXRhKGludCBhZCwgaW50W10gZCkgeworICAgICAgICByc25BZGFwdGVyMkREYXRhKG1Db250ZXh0LCBhZCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbkFkYXB0ZXIyRERhdGEoaW50IGNvbiwgaW50IGFkLCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkREYXRhKGludCBhZCwgZmxvYXRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRERhdGEobUNvbnRleHQsIGFkLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU3ViRGF0YShpbnQgY29uLCBpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWRhcHRlcjJEU3ViRGF0YShpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKSB7CisgICAgICAgIHJzbkFkYXB0ZXIyRFN1YkRhdGEobUNvbnRleHQsIGFkLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuQWRhcHRlcjJEU3ViRGF0YShpbnQgY29uLCBpbnQgYWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBmbG9hdFtdIGQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5BZGFwdGVyMkRTdWJEYXRhKGludCBhZCwgaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsIGZsb2F0W10gZCkgeworICAgICAgICByc25BZGFwdGVyMkRTdWJEYXRhKG1Db250ZXh0LCBhZCwgeG9mZiwgeW9mZiwgdywgaCwgZCk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzbkFkYXB0ZXIyRENyZWF0ZShpbnQgY29uKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5BZGFwdGVyMkRDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25BZGFwdGVyMkRDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKTsKLSAgICBuYXRpdmUgdm9pZCBuUHJvZ3JhbUJpbmRUZXh0dXJlKGludCB2cGYsIGludCBzbG90LCBpbnQgYSk7Ci0gICAgbmF0aXZlIHZvaWQgblByb2dyYW1CaW5kU2FtcGxlcihpbnQgdnBmLCBpbnQgc2xvdCwgaW50IHMpOworICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdEJpbmRBbGxvY2F0aW9uKGludCBjb24sIGludCBzY3JpcHQsIGludCBhbGxvYywgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRCaW5kQWxsb2NhdGlvbihpbnQgc2NyaXB0LCBpbnQgYWxsb2MsIGludCBzbG90KSB7CisgICAgICAgIHJzblNjcmlwdEJpbmRBbGxvY2F0aW9uKG1Db250ZXh0LCBzY3JpcHQsIGFsbG9jLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0U2V0VGltZVpvbmUoaW50IGNvbiwgaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VGltZVpvbmUoaW50IHNjcmlwdCwgYnl0ZVtdIHRpbWVab25lKSB7CisgICAgICAgIHJzblNjcmlwdFNldFRpbWVab25lKG1Db250ZXh0LCBzY3JpcHQsIHRpbWVab25lKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0SW52b2tlKGludCBjb24sIGludCBpZCwgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRJbnZva2UoaW50IGlkLCBpbnQgc2xvdCkgeworICAgICAgICByc25TY3JpcHRJbnZva2UobUNvbnRleHQsIGlkLCBzbG90KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0SW52b2tlVihpbnQgY29uLCBpbnQgaWQsIGludCBzbG90LCBieXRlW10gcGFyYW1zKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0SW52b2tlVihpbnQgaWQsIGludCBzbG90LCBieXRlW10gcGFyYW1zKSB7CisgICAgICAgIHJzblNjcmlwdEludm9rZVYobUNvbnRleHQsIGlkLCBzbG90LCBwYXJhbXMpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRTZXRWYXJJKGludCBjb24sIGludCBpZCwgaW50IHNsb3QsIGludCB2YWwpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TY3JpcHRTZXRWYXJJKGludCBpZCwgaW50IHNsb3QsIGludCB2YWwpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VmFySShtQ29udGV4dCwgaWQsIHNsb3QsIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhckYoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgZmxvYXQgdmFsKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0U2V0VmFyRihpbnQgaWQsIGludCBzbG90LCBmbG9hdCB2YWwpIHsKKyAgICAgICAgcnNuU2NyaXB0U2V0VmFyRihtQ29udGV4dCwgaWQsIHNsb3QsIHZhbCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNjcmlwdFNldFZhclYoaW50IGNvbiwgaW50IGlkLCBpbnQgc2xvdCwgYnl0ZVtdIHZhbCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdFNldFZhclYoaW50IGlkLCBpbnQgc2xvdCwgYnl0ZVtdIHZhbCkgeworICAgICAgICByc25TY3JpcHRTZXRWYXJWKG1Db250ZXh0LCBpZCwgc2xvdCwgdmFsKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKGludFtdIHBhcmFtcyk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1GcmFnbWVudENyZWF0ZTIoU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKTsKKyAgICBuYXRpdmUgdm9pZCByc25TY3JpcHRDQmVnaW4oaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblNjcmlwdENCZWdpbigpIHsKKyAgICAgICAgcnNuU2NyaXB0Q0JlZ2luKG1Db250ZXh0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuU2NyaXB0Q1NldFNjcmlwdChpbnQgY29uLCBieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuU2NyaXB0Q1NldFNjcmlwdChieXRlW10gc2NyaXB0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJzblNjcmlwdENTZXRTY3JpcHQobUNvbnRleHQsIHNjcmlwdCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25TY3JpcHRDQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgblNjcmlwdENDcmVhdGUoKSB7CisgICAgICAgIHJldHVybiByc25TY3JpcHRDQ3JlYXRlKG1Db250ZXh0KTsKKyAgICB9CiAKLSAgICBuYXRpdmUgaW50ICBuUHJvZ3JhbVZlcnRleENyZWF0ZShib29sZWFuIHRleE1hdCk7Ci0gICAgbmF0aXZlIGludCAgblByb2dyYW1WZXJ0ZXhDcmVhdGUyKFN0cmluZyBzaGFkZXIsIGludFtdIHBhcmFtcyk7CisgICAgbmF0aXZlIHZvaWQgcnNuU2FtcGxlckJlZ2luKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TYW1wbGVyQmVnaW4oKSB7CisgICAgICAgIHJzblNhbXBsZXJCZWdpbihtQ29udGV4dCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblNhbXBsZXJTZXQoaW50IGNvbiwgaW50IHBhcmFtLCBpbnQgdmFsdWUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5TYW1wbGVyU2V0KGludCBwYXJhbSwgaW50IHZhbHVlKSB7CisgICAgICAgIHJzblNhbXBsZXJTZXQobUNvbnRleHQsIHBhcmFtLCB2YWx1ZSk7CisgICAgfQorICAgIG5hdGl2ZSBpbnQgIHJzblNhbXBsZXJDcmVhdGUoaW50IGNvbik7CisgICAgc3luY2hyb25pemVkIGludCBuU2FtcGxlckNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblNhbXBsZXJDcmVhdGUobUNvbnRleHQpOworICAgIH0KIAotICAgIG5hdGl2ZSB2b2lkIG5MaWdodEJlZ2luKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0SXNNb25vKGJvb2xlYW4gaXNNb25vKTsKLSAgICBuYXRpdmUgdm9pZCBuTGlnaHRTZXRJc0xvY2FsKGJvb2xlYW4gaXNMb2NhbCk7Ci0gICAgbmF0aXZlIGludCAgbkxpZ2h0Q3JlYXRlKCk7Ci0gICAgbmF0aXZlIHZvaWQgbkxpZ2h0U2V0Q29sb3IoaW50IGwsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpOwotICAgIG5hdGl2ZSB2b2lkIG5MaWdodFNldFBvc2l0aW9uKGludCBsLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVCZWdpbihpbnQgY29uLCBpbnQgaW4sIGludCBvdXQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVCZWdpbihpbnQgaW4sIGludCBvdXQpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlQmVnaW4obUNvbnRleHQsIGluLCBvdXQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoaW50IGNvbiwgaW50IGZ1bmMpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoaW50IGZ1bmMpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlRGVwdGhGdW5jKG1Db250ZXh0LCBmdW5jKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGludCBjb24sIGJvb2xlYW4gZW5hYmxlKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlRGVwdGhNYXNrKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZURlcHRoTWFzayhtQ29udGV4dCwgZW5hYmxlKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKGludCBjb24sIGJvb2xlYW4gciwgYm9vbGVhbiBnLCBib29sZWFuIGIsIGJvb2xlYW4gYSk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1TdG9yZUNvbG9yTWFzayhib29sZWFuIHIsIGJvb2xlYW4gZywgYm9vbGVhbiBiLCBib29sZWFuIGEpIHsKKyAgICAgICAgcnNuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrKG1Db250ZXh0LCByLCBnLCBiLCBhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGludCBjb24sIGludCBzcmMsIGludCBkc3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMoaW50IHNyYywgaW50IGRzdCkgeworICAgICAgICByc25Qcm9ncmFtU3RvcmVCbGVuZEZ1bmMobUNvbnRleHQsIHNyYywgZHN0KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbVN0b3JlRGl0aGVyKGludCBjb24sIGJvb2xlYW4gZW5hYmxlKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbVN0b3JlRGl0aGVyKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIHJzblByb2dyYW1TdG9yZURpdGhlcihtQ29udGV4dCwgZW5hYmxlKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbVN0b3JlQ3JlYXRlKGludCBjb24pOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1TdG9yZUNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1TdG9yZUNyZWF0ZShtQ29udGV4dCk7CisgICAgfQogCi0gICAgbmF0aXZlIGludCAgblNpbXBsZU1lc2hDcmVhdGUoaW50IGJhdGNoSUQsIGludCBpZHhJRCwgaW50W10gdnR4SUQsIGludCBwcmltKTsKLSAgICBuYXRpdmUgdm9pZCBuU2ltcGxlTWVzaEJpbmRWZXJ0ZXgoaW50IGlkLCBpbnQgYWxsb2MsIGludCBzbG90KTsKLSAgICBuYXRpdmUgdm9pZCBuU2ltcGxlTWVzaEJpbmRJbmRleChpbnQgaWQsIGludCBhbGxvYyk7CisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbVJhc3RlckNyZWF0ZShpbnQgY29uLCBib29sZWFuIHBvaW50U21vb3RoLCBib29sZWFuIGxpbmVTbW9vdGgsIGJvb2xlYW4gcG9pbnRTcHJpdGUpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1SYXN0ZXJDcmVhdGUoYm9vbGVhbiBwb2ludFNtb290aCwgYm9vbGVhbiBsaW5lU21vb3RoLCBib29sZWFuIHBvaW50U3ByaXRlKSB7CisgICAgICAgIHJldHVybiByc25Qcm9ncmFtUmFzdGVyQ3JlYXRlKG1Db250ZXh0LCBwb2ludFNtb290aCwgbGluZVNtb290aCwgcG9pbnRTcHJpdGUpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKGludCBjb24sIGludCBwciwgZmxvYXQgdik7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoaW50IHByLCBmbG9hdCB2KSB7CisgICAgICAgIHJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgobUNvbnRleHQsIHByLCB2KTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKGludCBjb24sIGludCBwciwgaW50IG1vZGUpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUoaW50IHByLCBpbnQgbW9kZSkgeworICAgICAgICByc25Qcm9ncmFtUmFzdGVyU2V0Q3VsbE1vZGUobUNvbnRleHQsIHByLCBtb2RlKTsKKyAgICB9CiAKLSAgICBuYXRpdmUgdm9pZCBuQW5pbWF0aW9uQmVnaW4oaW50IGF0dHJpYkNvdW50LCBpbnQga2V5ZnJhbWVDb3VudCk7Ci0gICAgbmF0aXZlIHZvaWQgbkFuaW1hdGlvbkFkZChmbG9hdCB0aW1lLCBmbG9hdFtdIGF0dHJpYnMpOwotICAgIG5hdGl2ZSBpbnQgIG5BbmltYXRpb25DcmVhdGUoKTsKKyAgICBuYXRpdmUgdm9pZCByc25Qcm9ncmFtQmluZENvbnN0YW50cyhpbnQgY29uLCBpbnQgcHYsIGludCBzbG90LCBpbnQgbUlEKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuUHJvZ3JhbUJpbmRDb25zdGFudHMoaW50IHB2LCBpbnQgc2xvdCwgaW50IG1JRCkgeworICAgICAgICByc25Qcm9ncmFtQmluZENvbnN0YW50cyhtQ29udGV4dCwgcHYsIHNsb3QsIG1JRCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzblByb2dyYW1CaW5kVGV4dHVyZShpbnQgY29uLCBpbnQgdnBmLCBpbnQgc2xvdCwgaW50IGEpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5Qcm9ncmFtQmluZFRleHR1cmUoaW50IHZwZiwgaW50IHNsb3QsIGludCBhKSB7CisgICAgICAgIHJzblByb2dyYW1CaW5kVGV4dHVyZShtQ29udGV4dCwgdnBmLCBzbG90LCBhKTsKKyAgICB9CisgICAgbmF0aXZlIHZvaWQgcnNuUHJvZ3JhbUJpbmRTYW1wbGVyKGludCBjb24sIGludCB2cGYsIGludCBzbG90LCBpbnQgcyk7CisgICAgc3luY2hyb25pemVkIHZvaWQgblByb2dyYW1CaW5kU2FtcGxlcihpbnQgdnBmLCBpbnQgc2xvdCwgaW50IHMpIHsKKyAgICAgICAgcnNuUHJvZ3JhbUJpbmRTYW1wbGVyKG1Db250ZXh0LCB2cGYsIHNsb3QsIHMpOworICAgIH0KKworICAgIG5hdGl2ZSBpbnQgIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnQgY29uLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1GcmFnbWVudENyZWF0ZShpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1GcmFnbWVudENyZWF0ZShtQ29udGV4dCwgcGFyYW1zKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMihpbnQgY29uLCBTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpOworICAgIHN5bmNocm9uaXplZCBpbnQgblByb2dyYW1GcmFnbWVudENyZWF0ZTIoU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKSB7CisgICAgICAgIHJldHVybiByc25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKG1Db250ZXh0LCBzaGFkZXIsIHBhcmFtcyk7CisgICAgfQorCisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbVZlcnRleENyZWF0ZShpbnQgY29uLCBib29sZWFuIHRleE1hdCk7CisgICAgc3luY2hyb25pemVkIGludCBuUHJvZ3JhbVZlcnRleENyZWF0ZShib29sZWFuIHRleE1hdCkgeworICAgICAgICByZXR1cm4gcnNuUHJvZ3JhbVZlcnRleENyZWF0ZShtQ29udGV4dCwgdGV4TWF0KTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuUHJvZ3JhbVZlcnRleENyZWF0ZTIoaW50IGNvbiwgU3RyaW5nIHNoYWRlciwgaW50W10gcGFyYW1zKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5Qcm9ncmFtVmVydGV4Q3JlYXRlMihTdHJpbmcgc2hhZGVyLCBpbnRbXSBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHJzblByb2dyYW1WZXJ0ZXhDcmVhdGUyKG1Db250ZXh0LCBzaGFkZXIsIHBhcmFtcyk7CisgICAgfQorCisKKyAgICBuYXRpdmUgaW50ICByc25NZXNoQ3JlYXRlKGludCBjb24sIGludCB2dHhDb3VudCwgaW50IGluZGV4Q291bnQpOworICAgIHN5bmNocm9uaXplZCBpbnQgbk1lc2hDcmVhdGUoaW50IHZ0eENvdW50LCBpbnQgaW5kZXhDb3VudCkgeworICAgICAgICByZXR1cm4gcnNuTWVzaENyZWF0ZShtQ29udGV4dCwgdnR4Q291bnQsIGluZGV4Q291bnQpOworICAgIH0KKyAgICBuYXRpdmUgdm9pZCByc25NZXNoQmluZFZlcnRleChpbnQgY29uLCBpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoQmluZFZlcnRleChpbnQgaWQsIGludCBhbGxvYywgaW50IHNsb3QpIHsKKyAgICAgICAgcnNuTWVzaEJpbmRWZXJ0ZXgobUNvbnRleHQsIGlkLCBhbGxvYywgc2xvdCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hCaW5kSW5kZXgoaW50IGNvbiwgaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hCaW5kSW5kZXgoaW50IGlkLCBpbnQgYWxsb2MsIGludCBwcmltLCBpbnQgc2xvdCkgeworICAgICAgICByc25NZXNoQmluZEluZGV4KG1Db250ZXh0LCBpZCwgYWxsb2MsIHByaW0sIHNsb3QpOworICAgIH0KKyAgICBuYXRpdmUgaW50ICByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoaW50IGlkKSB7CisgICAgICAgIHJldHVybiByc25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQobUNvbnRleHQsIGlkKTsKKyAgICB9CisgICAgbmF0aXZlIGludCAgcnNuTWVzaEdldEluZGV4Q291bnQoaW50IGNvbiwgaW50IGlkKTsKKyAgICBzeW5jaHJvbml6ZWQgaW50IG5NZXNoR2V0SW5kZXhDb3VudChpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHJzbk1lc2hHZXRJbmRleENvdW50KG1Db250ZXh0LCBpZCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRWZXJ0aWNlcyhpbnQgY29uLCBpbnQgaWQsIGludFtdIHZ0eElkcywgaW50IHZ0eElkQ291bnQpOworICAgIHN5bmNocm9uaXplZCB2b2lkIG5NZXNoR2V0VmVydGljZXMoaW50IGlkLCBpbnRbXSB2dHhJZHMsIGludCB2dHhJZENvdW50KSB7CisgICAgICAgIHJzbk1lc2hHZXRWZXJ0aWNlcyhtQ29udGV4dCwgaWQsIHZ0eElkcywgdnR4SWRDb3VudCk7CisgICAgfQorICAgIG5hdGl2ZSB2b2lkIHJzbk1lc2hHZXRJbmRpY2VzKGludCBjb24sIGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCk7CisgICAgc3luY2hyb25pemVkIHZvaWQgbk1lc2hHZXRJbmRpY2VzKGludCBpZCwgaW50W10gaWR4SWRzLCBpbnRbXSBwcmltaXRpdmVzLCBpbnQgdnR4SWRDb3VudCkgeworICAgICAgICByc25NZXNoR2V0SW5kaWNlcyhtQ29udGV4dCwgaWQsIGlkeElkcywgcHJpbWl0aXZlcywgdnR4SWRDb3VudCk7CisgICAgfQorCiAKICAgICBwcm90ZWN0ZWQgaW50ICAgICBtRGV2OwogICAgIHByb3RlY3RlZCBpbnQgICAgIG1Db250ZXh0OwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJvdGVjdGVkIE1lc3NhZ2VUaHJlYWQgbU1lc3NhZ2VUaHJlYWQ7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTg7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0k4OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9VMTY7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0kxNjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1VTRVJfVTMyOwotICAgIEVsZW1lbnQgbUVsZW1lbnRfVVNFUl9JMzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9VU0VSX0YzMjsKKyAgICBFbGVtZW50IG1FbGVtZW50X1U4OworICAgIEVsZW1lbnQgbUVsZW1lbnRfSTg7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMTY7CisgICAgRWxlbWVudCBtRWxlbWVudF9VMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9JMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GMzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9CT09MRUFOOworCisgICAgRWxlbWVudCBtRWxlbWVudF9FTEVNRU5UOworICAgIEVsZW1lbnQgbUVsZW1lbnRfVFlQRTsKKyAgICBFbGVtZW50IG1FbGVtZW50X0FMTE9DQVRJT047CisgICAgRWxlbWVudCBtRWxlbWVudF9TQU1QTEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfU0NSSVBUOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUVTSDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fRlJBR01FTlQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9QUk9HUkFNX1ZFUlRFWDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1BST0dSQU1fUkFTVEVSOworICAgIEVsZW1lbnQgbUVsZW1lbnRfUFJPR1JBTV9TVE9SRTsKIAogICAgIEVsZW1lbnQgbUVsZW1lbnRfQV84OwogICAgIEVsZW1lbnQgbUVsZW1lbnRfUkdCXzU2NTsKQEAgLTIxMCwxMyArNTI1LDM4IEBACiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzQ0NDQ7CiAgICAgRWxlbWVudCBtRWxlbWVudF9SR0JBXzg4ODg7CiAKLSAgICBFbGVtZW50IG1FbGVtZW50X0lOREVYXzE2OwotICAgIEVsZW1lbnQgbUVsZW1lbnRfUE9TSVRJT05fMjsKLSAgICBFbGVtZW50IG1FbGVtZW50X1BPU0lUSU9OXzM7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9URVhUVVJFXzI7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9OT1JNQUxfMzsKLSAgICBFbGVtZW50IG1FbGVtZW50X0NPTE9SX1U4XzQ7Ci0gICAgRWxlbWVudCBtRWxlbWVudF9DT0xPUl9GMzJfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X0ZMT0FUXzI7CisgICAgRWxlbWVudCBtRWxlbWVudF9GTE9BVF8zOworICAgIEVsZW1lbnQgbUVsZW1lbnRfRkxPQVRfNDsKKyAgICBFbGVtZW50IG1FbGVtZW50X1VDSEFSXzQ7CisKKyAgICBFbGVtZW50IG1FbGVtZW50X01BVFJJWF80WDQ7CisgICAgRWxlbWVudCBtRWxlbWVudF9NQVRSSVhfM1gzOworICAgIEVsZW1lbnQgbUVsZW1lbnRfTUFUUklYXzJYMjsKKworICAgIFNhbXBsZXIgbVNhbXBsZXJfQ0xBTVBfTkVBUkVTVDsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICBTYW1wbGVyIG1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIFNhbXBsZXIgbVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgU2FtcGxlciBtU2FtcGxlcl9XUkFQX0xJTkVBUl9NSVBfTElORUFSOworCisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fREVQVEg7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfTk9ORV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX05PTkVfREVQVEhfTk9fV1JJVEU7CisgICAgUHJvZ3JhbVN0b3JlIG1Qcm9ncmFtU3RvcmVfQkxFTkRfQUxQSEFfREVQVEhfVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BTFBIQV9ERVBUSF9OT19URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FMUEhBX0RFUFRIX05PX1dSSVRFOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9URVNUOworICAgIFByb2dyYW1TdG9yZSBtUHJvZ3JhbVN0b3JlX0JMRU5EX0FERF9ERVBUSF9OT19ERVBUSDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fVEVTVDsKKyAgICBQcm9ncmFtU3RvcmUgbVByb2dyYW1TdG9yZV9CTEVORF9BRERfREVQVEhfTk9fV1JJVEU7CisKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfQkFDSzsKKyAgICBQcm9ncmFtUmFzdGVyIG1Qcm9ncmFtUmFzdGVyX0NVTExfRlJPTlQ7CisgICAgUHJvZ3JhbVJhc3RlciBtUHJvZ3JhbVJhc3Rlcl9DVUxMX05PTkU7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vCkBAIC0yNjQsMTcgKzYwNCwyNCBAQAogICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbi4gIFRoZSBmaW5hbCBzb2x1dGlvbiB3aWxsCiAgICAgICAgICAgICAvLyB1c2VkIHR5cGVkIGFsbG9jYXRpb25zIHdoZXJlIHRoZSBtZXNzYWdlIGlkIGlzIHRoZSB0eXBlIGluZGljYXRvci4KICAgICAgICAgICAgIGludFtdIHJidWYgPSBuZXcgaW50WzE2XTsKLSAgICAgICAgICAgIG1SUy5uQ29udGV4dEluaXRUb0NsaWVudCgpOworICAgICAgICAgICAgbVJTLm5Db250ZXh0SW5pdFRvQ2xpZW50KG1SUy5tQ29udGV4dCk7CiAgICAgICAgICAgICB3aGlsZShtUnVuKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1zZyA9IG1SUy5uQ29udGV4dEdldE1lc3NhZ2UocmJ1ZiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmJ1ZlswXSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG1zZyA9IG1SUy5uQ29udGV4dEdldE1lc3NhZ2UobVJTLm1Db250ZXh0LCByYnVmLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAobXNnID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyB0ZWFyZG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgdG8gYXZvaWQgc3RhcnZpbmcgb3RoZXIgdGhyZWFkcyBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVhcmRvd24gYnkgeWllbGRpbmcgdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgZGVzdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZXhlY3V0ZSB0byBzZXQgbVJ1biA9IGZhbHNlCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbiBoYXBwZW4gZm9yIHR3byByZWFzb25zCisgICAgICAgICAgICAgICAgICAgIGlmIChyYnVmWzBdID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTogQnVmZmVyIG5lZWRzIHRvIGJlIGVubGFyZ2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgcmJ1ZiA9IG5ldyBpbnRbcmJ1ZlswXSArIDJdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjogdGVhcmRvd24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdXQgd2Ugd2FudCB0byBhdm9pZCBzdGFydmluZyBvdGhlciB0aHJlYWRzIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVhcmRvd24gYnkgeWllbGRpbmcgdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgZGVzdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGV4ZWN1dGUgdG8gc2V0IG1SdW4gPSBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmKG1SUy5tTWVzc2FnZUNhbGxiYWNrICE9IG51bGwpIHsKQEAgLTI4Miw3ICs2MjksNiBAQAogICAgICAgICAgICAgICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjay5tSUQgPSBtc2c7CiAgICAgICAgICAgICAgICAgICAgIG1SUy5tTWVzc2FnZUNhbGxiYWNrLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0xvZy5kKExPR19UQUcsICJNZXNzYWdlVGhyZWFkIG1zZyAiICsgbXNnICsgIiB2MSAiICsgcmJ1ZlswXSArICIgdjIgIiArIHJidWZbMV0gKyAiIHYzICIgK3JidWZbMl0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIk1lc3NhZ2VUaHJlYWQgZXhpdGluZy4iKTsKICAgICAgICAgfQpAQCAtMzA3LDEyICs2NTMsMTYgQEAKICAgICAgICAgbkNvbnRleHREdW1wKGJpdHMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgbkNvbnRleHRGaW5pc2goKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewogICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICBuQ29udGV4dERlaW5pdFRvQ2xpZW50KCk7CisgICAgICAgIG5Db250ZXh0RGVpbml0VG9DbGllbnQobUNvbnRleHQpOwogICAgICAgICBtTWVzc2FnZVRocmVhZC5tUnVuID0gZmFsc2U7CiAKLSAgICAgICAgbkNvbnRleHREZXN0cm95KG1Db250ZXh0KTsKKyAgICAgICAgbkNvbnRleHREZXN0cm95KCk7CiAgICAgICAgIG1Db250ZXh0ID0gMDsKIAogICAgICAgICBuRGV2aWNlRGVzdHJveShtRGV2KTsKQEAgLTMzNSwzICs2ODUsNCBAQAogfQogCiAKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHRHTC5qYXZhCmluZGV4IGQxZGYyM2QuLjYxZWNjOGQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0R0wuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdEdMLmphdmEKQEAgLTc0LDkgKzc0LDkgQEAKICAgICAgICAgbkNvbnRleHRCaW5kUm9vdFNjcmlwdChzYWZlSUQocykpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlIHApIHsKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0QmluZFByb2dyYW1TdG9yZShQcm9ncmFtU3RvcmUgcCkgewogICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICBuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShzYWZlSUQocCkpOworICAgICAgICBuQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoc2FmZUlEKHApKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChQcm9ncmFtRnJhZ21lbnQgcCkgewpAQCAtMTAyLDggKzEwMiw3IEBACiAKICAgICBwdWJsaWMgY2xhc3MgRmlsZSBleHRlbmRzIEJhc2VPYmogewogICAgICAgICBGaWxlKGludCBpZCkgewotICAgICAgICAgICAgc3VwZXIoUmVuZGVyU2NyaXB0R0wudGhpcyk7Ci0gICAgICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgICAgIHN1cGVyKGlkLCBSZW5kZXJTY3JpcHRHTC50aGlzKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TYW1wbGVyLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YQppbmRleCA0MGJhNzIyLi4zNDNmY2RiIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NhbXBsZXIuamF2YQpAQCAtNDcsMTAgKzQ3LDgyIEBACiAgICAgfQogCiAgICAgU2FtcGxlcihpbnQgaWQsIFJlbmRlclNjcmlwdCBycykgewotICAgICAgICBzdXBlcihycyk7Ci0gICAgICAgIG1JRCA9IGlkOworICAgICAgICBzdXBlcihpZCwgcnMpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBDTEFNUF9ORUFSRVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9DTEFNUF9ORUFSRVNUID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLk5FQVJFU1QpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTkVBUkVTVCA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX05FQVJFU1Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIENMQU1QX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfQ0xBTVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRXcmFwUyhWYWx1ZS5DTEFNUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgQ0xBTVBfTElORUFSX01JUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX0NMQU1QX0xJTkVBUl9NSVBfTElORUFSID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzKTsKKyAgICAgICAgICAgIGIuc2V0TWluKFZhbHVlLkxJTkVBUl9NSVBfTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLkNMQU1QKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFQoVmFsdWUuQ0xBTVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfQ0xBTVBfTElORUFSX01JUF9MSU5FQVIgPSBiLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBycy5tU2FtcGxlcl9DTEFNUF9MSU5FQVJfTUlQX0xJTkVBUjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNhbXBsZXIgV1JBUF9ORUFSRVNUKFJlbmRlclNjcmlwdCBycykgeworICAgICAgICBpZihycy5tU2FtcGxlcl9XUkFQX05FQVJFU1QgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTkVBUkVTVCk7CisgICAgICAgICAgICBiLnNldE1hZyhWYWx1ZS5ORUFSRVNUKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9ORUFSRVNUID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9ORUFSRVNUOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2FtcGxlciBXUkFQX0xJTkVBUihSZW5kZXJTY3JpcHQgcnMpIHsKKyAgICAgICAgaWYocnMubVNhbXBsZXJfV1JBUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0TWFnKFZhbHVlLkxJTkVBUik7CisgICAgICAgICAgICBiLnNldFdyYXBTKFZhbHVlLldSQVApOworICAgICAgICAgICAgYi5zZXRXcmFwVChWYWx1ZS5XUkFQKTsKKyAgICAgICAgICAgIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSID0gYi5jcmVhdGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnMubVNhbXBsZXJfV1JBUF9MSU5FQVI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTYW1wbGVyIFdSQVBfTElORUFSX01JUF9MSU5FQVIoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIGlmKHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVIgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVpbGRlciBiID0gbmV3IEJ1aWxkZXIocnMpOworICAgICAgICAgICAgYi5zZXRNaW4oVmFsdWUuTElORUFSX01JUF9MSU5FQVIpOworICAgICAgICAgICAgYi5zZXRNYWcoVmFsdWUuTElORUFSKTsKKyAgICAgICAgICAgIGIuc2V0V3JhcFMoVmFsdWUuV1JBUCk7CisgICAgICAgICAgICBiLnNldFdyYXBUKFZhbHVlLldSQVApOworICAgICAgICAgICAgcnMubVNhbXBsZXJfV1JBUF9MSU5FQVJfTUlQX0xJTkVBUiA9IGIuY3JlYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJzLm1TYW1wbGVyX1dSQVBfTElORUFSX01JUF9MSU5FQVI7CisgICAgfQorCisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewogICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwogICAgICAgICBWYWx1ZSBtTWluOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0LmphdmEKaW5kZXggNTdjY2ZhMy4uMTljNDQ0YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdC5qYXZhCkBAIC00MiwyOSArNDIsNDYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCkgeworICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGludm9rZShpbnQgc2xvdCwgRmllbGRQYWNrZXIgdikgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZVYobUlELCBzbG90LCB2LmdldERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEludm9rZShtSUQsIHNsb3QpOworICAgICAgICB9CisgICAgfQorCisKICAgICBTY3JpcHQoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBiaW5kQWxsb2NhdGlvbihBbGxvY2F0aW9uIHZhLCBpbnQgc2xvdCkgewogICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRCaW5kQWxsb2NhdGlvbihtSUQsIHZhLm1JRCwgc2xvdCk7CisgICAgICAgIGlmICh2YSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMublNjcmlwdEJpbmRBbGxvY2F0aW9uKG1JRCwgdmEubUlELCBzbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SUy5uU2NyaXB0QmluZEFsbG9jYXRpb24obUlELCAwLCBzbG90KTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldENsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgbVJTLm5TY3JpcHRTZXRDbGVhckNvbG9yKG1JRCwgciwgZywgYiwgYSk7CisgICAgcHVibGljIHZvaWQgc2V0VmFyKGludCBpbmRleCwgZmxvYXQgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckYobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJEZXB0aChmbG9hdCBkKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyRGVwdGgobUlELCBkKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBpbnQgdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckkobUlELCBpbmRleCwgdik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2xlYXJTdGVuY2lsKGludCBzdGVuY2lsKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNjcmlwdFNldENsZWFyU3RlbmNpbChtSUQsIHN0ZW5jaWwpOworICAgIHB1YmxpYyB2b2lkIHNldFZhcihpbnQgaW5kZXgsIGJvb2xlYW4gdikgeworICAgICAgICBtUlMublNjcmlwdFNldFZhckkobUlELCBpbmRleCwgdiA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoaW50IGluZGV4LCBGaWVsZFBhY2tlciB2KSB7CisgICAgICAgIG1SUy5uU2NyaXB0U2V0VmFyVihtSUQsIGluZGV4LCB2LmdldERhdGEoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoU3RyaW5nIHRpbWVab25lKSB7CkBAIC03OCw3MiArOTUsNTQgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CiAgICAgICAgIFJlbmRlclNjcmlwdCBtUlM7Ci0gICAgICAgIGJvb2xlYW4gbUlzUm9vdCA9IGZhbHNlOwotICAgICAgICBUeXBlW10gbVR5cGVzOwotICAgICAgICBTdHJpbmdbXSBtTmFtZXM7Ci0gICAgICAgIGJvb2xlYW5bXSBtV3JpdGFibGU7Ci0gICAgICAgIGludCBtSW52b2thYmxlQ291bnQgPSAwOwotICAgICAgICBJbnZva2FibGVbXSBtSW52b2thYmxlczsKIAogICAgICAgICBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVHlwZXMgPSBuZXcgVHlwZVtNQVhfU0xPVF07Ci0gICAgICAgICAgICBtTmFtZXMgPSBuZXcgU3RyaW5nW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1Xcml0YWJsZSA9IG5ldyBib29sZWFuW01BWF9TTE9UXTsKLSAgICAgICAgICAgIG1JbnZva2FibGVzID0gbmV3IEludm9rYWJsZVtNQVhfU0xPVF07CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFR5cGUgdCwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1UeXBlc1tzbG90XSA9IHQ7Ci0gICAgICAgICAgICBtTmFtZXNbc2xvdF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHQsIFN0cmluZyBuYW1lLCBpbnQgc2xvdCkgewotICAgICAgICAgICAgbVR5cGVzW3Nsb3RdID0gdDsKLSAgICAgICAgICAgIG1OYW1lc1tzbG90XSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2thYmxlIGFkZEludm9rYWJsZShTdHJpbmcgZnVuYykgewotICAgICAgICAgICAgSW52b2thYmxlIGkgPSBuZXcgSW52b2thYmxlKCk7Ci0gICAgICAgICAgICBpLm1OYW1lID0gZnVuYzsKLSAgICAgICAgICAgIGkubVJTID0gbVJTOwotICAgICAgICAgICAgaS5tU2xvdCA9IG1JbnZva2FibGVDb3VudDsKLSAgICAgICAgICAgIG1JbnZva2FibGVzW21JbnZva2FibGVDb3VudCsrXSA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoYm9vbGVhbiB3cml0YWJsZSwgaW50IHNsb3QpIHsKLSAgICAgICAgICAgIG1Xcml0YWJsZVtzbG90XSA9IHdyaXRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB0cmFuc2ZlckNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0Um9vdChtSXNSb290KTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtVHlwZXMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYobVR5cGVzW2N0XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SUy5uU2NyaXB0U2V0VHlwZShtVHlwZXNbY3RdLm1JRCwgbVdyaXRhYmxlW2N0XSwgbU5hbWVzW2N0XSwgY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtSW52b2thYmxlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBtUlMublNjcmlwdFNldEludm9rYWJsZShtSW52b2thYmxlc1tjdF0ubU5hbWUsIGN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdHJhbnNmZXJPYmplY3QoU2NyaXB0IHMpIHsKLSAgICAgICAgICAgIHMubUlzUm9vdCA9IG1Jc1Jvb3Q7Ci0gICAgICAgICAgICBzLm1UeXBlcyA9IG1UeXBlczsKLSAgICAgICAgICAgIHMubUludm9rYWJsZXMgPSBuZXcgSW52b2thYmxlW21JbnZva2FibGVDb3VudF07Ci0gICAgICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUludm9rYWJsZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0gPSBtSW52b2thYmxlc1tjdF07Ci0gICAgICAgICAgICAgICAgcy5tSW52b2thYmxlc1tjdF0ubVNjcmlwdCA9IHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLm1JbnZva2FibGVzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJvb3QoYm9vbGVhbiByKSB7Ci0gICAgICAgICAgICBtSXNSb290ID0gcjsKLSAgICAgICAgfQotCiAgICAgfQogCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpZWxkQmFzZSB7CisgICAgICAgIHByb3RlY3RlZCBFbGVtZW50IG1FbGVtZW50OworICAgICAgICBwcm90ZWN0ZWQgVHlwZSBtVHlwZTsKKyAgICAgICAgcHJvdGVjdGVkIEFsbG9jYXRpb24gbUFsbG9jYXRpb247CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdChSZW5kZXJTY3JpcHQgcnMsIGludCBkaW14KSB7CisgICAgICAgICAgICBtQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQocnMsIG1FbGVtZW50LCBkaW14KTsKKyAgICAgICAgICAgIG1UeXBlID0gbUFsbG9jYXRpb24uZ2V0VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEZpZWxkQmFzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVsZW1lbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFsbG9jYXRpb24oKSB7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8qCisgICAgICAgIHB1YmxpYyBjbGFzcyBTY3JpcHRGaWVsZF9Vc2VyRmllbGQKKyAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZSB7CisKKyAgICAgICAgICAgIHByb3RlY3RlZAorCisgICAgICAgIH0KKworICAgICAgICAqLworCisgICAgfQogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1NjcmlwdEMuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCmluZGV4IGJiOTllMjMuLjU5NTliZTQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2NyaXB0Qy5qYXZhCkBAIC0zNywxMSArMzcsNDkgQEAKICAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgU2NyaXB0QyhSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlELCBib29sZWFuIGlzUm9vdCkgeworICAgICAgICBzdXBlcigwLCBycyk7CisgICAgICAgIG1JRCA9IGludGVybmFsQ3JlYXRlKHJzLCByZXNvdXJjZXMsIHJlc291cmNlSUQpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBpbnRlcm5hbENyZWF0ZShSZW5kZXJTY3JpcHQgcnMsIFJlc291cmNlcyByZXNvdXJjZXMsIGludCByZXNvdXJjZUlEKSB7CisgICAgICAgIGJ5dGVbXSBwZ207CisgICAgICAgIGludCBwZ21MZW5ndGg7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVzb3VyY2VzLm9wZW5SYXdSZXNvdXJjZShyZXNvdXJjZUlEKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGdtID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgcGdtTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBieXRlc0xlZnQgPSBwZ20ubGVuZ3RoIC0gcGdtTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYyID0gbmV3IGJ5dGVbcGdtLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZ20sIDAsIGJ1ZjIsIDAsIHBnbS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGdtID0gYnVmMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IHBnbS5sZW5ndGggLSBwZ21MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlzLnJlYWQocGdtLCBwZ21MZW5ndGgsIGJ5dGVzTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGdtTGVuZ3RoICs9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcnMublNjcmlwdENCZWdpbigpOworICAgICAgICBycy5uU2NyaXB0Q1NldFNjcmlwdChwZ20sIDAsIHBnbUxlbmd0aCk7CisgICAgICAgIHJldHVybiBycy5uU2NyaXB0Q0NyZWF0ZSgpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNjcmlwdC5CdWlsZGVyIHsKICAgICAgICAgYnl0ZVtdIG1Qcm9ncmFtOwogICAgICAgICBpbnQgbVByb2dyYW1MZW5ndGg7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLEludGVnZXI+IG1JbnREZWZpbmVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsRmxvYXQ+IG1GbG9hdERlZmluZXMgPSBuZXcgSGFzaE1hcCgpOwogCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewogICAgICAgICAgICAgc3VwZXIocnMpOwpAQCAtOTIsNjYgKzEzMCwyMCBAQAogCiAgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU2NyaXB0QyBpbnRlcm5hbENyZWF0ZShCdWlsZGVyIGIpIHsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDQmVnaW4oKTsKLSAgICAgICAgICAgIGIudHJhbnNmZXJDcmVhdGUoKTsKIAotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsSW50ZWdlcj4gZTogYi5tSW50RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVJMzIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsRmxvYXQ+IGU6IGIubUZsb2F0RGVmaW5lcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYi5tUlMublNjcmlwdENBZGREZWZpbmVGKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5mbG9hdFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoInJzIiwgImxlbiA9ICIgKyBiLm1Qcm9ncmFtTGVuZ3RoKTsKICAgICAgICAgICAgIGIubVJTLm5TY3JpcHRDU2V0U2NyaXB0KGIubVByb2dyYW0sIDAsIGIubVByb2dyYW1MZW5ndGgpOwogCiAgICAgICAgICAgICBpbnQgaWQgPSBiLm1SUy5uU2NyaXB0Q0NyZWF0ZSgpOwogICAgICAgICAgICAgU2NyaXB0QyBvYmogPSBuZXcgU2NyaXB0QyhpZCwgYi5tUlMpOwotICAgICAgICAgICAgYi50cmFuc2Zlck9iamVjdChvYmopOwotCiAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBtRmxvYXREZWZpbmVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGFrZXMgdGhlIGFsbCBwdWJsaWMgc3RhdGljIGZpbmFsIGZpZWxkcyBmb3IgYSBjbGFzcywgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKENsYXNzIGNsKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKGNsLmdldEZpZWxkcygpLCAoTW9kaWZpZXIuU1RBVElDIHwgTW9kaWZpZXIuRklOQUwgfCBNb2RpZmllci5QVUJMSUMpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWtlcyB0aGUgYWxsIHB1YmxpYyBmaWVsZHMgZm9yIGFuIG9iamVjdCwgYW5kIGFkZHMgZGVmaW5lcwotICAgICAgICAgKiBmb3IgdGhlbSwgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmVzKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBhZGREZWZpbmVzKG8uZ2V0Q2xhc3MoKS5nZXRGaWVsZHMoKSwgTW9kaWZpZXIuUFVCTElDLCBvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYWRkRGVmaW5lcyhGaWVsZFtdIGZpZWxkcywgaW50IG1hc2ssIE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBmb3IgKEZpZWxkIGY6IGZpZWxkcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZi5nZXRNb2RpZmllcnMoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHQgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IGludC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnREZWZpbmVzLnB1dChmLmdldE5hbWUoKSwgZi5nZXRJbnQobykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbG9hdERlZmluZXMucHV0KGYuZ2V0TmFtZSgpLCBmLmdldEZsb2F0KG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugd2FudCB0aGlzIGxvZz8KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkRGVmaW5lcyBza2lwcGluZyBmaWVsZCAiICsgZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBhZGREZWZpbmUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhDbGFzcyBjbCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYWRkRGVmaW5lcyhPYmplY3Qgbykge30KKyAgICAgICAgdm9pZCBhZGREZWZpbmVzKEZpZWxkW10gZmllbGRzLCBpbnQgbWFzaywgT2JqZWN0IG8pIHt9CiAKICAgICAgICAgcHVibGljIFNjcmlwdEMgY3JlYXRlKCkgewogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsQ3JlYXRlKHRoaXMpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ODAxZgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuTWF0aDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKKy8qKgorICogQGhpZGUKKyAqCisgKiovCitwdWJsaWMgY2xhc3MgU2hvcnQyIHsKKyAgICBwdWJsaWMgU2hvcnQyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCB4OworICAgIHB1YmxpYyBzaG9ydCB5OworfQorCisKKworCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0My5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjljMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaG9ydDMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKKworaW1wb3J0IGphdmEubGFuZy5NYXRoOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworLyoqCisgKiBAaGlkZQorICoKKyAqKi8KK3B1YmxpYyBjbGFzcyBTaG9ydDMgeworICAgIHB1YmxpYyBTaG9ydDMoKSB7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IHg7CisgICAgcHVibGljIHNob3J0IHk7CisgICAgcHVibGljIHNob3J0IHo7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2hvcnQ0LmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDc0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1Nob3J0NC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OworCitpbXBvcnQgamF2YS5sYW5nLk1hdGg7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCisvKioKKyAqIEBoaWRlCisgKgorICoqLworcHVibGljIGNsYXNzIFNob3J0NCB7CisgICAgcHVibGljIFNob3J0NCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgeDsKKyAgICBwdWJsaWMgc2hvcnQgeTsKKyAgICBwdWJsaWMgc2hvcnQgejsKKyAgICBwdWJsaWMgc2hvcnQgdzsKK30KKworCisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvU2ltcGxlTWVzaC5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjE3YTkuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9TaW1wbGVNZXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTWVzaCBleHRlbmRzIEJhc2VPYmogewotICAgIFR5cGVbXSBtVmVydGV4VHlwZXM7Ci0gICAgVHlwZSBtSW5kZXhUeXBlOwotICAgIC8vVHlwZSBtQmF0Y2hlVHlwZTsKLSAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKLQotICAgIFNpbXBsZU1lc2goaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiaW5kVmVydGV4QWxsb2NhdGlvbihBbGxvY2F0aW9uIGEsIGludCBzbG90KSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNpbXBsZU1lc2hCaW5kVmVydGV4KG1JRCwgYS5tSUQsIHNsb3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJpbmRJbmRleEFsbG9jYXRpb24oQWxsb2NhdGlvbiBhKSB7Ci0gICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMublNpbXBsZU1lc2hCaW5kSW5kZXgobUlELCBhLm1JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG9jYXRpb24gY3JlYXRlVmVydGV4QWxsb2NhdGlvbihpbnQgc2xvdCkgewotICAgICAgICBtUlMudmFsaWRhdGUoKTsKLSAgICAgICAgcmV0dXJuIEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtVmVydGV4VHlwZXNbc2xvdF0pOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvY2F0aW9uIGNyZWF0ZUluZGV4QWxsb2NhdGlvbigpIHsKLSAgICAgICAgbVJTLnZhbGlkYXRlKCk7Ci0gICAgICAgIHJldHVybiBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbUluZGV4VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VmVydGV4VHlwZShpbnQgc2xvdCkgewotICAgICAgICByZXR1cm4gbVZlcnRleFR5cGVzW3Nsb3RdOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldEluZGV4VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbmRleFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgUmVuZGVyU2NyaXB0IG1SUzsKLQotICAgICAgICBjbGFzcyBFbnRyeSB7Ci0gICAgICAgICAgICBUeXBlIHQ7Ci0gICAgICAgICAgICBFbGVtZW50IGU7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtVmVydGV4VHlwZUNvdW50OwotICAgICAgICBFbnRyeVtdIG1WZXJ0ZXhUeXBlczsKLSAgICAgICAgRW50cnkgbUluZGV4VHlwZTsKLSAgICAgICAgLy9FbnRyeSBtQmF0Y2hUeXBlOwotICAgICAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKLQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFJlbmRlclNjcmlwdCBycykgewotICAgICAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZUNvdW50ID0gMDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlcyA9IG5ldyBFbnRyeVsxNl07Ci0gICAgICAgICAgICBtSW5kZXhUeXBlID0gbmV3IEVudHJ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGFkZFZlcnRleFR5cGUoVHlwZSB0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChtVmVydGV4VHlwZUNvdW50ID49IG1WZXJ0ZXhUeXBlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNYXggdmVydGV4IHR5cGVzIGV4Y2VlZGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYWRkZWRJbmRleCA9IG1WZXJ0ZXhUeXBlQ291bnQ7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbbVZlcnRleFR5cGVDb3VudF0gPSBuZXcgRW50cnkoKTsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XS50ID0gdDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBhZGRlZEluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhZGRWZXJ0ZXhUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG1WZXJ0ZXhUeXBlQ291bnQgPj0gbVZlcnRleFR5cGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1heCB2ZXJ0ZXggdHlwZXMgZXhjZWVkZWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhZGRlZEluZGV4ID0gbVZlcnRleFR5cGVDb3VudDsKLSAgICAgICAgICAgIG1WZXJ0ZXhUeXBlc1ttVmVydGV4VHlwZUNvdW50XSA9IG5ldyBFbnRyeSgpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLmUgPSBlOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW21WZXJ0ZXhUeXBlQ291bnRdLnNpemUgPSBzaXplOwotICAgICAgICAgICAgbVZlcnRleFR5cGVDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIGFkZGVkSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmRleFR5cGUoVHlwZSB0KSB7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnQgPSB0OwotICAgICAgICAgICAgbUluZGV4VHlwZS5lID0gbnVsbDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuc2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmRleFR5cGUoRWxlbWVudCBlLCBpbnQgc2l6ZSkgewotICAgICAgICAgICAgbUluZGV4VHlwZS50ID0gbnVsbDsKLSAgICAgICAgICAgIG1JbmRleFR5cGUuZSA9IGU7Ci0gICAgICAgICAgICBtSW5kZXhUeXBlLnNpemUgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UHJpbWl0aXZlKFByaW1pdGl2ZSBwKSB7Ci0gICAgICAgICAgICBtUHJpbWl0aXZlID0gcDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgVHlwZSBuZXdUeXBlKEVsZW1lbnQgZSwgaW50IHNpemUpIHsKLSAgICAgICAgICAgIFR5cGUuQnVpbGRlciB0YiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLCBlKTsKLSAgICAgICAgICAgIHRiLmFkZChEaW1lbnNpb24uWCwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGIuY3JlYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIFNpbXBsZU1lc2ggaW50ZXJuYWxDcmVhdGUoUmVuZGVyU2NyaXB0IHJzLCBCdWlsZGVyIGIpIHsKLSAgICAgICAgICAgIFR5cGVbXSB0b0Rlc3Ryb3kgPSBuZXcgVHlwZVsxOF07Ci0gICAgICAgICAgICBpbnQgdG9EZXN0cm95Q291bnQgPSAwOwotCi0gICAgICAgICAgICBpbnQgaW5kZXhJRCA9IDA7Ci0gICAgICAgICAgICBpZiAoYi5tSW5kZXhUeXBlLnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZGV4SUQgPSBiLm1JbmRleFR5cGUudC5tSUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGIubUluZGV4VHlwZS5zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBiLm1JbmRleFR5cGUudCA9IGIubmV3VHlwZShiLm1JbmRleFR5cGUuZSwgYi5tSW5kZXhUeXBlLnNpemUpOwotICAgICAgICAgICAgICAgIGluZGV4SUQgPSBiLm1JbmRleFR5cGUudC5tSUQ7Ci0gICAgICAgICAgICAgICAgdG9EZXN0cm95W3RvRGVzdHJveUNvdW50KytdID0gYi5tSW5kZXhUeXBlLnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludFtdIElEcyA9IG5ldyBpbnRbYi5tVmVydGV4VHlwZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBiLm1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYi5tVmVydGV4VHlwZXNbY3RdLnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJRHNbY3RdID0gYi5tVmVydGV4VHlwZXNbY3RdLnQubUlEOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGIubVZlcnRleFR5cGVzW2N0XS50ID0gYi5uZXdUeXBlKGIubVZlcnRleFR5cGVzW2N0XS5lLCBiLm1WZXJ0ZXhUeXBlc1tjdF0uc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIElEc1tjdF0gPSBiLm1WZXJ0ZXhUeXBlc1tjdF0udC5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIHRvRGVzdHJveVt0b0Rlc3Ryb3lDb3VudCsrXSA9IGIubVZlcnRleFR5cGVzW2N0XS50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGlkID0gcnMublNpbXBsZU1lc2hDcmVhdGUoMCwgaW5kZXhJRCwgSURzLCBiLm1QcmltaXRpdmUubUlEKTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCB0b0Rlc3Ryb3lDb3VudDsgY3QrKykgewotICAgICAgICAgICAgICAgIHRvRGVzdHJveVtjdF0uZGVzdHJveSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1lc2goaWQsIHJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTaW1wbGVNZXNoIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICAgICAgU2ltcGxlTWVzaCBzbSA9IGludGVybmFsQ3JlYXRlKG1SUywgdGhpcyk7Ci0gICAgICAgICAgICBzbS5tVmVydGV4VHlwZXMgPSBuZXcgVHlwZVttVmVydGV4VHlwZUNvdW50XTsKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBtVmVydGV4VHlwZUNvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgc20ubVZlcnRleFR5cGVzW2N0XSA9IG1WZXJ0ZXhUeXBlc1tjdF0udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNtLm1JbmRleFR5cGUgPSBtSW5kZXhUeXBlLnQ7Ci0gICAgICAgICAgICBzbS5tUHJpbWl0aXZlID0gbVByaW1pdGl2ZTsKLSAgICAgICAgICAgIHJldHVybiBzbTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpYW5nbGVNZXNoQnVpbGRlciB7Ci0gICAgICAgIGZsb2F0IG1WdHhEYXRhW107Ci0gICAgICAgIGludCBtVnR4Q291bnQ7Ci0gICAgICAgIHNob3J0IG1JbmRleERhdGFbXTsKLSAgICAgICAgaW50IG1JbmRleENvdW50OwotICAgICAgICBSZW5kZXJTY3JpcHQgbVJTOwotICAgICAgICBFbGVtZW50IG1FbGVtZW50OwotCi0gICAgICAgIGZsb2F0IG1OWCA9IDA7Ci0gICAgICAgIGZsb2F0IG1OWSA9IDA7Ci0gICAgICAgIGZsb2F0IG1OWiA9IC0xOwotICAgICAgICBmbG9hdCBtUzAgPSAwOwotICAgICAgICBmbG9hdCBtVDAgPSAwOwotICAgICAgICBmbG9hdCBtUiA9IDE7Ci0gICAgICAgIGZsb2F0IG1HID0gMTsKLSAgICAgICAgZmxvYXQgbUIgPSAxOwotICAgICAgICBmbG9hdCBtQSA9IDE7Ci0KLSAgICAgICAgaW50IG1WdHhTaXplOwotICAgICAgICBpbnQgbUZsYWdzOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTE9SID0gMHgwMDAxOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAweDAwMDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfMCA9IDB4MDEwMDsKLQotICAgICAgICBwdWJsaWMgVHJpYW5nbGVNZXNoQnVpbGRlcihSZW5kZXJTY3JpcHQgcnMsIGludCB2dHhTaXplLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIG1SUyA9IHJzOwotICAgICAgICAgICAgbVZ0eENvdW50ID0gMDsKLSAgICAgICAgICAgIG1JbmRleENvdW50ID0gMDsKLSAgICAgICAgICAgIG1WdHhEYXRhID0gbmV3IGZsb2F0WzEyOF07Ci0gICAgICAgICAgICBtSW5kZXhEYXRhID0gbmV3IHNob3J0WzEyOF07Ci0gICAgICAgICAgICBtVnR4U2l6ZSA9IHZ0eFNpemU7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICAgICAgaWYgKHZ0eFNpemUgPCAyIHx8IHZ0eFNpemUgPiAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmVydGV4IHNpemUgb3V0IG9mIHJhbmdlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1ha2VTcGFjZShpbnQgY291bnQpIHsKLSAgICAgICAgICAgIGlmICgobVZ0eENvdW50ICsgY291bnQpID49IG1WdHhEYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHRbXSA9IG5ldyBmbG9hdFttVnR4RGF0YS5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1WdHhEYXRhLCAwLCB0LCAwLCBtVnR4RGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhID0gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsYXRjaCgpIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgQ09MT1IpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoNCk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVI7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUc7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUI7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbUE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIFRFWFRVUkVfMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtUzA7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbVQwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtYWtlU3BhY2UoMyk7Ci0gICAgICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0gbU5YOwotICAgICAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IG1OWTsKLSAgICAgICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSBtTlo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSkgewotICAgICAgICAgICAgaWYgKG1WdHhTaXplICE9IDIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ha2VTcGFjZSgyKTsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHg7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB5OwotICAgICAgICAgICAgbGF0Y2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgICBpZiAobVZ0eFNpemUgIT0gMykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFkZCBtaXN0bWF0Y2ggd2l0aCBkZWNsYXJlZCBjb21wb25lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFrZVNwYWNlKDMpOwotICAgICAgICAgICAgbVZ0eERhdGFbbVZ0eENvdW50KytdID0geDsKLSAgICAgICAgICAgIG1WdHhEYXRhW21WdHhDb3VudCsrXSA9IHk7Ci0gICAgICAgICAgICBtVnR4RGF0YVttVnR4Q291bnQrK10gPSB6OwotICAgICAgICAgICAgbGF0Y2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoZmxvYXQgcywgZmxvYXQgdCkgewotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJhZGQgbWlzdG1hdGNoIHdpdGggZGVjbGFyZWQgY29tcG9uZW50cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TMCA9IHM7Ci0gICAgICAgICAgICBtVDAgPSB0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKLSAgICAgICAgICAgIGlmICgobUZsYWdzICYgTk9STUFMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTlggPSB4OwotICAgICAgICAgICAgbU5ZID0geTsKLSAgICAgICAgICAgIG1OWiA9IHo7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYWRkIG1pc3RtYXRjaCB3aXRoIGRlY2xhcmVkIGNvbXBvbmVudHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUiA9IHI7Ci0gICAgICAgICAgICBtRyA9IGc7Ci0gICAgICAgICAgICBtQiA9IGI7Ci0gICAgICAgICAgICBtQSA9IGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUcmlhbmdsZShpbnQgaWR4MSwgaW50IGlkeDIsIGludCBpZHgzKSB7Ci0gICAgICAgICAgICBpZigoaWR4MSA+PSBtVnR4Q291bnQpIHx8IChpZHgxIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChpZHgyID49IG1WdHhDb3VudCkgfHwgKGlkeDIgPCAwKSB8fAotICAgICAgICAgICAgICAgKGlkeDMgPj0gbVZ0eENvdW50KSB8fCAoaWR4MyA8IDApKSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbmRleCBwcm92aWRlZCBncmVhdGVyIHRoYW4gdmVydGV4IGNvdW50LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtSW5kZXhDb3VudCArIDMpID49IG1JbmRleERhdGEubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgdFtdID0gbmV3IHNob3J0W21JbmRleERhdGEubGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSW5kZXhEYXRhLCAwLCB0LCAwLCBtSW5kZXhEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbUluZGV4RGF0YSA9IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDE7Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDI7Ci0gICAgICAgICAgICBtSW5kZXhEYXRhW21JbmRleENvdW50KytdID0gKHNob3J0KWlkeDM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2ltcGxlTWVzaCBjcmVhdGUoKSB7Ci0gICAgICAgICAgICBFbGVtZW50LkJ1aWxkZXIgYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgICAgIGludCBmbG9hdENvdW50ID0gbVZ0eFNpemU7Ci0gICAgICAgICAgICBiLmFkZChFbGVtZW50LmNyZWF0ZUF0dHJpYihtUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WdHhTaXplKSwgInBvc2l0aW9uIik7Ci0gICAgICAgICAgICBpZiAoKG1GbGFncyAmIENPTE9SKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRDb3VudCArPSA0OwotICAgICAgICAgICAgICAgIGIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YUtpbmQuQ09MT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCksICJjb2xvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBURVhUVVJFXzApICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDI7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5URVhUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpLCAidGV4dHVyZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBOT1JNQUwpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdENvdW50ICs9IDM7Ci0gICAgICAgICAgICAgICAgYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudC5EYXRhS2luZC5OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyksICJub3JtYWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbGVtZW50ID0gYi5jcmVhdGUoKTsKLQotICAgICAgICAgICAgQnVpbGRlciBzbWIgPSBuZXcgQnVpbGRlcihtUlMpOwotICAgICAgICAgICAgc21iLmFkZFZlcnRleFR5cGUobUVsZW1lbnQsIG1WdHhDb3VudCAvIGZsb2F0Q291bnQpOwotICAgICAgICAgICAgc21iLnNldEluZGV4VHlwZShFbGVtZW50LmNyZWF0ZUluZGV4KG1SUyksIG1JbmRleENvdW50KTsKLSAgICAgICAgICAgIHNtYi5zZXRQcmltaXRpdmUoUHJpbWl0aXZlLlRSSUFOR0xFKTsKLSAgICAgICAgICAgIFNpbXBsZU1lc2ggc20gPSBzbWIuY3JlYXRlKCk7Ci0KLSAgICAgICAgICAgIEFsbG9jYXRpb24gdmVydGV4QWxsb2MgPSBzbS5jcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKDApOwotICAgICAgICAgICAgQWxsb2NhdGlvbiBpbmRleEFsbG9jID0gc20uY3JlYXRlSW5kZXhBbGxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBzbS5iaW5kVmVydGV4QWxsb2NhdGlvbih2ZXJ0ZXhBbGxvYywgMCk7Ci0gICAgICAgICAgICBzbS5iaW5kSW5kZXhBbGxvY2F0aW9uKGluZGV4QWxsb2MpOwotCi0gICAgICAgICAgICB2ZXJ0ZXhBbGxvYy5kYXRhKG1WdHhEYXRhKTsKLSAgICAgICAgICAgIHZlcnRleEFsbG9jLnVwbG9hZFRvQnVmZmVyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIGluZGV4QWxsb2MuZGF0YShtSW5kZXhEYXRhKTsKLSAgICAgICAgICAgIGluZGV4QWxsb2MudXBsb2FkVG9CdWZmZXJPYmplY3QoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNtOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCmluZGV4IDYyZDM4NjcuLjBiM2RiNjkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCkBAIC0xNiw3ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7CiAKKwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgogICogQGhpZGUKQEAgLTMxLDcgKzMzLDYgQEAKICAgICBpbnQgbUVsZW1lbnRDb3VudDsKICAgICBFbGVtZW50IG1FbGVtZW50OwogCi0gICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUNhY2hlOwogICAgIENsYXNzIG1KYXZhQ2xhc3M7CiAKICAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewpAQCAtOTUsNjEgKzk2LDM3IEBACiAKIAogICAgIFR5cGUoaW50IGlkLCBSZW5kZXJTY3JpcHQgcnMpIHsKLSAgICAgICAgc3VwZXIocnMpOwotICAgICAgICBtSUQgPSBpZDsKLSAgICAgICAgbU5hdGl2ZUNhY2hlID0gMDsKKyAgICAgICAgc3VwZXIoaWQsIHJzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBpZihtTmF0aXZlQ2FjaGUgIT0gMCkgewotICAgICAgICAgICAgbVJTLm5UeXBlRmluYWxEZXN0cm95KHRoaXMpOwotICAgICAgICAgICAgbU5hdGl2ZUNhY2hlID0gMDsKLSAgICAgICAgfQogICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVGcm9tQ2xhc3MoUmVuZGVyU2NyaXB0IHJzLCBDbGFzcyBjLCBpbnQgc2l6ZSkgewotICAgICAgICBFbGVtZW50IGUgPSBFbGVtZW50LmNyZWF0ZUZyb21DbGFzcyhycywgYyk7Ci0gICAgICAgIEJ1aWxkZXIgYiA9IG5ldyBCdWlsZGVyKHJzLCBlKTsKLSAgICAgICAgYi5hZGQoRGltZW5zaW9uLlgsIHNpemUpOwotICAgICAgICBUeXBlIHQgPSBiLmNyZWF0ZSgpOwotICAgICAgICBlLmRlc3Ryb3koKTsKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHVwZGF0ZUZyb21OYXRpdmUoKSB7CisgICAgICAgIC8vIFdlIGhhdmUgNiBpbnRlZ2VyIHRvIG9idGFpbiBtRGltWDsgbURpbVk7IG1EaW1aOworICAgICAgICAvLyBtRGltTE9EOyBtRGltRmFjZXM7IG1FbGVtZW50OworICAgICAgICBpbnRbXSBkYXRhQnVmZmVyID0gbmV3IGludFs2XTsKKyAgICAgICAgbVJTLm5UeXBlR2V0TmF0aXZlRGF0YShtSUQsIGRhdGFCdWZmZXIpOwogCi0gICAgICAgIC8vIG5hdGl2ZSBmaWVsZHMKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaW50W10gYXJUeXBlcyA9IG5ldyBpbnRbZmllbGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBpbnRbXSBhckJpdHMgPSBuZXcgaW50W2ZpZWxkcy5sZW5ndGhdOworICAgICAgICBtRGltWCA9IGRhdGFCdWZmZXJbMF07CisgICAgICAgIG1EaW1ZID0gZGF0YUJ1ZmZlclsxXTsKKyAgICAgICAgbURpbVogPSBkYXRhQnVmZmVyWzJdOworICAgICAgICBtRGltTE9EID0gZGF0YUJ1ZmZlclszXSA9PSAxID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBtRGltRmFjZXMgPSBkYXRhQnVmZmVyWzRdID09IDEgPyB0cnVlIDogZmFsc2U7CiAKLSAgICAgICAgICAgIGZvcihpbnQgY3Q9MDsgY3QgPCBmaWVsZHMubGVuZ3RoOyBjdCsrKSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgZiA9IGZpZWxkc1tjdF07Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZmMgPSBmLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZihmYyA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAzMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8xNi5tSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGFyQml0c1tjdF0gPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBhclR5cGVzW2N0XSA9IEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzgubUlEOwotICAgICAgICAgICAgICAgICAgICBhckJpdHNbY3RdID0gODsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZmMgPT0gZmxvYXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJUeXBlc1tjdF0gPSBFbGVtZW50LkRhdGFUeXBlLkZMT0FUXzMyLm1JRDsKLSAgICAgICAgICAgICAgICAgICAgYXJCaXRzW2N0XSA9IDMyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua293biBmaWVsZCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnMublR5cGVTZXR1cEZpZWxkcyh0LCBhclR5cGVzLCBhckJpdHMsIGZpZWxkcyk7CisgICAgICAgIGludCBlbGVtZW50SUQgPSBkYXRhQnVmZmVyWzVdOworICAgICAgICBpZihlbGVtZW50SUQgIT0gMCkgeworICAgICAgICAgICAgbUVsZW1lbnQgPSBuZXcgRWxlbWVudChlbGVtZW50SUQsIG1SUyk7CisgICAgICAgICAgICBtRWxlbWVudC51cGRhdGVGcm9tTmF0aXZlKCk7CiAgICAgICAgIH0KLSAgICAgICAgdC5tSmF2YUNsYXNzID0gYzsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGNhbGNFbGVtZW50Q291bnQoKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFR5cGUgY3JlYXRlRnJvbUNsYXNzKFJlbmRlclNjcmlwdCBycywgQ2xhc3MgYywgaW50IHNpemUsIFN0cmluZyBzY3JpcHROYW1lKSB7Ci0gICAgICAgIFR5cGUgdCA9IGNyZWF0ZUZyb21DbGFzcyhycywgYywgc2l6ZSk7Ci0gICAgICAgIHQuc2V0TmFtZShzY3JpcHROYW1lKTsKLSAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cuZSgiUmVuZGVyU2NyaXB0IiwgIkNhbGxpbmcgZGVwcmljYXRlZCBjcmVhdGVGcm9tQ2xhc3MiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yMmYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZDU3ZmEuLjAwMDAwMDAKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IyZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5yZW5kZXJzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0KLS8qKgotICogQGhpZGUKLSAqCi0gKiovCi1wdWJsaWMgY2xhc3MgVmVjdG9yMmYgewotICAgIHB1YmxpYyBWZWN0b3IyZigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgeDsKLSAgICBwdWJsaWMgZmxvYXQgeTsKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9WZWN0b3IzZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg0MmYzLi4wMDAwMDAwCi0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yM2YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucmVuZGVyc2NyaXB0OwotCi1pbXBvcnQgamF2YS5sYW5nLk1hdGg7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotCi0vKioKLSAqIEBoaWRlCi0gKgotICoqLwotcHVibGljIGNsYXNzIFZlY3RvcjNmIHsKLSAgICBwdWJsaWMgVmVjdG9yM2YoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IHg7Ci0gICAgcHVibGljIGZsb2F0IHk7Ci0gICAgcHVibGljIGZsb2F0IHo7Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVmVjdG9yNGYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiZDk1OS4uMDAwMDAwMAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1ZlY3RvcjRmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnJlbmRlcnNjcmlwdDsKLQotaW1wb3J0IGphdmEubGFuZy5NYXRoOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLQotLyoqCi0gKiBAaGlkZQotICoKLSAqKi8KLXB1YmxpYyBjbGFzcyBWZWN0b3I0ZiB7Ci0gICAgcHVibGljIFZlY3RvcjRmKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCB4OwotICAgIHB1YmxpYyBmbG9hdCB5OwotICAgIHB1YmxpYyBmbG9hdCB6OwotICAgIHB1YmxpYyBmbG9hdCB3OwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvam5pL0FuZHJvaWQubWsgYi9ncmFwaGljcy9qbmkvQW5kcm9pZC5tawppbmRleCA4NDc2YmUxLi40YzRhMTI4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvQW5kcm9pZC5taworKysgYi9ncmFwaGljcy9qbmkvQW5kcm9pZC5tawpAQCAtMTMsMTQgKzEzLDEzIEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAotICAgICAgICBsaWJhY2MgXAogICAgICAgICBsaWJuYXRpdmVoZWxwZXIgXAogICAgICAgICBsaWJSUyBcCiAgICAgICAgIGxpYmN1dGlscyBcCiAgICAgICAgIGxpYnNraWEgXAogICAgICAgICBsaWJ1dGlscyBcCiAgICAgICAgIGxpYnVpIFwKLSAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IAorICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcCBiL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwCmluZGV4IDQ1Y2M3MmUuLmYwN2RiZmQ4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcAorKysgYi9ncmFwaGljcy9qbmkvYW5kcm9pZF9yZW5kZXJzY3JpcHRfUmVuZGVyU2NyaXB0LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgIkpOSUhlbHAuaCIKICNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaCIKIAogI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgogI2luY2x1ZGUgPFJlbmRlclNjcmlwdEVudi5oPgpAQCAtNjksOSArNzAsNiBAQAogCiAgICAgamNsYXNzIGJpdG1hcENsYXNzID0gX2Vudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL0JpdG1hcCIpOwogICAgIGdOYXRpdmVCaXRtYXBJRCA9IF9lbnYtPkdldEZpZWxkSUQoYml0bWFwQ2xhc3MsICJtTmF0aXZlQml0bWFwIiwgIkkiKTsKLQotICAgIGpjbGFzcyB0eXBlQ2xhc3MgPSBfZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUiKTsKLSAgICBnVHlwZU5hdGl2ZUNhY2hlID0gX2Vudi0+R2V0RmllbGRJRCh0eXBlQ2xhc3MsICJtTmF0aXZlQ2FjaGUiLCAiSSIpOwogfQogCiBzdGF0aWMgdm9pZCBuSW5pdEVsZW1lbnRzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhOCwgamludCByZ2JhNDQ0NCwgamludCByZ2JhODg4OCwgamludCByZ2I1NjUpCkBAIC04NSw0MSArODMsNDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFzc2lnbk5hbWUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamJ5dGVBcnJheSBzdHIpCituQ29udGV4dEZpbmlzaChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkFzc2lnbk5hbWUsIGNvbiglcCksIG9iaiglcCkiLCBjb24sICh2b2lkICopb2JqKTsKKyAgICBMT0dfQVBJKCJuQ29udGV4dEZpbmlzaCwgY29uKCVwKSIsIGNvbik7CisgICAgcnNDb250ZXh0RmluaXNoKGNvbik7Cit9CiAKK3N0YXRpYyB2b2lkCituQXNzaWduTmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqLCBqYnl0ZUFycmF5IHN0cikKK3sKKyAgICBMT0dfQVBJKCJuQXNzaWduTmFtZSwgY29uKCVwKSwgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIHJzQXNzaWduTmFtZShjb24sICh2b2lkICopb2JqLCAoY29uc3QgY2hhciAqKWNwdHIsIGxlbik7CiAgICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoc3RyLCBjcHRyLCBKTklfQUJPUlQpOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKK3N0YXRpYyBqc3RyaW5nCituR2V0TmFtZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgb2JqKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOworICAgIExPR19BUEkoIm5HZXROYW1lLCBjb24oJXApLCBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgcnNHZXROYW1lKGNvbiwgKHZvaWQgKilvYmosICZuYW1lKTsKKyAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorbk9iakRlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaikKK3sKICAgICBMT0dfQVBJKCJuT2JqRGVzdHJveSwgY29uKCVwKSBvYmooJXApIiwgY29uLCAodm9pZCAqKW9iaik7CiAgICAgcnNPYmpEZXN0cm95KGNvbiwgKHZvaWQgKilvYmopOwogfQogCi1zdGF0aWMgdm9pZAotbk9iakRlc3Ryb3lPT0IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaikKLXsKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgZGlmZmVycyBmcm9tIG5PYmpEZXN0cm95IGluIHRoYXQgaXQgY2FsbHMgdGhlCi0gICAgLy8gc3BlY2lhbCBPdXQgT2YgQmFuZCB2ZXJzaW9uIG9mIE9iakRlc3Ryb3kgd2hpY2ggaXMgdGhyZWFkIHNhZmUuCi0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibk9iakRlc3Ryb3lPT0IsIGNvbiglcCkgb2JqKCVwKSIsIGNvbiwgKHZvaWQgKilvYmopOwotICAgIHJzT2JqRGVzdHJveU9PQihjb24sICh2b2lkICopb2JqKTsKLX0KIAogc3RhdGljIGppbnQKLW5GaWxlT3BlbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpieXRlQXJyYXkgc3RyKQorbkZpbGVPcGVuKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJ5dGVBcnJheSBzdHIpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkZpbGVPcGVuLCBjb24oJXApIiwgY29uKTsKLQogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoc3RyKTsKICAgICBqYnl0ZSAqIGNwdHIgPSAoamJ5dGUgKikgX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChzdHIsIDApOwogICAgIGppbnQgcmV0ID0gKGppbnQpcnNGaWxlT3Blbihjb24sIChjb25zdCBjaGFyICopY3B0ciwgbGVuKTsKQEAgLTE2NSw5ICsxNjUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRQcmlvcml0eShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcCkKK25Db250ZXh0U2V0UHJpb3JpdHkoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiQ29udGV4dFNldFByaW9yaXR5LCBjb24oJXApLCBwcmlvcml0eSglaSkiLCBjb24sIHApOwogICAgIHJzQ29udGV4dFNldFByaW9yaXR5KGNvbiwgcCk7CiB9CkBAIC0xNzUsMTAxICsxNzQsOTIgQEAKIAogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQorbkNvbnRleHRTZXRTdXJmYWNlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB3aWR0aCwgamludCBoZWlnaHQsIGpvYmplY3Qgd25kKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0U2V0U3VyZmFjZSwgY29uKCVwKSwgd2lkdGgoJWkpLCBoZWlnaHQoJWkpLCBzdXJmYWNlKCVwKSIsIGNvbiwgd2lkdGgsIGhlaWdodCwgKFN1cmZhY2UgKil3bmQpOwogCiAgICAgU3VyZmFjZSAqIHdpbmRvdyA9IE5VTEw7CiAgICAgaWYgKHduZCA9PSBOVUxMKSB7CiAKICAgICB9IGVsc2UgewotICAgICAgICBqY2xhc3Mgc3VyZmFjZV9jbGFzcyA9IF9lbnYtPkZpbmRDbGFzcygiYW5kcm9pZC92aWV3L1N1cmZhY2UiKTsKLSAgICAgICAgamZpZWxkSUQgc3VyZmFjZUZpZWxkSUQgPSBfZW52LT5HZXRGaWVsZElEKHN1cmZhY2VfY2xhc3MsIEFORFJPSURfVklFV19TVVJGQUNFX0pOSV9JRCwgIkkiKTsKLSAgICAgICAgd2luZG93ID0gKFN1cmZhY2UqKV9lbnYtPkdldEludEZpZWxkKHduZCwgc3VyZmFjZUZpZWxkSUQpOworICAgICAgICB3aW5kb3cgPSAoU3VyZmFjZSopIGFuZHJvaWRfU3VyZmFjZV9nZXROYXRpdmVXaW5kb3coX2Vudiwgd25kKS5nZXQoKTsKICAgICB9CiAKICAgICByc0NvbnRleHRTZXRTdXJmYWNlKGNvbiwgd2lkdGgsIGhlaWdodCwgd2luZG93KTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0RGVzdHJveShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgY29uKQorbkNvbnRleHREZXN0cm95KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBMT0dfQVBJKCJuQ29udGV4dERlc3Ryb3ksIGNvbiglcCkiLCAoUnNDb250ZXh0KWNvbik7Ci0gICAgcnNDb250ZXh0RGVzdHJveSgoUnNDb250ZXh0KWNvbik7CisgICAgTE9HX0FQSSgibkNvbnRleHREZXN0cm95LCBjb24oJXApIiwgY29uKTsKKyAgICByc0NvbnRleHREZXN0cm95KGNvbik7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGJpdHMpCituQ29udGV4dER1bXAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGJpdHMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHREdW1wLCBjb24oJXApICBiaXRzKCVpKSIsIChSc0NvbnRleHQpY29uLCBiaXRzKTsKICAgICByc0NvbnRleHREdW1wKChSc0NvbnRleHQpY29uLCBiaXRzKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UGF1c2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorbkNvbnRleHRQYXVzZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRQYXVzZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UGF1c2UoY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25Db250ZXh0UmVzdW1lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dFJlc3VtZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNDb250ZXh0UmVzdW1lKGNvbik7CiB9CiAKIHN0YXRpYyBqaW50Ci1uQ29udGV4dEdldE1lc3NhZ2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50QXJyYXkgZGF0YSwgamJvb2xlYW4gd2FpdCkKK25Db250ZXh0R2V0TWVzc2FnZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnRBcnJheSBkYXRhLCBqYm9vbGVhbiB3YWl0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRHZXRNZXNzYWdlLCBjb24oJXApLCBsZW4oJWkpIiwgY29uLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CiAgICAgc2l6ZV90IHJlY2VpdmVMZW47CiAgICAgaW50IGlkID0gcnNDb250ZXh0R2V0TWVzc2FnZShjb24sIHB0ciwgJnJlY2VpdmVMZW4sIGxlbiAqIDQsIHdhaXQpOwogICAgIGlmICghaWQgJiYgcmVjZWl2ZUxlbikgewotICAgICAgICBMT0dFKCJtZXNzYWdlIHJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbC4gICVpIiwgcmVjZWl2ZUxlbik7CisgICAgICAgIExPR1YoIm1lc3NhZ2UgcmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLiAgJWkiLCByZWNlaXZlTGVuKTsKKyAgICAgICAgKnB0ciA9IChqaW50KXJlY2VpdmVMZW47CiAgICAgfQogICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgMCk7CiAgICAgcmV0dXJuIGlkOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCitzdGF0aWMgdm9pZCBuQ29udGV4dEluaXRUb0NsaWVudChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRJbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dEluaXRUb0NsaWVudChjb24pOwogfQogCi1zdGF0aWMgdm9pZCBuQ29udGV4dERlaW5pdFRvQ2xpZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK3N0YXRpYyB2b2lkIG5Db250ZXh0RGVpbml0VG9DbGllbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Db250ZXh0RGVpbml0VG9DbGllbnQsIGNvbiglcCkiLCBjb24pOwogICAgIHJzQ29udGV4dERlaW5pdFRvQ2xpZW50KGNvbik7CiB9CiAKIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKK25FbGVtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB0eXBlLCBqaW50IGtpbmQsIGpib29sZWFuIG5vcm0sIGppbnQgc2l6ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuRWxlbWVudENyZWF0ZSwgY29uKCVwKSwgdHlwZSglaSksIGtpbmQoJWkpLCBub3JtKCVpKSwgc2l6ZSglaSkiLCBjb24sIHR5cGUsIGtpbmQsIG5vcm0sIHNpemUpOwogICAgIHJldHVybiAoamludClyc0VsZW1lbnRDcmVhdGUoY29uLCAoUnNEYXRhVHlwZSl0eXBlLCAoUnNEYXRhS2luZClraW5kLCBub3JtLCBzaXplKTsKIH0KIAogc3RhdGljIGppbnQKLW5FbGVtZW50Q3JlYXRlMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBfaWRzLCBqb2JqZWN0QXJyYXkgX25hbWVzKQorbkVsZW1lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfbmFtZXMsIGppbnRBcnJheSBfYXJyYXlTaXplcykKIHsKICAgICBpbnQgZmllbGRDb3VudCA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9pZHMpOwotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5FbGVtZW50Q3JlYXRlMiwgY29uKCVwKSIsIGNvbik7CiAKICAgICBqaW50ICppZHMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9pZHMsIE5VTEwpOworICAgIGppbnQgKmFycmF5U2l6ZXMgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKF9hcnJheVNpemVzLCBOVUxMKTsKICAgICBjb25zdCBjaGFyICoqIG5hbWVBcnJheSA9IChjb25zdCBjaGFyICoqKWNhbGxvYyhmaWVsZENvdW50LCBzaXplb2YoY2hhciAqKSk7CiAgICAgc2l6ZV90KiBzaXplQXJyYXkgPSAoc2l6ZV90KiljYWxsb2MoZmllbGRDb3VudCwgc2l6ZW9mKHNpemVfdCkpOwogCkBAIC0yNzgsMTgzICsyNjgsMTE2IEBACiAgICAgICAgIG5hbWVBcnJheVtjdF0gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzLCBOVUxMKTsKICAgICAgICAgc2l6ZUFycmF5W2N0XSA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzKTsKICAgICB9Ci0gICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSk7CisgICAgamludCBpZCA9IChqaW50KXJzRWxlbWVudENyZWF0ZTIoY29uLCBmaWVsZENvdW50LCAoUnNFbGVtZW50ICopaWRzLCBuYW1lQXJyYXksIHNpemVBcnJheSwgKGNvbnN0IHVpbnQzMl90ICopYXJyYXlTaXplcyk7CiAgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCBmaWVsZENvdW50OyBjdCsrKSB7CiAgICAgICAgIGpzdHJpbmcgcyA9IChqc3RyaW5nKV9lbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChfbmFtZXMsIGN0KTsKICAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHMsIG5hbWVBcnJheVtjdF0pOwogICAgIH0KICAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfaWRzLCBpZHMsIEpOSV9BQk9SVCk7CisgICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoX2FycmF5U2l6ZXMsIGFycmF5U2l6ZXMsIEpOSV9BQk9SVCk7CiAgICAgZnJlZShuYW1lQXJyYXkpOwogICAgIGZyZWUoc2l6ZUFycmF5KTsKICAgICByZXR1cm4gKGppbnQpaWQ7CiB9CiAKK3N0YXRpYyB2b2lkCituRWxlbWVudEdldE5hdGl2ZURhdGEoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX2VsZW1lbnREYXRhKQoreworICAgIGludCBkYXRhU2l6ZSA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKF9lbGVtZW50RGF0YSk7CisgICAgTE9HX0FQSSgibkVsZW1lbnRHZXROYXRpdmVEYXRhLCBjb24oJXApIiwgY29uKTsKKworICAgIC8vIHdlIHdpbGwgcGFjayBtVHlwZTsgbUtpbmQ7IG1Ob3JtYWxpemVkOyBtVmVjdG9yU2l6ZTsgTnVtU3ViRWxlbWVudHMKKyAgICBhc3NlcnQoZGF0YVNpemUgPT0gNSk7CisKKyAgICB1aW50MzJfdCBlbGVtZW50RGF0YVs1XTsKKyAgICByc0VsZW1lbnRHZXROYXRpdmVEYXRhKGNvbiwgKFJzRWxlbWVudClpZCwgZWxlbWVudERhdGEsIGRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX2VsZW1lbnREYXRhLCBpLCAxLCAoY29uc3QgamludCopJmVsZW1lbnREYXRhW2ldKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK25FbGVtZW50R2V0U3ViRWxlbWVudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGlkLCBqaW50QXJyYXkgX0lEcywgam9iamVjdEFycmF5IF9uYW1lcykKK3sKKyAgICBpbnQgZGF0YVNpemUgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfSURzKTsKKyAgICBMT0dfQVBJKCJuRWxlbWVudEdldFN1YkVsZW1lbnRzLCBjb24oJXApIiwgY29uKTsKKworICAgIHVpbnQzMl90ICppZHMgPSAodWludDMyX3QgKiltYWxsb2MoKHVpbnQzMl90KWRhdGFTaXplICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY29uc3QgY2hhciAqKm5hbWVzID0gKGNvbnN0IGNoYXIgKiopbWFsbG9jKCh1aW50MzJfdClkYXRhU2l6ZSAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKworICAgIHJzRWxlbWVudEdldFN1YkVsZW1lbnRzKGNvbiwgKFJzRWxlbWVudClpZCwgaWRzLCBuYW1lcywgKHVpbnQzMl90KWRhdGFTaXplKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgZGF0YVNpemU7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KF9uYW1lcywgaSwgX2Vudi0+TmV3U3RyaW5nVVRGKG5hbWVzW2ldKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9JRHMsIGksIDEsIChjb25zdCBqaW50KikmaWRzW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGlkcyk7CisgICAgZnJlZShuYW1lcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBlSUQpCituVHlwZUJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBlSUQpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblR5cGVCZWdpbiwgY29uKCVwKSBlKCVwKSIsIGNvbiwgKFJzRWxlbWVudCllSUQpOwogICAgIHJzVHlwZUJlZ2luKGNvbiwgKFJzRWxlbWVudCllSUQpOwogfQogCiBzdGF0aWMgdm9pZAotblR5cGVBZGQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRpbSwgamludCB2YWwpCituVHlwZUFkZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZGltLCBqaW50IHZhbCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUFkZCwgY29uKCVwKSBkaW0oJWkpLCB2YWwoJWkpIiwgY29uLCBkaW0sIHZhbCk7CiAgICAgcnNUeXBlQWRkKGNvbiwgKFJzRGltZW5zaW9uKWRpbSwgdmFsKTsKIH0KIAogc3RhdGljIGppbnQKLW5UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25UeXBlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuVHlwZUNyZWF0ZSwgY29uKCVwKSIsIGNvbik7CiAgICAgcmV0dXJuIChqaW50KXJzVHlwZUNyZWF0ZShjb24pOwogfQogCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRJbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MzJfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRJbnRGaWVsZChfb2JqLCBfZmllbGQpOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgNDsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9Mb2FkU2hvcnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgICgoaW50MTZfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX0xvYWRCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGludDhfdCAqKWJ1ZmZlcilbMF0gPSBfZW52LT5HZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfTG9hZEZsb2F0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICAoKGZsb2F0ICopYnVmZmVyKVswXSA9IF9lbnYtPkdldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZUludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX29iaiwgamZpZWxkSUQgX2ZpZWxkLCB2b2lkICpidWZmZXIpCi17Ci0gICAgX2Vudi0+U2V0SW50RmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDMyX3QgKilidWZmZXIpWzBdKTsKLSAgICByZXR1cm4gKCh1aW50OF90ICopYnVmZmVyKSArIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkICogU0ZfU2F2ZVNob3J0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRTaG9ydEZpZWxkKF9vYmosIF9maWVsZCwgKChpbnQxNl90ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyAyOwotfQotCi1zdGF0aWMgdm9pZCAqIFNGX1NhdmVCeXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfb2JqLCBqZmllbGRJRCBfZmllbGQsIHZvaWQgKmJ1ZmZlcikKLXsKLSAgICBfZW52LT5TZXRCeXRlRmllbGQoX29iaiwgX2ZpZWxkLCAoKGludDhfdCAqKWJ1ZmZlcilbMF0pOwotICAgIHJldHVybiAoKHVpbnQ4X3QgKilidWZmZXIpICsgMTsKLX0KLQotc3RhdGljIHZvaWQgKiBTRl9TYXZlRmxvYXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF9vYmosIGpmaWVsZElEIF9maWVsZCwgdm9pZCAqYnVmZmVyKQotewotICAgIF9lbnYtPlNldEZsb2F0RmllbGQoX29iaiwgX2ZpZWxkLCAoKGZsb2F0ICopYnVmZmVyKVswXSk7Ci0gICAgcmV0dXJuICgodWludDhfdCAqKWJ1ZmZlcikgKyA0OwotfQotCi1zdHJ1Y3QgVHlwZUZpZWxkQ2FjaGUgewotICAgIGpmaWVsZElEIGZpZWxkOwotICAgIGludCBiaXRzOwotICAgIHZvaWQgKiAoKnB0cikoSk5JRW52ICosIGpvYmplY3QsIGpmaWVsZElELCB2b2lkICpidWZmZXIpOwotICAgIHZvaWQgKiAoKnJlYWRQdHIpKEpOSUVudiAqLCBqb2JqZWN0LCBqZmllbGRJRCwgdm9pZCAqYnVmZmVyKTsKLX07Ci0KLXN0cnVjdCBUeXBlQ2FjaGUgewotICAgIGludCBmaWVsZENvdW50OwotICAgIGludCBzaXplOwotICAgIFR5cGVGaWVsZENhY2hlIGZpZWxkc1sxXTsKLX07Ci0KLS8veyJuVHlwZUZpbmFsRGVzdHJveSIsICAgICAgICAgICAgICAiKExhbmRyb2lkL3JlbmRlcnNjcmlwdC9UeXBlOylWIiwgICAgICAgKHZvaWQqKW5UeXBlRmluYWxEZXN0cm95IH0sCiBzdGF0aWMgdm9pZAotblR5cGVGaW5hbERlc3Ryb3koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqb2JqZWN0IF90eXBlKQorblR5cGVHZXROYXRpdmVEYXRhKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBpZCwgamludEFycmF5IF90eXBlRGF0YSkKIHsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKLSAgICBmcmVlKHRjKTsKLX0KKyAgICAvLyBXZSBhcmUgcGFja2luZyA2IGl0ZW1zOiBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBpbnQgZWxlbWVudENvdW50ID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoX3R5cGVEYXRhKTsKIAotLy8gbmF0aXZlIHZvaWQgblR5cGVTZXR1cEZpZWxkcyhUeXBlIHQsIGludFtdIHR5cGVzLCBpbnRbXSBiaXRzLCBGaWVsZFtdIElEcyk7Ci1zdGF0aWMgdm9pZAotblR5cGVTZXR1cEZpZWxkcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpvYmplY3QgX3R5cGUsIGppbnRBcnJheSBfdHlwZXMsIGppbnRBcnJheSBfYml0cywgam9iamVjdEFycmF5IF9JRHMpCi17Ci0gICAgaW50IGZpZWxkQ291bnQgPSBfZW52LT5HZXRBcnJheUxlbmd0aChfdHlwZXMpOwotICAgIHNpemVfdCBzdHJ1Y3RTaXplID0gc2l6ZW9mKFR5cGVDYWNoZSkgKyAoc2l6ZW9mKFR5cGVGaWVsZENhY2hlKSAqIChmaWVsZENvdW50LTEpKTsKLSAgICBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKW1hbGxvYyhzdHJ1Y3RTaXplKTsKLSAgICBtZW1zZXQodGMsIDAsIHN0cnVjdFNpemUpOworICAgIGFzc2VydChlbGVtZW50Q291bnQgPT0gNik7CisgICAgTE9HX0FQSSgiblR5cGVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogCi0gICAgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzWzBdOwotICAgIHRjLT5maWVsZENvdW50ID0gZmllbGRDb3VudDsKLSAgICBfZW52LT5TZXRJbnRGaWVsZChfdHlwZSwgZ1R5cGVOYXRpdmVDYWNoZSwgKGppbnQpdGMpOworICAgIHVpbnQzMl90IHR5cGVEYXRhWzZdOworICAgIHJzVHlwZUdldE5hdGl2ZURhdGEoY29uLCAoUnNUeXBlKWlkLCB0eXBlRGF0YSwgNik7CiAKLSAgICBqaW50ICpmVHlwZSA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX3R5cGVzLCBOVUxMKTsKLSAgICBqaW50ICpmQml0cyA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoX2JpdHMsIE5VTEwpOwotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgZmllbGRDb3VudDsgY3QrKykgewotICAgICAgICBqb2JqZWN0IGZpZWxkID0gX2Vudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KF9JRHMsIGN0KTsKLSAgICAgICAgdGZjW2N0XS5maWVsZCA9IF9lbnYtPkZyb21SZWZsZWN0ZWRGaWVsZChmaWVsZCk7Ci0gICAgICAgIHRmY1tjdF0uYml0cyA9IGZCaXRzW2N0XTsKLQotICAgICAgICBzd2l0Y2goZlR5cGVbY3RdKSB7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9GTE9BVF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEZsb2F0OwotICAgICAgICAgICAgdGZjW2N0XS5yZWFkUHRyID0gU0ZfU2F2ZUZsb2F0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9VTlNJR05FRF8zMjoKLSAgICAgICAgY2FzZSBSU19UWVBFX1NJR05FRF8zMjoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEludDsKLSAgICAgICAgICAgIHRmY1tjdF0ucmVhZFB0ciA9IFNGX1NhdmVJbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzE2OgotICAgICAgICBjYXNlIFJTX1RZUEVfU0lHTkVEXzE2OgotICAgICAgICAgICAgdGZjW2N0XS5wdHIgPSBTRl9Mb2FkU2hvcnQ7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlU2hvcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzg6Ci0gICAgICAgIGNhc2UgUlNfVFlQRV9TSUdORURfODoKLSAgICAgICAgICAgIHRmY1tjdF0ucHRyID0gU0ZfTG9hZEJ5dGU7Ci0gICAgICAgICAgICB0ZmNbY3RdLnJlYWRQdHIgPSBTRl9TYXZlQnl0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRjLT5zaXplICs9IDQ7CisgICAgZm9yKGppbnQgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkgKyspIHsKKyAgICAgICAgX2Vudi0+U2V0SW50QXJyYXlSZWdpb24oX3R5cGVEYXRhLCBpLCAxLCAoY29uc3QgamludCopJnR5cGVEYXRhW2ldKTsKICAgICB9Ci0KLSAgICBfZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhfdHlwZXMsIGZUeXBlLCBKTklfQUJPUlQpOwotICAgIF9lbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKF9iaXRzLCBmQml0cywgSk5JX0FCT1JUKTsKIH0KIAotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotbkFsbG9jYXRpb25DcmVhdGVUeXBlZChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgZSkKK25BbGxvY2F0aW9uQ3JlYXRlVHlwZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25DcmVhdGVUeXBlZCwgY29uKCVwKSwgZSglcCkiLCBjb24sIChSc0VsZW1lbnQpZSk7CiAgICAgcmV0dXJuIChqaW50KSByc0FsbG9jYXRpb25DcmVhdGVUeXBlZChjb24sIChSc0VsZW1lbnQpZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYSwgamJvb2xlYW4gZ2VuTWlwLCBqaW50IG1pcCkKK25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhLCBqYm9vbGVhbiBnZW5NaXAsIGppbnQgbWlwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlLCBjb24oJXApLCBhKCVwKSwgZ2VuTWlwKCVpKSwgbWlwKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiAgICAgcnNBbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKGNvbiwgKFJzQWxsb2NhdGlvbilhLCBnZW5NaXAsIG1pcCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhKQorbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblVwbG9hZFRvQnVmZmVyT2JqZWN0LCBjb24oJXApLCBhKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc0FsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdChjb24sIChSc0FsbG9jYXRpb24pYSk7CiB9CkBAIC00ODAsOSArNDAzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBkc3RGbXQsIGpib29sZWFuIGdlbk1pcHMsIGpvYmplY3QgamJpdG1hcCkKK25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqb2JqZWN0IGpiaXRtYXApCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgU2tCaXRtYXAgY29uc3QgKiBuYXRpdmVCaXRtYXAgPQogICAgICAgICAgICAgKFNrQml0bWFwIGNvbnN0ICopX2Vudi0+R2V0SW50RmllbGQoamJpdG1hcCwgZ05hdGl2ZUJpdG1hcElEKTsKICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKCpuYXRpdmVCaXRtYXApOwpAQCAtNTA4LDkgKzQzMCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB0eXBlLCBqb2JqZWN0IGpiaXRtYXApCituQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdHlwZSwgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAKQEAgLTUyMiwxMCArNDQzLDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgamludCBuYXRpdmVfYXNzZXQpCituQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZHN0Rm10LCBqYm9vbGVhbiBnZW5NaXBzLCBqaW50IG5hdGl2ZV9hc3NldCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLQogICAgIEFzc2V0KiBhc3NldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXNzZXQqPihuYXRpdmVfYXNzZXQpOwogICAgIFNrQml0bWFwIGJpdG1hcDsKICAgICBTa0ltYWdlRGVjb2Rlcjo6RGVjb2RlTWVtb3J5KGFzc2V0LT5nZXRCdWZmZXIoZmFsc2UpLCBhc3NldC0+Z2V0TGVuZ3RoKCksCkBAIC01NDgsOSArNDY3LDggQEAKIH0KIAogc3RhdGljIGludAotbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQorbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGRzdEZtdCwgamJvb2xlYW4gZ2VuTWlwcywgam9iamVjdCBqYml0bWFwKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIFNrQml0bWFwIGNvbnN0ICogbmF0aXZlQml0bWFwID0KICAgICAgICAgICAgIChTa0JpdG1hcCBjb25zdCAqKV9lbnYtPkdldEludEZpZWxkKGpiaXRtYXAsIGdOYXRpdmVCaXRtYXBJRCk7CiAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCgqbmF0aXZlQml0bWFwKTsKQEAgLTU3Miw5ICs0OTAsOCBAQAogCiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMURTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBvZmZzZXQoJWkpLCBjb3VudCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY291bnQsIGxlbiwgc2l6ZUJ5dGVzKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNTgzLDkgKzUwMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9zKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpzaG9ydEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9zLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAganNob3J0ICpwdHIgPSBfZW52LT5HZXRTaG9ydEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC01OTQsOSArNTEwLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTFEX2IoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamJ5dGVBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorbkFsbG9jYXRpb25TdWJEYXRhMURfYihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWxsb2MsIGppbnQgb2Zmc2V0LCBqaW50IGNvdW50LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9iLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamJ5dGUgKnB0ciA9IF9lbnYtPkdldEJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjA1LDkgKzUyMCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGExRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbjFEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpLCBzaXplQnl0ZXMoJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIGNvdW50LCBsZW4sIHNpemVCeXRlcyk7CiAgICAgamZsb2F0ICpwdHIgPSBfZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MTYsOSArNTMwLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGEyRF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSwgaW50IHNpemVCeXRlcykKKy8vICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25TdWJFbGVtZW50RGF0YTFEKGludCBjb24sIGludCBpZCwgaW50IHhvZmYsIGludCBjb21wSWR4LCBieXRlW10gZCwgaW50IHNpemVCeXRlcyk7CituQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IG9mZnNldCwgamludCBjb21wSWR4LCBqYnl0ZUFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQsIGNvbiglcCksIGFsbG9jKCVwKSwgb2Zmc2V0KCVpKSwgY29tcCglaSksIGxlbiglaSksIHNpemVCeXRlcyglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIG9mZnNldCwgY29tcElkeCwgbGVuLCBzaXplQnl0ZXMpOworICAgIGpieXRlICpwdHIgPSBfZW52LT5HZXRCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKKyAgICByc0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhKGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgb2Zmc2V0LCBwdHIsIGNvbXBJZHgsIHNpemVCeXRlcyk7CisgICAgX2Vudi0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGRhdGEsIHB0ciwgSk5JX0FCT1JUKTsKK30KKworc3RhdGljIHZvaWQKK25BbGxvY2F0aW9uU3ViRGF0YTJEX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQorewogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC02MjcsOSArNTUxLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BbGxvY2F0aW9uU3ViRGF0YTJEX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEsIGludCBzaXplQnl0ZXMpCituQWxsb2NhdGlvblN1YkRhdGEyRF9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqZmxvYXRBcnJheSBkYXRhLCBpbnQgc2l6ZUJ5dGVzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb24yRFN1YkRhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIHhvZmYoJWkpLCB5b2ZmKCVpKSwgdyglaSksIGgoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNjM4LDkgKzU2MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblJlYWRfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGppbnRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BbGxvY2F0aW9uUmVhZF9pLCBjb24oJXApLCBhbGxvYyglcCksIGxlbiglaSkiLCBjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGxlbik7CiAgICAgamludCAqcHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY0OSw5ICs1NzEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQorbkFsbG9jYXRpb25SZWFkX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFsbG9jLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFsbG9jYXRpb25SZWFkX2YsIGNvbiglcCksIGFsbG9jKCVwKSwgbGVuKCVpKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYywgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTY1OSw3MCArNTgwLDg5IEBACiAgICAgX2Vudi0+UmVsZWFzZUZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIDApOwogfQogCi0KLS8veyJuQWxsb2NhdGlvbkRhdGFGcm9tT2JqZWN0IiwgICAgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtMamF2YS9sYW5nL09iamVjdDspViIsICAgKHZvaWQqKW5BbGxvY2F0aW9uRGF0YUZyb21PYmplY3QgfSwKLXN0YXRpYyB2b2lkCi1uQWxsb2NhdGlvblN1YkRhdGFGcm9tT2JqZWN0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhbGxvYywgam9iamVjdCBfdHlwZSwgamludCBvZmZzZXQsIGpvYmplY3QgX28pCitzdGF0aWMgamludAorbkFsbG9jYXRpb25HZXRUeXBlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5BbGxvY2F0aW9uRGF0YUZyb21PYmplY3QgY29uKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKKyAgICBMT0dfQVBJKCJuQWxsb2NhdGlvbkdldFR5cGUsIGNvbiglcCksIGEoJXApIiwgY29uLCAoUnNBbGxvY2F0aW9uKWEpOworICAgIHJldHVybiAoamludCkgcnNBbGxvY2F0aW9uR2V0VHlwZShjb24sIChSc0FsbG9jYXRpb24pYSk7Cit9CiAKLSAgICBjb25zdCBUeXBlQ2FjaGUgKnRjID0gKFR5cGVDYWNoZSAqKV9lbnYtPkdldEludEZpZWxkKF90eXBlLCBnVHlwZU5hdGl2ZUNhY2hlKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICB2b2lkICogYnVmQWxsb2MgPSBtYWxsb2ModGMtPnNpemUpOwotICAgIHZvaWQgKiBidWYgPSBidWZBbGxvYzsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IHRjLT5maWVsZENvdW50OyBjdCsrKSB7Ci0gICAgICAgIGNvbnN0IFR5cGVGaWVsZENhY2hlICp0ZmMgPSAmdGMtPmZpZWxkc1tjdF07Ci0gICAgICAgIGJ1ZiA9IHRmYy0+cHRyKF9lbnYsIF9vLCB0ZmMtPmZpZWxkLCBidWYpOwotICAgIH0KLSAgICByc0FsbG9jYXRpb24xRFN1YkRhdGEoY29uLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBvZmZzZXQsIDEsIGJ1ZkFsbG9jLCB0Yy0+c2l6ZSk7Ci0gICAgZnJlZShidWZBbGxvYyk7CitzdGF0aWMgaW50CituRmlsZUEzRENyZWF0ZUZyb21Bc3NldFN0cmVhbShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbmF0aXZlX2Fzc2V0KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBuYXRpdmVfYXNzZXQpOworCisgICAgQXNzZXQqIGFzc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxBc3NldCo+KG5hdGl2ZV9hc3NldCk7CisKKyAgICBqaW50IGlkID0gKGppbnQpcnNGaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKGNvbiwgYXNzZXQtPmdldEJ1ZmZlcihmYWxzZSksIGFzc2V0LT5nZXRMZW5ndGgoKSk7CisgICAgcmV0dXJuIGlkOworfQorCitzdGF0aWMgaW50CituRmlsZUEzREdldE51bUluZGV4RW50cmllcyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZmlsZUEzRCkKK3sKKyAgICBpbnQzMl90IG51bUVudHJpZXMgPSAwOworICAgIHJzRmlsZUEzREdldE51bUluZGV4RW50cmllcyhjb24sICZudW1FbnRyaWVzLCAoUnNGaWxlKWZpbGVBM0QpOworICAgIHJldHVybiBudW1FbnRyaWVzOwogfQogCiBzdGF0aWMgdm9pZAotbkFsbG9jYXRpb25TdWJSZWFkRnJvbU9iamVjdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWxsb2MsIGpvYmplY3QgX3R5cGUsIGppbnQgb2Zmc2V0LCBqb2JqZWN0IF9vKQorbkZpbGVBM0RHZXRJbmRleEVudHJpZXMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGZpbGVBM0QsIGppbnQgbnVtRW50cmllcywgamludEFycmF5IF9pZHMsIGpvYmplY3RBcnJheSBfZW50cmllcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuQWxsb2NhdGlvblJlYWRGcm9tT2JqZWN0IGNvbiglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CisgICAgTE9HVigiX19fX19fbkZpbGVBM0QgJXUiLCAodWludDMyX3QpIGZpbGVBM0QpOworICAgIFJzRmlsZUluZGV4RW50cnkgKmZpbGVFbnRyaWVzID0gKFJzRmlsZUluZGV4RW50cnkqKW1hbGxvYygodWludDMyX3QpbnVtRW50cmllcyAqIHNpemVvZihSc0ZpbGVJbmRleEVudHJ5KSk7CiAKLSAgICBhc3NlcnQob2Zmc2V0ID09IDApOworICAgIHJzRmlsZUEzREdldEluZGV4RW50cmllcyhjb24sIGZpbGVFbnRyaWVzLCAodWludDMyX3QpbnVtRW50cmllcywgKFJzRmlsZSlmaWxlQTNEKTsKIAotICAgIGNvbnN0IFR5cGVDYWNoZSAqdGMgPSAoVHlwZUNhY2hlICopX2Vudi0+R2V0SW50RmllbGQoX3R5cGUsIGdUeXBlTmF0aXZlQ2FjaGUpOwotCi0gICAgdm9pZCAqIGJ1ZkFsbG9jID0gbWFsbG9jKHRjLT5zaXplKTsKLSAgICB2b2lkICogYnVmID0gYnVmQWxsb2M7Ci0gICAgcnNBbGxvY2F0aW9uUmVhZChjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIGJ1ZkFsbG9jKTsKLQotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgdGMtPmZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgY29uc3QgVHlwZUZpZWxkQ2FjaGUgKnRmYyA9ICZ0Yy0+ZmllbGRzW2N0XTsKLSAgICAgICAgYnVmID0gdGZjLT5yZWFkUHRyKF9lbnYsIF9vLCB0ZmMtPmZpZWxkLCBidWYpOworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoX2VudHJpZXMsIGksIF9lbnYtPk5ld1N0cmluZ1VURihmaWxlRW50cmllc1tpXS5vYmplY3ROYW1lKSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9pZHMsIGksIDEsIChjb25zdCBqaW50KikmZmlsZUVudHJpZXNbaV0uY2xhc3NJRCk7CiAgICAgfQotICAgIGZyZWUoYnVmQWxsb2MpOworCisgICAgZnJlZShmaWxlRW50cmllcyk7Cit9CisKK3N0YXRpYyBpbnQKK25GaWxlQTNER2V0RW50cnlCeUluZGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBmaWxlQTNELCBqaW50IGluZGV4KQoreworICAgIExPR1YoIl9fX19fX25GaWxlQTNEICV1IiwgKHVpbnQzMl90KSBmaWxlQTNEKTsKKyAgICBqaW50IGlkID0gKGppbnQpcnNGaWxlQTNER2V0RW50cnlCeUluZGV4KGNvbiwgKHVpbnQzMl90KWluZGV4LCAoUnNGaWxlKWZpbGVBM0QpOworICAgIHJldHVybiBpZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludAorbkZvbnRDcmVhdGVGcm9tRmlsZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpzdHJpbmcgZmlsZU5hbWUsIGppbnQgZm9udFNpemUsIGppbnQgZHBpKQoreworICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoZmlsZU5hbWUsIE5VTEwpOworCisgICAgamludCBpZCA9IChqaW50KXJzRm9udENyZWF0ZUZyb21GaWxlKGNvbiwgZmlsZU5hbWVVVEYsIGZvbnRTaXplLCBkcGkpOworICAgIHJldHVybiBpZDsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQorbkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGFsbG9jKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiwgY29uKCVwKSwgYWRhcHRlciglcCksIGFsbG9jKCVwKSIsIGNvbiwgKFJzQWRhcHRlcjFEKWFkYXB0ZXIsIChSc0FsbG9jYXRpb24pYWxsb2MpOwogICAgIHJzQWRhcHRlcjFEQmluZEFsbG9jYXRpb24oY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCituQWRhcHRlcjFEU2V0Q29uc3RyYWludChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCBkaW0sIGppbnQgdmFsdWUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBkaW0oJWkpLCB2YWx1ZSglaSkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCBkaW0sIHZhbHVlKTsKICAgICByc0FkYXB0ZXIxRFNldENvbnN0cmFpbnQoY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgKFJzRGltZW5zaW9uKWRpbSwgdmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRERhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjFERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMUREYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzMxLDkgKzY3MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEpCituQWRhcHRlcjFEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamludEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjFEU3ViRGF0YV9pLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgb2Zmc2V0KCVpKSwgY291bnQoJWkpLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgb2Zmc2V0LCBjb3VudCwgbGVuKTsKICAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzQyLDkgKzY4MSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjFERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQorbkFkYXB0ZXIxRERhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMUREYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBsZW4oJWkpIiwgY29uLCAoUnNBZGFwdGVyMUQpYWRhcHRlciwgbGVuKTsKICAgICBqZmxvYXQgKnB0ciA9IF9lbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyhkYXRhLCBOVUxMKTsKQEAgLTc1Myw5ICs2OTEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotbkFkYXB0ZXIxRFN1YkRhdGFfZihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgYWRhcHRlciwgamludCBvZmZzZXQsIGppbnQgY291bnQsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjFEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IG9mZnNldCwgamludCBjb3VudCwgamZsb2F0QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURTdWJEYXRhX2YsIGNvbiglcCksIGFkYXB0ZXIoJXApLCBvZmZzZXQoJWkpLCBjb3VudCglaSksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIxRClhZGFwdGVyLCBvZmZzZXQsIGNvdW50LCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtNzY0LDkgKzcwMSw4IEBACiB9CiAKIHN0YXRpYyBqaW50Ci1uQWRhcHRlcjFEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25BZGFwdGVyMURDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMURDcmVhdGUsIGNvbiglcCkiLCBjb24pOwogICAgIHJldHVybiAoamludClyc0FkYXB0ZXIxRENyZWF0ZShjb24pOwogfQpAQCAtNzc0LDI1ICs3MTAsMjIgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGppbnQgYWxsb2MpCituQWRhcHRlcjJEQmluZEFsbG9jYXRpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnQgYWxsb2MpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgYWxsb2MoJXApIiwgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgKFJzQWxsb2NhdGlvbilhbGxvYyk7CiAgICAgcnNBZGFwdGVyMkRCaW5kQWxsb2NhdGlvbihjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMkRTZXRDb25zdHJhaW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IGRpbSwgamludCB2YWx1ZSkKK25BZGFwdGVyMkRTZXRDb25zdHJhaW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IGRpbSwgamludCB2YWx1ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU2V0Q29uc3RyYWludCwgY29uKCVwKSwgYWRhcHRlciglcCksIGRpbSglaSksIHZhbHVlKCVpKSIsIGNvbiwgKFJzQWRhcHRlcjJEKWFkYXB0ZXIsIGRpbSwgdmFsdWUpOwogICAgIHJzQWRhcHRlcjJEU2V0Q29uc3RyYWludChjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCAoUnNEaW1lbnNpb24pZGltLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJERGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50QXJyYXkgZGF0YSkKK25BZGFwdGVyMkREYXRhX2koSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IGFkYXB0ZXIsIGppbnRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRERhdGFfaSwgY29uKCVwKSwgYWRhcHRlciglcCksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBsZW4pOwogICAgIGppbnQgKnB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CkBAIC04MDEsOSArNzM0LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLW5BZGFwdGVyMkREYXRhX2YoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGFkYXB0ZXIsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjJERGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqZmxvYXRBcnJheSBkYXRhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgoZGF0YSk7CiAgICAgTE9HX0FQSSgibkFkYXB0ZXIyRERhdGFfZiwgY29uKCVwKSwgYWRhcHRlciglcCksIGxlbiglaSkiLCBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCBsZW4pOwogICAgIGpmbG9hdCAqcHRyID0gX2Vudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKGRhdGEsIE5VTEwpOwpAQCAtODEyLDkgKzc0NCw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU3ViRGF0YV9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGppbnRBcnJheSBkYXRhKQorbkFkYXB0ZXIyRFN1YkRhdGFfaShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgYWRhcHRlciwgamludCB4b2ZmLCBqaW50IHlvZmYsIGppbnQgdywgamludCBoLCBqaW50QXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50IGxlbiA9IF9lbnYtPkdldEFycmF5TGVuZ3RoKGRhdGEpOwogICAgIExPR19BUEkoIm5BZGFwdGVyMkRTdWJEYXRhX2ksIGNvbiglcCksIGFkYXB0ZXIoJXApLCB4b2ZmKCVpKSwgeW9mZiglaSksIHcoJWkpLCBoKCVpKSwgbGVuKCVpKSIsCiAgICAgICAgICAgICBjb24sIChSc0FkYXB0ZXIyRClhZGFwdGVyLCB4b2ZmLCB5b2ZmLCB3LCBoLCBsZW4pOwpAQCAtODI0LDkgKzc1NSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1uQWRhcHRlcjJEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEpCituQWRhcHRlcjJEU3ViRGF0YV9mKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhZGFwdGVyLCBqaW50IHhvZmYsIGppbnQgeW9mZiwgamludCB3LCBqaW50IGgsIGpmbG9hdEFycmF5IGRhdGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEU3ViRGF0YV9mLCBjb24oJXApLCBhZGFwdGVyKCVwKSwgeG9mZiglaSksIHlvZmYoJWkpLCB3KCVpKSwgaCglaSksIGxlbiglaSkiLAogICAgICAgICAgICAgY29uLCAoUnNBZGFwdGVyMkQpYWRhcHRlciwgeG9mZiwgeW9mZiwgdywgaCwgbGVuKTsKQEAgLTgzNiw5ICs3NjYsOCBAQAogfQogCiBzdGF0aWMgamludAotbkFkYXB0ZXIyRENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituQWRhcHRlcjJEQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQWRhcHRlcjJEQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNBZGFwdGVyMkRDcmVhdGUoY29uKTsKIH0KQEAgLTg0Niw0MSArNzc1LDQwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNjcmlwdEJpbmRBbGxvY2F0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGppbnQgYWxsb2MsIGppbnQgc2xvdCkKK25TY3JpcHRCaW5kQWxsb2NhdGlvbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdEJpbmRBbGxvY2F0aW9uLCBjb24oJXApLCBzY3JpcHQoJXApLCBhbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0LCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKICAgICByc1NjcmlwdEJpbmRBbGxvY2F0aW9uKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgKFJzQWxsb2NhdGlvbilhbGxvYywgc2xvdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uU2NyaXB0U2V0Q2xlYXJDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqZmxvYXQgciwgamZsb2F0IGcsIGpmbG9hdCBiLCBqZmxvYXQgYSkKK25TY3JpcHRTZXRWYXJJKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGppbnQgc2xvdCwgamludCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdFNldENsZWFyQ29sb3IsIGNvbiglcCksIHMoJXApLCByKCVmKSwgZyglZiksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHIsIGcsIGIsIGEpOwotICAgIHJzU2NyaXB0U2V0Q2xlYXJDb2xvcihjb24sIChSc1NjcmlwdClzY3JpcHQsIHIsIGcsIGIsIGEpOworICAgIExPR19BUEkoIm5TY3JpcHRTZXRWYXJJLCBjb24oJXApLCBzKCVwKSwgc2xvdCglaSksIHZhbCglaSksIGIoJWYpLCBhKCVmKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIHNsb3QsIHZhbCk7CisgICAgcnNTY3JpcHRTZXRWYXJJKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRDbGVhckRlcHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzY3JpcHQsIGpmbG9hdCBkKQorblNjcmlwdFNldFZhckYoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCwgamludCBzbG90LCBmbG9hdCB2YWwpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENTZXRDbGVhckRlcHRoLCBjb24oJXApLCBzKCVwKSwgZGVwdGgoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgZCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhckRlcHRoKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgZCk7CisgICAgTE9HX0FQSSgiblNjcmlwdFNldFZhckksIGNvbiglcCksIHMoJXApLCBzbG90KCVpKSwgdmFsKCVpKSwgYiglZiksIGEoJWYpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCwgdmFsKTsKKyAgICByc1NjcmlwdFNldFZhckYoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzbG90LCB2YWwpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldENsZWFyU3RlbmNpbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqaW50IHN0ZW5jaWwpCituU2NyaXB0U2V0VmFyVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldENsZWFyU3RlbmNpbCwgY29uKCVwKSwgcyglcCksIHN0ZW5jaWwoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc3RlbmNpbCk7Ci0gICAgcnNTY3JpcHRTZXRDbGVhclN0ZW5jaWwoY29uLCAoUnNTY3JpcHQpc2NyaXB0LCBzdGVuY2lsKTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0U2V0VmFyViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRTZXRWYXJWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRUaW1lWm9uZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgc2NyaXB0LCBqYnl0ZUFycmF5IHRpbWVab25lKQorblNjcmlwdFNldFRpbWVab25lKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBzY3JpcHQsIGpieXRlQXJyYXkgdGltZVpvbmUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENTZXRUaW1lWm9uZSwgY29uKCVwKSwgcyglcCksIHRpbWVab25lKCVzKSIsIGNvbiwgKHZvaWQgKilzY3JpcHQsIChjb25zdCBjaGFyICopdGltZVpvbmUpOwogCiAgICAgamludCBsZW5ndGggPSBfZW52LT5HZXRBcnJheUxlbmd0aCh0aW1lWm9uZSk7CkBAIC04OTUsNjYgKzgyMywzNiBAQAogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFR5cGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHR5cGUsIGpib29sZWFuIHdyaXRhYmxlLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKK25TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG9iaiwgamludCBzbG90KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5TY3JpcHRDQWRkVHlwZSwgY29uKCVwKSwgdHlwZSglcCksIHdyaXRhYmxlKCVpKSwgc2xvdCglaSkiLCBjb24sIChSc1R5cGUpdHlwZSwgd3JpdGFibGUsIHNsb3QpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBOVUxMOwotICAgIGlmIChfc3RyKSB7Ci0gICAgICAgIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhfc3RyLCBOVUxMKTsKLSAgICB9Ci0gICAgcnNTY3JpcHRTZXRUeXBlKGNvbiwgKFJzVHlwZSl0eXBlLCBzbG90LCB3cml0YWJsZSwgbik7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRTZXRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIF9zdHIsIGppbnQgc2xvdCkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0U2V0SW52b2tlLCBjb24oJXApIiwgY29uKTsKLSAgICBjb25zdCBjaGFyKiBuID0gTlVMTDsKLSAgICBpZiAoX3N0cikgewotICAgICAgICBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoX3N0ciwgTlVMTCk7Ci0gICAgfQotICAgIHJzU2NyaXB0U2V0SW52b2tlKGNvbiwgbiwgc2xvdCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKF9zdHIsIG4pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRJbnZva2UoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG9iaiwgamludCBzbG90KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRJbnZva2UsIGNvbiglcCksIHNjcmlwdCglcCkiLCBjb24sICh2b2lkICopb2JqKTsKICAgICByc1NjcmlwdEludm9rZShjb24sIChSc1NjcmlwdClvYmosIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNjcmlwdFNldFJvb3QoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBpc1Jvb3QpCituU2NyaXB0SW52b2tlVihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgc2NyaXB0LCBqaW50IHNsb3QsIGpieXRlQXJyYXkgZGF0YSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q1NldFJvb3QsIGNvbiglcCksIGlzUm9vdCglaSkiLCBjb24sIGlzUm9vdCk7Ci0gICAgcnNTY3JpcHRTZXRSb290KGNvbiwgaXNSb290KTsKKyAgICBMT0dfQVBJKCJuU2NyaXB0SW52b2tlViwgY29uKCVwKSwgcyglcCksIHNsb3QoJWkpIiwgY29uLCAodm9pZCAqKXNjcmlwdCwgc2xvdCk7CisgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKKyAgICBqYnl0ZSAqcHRyID0gX2Vudi0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoZGF0YSwgTlVMTCk7CisgICAgcnNTY3JpcHRJbnZva2VWKGNvbiwgKFJzU2NyaXB0KXNjcmlwdCwgc2xvdCwgcHRyLCBsZW4pOworICAgIF9lbnYtPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhkYXRhLCBwdHIsIEpOSV9BQk9SVCk7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24pCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNjcmlwdENCZWdpbiwgY29uKCVwKSIsIGNvbik7CiAgICAgcnNTY3JpcHRDQmVnaW4oY29uKTsKIH0KIAogc3RhdGljIHZvaWQKLW5TY3JpcHRDU2V0U2NyaXB0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJ5dGVBcnJheSBzY3JpcHRSZWYsCituU2NyaXB0Q1NldFNjcmlwdChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpieXRlQXJyYXkgc2NyaXB0UmVmLAogICAgICAgICAgICAgICAgICAgamludCBvZmZzZXQsIGppbnQgbGVuZ3RoKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIiEhISBuU2NyaXB0Q1NldFNjcmlwdCwgY29uKCVwKSIsIGNvbik7CiAgICAgamludCBfZXhjZXB0aW9uID0gMDsKICAgICBqaW50IHJlbWFpbmluZzsKQEAgLTk5NSwxMTQgKzg5Myw4MiBAQAogfQogCiBzdGF0aWMgamludAotblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNjcmlwdENDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TY3JpcHRDQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTY3JpcHRDQ3JlYXRlKGNvbik7CiB9CiAKLXN0YXRpYyB2b2lkCi1uU2NyaXB0Q0FkZERlZmluZUkzMihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamludCB2YWx1ZSkKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBjb25zdCBjaGFyKiBuID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMobmFtZSwgTlVMTCk7Ci0gICAgTE9HX0FQSSgiblNjcmlwdENBZGREZWZpbmVJMzIsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWQpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lSTMyKGNvbiwgbiwgdmFsdWUpOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhuYW1lLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW5TY3JpcHRDQWRkRGVmaW5lRihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpzdHJpbmcgbmFtZSwgamZsb2F0IHZhbHVlKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGNvbnN0IGNoYXIqIG4gPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhuYW1lLCBOVUxMKTsKLSAgICBMT0dfQVBJKCJuU2NyaXB0Q0FkZERlZmluZUYsIGNvbiglcCkgbmFtZSglcykgdmFsdWUoJWYpIiwgY29uLCBuLCB2YWx1ZSk7Ci0gICAgcnNTY3JpcHRDU2V0RGVmaW5lRihjb24sIG4sIHZhbHVlKTsKLSAgICBfZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobmFtZSwgbik7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IGluLCBqaW50IG91dCkKK25Qcm9ncmFtU3RvcmVCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgaW4sIGppbnQgb3V0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4oY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJlZ2luLCBjb24oJXApLCBpbiglcCksIG91dCglcCkiLCBjb24sIChSc0VsZW1lbnQpaW4sIChSc0VsZW1lbnQpb3V0KTsKKyAgICByc1Byb2dyYW1TdG9yZUJlZ2luKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBmdW5jKQorblByb2dyYW1TdG9yZURlcHRoRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgZnVuYykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jKGNvbiwgKFJzRGVwdGhGdW5jKWZ1bmMpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMsIGNvbiglcCksIGZ1bmMoJWkpIiwgY29uLCBmdW5jKTsKKyAgICByc1Byb2dyYW1TdG9yZURlcHRoRnVuYyhjb24sIChSc0RlcHRoRnVuYylmdW5jKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGVuYWJsZSkKK25Qcm9ncmFtU3RvcmVEZXB0aE1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiBlbmFibGUpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOworICAgIExPR19BUEkoIm5Qcm9ncmFtU3RvcmVEZXB0aE1hc2ssIGNvbiglcCksIGVuYWJsZSglaSkiLCBjb24sIGVuYWJsZSk7CisgICAgcnNQcm9ncmFtU3RvcmVEZXB0aE1hc2soY29uLCBlbmFibGUpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamJvb2xlYW4gciwgamJvb2xlYW4gZywgamJvb2xlYW4gYiwgamJvb2xlYW4gYSkKK25Qcm9ncmFtU3RvcmVDb2xvck1hc2soSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqYm9vbGVhbiByLCBqYm9vbGVhbiBnLCBqYm9vbGVhbiBiLCBqYm9vbGVhbiBhKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzaywgY29uKCVwKSwgciglaSksIGcoJWkpLCBiKCVpKSwgYSglaSkiLCBjb24sIHIsIGcsIGIsIGEpOwotICAgIHJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ29sb3JNYXNrLCBjb24oJXApLCByKCVpKSwgZyglaSksIGIoJWkpLCBhKCVpKSIsIGNvbiwgciwgZywgYiwgYSk7CisgICAgcnNQcm9ncmFtU3RvcmVDb2xvck1hc2soY29uLCByLCBnLCBiLCBhKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGludCBzcmMsIGludCBkc3QpCituUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgaW50IHNyYywgaW50IGRzdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMsIGNvbiglcCksIHNyYyglaSksIGRzdCglaSkiLCBjb24sIHNyYywgZHN0KTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CisgICAgTE9HX0FQSSgiblByb2dyYW1TdG9yZUJsZW5kRnVuYywgY29uKCVwKSwgc3JjKCVpKSwgZHN0KCVpKSIsIGNvbiwgc3JjLCBkc3QpOworICAgIHJzUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKGNvbiwgKFJzQmxlbmRTcmNGdW5jKXNyYywgKFJzQmxlbmREc3RGdW5jKWRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqYm9vbGVhbiBlbmFibGUpCituUHJvZ3JhbVN0b3JlRGl0aGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gZW5hYmxlKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciwgY29uKCVwKSwgZW5hYmxlKCVpKSIsIGNvbiwgZW5hYmxlKTsKLSAgICByc1Byb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlRGl0aGVyLCBjb24oJXApLCBlbmFibGUoJWkpIiwgY29uLCBlbmFibGUpOworICAgIHJzUHJvZ3JhbVN0b3JlRGl0aGVyKGNvbiwgZW5hYmxlKTsKIH0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituUHJvZ3JhbVN0b3JlQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotCi0gICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoY29uKTsKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVN0b3JlQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKKyAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtU3RvcmVDcmVhdGUoY29uKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCituUHJvZ3JhbUJpbmRDb25zdGFudHMoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwdiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kQ29uc3RhbnRzLCBjb24oJXApLCB2cGYoJXApLCBzbG9hdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXZwdiwgc2xvdCwgKFJzQWxsb2NhdGlvbilhKTsKICAgICByc1Byb2dyYW1CaW5kQ29uc3RhbnRzKGNvbiwgKFJzUHJvZ3JhbSl2cHYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbUJpbmRUZXh0dXJlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cGYsIGppbnQgc2xvdCwgamludCBhKQorblByb2dyYW1CaW5kVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuUHJvZ3JhbUJpbmRUZXh0dXJlLCBjb24oJXApLCB2cGYoJXApLCBzbG90KCVpKSwgYSglcCkiLCBjb24sIChSc1Byb2dyYW1GcmFnbWVudCl2cGYsIHNsb3QsIChSc0FsbG9jYXRpb24pYSk7CiAgICAgcnNQcm9ncmFtQmluZFRleHR1cmUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNBbGxvY2F0aW9uKWEpOwogfQogCiBzdGF0aWMgdm9pZAotblByb2dyYW1CaW5kU2FtcGxlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnBmLCBqaW50IHNsb3QsIGppbnQgYSkKK25Qcm9ncmFtQmluZFNhbXBsZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHZwZiwgamludCBzbG90LCBqaW50IGEpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblByb2dyYW1CaW5kU2FtcGxlciwgY29uKCVwKSwgdnBmKCVwKSwgc2xvdCglaSksIGEoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnBmLCBzbG90LCAoUnNTYW1wbGVyKWEpOwogICAgIHJzUHJvZ3JhbUJpbmRTYW1wbGVyKGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXZwZiwgc2xvdCwgKFJzU2FtcGxlcilhKTsKIH0KQEAgLTExMTAsOSArOTc2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBqaW50ICpwYXJhbVB0ciA9IF9lbnYtPkdldEludEFycmF5RWxlbWVudHMocGFyYW1zLCBOVUxMKTsKICAgICBqaW50IHBhcmFtTGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgocGFyYW1zKTsKIApAQCAtMTEyNCw5ICs5ODksOCBAQAogfQogCiBzdGF0aWMgamludAotblByb2dyYW1GcmFnbWVudENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKK25Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgY29uc3QgY2hhciogc2hhZGVyVVRGID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc2hhZGVyLCBOVUxMKTsKICAgICBqaW50IHNoYWRlckxlbiA9IF9lbnYtPkdldFN0cmluZ1VURkxlbmd0aChzaGFkZXIpOwogICAgIGppbnQgKnBhcmFtUHRyID0gX2Vudi0+R2V0SW50QXJyYXlFbGVtZW50cyhwYXJhbXMsIE5VTEwpOwpAQCAtMTE0NCwxNyArMTAwOCwxNSBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBqaW50Ci1uUHJvZ3JhbVZlcnRleENyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIHRleE1hdCkKK25Qcm9ncmFtVmVydGV4Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamJvb2xlYW4gdGV4TWF0KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtVmVydGV4Q3JlYXRlLCBjb24oJXApLCB0ZXhNYXQoJWkpIiwgY29uLCB0ZXhNYXQpOwogICAgIHJldHVybiAoamludClyc1Byb2dyYW1WZXJ0ZXhDcmVhdGUoY29uLCB0ZXhNYXQpOwogfQogCiBzdGF0aWMgamludAotblByb2dyYW1WZXJ0ZXhDcmVhdGUyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywganN0cmluZyBzaGFkZXIsIGppbnRBcnJheSBwYXJhbXMpCituUHJvZ3JhbVZlcnRleENyZWF0ZTIoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqc3RyaW5nIHNoYWRlciwgamludEFycmF5IHBhcmFtcykKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBjb25zdCBjaGFyKiBzaGFkZXJVVEYgPSBfZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzaGFkZXIsIE5VTEwpOwogICAgIGppbnQgc2hhZGVyTGVuID0gX2Vudi0+R2V0U3RyaW5nVVRGTGVuZ3RoKHNoYWRlcik7CiAgICAgamludCAqcGFyYW1QdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBhcmFtcywgTlVMTCk7CkBAIC0xMTcxLDcwICsxMDMzLDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGppbnQKLW5Qcm9ncmFtUmFzdGVyQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBpbiwgamludCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBwb2ludFNtb290aCwgamJvb2xlYW4gbGluZVNtb290aCwgamJvb2xlYW4gcG9pbnRTcHJpdGUpCituUHJvZ3JhbVJhc3RlckNyZWF0ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGpib29sZWFuIHBvaW50U21vb3RoLCBqYm9vbGVhbiBsaW5lU21vb3RoLCBqYm9vbGVhbiBwb2ludFNwcml0ZSkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlckNyZWF0ZSwgY29uKCVwKSwgaW4oJXApLCBvdXQoJXApLCBwb2ludFNtb290aCglaSksIGxpbmVTbW9vdGgoJWkpLCBwb2ludFNwcml0ZSglaSkiLAotICAgICAgICAgICAgY29uLCAoUnNFbGVtZW50KWluLCAoUnNFbGVtZW50KW91dCwgcG9pbnRTbW9vdGgsIGxpbmVTbW9vdGgsIHBvaW50U3ByaXRlKTsKLSAgICByZXR1cm4gKGppbnQpcnNQcm9ncmFtUmFzdGVyQ3JlYXRlKGNvbiwgKFJzRWxlbWVudClpbiwgKFJzRWxlbWVudClvdXQsIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgTE9HX0FQSSgiblByb2dyYW1SYXN0ZXJDcmVhdGUsIGNvbiglcCksIHBvaW50U21vb3RoKCVpKSwgbGluZVNtb290aCglaSksIHBvaW50U3ByaXRlKCVpKSIsCisgICAgICAgICAgICBjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CisgICAgcmV0dXJuIChqaW50KXJzUHJvZ3JhbVJhc3RlckNyZWF0ZShjb24sIHBvaW50U21vb3RoLCBsaW5lU21vb3RoLCBwb2ludFNwcml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgdnByLCBqZmxvYXQgdikKK25Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGpmbG9hdCB2KQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRQb2ludFNpemUoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKLX0KLQotc3RhdGljIHZvaWQKLW5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCB2cHIsIGpmbG9hdCB2KQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglZikiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKLSAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtRnJhZ21lbnQpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgoY29uLCAoUnNQcm9ncmFtUmFzdGVyKXZwciwgdik7Cit9CisKK3N0YXRpYyB2b2lkCituUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2cHIsIGppbnQgdikKK3sKKyAgICBMT0dfQVBJKCJuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlLCBjb24oJXApLCB2cGYoJXApLCB2YWx1ZSglaSkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCB2KTsKKyAgICByc1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShjb24sIChSc1Byb2dyYW1SYXN0ZXIpdnByLCAoUnNDdWxsTW9kZSl2KTsKIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHNjcmlwdCkKK25Db250ZXh0QmluZFJvb3RTY3JpcHQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IHNjcmlwdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRSb290U2NyaXB0LCBjb24oJXApLCBzY3JpcHQoJXApIiwgY29uLCAoUnNTY3JpcHQpc2NyaXB0KTsKICAgICByc0NvbnRleHRCaW5kUm9vdFNjcmlwdChjb24sIChSc1NjcmlwdClzY3JpcHQpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmcykKK25Db250ZXh0QmluZFByb2dyYW1TdG9yZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGZzKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSlwZnMpOwotICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZShjb24sIChSc1Byb2dyYW1GcmFnbWVudFN0b3JlKXBmcyk7CisgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlLCBjb24oJXApLCBwZnMoJXApIiwgY29uLCAoUnNQcm9ncmFtU3RvcmUpcGZzKTsKKyAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVN0b3JlKGNvbiwgKFJzUHJvZ3JhbVN0b3JlKXBmcyk7CiB9CiAKIHN0YXRpYyB2b2lkCi1uQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQsIGNvbiglcCksIHBmKCVwKSIsIGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50KGNvbiwgKFJzUHJvZ3JhbUZyYWdtZW50KXBmKTsKIH0KIAogc3RhdGljIHZvaWQKLW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHBmKQorbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgcGYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgibkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCwgY29uKCVwKSwgcGYoJXApIiwgY29uLCAoUnNQcm9ncmFtVmVydGV4KXBmKTsKICAgICByc0NvbnRleHRCaW5kUHJvZ3JhbVZlcnRleChjb24sIChSc1Byb2dyYW1WZXJ0ZXgpcGYpOwogfQogCiBzdGF0aWMgdm9pZAotbkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcGYpCituQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwZikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyLCBjb24oJXApLCBwZiglcCkiLCBjb24sIChSc1Byb2dyYW1SYXN0ZXIpcGYpOwogICAgIHJzQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyKGNvbiwgKFJzUHJvZ3JhbVJhc3RlcilwZik7CiB9CkBAIC0xMjQzLDEwOCArMTA5NiwxMDAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJCZWdpbihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMpCituU2FtcGxlckJlZ2luKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbikKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKICAgICBMT0dfQVBJKCJuU2FtcGxlckJlZ2luLCBjb24oJXApIiwgY29uKTsKICAgICByc1NhbXBsZXJCZWdpbihjb24pOwogfQogCiBzdGF0aWMgdm9pZAotblNhbXBsZXJTZXQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHAsIGppbnQgdikKK25TYW1wbGVyU2V0KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBwLCBqaW50IHYpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7CiAgICAgTE9HX0FQSSgiblNhbXBsZXJTZXQsIGNvbiglcCksIHBhcmFtKCVpKSwgdmFsdWUoJWkpIiwgY29uLCBwLCB2KTsKICAgICByc1NhbXBsZXJTZXQoY29uLCAoUnNTYW1wbGVyUGFyYW0pcCwgKFJzU2FtcGxlclZhbHVlKXYpOwogfQogCiBzdGF0aWMgamludAotblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQorblNhbXBsZXJDcmVhdGUoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uKQogewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwogICAgIExPR19BUEkoIm5TYW1wbGVyQ3JlYXRlLCBjb24oJXApIiwgY29uKTsKICAgICByZXR1cm4gKGppbnQpcnNTYW1wbGVyQ3JlYXRlKGNvbik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgdm9pZAotbkxpZ2h0QmVnaW4oSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIExPR19BUEkoIm5MaWdodEJlZ2luLCBjb24oJXApIiwgY29uKTsKLSAgICByc0xpZ2h0QmVnaW4oY29uKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldElzTW9ubyhKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTW9ubykKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRJc01vbm8sIGNvbiglcCksIGlzTW9ubyglaSkiLCBjb24sIGlzTW9ubyk7Ci0gICAgcnNMaWdodFNldE1vbm9jaHJvbWF0aWMoY29uLCBpc01vbm8pOwotfQotCi1zdGF0aWMgdm9pZAotbkxpZ2h0U2V0SXNMb2NhbChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpib29sZWFuIGlzTG9jYWwpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0SXNMb2NhbCwgY29uKCVwKSwgaXNMb2NhbCglaSkiLCBjb24sIGlzTG9jYWwpOwotICAgIHJzTGlnaHRTZXRMb2NhbChjb24sIGlzTG9jYWwpOwotfQotCiBzdGF0aWMgamludAotbkxpZ2h0Q3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcykKK25NZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCB2dHhDb3VudCwgamludCBpZHhDb3VudCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRDcmVhdGUsIGNvbiglcCkiLCBjb24pOwotICAgIHJldHVybiAoamludClyc0xpZ2h0Q3JlYXRlKGNvbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uTGlnaHRTZXRDb2xvcihKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgbGlnaHQsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCi17Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgibkxpZ2h0U2V0Q29sb3IsIGNvbiglcCksIGxpZ2h0KCVwKSwgciglZiksIGcoJWYpLCBiKCVmKSIsIGNvbiwgKFJzTGlnaHQpbGlnaHQsIHIsIGcsIGIpOwotICAgIHJzTGlnaHRTZXRDb2xvcihjb24sIChSc0xpZ2h0KWxpZ2h0LCByLCBnLCBiKTsKLX0KLQotc3RhdGljIHZvaWQKLW5MaWdodFNldFBvc2l0aW9uKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBsaWdodCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuTGlnaHRTZXRQb3NpdGlvbiwgY29uKCVwKSwgbGlnaHQoJXApLCB4KCVmKSwgeSglZiksIHooJWYpIiwgY29uLCAoUnNMaWdodClsaWdodCwgeCwgeSwgeik7Ci0gICAgcnNMaWdodFNldFBvc2l0aW9uKGNvbiwgKFJzTGlnaHQpbGlnaHQsIHgsIHksIHopOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGppbnQKLW5TaW1wbGVNZXNoQ3JlYXRlKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBiYXRjaElELCBqaW50IGluZGV4SUQsIGppbnRBcnJheSB2dHhJRHMsIGppbnQgcHJpbUlEKQotewotICAgIFJzQ29udGV4dCBjb24gPSAoUnNDb250ZXh0KShfZW52LT5HZXRJbnRGaWVsZChfdGhpcywgZ0NvbnRleHRJZCkpOwotICAgIGppbnQgbGVuID0gX2Vudi0+R2V0QXJyYXlMZW5ndGgodnR4SURzKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaENyZWF0ZSwgY29uKCVwKSwgYmF0Y2hJRCglaSksIGluZGV4SUQoJWkpLCB2dHhJRHMubGVuKCVpKSwgcHJpbUlEKCVpKSIsCi0gICAgICAgICAgICBjb24sIGJhdGNoSUQsIGluZGV4SUQsIGxlbiwgcHJpbUlEKTsKLSAgICBqaW50ICpwdHIgPSBfZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHZ0eElEcywgTlVMTCk7Ci0gICAgaW50IGlkID0gKGludClyc1NpbXBsZU1lc2hDcmVhdGUoY29uLCAodm9pZCAqKWJhdGNoSUQsICh2b2lkICopaW5kZXhJRCwgKHZvaWQgKiopcHRyLCBsZW4sIHByaW1JRCk7Ci0gICAgX2Vudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHModnR4SURzLCBwdHIsIDAvKkpOSV9BQk9SVCovKTsKKyAgICBMT0dfQVBJKCJuTWVzaENyZWF0ZSwgY29uKCVwKSwgdnR4Q291bnQoJWkpLCBpZHhDb3VudCglaSkiLCBjb24sIHZ0eENvdW50LCBpZHhDb3VudCk7CisgICAgaW50IGlkID0gKGludClyc01lc2hDcmVhdGUoY29uLCB2dHhDb3VudCwgaWR4Q291bnQpOwogICAgIHJldHVybiBpZDsKIH0KIAogc3RhdGljIHZvaWQKLW5TaW1wbGVNZXNoQmluZFZlcnRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGppbnQgcywgamludCBhbGxvYywgamludCBzbG90KQorbk1lc2hCaW5kVmVydGV4KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50IGFsbG9jLCBqaW50IHNsb3QpCiB7Ci0gICAgUnNDb250ZXh0IGNvbiA9IChSc0NvbnRleHQpKF9lbnYtPkdldEludEZpZWxkKF90aGlzLCBnQ29udGV4dElkKSk7Ci0gICAgTE9HX0FQSSgiblNpbXBsZU1lc2hCaW5kVmVydGV4LCBjb24oJXApLCBTaW1wbGVNZXNoKCVwKSwgQWxsb2MoJXApLCBzbG90KCVpKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKLSAgICByc1NpbXBsZU1lc2hCaW5kVmVydGV4KGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jLCBzbG90KTsKKyAgICBMT0dfQVBJKCJuTWVzaEJpbmRWZXJ0ZXgsIGNvbiglcCksIE1lc2goJXApLCBBbGxvYyglcCksIHNsb3QoJWkpIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOworICAgIHJzTWVzaEJpbmRWZXJ0ZXgoY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MsIHNsb3QpOwogfQogCiBzdGF0aWMgdm9pZAotblNpbXBsZU1lc2hCaW5kSW5kZXgoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IHMsIGppbnQgYWxsb2MpCituTWVzaEJpbmRJbmRleChKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIFJzQ29udGV4dCBjb24sIGppbnQgbWVzaCwgamludCBhbGxvYywgamludCBwcmltSUQsIGppbnQgc2xvdCkKIHsKLSAgICBSc0NvbnRleHQgY29uID0gKFJzQ29udGV4dCkoX2Vudi0+R2V0SW50RmllbGQoX3RoaXMsIGdDb250ZXh0SWQpKTsKLSAgICBMT0dfQVBJKCJuU2ltcGxlTWVzaEJpbmRJbmRleCwgY29uKCVwKSwgU2ltcGxlTWVzaCglcCksIEFsbG9jKCVwKSIsIGNvbiwgKFJzU2ltcGxlTWVzaClzLCAoUnNBbGxvY2F0aW9uKWFsbG9jKTsKLSAgICByc1NpbXBsZU1lc2hCaW5kSW5kZXgoY29uLCAoUnNTaW1wbGVNZXNoKXMsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIExPR19BUEkoIm5NZXNoQmluZEluZGV4LCBjb24oJXApLCBNZXNoKCVwKSwgQWxsb2MoJXApIiwgY29uLCAoUnNNZXNoKW1lc2gsIChSc0FsbG9jYXRpb24pYWxsb2MpOworICAgIHJzTWVzaEJpbmRJbmRleChjb24sIChSc01lc2gpbWVzaCwgKFJzQWxsb2NhdGlvbilhbGxvYywgcHJpbUlELCBzbG90KTsKK30KKworc3RhdGljIGppbnQKK25NZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBSc0NvbnRleHQgY29uLCBqaW50IG1lc2gpCit7CisgICAgTE9HX0FQSSgibk1lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCB2dHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0VmVydGV4QnVmZmVyQ291bnQoY29uLCAoUnNNZXNoKW1lc2gsICZ2dHhDb3VudCk7CisgICAgcmV0dXJuIHZ0eENvdW50OworfQorCitzdGF0aWMgamludAorbk1lc2hHZXRJbmRleENvdW50KEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoKQoreworICAgIExPR19BUEkoIm5NZXNoR2V0SW5kZXhDb3VudCwgY29uKCVwKSwgTWVzaCglcCkiLCBjb24sIChSc01lc2gpbWVzaCk7CisgICAgamludCBpZHhDb3VudCA9IDA7CisgICAgcnNNZXNoR2V0SW5kZXhDb3VudChjb24sIChSc01lc2gpbWVzaCwgJmlkeENvdW50KTsKKyAgICByZXR1cm4gaWR4Q291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCituTWVzaEdldFZlcnRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkcywgaW50IG51bVZ0eElEcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1WdHhJRHMgKiBzaXplb2YoUnNBbGxvY2F0aW9uKSk7CisgICAgcnNNZXNoR2V0VmVydGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgKHVpbnQzMl90KW51bVZ0eElEcyk7CisKKyAgICBmb3IoamludCBpID0gMDsgaSA8IG51bVZ0eElEczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgfQorCisgICAgZnJlZShhbGxvY3MpOworfQorCitzdGF0aWMgdm9pZAorbk1lc2hHZXRJbmRpY2VzKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBtZXNoLCBqaW50QXJyYXkgX2lkeElkcywgamludEFycmF5IF9wcmltaXRpdmVzLCBpbnQgbnVtSW5kaWNlcykKK3sKKyAgICBMT0dfQVBJKCJuTWVzaEdldFZlcnRpY2VzLCBjb24oJXApLCBNZXNoKCVwKSIsIGNvbiwgKFJzTWVzaCltZXNoKTsKKworICAgIFJzQWxsb2NhdGlvbiAqYWxsb2NzID0gKFJzQWxsb2NhdGlvbiopbWFsbG9jKCh1aW50MzJfdCludW1JbmRpY2VzICogc2l6ZW9mKFJzQWxsb2NhdGlvbikpOworICAgIHVpbnQzMl90ICpwcmltcz0gKHVpbnQzMl90KiltYWxsb2MoKHVpbnQzMl90KW51bUluZGljZXMgKiBzaXplb2YodWludDMyX3QpKTsKKworICAgIHJzTWVzaEdldEluZGljZXMoY29uLCAoUnNNZXNoKW1lc2gsIGFsbG9jcywgcHJpbXMsICh1aW50MzJfdCludW1JbmRpY2VzKTsKKworICAgIGZvcihqaW50IGkgPSAwOyBpIDwgbnVtSW5kaWNlczsgaSArKykgeworICAgICAgICBfZW52LT5TZXRJbnRBcnJheVJlZ2lvbihfaWR4SWRzLCBpLCAxLCAoY29uc3QgamludCopJmFsbG9jc1tpXSk7CisgICAgICAgIF9lbnYtPlNldEludEFycmF5UmVnaW9uKF9wcmltaXRpdmVzLCBpLCAxLCAoY29uc3QgamludCopJnByaW1zW2ldKTsKKyAgICB9CisKKyAgICBmcmVlKGFsbG9jcyk7CisgICAgZnJlZShwcmltcyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM1OSwxMjQgKzEyMDQsMTI5IEBACiB7Im5EZXZpY2VDcmVhdGUiLCAgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZUNyZWF0ZSB9LAogeyJuRGV2aWNlRGVzdHJveSIsICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5EZXZpY2VEZXN0cm95IH0sCiB7Im5EZXZpY2VTZXRDb25maWciLCAgICAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkRldmljZVNldENvbmZpZyB9LAoteyJuQ29udGV4dENyZWF0ZSIsICAgICAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0Q3JlYXRlIH0sCi17Im5Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoteyJuQ29udGV4dFNldFByaW9yaXR5IiwgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0UHJpb3JpdHkgfSwKLXsibkNvbnRleHRTZXRTdXJmYWNlIiwgICAgICAgICAgICAgIihJSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICAgICAgICAgICh2b2lkKiluQ29udGV4dFNldFN1cmZhY2UgfSwKLXsibkNvbnRleHREZXN0cm95IiwgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dERlc3Ryb3kgfSwKLXsibkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dER1bXAgfSwKLXsibkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dFBhdXNlIH0sCi17Im5Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRSZXN1bWUgfSwKLXsibkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQXNzaWduTmFtZSB9LAoteyJuT2JqRGVzdHJveSIsICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5PYmpEZXN0cm95IH0sCi17Im5PYmpEZXN0cm95T09CIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3lPT0IgfSwKLXsibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihbSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEdldE1lc3NhZ2UgfSwKLXsibkNvbnRleHRJbml0VG9DbGllbnQiLCAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEluaXRUb0NsaWVudCB9LAoteyJuQ29udGV4dERlaW5pdFRvQ2xpZW50IiwgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKK3sibkNvbnRleHRHZXRNZXNzYWdlIiwgICAgICAgICAgICAgIihJW0laKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRHZXRNZXNzYWdlIH0sCit7Im5Db250ZXh0SW5pdFRvQ2xpZW50IiwgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0SW5pdFRvQ2xpZW50IH0sCit7Im5Db250ZXh0RGVpbml0VG9DbGllbnQiLCAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RGVpbml0VG9DbGllbnQgfSwKIAoteyJuRmlsZU9wZW4iLCAgICAgICAgICAgICAgICAgICAgICAiKFtCKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5GaWxlT3BlbiB9LAogCi17Im5FbGVtZW50Q3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKLXsibkVsZW1lbnRDcmVhdGUyIiwgICAgICAgICAgICAgICAgIihbSVtMamF2YS9sYW5nL1N0cmluZzspSSIsICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKKy8vIEFsbCBtZXRob2RzIGJlbG93IGFyZSB0aHJlYWQgcHJvdGVjdGVkIGluIGphdmEuCit7InJzbkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dENyZWF0ZSB9LAoreyJyc25Db250ZXh0Q3JlYXRlR0wiLCAgICAgICAgICAgICAgICIoSUlaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRDcmVhdGVHTCB9LAoreyJyc25Db250ZXh0RmluaXNoIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0RmluaXNoIH0sCit7InJzbkNvbnRleHRTZXRQcmlvcml0eSIsICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRTZXRQcmlvcml0eSB9LAoreyJyc25Db250ZXh0U2V0U3VyZmFjZSIsICAgICAgICAgICAgICIoSUlJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgICAgICAgICAgKHZvaWQqKW5Db250ZXh0U2V0U3VyZmFjZSB9LAoreyJyc25Db250ZXh0RGVzdHJveSIsICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREZXN0cm95IH0sCit7InJzbkNvbnRleHREdW1wIiwgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHREdW1wIH0sCit7InJzbkNvbnRleHRQYXVzZSIsICAgICAgICAgICAgICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRQYXVzZSB9LAoreyJyc25Db250ZXh0UmVzdW1lIiwgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0UmVzdW1lIH0sCit7InJzbkFzc2lnbk5hbWUiLCAgICAgICAgICAgICAgICAgICAgIihJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFzc2lnbk5hbWUgfSwKK3sicnNuR2V0TmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAiKElJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICAgICAgICAgICAgICAgKHZvaWQqKW5HZXROYW1lIH0sCit7InJzbk9iakRlc3Ryb3kiLCAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk9iakRlc3Ryb3kgfSwKIAoteyJuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQmVnaW4gfSwKLXsiblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUFkZCB9LAoteyJuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5UeXBlQ3JlYXRlIH0sCi17Im5UeXBlRmluYWxEZXN0cm95IiwgICAgICAgICAgICAgICIoTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7KVYiLCAgICAgICAodm9pZCopblR5cGVGaW5hbERlc3Ryb3kgfSwKLXsiblR5cGVTZXR1cEZpZWxkcyIsICAgICAgICAgICAgICAgIihMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtbSVtJW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDspViIsICh2b2lkKiluVHlwZVNldHVwRmllbGRzIH0sCit7InJzbkZpbGVPcGVuIiwgICAgICAgICAgICAgICAgICAgICAgIihJW0IpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVPcGVuIH0sCit7InJzbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0gfSwKK3sicnNuRmlsZUEzREdldE51bUluZGV4RW50cmllcyIsICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldE51bUluZGV4RW50cmllcyB9LAoreyJyc25GaWxlQTNER2V0SW5kZXhFbnRyaWVzIiwgICAgICAgICIoSUlJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAodm9pZCopbkZpbGVBM0RHZXRJbmRleEVudHJpZXMgfSwKK3sicnNuRmlsZUEzREdldEVudHJ5QnlJbmRleCIsICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRmlsZUEzREdldEVudHJ5QnlJbmRleCB9LAogCi17Im5BbGxvY2F0aW9uQ3JlYXRlVHlwZWQiLCAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUZyb21CaXRtYXAiLCAgICAiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoteyJuQWxsb2NhdGlvbkNyZWF0ZUJpdG1hcFJlZiIsICAgICAiKElMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCi17Im5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcEJveGVkIiwiKElaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKLXsibkFsbG9jYXRpb25DcmVhdGVGcm9tQXNzZXRTdHJlYW0iLCIoSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoteyJuQWxsb2NhdGlvblVwbG9hZFRvVGV4dHVyZSIsICAgICAiKElaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCi17Im5BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoteyJuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCi17Im5BbGxvY2F0aW9uU3ViRGF0YTJEIiwgICAgICAgICAgICIoSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoteyJuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCi17Im5BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKLXsibkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCIsICAgIihJTGFuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGU7SUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhRnJvbU9iamVjdCB9LAoteyJuQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IiwgICAiKElMYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZTtJTGphdmEvbGFuZy9PYmplY3Q7KVYiLCAgICh2b2lkKiluQWxsb2NhdGlvblN1YlJlYWRGcm9tT2JqZWN0IH0sCit7InJzbkZvbnRDcmVhdGVGcm9tRmlsZSIsICAgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7SUkpSSIsICAgICAgICAgICAgICh2b2lkKiluRm9udENyZWF0ZUZyb21GaWxlIH0sCiAKLXsibkFkYXB0ZXIxREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQmluZEFsbG9jYXRpb24gfSwKLXsibkFkYXB0ZXIxRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU2V0Q29uc3RyYWludCB9LAoteyJuQWRhcHRlcjFERGF0YSIsICAgICAgICAgICAgICAgICAiKElbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2kgfSwKLXsibkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFERGF0YV9mIH0sCi17Im5BZGFwdGVyMURTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfaSB9LAoteyJuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTdWJEYXRhX2YgfSwKLXsibkFkYXB0ZXIxRENyZWF0ZSIsICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEQ3JlYXRlIH0sCit7InJzbkVsZW1lbnRDcmVhdGUiLCAgICAgICAgICAgICAgICAgIihJSUlaSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkVsZW1lbnRDcmVhdGUgfSwKK3sicnNuRWxlbWVudENyZWF0ZTIiLCAgICAgICAgICAgICAgICAiKElbSVtMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICh2b2lkKiluRWxlbWVudENyZWF0ZTIgfSwKK3sicnNuRWxlbWVudEdldE5hdGl2ZURhdGEiLCAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluRWxlbWVudEdldE5hdGl2ZURhdGEgfSwKK3sicnNuRWxlbWVudEdldFN1YkVsZW1lbnRzIiwgICAgICAgICAiKElJW0lbTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQqKW5FbGVtZW50R2V0U3ViRWxlbWVudHMgfSwKIAoteyJuQWRhcHRlcjJEQmluZEFsbG9jYXRpb24iLCAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRCaW5kQWxsb2NhdGlvbiB9LAoteyJuQWRhcHRlcjJEU2V0Q29uc3RyYWludCIsICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTZXRDb25zdHJhaW50IH0sCi17Im5BZGFwdGVyMkREYXRhIiwgICAgICAgICAgICAgICAgICIoSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfaSB9LAoteyJuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkREYXRhX2YgfSwKLXsibkFkYXB0ZXIyRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9pIH0sCi17Im5BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFN1YkRhdGFfZiB9LAoteyJuQWRhcHRlcjJEQ3JlYXRlIiwgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRDcmVhdGUgfSwKK3sicnNuVHlwZUJlZ2luIiwgICAgICAgICAgICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUJlZ2luIH0sCit7InJzblR5cGVBZGQiLCAgICAgICAgICAgICAgICAgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblR5cGVBZGQgfSwKK3sicnNuVHlwZUNyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKEkpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUNyZWF0ZSB9LAoreyJyc25UeXBlR2V0TmF0aXZlRGF0YSIsICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluVHlwZUdldE5hdGl2ZURhdGEgfSwKIAoteyJuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRCaW5kQWxsb2NhdGlvbiB9LAoteyJuU2NyaXB0U2V0Q2xlYXJDb2xvciIsICAgICAgICAgICAiKElGRkZGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRDbGVhckNvbG9yIH0sCi17Im5TY3JpcHRTZXRDbGVhckRlcHRoIiwgICAgICAgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldENsZWFyRGVwdGggfSwKLXsiblNjcmlwdFNldENsZWFyU3RlbmNpbCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Q2xlYXJTdGVuY2lsIH0sCi17Im5TY3JpcHRTZXRUaW1lWm9uZSIsICAgICAgICAgICAgICIoSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFRpbWVab25lIH0sCi17Im5TY3JpcHRTZXRUeXBlIiwgICAgICAgICAgICAgICAgICIoSVpMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFR5cGUgfSwKLXsiblNjcmlwdFNldFJvb3QiLCAgICAgICAgICAgICAgICAgIihaKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0Um9vdCB9LAoteyJuU2NyaXB0U2V0SW52b2thYmxlIiwgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0kpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRJbnZva2UgfSwKLXsiblNjcmlwdEludm9rZSIsICAgICAgICAgICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVUeXBlZCIsICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVUeXBlZCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCIsICAgICIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlRnJvbUJpdG1hcCB9LAoreyJyc25BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIiwgICAgICIoSUlMYW5kcm9pZC9ncmFwaGljcy9CaXRtYXA7KUkiLCAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uQ3JlYXRlQml0bWFwUmVmIH0sCit7InJzbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQiLCIoSUlaTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOylJIiwgICAgICAodm9pZCopbkFsbG9jYXRpb25DcmVhdGVGcm9tQml0bWFwQm94ZWQgfSwKK3sicnNuQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSIsIihJSVpJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkNyZWF0ZUZyb21Bc3NldFN0cmVhbSB9LAoreyJyc25BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIiwgICAgICIoSUlaSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlIH0sCit7InJzbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCIsIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25VcGxvYWRUb0J1ZmZlck9iamVjdCB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2kgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGExRCIsICAgICAgICAgICAiKElJSUlbU0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGExRF9zIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMUQiLCAgICAgICAgICAgIihJSUlJW0JJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMURfYiB9LAoreyJyc25BbGxvY2F0aW9uU3ViRGF0YTFEIiwgICAgICAgICAgICIoSUlJSVtGSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uU3ViRGF0YTFEX2YgfSwKK3sicnNuQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQiLCAgICAiKElJSUlbQkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkVsZW1lbnREYXRhMUQgfSwKK3sicnNuQWxsb2NhdGlvblN1YkRhdGEyRCIsICAgICAgICAgICAiKElJSUlJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblN1YkRhdGEyRF9pIH0sCit7InJzbkFsbG9jYXRpb25TdWJEYXRhMkQiLCAgICAgICAgICAgIihJSUlJSUlbRkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25TdWJEYXRhMkRfZiB9LAoreyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9pIH0sCit7InJzbkFsbG9jYXRpb25SZWFkIiwgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2YgfSwKK3sicnNuQWxsb2NhdGlvbkdldFR5cGUiLCAgICAgICAgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkdldFR5cGV9LAogCi17Im5TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENCZWdpbiB9LAoteyJuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKFtCSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDU2V0U2NyaXB0IH0sCi17Im5TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdENDcmVhdGUgfSwKLXsiblNjcmlwdENBZGREZWZpbmVJMzIiLCAgICAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q0FkZERlZmluZUkzMiB9LAoteyJuU2NyaXB0Q0FkZERlZmluZUYiLCAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0YpViIsICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQWRkRGVmaW5lRiB9LAoreyJyc25BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiIsICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURCaW5kQWxsb2NhdGlvbiB9LAoreyJyc25BZGFwdGVyMURTZXRDb25zdHJhaW50IiwgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURTZXRDb25zdHJhaW50IH0sCit7InJzbkFkYXB0ZXIxRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRERhdGFfaSB9LAoreyJyc25BZGFwdGVyMUREYXRhIiwgICAgICAgICAgICAgICAgICIoSUlbRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMUREYXRhX2YgfSwKK3sicnNuQWRhcHRlcjFEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlbSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjFEU3ViRGF0YV9pIH0sCit7InJzbkFkYXB0ZXIxRFN1YkRhdGEiLCAgICAgICAgICAgICAgIihJSUlJW0YpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIxRFN1YkRhdGFfZiB9LAoreyJyc25BZGFwdGVyMURDcmVhdGUiLCAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMURDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50U3RvcmVCZWdpbiIsICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyIsICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoTWFzayIsICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNvbG9yTWFzayIsICIoWlpaWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyIsICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQmxlbmRGdW5jIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciIsICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlRGl0aGVyIH0sCi17Im5Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSIsICAgICIoKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudFN0b3JlQ3JlYXRlIH0sCit7InJzbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIiwgICAgICAgIihJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyREJpbmRBbGxvY2F0aW9uIH0sCit7InJzbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQiLCAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRFNldENvbnN0cmFpbnQgfSwKK3sicnNuQWRhcHRlcjJERGF0YSIsICAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJERGF0YV9pIH0sCit7InJzbkFkYXB0ZXIyRERhdGEiLCAgICAgICAgICAgICAgICAgIihJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRERhdGFfZiB9LAoreyJyc25BZGFwdGVyMkRTdWJEYXRhIiwgICAgICAgICAgICAgICIoSUlJSUlJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BZGFwdGVyMkRTdWJEYXRhX2kgfSwKK3sicnNuQWRhcHRlcjJEU3ViRGF0YSIsICAgICAgICAgICAgICAiKElJSUlJSVtGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWRhcHRlcjJEU3ViRGF0YV9mIH0sCit7InJzbkFkYXB0ZXIyRENyZWF0ZSIsICAgICAgICAgICAgICAgIihJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFkYXB0ZXIyRENyZWF0ZSB9LAogCi17Im5Qcm9ncmFtQmluZENvbnN0YW50cyIsICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCi17Im5Qcm9ncmFtQmluZFRleHR1cmUiLCAgICAgICAgICAgICIoSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoteyJuUHJvZ3JhbUJpbmRTYW1wbGVyIiwgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKK3sicnNuU2NyaXB0QmluZEFsbG9jYXRpb24iLCAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0QmluZEFsbG9jYXRpb24gfSwKK3sicnNuU2NyaXB0U2V0VGltZVpvbmUiLCAgICAgICAgICAgICAiKElJW0IpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VGltZVpvbmUgfSwKK3sicnNuU2NyaXB0SW52b2tlIiwgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0SW52b2tlIH0sCit7InJzblNjcmlwdEludm9rZVYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdEludm9rZVYgfSwKK3sicnNuU2NyaXB0U2V0VmFySSIsICAgICAgICAgICAgICAgICAiKElJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0U2V0VmFySSB9LAoreyJyc25TY3JpcHRTZXRWYXJGIiwgICAgICAgICAgICAgICAgICIoSUlJRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRTZXRWYXJGIH0sCit7InJzblNjcmlwdFNldFZhclYiLCAgICAgICAgICAgICAgICAgIihJSUlbQilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNjcmlwdFNldFZhclYgfSwKIAoteyJuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIiwgICAgICAgICAiKFtJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgfSwKLXsiblByb2dyYW1GcmFnbWVudENyZWF0ZTIiLCAgICAgICAgIihMamF2YS9sYW5nL1N0cmluZztbSSlJIiwgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlMiB9LAoreyJyc25TY3JpcHRDQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQmVnaW4gfSwKK3sicnNuU2NyaXB0Q1NldFNjcmlwdCIsICAgICAgICAgICAgICAiKElbQklJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2NyaXB0Q1NldFNjcmlwdCB9LAoreyJyc25TY3JpcHRDQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TY3JpcHRDQ3JlYXRlIH0sCiAKLXsiblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJSVpaWilJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlckNyZWF0ZSB9LAoteyJuUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZSIsICAgICAiKElGKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplIH0sCi17Im5Qcm9ncmFtUmFzdGVyU2V0TGluZVdpZHRoIiwgICAgICIoSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGggfSwKK3sicnNuUHJvZ3JhbVN0b3JlQmVnaW4iLCAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQmVnaW4gfSwKK3sicnNuUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIiwgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlRGVwdGhGdW5jIH0sCit7InJzblByb2dyYW1TdG9yZURlcHRoTWFzayIsICAgICAgICAgIihJWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURlcHRoTWFzayB9LAoreyJyc25Qcm9ncmFtU3RvcmVDb2xvck1hc2siLCAgICAgICAgICIoSVpaWlopViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVDb2xvck1hc2sgfSwKK3sicnNuUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIiwgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVN0b3JlQmxlbmRGdW5jIH0sCit7InJzblByb2dyYW1TdG9yZURpdGhlciIsICAgICAgICAgICAgIihJWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1TdG9yZURpdGhlciB9LAoreyJyc25Qcm9ncmFtU3RvcmVDcmVhdGUiLCAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtU3RvcmVDcmVhdGUgfSwKIAoteyJuUHJvZ3JhbVZlcnRleENyZWF0ZSIsICAgICAgICAgICAiKFopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlIH0sCi17Im5Qcm9ncmFtVmVydGV4Q3JlYXRlMiIsICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUyIH0sCit7InJzblByb2dyYW1CaW5kQ29uc3RhbnRzIiwgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kQ29uc3RhbnRzIH0sCit7InJzblByb2dyYW1CaW5kVGV4dHVyZSIsICAgICAgICAgICAgIihJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1CaW5kVGV4dHVyZSB9LAoreyJyc25Qcm9ncmFtQmluZFNhbXBsZXIiLCAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtQmluZFNhbXBsZXIgfSwKIAoteyJuTGlnaHRCZWdpbiIsICAgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodEJlZ2luIH0sCi17Im5MaWdodFNldElzTW9ubyIsICAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0SXNNb25vIH0sCi17Im5MaWdodFNldElzTG9jYWwiLCAgICAgICAgICAgICAgICIoWilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0SXNMb2NhbCB9LAoteyJuTGlnaHRDcmVhdGUiLCAgICAgICAgICAgICAgICAgICAiKClJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodENyZWF0ZSB9LAoteyJuTGlnaHRTZXRDb2xvciIsICAgICAgICAgICAgICAgICAiKElGRkYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5MaWdodFNldENvbG9yIH0sCi17Im5MaWdodFNldFBvc2l0aW9uIiwgICAgICAgICAgICAgICIoSUZGRilWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkxpZ2h0U2V0UG9zaXRpb24gfSwKK3sicnNuUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIiwgICAgICAgICAiKElbSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbUZyYWdtZW50Q3JlYXRlIH0sCit7InJzblByb2dyYW1GcmFnbWVudENyZWF0ZTIiLCAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1GcmFnbWVudENyZWF0ZTIgfSwKIAoteyJuQ29udGV4dEJpbmRSb290U2NyaXB0IiwgICAgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFJvb3RTY3JpcHQgfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUiLCIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnRTdG9yZSB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQiLCAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB9LAoteyJuQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4IiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1WZXJ0ZXggfSwKLXsibkNvbnRleHRCaW5kUHJvZ3JhbVJhc3RlciIsICAgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQ29udGV4dEJpbmRQcm9ncmFtUmFzdGVyIH0sCit7InJzblByb2dyYW1SYXN0ZXJDcmVhdGUiLCAgICAgICAgICAgIihJWlpaKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtUmFzdGVyQ3JlYXRlIH0sCit7InJzblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGgiLCAgICAgIihJSUYpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1SYXN0ZXJTZXRMaW5lV2lkdGggfSwKK3sicnNuUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIiwgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluUHJvZ3JhbVJhc3RlclNldEN1bGxNb2RlIH0sCiAKLXsiblNhbXBsZXJCZWdpbiIsICAgICAgICAgICAgICAgICAgIigpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckJlZ2luIH0sCi17Im5TYW1wbGVyU2V0IiwgICAgICAgICAgICAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopblNhbXBsZXJTZXQgfSwKLXsiblNhbXBsZXJDcmVhdGUiLCAgICAgICAgICAgICAgICAgIigpSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlckNyZWF0ZSB9LAoreyJyc25Qcm9ncmFtVmVydGV4Q3JlYXRlIiwgICAgICAgICAgICIoSVopSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Qcm9ncmFtVmVydGV4Q3JlYXRlIH0sCit7InJzblByb2dyYW1WZXJ0ZXhDcmVhdGUyIiwgICAgICAgICAgIihJTGphdmEvbGFuZy9TdHJpbmc7W0kpSSIsICAgICAgICAgICAgICAodm9pZCopblByb2dyYW1WZXJ0ZXhDcmVhdGUyIH0sCiAKLXsiblNpbXBsZU1lc2hDcmVhdGUiLCAgICAgICAgICAgICAgIihJSVtJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2ltcGxlTWVzaENyZWF0ZSB9LAoteyJuU2ltcGxlTWVzaEJpbmRWZXJ0ZXgiLCAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZFZlcnRleCB9LAoteyJuU2ltcGxlTWVzaEJpbmRJbmRleCIsICAgICAgICAgICAiKElJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TaW1wbGVNZXNoQmluZEluZGV4IH0sCit7InJzbkNvbnRleHRCaW5kUm9vdFNjcmlwdCIsICAgICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUm9vdFNjcmlwdCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1TdG9yZSIsICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVN0b3JlIH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IiwgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50IH0sCit7InJzbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCIsICAgICAgIihJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkNvbnRleHRCaW5kUHJvZ3JhbVZlcnRleCB9LAoreyJyc25Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIiLCAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIgfSwKKworeyJyc25TYW1wbGVyQmVnaW4iLCAgICAgICAgICAgICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQmVnaW4gfSwKK3sicnNuU2FtcGxlclNldCIsICAgICAgICAgICAgICAgICAgICAiKElJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluU2FtcGxlclNldCB9LAoreyJyc25TYW1wbGVyQ3JlYXRlIiwgICAgICAgICAgICAgICAgICIoSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5TYW1wbGVyQ3JlYXRlIH0sCisKK3sicnNuTWVzaENyZWF0ZSIsICAgICAgICAgICAgICAgICAgICAiKElJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaENyZWF0ZSB9LAoreyJyc25NZXNoQmluZFZlcnRleCIsICAgICAgICAgICAgICAgICIoSUlJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZFZlcnRleCB9LAoreyJyc25NZXNoQmluZEluZGV4IiwgICAgICAgICAgICAgICAgICIoSUlJSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5NZXNoQmluZEluZGV4IH0sCisKK3sicnNuTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IiwgICAgICAiKElJKUkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IH0sCit7InJzbk1lc2hHZXRJbmRleENvdW50IiwgICAgICAgICAgICAgIihJSSlJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRleENvdW50IH0sCit7InJzbk1lc2hHZXRWZXJ0aWNlcyIsICAgICAgICAgICAgICAgIihJSVtJSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluTWVzaEdldFZlcnRpY2VzIH0sCit7InJzbk1lc2hHZXRJbmRpY2VzIiwgICAgICAgICAgICAgICAgIihJSVtJW0lJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbk1lc2hHZXRJbmRpY2VzIH0sCiAKIH07CiAKQEAgLTE1MTAsMyArMTM2MCw0IEBACiBiYWlsOgogICAgIHJldHVybiByZXN1bHQ7CiB9CisKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YSBiL2dyYXBoaWNzL3Rlc3RzL2dyYXBoaWNzdGVzdHMvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQml0bWFwRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTgyMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvdGVzdHMvZ3JhcGhpY3N0ZXN0cy9zcmMvYW5kcm9pZC9ncmFwaGljcy9CaXRtYXBGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBCaXRtYXBGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIC8vIHRlc3RzIHRoYXQgd2UgY2FuIGRlY29kZSBiaXRtYXBzIGZyb20gTWVtb3J5RmlsZXMKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpdG1hcFBhcmNlbEZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJpdG1hcCBiaXRtYXAxID0gQml0bWFwLmNyZWF0ZUJpdG1hcCgKKyAgICAgICAgICAgICAgICBuZXcgaW50W10geyBDb2xvci5CTFVFIH0sIDEsIDEsIEJpdG1hcC5Db25maWcuUkdCXzU2NSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGJpdG1hcDEuY29tcHJlc3MoQml0bWFwLkNvbXByZXNzRm9ybWF0LlBORywgMTAwLCBvdXQpOworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBwZmQgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5mcm9tRGF0YShvdXQudG9CeXRlQXJyYXkoKSwgbnVsbCk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZkID0gcGZkLmdldEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkdvdCBudWxsIEZpbGVEZXNjcmlwdG9yIiwgZmQpOworICAgICAgICBhc3NlcnRUcnVlKCJHb3QgaW52YWxpZCBGaWxlRGVzY3JpcHRvciIsIGZkLnZhbGlkKCkpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkJpdG1hcEZhY3RvcnkgcmV0dXJuZWQgbnVsbCIsIGJpdG1hcCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQml0bWFwIHdpZHRoIiwgMSwgYml0bWFwLmdldFdpZHRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJpdG1hcCBoZWlnaHQiLCAxLCBiaXRtYXAuZ2V0SGVpZ2h0KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaWN1NGovamF2YS9hbmRyb2lkL2ljdS90ZXh0L0FyYWJpY1NoYXBpbmcuamF2YSBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlMjE3NQotLS0gL2Rldi9udWxsCisrKyBiL2ljdTRqL2phdmEvYW5kcm9pZC9pY3UvdGV4dC9BcmFiaWNTaGFwaW5nLmphdmEKQEAgLTAsMCArMSwxOTQ3IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKgorICogUG9ydGVkIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucyBmcm9tIElDVTRKIDQuMidzCisgKiBjb20uaWJtLmljdS50ZXh0LkFyYWJpY1NoYXBpbmcgY2xhc3MuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmljdS50ZXh0OworCisKKy8qKgorICogU2hhcGUgQXJhYmljIHRleHQgb24gYSBjaGFyYWN0ZXIgYmFzaXMuCisgKgorICogPHA+QXJhYmljU2hhcGluZyBwZXJmb3JtcyBiYXNpYyBvcGVyYXRpb25zIGZvciAic2hhcGluZyIgQXJhYmljIHRleHQuIEl0IGlzIG1vc3QKKyAqIHVzZWZ1bCBmb3IgdXNlIHdpdGggbGVnYWN5IGRhdGEgZm9ybWF0cyBhbmQgbGVnYWN5IGRpc3BsYXkgdGVjaG5vbG9neQorICogKHNpbXBsZSB0ZXJtaW5hbHMpLiBBbGwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIG9uIFVuaWNvZGUgY2hhcmFjdGVycy48L3A+CisgKgorICogPHA+VGV4dC1iYXNlZCBzaGFwaW5nIG1lYW5zIHRoYXQgc29tZSBjaGFyYWN0ZXIgY29kZSBwb2ludHMgaW4gdGhlIHRleHQgYXJlCisgKiByZXBsYWNlZCBieSBvdGhlcnMgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiBJdCB0cmFuc2Zvcm1zIG9uZSBraW5kIG9mIHRleHQKKyAqIGludG8gYW5vdGhlci4gSW4gY29tcGFyaXNvbiwgbW9kZXJuIGRpc3BsYXlzIGZvciBBcmFiaWMgdGV4dCBzZWxlY3QKKyAqIGFwcHJvcHJpYXRlLCBjb250ZXh0LWRlcGVuZGVudCBmb250IGdseXBocyBmb3IgZWFjaCB0ZXh0IGVsZW1lbnQsIHdoaWNoIG1lYW5zCisgKiB0aGF0IHRoZXkgdHJhbnNmb3JtIHRleHQgaW50byBhIGdseXBoIHZlY3Rvci48L3A+CisgKgorICogPHA+VGV4dCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG5lY2Vzc2FyeSB3aGVuIG1vZGVybiBkaXNwbGF5IHRlY2hub2xvZ3kgaXMgbm90CisgKiBhdmFpbGFibGUgb3Igd2hlbiB0ZXh0IG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIHRvIG9yIGZyb20gbGVnYWN5IGZvcm1hdHMgdGhhdAorICogdXNlICJzaGFwZWQiIGNoYXJhY3RlcnMuIFNpbmNlIHRoZSBBcmFiaWMgc2NyaXB0IGlzIGN1cnNpdmUsIGNvbm5lY3RpbmcKKyAqIGFkamFjZW50IGxldHRlcnMgdG8gZWFjaCBvdGhlciwgY29tcHV0ZXJzIHNlbGVjdCBpbWFnZXMgZm9yIGVhY2ggbGV0dGVyIGJhc2VkCisgKiBvbiB0aGUgc3Vycm91bmRpbmcgbGV0dGVycy4gVGhpcyB1c3VhbGx5IHJlc3VsdHMgaW4gZm91ciBpbWFnZXMgcGVyIEFyYWJpYworICogbGV0dGVyOiBpbml0aWFsLCBtaWRkbGUsIGZpbmFsLCBhbmQgaXNvbGF0ZWQgZm9ybXMuIEluIFVuaWNvZGUsIG9uIHRoZSBvdGhlcgorICogaGFuZCwgbGV0dGVycyBhcmUgbm9ybWFsbHkgc3RvcmVkIGFic3RyYWN0LCBhbmQgYSBkaXNwbGF5IHN5c3RlbSBpcyBleHBlY3RlZAorICogdG8gc2VsZWN0IHRoZSBuZWNlc3NhcnkgZ2x5cGhzLiAoVGhpcyBtYWtlcyBzZWFyY2hpbmcgYW5kIG90aGVyIHRleHQKKyAqIHByb2Nlc3NpbmcgZWFzaWVyIGJlY2F1c2UgdGhlIHNhbWUgbGV0dGVyIGhhcyBvbmx5IG9uZSBjb2RlLikgSXQgaXMgcG9zc2libGUKKyAqIHRvIG1pbWljIHRoaXMgd2l0aCB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBiZWNhdXNlIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIGluCisgKiBVbmljb2RlIHRoYXQgYXJlIHJlbmRlcmVkIGFzIGxldHRlcnMgd2l0aCBhIHNwZWNpZmljIHNoYXBlCisgKiAob3IgY3Vyc2l2ZSBjb25uZWN0aXZpdHkpLiBUaGV5IHdlcmUgaW5jbHVkZWQgZm9yIGludGVyb3BlcmFiaWxpdHkgd2l0aAorICogbGVnYWN5IHN5c3RlbXMgYW5kIGNvZGVwYWdlcywgYW5kIGZvciB1bnNvcGhpc3RpY2F0ZWQgZGlzcGxheSBzeXN0ZW1zLjwvcD4KKyAqCisgKiA8cD5BIHNlY29uZCBraW5kIG9mIHRleHQgdHJhbnNmb3JtYXRpb25zIGlzIHN1cHBvcnRlZCBmb3IgQXJhYmljIGRpZ2l0czoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IGNvZGVwYWdlcyB0aGF0IG9ubHkgaW5jbHVkZSBFdXJvcGVhbiBkaWdpdHMsCisgKiBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIG9uZSBzZXQgb2YgZGlnaXRzIGJ5IGFub3RoZXIsIGNoYW5naW5nIHRoZQorICogY2hhcmFjdGVyIGNvZGUgcG9pbnRzLiBUaGVzZSBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgZm9yIGVpdGhlcgorICogQXJhYmljLUluZGljIERpZ2l0cyAoVSswNjYwLi4uVSswNjY5KSBvciBFYXN0ZXJuIChFeHRlbmRlZCkgQXJhYmljLUluZGljCisgKiBkaWdpdHMgKFUrMDZmMC4uLlUrMDZmOSkuPC9wPgorICoKKyAqIDxwPlNvbWUgcmVwbGFjZW1lbnRzIG1heSByZXN1bHQgaW4gbW9yZSBvciBmZXdlciBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cykuCisgKiBCeSBkZWZhdWx0LCB0aGlzIG1lYW5zIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBtYXkgcmVjZWl2ZSB0ZXh0IHdpdGggYQorICogbGVuZ3RoIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UgbGVuZ3RoLiBTb21lIGxlZ2FjeSBzeXN0ZW1zIHJlbHkgb24gdGhlCisgKiBsZW5ndGggb2YgdGhlIHRleHQgdG8gYmUgY29uc3RhbnQuIFRoZXkgZXhwZWN0IGV4dHJhIHNwYWNlcyB0byBiZSBhZGRlZAorICogb3IgY29uc3VtZWQgZWl0aGVyIG5leHQgdG8gdGhlIGFmZmVjdGVkIGNoYXJhY3RlciBvciBhdCB0aGUgZW5kIG9mIHRoZQorICogdGV4dC48L3A+CisgKiBAc3RhYmxlIElDVSAyLjAKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQXJhYmljU2hhcGluZyB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3B0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dpY2FsOyAvLyBjb252ZW5pZW5jZQorICAgIHByaXZhdGUgYm9vbGVhbiBzcGFjZXNSZWxhdGl2ZVRvVGV4dEJlZ2luRW5kOworICAgIHByaXZhdGUgY2hhciB0YWlsQ2hhcjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJhYmljU2hhcGluZyBTSEFQRVIgPSBuZXcgQXJhYmljU2hhcGluZygKKyAgICAgICAgICAgIEFyYWJpY1NoYXBpbmcuVEVYVF9ESVJFQ1RJT05fTE9HSUNBTCB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUiB8CisgICAgICAgICAgICBBcmFiaWNTaGFwaW5nLkxFVFRFUlNfU0hBUEUgfAorICAgICAgICAgICAgQXJhYmljU2hhcGluZy5ESUdJVFNfTk9PUCk7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgc291cmNlIGFycmF5LCBwdXR0aW5nIHRoZSByZXN1bHQKKyAgICAgKiBpbnRvIGEgcmFuZ2Ugb2YgdGV4dCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXksIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgICAqIG9mIGNoYXJhY3RlcnMgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaW5wdXQgdGV4dAorICAgICAqIEBwYXJhbSBzb3VyY2VTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2Ugb2YgdGV4dCB0byBjb252ZXJ0CisgICAgICogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGFycmF5IHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXN1bHQuCisgICAgICogICBJdCBtYXkgYmUgPGNvZGU+TlVMTDwvY29kZT4gb25seSBpZiAgPGNvZGU+ZGVzdFNpemU8L2NvZGU+IGlzIDAuCisgICAgICogQHBhcmFtIGRlc3RTdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdG8gdXNlLgorICAgICAqIEBwYXJhbSBkZXN0U2l6ZSBUaGUgc2l6ZSAoY2FwYWNpdHkpIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgICAgICogICBJZiA8Y29kZT5kZXN0U2l6ZTwvY29kZT4gaXMgMCwgdGhlbiBubyBvdXRwdXQgaXMgcHJvZHVjZWQsCisgICAgICogICBidXQgdGhlIG5lY2Vzc2FyeSBidWZmZXIgc2l6ZSBpcyByZXR1cm5lZCAoInByZWZsaWdodGluZyIpLiAgVGhpcworICAgICAqICAgZG9lcyBub3QgdmFsaWRhdGUgdGhlIHRleHQgYWdhaW5zdCB0aGUgb3B0aW9ucywgZm9yIGV4YW1wbGUsCisgICAgICogICBpZiBsZXR0ZXJzIGFyZSBiZWluZyB1bnNoYXBlZCwgYW5kIHNwYWNlcyBhcmUgYmVpbmcgY29uc3VtZWQKKyAgICAgKiAgIGZvbGxvd2luZyBsYW1hbGVmLCB0aGlzIHdpbGwgbm90IGRldGVjdCBhIGxhbWFsZWYgd2l0aG91dCBhCisgICAgICogICBjb3JyZXNwb25kaW5nIHNwYWNlLiAgQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gd2hlbiB0aGUgYWN0dWFsCisgICAgICogICBjb252ZXJzaW9uIGlzIGF0dGVtcHRlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcnMgd3JpdHRlbiB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAqICAgSWYgYW4gZXJyb3Igb2NjdXJzLCB0aGVuIG5vIG91dHB1dCB3YXMgd3JpdHRlbiwgb3IgaXQgbWF5IGJlCisgICAgICogICBpbmNvbXBsZXRlLgorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNoYXBlKGNoYXJbXSBzb3VyY2UsIGludCBzb3VyY2VTdGFydCwgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LCBpbnQgZGVzdFN0YXJ0LCBpbnQgZGVzdFNpemUpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2UgY2FuIG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VMZW5ndGggPCAwIHx8IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoID4gc291cmNlLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIHNvdXJjZSBzdGFydCAoIiArIHNvdXJjZVN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3IgbGVuZ3RoICgiICsgc291cmNlTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIHNvdXJjZS5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0ID09IG51bGwgJiYgZGVzdFNpemUgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCBkZXN0IHJlcXVpcmVzIGRlc3RTaXplID09IDAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRlc3RTaXplICE9IDApICYmCisgICAgICAgICAgICAoZGVzdFN0YXJ0IDwgMCB8fCBkZXN0U2l6ZSA8IDAgfHwgZGVzdFN0YXJ0ICsgZGVzdFNpemUgPiBkZXN0Lmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJhZCBkZXN0IHN0YXJ0ICgiICsgZGVzdFN0YXJ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgb3Igc2l6ZSAoIiArIGRlc3RTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgZm9yIGJ1ZmZlciBvZiBsZW5ndGggIiArIGRlc3QubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICAvKiBWYWxpZGF0ZSBpbnB1dCBvcHRpb25zICovCisgICAgICAgIGlmICggKChvcHRpb25zJlRBU0hLRUVMX01BU0spID4gMCkgJiYKKyAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9CRUdJTikgIHx8CisgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBUQVNIS0VFTF9NQVNLKT09VEFTSEtFRUxfRU5EICkgICB8fAorICAgICAgICAgICAgICAgKChvcHRpb25zICYgVEFTSEtFRUxfTUFTSyk9PVRBU0hLRUVMX1JFU0laRSApfHwKKyAgICAgICAgICAgICAgICgob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spPT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSApeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgVGFzaGtlZWwgYXJndW1lbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgLy8vQ0xPVkVSOk9GRgorICAgICAgIC8vQWNjb3JkaW5nIHRvIFN0ZXZlbiBMb29taXMsIHRoZSBjb2RlIGlzIHVucmVhY2hhYmxlIHdoZW4geW91IE9SIGFsbCB0aGUgY29uc3RhbnRzIHdpdGhpbiB0aGUgaWYgc3RhdGVtZW50cworICAgICAgIGlmKCgob3B0aW9ucyZMQU1BTEVGX01BU0spID4gMCkmJgorICAgICAgICAgICAgICAhKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfQkVHSU4pICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfRU5EICkgICB8fAorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSyk9PUxBTUFMRUZfUkVTSVpFICl8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX0FVVE8pICB8fAorICAgICAgICAgICAgICAgICAoKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spPT1MQU1BTEVGX05FQVIpKSl7CisgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldyb25nIExhbSBBbGVmIGFyZ3VtZW50Iik7CisgICAgICAgfQorICAgICAgIC8vL0NMT1ZFUjpPTgorCisgICAgICAgLyogVmFsaWRhdGUgVGFzaGtlZWwgKFRhc2hrZWVsIHJlcGxhY2VtZW50IG9wdGlvbnMgc2hvdWxkIGJlIGVuYWJsZWQgaW4gc2hhcGluZyBtb2RlIG9ubHkpKi8KKyAgICAgICBpZigoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgPiAwKSAmJiAob3B0aW9ucyZMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGFzaGtlZWwgcmVwbGFjZW1lbnQgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGluIGRlc2hhcGluZyBtb2RlICIpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gaW50ZXJuYWxTaGFwZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgsIGRlc3QsIGRlc3RTdGFydCwgZGVzdFNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSByYW5nZSBvZiB0ZXh0IGluIHBsYWNlLiAgVGhpcyBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBMZW5ndGggb3B0aW9uCisgICAgICogZG9lcyBub3QgZ3JvdyBvciBzaHJpbmsgdGhlIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlucHV0IHRleHQKKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBvZiB0ZXh0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIHRleHQgdG8gY29udmVydAorICAgICAqIEB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiBpZiB0aGUgdGV4dCBjYW5ub3QgYmUgY29udmVydGVkIGFjY29yZGluZyB0byB0aGUgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzaGFwZShjaGFyW10gc291cmNlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChvcHRpb25zICYgTEFNQUxFRl9NQVNLKSA9PSBMQU1BTEVGX1JFU0laRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIkNhbm5vdCBzaGFwZSBpbiBwbGFjZSB3aXRoIGxlbmd0aCBvcHRpb24gcmVzaXplLiIpOworICAgICAgICB9CisgICAgICAgIHNoYXBlKHNvdXJjZSwgc3RhcnQsIGxlbmd0aCwgc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlIG5ldyBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCisgICAgICogQHRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaGFwZShTdHJpbmcgdGV4dCkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworICAgICAgICBjaGFyW10gc3JjID0gdGV4dC50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gZGVzdCA9IHNyYzsKKyAgICAgICAgaWYgKCgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpICYmCisgICAgICAgICAgICAoKG9wdGlvbnMgJiBMRVRURVJTX01BU0spID09IExFVFRFUlNfVU5TSEFQRSkpIHsKKworICAgICAgICAgICAgZGVzdCA9IG5ldyBjaGFyW3NyYy5sZW5ndGggKiAyXTsgLy8gbWF4CisgICAgICAgIH0KKyAgICAgICAgaW50IGxlbiA9IHNoYXBlKHNyYywgMCwgc3JjLmxlbmd0aCwgZGVzdCwgMCwgZGVzdC5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlc3QsIDAsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IEFyYWJpY1NoYXBpbmcgdXNpbmcgdGhlIG9wdGlvbnMgZmxhZ3MuCisgICAgICogVGhlIGZsYWdzIGFyZSBhcyBmb2xsb3dzOjxicj4KKyAgICAgKiAnTEVOR1RIJyBmbGFncyBjb250cm9sIHdoZXRoZXIgdGhlIHRleHQgY2FuIGNoYW5nZSBzaXplLCBhbmQgaWYgbm90LAorICAgICAqIGhvdyB0byBtYWludGFpbiB0aGUgc2l6ZSBvZiB0aGUgdGV4dCB3aGVuIExhbUFsZWYgbGlnYXR1cmVzIGFyZQorICAgICAqIGZvcm1lZCBvciBicm9rZW4uPGJyPgorICAgICAqICdURVhUX0RJUkVDVElPTicgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHRoZSB0ZXh0IGlzIHJlYWQgYW5kIHdyaXR0ZW4KKyAgICAgKiBpbiB2aXN1YWwgb3JkZXIgb3IgaW4gbG9naWNhbCBvcmRlci48YnI+CisgICAgICogJ0xFVFRFUlNfU0hBUEUnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBjb252ZXJzaW9uIGlzIHRvIG9yIGZyb20KKyAgICAgKiBwcmVzZW50YXRpb24gZm9ybXMuPGJyPgorICAgICAqICdESUdJVFMnIGZsYWdzIGNvbnRyb2wgd2hldGhlciBkaWdpdHMgYXJlIHNoYXBlZCwgYW5kIHdoZXRoZXIgZnJvbQorICAgICAqIEV1cm9wZWFuIHRvIEFyYWJpYy1JbmRpYyBvciB2aWNlLXZlcnNhLjxicj4KKyAgICAgKiAnRElHSVRfVFlQRScgZmxhZ3MgY29udHJvbCB3aGV0aGVyIHN0YW5kYXJkIG9yIGV4dGVuZGVkIEFyYWJpYy1JbmRpYworICAgICAqIGRpZ2l0cyBhcmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgZGlnaXQgY29udmVyc2lvbi4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJhYmljU2hhcGluZyhpbnQgb3B0aW9ucykgeworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICBpZiAoKG9wdGlvbnMgJiBESUdJVFNfTUFTSykgPiAweDgwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgRElHSVRTIG9wdGlvbnMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzTG9naWNhbCA9ICggKG9wdGlvbnMgJiBURVhUX0RJUkVDVElPTl9NQVNLKSA9PSBURVhUX0RJUkVDVElPTl9MT0dJQ0FMICk7CisgICAgICAgIC8qIFZhbGlkYXRlIG9wdGlvbnMgKi8KKyAgICAgICAgc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCA9ICggKG9wdGlvbnMgJiBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9NQVNLKSA9PSBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgKTsKKyAgICAgICAgaWYgKCAob3B0aW9ucyZTSEFQRV9UQUlMX1RZUEVfTUFTSykgPT0gU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSl7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE5FV19UQUlMX0NIQVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWlsQ2hhciA9IE9MRF9UQUlMX0NIQVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZWVuIFRhaWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFNFRU4gZmFtaWx5IGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIKKyAgICAgKiAgICAgICAgICAgICAgIHRoZSBTRUVOIGZhbWlseSBjaGFyYWN0ZXIoaS5lLiB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGNoYXJhY3RlcikuCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBTZWVuIGNoYXJhY3RlciBmb2xsb3dlZCBieSBUYWlsIGNoYXJhY3RlciB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICByZXBsYWNlZCBieSBvbmUgY2VsbCBTZWVuIGFuZCBhIHNwYWNlIHdpbGwgcmVwbGFjZSB0aGUgVGFpbC4KKyAgICAgKiBBZmZlY3RzOiBTZWVuIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUVOX1RXT0NFTExfTkVBUiA9IDB4MjAwMDAwOworCisgICAgLyoqIEJpdCBtYXNrIGZvciBTZWVuIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRU5fTUFTSyA9IDB4NzAwMDAwOworCisgICAgLyogWWVoSGFtemEgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGhlIFlFSEhBTVpBIGNoYXJhY3RlciB3aWxsIGV4cGFuZCBpbnRvIHR3byBjaGFyYWN0ZXJzIHVzaW5nIHNwYWNlIG5lYXIgaXQKKyAgICAgKiAgICAgICAgICAgICAgKGkuZS4gdGhlIHNwYWNlIGFmdGVyIHRoZSBjaGFyYWN0ZXIpCisgICAgICogICAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gc3BhY2VzIGZvdW5kLCBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IEFueSBZZWggKGZpbmFsIG9yIGlzb2xhdGVkKSBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgSGFtemEgY2hhcmFjdGVyIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGJ5IG9uZSBjZWxsIFllaEhhbXphIGFuZCBzcGFjZSB3aWxsIHJlcGxhY2UgdGhlIEhhbXphLgorICAgICAqIEFmZmVjdHM6IFllaEhhbXphIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRUhIQU1aQV9UV09DRUxMX05FQVIgID0gMHgxMDAwMDAwOworCisKKyAgICAvKiogQml0IG1hc2sgZm9yIFllaEhhbXphIG1lbW9yeSBvcHRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFSEhBTVpBX01BU0sgPSAweDM4MDAwMDA7CisKKyAgICAvKiBOZXcgVGFzaGtlZWwgb3B0aW9ucyAqLworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgbW9kZTogVGFzaGtlZWwgY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4KKyAgICAgKiAgICAgICAgICAgICAgIFNwYWNlcyB3aWxsIGJlIHBsYWNlZCBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogRGUtc2hhcGluZyBtb2RlOiBOL0EKKyAgICAgKiBBZmZlY3RzOiBUYXNoa2VlbCBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFTSEtFRUxfQkVHSU4gPSAweDQwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgICAqICAgICAgICAgICAgICAgU3BhY2VzIHdpbGwgYmUgcGxhY2VkIGF0IGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqIEFmZmVjdHM6IFRhc2hrZWVsIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9FTkQgPSAweDYwMDAwOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogYWxsb3cgdGhlIHJlc3VsdCB0byBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBzb3VyY2UuCisgICAgICogU2hhcGluZyBtb2RlOiBUYXNoa2VlbCBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVtb3ZlZCwgYnVmZmVyIGxlbmd0aCB3aWxsIHNocmluay4KKyAgICAgKiBEZS1zaGFwaW5nIG1vZGU6IE4vQQorICAgICAqCisgICAgICogQWZmZWN0czogVGFzaGtlZWwgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFU0laRSA9IDB4ODAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBTaGFwaW5nIG1vZGU6IFRhc2hrZWVsIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCBieSBUYXR3ZWVsIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBhZGphY2VudAorICAgICAqICAgICAgICAgICAgICAgY2hhcmFjdGVycyAoaS5lLiBzaGFwZWQgb24gVGF0d2VlbCkgb3IgcmVwbGFjZWQgYnkgc3BhY2UgaWYgaXQgaXMgbm90IGNvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIERlLXNoYXBpbmcgbW9kZTogTi9BCisgICAgICogQWZmZWN0czogWWVoSGFtemEgb3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTCA9IDB4QzAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIFRhc2hrZWVsIHJlcGxhY2VtZW50IHdpdGggU3BhY2Ugb3IgVGF0d2VlbCBtZW1vcnkgb3B0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQVNIS0VFTF9NQVNLICA9IDB4RTAwMDA7CisKKyAgICAvKiBTcGFjZSBsb2NhdGlvbiBDb250cm9sIG9wdGlvbnMgKi8KKyAgICAvKioKKyAgICAgKiBUaGlzIG9wdGlvbiBlZmZlY3RzIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb3B0aW9ucy4gaWYgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQgdGhlIGRlZmF1bHQKKyAgICAgKiBmb3IgQkVHSU4gYW5kIEVORCB3aWxsIGJlIGFzIGZvbGxvd2luZzoKKyAgICAgKiBUaGUgRGVmYXVsdCAoZm9yIGJvdGggVmlzdWFsIExUUiwgVmlzdWFsIFJUTCBhbmQgTG9naWNhbCBUZXh0KQorICAgICAqICAgICAgICAgICAxLiBCRUdJTiBhbHdheXMgcmVmZXJzIHRvIHRoZSBzdGFydCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKiAgICAgICAgICAgMi4gRU5EIGFsd2F5cyByZWZlcnMgdG8gdGhlIGVuZCBhZGRyZXNzIG9mIHBoeXNpY2FsIG1lbW9yeS4KKyAgICAgKgorICAgICAqIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQgaXQgd2lsbCBzd2FwIHRoZSBtZWFuaW5nIG9mIEJFR0lOIGFuZCBFTkQgb25seSBmb3IgVmlzdWFsIExUUiB0ZXh0LgorICAgICAqCisgICAgICogVGhlIGFmZmVjdCBvbiBCRUdJTiBhbmQgRU5EIE1lbW9yeSBPcHRpb25zIHdpbGwgYmUgYXMgZm9sbG93aW5nOgorICAgICAqICAgIEEuIEJFR0lOIEZvciBWaXN1YWwgTFRSIHRleHQ6IFRoaXMgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIChyaWdodCBzaWRlKSBvZiB0aGUgdmlzdWFsIHRleHQKKyAgICAgKiAgICAgICAoY29ycmVzcG9uZGluZyB0byB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgZW5kLCBzYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEIuIEJFR0lOIEZvciBMb2dpY2FsIHRleHQ6IFNhbWUgYXMgQkVHSU4gaW4gZGVmYXVsdCBiZWhhdmlvci4KKyAgICAgKiAgICBDLiBFTkQgRm9yIFZpc3VhbCBMVFIgdGV4dDogVGhpcyB3aWxsIGJlIHRoZSBlbmQgKGxlZnQgc2lkZSkgb2YgdGhlIHZpc3VhbCB0ZXh0LiAoY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIGJlZ2lubmluZywgc2FtZSBhcyBCRUdJTiBpbiBkZWZhdWx0IGJlaGF2aW9yKQorICAgICAqICAgIEQuIEVORCBGb3IgTG9naWNhbCB0ZXh0OiBTYW1lIGFzIEVORCBpbiBkZWZhdWx0IGJlaGF2aW9yLgorICAgICAqIEFmZmVjdHM6IEFsbCBMYW1BbGVmIEJFR0lOLCBFTkQgYW5kIEFVVE8gb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUEFDRVNfUkVMQVRJVkVfVE9fVEVYVF9CRUdJTl9FTkQgPSAweDQwMDAwMDA7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIHN3YXBwaW5nIEJFR0lOIGFuZCBFTkQgZm9yIFZpc3VhbCBMVFIgdGV4dCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNQQUNFU19SRUxBVElWRV9UT19URVhUX01BU0sgPSAweDQwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBzaGFwaW5nIHdpbGwgdXNlIHRoZSBuZXcgVW5pY29kZSBjb2RlIHBvaW50IGZvciBUQUlMIChpLmUuIDB4RkU3MykuCisgICAgICogSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCAoRGVmYXVsdCksIG9sZCB1bm9mZmljaWFsIFVuaWNvZGUgVEFJTCBjb2RlIHBvaW50IGlzIHVzZWQgKGkuZS4gMHgyMDBCKQorICAgICAqIERlLXNoYXBpbmcgd2lsbCBub3QgdXNlIHRoaXMgb3B0aW9uIGFzIGl0IHdpbGwgYWx3YXlzIHNlYXJjaCBmb3IgYm90aCB0aGUgbmV3IFVuaWNvZGUgY29kZSBwb2ludCBmb3IgdGhlCisgICAgICogVEFJTCAoaS5lLiAweEZFNzMpIG9yIHRoZSBvbGQgdW5vZmZpY2lhbCBVbmljb2RlIFRBSUwgY29kZSBwb2ludCAoaS5lLiAweDIwMEIpIGFuZCBkZS1zaGFwZSB0aGUKKyAgICAgKiBTZWVuLUZhbWlseSBsZXR0ZXIgYWNjb3JkaW5nbHkuCisgICAgICoKKyAgICAgKiBTaGFwaW5nIE1vZGU6IE9ubHkgc2hhcGluZy4KKyAgICAgKiBEZS1zaGFwaW5nIE1vZGU6IE4vQS4KKyAgICAgKiBBZmZlY3RzOiBBbGwgU2VlbiBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfVEFJTF9ORVdfVU5JQ09ERSA9IDB4ODAwMDAwMDsKKworICAgIC8qKiBCaXQgbWFzayBmb3IgbmV3IFVuaWNvZGUgVGFpbCBvcHRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFQRV9UQUlMX1RZUEVfTUFTSyA9IDB4ODAwMDAwMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IGFsbG93IHRoZSByZXN1bHQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsZW5ndGggdGhhbiB0aGUgc291cmNlLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9HUk9XX1NIUklOSyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiBhbGxvdyB0aGUgcmVzdWx0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIHNvdXJjZS4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBMRU5HVEhfR1JPV19TSFJJTksKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX1JFU0laRSAgID0gMDsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIG5leHQgdG8gbW9kaWZpZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX05FQVIgPSAxOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgbmV4dCB0byBtb2RpZmllZCBjaGFyYWN0ZXJzLgorICAgICAqIEFmZmVjdHM6IExhbUFsZWYgb3B0aW9ucworICAgICAqIFRoaXMgb3B0aW9uIGlzIGFuIGFsaWFzIHRvIExFTkdUSF9GSVhFRF9TUEFDRVNfTkVBUgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBTUFMRUZfTkVBUiA9IDEgOworCisgICAgLyoqCisgICAgICogTWVtb3J5IG9wdGlvbjogdGhlIHJlc3VsdCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzb3VyY2UuCisgICAgICogSWYgbW9yZSByb29tIGlzIG5lY2Vzc2FyeSwgdGhlbiB0cnkgdG8gY29uc3VtZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfRklYRURfU1BBQ0VTX0FUX0VORCA9IDI7CisKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9FTkQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0VORCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBNZW1vcnkgb3B0aW9uOiB0aGUgcmVzdWx0IG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNvdXJjZS4KKyAgICAgKiBJZiBtb3JlIHJvb20gaXMgbmVjZXNzYXJ5LCB0aGVuIHRyeSB0byBjb25zdW1lIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0LgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9GSVhFRF9TUEFDRVNfQVRfQkVHSU5OSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIElmIG1vcmUgcm9vbSBpcyBuZWNlc3NhcnksIHRoZW4gdHJ5IHRvIGNvbnN1bWUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQuCisgICAgICogQWZmZWN0czogTGFtQWxlZiBvcHRpb25zCisgICAgICogVGhpcyBvcHRpb24gaXMgYW4gYWxpYXMgdG8gTEVOR1RIX0ZJWEVEX1NQQUNFU19BVF9CRUdJTk5JTkcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0JFR0lOID0gMzsKKworICAgIC8qKgorICAgICAqIE1lbW9yeSBvcHRpb246IHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc291cmNlLgorICAgICAqIFNoYXBpbmcgTW9kZTogRm9yIGVhY2ggTEFNQUxFRiBjaGFyYWN0ZXIgZm91bmQsIGV4cGFuZCBMQU1BTEVGIHVzaW5nIHNwYWNlIGF0IGVuZC4KKyAgICAgKiAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIHNwYWNlIGF0IGVuZCwgdXNlIHNwYWNlcyBhdCBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlcmUKKyAgICAgKiAgICAgICAgICAgICAgIGlzIG5vIHNwYWNlIGF0IGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLCB1c2Ugc3BhY2VzIGF0IHRoZSBuZWFyIChpLmUuIHRoZSBzcGFjZQorICAgICAqICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIExBTUFMRUYgY2hhcmFjdGVyKS4KKyAgICAgKgorICAgICAqIERlc2hhcGluZyBNb2RlOiBQZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBmbGFnIGVxdWFscyBMQU1BTEVGX0VORC4KKyAgICAgKiBBZmZlY3RzOiBMYW1BbGVmIG9wdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX0FVVE8gID0gMHgxMDAwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBtZW1vcnkgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRU5HVEhfTUFTSyA9IDB4MTAwMDM7CisKKyAgICAvKiogQml0IG1hc2sgZm9yIExhbUFsZWYgbWVtb3J5IG9wdGlvbnMuICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQU1BTEVGX01BU0sgID0gMHgxMDAwMzsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gbG9naWNhbCAoa2V5Ym9hcmQpIG9yZGVyLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfRElSRUNUSU9OX0xPR0lDQUwgPSAwOworCisgICAgLyoqCisgICAgICogRGlyZWN0aW9uIGluZGljYXRvcjp0aGUgc291cmNlIGlzIGluIHZpc3VhbCBSVEwgb3JkZXIsCisgICAgICogdGhlIHJpZ2h0bW9zdCBkaXNwbGF5ZWQgY2hhcmFjdGVyIHN0b3JlZCBmaXJzdC4KKyAgICAgKiBUaGlzIG9wdGlvbiBpcyBhbiBhbGlhcyB0byBVX1NIQVBFX1RFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0RJUkVDVElPTl9WSVNVQUxfUlRMID0gMDsKKworICAgIC8qKgorICAgICAqIERpcmVjdGlvbiBpbmRpY2F0b3I6IHRoZSBzb3VyY2UgaXMgaW4gdmlzdWFsIChkaXNwbGF5KSBvcmRlciwgdGhhdCBpcywKKyAgICAgKiB0aGUgbGVmdG1vc3QgZGlzcGxheWVkIGNoYXJhY3RlciBpcyBzdG9yZWQgZmlyc3QuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fVklTVUFMX0xUUiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBCaXQgbWFzayBmb3IgZGlyZWN0aW9uIGluZGljYXRvcnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9ESVJFQ1RJT05fTUFTSyA9IDQ7CisKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogZG8gbm90IHBlcmZvcm0gbGV0dGVyIHNoYXBpbmcuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBieSBzaGFwZWQgb25lcyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suIFBlcmZvcm1zIExhbS1BbGVmIGxpZ2F0dXJlCisgICAgICogc3Vic3RpdHV0aW9uLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfU0hBUEUgPSA4OworCisgICAgLyoqCisgICAgICogTGV0dGVyIHNoYXBpbmcgb3B0aW9uOiByZXBsYWNlIHNoYXBlZCBsZXR0ZXIgY2hhcmFjdGVycyBpbiB0aGUgVStGRTcwIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2sKKyAgICAgKiBieSBub3JtYXRpdmUgb25lcyBpbiB0aGUgVSswNjAwIChBcmFiaWMpIGJsb2NrLiAgQ29udmVydHMgTGFtLUFsZWYgbGlnYXR1cmVzIHRvIHBhaXJzIG9mIExhbSBhbmQKKyAgICAgKiBBbGVmIGNoYXJhY3RlcnMsIGNvbnN1bWluZyBzcGFjZXMgaWYgcmVxdWlyZWQuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVUVEVSU19VTlNIQVBFID0gMHgxMDsKKworICAgIC8qKgorICAgICAqIExldHRlciBzaGFwaW5nIG9wdGlvbjogcmVwbGFjZSBub3JtYXRpdmUgbGV0dGVyIGNoYXJhY3RlcnMgaW4gdGhlIFUrMDYwMCAoQXJhYmljKSBibG9jaywKKyAgICAgKiBleGNlcHQgZm9yIHRoZSBUQVNIS0VFTCBjaGFyYWN0ZXJzIGF0IFUrMDY0Qi4uLlUrMDY1MiwgYnkgc2hhcGVkIG9uZXMgaW4gdGhlIFUrRmU3MAorICAgICAqIChQcmVzZW50YXRpb24gRm9ybXMgQikgYmxvY2suICBUaGUgVEFTSEtFRUwgY2hhcmFjdGVycyB3aWxsIGFsd2F5cyBiZSBjb252ZXJ0ZWQgdG8KKyAgICAgKiB0aGUgaXNvbGF0ZWQgZm9ybXMgcmF0aGVyIHRoYW4gdG8gdGhlaXIgY29ycmVjdCBzaGFwZS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEID0gMHgxODsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBsZXR0ZXIgc2hhcGluZyBvcHRpb25zLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFVFRFUlNfTUFTSyA9IDB4MTg7CisKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBkbyBub3QgcGVyZm9ybSBkaWdpdCBzaGFwaW5nLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19OT09QID0gMDsKKworICAgIC8qKgorICAgICAqIERpZ2l0IHNoYXBpbmcgb3B0aW9uOiBSZXBsYWNlIEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KSBieSBBcmFiaWMtSW5kaWMgZGlnaXRzLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUU19FTjJBTiA9IDB4MjA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCBzaGFwaW5nIG9wdGlvbjogUmVwbGFjZSBBcmFiaWMtSW5kaWMgZGlnaXRzIGJ5IEV1cm9wZWFuIGRpZ2l0cyAoVSswMDMwLi4uVSswMDM5KS4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfQU4yRU4gPSAweDQwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIG5vdCBhbiBBcmFiaWMsCisgICAgICogbGV0dGVyLCBzbyBFdXJvcGVhbiBkaWdpdHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHdpbGwgbm90IGNoYW5nZS4KKyAgICAgKiBDb21wYXJlIHRvIERJR0lUU19BTEVOMkFOX0lOSVRfQUwuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfTFIgPSAweDYwOworCisgICAgLyoqCisgICAgICogRGlnaXQgc2hhcGluZyBvcHRpb246CisgICAgICogUmVwbGFjZSBFdXJvcGVhbiBkaWdpdHMgKFUrMDAzMC4uLlUrMDAzOSkgYnkgQXJhYmljLUluZGljIGRpZ2l0cworICAgICAqIGlmIHRoZSBtb3N0IHJlY2VudCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIKKyAgICAgKiBpcyBhbiBBcmFiaWMgbGV0dGVyIChpdHMgQmlkaSBkaXJlY3Rpb24gdmFsdWUgaXMgUklHSFRfVE9fTEVGVF9BUkFCSUMpLgorICAgICAqIFRoZSBpbml0aWFsIHN0YXRlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBpcyBhc3N1bWVkIHRvIGJlIGFuIEFyYWJpYywKKyAgICAgKiBsZXR0ZXIsIHNvIEV1cm9wZWFuIGRpZ2l0cyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgd2lsbCBjaGFuZ2UuCisgICAgICogQ29tcGFyZSB0byBESUdJVFNfQUxFTjJBTl9JTlRfTFIuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRTX0VOMkFOX0lOSVRfQUwgPSAweDgwOworCisgICAgLyoqIE5vdCBhIHZhbGlkIG9wdGlvbiB2YWx1ZS4gKi8KKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdJVFNfUkVTRVJWRUQgPSAweGEwOworCisgICAgLyoqCisgICAgICogQml0IG1hc2sgZm9yIGRpZ2l0IHNoYXBpbmcgb3B0aW9ucy4KKyAgICAgKiBAc3RhYmxlIElDVSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUdJVFNfTUFTSyA9IDB4ZTA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFUrMDY2MC4uLlUrMDY2OSkuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9BTiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdCB0eXBlIG9wdGlvbjogVXNlIEVhc3Rlcm4gKEV4dGVuZGVkKSBBcmFiaWMtSW5kaWMgZGlnaXRzIChVKzA2ZjAuLi5VKzA2ZjkpLgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJR0lUX1RZUEVfQU5fRVhURU5ERUQgPSAweDEwMDsKKworICAgIC8qKgorICAgICAqIEJpdCBtYXNrIGZvciBkaWdpdCB0eXBlIG9wdGlvbnMuCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElHSVRfVFlQRV9NQVNLID0gMHgwMTAwOyAvLyAweDNmMDA/CisKKyAgICAvKioKKyAgICAgKiBzb21lIGNvbnN0YW50cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSEFNWkFGRV9DSEFSICAgICAgID0gJ1x1ZmU4MCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBIQU1aQTA2X0NIQVIgICAgICAgPSAnXHUwNjIxJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFlFSF9IQU1aQV9DSEFSICAgICA9ICdcdTA2MjYnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgWUVIX0hBTVpBRkVfQ0hBUiAgID0gJ1x1RkU4OSc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU1BTEVGX1NQQUNFX1NVQiAgPSAnXHVmZmZmJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBU0hLRUVMX1NQQUNFX1NVQiA9ICdcdWZmZmUnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEFNX0NIQVIgICAgICA9ICdcdTA2NDQnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiAgICA9ICdcdTAwMjAnOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUl9GT1JfTEFNQUxFRiA9ICdcdWZlZmYnOyAvLyBYWFg6IHR3ZWFrIGZvciBUZXh0TGluZSB1c2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9DSEFSICAgPSAnXHVGRTdDJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRBVFdFRUxfQ0hBUiAgPSAnXHUwNjQwJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNIQUREQV9UQVRXRUVMX0NIQVIgPSAnXHVGRTdEJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5FV19UQUlMX0NIQVIgPSAnXHVGRTczJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9MRF9UQUlMX0NIQVIgPSAnXHUyMDBCJzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hBUEVfTU9ERSAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVTSEFQRV9NT0RFICAgID0gMTsKKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgcmhzKSB7CisgICAgICAgIHJldHVybiByaHMgIT0gbnVsbCAmJgorICAgICAgICAgICAgcmhzLmdldENsYXNzKCkgPT0gQXJhYmljU2hhcGluZy5jbGFzcyAmJgorICAgICAgICAgICAgb3B0aW9ucyA9PSAoKEFyYWJpY1NoYXBpbmcpcmhzKS5vcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzdGFibGUgSUNVIDIuMAorICAgICAqLworICAgICAvLy9DTE9WRVI6T0ZGCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHN0YWJsZSBJQ1UgMi4wCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1snKTsKKworICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMQU1BTEVGX01BU0spIHsKKyAgICAgICAgY2FzZSBMQU1BTEVGX1JFU0laRTogYnVmLmFwcGVuZCgiTGFtQWxlZiByZXNpemUiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9ORUFSOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGJ1Zi5hcHBlbmQoIkxhbUFsZWYgc3BhY2VzIGF0IGJlZ2luIik7IGJyZWFrOworICAgICAgICBjYXNlIExBTUFMRUZfRU5EOiBidWYuYXBwZW5kKCJMYW1BbGVmIHNwYWNlcyBhdCBlbmQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEFNQUxFRl9BVVRPOiBidWYuYXBwZW5kKCJsYW1BbGVmIGF1dG8iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgVEVYVF9ESVJFQ1RJT05fTUFTSykgeworICAgICAgICBjYXNlIFRFWFRfRElSRUNUSU9OX0xPR0lDQUw6IGJ1Zi5hcHBlbmQoIiwgbG9naWNhbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBURVhUX0RJUkVDVElPTl9WSVNVQUxfTFRSOiBidWYuYXBwZW5kKCIsIHZpc3VhbCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBMRVRURVJTX01BU0spIHsKKyAgICAgICAgY2FzZSBMRVRURVJTX05PT1A6IGJ1Zi5hcHBlbmQoIiwgbm8gbGV0dGVyIHNoYXBpbmciKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRTogYnVmLmFwcGVuZCgiLCBzaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6IGJ1Zi5hcHBlbmQoIiwgc2hhcGUgbGV0dGVycyB0YXNoa2VlbCBpc29sYXRlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6IGJ1Zi5hcHBlbmQoIiwgdW5zaGFwZSBsZXR0ZXJzIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFNFRU5fTUFTSykgeworICAgICAgICBjYXNlIFNFRU5fVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFNlZW4gYXQgbmVhciIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLKSB7CisgICAgICAgIGNhc2UgWUVISEFNWkFfVFdPQ0VMTF9ORUFSOiBidWYuYXBwZW5kKCIsIFllaCBIYW16YSBhdCBuZWFyIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIFRBU0hLRUVMX01BU0spIHsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9CRUdJTjogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCBhdCBiZWdpbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgYXQgZW5kIik7IGJyZWFrOworICAgICAgICBjYXNlIFRBU0hLRUVMX1JFUExBQ0VfQllfVEFUV0VFTDogYnVmLmFwcGVuZCgiLCBUYXNoa2VlbCByZXBsYWNlIHdpdGggdGF0d2VlbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBUQVNIS0VFTF9SRVNJWkU6IGJ1Zi5hcHBlbmQoIiwgVGFzaGtlZWwgcmVzaXplIik7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRTX01BU0spIHsKKyAgICAgICAgY2FzZSBESUdJVFNfTk9PUDogYnVmLmFwcGVuZCgiLCBubyBkaWdpdCBzaGFwaW5nIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRElHSVRTX0FOMkVOOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBFTiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9MUjogYnVmLmFwcGVuZCgiLCBzaGFwZSBkaWdpdHMgdG8gQU4gY29udGV4dHVhbGx5OiBkZWZhdWx0IEVOIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0FMOiBidWYuYXBwZW5kKCIsIHNoYXBlIGRpZ2l0cyB0byBBTiBjb250ZXh0dWFsbHk6IGRlZmF1bHQgQUwiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgRElHSVRfVFlQRV9NQVNLKSB7CisgICAgICAgIGNhc2UgRElHSVRfVFlQRV9BTjogYnVmLmFwcGVuZCgiLCBzdGFuZGFyZCBBcmFiaWMtSW5kaWMgZGlnaXRzIik7IGJyZWFrOworICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6IGJ1Zi5hcHBlbmQoIiwgZXh0ZW5kZWQgQXJhYmljLUluZGljIGRpZ2l0cyIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKyAgICAvLy9DTE9WRVI6T04KKworICAgIC8vCisgICAgLy8gcG9ydGVkIGFwaQorICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVJSRUxFVkFOVCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExBTVRZUEUgPSAxNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxFRlRZUEUgPSAzMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LUiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktMID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19NQVNLID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBpcnJlbGV2YW50UG9zW10gPSB7CisgICAgICAgIDB4MCwgMHgyLCAweDQsIDB4NiwgMHg4LCAweEEsIDB4QywgMHhFCisgICAgfTsKKworLyoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnRMYW1BbGVmW10gPSAgeworICAgICAgICAnXHUwNjIyJywgLy8gRkVGNQorICAgICAgICAnXHUwNjIyJywgLy8gRkVGNgorICAgICAgICAnXHUwNjIzJywgLy8gRkVGNworICAgICAgICAnXHUwNjIzJywgLy8gRkVGOAorICAgICAgICAnXHUwNjI1JywgLy8gRkVGOQorICAgICAgICAnXHUwNjI1JywgLy8gRkVGQQorICAgICAgICAnXHUwNjI3JywgLy8gRkVGQgorICAgICAgICAnXHUwNjI3JyAgLy8gRkVGQworICAgIH07CisqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsW10gPSB7CisgICAgICAgIC8qIEZFQjEgKi8gMSwKKyAgICAgICAgLyogRkVCMiAqLyAxLAorICAgICAgICAvKiBGRUIzICovIDAsCisgICAgICAgIC8qIEZFQjQgKi8gMCwKKyAgICAgICAgLyogRkVCNSAqLyAxLAorICAgICAgICAvKiBGRUI2ICovIDEsCisgICAgICAgIC8qIEZFQjcgKi8gMCwKKyAgICAgICAgLyogRkVCOCAqLyAwLAorICAgICAgICAvKiBGRUI5ICovIDEsCisgICAgICAgIC8qIEZFQkEgKi8gMSwKKyAgICAgICAgLyogRkVCQiAqLyAwLAorICAgICAgICAvKiBGRUJDICovIDAsCisgICAgICAgIC8qIEZFQkQgKi8gMSwKKyAgICAgICAgLyogRkVCRSAqLyAxCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YXNoa2VlbE1lZGlhbFtdID0geworICAgICAgICAvKiBGRTcwICovIDAsCisgICAgICAgIC8qIEZFNzEgKi8gMSwKKyAgICAgICAgLyogRkU3MiAqLyAwLAorICAgICAgICAvKiBGRTczICovIDAsCisgICAgICAgIC8qIEZFNzQgKi8gMCwKKyAgICAgICAgLyogRkU3NSAqLyAwLAorICAgICAgICAvKiBGRTc2ICovIDAsCisgICAgICAgIC8qIEZFNzcgKi8gMSwKKyAgICAgICAgLyogRkU3OCAqLyAwLAorICAgICAgICAvKiBGRTc5ICovIDEsCisgICAgICAgIC8qIEZFN0EgKi8gMCwKKyAgICAgICAgLyogRkU3QiAqLyAxLAorICAgICAgICAvKiBGRTdDICovIDAsCisgICAgICAgIC8qIEZFN0QgKi8gMSwKKyAgICAgICAgLyogRkU3RSAqLyAwLAorICAgICAgICAvKiBGRTdGICovIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciB5ZWhIYW16YVRvWWVoW10gPQorICAgIHsKKyAgICAvKiBpc29sYXRlZCovIDB4RkVFRiwKKyAgICAvKiBmaW5hbCAgICovIDB4RkVGMAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltdID0geworICAgICAgICAnXHUwNjIyJywgLy8gMDY1QworICAgICAgICAnXHUwNjIzJywgLy8gMDY1RAorICAgICAgICAnXHUwNjI1JywgLy8gMDY1RQorICAgICAgICAnXHUwNjI3JywgLy8gMDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBhcmFMaW5rID0geworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxMSwgIC8qMHgwNjIyKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiArIDI1NiAqIDB4MTMsICAvKjB4MDYyMyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDE1LCAgLyoweDA2MjQqLworICAgICAgICAxICAgICAgICAgICArIDMyICsgMjU2ICogMHgxNywgIC8qMHgwNjI1Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MTksICAvKjB4MDYyNiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIgKyAyNTYgKiAweDFELCAgLyoweDA2MjcqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgxRiwgIC8qMHgwNjI4Ki8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MjMsICAvKjB4MDYyOSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDI1LCAgLyoweDA2MkEqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgyOSwgIC8qMHgwNjJCKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4MkQsICAvKjB4MDYyQyovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDMxLCAgLyoweDA2MkQqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHgzNSwgIC8qMHgwNjJFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4MzksICAvKjB4MDYyRiovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDNCLCAgLyoweDA2MzAqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHgzRCwgIC8qMHgwNjMxKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4M0YsICAvKjB4MDYzMiovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDQxLCAgLyoweDA2MzMqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg0NSwgIC8qMHgwNjM0Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NDksICAvKjB4MDYzNSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDRELCAgLyoweDA2MzYqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1MSwgIC8qMHgwNjM3Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NTUsICAvKjB4MDYzOCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDU5LCAgLyoweDA2MzkqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg1RCwgIC8qMHgwNjNBKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDYzQi0weDA2M0YqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjQwKi8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NjEsICAvKjB4MDY0MSovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDY1LCAgLyoweDA2NDIqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg2OSwgIC8qMHgwNjQzKi8KKyAgICAgICAgMSArIDIgICAgICAgKyAxNiArIDI1NiAqIDB4NkQsICAvKjB4MDY0NCovCisgICAgICAgIDEgKyAyICAgICAgICAgICAgKyAyNTYgKiAweDcxLCAgLyoweDA2NDUqLworICAgICAgICAxICsgMiAgICAgICAgICAgICsgMjU2ICogMHg3NSwgIC8qMHgwNjQ2Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4NzksICAvKjB4MDY0NyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDdELCAgLyoweDA2NDgqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg3RiwgIC8qMHgwNjQ5Ki8KKyAgICAgICAgMSArIDIgICAgICAgICAgICArIDI1NiAqIDB4ODEsICAvKjB4MDY0QSovCisgICAgICAgIDQsIDQsIDQsIDQsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NEItMHgwNjRFKi8KKyAgICAgICAgNCwgNCwgNCwgNCwgICAgICAgICAgICAgICAgICAgICAvKjB4MDY0Ri0weDA2NTIqLworICAgICAgICA0LCA0LCA0LCAwLCAwLCAgICAgICAgICAgICAgICAgIC8qMHgwNjUzLTB4MDY1NyovCisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgLyoweDA2NTgtMHgwNjVCKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4ODUsICAvKjB4MDY1QyovCisgICAgICAgIDEgICAgICAgICAgICAgICAgKyAyNTYgKiAweDg3LCAgLyoweDA2NUQqLworICAgICAgICAxICAgICAgICAgICAgICAgICsgMjU2ICogMHg4OSwgIC8qMHgwNjVFKi8KKyAgICAgICAgMSAgICAgICAgICAgICAgICArIDI1NiAqIDB4OEIsICAvKjB4MDY1RiovCisgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgLyoweDA2NjAtMHgwNjY0Ki8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAvKjB4MDY2NS0weDA2NjkqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qMHgwNjZBLTB4MDY2RiovCisgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjcxKi8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3MiovCisgICAgICAgIDEgICAgICAgICAgICsgMzIsICAgICAgICAgICAgICAgLyoweDA2NzMqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNjc0Ki8KKyAgICAgICAgMSAgICAgICAgICAgKyAzMiwgICAgICAgICAgICAgICAvKjB4MDY3NSovCisgICAgICAgIDEsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2NzYtMHgwNjc3Ki8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDY3OC0weDA2N0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNjdFLTB4MDY4MyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2ODQtMHgwNjg3Ki8KKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgICAvKjB4MDY4OC0weDA2OTEqLworICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgICAgICAgIC8qMHgwNjkyLTB4MDY5OSovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2OUEtMHgwNkEzKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAgICAgICAgICAgICAvKjB4MDY5QS0weDA2QTMqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAgIC8qMHgwNkE0LTB4MDZBRCovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgICAgICAgICAgICAgLyoweDA2QTQtMHgwNkFEKi8KKyAgICAgICAgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsIDErMiwgICAvKjB4MDZBRS0weDA2QjcqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkFFLTB4MDZCNyovCisgICAgICAgIDErMiwgMSsyLCAxKzIsIDErMiwgMSsyLCAxKzIsICAgLyoweDA2QjgtMHgwNkJGKi8KKyAgICAgICAgMSsyLCAxKzIsICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZCOC0weDA2QkYqLworICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMHgwNkMwKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDMSovCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAgLyoweDA2QzItMHgwNkNCKi8KKyAgICAgICAgMSsyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjB4MDZDQyovCisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2Q0QqLworICAgICAgICAxKzIsIDErMiwgMSsyLCAxKzIsICAgICAgICAgICAgIC8qMHgwNkNFLTB4MDZEMSovCisgICAgICAgIDEsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoweDA2RDItMHgwNkQzKi8KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gcHJlc0xpbmsgPSB7CisgICAgICAgIDEgKyAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qMHhGRTcwKi8KKyAgICAgICAgMSArIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyoweEZFNzEqLworICAgICAgICAxICsgMiwgMCwgMSsgMiwgMCwgMSsgMiwgICAgICAvKjB4RkU3Mi0weEZFNzYqLworICAgICAgICAxICsgMiwgICAgICAgICAgICAgICAgICAgICAgICAvKjB4RkU3NyovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTc4LTB4RkU4MSovCisgICAgICAgIDErIDIsIDEgKyAyLCAxKzIsIDEgKyAyLCAgICAgIC8qMHhGRTgyLTB4RkU4NSovCisgICAgICAgIDAsIDAgKyAzMiwgMSArIDMyLCAwICsgMzIsICAgIC8qMHhGRTg2LTB4RkU4OSovCisgICAgICAgIDEgKyAzMiwgMCwgMSwgIDAgKyAzMiwgICAgICAgIC8qMHhGRThBLTB4RkU4RCovCisgICAgICAgIDEgKyAzMiwgMCwgMiwgIDEgKyAyLCAgICAgICAgIC8qMHhGRThFLTB4RkU5MSovCisgICAgICAgIDEsIDAgKyAzMiwgMSArIDMyLCAwLCAgICAgICAgIC8qMHhGRTkyLTB4RkU5NSovCisgICAgICAgIDIsIDEgKyAyLCAxLCAwLCAgICAgICAgICAgICAgIC8qMHhGRTk2LTB4RkU5OSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlBLTB4RkU5RCovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRTlFLTB4RkVBMSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUEyLTB4RkVBNSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUE2LTB4RkVBOSovCisgICAgICAgIDEsIDAsIDIsIDEgKyAyLCAgICAgICAgICAgICAgIC8qMHhGRUFBLTB4RkVBRCovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUFFLTB4RkVCMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUIyLTB4RkVCNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUI2LTB4RkVCOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJBLTB4RkVCRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUJFLTB4RkVDMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUMyLTB4RkVDNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUM2LTB4RkVDOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNBLTB4RkVDRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUNFLTB4RkVEMSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQyLTB4RkVENSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUQ2LTB4RkVEOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURBLTB4RkVERCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRURFLTB4RkVFMSovCisgICAgICAgIDEsIDAgKyAxNiwgMiArIDE2LCAxICsgMiArMTYsIC8qMHhGRUUyLTB4RkVFNSovCisgICAgICAgIDEgKyAxNiwgMCwgMiwgMSsyLCAgICAgICAgICAgIC8qMHhGRUU2LTB4RkVFOSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVBLTB4RkVFRCovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUVFLTB4RkVGMSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUYyLTB4RkVGNSovCisgICAgICAgIDEsIDAsIDIsIDErMiwgICAgICAgICAgICAgICAgIC8qMHhGRUY2LTB4RkVGOSovCisgICAgICAgIDEsIDAsIDEsIDAsICAgICAgICAgICAgICAgICAgIC8qMHhGRUZBLTB4RkVGRCovCisgICAgICAgIDEsIDAsIDEsIDAsCisgICAgICAgIDEKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY29udmVydEZFdG8wNiA9IHsKKyAgICAgICAgLyoqKioqKioqKioqMCoqKioqKjEqKioqKioyKioqKioqMyoqKioqKjQqKioqKio1KioqKioqNioqKioqKjcqKioqKio4KioqKioqOSoqKioqKkEqKioqKipCKioqKioqQyoqKioqKkQqKioqKipFKioqKioqRioqKi8KKyAgICAgICAgLypGRTcqLyAgIDB4NjRCLCAweDY0QiwgMHg2NEMsIDB4NjRDLCAweDY0RCwgMHg2NEQsIDB4NjRFLCAweDY0RSwgMHg2NEYsIDB4NjRGLCAweDY1MCwgMHg2NTAsIDB4NjUxLCAweDY1MSwgMHg2NTIsIDB4NjUyLAorICAgICAgICAvKkZFOCovICAgMHg2MjEsIDB4NjIyLCAweDYyMiwgMHg2MjMsIDB4NjIzLCAweDYyNCwgMHg2MjQsIDB4NjI1LCAweDYyNSwgMHg2MjYsIDB4NjI2LCAweDYyNiwgMHg2MjYsIDB4NjI3LCAweDYyNywgMHg2MjgsCisgICAgICAgIC8qRkU5Ki8gICAweDYyOCwgMHg2MjgsIDB4NjI4LCAweDYyOSwgMHg2MjksIDB4NjJBLCAweDYyQSwgMHg2MkEsIDB4NjJBLCAweDYyQiwgMHg2MkIsIDB4NjJCLCAweDYyQiwgMHg2MkMsIDB4NjJDLCAweDYyQywKKyAgICAgICAgLypGRUEqLyAgIDB4NjJDLCAweDYyRCwgMHg2MkQsIDB4NjJELCAweDYyRCwgMHg2MkUsIDB4NjJFLCAweDYyRSwgMHg2MkUsIDB4NjJGLCAweDYyRiwgMHg2MzAsIDB4NjMwLCAweDYzMSwgMHg2MzEsIDB4NjMyLAorICAgICAgICAvKkZFQiovICAgMHg2MzIsIDB4NjMzLCAweDYzMywgMHg2MzMsIDB4NjMzLCAweDYzNCwgMHg2MzQsIDB4NjM0LCAweDYzNCwgMHg2MzUsIDB4NjM1LCAweDYzNSwgMHg2MzUsIDB4NjM2LCAweDYzNiwgMHg2MzYsCisgICAgICAgIC8qRkVDKi8gICAweDYzNiwgMHg2MzcsIDB4NjM3LCAweDYzNywgMHg2MzcsIDB4NjM4LCAweDYzOCwgMHg2MzgsIDB4NjM4LCAweDYzOSwgMHg2MzksIDB4NjM5LCAweDYzOSwgMHg2M0EsIDB4NjNBLCAweDYzQSwKKyAgICAgICAgLypGRUQqLyAgIDB4NjNBLCAweDY0MSwgMHg2NDEsIDB4NjQxLCAweDY0MSwgMHg2NDIsIDB4NjQyLCAweDY0MiwgMHg2NDIsIDB4NjQzLCAweDY0MywgMHg2NDMsIDB4NjQzLCAweDY0NCwgMHg2NDQsIDB4NjQ0LAorICAgICAgICAvKkZFRSovICAgMHg2NDQsIDB4NjQ1LCAweDY0NSwgMHg2NDUsIDB4NjQ1LCAweDY0NiwgMHg2NDYsIDB4NjQ2LCAweDY0NiwgMHg2NDcsIDB4NjQ3LCAweDY0NywgMHg2NDcsIDB4NjQ4LCAweDY0OCwgMHg2NDksCisgICAgICAgIC8qRkVGKi8gICAweDY0OSwgMHg2NEEsIDB4NjRBLCAweDY0QSwgMHg2NEEsIDB4NjVDLCAweDY1QywgMHg2NUQsIDB4NjVELCAweDY1RSwgMHg2NUUsIDB4NjVGLCAweDY1RgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2hhcGVUYWJsZVtdW11bXSA9IHsKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsMX0gfSwKKyAgICAgICAgeyB7MCwwLDIsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfSwKKyAgICAgICAgeyB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMSwwLDN9LCB7MCwxLDAsM30gfSwKKyAgICAgICAgeyB7MCwwLDEsMn0sIHswLDAsMSwyfSwgezAsMSwxLDJ9LCB7MCwxLDEsM30gfQorICAgIH07CisKKyAgICAvKgorICAgICAqIFRoaXMgZnVuY3Rpb24gc2hhcGVzIEV1cm9wZWFuIGRpZ2l0cyB0byBBcmFiaWMtSW5kaWMgZGlnaXRzCisgICAgICogaW4tcGxhY2UsIHdyaXRpbmcgb3ZlciB0aGUgaW5wdXQgY2hhcmFjdGVycy4gIERhdGEgaXMgaW4gdmlzdWFsCisgICAgICogb3JkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFzdFN0cm9uZ1dhc0FMKSB7CisgICAgICAgIGRpZ2l0QmFzZSAtPSAnMCc7IC8vIG1vdmUgY29tbW9uIGFkanVzdG1lbnQgb3V0IG9mIGxvb3AKKworICAgICAgICBmb3IoaW50IGkgPSBzdGFydCArIGxlbmd0aDsgLS1pID49IHN0YXJ0OykgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisgICAgICAgICAgICBzd2l0Y2ggKENoYXJhY3Rlci5nZXREaXJlY3Rpb25hbGl0eShjaCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ6CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUOgorICAgICAgICAgICAgICAgIGxhc3RTdHJvbmdXYXNBTCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXIuRElSRUNUSU9OQUxJVFlfUklHSFRfVE9fTEVGVF9BUkFCSUM6CisgICAgICAgICAgICAgICAgbGFzdFN0cm9uZ1dhc0FMID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0VVUk9QRUFOX05VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiAobGFzdFN0cm9uZ1dhc0FMICYmIGNoIDw9ICdcdTAwMzknKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSAoY2hhcikoY2ggKyBkaWdpdEJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBpbnZlcnRCdWZmZXIKKyAgICAgKiBGdW5jdGlvbjogVGhpcyBmdW5jdGlvbiBpbnZlcnRzIHRoZSBidWZmZXIsIGl0J3MgdXNlZAorICAgICAqICAgICAgICAgICBpbiBjYXNlIHRoZSB1c2VyIHNwZWNpZmllcyB0aGUgYnVmZmVyIHRvIGJlCisgICAgICogICAgICAgICAgIFRFWFRfRElSRUNUSU9OX0xPR0lDQUwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludmVydEJ1ZmZlcihjaGFyW10gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisKKyAgICAgICAgZm9yKGludCBpID0gc3RhcnQsIGogPSBzdGFydCArIGxlbmd0aCAtIDE7IGkgPCBqOyBpKyssIC0taikgeworICAgICAgICAgICAgY2hhciB0ZW1wID0gYnVmZmVyW2ldOworICAgICAgICAgICAgYnVmZmVyW2ldID0gYnVmZmVyW2pdOworICAgICAgICAgICAgYnVmZmVyW2pdID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNoYW5nZUxhbUFsZWYKKyAgICAgKiBGdW5jdGlvbjogQ29udmVydHMgdGhlIEFsZWYgY2hhcmFjdGVycyBpbnRvIGFuIGVxdWl2YWxlbnQKKyAgICAgKiAgICAgICAgICAgTGFtQWxlZiBsb2NhdGlvbiBpbiB0aGUgMHgwNnh4IFJhbmdlLCB0aGlzIGlzIGFuCisgICAgICogICAgICAgICAgIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgb3BlcmF0aW9uIG9mIHRoZSBwcm9ncmFtCisgICAgICogICAgICAgICAgIGxhdGVyIGl0J2xsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSAweEZFeHggTGFtQWxlZnMKKyAgICAgKiAgICAgICAgICAgaW4gdGhlIHNoYXBpbmcgZnVuY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBjaGFuZ2VMYW1BbGVmKGNoYXIgY2gpIHsKKyAgICAgICAgc3dpdGNoKGNoKSB7CisgICAgICAgIGNhc2UgJ1x1MDYyMic6IHJldHVybiAnXHUwNjVDJzsKKyAgICAgICAgY2FzZSAnXHUwNjIzJzogcmV0dXJuICdcdTA2NUQnOworICAgICAgICBjYXNlICdcdTA2MjUnOiByZXR1cm4gJ1x1MDY1RSc7CisgICAgICAgIGNhc2UgJ1x1MDYyNyc6IHJldHVybiAnXHUwNjVGJzsKKyAgICAgICAgZGVmYXVsdDogIHJldHVybiAnXHUwMDAwJzsgLy8gbm90IGEgbGFtYWxlZgorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc3BlY2lhbENoYXIKKyAgICAgKiBGdW5jdGlvbjogU3BlY2lhbCBBcmFiaWMgY2hhcmFjdGVycyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIHNoYXBlVW5pY29kZQorICAgICAqICAgICAgICAgICBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgb3IgMiBmb3IgdGhlc2Ugc3BlY2lhbCBjaGFyYWN0ZXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNwZWNpYWxDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKChjaCA+ICdcdTA2MjEnICYmIGNoIDwgJ1x1MDYyNicpIHx8CisgICAgICAgICAgICAoY2ggPT0gJ1x1MDYyNycpIHx8CisgICAgICAgICAgICAoY2ggPiAnXHUwNjJFJyAmJiBjaCA8ICdcdTA2MzMnKSB8fAorICAgICAgICAgICAgKGNoID4gJ1x1MDY0NycgJiYgY2ggPCAnXHUwNjRBJykgfHwKKyAgICAgICAgICAgIChjaCA9PSAnXHUwNjI5JykpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTA2NEInICYmIGNoPD0gJ1x1MDY1MicpIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4MDY1MyAmJiBjaCA8PSAweDA2NTUgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA9PSAweDA2NzAgfHwKKyAgICAgICAgICAgICAgICAgICBjaCA+PSAweEZFNzAgJiYgY2ggPD0gMHhGRTdGKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZ2V0TGluaworICAgICAqIEZ1bmN0aW9uOiBSZXNvbHZlcyB0aGUgbGluayBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzIGFzCisgICAgICogICAgICAgICAgIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtcyA6CisgICAgICogICAgICAgICAgIElzb2xhdGVkLCBJbml0aWFsLCBNaWRkbGUgYW5kIEZpbmFsIEZvcm0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGluayhjaGFyIGNoKSB7CisgICAgICAgIGlmIChjaCA+PSAnXHUwNjIyJyAmJiBjaCA8PSAnXHUwNkQzJykgeworICAgICAgICAgICAgcmV0dXJuIGFyYUxpbmtbY2ggLSAnXHUwNjIyJ107CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1x1MjAwRCcpIHsKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9IGVsc2UgaWYgKGNoID49ICdcdTIwNkQnICYmIGNoIDw9ICdcdTIwNkYnKSB7CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnXHVGRTcwJyAmJiBjaCA8PSAnXHVGRUZDJykgeworICAgICAgICAgICAgcmV0dXJuIHByZXNMaW5rW2NoIC0gJ1x1RkU3MCddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjb3VudFNwYWNlcworICAgICAqIEZ1bmN0aW9uOiBDb3VudHMgdGhlIG51bWJlciBvZiBzcGFjZXMKKyAgICAgKiAgICAgICAgICAgYXQgZWFjaCBlbmQgb2YgdGhlIGxvZ2ljYWwgYnVmZmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzTGVmdChjaGFyW10gZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQsIGUgPSBzdGFydCArIGNvdW50OyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBzdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50U3BhY2VzUmlnaHQoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCArIGNvdW50OyAtLWkgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICBpZiAoZGVzdFtpXSAhPSBTUEFDRV9DSEFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgY291bnQgLSAxIC0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNUYXNoa2VlbENoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBUYXNoa2VlbCBjaGFyYWN0ZXJzIGVsc2UgcmV0dXJuIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rhc2hrZWVsQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoID49J1x1MDY0QicgJiYgY2ggPD0gJ1x1MDY1MicgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1NlZW5UYWlsRmFtaWx5Q2hhcgorICAgICAqRnVuY3Rpb24gOiByZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNlZW4gZmFtaWx5IGlzb2xhdGVkIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICBpbiB0aGUgRkUgcmFuZ2Ugb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYgKGNoID49IDB4ZmViMSAmJiBjaCA8IDB4ZmViZil7CisgICAgICAgICAgICAgcmV0dXJuIHRhaWxGYW1pbHlJc29sYXRlZEZpbmFsIFtjaCAtIDB4RkVCMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgLyogTmFtZSAgICAgOiBpc1NlZW5GYW1pbHlDaGFyCisgICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzZWVuIGZhbWlseSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUKKyAgICAgICogICAgICAgICAgICAwNiByYW5nZSBvdGhlcndpc2UgcmV0dXJucyAwCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaXNTZWVuRmFtaWx5Q2hhcihjaGFyICBjaCl7CisgICAgICAgIGlmIChjaCA+PSAweDYzMyAmJiBjaCA8PSAweDYzNil7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc1RhaWxDaGFyCisgICAgICpGdW5jdGlvbiA6IHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIG1hdGNoZXMgb25lIG9mIHRoZSB0YWlsIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgKDB4ZmU3MyBvciAweDIwMGIpIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFpbENoYXIoY2hhciBjaCkgeworICAgICAgICBpZihjaCA9PSBPTERfVEFJTF9DSEFSIHx8IGNoID09IE5FV19UQUlMX0NIQVIpeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqTmFtZSAgICAgOiBpc0FsZWZNYWtzb3VyYUNoYXIKKyAgICAgKkZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBBbGVmIE1ha3NvdXJhIEZpbmFsIG9yIGlzb2xhdGVkCisgICAgICogICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZNYWtzb3VyYUNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gKCAoY2ggPT0gMHhGRUVGKSB8fCAoIGNoID09IDB4RkVGMCkgfHwgKGNoID09IDB4MDY0OSkpOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICAgOiBpc1llaEhhbXphQ2hhcgorICAgICAqIEZ1bmN0aW9uIDogcmV0dXJucyB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSB5ZWhIYW16YSBpc29sYXRlZCBvciB5ZWhoYW16YQorICAgICAqICAgICAgICAgICAgZmluYWwgaXMgZm91bmQgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWWVoSGFtemFDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgaWYoKGNoPT0weEZFODkpfHwoY2g9PTB4RkU4QSkpeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKk5hbWUgICAgIDogaXNUYXNoa2VlbENoYXJGRQorICAgICAqRnVuY3Rpb24gOiBSZXR1cm5zIHRydWUgZm9yIFRhc2hrZWVsIGNoYXJhY3RlcnMgaW4gRkUgcmFuZ2UgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXNoa2VlbENoYXJGRShjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiAoIGNoIT0weEZFNzUgJiYoY2g+PTB4RkU3MCAmJiBjaDw9IDB4RkU3RikgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWU6IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIG9uIFRhdHdlZWwgb3Igbm90LGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCBvbiB0YXR3ZWVsIChGRSByYW5nZSksIGl0IHJldHVybnMgMSBlbHNlIGlmIHRoZQorICAgICAqICAgICAgICAgICBUYXNoa2VlbCB3aXRoIHNoYWRkYSBvbiB0YXR3ZWVsIChGQyByYW5nZSlyZXR1cm4gMiBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgcmV0dXJucyAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGlzVGFzaGtlZWxPblRhdHdlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSAmJiBjaCAhPSBTSEFEREFfVEFUV0VFTF9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGFzaGtlZWxNZWRpYWwgW2NoIC0gMHhGRTcwXTsKKyAgICAgICAgfSBlbHNlIGlmKCAoY2ggPj0gMHhmY2YyICYmIGNoIDw9IDB4ZmNmNCkgfHwgKGNoID09IFNIQUREQV9UQVRXRUVMX0NIQVIpKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lOiBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyCisgICAgICogRnVuY3Rpb246IENoZWNrcyBpZiB0aGUgVGFzaGtlZWwgQ2hhcmFjdGVyIGlzIGluIHRoZSBpc29sYXRlZCBmb3JtCisgICAgICogICAgICAgICAgIChpLmUuIFVuaWNvZGUgRkUgcmFuZ2UpIHJldHVybnMgMSBlbHNlIGlmIHRoZSBUYXNoa2VlbAorICAgICAqICAgICAgICAgICB3aXRoIHNoYWRkYSBpcyBpbiB0aGUgaXNvbGF0ZWQgZm9ybSAoaS5lLiBVbmljb2RlIEZDIHJhbmdlKQorICAgICAqICAgICAgICAgICByZXR1cm5zIDEgb3RoZXJ3aXNlIHJldHVybnMgMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGNoYXIgY2gpeworICAgICAgICBpZiAoY2ggPj0gMHhmZTcwICYmIGNoIDw9IDB4ZmU3ZiAmJiBjaCAhPSBORVdfVEFJTF9DSEFSICYmIGNoICE9IDB4RkU3NSl7CisgICAgICAgICAgICByZXR1cm4gKDEgLSB0YXNoa2VlbE1lZGlhbCBbY2ggLSAweEZFNzBdKTsKKyAgICAgICAgfSBlbHNlIGlmKGNoID49IDB4ZmM1ZSAmJiBjaCA8PSAweGZjNjMpeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogaXNBbGVmQ2hhcgorICAgICAqIEZ1bmN0aW9uOiBSZXR1cm5zIDEgZm9yIEFsZWYgY2hhcmFjdGVycyBlbHNlIHJldHVybiAwCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FsZWZDaGFyKGNoYXIgY2gpIHsKKyAgICAgICAgcmV0dXJuIGNoID09ICdcdTA2MjInIHx8IGNoID09ICdcdTA2MjMnIHx8IGNoID09ICdcdTA2MjUnIHx8IGNoID09ICdcdTA2MjcnOworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGlzTGFtQWxlZkNoYXIKKyAgICAgKiBGdW5jdGlvbjogUmV0dXJucyB0cnVlIGZvciBMYW1BbGVmIGNoYXJhY3RlcnMgZWxzZSByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFtQWxlZkNoYXIoY2hhciBjaCkgeworICAgICAgICByZXR1cm4gY2ggPj0gJ1x1RkVGNScgJiYgY2ggPD0gJ1x1RkVGQyc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vcm1hbGl6ZWRMYW1BbGVmQ2hhcihjaGFyIGNoKSB7CisgICAgICAgIHJldHVybiBjaCA+PSAnXHUwNjVDJyAmJiBjaCA8PSAnXHUwNjVGJzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBjYWxjdWxhdGVTaXplCisgICAgICogRnVuY3Rpb246IFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZGVzdFNpemUgdG8gYmUgdXNlZCBpbiBwcmVmbGlnaHRpbmcKKyAgICAgKiAgICAgICAgICAgd2hlbiB0aGUgZGVzdFNpemUgaXMgZXF1YWwgdG8gMAorICAgICAqLworICAgIHByaXZhdGUgaW50IGNhbGN1bGF0ZVNpemUoY2hhcltdIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2VMZW5ndGgpIHsKKworICAgICAgICBpbnQgZGVzdFNpemUgPSBzb3VyY2VMZW5ndGg7CisKKyAgICAgICAgc3dpdGNoIChvcHRpb25zICYgTEVUVEVSU19NQVNLKSB7CisgICAgICAgIGNhc2UgTEVUVEVSU19TSEFQRToKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFX1RBU0hLRUVMX0lTT0xBVEVEOgorICAgICAgICAgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoIC0gMTsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpKzFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tZGVzdFNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB2aXN1YWwKKyAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCArIDEsIGUgPSBzb3VyY2VTdGFydCArIHNvdXJjZUxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNvdXJjZVtpXSA9PSBMQU1fQ0hBUiAmJiBpc0FsZWZDaGFyKHNvdXJjZVtpLTFdKSkgfHwgaXNUYXNoa2VlbENoYXJGRShzb3VyY2VbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLWRlc3RTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBmb3IoaW50IGkgPSBzb3VyY2VTdGFydCwgZSA9IHNvdXJjZVN0YXJ0ICsgc291cmNlTGVuZ3RoOyBpIDwgZTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoc291cmNlW2ldKSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0U2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGNvdW50U3BhY2VTdWIKKyAgICAgKiBGdW5jdGlvbjogQ291bnRzIG51bWJlciBvZiB0aW1lcyB0aGUgc3ViQ2hhciBhcHBlYXJzIGluIHRoZSBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50U3BhY2VTdWIoY2hhciBbXSBkZXN0LGludCBsZW5ndGgsIGNoYXIgc3ViQ2hhcil7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBzdWJDaGFyKSB7CisgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IHNoaWZ0QXJyYXkKKyAgICAgKiBGdW5jdGlvbjogU2hpZnRzIGNoYXJhY3RlcnMgdG8gcmVwbGFjZSBzcGFjZSBzdWIgY2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaGlmdEFycmF5KGNoYXIgW10gZGVzdCxpbnQgc3RhcnQsIGludCBlLCBjaGFyIHN1YkNoYXIpeworICAgICAgICBpbnQgdyA9IGU7CisgICAgICAgIGludCByID0gZTsKKyAgICAgICAgd2hpbGUgKC0tciA+PSBzdGFydCkgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgIGlmIChjaCAhPSBzdWJDaGFyKSB7CisgICAgICAgICAgICAtLXc7CisgICAgICAgICAgICBpZiAodyAhPSByKSB7CisgICAgICAgICAgICAgIGRlc3Rbd10gPSBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGZsaXBBcnJheQorICAgICAqIEZ1bmN0aW9uOiBpbnZlcnRzIGFycmF5LCBzbyB0aGF0IHN0YXJ0IGJlY29tZXMgZW5kIGFuZCB2aWNlIHZlcnNhCisgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIGludCBmbGlwQXJyYXkoY2hhciBbXSBkZXN0LCBpbnQgc3RhcnQsIGludCBlLCBpbnQgdyl7CisgICAgICAgIGludCByOworICAgICAgICBpZiAodyA+IHN0YXJ0KSB7CisgICAgICAgIC8vIHNoaWZ0LCBhc3N1bWUgc21hbGwgYnVmZmVyIHNpemUgc28gZG9uJ3QgdXNlIGFycmF5Y29weQorICAgICAgICAgIHIgPSB3OworICAgICAgICAgIHcgPSBzdGFydDsKKyAgICAgICAgICB3aGlsZSAociA8IGUpIHsKKyAgICAgICAgICAgIGRlc3RbdysrXSA9IGRlc3RbcisrXTsKKyAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB3ID0gZTsKKyAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHc7CisgICAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgIDogaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbAorICAgICAqIEZ1bmN0aW9uIDogUmVwbGFjZXMgVGFzaGtlZWwgYXMgZm9sbG93aW5nOgorICAgICAqICAgICAgICAgICAgQ2FzZSAxIDppZiB0aGUgVGFzaGtlZWwgb24gdGF0d2VlbCwgcmVwbGFjZSBpdCB3aXRoIFRhdHdlZWwuCisgICAgICogICAgICAgICAgICBDYXNlIDIgOmlmIHRoZSBUYXNoa2VlbCBhZ2dyZWdhdGVkIHdpdGggU2hhZGRhIG9uIFRhdHdlZWwsIHJlcGxhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICBpdCB3aXRoIFNoYWRkYSBvbiBUYXR3ZWVsLgorICAgICAqICAgICAgICAgICAgQ2FzZSAzOiBpZiB0aGUgVGFzaGtlZWwgaXMgaXNvbGF0ZWQgcmVwbGFjZSBpdCB3aXRoIFNwYWNlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhhbmRsZVRhc2hrZWVsV2l0aFRhdHdlZWwoY2hhcltdIGRlc3QsIGludCBzb3VyY2VMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgc291cmNlTGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpc1Rhc2hrZWVsT25UYXR3ZWVsQ2hhcihkZXN0W2ldKSA9PSAxKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBUQVRXRUVMX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigoaXNUYXNoa2VlbE9uVGF0d2VlbENoYXIoZGVzdFtpXSkgPT0gMikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gU0hBRERBX1RBVFdFRUxfQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKChpc0lzb2xhdGVkVGFzaGtlZWxDaGFyKGRlc3RbaV0pPT0xKSAmJiBkZXN0W2ldICE9IFNIQUREQV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOworICAgIH0KKworICAgIC8qCisgICAgICpOYW1lICAgICA6IGhhbmRsZUdlbmVyYXRlZFNwYWNlcworICAgICAqRnVuY3Rpb24gOiBUaGUgc2hhcGVVbmljb2RlIGZ1bmN0aW9uIGNvbnZlcnRzIExhbSArIEFsZWYgaW50byBMYW1BbGVmICsgc3BhY2UsCisgICAgICogICAgICAgICAgIGFuZCBUYXNoa2VlbCB0byBzcGFjZS4KKyAgICAgKiAgICAgICAgICAgaGFuZGxlR2VuZXJhdGVkU3BhY2VzIGZ1bmN0aW9uIHB1dHMgdGhlc2UgZ2VuZXJhdGVkIHNwYWNlcworICAgICAqICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIgc3BlY2lmaWVzLiBMYW1BbGVmIGFuZCBUYXNoa2VlbAorICAgICAqICAgICAgICAgICBzcGFjZXMgY2FuIGJlIHJlcGxhY2VkIGF0IGJlZ2luLCBhdCBlbmQsIGF0IG5lYXIgb3IgZGVjcmVhc2UgdGhlCisgICAgICogICAgICAgICAgIGJ1ZmZlciBzaXplLgorICAgICAqCisgICAgICogICAgICAgICAgIFRoZXJlIGlzIGFsc28gQXV0byBvcHRpb24gZm9yIExhbUFsZWYgYW5kIHRhc2hrZWVsLCB3aGljaCB3aWxsIHB1dAorICAgICAqICAgICAgICAgICB0aGUgc3BhY2VzIGF0IGVuZCBvZiB0aGUgYnVmZmVyIChvciBlbmQgb2YgdGV4dCBpZiB0aGUgdXNlciB1c2VkCisgICAgICogICAgICAgICAgIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5EKS4KKyAgICAgKgorICAgICAqICAgICAgICAgICBJZiB0aGUgdGV4dCB0eXBlIHdhcyB2aXN1YWxfTFRSIGFuZCB0aGUgb3B0aW9uCisgICAgICogICAgICAgICAgIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQgdGhlIEVORAorICAgICAqICAgICAgICAgICBvcHRpb24gd2lsbCBwbGFjZSB0aGUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqICAgICAgICAgICBCRUdJTiB3aWxsIHBsYWNlIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICovCisgIHByaXZhdGUgaW50IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhjaGFyW10gZGVzdCwKKyAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKworICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgIGludCBsZW5PcHRpb25zVGFzaGtlZWwgPSBvcHRpb25zICYgVEFTSEtFRUxfTUFTSzsKKyAgICAgIGJvb2xlYW4gbGFtQWxlZk9uID0gZmFsc2U7CisgICAgICBib29sZWFuIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgaWYgKCFpc0xvZ2ljYWwgJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgIHN3aXRjaCAobGVuT3B0aW9uc0xhbUFsZWYpIHsKKyAgICAgICAgICBjYXNlIExBTUFMRUZfQkVHSU46IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9FTkQ7IGJyZWFrOworICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zVGFzaGtlZWwpeworICAgICAgICAgIGNhc2UgVEFTSEtFRUxfQkVHSU46IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0VORDsgYnJlYWs7CisgICAgICAgICAgY2FzZSBUQVNIS0VFTF9FTkQ6IGxlbk9wdGlvbnNUYXNoa2VlbCA9IFRBU0hLRUVMX0JFR0lOOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgICBpZiAoZGVzdFtpXSA9PSBMQU1BTEVGX1NQQUNFX1NVQikgeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVJfRk9SX0xBTUFMRUY7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICBmaW5hbCBpbnQgZSA9IHN0YXJ0ICsgbGVuZ3RoOworICAgICAgICAgIGludCB3TCA9IGNvdW50U3BhY2VTdWIoZGVzdCwgbGVuZ3RoLCBMQU1BTEVGX1NQQUNFX1NVQik7CisgICAgICAgICAgaW50IHdUID0gY291bnRTcGFjZVN1YihkZXN0LCBsZW5ndGgsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9FTkQpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAobGFtQWxlZk9uICYmIChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0VORCkpIHsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIExBTUFMRUZfU1BBQ0VfU1VCKTsKKyAgICAgICAgICAgIHdoaWxlICh3TCA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgZGVzdFstLXdMXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9FTkQpKXsKKyAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICB3aGlsZSAod1QgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICBkZXN0Wy0td1RdID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBsYW1BbGVmT24gPSBmYWxzZTsKKyAgICAgICAgICB0YXNoa2VlbE9uID0gZmFsc2U7CisKKyAgICAgICAgICBpZiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgbGFtQWxlZk9uID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpeworICAgICAgICAgICAgdGFzaGtlZWxPbiA9IHRydWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGxhbUFsZWZPbiAmJiAobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpKXsKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICB3TCA9IGZsaXBBcnJheShkZXN0LHN0YXJ0LGUsIHdMKTsKKyAgICAgICAgICAgICAgbGVuZ3RoID0gd0wgLSBzdGFydDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHRhc2hrZWVsT24gJiYgKGxlbk9wdGlvbnNUYXNoa2VlbCA9PSBUQVNIS0VFTF9SRVNJWkUpKSB7CisgICAgICAgICAgICAgIHNoaWZ0QXJyYXkoZGVzdCwgc3RhcnQsIGUsIFRBU0hLRUVMX1NQQUNFX1NVQik7CisgICAgICAgICAgICAgIHdUID0gZmxpcEFycmF5KGRlc3Qsc3RhcnQsZSwgd1QpOworICAgICAgICAgICAgICBsZW5ndGggPSB3VCAtIHN0YXJ0OworICAgICAgICAgIH0KKworICAgICAgICAgIGxhbUFsZWZPbiA9IGZhbHNlOworICAgICAgICAgIHRhc2hrZWVsT24gPSBmYWxzZTsKKworICAgICAgICAgIGlmICgobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTikgfHwKKyAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpeworICAgICAgICAgICAgICAgIGxhbUFsZWZPbiA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsZW5PcHRpb25zVGFzaGtlZWwgPT0gVEFTSEtFRUxfQkVHSU4peworICAgICAgICAgICAgICAgIHRhc2hrZWVsT24gPSB0cnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChsYW1BbGVmT24gJiYgKChsZW5PcHRpb25zTGFtQWxlZiA9PSBMQU1BTEVGX0JFR0lOKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfQVVUTykpKSB7IC8vIHNwYWNlcyBhdCBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgc2hpZnRBcnJheShkZXN0LCBzdGFydCwgZSwgTEFNQUxFRl9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd0wgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3TCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod0wgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3TCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYodGFzaGtlZWxPbiAmJiAobGVuT3B0aW9uc1Rhc2hrZWVsID09IFRBU0hLRUVMX0JFR0lOKSl7CisgICAgICAgICAgICAgICBzaGlmdEFycmF5KGRlc3QsIHN0YXJ0LCBlLCBUQVNIS0VFTF9TUEFDRV9TVUIpOworICAgICAgICAgICAgICAgd1QgPSBmbGlwQXJyYXkoZGVzdCxzdGFydCxlLCB3VCk7CisgICAgICAgICAgICAgICAgICB3aGlsZSAod1QgPCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgZGVzdFt3VCsrXSA9IFNQQUNFX0NIQVI7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorCisgICAgICByZXR1cm4gbGVuZ3RoOworICB9CisKKworICAvKgorICAgKk5hbWUgICAgIDpleHBhbmRDb21wb3NpdENoYXJBdEJlZ2luCisgICAqRnVuY3Rpb24gOkV4cGFuZHMgdGhlIExhbUFsZWYgY2hhcmFjdGVyIHRvIExhbSBhbmQgQWxlZiBjb25zdW1pbmcgdGhlIHJlcXVpcmVkCisgICAqICAgICAgICAgc3BhY2UgZnJvbSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMgdmlzdWFsX0xUUgorICAgKiAgICAgICAgIGFuZCB0aGUgb3B0aW9uIFNQQUNFU19SRUxBVElWRV9UT19URVhUX0JFR0lOX0VORCB3YXMgc2VsZWN0ZWQKKyAgICogICAgICAgICB0aGUgc3BhY2VzIHdpbGwgYmUgbG9jYXRlZCBhdCBlbmQgb2YgYnVmZmVyLgorICAgKiAgICAgICAgIElmIHRoZXJlIGFyZSBubyBzcGFjZXMgdG8gZXhwYW5kIHRoZSBMYW1BbGVmLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorKi8KKyBwcml2YXRlIGJvb2xlYW4gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihjaGFyW10gZGVzdCxpbnQgc3RhcnQsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhY291bnQpIHsKKyAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKyAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc1JpZ2h0KGRlc3QsIHN0YXJ0LCBsZW5ndGgpKSB7CisgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICB9CisgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCAtIGxhY291bnQsIHcgPSBzdGFydCArIGxlbmd0aDsgLS1yID49IHN0YXJ0OykgeworICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgZGVzdFstLXddID0gTEFNX0NIQVI7CisgICAgICAgICAgICAgZGVzdFstLXddID0gY29udmVydE5vcm1hbGl6ZWRMYW1BbGVmW2NoIC0gJ1x1MDY1QyddOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBkZXN0Wy0td10gPSBjaDsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0RW5kCisgICAqRnVuY3Rpb24gOiBFeHBhbmRzIHRoZSBMYW1BbGVmIGNoYXJhY3RlciB0byBMYW0gYW5kIEFsZWYgY29uc3VtaW5nIHRoZQorICAgKiAgICAgICAgICAgcmVxdWlyZWQgc3BhY2UgZnJvbSBlbmQgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIHRleHQgdHlwZSB3YXMKKyAgICogICAgICAgICAgIFZpc3VhbCBMVFIgYW5kIHRoZSBvcHRpb24gU1BBQ0VTX1JFTEFUSVZFX1RPX1RFWFRfQkVHSU5fRU5ECisgICAqICAgICAgICAgICB3YXMgdXNlZCwgdGhlIHNwYWNlcyB3aWxsIGJlIGNvbnN1bWVkIGZyb20gYmVnaW4gb2YgYnVmZmVyLiBJZgorICAgKiAgICAgICAgICAgdGhlcmUgYXJlIG5vIHNwYWNlcyB0byBleHBhbmQgdGhlIExhbUFsZWYsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiAgZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFjb3VudCl7CisgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgaWYgKGxhY291bnQgPiBjb3VudFNwYWNlc0xlZnQoZGVzdCwgc3RhcnQsIGxlbmd0aCkpIHsKKyAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gc3BhY2VOb3RGb3VuZDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxhY291bnQsIHcgPSBzdGFydCwgZSA9IHN0YXJ0ICsgbGVuZ3RoOyByIDwgZTsgKytyKSB7CisgICAgICAgICAgY2hhciBjaCA9IGRlc3Rbcl07CisgICAgICAgICAgaWYgKGlzTm9ybWFsaXplZExhbUFsZWZDaGFyKGNoKSkgeworICAgICAgICAgICAgICBkZXN0W3crK10gPSBjb252ZXJ0Tm9ybWFsaXplZExhbUFsZWZbY2ggLSAnXHUwNjVDJ107CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IExBTV9DSEFSOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRlc3RbdysrXSA9IGNoOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICB9CisKKyAgLyoKKyAgICpOYW1lICAgICA6IGV4cGFuZENvbXBvc2l0Q2hhckF0TmVhcgorICAgKkZ1bmN0aW9uIDogRXhwYW5kcyB0aGUgTGFtQWxlZiBjaGFyYWN0ZXIgaW50byBMYW0gKyBBbGVmLCBZZWhIYW16YSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgIGludG8gWWVoICsgSGFtemEsIFNlZW5GYW1pbHkgY2hhcmFjdGVyIGludG8gU2VlbkZhbWlseSBjaGFyYWN0ZXIKKyAgICogICAgICAgICAgICsgVGFpbCwgd2hpbGUgY29uc3VtaW5nIHRoZSBzcGFjZSBuZXh0IHRvIHRoZSBjaGFyYWN0ZXIuCisgICAqLworCisgIHByaXZhdGUgYm9vbGVhbiBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoY2hhcltdIGRlc3QsaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHllaEhhbXphT3B0aW9uLCBpbnQgc2VlblRhaWxPcHRpb24sIGludCBsYW1BbGVmT3B0aW9uKXsKKworICAgICAgYm9vbGVhbiBzcGFjZU5vdEZvdW5kID0gZmFsc2U7CisKKworCisgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoZGVzdFtzdGFydF0pKSB7CisgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBsZW5ndGg7IC0taSA+PXN0YXJ0OykgeworICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgIGlmIChsYW1BbGVmT3B0aW9uID09IDEgJiYgaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgIGlmIChpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpIHsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBMQU1fQ0hBUjsKKyAgICAgICAgICAgICAgICAgIGRlc3RbLS1pXSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYWNlTm90Rm91bmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9ZWxzZSBpZihzZWVuVGFpbE9wdGlvbiA9PSAxICYmIGlzU2VlblRhaWxGYW1pbHlDaGFyKGNoKSA9PSAxKXsKKyAgICAgICAgICAgICAgaWYoaT5zdGFydCAmJmRlc3RbaS0xXSA9PSBTUEFDRV9DSEFSKXsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IHRhaWxDaGFyOworICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfWVsc2UgaWYoeWVoSGFtemFPcHRpb24gPT0gMSAmJiBpc1llaEhhbXphQ2hhcihjaCkpeworCisgICAgICAgICAgICAgICBpZihpPnN0YXJ0ICYmZGVzdFtpLTFdID09IFNQQUNFX0NIQVIpeworICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHllaEhhbXphVG9ZZWhbY2ggLSBZRUhfSEFNWkFGRV9DSEFSXTsKKyAgICAgICAgICAgICAgICAgIGRlc3RbaS0xXSA9IEhBTVpBRkVfQ0hBUjsKKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFjZU5vdEZvdW5kOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIH0KKworICAgIC8qCisgICAgICogTmFtZSAgICA6IGV4cGFuZENvbXBvc2l0Q2hhcgorICAgICAqIEZ1bmN0aW9uOiBMYW1BbGVmIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgYXMgdGhlIExhbUFsZWYgaXMKKyAgICAgKiAgICAgICAgICAgb25lIGNoYXJhY3RlciB3aGlsZSBleHBhbmRpbmcgaXQgd2lsbCBnaXZlIHR3bworICAgICAqICAgICAgICAgICBjaGFyYWN0ZXJzIExhbSArIEFsZWYsIHNvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBMYW1BbGVmCisgICAgICogICAgICAgICAgIGluIG5lYXIgb3IgZmFyIHNwYWNlcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbnMgdGhlIHVzZXIKKyAgICAgKiAgICAgICAgICAgc3BlY2lmaWVzIG9yIGluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZS4KKyAgICAgKiAgICAgICAgICAgRGVzdCBoYXMgZW5vdWdoIHJvb20gZm9yIHRoZSBleHBhbnNpb24gaWYgd2UgYXJlIGdyb3dpbmcuCisgICAgICogICAgICAgICAgIGxhbWFsZWYgYXJlIG5vcm1hbGl6ZWQgdG8gdGhlICdzcGVjaWFsIGNoYXJhY3RlcnMnCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZXhwYW5kQ29tcG9zaXRDaGFyKGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoYXBpbmdNb2RlKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxlbk9wdGlvbnNMYW1BbGVmID0gb3B0aW9ucyAmIExBTUFMRUZfTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNTZWVuID0gb3B0aW9ucyAmIFNFRU5fTUFTSzsKKyAgICAgICAgaW50IGxlbk9wdGlvbnNZZWhIYW16YSA9IG9wdGlvbnMgJiBZRUhIQU1aQV9NQVNLOworICAgICAgICBib29sZWFuIHNwYWNlTm90Rm91bmQgPSBmYWxzZTsKKworICAgICAgICBpZiAoIWlzTG9naWNhbCAmJiAhc3BhY2VzUmVsYXRpdmVUb1RleHRCZWdpbkVuZCkgeworICAgICAgICAgICAgc3dpdGNoIChsZW5PcHRpb25zTGFtQWxlZikgeworICAgICAgICAgICAgY2FzZSBMQU1BTEVGX0JFR0lOOiBsZW5PcHRpb25zTGFtQWxlZiA9IExBTUFMRUZfRU5EOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFNQUxFRl9FTkQ6IGxlbk9wdGlvbnNMYW1BbGVmID0gTEFNQUxFRl9CRUdJTjsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNoYXBpbmdNb2RlID09IDEpeworICAgICAgICAgICAgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9BVVRPKXsKKyAgICAgICAgICAgICAgICBpZihpc0xvZ2ljYWwpeworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRCZWdpbihkZXN0LCBzdGFydCwgbGVuZ3RoLCBsYWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oIk5vIHNwYWNlZm9yIGxhbWFsZWYiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNlIGlmKGxlbk9wdGlvbnNMYW1BbGVmID09IExBTUFMRUZfRU5EKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXRFbmQoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9CRUdJTil7CisgICAgICAgICAgICAgICAgc3BhY2VOb3RGb3VuZCA9IGV4cGFuZENvbXBvc2l0Q2hhckF0QmVnaW4oZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFjb3VudCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZWZvciBsYW1hbGVmIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9ORUFSKXsKKyAgICAgICAgICAgICAgICBzcGFjZU5vdEZvdW5kID0gZXhwYW5kQ29tcG9zaXRDaGFyQXROZWFyKGRlc3QsIHN0YXJ0LCBsZW5ndGgsMCwwLDEpOworICAgICAgICAgICAgICAgIGlmKHNwYWNlTm90Rm91bmQpeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigiTm8gc3BhY2Vmb3IgbGFtYWxlZiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2UgaWYobGVuT3B0aW9uc0xhbUFsZWYgPT0gTEFNQUxFRl9SRVNJWkUpeworICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSBzdGFydCArIGxlbmd0aCwgdyA9IHIgKyBsYWNvdW50OyAtLXIgPj0gc3RhcnQ7KSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W3JdOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Wy0td10gPSAnXHUwNjQ0JzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNvbnZlcnROb3JtYWxpemVkTGFtQWxlZltjaCAtICdcdTA2NUMnXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbLS13XSA9IGNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSBsYWNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYobGVuT3B0aW9uc1NlZW4gPT0gU0VFTl9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwwLDEsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgU2VlbiB0YWlsIGV4cGFuc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxlbk9wdGlvbnNZZWhIYW16YSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpeworICAgICAgICAgICAgICAgIHNwYWNlTm90Rm91bmQgPSBleHBhbmRDb21wb3NpdENoYXJBdE5lYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwxLDAsMCk7CisgICAgICAgICAgICAgICAgaWYoc3BhY2VOb3RGb3VuZCl7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uKCJObyBzcGFjZSBmb3IgWWVoSGFtemEgZXhwYW5zaW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworCisgICAgLyogQ29udmVydCB0aGUgaW5wdXQgYnVmZmVyIGZyb20gRkV4eCBSYW5nZSBpbnRvIDA2eHggUmFuZ2UKKyAgICAgKiB0byBwdXQgYWxsIGNoYXJhY3RlcnMgaW50byB0aGUgMDZ4eCByYW5nZQorICAgICAqIGV2ZW4gdGhlIGxhbWFsZWYgaXMgY29udmVydGVkIHRvIHRoZSBzcGVjaWFsIHJlZ2lvbiBpbgorICAgICAqIHRoZSAwNnh4IHJhbmdlLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbGFtYWxlZiBjaGFycyBmb3VuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBub3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydCwgZSA9IGkgKyBsZW5ndGg7IGkgPCBlOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkZXN0W2ldOworICAgICAgICAgICAgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogZGVzaGFwZU5vcm1hbGl6ZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgZnJvbSBGRXh4IFJhbmdlIGludG8gMDZ4eCBSYW5nZQorICAgICAqICAgICAgICAgICBldmVuIHRoZSBsYW1hbGVmIGlzIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lhbCByZWdpb24gaW4gdGhlIDA2eHggcmFuZ2UuCisgICAgICogICAgICAgICAgIEFjY29yZGluZyB0byB0aGUgb3B0aW9ucyB0aGUgdXNlciBlbnRlcnMsIGFsbCBzZWVuIGZhbWlseSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgdGFpbCBjaGFyYWN0ZXIgYXJlIG1lcmdlZCB0byBzZWVuIHRhaWwgZmFtaWx5IGNoYXJhY3RlciBhbmQKKyAgICAgKiAgICAgICAgICAgYW55IHllaCBmb2xsb3dlZCBieSBhIGhhbXphIGNoYXJhY3RlciBhcmUgbWVyZ2VkIHRvIHllaGhhbXphIGNoYXJhY3Rlci4KKyAgICAgKiAgICAgICAgICAgTWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBsYW1hbGVmIGNoYXJzIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlc2hhcGVOb3JtYWxpemUoY2hhcltdIGRlc3QsIGludCBzdGFydCwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGFjb3VudCA9IDA7CisgICAgICAgIGludCB5ZWhIYW16YUNvbXBvc2VFbmFibGVkID0gMDsKKyAgICAgICAgaW50IHNlZW5Db21wb3NlRW5hYmxlZCA9IDA7CisKKyAgICAgICAgeWVoSGFtemFDb21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZZRUhIQU1aQV9NQVNLKSA9PSBZRUhIQU1aQV9UV09DRUxMX05FQVIpID8gMSA6IDA7CisgICAgICAgIHNlZW5Db21wb3NlRW5hYmxlZCA9ICgob3B0aW9ucyZTRUVOX01BU0spID09IFNFRU5fVFdPQ0VMTF9ORUFSKT8gMSA6IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0LCBlID0gaSArIGxlbmd0aDsgaSA8IGU7ICsraSkgeworICAgICAgICAgICAgY2hhciBjaCA9IGRlc3RbaV07CisKKyAgICAgICAgaWYoICh5ZWhIYW16YUNvbXBvc2VFbmFibGVkID09IDEpICYmICgoY2ggPT0gSEFNWkEwNl9DSEFSKSB8fCAoY2ggPT0gSEFNWkFGRV9DSEFSKSkKKyAgICAgICAgICAgICAgICYmIChpIDwgKGxlbmd0aCAtIDEpKSAmJiBpc0FsZWZNYWtzb3VyYUNoYXIoZGVzdFtpKzFdICkpIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gU1BBQ0VfQ0hBUjsKKyAgICAgICAgICAgICAgICBkZXN0W2krMV0gPSBZRUhfSEFNWkFfQ0hBUjsKKyAgICAgICB9IGVsc2UgaWYgKCAoc2VlbkNvbXBvc2VFbmFibGVkID09IDEpICYmIChpc1RhaWxDaGFyKGNoKSkgJiYgKGk8IChsZW5ndGggLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgKGlzU2VlblRhaWxGYW1pbHlDaGFyKGRlc3RbaSsxXSk9PTEpICkgeworICAgICAgICAgICAgICAgZGVzdFtpXSA9IFNQQUNFX0NIQVI7CisgICAgICAgfQorICAgICAgIGVsc2UgaWYgKGNoID49ICdcdUZFNzAnICYmIGNoIDw9ICdcdUZFRkMnKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzTGFtQWxlZkNoYXIoY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICsrbGFjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKWNvbnZlcnRGRXRvMDZbY2ggLSAnXHVGRTcwJ107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhY291bnQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOYW1lICAgIDogc2hhcGVVbmljb2RlCisgICAgICogRnVuY3Rpb246IENvbnZlcnRzIGFuIEFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlIGludG8gYSBzaGFwZWQKKyAgICAgKiAgICAgICAgICAgYXJhYmljIFVuaWNvZGUgYnVmZmVyIGluIEZFeHggUmFuZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFzaGtlZWxGbGFnKXRocm93cyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGFtYWxlZl9jb3VudCA9IG5vcm1hbGl6ZShkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKworICAgICAgICAvLyByZXNvbHZlIHRoZSBsaW5rIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMuCisgICAgICAgIC8vIEFyYWJpYyBjaGFyYWN0ZXJzIGhhdmUgZm91ciBmb3JtczogSXNvbGF0ZWQsIEluaXRpYWwsIE1lZGlhbCBhbmQgRmluYWwuCisgICAgICAgIC8vIFRhc2hrZWVsIGNoYXJhY3RlcnMgaGF2ZSB0d28sIGlzb2xhdGVkIG9yIG1lZGlhbCwgYW5kIHNvbWV0aW1lcyBvbmx5IGlzb2xhdGVkLgorICAgICAgICAvLyB0YXNoa2VlbEZsYWcgPT0gMDogc2hhcGUgbm9ybWFsbHksIDE6IHNoYXBlIGlzb2xhdGVkLCAyOiBkb24ndCBzaGFwZQorCisgICAgICAgIGJvb2xlYW4gbGFtYWxlZl9mb3VuZCA9IGZhbHNlLCBzZWVuZmFtX2ZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4geWVoaGFtemFfZm91bmQgPSBmYWxzZSwgdGFzaGtlZWxfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IGkgPSBzdGFydCArIGxlbmd0aCAtIDE7CisgICAgICAgIGludCBjdXJyTGluayA9IGdldExpbmsoZGVzdFtpXSk7CisgICAgICAgIGludCBuZXh0TGluayA9IDA7CisgICAgICAgIGludCBwcmV2TGluayA9IDA7CisgICAgICAgIGludCBsYXN0TGluayA9IDA7CisgICAgICAgIC8vaW50IHByZXZQb3MgPSBpOworICAgICAgICBpbnQgbGFzdFBvcyA9IGk7CisgICAgICAgIGludCBueCA9IC0yOworICAgICAgICBpbnQgbncgPSAwOworCisgICAgICAgIHdoaWxlIChpID49IDApIHsKKyAgICAgICAgICAgIC8vIElmIGhpZ2ggYnl0ZSBvZiBjdXJyTGluayA+IDAgdGhlbiB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lIHNoYXBlCisgICAgICAgICAgICBpZiAoKGN1cnJMaW5rICYgJ1x1RkYwMCcpID4gMCB8fCBpc1Rhc2hrZWVsQ2hhcihkZXN0W2ldKSkgeworICAgICAgICAgICAgICAgIG53ID0gaSAtIDE7CisgICAgICAgICAgICAgICAgbnggPSAtMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnggPCAwKSB7IC8vIHdlIG5lZWQgdG8ga25vdyBhYm91dCBuZXh0IGNoYXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG53ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBueCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSBnZXRMaW5rKGRlc3RbbnddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmV4dExpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBudzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1udzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKGN1cnJMaW5rICYgQUxFRlRZUEUpID4gMCkgJiYgKChsYXN0TGluayAmIExBTVRZUEUpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFtYWxlZl9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgd0xhbWFsZWYgPSBjaGFuZ2VMYW1BbGVmKGRlc3RbaV0pOyAvLyBnZXQgZnJvbSAweDA2NUMtMHgwNjVmCisgICAgICAgICAgICAgICAgICAgIGlmICh3TGFtYWxlZiAhPSAnXHUwMDAwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBhbGVmIGJ5IG1hcmtlciwgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2ldID0gJ1x1ZmZmZic7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2xhc3RQb3NdID0gd0xhbWFsZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbGFzdFBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxhc3RMaW5rID0gcHJldkxpbms7CisgICAgICAgICAgICAgICAgICAgIGN1cnJMaW5rID0gZ2V0TGluayh3TGFtYWxlZik7IC8vIHJlcXVpcmVzICdcdTAwMDAnLCB1bmZvcnR1bmF0ZWx5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoaSA+IDApICYmIChkZXN0W2ktMV0gPT0gU1BBQ0VfQ0hBUikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlzU2VlbkZhbWlseUNoYXIoZGVzdFtpXSkgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVuZmFtX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0W2ldID09IFlFSF9IQU1aQV9DSEFSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB5ZWhoYW16YV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihpPT0wKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpc1NlZW5GYW1pbHlDaGFyKGRlc3RbaV0pID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VlbmZhbV9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdFtpXSA9PSBZRUhfSEFNWkFfQ0hBUikgeworICAgICAgICAgICAgICAgICAgICAgICAgeWVoaGFtemFfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByb3BlciBzaGFwZSBhY2NvcmRpbmcgdG8gbGluayBhYmlsaXR5IG9mIG5laWdoYm9ycworICAgICAgICAgICAgICAgIC8vIGFuZCBvZiBjaGFyYWN0ZXI7IGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSBzaGFwZXMKKyAgICAgICAgICAgICAgICAvLyAoaXNvbGF0ZWQsIGluaXRpYWwsIG1pZGRsZSwgZmluYWwpIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEKKworICAgICAgICAgICAgICAgIGludCBmbGFnID0gc3BlY2lhbENoYXIoZGVzdFtpXSk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2hhcGUgPSBzaGFwZVRhYmxlW25leHRMaW5rICYgTElOS19NQVNLXQorICAgICAgICAgICAgICAgICAgICBbbGFzdExpbmsgJiBMSU5LX01BU0tdCisgICAgICAgICAgICAgICAgICAgIFtjdXJyTGluayAmIExJTktfTUFTS107CisKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXBlICY9IDB4MTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFzaGtlZWxGbGFnID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdExpbmsgJiBMSU5LTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgobmV4dExpbmsgJiBMSU5LUikgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0QycgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gIT0gJ1x1MDY0RCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEoKG5leHRMaW5rICYgQUxFRlRZUEUpID09IEFMRUZUWVBFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0TGluayAmIExBTVRZUEUpID09IExBTVRZUEUpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXNoa2VlbEZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IFRBU0hLRUVMX1NQQUNFX1NVQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2hrZWVsX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIGlycmVsZXZhbnRQb3NbZGVzdFtpXSAtICdcdTA2NEInXSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGxlYXZlIHRhc2hrZWVsIGFsb25lCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IChjaGFyKSgnXHVGRTcwJyArIChjdXJyTGluayA+PiA4KSArIHNoYXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1vdmUgb25lIG5vdGNoIGZvcndhcmQKKyAgICAgICAgICAgIGlmICgoY3VyckxpbmsgJiBJUlJFTEVWQU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJldkxpbmsgPSBsYXN0TGluazsKKyAgICAgICAgICAgICAgICBsYXN0TGluayA9IGN1cnJMaW5rOworICAgICAgICAgICAgICAgIC8vcHJldlBvcyA9IGxhc3RQb3M7CisgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIGlmIChpID09IG54KSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBuZXh0TGluazsKKyAgICAgICAgICAgICAgICBueCA9IC0yOworICAgICAgICAgICAgfSBlbHNlIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgY3VyckxpbmsgPSBnZXRMaW5rKGRlc3RbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZm91bmQgYSBsYW0vYWxlZiBwYWlyIGluIHRoZSBidWZmZXIKKyAgICAgICAgLy8gY2FsbCBoYW5kbGVHZW5lcmF0ZWRTcGFjZXMgdG8gcmVtb3ZlIHRoZSBzcGFjZXMgdGhhdCB3ZXJlIGFkZGVkCisKKyAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIGlmIChsYW1hbGVmX2ZvdW5kIHx8IHRhc2hrZWVsX2ZvdW5kKSB7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGhhbmRsZUdlbmVyYXRlZFNwYWNlcyhkZXN0LCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VlbmZhbV9mb3VuZCB8fCB5ZWhoYW16YV9mb3VuZCl7CisgICAgICAgICAgICBkZXN0U2l6ZSA9IGV4cGFuZENvbXBvc2l0Q2hhcihkZXN0LCBzdGFydCwgZGVzdFNpemUsIGxhbWFsZWZfY291bnQsIFNIQVBFX01PREUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXN0U2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5hbWUgICAgOiBkZVNoYXBlVW5pY29kZQorICAgICAqIEZ1bmN0aW9uOiBDb252ZXJ0cyBhbiBBcmFiaWMgVW5pY29kZSBidWZmZXIgaW4gRkV4eCBSYW5nZSBpbnRvIHVuc2hhcGVkCisgICAgICogICAgICAgICAgIGFyYWJpYyBVbmljb2RlIGJ1ZmZlciBpbiAwNnh4IFJhbmdlCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVTaGFwZVVuaWNvZGUoY2hhcltdIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTaXplKSB0aHJvd3MgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGxhbWFsZWZfY291bnQgPSBkZXNoYXBlTm9ybWFsaXplKGRlc3QsIHN0YXJ0LCBsZW5ndGgpOworCisgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGxhbWFsZWYgaW4gdGhlIGJ1ZmZlciBjYWxsIGV4cGFuZExhbUFsZWYKKyAgICAgICAgaWYgKGxhbWFsZWZfY291bnQgIT0gMCkgeworICAgICAgICAgICAgLy8gbmVlZCB0byBhZGp1c3QgZGVzdCB0byBmaXQgZXhwYW5kZWQgYnVmZmVyLi4uICEhIQorICAgICAgICAgICAgZGVzdFNpemUgPSBleHBhbmRDb21wb3NpdENoYXIoZGVzdCwgc3RhcnQsIGxlbmd0aCwgbGFtYWxlZl9jb3VudCxERVNIQVBFX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdFNpemUgPSBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVzdFNpemU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJuYWxTaGFwZShjaGFyW10gc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0U2l6ZSkgdGhyb3dzIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChzb3VyY2VMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdFNpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKCgob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgIT0gTEVUVEVSU19OT09QKSAmJgorICAgICAgICAgICAgICAgICgob3B0aW9ucyAmIExBTUFMRUZfTUFTSykgPT0gTEFNQUxFRl9SRVNJWkUpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlU2l6ZShzb3VyY2UsIHNvdXJjZVN0YXJ0LCBzb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlTGVuZ3RoOyAvLyBieSBkZWZpbml0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhbHdheXMgdXNlIHRlbXAgYnVmZmVyCisgICAgICAgIGNoYXJbXSB0ZW1wID0gbmV3IGNoYXJbc291cmNlTGVuZ3RoICogMl07IC8vIGFsbCBsYW1hbGVmcyByZXF1aXJpbmcgZXhwYW5zaW9uCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc291cmNlLCBzb3VyY2VTdGFydCwgdGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKworICAgICAgICBpZiAoaXNMb2dpY2FsKSB7CisgICAgICAgICAgICBpbnZlcnRCdWZmZXIodGVtcCwgMCwgc291cmNlTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBvdXRwdXRTaXplID0gc291cmNlTGVuZ3RoOworCisgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIExFVFRFUlNfTUFTSykgeworICAgICAgICBjYXNlIExFVFRFUlNfU0hBUEVfVEFTSEtFRUxfSVNPTEFURUQ6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gc2hhcGVVbmljb2RlKHRlbXAsIDAsIHNvdXJjZUxlbmd0aCwgZGVzdFNpemUsIDEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1NIQVBFOgorICAgICAgICAgICAgaWYoICgob3B0aW9ucyZUQVNIS0VFTF9NQVNLKT4gMCkgJiYKKyAgICAgICAgICAgICAgICAoKG9wdGlvbnMmVEFTSEtFRUxfTUFTSykgIT1UQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpKSB7CisgICAgICAgICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2hhcGluZyBmdW5jdGlvbiB3aXRoIHRhc2hrZWVsIGZsYWcgPT0gMiBmb3IgcmVtb3ZhbCBvZiB0YXNoa2VlbCAqLworICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMik7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgIC8vZGVmYXVsdCBDYWxsIHRoZSBzaGFwaW5nIGZ1bmN0aW9uIHdpdGggdGFzaGtlZWwgZmxhZyA9PSAxICovCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFNpemUgPSBzaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAvKkFmdGVyIHNoYXBpbmcgdGV4dCBjaGVjayBpZiB1c2VyIHdhbnRzIHRvIHJlbW92ZSB0YXNoa2VlbCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRhdHdlZWwqLworICAgICAgICAgICAgICAgICAgIGlmKCAob3B0aW9ucyZUQVNIS0VFTF9NQVNLKSA9PSBUQVNIS0VFTF9SRVBMQUNFX0JZX1RBVFdFRUwpeworICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gaGFuZGxlVGFzaGtlZWxXaXRoVGF0d2VlbCh0ZW1wLHNvdXJjZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMRVRURVJTX1VOU0hBUEU6CisgICAgICAgICAgICBvdXRwdXRTaXplID0gZGVTaGFwZVVuaWNvZGUodGVtcCwgMCwgc291cmNlTGVuZ3RoLCBkZXN0U2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0U2l6ZSA+IGRlc3RTaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJhYmljU2hhcGluZ0V4Y2VwdGlvbigibm90IGVub3VnaCByb29tIGZvciByZXN1bHQgZGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvcHRpb25zICYgRElHSVRTX01BU0spICE9IERJR0lUU19OT09QKSB7CisgICAgICAgICAgICBjaGFyIGRpZ2l0QmFzZSA9ICdcdTAwMzAnOyAvLyBFdXJvcGVhbiBkaWdpdHMKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUX1RZUEVfTUFTSykgeworICAgICAgICAgICAgY2FzZSBESUdJVF9UWVBFX0FOOgorICAgICAgICAgICAgICAgIGRpZ2l0QmFzZSA9ICdcdTA2NjAnOyAgLy8gQXJhYmljLUluZGljIGRpZ2l0cworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUX1RZUEVfQU5fRVhURU5ERUQ6CisgICAgICAgICAgICAgICAgZGlnaXRCYXNlID0gJ1x1MDZmMCc7ICAvLyBFYXN0ZXJuIEFyYWJpYy1JbmRpYyBkaWdpdHMgKFBlcnNpYW4gYW5kIFVyZHUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucyAmIERJR0lUU19NQVNLKSB7CisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBkaWdpdERlbHRhID0gZGlnaXRCYXNlIC0gJ1x1MDAzMCc7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gdGVtcFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnXHUwMDM5JyAmJiBjaCA+PSAnXHUwMDMwJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbaV0gKz0gZGlnaXREZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfQU4yRU46CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0VG9wID0gKGNoYXIpKGRpZ2l0QmFzZSArIDkpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXREZWx0YSA9ICdcdTAwMzAnIC0gZGlnaXRCYXNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dFNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRlbXBbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gZGlnaXRUb3AgJiYgY2ggPj0gZGlnaXRCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSArPSBkaWdpdERlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIERJR0lUU19FTjJBTl9JTklUX0xSOgorICAgICAgICAgICAgICAgIHNoYXBlVG9BcmFiaWNEaWdpdHNXaXRoQ29udGV4dCh0ZW1wLCAwLCBvdXRwdXRTaXplLCBkaWdpdEJhc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBESUdJVFNfRU4yQU5fSU5JVF9BTDoKKyAgICAgICAgICAgICAgICBzaGFwZVRvQXJhYmljRGlnaXRzV2l0aENvbnRleHQodGVtcCwgMCwgb3V0cHV0U2l6ZSwgZGlnaXRCYXNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvZ2ljYWwpIHsKKyAgICAgICAgICAgIGludmVydEJ1ZmZlcih0ZW1wLCAwLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgZGVzdCwgZGVzdFN0YXJ0LCBvdXRwdXRTaXplKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0U2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcmFiaWNTaGFwaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIEFyYWJpY1NoYXBpbmdFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgICAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2ljdTRqL2xpY2Vuc2UuaHRtbCBiL2ljdTRqL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTA1ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvaWN1NGovbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxodG1sPgorCis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj48L21ldGE+Cis8dGl0bGU+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgQkdDT0xPUj0iI2ZmZmZmZiI+Cis8aDI+SUNVIExpY2Vuc2UgLSBJQ1UgMS44LjEgYW5kIGxhdGVyPC9oMj4KKworPHA+Q09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRTwvcD4KKworPHA+CitDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNiBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMKKzwvcD4KKzxwPgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzwvcD4KKzxwPgorUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCit0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCit0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwKK2NvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucwordG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlIGFuZCB0aGF0IGJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMKK3Blcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCis8L3A+Cis8cD4KK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIAorSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwKK1RIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCitPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIKK1JFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKK1VTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorPC9wPgorPHA+CitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBhIGNvcHlyaWdodCBob2xkZXIgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4KK3RoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCis8L3A+CisKKzxocj4KKzxwPjxzbWFsbD4KK0FsbCB0cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhlcmVpbiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorPC9zbWFsbD48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaAppbmRleCAwOWYwZGUxLi4yMmM5YjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgKQEAgLTMwLDcgKzMwLDkgQEAKIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0gICAgCisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKwogY2xhc3MgQW5kcm9pZFJ1bnRpbWUKIHsKIHB1YmxpYzoKQEAgLTEyMiw2ICsxMjQsOCBAQAogLy8gUmV0dXJucyB0aGUgVW5peCBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgUGFyY2VsRmlsZURlc2NyaXB0b3Igb2JqZWN0CiBleHRlcm4gaW50IGdldFBhcmNlbEZpbGVEZXNjcmlwdG9yRkQoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqZWN0KTsKIAorZXh0ZXJuIEN1cnNvcldpbmRvdyAqIGdldF93aW5kb3dfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFXaW5kb3cpOworCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmggYi9pbmNsdWRlL2JpbmRlci9DdXJzb3JXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaW5kZXIvQ3Vyc29yV2luZG93LmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX19EQVRBQkFTRV9XSU5ET1dfSAorI2RlZmluZSBfQU5EUk9JRF9fREFUQUJBU0VfV0lORE9XX0gKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjZGVmaW5lIERFRkFVTFRfV0lORE9XX1NJWkUgNDA5NgorI2RlZmluZSBNQVhfV0lORE9XX1NJWkUgKDEwMjQgKiAxMDI0KQorI2RlZmluZSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFIDQwOTYKKworI2RlZmluZSBST1dfU0xPVF9DSFVOS19OVU1fUk9XUyAxNgorCisvLyBSb3cgc2xvdHMgYXJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MsCisvLyB3aXRoIGFuIG9mZnNldCBhZnRlciB0aGUgcm93cyB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCBjaHVuaworI2RlZmluZSBST1dfU0xPVF9DSFVOS19TSVpFICgoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpICsgc2l6ZW9mKHVpbnQzMl90KSkKKworCisjaWYgTE9HX05ERUJVRworCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBpZiAoZmFsc2UpCisjZGVmaW5lIExPR19XSU5ET1coLi4uKQorCisjZWxzZQorCisjZGVmaW5lIElGX0xPR19XSU5ET1coKSBJRl9MT0coTE9HX0RFQlVHLCAiQ3Vyc29yV2luZG93IikKKyNkZWZpbmUgTE9HX1dJTkRPVyguLi4pIExPRyhMT0dfREVCVUcsICJDdXJzb3JXaW5kb3ciLCBfX1ZBX0FSR1NfXykKKworI2VuZGlmCisKKworLy8gV2hlbiBkZWZpbmVkIHRvIHRydWUgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVURjgsIG90aGVyd2lzZSB0aGV5J3JlIFVURjE2CisjZGVmaW5lIFdJTkRPV19TVE9SQUdFX1VURjggMQorCisvLyBXaGVuIGRlZmluZWQgdG8gdHJ1ZSBudW1iZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBpbmxpbmUgaW4gdGhlIGZpZWxkX3Nsb3RfdCwgb3RoZXJ3aXNlIHRoZXkncmUgYWxsb2NhdGVkIGluIHRoZSB3aW5kb3cKKyNkZWZpbmUgV0lORE9XX1NUT1JBR0VfSU5MSU5FX05VTUVSSUNTIDEKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG51bVJvd3M7CisgICAgdWludDMyX3QgbnVtQ29sdW1uczsKK30gd2luZG93X2hlYWRlcl90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG9mZnNldDsKK30gcm93X3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IHR5cGU7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZDsKKyAgICAgICAgaW50NjRfdCBsOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgfSBidWZmZXI7CisgICAgfSBkYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBmaWVsZF9zbG90X3Q7CisKKyNkZWZpbmUgRklFTERfVFlQRV9OVUxMIDAKKyNkZWZpbmUgRklFTERfVFlQRV9JTlRFR0VSIDEKKyNkZWZpbmUgRklFTERfVFlQRV9GTE9BVCAyCisjZGVmaW5lIEZJRUxEX1RZUEVfU1RSSU5HIDMKKyNkZWZpbmUgRklFTERfVFlQRV9CTE9CIDQKKworLyoqCisgKiBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiByb3dzIGZyb20gYSBkYXRhYmFzZSBpbiBhIGJ1ZmZlci4gVGhlIGJlZ2luaW5nIG9mIHRoZQorICogd2luZG93IGhhcyBmaXJzdCBjaHVuayBvZiByb3dfc2xvdF90cywgd2hpY2ggYXJlIG9mZnNldHMgdG8gdGhlIHJvdyBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5CisgKiBhbiBvZmZzZXQgdG8gdGhlIG5leHQgY2h1bmsgaW4gYSBsaW5rZWQtbGlzdCBvZiBhZGRpdGlvbmFsIGNodW5rIG9mIHJvd19zbG90X3RzIGluIGNhc2UKKyAqIHRoZSBwcmUtYWxsb2NhdGVkIGNodW5rIGlzbid0IGJpZyBlbm91Z2ggdG8gcmVmZXIgdG8gYWxsIHJvd3MuIEVhY2ggcm93IGRpcmVjdG9yeSBoYXMgYQorICogZmllbGRfc2xvdF90IHBlciBjb2x1bW4sIHdoaWNoIGhhcyB0aGUgc2l6ZSwgb2Zmc2V0LCBhbmQgdHlwZSBvZiB0aGUgZGF0YSBmb3IgdGhhdCBmaWVsZC4KKyAqIE5vdGUgdGhhdCB0aGUgZGF0YSB0eXBlcyBjb21lIGZyb20gc3FsaXRlMy5oLgorICovCitjbGFzcyBDdXJzb3JXaW5kb3cKK3sKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JXaW5kb3coKXt9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH5DdXJzb3JXaW5kb3coKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgaW5pdEJ1ZmZlcihib29sIGxvY2FsT25seSk7CisgICAgc3A8SU1lbW9yeT4gICAgICAgICBnZXRNZW1vcnkoKSB7cmV0dXJuIG1NZW1vcnk7fQorCisgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplKCkge3JldHVybiBtU2l6ZTt9CisgICAgdWludDhfdCAqICAgICAgICAgICBkYXRhKCkge3JldHVybiBtRGF0YTt9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXROdW1Sb3dzKCkge3JldHVybiBtSGVhZGVyLT5udW1Sb3dzO30KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGdldE51bUNvbHVtbnMoKSB7cmV0dXJuIG1IZWFkZXItPm51bUNvbHVtbnM7fQorICAgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUxhc3RSb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1IZWFkZXItPm51bVJvd3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXROdW1Db2x1bW5zKHVpbnQzMl90IG51bUNvbHVtbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXIgPSBtSGVhZGVyLT5udW1Db2x1bW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID4gMCAmJiBjdXIgIT0gbnVtQ29sdW1ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGdvIGZyb20gJWQgY29sdW1ucyB0byAlZCIsIGN1ciwgbnVtQ29sdW1ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGludDMyX3QgICAgICAgICAgICAgZnJlZVNwYWNlKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYSByb3cgc2xvdCBhbmQgaXRzIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb2ludGVyIHBvaW50cyB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIHJvdydzIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgTlVMTCBpZiB0aGVyZSB3YXNuJ3Qgcm9vbS4gVGhlIGRpcmVjdG9yeSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICogaW5pdGlhbGllZCB3aXRoIE5VTEwgZW50cmllcyBmb3IgZWFjaCBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZpZWxkX3Nsb3RfdCAqICAgICAgYWxsb2NSb3coKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIHBvcnRpb24gb2YgdGhlIHdpbmRvdy4gUmV0dXJucyB0aGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdGlvbiwgb3IgMCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBhbGlnbmVkIGlzIHRydWUsIHRoZSBhbGxvY2F0aW9uIGdldHMgNCBieXRlIGFsaWdubWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgYWxsb2Moc2l6ZV90IHNpemUsIGJvb2wgYWxpZ25lZCA9IGZhbHNlKTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgcmVhZF9maWVsZF9zbG90KGludCByb3csIGludCBjb2x1bW4sIGZpZWxkX3Nsb3RfdCAqIHNsb3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHkgZGF0YSBpbnRvIHRoZSB3aW5kb3cgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgY29weUluKHVpbnQzMl90IG9mZnNldCwgdWludDhfdCBjb25zdCAqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGludDY0X3QgZGF0YSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCBkb3VibGUgZGF0YSk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGNvcHlPdXQodWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgICAgICAgICAgICAgY29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KTsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNvcHlPdXREb3VibGUodWludDMyX3Qgb2Zmc2V0KTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sICAgICAgICAgICAgICAgIHB1dERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgdmFsdWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgcHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0TG9uZyh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBpbnQ2NF90ICogdmFsdWVPdXQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgZ2V0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSAqIHZhbHVlT3V0KTsKKyAgICBib29sICAgICAgICAgICAgICAgIGdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KTsKKworICAgIHVpbnQ4X3QgKiAgICAgICAgICAgb2Zmc2V0VG9QdHIodWludDMyX3Qgb2Zmc2V0KSB7cmV0dXJuIG1EYXRhICsgb2Zmc2V0O30KKworICAgIHJvd19zbG90X3QgKiAgICAgICAgYWxsb2NSb3dTbG90KCk7CisKKyAgICByb3dfc2xvdF90ICogICAgICAgIGdldFJvd1Nsb3QoaW50IHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIE5VTEwgaWYgRmFpbGVkIHRvIGZpbmQgcm93U2xvdCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogSW52YWxpZCByb3dTbG90CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdFdpdGhDaGVjayhpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBmaWVsZF9zbG90X3QgKiAgICAgIGdldEZpZWxkU2xvdChpbnQgcm93LCBpbnQgY29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkRGlyT2Zmc2V0ID0gZ2V0Um93U2xvdChyb3cpLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KSkgKyBjb2x1bW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKiBtRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1NYXhTaXplOworICAgIHdpbmRvd19oZWFkZXJfdCAqIG1IZWFkZXI7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKworICAgIC8qKgorICAgICAqIE9mZnNldCBvZiB0aGUgbG93ZXN0IHVudXNlZCBkYXRhIGJ5dGUgaW4gdGhlIGFycmF5LgorICAgICAqLworICAgIHVpbnQzMl90IG1GcmVlT2Zmc2V0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDk2NDcwMGIuLjc1Y2Y1ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC0yMiw4ICsyMiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7Ci0KIC8qCiAgKiBBIHNldCBvZiBiaXQgbWFza3MgZm9yIHNwZWNpZnlpbmcgaG93IHRoZSByZWNlaXZlZCBwcmV2aWV3IGZyYW1lcyBhcmUKICAqIGhhbmRsZWQgYmVmb3JlIHRoZSBwcmV2aWV3Q2FsbGJhY2soKSBjYWxsLgpAQCAtMTUyLDkgKzE1MCw4IEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFN0YXR1cygpIHsgcmV0dXJuIG1TdGF0dXM7IH0KIAotICAgICAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgICAgICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKIAogICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0UHJldmlldygpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggNmE2NmUzYy4uNTE1ZDg3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC04Niw4ICs4Nyw4IEBACiBwdWJsaWM6CiAgICAgdmlydHVhbCB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoKSB7IH0KIAotICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcHJldmlldyBpbWFnZSBoZWFwICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gICAgICAgICBnZXRQcmV2aWV3SGVhcCgpIGNvbnN0ID0gMDsKKyAgICAvKiogU2V0IHRoZSBJU3VyZmFjZSBmcm9tIHdoaWNoIHRoZSBwcmV2aWV3IGJ1ZmZlcnMgc2hvdWxkIGJlIGRlcXVldWVkICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpID0gMDsKIAogICAgIC8qKiBSZXR1cm4gdGhlIElNZW1vcnlIZWFwIGZvciB0aGUgcmF3IGltYWdlIGhlYXAgKi8KICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgIGdldFJhd0hlYXAoKSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhLmgKaW5kZXggNmZjZjllNS4uOGJjZWVhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmEuaApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgorI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC00NSw4ICs0NSw4IEBACiAgICAgLy8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCkgPSAwOwogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogCiAgICAgLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KICAgICAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggYWY5YTdlZC4uYTFjZTExMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIElTdXJmYWNlOworY2xhc3MgU3VyZmFjZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtMzMsNyArMzQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDU0YWRjYTguLjI4YmU3YzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIpOwogCiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpID0gMDsKLSAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU291cmNlKGludCB2cykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldEF1ZGlvU291cmNlKGludCBhcykgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZvcm1hdChpbnQgb2YpID0gMDsKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRBdWRpb0VuY29kZXIoaW50IGFlKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CkBAIC02OCw0ICs2OSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFSRUNPUkRFUl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggMmY2MWNiZS4uMWY4Y2U3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9JT01YX0hfCiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC03OCwxMCArNzksMTcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSA9IDA7CisKICAgICAvLyBUaGlzIEFQSSBjbGVhcmx5IG9ubHkgbWFrZXMgc2Vuc2UgaWYgdGhlIGNhbGxlciBsaXZlcyBpbiB0aGUKICAgICAvLyBzYW1lIHByb2Nlc3MgYXMgdGhlIGNhbGxlZSwgaS5lLiBpcyB0aGUgbWVkaWFfc2VydmVyLCBhcyB0aGUKICAgICAvLyByZXR1cm5lZCAiYnVmZmVyX2RhdGEiIHBvaW50ZXIgaXMganVzdCB0aGF0LCBhIHBvaW50ZXIgaW50byBsb2NhbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDM2NjI5ODMuLjEzYzczYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogY2xhc3MgUGFyY2VsOwogY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTb3J0ZWRWZWN0b3I7CiAKQEAgLTEwNCw3ICsxMDUsOCBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggYzNjZDM2MS4uMGVjN2VlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTI1LDcgKzI1LDIwIEBACiAKIGVudW0gY2FtY29yZGVyX3F1YWxpdHkgewogICAgIENBTUNPUkRFUl9RVUFMSVRZX0xPVyAgPSAwLAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0ggPSAxCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSCA9IDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfUUNJRiA9IDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfQ0lGID0gMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV80ODBQID0gNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCisKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSCA9IDEwMDEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGID0gMTAwMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0NJRiA9IDEwMDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80ODBQID0gMTAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2CiB9OwogCiBlbnVtIHZpZGVvX2RlY29kZXIgewpAQCAtNjgsNiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgcHJvZmlsZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdCB0aGUgZ2l2ZW4gcXVhbGl0eSBleGlzdHMsCisgICAgICogb3IgZmFsc2UgaWYgbm90LgorICAgICAqLworICAgIGJvb2wgaGFzQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0cyBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgVmVjdG9yPG91dHB1dF9mb3JtYXQ+IGdldE91dHB1dEZpbGVGb3JtYXRzKCkgY29uc3Q7CkBAIC0yNTIsNiArMjcxLDggQEAKICAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKICAgICB9OwogCisgICAgaW50IGdldENhbWNvcmRlclByb2ZpbGVJbmRleChpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworCiAgICAgLy8gRGVidWcKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvZGVjKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvZGVjKTsKQEAgLTI4Myw2ICszMDQsOCBAQAogICAgIHN0YXRpYyBNZWRpYVByb2ZpbGVzKiBjcmVhdGVEZWZhdWx0SW5zdGFuY2UoKTsKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlckxvd1Byb2ZpbGUoKTsKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSAqY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlKCk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VMb3dQcm9maWxlKCk7CisgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgKmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJUaW1lTGFwc2VIaWdoUHJvZmlsZSgpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJQcm9maWxlcyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdFZpZGVvRW5jb2RlcnMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRBdWRpb0VuY29kZXJzKE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA1ZTllMzY4Li5jNDIzNDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogCiBzdHJ1Y3QgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIE1lZGlhUmVjb3JkZXJCYXNlKCkge30KQEAgLTM3LDkgKzM3LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKSB7cmV0dXJuIElOVkFMSURfT1BFUkFUSU9OO30KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggYzA5MWMzOS4uNGI0NGNjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSVN1cmZhY2U7CitjbGFzcyBTdXJmYWNlOwogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIEF1dGhvckRyaXZlcldyYXBwZXI7CiAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC02Niw0ICs2NiwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL1BWUGxheWVyLmgKaW5kZXggZGY1MDk4MS4uNjU3ZTdhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVlBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvUFZQbGF5ZXIuaApAQCAtNDMsNyArNDMsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCAyOTFiMThhLi5hNjAwZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMTcwLDYgKzE3MCw3IEBACiAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7CiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CkBAIC0xOTYsNiArMTk3LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW9FbmNvZGVyU2V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlb0VuY29kZXJTZXQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc091dHB1dEZpbGVTZXQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1eGlsaWFyeU91dHB1dEZpbGVTZXQ7CiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCAwZDM5N2FjLi43NGM5ZDVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTM4LDggKzM4LDcgQEAKIAogICAgIHR5cGVkZWYgYm9vbCAoKkV4Y2VwdGlvbkNoZWNrKSh2b2lkKiBlbnYpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAogICAgICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudik7CiAKICAgICB2b2lkIHNldExvY2FsZShjb25zdCBjaGFyICpsb2NhbGUpOwpAQCAtNTUsOSArNTQsOCBAQAogICAgIGNoYXIgKm1Mb2NhbGU7CiAKICAgICBzdGF0dXNfdCBkb1Byb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgY29uc3QgY2hhciAqZXh0ZW5zaW9ucywKLSAgICAgICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LCBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgIHZvaWQgKmV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICBjaGFyICpwYXRoLCBpbnQgcGF0aFJlbWFpbmluZywgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQsCisgICAgICAgICAgICBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywgdm9pZCAqZXhjZXB0aW9uRW52KTsKIAogICAgIE1lZGlhU2Nhbm5lcihjb25zdCBNZWRpYVNjYW5uZXIgJik7CiAgICAgTWVkaWFTY2FubmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzE5MmQwMy4uZWQ1ZjA5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxMiArNDYsMzQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciogYnVmZmVyKTsKIAotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7Ci0KK3Byb3RlY3RlZDoKICAgICBzcDxDYW1lcmE+IG1DYW1lcmE7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCisgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBtTnVtRnJhbWVzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIC8vIENhbGxlZCBmcm9tIGRhdGFDYWxsYmFja1RpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7cmV0dXJuIGZhbHNlO30KKworICAgIC8vIENhbGxiYWNrIGNhbGxlZCB3aGVuIHN0aWxsIGNhbWVyYSByYXcgZGF0YSBpcyBhdmFpbGFibGUuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOworCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKICAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CkBAIC02MCwyMSArODEsMTIgQEAKICAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CiAgICAgaW50NjRfdCBtRmlyc3RGcmFtZVRpbWVVczsKLSAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKLSAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOwogICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CiAgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKICAgICBib29sIG1Db2xsZWN0U3RhdHM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwotCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKIAogICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwogICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWNkMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNkZWZpbmUgQ0FNRVJBX1NPVVJDRV9USU1FX0xBUFNFX0hfCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElDYW1lcmE7CitjbGFzcyBJTWVtb3J5OworY2xhc3MgQ2FtZXJhOworCitjbGFzcyBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgOiBwdWJsaWMgQ2FtZXJhU291cmNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhU291cmNlVGltZUxhcHNlICpDcmVhdGUoCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgc3RhdGljIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlVGltZUxhcHNlKCk7CisKK3ByaXZhdGU6CisgICAgLy8gSWYgdHJ1ZSwgd2lsbCB1c2Ugc3RpbGwgY2FtZXJhIHRha2VQaWN0dXJlKCkgZm9yIHRpbWUgbGFwc2UgZnJhbWVzCisgICAgLy8gSWYgZmFsc2UsIHdpbGwgdXNlIHRoZSB2aWRlb2NhbWVyYSBmcmFtZXMgaW5zdGVhZC4KKyAgICBib29sIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZTsKKworICAgIC8vIFNpemUgb2YgcGljdHVyZSB0YWtlbiBmcm9tIHN0aWxsIGNhbWVyYS4gVGhpcyBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUKKyAgICAvLyBvZiB0aGUgdmlkZW8sIGFzIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGV4YWN0IHZpZGVvIHJlc29sdXRpb24KKyAgICAvLyBkZW1hbmRlZC4gU2VlIHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKCkuCisgICAgaW50MzJfdCBtUGljdHVyZVdpZHRoOworICAgIGludDMyX3QgbVBpY3R1cmVIZWlnaHQ7CisKKyAgICAvLyBzaXplIG9mIHRoZSBlbmNvZGVkIHZpZGVvLgorICAgIGludDMyX3QgbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CisKKyAgICAvLyBUcnVlIGlmIHdlIG5lZWQgdG8gY3JvcCB0aGUgc3RpbGwgY2FtZXJhIGltYWdlIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgYm9vbCBtTmVlZENyb3BwaW5nOworCisgICAgLy8gU3RhcnQgbG9jYXRpb24gb2YgdGhlIGNyb3BwaW5nIHJlY3RhbmdsZS4KKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WDsKKyAgICBpbnQzMl90IG1Dcm9wUmVjdFN0YXJ0WTsKKworICAgIC8vIFRpbWUgYmV0d2VlbiBjYXB0dXJlIG9mIHR3byBmcmFtZXMgZHVyaW5nIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgLy8gTmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGltZWxhcHNlIGlzIGRpc2FibGVkLgorICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CisKKyAgICAvLyBUaW1lIGJldHdlZW4gdHdvIGZyYW1lcyBpbiBmaW5hbCB2aWRlbyAoMS9mcmFtZVJhdGUpCisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VWaWRlb0ZyYW1lc1VzOworCisgICAgLy8gUmVhbCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZW5jb2RlZCB0aW1lIGxhcHNlIGZyYW1lCisgICAgaW50NjRfdCBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzOworCisgICAgLy8gVGhyZWFkIGlkIG9mIHRocmVhZCB3aGljaCB0YWtlcyBzdGlsbCBwaWN0dXJlIGFuZCBzbGVlcHMgaW4gYSBsb29wLgorICAgIHB0aHJlYWRfdCBtVGhyZWFkVGltZUxhcHNlOworCisgICAgLy8gVmFyaWFibGUgc2V0IGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHRvIGhlbHAgc2tpcEN1cnJlbnRGcmFtZSgpCisgICAgLy8gdG8ga25vdyBpZiBjdXJyZW50IGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQuCisgICAgYm9vbCBtU2tpcEN1cnJlbnRGcmFtZTsKKworICAgIC8vIFRydWUgaWYgY2FtZXJhIGlzIGluIHByZXZpZXcgbW9kZSBhbmQgcmVhZHkgZm9yIHRha2VQaWN0dXJlKCkuCisgICAgYm9vbCBtQ2FtZXJhSWRsZTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEsCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpOworCisgICAgLy8gRm9yIHN0aWxsIGNhbWVyYSBjYXNlIHN0YXJ0cyBhIHRocmVhZCB3aGljaCBjYWxscyBjYW1lcmEncyB0YWtlUGljdHVyZSgpCisgICAgLy8gaW4gYSBsb29wLiBGb3IgdmlkZW8gY2FtZXJhIGNhc2UsIGp1c3Qgc3RhcnRzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisKKyAgICAvLyBGb3Igc3RpbGwgY2FtZXJhIGNhc2Ugam9pbnMgdGhlIHRocmVhZCBjcmVhdGVkIGluIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlLCBqdXN0IHN0b3BzIHRoZSBjYW1lcmEncyB2aWRlbyByZWNvcmRpbmcuCisgICAgdmlydHVhbCB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKworICAgIC8vIEZvciBzdGlsbCBjYW1lcmEgY2FzZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIG1lbW9yeSBpcyBsb2NhbGx5CisgICAgLy8gYWxsb2NhdGVkIHdpdGggcmVmY291bnRpbmcuCisgICAgLy8gRm9yIHZpZGVvIGNhbWVyYSBjYXNlIGp1c3QgdGVsbCB0aGUgY2FtZXJhIHRvIHJlbGVhc2UgdGhlIGZyYW1lLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKTsKKworICAgIC8vIG1Ta2lwQ3VycmVudEZyYW1lIGlzIHNldCB0byB0cnVlIGluIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIGlmIHRoZSBjdXJyZW50CisgICAgLy8gZnJhbWUgbmVlZHMgdG8gYmUgc2tpcHBlZCBhbmQgdGhpcyBmdW5jdGlvbiBqdXN0IHJldHVybnMgdGhlIHZhbHVlIG9mIG1Ta2lwQ3VycmVudEZyYW1lLgorICAgIHZpcnR1YWwgYm9vbCBza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgLy8gSGFuZGxlcyB0aGUgY2FsbGJhY2sgdG8gaGFuZGxlIHJhdyBmcmFtZSBkYXRhIGZyb20gdGhlIHN0aWxsIGNhbWVyYS4KKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiB0aGUgZnJhbWUgZGF0YSBhcyB0aGUgY2FtZXJhIGNhbiByZXVzZSB0aGUgZnJhbWUgbWVtb3J5CisgICAgLy8gb25jZSB0aGlzIGNhbGxiYWNrIHJldHVybnMuIFRoZSBmdW5jdGlvbiBhbHNvIHNldHMgYSBuZXcgdGltc3RhbXAgY29ycmVzcG9uZGluZworICAgIC8vIHRvIG9uZSBmcmFtZSB0aW1lIGFoZWFkIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLiBJdCB0aGVuCisgICAgLy8gY2FsbHMgZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkgb2YgdGhlIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY29waWVkIGRhdGEgYW5kIHRoZQorICAgIC8vIG1vZGlmaWVkIHRpbWVzdGFtcCwgd2hpY2ggd2lsbCB0aGluayB0aGF0IGl0IHJlY2lldmVkIHRoZSBmcmFtZSBmcm9tIGEgdmlkZW8KKyAgICAvLyBjYW1lcmEgYW5kIHByb2NlZWQgYXMgdXN1YWwuCisgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKKyAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KKyAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKKyAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIC8vIElmIHRoZSBwYXNzZWQgaW4gc2l6ZSAod2lkdGggeCBoZWlnaHQpIGlzIGEgc3VwcG9ydGVkIHByZXZpZXcgc2l6ZSwKKyAgICAvLyB0aGUgZnVuY3Rpb24gc2V0cyB0aGUgY2FtZXJhJ3MgcHJldmlldyBzaXplIHRvIGl0IGFuZCByZXR1cm5zIHRydWUuCisgICAgLy8gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCB0cnlTZXR0aW5nUHJldmlld1NpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gVGhlIHN0aWxsIGNhbWVyYSBtYXkgbm90IHN1cHBvcnQgdGhlIGRlbWFuZGVkIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgLy8gV2UgbG9vayBmb3IgdGhlIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzIGZyb20gdGhlIHN0aWxsIGNhbWVyYSBhbmQKKyAgICAvLyBjaG9vc2UgdGhlIHNtYWxsZXN0IG9uZSB3aXRoIGVpdGhlciBkaW1lbnNpb25zIGhpZ2hlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gdmlkZW8gZGltZW5zaW9ucy4gVGhlIHN0aWxsIHBpY3R1cmUgd2lsbCBiZSBjcm9wcGVkIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIHBpY3R1cmUgc2l6ZXMgZ3JlYXRlciB0aGFuCisgICAgLy8gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCBpbiB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGljdHVyZVNpemVUb0Nsb3Nlc3RTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgcmVjdGFuZ2xlIGZyb20gd2hlcmUgdG8gc3RhcnQgY3JvcHBpbmcgdGhlCisgICAgLy8gc3RpbGwgaW1hZ2UgaW50byB0aGUgdmlkZW8gZnJhbWUuIFdlIGNob29zZSB0aGUgY2VudGVyIG9mIHRoZSBpbWFnZSB0byBiZQorICAgIC8vIGNyb3BwZWQuIFRoZSBvZmZzZXQgaXMgc3RvcmVkIGluIChtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSkuCisgICAgYm9vbCBjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpOworCisgICAgLy8gQ3JvcHMgdGhlIHNvdXJjZSBkYXRhIGludG8gYSBzbWFsbGVyIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKG1Dcm9wUmVjdFN0YXJ0WCwgbUNyb3BSZWN0U3RhcnRZKSBhbmQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZGVvIGZyYW1lLgorICAgIC8vIFRoZSBkYXRhIGlzIHJldHVybmVkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgSU1lbW9yeS4KKyAgICBzcDxJTWVtb3J5PiBjcm9wWVVWSW1hZ2UoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIC8vIFdoZW4gdmlkZW8gY2FtZXJhIGlzIHVzZWQgZm9yIHRpbWUgbGFwc2UgY2FwdHVyZSwgcmV0dXJucyB0cnVlCisgICAgLy8gdW50aWwgZW5vdWdoIHRpbWUgaGFzIHBhc3NlZCBmb3IgdGhlIG5leHQgdGltZSBsYXBzZSBmcmFtZS4gV2hlbgorICAgIC8vIHRoZSBmcmFtZSBuZWVkcyB0byBiZSBlbmNvZGVkLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBhbHNvIG1vZGlmaWVzCisgICAgLy8gdGhlIHRpbWUgc3RhbXAgdG8gYmUgb25lIGZyYW1lIHRpbWUgYWhlYWQgb2YgdGhlIGxhc3QgZW5jb2RlZAorICAgIC8vIGZyYW1lJ3MgdGltZSBzdGFtcC4KKyAgICBib29sIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcChpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvLyBXcmFwcGVyIHRvIGVudGVyIHRocmVhZFRpbWVMYXBzZUVudHJ5KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkVGltZUxhcHNlV3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBSdW5zIGEgbG9vcCB3aGljaCBzbGVlcHMgdW50aWwgYSBzdGlsbCBwaWN0dXJlIGlzIHJlcXVpcmVkCisgICAgLy8gYW5kIHRoZW4gY2FsbHMgbUNhbWVyYS0+dGFrZVBpY3R1cmUoKSB0byB0YWtlIHRoZSBzdGlsbCBwaWN0dXJlLgorICAgIC8vIFVzZWQgb25seSBpbiB0aGUgY2FzZSBtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UgPSB0cnVlLgorICAgIHZvaWQgdGhyZWFkVGltZUxhcHNlRW50cnkoKTsKKworICAgIC8vIFdyYXBwZXIgdG8gZW50ZXIgdGhyZWFkU3RhcnRQcmV2aWV3KCkKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcih2b2lkICptZSk7CisKKyAgICAvLyBTdGFydHMgdGhlIGNhbWVyYSdzIHByZXZpZXcuCisgICAgdm9pZCB0aHJlYWRTdGFydFByZXZpZXcoKTsKKworICAgIC8vIFN0YXJ0cyB0aHJlYWQgVGhyZWFkU3RhcnRQcmV2aWV3V3JhcHBlcigpIGZvciByZXN0YXJ0aW5nIHByZXZpZXcuCisgICAgLy8gTmVlZHMgdG8gYmUgZG9uZSBpbiBhIHRocmVhZCBzbyB0aGF0IGRhdGFDYWxsYmFjaygpIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24KKyAgICAvLyBjYW4gcmV0dXJuLCBhbmQgdGhlIGNhbWVyYSBjYW4ga25vdyB0aGF0IHRha2VQaWN0dXJlKCkgaXMgZG9uZS4KKyAgICB2b2lkIHJlc3RhcnRQcmV2aWV3KCk7CisKKyAgICAvLyBDcmVhdGVzIGEgY29weSBvZiBzb3VyY2VfZGF0YSBpbnRvIGEgbmV3IG1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2UuCisgICAgc3A8SU1lbW9yeT4gY3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKTsKKworICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZShjb25zdCBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgJik7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICZvcGVyYXRvcj0oY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQU1FUkFfU09VUkNFX1RJTUVfTEFQU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaAppbmRleCAyMjFjNjc5Li40ZGVkNWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oCkBAIC0yMSwxMCArMjEsNjAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9SZW5kZXJlci5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gdGhlIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbgorLy8gaXMgZ2l2ZW4uCisvLworLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGlzIGRpc2FibGVkIGZvciBhIHBvcnQgKHRoZSBkZWZhdWx0IHN0YXRlKSwKKy8vIHRoZSBPTVggbm9kZSBzaG91bGQgb3BlcmF0ZSBhcyBub3JtYWwsIGFuZCBleHBlY3QgVXNlQnVmZmVyIGNhbGxzIHRvIHNldCBpdHMKKy8vIGJ1ZmZlcnMuICBUaGlzIGlzIHRoZSBtb2RlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gQ1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyIGlzCisvLyByZXF1aXJlZC4KKy8vCisvLyBXaGVuIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlciB1c2UgaGFzIGJlZW4gZW5hYmxlZCwgdGhlIE9NWCBub2RlIG11c3Qgc3VwcG9ydAorLy8gb25seSBjb2xvciBmb3JtYXRzIGluIHRoZSByYW5nZSBbT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQsCisvLyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZFByaXZhdGVFbmQpLiAgVGhlIG5vZGUgc2hvdWxkIHRoZW4gZXhwZWN0IHRvIHJlY2VpdmUKKy8vIFVzZUFuZHJvaWROYXRpdmVCdWZmZXIgY2FsbHMgKHZpYSBPTVhfU2V0UGFyYW1ldGVyKSByYXRoZXIgdGhhbiBVc2VCdWZmZXIKKy8vIGNhbGxzLgorc3RydWN0IEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgZW5hYmxlOworfTsKKworLy8gQ29sb3IgZm9ybWF0cyBpbiB0aGUgcmFuZ2UgW09NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0LAorLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlRW5kKSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGdyYWxsb2MgcGl4ZWwKKy8vIGZvcm1hdCB3aGVuIHVzZWQgdG8gYWxsb2NhdGUgQW5kcm9pZCBuYXRpdmUgYnVmZmVycyB2aWEgZ3JhbGxvYy4gIFRoZQorLy8gY29udmVyc2lvbiBpcyBkb25lIGJ5IHN1YnRyYWN0aW5nIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZVN0YXJ0IGZyb20KKy8vIHRoZSBjb2xvciBmb3JtYXQgcmVwb3J0ZWQgYnkgdGhlIGNvZGVjLgorZW51bSB7CisgICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRQcml2YXRlU3RhcnQgPSAweEEwMDAwMDAwLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkUHJpdmF0ZUVuZCA9IDB4QjAwMDAwMDAsCit9OworCisvLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcicgZXh0ZW5zaW9uIGlzCisvLyBnaXZlbi4gIFRoaXMgY2FsbCB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIGEgcHJpb3IgY2FsbCB3YXMgbWFkZSB3aXRoIHRoZQorLy8gJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycycgZXh0ZW5zaW9uIGluZGV4LAorLy8gZW5hYmxpbmcgdXNlIG9mIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMuCitzdHJ1Y3QgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZWFkZXI7CisgICAgY29uc3Qgc3A8YW5kcm9pZF9uYXRpdmVfYnVmZmVyX3Q+JiBuYXRpdmVCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiBleHRlcm4gYW5kcm9pZDo6VmlkZW9SZW5kZXJlciAqY3JlYXRlUmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKQEAgLTM1LDQgKzg1LDMgQEAKIGV4dGVybiBhbmRyb2lkOjpPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKTsKIAogI2VuZGlmICAvLyBIQVJEV0FSRV9BUElfSF8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhmNGMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd2F5IHRvIHNwbGl0IGEgc2luZ2xlIG1lZGlhIHNvdXJjZSBpbnRvIG11bHRpcGxlIHNvdXJjZXMuCisvLyBUaGUgY29uc3RydWN0b3IgdGFrZXMgaW4gdGhlIHJlYWwgbWVkaWFTb3VyY2UgYW5kIGNyZWF0ZUNsaWVudCgpIGNhbiB0aGVuIGJlCisvLyB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBsZSBzb3VyY2VzIHNlcnZlZCBmcm9tIHRoaXMgcmVhbCBtZWRpYVNvdXJjZS4KKy8vCisvLyBVc2FnZToKKy8vIC0gQ3JlYXRlIE1lZGlhU291cmNlU3BsaXR0ZXIgYnkgcGFzc2luZyBpbiBhIHJlYWwgbWVkaWFTb3VyY2UgZnJvbSB3aGljaAorLy8gbXVsdGlwbGUgZHVwbGljYXRlIGNoYW5uZWxzIGFyZSBuZWVkZWQuCisvLyAtIENyZWF0ZSBhIGNsaWVudCB1c2luZyBjcmVhdGVDbGllbnQoKSBhbmQgdXNlIGl0IGFzIGFueSBvdGhlciBtZWRpYVNvdXJjZS4KKy8vCisvLyBOb3RlIHRoYXQgbXVsdGlwbGUgY2xpZW50cyBjYW4gYmUgY3JlYXRlZCB1c2luZyBjcmVhdGVDbGllbnQoKSBhbmQKKy8vIHN0YXJ0ZWQvc3RvcHBlZCBpbiBhbnkgb3JkZXIuIE1lZGlhU291cmNlU3BsaXR0ZXIgc3RvcHMgdGhlIHJlYWwgc291cmNlIG9ubHkKKy8vIHdoZW4gYWxsIGNsaWVudHMgaGF2ZSBiZWVuIHN0b3BwZWQuCisvLworLy8gSWYgYSBuZXcgY2xpZW50IGlzIGNyZWF0ZWQvc3RhcnRlZCBhZnRlciBzb21lIGV4aXN0aW5nIGNsaWVudHMgaGF2ZSBhbHJlYWR5CisvLyBzdGFydGVkLCB0aGUgbmV3IGNsaWVudCB3aWxsIHN0YXJ0IGdldHRpbmcgaXRzIHJlYWQgZnJhbWVzIGZyb20gdGhlIGN1cnJlbnQKKy8vIHRpbWUuCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZXRhRGF0YTsKKworY2xhc3MgTWVkaWFTb3VyY2VTcGxpdHRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIC8vIG1lZGlhU291cmNlOiBUaGUgcmVhbCBtZWRpYVNvdXJjZS4gVGhlIGNsYXNzIGtlZXBzIGEgcmVmZXJlbmNlIHRvIGl0IHRvCisgICAgLy8gaW1wbGVtZW50IHRoZSB2YXJpb3VzIGNsaWVudHMuCisgICAgTWVkaWFTb3VyY2VTcGxpdHRlcihzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2UpOworCisgICAgfk1lZGlhU291cmNlU3BsaXR0ZXIoKTsKKworICAgIC8vIENyZWF0ZXMgYSBuZXcgY2xpZW50IG9mIGJhc2UgdHlwZSBNZWRpYVNvdXJjZS4gTXVsdGlwbGUgY2xpZW50cyBjYW4gYmUKKyAgICAvLyBjcmVhdGVkIHdoaWNoIGdldCB0aGVpciBkYXRhIHRocm91Z2ggdGhlIHNhbWUgcmVhbCBtZWRpYVNvdXJjZS4gVGhlc2UKKyAgICAvLyBjbGllbnRzIGNhbiB0aGVuIGJlIHVzZWQgbGlrZSBhbnkgb3RoZXIgTWVkaWFTb3VyY2UsIGFsbCBvZiB3aGljaCBwcm92aWRlCisgICAgLy8gZGF0YSBmcm9tIHRoZSBzYW1lIHJlYWwgc291cmNlLgorICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICAvLyBUb3RhbCBudW1iZXIgb2YgY2xpZW50cyBjcmVhdGVkIHRocm91Z2ggY3JlYXRlQ2xpZW50KCkuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDbGllbnRzOworCisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSByZWFsIE1lZGlhU291cmNlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisKKyAgICAvLyBTdG9yZXMgcG9pbnRlciB0byB0aGUgTWVkaWFCdWZmZXIgcmVhZCBmcm9tIHRoZSByZWFsIE1lZGlhU291cmNlLgorICAgIC8vIEFsbCBjbGllbnRzIHVzZSB0aGlzIHRvIGltcGxlbWVudCB0aGUgcmVhZCgpIGNhbGwuCisgICAgTWVkaWFCdWZmZXIgKm1MYXN0UmVhZE1lZGlhQnVmZmVyOworCisgICAgLy8gU3RhdHVzIGNvZGUgZm9yIHJlYWQgZnJvbSB0aGUgcmVhbCBNZWRpYVNvdXJjZS4gQWxsIGNsaWVudHMgcmV0dXJuCisgICAgLy8gdGhpcyBmb3IgdGhlaXIgcmVhZCgpLgorICAgIHN0YXR1c190IG1MYXN0UmVhZFN0YXR1czsKKworICAgIC8vIEJvb2xlYW4gdGVsbGluZyB3aGV0aGVyIHRoZSByZWFsIE1lZGlhU291cmNlIGhhcyBzdGFydGVkLgorICAgIGJvb2wgbVNvdXJjZVN0YXJ0ZWQ7CisKKyAgICAvLyBMaXN0IG9mIGJvb2xlYW5zLCBvbmUgZm9yIGVhY2ggY2xpZW50LCBzdG9yaW5nIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyBjbGllbnQncyBzdGFydCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICBWZWN0b3I8Ym9vbD4gbUNsaWVudHNTdGFydGVkOworCisgICAgLy8gU3RvcmVzIHRoZSBudW1iZXIgb2YgY2xpZW50cyB3aGljaCBhcmUgY3VycmVudGx5IHN0YXJ0ZWQuCisgICAgaW50MzJfdCBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZDsKKworICAgIC8vIFNpbmNlIGRpZmZlcmVudCBjbGllbnRzIGNhbGwgcmVhZCgpIGFzeW5jaHJvbm91c2x5LCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sKKyAgICAvLyBvZiB3aGF0IGRhdGEgaXMgY3VycmVudGx5IHJlYWQgaW50byB0aGUgbUxhc3RSZWFkTWVkaWFCdWZmZXIuCisgICAgLy8gbUN1cnJlbnRSZWFkQml0IHN0b3JlcyB0aGUgYml0IGZvciB0aGUgY3VycmVudCByZWFkIGJ1ZmZlci4gVGhpcyBiaXQKKyAgICAvLyBmbGlwcyBlYWNoIHRpbWUgYSBuZXcgYnVmZmVyIGlzIHJlYWQgZnJvbSB0aGUgc291cmNlLgorICAgIC8vIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQgc3RvcmVzIHRoZSBiaXQgZm9yIHRoZSBuZXh0IGRlc2lyZWQgcmVhZCBidWZmZXIKKyAgICAvLyBmb3IgZWFjaCBjbGllbnQuIFRoaXMgYml0IGZsaXBzIGVhY2ggdGltZSByZWFkKCkgaXMgY29tcGxldGVkIGZvciB0aGlzCisgICAgLy8gY2xpZW50LgorICAgIGJvb2wgbUN1cnJlbnRSZWFkQml0OworICAgIFZlY3Rvcjxib29sPiBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0OworCisgICAgLy8gTnVtYmVyIG9mIGNsaWVudHMgd2hvc2UgY3VycmVudCByZWFkIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICBpbnQzMl90IG1OdW1iZXJPZkN1cnJlbnRSZWFkczsKKworICAgIC8vIEJvb2xlYW4gdGVsbGluZyB3aGV0aGVyIHRoZSBsYXN0IHJlYWQgaGFzIGJlZW4gY29tcGxldGVkIGZvciBhbGwgY2xpZW50cy4KKyAgICAvLyBUaGUgdmFyaWFibGUgaXMgcmVzZXQgdG8gZmFsc2UgZWFjaCB0aW1lIGJ1ZmZlciBpcyByZWFkIGZyb20gdGhlIHJlYWwKKyAgICAvLyBzb3VyY2UuCisgICAgYm9vbCBtTGFzdFJlYWRDb21wbGV0ZWQ7CisKKyAgICAvLyBBIGdsb2JhbCBtdXRleCBmb3IgYWNjZXNzIHRvIGNyaXRpY2FsIHNlY3Rpb25zLgorICAgIE11dGV4IG1Mb2NrOworCisgICAgLy8gQ29uZGl0aW9uIHZhcmlhYmxlIGZvciB3YWl0aW5nIG9uIHJlYWQgZnJvbSBzb3VyY2UgdG8gY29tcGxldGUuCisgICAgQ29uZGl0aW9uIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbjsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBmb3Igd2FpdGluZyBvbiBhbGwgY2xpZW50J3MgbGFzdCByZWFkIHRvIGNvbXBsZXRlLgorICAgIENvbmRpdGlvbiBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbjsKKworICAgIC8vIEZ1bmN0aW9ucyB1c2VkIGJ5IENsaWVudCB0byBpbXBsZW1lbnQgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZS4KKworICAgIC8vIElmIHRoZSByZWFsIHNvdXJjZSBoYXMgbm90IGJlZW4gc3RhcnRlZCB5ZXQgYnkgYW55IGNsaWVudCwgc3RhcnRzIGl0LgorICAgIHN0YXR1c190IHN0YXJ0KGludCBjbGllbnRJZCwgTWV0YURhdGEgKnBhcmFtcyk7CisKKyAgICAvLyBTdG9wcyB0aGUgcmVhbCBzb3VyY2UgYWZ0ZXIgYWxsIGNsaWVudHMgaGF2ZSBjYWxsZWQgc3RvcCgpLgorICAgIHN0YXR1c190IHN0b3AoaW50IGNsaWVudElkKTsKKworICAgIC8vIHJldHVybnMgdGhlIHJlYWwgc291cmNlJ3MgZ2V0Rm9ybWF0KCkuCisgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdChpbnQgY2xpZW50SWQpOworCisgICAgLy8gSWYgdGhlIGNsaWVudCdzIGRlc2lyZWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvCisgICAgLy8gbUxhc3RSZWFkTWVkaWFCdWZmZXIsIHBvaW50cyB0aGUgYnVmZmVyIHRvIHRoYXQuIE90aGVyd2lzZSBpZiBpdCBpcyB0aGUKKyAgICAvLyBtYXN0ZXIgY2xpZW50LCByZWFkcyB0aGUgYnVmZmVyIGZyb20gc291cmNlIG9yIGVsc2Ugd2FpdHMgZm9yIHRoZSBtYXN0ZXIKKyAgICAvLyBjbGllbnQgdG8gcmVhZCB0aGUgYnVmZmVyIGFuZCB1c2VzIHRoYXQuCisgICAgc3RhdHVzX3QgcmVhZChpbnQgY2xpZW50SWQsCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICAvLyBOb3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93LgorICAgIHN0YXR1c190IHBhdXNlKGludCBjbGllbnRJZCk7CisKKyAgICAvLyBGdW5jdGlvbiB3aGljaCByZWFkcyBhIGJ1ZmZlciBmcm9tIHRoZSByZWFsIHNvdXJjZSBpbnRvCisgICAgLy8gbUxhc3RSZWFkTWVkaWFCdWZmZXIKKyAgICB2b2lkIHJlYWRGcm9tU291cmNlX2xvY2soY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKTsKKworICAgIC8vIFdhaXRzIHVudGlsIHJlYWQgZnJvbSB0aGUgcmVhbCBzb3VyY2UgaGFzIGJlZW4gY29tcGxldGVkLgorICAgIC8vIF9sb2NrIG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdGhyZWFkIGhhcyBhbHJlYWR5CisgICAgLy8gb2J0YWluZWQgdGhlIGxvY2sgZm9yIHRoZSBtdXRleCBtTG9jay4KKyAgICB2b2lkIHdhaXRGb3JSZWFkRnJvbVNvdXJjZV9sb2NrKGludDMyX3QgY2xpZW50SWQpOworCisgICAgLy8gV2FpdHMgdW50aWwgYWxsIGNsaWVudHMgaGF2ZSByZWFkIHRoZSBjdXJyZW50IGJ1ZmZlciBpbgorICAgIC8vIG1MYXN0UmVhZENvbXBsZXRlZC4KKyAgICB2b2lkIHdhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhpbnQzMl90IGNsaWVudElkKTsKKworICAgIC8vIEVhY2ggY2xpZW50IGNhbGxzIHRoaXMgYWZ0ZXIgaXQgY29tcGxldGVzIGl0cyByZWFkKCkuIE9uY2UgYWxsIGNsaWVudHMKKyAgICAvLyBoYXZlIGNhbGxlZCB0aGlzIGZvciB0aGUgY3VycmVudCBidWZmZXIsIHRoZSBmdW5jdGlvbiBjYWxscworICAgIC8vIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLmJyb2FkY2FzdCgpIHRvIHNpZ25hbCB0aGUgd2FpdGluZyBjbGllbnRzLgorICAgIHZvaWQgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2soYm9vbCByZWFkQWJvcnRlZCk7CisKKyAgICAvLyBNYWtlIHRoZXNlIGNvbnN0cnVjdG9ycyBwcml2YXRlLgorICAgIE1lZGlhU291cmNlU3BsaXR0ZXIoKTsKKyAgICBNZWRpYVNvdXJjZVNwbGl0dGVyKGNvbnN0IE1lZGlhU291cmNlU3BsaXR0ZXIgJik7CisgICAgTWVkaWFTb3VyY2VTcGxpdHRlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU291cmNlU3BsaXR0ZXIgJik7CisKKyAgICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIE1lZGlhU291cmNlIGludGVyZmFjZS4gRWFjaCBjbGllbnQgc3RvcmVzIGEKKyAgICAvLyByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyIGFuZCB1c2VzIGl0IHRvIGNvbXBsZXRlIHRoZQorICAgIC8vIHZhcmlvdXMgY2FsbHMuCisgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIENvbnN0cnVjdG9yIHN0b3JlcyByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBNZWRpYVNvdXJjZVNwbGl0dGVyIGFuZCBpdAorICAgICAgICAvLyBjbGllbnQgaWQuCisgICAgICAgIENsaWVudChzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBzcGxpdHRlciwgaW50MzJfdCBjbGllbnRJZCk7CisKKyAgICAgICAgLy8gTWVkaWFTb3VyY2UgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBSZWZlcm5jZSB0byB0aGUgcGFyZW50IE1lZGlhU291cmNlU3BsaXR0ZXIKKyAgICAgICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gbVNwbGl0dGVyOworCisgICAgICAgIC8vIElkIG9mIHRoaXMgY2xpZW50LgorICAgICAgICBpbnQzMl90IG1DbGllbnRJZDsKKyAgICB9OworCisgICAgZnJpZW5kIGNsYXNzIENsaWVudDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX1NQTElUVEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9Tb3VyY2VEb3duU2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTkxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVmlkZW9Tb3VyY2VEb3duU2FtcGxlciBpbXBsZW1lbnRzIHRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UsCisvLyBkb3duc2FtcGxpbmcgZnJhbWVzIHByb3ZpZGVkIGZyb20gYSByZWFsIHZpZGVvIHNvdXJjZS4KKworI2lmbmRlZiBWSURFT19TT1VSQ0VfRE9XTl9TQU1QTEVSX0hfCisKKyNkZWZpbmUgVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWV0YURhdGE7CisKK2NsYXNzIFZpZGVvU291cmNlRG93blNhbXBsZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworcHVibGljOgorICAgIHZpcnR1YWwgflZpZGVvU291cmNlRG93blNhbXBsZXIoKTsKKworICAgIC8vIENvbnN0cnVjdG9yOgorICAgIC8vIHZpZGVvU291cmNlOiBUaGUgcmVhbCB2aWRlbyBzb3VyY2Ugd2hpY2ggcHJvdmlkZXMgdGhlIG9yaWdpbmFsIGZyYW1lcy4KKyAgICAvLyB3aWR0aCwgaGVpZ2h0OiBUaGUgZGVzaXJlZCB3aWR0aCwgaGVpZ2h0LiBUaGVzZSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgLy8gdG8gdGhvc2Ugb2YgdGhlIHJlYWwgdmlkZW8gc291cmNlLiBXZSB0aGVuIGRvd25zYW1wbGUgdGhlIG9yaWdpbmFsIGZyYW1lcyB0bworICAgIC8vIHRoaXMgc2l6ZS4KKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmdmlkZW9Tb3VyY2UsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIC8vIE1lZGlhU291cmNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCitwcml2YXRlOgorICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgcmVhbCB2aWRlbyBzb3VyY2UuCisgICAgc3A8TWVkaWFTb3VyY2U+IG1SZWFsVmlkZW9Tb3VyY2U7CisKKyAgICAvLyBTaXplIG9mIGZyYW1lcyB0byBiZSBwcm92aWRlZCBieSB0aGlzIHNvdXJjZS4KKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisKKyAgICAvLyBTaXplIG9mIGZyYW1lcyBwcm92aWRlZCBieSB0aGUgcmVhbCBzb3VyY2UuCisgICAgaW50MzJfdCBtUmVhbFNvdXJjZVdpZHRoOworICAgIGludDMyX3QgbVJlYWxTb3VyY2VIZWlnaHQ7CisKKyAgICAvLyBEb3duIHNhbXBsaW5nIHBhcmFtdGVycy4KKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlT2Zmc2V0WDsKKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlT2Zmc2V0WTsKKyAgICBpbnQzMl90IG1Eb3duU2FtcGxlU2tpcFg7CisgICAgaW50MzJfdCBtRG93blNhbXBsZVNraXBZOworCisgICAgLy8gVHJ1ZSBpZiB3ZSBuZWVkIHRvIGNyb3AgdGhlIHN0aWxsIHZpZGVvIGltYWdlIHRvIGdldCB0aGUgdmlkZW8gZnJhbWUuCisgICAgYm9vbCBtTmVlZERvd25TYW1wbGluZzsKKworICAgIC8vIE1ldGEgZGF0YS4gVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHJlYWwgc291cmNlIGV4Y2VwdCBmb3IgdGhlIHdpZHRoIGFuZAorICAgIC8vIGhlaWdodCBwYXJhbWV0ZXJzLgorICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKworICAgIC8vIENvbXB1dGVzIHRoZSBvZmZzZXQsIHNraXAgcGFyYW1ldGVycyBmb3IgZG93bnNhbXBsaW5nIHRoZSBvcmlnaW5hbCBmcmFtZQorICAgIC8vIHRvIHRoZSBkZXNpcmVkIHNpemUuCisgICAgdm9pZCBjb21wdXRlRG93blNhbXBsaW5nUGFyYW1ldGVycygpOworCisgICAgLy8gRG93bnNhbXBsZXMgdGhlIGZyYW1lIGluIHNvdXJjZUJ1ZmZlciB0byBzaXplIChtV2lkdGggeCBtSGVpZ2h0KS4gQSBuZXcKKyAgICAvLyBidWZmZXIgaXMgY3JlYXRlZCB3aGljaCBzdG9yZXMgdGhlIGRvd25zYW1wbGVkIGltYWdlLgorICAgIHZvaWQgZG93blNhbXBsZVlVVkltYWdlKGNvbnN0IE1lZGlhQnVmZmVyICZzb3VyY2VCdWZmZXIsIE1lZGlhQnVmZmVyICoqYnVmZmVyKSBjb25zdDsKKworICAgIC8vIERpc2FsbG93IHRoZXNlLgorICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIoY29uc3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmKTsKKyAgICBWaWRlb1NvdXJjZURvd25TYW1wbGVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlciAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fU09VUkNFX0RPV05fU0FNUExFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3MDkyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFlVVkNhbnZhcyBob2xkcyBhIHJlZmVyZW5jZSB0byBhIFlVVkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbyB2YXJpb3VzCisvLyBkcmF3aW5nIG9wZXJhdGlvbnMuIEl0IHByb3ZpZGVzIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGZpbGxpbmcsCisvLyBjcm9wcGluZywgZXRjLgorCisKKyNpZm5kZWYgWVVWX0NBTlZBU19IXworCisjZGVmaW5lIFlVVl9DQU5WQVNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFlVVkltYWdlOworY2xhc3MgUmVjdDsKKworY2xhc3MgWVVWQ2FudmFzIHsKK3B1YmxpYzoKKworICAgIC8vIENvbnN0cnVjdG9yIHRha2VzIGluIHJlZmVyZW5jZSB0byBhIHl1dkltYWdlIG9uIHdoaWNoIGl0IGNhbiBkbworICAgIC8vIHZhcmlvdXMgZHJhd2luZyBvcHJlYXRpb25zLgorICAgIFlVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpOworICAgIH5ZVVZDYW52YXMoKTsKKworICAgIC8vIEZpbGxzIHRoZSBlbnRpcmUgaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gWVVWIHZhbHVlcy4KKyAgICB2b2lkIEZpbGxZVVYodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBGaWxscyB0aGUgcmVjdGFuZ3VsYXIgcmVnaW9uIFtzdGFydFgsZW5kWF14W3N0YXJ0WSxlbmRZXSB3aXRoIHRoZSBnaXZlbiBZVVYgdmFsdWVzLgorICAgIHZvaWQgRmlsbFlVVlJlY3RhbmdsZShjb25zdCBSZWN0JiByZWN0LAorICAgICAgICAgICAgdWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSk7CisKKyAgICAvLyBDb3BpZXMgdGhlIHJlZ2lvbiBbc3RhcnRYLGVuZFhdeFtzdGFydFksZW5kWV0gZnJvbSBzcmNJbWFnZSBpbnRvIHRoZQorICAgIC8vIGNhbnZhcycgdGFyZ2V0IGltYWdlIChtWVVWSW1hZ2UpIHN0YXJ0aW5nIGF0CisgICAgLy8gKGRlc3RpbmF0aW9uU3RhcnRYLGRlc3RpbmF0aW9uU3RhcnRZKS4KKyAgICAvLyBOb3RlIHRoYXQgdW5kZWZpbmVkIGJlaGF2aW9yIG1heSBvY2N1ciBpZiBzcmNJbWFnZSBpcyBzYW1lIGFzIHRoZSBjYW52YXMnCisgICAgLy8gdGFyZ2V0IGltYWdlLgorICAgIHZvaWQgQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSk7CisKKyAgICAvLyBEb3duc2FtcGxlcyB0aGUgc3JjSW1hZ2UgaW50byB0aGUgY2FudmFzJyB0YXJnZXQgaW1hZ2UgKG1ZVVZJbWFnZSkKKyAgICAvLyBUaGUgZG93bnNhbXBsaW5nIGNvcGllcyBwaXhlbHMgZnJvbSB0aGUgc291cmNlIGltYWdlIHN0YXJ0aW5nIGF0CisgICAgLy8gKHNyY09mZnNldFgsIHNyY09mZnNldFkpIHRvIHRoZSB0YXJnZXQgaW1hZ2UsIHN0YXJ0aW5nIGF0ICgwLCAwKS4KKyAgICAvLyBGb3IgZWFjaCBYIGluY3JlbWVudCBpbiB0aGUgdGFyZ2V0IGltYWdlLCBza2lwWCBwaXhlbHMgYXJlIHNraXBwZWQKKyAgICAvLyBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIC8vIFNpbWlsYXJseSBmb3IgZWFjaCBZIGluY3JlbWVudCBpbiB0aGUgdGFyZ2V0IGltYWdlLCBza2lwWSBwaXhlbHMKKyAgICAvLyBhcmUgc2tpcHBlZCBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIHZvaWQgZG93bnNhbXBsZSgKKyAgICAgICAgICAgIGludDMyX3Qgc3JjT2Zmc2V0WCwgaW50MzJfdCBzcmNPZmZzZXRZLAorICAgICAgICAgICAgaW50MzJfdCBza2lwWCwgaW50MzJfdCBza2lwWSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSk7CisKK3ByaXZhdGU6CisgICAgWVVWSW1hZ2UmIG1ZVVZJbWFnZTsKKworICAgIFlVVkNhbnZhcyhjb25zdCBZVVZDYW52YXMgJik7CisgICAgWVVWQ2FudmFzICZvcGVyYXRvcj0oY29uc3QgWVVWQ2FudmFzICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBZVVZfQ0FOVkFTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5ODYxOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEEgY29udGFpbmVyIGNsYXNzIHRvIGhvbGQgWVVWIGRhdGEgYW5kIHByb3ZpZGUgdmFyaW91cyB1dGlsaXRpZXMsCisvLyBlLmcuIHRvIHNldC9nZXQgcGl4ZWwgdmFsdWVzLgorLy8gU3VwcG9ydGVkIGZvcm1hdHM6CisvLyAgLSBZVVY0MjAgUGxhbmFyCisvLyAgLSBZVVY0MjAgU2VtaSBQbGFuYXIKKy8vCisvLyAgQ3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdmFyaWFibGUgc3RyaWRlcy4KKy8vCisvLyAgSW1wbGVtZW50YXRpb246IFR3byBzaW1wbGUgYWJzdHJhY3Rpb25zIGFyZSBkb25lIHRvIHNpbXBsaWZ5IGFjY2VzcworLy8gIHRvIFlVViBjaGFubmVscyBmb3IgZGlmZmVyZW50IGZvcm1hdHM6CisvLyAgLSBpbml0aWFsaXplWVVWUG9pbnRlcnMoKSBzZXRzIHVwIHBvaW50ZXJzIChtWWRhdGEsIG1VZGF0YSwgbVZkYXRhKSB0bworLy8gIHBvaW50IHRvIHRoZSByaWdodCBzdGFydCBsb2NhdGlvbnMgb2YgdGhlIGRpZmZlcmVudCBjaGFubmVsIGRhdGEgZGVwZW5kaW5nCisvLyAgb24gdGhlIGZvcm1hdC4KKy8vICAtIGdldE9mZnNldHMoKSByZXR1cm5zIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhlIGRpZmZlcmVudCBjaGFubmVscworLy8gIGRlcGVuZGluZyBvbiB0aGUgZm9ybWF0LgorLy8gIExvY2F0aW9uIG9mIGFueSBwaXhlbCdzIFlVViBjaGFubmVscyBjYW4gdGhlbiBiZSBlYXNpbHkgY29tcHV0ZWQgdXNpbmcgdGhlc2UuCisvLworCisjaWZuZGVmIFlVVl9JTUFHRV9IXworCisjZGVmaW5lIFlVVl9JTUFHRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBSZWN0OworCitjbGFzcyBZVVZJbWFnZSB7CitwdWJsaWM6CisgICAgLy8gU3VwcG9ydGVkIFlVViBmb3JtYXRzCisgICAgZW51bSBZVVZGb3JtYXQgeworICAgICAgICBZVVY0MjBQbGFuYXIsCisgICAgICAgIFlVVjQyMFNlbWlQbGFuYXIKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0cyBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBmb3JtYXQuIEFsc28gYWxsb2NhdGVzIGFuZCBvd25zCisgICAgLy8gdGhlIHJlcXVpcmVkIG1lbW9yeS4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyBDb25zdHJ1Y3RzIGFuIGltYWdlIHdpdGggdGhlIGdpdmVuIHNpemUsIGZvcm1hdC4gVGhlIG1lbW9yeSBpcyBwcm92aWRlZAorICAgIC8vIGJ5IHRoZSBjYWxsZXIgYW5kIHdlIGRvbid0IG93biBpdC4KKyAgICBZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCAqYnVmZmVyKTsKKworICAgIC8vIERlc3RydWN0b3IgdG8gZGVsZXRlIHRoZSBtZW1vcnkgaWYgaXQgb3ducyBpdC4KKyAgICB+WVVWSW1hZ2UoKTsKKworICAgIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBzdG9yZSB0aGUgWVVWIGRhdGEgZm9yIHRoZSBnaXZlbgorICAgIC8vIGZvcm1hdCBhbmQgZ2VvbWV0cnkuIFVzZWZ1bCB3aGVuIHRoZSBjYWxsZXIgd2FudHMgdG8gYWxsb2NhdGUgdGhlIHJlcXVpc2l0ZQorICAgIC8vIG1lbW9yeS4KKyAgICBzdGF0aWMgc2l6ZV90IGJ1ZmZlclNpemUoWVVWRm9ybWF0IHl1dkZvcm1hdCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgaW50MzJfdCB3aWR0aCgpIGNvbnN0IHtyZXR1cm4gbVdpZHRoO30KKyAgICBpbnQzMl90IGhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUhlaWdodDt9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgcGl4ZWwgaXMgdGhlIHJhbmdlIFswLCB3aWR0aC0xXSB4IFswLCBoZWlnaHQtMV0KKyAgICAvLyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgdmFsaWRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3Q7CisKKyAgICAvLyBHZXQgdGhlIHBpeGVsIFlVViB2YWx1ZSBhdCBwaXhlbCAoeCx5KS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBnZXQgd2FzIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGdldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgICAgICB1aW50OF90ICp5UHRyLCB1aW50OF90ICp1UHRyLCB1aW50OF90ICp2UHRyKSBjb25zdDsKKworICAgIC8vIFNldCB0aGUgcGl4ZWwgWVVWIHZhbHVlIGF0IHBpeGVsICh4LHkpLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgcmFuZ2Ugb2YgeCBpcyBbMCwgd2lkdGgtMV0gYW5kIHRoZSByYW5nZSBvZiB5IGlzIFswLCBoZWlnaHQtMV0uCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHNldCB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgc2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpOworCisgICAgLy8gVXNlcyBtZW1jcHkgdG8gY29weSBhbiBlbnRpcmUgcm93IG9mIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSk7CisKKyAgICAvLyBVc2VzIG1lbWNweSB0byBjb3B5IGFuIGVudGlyZSByb3cgb2YgZGF0YQorICAgIHN0YXRpYyB2b2lkIGZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSk7CisKKyAgICAvLyBUcmllcyB0byB1c2UgbWVtY29weSB0byBjb3B5IGVudGlyZSByb3dzIG9mIGRhdGEuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBmYXN0IGNvcHkgaXMgbm90IHBvc3NpYmxlIGZvciB0aGUgcGFzc2VkIGltYWdlIGZvcm1hdHMuCisgICAgc3RhdGljIGJvb2wgZmFzdENvcHlSZWN0YW5nbGUoCisgICAgICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgICAgICBjb25zdCBZVVZJbWFnZSAmc3JjSW1hZ2UsIFlVVkltYWdlICZkZXN0SW1hZ2UpOworCisgICAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gWVVWIHZhbHVlIHRvIFJHQi4KKyAgICB2b2lkIHl1djJyZ2IodWludDhfdCB5VmFsdWUsIHVpbnQ4X3QgdVZhbHVlLCB1aW50OF90IHZWYWx1ZSwKKyAgICAgICAgdWludDhfdCAqciwgdWludDhfdCAqZywgdWludDhfdCAqYikgY29uc3Q7CisKKyAgICAvLyBXcml0ZSB0aGUgaW1hZ2UgdG8gYSBodW1hbiByZWFkYWJsZSBQUE0gZmlsZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd3JpdGUgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgd3JpdGVUb1BQTShjb25zdCBjaGFyICpmaWxlbmFtZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gWVVWIEZvcm1hdCBvZiB0aGUgaW1hZ2UuCisgICAgWVVWRm9ybWF0IG1ZVVZGb3JtYXQ7CisKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgIHVpbnQ4X3QgKm1CdWZmZXI7CisKKyAgICAvLyBCb29sZWFuIHRlbGxpbmcgd2hldGhlciB3ZSBvd24gdGhlIG1lbW9yeSBidWZmZXIuCisgICAgYm9vbCBtT3duQnVmZmVyOworCisgICAgLy8gUG9pbnRlciB0byBzdGFydCBvZiB0aGUgWSBkYXRhIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1ZZGF0YTsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFUgZGF0YSBwbGFuZS4gTm90ZSB0aGF0IGluIGNhc2Ugb2YgaW50ZXJsZWF2ZWQgZm9ybWF0cyBsaWtlCisgICAgLy8gWVVWNDIwIHNlbWlwbGFuYXIsIG1VZGF0YSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBVIGRhdGEgaW4gdGhlIFVWIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1VZGF0YTsKKworICAgIC8vIFBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIFYgZGF0YSBwbGFuZS4gTm90ZSB0aGF0IGluIGNhc2Ugb2YgaW50ZXJsZWF2ZWQgZm9ybWF0cyBsaWtlCisgICAgLy8gWVVWNDIwIHNlbWlwbGFuYXIsIG1WZGF0YSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBWIGRhdGEgaW4gdGhlIFVWIHBsYW5lLgorICAgIHVpbnQ4X3QgKm1WZGF0YTsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIG1ZZGF0YSwgbVVkYXRhLCBtVmRhdGEgdG8gcG9pbnQgdG8gdGhlIHJpZ2h0IGxvY2F0aW9ucyBmb3IKKyAgICAvLyB0aGUgZ2l2ZW4gZm9ybWF0IGFuZCBnZW9tZXRyeS4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgaW5pdGlhbGl6ZSB3YXMgc3VjY2VzZnVsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKKworICAgIC8vIEZvciB0aGUgZ2l2ZW4gcGl4ZWwgbG9jYXRpb24sIHRoaXMgcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiBvZiB5LCB1IGFuZCB2CisgICAgLy8gZGF0YSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgcG9pbnRlcnMgLS0gbVlkYXRhLCBtVWRhdGEsIG1WZGF0YS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBnZXR0aW5nIG9mZnNldHMgd2FzIHN1Y2Nlc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgZ2V0T2Zmc2V0cyhpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgaW50MzJfdCAqeU9mZnNldCwgaW50MzJfdCAqdU9mZnNldCwgaW50MzJfdCAqdk9mZnNldCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZyBmcm9tIG9uZSBkYXRhIHJvdyB0byB0aGUgbmV4dCBkYXRhIHJvdworICAgIC8vIGZvciB0aGUgWVVWIGNoYW5uZWxzLiBOb3RlIHRoYXQgdGhpcyBjb3JyZXNwb25kcyB0byBkYXRhIHJvd3MgYW5kIG5vdCBwaXhlbCByb3dzLgorICAgIC8vIEUuZy4gZGVwZW5kaW5nIG9uIGZvcm1hdHMsIFUvViBjaGFubmVscyBtYXkgaGF2ZSBvbmx5IG9uZSBkYXRhIHJvdyBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gdHdvIHBpeGVsIHJvd3MuCisgICAgYm9vbCBnZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgaW50MzJfdCAqeURhdGFPZmZzZXRJbmNyZW1lbnQsCisgICAgICAgIGludDMyX3QgKnVEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp2RGF0YU9mZnNldEluY3JlbWVudCkgY29uc3Q7CisKKyAgICAvLyBHaXZlbiB0aGUgb2Zmc2V0IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsJ3MgZGF0YS4KKyAgICB1aW50OF90KiBnZXRZQWRkcmVzcyhpbnQzMl90IG9mZnNldCkgY29uc3Q7CisgICAgdWludDhfdCogZ2V0VUFkZHJlc3MoaW50MzJfdCBvZmZzZXQpIGNvbnN0OworICAgIHVpbnQ4X3QqIGdldFZBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKworICAgIC8vIEdpdmVuIHRoZSBwaXhlbCBsb2NhdGlvbiwgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsJ3MgZGF0YS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHJhbmdlIG9mIHggaXMgWzAsIHdpZHRoLTFdIGFuZCB0aGUgcmFuZ2Ugb2YgeSBpcyBbMCwgaGVpZ2h0LTFdLgorICAgIGJvb2wgZ2V0WVVWQWRkcmVzc2VzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90ICoqeUFkZHIsIHVpbnQ4X3QgKip1QWRkciwgdWludDhfdCAqKnZBZGRyKSBjb25zdDsKKworICAgIC8vIERpc2FsbG93IGltcGxpY2l0IGNhc3RpbmcgYW5kIGNvcHlpbmcuCisgICAgWVVWSW1hZ2UoY29uc3QgWVVWSW1hZ2UgJik7CisgICAgWVVWSW1hZ2UgJm9wZXJhdG9yPShjb25zdCBZVVZJbWFnZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gWVVWX0lNQUdFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaCBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCmluZGV4IDdjNWEzOWIuLmEyMTA4ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCisrKyBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCkBAIC05NCw3ICs5NCw3IEBACiAgICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKIAogICAgIC8vIGNhbWVyYSBhbmQgY2FtY29yZGVyIG5lZWQgYWNjZXNzIHRvIHRoZSBJU3VyZmFjZSBiaW5kZXIgaW50ZXJmYWNlIGZvciBwcmV2aWV3Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYTsKKyAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFSZWNvcmRlcjsKICAgICAvLyBtZWRpYXBsYXllciBuZWVkcyBhY2Nlc3MgdG8gSVN1cmZhY2UgZm9yIGRpc3BsYXkKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXI7CkBAIC0xNzMsMTEgKzE3MywxMiBAQAogICAgICAqIChldmVudHVhbGx5IHRoaXMgc2hvdWxkIGdvIGF3YXkgYW5kIGJlIHJlcGxhY2VkIGJ5IHByb3BlciBBUElzKQogICAgICAqLwogICAgIC8vIGNhbWVyYSBhbmQgY2FtY29yZGVyIG5lZWQgYWNjZXNzIHRvIHRoZSBJU3VyZmFjZSBiaW5kZXIgaW50ZXJmYWNlIGZvciBwcmV2aWV3Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYTsKKyAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU2VydmljZTsKICAgICBmcmllbmQgY2xhc3MgTWVkaWFSZWNvcmRlcjsKICAgICAvLyBNZWRpYVBsYXllciBuZWVkcyBhY2Nlc3MgdG8gSVN1cmZhY2UgZm9yIGRpc3BsYXkKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXI7CiAgICAgZnJpZW5kIGNsYXNzIElPTVg7CisgICAgZnJpZW5kIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CiAgICAgLy8gdGhpcyBpcyBqdXN0IHRvIGJlIGFibGUgdG8gd3JpdGUgc29tZSB1bml0IHRlc3RzCiAgICAgZnJpZW5kIGNsYXNzIFRlc3Q7CiAKQEAgLTMxMiw0ICszMTMsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfU0ZfU1VSRkFDRV9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmggYi9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oCmluZGV4IDNiOTc1YjQuLmUxZWU4ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKKysrIGIvaW5jbHVkZS91dGlscy9TaW5nbGV0b24uaApAQCAtMzcsNiArMzcsMTEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKmluc3RhbmNlOwogICAgIH0KKworICAgIHN0YXRpYyBib29sIGhhc0luc3RhbmNlKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOworICAgICAgICByZXR1cm4gc0luc3RhbmNlICE9IDA7CisgICAgfQogICAgIAogcHJvdGVjdGVkOgogICAgIH5TaW5nbGV0b24oKSB7IH07CmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawppbmRleCAxM2RjNTAwLi5mOWQ5ZjI1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyBiL2xpYnMvYmluZGVyL0FuZHJvaWQubWsKQEAgLTE2LDYgKzE2LDcgQEAKIHNvdXJjZXMgOj0gXAogICAgIEJpbmRlci5jcHAgXAogICAgIEJwQmluZGVyLmNwcCBcCisgICAgQ3Vyc29yV2luZG93LmNwcCBcCiAgICAgSUludGVyZmFjZS5jcHAgXAogICAgIElNZW1vcnkuY3BwIFwKICAgICBJUENUaHJlYWRTdGF0ZS5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvQ3Vyc29yV2luZG93LmNwcCBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYmluZGVyL0N1cnNvcldpbmRvdy5jcHAKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQ3Vyc29yV2luZG93IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0N1cnNvcldpbmRvdy5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDdXJzb3JXaW5kb3c6OkN1cnNvcldpbmRvdyhzaXplX3QgbWF4U2l6ZSkgOgorICAgIG1NYXhTaXplKG1heFNpemUpCit7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93OjpzZXRNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSkKK3sKKyAgICBtTWVtb3J5ID0gbWVtb3J5OworICAgIG1EYXRhID0gKHVpbnQ4X3QgKikgbWVtb3J5LT5wb2ludGVyKCk7CisgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGVhZGVyID0gKHdpbmRvd19oZWFkZXJfdCAqKSBtRGF0YTsKKworICAgIC8vIE1ha2UgdGhlIHdpbmRvdyByZWFkLW9ubHkKKyAgICBzc2l6ZV90IHNpemUgPSBtZW1vcnktPnNpemUoKTsKKyAgICBtU2l6ZSA9IHNpemU7CisgICAgbU1heFNpemUgPSBzaXplOworICAgIG1GcmVlT2Zmc2V0ID0gc2l6ZTsKK0xPR19XSU5ET1coIkNyZWF0ZWQgQ3Vyc29yV2luZG93IGZyb20gZXhpc3RpbmcgSU1lbW9yeTogbUZyZWVPZmZzZXQgPSAlZCwgbnVtUm93cyA9ICVkLCBudW1Db2x1bW5zID0gJWQsIG1TaXplID0gJWQsIG1NYXhTaXplID0gJWQsIG1EYXRhID0gJXAiLCBtRnJlZU9mZnNldCwgbUhlYWRlci0+bnVtUm93cywgbUhlYWRlci0+bnVtQ29sdW1ucywgbVNpemUsIG1NYXhTaXplLCBtRGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Vyc29yV2luZG93Ojppbml0QnVmZmVyKGJvb2wgbG9jYWxPbmx5KQoreworICAgIC8vVE9ETyBVc2UgYSBub24tbWVtb3J5IGRlYWxlciBtbWFwIHJlZ2lvbiBmb3IgbG9jYWxPbmx5CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcDsKKyAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1NYXhTaXplLCAwLCAiQ3Vyc29yV2luZG93Iik7CisgICAgaWYgKGhlYXAgIT0gTlVMTCkgeworICAgICAgICBtTWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgbU1heFNpemUpOworICAgICAgICBpZiAobU1lbW9yeSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopIG1NZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgICAgIGlmIChtRGF0YSkgeworICAgICAgICAgICAgICAgIG1IZWFkZXIgPSAod2luZG93X2hlYWRlcl90ICopIG1EYXRhOworICAgICAgICAgICAgICAgIG1TaXplID0gbU1heFNpemU7CisKKyAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIHdpbmRvdyBpbnRvIGEgY2xlYW4gc3RhdGUKKyAgICAgICAgICAgICAgICBjbGVhcigpOworICAgICAgICAgICAgTE9HX1dJTkRPVygiQ3JlYXRlZCBDdXJzb3JXaW5kb3cgd2l0aCBuZXcgTWVtb3J5RGVhbGVyOiBtRnJlZU9mZnNldCA9ICVkLCBtU2l6ZSA9ICVkLCBtTWF4U2l6ZSA9ICVkLCBtRGF0YSA9ICVwIiwgbUZyZWVPZmZzZXQsIG1TaXplLCBtTWF4U2l6ZSwgbURhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgTE9HRSgiQ3Vyc29yV2luZG93IGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBjcmVhdGUgdGhlIEN1cnNvcldpbmRvdyBoZWFwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0N1cnNvcldpbmRvdzo6fkN1cnNvcldpbmRvdygpCit7CisgICAgLy8gRXZlcnl0aGluZyB0aGF0IG1hdHRlcnMgaXMgYSBzbWFydCBwb2ludGVyCit9CisKK3ZvaWQgQ3Vyc29yV2luZG93OjpjbGVhcigpCit7CisgICAgbUhlYWRlci0+bnVtUm93cyA9IDA7CisgICAgbUhlYWRlci0+bnVtQ29sdW1ucyA9IDA7CisgICAgbUZyZWVPZmZzZXQgPSBzaXplb2Yod2luZG93X2hlYWRlcl90KSArIFJPV19TTE9UX0NIVU5LX1NJWkU7CisgICAgLy8gTWFyayB0aGUgZmlyc3QgY2h1bmsncyBuZXh0ICdwb2ludGVyJyBhcyBudWxsCisgICAgKigodWludDMyX3QgKikobURhdGEgKyBtRnJlZU9mZnNldCAtIHNpemVvZih1aW50MzJfdCkpKSA9IDA7Cit9CisKK2ludDMyX3QgQ3Vyc29yV2luZG93OjpmcmVlU3BhY2UoKQoreworICAgIGludDMyX3QgZnJlZVNwYWNlID0gbVNpemUgLSBtRnJlZU9mZnNldDsKKyAgICBpZiAoZnJlZVNwYWNlIDwgMCkgeworICAgICAgICBmcmVlU3BhY2UgPSAwOworICAgIH0KKyAgICByZXR1cm4gZnJlZVNwYWNlOworfQorCitmaWVsZF9zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmFsbG9jUm93KCkKK3sKKyAgICAvLyBGaWxsIGluIHRoZSByb3cgc2xvdAorICAgIHJvd19zbG90X3QgKiByb3dTbG90ID0gYWxsb2NSb3dTbG90KCk7CisgICAgaWYgKHJvd1Nsb3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgc2xvdHMgZm9yIHRoZSBmaWVsZCBkaXJlY3RvcnkKKyAgICBzaXplX3QgZmllbGREaXJTaXplID0gbUhlYWRlci0+bnVtQ29sdW1ucyAqIHNpemVvZihmaWVsZF9zbG90X3QpOworICAgIHVpbnQzMl90IGZpZWxkRGlyT2Zmc2V0ID0gYWxsb2MoZmllbGREaXJTaXplKTsKKyAgICBpZiAoIWZpZWxkRGlyT2Zmc2V0KSB7CisgICAgICAgIG1IZWFkZXItPm51bVJvd3MtLTsKKyAgICAgICAgTE9HRSgiVGhlIHJvdyBmYWlsZWQsIHNvIGJhY2sgb3V0IHRoZSBuZXcgcm93IGFjY291bnRpbmcgZnJvbSBhbGxvY1Jvd1Nsb3QgJWQiLCBtSGVhZGVyLT5udW1Sb3dzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKGZpZWxkRGlyT2Zmc2V0KTsKKyAgICBtZW1zZXQoZmllbGREaXIsIDB4MCwgZmllbGREaXJTaXplKTsKKworTE9HX1dJTkRPVygiQWxsb2NhdGVkIHJvdyAldSwgcm93U2xvdCBpcyBhdCBvZmZzZXQgJXUsIGZpZWxkRGlyIGlzICVkIGJ5dGVzIGF0IG9mZnNldCAldVxuIiwgKG1IZWFkZXItPm51bVJvd3MgLSAxKSwgKCh1aW50OF90ICopcm93U2xvdCkgLSBtRGF0YSwgZmllbGREaXJTaXplLCBmaWVsZERpck9mZnNldCk7CisgICAgcm93U2xvdC0+b2Zmc2V0ID0gZmllbGREaXJPZmZzZXQ7CisKKyAgICByZXR1cm4gZmllbGREaXI7Cit9CisKK3VpbnQzMl90IEN1cnNvcldpbmRvdzo6YWxsb2Moc2l6ZV90IHJlcXVlc3RlZFNpemUsIGJvb2wgYWxpZ25lZCkKK3sKKyAgICBpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgcGFkZGluZzsKKyAgICBpZiAoYWxpZ25lZCkgeworICAgICAgICAvLyA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIHBhZGRpbmcgPSA0IC0gKG1GcmVlT2Zmc2V0ICYgMHgzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWRkaW5nID0gMDsKKyAgICB9CisKKyAgICBzaXplID0gcmVxdWVzdGVkU2l6ZSArIHBhZGRpbmc7CisKKyAgICBpZiAoc2l6ZSA+IGZyZWVTcGFjZSgpKSB7CisgICAgICAgIExPR0UoIm5lZWQgdG8gZ3JvdzogbVNpemUgPSAlZCwgc2l6ZSA9ICVkLCBmcmVlU3BhY2UoKSA9ICVkLCBudW1Sb3dzID0gJWQiLCBtU2l6ZSwgc2l6ZSwgZnJlZVNwYWNlKCksIG1IZWFkZXItPm51bVJvd3MpOworICAgICAgICAvLyBPbmx5IGdyb3cgdGhlIHdpbmRvdyBpZiB0aGUgZmlyc3Qgcm93IGRvZXNuJ3QgZml0CisgICAgICAgIGlmIChtSGVhZGVyLT5udW1Sb3dzID4gMSkgeworTE9HRSgibm90IGdyb3dpbmcgc2luY2UgdGhlcmUgYXJlIGFscmVhZHkgJWQgcm93KHMpLCBtYXggc2l6ZSAlZCIsIG1IZWFkZXItPm51bVJvd3MsIG1NYXhTaXplKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBhIG5ldyBzaXplIHRoYXQgd2lsbCBmaXQgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgaW50IGFsbG9jYXRlZCA9IG1TaXplIC0gZnJlZVNwYWNlKCk7CisgICAgICAgIGludCBuZXdTaXplID0gbVNpemUgKyBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICB3aGlsZSAoc2l6ZSA+IChuZXdTaXplIC0gYWxsb2NhdGVkKSkgeworICAgICAgICAgICAgbmV3U2l6ZSArPSBXSU5ET1dfQUxMT0NBVElPTl9TSVpFOworICAgICAgICAgICAgaWYgKG5ld1NpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gZ3JvdyB3aW5kb3cgYmV5b25kIG1heCBzaXplICglZCkiLCBtTWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK0xPR19XSU5ET1coImZvdW5kIHNpemUgJWQiLCBuZXdTaXplKTsKKyAgICAgICAgbVNpemUgPSBuZXdTaXplOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldCA9IG1GcmVlT2Zmc2V0ICsgcGFkZGluZzsKKyAgICBtRnJlZU9mZnNldCArPSBzaXplOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3Jvd19zbG90X3QgKiBDdXJzb3JXaW5kb3c6OmdldFJvd1Nsb3QoaW50IHJvdykKK3sKKyAgICBMT0dfV0lORE9XKCJlbnRlciBnZXRSb3dTbG90IGN1cnJlbnQgcm93IG51bSAlZCwgdGhpcyByb3cgJWQiLCBtSGVhZGVyLT5udW1Sb3dzLCByb3cpOworICAgIGludCBjaHVua051bSA9IHJvdyAvIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1BvcyA9IHJvdyAlIFJPV19TTE9UX0NIVU5LX05VTV9ST1dTOworICAgIGludCBjaHVua1B0ck9mZnNldCA9IHNpemVvZih3aW5kb3dfaGVhZGVyX3QpICsgUk9XX1NMT1RfQ0hVTktfU0laRSAtIHNpemVvZih1aW50MzJfdCk7CisgICAgdWludDhfdCAqIHJvd0NodW5rID0gbURhdGEgKyBzaXplb2Yod2luZG93X2hlYWRlcl90KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cigqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkpOworICAgICAgICBjaHVua1B0ck9mZnNldCA9IHJvd0NodW5rIC0gbURhdGEgKyAoUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1MgKiBzaXplb2Yocm93X3Nsb3RfdCkpOworICAgIH0KKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKKyAgICBMT0dfV0lORE9XKCJleGl0IGdldFJvd1Nsb3QgY3VycmVudCByb3cgbnVtICVkLCB0aGlzIHJvdyAlZCIsIG1IZWFkZXItPm51bVJvd3MsIHJvdyk7ICAgIAorfQorCityb3dfc2xvdF90ICogQ3Vyc29yV2luZG93OjphbGxvY1Jvd1Nsb3QoKQoreworICAgIGludCBjaHVua051bSA9IG1IZWFkZXItPm51bVJvd3MgLyBST1dfU0xPVF9DSFVOS19OVU1fUk9XUzsKKyAgICBpbnQgY2h1bmtQb3MgPSBtSGVhZGVyLT5udW1Sb3dzICUgUk9XX1NMT1RfQ0hVTktfTlVNX1JPV1M7CisgICAgaW50IGNodW5rUHRyT2Zmc2V0ID0gc2l6ZW9mKHdpbmRvd19oZWFkZXJfdCkgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50OF90ICogcm93Q2h1bmsgPSBtRGF0YSArIHNpemVvZih3aW5kb3dfaGVhZGVyX3QpOworTE9HX1dJTkRPVygiQWxsb2NhdGluZyByb3cgc2xvdCwgbUhlYWRlci0+bnVtUm93cyBpcyAlZCwgY2h1bmtOdW0gaXMgJWQsIGNodW5rUG9zIGlzICVkIiwgbUhlYWRlci0+bnVtUm93cywgY2h1bmtOdW0sIGNodW5rUG9zKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNodW5rTnVtOyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgbmV4dENodW5rT2Zmc2V0ID0gKigodWludDMyX3QgKikobURhdGEgKyBjaHVua1B0ck9mZnNldCkpOworTE9HX1dJTkRPVygibmV4dENodW5rT2Zmc2V0IGlzICVkIiwgbmV4dENodW5rT2Zmc2V0KTsKKyAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyByb3cgY2h1bmsKKyAgICAgICAgICAgIG5leHRDaHVua09mZnNldCA9IGFsbG9jKFJPV19TTE9UX0NIVU5LX1NJWkUsIHRydWUpOworICAgICAgICAgICAgaWYgKG5leHRDaHVua09mZnNldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dDaHVuayA9IG9mZnNldFRvUHRyKG5leHRDaHVua09mZnNldCk7CitMT0dfV0lORE9XKCJhbGxvY2F0ZWQgbmV3IGNodW5rIGF0ICVkLCByb3dDaHVuayA9ICVwIiwgbmV4dENodW5rT2Zmc2V0LCByb3dDaHVuayk7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShtRGF0YSArIGNodW5rUHRyT2Zmc2V0KSkgPSByb3dDaHVuayAtIG1EYXRhOworICAgICAgICAgICAgLy8gTWFyayB0aGUgbmV3IGNodW5rJ3MgbmV4dCAncG9pbnRlcicgYXMgbnVsbAorICAgICAgICAgICAgKigodWludDMyX3QgKikocm93Q2h1bmsgKyBST1dfU0xPVF9DSFVOS19TSVpFIC0gc2l6ZW9mKHVpbnQzMl90KSkpID0gMDsKKyAgICAgICAgfSBlbHNlIHsKK0xPR19XSU5ET1coImZvbGx3aW5nICdwb2ludGVyJyB0byBuZXh0IGNodW5rLCBvZmZzZXQgb2YgbmV4dCBwb2ludGVyIGlzICVkIiwgY2h1bmtQdHJPZmZzZXQpOworICAgICAgICAgICAgcm93Q2h1bmsgPSBvZmZzZXRUb1B0cihuZXh0Q2h1bmtPZmZzZXQpOworICAgICAgICAgICAgY2h1bmtQdHJPZmZzZXQgPSByb3dDaHVuayAtIG1EYXRhICsgKFJPV19TTE9UX0NIVU5LX05VTV9ST1dTICogc2l6ZW9mKHJvd19zbG90X3QpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSGVhZGVyLT5udW1Sb3dzKys7CisKKyAgICByZXR1cm4gKHJvd19zbG90X3QgKikocm93Q2h1bmsgKyAoY2h1bmtQb3MgKiBzaXplb2Yocm93X3Nsb3RfdCkpKTsKK30KKworZmllbGRfc2xvdF90ICogQ3Vyc29yV2luZG93OjpnZXRGaWVsZFNsb3RXaXRoQ2hlY2soaW50IHJvdywgaW50IGNvbHVtbikKK3sKKyAgaWYgKHJvdyA8IDAgfHwgcm93ID49IG1IZWFkZXItPm51bVJvd3MgfHwgY29sdW1uIDwgMCB8fCBjb2x1bW4gPj0gbUhlYWRlci0+bnVtQ29sdW1ucykgeworICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0gICAgICAgIAorICByb3dfc2xvdF90ICogcm93U2xvdCA9IGdldFJvd1Nsb3Qocm93KTsKKyAgaWYgKCFyb3dTbG90KSB7CisgICAgICBMT0dFKCJGYWlsZWQgdG8gZmluZCByb3dTbG90IGZvciByb3cgJWQiLCByb3cpOworICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgTE9HRSgiSW52YWxpZCByb3dTbG90LCBvZmZzZXQgPSAlZCIsIHJvd1Nsb3QtPm9mZnNldCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfSAgCisgIGludCBmaWVsZERpck9mZnNldCA9IHJvd1Nsb3QtPm9mZnNldDsKKyAgcmV0dXJuICgoZmllbGRfc2xvdF90ICopb2Zmc2V0VG9QdHIoZmllbGREaXJPZmZzZXQpKSArIGNvbHVtbjsgIAorfQorCit1aW50MzJfdCBDdXJzb3JXaW5kb3c6OnJlYWRfZmllbGRfc2xvdChpbnQgcm93LCBpbnQgY29sdW1uLCBmaWVsZF9zbG90X3QgKiBzbG90T3V0KQoreworICAgIGlmIChyb3cgPCAwIHx8IHJvdyA+PSBtSGVhZGVyLT5udW1Sb3dzIHx8IGNvbHVtbiA8IDAgfHwgY29sdW1uID49IG1IZWFkZXItPm51bUNvbHVtbnMpIHsKKyAgICAgICAgTE9HRSgiQmFkIHJlcXVlc3QgZm9yIGZpZWxkIHNsb3QgJWQsJWQuIG51bVJvd3MgPSAlZCwgbnVtQ29sdW1ucyA9ICVkIiwgcm93LCBjb2x1bW4sIG1IZWFkZXItPm51bVJvd3MsIG1IZWFkZXItPm51bUNvbHVtbnMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSAgICAgICAgCisgICAgcm93X3Nsb3RfdCAqIHJvd1Nsb3QgPSBnZXRSb3dTbG90KHJvdyk7CisgICAgaWYgKCFyb3dTbG90KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBmaW5kIHJvd1Nsb3QgZm9yIHJvdyAlZCIsIHJvdyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJvd1Nsb3QtPm9mZnNldCA9PSAwIHx8IHJvd1Nsb3QtPm9mZnNldCA+PSBtU2l6ZSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHJvd1Nsb3QsIG9mZnNldCA9ICVkIiwgcm93U2xvdC0+b2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK0xPR19XSU5ET1coIkZvdW5kIGZpZWxkIGRpcmVjdG9yeSBmb3IgJWQsJWQgYXQgcm93U2xvdCAlZCwgb2Zmc2V0ICVkIiwgcm93LCBjb2x1bW4sICh1aW50OF90ICopcm93U2xvdCAtIG1EYXRhLCByb3dTbG90LT5vZmZzZXQpOworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkRGlyID0gKGZpZWxkX3Nsb3RfdCAqKW9mZnNldFRvUHRyKHJvd1Nsb3QtPm9mZnNldCk7CitMT0dfV0lORE9XKCJSZWFkIGZpZWxkX3Nsb3RfdCAlZCwlZDogb2Zmc2V0ID0gJWQsIHNpemUgPSAlZCwgdHlwZSA9ICVkIiwgcm93LCBjb2x1bW4sIGZpZWxkRGlyW2NvbHVtbl0uZGF0YS5idWZmZXIub2Zmc2V0LCBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLnNpemUsIGZpZWxkRGlyW2NvbHVtbl0udHlwZSk7CisKKyAgICAvLyBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXQgcGFyYW0KKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBmaWVsZERpcltjb2x1bW5dLmRhdGEuYnVmZmVyLm9mZnNldDsKKyAgICBzbG90T3V0LT5kYXRhLmJ1ZmZlci5zaXplID0gZmllbGREaXJbY29sdW1uXS5kYXRhLmJ1ZmZlci5zaXplOworICAgIHNsb3RPdXQtPnR5cGUgPSBmaWVsZERpcltjb2x1bW5dLnR5cGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5SW4odWludDMyX3Qgb2Zmc2V0LCB1aW50OF90IGNvbnN0ICogZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemUgPD0gbVNpemUpOyAgICAKKyAgICBtZW1jcHkobURhdGEgKyBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCit2b2lkIEN1cnNvcldpbmRvdzo6Y29weUluKHVpbnQzMl90IG9mZnNldCwgaW50NjRfdCBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoaW50NjRfdCkgPD0gbVNpemUpOworICAgIG1lbWNweShtRGF0YSArIG9mZnNldCwgKHVpbnQ4X3QgKikmZGF0YSwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBDdXJzb3JXaW5kb3c6OmNvcHlJbih1aW50MzJfdCBvZmZzZXQsIGRvdWJsZSBkYXRhKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplb2YoZG91YmxlKSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KG1EYXRhICsgb2Zmc2V0LCAodWludDhfdCAqKSZkYXRhLCBzaXplb2YoZG91YmxlKSk7Cit9CisKK3ZvaWQgQ3Vyc29yV2luZG93Ojpjb3B5T3V0KHVpbnQzMl90IG9mZnNldCwgdWludDhfdCAqIGRhdGEsIHNpemVfdCBzaXplKQoreworICAgIGFzc2VydChvZmZzZXQgKyBzaXplIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIHNpemUpOworfQorCitpbnQ2NF90IEN1cnNvcldpbmRvdzo6Y29weU91dExvbmcodWludDMyX3Qgb2Zmc2V0KQoreworICAgIGludDY0X3QgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihpbnQ2NF90KSA8PSBtU2l6ZSk7CisgICAgbWVtY3B5KCZ2YWx1ZSwgbURhdGEgKyBvZmZzZXQsIHNpemVvZihpbnQ2NF90KSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitkb3VibGUgQ3Vyc29yV2luZG93Ojpjb3B5T3V0RG91YmxlKHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBkb3VibGUgdmFsdWU7CisgICAgYXNzZXJ0KG9mZnNldCArIHNpemVvZihkb3VibGUpIDw9IG1TaXplKTsKKyAgICBtZW1jcHkoJnZhbHVlLCBtRGF0YSArIG9mZnNldCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OnB1dExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEubCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGludDY0X3QpOworI2VuZGlmCisgICAgZmllbGRTbG90LT50eXBlID0gRklFTERfVFlQRV9JTlRFR0VSOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0RG91YmxlKHVuc2lnbmVkIGludCByb3csIHVuc2lnbmVkIGludCBjb2wsIGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICBmaWVsZFNsb3QtPmRhdGEuZCA9IHZhbHVlOworI2Vsc2UKKyAgICBpbnQgb2Zmc2V0ID0gYWxsb2Moc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIW9mZnNldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29weUluKG9mZnNldCwgdmFsdWUpOworCisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisjZW5kaWYKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0ZMT0FUOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEN1cnNvcldpbmRvdzo6cHV0TnVsbCh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sKQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfTlVMTDsKKyAgICBmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCA9IDA7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldExvbmcodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgaW50NjRfdCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QgfHwgZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfSU5URUdFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorI2lmIFdJTkRPV19TVE9SQUdFX0lOTElORV9OVU1FUklDUworICAgICp2YWx1ZU91dCA9IGZpZWxkU2xvdC0+ZGF0YS5sOworI2Vsc2UKKyAgICAqdmFsdWVPdXQgPSBjb3B5T3V0TG9uZyhmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldERvdWJsZSh1bnNpZ25lZCBpbnQgcm93LCB1bnNpZ25lZCBpbnQgY29sLCBkb3VibGUgKiB2YWx1ZU91dCkKK3sKKyAgICBmaWVsZF9zbG90X3QgKiBmaWVsZFNsb3QgPSBnZXRGaWVsZFNsb3RXaXRoQ2hlY2socm93LCBjb2wpOworICAgIGlmICghZmllbGRTbG90IHx8IGZpZWxkU2xvdC0+dHlwZSAhPSBGSUVMRF9UWVBFX0ZMT0FUKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZiBXSU5ET1dfU1RPUkFHRV9JTkxJTkVfTlVNRVJJQ1MKKyAgICAqdmFsdWVPdXQgPSBmaWVsZFNsb3QtPmRhdGEuZDsKKyNlbHNlCisgICAgKnZhbHVlT3V0ID0gY29weU91dERvdWJsZShmaWVsZFNsb3QtPmRhdGEuYnVmZmVyLm9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdXJzb3JXaW5kb3c6OmdldE51bGwodW5zaWduZWQgaW50IHJvdywgdW5zaWduZWQgaW50IGNvbCwgYm9vbCAqIHZhbHVlT3V0KQoreworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IGdldEZpZWxkU2xvdFdpdGhDaGVjayhyb3csIGNvbCk7CisgICAgaWYgKCFmaWVsZFNsb3QpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpZiAoZmllbGRTbG90LT50eXBlICE9IEZJRUxEX1RZUEVfTlVMTCkgeworICAgICAgICAqdmFsdWVPdXQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqdmFsdWVPdXQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAgYi9saWJzL2NhbWVyYS9DYW1lcmEuY3BwCmluZGV4IDdlZmM2ZDcuLmI1Zjc4ZTggMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvbGlicy9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtMTY3LDMyICsxNjcsMjAgQEAKICAgICByZXR1cm4gYy0+dW5sb2NrKCk7CiB9CiAKLS8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQorLy8gcGFzcyB0aGUgYnVmZmVyZWQgU3VyZmFjZSB0byB0aGUgY2FtZXJhIHNlcnZpY2UKIHN0YXR1c190IENhbWVyYTo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7Ci0gICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkiKTsKKyAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSglcCkiLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcCA8SUNhbWVyYT4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgaWYgKHN1cmZhY2UgIT0gMCkgewotICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZS0+Z2V0SVN1cmZhY2UoKSk7CisgICAgICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dEKCJhcHAgcGFzc2VkIE5VTEwgc3VyZmFjZSIpOwogICAgICAgICByZXR1cm4gYy0+c2V0UHJldmlld0Rpc3BsYXkoMCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmE6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKLXsKLSAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwotICAgIGlmIChzdXJmYWNlID09IDApIHsKLSAgICAgICAgTE9HRCgiYXBwIHBhc3NlZCBOVUxMIHN1cmZhY2UiKTsKLSAgICB9Ci0gICAgc3AgPElDYW1lcmE+IGMgPSBtQ2FtZXJhOwotICAgIGlmIChjID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBjLT5zZXRQcmV2aWV3RGlzcGxheShzdXJmYWNlKTsKLX0KLQotCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYTo6c3RhcnRQcmV2aWV3KCkKIHsKQEAgLTM3NSw0ICszNjMsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL2NhbWVyYS9JQ2FtZXJhLmNwcCBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCmluZGV4IDEzNjczYjUuLjk0ZGM1YzEgMTAwNjQ0Ci0tLSBhL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCisrKyBiL2xpYnMvY2FtZXJhL0lDYW1lcmEuY3BwCkBAIC02NCwxMyArNjQsMTMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIFN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCisgICAgc3RhdHVzX3Qgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiAgICAgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3RGlzcGxheSIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX0RJU1BMQVksIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19ESVNQTEFZOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19ESVNQTEFZIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKGRhdGEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UHJldmlld0Rpc3BsYXkoc3VyZmFjZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzc2LDQgKzM3NiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9BbmRyb2lkLm1rIGIvbGlicy9od3VpL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2OTUwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgT25seSBidWlsZCBsaWJod3VpIHdoZW4gVVNFX09QRU5HTF9SRU5ERVJFUiBpcworIyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGRldmljZS9ib2FyZCBjb25maWd1cmF0aW9uCitpZmVxICgkKFVTRV9PUEVOR0xfUkVOREVSRVIpLHRydWUpCisJTE9DQUxfU1JDX0ZJTEVTOj0gXAorCQlGb250UmVuZGVyZXIuY3BwIFwKKwkJR2FtbWFGb250UmVuZGVyZXIuY3BwIFwKKwkJR3JhZGllbnRDYWNoZS5jcHAgXAorCQlMYXllckNhY2hlLmNwcCBcCisJCU1hdHJpeC5jcHAgXAorCQlPcGVuR0xSZW5kZXJlci5jcHAgXAorCQlQYXRjaC5jcHAgXAorCQlQYXRjaENhY2hlLmNwcCBcCisJCVBhdGhDYWNoZS5jcHAgXAorCQlQcm9ncmFtLmNwcCBcCisJCVByb2dyYW1DYWNoZS5jcHAgXAorCQlTa2lhQ29sb3JGaWx0ZXIuY3BwIFwKKwkJU2tpYVNoYWRlci5jcHAgXAorCQlUZXh0dXJlQ2FjaGUuY3BwIFwKKwkJVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKKwkKKwlMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwkJJChKTklfSF9JTkNMVURFKSBcCisJCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCisJCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKKwkJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKKwkJZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAorCQlleHRlcm5hbC9za2lhL2luY2x1ZGUvdXRpbHMKKworCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9PUEVOR0xfUkVOREVSRVIKKwlMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU0hBUkVEX0xJQlJBUklFUworCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkdMRVN2MiBsaWJza2lhCisJTE9DQUxfTU9EVUxFIDo9IGxpYmh3dWkKKwlMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisJCisJaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9DYWNoZXMuaCBiL2xpYnMvaHd1aS9DYWNoZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzY3ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0NhY2hlcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfQ0FDSEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9DQUNIRVNfSAorCisjaWZuZGVmIExPR19UQUcKKyAgICAjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorI2VuZGlmCisKKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KKworI2luY2x1ZGUgIlRleHR1cmVDYWNoZS5oIgorI2luY2x1ZGUgIkxheWVyQ2FjaGUuaCIKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUGF0Y2hDYWNoZS5oIgorI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisjaW5jbHVkZSAiVGV4dERyb3BTaGFkb3dDYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3N0cnVjdCBDYWNoZUxvZ2dlciB7CisgICAgQ2FjaGVMb2dnZXIoKSB7CisgICAgICAgIExPR0QoIkNyZWF0aW5nIGNhY2hlcyIpOworICAgIH0KK307IC8vIHN0cnVjdCBDYWNoZUxvZ2dlcgorCitjbGFzcyBDYWNoZXM6IHB1YmxpYyBTaW5nbGV0b248Q2FjaGVzPiB7CisgICAgQ2FjaGVzKCk6IFNpbmdsZXRvbjxDYWNoZXM+KCksIGJsZW5kKGZhbHNlKSwgbGFzdFNyY01vZGUoR0xfWkVSTyksCisgICAgICAgICAgICBsYXN0RHN0TW9kZShHTF9aRVJPKSwgY3VycmVudFByb2dyYW0oTlVMTCkgeworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248Q2FjaGVzPjsKKworICAgIENhY2hlTG9nZ2VyIGxvZ2dlcjsKKworcHVibGljOgorICAgIGJvb2wgYmxlbmQ7CisgICAgR0xlbnVtIGxhc3RTcmNNb2RlOworICAgIEdMZW51bSBsYXN0RHN0TW9kZTsKKyAgICBQcm9ncmFtKiBjdXJyZW50UHJvZ3JhbTsKKworICAgIFRleHR1cmVDYWNoZSB0ZXh0dXJlQ2FjaGU7CisgICAgTGF5ZXJDYWNoZSBsYXllckNhY2hlOworICAgIEdyYWRpZW50Q2FjaGUgZ3JhZGllbnRDYWNoZTsKKyAgICBQcm9ncmFtQ2FjaGUgcHJvZ3JhbUNhY2hlOworICAgIFBhdGhDYWNoZSBwYXRoQ2FjaGU7CisgICAgUGF0Y2hDYWNoZSBwYXRjaENhY2hlOworICAgIFRleHREcm9wU2hhZG93Q2FjaGUgZHJvcFNoYWRvd0NhY2hlOworICAgIEdhbW1hRm9udFJlbmRlcmVyIGZvbnRSZW5kZXJlcjsKK307IC8vIGNsYXNzIENhY2hlcworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorCisjaWZkZWYgVVNFX09QRU5HTF9SRU5ERVJFUgordXNpbmcgbmFtZXNwYWNlIHVpcmVuZGVyZXI7CitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQ2FjaGVzKTsKKyNlbmRpZgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9DQUNIRVNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0V4dGVuc2lvbnMuaCBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwZDM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9FeHRlbnNpb25zLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9FWFRFTlNJT05TX0gKKworI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfRVhURU5TSU9OUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfRVhURU5TSU9OUworICAgICNkZWZpbmUgRVhUX0xPR0QoLi4uKSBMT0dEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVYVF9MT0dEKC4uLikKKyNlbmRpZgorCitjbGFzcyBFeHRlbnNpb25zIHsKK3B1YmxpYzoKKyAgICBFeHRlbnNpb25zKCkgeworICAgICAgICBjb25zdCBjaGFyKiBidWZmZXIgPSAoY29uc3QgY2hhciopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOworICAgICAgICBjb25zdCBjaGFyKiBjdXJyZW50ID0gYnVmZmVyOworICAgICAgICBjb25zdCBjaGFyKiBoZWFkID0gY3VycmVudDsKKyAgICAgICAgRVhUX0xPR0QoIkF2YWlsYWJsZSBHTCBleHRlbnNpb25zOiIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBoZWFkID0gc3RyY2hyKGN1cnJlbnQsICcgJyk7CisgICAgICAgICAgICBTdHJpbmc4IHMoY3VycmVudCwgaGVhZCA/IGhlYWQgLSBjdXJyZW50IDogc3RybGVuKGN1cnJlbnQpKTsKKyAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgbUV4dGVuc2lvbkxpc3QuYWRkKHMpOworICAgICAgICAgICAgICAgIEVYVF9MT0dEKCIgICVzIiwgcy5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gaGVhZCArIDE7CisgICAgICAgIH0gd2hpbGUgKGhlYWQpOworCisgICAgICAgIG1IYXNOUG90ID0gaGFzRXh0ZW5zaW9uKCJHTF9PRVNfdGV4dHVyZV9ucG90Iik7CisgICAgICAgIG1IYXNEcmF3UGF0aCA9IGhhc0V4dGVuc2lvbigiR0xfTlZfZHJhd19wYXRoIik7CisgICAgICAgIG1IYXNDb3ZlcmFnZVNhbXBsZSA9IGhhc0V4dGVuc2lvbigiR0xfTlZfY292ZXJhZ2Vfc2FtcGxlIik7CisgICAgICAgIG1IYXNGcmFtZWJ1ZmZlckZldGNoID0gaGFzRXh0ZW5zaW9uKCJHTF9OVl9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2giKTsKKworICAgICAgICBtRXh0ZW5zaW9ucyA9IGJ1ZmZlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBoYXNOUG90KCkgY29uc3QgeyByZXR1cm4gbUhhc05Qb3Q7IH0KKyAgICBpbmxpbmUgYm9vbCBoYXNEcmF3UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNEcmF3UGF0aDsgfQorICAgIGlubGluZSBib29sIGhhc0NvdmVyYWdlU2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbUhhc0NvdmVyYWdlU2FtcGxlOyB9CisgICAgaW5saW5lIGJvb2wgaGFzRnJhbWVidWZmZXJGZXRjaCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGcmFtZWJ1ZmZlckZldGNoOyB9CisKKyAgICBib29sIGhhc0V4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBzKGV4dGVuc2lvbik7CisgICAgICAgIHJldHVybiBtRXh0ZW5zaW9uTGlzdC5pbmRleE9mKHMpID49IDA7CisgICAgfQorCisgICAgdm9pZCBkdW1wKCkgeworICAgICAgICBMT0dEKCJTdXBwb3J0ZWQgZXh0ZW5zaW9uczpcbiVzIiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbUV4dGVuc2lvbkxpc3Q7CisKKyAgICBjb25zdCBjaGFyKiBtRXh0ZW5zaW9uczsKKworICAgIGJvb2wgbUhhc05Qb3Q7CisgICAgYm9vbCBtSGFzRHJhd1BhdGg7CisgICAgYm9vbCBtSGFzQ292ZXJhZ2VTYW1wbGU7CisgICAgYm9vbCBtSGFzRnJhbWVidWZmZXJGZXRjaDsKK307IC8vIGNsYXNzIEV4dGVuc2lvbnMKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX0VYVEVOU0lPTlNfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNhZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAKQEAgLTAsMCArMSw4MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8U2tVdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZvbnRSZW5kZXJlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAorI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0ZvbnQ6OkZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgOgorICAgIG1TdGF0ZShzdGF0ZSksIG1Gb250SWQoZm9udElkKSwgbUZvbnRTaXplKGZvbnRTaXplKSB7Cit9CisKKworRm9udDo6fkZvbnQoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVN0YXRlLT5tQWN0aXZlRm9udHMuc2l6ZSgpOyBjdCsrKSB7CisgICAgICAgIGlmIChtU3RhdGUtPm1BY3RpdmVGb250c1tjdF0gPT0gdGhpcykgeworICAgICAgICAgICAgbVN0YXRlLT5tQWN0aXZlRm9udHMucmVtb3ZlQXQoY3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkrKykgeworICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOworICAgICAgICBkZWxldGUgZ2x5cGg7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpLT5tSXNWYWxpZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBGb250OjptZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIGludCB3aWR0aCA9IChpbnQpIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgaW50IGhlaWdodCA9IChpbnQpIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgaWYgKGJvdW5kcy0+Ym90dG9tID4gblBlblkpIHsKKyAgICAgICAgYm91bmRzLT5ib3R0b20gPSBuUGVuWTsKKyAgICB9CisgICAgaWYgKGJvdW5kcy0+bGVmdCA+IG5QZW5YKSB7CisgICAgICAgIGJvdW5kcy0+bGVmdCA9IG5QZW5YOworICAgIH0KKyAgICBpZiAoYm91bmRzLT5yaWdodCA8IG5QZW5YICsgd2lkdGgpIHsKKyAgICAgICAgYm91bmRzLT5yaWdodCA9IG5QZW5YICsgd2lkdGg7CisgICAgfQorICAgIGlmIChib3VuZHMtPnRvcCA8IG5QZW5ZICsgaGVpZ2h0KSB7CisgICAgICAgIGJvdW5kcy0+dG9wID0gblBlblkgKyBoZWlnaHQ7CisgICAgfQorfQorCit2b2lkIEZvbnQ6OmRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8qIGdseXBoLCBpbnQgeCwgaW50IHkpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgZmxvYXQgdTEgPSBnbHlwaC0+bUJpdG1hcE1pblU7CisgICAgZmxvYXQgdTIgPSBnbHlwaC0+bUJpdG1hcE1heFU7CisgICAgZmxvYXQgdjEgPSBnbHlwaC0+bUJpdG1hcE1pblY7CisgICAgZmxvYXQgdjIgPSBnbHlwaC0+bUJpdG1hcE1heFY7CisKKyAgICBpbnQgd2lkdGggPSAoaW50KSBnbHlwaC0+bUJpdG1hcFdpZHRoOworICAgIGludCBoZWlnaHQgPSAoaW50KSBnbHlwaC0+bUJpdG1hcEhlaWdodDsKKworICAgIG1TdGF0ZS0+YXBwZW5kTWVzaFF1YWQoblBlblgsIG5QZW5ZLCAwLCB1MSwgdjIsCisgICAgICAgICAgICBuUGVuWCArIHdpZHRoLCBuUGVuWSwgMCwgdTIsIHYyLAorICAgICAgICAgICAgblBlblggKyB3aWR0aCwgblBlblkgLSBoZWlnaHQsIDAsIHUyLCB2MSwKKyAgICAgICAgICAgIG5QZW5YLCBuUGVuWSAtIGhlaWdodCwgMCwgdTEsIHYxKTsKK30KKwordm9pZCBGb250OjpkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICB1aW50OF90KiBiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgKyBnbHlwaC0+bUJpdG1hcFRvcDsKKworICAgIHVpbnQzMl90IGVuZFggPSBnbHlwaC0+bVN0YXJ0WCArIGdseXBoLT5tQml0bWFwV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IGdseXBoLT5tU3RhcnRZICsgZ2x5cGgtPm1CaXRtYXBIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbVN0YXRlLT5nZXRDYWNoZVdpZHRoKCk7CisgICAgY29uc3QgdWludDhfdCogY2FjaGVCdWZmZXIgPSBtU3RhdGUtPmdldFRleHRUZXh0dXJlRGF0YSgpOworCisgICAgdWludDMyX3QgY2FjaGVYID0gMCwgY2FjaGVZID0gMDsKKyAgICBpbnQzMl90IGJYID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gZ2x5cGgtPm1TdGFydFgsIGJYID0gblBlblg7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gZ2x5cGgtPm1TdGFydFksIGJZID0gblBlblk7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICBpZiAoYlggPCAwIHx8IGJZIDwgMCB8fCBiWCA+PSAoaW50MzJfdCkgYml0bWFwVyB8fCBiWSA+PSAoaW50MzJfdCkgYml0bWFwSCkgeworICAgICAgICAgICAgICAgIExPR0UoIlNraXBwaW5nIGludmFsaWQgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgdGVtcENvbCA9IGNhY2hlQnVmZmVyW2NhY2hlWSAqIGNhY2hlV2lkdGggKyBjYWNoZVhdOworICAgICAgICAgICAgYml0bWFwW2JZICogYml0bWFwVyArIGJYXSA9IHRlbXBDb2w7CisgICAgICAgIH0KKyAgICB9CisKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpIHsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gTlVMTDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlZEdseXBocy5pbmRleE9mS2V5KHV0ZkNoYXIpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGNhY2hlZEdseXBoID0gbUNhY2hlZEdseXBocy52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWNoZWRHbHlwaCA9IGNhY2hlR2x5cGgocGFpbnQsIHV0ZkNoYXIpOworICAgIH0KKworICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPworICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CisgICAgfQorCisgICAgcmV0dXJuIGNhY2hlZEdseXBoOworfQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpIHsKKyAgICBpZiAoYml0bWFwICE9IE5VTEwgJiYgYml0bWFwVyA+IDAgJiYgYml0bWFwSCA+IDApIHsKKyAgICAgICAgcmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydCwgbGVuLCBudW1HbHlwaHMsIHgsIHksIEJJVE1BUCwgYml0bWFwLAorICAgICAgICAgICAgICAgIGJpdG1hcFcsIGJpdG1hcEgsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBGUkFNRUJVRkZFUiwgTlVMTCwgMCwgMCwgTlVMTCk7CisgICAgfQorCit9CisKK3ZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CisgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOworICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworfQorCisjZGVmaW5lIFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2LCBuZXh0KSAgICAoKChuZXh0KSAtIChwcmV2KSArIDMyKSA+PiA2IDw8IDE2KQorCit2b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LCBSZW5kZXJNb2RlIG1vZGUsIHVpbnQ4X3QgKmJpdG1hcCwKKyAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCxSZWN0ICpib3VuZHMpIHsKKyAgICBpZiAobnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTa0ZpeGVkIHBlblggPSBTa0ludFRvRml4ZWQoeCk7CisgICAgaW50IHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZiAobnVtR2x5cGhzID4gMCkgeworICAgICAgICBnbHlwaHNMZWZ0ID0gbnVtR2x5cGhzOworICAgIH0KKworICAgIFNrRml4ZWQgcHJldlJzYkRlbHRhID0gMDsKKyAgICBwZW5YICs9IFNLX0ZpeGVkMSAvIDI7CisKKyAgICB0ZXh0ICs9IHN0YXJ0OworCisgICAgd2hpbGUgKGdseXBoc0xlZnQgPiAwKSB7CisgICAgICAgIGludDMyX3QgdXRmQ2hhciA9IFNrVVRGMTZfTmV4dFVuaWNoYXIoKGNvbnN0IHVpbnQxNl90KiopICZ0ZXh0KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICBpZiAodXRmQ2hhciA8IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIocGFpbnQsIHV0ZkNoYXIpOworICAgICAgICBwZW5YICs9IFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2UnNiRGVsdGEsIGNhY2hlZEdseXBoLT5tTHNiRGVsdGEpOworICAgICAgICBwcmV2UnNiRGVsdGEgPSBjYWNoZWRHbHlwaC0+bVJzYkRlbHRhOworCisgICAgICAgIC8vIElmIGl0J3Mgc3RpbGwgbm90IHZhbGlkLCB3ZSBjb3VsZG4ndCBjYWNoZSBpdCwgc28gd2Ugc2hvdWxkbid0IGRyYXcgZ2FyYmFnZQorICAgICAgICBpZiAoY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgICAgICBzd2l0Y2gobW9kZSkgeworICAgICAgICAgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJJVE1BUDoKKyAgICAgICAgICAgICAgICBkcmF3Q2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYml0bWFwLCBiaXRtYXBXLCBiaXRtYXBIKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUVBU1VSRToKKyAgICAgICAgICAgICAgICBtZWFzdXJlQ2FjaGVkR2x5cGgoY2FjaGVkR2x5cGgsIFNrRml4ZWRGbG9vcihwZW5YKSwgcGVuWSwgYm91bmRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gY2FjaGVkR2x5cGgtPm1BZHZhbmNlWDsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIGdseXBocywgZGVjcmVtZW50CisgICAgICAgIGlmIChudW1HbHlwaHMgPiAwKSB7CisgICAgICAgICAgICBnbHlwaHNMZWZ0LS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShTa1BhaW50KiBwYWludCwgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoLCBDYWNoZWRHbHlwaEluZm8qIGdseXBoKSB7CisgICAgZ2x5cGgtPm1BZHZhbmNlWCA9IHNraWFHbHlwaC5mQWR2YW5jZVg7CisgICAgZ2x5cGgtPm1BZHZhbmNlWSA9IHNraWFHbHlwaC5mQWR2YW5jZVk7CisgICAgZ2x5cGgtPm1CaXRtYXBMZWZ0ID0gc2tpYUdseXBoLmZMZWZ0OworICAgIGdseXBoLT5tQml0bWFwVG9wID0gc2tpYUdseXBoLmZUb3A7CisgICAgZ2x5cGgtPm1Mc2JEZWx0YSA9IHNraWFHbHlwaC5mTHNiRGVsdGE7CisgICAgZ2x5cGgtPm1Sc2JEZWx0YSA9IHNraWFHbHlwaC5mUnNiRGVsdGE7CisKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICAvLyBHZXQgdGhlIGJpdG1hcCBmb3IgdGhlIGdseXBoCisgICAgcGFpbnQtPmZpbmRJbWFnZShza2lhR2x5cGgpOworICAgIGdseXBoLT5tSXNWYWxpZCA9IG1TdGF0ZS0+Y2FjaGVCaXRtYXAoc2tpYUdseXBoLCAmc3RhcnRYLCAmc3RhcnRZKTsKKworICAgIGlmICghZ2x5cGgtPm1Jc1ZhbGlkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgc2tpYUdseXBoLmZXaWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgc2tpYUdseXBoLmZIZWlnaHQ7CisKKyAgICBnbHlwaC0+bVN0YXJ0WCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bVN0YXJ0WSA9IHN0YXJ0WTsKKyAgICBnbHlwaC0+bUJpdG1hcFdpZHRoID0gc2tpYUdseXBoLmZXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcEhlaWdodCA9IHNraWFHbHlwaC5mSGVpZ2h0OworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IG1TdGF0ZS0+Z2V0Q2FjaGVXaWR0aCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gbVN0YXRlLT5nZXRDYWNoZUhlaWdodCgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KSBzdGFydFggLyAoZmxvYXQpIGNhY2hlV2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBNaW5WID0gKGZsb2F0KSBzdGFydFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworICAgIGdseXBoLT5tQml0bWFwTWF4VSA9IChmbG9hdCkgZW5kWCAvIChmbG9hdCkgY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpIGVuZFkgLyAoZmxvYXQpIGNhY2hlSGVpZ2h0OworCisgICAgbVN0YXRlLT5tVXBsb2FkVGV4dHVyZSA9IHRydWU7Cit9CisKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Y2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCkgeworICAgIENhY2hlZEdseXBoSW5mbyogbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyhnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1HbHlwaEluZGV4ID0gc2tpYUdseXBoLmZJRDsKKyAgICBuZXdHbHlwaC0+bUlzVmFsaWQgPSBmYWxzZTsKKworICAgIHVwZGF0ZUdseXBoQ2FjaGUocGFpbnQsIHNraWFHbHlwaCwgbmV3R2x5cGgpOworCisgICAgcmV0dXJuIG5ld0dseXBoOworfQorCitGb250KiBGb250OjpjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSkgeworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gc3RhdGUtPm1BY3RpdmVGb250czsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhY3RpdmVGb250cy5zaXplKCk7IGkrKykgeworICAgICAgICBGb250KiBmb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmIChmb250LT5tRm9udElkID09IGZvbnRJZCAmJiBmb250LT5tRm9udFNpemUgPT0gZm9udFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmb250OworICAgICAgICB9CisgICAgfQorCisgICAgRm9udCogbmV3Rm9udCA9IG5ldyBGb250KHN0YXRlLCBmb250SWQsIGZvbnRTaXplKTsKKyAgICBhY3RpdmVGb250cy5wdXNoKG5ld0ZvbnQpOworICAgIHJldHVybiBuZXdGb250OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250UmVuZGVyZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRm9udFJlbmRlcmVyOjpGb250UmVuZGVyZXIoKSB7CisgICAgTE9HRCgiQ3JlYXRpbmcgRm9udFJlbmRlcmVyIik7CisKKyAgICBtR2FtbWFUYWJsZSA9IE5VTEw7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgbU1heE51bWJlck9mUXVhZHMgPSAxMDI0OworICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICBtVGV4dHVyZUlkID0gMDsKKworICAgIG1UZXh0TWVzaFB0ciA9IE5VTEw7CisgICAgbVRleHRUZXh0dXJlID0gTlVMTDsKKworICAgIG1JbmRleEJ1ZmZlcklEID0gMDsKKworICAgIG1DYWNoZVdpZHRoID0gREVGQVVMVF9URVhUX0NBQ0hFX1dJRFRIOworICAgIG1DYWNoZUhlaWdodCA9IERFRkFVTFRfVEVYVF9DQUNIRV9IRUlHSFQ7CisKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX1dJRFRILCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGNhY2hlIHdpZHRoIHRvICVzIHBpeGVscyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUNhY2hlV2lkdGggPSBhdG9pKHByb3BlcnR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgdGV4dCBjYWNoZSB3aWR0aCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVXaWR0aCk7CisgICAgfQorCisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0NBQ0hFX0hFSUdIVCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCBjYWNoZSB3aWR0aCB0byAlcyBwaXhlbHMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1DYWNoZUhlaWdodCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGNhY2hlIGhlaWdodCBvZiAlaSBwaXhlbHMiLCBtQ2FjaGVIZWlnaHQpOworICAgIH0KK30KKworRm9udFJlbmRlcmVyOjp+Rm9udFJlbmRlcmVyKCkgeworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlTGluZXNbaV07CisgICAgfQorICAgIG1DYWNoZUxpbmVzLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGRlbGV0ZVtdIG1UZXh0TWVzaFB0cjsKKyAgICAgICAgZGVsZXRlW10gbVRleHRUZXh0dXJlOworICAgIH0KKworICAgIGlmIChtVGV4dHVyZUlkKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UZXh0dXJlSWQpOworICAgIH0KKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmb250c1RvRGVyZWZlcmVuY2Uuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIGZvbnRzVG9EZXJlZmVyZW5jZVtpXTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpmbHVzaEFsbEFuZEludmFsaWRhdGUoKSB7CisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ICE9IDApIHsKKyAgICAgICAgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgICAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQWN0aXZlRm9udHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUFjdGl2ZUZvbnRzW2ldLT5pbnZhbGlkYXRlVGV4dHVyZUNhY2hlKCk7CisgICAgfQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wgPSAwOworICAgIH0KK30KKworYm9vbCBGb250UmVuZGVyZXI6OmNhY2hlQml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCogcmV0T3JpZ2luWCwgdWludDMyX3QqIHJldE9yaWdpblkpIHsKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYgKGdseXBoLmZIZWlnaHQgPiBtQ2FjaGVMaW5lc1ttQ2FjaGVMaW5lcy5zaXplKCkgLSAxXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwKKyAgICAgICAgICAgICAgICAoaW50KSBnbHlwaC5mV2lkdGgsIChpbnQpIGdseXBoLmZIZWlnaHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTm93IGNvcHkgdGhlIGJpdG1hcCBpbnRvIHRoZSBjYWNoZSB0ZXh0dXJlCisgICAgdWludDMyX3Qgc3RhcnRYID0gMDsKKyAgICB1aW50MzJfdCBzdGFydFkgPSAwOworCisgICAgYm9vbCBiaXRtYXBGaXQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmIChiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIG5ldyBnbHlwaCBkaWRuJ3QgZml0LCBmbHVzaCB0aGUgc3RhdGUgc28gZmFyIGFuZCBpbnZhbGlkYXRlIGV2ZXJ5dGhpbmcKKyAgICBpZiAoIWJpdG1hcEZpdCkgeworICAgICAgICBmbHVzaEFsbEFuZEludmFsaWRhdGUoKTsKKworICAgICAgICAvLyBUcnkgdG8gZml0IGl0IGFnYWluCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYml0bWFwRml0ID0gbUNhY2hlTGluZXNbaV0tPmZpdEJpdG1hcChnbHlwaCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgICAgICBpZiAoYml0bWFwRml0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBmaXQsIHNvbWV0aGluZyBpcyB3cm9uZyBhbmQgd2Ugc2hvdWxkbid0IGRyYXcKKyAgICAgICAgaWYgKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpIGdseXBoLmZXaWR0aCwgKGludCkgZ2x5cGguZkhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcmV0T3JpZ2luWCA9IHN0YXJ0WDsKKyAgICAqcmV0T3JpZ2luWSA9IHN0YXJ0WTsKKworICAgIHVpbnQzMl90IGVuZFggPSBzdGFydFggKyBnbHlwaC5mV2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGdseXBoLmZIZWlnaHQ7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gbUNhY2hlV2lkdGg7CisKKyAgICB1aW50OF90KiBjYWNoZUJ1ZmZlciA9IG1UZXh0VGV4dHVyZTsKKyAgICB1aW50OF90KiBiaXRtYXBCdWZmZXIgPSAodWludDhfdCopIGdseXBoLmZJbWFnZTsKKyAgICB1bnNpZ25lZCBpbnQgc3RyaWRlID0gZ2x5cGgucm93Qnl0ZXMoKTsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvciAoY2FjaGVYID0gc3RhcnRYLCBiWCA9IDA7IGNhY2hlWCA8IGVuZFg7IGNhY2hlWCsrLCBiWCsrKSB7CisgICAgICAgIGZvciAoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSsrLCBiWSsrKSB7CisgICAgICAgICAgICB1aW50OF90IHRlbXBDb2wgPSBiaXRtYXBCdWZmZXJbYlkgKiBzdHJpZGUgKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkgKiBjYWNoZVdpZHRoICsgY2FjaGVYXSA9IG1HYW1tYVRhYmxlW3RlbXBDb2xdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VGV4dFRleHR1cmUoKSB7CisgICAgbVRleHRUZXh0dXJlID0gbmV3IHVpbnQ4X3RbbUNhY2hlV2lkdGggKiBtQ2FjaGVIZWlnaHRdOworICAgIG1VcGxvYWRUZXh0dXJlID0gZmFsc2U7CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZUlkKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlSWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgICAgLy8gSW5pdGlhbGl6ZSB0ZXh0dXJlIGRpbWVudGlvbnMKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIG1DYWNoZVdpZHRoLCBtQ2FjaGVIZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgMCk7CisKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDE2LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDI0LCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDMyLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDMyLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIDQwLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUobUNhY2hlV2lkdGgsIG1DYWNoZUhlaWdodCAtIG5leHRMaW5lLCBuZXh0TGluZSwgMCkpOworfQorCisvLyBBdm9pZCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHJlbmRlciBxdWFkIGJ5IHF1YWQKK3ZvaWQgRm9udFJlbmRlcmVyOjppbml0VmVydGV4QXJyYXlCdWZmZXJzKCkgeworICAgIHVpbnQzMl90IG51bUluZGljaWVzID0gbU1heE51bWJlck9mUXVhZHMgKiA2OworICAgIHVpbnQzMl90IGluZGV4QnVmZmVyU2l6ZUJ5dGVzID0gbnVtSW5kaWNpZXMgKiBzaXplb2YodWludDE2X3QpOworICAgIHVpbnQxNl90KiBpbmRleEJ1ZmZlckRhdGEgPSAodWludDE2X3QqKSBtYWxsb2MoaW5kZXhCdWZmZXJTaXplQnl0ZXMpOworCisgICAgLy8gRm91ciB2ZXJ0cywgdHdvIHRyaWFuZ2xlcyAsIHNpeCBpbmRpY2VzIHBlciBxdWFkCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpKyspIHsKKyAgICAgICAgaW50IGk2ID0gaSAqIDY7CisgICAgICAgIGludCBpNCA9IGkgKiA0OworCisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyAxXSA9IGk0ICsgMTsKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgMl0gPSBpNCArIDI7CisKKyAgICAgICAgaW5kZXhCdWZmZXJEYXRhW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4QnVmZmVyRGF0YVtpNiArIDRdID0gaTQgKyAyOworICAgICAgICBpbmRleEJ1ZmZlckRhdGFbaTYgKyA1XSA9IGk0ICsgMzsKKyAgICB9CisKKyAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1JbmRleEJ1ZmZlcklEKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXJJRCk7CisgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXJTaXplQnl0ZXMsIGluZGV4QnVmZmVyRGF0YSwgR0xfRFlOQU1JQ19EUkFXKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKworICAgIGZyZWUoaW5kZXhCdWZmZXJEYXRhKTsKKworICAgIHVpbnQzMl90IGNvb3JkU2l6ZSA9IDM7CisgICAgdWludDMyX3QgdXZTaXplID0gMjsKKyAgICB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIHVpbnQzMl90IHZlcnRleEJ1ZmZlclNpemUgPSBtTWF4TnVtYmVyT2ZRdWFkcyAqIHZlcnRzUGVyUXVhZCAqIGNvb3JkU2l6ZSAqIHV2U2l6ZTsKKyAgICBtVGV4dE1lc2hQdHIgPSBuZXcgZmxvYXRbdmVydGV4QnVmZmVyU2l6ZV07Cit9CisKKy8vIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgYW55dGhpbmcgdW5sZXNzIHdlIGFjdHVhbGx5IGRyYXcgdGV4dAordm9pZCBGb250UmVuZGVyZXI6OmNoZWNrSW5pdCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbml0VGV4dFRleHR1cmUoKTsKKyAgICBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICAvLyBXZSBzdG9yZSBhIHN0cmluZyB3aXRoIGxldHRlcnMgaW4gYSByb3VnaCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZQorICAgIG1MYXRpblByZWNhY2hlID0gU3RyaW5nMTYoImVpc2FybnRvbGNkdWdwbWhieWZ2a3d6eGpxICIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCJFSVNBUk5UT0xDRFVHUE1IQllGVktXWlhKUSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzE2KCIsLj8hKCktK0A7OmAnIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nMTYoIjAxMjM0NTY3ODkiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjaGVja1RleHR1cmVVcGRhdGUoKSB7CisgICAgaWYgKCFtVXBsb2FkVGV4dHVyZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZUlkKTsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNhY2hlIGxpbmVzIGFuZCBzZWUgd2hpY2ggb25lcyBuZWVkIHRvIGJlIHVwZGF0ZWQKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQ2FjaGVUZXh0dXJlTGluZSogY2wgPSBtQ2FjaGVMaW5lc1tpXTsKKyAgICAgICAgaWYoY2wtPm1EaXJ0eSkgeworICAgICAgICAgICAgdWludDMyX3QgeE9mZnNldCA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCB5T2Zmc2V0ID0gY2wtPm1DdXJyZW50Um93OworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggICA9IG1DYWNoZVdpZHRoOworICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ICA9IGNsLT5tTWF4SGVpZ2h0OworICAgICAgICAgICAgdm9pZCogdGV4dHVyZURhdGEgPSBtVGV4dFRleHR1cmUgKyB5T2Zmc2V0KndpZHRoOworCisgICAgICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgeE9mZnNldCwgeU9mZnNldCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHRleHR1cmVEYXRhKTsKKworICAgICAgICAgICAgY2wtPm1EaXJ0eSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbVVwbG9hZFRleHR1cmUgPSBmYWxzZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6Omlzc3VlRHJhd0NvbW1hbmQoKSB7CisgICAgY2hlY2tUZXh0dXJlVXBkYXRlKCk7CisKKyAgICBmbG9hdCogdnR4ID0gbVRleHRNZXNoUHRyOworICAgIGZsb2F0KiB0ZXggPSB2dHggKyAzOworCisgICAgLy8gcG9zaXRpb24gaXMgc2xvdCAwCisgICAgdWludDMyX3Qgc2xvdCA9IDA7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHNsb3QsIDMsIEdMX0ZMT0FULCBmYWxzZSwgMjAsIHZ0eCk7CisKKyAgICAvLyB0ZXh0dXJlMCBpcyBzbG90IDEKKyAgICBzbG90ID0gMTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoc2xvdCwgMiwgR0xfRkxPQVQsIGZhbHNlLCAyMCwgdGV4KTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVySUQpOworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUN1cnJlbnRRdWFkSW5kZXggKiA2LCBHTF9VTlNJR05FRF9TSE9SVCwgTlVMTCk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjphcHBlbmRNZXNoUXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLAorICAgICAgICBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpIHsKKyAgICBpZiAoeDEgPiBtQ2xpcC0+cmlnaHQgfHwgeTEgPCBtQ2xpcC0+dG9wIHx8IHgyIDwgbUNsaXAtPmxlZnQgfHwgeTQgPiBtQ2xpcC0+Ym90dG9tKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJ0c1BlclF1YWQgPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGZsb2F0c1BlclZlcnQgPSA1OworICAgIGZsb2F0KiBjdXJyZW50UG9zID0gbVRleHRNZXNoUHRyICsgbUN1cnJlbnRRdWFkSW5kZXggKiB2ZXJ0c1BlclF1YWQgKiBmbG9hdHNQZXJWZXJ0OworCisgICAgKCpjdXJyZW50UG9zKyspID0geDE7CisgICAgKCpjdXJyZW50UG9zKyspID0geTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gejE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTE7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjE7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MjsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MjsKKworICAgICgqY3VycmVudFBvcysrKSA9IHgzOworICAgICgqY3VycmVudFBvcysrKSA9IHkzOworICAgICgqY3VycmVudFBvcysrKSA9IHozOworICAgICgqY3VycmVudFBvcysrKSA9IHUzOworICAgICgqY3VycmVudFBvcysrKSA9IHYzOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDQ7CisgICAgKCpjdXJyZW50UG9zKyspID0geTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gejQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTQ7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjQ7CisKKyAgICBtQ3VycmVudFF1YWRJbmRleCsrOworCisgICAgaWYgKG1DdXJyZW50UXVhZEluZGV4ID09IG1NYXhOdW1iZXJPZlF1YWRzKSB7CisgICAgICAgIGlzc3VlRHJhd0NvbW1hbmQoKTsKKyAgICAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOworICAgIH0KK30KKwordWludDMyX3QgRm9udFJlbmRlcmVyOjpnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCkgeworICAgIHVpbnQzMl90IHJlbWFpbmluZ0NhcGFjaXR5ID0gMDsKKyAgICBmbG9hdCB0b3RhbFBpeGVscyA9IDA7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICByZW1haW5pbmdDYXBhY2l0eSArPSAobUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCAtIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCk7CisgICAgICAgICB0b3RhbFBpeGVscyArPSBtQ2FjaGVMaW5lc1tpXS0+bU1heFdpZHRoOworICAgIH0KKyAgICByZW1haW5pbmdDYXBhY2l0eSA9IChyZW1haW5pbmdDYXBhY2l0eSAqIDEwMCkgLyB0b3RhbFBpeGVsczsKKyAgICByZXR1cm4gcmVtYWluaW5nQ2FwYWNpdHk7Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KSB7CisgICAgLy8gUmVtYWluaW5nIGNhcGFjaXR5IGlzIG1lYXN1cmVkIGluICUKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CisgICAgd2hpbGUocmVtYWluaW5nQ2FwYWNpdHkgPiAyNSAmJiBwcmVjYWNoZUlkeCA8IG1MYXRpblByZWNhY2hlLnNpemUoKSkgeworICAgICAgICBtQ3VycmVudEZvbnQtPmdldENhY2hlZFVURkNoYXIocGFpbnQsIChpbnQzMl90KW1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CisgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgICAgICBwcmVjYWNoZUlkeCArKzsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKSB7CisgICAgdWludDMyX3QgY3VycmVudE51bUZvbnRzID0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKyAgICBtQ3VycmVudEZvbnQgPSBGb250OjpjcmVhdGUodGhpcywgZm9udElkLCBmb250U2l6ZSk7CisKKyAgICBjb25zdCBmbG9hdCBtYXhQcmVjYWNoZUZvbnRTaXplID0gNDAuMGY7CisgICAgYm9vbCBpc05ld0ZvbnQgPSBjdXJyZW50TnVtRm9udHMgIT0gbUFjdGl2ZUZvbnRzLnNpemUoKTsKKworICAgIGlmIChpc05ld0ZvbnQgJiYgZm9udFNpemUgPD0gbWF4UHJlY2FjaGVGb250U2l6ZSkgeworICAgICAgICBwcmVjYWNoZUxhdGluKHBhaW50KTsKKyAgICB9Cit9CitGb250UmVuZGVyZXI6OkRyb3BTaGFkb3cgRm9udFJlbmRlcmVyOjpyZW5kZXJEcm9wU2hhZG93KFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICB1aW50MzJfdCBzdGFydEluZGV4LCB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cykgeworICAgIGNoZWNrSW5pdCgpOworCisgICAgaWYgKCFtQ3VycmVudEZvbnQpIHsKKyAgICAgICAgRHJvcFNoYWRvdyBpbWFnZTsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSAwOworICAgICAgICBpbWFnZS5oZWlnaHQgPSAwOworICAgICAgICBpbWFnZS5pbWFnZSA9IE5VTEw7CisgICAgICAgIGltYWdlLnBlblggPSAwOworICAgICAgICBpbWFnZS5wZW5ZID0gMDsKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIFJlY3QgYm91bmRzOworICAgIG1DdXJyZW50Rm9udC0+bWVhc3VyZVVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsICZib3VuZHMpOworICAgIHVpbnQzMl90IHBhZGRlZFdpZHRoID0gKHVpbnQzMl90KSAoYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQpICsgMiAqIHJhZGl1czsKKyAgICB1aW50MzJfdCBwYWRkZWRIZWlnaHQgPSAodWludDMyX3QpIChib3VuZHMudG9wIC0gYm91bmRzLmJvdHRvbSkgKyAyICogcmFkaXVzOworICAgIHVpbnQ4X3QqIGRhdGFCdWZmZXIgPSBuZXcgdWludDhfdFtwYWRkZWRXaWR0aCAqIHBhZGRlZEhlaWdodF07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBhZGRlZFdpZHRoICogcGFkZGVkSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZGF0YUJ1ZmZlcltpXSA9IDA7CisgICAgfQorCisgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKKyAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CisKKyAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgICAgICAgICBkYXRhQnVmZmVyLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0KTsKKyAgICBibHVySW1hZ2UoZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgcmFkaXVzKTsKKworICAgIERyb3BTaGFkb3cgaW1hZ2U7CisgICAgaW1hZ2Uud2lkdGggPSBwYWRkZWRXaWR0aDsKKyAgICBpbWFnZS5oZWlnaHQgPSBwYWRkZWRIZWlnaHQ7CisgICAgaW1hZ2UuaW1hZ2UgPSBkYXRhQnVmZmVyOworICAgIGltYWdlLnBlblggPSBwZW5YOworICAgIGltYWdlLnBlblkgPSBwZW5ZOworICAgIHJldHVybiBpbWFnZTsKK30KKwordm9pZCBGb250UmVuZGVyZXI6OnJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGxlbiwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KSB7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICBpZiAoIW1DdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJObyBmb250IHNldCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNsaXAgPSBjbGlwOworICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisKKyAgICBpZiAobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjpjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cykgeworICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAvLyBlIGlzIHRoZSBldWxlcidzIG51bWJlcgorICAgIGZsb2F0IGUgPSAyLjcxODI4MTgyODQ1OTA0NWY7CisgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgIC8vIGcoeCkgPSAoIDEgLyBzcXJ0KCAyICogcGkgKSAqIHNpZ21hKSAqIGUgXiAoIC14XjIgLyAyICogc2lnbWFeMiApCisgICAgLy8geCBpcyBvZiB0aGUgZm9ybSBbLXJhZGl1cyAuLiAwIC4uIHJhZGl1c10KKyAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgIC8vIEJhc2VkIG9uIHNvbWUgZXhwZXJpbWVudGFsIHJhZGl1cyB2YWx1ZXMgYW5kIHNpZ21hJ3MKKyAgICAvLyB3ZSBhcHByb3hpbWF0ZWx5IGZpdCBzaWdtYSA9IGYocmFkaXVzKSBhcworICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC4zICArIDAuNgorICAgIC8vIFRoZSBsYXJnZXIgdGhlIHJhZGl1cyBnZXRzLCB0aGUgbW9yZSBvdXIgZ2F1c3NpYW4gYmx1cgorICAgIC8vIHdpbGwgcmVzZW1ibGUgYSBib3ggYmx1ciBzaW5jZSB3aXRoIGxhcmdlIHNpZ21hCisgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgIGZsb2F0IHNpZ21hID0gMC4zZiAqIChmbG9hdClyYWRpdXMgKyAwLjZmOworCisgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgLy8gV2Ugd2lsbCBzdG9yZSBzb21lIHJlZHVuZGFudCB2YWx1ZXMgdG8gc2F2ZSBzb21lIG1hdGggZHVyaW5nCisgICAgLy8gdGhlIGJsdXIgY2FsY3VsYXRpb25zCisgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgIGZsb2F0IGNvZWZmMSA9IDEuMGYgLyAoc3FydCggMi4wZiAqIHBpICkgKiBzaWdtYSk7CisgICAgZmxvYXQgY29lZmYyID0gLSAxLjBmIC8gKDIuMGYgKiBzaWdtYSAqIHNpZ21hKTsKKworICAgIGZsb2F0IG5vcm1hbGl6ZUZhY3RvciA9IDAuMGY7CisgICAgZm9yKGludDMyX3QgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0IGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICB3ZWlnaHRzW3IgKyByYWRpdXNdID0gY29lZmYxICogcG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgIG5vcm1hbGl6ZUZhY3RvciArPSB3ZWlnaHRzW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgd2VpZ2h0c1tyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCit2b2lkIEZvbnRSZW5kZXJlcjo6aG9yaXpvbnRhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHkgKiB3aWR0aDsKKyAgICAgICAgdWludDhfdCogb3V0cHV0ID0gZGVzdCArIHkgKiB3aWR0aDsKKworICAgICAgICBmb3IoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGdQdHIgPSB3ZWlnaHRzOworICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uIGZvciBub24tYm9yZGVyIHBpeGVscworICAgICAgICAgICAgaWYgKCh4ID4gcmFkaXVzKSAmJiAoeCA8ICh3aWR0aCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKHggLSByYWRpdXMpOworICAgICAgICAgICAgICAgIGZvcihpbnQgciA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQaXhlbCA9IChmbG9hdCkoKmkpOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RlcHBpbmcgbGVmdCBhbmQgcmlnaHQgYXdheSBmcm9tIHRoZSBwaXhlbAorICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRXID0geCArIHI7CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkVyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXID4gd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFcgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGl4ZWwgPSAoZmxvYXQpKGlucHV0W3ZhbGlkV10pOworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gY3VycmVudFBpeGVsICogZ1B0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZ1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRwdXQgPSAodWludDhfdClibHVycmVkUGl4ZWw7CisgICAgICAgICAgICBvdXRwdXQgKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRm9udFJlbmRlcmVyOjp2ZXJ0aWNhbEJsdXIoZmxvYXQqIHdlaWdodHMsIGludDMyX3QgcmFkaXVzLAorICAgICAgICBjb25zdCB1aW50OF90KiBzb3VyY2UsIHVpbnQ4X3QqIGRlc3QsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgZmxvYXQgYmx1cnJlZFBpeGVsID0gMC4wZjsKKyAgICBmbG9hdCBjdXJyZW50UGl4ZWwgPSAwLjBmOworCisgICAgZm9yKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKyspIHsKKworICAgICAgICB1aW50OF90KiBvdXRwdXQgPSBkZXN0ICsgeSAqIHdpZHRoOworCisgICAgICAgIGZvcihpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHggKyspIHsKKyAgICAgICAgICAgIGJsdXJyZWRQaXhlbCA9IDAuMGY7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogZ1B0ciA9IHdlaWdodHM7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCA9IHNvdXJjZSArIHg7CisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb24gZm9yIG5vbi1ib3JkZXIgcGl4ZWxzCisgICAgICAgICAgICBpZiAoKHkgPiByYWRpdXMpICYmICh5IDwgKGhlaWdodCAtIHJhZGl1cykpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaSA9IGlucHV0ICsgKCh5IC0gcmFkaXVzKSAqIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgICAgIGkgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoaW50MzJfdCByID0gLXJhZGl1czsgciA8PSByYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbGlkSCA9IHkgKyByOworICAgICAgICAgICAgICAgICAgICAvLyBDbGFtcCB0byB6ZXJvIGFuZCB3aWR0aAorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZEggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA+IGhlaWdodCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppID0gaW5wdXQgKyB2YWxpZEggKiB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFBpeGVsID0gKGZsb2F0KSgqaSk7CisgICAgICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbCArPSBjdXJyZW50UGl4ZWwgKiBnUHRyWzBdOworICAgICAgICAgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dHB1dCA9ICh1aW50OF90KWJsdXJyZWRQaXhlbDsKKyAgICAgICAgICAgIG91dHB1dCArKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEZvbnRSZW5kZXJlcjo6Ymx1ckltYWdlKHVpbnQ4X3QgKmltYWdlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCByYWRpdXMpIHsKKyAgICBmbG9hdCAqZ2F1c3NpYW4gPSBuZXcgZmxvYXRbMiAqIHJhZGl1cyArIDFdOworICAgIGNvbXB1dGVHYXVzc2lhbldlaWdodHMoZ2F1c3NpYW4sIHJhZGl1cyk7CisgICAgdWludDhfdCogc2NyYXRjaCA9IG5ldyB1aW50OF90W3dpZHRoICogaGVpZ2h0XTsKKyAgICBob3Jpem9udGFsQmx1cihnYXVzc2lhbiwgcmFkaXVzLCBpbWFnZSwgc2NyYXRjaCwgd2lkdGgsIGhlaWdodCk7CisgICAgdmVydGljYWxCbHVyKGdhdXNzaWFuLCByYWRpdXMsIHNjcmF0Y2gsIGltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBkZWxldGVbXSBnYXVzc2lhbjsKKyAgICBkZWxldGVbXSBzY3JhdGNoOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVjMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX0ZPTlRfUkVOREVSRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgPFNrU2NhbGVyQ29udGV4dC5oPgorI2luY2x1ZGUgPFNrUGFpbnQuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitjbGFzcyBGb250UmVuZGVyZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAorICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCisgKi8KK2NsYXNzIEZvbnQgeworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvKioKKyAgICAgKiBSZW5kZXJzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIG9mIHRleHQuCisgICAgICogSWYgYml0bWFwIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByZW5kZXIgdGFyZ2V0CisgICAgICovCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAgPSBOVUxMLCB1aW50MzJfdCBiaXRtYXBXID0gMCwgdWludDMyX3QgYml0bWFwSCA9IDApOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZm9udCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBmb250IHN0YXRlLgorICAgICAqLworICAgIHN0YXRpYyBGb250KiBjcmVhdGUoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgY2xhc3MgRm9udFJlbmRlcmVyOworCisgICAgZW51bSBSZW5kZXJNb2RlIHsKKyAgICAgICAgRlJBTUVCVUZGRVIsCisgICAgICAgIEJJVE1BUCwKKyAgICAgICAgTUVBU1VSRSwKKyAgICB9OworCisgICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKKyAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisKKyAgICB2b2lkIG1lYXN1cmVVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKTsKKworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8geworICAgICAgICAvLyBIYXMgdGhlIGNhY2hlIGJlZW4gaW52YWxpZGF0ZWQ/CisgICAgICAgIGJvb2wgbUlzVmFsaWQ7CisgICAgICAgIC8vIExvY2F0aW9uIG9mIHRoZSBjYWNoZWQgZ2x5cGggaW4gdGhlIGJpdG1hcAorICAgICAgICAvLyBpbiBjYXNlIHdlIG5lZWQgdG8gcmVzaXplIHRoZSB0ZXh0dXJlIG9yCisgICAgICAgIC8vIHJlbmRlciB0byBiaXRtYXAKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WDsKKyAgICAgICAgdWludDMyX3QgbVN0YXJ0WTsKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcFdpZHRoOworICAgICAgICB1aW50MzJfdCBtQml0bWFwSGVpZ2h0OworICAgICAgICAvLyBBbHNvIGNhY2hlIHRleHR1cmUgY29vcmRzIGZvciB0aGUgcXVhZAorICAgICAgICBmbG9hdCBtQml0bWFwTWluVTsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1pblY7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhVOworICAgICAgICBmbG9hdCBtQml0bWFwTWF4VjsKKyAgICAgICAgLy8gTWluaW1pemUgaG93IG11Y2ggd2UgY2FsbCBmcmVldHlwZQorICAgICAgICB1aW50MzJfdCBtR2x5cGhJbmRleDsKKyAgICAgICAgdWludDMyX3QgbUFkdmFuY2VYOworICAgICAgICB1aW50MzJfdCBtQWR2YW5jZVk7CisgICAgICAgIC8vIFZhbHVlcyBiZWxvdyBjb250YWluIGEgZ2x5cGgncyBvcmlnaW4gaW4gdGhlIGJpdG1hcAorICAgICAgICBpbnQzMl90IG1CaXRtYXBMZWZ0OworICAgICAgICBpbnQzMl90IG1CaXRtYXBUb3A7CisgICAgICAgIC8vIEF1dG8ta2VybmluZworICAgICAgICBTa0ZpeGVkIG1Mc2JEZWx0YTsKKyAgICAgICAgU2tGaXhlZCBtUnNiRGVsdGE7CisgICAgfTsKKworICAgIEZvbnQoRm9udFJlbmRlcmVyKiBzdGF0ZSwgdWludDMyX3QgZm9udElkLCBmbG9hdCBmb250U2l6ZSk7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKj4gbUNhY2hlZEdseXBoczsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IGdseXBoKTsKKyAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CisgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworCisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKFNrUGFpbnQqIHBhaW50LCBpbnQzMl90IHV0ZkNoYXIpOworCisgICAgRm9udFJlbmRlcmVyKiBtU3RhdGU7CisgICAgdWludDMyX3QgbUZvbnRJZDsKKyAgICBmbG9hdCBtRm9udFNpemU7Cit9OworCitjbGFzcyBGb250UmVuZGVyZXIgeworcHVibGljOgorICAgIEZvbnRSZW5kZXJlcigpOworICAgIH5Gb250UmVuZGVyZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgZGVpbml0KCk7CisKKyAgICB2b2lkIHNldEdhbW1hVGFibGUoY29uc3QgdWludDhfdCogZ2FtbWFUYWJsZSkgeworICAgICAgICBtR2FtbWFUYWJsZSA9IGdhbW1hVGFibGU7CisgICAgfQorCisgICAgdm9pZCBzZXRGb250KFNrUGFpbnQqIHBhaW50LCB1aW50MzJfdCBmb250SWQsIGZsb2F0IGZvbnRTaXplKTsKKyAgICB2b2lkIHJlbmRlclRleHQoU2tQYWludCogcGFpbnQsIGNvbnN0IFJlY3QqIGNsaXAsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICBzdHJ1Y3QgRHJvcFNoYWRvdyB7CisgICAgICAgIERyb3BTaGFkb3coKSB7IH07CisKKyAgICAgICAgRHJvcFNoYWRvdyhjb25zdCBEcm9wU2hhZG93JiBkcm9wU2hhZG93KToKKyAgICAgICAgICAgIHdpZHRoKGRyb3BTaGFkb3cud2lkdGgpLCBoZWlnaHQoZHJvcFNoYWRvdy5oZWlnaHQpLAorICAgICAgICAgICAgaW1hZ2UoZHJvcFNoYWRvdy5pbWFnZSksIHBlblgoZHJvcFNoYWRvdy5wZW5YKSwKKyAgICAgICAgICAgIHBlblkoZHJvcFNoYWRvdy5wZW5ZKSB7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50OF90KiBpbWFnZTsKKyAgICAgICAgaW50MzJfdCBwZW5YOworICAgICAgICBpbnQzMl90IHBlblk7CisgICAgfTsKKworICAgIC8vIEFmdGVyIHJlbmRlckRyb3BTaGFkb3cgcmV0dXJucywgdGhlIGNhbGxlZCBvd25zIHRoZSBtZW1vcnkgaW4gRHJvcFNoYWRvdy5pbWFnZQorICAgIC8vIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0IHdoZW4gaXQncyBkb25lIHdpdGggaXQKKyAgICBEcm9wU2hhZG93IHJlbmRlckRyb3BTaGFkb3coU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0SW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBsZW4sIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cyk7CisKKyAgICBHTHVpbnQgZ2V0VGV4dHVyZSgpIHsKKyAgICAgICAgY2hlY2tJbml0KCk7CisgICAgICAgIHJldHVybiBtVGV4dHVyZUlkOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGZyaWVuZCBjbGFzcyBGb250OworCisgICAgY29uc3QgdWludDhfdCogbUdhbW1hVGFibGU7CisKKyAgICBzdHJ1Y3QgQ2FjaGVUZXh0dXJlTGluZSB7CisgICAgICAgIHVpbnQxNl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworICAgICAgICBib29sIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQxNl90IG1heFdpZHRoLCB1aW50MTZfdCBtYXhIZWlnaHQsIHVpbnQzMl90IGN1cnJlbnRSb3csCisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudENvbCk6CisgICAgICAgICAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgbU1heFdpZHRoKG1heFdpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSb3coY3VycmVudFJvdyksCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgICAgICAgICBtRGlydHkoZmFsc2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZml0Qml0bWFwKGNvbnN0IFNrR2x5cGgmIGdseXBoLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKKyAgICAgICAgICAgIGlmIChnbHlwaC5mSGVpZ2h0ID4gbU1heEhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdXJyZW50Q29sICsgZ2x5cGguZldpZHRoIDwgbU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgKnJldE9yaWdpblggPSBtQ3VycmVudENvbDsKKyAgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29sICs9IGdseXBoLmZXaWR0aDsKKyAgICAgICAgICAgICAgICBtRGlydHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdWludDMyX3QgZ2V0Q2FjaGVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DYWNoZVdpZHRoOworICAgIH0KKworICAgIHVpbnQzMl90IGdldENhY2hlSGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNhY2hlSGVpZ2h0OworICAgIH0KKworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisgICAgYm9vbCBjYWNoZUJpdG1hcChjb25zdCBTa0dseXBoJiBnbHlwaCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKTsKKworICAgIHZvaWQgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisgICAgdm9pZCBpbml0VmVydGV4QXJyYXlCdWZmZXJzKCk7CisKKyAgICB2b2lkIGNoZWNrSW5pdCgpOworCisgICAgU3RyaW5nMTYgbUxhdGluUHJlY2FjaGU7CisgICAgdm9pZCBwcmVjYWNoZUxhdGluKFNrUGFpbnQqIHBhaW50KTsKKworICAgIHZvaWQgaXNzdWVEcmF3Q29tbWFuZCgpOworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpOworCisgICAgdWludDMyX3QgbUNhY2hlV2lkdGg7CisgICAgdWludDMyX3QgbUNhY2hlSGVpZ2h0OworCisgICAgVmVjdG9yPENhY2hlVGV4dHVyZUxpbmUqPiBtQ2FjaGVMaW5lczsKKyAgICB1aW50MzJfdCBnZXRSZW1haW5pbmdDYWNoZUNhcGFjaXR5KCk7CisKKyAgICBGb250KiBtQ3VycmVudEZvbnQ7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBUZXh0dXJlIHRvIGNhY2hlIGdseXBoIGJpdG1hcHMKKyAgICB1aW50OF90KiBtVGV4dFRleHR1cmU7CisgICAgY29uc3QgdWludDhfdCogZ2V0VGV4dFRleHR1cmVEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRleHRUZXh0dXJlOworICAgIH0KKyAgICBHTHVpbnQgbVRleHR1cmVJZDsKKyAgICB2b2lkIGNoZWNrVGV4dHVyZVVwZGF0ZSgpOworICAgIGJvb2wgbVVwbG9hZFRleHR1cmU7CisKKyAgICAvLyBQb2ludGVyIHRvIHZlcnRleCBkYXRhIHRvIHNwZWVkIHVwIGZyYW1lIHRvIGZyYW1lIHdvcmsKKyAgICBmbG9hdCAqbVRleHRNZXNoUHRyOworICAgIHVpbnQzMl90IG1DdXJyZW50UXVhZEluZGV4OworICAgIHVpbnQzMl90IG1NYXhOdW1iZXJPZlF1YWRzOworCisgICAgdWludDMyX3QgbUluZGV4QnVmZmVySUQ7CisKKyAgICBjb25zdCBSZWN0KiBtQ2xpcDsKKworICAgIGJvb2wgbUluaXRpYWxpemVkOworCisgICAgdm9pZCBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKGZsb2F0KiB3ZWlnaHRzLCBpbnQzMl90IHJhZGl1cyk7CisgICAgdm9pZCBob3Jpem9udGFsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIHZlcnRpY2FsQmx1cihmbG9hdCogd2VpZ2h0cywgaW50MzJfdCByYWRpdXMsIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSwgdWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGJsdXJJbWFnZSh1aW50OF90KiBpbWFnZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgcmFkaXVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDg3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvR2FtbWFGb250UmVuZGVyZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIkdhbW1hRm9udFJlbmRlcmVyLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dhbW1hRm9udFJlbmRlcmVyOjpHYW1tYUZvbnRSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJDcmVhdGluZyBnYW1tYSBmb250IHJlbmRlcmVyIik7CisKKyAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAvLyBHZXQgdGhlIGdhbW1hCisgICAgZmxvYXQgZ2FtbWEgPSBERUZBVUxUX1RFWFRfR0FNTUE7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX0dBTU1BLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGdhbW1hIHRvICVzIiwgcHJvcGVydHkpOworICAgICAgICBnYW1tYSA9IGF0b2YocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB0ZXh0IGdhbW1hIG9mICUuMmYiLCBERUZBVUxUX1RFWFRfR0FNTUEpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYmxhY2sgZ2FtbWEgdGhyZXNob2xkCisgICAgbUJsYWNrVGhyZXNob2xkID0gREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRDsKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xELCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyB0ZXh0IGJsYWNrIGdhbW1hIHRocmVzaG9sZCB0byAlcyIsIHByb3BlcnR5KTsKKyAgICAgICAgbUJsYWNrVGhyZXNob2xkID0gYXRvaShwcm9wZXJ0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHQgYmxhY2sgZ2FtbWEgdGhyZXNob2xkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBERUZBVUxUX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIHdoaXRlIGdhbW1hIHRocmVzaG9sZAorICAgIG1XaGl0ZVRocmVzaG9sZCA9IERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQ7CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUX1dISVRFX0dBTU1BX1RIUkVTSE9MRCwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgdGV4dCB3aGl0ZSBnYW1tYSB0aHJlc2hvbGQgdG8gJXMiLCBwcm9wZXJ0eSk7CisgICAgICAgIG1XaGl0ZVRocmVzaG9sZCA9IGF0b2kocHJvcGVydHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIiAgVXNpbmcgZGVmYXVsdCB3aGl0ZSBibGFjayBnYW1tYSB0aHJlc2hvbGQgb2YgJWQiLAorICAgICAgICAgICAgICAgIERFRkFVTFRfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGdhbW1hIHRhYmxlcworICAgIGNvbnN0IGZsb2F0IGJsYWNrR2FtbWEgPSBnYW1tYTsKKyAgICBjb25zdCBmbG9hdCB3aGl0ZUdhbW1hID0gMS4wZiAvIGdhbW1hOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSAyNTU7IGkrKykgeworICAgICAgICBtRGVmYXVsdFtpXSA9IGk7CisKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IGkgLyAyNTUuMGY7CisgICAgICAgIGNvbnN0IGZsb2F0IGJsYWNrID0gcG93KHYsIGJsYWNrR2FtbWEpOworICAgICAgICBjb25zdCBmbG9hdCB3aGl0ZSA9IHBvdyh2LCB3aGl0ZUdhbW1hKTsKKworICAgICAgICBtQmxhY2tHYW1tYVtpXSA9IHVpbnQ4X3QoKGZsb2F0KTo6Zmxvb3IoYmxhY2sgKiAyNTUuMGYgKyAwLjVmKSk7CisgICAgICAgIG1XaGl0ZUdhbW1hW2ldID0gdWludDhfdCgoZmxvYXQpOjpmbG9vcih3aGl0ZSAqIDI1NS4wZiArIDAuNWYpKTsKKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgdGhlIGZvbnQgcmVuZGVyZXJzCisgICAgbURlZmF1bHRSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtRGVmYXVsdFswXSk7CisgICAgbUJsYWNrR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtQmxhY2tHYW1tYVswXSk7CisgICAgbVdoaXRlR2FtbWFSZW5kZXJlci5zZXRHYW1tYVRhYmxlKCZtV2hpdGVHYW1tYVswXSk7Cit9CisKK0ZvbnRSZW5kZXJlciYgR2FtbWFGb250UmVuZGVyZXI6OmdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChwYWludC0+Z2V0U2hhZGVyKCkgPT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBjID0gcGFpbnQtPmdldENvbG9yKCk7CisgICAgICAgIGNvbnN0IGludCByID0gKGMgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgY29uc3QgaW50IGcgPSAoYyA+PiAgOCkgJiAweEZGOworICAgICAgICBjb25zdCBpbnQgYiA9IChjICAgICAgKSAmIDB4RkY7CisgICAgICAgIGNvbnN0IGludCBsdW1pbmFuY2UgPSAociAqIDIgKyBnICogNSArIGIpID4+IDM7CisKKyAgICAgICAgaWYgKGx1bWluYW5jZSA8PSBtQmxhY2tUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtQmxhY2tHYW1tYVJlbmRlcmVyOworICAgICAgICB9IGVsc2UgaWYgKGx1bWluYW5jZSA+PSBtV2hpdGVUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBtV2hpdGVHYW1tYVJlbmRlcmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRGVmYXVsdFJlbmRlcmVyOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oIGIvbGlicy9od3VpL0dhbW1hRm9udFJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhNDVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9HYW1tYUZvbnRSZW5kZXJlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfR0FNTUFfRk9OVF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCitzdHJ1Y3QgR2FtbWFGb250UmVuZGVyZXIgeworICAgIEdhbW1hRm9udFJlbmRlcmVyKCk7CisKKyAgICBGb250UmVuZGVyZXImIGdldEZvbnRSZW5kZXJlcihjb25zdCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgRm9udFJlbmRlcmVyIG1EZWZhdWx0UmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1CbGFja0dhbW1hUmVuZGVyZXI7CisgICAgRm9udFJlbmRlcmVyIG1XaGl0ZUdhbW1hUmVuZGVyZXI7CisKKyAgICBpbnQgbUJsYWNrVGhyZXNob2xkOworICAgIGludCBtV2hpdGVUaHJlc2hvbGQ7CisKKyAgICB1aW50OF90IG1EZWZhdWx0WzI1Nl07CisgICAgdWludDhfdCBtQmxhY2tHYW1tYVsyNTZdOworICAgIHVpbnQ4X3QgbVdoaXRlR2FtbWFbMjU2XTsKK307CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HQU1NQV9GT05UX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaCBiL2xpYnMvaHd1aS9HZW5lcmF0aW9uQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzBlMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dlbmVyYXRpb25DYWNoZS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX0dFTkVSQVRJT05fQ0FDSEVfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+CitjbGFzcyBPbkVudHJ5UmVtb3ZlZCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07CisgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKK307IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgorc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKKyAgICBFbnRyeSgpIHsgfQorICAgIEVudHJ5KGNvbnN0IEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiYgZSk6CisgICAgICAgICAgICBrZXkoZS5rZXkpLCB2YWx1ZShlLnZhbHVlKSwgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9CisgICAgRW50cnkoc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gZSk6CisgICAgICAgICAgICBrZXkoZS0+a2V5KSwgdmFsdWUoZS0+dmFsdWUpLCBwYXJlbnQoZS0+cGFyZW50KSwgY2hpbGQoZS0+Y2hpbGQpIHsgfQorCisgICAgRW50cnlLZXkga2V5OworICAgIEVudHJ5VmFsdWUgdmFsdWU7CisKKyAgICBzcDxFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4gPiBwYXJlbnQ7CisgICAgc3A8RW50cnk8RW50cnlLZXksIEVudHJ5VmFsdWU+ID4gY2hpbGQ7Cit9OyAvLyBzdHJ1Y3QgRW50cnkKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2NsYXNzIEdlbmVyYXRpb25DYWNoZSB7CitwdWJsaWM6CisgICAgR2VuZXJhdGlvbkNhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB2aXJ0dWFsIH5HZW5lcmF0aW9uQ2FjaGUoKTsKKworICAgIGVudW0gQ2FwYWNpdHkgeworICAgICAgICBrVW5saW1pdGVkQ2FwYWNpdHksCisgICAgfTsKKworICAgIHZvaWQgc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcihPbkVudHJ5UmVtb3ZlZDxLLCBWPiogbGlzdGVuZXIpOworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgYm9vbCBjb250YWlucyhLIGtleSkgY29uc3Q7CisgICAgViBnZXQoSyBrZXkpOworICAgIEsgZ2V0S2V5QXQodWludDMyX3QgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgcHV0KEsga2V5LCBWIHZhbHVlKTsKKyAgICBWIHJlbW92ZShLIGtleSk7CisgICAgViByZW1vdmVPbGRlc3QoKTsKKworICAgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICAgIHZvaWQgYWRkVG9DYWNoZShzcDxFbnRyeTxLLCBWPiA+IGVudHJ5LCBLIGtleSwgViB2YWx1ZSk7CisgICAgdm9pZCBhdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworICAgIHZvaWQgZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpOworCisgICAgViByZW1vdmVBdChzc2l6ZV90IGluZGV4KTsKKworICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7CisgICAgdWludDMyX3QgbU1heENhcGFjaXR5OworCisgICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKKworICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKKyAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKK307IC8vIGNsYXNzIEdlbmVyYXRpb25DYWNoZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpHZW5lcmF0aW9uQ2FjaGUodWludDMyX3QgbWF4Q2FwYWNpdHkpOiBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLCBtTGlzdGVuZXIoTlVMTCkgeworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK0dlbmVyYXRpb25DYWNoZTxLLCBWPjo6fkdlbmVyYXRpb25DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3VpbnQzMl90IEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLnNpemUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgeworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgordm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgeworICAgIGlmIChtTGlzdGVuZXIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1Zb3VuZ2VzdC5jbGVhcigpOworICAgIG1PbGRlc3QuY2xlYXIoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK2Jvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhLIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQ2FjaGUuaW5kZXhPZktleShrZXkpID49IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitLIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0S2V5QXQodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhY2hlLmtleUF0KGluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK1YgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXQoSyBrZXkpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFbnRyeTxLLCBWPiA+IGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoZW50cnkuZ2V0KCkpIHsKKyAgICAgICAgICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisgICAgICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICBpZiAobU1heENhcGFjaXR5ICE9IGtVbmxpbWl0ZWRDYXBhY2l0eSAmJiBtQ2FjaGUuc2l6ZSgpID49IG1NYXhDYXBhY2l0eSkgeworICAgICAgICByZW1vdmVPbGRlc3QoKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBuZXcgRW50cnk8SywgVj47CisgICAgICAgIGFkZFRvQ2FjaGUoZW50cnksIGtleSwgdmFsdWUpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphZGRUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnksIEsga2V5LCBWIHZhbHVlKSB7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKyAgICBtQ2FjaGUuYWRkKGtleSwgZW50cnkpOworICAgIGF0dGFjaFRvQ2FjaGUoZW50cnkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZShLIGtleSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitWIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlQXQoc3NpemVfdCBpbmRleCkgeworICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7CisgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKKyAgICB9CisgICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQoaW5kZXgsIDEpOworICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7CisKKyAgICByZXR1cm4gZW50cnktPnZhbHVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorViBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnJlbW92ZU9sZGVzdCgpIHsKKyAgICBpZiAobU9sZGVzdC5nZXQoKSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNhY2hlLmluZGV4T2ZLZXkobU9sZGVzdC0+a2V5KTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVBdChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3ZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphdHRhY2hUb0NhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoIW1Zb3VuZ2VzdC5nZXQoKSkgeworICAgICAgICBtWW91bmdlc3QgPSBtT2xkZXN0ID0gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnktPnBhcmVudCA9IG1Zb3VuZ2VzdDsKKyAgICAgICAgbVlvdW5nZXN0LT5jaGlsZCA9IGVudHJ5OworICAgICAgICBtWW91bmdlc3QgPSBlbnRyeTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Cit2b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6ZGV0YWNoRnJvbUNhY2hlKHNwPEVudHJ5PEssIFY+ID4gZW50cnkpIHsKKyAgICBpZiAoZW50cnktPnBhcmVudC5nZXQoKSkgeworICAgICAgICBlbnRyeS0+cGFyZW50LT5jaGlsZCA9IGVudHJ5LT5jaGlsZDsKKyAgICB9CisKKyAgICBpZiAoZW50cnktPmNoaWxkLmdldCgpKSB7CisgICAgICAgIGVudHJ5LT5jaGlsZC0+cGFyZW50ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBpZiAobU9sZGVzdCA9PSBlbnRyeSkgeworICAgICAgICBtT2xkZXN0ID0gZW50cnktPmNoaWxkOworICAgIH0KKworICAgIGlmIChtWW91bmdlc3QgPT0gZW50cnkpIHsKKyAgICAgICAgbVlvdW5nZXN0ID0gZW50cnktPnBhcmVudDsKKyAgICB9CisKKyAgICBlbnRyeS0+cGFyZW50LmNsZWFyKCk7CisgICAgZW50cnktPmNoaWxkLmNsZWFyKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HRU5FUkFUSU9OX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcCBiL2xpYnMvaHd1aS9HcmFkaWVudENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU3MzcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa0dyYWRpZW50U2hhZGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyYWRpZW50Q2FjaGU6OkdyYWRpZW50Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKE1CKERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9HUkFESUVOVF9DQUNIRV9TSVpFLCBwcm9wZXJ0eSwgTlVMTCkgPiAwKSB7CisgICAgICAgIExPR0QoIiAgU2V0dGluZyBncmFkaWVudCBjYWNoZSBzaXplIHRvICVzTUIiLCBwcm9wZXJ0eSk7CisgICAgICAgIHNldE1heFNpemUoTUIoYXRvZihwcm9wZXJ0eSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgIFVzaW5nIGRlZmF1bHQgZ3JhZGllbnQgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX0dSQURJRU5UX0NBQ0hFX1NJWkUpOworICAgIH0KKworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworfQorCitHcmFkaWVudENhY2hlOjpHcmFkaWVudENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTa1NoYWRlciosIFRleHR1cmUqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbVNpemUoMCksIG1NYXhTaXplKG1heEJ5dGVTaXplKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7Cit9CisKK0dyYWRpZW50Q2FjaGU6On5HcmFkaWVudENhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBHcmFkaWVudENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OnNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIEdyYWRpZW50Q2FjaGU6Om9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgLy8gQWxyZWFkeSBsb2NrZWQgaGVyZQorICAgIGlmIChzaGFkZXIpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IHRleHR1cmUtPndpZHRoICogdGV4dHVyZS0+aGVpZ2h0ICogNDsKKyAgICAgICAgbVNpemUgLT0gc2l6ZTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSkgeworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisgICAgICAgIGRlbGV0ZSB0ZXh0dXJlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitUZXh0dXJlKiBHcmFkaWVudENhY2hlOjpnZXQoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZS5nZXQoc2hhZGVyKTsKK30KKwordm9pZCBHcmFkaWVudENhY2hlOjpyZW1vdmUoU2tTaGFkZXIqIHNoYWRlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLnJlbW92ZShzaGFkZXIpOworfQorCit2b2lkIEdyYWRpZW50Q2FjaGU6OmNsZWFyKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1RleHR1cmUqIEdyYWRpZW50Q2FjaGU6OmFkZExpbmVhckdyYWRpZW50KFNrU2hhZGVyKiBzaGFkZXIsIGZsb2F0KiBib3VuZHMsIHVpbnQzMl90KiBjb2xvcnMsCisgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKSB7CisgICAgU2tCaXRtYXAgYml0bWFwOworICAgIGJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCAxMDI0LCAxKTsKKyAgICBiaXRtYXAuYWxsb2NQaXhlbHMoKTsKKyAgICBiaXRtYXAuZXJhc2VDb2xvcigwKTsKKworICAgIFNrQ2FudmFzIGNhbnZhcyhiaXRtYXApOworCisgICAgU2tQb2ludCBwb2ludHNbMl07CisgICAgcG9pbnRzWzBdLnNldCgwLjBmLCAwLjBmKTsKKyAgICBwb2ludHNbMV0uc2V0KGJpdG1hcC53aWR0aCgpLCAwLjBmKTsKKworICAgIFNrU2hhZGVyKiBsb2NhbFNoYWRlciA9IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcihwb2ludHMsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFNrQ29sb3IqPihjb2xvcnMpLCBwb3NpdGlvbnMsIGNvdW50LCB0aWxlTW9kZSk7CisKKyAgICBTa1BhaW50IHA7CisgICAgcC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlQW5kRmlsbF9TdHlsZSk7CisgICAgcC5zZXRTaGFkZXIobG9jYWxTaGFkZXIpLT51bnJlZigpOworCisgICAgY2FudmFzLmRyYXdSZWN0Q29vcmRzKDAuMGYsIDAuMGYsIGJpdG1hcC53aWR0aCgpLCAxLjBmLCBwKTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICAvLyBBc3VtZSB0aGUgY2FjaGUgaXMgYWx3YXlzIGJpZyBlbm91Z2gKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gYml0bWFwLnJvd0J5dGVzKCkgKiBiaXRtYXAuaGVpZ2h0KCk7CisgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBUZXh0dXJlKiB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CisgICAgZ2VuZXJhdGVUZXh0dXJlKCZiaXRtYXAsIHRleHR1cmUpOworCisgICAgbUxvY2subG9jaygpOworICAgIG1TaXplICs9IHNpemU7CisgICAgbUNhY2hlLnB1dChzaGFkZXIsIHRleHR1cmUpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHRleHR1cmU7Cit9CisKK3ZvaWQgR3JhZGllbnRDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUpIHsKKyAgICBTa0F1dG9Mb2NrUGl4ZWxzIGF1dG9Mb2NrKCpiaXRtYXApOworICAgIGlmICghYml0bWFwLT5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gc2hhZGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IGJpdG1hcC0+d2lkdGgoKTsKKyAgICB0ZXh0dXJlLT5oZWlnaHQgPSBiaXRtYXAtPmhlaWdodCgpOworCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBiaXRtYXAtPmJ5dGVzUGVyUGl4ZWwoKSk7CisKKyAgICB0ZXh0dXJlLT5ibGVuZCA9ICFiaXRtYXAtPmlzT3BhcXVlKCk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvR3JhZGllbnRDYWNoZS5oIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE4YzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0dyYWRpZW50Q2FjaGUuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0dSQURJRU5UX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICisKKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBzaW1wbGUgTFJVIGdyYWRpZW50IGNhY2hlLiBUaGUgY2FjaGUgaGFzIGEgbWF4aW11bSBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAqIEFueSB0ZXh0dXJlIGFkZGVkIHRvIHRoZSBjYWNoZSBjYXVzaW5nIHRoZSBjYWNoZSB0byBncm93IGJleW9uZCB0aGUgbWF4aW11bQorICogYWxsb3dlZCBzaXplIHdpbGwgYWxzbyBjYXVzZSB0aGUgb2xkZXN0IHRleHR1cmUgdG8gYmUga2lja2VkIG91dC4KKyAqLworY2xhc3MgR3JhZGllbnRDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrU2hhZGVyKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBHcmFkaWVudENhY2hlKCk7CisgICAgR3JhZGllbnRDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkdyYWRpZW50Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tTaGFkZXIqJiBzaGFkZXIsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgbGluZWFyIGdyYWRpZW50IHRvIHRoZSBjYWNoZS4gVGhlIGdlbmVyYXRlZCB0ZXh0dXJlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgVGV4dHVyZSogYWRkTGluZWFyR3JhZGllbnQoU2tTaGFkZXIqIHNoYWRlciwgZmxvYXQqIGJvdW5kcywgdWludDMyX3QqIGNvbG9ycywKKyAgICAgICAgICAgIGZsb2F0KiBwb3NpdGlvbnMsIGludCBjb3VudCwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVNb2RlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYWRlci4KKyAgICAgKi8KKyAgICBUZXh0dXJlKiBnZXQoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaGFkZXIuIFJldHVybnMgTlVMTAorICAgICAqIGlmIHRoZSB0ZXh0dXJlIGNhbm5vdCBiZSBmb3VuZC4gVXBvbiByZW1vdmUgdGhlIHRleHR1cmUgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tTaGFkZXIqIHNoYWRlcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldE1heFNpemUodWludDMyX3QgbWF4U2l6ZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRNYXhTaXplKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBjYWNoZSBpbiBieXRlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBnZW5lcmF0ZVRleHR1cmUoU2tCaXRtYXAqIGJpdG1hcCwgVGV4dHVyZSogdGV4dHVyZSk7CisKKyAgICBHZW5lcmF0aW9uQ2FjaGU8U2tTaGFkZXIqLCBUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGFjY2VzcyBtQ2FjaGUgYW5kIG1TaXplLiBBbGwgbWV0aG9kcyBhcmUgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZQorICAgICAqIHRocmVhZCBleGNlcHQgZm9yIHJlbW92ZSgpLgorICAgICAqLworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Cit9OyAvLyBjbGFzcyBHcmFkaWVudENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9HUkFESUVOVF9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXIuaCBiL2xpYnMvaHd1aS9MYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjcwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTGF5ZXIuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9MQVlFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUmVjdC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGltZW5zaW9ucyBvZiBhIGxheWVyLgorICovCitzdHJ1Y3QgTGF5ZXJTaXplIHsKKyAgICBMYXllclNpemUoKTogd2lkdGgoMCksIGhlaWdodCgwKSwgaWQoMCkgeyB9CisgICAgTGF5ZXJTaXplKGNvbnN0IHVpbnQzMl90IHdpZHRoLCBjb25zdCB1aW50MzJfdCBoZWlnaHQpOiB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBpZCgwKSB7IH0KKyAgICBMYXllclNpemUoY29uc3QgTGF5ZXJTaXplJiBzaXplKTogd2lkdGgoc2l6ZS53aWR0aCksIGhlaWdodChzaXplLmhlaWdodCksIGlkKHNpemUuaWQpIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworCisgICAgLy8gSW5jcmVtZW50YWwgaWQgdXNlZCBieSB0aGUgbGF5ZXIgY2FjaGUgdG8gc3RvcmUgbXVsdGlwbGUKKyAgICAvLyBMYXllclNpemUgd2l0aCB0aGUgc2FtZSBkaW1lbnNpb25zCisgICAgdWludDMyX3QgaWQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMYXllclNpemUmIHJocykgY29uc3QgeworICAgICAgICBpZiAoaWQgIT0gMCAmJiByaHMuaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGlkIDwgcmhzLmlkOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA9PSByaHMud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWlnaHQgPCByaHMuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aWR0aCA8IHJocy53aWR0aDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTaXplJiByaHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IHJocy53aWR0aCAmJiBoZWlnaHQgPT0gcmhzLmhlaWdodDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgTGF5ZXJTaXplCisKKy8qKgorICogQSBsYXllciBoYXMgZGltZW5zaW9ucyBhbmQgaXMgYmFja2VkIGJ5IGFuIE9wZW5HTCB0ZXh0dXJlLgorICovCitzdHJ1Y3QgTGF5ZXIgeworICAgIC8qKgorICAgICAqIENvb3JkaW5hdGVzIG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBSZWN0IGxheWVyOworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUgdXNlZCB0byByZW5kZXIgdGhlIGxheWVyLgorICAgICAqLworICAgIEdMdWludCB0ZXh0dXJlOworICAgIC8qKgorICAgICAqIE9wYWNpdHkgb2YgdGhlIGxheWVyLgorICAgICAqLworICAgIGludCBhbHBoYTsKKyAgICAvKioKKyAgICAgKiBCbGVuZGluZyBtb2RlIG9mIHRoZSBsYXllci4KKyAgICAgKi8KKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBsYXllciBzaG91bGQgYmUgYmxlbmRlZC4KKyAgICAgKi8KKyAgICBib29sIGJsZW5kOworfTsgLy8gc3RydWN0IExheWVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9MQVlFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAgYi9saWJzL2h3dWkvTGF5ZXJDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExODc2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9MYXllckNhY2hlLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTGF5ZXJDYWNoZS5oIgorI2luY2x1ZGUgIlByb3BlcnRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitMYXllckNhY2hlOjpMYXllckNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8TGF5ZXJTaXplLCBMYXllcio+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtSWRHZW5lcmF0b3IoMSksIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0xBWUVSX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfTEFZRVJfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgbGF5ZXIgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGxheWVyIGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFKTsKKyAgICB9Cit9CisKK0xheWVyQ2FjaGU6OkxheWVyQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPExheWVyU2l6ZSwgTGF5ZXIqPjo6a1VubGltaXRlZENhcGFjaXR5KSwKKyAgICAgICAgbUlkR2VuZXJhdG9yKDEpLCBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKK30KKworTGF5ZXJDYWNoZTo6fkxheWVyQ2FjaGUoKSB7CisgICAgY2xlYXIoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IExheWVyQ2FjaGU6OmdldFNpemUoKSB7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBMYXllckNhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIHJldHVybiBtTWF4U2l6ZTsKK30KKwordm9pZCBMYXllckNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgTGF5ZXIqIG9sZGVzdCA9IG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgZGVsZXRlTGF5ZXIob2xkZXN0KTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIExheWVyQ2FjaGU6Om9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKSB7CisgICAgZGVsZXRlTGF5ZXIobGF5ZXIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTGF5ZXJDYWNoZTo6ZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKSB7CisgICAgaWYgKGxheWVyKSB7CisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKworICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGRlbGV0ZSBsYXllcjsKKyAgICB9Cit9CisKK3ZvaWQgTGF5ZXJDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIodGhpcyk7CisgICAgbUNhY2hlLmNsZWFyKCk7CisgICAgbUNhY2hlLnNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoTlVMTCk7Cit9CisKK0xheWVyKiBMYXllckNhY2hlOjpnZXQoTGF5ZXJTaXplJiBzaXplKSB7CisgICAgTGF5ZXIqIGxheWVyID0gbUNhY2hlLnJlbW92ZShzaXplKTsKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAgTEFZRVJfTE9HRCgiUmV1c2luZyBsYXllciIpOworCisgICAgICAgIG1TaXplIC09IGxheWVyLT5sYXllci5nZXRXaWR0aCgpICogbGF5ZXItPmxheWVyLmdldEhlaWdodCgpICogNDsKKyAgICB9IGVsc2UgeworICAgICAgICBMQVlFUl9MT0dEKCJDcmVhdGluZyBuZXcgbGF5ZXIiKTsKKworICAgICAgICBsYXllciA9IG5ldyBMYXllcjsKKyAgICAgICAgbGF5ZXItPmJsZW5kID0gdHJ1ZTsKKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgdGV4dHVyZSBpbiB3aGljaCB0aGUgRkJPIHdpbGwgZHJhdworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZsYXllci0+dGV4dHVyZSk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIC8vIFRoZSBGQk8gd2lsbCBub3QgYmUgc2NhbGVkLCBzbyB3ZSBjYW4gdXNlIGxvd2VyIHF1YWxpdHkgZmlsdGVyaW5nCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKK2Jvb2wgTGF5ZXJDYWNoZTo6cHV0KExheWVyU2l6ZSYgbGF5ZXJTaXplLCBMYXllciogbGF5ZXIpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gbGF5ZXJTaXplLndpZHRoICogbGF5ZXJTaXplLmhlaWdodCAqIDQ7CisgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBsYXllciB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCisgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgIExheWVyKiBvbGRlc3QgPSBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICBkZWxldGVMYXllcihvbGRlc3QpOworICAgICAgICB9CisKKyAgICAgICAgbGF5ZXJTaXplLmlkID0gbUlkR2VuZXJhdG9yKys7CisgICAgICAgIG1DYWNoZS5wdXQobGF5ZXJTaXplLCBsYXllcik7CisgICAgICAgIG1TaXplICs9IHNpemU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvTGF5ZXJDYWNoZS5oIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL0xheWVyQ2FjaGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9MQVlFUl9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSAorCisjaW5jbHVkZSAiTGF5ZXIuaCIKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWZpbmVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIERlYnVnCisjZGVmaW5lIERFQlVHX0xBWUVSUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfTEFZRVJTCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBMQVlFUl9MT0dEKC4uLikKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBMYXllckNhY2hlOiBwdWJsaWMgT25FbnRyeVJlbW92ZWQ8TGF5ZXJTaXplLCBMYXllcio+IHsKK3B1YmxpYzoKKyAgICBMYXllckNhY2hlKCk7CisgICAgTGF5ZXJDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk7CisgICAgfkxheWVyQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoTGF5ZXJTaXplJiBzaXplLCBMYXllciomIGxheWVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxheWVyIG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLiBJZiBub3Qgc3VpdGFibGUgbGF5ZXIKKyAgICAgKiBjYW4gYmUgZm91bmQsIGEgbmV3IG9uZSBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4gSWYgY3JlYXRpbmcgYSBuZXcKKyAgICAgKiBsYXllciBmYWlscywgTlVMTCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFdoZW4gYSBsYXllciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjYWNoZSwgaXQgaXMgcmVtb3ZlZCBhbmQgdGhlIHRvdGFsCisgICAgICogc2l6ZSBvZiB0aGUgY2FjaGUgZ29lcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgVGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRlc2lyZWQgbGF5ZXIKKyAgICAgKi8KKyAgICBMYXllciogZ2V0KExheWVyU2l6ZSYgc2l6ZSk7CisgICAgLyoqCisgICAgICogQWRkcyB0aGUgbGF5ZXIgdG8gdGhlIGNhY2hlLiBUaGUgbGF5ZXIgd2lsbCBub3QgYmUgYWRkZWQgaWYgdGhlcmUgaXMKKyAgICAgKiBub3QgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSBsYXllciBUaGUgbGF5ZXIgdG8gYWRkIHRvIHRoZSBjYWNoZQorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBsYXllciB3YXMgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHB1dChMYXllclNpemUmIHNpemUsIExheWVyKiBsYXllcik7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIGxheWVycyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIHZvaWQgZGVsZXRlTGF5ZXIoTGF5ZXIqIGxheWVyKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxMYXllclNpemUsIExheWVyKj4gbUNhY2hlOworICAgIHVpbnQzMl90IG1JZEdlbmVyYXRvcjsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworfTsgLy8gY2xhc3MgTGF5ZXJDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTEFZRVJfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJzL2h3dWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguY3BwIGIvbGlicy9od3VpL01hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YWQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9NYXRyaXguY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKworI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKK3ZvaWQgTWF0cml4NDo6bG9hZElkZW50aXR5KCkgeworICAgIGRhdGFba1NjYWxlWF0gICAgICAgPSAxLjBmOworICAgIGRhdGFba1NrZXdZXSAgICAgICAgPSAwLjBmOworICAgIGRhdGFbMl0gICAgICAgICAgICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMF0gPSAwLjBmOworCisgICAgZGF0YVtrU2tld1hdICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrU2NhbGVZXSAgICAgICA9IDEuMGY7CisgICAgZGF0YVs2XSAgICAgICAgICAgICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSA9IDAuMGY7CisKKyAgICBkYXRhWzhdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhWzldICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tTY2FsZVpdICAgICAgID0gMS4wZjsKKyAgICBkYXRhWzExXSAgICAgICAgICAgID0gMC4wZjsKKworICAgIGRhdGFba1RyYW5zbGF0ZVhdICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVldICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVpdICAgPSAwLjBmOworICAgIGRhdGFba1BlcnNwZWN0aXZlMl0gPSAxLjBmOworCisgICAgbVNpbXBsZU1hdHJpeCA9IHRydWU7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBmbG9hdCogdikgeworICAgIG1lbWNweShkYXRhLCB2LCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkKGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBtZW1jcHkoZGF0YSwgdi5kYXRhLCBzaXplb2YoZGF0YSkpOworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBTa01hdHJpeCYgdikgeworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgZGF0YVtrU2NhbGVYXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWF07CisgICAgZGF0YVtrU2tld1hdICAgICAgPSB2W1NrTWF0cml4OjprTVNrZXdYXTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IHZbU2tNYXRyaXg6OmtNVHJhbnNYXTsKKworICAgIGRhdGFba1NrZXdZXSAgICAgID0gdltTa01hdHJpeDo6a01Ta2V3WV07CisgICAgZGF0YVtrU2NhbGVZXSAgICAgPSB2W1NrTWF0cml4OjprTVNjYWxlWV07CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSB2W1NrTWF0cml4OjprTVRyYW5zWV07CisKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AwXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTFdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AxXTsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdICA9IHZbU2tNYXRyaXg6OmtNUGVyc3AyXTsKKworICAgIGRhdGFba1NjYWxlWl0gPSAxLjBmOworCisgICAgbVNpbXBsZU1hdHJpeCA9ICh2LmdldFR5cGUoKSA8PSBTa01hdHJpeDo6a1NjYWxlX01hc2spOworfQorCit2b2lkIE1hdHJpeDQ6OmNvcHlUbyhTa01hdHJpeCYgdikgY29uc3QgeworICAgIHYucmVzZXQoKTsKKworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWCwgZGF0YVtrU2NhbGVYXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1gsICBkYXRhW2tTa2V3WF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVRyYW5zWCwgZGF0YVtrVHJhbnNsYXRlWF0pOworCisgICAgdi5zZXQoU2tNYXRyaXg6OmtNU2tld1ksICBkYXRhW2tTa2V3WV0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVNjYWxlWSwgZGF0YVtrU2NhbGVZXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNVHJhbnNZLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisKKyAgICB2LnNldChTa01hdHJpeDo6a01QZXJzcDAsIGRhdGFba1BlcnNwZWN0aXZlMF0pOworICAgIHYuc2V0KFNrTWF0cml4OjprTVBlcnNwMSwgZGF0YVtrUGVyc3BlY3RpdmUxXSk7CisgICAgdi5zZXQoU2tNYXRyaXg6OmtNUGVyc3AyLCBkYXRhW2tQZXJzcGVjdGl2ZTJdKTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkSW52ZXJzZShjb25zdCBNYXRyaXg0JiB2KSB7CisgICAgZG91YmxlIHNjYWxlID0gMS4wIC8KKyAgICAgICAgICAgICh2LmRhdGFba1NjYWxlWF0gKiAoKGRvdWJsZSkgdi5kYXRhW2tTY2FsZVldICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSAtCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICsKKyAgICAgICAgICAgICB2LmRhdGFba1NrZXdYXSAqICgoZG91YmxlKSB2LmRhdGFba1RyYW5zbGF0ZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTBdIC0KKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHYuZGF0YVtrU2tld1ldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdKSArCisgICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqICgoZG91YmxlKSB2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pKTsKKworICAgIGRhdGFba1NjYWxlWF0gPSAodi5kYXRhW2tTY2FsZVldICogdi5kYXRhW2tQZXJzcGVjdGl2ZTJdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrVHJhbnNsYXRlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICAqIHNjYWxlOworICAgIGRhdGFba1NrZXdYXSA9ICh2LmRhdGFba1RyYW5zbGF0ZVhdICogdi5kYXRhW2tQZXJzcGVjdGl2ZTFdIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2tld1hdICAqIHYuZGF0YVtrUGVyc3BlY3RpdmUyXSkgKiBzY2FsZTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrVHJhbnNsYXRlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2NhbGVZXSkgICogc2NhbGU7CisKKyAgICBkYXRhW2tTa2V3WV0gPSAodi5kYXRhW2tUcmFuc2xhdGVZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NrZXdZXSAgKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0pICogc2NhbGU7CisgICAgZGF0YVtrU2NhbGVZXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMl0gLQorICAgICAgICAgICAgdi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSkgICogc2NhbGU7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSAodi5kYXRhW2tUcmFuc2xhdGVYXSAqIHYuZGF0YVtrU2tld1ldIC0KKyAgICAgICAgICAgIHYuZGF0YVtrU2NhbGVYXSAgKiB2LmRhdGFba1RyYW5zbGF0ZVldKSAqIHNjYWxlOworCisgICAgZGF0YVtrUGVyc3BlY3RpdmUwXSA9ICh2LmRhdGFba1NrZXdZXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUxXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWV0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMF0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSA9ICh2LmRhdGFba1NrZXdYXSAqIHYuZGF0YVtrUGVyc3BlY3RpdmUwXSAtCisgICAgICAgICAgICB2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1BlcnNwZWN0aXZlMV0pICogc2NhbGU7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUyXSA9ICh2LmRhdGFba1NjYWxlWF0gKiB2LmRhdGFba1NjYWxlWV0gLQorICAgICAgICAgICAgdi5kYXRhW2tTa2V3WF0gKiB2LmRhdGFba1NrZXdZXSkgKiBzY2FsZTsKKworICAgIG1TaW1wbGVNYXRyaXggPSB2Lm1TaW1wbGVNYXRyaXg7Cit9CisKK3ZvaWQgTWF0cml4NDo6Y29weVRvKGZsb2F0KiB2KSBjb25zdCB7CisgICAgbWVtY3B5KHYsIGRhdGEsIHNpemVvZihkYXRhKSk7Cit9CisKK2Zsb2F0IE1hdHJpeDQ6OmdldFRyYW5zbGF0ZVgoKSB7CisgICAgcmV0dXJuIGRhdGFba1RyYW5zbGF0ZVhdOworfQorCitmbG9hdCBNYXRyaXg0OjpnZXRUcmFuc2xhdGVZKCkgeworICAgIHJldHVybiBkYXRhW2tUcmFuc2xhdGVZXTsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkVHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBsb2FkSWRlbnRpdHkoKTsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSA9IHg7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gPSB5OworICAgIGRhdGFba1RyYW5zbGF0ZVpdID0gejsKK30KKwordm9pZCBNYXRyaXg0Ojpsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1NjYWxlWF0gPSBzeDsKKyAgICBkYXRhW2tTY2FsZVldID0gc3k7CisgICAgZGF0YVtrU2NhbGVaXSA9IHN6OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRSb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTBdICA9IDAuMGY7CisgICAgZGF0YVtrUGVyc3BlY3RpdmUxXSAgPSAwLjBmOworICAgIGRhdGFbMTFdICAgICAgICAgICAgID0gMC4wZjsKKyAgICBkYXRhW2tUcmFuc2xhdGVYXSAgICA9IDAuMGY7CisgICAgZGF0YVtrVHJhbnNsYXRlWV0gICAgPSAwLjBmOworICAgIGRhdGFba1RyYW5zbGF0ZVpdICAgID0gMC4wZjsKKyAgICBkYXRhW2tQZXJzcGVjdGl2ZTJdICA9IDEuMGY7CisKKyAgICBhbmdsZSAqPSBmbG9hdChNX1BJIC8gMTgwLjBmKTsKKyAgICBmbG9hdCBjID0gY29zZihhbmdsZSk7CisgICAgZmxvYXQgcyA9IHNpbmYoYW5nbGUpOworCisgICAgY29uc3QgZmxvYXQgbGVuZ3RoID0gc3FydGYoeCAqIHggKyB5ICogeSArIHogKiB6KTsKKyAgICBmbG9hdCByZWNpcExlbiA9IDEuMGYgLyBsZW5ndGg7CisgICAgeCAqPSByZWNpcExlbjsKKyAgICB5ICo9IHJlY2lwTGVuOworICAgIHogKj0gcmVjaXBMZW47CisKKyAgICBjb25zdCBmbG9hdCBuYyA9IDEuMGYgLSBjOworICAgIGNvbnN0IGZsb2F0IHh5ID0geCAqIHk7CisgICAgY29uc3QgZmxvYXQgeXogPSB5ICogejsKKyAgICBjb25zdCBmbG9hdCB6eCA9IHogKiB4OworICAgIGNvbnN0IGZsb2F0IHhzID0geCAqIHM7CisgICAgY29uc3QgZmxvYXQgeXMgPSB5ICogczsKKyAgICBjb25zdCBmbG9hdCB6cyA9IHogKiBzOworCisgICAgZGF0YVtrU2NhbGVYXSA9IHggKiB4ICogbmMgKyAgYzsKKyAgICBkYXRhW2tTa2V3WF0gID0gICAgeHkgKiBuYyAtIHpzOworICAgIGRhdGFbOF0gICAgICAgPSAgICB6eCAqIG5jICsgeXM7CisgICAgZGF0YVtrU2tld1ldICA9ICAgIHh5ICogbmMgKyB6czsKKyAgICBkYXRhW2tTY2FsZVldID0geSAqIHkgKiBuYyArICBjOworICAgIGRhdGFbOV0gICAgICAgPSAgICB5eiAqIG5jIC0geHM7CisgICAgZGF0YVsyXSAgICAgICA9ICAgIHp4ICogbmMgLSB5czsKKyAgICBkYXRhWzZdICAgICAgID0gICAgeXogKiBuYyArIHhzOworICAgIGRhdGFba1NjYWxlWl0gPSB6ICogeiAqIG5jICsgIGM7CisKKyAgICBtU2ltcGxlTWF0cml4ID0gZmFsc2U7Cit9CisKK3ZvaWQgTWF0cml4NDo6bG9hZE11bHRpcGx5KGNvbnN0IE1hdHJpeDQmIHUsIGNvbnN0IE1hdHJpeDQmIHYpIHsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCA0IDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHggPSAwOworICAgICAgICBmbG9hdCB5ID0gMDsKKyAgICAgICAgZmxvYXQgeiA9IDA7CisgICAgICAgIGZsb2F0IHcgPSAwOworCisgICAgICAgIGZvciAoaW50IGogPSAwIDsgaiA8IDQgOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGUgPSB2LmdldChpLCBqKTsKKyAgICAgICAgICAgIHggKz0gdS5nZXQoaiwgMCkgKiBlOworICAgICAgICAgICAgeSArPSB1LmdldChqLCAxKSAqIGU7CisgICAgICAgICAgICB6ICs9IHUuZ2V0KGosIDIpICogZTsKKyAgICAgICAgICAgIHcgKz0gdS5nZXQoaiwgMykgKiBlOworICAgICAgICB9CisKKyAgICAgICAgc2V0KGksIDAsIHgpOworICAgICAgICBzZXQoaSwgMSwgeSk7CisgICAgICAgIHNldChpLCAyLCB6KTsKKyAgICAgICAgc2V0KGksIDMsIHcpOworICAgIH0KKworICAgIG1TaW1wbGVNYXRyaXggPSB1Lm1TaW1wbGVNYXRyaXggJiYgdi5tU2ltcGxlTWF0cml4OworfQorCit2b2lkIE1hdHJpeDQ6OmxvYWRPcnRobyhmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIGxvYWRJZGVudGl0eSgpOworICAgIGRhdGFba1NjYWxlWF0gPSAyLjBmIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgZGF0YVtrU2NhbGVZXSA9IDIuMGYgLyAodG9wIC0gYm90dG9tKTsKKyAgICBkYXRhW2tTY2FsZVpdID0gLTIuMGYgLyAoZmFyIC0gbmVhcik7CisgICAgZGF0YVtrVHJhbnNsYXRlWF0gPSAtKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBkYXRhW2tUcmFuc2xhdGVZXSA9IC0odG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pOworICAgIGRhdGFba1RyYW5zbGF0ZVpdID0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworI2RlZmluZSBNVUxfQUREX1NUT1JFKGEsIGIsIGMpIGEgPSAoYSkgKiAoYikgKyAoYykKKwordm9pZCBNYXRyaXg0OjptYXBQb2ludChmbG9hdCYgeCwgZmxvYXQmIHkpIGNvbnN0IHsKKyAgICBpZiAobVNpbXBsZU1hdHJpeCkgeworICAgICAgICBNVUxfQUREX1NUT1JFKHgsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRSh5LCBkYXRhW2tTY2FsZVldLCBkYXRhW2tUcmFuc2xhdGVZXSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCBkeCA9IHggKiBkYXRhW2tTY2FsZVhdICsgeSAqIGRhdGFba1NrZXdYXSArIGRhdGFba1RyYW5zbGF0ZVhdOworICAgIGZsb2F0IGR5ID0geCAqIGRhdGFba1NrZXdZXSArIHkgKiBkYXRhW2tTY2FsZVldICsgZGF0YVtrVHJhbnNsYXRlWV07CisgICAgZmxvYXQgZHogPSB4ICogZGF0YVtrUGVyc3BlY3RpdmUwXSArIHkgKiBkYXRhW2tQZXJzcGVjdGl2ZTFdICsgZGF0YVtrUGVyc3BlY3RpdmUyXTsKKyAgICBpZiAoZHopIGR6ID0gMS4wZiAvIGR6OworCisgICAgeCA9IGR4ICogZHo7CisgICAgeSA9IGR5ICogZHo7Cit9CisKK3ZvaWQgTWF0cml4NDo6bWFwUmVjdChSZWN0JiByKSBjb25zdCB7CisgICAgaWYgKG1TaW1wbGVNYXRyaXgpIHsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLmxlZnQsIGRhdGFba1NjYWxlWF0sIGRhdGFba1RyYW5zbGF0ZVhdKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLnJpZ2h0LCBkYXRhW2tTY2FsZVhdLCBkYXRhW2tUcmFuc2xhdGVYXSk7CisgICAgICAgIE1VTF9BRERfU1RPUkUoci50b3AsIGRhdGFba1NjYWxlWV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICAgICAgTVVMX0FERF9TVE9SRShyLmJvdHRvbSwgZGF0YVtrU2NhbGVZXSwgZGF0YVtrVHJhbnNsYXRlWV0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgdmVydGljZXNbXSA9IHsKKyAgICAgICAgci5sZWZ0LCByLnRvcCwKKyAgICAgICAgci5yaWdodCwgci50b3AsCisgICAgICAgIHIucmlnaHQsIHIuYm90dG9tLAorICAgICAgICByLmxlZnQsIHIuYm90dG9tCisgICAgfTsKKworICAgIGZsb2F0IHgsIHksIHo7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrPSAyKSB7CisgICAgICAgIGZsb2F0IHB4ID0gdmVydGljZXNbaV07CisgICAgICAgIGZsb2F0IHB5ID0gdmVydGljZXNbaSArIDFdOworCisgICAgICAgIHggPSBweCAqIGRhdGFba1NjYWxlWF0gKyBweSAqIGRhdGFba1NrZXdYXSArIGRhdGFba1RyYW5zbGF0ZVhdOworICAgICAgICB5ID0gcHggKiBkYXRhW2tTa2V3WV0gKyBweSAqIGRhdGFba1NjYWxlWV0gKyBkYXRhW2tUcmFuc2xhdGVZXTsKKyAgICAgICAgeiA9IHB4ICogZGF0YVtrUGVyc3BlY3RpdmUwXSArIHB5ICogZGF0YVtrUGVyc3BlY3RpdmUxXSArIGRhdGFba1BlcnNwZWN0aXZlMl07CisgICAgICAgIGlmICh6KSB6ID0gMS4wZiAvIHo7CisKKyAgICAgICAgdmVydGljZXNbaV0gPSB4ICogejsKKyAgICAgICAgdmVydGljZXNbaSArIDFdID0geSAqIHo7CisgICAgfQorCisgICAgci5sZWZ0ID0gci5yaWdodCA9IHZlcnRpY2VzWzBdOworICAgIHIudG9wID0gci5ib3R0b20gPSB2ZXJ0aWNlc1sxXTsKKworICAgIGZvciAoaW50IGkgPSAyOyBpIDwgODsgaSArPSAyKSB7CisgICAgICAgIHggPSB2ZXJ0aWNlc1tpXTsKKyAgICAgICAgeSA9IHZlcnRpY2VzW2kgKyAxXTsKKworICAgICAgICBpZiAoeCA8IHIubGVmdCkgci5sZWZ0ID0geDsKKyAgICAgICAgZWxzZSBpZiAoeCA+IHIucmlnaHQpIHIucmlnaHQgPSB4OworICAgICAgICBpZiAoeSA8IHIudG9wKSByLnRvcCA9IHk7CisgICAgICAgIGVsc2UgaWYgKHkgPiByLmJvdHRvbSkgci5ib3R0b20gPSB5OworICAgIH0KK30KKwordm9pZCBNYXRyaXg0OjpkdW1wKCkgY29uc3QgeworICAgIExPR0QoIk1hdHJpeDRbc2ltcGxlPSVkIiwgbVNpbXBsZU1hdHJpeCk7CisgICAgTE9HRCgiICAlZiAlZiAlZiAlZiIsIGRhdGFba1NjYWxlWF0sIGRhdGFba1NrZXdYXSwgZGF0YVs4XSwgZGF0YVtrVHJhbnNsYXRlWF0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhW2tTa2V3WV0sIGRhdGFba1NjYWxlWV0sIGRhdGFbOV0sIGRhdGFba1RyYW5zbGF0ZVldKTsKKyAgICBMT0dEKCIgICVmICVmICVmICVmIiwgZGF0YVsyXSwgZGF0YVs2XSwgZGF0YVtrU2NhbGVaXSwgZGF0YVtrVHJhbnNsYXRlWl0pOworICAgIExPR0QoIiAgJWYgJWYgJWYgJWYiLCBkYXRhW2tQZXJzcGVjdGl2ZTBdLCBkYXRhW2tQZXJzcGVjdGl2ZTFdLCBkYXRhWzExXSwgZGF0YVtrUGVyc3BlY3RpdmUyXSk7CisgICAgTE9HRCgiXSIpOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguaCBiL2xpYnMvaHd1aS9NYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQ3YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL01hdHJpeC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX01BVFJJWF9ICisjZGVmaW5lIEFORFJPSURfVUlfTUFUUklYX0gKKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJSZWN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xhc3NlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBNYXRyaXg0IHsKK3B1YmxpYzoKKyAgICBmbG9hdCBkYXRhWzE2XTsKKworICAgIGVudW0gRW50cnkgeworICAgICAgICBrU2NhbGVYID0gMCwKKyAgICAgICAga1NrZXdZID0gMSwKKyAgICAgICAga1BlcnNwZWN0aXZlMCA9IDMsCisgICAgICAgIGtTa2V3WCA9IDQsCisgICAgICAgIGtTY2FsZVkgPSA1LAorICAgICAgICBrUGVyc3BlY3RpdmUxID0gNywKKyAgICAgICAga1NjYWxlWiA9IDEwLAorICAgICAgICBrVHJhbnNsYXRlWCA9IDEyLAorICAgICAgICBrVHJhbnNsYXRlWSA9IDEzLAorICAgICAgICBrVHJhbnNsYXRlWiA9IDE0LAorICAgICAgICBrUGVyc3BlY3RpdmUyID0gMTUKKyAgICB9OworCisgICAgTWF0cml4NCgpIHsKKyAgICAgICAgbG9hZElkZW50aXR5KCk7CisgICAgfQorCisgICAgTWF0cml4NChjb25zdCBmbG9hdCogdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBsb2FkKHYpOworICAgIH0KKworICAgIE1hdHJpeDQoY29uc3QgU2tNYXRyaXgmIHYpIHsKKyAgICAgICAgbG9hZCh2KTsKKyAgICB9CisKKyAgICB2b2lkIGxvYWRJZGVudGl0eSgpOworCisgICAgdm9pZCBsb2FkKGNvbnN0IGZsb2F0KiB2KTsKKyAgICB2b2lkIGxvYWQoY29uc3QgTWF0cml4NCYgdik7CisgICAgdm9pZCBsb2FkKGNvbnN0IFNrTWF0cml4JiB2KTsKKworICAgIHZvaWQgbG9hZEludmVyc2UoY29uc3QgTWF0cml4NCYgdik7CisKKyAgICB2b2lkIGxvYWRUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7CisgICAgdm9pZCBsb2FkU2NhbGUoZmxvYXQgc3gsIGZsb2F0IHN5LCBmbG9hdCBzeik7CisgICAgdm9pZCBsb2FkUm90YXRlKGZsb2F0IGFuZ2xlLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KTsKKyAgICB2b2lkIGxvYWRNdWx0aXBseShjb25zdCBNYXRyaXg0JiB1LCBjb25zdCBNYXRyaXg0JiB2KTsKKworICAgIHZvaWQgbG9hZE9ydGhvKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGZsb2F0IHRvcCwgZmxvYXQgbmVhciwgZmxvYXQgZmFyKTsKKworICAgIHZvaWQgbXVsdGlwbHkoY29uc3QgTWF0cml4NCYgdikgeworICAgICAgICBNYXRyaXg0IHU7CisgICAgICAgIHUubG9hZE11bHRpcGx5KCp0aGlzLCB2KTsKKyAgICAgICAgbG9hZCh1KTsKKyAgICB9CisKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgIE1hdHJpeDQgdTsKKyAgICAgICAgdS5sb2FkVHJhbnNsYXRlKHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIHNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgZmxvYXQgc3opIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRTY2FsZShzeCwgc3ksIHN6KTsKKyAgICAgICAgbXVsdGlwbHkodSk7CisgICAgfQorCisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5nbGUsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICAgICAgTWF0cml4NCB1OworICAgICAgICB1LmxvYWRSb3RhdGUoYW5nbGUsIHgsIHksIHopOworICAgICAgICBtdWx0aXBseSh1KTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHlUbyhmbG9hdCogdikgY29uc3Q7CisgICAgdm9pZCBjb3B5VG8oU2tNYXRyaXgmIHYpIGNvbnN0OworCisgICAgdm9pZCBtYXBSZWN0KFJlY3QmIHIpIGNvbnN0OworICAgIHZvaWQgbWFwUG9pbnQoZmxvYXQmIHgsIGZsb2F0JiB5KSBjb25zdDsKKworICAgIGZsb2F0IGdldFRyYW5zbGF0ZVgoKTsKKyAgICBmbG9hdCBnZXRUcmFuc2xhdGVZKCk7CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBib29sIG1TaW1wbGVNYXRyaXg7CisKKyAgICBpbmxpbmUgZmxvYXQgZ2V0KGludCBpLCBpbnQgaikgY29uc3QgeworICAgICAgICByZXR1cm4gZGF0YVtpICogNCArIGpdOworICAgIH0KKworICAgIGlubGluZSB2b2lkIHNldChpbnQgaSwgaW50IGosIGZsb2F0IHYpIHsKKyAgICAgICAgZGF0YVtpICogNCArIGpdID0gdjsKKyAgICB9Cit9OyAvLyBjbGFzcyBNYXRyaXg0CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFR5cGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgTWF0cml4NCBtYXQ0OworCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfTUFUUklYX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9OT1RJQ0UgYi9saWJzL2h3dWkvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjNDg4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTAsMCArMSwxMDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8U2tDYW52YXMuaD4KKyNpbmNsdWRlIDxTa1R5cGVmYWNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQgMworCisvLyBHZW5lcmF0ZXMgc2ltcGxlIGFuZCB0ZXh0dXJlZCB2ZXJ0aWNlcworI2RlZmluZSBGVih4LCB5LCB1LCB2KSB7IHsgeCwgeSB9LCB7IHUsIHYgfSB9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdsb2JhbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBhcnJheSBpcyBuZXZlciB1c2VkIGRpcmVjdGx5IGJ1dCB1c2VkIGFzIGEgbWVtY3B5IHNvdXJjZSBpbiB0aGUKKy8vIE9wZW5HTFJlbmRlcmVyIGNvbnN0cnVjdG9yCitzdGF0aWMgY29uc3QgVGV4dHVyZVZlcnRleCBnTWVzaFZlcnRpY2VzW10gPSB7CisgICAgICAgIEZWKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLAorICAgICAgICBGVigxLjBmLCAwLjBmLCAxLjBmLCAwLjBmKSwKKyAgICAgICAgRlYoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiksCisgICAgICAgIEZWKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpCit9Oworc3RhdGljIGNvbnN0IEdMc2l6ZWkgZ01lc2hTdHJpZGUgPSBzaXplb2YoVGV4dHVyZVZlcnRleCk7CitzdGF0aWMgY29uc3QgR0xzaXplaSBnTWVzaENvdW50ID0gNDsKKworLyoqCisgKiBTdHJ1Y3R1cmUgbWFwcGluZyBTa2lhIHhmZXJtb2RlcyB0byBPcGVuR0wgYmxlbmRpbmcgZmFjdG9ycy4KKyAqLworc3RydWN0IEJsZW5kZXIgeworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBHTGVudW0gc3JjOworICAgIEdMZW51bSBkc3Q7Cit9OyAvLyBzdHJ1Y3QgQmxlbmRlcgorCisvLyBJbiB0aGlzIGFycmF5LCB0aGUgaW5kZXggb2YgZWFjaCBCbGVuZGVyIGVxdWFscyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0CisvLyBlbnRyeS4gRm9yIGluc3RhbmNlLCBnQmxlbmRzWzFdID09IGdCbGVuZHNbU2tYZmVybW9kZTo6a1NyY19Nb2RlXQorc3RhdGljIGNvbnN0IEJsZW5kZXIgZ0JsZW5kc1tdID0geworICAgICAgICB7IFNrWGZlcm1vZGU6OmtDbGVhcl9Nb2RlLCAgIEdMX1pFUk8sICAgICAgICAgICAgICAgICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY19Nb2RlLCAgICAgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0X01vZGUsICAgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZSwgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0T3Zlcl9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0luX01vZGUsICAgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0SW5fTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY091dF9Nb2RlLCAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprRHN0T3V0X01vZGUsICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtTcmNBVG9wX01vZGUsIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEFUb3BfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtYb3JfTW9kZSwgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0KK307CisKK3N0YXRpYyBjb25zdCBCbGVuZGVyIGdCbGVuZHNTd2FwW10gPSB7CisgICAgICAgIHsgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUsICAgR0xfWkVSTywgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjX01vZGUsICAgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdF9Nb2RlLCAgICAgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCAgR0xfT05FIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdE92ZXJfTW9kZSwgR0xfT05FLCAgICAgICAgICAgICAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjSW5fTW9kZSwgICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a0RzdEluX01vZGUsICAgR0xfRFNUX0FMUEhBLCAgICAgICAgICAgIEdMX1pFUk8gfSwKKyAgICAgICAgeyBTa1hmZXJtb2RlOjprU3JjT3V0X01vZGUsICBHTF9aRVJPLCAgICAgICAgICAgICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RPdXRfTW9kZSwgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEsICBHTF9aRVJPIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1NyY0FUb3BfTW9kZSwgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX1NSQ19BTFBIQSB9LAorICAgICAgICB7IFNrWGZlcm1vZGU6OmtEc3RBVG9wX01vZGUsIEdMX0RTVF9BTFBIQSwgICAgICAgICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBIH0sCisgICAgICAgIHsgU2tYZmVybW9kZTo6a1hvcl9Nb2RlLCAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgfQorfTsKKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09wZW5HTFJlbmRlcmVyOjpPcGVuR0xSZW5kZXJlcigpOiBtQ2FjaGVzKENhY2hlczo6Z2V0SW5zdGFuY2UoKSkgeworICAgIExPR0QoIkNyZWF0ZSBPcGVuR0xSZW5kZXJlciIpOworCisgICAgbVNoYWRlciA9IE5VTEw7CisgICAgbUNvbG9yRmlsdGVyID0gTlVMTDsKKyAgICBtSGFzU2hhZG93ID0gZmFsc2U7CisKKyAgICBtZW1jcHkobU1lc2hWZXJ0aWNlcywgZ01lc2hWZXJ0aWNlcywgc2l6ZW9mKGdNZXNoVmVydGljZXMpKTsKKworICAgIG1GaXJzdFNuYXBzaG90ID0gbmV3IFNuYXBzaG90OworCisgICAgR0xpbnQgbWF4VGV4dHVyZVVuaXRzOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZtYXhUZXh0dXJlVW5pdHMpOworICAgIGlmIChtYXhUZXh0dXJlVW5pdHMgPCBSRVFVSVJFRF9URVhUVVJFX1VOSVRTX0NPVU5UKSB7CisgICAgICAgIExPR1coIkF0IGxlYXN0ICVkIHRleHR1cmUgdW5pdHMgYXJlIHJlcXVpcmVkISIsIFJFUVVJUkVEX1RFWFRVUkVfVU5JVFNfQ09VTlQpOworICAgIH0KK30KKworT3BlbkdMUmVuZGVyZXI6On5PcGVuR0xSZW5kZXJlcigpIHsKKyAgICBMT0dEKCJEZXN0cm95IE9wZW5HTFJlbmRlcmVyIik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNldHVwCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldFZpZXdwb3J0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgbU9ydGhvTWF0cml4LmxvYWRPcnRobygwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpwcmVwYXJlKCkgeworICAgIG1TbmFwc2hvdCA9IG5ldyBTbmFwc2hvdChtRmlyc3RTbmFwc2hvdCwKKyAgICAgICAgICAgIFNrQ2FudmFzOjprTWF0cml4X1NhdmVGbGFnIHwgU2tDYW52YXM6OmtDbGlwX1NhdmVGbGFnKTsKKyAgICBtU2F2ZUNvdW50ID0gMTsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworCisgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGdsU2Npc3NvcigwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOworCisgICAgbVNuYXBzaG90LT5zZXRDbGlwKDAuMGYsIDAuMGYsIG1XaWR0aCwgbUhlaWdodCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmFjcXVpcmVDb250ZXh0KCkgeworICAgIGlmIChtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtKSB7CisgICAgICAgIGlmIChtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5pc0luVXNlKCkpIHsKKyAgICAgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnJlbW92ZSgpOworICAgICAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlbGVhc2VDb250ZXh0KCkgeworICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgc2V0U2Npc3NvckZyb21DbGlwKCk7CisKKyAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKKworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKKworICAgIGlmIChtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUNhY2hlcy5sYXN0U3JjTW9kZSwgbUNhY2hlcy5sYXN0RHN0TW9kZSk7CisgICAgICAgIGdsQmxlbmRFcXVhdGlvbihHTF9GVU5DX0FERCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN0YXRlIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IE9wZW5HTFJlbmRlcmVyOjpnZXRTYXZlQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TYXZlQ291bnQ7Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZShpbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gc2F2ZVNuYXBzaG90KGZsYWdzKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzdG9yZSgpIHsKKyAgICBpZiAobVNhdmVDb3VudCA+IDEpIHsKKyAgICAgICAgcmVzdG9yZVNuYXBzaG90KCk7CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KSB7CisgICAgaWYgKHNhdmVDb3VudCA8IDEpIHNhdmVDb3VudCA9IDE7CisKKyAgICB3aGlsZSAobVNhdmVDb3VudCA+IHNhdmVDb3VudCkgeworICAgICAgICByZXN0b3JlU25hcHNob3QoKTsKKyAgICB9Cit9CisKK2ludCBPcGVuR0xSZW5kZXJlcjo6c2F2ZVNuYXBzaG90KGludCBmbGFncykgeworICAgIG1TbmFwc2hvdCA9IG5ldyBTbmFwc2hvdChtU25hcHNob3QsIGZsYWdzKTsKKyAgICByZXR1cm4gbVNhdmVDb3VudCsrOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpyZXN0b3JlU25hcHNob3QoKSB7CisgICAgYm9vbCByZXN0b3JlQ2xpcCA9IG1TbmFwc2hvdC0+ZmxhZ3MgJiBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0OworICAgIGJvb2wgcmVzdG9yZUxheWVyID0gbVNuYXBzaG90LT5mbGFncyAmIFNuYXBzaG90OjprRmxhZ0lzTGF5ZXI7CisKKyAgICBzcDxTbmFwc2hvdD4gY3VycmVudCA9IG1TbmFwc2hvdDsKKyAgICBzcDxTbmFwc2hvdD4gcHJldmlvdXMgPSBtU25hcHNob3QtPnByZXZpb3VzOworCisgICAgbVNhdmVDb3VudC0tOworICAgIG1TbmFwc2hvdCA9IHByZXZpb3VzOworCisgICAgaWYgKHJlc3RvcmVMYXllcikgeworICAgICAgICBjb21wb3NlTGF5ZXIoY3VycmVudCwgcHJldmlvdXMpOworICAgIH0KKworICAgIGlmIChyZXN0b3JlQ2xpcCkgeworICAgICAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdG9yZUNsaXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExheWVycworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllcihmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFNrUGFpbnQqIHAsIGludCBmbGFncykgeworICAgIGludCBjb3VudCA9IHNhdmVTbmFwc2hvdChmbGFncyk7CisKKyAgICBpbnQgYWxwaGEgPSAyNTU7CisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworCisgICAgaWYgKHApIHsKKyAgICAgICAgYWxwaGEgPSBwLT5nZXRBbHBoYSgpOworICAgICAgICBpZiAoIW1FeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkgeworICAgICAgICAgICAgY29uc3QgYm9vbCBpc01vZGUgPSBTa1hmZXJtb2RlOjpJc01vZGUocC0+Z2V0WGZlcm1vZGUoKSwgJm1vZGUpOworICAgICAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgU1JDX09WRVIKKyAgICAgICAgICAgICAgICBtb2RlID0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZGUgPSBnZXRYZmVybW9kZShwLT5nZXRYZmVybW9kZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgIH0KKworICAgIGNyZWF0ZUxheWVyKG1TbmFwc2hvdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBhbHBoYSwgbW9kZSwgZmxhZ3MpOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgT3BlbkdMUmVuZGVyZXI6OnNhdmVMYXllckFscGhhKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGFscGhhLCBpbnQgZmxhZ3MpIHsKKyAgICBpZiAoYWxwaGEgPT0gMHhmZikgeworICAgICAgICByZXR1cm4gc2F2ZUxheWVyKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgTlVMTCwgZmxhZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAgIHBhaW50LnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgcmV0dXJuIHNhdmVMYXllcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sICZwYWludCwgZmxhZ3MpOworICAgIH0KK30KKworYm9vbCBPcGVuR0xSZW5kZXJlcjo6Y3JlYXRlTGF5ZXIoc3A8U25hcHNob3Q+IHNuYXBzaG90LCBmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsCisgICAgICAgIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLGludCBmbGFncykgeworICAgIExBWUVSX0xPR0QoIlJlcXVlc3RpbmcgbGF5ZXIgJWZ4JWYiLCByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCk7CisgICAgTEFZRVJfTE9HRCgiTGF5ZXIgY2FjaGUgc2l6ZSA9ICVkIiwgbUNhY2hlcy5sYXllckNhY2hlLmdldFNpemUoKSk7CisKKyAgICAvLyBXaW5kb3cgY29vcmRpbmF0ZXMgb2YgdGhlIGxheWVyCisgICAgUmVjdCBib3VuZHMobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bWFwUmVjdChib3VuZHMpOworCisgICAgTGF5ZXJTaXplIHNpemUoYm91bmRzLmdldFdpZHRoKCksIGJvdW5kcy5nZXRIZWlnaHQoKSk7CisKKyAgICBMYXllciogbGF5ZXIgPSBtQ2FjaGVzLmxheWVyQ2FjaGUuZ2V0KHNpemUpOworICAgIGlmICghbGF5ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxheWVyLT5tb2RlID0gbW9kZTsKKyAgICBsYXllci0+YWxwaGEgPSBhbHBoYTsKKyAgICBsYXllci0+bGF5ZXIuc2V0KGJvdW5kcyk7CisKKyAgICAvLyBTYXZlIHRoZSBsYXllciBpbiB0aGUgc25hcHNob3QKKyAgICBzbmFwc2hvdC0+ZmxhZ3MgfD0gU25hcHNob3Q6OmtGbGFnSXNMYXllcjsKKyAgICBzbmFwc2hvdC0+bGF5ZXIgPSBsYXllcjsKKworICAgIC8vIENvcHkgdGhlIGZyYW1lYnVmZmVyIGludG8gdGhlIGxheWVyCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBsYXllci0+dGV4dHVyZSk7CisgICAgZ2xDb3B5VGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCBib3VuZHMubGVmdCwgbUhlaWdodCAtIGJvdW5kcy5ib3R0b20sCisgICAgICAgICAgICBib3VuZHMuZ2V0V2lkdGgoKSwgYm91bmRzLmdldEhlaWdodCgpLCAwKTsKKworICAgIGlmIChmbGFncyAmIFNrQ2FudmFzOjprQ2xpcFRvTGF5ZXJfU2F2ZUZsYWcpIHsKKyAgICAgICAgaWYgKG1TbmFwc2hvdC0+Y2xpcFRyYW5zZm9ybWVkKGJvdW5kcykpIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KKworICAgIC8vIEVucXVldWUgdGhlIGJ1ZmZlciBjb29yZGluYXRlcyB0byBjbGVhciB0aGUgY29ycmVzcG9uZGluZyByZWdpb24gbGF0ZXIKKyAgICBtTGF5ZXJzLnB1c2gobmV3IFJlY3QoYm91bmRzKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpIHsKKyAgICBpZiAoIWN1cnJlbnQtPmxheWVyKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gY29tcG9zZSBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAgZnJvbSB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKnByZXZpb3VzLT5jbGlwUmVjdDsKKyAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtSGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7CisKKyAgICBMYXllciogbGF5ZXIgPSBjdXJyZW50LT5sYXllcjsKKyAgICBjb25zdCBSZWN0JiByZWN0ID0gbGF5ZXItPmxheWVyOworCisgICAgaWYgKGxheWVyLT5hbHBoYSA8IDI1NSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jU2VwYXJhdGUoR0xfWkVSTywgR0xfU1JDX0FMUEhBLCBHTF9EU1RfQUxQSEEsIEdMX1pFUk8pOworCisgICAgICAgIGRyYXdDb2xvclJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgbGF5ZXItPmFscGhhIDw8IDI0LCBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlLCB0cnVlLCB0cnVlKTsKKworICAgICAgICBnbEJsZW5kRnVuYyhtQ2FjaGVzLmxhc3RTcmNNb2RlLCBtQ2FjaGVzLmxhc3REc3RNb2RlKTsKKyAgICAgICAgaWYgKCFtQ2FjaGVzLmJsZW5kKSB7CisgICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGF5ZXJzIGFyZSBhbHJlYWR5IGRyYXduIHdpdGggYSB0b3AtbGVmdCBvcmlnaW4sIGRvbid0IGZsaXAgdGhlIHRleHR1cmUKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDEuMGYsIDEuMGYsIDAuMGYpOworCisgICAgZHJhd1RleHR1cmVNZXNoKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBsYXllci0+dGV4dHVyZSwKKyAgICAgICAgICAgIDEuMGYsIGxheWVyLT5tb2RlLCBsYXllci0+YmxlbmQsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLAorICAgICAgICAgICAgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCwgMCwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworCisgICAgTGF5ZXJTaXplIHNpemUocmVjdC5nZXRXaWR0aCgpLCByZWN0LmdldEhlaWdodCgpKTsKKyAgICAvLyBGYWlsaW5nIHRvIGFkZCB0aGUgbGF5ZXIgdG8gdGhlIGNhY2hlIHNob3VsZCBoYXBwZW4gb25seSBpZiB0aGUKKyAgICAvLyBsYXllciBpcyB0b28gbGFyZ2UKKyAgICBpZiAoIW1DYWNoZXMubGF5ZXJDYWNoZS5wdXQoc2l6ZSwgbGF5ZXIpKSB7CisgICAgICAgIExBWUVSX0xPR0QoIkRlbGV0aW5nIGxheWVyIik7CisKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbGF5ZXItPnRleHR1cmUpOworCisgICAgICAgIGRlbGV0ZSBsYXllcjsKKyAgICB9Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNsZWFyTGF5ZXJSZWdpb25zKCkgeworICAgIGlmIChtTGF5ZXJzLnNpemUoKSA9PSAwKSByZXR1cm47CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUxheWVycy5zaXplKCk7IGkrKykgeworICAgICAgICBSZWN0KiBib3VuZHMgPSBtTGF5ZXJzLml0ZW1BdChpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgZnJhbWVidWZmZXIgd2hlcmUgdGhlIGxheWVyIHdpbGwgZHJhdworICAgICAgICBnbFNjaXNzb3IoYm91bmRzLT5sZWZ0LCBtSGVpZ2h0IC0gYm91bmRzLT5ib3R0b20sCisgICAgICAgICAgICAgICAgYm91bmRzLT5nZXRXaWR0aCgpLCBib3VuZHMtPmdldEhlaWdodCgpKTsKKyAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgICAgIGRlbGV0ZSBib3VuZHM7CisgICAgfQorICAgIG1MYXllcnMuY2xlYXIoKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIGNsaXAKKyAgICBzZXRTY2lzc29yRnJvbUNsaXAoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHJhbnNmb3JtcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjp0cmFuc2xhdGUoZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgbVNuYXBzaG90LT50cmFuc2Zvcm0tPnRyYW5zbGF0ZShkeCwgZHksIDAuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpyb3RhdGUoZmxvYXQgZGVncmVlcykgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5yb3RhdGUoZGVncmVlcywgMC4wZiwgMC4wZiwgMS4wZik7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5zY2FsZShzeCwgc3ksIDEuMGYpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5sb2FkKCptYXRyaXgpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5jb3B5VG8oKm1hdHJpeCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmNvbmNhdE1hdHJpeChTa01hdHJpeCogbWF0cml4KSB7CisgICAgbWF0NCBtKCptYXRyaXgpOworICAgIG1TbmFwc2hvdC0+dHJhbnNmb3JtLT5tdWx0aXBseShtKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2xpcHBpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0U2Npc3NvckZyb21DbGlwKCkgeworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSAqbVNuYXBzaG90LT5jbGlwUmVjdDsKKyAgICBnbFNjaXNzb3IoY2xpcC5sZWZ0LCBtSGVpZ2h0IC0gY2xpcC5ib3R0b20sIGNsaXAuZ2V0V2lkdGgoKSwgY2xpcC5nZXRIZWlnaHQoKSk7Cit9CisKK2NvbnN0IFJlY3QmIE9wZW5HTFJlbmRlcmVyOjpnZXRDbGlwQm91bmRzKCkgeworICAgIHJldHVybiBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworfQorCitib29sIE9wZW5HTFJlbmRlcmVyOjpxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIHsKKyAgICBSZWN0IHIobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBtU25hcHNob3QtPnRyYW5zZm9ybS0+bWFwUmVjdChyKTsKKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QtPmludGVyc2VjdHMocik7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OmNsaXBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgU2tSZWdpb246Ok9wIG9wKSB7CisgICAgYm9vbCBjbGlwcGVkID0gbVNuYXBzaG90LT5jbGlwKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgb3ApOworICAgIGlmIChjbGlwcGVkKSB7CisgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworICAgIH0KKyAgICByZXR1cm4gIW1TbmFwc2hvdC0+Y2xpcFJlY3QtPmlzRW1wdHkoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBjb25zdCBmbG9hdCByaWdodCA9IGxlZnQgKyBiaXRtYXAtPndpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgYm90dG9tID0gdG9wICsgYml0bWFwLT5oZWlnaHQoKTsKKworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGRyYXdUZXh0dXJlUmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIFJlY3QgcigwLjBmLCAwLjBmLCBiaXRtYXAtPndpZHRoKCksIGJpdG1hcC0+aGVpZ2h0KCkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNmb3JtKCptYXRyaXgpOworICAgIHRyYW5zZm9ybS5tYXBSZWN0KHIpOworCisgICAgaWYgKHF1aWNrUmVqZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBkcmF3VGV4dHVyZVJlY3Qoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20sIHRleHR1cmUsIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLAorICAgICAgICAgZmxvYXQgc3JjTGVmdCwgZmxvYXQgc3JjVG9wLCBmbG9hdCBzcmNSaWdodCwgZmxvYXQgc3JjQm90dG9tLAorICAgICAgICAgZmxvYXQgZHN0TGVmdCwgZmxvYXQgZHN0VG9wLCBmbG9hdCBkc3RSaWdodCwgZmxvYXQgZHN0Qm90dG9tLAorICAgICAgICAgY29uc3QgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAocXVpY2tSZWplY3QoZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy50ZXh0dXJlQ2FjaGUuZ2V0KGJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgY29uc3QgQXV0b1RleHR1cmUgYXV0b0NsZWFudXAodGV4dHVyZSk7CisKKyAgICBjb25zdCBmbG9hdCB3aWR0aCA9IHRleHR1cmUtPndpZHRoOworICAgIGNvbnN0IGZsb2F0IGhlaWdodCA9IHRleHR1cmUtPmhlaWdodDsKKworICAgIGNvbnN0IGZsb2F0IHUxID0gc3JjTGVmdCAvIHdpZHRoOworICAgIGNvbnN0IGZsb2F0IHYxID0gc3JjVG9wIC8gaGVpZ2h0OworICAgIGNvbnN0IGZsb2F0IHUyID0gc3JjUmlnaHQgLyB3aWR0aDsKKyAgICBjb25zdCBmbG9hdCB2MiA9IHNyY0JvdHRvbSAvIGhlaWdodDsKKworICAgIHJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHModTEsIHYxLCB1MiwgdjIpOworCisgICAgZHJhd1RleHR1cmVSZWN0KGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbSwgdGV4dHVyZSwgcGFpbnQpOworCisgICAgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcygwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIFJlc19wbmdfOXBhdGNoKiBwYXRjaCwKKyAgICAgICAgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGlmIChxdWlja1JlamVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtQ2FjaGVzLnRleHR1cmVDYWNoZS5nZXQoYml0bWFwKTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGludCBhbHBoYTsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGU7CisgICAgZ2V0QWxwaGFBbmRNb2RlKHBhaW50LCAmYWxwaGEsICZtb2RlKTsKKworICAgIFBhdGNoKiBtZXNoID0gbUNhY2hlcy5wYXRjaENhY2hlLmdldChwYXRjaCk7CisgICAgbWVzaC0+dXBkYXRlVmVydGljZXMoYml0bWFwLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCisgICAgICAgICAgICAmcGF0Y2gtPnhEaXZzWzBdLCAmcGF0Y2gtPnlEaXZzWzBdLCBwYXRjaC0+bnVtWERpdnMsIHBhdGNoLT5udW1ZRGl2cyk7CisKKyAgICAvLyBTcGVjaWZ5IHJpZ2h0IGFuZCBib3R0b20gYXMgKzEuMGYgZnJvbSBsZWZ0L3RvcCB0byBwcmV2ZW50IHNjYWxpbmcgc2luY2UgdGhlCisgICAgLy8gcGF0Y2ggbWVzaCBhbHJlYWR5IGRlZmluZXMgdGhlIGZpbmFsIHNpemUKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCBsZWZ0ICsgMS4wZiwgdG9wICsgMS4wZiwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLAorICAgICAgICAgICAgbW9kZSwgdGV4dHVyZS0+YmxlbmQsICZtZXNoLT52ZXJ0aWNlc1swXS5wb3NpdGlvblswXSwKKyAgICAgICAgICAgICZtZXNoLT52ZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBtZXNoLT5pbmRpY2VzLCBtZXNoLT5pbmRpY2VzQ291bnQpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3IoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpIHsKKyAgICBjb25zdCBSZWN0JiBjbGlwID0gKm1TbmFwc2hvdC0+Y2xpcFJlY3Q7CisgICAgZHJhd0NvbG9yUmVjdChjbGlwLmxlZnQsIGNsaXAudG9wLCBjbGlwLnJpZ2h0LCBjbGlwLmJvdHRvbSwgY29sb3IsIG1vZGUsIHRydWUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3UmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGNvbnN0IFNrUGFpbnQqIHApIHsKKyAgICBpZiAocXVpY2tSZWplY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlOworICAgIGlmICghbUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHAtPmdldFhmZXJtb2RlKCksICZtb2RlKTsKKyAgICAgICAgaWYgKCFpc01vZGUpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSBTUkNfT1ZFUgorICAgICAgICAgICAgbW9kZSA9IFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0gZ2V0WGZlcm1vZGUocC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgfQorCisgICAgLy8gU2tpYSBkcmF3cyB1c2luZyB0aGUgY29sb3IncyBhbHBoYSBjaGFubmVsIGlmIDwgMjU1CisgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgaW50IGNvbG9yID0gcC0+Z2V0Q29sb3IoKTsKKyAgICBpZiAoKChjb2xvciA+PiAyNCkgJiAweGZmKSA9PSAyNTUpIHsKKyAgICAgICAgY29sb3IgfD0gcC0+Z2V0QWxwaGEoKSA8PCAyNDsKKyAgICB9CisKKyAgICBkcmF3Q29sb3JSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgY29sb3IsIG1vZGUpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3VGV4dChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgaW50IGNvdW50LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBTa1BhaW50KiBwYWludCkgeworICAgIGlmICh0ZXh0ID09IE5VTEwgfHwgY291bnQgPT0gMCB8fCAocGFpbnQtPmdldEFscGhhKCkgPT0gMCAmJiBwYWludC0+Z2V0WGZlcm1vZGUoKSA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBhaW50LT5zZXRBbnRpQWxpYXModHJ1ZSk7CisKKyAgICBmbG9hdCBsZW5ndGggPSAtMS4wZjsKKyAgICBzd2l0Y2ggKHBhaW50LT5nZXRUZXh0QWxpZ24oKSkgeworICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aCAvIDIuMGY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhaW50OjprUmlnaHRfQWxpZ246CisgICAgICAgICAgICBsZW5ndGggPSBwYWludC0+bWVhc3VyZVRleHQodGV4dCwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB4IC09IGxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIEZvbnRSZW5kZXJlciYgZm9udFJlbmRlcmVyID0gbUNhY2hlcy5mb250UmVuZGVyZXIuZ2V0Rm9udFJlbmRlcmVyKHBhaW50KTsKKyAgICBmb250UmVuZGVyZXIuc2V0Rm9udChwYWludCwgU2tUeXBlZmFjZTo6VW5pcXVlSUQocGFpbnQtPmdldFR5cGVmYWNlKCkpLAorICAgICAgICAgICAgcGFpbnQtPmdldFRleHRTaXplKCkpOworICAgIGlmIChtSGFzU2hhZG93KSB7CisgICAgICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzWzBdKTsKKyAgICAgICAgbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuc2V0Rm9udFJlbmRlcmVyKGZvbnRSZW5kZXJlcik7CisgICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldChwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwKKyAgICAgICAgICAgICAgICBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CisgICAgICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHNoYWRvdyk7CisKKyAgICAgICAgc2V0dXBTaGFkb3coc2hhZG93LCB4LCB5LCBtb2RlLCBhKTsKKworICAgICAgICAvLyBEcmF3IHRoZSBtZXNoCisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworICAgIH0KKworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIHNldHVwVGV4dHVyZUFscGhhOChmb250UmVuZGVyZXIuZ2V0VGV4dHVyZSgpLCAwLCAwLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwKKyAgICAgICAgICAgIG1vZGUsIGZhbHNlLCB0cnVlKTsKKworICAgIGNvbnN0IFJlY3QmIGNsaXAgPSBtU25hcHNob3QtPmdldExvY2FsQ2xpcCgpOworICAgIGNsZWFyTGF5ZXJSZWdpb25zKCk7CisgICAgZm9udFJlbmRlcmVyLnJlbmRlclRleHQocGFpbnQsICZjbGlwLCB0ZXh0LCAwLCBieXRlc0NvdW50LCBjb3VudCwgeCwgeSk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIikpOworCisgICAgZHJhd1RleHREZWNvcmF0aW9ucyh0ZXh0LCBieXRlc0NvdW50LCBsZW5ndGgsIHgsIHksIHBhaW50KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIEdMdWludCB0ZXh0dXJlVW5pdCA9IDA7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNbdGV4dHVyZVVuaXRdKTsKKworICAgIGNvbnN0IFBhdGhUZXh0dXJlKiB0ZXh0dXJlID0gbUNhY2hlcy5wYXRoQ2FjaGUuZ2V0KHBhdGgsIHBhaW50KTsKKyAgICBpZiAoIXRleHR1cmUpIHJldHVybjsKKyAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cCh0ZXh0dXJlKTsKKworICAgIGNvbnN0IGZsb2F0IHggPSB0ZXh0dXJlLT5sZWZ0IC0gdGV4dHVyZS0+b2Zmc2V0OworICAgIGNvbnN0IGZsb2F0IHkgPSB0ZXh0dXJlLT50b3AgLSB0ZXh0dXJlLT5vZmZzZXQ7CisKKyAgICBpZiAocXVpY2tSZWplY3QoeCwgeSwgeCArIHRleHR1cmUtPndpZHRoLCB5ICsgdGV4dHVyZS0+aGVpZ2h0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgdWludDMyX3QgY29sb3IgPSBwYWludC0+Z2V0Q29sb3IoKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBhbHBoYSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IHIgPSBhICogKChjb2xvciA+PiAxNikgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGcgPSBhICogKChjb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChjb2xvciAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7CisgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkZXIoKSB7CisgICAgbVNoYWRlciA9IE5VTEw7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcikgeworICAgIG1TaGFkZXIgPSBzaGFkZXI7CisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+c2V0KCZtQ2FjaGVzLnRleHR1cmVDYWNoZSwgJm1DYWNoZXMuZ3JhZGllbnRDYWNoZSk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb2xvciBmaWx0ZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0Q29sb3JGaWx0ZXIoKSB7CisgICAgbUNvbG9yRmlsdGVyID0gTlVMTDsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBDb2xvckZpbHRlcihTa2lhQ29sb3JGaWx0ZXIqIGZpbHRlcikgeworICAgIG1Db2xvckZpbHRlciA9IGZpbHRlcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJvcCBzaGFkb3cKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6cmVzZXRTaGFkb3coKSB7CisgICAgbUhhc1NoYWRvdyA9IGZhbHNlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhmbG9hdCByYWRpdXMsIGZsb2F0IGR4LCBmbG9hdCBkeSwgaW50IGNvbG9yKSB7CisgICAgbUhhc1NoYWRvdyA9IHRydWU7CisgICAgbVNoYWRvd1JhZGl1cyA9IHJhZGl1czsKKyAgICBtU2hhZG93RHggPSBkeDsKKyAgICBtU2hhZG93RHkgPSBkeTsKKyAgICBtU2hhZG93Q29sb3IgPSBjb2xvcjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRHJhd2luZyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpzZXR1cFNoYWRvdyhjb25zdCBTaGFkb3dUZXh0dXJlKiB0ZXh0dXJlLCBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGZsb2F0IGFscGhhKSB7CisgICAgY29uc3QgZmxvYXQgc3ggPSB4IC0gdGV4dHVyZS0+bGVmdCArIG1TaGFkb3dEeDsKKyAgICBjb25zdCBmbG9hdCBzeSA9IHkgLSB0ZXh0dXJlLT50b3AgKyBtU2hhZG93RHk7CisKKyAgICBjb25zdCBpbnQgc2hhZG93QWxwaGEgPSAoKG1TaGFkb3dDb2xvciA+PiAyNCkgJiAweEZGKTsKKyAgICBjb25zdCBHTGZsb2F0IGEgPSBzaGFkb3dBbHBoYSA8IDI1NSA/IHNoYWRvd0FscGhhIC8gMjU1LjBmIDogYWxwaGE7CisgICAgY29uc3QgR0xmbG9hdCByID0gYSAqICgobVNoYWRvd0NvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKG1TaGFkb3dDb2xvciA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBjb25zdCBHTGZsb2F0IGIgPSBhICogKChtU2hhZG93Q29sb3IgICAgICApICYgMHhGRikgLyAyNTUuMGY7CisKKyAgICBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwOworICAgIHNldHVwVGV4dHVyZUFscGhhOCh0ZXh0dXJlLCB0ZXh0dXJlVW5pdCwgc3gsIHN5LCByLCBnLCBiLCBhLCBtb2RlLCB0cnVlLCBmYWxzZSk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwVGV4dHVyZUFscGhhOChjb25zdCBUZXh0dXJlKiB0ZXh0dXJlLCBHTHVpbnQmIHRleHR1cmVVbml0LAorICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsCisgICAgICAgIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICBzZXR1cFRleHR1cmVBbHBoYTgodGV4dHVyZS0+aWQsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIHRleHR1cmVVbml0LAorICAgICAgICAgICAgeCwgeSwgciwgZywgYiwgYSwgbW9kZSwgdHJhbnNmb3JtcywgYXBwbHlGaWx0ZXJzKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6c2V0dXBUZXh0dXJlQWxwaGE4KEdMdWludCB0ZXh0dXJlLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgdHJhbnNmb3JtcywgYm9vbCBhcHBseUZpbHRlcnMpIHsKKyAgICAgLy8gRGVzY3JpYmUgdGhlIHJlcXVpcmVkIHNoYWRlcnMKKyAgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgICBkZXNjcmlwdGlvbi5oYXNUZXh0dXJlID0gdHJ1ZTsKKyAgICAgZGVzY3JpcHRpb24uaGFzQWxwaGE4VGV4dHVyZSA9IHRydWU7CisKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgICAgICBtU2hhZGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgICAgICAgfQorICAgICAgICAgaWYgKG1Db2xvckZpbHRlcikgeworICAgICAgICAgICAgIG1Db2xvckZpbHRlci0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIG1FeHRlbnNpb25zKTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIC8vIFNldHVwIHRoZSBibGVuZGluZyBtb2RlCisgICAgIGNob29zZUJsZW5kaW5nKHRydWUsIG1vZGUsIGRlc2NyaXB0aW9uKTsKKworICAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICAgdXNlUHJvZ3JhbShtQ2FjaGVzLnByb2dyYW1DYWNoZS5nZXQoZGVzY3JpcHRpb24pKTsKKworICAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLCBHTF9DTEFNUF9UT19FREdFLCBHTF9DTEFNUF9UT19FREdFLCB0ZXh0dXJlVW5pdCk7CisgICAgIGdsVW5pZm9ybTFpKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldFVuaWZvcm0oInNhbXBsZXIiKSwgdGV4dHVyZVVuaXQpOworCisgICAgIGludCB0ZXhDb29yZHNTbG90ID0gbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0QXR0cmliKCJ0ZXhDb29yZHMiKTsKKyAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKworICAgICAvLyBTZXR1cCBhdHRyaWJ1dGVzCisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgIGdNZXNoU3RyaWRlLCAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSk7CisgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZHNTbG90LCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnRleHR1cmVbMF0pOworCisgICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgIGlmICh0cmFuc2Zvcm1zKSB7CisgICAgICAgICBtTW9kZWxWaWV3LmxvYWRUcmFuc2xhdGUoeCwgeSwgMC4wZik7CisgICAgICAgICBtTW9kZWxWaWV3LnNjYWxlKHdpZHRoLCBoZWlnaHQsIDEuMGYpOworICAgICB9IGVsc2UgeworICAgICAgICAgbU1vZGVsVmlldy5sb2FkSWRlbnRpdHkoKTsKKyAgICAgfQorICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCAqbVNuYXBzaG90LT50cmFuc2Zvcm0pOworICAgICBnbFVuaWZvcm00ZihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5jb2xvciwgciwgZywgYiwgYSk7CisKKyAgICAgdGV4dHVyZVVuaXQrKzsKKyAgICAgaWYgKGFwcGx5RmlsdGVycykgeworICAgICAgICAgLy8gU2V0dXAgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMgcmVxdWlyZWQgYnkgdGhlIHNoYWRlcnMKKyAgICAgICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgICAgICAgbVNoYWRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgICAgICB9CisgICAgIH0KK30KKworLy8gU2FtZSB2YWx1ZXMgdXNlZCBieSBTa2lhCisjZGVmaW5lIGtTdGRTdHJpa2VUaHJ1X09mZnNldCAgICgtNi4wZiAvIDIxLjBmKQorI2RlZmluZSBrU3RkVW5kZXJsaW5lX09mZnNldCAgICAoMS4wZiAvIDkuMGYpCisjZGVmaW5lIGtTdGRVbmRlcmxpbmVfVGhpY2tuZXNzICgxLjBmIC8gMTguMGYpCisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICAvLyBIYW5kbGUgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaAorICAgIHVpbnQzMl90IGZsYWdzID0gcGFpbnQtPmdldEZsYWdzKCk7CisgICAgaWYgKGZsYWdzICYgKFNrUGFpbnQ6OmtVbmRlcmxpbmVUZXh0X0ZsYWcgfCBTa1BhaW50OjprU3RyaWtlVGhydVRleHRfRmxhZykpIHsKKyAgICAgICAgZmxvYXQgdW5kZXJsaW5lV2lkdGggPSBsZW5ndGg7CisgICAgICAgIC8vIElmIGxlbmd0aCBpcyA+IDAuMGYsIHdlIGFscmVhZHkgbWVhc3VyZWQgdGhlIHRleHQgZm9yIHRoZSB0ZXh0IGFsaWdubWVudAorICAgICAgICBpZiAobGVuZ3RoIDw9IDAuMGYpIHsKKyAgICAgICAgICAgIHVuZGVybGluZVdpZHRoID0gcGFpbnQtPm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgb2Zmc2V0WCA9IDA7CisgICAgICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CisgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CisgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHVuZGVybGluZVdpZHRoICogMC41ZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tQYWludDo6a1JpZ2h0X0FsaWduOgorICAgICAgICAgICAgICAgIG9mZnNldFggPSB1bmRlcmxpbmVXaWR0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodW5kZXJsaW5lV2lkdGggPiAwLjBmKSB7CisgICAgICAgICAgICBmbG9hdCB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0ID0gdGV4dFNpemUgKiBrU3RkVW5kZXJsaW5lX1RoaWNrbmVzczsKKworICAgICAgICAgICAgZmxvYXQgbGVmdCA9IHggLSBvZmZzZXRYOworICAgICAgICAgICAgZmxvYXQgdG9wID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IHJpZ2h0ID0gbGVmdCArIHVuZGVybGluZVdpZHRoOworICAgICAgICAgICAgZmxvYXQgYm90dG9tID0gMC4wZjsKKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1VuZGVybGluZVRleHRfRmxhZykgeworICAgICAgICAgICAgICAgIHRvcCA9IHkgKyB0ZXh0U2l6ZSAqIGtTdGRVbmRlcmxpbmVfT2Zmc2V0OworICAgICAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgICAgICAgICAgICBkcmF3UmVjdChsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHBhaW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZsYWdzICYgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB0b3AgPSB5ICsgdGV4dFNpemUgKiBrU3RkU3RyaWtlVGhydV9PZmZzZXQ7CisgICAgICAgICAgICAgICAgYm90dG9tID0gdG9wICsgaGVpZ2h0OworICAgICAgICAgICAgICAgIGRyYXdSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgcGFpbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgaWdub3JlVHJhbnNmb3JtLCBib29sIGlnbm9yZUJsZW5kaW5nKSB7CisgICAgY2xlYXJMYXllclJlZ2lvbnMoKTsKKworICAgIC8vIElmIGEgc2hhZGVyIGlzIHNldCwgcHJlc2VydmUgb25seSB0aGUgYWxwaGEKKyAgICBpZiAobVNoYWRlcikgeworICAgICAgICBjb2xvciB8PSAweDAwZmZmZmZmOworICAgIH0KKworICAgIC8vIFJlbmRlciB1c2luZyBwcmUtbXVsdGlwbGllZCBhbHBoYQorICAgIGNvbnN0IGludCBhbHBoYSA9IChjb2xvciA+PiAyNCkgJiAweEZGOworICAgIGNvbnN0IEdMZmxvYXQgYSA9IGFscGhhIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgciA9IGEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgZyA9IGEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIGNvbnN0IEdMZmxvYXQgYiA9IGEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworCisgICAgR0x1aW50IHRleHR1cmVVbml0ID0gMDsKKworICAgIC8vIERlc2NyaWJlIHRoZSByZXF1aXJlZCBzaGFkZXJzCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGlmIChtU2hhZGVyKSB7CisgICAgICAgIG1TaGFkZXItPmRlc2NyaWJlKGRlc2NyaXB0aW9uLCBtRXh0ZW5zaW9ucyk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIGlmICghaWdub3JlQmxlbmRpbmcpIHsKKyAgICAgICAgLy8gU2V0dXAgdGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgICAgY2hvb3NlQmxlbmRpbmcoYWxwaGEgPCAyNTUgfHwgKG1TaGFkZXIgJiYgbVNoYWRlci0+YmxlbmQoKSksIG1vZGUsIGRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFkZXIKKyAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworCisgICAgLy8gU2V0dXAgYXR0cmlidXRlcworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5wb3NpdGlvbiwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgZ01lc2hTdHJpZGUsICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdKTsKKworICAgIC8vIFNldHVwIHVuaWZvcm1zCisgICAgbU1vZGVsVmlldy5sb2FkVHJhbnNsYXRlKGxlZnQsIHRvcCwgMC4wZik7CisgICAgbU1vZGVsVmlldy5zY2FsZShyaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCwgMS4wZik7CisgICAgaWYgKCFpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+c2V0KG1PcnRob01hdHJpeCwgbU1vZGVsVmlldywgKm1TbmFwc2hvdC0+dHJhbnNmb3JtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXQ0IGlkZW50aXR5OworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBpZGVudGl0eSk7CisgICAgfQorICAgIGdsVW5pZm9ybTRmKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmNvbG9yLCByLCBnLCBiLCBhKTsKKworICAgIC8vIFNldHVwIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHJlcXVpcmVkIGJ5IHRoZSBzaGFkZXJzCisgICAgaWYgKG1TaGFkZXIpIHsKKyAgICAgICAgbVNoYWRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0sIG1Nb2RlbFZpZXcsICptU25hcHNob3QsICZ0ZXh0dXJlVW5pdCk7CisgICAgfQorICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5zZXR1cFByb2dyYW0obUNhY2hlcy5jdXJyZW50UHJvZ3JhbSk7CisgICAgfQorCisgICAgLy8gRHJhdyB0aGUgbWVzaAorICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgZ01lc2hDb3VudCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KSB7CisgICAgaW50IGFscGhhOworICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZTsKKyAgICBnZXRBbHBoYUFuZE1vZGUocGFpbnQsICZhbHBoYSwgJm1vZGUpOworCisgICAgZHJhd1RleHR1cmVNZXNoKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdGV4dHVyZS0+aWQsIGFscGhhIC8gMjU1LjBmLCBtb2RlLCB0ZXh0dXJlLT5ibGVuZCwKKyAgICAgICAgICAgICZtTWVzaFZlcnRpY2VzWzBdLnBvc2l0aW9uWzBdLCAmbU1lc2hWZXJ0aWNlc1swXS50ZXh0dXJlWzBdLCBOVUxMKTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6ZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgR0x1aW50IHRleHR1cmUsIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQpIHsKKyAgICBkcmF3VGV4dHVyZU1lc2gobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCB0ZXh0dXJlLCBhbHBoYSwgbW9kZSwgYmxlbmQsCisgICAgICAgICAgICAmbU1lc2hWZXJ0aWNlc1swXS5wb3NpdGlvblswXSwgJm1NZXNoVmVydGljZXNbMF0udGV4dHVyZVswXSwgTlVMTCk7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdUZXh0dXJlTWVzaChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sCisgICAgICAgIEdMdWludCB0ZXh0dXJlLCBmbG9hdCBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGJsZW5kLAorICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQsCisgICAgICAgIGJvb2wgc3dhcFNyY0RzdCwgYm9vbCBpZ25vcmVUcmFuc2Zvcm0pIHsKKyAgICBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworICAgIGRlc2NyaXB0aW9uLmhhc1RleHR1cmUgPSB0cnVlOworICAgIGlmIChtQ29sb3JGaWx0ZXIpIHsKKyAgICAgICAgbUNvbG9yRmlsdGVyLT5kZXNjcmliZShkZXNjcmlwdGlvbiwgbUV4dGVuc2lvbnMpOworICAgIH0KKworICAgIG1Nb2RlbFZpZXcubG9hZFRyYW5zbGF0ZShsZWZ0LCB0b3AsIDAuMGYpOworICAgIG1Nb2RlbFZpZXcuc2NhbGUocmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3AsIDEuMGYpOworCisgICAgY2hvb3NlQmxlbmRpbmcoYmxlbmQgfHwgYWxwaGEgPCAxLjBmLCBtb2RlLCBkZXNjcmlwdGlvbiwgc3dhcFNyY0RzdCk7CisKKyAgICB1c2VQcm9ncmFtKG1DYWNoZXMucHJvZ3JhbUNhY2hlLmdldChkZXNjcmlwdGlvbikpOworICAgIGlmICghaWdub3JlVHJhbnNmb3JtKSB7CisgICAgICAgIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnNldChtT3J0aG9NYXRyaXgsIG1Nb2RlbFZpZXcsICptU25hcHNob3QtPnRyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0NCBtOworICAgICAgICBtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtLT5zZXQobU9ydGhvTWF0cml4LCBtTW9kZWxWaWV3LCBtKTsKKyAgICB9CisKKyAgICAvLyBUZXh0dXJlCisgICAgYmluZFRleHR1cmUodGV4dHVyZSwgR0xfQ0xBTVBfVE9fRURHRSwgR0xfQ0xBTVBfVE9fRURHRSwgMCk7CisgICAgZ2xVbmlmb3JtMWkobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Z2V0VW5pZm9ybSgic2FtcGxlciIpLCAwKTsKKworICAgIC8vIEFsd2F5cyBwcmVtdWx0aXBsaWVkCisgICAgZ2xVbmlmb3JtNGYobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+Y29sb3IsIGFscGhhLCBhbHBoYSwgYWxwaGEsIGFscGhhKTsKKworICAgIC8vIE1lc2gKKyAgICBpbnQgdGV4Q29vcmRzU2xvdCA9IG1DYWNoZXMuY3VycmVudFByb2dyYW0tPmdldEF0dHJpYigidGV4Q29vcmRzIik7CisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobUNhY2hlcy5jdXJyZW50UHJvZ3JhbS0+cG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgIGdNZXNoU3RyaWRlLCB2ZXJ0aWNlcyk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHRleENvb3Jkc1Nsb3QsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgZ01lc2hTdHJpZGUsIHRleENvb3Jkcyk7CisKKyAgICAvLyBDb2xvciBmaWx0ZXIKKyAgICBpZiAobUNvbG9yRmlsdGVyKSB7CisgICAgICAgIG1Db2xvckZpbHRlci0+c2V0dXBQcm9ncmFtKG1DYWNoZXMuY3VycmVudFByb2dyYW0pOworICAgIH0KKworICAgIGlmICghaW5kaWNlcykgeworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIGdNZXNoQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgZWxlbWVudHNDb3VudCwgR0xfVU5TSUdORURfU0hPUlQsIGluZGljZXMpOworICAgIH0KKyAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNTbG90KTsKK30KKwordm9pZCBPcGVuR0xSZW5kZXJlcjo6Y2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLAorICAgICAgICBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBib29sIHN3YXBTcmNEc3QpIHsKKyAgICBibGVuZCA9IGJsZW5kIHx8IG1vZGUgIT0gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICBpZiAoYmxlbmQpIHsKKyAgICAgICAgaWYgKG1vZGUgPCBTa1hmZXJtb2RlOjprUGx1c19Nb2RlKSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdMZW51bSBzb3VyY2VNb2RlID0gc3dhcFNyY0RzdCA/IGdCbGVuZHNTd2FwW21vZGVdLnNyYyA6IGdCbGVuZHNbbW9kZV0uc3JjOworICAgICAgICAgICAgR0xlbnVtIGRlc3RNb2RlID0gc3dhcFNyY0RzdCA/IGdCbGVuZHNTd2FwW21vZGVdLmRzdCA6IGdCbGVuZHNbbW9kZV0uZHN0OworCisgICAgICAgICAgICBpZiAoc291cmNlTW9kZSAhPSBtQ2FjaGVzLmxhc3RTcmNNb2RlIHx8IGRlc3RNb2RlICE9IG1DYWNoZXMubGFzdERzdE1vZGUpIHsKKyAgICAgICAgICAgICAgICBnbEJsZW5kRnVuYyhzb3VyY2VNb2RlLCBkZXN0TW9kZSk7CisgICAgICAgICAgICAgICAgbUNhY2hlcy5sYXN0U3JjTW9kZSA9IHNvdXJjZU1vZGU7CisgICAgICAgICAgICAgICAgbUNhY2hlcy5sYXN0RHN0TW9kZSA9IGRlc3RNb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlc2UgYmxlbmQgbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgT3BlbkdMIGRpcmVjdGx5IGFuZCBoYXZlCisgICAgICAgICAgICAvLyB0byBiZSBpbXBsZW1lbnRlZCB1c2luZyBzaGFkZXJzLiBTaW5jZSB0aGUgc2hhZGVyIHdpbGwgcGVyZm9ybQorICAgICAgICAgICAgLy8gdGhlIGJsZW5kaW5nLCB0dXJuIGJsZW5kaW5nIG9mZiBoZXJlCisgICAgICAgICAgICBpZiAobUV4dGVuc2lvbnMuaGFzRnJhbWVidWZmZXJGZXRjaCgpKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZnJhbWVidWZmZXJNb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zd2FwU3JjRHN0ID0gc3dhcFNyY0RzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DYWNoZXMuYmxlbmQpIHsKKyAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxlbmQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNhY2hlcy5ibGVuZCkgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKyAgICBtQ2FjaGVzLmJsZW5kID0gYmxlbmQ7Cit9CisKK2Jvb2wgT3BlbkdMUmVuZGVyZXI6OnVzZVByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGlmICghcHJvZ3JhbS0+aXNJblVzZSgpKSB7CisgICAgICAgIGlmIChtQ2FjaGVzLmN1cnJlbnRQcm9ncmFtICE9IE5VTEwpIG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnJlbW92ZSgpOworICAgICAgICBwcm9ncmFtLT51c2UoKTsKKyAgICAgICAgbUNhY2hlcy5jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnJlc2V0RHJhd1RleHR1cmVUZXhDb29yZHMoZmxvYXQgdTEsIGZsb2F0IHYxLCBmbG9hdCB1MiwgZmxvYXQgdjIpIHsKKyAgICBUZXh0dXJlVmVydGV4KiB2ID0gJm1NZXNoVmVydGljZXNbMF07CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MSwgdjEpOworICAgIFRleHR1cmVWZXJ0ZXg6OnNldFVWKHYrKywgdTIsIHYxKTsKKyAgICBUZXh0dXJlVmVydGV4OjpzZXRVVih2KyssIHUxLCB2Mik7CisgICAgVGV4dHVyZVZlcnRleDo6c2V0VVYodisrLCB1MiwgdjIpOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpnZXRBbHBoYUFuZE1vZGUoY29uc3QgU2tQYWludCogcGFpbnQsIGludCogYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUqIG1vZGUpIHsKKyAgICBpZiAocGFpbnQpIHsKKyAgICAgICAgaWYgKCFtRXh0ZW5zaW9ucy5oYXNGcmFtZWJ1ZmZlckZldGNoKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaXNNb2RlID0gU2tYZmVybW9kZTo6SXNNb2RlKHBhaW50LT5nZXRYZmVybW9kZSgpLCBtb2RlKTsKKyAgICAgICAgICAgIGlmICghaXNNb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIFNSQ19PVkVSCisgICAgICAgICAgICAgICAgKm1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm1vZGUgPSBnZXRYZmVybW9kZShwYWludC0+Z2V0WGZlcm1vZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lhIGRyYXdzIHVzaW5nIHRoZSBjb2xvcidzIGFscGhhIGNoYW5uZWwgaWYgPCAyNTUKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCB1c2VzIHRoZSBwYWludCdzIGFscGhhCisgICAgICAgIGludCBjb2xvciA9IHBhaW50LT5nZXRDb2xvcigpOworICAgICAgICAqYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgaWYgKCphbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICphbHBoYSA9IHBhaW50LT5nZXRBbHBoYSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm1vZGUgPSBTa1hmZXJtb2RlOjprU3JjT3Zlcl9Nb2RlOworICAgICAgICAqYWxwaGEgPSAyNTU7CisgICAgfQorfQorCitTa1hmZXJtb2RlOjpNb2RlIE9wZW5HTFJlbmRlcmVyOjpnZXRYZmVybW9kZShTa1hmZXJtb2RlKiBtb2RlKSB7CisgICAgaWYgKG1vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gU2tYZmVybW9kZTo6a1NyY092ZXJfTW9kZTsKKyAgICB9CisgICAgcmV0dXJuIG1vZGUtPmZNb2RlOworfQorCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpiaW5kVGV4dHVyZShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQsIEdMdWludCB0ZXh0dXJlVW5pdCkgeworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzW3RleHR1cmVVbml0XSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIHdyYXBTKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIHdyYXBUKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaCBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWMyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuaApAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9PUEVOR0xfUkVOREVSRVJfSAorI2RlZmluZSBBTkRST0lEX1VJX09QRU5HTF9SRU5ERVJFUl9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8U2tNYXRyaXguaD4KKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisjaW5jbHVkZSA8U2tSZWdpb24uaD4KKyNpbmNsdWRlIDxTa1NoYWRlci5oPgorI2luY2x1ZGUgPFNrWGZlcm1vZGUuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiTWF0cml4LmgiCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJTbmFwc2hvdC5oIgorI2luY2x1ZGUgIlZlcnRleC5oIgorI2luY2x1ZGUgIlNraWFTaGFkZXIuaCIKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKyNpbmNsdWRlICJDYWNoZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIE9wZW5HTCByZW5kZXJlciB1c2VkIHRvIGRyYXcgYWNjZWxlcmF0ZWQgMkQgZ3JhcGhpY3MuIFRoZSBBUEkgaXMgYQorICogc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFNraWEncyBDYW52YXMgQVBJLgorICovCitjbGFzcyBPcGVuR0xSZW5kZXJlciB7CitwdWJsaWM6CisgICAgT3BlbkdMUmVuZGVyZXIoKTsKKyAgICB+T3BlbkdMUmVuZGVyZXIoKTsKKworICAgIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkIHByZXBhcmUoKTsKKyAgICB2b2lkIGFjcXVpcmVDb250ZXh0KCk7CisgICAgdm9pZCByZWxlYXNlQ29udGV4dCgpOworCisgICAgaW50IGdldFNhdmVDb3VudCgpIGNvbnN0OworICAgIGludCBzYXZlKGludCBmbGFncyk7CisgICAgdm9pZCByZXN0b3JlKCk7CisgICAgdm9pZCByZXN0b3JlVG9Db3VudChpbnQgc2F2ZUNvdW50KTsKKworICAgIGludCBzYXZlTGF5ZXIoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBjb25zdCBTa1BhaW50KiBwLCBpbnQgZmxhZ3MpOworICAgIGludCBzYXZlTGF5ZXJBbHBoYShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIGludCBhbHBoYSwgaW50IGZsYWdzKTsKKworICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IGR4LCBmbG9hdCBkeSk7CisgICAgdm9pZCByb3RhdGUoZmxvYXQgZGVncmVlcyk7CisgICAgdm9pZCBzY2FsZShmbG9hdCBzeCwgZmxvYXQgc3kpOworCisgICAgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdm9pZCBnZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisgICAgdm9pZCBjb25jYXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCk7CisKKyAgICBjb25zdCBSZWN0JiBnZXRDbGlwQm91bmRzKCk7CisgICAgYm9vbCBxdWlja1JlamVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pOworICAgIGJvb2wgY2xpcFJlY3QoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1JlZ2lvbjo6T3Agb3ApOworCisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0JpdG1hcChTa0JpdG1hcCogYml0bWFwLCBjb25zdCBTa01hdHJpeCogbWF0cml4LCBjb25zdCBTa1BhaW50KiBwYWludCk7CisgICAgdm9pZCBkcmF3Qml0bWFwKFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IHNyY0xlZnQsIGZsb2F0IHNyY1RvcCwgZmxvYXQgc3JjUmlnaHQsIGZsb2F0IHNyY0JvdHRvbSwKKyAgICAgICAgICAgIGZsb2F0IGRzdExlZnQsIGZsb2F0IGRzdFRvcCwgZmxvYXQgZHN0UmlnaHQsIGZsb2F0IGRzdEJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1BhdGNoKFNrQml0bWFwKiBiaXRtYXAsIFJlc19wbmdfOXBhdGNoKiBwYXRjaCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLAorICAgICAgICAgICAgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd0NvbG9yKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKKyAgICB2b2lkIGRyYXdSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwgY29uc3QgU2tQYWludCogcGFpbnQpOworICAgIHZvaWQgZHJhd1BhdGgoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCk7CisKKyAgICB2b2lkIHJlc2V0U2hhZGVyKCk7CisgICAgdm9pZCBzZXR1cFNoYWRlcihTa2lhU2hhZGVyKiBzaGFkZXIpOworCisgICAgdm9pZCByZXNldENvbG9yRmlsdGVyKCk7CisgICAgdm9pZCBzZXR1cENvbG9yRmlsdGVyKFNraWFDb2xvckZpbHRlciogZmlsdGVyKTsKKworICAgIHZvaWQgcmVzZXRTaGFkb3coKTsKKyAgICB2b2lkIHNldHVwU2hhZG93KGZsb2F0IHJhZGl1cywgZmxvYXQgZHgsIGZsb2F0IGR5LCBpbnQgY29sb3IpOworCisgICAgdm9pZCBkcmF3VGV4dChjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LCBTa1BhaW50KiBwYWludCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmVyIGFzIGEgbmV3IHNuYXBzaG90LgorICAgICAqIFRoZSBuZXcgc25hcHNob3QgaXMgc2F2ZWQgaW4gbVNuYXBzaG90IGFuZCB0aGUgcHJldmlvdXMgc25hcHNob3QKKyAgICAgKiBpcyBsaW5rZWQgZnJvbSBtU25hcHNob3QtPnByZXZpb3VzLgorICAgICAqCisgICAgICogQHBhcmFtIGZsYWdzIFRoZSBzYXZlIGZsYWdzOyBzZWUgU2tDYW52YXMgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBzYXZlIGNvdW50LiBUaGlzIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8gI3Jlc3RvcmVUb0NvdW50KCkKKyAgICAgKi8KKyAgICBpbnQgc2F2ZVNuYXBzaG90KGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzbmFwc2hvdDsgbVNuYXBzaG90IGJlY29tZXMgbVNuYXBzaG90LT5wcmV2aW91cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2xpcCB3YXMgbW9kaWZpZWQuCisgICAgICovCisgICAgYm9vbCByZXN0b3JlU25hcHNob3QoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSB1c2luZyBnbFNjaXNzb3IuIFRoZSBjbGlwIGlzIGRlZmluZWQgYnkKKyAgICAgKiB0aGUgY3VycmVudCBzbmFwc2hvdCdzIGNsaXBSZWN0IG1lbWJlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNjaXNzb3JGcm9tQ2xpcCgpOworCisgICAgLyoqCisgICAgICogQ29tcG9zZSB0aGUgbGF5ZXIgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdCB3aXRoIHRoZSBsYXllcgorICAgICAqIGRlZmluZWQgYnkgdGhlIHByZXZpb3VzIHNuYXBzaG90LgorICAgICAqCisgICAgICogVGhlIGN1cnJlbnQgc25hcHNob3QgKm11c3QqIGJlIGEgbGF5ZXIgKGZsYWcga0ZsYWdJc0xheWVyIHNldC4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VyZW50IFRoZSBjdXJyZW50IHNuYXBzaG90IGNvbnRhaW5pbmcgdGhlIGxheWVyIHRvIGNvbXBvc2UKKyAgICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIHByZXZpb3VzIHNuYXBzaG90IHRvIGNvbXBvc2UgdGhlIGN1cnJlbnQgbGF5ZXIgd2l0aAorICAgICAqLworICAgIHZvaWQgY29tcG9zZUxheWVyKHNwPFNuYXBzaG90PiBjdXJyZW50LCBzcDxTbmFwc2hvdD4gcHJldmlvdXMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBsYXllciBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzbmFwc2hvdCBUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBsYXllcgorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gYWxwaGEgVGhlIHRyYW5zbHVjZW5jeSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZSBvZiB0aGUgbGF5ZXIKKyAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGxheWVyIHNhdmUgZmxhZ3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGNyZWF0ZUxheWVyKHNwPFNuYXBzaG90PiBzbmFwc2hvdCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgaW50IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGludCBmbGFncyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYWxsIHRoZSByZWdpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBsYXllcnMuCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBpbnZva2VkIGJlZm9yZSBhbnkgZHJhd2luZyBvcGVyYXRpb24uCisgICAgICovCisgICAgdm9pZCBjbGVhckxheWVyUmVnaW9ucygpOworCisgICAgLyoqCisgICAgICogRHJhd3MgYSBjb2xvcmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IuIFRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMKKyAgICAgKiBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIGN1cnJlbnQgc25hcHNob3QncyB0cmFuc2Zvcm0gbWF0cml4LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBjb2xvciBUaGUgcmVjdGFuZ2xlJ3MgQVJHQiBjb2xvciwgZGVmaW5lZCBhcyBhIHBhY2tlZCAzMiBiaXRzIHdvcmQKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgU2tpYSB4ZmVybW9kZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gaWdub3JlVHJhbnNmb3JtIFRydWUgaWYgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICogQHBhcmFuIGlnbm9yZUJsZW5kaW5nIFRydWUgaWYgdGhlIGJsZW5kaW5nIGlzIHNldCBieSB0aGUgY2FsbGVyCisgICAgICovCisgICAgdm9pZCBkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAJCWludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlLAorICAgIAkJYm9vbCBpZ25vcmVCbGVuZGluZyA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgcmVjdGFuZ2xlIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0dXJlLiBUaGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzCisgICAgICogYXJlIHRyYW5zZm9ybWVkIGJ5IHRoZSBjdXJyZW50IHNuYXBzaG90J3MgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0dXJlUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20sIEdMdWludCB0ZXh0dXJlLAorICAgICAgICAgICAgZmxvYXQgYWxwaGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCBibGVuZCk7CisKKyAgICAvKioKKyAgICAgKiBEcmF3cyBhIHRleHR1cmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gVGhlIHNwZWNpZmllZCBjb29yZGluYXRlcworICAgICAqIGFyZSB0cmFuc2Zvcm1lZCBieSB0aGUgY3VycmVudCBzbmFwc2hvdCdzIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdG9wIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYm90dG9tIFRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gdXNlCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCBjb250YWluaW5nIHRoZSBhbHBoYSwgYmxlbmRpbmcgbW9kZSwgZXRjLgorICAgICAqLworICAgIHZvaWQgZHJhd1RleHR1cmVSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIERyYXdzIGEgdGV4dHVyZWQgbWVzaCB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dHVyZS4gSWYgdGhlIGluZGljZXMgYXJlIG9taXR0ZWQsIHRoZQorICAgICAqIG1lc2ggaXMgZHJhd24gYXMgYSBzaW1wbGUgcXVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3RhbmdsZQorICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSBuYW1lIHRvIG1hcCBvbnRvIHRoZSByZWN0YW5nbGUKKyAgICAgKiBAcGFyYW0gYWxwaGEgQW4gYWRkaXRpb25hbCB0cmFuc2x1Y2VuY3kgcGFyYW1ldGVyLCBiZXR3ZWVuIDAuMGYgYW5kIDEuMGYKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBibGVuZCBUcnVlIGlmIHRoZSB0ZXh0dXJlIGNvbnRhaW5zIGFuIGFscGhhIGNoYW5uZWwKKyAgICAgKiBAcGFyYW0gdmVydGljZXMgVGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIHRoZSBtZXNoCisgICAgICogQHBhcmFtIHRleENvb3JkcyBUaGUgdGV4dHVyZSBjb29yZGluYXRlcyBvZiBlYWNoIHZlcnRleAorICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSB2ZXJ0aWNlcywgY2FuIGJlIE5VTEwKKyAgICAgKiBAcGFyYW0gZWxlbWVudHNDb3VudCBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtZXNoLCByZXF1aXJlZCBieSBpbmRpY2VzCisgICAgICogQHBhcmFtIHN3YXBTcmNEc3QgV2hldGhlciBvciBub3QgdGhlIHNyYyBhbmQgZHN0IGJsZW5kaW5nIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHN3YXBwZWQKKyAgICAgKiBAcGFyYW0gaWdub3JlVHJhbnNmb3JtIFRydWUgaWYgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHNob3VsZCBiZSBpZ25vcmVkCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZU1lc2goZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBHTHVpbnQgdGV4dHVyZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIGJvb2wgYmxlbmQsCisgICAgICAgICAgICBHTHZvaWQqIHZlcnRpY2VzLCBHTHZvaWQqIHRleENvb3JkcywgR0x2b2lkKiBpbmRpY2VzLCBHTHNpemVpIGVsZW1lbnRzQ291bnQgPSAwLAorICAgICAgICAgICAgYm9vbCBzd2FwU3JjRHN0ID0gZmFsc2UsIGJvb2wgaWdub3JlVHJhbnNmb3JtID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBzaGFkb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgc2hhZG93IHRleHR1cmUKKyAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBzaGFkb3cKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZQorICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYWxwaGEgdmFsdWUKKyAgICAgKi8KKyAgICB2b2lkIHNldHVwU2hhZG93KGNvbnN0IFNoYWRvd1RleHR1cmUqIHRleHR1cmUsIGZsb2F0IHgsIGZsb2F0IHksIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhKTsKKworICAgIC8qKgorICAgICAqIFByZXBhcmVzIHRoZSByZW5kZXJlciB0byBkcmF3IHRoZSBzcGVjaWZpZWQgQWxwaGE4IHRleHR1cmUgYXMgYSByZWN0YW5nbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dHVyZSBUaGUgdGV4dHVyZSB0byByZW5kZXIgd2l0aAorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoY29uc3QgVGV4dHVyZSogdGV4dHVyZSwgR0x1aW50JiB0ZXh0dXJlVW5pdCwgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSwgYm9vbCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgYm9vbCBhcHBseUZpbHRlcnMpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZXMgdGhlIHJlbmRlcmVyIHRvIGRyYXcgdGhlIHNwZWNpZmllZCBBbHBoYTggdGV4dHVyZSBhcyBhIHJlY3RhbmdsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIHJlbmRlciB3aXRoCisgICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgdGV4dHVyZQorICAgICAqIEBwYXJhbSB0ZXh0dXJlVW5pdCBUaGUgdGV4dHVyZSB1bml0IHRvIHVzZSwgbWF5IGJlIG1vZGlmaWVkCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcKKyAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUgdG8gZHJhdworICAgICAqIEBwYXJhbSByIFRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIGIgVGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBjb2xvcgorICAgICAqIEBwYXJhbSBhIFRoZSBhbHBoYSBjb21wb25lbnQgb2YgdGhlIGNvbG9yCisgICAgICogQHBhcmFtIG1vZGUgVGhlIGJsZW5kaW5nIG1vZGUKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtcyBUcnVlIGlmIHRoZSBtYXRyaXggcGFzc2VkIHRvIHRoZSBzaGFkZXIgc2hvdWxkIGJlIG11bHRpcGxpZWQKKyAgICAgKiAgICAgICAgYnkgdGhlIG1vZGVsLXZpZXcgbWF0cml4CisgICAgICogQHBhcmFtIGFwcGx5RmlsdGVycyBXaGV0aGVyIG9yIG5vdCB0byB0YWtlIGNvbG9yIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgIHNoYWRlcnMgaW50byBhY2NvdW50CisgICAgICovCisgICAgdm9pZCBzZXR1cFRleHR1cmVBbHBoYTgoR0x1aW50IHRleHR1cmUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBHTHVpbnQmIHRleHR1cmVVbml0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhLAorICAgICAgICAgICAgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIHRyYW5zZm9ybXMsIGJvb2wgYXBwbHlGaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIERyYXdzIHRleHQgdW5kZXJsaW5lIGFuZCBzdHJpa2UtdGhyb3VnaCBpZiBuZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBkZWNvcgorICAgICAqIEBwYXJhbSBieXRlc0NvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRleHQKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggaW4gcGl4ZWxzIG9mIHRoZSB0ZXh0LCBjYW4gYmUgPD0gMC4wZiB0byBmb3JjZSBhIG1lYXN1cmVtZW50CisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dCB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSB0ZXh0IHdpdGgKKyAgICAgKi8KKyAgICB2b2lkIGRyYXdUZXh0RGVjb3JhdGlvbnMoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGZsb2F0IGxlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksIFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgdGV4dHVyZSBjb29yZGluYXRlcyBzdG9yZWQgaW4gbU1lc2hWZXJ0aWNlcy4gU2V0dGluZyB0aGUgdmFsdWVzCisgICAgICogYmFjayB0byBkZWZhdWx0IGlzIGFjaGlldmVkIGJ5IGNhbGxpbmc6CisgICAgICoKKyAgICAgKiByZXNldERyYXdUZXh0dXJlVGV4Q29vcmRzKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOworICAgICAqCisgICAgICogQHBhcmFtIHUxIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHRleHR1cmUKKyAgICAgKiBAcGFyYW0gdjEgVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHUyIFRoZSByaWdodCBjb29yZGluYXRlIG9mIHRoZSB0ZXh0dXJlCisgICAgICogQHBhcmFtIHYyIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dHVyZQorICAgICAqLworICAgIHZvaWQgcmVzZXREcmF3VGV4dHVyZVRleENvb3JkcyhmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHUyLCBmbG9hdCB2Mik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhbHBoYSBhbmQgeGZlcm1vZGUgb3V0IG9mIGEgcGFpbnQgb2JqZWN0LiBJZiB0aGUgcGFpbnQgaXMgbnVsbAorICAgICAqIGFscGhhIHdpbGwgYmUgMjU1IGFuZCB0aGUgeGZlcm1vZGUgd2lsbCBiZSBTUkNfT1ZFUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbQorICAgICAqIEBwYXJhbSBhbHBoYSBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIGFscGhhCisgICAgICogQHBhcmFtIG1vZGUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdGluZyB4ZmVybW9kZQorICAgICAqLworICAgIGlubGluZSB2b2lkIGdldEFscGhhQW5kTW9kZShjb25zdCBTa1BhaW50KiBwYWludCwgaW50KiBhbHBoYSwgU2tYZmVybW9kZTo6TW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIHRleHR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXAgbW9kZXMuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgYmluZFRleHR1cmUoR0x1aW50IHRleHR1cmUsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBULCBHTHVpbnQgdGV4dHVyZVVuaXQgPSAwKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGJsZW5kaW5nIGFzIG5lY2Vzc2FyeS4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBhcHByb3ByaWF0ZQorICAgICAqIGJsZW5kIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2hvb3NlQmxlbmRpbmcoYm9vbCBibGVuZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgYm9vbCBzd2FwU3JjRHN0ID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogU2FmZWx5IHJldHJpZXZlcyB0aGUgbW9kZSBmcm9tIHRoZSBzcGVjaWZpZWQgeGZlcm1vZGUuIElmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB4ZmVybW9kZSBpcyBudWxsLCB0aGUgbW9kZSBpcyBhc3N1bWVkIHRvIGJlIFNrWGZlcm1vZGU6OmtTcmNPdmVyX01vZGUuCisgICAgICovCisgICAgaW5saW5lIFNrWGZlcm1vZGU6Ok1vZGUgZ2V0WGZlcm1vZGUoU2tYZmVybW9kZSogbW9kZSk7CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIHNwZWNpZmllZCBwcm9ncmFtIHdpdGggdGhlIGN1cnJlbnQgR0wgY29udGV4dC4gSWYgdGhlIHByb2dyYW0gaXMgYWxyZWFkeQorICAgICAqIGluIHVzZSwgaXQgd2lsbCBub3QgYmUgYm91bmQgYWdhaW4uIElmIGl0IGlzIG5vdCBpbiB1c2UsIHRoZSBjdXJyZW50IHByb2dyYW0gaXMKKyAgICAgKiBtYXJrZWQgdW51c2VkIGFuZCB0aGUgc3BlY2lmaWVkIHByb2dyYW0gYmVjb21lcyB1c2VkIGFuZCBiZWNvbWVzIHRoZSBuZXcKKyAgICAgKiBjdXJyZW50IHByb2dyYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byB1c2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBJZiB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2FzIGFscmVhZHkgaW4gdXNlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgdXNlUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworICAgIC8vIERpbWVuc2lvbnMgb2YgdGhlIGRyYXdpbmcgc3VyZmFjZQorICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7CisKKyAgICAvLyBNYXRyaXggdXNlZCBmb3Igb3J0aG8gcHJvamVjdGlvbiBpbiBzaGFkZXJzCisgICAgbWF0NCBtT3J0aG9NYXRyaXg7CisKKyAgICAvLyBNb2RlbC12aWV3IG1hdHJpeCB1c2VkIHRvIHBvc2l0aW9uL3NpemUgb2JqZWN0cworICAgIG1hdDQgbU1vZGVsVmlldzsKKworICAgIC8vIE51bWJlciBvZiBzYXZlZCBzdGF0ZXMKKyAgICBpbnQgbVNhdmVDb3VudDsKKyAgICAvLyBCYXNlIHN0YXRlCisgICAgc3A8U25hcHNob3Q+IG1GaXJzdFNuYXBzaG90OworICAgIC8vIEN1cnJlbnQgc3RhdGUKKyAgICBzcDxTbmFwc2hvdD4gbVNuYXBzaG90OworCisgICAgLy8gU2hhZGVycworICAgIFNraWFTaGFkZXIqIG1TaGFkZXI7CisKKyAgICAvLyBDb2xvciBmaWx0ZXJzCisgICAgU2tpYUNvbG9yRmlsdGVyKiBtQ29sb3JGaWx0ZXI7CisKKyAgICAvLyBVc2VkIHRvIGRyYXcgdGV4dHVyZWQgcXVhZHMKKyAgICBUZXh0dXJlVmVydGV4IG1NZXNoVmVydGljZXNbNF07CisKKyAgICAvLyBHTCBleHRlbnNpb25zCisgICAgRXh0ZW5zaW9ucyBtRXh0ZW5zaW9uczsKKworICAgIC8vIERyb3Agc2hhZG93CisgICAgYm9vbCBtSGFzU2hhZG93OworICAgIGZsb2F0IG1TaGFkb3dSYWRpdXM7CisgICAgZmxvYXQgbVNoYWRvd0R4OworICAgIGZsb2F0IG1TaGFkb3dEeTsKKyAgICBpbnQgbVNoYWRvd0NvbG9yOworCisgICAgLy8gVmFyaW91cyBjYWNoZXMKKyAgICBDYWNoZXMmIG1DYWNoZXM7CisKKyAgICAvLyBMaXN0IG9mIHJlY3RhbmdsZXMgdG8gY2xlYXIgZHVlIHRvIGNhbGxzIHRvIHNhdmVMYXllcigpCisgICAgVmVjdG9yPFJlY3QqPiBtTGF5ZXJzOworCit9OyAvLyBjbGFzcyBPcGVuR0xSZW5kZXJlcgorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfT1BFTkdMX1JFTkRFUkVSX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9QYXRjaC5jcHAgYi9saWJzL2h3dWkvUGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUGF0Y2guY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlBhdGNoLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0Y2g6OlBhdGNoKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KToKKyAgICAgICAgeENvdW50KHhDb3VudCArIDIpLCB5Q291bnQoeUNvdW50ICsgMikgeworICAgIHZlcnRpY2VzQ291bnQgPSAoeENvdW50ICsgMikgKiAoeUNvdW50ICsgMik7CisgICAgdmVydGljZXMgPSBuZXcgVGV4dHVyZVZlcnRleFt2ZXJ0aWNlc0NvdW50XTsKKworICAgIC8vIDIgdHJpYW5nbGVzIHBlciBwYXRjaCwgMyB2ZXJ0aWNlcyBwZXIgdHJpYW5nbGUKKyAgICBpbmRpY2VzQ291bnQgPSAoeENvdW50ICsgMSkgKiAoeUNvdW50ICsgMSkgKiAyICogMzsKKyAgICBpbmRpY2VzID0gbmV3IHVpbnQxNl90W2luZGljZXNDb3VudF07CisKKyAgICBjb25zdCB1aW50MzJfdCB4TnVtID0geENvdW50ICsgMTsKKyAgICBjb25zdCB1aW50MzJfdCB5TnVtID0geUNvdW50ICsgMTsKKworICAgIHVpbnQxNl90KiBzdGFydEluZGljZXMgPSBpbmRpY2VzOworICAgIHVpbnQzMl90IG4gPSAwOworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCB5TnVtOyB5KyspIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IHhOdW07IHgrKykgeworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbjsKKyAgICAgICAgICAgICpzdGFydEluZGljZXMrKyA9IG4gKyAxOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAyOworCisgICAgICAgICAgICAqc3RhcnRJbmRpY2VzKysgPSBuOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAyOworICAgICAgICAgICAgKnN0YXJ0SW5kaWNlcysrID0gbiArIHhOdW0gKyAxOworCisgICAgICAgICAgICBuICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgbiArPSAxOworICAgIH0KK30KKworUGF0Y2g6On5QYXRjaCgpIHsKKyAgICBkZWxldGUgaW5kaWNlczsKKyAgICBkZWxldGUgdmVydGljZXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZlcnRpY2VzIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaDo6dXBkYXRlVmVydGljZXMoY29uc3QgU2tCaXRtYXAqIGJpdG1hcCwgZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwKKyAgICAgICAgZmxvYXQgYm90dG9tLCBjb25zdCBpbnQzMl90KiB4RGl2cywgIGNvbnN0IGludDMyX3QqIHlEaXZzLCBjb25zdCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgY29uc3QgdWludDMyX3QgeFN0cmV0Y2hDb3VudCA9ICh3aWR0aCArIDEpID4+IDE7CisgICAgY29uc3QgdWludDMyX3QgeVN0cmV0Y2hDb3VudCA9IChoZWlnaHQgKyAxKSA+PiAxOworCisgICAgZmxvYXQgeFN0cmV0Y2ggPSAwOworICAgIGZsb2F0IHlTdHJldGNoID0gMDsKKyAgICBmbG9hdCB4U3RyZXRjaFRleCA9IDA7CisgICAgZmxvYXQgeVN0cmV0Y2hUZXggPSAwOworCisgICAgY29uc3QgZmxvYXQgbWVzaFdpZHRoID0gcmlnaHQgLSBsZWZ0OworCisgICAgY29uc3QgZmxvYXQgYml0bWFwV2lkdGggPSBmbG9hdChiaXRtYXAtPndpZHRoKCkpOworICAgIGNvbnN0IGZsb2F0IGJpdG1hcEhlaWdodCA9IGZsb2F0KGJpdG1hcC0+aGVpZ2h0KCkpOworCisgICAgaWYgKHhTdHJldGNoQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN0cmV0Y2hTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IHdpZHRoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHN0cmV0Y2hTaXplICs9IHhEaXZzW2ldIC0geERpdnNbaSAtIDFdOworICAgICAgICB9CisgICAgICAgIHhTdHJldGNoVGV4ID0gKHN0cmV0Y2hTaXplIC8gYml0bWFwV2lkdGgpIC8geFN0cmV0Y2hDb3VudDsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWQgPSBiaXRtYXBXaWR0aCAtIHN0cmV0Y2hTaXplOworICAgICAgICB4U3RyZXRjaCA9IChyaWdodCAtIGxlZnQgLSBmaXhlZCkgLyB4U3RyZXRjaENvdW50OworICAgIH0KKworICAgIGlmICh5U3RyZXRjaENvdW50ID4gMCkgeworICAgICAgICB1aW50MzJfdCBzdHJldGNoU2l6ZSA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBoZWlnaHQ7IGkgKz0gMikgeworICAgICAgICAgICAgc3RyZXRjaFNpemUgKz0geURpdnNbaV0gLSB5RGl2c1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgeVN0cmV0Y2hUZXggPSAoc3RyZXRjaFNpemUgLyBiaXRtYXBIZWlnaHQpIC8geVN0cmV0Y2hDb3VudDsKKyAgICAgICAgY29uc3QgZmxvYXQgZml4ZWQgPSBiaXRtYXBIZWlnaHQgLSBzdHJldGNoU2l6ZTsKKyAgICAgICAgeVN0cmV0Y2ggPSAoYm90dG9tIC0gdG9wIC0gZml4ZWQpIC8geVN0cmV0Y2hDb3VudDsKKyAgICB9CisKKyAgICBmbG9hdCB2eSA9IDAuMGY7CisgICAgZmxvYXQgdHkgPSAwLjBmOworICAgIFRleHR1cmVWZXJ0ZXgqIHZlcnRleCA9IHZlcnRpY2VzOworCisgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIDAuMGYsIDAuMGYsIHhEaXZzLCB3aWR0aCwgeFN0cmV0Y2gsIHhTdHJldGNoVGV4LAorICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7CisgICAgdmVydGV4ICs9IHdpZHRoICsgMjsKKworICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoeSAmIDEpIHsKKyAgICAgICAgICAgIHZ5ICs9IHlTdHJldGNoOworICAgICAgICAgICAgdHkgKz0geVN0cmV0Y2hUZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzdGVwID0gZmxvYXQoeURpdnNbeV0pOworICAgICAgICAgICAgdnkgKz0gc3RlcDsKKyAgICAgICAgICAgIHR5ICs9IHN0ZXAgLyBiaXRtYXBIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIHZ5LCB0eSwgeERpdnMsIHdpZHRoLCB4U3RyZXRjaCwgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICAgICAgbWVzaFdpZHRoLCBiaXRtYXBXaWR0aCk7CisgICAgICAgIHZlcnRleCArPSB3aWR0aCArIDI7CisgICAgfQorCisgICAgZ2VuZXJhdGVWZXJ0aWNlcyh2ZXJ0ZXgsIGJvdHRvbSAtIHRvcCwgMS4wZiwgeERpdnMsIHdpZHRoLCB4U3RyZXRjaCwgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICBtZXNoV2lkdGgsIGJpdG1hcFdpZHRoKTsKK30KKworaW5saW5lIHZvaWQgUGF0Y2g6OmdlbmVyYXRlVmVydGljZXMoVGV4dHVyZVZlcnRleCogdmVydGV4LCBmbG9hdCB5LCBmbG9hdCB2LAorICAgICAgICBjb25zdCBpbnQzMl90IHhEaXZzW10sIHVpbnQzMl90IHhDb3VudCwgZmxvYXQgeFN0cmV0Y2gsIGZsb2F0IHhTdHJldGNoVGV4LAorICAgICAgICBmbG9hdCB3aWR0aCwgZmxvYXQgd2lkdGhUZXgpIHsKKyAgICBmbG9hdCB2eCA9IDAuMGY7CisgICAgZmxvYXQgdHggPSAwLjBmOworCisgICAgVGV4dHVyZVZlcnRleDo6c2V0KHZlcnRleCwgdngsIHksIHR4LCB2KTsKKyAgICB2ZXJ0ZXgrKzsKKworICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4Q291bnQ7IHgrKykgeworICAgICAgICBpZiAoeCAmIDEpIHsKKyAgICAgICAgICAgIHZ4ICs9IHhTdHJldGNoOworICAgICAgICAgICAgdHggKz0geFN0cmV0Y2hUZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzdGVwID0gZmxvYXQoeERpdnNbeF0pOworICAgICAgICAgICAgdnggKz0gc3RlcDsKKyAgICAgICAgICAgIHR4ICs9IHN0ZXAgLyB3aWR0aFRleDsKKyAgICAgICAgfQorCisgICAgICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHZ4LCB5LCB0eCwgdik7CisgICAgICAgIHZlcnRleCsrOworICAgIH0KKworICAgIFRleHR1cmVWZXJ0ZXg6OnNldCh2ZXJ0ZXgsIHdpZHRoLCB5LCAxLjBmLCB2KTsKKyAgICB2ZXJ0ZXgrKzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVidWcgdG9vbHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQYXRjaDo6ZHVtcCgpIHsKKyAgICBMT0dEKCJWZXJ0aWNlcyBbIik7CisgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IHlDb3VudDsgeSsrKSB7CisgICAgICAgIGNoYXIgYnVmZmVyWzUxMl07CisgICAgICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCB4Q291bnQ7IHgrKykgeworICAgICAgICAgICAgVGV4dHVyZVZlcnRleCogdiA9ICZ2ZXJ0aWNlc1t5ICogeENvdW50ICsgeF07CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZigmYnVmZmVyW29mZnNldF0sICIgKCUuNGYsJS40ZiktKCUuNGYsJS40ZikiLAorICAgICAgICAgICAgICAgICAgICB2LT5wb3NpdGlvblswXSwgdi0+cG9zaXRpb25bMV0sIHYtPnRleHR1cmVbMF0sIHYtPnRleHR1cmVbMV0pOworICAgICAgICB9CisgICAgICAgIExPR0QoIiAgWyVzIF0iLCBidWZmZXIpOworICAgIH0KKyAgICBMT0dEKCJdXG5JbmRpY2VzIFsgIik7CisgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7IGkrKykgeworICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZigmYnVmZmVyW29mZnNldF0sICIlZCAiLCBpbmRpY2VzW2ldKTsKKyAgICB9CisgICAgTE9HRCgiICAlc1xuXSIsIGJ1ZmZlcik7Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGNoLmggYi9saWJzL2h3dWkvUGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDNhZDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRDSF9ICisjZGVmaW5lIEFORFJPSURfVUlfUEFUQ0hfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorCisjaW5jbHVkZSAiVmVydGV4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhIHBhdGNoLgorICovCitzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbiB7CisgICAgUGF0Y2hEZXNjcmlwdGlvbigpOiB4Q291bnQoMCksIHlDb3VudCgwKSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IHVpbnQzMl90IHhDb3VudCwgY29uc3QgdWludDMyX3QgeUNvdW50KToKKyAgICAgICAgICAgIHhDb3VudCh4Q291bnQpLCB5Q291bnQoeUNvdW50KSB7IH0KKyAgICBQYXRjaERlc2NyaXB0aW9uKGNvbnN0IFBhdGNoRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKToKKyAgICAgICAgICAgIHhDb3VudChkZXNjcmlwdGlvbi54Q291bnQpLCB5Q291bnQoZGVzY3JpcHRpb24ueUNvdW50KSB7IH0KKworICAgIHVpbnQzMl90IHhDb3VudDsKKyAgICB1aW50MzJfdCB5Q291bnQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBQYXRjaERlc2NyaXB0aW9uJiByaHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKHhDb3VudCA9PSByaHMueENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4geUNvdW50IDwgcmhzLnlDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geENvdW50IDwgcmhzLnhDb3VudDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUGF0Y2hEZXNjcmlwdGlvbiYgcmhzKSBjb25zdCB7CisgICAgICAgIHJldHVybiB4Q291bnQgPT0gcmhzLnhDb3VudCAmJiB5Q291bnQgPT0gcmhzLnlDb3VudDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUGF0Y2hEZXNjcmlwdGlvbgorCisvKioKKyAqIEFuIE9wZW5HTCBwYXRjaC4gVGhpcyBjb250YWlucyBhbiBhcnJheSBvZiB2ZXJ0aWNlcyBhbmQgYW4gYXJyYXkgb2YKKyAqIGluZGljZXMgdG8gcmVuZGVyIHRoZSB2ZXJ0aWNlcy4KKyAqLworc3RydWN0IFBhdGNoIHsKKyAgICBQYXRjaChjb25zdCB1aW50MzJfdCB4Q291bnQsIGNvbnN0IHVpbnQzMl90IHlDb3VudCk7CisgICAgflBhdGNoKCk7CisKKyAgICB2b2lkIHVwZGF0ZVZlcnRpY2VzKGNvbnN0IFNrQml0bWFwKiBiaXRtYXAsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHhEaXZzLCAgY29uc3QgaW50MzJfdCogeURpdnMsCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB3aWR0aCwgY29uc3QgdWludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGR1bXAoKTsKKworICAgIHVpbnQzMl90IHhDb3VudDsKKyAgICB1aW50MzJfdCB5Q291bnQ7CisKKyAgICB1aW50MTZfdCogaW5kaWNlczsKKyAgICB1aW50MzJfdCBpbmRpY2VzQ291bnQ7CisKKyAgICBUZXh0dXJlVmVydGV4KiB2ZXJ0aWNlczsKKyAgICB1aW50MzJfdCB2ZXJ0aWNlc0NvdW50OworCitwcml2YXRlOgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBnZW5lcmF0ZVZlcnRpY2VzKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgeSwgZmxvYXQgdiwKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgeERpdnNbXSwgdWludDMyX3QgeENvdW50LCBmbG9hdCB4U3RyZXRjaCwgZmxvYXQgeFN0cmV0Y2hUZXgsCisgICAgICAgICAgICBmbG9hdCB3aWR0aCwgZmxvYXQgd2lkdGhUZXgpOworfTsgLy8gc3RydWN0IFBhdGNoCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRDSF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAgYi9saWJzL2h3dWkvUGF0Y2hDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMGNjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRjaENhY2hlLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1Jlc291cmNlVHlwZXMuaD4KKworI2luY2x1ZGUgIlBhdGNoQ2FjaGUuaCIKKyNpbmNsdWRlICJQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29uc3RydWN0b3JzL2Rlc3RydWN0b3IKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGF0Y2hDYWNoZTo6UGF0Y2hDYWNoZSgpOiBtQ2FjaGUoREVGQVVMVF9QQVRDSF9DQUNIRV9TSVpFKSB7Cit9CisKK1BhdGNoQ2FjaGU6OlBhdGNoQ2FjaGUodWludDMyX3QgbWF4RW50cmllcyk6IG1DYWNoZShtYXhFbnRyaWVzKSB7Cit9CisKK1BhdGNoQ2FjaGU6On5QYXRjaENhY2hlKCkgeworICAgIGNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFBhdGNoQ2FjaGU6Om9wZXJhdG9yKCkoUGF0Y2hEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sIFBhdGNoKiYgbWVzaCkgeworICAgIGlmIChtZXNoKSBkZWxldGUgbWVzaDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGluZworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFBhdGNoQ2FjaGU6OmNsZWFyKCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworICAgIG1DYWNoZS5jbGVhcigpOworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE5VTEwpOworfQorCitQYXRjaCogUGF0Y2hDYWNoZTo6Z2V0KGNvbnN0IFJlc19wbmdfOXBhdGNoKiBwYXRjaCkgeworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gcGF0Y2gtPm51bVhEaXZzOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IHBhdGNoLT5udW1ZRGl2czsKKyAgICBjb25zdCBQYXRjaERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKHdpZHRoLCBoZWlnaHQpOworCisgICAgUGF0Y2gqIG1lc2ggPSBtQ2FjaGUuZ2V0KGRlc2NyaXB0aW9uKTsKKyAgICBpZiAoIW1lc2gpIHsKKyAgICAgICAgUEFUQ0hfTE9HRCgiQ3JlYXRpbmcgbmV3IHBhdGNoIG1lc2gsIHc9JWQgaD0lZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBtZXNoID0gbmV3IFBhdGNoKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBtQ2FjaGUucHV0KGRlc2NyaXB0aW9uLCBtZXNoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVzaDsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0Y2hDYWNoZS5oIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFkODMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGNoQ2FjaGUuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1BBVENIX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QQVRDSF9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9SZXNvdXJjZVR5cGVzLmg+CisKKyNpbmNsdWRlICJQYXRjaC5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfUEFUQ0hFUyAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUEFUQ0hFUworICAgICNkZWZpbmUgUEFUQ0hfTE9HRCguLi4pIExPR0QoX19WQV9BUkdTX18pCisjZWxzZQorICAgICNkZWZpbmUgUEFUQ0hfTE9HRCguLi4pCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FjaGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgUGF0Y2hDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFBhdGNoRGVzY3JpcHRpb24sIFBhdGNoKj4geworcHVibGljOgorICAgIFBhdGNoQ2FjaGUoKTsKKyAgICBQYXRjaENhY2hlKHVpbnQzMl90IG1heENhcGFjaXR5KTsKKyAgICB+UGF0Y2hDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShQYXRjaERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgUGF0Y2gqJiBtZXNoKTsKKworICAgIFBhdGNoKiBnZXQoY29uc3QgUmVzX3BuZ185cGF0Y2gqIHBhdGNoKTsKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgR2VuZXJhdGlvbkNhY2hlPFBhdGNoRGVzY3JpcHRpb24sIFBhdGNoKj4gbUNhY2hlOworfTsgLy8gY2xhc3MgUGF0Y2hDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfUEFUQ0hfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAgYi9saWJzL2h3dWkvUGF0aENhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUwNmExCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1BhdGhDYWNoZS5jcHAKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9wZW5HTFJlbmRlcmVyIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrUmVjdC5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCisjaW5jbHVkZSAiUGF0aENhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1BhdGhDYWNoZTo6UGF0aENhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8UGF0aENhY2hlRW50cnksIFBhdGhUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9QQVRIX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHBhdGggY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHBhdGggY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX1BBVEhfQ0FDSEVfU0laRSk7CisgICAgfQorICAgIGluaXQoKTsKK30KKworUGF0aENhY2hlOjpQYXRoQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOgorICAgICAgICBtQ2FjaGUoR2VuZXJhdGlvbkNhY2hlPFBhdGhDYWNoZUVudHJ5LCBQYXRoVGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBpbml0KCk7Cit9CisKK1BhdGhDYWNoZTo6flBhdGhDYWNoZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFBhdGhDYWNoZTo6aW5pdCgpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKKworICAgIEdMaW50IG1heFRleHR1cmVTaXplOworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1heFRleHR1cmVTaXplKTsKKyAgICBtTWF4VGV4dHVyZVNpemUgPSBtYXhUZXh0dXJlU2l6ZTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU2l6ZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3VpbnQzMl90IFBhdGhDYWNoZTo6Z2V0U2l6ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgUGF0aENhY2hlOjpnZXRNYXhTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1NYXhTaXplOworfQorCit2b2lkIFBhdGhDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTWF4U2l6ZSA9IG1heFNpemU7CisgICAgd2hpbGUgKG1TaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2FsbGJhY2tzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0aENhY2hlOjpvcGVyYXRvcigpKFBhdGhDYWNoZUVudHJ5JiBwYXRoLCBQYXRoVGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQ7CisgICAgbVNpemUgLT0gc2l6ZTsKKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUGF0aENhY2hlOjpyZW1vdmUoU2tQYXRoKiBwYXRoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBUT0RPOiBMaW5lYXIgc2VhcmNoLi4uCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNhY2hlLmdldEtleUF0KGkpLnBhdGggPT0gcGF0aCkgeworICAgICAgICAgICAgbUNhY2hlLnJlbW92ZUF0KGkpOworICAgICAgICB9CisgICAgfQorfQorCitQYXRoVGV4dHVyZSogUGF0aENhY2hlOjpnZXQoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCkgeworICAgIFBhdGhDYWNoZUVudHJ5IGVudHJ5KHBhdGgsIHBhaW50KTsKKworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoZW50cnkpOworICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBhZGRUZXh0dXJlKGVudHJ5LCBwYXRoLCBwYWludCk7CisgICAgfSBlbHNlIGlmIChwYXRoLT5nZXRHZW5lcmF0aW9uSUQoKSAhPSB0ZXh0dXJlLT5nZW5lcmF0aW9uKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbUNhY2hlLnJlbW92ZShlbnRyeSk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB0ZXh0dXJlID0gYWRkVGV4dHVyZShlbnRyeSwgcGF0aCwgcGFpbnQpOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCitQYXRoVGV4dHVyZSogUGF0aENhY2hlOjphZGRUZXh0dXJlKGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSwKKyAgICAgICAgY29uc3QgU2tQYXRoICpwYXRoLCBjb25zdCBTa1BhaW50KiBwYWludCkgeworICAgIGNvbnN0IFNrUmVjdCYgYm91bmRzID0gcGF0aC0+Z2V0Qm91bmRzKCk7CisKKyAgICBjb25zdCBmbG9hdCBwYXRoV2lkdGggPSBib3VuZHMud2lkdGgoKTsKKyAgICBjb25zdCBmbG9hdCBwYXRoSGVpZ2h0ID0gYm91bmRzLmhlaWdodCgpOworCisgICAgaWYgKHBhdGhXaWR0aCA+IG1NYXhUZXh0dXJlU2l6ZSB8fCBwYXRoSGVpZ2h0ID4gbU1heFRleHR1cmVTaXplKSB7CisgICAgICAgIExPR1coIlBhdGggdG9vIGxhcmdlIHRvIGJlIHJlbmRlcmVkIGludG8gYSB0ZXh0dXJlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IGZsb2F0IG9mZnNldCA9IGVudHJ5LnN0cm9rZVdpZHRoICogMS41ZjsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHVpbnQzMl90KHBhdGhXaWR0aCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gdWludDMyX3QocGF0aEhlaWdodCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBQYXRoVGV4dHVyZSogdGV4dHVyZSA9IG5ldyBQYXRoVGV4dHVyZTsKKyAgICB0ZXh0dXJlLT5sZWZ0ID0gYm91bmRzLmZMZWZ0OworICAgIHRleHR1cmUtPnRvcCA9IGJvdW5kcy5mVG9wOworICAgIHRleHR1cmUtPm9mZnNldCA9IG9mZnNldDsKKyAgICB0ZXh0dXJlLT53aWR0aCA9IHdpZHRoOworICAgIHRleHR1cmUtPmhlaWdodCA9IGhlaWdodDsKKyAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gcGF0aC0+Z2V0R2VuZXJhdGlvbklEKCk7CisKKyAgICBTa0JpdG1hcCBiaXRtYXA7CisgICAgYml0bWFwLnNldENvbmZpZyhTa0JpdG1hcDo6a0E4X0NvbmZpZywgd2lkdGgsIGhlaWdodCk7CisgICAgYml0bWFwLmFsbG9jUGl4ZWxzKCk7CisgICAgYml0bWFwLmVyYXNlQ29sb3IoMCk7CisKKyAgICBTa0NhbnZhcyBjYW52YXMoYml0bWFwKTsKKyAgICBjYW52YXMudHJhbnNsYXRlKC1ib3VuZHMuZkxlZnQgKyBvZmZzZXQsIC1ib3VuZHMuZlRvcCArIG9mZnNldCk7CisgICAgY2FudmFzLmRyYXdQYXRoKCpwYXRoLCAqcGFpbnQpOworCisgICAgZ2VuZXJhdGVUZXh0dXJlKGJpdG1hcCwgdGV4dHVyZSk7CisKKyAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbVNpemUgKz0gc2l6ZTsKKyAgICAgICAgbUNhY2hlLnB1dChlbnRyeSwgdGV4dHVyZSk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit2b2lkIFBhdGhDYWNoZTo6Y2xlYXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUuY2xlYXIoKTsKK30KKwordm9pZCBQYXRoQ2FjaGU6OmdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCYgYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKSB7CisgICAgU2tBdXRvTG9ja1BpeGVscyBhbHAoYml0bWFwKTsKKyAgICBpZiAoIWJpdG1hcC5yZWFkeVRvRHJhdygpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZW5lcmF0ZSB0ZXh0dXJlIGZyb20gYml0bWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUtPmlkKTsKKyAgICAvLyBUZXh0dXJlcyBhcmUgQWxwaGE4CisgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKworICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgYml0bWFwLmdldFBpeGVscygpKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUGF0aENhY2hlLmggYi9saWJzL2h3dWkvUGF0aENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlMGU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9QYXRoQ2FjaGUuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisjaW5jbHVkZSA8U2tQYWludC5oPgorI2luY2x1ZGUgPFNrUGF0aC5oPgorCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdlbmVyYXRpb25DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogRGVzY3JpYmUgYSBwYXRoIGluIHRoZSBwYXRoIGNhY2hlLgorICovCitzdHJ1Y3QgUGF0aENhY2hlRW50cnkgeworICAgIFBhdGhDYWNoZUVudHJ5KCkgeworICAgICAgICBwYXRoID0gTlVMTDsKKyAgICAgICAgam9pbiA9IFNrUGFpbnQ6OmtEZWZhdWx0X0pvaW47CisgICAgICAgIGNhcCA9IFNrUGFpbnQ6OmtEZWZhdWx0X0NhcDsKKyAgICAgICAgc3R5bGUgPSBTa1BhaW50OjprRmlsbF9TdHlsZTsKKyAgICAgICAgbWl0ZXIgPSA0LjBmOworICAgICAgICBzdHJva2VXaWR0aCA9IDEuMGY7CisgICAgfQorCisgICAgUGF0aENhY2hlRW50cnkoY29uc3QgUGF0aENhY2hlRW50cnkmIGVudHJ5KToKKyAgICAgICAgcGF0aChlbnRyeS5wYXRoKSwgam9pbihlbnRyeS5qb2luKSwgY2FwKGVudHJ5LmNhcCksCisgICAgICAgIHN0eWxlKGVudHJ5LnN0eWxlKSwgbWl0ZXIoZW50cnkubWl0ZXIpLAorICAgICAgICBzdHJva2VXaWR0aChlbnRyeS5zdHJva2VXaWR0aCkgeworICAgIH0KKworICAgIFBhdGhDYWNoZUVudHJ5KFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKKyAgICAgICAgdGhpcy0+cGF0aCA9IHBhdGg7CisgICAgICAgIGpvaW4gPSBwYWludC0+Z2V0U3Ryb2tlSm9pbigpOworICAgICAgICBjYXAgPSBwYWludC0+Z2V0U3Ryb2tlQ2FwKCk7CisgICAgICAgIG1pdGVyID0gcGFpbnQtPmdldFN0cm9rZU1pdGVyKCk7CisgICAgICAgIHN0cm9rZVdpZHRoID0gcGFpbnQtPmdldFN0cm9rZVdpZHRoKCk7CisgICAgICAgIHN0eWxlID0gcGFpbnQtPmdldFN0eWxlKCk7CisgICAgfQorCisgICAgU2tQYXRoKiBwYXRoOworICAgIFNrUGFpbnQ6OkpvaW4gam9pbjsKKyAgICBTa1BhaW50OjpDYXAgY2FwOworICAgIFNrUGFpbnQ6OlN0eWxlIHN0eWxlOworICAgIGZsb2F0IG1pdGVyOworICAgIGZsb2F0IHN0cm9rZVdpZHRoOworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUGF0aENhY2hlRW50cnkmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4gbWVtY21wKHRoaXMsICZyaHMsIHNpemVvZihQYXRoQ2FjaGVFbnRyeSkpIDwgMDsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgUGF0aENhY2hlRW50cnkKKworLyoqCisgKiBBbHBoYSB0ZXh0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcGF0aC4KKyAqLworc3RydWN0IFBhdGhUZXh0dXJlOiBwdWJsaWMgVGV4dHVyZSB7CisgICAgUGF0aFRleHR1cmUoKTogVGV4dHVyZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHBhdGggYm91bmRzLgorICAgICAqLworICAgIGZsb2F0IGxlZnQ7CisgICAgLyoqCisgICAgICogVG9wIGNvb3JkaW5hdGUgb2YgdGhlIHBhdGggYm91bmRzLgorICAgICAqLworICAgIGZsb2F0IHRvcDsKKyAgICAvKioKKyAgICAgKiBPZmZzZXQgdG8gZHJhdyB0aGUgcGF0aCBhdCB0aGUgY29ycmVjdCBvcmlnaW4uCisgICAgICovCisgICAgZmxvYXQgb2Zmc2V0OworfTsgLy8gc3RydWN0IFBhdGhUZXh0dXJlCisKKy8qKgorICogQSBzaW1wbGUgTFJVIHBhdGggY2FjaGUuIFRoZSBjYWNoZSBoYXMgYSBtYXhpbXVtIHNpemUgZXhwcmVzc2VkIGluIGJ5dGVzLgorICogQW55IHRleHR1cmUgYWRkZWQgdG8gdGhlIGNhY2hlIGNhdXNpbmcgdGhlIGNhY2hlIHRvIGdyb3cgYmV5b25kIHRoZSBtYXhpbXVtCisgKiBhbGxvd2VkIHNpemUgd2lsbCBhbHNvIGNhdXNlIHRoZSBvbGRlc3QgdGV4dHVyZSB0byBiZSBraWNrZWQgb3V0LgorICovCitjbGFzcyBQYXRoQ2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPiB7CitwdWJsaWM6CisgICAgUGF0aENhY2hlKCk7CisgICAgUGF0aENhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+UGF0aENhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIERvIG5vdCBpbnZva2UgZGlyZWN0bHkuCisgICAgICovCisgICAgdm9pZCBvcGVyYXRvcigpKFBhdGhDYWNoZUVudHJ5JiBwYXRoLCBQYXRoVGV4dHVyZSomIHRleHR1cmUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLiBJZiB0aGUgdGV4dHVyZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2FjaGUsIGEgbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIFBhdGhUZXh0dXJlKiBnZXQoU2tQYXRoKiBwYXRoLCBTa1BhaW50KiBwYWludCk7CisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjYWNoZS4gVGhpcyBjYXVzZXMgYWxsIHRleHR1cmVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYW4gZW50cnkuCisgICAgICovCisgICAgdm9pZCByZW1vdmUoU2tQYXRoKiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgdGV4dHVyZSBmcm9tIGEgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlVGV4dHVyZShTa0JpdG1hcCYgYml0bWFwLCBUZXh0dXJlKiB0ZXh0dXJlKTsKKworICAgIFBhdGhUZXh0dXJlKiBhZGRUZXh0dXJlKGNvbnN0IFBhdGhDYWNoZUVudHJ5JiBlbnRyeSwgY29uc3QgU2tQYXRoICpwYXRoLCBjb25zdCBTa1BhaW50KiBwYWludCk7CisKKyAgICB2b2lkIGluaXQoKTsKKworICAgIEdlbmVyYXRpb25DYWNoZTxQYXRoQ2FjaGVFbnRyeSwgUGF0aFRleHR1cmUqPiBtQ2FjaGU7CisKKyAgICB1aW50MzJfdCBtU2l6ZTsKKyAgICB1aW50MzJfdCBtTWF4U2l6ZTsKKyAgICBHTHVpbnQgbU1heFRleHR1cmVTaXplOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBhY2Nlc3MgbUNhY2hlIGFuZCBtU2l6ZS4gQWxsIG1ldGhvZHMgYXJlIGFjY2Vzc2VkIGZyb20gYSBzaW5nbGUKKyAgICAgKiB0aHJlYWQgZXhjZXB0IGZvciByZW1vdmUoKS4KKyAgICAgKi8KKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsgLy8gY2xhc3MgUGF0aENhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QQVRIX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcCBiL2xpYnMvaHd1aS9Qcm9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI4ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgIlByb2dyYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgU0hBREVSX1NPVVJDRShuYW1lLCBzb3VyY2UpIGNvbnN0IGNoYXIqIG5hbWUgPSAjc291cmNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEJhc2UgcHJvZ3JhbQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtOjpQcm9ncmFtKGNvbnN0IGNoYXIqIHZlcnRleCwgY29uc3QgY2hhciogZnJhZ21lbnQpIHsKKyAgICB2ZXJ0ZXhTaGFkZXIgPSBidWlsZFNoYWRlcih2ZXJ0ZXgsIEdMX1ZFUlRFWF9TSEFERVIpOworICAgIGZyYWdtZW50U2hhZGVyID0gYnVpbGRTaGFkZXIoZnJhZ21lbnQsIEdMX0ZSQUdNRU5UX1NIQURFUik7CisKKyAgICBpZCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGdsQXR0YWNoU2hhZGVyKGlkLCB2ZXJ0ZXhTaGFkZXIpOworICAgIGdsQXR0YWNoU2hhZGVyKGlkLCBmcmFnbWVudFNoYWRlcik7CisgICAgZ2xMaW5rUHJvZ3JhbShpZCk7CisKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRQcm9ncmFtaXYoaWQsIEdMX0xJTktfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7CisgICAgICAgIGdsR2V0UHJvZ3JhbWl2KGlkLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKKyAgICAgICAgaWYgKGluZm9MZW4gPiAxKSB7CisgICAgICAgICAgICBjaGFyKiBsb2cgPSAoY2hhciopIG1hbGxvYyhzaXplb2YoY2hhcikgKiBpbmZvTGVuKTsKKyAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2coaWQsIGluZm9MZW4sIDAsIGxvZyk7CisgICAgICAgICAgICBMT0dFKCJFcnJvciB3aGlsZSBsaW5raW5nIHNoYWRlcnM6ICVzIiwgbG9nKTsKKyAgICAgICAgICAgIGRlbGV0ZSBsb2c7CisgICAgICAgIH0KKyAgICAgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgICAgICBnbERlbGV0ZVByb2dyYW0oaWQpOworICAgIH0KKworICAgIG1Vc2UgPSBmYWxzZTsKKworICAgIHBvc2l0aW9uID0gYWRkQXR0cmliKCJwb3NpdGlvbiIpOworICAgIGNvbG9yID0gYWRkVW5pZm9ybSgiY29sb3IiKTsKKyAgICB0cmFuc2Zvcm0gPSBhZGRVbmlmb3JtKCJ0cmFuc2Zvcm0iKTsKK30KKworUHJvZ3JhbTo6flByb2dyYW0oKSB7CisgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgZ2xEZWxldGVQcm9ncmFtKGlkKTsKK30KKworaW50IFByb2dyYW06OmFkZEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgaW50IHNsb3QgPSBnbEdldEF0dHJpYkxvY2F0aW9uKGlkLCBuYW1lKTsKKyAgICBhdHRyaWJ1dGVzLmFkZChuYW1lLCBzbG90KTsKKyAgICByZXR1cm4gc2xvdDsKK30KKworaW50IFByb2dyYW06OmdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpbmRleCA9IGF0dHJpYnV0ZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGFkZEF0dHJpYihuYW1lKTsKK30KKworaW50IFByb2dyYW06OmFkZFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBzbG90ID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24oaWQsIG5hbWUpOworICAgIHVuaWZvcm1zLmFkZChuYW1lLCBzbG90KTsKKyAgICByZXR1cm4gc2xvdDsKK30KKworaW50IFByb2dyYW06OmdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaW5kZXggPSB1bmlmb3Jtcy5pbmRleE9mS2V5KG5hbWUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiB1bmlmb3Jtcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGFkZFVuaWZvcm0obmFtZSk7Cit9CisKK0dMdWludCBQcm9ncmFtOjpidWlsZFNoYWRlcihjb25zdCBjaGFyKiBzb3VyY2UsIEdMZW51bSB0eXBlKSB7CisgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHR5cGUpOworICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnNvdXJjZSwgMCk7CisgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgLy8gU29tZSBkcml2ZXJzIHJldHVybiB3cm9uZyB2YWx1ZXMgZm9yIEdMX0lORk9fTE9HX0xFTkdUSAorICAgICAgICAvLyB1c2UgYSBmaXhlZCBzaXplIGluc3RlYWQKKyAgICAgICAgR0xjaGFyIGxvZ1s1MTJdOworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBzaXplb2YobG9nKSwgMCwgJmxvZ1swXSk7CisgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGNvbXBpbGluZyBzaGFkZXI6ICVzIiwgbG9nKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFByb2dyYW06OnNldChjb25zdCBtYXQ0JiBwcm9qZWN0aW9uTWF0cml4LCBjb25zdCBtYXQ0JiBtb2RlbFZpZXdNYXRyaXgsCisgICAgICAgIGNvbnN0IG1hdDQmIHRyYW5zZm9ybU1hdHJpeCkgeworICAgIG1hdDQgdChwcm9qZWN0aW9uTWF0cml4KTsKKyAgICB0Lm11bHRpcGx5KHRyYW5zZm9ybU1hdHJpeCk7CisgICAgdC5tdWx0aXBseShtb2RlbFZpZXdNYXRyaXgpOworCisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHRyYW5zZm9ybSwgMSwgR0xfRkFMU0UsICZ0LmRhdGFbMF0pOworfQorCit2b2lkIFByb2dyYW06OnVzZSgpIHsKKyAgICBnbFVzZVByb2dyYW0oaWQpOworICAgIG1Vc2UgPSB0cnVlOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShwb3NpdGlvbik7Cit9CisKK3ZvaWQgUHJvZ3JhbTo6cmVtb3ZlKCkgeworICAgIG1Vc2UgPSBmYWxzZTsKKworICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvUHJvZ3JhbS5oIGIvbGlicy9od3VpL1Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTMxYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1Byb2dyYW0uaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QUk9HUkFNX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QUk9HUkFNX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8qKgorICogQSBwcm9ncmFtIGhvbGRzIGEgdmVydGV4IGFuZCBhIGZyYWdtZW50IHNoYWRlci4gSXQgb2ZmZXJzIHNldmVyYWwgdXRpbGl0eQorICogbWV0aG9kcyB0byBxdWVyeSBhdHRyaWJ1dGVzIGFuZCB1bmlmb3Jtcy4KKyAqLworY2xhc3MgUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBwcm9ncmFtIHdpdGggdGhlIHNwZWNpZmllZCB2ZXJ0ZXggYW5kIGZyYWdtZW50CisgICAgICogc2hhZGVycyBzb3VyY2VzLgorICAgICAqLworICAgIFByb2dyYW0oY29uc3QgY2hhciogdmVydGV4LCBjb25zdCBjaGFyKiBmcmFnbWVudCk7CisgICAgdmlydHVhbCB+UHJvZ3JhbSgpOworCisgICAgLyoqCisgICAgICogQmluZHMgdGhpcyBwcm9ncmFtIHRvIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCB1c2UoKTsKKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoaXMgcHJvZ3JhbSBhcyB1bnVzZWQuIFRoaXMgd2lsbCBub3QgdW5iaW5kCisgICAgICogdGhlIHByb2dyYW0gZnJvbSB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0QXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgT3BlbkdMIG5hbWUgb2YgdGhlIHNwZWNpZmllZCB1bmlmb3JtLgorICAgICAqLworICAgIGludCBnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwcm9ncmFtIGlzIGN1cnJlbnRseSBpbiB1c2Ugd2l0aAorICAgICAqIHRoZSBHTCBjb250ZXh0LgorICAgICAqLworICAgIGlubGluZSBib29sIGlzSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBwcm9ncmFtIHdpdGggdGhlIHNwZWNpZmllZCBwcm9qZWN0aW9uLCBtb2RlbFZpZXcgYW5kCisgICAgICogdHJhbnNmb3JtIG1hdHJpY2VzLgorICAgICAqLworICAgIHZvaWQgc2V0KGNvbnN0IG1hdDQmIHByb2plY3Rpb25NYXRyaXgsIGNvbnN0IG1hdDQmIG1vZGVsVmlld01hdHJpeCwKKyAgICAgICAgICAgICBjb25zdCBtYXQ0JiB0cmFuc2Zvcm1NYXRyaXgpOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgcG9zaXRpb24gYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBwb3NpdGlvbjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGNvbG9yIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IGNvbG9yOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgdHJhbnNmb3JtIHVuaWZvcm0uCisgICAgICovCisgICAgaW50IHRyYW5zZm9ybTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEFkZHMgYW4gYXR0cmlidXRlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgT3BlbkdMIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBpbnQgYWRkQXR0cmliKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIHVuaWZvcm0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBPcGVuR0wgbmFtZSBvZiB0aGUgdW5pZm9ybS4KKyAgICAgKi8KKyAgICBpbnQgYWRkVW5pZm9ybShjb25zdCBjaGFyKiBuYW1lKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyB0aGUgc3BlY2lmaWVkIHNoYWRlciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjb21waWxlZCBzaGFkZXIuCisgICAgICovCisgICAgR0x1aW50IGJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpOworCisgICAgLy8gTmFtZSBvZiB0aGUgT3BlbkdMIHByb2dyYW0KKyAgICBHTHVpbnQgaWQ7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBzaGFkZXJzCisgICAgR0x1aW50IHZlcnRleFNoYWRlcjsKKyAgICBHTHVpbnQgZnJhZ21lbnRTaGFkZXI7CisKKyAgICAvLyBLZWVwcyB0cmFjayBvZiBhdHRyaWJ1dGVzIGFuZCB1bmlmb3JtcyBzbG90cworICAgIEtleWVkVmVjdG9yPGNvbnN0IGNoYXIqLCBpbnQ+IGF0dHJpYnV0ZXM7CisgICAgS2V5ZWRWZWN0b3I8Y29uc3QgY2hhciosIGludD4gdW5pZm9ybXM7CisKKyAgICBib29sIG1Vc2U7Cit9OyAvLyBjbGFzcyBQcm9ncmFtCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9HUkFNX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuY3BwIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjYmMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9ncmFtQ2FjaGUuY3BwCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIlByb2dyYW1DYWNoZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZlcnRleCBzaGFkZXJzIHNuaXBwZXRzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfQXR0cmlidXRlcyA9CisgICAgICAgICJhdHRyaWJ1dGUgdmVjNCBwb3NpdGlvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX0F0dHJpYnV0ZXNfVGV4Q29vcmRzID0KKyAgICAgICAgImF0dHJpYnV0ZSB2ZWMyIHRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1VuaWZvcm1zID0KKyAgICAgICAgInVuaWZvcm0gbWF0NCB0cmFuc2Zvcm07XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9Vbmlmb3Jtc19IYXNHcmFkaWVudCA9CisgICAgICAgICJ1bmlmb3JtIGZsb2F0IGdyYWRpZW50TGVuZ3RoO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIGdyYWRpZW50O1xuIgorICAgICAgICAidW5pZm9ybSB2ZWMyIGdyYWRpZW50U3RhcnQ7XG4iCisgICAgICAgICJ1bmlmb3JtIG1hdDQgc2NyZWVuU3BhY2U7XG4iOworY29uc3QgY2hhciogZ1ZTX0hlYWRlcl9Vbmlmb3Jtc19IYXNCaXRtYXAgPQorICAgICAgICAidW5pZm9ybSBtYXQ0IHRleHR1cmVUcmFuc2Zvcm07XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzIgdGV4dHVyZURpbWVuc2lvbjtcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUgPQorICAgICAgICAidmFyeWluZyB2ZWMyIG91dFRleENvb3JkcztcbiI7Citjb25zdCBjaGFyKiBnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0JpdG1hcCA9CisgICAgICAgICJ2YXJ5aW5nIHZlYzIgb3V0Qml0bWFwVGV4Q29vcmRzO1xuIjsKK2NvbnN0IGNoYXIqIGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzR3JhZGllbnQgPQorICAgICAgICAidmFyeWluZyBmbG9hdCBpbmRleDtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbiA9CisgICAgICAgICJcbnZvaWQgbWFpbih2b2lkKSB7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0VGV4Q29vcmRzID0KKyAgICAgICAgIiAgICBvdXRUZXhDb29yZHMgPSB0ZXhDb29yZHM7XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fT3V0R3JhZGllbnRJbmRleCA9CisgICAgICAgICIgICAgdmVjNCBsb2NhdGlvbiA9IHNjcmVlblNwYWNlICogcG9zaXRpb247XG4iCisgICAgICAgICIgICAgaW5kZXggPSBkb3QobG9jYXRpb24ueHkgLSBncmFkaWVudFN0YXJ0LCBncmFkaWVudCkgKiBncmFkaWVudExlbmd0aDtcbiI7Citjb25zdCBjaGFyKiBnVlNfTWFpbl9PdXRCaXRtYXBUZXhDb29yZHMgPQorICAgICAgICAiICAgIHZlYzQgYml0bWFwQ29vcmRzID0gdGV4dHVyZVRyYW5zZm9ybSAqIHBvc2l0aW9uO1xuIgorICAgICAgICAiICAgIG91dEJpdG1hcFRleENvb3JkcyA9IGJpdG1hcENvb3Jkcy54eSAqIHRleHR1cmVEaW1lbnNpb247XG4iOworY29uc3QgY2hhciogZ1ZTX01haW5fUG9zaXRpb24gPQorICAgICAgICAiICAgIGdsX1Bvc2l0aW9uID0gdHJhbnNmb3JtICogcG9zaXRpb247XG4iOworY29uc3QgY2hhciogZ1ZTX0Zvb3RlciA9CisgICAgICAgICJ9XG5cbiI7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZyYWdtZW50IHNoYWRlcnMgc25pcHBldHMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY29uc3QgY2hhciogZ0ZTX0hlYWRlcl9FeHRlbnNpb25fRnJhbWVidWZmZXJGZXRjaCA9CisgICAgICAgICIjZXh0ZW5zaW9uIEdMX05WX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaCA6IGVuYWJsZVxuXG4iOworY29uc3QgY2hhciogZ0ZTX0hlYWRlciA9CisgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuIjsKK2NvbnN0IGNoYXIqIGdGU19Vbmlmb3Jtc19Db2xvciA9CisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX1RleHR1cmVTYW1wbGVyID0KKyAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIHNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0dyYWRpZW50U2FtcGxlciA9CisgICAgICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudFNhbXBsZXI7XG4iOworY29uc3QgY2hhciogZ0ZTX1VuaWZvcm1zX0JpdG1hcFNhbXBsZXIgPQorICAgICAgICAidW5pZm9ybSBzYW1wbGVyMkQgYml0bWFwU2FtcGxlcjtcbiI7Citjb25zdCBjaGFyKiBnRlNfVW5pZm9ybXNfQ29sb3JPcFs0XSA9IHsKKyAgICAgICAgLy8gTm9uZQorICAgICAgICAiIiwKKyAgICAgICAgLy8gTWF0cml4CisgICAgICAgICJ1bmlmb3JtIG1hdDQgY29sb3JNYXRyaXg7XG4iCisgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3JNYXRyaXhWZWN0b3I7XG4iLAorICAgICAgICAvLyBMaWdodGluZworICAgICAgICAidW5pZm9ybSB2ZWM0IGxpZ2h0aW5nTXVsO1xuIgorICAgICAgICAidW5pZm9ybSB2ZWM0IGxpZ2h0aW5nQWRkO1xuIiwKKyAgICAgICAgLy8gUG9ydGVyRHVmZgorICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yQmxlbmQ7XG4iCit9OworY29uc3QgY2hhciogZ0ZTX01haW4gPQorICAgICAgICAiXG52b2lkIG1haW4odm9pZCkge1xuIgorICAgICAgICAiICAgIGxvd3AgdmVjNCBmcmFnQ29sb3I7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hDb2xvciA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gY29sb3I7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hUZXh0dXJlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBjb2xvciAqIHRleHR1cmUyRChzYW1wbGVyLCBvdXRUZXhDb29yZHMpO1xuIjsKK2NvbnN0IGNoYXIqIGdGU19NYWluX0ZldGNoQThUZXh0dXJlID0KKyAgICAgICAgIiAgICBmcmFnQ29sb3IgPSBjb2xvciAqIHRleHR1cmUyRChzYW1wbGVyLCBvdXRUZXhDb29yZHMpLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hHcmFkaWVudCA9CisgICAgICAgICIgICAgdmVjNCBncmFkaWVudENvbG9yID0gdGV4dHVyZTJEKGdyYWRpZW50U2FtcGxlciwgdmVjMihpbmRleCwgMC41KSk7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRmV0Y2hCaXRtYXAgPQorICAgICAgICAiICAgIHZlYzQgYml0bWFwQ29sb3IgPSB0ZXh0dXJlMkQoYml0bWFwU2FtcGxlciwgb3V0Qml0bWFwVGV4Q29vcmRzKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9GZXRjaEJpdG1hcE5wb3QgPQorICAgICAgICAiICAgIHZlYzQgYml0bWFwQ29sb3IgPSB0ZXh0dXJlMkQoYml0bWFwU2FtcGxlciwgd3JhcChvdXRCaXRtYXBUZXhDb29yZHMpKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9CbGVuZFNoYWRlcnNCRyA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYmxlbmRTaGFkZXJzKGdyYWRpZW50Q29sb3IsIGJpdG1hcENvbG9yKSI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9CbGVuZFNoYWRlcnNHQiA9CisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYmxlbmRTaGFkZXJzKGJpdG1hcENvbG9yLCBncmFkaWVudENvbG9yKSI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9CbGVuZFNoYWRlcnNfTW9kdWxhdGUgPQorICAgICAgICAiICogZnJhZ0NvbG9yLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fR3JhZGllbnRTaGFkZXJfTW9kdWxhdGUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGdyYWRpZW50Q29sb3IgKiBmcmFnQ29sb3IuYTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9CaXRtYXBTaGFkZXJfTW9kdWxhdGUgPQorICAgICAgICAiICAgIGZyYWdDb2xvciA9IGJpdG1hcENvbG9yICogZnJhZ0NvbG9yLmE7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRnJhZ0NvbG9yID0KKyAgICAgICAgIiAgICBnbF9GcmFnQ29sb3IgPSBmcmFnQ29sb3I7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRnJhZ0NvbG9yX0JsZW5kID0KKyAgICAgICAgIiAgICBnbF9GcmFnQ29sb3IgPSBibGVuZEZyYW1lYnVmZmVyKGZyYWdDb2xvciwgZ2xfTGFzdEZyYWdDb2xvcik7XG4iOworY29uc3QgY2hhciogZ0ZTX01haW5fRnJhZ0NvbG9yX0JsZW5kX1N3YXAgPQorICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGJsZW5kRnJhbWVidWZmZXIoZ2xfTGFzdEZyYWdDb2xvciwgZnJhZ0NvbG9yKTtcbiI7Citjb25zdCBjaGFyKiBnRlNfTWFpbl9BcHBseUNvbG9yT3BbNF0gPSB7CisgICAgICAgIC8vIE5vbmUKKyAgICAgICAgIiIsCisgICAgICAgIC8vIE1hdHJpeAorICAgICAgICAvLyBUT0RPOiBGaXggcHJlbXVsdGlwbGllZCBhbHBoYSBjb21wdXRhdGlvbnMgZm9yIGNvbG9yIG1hdHJpeAorICAgICAgICAiICAgIGZyYWdDb2xvciAqPSBjb2xvck1hdHJpeDtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IgKz0gY29sb3JNYXRyaXhWZWN0b3I7XG4iCisgICAgICAgICIgICAgZnJhZ0NvbG9yLnJnYiAqPSBmcmFnQ29sb3IuYTtcbiIsCisgICAgICAgIC8vIExpZ2h0aW5nCisgICAgICAgICIgICAgZmxvYXQgbGlnaHRpbmdBbHBoYSA9IGZyYWdDb2xvci5hO1xuIgorICAgICAgICAiICAgIGZyYWdDb2xvciA9IG1pbihmcmFnQ29sb3IgKiBsaWdodGluZ011bCArIChsaWdodGluZ0FkZCAqIGxpZ2h0aW5nQWxwaGEpLCBsaWdodGluZ0FscGhhKTtcbiIKKyAgICAgICAgIiAgICBmcmFnQ29sb3IuYSA9IGxpZ2h0aW5nQWxwaGE7XG4iLAorICAgICAgICAvLyBQb3J0ZXJEdWZmCisgICAgICAgICIgICAgZnJhZ0NvbG9yID0gYmxlbmRDb2xvcnMoY29sb3JCbGVuZCwgZnJhZ0NvbG9yKTtcbiIKK307Citjb25zdCBjaGFyKiBnRlNfRm9vdGVyID0KKyAgICAgICAgIn1cblxuIjsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gUG9ydGVyRHVmZiBzbmlwcGV0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBjaGFyKiBnQmxlbmRPcHNbMThdID0geworICAgICAgICAvLyBDbGVhcgorICAgICAgICAicmV0dXJuIHZlYzQoMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiIsCisgICAgICAgIC8vIFNyYworICAgICAgICAicmV0dXJuIHNyYztcbiIsCisgICAgICAgIC8vIERzdAorICAgICAgICAicmV0dXJuIGRzdDtcbiIsCisgICAgICAgIC8vIFNyY092ZXIKKyAgICAgICAgInJldHVybiBzcmMgKyBkc3QgKiAoMS4wIC0gc3JjLmEpO1xuIiwKKyAgICAgICAgLy8gRHN0T3ZlcgorICAgICAgICAicmV0dXJuIGRzdCArIHNyYyAqICgxLjAgLSBkc3QuYSk7XG4iLAorICAgICAgICAvLyBTcmNJbgorICAgICAgICAicmV0dXJuIHNyYyAqIGRzdC5hO1xuIiwKKyAgICAgICAgLy8gRHN0SW4KKyAgICAgICAgInJldHVybiBkc3QgKiBzcmMuYTtcbiIsCisgICAgICAgIC8vIFNyY091dAorICAgICAgICAicmV0dXJuIHNyYyAqICgxLjAgLSBkc3QuYSk7XG4iLAorICAgICAgICAvLyBEc3RPdXQKKyAgICAgICAgInJldHVybiBkc3QgKiAoMS4wIC0gc3JjLmEpO1xuIiwKKyAgICAgICAgLy8gU3JjQXRvcAorICAgICAgICAicmV0dXJuIHZlYzQoc3JjLnJnYiAqIGRzdC5hICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IsIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIERzdEF0b3AKKyAgICAgICAgInJldHVybiB2ZWM0KGRzdC5yZ2IgKiBzcmMuYSArICgxLjAgLSBkc3QuYSkgKiBzcmMucmdiLCBzcmMuYSk7XG4iLAorICAgICAgICAvLyBYb3IKKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IsICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKyBkc3QuYSAtIDIuMCAqIHNyYy5hICogZHN0LmEpO1xuIiwKKyAgICAgICAgLy8gQWRkCisgICAgICAgICJyZXR1cm4gbWluKHNyYyArIGRzdCwgMS4wKTtcbiIsCisgICAgICAgIC8vIE11bHRpcGx5CisgICAgICAgICJyZXR1cm4gc3JjICogZHN0O1xuIiwKKyAgICAgICAgLy8gU2NyZWVuCisgICAgICAgICJyZXR1cm4gc3JjICsgZHN0IC0gc3JjICogZHN0O1xuIiwKKyAgICAgICAgLy8gT3ZlcmxheQorICAgICAgICAicmV0dXJuIGNsYW1wKHZlYzQobWl4KCIKKyAgICAgICAgICAgICAgICAiMi4wICogc3JjLnJnYiAqIGRzdC5yZ2IgKyBzcmMucmdiICogKDEuMCAtIGRzdC5hKSArIGRzdC5yZ2IgKiAoMS4wIC0gc3JjLmEpLCAiCisgICAgICAgICAgICAgICAgInNyYy5hICogZHN0LmEgLSAyLjAgKiAoZHN0LmEgLSBkc3QucmdiKSAqIChzcmMuYSAtIHNyYy5yZ2IpICsgc3JjLnJnYiAqICgxLjAgLSBkc3QuYSkgKyBkc3QucmdiICogKDEuMCAtIHNyYy5hKSwgIgorICAgICAgICAgICAgICAgICJzdGVwKGRzdC5hLCAyLjAgKiBkc3QucmdiKSksICIKKyAgICAgICAgICAgICAgICAic3JjLmEgKyBkc3QuYSAtIHNyYy5hICogZHN0LmEpLCAwLjAsIDEuMCk7XG4iLAorICAgICAgICAvLyBEYXJrZW4KKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IgKyAiCisgICAgICAgICAgICAgICAgIm1pbihzcmMucmdiICogZHN0LmEsIGRzdC5yZ2IgKiBzcmMuYSksIHNyYy5hICsgZHN0LmEgLSBzcmMuYSAqIGRzdC5hKTtcbiIsCisgICAgICAgIC8vIExpZ2h0ZW4KKyAgICAgICAgInJldHVybiB2ZWM0KHNyYy5yZ2IgKiAoMS4wIC0gZHN0LmEpICsgKDEuMCAtIHNyYy5hKSAqIGRzdC5yZ2IgKyAiCisgICAgICAgICAgICAgICAgIm1heChzcmMucmdiICogZHN0LmEsIGRzdC5yZ2IgKiBzcmMuYSksIHNyYy5hICsgZHN0LmEgLSBzcmMuYSAqIGRzdC5hKTtcbiIsCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbUNhY2hlOjpQcm9ncmFtQ2FjaGUoKSB7Cit9CisKK1Byb2dyYW1DYWNoZTo6flByb2dyYW1DYWNoZSgpIHsKKyAgICBjbGVhcigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZSBtYW5hZ2VtZW50CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpjbGVhcigpIHsKKyAgICBzaXplX3QgY291bnQgPSBtQ2FjaGUuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBkZWxldGUgbUNhY2hlLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1DYWNoZS5jbGVhcigpOworfQorCitQcm9ncmFtKiBQcm9ncmFtQ2FjaGU6OmdldChjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgcHJvZ3JhbWlkIGtleSA9IGRlc2NyaXB0aW9uLmtleSgpOworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOworICAgIFByb2dyYW0qIHByb2dyYW0gPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgUFJPR1JBTV9MT0dEKCJDb3VsZCBub3QgZmluZCBwcm9ncmFtIHdpdGgga2V5IDB4JXgiLCBrZXkpOworICAgICAgICBwcm9ncmFtID0gZ2VuZXJhdGVQcm9ncmFtKGRlc2NyaXB0aW9uLCBrZXkpOworICAgICAgICBtQ2FjaGUuYWRkKGtleSwgcHJvZ3JhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvZ3JhbSA9IG1DYWNoZS52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFByb2dyYW0gZ2VuZXJhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtKiBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlUHJvZ3JhbShjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBwcm9ncmFtaWQga2V5KSB7CisgICAgU3RyaW5nOCB2ZXJ0ZXhTaGFkZXIgPSBnZW5lcmF0ZVZlcnRleFNoYWRlcihkZXNjcmlwdGlvbik7CisgICAgU3RyaW5nOCBmcmFnbWVudFNoYWRlciA9IGdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoZGVzY3JpcHRpb24pOworCisgICAgUHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKHZlcnRleFNoYWRlci5zdHJpbmcoKSwgZnJhZ21lbnRTaGFkZXIuc3RyaW5nKCkpOworICAgIHJldHVybiBwcm9ncmFtOworfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIC8vIEFkZCBhdHRyaWJ1dGVzCisgICAgU3RyaW5nOCBzaGFkZXIoZ1ZTX0hlYWRlcl9BdHRyaWJ1dGVzKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfQXR0cmlidXRlc19UZXhDb29yZHMpOworICAgIH0KKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtcyk7CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9Vbmlmb3Jtc19IYXNHcmFkaWVudCk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1VuaWZvcm1zX0hhc0JpdG1hcCk7CisgICAgfQorICAgIC8vIFZhcnlpbmdzCisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc1RleHR1cmUpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0dyYWRpZW50KTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19IZWFkZXJfVmFyeWluZ3NfSGFzQml0bWFwKTsKKyAgICB9CisKKyAgICAvLyBCZWdpbiB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbik7IHsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc1RleHR1cmUpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fT3V0VGV4Q29vcmRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX01haW5fT3V0R3JhZGllbnRJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfTWFpbl9PdXRCaXRtYXBUZXhDb29yZHMpOworICAgICAgICB9CisgICAgICAgIC8vIE91dHB1dCB0cmFuc2Zvcm1lZCBwb3NpdGlvbgorICAgICAgICBzaGFkZXIuYXBwZW5kKGdWU19NYWluX1Bvc2l0aW9uKTsKKyAgICB9CisgICAgLy8gRW5kIHRoZSBzaGFkZXIKKyAgICBzaGFkZXIuYXBwZW5kKGdWU19Gb290ZXIpOworCisgICAgUFJPR1JBTV9MT0dEKCIqKiogR2VuZXJhdGVkIHZlcnRleCBzaGFkZXI6XG5cbiVzIiwgc2hhZGVyLnN0cmluZygpKTsKKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK1N0cmluZzggUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uCisgICAgU3RyaW5nOCBzaGFkZXI7CisKKyAgICBib29sIGJsZW5kRnJhbWVidWZmZXIgPSBkZXNjcmlwdGlvbi5mcmFtZWJ1ZmZlck1vZGUgPj0gU2tYZmVybW9kZTo6a1BsdXNfTW9kZTsKKyAgICBpZiAoYmxlbmRGcmFtZWJ1ZmZlcikgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19IZWFkZXJfRXh0ZW5zaW9uX0ZyYW1lYnVmZmVyRmV0Y2gpOworICAgIH0KKworICAgIHNoYWRlci5hcHBlbmQoZ0ZTX0hlYWRlcik7CisKKyAgICAvLyBWYXJ5aW5ncworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNUZXh0dXJlKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNUZXh0dXJlKTsKKyAgICB9CisgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0dyYWRpZW50KSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ1ZTX0hlYWRlcl9WYXJ5aW5nc19IYXNHcmFkaWVudCk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgc2hhZGVyLmFwcGVuZChnVlNfSGVhZGVyX1ZhcnlpbmdzX0hhc0JpdG1hcCk7CisgICAgfQorCisKKyAgICAvLyBVbmlmb3JtcworICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0NvbG9yKTsKKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19UZXh0dXJlU2FtcGxlcik7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19HcmFkaWVudFNhbXBsZXIpOworICAgIH0KKyAgICBpZiAoZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX1VuaWZvcm1zX0JpdG1hcFNhbXBsZXIpOworICAgIH0KKyAgICBzaGFkZXIuYXBwZW5kKGdGU19Vbmlmb3Jtc19Db2xvck9wW2Rlc2NyaXB0aW9uLmNvbG9yT3BdKTsKKworICAgIC8vIEdlbmVyYXRlIHJlcXVpcmVkIGZ1bmN0aW9ucworICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCAmJiBkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZFNoYWRlcnMiLCBkZXNjcmlwdGlvbi5zaGFkZXJzTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5jb2xvck9wID09IFByb2dyYW1EZXNjcmlwdGlvbjo6a0NvbG9yQmxlbmQpIHsKKyAgICAgICAgZ2VuZXJhdGVCbGVuZChzaGFkZXIsICJibGVuZENvbG9ycyIsIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSk7CisgICAgfQorICAgIGlmIChibGVuZEZyYW1lYnVmZmVyKSB7CisgICAgICAgIGdlbmVyYXRlQmxlbmQoc2hhZGVyLCAiYmxlbmRGcmFtZWJ1ZmZlciIsIGRlc2NyaXB0aW9uLmZyYW1lYnVmZmVyTW9kZSk7CisgICAgfQorICAgIGlmIChkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QpIHsKKyAgICAgICAgZ2VuZXJhdGVUZXh0dXJlV3JhcChzaGFkZXIsIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBTLCBkZXNjcmlwdGlvbi5iaXRtYXBXcmFwVCk7CisgICAgfQorCisgICAgLy8gQmVnaW4gdGhlIHNoYWRlcgorICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW4pOyB7CisgICAgICAgIC8vIFN0b3JlcyB0aGUgcmVzdWx0IGluIGZyYWdDb2xvciBkaXJlY3RseQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzVGV4dHVyZSkgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0FscGhhOFRleHR1cmUpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQThUZXh0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaFRleHR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaENvbG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQpIHsKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fRmV0Y2hHcmFkaWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uLmhhc0JpdG1hcCkgeworICAgICAgICAgICAgaWYgKCFkZXNjcmlwdGlvbi5pc0JpdG1hcE5wb3QpIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZldGNoQml0bWFwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hhZGVyLmFwcGVuZChnRlNfTWFpbl9GZXRjaEJpdG1hcE5wb3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENhc2Ugd2hlbiB3ZSBoYXZlIHR3byBzaGFkZXJzIHNldAorICAgICAgICBpZiAoZGVzY3JpcHRpb24uaGFzR3JhZGllbnQgJiYgZGVzY3JpcHRpb24uaGFzQml0bWFwKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaXNCaXRtYXBGaXJzdCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzQkcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JsZW5kU2hhZGVyc0dCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fQmxlbmRTaGFkZXJzX01vZHVsYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbi5oYXNHcmFkaWVudCkgeworICAgICAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoZ0ZTX01haW5fR3JhZGllbnRTaGFkZXJfTW9kdWxhdGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbi5oYXNCaXRtYXApIHsKKyAgICAgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0JpdG1hcFNoYWRlcl9Nb2R1bGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQXBwbHkgdGhlIGNvbG9yIG9wIGlmIG5lZWRlZAorICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0FwcGx5Q29sb3JPcFtkZXNjcmlwdGlvbi5jb2xvck9wXSk7CisgICAgICAgIC8vIE91dHB1dCB0aGUgZnJhZ21lbnQKKyAgICAgICAgaWYgKCFibGVuZEZyYW1lYnVmZmVyKSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKGdGU19NYWluX0ZyYWdDb2xvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCFkZXNjcmlwdGlvbi5zd2FwU3JjRHN0ID8KKyAgICAgICAgICAgICAgICAgICAgZ0ZTX01haW5fRnJhZ0NvbG9yX0JsZW5kIDogZ0ZTX01haW5fRnJhZ0NvbG9yX0JsZW5kX1N3YXApOworICAgICAgICB9CisgICAgfQorICAgIC8vIEVuZCB0aGUgc2hhZGVyCisgICAgc2hhZGVyLmFwcGVuZChnRlNfRm9vdGVyKTsKKworICAgIGlmIChERUJVR19QUk9HUkFNX0NBQ0hFKSB7CisgICAgICAgIFBST0dSQU1fTE9HRCgiKioqIEdlbmVyYXRlZCBmcmFnbWVudCBzaGFkZXI6XG5cbiIpOworICAgICAgICBwcmludExvbmdTdHJpbmcoc2hhZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVCbGVuZChTdHJpbmc4JiBzaGFkZXIsIGNvbnN0IGNoYXIqIG5hbWUsIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSkgeworICAgIHNoYWRlci5hcHBlbmQoIlxudmVjNCAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKG5hbWUpOworICAgIHNoYWRlci5hcHBlbmQoIih2ZWM0IHNyYywgdmVjNCBkc3QpIHtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBzaGFkZXIuYXBwZW5kKGdCbGVuZE9wc1ttb2RlXSk7CisgICAgc2hhZGVyLmFwcGVuZCgifVxuIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZVRleHR1cmVXcmFwKFN0cmluZzgmIHNoYWRlciwgR0xlbnVtIHdyYXBTLCBHTGVudW0gd3JhcFQpIHsKKyAgICBzaGFkZXIuYXBwZW5kKCJcbnZlYzIgd3JhcCh2ZWMyIHRleENvb3Jkcykge1xuIik7CisgICAgaWYgKHdyYXBTID09IEdMX01JUlJPUkVEX1JFUEVBVCkgeworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgZmxvYXQgeE1vZDIgPSBtb2QodGV4Q29vcmRzLngsIDIuMCk7XG4iKTsKKyAgICAgICAgc2hhZGVyLmFwcGVuZCgiICAgIGlmICh4TW9kMiA+IDEuMCkgeE1vZDIgPSAyLjAgLSB4TW9kMjtcbiIpOworICAgIH0KKyAgICBpZiAod3JhcFQgPT0gR0xfTUlSUk9SRURfUkVQRUFUKSB7CisgICAgICAgIHNoYWRlci5hcHBlbmQoIiAgICBmbG9hdCB5TW9kMiA9IG1vZCh0ZXhDb29yZHMueSwgMi4wKTtcbiIpOworICAgICAgICBzaGFkZXIuYXBwZW5kKCIgICAgaWYgKHlNb2QyID4gMS4wKSB5TW9kMiA9IDIuMCAtIHlNb2QyO1xuIik7CisgICAgfQorICAgIHNoYWRlci5hcHBlbmQoIiAgICByZXR1cm4gdmVjMigiKTsKKyAgICBzd2l0Y2ggKHdyYXBTKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy54Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLngsIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInhNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiLCAiKTsKKyAgICBzd2l0Y2ggKHdyYXBUKSB7CisgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInRleENvb3Jkcy55Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRVBFQVQ6CisgICAgICAgICAgICBzaGFkZXIuYXBwZW5kKCJtb2QodGV4Q29vcmRzLnksIDEuMCkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX01JUlJPUkVEX1JFUEVBVDoKKyAgICAgICAgICAgIHNoYWRlci5hcHBlbmQoInlNb2QyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgc2hhZGVyLmFwcGVuZCgiKTtcbiIpOworICAgIHNoYWRlci5hcHBlbmQoIn1cbiIpOworfQorCit2b2lkIFByb2dyYW1DYWNoZTo6cHJpbnRMb25nU3RyaW5nKGNvbnN0IFN0cmluZzgmIHNoYWRlcikgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSAwOworICAgIHNzaXplX3QgbGFzdEluZGV4ID0gMDsKKyAgICBjb25zdCBjaGFyKiBzdHIgPSBzaGFkZXIuc3RyaW5nKCk7CisgICAgd2hpbGUgKChpbmRleCA9IHNoYWRlci5maW5kKCJcbiIsIGluZGV4KSkgPiAtMSkgeworICAgICAgICBTdHJpbmc4IGxpbmUoc3RyLCBpbmRleCAtIGxhc3RJbmRleCk7CisgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIGxpbmUuYXBwZW5kKCJcbiIpOworICAgICAgICBQUk9HUkFNX0xPR0QoIiVzIiwgbGluZS5zdHJpbmcoKSk7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIHN0ciArPSAoaW5kZXggLSBsYXN0SW5kZXgpOworICAgICAgICBsYXN0SW5kZXggPSBpbmRleDsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oIGIvbGlicy9od3VpL1Byb2dyYW1DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTcwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUHJvZ3JhbUNhY2hlLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisjZGVmaW5lIEFORFJPSURfVUlfUFJPR1JBTV9DQUNIRV9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8U2tYZmVybW9kZS5oPgorCisjaW5jbHVkZSAiUHJvZ3JhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERlZmluZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gRGVidWcKKyNkZWZpbmUgREVCVUdfUFJPR1JBTV9DQUNIRSAwCisKKy8vIERlYnVnCisjaWYgREVCVUdfUFJPR1JBTV9DQUNIRQorICAgICNkZWZpbmUgUFJPR1JBTV9MT0dEKC4uLikgTE9HRChfX1ZBX0FSR1NfXykKKyNlbHNlCisgICAgI2RlZmluZSBQUk9HUkFNX0xPR0QoLi4uKQorI2VuZGlmCisKKy8qCisgKiBJTVBPUlRBTlQ6IEFsbCAzMiBiaXRzIGFyZSB1c2VkLCBzd2l0Y2ggdG8gYSBsb25nLgorICovCisjZGVmaW5lIFBST0dSQU1fS0VZX1RFWFRVUkUgMHgxCisjZGVmaW5lIFBST0dSQU1fS0VZX0E4X1RFWFRVUkUgMHgyCisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUCAweDQKKyNkZWZpbmUgUFJPR1JBTV9LRVlfR1JBRElFTlQgMHg4CisjZGVmaW5lIFBST0dSQU1fS0VZX0JJVE1BUF9GSVJTVCAweDEwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX01BVFJJWCAweDIwCisjZGVmaW5lIFBST0dSQU1fS0VZX0NPTE9SX0xJR0hUSU5HIDB4NDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQ09MT1JfQkxFTkQgMHg4MAorI2RlZmluZSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVCAweDEwMAorI2RlZmluZSBQUk9HUkFNX0tFWV9TV0FQX1NSQ19EU1QgMHgyMDAwCisKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBTX01BU0sgMHg2MDAKKyNkZWZpbmUgUFJPR1JBTV9LRVlfQklUTUFQX1dSQVBUX01BU0sgMHgxODAwCisKKy8vIEVuY29kZSB0aGUgeGZlcm1vZGVzIG9uIDYgYml0cworI2RlZmluZSBQUk9HUkFNX01BWF9YRkVSTU9ERSAweDFmCisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfU0hBREVSX1NISUZUIDI2CisjZGVmaW5lIFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQgMjAKKyNkZWZpbmUgUFJPR1JBTV9YRkVSTU9ERV9GUkFNRUJVRkZFUl9TSElGVCAxNAorCisjZGVmaW5lIFBST0dSQU1fQklUTUFQX1dSQVBTX1NISUZUIDkKKyNkZWZpbmUgUFJPR1JBTV9CSVRNQVBfV1JBUFRfU0hJRlQgMTEKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVHlwZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAqIElNUE9SVEFOVDogQWxsIDMyIGJpdHMgYXJlIHVzZWQsIHN3aXRjaCB0byBhIGxvbmcuCisgKi8KK3R5cGVkZWYgdWludDMyX3QgcHJvZ3JhbWlkOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIERlc2NyaWJlIHRoZSBmZWF0dXJlcyByZXF1aXJlZCBmb3IgYSBnaXZlbiBwcm9ncmFtLiBUaGUgZmVhdHVyZXMKKyAqIGRldGVybWluZSB0aGUgZ2VuZXJhdGlvbiBvZiBib3RoIHRoZSB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuCisgKiBBIFByb2dyYW1EZXNjcmlwdGlvbiBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIFByb2dyYW1DYWNoZS4KKyAqLworc3RydWN0IFByb2dyYW1EZXNjcmlwdGlvbiB7CisgICAgZW51bSBDb2xvck1vZGlmaWVyIHsKKyAgICAgICAga0NvbG9yTm9uZSwKKyAgICAgICAga0NvbG9yTWF0cml4LAorICAgICAgICBrQ29sb3JMaWdodGluZywKKyAgICAgICAga0NvbG9yQmxlbmQKKyAgICB9OworCisgICAgUHJvZ3JhbURlc2NyaXB0aW9uKCk6CisgICAgICAgIGhhc1RleHR1cmUoZmFsc2UpLCBoYXNBbHBoYThUZXh0dXJlKGZhbHNlKSwKKyAgICAgICAgaGFzQml0bWFwKGZhbHNlKSwgaXNCaXRtYXBOcG90KGZhbHNlKSwgaGFzR3JhZGllbnQoZmFsc2UpLAorICAgICAgICBzaGFkZXJzTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSksIGlzQml0bWFwRmlyc3QoZmFsc2UpLAorICAgICAgICBiaXRtYXBXcmFwUyhHTF9DTEFNUF9UT19FREdFKSwgYml0bWFwV3JhcFQoR0xfQ0xBTVBfVE9fRURHRSksCisgICAgICAgIGNvbG9yT3Aoa0NvbG9yTm9uZSksIGNvbG9yTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSksCisgICAgICAgIGZyYW1lYnVmZmVyTW9kZShTa1hmZXJtb2RlOjprQ2xlYXJfTW9kZSksIHN3YXBTcmNEc3QoZmFsc2UpIHsKKyAgICB9CisKKyAgICAvLyBUZXh0dXJpbmcKKyAgICBib29sIGhhc1RleHR1cmU7CisgICAgYm9vbCBoYXNBbHBoYThUZXh0dXJlOworCisgICAgLy8gU2hhZGVycworICAgIGJvb2wgaGFzQml0bWFwOworICAgIGJvb2wgaXNCaXRtYXBOcG90OworICAgIGJvb2wgaGFzR3JhZGllbnQ7CisgICAgU2tYZmVybW9kZTo6TW9kZSBzaGFkZXJzTW9kZTsKKyAgICBib29sIGlzQml0bWFwRmlyc3Q7CisgICAgR0xlbnVtIGJpdG1hcFdyYXBTOworICAgIEdMZW51bSBiaXRtYXBXcmFwVDsKKworICAgIC8vIENvbG9yIG9wZXJhdGlvbnMKKyAgICBpbnQgY29sb3JPcDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIGNvbG9yTW9kZTsKKworICAgIC8vIEZyYW1lYnVmZmVyIGJsZW5kaW5nIChyZXF1aXJlcyBFeHRlbnNpb25zLmhhc0ZyYW1lYnVmZmVyRmV0Y2goKSkKKyAgICAvLyBJZ25vcmVkIGZvciBhbGwgdmFsdWVzIDwgU2tYZmVybW9kZTo6a1BsdXNfTW9kZQorICAgIFNrWGZlcm1vZGU6Ok1vZGUgZnJhbWVidWZmZXJNb2RlOworICAgIGJvb2wgc3dhcFNyY0RzdDsKKworICAgIGlubGluZSB1aW50MzJfdCBnZXRFbnVtRm9yV3JhcChHTGVudW0gd3JhcCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKHdyYXApIHsKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xBTVBfVE9fRURHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgR0xfUkVQRUFUOgorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgY2FzZSBHTF9NSVJST1JFRF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJvZ3JhbWlkIGtleSgpIGNvbnN0IHsKKyAgICAgICAgcHJvZ3JhbWlkIGtleSA9IDA7CisgICAgICAgIGlmIChoYXNUZXh0dXJlKSBrZXkgfD0gUFJPR1JBTV9LRVlfVEVYVFVSRTsKKyAgICAgICAgaWYgKGhhc0FscGhhOFRleHR1cmUpIGtleSB8PSBQUk9HUkFNX0tFWV9BOF9URVhUVVJFOworICAgICAgICBpZiAoaGFzQml0bWFwKSB7CisgICAgICAgICAgICBrZXkgfD0gUFJPR1JBTV9LRVlfQklUTUFQOworICAgICAgICAgICAgaWYgKGlzQml0bWFwTnBvdCkgeworICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9CSVRNQVBfTlBPVDsKKyAgICAgICAgICAgICAgICBrZXkgfD0gZ2V0RW51bUZvcldyYXAoYml0bWFwV3JhcFMpIDw8IFBST0dSQU1fQklUTUFQX1dSQVBTX1NISUZUOworICAgICAgICAgICAgICAgIGtleSB8PSBnZXRFbnVtRm9yV3JhcChiaXRtYXBXcmFwVCkgPDwgUFJPR1JBTV9CSVRNQVBfV1JBUFRfU0hJRlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc0dyYWRpZW50KSBrZXkgfD0gUFJPR1JBTV9LRVlfR1JBRElFTlQ7CisgICAgICAgIGlmIChpc0JpdG1hcEZpcnN0KSBrZXkgIHw9IFBST0dSQU1fS0VZX0JJVE1BUF9GSVJTVDsKKyAgICAgICAgaWYgKGhhc0JpdG1hcCAmJiBoYXNHcmFkaWVudCkgeworICAgICAgICAgICAga2V5IHw9IChzaGFkZXJzTW9kZSAmIFBST0dSQU1fTUFYX1hGRVJNT0RFKSA8PCBQUk9HUkFNX1hGRVJNT0RFX1NIQURFUl9TSElGVDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbG9yT3ApIHsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yTWF0cml4OgorICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9DT0xPUl9NQVRSSVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtDb2xvckxpZ2h0aW5nOgorICAgICAgICAgICAgICAgIGtleSB8PSBQUk9HUkFNX0tFWV9DT0xPUl9MSUdIVElORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0NvbG9yQmxlbmQ6CisgICAgICAgICAgICAgICAga2V5IHw9IFBST0dSQU1fS0VZX0NPTE9SX0JMRU5EOworICAgICAgICAgICAgICAgIGtleSB8PSAoY29sb3JNb2RlICYgUFJPR1JBTV9NQVhfWEZFUk1PREUpIDw8IFBST0dSQU1fWEZFUk1PREVfQ09MT1JfT1BfU0hJRlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtDb2xvck5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAga2V5IHw9IChmcmFtZWJ1ZmZlck1vZGUgJiBQUk9HUkFNX01BWF9YRkVSTU9ERSkgPDwgUFJPR1JBTV9YRkVSTU9ERV9GUkFNRUJVRkZFUl9TSElGVDsKKyAgICAgICAgaWYgKHN3YXBTcmNEc3QpIGtleSB8PSBQUk9HUkFNX0tFWV9TV0FQX1NSQ19EU1Q7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorfTsgLy8gc3RydWN0IFByb2dyYW1EZXNjcmlwdGlvbgorCisvKioKKyAqIEdlbmVyYXRlcyBhbmQgY2FjaGVzIHByb2dyYW0uIFByb2dyYW1zIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24KKyAqIFByb2dyYW1EZXNjcmlwdGlvbnMuCisgKi8KK2NsYXNzIFByb2dyYW1DYWNoZSB7CitwdWJsaWM6CisgICAgUHJvZ3JhbUNhY2hlKCk7CisgICAgflByb2dyYW1DYWNoZSgpOworCisgICAgUHJvZ3JhbSogZ2V0KGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIFByb2dyYW0qIGdlbmVyYXRlUHJvZ3JhbShjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBwcm9ncmFtaWQga2V5KTsKKyAgICBTdHJpbmc4IGdlbmVyYXRlVmVydGV4U2hhZGVyKGNvbnN0IFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworICAgIFN0cmluZzggZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihjb25zdCBQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlQmxlbmQoU3RyaW5nOCYgc2hhZGVyLCBjb25zdCBjaGFyKiBuYW1lLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlV3JhcChTdHJpbmc4JiBzaGFkZXIsIEdMZW51bSB3cmFwUywgR0xlbnVtIHdyYXBUKTsKKworICAgIHZvaWQgcHJpbnRMb25nU3RyaW5nKGNvbnN0IFN0cmluZzgmIHNoYWRlcikgY29uc3Q7CisKKyAgICBLZXllZFZlY3Rvcjxwcm9ncmFtaWQsIFByb2dyYW0qPiBtQ2FjaGU7Cit9OyAvLyBjbGFzcyBQcm9ncmFtQ2FjaGUKKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1VJX1BST0dSQU1fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1Byb3BlcnRpZXMuaCBiL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZjA5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9QUk9QRVJUSUVTX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9QUk9QRVJUSUVTX0gKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHN5c3RlbSBwcm9wZXJ0aWVzIHVzZWQgdG8gY29uZmlndXJlCisgKiB0aGUgT3BlbkdMUmVuZGVyZXIuCisgKi8KKworLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBpbiBtZWdhLWJ5dGVzCisjZGVmaW5lIFBST1BFUlRZX1RFWFRVUkVfQ0FDSEVfU0laRSAicm8uaHd1aS50ZXh0dXJlX2NhY2hlX3NpemUiCisjZGVmaW5lIFBST1BFUlRZX0xBWUVSX0NBQ0hFX1NJWkUgInJvLmh3dWkubGF5ZXJfY2FjaGVfc2l6ZSIKKyNkZWZpbmUgUFJPUEVSVFlfR1JBRElFTlRfQ0FDSEVfU0laRSAicm8uaHd1aS5ncmFkaWVudF9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9QQVRIX0NBQ0hFX1NJWkUgInJvLmh3dWkucGF0aF9jYWNoZV9zaXplIgorI2RlZmluZSBQUk9QRVJUWV9EUk9QX1NIQURPV19DQUNIRV9TSVpFICJyby5od3VpLmRyb3Bfc2hhZG93X2NhY2hlX3NpemUiCisKKy8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaW4gcGl4ZWxzCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQ0FDSEVfV0lEVEggInJvLmh3dWkudGV4dF9jYWNoZV93aWR0aCIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9DQUNIRV9IRUlHSFQgInJvLmh3dWkudGV4dF9jYWNoZV9oZWlnaHQiCisKKy8vIEdhbW1hICg+PSAxLjAsIDw9IDEwLjApCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfR0FNTUEgInJvLnRleHRfZ2FtbWEiCisjZGVmaW5lIFBST1BFUlRZX1RFWFRfQkxBQ0tfR0FNTUFfVEhSRVNIT0xEICJyby50ZXh0X2dhbW1hLmJsYWNrX3RocmVzaG9sZCIKKyNkZWZpbmUgUFJPUEVSVFlfVEVYVF9XSElURV9HQU1NQV9USFJFU0hPTEQgInJvLnRleHRfZ2FtbWEud2hpdGVfdGhyZXNob2xkIgorCisvLyBDb252ZXJ0cyBhIG51bWJlciBvZiBtZWdhLWJ5dGVzIGludG8gYnl0ZXMKKyNkZWZpbmUgTUIocykgcyAqIDEwMjQgKiAxMDI0CisKKyNkZWZpbmUgREVGQVVMVF9URVhUVVJFX0NBQ0hFX1NJWkUgMjAuMGYKKyNkZWZpbmUgREVGQVVMVF9MQVlFUl9DQUNIRV9TSVpFIDYuMGYKKyNkZWZpbmUgREVGQVVMVF9QQVRIX0NBQ0hFX1NJWkUgNi4wZgorI2RlZmluZSBERUZBVUxUX1BBVENIX0NBQ0hFX1NJWkUgMTAwCisjZGVmaW5lIERFRkFVTFRfR1JBRElFTlRfQ0FDSEVfU0laRSAwLjVmCisjZGVmaW5lIERFRkFVTFRfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSAyLjBmCisKKyNkZWZpbmUgREVGQVVMVF9URVhUX0dBTU1BIDEuNGYKKyNkZWZpbmUgREVGQVVMVF9URVhUX0JMQUNLX0dBTU1BX1RIUkVTSE9MRCA2NAorI2RlZmluZSBERUZBVUxUX1RFWFRfV0hJVEVfR0FNTUFfVEhSRVNIT0xEIDE5MgorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9QUk9QRVJUSUVTX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9SZWN0LmggYi9saWJzL2h3dWkvUmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvUmVjdC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1JFQ1RfSAorI2RlZmluZSBBTkRST0lEX1VJX1JFQ1RfSAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gU3RydWN0cworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgUmVjdCB7CisgICAgZmxvYXQgbGVmdDsKKyAgICBmbG9hdCB0b3A7CisgICAgZmxvYXQgcmlnaHQ7CisgICAgZmxvYXQgYm90dG9tOworCisgICAgUmVjdCgpOgorICAgICAgICAgICAgbGVmdCgwKSwKKyAgICAgICAgICAgIHRvcCgwKSwKKyAgICAgICAgICAgIHJpZ2h0KDApLAorICAgICAgICAgICAgYm90dG9tKDApIHsKKyAgICB9CisKKyAgICBSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSk6CisgICAgICAgICAgICBsZWZ0KGxlZnQpLAorICAgICAgICAgICAgdG9wKHRvcCksCisgICAgICAgICAgICByaWdodChyaWdodCksCisgICAgICAgICAgICBib3R0b20oYm90dG9tKSB7CisgICAgfQorCisgICAgUmVjdChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICB9CisKKyAgICBSZWN0KFJlY3QmIHIpIHsKKyAgICAgICAgc2V0KHIpOworICAgIH0KKworICAgIFJlY3QmIG9wZXJhdG9yPShjb25zdCBSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFJlY3QmIG9wZXJhdG9yPShSZWN0JiByKSB7CisgICAgICAgIHNldChyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGZyaWVuZCBpbnQgb3BlcmF0b3I9PShjb25zdCBSZWN0JiBhLCBjb25zdCBSZWN0JiBiKSB7CisgICAgICAgIHJldHVybiAhbWVtY21wKCZhLCAmYiwgc2l6ZW9mKGEpKTsKKyAgICB9CisKKyAgICBmcmllbmQgaW50IG9wZXJhdG9yIT0oY29uc3QgUmVjdCYgYSwgY29uc3QgUmVjdCYgYikgeworICAgICAgICByZXR1cm4gbWVtY21wKCZhLCAmYiwgc2l6ZW9mKGEpKTsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0ID49IHJpZ2h0IHx8IHRvcCA+PSBib3R0b207CisgICAgfQorCisgICAgdm9pZCBzZXRFbXB0eSgpIHsKKyAgICAgICAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIHZvaWQgc2V0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICB0aGlzLT5sZWZ0ID0gbGVmdDsKKyAgICAgICAgdGhpcy0+cmlnaHQgPSByaWdodDsKKyAgICAgICAgdGhpcy0+dG9wID0gdG9wOworICAgICAgICB0aGlzLT5ib3R0b20gPSBib3R0b207CisgICAgfQorCisgICAgdm9pZCBzZXQoY29uc3QgUmVjdCYgcikgeworICAgICAgICBzZXQoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGlubGluZSBmbG9hdCBnZXRXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0IC0gbGVmdDsKKyAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgZ2V0SGVpZ2h0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gYm90dG9tIC0gdG9wOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0cyhmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHJpZ2h0LCBmbG9hdCBib3R0b20pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20gJiYKKyAgICAgICAgICAgICAgICB0aGlzLT5sZWZ0IDwgdGhpcy0+cmlnaHQgJiYgdGhpcy0+dG9wIDwgdGhpcy0+Ym90dG9tICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b207CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IFJlY3QmIHIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGludGVyc2VjdHMoci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOworICAgIH0KKworICAgIGJvb2wgaW50ZXJzZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICBpZiAobGVmdCA8IHJpZ2h0ICYmIHRvcCA8IGJvdHRvbSAmJiAhdGhpcy0+aXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgdGhpcy0+bGVmdCA8IHJpZ2h0ICYmIGxlZnQgPCB0aGlzLT5yaWdodCAmJgorICAgICAgICAgICAgICAgIHRoaXMtPnRvcCA8IGJvdHRvbSAmJiB0b3AgPCB0aGlzLT5ib3R0b20pIHsKKworICAgICAgICAgICAgaWYgKHRoaXMtPmxlZnQgPCBsZWZ0KSB0aGlzLT5sZWZ0ID0gbGVmdDsKKyAgICAgICAgICAgIGlmICh0aGlzLT50b3AgPCB0b3ApIHRoaXMtPnRvcCA9IHRvcDsKKyAgICAgICAgICAgIGlmICh0aGlzLT5yaWdodCA+IHJpZ2h0KSB0aGlzLT5yaWdodCA9IHJpZ2h0OworICAgICAgICAgICAgaWYgKHRoaXMtPmJvdHRvbSA+IGJvdHRvbSkgdGhpcy0+Ym90dG9tID0gYm90dG9tOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpbnRlcnNlY3QoY29uc3QgUmVjdCYgcikgeworICAgICAgICByZXR1cm4gaW50ZXJzZWN0KHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tKTsKKyAgICB9CisKKyAgICBib29sIHVuaW9uV2l0aChjb25zdCBSZWN0JiByKSB7CisgICAgICAgIGlmIChyLmxlZnQgPCByLnJpZ2h0ICYmIHIudG9wIDwgci5ib3R0b20pIHsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgcmlnaHQgJiYgdG9wIDwgYm90dG9tKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPiByLmxlZnQpIGxlZnQgPSByLmxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKHRvcCA+IHIudG9wKSB0b3AgPSByLnRvcDsKKyAgICAgICAgICAgICAgICBpZiAocmlnaHQgPCByLnJpZ2h0KSByaWdodCA9IHIucmlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKGJvdHRvbSA8IHIuYm90dG9tKSBib3R0b20gPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVmdCA9IHIubGVmdDsKKyAgICAgICAgICAgICAgICB0b3AgPSByLnRvcDsKKyAgICAgICAgICAgICAgICByaWdodCA9IHIucmlnaHQ7CisgICAgICAgICAgICAgICAgYm90dG9tID0gci5ib3R0b207CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZHVtcCgpIGNvbnN0IHsKKyAgICAgICAgTE9HRCgiUmVjdFtsPSVmIHQ9JWYgcj0lZiBiPSVmXSIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCit9OyAvLyBzdHJ1Y3QgUmVjdAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfUkVDVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcCBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTdhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmNwcApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTa2lhQ29sb3JGaWx0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIGNvbG9yIGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JGaWx0ZXI6OlNraWFDb2xvckZpbHRlcihUeXBlIHR5cGUsIGJvb2wgYmxlbmQpOiBtVHlwZSh0eXBlKSwgbUJsZW5kKGJsZW5kKSB7Cit9CisKK1NraWFDb2xvckZpbHRlcjo6flNraWFDb2xvckZpbHRlcigpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29sb3IgbWF0cml4IGZpbHRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OlNraWFDb2xvck1hdHJpeEZpbHRlcihmbG9hdCogbWF0cml4LCBmbG9hdCogdmVjdG9yKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtDb2xvck1hdHJpeCwgdHJ1ZSksIG1NYXRyaXgobWF0cml4KSwgbVZlY3Rvcih2ZWN0b3IpIHsKK30KKworU2tpYUNvbG9yTWF0cml4RmlsdGVyOjp+U2tpYUNvbG9yTWF0cml4RmlsdGVyKCkgeworICAgIGRlbGV0ZVtdIG1NYXRyaXg7CisgICAgZGVsZXRlW10gbVZlY3RvcjsKK30KKwordm9pZCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXI6OmRlc2NyaWJlKFByb2dyYW1EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24sCisgICAgICAgIGNvbnN0IEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMpIHsKKyAgICBkZXNjcmlwdGlvbi5jb2xvck9wID0gUHJvZ3JhbURlc2NyaXB0aW9uOjprQ29sb3JNYXRyaXg7Cit9CisKK3ZvaWQgU2tpYUNvbG9yTWF0cml4RmlsdGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSkgeworICAgIGdsVW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeCIpLCAxLCBHTF9GQUxTRSwgJm1NYXRyaXhbMF0pOworICAgIGdsVW5pZm9ybTRmdihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvck1hdHJpeFZlY3RvciIpLCAxLCBtVmVjdG9yKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGlnaHRpbmcgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFMaWdodGluZ0ZpbHRlcjo6U2tpYUxpZ2h0aW5nRmlsdGVyKGludCBtdWx0aXBseSwgaW50IGFkZCk6CisgICAgICAgIFNraWFDb2xvckZpbHRlcihrTGlnaHRpbmcsIHRydWUpIHsKKyAgICBtTXVsUiA9ICgobXVsdGlwbHkgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbU11bEcgPSAoKG11bHRpcGx5ID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1NdWxCID0gKChtdWx0aXBseSAgICAgICkgJiAweEZGKSAvIDI1NS4wZjsKKworICAgIG1BZGRSID0gKChhZGQgPj4gMTYpICYgMHhGRikgLyAyNTUuMGY7CisgICAgbUFkZEcgPSAoKGFkZCA+PiAgOCkgJiAweEZGKSAvIDI1NS4wZjsKKyAgICBtQWRkQiA9ICgoYWRkICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckxpZ2h0aW5nOworfQorCit2b2lkIFNraWFMaWdodGluZ0ZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ011bCIpLCBtTXVsUiwgbU11bEcsIG1NdWxCLCAxLjBmKTsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJsaWdodGluZ0FkZCIpLCBtQWRkUiwgbUFkZEcsIG1BZGRCLCAwLjBmKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmxlbmQgY29sb3IgZmlsdGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCbGVuZEZpbHRlcjo6U2tpYUJsZW5kRmlsdGVyKGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKToKKyAgICAgICAgU2tpYUNvbG9yRmlsdGVyKGtCbGVuZCwgdHJ1ZSksIG1Nb2RlKG1vZGUpIHsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRjsKKyAgICBtQSA9IGFscGhhIC8gMjU1LjBmOworICAgIG1SID0gbUEgKiAoKGNvbG9yID4+IDE2KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1HID0gbUEgKiAoKGNvbG9yID4+ICA4KSAmIDB4RkYpIC8gMjU1LjBmOworICAgIG1CID0gbUEgKiAoKGNvbG9yICAgICAgKSAmIDB4RkYpIC8gMjU1LjBmOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGRlc2NyaXB0aW9uLmNvbG9yT3AgPSBQcm9ncmFtRGVzY3JpcHRpb246OmtDb2xvckJsZW5kOworICAgIGRlc2NyaXB0aW9uLmNvbG9yTW9kZSA9IG1Nb2RlOworfQorCit2b2lkIFNraWFCbGVuZEZpbHRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0pIHsKKyAgICBnbFVuaWZvcm00Zihwcm9ncmFtLT5nZXRVbmlmb3JtKCJjb2xvckJsZW5kIiksIG1SLCBtRywgbUIsIG1BKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmggYi9saWJzL2h3dWkvU2tpYUNvbG9yRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YjZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhQ29sb3JGaWx0ZXIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfU0tJQV9DT0xPUl9GSUxURVJfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJFeHRlbnNpb25zLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBjb2xvciBmaWx0ZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGEgU2tpYSBjb2xvciBmaWx0ZXIuIEEgY29sb3IgZmlsdGVyIG1vZGlmaWVzIGEgUHJvZ3JhbURlc2NyaXB0aW9uCisgKiBhbmQgc2V0cyB1bmlmb3JtcyBvbiB0aGUgcmVzdWx0aW5nIHNoYWRlcnMuCisgKi8KK3N0cnVjdCBTa2lhQ29sb3JGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgU2tpYSBjb2xvciBmaWx0ZXIgaW4gdXNlLgorICAgICAqLworICAgIGVudW0gVHlwZSB7CisgICAgICAgIGtOb25lLAorICAgICAgICBrQ29sb3JNYXRyaXgsCisgICAgICAgIGtMaWdodGluZywKKyAgICAgICAga0JsZW5kLAorICAgIH07CisKKyAgICBTa2lhQ29sb3JGaWx0ZXIoVHlwZSB0eXBlLCBib29sIGJsZW5kKTsKKyAgICB2aXJ0dWFsIH5Ta2lhQ29sb3JGaWx0ZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKSA9IDA7CisKKyAgICBpbmxpbmUgYm9vbCBibGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbGVuZDsKKyAgICB9CisKKyAgICBUeXBlIHR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBUeXBlIG1UeXBlOworICAgIGJvb2wgbUJsZW5kOworfTsgLy8gc3RydWN0IFNraWFDb2xvckZpbHRlcgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbXBsZW1lbnRhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIGNvbG9yIGZpbHRlciB0aGF0IG11bHRpcGxpZXMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgbWF0cml4IGFuZCBhZGRzIGEgdmVjdG9yLgorICovCitzdHJ1Y3QgU2tpYUNvbG9yTWF0cml4RmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIoZmxvYXQqIG1hdHJpeCwgZmxvYXQqIHZlY3Rvcik7CisgICAgflNraWFDb2xvck1hdHJpeEZpbHRlcigpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCogbU1hdHJpeDsKKyAgICBmbG9hdCogbVZlY3RvcjsKK307IC8vIHN0cnVjdCBTa2lhQ29sb3JNYXRyaXhGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBtdWx0aXBsaWVzIHRoZSBzb3VyY2UgY29sb3Igd2l0aCBhIGZpeGVkIHZhbHVlIGFuZCBhZGRzCisgKiBhbm90aGVyIGZpeGVkIHZhbHVlLiBJZ25vcmVzIHRoZSBhbHBoYSBjaGFubmVsIG9mIGJvdGggYXJndW1lbnRzLgorICovCitzdHJ1Y3QgU2tpYUxpZ2h0aW5nRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhTGlnaHRpbmdGaWx0ZXIoaW50IG11bHRpcGx5LCBpbnQgYWRkKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSk7CisKK3ByaXZhdGU6CisgICAgR0xmbG9hdCBtTXVsUiwgbU11bEcsIG1NdWxCOworICAgIEdMZmxvYXQgbUFkZFIsIG1BZGRHLCBtQWRkQjsKK307IC8vIHN0cnVjdCBTa2lhTGlnaHRpbmdGaWx0ZXIKKworLyoqCisgKiBBIGNvbG9yIGZpbHRlcnMgdGhhdCBibGVuZHMgdGhlIHNvdXJjZSBjb2xvciB3aXRoIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGNvbG9yCisgKiBhbmQgUG9ydGVyRHVmZiBibGVuZGluZyBtb2RlLgorICovCitzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyOiBwdWJsaWMgU2tpYUNvbG9yRmlsdGVyIHsKKyAgICBTa2lhQmxlbmRGaWx0ZXIoaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpOworCisgICAgdm9pZCBkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKTsKKyAgICB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtKTsKKworcHJpdmF0ZToKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1Nb2RlOworICAgIEdMZmxvYXQgbVIsIG1HLCBtQiwgbUE7Cit9OyAvLyBzdHJ1Y3QgU2tpYUJsZW5kRmlsdGVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TS0lBX0NPTE9SX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAgYi9saWJzL2h3dWkvU2tpYVNoYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlMGY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9Ta2lhU2hhZGVyLmNwcApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPFNrTWF0cml4Lmg+CisKKyNpbmNsdWRlICJTa2lhU2hhZGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZS5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFN1cHBvcnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IEdMZW51bSBnVGV4dHVyZVVuaXRzTWFwW10gPSB7CisgICAgICAgIEdMX1RFWFRVUkUwLAorICAgICAgICBHTF9URVhUVVJFMSwKKyAgICAgICAgR0xfVEVYVFVSRTIKK307CisKK3N0YXRpYyBjb25zdCBHTGludCBnVGlsZU1vZGVzW10gPSB7CisgICAgICAgIEdMX0NMQU1QX1RPX0VER0UsICAgLy8gPT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZQorICAgICAgICBHTF9SRVBFQVQsICAgICAgICAgIC8vID09IFNrU2hhZGVyOjprUmVwZWF0X01vZGUKKyAgICAgICAgR0xfTUlSUk9SRURfUkVQRUFUICAvLyA9PSBTa1NoYWRlcjo6a01pcnJvcl9UaWxlTW9kZQorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQmFzZSBzaGFkZXIKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2tpYVNoYWRlcjo6U2tpYVNoYWRlcihUeXBlIHR5cGUsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlWCwKKyAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKToKKyAgICAgICAgbVR5cGUodHlwZSksIG1LZXkoa2V5KSwgbVRpbGVYKHRpbGVYKSwgbVRpbGVZKHRpbGVZKSwgbU1hdHJpeChtYXRyaXgpLCBtQmxlbmQoYmxlbmQpIHsKK30KKworU2tpYVNoYWRlcjo6flNraWFTaGFkZXIoKSB7Cit9CisKK3ZvaWQgU2tpYVNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworfQorCit2b2lkIFNraWFTaGFkZXI6OnNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgR0x1aW50KiB0ZXh0dXJlVW5pdCkgeworfQorCit2b2lkIFNraWFTaGFkZXI6OmJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KSB7CisgICAgZ2xBY3RpdmVUZXh0dXJlKGdUZXh0dXJlVW5pdHNNYXBbdGV4dHVyZVVuaXRdKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgd3JhcFMpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcFQpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCaXRtYXAgc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFCaXRtYXBTaGFkZXI6OlNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOgorICAgICAgICBTa2lhU2hhZGVyKGtCaXRtYXAsIGtleSwgdGlsZVgsIHRpbGVZLCBtYXRyaXgsIGJsZW5kKSwgbUJpdG1hcChiaXRtYXApLCBtVGV4dHVyZShOVUxMKSB7Cit9CisKK3ZvaWQgU2tpYUJpdG1hcFNoYWRlcjo6ZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucykgeworICAgIGNvbnN0IFRleHR1cmUqIHRleHR1cmUgPSBtVGV4dHVyZUNhY2hlLT5nZXQobUJpdG1hcCk7CisgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47CisgICAgbVRleHR1cmUgPSB0ZXh0dXJlOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBkZXNjcmlwdGlvbi5oYXNCaXRtYXAgPSB0cnVlOworICAgIC8vIFRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBub24tcG93ZXIgb2YgdHdvIG1pcnJvcmVkL3JlcGVhdGVkCisgICAgLy8gdGV4dHVyZXMsIHNvIGRvIGl0IG91cnNlbHZlcworICAgIGlmICghZXh0ZW5zaW9ucy5oYXNOUG90KCkgJiYgKCFpc1Bvd2VyT2ZUd28od2lkdGgpIHx8ICFpc1Bvd2VyT2ZUd28oaGVpZ2h0KSkgJiYKKyAgICAgICAgICAgIChtVGlsZVggIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSB8fCBtVGlsZVkgIT0gU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSkpIHsKKyAgICAgICAgZGVzY3JpcHRpb24uaXNCaXRtYXBOcG90ID0gdHJ1ZTsKKyAgICAgICAgZGVzY3JpcHRpb24uYml0bWFwV3JhcFMgPSBnVGlsZU1vZGVzW21UaWxlWF07CisgICAgICAgIGRlc2NyaXB0aW9uLmJpdG1hcFdyYXBUID0gZ1RpbGVNb2Rlc1ttVGlsZVldOworICAgIH0KK30KKwordm9pZCBTa2lhQml0bWFwU2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBHTHVpbnQgdGV4dHVyZVNsb3QgPSAoKnRleHR1cmVVbml0KSsrOworICAgIGdsQWN0aXZlVGV4dHVyZShnVGV4dHVyZVVuaXRzTWFwW3RleHR1cmVTbG90XSk7CisKKyAgICBjb25zdCBUZXh0dXJlKiB0ZXh0dXJlID0gbVRleHR1cmU7CisgICAgbVRleHR1cmUgPSBOVUxMOworICAgIGlmICghdGV4dHVyZSkgcmV0dXJuOworICAgIGNvbnN0IEF1dG9UZXh0dXJlIGF1dG9DbGVhbnVwKHRleHR1cmUpOworCisgICAgY29uc3QgZmxvYXQgd2lkdGggPSB0ZXh0dXJlLT53aWR0aDsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSB0ZXh0dXJlLT5oZWlnaHQ7CisKKyAgICBtYXQ0IHRleHR1cmVUcmFuc2Zvcm07CisgICAgaWYgKG1NYXRyaXgpIHsKKyAgICAgICAgU2tNYXRyaXggaW52ZXJzZTsKKyAgICAgICAgbU1hdHJpeC0+aW52ZXJ0KCZpbnZlcnNlKTsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKGludmVyc2UpOworICAgICAgICB0ZXh0dXJlVHJhbnNmb3JtLm11bHRpcGx5KG1vZGVsVmlldyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dHVyZVRyYW5zZm9ybS5sb2FkKG1vZGVsVmlldyk7CisgICAgfQorCisgICAgLy8gVW5pZm9ybXMKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLT5pZCwgZ1RpbGVNb2Rlc1ttVGlsZVhdLCBnVGlsZU1vZGVzW21UaWxlWV0sIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0xaShwcm9ncmFtLT5nZXRVbmlmb3JtKCJiaXRtYXBTYW1wbGVyIiksIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgidGV4dHVyZVRyYW5zZm9ybSIpLCAxLAorICAgICAgICAgICAgR0xfRkFMU0UsICZ0ZXh0dXJlVHJhbnNmb3JtLmRhdGFbMF0pOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oInRleHR1cmVEaW1lbnNpb24iKSwgMS4wZiAvIHdpZHRoLCAxLjBmIC8gaGVpZ2h0KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTGluZWFyIGdyYWRpZW50IHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6OlNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihmbG9hdCogYm91bmRzLCB1aW50MzJfdCogY29sb3JzLAorICAgICAgICBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsIFNrU2hhZGVyKiBrZXksIFNrU2hhZGVyOjpUaWxlTW9kZSB0aWxlTW9kZSwKKyAgICAgICAgU2tNYXRyaXgqIG1hdHJpeCwgYm9vbCBibGVuZCk6CisgICAgICAgIFNraWFTaGFkZXIoa0xpbmVhckdyYWRpZW50LCBrZXksIHRpbGVNb2RlLCB0aWxlTW9kZSwgbWF0cml4LCBibGVuZCksCisgICAgICAgIG1Cb3VuZHMoYm91bmRzKSwgbUNvbG9ycyhjb2xvcnMpLCBtUG9zaXRpb25zKHBvc2l0aW9ucyksIG1Db3VudChjb3VudCkgeworfQorCitTa2lhTGluZWFyR3JhZGllbnRTaGFkZXI6On5Ta2lhTGluZWFyR3JhZGllbnRTaGFkZXIoKSB7CisgICAgZGVsZXRlW10gbUJvdW5kczsKKyAgICBkZWxldGVbXSBtQ29sb3JzOworICAgIGRlbGV0ZVtdIG1Qb3NpdGlvbnM7Cit9CisKK3ZvaWQgU2tpYUxpbmVhckdyYWRpZW50U2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLAorICAgICAgICBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgZGVzY3JpcHRpb24uaGFzR3JhZGllbnQgPSB0cnVlOworfQorCit2b2lkIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjo6c2V0dXBQcm9ncmFtKFByb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hdDQmIG1vZGVsVmlldywKKyAgICAgICAgY29uc3QgU25hcHNob3QmIHNuYXBzaG90LCBHTHVpbnQqIHRleHR1cmVVbml0KSB7CisgICAgR0x1aW50IHRleHR1cmVTbG90ID0gKCp0ZXh0dXJlVW5pdCkrKzsKKyAgICBnbEFjdGl2ZVRleHR1cmUoZ1RleHR1cmVVbml0c01hcFt0ZXh0dXJlU2xvdF0pOworCisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1HcmFkaWVudENhY2hlLT5nZXQobUtleSk7CisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIHRleHR1cmUgPSBtR3JhZGllbnRDYWNoZS0+YWRkTGluZWFyR3JhZGllbnQobUtleSwgbUJvdW5kcywgbUNvbG9ycywgbVBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICBtQ291bnQsIG1UaWxlWCk7CisgICAgfQorCisgICAgUmVjdCBzdGFydChtQm91bmRzWzBdLCBtQm91bmRzWzFdLCBtQm91bmRzWzJdLCBtQm91bmRzWzNdKTsKKyAgICBpZiAobU1hdHJpeCkgeworICAgICAgICBtYXQ0IHNoYWRlck1hdHJpeCgqbU1hdHJpeCk7CisgICAgICAgIHNoYWRlck1hdHJpeC5tYXBQb2ludChzdGFydC5sZWZ0LCBzdGFydC50b3ApOworICAgICAgICBzaGFkZXJNYXRyaXgubWFwUG9pbnQoc3RhcnQucmlnaHQsIHN0YXJ0LmJvdHRvbSk7CisgICAgfQorICAgIHNuYXBzaG90LnRyYW5zZm9ybS0+bWFwUmVjdChzdGFydCk7CisKKyAgICBjb25zdCBmbG9hdCBncmFkaWVudFggPSBzdGFydC5yaWdodCAtIHN0YXJ0LmxlZnQ7CisgICAgY29uc3QgZmxvYXQgZ3JhZGllbnRZID0gc3RhcnQuYm90dG9tIC0gc3RhcnQudG9wOworCisgICAgbWF0NCBzY3JlZW5TcGFjZSgqc25hcHNob3QudHJhbnNmb3JtKTsKKyAgICBzY3JlZW5TcGFjZS5tdWx0aXBseShtb2RlbFZpZXcpOworCisgICAgLy8gVW5pZm9ybXMKKyAgICBiaW5kVGV4dHVyZSh0ZXh0dXJlLT5pZCwgZ1RpbGVNb2Rlc1ttVGlsZVhdLCBnVGlsZU1vZGVzW21UaWxlWV0sIHRleHR1cmVTbG90KTsKKyAgICBnbFVuaWZvcm0xaShwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudFNhbXBsZXIiKSwgdGV4dHVyZVNsb3QpOworICAgIGdsVW5pZm9ybTJmKHByb2dyYW0tPmdldFVuaWZvcm0oImdyYWRpZW50U3RhcnQiKSwgc3RhcnQubGVmdCwgc3RhcnQudG9wKTsKKyAgICBnbFVuaWZvcm0yZihwcm9ncmFtLT5nZXRVbmlmb3JtKCJncmFkaWVudCIpLCBncmFkaWVudFgsIGdyYWRpZW50WSk7CisgICAgZ2xVbmlmb3JtMWYocHJvZ3JhbS0+Z2V0VW5pZm9ybSgiZ3JhZGllbnRMZW5ndGgiKSwKKyAgICAgICAgICAgIDEuMGYgLyAoZ3JhZGllbnRYICogZ3JhZGllbnRYICsgZ3JhZGllbnRZICogZ3JhZGllbnRZKSk7CisgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KHByb2dyYW0tPmdldFVuaWZvcm0oInNjcmVlblNwYWNlIiksIDEsIEdMX0ZBTFNFLCAmc2NyZWVuU3BhY2UuZGF0YVswXSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbXBvc2Ugc2hhZGVyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NraWFDb21wb3NlU2hhZGVyOjpTa2lhQ29tcG9zZVNoYWRlcihTa2lhU2hhZGVyKiBmaXJzdCwgU2tpYVNoYWRlciogc2Vjb25kLAorICAgICAgICBTa1hmZXJtb2RlOjpNb2RlIG1vZGUsIFNrU2hhZGVyKiBrZXkpOgorICAgICAgICBTa2lhU2hhZGVyKGtDb21wb3NlLCBrZXksIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUsIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1vZGUsCisgICAgICAgIE5VTEwsIGZpcnN0LT5ibGVuZCgpIHx8IHNlY29uZC0+YmxlbmQoKSksIG1GaXJzdChmaXJzdCksIG1TZWNvbmQoc2Vjb25kKSwgbU1vZGUobW9kZSkgeworfQorCit2b2lkIFNraWFDb21wb3NlU2hhZGVyOjpzZXQoVGV4dHVyZUNhY2hlKiB0ZXh0dXJlQ2FjaGUsIEdyYWRpZW50Q2FjaGUqIGdyYWRpZW50Q2FjaGUpIHsKKyAgICBTa2lhU2hhZGVyOjpzZXQodGV4dHVyZUNhY2hlLCBncmFkaWVudENhY2hlKTsKKyAgICBtRmlyc3QtPnNldCh0ZXh0dXJlQ2FjaGUsIGdyYWRpZW50Q2FjaGUpOworICAgIG1TZWNvbmQtPnNldCh0ZXh0dXJlQ2FjaGUsIGdyYWRpZW50Q2FjaGUpOworfQorCit2b2lkIFNraWFDb21wb3NlU2hhZGVyOjpkZXNjcmliZShQcm9ncmFtRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBjb25zdCBFeHRlbnNpb25zJiBleHRlbnNpb25zKSB7CisgICAgbUZpcnN0LT5kZXNjcmliZShkZXNjcmlwdGlvbiwgZXh0ZW5zaW9ucyk7CisgICAgbVNlY29uZC0+ZGVzY3JpYmUoZGVzY3JpcHRpb24sIGV4dGVuc2lvbnMpOworICAgIGlmIChtRmlyc3QtPnR5cGUoKSA9PSBrQml0bWFwKSB7CisgICAgICAgIGRlc2NyaXB0aW9uLmlzQml0bWFwRmlyc3QgPSB0cnVlOworICAgIH0KKyAgICBkZXNjcmlwdGlvbi5zaGFkZXJzTW9kZSA9IG1Nb2RlOworfQorCit2b2lkIFNraWFDb21wb3NlU2hhZGVyOjpzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LAorICAgICAgICBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsIEdMdWludCogdGV4dHVyZVVuaXQpIHsKKyAgICBtRmlyc3QtPnNldHVwUHJvZ3JhbShwcm9ncmFtLCBtb2RlbFZpZXcsIHNuYXBzaG90LCB0ZXh0dXJlVW5pdCk7CisgICAgbVNlY29uZC0+c2V0dXBQcm9ncmFtKHByb2dyYW0sIG1vZGVsVmlldywgc25hcHNob3QsIHRleHR1cmVVbml0KTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU2tpYVNoYWRlci5oIGIvbGlicy9od3VpL1NraWFTaGFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVlM2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9od3VpL1NraWFTaGFkZXIuaApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICisjZGVmaW5lIEFORFJPSURfVUlfU0tJQV9TSEFERVJfSAorCisjaW5jbHVkZSA8U2tTaGFkZXIuaD4KKyNpbmNsdWRlIDxTa1hmZXJtb2RlLmg+CisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgIkV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJUZXh0dXJlQ2FjaGUuaCIKKyNpbmNsdWRlICJHcmFkaWVudENhY2hlLmgiCisjaW5jbHVkZSAiU25hcHNob3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCYXNlIHNoYWRlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTa2lhIHNoYWRlci4gQSBzaGFkZXIgd2lsbCBtb2RpZnkgdGhlIEdMIGNvbnRleHQgYW5kIGFjdGl2ZQorICogcHJvZ3JhbSB0byByZWNyZWF0ZSB0aGUgb3JpZ2luYWwgZWZmZWN0LgorICovCitzdHJ1Y3QgU2tpYVNoYWRlciB7CisgICAgLyoqCisgICAgICogVHlwZSBvZiBTa2lhIHNoYWRlciBpbiB1c2UuCisgICAgICovCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga05vbmUsCisgICAgICAgIGtCaXRtYXAsCisgICAgICAgIGtMaW5lYXJHcmFkaWVudCwKKyAgICAgICAga0NpcmN1bGFyR3JhZGllbnQsCisgICAgICAgIGtTd2VlcEdyYWRpZW50LAorICAgICAgICBrQ29tcG9zZQorICAgIH07CisKKyAgICBTa2lhU2hhZGVyKFR5cGUgdHlwZSwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZVksCisgICAgICAgICAgICBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKyAgICB2aXJ0dWFsIH5Ta2lhU2hhZGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwUHJvZ3JhbShQcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXQ0JiBtb2RlbFZpZXcsIGNvbnN0IFNuYXBzaG90JiBzbmFwc2hvdCwKKyAgICAgICAgICAgIEdMdWludCogdGV4dHVyZVVuaXQpOworCisgICAgaW5saW5lIGJvb2wgYmxlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxlbmQ7CisgICAgfQorCisgICAgVHlwZSB0eXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNldChUZXh0dXJlQ2FjaGUqIHRleHR1cmVDYWNoZSwgR3JhZGllbnRDYWNoZSogZ3JhZGllbnRDYWNoZSkgeworICAgICAgICBtVGV4dHVyZUNhY2hlID0gdGV4dHVyZUNhY2hlOworICAgICAgICBtR3JhZGllbnRDYWNoZSA9IGdyYWRpZW50Q2FjaGU7CisgICAgfQorCisgICAgdm9pZCBzZXRNYXRyaXgoU2tNYXRyaXgqIG1hdHJpeCkgeworICAgICAgICBtTWF0cml4ID0gbWF0cml4OworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSB2b2lkIGJpbmRUZXh0dXJlKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gd3JhcFMsIEdMZW51bSB3cmFwVCwgR0x1aW50IHRleHR1cmVVbml0KTsKKworICAgIFR5cGUgbVR5cGU7CisgICAgU2tTaGFkZXIqIG1LZXk7CisgICAgU2tTaGFkZXI6OlRpbGVNb2RlIG1UaWxlWDsKKyAgICBTa1NoYWRlcjo6VGlsZU1vZGUgbVRpbGVZOworICAgIFNrTWF0cml4KiBtTWF0cml4OworICAgIGJvb2wgbUJsZW5kOworCisgICAgVGV4dHVyZUNhY2hlKiBtVGV4dHVyZUNhY2hlOworICAgIEdyYWRpZW50Q2FjaGUqIG1HcmFkaWVudENhY2hlOworfTsgLy8gc3RydWN0IFNraWFTaGFkZXIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBJbXBsZW1lbnRhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBBIHNoYWRlciB0aGF0IGRyYXdzIGEgYml0bWFwLgorICovCitzdHJ1Y3QgU2tpYUJpdG1hcFNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFCaXRtYXBTaGFkZXIoU2tCaXRtYXAqIGJpdG1hcCwgU2tTaGFkZXIqIGtleSwgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVYLAorICAgICAgICAgICAgU2tTaGFkZXI6OlRpbGVNb2RlIHRpbGVZLCBTa01hdHJpeCogbWF0cml4LCBib29sIGJsZW5kKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGZvciBuID09IDAuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNQb3dlck9mVHdvKHVuc2lnbmVkIGludCBuKSB7CisgICAgICAgIHJldHVybiAhKG4gJiAobiAtIDEpKTsKKyAgICB9CisKKyAgICBTa0JpdG1hcCogbUJpdG1hcDsKKyAgICBjb25zdCBUZXh0dXJlKiBtVGV4dHVyZTsKK307IC8vIHN0cnVjdCBTa2lhQml0bWFwU2hhZGVyCisKKy8qKgorICogQSBzaGFkZXIgdGhhdCBkcmF3cyBhIGxpbmVhciBncmFkaWVudC4KKyAqLworc3RydWN0IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcjogcHVibGljIFNraWFTaGFkZXIgeworICAgIFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcihmbG9hdCogYm91bmRzLCB1aW50MzJfdCogY29sb3JzLCBmbG9hdCogcG9zaXRpb25zLCBpbnQgY291bnQsCisgICAgICAgICAgICBTa1NoYWRlcioga2V5LCBTa1NoYWRlcjo6VGlsZU1vZGUgdGlsZU1vZGUsIFNrTWF0cml4KiBtYXRyaXgsIGJvb2wgYmxlbmQpOworICAgIH5Ta2lhTGluZWFyR3JhZGllbnRTaGFkZXIoKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworcHJpdmF0ZToKKyAgICBmbG9hdCogbUJvdW5kczsKKyAgICB1aW50MzJfdCogbUNvbG9yczsKKyAgICBmbG9hdCogbVBvc2l0aW9uczsKKyAgICBpbnQgbUNvdW50OworfTsgLy8gc3RydWN0IFNraWFMaW5lYXJHcmFkaWVudFNoYWRlcgorCisvKioKKyAqIEEgc2hhZGVyIHRoYXQgZHJhd3MgdHdvIHNoYWRlcnMsIGNvbXBvc2l0ZWQgd2l0aCBhbiB4ZmVybW9kZS4KKyAqLworc3RydWN0IFNraWFDb21wb3NlU2hhZGVyOiBwdWJsaWMgU2tpYVNoYWRlciB7CisgICAgU2tpYUNvbXBvc2VTaGFkZXIoU2tpYVNoYWRlciogZmlyc3QsIFNraWFTaGFkZXIqIHNlY29uZCwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBTa1NoYWRlcioga2V5KTsKKworICAgIHZvaWQgc2V0KFRleHR1cmVDYWNoZSogdGV4dHVyZUNhY2hlLCBHcmFkaWVudENhY2hlKiBncmFkaWVudENhY2hlKTsKKworICAgIHZvaWQgZGVzY3JpYmUoUHJvZ3JhbURlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbiwgY29uc3QgRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyk7CisgICAgdm9pZCBzZXR1cFByb2dyYW0oUHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWF0NCYgbW9kZWxWaWV3LCBjb25zdCBTbmFwc2hvdCYgc25hcHNob3QsCisgICAgICAgICAgICBHTHVpbnQqIHRleHR1cmVVbml0KTsKKworcHJpdmF0ZToKKyAgICBTa2lhU2hhZGVyKiBtRmlyc3Q7CisgICAgU2tpYVNoYWRlciogbVNlY29uZDsKKyAgICBTa1hmZXJtb2RlOjpNb2RlIG1Nb2RlOworfTsgLy8gc3RydWN0IFNraWFDb21wb3NlU2hhZGVyCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TS0lBX1NIQURFUl9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvU25hcHNob3QuaCBiL2xpYnMvaHd1aS9TbmFwc2hvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWRmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvU25hcHNob3QuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9TTkFQU0hPVF9ICisjZGVmaW5lIEFORFJPSURfVUlfU05BUFNIT1RfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxTa0NhbnZhcy5oPgorI2luY2x1ZGUgPFNrUmVnaW9uLmg+CisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIk1hdHJpeC5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIEEgc25hcHNob3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmluZworICogc3VyZmFjZS4gQSBzbmFwc2hvdCBpcyB1c3VhbGx5IGNyZWF0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2FsbHMgc2F2ZSgpCisgKiBhbmQgZGlzY2FyZGVkIHdoZW4gdGhlIHVzZXIgY2FsbHMgcmVzdG9yZSgpLiBPbmNlIGEgc25hcHNob3QgaXMgY3JlYXRlZCwKKyAqIGl0IGNhbiBob2xkIGluZm9ybWF0aW9uIGZvciBkZWZlcnJlZCByZW5kZXJpbmcuCisgKgorICogRWFjaCBzbmFwc2hvdCBoYXMgYSBsaW5rIHRvIGEgcHJldmlvdXMgc25hcHNob3QsIGluZGljYXRpbmcgdGhlIHByZXZpb3VzCisgKiBzdGF0ZSBvZiB0aGUgcmVuZGVyZXIuCisgKi8KK2NsYXNzIFNuYXBzaG90OiBwdWJsaWMgTGlnaHRSZWZCYXNlPFNuYXBzaG90PiB7CitwdWJsaWM6CisgICAgU25hcHNob3QoKTogZmxhZ3MoMCksIHByZXZpb3VzKE5VTEwpLCBsYXllcihOVUxMKSB7CisgICAgICAgIHRyYW5zZm9ybSA9ICZtVHJhbnNmb3JtUm9vdDsKKyAgICAgICAgY2xpcFJlY3QgPSAmbUNsaXBSZWN0Um9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIHNwZWNpZmllZCBzbmFwc2hvdC8gVGhlIHNwZWNpZmllZCBzbmFwc2hvdCBpcyBzdG9yZWQgYXMKKyAgICAgKiB0aGUgcHJldmlvdXMgc25hcHNob3QuCisgICAgICovCisgICAgU25hcHNob3QoY29uc3Qgc3A8U25hcHNob3Q+JiBzLCBpbnQgc2F2ZUZsYWdzKToKKyAgICAgICAgICAgIGZsYWdzKDApLCBwcmV2aW91cyhzKSwgbGF5ZXIoTlVMTCkgeworICAgICAgICBpZiAoc2F2ZUZsYWdzICYgU2tDYW52YXM6OmtNYXRyaXhfU2F2ZUZsYWcpIHsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1Sb290LmxvYWQoKnMtPnRyYW5zZm9ybSk7CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSAmbVRyYW5zZm9ybVJvb3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBzLT50cmFuc2Zvcm07CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2F2ZUZsYWdzICYgU2tDYW52YXM6OmtDbGlwX1NhdmVGbGFnKSB7CisgICAgICAgICAgICBtQ2xpcFJlY3RSb290LnNldCgqcy0+Y2xpcFJlY3QpOworICAgICAgICAgICAgY2xpcFJlY3QgPSAmbUNsaXBSZWN0Um9vdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaXBSZWN0ID0gcy0+Y2xpcFJlY3Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnQ2xpcFNldCkgJiYKKyAgICAgICAgICAgICAgICAhKHMtPmZsYWdzICYgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXApKSB7CisgICAgICAgICAgICBtTG9jYWxDbGlwLnNldChzLT5tTG9jYWxDbGlwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFyaW91cyBmbGFncyBzZXQgb24gI2ZsYWdzLgorICAgICAqLworICAgIGVudW0gRmxhZ3MgeworICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNsaXAgcmVnaW9uIHdhcyBtb2RpZmllZC4gV2hlbiB0aGlzCisgICAgICAgICAqIHNuYXBzaG90IGlzIHJlc3RvcmVkIHNvIG11c3QgdGhlIGNsaXAuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0NsaXBTZXQgPSAweDEsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIHNuYXBzaG90IHdhcyBjcmVhdGVkIHdoZW4gc2F2aW5nCisgICAgICAgICAqIGEgbmV3IGxheWVyLgorICAgICAgICAgKi8KKyAgICAgICAga0ZsYWdJc0xheWVyID0gMHgyLAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGxvY2FsIGNsaXAgc2hvdWxkIGJlIHJlY29tcHV0ZWQuCisgICAgICAgICAqLworICAgICAgICBrRmxhZ0RpcnR5TG9jYWxDbGlwID0gMHg0LAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBjbGlwIHdpdGggdGhlIG5ldyBjbGlwIHJlY3RhbmdsZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi4gVGhlIHNwZWNpZmllZCByZWN0YW5nbGUgaXMgdHJhbnNmb3JtZWQKKyAgICAgKiBieSB0aGlzIHNuYXBzaG90J3MgdHJhc25mb3JtYXRpb24uCisgICAgICovCisgICAgYm9vbCBjbGlwKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgIFNrUmVnaW9uOjpPcCBvcCA9IFNrUmVnaW9uOjprSW50ZXJzZWN0X09wKSB7CisgICAgICAgIFJlY3QgcihsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICB0cmFuc2Zvcm0tPm1hcFJlY3Qocik7CisgICAgICAgIHJldHVybiBjbGlwVHJhbnNmb3JtZWQociwgb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBjdXJyZW50IGNsaXAgd2l0aCB0aGUgbmV3IGNsaXAgcmVjdGFuZ2xlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLiBUaGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBpcyBjb25zaWRlcmVkCisgICAgICogYWxyZWFkeSB0cmFuc2Zvcm1lZC4KKyAgICAgKi8KKyAgICBib29sIGNsaXBUcmFuc2Zvcm1lZChjb25zdCBSZWN0JiByLCBTa1JlZ2lvbjo6T3Agb3AgPSBTa1JlZ2lvbjo6a0ludGVyc2VjdF9PcCkgeworICAgICAgICBib29sIGNsaXBwZWQgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprRGlmZmVyZW5jZV9PcDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tSZWdpb246OmtJbnRlcnNlY3RfT3A6CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IGNsaXBSZWN0LT5pbnRlcnNlY3Qocik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprVW5pb25fT3A6CisgICAgICAgICAgICAgICAgY2xpcHBlZCA9IGNsaXBSZWN0LT51bmlvbldpdGgocik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNrUmVnaW9uOjprWE9SX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1JldmVyc2VEaWZmZXJlbmNlX09wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa1JlZ2lvbjo6a1JlcGxhY2VfT3A6CisgICAgICAgICAgICAgICAgY2xpcFJlY3QtPnNldChyKTsKKyAgICAgICAgICAgICAgICBjbGlwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGlwcGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTbmFwc2hvdDo6a0ZsYWdDbGlwU2V0IHwgU25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xpcHBlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGNsaXAuCisgICAgICovCisgICAgdm9pZCBzZXRDbGlwKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSkgeworICAgICAgICBjbGlwUmVjdC0+c2V0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIGZsYWdzIHw9IFNuYXBzaG90OjprRmxhZ0NsaXBTZXQgfCBTbmFwc2hvdDo6a0ZsYWdEaXJ0eUxvY2FsQ2xpcDsKKyAgICB9CisKKyAgICBjb25zdCBSZWN0JiBnZXRMb2NhbENsaXAoKSB7CisgICAgICAgIGlmIChmbGFncyAmIFNuYXBzaG90OjprRmxhZ0RpcnR5TG9jYWxDbGlwKSB7CisgICAgICAgICAgICBtYXQ0IGludmVyc2U7CisgICAgICAgICAgICBpbnZlcnNlLmxvYWRJbnZlcnNlKCp0cmFuc2Zvcm0pOworCisgICAgICAgICAgICBtTG9jYWxDbGlwLnNldCgqY2xpcFJlY3QpOworICAgICAgICAgICAgaW52ZXJzZS5tYXBSZWN0KG1Mb2NhbENsaXApOworCisgICAgICAgICAgICBmbGFncyAmPSB+U25hcHNob3Q6OmtGbGFnRGlydHlMb2NhbENsaXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Mb2NhbENsaXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlydHkgZmxhZ3MuCisgICAgICovCisgICAgaW50IGZsYWdzOworCisgICAgLyoqCisgICAgICogUHJldmlvdXMgc25hcHNob3QuCisgICAgICovCisgICAgc3A8U25hcHNob3Q+IHByZXZpb3VzOworCisgICAgLyoqCisgICAgICogT25seSBzZXQgd2hlbiB0aGUgZmxhZyBrRmxhZ0lzTGF5ZXIgaXMgc2V0LgorICAgICAqLworICAgIExheWVyKiBsYXllcjsKKworICAgIC8qKgorICAgICAqIExvY2FsIHRyYW5zZm9ybWF0aW9uLiBIb2xkcyB0aGUgY3VycmVudCB0cmFuc2xhdGlvbiwgc2NhbGUgYW5kCisgICAgICogcm90YXRpb24gdmFsdWVzLgorICAgICAqLworICAgIG1hdDQqIHRyYW5zZm9ybTsKKworICAgIC8qKgorICAgICAqIEN1cnJlbnQgY2xpcCByZWdpb24uIFRoZSBjbGlwIGlzIHN0b3JlZCBpbiBjYW52YXMtc3BhY2UgY29vcmRpbmF0ZXMsCisgICAgICogKHNjcmVlbi1zcGFjZSBjb29yZGluYXRlcyBpbiB0aGUgcmVndWxhciBjYXNlLikKKyAgICAgKi8KKyAgICBSZWN0KiBjbGlwUmVjdDsKKworcHJpdmF0ZToKKyAgICBtYXQ0IG1UcmFuc2Zvcm1Sb290OworICAgIFJlY3QgbUNsaXBSZWN0Um9vdDsKKyAgICBSZWN0IG1Mb2NhbENsaXA7CisKK307IC8vIGNsYXNzIFNuYXBzaG90CisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9TTkFQU0hPVF9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NDI3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCisKKyNpbmNsdWRlICJUZXh0RHJvcFNoYWRvd0NhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHREcm9wU2hhZG93Q2FjaGU6OlRleHREcm9wU2hhZG93Q2FjaGUoKToKKyAgICAgICAgbUNhY2hlKEdlbmVyYXRpb25DYWNoZTxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX0RST1BfU0hBRE9XX0NBQ0hFX1NJWkUpKSB7CisgICAgY2hhciBwcm9wZXJ0eVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfRFJPUF9TSEFET1dfQ0FDSEVfU0laRSwgcHJvcGVydHksIE5VTEwpID4gMCkgeworICAgICAgICBMT0dEKCIgIFNldHRpbmcgZHJvcCBzaGFkb3cgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IGRyb3Agc2hhZG93IGNhY2hlIHNpemUgb2YgJS4yZk1CIiwgREVGQVVMVF9EUk9QX1NIQURPV19DQUNIRV9TSVpFKTsKKyAgICB9CisKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworVGV4dERyb3BTaGFkb3dDYWNoZTo6VGV4dERyb3BTaGFkb3dDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2hhZG93VGV4dCwgU2hhZG93VGV4dHVyZSo+OjprVW5saW1pdGVkQ2FwYWNpdHkpLAorICAgICAgICBtU2l6ZSgwKSwgbU1heFNpemUobWF4Qnl0ZVNpemUpIHsKKyAgICBtQ2FjaGUuc2V0T25FbnRyeVJlbW92ZWRMaXN0ZW5lcih0aGlzKTsKK30KKworVGV4dERyb3BTaGFkb3dDYWNoZTo6flRleHREcm9wU2hhZG93Q2FjaGUoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNpemUgbWFuYWdlbWVudAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit1aW50MzJfdCBUZXh0RHJvcFNoYWRvd0NhY2hlOjpnZXRTaXplKCkgeworICAgIHJldHVybiBtU2l6ZTsKK30KKwordWludDMyX3QgVGV4dERyb3BTaGFkb3dDYWNoZTo6Z2V0TWF4U2l6ZSgpIHsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgVGV4dERyb3BTaGFkb3dDYWNoZTo6c2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKSB7CisgICAgbU1heFNpemUgPSBtYXhTaXplOworICAgIHdoaWxlIChtU2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgIG1DYWNoZS5yZW1vdmVPbGRlc3QoKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbGxiYWNrcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFRleHREcm9wU2hhZG93Q2FjaGU6Om9wZXJhdG9yKCkoU2hhZG93VGV4dCYgdGV4dCwgU2hhZG93VGV4dHVyZSomIHRleHR1cmUpIHsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gdGV4dHVyZS0+d2lkdGggKiB0ZXh0dXJlLT5oZWlnaHQ7CisgICAgbVNpemUgLT0gc2l6ZTsKKworICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVGV4dERyb3BTaGFkb3dDYWNoZTo6Y2xlYXIoKSB7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK1NoYWRvd1RleHR1cmUqIFRleHREcm9wU2hhZG93Q2FjaGU6OmdldChTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3QgbGVuLAorICAgICAgICBpbnQgbnVtR2x5cGhzLCB1aW50MzJfdCByYWRpdXMpIHsKKyAgICBTaGFkb3dUZXh0IGVudHJ5KHBhaW50LCByYWRpdXMsIGxlbiwgdGV4dCk7CisgICAgU2hhZG93VGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoZW50cnkpOworCisgICAgaWYgKCF0ZXh0dXJlKSB7CisgICAgICAgIEZvbnRSZW5kZXJlcjo6RHJvcFNoYWRvdyBzaGFkb3cgPSBtUmVuZGVyZXItPnJlbmRlckRyb3BTaGFkb3cocGFpbnQsIHRleHQsIDAsCisgICAgICAgICAgICAgICAgbGVuLCBudW1HbHlwaHMsIHJhZGl1cyk7CisKKyAgICAgICAgdGV4dHVyZSA9IG5ldyBTaGFkb3dUZXh0dXJlOworICAgICAgICB0ZXh0dXJlLT5sZWZ0ID0gc2hhZG93LnBlblg7CisgICAgICAgIHRleHR1cmUtPnRvcCA9IHNoYWRvdy5wZW5ZOworICAgICAgICB0ZXh0dXJlLT53aWR0aCA9IHNoYWRvdy53aWR0aDsKKyAgICAgICAgdGV4dHVyZS0+aGVpZ2h0ID0gc2hhZG93LmhlaWdodDsKKyAgICAgICAgdGV4dHVyZS0+Z2VuZXJhdGlvbiA9IDA7CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gdHJ1ZTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gc2hhZG93LndpZHRoICogc2hhZG93LmhlaWdodDsKKyAgICAgICAgLy8gRG9uJ3QgZXZlbiB0cnkgdG8gY2FjaGUgYSBiaXRtYXAgdGhhdCdzIGJpZ2dlciB0aGFuIHRoZSBjYWNoZQorICAgICAgICBpZiAoc2l6ZSA8IG1NYXhTaXplKSB7CisgICAgICAgICAgICB3aGlsZSAobVNpemUgKyBzaXplID4gbU1heFNpemUpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlLT5pZCk7CisKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlLT5pZCk7CisgICAgICAgIC8vIFRleHR1cmVzIGFyZSBBbHBoYTgKKyAgICAgICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIHRleHR1cmUtPndpZHRoLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHNoYWRvdy5pbWFnZSk7CisKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgICAgIGlmIChzaXplIDwgbU1heFNpemUpIHsKKyAgICAgICAgICAgIG1TaXplICs9IHNpemU7CisgICAgICAgICAgICBtQ2FjaGUucHV0KGVudHJ5LCB0ZXh0dXJlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHR1cmUtPmNsZWFudXAgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xlYW51cCBzaGFkb3cKKyAgICAgICAgZGVsZXRlW10gc2hhZG93LmltYWdlOworICAgIH0KKworICAgIHJldHVybiB0ZXh0dXJlOworfQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmggYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1RFWFRfRFJPUF9TSEFET1dfQ0FDSEVfSAorI2RlZmluZSBBTkRST0lEX1VJX1RFWFRfRFJPUF9TSEFET1dfQ0FDSEVfSAorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDxTa1BhaW50Lmg+CisKKyNpbmNsdWRlICJHZW5lcmF0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJGb250UmVuZGVyZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworc3RydWN0IFNoYWRvd1RleHQgeworICAgIFNoYWRvd1RleHQoKSB7CisgICAgICAgIHRleHQgPSBOVUxMOworICAgIH0KKworICAgIFNoYWRvd1RleHQoU2tQYWludCogcGFpbnQsIHVpbnQzMl90IHJhZGl1cywgdWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBzcmNUZXh0KToKKyAgICAgICAgICAgIHJhZGl1cyhyYWRpdXMpLCBsZW4obGVuKSB7CisgICAgICAgIHRleHQgPSBuZXcgY2hhcltsZW5dOworICAgICAgICBtZW1jcHkodGV4dCwgc3JjVGV4dCwgbGVuKTsKKworICAgICAgICB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOworICAgICAgICB0eXBlZmFjZSA9IHBhaW50LT5nZXRUeXBlZmFjZSgpOworCisgICAgICAgIGhhc2ggPSAwOworICAgICAgICB1aW50MzJfdCBtdWx0aXBsaWVyID0gMTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBoYXNoICs9IHRleHRbaV0gKiBtdWx0aXBsaWVyOworICAgICAgICAgICAgdWludDMyX3Qgc2hpZnRlZCA9IG11bHRpcGxpZXIgPDwgNTsKKyAgICAgICAgICAgIG11bHRpcGxpZXIgPSBzaGlmdGVkIC0gbXVsdGlwbGllcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNoYWRvd1RleHQoY29uc3QgU2hhZG93VGV4dCYgc2hhZG93KToKKyAgICAgICAgICAgIHJhZGl1cyhzaGFkb3cucmFkaXVzKSwgbGVuKHNoYWRvdy5sZW4pLCBoYXNoKHNoYWRvdy5oYXNoKSwKKyAgICAgICAgICAgIHRleHRTaXplKHNoYWRvdy50ZXh0U2l6ZSksIHR5cGVmYWNlKHNoYWRvdy50eXBlZmFjZSkgeworICAgICAgICB0ZXh0ID0gbmV3IGNoYXJbc2hhZG93Lmxlbl07CisgICAgICAgIG1lbWNweSh0ZXh0LCBzaGFkb3cudGV4dCwgc2hhZG93Lmxlbik7CisgICAgfQorCisgICAgflNoYWRvd1RleHQoKSB7CisgICAgICAgIGRlbGV0ZVtdIHRleHQ7CisgICAgfQorCisgICAgdWludDMyX3QgcmFkaXVzOworICAgIHVpbnQzMl90IGxlbjsKKyAgICB1aW50MzJfdCBoYXNoOworICAgIGZsb2F0IHRleHRTaXplOworICAgIFNrVHlwZWZhY2UqIHR5cGVmYWNlOworICAgIGNoYXIgKnRleHQ7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBTaGFkb3dUZXh0JiByaHMpIGNvbnN0IHsKKyAgICAgICAgaWYgKGhhc2ggPCByaHMuaGFzaCkgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgaWYgKGhhc2ggPT0gcmhzLmhhc2gpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPCByaHMubGVuKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSByaHMubGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhZGl1cyA8IHJocy5yYWRpdXMpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhZGl1cyA9PSByaHMucmFkaXVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8IHJocy50ZXh0U2l6ZSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTaXplID09IHJocy50ZXh0U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVmYWNlIDwgcmhzLnR5cGVmYWNlKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVmYWNlID09IHJocy50eXBlZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJuY21wKHRleHQsIHJocy50ZXh0LCBsZW4pIDwgMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsgLy8gc3RydWN0IFNoYWRvd1RleHQKKworLyoqCisgKiBBbHBoYSB0ZXh0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgc2hhZG93LgorICovCitzdHJ1Y3QgU2hhZG93VGV4dHVyZTogcHVibGljIFRleHR1cmUgeworICAgIFNoYWRvd1RleHR1cmUoKTogVGV4dHVyZSgpIHsKKyAgICB9CisKKyAgICBmbG9hdCBsZWZ0OworICAgIGZsb2F0IHRvcDsKK307IC8vIHN0cnVjdCBTaGFkb3dUZXh0dXJlCisKK2NsYXNzIFRleHREcm9wU2hhZG93Q2FjaGU6IHB1YmxpYyBPbkVudHJ5UmVtb3ZlZDxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj4geworcHVibGljOgorICAgIFRleHREcm9wU2hhZG93Q2FjaGUoKTsKKyAgICBUZXh0RHJvcFNoYWRvd0NhY2hlKHVpbnQzMl90IG1heEJ5dGVTaXplKTsKKyAgICB+VGV4dERyb3BTaGFkb3dDYWNoZSgpOworCisgICAgLyoqCisgICAgICogVXNlZCBhcyBhIGNhbGxiYWNrIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgKiBEbyBub3QgaW52b2tlIGRpcmVjdGx5LgorICAgICAqLworICAgIHZvaWQgb3BlcmF0b3IoKShTaGFkb3dUZXh0JiB0ZXh0LCBTaGFkb3dUZXh0dXJlKiYgdGV4dHVyZSk7CisKKyAgICBTaGFkb3dUZXh0dXJlKiBnZXQoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIqIHRleHQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIHVpbnQzMl90IHJhZGl1cyk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICB2b2lkIHNldEZvbnRSZW5kZXJlcihGb250UmVuZGVyZXImIGZvbnRSZW5kZXJlcikgeworICAgICAgICBtUmVuZGVyZXIgPSAmZm9udFJlbmRlcmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0TWF4U2l6ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgY2FjaGUgaW4gYnl0ZXMuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2l6ZSgpOworCitwcml2YXRlOgorICAgIEdlbmVyYXRpb25DYWNoZTxTaGFkb3dUZXh0LCBTaGFkb3dUZXh0dXJlKj4gbUNhY2hlOworCisgICAgdWludDMyX3QgbVNpemU7CisgICAgdWludDMyX3QgbU1heFNpemU7CisgICAgRm9udFJlbmRlcmVyKiBtUmVuZGVyZXI7Cit9OyAvLyBjbGFzcyBUZXh0RHJvcFNoYWRvd0NhY2hlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUX0RST1BfU0hBRE9XX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0dXJlLmggYi9saWJzL2h3dWkvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2YxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2h3dWkvVGV4dHVyZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVUlfVEVYVFVSRV9ICisjZGVmaW5lIEFORFJPSURfVUlfVEVYVFVSRV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gT3BlbkdMIHRleHR1cmUuCisgKi8KK3N0cnVjdCBUZXh0dXJlIHsKKyAgICBUZXh0dXJlKCkgeworICAgICAgICBjbGVhbnVwID0gZmFsc2U7CisgICAgICAgIGJpdG1hcFNpemUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHRleHR1cmUuCisgICAgICovCisgICAgR0x1aW50IGlkOworICAgIC8qKgorICAgICAqIEdlbmVyYXRpb24gb2YgdGhlIGJhY2tpbmcgYml0bWFwLAorICAgICAqLworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHR1cmUgcmVxdWlyZXMgYmxlbmRpbmcuCisgICAgICovCisgICAgYm9vbCBibGVuZDsKKyAgICAvKioKKyAgICAgKiBXaWR0aCBvZiB0aGUgYmFja2luZyBiaXRtYXAuCisgICAgICovCisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSBiYWNraW5nIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0ZXh0dXJlIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFmdGVyIHVzZS4KKyAgICAgKi8KKyAgICBib29sIGNsZWFudXA7CisgICAgLyoqCisgICAgICogT3B0aW9uYWwsIHNpemUgb2YgdGhlIG9yaWdpbmFsIGJpdG1hcC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBiaXRtYXBTaXplOworfTsgLy8gc3RydWN0IFRleHR1cmUKKworY2xhc3MgQXV0b1RleHR1cmUgeworcHVibGljOgorICAgIEF1dG9UZXh0dXJlKGNvbnN0IFRleHR1cmUqIHRleHR1cmUpOiBtVGV4dHVyZSh0ZXh0dXJlKSB7IH0KKyAgICB+QXV0b1RleHR1cmUoKSB7CisgICAgICAgIGlmIChtVGV4dHVyZSAmJiBtVGV4dHVyZS0+Y2xlYW51cCkgeworICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmUtPmlkKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtVGV4dHVyZTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBUZXh0dXJlKiBtVGV4dHVyZTsKK307IC8vIGNsYXNzIEF1dG9UZXh0dXJlCisKK307IC8vIG5hbWVzcGFjZSB1aXJlbmRlcmVyCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9VSV9URVhUVVJFX0gKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwIGIvbGlicy9od3VpL1RleHR1cmVDYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MDcwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJPcGVuR0xSZW5kZXJlciIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCisjaW5jbHVkZSAiVGV4dHVyZUNhY2hlLmgiCisjaW5jbHVkZSAiUHJvcGVydGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdWlyZW5kZXJlciB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHR1cmVDYWNoZTo6VGV4dHVyZUNhY2hlKCk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShNQihERUZBVUxUX1RFWFRVUkVfQ0FDSEVfU0laRSkpIHsKKyAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldChQUk9QRVJUWV9URVhUVVJFX0NBQ0hFX1NJWkUsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKKyAgICAgICAgTE9HRCgiICBTZXR0aW5nIHRleHR1cmUgY2FjaGUgc2l6ZSB0byAlc01CIiwgcHJvcGVydHkpOworICAgICAgICBzZXRNYXhTaXplKE1CKGF0b2YocHJvcGVydHkpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiICBVc2luZyBkZWZhdWx0IHRleHR1cmUgY2FjaGUgc2l6ZSBvZiAlLjJmTUIiLCBERUZBVUxUX1RFWFRVUkVfQ0FDSEVfU0laRSk7CisgICAgfQorCisgICAgaW5pdCgpOworfQorCitUZXh0dXJlQ2FjaGU6OlRleHR1cmVDYWNoZSh1aW50MzJfdCBtYXhCeXRlU2l6ZSk6CisgICAgICAgIG1DYWNoZShHZW5lcmF0aW9uQ2FjaGU8U2tCaXRtYXAqLCBUZXh0dXJlKj46OmtVbmxpbWl0ZWRDYXBhY2l0eSksCisgICAgICAgIG1TaXplKDApLCBtTWF4U2l6ZShtYXhCeXRlU2l6ZSkgeworICAgIGluaXQoKTsKK30KKworVGV4dHVyZUNhY2hlOjp+VGV4dHVyZUNhY2hlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjppbml0KCkgeworICAgIG1DYWNoZS5zZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKHRoaXMpOworCisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbU1heFRleHR1cmVTaXplKTsKKyAgICBMT0dEKCIgICAgTWF4aW11bSB0ZXh0dXJlIGRpbWVuc2lvbiBpcyAlZCBwaXhlbHMiLCBtTWF4VGV4dHVyZVNpemUpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaXplIG1hbmFnZW1lbnQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDMyX3QgVGV4dHVyZUNhY2hlOjpnZXRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TaXplOworfQorCit1aW50MzJfdCBUZXh0dXJlQ2FjaGU6OmdldE1heFNpemUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbU1heFNpemU7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpzZXRNYXhTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1NYXhTaXplID0gbWF4U2l6ZTsKKyAgICB3aGlsZSAobVNpemUgPiBtTWF4U2l6ZSkgeworICAgICAgICBtQ2FjaGUucmVtb3ZlT2xkZXN0KCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWxsYmFja3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBUZXh0dXJlQ2FjaGU6Om9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKSB7CisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBhbHJlYWR5IGxvY2tlZAorICAgIGlmICh0ZXh0dXJlKSB7CisgICAgICAgIG1TaXplIC09IHRleHR1cmUtPmJpdG1hcFNpemU7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUtPmlkKTsKKyAgICAgICAgZGVsZXRlIHRleHR1cmU7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoaW5nCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RleHR1cmUqIFRleHR1cmVDYWNoZTo6Z2V0KFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgVGV4dHVyZSogdGV4dHVyZSA9IG1DYWNoZS5nZXQoYml0bWFwKTsKKyAgICBtTG9jay51bmxvY2soKTsKKworICAgIGlmICghdGV4dHVyZSkgeworICAgICAgICBpZiAoYml0bWFwLT53aWR0aCgpID4gbU1heFRleHR1cmVTaXplIHx8IGJpdG1hcC0+aGVpZ2h0KCkgPiBtTWF4VGV4dHVyZVNpemUpIHsKKyAgICAgICAgICAgIExPR1coIkJpdG1hcCB0b28gbGFyZ2UgdG8gYmUgdXBsb2FkZWQgaW50byBhIHRleHR1cmUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGJpdG1hcC0+cm93Qnl0ZXMoKSAqIGJpdG1hcC0+aGVpZ2h0KCk7CisgICAgICAgIC8vIERvbid0IGV2ZW4gdHJ5IHRvIGNhY2hlIGEgYml0bWFwIHRoYXQncyBiaWdnZXIgdGhhbiB0aGUgY2FjaGUKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgd2hpbGUgKG1TaXplICsgc2l6ZSA+IG1NYXhTaXplKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLnJlbW92ZU9sZGVzdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CisgICAgICAgIHRleHR1cmUtPmJpdG1hcFNpemUgPSBzaXplOworICAgICAgICBnZW5lcmF0ZVRleHR1cmUoYml0bWFwLCB0ZXh0dXJlLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgeworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgbVNpemUgKz0gc2l6ZTsKKyAgICAgICAgICAgIG1DYWNoZS5wdXQoYml0bWFwLCB0ZXh0dXJlKTsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGV4dHVyZS0+Y2xlYW51cCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJpdG1hcC0+Z2V0R2VuZXJhdGlvbklEKCkgIT0gdGV4dHVyZS0+Z2VuZXJhdGlvbikgeworICAgICAgICBnZW5lcmF0ZVRleHR1cmUoYml0bWFwLCB0ZXh0dXJlLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGV4dHVyZTsKK30KKwordm9pZCBUZXh0dXJlQ2FjaGU6OnJlbW92ZShTa0JpdG1hcCogYml0bWFwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ2FjaGUucmVtb3ZlKGJpdG1hcCk7Cit9CisKK3ZvaWQgVGV4dHVyZUNhY2hlOjpjbGVhcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWNoZS5jbGVhcigpOworfQorCit2b2lkIFRleHR1cmVDYWNoZTo6Z2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUsIGJvb2wgcmVnZW5lcmF0ZSkgeworICAgIFNrQXV0b0xvY2tQaXhlbHMgYWxwKCpiaXRtYXApOworCisgICAgaWYgKCFiaXRtYXAtPnJlYWR5VG9EcmF3KCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdlbmVyYXRlIHRleHR1cmUgZnJvbSBiaXRtYXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghcmVnZW5lcmF0ZSkgeworICAgICAgICB0ZXh0dXJlLT5nZW5lcmF0aW9uID0gYml0bWFwLT5nZXRHZW5lcmF0aW9uSUQoKTsKKyAgICAgICAgdGV4dHVyZS0+d2lkdGggPSBiaXRtYXAtPndpZHRoKCk7CisgICAgICAgIHRleHR1cmUtPmhlaWdodCA9IGJpdG1hcC0+aGVpZ2h0KCk7CisKKyAgICAgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZS0+aWQpOworICAgIH0KKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZS0+aWQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgYml0bWFwLT5ieXRlc1BlclBpeGVsKCkpOworCisgICAgc3dpdGNoIChiaXRtYXAtPmdldENvbmZpZygpKSB7CisgICAgY2FzZSBTa0JpdG1hcDo6a0E4X0NvbmZpZzoKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSB0cnVlOworICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfQUxQSEEsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIGJpdG1hcC0+Z2V0UGl4ZWxzKCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNrQml0bWFwOjprUkdCXzU2NV9Db25maWc6CisgICAgICAgIHRleHR1cmUtPmJsZW5kID0gZmFsc2U7CisgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIGJpdG1hcC0+cm93Qnl0ZXNBc1BpeGVscygpLCB0ZXh0dXJlLT5oZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgorICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgYml0bWFwLT5yb3dCeXRlc0FzUGl4ZWxzKCksIHRleHR1cmUtPmhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBiaXRtYXAtPmdldFBpeGVscygpKTsKKyAgICAgICAgLy8gRG8gdGhpcyBhZnRlciBjYWxsaW5nIGdldFBpeGVscygpIHRvIG1ha2Ugc3VyZSBTa2lhJ3MgZGVmZXJyZWQKKyAgICAgICAgLy8gZGVjb2RpbmcgaGFwcGVuZWQKKyAgICAgICAgdGV4dHVyZS0+YmxlbmQgPSAhYml0bWFwLT5pc09wYXF1ZSgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJVbnN1cHBvcnRlZCBiaXRtYXAgY29uZmlnIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHVpcmVuZGVyZXIKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmggYi9saWJzL2h3dWkvVGV4dHVyZUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzNzg5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9UZXh0dXJlQ2FjaGUuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9VSV9URVhUVVJFX0NBQ0hFX0gKKworI2luY2x1ZGUgPFNrQml0bWFwLmg+CisKKyNpbmNsdWRlICJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR2VuZXJhdGlvbkNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1aXJlbmRlcmVyIHsKKworLyoqCisgKiBBIHNpbXBsZSBMUlUgdGV4dHVyZSBjYWNoZS4gVGhlIGNhY2hlIGhhcyBhIG1heGltdW0gc2l6ZSBleHByZXNzZWQgaW4gYnl0ZXMuCisgKiBBbnkgdGV4dHVyZSBhZGRlZCB0byB0aGUgY2FjaGUgY2F1c2luZyB0aGUgY2FjaGUgdG8gZ3JvdyBiZXlvbmQgdGhlIG1heGltdW0KKyAqIGFsbG93ZWQgc2l6ZSB3aWxsIGFsc28gY2F1c2UgdGhlIG9sZGVzdCB0ZXh0dXJlIHRvIGJlIGtpY2tlZCBvdXQuCisgKi8KK2NsYXNzIFRleHR1cmVDYWNoZTogcHVibGljIE9uRW50cnlSZW1vdmVkPFNrQml0bWFwKiwgVGV4dHVyZSo+IHsKK3B1YmxpYzoKKyAgICBUZXh0dXJlQ2FjaGUoKTsKKyAgICBUZXh0dXJlQ2FjaGUodWludDMyX3QgbWF4Qnl0ZVNpemUpOworICAgIH5UZXh0dXJlQ2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBjYWxsYmFjayB3aGVuIGFuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICogRG8gbm90IGludm9rZSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICB2b2lkIG9wZXJhdG9yKCkoU2tCaXRtYXAqJiBiaXRtYXAsIFRleHR1cmUqJiB0ZXh0dXJlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYml0bWFwLiBJZiB0aGUgdGV4dHVyZQorICAgICAqIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY2FjaGUsIGEgbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIFRleHR1cmUqIGdldChTa0JpdG1hcCogYml0bWFwKTsKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSB0ZXh0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdG1hcC4gUmV0dXJucyBOVUxMCisgICAgICogaWYgdGhlIHRleHR1cmUgY2Fubm90IGJlIGZvdW5kLiBVcG9uIHJlbW92ZSB0aGUgdGV4dHVyZSBpcyBmcmVlZC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShTa0JpdG1hcCogYml0bWFwKTsKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGNhY2hlLiBUaGlzIGNhdXNlcyBhbGwgdGV4dHVyZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHZvaWQgc2V0TWF4U2l6ZSh1aW50MzJfdCBtYXhTaXplKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldE1heFNpemUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGNhY2hlIGluIGJ5dGVzLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFNpemUoKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIHRleHR1cmUgZnJvbSBhIGJpdG1hcCBpbnRvIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVnZW5lcmF0ZSBJZiB0cnVlLCB0aGUgYml0bWFwIGRhdGEgaXMgcmV1cGxvYWRlZCBpbnRvIHRoZSB0ZXh0dXJlLCBidXQKKyAgICAgKiAgICAgICAgbm8gbmV3IHRleHR1cmUgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVUZXh0dXJlKFNrQml0bWFwKiBiaXRtYXAsIFRleHR1cmUqIHRleHR1cmUsIGJvb2wgcmVnZW5lcmF0ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgaW5pdCgpOworCisgICAgR2VuZXJhdGlvbkNhY2hlPFNrQml0bWFwKiwgVGV4dHVyZSo+IG1DYWNoZTsKKworICAgIHVpbnQzMl90IG1TaXplOworICAgIHVpbnQzMl90IG1NYXhTaXplOworICAgIEdMaW50IG1NYXhUZXh0dXJlU2l6ZTsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gYWNjZXNzIG1DYWNoZSBhbmQgbVNpemUuIEFsbCBtZXRob2RzIGFyZSBhY2Nlc3NlZCBmcm9tIGEgc2luZ2xlCisgICAgICogdGhyZWFkIGV4Y2VwdCBmb3IgcmVtb3ZlKCkuCisgICAgICovCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKK307IC8vIGNsYXNzIFRleHR1cmVDYWNoZQorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVEVYVFVSRV9DQUNIRV9ICmRpZmYgLS1naXQgYS9saWJzL2h3dWkvVmVydGV4LmggYi9saWJzL2h3dWkvVmVydGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1NDA4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvaHd1aS9WZXJ0ZXguaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1VJX1ZFUlRFWF9ICisjZGVmaW5lIEFORFJPSURfVUlfVkVSVEVYX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVpcmVuZGVyZXIgeworCisvKioKKyAqIFNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2ZXJ0ZXggd2l0aCBhIHBvc2l0aW9uIGFuZCBhIHRleHR1cmUuCisgKi8KK3N0cnVjdCBUZXh0dXJlVmVydGV4IHsKKyAgICBmbG9hdCBwb3NpdGlvblsyXTsKKyAgICBmbG9hdCB0ZXh0dXJlWzJdOworCisgICAgc3RhdGljIGlubGluZSB2b2lkIHNldChUZXh0dXJlVmVydGV4KiB2ZXJ0ZXgsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHUsIGZsb2F0IHYpIHsKKyAgICAgICAgdmVydGV4WzBdLnBvc2l0aW9uWzBdID0geDsKKyAgICAgICAgdmVydGV4WzBdLnBvc2l0aW9uWzFdID0geTsKKyAgICAgICAgdmVydGV4WzBdLnRleHR1cmVbMF0gPSB1OworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVsxXSA9IHY7CisgICAgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIHNldFVWKFRleHR1cmVWZXJ0ZXgqIHZlcnRleCwgZmxvYXQgdSwgZmxvYXQgdikgeworICAgICAgICB2ZXJ0ZXhbMF0udGV4dHVyZVswXSA9IHU7CisgICAgICAgIHZlcnRleFswXS50ZXh0dXJlWzFdID0gdjsKKyAgICB9Cit9OyAvLyBzdHJ1Y3QgVGV4dHVyZVZlcnRleAorCit9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfVUlfVkVSVEVYX0gKZGlmZiAtLWdpdCBhL2xpYnMvcnMvQW5kcm9pZC5tayBiL2xpYnMvcnMvQW5kcm9pZC5tawppbmRleCA5ODQ2NGEwLi4zN2M0MThiIDEwMDY0NAotLS0gYS9saWJzL3JzL0FuZHJvaWQubWsKKysrIGIvbGlicy9ycy9BbmRyb2lkLm1rCkBAIC03NiwzNCArNzYsNDQgQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlyc0FkYXB0ZXIuY3BwIFwKIAlyc0FsbG9jYXRpb24uY3BwIFwKKwlyc0FuaW1hdGlvbi5jcHAgXAogCXJzQ29tcG9uZW50LmNwcCBcCiAJcnNDb250ZXh0LmNwcCBcCiAJcnNEZXZpY2UuY3BwIFwKIAlyc0VsZW1lbnQuY3BwIFwKLSAgICAgICAgcnNGaWxlQTNELmNwcCBcCisJcnNGaWxlQTNELmNwcCBcCisJcnNGb250LmNwcCBcCiAJcnNMaWdodC5jcHAgXAogCXJzTG9ja2xlc3NGaWZvLmNwcCBcCiAJcnNPYmplY3RCYXNlLmNwcCBcCiAJcnNNYXRyaXguY3BwIFwKLSAgICAgICAgcnNNZXNoLmNwcCBcCi0JcnNOb2lzZS5jcHAgXAorCXJzTWVzaC5jcHAgXAorCXJzTXV0ZXguY3BwIFwKIAlyc1Byb2dyYW0uY3BwIFwKIAlyc1Byb2dyYW1GcmFnbWVudC5jcHAgXAotCXJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwIFwKKwlyc1Byb2dyYW1TdG9yZS5jcHAgXAogCXJzUHJvZ3JhbVJhc3Rlci5jcHAgXAogCXJzUHJvZ3JhbVZlcnRleC5jcHAgXAogCXJzU2FtcGxlci5jcHAgXAogCXJzU2NyaXB0LmNwcCBcCiAJcnNTY3JpcHRDLmNwcCBcCiAJcnNTY3JpcHRDX0xpYi5jcHAgXAotICAgICAgICByc1NoYWRlckNhY2hlLmNwcCBcCi0JcnNTaW1wbGVNZXNoLmNwcCBcCisJcnNTY3JpcHRDX0xpYkNMLmNwcCBcCisJcnNTY3JpcHRDX0xpYkdMLmNwcCBcCisJcnNTaGFkZXJDYWNoZS5jcHAgXAorCXJzU2lnbmFsLmNwcCBcCisJcnNTdHJlYW0uY3BwIFwKIAlyc1RocmVhZElPLmNwcCBcCiAJcnNUeXBlLmNwcCBcCiAJcnNWZXJ0ZXhBcnJheS5jcHAKIAogCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYkdMRVN2MiBsaWJ1aSBsaWJhY2MKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYkVHTCBsaWJHTEVTdjFfQ00gbGliR0xFU3YyIGxpYnVpIGxpYmJjYworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ0MgorCitMT0NBTF9DX0lOQ0xVREVTICs9IGV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUKKwogTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCiBMT0NBTF9NT0RVTEU6PSBsaWJSUwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKZGlmZiAtLWdpdCBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmggYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCmluZGV4IGQyODBmNTAuLjc5MDJiOWEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKKysrIGIvbGlicy9ycy9SZW5kZXJTY3JpcHQuaApAQCAtMzAsMjAgKzMwLDIzIEBACiB0eXBlZGVmIHZvaWQgKiBSc0FkYXB0ZXIxRDsKIHR5cGVkZWYgdm9pZCAqIFJzQWRhcHRlcjJEOwogdHlwZWRlZiB2b2lkICogUnNBbGxvY2F0aW9uOwordHlwZWRlZiB2b2lkICogUnNBbmltYXRpb247CiB0eXBlZGVmIHZvaWQgKiBSc0NvbnRleHQ7CiB0eXBlZGVmIHZvaWQgKiBSc0RldmljZTsKIHR5cGVkZWYgdm9pZCAqIFJzRWxlbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzRmlsZTsKK3R5cGVkZWYgdm9pZCAqIFJzRm9udDsKIHR5cGVkZWYgdm9pZCAqIFJzU2FtcGxlcjsKIHR5cGVkZWYgdm9pZCAqIFJzU2NyaXB0OwotdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwordHlwZWRlZiB2b2lkICogUnNNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNMaWdodDsKK3R5cGVkZWYgdm9pZCAqIFJzT2JqZWN0QmFzZTsKIAogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtVmVydGV4OwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1SYXN0ZXI7CiAKIHR5cGVkZWYgdm9pZCAoKiBSc0JpdG1hcENhbGxiYWNrX3QpKHZvaWQgKik7CkBAIC02MCw3ICs2Myw2IEBACiBSc0NvbnRleHQgcnNDb250ZXh0Q3JlYXRlKFJzRGV2aWNlLCB1aW50MzJfdCB2ZXJzaW9uKTsKIFJzQ29udGV4dCByc0NvbnRleHRDcmVhdGVHTChSc0RldmljZSwgdWludDMyX3QgdmVyc2lvbiwgYm9vbCB1c2VEZXB0aCk7CiB2b2lkIHJzQ29udGV4dERlc3Ryb3koUnNDb250ZXh0KTsKLXZvaWQgcnNPYmpEZXN0cm95T09CKFJzQ29udGV4dCwgdm9pZCAqKTsKIAogdWludDMyX3QgcnNDb250ZXh0R2V0TWVzc2FnZShSc0NvbnRleHQsIHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KTsKIHZvaWQgcnNDb250ZXh0SW5pdFRvQ2xpZW50KFJzQ29udGV4dCk7CkBAIC04MywxMSArODUsMTcgQEAKICAgICBSU19UWVBFX1VOU0lHTkVEXzMyLAogICAgIFJTX1RZUEVfVU5TSUdORURfNjQsCiAKKyAgICBSU19UWVBFX0JPT0xFQU4sCisKICAgICBSU19UWVBFX1VOU0lHTkVEXzVfNl81LAogICAgIFJTX1RZUEVfVU5TSUdORURfNV81XzVfMSwKICAgICBSU19UWVBFX1VOU0lHTkVEXzRfNF80XzQsCiAKLSAgICBSU19UWVBFX0VMRU1FTlQsCisgICAgUlNfVFlQRV9NQVRSSVhfNFg0LAorICAgIFJTX1RZUEVfTUFUUklYXzNYMywKKyAgICBSU19UWVBFX01BVFJJWF8yWDIsCisKKyAgICBSU19UWVBFX0VMRU1FTlQgPSAxMDAwLAogICAgIFJTX1RZUEVfVFlQRSwKICAgICBSU19UWVBFX0FMTE9DQVRJT04sCiAgICAgUlNfVFlQRV9TQU1QTEVSLApAQCAtOTYsMjQgKzEwNCwxNyBAQAogICAgIFJTX1RZUEVfUFJPR1JBTV9GUkFHTUVOVCwKICAgICBSU19UWVBFX1BST0dSQU1fVkVSVEVYLAogICAgIFJTX1RZUEVfUFJPR1JBTV9SQVNURVIsCi0gICAgUlNfVFlQRV9QUk9HUkFNX1NUT1JFCisgICAgUlNfVFlQRV9QUk9HUkFNX1NUT1JFLAogfTsKIAogZW51bSBSc0RhdGFLaW5kIHsKICAgICBSU19LSU5EX1VTRVIsCi0gICAgUlNfS0lORF9DT0xPUiwKLSAgICBSU19LSU5EX1BPU0lUSU9OLAotICAgIFJTX0tJTkRfVEVYVFVSRSwKLSAgICBSU19LSU5EX05PUk1BTCwKLSAgICBSU19LSU5EX0lOREVYLAotICAgIFJTX0tJTkRfUE9JTlRfU0laRSwKIAotICAgIFJTX0tJTkRfUElYRUxfTCwKKyAgICBSU19LSU5EX1BJWEVMX0wgPSA3LAogICAgIFJTX0tJTkRfUElYRUxfQSwKICAgICBSU19LSU5EX1BJWEVMX0xBLAogICAgIFJTX0tJTkRfUElYRUxfUkdCLAogICAgIFJTX0tJTkRfUElYRUxfUkdCQSwKLQogfTsKIAogZW51bSBSc1NhbXBsZXJQYXJhbSB7CkBAIC0yMDUsOSArMjA2LDcxIEBACiBlbnVtIFJzRXJyb3IgewogICAgIFJTX0VSUk9SX05PTkUsCiAgICAgUlNfRVJST1JfQkFEX1NIQURFUiwKLSAgICBSU19FUlJPUl9CQURfU0NSSVBUCisgICAgUlNfRVJST1JfQkFEX1NDUklQVCwKKyAgICBSU19FUlJPUl9CQURfVkFMVUUsCisgICAgUlNfRVJST1JfT1VUX09GX01FTU9SWQogfTsKIAorZW51bSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24geworICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVAsCisgICAgUlNfQU5JTUFUSU9OX0lOVEVSUE9MQVRJT05fTElORUFSLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JFWklFUiwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9DQVJESU5BTCwKKyAgICBSU19BTklNQVRJT05fSU5URVJQT0xBVElPTl9IRVJNSVRFLAorICAgIFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX0JTUExJTkUKK307CisKK2VudW0gUnNBbmltYXRpb25FZGdlIHsKKyAgICBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ09OU1RBTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfR1JBRElFTlQsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfQ1lDTEUsCisgICAgUlNfQU5JTUFUSU9OX0VER0VfT1NDSUxMQVRFLAorICAgIFJTX0FOSU1BVElPTl9FREdFX0NZTEVfUkVMQVRJVkUKK307CisKK2VudW0gUnNBM0RDbGFzc0lEIHsKKyAgICBSU19BM0RfQ0xBU1NfSURfVU5LTk9XTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfTUVTSCwKKyAgICBSU19BM0RfQ0xBU1NfSURfVFlQRSwKKyAgICBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVCwKKyAgICBSU19BM0RfQ0xBU1NfSURfQUxMT0NBVElPTiwKKyAgICBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVgsCisgICAgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5ULAorICAgIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFLAorICAgIFJTX0EzRF9DTEFTU19JRF9TQU1QTEVSLAorICAgIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT04sCisgICAgUlNfQTNEX0NMQVNTX0lEX0xJR0hULAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFELAorICAgIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzJELAorICAgIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQworfTsKKworZW51bSBSc0N1bGxNb2RlIHsKKyAgICBSU19DVUxMX0JBQ0ssCisgICAgUlNfQ1VMTF9GUk9OVCwKKyAgICBSU19DVUxMX05PTkUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBSc0EzRENsYXNzSUQgY2xhc3NJRDsKKyAgICBjb25zdCBjaGFyKiBvYmplY3ROYW1lOworfSBSc0ZpbGVJbmRleEVudHJ5OworCisvLyBTY3JpcHQgdG8gU2NyaXB0Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKKworfSBSc1NjcmlwdENhbGw7CisKICNpZm5kZWYgTk9fUlNfRlVOQ1MKICNpbmNsdWRlICJyc2dBcGlGdW5jRGVjbC5oIgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oIGIvbGlicy9ycy9SZW5kZXJTY3JpcHRFbnYuaAppbmRleCA5OWI4YzA0Li45MjI1OTA0IDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdEVudi5oCisrKyBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0RW52LmgKQEAgLTksMTAgKzksMTAgQEAKIHR5cGVkZWYgdm9pZCAqIFJzRWxlbWVudDsKIHR5cGVkZWYgdm9pZCAqIFJzU2FtcGxlcjsKIHR5cGVkZWYgdm9pZCAqIFJzU2NyaXB0OwotdHlwZWRlZiB2b2lkICogUnNTaW1wbGVNZXNoOwordHlwZWRlZiB2b2lkICogUnNNZXNoOwogdHlwZWRlZiB2b2lkICogUnNUeXBlOwogdHlwZWRlZiB2b2lkICogUnNQcm9ncmFtRnJhZ21lbnQ7Ci10eXBlZGVmIHZvaWQgKiBSc1Byb2dyYW1GcmFnbWVudFN0b3JlOwordHlwZWRlZiB2b2lkICogUnNQcm9ncmFtU3RvcmU7CiB0eXBlZGVmIHZvaWQgKiBSc0xpZ2h0OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZlZDdlLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQotI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gRmlsbQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWJzL3JzL2phdmEvRmlsbS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWNlOGExLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5maWxtIj4KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iRmlsbSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkZpbG0iCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMS5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliOWJkYi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDIucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjJjODIuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDAzLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2UyNmMwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDUucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzUyNDguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA2LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjUxMjYxLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwNy5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDkzOC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDgucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc1ZTguLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AwOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDA5LnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzODc0Li4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMC5wbmcgYi9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODI3ZC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTEucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODlmNzEuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmMTZhNC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvZHJhd2FibGUvcDEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9kcmF3YWJsZS9wMTMucG5nIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOGJjYmUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL2RyYXdhYmxlL3AxMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jIGIvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NGM2OC4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9yZXMvcmF3L2ZpbG1pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChvcnRob1dpbmRvdykKLSNwcmFnbWEgc3RhdGVSYXN0ZXIoZmxhdCkKLSNwcmFnbWEgc3RhdGVGcmFnbWVudChQZ21GcmFnQmFja2dyb3VuZCkKLSNwcmFnbWEgc3RhdGVTdG9yZShNeUJsZW5kKQotCi0KLWludCBtYWluKHZvaWQqIGNvbiwgaW50IGZ0LCBpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY291bnQsIHRvdWNoLCB4LCB5LCByYXRlLCBtYXhMaWZlLCBsaWZlU2hpZnQ7Ci0gICAgaW50IGxpZmU7Ci0gICAgaW50IGN0LCBjdDI7Ci0gICAgaW50IG5ld1BhcnQ7Ci0gICAgaW50IGRyYXdDb3VudDsKLSAgICBpbnQgZHgsIGR5LCBpZHg7Ci0gICAgaW50IHBvc3gscG9zeTsKLSAgICBpbnQgYzsKLSAgICBpbnQgc3JjSWR4OwotICAgIGludCBkc3RJZHg7Ci0KLSAgICBjb3VudCA9IGxvYWRJMzIoY29uLCAwLCAxKTsKLSAgICB0b3VjaCA9IGxvYWRJMzIoY29uLCAwLCAyKTsKLSAgICB4ID0gbG9hZEkzMihjb24sIDAsIDMpOwotICAgIHkgPSBsb2FkSTMyKGNvbiwgMCwgNCk7Ci0KLSAgICByYXRlID0gNDsKLSAgICBtYXhMaWZlID0gKGNvdW50IC8gcmF0ZSkgLSAxOwotICAgIGxpZmVTaGlmdCA9IDA7Ci0gICAgewotICAgICAgICBsaWZlID0gbWF4TGlmZTsKLSAgICAgICAgd2hpbGUgKGxpZmUgPiAyNTUpIHsKLSAgICAgICAgICAgIGxpZmUgPSBsaWZlID4+IDE7Ci0gICAgICAgICAgICBsaWZlU2hpZnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkcmF3UmVjdChjb24sIDAsIDI1NiwgMCwgNTEyKTsKLSAgICBjb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChjb24sIE5BTUVEX1BnbUZyYWdQYXJ0cyk7Ci0KLSAgICBpZiAodG91Y2gpIHsKLSAgICAgICAgbmV3UGFydCA9IGxvYWRJMzIoY29uLCAyLCAwKTsKLSAgICAgICAgZm9yIChjdDI9MDsgY3QyPHJhdGU7IGN0MisrKSB7Ci0gICAgICAgICAgICBkeCA9IHNjcmlwdFJhbmQoY29uLCAweDEwMDAwKSAtIDB4ODAwMDsKLSAgICAgICAgICAgIGR5ID0gc2NyaXB0UmFuZChjb24sIDB4MTAwMDApIC0gMHg4MDAwOwotCi0gICAgICAgICAgICBpZHggPSBuZXdQYXJ0ICogNSArIDE7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCwgZHgpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAxLCBkeSk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIGlkeCArIDIsIG1heExpZmUpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBpZHggKyAzLCB4IDw8IDE2KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgaWR4ICsgNCwgeSA8PCAxNik7Ci0KLSAgICAgICAgICAgIG5ld1BhcnQrKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RvcmVJMzIoY29uLCAyLCAwLCBuZXdQYXJ0KTsKLSAgICB9Ci0KLSAgICBkcmF3Q291bnQgPSAwOwotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBzcmNJZHggPSBjdCAqIDUgKyAxOwotCi0gICAgICAgIGR4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCk7Ci0gICAgICAgIGR5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDEpOwotICAgICAgICBsaWZlID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDIpOwotICAgICAgICBwb3N4ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDMpOwotICAgICAgICBwb3N5ID0gbG9hZEkzMihjb24sIDIsIHNyY0lkeCArIDQpOwotCi0gICAgICAgIGlmIChsaWZlKSB7Ci0gICAgICAgICAgICBpZiAocG9zeSA8ICg0ODAgPDwgMTYpKSB7Ci0gICAgICAgICAgICAgICAgZHN0SWR4ID0gZHJhd0NvdW50ICogOTsKLSAgICAgICAgICAgICAgICBjID0gMHhmZmFmY2YgfCAoKGxpZmUgPj4gbGlmZVNoaWZ0KSA8PCAyNCk7Ci0KLSAgICAgICAgICAgICAgICBzdG9yZVUzMihjb24sIDEsIGRzdElkeCwgYyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAxLCBkc3RJZHggKyAxLCBwb3N4KTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDIsIHBvc3kpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyAzLCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDQsIHBvc3ggKyAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDUsIHBvc3kgKyBkeSAqIDQpOwotCi0gICAgICAgICAgICAgICAgc3RvcmVVMzIoY29uLCAxLCBkc3RJZHggKyA2LCBjKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDcsIHBvc3ggLSAweDEwMDAwKTsKLSAgICAgICAgICAgICAgICBzdG9yZUkzMihjb24sIDEsIGRzdElkeCArIDgsIHBvc3kgKyBkeSAqIDQpOwotICAgICAgICAgICAgICAgIGRyYXdDb3VudCArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR5ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkeSA9ICgtZHkpID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3N4ID0gcG9zeCArIGR4OwotICAgICAgICAgICAgcG9zeSA9IHBvc3kgKyBkeTsKLSAgICAgICAgICAgIGR5ID0gZHkgKyAweDQwMDsKLSAgICAgICAgICAgIGxpZmUgLS07Ci0KLSAgICAgICAgICAgIC8vc3RvcmVJMzIoY29uLCAyLCBzcmNJZHgsIGR4KTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMSwgZHkpOwotICAgICAgICAgICAgc3RvcmVJMzIoY29uLCAyLCBzcmNJZHggKyAyLCBsaWZlKTsKLSAgICAgICAgICAgIHN0b3JlSTMyKGNvbiwgMiwgc3JjSWR4ICsgMywgcG9zeCk7Ci0gICAgICAgICAgICBzdG9yZUkzMihjb24sIDIsIHNyY0lkeCArIDQsIHBvc3kpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZHJhd1RyaWFuZ2xlQXJyYXkoY29uLCBOQU1FRF9QYXJ0QnVmZmVyLCBkcmF3Q291bnQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYyBiL2xpYnMvcnMvamF2YS9GaWxtL3Jlcy9yYXcvZmlsbXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzU2NzUuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vcmVzL3Jhdy9maWxtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0KLSNwcmFnbWEgdmVyc2lvbigxKQotI3ByYWdtYSBzdGF0ZVZlcnRleChQVkJhY2tncm91bmQpCi0jcHJhZ21hIHN0YXRlRnJhZ21lbnQoUEZCYWNrZ3JvdW5kKQotI3ByYWdtYSBzdGF0ZVN0b3JlKFBTQmFja2dyb3VuZCkKLQotI2RlZmluZSBTVEFURV9UUklBTkdMRV9PRkZTRVRfQ09VTlQgMAotI2RlZmluZSBTVEFURV9MQVNUX0ZPQ1VTIDEKLQotCi0vLyBUaGUgc2NyaXB0IGVudmlyb21lbnQgaGFzIDMgZW52IGFsbG9jYXRpb25zLgotLy8gYmFuazA6IChyKSBUaGUgZW52aXJvbWVudCBzdHJ1Y3R1cmUKLS8vIGJhbmsxOiAocikgVGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uCi0vLyBiYW5rMjogKHJ3KSBUaGUgdGVtcG9yYXJ5IHRleHR1cmUgc3RhdGUKLQotaW50IGxhc3RGb2N1czsKLQotaW50IG1haW4oaW50IGluZGV4KQotewotICAgIGZsb2F0IG1hdDFbMTZdOwotCi0gICAgZmxvYXQgdHJhbnMgPSBQb3MtPnRyYW5zbGF0ZTsKLSAgICBmbG9hdCByb3QgPSBQb3MtPnJvdGF0ZTsKLQotICAgIG1hdHJpeExvYWRTY2FsZShtYXQxLCAyLmYsIDIuZiwgMi5mKTsKLSAgICBtYXRyaXhUcmFuc2xhdGUobWF0MSwgMC5mLCAwLmYsIHRyYW5zKTsKLSAgICBtYXRyaXhSb3RhdGUobWF0MSwgOTAuZiwgMC5mLCAwLmYsIDEuZik7Ci0gICAgbWF0cml4Um90YXRlKG1hdDEsIHJvdCwgMS5mLCAwLmYsIDAuZik7Ci0gICAgdnBMb2FkTW9kZWxNYXRyaXgobWF0MSk7Ci0KLSAgICAvLyBEcmF3IHRoZSBsaWdodGluZyBlZmZlY3QgaW4gdGhlIHN0cmlwIGFuZCBmaWxsIHRoZSBaIGJ1ZmZlci4KLSAgICBkcmF3U2ltcGxlTWVzaChOQU1FRF9tZXNoKTsKLQotICAgIC8vIFN0YXJ0IG9mIGltYWdlcy4KLSAgICBiaW5kUHJvZ3JhbVN0b3JlKE5BTUVEX1BTSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbUZyYWdtZW50KE5BTUVEX1BGSW1hZ2VzKTsKLSAgICBiaW5kUHJvZ3JhbVZlcnRleChOQU1FRF9QVkltYWdlcyk7Ci0KLSAgICBmbG9hdCBmb2N1c1BvcyA9IFBvcy0+Zm9jdXM7Ci0gICAgaW50IGZvY3VzSUQgPSAwOwotICAgIGludCBsYXN0Rm9jdXNJRCA9IGxvYWRJMzIoMiwgU1RBVEVfTEFTVF9GT0NVUyk7Ci0gICAgaW50IGltZ0NvdW50ID0gMTM7Ci0KLSAgICBpZiAodHJhbnMgPiAoLS4zZikpIHsKLSAgICAgICAgZm9jdXNJRCA9IC0xLjBmIC0gZm9jdXNQb3M7Ci0gICAgICAgIGlmIChmb2N1c0lEID49IGltZ0NvdW50KSB7Ci0gICAgICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb2N1c0lEID0gLTE7Ci0gICAgfQotCi0gICAgLyoKLSAgICBpZiAoZm9jdXNJRCAhPSBsYXN0Rm9jdXNJRCkgewotICAgICAgICBpZiAobGFzdEZvY3VzSUQgPj0gMCkgewotICAgICAgICAgICAgdXBsb2FkVG9UZXh0dXJlKGNvbiwgZW52LT50ZXhbbGFzdEZvY3VzSURdLCAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9jdXNJRCA+PSAwKSB7Ci0gICAgICAgICAgICB1cGxvYWRUb1RleHR1cmUoY29uLCBlbnYtPnRleFtmb2N1c0lEXSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICBsYXN0Rm9jdXMgPSBmb2N1c0lEOwotCi0gICAgaW50IHRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gUG9zLT50cmlhbmdsZU9mZnNldENvdW50OwotCi0gICAgaW50IGltZ0lkID0gMDsKLSAgICBmb3IgKGltZ0lkPTE7IGltZ0lkIDw9IGltZ0NvdW50OyBpbWdJZCsrKSB7Ci0gICAgICAgIGZsb2F0IHBvcyA9IGZvY3VzUG9zICsgaW1nSWQgKyAwLjRmOwotICAgICAgICBpbnQgb2Zmc2V0ID0gKGludClmbG9vcmYocG9zICogMi5mKTsKLSAgICAgICAgcG9zID0gcG9zIC0gMC43NWY7Ci0KLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgdHJpYW5nbGVPZmZzZXRzQ291bnQgLyAyOwotICAgICAgICBpZiAoISgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSB0cmlhbmdsZU9mZnNldHNDb3VudCkpKSB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBvZmZzZXQgLTI7Ci0gICAgICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmQgPj0gdHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBlbmQgPSB0cmlhbmdsZU9mZnNldHNDb3VudC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiaW5kVGV4dHVyZShOQU1FRF9QRkltYWdlcywgMCwgbG9hZEkzMigwLCBpbWdJZCAtIDEpKTsKLSAgICAgICAgICAgIG1hdHJpeExvYWRUcmFuc2xhdGUobWF0MSwgLXBvcyAtIGxvYWRGKDUsIHRyaWFuZ2xlT2Zmc2V0c0NvdW50IC8gMiksIDAsIDApOwotICAgICAgICAgICAgdnBMb2FkVGV4dHVyZU1hdHJpeChtYXQxKTsKLSAgICAgICAgICAgIGRyYXdTaW1wbGVNZXNoUmFuZ2UoTkFNRURfbWVzaCwgbG9hZEkzMig0LCBzdGFydCksIChsb2FkSTMyKDQsIGVuZCkgLSBsb2FkSTMyKDQsIHN0YXJ0KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEgYi9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTk4MTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgRmlsbSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAvL0V2ZW50TGlzdGVuZXIgbUxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gImxpYlJTX2puaSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyAgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19FTkFCTEVEID0gREVCVUcgPyBDb25maWcuTE9HRCA6IENvbmZpZy5MT0dWOwotCi0gICAgcHJpdmF0ZSBGaWxtVmlldyBtVmlldzsKLQotICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCi0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCi0gICAgICAgIC8vIEFjdGl2aXR5Ci0gICAgICAgIG1WaWV3ID0gbmV3IEZpbG1WaWV3KHRoaXMpOwotICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCi0gICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cwotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLQotICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGl0KDApOwotICAgIH0KLQotCi0gICAgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChMT0dfRU5BQkxFRCkgewotICAgICAgICAgICAgTG9nLnYoTE9HX1RBRywgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtUlMuamF2YSBiL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA0NTAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1SUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOwotCi1wdWJsaWMgY2xhc3MgRmlsbVJTIHsKLSAgICBjbGFzcyBTdHJpcFBvc2l0aW9uIHsKLSAgICAgICAgcHVibGljIGZsb2F0IHRyYW5zbGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IHJvdGF0ZTsKLSAgICAgICAgcHVibGljIGZsb2F0IGZvY3VzOwotICAgICAgICBwdWJsaWMgaW50IHRyaWFuZ2xlT2Zmc2V0Q291bnQ7Ci0gICAgfQotICAgIFN0cmlwUG9zaXRpb24gbVBvcyA9IG5ldyBTdHJpcFBvc2l0aW9uKCk7Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOwotCi0gICAgcHVibGljIEZpbG1SUygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgbVJTID0gcnM7Ci0gICAgICAgIG1SZXMgPSByZXM7Ci0gICAgICAgIGluaXRSUygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbG1TdHJpcFBvc2l0aW9uKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmICh4IDwgNTApIHsKLSAgICAgICAgICAgIHggPSA1MDsKLSAgICAgICAgfQotICAgICAgICBpZiAoeCA+IDI3MCkgewotICAgICAgICAgICAgeCA9IDI3MDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGFuaW0gPSAoKGZsb2F0KXgtNTApIC8gMjcwLmY7Ci0gICAgICAgIG1Qb3MudHJhbnNsYXRlID0gMmYgKiBhbmltICsgMC41ZjsgICAvLyB0cmFuc2xhdGlvbgotICAgICAgICBtUG9zLnJvdGF0ZSA9IChhbmltICogNDApOyAgLy8gcm90YXRpb24KLSAgICAgICAgbVBvcy5mb2N1cyA9ICgoZmxvYXQpeSkgLyAxNi5mIC0gMTAuZjsgIC8vIGZvY3VzUG9zCi0gICAgICAgIG1Qb3MudHJpYW5nbGVPZmZzZXRDb3VudCA9IG1GU00ubVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotICAgICAgICBtQWxsb2NQb3MuZGF0YShtUG9zKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7Ci0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBTY3JpcHQgbVNjcmlwdFN0cmlwOwotICAgIHByaXZhdGUgU2NyaXB0IG1TY3JpcHRJbWFnZTsKLSAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUFNJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVBGQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZJbWFnZXM7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1QVkltYWdlczsKLSAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbiBtUFZBOwotICAgIHByaXZhdGUgVHlwZSBtU3RyaXBQb3NpdGlvblR5cGU7Ci0KLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUltYWdlc1tdOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NJRHM7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BvczsKLSAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jU3RhdGU7Ci0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1BbGxvY1BWOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzVGV4OwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NPZmZzZXRzOwotCi0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1NZXNoOwotICAgIHByaXZhdGUgTGlnaHQgbUxpZ2h0OwotCi0gICAgcHJpdmF0ZSBGaWxtU3RyaXBNZXNoIG1GU007Ci0KLSAgICBwcml2YXRlIGludFtdIG1CdWZmZXJJRHM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1CdWZmZXJQb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBpbnRbXSBtQnVmZmVyU3RhdGU7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKLSAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKHRydWUpOwotICAgICAgICBiLnNldERlcHRoTWFzayh0cnVlKTsKLSAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QU0JhY2tncm91bmQuc2V0TmFtZSgiUFNCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYi5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5FUVVBTCk7Ci0gICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKLSAgICAgICAgYi5zZXREZXB0aE1hc2soZmFsc2UpOwotICAgICAgICBiLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkUpOwotICAgICAgICBtUFNJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUFNJbWFnZXMuc2V0TmFtZSgiUFNJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgewotICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ly9fTUlQX0xJTkVBUik7Ci0gICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7Ci0gICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOwotICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLldSQVApOwotICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOwotCi0gICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKLSAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7Ci0gICAgICAgIG1QRkJhY2tncm91bmQuc2V0TmFtZSgiUEZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgYiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOwotICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAotICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOwotICAgICAgICBtUEZJbWFnZXMgPSBiLmNyZWF0ZSgpOwotICAgICAgICBtUEZJbWFnZXMuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOwotICAgICAgICBtUEZJbWFnZXMuc2V0TmFtZSgiUEZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFBWKCkgewotICAgICAgICBtTGlnaHQgPSAobmV3IExpZ2h0LkJ1aWxkZXIobVJTKSkuY3JlYXRlKCk7Ci0gICAgICAgIG1MaWdodC5zZXRQb3NpdGlvbigwLCAtMC41ZiwgLTEuMGYpOwotCi0gICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vcHZiLmFkZExpZ2h0KG1MaWdodCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuc2V0TmFtZSgiUFZCYWNrZ3JvdW5kIik7Ci0KLSAgICAgICAgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihtUlMsIG51bGwsIG51bGwpOwotICAgICAgICBwdmIuc2V0VGV4dHVyZU1hdHJpeEVuYWJsZSh0cnVlKTsKLSAgICAgICAgbVBWSW1hZ2VzID0gcHZiLmNyZWF0ZSgpOwotICAgICAgICBtUFZJbWFnZXMuc2V0TmFtZSgiUFZJbWFnZXMiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKLSAgICAgICAgbUJ1ZmZlcklEcyA9IG5ldyBpbnRbMTNdOwotICAgICAgICBtSW1hZ2VzID0gbmV3IEFsbG9jYXRpb25bMTNdOwotICAgICAgICBtQWxsb2NJRHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIpLAotICAgICAgICAgICAgbUJ1ZmZlcklEcy5sZW5ndGgpOwotCi0gICAgICAgIEVsZW1lbnQgaWUgPSBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRWxlbWVudC5EYXRhVHlwZS5VTlNJR05FRF81XzZfNSwgRWxlbWVudC5EYXRhS2luZC5QSVhFTF9SR0IpOwotICAgICAgICBtSW1hZ2VzWzBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDAxLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMV0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDIsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1syXSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwMywgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzNdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA0LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbNF0gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDUsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s1XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwNiwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzZdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDA3LCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbN10gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5wMDgsIGllLCB0cnVlKTsKLSAgICAgICAgbUltYWdlc1s4XSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnAwOSwgaWUsIHRydWUpOwotICAgICAgICBtSW1hZ2VzWzldID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEwLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTBdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDExLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTFdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEyLCBpZSwgdHJ1ZSk7Ci0gICAgICAgIG1JbWFnZXNbMTJdID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2VCb3hlZChtUlMsIG1SZXMsIFIuZHJhd2FibGUucDEzLCBpZSwgdHJ1ZSk7Ci0KLSAgICAgICAgaW50IGJsYWNrW10gPSBuZXcgaW50WzEwMjRdOwotICAgICAgICBmb3IoaW50IGN0PTA7IGN0IDwgbUltYWdlcy5sZW5ndGg7IGN0KyspIHsKLSAgICAgICAgICAgIEFsbG9jYXRpb24uQWRhcHRlcjJEIGEgPSBtSW1hZ2VzW2N0XS5jcmVhdGVBZGFwdGVyMkQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSA1MTI7Ci0gICAgICAgICAgICBpbnQgbWlwID0gMDsKLSAgICAgICAgICAgIHdoaWxlKHNpemUgPj0gMikgewotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCAyLCBzaXplLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKHNpemUtMiwgMCwgMiwgc2l6ZSwgYmxhY2spOwotICAgICAgICAgICAgICAgIGEuc3ViRGF0YSgwLCAwLCBzaXplLCAyLCBibGFjayk7Ci0gICAgICAgICAgICAgICAgYS5zdWJEYXRhKDAsIHNpemUtMiwgc2l6ZSwgMiwgYmxhY2spOwotICAgICAgICAgICAgICAgIHNpemUgPj49IDE7Ci0gICAgICAgICAgICAgICAgbWlwKys7Ci0gICAgICAgICAgICAgICAgYS5zZXRDb25zdHJhaW50KERpbWVuc2lvbi5MT0QsIG1pcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbWFnZXNbY3RdLnVwbG9hZFRvVGV4dHVyZSgxKTsKLSAgICAgICAgICAgIG1CdWZmZXJJRHNbY3RdID0gbUltYWdlc1tjdF0uZ2V0SUQoKTsKLSAgICAgICAgfQotICAgICAgICBtQWxsb2NJRHMuZGF0YShtQnVmZmVySURzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFN0YXRlKCkKLSAgICB7Ci0gICAgICAgIG1CdWZmZXJTdGF0ZSA9IG5ldyBpbnRbMTBdOwotICAgICAgICBtQWxsb2NTdGF0ZSA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksCi0gICAgICAgICAgICBtQnVmZmVyU3RhdGUubGVuZ3RoKTsKLSAgICAgICAgbUJ1ZmZlclN0YXRlW1NUQVRFX0xBU1RfRk9DVVNdID0gLTE7Ci0gICAgICAgIG1BbGxvY1N0YXRlLmRhdGEobUJ1ZmZlclN0YXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgICAgICBtRlNNID0gbmV3IEZpbG1TdHJpcE1lc2goKTsKLSAgICAgICAgbU1lc2ggPSBtRlNNLmluaXQobVJTKTsKLSAgICAgICAgbU1lc2guc2V0TmFtZSgibWVzaCIpOwotCi0gICAgICAgIGluaXRQRlMoKTsKLSAgICAgICAgaW5pdFBGKCk7Ci0gICAgICAgIGluaXRQVigpOwotCi0gICAgICAgIExvZy5lKCJycyIsICJEb25lIGxvYWRpbmcgbmFtZWQiKTsKLQotICAgICAgICBtU3RyaXBQb3NpdGlvblR5cGUgPSBUeXBlLmNyZWF0ZUZyb21DbGFzcyhtUlMsIFN0cmlwUG9zaXRpb24uY2xhc3MsIDEpOwotCi0gICAgICAgIFNjcmlwdEMuQnVpbGRlciBzYiA9IG5ldyBTY3JpcHRDLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgc2Iuc2V0U2NyaXB0KG1SZXMsIFIucmF3LmZpbG1zdHJpcCk7Ci0gICAgICAgIHNiLnNldFJvb3QodHJ1ZSk7Ci0gICAgICAgIHNiLnNldFR5cGUobVN0cmlwUG9zaXRpb25UeXBlLCAiUG9zIiwgMSk7Ci0gICAgICAgIG1TY3JpcHRTdHJpcCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBtU2NyaXB0U3RyaXAuc2V0Q2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKLQotICAgICAgICBtQWxsb2NQb3MgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgbVN0cmlwUG9zaXRpb25UeXBlKTsKLQotICAgICAgICBsb2FkSW1hZ2VzKCk7Ci0gICAgICAgIGluaXRTdGF0ZSgpOwotCi0gICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7Ci0gICAgICAgIG1QVkJhY2tncm91bmQuYmluZEFsbG9jYXRpb24obVBWQSk7Ci0gICAgICAgIG1QVkltYWdlcy5iaW5kQWxsb2NhdGlvbihtUFZBKTsKLSAgICAgICAgbVBWQS5zZXR1cFByb2plY3Rpb25Ob3JtYWxpemVkKDMyMCwgNDgwKTsKLQotCi0gICAgICAgIG1TY3JpcHRTdHJpcC5iaW5kQWxsb2NhdGlvbihtQWxsb2NJRHMsIDApOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jUG9zLCAxKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY1N0YXRlLCAyKTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1QVkEubUFsbG9jLCAzKTsKLQotCi0gICAgICAgIG1BbGxvY09mZnNldHMgPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgIEVsZW1lbnQuY3JlYXRlVXNlcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuU0lHTkVEXzMyKSwgbUZTTS5tVHJpYW5nbGVPZmZzZXRzLmxlbmd0aCk7Ci0gICAgICAgIG1BbGxvY09mZnNldHMuZGF0YShtRlNNLm1UcmlhbmdsZU9mZnNldHMpOwotICAgICAgICBtU2NyaXB0U3RyaXAuYmluZEFsbG9jYXRpb24obUFsbG9jT2Zmc2V0cywgNCk7Ci0KLSAgICAgICAgbUFsbG9jT2Zmc2V0c1RleCA9IEFsbG9jYXRpb24uY3JlYXRlU2l6ZWQobVJTLAotICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiksIG1GU00ubVRyaWFuZ2xlT2Zmc2V0c1RleC5sZW5ndGgpOwotICAgICAgICBtQWxsb2NPZmZzZXRzVGV4LmRhdGEobUZTTS5tVHJpYW5nbGVPZmZzZXRzVGV4KTsKLSAgICAgICAgbVNjcmlwdFN0cmlwLmJpbmRBbGxvY2F0aW9uKG1BbGxvY09mZnNldHNUZXgsIDUpOwotCi0gICAgICAgIHNldEZpbG1TdHJpcFBvc2l0aW9uKDAsIDApOwotICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHRTdHJpcCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVN0cmlwTWVzaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhjY2UwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9GaWxtL3NyYy9jb20vYW5kcm9pZC9maWxtL0ZpbG1TdHJpcE1lc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZpbG07Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcuTWF0aDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OwotaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlNpbXBsZU1lc2g7Ci0KLQotY2xhc3MgRmlsbVN0cmlwTWVzaCB7Ci0KLSAgICBjbGFzcyBWZXJ0ZXggewotICAgICAgICBmbG9hdCBueDsKLSAgICAgICAgZmxvYXQgbnk7Ci0gICAgICAgIGZsb2F0IG56OwotICAgICAgICBmbG9hdCBzOwotICAgICAgICBmbG9hdCB0OwotICAgICAgICBmbG9hdCB4OwotICAgICAgICBmbG9hdCB5OwotICAgICAgICBmbG9hdCB6OwotCi0gICAgICAgIFZlcnRleCgpIHsKLSAgICAgICAgICAgIG54ID0gMDsKLSAgICAgICAgICAgIG55ID0gMDsKLSAgICAgICAgICAgIG56ID0gMDsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgdCA9IDA7Ci0gICAgICAgICAgICB4ID0gMDsKLSAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgeiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHh5eihmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF96KSB7Ci0gICAgICAgICAgICB4ID0gX3g7Ci0gICAgICAgICAgICB5ID0gX3k7Ci0gICAgICAgICAgICB6ID0gX3o7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIG54eXooZmxvYXQgX3gsIGZsb2F0IF95LCBmbG9hdCBfeikgewotICAgICAgICAgICAgbnggPSBfeDsKLSAgICAgICAgICAgIG55ID0gX3k7Ci0gICAgICAgICAgICBueiA9IF96OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzdChmbG9hdCBfcywgZmxvYXQgX3QpIHsKLSAgICAgICAgICAgIHMgPSBfczsKLSAgICAgICAgICAgIHQgPSBfdDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgY29tcHV0ZU5vcm0oVmVydGV4IHYxLCBWZXJ0ZXggdjIpIHsKLSAgICAgICAgICAgIGZsb2F0IGR4ID0gdjEueCAtIHYyLng7Ci0gICAgICAgICAgICBmbG9hdCBkeSA9IHYxLnkgLSB2Mi55OwotICAgICAgICAgICAgZmxvYXQgZHogPSB2MS56IC0gdjIuejsKLSAgICAgICAgICAgIGZsb2F0IGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkgKyBkeipkeik7Ci0gICAgICAgICAgICBkeCAvPSBsZW47Ci0gICAgICAgICAgICBkeSAvPSBsZW47Ci0gICAgICAgICAgICBkeiAvPSBsZW47Ci0KLSAgICAgICAgICAgIG54ID0gZHggKiBkejsKLSAgICAgICAgICAgIG55ID0gZHkgKiBkejsKLSAgICAgICAgICAgIG56ID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQoZHgqZHggKyBkeSpkeSk7Ci0KLSAgICAgICAgICAgIGxlbiA9IChmbG9hdClqYXZhLmxhbmcuTWF0aC5zcXJ0KG54Km54ICsgbnkqbnkgKyBueipueik7Ci0gICAgICAgICAgICBueCAvPSBsZW47Ci0gICAgICAgICAgICBueSAvPSBsZW47Ci0gICAgICAgICAgICBueiAvPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRbXSBtVHJpYW5nbGVPZmZzZXRzOwotICAgIGZsb2F0W10gbVRyaWFuZ2xlT2Zmc2V0c1RleDsKLSAgICBpbnQgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50OwotCi0gICAgU2ltcGxlTWVzaCBpbml0KFJlbmRlclNjcmlwdCBycykKLSAgICB7Ci0gICAgICAgIGZsb2F0IHZ0eFtdID0gbmV3IGZsb2F0W10gewotICAgICAgICAgICAgNjAuNDMxMDAzZiwgMTI0LjQ4MjA1MGYsCi0gICAgICAgICAgICA2MC44NjIwNzRmLCAxMjAuODcyNjA0ZiwKLSAgICAgICAgICAgIDYxLjcwNTMwM2YsIDExNy4zMzY2NjJmLAotICAgICAgICAgICAgNjIuOTQ5NTA1ZiwgMTEzLjkyMTEyN2YsCi0gICAgICAgICAgICA2NC41NzgxNzdmLCAxMTAuNjcxMzA0ZiwKLSAgICAgICAgICAgIDY2LjU2OTcxNmYsIDEwNy42MzAzMDJmLAotICAgICAgICAgICAgNjguODk3NzAzZiwgMTA0LjgzODQ1N2YsCi0gICAgICAgICAgICA3MS41MzEyNTlmLCAxMDIuMzMyODAzZiwKLSAgICAgICAgICAgIDc0LjQzNTQ1MmYsIDEwMC4xNDY1NzdmLAotICAgICAgICAgICAgNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgIDgwLjg5ODU3NGYsIDk2Ljg0Mzc4MWYsCi0gICAgICAgICAgICA4NC4zNzE3NzNmLCA5NS43NzEwMjNmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDk1LjI2NzA5OGYsCi0gICAgICAgICAgICAxMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxMDQuNTM5MzY2ZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxMjIuOTQ5ODQ5ZiwKLSAgICAgICAgICAgIDEzMS45NDUyODNmLCAxMzMuODU0NzMxZiwKLSAgICAgICAgICAgIDEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgIDEyNS44NTY4NzJmLCAxNTQuNzk3NDM5ZiwKLSAgICAgICAgICAgIDExOC42OTk1ODJmLCAxNjMuMTcwMDk2ZiwKLSAgICAgICAgICAgIDEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgIDk4Ljk1ODk5NGYsIDE3Mi40NDIzNjRmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgMTcyLjYwNDczMWYsCi0gICAgICAgICAgICA3Mi41MDczMTNmLCAxNzIuNjcyOTI3ZiwKLSAgICAgICAgICAgIDU3LjY3ODkyMGYsIDE2OC4zNzcwNzFmLAotICAgICAgICAgICAgNDQuNjY4MTM1ZiwgMTYwLjA2NzEzNGYsCi0gICAgICAgICAgICAzNC41MzQ5MDhmLCAxNDguNDIwMTA0ZiwKLSAgICAgICAgICAgIDI4LjEwNDc2N2YsIDEzNC4zODQ4MzFmLAotICAgICAgICAgICAgMjUuOTAxNTU3ZiwgMTE5LjEwNDczMWYsCi0gICAgICAgICAgICAyOC4xMDQ3NjdmLCAxMDMuODI0NjMxZiwKLSAgICAgICAgICAgIDM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICA0NC42NjgxMzVmLCA3OC4xNDIzMjdmLAotICAgICAgICAgICAgNTcuNjc4OTIwZiwgNjkuODMyMzkwZiwKLSAgICAgICAgICAgIDcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICA4Ny45NDUyODNmLCA2NS42MDQ3MzFmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAxMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgIDE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAxNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgIDE2NC4xOTUyODNmLCAtMC4xNDUyNjlmLAotICAgICAgICAgICAgMTYxLjQ4NzYwMGYsIC0xOC45MjQwODRmLAotICAgICAgICAgICAgMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgMTQxLjEzMTY4NmYsIC01MC40ODY5MTRmLAotICAgICAgICAgICAgMTI1LjE0MTc5NWYsIC02MC42OTk1OTRmLAotICAgICAgICAgICAgMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICA4MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgNjBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIDQwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAyMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgMGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTIwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtNDBmLCAtNjUuODk1MjY5ZiwKLSAgICAgICAgICAgIC02MGYsIC02NS44OTUyNjlmLAotICAgICAgICAgICAgLTgwZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtODcuOTQ1MjgzZiwgLTY1Ljg5NTI2OWYsCi0gICAgICAgICAgICAtMTA2LjkxODExN2YsIC02NS45NzkwODFmLAotICAgICAgICAgICAgLTEyNS4xNDE3OTVmLCAtNjAuNjk5NTk0ZiwKLSAgICAgICAgICAgIC0xNDEuMTMxNjg2ZiwgLTUwLjQ4NjkxNGYsCi0gICAgICAgICAgICAtMTUzLjU4NTEzN2YsIC0zNi4xNzMwNDBmLAotICAgICAgICAgICAgLTE2MS40ODc2MDBmLCAtMTguOTI0MDg0ZiwKLSAgICAgICAgICAgIC0xNjQuMTk1MjgzZiwgLTAuMTQ1MjY5ZiwKLSAgICAgICAgICAgIC0xNjEuNDg3NjAwZiwgMTguNjMzNTQ1ZiwKLSAgICAgICAgICAgICAtMTUzLjU4NTEzN2YsIDM1Ljg4MjUwMmYsCi0gICAgICAgICAgICAgLTE0MS4xMzE2ODZmLCA1MC4xOTYzNzZmLAotICAgICAgICAgICAgIC0xMjUuMTQxNzk1ZiwgNjAuNDA5MDU2ZiwKLSAgICAgICAgICAgICAtMTA2LjkxODExN2YsIDY1LjY4ODU0MmYsCi0gICAgICAgICAgICAgLTg3Ljk0NTI4M2YsIDY1LjYwNDczMWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDY1LjUzNjUzNGYsCi0gICAgICAgICAgICAgLTU3LjY3ODkyMGYsIDY5LjgzMjM5MGYsCi0gICAgICAgICAgICAgLTQ0LjY2ODEzNWYsIDc4LjE0MjMyN2YsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDg5Ljc4OTM1OGYsCi0gICAgICAgICAgICAgLTI4LjEwNDc2N2YsIDEwMy44MjQ2MzFmLAotICAgICAgICAgICAgIC0yNS45MDE1NTdmLCAxMTkuMTA0NzMxZiwKLSAgICAgICAgICAgICAtMjguMTA0NzY3ZiwgMTM0LjM4NDgzMWYsCi0gICAgICAgICAgICAgLTM0LjUzNDkwOGYsIDE0OC40MjAxMDRmLAotICAgICAgICAgICAgIC00NC42NjgxMzVmLCAxNjAuMDY3MTM0ZiwKLSAgICAgICAgICAgICAtNTcuNjc4OTIwZiwgMTY4LjM3NzA3MWYsCi0gICAgICAgICAgICAgLTcyLjUwNzMxM2YsIDE3Mi42NzI5MjdmLAotICAgICAgICAgICAgIC04Ny45NDUyODNmLCAxNzIuNjA0NzMxZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgMTcyLjQ0MjM2NGYsCi0gICAgICAgICAgICAgLTEwOS40ODk1MjNmLCAxNjkuMjExODY2ZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDE2My4xNzAwOTZmLAotICAgICAgICAgICAgIC0xMjUuODU2ODcyZiwgMTU0Ljc5NzQzOWYsCi0gICAgICAgICAgICAgLTEzMC4zOTIzMTFmLCAxNDQuNzU5NjEzZiwKLSAgICAgICAgICAgICAtMTMxLjk0NTI4M2YsIDEzMy44NTQ3MzFmLAotICAgICAgICAgICAgIC0xMzAuMzkyMzExZiwgMTIyLjk0OTg0OWYsCi0gICAgICAgICAgICAgLTEyNS44NTY4NzJmLCAxMTIuOTEyMDIyZiwKLSAgICAgICAgICAgICAtMTE4LjY5OTU4MmYsIDEwNC41MzkzNjZmLAotICAgICAgICAgICAgIC0xMDkuNDg5NTIzZiwgOTguNDk3NTk2ZiwKLSAgICAgICAgICAgICAtOTguOTU4OTk0ZiwgOTUuMjY3MDk4ZiwKLSAgICAgICAgICAgICAtODcuOTQ1MjgzZiwgOTUuMTA0NzMxZiwKLSAgICAgICAgICAgICAtODQuMzcxNzczZiwgOTUuNzcxMDIzZiwKLSAgICAgICAgICAgICAtODAuODk4NTc0ZiwgOTYuODQzNzgxZiwKLSAgICAgICAgICAgICAtNzcuNTcxNzU3ZiwgOTguMzA4Nzc3ZiwKLSAgICAgICAgICAgICAtNzQuNDM1NDUyZiwgMTAwLjE0NjU3N2YsCi0gICAgICAgICAgICAgLTcxLjUzMTI1OWYsIDEwMi4zMzI4MDNmLAotICAgICAgICAgICAgIC02OC44OTc3MDNmLCAxMDQuODM4NDU3ZiwKLSAgICAgICAgICAgICAtNjYuNTY5NzE2ZiwgMTA3LjYzMDMwMmYsCi0gICAgICAgICAgICAgLTY0LjU3ODE3N2YsIDExMC42NzEzMDRmLAotICAgICAgICAgICAgIC02Mi45NDk1MDVmLCAxMTMuOTIxMTI3ZiwKLSAgICAgICAgICAgICAtNjEuNzA1MzAzZiwgMTE3LjMzNjY2MmYsCi0gICAgICAgICAgICAgLTYwLjg2MjA3NGYsIDEyMC44NzI2MDRmLAotICAgICAgICAgICAgIC02MC40MzEwMDNmLCAxMjQuNDgyMDUwZgotICAgICAgICB9OwotCi0KLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0cyA9IG5ldyBpbnRbNjRdOwotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4ID0gbmV3IGZsb2F0WzY0XTsKLQotICAgICAgICBtVHJpYW5nbGVPZmZzZXRzWzBdID0gMDsKLSAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ID0gMTsKLQotICAgICAgICBWZXJ0ZXggdCA9IG5ldyBWZXJ0ZXgoKTsKLSAgICAgICAgdC5ueHl6KDEsIDAsIDApOwotICAgICAgICBpbnQgY291bnQgPSB2dHgubGVuZ3RoIC8gMjsKLQotICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG0gPSBuZXcgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKAotICAgICAgICAgICAgcnMsIDMsCi0gICAgICAgICAgICBTaW1wbGVNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuTk9STUFMIHwgU2ltcGxlTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7Ci0KLSAgICAgICAgZmxvYXQgcnVubmluZ1MgPSAwOwotICAgICAgICBmb3IgKGludCBjdD0wOyBjdCA8IChjb3VudC0xKTsgY3QrKykgewotICAgICAgICAgICAgdC54ID0gLXZ0eFtjdCoyXSAvIDEwMC5mOwotICAgICAgICAgICAgdC56ID0gdnR4W2N0KjIrMV0gLyAxMDAuZjsKLSAgICAgICAgICAgIHQucyA9IHJ1bm5pbmdTOwotICAgICAgICAgICAgdC5ueCA9ICAodnR4W2N0KjIrM10gLSB2dHhbY3QqMiArMV0pOwotICAgICAgICAgICAgdC5ueSA9ICAodnR4W2N0KjIrMl0gLSB2dHhbY3QqMiAgIF0pOwotICAgICAgICAgICAgZmxvYXQgbGVuID0gKGZsb2F0KWphdmEubGFuZy5NYXRoLnNxcnQodC5ueCAqIHQubnggKyB0Lm55ICogdC5ueSk7Ci0gICAgICAgICAgICBydW5uaW5nUyArPSBsZW4gLyAxMDA7Ci0gICAgICAgICAgICB0Lm54IC89IGxlbjsKLSAgICAgICAgICAgIHQubnkgLz0gbGVuOwotICAgICAgICAgICAgdC55ID0gLTAuNWY7Ci0gICAgICAgICAgICB0LnQgPSAwOwotICAgICAgICAgICAgdG0uc2V0Tm9ybWFsKHQubngsIHQubnksIHQubnopOwotICAgICAgICAgICAgdG0uc2V0VGV4dHVyZSh0LnMsIHQudCk7Ci0gICAgICAgICAgICB0bS5hZGRWZXJ0ZXgodC54LCB0LnksIHQueik7Ci0gICAgICAgICAgICAvL2FuZHJvaWQudXRpbC5Mb2cuZSgicnMiLCAidnR4IHg9Iit0LngrIiB5PSIrdC55KyIgej0iK3QueisiIHM9Iit0LnMrIiB0PSIrdC50KTsKLSAgICAgICAgICAgIHQueSA9IC41ZjsKLSAgICAgICAgICAgIHQudCA9IDE7Ci0gICAgICAgICAgICB0bS5zZXRUZXh0dXJlKHQucywgdC50KTsKLSAgICAgICAgICAgIHRtLmFkZFZlcnRleCh0LngsIHQueSwgdC56KTsKLSAgICAgICAgICAgIC8vYW5kcm9pZC51dGlsLkxvZy5lKCJycyIsICJ2dHggeD0iK3QueCsiIHk9Iit0LnkrIiB6PSIrdC56KyIgcz0iK3QucysiIHQ9Iit0LnQpOwotCi0gICAgICAgICAgICBpZigocnVubmluZ1MqMikgPiBtVHJpYW5nbGVPZmZzZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzW21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSBjdCoyICogMzsKLSAgICAgICAgICAgICAgICBtVHJpYW5nbGVPZmZzZXRzVGV4W21UcmlhbmdsZU9mZnNldHNDb3VudF0gPSB0LnM7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlT2Zmc2V0c0NvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSAoY291bnQgKiAyIC0gMik7Ci0gICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgKGNvdW50LTIpOyBjdCs9IDIpIHsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0LCBjdCsxLCBjdCsyKTsKLSAgICAgICAgICAgIHRtLmFkZFRyaWFuZ2xlKGN0KzEsIGN0KzMsIGN0KzIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bS5jcmVhdGUoKTsKLSAgICB9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhIGIvbGlicy9ycy9qYXZhL0ZpbG0vc3JjL2NvbS9hbmRyb2lkL2ZpbG0vRmlsbVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjMjgxMS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRmlsbS9zcmMvY29tL2FuZHJvaWQvZmlsbS9GaWxtVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmlsbTsKLQotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOwotCi1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7Ci1pbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWxtVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgewotCi0gICAgcHVibGljIEZpbG1WaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0gICAgcHJpdmF0ZSBGaWxtUlMgbVJlbmRlcjsKLQotCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgewotICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7Ci0gICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOwotICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOwotICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGaWxtUlMoKTsKLSAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBpZihtUlMgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJTID0gbnVsbDsKLSAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCi0gICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOwotICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtUmVuZGVyLnNldEZpbG1TdHJpcFBvc2l0aW9uKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSAvIDUpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCmluZGV4IGY3ZTUzYTguLjcxOTQ0YjIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9BbmRyb2lkLm1rCkBAIC0xNCwxNCArMTQsMTggQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCiAjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CiAKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGb3VudGFpbgogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvZHJhd2FibGUvZ2FkZ2V0c19jbG9ja19tcDMucG5nIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9kcmF3YWJsZS9nYWRnZXRzX2Nsb2NrX21wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5MWJmYjQuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9kcmF3YWJsZS9nYWRnZXRzX2Nsb2NrX21wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiODE5Yi4uMDAwMDAwMAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vcmVzL3Jhdy9mb3VudGFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKLSNwcmFnbWEgdmVyc2lvbigxKQotCi1pbnQgbmV3UGFydCA9IDA7Ci0KLWludCBtYWluKGludCBsYXVuY2hJRCkgewotICAgIGludCBjdDsKLSAgICBpbnQgY291bnQgPSBDb250cm9sLT5jb3VudDsKLSAgICBpbnQgcmF0ZSA9IENvbnRyb2wtPnJhdGU7Ci0gICAgZmxvYXQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCk7Ci0gICAgc3RydWN0IHBvaW50X3MgKiBwID0gKHN0cnVjdCBwb2ludF9zICopcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBzdHJ1Y3QgcG9pbnRfcyAqIG5wID0gJnBbbmV3UGFydF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdGUtLSkgewotICAgICAgICAgICAgdmVjMlJhbmQoKGZsb2F0ICopJm5wLT5kZWx0YS54LCByTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoTkFNRURfUGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goTkFNRURfUGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3Jlcy9yYXcvZm91bnRhaW4yLnJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAxMTQwLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9yZXMvcmF3L2ZvdW50YWluMi5ycworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIEZvdW50YWluIHRlc3Qgc2NyaXB0Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotI2luY2x1ZGUgInJzX3R5cGVzLnJzaCIKLSNpbmNsdWRlICJyc19tYXRoLnJzaCIKLSNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCi0KLXN0YXRpYyBpbnQgbmV3UGFydCA9IDA7Ci0KLXR5cGVkZWYgc3RydWN0IENvbnRyb2xfcyB7Ci0gICAgaW50IHgsIHk7Ci0gICAgaW50IHJhdGU7Ci0gICAgaW50IGNvdW50OwotICAgIGZsb2F0IHIsIGcsIGI7Ci0gICAgcnNfYWxsb2NhdGlvbiBwYXJ0QnVmZmVyOwotICAgIHJzX21lc2ggcGFydE1lc2g7Ci19IENvbnRyb2xfdDsKLUNvbnRyb2xfdCAqQ29udHJvbDsKLQotdHlwZWRlZiBzdHJ1Y3QgUG9pbnRfc3sKLSAgICBmbG9hdDIgZGVsdGE7Ci0gICAgZmxvYXQyIHBvc2l0aW9uOwotICAgIHVuc2lnbmVkIGludCBjb2xvcjsKLX0gUG9pbnRfdDsKLVBvaW50X3QgKnBvaW50OwotCi1pbnQgbWFpbihpbnQgbGF1bmNoSUQpIHsKLSAgICBpbnQgY3Q7Ci0gICAgaW50IGNvdW50ID0gQ29udHJvbC0+Y291bnQ7Ci0gICAgaW50IHJhdGUgPSBDb250cm9sLT5yYXRlOwotICAgIGZsb2F0IGhlaWdodCA9IGdldEhlaWdodCgpOwotICAgIFBvaW50X3QgKiBwID0gcG9pbnQ7Ci0KLSAgICBpZiAocmF0ZSkgewotICAgICAgICBmbG9hdCByTWF4ID0gKChmbG9hdClyYXRlKSAqIDAuMDA1ZjsKLSAgICAgICAgaW50IHggPSBDb250cm9sLT54OwotICAgICAgICBpbnQgeSA9IENvbnRyb2wtPnk7Ci0gICAgICAgIGludCBjb2xvciA9ICgoaW50KShDb250cm9sLT5yICogMjU1LmYpKSB8Ci0gICAgICAgICAgICAgICAgICAgICgoaW50KShDb250cm9sLT5nICogMjU1LmYpKSA8PCA4IHwKLSAgICAgICAgICAgICAgICAgICAgKChpbnQpKENvbnRyb2wtPmIgKiAyNTUuZikpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAgKDB4ZjAgPDwgMjQpOwotICAgICAgICBQb2ludF90ICogbnAgPSAmcFtuZXdQYXJ0XTsKLQotICAgICAgICB3aGlsZSAocmF0ZS0tKSB7Ci0gICAgICAgICAgICBucC0+ZGVsdGEgPSB2ZWMyUmFuZChyTWF4KTsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi54ID0geDsKLSAgICAgICAgICAgIG5wLT5wb3NpdGlvbi55ID0geTsKLSAgICAgICAgICAgIG5wLT5jb2xvciA9IGNvbG9yOwotICAgICAgICAgICAgbmV3UGFydCsrOwotICAgICAgICAgICAgbnArKzsKLSAgICAgICAgICAgIGlmIChuZXdQYXJ0ID49IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3UGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgbnAgPSAmcFtuZXdQYXJ0XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoY3Q9MDsgY3QgPCBjb3VudDsgY3QrKykgewotICAgICAgICBmbG9hdCBkeSA9IHAtPmRlbHRhLnkgKyAwLjE1ZjsKLSAgICAgICAgZmxvYXQgcG9zeSA9IHAtPnBvc2l0aW9uLnkgKyBkeTsKLSAgICAgICAgaWYgKChwb3N5ID4gaGVpZ2h0KSAmJiAoZHkgPiAwKSkgewotICAgICAgICAgICAgZHkgKj0gLTAuM2Y7Ci0gICAgICAgIH0KLSAgICAgICAgcC0+ZGVsdGEueSA9IGR5OwotICAgICAgICBwLT5wb3NpdGlvbi54ICs9IHAtPmRlbHRhLng7Ci0gICAgICAgIHAtPnBvc2l0aW9uLnkgPSBwb3N5OwotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgdXBsb2FkVG9CdWZmZXJPYmplY3QoQ29udHJvbC0+cGFydEJ1ZmZlcik7Ci0gICAgZHJhd1NpbXBsZU1lc2goQ29udHJvbC0+cGFydE1lc2gpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblJTLmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQppbmRleCA5MzU2NTc5Li4yOTdlYTA3IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMjIsOTQgKzIyLDUwIEBACiAKIAogcHVibGljIGNsYXNzIEZvdW50YWluUlMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSAyMDAwMDsKLQotICAgIHN0YXRpYyBjbGFzcyBTb21lRGF0YSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgeDsKLSAgICAgICAgcHVibGljIGludCB5OwotICAgICAgICBwdWJsaWMgaW50IHJhdGU7Ci0gICAgICAgIHB1YmxpYyBpbnQgY291bnQ7Ci0gICAgICAgIHB1YmxpYyBmbG9hdCByOwotICAgICAgICBwdWJsaWMgZmxvYXQgZzsKLSAgICAgICAgcHVibGljIGZsb2F0IGI7Ci0gICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA1MDAwMDsKIAogICAgIHB1YmxpYyBGb3VudGFpblJTKCkgewogICAgIH0KIAorICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTY3JpcHRDX0ZvdW50YWluIG1TY3JpcHQ7CiAgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIG1SUyA9IHJzOwogICAgICAgICBtUmVzID0gcmVzOwotICAgICAgICBpbml0UlMoKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIocnMpOworICAgICAgICBwZmIuc2V0VmFyeWluZ0NvbG9yKHRydWUpOworICAgICAgICBycy5jb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChwZmIuY3JlYXRlKCkpOworCisgICAgICAgIFNjcmlwdEZpZWxkX1BvaW50IHBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChtUlMsIFBBUlRfQ09VTlQpOworCisgICAgICAgIE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIgc21iID0gbmV3IE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc21iLmFkZFZlcnRleEFsbG9jYXRpb24ocG9pbnRzLmdldEFsbG9jYXRpb24oKSk7CisgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoUHJpbWl0aXZlLlBPSU5UKTsKKyAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfRm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbiwgdHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihpbnQgeCwgaW50IHksIGludCByYXRlKSB7Ci0gICAgICAgIGlmIChtU0QucmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICBtU0QuciA9ICgoeCAmIDB4MSkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuZyA9ICgoeCAmIDB4MikgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBtU0QuYiA9ICgoeCAmIDB4NCkgIT0gMCkgPyAwLmYgOiAxLmY7Ci0gICAgICAgICAgICBpZiAoKG1TRC5yICsgbVNELmcgKyBtU0QuYikgPCAwLjlmKSB7Ci0gICAgICAgICAgICAgICAgbVNELnIgPSAwLjhmOwotICAgICAgICAgICAgICAgIG1TRC5nID0gMC41ZjsKLSAgICAgICAgICAgICAgICBtU0QuYiA9IDEuZjsKLSAgICAgICAgICAgIH0KKyAgICBib29sZWFuIGhvbGRpbmdDb2xvcltdID0gbmV3IGJvb2xlYW5bMTBdOworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgICAgICBpZiAoaWQgPiBob2xkaW5nQ29sb3IubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbVNELnJhdGUgPSByYXRlOwotICAgICAgICBtU0QueCA9IHg7Ci0gICAgICAgIG1TRC55ID0geTsKLSAgICAgICAgbUludEFsbG9jLmRhdGEobVNEKTsKKyAgICAgICAgaW50IHJhdGUgPSAoaW50KShwcmVzc3VyZSAqIHByZXNzdXJlICogNTAwLmYpOworICAgICAgICBpZihyYXRlID4gNTAwKSB7CisgICAgICAgICAgICByYXRlID0gNTAwOworICAgICAgICB9CisgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgbVNjcmlwdC5pbnZva2VfYWRkUGFydGljbGVzKHJhdGUsIHgsIHksIGlkLCAhaG9sZGluZ0NvbG9yW2lkXSk7CisgICAgICAgICAgICBob2xkaW5nQ29sb3JbaWRdID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgfQotCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKLQotICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOwotICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtSW50QWxsb2M7Ci0gICAgcHJpdmF0ZSBTaW1wbGVNZXNoIG1TTTsKLSAgICBwcml2YXRlIFNvbWVEYXRhIG1TRDsKLSAgICBwcml2YXRlIFR5cGUgbVNEVHlwZTsKLQotICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7Ci0gICAgICAgIG1TRCA9IG5ldyBTb21lRGF0YSgpOwotICAgICAgICBtU0RUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBTb21lRGF0YS5jbGFzcywgMSwgIlNvbWVEYXRhIik7Ci0gICAgICAgIG1JbnRBbGxvYyA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLCBtU0RUeXBlKTsKLSAgICAgICAgbVNELmNvdW50ID0gUEFSVF9DT1VOVDsKLSAgICAgICAgbUludEFsbG9jLmRhdGEobVNEKTsKLQotICAgICAgICBFbGVtZW50LkJ1aWxkZXIgZWIgPSBuZXcgRWxlbWVudC5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIGViLmFkZChFbGVtZW50LmNyZWF0ZVZlY3RvcihtUlMsIEVsZW1lbnQuRGF0YVR5cGUuRkxPQVRfMzIsIDIpLCAiZGVsdGEiKTsKLSAgICAgICAgZWIuYWRkKEVsZW1lbnQuY3JlYXRlQXR0cmliKG1SUywgRWxlbWVudC5EYXRhVHlwZS5GTE9BVF8zMiwgRWxlbWVudC5EYXRhS2luZC5QT1NJVElPTiwgMiksICJwb3NpdGlvbiIpOwotICAgICAgICBlYi5hZGQoRWxlbWVudC5jcmVhdGVBdHRyaWIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlVOU0lHTkVEXzgsIEVsZW1lbnQuRGF0YUtpbmQuQ09MT1IsIDQpLCAiY29sb3IiKTsKLSAgICAgICAgRWxlbWVudCBwcmltRWxlbWVudCA9IGViLmNyZWF0ZSgpOwotCi0KLSAgICAgICAgU2ltcGxlTWVzaC5CdWlsZGVyIHNtYiA9IG5ldyBTaW1wbGVNZXNoLkJ1aWxkZXIobVJTKTsKLSAgICAgICAgaW50IHZ0eFNsb3QgPSBzbWIuYWRkVmVydGV4VHlwZShwcmltRWxlbWVudCwgUEFSVF9DT1VOVCk7Ci0gICAgICAgIHNtYi5zZXRQcmltaXRpdmUoUHJpbWl0aXZlLlBPSU5UKTsKLSAgICAgICAgbVNNID0gc21iLmNyZWF0ZSgpOwotICAgICAgICBtU00uc2V0TmFtZSgiUGFydE1lc2giKTsKLQotICAgICAgICBBbGxvY2F0aW9uIHBhcnRBbGxvYyA9IG1TTS5jcmVhdGVWZXJ0ZXhBbGxvY2F0aW9uKHZ0eFNsb3QpOwotICAgICAgICBwYXJ0QWxsb2Muc2V0TmFtZSgiUGFydEJ1ZmZlciIpOwotICAgICAgICBtU00uYmluZFZlcnRleEFsbG9jYXRpb24ocGFydEFsbG9jLCAwKTsKLQotICAgICAgICAvLyBBbGwgc2V0dXAgb2YgbmFtZWQgb2JqZWN0cyBzaG91bGQgYmUgZG9uZSBieSB0aGlzIHBvaW50Ci0gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGFib3V0IHRvIGNvbXBpbGUgdGhlIHNjcmlwdC4KLSAgICAgICAgU2NyaXB0Qy5CdWlsZGVyIHNiID0gbmV3IFNjcmlwdEMuQnVpbGRlcihtUlMpOwotICAgICAgICBzYi5zZXRTY3JpcHQobVJlcywgUi5yYXcuZm91bnRhaW4pOwotICAgICAgICBzYi5zZXRSb290KHRydWUpOwotICAgICAgICBzYi5zZXRUeXBlKG1TRFR5cGUsICJDb250cm9sIiwgMCk7Ci0gICAgICAgIHNiLnNldFR5cGUobVNNLmdldFZlcnRleFR5cGUoMCksICJwb2ludCIsIDEpOwotICAgICAgICBTY3JpcHQgc2NyaXB0ID0gc2IuY3JlYXRlKCk7Ci0gICAgICAgIHNjcmlwdC5zZXRDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpOwotCi0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtSW50QWxsb2MsIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24ocGFydEFsbG9jLCAxKTsKLSAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChzY3JpcHQpOwotICAgIH0KLQogfQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Gb3VudGFpbi9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5WaWV3LmphdmEgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCmluZGV4IGRmZDZhNDkuLmMxNDExNjU2YiAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQorKysgYi9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhCkBAIC03MSwxNyArNzEsMzMgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCiAgICAgewotICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKICAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKLSAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBldi5nZXRQb2ludGVySWQoMCkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGFjdCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgLy8gb25seSBvbmUgcG9pbnRlciBnb2luZyB1cCwgd2UgY2FuIGdldCB0aGUgaW5kZXggbGlrZSB0aGlzCisgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGludCBwb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQocG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBwb2ludGVySWQpOwogICAgICAgICB9Ci0gICAgICAgIGZsb2F0IHJhdGUgPSAoZXYuZ2V0UHJlc3N1cmUoKSAqIDUwLmYpOwotICAgICAgICByYXRlICo9IHJhdGU7Ci0gICAgICAgIGlmKHJhdGUgPiAyMDAwLmYpIHsKLSAgICAgICAgICAgIHJhdGUgPSAyMDAwLmY7CisgICAgICAgIGludCBjb3VudCA9IGV2LmdldEhpc3RvcnlTaXplKCk7CisgICAgICAgIGludCBwY291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBwPTA7IHAgPCBwY291bnQ7IHArKykgeworICAgICAgICAgICAgaW50IGlkID0gZXYuZ2V0UG9pbnRlcklkKHApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldFgocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRQcmVzc3VyZShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0SGlzdG9yaWNhbFgocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxZKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsUHJlc3N1cmUocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpLCAoaW50KXJhdGUpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvRm91bnRhaW4vc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL2ZvdW50YWluLnJzIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTJjYjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ZvdW50YWluL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycwpAQCAtMCwwICsxLDcyIEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuZm91bnRhaW4pCisKKyNwcmFnbWEgc3RhdGVGcmFnbWVudChwYXJlbnQpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3N0YXRpYyBpbnQgbmV3UGFydCA9IDA7Cityc19tZXNoIHBhcnRNZXNoOworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSBQb2ludCB7CisgICAgZmxvYXQyIGRlbHRhOworICAgIGZsb2F0MiBwb3NpdGlvbjsKKyAgICB1Y2hhcjQgY29sb3I7Cit9IFBvaW50X3Q7CitQb2ludF90ICpwb2ludDsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHBvaW50LCBwYXJ0TWVzaCkKKyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoYWRkUGFydGljbGVzKQorCitpbnQgcm9vdCgpIHsKKyAgICBmbG9hdCBkdCA9IG1pbihyc0dldER0KCksIDAuMWYpOworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgZmxvYXQgZHkyID0gZHQgKiAoMTAuZik7CisgICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IHNpemU7IGN0KyspIHsKKyAgICAgICAgcC0+ZGVsdGEueSArPSBkeTI7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGZsb2F0NCBwYXJ0Q29sb3JbMTBdOwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGludCBpbmRleCwgYm9vbCBuZXdDb2xvcikKK3sKKyAgICBpZiAobmV3Q29sb3IpIHsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnkgPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueiA9IHJzUmFuZCgxLjBmKTsKKyAgICB9CisgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAyZjsKKyAgICBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgdWNoYXI0IGMgPSByc1BhY2tDb2xvclRvODg4OChwYXJ0Q29sb3JbaW5kZXhdKTsKKworICAgIFBvaW50X3QgKiBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICBmbG9hdDIgcCA9IHt4LCB5fTsKKyAgICB3aGlsZSAocmF0ZS0tKSB7CisgICAgICAgIGZsb2F0IGFuZ2xlID0gcnNSYW5kKDMuMTRmICogMi5mKTsKKyAgICAgICAgZmxvYXQgbGVuID0gcnNSYW5kKHJNYXgpOworICAgICAgICBucC0+ZGVsdGEueCA9IGxlbiAqIHNpbihhbmdsZSk7CisgICAgICAgIG5wLT5kZWx0YS55ID0gbGVuICogY29zKGFuZ2xlKTsKKyAgICAgICAgbnAtPnBvc2l0aW9uID0gcDsKKyAgICAgICAgbnAtPmNvbG9yID0gYzsKKyAgICAgICAgbmV3UGFydCsrOworICAgICAgICBucCsrOworICAgICAgICBpZiAobmV3UGFydCA+PSBzaXplKSB7CisgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKKyAgICAgICAgICAgIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWQubWsKaW5kZXggODMzNDI3Yi4uN2ZhMzBkMCAxMDA2NDQKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMTQsMTQgKzE0LDE5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKICNMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC5yZW5kZXJzY3JpcHQKIAogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEltYWdlUHJvY2Vzc2luZwogCiBpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBiNDhkMjA4Li5kNmEyZGI0IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC02LDcgKzYsOCBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJJbWFnZSBQcm9jZXNzaW5nIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvZHJhd2FibGUvZGF0YS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhODdiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2RyYXdhYmxlL2RhdGEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbCBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCA2NzcwYzE4Li5jNmVjNzI5IDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy9sYXlvdXQvbWFpbi54bWwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0yNSw5ICsyNSwxNDcgQEAKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXNwbGF5IgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzIwZGlwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI2NmRpcCIgLz4KLSAgICAKKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9iZW5jaG1hcmsiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0iYmVuY2htYXJrIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JlbmNobWFya1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTc1ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYXR1cmF0aW9uIi8+CisKKyAgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pblNhdHVyYXRpb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTQwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5TYXR1cmF0aW9uVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE0MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3NhdHVyYXRpb24iLz4KKwogICAgIDxTZWVrQmFyCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGhyZXNob2xkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luR2FtbWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5HYW1tYVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9nYW1tYSIvPgorCisgICAgPFNlZWtCYXIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdXRXaGl0ZVRleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyMjBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9vdXRfd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5XaGl0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pbldoaXRlVGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaW5fd2hpdGUiLz4KKworICAgIDxTZWVrQmFyCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE3MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3V0QmxhY2tUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjUyZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iIzAwMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvb3V0X2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2luQmxhY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTcwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5CbGFja1RleHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI1MmRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiMwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luX2JsYWNrIi8+CisKKyAgICA8U2Vla0JhcgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGl1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxMGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKQEAgLTM1LDQgKzE3MywxNSBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIiAvPgogCisgICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JsdXJUZXh0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNTBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjMDAwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ibHVyX2Rlc2NyaXB0aW9uIi8+CisKIDwvbWVyZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3NpbmcvcmVzL3Jhdy90aHJlc2hvbGQucnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OGYwY2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvcmF3L3RocmVzaG9sZC5ycworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0vLyBibG9jayBvZiBkZWZpbmVzIG1hdGNoaW5nIHdoYXQgUlMgd2lsbCBpbnNlcnQgYXQgcnVudGltZS4KLXN0cnVjdCBQYXJhbXNfc3sKLSAgICBpbnQgaW5IZWlnaHQ7Ci0gICAgaW50IGluV2lkdGg7Ci0gICAgaW50IG91dEhlaWdodDsKLSAgICBpbnQgb3V0V2lkdGg7Ci0gICAgZmxvYXQgdGhyZXNob2xkOwotfTsKLXN0cnVjdCBQYXJhbXNfcyAqIFBhcmFtczsKLXN0cnVjdCBJblBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBJblBpeGVsX3MgKiBJblBpeGVsOwotc3RydWN0IE91dFBpeGVsX3N7Ci0gICAgY2hhciBhOwotICAgIGNoYXIgYjsKLSAgICBjaGFyIGc7Ci0gICAgY2hhciByOwotfTsKLXN0cnVjdCBPdXRQaXhlbF9zICogT3V0UGl4ZWw7Ci0qLwotCi1zdHJ1Y3QgY29sb3JfcyB7Ci0gICAgY2hhciBiOwotICAgIGNoYXIgZzsKLSAgICBjaGFyIHI7Ci0gICAgY2hhciBhOwotfTsKLQotdm9pZCBtYWluKCkgewotICAgIGludCB0ID0gdXB0aW1lTWlsbGlzKCk7Ci0KLSAgICBzdHJ1Y3QgY29sb3JfcyAqaW4gPSAoc3RydWN0IGNvbG9yX3MgKikgSW5QaXhlbDsKLSAgICBzdHJ1Y3QgY29sb3JfcyAqb3V0ID0gKHN0cnVjdCBjb2xvcl9zICopIE91dFBpeGVsOwotCi0gICAgaW50IGNvdW50ID0gUGFyYW1zLT5pbldpZHRoICogUGFyYW1zLT5pbkhlaWdodDsKLSAgICBpbnQgaTsKLSAgICBmbG9hdCB0aHJlc2hvbGQgPSAoUGFyYW1zLT50aHJlc2hvbGQgKiAyNTUuZik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBmbG9hdCBsdW1pbmFuY2UgPSAwLjIxMjVmICogaW4tPnIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcxNTRmICogaW4tPmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA3MjFmICogaW4tPmI7Ci0gICAgICAgIGlmIChsdW1pbmFuY2UgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKChpbnQgKilvdXQpID0gKigoaW50ICopaW4pICYgMHhmZjAwMDAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGluKys7Ci0gICAgICAgIG91dCsrOwotICAgIH0KLQotICAgIHQ9IHVwdGltZU1pbGxpcygpIC0gdDsKLSAgICBkZWJ1Z0kzMigiRmlsdGVyIHRpbWUiLCB0KTsKLQotICAgIHNlbmRUb0NsaWVudCgmY291bnQsIDEsIDQsIDApOwotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNWNjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8IS0tIEdlbmVyYWwgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tc2xpZGVyIGxhYmVsIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYmx1cl9kZXNjcmlwdGlvbiI+Qmx1ciBSYWRpdXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX3doaXRlIj5JbiBXaGl0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X3doaXRlIj5PdXQgV2hpdGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImluX2JsYWNrIj5JbiBCbGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ib3V0X2JsYWNrIj5PdXQgQmxhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImdhbW1hIj5HYW1tYTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F0dXJhdGlvbiI+U2F0dXJhdGlvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYmVuY2htYXJrIj5CZW5jaG1hcms8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkuamF2YQppbmRleCA5Y2U1M2Q4Li43NWI4ZDMzIDEwMDY0NAotLS0gYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9JbWFnZVByb2Nlc3NpbmdBY3Rpdml0eS5qYXZhCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL0ltYWdlUHJvY2Vzc2luZ0FjdGl2aXR5LmphdmEKQEAgLTMxLDUzICszMSw1NiBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGphdmEubGFuZy5NYXRoOwogCi1wdWJsaWMgY2xhc3MgSW1hZ2VQcm9jZXNzaW5nQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewotICAgIHByaXZhdGUgQml0bWFwIG1CaXRtYXA7Ci0gICAgcHJpdmF0ZSBQYXJhbXMgbVBhcmFtczsKLSAgICBwcml2YXRlIFNjcmlwdC5JbnZva2FibGUgbUludm9rYWJsZTsKLSAgICBwcml2YXRlIGludFtdIG1JbkRhdGE7Ci0gICAgcHJpdmF0ZSBpbnRbXSBtT3V0RGF0YTsKK3B1YmxpYyBjbGFzcyBJbWFnZVByb2Nlc3NpbmdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwSW47CisgICAgcHJpdmF0ZSBCaXRtYXAgbUJpdG1hcE91dDsKKyAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwU2NyYXRjaDsKKyAgICBwcml2YXRlIFNjcmlwdENfVGhyZXNob2xkIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRDX1ZlcnRpY2FsQmx1ciBtU2NyaXB0VkJsdXI7CisgICAgcHJpdmF0ZSBTY3JpcHRDX0hvcml6b250YWxCbHVyIG1TY3JpcHRIQmx1cjsKKyAgICBwcml2YXRlIGludCBtUmFkaXVzID0gMDsKKyAgICBwcml2YXRlIFNlZWtCYXIgbVJhZGl1c1NlZWtCYXI7CisKKyAgICBwcml2YXRlIGZsb2F0IG1JbkJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbUluQmxhY2tTZWVrQmFyOworICAgIHByaXZhdGUgZmxvYXQgbU91dEJsYWNrID0gMC4wZjsKKyAgICBwcml2YXRlIFNlZWtCYXIgbU91dEJsYWNrU2Vla0JhcjsKKyAgICBwcml2YXRlIGZsb2F0IG1JbldoaXRlID0gMjU1LjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtSW5XaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtT3V0V2hpdGUgPSAyNTUuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1PdXRXaGl0ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBmbG9hdCBtR2FtbWEgPSAxLjBmOworICAgIHByaXZhdGUgU2Vla0JhciBtR2FtbWFTZWVrQmFyOworCisgICAgcHJpdmF0ZSBmbG9hdCBtU2F0dXJhdGlvbiA9IDEuMGY7CisgICAgcHJpdmF0ZSBTZWVrQmFyIG1TYXR1cmF0aW9uU2Vla0JhcjsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUJlbmNobWFya1Jlc3VsdDsKIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHQgbVJTOwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBUeXBlIG1QYXJhbXNUeXBlOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCi0gICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1QYXJhbXNBbGxvY2F0aW9uOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiRmllbGRDYW5CZUxvY2FsIn0pCiAgICAgcHJpdmF0ZSBUeXBlIG1QaXhlbFR5cGU7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJGaWVsZENhbkJlTG9jYWwifSkKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbUluUGl4ZWxzQWxsb2NhdGlvbjsKICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtT3V0UGl4ZWxzQWxsb2NhdGlvbjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkZpZWxkQ2FuQmVMb2NhbCJ9KQorICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24xOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yOwogCiAgICAgcHJpdmF0ZSBTdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7CiAgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbURpc3BsYXlWaWV3OwogCi0gICAgc3RhdGljIGNsYXNzIFBhcmFtcyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgaW5XaWR0aDsKLSAgICAgICAgcHVibGljIGludCBvdXRXaWR0aDsKLSAgICAgICAgcHVibGljIGludCBpbkhlaWdodDsKLSAgICAgICAgcHVibGljIGludCBvdXRIZWlnaHQ7Ci0KLSAgICAgICAgcHVibGljIGZsb2F0IHRocmVzaG9sZDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUGl4ZWwgewotICAgICAgICBwdWJsaWMgYnl0ZSBhOwotICAgICAgICBwdWJsaWMgYnl0ZSByOwotICAgICAgICBwdWJsaWMgYnl0ZSBnOwotICAgICAgICBwdWJsaWMgYnl0ZSBiOwotICAgIH0KLQogICAgIGNsYXNzIEZpbHRlckNhbGxiYWNrIGV4dGVuZHMgUmVuZGVyU2NyaXB0LlJTTWVzc2FnZSB7CiAgICAgICAgIHByaXZhdGUgUnVubmFibGUgbUFjdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbi5yZWFkRGF0YShtT3V0RGF0YSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLm91dFdpZHRoLCBtUGFyYW1zLm91dEhlaWdodCk7CiAgICAgICAgICAgICAgICAgbURpc3BsYXlWaWV3LmludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKQEAgLTg5LDI5ICs5MiwyMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBqYXZhRmlsdGVyKCkgeworICAgIGludCBpbltdOworICAgIGludCBpbnRlcm1bXTsKKyAgICBpbnQgb3V0W107CisgICAgaW50IE1BWF9SQURJVVMgPSAyNTsKKyAgICAvLyBTdG9yZSBvdXIgY29lZmZpY2llbnRzIGhlcmUKKyAgICBmbG9hdCBnYXVzc2lhbltdOworCisgICAgcHJpdmF0ZSBsb25nIGphdmFGaWx0ZXIoKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IG1CaXRtYXBJbi5nZXRXaWR0aCgpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gbUJpdG1hcEluLmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSB3aWR0aCAqIGhlaWdodDsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgaW4gPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgIGludGVybSA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgb3V0ID0gbmV3IGludFtjb3VudF07CisgICAgICAgICAgICBnYXVzc2lhbiA9IG5ldyBmbG9hdFtNQVhfUkFESVVTICogMiArIDFdOworICAgICAgICAgICAgbUJpdG1hcEluLmdldFBpeGVscyhpbiwgMCwgd2lkdGgsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisKICAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpbnQgY291bnQgPSBtUGFyYW1zLmluV2lkdGggKiBtUGFyYW1zLmluSGVpZ2h0OwotICAgICAgICBmbG9hdCB0aHJlc2hvbGQgPSBtUGFyYW1zLnRocmVzaG9sZCAqIDI1NS5mOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgZmxvYXQgciA9IChmbG9hdCkoKG1JbkRhdGFbaV0gPj4gMCkgJiAweGZmKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGcgPSAoZmxvYXQpKChtSW5EYXRhW2ldID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBiID0gKGZsb2F0KSgobUluRGF0YVtpXSA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgaW50IHcsIGgsIHI7CiAKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGx1bWluYW5jZSA9IDAuMjEyNWYgKiByICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzE1NGYgKiBnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDcyMWYgKiBiOwotICAgICAgICAgICAgaWYgKGx1bWluYW5jZSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIG1PdXREYXRhW2ldID0gbUluRGF0YVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU91dERhdGFbaV0gPSBtSW5EYXRhW2ldICYgMHhmZjAwMDAwMDsKKyAgICAgICAgZmxvYXQgZlJhZGl1cyA9IChmbG9hdCltUmFkaXVzOworICAgICAgICBpbnQgcmFkaXVzID0gKGludCltUmFkaXVzOworCisgICAgICAgIC8vIENvbXB1dGUgZ2F1c3NpYW4gd2VpZ2h0cyBmb3IgdGhlIGJsdXIKKyAgICAgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICAgICAgZmxvYXQgZSA9IDIuNzE4MjgxODI4NDU5MDQ1ZjsKKyAgICAgICAgZmxvYXQgcGkgPSAzLjE0MTU5MjY1MzU4OTc5MzJmOworICAgICAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgICAgICAvLyB4IGlzIG9mIHRoZSBmb3JtIFstcmFkaXVzIC4uIDAgLi4gcmFkaXVzXQorICAgICAgICAvLyBhbmQgc2lnbWEgdmFyaWVzIHdpdGggcmFkaXVzLgorICAgICAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgICAgIC8vIHdlIGFwcHJveGltYXRlbHkgZml0IHNpZ21hID0gZihyYWRpdXMpIGFzCisgICAgICAgIC8vIHNpZ21hID0gcmFkaXVzICogMC40ICArIDAuNgorICAgICAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAgICAgLy8gd2lsbCByZXNlbWJsZSBhIGJveCBibHVyIHNpbmNlIHdpdGggbGFyZ2Ugc2lnbWEKKyAgICAgICAgLy8gdGhlIGdhdXNzaWFuIGN1cnZlIGJlZ2lucyB0byBsb3NlIGl0cyBzaGFwZQorICAgICAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiBmUmFkaXVzICsgMC42ZjsKKyAgICAgICAgLy8gTm93IGNvbXB1dGUgdGhlIGNvZWZmaWNpbnRzCisgICAgICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgICAgICAvLyB0aGUgYmx1ciBjYWxjdWxhdGlvbnMKKyAgICAgICAgLy8gcHJlY29tcHV0ZSBzb21lIHZhbHVlcworICAgICAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKGZsb2F0KShNYXRoLnNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgICAgICBmbG9hdCBjb2VmZjIgPSAtIDEuMGYgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpOworICAgICAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgICAgICBmbG9hdCBmbG9hdFIgPSAwLjBmOworICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdID0gY29lZmYxICogKGZsb2F0KU1hdGgucG93KGUsIGZsb2F0UiAqIGZsb2F0UiAqIGNvZWZmMik7CisgICAgICAgICAgICBub3JtYWxpemVGYWN0b3IgKz0gZ2F1c3NpYW5bciArIHJhZGl1c107CisgICAgICAgIH0KKworICAgICAgICAvL05vdyB3ZSBuZWVkIHRvIG5vcm1hbGl6ZSB0aGUgd2VpZ2h0cyBiZWNhdXNlIGFsbCBvdXIgY29lZmZpY2llbnRzIG5lZWQgdG8gYWRkIHVwIHRvIG9uZQorICAgICAgICBub3JtYWxpemVGYWN0b3IgPSAxLjBmIC8gbm9ybWFsaXplRmFjdG9yOworICAgICAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgICAgIGdhdXNzaWFuW3IgKyByYWRpdXNdICo9IG5vcm1hbGl6ZUZhY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICBmbG9hdCBibHVycmVkUGl4ZWxHID0gMC4wZjsKKyAgICAgICAgZmxvYXQgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgIGZsb2F0IGJsdXJyZWRQaXhlbEEgPSAwLjBmOworCisgICAgICAgIGZvcihoID0gMDsgaCA8IGhlaWdodDsgaCArKykgeworICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgd2lkdGg7IHcgKyspIHsKKworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbFIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEcgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEIgPSAwLjBmOworICAgICAgICAgICAgICAgIGJsdXJyZWRQaXhlbEEgPSAwLjBmOworCisgICAgICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICAvLyBTdGVwcGluZyBsZWZ0IGFuZCByaWdodCBhd2F5IGZyb20gdGhlIHBpeGVsCisgICAgICAgICAgICAgICAgICAgIGludCB2YWxpZFcgPSB3ICsgcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gemVybyBhbmQgd2lkdGggbWF4KCkgaXNuJ3QgZXhwb3NlZCBmb3IgaW50cyB5ZXQKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRXIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRXID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZih2YWxpZFcgPiB3aWR0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVyA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCA9IGluW2gqd2lkdGggKyB2YWxpZFddOworCisgICAgICAgICAgICAgICAgICAgIGludCBSID0gKChpbnB1dCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEcgPSAoKGlucHV0ID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICBpbnQgQiA9ICgoaW5wdXQgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEEgPSAoaW5wdXQgJiAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBnYXVzc2lhbltyICsgcmFkaXVzXTsKKworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxSICs9IChmbG9hdCkoUikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxHICs9IChmbG9hdCkoRykqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxCICs9IChmbG9hdCkoQikqd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBibHVycmVkUGl4ZWxBICs9IChmbG9hdCkoQSkqd2VpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBSID0gKGludClibHVycmVkUGl4ZWxSOworICAgICAgICAgICAgICAgIGludCBHID0gKGludClibHVycmVkUGl4ZWxHOworICAgICAgICAgICAgICAgIGludCBCID0gKGludClibHVycmVkUGl4ZWxCOworICAgICAgICAgICAgICAgIGludCBBID0gKGludClibHVycmVkUGl4ZWxBOworCisgICAgICAgICAgICAgICAgaW50ZXJtW2gqd2lkdGggKyB3XSA9IChSIDw8IDI0KSB8IChHIDw8IDE2KSB8IChCIDw8IDgpIHwgKEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGggPSAwOyBoIDwgaGVpZ2h0OyBoICsrKSB7CisgICAgICAgICAgICBmb3IodyA9IDA7IHcgPCB3aWR0aDsgdyArKykgeworCisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiA9IDAuMGY7CisgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSA9IDAuMGY7CisgICAgICAgICAgICAgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsaWRIID0gaCArIHI7CisgICAgICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIHplcm8gYW5kIHdpZHRoCisgICAgICAgICAgICAgICAgICAgIGlmKHZhbGlkSCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYodmFsaWRIID4gaGVpZ2h0IC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIID0gaGVpZ2h0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dCA9IGludGVybVt2YWxpZEgqd2lkdGggKyB3XTsKKworICAgICAgICAgICAgICAgICAgICBpbnQgUiA9ICgoaW5wdXQgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBHID0gKChpbnB1dCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IEIgPSAoKGlucHV0ID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIGludCBBID0gKGlucHV0ICYgMHhmZik7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0ID0gZ2F1c3NpYW5bciArIHJhZGl1c107CisKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsUiArPSAoZmxvYXQpKFIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsRyArPSAoZmxvYXQpKEcpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQiArPSAoZmxvYXQpKEIpKndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgYmx1cnJlZFBpeGVsQSArPSAoZmxvYXQpKEEpKndlaWdodDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgUiA9IChpbnQpYmx1cnJlZFBpeGVsUjsKKyAgICAgICAgICAgICAgICBpbnQgRyA9IChpbnQpYmx1cnJlZFBpeGVsRzsKKyAgICAgICAgICAgICAgICBpbnQgQiA9IChpbnQpYmx1cnJlZFBpeGVsQjsKKyAgICAgICAgICAgICAgICBpbnQgQSA9IChpbnQpYmx1cnJlZFBpeGVsQTsKKworICAgICAgICAgICAgICAgIG91dFtoKndpZHRoICsgd10gPSAoUiA8PCAyNCkgfCAoRyA8PCAxNikgfCAoQiA8PCA4KSB8IChBKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OworICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIkltZyIsICJKYXZhIGZyYW1lIHRpbWUgbXMgIiArIHQpOworICAgICAgICBtQml0bWFwT3V0LnNldFBpeGVscyhvdXQsIDAsIHdpZHRoLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQogCi0gICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgImZyYW1lIHRpbWUgbXMgIiArIHQpOworICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgIGlmIChmcm9tVXNlcikgeworCisgICAgICAgICAgICBpZihzZWVrQmFyID09IG1SYWRpdXNTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZlJhZGl1cyA9IHByb2dyZXNzIC8gMTAwLjBmOworICAgICAgICAgICAgICAgIGZSYWRpdXMgKj0gKGZsb2F0KShNQVhfUkFESVVTKTsKKyAgICAgICAgICAgICAgICBtUmFkaXVzID0gKGludClmUmFkaXVzOworCisgICAgICAgICAgICAgICAgbVNjcmlwdC5zZXRfcmFkaXVzKG1SYWRpdXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1JbkJsYWNrU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1JbkJsYWNrID0gKGZsb2F0KXByb2dyZXNzOworICAgICAgICAgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0TGV2ZWxzKG1JbkJsYWNrLCBtT3V0QmxhY2ssIG1JbldoaXRlLCBtT3V0V2hpdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1PdXRCbGFja1NlZWtCYXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0QmxhY2sgPSAoZmxvYXQpcHJvZ3Jlc3M7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbUluV2hpdGVTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUluV2hpdGUgPSAoZmxvYXQpcHJvZ3Jlc3MgKyAxMjcuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKHNlZWtCYXIgPT0gbU91dFdoaXRlU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1PdXRXaGl0ZSA9IChmbG9hdClwcm9ncmVzcyArIDEyNy4wZjsKKyAgICAgICAgICAgICAgICBtU2NyaXB0VkJsdXIuaW52b2tlX3NldExldmVscyhtSW5CbGFjaywgbU91dEJsYWNrLCBtSW5XaGl0ZSwgbU91dFdoaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoc2Vla0JhciA9PSBtR2FtbWFTZWVrQmFyKSB7CisgICAgICAgICAgICAgICAgbUdhbW1hID0gKGZsb2F0KXByb2dyZXNzLzEwMC4wZjsKKyAgICAgICAgICAgICAgICBtR2FtbWEgPSBNYXRoLm1heChtR2FtbWEsIDAuMWYpOworICAgICAgICAgICAgICAgIG1HYW1tYSA9IDEuMGYgLyBtR2FtbWE7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRHYW1tYShtR2FtbWEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihzZWVrQmFyID09IG1TYXR1cmF0aW9uU2Vla0JhcikgeworICAgICAgICAgICAgICAgIG1TYXR1cmF0aW9uID0gKGZsb2F0KXByb2dyZXNzIC8gNTAuMGY7CisgICAgICAgICAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRTYXR1cmF0aW9uKG1TYXR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBtUlMuZmluaXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGphdmFGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBtRGlzcGxheVZpZXcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIlJlbmRlcnNjcmlwdCBmcmFtZSB0aW1lIGNvcmUgbXMgIiArIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOSw0NSArMzExLDU0IEBACiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOwogCi0gICAgICAgIG1CaXRtYXAgPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CisgICAgICAgIG1CaXRtYXBJbiA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcE91dCA9IGxvYWRCaXRtYXAoUi5kcmF3YWJsZS5kYXRhKTsKKyAgICAgICAgbUJpdG1hcFNjcmF0Y2ggPSBsb2FkQml0bWFwKFIuZHJhd2FibGUuZGF0YSk7CiAKICAgICAgICAgbVN1cmZhY2VWaWV3ID0gKFN1cmZhY2VWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdXJmYWNlKTsKICAgICAgICAgbVN1cmZhY2VWaWV3LmdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOwogCiAgICAgICAgIG1EaXNwbGF5VmlldyA9IChJbWFnZVZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRpc3BsYXkpOwotICAgICAgICBtRGlzcGxheVZpZXcuc2V0SW1hZ2VCaXRtYXAobUJpdG1hcCk7CisgICAgICAgIG1EaXNwbGF5Vmlldy5zZXRJbWFnZUJpdG1hcChtQml0bWFwT3V0KTsKIAotICAgICAgICAoKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnRocmVzaG9sZCkpLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy50aHJlc2hvbGQgPSBwcm9ncmVzcyAvIDEwMC4wZjsKLSAgICAgICAgICAgICAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucmFkaXVzKTsKKyAgICAgICAgbVJhZGl1c1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnZva2FibGUuZXhlY3V0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRQaXhlbHMobU91dERhdGEsIDAsIG1QYXJhbXMub3V0V2lkdGgsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMub3V0V2lkdGgsIG1QYXJhbXMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5Vmlldy5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIG1JbkJsYWNrU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluQmxhY2spOworICAgICAgICBtSW5CbGFja1NlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1JbkJsYWNrU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbUluQmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQub3V0QmxhY2spOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtT3V0QmxhY2tTZWVrQmFyLnNldFByb2dyZXNzKDApOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgbUluV2hpdGVTZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5XaGl0ZSk7CisgICAgICAgIG1JbldoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluV2hpdGVTZWVrQmFyLnNldE1heCgxMjgpOworICAgICAgICBtSW5XaGl0ZVNlZWtCYXIuc2V0UHJvZ3Jlc3MoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLm91dFdoaXRlKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRNYXgoMTI4KTsKKyAgICAgICAgbU91dFdoaXRlU2Vla0Jhci5zZXRQcm9ncmVzcygxMjgpOwogCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgbUdhbW1hU2Vla0JhciA9IChTZWVrQmFyKWZpbmRWaWV3QnlJZChSLmlkLmluR2FtbWEpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldE1heCgxNTApOworICAgICAgICBtR2FtbWFTZWVrQmFyLnNldFByb2dyZXNzKDEwMCk7CisKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyID0gKFNlZWtCYXIpZmluZFZpZXdCeUlkKFIuaWQuaW5TYXR1cmF0aW9uKTsKKyAgICAgICAgbVNhdHVyYXRpb25TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBtU2F0dXJhdGlvblNlZWtCYXIuc2V0UHJvZ3Jlc3MoNTApOworCisgICAgICAgIG1CZW5jaG1hcmtSZXN1bHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmJlbmNobWFya1RleHQpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIkJlbmNobWFyayBubyB5ZXQgcnVuIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgbVBhcmFtcyA9IGNyZWF0ZVBhcmFtcygpOwotICAgICAgICBtSW52b2thYmxlID0gY3JlYXRlU2NyaXB0KCk7Ci0KLSAgICAgICAgbUludm9rYWJsZS5leGVjdXRlKCk7CisgICAgICAgIGNyZWF0ZVNjcmlwdCgpOworICAgICAgICBtU2NyaXB0Lmludm9rZV9maWx0ZXIoKTsKKyAgICAgICAgbVJTLmZpbmlzaCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTE2Niw1NCArMzY3LDM4IEBACiAgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgewogICAgIH0KIAotICAgIHByaXZhdGUgU2NyaXB0Lkludm9rYWJsZSBjcmVhdGVTY3JpcHQoKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNjcmlwdCgpIHsKICAgICAgICAgbVJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZSgpOwogICAgICAgICBtUlMubU1lc3NhZ2VDYWxsYmFjayA9IG5ldyBGaWx0ZXJDYWxsYmFjaygpOwogCi0gICAgICAgIG1QYXJhbXNUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQYXJhbXMuY2xhc3MsIDEsICJQYXJhbWV0ZXJzIik7Ci0gICAgICAgIG1QYXJhbXNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIG1QYXJhbXNUeXBlKTsKLSAgICAgICAgbVBhcmFtc0FsbG9jYXRpb24uZGF0YShtUGFyYW1zKTsKKyAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbiA9IEFsbG9jYXRpb24uY3JlYXRlQml0bWFwUmVmKG1SUywgbUJpdG1hcEluKTsKKyAgICAgICAgbU91dFBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUJpdG1hcFJlZihtUlMsIG1CaXRtYXBPdXQpOwogCi0gICAgICAgIGZpbmFsIGludCBwaXhlbENvdW50ID0gbVBhcmFtcy5pbldpZHRoICogbVBhcmFtcy5pbkhlaWdodDsKKyAgICAgICAgVHlwZS5CdWlsZGVyIHRiID0gbmV3IFR5cGUuQnVpbGRlcihtUlMsIEVsZW1lbnQuRjMyXzQobVJTKSk7CisgICAgICAgIHRiLmFkZChhbmRyb2lkLnJlbmRlcnNjcmlwdC5EaW1lbnNpb24uWCwgbUJpdG1hcEluLmdldFdpZHRoKCkpOworICAgICAgICB0Yi5hZGQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRGltZW5zaW9uLlksIG1CaXRtYXBJbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKG1SUywgdGIuY3JlYXRlKCkpOworICAgICAgICBtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsIHRiLmNyZWF0ZSgpKTsKIAotICAgICAgICBtUGl4ZWxUeXBlID0gVHlwZS5jcmVhdGVGcm9tQ2xhc3MobVJTLCBQaXhlbC5jbGFzcywgMSwgIlBpeGVsIik7Ci0gICAgICAgIG1JblBpeGVsc0FsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZVNpemVkKG1SUywKLSAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVVzZXIobVJTLCBFbGVtZW50LkRhdGFUeXBlLlNJR05FRF8zMiksCi0gICAgICAgICAgICAgICAgcGl4ZWxDb3VudCk7Ci0gICAgICAgIG1PdXRQaXhlbHNBbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChtUlMsCi0gICAgICAgICAgICAgICAgRWxlbWVudC5jcmVhdGVVc2VyKG1SUywgRWxlbWVudC5EYXRhVHlwZS5TSUdORURfMzIpLAotICAgICAgICAgICAgICAgIHBpeGVsQ291bnQpOworICAgICAgICBtU2NyaXB0VkJsdXIgPSBuZXcgU2NyaXB0Q19WZXJ0aWNhbEJsdXIobVJTLCBnZXRSZXNvdXJjZXMoKSwgUi5yYXcudmVydGljYWxibHVyLCBmYWxzZSk7CisgICAgICAgIG1TY3JpcHRIQmx1ciA9IG5ldyBTY3JpcHRDX0hvcml6b250YWxCbHVyKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3Lmhvcml6b250YWxibHVyLCBmYWxzZSk7CiAKLSAgICAgICAgbUluRGF0YSA9IG5ldyBpbnRbcGl4ZWxDb3VudF07Ci0gICAgICAgIG1CaXRtYXAuZ2V0UGl4ZWxzKG1JbkRhdGEsIDAsIG1QYXJhbXMuaW5XaWR0aCwgMCwgMCwgbVBhcmFtcy5pbldpZHRoLCBtUGFyYW1zLmluSGVpZ2h0KTsKLSAgICAgICAgbUluUGl4ZWxzQWxsb2NhdGlvbi5kYXRhKG1JbkRhdGEpOworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfVGhyZXNob2xkKG1SUywgZ2V0UmVzb3VyY2VzKCksIFIucmF3LnRocmVzaG9sZCwgZmFsc2UpOworICAgICAgICBtU2NyaXB0LnNldF93aWR0aChtQml0bWFwSW4uZ2V0V2lkdGgoKSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2hlaWdodChtQml0bWFwSW4uZ2V0SGVpZ2h0KCkpOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CiAKLSAgICAgICAgbU91dERhdGEgPSBuZXcgaW50W3BpeGVsQ291bnRdOwotICAgICAgICBtT3V0UGl4ZWxzQWxsb2NhdGlvbi5kYXRhKG1PdXREYXRhKTsKKyAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRMZXZlbHMobUluQmxhY2ssIG1PdXRCbGFjaywgbUluV2hpdGUsIG1PdXRXaGl0ZSk7CisgICAgICAgIG1TY3JpcHRWQmx1ci5pbnZva2Vfc2V0R2FtbWEobUdhbW1hKTsKKyAgICAgICAgbVNjcmlwdFZCbHVyLmludm9rZV9zZXRTYXR1cmF0aW9uKG1TYXR1cmF0aW9uKTsKIAotICAgICAgICBTY3JpcHRDLkJ1aWxkZXIgc2IgPSBuZXcgU2NyaXB0Qy5CdWlsZGVyKG1SUyk7Ci0gICAgICAgIHNiLnNldFR5cGUobVBhcmFtc1R5cGUsICJQYXJhbXMiLCAwKTsKLSAgICAgICAgc2Iuc2V0VHlwZShtUGl4ZWxUeXBlLCAiSW5QaXhlbCIsIDEpOwotICAgICAgICBzYi5zZXRUeXBlKG1QaXhlbFR5cGUsICJPdXRQaXhlbCIsIDIpOwotICAgICAgICBzYi5zZXRUeXBlKHRydWUsIDIpOwotICAgICAgICBTY3JpcHQuSW52b2thYmxlIGludm9rYWJsZSA9IHNiLmFkZEludm9rYWJsZSgibWFpbiIpOwotICAgICAgICBzYi5zZXRTY3JpcHQoZ2V0UmVzb3VyY2VzKCksIFIucmF3LnRocmVzaG9sZCk7Ci0gICAgICAgIC8vc2Iuc2V0Um9vdCh0cnVlKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX0luUGl4ZWwobUluUGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9PdXRQaXhlbChtT3V0UGl4ZWxzQWxsb2NhdGlvbik7CisgICAgICAgIG1TY3JpcHQuYmluZF9TY3JhdGNoUGl4ZWwxKG1TY3JhdGNoUGl4ZWxzQWxsb2NhdGlvbjEpOworICAgICAgICBtU2NyaXB0LmJpbmRfU2NyYXRjaFBpeGVsMihtU2NyYXRjaFBpeGVsc0FsbG9jYXRpb24yKTsKIAotICAgICAgICBTY3JpcHRDIHNjcmlwdCA9IHNiLmNyZWF0ZSgpOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obVBhcmFtc0FsbG9jYXRpb24sIDApOwotICAgICAgICBzY3JpcHQuYmluZEFsbG9jYXRpb24obUluUGl4ZWxzQWxsb2NhdGlvbiwgMSk7Ci0gICAgICAgIHNjcmlwdC5iaW5kQWxsb2NhdGlvbihtT3V0UGl4ZWxzQWxsb2NhdGlvbiwgMik7Ci0KLSAgICAgICAgcmV0dXJuIGludm9rYWJsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhcmFtcyBjcmVhdGVQYXJhbXMoKSB7Ci0gICAgICAgIGZpbmFsIFBhcmFtcyBwYXJhbXMgPSBuZXcgUGFyYW1zKCk7Ci0gICAgICAgIHBhcmFtcy5pbldpZHRoID0gcGFyYW1zLm91dFdpZHRoID0gbUJpdG1hcC5nZXRXaWR0aCgpOwotICAgICAgICBwYXJhbXMuaW5IZWlnaHQgPSBwYXJhbXMub3V0SGVpZ2h0ID0gbUJpdG1hcC5nZXRIZWlnaHQoKTsKLSAgICAgICAgcGFyYW1zLnRocmVzaG9sZCA9IDAuNWY7Ci0gICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgICAgIG1TY3JpcHQuc2V0X3ZCbHVyU2NyaXB0KG1TY3JpcHRWQmx1cik7CisgICAgICAgIG1TY3JpcHQuc2V0X2hCbHVyU2NyaXB0KG1TY3JpcHRIQmx1cik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBCaXRtYXAgbG9hZEJpdG1hcChpbnQgcmVzb3VyY2UpIHsKQEAgLTIyOSw0ICs0MTQsMzAgQEAKICAgICAgICAgc291cmNlLnJlY3ljbGUoKTsKICAgICAgICAgcmV0dXJuIGI7CiAgICAgfQorCisgICAgLy8gYnV0dG9uIGhvb2sKKyAgICBwdWJsaWMgdm9pZCBiZW5jaG1hcmsoVmlldyB2KSB7CisgICAgICAgIGFuZHJvaWQudXRpbC5Mb2cudigiSW1nIiwgIkJlbmNobWFya2luZyIpOworICAgICAgICBpbnQgb2xkUmFkaXVzID0gbVJhZGl1czsKKyAgICAgICAgbVJhZGl1cyA9IE1BWF9SQURJVVM7CisgICAgICAgIG1TY3JpcHQuc2V0X3JhZGl1cyhtUmFkaXVzKTsKKworICAgICAgICBsb25nIHQgPSBqYXZhLmxhbmcuU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgIG1SUy5maW5pc2goKTsKKworICAgICAgICB0ID0gamF2YS5sYW5nLlN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDsKKyAgICAgICAgYW5kcm9pZC51dGlsLkxvZy52KCJJbWciLCAiUmVuZGVyc2NyaXB0IGZyYW1lIHRpbWUgY29yZSBtcyAiICsgdCk7CisKKyAgICAgICAgLy9sb25nIGphdmFUaW1lID0gamF2YUZpbHRlcigpOworICAgICAgICAvL21CZW5jaG1hcmtSZXN1bHQuc2V0VGV4dCgiUlM6ICIgKyB0ICsgIiBtcyAgSmF2YTogIiArIGphdmFUaW1lICsgIiBtcyIpOworICAgICAgICBtQmVuY2htYXJrUmVzdWx0LnNldFRleHQoIlJTOiAiICsgdCArICIgbXMiKTsKKworICAgICAgICBtUmFkaXVzID0gb2xkUmFkaXVzOworICAgICAgICBtU2NyaXB0LnNldF9yYWRpdXMobVJhZGl1cyk7CisKKyAgICAgICAgbVNjcmlwdC5pbnZva2VfZmlsdGVyKCk7CisgICAgICAgIG1SUy5maW5pc2goKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9ob3Jpem9udGFsX2JsdXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmZmFjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2hvcml6b250YWxfYmx1ci5ycwpAQCAtMCwwICsxLDMwIEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI2luY2x1ZGUgImlwLnJzaCIKKwordm9pZCByb290KGNvbnN0IHZvaWQgKnZfaW4sIHZvaWQgKnZfb3V0LCBjb25zdCB2b2lkICp1c3JEYXRhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgZmxvYXQ0ICpvdXRwdXQgPSAoZmxvYXQ0ICopdl9vdXQ7CisgICAgY29uc3QgRmlsdGVyU3RydWN0ICpmcyA9IChjb25zdCBGaWx0ZXJTdHJ1Y3QgKil1c3JEYXRhOworICAgIGNvbnN0IGZsb2F0NCAqaW5wdXQgPSAoY29uc3QgZmxvYXQ0ICopcnNHZXRFbGVtZW50QXQoZnMtPmFpbiwgMCwgeSk7CisKKyAgICBmbG9hdDMgYmx1cnJlZFBpeGVsID0gMDsKKyAgICBjb25zdCBmbG9hdCAqZ1B0ciA9IGZzLT5nYXVzc2lhbjsKKyAgICBpZiAoKHggPiBmcy0+cmFkaXVzKSAmJiAoeCA8IChmcy0+d2lkdGggLSBmcy0+cmFkaXVzKSkpIHsKKyAgICAgICAgY29uc3QgZmxvYXQ0ICppID0gaW5wdXQgKyAoeCAtIGZzLT5yYWRpdXMpOworICAgICAgICBmb3IoaW50IHIgPSAtZnMtPnJhZGl1czsgciA8PSBmcy0+cmFkaXVzOyByICsrKSB7CisgICAgICAgICAgICBibHVycmVkUGl4ZWwgKz0gaS0+eHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIC8vIFN0ZXBwaW5nIGxlZnQgYW5kIHJpZ2h0IGF3YXkgZnJvbSB0aGUgcGl4ZWwKKyAgICAgICAgICAgIGludCB2YWxpZFcgPSByc0NsYW1wKHggKyByLCAodWludCkwLCAodWludCkoZnMtPndpZHRoIC0gMSkpOworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGlucHV0W3ZhbGlkV10ueHl6ICogZ1B0clswXTsKKyAgICAgICAgICAgIGdQdHIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dHB1dC0+eHl6ID0gYmx1cnJlZFBpeGVsOworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2ggYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS9pcC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3YTcxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL2lwLnJzaApAQCAtMCwwICsxLDE1IEBACisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmltYWdlKQorCisjZGVmaW5lIE1BWF9SQURJVVMgMjUKKwordHlwZWRlZiBzdHJ1Y3QgRmlsdGVyU3RydWN0X3MgeworICAgIHJzX2FsbG9jYXRpb24gYWluOworCisgICAgZmxvYXQgKmdhdXNzaWFuOyAvL1tNQVhfUkFESVVTICogMiArIDFdOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHdpZHRoOworICAgIGludCByYWRpdXM7CisKK30gRmlsdGVyU3RydWN0OworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3RocmVzaG9sZC5ycyBiL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3RocmVzaG9sZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk0NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL0ltYWdlUHJvY2Vzc2luZy9zcmMvY29tL2FuZHJvaWQvcnMvaW1hZ2UvdGhyZXNob2xkLnJzCkBAIC0wLDAgKzEsOTcgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCitpbnQgaGVpZ2h0OworaW50IHdpZHRoOworaW50IHJhZGl1czsKKwordWNoYXI0ICogSW5QaXhlbDsKK3VjaGFyNCAqIE91dFBpeGVsOworZmxvYXQ0ICogU2NyYXRjaFBpeGVsMTsKK2Zsb2F0NCAqIFNjcmF0Y2hQaXhlbDI7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihoZWlnaHQsIHdpZHRoLCByYWRpdXMsIEluUGl4ZWwsIE91dFBpeGVsLCBTY3JhdGNoUGl4ZWwxLCBTY3JhdGNoUGl4ZWwyLCB2Qmx1clNjcmlwdCwgaEJsdXJTY3JpcHQpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGZpbHRlcik7CisKK3JzX3NjcmlwdCB2Qmx1clNjcmlwdDsKK3JzX3NjcmlwdCBoQmx1clNjcmlwdDsKKworY29uc3QgaW50IENNRF9GSU5JU0hFRCA9IDE7CisKKy8vIFN0b3JlIG91ciBjb2VmZmljaWVudHMgaGVyZQorc3RhdGljIGZsb2F0IGdhdXNzaWFuW01BWF9SQURJVVMgKiAyICsgMV07CisKKworc3RhdGljIHZvaWQgY29tcHV0ZUdhdXNzaWFuV2VpZ2h0cygpIHsKKyAgICAvLyBDb21wdXRlIGdhdXNzaWFuIHdlaWdodHMgZm9yIHRoZSBibHVyCisgICAgLy8gZSBpcyB0aGUgZXVsZXIncyBudW1iZXIKKyAgICBmbG9hdCBlID0gMi43MTgyODE4Mjg0NTkwNDVmOworICAgIGZsb2F0IHBpID0gMy4xNDE1OTI2NTM1ODk3OTMyZjsKKyAgICAvLyBnKHgpID0gKCAxIC8gc3FydCggMiAqIHBpICkgKiBzaWdtYSkgKiBlIF4gKCAteF4yIC8gMiAqIHNpZ21hXjIgKQorICAgIC8vIHggaXMgb2YgdGhlIGZvcm0gWy1yYWRpdXMgLi4gMCAuLiByYWRpdXNdCisgICAgLy8gYW5kIHNpZ21hIHZhcmllcyB3aXRoIHJhZGl1cy4KKyAgICAvLyBCYXNlZCBvbiBzb21lIGV4cGVyaW1lbnRhbCByYWRpdXMgdmFsdWVzIGFuZCBzaWdtYSdzCisgICAgLy8gd2UgYXBwcm94aW1hdGVseSBmaXQgc2lnbWEgPSBmKHJhZGl1cykgYXMKKyAgICAvLyBzaWdtYSA9IHJhZGl1cyAqIDAuNCAgKyAwLjYKKyAgICAvLyBUaGUgbGFyZ2VyIHRoZSByYWRpdXMgZ2V0cywgdGhlIG1vcmUgb3VyIGdhdXNzaWFuIGJsdXIKKyAgICAvLyB3aWxsIHJlc2VtYmxlIGEgYm94IGJsdXIgc2luY2Ugd2l0aCBsYXJnZSBzaWdtYQorICAgIC8vIHRoZSBnYXVzc2lhbiBjdXJ2ZSBiZWdpbnMgdG8gbG9zZSBpdHMgc2hhcGUKKyAgICBmbG9hdCBzaWdtYSA9IDAuNGYgKiAoZmxvYXQpcmFkaXVzICsgMC42ZjsKKworICAgIC8vIE5vdyBjb21wdXRlIHRoZSBjb2VmZmljaW50cworICAgIC8vIFdlIHdpbGwgc3RvcmUgc29tZSByZWR1bmRhbnQgdmFsdWVzIHRvIHNhdmUgc29tZSBtYXRoIGR1cmluZworICAgIC8vIHRoZSBibHVyIGNhbGN1bGF0aW9ucworICAgIC8vIHByZWNvbXB1dGUgc29tZSB2YWx1ZXMKKyAgICBmbG9hdCBjb2VmZjEgPSAxLjBmIC8gKHNxcnQoIDIuMGYgKiBwaSApICogc2lnbWEpOworICAgIGZsb2F0IGNvZWZmMiA9IC0gMS4wZiAvICgyLjBmICogc2lnbWEgKiBzaWdtYSk7CisKKyAgICBmbG9hdCBub3JtYWxpemVGYWN0b3IgPSAwLjBmOworICAgIGZsb2F0IGZsb2F0UiA9IDAuMGY7CisgICAgaW50IHI7CisgICAgZm9yKHIgPSAtcmFkaXVzOyByIDw9IHJhZGl1czsgciArKykgeworICAgICAgICBmbG9hdFIgPSAoZmxvYXQpcjsKKyAgICAgICAgZ2F1c3NpYW5bciArIHJhZGl1c10gPSBjb2VmZjEgKiBwb3coZSwgZmxvYXRSICogZmxvYXRSICogY29lZmYyKTsKKyAgICAgICAgbm9ybWFsaXplRmFjdG9yICs9IGdhdXNzaWFuW3IgKyByYWRpdXNdOworICAgIH0KKworICAgIC8vTm93IHdlIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB3ZWlnaHRzIGJlY2F1c2UgYWxsIG91ciBjb2VmZmljaWVudHMgbmVlZCB0byBhZGQgdXAgdG8gb25lCisgICAgbm9ybWFsaXplRmFjdG9yID0gMS4wZiAvIG5vcm1hbGl6ZUZhY3RvcjsKKyAgICBmb3IociA9IC1yYWRpdXM7IHIgPD0gcmFkaXVzOyByICsrKSB7CisgICAgICAgIGZsb2F0UiA9IChmbG9hdClyOworICAgICAgICBnYXVzc2lhbltyICsgcmFkaXVzXSAqPSBub3JtYWxpemVGYWN0b3I7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNvcHlJbnB1dCgpIHsKKyAgICBSU19ERUJVR19NQVJLRVI7CisgICAgcnNfYWxsb2NhdGlvbiBhaW4gPSByc0dldEFsbG9jYXRpb24oSW5QaXhlbCk7CisgICAgdWludDMyX3QgZGlteCA9IHJzQWxsb2NhdGlvbkdldERpbVgoYWluKTsKKyAgICB1aW50MzJfdCBkaW15ID0gcnNBbGxvY2F0aW9uR2V0RGltWShhaW4pOworICAgIGZvcih1aW50MzJfdCB5ID0gMDsgeSA8IGRpbXk7IHkrKykgeworICAgICAgICBmb3IodWludDMyX3QgeCA9IDA7IHggPCBkaW14OyB4KyspIHsKKyAgICAgICAgICAgIFNjcmF0Y2hQaXhlbDFbeCArIHkgKiBkaW14XSA9IGNvbnZlcnRfZmxvYXQ0KEluUGl4ZWxbeCArIHkgKiBkaW14XSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUlNfREVCVUdfTUFSS0VSOworfQorCit2b2lkIGZpbHRlcigpIHsKKyAgICBjb3B5SW5wdXQoKTsKKyAgICBjb21wdXRlR2F1c3NpYW5XZWlnaHRzKCk7CisKKyAgICBGaWx0ZXJTdHJ1Y3QgZnM7CisgICAgZnMuZ2F1c3NpYW4gPSBnYXVzc2lhbjsKKyAgICBmcy53aWR0aCA9IHdpZHRoOworICAgIGZzLmhlaWdodCA9IGhlaWdodDsKKyAgICBmcy5yYWRpdXMgPSByYWRpdXM7CisKKyAgICBmcy5haW4gPSByc0dldEFsbG9jYXRpb24oU2NyYXRjaFBpeGVsMSk7CisgICAgcnNGb3JFYWNoKGhCbHVyU2NyaXB0LCBmcy5haW4sIHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwyKSwgJmZzKTsKKworICAgIGZzLmFpbiA9IHJzR2V0QWxsb2NhdGlvbihTY3JhdGNoUGl4ZWwyKTsKKyAgICByc0ZvckVhY2godkJsdXJTY3JpcHQsIGZzLmFpbiwgcnNHZXRBbGxvY2F0aW9uKE91dFBpeGVsKSwgJmZzKTsKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKENNRF9GSU5JU0hFRCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9JbWFnZVByb2Nlc3Npbmcvc3JjL2NvbS9hbmRyb2lkL3JzL2ltYWdlL3ZlcnRpY2FsX2JsdXIucnMgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS92ZXJ0aWNhbF9ibHVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDFkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvSW1hZ2VQcm9jZXNzaW5nL3NyYy9jb20vYW5kcm9pZC9ycy9pbWFnZS92ZXJ0aWNhbF9ibHVyLnJzCkBAIC0wLDAgKzEsOTIgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjaW5jbHVkZSAiaXAucnNoIgorCitzdGF0aWMgZmxvYXQgaW5CbGFjazsKK3N0YXRpYyBmbG9hdCBvdXRCbGFjazsKK3N0YXRpYyBmbG9hdCBpbldoaXRlOworc3RhdGljIGZsb2F0IG91dFdoaXRlOworc3RhdGljIGZsb2F0MyBnYW1tYTsKK3N0YXRpYyBmbG9hdCBzYXR1cmF0aW9uOworCitzdGF0aWMgZmxvYXQgaW5XTWluSW5COworc3RhdGljIGZsb2F0IG91dFdNaW5PdXRCOworc3RhdGljIGZsb2F0IG92ZXJJbldNaW5JbkI7CitzdGF0aWMgcnNfbWF0cml4M3gzIGNvbG9yTWF0OworCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKHNldExldmVscywgc2V0U2F0dXJhdGlvbiwgc2V0R2FtbWEpOworCit2b2lkIHNldExldmVscyhmbG9hdCBpQmxrLCBmbG9hdCBvQmxrLCBmbG9hdCBpV2h0LCBmbG9hdCBvV2h0KSB7CisgICAgaW5CbGFjayA9IGlCbGs7CisgICAgb3V0QmxhY2sgPSBvQmxrOworICAgIGluV2hpdGUgPSBpV2h0OworICAgIG91dFdoaXRlID0gb1dodDsKKworICAgIGluV01pbkluQiA9IGluV2hpdGUgLSBpbkJsYWNrOworICAgIG91dFdNaW5PdXRCID0gb3V0V2hpdGUgLSBvdXRCbGFjazsKKyAgICBvdmVySW5XTWluSW5CID0gMS5mIC8gaW5XTWluSW5COworfQorCit2b2lkIHNldFNhdHVyYXRpb24oZmxvYXQgc2F0KSB7CisgICAgc2F0dXJhdGlvbiA9IHNhdDsKKworICAgIC8vIFNhdHVyYXRpb24KKyAgICAvLyBMaW5lYXIgd2VpZ2h0cworICAgIC8vZmxvYXQgcldlaWdodCA9IDAuMzA4NmY7CisgICAgLy9mbG9hdCBnV2VpZ2h0ID0gMC42MDk0ZjsKKyAgICAvL2Zsb2F0IGJXZWlnaHQgPSAwLjA4MjBmOworCisgICAgLy8gR2FtbWEgMi4yIHdlaWdodHMgKHdlIGhhdmVuJ3QgY29udmVydGVkIG91ciBpbWFnZSB0byBsaW5lYXIgc3BhY2UgeWV0IGZvciBwZXJmIHJlYXNvbnMpCisgICAgZmxvYXQgcldlaWdodCA9IDAuMjk5ZjsKKyAgICBmbG9hdCBnV2VpZ2h0ID0gMC41ODdmOworICAgIGZsb2F0IGJXZWlnaHQgPSAwLjExNGY7CisKKyAgICBmbG9hdCBvbmVNaW51c1MgPSAxLjBmIC0gc2F0dXJhdGlvbjsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDAsIG9uZU1pbnVzUyAqIHJXZWlnaHQgKyBzYXR1cmF0aW9uKTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDAsIDEsIG9uZU1pbnVzUyAqIHJXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMCwgMiwgb25lTWludXNTICogcldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAxLCAwLCBvbmVNaW51c1MgKiBnV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDEsIDEsIG9uZU1pbnVzUyAqIGdXZWlnaHQgKyBzYXR1cmF0aW9uKTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDEsIDIsIG9uZU1pbnVzUyAqIGdXZWlnaHQpOworICAgIHJzTWF0cml4U2V0KCZjb2xvck1hdCwgMiwgMCwgb25lTWludXNTICogYldlaWdodCk7CisgICAgcnNNYXRyaXhTZXQoJmNvbG9yTWF0LCAyLCAxLCBvbmVNaW51c1MgKiBiV2VpZ2h0KTsKKyAgICByc01hdHJpeFNldCgmY29sb3JNYXQsIDIsIDIsIG9uZU1pbnVzUyAqIGJXZWlnaHQgKyBzYXR1cmF0aW9uKTsKK30KKwordm9pZCBzZXRHYW1tYShmbG9hdCBnKSB7CisgICAgZ2FtbWEgPSAoZmxvYXQzKWc7Cit9CisKK3ZvaWQgcm9vdChjb25zdCB2b2lkICp2X2luLCB2b2lkICp2X291dCwgY29uc3Qgdm9pZCAqdXNyRGF0YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkgeworICAgIHVjaGFyNCAqb3V0cHV0ID0gKHVjaGFyNCAqKXZfb3V0OworICAgIGNvbnN0IEZpbHRlclN0cnVjdCAqZnMgPSAoY29uc3QgRmlsdGVyU3RydWN0ICopdXNyRGF0YTsKKyAgICBjb25zdCBmbG9hdDQgKmlucHV0ID0gKGNvbnN0IGZsb2F0NCAqKXJzR2V0RWxlbWVudEF0KGZzLT5haW4sIHgsIDApOworCisgICAgZmxvYXQzIGJsdXJyZWRQaXhlbCA9IDA7CisgICAgY29uc3QgZmxvYXQgKmdQdHIgPSBmcy0+Z2F1c3NpYW47CisgICAgaWYgKCh5ID4gZnMtPnJhZGl1cykgJiYgKHkgPCAoZnMtPmhlaWdodCAtIGZzLT5yYWRpdXMpKSkgeworICAgICAgICBjb25zdCBmbG9hdDQgKmkgPSBpbnB1dCArICgoeSAtIGZzLT5yYWRpdXMpICogZnMtPndpZHRoKTsKKyAgICAgICAgZm9yKGludCByID0gLWZzLT5yYWRpdXM7IHIgPD0gZnMtPnJhZGl1czsgciArKykgeworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGktPnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgICAgICBpICs9IGZzLT53aWR0aDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpbnQgciA9IC1mcy0+cmFkaXVzOyByIDw9IGZzLT5yYWRpdXM7IHIgKyspIHsKKyAgICAgICAgICAgIGludCB2YWxpZEggPSByc0NsYW1wKHkgKyByLCAodWludCkwLCAodWludCkoZnMtPmhlaWdodCAtIDEpKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0NCAqaSA9IGlucHV0ICsgdmFsaWRIICogZnMtPndpZHRoOworICAgICAgICAgICAgYmx1cnJlZFBpeGVsICs9IGktPnh5eiAqIGdQdHJbMF07CisgICAgICAgICAgICBnUHRyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdDMgdGVtcCA9IHJzTWF0cml4TXVsdGlwbHkoJmNvbG9yTWF0LCBibHVycmVkUGl4ZWwpOworICAgIHRlbXAgPSAoY2xhbXAodGVtcCwgMC5mLCAyNTUuZikgLSBpbkJsYWNrKSAqIG92ZXJJbldNaW5JbkI7CisgICAgaWYgKGdhbW1hLnggIT0gMS4wZikKKyAgICAgICAgdGVtcCA9IHBvdyh0ZW1wLCAoZmxvYXQzKWdhbW1hKTsKKyAgICB0ZW1wID0gY2xhbXAodGVtcCAqIG91dFdNaW5PdXRCICsgb3V0QmxhY2ssIDAuZiwgMjU1LmYpOworCisgICAgb3V0cHV0LT54eXogPSBjb252ZXJ0X3VjaGFyMyh0ZW1wKTsKKyAgICAvL291dHB1dC0+dyA9IGlucHV0LT53OworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tayBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTc3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gTW9kZWxWaWV3ZXIKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tb2RlbHZpZXdlciI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1vZGVsVmlld2VyIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU2ltcGxlTW9kZWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTaW1wbGVNb2RlbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NyZWVuT3JpZW50YXRpb249InBvcnRyYWl0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlNjZW5lR3JhcGgiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJTY2VuZUdyYXBoIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvZHJhd2FibGUvcm9ib3QucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL2RyYXdhYmxlL3JvYm90LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvcmVzL3Jhdy9yb2JvdC5hM2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ODk1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9yZXMvcmF3L3JvYm90LmEzZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGguamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2UwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGguamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgU2NlbmVHcmFwaCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgU2NlbmVHcmFwaFZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgU2NlbmVHcmFwaFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhSUy5qYXZhIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWMxZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9TY2VuZUdyYXBoUlMuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIFNjZW5lR3JhcGhSUyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBTVEFURV9MQVNUX0ZPQ1VTID0gMTsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisgICAgaW50IG1Sb3RhdGlvbjsKKworICAgIHB1YmxpYyBTY2VuZUdyYXBoUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19TY2VuZWdyYXBoIG1TY3JpcHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRDX1RyYW5zZm9ybSBtVHJhbnNmb3JtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoLShmbG9hdCltUm90YXRpb24pOworCisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRlMoKSB7CisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKworICAgICAgICBiLnNldERlcHRoRnVuYyhQcm9ncmFtU3RvcmUuRGVwdGhGdW5jLkxFU1MpOworICAgICAgICBiLnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrKHRydWUpOworICAgICAgICBtUFNCYWNrZ3JvdW5kID0gYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZTQmFja2dyb3VuZChtUFNCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBicy5zZXRXcmFwVChTYW1wbGVyLlZhbHVlLkNMQU1QKTsKKyAgICAgICAgbVNhbXBsZXIgPSBicy5jcmVhdGUoKTsKKworICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudC5CdWlsZGVyKG1SUyk7CisgICAgICAgIGIuc2V0VGV4dHVyZShQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworICAgICAgICBtUEZCYWNrZ3JvdW5kLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZCYWNrZ3JvdW5kKG1QRkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UFYoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1QVkJhY2tncm91bmQgPSBwdmIuY3JlYXRlKCk7CisKKyAgICAgICAgbVBWQSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZC5iaW5kQWxsb2NhdGlvbihtUFZBKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUFZCYWNrZ3JvdW5kKG1QVkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkSW1hZ2UoKSB7CisgICAgICAgIG1HcmlkSW1hZ2UgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZUJveGVkKG1SUywgbVJlcywgUi5kcmF3YWJsZS5yb2JvdCwgRWxlbWVudC5SR0JfNTY1KG1SUyksIHRydWUpOworICAgICAgICBtR3JpZEltYWdlLnVwbG9hZFRvVGV4dHVyZSgwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogUi5yYXcucm9ib3QiOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcpOworICAgICAgICBtU2NyaXB0LnNldF9nVGV4dEFsbG9jKG1UZXh0QWxsb2MpOworICAgIH0KKworICAgIFNnVHJhbnNmb3JtIG1Sb290VHJhbnNmb3JtOworICAgIFNnVHJhbnNmb3JtIG1Hcm91cDE7CisKKyAgICBTZ1RyYW5zZm9ybSBtUm9ib3QxOworICAgIFNnVHJhbnNmb3JtIG1Sb2JvdDI7CisKKyAgICB2b2lkIGluaXRUcmFuc2Zvcm1IaWVyYXJjaHkoKSB7CisgICAgICAgIG1Sb290VHJhbnNmb3JtID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisKKyAgICAgICAgbUdyb3VwMSA9IG5ldyBTZ1RyYW5zZm9ybShtUlMpOworICAgICAgICBtUm9vdFRyYW5zZm9ybS5hZGRDaGlsZChtR3JvdXAxKTsKKworICAgICAgICBtUm9ib3QxID0gbmV3IFNnVHJhbnNmb3JtKG1SUyk7CisgICAgICAgIG1Sb2JvdDIgPSBuZXcgU2dUcmFuc2Zvcm0obVJTKTsKKworICAgICAgICBtR3JvdXAxLmFkZENoaWxkKG1Sb2JvdDEpOworICAgICAgICBtR3JvdXAxLmFkZENoaWxkKG1Sb2JvdDIpOworCisgICAgICAgIG1Hcm91cDEuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoMC4wZiwgMC4wZiwgLTE1LjBmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5UUkFOU0xBVEUpOworICAgICAgICBtR3JvdXAxLnNldFRyYW5zZm9ybSgxLCBuZXcgRmxvYXQ0KDAuMGYsIDEuMGYsIDAuMGYsIDE1LjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworCisgICAgICAgIG1Sb2JvdDEuc2V0VHJhbnNmb3JtKDAsIG5ldyBGbG9hdDQoLTMuMGYsIC0wLjVmLCAwLjBmLCAwLjBmKSwgVHJhbnNmb3JtVHlwZS5UUkFOU0xBVEUpOworICAgICAgICBtUm9ib3QxLnNldFRyYW5zZm9ybSgxLCBuZXcgRmxvYXQ0KDAuMGYsIDEuMGYsIDAuMGYsIDIwLjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworICAgICAgICBtUm9ib3QxLnNldFRyYW5zZm9ybSgyLCBuZXcgRmxvYXQ0KDAuMmYsIDAuMmYsIDAuMmYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlNDQUxFKTsKKworICAgICAgICBtUm9ib3QyLnNldFRyYW5zZm9ybSgwLCBuZXcgRmxvYXQ0KDMuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlRSQU5TTEFURSk7CisgICAgICAgIG1Sb2JvdDIuc2V0VHJhbnNmb3JtKDEsIG5ldyBGbG9hdDQoMC4wZiwgMS4wZiwgMC4wZiwgLTIwLjBmKSwgVHJhbnNmb3JtVHlwZS5ST1RBVEUpOworICAgICAgICBtUm9ib3QyLnNldFRyYW5zZm9ybSgyLCBuZXcgRmxvYXQ0KDAuM2YsIDAuM2YsIDAuM2YsIDAuMGYpLCBUcmFuc2Zvcm1UeXBlLlNDQUxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19TY2VuZWdyYXBoKG1SUywgbVJlcywgUi5yYXcuc2NlbmVncmFwaCwgdHJ1ZSk7CisgICAgICAgIG1UcmFuc2Zvcm1TY3JpcHQgPSBuZXcgU2NyaXB0Q19UcmFuc2Zvcm0obVJTLCBtUmVzLCBSLnJhdy50cmFuc2Zvcm0sIGZhbHNlKTsKKyAgICAgICAgbVRyYW5zZm9ybVNjcmlwdC5zZXRfdHJhbnNmb3JtU2NyaXB0KG1UcmFuc2Zvcm1TY3JpcHQpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUcmFuc2Zvcm1SUyhtVHJhbnNmb3JtU2NyaXB0KTsKKworICAgICAgICBpbml0UEZTKCk7CisgICAgICAgIGluaXRQRigpOworICAgICAgICBpbml0UFYoKTsKKworICAgICAgICBsb2FkSW1hZ2UoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CisgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CisgICAgICAgIGlmKGVudHJ5ID09IG51bGwgfHwgZW50cnkuZ2V0Q2xhc3NJRCgpICE9IEZpbGVBM0QuQ2xhc3NJRC5NRVNIKSB7CisgICAgICAgICAgICBMb2cuZSgicnMiLCAiY291bGQgbm90IGxvYWQgbW9kZWwiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1NZXNoID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVGVzdE1lc2gobU1lc2gpOworICAgICAgICB9CisKKyAgICAgICAgbUl0YWxpYyA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtSXRhbGljLnR0ZiIsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nSXRhbGljKG1JdGFsaWMpOworCisgICAgICAgIGluaXRUZXh0QWxsb2NhdGlvbigpOworCisgICAgICAgIGluaXRUcmFuc2Zvcm1IaWVyYXJjaHkoKTsKKworICAgICAgICBMb2cudigiPT09PT09PT1TY2VuZUdyYXBoPT09PT09PT0iLCAidHJhbnNmb3JtIGhpZXJhcmNoeSBpbml0aWFsaXplZCIpOworCisgICAgICAgIG1TY3JpcHQuYmluZF9nUm9vdE5vZGUobVJvb3RUcmFuc2Zvcm0uZ2V0RmllbGQoKSk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dHcm91cChtR3JvdXAxLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LmJpbmRfZ1JvYm90MShtUm9ib3QxLm1QYXJlbnQubUNoaWxkRmllbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nUm9ib3QxSW5kZXgobVJvYm90MS5tSW5kZXhJblBhcmVudEdyb3VwKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dSb2JvdDIobVJvYm90Mi5tUGFyZW50Lm1DaGlsZEZpZWxkKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1JvYm90MkluZGV4KG1Sb2JvdDIubUluZGV4SW5QYXJlbnRHcm91cCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NjZW5lR3JhcGhWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhNTliMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2NlbmVHcmFwaFZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBTY2VuZUdyYXBoVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFNjZW5lR3JhcGhWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTY2VuZUdyYXBoUlMgbVJlbmRlcjsKKworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0KHRydWUpOworICAgICAgICAgICAgbVJTLmNvbnRleHRTZXRTdXJmYWNlKHcsIGgsIGhvbGRlci5nZXRTdXJmYWNlKCkpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBTY2VuZUdyYXBoUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1SZW5kZXIudG91Y2hFdmVudCgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NnVHJhbnNmb3JtLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NnVHJhbnNmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2dUcmFuc2Zvcm0uamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2VudW0gVHJhbnNmb3JtVHlwZSB7CisKKyAgICBOT05FKDApLAorICAgIFRSQU5TTEFURSgxKSwKKyAgICBST1RBVEUoMiksCisgICAgU0NBTEUoMyk7CisKKyAgICBpbnQgbUlEOworICAgIFRyYW5zZm9ybVR5cGUoaW50IGlkKSB7CisgICAgICAgIG1JRCA9IGlkOworICAgIH0KK30KKworcHVibGljIGNsYXNzIFNnVHJhbnNmb3JtIHsKKworCisgICAgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0gbVRyYW5zZm9ybUZpZWxkOworICAgIFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtIG1DaGlsZEZpZWxkOworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtIG1UcmFuc2Zvcm1EYXRhOworCisgICAgRmxvYXQ0W10gbVRyYW5zZm9ybXM7CisgICAgVHJhbnNmb3JtVHlwZVtdIG1UcmFuc2Zvcm1UeXBlczsKKworICAgIFJlbmRlclNjcmlwdCBtUlM7CisKKyAgICBWZWN0b3IgbUNoaWxkcmVuOworICAgIFNnVHJhbnNmb3JtIG1QYXJlbnQ7CisgICAgaW50IG1JbmRleEluUGFyZW50R3JvdXA7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoU2dUcmFuc2Zvcm0gcGFyZW50LCBpbnQgcGFyZW50SW5kZXgpIHsKKyAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgbUluZGV4SW5QYXJlbnRHcm91cCA9IHBhcmVudEluZGV4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFNnVHJhbnNmb3JtIGNoaWxkKSB7CisgICAgICAgIG1DaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcywgbUNoaWxkcmVuLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zZm9ybShpbnQgaW5kZXgsIEZsb2F0NCB2YWx1ZSwgVHJhbnNmb3JtVHlwZSB0eXBlKSB7CisgICAgICAgIG1UcmFuc2Zvcm1zW2luZGV4XSA9IHZhbHVlOworICAgICAgICBtVHJhbnNmb3JtVHlwZXNbaW5kZXhdID0gdHlwZTsKKyAgICB9CisKKyAgICB2b2lkIGluaXREYXRhKCkgeworICAgICAgICBpbnQgbnVtVHJhbnNmb3JtcyA9IDE2OworICAgICAgICBtVHJhbnNmb3JtcyA9IG5ldyBGbG9hdDRbbnVtVHJhbnNmb3Jtc107CisgICAgICAgIG1UcmFuc2Zvcm1UeXBlcyA9IG5ldyBUcmFuc2Zvcm1UeXBlW251bVRyYW5zZm9ybXNdOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtVHJhbnNmb3JtczsgaSArKykgeworICAgICAgICAgICAgbVRyYW5zZm9ybXNbaV0gPSBuZXcgRmxvYXQ0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgbVRyYW5zZm9ybVR5cGVzW2ldID0gVHJhbnNmb3JtVHlwZS5OT05FOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXREYXRhKCkgeworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmdsb2JhbE1hdCA9IG5ldyBNYXRyaXg0ZigpOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5sb2NhbE1hdCA9IG5ldyBNYXRyaXg0ZigpOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMwID0gbVRyYW5zZm9ybXNbMF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxID0gbVRyYW5zZm9ybXNbMV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMyID0gbVRyYW5zZm9ybXNbMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMzID0gbVRyYW5zZm9ybXNbM107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM0ID0gbVRyYW5zZm9ybXNbNF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM1ID0gbVRyYW5zZm9ybXNbNV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM2ID0gbVRyYW5zZm9ybXNbNl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM3ID0gbVRyYW5zZm9ybXNbN107CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM4ID0gbVRyYW5zZm9ybXNbOF07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXM5ID0gbVRyYW5zZm9ybXNbOV07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMCA9IG1UcmFuc2Zvcm1zWzEwXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczExID0gbVRyYW5zZm9ybXNbMTFdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTIgPSBtVHJhbnNmb3Jtc1sxMl07CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybXMxMyA9IG1UcmFuc2Zvcm1zWzEzXTsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtczE0ID0gbVRyYW5zZm9ybXNbMTRdOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1zMTUgPSBtVHJhbnNmb3Jtc1sxNV07CisKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTAgPSBtVHJhbnNmb3JtVHlwZXNbMF0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMSA9IG1UcmFuc2Zvcm1UeXBlc1sxXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUyID0gbVRyYW5zZm9ybVR5cGVzWzJdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTMgPSBtVHJhbnNmb3JtVHlwZXNbM10ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNCA9IG1UcmFuc2Zvcm1UeXBlc1s0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU1ID0gbVRyYW5zZm9ybVR5cGVzWzVdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTYgPSBtVHJhbnNmb3JtVHlwZXNbNl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlNyA9IG1UcmFuc2Zvcm1UeXBlc1s3XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGU4ID0gbVRyYW5zZm9ybVR5cGVzWzhdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTkgPSBtVHJhbnNmb3JtVHlwZXNbOV0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTAgPSBtVHJhbnNmb3JtVHlwZXNbMTBdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTExID0gbVRyYW5zZm9ybVR5cGVzWzExXS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxMiA9IG1UcmFuc2Zvcm1UeXBlc1sxMl0ubUlEOworICAgICAgICBtVHJhbnNmb3JtRGF0YS50cmFuc2Zvcm1UeXBlMTMgPSBtVHJhbnNmb3JtVHlwZXNbMTNdLm1JRDsKKyAgICAgICAgbVRyYW5zZm9ybURhdGEudHJhbnNmb3JtVHlwZTE0ID0gbVRyYW5zZm9ybVR5cGVzWzE0XS5tSUQ7CisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLnRyYW5zZm9ybVR5cGUxNSA9IG1UcmFuc2Zvcm1UeXBlc1sxNV0ubUlEOworCisgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmlzRGlydHkgPSAxOworICAgICAgICBtVHJhbnNmb3JtRGF0YS5jaGlsZHJlbiA9IG51bGw7CisKKyAgICB9CisKKyAgICBwdWJsaWMgU2dUcmFuc2Zvcm0oUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtVHJhbnNmb3JtRGF0YSA9IG5ldyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybS5JdGVtKCk7CisgICAgICAgIG1DaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgaW5pdERhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0uSXRlbSBnZXREYXRhKCkgeworICAgICAgICBzZXREYXRhKCk7CisgICAgICAgIGlmKG1DaGlsZHJlbi5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgbUNoaWxkRmllbGQgPSBuZXcgU2NyaXB0RmllbGRfU2dUcmFuc2Zvcm0obVJTLCBtQ2hpbGRyZW4uc2l6ZSgpKTsKKyAgICAgICAgICAgIG1UcmFuc2Zvcm1EYXRhLmNoaWxkcmVuID0gbUNoaWxkRmllbGQuZ2V0QWxsb2NhdGlvbigpOworCisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbUNoaWxkcmVuLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgICAgIFNnVHJhbnNmb3JtIGNoaWxkID0gKFNnVHJhbnNmb3JtKW1DaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgbUNoaWxkRmllbGQuc2V0KGNoaWxkLmdldERhdGEoKSwgaSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoaWxkRmllbGQuY29weUFsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1EYXRhOworICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHRGaWVsZF9TZ1RyYW5zZm9ybSBnZXRGaWVsZCgpIHsKKyAgICAgICAgbVRyYW5zZm9ybUZpZWxkID0gbmV3IFNjcmlwdEZpZWxkX1NnVHJhbnNmb3JtKG1SUywgMSk7CisgICAgICAgIG1UcmFuc2Zvcm1GaWVsZC5zZXQoZ2V0RGF0YSgpLCAwLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2Zvcm1GaWVsZDsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YzM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWwuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tb2RlbHZpZXdlcjsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWwgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIFNpbXBsZU1vZGVsVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKworICAgICAgICAvLyBDcmVhdGUgb3VyIFByZXZpZXcgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91cgorICAgICAgICAvLyBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBTaW1wbGVNb2RlbFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YSBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZDFhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsUlMuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubW9kZWx2aWV3ZXI7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisKK3B1YmxpYyBjbGFzcyBTaW1wbGVNb2RlbFJTIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IFNUQVRFX0xBU1RfRk9DVVMgPSAxOworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBpbnQgbVJvdGF0aW9uOworCisgICAgcHVibGljIFNpbXBsZU1vZGVsUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbVJvdGF0aW9uID0gMDsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jUFY7CisKKyAgICBwcml2YXRlIE1lc2ggbU1lc2g7CisKKyAgICBwcml2YXRlIEZvbnQgbUl0YWxpYzsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVRleHRBbGxvYzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19TaW1wbGVtb2RlbCBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgdG91Y2hFdmVudChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaWYoTWF0aC5hYnMoZHgpID4gNTAgfHwgTWF0aC5hYnMoZHgpIDwgMykgeworICAgICAgICAgICAgZHggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVJvdGF0aW9uIC09IGR4OworICAgICAgICBpZihtUm90YXRpb24gPiAzNjApIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbiAtPSAzNjA7CisgICAgICAgIH0KKyAgICAgICAgaWYobVJvdGF0aW9uIDwgMCkgeworICAgICAgICAgICAgbVJvdGF0aW9uICs9IDM2MDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dSb3RhdGUoKGZsb2F0KW1Sb3RhdGlvbik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworCisgICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlKGZhbHNlKTsKKyAgICAgICAgYi5zZXREZXB0aE1hc2sodHJ1ZSk7CisgICAgICAgIG1QU0JhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRlNCYWNrZ3JvdW5kKG1QU0JhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UEYoKSB7CisgICAgICAgIFNhbXBsZXIuQnVpbGRlciBicyA9IG5ldyBTYW1wbGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnMuc2V0TWluKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0TWFnKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyIGIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYi5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudC5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgbVBGQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisgICAgICAgIG1QRkJhY2tncm91bmQuYmluZFNhbXBsZXIobVNhbXBsZXIsIDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQRkJhY2tncm91bmQobVBGQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQVigpIHsKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4LkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXguTWF0cml4QWxsb2NhdGlvbihtUlMpOworICAgICAgICBtUFZCYWNrZ3JvdW5kLmJpbmRBbGxvY2F0aW9uKG1QVkEpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dQVkJhY2tncm91bmQobVBWQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRJbWFnZSgpIHsKKyAgICAgICAgbUdyaWRJbWFnZSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbUJpdG1hcFJlc291cmNlQm94ZWQobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnJvYm90LCBFbGVtZW50LlJHQl81NjUobVJTKSwgdHJ1ZSk7CisgICAgICAgIG1HcmlkSW1hZ2UudXBsb2FkVG9UZXh0dXJlKDApOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dUR3JpZChtR3JpZEltYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFRleHRBbGxvY2F0aW9uKCkgeworICAgICAgICBTdHJpbmcgYWxsb2NTdHJpbmcgPSAiRGlzcGxheWluZyBmaWxlOiBSLnJhdy5yb2JvdCI7CisgICAgICAgIG1UZXh0QWxsb2MgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBhbGxvY1N0cmluZyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dUZXh0QWxsb2MobVRleHRBbGxvYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfU2ltcGxlbW9kZWwobVJTLCBtUmVzLCBSLnJhdy5zaW1wbGVtb2RlbCwgdHJ1ZSk7CisKKyAgICAgICAgaW5pdFBGUygpOworICAgICAgICBpbml0UEYoKTsKKyAgICAgICAgaW5pdFBWKCk7CisKKyAgICAgICAgbG9hZEltYWdlKCk7CisKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbVJlc291cmNlKG1SUywgbVJlcywgUi5yYXcucm9ib3QpOworICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KDApOworICAgICAgICBpZihlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmdldENsYXNzSUQoKSAhPSBGaWxlQTNELkNsYXNzSUQuTUVTSCkgeworICAgICAgICAgICAgTG9nLmUoInJzIiwgImNvdWxkIG5vdCBsb2FkIG1vZGVsIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtTWVzaCA9IChNZXNoKWVudHJ5LmdldE9iamVjdCgpOworICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ1Rlc3RNZXNoKG1NZXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZShtUlMsIG1SZXMsICJEcm9pZFNlcmlmLUl0YWxpYy50dGYiLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBpbml0VGV4dEFsbG9jYXRpb24oKTsKKworICAgICAgICBtUlMuY29udGV4dEJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvU2ltcGxlTW9kZWxWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzRmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL1NpbXBsZU1vZGVsVmlldy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFNpbXBsZU1vZGVsVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFNpbXBsZU1vZGVsVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgU2ltcGxlTW9kZWxSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFNpbXBsZU1vZGVsUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1SZW5kZXIudG91Y2hFdmVudCgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NjZW5lZ3JhcGgucnMgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NjZW5lZ3JhcGgucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2YmIxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvc2NlbmVncmFwaC5ycwpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisjaW5jbHVkZSAidHJhbnNmb3JtX2RlZi5yc2giCisKK3JzX3Byb2dyYW1fdmVydGV4IGdQVkJhY2tncm91bmQ7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQRkJhY2tncm91bmQ7CisKK3JzX2FsbG9jYXRpb24gZ1RHcmlkOworcnNfbWVzaCBnVGVzdE1lc2g7CisKK3JzX3Byb2dyYW1fc3RvcmUgZ1BGU0JhY2tncm91bmQ7CisKK2Zsb2F0IGdSb3RhdGU7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKK3JzX2FsbG9jYXRpb24gZ1RleHRBbGxvYzsKKworcnNfc2NyaXB0IGdUcmFuc2Zvcm1SUzsKKworU2dUcmFuc2Zvcm0gKmdHcm91cDsKK1NnVHJhbnNmb3JtICpnUm9ib3QxOworaW50IGdSb2JvdDFJbmRleDsKK1NnVHJhbnNmb3JtICpnUm9ib3QyOworaW50IGdSb2JvdDJJbmRleDsKKworU2dUcmFuc2Zvcm0gKmdSb290Tm9kZTsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGdQVkJhY2tncm91bmQsIGdQRkJhY2tncm91bmQsIGdUR3JpZCwgZ1Rlc3RNZXNoLCBnUEZTQmFja2dyb3VuZCwgZ1JvdGF0ZSwgZ0l0YWxpYywgZ1RleHRBbGxvYywgZ1RyYW5zZm9ybVJTLCBnR3JvdXAsIGdSb2JvdDEsIGdSb2JvdDFJbmRleCwgZ1JvYm90MiwgZ1JvYm90MkluZGV4LCBnUm9vdE5vZGUpCisKK2Zsb2F0IGdEVDsKK2ludDY0X3QgZ0xhc3RUaW1lOworCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZSA9IDAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgZ0dyb3VwLT50cmFuc2Zvcm1zMS53ICs9IDAuNWY7CisgICAgZ0dyb3VwLT5pc0RpcnR5ID0gMTsKKworICAgIFNnVHJhbnNmb3JtICpyb2JvdDFQdHIgPSBnUm9ib3QxICsgZ1JvYm90MUluZGV4OworCisgICAgcm9ib3QxUHRyLT50cmFuc2Zvcm1zMS53IC09IDEuNWY7CisgICAgcm9ib3QxUHRyLT5pc0RpcnR5ID0gMTsKKworICAgIFNnVHJhbnNmb3JtICpyb2JvdDJQdHIgPSBnUm9ib3QyICsgZ1JvYm90MkluZGV4OworICAgIHJvYm90MlB0ci0+dHJhbnNmb3JtczEudyArPSAyLjVmOworICAgIHJvYm90MlB0ci0+aXNEaXJ0eSA9IDE7CisKKyAgICByc0ZvckVhY2goZ1RyYW5zZm9ybVJTLCBnUm9vdE5vZGUtPmNoaWxkcmVuLCBnUm9vdE5vZGUtPmNoaWxkcmVuLCAwKTsKKworICAgIHJzZ0NsZWFyQ29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAwLjFmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZyb2JvdDFQdHItPmdsb2JhbE1hdCk7CisgICAgcnNnRHJhd01lc2goZ1Rlc3RNZXNoKTsKKworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJnJvYm90MlB0ci0+Z2xvYmFsTWF0KTsKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgY29sb3IoMC4zZiwgMC4zZiwgMC4zZiwgMS4wZik7CisgICAgcnNnRHJhd1RleHQoIlJlbmRlcnNjcmlwdCB0cmFuc2Zvcm0gdGVzdCIsIDMwLCA2OTUpOworCisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoZ1RleHRBbGxvYywgMzAsIDczMCk7CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3NpbXBsZW1vZGVsLnJzIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zaW1wbGVtb2RlbC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JlMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci9zaW1wbGVtb2RlbC5ycwpAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3JzX3Byb2dyYW1fdmVydGV4IGdQVkJhY2tncm91bmQ7Cityc19wcm9ncmFtX2ZyYWdtZW50IGdQRkJhY2tncm91bmQ7CisKK3JzX2FsbG9jYXRpb24gZ1RHcmlkOworcnNfbWVzaCBnVGVzdE1lc2g7CisKK3JzX3Byb2dyYW1fc3RvcmUgZ1BGU0JhY2tncm91bmQ7CisKK2Zsb2F0IGdSb3RhdGU7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKK3JzX2FsbG9jYXRpb24gZ1RleHRBbGxvYzsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKGdQVkJhY2tncm91bmQsIGdQRkJhY2tncm91bmQsIGdUR3JpZCwgZ1Rlc3RNZXNoLCBnUEZTQmFja2dyb3VuZCwgZ1JvdGF0ZSwgZ0l0YWxpYywgZ1RleHRBbGxvYykKKworZmxvYXQgZ0RUOworaW50NjRfdCBnTGFzdFRpbWU7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnUm90YXRlID0gMC4wZjsKK30KKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUFZCYWNrZ3JvdW5kKTsKKyAgICByc19tYXRyaXg0eDQgcHJvajsKKyAgICBmbG9hdCBhc3BlY3QgPSAoZmxvYXQpcnNnR2V0V2lkdGgoKSAvIChmbG9hdClyc2dHZXRIZWlnaHQoKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmcHJvaiwgMzAuMGYsIGFzcGVjdCwgMC4xZiwgMTAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQRlNCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUEZCYWNrZ3JvdW5kLCAwLCBnVEdyaWQpOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWwgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4VHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIC0wLjNmLCAtMTAuMGYpOworICAgIHJzTWF0cml4U2NhbGUoJm1hdHJpeCwgMC4yZiwgMC4yZiwgMC4yZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgMjUuMGYsIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdSb3RhdGUsIDAuMGYsIDEuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICByc2dEcmF3TWVzaChnVGVzdE1lc2gpOworCisgICAgcnNnRm9udENvbG9yKDAuM2YsIDAuM2YsIDAuM2YsIDEuMGYpOworICAgIHJzZ0RyYXdUZXh0KCJSZW5kZXJzY3JpcHQgbW9kZWwgdGVzdCIsIDMwLCA2OTUpOworCisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgcnNnRHJhd1RleHQoZ1RleHRBbGxvYywgMzAsIDczMCk7CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybS5ycyBiL2xpYnMvcnMvamF2YS9Nb2RlbFZpZXdlci9zcmMvY29tL2FuZHJvaWQvbW9kZWx2aWV3ZXIvdHJhbnNmb3JtLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjI5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybS5ycwpAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLm1vZGVsdmlld2VyKQorCisjaW5jbHVkZSAidHJhbnNmb3JtX2RlZi5yc2giCisKK3JzX3NjcmlwdCB0cmFuc2Zvcm1TY3JpcHQ7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3Zhcih0cmFuc2Zvcm1TY3JpcHQpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY2hhbmdlZDsKKyAgICByc19tYXRyaXg0eDQgKm1hdDsKK30gUGFyZW50RGF0YTsKKwordm9pZCBhcHBlbmRUcmFuc2Zvcm1hdGlvbihpbnQgdHlwZSwgZmxvYXQ0IGRhdGEsIHJzX21hdHJpeDR4NCAqbWF0KSB7CisgICAgcnNfbWF0cml4NHg0IHRlbXA7CisKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgVFJBTlNGT1JNX1RSQU5TTEFURToKKyAgICAgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZ0ZW1wLCBkYXRhLngsIGRhdGEueSwgZGF0YS56KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFOU0ZPUk1fUk9UQVRFOgorICAgICAgICByc01hdHJpeExvYWRSb3RhdGUoJnRlbXAsIGRhdGEudywgZGF0YS54LCBkYXRhLnksIGRhdGEueik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBTlNGT1JNX1NDQUxFOgorICAgICAgICByc01hdHJpeExvYWRTY2FsZSgmdGVtcCwgZGF0YS54LCBkYXRhLnksIGRhdGEueik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByc01hdHJpeE11bHRpcGx5KG1hdCwgJnRlbXApOworfQorCit2b2lkIHJvb3QoY29uc3Qgdm9pZCAqdl9pbiwgdm9pZCAqdl9vdXQsIGNvbnN0IHZvaWQgKnVzckRhdGEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHkpIHsKKworICAgIFNnVHJhbnNmb3JtICpkYXRhID0gKFNnVHJhbnNmb3JtICopdl9vdXQ7CisgICAgY29uc3QgUGFyZW50RGF0YSAqcGFyZW50ID0gKGNvbnN0IFBhcmVudERhdGEgKil1c3JEYXRhOworCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gZGF0YSIsIChpbnQpZGF0YSk7CisgICAgLy9yc0RlYnVnKCJFbnRlcmluZyBwYXJlbnQiLCAoaW50KXBhcmVudCk7CisKKyAgICByc19tYXRyaXg0eDQgKmxvY2FsTWF0ID0gJmRhdGEtPmxvY2FsTWF0OworICAgIHJzX21hdHJpeDR4NCAqZ2xvYmFsTWF0ID0gJmRhdGEtPmdsb2JhbE1hdDsKKworICAgIFBhcmVudERhdGEgdG9DaGlsZDsKKyAgICB0b0NoaWxkLmNoYW5nZWQgPSAwOworICAgIHRvQ2hpbGQubWF0ID0gZ2xvYmFsTWF0OworCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gaXMgZGlydHkiLCBkYXRhLT5pc0RpcnR5KTsKKworICAgIC8vIFJlZnJlc2ggbWF0cmljZXMgaWYgZGlydHkKKyAgICBpZihkYXRhLT5pc0RpcnR5KSB7CisgICAgICAgIGRhdGEtPmlzRGlydHkgPSAwOworICAgICAgICB0b0NoaWxkLmNoYW5nZWQgPSAxOworCisgICAgICAgIC8vIFJlc2V0IG91ciBsb2NhbCBtYXRyaXgKKyAgICAgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkobG9jYWxNYXQpOworCisgICAgICAgIGZsb2F0NCAqdHJhbnNmb3JtU291cmNlID0gJmRhdGEtPnRyYW5zZm9ybXMwOworICAgICAgICBpbnQgKnRyYW5zZm9ybVR5cGVzID0gJmRhdGEtPnRyYW5zZm9ybVR5cGUwOworCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSArKykgeworICAgICAgICAgICAgaWYodHJhbnNmb3JtVHlwZXNbaV0gPT0gVFJBTlNGT1JNX05PTkUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGFkZGluZyB0cmFuc2Zvcm1hdGlvbiIsIHRyYW5zZm9ybVR5cGVzW2ldKTsKKyAgICAgICAgICAgIGFwcGVuZFRyYW5zZm9ybWF0aW9uKHRyYW5zZm9ybVR5cGVzW2ldLCB0cmFuc2Zvcm1Tb3VyY2VbaV0sIGxvY2FsTWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vcnNEZWJ1ZygiVHJhbnNmb3JtIGNoZWNraW5nIHBhcmVudCIsIChpbnQpMCk7CisKKyAgICBpZihwYXJlbnQpIHsKKyAgICAgICAgaWYocGFyZW50LT5jaGFuZ2VkKSB7CisgICAgICAgICAgICB0b0NoaWxkLmNoYW5nZWQgPSAxOworCisgICAgICAgICAgICByc01hdHJpeExvYWQoZ2xvYmFsTWF0LCBwYXJlbnQtPm1hdCk7CisgICAgICAgICAgICByc01hdHJpeE11bHRpcGx5KGdsb2JhbE1hdCwgbG9jYWxNYXQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc01hdHJpeExvYWQoZ2xvYmFsTWF0LCBsb2NhbE1hdCk7CisgICAgfQorCisgICAgLy9yc0RlYnVnKCJUcmFuc2Zvcm0gY2FsbGluZyBzZWxmIHdpdGggY2hpbGQgIiwgKGludClkYXRhLT5jaGlsZHJlbi5wKTsKKyAgICBpZihkYXRhLT5jaGlsZHJlbi5wKSB7CisgICAgICAgIHJzRm9yRWFjaCh0cmFuc2Zvcm1TY3JpcHQsIGRhdGEtPmNoaWxkcmVuLCBkYXRhLT5jaGlsZHJlbiwgKHZvaWQqKSZ0b0NoaWxkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvTW9kZWxWaWV3ZXIvc3JjL2NvbS9hbmRyb2lkL21vZGVsdmlld2VyL3RyYW5zZm9ybV9kZWYucnNoIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm1fZGVmLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzg3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL01vZGVsVmlld2VyL3NyYy9jb20vYW5kcm9pZC9tb2RlbHZpZXdlci90cmFuc2Zvcm1fZGVmLnJzaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQubW9kZWx2aWV3ZXIpCisKKyNkZWZpbmUgVFJBTlNGT1JNX05PTkUgMAorI2RlZmluZSBUUkFOU0ZPUk1fVFJBTlNMQVRFIDEKKyNkZWZpbmUgVFJBTlNGT1JNX1JPVEFURSAyCisjZGVmaW5lIFRSQU5TRk9STV9TQ0FMRSAzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICByc19tYXRyaXg0eDQgZ2xvYmFsTWF0OworICAgIHJzX21hdHJpeDR4NCBsb2NhbE1hdDsKKworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMDsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczE7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMyOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMzsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczQ7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM1OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zNjsKKyAgICBmbG9hdDQgdHJhbnNmb3Jtczc7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXM4OworICAgIGZsb2F0NCB0cmFuc2Zvcm1zOTsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEwOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTE7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxMjsKKyAgICBmbG9hdDQgdHJhbnNmb3JtczEzOworICAgIGZsb2F0NCB0cmFuc2Zvcm1zMTQ7CisgICAgZmxvYXQ0IHRyYW5zZm9ybXMxNTsKKworICAgIGludCB0cmFuc2Zvcm1UeXBlMDsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTE7CisgICAgaW50IHRyYW5zZm9ybVR5cGUyOworICAgIGludCB0cmFuc2Zvcm1UeXBlMzsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTQ7CisgICAgaW50IHRyYW5zZm9ybVR5cGU1OworICAgIGludCB0cmFuc2Zvcm1UeXBlNjsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTc7CisgICAgaW50IHRyYW5zZm9ybVR5cGU4OworICAgIGludCB0cmFuc2Zvcm1UeXBlOTsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEwOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTE7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxMjsKKyAgICBpbnQgdHJhbnNmb3JtVHlwZTEzOworICAgIGludCB0cmFuc2Zvcm1UeXBlMTQ7CisgICAgaW50IHRyYW5zZm9ybVR5cGUxNTsKKworICAgIGludCBpc0RpcnR5OworCisgICAgcnNfYWxsb2NhdGlvbiBjaGlsZHJlbjsKKworfSBTZ1RyYW5zZm9ybTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWQubWsgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWU3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisjTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQucmVuZGVyc2NyaXB0CisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBTYW1wbGVzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxOTFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuc2FtcGxlcyI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlNhbXBsZXMiCisgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvdGVzdF9wYXR0ZXJuIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNMaXN0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iUnNMaXN0IiAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSc1JlbmRlclN0YXRlcyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlJzU3RhdGVzIiAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuQmxhY2suTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvZGF0YS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNDcxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9kYXRhLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvbGVhZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkMzc3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS9sZWFmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvZHJhd2FibGUvdG9ydXNtYXAucG5nIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA4ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL2RyYXdhYmxlL3RvcnVzbWFwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmYuZ2xzbCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3Jlcy9yYXcvc2hhZGVyZi5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2Y0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcmYuZ2xzbApAQCAtMCwwICsxLDE1IEBACisKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDBfRGlmZnVzZTsKK3ZhcnlpbmcgbG93cCBmbG9hdCBsaWdodDBfU3BlY3VsYXI7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7Cit2YXJ5aW5nIGxvd3AgZmxvYXQgbGlnaHQxX1NwZWN1bGFyOworCit2b2lkIG1haW4oKSB7CisgICB2ZWMyIHQwID0gdmFyVGV4MC54eTsKKyAgIGxvd3AgdmVjNCBjb2wgPSB0ZXh0dXJlMkQodW5pX1RleDAsIHQwKS5yZ2JhOworICAgY29sLnh5eiA9IGNvbC54eXogKiAobGlnaHQwX0RpZmZ1c2UgKiBVTklfbGlnaHQwX0RpZmZ1c2VDb2xvciArIGxpZ2h0MV9EaWZmdXNlICogVU5JX2xpZ2h0MV9EaWZmdXNlQ29sb3IpOworICAgY29sLnh5eiArPSBsaWdodDBfU3BlY3VsYXIgKiBVTklfbGlnaHQwX1NwZWN1bGFyQ29sb3I7CisgICBjb2wueHl6ICs9IGxpZ2h0MV9TcGVjdWxhciAqIFVOSV9saWdodDFfU3BlY3VsYXJDb2xvcjsKKyAgIGdsX0ZyYWdDb2xvciA9IGNvbDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3NoYWRlcnYuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYxMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy9zaGFkZXJ2Lmdsc2wKQEAgLTAsMCArMSw0MiBAQAordmFyeWluZyBmbG9hdCBsaWdodDBfRGlmZnVzZTsKK3ZhcnlpbmcgZmxvYXQgbGlnaHQwX1NwZWN1bGFyOwordmFyeWluZyBmbG9hdCBsaWdodDFfRGlmZnVzZTsKK3ZhcnlpbmcgZmxvYXQgbGlnaHQxX1NwZWN1bGFyOworCisvKgorcnNfbWF0cml4NHg0IG1vZGVsOworIGZsb2F0MyBsaWdodDBfUG9zaXNpb247CisgZmxvYXQgbGlnaHQwX0RpZmZ1c2U7CisgZmxvYXQgbGlnaHQwX1NwZWN1bGFyOworIGZsb2F0IGxpZ2h0MF9Db3NpbmVQb3dlcjsKKworIGZsb2F0MyBsaWdodDFfUG9zaXNpb247CisgZmxvYXQgbGlnaHQxX0RpZmZ1c2U7CisgZmxvYXQgbGlnaHQxX1NwZWN1bGFyOworIGZsb2F0IGxpZ2h0MV9Db3NpbmVQb3dlcjsKKyovCisKKy8vIFRoaXMgaXMgd2hlcmUgYWN0dWFsIHNoYWRlciBjb2RlIGJlZ2lucwordm9pZCBtYWluKCkgeworICAgdmVjNCB3b3JsZFBvcyA9IFVOSV9tb2RlbCAqIEFUVFJJQl9wb3NpdGlvbjsKKyAgIGdsX1Bvc2l0aW9uID0gVU5JX01WUCAqIHdvcmxkUG9zOworCisgICBtYXQzIG1vZGVsMyA9IG1hdDMoVU5JX21vZGVsWzBdLnh5eiwgVU5JX21vZGVsWzFdLnh5eiwgVU5JX21vZGVsWzJdLnh5eik7CisgICB2ZWMzIHdvcmxkTm9ybSA9IG1vZGVsMyAqIEFUVFJJQl9ub3JtYWw7CisgICB2ZWMzIFYgPSBub3JtYWxpemUoLXdvcmxkUG9zLnh5eik7CisKKyAgIHZlYzMgbGlnaHQwVmVjID0gbm9ybWFsaXplKFVOSV9saWdodDBfUG9zaXNpb24gLSB3b3JsZFBvcy54eXopOworICAgdmVjMyBsaWdodDBSID0gcmVmbGVjdChsaWdodDBWZWMsIHdvcmxkTm9ybSk7CisgICBsaWdodDBfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MFZlYyksIDAuMCwgMS4wKSAqIFVOSV9saWdodDBfRGlmZnVzZTsKKyAgIGZsb2F0IGxpZ2h0MFNwZWMgPSBjbGFtcChkb3QobGlnaHQwUiwgViksIDAuMDAxLCAxLjApOworICAgbGlnaHQwX1NwZWN1bGFyID0gcG93KGxpZ2h0MFNwZWMsIFVOSV9saWdodDBfQ29zaW5lUG93ZXIpICogVU5JX2xpZ2h0MF9TcGVjdWxhcjsKKworICAgdmVjMyBsaWdodDFWZWMgPSBub3JtYWxpemUoVU5JX2xpZ2h0MV9Qb3Npc2lvbiAtIHdvcmxkUG9zLnh5eik7CisgICB2ZWMzIGxpZ2h0MVIgPSByZWZsZWN0KGxpZ2h0MVZlYywgd29ybGROb3JtKTsKKyAgIGxpZ2h0MV9EaWZmdXNlID0gY2xhbXAoZG90KHdvcmxkTm9ybSwgbGlnaHQxVmVjKSwgMC4wLCAxLjApICogVU5JX2xpZ2h0MV9EaWZmdXNlOworICAgZmxvYXQgbGlnaHQxU3BlYyA9IGNsYW1wKGRvdChsaWdodDFSLCBWKSwgMC4wMDEsIDEuMCk7CisgICBsaWdodDFfU3BlY3VsYXIgPSBwb3cobGlnaHQxU3BlYywgVU5JX2xpZ2h0MV9Db3NpbmVQb3dlcikgKiBVTklfbGlnaHQxX1NwZWN1bGFyOworCisgICBnbF9Qb2ludFNpemUgPSAxLjA7CisgICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9yZXMvcmF3L3RvcnVzLmEzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIyYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvcmVzL3Jhdy90b3J1cy5hM2QKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM3MzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUnNMaXN0IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBSc0xpc3RWaWV3IG1WaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJzTGlzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RSUy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgyZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNMaXN0UlMuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgUnNMaXN0UlMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgU1RBVEVfTEFTVF9GT0NVUyA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRBX0xJU1QgPSB7CisgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAiQW5nb2xhIiwgIkFuZ3VpbGxhIiwgIkFudGFyY3RpY2EiLCAiQW50aWd1YSBhbmQgQmFyYnVkYSIsICJBcmdlbnRpbmEiLAorICAgICJBcm1lbmlhIiwgIkFydWJhIiwgIkF1c3RyYWxpYSIsICJBdXN0cmlhIiwgIkF6ZXJiYWlqYW4iLAorICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAiQmVsaXplIiwgIkJlbmluIiwgIkJlcm11ZGEiLCAiQmh1dGFuIiwgIkJvbGl2aWEiLAorICAgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgIkJvdHN3YW5hIiwgIkJvdXZldCBJc2xhbmQiLCAiQnJhemlsIiwKKyAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAiQnVya2luYSBGYXNvIiwgIkJ1cnVuZGkiLCAiQ290ZSBkJ0l2b2lyZSIsICJDYW1ib2RpYSIsICJDYW1lcm9vbiIsICJDYW5hZGEiLCAiQ2FwZSBWZXJkZSIsCisgICAgIkNheW1hbiBJc2xhbmRzIiwgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsICJDaGFkIiwgIkNoaWxlIiwgIkNoaW5hIiwKKyAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAiQ29vayBJc2xhbmRzIiwgIkNvc3RhIFJpY2EiLCAiQ3JvYXRpYSIsICJDdWJhIiwgIkN5cHJ1cyIsICJDemVjaCBSZXB1YmxpYyIsCisgICAgIkRlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvIiwgIkRlbm1hcmsiLCAiRGppYm91dGkiLCAiRG9taW5pY2EiLCAiRG9taW5pY2FuIFJlcHVibGljIiwKKyAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICJFc3RvbmlhIiwgIkV0aGlvcGlhIiwgIkZhZXJvZSBJc2xhbmRzIiwgIkZhbGtsYW5kIElzbGFuZHMiLCAiRmlqaSIsICJGaW5sYW5kIiwKKyAgICAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSIsICJGcmFuY2UiLCAiRnJlbmNoIEd1aWFuYSIsICJGcmVuY2ggUG9seW5lc2lhIiwKKyAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICJHcmVlY2UiLCAiR3JlZW5sYW5kIiwgIkdyZW5hZGEiLCAiR3VhZGVsb3VwZSIsICJHdWFtIiwgIkd1YXRlbWFsYSIsICJHdWluZWEiLCAiR3VpbmVhLUJpc3NhdSIsCisgICAgIkd1eWFuYSIsICJIYWl0aSIsICJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLCAiSG9uZHVyYXMiLCAiSG9uZyBLb25nIiwgIkh1bmdhcnkiLAorICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgIkphcGFuIiwgIkpvcmRhbiIsICJLYXpha2hzdGFuIiwgIktlbnlhIiwgIktpcmliYXRpIiwgIkt1d2FpdCIsICJLeXJneXpzdGFuIiwgIkxhb3MiLAorICAgICJMYXR2aWEiLCAiTGViYW5vbiIsICJMZXNvdGhvIiwgIkxpYmVyaWEiLCAiTGlieWEiLCAiTGllY2h0ZW5zdGVpbiIsICJMaXRodWFuaWEiLCAiTHV4ZW1ib3VyZyIsCisgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgIk1hcnRpbmlxdWUiLCAiTWF1cml0YW5pYSIsICJNYXVyaXRpdXMiLCAiTWF5b3R0ZSIsICJNZXhpY28iLCAiTWljcm9uZXNpYSIsICJNb2xkb3ZhIiwKKyAgICAiTW9uYWNvIiwgIk1vbmdvbGlhIiwgIk1vbnRzZXJyYXQiLCAiTW9yb2NjbyIsICJNb3phbWJpcXVlIiwgIk15YW5tYXIiLCAiTmFtaWJpYSIsCisgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICJOaWNhcmFndWEiLCAiTmlnZXIiLCAiTmlnZXJpYSIsICJOaXVlIiwgIk5vcmZvbGsgSXNsYW5kIiwgIk5vcnRoIEtvcmVhIiwgIk5vcnRoZXJuIE1hcmlhbmFzIiwKKyAgICAiTm9yd2F5IiwgIk9tYW4iLCAiUGFraXN0YW4iLCAiUGFsYXUiLCAiUGFuYW1hIiwgIlBhcHVhIE5ldyBHdWluZWEiLCAiUGFyYWd1YXkiLCAiUGVydSIsCisgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAiUmV1bmlvbiIsICJSb21hbmlhIiwgIlJ1c3NpYSIsICJSd2FuZGEiLCAiU3FvIFRvbWUgYW5kIFByaW5jaXBlIiwgIlNhaW50IEhlbGVuYSIsCisgICAgIlNhaW50IEtpdHRzIGFuZCBOZXZpcyIsICJTYWludCBMdWNpYSIsICJTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIiwKKyAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgIlNleWNoZWxsZXMiLCAiU2llcnJhIExlb25lIiwgIlNpbmdhcG9yZSIsICJTbG92YWtpYSIsICJTbG92ZW5pYSIsICJTb2xvbW9uIElzbGFuZHMiLAorICAgICJTb21hbGlhIiwgIlNvdXRoIEFmcmljYSIsICJTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcyIsICJTb3V0aCBLb3JlYSIsCisgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICJTd2l0emVybGFuZCIsICJTeXJpYSIsICJUYWl3YW4iLCAiVGFqaWtpc3RhbiIsICJUYW56YW5pYSIsICJUaGFpbGFuZCIsICJUaGUgQmFoYW1hcyIsCisgICAgIlRoZSBHYW1iaWEiLCAiVG9nbyIsICJUb2tlbGF1IiwgIlRvbmdhIiwgIlRyaW5pZGFkIGFuZCBUb2JhZ28iLCAiVHVuaXNpYSIsICJUdXJrZXkiLAorICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICJVa3JhaW5lIiwgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVuaXRlZCBLaW5nZG9tIiwKKyAgICAiVW5pdGVkIFN0YXRlcyIsICJVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMiLCAiVXJ1Z3VheSIsICJVemJla2lzdGFuIiwKKyAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICJZZW1lbiIsICJZdWdvc2xhdmlhIiwgIlphbWJpYSIsICJaaW1iYWJ3ZSIKKyAgICB9OworCisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKworICAgIHB1YmxpYyBSc0xpc3RSUygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbVJTID0gcnM7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworCisgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zIG1MaXN0QWxsb2NzOworCisgICAgcHJpdmF0ZSBTY3JpcHRDX1JzbGlzdCBtU2NyaXB0OworCisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtU2NyaXB0LnNldF9nRFkoMC4wZik7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbk1vdmUoaW50IHgsIGludCB5KSB7CisgICAgICAgIGludCBkeCA9IG1MYXN0WCAtIHg7CisgICAgICAgIGludCBkeSA9IG1MYXN0WSAtIHk7CisKKyAgICAgICAgaWYoTWF0aC5hYnMoZHkpIDw9IDIpIHsKKyAgICAgICAgICAgIGR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dEWShkeSk7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Sc2xpc3QobVJTLCBtUmVzLCBSLnJhdy5yc2xpc3QsIHRydWUpOworCisgICAgICAgIG1MaXN0QWxsb2NzID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyhtUlMsIERBVEFfTElTVC5sZW5ndGgpOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgREFUQV9MSVNULmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gbGlzdEVsZW0gPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0oKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnRleHQgPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21TdHJpbmcobVJTLCBEQVRBX0xJU1RbaV0pOworICAgICAgICAgICAgbUxpc3RBbGxvY3Muc2V0KGxpc3RFbGVtLCBpLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0KG1MaXN0QWxsb2NzKTsKKworICAgICAgICBtSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xEX0lUQUxJQywgOCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dJdGFsaWMobUl0YWxpYyk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RWaWV3LmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc0xpc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZWEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzTGlzdFZpZXcuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzTGlzdFZpZXcgZXh0ZW5kcyBSU1N1cmZhY2VWaWV3IHsKKworICAgIHB1YmxpYyBSc0xpc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgLy9zZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBSc0xpc3RSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzTGlzdFJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgLy8gYnJlYWsgcG9pbnQgYXQgaGVyZQorICAgICAgICAvLyB0aGlzIG1ldGhvZCBkb2Vzbid0IHdvcmsgd2hlbiAnZXh0ZW5kcyBWaWV3JyBpbmNsdWRlICdleHRlbmRzIFNjcm9sbFZpZXcnLgorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcmV0ID0gZmFsc2U7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbkRvd24oKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYWN0ID09IGV2LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uTW92ZSgoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzLmphdmEgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTAwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU3lzdGVtOworaW1wb3J0IGFuZHJvaWQudXRpbC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBSc1JlbmRlclN0YXRlc1ZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUnNSZW5kZXJTdGF0ZXNWaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5vblJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmU3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1JTLmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKKworCitwdWJsaWMgY2xhc3MgUnNSZW5kZXJTdGF0ZXNSUyB7CisKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgbU9wdGlvbnNBUkdCLmluU2NhbGVkID0gZmFsc2U7CisgICAgICAgIG1PcHRpb25zQVJHQi5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OworICAgICAgICBtTW9kZSA9IDA7CisgICAgICAgIG1NYXhNb2RlcyA9IDc7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIFNhbXBsZXIgbUxpbmVhckNsYW1wOworICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyV3JhcDsKKyAgICBwcml2YXRlIFNhbXBsZXIgbU1pcExpbmVhcldyYXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1OZWFyZXN0Q2xhbXA7CisKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kTm9uZTsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmRBbHBoYTsKKyAgICBwcml2YXRlIFByb2dyYW1TdG9yZSBtUHJvZ1N0b3JlQmxlbmRBZGQ7CisKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUHJvZ0ZyYWdtZW50Q29sb3I7CisKKyAgICBwcml2YXRlIFByb2dyYW1WZXJ0ZXggbVByb2dWZXJ0ZXg7CisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24gbVBWQTsKKworICAgIC8vIEN1c3RvbSBzaGFkZXJzCisgICAgcHJpdmF0ZSBQcm9ncmFtVmVydGV4IG1Qcm9nVmVydGV4Q3VzdG9tOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uIG1QVkFDdXN0b207CisgICAgcHJpdmF0ZSBQcm9ncmFtRnJhZ21lbnQgbVByb2dGcmFnbWVudEN1c3RvbTsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50c19zIG1WU0NvbnN0OworICAgIHByaXZhdGUgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50c19zIG1GU0NvbnN0OworCisgICAgcHJpdmF0ZSBQcm9ncmFtUmFzdGVyIG1DdWxsQmFjazsKKyAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxGcm9udDsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4VG9ydXM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhPcGFxdWU7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhUcmFuc3BhcmVudDsKKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKworICAgIHByaXZhdGUgTWVzaCBtTWJ5Tk1lc2g7CisgICAgcHJpdmF0ZSBNZXNoIG1Ub3J1czsKKworICAgIEZvbnQgbUZvbnRTYW5zOworICAgIEZvbnQgbUZvbnRTZXJpZjsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkOworICAgIEZvbnQgbUZvbnRTZXJpZkl0YWxpYzsKKyAgICBGb250IG1Gb250U2VyaWZCb2xkSXRhbGljOworICAgIEZvbnQgbUZvbnRNb25vOworCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CisKKyAgICBwcml2YXRlIFNjcmlwdENfUnNyZW5kZXJzdGF0ZXMgbVNjcmlwdDsKKworICAgIHByaXZhdGUgZmluYWwgQml0bWFwRmFjdG9yeS5PcHRpb25zIG1PcHRpb25zQVJHQiA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKKworICAgIGludCBtTW9kZTsKKyAgICBpbnQgbU1heE1vZGVzOworCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtTW9kZSArKzsKKyAgICAgICAgbU1vZGUgPSBtTW9kZSAlIG1NYXhNb2RlczsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0Rpc3BsYXlNb2RlKG1Nb2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lc2ggZ2V0TWJ5Tk1lc2goZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwgaW50IHdSZXNvbHV0aW9uLCBpbnQgaFJlc29sdXRpb24pIHsKKworICAgICAgICBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgdG1iID0gbmV3IE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlcihtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyLlRFWFRVUkVfMCk7CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPD0gaFJlc29sdXRpb247IHkrKykgeworICAgICAgICAgICAgZmluYWwgZmxvYXQgbm9ybWFsaXplZFkgPSAoZmxvYXQpeSAvIGhSZXNvbHV0aW9uOworICAgICAgICAgICAgZmluYWwgZmxvYXQgeU9mZnNldCA9IChub3JtYWxpemVkWSAtIDAuNWYpICogaGVpZ2h0OworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPD0gd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRYID0gKGZsb2F0KXggLyB3UmVzb2x1dGlvbjsKKyAgICAgICAgICAgICAgICBmbG9hdCB4T2Zmc2V0ID0gKG5vcm1hbGl6ZWRYIC0gMC41ZikgKiB3aWR0aDsKKyAgICAgICAgICAgICAgICB0bWIuc2V0VGV4dHVyZShub3JtYWxpemVkWCwgbm9ybWFsaXplZFkpOworICAgICAgICAgICAgICAgIHRtYi5hZGRWZXJ0ZXgoeE9mZnNldCwgeU9mZnNldCk7CisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoUmVzb2x1dGlvbjsgeSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VyWSA9IHkgKiAod1Jlc29sdXRpb24gKyAxKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBiZWxvd1kgPSAoeSArIDEpICogKHdSZXNvbHV0aW9uICsgMSk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdSZXNvbHV0aW9uOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VyViA9IGN1clkgKyB4OworICAgICAgICAgICAgICAgIGludCBiZWxvd1YgPSBiZWxvd1kgKyB4OworICAgICAgICAgICAgICAgIHRtYi5hZGRUcmlhbmdsZShjdXJWLCBiZWxvd1YsIGN1clYgKyAxKTsKKyAgICAgICAgICAgICAgICB0bWIuYWRkVHJpYW5nbGUoYmVsb3dWLCBiZWxvd1YgKyAxLCBjdXJWICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG1iLmNyZWF0ZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1TdG9yZSgpIHsKKyAgICAgICAgLy8gVXNlIHN0b2NrIHRoZSBzdG9jayBwcm9ncmFtIHN0b3JlIG9iamVjdAorICAgICAgICBtUHJvZ1N0b3JlQmxlbmROb25lRGVwdGggPSBQcm9ncmFtU3RvcmUuQkxFTkRfTk9ORV9ERVBUSF9URVNUKG1SUyk7CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmUgPSBQcm9ncmFtU3RvcmUuQkxFTkRfTk9ORV9ERVBUSF9OT19ERVBUSChtUlMpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBwcm9ncmFtIHN0b3JlCisgICAgICAgIFByb2dyYW1TdG9yZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnVpbGRlci5zZXREZXB0aEZ1bmMoUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYy5BTFdBWVMpOworICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jLlNSQ19BTFBIQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYy5PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgYnVpbGRlci5zZXREaXRoZXJFbmFibGUoZmFsc2UpOworICAgICAgICBidWlsZGVyLnNldERlcHRoTWFzayhmYWxzZSk7CisgICAgICAgIG1Qcm9nU3RvcmVCbGVuZEFscGhhID0gYnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBtUHJvZ1N0b3JlQmxlbmRBZGQgPSBQcm9ncmFtU3RvcmUuQkxFTkRfQUREX0RFUFRIX05PX0RFUFRIKG1SUyk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoKG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZE5vbmUobVByb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nU3RvcmVCbGVuZEFscGhhKG1Qcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kQWRkKG1Qcm9nU3RvcmVCbGVuZEFkZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtRnJhZ21lbnQoKSB7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgdGV4QnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICB0ZXhCdWlsZGVyLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRW52TW9kZS5SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIuRm9ybWF0LlJHQkEsIDApOworICAgICAgICBtUHJvZ0ZyYWdtZW50VGV4dHVyZSA9IHRleEJ1aWxkZXIuY3JlYXRlKCk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRUZXh0dXJlLmJpbmRTYW1wbGVyKG1MaW5lYXJDbGFtcCwgMCk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIgY29sQnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlcihtUlMpOworICAgICAgICBjb2xCdWlsZGVyLnNldFZhcnlpbmdDb2xvcihmYWxzZSk7CisgICAgICAgIG1Qcm9nRnJhZ21lbnRDb2xvciA9IGNvbEJ1aWxkZXIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudENvbG9yKG1Qcm9nRnJhZ21lbnRDb2xvcik7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRUZXh0dXJlKG1Qcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1WZXJ0ZXgoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXguQnVpbGRlciBwdmIgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIG1Qcm9nVmVydGV4ID0gcHZiLmNyZWF0ZSgpOworCisgICAgICAgIG1QVkEgPSBuZXcgUHJvZ3JhbVZlcnRleC5NYXRyaXhBbGxvY2F0aW9uKG1SUyk7CisgICAgICAgIG1Qcm9nVmVydGV4LmJpbmRBbGxvY2F0aW9uKG1QVkEpOworICAgICAgICBtUFZBLnNldHVwT3J0aG9XaW5kb3cobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1ZlcnRleChtUHJvZ1ZlcnRleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDdXN0b21TaGFkZXJzKCkgeworICAgICAgICBtVlNDb25zdCA9IG5ldyBTY3JpcHRGaWVsZF9WZXJ0ZXhTaGFkZXJDb25zdGFudHNfcyhtUlMsIDEpOworICAgICAgICBtRlNDb25zdCA9IG5ldyBTY3JpcHRGaWVsZF9GcmFnZW50U2hhZGVyQ29uc3RhbnRzX3MobVJTLCAxKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ1ZTQ29uc3RhbnRzKG1WU0NvbnN0KTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dGU0NvbnN0YW50cyhtRlNDb25zdCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2hhZGVyIGJ1aWxkZXIKKyAgICAgICAgUHJvZ3JhbVZlcnRleC5TaGFkZXJCdWlsZGVyIHB2YkN1c3RvbSA9IG5ldyBQcm9ncmFtVmVydGV4LlNoYWRlckJ1aWxkZXIobVJTKTsKKyAgICAgICAgLy8gU3BlY2lmeSB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgc2hhZGVyIHN0cmluZworICAgICAgICBwdmJDdXN0b20uc2V0U2hhZGVyKG1SZXMsIFIucmF3LnNoYWRlcnYpOworICAgICAgICAvLyBVc2UgYSBzY3JpcHQgZmllbGQgdG8gc3BjaWZ5IHRoZSBpbnB1dCBsYXlvdXQKKyAgICAgICAgcHZiQ3VzdG9tLmFkZElucHV0KFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlcklucHV0c19zLmNyZWF0ZUVsZW1lbnQobVJTKSk7CisgICAgICAgIC8vIERlZmluZSB0aGUgY29uc3RhbnQgaW5wdXQgbGF5b3V0CisgICAgICAgIHB2YkN1c3RvbS5hZGRDb25zdGFudChtVlNDb25zdC5nZXRBbGxvY2F0aW9uKCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgbVByb2dWZXJ0ZXhDdXN0b20gPSBwdmJDdXN0b20uY3JlYXRlKCk7CisgICAgICAgIC8vIEJpbmQgdGhlIHNvdXJjZSBvZiBjb25zdGFudCBkYXRhCisgICAgICAgIG1Qcm9nVmVydGV4Q3VzdG9tLmJpbmRDb25zdGFudHMobVZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLCAxKTsKKyAgICAgICAgbVBWQUN1c3RvbSA9IG5ldyBQcm9ncmFtVmVydGV4Lk1hdHJpeEFsbG9jYXRpb24obVJTKTsKKyAgICAgICAgbVByb2dWZXJ0ZXhDdXN0b20uYmluZEFsbG9jYXRpb24obVBWQUN1c3RvbSk7CisKKyAgICAgICAgUHJvZ3JhbUZyYWdtZW50LlNoYWRlckJ1aWxkZXIgcGZiQ3VzdG9tID0gbmV3IFByb2dyYW1GcmFnbWVudC5TaGFkZXJCdWlsZGVyKG1SUyk7CisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHJlc291cmNlIHRoYXQgY29udGFpbnMgdGhlIHNoYWRlciBzdHJpbmcKKyAgICAgICAgcGZiQ3VzdG9tLnNldFNoYWRlcihtUmVzLCBSLnJhdy5zaGFkZXJmKTsKKyAgICAgICAgLy9UZWxsIHRoZSBidWlsZGVyIGhvdyBtYW55IHRleHR1cmVzIHdlIGhhdmUKKyAgICAgICAgcGZiQ3VzdG9tLnNldFRleHR1cmVDb3VudCgxKTsKKyAgICAgICAgLy8gRGVmaW5lIHRoZSBjb25zdGFudCBpbnB1dCBsYXlvdXQKKyAgICAgICAgcGZiQ3VzdG9tLmFkZENvbnN0YW50KG1GU0NvbnN0LmdldEFsbG9jYXRpb24oKS5nZXRUeXBlKCkpOworICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tID0gcGZiQ3VzdG9tLmNyZWF0ZSgpOworICAgICAgICAvLyBCaW5kIHRoZSBzb3VyY2Ugb2YgY29uc3RhbnQgZGF0YQorICAgICAgICBtUHJvZ0ZyYWdtZW50Q3VzdG9tLmJpbmRDb25zdGFudHMobUZTQ29uc3QuZ2V0QWxsb2NhdGlvbigpLCAxKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1ZlcnRleEN1c3RvbShtUHJvZ1ZlcnRleEN1c3RvbSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRDdXN0b20obVByb2dGcmFnbWVudEN1c3RvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIGxvYWRUZXh0dXJlUkdCKGludCBpZCkgeworICAgICAgICBmaW5hbCBBbGxvY2F0aW9uIGFsbG9jYXRpb24gPSBBbGxvY2F0aW9uLmNyZWF0ZUZyb21CaXRtYXBSZXNvdXJjZShtUlMsIG1SZXMsCisgICAgICAgICAgICAgICAgaWQsIEVsZW1lbnQuUkdCXzU2NShtUlMpLCB0cnVlKTsKKyAgICAgICAgYWxsb2NhdGlvbi51cGxvYWRUb1RleHR1cmUoMCk7CisgICAgICAgIHJldHVybiBhbGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBsb2FkVGV4dHVyZUFSR0IoaW50IGlkKSB7CisgICAgICAgIEJpdG1hcCBiID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShtUmVzLCBpZCwgbU9wdGlvbnNBUkdCKTsKKyAgICAgICAgZmluYWwgQWxsb2NhdGlvbiBhbGxvY2F0aW9uID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwKG1SUywgYiwgRWxlbWVudC5SR0JBXzg4ODgobVJTKSwgdHJ1ZSk7CisgICAgICAgIGFsbG9jYXRpb24udXBsb2FkVG9UZXh0dXJlKDApOworICAgICAgICByZXR1cm4gYWxsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlcygpIHsKKyAgICAgICAgbVRleFRvcnVzID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS50b3J1c21hcCk7CisgICAgICAgIG1UZXhPcGFxdWUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmRhdGEpOworICAgICAgICBtVGV4VHJhbnNwYXJlbnQgPSBsb2FkVGV4dHVyZUFSR0IoUi5kcmF3YWJsZS5sZWFmKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nVGV4VG9ydXMobVRleFRvcnVzKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleE9wYXF1ZShtVGV4T3BhcXVlKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRyYW5zcGFyZW50KG1UZXhUcmFuc3BhcmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRGb250cygpIHsKKyAgICAgICAgLy8gU2FucyBmb250IGJ5IGZhbWlseSBuYW1lCisgICAgICAgIG1Gb250U2FucyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzYW5zLXNlcmlmIiwgRm9udC5TdHlsZS5OT1JNQUwsIDgpOworICAgICAgICAvLyBDcmVhdGUgZm9udCBieSBmaWxlIG5hbWUKKyAgICAgICAgbUZvbnRTZXJpZiA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgIkRyb2lkU2VyaWYtUmVndWxhci50dGYiLCA4KTsKKyAgICAgICAgLy8gQ3JlYXRlIGZvbnRzIGJ5IGZhbWlseSBhbmQgc3R5bGUKKyAgICAgICAgbUZvbnRTZXJpZkJvbGQgPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtRm9udFNlcmlmSXRhbGljID0gRm9udC5jcmVhdGVGcm9tRmFtaWx5KG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5JVEFMSUMsIDgpOworICAgICAgICBtRm9udFNlcmlmQm9sZEl0YWxpYyA9IEZvbnQuY3JlYXRlRnJvbUZhbWlseShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuQk9MRF9JVEFMSUMsIDgpOworICAgICAgICBtRm9udE1vbm8gPSBGb250LmNyZWF0ZUZyb21GYW1pbHkobVJTLCBtUmVzLCAibW9ubyIsIEZvbnQuU3R5bGUuTk9STUFMLCA4KTsKKworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNhbnMobUZvbnRTYW5zKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZihtRm9udFNlcmlmKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZkJvbGQobUZvbnRTZXJpZkJvbGQpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmSXRhbGljKG1Gb250U2VyaWZJdGFsaWMpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udFNlcmlmQm9sZEl0YWxpYyhtRm9udFNlcmlmQm9sZEl0YWxpYyk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dGb250TW9ubyhtRm9udE1vbm8pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0TWVzaCgpIHsKKyAgICAgICAgbU1ieU5NZXNoID0gZ2V0TWJ5Tk1lc2goMjU2LCAyNTYsIDEwLCAxMCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNYnlOTWVzaChtTWJ5Tk1lc2gpOworCisgICAgICAgIEZpbGVBM0QgbW9kZWwgPSBGaWxlQTNELmNyZWF0ZUZyb21SZXNvdXJjZShtUlMsIG1SZXMsIFIucmF3LnRvcnVzKTsKKyAgICAgICAgRmlsZUEzRC5JbmRleEVudHJ5IGVudHJ5ID0gbW9kZWwuZ2V0SW5kZXhFbnRyeSgwKTsKKyAgICAgICAgaWYoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5nZXRDbGFzc0lEKCkgIT0gRmlsZUEzRC5DbGFzc0lELk1FU0gpIHsKKyAgICAgICAgICAgIExvZy5lKCJycyIsICJjb3VsZCBub3QgbG9hZCBtb2RlbCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbVRvcnVzID0gKE1lc2gpZW50cnkuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBtU2NyaXB0LnNldF9nVG9ydXNNZXNoKG1Ub3J1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNhbXBsZXJzKCkgeworICAgICAgICBTYW1wbGVyLkJ1aWxkZXIgYnMgPSBuZXcgU2FtcGxlci5CdWlsZGVyKG1SUyk7CisgICAgICAgIGJzLnNldE1pbihTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldE1hZyhTYW1wbGVyLlZhbHVlLkxJTkVBUik7CisgICAgICAgIGJzLnNldFdyYXBTKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuV1JBUCk7CisgICAgICAgIG1MaW5lYXJXcmFwID0gYnMuY3JlYXRlKCk7CisKKyAgICAgICAgbUxpbmVhckNsYW1wID0gU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKTsKKyAgICAgICAgbU5lYXJlc3RDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTkVBUkVTVChtUlMpOworICAgICAgICBtTWlwTGluZWFyV3JhcCA9IFNhbXBsZXIuV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihtUlMpOworCisgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJDbGFtcChtTGluZWFyQ2xhbXApOworICAgICAgICBtU2NyaXB0LnNldF9nTGluZWFyV3JhcChtTGluZWFyV3JhcCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dNaXBMaW5lYXJXcmFwKG1NaXBMaW5lYXJXcmFwKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ05lYXJlc3RDbGFtcChtTmVhcmVzdENsYW1wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFByb2dyYW1SYXN0ZXIoKSB7CisgICAgICAgIG1DdWxsQmFjayA9IFByb2dyYW1SYXN0ZXIuQ1VMTF9CQUNLKG1SUyk7CisgICAgICAgIG1DdWxsRnJvbnQgPSBQcm9ncmFtUmFzdGVyLkNVTExfRlJPTlQobVJTKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nQ3VsbEJhY2sobUN1bGxCYWNrKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0N1bGxGcm9udChtQ3VsbEZyb250KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19Sc3JlbmRlcnN0YXRlcyhtUlMsIG1SZXMsIFIucmF3LnJzcmVuZGVyc3RhdGVzLCB0cnVlKTsKKworICAgICAgICBpbml0U2FtcGxlcnMoKTsKKyAgICAgICAgaW5pdFByb2dyYW1TdG9yZSgpOworICAgICAgICBpbml0UHJvZ3JhbUZyYWdtZW50KCk7CisgICAgICAgIGluaXRQcm9ncmFtVmVydGV4KCk7CisgICAgICAgIGluaXRGb250cygpOworICAgICAgICBsb2FkSW1hZ2VzKCk7CisgICAgICAgIGluaXRNZXNoKCk7CisgICAgICAgIGluaXRQcm9ncmFtUmFzdGVyKCk7CisgICAgICAgIGluaXRDdXN0b21TaGFkZXJzKCk7CisKKyAgICAgICAgbVJTLmNvbnRleHRCaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL1JzUmVuZGVyU3RhdGVzVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDhkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9Sc1JlbmRlclN0YXRlc1ZpZXcuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zYW1wbGVzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIFJzUmVuZGVyU3RhdGVzVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJzUmVuZGVyU3RhdGVzVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUnNSZW5kZXJTdGF0ZXNSUyBtUmVuZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHcsIGludCBoKSB7CisgICAgICAgIHN1cGVyLnN1cmZhY2VDaGFuZ2VkKGhvbGRlciwgZm9ybWF0LCB3LCBoKTsKKyAgICAgICAgaWYgKG1SUyA9PSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHQodHJ1ZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJzUmVuZGVyU3RhdGVzUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICAvLyBicmVhayBwb2ludCBhdCBoZXJlCisgICAgICAgIC8vIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd29yayB3aGVuICdleHRlbmRzIFZpZXcnIGluY2x1ZGUgJ2V4dGVuZHMgU2Nyb2xsVmlldycuCisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycyBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3JzbGlzdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNmNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNsaXN0LnJzCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCitmbG9hdCBnRFk7CisKK3JzX2ZvbnQgZ0l0YWxpYzsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7Cit9IExpc3RBbGxvY3M7CisKK0xpc3RBbGxvY3MgKmdMaXN0OworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0RZLCBnSXRhbGljLCBnTGlzdCkKKwordm9pZCBpbml0KCkgeworICAgIGdEWSA9IDAuMGY7Cit9CisKK2ludCB0ZXh0UG9zID0gMDsKKworaW50IHJvb3QoaW50IGxhdW5jaElEKSB7CisKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisKKyAgICB0ZXh0UG9zIC09IChpbnQpZ0RZKjI7CisgICAgZ0RZICo9IDAuOTU7CisKKyAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisgICAgY29sb3IoMC4yLCAwLjIsIDAuMiwgMCk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYyA9IHJzR2V0QWxsb2NhdGlvbihnTGlzdCk7CisgICAgaW50IGFsbG9jU2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgobGlzdEFsbG9jKTsKKworICAgIGludCB3aWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgaW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworCisgICAgaW50IGl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9yc3JlbmRlcnN0YXRlcy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNmN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9qYXZhL1NhbXBsZXMvc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXMvcnNyZW5kZXJzdGF0ZXMucnMKQEAgLTAsMCArMSw0NTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5zYW1wbGVzKQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorI2luY2x1ZGUgInNoYWRlcl9kZWYucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUHJvZ1ZlcnRleDsKK3JzX3Byb2dyYW1fZnJhZ21lbnQgZ1Byb2dGcmFnbWVudENvbG9yOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50VGV4dHVyZTsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmROb25lRGVwdGg7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZE5vbmU7Cityc19wcm9ncmFtX3N0b3JlIGdQcm9nU3RvcmVCbGVuZEFscGhhOworcnNfcHJvZ3JhbV9zdG9yZSBnUHJvZ1N0b3JlQmxlbmRBZGQ7CisKK3JzX2FsbG9jYXRpb24gZ1RleE9wYXF1ZTsKK3JzX2FsbG9jYXRpb24gZ1RleFRvcnVzOworcnNfYWxsb2NhdGlvbiBnVGV4VHJhbnNwYXJlbnQ7CisKK3JzX21lc2ggZ01ieU5NZXNoOworcnNfbWVzaCBnVG9ydXNNZXNoOworCityc19mb250IGdGb250U2FuczsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZjsKK3JzX2ZvbnQgZ0ZvbnRTZXJpZkJvbGQ7Cityc19mb250IGdGb250U2VyaWZJdGFsaWM7Cityc19mb250IGdGb250U2VyaWZCb2xkSXRhbGljOworcnNfZm9udCBnRm9udE1vbm87CisKK2ludCBnRGlzcGxheU1vZGU7CisKK3JzX3NhbXBsZXIgZ0xpbmVhckNsYW1wOworcnNfc2FtcGxlciBnTGluZWFyV3JhcDsKK3JzX3NhbXBsZXIgZ01pcExpbmVhcldyYXA7Cityc19zYW1wbGVyIGdOZWFyZXN0Q2xhbXA7CisKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsQmFjazsKK3JzX3Byb2dyYW1fcmFzdGVyIGdDdWxsRnJvbnQ7CisKKy8vIEN1c3RvbSB2ZXJ0ZXggc2hhZGVyIGNvbXB1bmVudHMKK1ZlcnRleFNoYWRlckNvbnN0YW50cyAqZ1ZTQ29uc3RhbnRzOworRnJhZ2VudFNoYWRlckNvbnN0YW50cyAqZ0ZTQ29uc3RhbnRzOworLy8gRXhwb3J0IHRoZXNlIG91dCB0byBlYXNpbHkgc2V0IHRoZSBpbnB1dHMgdG8gc2hhZGVyCitWZXJ0ZXhTaGFkZXJJbnB1dHMgKmdWU0lucHV0czsKKy8vIEN1c3RvbSBzaGFkZXJzIHdlIHVzZSBmb3IgbGlnaHRpbmcKK3JzX3Byb2dyYW1fdmVydGV4IGdQcm9nVmVydGV4Q3VzdG9tOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUHJvZ0ZyYWdtZW50Q3VzdG9tOworCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1Byb2dWZXJ0ZXgsIGdQcm9nRnJhZ21lbnRDb2xvciwgZ1Byb2dGcmFnbWVudFRleHR1cmUpCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ1Byb2dTdG9yZUJsZW5kTm9uZURlcHRoLCBnUHJvZ1N0b3JlQmxlbmROb25lLCBnUHJvZ1N0b3JlQmxlbmRBbHBoYSwgZ1Byb2dTdG9yZUJsZW5kQWRkKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdUZXhPcGFxdWUsIGdUZXhUb3J1cywgZ1RleFRyYW5zcGFyZW50KQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdNYnlOTWVzaCwgZ1RvcnVzTWVzaCkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnRm9udFNhbnMsIGdGb250U2VyaWYsIGdGb250U2VyaWZCb2xkLCBnRm9udFNlcmlmSXRhbGljLCBnRm9udFNlcmlmQm9sZEl0YWxpYywgZ0ZvbnRNb25vKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdMaW5lYXJDbGFtcCwgZ0xpbmVhcldyYXAsIGdNaXBMaW5lYXJXcmFwLCBnTmVhcmVzdENsYW1wKQorI3ByYWdtYSBycyBleHBvcnRfdmFyKGdDdWxsQmFjaywgZ0N1bGxGcm9udCkKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnVlNDb25zdGFudHMsIGdGU0NvbnN0YW50cywgZ1ZTSW5wdXRzLCBnUHJvZ1ZlcnRleEN1c3RvbSwgZ1Byb2dGcmFnbWVudEN1c3RvbSkKKworLy9XaGF0IHdlIGFyZSBzaG93aW5nCisjcHJhZ21hIHJzIGV4cG9ydF92YXIoZ0Rpc3BsYXlNb2RlKQorCitmbG9hdCBnRHQgPSAwOworCit2b2lkIGluaXQoKSB7Cit9CisKK3ZvaWQgZGlzcGxheUZvbnRTYW1wbGVzKCkgeworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBpbnQgeVBvcyA9IDMwOworICAgIHJzZ0JpbmRGb250KGdGb250U2Fucyk7CisgICAgcnNnRHJhd1RleHQoIlNhbnMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dGb250Q29sb3IoMC41ZiwgMC45ZiwgMC41ZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRTZXJpZik7CisgICAgcnNnRHJhd1RleHQoIlNlcmlmIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDAuN2YsIDAuN2YsIDAuN2YsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBmb250IHNhbXBsZSIsIDMwLCB5UG9zKTsKKyAgICB5UG9zICs9IDMwOworICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjVmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNlcmlmSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgSXRhbGljIGZvbnQgc2FtcGxlIiwgMzAsIHlQb3MpOworICAgIHlQb3MgKz0gMzA7CisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250U2VyaWZCb2xkSXRhbGljKTsKKyAgICByc2dEcmF3VGV4dCgiU2VyaWYgQm9sZCBJdGFsaWMgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7CisgICAgeVBvcyArPSAzMDsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJNb25vc3BhY2UgZm9udCBzYW1wbGUiLCAzMCwgeVBvcyk7Cit9CisKK3ZvaWQgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpIHsKKyAgICAvLyBEZWZhdWx0IHZlcnRleCBzYWhkZXIKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeAorICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIHJzTWF0cml4TG9hZE9ydGhvKCZwcm9qLCAwLCByc2dHZXRXaWR0aCgpLCByc2dHZXRIZWlnaHQoKSwgMCwgLTEsMSk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKK30KKwordm9pZCBkaXNwbGF5U2hhZGVyU2FtcGxlcygpIHsKKyAgICBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCk7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgZmxvYXQgc3RhcnRYID0gMCwgc3RhcnRZID0gMDsKKyAgICBmbG9hdCB3aWR0aCA9IDI1NiwgaGVpZ2h0ID0gMjU2OworICAgIHJzZ0RyYXdRdWFkVGV4Q29vcmRzKHN0YXJ0WCwgc3RhcnRZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSwgMCwgMSwgMCk7CisKKyAgICBzdGFydFggPSAyMDA7IHN0YXJ0WSA9IDA7CisgICAgd2lkdGggPSAxMjg7IGhlaWdodCA9IDEyODsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEsIDApOworCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUcmFuc3BhcmVudCk7CisgICAgc3RhcnRYID0gMDsgc3RhcnRZID0gMjAwOworICAgIHdpZHRoID0gMTI4OyBoZWlnaHQgPSAxMjg7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAwKTsKKworICAgIC8vIEZyYWdtZW50IHByb2dyYW0gd2l0aCBzaW1wbGUgY29sb3IKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDb2xvcik7CisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsIDAuOSwgMC4zLCAwLjMsIDEpOworICAgIHJzZ0RyYXdSZWN0KDIwMCwgMzAwLCAzNTAsIDQ1MCwgMCk7CisgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsIDAuMywgMC45LCAwLjMsIDEpOworICAgIHJzZ0RyYXdSZWN0KDUwLCA0MDAsIDQwMCwgNjAwLCAwKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJUZXh0dXJlIHNoYWRlciIsIDEwLCA1MCk7CisgICAgcnNnRHJhd1RleHQoIkFscGhhLWJsZW5kZWQgdGV4dHVyZSBzaGFkZXIiLCAxMCwgMjgwKTsKKyAgICByc2dEcmF3VGV4dCgiRmxhdCBjb2xvciBzaGFkZXIiLCAxMDAsIDQ1MCk7Cit9CisKK3ZvaWQgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpIHsKKyAgICBpbnQgaTsKKworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRDb2xvcik7CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIGZvcihpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgZmxvYXQgaVBsdXNPbmUgPSAoZmxvYXQpKGkgKyAxKTsKKyAgICAgICAgcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcihnUHJvZ0ZyYWdtZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xZippUGx1c09uZSwgMC4yZippUGx1c09uZSwgMC4zZippUGx1c09uZSwgMSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMCwgeVBvcywgMjAwLCB5UG9zICsgMjAwLCAwKTsKKyAgICB9CisKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMmYqaVBsdXNPbmUsIDAuM2YqaVBsdXNPbmUsIDAuMWYqaVBsdXNPbmUsIDAuNSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMTUwLCB5UG9zLCAzNTAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWRkKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAzOyBpICsrKSB7CisgICAgICAgIGZsb2F0IGlQbHVzT25lID0gKGZsb2F0KShpICsgMSk7CisgICAgICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IoZ1Byb2dGcmFnbWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuM2YqaVBsdXNPbmUsIDAuMWYqaVBsdXNPbmUsIDAuMmYqaVBsdXNPbmUsIDAuNSk7CisgICAgICAgIGZsb2F0IHlQb3MgPSAxNTAgKiAoZmxvYXQpaTsKKyAgICAgICAgcnNnRHJhd1JlY3QoMzAwLCB5UG9zLCA1MDAsIHlQb3MgKyAyMDAsIDApOworICAgIH0KKworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIk5vIEJsZW5kaW5nIiwgMTAsIDUwKTsKKyAgICByc2dEcmF3VGV4dCgiQWxwaGEgQmxlbmRpbmciLCAxNjAsIDE1MCk7CisgICAgcnNnRHJhd1RleHQoIkFkZGl0aXZlIEJsZW5kaW5nIiwgMzIwLCAyNTApOworCit9CisKK3ZvaWQgZGlzcGxheU1lc2hTYW1wbGVzKCkgeworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDEyOCwgMTI4LCAwKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhPcGFxdWUpOworCisgICAgcnNnRHJhd01lc2goZ01ieU5NZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJVc2VyIGdlbiAxMCBieSAxMCBncmlkIG1lc2giLCAxMCwgMjUwKTsKK30KKwordm9pZCBkaXNwbGF5VGV4dHVyZVNhbXBsZXJzKCkgeworCisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmUpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnVGV4T3BhcXVlKTsKKworICAgIC8vIExpbmVhciBjbGFtcAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworICAgIGZsb2F0IHN0YXJ0WCA9IDAsIHN0YXJ0WSA9IDA7CisgICAgZmxvYXQgd2lkdGggPSAzMDAsIGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICAvLyBMaW5lYXIgV3JhcAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyV3JhcCk7CisgICAgc3RhcnRYID0gMDsgc3RhcnRZID0gMzAwOworICAgIHdpZHRoID0gMzAwOyBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjEsIDEuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjEsIDApOworCisgICAgLy8gTmVhcmVzdAorICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTmVhcmVzdENsYW1wKTsKKyAgICBzdGFydFggPSAzMDA7IHN0YXJ0WSA9IDA7CisgICAgd2lkdGggPSAzMDA7IGhlaWdodCA9IDMwMDsKKyAgICByc2dEcmF3UXVhZFRleENvb3JkcyhzdGFydFgsIHN0YXJ0WSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMCwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFkgKyBoZWlnaHQsIDAsIDEuMSwgMS4xLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0WCArIHdpZHRoLCBzdGFydFksIDAsIDEuMSwgMCk7CisKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ01pcExpbmVhcldyYXApOworICAgIHN0YXJ0WCA9IDMwMDsgc3RhcnRZID0gMzAwOworICAgIHdpZHRoID0gMzAwOyBoZWlnaHQgPSAzMDA7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDEuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZICsgaGVpZ2h0LCAwLCAxLjUsIDEuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLjUsIDApOworCisKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgcnNnQmluZEZvbnQoZ0ZvbnRNb25vKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgY2xhbXAiLCAxMCwgMjkwKTsKKyAgICByc2dEcmF3VGV4dCgiRmlsdGVyaW5nOiBsaW5lYXIgd3JhcCIsIDEwLCA1OTApOworICAgIHJzZ0RyYXdUZXh0KCJGaWx0ZXJpbmc6IG5lYXJlc3QgY2xhbXAiLCAzMTAsIDI5MCk7CisgICAgcnNnRHJhd1RleHQoIkZpbHRlcmluZzogbWlwbGluZWFyIHdyYXAiLCAzMTAsIDU5MCk7CisKK30KKworZmxvYXQgZ1RvcnVzUm90YXRpb24gPSAwOworCit2b2lkIGRpc3BsYXlDdWxsaW5nU2FtcGxlcygpIHsKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleCk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBBcGxseSBhIHJvdGF0aW9uIHRvIG91ciBtZXNoCisgICAgZ1RvcnVzUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ1RvcnVzUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ1RvcnVzUm90YXRpb24gLT0gMzYwLjBmOworICAgIH0KKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJm1hdHJpeCwgLTIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGZyb250IGZhY2UgY3VsbGluZworICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKGdDdWxsRnJvbnQpOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDIuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1RvcnVzUm90YXRpb24sIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkTW9kZWxNYXRyaXgoJm1hdHJpeCk7CisgICAgLy8gVXNlIGJhY2sgZmFjZSBjdWxsaW5nCisgICAgcnNnQmluZFByb2dyYW1SYXN0ZXIoZ0N1bGxCYWNrKTsKKyAgICByc2dEcmF3TWVzaChnVG9ydXNNZXNoKTsKKworICAgIHJzZ0ZvbnRDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udE1vbm8pOworICAgIHJzZ0RyYXdUZXh0KCJEaXNwbGF5aW5nIG1lc2ggZnJvbnQvYmFjayBmYWNlIGN1bGxpbmciLCAxMCwgcnNnR2V0SGVpZ2h0KCkgLSAxMCk7Cit9CisKK2Zsb2F0IGdMaWdodDBSb3RhdGlvbiA9IDA7CitmbG9hdCBnTGlnaHQxUm90YXRpb24gPSAwOworCit2b2lkIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCkgeworICAgIGZsb2F0NCBsaWdodDBQb3MgPSB7LTUuMGYsIDUuMGYsIC0xMC4wZiwgMS4wZn07CisgICAgZmxvYXQ0IGxpZ2h0MVBvcyA9IHsyLjBmLCA1LjBmLCAxNS4wZiwgMS4wZn07CisgICAgZmxvYXQzIGxpZ2h0MERpZmZDb2wgPSB7MC45ZiwgMC43ZiwgMC43Zn07CisgICAgZmxvYXQzIGxpZ2h0MFNwZWNDb2wgPSB7MC45ZiwgMC42ZiwgMC42Zn07CisgICAgZmxvYXQzIGxpZ2h0MURpZmZDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisgICAgZmxvYXQzIGxpZ2h0MVNwZWNDb2wgPSB7MC41ZiwgMC41ZiwgMC45Zn07CisKKyAgICBnTGlnaHQwUm90YXRpb24gKz0gNTAuMGYgKiBnRHQ7CisgICAgaWYoZ0xpZ2h0MFJvdGF0aW9uID4gMzYwLjBmKSB7CisgICAgICAgIGdMaWdodDBSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorICAgIGdMaWdodDFSb3RhdGlvbiAtPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnTGlnaHQxUm90YXRpb24gPiAzNjAuMGYpIHsKKyAgICAgICAgZ0xpZ2h0MVJvdGF0aW9uIC09IDM2MC4wZjsKKyAgICB9CisKKyAgICByc19tYXRyaXg0eDQgbDBNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsME1hdCwgZ0xpZ2h0MFJvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBsaWdodDBQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsME1hdCwgbGlnaHQwUG9zKTsKKyAgICByc19tYXRyaXg0eDQgbDFNYXQ7CisgICAgcnNNYXRyaXhMb2FkUm90YXRlKCZsMU1hdCwgZ0xpZ2h0MVJvdGF0aW9uLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICBsaWdodDFQb3MgPSByc01hdHJpeE11bHRpcGx5KCZsMU1hdCwgbGlnaHQxUG9zKTsKKworICAgIC8vIFNldCBsaWdodCAwIHByb3BlcnRpZXMKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9Qb3Npc2lvbi54ID0gbGlnaHQwUG9zLng7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfUG9zaXNpb24ueSA9IGxpZ2h0MFBvcy55OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQwX1Bvc2lzaW9uLnogPSBsaWdodDBQb3MuejsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9EaWZmdXNlID0gMS4wZjsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhciA9IDAuNWY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDBfQ29zaW5lUG93ZXIgPSA0MC4wZjsKKyAgICAvLyBTZXQgbGlnaHQgMSBwcm9wZXJ0aWVzCisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfUG9zaXNpb24ueCA9IGxpZ2h0MVBvcy54OworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX1Bvc2lzaW9uLnkgPSBsaWdodDFQb3MueTsKKyAgICBnVlNDb25zdGFudHMtPmxpZ2h0MV9Qb3Npc2lvbi56ID0gbGlnaHQxUG9zLno7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfRGlmZnVzZSA9IDEuMGY7CisgICAgZ1ZTQ29uc3RhbnRzLT5saWdodDFfU3BlY3VsYXIgPSAwLjdmOworICAgIGdWU0NvbnN0YW50cy0+bGlnaHQxX0Nvc2luZVBvd2VyID0gNTAuMGY7CisgICAgcnNBbGxvY2F0aW9uTWFya0RpcnR5KHJzR2V0QWxsb2NhdGlvbihnVlNDb25zdGFudHMpKTsKKworICAgIC8vIFVwZGF0ZSBmcmFnbWV0biBzaGFkZXIgY29uc3RhbnRzCisgICAgLy8gU2V0IGxpZ2h0IDAgY29sb3JzCisgICAgZ0ZTQ29uc3RhbnRzLT5saWdodDBfRGlmZnVzZUNvbG9yID0gbGlnaHQwRGlmZkNvbDsKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MF9TcGVjdWxhckNvbG9yID0gbGlnaHQwU3BlY0NvbDsKKyAgICAvLyBTZXQgbGlnaHQgMSBjb2xvcnMKKyAgICBnRlNDb25zdGFudHMtPmxpZ2h0MV9EaWZmdXNlQ29sb3IgPSBsaWdodDFEaWZmQ29sOworICAgIGdGU0NvbnN0YW50cy0+bGlnaHQxX1NwZWN1bGFyQ29sb3IgPSBsaWdodDFTcGVjQ29sOworICAgIHJzQWxsb2NhdGlvbk1hcmtEaXJ0eShyc0dldEFsbG9jYXRpb24oZ0ZTQ29uc3RhbnRzKSk7Cit9CisKK3ZvaWQgZGlzcGxheUN1c3RvbVNoYWRlclNhbXBsZXMoKSB7CisKKyAgICAvLyBVcGRhdGUgdmVydGV4IHNoYWRlciBjb25zdGFudHMKKyAgICAvLyBMb2FkIG1vZGVsIG1hdHJpeAorICAgIC8vIEFwbGx5IGEgcm90YXRpb24gdG8gb3VyIG1lc2gKKyAgICBnVG9ydXNSb3RhdGlvbiArPSA1MC4wZiAqIGdEdDsKKyAgICBpZihnVG9ydXNSb3RhdGlvbiA+IDM2MC4wZikgeworICAgICAgICBnVG9ydXNSb3RhdGlvbiAtPSAzNjAuMGY7CisgICAgfQorCisgICAgLy8gUG9zaXRpb24gb3VyIG1vZGVsIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIDAuMGYsIDAuMGYsIC0xMC4wZik7CisgICAgcnNNYXRyaXhSb3RhdGUoJmdWU0NvbnN0YW50cy0+bW9kZWwsIGdUb3J1c1JvdGF0aW9uLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmZ1ZTQ29uc3RhbnRzLT5tb2RlbCwgZ1RvcnVzUm90YXRpb24sIDAuMGYsIDAuMGYsIDEuMGYpOworICAgIHNldHVwQ3VzdG9tU2hhZGVyTGlnaHRzKCk7CisKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChnUHJvZ1ZlcnRleEN1c3RvbSk7CisgICAgLy8gU2V0dXAgdGhlIHByb2plY3Rpb25pIG1hdHJpeCB3aXRoIDYwIGRlZ3JlZSBmaWVsZCBvZiB2aWV3CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzZ0dldFdpZHRoKCkgLyAoZmxvYXQpcnNnR2V0SGVpZ2h0KCk7CisgICAgcnNNYXRyaXhMb2FkUGVyc3BlY3RpdmUoJnByb2osIDMwLjBmLCBhc3BlY3QsIDAuMWYsIDEwMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KCZwcm9qKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50Q3VzdG9tKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50Q3VzdG9tLCAwLCBnTGluZWFyQ2xhbXApOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQcm9nRnJhZ21lbnRDdXN0b20sIDAsIGdUZXhUb3J1cyk7CisKKyAgICAvLyBVc2UgYmFjayBmYWNlIGN1bGxpbmcKKyAgICByc2dCaW5kUHJvZ3JhbVJhc3RlcihnQ3VsbEJhY2spOworICAgIHJzZ0RyYXdNZXNoKGdUb3J1c01lc2gpOworCisgICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250TW9ubyk7CisgICAgcnNnRHJhd1RleHQoIkN1c3RvbSBzaGFkZXIgc2FtcGxlIiwgMTAsIHJzZ0dldEhlaWdodCgpIC0gMTApOworfQorCitpbnQgcm9vdChpbnQgbGF1bmNoSUQpIHsKKworICAgIGdEdCA9IHJzR2V0RHQoKTsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4yZiwgMC4yZiwgMC4yZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHN3aXRjaChnRGlzcGxheU1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGRpc3BsYXlGb250U2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIGRpc3BsYXlTaGFkZXJTYW1wbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZGlzcGxheUJsZW5kaW5nU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGRpc3BsYXlNZXNoU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGRpc3BsYXlUZXh0dXJlU2FtcGxlcnMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBkaXNwbGF5Q3VsbGluZ1NhbXBsZXMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBkaXNwbGF5Q3VzdG9tU2hhZGVyU2FtcGxlcygpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTA7Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaCBiL2xpYnMvcnMvamF2YS9TYW1wbGVzL3NyYy9jb20vYW5kcm9pZC9zYW1wbGVzL3NoYWRlcl9kZWYucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjk3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvU2FtcGxlcy9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcy9zaGFkZXJfZGVmLnJzaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQuc2FtcGxlcykKKwordHlwZWRlZiBzdHJ1Y3QgVmVydGV4U2hhZGVyQ29uc3RhbnRzX3MgeworICAgIHJzX21hdHJpeDR4NCBtb2RlbDsKKyAgICBmbG9hdDMgbGlnaHQwX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MF9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MF9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDBfQ29zaW5lUG93ZXI7CisKKyAgICBmbG9hdDMgbGlnaHQxX1Bvc2lzaW9uOworICAgIGZsb2F0IGxpZ2h0MV9EaWZmdXNlOworICAgIGZsb2F0IGxpZ2h0MV9TcGVjdWxhcjsKKyAgICBmbG9hdCBsaWdodDFfQ29zaW5lUG93ZXI7CisKK30gVmVydGV4U2hhZGVyQ29uc3RhbnRzOworCit0eXBlZGVmIHN0cnVjdCBGcmFnZW50U2hhZGVyQ29uc3RhbnRzX3MgeworICAgIGZsb2F0MyBsaWdodDBfRGlmZnVzZUNvbG9yOworICAgIGZsb2F0MyBsaWdodDBfU3BlY3VsYXJDb2xvcjsKKworICAgIGZsb2F0MyBsaWdodDFfRGlmZnVzZUNvbG9yOworICAgIGZsb2F0MyBsaWdodDFfU3BlY3VsYXJDb2xvcjsKKworfSBGcmFnZW50U2hhZGVyQ29uc3RhbnRzOworCit0eXBlZGVmIHN0cnVjdCBWZXJ0ZXhTaGFkZXJJbnB1dHNfcyB7CisgICAgZmxvYXQ0IHBvc2l0aW9uOworICAgIGZsb2F0MyBub3JtYWw7CisgICAgZmxvYXQ0IHRleHR1cmUwOworfSBWZXJ0ZXhTaGFkZXJJbnB1dHM7CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy9ycy9qYXZhL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5OTJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpICQoY2FsbCBhbGwtcmVuZGVyc2NyaXB0LWZpbGVzLXVuZGVyLCBzcmMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBSU1Rlc3QKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2xpYnMvcnMvamF2YS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTQ0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5ycy50ZXN0Ij4KKyAgICA8YXBwbGljYXRpb24gCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9SU19UZXN0IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSU1Rlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTc5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgUlNUZXN0IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8vRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAibGliUlNfam5pIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX0VOQUJMRUQgPSBERUJVRyA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisKKyAgICBwcml2YXRlIFJTVGVzdFZpZXcgbVZpZXc7CisKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJTVGVzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgbVZpZXcub25QYXVzZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxZTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgUlNUZXN0Q29yZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSVF9DT1VOVCA9IDUwMDAwOworCisgICAgcHVibGljIFJTVGVzdENvcmUoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgU2NyaXB0Q19UZXN0Um9vdCBtUm9vdFNjcmlwdDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmcF9tYWQoKSB7CisgICAgICAgIFNjcmlwdENfRnBNYWQgcyA9IG5ldyBTY3JpcHRDX0ZwTWFkKG1SUywgbVJlcywgUi5yYXcuZnBtYWQsIHRydWUpOworICAgICAgICBzLmludm9rZV9kb1Rlc3QoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vcHJpdmF0ZSBTY3JpcHRDX0ZvdW50YWluIG1TY3JpcHQ7CisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworCisgICAgICAgIG1Sb290U2NyaXB0ID0gbmV3IFNjcmlwdENfVGVzdFJvb3QobVJTLCBtUmVzLCBSLnJhdy50ZXN0cm9vdCwgdHJ1ZSk7CisKKyAgICAgICAgZnBfbWFkKCk7CisKKworICAgICAgICAvKgorICAgICAgICBQcm9ncmFtRnJhZ21lbnQuQnVpbGRlciBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50LkJ1aWxkZXIocnMpOworICAgICAgICBwZmIuc2V0VmFyeWluZ0NvbG9yKHRydWUpOworICAgICAgICBycy5jb250ZXh0QmluZFByb2dyYW1GcmFnbWVudChwZmIuY3JlYXRlKCkpOworCisgICAgICAgIFNjcmlwdEZpZWxkX1BvaW50IHBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChtUlMsIFBBUlRfQ09VTlQpOworCisgICAgICAgIE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIgc21iID0gbmV3IE1lc2guQWxsb2NhdGlvbkJ1aWxkZXIobVJTKTsKKyAgICAgICAgc21iLmFkZFZlcnRleEFsbG9jYXRpb24ocG9pbnRzLmdldEFsbG9jYXRpb24oKSk7CisgICAgICAgIHNtYi5hZGRJbmRleFR5cGUoUHJpbWl0aXZlLlBPSU5UKTsKKyAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfRm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbiwgdHJ1ZSk7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5jb250ZXh0QmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgICAgICovCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YSBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlMGMwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUlNUZXN0VmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIFJTVGVzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJTVGVzdENvcmUgbVJlbmRlcjsKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdChmYWxzZSk7CisgICAgICAgICAgICBtUlMuY29udGV4dFNldFN1cmZhY2UodywgaCwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFJTVGVzdENvcmUoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHQoKTsKKyAgICAgICAgfQorICAgIH0KKworLyoKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uTWFza2VkKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgZXYuZ2V0UG9pbnRlcklkKDApKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChhY3QgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfVVApIHsKKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHBvaW50ZXIgZ29pbmcgdXAsIHdlIGNhbiBnZXQgdGhlIGluZGV4IGxpa2UgdGhpcworICAgICAgICAgICAgaW50IHBvaW50ZXJJbmRleCA9IGV2LmdldEFjdGlvbkluZGV4KCk7CisgICAgICAgICAgICBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oMCwgMCwgMCwgcG9pbnRlcklkKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBldi5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBpbnQgcGNvdW50ID0gZXYuZ2V0UG9pbnRlckNvdW50KCk7CisKKyAgICAgICAgZm9yIChpbnQgcD0wOyBwIDwgcGNvdW50OyBwKyspIHsKKyAgICAgICAgICAgIGludCBpZCA9IGV2LmdldFBvaW50ZXJJZChwKTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbihldi5nZXRYKHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldFkocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0UHJlc3N1cmUocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldEhpc3RvcmljYWxYKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsWShwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0SGlzdG9yaWNhbFByZXNzdXJlKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgICovCit9CisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0ZmYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKQEAgLTAsMCArMSwxNzMgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCitjb25zdCBpbnQgVEVTVF9DT1VOVCA9IDE7CisKKyNwcmFnbWEgcnMgZXhwb3J0X3ZhcihnX3Jlc3VsdHMpCisjcHJhZ21hIHJzIGV4cG9ydF9mdW5jKGRvVGVzdCkKKworCitzdGF0aWMgZmxvYXQgZGF0YV9mMVsxMDI1XTsKK3N0YXRpYyBmbG9hdDQgZGF0YV9mNFsxMDI1XTsKKworc3RhdGljIHZvaWQgdGVzdF9tYWQ0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gODApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gKGRhdGFfZjRbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZDQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYWQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyAyMCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSAoZGF0YV9mMVtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkIE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfbm9ybSh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBub3JtYWxpemUoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9ub3JtIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvczQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwIC8gNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IHNpbihkYXRhX2Y0W2ldKSAqIGNvcyhkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvczQgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IHNpbihkYXRhX2YxW2ldKSAqIGNvcyhkYXRhX2YxW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvcyBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gY2xhbXAoZGF0YV9mMVtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKKworICAgIHN0YXJ0KCk7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA8IC0xLmYpIGRhdGFfZjFbaV0gPSAtMS5mOworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPiAtMS5mKSBkYXRhX2YxW2ldID0gMS5mOworICAgICAgICB9CisgICAgfQorCisgICAgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXAgcmVmIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcDQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDAgLzQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBjbGFtcChkYXRhX2Y0W2ldLCAtMS5mLCAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfY2xhbXA0IE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKK30KKwordm9pZCBkb1Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGZvciAoaW50IHg9MDsgeCA8IDEwMjU7IHgrKykgeworICAgICAgICBkYXRhX2YxW3hdID0gKHggJiAweGYpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS54ID0gKHggJiAweGYpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS55ID0gKHggJiAweGYwKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueiA9ICh4ICYgMHgzMykgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLncgPSAoeCAmIDB4NzcpICogMC4xZjsKKyAgICB9CisKKyAgICB0ZXN0X21hZDQoaW5kZXgpOworICAgIHRlc3RfbWFkKGluZGV4KTsKKworICAgIGZvciAoeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmICsgMS5mOworICAgIH0KKworICAgIHRlc3Rfbm9ybShpbmRleCk7CisgICAgdGVzdF9zaW5jb3M0KGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvcyhpbmRleCk7CisgICAgdGVzdF9jbGFtcDQoaW5kZXgpOworICAgIHRlc3RfY2xhbXAoaW5kZXgpOworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoIGIvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc3M2U0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCkBAIC0wLDAgKzEsMjUgQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3QpCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHRfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBuYW1lOworICAgIGJvb2wgcGFzczsKKyAgICBmbG9hdCBzY29yZTsKKyAgICBpbnQ2NF90IHRpbWU7Cit9IFRlc3RSZXN1bHQ7CitUZXN0UmVzdWx0ICpnX3Jlc3VsdHM7CisKK3N0YXRpYyBpbnQ2NF90IGdfdGltZTsKKworc3RhdGljIHZvaWQgc3RhcnQodm9pZCkgeworICAgIGdfdGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7Cit9CisKK3N0YXRpYyBmbG9hdCBlbmQodWludDMyX3QgaWR4KSB7CisgICAgaW50NjRfdCB0ID0gcnNVcHRpbWVNaWxsaXMoKSAtIGdfdGltZTsKKyAgICAvL2dfcmVzdWx0c1tpZHhdLnRpbWUgPSB0OworICAgIC8vcnNEZWJ1ZygidGVzdCB0aW1lIiwgKGludCl0KTsKKyAgICByZXR1cm4gKChmbG9hdCl0KSAvIDEwMDAuZjsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9qYXZhL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycyBiL2xpYnMvcnMvamF2YS90ZXN0cy9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiMzkxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2phdmEvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCkBAIC0wLDAgKzEsMjYgQEAKKy8vIEZvdW50YWluIHRlc3Qgc2NyaXB0CisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0KQorCisjcHJhZ21hIHN0YXRlRnJhZ21lbnQocGFyZW50KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCisKK3R5cGVkZWYgc3RydWN0IFRlc3RSZXN1bHQgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7Cit9IFRlc3RSZXN1bHRfdDsKK1Rlc3RSZXN1bHRfdCAqcmVzdWx0czsKKworI3ByYWdtYSBycyBleHBvcnRfdmFyKHJlc3VsdHMpCisvLyNwcmFnbWEgcnMgZXhwb3J0X2Z1bmMoYWRkUGFydGljbGVzKQorCitpbnQgcm9vdCgpIHsKKworICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnMuc3BlYyBiL2xpYnMvcnMvcnMuc3BlYwppbmRleCA1YWU4ZDAxLi5jN2ZiMmFmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzLnNwZWMKKysrIGIvbGlicy9ycy9ycy5zcGVjCkBAIC0xLDExICsxLDE0IEBACiAKK0NvbnRleHRGaW5pc2ggeworCWhhbmRjb2RlQXBpCisJfQogCiBDb250ZXh0QmluZFJvb3RTY3JpcHQgewogCXBhcmFtIFJzU2NyaXB0IHNhbXBsZXIKIAl9CiAKLUNvbnRleHRCaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUgewotCXBhcmFtIFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUgcGdtCitDb250ZXh0QmluZFByb2dyYW1TdG9yZSB7CisJcGFyYW0gUnNQcm9ncmFtU3RvcmUgcGdtCiAJfQogCiBDb250ZXh0QmluZFByb2dyYW1GcmFnbWVudCB7CkBAIC0yMCw2ICsyMywxMCBAQAogCXBhcmFtIFJzUHJvZ3JhbVJhc3RlciBwZ20KIAl9CiAKK0NvbnRleHRCaW5kRm9udCB7CisJcGFyYW0gUnNGb250IHBnbQorCX0KKwogQ29udGV4dFBhdXNlIHsKIAl9CiAKQEAgLTUxLDYgKzU4LDExIEBACiAJcGFyYW0gc2l6ZV90IGxlbgogCX0KIAorR2V0TmFtZSB7CisJcGFyYW0gdm9pZCAqb2JqCisJcGFyYW0gY29uc3QgY2hhciAqKm5hbWUKKwl9CisKIE9iakRlc3Ryb3kgewogCXBhcmFtIHZvaWQgKm9iagogCX0KQEAgLTY4LDkgKzgwLDIzIEBACiAJcGFyYW0gY29uc3QgUnNFbGVtZW50ICogZWxlbWVudHMKIAlwYXJhbSBjb25zdCBjaGFyICoqIG5hbWVzCiAJcGFyYW0gY29uc3Qgc2l6ZV90ICogbmFtZUxlbmd0aHMKKwlwYXJhbSBjb25zdCB1aW50MzJfdCAqIGFycmF5U2l6ZQogCXJldCBSc0VsZW1lbnQKIAl9CiAKK0VsZW1lbnRHZXROYXRpdmVEYXRhIHsKKwlwYXJhbSBSc0VsZW1lbnQgZWxlbQorCXBhcmFtIHVpbnQzMl90ICplbGVtRGF0YQorCXBhcmFtIHVpbnQzMl90IGVsZW1EYXRhU2l6ZQorCX0KKworRWxlbWVudEdldFN1YkVsZW1lbnRzIHsKKwlwYXJhbSBSc0VsZW1lbnQgZWxlbQorCXBhcmFtIHVpbnQzMl90ICppZHMKKwlwYXJhbSBjb25zdCBjaGFyICoqbmFtZXMKKwlwYXJhbSB1aW50MzJfdCBkYXRhU2l6ZQorCX0KKwogVHlwZUJlZ2luIHsKIAlwYXJhbSBSc0VsZW1lbnQgdHlwZQogCX0KQEAgLTg0LDYgKzExMCwxMiBAQAogCXJldCBSc1R5cGUKIAl9CiAKK1R5cGVHZXROYXRpdmVEYXRhIHsKKwlwYXJhbSBSc1R5cGUgdHlwZQorCXBhcmFtIHVpbnQzMl90ICogdHlwZURhdGEKKwlwYXJhbSB1aW50MzJfdCB0eXBlRGF0YVNpemUKKwl9CisKIEFsbG9jYXRpb25DcmVhdGVUeXBlZCB7CiAJcGFyYW0gUnNUeXBlIHR5cGUKIAlyZXQgUnNBbGxvY2F0aW9uCkBAIC0xNTMsNiArMTg1LDE2IEBACiAJdG9nZ2xlUGxheQogCX0KIAorQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXBhcmFtIHVpbnQzMl90IHgKKwlwYXJhbSBjb25zdCB2b2lkICpkYXRhCisJcGFyYW0gdWludDMyX3QgY29tcF9vZmZzZXQKKwlwYXJhbSB1aW50MzJfdCBieXRlcworCWhhbmRjb2RlQXBpCisJdG9nZ2xlUGxheQorCX0KKwogQWxsb2NhdGlvbjJEU3ViRGF0YSB7CiAJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCiAJcGFyYW0gdWludDMyX3QgeG9mZgpAQCAtMTYzLDYgKzIwNSwxNSBAQAogCXBhcmFtIHVpbnQzMl90IGJ5dGVzCiAJfQogCitBbGxvY2F0aW9uMkRTdWJFbGVtZW50RGF0YSB7CisJcGFyYW0gUnNBbGxvY2F0aW9uIHZhCisJcGFyYW0gdWludDMyX3QgeAorCXBhcmFtIHVpbnQzMl90IHkKKwlwYXJhbSBjb25zdCB2b2lkICpkYXRhCisJcGFyYW0gdWludDMyX3QgZWxlbWVudF9vZmZzZXQKKwlwYXJhbSB1aW50MzJfdCBieXRlcworCX0KKwogQWxsb2NhdGlvblJlYWQgewogCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQogCXBhcmFtIHZvaWQgKiBkYXRhCkBAIC0yMjQsNiArMjc1LDExIEBACiAJcGFyYW0gY29uc3Qgdm9pZCAqZGF0YQogCX0KIAorQWxsb2NhdGlvbkdldFR5cGUgeworCXBhcmFtIFJzQWxsb2NhdGlvbiB2YQorCXJldCBjb25zdCB2b2lkKgorCX0KKwogU2FtcGxlckJlZ2luIHsKIAl9CiAKQEAgLTI0OCwxMyArMzA0LDYgQEAKIFNjcmlwdENCZWdpbiB7CiAJfQogCi1TY3JpcHRTZXRDbGVhckNvbG9yIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgcgotCXBhcmFtIGZsb2F0IGcKLQlwYXJhbSBmbG9hdCBiCi0JcGFyYW0gZmxvYXQgYQotCX0KIAogU2NyaXB0U2V0VGltZVpvbmUgewogCXBhcmFtIFJzU2NyaXB0IHMKQEAgLTI2MiwzNyArMzExLDQxIEBACiAJcGFyYW0gdWludDMyX3QgbGVuZ3RoCiAJfQogCi1TY3JpcHRTZXRDbGVhckRlcHRoIHsKLQlwYXJhbSBSc1NjcmlwdCBzCi0JcGFyYW0gZmxvYXQgZGVwdGgKLQl9Ci0KLVNjcmlwdFNldENsZWFyU3RlbmNpbCB7Ci0JcGFyYW0gUnNTY3JpcHQgcwotCXBhcmFtIHVpbnQzMl90IHN0ZW5jaWwKLQl9Ci0KLVNjcmlwdFNldFR5cGUgewotCXBhcmFtIFJzVHlwZSB0eXBlCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCXBhcmFtIGJvb2wgaXNXcml0YWJsZQotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JfQotCi1TY3JpcHRTZXRJbnZva2UgewotCXBhcmFtIGNvbnN0IGNoYXIgKiBuYW1lCi0JcGFyYW0gdWludDMyX3Qgc2xvdAotCX0KIAogU2NyaXB0SW52b2tlIHsKIAlwYXJhbSBSc1NjcmlwdCBzCiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAotU2NyaXB0U2V0Um9vdCB7Ci0JcGFyYW0gYm9vbCBpc1Jvb3QKK1NjcmlwdEludm9rZVYgeworCXBhcmFtIFJzU2NyaXB0IHMKKwlwYXJhbSB1aW50MzJfdCBzbG90CisJcGFyYW0gY29uc3Qgdm9pZCAqIGRhdGEKKwlwYXJhbSB1aW50MzJfdCBkYXRhTGVuCisJaGFuZGNvZGVBcGkKKwl0b2dnbGVQbGF5CiAJfQogCitTY3JpcHRTZXRWYXJJIHsKKwlwYXJhbSBSc1NjcmlwdCBzCisJcGFyYW0gdWludDMyX3Qgc2xvdAorCXBhcmFtIGludCB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyRiB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBmbG9hdCB2YWx1ZQorCX0KKworU2NyaXB0U2V0VmFyViB7CisJcGFyYW0gUnNTY3JpcHQgcworCXBhcmFtIHVpbnQzMl90IHNsb3QKKwlwYXJhbSBjb25zdCB2b2lkICogZGF0YQorCXBhcmFtIHVpbnQzMl90IGRhdGFMZW4KKwloYW5kY29kZUFwaQorCXRvZ2dsZVBsYXkKKwl9CiAKIAogU2NyaXB0Q1NldFNjcmlwdCB7CkBAIC0zMDgsNTIgKzM2MSw0MSBAQAogCXJldCBSc1NjcmlwdAogCX0KIAotU2NyaXB0Q1NldERlZmluZUYgewotICAgIHBhcmFtIGNvbnN0IGNoYXIqIG5hbWUKLSAgICBwYXJhbSBmbG9hdCB2YWx1ZQotICAgIH0KIAotU2NyaXB0Q1NldERlZmluZUkzMiB7Ci0gICAgcGFyYW0gY29uc3QgY2hhciogbmFtZQotICAgIHBhcmFtIGludDMyX3QgdmFsdWUKLSAgICB9Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlQmVnaW4geworUHJvZ3JhbVN0b3JlQmVnaW4gewogCXBhcmFtIFJzRWxlbWVudCBpbgogCXBhcmFtIFJzRWxlbWVudCBvdXQKIAl9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlQ29sb3JNYXNrIHsKK1Byb2dyYW1TdG9yZUNvbG9yTWFzayB7CiAJcGFyYW0gYm9vbCByCiAJcGFyYW0gYm9vbCBnCiAJcGFyYW0gYm9vbCBiCiAJcGFyYW0gYm9vbCBhCiAJfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUJsZW5kRnVuYyB7CitQcm9ncmFtU3RvcmVCbGVuZEZ1bmMgewogCXBhcmFtIFJzQmxlbmRTcmNGdW5jIHNyY0Z1bmMKIAlwYXJhbSBSc0JsZW5kRHN0RnVuYyBkZXN0RnVuYwogCX0KIAotUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2sgeworUHJvZ3JhbVN0b3JlRGVwdGhNYXNrIHsKIAlwYXJhbSBib29sIGVuYWJsZQogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZURpdGhlciB7CitQcm9ncmFtU3RvcmVEaXRoZXIgewogCXBhcmFtIGJvb2wgZW5hYmxlCiB9CiAKLVByb2dyYW1GcmFnbWVudFN0b3JlRGVwdGhGdW5jIHsKK1Byb2dyYW1TdG9yZURlcHRoRnVuYyB7CiAJcGFyYW0gUnNEZXB0aEZ1bmMgZnVuYwogfQogCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZUNyZWF0ZSB7Ci0JcmV0IFJzUHJvZ3JhbUZyYWdtZW50U3RvcmUKK1Byb2dyYW1TdG9yZUNyZWF0ZSB7CisJcmV0IFJzUHJvZ3JhbVN0b3JlCiAJfQogCiBQcm9ncmFtUmFzdGVyQ3JlYXRlIHsKLQlwYXJhbSBSc0VsZW1lbnQgaW4KLQlwYXJhbSBSc0VsZW1lbnQgb3V0CiAJcGFyYW0gYm9vbCBwb2ludFNtb290aAogCXBhcmFtIGJvb2wgbGluZVNtb290aAogCXBhcmFtIGJvb2wgcG9pbnRTcHJpdGUKQEAgLTM2NSwxMiArNDA3LDExIEBACiAJcGFyYW0gZmxvYXQgbHcKIH0KIAotUHJvZ3JhbVJhc3RlclNldFBvaW50U2l6ZXsKK1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZSB7CiAJcGFyYW0gUnNQcm9ncmFtUmFzdGVyIHByCi0JcGFyYW0gZmxvYXQgcHMKKwlwYXJhbSBSc0N1bGxNb2RlIG1vZGUKIH0KIAotCiBQcm9ncmFtQmluZENvbnN0YW50cyB7CiAJcGFyYW0gUnNQcm9ncmFtIHZwCiAJcGFyYW0gdWludDMyX3Qgc2xvdApAQCAtNDE3LDM0ICs0NTgsMTAgQEAKIAlyZXQgUnNQcm9ncmFtVmVydGV4CiAJfQogCi1MaWdodEJlZ2luIHsKLQl9Ci0KLUxpZ2h0U2V0TG9jYWwgewotCXBhcmFtIGJvb2wgaXNMb2NhbAotCX0KLQotTGlnaHRTZXRNb25vY2hyb21hdGljIHsKLQlwYXJhbSBib29sIGlzTW9ubwotCX0KLQotTGlnaHRDcmVhdGUgewotCXJldCBSc0xpZ2h0IGxpZ2h0Ci0JfQotCi0KLUxpZ2h0U2V0UG9zaXRpb24gewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCB4Ci0JcGFyYW0gZmxvYXQgeQotCXBhcmFtIGZsb2F0IHoKLQl9Ci0KLUxpZ2h0U2V0Q29sb3IgewotCXBhcmFtIFJzTGlnaHQgbGlnaHQKLQlwYXJhbSBmbG9hdCByCi0JcGFyYW0gZmxvYXQgZwotCXBhcmFtIGZsb2F0IGIKK0ZpbGVBM0RDcmVhdGVGcm9tQXNzZXRTdHJlYW0geworCXBhcmFtIGNvbnN0IHZvaWQgKiBkYXRhCisJcGFyYW0gc2l6ZV90IGxlbgorCXJldCBSc0ZpbGUKIAl9CiAKIEZpbGVPcGVuIHsKQEAgLTQ1MywzMCArNDcwLDc5IEBACiAJcGFyYW0gc2l6ZV90IGxlbgogCX0KIAorRmlsZUEzREdldE51bUluZGV4RW50cmllcyB7CisJcGFyYW0gaW50MzJfdCAqIG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCX0KIAotU2ltcGxlTWVzaENyZWF0ZSB7Ci0JcmV0IFJzU2ltcGxlTWVzaAotCXBhcmFtIFJzQWxsb2NhdGlvbiBwcmltCi0JcGFyYW0gUnNBbGxvY2F0aW9uIGluZGV4Ci0JcGFyYW0gUnNBbGxvY2F0aW9uICp2dHgKK0ZpbGVBM0RHZXRJbmRleEVudHJpZXMgeworCXBhcmFtIFJzRmlsZUluZGV4RW50cnkgKiBmaWxlRW50cmllcworCXBhcmFtIHVpbnQzMl90IG51bUVudHJpZXMKKwlwYXJhbSBSc0ZpbGUgZmlsZUEzRAorCX0KKworRmlsZUEzREdldEVudHJ5QnlJbmRleCB7CisJcGFyYW0gdWludDMyX3QgaW5kZXgKKwlwYXJhbSBSc0ZpbGUgZmlsZQorCXJldCBSc09iamVjdEJhc2UKKwl9CisKK0ZvbnRDcmVhdGVGcm9tRmlsZSB7CisJcGFyYW0gY29uc3QgY2hhciAqbmFtZQorCXBhcmFtIHVpbnQzMl90IGZvbnRTaXplCisJcGFyYW0gdWludDMyX3QgZHBpCisJcmV0IFJzRm9udAorCX0KKworTWVzaENyZWF0ZSB7CisJcmV0IFJzTWVzaAogCXBhcmFtIHVpbnQzMl90IHZ0eENvdW50Ci0JcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhDb3VudAogCX0KIAotCi1TaW1wbGVNZXNoQmluZEluZGV4IHsKLQlwYXJhbSBSc1NpbXBsZU1lc2ggbWVzaAorTWVzaEJpbmRJbmRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gaWR4CisJcGFyYW0gdWludDMyX3QgcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBzbG90CiAJfQogCi1TaW1wbGVNZXNoQmluZFByaW1pdGl2ZSB7Ci0JcGFyYW0gUnNTaW1wbGVNZXNoIG1lc2gKLQlwYXJhbSBSc0FsbG9jYXRpb24gcHJpbQotCX0KLQotU2ltcGxlTWVzaEJpbmRWZXJ0ZXggewotCXBhcmFtIFJzU2ltcGxlTWVzaCBtZXNoCitNZXNoQmluZFZlcnRleCB7CisJcGFyYW0gUnNNZXNoIG1lc2gKIAlwYXJhbSBSc0FsbG9jYXRpb24gdnR4CiAJcGFyYW0gdWludDMyX3Qgc2xvdAogCX0KIAorTWVzaEdldFZlcnRleEJ1ZmZlckNvdW50IHsKKwlwYXJhbSBSc01lc2ggbWVzaAorCXBhcmFtIGludDMyX3QgKm51bVZ0eAorCX0KKworTWVzaEdldEluZGV4Q291bnQgeworCXBhcmFtIFJzTWVzaCBtZXNoCisJcGFyYW0gaW50MzJfdCAqbnVtSWR4CisJfQorCitNZXNoR2V0VmVydGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdnR4RGF0YQorCXBhcmFtIHVpbnQzMl90IHZ0eERhdGFDb3VudAorCX0KKworTWVzaEdldEluZGljZXMgeworCXBhcmFtIFJzTWVzaCBtdgorCXBhcmFtIFJzQWxsb2NhdGlvbiAqdmEKKwlwYXJhbSB1aW50MzJfdCAqcHJpbVR5cGUKKwlwYXJhbSB1aW50MzJfdCBpZHhEYXRhQ291bnQKKwl9CisKK0FuaW1hdGlvbkNyZWF0ZSB7CisJcGFyYW0gY29uc3QgZmxvYXQgKmluVmFsdWVzCisJcGFyYW0gY29uc3QgZmxvYXQgKm91dFZhbHVlcworCXBhcmFtIHVpbnQzMl90IHZhbHVlQ291bnQKKwlwYXJhbSBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gaW50ZXJwCisJcGFyYW0gUnNBbmltYXRpb25FZGdlIHByZQorCXBhcmFtIFJzQW5pbWF0aW9uRWRnZSBwb3N0CisJcmV0IFJzQW5pbWF0aW9uCisJfQorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5jcHAgYi9saWJzL3JzL3JzQWRhcHRlci5jcHAKaW5kZXggMGQzMWZhYy4uYjRlYzI1MCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FkYXB0ZXIuY3BwCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmNwcApAQCAtMTUsNyArMTUsMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTcwLDYgKzc0LDE2IEBACiAgICAgICAgICAgIG1BbGxvY2F0aW9uLmdldCgpLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpKTsKIH0KIAordm9pZCBBZGFwdGVyMUQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FkYXB0ZXIxRCAqQWRhcHRlcjFEOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIApAQCAtMTg1LDYgKzE5OSwxNSBAQAogICAgICAgICAgICBtQWxsb2NhdGlvbi5nZXQoKS0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKSk7CiB9CiAKK3ZvaWQgQWRhcHRlcjJEOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitBZGFwdGVyMkQgKkFkYXB0ZXIyRDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWRhcHRlci5oIGIvbGlicy9ycy9yc0FkYXB0ZXIuaAppbmRleCBjYjI4NzJlLi40NDllN2FkIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWRhcHRlci5oCisrKyBiL2xpYnMvcnMvcnNBZGFwdGVyLmgKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhKTsKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9BREFQVEVSXzFEOyB9CisgICAgc3RhdGljIEFkYXB0ZXIxRCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKIHByb3RlY3RlZDoKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOwogICAgIHVpbnQzMl90IG1ZOwpAQCAtODIsNiArODYsMTAgQEAKICAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSk7CiAgICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEpOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8yRDsgfQorICAgIHN0YXRpYyBBZGFwdGVyMkQgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOworCiBwcm90ZWN0ZWQ6CiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKICAgICB1aW50MzJfdCBtWjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcCBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAppbmRleCA0ZTgyNzhkLi42MDk5OGMzMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcApAQCAtMTMsMTIgKzEzLDE4IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0yOCw2ICszNCw5IEBACiAgICAgaW5pdChyc2MsIHR5cGUpOwogCiAgICAgbVB0ciA9IG1hbGxvYyhtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgbWVtc2V0KG1QdHIsIDAsIG1UeXBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQogICAgIGlmICghbVB0cikgewogICAgICAgICBMT0dFKCJBbGxvY2F0aW9uOjpBbGxvY2F0aW9uLCBhbGxvYyBmYWlsdXJlIik7CiAgICAgfQpAQCAtMTY3LDkgKzE3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgMCwgZm9ybWF0LCB0eXBlLCBwdHIpOwogICAgIH0KICAgICBpZiAobVRleHR1cmVHZW5NaXBtYXApIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgICAgICBnbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIH0KIAorICAgIHJzYy0+Y2hlY2tFcnJvcigiQWxsb2NhdGlvbjo6dXBsb2FkVG9UZXh0dXJlIik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KGNvbnN0IENvbnRleHQgKnJzYykKQEAgLTIwMSw2ICsyMTMsNyBAQAogICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1CdWZmZXJJRCk7CiAgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgbVR5cGUtPmdldFNpemVCeXRlcygpLCBnZXRQdHIoKSwgR0xfRFlOQU1JQ19EUkFXKTsKICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICByc2MtPmNoZWNrRXJyb3IoIkFsbG9jYXRpb246OnVwbG9hZFRvQnVmZmVyT2JqZWN0Iik7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6dXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKQpAQCAtMjE3LDEzICsyMzAsMTkgQEAKIH0KIAogCi12b2lkIEFsbG9jYXRpb246OmRhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQordm9pZCBBbGxvY2F0aW9uOjpkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IHNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CiAgICAgaWYgKHNpemUgIT0gc2l6ZUJ5dGVzKSB7CiAgICAgICAgIExPR0UoIkFsbG9jYXRpb246OmRhdGEgY2FsbGVkIHdpdGggbWlzbWF0Y2hlZCBzaXplIGV4cGVjdGVkICVpLCBnb3QgJWkiLCBzaXplLCBzaXplQnl0ZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICBpbmNSZWZzKGRhdGEsIHNpemVCeXRlcyAvIG1UeXBlLT5nZXRFbGVtZW50KCktPmdldFNpemVCeXRlcygpKTsKKyAgICAgICAgZGVjUmVmcyhtUHRyLCBzaXplQnl0ZXMgLyBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgfQorCiAgICAgbWVtY3B5KG1QdHIsIGRhdGEsIHNpemUpOwogICAgIHNlbmREaXJ0eSgpOwogICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKQEAgLTIzNCw3ICsyNTMsNyBAQAogICAgIG1lbWNweShkYXRhLCBtUHRyLCBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGNvdW50LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOwogICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOwpAQCAtMjQ2LDEyICsyNjUsMTggQEAKICAgICAgICAgbVR5cGUtPmR1bXBMT0dWKCJ0eXBlIGluZm8iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGlmIChtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRIYXNSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgaW5jUmVmcyhkYXRhLCBjb3VudCk7CisgICAgICAgIGRlY1JlZnMocHRyLCBjb3VudCk7CisgICAgfQorCiAgICAgbWVtY3B5KHB0ciwgZGF0YSwgc2l6ZSk7CiAgICAgc2VuZERpcnR5KCk7CiAgICAgbVVwbG9hZERlZmVyZWQgPSB0cnVlOwogfQogCi12b2lkIEFsbG9jYXRpb246OnN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCiAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIHVpbnQzMl90IGVTaXplID0gbVR5cGUtPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKQEAgLTI2OSw2ICsyOTQsMTAgQEAKIAogICAgIGZvciAodWludDMyX3QgbGluZT15b2ZmOyBsaW5lIDwgKHlvZmYraCk7IGxpbmUrKykgewogICAgICAgICB1aW50OF90ICogcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtUHRyKTsKKyAgICAgICAgaWYgKG1UeXBlLT5nZXRFbGVtZW50KCktPmdldEhhc1JlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgaW5jUmVmcyhzcmMsIHcpOworICAgICAgICAgICAgZGVjUmVmcyhkc3QsIHcpOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShkc3QsIHNyYywgbGluZVNpemUpOwogICAgICAgICBzcmMgKz0gbGluZVNpemU7CiAgICAgICAgIGRzdCArPSBkZXN0VyAqIGVTaXplOwpAQCAtMjc3LDE0ICszMDYsOTYgQEAKICAgICBtVXBsb2FkRGVmZXJlZCA9IHRydWU7CiB9CiAKLXZvaWQgQWxsb2NhdGlvbjo6c3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAordm9pZCBBbGxvY2F0aW9uOjpzdWJEYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeG9mZiwgdWludDMyX3QgeW9mZiwgdWludDMyX3Qgem9mZiwKICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBkLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiB9CiAKK3ZvaWQgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4LCBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjSWR4LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgdWludDMyX3QgZVNpemUgPSBtVHlwZS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIHVpbnQ4X3QgKiBwdHIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1QdHIpOworICAgIHB0ciArPSBlU2l6ZSAqIHg7CisKKyAgICBpZiAoY0lkeCA+PSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgY29tcG9uZW50ICVpIG91dCBvZiByYW5nZS4iLCBjSWR4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHggPj0gbVR5cGUtPmdldERpbVgoKSkgeworICAgICAgICBMT0dFKCJFcnJvciBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YSBYIG9mZnNldCAlaSBvdXQgb2YgcmFuZ2UuIiwgeCk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgWCBvZmZzZXQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgRWxlbWVudCAqIGUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZChjSWR4KTsKKyAgICBwdHIgKz0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjSWR4KTsKKworICAgIGlmIChzaXplQnl0ZXMgIT0gZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgZGF0YSBzaXplICVpIGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemUgJWkuIiwgc2l6ZUJ5dGVzLCBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgYmFkIHNpemUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGUtPmluY1JlZnMoZGF0YSk7CisgICAgICAgIGUtPmRlY1JlZnMocHRyKTsKKyAgICB9CisKKyAgICBtZW1jcHkocHRyLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIHNlbmREaXJ0eSgpOworICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKK30KKwordm9pZCBBbGxvY2F0aW9uOjpzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGNJZHgsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICB1aW50MzJfdCBlU2l6ZSA9IG1UeXBlLT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCk7CisgICAgdWludDhfdCAqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obVB0cik7CisgICAgcHRyICs9IGVTaXplICogKHggKyB5ICogbVR5cGUtPmdldERpbVgoKSk7CisKKyAgICBpZiAoeCA+PSBtVHlwZS0+Z2V0RGltWCgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIFggb2Zmc2V0ICVpIG91dCBvZiByYW5nZS4iLCB4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBYIG9mZnNldCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoeSA+PSBtVHlwZS0+Z2V0RGltWSgpKSB7CisgICAgICAgIExPR0UoIkVycm9yIEFsbG9jYXRpb246OnN1YkVsZW1lbnREYXRhIFggb2Zmc2V0ICVpIG91dCBvZiByYW5nZS4iLCB4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBYIG9mZnNldCBvdXQgb2YgcmFuZ2UuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY0lkeCA+PSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgY29tcG9uZW50ICVpIG91dCBvZiByYW5nZS4iLCBjSWR4KTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsICJzdWJFbGVtZW50RGF0YSBjb21wb25lbnQgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgRWxlbWVudCAqIGUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpLT5nZXRGaWVsZChjSWR4KTsKKyAgICBwdHIgKz0gbVR5cGUtPmdldEVsZW1lbnQoKS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjSWR4KTsKKworICAgIGlmIChzaXplQnl0ZXMgIT0gZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgQWxsb2NhdGlvbjo6c3ViRWxlbWVudERhdGEgZGF0YSBzaXplICVpIGRvZXMgbm90IG1hdGNoIGZpZWxkIHNpemUgJWkuIiwgc2l6ZUJ5dGVzLCBlLT5nZXRTaXplQnl0ZXMoKSk7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLCAic3ViRWxlbWVudERhdGEgYmFkIHNpemUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZS0+Z2V0SGFzUmVmZXJlbmNlcygpKSB7CisgICAgICAgIGUtPmluY1JlZnMoZGF0YSk7CisgICAgICAgIGUtPmRlY1JlZnMocHRyKTsKKyAgICB9CisKKyAgICBtZW1jcHkocHRyLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIHNlbmREaXJ0eSgpOworICAgIG1VcGxvYWREZWZlcmVkID0gdHJ1ZTsKK30KKwogdm9pZCBBbGxvY2F0aW9uOjphZGRQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKQogewotICAgIG1Ub0RpcnR5TGlzdC5hZGQocCk7CisgICAgbVRvRGlydHlMaXN0LnB1c2gocCk7CiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6cmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkKQEAgLTMxNiw2ICs0MjcsNjEgQEAKIAogfQogCit2b2lkIEFsbG9jYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIEZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gc2VyaWFsaXplIGlzIHRoZSB0eXBlIG9iamVjdCBzaW5jZSBpdCB3aWxsIGJlIG5lZWRlZAorICAgIC8vIHRvIGluaXRpYWxpemUgdGhlIGNsYXNzCisgICAgbVR5cGUtPnNlcmlhbGl6ZShzdHJlYW0pOworCisgICAgdWludDMyX3QgZGF0YVNpemUgPSBtVHlwZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgLy8gV3JpdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3RvcmluZworICAgIHN0cmVhbS0+YWRkVTMyKGRhdGFTaXplKTsKKyAgICAvLyBOb3cgd3JpdGUgdGhlIGRhdGEKKyAgICBzdHJlYW0tPmFkZEJ5dGVBcnJheShtUHRyLCBkYXRhU2l6ZSk7Cit9CisKK0FsbG9jYXRpb24gKkFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OKSB7CisgICAgICAgIExPR0UoImFsbG9jYXRpb24gbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBUeXBlICp0eXBlID0gVHlwZTo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIXR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHR5cGUtPmNvbXB1dGUoKTsKKworICAgIC8vIE51bWJlciBvZiBieXRlcyB3ZSB3cm90ZSBvdXQgZm9yIHRoaXMgYWxsb2NhdGlvbgorICAgIHVpbnQzMl90IGRhdGFTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYoZGF0YVNpemUgIT0gdHlwZS0+Z2V0U2l6ZUJ5dGVzKCkpIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgYWxsb2NhdGlvbiBiZWNhdXNlIG51bWJ5dGVzIHdyaXR0ZW4gaXMgbm90IHRoZSBzYW1lIGxvYWRlZCB0eXBlIHdhbnRzXG4iKTsKKyAgICAgICAgZGVsZXRlIHR5cGU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gbmV3IEFsbG9jYXRpb24ocnNjLCB0eXBlKTsKKyAgICBhbGxvYy0+c2V0TmFtZShuYW1lLnN0cmluZygpLCBuYW1lLnNpemUoKSk7CisKKyAgICAvLyBSZWFkIGluIGFsbCBvZiBvdXIgYWxsb2NhdGlvbiBkYXRhCisgICAgYWxsb2MtPmRhdGEocnNjLCBzdHJlYW0tPmdldFB0cigpICsgc3RyZWFtLT5nZXRQb3MoKSwgZGF0YVNpemUpOworICAgIHN0cmVhbS0+cmVzZXQoc3RyZWFtLT5nZXRQb3MoKSArIGRhdGFTaXplKTsKKworICAgIHJldHVybiBhbGxvYzsKK30KKwogdm9pZCBBbGxvY2F0aW9uOjpzZW5kRGlydHkoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbVRvRGlydHlMaXN0LnNpemUoKTsgY3QrKykgewpAQCAtMzIzLDYgKzQ4OSwzMiBAQAogICAgIH0KIH0KIAordm9pZCBBbGxvY2F0aW9uOjppbmNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdAoreworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KHB0cik7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IG1UeXBlLT5nZXRFbGVtZW50KCk7CisgICAgdWludDMyX3Qgc3RyaWRlID0gZS0+Z2V0U2l6ZUJ5dGVzKCk7CisKKyAgICB3aGlsZSAoY3QgPiAwKSB7CisgICAgICAgIGUtPmluY1JlZnMocCk7CisgICAgICAgIGN0IC0tOworICAgICAgICBwICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3ZvaWQgQWxsb2NhdGlvbjo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIsIHNpemVfdCBjdCkgY29uc3QKK3sKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtVHlwZS0+Z2V0RWxlbWVudCgpOworICAgIHVpbnQzMl90IHN0cmlkZSA9IGUtPmdldFNpemVCeXRlcygpOworCisgICAgd2hpbGUgKGN0ID4gMCkgeworICAgICAgICBlLT5kZWNSZWZzKHApOworICAgICAgICBjdCAtLTsKKyAgICAgICAgcCArPSBzdHJpZGU7CisgICAgfQorfQorCiAvLy8vLy8vLy8vLy8vLy8vLwogLy8KIApAQCAtNDk1LDcgKzY4Nyw3IEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQiAmJgogICAgICAgICBkc3RHTFR5cGUgPT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUgJiYKLSAgICAgICAgZHN0R0xUeXBlID09IEdMX1JHQikgeworICAgICAgICBkc3RHTEZtdCA9PSBHTF9SR0IpIHsKIAogICAgICAgICByZXR1cm4gZWxlbWVudENvbnZlcnRlcl84ODhfdG9fNTY1OwogICAgIH0KQEAgLTUwMywxNSArNjk1LDIxIEBACiAgICAgaWYgKHNyY0dMVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFICYmCiAgICAgICAgIHNyY0dMRm10ID09IEdMX1JHQkEgJiYKICAgICAgICAgZHN0R0xUeXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICYmCi0gICAgICAgIGRzdEdMVHlwZSA9PSBHTF9SR0IpIHsKKyAgICAgICAgZHN0R0xGbXQgPT0gR0xfUkdCKSB7CiAKICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb252ZXJ0ZXJfODg4OF90b181NjU7CiAgICAgfQogCiAgICAgTE9HRSgicGlja0NvbnZlcnRlciwgdW5zdXBvcnRlZCBjb21ibywgc3JjICVwLCAgZHN0ICVwIiwgc3JjLCBkc3QpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIHNyY0dMVHlwZSA9ICV4LCAgc3JjR0xGbXQgPSAleCIsIHNyY0dMVHlwZSwgc3JjR0xGbXQpOworICAgIExPR0UoInBpY2tDb252ZXJ0ZXIsIGRzdEdMVHlwZSA9ICV4LCAgZHN0R0xGbXQgPSAleCIsIGRzdEdMVHlwZSwgZHN0R0xGbXQpOworICAgIHNyYy0+ZHVtcExPR1YoIlNSQyAiKTsKKyAgICBkc3QtPmR1bXBMT0dWKCJEU1QgIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCiBSc0FsbG9jYXRpb24gcnNpX0FsbG9jYXRpb25DcmVhdGVCaXRtYXBSZWYoQ29udGV4dCAqcnNjLCBSc1R5cGUgdnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYm1wLCB2b2lkICpjYWxsYmFja0RhdGEsIFJzQml0bWFwQ2FsbGJhY2tfdCBjYWxsYmFjaykKIHsKQEAgLTU0NiwxNiArNzQ0LDE5IEBACiAgICAgfQogCiAgICAgRWxlbWVudENvbnZlcnRlcl90IGN2dCA9IHBpY2tDb252ZXJ0ZXIoZHN0LCBzcmMpOwotICAgIGN2dCh0ZXhBbGxvYy0+Z2V0UHRyKCksIGRhdGEsIHcgKiBoKTsKLQotICAgIGlmIChnZW5NaXBzKSB7Ci0gICAgICAgIEFkYXB0ZXIyRCBhZGFwdChyc2MsIHRleEFsbG9jKTsKLSAgICAgICAgQWRhcHRlcjJEIGFkYXB0Mihyc2MsIHRleEFsbG9jKTsKLSAgICAgICAgZm9yKHVpbnQzMl90IGxvZD0wOyBsb2QgPCAodGV4QWxsb2MtPmdldFR5cGUoKS0+Z2V0TE9EQ291bnQoKSAtMSk7IGxvZCsrKSB7Ci0gICAgICAgICAgICBhZGFwdC5zZXRMT0QobG9kKTsKLSAgICAgICAgICAgIGFkYXB0Mi5zZXRMT0QobG9kICsgMSk7Ci0gICAgICAgICAgICBtaXAoYWRhcHQyLCBhZGFwdCk7CisgICAgaWYgKGN2dCkgeworICAgICAgICBjdnQodGV4QWxsb2MtPmdldFB0cigpLCBkYXRhLCB3ICogaCk7CisgICAgICAgIGlmIChnZW5NaXBzKSB7CisgICAgICAgICAgICBBZGFwdGVyMkQgYWRhcHQocnNjLCB0ZXhBbGxvYyk7CisgICAgICAgICAgICBBZGFwdGVyMkQgYWRhcHQyKHJzYywgdGV4QWxsb2MpOworICAgICAgICAgICAgZm9yKHVpbnQzMl90IGxvZD0wOyBsb2QgPCAodGV4QWxsb2MtPmdldFR5cGUoKS0+Z2V0TE9EQ291bnQoKSAtMSk7IGxvZCsrKSB7CisgICAgICAgICAgICAgICAgYWRhcHQuc2V0TE9EKGxvZCk7CisgICAgICAgICAgICAgICAgYWRhcHQyLnNldExPRChsb2QgKyAxKTsKKyAgICAgICAgICAgICAgICBtaXAoYWRhcHQyLCBhZGFwdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgIlVuc3VwcG9ydGVkIGJpdG1hcCBmb3JtYXQiKTsKICAgICB9CiAKICAgICByZXR1cm4gdGV4QWxsb2M7CkBAIC01OTIsMTkgKzc5MywzMSBAQAogdm9pZCByc2lfQWxsb2NhdGlvbkRhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+ZGF0YShkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPmRhdGEocnNjLCBkYXRhLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uMURTdWJEYXRhKENvbnRleHQgKnJzYywgUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQogewogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLSAgICBhLT5zdWJEYXRhKHhvZmYsIGNvdW50LCBkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPnN1YkRhdGEocnNjLCB4b2ZmLCBjb3VudCwgZGF0YSwgc2l6ZUJ5dGVzKTsKK30KKwordm9pZCByc2lfQWxsb2NhdGlvbjJEU3ViRWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgYS0+c3ViRWxlbWVudERhdGEocnNjLCB4LCB5LCBkYXRhLCBlb2ZmLCBzaXplQnl0ZXMpOworfQorCit2b2lkIHJzaV9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZW9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBhLT5zdWJFbGVtZW50RGF0YShyc2MsIHgsIGRhdGEsIGVvZmYsIHNpemVCeXRlcyk7CiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb24yRFN1YkRhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7Ci0gICAgYS0+c3ViRGF0YSh4b2ZmLCB5b2ZmLCB3LCBoLCBkYXRhLCBzaXplQnl0ZXMpOworICAgIGEtPnN1YkRhdGEocnNjLCB4b2ZmLCB5b2ZmLCB3LCBoLCBkYXRhLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uUmVhZChDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdm9pZCAqZGF0YSkKQEAgLTYxMyw2ICs4MjYsMTUgQEAKICAgICBhLT5yZWFkKGRhdGEpOwogfQogCitjb25zdCB2b2lkKiByc2lfQWxsb2NhdGlvbkdldFR5cGUoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEpCit7CisgICAgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpOworICAgIGEtPmdldFR5cGUoKS0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGEtPmdldFR5cGUoKTsKK30KKworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uaAppbmRleCA1MTZmOGI3Li5iNmI1ZDJmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCisrKyBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKQEAgLTU2LDEzICs1NiwxOCBAQAogICAgIHVpbnQzMl90IGdldEJ1ZmZlck9iamVjdElEKCkgY29uc3Qge3JldHVybiBtQnVmZmVySUQ7fQogCiAKLSAgICB2b2lkIGRhdGEoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKLSAgICB2b2lkIHN1YkRhdGEodWludDMyX3QgeG9mZiwgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7Ci0gICAgdm9pZCBzdWJEYXRhKHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsCisgICAgdm9pZCBkYXRhKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKKyAgICB2b2lkIHN1YkRhdGEoQ29udGV4dCAqcnNjLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpOwotICAgIHZvaWQgc3ViRGF0YSh1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLCB1aW50MzJfdCB6b2ZmLAorICAgIHZvaWQgc3ViRGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IHpvZmYsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CiAKKyAgICB2b2lkIHN1YkVsZW1lbnREYXRhKENvbnRleHQgKnJzYywgdWludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVsZW1lbnRPZmYsIHVpbnQzMl90IHNpemVCeXRlcyk7CisgICAgdm9pZCBzdWJFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlbGVtZW50T2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpOworCiAgICAgdm9pZCByZWFkKHZvaWQgKmRhdGEpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcnMoKSBjb25zdDsKQEAgLTcyLDEyICs3NywyMSBAQAogICAgIHZvaWQgcmVtb3ZlUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeyByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX0FMTE9DQVRJT047IH0KKyAgICBzdGF0aWMgQWxsb2NhdGlvbiAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBsb2FkQ2hlY2soY29uc3QgQ29udGV4dCAqcnNjKTsKIAotcHJvdGVjdGVkOgorICAgIGJvb2wgZ2V0SXNUZXh0dXJlKCkgY29uc3Qge3JldHVybiBtSXNUZXh0dXJlO30KKyAgICBib29sIGdldElzQnVmZmVyT2JqZWN0KCkgY29uc3Qge3JldHVybiBtSXNWZXJ0ZXhCdWZmZXI7fQorCisgICAgdm9pZCBpbmNSZWZzKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGN0KSBjb25zdDsKKyAgICB2b2lkIGRlY1JlZnMoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgY3QpIGNvbnN0OworCiAgICAgdm9pZCBzZW5kRGlydHkoKSBjb25zdDsKIAorcHJvdGVjdGVkOgogICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbVR5cGU7CiAgICAgdm9pZCAqIG1QdHI7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNBbmltYXRpb24uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKwordm9pZCBBbmltYXRpb246OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgCit9CisKK0FuaW1hdGlvbiAqQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisvKgorQW5pbWF0aW9uOjpBbmltYXRpb24oQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQoreworICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKKyAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CisKKyAgICBtVmFsdWVzSW5wdXQgPSBOVUxMOworICAgIG1WYWx1ZXNPdXRwdXQgPSBOVUxMOworICAgIG1WYWx1ZUNvdW50ID0gMDsKKyAgICBtSW50ZXJwb2xhdGlvbiA9IFJTX0FOSU1BVElPTl9JTlRFUlBPTEFUSU9OX1NURVA7CisgICAgbUVkZ2VQcmUgPSBSU19BTklNQVRJT05fRURHRV9VTkRFRklORUQ7CisgICAgbUVkZ2VQb3N0ID0gUlNfQU5JTUFUSU9OX0VER0VfVU5ERUZJTkVEOworICAgIG1JbnB1dE1pbiA9IDA7CisgICAgbUlucHV0TWF4ID0gMDsKK30KKworQW5pbWF0aW9uICogQW5pbWF0aW9uOjpjcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluVmFsdWVzLCBjb25zdCBmbG9hdCAqb3V0VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVDb3VudCwgUnNBbmltYXRpb25JbnRlcnBvbGF0aW9uIGludGVycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIGlmICh2YWx1ZUNvdW50IDwgMikgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwgIkFuaW1hdGlvbnMgcmVxdWlyZSBtb3JlIHRoYW4gMiB2YWx1ZXMuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBbmltYXRpb24gKmEgPSBuZXcgQW5pbWF0aW9uKHJzYyk7CisgICAgaWYgKCFhKSB7CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZsb2F0ICp2aW4gPSAoZmxvYXQgKiltYWxsb2ModmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIGZsb2F0ICp2b3V0ID0gKGZsb2F0ICopbWFsbG9jKHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tVmFsdWVzSW5wdXQgPSB2aW47CisgICAgYS0+bVZhbHVlc091dHB1dCA9IHZvdXQ7CisgICAgaWYgKGEtPm1WYWx1ZXNJbnB1dCA9PSBOVUxMIHx8IGEtPm1WYWx1ZXNPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgYTsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYS0+bUVkZ2VQcmUgPSBwcmU7CisgICAgYS0+bUVkZ2VQb3N0ID0gcG9zdDsKKyAgICBhLT5tSW50ZXJwb2xhdGlvbiA9IGludGVycDsKKyAgICBhLT5tVmFsdWVDb3VudCA9IHZhbHVlQ291bnQ7CisKKyAgICBtZW1jcHkodmluLCBpblZhbHVlcywgdmFsdWVDb3VudCAqIHNpemVvZihmbG9hdCkpOworICAgIG1lbWNweSh2b3V0LCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBhLT5tSW5wdXRNaW4gPSBpblZhbHVlc1swXTsKKyAgICBhLT5tSW5wdXRNYXggPSBpblZhbHVlc1swXTsKKworICAgIGJvb2wgbmVlZFNvcnQgPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoYS0+bUlucHV0TWluID4gdmluW2N0XSkgeworICAgICAgICAgICAgbmVlZFNvcnQgPSB0cnVlOworICAgICAgICAgICAgYS0+bUlucHV0TWluID0gdmluW2N0XTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYS0+bUlucHV0TWF4IDwgdmluW2N0XSkgeworICAgICAgICAgICAgYS0+bUlucHV0TWF4ID0gdmluW2N0XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lZWRTb3J0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDwgdmFsdWVDb3VudDsgY3QrKykgeworICAgICAgICAgICAgaWYgKHZpbltjdC0xXSA+IHZpbltjdF0pIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ID0gdmluW2N0LTFdOworICAgICAgICAgICAgICAgIHZpbltjdC0xXSA9IHZpbltjdF07CisgICAgICAgICAgICAgICAgdmluW2N0XSA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHZvdXRbY3QtMV07CisgICAgICAgICAgICAgICAgdm91dFtjdC0xXSA9IHZvdXRbY3RdOworICAgICAgICAgICAgICAgIHZvdXRbY3RdID0gdDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNoYW5nZWQpIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBhOworfQorKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzQW5pbWF0aW9uIHJzaV9BbmltYXRpb25DcmVhdGUoQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqaW5WYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpvdXRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiBpbnRlcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwb3N0KQoreworICAgIC8vTE9HRSgicnNpX0VsZW1lbnRDcmVhdGUgJWkgJWkgJWkgJWkiLCBkdCwgZGssIG5vcm0sIHZlY1NpemUpOworICAgIEFuaW1hdGlvbiAqYSA9IE5VTEw7Ly9BbmltYXRpb246OmNyZWF0ZShyc2MsIGluVmFsdWVzLCBvdXRWYWx1ZXMsIHZhbHVlQ291bnQsIGludGVycCwgcHJlLCBwb3N0KTsKKyAgICBpZiAoYSAhPSBOVUxMKSB7CisgICAgICAgIGEtPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIChSc0FuaW1hdGlvbilhOworfQorCisKK30KK30KKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FuaW1hdGlvbi5oIGIvbGlicy9ycy9yc0FuaW1hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDMxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzQW5pbWF0aW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19BTklNQVRJT05fSAorI2RlZmluZSBBTkRST0lEX1JTX0FOSU1BVElPTl9ICisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisjaW5jbHVkZSAicnNPYmplY3RCYXNlLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKKworY2xhc3MgQW5pbWF0aW9uIDogcHVibGljIE9iamVjdEJhc2UKK3sKK3B1YmxpYzoKKyAgICB+QW5pbWF0aW9uKCk7CisKKyAgICBzdGF0aWMgQW5pbWF0aW9uICogY3JlYXRlKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppblZhbHVlcywgY29uc3QgZmxvYXQgKm91dFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlQ291bnQsIFJzQW5pbWF0aW9uSW50ZXJwb2xhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQW5pbWF0aW9uRWRnZSBwcmUsIFJzQW5pbWF0aW9uRWRnZSBwb3N0KTsKKworICAgIGZsb2F0IGV2YWwoZmxvYXQpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfQU5JTUFUSU9OOyB9CisgICAgc3RhdGljIEFuaW1hdGlvbiAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBBbmltYXRpb24oQ29udGV4dCAqcnNjKTsKKworCisKKyAgICBmbG9hdCBldmFsSW5SYW5nZShmbG9hdCkgY29uc3Q7CisKKworCisgICAgY29uc3QgZmxvYXQgKm1WYWx1ZXNJbnB1dDsKKyAgICBjb25zdCBmbG9hdCAqbVZhbHVlc091dHB1dDsKKyAgICB1aW50MzJfdCBtVmFsdWVDb3VudDsKKyAgICBSc0FuaW1hdGlvbkludGVycG9sYXRpb24gbUludGVycG9sYXRpb247CisgICAgUnNBbmltYXRpb25FZGdlIG1FZGdlUHJlOworICAgIFJzQW5pbWF0aW9uRWRnZSBtRWRnZVBvc3Q7CisKKyAgICAvLyBkZXJpdmVkCisgICAgZmxvYXQgbUlucHV0TWluOworICAgIGZsb2F0IG1JbnB1dE1heDsKK307CisKKworCisKK30KK30KKyNlbmRpZiAvL0FORFJPSURfU1RSVUNUVVJFRF9FTEVNRU5UX0gKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbXBvbmVudC5jcHAgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAppbmRleCAxNWE1NmY3Li5mNTFiMjNlIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29tcG9uZW50LmNwcAorKysgYi9saWJzL3JzL3JzQ29tcG9uZW50LmNwcApAQCAtMTYsNyArMTYsMTEgQEAKIAogI2luY2x1ZGUgInJzQ29tcG9uZW50LmgiCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtOTEsNiArOTUsMjYgQEAKICAgICAgICAgbU5vcm1hbGl6ZWQgPSB0cnVlOwogICAgICAgICByc0Fzc2VydChtS2luZCA9PSBSU19LSU5EX1BJWEVMX1JHQkEpOwogICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIFJTX1RZUEVfTUFUUklYXzRYNDoKKyAgICAgICAgbVR5cGVCaXRzID0gMTYgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19UWVBFX01BVFJJWF8zWDM6CisgICAgICAgIG1UeXBlQml0cyA9IDkgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19UWVBFX01BVFJJWF8yWDI6CisgICAgICAgIG1UeXBlQml0cyA9IDQgKiAzMjsKKyAgICAgICAgcnNBc3NlcnQobVZlY3RvclNpemUgPT0gMSk7CisgICAgICAgIHJzQXNzZXJ0KG1Ob3JtYWxpemVkID09IGZhbHNlKTsKKyAgICAgICAgcnNBc3NlcnQobUtpbmQgPT0gUlNfS0lORF9VU0VSKTsKKyAgICAgICAgYnJlYWs7CisKICAgICBjYXNlIFJTX1RZUEVfRUxFTUVOVDoKICAgICBjYXNlIFJTX1RZUEVfVFlQRToKICAgICBjYXNlIFJTX1RZUEVfQUxMT0NBVElPTjoKQEAgLTE0OCwxMSArMTcyLDE5IEBACiAgICAgY2FzZSBSU19UWVBFX1VOU0lHTkVEXzY0OgogICAgICAgICBtVHlwZUJpdHMgPSA2NDsKICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJTX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgbVR5cGVCaXRzID0gODsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgbUJpdHMgPSBtVHlwZUJpdHMgKiBtVmVjdG9yU2l6ZTsKIH0KIAorYm9vbCBDb21wb25lbnQ6OmlzUmVmZXJlbmNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1UeXBlID49IFJTX1RZUEVfRUxFTUVOVCk7Cit9CiAKIAogCkBAIC0xODgsODIgKzIyMCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogZ0NUeXBlU3RyaW5nc1tdID0gewotICAgIDAsCi0gICAgMCwvLyJGMTYiLAotICAgICJmbG9hdCIsCi0gICAgImRvdWJsZSIsCi0gICAgImNoYXIiLAotICAgICJzaG9ydCIsCi0gICAgImludCIsCi0gICAgMCwvLyJTNjQiLAotICAgICJjaGFyIiwvL1U4IiwKLSAgICAic2hvcnQiLC8vVTE2IiwKLSAgICAiaW50IiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGdDVmVjVHlwZVN0cmluZ3NbXSA9IHsKLSAgICAwLAotICAgIDAsLy8iRjE2IiwKLSAgICAidmVjRjMyIiwKLSAgICAidmVjRjY0IiwKLSAgICAidmVjSTgiLAotICAgICJ2ZWNJMTYiLAotICAgICJ2ZWNJMzIiLAotICAgIDAsLy8iUzY0IiwKLSAgICAidmVjVTgiLC8vVTgiLAotICAgICJ2ZWNVMTYiLC8vVTE2IiwKLSAgICAidmVjVTMyIiwvL1UzMiIsCi0gICAgMCwvLyJVNjQiLAotICAgIDAsLy8iVVBfNTY1IiwKLSAgICAwLC8vIlVQXzU1NTEiLAotICAgIDAsLy8iVVBfNDQ0NCIsCi0gICAgMCwvLyJFTEVNRU5UIiwKLSAgICAwLC8vIlRZUEUiLAotICAgIDAsLy8iQUxMT0NBVElPTiIsCi0gICAgMCwvLyJTQU1QTEVSIiwKLSAgICAwLC8vIlNDUklQVCIsCi0gICAgMCwvLyJNRVNIIiwKLSAgICAwLC8vIlBST0dSQU1fRlJBR01FTlQiLAotICAgIDAsLy8iUFJPR1JBTV9WRVJURVgiLAotICAgIDAsLy8iUFJPR1JBTV9SQVNURVIiLAotICAgIDAsLy8iUFJPR1JBTV9TVE9SRSIsCi19OwotCi1TdHJpbmc4IENvbXBvbmVudDo6Z2V0Q1R5cGUoKSBjb25zdAotewotICAgIGNoYXIgYnVmWzY0XTsKLSAgICBpZiAobVZlY3RvclNpemUgPT0gMSkgewotICAgICAgICByZXR1cm4gU3RyaW5nOChnQ1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgfQotCi0gICAgLy8gWXVjaywgYWNjIFdBUgotICAgIC8vIEFwcGVhcnMgdG8gaGF2ZSBwcm9ibGVtcyBwYWNraW5nIGNoYXJzCi0gICAgaWYgKG1WZWN0b3JTaXplID09IDQgJiYgbVR5cGUgPT0gUlNfVFlQRV9VTlNJR05FRF84KSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJpbnQiKTsKLSAgICB9Ci0KLQotICAgIFN0cmluZzggcyhnQ1ZlY1R5cGVTdHJpbmdzW21UeXBlXSk7Ci0gICAgc3ByaW50ZihidWYsICJfJWlfdCIsIG1WZWN0b3JTaXplKTsKLSAgICBzLmFwcGVuZChidWYpOwotICAgIHJldHVybiBzOwotfQotCiBTdHJpbmc4IENvbXBvbmVudDo6Z2V0R0xTTFR5cGUoKSBjb25zdAogewogICAgIGlmIChtVHlwZSA9PSBSU19UWVBFX1NJR05FRF8zMikgewpAQCAtMjgyLDEwICsyMzgsMTkgQEAKICAgICAgICAgY2FzZSA0OiByZXR1cm4gU3RyaW5nOCgidmVjNCIpOwogICAgICAgICB9CiAgICAgfQorICAgIGlmICgobVR5cGUgPT0gUlNfVFlQRV9NQVRSSVhfNFg0KSAmJiAobVZlY3RvclNpemUgPT0gMSkpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIm1hdDQiKTsKKyAgICB9CisgICAgaWYgKChtVHlwZSA9PSBSU19UWVBFX01BVFJJWF8zWDMpICYmIChtVmVjdG9yU2l6ZSA9PSAxKSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgibWF0MyIpOworICAgIH0KKyAgICBpZiAoKG1UeXBlID09IFJTX1RZUEVfTUFUUklYXzJYMikgJiYgKG1WZWN0b3JTaXplID09IDEpKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJtYXQyIik7CisgICAgfQogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogZ1R5cGVTdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGdUeXBlQmFzaWNTdHJpbmdzW10gPSB7CiAgICAgIk5PTkUiLAogICAgICJGMTYiLAogICAgICJGMzIiLApAQCAtMjk4LDkgKzI2MywxNiBAQAogICAgICJVMTYiLAogICAgICJVMzIiLAogICAgICJVNjQiLAorICAgICJCT09MRUFOIiwKICAgICAiVVBfNTY1IiwKICAgICAiVVBfNTU1MSIsCiAgICAgIlVQXzQ0NDQiLAorICAgICJNQVRSSVhfNFg0IiwKKyAgICAiTUFUUklYXzNYMyIsCisgICAgIk1BVFJJWF8yWDIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBnVHlwZU9ialN0cmluZ3NbXSA9IHsKICAgICAiRUxFTUVOVCIsCiAgICAgIlRZUEUiLAogICAgICJBTExPQ0FUSU9OIiwKQEAgLTMzMCw4ICszMDIsMzQgQEAKIAogdm9pZCBDb21wb25lbnQ6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKIHsKLSAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKLSAgICAgICAgIHByZWZpeCwgZ1R5cGVTdHJpbmdzW21UeXBlXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICBpZiAobVR5cGUgPj0gUlNfVFlQRV9FTEVNRU5UKSB7CisgICAgICAgIExPR1YoIiVzICAgQ29tcG9uZW50OiAlcywgJXMsIHZlY3RvclNpemU9JWksIGJpdHM9JWkiLAorICAgICAgICAgICAgIHByZWZpeCwgZ1R5cGVPYmpTdHJpbmdzW21UeXBlIC0gUlNfVFlQRV9FTEVNRU5UXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCIlcyAgIENvbXBvbmVudDogJXMsICVzLCB2ZWN0b3JTaXplPSVpLCBiaXRzPSVpIiwKKyAgICAgICAgICAgICBwcmVmaXgsIGdUeXBlQmFzaWNTdHJpbmdzW21UeXBlXSwgZ0tpbmRTdHJpbmdzW21LaW5kXSwgbVZlY3RvclNpemUsIG1CaXRzKTsKKyAgICB9CiB9CiAKK3ZvaWQgQ29tcG9uZW50OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbVR5cGUpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpbUtpbmQpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1Ob3JtYWxpemVkID8gMSA6IDApKTsKKyAgICBzdHJlYW0tPmFkZFUzMihtVmVjdG9yU2l6ZSk7Cit9CisKK3ZvaWQgQ29tcG9uZW50Ojpsb2FkRnJvbVN0cmVhbShJU3RyZWFtICpzdHJlYW0pCit7CisgICAgbVR5cGUgPSAoUnNEYXRhVHlwZSlzdHJlYW0tPmxvYWRVOCgpOworICAgIG1LaW5kID0gKFJzRGF0YUtpbmQpc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB1aW50OF90IHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIG1Ob3JtYWxpemVkID0gdGVtcCAhPSAwOworICAgIG1WZWN0b3JTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICBzZXQobVR5cGUsIG1LaW5kLCBtTm9ybWFsaXplZCwgbVZlY3RvclNpemUpOworfQorCisKKwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29tcG9uZW50LmggYi9saWJzL3JzL3JzQ29tcG9uZW50LmgKaW5kZXggNzFkZTMyNC4uYTc3NTA1MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbXBvbmVudC5oCisrKyBiL2xpYnMvcnMvcnNDb21wb25lbnQuaApAQCAtMzUsNyArMzUsNiBAQAogCiAgICAgdWludDMyX3QgZ2V0R0xUeXBlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0R0xGb3JtYXQoKSBjb25zdDsKLSAgICBTdHJpbmc4IGdldENUeXBlKCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSgpIGNvbnN0OwogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKIApAQCAtNDgsNiArNDcsMTIgQEAKICAgICBib29sIGdldElzU2lnbmVkKCkgY29uc3Qge3JldHVybiBtSXNTaWduZWQ7fQogICAgIHVpbnQzMl90IGdldEJpdHMoKSBjb25zdCB7cmV0dXJuIG1CaXRzO30KIAorICAgIC8vIEhlbHBlcnMgZm9yIHJlYWRpbmcgLyB3cml0aW5nIHRoaXMgY2xhc3Mgb3V0CisgICAgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdDsKKyAgICB2b2lkIGxvYWRGcm9tU3RyZWFtKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICBib29sIGlzUmVmZXJlbmNlKCkgY29uc3Q7CisKIHByb3RlY3RlZDoKICAgICBSc0RhdGFUeXBlIG1UeXBlOwogICAgIFJzRGF0YUtpbmQgbUtpbmQ7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dC5jcHAgYi9saWJzL3JzL3JzQ29udGV4dC5jcHAKaW5kZXggNTk2ZjUzMy4uZjY3YTlkNSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuY3BwCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0LmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTEyNywxOSArMTI4LDIxIEBACiB9CiAKIAotdWludDMyX3QgQ29udGV4dDo6cnVuU2NyaXB0KFNjcmlwdCAqcywgdWludDMyX3QgbGF1bmNoSUQpCit1aW50MzJfdCBDb250ZXh0OjpydW5TY3JpcHQoU2NyaXB0ICpzKQogewogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBmcmFnKG1GcmFnbWVudCk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiB2dHgobVZlcnRleCk7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gc3RvcmUobUZyYWdtZW50U3RvcmUpOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBzdG9yZShtRnJhZ21lbnRTdG9yZSk7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiByYXN0ZXIobVJhc3Rlcik7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBmb250KG1Gb250KTsKIAotICAgIHVpbnQzMl90IHJldCA9IHMtPnJ1bih0aGlzLCBsYXVuY2hJRCk7CisgICAgdWludDMyX3QgcmV0ID0gcy0+cnVuKHRoaXMpOwogCiAgICAgbUZyYWdtZW50LnNldChmcmFnKTsKICAgICBtVmVydGV4LnNldCh2dHgpOwogICAgIG1GcmFnbWVudFN0b3JlLnNldChzdG9yZSk7CiAgICAgbVJhc3Rlci5zZXQocmFzdGVyKTsKKyAgICBtRm9udC5zZXQoZm9udCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTUzLDI5ICsxNTYsMTEgQEAKIAogdWludDMyX3QgQ29udGV4dDo6cnVuUm9vdFNjcmlwdCgpCiB7Ci0gICAgdGltZXJTZXQoUlNfVElNRVJfQ0xFQVJfU1dBUCk7Ci0gICAgcnNBc3NlcnQobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1Jc1Jvb3QpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKG1FR0wubURpc3BsYXksIG1FR0wubVN1cmZhY2UsIEVHTF9XSURUSCwgJm1FR0wubVdpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UobUVHTC5tRGlzcGxheSwgbUVHTC5tU3VyZmFjZSwgRUdMX0hFSUdIVCwgJm1FR0wubUhlaWdodCk7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0KTsKLSAgICBnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLQotICAgIGdsQ2xlYXJDb2xvcihtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0sCi0gICAgICAgICAgICAgICAgIG1Sb290U2NyaXB0LT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSwKLSAgICAgICAgICAgICAgICAgbVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdLAotICAgICAgICAgICAgICAgICBtUm9vdFNjcmlwdC0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10pOwotICAgIGlmIChtVXNlRGVwdGgpIHsKLSAgICAgICAgZ2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGYobVJvb3RTY3JpcHQtPm1FbnZpcm9tZW50Lm1DbGVhckRlcHRoKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICB9CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgdGltZXJTZXQoUlNfVElNRVJfU0NSSVBUKTsKICAgICBtU3RhdGVGcmFnbWVudFN0b3JlLm1MYXN0LmNsZWFyKCk7Ci0gICAgdWludDMyX3QgcmV0ID0gcnVuU2NyaXB0KG1Sb290U2NyaXB0LmdldCgpLCAwKTsKKyAgICB1aW50MzJfdCByZXQgPSBydW5TY3JpcHQobVJvb3RTY3JpcHQuZ2V0KCkpOwogCiAgICAgY2hlY2tFcnJvcigicnVuUm9vdFNjcmlwdCIpOwogICAgIGlmIChtRXJyb3IgIT0gUlNfRVJST1JfTk9ORSkgewpAQCAtMjc0LDYgKzI1OSwyNCBAQAogICAgIHJldHVybiAwICE9IHN0cmNtcChidWYsICIwIik7CiB9CiAKK3ZvaWQgQ29udGV4dDo6ZGlzcGxheURlYnVnU3RhdHMoKQoreworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3ByaW50ZihidWZmZXIsICJGcmFtZSAlaSBtcywgU2NyaXB0ICVpIG1zIiwgbVRpbWVNU0xhc3RGcmFtZSwgbVRpbWVNU0xhc3RTY3JpcHQpOworICAgIGZsb2F0IG9sZFIsIG9sZEcsIG9sZEIsIG9sZEE7CisgICAgbVN0YXRlRm9udC5nZXRGb250Q29sb3IoJm9sZFIsICZvbGRHLCAmb2xkQiwgJm9sZEEpOworCisgICAgZmxvYXQgc2hhZG93Q29sID0gMC4yZjsKKyAgICBtU3RhdGVGb250LnNldEZvbnRDb2xvcihzaGFkb3dDb2wsIHNoYWRvd0NvbCwgc2hhZG93Q29sLCAxLjBmKTsKKyAgICBtU3RhdGVGb250LnJlbmRlclRleHQoYnVmZmVyLCA1LCBnZXRIZWlnaHQoKSAtIDUpOworCisgICAgZmxvYXQgdGV4dENvbCA9IDAuOWY7CisgICAgbVN0YXRlRm9udC5zZXRGb250Q29sb3IodGV4dENvbCwgdGV4dENvbCwgdGV4dENvbCwgMS4wZik7CisgICAgbVN0YXRlRm9udC5yZW5kZXJUZXh0KGJ1ZmZlciwgNCwgZ2V0SGVpZ2h0KCkgLSA2KTsKKworICAgIG1TdGF0ZUZvbnQuc2V0Rm9udENvbG9yKG9sZFIsIG9sZEcsIG9sZEIsIG9sZEEpOworfQorCiB2b2lkICogQ29udGV4dDo6dGhyZWFkUHJvYyh2b2lkICp2cnNjKQogewogICAgICBDb250ZXh0ICpyc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpAQCAtMjg2LDYgKzI4OSw3IEBACiAgICAgIHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zY3JpcHQiKTsKICAgICAgcnNjLT5wcm9wcy5tTG9nT2JqZWN0cyA9IGdldFByb3AoImRlYnVnLnJzLm9iamVjdCIpOwogICAgICByc2MtPnByb3BzLm1Mb2dTaGFkZXJzID0gZ2V0UHJvcCgiZGVidWcucnMuc2hhZGVyIik7CisgICAgIHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCA9IGdldFByb3AoImRlYnVnLnJzLnZpc3VhbCIpOwogCiAgICAgIFNjcmlwdFRMU1N0cnVjdCAqdGxzU3RydWN0ID0gbmV3IFNjcmlwdFRMU1N0cnVjdDsKICAgICAgaWYgKCF0bHNTdHJ1Y3QpIHsKQEAgLTMwMCwxNCArMzA0LDE2IEBACiAgICAgIH0KIAogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKLSAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVJhc3Rlci5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFJhc3RlcihOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlVmVydGV4LmluaXQocnNjLCByc2MtPm1FR0wubVdpZHRoLCByc2MtPm1FR0wubUhlaWdodCk7CisgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleC5pbml0KHJzYyk7CiAgICAgICAgICByc2MtPnNldFZlcnRleChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MsIHJzYy0+bUVHTC5tV2lkdGgsIHJzYy0+bUVHTC5tSGVpZ2h0KTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnQuaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5zZXRGcmFnbWVudChOVUxMKTsKLSAgICAgICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5pbml0KHJzYywgcnNjLT5tRUdMLm1XaWR0aCwgcnNjLT5tRUdMLm1IZWlnaHQpOworICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmluaXQocnNjKTsKICAgICAgICAgIHJzYy0+c2V0RnJhZ21lbnRTdG9yZShOVUxMKTsKKyAgICAgICAgIHJzYy0+bVN0YXRlRm9udC5pbml0KHJzYyk7CisgICAgICAgICByc2MtPnNldEZvbnQoTlVMTCk7CiAgICAgICAgICByc2MtPm1TdGF0ZVZlcnRleEFycmF5LmluaXQocnNjKTsKICAgICAgfQogCkBAIC0zMjEsNiArMzI3LDExIEBACiAgICAgICAgICB1aW50MzJfdCB0YXJnZXRUaW1lID0gMDsKICAgICAgICAgIGlmIChtRHJhdyAmJiByc2MtPm1Jc0dyYXBoaWNzQ29udGV4dCkgewogICAgICAgICAgICAgIHRhcmdldFRpbWUgPSByc2MtPnJ1blJvb3RTY3JpcHQoKTsKKworICAgICAgICAgICAgIGlmKHJzYy0+cHJvcHMubUxvZ1Zpc3VhbCkgeworICAgICAgICAgICAgICAgICByc2MtPmRpc3BsYXlEZWJ1Z1N0YXRzKCk7CisgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgbURyYXcgPSB0YXJnZXRUaW1lICYmICFyc2MtPm1QYXVzZWQ7CiAgICAgICAgICAgICAgcnNjLT50aW1lclNldChSU19USU1FUl9DTEVBUl9TV0FQKTsKICAgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhyc2MtPm1FR0wubURpc3BsYXksIHJzYy0+bUVHTC5tU3VyZmFjZSk7CkBAIC0zMjksOSArMzQwLDYgQEAKICAgICAgICAgICAgICByc2MtPnRpbWVyUHJpbnQoKTsKICAgICAgICAgICAgICByc2MtPnRpbWVyUmVzZXQoKTsKICAgICAgICAgIH0KLSAgICAgICAgIGlmIChyc2MtPm1PYmpEZXN0cm95Lm1OZWVkVG9FbXB0eSkgewotICAgICAgICAgICAgIHJzYy0+b2JqRGVzdHJveU9PQlJ1bigpOwotICAgICAgICAgfQogICAgICAgICAgaWYgKHJzYy0+bVRocmVhZFByaW9yaXR5ID4gMCAmJiB0YXJnZXRUaW1lKSB7CiAgICAgICAgICAgICAgaW50MzJfdCB0ID0gKHRhcmdldFRpbWUgLSAoaW50MzJfdCkocnNjLT5tVGltZU1TTGFzdFNjcmlwdCArIHJzYy0+bVRpbWVNU0xhc3RTd2FwKSkgKiAxMDAwOwogICAgICAgICAgICAgIGlmICh0ID4gMCkgewpAQCAtMzQ2LDE3ICszNTQsMTYgQEAKICAgICAgICAgIHJzYy0+bUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICByc2MtPm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bUZyYWdtZW50U3RvcmUuY2xlYXIoKTsKKyAgICAgICAgIHJzYy0+bUZvbnQuY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bVJvb3RTY3JpcHQuY2xlYXIoKTsKICAgICAgICAgIHJzYy0+bVN0YXRlUmFzdGVyLmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVWZXJ0ZXguZGVpbml0KHJzYyk7CiAgICAgICAgICByc2MtPm1TdGF0ZUZyYWdtZW50LmRlaW5pdChyc2MpOwogICAgICAgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLmRlaW5pdChyc2MpOworICAgICAgICAgcnNjLT5tU3RhdGVGb250LmRlaW5pdChyc2MpOwogICAgICB9CiAgICAgIE9iamVjdEJhc2U6Onplcm9BbGxVc2VyUmVmKHJzYyk7CiAKLSAgICAgcnNjLT5tT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkgPSB0cnVlOwotICAgICByc2MtPm9iakRlc3Ryb3lPT0JSdW4oKTsKLQogICAgICBpZiAocnNjLT5tSXNHcmFwaGljc0NvbnRleHQpIHsKICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CiAgICAgICAgICByc2MtPmRlaW5pdEVHTCgpOwpAQCAtMzY3LDYgKzM3NCw0OSBAQAogICAgICByZXR1cm4gTlVMTDsKIH0KIAordm9pZCAqIENvbnRleHQ6OmhlbHBlclRocmVhZFByb2Modm9pZCAqdnJzYykKK3sKKyAgICAgQ29udGV4dCAqcnNjID0gc3RhdGljX2Nhc3Q8Q29udGV4dCAqPih2cnNjKTsKKyAgICAgdWludDMyX3QgaWR4ID0gKHVpbnQzMl90KWFuZHJvaWRfYXRvbWljX2luYygmcnNjLT5tV29ya2Vycy5tTGF1bmNoQ291bnQpOworCisgICAgIExPR1YoIlJTIGhlbHBlclRocmVhZCBzdGFydGluZyAlcCBpZHg9JWkiLCByc2MsIGlkeCk7CisKKyAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLmluaXQoKTsKKyAgICAgcnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSA9IGdldHRpZCgpOworCisgICAgIC8vY3B1X3NldF90IGNwc2V0WzE2XTsKKyAgICAgLy9pbnQgcmV0ID0gc2NoZWRfZ2V0YWZmaW5pdHkocnNjLT5tV29ya2Vycy5tTmF0aXZlVGhyZWFkSWRbaWR4XSwgc2l6ZW9mKGNwc2V0KSwgJmNwc2V0KTsKKyAgICAgLy9MT0dFKCJyZXQgPSAlaSIsIHJldCk7CisKKy8vc2NoZWRfc2V0YWZmaW5pdHkKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHJzYy0+bVdvcmtlcnMubU5hdGl2ZVRocmVhZElkW2lkeF0sIHJzYy0+bVRocmVhZFByaW9yaXR5KTsKKyAgICAgd2hpbGUocnNjLT5tUnVubmluZykgeworICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tpZHhdLndhaXQoKTsKKyAgICAgICAgIGlmIChyc2MtPm1Xb3JrZXJzLm1MYXVuY2hDYWxsYmFjaykgeworICAgICAgICAgICAgcnNjLT5tV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2socnNjLT5tV29ya2Vycy5tTGF1bmNoRGF0YSwgaWR4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGFuZHJvaWRfYXRvbWljX2RlYygmcnNjLT5tV29ya2Vycy5tUnVubmluZ0NvdW50KTsKKyAgICAgICAgIHJzYy0+bVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLnNldCgpOworICAgICB9CisKKyAgICAgTE9HVigiUlMgaGVscGVyVGhyZWFkIGV4aXRpbmcgJXAgaWR4PSVpIiwgcnNjLCBpZHgpOworICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBDb250ZXh0OjpsYXVuY2hUaHJlYWRzKFdvcmtlckNhbGxiYWNrX3QgY2JrLCB2b2lkICpkYXRhKQoreworICAgIG1Xb3JrZXJzLm1MYXVuY2hEYXRhID0gZGF0YTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBjYms7CisgICAgbVdvcmtlcnMubVJ1bm5pbmdDb3VudCA9IChpbnQpbVdvcmtlcnMubUNvdW50OworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFsc1tjdF0uc2V0KCk7CisgICAgfQorICAgIHdoaWxlKG1Xb3JrZXJzLm1SdW5uaW5nQ291bnQpIHsKKyAgICAgICAgbVdvcmtlcnMubUNvbXBsZXRlU2lnbmFsLndhaXQoKTsKKyAgICB9Cit9CisKIHZvaWQgQ29udGV4dDo6c2V0UHJpb3JpdHkoaW50MzJfdCBwKQogewogICAgIC8vIE5vdGU6IElmIHdlIHB1dCB0aGlzIGluIHRoZSBwcm9wZXIgImJhY2tncm91bmQiIHBvbGljeQpAQCAtMzgzLDcgKzQzMywxMCBAQAogICAgICAgICAvLyBzdWNjZXNzOyByZXNldCB0aGUgcHJpb3JpdHkgYXMgd2VsbAogICAgIH0KICNlbHNlCi0gICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgbU5hdGl2ZVRocmVhZElkLCBwKTsKKyAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1OYXRpdmVUaHJlYWRJZCwgcCk7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Xb3JrZXJzLm1Db3VudDsgY3QrKykgeworICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZFtjdF0sIHApOworICAgIH0KICNlbmRpZgogfQogCkBAIC00MjksMjAgKzQ4MiwzOSBAQAogCiAgICAgbVduZFN1cmZhY2UgPSBOVUxMOwogCi0gICAgb2JqRGVzdHJveU9PQkluaXQoKTsKICAgICB0aW1lckluaXQoKTsKICAgICB0aW1lclNldChSU19USU1FUl9JTlRFUk5BTCk7CiAKLSAgICBMT0dWKCJSUyBMYXVuY2hpbmcgdGhyZWFkIik7CisgICAgaW50IGNwdSA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworICAgIExPR1YoIlJTIExhdW5jaGluZyB0aHJlYWQocyksIHJlcG9ydGVkIENQVSBjb3VudCAlaSIsIGNwdSk7CisgICAgaWYgKGNwdSA8IDIpIGNwdSA9IDA7CisKKyAgICBtV29ya2Vycy5tQ291bnQgPSAodWludDMyX3QpY3B1OworICAgIG1Xb3JrZXJzLm1UaHJlYWRJZCA9IChwdGhyZWFkX3QgKikgY2FsbG9jKG1Xb3JrZXJzLm1Db3VudCwgc2l6ZW9mKHB0aHJlYWRfdCkpOworICAgIG1Xb3JrZXJzLm1OYXRpdmVUaHJlYWRJZCA9IChwaWRfdCAqKSBjYWxsb2MobVdvcmtlcnMubUNvdW50LCBzaXplb2YocGlkX3QpKTsKKyAgICBtV29ya2Vycy5tTGF1bmNoU2lnbmFscyA9IG5ldyBTaWduYWxbbVdvcmtlcnMubUNvdW50XTsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ2FsbGJhY2sgPSBOVUxMOwogICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkSWQsICZ0aHJlYWRBdHRyLCB0aHJlYWRQcm9jLCB0aGlzKTsKICAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzdGFydCBycyBjb250ZXh0IHRocmVhZC4iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLQogICAgIHdoaWxlKCFtUnVubmluZykgewogICAgICAgICB1c2xlZXAoMTAwKTsKICAgICB9CiAKKyAgICBtV29ya2Vycy5tUnVubmluZ0NvdW50ID0gMDsKKyAgICBtV29ya2Vycy5tTGF1bmNoQ291bnQgPSAwOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtV29ya2Vycy5tQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoJm1Xb3JrZXJzLm1UaHJlYWRJZFtjdF0sICZ0aHJlYWRBdHRyLCBoZWxwZXJUaHJlYWRQcm9jLCB0aGlzKTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgbVdvcmtlcnMubUNvdW50ID0gY3Q7CisgICAgICAgICAgICBMT0dFKCJDcmVhdGVkIGZld2VyIHRoYW4gZXhwZWN0ZWQgbnVtYmVyIG9mIFJTIHRocmVhZHMuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZEF0dHIpOwogfQogCkBAIC00NTUsOCArNTI3LDYgQEAKIAogICAgIG1JTy5zaHV0ZG93bigpOwogICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX2pvaW4obVRocmVhZElkLCAmcmVzKTsKLSAgICBtT2JqRGVzdHJveS5tTmVlZFRvRW1wdHkgPSB0cnVlOwotICAgIG9iakRlc3Ryb3lPT0JSdW4oKTsKIAogICAgIC8vIEdsb2JhbCBzdHJ1Y3R1cmUgY2xlYW51cC4KICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwpAQCAtNDY5LDggKzUzOSw2IEBACiAgICAgICAgIG1EZXYgPSBOVUxMOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7Ci0KLSAgICBvYmpEZXN0cm95T09CRGVzdHJveSgpOwogfQogCiB2b2lkIENvbnRleHQ6OnNldFN1cmZhY2UodWludDMyX3QgdywgdWludDMyX3QgaCwgQU5hdGl2ZVdpbmRvdyAqc3VyKQpAQCAtNDg2LDE0ICs1NTQsMTQgQEAKICAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsRGVzdHJveVN1cmZhY2UiLCByZXQpOwogCiAgICAgICAgIG1FR0wubVN1cmZhY2UgPSBOVUxMOwotICAgICAgICBtRUdMLm1XaWR0aCA9IDA7Ci0gICAgICAgIG1FR0wubUhlaWdodCA9IDA7CiAgICAgICAgIG1XaWR0aCA9IDA7CiAgICAgICAgIG1IZWlnaHQgPSAwOwogICAgIH0KIAogICAgIG1XbmRTdXJmYWNlID0gc3VyOwogICAgIGlmIChtV25kU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIG1XaWR0aCA9IHc7CisgICAgICAgIG1IZWlnaHQgPSBoOwogICAgICAgICBib29sIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgIGlmICghbUVHTC5tQ29udGV4dCkgewogICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwpAQCAtNTExLDE1ICs1NzksNyBAQAogICAgICAgICByZXQgPSBlZ2xNYWtlQ3VycmVudChtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBtRUdMLm1TdXJmYWNlLCBtRUdMLm1Db250ZXh0KTsKICAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXQpOwogCi0gICAgICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfV0lEVEgsICZtRUdMLm1XaWR0aCk7Ci0gICAgICAgIGVnbFF1ZXJ5U3VyZmFjZShtRUdMLm1EaXNwbGF5LCBtRUdMLm1TdXJmYWNlLCBFR0xfSEVJR0hULCAmbUVHTC5tSGVpZ2h0KTsKLSAgICAgICAgbVdpZHRoID0gdzsKLSAgICAgICAgbUhlaWdodCA9IGg7Ci0gICAgICAgIG1TdGF0ZVZlcnRleC51cGRhdGVTaXplKHRoaXMsIHcsIGgpOwotCi0gICAgICAgIGlmICgoaW50KW1XaWR0aCAhPSBtRUdMLm1XaWR0aCB8fCAoaW50KW1IZWlnaHQgIT0gbUVHTC5tSGVpZ2h0KSB7Ci0gICAgICAgICAgICBMT0dFKCJFR0wvU3VyZmFjZSBtaXNtYXRjaCAgRUdMICglaSB4ICVpKSAgU0YgKCVpIHggJWkpIiwgbUVHTC5tV2lkdGgsIG1FR0wubUhlaWdodCwgbVdpZHRoLCBtSGVpZ2h0KTsKLSAgICAgICAgfQorICAgICAgICBtU3RhdGVWZXJ0ZXgudXBkYXRlU2l6ZSh0aGlzKTsKIAogICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgIG1HTC5tVmVyc2lvbiA9IGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pOwpAQCAtNTgzLDcgKzY0Myw3IEBACiAgICAgbVJvb3RTY3JpcHQuc2V0KHMpOwogfQogCi12b2lkIENvbnRleHQ6OnNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcykKK3ZvaWQgQ29udGV4dDo6c2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtU3RvcmUgKnBmcykKIHsKICAgICByc0Fzc2VydChtSXNHcmFwaGljc0NvbnRleHQpOwogICAgIGlmIChwZnMgPT0gTlVMTCkgewpAQCAtNjIzLDYgKzY4MywxNiBAQAogICAgIH0KIH0KIAordm9pZCBDb250ZXh0OjpzZXRGb250KEZvbnQgKmYpCit7CisgICAgcnNBc3NlcnQobUlzR3JhcGhpY3NDb250ZXh0KTsKKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIG1Gb250LnNldChtU3RhdGVGb250Lm1EZWZhdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRm9udC5zZXQoZik7CisgICAgfQorfQorCiB2b2lkIENvbnRleHQ6OmFzc2lnbk5hbWUoT2JqZWN0QmFzZSAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBsZW4pCiB7CiAgICAgcnNBc3NlcnQoIW9iai0+Z2V0TmFtZSgpKTsKQEAgLTY0MCw5MCArNzEwLDEzIEBACiAgICAgfQogfQogCi1PYmplY3RCYXNlICogQ29udGV4dDo6bG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAotewotICAgIGZvcihzaXplX3QgY3Q9MDsgY3QgPCBtTmFtZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIG1OYW1lc1tjdF0tPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZXNbY3RdOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIENvbnRleHQ6OmFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbU5hbWVzLnNpemUoKTsgY3QrKykgewotICAgICAgICBzdHItPmFwcGVuZCgiI2RlZmluZSBOQU1FRF8iKTsKLSAgICAgICAgc3RyLT5hcHBlbmQobU5hbWVzW2N0XS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlaVxuIiwgKGludCltTmFtZXNbY3RdKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoYnVmKTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29udGV4dDo6b2JqRGVzdHJveU9PQkluaXQoKQotewotICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1PYmpEZXN0cm95Lm1NdXRleCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJDb250ZXh0OjpPYmpEZXN0cm95T09CSW5pdCBtdXRleCBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb250ZXh0OjpvYmpEZXN0cm95T09CUnVuKCkKLXsKLSAgICBpZiAobU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChzaXplX3QgY3QgPSAwOyBjdCA8IG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdC5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgICAgIG1PYmpEZXN0cm95Lm1EZXN0cm95TGlzdFtjdF0tPmRlY1VzZXJSZWYoKTsKLSAgICAgICAgfQotICAgICAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuY2xlYXIoKTsKLSAgICAgICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENvbnRleHQ6Om9iakRlc3Ryb3lPT0JEZXN0cm95KCkKLXsKLSAgICByc0Fzc2VydCghbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1PYmpEZXN0cm95Lm1NdXRleCk7Ci19Ci0KLXZvaWQgQ29udGV4dDo6b2JqRGVzdHJveUFkZChPYmplY3RCYXNlICpvYmopCi17Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIGxvY2tpbmcgZm9yIE9PQlJ1bi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbU9iakRlc3Ryb3kubU5lZWRUb0VtcHR5ID0gdHJ1ZTsKLSAgICBtT2JqRGVzdHJveS5tRGVzdHJveUxpc3QuYWRkKG9iaik7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU9iakRlc3Ryb3kubU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkNvbnRleHQ6Ok9iakRlc3Ryb3lPT0JSdW46IGVycm9yICVpIHVubG9ja2luZyBmb3Igc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLX0KLQogdWludDMyX3QgQ29udGV4dDo6Z2V0TWVzc2FnZVRvQ2xpZW50KHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIC8vTE9HRSgiZ2V0TWVzc2FnZVRvQ2xpZW50ICVpICVpIiwgYnVmZmVyTGVuLCB3YWl0KTsKKyAgICAqcmVjZWl2ZUxlbiA9IDA7CiAgICAgaWYgKCF3YWl0KSB7CiAgICAgICAgIGlmIChtSU8ubVRvQ2xpZW50LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gTm8gbWVzc2FnZSB0byBnZXQgYW5kIG5vdCBnb2luZyB0byB3YWl0IGZvciBvbmUuCi0gICAgICAgICAgICByZWNlaXZlTGVuID0gMDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtNzUxLDE1ICs3NDQsMTkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoIXdhaXRGb3JTcGFjZSkgewotICAgICAgICBpZiAobUlPLm1Ub0NsaWVudC5nZXRGcmVlU3BhY2UoKSA8IGxlbikgeworICAgICAgICBpZiAoIW1JTy5tVG9DbGllbnQubWFrZVNwYWNlTm9uQmxvY2tpbmcobGVuICsgOCkpIHsKICAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggcm9vbSwgYW5kIG5vdCB3YWl0aW5nLgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogICAgIC8vTE9HRSgic2VuZE1lc3NhZ2VUb0NsaWVudCAyIik7Ci0gICAgdm9pZCAqcCA9IG1JTy5tVG9DbGllbnQucmVzZXJ2ZShsZW4pOwotICAgIG1lbWNweShwLCBkYXRhLCBsZW4pOwotICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHZvaWQgKnAgPSBtSU8ubVRvQ2xpZW50LnJlc2VydmUobGVuKTsKKyAgICAgICAgbWVtY3B5KHAsIGRhdGEsIGxlbik7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1JTy5tVG9DbGllbnQuY29tbWl0KGNtZElELCAwKTsKKyAgICB9CiAgICAgLy9MT0dFKCJzZW5kTWVzc2FnZVRvQ2xpZW50IDMiKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTc5OSw4ICs3OTYsNyBAQAogICAgIExPR0UoIlJTIENvbnRleHQgZGVidWciKTsKIAogICAgIExPR0UoIiBFR0wgdmVyICVpICVpIiwgbUVHTC5tTWFqb3JWZXJzaW9uLCBtRUdMLm1NaW5vclZlcnNpb24pOwotICAgIExPR0UoIiBFR0wgY29udGV4dCAlcCAgc3VyZmFjZSAlcCwgIHc9JWkgaD0laSAgRGlzcGxheT0lcCIsIG1FR0wubUNvbnRleHQsCi0gICAgICAgICBtRUdMLm1TdXJmYWNlLCBtRUdMLm1XaWR0aCwgbUVHTC5tSGVpZ2h0LCBtRUdMLm1EaXNwbGF5KTsKKyAgICBMT0dFKCIgRUdMIGNvbnRleHQgJXAgIHN1cmZhY2UgJXAsICBEaXNwbGF5PSVwIiwgbUVHTC5tQ29udGV4dCwgbUVHTC5tU3VyZmFjZSwgbUVHTC5tRGlzcGxheSk7CiAgICAgTE9HRSgiIEdMIHZlbmRvcjogJXMiLCBtR0wubVZlbmRvcik7CiAgICAgTE9HRSgiIEdMIHJlbmRlcmVyOiAlcyIsIG1HTC5tUmVuZGVyZXIpOwogICAgIExPR0UoIiBHTCBWZXJzaW9uOiAlcyIsIG1HTC5tVmVyc2lvbik7CkBAIC04MjIsNiArODE4LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCit2b2lkIHJzaV9Db250ZXh0RmluaXNoKENvbnRleHQgKnJzYykKK3sKK30KIAogdm9pZCByc2lfQ29udGV4dEJpbmRSb290U2NyaXB0KENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMpCiB7CkBAIC04NDEsOSArODQwLDkgQEAKICAgICBzLT5iaW5kVG9Db250ZXh0KCZyc2MtPm1TdGF0ZVNhbXBsZXIsIHNsb3QpOwogfQogCi12b2lkIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYywgUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSB2cGZzKQordm9pZCByc2lfQ29udGV4dEJpbmRQcm9ncmFtU3RvcmUoQ29udGV4dCAqcnNjLCBSc1Byb2dyYW1TdG9yZSB2cGZzKQogewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnRTdG9yZSAqPih2cGZzKTsKKyAgICBQcm9ncmFtU3RvcmUgKnBmcyA9IHN0YXRpY19jYXN0PFByb2dyYW1TdG9yZSAqPih2cGZzKTsKICAgICByc2MtPnNldEZyYWdtZW50U3RvcmUocGZzKTsKIH0KIApAQCAtODY1LDEyICs4NjQsMjQgQEAKICAgICByc2MtPnNldFZlcnRleChwdik7CiB9CiAKK3ZvaWQgcnNpX0NvbnRleHRCaW5kRm9udChDb250ZXh0ICpyc2MsIFJzRm9udCB2Zm9udCkKK3sKKyAgICBGb250ICpmb250ID0gc3RhdGljX2Nhc3Q8Rm9udCAqPih2Zm9udCk7CisgICAgcnNjLT5zZXRGb250KGZvbnQpOworfQorCiB2b2lkIHJzaV9Bc3NpZ25OYW1lKENvbnRleHQgKnJzYywgdm9pZCAqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwogICAgIHJzYy0+YXNzaWduTmFtZShvYiwgbmFtZSwgbGVuKTsKIH0KIAordm9pZCByc2lfR2V0TmFtZShDb250ZXh0ICpyc2MsIHZvaWQgKiBvYmosIGNvbnN0IGNoYXIgKipuYW1lKQoreworICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOworICAgICgqbmFtZSkgPSBvYi0+Z2V0TmFtZSgpOworfQorCiB2b2lkIHJzaV9PYmpEZXN0cm95KENvbnRleHQgKnJzYywgdm9pZCAqb2JqKQogewogICAgIE9iamVjdEJhc2UgKm9iID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPihvYmopOwpAQCAtOTM4LDEyICs5NDksNiBAQAogICAgIGRlbGV0ZSByc2M7CiB9CiAKLXZvaWQgcnNPYmpEZXN0cm95T09CKFJzQ29udGV4dCB2cnNjLCB2b2lkICpvYmopCi17Ci0gICAgQ29udGV4dCAqIHJzYyA9IHN0YXRpY19jYXN0PENvbnRleHQgKj4odnJzYyk7Ci0gICAgcnNjLT5vYmpEZXN0cm95QWRkKHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKSk7Ci19Ci0KIHVpbnQzMl90IHJzQ29udGV4dEdldE1lc3NhZ2UoUnNDb250ZXh0IHZyc2MsIHZvaWQgKmRhdGEsIHNpemVfdCAqcmVjZWl2ZUxlbiwgc2l6ZV90IGJ1ZmZlckxlbiwgYm9vbCB3YWl0KQogewogICAgIENvbnRleHQgKiByc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuaCBiL2xpYnMvcnMvcnNDb250ZXh0LmgKaW5kZXggNzA5NzMwZS4uNmQxYTQxZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuaAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5oCkBAIC0xOCwxMiArMTgsMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19DT05URVhUX0gKIAogI2luY2x1ZGUgInJzVXRpbHMuaCIKKyNpbmNsdWRlICJyc011dGV4LmgiCiAKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNUeXBlLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKICNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKLSNpbmNsdWRlICJyc1NpbXBsZU1lc2guaCIKICNpbmNsdWRlICJyc01lc2guaCIKICNpbmNsdWRlICJyc0RldmljZS5oIgogI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgpAQCAtMzEsOCArMzEsOSBAQAogI2luY2x1ZGUgInJzQWRhcHRlci5oIgogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogI2luY2x1ZGUgInJzTGlnaHQuaCIKKyNpbmNsdWRlICJyc0ZvbnQuaCIKICNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1TdG9yZS5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogI2luY2x1ZGUgInJzUHJvZ3JhbVZlcnRleC5oIgogI2luY2x1ZGUgInJzU2hhZGVyQ2FjaGUuaCIKQEAgLTY0LDE3ICs2NSwxOSBAQAogICAgICAgICBTY3JpcHQgKiBtU2NyaXB0OwogICAgIH07CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpXb3JrZXJDYWxsYmFja190KSh2b2lkICp1c3IsIHVpbnQzMl90IGlkeCk7CiAKICAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOwogICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OwogICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOwogICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOwogICAgIFByb2dyYW1GcmFnbWVudFN0YXRlIG1TdGF0ZUZyYWdtZW50OwotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSBtU3RhdGVGcmFnbWVudFN0b3JlOwogICAgIFByb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CiAgICAgUHJvZ3JhbVZlcnRleFN0YXRlIG1TdGF0ZVZlcnRleDsKICAgICBMaWdodFN0YXRlIG1TdGF0ZUxpZ2h0OwogICAgIFZlcnRleEFycmF5U3RhdGUgbVN0YXRlVmVydGV4QXJyYXk7CisgICAgRm9udFN0YXRlIG1TdGF0ZUZvbnQ7CiAKICAgICBTY3JpcHRDU3RhdGUgbVNjcmlwdEM7CiAgICAgU2hhZGVyQ2FjaGUgbVNoYWRlckNhY2hlOwpAQCAtODQsMTQgKzg3LDE2IEBACiAgICAgdm9pZCBzZXRSYXN0ZXIoUHJvZ3JhbVJhc3RlciAqKTsKICAgICB2b2lkIHNldFZlcnRleChQcm9ncmFtVmVydGV4ICopOwogICAgIHZvaWQgc2V0RnJhZ21lbnQoUHJvZ3JhbUZyYWdtZW50ICopOwotICAgIHZvaWQgc2V0RnJhZ21lbnRTdG9yZShQcm9ncmFtRnJhZ21lbnRTdG9yZSAqKTsKKyAgICB2b2lkIHNldEZyYWdtZW50U3RvcmUoUHJvZ3JhbVN0b3JlICopOworICAgIHZvaWQgc2V0Rm9udChGb250ICopOwogCiAgICAgdm9pZCB1cGRhdGVTdXJmYWNlKHZvaWQgKnN1cik7CiAKICAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnQgKiBnZXRGcmFnbWVudCgpIHtyZXR1cm4gbUZyYWdtZW50LmdldCgpO30KLSAgICBjb25zdCBQcm9ncmFtRnJhZ21lbnRTdG9yZSAqIGdldEZyYWdtZW50U3RvcmUoKSB7cmV0dXJuIG1GcmFnbWVudFN0b3JlLmdldCgpO30KKyAgICBjb25zdCBQcm9ncmFtU3RvcmUgKiBnZXRGcmFnbWVudFN0b3JlKCkge3JldHVybiBtRnJhZ21lbnRTdG9yZS5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVJhc3RlciAqIGdldFJhc3RlcigpIHtyZXR1cm4gbVJhc3Rlci5nZXQoKTt9CiAgICAgY29uc3QgUHJvZ3JhbVZlcnRleCAqIGdldFZlcnRleCgpIHtyZXR1cm4gbVZlcnRleC5nZXQoKTt9CisgICAgRm9udCAqIGdldEZvbnQoKSB7cmV0dXJuIG1Gb250LmdldCgpO30KIAogICAgIGJvb2wgc2V0dXBDaGVjaygpOwogICAgIGJvb2wgY2hlY2tEcml2ZXIoKSBjb25zdCB7cmV0dXJuIG1FR0wubVN1cmZhY2UgIT0gMDt9CkBAIC0xMDMsMTIgKzEwOCwxMCBAQAogCiAgICAgdm9pZCBhc3NpZ25OYW1lKE9iamVjdEJhc2UgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKTsKICAgICB2b2lkIHJlbW92ZU5hbWUoT2JqZWN0QmFzZSAqb2JqKTsKLSAgICBPYmplY3RCYXNlICogbG9va3VwTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKLSAgICB2b2lkIGFwcGVuZE5hbWVEZWZpbmVzKFN0cmluZzggKnN0cikgY29uc3Q7CiAKICAgICB1aW50MzJfdCBnZXRNZXNzYWdlVG9DbGllbnQodm9pZCAqZGF0YSwgc2l6ZV90ICpyZWNlaXZlTGVuLCBzaXplX3QgYnVmZmVyTGVuLCBib29sIHdhaXQpOwogICAgIGJvb2wgc2VuZE1lc3NhZ2VUb0NsaWVudCh2b2lkICpkYXRhLCB1aW50MzJfdCBjbWRJRCwgc2l6ZV90IGxlbiwgYm9vbCB3YWl0Rm9yU3BhY2UpOwotICAgIHVpbnQzMl90IHJ1blNjcmlwdChTY3JpcHQgKnMsIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICB1aW50MzJfdCBydW5TY3JpcHQoU2NyaXB0ICpzKTsKIAogICAgIHZvaWQgaW5pdFRvQ2xpZW50KCk7CiAgICAgdm9pZCBkZWluaXRUb0NsaWVudCgpOwpAQCAtMTE5LDE5ICsxMjIsMjEgQEAKICAgICBQcm9ncmFtVmVydGV4ICogZ2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVWZXJ0ZXgubURlZmF1bHQuZ2V0KCk7CiAgICAgfQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1GcmFnbWVudFN0b3JlKCkgY29uc3QgeworICAgIFByb2dyYW1TdG9yZSAqIGdldERlZmF1bHRQcm9ncmFtU3RvcmUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVGcmFnbWVudFN0b3JlLm1EZWZhdWx0LmdldCgpOwogICAgIH0KICAgICBQcm9ncmFtUmFzdGVyICogZ2V0RGVmYXVsdFByb2dyYW1SYXN0ZXIoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RhdGVSYXN0ZXIubURlZmF1bHQuZ2V0KCk7CiAgICAgfQorICAgIEZvbnQqIGdldERlZmF1bHRGb250KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0YXRlRm9udC5tRGVmYXVsdC5nZXQoKTsKKyAgICB9CiAKLSAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tV2lkdGg7fQotICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gbUVHTC5tSGVpZ2h0O30KKyAgICB1aW50MzJfdCBnZXRXaWR0aCgpIGNvbnN0IHtyZXR1cm4gbVdpZHRoO30KKyAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCB7cmV0dXJuIG1IZWlnaHQ7fQogCiAKICAgICBUaHJlYWRJTyBtSU87Ci0gICAgdm9pZCBvYmpEZXN0cm95QWRkKE9iamVjdEJhc2UgKik7CiAKICAgICAvLyBUaW1lcnMKICAgICBlbnVtIFRpbWVycyB7CkBAIC0xNTYsMTcgKzE2MSwyMSBAQAogICAgICAgICBib29sIG1Mb2dTY3JpcHRzOwogICAgICAgICBib29sIG1Mb2dPYmplY3RzOwogICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgICAgICBib29sIG1Mb2dWaXN1YWw7CiAgICAgfSBwcm9wczsKIAogICAgIHZvaWQgZHVtcERlYnVnKCkgY29uc3Q7CiAgICAgdm9pZCBjaGVja0Vycm9yKGNvbnN0IGNoYXIgKikgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqIGdldEVycm9yKFJzRXJyb3IgKik7Ci0gICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyk7CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpOwogCiAgICAgbXV0YWJsZSBjb25zdCBPYmplY3RCYXNlICogbU9iakhlYWQ7CiAKICAgICBib29sIGV4dF9PRVNfdGV4dHVyZV9ucG90KCkgY29uc3Qge3JldHVybiBtR0wuT0VTX3RleHR1cmVfbnBvdDt9CiAKKyAgICB2b2lkIGxhdW5jaFRocmVhZHMoV29ya2VyQ2FsbGJhY2tfdCBjYmssIHZvaWQgKmRhdGEpOworICAgIHVpbnQzMl90IGdldFdvcmtlclBvb2xTaXplKCkgY29uc3Qge3JldHVybiAodWludDMyX3QpbVdvcmtlcnMubVJ1bm5pbmdDb3VudDt9CisKIHByb3RlY3RlZDoKICAgICBEZXZpY2UgKm1EZXY7CiAKQEAgLTE3Nyw4ICsxODYsNiBAQAogICAgICAgICBFR0xDb25maWcgbUNvbmZpZzsKICAgICAgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgRUdMU3VyZmFjZSBtU3VyZmFjZTsKLSAgICAgICAgRUdMaW50IG1XaWR0aDsKLSAgICAgICAgRUdMaW50IG1IZWlnaHQ7CiAgICAgICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CiAgICAgfSBtRUdMOwogCkBAIC0yMTksMjIgKzIyNiwyOCBAQAogICAgIHB0aHJlYWRfdCBtVGhyZWFkSWQ7CiAgICAgcGlkX3QgbU5hdGl2ZVRocmVhZElkOwogCisgICAgc3RydWN0IFdvcmtlcnMgeworICAgICAgICB2b2xhdGlsZSBpbnQgbVJ1bm5pbmdDb3VudDsKKyAgICAgICAgdm9sYXRpbGUgaW50IG1MYXVuY2hDb3VudDsKKyAgICAgICAgdWludDMyX3QgbUNvdW50OworICAgICAgICBwdGhyZWFkX3QgKm1UaHJlYWRJZDsKKyAgICAgICAgcGlkX3QgKm1OYXRpdmVUaHJlYWRJZDsKKyAgICAgICAgU2lnbmFsIG1Db21wbGV0ZVNpZ25hbDsKKworICAgICAgICBTaWduYWwgKm1MYXVuY2hTaWduYWxzOworICAgICAgICBXb3JrZXJDYWxsYmFja190IG1MYXVuY2hDYWxsYmFjazsKKyAgICAgICAgdm9pZCAqbUxhdW5jaERhdGE7CisgICAgfTsKKyAgICBXb3JrZXJzIG1Xb3JrZXJzOworCiAgICAgT2JqZWN0QmFzZVJlZjxTY3JpcHQ+IG1Sb290U2NyaXB0OwogICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50PiBtRnJhZ21lbnQ7CiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtVmVydGV4OwotICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbUZyYWdtZW50U3RvcmU+IG1GcmFnbWVudFN0b3JlOworICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1SYXN0ZXI+IG1SYXN0ZXI7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtRm9udDsKIAotCi0gICAgc3RydWN0IE9iakRlc3Ryb3lPT0IgewotICAgICAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OwotICAgICAgICBWZWN0b3I8T2JqZWN0QmFzZSAqPiBtRGVzdHJveUxpc3Q7Ci0gICAgICAgIGJvb2wgbU5lZWRUb0VtcHR5OwotICAgIH07Ci0gICAgT2JqRGVzdHJveU9PQiBtT2JqRGVzdHJveTsKLSAgICBib29sIG9iakRlc3Ryb3lPT0JJbml0KCk7Ci0gICAgdm9pZCBvYmpEZXN0cm95T09CUnVuKCk7Ci0gICAgdm9pZCBvYmpEZXN0cm95T09CRGVzdHJveSgpOworICAgIHZvaWQgZGlzcGxheURlYnVnU3RhdHMoKTsKIAogcHJpdmF0ZToKICAgICBDb250ZXh0KCk7CkBAIC0yNDUsNiArMjU4LDcgQEAKICAgICB1aW50MzJfdCBydW5Sb290U2NyaXB0KCk7CiAKICAgICBzdGF0aWMgdm9pZCAqIHRocmVhZFByb2Modm9pZCAqKTsKKyAgICBzdGF0aWMgdm9pZCAqIGhlbHBlclRocmVhZFByb2Modm9pZCAqKTsKIAogICAgIEFOYXRpdmVXaW5kb3cgKm1XbmRTdXJmYWNlOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmggYi9saWJzL3JzL3JzQ29udGV4dEhvc3RTdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNzYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNDb250ZXh0SG9zdFN0dWIuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9SU19DT05URVhUX0hPU1RfU1RVQl9ICisjZGVmaW5lIEFORFJPSURfUlNfQ09OVEVYVF9IT1NUX1NUVUJfSAorCisjaW5jbHVkZSAicnNVdGlscy5oIgorLy8jaW5jbHVkZSAicnNNdXRleC5oIgorCisvLyNpbmNsdWRlICJyc1RocmVhZElPLmgiCisjaW5jbHVkZSAicnNUeXBlLmgiCisjaW5jbHVkZSAicnNNYXRyaXguaCIKKyNpbmNsdWRlICJyc0FsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc01lc2guaCIKKy8vI2luY2x1ZGUgInJzRGV2aWNlLmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCisjaW5jbHVkZSAicnNBZGFwdGVyLmgiCisjaW5jbHVkZSAicnNTYW1wbGVyLmgiCisjaW5jbHVkZSAicnNMaWdodC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSAicnNQcm9ncmFtU3RvcmUuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1SYXN0ZXIuaCIKKyNpbmNsdWRlICJyc1Byb2dyYW1WZXJ0ZXguaCIKKyNpbmNsdWRlICJyc1NoYWRlckNhY2hlLmgiCisjaW5jbHVkZSAicnNWZXJ0ZXhBcnJheS5oIgorCisvLyNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCisvLyNpbmNsdWRlICJyc0xvY2tsZXNzRmlmby5oIgorCisvLyNpbmNsdWRlIDx1aS9lZ2wvYW5kcm9pZF9uYXRpdmVzLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgRGV2aWNlOworCitjbGFzcyBDb250ZXh0Cit7CitwdWJsaWM6CisgICAgQ29udGV4dChEZXZpY2UgKiwgYm9vbCBpc0dyYXBoaWNzLCBib29sIHVzZURlcHRoKSB7CisgICAgICAgIG1PYmpIZWFkID0gTlVMTDsKKyAgICB9CisgICAgfkNvbnRleHQoKSB7CisgICAgfQorCisKKyAgICAvL1N0cnVjdHVyZWRBbGxvY2F0aW9uQ29udGV4dCBtU3RhdGVBbGxvY2F0aW9uOworICAgIEVsZW1lbnRTdGF0ZSBtU3RhdGVFbGVtZW50OworICAgIFR5cGVTdGF0ZSBtU3RhdGVUeXBlOworICAgIFNhbXBsZXJTdGF0ZSBtU3RhdGVTYW1wbGVyOworICAgIC8vUHJvZ3JhbUZyYWdtZW50U3RhdGUgbVN0YXRlRnJhZ21lbnQ7CisgICAgUHJvZ3JhbVN0b3JlU3RhdGUgbVN0YXRlRnJhZ21lbnRTdG9yZTsKKyAgICAvL1Byb2dyYW1SYXN0ZXJTdGF0ZSBtU3RhdGVSYXN0ZXI7CisgICAgLy9Qcm9ncmFtVmVydGV4U3RhdGUgbVN0YXRlVmVydGV4OworICAgIExpZ2h0U3RhdGUgbVN0YXRlTGlnaHQ7CisgICAgVmVydGV4QXJyYXlTdGF0ZSBtU3RhdGVWZXJ0ZXhBcnJheTsKKworICAgIC8vU2NyaXB0Q1N0YXRlIG1TY3JpcHRDOworICAgIFNoYWRlckNhY2hlIG1TaGFkZXJDYWNoZTsKKworCisgICAgLy9ib29sIHNldHVwQ2hlY2soKTsKKyAgICBib29sIGNoZWNrRHJpdmVyKCkgY29uc3Qge3JldHVybiBmYWxzZTt9CisKKyAgICBQcm9ncmFtRnJhZ21lbnQgKiBnZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVZlcnRleCAqIGdldERlZmF1bHRQcm9ncmFtVmVydGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHJvZ3JhbVN0b3JlICogZ2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFByb2dyYW1SYXN0ZXIgKiBnZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7cmV0dXJuIDA7fQorICAgIHVpbnQzMl90IGdldEhlaWdodCgpIGNvbnN0IHtyZXR1cm4gMDt9CisKKyAgICAvLyBUaW1lcnMKKyAgICBlbnVtIFRpbWVycyB7CisgICAgICAgIFJTX1RJTUVSX0lETEUsCisgICAgICAgIFJTX1RJTUVSX0lOVEVSTkFMLAorICAgICAgICBSU19USU1FUl9TQ1JJUFQsCisgICAgICAgIFJTX1RJTUVSX0NMRUFSX1NXQVAsCisgICAgICAgIF9SU19USU1FUl9UT1RBTAorICAgIH07CisKKyAgICBib29sIGNoZWNrVmVyc2lvbjFfMSgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGNoZWNrVmVyc2lvbjJfMCgpIGNvbnN0IHtyZXR1cm4gZmFsc2U7IH0KKworICAgIHN0cnVjdCB7CisgICAgICAgIGJvb2wgbUxvZ1RpbWVzOworICAgICAgICBib29sIG1Mb2dTY3JpcHRzOworICAgICAgICBib29sIG1Mb2dPYmplY3RzOworICAgICAgICBib29sIG1Mb2dTaGFkZXJzOworICAgIH0gcHJvcHM7CisKKyAgICB2b2lkIGR1bXBEZWJ1ZygpIGNvbnN0IHsgICAgfQorICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBjaGFyICopIGNvbnN0IHsgIH07CisgICAgdm9pZCBzZXRFcnJvcihSc0Vycm9yIGUsIGNvbnN0IGNoYXIgKm1zZyA9IE5VTEwpIHsgIH0KKworICAgIG11dGFibGUgY29uc3QgT2JqZWN0QmFzZSAqIG1PYmpIZWFkOworCisgICAgYm9vbCBleHRfT0VTX3RleHR1cmVfbnBvdCgpIGNvbnN0IHtyZXR1cm4gbUdMLk9FU190ZXh0dXJlX25wb3Q7fQorCitwcm90ZWN0ZWQ6CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICogbVZlbmRvcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1SZW5kZXJlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIG1WZXJzaW9uOworICAgICAgICBjb25zdCB1aW50OF90ICogbUV4dGVuc2lvbnM7CisKKyAgICAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgbU1pbm9yVmVyc2lvbjsKKworICAgICAgICBpbnQzMl90IG1NYXhWYXJ5aW5nVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VGV4dHVyZUltYWdlVW5pdHM7CisKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRUZXh0dXJlSW1hZ2VVbml0czsKKyAgICAgICAgaW50MzJfdCBtTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9yczsKKworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhBdHRyaWJzOworICAgICAgICBpbnQzMl90IG1NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9yczsKKyAgICAgICAgaW50MzJfdCBtTWF4VmVydGV4VGV4dHVyZVVuaXRzOworCisgICAgICAgIGJvb2wgT0VTX3RleHR1cmVfbnBvdDsKKyAgICB9IG1HTDsKKworfTsKKworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRGV2aWNlLmNwcCBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCmluZGV4IGI2NzBhZDQuLmE5NmIxMTQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNEZXZpY2UuY3BwCisrKyBiL2xpYnMvcnMvcnNEZXZpY2UuY3BwCkBAIC0xNSw3ICsxNSwxMSBAQAogICovCiAKICNpbmNsdWRlICJyc0RldmljZS5oIgorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzMsNyArMzcsNyBAQAogCiB2b2lkIERldmljZTo6YWRkQ29udGV4dChDb250ZXh0ICpyc2MpCiB7Ci0gICAgbUNvbnRleHRzLmFkZChyc2MpOworICAgIG1Db250ZXh0cy5wdXNoKHJzYyk7CiB9CiAKIHZvaWQgRGV2aWNlOjpyZW1vdmVDb250ZXh0KENvbnRleHQgKnJzYykKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNFbGVtZW50LmNwcCBiL2xpYnMvcnMvcnNFbGVtZW50LmNwcAppbmRleCA2Mjg4YmM0Li4wYjdiYjI3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRWxlbWVudC5jcHAKKysrIGIvbGlicy9ycy9yc0VsZW1lbnQuY3BwCkBAIC0xNCw5ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgInJzQ29udGV4dC5oIgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlIDxHTEVTL2dsLmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjksNiArMzQsNyBAQAogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiAKQEAgLTQ4LDYgKzU0LDcgQEAKICAgICBkZWxldGUgW10gbUZpZWxkczsKICAgICBtRmllbGRzID0gTlVMTDsKICAgICBtRmllbGRDb3VudCA9IDA7CisgICAgbUhhc1JlZmVyZW5jZSA9IGZhbHNlOwogfQogCiBzaXplX3QgRWxlbWVudDo6Z2V0U2l6ZUJpdHMoKSBjb25zdApAQCAtNTgsMjAgKzY1LDExIEBACiAKICAgICBzaXplX3QgdG90YWwgPSAwOwogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdG90YWwgKz0gbUZpZWxkc1tjdF0uZS0+bUJpdHM7CisgICAgICAgIHRvdGFsICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzICogbUZpZWxkc1tjdF0uYXJyYXlTaXplOzsKICAgICB9CiAgICAgcmV0dXJuIHRvdGFsOwogfQogCi1zaXplX3QgRWxlbWVudDo6Z2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QKLXsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBjb21wb25lbnROdW1iZXI7IGN0KyspIHsKLSAgICAgICAgb2Zmc2V0ICs9IG1GaWVsZHNbY3RdLmUtPm1CaXRzOwotICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCiB2b2lkIEVsZW1lbnQ6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QKIHsKICAgICBPYmplY3RCYXNlOjpkdW1wTE9HVihwcmVmaXgpOwpAQCAtODMsNiArODEsMTAxIEBACiAgICAgfQogfQogCit2b2lkIEVsZW1lbnQ6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIG1Db21wb25lbnQuc2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICAvLyBOb3cgc2VyaWFsaXplIGFsbCB0aGUgZmllbGRzCisgICAgc3RyZWFtLT5hZGRVMzIobUZpZWxkQ291bnQpOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKKyAgICAgICAgc3RyZWFtLT5hZGRTdHJpbmcoJm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICBzdHJlYW0tPmFkZFUzMihtRmllbGRzW2N0XS5hcnJheVNpemUpOworICAgICAgICBtRmllbGRzW2N0XS5lLT5zZXJpYWxpemUoc3RyZWFtKTsKKyAgICB9Cit9CisKK0VsZW1lbnQgKkVsZW1lbnQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9FTEVNRU5UKSB7CisgICAgICAgIExPR0UoImVsZW1lbnQgbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBFbGVtZW50ICplbGVtID0gbmV3IEVsZW1lbnQocnNjKTsKKyAgICBlbGVtLT5tQ29tcG9uZW50LmxvYWRGcm9tU3RyZWFtKHN0cmVhbSk7CisgICAgZWxlbS0+bUJpdHMgPSBlbGVtLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gZWxlbS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOworCisgICAgZWxlbS0+bUZpZWxkQ291bnQgPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihlbGVtLT5tRmllbGRDb3VudCkgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICBlbGVtLT5tRmllbGRzID0gbmV3IEVsZW1lbnRGaWVsZF90IFtlbGVtLT5tRmllbGRDb3VudF07CisgICAgICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgZWxlbS0+bUZpZWxkQ291bnQ7IGN0ICsrKSB7CisgICAgICAgICAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJmVsZW0tPm1GaWVsZHNbY3RdLm5hbWUpOworICAgICAgICAgICAgZWxlbS0+bUZpZWxkc1tjdF0uYXJyYXlTaXplID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBFbGVtZW50ICpmaWVsZEVsZW0gPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgIGVsZW0tPm1GaWVsZHNbY3RdLmUuc2V0KGZpZWxkRWxlbSk7CisgICAgICAgICAgICBlbGVtLT5tRmllbGRzW2N0XS5vZmZzZXRCaXRzID0gb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ICs9IGZpZWxkRWxlbS0+Z2V0U2l6ZUJpdHMoKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG91ciBzdWItZWxlbWVudHMgaGF2ZSByZWZlcmVuY2VzCisgICAgICAgICAgICBpZihmaWVsZEVsZW0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICBlbGVtLT5tSGFzUmVmZXJlbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBhbHJlYWR5IGV4aXN0cworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBFbGVtZW50ICplZSA9IHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHNbY3RdOworCisgICAgICAgIGlmICghZWUtPmdldEZpZWxkQ291bnQoKSApIHsKKworICAgICAgICAgICAgaWYoKGVlLT5nZXRDb21wb25lbnQoKS5nZXRUeXBlKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0VHlwZSgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRLaW5kKCkgPT0gZWxlbS0+Z2V0Q29tcG9uZW50KCkuZ2V0S2luZCgpKSAmJgorICAgICAgICAgICAgICAgKGVlLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSA9PSBlbGVtLT5nZXRDb21wb25lbnQoKS5nZXRJc05vcm1hbGl6ZWQoKSkgJiYKKyAgICAgICAgICAgICAgIChlZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpID09IGVsZW0tPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXRjaAorICAgICAgICAgICAgICAgIGRlbGV0ZSBlbGVtOworICAgICAgICAgICAgICAgIGVlLT5pbmNVc2VyUmVmKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoZWUtPmdldEZpZWxkQ291bnQoKSA9PSBlbGVtLT5tRmllbGRDb3VudCkgeworCisgICAgICAgICAgICBib29sIG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgZWxlbS0+bUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoZWUtPm1GaWVsZHNbaV0uZS5nZXQoKSAhPSBlbGVtLT5tRmllbGRzW2ldLmUuZ2V0KCkpIHx8CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lLmxlbmd0aCgpICE9IGVsZW0tPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLm5hbWUgIT0gZWxlbS0+bUZpZWxkc1tpXS5uYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0uYXJyYXlTaXplICE9IGVsZW0tPm1GaWVsZHNbaV0uYXJyYXlTaXplKSkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF0Y2gpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgZWxlbTsKKyAgICAgICAgICAgICAgICBlZS0+aW5jVXNlclJlZigpOworICAgICAgICAgICAgICAgIHJldHVybiBlZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGVsZW0pOworICAgIHJldHVybiBlbGVtOworfQorCiAKIGNvbnN0IEVsZW1lbnQgKiBFbGVtZW50OjpjcmVhdGUoQ29udGV4dCAqcnNjLCBSc0RhdGFUeXBlIGR0LCBSc0RhdGFLaW5kIGRrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNOb3JtLCB1aW50MzJfdCB2ZWNTaXplKQpAQCAtMTA0LDEyICsxOTcsMTMgQEAKICAgICBFbGVtZW50ICplID0gbmV3IEVsZW1lbnQocnNjKTsKICAgICBlLT5tQ29tcG9uZW50LnNldChkdCwgZGssIGlzTm9ybSwgdmVjU2l6ZSk7CiAgICAgZS0+bUJpdHMgPSBlLT5tQ29tcG9uZW50LmdldEJpdHMoKTsKKyAgICBlLT5tSGFzUmVmZXJlbmNlID0gZS0+bUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpOwogICAgIHJzYy0+bVN0YXRlRWxlbWVudC5tRWxlbWVudHMucHVzaChlKTsKICAgICByZXR1cm4gZTsKIH0KIAogY29uc3QgRWxlbWVudCAqIEVsZW1lbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIHNpemVfdCBjb3VudCwgY29uc3QgRWxlbWVudCAqKmVpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqbmluLCBjb25zdCBzaXplX3QgKiBsZW5ndGhzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuaW4sIGNvbnN0IHNpemVfdCAqIGxlbmd0aHMsIGNvbnN0IHVpbnQzMl90ICphc2luKQogewogICAgIC8vIExvb2sgZm9yIGFuIGV4aXN0aW5nIG1hdGNoLgogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCByc2MtPm1TdGF0ZUVsZW1lbnQubUVsZW1lbnRzLnNpemUoKTsgY3QrKykgewpAQCAtMTE5LDcgKzIxMyw4IEBACiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoKGVlLT5tRmllbGRzW2ldLmUuZ2V0KCkgIT0gZWluW2ldKSB8fAogICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZS5sZW5ndGgoKSAhPSBsZW5ndGhzW2ldKSB8fAotICAgICAgICAgICAgICAgICAgICAoZWUtPm1GaWVsZHNbaV0ubmFtZSAhPSBuaW5baV0pKSB7CisgICAgICAgICAgICAgICAgICAgIChlZS0+bUZpZWxkc1tpXS5uYW1lICE9IG5pbltpXSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGVlLT5tRmllbGRzW2ldLmFycmF5U2l6ZSAhPSBhc2luW2ldKSkgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xMzQsNTQgKzIyOSwyMyBAQAogICAgIEVsZW1lbnQgKmUgPSBuZXcgRWxlbWVudChyc2MpOwogICAgIGUtPm1GaWVsZHMgPSBuZXcgRWxlbWVudEZpZWxkX3QgW2NvdW50XTsKICAgICBlLT5tRmllbGRDb3VudCA9IGNvdW50OworICAgIHNpemVfdCBiaXRzID0gMDsKICAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IGNvdW50OyBjdCsrKSB7CiAgICAgICAgIGUtPm1GaWVsZHNbY3RdLmUuc2V0KGVpbltjdF0pOwogICAgICAgICBlLT5tRmllbGRzW2N0XS5uYW1lLnNldFRvKG5pbltjdF0sIGxlbmd0aHNbY3RdKTsKKyAgICAgICAgZS0+bUZpZWxkc1tjdF0ub2Zmc2V0Qml0cyA9IGJpdHM7CisgICAgICAgIGUtPm1GaWVsZHNbY3RdLmFycmF5U2l6ZSA9IGFzaW5bY3RdOworICAgICAgICBiaXRzICs9IGVpbltjdF0tPmdldFNpemVCaXRzKCk7CisKKyAgICAgICAgaWYgKGVpbltjdF0tPm1IYXNSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGUtPm1IYXNSZWZlcmVuY2UgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcnNjLT5tU3RhdGVFbGVtZW50Lm1FbGVtZW50cy5wdXNoKGUpOwogICAgIHJldHVybiBlOwogfQogCi1TdHJpbmc4IEVsZW1lbnQ6OmdldENTdHJ1Y3RCb2R5KHVpbnQzMl90IGluZGVudCkgY29uc3QKLXsKLSAgICBTdHJpbmc4IHNpOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgc2kuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBzKHNpKTsKLSAgICBzLmFwcGVuZCgie1xuIik7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUZpZWxkQ291bnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoc2kpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5lLT5nZXRDVHlwZShpbmRlbnQrNCkpOwotICAgICAgICBzLmFwcGVuZCgiICIpOwotICAgICAgICBzLmFwcGVuZChtRmllbGRzW2N0XS5uYW1lKTsKLSAgICAgICAgcy5hcHBlbmQoIjtcbiIpOwotICAgIH0KLSAgICBzLmFwcGVuZChzaSk7Ci0gICAgcy5hcHBlbmQoIn0iKTsKLSAgICByZXR1cm4gczsKLX0KLQotU3RyaW5nOCBFbGVtZW50OjpnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCBzOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBpbmRlbnQ7IGN0KyspIHsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1GaWVsZENvdW50KSB7Ci0gICAgICAgIC8vIEJhc2ljIGNvbXBvbmVudC4KLSAgICAgICAgcy5hcHBlbmQobUNvbXBvbmVudC5nZXRDVHlwZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLmFwcGVuZCgic3RydWN0ICIpOwotICAgICAgICBzLmFwcGVuZChnZXRDU3RydWN0Qm9keShpbmRlbnQpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gczsKLX0KLQogU3RyaW5nOCBFbGVtZW50OjpnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCBzOwpAQCAtMjAxLDYgKzI2NSw1MSBAQAogICAgIHJldHVybiBzOwogfQogCit2b2lkIEVsZW1lbnQ6OmluY1JlZnMoY29uc3Qgdm9pZCAqcHRyKSBjb25zdAoreworICAgIGlmICghbUZpZWxkQ291bnQpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQuaXNSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgT2JqZWN0QmFzZSAqY29uc3Qqb2JwID0gc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqY29uc3QqPihwdHIpOworICAgICAgICAgICAgT2JqZWN0QmFzZSAqb2IgPSBvYnBbMF07CisgICAgICAgICAgICBpZiAob2IpIG9iLT5pbmNTeXNSZWYoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqcCA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QgKj4ocHRyKTsKKyAgICBmb3IgKHVpbnQzMl90IGk9MDsgaSA8IG1GaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1GaWVsZHNbaV0uZS0+bUhhc1JlZmVyZW5jZSkgeworICAgICAgICAgICAgcCA9ICZwW21GaWVsZHNbaV0ub2Zmc2V0Qml0cyA+PiAzXTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRmllbGRzW2ldLmFycmF5U2l6ZTsgY3QrKykgeworICAgICAgICAgICAgICAgIG1GaWVsZHNbaV0uZS0+aW5jUmVmcyhwKTsKKyAgICAgICAgICAgICAgICBwICs9IG1GaWVsZHNbaV0uZS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRWxlbWVudDo6ZGVjUmVmcyhjb25zdCB2b2lkICpwdHIpIGNvbnN0Cit7CisgICAgaWYgKCFtRmllbGRDb3VudCkgeworICAgICAgICBpZiAobUNvbXBvbmVudC5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICBPYmplY3RCYXNlICpjb25zdCpvYnAgPSBzdGF0aWNfY2FzdDxPYmplY3RCYXNlICpjb25zdCo+KHB0cik7CisgICAgICAgICAgICBPYmplY3RCYXNlICpvYiA9IG9icFswXTsKKyAgICAgICAgICAgIGlmIChvYikgb2ItPmRlY1N5c1JlZigpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCAqPihwdHIpOworICAgIGZvciAodWludDMyX3QgaT0wOyBpIDwgbUZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUZpZWxkc1tpXS5lLT5tSGFzUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBwID0gJnBbbUZpZWxkc1tpXS5vZmZzZXRCaXRzID4+IDNdOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1GaWVsZHNbaV0uYXJyYXlTaXplOyBjdCsrKSB7CisgICAgICAgICAgICAgICAgbUZpZWxkc1tpXS5lLT5kZWNSZWZzKHApOworICAgICAgICAgICAgICAgIHAgKz0gbUZpZWxkc1tpXS5lLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KIAogCiBFbGVtZW50U3RhdGU6OkVsZW1lbnRTdGF0ZSgpCkBAIC0yMzUsMTQgKzM0NCw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzRWxlbWVudCAqIGVpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiBuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICogbmFtZUxlbmd0aHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqIG5hbWVMZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqIGFycmF5U2l6ZXMpCiB7CiAgICAgLy9MT0dFKCJyc2lfRWxlbWVudENyZWF0ZTIgJWkiLCBjb3VudCk7Ci0gICAgY29uc3QgRWxlbWVudCAqZSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIGNvdW50LCAoY29uc3QgRWxlbWVudCAqKillaW4sIG5hbWVzLCBuYW1lTGVuZ3Rocyk7CisgICAgY29uc3QgRWxlbWVudCAqZSA9IEVsZW1lbnQ6OmNyZWF0ZShyc2MsIGNvdW50LCAoY29uc3QgRWxlbWVudCAqKillaW4sIG5hbWVzLCBuYW1lTGVuZ3RocywgYXJyYXlTaXplcyk7CiAgICAgZS0+aW5jVXNlclJlZigpOwogICAgIHJldHVybiAoUnNFbGVtZW50KWU7CiB9CiAKK3ZvaWQgcnNpX0VsZW1lbnRHZXROYXRpdmVEYXRhKENvbnRleHQgKnJzYywgUnNFbGVtZW50IGVsZW0sIHVpbnQzMl90ICplbGVtRGF0YSwgdWludDMyX3QgZWxlbURhdGFTaXplKQoreworICAgIHJzQXNzZXJ0KGVsZW1EYXRhU2l6ZSA9PSA1KTsKKyAgICAvLyB3ZSB3aWxsIHBhY2sgbVR5cGU7IG1LaW5kOyBtTm9ybWFsaXplZDsgbVZlY3RvclNpemU7IE51bVN1YkVsZW1lbnRzCisgICAgRWxlbWVudCAqZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQgKj4oZWxlbSk7CisKKyAgICAoKmVsZW1EYXRhKyspID0gKHVpbnQzMl90KWUtPmdldFR5cGUoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gKHVpbnQzMl90KWUtPmdldEtpbmQoKTsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0Q29tcG9uZW50KCkuZ2V0SXNOb3JtYWxpemVkKCkgPyAxIDogMDsKKyAgICAoKmVsZW1EYXRhKyspID0gZS0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpOworICAgICgqZWxlbURhdGErKykgPSBlLT5nZXRGaWVsZENvdW50KCk7CisKK30KKwordm9pZCByc2lfRWxlbWVudEdldFN1YkVsZW1lbnRzKENvbnRleHQgKnJzYywgUnNFbGVtZW50IGVsZW0sIHVpbnQzMl90ICppZHMsIGNvbnN0IGNoYXIgKipuYW1lcywgdWludDMyX3QgZGF0YVNpemUpCit7CisgICAgRWxlbWVudCAqZSA9IHN0YXRpY19jYXN0PEVsZW1lbnQgKj4oZWxlbSk7CisgICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpID09IGRhdGFTaXplKTsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGRhdGFTaXplOyBpICsrKSB7CisgICAgICAgIGlkc1tpXSA9ICh1aW50MzJfdCllLT5nZXRGaWVsZChpKTsKKyAgICAgICAgbmFtZXNbaV0gPSBlLT5nZXRGaWVsZE5hbWUoaSk7CisgICAgfQorCit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0VsZW1lbnQuaCBiL2xpYnMvcnMvcnNFbGVtZW50LmgKaW5kZXggMDJhMWNhMi4uNDJlZWY0YSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0VsZW1lbnQuaAorKysgYi9saWJzL3JzL3JzRWxlbWVudC5oCkBAIC00MCw5ICs0MCwxMSBAQAogICAgICAgICByZXR1cm4gKGdldFNpemVCaXRzKCkgKyA3KSA+PiAzOwogICAgIH0KIAotICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJpdHModWludDMyX3QgY29tcG9uZW50TnVtYmVyKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0RmllbGRPZmZzZXRCaXRzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbUZpZWxkc1tjb21wb25lbnROdW1iZXJdLm9mZnNldEJpdHM7CisgICAgfQogICAgIHNpemVfdCBnZXRGaWVsZE9mZnNldEJ5dGVzKHVpbnQzMl90IGNvbXBvbmVudE51bWJlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKGdldEZpZWxkT2Zmc2V0Qml0cyhjb21wb25lbnROdW1iZXIpICsgNykgPj4gMzsKKyAgICAgICAgcmV0dXJuIG1GaWVsZHNbY29tcG9uZW50TnVtYmVyXS5vZmZzZXRCaXRzID4+IDM7CiAgICAgfQogCiAgICAgdWludDMyX3QgZ2V0RmllbGRDb3VudCgpIGNvbnN0IHtyZXR1cm4gbUZpZWxkQ291bnQ7fQpAQCAtNTQsMTYgKzU2LDIxIEBACiAgICAgUnNEYXRhS2luZCBnZXRLaW5kKCkgY29uc3Qge3JldHVybiBtQ29tcG9uZW50LmdldEtpbmQoKTt9CiAgICAgdWludDMyX3QgZ2V0Qml0cygpIGNvbnN0IHtyZXR1cm4gbUJpdHM7fQogCi0gICAgU3RyaW5nOCBnZXRDVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBnZXRDU3RydWN0Qm9keSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAgICAgU3RyaW5nOCBnZXRHTFNMVHlwZSh1aW50MzJfdCBpbmRlbnQ9MCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXBMT0dWKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDsgfQorICAgIHN0YXRpYyBFbGVtZW50ICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKIAogICAgIHN0YXRpYyBjb25zdCBFbGVtZW50ICogY3JlYXRlKENvbnRleHQgKnJzYywgUnNEYXRhVHlwZSBkdCwgUnNEYXRhS2luZCBkaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTm9ybSwgdWludDMyX3QgdmVjU2l6ZSk7CiAgICAgc3RhdGljIGNvbnN0IEVsZW1lbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBzaXplX3QgY291bnQsIGNvbnN0IEVsZW1lbnQgKiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3Rocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKiwgY29uc3Qgc2l6ZV90ICogbGVuZ3RocywgY29uc3QgdWludDMyX3QgKmFzaW4pOworCisgICAgdm9pZCBpbmNSZWZzKGNvbnN0IHZvaWQgKikgY29uc3Q7CisgICAgdm9pZCBkZWNSZWZzKGNvbnN0IHZvaWQgKikgY29uc3Q7CisgICAgYm9vbCBnZXRIYXNSZWZlcmVuY2VzKCkgY29uc3Qge3JldHVybiBtSGFzUmVmZXJlbmNlO30KIAogcHJvdGVjdGVkOgogICAgIC8vIGRlYWxsb2NhdGUgYW55IGNvbXBvbmVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIGVsZW1lbnQuCkBAIC03Miw5ICs3OSwxMiBAQAogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgU3RyaW5nOCBuYW1lOwogICAgICAgICBPYmplY3RCYXNlUmVmPGNvbnN0IEVsZW1lbnQ+IGU7CisgICAgICAgIHVpbnQzMl90IG9mZnNldEJpdHM7CisgICAgICAgIHVpbnQzMl90IGFycmF5U2l6ZTsKICAgICB9IEVsZW1lbnRGaWVsZF90OwogICAgIEVsZW1lbnRGaWVsZF90ICptRmllbGRzOwogICAgIHNpemVfdCBtRmllbGRDb3VudDsKKyAgICBib29sIG1IYXNSZWZlcmVuY2U7CiAKIAogICAgIEVsZW1lbnQoQ29udGV4dCAqKTsKQEAgLTkwLDcgKzEwMCw3IEBACiAgICAgfkVsZW1lbnRTdGF0ZSgpOwogCiAgICAgLy8gQ2FjaGUgb2YgYWxsIGV4aXN0aW5nIGVsZW1lbnRzLgotICAgIFZlY3Rvcjxjb25zdCBFbGVtZW50ICo+IG1FbGVtZW50czsKKyAgICBWZWN0b3I8RWxlbWVudCAqPiBtRWxlbWVudHM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNELmNwcCBiL2xpYnMvcnMvcnNGaWxlQTNELmNwcAppbmRleCBlMzI3MmM1Li41NzA5ZjJhIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRC5jcHAKKysrIGIvbGlicy9ycy9yc0ZpbGVBM0QuY3BwCkBAIC0xNSwyOSArMTUsMTU2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgogCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAicnNGaWxlQTNELmgiCiAKICNpbmNsdWRlICJyc01lc2guaCIKKyNpbmNsdWRlICJyc0FuaW1hdGlvbi5oIgorCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotCi0KLUZpbGVBM0Q6OkZpbGVBM0QoKQorRmlsZUEzRDo6RmlsZUEzRChDb250ZXh0ICpyc2MpIDogT2JqZWN0QmFzZShyc2MpCiB7Ci0gICAgbVJzYyA9IE5VTEw7CisgICAgbUFsbG9jID0gTlVMTDsKKyAgICBtRGF0YSA9IE5VTEw7CisgICAgbVdyaXRlU3RyZWFtID0gTlVMTDsKKyAgICBtUmVhZFN0cmVhbSA9IE5VTEw7CisKKyAgICBtTWFqb3JWZXJzaW9uID0gMDsKKyAgICBtTWlub3JWZXJzaW9uID0gMTsKKyAgICBtRGF0YVNpemUgPSAwOwogfQogCiBGaWxlQTNEOjp+RmlsZUEzRCgpCiB7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleC5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1JbmRleFtpXTsKKyAgICB9CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1Xcml0ZUluZGV4LnNpemUoKTsgaSArKykgeworICAgICAgICBkZWxldGUgbVdyaXRlSW5kZXhbaV07CisgICAgfQorICAgIGlmKG1Xcml0ZVN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtUmVhZFN0cmVhbSkgeworICAgICAgICBkZWxldGUgbVdyaXRlU3RyZWFtOworICAgIH0KKyAgICBpZihtQWxsb2MpIHsKKyAgICAgICAgZnJlZShtQWxsb2MpOworICAgIH0KIH0KIAotYm9vbCBGaWxlQTNEOjpsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZikKK3ZvaWQgRmlsZUEzRDo6cGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKQoreworICAgIG1NYWpvclZlcnNpb24gPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtTWlub3JWZXJzaW9uID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKKworICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICB1aW50MzJfdCBudW1JbmRleEVudHJpZXMgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBudW1JbmRleEVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgQTNESW5kZXhFbnRyeSAqZW50cnkgPSBuZXcgQTNESW5kZXhFbnRyeSgpOworICAgICAgICBoZWFkZXJTdHJlYW0tPmxvYWRTdHJpbmcoJmVudHJ5LT5tT2JqZWN0TmFtZSk7CisgICAgICAgIExPR0UoIkhlYWRlciBkYXRhLCBlbnRyeSBuYW1lID0gJXMiLCBlbnRyeS0+bU9iamVjdE5hbWUuc3RyaW5nKCkpOworICAgICAgICBlbnRyeS0+bVR5cGUgPSAoUnNBM0RDbGFzc0lEKWhlYWRlclN0cmVhbS0+bG9hZFUzMigpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGVudHJ5LT5tT2Zmc2V0ID0gaGVhZGVyU3RyZWFtLT5sb2FkT2Zmc2V0KCk7CisgICAgICAgICAgICBlbnRyeS0+bUxlbmd0aCA9IGhlYWRlclN0cmVhbS0+bG9hZE9mZnNldCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgPSBoZWFkZXJTdHJlYW0tPmxvYWRVMzIoKTsKKyAgICAgICAgICAgIGVudHJ5LT5tTGVuZ3RoID0gaGVhZGVyU3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgIH0KKyAgICAgICAgZW50cnktPm1Sc09iaiA9IE5VTEw7CisgICAgICAgIG1JbmRleC5wdXNoKGVudHJ5KTsKKyAgICB9Cit9CisKK2Jvb2wgRmlsZUEzRDo6bG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIExPR0UoIkxvYWRpbmcgZGF0YS4gU2l6ZTogJXUiLCBsZW5ndGgpOworICAgIGNvbnN0IHVpbnQ4X3QgKmxvY2FsRGF0YSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIHNpemVfdCBsZW5ndGhSZW1haW5pbmcgPSBsZW5ndGg7CisgICAgc2l6ZV90IG1hZ2ljU3RyTGVuID0gMTI7CisgICAgaWYgKChsZW5ndGggPCBtYWdpY1N0ckxlbikgfHwKKyAgICAgICAgbWVtY21wKGRhdGEsICJBbmRyb2lkM0RfZmYiLCBtYWdpY1N0ckxlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGxvY2FsRGF0YSArPSBtYWdpY1N0ckxlbjsKKyAgICBsZW5ndGhSZW1haW5pbmcgLT0gbWFnaWNTdHJMZW47CisKKyAgICAvLyBOZXh0IHdlIGdldCBvdXIgaGVhZGVyIHNpemUKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YoaGVhZGVyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbWNweSgmaGVhZGVyU2l6ZSwgbG9jYWxEYXRhLCBzaXplb2YoaGVhZGVyU2l6ZSkpOworICAgIGxvY2FsRGF0YSArPSBzaXplb2YoaGVhZGVyU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihoZWFkZXJTaXplKTsKKworICAgIExPR0UoIkxvYWRpbmcgZGF0YSwgaGVhZGVyU2l6ZSA9ICVsbGkiLCBoZWFkZXJTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IGhlYWRlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmhlYWRlckRhdGEgPSAodWludDhfdCAqKW1hbGxvYyhoZWFkZXJTaXplKTsKKyAgICBpZighaGVhZGVyRGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtY3B5KGhlYWRlckRhdGEsIGxvY2FsRGF0YSwgaGVhZGVyU2l6ZSk7CisKKyAgICAvLyBOb3cgb3BlbiB0aGUgc3RyZWFtIHRvIHBhcnNlIHRoZSBoZWFkZXIKKyAgICBJU3RyZWFtIGhlYWRlclN0cmVhbShoZWFkZXJEYXRhLCBmYWxzZSk7CisgICAgcGFyc2VIZWFkZXIoJmhlYWRlclN0cmVhbSk7CisKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgbG9jYWxEYXRhICs9IGhlYWRlclNpemU7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IGhlYWRlclNpemU7CisKKyAgICBpZihsZW5ndGhSZW1haW5pbmcgPCBzaXplb2YobURhdGFTaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgIG1lbWNweSgmbURhdGFTaXplLCBsb2NhbERhdGEsIHNpemVvZihtRGF0YVNpemUpKTsKKyAgICBsb2NhbERhdGEgKz0gc2l6ZW9mKG1EYXRhU2l6ZSk7CisgICAgbGVuZ3RoUmVtYWluaW5nIC09IHNpemVvZihtRGF0YVNpemUpOworCisgICAgTE9HRSgiTG9hZGluZyBkYXRhLCBtRGF0YVNpemUgPSAlbGxpIiwgbURhdGFTaXplKTsKKworICAgIGlmKGxlbmd0aFJlbWFpbmluZyA8IG1EYXRhU2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gV2Ugc2hvdWxkIGtub3cgZW5vdWdoIHRvIHJlYWQgdGhlIGZpbGUgaW4gYXQgdGhpcyBwb2ludC4KKyAgICBtQWxsb2MgPSBtYWxsb2MobURhdGFTaXplKTsKKyAgICBpZiAoIW1BbGxvYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltQWxsb2M7CisgICAgbWVtY3B5KG1BbGxvYywgbG9jYWxEYXRhLCBtRGF0YVNpemUpOworCisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaWxlQTNEOjpsb2FkKEZJTEUgKmYpCiB7CiAgICAgY2hhciBtYWdpY1N0cmluZ1sxMl07CiAgICAgc2l6ZV90IGxlbjsKQEAgLTQ5LDQ3ICsxNzYsMzkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAyIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NYWpvclZlcnNpb24sIDEsIHNpemVvZihtTWFqb3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1ham9yVmVyc2lvbikpIHsKKyAgICAvLyBOZXh0IHRoaW5nIGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gMDsKKyAgICBsZW4gPSBmcmVhZCgmaGVhZGVyU2l6ZSwgMSwgc2l6ZW9mKGhlYWRlclNpemUpLCBmKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihoZWFkZXJTaXplKSB8fCBoZWFkZXJTaXplID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiAzIik7Ci0gICAgbGVuID0gZnJlYWQoJm1NaW5vclZlcnNpb24sIDEsIHNpemVvZihtTWlub3JWZXJzaW9uKSwgZik7Ci0gICAgaWYgKGxlbiAhPSBzaXplb2YobU1pbm9yVmVyc2lvbikpIHsKKyAgICB1aW50OF90ICpoZWFkZXJEYXRhID0gKHVpbnQ4X3QgKiltYWxsb2MoaGVhZGVyU2l6ZSk7CisgICAgaWYoIWhlYWRlckRhdGEpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgb3BlbiA0Iik7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgbGVuID0gZnJlYWQoJmZsYWdzLCAxLCBzaXplb2YoZmxhZ3MpLCBmKTsKLSAgICBpZiAobGVuICE9IHNpemVvZihmbGFncykpIHsKKyAgICBsZW4gPSBmcmVhZChoZWFkZXJEYXRhLCAxLCBoZWFkZXJTaXplLCBmKTsKKyAgICBpZiAobGVuICE9IGhlYWRlclNpemUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtVXNlNjRCaXRPZmZzZXRzID0gKGZsYWdzICYgMSkgIT0gMDsKIAotICAgIExPR0UoImZpbGUgb3BlbiA2NGJpdCA9ICVpIiwgbVVzZTY0Qml0T2Zmc2V0cyk7CisgICAgLy8gTm93IG9wZW4gdGhlIHN0cmVhbSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgSVN0cmVhbSBoZWFkZXJTdHJlYW0oaGVhZGVyRGF0YSwgZmFsc2UpOworICAgIHBhcnNlSGVhZGVyKCZoZWFkZXJTdHJlYW0pOwogCi0gICAgaWYgKG1Vc2U2NEJpdE9mZnNldHMpIHsKLSAgICAgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOwotICAgICAgICBpZiAobGVuICE9IHNpemVvZihtRGF0YVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGxlbiA9IGZyZWFkKCZ0bXAsIDEsIHNpemVvZih0bXApLCBmKTsKLSAgICAgICAgaWYgKGxlbiAhPSBzaXplb2YodG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1EYXRhU2l6ZSA9IHRtcDsKKyAgICBmcmVlKGhlYWRlckRhdGEpOworCisgICAgLy8gTmV4dCB0aGluZyBpcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisgICAgbGVuID0gZnJlYWQoJm1EYXRhU2l6ZSwgMSwgc2l6ZW9mKG1EYXRhU2l6ZSksIGYpOworICAgIGlmIChsZW4gIT0gc2l6ZW9mKG1EYXRhU2l6ZSkgfHwgbURhdGFTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIExPR0UoImZpbGUgb3BlbiBzaXplID0gJWxsaSIsIG1EYXRhU2l6ZSk7CiAKICAgICAvLyBXZSBzaG91bGQga25vdyBlbm91Z2ggdG8gcmVhZCB0aGUgZmlsZSBpbiBhdCB0aGlzIHBvaW50LgotICAgIGZzZWVrKGYsIFNFRUtfU0VULCAwKTsKLSAgICBtQWxsb2M9IG1hbGxvYyhtRGF0YVNpemUpOworICAgIG1BbGxvYyA9IG1hbGxvYyhtRGF0YVNpemUpOwogICAgIGlmICghbUFsbG9jKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05OSwyODIgKzIxOCwyNTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIExPR0UoImZpbGUgc3RhcnQgcHJvY2Vzc2luZyIpOwotICAgIHJldHVybiBwcm9jZXNzKHJzYyk7CisgICAgbVJlYWRTdHJlYW0gPSBuZXcgSVN0cmVhbShtRGF0YSwgbVVzZTY0Qml0T2Zmc2V0cyk7CisKKyAgICBMT0dFKCJIZWFkZXIgaXMgcmVhZCBhbiBzdHJlYW0gaW5pdGlhbGl6ZWQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaWxlQTNEOjpwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICBib29sIHJldCA9IGZhbHNlOwotICAgIElPIGlvKG1EYXRhICsgaWUtPm1PZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOworc2l6ZV90IEZpbGVBM0Q6OmdldE51bUluZGV4RW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGV4LnNpemUoKTsKK30KIAotICAgIExPR0UoInByb2Nlc3MgaW5kZXgsIHR5cGUgJWkiLCBpZS0+bVR5cGUpOwotCi0gICAgc3dpdGNoKGllLT5tVHlwZSkgewotICAgIGNhc2UgQ0hVTktfRUxFTUVOVDoKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnQocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19FTEVNRU5UX1NPVVJDRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19WRVJUSUNJRVM6Ci0gICAgICAgIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMocnNjLCAmaW8sIGllKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDSFVOS19NRVNIOgotICAgICAgICBwcm9jZXNzQ2h1bmtfTWVzaChyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENIVU5LX1BSSU1JVElWRToKLSAgICAgICAgcHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShyc2MsICZpbywgaWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJGaWxlQTNEIFVua25vd24gY2h1bmsgdHlwZSIpOwotICAgICAgICBicmVhazsKK2NvbnN0IEZpbGVBM0Q6OkEzREluZGV4RW50cnkgKkZpbGVBM0Q6OmdldEluZGV4RW50cnkoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYoaW5kZXggPCBtSW5kZXguc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtSW5kZXhbaW5kZXhdOwogICAgIH0KLSAgICByZXR1cm4gKGllLT5tUnNPYmogIT0gTlVMTCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgRmlsZUEzRDo6cHJvY2VzcyhDb250ZXh0ICpyc2MpCi17Ci0gICAgTE9HRSgicHJvY2VzcyIpOwotICAgIElPIGlvKG1EYXRhICsgMTIsIG1Vc2U2NEJpdE9mZnNldHMpOwotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLQotICAgIC8vIEJ1aWxkIHRoZSBpbmRleCBmaXJzdAotICAgIExPR0UoInByb2Nlc3MgMSIpOwotICAgIGlvLmxvYWRVMzIoKTsgLy8gbWFqb3IgdmVyc2lvbiwgYWxyZWFkeSBsb2FkZWQKLSAgICBpby5sb2FkVTMyKCk7IC8vIG1pbm9yIHZlcnNpb24sIGFscmVhZHkgbG9hZGVkCi0gICAgTE9HRSgicHJvY2VzcyAyIik7Ci0KLSAgICBpby5sb2FkVTMyKCk7ICAvLyBmbGFncwotICAgIGlvLmxvYWRPZmZzZXQoKTsgLy8gZmlsZXNpemUsIGFscmVhZHkgbG9hZGVkLgotICAgIExPR0UoInByb2Nlc3MgNCIpOwotICAgIHVpbnQ2NF90IG1JbmRleE9mZnNldCA9IGlvLmxvYWRPZmZzZXQoKTsKLSAgICB1aW50NjRfdCBtU3RyaW5nT2Zmc2V0ID0gaW8ubG9hZE9mZnNldCgpOwotCi0gICAgTE9HRSgicHJvY2VzcyBtSW5kZXhPZmZzZXQ9IDB4JTAxNmxseCIsIG1JbmRleE9mZnNldCk7Ci0gICAgTE9HRSgicHJvY2VzcyBtU3RyaW5nT2Zmc2V0PSAweCUwMTZsbHgiLCBtU3RyaW5nT2Zmc2V0KTsKLQotICAgIElPIGluZGV4KG1EYXRhICsgbUluZGV4T2Zmc2V0LCBtVXNlNjRCaXRPZmZzZXRzKTsKLSAgICBJTyBzdHJpbmdUYWJsZShtRGF0YSArIG1TdHJpbmdPZmZzZXQsIG1Vc2U2NEJpdE9mZnNldHMpOwotCi0gICAgdWludDMyX3Qgc3RyaW5nRW50cnlDb3VudCA9IHN0cmluZ1RhYmxlLmxvYWRVMzIoKTsKLSAgICBMT0dFKCJzdHJpbmdFbnRyeUNvdW50ICVpIiwgc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ3Muc2V0Q2FwYWNpdHkoc3RyaW5nRW50cnlDb3VudCk7Ci0gICAgbVN0cmluZ0luZGV4VmFsdWVzLnNldENhcGFjaXR5KHN0cmluZ0VudHJ5Q291bnQpOwotICAgIGlmIChzdHJpbmdFbnRyeUNvdW50KSB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ1R5cGUgPSBzdHJpbmdUYWJsZS5sb2FkVTMyKCk7Ci0gICAgICAgIExPR0UoInN0cmluZ1R5cGUgJWkiLCBzdHJpbmdUeXBlKTsKLSAgICAgICAgcnNBc3NlcnQoc3RyaW5nVHlwZT09MCk7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IHN0cmluZ0VudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCA9IHN0cmluZ1RhYmxlLmxvYWRPZmZzZXQoKTsKLSAgICAgICAgICAgIExPR0UoInN0cmluZyBvZmZzZXQgMHglMDE2bGx4Iiwgb2Zmc2V0KTsKLSAgICAgICAgICAgIElPIHRtcChtRGF0YSArIG9mZnNldCwgbVVzZTY0Qml0T2Zmc2V0cyk7Ci0gICAgICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgICAgICB0bXAubG9hZFN0cmluZygmcyk7Ci0gICAgICAgICAgICBMT0dFKCJzdHJpbmcgJXMiLCBzLnN0cmluZygpKTsKLSAgICAgICAgICAgIG1TdHJpbmdzLnB1c2gocyk7Ci0gICAgICAgIH0KK09iamVjdEJhc2UgKkZpbGVBM0Q6OmluaXRpYWxpemVGcm9tRW50cnkoc2l6ZV90IGluZGV4KSB7CisgICAgaWYoaW5kZXggPj0gbUluZGV4LnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBMT0dFKCJzdHJpbmdzIGRvbmUiKTsKLSAgICB1aW50MzJfdCBpbmRleEVudHJ5Q291bnQgPSBpbmRleC5sb2FkVTMyKCk7Ci0gICAgTE9HRSgiaW5kZXggY291bnQgJWkiLCBpbmRleEVudHJ5Q291bnQpOwotICAgIG1JbmRleC5zZXRDYXBhY2l0eShpbmRleEVudHJ5Q291bnQpOwotICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IGluZGV4RW50cnlDb3VudDsgY3QrKykgewotICAgICAgICBBM0RJbmRleEVudHJ5IGU7Ci0gICAgICAgIHVpbnQzMl90IHN0cmluZ0luZGV4ID0gaW5kZXgubG9hZFUzMigpOwotICAgICAgICBMT0dFKCJpbmRleCAlaSIsIGN0KTsKLSAgICAgICAgTE9HRSgiICBzdHJpbmcgaW5kZXggJWkiLCBzdHJpbmdJbmRleCk7Ci0gICAgICAgIGUubVR5cGUgPSAoQTNEQ2h1bmtUeXBlKWluZGV4LmxvYWRVMzIoKTsKLSAgICAgICAgTE9HRSgiICB0eXBlICVpIiwgZS5tVHlwZSk7Ci0gICAgICAgIGUubU9mZnNldCA9IGluZGV4LmxvYWRPZmZzZXQoKTsKLSAgICAgICAgTE9HRSgiICBvZmZzZXQgMHglMDE2bGx4IiwgZS5tT2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3RyaW5nSW5kZXggJiYgKHN0cmluZ0luZGV4IDwgbVN0cmluZ3Muc2l6ZSgpKSkgewotICAgICAgICAgICAgZS5tSUQgPSBtU3RyaW5nc1tzdHJpbmdJbmRleF07Ci0gICAgICAgICAgICBtU3RyaW5nSW5kZXhWYWx1ZXMuZWRpdEl0ZW1BdChzdHJpbmdJbmRleCkgPSBjdDsKLSAgICAgICAgICAgIExPR0UoIiAgaWQgJXMiLCBlLm1JRC5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSW5kZXgucHVzaChlKTsKLSAgICB9Ci0gICAgTE9HRSgiaW5kZXggZG9uZSIpOwotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgaW5kZXggc2hvdWxkIGJlIGZ1bGx5IHBvcHVsYXRlZC4KLSAgICAvLyBXZSBjYW4gbm93IHdhbGsgdGhvdWdoIGl0IGFuZCBsb2FkIGFsbCB0aGUgb2JqZWN0cy4KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpbmRleEVudHJ5Q291bnQ7IGN0KyspIHsKLSAgICAgICAgTE9HRSgicHJvY2Vzc2luZyBpbmRleCBlbnRyeSAlaSIsIGN0KTsKLSAgICAgICAgcHJvY2Vzc0luZGV4KHJzYywgJm1JbmRleC5lZGl0SXRlbUF0KGN0KSk7CisgICAgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBtSW5kZXhbaW5kZXhdOworICAgIGlmKCFlbnRyeSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLUZpbGVBM0Q6OklPOjpJTyhjb25zdCB1aW50OF90ICpidWYsIGJvb2wgdXNlNjQpCi17Ci0gICAgbURhdGEgPSBidWY7Ci0gICAgbVBvcyA9IDA7Ci0gICAgbVVzZTY0ID0gdXNlNjQ7Ci19Ci0KLXVpbnQ2NF90IEZpbGVBM0Q6OklPOjpsb2FkT2Zmc2V0KCkKLXsKLSAgICB1aW50NjRfdCB0bXA7Ci0gICAgaWYgKG1Vc2U2NCkgewotICAgICAgICBtUG9zID0gKG1Qb3MgKyA3KSAmICh+Nyk7Ci0gICAgICAgIHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgbVBvcyArPSBzaXplb2YodWludDY0X3QpOwotICAgICAgICByZXR1cm4gdG1wOworICAgIGlmKGVudHJ5LT5tUnNPYmopIHsKKyAgICAgICAgZW50cnktPm1Sc09iai0+aW5jVXNlclJlZigpOworICAgICAgICByZXR1cm4gZW50cnktPm1Sc09iajsKICAgICB9Ci0gICAgcmV0dXJuIGxvYWRVMzIoKTsKLX0KIAotdm9pZCBGaWxlQTNEOjpJTzo6bG9hZFN0cmluZyhTdHJpbmc4ICpzKQotewotICAgIExPR0UoImxvYWRTdHJpbmciKTsKLSAgICB1aW50MzJfdCBsZW4gPSBsb2FkVTMyKCk7Ci0gICAgTE9HRSgibG9hZFN0cmluZyBsZW4gJWkiLCBsZW4pOwotICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOwotICAgIG1Qb3MgKz0gbGVuOwotfQotCi0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2ggKiBtID0gbmV3IE1lc2gocnNjKTsKLQotICAgIG0tPm1QcmltaXRpdmVzQ291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIG0tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbbS0+bVByaW1pdGl2ZXNDb3VudF07Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtLT5tUHJpbWl0aXZlc0NvdW50OyBjdCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gaW8tPmxvYWRVMzIoKTsKLQotICAgICAgICBtLT5tUHJpbWl0aXZlc1tjdF0gPSAoTWVzaDo6UHJpbWl0aXZlX3QgKiltSW5kZXhbaW5kZXhdLm1Sc09iajsKLSAgICB9Ci0gICAgaWUtPm1Sc09iaiA9IG07Ci19Ci0KLXZvaWQgRmlsZUEzRDo6cHJvY2Vzc0NodW5rX1ByaW1pdGl2ZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgTWVzaDo6UHJpbWl0aXZlX3QgKiBwID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90OwotCi0gICAgcC0+bUluZGV4Q291bnQgPSBpby0+bG9hZFUzMigpOwotICAgIHVpbnQzMl90IHZlcnRJZHggPSBpby0+bG9hZFUzMigpOwotICAgIHAtPm1SZXN0YXJ0Q291bnRzID0gaW8tPmxvYWRVMTYoKTsKLSAgICB1aW50MzJfdCBiaXRzID0gaW8tPmxvYWRVOCgpOwotICAgIHAtPm1UeXBlID0gKFJzUHJpbWl0aXZlKWlvLT5sb2FkVTgoKTsKLQotICAgIExPR0UoInByb2Nlc3NDaHVua19QcmltaXRpdmUgY291bnQgJWksIGJpdHMgJWkiLCBwLT5tSW5kZXhDb3VudCwgYml0cyk7Ci0KLSAgICBwLT5tVmVydGljaWVzID0gKE1lc2g6OlZlcnRpY2llc190ICopbUluZGV4W3ZlcnRJZHhdLm1Sc09iajsKLQotICAgIHAtPm1JbmRpY2llcyA9IG5ldyB1aW50MTZfdFtwLT5tSW5kZXhDb3VudF07Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bUluZGV4Q291bnQ7IGN0KyspIHsKLSAgICAgICAgc3dpdGNoKGJpdHMpIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcC0+bUluZGljaWVzW2N0XSA9IGlvLT5sb2FkVTgoKTsKKyAgICAvLyBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2Ygb2JqZWN0CisgICAgbVJlYWRTdHJlYW0tPnJlc2V0KGVudHJ5LT5tT2Zmc2V0KTsKKyAgICBzd2l0Y2ggKGVudHJ5LT5tVHlwZSkgeworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX01FU0g6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gTWVzaDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHAtPm1JbmRpY2llc1tjdF0gPSBpby0+bG9hZFUxNigpOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9UWVBFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFR5cGU6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICBwLT5tSW5kaWNpZXNbY3RdID0gaW8tPmxvYWRVMzIoKTsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfRUxFTUVOVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBFbGVtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTExPQ0FUSU9OOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IEFsbG9jYXRpb246OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fVkVSVEVYOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1WZXJ0ZXg6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fUkFTVEVSOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1SYXN0ZXI6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX1BST0dSQU1fRlJBR01FTlQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gUHJvZ3JhbUZyYWdtZW50OjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOgorICAgICAgICAgICAgZW50cnktPm1Sc09iaiA9IFByb2dyYW1TdG9yZTo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBTYW1wbGVyOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9BTklNQVRJT046CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQW5pbWF0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9MSUdIVDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBMaWdodDo6Y3JlYXRlRnJvbVN0cmVhbShtUlNDLCBtUmVhZFN0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19BM0RfQ0xBU1NfSURfQURBUFRFUl8xRDoKKyAgICAgICAgICAgIGVudHJ5LT5tUnNPYmogPSBBZGFwdGVyMUQ6OmNyZWF0ZUZyb21TdHJlYW0obVJTQywgbVJlYWRTdHJlYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQTNEX0NMQVNTX0lEX0FEQVBURVJfMkQ6CisgICAgICAgICAgICBlbnRyeS0+bVJzT2JqID0gQWRhcHRlcjJEOjpjcmVhdGVGcm9tU3RyZWFtKG1SU0MsIG1SZWFkU3RyZWFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZihlbnRyeS0+bVJzT2JqKSB7CisgICAgICAgIGVudHJ5LT5tUnNPYmotPmluY1VzZXJSZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LT5tUnNPYmo7Cit9CisKK2Jvb2wgRmlsZUEzRDo6d3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGlmKCFtV3JpdGVTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiTm8gb2JqZWN0cyB0byB3cml0ZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYobVdyaXRlU3RyZWFtLT5nZXRQb3MoKSA9PSAwKSB7CisgICAgICAgIExPR0UoIk5vIG9iamVjdHMgdG8gd3JpdGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRklMRSAqd3JpdGVIYW5kbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYoIXdyaXRlSGFuZGxlKSB7CisgICAgICAgIExPR0UoIkNvdWxkbid0IG9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmdcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gT3BlbiBhIG5ldyBzdHJlYW0gdG8gbWFrZSB3cml0aW5nIHRoZSBoZWFkZXIgZWFzaWVyCisgICAgT1N0cmVhbSBoZWFkZXJTdHJlYW0oNSoxMDI0LCBmYWxzZSk7CisgICAgaGVhZGVyU3RyZWFtLmFkZFUzMihtTWFqb3JWZXJzaW9uKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG1NaW5vclZlcnNpb24pOworICAgIHVpbnQzMl90IGlzNjRCaXQgPSAwOworICAgIGhlYWRlclN0cmVhbS5hZGRVMzIoaXM2NEJpdCk7CisKKyAgICB1aW50MzJfdCB3cml0ZUluZGV4U2l6ZSA9IG1Xcml0ZUluZGV4LnNpemUoKTsKKyAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKHdyaXRlSW5kZXhTaXplKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCB3cml0ZUluZGV4U2l6ZTsgaSArKykgeworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkU3RyaW5nKCZtV3JpdGVJbmRleFtpXS0+bU9iamVjdE5hbWUpOworICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKCh1aW50MzJfdCltV3JpdGVJbmRleFtpXS0+bVR5cGUpOworICAgICAgICBpZihtVXNlNjRCaXRPZmZzZXRzKXsKKyAgICAgICAgICAgIGhlYWRlclN0cmVhbS5hZGRPZmZzZXQobVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQpOworICAgICAgICAgICAgaGVhZGVyU3RyZWFtLmFkZE9mZnNldChtV3JpdGVJbmRleFtpXS0+bUxlbmd0aCk7CiAgICAgICAgIH0KLSAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tSW5kaWNpZXNbY3RdKTsKLSAgICB9Ci0KLSAgICBpZiAocC0+bVJlc3RhcnRDb3VudHMpIHsKLSAgICAgICAgcC0+bVJlc3RhcnRzID0gbmV3IHVpbnQxNl90W3AtPm1SZXN0YXJ0Q291bnRzXTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgcC0+bVJlc3RhcnRDb3VudHM7IGN0KyspIHsKLSAgICAgICAgICAgIHN3aXRjaChiaXRzKSB7Ci0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgcC0+bVJlc3RhcnRzW2N0XSA9IGlvLT5sb2FkVTE2KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgIHAtPm1SZXN0YXJ0c1tjdF0gPSBpby0+bG9hZFUzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTE9HRSgiICBpZHggJWkiLCBwLT5tUmVzdGFydHNbY3RdKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1PZmZzZXQ7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgPSAodWludDMyX3QpbVdyaXRlSW5kZXhbaV0tPm1MZW5ndGg7CisgICAgICAgICAgICBoZWFkZXJTdHJlYW0uYWRkVTMyKG9mZnNldCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwLT5tUmVzdGFydHMgPSBOVUxMOwogICAgIH0KIAotICAgIGllLT5tUnNPYmogPSBwOworICAgIC8vIFdyaXRlIG91ciBtYWdpYyBzdHJpbmcgc28gd2Uga25vdyB3ZSBhcmUgcmVhZGluZyB0aGUgcmlnaHQgZmlsZQorICAgIFN0cmluZzggbWFnaWNTdHJpbmcoQTNEX01BR0lDX0tFWSk7CisgICAgZndyaXRlKG1hZ2ljU3RyaW5nLnN0cmluZygpLCBzaXplb2YoY2hhciksIG1hZ2ljU3RyaW5nLnNpemUoKSwgd3JpdGVIYW5kbGUpOworCisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciB0byBtYWtlIGl0IGVhc2llciB0byBwYXJzZSB3aGVuIHdlIHJlYWQgaXQKKyAgICB1aW50NjRfdCBoZWFkZXJTaXplID0gaGVhZGVyU3RyZWFtLmdldFBvcygpOworICAgIGZ3cml0ZSgmaGVhZGVyU2l6ZSwgc2l6ZW9mKGhlYWRlclNpemUpLCAxLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgb3VyIGhlYWRlcgorICAgIGZ3cml0ZShoZWFkZXJTdHJlYW0uZ2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgaGVhZGVyU3RyZWFtLmdldFBvcygpLCB3cml0ZUhhbmRsZSk7CisKKyAgICAvLyBOb3cgd3JpdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiB0aGUgZmlsZSBmb3IgZWFzaWVyIHBhcnNpbmcgbGF0ZXIKKyAgICB1aW50NjRfdCBmaWxlRGF0YVNpemUgPSBtV3JpdGVTdHJlYW0tPmdldFBvcygpOworICAgIGZ3cml0ZSgmZmlsZURhdGFTaXplLCBzaXplb2YoZmlsZURhdGFTaXplKSwgMSwgd3JpdGVIYW5kbGUpOworCisgICAgZndyaXRlKG1Xcml0ZVN0cmVhbS0+Z2V0UHRyKCksIHNpemVvZih1aW50OF90KSwgbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSwgd3JpdGVIYW5kbGUpOworCisgICAgaW50IHN0YXR1cyA9IGZjbG9zZSh3cml0ZUhhbmRsZSk7CisKKyAgICBpZihzdGF0dXMgIT0gMCkgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBjbG9zZSBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKQotewotICAgIE1lc2g6OlZlcnRpY2llc190ICpjdiA9IG5ldyBNZXNoOjpWZXJ0aWNpZXNfdDsKLSAgICBjdi0+bUFsbG9jYXRpb25Db3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgY3YtPm1BbGxvY2F0aW9ucyA9IG5ldyBBbGxvY2F0aW9uICpbY3YtPm1BbGxvY2F0aW9uQ291bnRdOwotICAgIExPR0UoInByb2Nlc3NDaHVua19WZXJ0aWNpZXMgY291bnQgJWkiLCBjdi0+bUFsbG9jYXRpb25Db3VudCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgY3YtPm1BbGxvY2F0aW9uQ291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgaSA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgICAgIGN2LT5tQWxsb2NhdGlvbnNbY3RdID0gKEFsbG9jYXRpb24gKiltSW5kZXhbaV0ubVJzT2JqOwotICAgICAgICBMT0dFKCIgIGlkeCAlaSIsIGkpOwordm9pZCBGaWxlQTNEOjphcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKSB7CisgICAgaWYoIW9iaikgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGllLT5tUnNPYmogPSBjdjsKLX0KLQotdm9pZCBGaWxlQTNEOjpwcm9jZXNzQ2h1bmtfRWxlbWVudChDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpCi17Ci0gICAgLyoKLSAgICByc2lfRWxlbWVudEJlZ2luKHJzYyk7Ci0KLSAgICB1aW50MzJfdCBjb3VudCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnQgY291bnQgJWkiLCBjb3VudCk7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgUnNEYXRhS2luZCBkayA9IChSc0RhdGFLaW5kKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgUnNEYXRhVHlwZSBkdCA9IChSc0RhdGFUeXBlKWlvLT5sb2FkVTgoKTsKLSAgICAgICAgdWludDMyX3QgYml0cyA9IGlvLT5sb2FkVTgoKTsKLSAgICAgICAgYm9vbCBpc05vcm0gPSBpby0+bG9hZFU4KCkgIT0gMDsKLSAgICAgICAgTE9HRSgiICAlaSAlaSAlaSAlaSIsIGRrLCBkdCwgYml0cywgaXNOb3JtKTsKLSAgICAgICAgcnNpX0VsZW1lbnRBZGQocnNjLCBkaywgZHQsIGlzTm9ybSwgYml0cywgMCk7CisgICAgaWYoIW1Xcml0ZVN0cmVhbSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCBpbml0aWFsU3RyZWFtU2l6ZSA9IDI1NioxMDI0OworICAgICAgICBtV3JpdGVTdHJlYW0gPSBuZXcgT1N0cmVhbShpbml0aWFsU3RyZWFtU2l6ZSwgZmFsc2UpOwogICAgIH0KLSAgICBMT0dFKCJwcm9jZXNzQ2h1bmtfRWxlbWVudCBjcmVhdGUiKTsKLSAgICBpZS0+bVJzT2JqID0gcnNpX0VsZW1lbnRDcmVhdGUocnNjKTsKLSAgICAqLwotfQotCi12b2lkIEZpbGVBM0Q6OnByb2Nlc3NDaHVua19FbGVtZW50U291cmNlKENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSkKLXsKLSAgICB1aW50MzJfdCBpbmRleCA9IGlvLT5sb2FkVTMyKCk7Ci0gICAgdWludDMyX3QgY291bnQgPSBpby0+bG9hZFUzMigpOwotCi0gICAgTE9HRSgicHJvY2Vzc0NodW5rX0VsZW1lbnRTb3VyY2UgY291bnQgJWksIGluZGV4ICVpIiwgY291bnQsIGluZGV4KTsKLQotICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCltSW5kZXhbaW5kZXhdLm1Sc09iajsKLQotICAgIFJzQWxsb2NhdGlvbiBhID0gcnNpX0FsbG9jYXRpb25DcmVhdGVTaXplZChyc2MsIGUsIGNvdW50KTsKLSAgICBBbGxvY2F0aW9uICogYWxsb2MgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KGEpOwotCi0gICAgZmxvYXQgKiBkYXRhID0gKGZsb2F0ICopYWxsb2MtPmdldFB0cigpOwotICAgIHdoaWxlKGNvdW50LS0pIHsKLSAgICAgICAgKmRhdGEgPSBpby0+bG9hZEYoKTsKLSAgICAgICAgTE9HRSgiICAlZiIsICpkYXRhKTsKLSAgICAgICAgZGF0YSsrOwotICAgIH0KLSAgICBpZS0+bVJzT2JqID0gYWxsb2M7CisgICAgQTNESW5kZXhFbnRyeSAqaW5kZXhFbnRyeSA9IG5ldyBBM0RJbmRleEVudHJ5KCk7CisgICAgaW5kZXhFbnRyeS0+bU9iamVjdE5hbWUuc2V0VG8ob2JqLT5nZXROYW1lKCkpOworICAgIGluZGV4RW50cnktPm1UeXBlID0gb2JqLT5nZXRDbGFzc0lkKCk7CisgICAgaW5kZXhFbnRyeS0+bU9mZnNldCA9IG1Xcml0ZVN0cmVhbS0+Z2V0UG9zKCk7CisgICAgaW5kZXhFbnRyeS0+bVJzT2JqID0gb2JqOworICAgIG1Xcml0ZUluZGV4LnB1c2goaW5kZXhFbnRyeSk7CisgICAgb2JqLT5zZXJpYWxpemUobVdyaXRlU3RyZWFtKTsKKyAgICBpbmRleEVudHJ5LT5tTGVuZ3RoID0gbVdyaXRlU3RyZWFtLT5nZXRQb3MoKSAtIGluZGV4RW50cnktPm1PZmZzZXQ7CisgICAgbVdyaXRlU3RyZWFtLT5hbGlnbig0KTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKK3ZvaWQgcnNpX0ZpbGVBM0RHZXROdW1JbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBpbnQzMl90ICpudW1FbnRyaWVzLCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKworICAgIGlmKGZhM2QpIHsKKyAgICAgICAgKm51bUVudHJpZXMgPSBmYTNkLT5nZXROdW1JbmRleEVudHJpZXMoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpudW1FbnRyaWVzID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgcnNpX0ZpbGVBM0RHZXRJbmRleEVudHJpZXMoQ29udGV4dCAqcnNjLCBSc0ZpbGVJbmRleEVudHJ5ICpmaWxlRW50cmllcywgdWludDMyX3QgbnVtRW50cmllcywgUnNGaWxlIGZpbGUpCit7CisgICAgRmlsZUEzRCAqZmEzZCA9IHN0YXRpY19jYXN0PEZpbGVBM0QgKj4oZmlsZSk7CisKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIE5vIHZhbGlkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IG51bUZpbGVFbnRyaWVzID0gZmEzZC0+Z2V0TnVtSW5kZXhFbnRyaWVzKCk7CisgICAgaWYobnVtRmlsZUVudHJpZXMgIT0gbnVtRW50cmllcyB8fCBudW1FbnRyaWVzID09IDAgfHwgZmlsZUVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGluZGV4IGVudHJpZXMuIEludmFsaWQgbnVtYmVyIHJlcXVlc3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRmlsZUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgY29uc3QgRmlsZUEzRDo6QTNESW5kZXhFbnRyeSAqZW50cnkgPSBmYTNkLT5nZXRJbmRleEVudHJ5KGkpOworICAgICAgICBmaWxlRW50cmllc1tpXS5jbGFzc0lEID0gZW50cnktPmdldFR5cGUoKTsKKyAgICAgICAgZmlsZUVudHJpZXNbaV0ub2JqZWN0TmFtZSA9IGVudHJ5LT5nZXRPYmplY3ROYW1lKCkuc3RyaW5nKCk7CisgICAgfQorCit9CisKK1JzT2JqZWN0QmFzZSByc2lfRmlsZUEzREdldEVudHJ5QnlJbmRleChDb250ZXh0ICpyc2MsIHVpbnQzMl90IGluZGV4LCBSc0ZpbGUgZmlsZSkKK3sKKyAgICBGaWxlQTNEICpmYTNkID0gc3RhdGljX2Nhc3Q8RmlsZUEzRCAqPihmaWxlKTsKKyAgICBpZighZmEzZCkgeworICAgICAgICBMT0dFKCJDYW4ndCBsb2FkIGVudHJ5LiBObyB2YWxpZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE9iamVjdEJhc2UgKm9iaiA9IGZhM2QtPmluaXRpYWxpemVGcm9tRW50cnkoaW5kZXgpOworICAgIExPR0UoIlJldHVybmluZyBvYmplY3Qgd2l0aCBuYW1lICVzIiwgb2JqLT5nZXROYW1lKCkpOworCisgICAgcmV0dXJuIG9iajsKK30KKworUnNGaWxlIHJzaV9GaWxlQTNEQ3JlYXRlRnJvbUFzc2V0U3RyZWFtKENvbnRleHQgKnJzYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRmlsZSBsb2FkIGZhaWxlZC4gQXNzZXQgc3RyZWFtIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEKHJzYyk7CisKKyAgICBmYTNkLT5sb2FkKGRhdGEsIGxlbik7CisgICAgZmEzZC0+aW5jVXNlclJlZigpOworCisgICAgcmV0dXJuIGZhM2Q7Cit9CisKIAogUnNGaWxlIHJzaV9GaWxlT3BlbihDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKnBhdGgsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0gICAgRmlsZUEzRCAqZmEzZCA9IG5ldyBGaWxlQTNEOworICAgIEZpbGVBM0QgKmZhM2QgPSBuZXcgRmlsZUEzRChyc2MpOwogCiAgICAgRklMRSAqZiA9IGZvcGVuKCIvc2RjYXJkL3Rlc3QuYTNkIiwgInJiIik7CiAgICAgaWYgKGYpIHsKLSAgICAgICAgZmEzZC0+bG9hZChyc2MsIGYpOworICAgICAgICBmYTNkLT5sb2FkKGYpOwogICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGZhM2QtPmluY1VzZXJSZWYoKTsKICAgICAgICAgcmV0dXJuIGZhM2Q7CiAgICAgfQogICAgIGRlbGV0ZSBmYTNkOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZpbGVBM0QuaCBiL2xpYnMvcnMvcnNGaWxlQTNELmgKaW5kZXggOWVlMDhlYy4uYjk4NTkwNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpbGVBM0QuaAorKysgYi9saWJzL3JzL3JzRmlsZUEzRC5oCkBAIC0xOCwyMCArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ICiAKICNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKLSNpbmNsdWRlICJyc0ZpbGVBM0REZWNscy5oIgogI2luY2x1ZGUgInJzTWVzaC5oIgogCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgInJzU3RyZWFtLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgeworCiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAotY2xhc3MgRmlsZUEzRAorY2xhc3MgRmlsZUEzRCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CiBwdWJsaWM6Ci0gICAgRmlsZUEzRCgpOworICAgIEZpbGVBM0QoQ29udGV4dCAqcnNjKTsKICAgICB+RmlsZUEzRCgpOwogCiAgICAgdWludDMyX3QgbU1ham9yVmVyc2lvbjsKQEAgLTQwLDc4ICs0Myw1MyBAQAogICAgIHVpbnQ2NF90IG1TdHJpbmdUYWJsZU9mZnNldDsKICAgICBib29sIG1Vc2U2NEJpdE9mZnNldHM7CiAKLSAgICBzdHJ1Y3QgQTNESW5kZXhFbnRyeSB7Ci0gICAgICAgIFN0cmluZzggbUlEOwotICAgICAgICBBM0RDaHVua1R5cGUgbVR5cGU7CisgICAgY2xhc3MgQTNESW5kZXhFbnRyeSB7CisgICAgICAgIFN0cmluZzggbU9iamVjdE5hbWU7CisgICAgICAgIFJzQTNEQ2xhc3NJRCBtVHlwZTsKICAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdm9pZCAqIG1Sc09iajsKKyAgICAgICAgdWludDY0X3QgbUxlbmd0aDsKKyAgICAgICAgT2JqZWN0QmFzZSAqbVJzT2JqOworICAgIHB1YmxpYzoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEZpbGVBM0Q7CisgICAgICAgIGNvbnN0IFN0cmluZzggJmdldE9iamVjdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9iamVjdE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgUnNBM0RDbGFzc0lEIGdldFR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgICAgIH0KICAgICB9OwogCi0gICAgYm9vbCBsb2FkKENvbnRleHQgKnJzYywgRklMRSAqZik7CisgICAgYm9vbCBsb2FkKEZJTEUgKmYpOworICAgIGJvb2wgbG9hZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIHNpemVfdCBnZXROdW1JbmRleEVudHJpZXMoKSBjb25zdDsKKyAgICBjb25zdCBBM0RJbmRleEVudHJ5KiBnZXRJbmRleEVudHJ5KHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgT2JqZWN0QmFzZSAqaW5pdGlhbGl6ZUZyb21FbnRyeShzaXplX3QgaW5kZXgpOworCisgICAgdm9pZCBhcHBlbmRUb0ZpbGUoT2JqZWN0QmFzZSAqb2JqKTsKKyAgICBib29sIHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgY2xhc3MgSU8KLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBJTyhjb25zdCB1aW50OF90ICosIGJvb2wgdXNlNjQpOwotICAgIAotICAgICAgICBmbG9hdCBsb2FkRigpIHsKLSAgICAgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKLSAgICAgICAgICAgIGZsb2F0IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBsb2FkSTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgaW50MzJfdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKLSAgICAgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBsb2FkVTMyKCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOwotICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50MTZfdCBsb2FkVTE2KCkgewotICAgICAgICAgICAgbVBvcyA9IChtUG9zICsgMSkgJiAofjEpOwotICAgICAgICAgICAgdWludDE2X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZfdCAqPigmbURhdGFbbVBvc10pWzBdOwotICAgICAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOwotICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGxvYWRVOCgpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07Ci0gICAgICAgICAgICBtUG9zICs9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDY0X3QgbG9hZE9mZnNldCgpOwotICAgICAgICB2b2lkIGxvYWRTdHJpbmcoU3RyaW5nOCAqcyk7Ci0gICAgICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHtyZXR1cm4gbVBvczt9Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBnZXRQdHIoKSBjb25zdDsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKLSAgICAgICAgdWludDY0X3QgbVBvczsKLSAgICAgICAgYm9vbCBtVXNlNjQ7Ci0gICAgfTsKIAotCi0gICAgYm9vbCBwcm9jZXNzKENvbnRleHQgKnJzYyk7Ci0gICAgYm9vbCBwcm9jZXNzSW5kZXgoQ29udGV4dCAqcnNjLCBBM0RJbmRleEVudHJ5ICopOwotICAgIHZvaWQgcHJvY2Vzc0NodW5rX01lc2goQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19QcmltaXRpdmUoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19WZXJ0aWNpZXMoQ29udGV4dCAqcnNjLCBJTyAqaW8sIEEzREluZGV4RW50cnkgKmllKTsKLSAgICB2b2lkIHByb2Nlc3NDaHVua19FbGVtZW50KENvbnRleHQgKnJzYywgSU8gKmlvLCBBM0RJbmRleEVudHJ5ICppZSk7Ci0gICAgdm9pZCBwcm9jZXNzQ2h1bmtfRWxlbWVudFNvdXJjZShDb250ZXh0ICpyc2MsIElPICppbywgQTNESW5kZXhFbnRyeSAqaWUpOworICAgIHZvaWQgcGFyc2VIZWFkZXIoSVN0cmVhbSAqaGVhZGVyU3RyZWFtKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKICAgICB2b2lkICogbUFsbG9jOwogICAgIHVpbnQ2NF90IG1EYXRhU2l6ZTsKLSAgICBDb250ZXh0ICogbVJzYzsKIAotICAgIFZlY3RvcjxBM0RJbmRleEVudHJ5PiBtSW5kZXg7Ci0gICAgVmVjdG9yPFN0cmluZzg+IG1TdHJpbmdzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVN0cmluZ0luZGV4VmFsdWVzOworICAgIE9TdHJlYW0gKm1Xcml0ZVN0cmVhbTsKKyAgICBWZWN0b3I8QTNESW5kZXhFbnRyeSo+IG1Xcml0ZUluZGV4OwogCisgICAgSVN0cmVhbSAqbVJlYWRTdHJlYW07CisgICAgVmVjdG9yPEEzREluZGV4RW50cnkqPiBtSW5kZXg7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaCBiL2xpYnMvcnMvcnNGaWxlQTNERGVjbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwOGJkMy4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzRmlsZUEzRERlY2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX0ZJTEVfQTNEX0RFQ0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19GSUxFX0EzRF9ERUNMU19ICi0KLQotI2RlZmluZSBBM0RfTUFHSUNfS0VZICJBbmRyb2lkM0RfZmYiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0gICAgZW51bSBBM0RDaHVua1R5cGUgewotICAgICAgICBDSFVOS19FTVBUWSwKLQotICAgICAgICBDSFVOS19FTEVNRU5ULAotICAgICAgICBDSFVOS19FTEVNRU5UX1NPVVJDRSwKLSAgICAgICAgQ0hVTktfVkVSVElDSUVTLAotICAgICAgICBDSFVOS19NRVNILAotICAgICAgICBDSFVOS19QUklNSVRJVkUsCi0KLSAgICAgICAgQ0hVTktfTEFTVAotICAgIH07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19GSUxFX0EzRF9ICi0KLQotCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRm9udC5jcHAgYi9saWJzL3JzL3JzRm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4OWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmNwcApAQCAtMCwwICsxLDc2NSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJzRm9udC5oIgorI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCisjaW5jbHVkZSBGVF9CSVRNQVBfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitGb250OjpGb250KENvbnRleHQgKnJzYykgOiBPYmplY3RCYXNlKHJzYyksIG1DYWNoZWRHbHlwaHMoTlVMTCkKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1IYXNLZXJuaW5nID0gZmFsc2U7CisgICAgbUZhY2UgPSBOVUxMOworfQorCitib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgZm9udFNpemUsIHVpbnQzMl90IGRwaSkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGZvbnRzRGlyKCIvZm9udHMvIik7CisgICAgU3RyaW5nOCBmdWxsUGF0aChnZXRlbnYoIkFORFJPSURfUk9PVCIpKTsKKyAgICBmdWxsUGF0aCArPSBmb250c0RpcjsKKyAgICBmdWxsUGF0aCArPSBuYW1lOworCisgICAgRlRfRXJyb3IgZXJyb3IgPSBGVF9OZXdfRmFjZShtUlNDLT5tU3RhdGVGb250LmdldExpYigpLCBmdWxsUGF0aC5zdHJpbmcoKSwgMCwgJm1GYWNlKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBmb250ICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUZvbnROYW1lID0gbmFtZTsKKyAgICBtRm9udFNpemUgPSBmb250U2l6ZTsKKyAgICBtRHBpID0gZHBpOworCisgICAgZXJyb3IgPSBGVF9TZXRfQ2hhcl9TaXplKG1GYWNlLCBmb250U2l6ZSAqIDY0LCAwLCBkcGksIDApOworICAgIGlmKGVycm9yKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgZm9udCBzaXplIG9uICVzIiwgZnVsbFBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUhhc0tlcm5pbmcgPSBGVF9IQVNfS0VSTklORyhtRmFjZSk7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZvbnQ6OmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKQoreworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKS0+bUlzVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSkKK3sKKyAgICBGb250U3RhdGUgKnN0YXRlID0gJm1SU0MtPm1TdGF0ZUZvbnQ7CisKKyAgICBpbnQgblBlblggPSB4ICsgZ2x5cGgtPm1CaXRtYXBMZWZ0OworICAgIGludCBuUGVuWSA9IHkgLSBnbHlwaC0+bUJpdG1hcFRvcCArIGdseXBoLT5tQml0bWFwSGVpZ2h0OworCisgICAgc3RhdGUtPmFwcGVuZE1lc2hRdWFkKG5QZW5YLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1pblUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bUJpdG1hcE1heFUsIGdseXBoLT5tQml0bWFwTWF4ViwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QZW5YICsgKGludClnbHlwaC0+bUJpdG1hcFdpZHRoLCBuUGVuWSAtIChpbnQpZ2x5cGgtPm1CaXRtYXBIZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVLCBnbHlwaC0+bUJpdG1hcE1pblYsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGVuWCwgblBlblkgLSAoaW50KWdseXBoLT5tQml0bWFwSGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tQml0bWFwTWluVSwgZ2x5cGgtPm1CaXRtYXBNaW5WKTsKK30KKwordm9pZCBGb250OjpyZW5kZXJVVEYoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydCwgaW50IG51bUdseXBocywgaW50IHgsIGludCB5KQoreworICAgIGlmKCFtSW5pdGlhbGl6ZWQgfHwgbnVtR2x5cGhzID09IDAgfHwgdGV4dCA9PSBOVUxMIHx8IGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcGVuWCA9IHgsIHBlblkgPSB5OworICAgIGludCBnbHlwaHNMZWZ0ID0gMTsKKyAgICBpZihudW1HbHlwaHMgPiAwKSB7CisgICAgICAgIGdseXBoc0xlZnQgPSBudW1HbHlwaHM7CisgICAgfQorCisgICAgc2l6ZV90IGluZGV4ID0gc3RhcnQ7CisgICAgc2l6ZV90IG5leHRJbmRleCA9IDA7CisKKyAgICB3aGlsZSAoZ2x5cGhzTGVmdCA+IDApIHsKKworICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSB1dGYzMl9hdCh0ZXh0LCBsZW4sIGluZGV4LCAmbmV4dEluZGV4KTsKKworICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBlbmNvdW50ZXJlZAorICAgICAgICBpZih1dGZDaGFyIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgYXJyYXkKKyAgICAgICAgaW5kZXggPSBuZXh0SW5kZXg7CisKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IGdldENhY2hlZFVURkNoYXIodXRmQ2hhcik7CisKKyAgICAgICAgLy8gSWYgaXQncyBzdGlsbCBub3QgdmFsaWQsIHdlIGNvdWxkbid0IGNhY2hlIGl0LCBzbyB3ZSBzaG91bGRuJ3QgZHJhdyBnYXJiYWdlCisgICAgICAgIGlmKGNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICAgICAgZHJhd0NhY2hlZEdseXBoKGNhY2hlZEdseXBoLCBwZW5YLCBwZW5ZKTsKKyAgICAgICAgfQorCisgICAgICAgIHBlblggKz0gKGNhY2hlZEdseXBoLT5tQWR2YW5jZS54ID4+IDYpOworCisgICAgICAgIC8vIElmIHdlIHdlcmUgZ2l2ZW4gYSBzcGVjaWZpYyBudW1iZXIgb2YgZ2x5cGhzLCBkZWNyZW1lbnQKKyAgICAgICAgaWYobnVtR2x5cGhzID4gMCkgeworICAgICAgICAgICAgZ2x5cGhzTGVmdCAtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRVVEZDaGFyKGludDMyX3QgdXRmQ2hhcikgeworCisgICAgQ2FjaGVkR2x5cGhJbmZvICpjYWNoZWRHbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVGb3IoKHVpbnQzMl90KXV0ZkNoYXIpOworICAgIGlmKGNhY2hlZEdseXBoID09IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkR2x5cGggPSBjYWNoZUdseXBoKCh1aW50MzJfdCl1dGZDaGFyKTsKKyAgICB9CisgICAgLy8gSXMgdGhlIGdseXBoIHN0aWxsIGluIHRleHR1cmUgY2FjaGU/CisgICAgaWYoIWNhY2hlZEdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICB1cGRhdGVHbHlwaENhY2hlKGNhY2hlZEdseXBoKTsKKyAgICB9CisKKyAgICByZXR1cm4gY2FjaGVkR2x5cGg7Cit9CisKK3ZvaWQgRm9udDo6dXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKQoreworICAgIEZUX0Vycm9yIGVycm9yID0gRlRfTG9hZF9HbHlwaCggbUZhY2UsIGdseXBoLT5tR2x5cGhJbmRleCwgRlRfTE9BRF9SRU5ERVIgKTsKKyAgICBpZihlcnJvcikgeworICAgICAgICBMT0dFKCJDb3VsZG4ndCBsb2FkIGdseXBoLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2x5cGgtPm1BZHZhbmNlID0gbUZhY2UtPmdseXBoLT5hZHZhbmNlOworICAgIGdseXBoLT5tQml0bWFwTGVmdCA9IG1GYWNlLT5nbHlwaC0+Yml0bWFwX2xlZnQ7CisgICAgZ2x5cGgtPm1CaXRtYXBUb3AgPSBtRmFjZS0+Z2x5cGgtPmJpdG1hcF90b3A7CisKKyAgICBGVF9CaXRtYXAgKmJpdG1hcCA9ICZtRmFjZS0+Z2x5cGgtPmJpdG1hcDsKKworICAgIC8vIE5vdyBjb3B5IHRoZSBiaXRtYXAgaW50byB0aGUgY2FjaGUgdGV4dHVyZQorICAgIHVpbnQzMl90IHN0YXJ0WCA9IDA7CisgICAgdWludDMyX3Qgc3RhcnRZID0gMDsKKworICAgIC8vIExldCB0aGUgZm9udCBzdGF0ZSBmaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCB0aGUgYml0bWFwCisgICAgRm9udFN0YXRlICpzdGF0ZSA9ICZtUlNDLT5tU3RhdGVGb250OworICAgIGdseXBoLT5tSXNWYWxpZCA9IHN0YXRlLT5jYWNoZUJpdG1hcChiaXRtYXAsICZzdGFydFgsICZzdGFydFkpOworCisgICAgaWYoIWdseXBoLT5tSXNWYWxpZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDMyX3QgZW5kWCA9IHN0YXJ0WCArIGJpdG1hcC0+d2lkdGg7CisgICAgdWludDMyX3QgZW5kWSA9IHN0YXJ0WSArIGJpdG1hcC0+cm93czsKKworICAgIGdseXBoLT5tQml0bWFwTWluWCA9IHN0YXJ0WDsKKyAgICBnbHlwaC0+bUJpdG1hcE1pblkgPSBzdGFydFk7CisgICAgZ2x5cGgtPm1CaXRtYXBXaWR0aCA9IGJpdG1hcC0+d2lkdGg7CisgICAgZ2x5cGgtPm1CaXRtYXBIZWlnaHQgPSBiaXRtYXAtPnJvd3M7CisKKyAgICB1aW50MzJfdCBjYWNoZVdpZHRoID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworICAgIHVpbnQzMl90IGNhY2hlSGVpZ2h0ID0gc3RhdGUtPmdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWSgpOworCisgICAgZ2x5cGgtPm1CaXRtYXBNaW5VID0gKGZsb2F0KXN0YXJ0WCAvIChmbG9hdCljYWNoZVdpZHRoOworICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CisgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKKyAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKK30KKworRm9udDo6Q2FjaGVkR2x5cGhJbmZvICpGb250OjpjYWNoZUdseXBoKHVpbnQzMl90IGdseXBoKQoreworICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CisgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKKworICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CisgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7CisKKyAgICB1cGRhdGVHbHlwaENhY2hlKG5ld0dseXBoKTsKKworICAgIHJldHVybiBuZXdHbHlwaDsKK30KKworRm9udCAqIEZvbnQ6OmNyZWF0ZShDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgcnNjLT5tU3RhdGVGb250LmNoZWNrSW5pdCgpOworICAgIFZlY3RvcjxGb250Kj4gJmFjdGl2ZUZvbnRzID0gcnNjLT5tU3RhdGVGb250Lm1BY3RpdmVGb250czsKKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBGb250ICppdGhGb250ID0gYWN0aXZlRm9udHNbaV07CisgICAgICAgIGlmKGl0aEZvbnQtPm1Gb250TmFtZSA9PSBuYW1lICYmIGl0aEZvbnQtPm1Gb250U2l6ZSA9PSBmb250U2l6ZSAmJiBpdGhGb250LT5tRHBpID09IGRwaSkgeworICAgICAgICAgICAgcmV0dXJuIGl0aEZvbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGb250ICpuZXdGb250ID0gbmV3IEZvbnQocnNjKTsKKyAgICBib29sIGlzSW5pdGlhbGl6ZWQgPSBuZXdGb250LT5pbml0KG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgYWN0aXZlRm9udHMucHVzaChuZXdGb250KTsKKyAgICAgICAgcnNjLT5tU3RhdGVGb250LnByZWNhY2hlTGF0aW4obmV3Rm9udCk7CisgICAgICAgIHJldHVybiBuZXdGb250OworICAgIH0KKworICAgIGRlbGV0ZSBuZXdGb250OworICAgIHJldHVybiBOVUxMOworCit9CisKK0ZvbnQ6On5Gb250KCkKK3sKKyAgICBpZihtRmFjZSkgeworICAgICAgICBGVF9Eb25lX0ZhY2UobUZhY2UpOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnNpemUoKTsgY3QrKykgeworICAgICAgICBpZiAobVJTQy0+bVN0YXRlRm9udC5tQWN0aXZlRm9udHNbY3RdID09IHRoaXMpIHsKKyAgICAgICAgICAgIG1SU0MtPm1TdGF0ZUZvbnQubUFjdGl2ZUZvbnRzLnJlbW92ZUF0KGN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlZEdseXBocy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKKyAgICAgICAgZGVsZXRlIGdseXBoOworICAgIH0KK30KKworRm9udFN0YXRlOjpGb250U3RhdGUoKQoreworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1NYXhOdW1iZXJPZlF1YWRzID0gMTAyNDsKKyAgICBtQ3VycmVudFF1YWRJbmRleCA9IDA7CisgICAgbVJTQyA9IE5VTEw7CisgICAgbUxpYnJhcnkgPSBOVUxMOworICAgIHNldEZvbnRDb2xvcigwLjFmLCAwLjFmLCAwLjFmLCAxLjBmKTsKK30KKworRm9udFN0YXRlOjp+Rm9udFN0YXRlKCkKK3sKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKworICAgIHJzQXNzZXJ0KCFtQWN0aXZlRm9udHMuc2l6ZSgpKTsKK30KKworRlRfTGlicmFyeSBGb250U3RhdGU6OmdldExpYigpCit7CisgICAgaWYoIW1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0Vycm9yIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbUxpYnJhcnkpOworICAgICAgICBpZihlcnJvcikgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZnJlZXR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1MaWJyYXJ5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbVJTQyA9IHJzYzsKK30KKwordm9pZCBGb250U3RhdGU6OmZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpCit7CisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUFjdGl2ZUZvbnRzLnNpemUoKTsgaSArKykgeworICAgICAgICBtQWN0aXZlRm9udHNbaV0tPmludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKKyAgICB9CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIG1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbCA9IDA7CisgICAgfQorfQorCitib29sIEZvbnRTdGF0ZTo6Y2FjaGVCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkKK3sKKyAgICAvLyBJZiB0aGUgZ2x5cGggaXMgdG9vIHRhbGwsIGRvbid0IGNhY2hlIGl0CisgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1DYWNoZUxpbmVzW21DYWNoZUxpbmVzLnNpemUoKS0xXS0+bU1heEhlaWdodCkgeworICAgICAgICBMT0dFKCJGb250IHNpemUgdG8gbGFyZ2UgdG8gZml0IGluIGNhY2hlLiB3aWR0aCwgaGVpZ2h0ID0gJWksICVpIiwgKGludCliaXRtYXAtPndpZHRoLCAoaW50KWJpdG1hcC0+cm93cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY29weSB0aGUgYml0bWFwIGludG8gdGhlIGNhY2hlIHRleHR1cmUKKyAgICB1aW50MzJfdCBzdGFydFggPSAwOworICAgIHVpbnQzMl90IHN0YXJ0WSA9IDA7CisKKyAgICBib29sIGJpdG1hcEZpdCA9IGZhbHNlOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICBiaXRtYXBGaXQgPSBtQ2FjaGVMaW5lc1tpXS0+Zml0Qml0bWFwKGJpdG1hcCwgJnN0YXJ0WCwgJnN0YXJ0WSk7CisgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgbmV3IGdseXBoIGRpZG4ndCBmaXQsIGZsdXNoIHRoZSBzdGF0ZSBzbyBmYXIgYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZworICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgZmx1c2hBbGxBbmRJbnZhbGlkYXRlKCk7CisKKyAgICAgICAgLy8gVHJ5IHRvIGZpdCBpdCBhZ2FpbgorICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGJpdG1hcEZpdCA9IG1DYWNoZUxpbmVzW2ldLT5maXRCaXRtYXAoYml0bWFwLCAmc3RhcnRYLCAmc3RhcnRZKTsKKyAgICAgICAgICAgIGlmKGJpdG1hcEZpdCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgZml0LCBzb21ldGhpbmcgaXMgd3JvbmcgYW5kIHdlIHNob3VsZG4ndCBkcmF3CisgICAgICAgIGlmKCFiaXRtYXBGaXQpIHsKKyAgICAgICAgICAgIExPR0UoIkJpdG1hcCBkb2Vzbid0IGZpdCBpbiBjYWNoZS4gd2lkdGgsIGhlaWdodCA9ICVpLCAlaSIsIChpbnQpYml0bWFwLT53aWR0aCwgKGludCliaXRtYXAtPnJvd3MpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKnJldE9yaWdpblggPSBzdGFydFg7CisgICAgKnJldE9yaWdpblkgPSBzdGFydFk7CisKKyAgICB1aW50MzJfdCBlbmRYID0gc3RhcnRYICsgYml0bWFwLT53aWR0aDsKKyAgICB1aW50MzJfdCBlbmRZID0gc3RhcnRZICsgYml0bWFwLT5yb3dzOworCisgICAgdWludDMyX3QgY2FjaGVXaWR0aCA9IGdldENhY2hlVGV4dHVyZVR5cGUoKS0+Z2V0RGltWCgpOworCisgICAgdW5zaWduZWQgY2hhciAqY2FjaGVCdWZmZXIgPSAodW5zaWduZWQgY2hhciopbVRleHRUZXh0dXJlLT5nZXRQdHIoKTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaXRtYXBCdWZmZXIgPSBiaXRtYXAtPmJ1ZmZlcjsKKworICAgIHVpbnQzMl90IGNhY2hlWCA9IDAsIGJYID0gMCwgY2FjaGVZID0gMCwgYlkgPSAwOworICAgIGZvcihjYWNoZVggPSBzdGFydFgsIGJYID0gMDsgY2FjaGVYIDwgZW5kWDsgY2FjaGVYICsrLCBiWCArKykgeworICAgICAgICBmb3IoY2FjaGVZID0gc3RhcnRZLCBiWSA9IDA7IGNhY2hlWSA8IGVuZFk7IGNhY2hlWSArKywgYlkgKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcENvbCA9IGJpdG1hcEJ1ZmZlcltiWSAqIGJpdG1hcC0+d2lkdGggKyBiWF07CisgICAgICAgICAgICBjYWNoZUJ1ZmZlcltjYWNoZVkqY2FjaGVXaWR0aCArIGNhY2hlWF0gPSB0ZW1wQ29sOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyB3aWxsIGRpcnR5IHRoZSB0ZXh0dXJlIGFuZCB0aGUgc2hhZGVyIHNvIG5leHQgdGltZQorICAgIC8vIHdlIGRyYXcgaXQgd2lsbCB1cGxvYWQgdGhlIGRhdGEKKyAgICBtVGV4dFRleHR1cmUtPmRlZmVyZWRVcGxvYWRUb1RleHR1cmUobVJTQywgZmFsc2UsIDApOworICAgIG1Gb250U2hhZGVyRi0+YmluZFRleHR1cmUoMCwgbVRleHRUZXh0dXJlLmdldCgpKTsKKworICAgIC8vIFNvbWUgZGVidWcgY29kZQorICAgIC8qZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhY2hlTGluZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIExPR0UoIkNhY2hlIExpbmU6IEg6ICV1IEVtcHR5IFNwYWNlOiAlZiIsCisgICAgICAgICAgICAgbUNhY2hlTGluZXNbaV0tPm1NYXhIZWlnaHQsCisgICAgICAgICAgICAgICgxLjBmIC0gKGZsb2F0KW1DYWNoZUxpbmVzW2ldLT5tQ3VycmVudENvbC8oZmxvYXQpbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aCkqMTAwLjBmKTsKKworICAgIH0qLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0UmVuZGVyU3RhdGUoKQoreworICAgIHVpbnQzMl90IHRtcFtdID0geworICAgICAgICBSU19URVhfRU5WX01PREVfUkVQTEFDRSwgMSwKKyAgICAgICAgUlNfVEVYX0VOVl9NT0RFX05PTkUsIDAsCisgICAgICAgIDAsIDAKKyAgICB9OworICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KG1SU0MsIHRtcCwgNik7CisgICAgbUZvbnRTaGFkZXJGLnNldChwZik7CisgICAgbUZvbnRTaGFkZXJGLT5pbml0KG1SU0MpOworCisgICAgU2FtcGxlciAqc2FtcGxlciA9IG5ldyBTYW1wbGVyKG1SU0MsIFJTX1NBTVBMRVJfTkVBUkVTVCwgUlNfU0FNUExFUl9ORUFSRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QLCBSU19TQU1QTEVSX0NMQU1QKTsKKyAgICBtRm9udFNhbXBsZXIuc2V0KHNhbXBsZXIpOworICAgIG1Gb250U2hhZGVyRi0+YmluZFNhbXBsZXIoMCwgc2FtcGxlcik7CisKKyAgICBQcm9ncmFtU3RvcmUgKmZvbnRTdG9yZSA9IG5ldyBQcm9ncmFtU3RvcmUobVJTQyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUuc2V0KGZvbnRTdG9yZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoRnVuYyhSU19ERVBUSF9GVU5DX0FMV0FZUyk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldEJsZW5kRnVuYyhSU19CTEVORF9TUkNfU1JDX0FMUEhBLCBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERpdGhlckVuYWJsZShmYWxzZSk7CisgICAgbUZvbnRQcm9ncmFtU3RvcmUtPnNldERlcHRoTWFzayhmYWxzZSk7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppbml0VGV4dFRleHR1cmUoKQoreworICAgIGNvbnN0IEVsZW1lbnQgKmFscGhhRWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzgsIFJTX0tJTkRfUElYRUxfQSwgdHJ1ZSwgMSk7CisKKyAgICAvLyBXZSB3aWxsIGFsbG9jYXRlIGEgdGV4dHVyZSB0byBpbml0aWFsbHkgaG9sZCAzMiBjaGFyYWN0ZXIgYml0bWFwcworICAgIFR5cGUgKnRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB0ZXhUeXBlLT5zZXRFbGVtZW50KGFscGhhRWxlbSk7CisgICAgdGV4VHlwZS0+c2V0RGltWCgxMDI0KTsKKyAgICB0ZXhUeXBlLT5zZXREaW1ZKDI1Nik7CisgICAgdGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqY2FjaGVBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIHRleFR5cGUpOworICAgIG1UZXh0VGV4dHVyZS5zZXQoY2FjaGVBbGxvYyk7CisgICAgbVRleHRUZXh0dXJlLT5kZWZlcmVkVXBsb2FkVG9UZXh0dXJlKG1SU0MsIGZhbHNlLCAwKTsKKworICAgIC8vIFNwbGl0IHVwIG91ciBjYWNoZSB0ZXh0dXJlIGludG8gbGluZXMgb2YgY2VydGFpbiB3aWR0aHMKKyAgICBpbnQgbmV4dExpbmUgPSAwOworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMTYsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDI0LCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSgyNCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUoMzIsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKKyAgICBuZXh0TGluZSArPSBtQ2FjaGVMaW5lcy50b3AoKS0+bU1heEhlaWdodDsKKyAgICBtQ2FjaGVMaW5lcy5wdXNoKG5ldyBDYWNoZVRleHR1cmVMaW5lKDMyLCB0ZXhUeXBlLT5nZXREaW1YKCksIG5leHRMaW5lLCAwKSk7CisgICAgbmV4dExpbmUgKz0gbUNhY2hlTGluZXMudG9wKCktPm1NYXhIZWlnaHQ7CisgICAgbUNhY2hlTGluZXMucHVzaChuZXcgQ2FjaGVUZXh0dXJlTGluZSg0MCwgdGV4VHlwZS0+Z2V0RGltWCgpLCBuZXh0TGluZSwgMCkpOworICAgIG5leHRMaW5lICs9IG1DYWNoZUxpbmVzLnRvcCgpLT5tTWF4SGVpZ2h0OworICAgIG1DYWNoZUxpbmVzLnB1c2gobmV3IENhY2hlVGV4dHVyZUxpbmUodGV4VHlwZS0+Z2V0RGltWSgpIC0gbmV4dExpbmUsIHRleFR5cGUtPmdldERpbVgoKSwgbmV4dExpbmUsIDApKTsKK30KKworLy8gQXZvaWQgaGF2aW5nIHRvIHJlYWxsb2NhdGUgbWVtb3J5IGFuZCByZW5kZXIgcXVhZCBieSBxdWFkCit2b2lkIEZvbnRTdGF0ZTo6aW5pdFZlcnRleEFycmF5QnVmZmVycygpCit7CisgICAgLy8gTm93IGxldHMgd3JpdGUgaW5kZXggZGF0YQorICAgIGNvbnN0IEVsZW1lbnQgKmluZGV4RWxlbSA9IEVsZW1lbnQ6OmNyZWF0ZShtUlNDLCBSU19UWVBFX1VOU0lHTkVEXzE2LCBSU19LSU5EX1VTRVIsIGZhbHNlLCAxKTsKKyAgICBUeXBlICppbmRleFR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB1aW50MzJfdCBudW1JbmRpY2llcyA9IG1NYXhOdW1iZXJPZlF1YWRzICogNjsKKyAgICBpbmRleFR5cGUtPnNldERpbVgobnVtSW5kaWNpZXMpOworICAgIGluZGV4VHlwZS0+c2V0RWxlbWVudChpbmRleEVsZW0pOworICAgIGluZGV4VHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqaW5kZXhBbGxvYyA9IG5ldyBBbGxvY2F0aW9uKG1SU0MsIGluZGV4VHlwZSk7CisgICAgdWludDE2X3QgKmluZGV4UHRyID0gKHVpbnQxNl90KilpbmRleEFsbG9jLT5nZXRQdHIoKTsKKworICAgIC8vIEZvdXIgdmVydHMsIHR3byB0cmlhbmdsZXMgLCBzaXggaW5kaWNlcyBwZXIgcXVhZAorICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhOdW1iZXJPZlF1YWRzOyBpICsrKSB7CisgICAgICAgIGludCBpNiA9IGkgKiA2OworICAgICAgICBpbnQgaTQgPSBpICogNDsKKworICAgICAgICBpbmRleFB0cltpNiArIDBdID0gaTQgKyAwOworICAgICAgICBpbmRleFB0cltpNiArIDFdID0gaTQgKyAxOworICAgICAgICBpbmRleFB0cltpNiArIDJdID0gaTQgKyAyOworCisgICAgICAgIGluZGV4UHRyW2k2ICsgM10gPSBpNCArIDA7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNF0gPSBpNCArIDI7CisgICAgICAgIGluZGV4UHRyW2k2ICsgNV0gPSBpNCArIDM7CisgICAgfQorCisgICAgaW5kZXhBbGxvYy0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KG1SU0MpOworICAgIG1JbmRleEJ1ZmZlci5zZXQoaW5kZXhBbGxvYyk7CisKKyAgICBjb25zdCBFbGVtZW50ICpwb3NFbGVtID0gRWxlbWVudDo6Y3JlYXRlKG1SU0MsIFJTX1RZUEVfRkxPQVRfMzIsIFJTX0tJTkRfVVNFUiwgZmFsc2UsIDMpOworICAgIGNvbnN0IEVsZW1lbnQgKnRleEVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMik7CisKKyAgICBjb25zdCBFbGVtZW50ICplbGVtQXJyYXlbMl07CisgICAgZWxlbUFycmF5WzBdID0gcG9zRWxlbTsKKyAgICBlbGVtQXJyYXlbMV0gPSB0ZXhFbGVtOworCisgICAgU3RyaW5nOCBwb3NOYW1lKCJwb3NpdGlvbiIpOworICAgIFN0cmluZzggdGV4TmFtZSgidGV4dHVyZTAiKTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWVBcnJheVsyXTsKKyAgICBuYW1lQXJyYXlbMF0gPSBwb3NOYW1lLnN0cmluZygpOworICAgIG5hbWVBcnJheVsxXSA9IHRleE5hbWUuc3RyaW5nKCk7CisgICAgc2l6ZV90IGxlbmd0aHNbMl07CisgICAgbGVuZ3Roc1swXSA9IHBvc05hbWUuc2l6ZSgpOworICAgIGxlbmd0aHNbMV0gPSB0ZXhOYW1lLnNpemUoKTsKKyAgICB1aW50MzJfdCBhcnJheVNpemVzWzJdID0gezEsIDF9OworCisgICAgY29uc3QgRWxlbWVudCAqdmVydGV4RGF0YUVsZW0gPSBFbGVtZW50OjpjcmVhdGUobVJTQywgMiwgZWxlbUFycmF5LCBuYW1lQXJyYXksIGxlbmd0aHMsIGFycmF5U2l6ZXMpOworCisgICAgVHlwZSAqdmVydGV4RGF0YVR5cGUgPSBuZXcgVHlwZShtUlNDKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+c2V0RGltWChtTWF4TnVtYmVyT2ZRdWFkcyAqIDQpOworICAgIHZlcnRleERhdGFUeXBlLT5zZXRFbGVtZW50KHZlcnRleERhdGFFbGVtKTsKKyAgICB2ZXJ0ZXhEYXRhVHlwZS0+Y29tcHV0ZSgpOworCisgICAgQWxsb2NhdGlvbiAqdmVydGV4QWxsb2MgPSBuZXcgQWxsb2NhdGlvbihtUlNDLCB2ZXJ0ZXhEYXRhVHlwZSk7CisgICAgbVRleHRNZXNoUHRyID0gKGZsb2F0Kil2ZXJ0ZXhBbGxvYy0+Z2V0UHRyKCk7CisKKyAgICBtVmVydGV4QXJyYXkuc2V0KHZlcnRleEFsbG9jKTsKK30KKworLy8gV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBhbnl0aGluZyB1bmxlc3Mgd2UgYWN0dWFsbHkgZHJhdyB0ZXh0Cit2b2lkIEZvbnRTdGF0ZTo6Y2hlY2tJbml0KCkKK3sKKyAgICBpZihtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluaXRUZXh0VGV4dHVyZSgpOworICAgIGluaXRSZW5kZXJTdGF0ZSgpOworCisgICAgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworCisgICAgLy8gV2Ugc3RvcmUgYSBzdHJpbmcgd2l0aCBsZXR0ZXJzIGluIGEgcm91Z2ggZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UKKyAgICBtTGF0aW5QcmVjYWNoZSA9IFN0cmluZzgoIiBlaXNhcm50b2xjZHVncG1oYnlmdmt3enhqcSIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzgoIkVJU0FSTlRPTENEVUdQTUhCWUZWS1daWEpRIik7CisgICAgbUxhdGluUHJlY2FjaGUgKz0gU3RyaW5nOCgiLC4/ISgpLStAOzpgJyIpOworICAgIG1MYXRpblByZWNhY2hlICs9IFN0cmluZzgoIjAxMjM0NTY3ODkiKTsKKworICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK3ZvaWQgRm9udFN0YXRlOjppc3N1ZURyYXdDb21tYW5kKCkgeworCisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXBWKG1SU0MtPmdldFZlcnRleCgpKTsKKyAgICBtUlNDLT5zZXRWZXJ0ZXgobVJTQy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1SYXN0ZXI+IHRtcFIobVJTQy0+Z2V0UmFzdGVyKCkpOworICAgIG1SU0MtPnNldFJhc3RlcihtUlNDLT5nZXREZWZhdWx0UHJvZ3JhbVJhc3RlcigpKTsKKworICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbUZyYWdtZW50PiB0bXBGKG1SU0MtPmdldEZyYWdtZW50KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50KG1Gb250U2hhZGVyRi5nZXQoKSk7CisKKyAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFByb2dyYW1TdG9yZT4gdG1wUFMobVJTQy0+Z2V0RnJhZ21lbnRTdG9yZSgpKTsKKyAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKG1Gb250UHJvZ3JhbVN0b3JlLmdldCgpKTsKKworICAgIGlmKG1Gb250Q29sb3JEaXJ0eSkgeworICAgICAgICBtRm9udFNoYWRlckYtPnNldENvbnN0YW50Q29sb3IobUZvbnRDb2xvclswXSwgbUZvbnRDb2xvclsxXSwgbUZvbnRDb2xvclsyXSwgbUZvbnRDb2xvclszXSk7CisgICAgICAgIG1Gb250Q29sb3JEaXJ0eSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVJTQy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIG1SU0MtPnNldFZlcnRleCgoUHJvZ3JhbVZlcnRleCAqKXRtcFYuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRSYXN0ZXIoKFByb2dyYW1SYXN0ZXIgKil0bXBSLmdldCgpKTsKKyAgICAgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgICAgICBtUlNDLT5zZXRGcmFnbWVudFN0b3JlKChQcm9ncmFtU3RvcmUgKil0bXBQUy5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCAqdnR4ID0gKGZsb2F0KiltVmVydGV4QXJyYXktPmdldFB0cigpOworICAgIGZsb2F0ICp0ZXggPSB2dHggKyAzOworCisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAzLCAyMCwgZmFsc2UsICh1aW50MzJfdCl2dHgsICJwb3NpdGlvbiIpOworICAgIHZhLmFkZChHTF9GTE9BVCwgMiwgMjAsIGZhbHNlLCAodWludDMyX3QpdGV4LCAidGV4dHVyZTAiKTsKKyAgICB2YS5zZXR1cEdMMihtUlNDLCAmbVJTQy0+bVN0YXRlVmVydGV4QXJyYXksICZtUlNDLT5tU2hhZGVyQ2FjaGUpOworCisgICAgbUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhtUlNDKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBtQ3VycmVudFF1YWRJbmRleCAqIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoMCkpOworCisgICAgLy8gUmVzZXQgdGhlIHN0YXRlCisgICAgbVJTQy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wVi5nZXQoKSk7CisgICAgbVJTQy0+c2V0UmFzdGVyKChQcm9ncmFtUmFzdGVyICopdG1wUi5nZXQoKSk7CisgICAgbVJTQy0+c2V0RnJhZ21lbnQoKFByb2dyYW1GcmFnbWVudCAqKXRtcEYuZ2V0KCkpOworICAgIG1SU0MtPnNldEZyYWdtZW50U3RvcmUoKFByb2dyYW1TdG9yZSAqKXRtcFBTLmdldCgpKTsKK30KKwordm9pZCBGb250U3RhdGU6OmFwcGVuZE1lc2hRdWFkKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTIsIGZsb2F0IHYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTMsIGZsb2F0IHYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIGNvbnN0IHVpbnQzMl90IHZlcnRzUGVyUXVhZCA9IDQ7CisgICAgY29uc3QgdWludDMyX3QgZmxvYXRzUGVyVmVydCA9IDU7CisgICAgZmxvYXQgKmN1cnJlbnRQb3MgPSBtVGV4dE1lc2hQdHIgKyBtQ3VycmVudFF1YWRJbmRleCAqIHZlcnRzUGVyUXVhZCAqIGZsb2F0c1BlclZlcnQ7CisKKyAgICAvLyBDdWxsIHRoaW5ncyB0aGF0IGFyZSBvZmYgdGhlIHNjcmVlbgorICAgIGZsb2F0IHdpZHRoID0gKGZsb2F0KW1SU0MtPmdldFdpZHRoKCk7CisgICAgZmxvYXQgaGVpZ2h0ID0gKGZsb2F0KW1SU0MtPmdldEhlaWdodCgpOworCisgICAgaWYoeDEgPiB3aWR0aCB8fCB5MSA8IDAuMGYgfHwgeDIgPCAwIHx8IHk0ID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKkxPR0UoIlYwIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDEsIHkxLCB6MSk7CisgICAgTE9HRSgiVjEgeDogJWYgeTogJWYgejogJWYiLCB4MiwgeTIsIHoyKTsKKyAgICBMT0dFKCJWMiB4OiAlZiB5OiAlZiB6OiAlZiIsIHgzLCB5MywgejMpOworICAgIExPR0UoIlYzIHg6ICVmIHk6ICVmIHo6ICVmIiwgeDQsIHk0LCB6NCk7Ki8KKworICAgICgqY3VycmVudFBvcysrKSA9IHgxOworICAgICgqY3VycmVudFBvcysrKSA9IHkxOworICAgICgqY3VycmVudFBvcysrKSA9IHoxOworICAgICgqY3VycmVudFBvcysrKSA9IHUxOworICAgICgqY3VycmVudFBvcysrKSA9IHYxOworCisgICAgKCpjdXJyZW50UG9zKyspID0geDI7CisgICAgKCpjdXJyZW50UG9zKyspID0geTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gejI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdTI7CisgICAgKCpjdXJyZW50UG9zKyspID0gdjI7CisKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB4MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB5MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB6MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB1MzsKKyAgICAoKmN1cnJlbnRQb3MrKykgPSB2MzsKKworICAgICgqY3VycmVudFBvcysrKSA9IHg0OworICAgICgqY3VycmVudFBvcysrKSA9IHk0OworICAgICgqY3VycmVudFBvcysrKSA9IHo0OworICAgICgqY3VycmVudFBvcysrKSA9IHU0OworICAgICgqY3VycmVudFBvcysrKSA9IHY0OworCisgICAgbUN1cnJlbnRRdWFkSW5kZXggKys7CisKKyAgICBpZihtQ3VycmVudFF1YWRJbmRleCA9PSBtTWF4TnVtYmVyT2ZRdWFkcykgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3VpbnQzMl90IEZvbnRTdGF0ZTo6Z2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpIHsKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IDA7CisgICAgdWludDMyX3QgdG90YWxQaXhlbHMgPSAwOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZUxpbmVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgcmVtYWluaW5nQ2FwYWNpdHkgKz0gKG1DYWNoZUxpbmVzW2ldLT5tTWF4V2lkdGggLSBtQ2FjaGVMaW5lc1tpXS0+bUN1cnJlbnRDb2wpOworICAgICAgICAgdG90YWxQaXhlbHMgKz0gbUNhY2hlTGluZXNbaV0tPm1NYXhXaWR0aDsKKyAgICB9CisgICAgcmVtYWluaW5nQ2FwYWNpdHkgPSAocmVtYWluaW5nQ2FwYWNpdHkgKiAxMDApIC8gdG90YWxQaXhlbHM7CisgICAgcmV0dXJuIHJlbWFpbmluZ0NhcGFjaXR5OworfQorCit2b2lkIEZvbnRTdGF0ZTo6cHJlY2FjaGVMYXRpbihGb250ICpmb250KSB7CisgICAgLy8gUmVtYWluaW5nIGNhcGFjaXR5IGlzIG1lYXN1cmVkIGluICUKKyAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKKyAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CisgICAgd2hpbGUocmVtYWluaW5nQ2FwYWNpdHkgPiAyNSAmJiBwcmVjYWNoZUlkeCA8IG1MYXRpblByZWNhY2hlLnNpemUoKSkgeworICAgICAgICBmb250LT5nZXRDYWNoZWRVVEZDaGFyKChpbnQzMl90KW1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CisgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworICAgICAgICBwcmVjYWNoZUlkeCArKzsKKyAgICB9Cit9CisKKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBzdGFydEluZGV4LCBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHkpCit7CisgICAgY2hlY2tJbml0KCk7CisKKyAgICAvLyBSZW5kZXIgY29kZSBoZXJlCisgICAgRm9udCAqY3VycmVudEZvbnQgPSBtUlNDLT5nZXRGb250KCk7CisgICAgaWYoIWN1cnJlbnRGb250KSB7CisgICAgICAgIGlmKCFtRGVmYXVsdC5nZXQoKSkgeworICAgICAgICAgICAgbURlZmF1bHQuc2V0KEZvbnQ6OmNyZWF0ZShtUlNDLCAiRHJvaWRTYW5zLnR0ZiIsIDE2LCA5NikpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRGb250ID0gbURlZmF1bHQuZ2V0KCk7CisgICAgfQorICAgIGlmKCFjdXJyZW50Rm9udCkgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBhbnkgZm9udHMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGN1cnJlbnRGb250LT5yZW5kZXJVVEYodGV4dCwgbGVuLCBzdGFydEluZGV4LCBudW1HbHlwaHMsIHgsIHkpOworCisgICAgaWYobUN1cnJlbnRRdWFkSW5kZXggIT0gMCkgeworICAgICAgICBpc3N1ZURyYXdDb21tYW5kKCk7CisgICAgICAgIG1DdXJyZW50UXVhZEluZGV4ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgRm9udFN0YXRlOjpyZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSkKK3sKKyAgICBzaXplX3QgdGV4dExlbiA9IHN0cmxlbih0ZXh0KTsKKyAgICByZW5kZXJUZXh0KHRleHQsIHRleHRMZW4sIDAsIC0xLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZighYWxsb2MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnRleHQgPSAoY29uc3QgY2hhciAqKWFsbG9jLT5nZXRQdHIoKTsKKyAgICBzaXplX3QgYWxsb2NTaXplID0gYWxsb2MtPmdldFR5cGUoKS0+Z2V0U2l6ZUJ5dGVzKCk7CisgICAgcmVuZGVyVGV4dCh0ZXh0LCBhbGxvY1NpemUsIDAsIC0xLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnJlbmRlclRleHQoQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHN0YXJ0LCBpbnQgbGVuLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYoIWFsbG9jKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICp0ZXh0ID0gKGNvbnN0IGNoYXIgKilhbGxvYy0+Z2V0UHRyKCk7CisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IGFsbG9jLT5nZXRUeXBlKCktPmdldFNpemVCeXRlcygpOworICAgIHJlbmRlclRleHQodGV4dCwgYWxsb2NTaXplLCBzdGFydCwgbGVuLCB4LCB5KTsKK30KKwordm9pZCBGb250U3RhdGU6OnNldEZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKSB7CisgICAgbUZvbnRDb2xvclswXSA9IHI7CisgICAgbUZvbnRDb2xvclsxXSA9IGc7CisgICAgbUZvbnRDb2xvclsyXSA9IGI7CisgICAgbUZvbnRDb2xvclszXSA9IGE7CisgICAgbUZvbnRDb2xvckRpcnR5ID0gdHJ1ZTsKK30KKwordm9pZCBGb250U3RhdGU6OmdldEZvbnRDb2xvcihmbG9hdCAqciwgZmxvYXQgKmcsIGZsb2F0ICpiLCBmbG9hdCAqYSkgY29uc3QgeworICAgICpyID0gbUZvbnRDb2xvclswXTsKKyAgICAqZyA9IG1Gb250Q29sb3JbMV07CisgICAgKmIgPSBtRm9udENvbG9yWzJdOworICAgICphID0gbUZvbnRDb2xvclszXTsKK30KKwordm9pZCBGb250U3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCit7CisgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBtSW5kZXhCdWZmZXIuY2xlYXIoKTsKKyAgICBtVmVydGV4QXJyYXkuY2xlYXIoKTsKKworICAgIG1Gb250U2hhZGVyRi5jbGVhcigpOworICAgIG1Gb250U2FtcGxlci5jbGVhcigpOworICAgIG1Gb250UHJvZ3JhbVN0b3JlLmNsZWFyKCk7CisKKyAgICBtVGV4dFRleHR1cmUuY2xlYXIoKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FjaGVMaW5lcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZGVsZXRlIG1DYWNoZUxpbmVzW2ldOworICAgIH0KKyAgICBtQ2FjaGVMaW5lcy5jbGVhcigpOworCisgICAgbURlZmF1bHQuY2xlYXIoKTsKKworICAgIFZlY3RvcjxGb250Kj4gZm9udHNUb0RlcmVmZXJlbmNlID0gbUFjdGl2ZUZvbnRzOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IGZvbnRzVG9EZXJlZmVyZW5jZS5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgZm9udHNUb0RlcmVmZXJlbmNlW2ldLT56ZXJvVXNlclJlZigpOworICAgIH0KKworICAgIGlmKG1MaWJyYXJ5KSB7CisgICAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIG1MaWJyYXJ5ICk7CisgICAgICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyAgICB9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitSc0ZvbnQgcnNpX0ZvbnRDcmVhdGVGcm9tRmlsZShDb250ZXh0ICpyc2MsIGNoYXIgY29uc3QgKm5hbWUsIHVpbnQzMl90IGZvbnRTaXplLCB1aW50MzJfdCBkcGkpCit7CisgICAgRm9udCAqbmV3Rm9udCA9IEZvbnQ6OmNyZWF0ZShyc2MsIG5hbWUsIGZvbnRTaXplLCBkcGkpOworICAgIGlmKG5ld0ZvbnQpIHsKKyAgICAgICAgbmV3Rm9udC0+aW5jVXNlclJlZigpOworICAgIH0KKyAgICByZXR1cm4gbmV3Rm9udDsKK30KKworfSAvLyByZW5kZXJzY3JpcHQKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0ZvbnQuaCBiL2xpYnMvcnMvcnNGb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmZTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNGb250LmgKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfRk9OVF9ICisjZGVmaW5lIEFORFJPSURfUlNfRk9OVF9ICisKKyNpbmNsdWRlICJSZW5kZXJTY3JpcHQuaCIKKyNpbmNsdWRlICJyc1N0cmVhbS5oIgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBGb250U3RhdGU7CisKK2NsYXNzIEZvbnQgOiBwdWJsaWMgT2JqZWN0QmFzZQoreworcHVibGljOgorICAgIH5Gb250KCk7CisKKyAgICAvLyBQb2ludGVyIHRvIHRoZSB1dGYgZGF0YSwgbGVuZ3RoIG9mIGRhdGEsIHdoZXJlIHRvIHN0YXJ0LCBudW1iZXIgb2YgZ2x5cGhzIG90IHJlYWQKKyAgICAvLyAoZWFjaCBnbHlwaCBtYXkgYmUgbG9uZ2VyIHRoYW4gYSBjaGFyIGJlY2F1c2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCB1dGYgZGF0YSkKKyAgICAvLyBMYXN0IHR3byB2YXJpYWJsZXMgYXJlIHRoZSBpbml0aWFsIHBlbiBwb3NpdGlvbgorICAgIHZvaWQgcmVuZGVyVVRGKGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IGxlbiwgdWludDMyX3Qgc3RhcnQsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisKKyAgICAvLyBDdXJyZW50bHkgZmlsZXMgZG8gbm90IGdldCBzZXJpYWxpemVkLAorICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGluaGVyaXQgZnJvbSBPYmplY3RCYXNlIGZvciByZWYgdHJhY2tpbmcKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeworICAgIH0KKyAgICB2aXJ0dWFsIFJzQTNEQ2xhc3NJRCBnZXRDbGFzc0lkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUlNfQTNEX0NMQVNTX0lEX1VOS05PV047CisgICAgfQorCisgICAgc3RhdGljIEZvbnQgKiBjcmVhdGUoQ29udGV4dCAqcnNjLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIEZvbnRTdGF0ZTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVRleHR1cmVDYWNoZSgpOworICAgIHN0cnVjdCBDYWNoZWRHbHlwaEluZm8KKyAgICB7CisgICAgICAgIC8vIEhhcyB0aGUgY2FjaGUgYmVlbiBpbnZhbGlkYXRlZD8KKyAgICAgICAgYm9vbCBtSXNWYWxpZDsKKyAgICAgICAgLy8gTG9jYXRpb24gb2YgdGhlIGNhY2hlZCBnbHlwaCBpbiB0aGUgYml0bWFwCisgICAgICAgIC8vIGluIGNhc2Ugd2UgbmVlZCB0byByZXNpemUgdGhlIHRleHR1cmUKKyAgICAgICAgdWludDMyX3QgbUJpdG1hcE1pblg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBNaW5ZOworICAgICAgICB1aW50MzJfdCBtQml0bWFwV2lkdGg7CisgICAgICAgIHVpbnQzMl90IG1CaXRtYXBIZWlnaHQ7CisgICAgICAgIC8vIEFsc28gY2FjaGUgdGV4dHVyZSBjb29yZHMgZm9yIHRoZSBxdWFkCisgICAgICAgIGZsb2F0IG1CaXRtYXBNaW5VOworICAgICAgICBmbG9hdCBtQml0bWFwTWluVjsKKyAgICAgICAgZmxvYXQgbUJpdG1hcE1heFU7CisgICAgICAgIGZsb2F0IG1CaXRtYXBNYXhWOworICAgICAgICAvLyBNaW5pbWl6ZSBob3cgbXVjaCB3ZSBjYWxsIGZyZWV0eXBlCisgICAgICAgIEZUX1VJbnQgbUdseXBoSW5kZXg7CisgICAgICAgIEZUX1ZlY3RvciBtQWR2YW5jZTsKKyAgICAgICAgLy8gVmFsdWVzIGJlbG93IGNvbnRhaW4gYSBnbHlwaCdzIG9yaWdpbiBpbiB0aGUgYml0bWFwCisgICAgICAgIEZUX0ludCBtQml0bWFwTGVmdDsKKyAgICAgICAgRlRfSW50IG1CaXRtYXBUb3A7CisgICAgfTsKKworICAgIFN0cmluZzggbUZvbnROYW1lOworICAgIHVpbnQzMl90IG1Gb250U2l6ZTsKKyAgICB1aW50MzJfdCBtRHBpOworCisgICAgRm9udChDb250ZXh0ICpyc2MpOworICAgIGJvb2wgaW5pdChjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBmb250U2l6ZSwgdWludDMyX3QgZHBpKTsKKworICAgIEZUX0ZhY2UgbUZhY2U7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtSGFzS2VybmluZzsKKworICAgIERlZmF1bHRLZXllZFZlY3Rvcjx1aW50MzJfdCwgQ2FjaGVkR2x5cGhJbmZvKiA+IG1DYWNoZWRHbHlwaHM7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBnZXRDYWNoZWRVVEZDaGFyKGludDMyX3QgdXRmQ2hhcik7CisKKyAgICBDYWNoZWRHbHlwaEluZm8gKmNhY2hlR2x5cGgodWludDMyX3QgZ2x5cGgpOworICAgIHZvaWQgdXBkYXRlR2x5cGhDYWNoZShDYWNoZWRHbHlwaEluZm8gKmdseXBoKTsKKyAgICB2b2lkIGRyYXdDYWNoZWRHbHlwaChDYWNoZWRHbHlwaEluZm8gKmdseXBoLCBpbnQgeCwgaW50IHkpOworfTsKKworY2xhc3MgRm9udFN0YXRlCit7CitwdWJsaWM6CisgICAgRm9udFN0YXRlKCk7CisgICAgfkZvbnRTdGF0ZSgpOworCisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CisgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKKworICAgIE9iamVjdEJhc2VSZWY8Rm9udD4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxGb250PiBtTGFzdDsKKworICAgIHZvaWQgcmVuZGVyVGV4dChjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0YXJ0SW5kZXgsIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCByZW5kZXJUZXh0KGNvbnN0IGNoYXIgKnRleHQsIGludCB4LCBpbnQgeSk7CisgICAgdm9pZCByZW5kZXJUZXh0KEFsbG9jYXRpb24gKmFsbG9jLCBpbnQgeCwgaW50IHkpOworICAgIHZvaWQgcmVuZGVyVGV4dChBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3Qgc3RhcnQsIGludCBsZW4sIGludCB4LCBpbnQgeSk7CisKKyAgICB2b2lkIHNldEZvbnRDb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKTsKKyAgICB2b2lkIGdldEZvbnRDb2xvcihmbG9hdCAqciwgZmxvYXQgKmcsIGZsb2F0ICpiLCBmbG9hdCAqYSkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKworICAgIGZyaWVuZCBjbGFzcyBGb250OworCisgICAgc3RydWN0IENhY2hlVGV4dHVyZUxpbmUKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG1NYXhIZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IG1NYXhXaWR0aDsKKyAgICAgICAgdWludDMyX3QgbUN1cnJlbnRSb3c7CisgICAgICAgIHVpbnQzMl90IG1DdXJyZW50Q29sOworICAgICAgICBib29sIG1EaXJ0eTsKKworICAgICAgICBDYWNoZVRleHR1cmVMaW5lKHVpbnQzMl90IG1heEhlaWdodCwgdWludDMyX3QgbWF4V2lkdGgsIHVpbnQzMl90IGN1cnJlbnRSb3csIHVpbnQzMl90IGN1cnJlbnRDb2wpIDoKKyAgICAgICAgICAgIG1NYXhIZWlnaHQobWF4SGVpZ2h0KSwgbU1heFdpZHRoKG1heFdpZHRoKSwgbUN1cnJlbnRSb3coY3VycmVudFJvdyksIG1DdXJyZW50Q29sKGN1cnJlbnRDb2wpLAorICAgICAgICAgICAgbURpcnR5KGZhbHNlKSAgeworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBmaXRCaXRtYXAoRlRfQml0bWFwICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSkgeworICAgICAgICAgICAgaWYoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1NYXhIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1DdXJyZW50Q29sICsgKHVpbnQzMl90KWJpdG1hcC0+d2lkdGggPCBtTWF4V2lkdGgpIHsKKyAgICAgICAgICAgICAgICpyZXRPcmlnaW5YID0gbUN1cnJlbnRDb2w7CisgICAgICAgICAgICAgICAqcmV0T3JpZ2luWSA9IG1DdXJyZW50Um93OworICAgICAgICAgICAgICAgbUN1cnJlbnRDb2wgKz0gYml0bWFwLT53aWR0aDsKKyAgICAgICAgICAgICAgIG1EaXJ0eSA9IHRydWU7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIFZlY3RvcjxDYWNoZVRleHR1cmVMaW5lKj4gbUNhY2hlTGluZXM7CisgICAgdWludDMyX3QgZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOworCisgICAgdm9pZCBwcmVjYWNoZUxhdGluKEZvbnQgKmZvbnQpOworICAgIFN0cmluZzggbUxhdGluUHJlY2FjaGU7CisKKyAgICBDb250ZXh0ICptUlNDOworCisgICAgZmxvYXQgbUZvbnRDb2xvcls0XTsKKyAgICBib29sIG1Gb250Q29sb3JEaXJ0eTsKKworICAgIC8vIEZyZWUgdHlwZSBsaWJyYXJ5LCB3ZSBvbmx5IG5lZWQgb25lIGNvcHkKKyAgICBGVF9MaWJyYXJ5IG1MaWJyYXJ5OworICAgIEZUX0xpYnJhcnkgZ2V0TGliKCk7CisgICAgVmVjdG9yPEZvbnQqPiBtQWN0aXZlRm9udHM7CisKKyAgICAvLyBSZW5kZXIgc3RhdGUgZm9yIHRoZSBmb250CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1Gb250U2hhZGVyRjsKKyAgICBPYmplY3RCYXNlUmVmPFNhbXBsZXI+IG1Gb250U2FtcGxlcjsKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZvbnRQcm9ncmFtU3RvcmU7CisgICAgdm9pZCBpbml0UmVuZGVyU3RhdGUoKTsKKworICAgIC8vIFRleHR1cmUgdG8gY2FjaGUgZ2x5cGggYml0bWFwcworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVRleHRUZXh0dXJlOworICAgIHZvaWQgaW5pdFRleHRUZXh0dXJlKCk7CisKKyAgICBib29sIGNhY2hlQml0bWFwKEZUX0JpdG1hcCAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpOworICAgIGNvbnN0IFR5cGUqIGdldENhY2hlVGV4dHVyZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVGV4dFRleHR1cmUtPmdldFR5cGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoQWxsQW5kSW52YWxpZGF0ZSgpOworCisgICAgLy8gUG9pbnRlciB0byB2ZXJ0ZXggZGF0YSB0byBzcGVlZCB1cCBmcmFtZSB0byBmcmFtZSB3b3JrCisgICAgZmxvYXQgKm1UZXh0TWVzaFB0cjsKKyAgICB1aW50MzJfdCBtQ3VycmVudFF1YWRJbmRleDsKKyAgICB1aW50MzJfdCBtTWF4TnVtYmVyT2ZRdWFkczsKKworICAgIHZvaWQgaW5pdFZlcnRleEFycmF5QnVmZmVycygpOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbUluZGV4QnVmZmVyOworICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbVZlcnRleEFycmF5OworCisKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKworICAgIHZvaWQgY2hlY2tJbml0KCk7CisKKyAgICB2b2lkIGlzc3VlRHJhd0NvbW1hbmQoKTsKKworICAgIHZvaWQgYXBwZW5kTWVzaFF1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MiwgZmxvYXQgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUzLCBmbG9hdCB2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KTsKKworfTsKKworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0hhbmRjb2RlLmggYi9saWJzL3JzL3JzSGFuZGNvZGUuaAppbmRleCA4MDBlZGRkLi5jMDJmZDQyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzSGFuZGNvZGUuaAorKysgYi9saWJzL3JzL3JzSGFuZGNvZGUuaApAQCAtMSw2ICsxLDU3IEBACiAKICNkZWZpbmUgREFUQV9TWU5DX1NJWkUgMTAyNAogCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9Db250ZXh0RmluaXNoIChSc0NvbnRleHQgcnNjKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfQ29udGV4dEZpbmlzaCk7CisgICAgUlNfQ01EX0NvbnRleHRGaW5pc2ggKmNtZCA9IHN0YXRpY19jYXN0PFJTX0NNRF9Db250ZXh0RmluaXNoICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGlvLT5tVG9Db3JlLmNvbW1pdFN5bmMoUlNfQ01EX0lEX0NvbnRleHRGaW5pc2gsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnNIQ0FQSV9TY3JpcHRJbnZva2VWIChSc0NvbnRleHQgcnNjLCBSc1NjcmlwdCB2YSwgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykKK3sKKyAgICBUaHJlYWRJTyAqaW8gPSAmKChDb250ZXh0ICopcnNjKS0+bUlPOworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoUlNfQ01EX1NjcmlwdEludm9rZVYpOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBzaXplICs9IChzaXplQnl0ZXMgKyAzKSAmIH4zOworICAgIH0KKyAgICBSU19DTURfU2NyaXB0SW52b2tlViAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX1NjcmlwdEludm9rZVYgKj4oaW8tPm1Ub0NvcmUucmVzZXJ2ZShzaXplKSk7CisgICAgY21kLT5zID0gdmE7CisgICAgY21kLT5zbG90ID0gc2xvdDsKKyAgICBjbWQtPmRhdGFMZW4gPSBzaXplQnl0ZXM7CisgICAgY21kLT5kYXRhID0gZGF0YTsKKyAgICBpZiAoc2l6ZUJ5dGVzIDwgREFUQV9TWU5DX1NJWkUpIHsKKyAgICAgICAgY21kLT5kYXRhID0gKHZvaWQgKikoY21kKzEpOworICAgICAgICBtZW1jcHkoY21kKzEsIGRhdGEsIHNpemVCeXRlcyk7CisgICAgICAgIGlvLT5tVG9Db3JlLmNvbW1pdChSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0U3luYyhSU19DTURfSURfU2NyaXB0SW52b2tlViwgc2l6ZSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX1NjcmlwdFNldFZhclYgKFJzQ29udGV4dCByc2MsIFJzU2NyaXB0IHZhLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICogZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKQoreworICAgIFRocmVhZElPICppbyA9ICYoKENvbnRleHQgKilyc2MpLT5tSU87CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihSU19DTURfU2NyaXB0U2V0VmFyVik7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9TY3JpcHRTZXRWYXJWICpjbWQgPSBzdGF0aWNfY2FzdDxSU19DTURfU2NyaXB0U2V0VmFyViAqPihpby0+bVRvQ29yZS5yZXNlcnZlKHNpemUpKTsKKyAgICBjbWQtPnMgPSB2YTsKKyAgICBjbWQtPnNsb3QgPSBzbG90OworICAgIGNtZC0+ZGF0YUxlbiA9IHNpemVCeXRlczsKKyAgICBjbWQtPmRhdGEgPSBkYXRhOworICAgIGlmIChzaXplQnl0ZXMgPCBEQVRBX1NZTkNfU0laRSkgeworICAgICAgICBjbWQtPmRhdGEgPSAodm9pZCAqKShjbWQrMSk7CisgICAgICAgIG1lbWNweShjbWQrMSwgZGF0YSwgc2l6ZUJ5dGVzKTsKKyAgICAgICAgaW8tPm1Ub0NvcmUuY29tbWl0KFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9TY3JpcHRTZXRWYXJWLCBzaXplKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByc0hDQVBJX0FsbG9jYXRpb25EYXRhIChSc0NvbnRleHQgcnNjLCBSc0FsbG9jYXRpb24gdmEsIGNvbnN0IHZvaWQgKiBkYXRhLCB1aW50MzJfdCBzaXplQnl0ZXMpCiB7CiAgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKQEAgLTQ1LDMgKzk2LDI2IEBACiAKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJzSENBUElfQWxsb2NhdGlvbjFEU3ViRWxlbWVudERhdGEgKFJzQ29udGV4dCByc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgY29uc3Qgdm9pZCAqIGRhdGEsIHVpbnQzMl90IGNvbXBfb2Zmc2V0LCB1aW50MzJfdCBzaXplQnl0ZXMpCit7CisgICAgVGhyZWFkSU8gKmlvID0gJigoQ29udGV4dCAqKXJzYyktPm1JTzsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSk7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIHNpemUgKz0gKHNpemVCeXRlcyArIDMpICYgfjM7CisgICAgfQorICAgIFJTX0NNRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSAqY21kID0gc3RhdGljX2Nhc3Q8UlNfQ01EX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhICo+KGlvLT5tVG9Db3JlLnJlc2VydmUoc2l6ZSkpOworICAgIGNtZC0+dmEgPSB2YTsKKyAgICBjbWQtPnggPSB4OworICAgIGNtZC0+ZGF0YSA9IGRhdGE7CisgICAgY21kLT5jb21wX29mZnNldCA9IGNvbXBfb2Zmc2V0OworICAgIGNtZC0+Ynl0ZXMgPSBzaXplQnl0ZXM7CisgICAgaWYgKHNpemVCeXRlcyA8IERBVEFfU1lOQ19TSVpFKSB7CisgICAgICAgIGNtZC0+ZGF0YSA9ICh2b2lkICopKGNtZCsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCsxLCBkYXRhLCBzaXplQnl0ZXMpOworICAgICAgICBpby0+bVRvQ29yZS5jb21taXQoUlNfQ01EX0lEX0FsbG9jYXRpb24xRFN1YkVsZW1lbnREYXRhLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpby0+bVRvQ29yZS5jb21taXRTeW5jKFJTX0NNRF9JRF9BbGxvY2F0aW9uMURTdWJFbGVtZW50RGF0YSwgc2l6ZSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNMaWdodC5jcHAgYi9saWJzL3JzL3JzTGlnaHQuY3BwCmluZGV4IDZmMmNmM2UuLmVhYjlhMDcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMaWdodC5jcHAKKysrIGIvbGlicy9ycy9yc0xpZ2h0LmNwcApAQCAtMTQsOSArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC02NSw2ICs2OSwxNiBAQAogICAgIGdsTGlnaHRmdihHTF9MSUdIVDAgKyBudW0sIEdMX1BPU0lUSU9OLCBtUG9zaXRpb24pOwogfQogCit2b2lkIExpZ2h0OjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIAorfQorCitMaWdodCAqTGlnaHQ6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIExpZ2h0U3RhdGU6OkxpZ2h0U3RhdGUoKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0xpZ2h0LmggYi9saWJzL3JzL3JzTGlnaHQuaAppbmRleCBkODc5NmU2Li5iZDU4OTc5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTGlnaHQuaAorKysgYi9saWJzL3JzL3JzTGlnaHQuaApAQCAtMzcsNiArMzcsOSBAQAogICAgIHZvaWQgc2V0Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik7CiAKICAgICB2b2lkIHNldHVwR0wodWludDMyX3QgbnVtKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9MSUdIVDsgfQorICAgIHN0YXRpYyBMaWdodCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICBmbG9hdCBtQ29sb3JbNF07CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmNwcCBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCmluZGV4IGM3OTY1MjAuLjAxOWVhNzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CiAKIExvY2tsZXNzQ29tbWFuZEZpZm86OkxvY2tsZXNzQ29tbWFuZEZpZm8oKQogewpAQCAtMTI4LDE1ICsxMjgsMTkgQEAKICAgICAvL2R1bXBTdGF0ZSgiZmx1c2ggMiIpOwogfQogCit2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OndhaXQoKQoreworICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKKyAgICAgICAgbVNpZ25hbFRvQ29udHJvbC5zZXQoKTsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLndhaXQoKTsKKyAgICB9Cit9CisKIGNvbnN0IHZvaWQgKiBMb2NrbGVzc0NvbW1hbmRGaWZvOjpnZXQodWludDMyX3QgKmNvbW1hbmQsIHVpbnQzMl90ICpieXRlc0RhdGEpCiB7CiAgICAgd2hpbGUoMSkgewogICAgICAgICAvL2R1bXBTdGF0ZSgiZ2V0Iik7Ci0gICAgICAgIHdoaWxlKGlzRW1wdHkoKSAmJiAhbUluU2h1dGRvd24pIHsKLSAgICAgICAgICAgIG1TaWduYWxUb0NvbnRyb2wuc2V0KCk7Ci0gICAgICAgICAgICBtU2lnbmFsVG9Xb3JrZXIud2FpdCgpOwotICAgICAgICB9Ci0KKyAgICAgICAgd2FpdCgpOwogICAgICAgICBpZiAobUluU2h1dGRvd24pIHsKICAgICAgICAgICAgICpjb21tYW5kID0gMDsKICAgICAgICAgICAgICpieXRlc0RhdGEgPSAwOwpAQCAtMTY1LDYgKzE2OSwzMCBAQAogICAgIC8vZHVtcFN0YXRlKCJuZXh0Iik7CiB9CiAKK2Jvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6bWFrZVNwYWNlTm9uQmxvY2tpbmcodWludDMyX3QgYnl0ZXMpCit7CisgICAgLy9kdW1wU3RhdGUoIm1ha2Ugc3BhY2Ugbm9uLWJsb2NraW5nIik7CisgICAgaWYgKChtUHV0K2J5dGVzKSA+IG1FbmQpIHsKKyAgICAgICAgLy8gTmVlZCB0byBsb29wIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgZ2V0IGlzLgorICAgICAgICBpZigobUdldCA+IG1QdXQpICYmIChtQnVmZmVyKzQgPj0gbUdldCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRvc3MgaW4gYSByZXNldCB0aGVuIHRoZSBub3JtYWwgd2FpdCBmb3Igc3BhY2Ugd2lsbCBkbyB0aGUgcmVzdC4KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCAqPihtUHV0KVswXSA9IDA7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMV0gPSAwOworICAgICAgICBtUHV0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbVNpZ25hbFRvV29ya2VyLnNldCgpOworICAgIH0KKworICAgIC8vIGl0IHdpbGwgZml0IGhlcmUgc28gd2UganVzdCBuZWVkIHRvIHdhaXQgZm9yIHNwYWNlLgorICAgIGlmKGdldEZyZWVTcGFjZSgpIDwgYnl0ZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86Om1ha2VTcGFjZSh1aW50MzJfdCBieXRlcykKIHsKICAgICAvL2R1bXBTdGF0ZSgibWFrZSBzcGFjZSIpOwpAQCAtMTc4LDYgKzIwNiw3IEBACiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4obVB1dClbMF0gPSAwOwogICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQxNl90ICo+KG1QdXQpWzFdID0gMDsKICAgICAgICAgbVB1dCA9IG1CdWZmZXI7CisgICAgICAgIG1TaWduYWxUb1dvcmtlci5zZXQoKTsKICAgICB9CiAKICAgICAvLyBpdCB3aWxsIGZpdCBoZXJlIHNvIHdlIGp1c3QgbmVlZCB0byB3YWl0IGZvciBzcGFjZS4KQEAgLTE4OSw4MiArMjE4LDYgQEAKIAogdm9pZCBMb2NrbGVzc0NvbW1hbmRGaWZvOjpkdW1wU3RhdGUoY29uc3QgY2hhciAqcykgY29uc3QKIHsKLSAgICBMT0dWKCIlcyAgcHV0ICVwLCBnZXQgJXAsICBidWYgJXAsICBlbmQgJXAiLCBzLCBtUHV0LCBtR2V0LCBtQnVmZmVyLCBtRW5kKTsKLX0KLQotTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpTaWduYWwoKQotewotICAgIG1TZXQgPSB0cnVlOwotfQotCi1Mb2NrbGVzc0NvbW1hbmRGaWZvOjpTaWduYWw6On5TaWduYWwoKQotewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmRpdGlvbik7Ci19Ci0KLWJvb2wgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjppbml0KCkKLXsKLSAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIG11dGV4IGluaXQgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoJm1Db25kaXRpb24sIE5VTEwpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NGaWZvIGNvbmRpdGlvbiBpbml0IGZhaWx1cmUiKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTG9ja2xlc3NDb21tYW5kRmlmbzo6U2lnbmFsOjpzZXQoKQotewotICAgIGludCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBsb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU2V0ID0gdHJ1ZTsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kaXRpb24pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgb24gc2V0IGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIExvY2tsZXNzQ29tbWFuZEZpZm86OlNpZ25hbDo6d2FpdCgpCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIGNvbmRpdGlvbi4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtU2V0KSB7Ci0gICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZtQ29uZGl0aW9uLCAmbU11dGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgd2FpdGluZyBvbiBjb25kaXRpb24uIiwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtU2V0ID0gZmFsc2U7Ci0KLSAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIHVubG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7Ci0gICAgfQorICAgIExPR1YoIiVzICVwICBwdXQgJXAsIGdldCAlcCwgIGJ1ZiAlcCwgIGVuZCAlcCIsIHMsIHRoaXMsIG1QdXQsIG1HZXQsIG1CdWZmZXIsIG1FbmQpOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmggYi9saWJzL3JzL3JzTG9ja2xlc3NGaWZvLmgKaW5kZXggZDBhNDM1Ni4uYjhjZWVlZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0xvY2tsZXNzRmlmby5oCisrKyBiL2xpYnMvcnMvcnNMb2NrbGVzc0ZpZm8uaApAQCAtMTksOCArMTksMTAgQEAKIAogCiAjaW5jbHVkZSAicnNVdGlscy5oIgorI2luY2x1ZGUgInJzU2lnbmFsLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiAKIC8vIEEgc2ltcGxlIEZJRk8gdG8gYmUgdXNlZCBhcyBhIHByb2R1Y2VyIC8gY29uc3VtZXIgYmV0d2VlbiB0d28KQEAgLTM3LDI0ICszOSw3IEBACiAgICAgTG9ja2xlc3NDb21tYW5kRmlmbygpOwogICAgIH5Mb2NrbGVzc0NvbW1hbmRGaWZvKCk7CiAKLQogcHJvdGVjdGVkOgotICAgIGNsYXNzIFNpZ25hbCB7Ci0gICAgcHVibGljOgotICAgICAgICBTaWduYWwoKTsKLSAgICAgICAgflNpZ25hbCgpOwotCi0gICAgICAgIGJvb2wgaW5pdCgpOwotCi0gICAgICAgIHZvaWQgc2V0KCk7Ci0gICAgICAgIHZvaWQgd2FpdCgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBib29sIG1TZXQ7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0gICAgICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Ci0gICAgfTsKLQogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtUHV0OwogICAgIHVpbnQ4X3QgKiB2b2xhdGlsZSBtR2V0OwogICAgIHVpbnQ4X3QgKiBtQnVmZmVyOwpAQCAtNjUsMTggKzUwLDE5IEBACiAgICAgU2lnbmFsIG1TaWduYWxUb1dvcmtlcjsKICAgICBTaWduYWwgbVNpZ25hbFRvQ29udHJvbDsKIAotCi0KIHB1YmxpYzoKICAgICB2b2lkICogcmVzZXJ2ZSh1aW50MzJfdCBieXRlcyk7CiAgICAgdm9pZCBjb21taXQodWludDMyX3QgY29tbWFuZCwgdWludDMyX3QgYnl0ZXMpOwogICAgIHZvaWQgY29tbWl0U3luYyh1aW50MzJfdCBjb21tYW5kLCB1aW50MzJfdCBieXRlcyk7CiAKICAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCB3YWl0KCk7CisKICAgICBjb25zdCB2b2lkICogZ2V0KHVpbnQzMl90ICpjb21tYW5kLCB1aW50MzJfdCAqYnl0ZXNEYXRhKTsKICAgICB2b2lkIG5leHQoKTsKIAogICAgIHZvaWQgbWFrZVNwYWNlKHVpbnQzMl90IGJ5dGVzKTsKKyAgICBib29sIG1ha2VTcGFjZU5vbkJsb2NraW5nKHVpbnQzMl90IGJ5dGVzKTsKIAogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldEZyZWVTcGFjZSgpIGNvbnN0OwpAQCAtODgsNCArNzQsNSBAQAogCiAKIH0KK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01hdHJpeC5jcHAgYi9saWJzL3JzL3JzTWF0cml4LmNwcAppbmRleCAyZjIxNDA1Li45NGVlZjEzIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWF0cml4LmNwcAorKysgYi9saWJzL3JzL3JzTWF0cml4LmNwcApAQCAtNzMsNyArNzMsNyBAQAogICAgIHMgPSBzaW5mKHJvdCk7CiAKICAgICBjb25zdCBmbG9hdCBsZW4gPSBzcXJ0Zih4KnggKyB5KnkgKyB6KnopOwotICAgIGlmICghKGxlbiAhPSAxKSkgeworICAgIGlmIChsZW4gIT0gMSkgewogICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIGxlbjsKICAgICAgICAgeCAqPSByZWNpcExlbjsKICAgICAgICAgeSAqPSByZWNpcExlbjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNNZXNoLmNwcCBiL2xpYnMvcnMvcnNNZXNoLmNwcAppbmRleCBkNTk1YjRlLi44MTBlNGZmIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzTWVzaC5jcHAKKysrIGIvbGlicy9ycy9yc01lc2guY3BwCkBAIC0xNCwyOCArMTQsMjU4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKIAorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgInJzQ29udGV4dEhvc3RTdHViLmgiCisKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZgorCisKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KIE1lc2g6Ok1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQogewogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbVZlcnRpY2llcyA9IE5VTEw7Ci0gICAgbVZlcnRpY2llc0NvdW50ID0gMDsKICAgICBtUHJpbWl0aXZlcyA9IE5VTEw7CiAgICAgbVByaW1pdGl2ZXNDb3VudCA9IDA7CisgICAgbVZlcnRleEJ1ZmZlcnMgPSBOVUxMOworICAgIG1WZXJ0ZXhCdWZmZXJDb3VudCA9IDA7CiB9CiAKIE1lc2g6On5NZXNoKCkKIHsKKyAgICBpZihtVmVydGV4QnVmZmVycykgeworICAgICAgICBkZWxldGVbXSBtVmVydGV4QnVmZmVyczsKKyAgICB9CisKKyAgICBpZihtUHJpbWl0aXZlcykgeworICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBtUHJpbWl0aXZlc0NvdW50OyBpICsrKSB7CisgICAgICAgICAgICBkZWxldGUgbVByaW1pdGl2ZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gbVByaW1pdGl2ZXM7CisgICAgfQogfQogCit2b2lkIE1lc2g6OnJlbmRlcihDb250ZXh0ICpyc2MpIGNvbnN0Cit7CisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBtUHJpbWl0aXZlc0NvdW50OyBjdCArKykgeworICAgICAgICByZW5kZXJQcmltaXRpdmUocnNjLCBjdCk7CisgICAgfQorfQorCit2b2lkIE1lc2g6OnJlbmRlclByaW1pdGl2ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCkgY29uc3QgeworICAgIGlmIChwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHByaW1pdGl2ZSBpbmRleCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworCisgICAgaWYgKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgcHJpbS0+bUluZGV4QnVmZmVyLT5nZXRUeXBlKCktPmdldERpbVgoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgMCwgbVZlcnRleEJ1ZmZlcnNbMF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpKTsKK30KKwordm9pZCBNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKK3sKKyAgICBpZiAobGVuIDwgMSB8fCBwcmltSW5kZXggPj0gbVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAxIik7CisgICAgVmVydGV4QXJyYXkgdmE7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QrKykgeworICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPnVwbG9hZENoZWNrKHJzYyk7CisgICAgICAgIGlmIChtVmVydGV4QnVmZmVyc1tjdF0tPmdldElzQnVmZmVyT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0UHRyKCkpOworICAgICAgICB9CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0VHlwZSgpLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOworICAgIH0KKyAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOworCisgICAgcnNjLT5jaGVja0Vycm9yKCJNZXNoOjpyZW5kZXJQcmltaXRpdmVSYW5nZSAyIik7CisgICAgUHJpbWl0aXZlX3QgKnByaW0gPSBtUHJpbWl0aXZlc1twcmltSW5kZXhdOworICAgIGlmIChwcmltLT5tSW5kZXhCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcHJpbS0+bUluZGV4QnVmZmVyLT51cGxvYWRDaGVjayhyc2MpOworICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHByaW0tPm1JbmRleEJ1ZmZlci0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKHByaW0tPm1HTFByaW1pdGl2ZSwgbGVuLCBHTF9VTlNJR05FRF9TSE9SVCwgKHVpbnQxNl90ICopKHN0YXJ0ICogMikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhwcmltLT5tR0xQcmltaXRpdmUsIHN0YXJ0LCBsZW4pOworICAgIH0KKworICAgIHJzYy0+Y2hlY2tFcnJvcigiTWVzaDo6cmVuZGVyUHJpbWl0aXZlUmFuZ2UiKTsKK30KKworCit2b2lkIE1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCit7CisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVZlcnRleEJ1ZmZlckNvdW50OyBjdCArKykgeworICAgICAgICBpZiAobVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpKSB7CisgICAgICAgICAgICBtVmVydGV4QnVmZmVyc1tjdF0tPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbVByaW1pdGl2ZXNDb3VudDsgY3QgKyspIHsKKyAgICAgICAgaWYgKG1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBtUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByc2MtPmNoZWNrRXJyb3IoIk1lc2g6OnVwbG9hZEFsbCIpOworfQorCit2b2lkIE1lc2g6OnVwZGF0ZUdMUHJpbWl0aXZlcygpCit7CisgICAgZm9yKHVpbnQzMl90IGkgPSAwOyBpIDwgbVByaW1pdGl2ZXNDb3VudDsgaSArKykgeworICAgICAgICBzd2l0Y2gobVByaW1pdGl2ZXNbaV0tPm1QcmltaXRpdmUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1BPSU5UOiAgICAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfUE9JTlRTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX0xJTkU6ICAgICAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfTElORVM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FX1NUUklQOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFOiAgICAgICBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVTOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNfUFJJTUlUSVZFX1RSSUFOR0xFX1NUUklQOiBtUHJpbWl0aXZlc1tpXS0+bUdMUHJpbWl0aXZlID0gR0xfVFJJQU5HTEVfU1RSSVA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIG1QcmltaXRpdmVzW2ldLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9GQU47IGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lc2g6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisgICAgLy8gTmVlZCB0byBpZGVudGlmeSBvdXJzZWx2ZXMKKyAgICBzdHJlYW0tPmFkZFUzMigodWludDMyX3QpZ2V0Q2xhc3NJZCgpKTsKKworICAgIFN0cmluZzggbmFtZShnZXROYW1lKCkpOworICAgIHN0cmVhbS0+YWRkU3RyaW5nKCZuYW1lKTsKKworICAgIC8vIFN0b3JlIG51bWJlciBvZiB2ZXJ0ZXggc3RyZWFtcworICAgIHN0cmVhbS0+YWRkVTMyKG1WZXJ0ZXhCdWZmZXJDb3VudCk7CisgICAgZm9yKHVpbnQzMl90IHZDb3VudCA9IDA7IHZDb3VudCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgdkNvdW50ICsrKSB7CisgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW3ZDb3VudF0tPnNlcmlhbGl6ZShzdHJlYW0pOworICAgIH0KKworICAgIHN0cmVhbS0+YWRkVTMyKG1QcmltaXRpdmVzQ291bnQpOworICAgIC8vIFN0b3JlIHRoZSBwcmltaXRpdmVzCisgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgUHJpbWl0aXZlX3QgKiBwcmltID0gbVByaW1pdGl2ZXNbcENvdW50XTsKKworICAgICAgICBzdHJlYW0tPmFkZFU4KCh1aW50OF90KXByaW0tPm1QcmltaXRpdmUpOworCisgICAgICAgIGlmKHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKSkgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMzIoMSk7CisgICAgICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXItPnNlcmlhbGl6ZShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RyZWFtLT5hZGRVMzIoMCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK01lc2ggKk1lc2g6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9NRVNIKSB7CisgICAgICAgIExPR0UoIm1lc2ggbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1lc2ggKiBtZXNoID0gbmV3IE1lc2gocnNjKTsKKworICAgIFN0cmluZzggbmFtZTsKKyAgICBzdHJlYW0tPmxvYWRTdHJpbmcoJm5hbWUpOworICAgIG1lc2gtPnNldE5hbWUobmFtZS5zdHJpbmcoKSwgbmFtZS5zaXplKCkpOworCisgICAgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50KSB7CisgICAgICAgIG1lc2gtPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50XTsKKworICAgICAgICBmb3IodWludDMyX3QgdkNvdW50ID0gMDsgdkNvdW50IDwgbWVzaC0+bVZlcnRleEJ1ZmZlckNvdW50OyB2Q291bnQgKyspIHsKKyAgICAgICAgICAgIEFsbG9jYXRpb24gKnZlcnRleEFsbG9jID0gQWxsb2NhdGlvbjo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgICAgICAgICBtZXNoLT5tVmVydGV4QnVmZmVyc1t2Q291bnRdLnNldCh2ZXJ0ZXhBbGxvYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZXNoLT5tUHJpbWl0aXZlc0NvdW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgaWYobWVzaC0+bVByaW1pdGl2ZXNDb3VudCkgeworICAgICAgICBtZXNoLT5tUHJpbWl0aXZlcyA9IG5ldyBQcmltaXRpdmVfdCAqW21lc2gtPm1QcmltaXRpdmVzQ291bnRdOworCisgICAgICAgIC8vIGxvYWQgYWxsIHByaW1pdGl2ZXMKKyAgICAgICAgZm9yICh1aW50MzJfdCBwQ291bnQgPSAwOyBwQ291bnQgPCBtZXNoLT5tUHJpbWl0aXZlc0NvdW50OyBwQ291bnQgKyspIHsKKyAgICAgICAgICAgIFByaW1pdGl2ZV90ICogcHJpbSA9IG5ldyBQcmltaXRpdmVfdDsKKyAgICAgICAgICAgIG1lc2gtPm1QcmltaXRpdmVzW3BDb3VudF0gPSBwcmltOworCisgICAgICAgICAgICBwcmltLT5tUHJpbWl0aXZlID0gKFJzUHJpbWl0aXZlKXN0cmVhbS0+bG9hZFU4KCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5kZXggYnVmZmVyIHdhcyBzdG9yZWQKKyAgICAgICAgICAgIHVpbnQzMl90IGlzSW5kZXhQcmVzZW50ID0gc3RyZWFtLT5sb2FkVTMyKCk7CisgICAgICAgICAgICBpZihpc0luZGV4UHJlc2VudCkgeworICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKmluZGV4QWxsb2MgPSBBbGxvY2F0aW9uOjpjcmVhdGVGcm9tU3RyZWFtKHJzYywgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBwcmltLT5tSW5kZXhCdWZmZXIuc2V0KGluZGV4QWxsb2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWVzaC0+dXBkYXRlR0xQcmltaXRpdmVzKCk7CisgICAgbWVzaC0+dXBsb2FkQWxsKHJzYyk7CisKKyAgICByZXR1cm4gbWVzaDsKK30KKwordm9pZCBNZXNoOjpjb21wdXRlQkJveCgpIHsKKyAgICBmbG9hdCAqcG9zUHRyID0gTlVMTDsKKyAgICB1aW50MzJfdCB2ZWN0b3JTaXplID0gMDsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSAwOworICAgIHVpbnQzMl90IG51bVZlcnRzID0gMDsKKyAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBvc2l0aW9uIHB0ciBhbmQgc3RyaWRlCisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhCdWZmZXJDb3VudDsgY3QrKykgeworICAgICAgICBjb25zdCBUeXBlICpidWZmZXJUeXBlID0gbVZlcnRleEJ1ZmZlcnNbY3RdLT5nZXRUeXBlKCk7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmJ1ZmZlckVsZW0gPSBidWZmZXJUeXBlLT5nZXRFbGVtZW50KCk7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IGJ1ZmZlckVsZW0tPmdldEZpZWxkQ291bnQoKTsgY3QrKykgeworICAgICAgICAgICAgaWYoc3RyY21wKGJ1ZmZlckVsZW0tPmdldEZpZWxkTmFtZShjdCksICJwb3NpdGlvbiIpID09IDApIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3JTaXplID0gYnVmZmVyRWxlbS0+Z2V0RmllbGQoY3QpLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCk7CisgICAgICAgICAgICAgICAgc3RyaWRlID0gYnVmZmVyRWxlbS0+Z2V0U2l6ZUJ5dGVzKCkgLyBzaXplb2YoZmxvYXQpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGJ1ZmZlckVsZW0tPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOworICAgICAgICAgICAgICAgIHBvc1B0ciA9IChmbG9hdCopKCh1aW50OF90KiltVmVydGV4QnVmZmVyc1tjdF0tPmdldFB0cigpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBudW1WZXJ0cyA9IGJ1ZmZlclR5cGUtPmdldERpbVgoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwb3NQdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbUJCb3hNaW5bMF0gPSBtQkJveE1pblsxXSA9IG1CQm94TWluWzJdID0gMWU2OworICAgIG1CQm94TWF4WzBdID0gbUJCb3hNYXhbMV0gPSBtQkJveE1heFsyXSA9IC0xZTY7CisgICAgaWYoIXBvc1B0cikgeworICAgICAgICBMT0dFKCJVbmFibGUgdG8gY29tcHV0ZSBib3VuZGluZyBib3giKTsKKyAgICAgICAgbUJCb3hNaW5bMF0gPSBtQkJveE1pblsxXSA9IG1CQm94TWluWzJdID0gMC4wZjsKKyAgICAgICAgbUJCb3hNYXhbMF0gPSBtQkJveE1heFsxXSA9IG1CQm94TWF4WzJdID0gMC4wZjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bVZlcnRzOyBpICsrKSB7CisgICAgICAgIGZvcih1aW50MzJfdCB2ID0gMDsgdiA8IHZlY3RvclNpemU7IHYgKyspIHsKKyAgICAgICAgICAgIG1CQm94TWluW3ZdID0gcnNNaW4obUJCb3hNaW5bdl0sIHBvc1B0clt2XSk7CisgICAgICAgICAgICBtQkJveE1heFt2XSA9IHJzTWF4KG1CQm94TWF4W3ZdLCBwb3NQdHJbdl0pOworICAgICAgICB9CisgICAgICAgIHBvc1B0ciArPSBzdHJpZGU7CisgICAgfQorfQogCiAKIE1lc2hDb250ZXh0OjpNZXNoQ29udGV4dCgpCkBAIC00NiwzICsyNzYsODMgQEAKIHsKIH0KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK1JzTWVzaCByc2lfTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHZ0eENvdW50LCB1aW50MzJfdCBpZHhDb3VudCkKK3sKKyAgICBNZXNoICpzbSA9IG5ldyBNZXNoKHJzYyk7CisgICAgc20tPmluY1VzZXJSZWYoKTsKKworICAgIHNtLT5tUHJpbWl0aXZlc0NvdW50ID0gaWR4Q291bnQ7CisgICAgc20tPm1QcmltaXRpdmVzID0gbmV3IE1lc2g6OlByaW1pdGl2ZV90ICpbc20tPm1QcmltaXRpdmVzQ291bnRdOworICAgIGZvcih1aW50MzJfdCBjdCA9IDA7IGN0IDwgaWR4Q291bnQ7IGN0ICsrKSB7CisgICAgICAgIHNtLT5tUHJpbWl0aXZlc1tjdF0gPSBuZXcgTWVzaDo6UHJpbWl0aXZlX3Q7CisgICAgfQorCisgICAgc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCA9IHZ0eENvdW50OworICAgIHNtLT5tVmVydGV4QnVmZmVycyA9IG5ldyBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+W3Z0eENvdW50XTsKKworICAgIHJldHVybiBzbTsKK30KKwordm9pZCByc2lfTWVzaEJpbmRWZXJ0ZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKK3sKKyAgICBNZXNoICpzbSA9IHN0YXRpY19jYXN0PE1lc2ggKj4obXYpOworICAgIHJzQXNzZXJ0KHNsb3QgPCBzbS0+bVZlcnRleEJ1ZmZlckNvdW50KTsKKworICAgIHNtLT5tVmVydGV4QnVmZmVyc1tzbG90XS5zZXQoKEFsbG9jYXRpb24gKil2YSk7Cit9CisKK3ZvaWQgcnNpX01lc2hCaW5kSW5kZXgoQ29udGV4dCAqcnNjLCBSc01lc2ggbXYsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgcHJpbVR5cGUsIHVpbnQzMl90IHNsb3QpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChzbG90IDwgc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgc20tPm1QcmltaXRpdmVzW3Nsb3RdLT5tSW5kZXhCdWZmZXIuc2V0KChBbGxvY2F0aW9uICopdmEpOworICAgIHNtLT5tUHJpbWl0aXZlc1tzbG90XS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKKyAgICBzbS0+dXBkYXRlR0xQcmltaXRpdmVzKCk7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0ZXhCdWZmZXJDb3VudChDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgaW50MzJfdCAqbnVtVnR4KQoreworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPihtdik7CisgICAgKm51bVZ0eCA9IHNtLT5tVmVydGV4QnVmZmVyQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRJbmRleENvdW50KENvbnRleHQgKnJzYywgUnNNZXNoIG12LCBpbnQzMl90ICpudW1JZHgpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICAqbnVtSWR4ID0gc20tPm1QcmltaXRpdmVzQ291bnQ7Cit9CisKK3ZvaWQgcnNpX01lc2hHZXRWZXJ0aWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2dHhEYXRhLCB1aW50MzJfdCB2dHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydCh2dHhEYXRhQ291bnQgPT0gc20tPm1WZXJ0ZXhCdWZmZXJDb3VudCk7CisKKyAgICBmb3IodWludDMyX3QgY3QgPSAwOyBjdCA8IHZ0eERhdGFDb3VudDsgY3QgKyspIHsKKyAgICAgICAgdnR4RGF0YVtjdF0gPSBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLmdldCgpOworICAgICAgICBzbS0+bVZlcnRleEJ1ZmZlcnNbY3RdLT5pbmNVc2VyUmVmKCk7CisgICAgfQorfQorCit2b2lkIHJzaV9NZXNoR2V0SW5kaWNlcyhDb250ZXh0ICpyc2MsIFJzTWVzaCBtdiwgUnNBbGxvY2F0aW9uICp2YSwgdWludDMyX3QgKnByaW1UeXBlLCB1aW50MzJfdCBpZHhEYXRhQ291bnQpCit7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KG12KTsKKyAgICByc0Fzc2VydChpZHhEYXRhQ291bnQgPT0gc20tPm1QcmltaXRpdmVzQ291bnQpOworCisgICAgZm9yKHVpbnQzMl90IGN0ID0gMDsgY3QgPCBpZHhEYXRhQ291bnQ7IGN0ICsrKSB7CisgICAgICAgIHZhW2N0XSA9IHNtLT5tUHJpbWl0aXZlc1tjdF0tPm1JbmRleEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgcHJpbVR5cGVbY3RdID0gc20tPm1QcmltaXRpdmVzW2N0XS0+bVByaW1pdGl2ZTsKKyAgICAgICAgaWYoc20tPm1QcmltaXRpdmVzW2N0XS0+bUluZGV4QnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICBzbS0+bVByaW1pdGl2ZXNbY3RdLT5tSW5kZXhCdWZmZXItPmluY1VzZXJSZWYoKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKworCit9fQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc01lc2guaCBiL2xpYnMvcnMvcnNNZXNoLmgKaW5kZXggNTIwMWFiZC4uZWQwMWMzOCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guaAorKysgYi9saWJzL3JzL3JzTWVzaC5oCkBAIC0zMiw0NSArMzIsNDAgQEAKICAgICBNZXNoKENvbnRleHQgKik7CiAgICAgfk1lc2goKTsKIAotICAgIHN0cnVjdCBWZXJ0aWNpZXNfdAotICAgIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqKiBtQWxsb2NhdGlvbnM7Ci0gICAgICAgIHVpbnQzMl90IG1BbGxvY2F0aW9uQ291bnQ7CisgICAgLy8gQ29udGFpbnMgdmVydGV4IGRhdGEKKyAgICAvLyBQb3NpdGlvbiwgbm9ybWFsLCB0ZXhjb29yZCwgZXRjIGNvdWxkIGVpdGhlciBiZSBzdHJpZGVkIGluIG9uZSBhbGxvY2F0aW9uCisgICAgLy8gb2YgcHJvdmlkZWQgc2VwYXJldGVseSBpbiBtdWx0aXBsZSBvbmVzCisgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiAqbVZlcnRleEJ1ZmZlcnM7CisgICAgdWludDMyX3QgbVZlcnRleEJ1ZmZlckNvdW50OwogCi0gICAgICAgIHNpemVfdCBtVmVydGV4RGF0YVNpemU7Ci0KLSAgICAgICAgc2l6ZV90IG1PZmZzZXRDb29yZDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXRUZXg7Ci0gICAgICAgIHNpemVfdCBtT2Zmc2V0Tm9ybTsKLQotICAgICAgICBzaXplX3QgbVNpemVDb29yZDsKLSAgICAgICAgc2l6ZV90IG1TaXplVGV4OwotICAgICAgICBzaXplX3QgbVNpemVOb3JtOwotCi0gICAgICAgIHVpbnQzMl90IG1CdWZmZXJPYmplY3Q7Ci0gICAgfTsKLQorICAgIC8vIEVpdGhlciBtSW5kZXhCdWZmZXIsIG1QcmltaXRpdmVCdWZmZXIgb3IgYm90aCBjb3VsZCBoYXZlIGEgTlVMTCByZWZlcmVuY2UKKyAgICAvLyBJZiBib3RoIGFyZSBudWxsLCBtUHJpbWl0aXZlIG9ubHkgd291bGQgYmUgdXNlZCB0byByZW5kZXIgdGhlIG1lc2gKICAgICBzdHJ1Y3QgUHJpbWl0aXZlX3QKICAgICB7Ci0gICAgICAgIFJzUHJpbWl0aXZlIG1UeXBlOwotICAgICAgICBWZXJ0aWNpZXNfdCAqbVZlcnRpY2llczsKKyAgICAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7CiAKLSAgICAgICAgdWludDMyX3QgbUluZGV4Q291bnQ7Ci0gICAgICAgIHVpbnQxNl90ICptSW5kaWNpZXM7Ci0KLSAgICAgICAgdWludDMyX3QgbVJlc3RhcnRDb3VudHM7Ci0gICAgICAgIHVpbnQxNl90ICptUmVzdGFydHM7CisgICAgICAgIFJzUHJpbWl0aXZlIG1QcmltaXRpdmU7CisgICAgICAgIHVpbnQzMl90IG1HTFByaW1pdGl2ZTsKICAgICB9OwogCi0gICAgVmVydGljaWVzX3QgKiBtVmVydGljaWVzOwotICAgIHVpbnQzMl90IG1WZXJ0aWNpZXNDb3VudDsKLQogICAgIFByaW1pdGl2ZV90ICoqIG1QcmltaXRpdmVzOwogICAgIHVpbnQzMl90IG1QcmltaXRpdmVzQ291bnQ7CiAKKyAgICB2b2lkIHJlbmRlcihDb250ZXh0ICopIGNvbnN0OworICAgIHZvaWQgcmVuZGVyUHJpbWl0aXZlKENvbnRleHQgKiwgdWludDMyX3QgcHJpbUluZGV4KSBjb25zdDsKKyAgICB2b2lkIHJlbmRlclByaW1pdGl2ZVJhbmdlKENvbnRleHQgKiwgdWludDMyX3QgcHJpbUluZGV4LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKSBjb25zdDsKKyAgICB2b2lkIHVwbG9hZEFsbChDb250ZXh0ICopOworICAgIHZvaWQgdXBkYXRlR0xQcmltaXRpdmVzKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9NRVNIOyB9CisgICAgc3RhdGljIE1lc2ggKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCi0gICAgdm9pZCBhbmFseXplRWxlbWVudCgpOworICAgIC8vIEJvdW5kaW5nIHZvbHVtZXMKKyAgICBmbG9hdCBtQkJveE1pblszXTsKKyAgICBmbG9hdCBtQkJveE1heFszXTsKKyAgICB2b2lkIGNvbXB1dGVCQm94KCk7CisKIHByb3RlY3RlZDoKIH07CiAKQEAgLTg4LDMgKzgzLDQgQEAKICNlbmRpZiAvL0FORFJPSURfUlNfVFJJQU5HTEVfTUVTSF9ICiAKIAorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguY3BwIGIvbGlicy9ycy9yc011dGV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc1MmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc011dGV4LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzTXV0ZXguaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK011dGV4OjpNdXRleCgpCit7Cit9CisKK011dGV4Ojp+TXV0ZXgoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKK30KKworYm9vbCBNdXRleDo6aW5pdCgpCit7CisgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbU11dGV4LCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIk11dGV4OjpNdXRleCBpbml0IGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdXRleDo6bG9jaygpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleDogZXJyb3IgJWkgbG9ja2luZy4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE11dGV4Ojp1bmxvY2soKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJNdXRleCBlcnJvciAlaSB1bmxvY2tpbmcuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTXV0ZXguaCBiL2xpYnMvcnMvcnNNdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzI1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzTXV0ZXguaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX01VVEVYX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19NVVRFWF9ICisKKworI2luY2x1ZGUgInJzVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIE11dGV4IHsKK3B1YmxpYzoKKyAgICBNdXRleCgpOworICAgIH5NdXRleCgpOworCisgICAgYm9vbCBpbml0KCk7CisgICAgYm9vbCBsb2NrKCk7CisgICAgYm9vbCB1bmxvY2soKTsKKworcHJvdGVjdGVkOgorICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Cit9OworCit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTm9pc2UuY3BwIGIvbGlicy9ycy9yc05vaXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzU4Ni4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub2lzZSBmdW5jdGlvbnMgd2FzIHBvcnRlZCBmcm9tIHRoZSBKYXZhCi0gKiBpbXBsZW1lbnRhdGlvbiBieSBKZXJyeSBIdXh0YWJsZSAoaHR0cDovL3d3dy5qaGxhYnMuY29tKSB1bmRlcgotICogQXBhY2hlIExpY2Vuc2UgMi4wIChzZWUgaHR0cDovL2pobGFicy5jb20vaXAvZmlsdGVycy9kb3dubG9hZC5odG1sKQotICoKLSAqIE9yaWdpbmFsIGhlYWRlcjoKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBKZXJyeSBIdXh0YWJsZQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNOb2lzZS5oIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7Ci0KLSNkZWZpbmUgQiAweDEwMAotI2RlZmluZSBCTSAweGZmCi0jZGVmaW5lIE4gMHgxMDAwCi0KLXN0YXRpYyBpbnQgcFtCICsgQiArIDJdOwotc3RhdGljIGZsb2F0IGczW0IgKyBCICsgMl1bM107Ci1zdGF0aWMgZmxvYXQgZzJbQiArIEIgKyAyXVsyXTsKLXN0YXRpYyBmbG9hdCBnMVtCICsgQiArIDJdOwotc3RhdGljIGJvb2wgbm9pc2Vfc3RhcnQgPSB0cnVlOwotCi0jZGVmaW5lIGxlcnBmKHN0YXJ0LCBzdG9wLCBhbW91bnQpIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQKLQotc3RhdGljIGlubGluZSBmbG9hdCBub2lzZV9zQ3VydmUoZmxvYXQgdCkKLXsKLSAgICByZXR1cm4gdCAqIHQgKiAoMy4wZiAtIDIuMGYgKiB0KTsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjIoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSk7Ci0gICAgdlswXSA9IHZbMF0gLyBzOwotICAgIHZbMV0gPSB2WzFdIC8gczsKLX0KLQotaW5saW5lIHZvaWQgU0Nfbm9ybWFsaXplZjMoZmxvYXQgdltdKQotewotICAgIGZsb2F0IHMgPSAoZmxvYXQpc3FydGYodlswXSAqIHZbMF0gKyB2WzFdICogdlsxXSArIHZbMl0gKiB2WzJdKTsKLSAgICB2WzBdID0gdlswXSAvIHM7Ci0gICAgdlsxXSA9IHZbMV0gLyBzOwotICAgIHZbMl0gPSB2WzJdIC8gczsKLX0KLQotc3RhdGljIHZvaWQgbm9pc2VfaW5pdCgpCi17Ci0gICAgaW50IGksIGosIGs7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEI7IGkrKykgewotICAgICAgICBwW2ldID0gaTsKLSAgICAgICAgCi0gICAgICAgIGcxW2ldID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgICAgICAgICAgZzJbaV1bal0gPSAoZmxvYXQpKChyYW5kKCkgJSAoQiArIEIpKSAtIEIpIC8gQjsKLSAgICAgICAgU0Nfbm9ybWFsaXplZjIoZzJbaV0pOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGczW2ldW2pdID0gKGZsb2F0KSgocmFuZCgpICUgKEIgKyBCKSkgLSBCKSAvIEI7Ci0gICAgICAgIFNDX25vcm1hbGl6ZWYzKGczW2ldKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gQi0xOyBpID49IDA7IGktLSkgewotICAgICAgICBrID0gcFtpXTsKLSAgICAgICAgcFtpXSA9IHBbaiA9IHJhbmQoKSAlIEJdOwotICAgICAgICBwW2pdID0gazsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IEIgKyAyOyBpKyspIHsKLSAgICAgICAgcFtCICsgaV0gPSBwW2ldOwotICAgICAgICBnMVtCICsgaV0gPSBnMVtpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKLSAgICAgICAgICAgIGcyW0IgKyBpXVtqXSA9IGcyW2ldW2pdOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgZzNbQiArIGldW2pdID0gZzNbaV1bal07Ci0gICAgfQotfQotCi1mbG9hdCBTQ19ub2lzZWYoZmxvYXQgeCkKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBpbnQgYngwLCBieDE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHN4LCB0LCB1LCB2OwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICAKLSAgICB1ID0gcngwICogZzFbcFtieDBdXTsKLSAgICB2ID0gcngxICogZzFbcFtieDFdXTsKLSAgICByZXR1cm4gMi4zZiAqIGxlcnBmKHUsIHYsIHN4KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGIwMCwgYjEwLCBiMDEsIGIxMTsKLSAgICBmbG9hdCByeDAsIHJ4MSwgcnkwLCByeTEsIHN4LCBzeSwgYSwgYiwgdCwgdSwgdjsKLSAgICBmbG9hdCAqcTsKLSAgICBpbnQgaSwgajsKLSAgICAKLSAgICBpZiAobm9pc2Vfc3RhcnQpIHsKLSAgICAgICAgbm9pc2Vfc3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbm9pc2VfaW5pdCgpOwotICAgIH0KLSAgICAKLSAgICB0ID0geCArIE47Ci0gICAgYngwID0gKChpbnQpdCkgJiBCTTsKLSAgICBieDEgPSAoYngwKzEpICYgQk07Ci0gICAgcngwID0gdCAtIChpbnQpdDsKLSAgICByeDEgPSByeDAgLSAxLjBmOwotCQotICAgIHQgPSB5ICsgTjsKLSAgICBieTAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ5MSA9IChieTArMSkgJiBCTTsKLSAgICByeTAgPSB0IC0gKGludCl0OwotICAgIHJ5MSA9IHJ5MCAtIDEuMGY7Ci0JCi0gICAgaSA9IHBbYngwXTsKLSAgICBqID0gcFtieDFdOwotICAgIAotICAgIGIwMCA9IHBbaSArIGJ5MF07Ci0gICAgYjEwID0gcFtqICsgYnkwXTsKLSAgICBiMDEgPSBwW2kgKyBieTFdOwotICAgIGIxMSA9IHBbaiArIGJ5MV07Ci0gICAgCi0gICAgc3ggPSBub2lzZV9zQ3VydmUocngwKTsKLSAgICBzeSA9IG5vaXNlX3NDdXJ2ZShyeTApOwotICAgIAotICAgIHEgPSBnMltiMDBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMF07IHYgPSByeDEgKiBxWzBdICsgcnkwICogcVsxXTsKLSAgICBhID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHEgPSBnMltiMDFdOyB1ID0gcngwICogcVswXSArIHJ5MSAqIHFbMV07Ci0gICAgcSA9IGcyW2IxMV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXTsKLSAgICBiID0gbGVycGYodSwgdiwgc3gpOwotICAgIAotICAgIHJldHVybiAxLjVmKmxlcnBmKGEsIGIsIHN5KTsKLX0KLQotZmxvYXQgU0Nfbm9pc2VmMyhmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICAgIGludCBieDAsIGJ4MSwgYnkwLCBieTEsIGJ6MCwgYnoxLCBiMDAsIGIxMCwgYjAxLCBiMTE7Ci0gICAgZmxvYXQgcngwLCByeDEsIHJ5MCwgcnkxLCByejAsIHJ6MSwgc3ksIHN6LCBhLCBiLCBjLCBkLCB0LCB1LCB2OwotICAgIGZsb2F0ICpxOwotICAgIGludCBpLCBqOwotICAgIAotICAgIGlmIChub2lzZV9zdGFydCkgewotICAgICAgICBub2lzZV9zdGFydCA9IGZhbHNlOwotICAgICAgICBub2lzZV9pbml0KCk7Ci0gICAgfQotICAgIAotICAgIHQgPSB4ICsgTjsKLSAgICBieDAgPSAoKGludCl0KSAmIEJNOwotICAgIGJ4MSA9IChieDArMSkgJiBCTTsKLSAgICByeDAgPSB0IC0gKGludCl0OwotICAgIHJ4MSA9IHJ4MCAtIDEuMGY7Ci0gICAgCi0gICAgdCA9IHkgKyBOOwotICAgIGJ5MCA9ICgoaW50KXQpICYgQk07Ci0gICAgYnkxID0gKGJ5MCsxKSAmIEJNOwotICAgIHJ5MCA9IHQgLSAoaW50KXQ7Ci0gICAgcnkxID0gcnkwIC0gMS4wZjsKLQkKLSAgICB0ID0geiArIE47Ci0gICAgYnowID0gKChpbnQpdCkgJiBCTTsKLSAgICBiejEgPSAoYnowKzEpICYgQk07Ci0gICAgcnowID0gdCAtIChpbnQpdDsKLSAgICByejEgPSByejAgLSAxLjBmOwotCQotICAgIGkgPSBwW2J4MF07Ci0gICAgaiA9IHBbYngxXTsKLSAgICAKLSAgICBiMDAgPSBwW2kgKyBieTBdOwotICAgIGIxMCA9IHBbaiArIGJ5MF07Ci0gICAgYjAxID0gcFtpICsgYnkxXTsKLSAgICBiMTEgPSBwW2ogKyBieTFdOwotICAgIAotICAgIHQgID0gbm9pc2Vfc0N1cnZlKHJ4MCk7Ci0gICAgc3kgPSBub2lzZV9zQ3VydmUocnkwKTsKLSAgICBzeiA9IG5vaXNlX3NDdXJ2ZShyejApOwotICAgIAotICAgIHEgPSBnM1tiMDAgKyBiejBdOyB1ID0gcngwICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIHEgPSBnM1tiMTAgKyBiejBdOyB2ID0gcngxICogcVswXSArIHJ5MCAqIHFbMV0gKyByejAgKiBxWzJdOwotICAgIGEgPSBsZXJwZih1LCB2LCB0KTsKLSAgICAKLSAgICBxID0gZzNbYjAxICsgYnowXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBxID0gZzNbYjExICsgYnowXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTEgKiBxWzFdICsgcnowICogcVsyXTsKLSAgICBiID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgYyA9IGxlcnBmKGEsIGIsIHN5KTsKLSAgICAKLSAgICBxID0gZzNbYjAwICsgYnoxXTsgdSA9IHJ4MCAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBxID0gZzNbYjEwICsgYnoxXTsgdiA9IHJ4MSAqIHFbMF0gKyByeTAgKiBxWzFdICsgcnoxICogcVsyXTsKLSAgICBhID0gbGVycGYodSwgdiwgdCk7Ci0gICAgCi0gICAgcSA9IGczW2IwMSArIGJ6MV07IHUgPSByeDAgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgcSA9IGczW2IxMSArIGJ6MV07IHYgPSByeDEgKiBxWzBdICsgcnkxICogcVsxXSArIHJ6MSAqIHFbMl07Ci0gICAgYiA9IGxlcnBmKHUsIHYsIHQpOwotICAgIAotICAgIGQgPSBsZXJwZihhLCBiLCBzeSk7Ci0gICAgCi0gICAgcmV0dXJuIDEuNWYqbGVycGYoYywgZCwgc3opOwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjIoZiAqIHgsIGYgKiB5KSkgLyBmOwotICAgIHJldHVybiB0OwotfQotCi1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcykKLXsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgICBmbG9hdCB0ID0gMC4wZjsKLSAgICAKLSAgICBmb3IgKGZsb2F0IGYgPSAxLjBmOyBmIDw9IG9jdGF2ZXM7IGYgKj0gMikKLSAgICAgICAgdCArPSBmYWJzKFNDX25vaXNlZjMoZiAqIHgsIGYgKiB5LCBmICogeikpIC8gZjsKLSAgICByZXR1cm4gdDsKLX0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc05vaXNlLmggYi9saWJzL3JzL3JzTm9pc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDc1MS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzTm9pc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfTk9JU0VfSAotI2RlZmluZSBBTkRST0lEX1JTX05PSVNFX0gKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotdm9pZCBTQ19ub3JtYWxpemVmMihmbG9hdCB2W10pOwotdm9pZCBTQ19ub3JtYWxpemVmMyhmbG9hdCB2W10pOwotZmxvYXQgU0Nfbm9pc2VmKGZsb2F0IHgpOwotZmxvYXQgU0Nfbm9pc2VmMihmbG9hdCB4LCBmbG9hdCB5KTsKLWZsb2F0IFNDX25vaXNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeik7Ci1mbG9hdCBTQ190dXJidWxlbmNlZjIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgb2N0YXZlcyk7Ci1mbG9hdCBTQ190dXJidWxlbmNlZjMoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgb2N0YXZlcyk7Ci0KLX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5jcHAKaW5kZXggNjc3NDEzZS4uNDhmMWZlZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc09iamVjdEJhc2UuY3BwCisrKyBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmNwcApAQCAtMTUsNyArMTUsMTIgQEAKICAqLwogCiAjaW5jbHVkZSAicnNPYmplY3RCYXNlLmgiCisKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTI0LDcgKzI5LDYgQEAKIHsKICAgICBtVXNlclJlZkNvdW50ID0gMDsKICAgICBtU3lzUmVmQ291bnQgPSAwOwotICAgIG1OYW1lID0gTlVMTDsKICAgICBtUlNDID0gTlVMTDsKICAgICBtTmV4dCA9IE5VTEw7CiAgICAgbVByZXYgPSBOVUxMOwpAQCAtMzksMTQgKzQzLDEzIEBACiAgICAgcnNBc3NlcnQoIW1Vc2VyUmVmQ291bnQpOwogICAgIHJzQXNzZXJ0KCFtU3lzUmVmQ291bnQpOwogICAgIHJlbW92ZSgpOwotICAgIGRlbGV0ZVtdIG1OYW1lOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OmR1bXBMT0dWKGNvbnN0IGNoYXIgKm9wKSBjb25zdAogewotICAgIGlmIChtTmFtZSkgeworICAgIGlmIChtTmFtZS5zaXplKCkpIHsKICAgICAgICAgTE9HVigiJXMgUlNvYmogJXAsIG5hbWUgJXMsIHJlZnMgJWksJWkgIGZyb20gJXMsJWkgbGlua3MgJXAsJXAsJXAiLAotICAgICAgICAgICAgIG9wLCB0aGlzLCBtTmFtZSwgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOworICAgICAgICAgICAgIG9wLCB0aGlzLCBtTmFtZS5zdHJpbmcoKSwgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1YoIiVzIFJTb2JqICVwLCBuby1uYW1lLCByZWZzICVpLCVpICBmcm9tICVzLCVpIGxpbmtzICVwLCVwLCVwIiwKICAgICAgICAgICAgICBvcCwgdGhpcywgbVVzZXJSZWZDb3VudCwgbVN5c1JlZkNvdW50LCBtQWxsb2NGaWxlLCBtQWxsb2NMaW5lLCBtTmV4dCwgbVByZXYsIG1SU0MpOwpAQCAtMTEzLDE4ICsxMTYsMTIgQEAKIAogdm9pZCBPYmplY3RCYXNlOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc2V0TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIG1OYW1lLnNldFRvKG5hbWUpOwogfQogCiB2b2lkIE9iamVjdEJhc2U6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbGVuKQogewotICAgIGRlbGV0ZSBtTmFtZTsKLSAgICBtTmFtZSA9IE5VTEw7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgbU5hbWUgPSBuZXcgY2hhcltsZW4gKyAxXTsKLSAgICAgICAgbWVtY3B5KG1OYW1lLCBuYW1lLCBsZW4pOwotICAgICAgICBtTmFtZVtsZW5dID0gMDsKLSAgICB9CisgICAgbU5hbWUuc2V0VG8obmFtZSwgbGVuKTsKIH0KIAogdm9pZCBPYmplY3RCYXNlOjphZGQoKSBjb25zdApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc09iamVjdEJhc2UuaCBiL2xpYnMvcnMvcnNPYmplY3RCYXNlLmgKaW5kZXggYmIwM2I4Ny4uYWQ5NWI4MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc09iamVjdEJhc2UuaAorKysgYi9saWJzL3JzL3JzT2JqZWN0QmFzZS5oCkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAogY2xhc3MgQ29udGV4dDsKK2NsYXNzIE9TdHJlYW07CiAKIC8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCiBjbGFzcyBPYmplY3RCYXNlCkBAIC00MCw3ICs0MSw3IEBACiAgICAgYm9vbCB6ZXJvVXNlclJlZigpIGNvbnN0OwogCiAgICAgY29uc3QgY2hhciAqIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgcmV0dXJuIG1OYW1lLnN0cmluZygpOwogICAgIH0KICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqKTsKICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqLCB1aW50MzJfdCBsZW4pOwpAQCAtNTIsNiArNTMsOCBAQAogICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoQ29udGV4dCAqcnNjKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wTE9HVihjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0ID0gMDsKIAogcHJvdGVjdGVkOgogICAgIGNvbnN0IGNoYXIgKm1BbGxvY0ZpbGU7CkBAIC02NCw3ICs2Nyw3IEBACiAKICAgICBib29sIGNoZWNrRGVsZXRlKCkgY29uc3Q7CiAKLSAgICBjaGFyICogbU5hbWU7CisgICAgU3RyaW5nOCBtTmFtZTsKICAgICBtdXRhYmxlIGludDMyX3QgbVN5c1JlZkNvdW50OwogICAgIG11dGFibGUgaW50MzJfdCBtVXNlclJlZkNvdW50OwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbS5jcHAKaW5kZXggNzBlMjg2OC4uNjA0MWRiOCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW0uY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtLmNwcApAQCAtMTQsMTEgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTIzNSw3ICsyNDEsMTI5IEBACiAgICAgbVVzZXJTaGFkZXIuc2V0VG8odHh0LCBsZW4pOwogfQogCit2b2lkIFByb2dyYW06OmFwcGVuZFVzZXJDb25zdGFudHMoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db25zdGFudENvdW50OyBjdCsrKSB7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgeworICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKIAorICAgICAgICAgICAgaWYgKGZuWzBdID09ICcjJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAorICAgICAgICAgICAgcnNBc3NlcnQoIWYtPmdldEZpZWxkQ291bnQoKSk7CisgICAgICAgICAgICBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfNFg0KSB7CisgICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gbWF0NCBVTklfIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8zWDMpIHsKKyAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSBtYXQzIFVOSV8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzJYMikgeworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDIgVU5JXyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKGYtPmdldENvbXBvbmVudCgpLmdldFZlY3RvclNpemUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogbVNoYWRlci5hcHBlbmQoInVuaWZvcm0gZmxvYXQgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzIgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzMgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIHZlYzQgVU5JXyIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCI7XG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBQcm9ncmFtOjpzZXR1cFVzZXJDb25zdGFudHMoU2hhZGVyQ2FjaGUgKnNjLCBib29sIGlzRnJhZ21lbnQpIHsKKyAgICB1aW50MzJfdCB1aWR4ID0gMTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBtQ29uc3RhbnRzW2N0KzFdLmdldCgpOworICAgICAgICBpZiAoIWFsbG9jKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7CisgICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgeworICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpZWxkTmFtZSA9IGUtPmdldEZpZWxkTmFtZShmaWVsZCk7CisgICAgICAgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIHBhZGRpbmcsIHNraXAgaXQKKyAgICAgICAgICAgIGlmKGZpZWxkTmFtZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gZS0+Z2V0RmllbGRPZmZzZXRCeXRlcyhmaWVsZCk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOworCisgICAgICAgICAgICBpbnQzMl90IHNsb3QgPSAtMTsKKyAgICAgICAgICAgIGlmKCFpc0ZyYWdtZW50KSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhVbmlmb3JtU2xvdCh1aWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzYy0+ZnJhZ1VuaWZvcm1TbG90KHVpZHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpLCBuYW1lPSVzIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgsIGZpZWxkTmFtZSk7CisgICAgICAgICAgICBpZiAoc2xvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYoZi0+Z2V0VHlwZSgpID09IFJTX1RZUEVfTUFUUklYXzRYNCkgeworICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYoc2xvdCwgMSwgR0xfRkFMU0UsIGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihmLT5nZXRUeXBlKCkgPT0gUlNfVFlQRV9NQVRSSVhfM1gzKSB7CisgICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybU1hdHJpeDNmdihzbG90LCAxLCBHTF9GQUxTRSwgZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGYtPmdldFR5cGUoKSA9PSBSU19UWVBFX01BVFJJWF8yWDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtTWF0cml4MmZ2KHNsb3QsIDEsIEdMX0ZBTFNFLCBmZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZi0+Z2V0Q29tcG9uZW50KCkuZ2V0VmVjdG9yU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAxID0gJWYiLCBmZFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0xZnYoc2xvdCwgMSwgZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAyID0gJWYgJWYiLCBmZFswXSwgZmRbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2xVbmlmb3JtMmZ2KHNsb3QsIDEsIGZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gMyA9ICVmICVmICVmIiwgZmRbMF0sIGZkWzFdLCBmZFsyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0zZnYoc2xvdCwgMSwgZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSA0ID0gJWYgJWYgJWYgJWYiLCBmZFswXSwgZmRbMV0sIGZkWzJdLCBmZFszXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm00ZnYoc2xvdCwgMSwgZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByc0Fzc2VydCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpZHggKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbTo6aW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICByc0Fzc2VydChlLT5nZXRGaWVsZENvdW50KCkpOworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKKyAgICAgICAgY29uc3QgRWxlbWVudCAqY2UgPSBlLT5nZXRGaWVsZChjdCk7CisgICAgICAgIGlmIChjZS0+Z2V0RmllbGRDb3VudCgpKSB7CisgICAgICAgICAgICBpbml0QWRkVXNlckVsZW1lbnQoY2UsIG5hbWVzLCBjb3VudCwgcHJlZml4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGUtPmdldEZpZWxkTmFtZShjdClbMF0gIT0gJyMnKSB7CisgICAgICAgICAgICBTdHJpbmc4IHRtcChwcmVmaXgpOworICAgICAgICAgICAgdG1wLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QpKTsKKyAgICAgICAgICAgIG5hbWVzWypjb3VudF0uc2V0VG8odG1wLnN0cmluZygpKTsKKyAgICAgICAgICAgICgqY291bnQpKys7CisgICAgICAgIH0KKyAgICB9Cit9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW0uaCBiL2xpYnMvcnMvcnNQcm9ncmFtLmgKaW5kZXggODZmODVmYi4uZGRjNWU4YSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW0uaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbS5oCkBAIC03Miw2ICs3MiwxMSBAQAogICAgIHVpbnQzMl90IG1Db25zdGFudENvdW50OwogICAgIGJvb2wgbUlzVmFsaWQ7CiAKKyAgICAvLyBBcHBsaWVzIHRvIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycyBvbmx5CisgICAgdm9pZCBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CisgICAgdm9pZCBzZXR1cFVzZXJDb25zdGFudHMoU2hhZGVyQ2FjaGUgKnNjLCBib29sIGlzRnJhZ21lbnQpOworICAgIHZvaWQgaW5pdEFkZFVzZXJFbGVtZW50KGNvbnN0IEVsZW1lbnQgKmUsIFN0cmluZzggKm5hbWVzLCB1aW50MzJfdCAqY291bnQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKICAgICBPYmplY3RCYXNlUmVmPEFsbG9jYXRpb24+IG1Db25zdGFudHNbTUFYX1VOSUZPUk1TXTsKIAogICAgIG11dGFibGUgYm9vbCBtRGlydHk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IGMxN2I5NGMuLjgzMzIxZDMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xNCwxMyArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtRnJhZ21lbnQuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzIsMTMgKzM4LDIxIEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICByc0Fzc2VydChwYXJhbUxlbmd0aCA9IDUpOworICAgIHJzQXNzZXJ0KHBhcmFtTGVuZ3RoID09IDYpOworCisgICAgbUNvbnN0YW50Q29sb3JbMF0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMV0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbMl0gPSAxLmY7CisgICAgbUNvbnN0YW50Q29sb3JbM10gPSAxLmY7CiAKICAgICBtRW52TW9kZXNbMF0gPSAoUnNUZXhFbnZNb2RlKXBhcmFtc1swXTsKICAgICBtVGV4dHVyZUZvcm1hdHNbMF0gPSBwYXJhbXNbMV07CiAgICAgbUVudk1vZGVzWzFdID0gKFJzVGV4RW52TW9kZSlwYXJhbXNbMl07CiAgICAgbVRleHR1cmVGb3JtYXRzWzFdID0gcGFyYW1zWzNdOwogICAgIG1Qb2ludFNwcml0ZUVuYWJsZSA9IHBhcmFtc1s0XSAhPSAwOworICAgIG1WYXJ5aW5nQ29sb3IgPSBmYWxzZTsKKyAgICBpZiAocGFyYW1MZW5ndGggPiA1KQorICAgICAgICBtVmFyeWluZ0NvbG9yID0gcGFyYW1zWzVdICE9IDA7CiAKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAwOwogICAgIGlmIChtRW52TW9kZXNbMF0pIHsKQEAgLTQ3LDYgKzYxLDcgQEAKICAgICBpZiAobUVudk1vZGVzWzFdKSB7CiAgICAgICAgIG1UZXh0dXJlRW5hYmxlTWFzayB8PSAyOwogICAgIH0KKwogICAgIGluaXQocnNjKTsKIH0KIApAQCAtNTgsOCArNzMsMTYgQEAKICAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CiAgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOwogCi0gICAgaW5pdChyc2MpOworICAgIG1Db25zdGFudENvbG9yWzBdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzFdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzJdID0gMS5mOworICAgIG1Db25zdGFudENvbG9yWzNdID0gMS5mOworCisgICAgTE9HRSgiQ3VzdG9tIEZQIik7CisKICAgICBtVGV4dHVyZUVuYWJsZU1hc2sgPSAoMSA8PCBtVGV4dHVyZUNvdW50KSAtMTsKKworICAgIGluaXQocnNjKTsKIH0KIAogCkBAIC02Nyw3NiArOTAsMTcgQEAKIHsKIH0KIAordm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldENvbnN0YW50Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBtQ29uc3RhbnRDb2xvclswXSA9IHI7CisgICAgbUNvbnN0YW50Q29sb3JbMV0gPSBnOworICAgIG1Db25zdGFudENvbG9yWzJdID0gYjsKKyAgICBtQ29uc3RhbnRDb2xvclszXSA9IGE7CisgICAgbURpcnR5ID0gdHJ1ZTsKK30KKwogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0woY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgTUFYX1RFWFRVUkU7IGN0KyspIHsKLSAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwICsgY3QpOwotICAgICAgICBpZiAoIShtVGV4dHVyZUVuYWJsZU1hc2sgJiAoMSA8PCBjdCkpIHx8ICFtVGV4dHVyZXNbY3RdLmdldCgpKSB7Ci0gICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgewotICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewotICAgICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFX09FUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfUE9JTlRfU1BSSVRFX09FUywgR0xfQ09PUkRfUkVQTEFDRV9PRVMsIG1Qb2ludFNwcml0ZUVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRleHR1cmVzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZXNbY3RdLT5nZXRUZXh0dXJlSUQoKSk7Ci0KLSAgICAgICAgc3dpdGNoKG1FbnZNb2Rlc1tjdF0pIHsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfTk9ORToKLSAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX1JFUExBQ0U6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNfVEVYX0VOVl9NT0RFX01PRFVMQVRFOgotICAgICAgICAgICAgZ2xUZXhFbnZmKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9NT0RVTEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU19URVhfRU5WX01PREVfREVDQUw6Ci0gICAgICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0RFQ0FMKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TYW1wbGVyc1tjdF0uZ2V0KCkpIHsKLSAgICAgICAgICAgIG1TYW1wbGVyc1tjdF0tPnNldHVwR0wocnNjLCBtVGV4dHVyZXNbY3RdLT5nZXRUeXBlKCktPmdldElzTnAyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICAgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdyb3NzIGhhY2suCi0gICAgICAgIGlmIChjdCA9PSAyKSB7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkUpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfUkdCLCBHTF9BREQpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMwX1JHQiwgR0xfUFJFVklPVVMpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9TUkMxX1JHQiwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX1JHQiwgR0xfU1JDX0NPTE9SKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfT1BFUkFORDFfUkdCLCBHTF9TUkNfQ09MT1IpOwotCi0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX0NPTUJJTkVfQUxQSEEsIEdMX0FERCk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX1NSQzBfQUxQSEEsIEdMX1BSRVZJT1VTKTsKLSAgICAgICAgICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfU1JDMV9BTFBIQSwgR0xfVEVYVFVSRSk7Ci0gICAgICAgICAgICBnbFRleEVudmkoR0xfVEVYVFVSRV9FTlYsIEdMX09QRVJBTkQwX0FMUEhBLCBHTF9TUkNfQUxQSEEpOwotICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9PUEVSQU5EMV9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIG1EaXJ0eSA9IGZhbHNlOwotICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMIik7CiB9CiAKIHZvaWQgUHJvZ3JhbUZyYWdtZW50OjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1GcmFnbWVudFN0YXRlICpzdGF0ZSwgU2hhZGVyQ2FjaGUgKnNjKQpAQCAtMTQ0LDExICsxMDgsMjIgQEAKIAogICAgIC8vTE9HRSgic2dsMiBmcmFnMSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwogCiAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHN0YXJ0Iik7CisKKyAgICBpZiAoIW1WYXJ5aW5nQ29sb3IgJiYKKyAgICAgICAgKHNjLT5mcmFnVW5pZm9ybVNsb3QobUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXgpID49IDApKSB7CisgICAgICAgIC8vTE9HRSgibUNvbnN0YW50Q29sb3JVbmlmb3JtSW5kZXggJWkgJWkiLCBtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCwgc2MtPmZyYWdVbmlmb3JtU2xvdChtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCkpOworICAgICAgICBnbFVuaWZvcm00ZnYoc2MtPmZyYWdVbmlmb3JtU2xvdChtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCksIDEsIG1Db25zdGFudENvbG9yKTsKKyAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OmNvbG9yIHNldHVwIik7CisgICAgfQorCisgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIGJlZ2luIHVuaWZvcm1zIik7CisgICAgc2V0dXBVc2VyQ29uc3RhbnRzKHNjLCB0cnVlKTsKKwogICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBNQVhfVEVYVFVSRTsgY3QrKykgewogICAgICAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyBjdCk7CiAgICAgICAgIGlmICghKG1UZXh0dXJlRW5hYmxlTWFzayAmICgxIDw8IGN0KSkgfHwgIW1UZXh0dXJlc1tjdF0uZ2V0KCkpIHsKQEAgLTE2OCw3ICsxNDMsNyBAQAogICAgICAgICAgICAgcnNjLT5jaGVja0Vycm9yKCJQcm9ncmFtRnJhZ21lbnQ6OnNldHVwR0wyIHRleCBlbnYiKTsKICAgICAgICAgfQogCi0gICAgICAgIGdsVW5pZm9ybTFpKHNjLT5mcmFnVW5pZm9ybVNsb3QoY3QpLCBjdCk7CisgICAgICAgIGdsVW5pZm9ybTFpKHNjLT5mcmFnVW5pZm9ybVNsb3QobVRleHR1cmVVbmlmb3JtSW5kZXhTdGFydCArIGN0KSwgY3QpOwogICAgICAgICByc2MtPmNoZWNrRXJyb3IoIlByb2dyYW1GcmFnbWVudDo6c2V0dXBHTDIgdW5pZm9ybXMiKTsKICAgICB9CiAKQEAgLTE4NCwxNiArMTU5LDE3IEBACiB2b2lkIFByb2dyYW1GcmFnbWVudDo6Y3JlYXRlU2hhZGVyKCkKIHsKICAgICBtU2hhZGVyLnNldFRvKCJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIpOwotICAgIG1TaGFkZXIuYXBwZW5kKCJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iKTsKKyAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyBsb3dwIHZlYzQgdmFyQ29sb3I7XG4iKTsKICAgICBtU2hhZGVyLmFwcGVuZCgidmFyeWluZyB2ZWM0IHZhclRleDA7XG4iKTsKKyAgICBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IHVuaV9Db2xvcjtcbiIpOwogCiAgICAgaWYgKG1Vc2VyU2hhZGVyLmxlbmd0aCgpID4gMSkgeworICAgICAgICBhcHBlbmRVc2VyQ29uc3RhbnRzKCk7CiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtVGV4dHVyZUNvdW50OyBjdCsrKSB7CiAgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOwogICAgICAgICAgICAgc3ByaW50ZihidWYsICJ1bmlmb3JtIHNhbXBsZXIyRCB1bmlfVGV4JWk7XG4iLCBjdCk7CiAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZChidWYpOwogICAgICAgICB9Ci0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHVpbnQzMl90IG1hc2sgPSBtVGV4dHVyZUVuYWJsZU1hc2s7CkBAIC0yMTIsNyArMTg4LDExIEBACiAKIAogICAgICAgICBtU2hhZGVyLmFwcGVuZCgidm9pZCBtYWluKCkge1xuIik7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIHZlYzQgY29sID0gdmFyQ29sb3I7XG4iKTsKKyAgICAgICAgaWYgKG1WYXJ5aW5nQ29sb3IpIHsKKyAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCIgIGxvd3AgdmVjNCBjb2wgPSB2YXJDb2xvcjtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgbG93cCB2ZWM0IGNvbCA9IHVuaV9Db2xvcjtcbiIpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UZXh0dXJlRW5hYmxlTWFzaykgewogICAgICAgICAgICAgaWYgKG1Qb2ludFNwcml0ZUVuYWJsZSkgewpAQCAtMjgyLDEzICsyNjIsMzQgQEAKIAogdm9pZCBQcm9ncmFtRnJhZ21lbnQ6OmluaXQoQ29udGV4dCAqcnNjKQogewotICAgIG1Vbmlmb3JtQ291bnQgPSAyOwotICAgIG1Vbmlmb3JtTmFtZXNbMF0uc2V0VG8oInVuaV9UZXgwIik7Ci0gICAgbVVuaWZvcm1OYW1lc1sxXS5zZXRUbygidW5pX1RleDEiKTsKKyAgICBtVW5pZm9ybUNvdW50ID0gMDsKKyAgICAvL2lmICghbVZhcnlpbmdDb2xvcikgeworICAgICAgICBtQ29uc3RhbnRDb2xvclVuaWZvcm1JbmRleCA9IG1Vbmlmb3JtQ291bnQ7CisgICAgICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbygidW5pX0NvbG9yIik7CisgICAgLy99CisKKyAgICBpZiAobVVzZXJTaGFkZXIuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKKyAgICAgICAgICAgIGluaXRBZGRVc2VyRWxlbWVudChtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKSwgbVVuaWZvcm1OYW1lcywgJm1Vbmlmb3JtQ291bnQsICJVTklfIik7CisgICAgICAgIH0KKyAgICB9CisgICAgbVRleHR1cmVVbmlmb3JtSW5kZXhTdGFydCA9IG1Vbmlmb3JtQ291bnQ7CisgICAgbVVuaWZvcm1OYW1lc1ttVW5pZm9ybUNvdW50KytdLnNldFRvKCJ1bmlfVGV4MCIpOworICAgIG1Vbmlmb3JtTmFtZXNbbVVuaWZvcm1Db3VudCsrXS5zZXRUbygidW5pX1RleDEiKTsKIAogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1GcmFnbWVudDo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKworfQorCitQcm9ncmFtRnJhZ21lbnQgKlByb2dyYW1GcmFnbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogUHJvZ3JhbUZyYWdtZW50U3RhdGU6OlByb2dyYW1GcmFnbWVudFN0YXRlKCkKIHsKICAgICBtUEYgPSBOVUxMOwpAQCAtMzAwLDE2ICszMDEsMTUgQEAKIAogfQogCi12b2lkIFByb2dyYW1GcmFnbWVudFN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1GcmFnbWVudFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKLSAgICB1aW50MzJfdCB0bXBbNV0gPSB7CisgICAgdWludDMyX3QgdG1wW10gPSB7CiAgICAgICAgIFJTX1RFWF9FTlZfTU9ERV9OT05FLCAwLAogICAgICAgICBSU19URVhfRU5WX01PREVfTk9ORSwgMCwKLSAgICAgICAgMAorICAgICAgICAwLCAwCiAgICAgfTsKLSAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHRtcCwgNSk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IG5ldyBQcm9ncmFtRnJhZ21lbnQocnNjLCB0bXAsIDYpOwogICAgIG1EZWZhdWx0LnNldChwZik7Ci0gICAgcGYtPmluaXQocnNjKTsKIH0KIAogdm9pZCBQcm9ncmFtRnJhZ21lbnRTdGF0ZTo6ZGVpbml0KENvbnRleHQgKnJzYykKQEAgLTMyOCw2ICszMjgsNyBAQAogewogICAgIFByb2dyYW1GcmFnbWVudCAqcGYgPSBuZXcgUHJvZ3JhbUZyYWdtZW50KHJzYywgcGFyYW1zLCBwYXJhbUxlbmd0aCk7CiAgICAgcGYtPmluY1VzZXJSZWYoKTsKKyAgICAvL0xPR0UoInJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgJXAiLCBwZik7CiAgICAgcmV0dXJuIHBmOwogfQogCkBAIC0zMzcsNiArMzM4LDcgQEAKIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHNoYWRlclRleHQsIHNoYWRlckxlbmd0aCwgcGFyYW1zLCBwYXJhbUxlbmd0aCk7CiAgICAgcGYtPmluY1VzZXJSZWYoKTsKKyAgICAvL0xPR0UoInJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUyICVwIiwgcGYpOwogICAgIHJldHVybiBwZjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oIGIvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudC5oCmluZGV4IDlmYTU2NWQuLmYwOGJiMjUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuaAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmgKQEAgLTQwLDYgKzQwLDExIEBACiAgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVNoYWRlcigpOwogICAgIHZpcnR1YWwgdm9pZCBsb2FkU2hhZGVyKENvbnRleHQgKnJzYyk7CiAgICAgdmlydHVhbCB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX0ZSQUdNRU5UOyB9CisgICAgc3RhdGljIFByb2dyYW1GcmFnbWVudCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICB2b2lkIHNldENvbnN0YW50Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gSGFja3MgdG8gY3JlYXRlIGEgcHJvZ3JhbSBmb3Igbm93CkBAIC00OCw2ICs1MywxMSBAQAogICAgIFJzVGV4RW52TW9kZSBtRW52TW9kZXNbTUFYX1RFWFRVUkVdOwogICAgIHVpbnQzMl90IG1UZXh0dXJlRW5hYmxlTWFzazsKICAgICBib29sIG1Qb2ludFNwcml0ZUVuYWJsZTsKKyAgICBib29sIG1WYXJ5aW5nQ29sb3I7CisKKyAgICBmbG9hdCBtQ29uc3RhbnRDb2xvcls0XTsKKyAgICBpbnQzMl90IG1Db25zdGFudENvbG9yVW5pZm9ybUluZGV4OworICAgIGludDMyX3QgbVRleHR1cmVVbmlmb3JtSW5kZXhTdGFydDsKIH07CiAKIGNsYXNzIFByb2dyYW1GcmFnbWVudFN0YXRlCkBAIC01Nyw3ICs2Nyw3IEBACiAgICAgflByb2dyYW1GcmFnbWVudFN0YXRlKCk7CiAKICAgICBQcm9ncmFtRnJhZ21lbnQgKm1QRjsKLSAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCk7CisgICAgdm9pZCBpbml0KENvbnRleHQgKnJzYyk7CiAgICAgdm9pZCBkZWluaXQoQ29udGV4dCAqcnNjKTsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbVRleHR1cmVUeXBlc1tQcm9ncmFtRnJhZ21lbnQ6Ok1BWF9URVhUVVJFXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIxNTdmLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnRTdG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyc0NvbnRleHQuaCIKLSNpbmNsdWRlICJyc1Byb2dyYW1GcmFnbWVudFN0b3JlLmgiCi0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7Ci0KLQotUHJvZ3JhbUZyYWdtZW50U3RvcmU6OlByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKnJzYykgOgotICAgIFByb2dyYW0ocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci0gICAgbURpdGhlckVuYWJsZSA9IHRydWU7Ci0gICAgbUJsZW5kRW5hYmxlID0gZmFsc2U7Ci0gICAgbUNvbG9yUldyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQ29sb3JHV3JpdGVFbmFibGUgPSB0cnVlOwotICAgIG1Db2xvckJXcml0ZUVuYWJsZSA9IHRydWU7Ci0gICAgbUNvbG9yQVdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLQotCi0gICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gdHJ1ZTsKLSAgICBtRGVwdGhGdW5jID0gR0xfTEVTUzsKLQotCi19Ci0KLVByb2dyYW1GcmFnbWVudFN0b3JlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKQotewotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXR1cEdMKGNvbnN0IENvbnRleHQgKnJzYywgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqc3RhdGUpCi17Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKLQotICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7Ci0gICAgaWYgKG1CbGVuZEVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIH0KLQotICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOwotCi0gICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOwotICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKLSAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci0KLSAgICBpZiAobURpdGhlckVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICpzdGF0ZSkKLXsKLSAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwotCi0gICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAotICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKLSAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCi0gICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKLSAgICBpZiAobUJsZW5kRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgfQotCi0gICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7Ci0KLSAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7Ci0gICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgewotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOwotICAgIH0KLQotICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7Ci0gICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgfQotfQotCi0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERpdGhlckVuYWJsZShib29sIGVuYWJsZSkKLXsKLSAgICBtRGl0aGVyRW5hYmxlID0gZW5hYmxlOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKLXsKLSAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKLQotICAgIHN3aXRjaChmdW5jKSB7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKLSAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6Ci0gICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgotICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKLSAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgUHJvZ3JhbUZyYWdtZW50U3RvcmU6OnNldERlcHRoTWFzayhib29sIG1hc2spCi17Ci0gICAgbURlcHRoV3JpdGVFbmFibGUgPSBtYXNrOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlOjpzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCi17Ci0gICAgbUJsZW5kRW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoKHNyYyA9PSBSU19CTEVORF9TUkNfT05FKSAmJgotICAgICAgICAoZHN0ID09IFJTX0JMRU5EX0RTVF9aRVJPKSkgewotICAgICAgICBtQmxlbmRFbmFibGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc3JjKSB7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfWkVSTzoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX0RTVF9DT0xPUjoKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfRFNUX0NPTE9SOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX1NSQ19TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQV9TQVRVUkFURToKLSAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBX1NBVFVSQVRFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZHN0KSB7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfWkVSTzoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfWkVSTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19DT0xPUjoKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0NPTE9SOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJTX0JMRU5EX0RTVF9TUkNfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX1NSQ19BTFBIQToKLSAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX1NSQ19BTFBIQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU19CTEVORF9EU1RfRFNUX0FMUEhBOgotICAgICAgICBtQmxlbmREc3QgPSBHTF9EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19EU1RfQUxQSEE6Ci0gICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19EU1RfQUxQSEE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKLXsKLSAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOwotICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7Ci0gICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKLSAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOwotfQotCi0KLVByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OlByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKQotewotICAgIG1QRlMgPSBOVUxMOwotfQotCi1Qcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjp+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpCi17Ci0gICAgZGVsZXRlIG1QRlM7Ci0KLX0KLQotdm9pZCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCi17Ci0gICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKnBmcyA9IG5ldyBQcm9ncmFtRnJhZ21lbnRTdG9yZShyc2MpOwotICAgIG1EZWZhdWx0LnNldChwZnMpOwotfQotCi12b2lkIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGU6OmRlaW5pdChDb250ZXh0ICpyc2MpCi17Ci0gICAgbURlZmF1bHQuY2xlYXIoKTsKLSAgICBtTGFzdC5jbGVhcigpOwotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZUJlZ2luKENvbnRleHQgKiByc2MsIFJzRWxlbWVudCBpbiwgUnNFbGVtZW50IG91dCkKLXsKLSAgICBkZWxldGUgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSBuZXcgUHJvZ3JhbUZyYWdtZW50U3RvcmUocnNjKTsKLQotfQotCi12b2lkIHJzaV9Qcm9ncmFtRnJhZ21lbnRTdG9yZURlcHRoRnVuYyhDb250ZXh0ICpyc2MsIFJzRGVwdGhGdW5jIGZ1bmMpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEZXB0aE1hc2soQ29udGV4dCAqcnNjLCBib29sIG1hc2spCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldERlcHRoTWFzayhtYXNrKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCi17Ci0gICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVCbGVuZEZ1bmMoQ29udGV4dCAqcnNjLCBSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0QmxlbmRGdW5jKHNyYywgZHN0KTsKLX0KLQotUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQotewotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICpwZnMgPSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKLSAgICBwZnMtPmluY1VzZXJSZWYoKTsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IDA7Ci0gICAgcmV0dXJuIHBmczsKLX0KLQotdm9pZCByc2lfUHJvZ3JhbUZyYWdtZW50U3RvcmVEaXRoZXIoQ29udGV4dCAqcnNjLCBib29sIGVuYWJsZSkKLXsKLSAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGl0aGVyRW5hYmxlKGVuYWJsZSk7Ci19Ci0KLQotfQotfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1GcmFnbWVudFN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxMmM5OS4uMDAwMDAwMAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50U3RvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0jZGVmaW5lIEFORFJPSURfUlNfUFJPR1JBTV9GUkFHTUVOVF9TVE9SRV9ICi0KLSNpbmNsdWRlICJyc1Byb2dyYW0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmUgOiBwdWJsaWMgUHJvZ3JhbQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlKENvbnRleHQgKik7Ci0gICAgdmlydHVhbCB+UHJvZ3JhbUZyYWdtZW50U3RvcmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMKGNvbnN0IENvbnRleHQgKiwgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSAqKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtRnJhZ21lbnRTdG9yZVN0YXRlICopOwotCi0gICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOwotICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOwotCi0gICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOwotICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOwotCi0gICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7Ci0KLXByb3RlY3RlZDoKLSAgICBib29sIG1EaXRoZXJFbmFibGU7Ci0KLSAgICBib29sIG1CbGVuZEVuYWJsZTsKLSAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKLSAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKLSAgICBpbnQzMl90IG1CbGVuZFNyYzsKLSAgICBpbnQzMl90IG1CbGVuZERzdDsKLQotICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKLSAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOwotICAgIGludDMyX3QgbURlcHRoRnVuYzsKLQotICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOwotfTsKLQotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZQotewotcHVibGljOgotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlU3RhdGUoKTsKLSAgICB+UHJvZ3JhbUZyYWdtZW50U3RvcmVTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKLSAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwotCi0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbURlZmF1bHQ7Ci0gICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnRTdG9yZT4gbUxhc3Q7Ci0KLQotICAgIFByb2dyYW1GcmFnbWVudFN0b3JlICptUEZTOwotfTsKLQotCi19Ci19Ci0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmNwcAppbmRleCAxMzg4N2QxLi41YjY5MzcwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5jcHAKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuY3BwCkBAIC0xNCwxMSArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVJhc3Rlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC0zNSw5ICs0MSw4IEBACiAgICAgbVBvaW50U21vb3RoID0gcG9pbnRTbW9vdGg7CiAgICAgbUxpbmVTbW9vdGggPSBsaW5lU21vb3RoOwogICAgIG1Qb2ludFNwcml0ZSA9IHBvaW50U3ByaXRlOwotCi0gICAgbVBvaW50U2l6ZSA9IDEuMGY7CiAgICAgbUxpbmVXaWR0aCA9IDEuMGY7CisgICAgbUN1bGwgPSBSU19DVUxMX0JBQ0s7CiB9CiAKIFByb2dyYW1SYXN0ZXI6On5Qcm9ncmFtUmFzdGVyKCkKQEAgLTQ3LDIxICs1MiwyMyBAQAogdm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRMaW5lV2lkdGgoZmxvYXQgcykKIHsKICAgICBtTGluZVdpZHRoID0gczsKKyAgICBtRGlydHkgPSB0cnVlOwogfQogCi12b2lkIFByb2dyYW1SYXN0ZXI6OnNldFBvaW50U2l6ZShmbG9hdCBzKQordm9pZCBQcm9ncmFtUmFzdGVyOjpzZXRDdWxsTW9kZShSc0N1bGxNb2RlIG1vZGUpCiB7Ci0gICAgbVBvaW50U2l6ZSA9IHM7CisgICAgbUN1bGwgPSBtb2RlOworICAgIG1EaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1SYXN0ZXJTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzICYmICFtRGlydHkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworICAgIG1EaXJ0eSA9IGZhbHNlOwogCi0gICAgZ2xQb2ludFNpemUobVBvaW50U2l6ZSk7CiAgICAgaWYgKG1Qb2ludFNtb290aCkgewogICAgICAgICBnbEVuYWJsZShHTF9QT0lOVF9TTU9PVEgpOwogICAgIH0gZWxzZSB7CkBAIC03NiwyMyArODMsNjIgQEAKICAgICB9CiAKICAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24xXzEoKSkgeworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAgICAgICAgIGlmIChtUG9pbnRTcHJpdGUpIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1BPSU5UX1NQUklURV9PRVMpOwogICAgICAgICB9CisjZW5kaWYgLy9BTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisgICAgfQorCisgICAgc3dpdGNoKG1DdWxsKSB7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9CQUNLOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfQkFDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19DVUxMX0ZST05UOgorICAgICAgICAgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKyAgICAgICAgICAgIGdsQ3VsbEZhY2UoR0xfRlJPTlQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9OT05FOgorICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKIHZvaWQgUHJvZ3JhbVJhc3Rlcjo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtUmFzdGVyU3RhdGUgKnN0YXRlKQogewotICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgeworICAgIGlmIChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcyAmJiAhbURpcnR5KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKyAgICBtRGlydHkgPSBmYWxzZTsKKworICAgIHN3aXRjaChtQ3VsbCkgeworICAgICAgICBjYXNlIFJTX0NVTExfQkFDSzoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0JBQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ1VMTF9GUk9OVDoKKyAgICAgICAgICAgIGdsRW5hYmxlKEdMX0NVTExfRkFDRSk7CisgICAgICAgICAgICBnbEN1bGxGYWNlKEdMX0ZST05UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJTX0NVTExfTk9ORToKKyAgICAgICAgICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQogfQogCit2b2lkIFByb2dyYW1SYXN0ZXI6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CiAKK30KKworUHJvZ3JhbVJhc3RlciAqUHJvZ3JhbVJhc3Rlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KIAogUHJvZ3JhbVJhc3RlclN0YXRlOjpQcm9ncmFtUmFzdGVyU3RhdGUoKQogewpAQCAtMTAyLDcgKzE0OCw3IEBACiB7CiB9CiAKLXZvaWQgUHJvZ3JhbVJhc3RlclN0YXRlOjppbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpCit2b2lkIFByb2dyYW1SYXN0ZXJTdGF0ZTo6aW5pdChDb250ZXh0ICpyc2MpCiB7CiAgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBuZXcgUHJvZ3JhbVJhc3Rlcihyc2MsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgIG1EZWZhdWx0LnNldChwcik7CkBAIC0xMTgsNyArMTY0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCi1Sc1Byb2dyYW1SYXN0ZXIgcnNpX1Byb2dyYW1SYXN0ZXJDcmVhdGUoQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0LAorUnNQcm9ncmFtUmFzdGVyIHJzaV9Qcm9ncmFtUmFzdGVyQ3JlYXRlKENvbnRleHQgKiByc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRTbW9vdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGluZVNtb290aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludFNwcml0ZSkKQEAgLTEzMSwxOCArMTc3LDE4IEBACiAgICAgcmV0dXJuIHByOwogfQogCi12b2lkIHJzaV9Qcm9ncmFtUmFzdGVyU2V0UG9pbnRTaXplKENvbnRleHQgKiByc2MsIFJzUHJvZ3JhbVJhc3RlciB2cHIsIGZsb2F0IHMpCi17Ci0gICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7Ci0gICAgcHItPnNldFBvaW50U2l6ZShzKTsKLX0KLQogdm9pZCByc2lfUHJvZ3JhbVJhc3RlclNldExpbmVXaWR0aChDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBmbG9hdCBzKQogewogICAgIFByb2dyYW1SYXN0ZXIgKnByID0gc3RhdGljX2Nhc3Q8UHJvZ3JhbVJhc3RlciAqPih2cHIpOwogICAgIHByLT5zZXRMaW5lV2lkdGgocyk7CiB9CiAKK3ZvaWQgcnNpX1Byb2dyYW1SYXN0ZXJTZXRDdWxsTW9kZShDb250ZXh0ICogcnNjLCBSc1Byb2dyYW1SYXN0ZXIgdnByLCBSc0N1bGxNb2RlIG1vZGUpCit7CisgICAgUHJvZ3JhbVJhc3RlciAqcHIgPSBzdGF0aWNfY2FzdDxQcm9ncmFtUmFzdGVyICo+KHZwcik7CisgICAgcHItPnNldEN1bGxNb2RlKG1vZGUpOworfQorCiAKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmggYi9saWJzL3JzL3JzUHJvZ3JhbVJhc3Rlci5oCmluZGV4IGMzYTljOTAuLjgwMWFiMmEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtUmFzdGVyLmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1SYXN0ZXIuaApAQCAtMzYsMTkgKzM2LDE5IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1SYXN0ZXJTdGF0ZSAqKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTDIoY29uc3QgQ29udGV4dCAqLCBQcm9ncmFtUmFzdGVyU3RhdGUgKik7CisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9SQVNURVI7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVJhc3RlciAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2b2lkIHNldExpbmVXaWR0aChmbG9hdCB3KTsKLSAgICB2b2lkIHNldFBvaW50U2l6ZShmbG9hdCBzKTsKKyAgICB2b2lkIHNldEN1bGxNb2RlKFJzQ3VsbE1vZGUgbW9kZSk7CiAKIHByb3RlY3RlZDoKICAgICBib29sIG1Qb2ludFNtb290aDsKICAgICBib29sIG1MaW5lU21vb3RoOwogICAgIGJvb2wgbVBvaW50U3ByaXRlOwotCi0gICAgZmxvYXQgbVBvaW50U2l6ZTsKICAgICBmbG9hdCBtTGluZVdpZHRoOwotCi0KKyAgICBSc0N1bGxNb2RlIG1DdWxsOwogfTsKIAogY2xhc3MgUHJvZ3JhbVJhc3RlclN0YXRlCkBAIC01Niw3ICs1Niw3IEBACiBwdWJsaWM6CiAgICAgUHJvZ3JhbVJhc3RlclN0YXRlKCk7CiAgICAgflByb2dyYW1SYXN0ZXJTdGF0ZSgpOwotICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgICB2b2lkIGluaXQoQ29udGV4dCAqcnNjKTsKICAgICB2b2lkIGRlaW5pdChDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtRGVmYXVsdDsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1TdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuY3BwCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR2wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKworI2luY2x1ZGUgInJzUHJvZ3JhbVN0b3JlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitQcm9ncmFtU3RvcmU6OlByb2dyYW1TdG9yZShDb250ZXh0ICpyc2MpIDoKKyAgICBQcm9ncmFtKHJzYykKK3sKKyAgICBtQWxsb2NGaWxlID0gX19GSUxFX187CisgICAgbUFsbG9jTGluZSA9IF9fTElORV9fOworICAgIG1EaXRoZXJFbmFibGUgPSB0cnVlOworICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIG1Db2xvclJXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUNvbG9yR1dyaXRlRW5hYmxlID0gdHJ1ZTsKKyAgICBtQ29sb3JCV3JpdGVFbmFibGUgPSB0cnVlOworICAgIG1Db2xvckFXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbUJsZW5kU3JjID0gR0xfT05FOworICAgIG1CbGVuZERzdCA9IEdMX1pFUk87CisKKworICAgIG1EZXB0aFRlc3RFbmFibGUgPSBmYWxzZTsKKyAgICBtRGVwdGhXcml0ZUVuYWJsZSA9IHRydWU7CisgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisKKworfQorCitQcm9ncmFtU3RvcmU6On5Qcm9ncmFtU3RvcmUoKQoreworfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1TdG9yZVN0YXRlICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPm1MYXN0LmdldCgpID09IHRoaXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOworCisgICAgZ2xDb2xvck1hc2sobUNvbG9yUldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckdXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JCV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQVdyaXRlRW5hYmxlKTsKKyAgICBpZiAobUJsZW5kRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMobUJsZW5kU3JjLCBtQmxlbmREc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgfQorCisgICAgLy9MT0dFKCJwZnMgICVpLCAlaSwgJXgiLCBtRGVwdGhXcml0ZUVuYWJsZSwgbURlcHRoVGVzdEVuYWJsZSwgbURlcHRoRnVuYyk7CisKKyAgICBnbERlcHRoTWFzayhtRGVwdGhXcml0ZUVuYWJsZSk7CisgICAgaWYobURlcHRoVGVzdEVuYWJsZSB8fCBtRGVwdGhXcml0ZUVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICAgICAgZ2xEZXB0aEZ1bmMobURlcHRoRnVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIH0KKworICAgIGlmIChtRGl0aGVyRW5hYmxlKSB7CisgICAgICAgIGdsRW5hYmxlKEdMX0RJVEhFUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0dXBHTDIoY29uc3QgQ29udGV4dCAqcnNjLCBQcm9ncmFtU3RvcmVTdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5tTGFzdC5nZXQoKSA9PSB0aGlzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RhdGUtPm1MYXN0LnNldCh0aGlzKTsKKworICAgIGdsQ29sb3JNYXNrKG1Db2xvclJXcml0ZUVuYWJsZSwKKyAgICAgICAgICAgICAgICBtQ29sb3JHV3JpdGVFbmFibGUsCisgICAgICAgICAgICAgICAgbUNvbG9yQldyaXRlRW5hYmxlLAorICAgICAgICAgICAgICAgIG1Db2xvckFXcml0ZUVuYWJsZSk7CisgICAgaWYgKG1CbGVuZEVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKG1CbGVuZFNyYywgbUJsZW5kRHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIH0KKworICAgIC8vTE9HRSgicGZzICAlaSwgJWksICV4IiwgbURlcHRoV3JpdGVFbmFibGUsIG1EZXB0aFRlc3RFbmFibGUsIG1EZXB0aEZ1bmMpOworCisgICAgZ2xEZXB0aE1hc2sobURlcHRoV3JpdGVFbmFibGUpOworICAgIGlmKG1EZXB0aFRlc3RFbmFibGUgfHwgbURlcHRoV3JpdGVFbmFibGUpIHsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRGVwdGhGdW5jKG1EZXB0aEZ1bmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKKyAgICB9CisKKyAgICBpZiAobURpdGhlckVuYWJsZSkgeworICAgICAgICBnbEVuYWJsZShHTF9ESVRIRVIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgIH0KK30KKworCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0RGl0aGVyRW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIG1EaXRoZXJFbmFibGUgPSBlbmFibGU7Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworCit9CisKK1Byb2dyYW1TdG9yZSAqUHJvZ3JhbVN0b3JlOjpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKQoreworICAgIHJldHVybiBOVUxMOworfQorCisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMgZnVuYykKK3sKKyAgICBtRGVwdGhUZXN0RW5hYmxlID0gdHJ1ZTsKKworICAgIHN3aXRjaChmdW5jKSB7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0FMV0FZUzoKKyAgICAgICAgbURlcHRoVGVzdEVuYWJsZSA9IGZhbHNlOworICAgICAgICBtRGVwdGhGdW5jID0gR0xfQUxXQVlTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0RFUFRIX0ZVTkNfTEVTUzoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0xFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19MRVFVQUw6CisgICAgICAgIG1EZXB0aEZ1bmMgPSBHTF9MRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19HUkVBVEVSOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfR1JFQVRFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0dFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX0dFUVVBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19ERVBUSF9GVU5DX0VRVUFMOgorICAgICAgICBtRGVwdGhGdW5jID0gR0xfRVFVQUw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfREVQVEhfRlVOQ19OT1RFUVVBTDoKKyAgICAgICAgbURlcHRoRnVuYyA9IEdMX05PVEVRVUFMOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlOjpzZXREZXB0aE1hc2soYm9vbCBtYXNrKQoreworICAgIG1EZXB0aFdyaXRlRW5hYmxlID0gbWFzazsKK30KKwordm9pZCBQcm9ncmFtU3RvcmU6OnNldEJsZW5kRnVuYyhSc0JsZW5kU3JjRnVuYyBzcmMsIFJzQmxlbmREc3RGdW5jIGRzdCkKK3sKKyAgICBtQmxlbmRFbmFibGUgPSB0cnVlOworICAgIGlmICgoc3JjID09IFJTX0JMRU5EX1NSQ19PTkUpICYmCisgICAgICAgIChkc3QgPT0gUlNfQkxFTkRfRFNUX1pFUk8pKSB7CisgICAgICAgIG1CbGVuZEVuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChzcmMpIHsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19aRVJPOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkU6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfRFNUX0NPTE9SOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX09ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfU1JDX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX1NSQ19EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZFNyYyA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kU3JjID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9TUkNfU1JDX0FMUEhBX1NBVFVSQVRFOgorICAgICAgICBtQmxlbmRTcmMgPSBHTF9TUkNfQUxQSEFfU0FUVVJBVEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChkc3QpIHsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9aRVJPOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9aRVJPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkU6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfU1JDX0NPTE9SOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX09ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlNfQkxFTkRfRFNUX1NSQ19BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgICBtQmxlbmREc3QgPSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJTX0JMRU5EX0RTVF9EU1RfQUxQSEE6CisgICAgICAgIG1CbGVuZERzdCA9IEdMX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSU19CTEVORF9EU1RfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICAgICAgbUJsZW5kRHN0ID0gR0xfT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIFByb2dyYW1TdG9yZTo6c2V0Q29sb3JNYXNrKGJvb2wgciwgYm9vbCBnLCBib29sIGIsIGJvb2wgYSkKK3sKKyAgICBtQ29sb3JSV3JpdGVFbmFibGUgPSByOworICAgIG1Db2xvckdXcml0ZUVuYWJsZSA9IGc7CisgICAgbUNvbG9yQldyaXRlRW5hYmxlID0gYjsKKyAgICBtQ29sb3JBV3JpdGVFbmFibGUgPSBhOworfQorCisKK1Byb2dyYW1TdG9yZVN0YXRlOjpQcm9ncmFtU3RvcmVTdGF0ZSgpCit7CisgICAgbVBGUyA9IE5VTEw7Cit9CisKK1Byb2dyYW1TdG9yZVN0YXRlOjp+UHJvZ3JhbVN0b3JlU3RhdGUoKQoreworICAgIGRlbGV0ZSBtUEZTOworCit9CisKK3ZvaWQgUHJvZ3JhbVN0b3JlU3RhdGU6OmluaXQoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gbmV3IFByb2dyYW1TdG9yZShyc2MpOworICAgIG1EZWZhdWx0LnNldChwZnMpOworfQorCit2b2lkIFByb2dyYW1TdG9yZVN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQoreworICAgIG1EZWZhdWx0LmNsZWFyKCk7CisgICAgbUxhc3QuY2xlYXIoKTsKK30KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmVnaW4oQ29udGV4dCAqIHJzYywgUnNFbGVtZW50IGluLCBSc0VsZW1lbnQgb3V0KQoreworICAgIGRlbGV0ZSByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUzsKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUyA9IG5ldyBQcm9ncmFtU3RvcmUocnNjKTsKKworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVEZXB0aEZ1bmMoQ29udGV4dCAqcnNjLCBSc0RlcHRoRnVuYyBmdW5jKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREZXB0aEZ1bmMoZnVuYyk7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURlcHRoTWFzayhDb250ZXh0ICpyc2MsIGJvb2wgbWFzaykKK3sKKyAgICByc2MtPm1TdGF0ZUZyYWdtZW50U3RvcmUubVBGUy0+c2V0RGVwdGhNYXNrKG1hc2spOworfQorCit2b2lkIHJzaV9Qcm9ncmFtU3RvcmVDb2xvck1hc2soQ29udGV4dCAqcnNjLCBib29sIHIsIGJvb2wgZywgYm9vbCBiLCBib29sIGEpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldENvbG9yTWFzayhyLCBnLCBiLCBhKTsKK30KKwordm9pZCByc2lfUHJvZ3JhbVN0b3JlQmxlbmRGdW5jKENvbnRleHQgKnJzYywgUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpCit7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMtPnNldEJsZW5kRnVuYyhzcmMsIGRzdCk7Cit9CisKK1JzUHJvZ3JhbVN0b3JlIHJzaV9Qcm9ncmFtU3RvcmVDcmVhdGUoQ29udGV4dCAqcnNjKQoreworICAgIFByb2dyYW1TdG9yZSAqcGZzID0gcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlM7CisgICAgcGZzLT5pbmNVc2VyUmVmKCk7CisgICAgcnNjLT5tU3RhdGVGcmFnbWVudFN0b3JlLm1QRlMgPSAwOworICAgIHJldHVybiBwZnM7Cit9CisKK3ZvaWQgcnNpX1Byb2dyYW1TdG9yZURpdGhlcihDb250ZXh0ICpyc2MsIGJvb2wgZW5hYmxlKQoreworICAgIHJzYy0+bVN0YXRlRnJhZ21lbnRTdG9yZS5tUEZTLT5zZXREaXRoZXJFbmFibGUoZW5hYmxlKTsKK30KKworCit9Cit9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmggYi9saWJzL3JzL3JzUHJvZ3JhbVN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtU3RvcmUuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorI2RlZmluZSBBTkRST0lEX1JTX1BST0dSQU1fRlJBR01FTlRfU1RPUkVfSAorCisjaW5jbHVkZSAicnNQcm9ncmFtLmgiCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGU7CisKK2NsYXNzIFByb2dyYW1TdG9yZSA6IHB1YmxpYyBQcm9ncmFtCit7CitwdWJsaWM6CisgICAgUHJvZ3JhbVN0b3JlKENvbnRleHQgKik7CisgICAgdmlydHVhbCB+UHJvZ3JhbVN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICosIFByb2dyYW1TdG9yZVN0YXRlICopOworCisgICAgdm9pZCBzZXREZXB0aEZ1bmMoUnNEZXB0aEZ1bmMpOworICAgIHZvaWQgc2V0RGVwdGhNYXNrKGJvb2wpOworCisgICAgdm9pZCBzZXRCbGVuZEZ1bmMoUnNCbGVuZFNyY0Z1bmMgc3JjLCBSc0JsZW5kRHN0RnVuYyBkc3QpOworICAgIHZvaWQgc2V0Q29sb3JNYXNrKGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wpOworCisgICAgdm9pZCBzZXREaXRoZXJFbmFibGUoYm9vbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9QUk9HUkFNX1NUT1JFOyB9CisgICAgc3RhdGljIFByb2dyYW1TdG9yZSAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1EaXRoZXJFbmFibGU7CisKKyAgICBib29sIG1CbGVuZEVuYWJsZTsKKyAgICBib29sIG1Db2xvclJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckdXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckJXcml0ZUVuYWJsZTsKKyAgICBib29sIG1Db2xvckFXcml0ZUVuYWJsZTsKKyAgICBpbnQzMl90IG1CbGVuZFNyYzsKKyAgICBpbnQzMl90IG1CbGVuZERzdDsKKworICAgIGJvb2wgbURlcHRoVGVzdEVuYWJsZTsKKyAgICBib29sIG1EZXB0aFdyaXRlRW5hYmxlOworICAgIGludDMyX3QgbURlcHRoRnVuYzsKKworICAgIGJvb2wgbVN0ZW5jaWxUZXN0RW5hYmxlOworfTsKKworY2xhc3MgUHJvZ3JhbVN0b3JlU3RhdGUKK3sKK3B1YmxpYzoKKyAgICBQcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIH5Qcm9ncmFtU3RvcmVTdGF0ZSgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOworICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7CisKKyAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbURlZmF1bHQ7CisgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtU3RvcmU+IG1MYXN0OworCisKKyAgICBQcm9ncmFtU3RvcmUgKm1QRlM7Cit9OworCisKK30KK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCmluZGV4IGEyYjJkZjQuLjY4ZTM3MDUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcAorKysgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2lmbmRlZiBBTkRST0lEX1JTX0JVSUxEX0ZPUl9IT1NUCiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCi0jaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCi0KICNpbmNsdWRlIDxHTEVTL2dsLmg+CiAjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgPE9wZW5HTC9nbGV4dC5oPgorI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAorCisjaW5jbHVkZSAicnNQcm9ncmFtVmVydGV4LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKQEAgLTY0LDQ4ICs3MCw3IEBACiAKIHZvaWQgUHJvZ3JhbVZlcnRleDo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIFByb2dyYW1WZXJ0ZXhTdGF0ZSAqc3RhdGUpCiB7Ci0gICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXRlLT5tTGFzdC5zZXQodGhpcyk7Ci0KLSAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICBpZiAobVRleHR1cmVNYXRyaXhFbmFibGUpIHsKLSAgICAgICAgZ2xMb2FkTWF0cml4ZigmZltSU19QUk9HUkFNX1ZFUlRFWF9URVhUVVJFX09GRlNFVF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBpZiAobUxpZ2h0Q291bnQpIHsKLSAgICAgICAgaW50IHYgPSAwOwotICAgICAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgICAgIGdsTGlnaHRNb2RlbHh2KEdMX0xJR0hUX01PREVMX1RXT19TSURFLCAmdik7Ci0gICAgICAgIGZvciAodWludDMyX3QgY3QgPSAwOyBjdCA8IG1MaWdodENvdW50OyBjdCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBMaWdodCAqbCA9IG1MaWdodHNbY3RdLmdldCgpOwotICAgICAgICAgICAgZ2xFbmFibGUoR0xfTElHSFQwICsgY3QpOwotICAgICAgICAgICAgbC0+c2V0dXBHTChjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICh1aW50MzJfdCBjdCA9IG1MaWdodENvdW50OyBjdCA8IE1BWF9MSUdIVFM7IGN0KyspIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9MSUdIVDAgKyBjdCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotICAgIH0KLQotICAgIGlmICghZikgewotICAgICAgICBMT0dFKCJNdXN0IGJpbmQgY29uc3RhbnRzIHRvIHZlcnRleCBwcm9ncmFtIik7Ci0gICAgfQotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZE1hdHJpeGYoJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRNYXRyaXhmKCZmW1JTX1BST0dSQU1fVkVSVEVYX01PREVMVklFV19PRkZTRVRdKTsKLQotICAgIG1EaXJ0eSA9IGZhbHNlOworICAgIGFzc2VydCgwKTsKIH0KIAogdm9pZCBQcm9ncmFtVmVydGV4Ojpsb2FkU2hhZGVyKENvbnRleHQgKnJzYykgewpAQCAtMTI0LDMyICs4OSwxNyBAQAogICAgICAgICBtU2hhZGVyLmFwcGVuZChtVW5pZm9ybU5hbWVzWzBdKTsKICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwogCi0gICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtQ29uc3RhbnRDb3VudDsgY3QrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1Db25zdGFudFR5cGVzW2N0XS0+Z2V0RWxlbWVudCgpOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1lbnQgKmYgPSBlLT5nZXRGaWVsZChmaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDYW5ub3QgYmUgY29tcGxleAotICAgICAgICAgICAgICAgIHJzQXNzZXJ0KCFmLT5nZXRGaWVsZENvdW50KCkpOwotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIGZsb2F0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMyIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWMzIFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiBtU2hhZGVyLmFwcGVuZCgidW5pZm9ybSB2ZWM0IFVOSV8iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcnNBc3NlcnQoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoZS0+Z2V0RmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIjtcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgYXBwZW5kVXNlckNvbnN0YW50cygpOwogCiAgICAgICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtSW5wdXRDb3VudDsgY3QrKykgewogICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZSA9IG1JbnB1dEVsZW1lbnRzW2N0XS5nZXQoKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgZmllbGQ9MDsgZmllbGQgPCBlLT5nZXRGaWVsZENvdW50KCk7IGZpZWxkKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50ICpmID0gZS0+Z2V0RmllbGQoZmllbGQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZuID0gZS0+Z2V0RmllbGROYW1lKGZpZWxkKTsKKworICAgICAgICAgICAgICAgIGlmIChmblswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IGJlIGNvbXBsZXgKICAgICAgICAgICAgICAgICByc0Fzc2VydCghZi0+Z2V0RmllbGRDb3VudCgpKTsKQEAgLTE2MiwxNyArMTEyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGUtPmdldEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKGZuKTsKICAgICAgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiO1xuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVNoYWRlci5hcHBlbmQobVVzZXJTaGFkZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lDb2xvcjtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX0xlZ2FjeU5vcm1hbDtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIGZsb2F0IEFUVFJJQl9MZWdhY3lQb2ludFNpemU7XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJhdHRyaWJ1dGUgdmVjNCBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoImF0dHJpYnV0ZSB2ZWM0IEFUVFJJQl9jb2xvcjtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzMgQVRUUklCX25vcm1hbDtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiYXR0cmlidXRlIHZlYzQgQVRUUklCX3RleHR1cmUwO1xuIik7CiAKICAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Vbmlmb3JtQ291bnQ7IGN0KyspIHsKICAgICAgICAgICAgIG1TaGFkZXIuYXBwZW5kKCJ1bmlmb3JtIG1hdDQgIik7CkBAIC0xODEsMTggKzEzMCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgbVNoYWRlci5hcHBlbmQoInZvaWQgbWFpbigpIHtcbiIpOwotICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfTGVnYWN5UG9zaXRpb247XG4iKTsKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX0xlZ2FjeVBvaW50U2l6ZTtcbiIpOworICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgZ2xfUG9pbnRTaXplID0gMS4wO1xuIik7CiAKLSAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfTGVnYWN5Q29sb3I7XG4iKTsKKyAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iKTsKICAgICAgICAgaWYgKG1UZXh0dXJlTWF0cml4RW5hYmxlKSB7Ci0gICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gVU5JX1RleE1hdHJpeCAqIEFUVFJJQl90ZXh0dXJlMDtcbiIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNoYWRlci5hcHBlbmQoIiAgdmFyVGV4MCA9IEFUVFJJQl9MZWdhY3lUZXh0dXJlO1xuIik7CisgICAgICAgICAgICBtU2hhZGVyLmFwcGVuZCgiICB2YXJUZXgwID0gQVRUUklCX3RleHR1cmUwO1xuIik7CiAgICAgICAgIH0KLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueCA9IHBvcy54IC8gNDgwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBwb3MueSA9IHBvcy55IC8gODAwLjA7XG4iKTsKLSAgICAgICAgLy9tU2hhZGVyLmFwcGVuZCgiICBnbF9Qb3NpdGlvbiA9IHBvcztcbiIpOwogICAgICAgICBtU2hhZGVyLmFwcGVuZCgifVxuIik7CiAgICAgfQogfQpAQCAtMjAxLDExICsxNDcsMTAgQEAKIHsKICAgICAvL0xPR0UoInNnbDIgdnR4MSAleCIsIGdsR2V0RXJyb3IoKSk7CiAgICAgaWYgKChzdGF0ZS0+bUxhc3QuZ2V0KCkgPT0gdGhpcykgJiYgIW1EaXJ0eSkgewotICAgICAgICAvL3JldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHN0YXRlLT5jb2xvclswXSwgc3RhdGUtPmNvbG9yWzFdLCBzdGF0ZS0+Y29sb3JbMl0sIHN0YXRlLT5jb2xvclszXSk7CiAKICAgICBjb25zdCBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGNvbnN0IGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKIApAQCAtMjIyLDUzICsxNjcsNyBAQAogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIgYmVnaW4gdW5pZm9ybXMiKTsKLSAgICB1aW50MzJfdCB1aWR4ID0gMTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgQWxsb2NhdGlvbiAqYWxsb2MgPSBtQ29uc3RhbnRzW2N0KzFdLmdldCgpOwotICAgICAgICBpZiAoIWFsbG9jKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90ICo+KGFsbG9jLT5nZXRQdHIoKSk7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSBtQ29uc3RhbnRUeXBlc1tjdF0tPmdldEVsZW1lbnQoKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBmaWVsZD0wOyBmaWVsZCA8IGUtPmdldEZpZWxkQ291bnQoKTsgZmllbGQrKykgewotICAgICAgICAgICAgY29uc3QgRWxlbWVudCAqZiA9IGUtPmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IGUtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoZmllbGQpOwotICAgICAgICAgICAgaW50MzJfdCBzbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KHVpZHgpOwotCi0gICAgICAgICAgICBjb25zdCBmbG9hdCAqZmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZkYXRhW29mZnNldF0pOwotCi0gICAgICAgICAgICAvL0xPR0UoIlVuaWZvcm0gIHNsb3Q9JWksIG9mZnNldD0laSwgY29uc3RhbnQ9JWksIGZpZWxkPSVpLCB1aWR4PSVpIiwgc2xvdCwgb2Zmc2V0LCBjdCwgZmllbGQsIHVpZHgpOwotICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChmLT5nZXRDb21wb25lbnQoKS5nZXRWZWN0b3JTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSAxID0gJWYiLCBmZFswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTFmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDIgPSAlZiAlZiIsIGZkWzBdLCBmZFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTJmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgLy9MT0dFKCJVbmlmb3JtIDMgPSAlZiAlZiAlZiIsIGZkWzBdLCBmZFsxXSwgZmRbMl0pOwotICAgICAgICAgICAgICAgICAgICBnbFVuaWZvcm0zZnYoc2xvdCwgMSwgZmQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vTE9HRSgiVW5pZm9ybSA0ID0gJWYgJWYgJWYgJWYiLCBmZFswXSwgZmRbMV0sIGZkWzJdLCBmZFszXSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsVW5pZm9ybTRmdihzbG90LCAxLCBmZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpZHggKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbUNvbnN0YW50Q291bnQ7IGN0KyspIHsKLSAgICAgICAgdWludDMyX3QgZ2xTbG90ID0gc2MtPnZ0eFVuaWZvcm1TbG90KGN0ICsgMSk7Ci0KLSAgICB9CisgICAgc2V0dXBVc2VyQ29uc3RhbnRzKHNjLCBmYWxzZSk7CiAKICAgICBzdGF0ZS0+bUxhc3Quc2V0KHRoaXMpOwogICAgIHJzYy0+Y2hlY2tFcnJvcigiUHJvZ3JhbVZlcnRleDo6c2V0dXBHTDIiKTsKQEAgLTMwMyw2ICsyMDIsMTIgQEAKICAgICBtRGlydHkgPSB0cnVlOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OmdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkgY29uc3QKK3sKKyAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKKyAgICBtZW1jcHkobSwgJmZbUlNfUFJPR1JBTV9WRVJURVhfUFJPSkVDVElPTl9PRkZTRVRdLCBzaXplb2YocnNjX01hdHJpeCkpOworfQorCiB2b2lkIFByb2dyYW1WZXJ0ZXg6OnRyYW5zZm9ybVRvU2NyZWVuKGNvbnN0IENvbnRleHQgKnJzYywgZmxvYXQgKnY0b3V0LCBjb25zdCBmbG9hdCAqdjNpbikgY29uc3QKIHsKICAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KG1Db25zdGFudHNbMF0tPmdldFB0cigpKTsKQEAgLTMxMiwyMyArMjE3LDYgQEAKICAgICBtdnAudmVjdG9yTXVsdGlwbHkodjRvdXQsIHYzaW4pOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXg6OmluaXRBZGRVc2VyRWxlbWVudChjb25zdCBFbGVtZW50ICplLCBTdHJpbmc4ICpuYW1lcywgdWludDMyX3QgKmNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgpCi17Ci0gICAgcnNBc3NlcnQoZS0+Z2V0RmllbGRDb3VudCgpKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZS0+Z2V0RmllbGRDb3VudCgpOyBjdCsrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmNlID0gZS0+Z2V0RmllbGQoY3QpOwotICAgICAgICBpZiAoY2UtPmdldEZpZWxkQ291bnQoKSkgewotICAgICAgICAgICAgaW5pdEFkZFVzZXJFbGVtZW50KGNlLCBuYW1lcywgY291bnQsIHByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHRtcChwcmVmaXgpOwotICAgICAgICAgICAgdG1wLmFwcGVuZChlLT5nZXRGaWVsZE5hbWUoY3QpKTsKLSAgICAgICAgICAgIG5hbWVzWypjb3VudF0uc2V0VG8odG1wLnN0cmluZygpKTsKLSAgICAgICAgICAgICgqY291bnQpKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQogdm9pZCBQcm9ncmFtVmVydGV4Ojppbml0KENvbnRleHQgKnJzYykKIHsKICAgICBtQXR0cmliQ291bnQgPSAwOwpAQCAtMzUxLDYgKzIzOSwxNiBAQAogICAgIGNyZWF0ZVNoYWRlcigpOwogfQogCit2b2lkIFByb2dyYW1WZXJ0ZXg6OnNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0Cit7CisKK30KKworUHJvZ3JhbVZlcnRleCAqUHJvZ3JhbVZlcnRleDo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCkBAIC0zNjIsOCArMjYwLDkgQEAKIHsKIH0KIAotdm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OmluaXQoQ29udGV4dCAqcnNjLCBpbnQzMl90IHcsIGludDMyX3QgaCkKK3ZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjppbml0KENvbnRleHQgKnJzYykKIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogICAgIFJzRWxlbWVudCBlID0gKFJzRWxlbWVudCkgRWxlbWVudDo6Y3JlYXRlKHJzYywgUlNfVFlQRV9GTE9BVF8zMiwgUlNfS0lORF9VU0VSLCBmYWxzZSwgMSk7CiAKICAgICByc2lfVHlwZUJlZ2luKHJzYywgZSk7CkBAIC0zNzIsMjcgKzI3MSwyNSBAQAogCiAgICAgUHJvZ3JhbVZlcnRleCAqcHYgPSBuZXcgUHJvZ3JhbVZlcnRleChyc2MsIGZhbHNlKTsKICAgICBBbGxvY2F0aW9uICphbGxvYyA9IChBbGxvY2F0aW9uICopcnNpX0FsbG9jYXRpb25DcmVhdGVUeXBlZChyc2MsIG1BbGxvY1R5cGUuZ2V0KCkpOworCiAgICAgbURlZmF1bHRBbGxvYy5zZXQoYWxsb2MpOwogICAgIG1EZWZhdWx0LnNldChwdik7CiAgICAgcHYtPmluaXQocnNjKTsKICAgICBwdi0+YmluZEFsbG9jYXRpb24oYWxsb2MsIDApOwogCi0gICAgY29sb3JbMF0gPSAxLmY7Ci0gICAgY29sb3JbMV0gPSAxLmY7Ci0gICAgY29sb3JbMl0gPSAxLmY7Ci0gICAgY29sb3JbM10gPSAxLmY7CisgICAgdXBkYXRlU2l6ZShyc2MpOworI2VuZGlmIC8vQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogCi0gICAgdXBkYXRlU2l6ZShyc2MsIHcsIGgpOwogfQogCi12b2lkIFByb2dyYW1WZXJ0ZXhTdGF0ZTo6dXBkYXRlU2l6ZShDb250ZXh0ICpyc2MsIGludDMyX3QgdywgaW50MzJfdCBoKQordm9pZCBQcm9ncmFtVmVydGV4U3RhdGU6OnVwZGF0ZVNpemUoQ29udGV4dCAqcnNjKQogewogICAgIE1hdHJpeCBtOwotICAgIG0ubG9hZE9ydGhvKDAsdywgaCwwLCAtMSwxKTsKLSAgICBtRGVmYXVsdEFsbG9jLT5zdWJEYXRhKFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CisgICAgbS5sb2FkT3J0aG8oMCxyc2MtPmdldFdpZHRoKCksIHJzYy0+Z2V0SGVpZ2h0KCksMCwgLTEsMSk7CisgICAgbURlZmF1bHRBbGxvYy0+c3ViRGF0YShyc2MsIFJTX1BST0dSQU1fVkVSVEVYX1BST0pFQ1RJT05fT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CiAKICAgICBtLmxvYWRJZGVudGl0eSgpOwotICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEoUlNfUFJPR1JBTV9WRVJURVhfTU9ERUxWSUVXX09GRlNFVCwgMTYsICZtLm1bMF0sIDE2KjQpOworICAgIG1EZWZhdWx0QWxsb2MtPnN1YkRhdGEocnNjLCBSU19QUk9HUkFNX1ZFUlRFWF9NT0RFTFZJRVdfT0ZGU0VULCAxNiwgJm0ubVswXSwgMTYqNCk7CiB9CiAKIHZvaWQgUHJvZ3JhbVZlcnRleFN0YXRlOjpkZWluaXQoQ29udGV4dCAqcnNjKQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaCBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKaW5kZXggMjg1NTRjYy4uNTlmZDMxOTUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmgKKysrIGIvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguaApAQCAtNDMsNiArNDMsNyBAQAogICAgIHZvaWQgYWRkTGlnaHQoY29uc3QgTGlnaHQgKik7CiAKICAgICB2b2lkIHNldFByb2plY3Rpb25NYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqKSBjb25zdDsKKyAgICB2b2lkIGdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqKSBjb25zdDsKICAgICB2b2lkIHNldE1vZGVsdmlld01hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogICAgIHZvaWQgc2V0VGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICopIGNvbnN0OwogCkBAIC01Miw2ICs1Myw5IEBACiAgICAgdmlydHVhbCB2b2lkIGxvYWRTaGFkZXIoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdChDb250ZXh0ICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfUFJPR1JBTV9WRVJURVg7IH0KKyAgICBzdGF0aWMgUHJvZ3JhbVZlcnRleCAqY3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSk7CiAKIHByb3RlY3RlZDoKICAgICB1aW50MzJfdCBtTGlnaHRDb3VudDsKQEAgLTU5LDkgKzYzLDYgQEAKIAogICAgIC8vIEhhY2tzIHRvIGNyZWF0ZSBhIHByb2dyYW0gZm9yIG5vdwogICAgIGJvb2wgbVRleHR1cmVNYXRyaXhFbmFibGU7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0QWRkVXNlckVsZW1lbnQoY29uc3QgRWxlbWVudCAqZSwgU3RyaW5nOCAqbmFtZXMsIHVpbnQzMl90ICpjb3VudCwgY29uc3QgY2hhciAqcHJlZml4KTsKIH07CiAKIApAQCAtNzEsMTggKzcyLDE1IEBACiAgICAgUHJvZ3JhbVZlcnRleFN0YXRlKCk7CiAgICAgflByb2dyYW1WZXJ0ZXhTdGF0ZSgpOwogCi0gICAgdm9pZCBpbml0KENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgaW5pdChDb250ZXh0ICpyc2MpOwogICAgIHZvaWQgZGVpbml0KENvbnRleHQgKnJzYyk7Ci0gICAgdm9pZCB1cGRhdGVTaXplKENvbnRleHQgKnJzYywgaW50MzJfdCB3LCBpbnQzMl90IGgpOworICAgIHZvaWQgdXBkYXRlU2l6ZShDb250ZXh0ICpyc2MpOwogCiAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtVmVydGV4PiBtRGVmYXVsdDsKICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1WZXJ0ZXg+IG1MYXN0OwogICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gbURlZmF1bHRBbGxvYzsKIAogICAgIE9iamVjdEJhc2VSZWY8VHlwZT4gbUFsbG9jVHlwZTsKLQotCi0gICAgZmxvYXQgY29sb3JbNF07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmNwcCBiL2xpYnMvcnMvcnNTYW1wbGVyLmNwcAppbmRleCA3MWY1MDhmLi5mNDFmMjk1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2FtcGxlci5jcHAKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuY3BwCkBAIC0xNCwxMCArMTQsMTYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KICNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2xleHQuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKwogI2luY2x1ZGUgInJzU2FtcGxlci5oIgogCiAKQEAgLTk0LDYgKzEwMCwxNyBAQAogICAgIG1Cb3VuZFNsb3QgPSAtMTsKICAgICBzcy0+bVNhbXBsZXJzW3Nsb3RdLmNsZWFyKCk7CiB9CisKK3ZvaWQgU2FtcGxlcjo6c2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QKK3sKKyAgICAKK30KKworU2FtcGxlciAqU2FtcGxlcjo6Y3JlYXRlRnJvbVN0cmVhbShDb250ZXh0ICpyc2MsIElTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoKIHZvaWQgU2FtcGxlclN0YXRlOjpzZXR1cEdMKCkKIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTYW1wbGVyLmggYi9saWJzL3JzL3JzU2FtcGxlci5oCmluZGV4IDA1MDYwODEuLjM3ODY0MzkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTYW1wbGVyLmgKKysrIGIvbGlicy9ycy9yc1NhbXBsZXIuaApAQCAtNDYsNiArNDYsMTAgQEAKICAgICB2b2lkIGJpbmRUb0NvbnRleHQoU2FtcGxlclN0YXRlICosIHVpbnQzMl90IHNsb3QpOwogICAgIHZvaWQgdW5iaW5kRnJvbUNvbnRleHQoU2FtcGxlclN0YXRlICopOwogCisgICAgdmlydHVhbCB2b2lkIHNlcmlhbGl6ZShPU3RyZWFtICpzdHJlYW0pIGNvbnN0OworICAgIHZpcnR1YWwgUnNBM0RDbGFzc0lEIGdldENsYXNzSWQoKSBjb25zdCB7IHJldHVybiBSU19BM0RfQ0xBU1NfSURfU0FNUExFUjsgfQorICAgIHN0YXRpYyBTYW1wbGVyICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKTsKKwogcHJvdGVjdGVkOgogICAgIFJzU2FtcGxlclZhbHVlIG1NYWdGaWx0ZXI7CiAgICAgUnNTYW1wbGVyVmFsdWUgbU1pbkZpbHRlcjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKaW5kZXggYTMzOTMzYi4uZmMyMmZjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKQEAgLTI0LDE5ICsyNCwyNSBAQAogICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKICAgICBtQWxsb2NMaW5lID0gX19MSU5FX187CiAgICAgbWVtc2V0KCZtRW52aXJvbWVudCwgMCwgc2l6ZW9mKG1FbnZpcm9tZW50KSk7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSAwOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gMDsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IDA7Ci0gICAgbUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSAxOwotICAgIG1FbnZpcm9tZW50Lm1DbGVhckRlcHRoID0gMTsKLSAgICBtRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gMDsKLSAgICBtRW52aXJvbWVudC5tSXNSb290ID0gZmFsc2U7CiB9CiAKIFNjcmlwdDo6flNjcmlwdCgpCiB7CiB9CiAKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50MzJfdCAqZGVzdFB0ciA9ICgoaW50MzJfdCAqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtzbG90XTsKKyAgICBpZiAoZGVzdFB0cikgeworICAgICAgICAvL0xPR0UoInNldFZhciBmMSAgJWYiLCAoKGNvbnN0IGZsb2F0ICopZGVzdFB0cilbMF0pOworICAgICAgICAvL0xPR0UoInNldFZhciAlcCAlaSIsIGRlc3RQdHIsIGxlbik7CisgICAgICAgIG1lbWNweShkZXN0UHRyLCB2YWwsIGxlbik7CisgICAgICAgIC8vTE9HRSgic2V0VmFyIGYyICAlZiIsICgoY29uc3QgZmxvYXQgKilkZXN0UHRyKVswXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2FsbGluZyBzZXRWYXIgb24gc2xvdCA9ICVpIHdoaWNoIGlzIG51bGwiLCBzbG90KTsKKyAgICB9Cit9CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCkBAIC00NCwxNiArNTAsOSBAQAogdm9pZCByc2lfU2NyaXB0QmluZEFsbG9jYXRpb24oQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3Qgc2xvdCkKIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwotICAgIHMtPm1TbG90c1tzbG90XS5zZXQoc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSkpOwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckNvbG9yKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHMtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzFdID0gZzsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsyXSA9IGI7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBzLT5tU2xvdHNbc2xvdF0uc2V0KGEpOworICAgIC8vTE9HRSgicnNpX1NjcmlwdEJpbmRBbGxvY2F0aW9uICVpICAlcCAgJXAiLCBzbG90LCBhLCBhLT5nZXRQdHIoKSk7CiB9CiAKIHZvaWQgcnNpX1NjcmlwdFNldFRpbWVab25lKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBjb25zdCBjaGFyICogdGltZVpvbmUsIHVpbnQzMl90IGxlbmd0aCkKQEAgLTYyLDUzICs2MSw1MSBAQAogICAgIHMtPm1FbnZpcm9tZW50Lm1UaW1lWm9uZSA9IHRpbWVab25lOwogfQogCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhckRlcHRoKENvbnRleHQgKiByc2MsIFJzU2NyaXB0IHZzLCBmbG9hdCB2KQotewotICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7Ci0gICAgcy0+bUVudmlyb21lbnQubUNsZWFyRGVwdGggPSB2OwotfQotCi12b2lkIHJzaV9TY3JpcHRTZXRDbGVhclN0ZW5jaWwoQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHYpCi17Ci0gICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBzLT5tRW52aXJvbWVudC5tQ2xlYXJTdGVuY2lsID0gdjsKLX0KLQogdm9pZCByc2lfU2NyaXB0U2V0VHlwZShDb250ZXh0ICogcnNjLCBSc1R5cGUgdnQsIHVpbnQzMl90IHNsb3QsIGJvb2wgd3JpdGFibGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwogICAgIGNvbnN0IFR5cGUgKnQgPSBzdGF0aWNfY2FzdDxjb25zdCBUeXBlICo+KHZ0KTsKICAgICBzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbc2xvdF0uc2V0KHQpOwogICAgIHNzLT5tU2xvdFdyaXRhYmxlW3Nsb3RdID0gd3JpdGFibGU7Ci0gICAgaWYgKG5hbWUpIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8obmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3MtPm1TbG90TmFtZXNbc2xvdF0uc2V0VG8oIiIpOwotICAgIH0KLX0KLQotdm9pZCByc2lfU2NyaXB0U2V0SW52b2tlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3Qgc2xvdCkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnZva2FibGVOYW1lc1tzbG90XSA9IG5hbWU7CisgICAgTE9HRSgicnNpX1NjcmlwdFNldFR5cGUiKTsKIH0KIAogdm9pZCByc2lfU2NyaXB0SW52b2tlKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QpCiB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKLSAgICBpZiAocy0+bUVudmlyb21lbnQubUludm9rYWJsZXNbc2xvdF0gPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcy0+c2V0dXBTY3JpcHQoKTsKLSAgICBzLT5tRW52aXJvbWVudC5tSW52b2thYmxlc1tzbG90XSgpOworICAgIHMtPkludm9rZShyc2MsIHNsb3QsIE5VTEwsIDApOwogfQogCiAKLXZvaWQgcnNpX1NjcmlwdFNldFJvb3QoQ29udGV4dCAqIHJzYywgYm9vbCBpc1Jvb3QpCit2b2lkIHJzaV9TY3JpcHRJbnZva2VEYXRhKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIHZvaWQgKmRhdGEpCiB7Ci0gICAgU2NyaXB0Q1N0YXRlICpzcyA9ICZyc2MtPm1TY3JpcHRDOwotICAgIHNzLT5tU2NyaXB0LT5tRW52aXJvbWVudC5tSXNSb290ID0gaXNSb290OworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7Cit9CisKK3ZvaWQgcnNpX1NjcmlwdEludm9rZVYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKQoreworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFySShDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBpbnQgdmFsdWUpCit7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKwordm9pZCByc2lfU2NyaXB0U2V0VmFyRihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnNldFZhcihzbG90LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCit2b2lkIHJzaV9TY3JpcHRTZXRWYXJWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikKK3sKKyAgICBjb25zdCBmbG9hdCAqZnAgPSAoY29uc3QgZmxvYXQgKilkYXRhOworICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CisgICAgcy0+c2V0VmFyKHNsb3QsIGRhdGEsIGxlbik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdC5oIGIvbGlicy9ycy9yc1NjcmlwdC5oCmluZGV4IDVmNGE1MzYuLjBhMjAzNDQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHQuaAorKysgYi9saWJzL3JzL3JzU2NyaXB0LmgKQEAgLTI3LDkgKzI3LDkgQEAKIGNsYXNzIFByb2dyYW1WZXJ0ZXg7CiBjbGFzcyBQcm9ncmFtRnJhZ21lbnQ7CiBjbGFzcyBQcm9ncmFtUmFzdGVyOwotY2xhc3MgUHJvZ3JhbUZyYWdtZW50U3RvcmU7CitjbGFzcyBQcm9ncmFtU3RvcmU7CiAKLSNkZWZpbmUgTUFYX1NDUklQVF9CQU5LUyAxNgorI2RlZmluZSBNQVhfU0NSSVBUX0JBTktTIDMyCiAKIGNsYXNzIFNjcmlwdCA6IHB1YmxpYyBPYmplY3RCYXNlCiB7CkBAIC0zOSwzOCArMzksNDMgQEAKICAgICBTY3JpcHQoQ29udGV4dCAqKTsKICAgICB2aXJ0dWFsIH5TY3JpcHQoKTsKIAotCiAgICAgc3RydWN0IEVudmlyb21lbnRfdCB7Ci0gICAgICAgIGJvb2wgbUlzUm9vdDsKLSAgICAgICAgZmxvYXQgbUNsZWFyQ29sb3JbNF07Ci0gICAgICAgIGZsb2F0IG1DbGVhckRlcHRoOwotICAgICAgICB1aW50MzJfdCBtQ2xlYXJTdGVuY2lsOwotCi0gICAgICAgIHVpbnQzMl90IG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgIGludDY0X3QgbVN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgaW50NjRfdCBtTGFzdER0VGltZTsKICAgICAgICAgY29uc3QgY2hhciogbVRpbWVab25lOwogCiAgICAgICAgIE9iamVjdEJhc2VSZWY8UHJvZ3JhbVZlcnRleD4gbVZlcnRleDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtRnJhZ21lbnQ+IG1GcmFnbWVudDsKICAgICAgICAgT2JqZWN0QmFzZVJlZjxQcm9ncmFtUmFzdGVyPiBtUmFzdGVyOwotICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1GcmFnbWVudFN0b3JlPiBtRnJhZ21lbnRTdG9yZTsKLSAgICAgICAgSW52b2tlRnVuY190IG1JbnZva2FibGVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgICAgICBPYmplY3RCYXNlUmVmPFByb2dyYW1TdG9yZT4gbUZyYWdtZW50U3RvcmU7CisKKyAgICAgICAgdWludDMyX3QgbUludm9rZUZ1bmN0aW9uQ291bnQ7CisgICAgICAgIEludm9rZUZ1bmNfdCAqbUludm9rZUZ1bmN0aW9uczsKKyAgICAgICAgdWludDMyX3QgbUZpZWxkQ291bnQ7CisgICAgICAgIHZvaWQgKiogbUZpZWxkQWRkcmVzczsKKwogICAgICAgICBjaGFyICogbVNjcmlwdFRleHQ7CiAgICAgICAgIHVpbnQzMl90IG1TY3JpcHRUZXh0TGVuZ3RoOworCisgICAgICAgIGJvb2wgbUlzVGhyZWFkYWJsZTsKICAgICB9OwogICAgIEVudmlyb21lbnRfdCBtRW52aXJvbWVudDsKIAotICAgIHVpbnQzMl90IG1Db3Vuc3RhbnRCdWZmZXJDb3VudDsKLQotCiAgICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtU2xvdHNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtVHlwZXNbTUFYX1NDUklQVF9CQU5LU107Ci0gICAgU3RyaW5nOCBtU2xvdE5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOwogICAgIGJvb2wgbVNsb3RXcml0YWJsZVtNQVhfU0NSSVBUX0JBTktTXTsKIAorICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgdWludDMyX3QgbGVuKTsKIAorICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICogYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gKiBhb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiB1c3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdCgpID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdEMuY3BwIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCmluZGV4IGY0ZDI0NTEuLjY2Mjc5MWQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAorKysgYi9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKQEAgLTE3LDggKzE3LDcgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc1NjcmlwdEMuaCIKICNpbmNsdWRlICJyc01hdHJpeC5oIgotCi0jaW5jbHVkZSAiYWNjL2FjYy5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbXBpbGUvbGliYmNjL2luY2x1ZGUvYmNjL2JjYy5oIgogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgpAQCAtMzcsNDAgKzM2LDc0IEBACiB7CiAgICAgbUFsbG9jRmlsZSA9IF9fRklMRV9fOwogICAgIG1BbGxvY0xpbmUgPSBfX0xJTkVfXzsKLSAgICBtQWNjU2NyaXB0ID0gTlVMTDsKKyAgICBtQmNjU2NyaXB0ID0gTlVMTDsKICAgICBtZW1zZXQoJm1Qcm9ncmFtLCAwLCBzaXplb2YobVByb2dyYW0pKTsKIH0KIAogU2NyaXB0Qzo6flNjcmlwdEMoKQogewotICAgIGlmIChtQWNjU2NyaXB0KSB7Ci0gICAgICAgIGFjY0RlbGV0ZVNjcmlwdChtQWNjU2NyaXB0KTsKKyAgICBpZiAobUJjY1NjcmlwdCkgeworICAgICAgICBiY2NEZWxldGVTY3JpcHQobUJjY1NjcmlwdCk7CiAgICAgfQogICAgIGZyZWUobUVudmlyb21lbnQubVNjcmlwdFRleHQpOwogICAgIG1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0ID0gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDOjpzZXR1cFNjcmlwdCgpCit2b2lkIFNjcmlwdEM6OnNldHVwU2NyaXB0KENvbnRleHQgKnJzYykKIHsKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKSB7Ci0gICAgICAgICAgICAqbVByb2dyYW0ubVNsb3RQb2ludGVyc1tjdF0gPSBtU2xvdHNbY3RdLT5nZXRQdHIoKTsKKyAgICBzZXR1cEdMU3RhdGUocnNjKTsKKyAgICBtRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzCisgICAgICAgICAgICAgICAgPSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKKworICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdm9pZCAqcHRyID0gbVNsb3RzW2N0XS0+Z2V0UHRyKCk7CisgICAgICAgIHZvaWQgKipkZXN0ID0gKCh2b2lkICoqKiltRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKVtjdF07CisgICAgICAgIC8vTE9HRSgic2V0dXBTY3JpcHQgJWkgJXAgPSAlcCAgICAlcCAlaSIsIGN0LCBkZXN0LCBwdHIsIG1TbG90c1tjdF0tPmdldFR5cGUoKSwgbVNsb3RzW2N0XS0+Z2V0VHlwZSgpLT5nZXREaW1YKCkpOworCisgICAgICAgIC8vY29uc3QgdWludDMyX3QgKnAzMiA9IChjb25zdCB1aW50MzJfdCAqKXB0cjsKKyAgICAgICAgLy9mb3IgKHVpbnQzMl90IGN0Mj0wOyBjdDIgPCBtU2xvdHNbY3RdLT5nZXRUeXBlKCktPmdldERpbVgoKTsgY3QyKyspIHsKKyAgICAgICAgICAgIC8vTE9HRSgiICAlaSA9IDB4JTA4eCAiLCBjdDIsIHAzMltjdDJdKTsKKyAgICAgICAgLy99CisKKyAgICAgICAgaWYgKGRlc3QpIHsKKyAgICAgICAgICAgICpkZXN0ID0gcHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiU2NyaXB0Qzo6c2V0dXBTY3JpcHQsIE5VTEwgdmFyIGJpbmRpbmcgYWRkcmVzcy4iKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotCi11aW50MzJfdCBTY3JpcHRDOjpydW4oQ29udGV4dCAqcnNjLCB1aW50MzJfdCBsYXVuY2hJbmRleCkKK2NvbnN0IEFsbG9jYXRpb24gKlNjcmlwdEM6OnB0clRvQWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpIGNvbnN0CiB7Ci0gICAgaWYgKG1Qcm9ncmFtLm1TY3JpcHQgPT0gTlVMTCkgewotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCBtRW52aXJvbWVudC5tRmllbGRDb3VudDsgY3QrKykgeworICAgICAgICBpZiAoIW1TbG90c1tjdF0uZ2V0KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1TbG90c1tjdF0tPmdldFB0cigpID09IHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1TbG90c1tjdF0uZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiU2NyaXB0Qzo6cHRyVG9BbGxvY2F0aW9uLCBmYWlsZWQgdG8gZmluZCAlcCIsIHB0cik7CisgICAgcmV0dXJuIE5VTEw7Cit9CiAKLSAgICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPQotICAgIChDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKilwdGhyZWFkX2dldHNwZWNpZmljKENvbnRleHQ6OmdUaHJlYWRUTFNLZXkpOworU2NyaXB0ICogU2NyaXB0Qzo6c2V0VExTKFNjcmlwdCAqc2MpCit7CisgICAgQ29udGV4dDo6U2NyaXB0VExTU3RydWN0ICogdGxzID0gKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7CiAgICAgcnNBc3NlcnQodGxzKTsKKyAgICBTY3JpcHQgKm9sZCA9IHRscy0+bVNjcmlwdDsKKyAgICB0bHMtPm1TY3JpcHQgPSBzYzsKKyAgICByZXR1cm4gb2xkOworfQogCisKK3ZvaWQgU2NyaXB0Qzo6c2V0dXBHTFN0YXRlKENvbnRleHQgKnJzYykKK3sKICAgICBpZiAobUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuZ2V0KCkpIHsKICAgICAgICAgcnNjLT5zZXRGcmFnbWVudFN0b3JlKG1FbnZpcm9tZW50Lm1GcmFnbWVudFN0b3JlLmdldCgpKTsKICAgICB9CkBAIC04MywyMCArMTE2LDIxNCBAQAogICAgIGlmIChtRW52aXJvbWVudC5tUmFzdGVyLmdldCgpKSB7CiAgICAgICAgIHJzYy0+c2V0UmFzdGVyKG1FbnZpcm9tZW50Lm1SYXN0ZXIuZ2V0KCkpOwogICAgIH0KK30KIAotICAgIGlmIChsYXVuY2hJbmRleCA9PSAwKSB7Ci0gICAgICAgIG1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXMKLSAgICAgICAgICAgICAgICA9IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpOwordWludDMyX3QgU2NyaXB0Qzo6cnVuKENvbnRleHQgKnJzYykKK3sKKyAgICBpZiAobVByb2dyYW0ubVJvb3QgPT0gTlVMTCkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJBdHRlbXB0ZWQgdG8gcnVuIGJhZCBzY3JpcHQiKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHNldHVwU2NyaXB0KCk7CisKKyAgICBzZXR1cFNjcmlwdChyc2MpOwogCiAgICAgdWludDMyX3QgcmV0ID0gMDsKLSAgICB0bHMtPm1TY3JpcHQgPSB0aGlzOwotICAgIHJldCA9IG1Qcm9ncmFtLm1TY3JpcHQobGF1bmNoSW5kZXgpOwotICAgIHRscy0+bVNjcmlwdCA9IE5VTEw7CisgICAgU2NyaXB0ICogb2xkVExTID0gc2V0VExTKHRoaXMpOworICAgIC8vTE9HRSgiU2NyaXB0Qzo6cnVuICVwIiwgbVByb2dyYW0ubVJvb3QpOworICAgIHJldCA9IG1Qcm9ncmFtLm1Sb290KCk7CisgICAgc2V0VExTKG9sZFRMUyk7CisgICAgLy9MT0dFKCJTY3JpcHRDOjpydW4gcmV0ICVpIiwgcmV0KTsKICAgICByZXR1cm4gcmV0OwogfQogCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBDb250ZXh0ICpyc2M7CisgICAgU2NyaXB0QyAqc2NyaXB0OworICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW47CisgICAgQWxsb2NhdGlvbiAqIGFvdXQ7CisgICAgY29uc3Qgdm9pZCAqIHVzcjsKKworICAgIHVpbnQzMl90IG1TbGljZVNpemU7CisgICAgdm9sYXRpbGUgaW50IG1TbGljZU51bTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ckluOworICAgIHVpbnQzMl90IGVTdHJpZGVJbjsKKyAgICB1aW50OF90ICpwdHJPdXQ7CisgICAgdWludDMyX3QgZVN0cmlkZU91dDsKKworICAgIHVpbnQzMl90IHhTdGFydDsKKyAgICB1aW50MzJfdCB4RW5kOworICAgIHVpbnQzMl90IHlTdGFydDsKKyAgICB1aW50MzJfdCB5RW5kOworICAgIHVpbnQzMl90IHpTdGFydDsKKyAgICB1aW50MzJfdCB6RW5kOworICAgIHVpbnQzMl90IGFycmF5U3RhcnQ7CisgICAgdWludDMyX3QgYXJyYXlFbmQ7CisKKyAgICB1aW50MzJfdCBkaW1YOworICAgIHVpbnQzMl90IGRpbVk7CisgICAgdWludDMyX3QgZGltWjsKKyAgICB1aW50MzJfdCBkaW1BcnJheTsKK30gTVRMYXVuY2hTdHJ1Y3Q7Cit0eXBlZGVmIGludCAoKnJzX3QpKGNvbnN0IHZvaWQgKiwgdm9pZCAqLCBjb25zdCB2b2lkICosIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90KTsKKworc3RhdGljIHZvaWQgd2NfeHkodm9pZCAqdXNyLCB1aW50MzJfdCBpZHgpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgKm10bHMgPSAoTVRMYXVuY2hTdHJ1Y3QgKil1c3I7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50MzJfdCBzbGljZSA9ICh1aW50MzJfdClhbmRyb2lkX2F0b21pY19pbmMoJm10bHMtPm1TbGljZU51bSk7CisgICAgICAgIHVpbnQzMl90IHlTdGFydCA9IG10bHMtPnlTdGFydCArIHNsaWNlICogbXRscy0+bVNsaWNlU2l6ZTsKKyAgICAgICAgdWludDMyX3QgeUVuZCA9IHlTdGFydCArIG10bHMtPm1TbGljZVNpemU7CisgICAgICAgIHlFbmQgPSByc01pbih5RW5kLCBtdGxzLT55RW5kKTsKKyAgICAgICAgaWYgKHlFbmQgPD0geVN0YXJ0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvL0xPR0UoInVzciBpZHggJWksIHggJWksJWkgIHkgJWksJWkiLCBpZHgsIG10bHMtPnhTdGFydCwgbXRscy0+eEVuZCwgeVN0YXJ0LCB5RW5kKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSB5U3RhcnQ7IHkgPCB5RW5kOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMtPmRpbVggKiB5OworICAgICAgICAgICAgdWludDhfdCAqeFB0ck91dCA9IG10bHMtPnB0ck91dCArIChtdGxzLT5lU3RyaWRlT3V0ICogb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnhQdHJJbiA9IG10bHMtPnB0ckluICsgKG10bHMtPmVTdHJpZGVJbiAqIG9mZnNldCk7CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeCA9IG10bHMtPnhTdGFydDsgeCA8IG10bHMtPnhFbmQ7IHgrKykgeworICAgICAgICAgICAgICAgICgocnNfdCltdGxzLT5zY3JpcHQtPm1Qcm9ncmFtLm1Sb290KSAoeFB0ckluLCB4UHRyT3V0LCBtdGxzLT51c3IsIHgsIHksIDAsIDApOworICAgICAgICAgICAgICAgIHhQdHJJbiArPSBtdGxzLT5lU3RyaWRlSW47CisgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLT5lU3RyaWRlT3V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKK3ZvaWQgU2NyaXB0Qzo6cnVuRm9yRWFjaChDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqIGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICogYW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogdXNyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJzU2NyaXB0Q2FsbCAqc2MpCit7CisgICAgTVRMYXVuY2hTdHJ1Y3QgbXRsczsKKyAgICBtZW1zZXQoJm10bHMsIDAsIHNpemVvZihtdGxzKSk7CisKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMuZGltWCA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1YKCk7CisgICAgICAgIG10bHMuZGltWSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1aKCk7CisgICAgICAgIC8vbXRscy5kaW1BcnJheSA9IGFpbi0+Z2V0VHlwZSgpLT5nZXREaW1BcnJheSgpOworICAgIH0gZWxzZSBpZiAoYW91dCkgeworICAgICAgICBtdGxzLmRpbVggPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbVgoKTsKKyAgICAgICAgbXRscy5kaW1ZID0gYW91dC0+Z2V0VHlwZSgpLT5nZXREaW1ZKCk7CisgICAgICAgIG10bHMuZGltWiA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RGltWigpOworICAgICAgICAvL210bHMuZGltQXJyYXkgPSBhb3V0LT5nZXRUeXBlKCktPmdldERpbUFycmF5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAicnNGb3JFYWNoIGNhbGxlZCB3aXRoIG51bGwgYWxsb2NhdGlvbnMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT54RW5kID09IDApKSB7CisgICAgICAgIG10bHMueEVuZCA9IG10bHMuZGltWDsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eFN0YXJ0IDwgbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhFbmQgPD0gbXRscy5kaW1YKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnhTdGFydCA8IHNjLT54RW5kKTsKKyAgICAgICAgbXRscy54U3RhcnQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54U3RhcnQpOworICAgICAgICBtdGxzLnhFbmQgPSByc01pbihtdGxzLmRpbVgsIHNjLT54RW5kKTsKKyAgICAgICAgaWYgKG10bHMueFN0YXJ0ID49IG10bHMueEVuZCkgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2MgfHwgKHNjLT55RW5kID09IDApKSB7CisgICAgICAgIG10bHMueUVuZCA9IG10bHMuZGltWTsKKyAgICB9IGVsc2UgeworICAgICAgICByc0Fzc2VydChzYy0+eVN0YXJ0IDwgbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlFbmQgPD0gbXRscy5kaW1ZKTsKKyAgICAgICAgcnNBc3NlcnQoc2MtPnlTdGFydCA8IHNjLT55RW5kKTsKKyAgICAgICAgbXRscy55U3RhcnQgPSByc01pbihtdGxzLmRpbVksIHNjLT55U3RhcnQpOworICAgICAgICBtdGxzLnlFbmQgPSByc01pbihtdGxzLmRpbVksIHNjLT55RW5kKTsKKyAgICAgICAgaWYgKG10bHMueVN0YXJ0ID49IG10bHMueUVuZCkgcmV0dXJuOworICAgIH0KKworICAgIG10bHMueEVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnhFbmQpOworICAgIG10bHMueUVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnlFbmQpOworICAgIG10bHMuekVuZCA9IHJzTWF4KCh1aW50MzJfdCkxLCBtdGxzLnpFbmQpOworICAgIG10bHMuYXJyYXlFbmQgPSByc01heCgodWludDMyX3QpMSwgbXRscy5hcnJheUVuZCk7CisKKyAgICByc0Fzc2VydChhaW4tPmdldFR5cGUoKS0+Z2V0RGltWigpID09IDApOworCisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKworICAgIG10bHMucnNjID0gcnNjOworICAgIG10bHMuYWluID0gYWluOworICAgIG10bHMuYW91dCA9IGFvdXQ7CisgICAgbXRscy5zY3JpcHQgPSB0aGlzOworICAgIG10bHMudXNyID0gdXNyOworICAgIG10bHMubVNsaWNlU2l6ZSA9IDEwOworICAgIG10bHMubVNsaWNlTnVtID0gMDsKKworICAgIG10bHMucHRySW4gPSBOVUxMOworICAgIG10bHMuZVN0cmlkZUluID0gMDsKKyAgICBpZiAoYWluKSB7CisgICAgICAgIG10bHMucHRySW4gPSAoY29uc3QgdWludDhfdCAqKWFpbi0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZUluID0gYWluLT5nZXRUeXBlKCktPmdldEVsZW1lbnRTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICBtdGxzLnB0ck91dCA9IE5VTEw7CisgICAgbXRscy5lU3RyaWRlT3V0ID0gMDsKKyAgICBpZiAoYW91dCkgeworICAgICAgICBtdGxzLnB0ck91dCA9ICh1aW50OF90ICopYW91dC0+Z2V0UHRyKCk7CisgICAgICAgIG10bHMuZVN0cmlkZU91dCA9IGFvdXQtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIH0KKworCisgICAgaWYgKChyc2MtPmdldFdvcmtlclBvb2xTaXplKCkgPiAxKSAmJiBtRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlICYmCisgICAgICAgICgobXRscy5kaW1ZICogbXRscy5kaW1aICogbXRscy5kaW1BcnJheSkgPiAxKSkgeworCisgICAgICAgIC8vTE9HRSgibGF1bmNoIDEiKTsKKyAgICAgICAgcnNjLT5sYXVuY2hUaHJlYWRzKHdjX3h5LCAmbXRscyk7CisgICAgICAgIC8vTE9HRSgibGF1bmNoIDIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVpbnQzMl90IGFyID0gbXRscy5hcnJheVN0YXJ0OyBhciA8IG10bHMuYXJyYXlFbmQ7IGFyKyspIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgeiA9IG10bHMuelN0YXJ0OyB6IDwgbXRscy56RW5kOyB6KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSBtdGxzLnlTdGFydDsgeSA8IG10bHMueUVuZDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IG10bHMuZGltWCAqIG10bHMuZGltWSAqIG10bHMuZGltWiAqIGFyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRscy5kaW1YICogbXRscy5kaW1ZICogeiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10bHMuZGltWCAqIHk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnhQdHJPdXQgPSBtdGxzLnB0ck91dCArIChtdGxzLmVTdHJpZGVPdXQgKiBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp4UHRySW4gPSBtdGxzLnB0ckluICsgKG10bHMuZVN0cmlkZUluICogb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSBtdGxzLnhTdGFydDsgeCA8IG10bHMueEVuZDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKHJzX3QpbVByb2dyYW0ubVJvb3QpICh4UHRySW4sIHhQdHJPdXQsIHVzciwgeCwgeSwgeiwgYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ckluICs9IG10bHMuZVN0cmlkZUluOworICAgICAgICAgICAgICAgICAgICAgICAgeFB0ck91dCArPSBtdGxzLmVTdHJpZGVPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXRUTFMob2xkVExTKTsKK30KKwordm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pCit7CisgICAgLy9MT0dFKCJyc2lfU2NyaXB0SW52b2tlICVpIiwgc2xvdCk7CisgICAgaWYgKChzbG90ID49IG1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbkNvdW50KSB8fAorICAgICAgICAobUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uc1tzbG90XSA9PSBOVUxMKSkgeworICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9TQ1JJUFQsICJDYWxsaW5nIGludm9rZSBvbiBiYWQgc2NyaXB0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0dXBTY3JpcHQocnNjKTsKKyAgICBTY3JpcHQgKiBvbGRUTFMgPSBzZXRUTFModGhpcyk7CisKKyAgICAoKHZvaWQgKCopKGNvbnN0IHZvaWQgKiwgdWludDMyX3QpKQorICAgICAgICBtRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25zW3Nsb3RdKShkYXRhLCBsZW4pOworCisgICAgc2V0VExTKG9sZFRMUyk7Cit9CisKIFNjcmlwdENTdGF0ZTo6U2NyaXB0Q1N0YXRlKCkKIHsKICAgICBtU2NyaXB0ID0gTlVMTDsKQEAgLTExMywyMSArMzQwLDI3IEBACiB7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKICAgICAgICAgbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmNsZWFyKCk7Ci0gICAgICAgIG1TbG90TmFtZXNbY3RdLnNldFRvKCIiKTsKLSAgICAgICAgbUludm9rYWJsZU5hbWVzW2N0XS5zZXRUbygiIik7CiAgICAgICAgIG1TbG90V3JpdGFibGVbY3RdID0gZmFsc2U7CiAgICAgfQogCiAgICAgZGVsZXRlIG1TY3JpcHQ7CiAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDKE5VTEwpOwotCi0gICAgbUludDMyRGVmaW5lcy5jbGVhcigpOwotICAgIG1GbG9hdERlZmluZXMuY2xlYXIoKTsKIH0KIAotc3RhdGljIEFDQ3ZvaWQqIHN5bWJvbExvb2t1cChBQ0N2b2lkKiBwQ29udGV4dCwgY29uc3QgQUNDY2hhciogbmFtZSkKK3N0YXRpYyBCQ0N2b2lkKiBzeW1ib2xMb29rdXAoQkNDdm9pZCogcENvbnRleHQsIGNvbnN0IEJDQ2NoYXIqIG5hbWUpCiB7Ci0gICAgY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICpzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBjb25zdCBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bTsKKyAgICBTY3JpcHRDICpzID0gKFNjcmlwdEMgKilwQ29udGV4dDsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbChuYW1lKTsKKyAgICBpZiAoc3ltKSB7CisgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CisgICAgfQorICAgIHMtPm1FbnZpcm9tZW50Lm1Jc1RocmVhZGFibGUgPSBmYWxzZTsKKyAgICBzeW0gPSBTY3JpcHRDU3RhdGU6Omxvb2t1cFN5bWJvbENMKG5hbWUpOworICAgIGlmIChzeW0pIHsKKyAgICAgICAgcmV0dXJuIHN5bS0+bVB0cjsKKyAgICB9CisgICAgc3ltID0gU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2xHTChuYW1lKTsKICAgICBpZiAoc3ltKSB7CiAgICAgICAgIHJldHVybiBzeW0tPm1QdHI7CiAgICAgfQpAQCAtMTM3LDY1ICszNzAsNTMgQEAKIAogdm9pZCBTY3JpcHRDU3RhdGU6OnJ1bkNvbXBpbGVyKENvbnRleHQgKnJzYywgU2NyaXB0QyAqcykKIHsKLSAgICBzLT5tQWNjU2NyaXB0ID0gYWNjQ3JlYXRlU2NyaXB0KCk7Ci0gICAgU3RyaW5nOCB0bXA7CisgICAgTE9HVigiU2NyaXB0Q1N0YXRlOjpydW5Db21waWxlciAiKTsKIAotICAgIHJzYy0+YXBwZW5kTmFtZURlZmluZXMoJnRtcCk7Ci0gICAgYXBwZW5kRGVjbHMoJnRtcCk7Ci0gICAgYXBwZW5kVmFyRGVmaW5lcyhyc2MsICZ0bXApOwotICAgIGFwcGVuZFR5cGVzKHJzYywgJnRtcCk7Ci0gICAgdG1wLmFwcGVuZCgiI2xpbmUgMVxuIik7Ci0KLSAgICBjb25zdCBjaGFyKiBzY3JpcHRTb3VyY2VbXSA9IHt0bXAuc3RyaW5nKCksIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0fTsKLSAgICBpbnQgc2NyaXB0TGVuZ3RoW10gPSB7dG1wLmxlbmd0aCgpLCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aH0gOwotICAgIGFjY1NjcmlwdFNvdXJjZShzLT5tQWNjU2NyaXB0LCBzaXplb2Yoc2NyaXB0TGVuZ3RoKSAvIHNpemVvZihpbnQpLCBzY3JpcHRTb3VyY2UsIHNjcmlwdExlbmd0aCk7Ci0gICAgYWNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQWNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIE5VTEwpOwotICAgIGFjY0NvbXBpbGVTY3JpcHQocy0+bUFjY1NjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgIm1haW4iLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVNjcmlwdCk7Ci0gICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwgImluaXQiLCAoQUNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubUluaXQpOwotICAgIHJzQXNzZXJ0KHMtPm1Qcm9ncmFtLm1TY3JpcHQpOwotCi0gICAgaWYgKCFzLT5tUHJvZ3JhbS5tU2NyaXB0KSB7Ci0gICAgICAgIEFDQ2NoYXIgYnVmWzQwOTZdOwotICAgICAgICBBQ0NzaXplaSBsZW47Ci0gICAgICAgIGFjY0dldFNjcmlwdEluZm9Mb2cocy0+bUFjY1NjcmlwdCwgc2l6ZW9mKGJ1ZiksICZsZW4sIGJ1Zik7Ci0gICAgICAgIExPR0UoIiVzIiwgYnVmKTsKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiRXJyb3IgY29tcGlsaW5nIHVzZXIgc2NyaXB0LiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHMtPm1CY2NTY3JpcHQgPSBiY2NDcmVhdGVTY3JpcHQoKTsKKyAgICBzLT5tRW52aXJvbWVudC5tSXNUaHJlYWRhYmxlID0gdHJ1ZTsKKyAgICBiY2NTY3JpcHRCaXRjb2RlKHMtPm1CY2NTY3JpcHQsIHMtPm1FbnZpcm9tZW50Lm1TY3JpcHRUZXh0LCBzLT5tRW52aXJvbWVudC5tU2NyaXB0VGV4dExlbmd0aCk7CisgICAgYmNjUmVnaXN0ZXJTeW1ib2xDYWxsYmFjayhzLT5tQmNjU2NyaXB0LCBzeW1ib2xMb29rdXAsIHMpOworICAgIGJjY0NvbXBpbGVTY3JpcHQocy0+bUJjY1NjcmlwdCk7CisgICAgYmNjR2V0U2NyaXB0TGFiZWwocy0+bUJjY1NjcmlwdCwgInJvb3QiLCAoQkNDdm9pZCoqKSAmcy0+bVByb2dyYW0ubVJvb3QpOworICAgIGJjY0dldFNjcmlwdExhYmVsKHMtPm1CY2NTY3JpcHQsICJpbml0IiwgKEJDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1Jbml0KTsKKyAgICBMT0dWKCJyb290ICVwLCAgaW5pdCAlcCIsIHMtPm1Qcm9ncmFtLm1Sb290LCBzLT5tUHJvZ3JhbS5tSW5pdCk7CiAKICAgICBpZiAocy0+bVByb2dyYW0ubUluaXQpIHsKICAgICAgICAgcy0+bVByb2dyYW0ubUluaXQoKTsKICAgICB9CiAKLSAgICBmb3IgKGludCBjdD0wOyBjdCA8IE1BWF9TQ1JJUFRfQkFOS1M7IGN0KyspIHsKLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYWNjR2V0U2NyaXB0TGFiZWwocy0+bUFjY1NjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbG90TmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1Qcm9ncmFtLm1TbG90UG9pbnRlcnNbY3RdKTsKLSAgICAgICAgfQorICAgIGJjY0dldEV4cG9ydEZ1bmNzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9ucyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMgPSAoU2NyaXB0OjpJbnZva2VGdW5jX3QqKSBjYWxsb2Mocy0+bUVudmlyb21lbnQubUludm9rZUZ1bmN0aW9uQ291bnQsIHNpemVvZihTY3JpcHQ6Okludm9rZUZ1bmNfdCkpOworICAgICAgICBiY2NHZXRFeHBvcnRGdW5jcyhzLT5tQmNjU2NyaXB0LCBOVUxMLCBzLT5tRW52aXJvbWVudC5tSW52b2tlRnVuY3Rpb25Db3VudCwgKEJDQ3ZvaWQgKiopIHMtPm1FbnZpcm9tZW50Lm1JbnZva2VGdW5jdGlvbnMpOwogICAgIH0KIAotICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBpZiAobUludm9rYWJsZU5hbWVzW2N0XS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGFjY0dldFNjcmlwdExhYmVsKHMtPm1BY2NTY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW52b2thYmxlTmFtZXNbY3RdLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFDQ3ZvaWQqKikgJnMtPm1FbnZpcm9tZW50Lm1JbnZva2FibGVzW2N0XSk7Ci0gICAgICAgIH0KKyAgICBiY2NHZXRFeHBvcnRWYXJzKHMtPm1CY2NTY3JpcHQsIChCQ0NzaXplaSopICZzLT5tRW52aXJvbWVudC5tRmllbGRDb3VudCwgMCwgTlVMTCk7CisgICAgaWYocy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQgPD0gMCkKKyAgICAgICAgcy0+bUVudmlyb21lbnQubUZpZWxkQWRkcmVzcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1GaWVsZEFkZHJlc3MgPSAodm9pZCAqKikgY2FsbG9jKHMtPm1FbnZpcm9tZW50Lm1GaWVsZENvdW50LCBzaXplb2Yodm9pZCAqKSk7CisgICAgICAgIGJjY0dldEV4cG9ydFZhcnMocy0+bUJjY1NjcmlwdCwgTlVMTCwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQsIChCQ0N2b2lkICoqKSBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzKTsKICAgICB9CisgICAgLy9mb3IgKGludCBjdDI9MDsgY3QyIDwgcy0+bUVudmlyb21lbnQubUZpZWxkQ291bnQ7IGN0MisrICkgeworICAgICAgICAvL0xPR0UoIlNjcmlwdCBmaWVsZCAlaSA9ICVwIiwgY3QyLCBzLT5tRW52aXJvbWVudC5tRmllbGRBZGRyZXNzW2N0Ml0pOworICAgIC8vfQogCiAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtRnJhZ21lbnQoKSk7CiAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKLSAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5zZXQocnNjLT5nZXREZWZhdWx0UHJvZ3JhbUZyYWdtZW50U3RvcmUoKSk7CisgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1TdG9yZSgpKTsKICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLnNldChyc2MtPmdldERlZmF1bHRQcm9ncmFtUmFzdGVyKCkpOwogCi0gICAgaWYgKHMtPm1Qcm9ncmFtLm1TY3JpcHQpIHsKKyAgICBpZiAocy0+bVByb2dyYW0ubVJvb3QpIHsKICAgICAgICAgY29uc3Qgc3RhdGljIGludCBwcmFnbWFNYXggPSAxNjsKLSAgICAgICAgQUNDc2l6ZWkgcHJhZ21hQ291bnQ7Ci0gICAgICAgIEFDQ2NoYXIgKiBzdHJbcHJhZ21hTWF4XTsKLSAgICAgICAgYWNjR2V0UHJhZ21hcyhzLT5tQWNjU2NyaXB0LCAmcHJhZ21hQ291bnQsIHByYWdtYU1heCwgJnN0clswXSk7CisgICAgICAgIEJDQ3NpemVpIHByYWdtYUNvdW50OworICAgICAgICBCQ0NjaGFyICogc3RyW3ByYWdtYU1heF07CisgICAgICAgIGJjY0dldFByYWdtYXMocy0+bUJjY1NjcmlwdCwgJnByYWdtYUNvdW50LCBwcmFnbWFNYXgsICZzdHJbMF0pOwogCiAgICAgICAgIGZvciAoaW50IGN0PTA7IGN0IDwgcHJhZ21hQ291bnQ7IGN0Kz0yKSB7CisgICAgICAgICAgICAvL0xPR0UoInByYWdtZSAlcyAlcyIsIHN0cltjdF0sIHN0cltjdCsxXSk7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJbY3RdLCAidmVyc2lvbiIpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yMDgsMTEgKzQyOSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1WZXJ0ZXguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb2dyYW1WZXJ0ZXggKiBwdiA9IChQcm9ncmFtVmVydGV4ICopcnNjLT5sb29rdXBOYW1lKHN0cltjdCsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubVZlcnRleC5zZXQocHYpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTE9HRSgiVW5yZWNvbml6ZWQgdmFsdWUgJXMgcGFzc2VkIHRvIHN0YXRlVmVydGV4Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjI0LDExICs0NDAsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tUmFzdGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyICogcHIgPSAoUHJvZ3JhbVJhc3RlciAqKXJzYy0+bG9va3VwTmFtZShzdHJbY3QrMV0pOwotICAgICAgICAgICAgICAgIGlmIChwciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPm1FbnZpcm9tZW50Lm1SYXN0ZXIuc2V0KHByKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZVJhc3RlciIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI0MCwxMSArNDUxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnQgKiBwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnQuc2V0KHBmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExPR0UoIlVucmVjb25pemVkIHZhbHVlICVzIHBhc3NlZCB0byBzdGF0ZUZyYWdtZW50Iiwgc3RyW2N0KzFdKTsKICAgICAgICAgICAgIH0KIApAQCAtMjU2LDEyICs0NjIsNiBAQAogICAgICAgICAgICAgICAgICAgICBzLT5tRW52aXJvbWVudC5tRnJhZ21lbnRTdG9yZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50U3RvcmUgKiBwZnMgPQotICAgICAgICAgICAgICAgICAgICAoUHJvZ3JhbUZyYWdtZW50U3RvcmUgKilyc2MtPmxvb2t1cE5hbWUoc3RyW2N0KzFdKTsKLSAgICAgICAgICAgICAgICBpZiAocGZzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+bUVudmlyb21lbnQubUZyYWdtZW50U3RvcmUuc2V0KHBmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBMT0dFKCJVbnJlY29uaXplZCB2YWx1ZSAlcyBwYXNzZWQgdG8gc3RhdGVTdG9yZSIsIHN0cltjdCsxXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTI3MywxMTEgKzQ3Myw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhcHBlbmRFbGVtZW50Qm9keShTdHJpbmc4ICpzLCBjb25zdCBFbGVtZW50ICplKQotewotICAgIHMtPmFwcGVuZCgiIHtcbiIpOwotICAgIGZvciAoc2l6ZV90IGN0Mj0wOyBjdDIgPCBlLT5nZXRGaWVsZENvdW50KCk7IGN0MisrKSB7Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmMgPSBlLT5nZXRGaWVsZChjdDIpOwotICAgICAgICBzLT5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGMtPmdldENUeXBlKCkpOwotICAgICAgICBzLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgcy0+YXBwZW5kKGUtPmdldEZpZWxkTmFtZShjdDIpKTsKLSAgICAgICAgcy0+YXBwZW5kKCI7XG4iKTsKLSAgICB9Ci0gICAgcy0+YXBwZW5kKCJ9Iik7Ci19Ci0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRWYXJEZWZpbmVzKGNvbnN0IENvbnRleHQgKnJzYywgU3RyaW5nOCAqc3RyKQotewotICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaWYgKHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMpIHsKLSAgICAgICAgTE9HRCgiYXBwZW5kVmFyRGVmaW5lcyBtSW50MzJEZWZpbmVzLnNpemUoKT0lZCBtRmxvYXREZWZpbmVzLnNpemUoKT0lZFxuIiwKLSAgICAgICAgICAgICAgICBtSW50MzJEZWZpbmVzLnNpemUoKSwgbUZsb2F0RGVmaW5lcy5zaXplKCkpOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBjdD0wOyBjdCA8IG1JbnQzMkRlZmluZXMuc2l6ZSgpOyBjdCsrKSB7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICBzdHItPmFwcGVuZChtSW50MzJEZWZpbmVzLmtleUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKCIgIik7Ci0gICAgICAgIHNwcmludGYoYnVmLCAiJWlcbiIsIChpbnQpbUludDMyRGVmaW5lcy52YWx1ZUF0KGN0KSk7Ci0gICAgICAgIHN0ci0+YXBwZW5kKGJ1Zik7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbUZsb2F0RGVmaW5lcy5zaXplKCk7IGN0KyspIHsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgIik7Ci0gICAgICAgIHN0ci0+YXBwZW5kKG1GbG9hdERlZmluZXMua2V5QXQoY3QpKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3ByaW50ZihidWYsICIlZmZcbiIsIG1GbG9hdERlZmluZXMudmFsdWVBdChjdCkpOwotICAgICAgICBzdHItPmFwcGVuZChidWYpOwotICAgIH0KLX0KLQotCi0KLXZvaWQgU2NyaXB0Q1N0YXRlOjphcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cikKLXsKLSAgICBjaGFyIGJ1ZlsyNTZdOwotICAgIFN0cmluZzggdG1wOwotCi0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNGMzJfMl9zIHtmbG9hdCB4OyBmbG9hdCB5O307XG4iKTsKLSAgICBzdHItPmFwcGVuZCgic3RydWN0IHZlY0YzMl8zX3Mge2Zsb2F0IHg7IGZsb2F0IHk7IGZsb2F0IHo7fTtcbiIpOwotICAgIHN0ci0+YXBwZW5kKCJzdHJ1Y3QgdmVjRjMyXzRfcyB7ZmxvYXQgeDsgZmxvYXQgeTsgZmxvYXQgejsgZmxvYXQgdzt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoInN0cnVjdCB2ZWNVOF80X3Mge2NoYXIgcjsgY2hhciBnOyBjaGFyIGI7IGNoYXIgYTt9O1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzJfdCBzdHJ1Y3QgdmVjRjMyXzJfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzNfdCBzdHJ1Y3QgdmVjRjMyXzNfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjRjMyXzRfdCBzdHJ1Y3QgdmVjRjMyXzRfc1xuIik7Ci0gICAgc3RyLT5hcHBlbmQoIiNkZWZpbmUgdmVjVThfNF90IHN0cnVjdCB2ZWNVOF80X3NcbiIpOwotICAgIHN0ci0+YXBwZW5kKCIjZGVmaW5lIHZlY0k4XzRfdCBzdHJ1Y3QgdmVjVThfNF9zXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewotICAgICAgICBjb25zdCBUeXBlICp0ID0gbUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpOwotICAgICAgICBpZiAoIXQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEVsZW1lbnQgKmUgPSB0LT5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlLT5nZXROYW1lKCkgJiYgKGUtPmdldEZpZWxkQ291bnQoKSA+IDEpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHMoInN0cnVjdCBzdHJ1Y3RfIik7Ci0gICAgICAgICAgICBzLmFwcGVuZChlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0Q1N0cnVjdEJvZHkoKSk7Ci0gICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIjZGVmaW5lICIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJfdCBzdHJ1Y3Qgc3RydWN0XyIpOwotICAgICAgICAgICAgcy5hcHBlbmQoZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgICAgICBpZiAocnNjLT5wcm9wcy5tTG9nU2NyaXB0cykgewotICAgICAgICAgICAgICAgIExPR1YoIiVzIiwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci0+YXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TbG90TmFtZXNbY3RdLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nOCBzOwotICAgICAgICAgICAgaWYgKGUtPmdldE5hbWUoKSkgewotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgbmFtZWQgc3RydWN0Ci0gICAgICAgICAgICAgICAgcy5zZXRUbyhlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gc3RydWN0IG5hbWVkIGZyb20gdGhlIHNsb3QuCi0gICAgICAgICAgICAgICAgcy5zZXRUbygic3RydWN0ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiX3MiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChlLT5nZXRDU3RydWN0Qm9keSgpKTsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZEVsZW1lbnRCb2R5KCZzLCBlKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiO1xuIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoInN0cnVjdCAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChtU2xvdE5hbWVzW2N0XSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIl9zIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMuYXBwZW5kKCIgKiAiKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKG1TbG90TmFtZXNbY3RdKTsKLSAgICAgICAgICAgIHMuYXBwZW5kKCI7XG4iKTsKLSAgICAgICAgICAgIGlmIChyc2MtPnByb3BzLm1Mb2dTY3JpcHRzKSB7Ci0gICAgICAgICAgICAgICAgTE9HVigiJXMiLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyLT5hcHBlbmQocyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDIwLDcgKzUxNSw2IEBACiAgICAgcy0+c2V0Q29udGV4dChyc2MpOwogICAgIGZvciAoaW50IGN0PTA7IGN0IDwgTUFYX1NDUklQVF9CQU5LUzsgY3QrKykgewogICAgICAgICBzLT5tVHlwZXNbY3RdLnNldChzcy0+bUNvbnN0YW50QnVmZmVyVHlwZXNbY3RdLmdldCgpKTsKLSAgICAgICAgcy0+bVNsb3ROYW1lc1tjdF0gPSBzcy0+bVNsb3ROYW1lc1tjdF07CiAgICAgICAgIHMtPm1TbG90V3JpdGFibGVbY3RdID0gc3MtPm1TbG90V3JpdGFibGVbY3RdOwogICAgIH0KIApAQCAtNDI4LDE4ICs1MjIsNiBAQAogICAgIHJldHVybiBzOwogfQogCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lRihDb250ZXh0ICpyc2MsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIFNjcmlwdENTdGF0ZSAqc3MgPSAmcnNjLT5tU2NyaXB0QzsKLSAgICBzcy0+bUZsb2F0RGVmaW5lcy5hZGQoU3RyaW5nOChuYW1lKSwgdmFsdWUpOwotfQotCi12b2lkIHJzaV9TY3JpcHRDU2V0RGVmaW5lSTMyKENvbnRleHQgKnJzYywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkKLXsKLSAgICBTY3JpcHRDU3RhdGUgKnNzID0gJnJzYy0+bVNjcmlwdEM7Ci0gICAgc3MtPm1JbnQzMkRlZmluZXMuYWRkKFN0cmluZzgobmFtZSksIHZhbHVlKTsKLX0KLQogfQogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Qy5oIGIvbGlicy9ycy9yc1NjcmlwdEMuaAppbmRleCAzNWFiYWRmLi45ZDA5YjBiIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5oCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDLmgKQEAgLTIxLDkgKzIxLDcgQEAKIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdEVudi5oIgogCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotc3RydWN0IEFDQ3NjcmlwdDsKK3N0cnVjdCBCQ0NzY3JpcHQ7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzQsNyArMzIsNyBAQAogY2xhc3MgU2NyaXB0QyA6IHB1YmxpYyBTY3JpcHQKIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIGludCAoKlJ1blNjcmlwdF90KSh1aW50MzJfdCBsYXVuY2hJbmRleCk7CisgICAgdHlwZWRlZiBpbnQgKCpSdW5TY3JpcHRfdCkoKTsKICAgICB0eXBlZGVmIHZvaWQgKCpWb2lkRnVuY190KSgpOwogCiAgICAgU2NyaXB0QyhDb250ZXh0ICopOwpAQCAtNDQsMTggKzQyLDM1IEBACiAgICAgICAgIGludCBtVmVyc2lvbk1ham9yOwogICAgICAgICBpbnQgbVZlcnNpb25NaW5vcjsKIAotICAgICAgICBSdW5TY3JpcHRfdCBtU2NyaXB0OworICAgICAgICBSdW5TY3JpcHRfdCBtUm9vdDsKICAgICAgICAgVm9pZEZ1bmNfdCBtSW5pdDsKLQotICAgICAgICB2b2lkICoqIG1TbG90UG9pbnRlcnNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgfTsKIAogICAgIFByb2dyYW1fdCBtUHJvZ3JhbTsKIAotICAgIEFDQ3NjcmlwdCogICAgbUFjY1NjcmlwdDsKKyAgICBCQ0NzY3JpcHQqICAgIG1CY2NTY3JpcHQ7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0dXBTY3JpcHQoKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICosIHVpbnQzMl90IGxhdW5jaElEKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICpwdHJUb0FsbG9jYXRpb24oY29uc3Qgdm9pZCAqKSBjb25zdDsKKworCisgICAgdmlydHVhbCB2b2lkIEludm9rZShDb250ZXh0ICpyc2MsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbik7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopOworCisgICAgdmlydHVhbCB2b2lkIHJ1bkZvckVhY2goQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKiBhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqIGFvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHVzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSc1NjcmlwdENhbGwgKnNjID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3QgeyAgICB9CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9TQ1JJUFRfQzsgfQorICAgIHN0YXRpYyBUeXBlICpjcmVhdGVGcm9tU3RyZWFtKENvbnRleHQgKnJzYywgSVN0cmVhbSAqc3RyZWFtKSB7IHJldHVybiBOVUxMOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHNldHVwU2NyaXB0KENvbnRleHQgKik7CisgICAgdm9pZCBzZXR1cEdMU3RhdGUoQ29udGV4dCAqKTsKKyAgICBTY3JpcHQgKiBzZXRUTFMoU2NyaXB0ICopOwogfTsKIAogY2xhc3MgU2NyaXB0Q1N0YXRlCkBAIC02NywyNyArODIsMjEgQEAKICAgICBTY3JpcHRDICptU2NyaXB0OwogCiAgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPiBtQ29uc3RhbnRCdWZmZXJUeXBlc1tNQVhfU0NSSVBUX0JBTktTXTsKLSAgICBTdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CisgICAgLy9TdHJpbmc4IG1TbG90TmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAgICAgYm9vbCBtU2xvdFdyaXRhYmxlW01BWF9TQ1JJUFRfQkFOS1NdOwotICAgIFN0cmluZzggbUludm9rYWJsZU5hbWVzW01BWF9TQ1JJUFRfQkFOS1NdOworICAgIC8vU3RyaW5nOCBtSW52b2thYmxlTmFtZXNbTUFYX1NDUklQVF9CQU5LU107CiAKICAgICB2b2lkIGNsZWFyKCk7CiAgICAgdm9pZCBydW5Db21waWxlcihDb250ZXh0ICpyc2MsIFNjcmlwdEMgKnMpOwotICAgIHZvaWQgYXBwZW5kVmFyRGVmaW5lcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7Ci0gICAgdm9pZCBhcHBlbmRUeXBlcyhjb25zdCBDb250ZXh0ICpyc2MsIFN0cmluZzggKnN0cik7CiAKICAgICBzdHJ1Y3QgU3ltYm9sVGFibGVfdCB7CiAgICAgICAgIGNvbnN0IGNoYXIgKiBtTmFtZTsKICAgICAgICAgdm9pZCAqIG1QdHI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKiBtUmV0OwotICAgICAgICBjb25zdCBjaGFyICogbVBhcmFtOwogICAgIH07Ci0gICAgc3RhdGljIFN5bWJvbFRhYmxlX3QgZ1N5bXNbXTsKKyAgICAvL3N0YXRpYyBTeW1ib2xUYWJsZV90IGdTeW1zW107CiAgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2woY29uc3QgY2hhciAqKTsKLSAgICBzdGF0aWMgdm9pZCBhcHBlbmREZWNscyhTdHJpbmc4ICpzdHIpOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxpbnQ+IG1JbnQzMkRlZmluZXM7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCxmbG9hdD4gbUZsb2F0RGVmaW5lczsKKyAgICBzdGF0aWMgY29uc3QgU3ltYm9sVGFibGVfdCAqIGxvb2t1cFN5bWJvbENMKGNvbnN0IGNoYXIgKik7CisgICAgc3RhdGljIGNvbnN0IFN5bWJvbFRhYmxlX3QgKiBsb29rdXBTeW1ib2xHTChjb25zdCBjaGFyICopOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAppbmRleCAyMDJjYTNkLi40MTgyOGRjIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKQEAgLTE3LDE4ICsxNyw5IEBACiAjaW5jbHVkZSAicnNDb250ZXh0LmgiCiAjaW5jbHVkZSAicnNTY3JpcHRDLmgiCiAjaW5jbHVkZSAicnNNYXRyaXguaCIKLSNpbmNsdWRlICJyc05vaXNlLmgiCiAKLSNpbmNsdWRlICJhY2MvYWNjLmgiCiAjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCiAKLSNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUwotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQogI2luY2x1ZGUgPHRpbWUuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CkBAIC0zOSwyNTIgKzMwLDExIEBACiAgICAgQ29udGV4dCAqIHJzYyA9IHRscy0+bUNvbnRleHQ7IFwKICAgICBTY3JpcHRDICogc2MgPSAoU2NyaXB0QyAqKSB0bHMtPm1TY3JpcHQKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGZsb2F0IHg7Ci0gICAgZmxvYXQgeTsKLSAgICBmbG9hdCB6OwotfSB2ZWMzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLSAgICBmbG9hdCB3OwotfSB2ZWM0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci19IHZlYzJfdDsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJTyByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyBmbG9hdCBTQ19sb2FkRih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgLy9MT0dFKCJsb2FkRiAlaSAlaSA9ICVmICV4IiwgYmFuaywgb2Zmc2V0LCBmLCAoKGludCAqKSZmKVswXSk7Ci0gICAgcmV0dXJuIGZbb2Zmc2V0XTsKLX0KLQotc3RhdGljIGludDMyX3QgU0NfbG9hZEkzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgaW50MzJfdCAqaSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDMyX3QgKj4odnApOwotICAgIC8vTE9HRSgibG9hZEkzMiAlaSAlaSA9ICVpIiwgYmFuaywgb2Zmc2V0LCB0KTsKLSAgICByZXR1cm4gaVtvZmZzZXRdOwotfQotCi1zdGF0aWMgZmxvYXQqIFNDX2xvYWRBcnJheUYodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8ZmxvYXQgKj4odnApOwotICAgIHJldHVybiBmICsgb2Zmc2V0OwotfQotCi1zdGF0aWMgaW50MzJfdCogU0NfbG9hZEFycmF5STMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBpbnQzMl90ICppID0gc3RhdGljX2Nhc3Q8aW50MzJfdCAqPih2cCk7Ci0gICAgcmV0dXJuIGkgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCogU0NfbG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YoUnNTaW1wbGVNZXNoIG1lc2gsIHVpbnQzMl90IGlkeCkKLXsKLSAgICBTaW1wbGVNZXNoICp0bSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4obWVzaCk7Ci0gICAgdm9pZCAqdnAgPSB0bS0+bVZlcnRleEJ1ZmZlcnNbaWR4XS0+Z2V0UHRyKCk7OwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3VwZGF0ZVNpbXBsZU1lc2goUnNTaW1wbGVNZXNoIG1lc2gpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtZXNoKTsKLSAgICBzbS0+dXBsb2FkQWxsKHJzYyk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBTQ19sb2FkVTMyKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgY29uc3Qgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBjb25zdCB1aW50MzJfdCAqaSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQzMl90ICo+KHZwKTsKLSAgICByZXR1cm4gaVtvZmZzZXRdOwotfQotCi1zdGF0aWMgdm9pZCBTQ19sb2FkVmVjNCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIHJzY19WZWN0b3I0ICp2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBjb25zdCB2b2lkICp2cCA9IHNjLT5tU2xvdHNbYmFua10tPmdldFB0cigpOwotICAgIGNvbnN0IGZsb2F0ICpmID0gc3RhdGljX2Nhc3Q8Y29uc3QgZmxvYXQgKj4odnApOwotICAgIG1lbWNweSh2LCAmZltvZmZzZXRdLCBzaXplb2YocnNjX1ZlY3RvcjQpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbG9hZE1hdHJpeCh1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIHJzY19NYXRyaXggKm0pCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGNvbnN0IHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgY29uc3QgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxjb25zdCBmbG9hdCAqPih2cCk7Ci0gICAgbWVtY3B5KG0sICZmW29mZnNldF0sIHNpemVvZihyc2NfTWF0cml4KSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVGKHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgZmxvYXQgdikKLXsKLSAgICAvL0xPR0UoInN0b3JlRiAlaSAlaSAlZiIsIGJhbmssIG9mZnNldCwgdik7Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgZmxvYXQgKmYgPSBzdGF0aWNfY2FzdDxmbG9hdCAqPih2cCk7Ci0gICAgZltvZmZzZXRdID0gdjsKLX0KLQotc3RhdGljIHZvaWQgU0Nfc3RvcmVJMzIodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgaW50MzJfdCAqZiA9IHN0YXRpY19jYXN0PGludDMyX3QgKj4odnApOwotICAgIHN0YXRpY19jYXN0PGludDMyX3QgKj4oc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCkpW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZVUzMih1aW50MzJfdCBiYW5rLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHYpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHZvaWQgKnZwID0gc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCk7Ci0gICAgdWludDMyX3QgKmYgPSBzdGF0aWNfY2FzdDx1aW50MzJfdCAqPih2cCk7Ci0gICAgc3RhdGljX2Nhc3Q8dWludDMyX3QgKj4oc2MtPm1TbG90c1tiYW5rXS0+Z2V0UHRyKCkpW29mZnNldF0gPSB2OwotfQotCi1zdGF0aWMgdm9pZCBTQ19zdG9yZVZlYzQodWludDMyX3QgYmFuaywgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCByc2NfVmVjdG9yNCAqdikKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkoJmZbb2Zmc2V0XSwgdiwgc2l6ZW9mKHJzY19WZWN0b3I0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3N0b3JlTWF0cml4KHVpbnQzMl90IGJhbmssIHVpbnQzMl90IG9mZnNldCwgY29uc3QgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgdm9pZCAqdnAgPSBzYy0+bVNsb3RzW2JhbmtdLT5nZXRQdHIoKTsKLSAgICBmbG9hdCAqZiA9IHN0YXRpY19jYXN0PGZsb2F0ICo+KHZwKTsKLSAgICBtZW1jcHkoJmZbb2Zmc2V0XSwgbSwgc2l6ZW9mKHJzY19NYXRyaXgpKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWZWMzIHJvdXRpbmVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfdmVjM05vcm0odmVjM190ICp2KQotewotICAgIGZsb2F0IGxlbiA9IHNxcnRmKHYtPnggKiB2LT54ICsgdi0+eSAqIHYtPnkgKyB2LT56ICogdi0+eik7Ci0gICAgbGVuID0gMSAvIGxlbjsKLSAgICB2LT54ICo9IGxlbjsKLSAgICB2LT55ICo9IGxlbjsKLSAgICB2LT56ICo9IGxlbjsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzNMZW5ndGgoY29uc3QgdmVjM190ICp2KQotewotICAgIHJldHVybiBzcXJ0Zih2LT54ICogdi0+eCArIHYtPnkgKiB2LT55ICsgdi0+eiAqIHYtPnopOwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWMzQWRkKHZlYzNfdCAqZGVzdCwgY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIGRlc3QtPnggPSBsaHMtPnggKyByaHMtPng7Ci0gICAgZGVzdC0+eSA9IGxocy0+eSArIHJocy0+eTsKLSAgICBkZXN0LT56ID0gbGhzLT56ICsgcmhzLT56OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWMzU3ViKHZlYzNfdCAqZGVzdCwgY29uc3QgdmVjM190ICpsaHMsIGNvbnN0IHZlYzNfdCAqcmhzKQotewotICAgIGRlc3QtPnggPSBsaHMtPnggLSByaHMtPng7Ci0gICAgZGVzdC0+eSA9IGxocy0+eSAtIHJocy0+eTsKLSAgICBkZXN0LT56ID0gbGhzLT56IC0gcmhzLT56OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWMzQ3Jvc3ModmVjM190ICpkZXN0LCBjb25zdCB2ZWMzX3QgKmxocywgY29uc3QgdmVjM190ICpyaHMpCi17Ci0gICAgZmxvYXQgeCA9IGxocy0+eSAqIHJocy0+eiAgLSBsaHMtPnogKiByaHMtPnk7Ci0gICAgZmxvYXQgeSA9IGxocy0+eiAqIHJocy0+eCAgLSBsaHMtPnggKiByaHMtPno7Ci0gICAgZmxvYXQgeiA9IGxocy0+eCAqIHJocy0+eSAgLSBsaHMtPnkgKiByaHMtPng7Ci0gICAgZGVzdC0+eCA9IHg7Ci0gICAgZGVzdC0+eSA9IHk7Ci0gICAgZGVzdC0+eiA9IHo7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWMzRG90KGNvbnN0IHZlYzNfdCAqbGhzLCBjb25zdCB2ZWMzX3QgKnJocykKLXsKLSAgICByZXR1cm4gbGhzLT54ICogcmhzLT54ICsgbGhzLT55ICogcmhzLT55ICsgbGhzLT56ICogcmhzLT56OwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWMzU2NhbGUodmVjM190ICpsaHMsIGZsb2F0IHNjYWxlKQotewotICAgIGxocy0+eCAqPSBzY2FsZTsKLSAgICBsaHMtPnkgKj0gc2NhbGU7Ci0gICAgbGhzLT56ICo9IHNjYWxlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFZlYzQgcm91dGluZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192ZWM0Tm9ybSh2ZWM0X3QgKnYpCi17Ci0gICAgZmxvYXQgbGVuID0gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56ICsgdi0+dyAqIHYtPncpOwotICAgIGxlbiA9IDEgLyBsZW47Ci0gICAgdi0+eCAqPSBsZW47Ci0gICAgdi0+eSAqPSBsZW47Ci0gICAgdi0+eiAqPSBsZW47Ci0gICAgdi0+dyAqPSBsZW47Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ192ZWM0TGVuZ3RoKGNvbnN0IHZlYzRfdCAqdikKLXsKLSAgICByZXR1cm4gc3FydGYodi0+eCAqIHYtPnggKyB2LT55ICogdi0+eSArIHYtPnogKiB2LT56ICsgdi0+dyAqIHYtPncpOwotfQotCi1zdGF0aWMgdm9pZCBTQ192ZWM0QWRkKHZlYzRfdCAqZGVzdCwgY29uc3QgdmVjNF90ICpsaHMsIGNvbnN0IHZlYzRfdCAqcmhzKQotewotICAgIGRlc3QtPnggPSBsaHMtPnggKyByaHMtPng7Ci0gICAgZGVzdC0+eSA9IGxocy0+eSArIHJocy0+eTsKLSAgICBkZXN0LT56ID0gbGhzLT56ICsgcmhzLT56OwotICAgIGRlc3QtPncgPSBsaHMtPncgKyByaHMtPnc7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRTdWIodmVjNF90ICpkZXN0LCBjb25zdCB2ZWM0X3QgKmxocywgY29uc3QgdmVjNF90ICpyaHMpCi17Ci0gICAgZGVzdC0+eCA9IGxocy0+eCAtIHJocy0+eDsKLSAgICBkZXN0LT55ID0gbGhzLT55IC0gcmhzLT55OwotICAgIGRlc3QtPnogPSBsaHMtPnogLSByaHMtPno7Ci0gICAgZGVzdC0+dyA9IGxocy0+dyAtIHJocy0+dzsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3ZlYzREb3QoY29uc3QgdmVjNF90ICpsaHMsIGNvbnN0IHZlYzRfdCAqcmhzKQotewotICAgIHJldHVybiBsaHMtPnggKiByaHMtPnggKyBsaHMtPnkgKiByaHMtPnkgKyBsaHMtPnogKiByaHMtPnogKyBsaHMtPncgKiByaHMtPnc7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZlYzRTY2FsZSh2ZWM0X3QgKmxocywgZmxvYXQgc2NhbGUpCi17Ci0gICAgbGhzLT54ICo9IHNjYWxlOwotICAgIGxocy0+eSAqPSBzY2FsZTsKLSAgICBsaHMtPnogKj0gc2NhbGU7Ci0gICAgbGhzLT53ICo9IHNjYWxlOwotfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIE1hdGggcm91dGluZXMKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi0jZGVmaW5lIFBJIDMuMTQxNTkyNmYKLSNkZWZpbmUgREVHX1RPX1JBRCBQSSAvIDE4MC4wZgotI2RlZmluZSBSQURfVE9fREVHIDE4MC4wZiAvIFBJCi0KIHN0YXRpYyBmbG9hdCBTQ19zaW5mX2Zhc3QoZmxvYXQgeCkKIHsKICAgICBjb25zdCBmbG9hdCBBID0gICAxLjBmIC8gKDIuMGYgKiBNX1BJKTsKQEAgLTMyMyw2ICs3Myw3IEBACiAgICAgcmV0dXJuIDAuMjIxNWYgKiAoeSAqIGZhYnNmKHkpIC0geSkgKyB5OwogfQogCisKIHN0YXRpYyBmbG9hdCBTQ19yYW5kZihmbG9hdCBtYXgpCiB7CiAgICAgZmxvYXQgciA9IChmbG9hdClyYW5kKCk7CkBAIC0zMzUsMTA0ICs4NiwyMCBAQAogICAgIHJldHVybiByIC8gUkFORF9NQVggKiAobWF4IC0gbWluKSArIG1pbjsKIH0KIAotc3RhdGljIGludCBTQ19zaWduKGludCB2YWx1ZSkKK3N0YXRpYyBpbnQgU0NfcmFuZGkoaW50IG1heCkKIHsKLSAgICByZXR1cm4gKHZhbHVlID4gMCkgLSAodmFsdWUgPCAwKTsKKyAgICByZXR1cm4gKGludClTQ19yYW5kZihtYXgpOwogfQogCi1zdGF0aWMgZmxvYXQgU0Nfc2lnbmYoZmxvYXQgdmFsdWUpCitzdGF0aWMgaW50IFNDX3JhbmRpMihpbnQgbWluLCBpbnQgbWF4KQogewotICAgIHJldHVybiAodmFsdWUgPiAwKSAtICh2YWx1ZSA8IDApOworICAgIHJldHVybiAoaW50KVNDX3JhbmRmMihtaW4sIG1heCk7CiB9CiAKLXN0YXRpYyBmbG9hdCBTQ19jbGFtcGYoZmxvYXQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpCitzdGF0aWMgZmxvYXQgU0NfZnJhYyhmbG9hdCB2KQogewotICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOwotfQotCi1zdGF0aWMgaW50IFNDX2NsYW1wKGludCBhbW91bnQsIGludCBsb3csIGludCBoaWdoKQotewotICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWF4ZihmbG9hdCBhLCBmbG9hdCBiKQotewotICAgIHJldHVybiBhID4gYiA/IGEgOiBiOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWluZihmbG9hdCBhLCBmbG9hdCBiKQotewotICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOwotfQotCi1zdGF0aWMgZmxvYXQgU0Nfc3FyZihmbG9hdCB2KQotewotICAgIHJldHVybiB2ICogdjsKLX0KLQotc3RhdGljIGludCBTQ19zcXIoaW50IHYpCi17Ci0gICAgcmV0dXJuIHYgKiB2OwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZnJhY2YoZmxvYXQgdikKLXsKLSAgICByZXR1cm4gdiAtIGZsb29yZih2KTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX3JvdW5kZihmbG9hdCB2KQotewotICAgIHJldHVybiBmbG9vcmYodiArIDAuNDk5OTk5OTk5OSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19kaXN0ZjIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpCi17Ci0gICAgZmxvYXQgeCA9IHgyIC0geDE7Ci0gICAgZmxvYXQgeSA9IHkyIC0geTE7Ci0gICAgcmV0dXJuIHNxcnRmKHggKiB4ICsgeSAqIHkpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGlzdGYzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIpCi17Ci0gICAgZmxvYXQgeCA9IHgyIC0geDE7Ci0gICAgZmxvYXQgeSA9IHkyIC0geTE7Ci0gICAgZmxvYXQgeiA9IHoyIC0gejE7Ci0gICAgcmV0dXJuIHNxcnRmKHggKiB4ICsgeSAqIHkgKyB6ICogeik7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19tYWdmMihmbG9hdCBhLCBmbG9hdCBiKQotewotICAgIHJldHVybiBzcXJ0ZihhICogYSArIGIgKiBiKTsKLX0KLQotc3RhdGljIGZsb2F0IFNDX21hZ2YzKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpCi17Ci0gICAgcmV0dXJuIHNxcnRmKGEgKiBhICsgYiAqIGIgKyBjICogYyk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19yYWRmKGZsb2F0IGRlZ3JlZXMpCi17Ci0gICAgcmV0dXJuIGRlZ3JlZXMgKiBERUdfVE9fUkFEOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfZGVnZihmbG9hdCByYWRpYW5zKQotewotICAgIHJldHVybiByYWRpYW5zICogUkFEX1RPX0RFRzsKLX0KLQotc3RhdGljIGZsb2F0IFNDX2xlcnBmKGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpCi17Ci0gICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Ci19Ci0KLXN0YXRpYyBmbG9hdCBTQ19ub3JtZihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgdmFsdWUpCi17Ci0gICAgcmV0dXJuICh2YWx1ZSAtIHN0YXJ0KSAvIChzdG9wIC0gc3RhcnQpOwotfQotCi1zdGF0aWMgZmxvYXQgU0NfbWFwZihmbG9hdCBtaW5TdGFydCwgZmxvYXQgbWluU3RvcCwgZmxvYXQgbWF4U3RhcnQsIGZsb2F0IG1heFN0b3AsIGZsb2F0IHZhbHVlKQotewotICAgIHJldHVybiBtYXhTdGFydCArIChtYXhTdGFydCAtIG1heFN0b3ApICogKCh2YWx1ZSAtIG1pblN0YXJ0KSAvIChtaW5TdG9wIC0gbWluU3RhcnQpKTsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01MTEsMzQ4ICsxNzgsMjIgQEAKICAgICByZXR1cm4gdGltZWluZm8tPnRtX3llYXI7CiB9CiAKLXN0YXRpYyBpbnQzMl90IFNDX3VwdGltZU1pbGxpcygpCitzdGF0aWMgaW50NjRfdCBTQ191cHRpbWVNaWxsaXMoKQogewogICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMoc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpKTsKIH0KIAotc3RhdGljIGludDMyX3QgU0Nfc3RhcnRUaW1lTWlsbGlzKCkKK3N0YXRpYyBpbnQ2NF90IFNDX3VwdGltZU5hbm9zKCkKK3sKKyAgICByZXR1cm4gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworfQorCitzdGF0aWMgZmxvYXQgU0NfZ2V0RHQoKQogewogICAgIEdFVF9UTFMoKTsKLSAgICByZXR1cm4gc2MtPm1FbnZpcm9tZW50Lm1TdGFydFRpbWVNaWxsaXM7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IFNDX2VsYXBzZWRUaW1lTWlsbGlzKCkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykpCi0gICAgICAgICAgICAtIHNjLT5tRW52aXJvbWVudC5tU3RhcnRUaW1lTWlsbGlzOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1hdHJpeCByb3V0aW5lcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4TG9hZElkZW50aXR5KHJzY19NYXRyaXggKm1hdCkKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRJZGVudGl0eSgpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkRmxvYXQocnNjX01hdHJpeCAqbWF0LCBjb25zdCBmbG9hdCAqZikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWQoZik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRNYXQocnNjX01hdHJpeCAqbWF0LCBjb25zdCByc2NfTWF0cml4ICpuZXdtYXQpCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5sb2FkKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4ICo+KG5ld21hdCkpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkUm90YXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZFJvdGF0ZShyb3QsIHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkU2NhbGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZFNjYWxlKHgsIHksIHopOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhMb2FkVHJhbnNsYXRlKHJzY19NYXRyaXggKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPmxvYWRUcmFuc2xhdGUoeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeExvYWRNdWx0aXBseShyc2NfTWF0cml4ICptYXQsIGNvbnN0IHJzY19NYXRyaXggKmxocywgY29uc3QgcnNjX01hdHJpeCAqcmhzKQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+bG9hZE11bHRpcGx5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4ICo+KGxocyksCi0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4ICo+KHJocykpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhNdWx0aXBseShyc2NfTWF0cml4ICptYXQsIGNvbnN0IHJzY19NYXRyaXggKnJocykKLXsKLSAgICBNYXRyaXggKm0gPSByZWludGVycHJldF9jYXN0PE1hdHJpeCAqPihtYXQpOwotICAgIG0tPm11bHRpcGx5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWF0cml4ICo+KHJocykpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19tYXRyaXhSb3RhdGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT5yb3RhdGUocm90LCB4LCB5LCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfbWF0cml4U2NhbGUocnNjX01hdHJpeCAqbWF0LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KQotewotICAgIE1hdHJpeCAqbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWF0cml4ICo+KG1hdCk7Ci0gICAgbS0+c2NhbGUoeCwgeSwgeik7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX21hdHJpeFRyYW5zbGF0ZShyc2NfTWF0cml4ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgTWF0cml4ICptID0gcmVpbnRlcnByZXRfY2FzdDxNYXRyaXggKj4obWF0KTsKLSAgICBtLT50cmFuc2xhdGUoeCwgeSwgeik7Ci19Ci0KLQotc3RhdGljIHZvaWQgU0NfdmVjMlJhbmQoZmxvYXQgKnZlYywgZmxvYXQgbWF4TGVuKQotewotICAgIGZsb2F0IGFuZ2xlID0gU0NfcmFuZGYoUEkgKiAyKTsKLSAgICBmbG9hdCBsZW4gPSBTQ19yYW5kZihtYXhMZW4pOwotICAgIHZlY1swXSA9IGxlbiAqIHNpbmYoYW5nbGUpOwotICAgIHZlY1sxXSA9IGxlbiAqIGNvc2YoYW5nbGUpOwotfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb250ZXh0Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIHZvaWQgU0NfYmluZFRleHR1cmUoUnNQcm9ncmFtRnJhZ21lbnQgdnBmLCB1aW50MzJfdCBzbG90LCBSc0FsbG9jYXRpb24gdmEpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Qcm9ncmFtQmluZFRleHR1cmUocnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJvZ3JhbUZyYWdtZW50ICo+KHZwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIFNDX2JpbmRTYW1wbGVyKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNTYW1wbGVyIHZzKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfUHJvZ3JhbUJpbmRTYW1wbGVyKHJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNhbXBsZXIgKj4odnMpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbUZyYWdtZW50U3RvcmUoUnNQcm9ncmFtRnJhZ21lbnRTdG9yZSBwZnMpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudFN0b3JlKHJzYywgcGZzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbUZyYWdtZW50KFJzUHJvZ3JhbUZyYWdtZW50IHBmKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtRnJhZ21lbnQocnNjLCBwZik7Ci0KLX0KLQotc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOwotCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVlAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgdm9pZCBTQ192cExvYWRNb2RlbE1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQotewotICAgIEdFVF9UTFMoKTsKLSAgICByc2MtPmdldFZlcnRleCgpLT5zZXRNb2RlbHZpZXdNYXRyaXgobSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX3ZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgcnNjX01hdHJpeCAqbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgcnNjLT5nZXRWZXJ0ZXgoKS0+c2V0VGV4dHVyZU1hdHJpeChtKTsKLX0KLQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRHJhd2luZwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB2b2lkIFNDX2RyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmbG9hdCB2dHhbXSA9IHsgeDEsIHkxLCB6MSwgeDIsIHkyLCB6MiB9OwotICAgIFZlcnRleEFycmF5IHZhOwotICAgIHZhLmFkZExlZ2FjeShHTF9GTE9BVCwgMywgMTIsIFJTX0tJTkRfUE9TSVRJT04sIGZhbHNlLCAodWludDMyX3QpdnR4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX0xJTkVTLCAwLCAyKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1BvaW50KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZsb2F0IHZ0eFtdID0geyB4LCB5LCB6IH07Ci0KLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDMsIDEyLCBSU19LSU5EX1BPU0lUSU9OLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCk7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YS5zZXR1cEdMKHJzYywgJnJzYy0+bVN0YXRlVmVydGV4QXJyYXkpOwotICAgIH0KLQotICAgIGdsRHJhd0FycmF5cyhHTF9QT0lOVFMsIDAsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQotewotICAgIEdFVF9UTFMoKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvL0xPR0UoIlF1YWQiKTsKLSAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MSwgeTEsIHoxKTsKLSAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MiwgeTIsIHoyKTsKLSAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MywgeTMsIHozKTsKLSAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4NCwgeTQsIHo0KTsKLQotICAgIGZsb2F0IHZ0eFtdID0ge3gxLHkxLHoxLCB4Mix5Mix6MiwgeDMseTMsejMsIHg0LHk0LHo0fTsKLSAgICBjb25zdCBmbG9hdCB0ZXhbXSA9IHt1MSx2MSwgdTIsdjIsIHUzLHYzLCB1NCx2NH07Ci0KLSAgICBWZXJ0ZXhBcnJheSB2YTsKLSAgICB2YS5hZGRMZWdhY3koR0xfRkxPQVQsIDMsIDEyLCBSU19LSU5EX1BPU0lUSU9OLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCk7Ci0gICAgdmEuYWRkTGVnYWN5KEdMX0ZMT0FULCAyLCA4LCBSU19LSU5EX1RFWFRVUkUsIGZhbHNlLCAodWludDMyX3QpdGV4KTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICB2YS5zZXR1cEdMMihyc2MsICZyc2MtPm1TdGF0ZVZlcnRleEFycmF5LCAmcnNjLT5tU2hhZGVyQ2FjaGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSk7Ci0gICAgfQotCi0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1F1YWQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCkKLXsKLSAgICBTQ19kcmF3UXVhZFRleENvb3Jkcyh4MSwgeTEsIHoxLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIHgyLCB5MiwgejIsIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeDMsIHkzLCB6MywgMSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4NCwgeTQsIHo0LCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgUHJvZ3JhbVZlcnRleD4gdG1wKHJzYy0+Z2V0VmVydGV4KCkpOwotICAgIHJzYy0+c2V0VmVydGV4KHJzYy0+Z2V0RGVmYXVsdFByb2dyYW1WZXJ0ZXgoKSk7Ci0gICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKLQotICAgIC8vR0xpbnQgY3JvcFs0XSA9IHswLCBoLCB3LCAtaH07Ci0KLSAgICBmbG9hdCBzaCA9IHJzYy0+Z2V0SGVpZ2h0KCk7Ci0KLSAgICBTQ19kcmF3UXVhZCh4LCAgIHNoIC0geSwgICAgIHosCi0gICAgICAgICAgICAgICAgeCt3LCBzaCAtIHksICAgICB6LAotICAgICAgICAgICAgICAgIHgrdywgc2ggLSAoeStoKSwgeiwKLSAgICAgICAgICAgICAgICB4LCAgIHNoIC0gKHkraCksIHopOwotICAgIHJzYy0+c2V0VmVydGV4KChQcm9ncmFtVmVydGV4ICopdG1wLmdldCgpKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoLAotICAgICAgICBmbG9hdCBjeDAsIGZsb2F0IGN5MCwgZmxvYXQgY3gxLCBmbG9hdCBjeTEpCi17Ci0gICAgR0VUX1RMUygpOwotICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdMaW50IGNyb3BbNF0gPSB7Y3gwLCBjeTAsIGN4MSwgY3kxfTsKLSAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgZ2xEcmF3VGV4Zk9FUyh4LCB5LCB6LCB3LCBoKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1Nwcml0ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBmbG9hdCB2aW5bM10gPSB7eCwgeSwgen07Ci0gICAgZmxvYXQgdm91dFs0XTsKLQotICAgIC8vTE9HRSgiZHMgIGluICVmICVmICVmIiwgeCwgeSwgeik7Ci0gICAgcnNjLT5nZXRWZXJ0ZXgoKS0+dHJhbnNmb3JtVG9TY3JlZW4ocnNjLCB2b3V0LCB2aW4pOwotICAgIC8vTE9HRSgiZHMgIG91dCAlZiAlZiAlZiAlZiIsIHZvdXRbMF0sIHZvdXRbMV0sIHZvdXRbMl0sIHZvdXRbM10pOwotICAgIHZvdXRbMF0gLz0gdm91dFszXTsKLSAgICB2b3V0WzFdIC89IHZvdXRbM107Ci0gICAgdm91dFsyXSAvPSB2b3V0WzNdOwotCi0gICAgdm91dFswXSAqPSByc2MtPmdldFdpZHRoKCkgLyAyOwotICAgIHZvdXRbMV0gKj0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7Ci0gICAgdm91dFswXSArPSByc2MtPmdldFdpZHRoKCkgLyAyOwotICAgIHZvdXRbMV0gKz0gcnNjLT5nZXRIZWlnaHQoKSAvIDI7Ci0KLSAgICB2b3V0WzBdIC09IHcvMjsKLSAgICB2b3V0WzFdIC09IGgvMjsKLQotICAgIC8vTE9HRSgiZHMgIG91dDIgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdKTsKLQotICAgIC8vIFUsIFYsIFcsIEgKLSAgICBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2Uodm91dFswXSwgdm91dFsxXSwgeiwgaCwgdyk7Ci0gICAgLy9yc2MtPnNldHVwQ2hlY2soKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBTQ19kcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopCi17Ci0gICAgU0NfZHJhd1F1YWQoeDEsIHkyLCB6LAotICAgICAgICAgICAgICAgIHgyLCB5MiwgeiwKLSAgICAgICAgICAgICAgICB4MiwgeTEsIHosCi0gICAgICAgICAgICAgICAgeDEsIHkxLCB6KTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2goUnNTaW1wbGVNZXNoIHZzbSkKLXsKLSAgICBHRVRfVExTKCk7Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KHZzbSk7Ci0gICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNtLT5yZW5kZXIocnNjKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfZHJhd1NpbXBsZU1lc2hSYW5nZShSc1NpbXBsZU1lc2ggdnNtLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQotewotICAgIEdFVF9UTFMoKTsKLSAgICBTaW1wbGVNZXNoICpzbSA9IHN0YXRpY19jYXN0PFNpbXBsZU1lc2ggKj4odnNtKTsKLSAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc20tPnJlbmRlclJhbmdlKHJzYywgc3RhcnQsIGxlbik7CisgICAgaW50NjRfdCBsID0gc2MtPm1FbnZpcm9tZW50Lm1MYXN0RHRUaW1lOworICAgIHNjLT5tRW52aXJvbWVudC5tTGFzdER0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICByZXR1cm4gKChmbG9hdCkoc2MtPm1FbnZpcm9tZW50Lm1MYXN0RHRUaW1lIC0gbCkpIC8gMS4wZTk7CiB9CiAKIApAQCAtODYwLDUzMSArMjAxLDI3OSBAQAogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgdm9pZCBTQ19jb2xvcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltWChSc0FsbG9jYXRpb24gdmEpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzBdID0gcjsKLSAgICByc2MtPm1TdGF0ZVZlcnRleC5jb2xvclsxXSA9IGc7Ci0gICAgcnNjLT5tU3RhdGVWZXJ0ZXguY29sb3JbMl0gPSBiOwotICAgIHJzYy0+bVN0YXRlVmVydGV4LmNvbG9yWzNdID0gYTsKLSAgICBpZiAoIXJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZ2xDb2xvcjRmKHIsIGcsIGIsIGEpOwotICAgIH0KKyAgICBjb25zdCBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8Y29uc3QgQWxsb2NhdGlvbiAqPih2YSk7CisgICAgLy9MT0dFKCJTQ19hbGxvY0dldERpbVggYT0lcCIsIGEpOworICAgIC8vTE9HRSgiIHR5cGU9JXAiLCBhLT5nZXRUeXBlKCkpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbVgoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfYW1iaWVudChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IHIsIGcsIGIsIGEgfTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0FNQklFTlQsIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2RpZmZ1c2UoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKLXsKLSAgICBHTGZsb2F0IHBhcmFtc1tdID0geyByLCBnLCBiLCBhIH07Ci0gICAgZ2xNYXRlcmlhbGZ2KEdMX0ZST05UX0FORF9CQUNLLCBHTF9ESUZGVVNFLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19zcGVjdWxhcihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IHIsIGcsIGIsIGEgfTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19lbWlzc2lvbihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IHIsIGcsIGIsIGEgfTsKLSAgICBnbE1hdGVyaWFsZnYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX0VNSVNTSU9OLCBwYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19zaGluaW5lc3MoZmxvYXQgcykKLXsKLSAgICBnbE1hdGVyaWFsZihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU0hJTklORVNTLCBzKTsKLX0KLQotc3RhdGljIHZvaWQgU0NfcG9pbnRBdHRlbnVhdGlvbihmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKQotewotICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7IGEsIGIsIGMgfTsKLSAgICBnbFBvaW50UGFyYW1ldGVyZnYoR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04sIHBhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNDX2hzYlRvUmdiKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0KiByZ2IpCi17Ci0gICAgZmxvYXQgcmVkID0gMC4wZjsKLSAgICBmbG9hdCBncmVlbiA9IDAuMGY7Ci0gICAgZmxvYXQgYmx1ZSA9IDAuMGY7Ci0KLSAgICBmbG9hdCB4ID0gaDsKLSAgICBmbG9hdCB5ID0gczsKLSAgICBmbG9hdCB6ID0gYjsKLQotICAgIGZsb2F0IGhmID0gKHggLSAoaW50KSB4KSAqIDYuMGY7Ci0gICAgaW50IGloZiA9IChpbnQpIGhmOwotICAgIGZsb2F0IGYgPSBoZiAtIGloZjsKLSAgICBmbG9hdCBwdiA9IHogKiAoMS4wZiAtIHkpOwotICAgIGZsb2F0IHF2ID0geiAqICgxLjBmIC0geSAqIGYpOwotICAgIGZsb2F0IHR2ID0geiAqICgxLjBmIC0geSAqICgxLjBmIC0gZikpOwotCi0gICAgc3dpdGNoIChpaGYpIHsKLSAgICAgICAgY2FzZSAwOiAgICAgICAgIC8vIFJlZCBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHo7Ci0gICAgICAgICAgICBncmVlbiA9IHR2OwotICAgICAgICAgICAgYmx1ZSA9IHB2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogICAgICAgICAvLyBHcmVlbiBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHF2OwotICAgICAgICAgICAgZ3JlZW4gPSB6OwotICAgICAgICAgICAgYmx1ZSA9IHB2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJlZCA9IHB2OwotICAgICAgICAgICAgZ3JlZW4gPSB6OwotICAgICAgICAgICAgYmx1ZSA9IHR2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogICAgICAgICAvLyBCbHVlIGlzIHRoZSBkb21pbmFudCBjb2xvcgotICAgICAgICAgICAgcmVkID0gcHY7Ci0gICAgICAgICAgICBncmVlbiA9IHF2OwotICAgICAgICAgICAgYmx1ZSA9IHo7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmVkID0gdHY7Ci0gICAgICAgICAgICBncmVlbiA9IHB2OwotICAgICAgICAgICAgYmx1ZSA9IHo7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OiAgICAgICAgIC8vIFJlZCBpcyB0aGUgZG9taW5hbnQgY29sb3IKLSAgICAgICAgICAgIHJlZCA9IHo7Ci0gICAgICAgICAgICBncmVlbiA9IHB2OwotICAgICAgICAgICAgYmx1ZSA9IHF2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmdiWzBdID0gcmVkOwotICAgIHJnYlsxXSA9IGdyZWVuOwotICAgIHJnYlsyXSA9IGJsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgU0NfaHNiVG9BYmdyKGZsb2F0IGgsIGZsb2F0IHMsIGZsb2F0IGIsIGZsb2F0IGEpCi17Ci0gICAgZmxvYXQgcmdiWzNdOwotICAgIFNDX2hzYlRvUmdiKGgsIHMsIGIsIHJnYik7Ci0gICAgcmV0dXJuIGludChhICAgICAgKiAyNTUuMGYpIDw8IDI0IHwKLSAgICAgICAgICAgaW50KHJnYlsyXSAqIDI1NS4wZikgPDwgMTYgfAotICAgICAgICAgICBpbnQocmdiWzFdICogMjU1LjBmKSA8PCAgOCB8Ci0gICAgICAgICAgIGludChyZ2JbMF0gKiAyNTUuMGYpOwotfQotCi1zdGF0aWMgdm9pZCBTQ19oc2IoZmxvYXQgaCwgZmxvYXQgcywgZmxvYXQgYiwgZmxvYXQgYSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbVkoUnNBbGxvY2F0aW9uIHZhKQogewogICAgIEdFVF9UTFMoKTsKLSAgICBmbG9hdCByZ2JbM107Ci0gICAgU0NfaHNiVG9SZ2IoaCwgcywgYiwgcmdiKTsKLSAgICBpZiAocnNjLT5jaGVja1ZlcnNpb24yXzAoKSkgewotICAgICAgICBnbFZlcnRleEF0dHJpYjRmKDEsIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ29sb3I0ZihyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBhKTsKLSAgICB9CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbVkoKTsKIH0KIAotc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgYmFzZU1pcExldmVsKQorc3RhdGljIHVpbnQzMl90IFNDX2FsbG9jR2V0RGltWihSc0FsbG9jYXRpb24gdmEpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCBiYXNlTWlwTGV2ZWwpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1aKCk7CiB9CiAKLXN0YXRpYyB2b2lkIFNDX3VwbG9hZFRvQnVmZmVyT2JqZWN0KFJzQWxsb2NhdGlvbiB2YSkKK3N0YXRpYyB1aW50MzJfdCBTQ19hbGxvY0dldERpbUxPRChSc0FsbG9jYXRpb24gdmEpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjLCB2YSk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYSA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmEpOworICAgIHJldHVybiBhLT5nZXRUeXBlKCktPmdldERpbUxPRCgpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19zeW5jVG9HTChSc0FsbG9jYXRpb24gdmEpCitzdGF0aWMgdWludDMyX3QgU0NfYWxsb2NHZXREaW1GYWNlcyhSc0FsbG9jYXRpb24gdmEpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKLQorICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICByZXR1cm4gYS0+Z2V0VHlwZSgpLT5nZXREaW1GYWNlcygpOwogfQogCi1zdGF0aWMgdm9pZCBTQ19DbGVhckNvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCitzdGF0aWMgY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFgoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4KQogewotICAgIC8vTE9HRSgiYyAlZiAlZiAlZiAlZiIsIHIsIGcsIGIsIGEpOwotICAgIEdFVF9UTFMoKTsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbMF0gPSByOwotICAgIHNjLT5tRW52aXJvbWVudC5tQ2xlYXJDb2xvclsxXSA9IGc7Ci0gICAgc2MtPm1FbnZpcm9tZW50Lm1DbGVhckNvbG9yWzJdID0gYjsKLSAgICBzYy0+bUVudmlyb21lbnQubUNsZWFyQ29sb3JbM10gPSBhOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBUeXBlICp0ID0gYS0+Z2V0VHlwZSgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiB4XTsKIH0KIAotc3RhdGljIHZvaWQgU0NfZGVidWdGKGNvbnN0IGNoYXIgKnMsIGZsb2F0IGYpCitzdGF0aWMgY29uc3Qgdm9pZCAqIFNDX2dldEVsZW1lbnRBdFhZKFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgeSkKIHsKLSAgICBMT0dFKCIlcyAlZiIsIHMsIGYpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBUeXBlICp0ID0gYS0+Z2V0VHlwZSgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiAoeCArIHkqdC0+Z2V0RGltWCgpKV07CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RlYnVnSGV4Rihjb25zdCBjaGFyICpzLCBmbG9hdCBmKQorc3RhdGljIGNvbnN0IHZvaWQgKiBTQ19nZXRFbGVtZW50QXRYWVooUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KQogewotICAgIExPR0UoIiVzIDB4JXgiLCBzLCAqKChpbnQgKikgKCZmKSkpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZhKTsKKyAgICBjb25zdCBUeXBlICp0ID0gYS0+Z2V0VHlwZSgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKWEtPmdldFB0cigpOworICAgIHJldHVybiAmcFt0LT5nZXRFbGVtZW50U2l6ZUJ5dGVzKCkgKiAoeCArIHkqdC0+Z2V0RGltWCgpKV07CiB9CiAKLXN0YXRpYyB2b2lkIFNDX2RlYnVnSTMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgaSkKLXsKLSAgICBMT0dFKCIlcyAlaSIsIHMsIGkpOworc3RhdGljIHZvaWQgU0Nfc2V0T2JqZWN0KHZvaWQgKip2ZHN0LCB2b2lkICogdnNyYykgeworICAgIHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4odnNyYyktPmluY1N5c1JlZigpOworICAgIHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4odmRzdFswXSktPmRlY1N5c1JlZigpOworICAgICp2ZHN0ID0gdnNyYzsKK30KK3N0YXRpYyB2b2lkIFNDX2NsZWFyT2JqZWN0KHZvaWQgKip2ZHN0KSB7CisgICAgc3RhdGljX2Nhc3Q8T2JqZWN0QmFzZSAqPih2ZHN0WzBdKS0+ZGVjU3lzUmVmKCk7CisgICAgKnZkc3QgPSBOVUxMOworfQorc3RhdGljIGJvb2wgU0NfaXNPYmplY3QoUnNBbGxvY2F0aW9uIHZzcmMpIHsKKyAgICByZXR1cm4gdnNyYyAhPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBTQ19kZWJ1Z0hleEkzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpCi17Ci0gICAgTE9HRSgiJXMgMHgleCIsIHMsIGkpOworCisKK3N0YXRpYyB2b2lkIFNDX2RlYnVnRihjb25zdCBjaGFyICpzLCBmbG9hdCBmKSB7CisgICAgTE9HRSgiJXMgJWYsIDB4JTA4eCIsIHMsIGYsICooKGludCAqKSAoJmYpKSk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2Mihjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIpIHsKKyAgICBMT0dFKCIlcyB7JWYsICVmfSIsIHMsIGYxLCBmMik7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2Myhjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWZ9IiwgcywgZjEsIGYyLCBmMyk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0Z2NChjb25zdCBjaGFyICpzLCBmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzLCBmbG9hdCBmNCkgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmLCAlZn0iLCBzLCBmMSwgZjIsIGYzLCBmNCk7Cit9CitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0ZNNHY0KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGZsb2F0ICpmKSB7CisgICAgTE9HRSgiJXMgeyVmLCAlZiwgJWYsICVmIiwgcywgZlswXSwgZls0XSwgZls4XSwgZlsxMl0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZiIsIHMsIGZbMV0sIGZbNV0sIGZbOV0sIGZbMTNdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZiwgJWYiLCBzLCBmWzJdLCBmWzZdLCBmWzEwXSwgZlsxNF0pOworICAgIExPR0UoIiVzICAlZiwgJWYsICVmLCAlZn0iLCBzLCBmWzNdLCBmWzddLCBmWzExXSwgZlsxNV0pOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTN2Myhjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYsICVmIiwgcywgZlswXSwgZlszXSwgZls2XSk7CisgICAgTE9HRSgiJXMgICVmLCAlZiwgJWYiLCBzLCBmWzFdLCBmWzRdLCBmWzddKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmLCAlZn0iLHMsIGZbMl0sIGZbNV0sIGZbOF0pOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdGTTJ2Mihjb25zdCBjaGFyICpzLCBjb25zdCBmbG9hdCAqZikgeworICAgIExPR0UoIiVzIHslZiwgJWYiLCBzLCBmWzBdLCBmWzJdKTsKKyAgICBMT0dFKCIlcyAgJWYsICVmfSIscywgZlsxXSwgZlszXSk7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBTQ19nZXRXaWR0aCgpCitzdGF0aWMgdm9pZCBTQ19kZWJ1Z0kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90IGkpIHsKKyAgICBMT0dFKCIlcyAlaSAgMHgleCIsIHMsIGksIGkpOworfQorc3RhdGljIHZvaWQgU0NfZGVidWdVMzIoY29uc3QgY2hhciAqcywgdWludDMyX3QgaSkgeworICAgIExPR0UoIiVzICVpICAweCV4IiwgcywgaSwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RlYnVnUChjb25zdCBjaGFyICpzLCBjb25zdCB2b2lkICpwKSB7CisgICAgTE9HRSgiJXMgJXAiLCBzLCBwKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50MihpbnQgY21kSUQsIHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPmdldFdpZHRoKCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudCAlaSAlaSAlaSIsIGNtZElELCBsZW4pOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoZGF0YSwgY21kSUQsIGxlbiwgZmFsc2UpOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKK3N0YXRpYyB1aW50MzJfdCBTQ190b0NsaWVudChpbnQgY21kSUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJldHVybiByc2MtPmdldEhlaWdodCgpOworICAgIC8vTE9HRSgiU0NfdG9DbGllbnQgJWkiLCBjbWRJRCk7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChOVUxMLCBjbWRJRCwgMCwgZmFsc2UpOwogfQogCi1zdGF0aWMgdWludDMyX3QgU0NfY29sb3JGbG9hdFJHQkF0b1VOb3JtOChmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhKQotewotICAgIHVpbnQzMl90IGMgPSAwOwotICAgIGMgfD0gKHVpbnQzMl90KShyICogMjU1LmYgKyAwLjVmKTsKLSAgICBjIHw9ICgodWludDMyX3QpKGcgKiAyNTUuZiArIDAuNWYpKSA8PCA4OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYiAqIDI1NS5mICsgMC41ZikpIDw8IDE2OwotICAgIGMgfD0gKCh1aW50MzJfdCkoYSAqIDI1NS5mICsgMC41ZikpIDw8IDI0OwotICAgIHJldHVybiBjOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfY29sb3JGbG9hdFJHQkF0bzU2NShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQotewotICAgIHVpbnQzMl90IGlyID0gKHVpbnQzMl90KShyICogMjU1LmYgKyAwLjVmKTsKLSAgICB1aW50MzJfdCBpZyA9ICh1aW50MzJfdCkoZyAqIDI1NS5mICsgMC41Zik7Ci0gICAgdWludDMyX3QgaWIgPSAodWludDMyX3QpKGIgKiAyNTUuZiArIDAuNWYpOwotICAgIHJldHVybiByczg4OHRvNTY1KGlyLCBpZywgaWIpOwotfQotCi1zdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnQodm9pZCAqZGF0YSwgaW50IGNtZElELCBpbnQgbGVuLCBpbnQgd2FpdEZvclNwYWNlKQorc3RhdGljIHVpbnQzMl90IFNDX3RvQ2xpZW50QmxvY2tpbmcyKGludCBjbWRJRCwgdm9pZCAqZGF0YSwgaW50IGxlbikKIHsKICAgICBHRVRfVExTKCk7Ci0gICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCB3YWl0Rm9yU3BhY2UgIT0gMCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudEJsb2NraW5nICVpICVpIiwgY21kSUQsIGxlbik7CisgICAgcmV0dXJuIHJzYy0+c2VuZE1lc3NhZ2VUb0NsaWVudChkYXRhLCBjbWRJRCwgbGVuLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgU0Nfc2NyaXB0Q2FsbChpbnQgc2NyaXB0SUQpCitzdGF0aWMgdWludDMyX3QgU0NfdG9DbGllbnRCbG9ja2luZyhpbnQgY21kSUQpCiB7CiAgICAgR0VUX1RMUygpOwotICAgIHJzYy0+cnVuU2NyaXB0KChTY3JpcHQgKilzY3JpcHRJRCwgMCk7CisgICAgLy9MT0dFKCJTQ190b0NsaWVudEJsb2NraW5nICVpIiwgY21kSUQpOworICAgIHJldHVybiByc2MtPnNlbmRNZXNzYWdlVG9DbGllbnQoTlVMTCwgY21kSUQsIDAsIHRydWUpOwogfQogCitpbnQgU0NfZGl2c2kzKGludCBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAvIGI7Cit9CisKK2ludCBTQ19nZXRBbGxvY2F0aW9uKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgY29uc3QgQWxsb2NhdGlvbiAqYWxsb2MgPSBzYy0+cHRyVG9BbGxvY2F0aW9uKHB0cik7CisgICAgcmV0dXJuIChpbnQpYWxsb2M7Cit9CisKK3ZvaWQgU0NfYWxsb2NhdGlvbk1hcmtEaXJ0eShSc0FsbG9jYXRpb24gYSkKK3sKKyAgICBBbGxvY2F0aW9uICphbGxvYyA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4oYSk7CisgICAgYWxsb2MtPnNlbmREaXJ0eSgpOworfQorCit2b2lkIFNDX0ZvckVhY2goUnNTY3JpcHQgdnMsCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZpbiwKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdm91dCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c3IpCit7CisgICAgR0VUX1RMUygpOworICAgIGNvbnN0IEFsbG9jYXRpb24gKmFpbiA9IHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmluKTsKKyAgICBBbGxvY2F0aW9uICphb3V0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2b3V0KTsKKyAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOworICAgIHMtPnJ1bkZvckVhY2gocnNjLCBhaW4sIGFvdXQsIHVzcik7Cit9CisKK3ZvaWQgU0NfRm9yRWFjaDIoUnNTY3JpcHQgdnMsCisgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHZpbiwKKyAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdm91dCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp1c3IsCisgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpjYWxsKQoreworICAgIEdFVF9UTFMoKTsKKyAgICBjb25zdCBBbGxvY2F0aW9uICphaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBBbGxvY2F0aW9uICo+KHZpbik7CisgICAgQWxsb2NhdGlvbiAqYW91dCA9IHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odm91dCk7CisgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKKyAgICBzLT5ydW5Gb3JFYWNoKHJzYywgYWluLCBhb3V0LCB1c3IsIGNhbGwpOworfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIENsYXNzIGltcGxlbWVudGF0aW9uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IFNjcmlwdENTdGF0ZTo6Z1N5bXNbXSA9IHsKLSAgICAvLyBJTwotICAgIHsgImxvYWRJMzIiLCAodm9pZCAqKSZTQ19sb2FkSTMyLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCkiIH0sCi0gICAgLy97ICJsb2FkVTMyIiwgKHZvaWQgKikmU0NfbG9hZFUzMiwgInVuc2lnbmVkIGludCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRGIiwgKHZvaWQgKikmU0NfbG9hZEYsCi0gICAgICAgICJmbG9hdCIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRBcnJheUYiLCAodm9pZCAqKSZTQ19sb2FkQXJyYXlGLAotICAgICAgICAiZmxvYXQqIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAibG9hZEFycmF5STMyIiwgKHZvaWQgKikmU0NfbG9hZEFycmF5STMyLAotICAgICAgICAiaW50KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgImxvYWRWZWM0IiwgKHZvaWQgKikmU0NfbG9hZFZlYzQsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZE1hdHJpeCIsICh2b2lkICopJlNDX2xvYWRNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAic3RvcmVJMzIiLCAodm9pZCAqKSZTQ19zdG9yZUkzMiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotICAgIC8veyAic3RvcmVVMzIiLCAodm9pZCAqKSZTQ19zdG9yZVUzMiwgInZvaWQiLCAiKGludCwgaW50LCB1bnNpZ25lZCBpbnQpIiB9LAotICAgIHsgInN0b3JlRiIsICh2b2lkICopJlNDX3N0b3JlRiwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBmbG9hdCkiIH0sCi0gICAgeyAic3RvcmVWZWM0IiwgKHZvaWQgKikmU0Nfc3RvcmVWZWM0LAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGZsb2F0ICopIiB9LAotICAgIHsgInN0b3JlTWF0cml4IiwgKHZvaWQgKikmU0Nfc3RvcmVNYXRyaXgsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCwgZmxvYXQgKikiIH0sCi0gICAgeyAibG9hZFNpbXBsZU1lc2hWZXJ0aWNlc0YiLCAodm9pZCAqKSZTQ19sb2FkU2ltcGxlTWVzaFZlcnRpY2VzRiwKLSAgICAgICAgImZsb2F0KiIsICIoaW50LCBpbnQpIiB9LAotICAgIHsgInVwZGF0ZVNpbXBsZU1lc2giLCAodm9pZCAqKSZTQ191cGRhdGVTaW1wbGVNZXNoLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQogCi0gICAgLy8gbWF0aAotICAgIHsgIm1vZGYiLCAodm9pZCAqKSZmbW9kLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiYWJzIiwgKHZvaWQgKikmYWJzLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgImFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0LAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgInNpbmYiLCAodm9pZCAqKSZzaW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjb3NmIiwgKHZvaWQgKikmY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXNpbmYiLCAodm9pZCAqKSZhc2luZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYWNvc2YiLCAodm9pZCAqKSZhY29zZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbmYiLCAodm9pZCAqKSZhdGFuZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAiYXRhbjJmIiwgKHZvaWQgKikmYXRhbjJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmFic2YiLCAodm9pZCAqKSZmYWJzZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYiLCAodm9pZCAqKSZTQ19yYW5kZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicmFuZGYyIiwgKHZvaWQgKikmU0NfcmFuZGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZmxvb3JmIiwgKHZvaWQgKikmZmxvb3JmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJmcmFjZiIsICh2b2lkICopJlNDX2ZyYWNmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjZWlsZiIsICh2b2lkICopJmNlaWxmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJyb3VuZGYiLCAodm9pZCAqKSZTQ19yb3VuZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImV4cGYiLCAodm9pZCAqKSZleHBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsb2dmIiwgKHZvaWQgKikmbG9nZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAicG93ZiIsICh2b2lkICopJnBvd2YsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJtYXhmIiwgKHZvaWQgKikmU0NfbWF4ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1pbmYiLCAodm9pZCAqKSZTQ19taW5mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic3FydCIsICh2b2lkICopJnNxcnQsCi0gICAgICAgICJpbnQiLCAiKGludCkiIH0sCi0gICAgeyAic3FydGYiLCAodm9pZCAqKSZzcXJ0ZiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCkiIH0sCi0gICAgeyAic3FyIiwgKHZvaWQgKikmU0Nfc3FyLAotICAgICAgICAiaW50IiwgIihpbnQpIiB9LAotICAgIHsgInNxcmYiLCAodm9pZCAqKSZTQ19zcXJmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJzaWduIiwgKHZvaWQgKikmU0Nfc2lnbiwKLSAgICAgICAgImludCIsICIoaW50KSIgfSwKLSAgICB7ICJzaWduZiIsICh2b2lkICopJlNDX3NpZ25mLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJjbGFtcCIsICh2b2lkICopJlNDX2NsYW1wLAotICAgICAgICAiaW50IiwgIihpbnQsIGludCwgaW50KSIgfSwKLSAgICB7ICJjbGFtcGYiLCAodm9pZCAqKSZTQ19jbGFtcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiZGlzdGYyIiwgKHZvaWQgKikmU0NfZGlzdGYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaXN0ZjMiLCAodm9pZCAqKSZTQ19kaXN0ZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFnZjIiLCAodm9pZCAqKSZTQ19tYWdmMiwKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm1hZ2YzIiwgKHZvaWQgKikmU0NfbWFnZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAicmFkZiIsICh2b2lkICopJlNDX3JhZGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgImRlZ2YiLCAodm9pZCAqKSZTQ19kZWdmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0KSIgfSwKLSAgICB7ICJsZXJwZiIsICh2b2lkICopJlNDX2xlcnBmLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgIm5vcm1mIiwgKHZvaWQgKikmU0Nfbm9ybWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibWFwZiIsICh2b2lkICopJlNDX21hcGYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJub2lzZWYiLCAodm9pZCAqKSZTQ19ub2lzZWYsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQpIiB9LAotICAgIHsgIm5vaXNlZjIiLCAodm9pZCAqKSZTQ19ub2lzZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAibm9pc2VmMyIsICh2b2lkICopJlNDX25vaXNlZjMsCi0gICAgICAgICJmbG9hdCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAidHVyYnVsZW5jZWYyIiwgKHZvaWQgKikmU0NfdHVyYnVsZW5jZWYyLAotICAgICAgICAiZmxvYXQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgInR1cmJ1bGVuY2VmMyIsICh2b2lkICopJlNDX3R1cmJ1bGVuY2VmMywKLSAgICAgICAgImZsb2F0IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAiX19kaXZzaTMiLCAodm9pZCAqKSZTQ19kaXZzaTMgfSwKKworICAgIC8vIGFsbG9jYXRpb24KKyAgICB7ICJfWjE5cnNBbGxvY2F0aW9uR2V0RGltWDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jR2V0RGltWCB9LAorICAgIHsgIl9aMTlyc0FsbG9jYXRpb25HZXREaW1ZMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1ZIH0sCisgICAgeyAiX1oxOXJzQWxsb2NhdGlvbkdldERpbVoxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbVogfSwKKyAgICB7ICJfWjIxcnNBbGxvY2F0aW9uR2V0RGltTE9EMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfYWxsb2NHZXREaW1MT0QgfSwKKyAgICB7ICJfWjIzcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19hbGxvY0dldERpbUZhY2VzIH0sCisgICAgeyAiX1oxNXJzR2V0QWxsb2NhdGlvblBLdiIsICh2b2lkICopJlNDX2dldEFsbG9jYXRpb24gfSwKKworICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYIH0sCisgICAgeyAiX1oxNHJzR2V0RWxlbWVudEF0MTNyc19hbGxvY2F0aW9uamoiLCAodm9pZCAqKSZTQ19nZXRFbGVtZW50QXRYWSB9LAorICAgIHsgIl9aMTRyc0dldEVsZW1lbnRBdDEzcnNfYWxsb2NhdGlvbmpqaiIsICh2b2lkICopJlNDX2dldEVsZW1lbnRBdFhZWiB9LAorCisgICAgeyAiX1oxMXJzU2V0T2JqZWN0UDEzcnNfYWxsb2NhdGlvbjEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX3NldE9iamVjdCB9LAorICAgIHsgIl9aMTNyc0NsZWFyT2JqZWN0UDEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2NsZWFyT2JqZWN0IH0sCisgICAgeyAiX1oxMHJzSXNPYmplY3QxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19pc09iamVjdCB9LAorCisgICAgeyAiX1oyMXJzQWxsb2NhdGlvbk1hcmtEaXJ0eTEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2FsbG9jYXRpb25NYXJrRGlydHkgfSwKKworCisgICAgLy8gRGVidWcKKyAgICB7ICJfWjdyc0RlYnVnUEtjZiIsICh2b2lkICopJlNDX2RlYnVnRiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NmZiIsICh2b2lkICopJlNDX2RlYnVnRnYyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmZiIsICh2b2lkICopJlNDX2RlYnVnRnYzIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY2ZmZmYiLCAodm9pZCAqKSZTQ19kZWJ1Z0Z2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfZGVidWdGTTR2NCB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4M3gzIiwgKHZvaWQgKikmU0NfZGVidWdGTTN2MyB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NQSzEycnNfbWF0cml4MngyIiwgKHZvaWQgKikmU0NfZGVidWdGTTJ2MiB9LAorICAgIHsgIl9aN3JzRGVidWdQS2NpIiwgKHZvaWQgKikmU0NfZGVidWdJMzIgfSwKKyAgICB7ICJfWjdyc0RlYnVnUEtjaiIsICh2b2lkICopJlNDX2RlYnVnVTMyIH0sCisgICAgeyAiX1o3cnNEZWJ1Z1BLY1BLdiIsICh2b2lkICopJlNDX2RlYnVnUCB9LAorCisgICAgLy8gUlMgTWF0aAorICAgIHsgIl9aNnJzUmFuZGkiLCAodm9pZCAqKSZTQ19yYW5kaSB9LAorICAgIHsgIl9aNnJzUmFuZGlpIiwgKHZvaWQgKikmU0NfcmFuZGkyIH0sCisgICAgeyAiX1o2cnNSYW5kZiIsICh2b2lkICopJlNDX3JhbmRmIH0sCisgICAgeyAiX1o2cnNSYW5kZmYiLCAodm9pZCAqKSZTQ19yYW5kZjIgfSwKKyAgICB7ICJfWjZyc0ZyYWNmIiwgKHZvaWQgKikmU0NfZnJhYyB9LAogCiAgICAgLy8gdGltZQotICAgIHsgInNlY29uZCIsICh2b2lkICopJlNDX3NlY29uZCwKLSAgICAgICAgImludCIsICIoKSIgfSwKLSAgICB7ICJtaW51dGUiLCAodm9pZCAqKSZTQ19taW51dGUsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiaG91ciIsICh2b2lkICopJlNDX2hvdXIsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiZGF5IiwgKHZvaWQgKikmU0NfZGF5LAotICAgICAgICAiaW50IiwgIigpIiB9LAotICAgIHsgIm1vbnRoIiwgKHZvaWQgKikmU0NfbW9udGgsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAieWVhciIsICh2b2lkICopJlNDX3llYXIsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAidXB0aW1lTWlsbGlzIiwgKHZvaWQqKSZTQ191cHRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAotICAgIHsgInN0YXJ0VGltZU1pbGxpcyIsICh2b2lkKikmU0Nfc3RhcnRUaW1lTWlsbGlzLAotICAgICAgICAiaW50IiwgIigpIiB9LCAgICAgIC8vIFRPRE86IHVzZSBsb25nIGluc3RlYWQKLSAgICB7ICJlbGFwc2VkVGltZU1pbGxpcyIsICh2b2lkKikmU0NfZWxhcHNlZFRpbWVNaWxsaXMsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sICAgICAgLy8gVE9ETzogdXNlIGxvbmcgaW5zdGVhZAorICAgIHsgIl9aOHJzU2Vjb25kdiIsICh2b2lkICopJlNDX3NlY29uZCB9LAorICAgIHsgIl9aOHJzTWludXRldiIsICh2b2lkICopJlNDX21pbnV0ZSB9LAorICAgIHsgIl9aNnJzSG91cnYiLCAodm9pZCAqKSZTQ19ob3VyIH0sCisgICAgeyAiX1o1cnNEYXl2IiwgKHZvaWQgKikmU0NfZGF5IH0sCisgICAgeyAiX1o3cnNNb250aHYiLCAodm9pZCAqKSZTQ19tb250aCB9LAorICAgIHsgIl9aNnJzWWVhcnYiLCAodm9pZCAqKSZTQ195ZWFyIH0sCisgICAgeyAiX1oxNHJzVXB0aW1lTWlsbGlzdiIsICh2b2lkKikmU0NfdXB0aW1lTWlsbGlzIH0sCisgICAgeyAiX1oxM3JzVXB0aW1lTmFub3N2IiwgKHZvaWQqKSZTQ191cHRpbWVOYW5vcyB9LAorICAgIHsgIl9aN3JzR2V0RHR2IiwgKHZvaWQqKSZTQ19nZXREdCB9LAogCi0gICAgLy8gbWF0cml4Ci0gICAgeyAibWF0cml4TG9hZElkZW50aXR5IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZElkZW50aXR5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCkiIH0sCi0gICAgeyAibWF0cml4TG9hZEZsb2F0IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZEZsb2F0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKmYpIiB9LAotICAgIHsgIm1hdHJpeExvYWRNYXQiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkTWF0LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKm5ld21hdCkiIH0sCi0gICAgeyAibWF0cml4TG9hZFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRSb3RhdGUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCAqbWF0LCBmbG9hdCByb3QsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRTY2FsZSIsICh2b2lkICopJlNDX21hdHJpeExvYWRTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeExvYWRUcmFuc2xhdGUiLCAodm9pZCAqKSZTQ19tYXRyaXhMb2FkVHJhbnNsYXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4TG9hZE11bHRpcGx5IiwgKHZvaWQgKikmU0NfbWF0cml4TG9hZE11bHRpcGx5LAotICAgICAgICAidm9pZCIsICIoZmxvYXQgKm1hdCwgZmxvYXQgKmxocywgZmxvYXQgKnJocykiIH0sCi0gICAgeyAibWF0cml4TXVsdGlwbHkiLCAodm9pZCAqKSZTQ19tYXRyaXhNdWx0aXBseSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0ICpyaHMpIiB9LAotICAgIHsgIm1hdHJpeFJvdGF0ZSIsICh2b2lkICopJlNDX21hdHJpeFJvdGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHJvdCwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikiIH0sCi0gICAgeyAibWF0cml4U2NhbGUiLCAodm9pZCAqKSZTQ19tYXRyaXhTY2FsZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAotICAgIHsgIm1hdHJpeFRyYW5zbGF0ZSIsICh2b2lkICopJlNDX21hdHJpeFRyYW5zbGF0ZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICptYXQsIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIiB9LAorICAgIHsgIl9aMTRyc1NlbmRUb0NsaWVudGkiLCAodm9pZCAqKSZTQ190b0NsaWVudCB9LAorICAgIHsgIl9aMTRyc1NlbmRUb0NsaWVudGlQS3ZqIiwgKHZvaWQgKikmU0NfdG9DbGllbnQyIH0sCisgICAgeyAiX1oyMnJzU2VuZFRvQ2xpZW50QmxvY2tpbmdpIiwgKHZvaWQgKikmU0NfdG9DbGllbnRCbG9ja2luZyB9LAorICAgIHsgIl9aMjJyc1NlbmRUb0NsaWVudEJsb2NraW5naVBLdmoiLCAodm9pZCAqKSZTQ190b0NsaWVudEJsb2NraW5nMiB9LAogCi0gICAgLy8gdmVjdG9yCi0gICAgeyAidmVjMlJhbmQiLCAodm9pZCAqKSZTQ192ZWMyUmFuZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0ICp2ZWMsIGZsb2F0IG1heExlbikiIH0sCisgICAgeyAiX1o5cnNGb3JFYWNoOXJzX3NjcmlwdDEzcnNfYWxsb2NhdGlvblMwX1BLdiIsICh2b2lkICopJlNDX0ZvckVhY2ggfSwKKyAgICAvL3sgIl9aOXJzRm9yRWFjaDlyc19zY3JpcHQxM3JzX2FsbG9jYXRpb25TMF9QS3YiLCAodm9pZCAqKSZTQ19Gb3JFYWNoMiB9LAogCi0gICAgLy8gdmVjMwotICAgIHsgInZlYzNOb3JtIiwgKHZvaWQgKikmU0NfdmVjM05vcm0sCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzTGVuZ3RoIiwgKHZvaWQgKikmU0NfdmVjM0xlbmd0aCwKLSAgICAgICAgImZsb2F0IiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqKSIgfSwKLSAgICB7ICJ2ZWMzQWRkIiwgKHZvaWQgKikmU0NfdmVjM0FkZCwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzU3ViIiwgKHZvaWQgKikmU0NfdmVjM1N1YiwKLSAgICAgICAgInZvaWQiLCAiKHN0cnVjdCB2ZWNGMzJfM19zICpkZXN0LCBzdHJ1Y3QgdmVjRjMyXzNfcyAqbGhzLCBzdHJ1Y3QgdmVjRjMyXzNfcyAqcmhzKSIgfSwKLSAgICB7ICJ2ZWMzQ3Jvc3MiLCAodm9pZCAqKSZTQ192ZWMzQ3Jvc3MsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzNfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM0RvdCIsICh2b2lkICopJlNDX3ZlYzNEb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgc3RydWN0IHZlY0YzMl8zX3MgKnJocykiIH0sCi0gICAgeyAidmVjM1NjYWxlIiwgKHZvaWQgKikmU0NfdmVjM1NjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl8zX3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotICAgIC8vIHZlYzQKLSAgICB7ICJ2ZWM0Tm9ybSIsICh2b2lkICopJlNDX3ZlYzROb3JtLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNExlbmd0aCIsICh2b2lkICopJlNDX3ZlYzRMZW5ndGgsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKikiIH0sCi0gICAgeyAidmVjNEFkZCIsICh2b2lkICopJlNDX3ZlYzRBZGQsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFN1YiIsICh2b2lkICopJlNDX3ZlYzRTdWIsCi0gICAgICAgICJ2b2lkIiwgIihzdHJ1Y3QgdmVjRjMyXzRfcyAqZGVzdCwgc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNERvdCIsICh2b2lkICopJlNDX3ZlYzREb3QsCi0gICAgICAgICJmbG9hdCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgc3RydWN0IHZlY0YzMl80X3MgKnJocykiIH0sCi0gICAgeyAidmVjNFNjYWxlIiwgKHZvaWQgKikmU0NfdmVjNFNjYWxlLAotICAgICAgICAidm9pZCIsICIoc3RydWN0IHZlY0YzMl80X3MgKmxocywgZmxvYXQgc2NhbGUpIiB9LAorICAgIC8veyAic2luZl9mYXN0IiwgKHZvaWQgKikmU0Nfc2luZl9mYXN0IH0sCisgICAgLy97ICJjb3NmX2Zhc3QiLCAodm9pZCAqKSZTQ19jb3NmX2Zhc3QgfSwKIAotICAgIC8vIGNvbnRleHQKLSAgICB7ICJiaW5kUHJvZ3JhbUZyYWdtZW50IiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0gICAgeyAiYmluZFByb2dyYW1GcmFnbWVudFN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVN0b3JlIiwgKHZvaWQgKikmU0NfYmluZFByb2dyYW1GcmFnbWVudFN0b3JlLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kUHJvZ3JhbVZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4LAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLSAgICB7ICJiaW5kU2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyLAotICAgICAgICAidm9pZCIsICIoaW50LCBpbnQsIGludCkiIH0sCi0gICAgeyAiYmluZFRleHR1cmUiLCAodm9pZCAqKSZTQ19iaW5kVGV4dHVyZSwKLSAgICAgICAgInZvaWQiLCAiKGludCwgaW50LCBpbnQpIiB9LAotCi0gICAgLy8gdnAKLSAgICB7ICJ2cExvYWRNb2RlbE1hdHJpeCIsICh2b2lkICopJlNDX3ZwTG9hZE1vZGVsTWF0cml4LAotICAgICAgICAidm9pZCIsICIodm9pZCAqKSIgfSwKLSAgICB7ICJ2cExvYWRUZXh0dXJlTWF0cml4IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKikiIH0sCi0KLQotCi0gICAgLy8gZHJhd2luZwotICAgIHsgImRyYXdSZWN0IiwgKHZvaWQgKikmU0NfZHJhd1JlY3QsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeikiIH0sCi0gICAgeyAiZHJhd1F1YWQiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQpIiB9LAotICAgIHsgImRyYXdRdWFkVGV4Q29vcmRzIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB1MSwgZmxvYXQgdjEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywgZmxvYXQgdTMsIGZsb2F0IHYzLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LCBmbG9hdCB1NCwgZmxvYXQgdjQpIiB9LAotICAgIHsgImRyYXdTcHJpdGUiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZVNjcmVlbnNwYWNlIiwgKHZvaWQgKikmU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlLAotICAgICAgICAidm9pZCIsICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkiIH0sCi0gICAgeyAiZHJhd1Nwcml0ZVNjcmVlbnNwYWNlQ3JvcHBlZCIsICh2b2lkICopJlNDX2RyYXdTcHJpdGVTY3JlZW5zcGFjZUNyb3BwZWQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3LCBmbG9hdCBoLCBmbG9hdCBjeDAsIGZsb2F0IGN5MCwgZmxvYXQgY3gxLCBmbG9hdCBjeTEpIiB9LAotICAgIHsgImRyYXdMaW5lIiwgKHZvaWQgKikmU0NfZHJhd0xpbmUsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyKSIgfSwKLSAgICB7ICJkcmF3UG9pbnQiLCAodm9pZCAqKSZTQ19kcmF3UG9pbnQsCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxKSIgfSwKLSAgICB7ICJkcmF3U2ltcGxlTWVzaCIsICh2b2lkICopJlNDX2RyYXdTaW1wbGVNZXNoLAotICAgICAgICAidm9pZCIsICIoaW50IGlzbSkiIH0sCi0gICAgeyAiZHJhd1NpbXBsZU1lc2hSYW5nZSIsICh2b2lkICopJlNDX2RyYXdTaW1wbGVNZXNoUmFuZ2UsCi0gICAgICAgICJ2b2lkIiwgIihpbnQgaXNtLCBpbnQgc3RhcnQsIGludCBsZW4pIiB9LAotCi0KLSAgICAvLyBtaXNjCi0gICAgeyAicGZDbGVhckNvbG9yIiwgKHZvaWQgKikmU0NfQ2xlYXJDb2xvciwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJjb2xvciIsICh2b2lkICopJlNDX2NvbG9yLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImhzYiIsICh2b2lkICopJlNDX2hzYiwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJoc2JUb1JnYiIsICh2b2lkICopJlNDX2hzYlRvUmdiLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKSIgfSwKLSAgICB7ICJoc2JUb0FiZ3IiLCAodm9pZCAqKSZTQ19oc2JUb0FiZ3IsCi0gICAgICAgICJpbnQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJhbWJpZW50IiwgKHZvaWQgKikmU0NfYW1iaWVudCwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJkaWZmdXNlIiwgKHZvaWQgKikmU0NfZGlmZnVzZSwKLSAgICAgICAgInZvaWQiLCAiKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KSIgfSwKLSAgICB7ICJzcGVjdWxhciIsICh2b2lkICopJlNDX3NwZWN1bGFyLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpIiB9LAotICAgIHsgImVtaXNzaW9uIiwgKHZvaWQgKikmU0NfZW1pc3Npb24sCi0gICAgICAgICJ2b2lkIiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAic2hpbmluZXNzIiwgKHZvaWQgKikmU0Nfc2hpbmluZXNzLAotICAgICAgICAidm9pZCIsICIoZmxvYXQpIiB9LAotICAgIHsgInBvaW50QXR0ZW51YXRpb24iLCAodm9pZCAqKSZTQ19wb2ludEF0dGVudWF0aW9uLAotICAgICAgICAidm9pZCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0KLSAgICB7ICJ1cGxvYWRUb1RleHR1cmUiLCAodm9pZCAqKSZTQ191cGxvYWRUb1RleHR1cmUsCi0gICAgICAgICJ2b2lkIiwgIihpbnQsIGludCkiIH0sCi0gICAgeyAidXBsb2FkVG9CdWZmZXJPYmplY3QiLCAodm9pZCAqKSZTQ191cGxvYWRUb0J1ZmZlck9iamVjdCwKLSAgICAgICAgInZvaWQiLCAiKGludCkiIH0sCi0KLSAgICB7ICJzeW5jVG9HTCIsICh2b2lkICopJlNDX3N5bmNUb0dMLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotICAgIHsgImNvbG9yRmxvYXRSR0JBdG9VTm9ybTgiLCAodm9pZCAqKSZTQ19jb2xvckZsb2F0UkdCQXRvVU5vcm04LAotICAgICAgICAiaW50IiwgIihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0gICAgeyAiY29sb3JGbG9hdFJHQnRvNTY1IiwgKHZvaWQgKikmU0NfY29sb3JGbG9hdFJHQkF0bzU2NSwKLSAgICAgICAgImludCIsICIoZmxvYXQsIGZsb2F0LCBmbG9hdCkiIH0sCi0KLQotICAgIHsgImdldFdpZHRoIiwgKHZvaWQgKikmU0NfZ2V0V2lkdGgsCi0gICAgICAgICJpbnQiLCAiKCkiIH0sCi0gICAgeyAiZ2V0SGVpZ2h0IiwgKHZvaWQgKikmU0NfZ2V0SGVpZ2h0LAotICAgICAgICAiaW50IiwgIigpIiB9LAotCi0gICAgeyAic2VuZFRvQ2xpZW50IiwgKHZvaWQgKikmU0NfdG9DbGllbnQsCi0gICAgICAgICJpbnQiLCAiKHZvaWQgKmRhdGEsIGludCBjbWRJRCwgaW50IGxlbiwgaW50IHdhaXRGb3JTcGFjZSkiIH0sCi0KLQotICAgIHsgImRlYnVnRiIsICh2b2lkICopJlNDX2RlYnVnRiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgZmxvYXQpIiB9LAotICAgIHsgImRlYnVnSTMyIiwgKHZvaWQgKikmU0NfZGVidWdJMzIsCi0gICAgICAgICJ2b2lkIiwgIih2b2lkICosIGludCkiIH0sCi0gICAgeyAiZGVidWdIZXhGIiwgKHZvaWQgKikmU0NfZGVidWdIZXhGLAotICAgICAgICAidm9pZCIsICIodm9pZCAqLCBmbG9hdCkiIH0sCi0gICAgeyAiZGVidWdIZXhJMzIiLCAodm9pZCAqKSZTQ19kZWJ1Z0hleEkzMiwKLSAgICAgICAgInZvaWQiLCAiKHZvaWQgKiwgaW50KSIgfSwKLQotICAgIHsgInNjcmlwdENhbGwiLCAodm9pZCAqKSZTQ19zY3JpcHRDYWxsLAotICAgICAgICAidm9pZCIsICIoaW50KSIgfSwKLQotCi0gICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogY29uc3QgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90ICogU2NyaXB0Q1N0YXRlOjpsb29rdXBTeW1ib2woY29uc3QgY2hhciAqc3ltKQpAQCAtMTQwMCwxNyArNDg5LDMgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBTY3JpcHRDU3RhdGU6OmFwcGVuZERlY2xzKFN0cmluZzggKnN0cikKLXsKLSAgICBTY3JpcHRDU3RhdGU6OlN5bWJvbFRhYmxlX3QgKnN5bXMgPSBnU3ltczsKLSAgICB3aGlsZSAoc3ltcy0+bVB0cikgewotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tUmV0KTsKLSAgICAgICAgc3RyLT5hcHBlbmQoIiAiKTsKLSAgICAgICAgc3RyLT5hcHBlbmQoc3ltcy0+bU5hbWUpOwotICAgICAgICBzdHItPmFwcGVuZChzeW1zLT5tUGFyYW0pOwotICAgICAgICBzdHItPmFwcGVuZCgiO1xuIik7Ci0gICAgICAgIHN5bXMrKzsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliQ0wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGU3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2NyaXB0Q19MaWJDTC5jcHAKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicnNDb250ZXh0LmgiCisjaW5jbHVkZSAicnNTY3JpcHRDLmgiCisKKy8vIEltcGxlbWVudHMgcnNfY2wucnNoCisKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCisKK3N0YXRpYyBmbG9hdCBTQ19hY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBhY29zZih2KS8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2FzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFzaW5mKHYpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2F0YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGF0YW5mKHYpIC8gTV9QSTsKK30KKworc3RhdGljIGZsb2F0IFNDX2F0YW4ycGkoZmxvYXQgeSwgZmxvYXQgeCkgeworICAgIHJldHVybiBhdGFuMmYoeSwgeCkgLyBNX1BJOworfQorCitzdGF0aWMgZmxvYXQgU0NfY29zcGkoZmxvYXQgdikgeworICAgIHJldHVybiBjb3NmKHYgKiBNX1BJKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2V4cDEwKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gcG93KDEwLmYsIHYpOworCit9CisKK3N0YXRpYyBmbG9hdCBTQ19mcmFjdChmbG9hdCB2LCBpbnQgKmlwdHIpIHsKKyAgICBpbnQgaSA9IChpbnQpZmxvb3Iodik7CisgICAgaXB0clswXSA9IGk7CisgICAgcmV0dXJuIGZtaW4odiAtIGksIDB4MS5mZmZmZmVwLTFmKTsKK30KKworc3RhdGljIGZsb2F0IFNDX2xvZzIoZmxvYXQgdikgeworICAgIHJldHVybiBsb2cxMCh2KSAvIGxvZzEwKDIuZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19wb3duKGZsb2F0IHYsIGludCBwKSB7CisgICAgcmV0dXJuIHBvd2YodiwgKGZsb2F0KXApOworfQorCitzdGF0aWMgZmxvYXQgU0NfcG93cihmbG9hdCB2LCBmbG9hdCBwKSB7CisgICAgcmV0dXJuIHBvd2YodiwgcCk7Cit9CisKK2Zsb2F0IFNDX3Jvb3RuKGZsb2F0IHYsIGludCByKSB7CisgICAgcmV0dXJuIHBvdyh2LCAxLmYgLyByKTsKK30KKworZmxvYXQgU0NfcnNxcnQoZmxvYXQgdikgeworICAgIHJldHVybiAxLmYgLyBzcXJ0Zih2KTsKK30KKworZmxvYXQgU0Nfc2luY29zKGZsb2F0IHYsIGZsb2F0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zZih2KTsKKyAgICByZXR1cm4gc2luZih2KTsKK30KKworc3RhdGljIGZsb2F0IFNDX3NpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gc2luZih2ICogTV9QSSk7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ190YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIHRhbmYodiAqIE1fUEkpOworfQorCisgICAgLy97ICJsb2diIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJtYWQiLCAodm9pZCAqKSYgfSwKKyAgICAvL3sgIm5hbiIsICh2b2lkICopJiB9LAorICAgIC8veyAidGdhbW1hIiwgKHZvaWQgKikmIH0sCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW50ZWdlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHVpbnQzMl90IFNDX2Fic19pMzIoaW50MzJfdCB2KSB7cmV0dXJuIGFicyh2KTt9CitzdGF0aWMgdWludDE2X3QgU0NfYWJzX2kxNihpbnQxNl90IHYpIHtyZXR1cm4gKHVpbnQxNl90KWFicyh2KTt9CitzdGF0aWMgdWludDhfdCBTQ19hYnNfaTgoaW50OF90IHYpIHtyZXR1cm4gKHVpbnQ4X3QpYWJzKHYpO30KKworc3RhdGljIHVpbnQzMl90IFNDX2Nsel91MzIodWludDMyX3Qgdikge3JldHVybiBfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19jbHpfdTE2KHVpbnQxNl90IHYpIHtyZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIHVpbnQ4X3QgU0NfY2x6X3U4KHVpbnQ4X3Qgdikge3JldHVybiAodWludDhfdClfX2J1aWx0aW5fY2x6KHYpO30KK3N0YXRpYyBpbnQzMl90IFNDX2Nsel9pMzIoaW50MzJfdCB2KSB7cmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9jbHooKHVpbnQzMl90KXYpO30KK3N0YXRpYyBpbnQxNl90IFNDX2Nsel9pMTYoaW50MTZfdCB2KSB7cmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9jbHoodik7fQorc3RhdGljIGludDhfdCBTQ19jbHpfaTgoaW50OF90IHYpIHtyZXR1cm4gKGludDhfdClfX2J1aWx0aW5fY2x6KHYpO30KKworc3RhdGljIHVpbnQzMl90IFNDX21heF91MzIodWludDMyX3QgdiwgdWludDMyX3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19tYXhfdTE2KHVpbnQxNl90IHYsIHVpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgdWludDhfdCBTQ19tYXhfdTgodWludDhfdCB2LCB1aW50OF90IHYyKSB7cmV0dXJuIHJzTWF4KHYsIHYyKTt9CitzdGF0aWMgaW50MzJfdCBTQ19tYXhfaTMyKGludDMyX3QgdiwgaW50MzJfdCB2Mikge3JldHVybiByc01heCh2LCB2Mik7fQorc3RhdGljIGludDE2X3QgU0NfbWF4X2kxNihpbnQxNl90IHYsIGludDE2X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KK3N0YXRpYyBpbnQ4X3QgU0NfbWF4X2k4KGludDhfdCB2LCBpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNYXgodiwgdjIpO30KKworc3RhdGljIHVpbnQzMl90IFNDX21pbl91MzIodWludDMyX3QgdiwgdWludDMyX3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyB1aW50MTZfdCBTQ19taW5fdTE2KHVpbnQxNl90IHYsIHVpbnQxNl90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgdWludDhfdCBTQ19taW5fdTgodWludDhfdCB2LCB1aW50OF90IHYyKSB7cmV0dXJuIHJzTWluKHYsIHYyKTt9CitzdGF0aWMgaW50MzJfdCBTQ19taW5faTMyKGludDMyX3QgdiwgaW50MzJfdCB2Mikge3JldHVybiByc01pbih2LCB2Mik7fQorc3RhdGljIGludDE2X3QgU0NfbWluX2kxNihpbnQxNl90IHYsIGludDE2X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KK3N0YXRpYyBpbnQ4X3QgU0NfbWluX2k4KGludDhfdCB2LCBpbnQ4X3QgdjIpIHtyZXR1cm4gcnNNaW4odiwgdjIpO30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGbG9hdCB1dGlsCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGZsb2F0IFNDX2NsYW1wX2YzMihmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkKK3sKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KKworc3RhdGljIGZsb2F0IFNDX2RlZ3JlZXMoZmxvYXQgcmFkaWFucykKK3sKKyAgICByZXR1cm4gcmFkaWFucyAqICgxODAuZiAvIE1fUEkpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWF4X2YzMihmbG9hdCB2LCBmbG9hdCB2MikKK3sKKyAgICByZXR1cm4gcnNNYXgodiwgdjIpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWluX2YzMihmbG9hdCB2LCBmbG9hdCB2MikKK3sKKyAgICByZXR1cm4gcnNNaW4odiwgdjIpOworfQorCitzdGF0aWMgZmxvYXQgU0NfbWl4X2YzMihmbG9hdCBzdGFydCwgZmxvYXQgc3RvcCwgZmxvYXQgYW1vdW50KQoreworICAgIC8vTE9HRSgibGVycGYgJWYgICVmICAlZiIsIHN0YXJ0LCBzdG9wLCBhbW91bnQpOworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorCitzdGF0aWMgZmxvYXQgU0NfcmFkaWFucyhmbG9hdCBkZWdyZWVzKQoreworICAgIHJldHVybiBkZWdyZWVzICogKE1fUEkgLyAxODAuZik7Cit9CisKK3N0YXRpYyBmbG9hdCBTQ19zdGVwX2YzMihmbG9hdCBlZGdlLCBmbG9hdCB2KQoreworICAgIGlmICh2IDwgZWRnZSkgcmV0dXJuIDAuZjsKKyAgICByZXR1cm4gMS5mOworfQorCitzdGF0aWMgZmxvYXQgU0Nfc2lnbl9mMzIoZmxvYXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID4gMCkgcmV0dXJuIDEuZjsKKyAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gLTEuZjsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgLy8gT3BlbkNMIG1hdGgKKyAgICB7ICJfWjRhY29zZiIsICh2b2lkICopJmFjb3NmIH0sCisgICAgeyAiX1o1YWNvc2hmIiwgKHZvaWQgKikmYWNvc2hmIH0sCisgICAgeyAiX1o2YWNvc3BpZiIsICh2b2lkICopJlNDX2Fjb3NwaSB9LAorICAgIHsgIl9aNGFzaW5mIiwgKHZvaWQgKikmYXNpbmYgfSwKKyAgICB7ICJfWjVhc2luaGYiLCAodm9pZCAqKSZhc2luaGYgfSwKKyAgICB7ICJfWjZhc2lucGlmIiwgKHZvaWQgKikmU0NfYXNpbnBpIH0sCisgICAgeyAiX1o0YXRhbmYiLCAodm9pZCAqKSZhdGFuZiB9LAorICAgIHsgIl9aNWF0YW4yZiIsICh2b2lkICopJmF0YW4yZiB9LAorICAgIHsgIl9aNmF0YW5waWYiLCAodm9pZCAqKSZTQ19hdGFucGkgfSwKKyAgICB7ICJfWjdhdGFuMnBpZiIsICh2b2lkICopJlNDX2F0YW4ycGkgfSwKKyAgICB7ICJfWjRjYnJ0ZiIsICh2b2lkICopJmNicnRmIH0sCisgICAgeyAiX1o0Y2VpbGYiLCAodm9pZCAqKSZjZWlsZiB9LAorICAgIHsgIl9aOGNvcHlzaWduZmYiLCAodm9pZCAqKSZjb3B5c2lnbmYgfSwKKyAgICB7ICJfWjNjb3NmIiwgKHZvaWQgKikmY29zZiB9LAorICAgIHsgIl9aNGNvc2hmIiwgKHZvaWQgKikmY29zaGYgfSwKKyAgICB7ICJfWjVjb3NwaWYiLCAodm9pZCAqKSZTQ19jb3NwaSB9LAorICAgIHsgIl9aNGVyZmNmIiwgKHZvaWQgKikmZXJmY2YgfSwKKyAgICB7ICJfWjNlcmZmIiwgKHZvaWQgKikmZXJmZiB9LAorICAgIHsgIl9aM2V4cGYiLCAodm9pZCAqKSZleHBmIH0sCisgICAgeyAiX1o0ZXhwMmYiLCAodm9pZCAqKSZleHAyZiB9LAorICAgIHsgIl9aNWV4cDEwZiIsICh2b2lkICopJlNDX2V4cDEwIH0sCisgICAgeyAiX1o1ZXhwbTFmIiwgKHZvaWQgKikmZXhwbTFmIH0sCisgICAgeyAiX1o0ZmFic2YiLCAodm9pZCAqKSZmYWJzZiB9LAorICAgIHsgIl9aNGZkaW1mZiIsICh2b2lkICopJmZkaW1mIH0sCisgICAgeyAiX1o1Zmxvb3JmIiwgKHZvaWQgKikmZmxvb3JmIH0sCisgICAgeyAiX1ozZm1hZmZmIiwgKHZvaWQgKikmZm1hZiB9LAorICAgIHsgIl9aNGZtYXhmZiIsICh2b2lkICopJmZtYXhmIH0sCisgICAgeyAiX1o0Zm1pbmZmIiwgKHZvaWQgKikmZm1pbmYgfSwgIC8vIGZsb2F0IGZtaW4oZmxvYXQsIGZsb2F0KQorICAgIHsgIl9aNGZtb2RmZiIsICh2b2lkICopJmZtb2RmIH0sCisgICAgeyAiX1o1ZnJhY3RmUGYiLCAodm9pZCAqKSZTQ19mcmFjdCB9LAorICAgIHsgIl9aNWZyZXhwZlBpIiwgKHZvaWQgKikmZnJleHBmIH0sCisgICAgeyAiX1o1aHlwb3RmZiIsICh2b2lkICopJmh5cG90ZiB9LAorICAgIHsgIl9aNWlsb2diZiIsICh2b2lkICopJmlsb2diZiB9LAorICAgIHsgIl9aNWxkZXhwZmkiLCAodm9pZCAqKSZsZGV4cGYgfSwKKyAgICB7ICJfWjZsZ2FtbWFmIiwgKHZvaWQgKikmbGdhbW1hZiB9LAorICAgIHsgIl9aM2xvZ2YiLCAodm9pZCAqKSZsb2dmIH0sCisgICAgeyAiX1o0bG9nMmYiLCAodm9pZCAqKSZTQ19sb2cyIH0sCisgICAgeyAiX1o1bG9nMTBmIiwgKHZvaWQgKikmbG9nMTBmIH0sCisgICAgeyAiX1o1bG9nMXBmIiwgKHZvaWQgKikmbG9nMXBmIH0sCisgICAgLy97ICJsb2diIiwgKHZvaWQgKikmIH0sCisgICAgLy97ICJtYWQiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJtb2RmIiwgKHZvaWQgKikmbW9kZmYgfSwKKyAgICAvL3sgIm5hbiIsICh2b2lkICopJiB9LAorICAgIHsgIl9aOW5leHRhZnRlcmZmIiwgKHZvaWQgKikmbmV4dGFmdGVyZiB9LAorICAgIHsgIl9aM3Bvd2ZmIiwgKHZvaWQgKikmcG93ZiB9LAorICAgIHsgIl9aNHBvd25maSIsICh2b2lkICopJlNDX3Bvd24gfSwKKyAgICB7ICJfWjRwb3dyZmYiLCAodm9pZCAqKSZTQ19wb3dyIH0sCisgICAgeyAiX1o5cmVtYWluZGVyZmYiLCAodm9pZCAqKSZyZW1haW5kZXJmIH0sCisgICAgeyAicmVtcXVvIiwgKHZvaWQgKikmcmVtcXVvZiB9LAorICAgIHsgIl9aNHJpbnRmIiwgKHZvaWQgKikmcmludGYgfSwKKyAgICB7ICJfWjVyb290bmZpIiwgKHZvaWQgKikmU0Nfcm9vdG4gfSwKKyAgICB7ICJfWjVyb3VuZGYiLCAodm9pZCAqKSZyb3VuZGYgfSwKKyAgICB7ICJfWjVyc3FydGYiLCAodm9pZCAqKSZTQ19yc3FydCB9LAorICAgIHsgIl9aM3NpbmYiLCAodm9pZCAqKSZzaW5mIH0sCisgICAgeyAic2luY29zIiwgKHZvaWQgKikmU0Nfc2luY29zIH0sCisgICAgeyAiX1o0c2luaGYiLCAodm9pZCAqKSZzaW5oZiB9LAorICAgIHsgIl9aNXNpbnBpZiIsICh2b2lkICopJlNDX3NpbnBpIH0sCisgICAgeyAiX1o0c3FydGYiLCAodm9pZCAqKSZzcXJ0ZiB9LAorICAgIHsgIl9aM3RhbmYiLCAodm9pZCAqKSZ0YW5mIH0sCisgICAgeyAiX1o0dGFuaGYiLCAodm9pZCAqKSZ0YW5oZiB9LAorICAgIHsgIl9aNXRhbnBpZiIsICh2b2lkICopJlNDX3RhbnBpIH0sCisgICAgLy97ICJ0Z2FtbWEiLCAodm9pZCAqKSYgfSwKKyAgICB7ICJfWjV0cnVuY2YiLCAodm9pZCAqKSZ0cnVuY2YgfSwKKworICAgIC8vIE9wZW5DTCBJbnQKKyAgICB7ICJfWjNhYnNpIiwgKHZvaWQgKikmU0NfYWJzX2kzMiB9LAorICAgIHsgIl9aM2Fic3MiLCAodm9pZCAqKSZTQ19hYnNfaTE2IH0sCisgICAgeyAiX1ozYWJzYyIsICh2b2lkICopJlNDX2Fic19pOCB9LAorICAgIHsgIl9aM2NsemoiLCAodm9pZCAqKSZTQ19jbHpfdTMyIH0sCisgICAgeyAiX1ozY2x6dCIsICh2b2lkICopJlNDX2Nsel91MTYgfSwKKyAgICB7ICJfWjNjbHpoIiwgKHZvaWQgKikmU0NfY2x6X3U4IH0sCisgICAgeyAiX1ozY2x6aSIsICh2b2lkICopJlNDX2Nsel9pMzIgfSwKKyAgICB7ICJfWjNjbHpzIiwgKHZvaWQgKikmU0NfY2x6X2kxNiB9LAorICAgIHsgIl9aM2NsemMiLCAodm9pZCAqKSZTQ19jbHpfaTggfSwKKyAgICB7ICJfWjNtYXhqaiIsICh2b2lkICopJlNDX21heF91MzIgfSwKKyAgICB7ICJfWjNtYXh0dCIsICh2b2lkICopJlNDX21heF91MTYgfSwKKyAgICB7ICJfWjNtYXhoaCIsICh2b2lkICopJlNDX21heF91OCB9LAorICAgIHsgIl9aM21heGlpIiwgKHZvaWQgKikmU0NfbWF4X2kzMiB9LAorICAgIHsgIl9aM21heHNzIiwgKHZvaWQgKikmU0NfbWF4X2kxNiB9LAorICAgIHsgIl9aM21heGNjIiwgKHZvaWQgKikmU0NfbWF4X2k4IH0sCisgICAgeyAiX1ozbWluamoiLCAodm9pZCAqKSZTQ19taW5fdTMyIH0sCisgICAgeyAiX1ozbWludHQiLCAodm9pZCAqKSZTQ19taW5fdTE2IH0sCisgICAgeyAiX1ozbWluaGgiLCAodm9pZCAqKSZTQ19taW5fdTggfSwKKyAgICB7ICJfWjNtaW5paSIsICh2b2lkICopJlNDX21pbl9pMzIgfSwKKyAgICB7ICJfWjNtaW5zcyIsICh2b2lkICopJlNDX21pbl9pMTYgfSwKKyAgICB7ICJfWjNtaW5jYyIsICh2b2lkICopJlNDX21pbl9pOCB9LAorCisgICAgLy8gT3BlbkNMIDYuMTEuNAorICAgIHsgIl9aNWNsYW1wZmZmIiwgKHZvaWQgKikmU0NfY2xhbXBfZjMyIH0sCisgICAgeyAiX1o3ZGVncmVlc2YiLCAodm9pZCAqKSZTQ19kZWdyZWVzIH0sCisgICAgeyAiX1ozbWF4ZmYiLCAodm9pZCAqKSZTQ19tYXhfZjMyIH0sCisgICAgeyAiX1ozbWluZmYiLCAodm9pZCAqKSZTQ19taW5fZjMyIH0sCisgICAgeyAiX1ozbWl4ZmZmIiwgKHZvaWQgKikmU0NfbWl4X2YzMiB9LAorICAgIHsgIl9aN3JhZGlhbnNmIiwgKHZvaWQgKikmU0NfcmFkaWFucyB9LAorICAgIHsgIl9aNHN0ZXBmZiIsICh2b2lkICopJlNDX3N0ZXBfZjMyIH0sCisgICAgLy97ICJzbW9vdGhzdGVwIiwgKHZvaWQgKikmIH0sCisgICAgeyAiX1o0c2lnbmYiLCAodm9pZCAqKSZTQ19zaWduX2YzMiB9LAorCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK2NvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sQ0woY29uc3QgY2hhciAqc3ltKQoreworICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOworCisgICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3ltcy0+bU5hbWUsIHN5bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1zOworICAgICAgICB9CisgICAgICAgIHN5bXMrKzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYkdMLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjhmNzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NjcmlwdENfTGliR0wuY3BwCkBAIC0wLDAgKzEsNDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzQ29udGV4dC5oIgorI2luY2x1ZGUgInJzU2NyaXB0Qy5oIgorI2luY2x1ZGUgInJzTWF0cml4LmgiCisKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CisKKyNkZWZpbmUgR0VUX1RMUygpICBDb250ZXh0OjpTY3JpcHRUTFNTdHJ1Y3QgKiB0bHMgPSBcCisgICAgKENvbnRleHQ6OlNjcmlwdFRMU1N0cnVjdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoQ29udGV4dDo6Z1RocmVhZFRMU0tleSk7IFwKKyAgICBDb250ZXh0ICogcnNjID0gdGxzLT5tQ29udGV4dDsgXAorICAgIFNjcmlwdEMgKiBzYyA9IChTY3JpcHRDICopIHRscy0+bVNjcmlwdAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ29udGV4dAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIFNDX2JpbmRUZXh0dXJlKFJzUHJvZ3JhbUZyYWdtZW50IHZwZiwgdWludDMyX3Qgc2xvdCwgUnNBbGxvY2F0aW9uIHZhKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfUHJvZ3JhbUJpbmRUZXh0dXJlKHJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmEpKTsKKworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kU2FtcGxlcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIHVpbnQzMl90IHNsb3QsIFJzU2FtcGxlciB2cykKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX1Byb2dyYW1CaW5kU2FtcGxlcihyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQcm9ncmFtRnJhZ21lbnQgKj4odnBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTYW1wbGVyICo+KHZzKSk7CisKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1TdG9yZShSc1Byb2dyYW1TdG9yZSBwZnMpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1TdG9yZShyc2MsIHBmcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2JpbmRQcm9ncmFtRnJhZ21lbnQoUnNQcm9ncmFtRnJhZ21lbnQgcGYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1GcmFnbWVudChyc2MsIHBmKTsKK30KKworc3RhdGljIHZvaWQgU0NfYmluZFByb2dyYW1WZXJ0ZXgoUnNQcm9ncmFtVmVydGV4IHB2KQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2lfQ29udGV4dEJpbmRQcm9ncmFtVmVydGV4KHJzYywgcHYpOworfQorCitzdGF0aWMgdm9pZCBTQ19iaW5kUHJvZ3JhbVJhc3RlcihSc1Byb2dyYW1SYXN0ZXIgcHYpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9Db250ZXh0QmluZFByb2dyYW1SYXN0ZXIocnNjLCBwdik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVlAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ192cExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldFByb2plY3Rpb25NYXRyaXgobSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3ZwTG9hZE1vZGVsTWF0cml4KGNvbnN0IHJzY19NYXRyaXggKm0pCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnNldE1vZGVsdmlld01hdHJpeChtKTsKK30KKworc3RhdGljIHZvaWQgU0NfdnBMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc2NfTWF0cml4ICptKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByc2MtPmdldFZlcnRleCgpLT5zZXRUZXh0dXJlTWF0cml4KG0pOworfQorCisKK3N0YXRpYyB2b2lkIFNDX3BmQ29uc3RhbnRDb2xvcihSc1Byb2dyYW1GcmFnbWVudCB2cGYsIGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgLy9HRVRfVExTKCk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IHN0YXRpY19jYXN0PFByb2dyYW1GcmFnbWVudCAqPih2cGYpOworICAgIHBmLT5zZXRDb25zdGFudENvbG9yKHIsIGcsIGIsIGEpOworfQorCitzdGF0aWMgdm9pZCBTQ192cEdldFByb2plY3Rpb25NYXRyaXgocnNjX01hdHJpeCAqbSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5nZXRWZXJ0ZXgoKS0+Z2V0UHJvamVjdGlvbk1hdHJpeChtKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERyYXdpbmcKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBTQ19kcmF3UXVhZFRleENvb3JkcyhmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdTQsIGZsb2F0IHY0KQoreworICAgIEdFVF9UTFMoKTsKKyAgICBpZiAoIXJzYy0+c2V0dXBDaGVjaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL0xPR0UoIlF1YWQiKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MSwgeTEsIHoxKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MiwgeTIsIHoyKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4MywgeTMsIHozKTsKKyAgICAvL0xPR0UoIiU0LjJmLCAlNC4yZiwgJTQuMmYiLCB4NCwgeTQsIHo0KTsKKworICAgIGZsb2F0IHZ0eFtdID0ge3gxLHkxLHoxLCB4Mix5Mix6MiwgeDMseTMsejMsIHg0LHk0LHo0fTsKKyAgICBjb25zdCBmbG9hdCB0ZXhbXSA9IHt1MSx2MSwgdTIsdjIsIHUzLHYzLCB1NCx2NH07CisKKyAgICBWZXJ0ZXhBcnJheSB2YTsKKyAgICB2YS5hZGQoR0xfRkxPQVQsIDMsIDEyLCBmYWxzZSwgKHVpbnQzMl90KXZ0eCwgInBvc2l0aW9uIik7CisgICAgdmEuYWRkKEdMX0ZMT0FULCAyLCA4LCBmYWxzZSwgKHVpbnQzMl90KXRleCwgInRleHR1cmUwIik7CisgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKKworICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywgZmxvYXQgejMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KQoreworICAgIFNDX2RyYXdRdWFkVGV4Q29vcmRzKHgxLCB5MSwgejEsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDIsIHkyLCB6MiwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4MywgeTMsIHozLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHg0LCB5NCwgejQsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgT2JqZWN0QmFzZVJlZjxjb25zdCBQcm9ncmFtVmVydGV4PiB0bXAocnNjLT5nZXRWZXJ0ZXgoKSk7CisgICAgcnNjLT5zZXRWZXJ0ZXgocnNjLT5nZXREZWZhdWx0UHJvZ3JhbVZlcnRleCgpKTsKKyAgICAvL3JzYy0+c2V0dXBDaGVjaygpOworCisgICAgLy9HTGludCBjcm9wWzRdID0gezAsIGgsIHcsIC1ofTsKKworICAgIGZsb2F0IHNoID0gcnNjLT5nZXRIZWlnaHQoKTsKKworICAgIFNDX2RyYXdRdWFkKHgsICAgc2ggLSB5LCAgICAgeiwKKyAgICAgICAgICAgICAgICB4K3csIHNoIC0geSwgICAgIHosCisgICAgICAgICAgICAgICAgeCt3LCBzaCAtICh5K2gpLCB6LAorICAgICAgICAgICAgICAgIHgsICAgc2ggLSAoeStoKSwgeik7CisgICAgcnNjLT5zZXRWZXJ0ZXgoKFByb2dyYW1WZXJ0ZXggKil0bXAuZ2V0KCkpOworfQorLyoKK3N0YXRpYyB2b2lkIFNDX2RyYXdTcHJpdGUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgZmxvYXQgdmluWzNdID0ge3gsIHksIHp9OworICAgIGZsb2F0IHZvdXRbNF07CisKKyAgICAvL0xPR0UoImRzICBpbiAlZiAlZiAlZiIsIHgsIHksIHopOworICAgIHJzYy0+Z2V0VmVydGV4KCktPnRyYW5zZm9ybVRvU2NyZWVuKHJzYywgdm91dCwgdmluKTsKKyAgICAvL0xPR0UoImRzICBvdXQgJWYgJWYgJWYgJWYiLCB2b3V0WzBdLCB2b3V0WzFdLCB2b3V0WzJdLCB2b3V0WzNdKTsKKyAgICB2b3V0WzBdIC89IHZvdXRbM107CisgICAgdm91dFsxXSAvPSB2b3V0WzNdOworICAgIHZvdXRbMl0gLz0gdm91dFszXTsKKworICAgIHZvdXRbMF0gKj0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKKyAgICB2b3V0WzFdICo9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOworICAgIHZvdXRbMF0gKz0gcnNjLT5nZXRXaWR0aCgpIC8gMjsKKyAgICB2b3V0WzFdICs9IHJzYy0+Z2V0SGVpZ2h0KCkgLyAyOworCisgICAgdm91dFswXSAtPSB3LzI7CisgICAgdm91dFsxXSAtPSBoLzI7CisKKyAgICAvL0xPR0UoImRzICBvdXQyICVmICVmICVmIiwgdm91dFswXSwgdm91dFsxXSwgdm91dFsyXSk7CisKKyAgICAvLyBVLCBWLCBXLCBICisgICAgU0NfZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKHZvdXRbMF0sIHZvdXRbMV0sIHosIGgsIHcpOworICAgIC8vcnNjLT5zZXR1cENoZWNrKCk7Cit9CisqLworCitzdGF0aWMgdm9pZCBTQ19kcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopCit7CisgICAgLy9MT0dFKCJTQ19kcmF3UmVjdCAlZiwlZiAgJWYsJWYgICVmIiwgeDEsIHkxLCB4MiwgeTIsIHopOworICAgIFNDX2RyYXdRdWFkKHgxLCB5MiwgeiwKKyAgICAgICAgICAgICAgICB4MiwgeTIsIHosCisgICAgICAgICAgICAgICAgeDIsIHkxLCB6LAorICAgICAgICAgICAgICAgIHgxLCB5MSwgeik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoKFJzTWVzaCB2c20pCit7CisgICAgR0VUX1RMUygpOworICAgIE1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8TWVzaCAqPih2c20pOworICAgIGlmICghcnNjLT5zZXR1cENoZWNrKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbS0+cmVuZGVyKHJzYyk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX2RyYXdNZXNoUHJpbWl0aXZlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXJQcmltaXRpdmUocnNjLCBwcmltSW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBTQ19kcmF3TWVzaFByaW1pdGl2ZVJhbmdlKFJzTWVzaCB2c20sIHVpbnQzMl90IHByaW1JbmRleCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNtLT5yZW5kZXJQcmltaXRpdmVSYW5nZShyc2MsIHByaW1JbmRleCwgc3RhcnQsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIFNDX21lc2hDb21wdXRlQm91bmRpbmdCb3goUnNNZXNoIHZzbSwgZmxvYXQgKm1pblgsIGZsb2F0ICptaW5ZLCBmbG9hdCAqbWluWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1heFgsIGZsb2F0ICptYXhZLCBmbG9hdCAqbWF4WikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxNZXNoICo+KHZzbSk7CisgICAgc20tPmNvbXB1dGVCQm94KCk7CisgICAgKm1pblggPSBzbS0+bUJCb3hNaW5bMF07CisgICAgKm1pblkgPSBzbS0+bUJCb3hNaW5bMV07CisgICAgKm1pblogPSBzbS0+bUJCb3hNaW5bMl07CisgICAgKm1heFggPSBzbS0+bUJCb3hNYXhbMF07CisgICAgKm1heFkgPSBzbS0+bUJCb3hNYXhbMV07CisgICAgKm1heFogPSBzbS0+bUJCb3hNYXhbMl07Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworc3RhdGljIHZvaWQgU0NfY29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgUHJvZ3JhbUZyYWdtZW50ICpwZiA9IChQcm9ncmFtRnJhZ21lbnQgKilyc2MtPmdldEZyYWdtZW50KCk7CisgICAgcGYtPnNldENvbnN0YW50Q29sb3IociwgZywgYiwgYSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX3VwbG9hZFRvVGV4dHVyZTIoUnNBbGxvY2F0aW9uIHZhLCB1aW50MzJfdCBiYXNlTWlwTGV2ZWwpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9UZXh0dXJlKHJzYywgdmEsIGZhbHNlLCBiYXNlTWlwTGV2ZWwpOworfQorc3RhdGljIHZvaWQgU0NfdXBsb2FkVG9UZXh0dXJlKFJzQWxsb2NhdGlvbiB2YSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0FsbG9jYXRpb25VcGxvYWRUb1RleHR1cmUocnNjLCB2YSwgZmFsc2UsIDApOworfQorCitzdGF0aWMgdm9pZCBTQ191cGxvYWRUb0J1ZmZlck9iamVjdChSc0FsbG9jYXRpb24gdmEpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzaV9BbGxvY2F0aW9uVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjLCB2YSk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xDbGVhckNvbG9yKHIsIGcsIGIsIGEpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0NsZWFyRGVwdGgoZmxvYXQgdikKK3sKKyAgICBHRVRfVExTKCk7CisgICAgaWYgKCFyc2MtPnNldHVwQ2hlY2soKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2xDbGVhckRlcHRoZih2KTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0V2lkdGgoKQoreworICAgIEdFVF9UTFMoKTsKKyAgICByZXR1cm4gcnNjLT5nZXRXaWR0aCgpOworfQorCitzdGF0aWMgdWludDMyX3QgU0NfZ2V0SGVpZ2h0KCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcmV0dXJuIHJzYy0+Z2V0SGVpZ2h0KCk7Cit9CisKK3N0YXRpYyB2b2lkIFNDX0RyYXdUZXh0QWxsb2MoUnNBbGxvY2F0aW9uIHZhLCBpbnQgeCwgaW50IHkpCit7CisgICAgR0VUX1RMUygpOworICAgIEFsbG9jYXRpb24gKmFsbG9jID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CisgICAgcnNjLT5tU3RhdGVGb250LnJlbmRlclRleHQoYWxsb2MsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19EcmF3VGV4dChjb25zdCBjaGFyICp0ZXh0LCBpbnQgeCwgaW50IHkpCit7CisgICAgR0VUX1RMUygpOworICAgIHJzYy0+bVN0YXRlRm9udC5yZW5kZXJUZXh0KHRleHQsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBTQ19CaW5kRm9udChSc0ZvbnQgZm9udCkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNpX0NvbnRleHRCaW5kRm9udChyc2MsIGZvbnQpOworfQorCitzdGF0aWMgdm9pZCBTQ19Gb250Q29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkKK3sKKyAgICBHRVRfVExTKCk7CisgICAgcnNjLT5tU3RhdGVGb250LnNldEZvbnRDb2xvcihyLCBnLCBiLCBhKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDbGFzcyBpbXBsZW1lbnRhdGlvbgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIGxsdm0gbmFtZSBtYW5nbGluZyByZWYKKy8vICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgIyB2b2lkCisvLyAgICAgICAgICAgICAgICAgOjo9IGIgICMgYm9vbAorLy8gICAgICAgICAgICAgICAgIDo6PSBjICAjIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gYSAgIyBzaWduZWQgY2hhcgorLy8gICAgICAgICAgICAgICAgIDo6PSBoICAjIHVuc2lnbmVkIGNoYXIKKy8vICAgICAgICAgICAgICAgICA6Oj0gcyAgIyBzaG9ydAorLy8gICAgICAgICAgICAgICAgIDo6PSB0ICAjIHVuc2lnbmVkIHNob3J0CisvLyAgICAgICAgICAgICAgICAgOjo9IGkgICMgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGogICMgdW5zaWduZWQgaW50CisvLyAgICAgICAgICAgICAgICAgOjo9IGwgICMgbG9uZworLy8gICAgICAgICAgICAgICAgIDo6PSBtICAjIHVuc2lnbmVkIGxvbmcKKy8vICAgICAgICAgICAgICAgICA6Oj0geCAgIyBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0geSAgIyB1bnNpZ25lZCBsb25nIGxvbmcsIF9faW50NjQKKy8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAorLy8gICAgICAgICAgICAgICAgIDo6PSBkICAjIGRvdWJsZQorCitzdGF0aWMgU2NyaXB0Q1N0YXRlOjpTeW1ib2xUYWJsZV90IGdTeW1zW10gPSB7CisgICAgeyAiX1oyMnJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQxOXJzX3Byb2dyYW1fZnJhZ21lbnQiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbUZyYWdtZW50IH0sCisgICAgeyAiX1oxOXJzZ0JpbmRQcm9ncmFtU3RvcmUxNnJzX3Byb2dyYW1fc3RvcmUiLCAodm9pZCAqKSZTQ19iaW5kUHJvZ3JhbVN0b3JlIH0sCisgICAgeyAiX1oyMHJzZ0JpbmRQcm9ncmFtVmVydGV4MTdyc19wcm9ncmFtX3ZlcnRleCIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtVmVydGV4IH0sCisgICAgeyAiX1oyMHJzZ0JpbmRQcm9ncmFtUmFzdGVyMTdyc19wcm9ncmFtX3Jhc3RlciIsICh2b2lkICopJlNDX2JpbmRQcm9ncmFtUmFzdGVyIH0sCisgICAgeyAiX1oxNHJzZ0JpbmRTYW1wbGVyMTlyc19wcm9ncmFtX2ZyYWdtZW50ajEwcnNfc2FtcGxlciIsICh2b2lkICopJlNDX2JpbmRTYW1wbGVyIH0sCisgICAgeyAiX1oxNHJzZ0JpbmRUZXh0dXJlMTlyc19wcm9ncmFtX2ZyYWdtZW50ajEzcnNfYWxsb2NhdGlvbiIsICh2b2lkICopJlNDX2JpbmRUZXh0dXJlIH0sCisKKyAgICB7ICJfWjM2cnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4UEsxMnJzX21hdHJpeDR4NCIsICh2b2lkICopJlNDX3ZwTG9hZFByb2plY3Rpb25NYXRyaXggfSwKKyAgICB7ICJfWjMxcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeFBLMTJyc19tYXRyaXg0eDQiLCAodm9pZCAqKSZTQ192cExvYWRNb2RlbE1hdHJpeCB9LAorICAgIHsgIl9aMzNyc2dQcm9ncmFtVmVydGV4TG9hZFRleHR1cmVNYXRyaXhQSzEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBMb2FkVGV4dHVyZU1hdHJpeCB9LAorCisgICAgeyAiX1ozNXJzZ1Byb2dyYW1WZXJ0ZXhHZXRQcm9qZWN0aW9uTWF0cml4UDEycnNfbWF0cml4NHg0IiwgKHZvaWQgKikmU0NfdnBHZXRQcm9qZWN0aW9uTWF0cml4IH0sCisKKyAgICB7ICJfWjMxcnNnUHJvZ3JhbUZyYWdtZW50Q29uc3RhbnRDb2xvcjE5cnNfcHJvZ3JhbV9mcmFnbWVudGZmZmYiLCAodm9pZCAqKSZTQ19wZkNvbnN0YW50Q29sb3IgfSwKKworICAgIHsgIl9aMTFyc2dHZXRXaWR0aHYiLCAodm9pZCAqKSZTQ19nZXRXaWR0aCB9LAorICAgIHsgIl9aMTJyc2dHZXRIZWlnaHR2IiwgKHZvaWQgKikmU0NfZ2V0SGVpZ2h0IH0sCisKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uaiIsICh2b2lkICopJlNDX3VwbG9hZFRvVGV4dHVyZTIgfSwKKyAgICB7ICJfWjE4cnNnVXBsb2FkVG9UZXh0dXJlMTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9UZXh0dXJlIH0sCisgICAgeyAiX1oyM3JzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfdXBsb2FkVG9CdWZmZXJPYmplY3QgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3UmVjdGZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1JlY3QgfSwKKyAgICB7ICJfWjExcnNnRHJhd1F1YWRmZmZmZmZmZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3UXVhZCB9LAorICAgIHsgIl9aMjByc2dEcmF3UXVhZFRleENvb3Jkc2ZmZmZmZmZmZmZmZmZmZmZmZmZmIiwgKHZvaWQgKikmU0NfZHJhd1F1YWRUZXhDb29yZHMgfSwKKyAgICB7ICJfWjI0cnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlZmZmZmYiLCAodm9pZCAqKSZTQ19kcmF3U3ByaXRlU2NyZWVuc3BhY2UgfSwKKworICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoIiwgKHZvaWQgKikmU0NfZHJhd01lc2ggfSwKKyAgICB7ICJfWjExcnNnRHJhd01lc2g3cnNfbWVzaGoiLCAodm9pZCAqKSZTQ19kcmF3TWVzaFByaW1pdGl2ZSB9LAorICAgIHsgIl9aMTFyc2dEcmF3TWVzaDdyc19tZXNoampqIiwgKHZvaWQgKikmU0NfZHJhd01lc2hQcmltaXRpdmVSYW5nZSB9LAorICAgIHsgIl9aMjVyc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94N3JzX21lc2hQZlMwX1MwX1MwX1MwX1MwXyIsICh2b2lkICopJlNDX21lc2hDb21wdXRlQm91bmRpbmdCb3ggfSwKKworICAgIHsgIl9aMTNyc2dDbGVhckNvbG9yZmZmZiIsICh2b2lkICopJlNDX0NsZWFyQ29sb3IgfSwKKyAgICB7ICJfWjEzcnNnQ2xlYXJEZXB0aGYiLCAodm9pZCAqKSZTQ19DbGVhckRlcHRoIH0sCisKKyAgICB7ICJfWjExcnNnRHJhd1RleHRQS2NpaSIsICh2b2lkICopJlNDX0RyYXdUZXh0IH0sCisgICAgeyAiX1oxMXJzZ0RyYXdUZXh0MTNyc19hbGxvY2F0aW9uaWkiLCAodm9pZCAqKSZTQ19EcmF3VGV4dEFsbG9jIH0sCisKKyAgICB7ICJfWjExcnNnQmluZEZvbnQ3cnNfZm9udCIsICh2b2lkICopJlNDX0JpbmRGb250IH0sCisgICAgeyAiX1oxMnJzZ0ZvbnRDb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19Gb250Q29sb3IgfSwKKworICAgIC8vIG1pc2MKKyAgICB7ICJfWjVjb2xvcmZmZmYiLCAodm9pZCAqKSZTQ19jb2xvciB9LAorCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK2NvbnN0IFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqIFNjcmlwdENTdGF0ZTo6bG9va3VwU3ltYm9sR0woY29uc3QgY2hhciAqc3ltKQoreworICAgIFNjcmlwdENTdGF0ZTo6U3ltYm9sVGFibGVfdCAqc3ltcyA9IGdTeW1zOworCisgICAgd2hpbGUgKHN5bXMtPm1QdHIpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3ltcy0+bU5hbWUsIHN5bSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeW1zOworICAgICAgICB9CisgICAgICAgIHN5bXMrKzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAgYi9saWJzL3JzL3JzU2hhZGVyQ2FjaGUuY3BwCmluZGV4IDQ3MTFkMWIuLjVjMDczYjMgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTaGFkZXJDYWNoZS5jcHAKKysrIGIvbGlicy9ycy9yc1NoYWRlckNhY2hlLmNwcApAQCAtMTQsMTAgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKLQogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZiAvL0FORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtOTQsMTYgKzk4LDEwIEBACiAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHBnbSwgZnJhZy0+Z2V0U2hhZGVySUQoKSk7CiAKICAgICAgICAgaWYgKCF2dHgtPmlzVXNlclByb2dyYW0oKSkgewotICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX0xlZ2FjeVBvc2l0aW9uIik7Ci0gICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfTGVnYWN5Q29sb3IiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9MZWdhY3lOb3JtYWwiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl9MZWdhY3lQb2ludFNpemUiKTsKLSAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgNCwgIkFUVFJJQl9MZWdhY3lUZXh0dXJlIik7Ci0gICAgICAgICAgICBlLT5tVnR4QXR0cmliU2xvdHNbUlNfS0lORF9QT1NJVElPTl0gPSAwOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfQ09MT1JdID0gMTsKLSAgICAgICAgICAgIGUtPm1WdHhBdHRyaWJTbG90c1tSU19LSU5EX05PUk1BTF0gPSAyOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfUE9JTlRfU0laRV0gPSAzOwotICAgICAgICAgICAgZS0+bVZ0eEF0dHJpYlNsb3RzW1JTX0tJTkRfVEVYVFVSRV0gPSA0OworICAgICAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocGdtLCAwLCAiQVRUUklCX3Bvc2l0aW9uIik7CisgICAgICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwZ20sIDEsICJBVFRSSUJfY29sb3IiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMiwgIkFUVFJJQl9ub3JtYWwiKTsKKyAgICAgICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHBnbSwgMywgIkFUVFJJQl90ZXh0dXJlMCIpOwogICAgICAgICB9CiAKICAgICAgICAgLy9MT0dFKCJlMiAleCIsIGdsR2V0RXJyb3IoKSk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2lnbmFsLmNwcCBiL2xpYnMvcnMvcnNTaWduYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzliZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU2lnbmFsLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInJzU2lnbmFsLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworCitTaWduYWw6OlNpZ25hbCgpCit7CisgICAgbVNldCA9IHRydWU7Cit9CisKK1NpZ25hbDo6flNpZ25hbCgpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtQ29uZGl0aW9uKTsKK30KKworYm9vbCBTaWduYWw6OmluaXQoKQoreworICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2luaXQoJm1NdXRleCwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gbXV0ZXggaW5pdCBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbUNvbmRpdGlvbiwgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0ZpZm8gY29uZGl0aW9uIGluaXQgZmFpbHVyZSIpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1NdXRleCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaWduYWw6OnNldCgpCit7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIExPR0UoIkxvY2tsZXNzQ29tbWFuZEZpZm86IGVycm9yICVpIGxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TZXQgPSB0cnVlOworCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3NpZ25hbCgmbUNvbmRpdGlvbik7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSBvbiBzZXQgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgfQorCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB1bmxvY2tpbmcgZm9yIHNldCBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKK3ZvaWQgU2lnbmFsOjp3YWl0KCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgbG9ja2luZyBmb3IgY29uZGl0aW9uLiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1TZXQpIHsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJm1Db25kaXRpb24sICZtTXV0ZXgpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBMT0dFKCJMb2NrbGVzc0NvbW1hbmRGaWZvOiBlcnJvciAlaSB3YWl0aW5nIG9uIGNvbmRpdGlvbi4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorICAgIG1TZXQgPSBmYWxzZTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgTE9HRSgiTG9ja2xlc3NDb21tYW5kRmlmbzogZXJyb3IgJWkgdW5sb2NraW5nIGZvciBjb25kaXRpb24uIiwgc3RhdHVzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaWduYWwuaCBiL2xpYnMvcnMvcnNTaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9yc1NpZ25hbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU0lHTkFMX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TSUdOQUxfSAorCisKKyNpbmNsdWRlICJyc1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJzY3JpcHQgeworCitjbGFzcyBTaWduYWwgeworcHVibGljOgorICAgIFNpZ25hbCgpOworICAgIH5TaWduYWwoKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgdm9pZCBzZXQoKTsKKyAgICB2b2lkIHdhaXQoKTsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgbVNldDsKKyAgICBwdGhyZWFkX211dGV4X3QgbU11dGV4OworICAgIHB0aHJlYWRfY29uZF90IG1Db25kaXRpb247Cit9OworCit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAgYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzY2U1Y2QuLjAwMDAwMDAKLS0tIGEvbGlicy9ycy9yc1NpbXBsZU1lc2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAicnNDb250ZXh0LmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLVNpbXBsZU1lc2g6OlNpbXBsZU1lc2goQ29udGV4dCAqcnNjKSA6IE9iamVjdEJhc2UocnNjKQotewotICAgIG1BbGxvY0ZpbGUgPSBfX0ZJTEVfXzsKLSAgICBtQWxsb2NMaW5lID0gX19MSU5FX187Ci19Ci0KLVNpbXBsZU1lc2g6On5TaW1wbGVNZXNoKCkKLXsKLSAgICBkZWxldGVbXSBtVmVydGV4VHlwZXM7Ci0gICAgZGVsZXRlW10gbVZlcnRleEJ1ZmZlcnM7Ci19Ci0KLXZvaWQgU2ltcGxlTWVzaDo6cmVuZGVyKENvbnRleHQgKnJzYykgY29uc3QKLXsKLSAgICBpZiAobVByaW1pdGl2ZVR5cGUuZ2V0KCkpIHsKLSAgICAgICAgcmVuZGVyUmFuZ2UocnNjLCAwLCBtUHJpbWl0aXZlVHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtSW5kZXhUeXBlLmdldCgpKSB7Ci0gICAgICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbUluZGV4VHlwZS0+Z2V0RGltWCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbmRlclJhbmdlKHJzYywgMCwgbVZlcnRleFR5cGVzWzBdLT5nZXREaW1YKCkpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnJlbmRlclJhbmdlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbikgY29uc3QKLXsKLSAgICBpZiAobGVuIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSAxIik7Ci0gICAgVmVydGV4QXJyYXkgdmE7Ci0gICAgaWYgKHJzYy0+Y2hlY2tWZXJzaW9uMl8wKCkpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJzW2N0XS0+dXBsb2FkQ2hlY2socnNjKTsKLSAgICAgICAgICAgIHZhLnNldEFjdGl2ZUJ1ZmZlcihtVmVydGV4QnVmZmVyc1tjdF0tPmdldEJ1ZmZlck9iamVjdElEKCkpOwotICAgICAgICAgICAgbVZlcnRleFR5cGVzW2N0XS0+ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKCZ2YSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmEuc2V0dXBHTDIocnNjLCAmcnNjLT5tU3RhdGVWZXJ0ZXhBcnJheSwgJnJzYy0+bVNoYWRlckNhY2hlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgbVZlcnRleFR5cGVDb3VudDsgY3QrKykgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT51cGxvYWRDaGVjayhyc2MpOwotICAgICAgICAgICAgdmEuc2V0QWN0aXZlQnVmZmVyKG1WZXJ0ZXhCdWZmZXJzW2N0XS0+Z2V0QnVmZmVyT2JqZWN0SUQoKSk7Ci0gICAgICAgICAgICBtVmVydGV4VHlwZXNbY3RdLT5lbmFibGVHTFZlcnRleEJ1ZmZlcigmdmEpOwotICAgICAgICB9Ci0gICAgICAgIHZhLnNldHVwR0wocnNjLCAwKTsKLSAgICB9Ci0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnJlbmRlclJhbmdlIDIiKTsKLSAgICBpZiAobUluZGV4VHlwZS5nZXQoKSkgewotICAgICAgICBtSW5kZXhCdWZmZXItPnVwbG9hZENoZWNrKHJzYyk7Ci0gICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyLT5nZXRCdWZmZXJPYmplY3RJRCgpKTsKLSAgICAgICAgZ2xEcmF3RWxlbWVudHMobUdMUHJpbWl0aXZlLCBsZW4sIEdMX1VOU0lHTkVEX1NIT1JULCAodWludDE2X3QgKikoc3RhcnQgKiAyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKG1HTFByaW1pdGl2ZSwgc3RhcnQsIGxlbik7Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJTaW1wbGVNZXNoOjpyZW5kZXJSYW5nZSIpOwotfQotCi12b2lkIFNpbXBsZU1lc2g6OnVwbG9hZEFsbChDb250ZXh0ICpyc2MpCi17Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1WZXJ0ZXhUeXBlQ291bnQ7IGN0KyspIHsKLSAgICAgICAgaWYgKG1WZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKSkgewotICAgICAgICAgICAgbVZlcnRleEJ1ZmZlcnNbY3RdLT5kZWZlcmVkVXBsb2FkVG9CdWZmZXJPYmplY3QocnNjKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUluZGV4QnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1JbmRleEJ1ZmZlci0+ZGVmZXJlZFVwbG9hZFRvQnVmZmVyT2JqZWN0KHJzYyk7Ci0gICAgfQotICAgIGlmIChtUHJpbWl0aXZlQnVmZmVyLmdldCgpKSB7Ci0gICAgICAgIG1QcmltaXRpdmVCdWZmZXItPmRlZmVyZWRVcGxvYWRUb0J1ZmZlck9iamVjdChyc2MpOwotICAgIH0KLSAgICByc2MtPmNoZWNrRXJyb3IoIlNpbXBsZU1lc2g6OnVwbG9hZEFsbCIpOwotfQotCi0KLVNpbXBsZU1lc2hDb250ZXh0OjpTaW1wbGVNZXNoQ29udGV4dCgpCi17Ci19Ci0KLVNpbXBsZU1lc2hDb250ZXh0Ojp+U2ltcGxlTWVzaENvbnRleHQoKQotewotfQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLVJzU2ltcGxlTWVzaCByc2lfU2ltcGxlTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsIFJzVHlwZSBwcmltLCBSc1R5cGUgaWR4LCBSc1R5cGUgKnZ0eCwgdWludDMyX3QgdnR4Q291bnQsIHVpbnQzMl90IHByaW1UeXBlKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gbmV3IFNpbXBsZU1lc2gocnNjKTsKLSAgICBzbS0+aW5jVXNlclJlZigpOwotCi0gICAgc20tPm1JbmRleFR5cGUuc2V0KChjb25zdCBUeXBlICopaWR4KTsKLSAgICBzbS0+bVByaW1pdGl2ZVR5cGUuc2V0KChjb25zdCBUeXBlICopcHJpbSk7Ci0KLSAgICBzbS0+bVZlcnRleFR5cGVDb3VudCA9IHZ0eENvdW50OwotICAgIHNtLT5tVmVydGV4VHlwZXMgPSBuZXcgT2JqZWN0QmFzZVJlZjxjb25zdCBUeXBlPlt2dHhDb3VudF07Ci0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzID0gbmV3IE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj5bdnR4Q291bnRdOwotICAgIGZvciAodWludDMyX3QgY3Q9MDsgY3QgPCB2dHhDb3VudDsgY3QrKykgewotICAgICAgICBzbS0+bVZlcnRleFR5cGVzW2N0XS5zZXQoKGNvbnN0IFR5cGUgKil2dHhbY3RdKTsKLSAgICB9Ci0KLSAgICBzbS0+bVByaW1pdGl2ZSA9IChSc1ByaW1pdGl2ZSlwcmltVHlwZTsKLSAgICBzd2l0Y2goc20tPm1QcmltaXRpdmUpIHsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9QT0lOVDogICAgICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1BPSU5UUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORTogICAgICAgICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfTElORV9TVFJJUDogICAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9MSU5FX1NUUklQOyBicmVhazsKLSAgICBjYXNlIFJTX1BSSU1JVElWRV9UUklBTkdMRTogICAgICAgc20tPm1HTFByaW1pdGl2ZSA9IEdMX1RSSUFOR0xFUzsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfU1RSSVA6IHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9TVFJJUDsgYnJlYWs7Ci0gICAgY2FzZSBSU19QUklNSVRJVkVfVFJJQU5HTEVfRkFOOiAgIHNtLT5tR0xQcmltaXRpdmUgPSBHTF9UUklBTkdMRV9GQU47IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc207Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kVmVydGV4KENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHNsb3QpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICByc0Fzc2VydChzbG90IDwgc20tPm1WZXJ0ZXhUeXBlQ291bnQpOwotCi0gICAgc20tPm1WZXJ0ZXhCdWZmZXJzW3Nsb3RdLnNldCgoQWxsb2NhdGlvbiAqKXZhKTsKLX0KLQotdm9pZCByc2lfU2ltcGxlTWVzaEJpbmRJbmRleChDb250ZXh0ICpyc2MsIFJzU2ltcGxlTWVzaCBtdiwgUnNBbGxvY2F0aW9uIHZhKQotewotICAgIFNpbXBsZU1lc2ggKnNtID0gc3RhdGljX2Nhc3Q8U2ltcGxlTWVzaCAqPihtdik7Ci0gICAgc20tPm1JbmRleEJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLXZvaWQgcnNpX1NpbXBsZU1lc2hCaW5kUHJpbWl0aXZlKENvbnRleHQgKnJzYywgUnNTaW1wbGVNZXNoIG12LCBSc0FsbG9jYXRpb24gdmEpCi17Ci0gICAgU2ltcGxlTWVzaCAqc20gPSBzdGF0aWNfY2FzdDxTaW1wbGVNZXNoICo+KG12KTsKLSAgICBzbS0+bVByaW1pdGl2ZUJ1ZmZlci5zZXQoKEFsbG9jYXRpb24gKil2YSk7Ci19Ci0KLQotCi0KLX19Ci0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmggYi9saWJzL3JzL3JzU2ltcGxlTWVzaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGVmYmRhLi4wMDAwMDAwCi0tLSBhL2xpYnMvcnMvcnNTaW1wbGVNZXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1JTX1NJTVBMRV9NRVNIX0gKLSNkZWZpbmUgQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KLQotI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewotCi0KLS8vIEFuIGVsZW1lbnQgaXMgYSBncm91cCBvZiBDb21wb25lbnRzIHRoYXQgb2NjdXBpZXMgb25lIGNlbGwgaW4gYSBzdHJ1Y3R1cmUuCi1jbGFzcyBTaW1wbGVNZXNoIDogcHVibGljIE9iamVjdEJhc2UKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoKENvbnRleHQgKik7Ci0gICAgflNpbXBsZU1lc2goKTsKLQotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gbUluZGV4VHlwZTsKLSAgICBPYmplY3RCYXNlUmVmPGNvbnN0IFR5cGU+IG1QcmltaXRpdmVUeXBlOwotICAgIE9iamVjdEJhc2VSZWY8Y29uc3QgVHlwZT4gKm1WZXJ0ZXhUeXBlczsKLSAgICB1aW50MzJfdCBtVmVydGV4VHlwZUNvdW50OwotCi0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtSW5kZXhCdWZmZXI7Ci0gICAgT2JqZWN0QmFzZVJlZjxBbGxvY2F0aW9uPiBtUHJpbWl0aXZlQnVmZmVyOwotICAgIE9iamVjdEJhc2VSZWY8QWxsb2NhdGlvbj4gKm1WZXJ0ZXhCdWZmZXJzOwotCi0gICAgUnNQcmltaXRpdmUgbVByaW1pdGl2ZTsKLSAgICB1aW50MzJfdCBtR0xQcmltaXRpdmU7Ci0KLQotICAgIHZvaWQgcmVuZGVyKENvbnRleHQgKikgY29uc3Q7Ci0gICAgdm9pZCByZW5kZXJSYW5nZShDb250ZXh0ICosIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4pIGNvbnN0OwotICAgIHZvaWQgdXBsb2FkQWxsKENvbnRleHQgKik7Ci0KLQotcHJvdGVjdGVkOgotfTsKLQotY2xhc3MgU2ltcGxlTWVzaENvbnRleHQKLXsKLXB1YmxpYzoKLSAgICBTaW1wbGVNZXNoQ29udGV4dCgpOwotICAgIH5TaW1wbGVNZXNoQ29udGV4dCgpOwotCi0KLX07Ci0KLQotfQotfQotI2VuZGlmIC8vQU5EUk9JRF9SU19TSU1QTEVfTUVTSF9ICi0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTdHJlYW0uY3BwIGIvbGlicy9ycy9yc1N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyNDFmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvcnNTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTMxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKKyNpbmNsdWRlICJyc0NvbnRleHQuaCIKKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OworCitJU3RyZWFtOjpJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYm9vbCB1c2U2NCkKK3sKKyAgICBtRGF0YSA9IGJ1ZjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkQnl0ZUFycmF5KHZvaWQgKmRlc3QsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICBtZW1jcHkoZGVzdCwgbURhdGEgKyBtUG9zLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordWludDY0X3QgSVN0cmVhbTo6bG9hZE9mZnNldCgpCit7CisgICAgdWludDY0X3QgdG1wOworICAgIGlmIChtVXNlNjQpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgNykgJiAofjcpOworICAgICAgICB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgcmV0dXJuIGxvYWRVMzIoKTsKK30KKwordm9pZCBJU3RyZWFtOjpsb2FkU3RyaW5nKFN0cmluZzggKnMpCit7CisgICAgdWludDMyX3QgbGVuID0gbG9hZFUzMigpOworICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopJm1EYXRhW21Qb3NdLCBsZW4pOworICAgIG1Qb3MgKz0gbGVuOworfQorCisKKy8vIE91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KKworT1N0cmVhbTo6T1N0cmVhbSh1aW50NjRfdCBsZW4sIGJvb2wgdXNlNjQpCit7CisgICAgbURhdGEgPSAodWludDhfdCopbWFsbG9jKGxlbik7CisgICAgbUxlbmd0aCA9IGxlbjsKKyAgICBtUG9zID0gMDsKKyAgICBtVXNlNjQgPSB1c2U2NDsKK30KKworT1N0cmVhbTo6fk9TdHJlYW0oKQoreworICAgIGZyZWUobURhdGEpOworfQorCit2b2lkIE9TdHJlYW06OmFkZEJ5dGVBcnJheShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBudW1CeXRlcykKK3sKKyAgICAvLyBXZSBuZWVkIHRvIHBvdGVudGlhbGx5IGdyb3cgbW9yZSB0aGFuIG9uY2UgaWYgdGhlIG51bWJlciBvZiBieWVzIHdlIHdyaXRlIGlzIHN1YnN0YW50aWFsCisgICAgd2hpbGUobVBvcyArIG51bUJ5dGVzID49IG1MZW5ndGgpIHsKKyAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICB9CisgICAgbWVtY3B5KG1EYXRhICsgbVBvcywgc3JjLCBudW1CeXRlcyk7CisgICAgbVBvcyArPSBudW1CeXRlczsKK30KKwordm9pZCBPU3RyZWFtOjphZGRPZmZzZXQodWludDY0X3QgdikKK3sKKyAgICBpZiAobVVzZTY0KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDcpICYgKH43KTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMzIpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDApICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gNTYpICYgMHhmZik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhZGRVMzIodik7CisgICAgfQorfQorCit2b2lkIE9TdHJlYW06OmFkZFN0cmluZyhTdHJpbmc4ICpzKQoreworICAgIHVpbnQzMl90IGxlbiA9IHMtPnNpemUoKTsKKyAgICBhZGRVMzIobGVuKTsKKyAgICBpZihtUG9zICsgbGVuKnNpemVvZihjaGFyKSA+PSBtTGVuZ3RoKSB7CisgICAgICAgIGdyb3dTaXplKCk7CisgICAgfQorICAgIGNoYXIgKnN0cmluZ0RhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1EYXRhW21Qb3NdKTsKKyAgICBmb3IodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKyAgICAgICAgc3RyaW5nRGF0YVtpXSA9IHMtPnN0cmluZygpW2ldOworICAgIH0KKyAgICBtUG9zICs9IGxlbipzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgT1N0cmVhbTo6Z3Jvd1NpemUoKQoreworICAgIHVpbnQ4X3QgKm5ld0RhdGEgPSAodWludDhfdCopbWFsbG9jKG1MZW5ndGgqMik7CisgICAgbWVtY3B5KG5ld0RhdGEsIG1EYXRhLCBtTGVuZ3RoKnNpemVvZih1aW50OF90KSk7CisgICAgbUxlbmd0aCA9IG1MZW5ndGggKiAyOworICAgIGZyZWUobURhdGEpOworICAgIG1EYXRhID0gbmV3RGF0YTsKK30KKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU3RyZWFtLmggYi9saWJzL3JzL3JzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMWNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL3JzU3RyZWFtLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUlNfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9SU19TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CisKK2NsYXNzIElTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBJU3RyZWFtKGNvbnN0IHVpbnQ4X3QgKiwgYm9vbCB1c2U2NCk7CisKKyAgICBmbG9hdCBsb2FkRigpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBmbG9hdCB0bXAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgaW50MzJfdCBsb2FkSTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIGludDMyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKGludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MzJfdCBsb2FkVTMyKCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAzKSAmICh+Myk7CisgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB1aW50MTZfdCBsb2FkVTE2KCkgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIHVpbnQxNl90IHRtcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QgKj4oJm1EYXRhW21Qb3NdKVswXTsKKyAgICAgICAgbVBvcyArPSBzaXplb2YodWludDE2X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICBpbmxpbmUgdWludDhfdCBsb2FkVTgoKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZtRGF0YVttUG9zXSlbMF07CisgICAgICAgIG1Qb3MgKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICByZXR1cm4gdG1wOworICAgIH0KKyAgICB2b2lkIGxvYWRCeXRlQXJyYXkodm9pZCAqZGVzdCwgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB1aW50NjRfdCBsb2FkT2Zmc2V0KCk7CisgICAgdm9pZCBsb2FkU3RyaW5nKFN0cmluZzggKnMpOworICAgIHVpbnQ2NF90IGdldFBvcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQodWludDY0X3QgcG9zKSB7CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgfQorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1Qb3MgPSAwOworICAgIH0KKyAgICAKKyAgICBjb25zdCB1aW50OF90ICogZ2V0UHRyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQ4X3QgKiBtRGF0YTsKKyAgICB1aW50NjRfdCBtUG9zOworICAgIGJvb2wgbVVzZTY0OworfTsKKworY2xhc3MgT1N0cmVhbQoreworcHVibGljOgorICAgIE9TdHJlYW0odWludDY0X3QgbGVuZ3RoLCBib29sIHVzZTY0KTsKKyAgICB+T1N0cmVhbSgpOworICAgIAorICAgIHZvaWQgYWxpZ24odWludDMyX3QgYnl0ZXMpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSk7CisgICAgICAgIGlmKG1Qb3MgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFkZEYoZmxvYXQgdikgeworICAgICAgICB1aW50MzJfdCB1aW50ViA9ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4gKCZ2KTsKKyAgICAgICAgYWRkVTMyKHVpbnRWKTsKKyAgICB9CisgICAgdm9pZCBhZGRJMzIoaW50MzJfdCB2KSB7CisgICAgICAgIG1Qb3MgPSAobVBvcyArIDMpICYgKH4zKTsKKyAgICAgICAgaWYobVBvcyArIHNpemVvZih2KSA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICBncm93U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkodiAmIDB4ZmYpOworICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKCh2ID4+IDgpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMTYpICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gMjQpICYgMHhmZik7CisgICAgfQorICAgIHZvaWQgYWRkVTMyKHVpbnQzMl90IHYpIHsKKyAgICAgICAgbVBvcyA9IChtUG9zICsgMykgJiAofjMpOworICAgICAgICBpZihtUG9zICsgc2l6ZW9mKHYpID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIGdyb3dTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ICYgMHhmZik7CisgICAgICAgIG1EYXRhW21Qb3MrK10gPSAodWludDhfdCkoKHYgPj4gOCkgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSgodiA+PiAyNCkgJiAweGZmKTsKKyAgICB9CisgICAgdm9pZCBhZGRVMTYodWludDE2X3QgdikgeworICAgICAgICBtUG9zID0gKG1Qb3MgKyAxKSAmICh+MSk7CisgICAgICAgIGlmKG1Qb3MgKyBzaXplb2YodikgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICBtRGF0YVttUG9zKytdID0gKHVpbnQ4X3QpKHYgJiAweGZmKTsKKyAgICAgICAgbURhdGFbbVBvcysrXSA9ICh1aW50OF90KSh2ID4+IDgpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZGRVOCh1aW50OF90IHYpIHsKKyAgICAgICAgaWYobVBvcyArIDEgPj0gbUxlbmd0aCkgeworICAgICAgICAgICAgZ3Jvd1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJm1EYXRhW21Qb3NdKVswXSA9IHY7CisgICAgICAgIG1Qb3MgKys7CisgICAgfQorICAgIHZvaWQgYWRkQnl0ZUFycmF5KGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG51bUJ5dGVzKTsKKyAgICB2b2lkIGFkZE9mZnNldCh1aW50NjRfdCB2KTsKKyAgICB2b2lkIGFkZFN0cmluZyhTdHJpbmc4ICpzKTsKKyAgICB1aW50NjRfdCBnZXRQb3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KHVpbnQ2NF90IHBvcykgeworICAgICAgICBtUG9zID0gcG9zOworICAgIH0KKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUG9zID0gMDsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqIGdldFB0cigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICB2b2lkIGdyb3dTaXplKCk7CisgICAgdWludDhfdCAqIG1EYXRhOworICAgIHVpbnQ2NF90IG1MZW5ndGg7CisgICAgdWludDY0X3QgbVBvczsKKyAgICBib29sIG1Vc2U2NDsKK307CisgICAgCisKK30gLy8gcmVuZGVyc2NyaXB0Cit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvL0FORFJPSURfUlNfU1RSRUFNX0gKKworCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzVHlwZS5jcHAgYi9saWJzL3JzL3JzVHlwZS5jcHAKaW5kZXggYzA5ZTk3OS4uNzljZmQ0MSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuY3BwCisrKyBiL2xpYnMvcnMvcnNUeXBlLmNwcApAQCAtMTQsOCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgogI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNlbHNlCisjaW5jbHVkZSAicnNDb250ZXh0SG9zdFN0dWIuaCIKKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ7CkBAIC04NCw3ICs4OSw5IEBACiAgICAgICAgIG1MT0RDb3VudCA9IDE7CiAgICAgfQogICAgIGlmIChtTE9EQ291bnQgIT0gb2xkTE9EQ291bnQpIHsKLSAgICAgICAgZGVsZXRlIFtdIG1MT0RzOworICAgICAgICBpZihtTE9Ecyl7CisgICAgICAgICAgICBkZWxldGUgW10gbUxPRHM7CisgICAgICAgIH0KICAgICAgICAgbUxPRHMgPSBuZXcgTE9EW21MT0RDb3VudF07CiAgICAgfQogCkBAIC0xMzgsMTM2ICsxNDUsMzEgQEAKIAogdm9pZCBUeXBlOjptYWtlR0xDb21wb25lbnRzKCkKIHsKKyAgICBpZihnZXRFbGVtZW50KCktPmdldEZpZWxkQ291bnQoKSA+PSBSU19NQVhfQVRUUklCUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgdWludDMyX3QgdXNlck51bSA9IDA7CiAKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgZ2V0RWxlbWVudCgpLT5nZXRGaWVsZENvdW50KCk7IGN0KyspIHsKICAgICAgICAgY29uc3QgQ29tcG9uZW50ICZjID0gZ2V0RWxlbWVudCgpLT5nZXRGaWVsZChjdCktPmdldENvbXBvbmVudCgpOwogCi0gICAgICAgIHN3aXRjaChjLmdldEtpbmQoKSkgewotICAgICAgICBjYXNlIFJTX0tJTkRfVVNFUjoKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVVzZXJbdXNlck51bV0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Vc2VyW3VzZXJOdW1dLm5vcm1hbGl6ZWQgPSBjLmdldFR5cGUoKSAhPSBSU19UWVBFX0ZMT0FUXzMyOy8vYy5nZXRJc05vcm1hbGl6ZWQoKTsKLSAgICAgICAgICAgIG1HTC5tVXNlclt1c2VyTnVtXS5uYW1lLnNldFRvKGdldEVsZW1lbnQoKS0+Z2V0RmllbGROYW1lKGN0KSk7Ci0gICAgICAgICAgICB1c2VyTnVtICsrOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPU0lUSU9OOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1WdHguc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tVnR4LnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVnR4Lm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVnR4LnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1WdHgubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1WdHgubmFtZS5zZXRUbygiUG9zaXRpb24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9DT0xPUjoKLSAgICAgICAgICAgIHJzQXNzZXJ0KG1HTC5tQ29sb3Iuc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tQ29sb3Iuc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOwotICAgICAgICAgICAgbUdMLm1Db2xvci5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubUNvbG9yLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Db2xvci5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsKLSAgICAgICAgICAgIG1HTC5tQ29sb3IubmFtZS5zZXRUbygiQ29sb3IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9OT1JNQUw6Ci0gICAgICAgICAgICByc0Fzc2VydChtR0wubU5vcm0uc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubU5vcm0ub2Zmc2V0ID0gbUVsZW1lbnQtPmdldEZpZWxkT2Zmc2V0Qnl0ZXMoY3QpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1Ob3JtLm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tTm9ybS5uYW1lLnNldFRvKCJOb3JtYWwiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9URVhUVVJFOgotICAgICAgICAgICAgcnNBc3NlcnQobUdMLm1UZXguc2l6ZSA9PSAwKTsKLSAgICAgICAgICAgIG1HTC5tVGV4LnNpemUgPSBjLmdldFZlY3RvclNpemUoKTsKLSAgICAgICAgICAgIG1HTC5tVGV4Lm9mZnNldCA9IG1FbGVtZW50LT5nZXRGaWVsZE9mZnNldEJ5dGVzKGN0KTsKLSAgICAgICAgICAgIG1HTC5tVGV4LnR5cGUgPSBjLmdldEdMVHlwZSgpOwotICAgICAgICAgICAgbUdMLm1UZXgubm9ybWFsaXplZCA9IGZhbHNlOwotICAgICAgICAgICAgbUdMLm1UZXgubmFtZS5zZXRUbygiVGV4dHVyZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPSU5UX1NJWkU6Ci0gICAgICAgICAgICByc0Fzc2VydCghbUdMLm1Qb2ludFNpemUuc2l6ZSk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5zaXplID0gYy5nZXRWZWN0b3JTaXplKCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7Ci0gICAgICAgICAgICBtR0wubVBvaW50U2l6ZS50eXBlID0gYy5nZXRHTFR5cGUoKTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm5vcm1hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm5hbWUuc2V0VG8oIlBvaW50U2l6ZSIpOwotICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgbUF0dHJpYnNbdXNlck51bV0uc2l6ZSA9IGMuZ2V0VmVjdG9yU2l6ZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5vZmZzZXQgPSBtRWxlbWVudC0+Z2V0RmllbGRPZmZzZXRCeXRlcyhjdCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLnR5cGUgPSBjLmdldEdMVHlwZSgpOworICAgICAgICBtQXR0cmlic1t1c2VyTnVtXS5ub3JtYWxpemVkID0gYy5nZXRUeXBlKCkgIT0gUlNfVFlQRV9GTE9BVF8zMjsvL2MuZ2V0SXNOb3JtYWxpemVkKCk7CisgICAgICAgIG1BdHRyaWJzW3VzZXJOdW1dLm5hbWUuc2V0VG8oZ2V0RWxlbWVudCgpLT5nZXRGaWVsZE5hbWUoY3QpKTsKKyAgICAgICAgdXNlck51bSArKzsKICAgICB9CiB9CiAKKwogdm9pZCBUeXBlOjplbmFibGVHTFZlcnRleEJ1ZmZlcihWZXJ0ZXhBcnJheSAqdmEpIGNvbnN0CiB7Ci0gICAgLy8gTm90ZTogV2UgYXJlIG9ubHkgZ29pbmcgdG8gZW5hYmxlIGJ1ZmZlcnMgYW5kIG5ldmVyIGRpc2FibGUgdGhlbQotICAgIC8vIGhlcmUuICBUaGUgcmVhc29uIGlzIG1vcmUgdGhhbiBvbmUgQWxsb2NhdGlvbiBtYXkgYmUgdXNlZCBhcyBhIHZlcnRleAotICAgIC8vIHNvdXJjZS4gIFNvIHdlIGNhbm5vdCBkaXNhYmxlIGFycmF5cyB0aGF0IG1heSBoYXZlIGJlZW4gaW4gdXNlIGJ5Ci0gICAgLy8gYW5vdGhlciBhbGxvY2F0aW9uLgotCi0gICAgdWludDMyX3Qgc3RyaWRlID0gbUVsZW1lbnQtPmdldFNpemVCeXRlcygpOwotICAgIGlmIChtR0wubVZ0eC5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1WdHgudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBtR0wubVZ0eC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIG1HTC5tVnR4Lm9mZnNldCk7Ci0gICAgfQotCi0gICAgaWYgKG1HTC5tTm9ybS5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Ob3JtLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAzLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tTm9ybS5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubUNvbG9yLnNpemUpIHsKLSAgICAgICAgdmEtPmFkZExlZ2FjeShtR0wubUNvbG9yLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubUNvbG9yLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX0NPTE9SLAotICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tQ29sb3Iub2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobUdMLm1UZXguc2l6ZSkgewotICAgICAgICB2YS0+YWRkTGVnYWN5KG1HTC5tVGV4LnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVRleC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgUlNfS0lORF9URVhUVVJFLAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBtR0wubVRleC5vZmZzZXQpOwotICAgIH0KLQotICAgIGlmIChtR0wubVBvaW50U2l6ZS5zaXplKSB7Ci0gICAgICAgIHZhLT5hZGRMZWdhY3kobUdMLm1Qb2ludFNpemUudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBSU19LSU5EX1BPSU5UX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIG1HTC5tUG9pbnRTaXplLm9mZnNldCk7Ci0gICAgfQotCi19Ci0KLXZvaWQgVHlwZTo6ZW5hYmxlR0xWZXJ0ZXhCdWZmZXIyKFZlcnRleEFycmF5ICp2YSkgY29uc3QKLXsKLSAgICAvLyBEbyBsZWdhY3kgYnVmZmVycwotICAgIGVuYWJsZUdMVmVydGV4QnVmZmVyKHZhKTsKLQogICAgIHVpbnQzMl90IHN0cmlkZSA9IG1FbGVtZW50LT5nZXRTaXplQnl0ZXMoKTsKICAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgUlNfTUFYX0FUVFJJQlM7IGN0KyspIHsKLSAgICAgICAgaWYgKG1HTC5tVXNlcltjdF0uc2l6ZSkgewotICAgICAgICAgICAgdmEtPmFkZFVzZXIobUdMLm1Vc2VyW2N0XSwgc3RyaWRlKTsKKyAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5zaXplKSB7CisgICAgICAgICAgICB2YS0+YWRkKG1BdHRyaWJzW2N0XSwgc3RyaWRlKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI4Myw2ICsxODUsNTcgQEAKICAgICBtRWxlbWVudC0+ZHVtcExPR1YoYnVmKTsKIH0KIAordm9pZCBUeXBlOjpzZXJpYWxpemUoT1N0cmVhbSAqc3RyZWFtKSBjb25zdAoreworICAgIC8vIE5lZWQgdG8gaWRlbnRpZnkgb3Vyc2VsdmVzCisgICAgc3RyZWFtLT5hZGRVMzIoKHVpbnQzMl90KWdldENsYXNzSWQoKSk7CisKKyAgICBTdHJpbmc4IG5hbWUoZ2V0TmFtZSgpKTsKKyAgICBzdHJlYW0tPmFkZFN0cmluZygmbmFtZSk7CisKKyAgICBtRWxlbWVudC0+c2VyaWFsaXplKHN0cmVhbSk7CisKKyAgICBzdHJlYW0tPmFkZFUzMihtRGltWCk7CisgICAgc3RyZWFtLT5hZGRVMzIobURpbVkpOworICAgIHN0cmVhbS0+YWRkVTMyKG1EaW1aKTsKKworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1EaW1MT0QgPyAxIDogMCkpOworICAgIHN0cmVhbS0+YWRkVTgoKHVpbnQ4X3QpKG1GYWNlcyA/IDEgOiAwKSk7Cit9CisKK1R5cGUgKlR5cGU6OmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGFyZSByZWFkaW5nIHRoZSBjb3JyZWN0IG9iamVjdAorICAgIFJzQTNEQ2xhc3NJRCBjbGFzc0lEID0gKFJzQTNEQ2xhc3NJRClzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICBpZihjbGFzc0lEICE9IFJTX0EzRF9DTEFTU19JRF9UWVBFKSB7CisgICAgICAgIExPR0UoInR5cGUgbG9hZGluZyBza2lwcGVkIGR1ZSB0byBpbnZhbGlkIGNsYXNzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU3RyaW5nOCBuYW1lOworICAgIHN0cmVhbS0+bG9hZFN0cmluZygmbmFtZSk7CisKKyAgICBFbGVtZW50ICplbGVtID0gRWxlbWVudDo6Y3JlYXRlRnJvbVN0cmVhbShyc2MsIHN0cmVhbSk7CisgICAgaWYoIWVsZW0pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVHlwZSAqdHlwZSA9IG5ldyBUeXBlKHJzYyk7CisgICAgdHlwZS0+bURpbVggPSBzdHJlYW0tPmxvYWRVMzIoKTsKKyAgICB0eXBlLT5tRGltWSA9IHN0cmVhbS0+bG9hZFUzMigpOworICAgIHR5cGUtPm1EaW1aID0gc3RyZWFtLT5sb2FkVTMyKCk7CisKKyAgICB1aW50OF90IHRlbXAgPSBzdHJlYW0tPmxvYWRVOCgpOworICAgIHR5cGUtPm1EaW1MT0QgPSB0ZW1wICE9IDA7CisKKyAgICB0ZW1wID0gc3RyZWFtLT5sb2FkVTgoKTsKKyAgICB0eXBlLT5tRmFjZXMgPSB0ZW1wICE9IDA7CisKKyAgICB0eXBlLT5zZXRFbGVtZW50KGVsZW0pOworCisgICAgcmV0dXJuIHR5cGU7Cit9CisKIGJvb2wgVHlwZTo6Z2V0SXNOcDIoKSBjb25zdAogewogICAgIHVpbnQzMl90IHggPSBnZXREaW1YKCk7CkBAIC0zOTEsNiArMzQ0LDIyIEBACiAgICAgcmV0dXJuIHN0OwogfQogCit2b2lkIHJzaV9UeXBlR2V0TmF0aXZlRGF0YShDb250ZXh0ICpyc2MsIFJzVHlwZSB0eXBlLCB1aW50MzJfdCAqdHlwZURhdGEsIHVpbnQzMl90IHR5cGVEYXRhU2l6ZSkKK3sKKyAgICByc0Fzc2VydCh0eXBlRGF0YVNpemUgPT0gNik7CisgICAgLy8gUGFjayB0aGUgZGF0YSBpbiB0aGUgZm9sbG9maW5nIHdheSBtRGltWDsgbURpbVk7IG1EaW1aOworICAgIC8vIG1EaW1MT0Q7IG1EaW1GYWNlczsgbUVsZW1lbnQ7IGludG8gdHlwZURhdGEKKyAgICBUeXBlICp0ID0gc3RhdGljX2Nhc3Q8VHlwZSAqPih0eXBlKTsKKworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1YKCk7CisgICAgKCp0eXBlRGF0YSsrKSA9IHQtPmdldERpbVkoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltWigpOworICAgICgqdHlwZURhdGErKykgPSB0LT5nZXREaW1MT0QoKTsKKyAgICAoKnR5cGVEYXRhKyspID0gdC0+Z2V0RGltRmFjZXMoKSA/IDEgOiAwOworICAgICgqdHlwZURhdGErKykgPSAodWludDMyX3QpdC0+Z2V0RWxlbWVudCgpOworCit9CisKIAogfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1R5cGUuaCBiL2xpYnMvcnMvcnNUeXBlLmgKaW5kZXggYzI1NTc3Yy4uNWI1MWUyMCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1R5cGUuaAorKysgYi9saWJzL3JzL3JzVHlwZS5oCkBAIC03MSw5ICs3MSwxMSBAQAogICAgIHZvaWQgY29tcHV0ZSgpOwogCiAgICAgdm9pZCBlbmFibGVHTFZlcnRleEJ1ZmZlcihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKLSAgICB2b2lkIGVuYWJsZUdMVmVydGV4QnVmZmVyMihjbGFzcyBWZXJ0ZXhBcnJheSAqKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplKE9TdHJlYW0gKnN0cmVhbSkgY29uc3Q7CisgICAgdmlydHVhbCBSc0EzRENsYXNzSUQgZ2V0Q2xhc3NJZCgpIGNvbnN0IHsgcmV0dXJuIFJTX0EzRF9DTEFTU19JRF9UWVBFOyB9CisgICAgc3RhdGljIFR5cGUgKmNyZWF0ZUZyb21TdHJlYW0oQ29udGV4dCAqcnNjLCBJU3RyZWFtICpzdHJlYW0pOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IExPRCB7CkBAIC0xMTIsMTUgKzExNCw3IEBACiAgICAgTE9EICptTE9EczsKICAgICB1aW50MzJfdCBtTE9EQ291bnQ7CiAKLSAgICBzdHJ1Y3QgR0xTdGF0ZV90IHsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtVXNlcltSU19NQVhfQVRUUklCU107Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVZ0eDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtTm9ybTsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtQ29sb3I7Ci0gICAgICAgIFZlcnRleEFycmF5OjpBdHRyaWIgbVRleDsKLSAgICAgICAgVmVydGV4QXJyYXk6OkF0dHJpYiBtUG9pbnRTaXplOwotICAgIH07Ci0gICAgR0xTdGF0ZV90IG1HTDsKKyAgICBWZXJ0ZXhBcnJheTo6QXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKICAgICB2b2lkIG1ha2VHTENvbXBvbmVudHMoKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNVdGlscy5oIGIvbGlicy9ycy9yc1V0aWxzLmgKaW5kZXggMDdmODkzMy4uMTdmZWIyMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1V0aWxzLmgKKysrIGIvbGlicy9ycy9yc1V0aWxzLmgKQEAgLTE5LDE1ICsxOSwyMyBAQAogCiAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJSZW5kZXJTY3JpcHQiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCisjaW5jbHVkZSAicnNTdHJlYW0uaCIKKwogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogCisjaWZuZGVmIEFORFJPSURfUlNfQlVJTERfRk9SX0hPU1QKICNpbmNsdWRlIDxFR0wvZWdsLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgIlJlbmRlclNjcmlwdC5oIgpAQCAtNDEsNiArNDksMjYgQEAKICNkZWZpbmUgcnNBc3NlcnQodikgd2hpbGUoMCkKICNlbmRpZgogCit0eXBlZGVmIGZsb2F0IHJzdkZfMiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDgpKSk7Cit0eXBlZGVmIGZsb2F0IHJzdkZfNCBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwordHlwZWRlZiB1aW50OF90IHJzdlU4XzQgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg0KSkpOworCit1bmlvbiBmbG9hdDIgeworICAgIHJzdkZfMiB2OworICAgIGZsb2F0IGZbMl07Cit9OworCit1bmlvbiBmbG9hdDQgeworICAgIHJzdkZfNCB2OworICAgIGZsb2F0IGZbNF07Cit9OworCit1bmlvbiB1Y2hhcjQgeworICAgIHJzdlU4XzQgdjsKKyAgICB1aW50OF90IGZbNF07CisgICAgdWludDMyX3QgcGFja2VkOworfTsKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFQgcnNNaW4oVCBpbjEsIFQgaW4yKQogewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcCBiL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5jcHAKaW5kZXggNmMyMDAyZC4uMDc1YTcwZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmNwcAorKysgYi9saWJzL3JzL3JzVmVydGV4QXJyYXkuY3BwCkBAIC0xNCwxMCArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpZm5kZWYgQU5EUk9JRF9SU19CVUlMRF9GT1JfSE9TVAogI2luY2x1ZGUgInJzQ29udGV4dC5oIgotCiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2Vsc2UKKyNpbmNsdWRlICJyc0NvbnRleHRIb3N0U3R1Yi5oIgorI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzksNiArNDQsNyBAQAogICAgICAgICBtQXR0cmlic1tjdF0uY2xlYXIoKTsKICAgICB9CiAgICAgbUFjdGl2ZUJ1ZmZlciA9IDA7CisgICAgbUFjdGl2ZVBvaW50ZXIgPSBOVUxMOwogICAgIG1Db3VudCA9IDA7CiB9CiAKQEAgLTUwLDEyICs1NiwxMiBAQAogdm9pZCBWZXJ0ZXhBcnJheTo6QXR0cmliOjpzZXQoY29uc3QgQXR0cmliICZhKQogewogICAgIGJ1ZmZlciA9IGEuYnVmZmVyOworICAgIHB0ciA9IGEucHRyOwogICAgIG9mZnNldCA9IGEub2Zmc2V0OwogICAgIHR5cGUgPSBhLnR5cGU7CiAgICAgc2l6ZSA9IGEuc2l6ZTsKICAgICBzdHJpZGUgPSBhLnN0cmlkZTsKICAgICBub3JtYWxpemVkID0gYS5ub3JtYWxpemVkOwotICAgIGtpbmQgPSBSU19LSU5EX1VTRVI7CiAgICAgbmFtZS5zZXRUbyhhLm5hbWUpOwogfQogCkBAIC02Niw2ICs3Miw3IEBACiAgICAgdHlwZSA9IDA7CiAgICAgc2l6ZSA9IDA7CiAgICAgc3RyaWRlID0gMDsKKyAgICBwdHIgPSBOVUxMOwogICAgIG5vcm1hbGl6ZWQgPSBmYWxzZTsKICAgICBuYW1lLnNldFRvKCIiKTsKIH0KQEAgLTc1LDEzOCArODIsODcgQEAKICAgICBtQXR0cmlic1tuXS5jbGVhcigpOwogfQogCi12b2lkIFZlcnRleEFycmF5OjphZGRVc2VyKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQordm9pZCBWZXJ0ZXhBcnJheTo6YWRkKGNvbnN0IEF0dHJpYiAmYSwgdWludDMyX3Qgc3RyaWRlKQogewotICAgIGFzc2VydChtQ291bnQgPCBSU19NQVhfQVRUUklCUyk7CisgICAgcnNBc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOwogICAgIG1BdHRyaWJzW21Db3VudF0uc2V0KGEpOwogICAgIG1BdHRyaWJzW21Db3VudF0uYnVmZmVyID0gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBtQXR0cmlic1ttQ291bnRdLnB0ciA9IG1BY3RpdmVQb2ludGVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IFJTX0tJTkRfVVNFUjsKICAgICBtQ291bnQgKys7CiB9CiAKLXZvaWQgVmVydGV4QXJyYXk6OmFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIFJzRGF0YUtpbmQga2luZCwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQpCit2b2lkIFZlcnRleEFycmF5OjphZGQodWludDMyX3QgdHlwZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3Qgc3RyaWRlLCBib29sIG5vcm1hbGl6ZWQsIHVpbnQzMl90IG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBhc3NlcnQobUNvdW50IDwgUlNfTUFYX0FUVFJJQlMpOworICAgIHJzQXNzZXJ0KG1Db3VudCA8IFJTX01BWF9BVFRSSUJTKTsKICAgICBtQXR0cmlic1ttQ291bnRdLmNsZWFyKCk7CiAgICAgbUF0dHJpYnNbbUNvdW50XS50eXBlID0gdHlwZTsKICAgICBtQXR0cmlic1ttQ291bnRdLnNpemUgPSBzaXplOwogICAgIG1BdHRyaWJzW21Db3VudF0ub2Zmc2V0ID0gb2Zmc2V0OwogICAgIG1BdHRyaWJzW21Db3VudF0ubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7Ci0gICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOwogICAgIG1BdHRyaWJzW21Db3VudF0uc3RyaWRlID0gc3RyaWRlOwotICAgIG1BdHRyaWJzW21Db3VudF0ua2luZCA9IGtpbmQ7CisgICAgbUF0dHJpYnNbbUNvdW50XS5uYW1lLnNldFRvKG5hbWUpOworCisgICAgbUF0dHJpYnNbbUNvdW50XS5idWZmZXIgPSBtQWN0aXZlQnVmZmVyOworICAgIG1BdHRyaWJzW21Db3VudF0ucHRyID0gbUFjdGl2ZVBvaW50ZXI7CiAgICAgbUNvdW50ICsrOwogfQogCiB2b2lkIFZlcnRleEFycmF5Ojpsb2dBdHRyaWIodWludDMyX3QgaWR4LCB1aW50MzJfdCBzbG90KSBjb25zdCB7Ci0gICAgTE9HRSgidmEgJWk6IHNsb3Q9JWkgbmFtZT0lcyBidWY9JWkgIHNpemU9JWkgIHR5cGU9MHgleCAga2luZD0laSAgc3RyaWRlPTB4JXggIG5vcm09JWkgIG9mZnNldD0weCV4IiwgaWR4LCBzbG90LAorICAgIExPR0UoInZhICVpOiBzbG90PSVpIG5hbWU9JXMgYnVmPSVpIHB0cj0lcCBzaXplPSVpICB0eXBlPTB4JXggIHN0cmlkZT0weCV4ICBub3JtPSVpICBvZmZzZXQ9MHgleCIsIGlkeCwgc2xvdCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ubmFtZS5zdHJpbmcoKSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0uYnVmZmVyLAorICAgICAgICAgbUF0dHJpYnNbaWR4XS5wdHIsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnNpemUsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnR5cGUsCi0gICAgICAgICBtQXR0cmlic1tpZHhdLmtpbmQsCiAgICAgICAgICBtQXR0cmlic1tpZHhdLnN0cmlkZSwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ubm9ybWFsaXplZCwKICAgICAgICAgIG1BdHRyaWJzW2lkeF0ub2Zmc2V0KTsKIH0KIAotdm9pZCBWZXJ0ZXhBcnJheTo6c2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKnN0YXRlKSBjb25zdAotewotICAgIGdsQ2xpZW50QWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpOwotCi0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db3VudDsgY3QrKykgewotICAgICAgICBzd2l0Y2gobUF0dHJpYnNbY3RdLmtpbmQpIHsKLSAgICAgICAgY2FzZSBSU19LSU5EX1BPU0lUSU9OOgotICAgICAgICAgICAgLy9sb2dBdHRyaWIoUE9TSVRJT04pOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFZlcnRleFBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX05PUk1BTDoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKE5PUk1BTCk7Ci0gICAgICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgICAgICAgICByc0Fzc2VydChtQXR0cmlic1tjdF0uc2l6ZSA9PSAzKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xOb3JtYWxQb2ludGVyKG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltQXR0cmlic1tjdF0ub2Zmc2V0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNfS0lORF9DT0xPUjoKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKENPTE9SKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbENvbG9yUG9pbnRlcihtQXR0cmlic1tjdF0uc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTX0tJTkRfVEVYVFVSRToKLSAgICAgICAgICAgIC8vbG9nQXR0cmliKFRFWFRVUkUpOwotICAgICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotICAgICAgICAgICAgZ2xUZXhDb29yZFBvaW50ZXIobUF0dHJpYnNbY3RdLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU19LSU5EX1BPSU5UX1NJWkU6Ci0gICAgICAgICAgICAvL2xvZ0F0dHJpYihQT0lOVF9TSVpFKTsKLSAgICAgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpOwotICAgICAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUF0dHJpYnNbY3RdLmJ1ZmZlcik7Ci0gICAgICAgICAgICBnbFBvaW50U2l6ZVBvaW50ZXJPRVMobUF0dHJpYnNbY3RdLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1BdHRyaWJzW2N0XS5vZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJzQXNzZXJ0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTCIpOwotfQotCiB2b2lkIFZlcnRleEFycmF5OjpzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKnN0YXRlLCBTaGFkZXJDYWNoZSAqc2MpIGNvbnN0CiB7CiAgICAgcnNjLT5jaGVja0Vycm9yKCJWZXJ0ZXhBcnJheTo6c2V0dXBHTDIgc3RhcnQiKTsKLSAgICBmb3IgKHVpbnQzMl90IGN0PTE7IGN0IDw9IHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50OyBjdCsrKSB7CisgICAgZm9yICh1aW50MzJfdCBjdD0xOyBjdCA8PSAweGYvKnN0YXRlLT5tTGFzdEVuYWJsZUNvdW50Ki87IGN0KyspIHsKICAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoY3QpOwogICAgIH0KIAogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIGRpc2FibGVkIik7CiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1Db3VudDsgY3QrKykgewotICAgICAgICB1aW50MzJfdCBzbG90ID0gMDsKKyAgICAgICAgaW50MzJfdCBzbG90ID0gMDsKKworICAgICAgICBpZiAobUF0dHJpYnNbY3RdLm5hbWVbMF0gPT0gJyMnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzYy0+aXNVc2VyVmVydGV4UHJvZ3JhbSgpKSB7CiAgICAgICAgICAgICBzbG90ID0gc2MtPnZ0eEF0dHJpYlNsb3QoY3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5raW5kID09IFJTX0tJTkRfVVNFUikgeworICAgICAgICAgICAgaWYgKG1BdHRyaWJzW2N0XS5uYW1lID09ICJwb3NpdGlvbiIpIHsKKyAgICAgICAgICAgICAgICBzbG90ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYnNbY3RdLm5hbWUgPT0gImNvbG9yIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAibm9ybWFsIikgeworICAgICAgICAgICAgICAgIHNsb3QgPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQXR0cmlic1tjdF0ubmFtZSA9PSAidGV4dHVyZTAiKSB7CisgICAgICAgICAgICAgICAgc2xvdCA9IDM7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xvdCA9IHNjLT52dHhBdHRyaWJTbG90KG1BdHRyaWJzW2N0XS5raW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZihzbG90IDwgMCkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvL2xvZ0F0dHJpYihjdCwgc2xvdCk7CiAgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoc2xvdCk7CiAgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1BdHRyaWJzW2N0XS5idWZmZXIpOwotCiAgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihzbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0udHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJzW2N0XS5ub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnNbY3RdLnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbUF0dHJpYnNbY3RdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0cmlic1tjdF0ucHRyICsgbUF0dHJpYnNbY3RdLm9mZnNldCk7CiAgICAgfQogICAgIHN0YXRlLT5tTGFzdEVuYWJsZUNvdW50ID0gbUNvdW50OwogICAgIHJzYy0+Y2hlY2tFcnJvcigiVmVydGV4QXJyYXk6OnNldHVwR0wyIGRvbmUiKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNWZXJ0ZXhBcnJheS5oIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKaW5kZXggMzkwNGNiNi4uN2M2MDliMiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKKysrIGIvbGlicy9ycy9yc1ZlcnRleEFycmF5LmgKQEAgLTM3LDEzICszNywxMyBAQAogICAgIGNsYXNzIEF0dHJpYiB7CiAgICAgcHVibGljOgogICAgICAgICB1aW50MzJfdCBidWZmZXI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBwdHI7CiAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAgICAgdWludDMyX3Qgc3RyaWRlOwogICAgICAgICBib29sIG5vcm1hbGl6ZWQ7CiAgICAgICAgIFN0cmluZzggbmFtZTsKLSAgICAgICAgUnNEYXRhS2luZCBraW5kOwogCiAgICAgICAgIEF0dHJpYigpOwogICAgICAgICB2b2lkIHNldChjb25zdCBBdHRyaWIgJik7CkBAIC01Miw5ICs1MiwxOCBAQAogCiAKICAgICB2b2lkIGNsZWFyQWxsKCk7Ci0gICAgdm9pZCBzZXRBY3RpdmVCdWZmZXIodWludDMyX3QgaWQpIHttQWN0aXZlQnVmZmVyID0gaWQ7fQotICAgIHZvaWQgYWRkVXNlcihjb25zdCBBdHRyaWIgJiwgdWludDMyX3Qgc3RyaWRlKTsKLSAgICB2b2lkIGFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIFJzRGF0YUtpbmQga2luZCwgYm9vbCBub3JtYWxpemVkLCB1aW50MzJfdCBvZmZzZXQpOworICAgIHZvaWQgc2V0QWN0aXZlQnVmZmVyKHVpbnQzMl90IGlkKSB7CisgICAgICAgIG1BY3RpdmVCdWZmZXIgPSBpZDsKKyAgICAgICAgbUFjdGl2ZVBvaW50ZXIgPSBOVUxMOworICAgIH0KKyAgICB2b2lkIHNldEFjdGl2ZUJ1ZmZlcihjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbUFjdGl2ZUJ1ZmZlciA9IDA7CisgICAgICAgIG1BY3RpdmVQb2ludGVyID0gKGNvbnN0IHVpbnQ4X3QgKilwdHI7CisgICAgfQorCisgICAgdm9pZCBhZGQoY29uc3QgQXR0cmliICYsIHVpbnQzMl90IHN0cmlkZSk7CisgICAgLy92b2lkIGFkZExlZ2FjeSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0KTsKKyAgICB2b2lkIGFkZCh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBzdHJpZGUsIGJvb2wgbm9ybWFsaXplZCwgdWludDMyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIHZvaWQgc2V0dXBHTChjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKikgY29uc3Q7CiAgICAgdm9pZCBzZXR1cEdMMihjb25zdCBDb250ZXh0ICpyc2MsIGNsYXNzIFZlcnRleEFycmF5U3RhdGUgKiwgU2hhZGVyQ2FjaGUgKikgY29uc3Q7CkBAIC02Myw2ICs3Miw3IEBACiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBjbGVhcih1aW50MzJfdCBpbmRleCk7CiAgICAgdWludDMyX3QgbUFjdGl2ZUJ1ZmZlcjsKKyAgICBjb25zdCB1aW50OF90ICogbUFjdGl2ZVBvaW50ZXI7CiAgICAgdWludDMyX3QgbUNvdW50OwogCiAgICAgQXR0cmliIG1BdHRyaWJzW1JTX01BWF9BVFRSSUJTXTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAgYi9saWJzL3JzL3JzZ19TY3JpcHRKYXZhQ2xhc3MuY3BwCmluZGV4IGNlZTlmNTIuLjAxNjliOTggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNnX1NjcmlwdEphdmFDbGFzcy5jcHAKKysrIGIvbGlicy9ycy9yc2dfU2NyaXB0SmF2YUNsYXNzLmNwcApAQCAtNyw4ICs3LDEyIEBACiBzdHJ1Y3QgRWxlbWVudDsKIAogc3RydWN0IEVsZW1lbnRGaWVsZCB7CisgICAgLy8gQW4gRWxlbWVudCBGaWVsZCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIEVsZW1lbnQgd2l0aCBhIG5hbWUgYXNzaWduZWQuCisKICAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIEVsZW1lbnQgKmU7CisKKwogICAgIEVsZW1lbnRGaWVsZChjb25zdCBjaGFyICpuLCBFbGVtZW50ICpfZSkgewogICAgICAgICBuYW1lID0gbjsKICAgICAgICAgZSA9IF9lOwpAQCAtMjAsMTIgKzI0LDIxIEBACiB9OwogCiBzdHJ1Y3QgRWxlbWVudCB7CisgICAgLy8gQW4gRWxlbWVudCBjYW4gdGFrZSBvbmUgb2YgdHdvIGZvcm1zLgorICAgIC8vIDE6IEJhc2ljLiAgSXQgY29udGFpbnMgYSBzaW5nbGUgYmFzaWMgdHlwZSBhbmQgdmVjdG9yIHNpemUuCisgICAgLy8gMjogQ29tcGxleC4gIEl0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWVsZHMgd2l0aCBuYW1lcy4gIEVhY2ggZmllbGQKKyAgICAvLyB3aWxsIGluIHR1cm4gYmUgYW5vdGhlciBlbGVtZW50LgorCiAgICAgRWxlbWVudEZpZWxkICpmaWVsZHM7Ci0gICAgc2l6ZV90IGZpZWxkQ291bnQ7CisgICAgc2l6ZV90IGZpZWxkQ291bnQ7ICAvLyBJZiBmaWVsZCBjb3VudCBpcyAwLCB0aGUgZWxlbWVudCBpcyBhIEJhc2ljIHR5cGUuCiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBib29sIGdlbmVyYXRlZDsKIAorICAgIC8vIFRoZSBiYXNpYyBkYXRhIHR5cGUgZnJvbSBSZW5kZXJTY3JpcHQuaAogICAgIFJzRGF0YVR5cGUgY29tcFR5cGU7CisKKyAgICAvLyBUaGUgdmVjdG9yIHNpemUgb2YgdGhlIGRhdGEgdHlwZSBmb3IgZmxvYXQyLCBmbG9hdDMsIC4uLi4KKyAgICAvLyBBbGxvd2VkIHNpemVzIGFyZSAyLDMsNCw4LDE2CiAgICAgdWludDMyX3QgY29tcFZlY3RvclNpemU7CiAKICAgICBFbGVtZW50KCkgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX2NsLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NDRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jbC5yc2gKQEAgLTAsMCArMSw3ODUgQEAKKyNpZm5kZWYgX19SU19DTF9SU0hfXworI2RlZmluZSBfX1JTX0NMX1JTSF9fCisKKyNkZWZpbmUgTV9QSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4OGYgICAvKiBwaSAqLworCisKKy8vIENvbnZlcnNpb25zCisjZGVmaW5lIENWVF9GVU5DXzIodHlwZW91dCwgdHlwZWluKSBcCitzdGF0aWMgdHlwZW91dCMjMiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjMih0eXBlaW4jIzIgdikgeyBcCisgICAgdHlwZW91dCMjMiByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55fTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyB0eXBlb3V0IyMzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvbnZlcnRfIyN0eXBlb3V0IyMzKHR5cGVpbiMjMyB2KSB7IFwKKyAgICB0eXBlb3V0IyMzIHIgPSB7KHR5cGVvdXQpdi54LCAodHlwZW91dCl2LnksICh0eXBlb3V0KXYuen07IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgdHlwZW91dCMjNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb252ZXJ0XyMjdHlwZW91dCMjNCh0eXBlaW4jIzQgdikgeyBcCisgICAgdHlwZW91dCMjNCByID0geyh0eXBlb3V0KXYueCwgKHR5cGVvdXQpdi55LCAodHlwZW91dCl2LnosICh0eXBlb3V0KXYud307IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIENWVF9GVU5DKHR5cGUpICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCB1Y2hhcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgY2hhcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgdXNob3J0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBzaG9ydCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWVF9GVU5DXzIodHlwZSwgaW50KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCB1aW50KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZUX0ZVTkNfMih0eXBlLCBmbG9hdCkKKworQ1ZUX0ZVTkMoY2hhcikKK0NWVF9GVU5DKHVjaGFyKQorQ1ZUX0ZVTkMoc2hvcnQpCitDVlRfRlVOQyh1c2hvcnQpCitDVlRfRlVOQyhpbnQpCitDVlRfRlVOQyh1aW50KQorQ1ZUX0ZVTkMoZmxvYXQpCisKKworCisvLyBGbG9hdCBvcHMsIDYuMTEuMgorCisjZGVmaW5lIERFRl9GVU5DXzEoZm5jKSBcCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDIgdikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModi54KTsgXAorICAgIHIueSA9IGZuYyh2LnkpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQzIHYpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHIueiA9IGZuYyh2LnopOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYpIHsgXAorICAgIGZsb2F0NCByOyBcCisgICAgci54ID0gZm5jKHYueCk7IFwKKyAgICByLnkgPSBmbmModi55KTsgXAorICAgIHIueiA9IGZuYyh2LnopOyBcCisgICAgci53ID0gZm5jKHYudyk7IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIERFRl9GVU5DXzIoZm5jKSBcCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDIgdjEsIGZsb2F0MiB2MikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDMgdjEsIGZsb2F0MyB2MikgeyBcCisgICAgZmxvYXQzIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIueik7IFwKKyAgICByZXR1cm4gcjsgXAorfSBcCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZuYyhmbG9hdDQgdjEsIGZsb2F0NCB2MikgeyBcCisgICAgZmxvYXQ0IHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIueCk7IFwKKyAgICByLnkgPSBmbmModjEueSwgdjIueSk7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIueik7IFwKKyAgICByLncgPSBmbmModjEudywgdjIueik7IFwKKyAgICByZXR1cm4gcjsgXAorfQorCisjZGVmaW5lIERFRl9GVU5DXzJGKGZuYykgXAorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQyIHYxLCBmbG9hdCB2MikgeyBcCisgICAgZmxvYXQyIHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyKTsgXAorICAgIHJldHVybiByOyBcCit9IFwKK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm5jKGZsb2F0MyB2MSwgZmxvYXQgdjIpIHsgXAorICAgIGZsb2F0MyByOyBcCisgICAgci54ID0gZm5jKHYxLngsIHYyKTsgXAorICAgIHIueSA9IGZuYyh2MS55LCB2Mik7IFwKKyAgICByLnogPSBmbmModjEueiwgdjIpOyBcCisgICAgcmV0dXJuIHI7IFwKK30gXAorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbmMoZmxvYXQ0IHYxLCBmbG9hdCB2MikgeyBcCisgICAgZmxvYXQ0IHI7IFwKKyAgICByLnggPSBmbmModjEueCwgdjIpOyBcCisgICAgci55ID0gZm5jKHYxLnksIHYyKTsgXAorICAgIHIueiA9IGZuYyh2MS56LCB2Mik7IFwKKyAgICByLncgPSBmbmModjEudywgdjIpOyBcCisgICAgcmV0dXJuIHI7IFwKK30KKworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdCk7CitERUZfRlVOQ18xKGFjb3MpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zaChmbG9hdCk7CitERUZfRlVOQ18xKGFjb3NoKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvc3BpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gYWNvcyh2KSAvIE1fUEk7Cit9CitERUZfRlVOQ18xKGFjb3NwaSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQpOworREVGX0ZVTkNfMShhc2luKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbmgoZmxvYXQpOworREVGX0ZVTkNfMShhc2luaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGFzaW4odikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhc2lucGkpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0KTsKK0RFRl9GVU5DXzEoYXRhbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGF0YW4yKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbmgoZmxvYXQpOworREVGX0ZVTkNfMShhdGFuaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW5waShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGF0YW4odikgLyBNX1BJOworfQorREVGX0ZVTkNfMShhdGFucGkpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMnBpKGZsb2F0IHksIGZsb2F0IHgpIHsKKyAgICByZXR1cm4gYXRhbjIoeSwgeCkgLyBNX1BJOworfQorREVGX0ZVTkNfMihhdGFuMnBpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2JydChmbG9hdCk7CitERUZfRlVOQ18xKGNicnQpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0KTsKK0RFRl9GVU5DXzEoY2VpbCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGNvcHlzaWduKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0KTsKK0RFRl9GVU5DXzEoY29zKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zaChmbG9hdCk7CitERUZfRlVOQ18xKGNvc2gpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3NwaShmbG9hdCB2KSB7CisgICAgcmV0dXJuIGNvcyh2ICogTV9QSSk7Cit9CitERUZfRlVOQ18xKGNvc3BpKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXJmYyhmbG9hdCk7CitERUZfRlVOQ18xKGVyZmMpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBlcmYoZmxvYXQpOworREVGX0ZVTkNfMShlcmYpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOworREVGX0ZVTkNfMShleHApCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwMikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDEwKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gcG93KDEwLmYsIHYpOworfQorREVGX0ZVTkNfMShleHAxMCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cG0xKGZsb2F0KTsKK0RFRl9GVU5DXzEoZXhwbTEpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKK0RFRl9GVU5DXzEoZmFicykKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZkaW0oZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoZmRpbSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKK0RFRl9GVU5DXzEoZmxvb3IpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYShmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1hKGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWEoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtYXgpOworREVGX0ZVTkNfMkYoZm1heCk7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtaW4pOworREVGX0ZVTkNfMkYoZm1pbik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7CitERUZfRlVOQ18yKGZtb2QpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdCB2LCBmbG9hdCAqaXB0cikgeworICAgIGludCBpID0gKGludClmbG9vcih2KTsKKyAgICBpcHRyWzBdID0gaTsKKyAgICByZXR1cm4gZm1pbih2IC0gaSwgMHgxLmZmZmZmZXAtMWYpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmFjdChmbG9hdDIgdiwgZmxvYXQyICppcHRyKSB7CisgICAgZmxvYXQgdFsyXTsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBmcmFjdCh2LngsICZ0WzBdKTsKKyAgICByLnkgPSBmcmFjdCh2LnksICZ0WzFdKTsKKyAgICBpcHRyWzBdID0gdFswXTsKKyAgICBpcHRyWzFdID0gdFsxXTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJhY3QoZmxvYXQzIHYsIGZsb2F0MyAqaXB0cikgeworICAgIGZsb2F0IHRbM107CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gZnJhY3Qodi54LCAmdFswXSk7CisgICAgci55ID0gZnJhY3Qodi55LCAmdFsxXSk7CisgICAgci56ID0gZnJhY3Qodi56LCAmdFsyXSk7CisgICAgaXB0clswXSA9IHRbMF07CisgICAgaXB0clsxXSA9IHRbMV07CisgICAgaXB0clsyXSA9IHRbMl07CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyYWN0KGZsb2F0NCB2LCBmbG9hdDQgKmlwdHIpIHsKKyAgICBmbG9hdCB0WzRdOworICAgIGZsb2F0NCByOworICAgIHIueCA9IGZyYWN0KHYueCwgJnRbMF0pOworICAgIHIueSA9IGZyYWN0KHYueSwgJnRbMV0pOworICAgIHIueiA9IGZyYWN0KHYueiwgJnRbMl0pOworICAgIHIudyA9IGZyYWN0KHYudywgJnRbM10pOworICAgIGlwdHJbMF0gPSB0WzBdOworICAgIGlwdHJbMV0gPSB0WzFdOworICAgIGlwdHJbMl0gPSB0WzJdOworICAgIGlwdHJbM10gPSB0WzNdOworICAgIHJldHVybiByOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQsIGZsb2F0ICopOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmcmV4cChmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZnJleHAoZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZyZXhwKGZsb2F0NCwgZmxvYXQ0ICopOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgaHlwb3QoZmxvYXQsIGZsb2F0KTsKK0RFRl9GVU5DXzIoaHlwb3QpCisKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgaWxvZ2IoZmxvYXQpOworREVGX0ZVTkNfMShpbG9nYikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0LCBpbnQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDIsIGludDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDMsIGludDMpOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDQsIGludDQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZGV4cChmbG9hdDIsIGludCk7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxkZXhwKGZsb2F0MywgaW50KTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGRleHAoZmxvYXQ0LCBpbnQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0KTsKK0RFRl9GVU5DXzEobGdhbW1hKQorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxnYW1tYShmbG9hdDIsIGZsb2F0MiAqKTsKK2V4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGdhbW1hKGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsZ2FtbWEoZmxvYXQ0LCBmbG9hdDQgKik7CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQpOworREVGX0ZVTkNfMShsb2cpCisKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0KTsKK0RFRl9GVU5DXzEobG9nMTApCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gbG9nMTAodikgLyBsb2cxMCgyLmYpOworfQorREVGX0ZVTkNfMShsb2cyKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMXAoZmxvYXQpOworREVGX0ZVTkNfMShsb2cxcCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZ2IoZmxvYXQpOworREVGX0ZVTkNfMShsb2diKQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYWQoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1hZChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWFkKGZsb2F0NCwgZmxvYXQ0LCBmbG9hdDQpOworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbW9kZihmbG9hdCwgZmxvYXQgKik7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQzLCBmbG9hdDMgKik7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1vZGYoZmxvYXQ0LCBmbG9hdDQgKik7CisKKy8vZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5hbih1aW50KTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5leHRhZnRlcihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihuZXh0YWZ0ZXIpCisKK0RFRl9GVU5DXzIocG93KQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdCB2LCBpbnQgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0KXApOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3duKGZsb2F0MiB2LCBpbnQyIHApIHsKKyAgICByZXR1cm4gcG93KHYsIChmbG9hdDIpcCk7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd24oZmxvYXQzIHYsIGludDMgcCkgeworICAgIHJldHVybiBwb3codiwgKGZsb2F0MylwKTsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93bihmbG9hdDQgdiwgaW50NCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCAoZmxvYXQ0KXApOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdCB2LCBmbG9hdCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93cihmbG9hdDIgdiwgZmxvYXQyIHApIHsKKyAgICByZXR1cm4gcG93KHYsIHApOworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3dyKGZsb2F0MyB2LCBmbG9hdDMgcCkgeworICAgIHJldHVybiBwb3codiwgcCk7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvd3IoZmxvYXQ0IHYsIGZsb2F0NCBwKSB7CisgICAgcmV0dXJuIHBvdyh2LCBwKTsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbWFpbmRlcihmbG9hdCwgZmxvYXQpOworREVGX0ZVTkNfMihyZW1haW5kZXIpCisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQsIGZsb2F0LCBmbG9hdCAqKTsKK2V4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmVtcXVvKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIgKik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJlbXF1byhmbG9hdDMsIGZsb2F0MywgZmxvYXQzICopOworZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByZW1xdW8oZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCAqKTsKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQpOworREVGX0ZVTkNfMShyaW50KQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm9vdG4oZmxvYXQgdiwgaW50IHIpIHsKKyAgICByZXR1cm4gcG93KHYsIDEuZiAvIHIpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDIgdiwgaW50MiByKSB7CisgICAgZmxvYXQyIHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnl9OworICAgIHJldHVybiBwb3codiwgdCk7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvb3RuKGZsb2F0MyB2LCBpbnQzIHIpIHsKKyAgICBmbG9hdDMgdCA9IHsxLmYgLyByLngsIDEuZiAvIHIueSwgMS5mIC8gci56fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByb290bihmbG9hdDQgdiwgaW50NCByKSB7CisgICAgZmxvYXQ0IHQgPSB7MS5mIC8gci54LCAxLmYgLyByLnksIDEuZiAvIHIueiwgMS5mIC8gci53fTsKKyAgICByZXR1cm4gcG93KHYsIHQpOworfQorCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQpOworREVGX0ZVTkNfMShyb3VuZCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQpOworLypzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQgdikgeworICAgIHJldHVybiAxLmYgLyBzcXJ0KHYpOworfQorREVGX0ZVTkNfMShyc3FydCkqLworCitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0KTsKK0RFRl9GVU5DXzEoc2luKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luY29zKGZsb2F0IHYsIGZsb2F0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDIgdiwgZmxvYXQyICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDMgdiwgZmxvYXQzICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbmNvcyhmbG9hdDQgdiwgZmxvYXQ0ICpjb3NwdHIpIHsKKyAgICAqY29zcHRyID0gY29zKHYpOworICAgIHJldHVybiBzaW4odik7Cit9CisKK2V4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW5oKGZsb2F0KTsKK0RFRl9GVU5DXzEoc2luaCkKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbnBpKGZsb2F0IHYpIHsKKyAgICByZXR1cm4gc2luKHYgKiBNX1BJKTsKK30KK0RFRl9GVU5DXzEoc2lucGkpCisKK0RFRl9GVU5DXzEoc3FydCkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdCk7CitERUZfRlVOQ18xKHRhbikKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbmgoZmxvYXQpOworREVGX0ZVTkNfMSh0YW5oKQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFucGkoZmxvYXQgdikgeworICAgIHJldHVybiB0YW4odiAqIE1fUEkpOworfQorREVGX0ZVTkNfMSh0YW5waSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRnYW1tYShmbG9hdCk7CitERUZfRlVOQ18xKHRnYW1tYSkKKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKK0RFRl9GVU5DXzEodHJ1bmMpCisKKy8vIEludCBvcHMgKHBhcnRpYWwpLCA2LjExLjMKK2V4dGVybiB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQpOworZXh0ZXJuIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoc2hvcnQpOworZXh0ZXJuIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhjaGFyKTsKKworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVpbnQpOworZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHooaW50KTsKK2V4dGVybiB1c2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHVzaG9ydCk7CitleHRlcm4gc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KHNob3J0KTsKK2V4dGVybiB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbHoodWNoYXIpOworZXh0ZXJuIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2x6KGNoYXIpOworCitzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odWludCB2MSwgdWludCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGludCB2MSwgaW50IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odXNob3J0IHYxLCB1c2hvcnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgc2hvcnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKHNob3J0IHYxLCBzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA8IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyB1Y2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4odWNoYXIgdjEsIHVjaGFyIHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGNoYXIgdjEsIGNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPCB2MiA/IHYxIDogdjI7Cit9CisKK3N0YXRpYyB1aW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1aW50IHYxLCB1aW50IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoaW50IHYxLCBpbnQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1c2hvcnQgdjEsIHVzaG9ydCB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KK3N0YXRpYyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoc2hvcnQgdjEsIHNob3J0IHYyKSB7CisgICAgcmV0dXJuIHYxID4gdjIgPyB2MSA6IHYyOworfQorc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heCh1Y2hhciB2MSwgdWNoYXIgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgY2hhciBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoY2hhciB2MSwgY2hhciB2MikgeworICAgIHJldHVybiB2MSA+IHYyID8gdjEgOiB2MjsKK30KKworCisKKworLy8gNi4xMS40CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdCBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIgYW1vdW50LCBmbG9hdDIgbG93LCBmbG9hdDIgaGlnaCkgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93LnggPyBsb3cueCA6IChhbW91bnQueCA+IGhpZ2gueCA/IGhpZ2gueCA6IGFtb3VudC54KTsKKyAgICByLnkgPSBhbW91bnQueSA8IGxvdy55ID8gbG93LnkgOiAoYW1vdW50LnkgPiBoaWdoLnkgPyBoaWdoLnkgOiBhbW91bnQueSk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MyBhbW91bnQsIGZsb2F0MyBsb3csIGZsb2F0MyBoaWdoKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cueCA/IGxvdy54IDogKGFtb3VudC54ID4gaGlnaC54ID8gaGlnaC54IDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93LnkgPyBsb3cueSA6IChhbW91bnQueSA+IGhpZ2gueSA/IGhpZ2gueSA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdy56ID8gbG93LnogOiAoYW1vdW50LnogPiBoaWdoLnogPyBoaWdoLnogOiBhbW91bnQueik7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0NCBhbW91bnQsIGZsb2F0NCBsb3csIGZsb2F0NCBoaWdoKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gYW1vdW50LnggPCBsb3cueCA/IGxvdy54IDogKGFtb3VudC54ID4gaGlnaC54ID8gaGlnaC54IDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93LnkgPyBsb3cueSA6IChhbW91bnQueSA+IGhpZ2gueSA/IGhpZ2gueSA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdy56ID8gbG93LnogOiAoYW1vdW50LnogPiBoaWdoLnogPyBoaWdoLnogOiBhbW91bnQueik7CisgICAgci53ID0gYW1vdW50LncgPCBsb3cudyA/IGxvdy53IDogKGFtb3VudC53ID4gaGlnaC53ID8gaGlnaC53IDogYW1vdW50LncpOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDIgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MyBhbW91bnQsIGZsb2F0IGxvdywgZmxvYXQgaGlnaCkgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IGFtb3VudC54IDwgbG93ID8gbG93IDogKGFtb3VudC54ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueCk7CisgICAgci55ID0gYW1vdW50LnkgPCBsb3cgPyBsb3cgOiAoYW1vdW50LnkgPiBoaWdoID8gaGlnaCA6IGFtb3VudC55KTsKKyAgICByLnogPSBhbW91bnQueiA8IGxvdyA/IGxvdyA6IChhbW91bnQueiA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LnopOworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQgYW1vdW50LCBmbG9hdCBsb3csIGZsb2F0IGhpZ2gpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSBhbW91bnQueCA8IGxvdyA/IGxvdyA6IChhbW91bnQueCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LngpOworICAgIHIueSA9IGFtb3VudC55IDwgbG93ID8gbG93IDogKGFtb3VudC55ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQueSk7CisgICAgci56ID0gYW1vdW50LnogPCBsb3cgPyBsb3cgOiAoYW1vdW50LnogPiBoaWdoID8gaGlnaCA6IGFtb3VudC56KTsKKyAgICByLncgPSBhbW91bnQudyA8IGxvdyA/IGxvdyA6IChhbW91bnQudyA+IGhpZ2ggPyBoaWdoIDogYW1vdW50LncpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCByYWRpYW5zKSB7CisgICAgcmV0dXJuIHJhZGlhbnMgKiAoMTgwLmYgLyBNX1BJKTsKK30KK0RFRl9GVU5DXzEoZGVncmVlcykKKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCB2MSwgZmxvYXQgdjIpIHsKKyAgICByZXR1cm4gdjEgPiB2MiA/IHYxIDogdjI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDIgdjEsIGZsb2F0MiB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MyB2MSwgZmxvYXQzIHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA+IHYyLnggPyB2MS54IDogdjIueDsKKyAgICByLnkgPSB2MS55ID4gdjIueSA/IHYxLnkgOiB2Mi55OworICAgIHIueiA9IHYxLnogPiB2Mi56ID8gdjEueiA6IHYyLno7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDQgdjEsIGZsb2F0NCB2MikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9IHYxLnggPiB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA+IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56ID4gdjIueiA/IHYxLnogOiB2Mi56OworICAgIHIudyA9IHYxLncgPiB2Mi53ID8gdjEudyA6IHYyLnc7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdDIgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQyIHI7CisgICAgci54ID0gdjEueCA+IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPiB2MiA/IHYxLnkgOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MyB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSB2MS54ID4gdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA+IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPiB2MiA/IHYxLnogOiB2MjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0NCB2MSwgZmxvYXQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54ID4gdjIgPyB2MS54IDogdjI7CisgICAgci55ID0gdjEueSA+IHYyID8gdjEueSA6IHYyOworICAgIHIueiA9IHYxLnogPiB2MiA/IHYxLnogOiB2MjsKKyAgICByLncgPSB2MS53ID4gdjIgPyB2MS53IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQgdjEsIGZsb2F0IHYyKSB7CisgICAgcmV0dXJuIHYxIDwgdjIgPyB2MSA6IHYyOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyIHYxLCBmbG9hdDIgdjIpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMgdjEsIGZsb2F0MyB2MikgeworICAgIGZsb2F0MyByOworICAgIHIueCA9IHYxLnggPCB2Mi54ID8gdjEueCA6IHYyLng7CisgICAgci55ID0gdjEueSA8IHYyLnkgPyB2MS55IDogdjIueTsKKyAgICByLnogPSB2MS56IDwgdjIueiA/IHYxLnogOiB2Mi56OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQ0IHYxLCBmbG9hdDQgdjIpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSB2MS54IDwgdjIueCA/IHYxLnggOiB2Mi54OworICAgIHIueSA9IHYxLnkgPCB2Mi55ID8gdjEueSA6IHYyLnk7CisgICAgci56ID0gdjEueiA8IHYyLnogPyB2MS56IDogdjIuejsKKyAgICByLncgPSB2MS53IDwgdjIudyA/IHYxLncgOiB2Mi53OworICAgIHJldHVybiByOworfQorc3RhdGljIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQyIHYxLCBmbG9hdCB2MikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9IHYxLnggPCB2MiA/IHYxLnggOiB2MjsKKyAgICByLnkgPSB2MS55IDwgdjIgPyB2MS55IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQzIHI7CisgICAgci54ID0gdjEueCA8IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPCB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56IDwgdjIgPyB2MS56IDogdjI7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQgdjEsIGZsb2F0IHYyKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gdjEueCA8IHYyID8gdjEueCA6IHYyOworICAgIHIueSA9IHYxLnkgPCB2MiA/IHYxLnkgOiB2MjsKKyAgICByLnogPSB2MS56IDwgdjIgPyB2MS56IDogdjI7CisgICAgci53ID0gdjEudyA8IHYyID8gdjEudyA6IHYyOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0IHN0YXJ0LCBmbG9hdCBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MiBzdGFydCwgZmxvYXQyIHN0b3AsIGZsb2F0MiBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MyBzdGFydCwgZmxvYXQzIHN0b3AsIGZsb2F0MyBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCBzdGFydCwgZmxvYXQ0IHN0b3AsIGZsb2F0NCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MiBzdGFydCwgZmxvYXQyIHN0b3AsIGZsb2F0IGFtb3VudCkgeworICAgIHJldHVybiBzdGFydCArIChzdG9wIC0gc3RhcnQpICogYW1vdW50OworfQorc3RhdGljIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzIHN0YXJ0LCBmbG9hdDMgc3RvcCwgZmxvYXQgYW1vdW50KSB7CisgICAgcmV0dXJuIHN0YXJ0ICsgKHN0b3AgLSBzdGFydCkgKiBhbW91bnQ7Cit9CitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDQgc3RhcnQsIGZsb2F0NCBzdG9wLCBmbG9hdCBhbW91bnQpIHsKKyAgICByZXR1cm4gc3RhcnQgKyAoc3RvcCAtIHN0YXJ0KSAqIGFtb3VudDsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQgZGVncmVlcykgeworICAgIHJldHVybiBkZWdyZWVzICogKE1fUEkgLyAxODAuZik7Cit9CitERUZfRlVOQ18xKHJhZGlhbnMpCisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzdGVwKGZsb2F0IGVkZ2UsIGZsb2F0IHYpIHsKKyAgICByZXR1cm4gKHYgPCBlZGdlKSA/IDAuZiA6IDEuZjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQyIHYpIHsKKyAgICBmbG9hdDIgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDMgZWRnZSwgZmxvYXQzIHYpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodi56IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDQgZWRnZSwgZmxvYXQ0IHYpIHsKKyAgICBmbG9hdDQgcjsKKyAgICByLnggPSAodi54IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodi55IDwgZWRnZS55KSA/IDAuZiA6IDEuZjsKKyAgICByLnogPSAodi56IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByLncgPSAodi53IDwgZWRnZS53KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDIgZWRnZSwgZmxvYXQgdikgeworICAgIGZsb2F0MiByOworICAgIHIueCA9ICh2IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodiA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgcmV0dXJuIHI7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHN0ZXAoZmxvYXQzIGVkZ2UsIGZsb2F0IHYpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSAodiA8IGVkZ2UueCkgPyAwLmYgOiAxLmY7CisgICAgci55ID0gKHYgPCBlZGdlLnkpID8gMC5mIDogMS5mOworICAgIHIueiA9ICh2IDwgZWRnZS56KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3RlcChmbG9hdDQgZWRnZSwgZmxvYXQgdikgeworICAgIGZsb2F0NCByOworICAgIHIueCA9ICh2IDwgZWRnZS54KSA/IDAuZiA6IDEuZjsKKyAgICByLnkgPSAodiA8IGVkZ2UueSkgPyAwLmYgOiAxLmY7CisgICAgci56ID0gKHYgPCBlZGdlLnopID8gMC5mIDogMS5mOworICAgIHIudyA9ICh2IDwgZWRnZS53KSA/IDAuZiA6IDEuZjsKKyAgICByZXR1cm4gcjsKK30KKworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQyLCBmbG9hdDIsIGZsb2F0Mik7CitleHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQzLCBmbG9hdDMsIGZsb2F0Myk7CitleHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7CitleHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNtb290aHN0ZXAoZmxvYXQsIGZsb2F0LCBmbG9hdDIpOworZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzbW9vdGhzdGVwKGZsb2F0LCBmbG9hdCwgZmxvYXQzKTsKK2V4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc21vb3Roc3RlcChmbG9hdCwgZmxvYXQsIGZsb2F0NCk7CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0IHYpIHsKKyAgICBpZiAodiA+IDApIHJldHVybiAxLmY7CisgICAgaWYgKHYgPCAwKSByZXR1cm4gLTEuZjsKKyAgICByZXR1cm4gdjsKK30KK0RFRl9GVU5DXzEoc2lnbikKKworLy8gNi4xMS41CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNyb3NzKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpIHsKKyAgICBmbG9hdDMgcjsKKyAgICByLnggPSBsaHMueSAqIHJocy56ICAtIGxocy56ICogcmhzLnk7CisgICAgci55ID0gbGhzLnogKiByaHMueCAgLSBsaHMueCAqIHJocy56OworICAgIHIueiA9IGxocy54ICogcmhzLnkgIC0gbGhzLnkgKiByaHMueDsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjcm9zcyhmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKSB7CisgICAgZmxvYXQ0IHI7CisgICAgci54ID0gbGhzLnkgKiByaHMueiAgLSBsaHMueiAqIHJocy55OworICAgIHIueSA9IGxocy56ICogcmhzLnggIC0gbGhzLnggKiByaHMuejsKKyAgICByLnogPSBsaHMueCAqIHJocy55ICAtIGxocy55ICogcmhzLng7CisgICAgci53ID0gMC5mOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZG90KGZsb2F0IGxocywgZmxvYXQgcmhzKSB7CisgICAgcmV0dXJuIGxocyAqIHJoczsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQyIGxocywgZmxvYXQyIHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55OworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRvdChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKSB7CisgICAgcmV0dXJuIGxocy54KnJocy54ICsgbGhzLnkqcmhzLnkgKyBsaHMueipyaHMuejsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkb3QoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIHJldHVybiBsaHMueCpyaHMueCArIGxocy55KnJocy55ICsgbGhzLnoqcmhzLnogKyBsaHMudypyaHMudzsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdCB2KSB7CisgICAgcmV0dXJuIHY7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0MiB2KSB7CisgICAgcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxlbmd0aChmbG9hdDMgdikgeworICAgIHJldHVybiBzcXJ0KHYueCp2LnggKyB2Lnkqdi55ICsgdi56KnYueik7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbGVuZ3RoKGZsb2F0NCB2KSB7CisgICAgcmV0dXJuIHNxcnQodi54KnYueCArIHYueSp2LnkgKyB2Lnoqdi56ICsgdi53KnYudyk7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdCBsaHMsIGZsb2F0IHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkaXN0YW5jZShmbG9hdDIgbGhzLCBmbG9hdDIgcmhzKSB7CisgICAgcmV0dXJuIGxlbmd0aChsaHMgLSByaHMpOworfQorc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRpc3RhbmNlKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpIHsKKyAgICByZXR1cm4gbGVuZ3RoKGxocyAtIHJocyk7Cit9CitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGlzdGFuY2UoZmxvYXQ0IGxocywgZmxvYXQ0IHJocykgeworICAgIHJldHVybiBsZW5ndGgobGhzIC0gcmhzKTsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdCB2KSB7CisgICAgcmV0dXJuIDEuZjsKK30KK3N0YXRpYyBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbm9ybWFsaXplKGZsb2F0MiB2KSB7CisgICAgcmV0dXJuIHYgLyBsZW5ndGgodik7Cit9CitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG5vcm1hbGl6ZShmbG9hdDMgdikgeworICAgIHJldHVybiB2IC8gbGVuZ3RoKHYpOworfQorc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBub3JtYWxpemUoZmxvYXQ0IHYpIHsKKyAgICByZXR1cm4gdiAvIGxlbmd0aCh2KTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19jb3JlLnJzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZjMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2NvcmUucnNoCkBAIC0wLDAgKzEsODkyIEBACisjaWZuZGVmIF9fUlNfQ09SRV9SU0hfXworI2RlZmluZSBfX1JTX0NPUkVfUlNIX18KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDIgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnkpOworfQorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNEZWJ1Zyhjb25zdCBjaGFyICpzLCBmbG9hdDMgdikgeworICAgIHJzRGVidWcocywgdi54LCB2LnksIHYueik7Cit9CitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc0RlYnVnKGNvbnN0IGNoYXIgKnMsIGZsb2F0NCB2KSB7CisgICAgcnNEZWJ1ZyhzLCB2LngsIHYueSwgdi56LCB2LncpOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gMjU1OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpCit7CisgICAgdWNoYXI0IGM7CisgICAgYy54ID0gKHVjaGFyKShyICogMjU1LmYpOworICAgIGMueSA9ICh1Y2hhcikoZyAqIDI1NS5mKTsKKyAgICBjLnogPSAodWNoYXIpKGIgKiAyNTUuZik7CisgICAgYy53ID0gKHVjaGFyKShhICogMjU1LmYpOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0MyBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCAyNTV9OworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgdWNoYXI0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJzUGFja0NvbG9yVG84ODg4KGZsb2F0NCBjb2xvcikKK3sKKyAgICBjb2xvciAqPSAyNTUuZjsKKyAgICB1Y2hhcjQgYyA9IHtjb2xvci54LCBjb2xvci55LCBjb2xvci56LCBjb2xvci53fTsKKyAgICByZXR1cm4gYzsKK30KKworc3RhdGljIGZsb2F0NCByc1VucGFja0NvbG9yODg4OCh1Y2hhcjQgYykKK3sKKyAgICBmbG9hdDQgcmV0ID0gKGZsb2F0NCkwLjAwMzkxNTY4NjI3NDVmOworICAgIHJldCAqPSBjb252ZXJ0X2Zsb2F0NChjKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvL2V4dGVybiB1Y2hhcjQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNQYWNrQ29sb3JUbzU2NShmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKTsKKy8vZXh0ZXJuIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc1BhY2tDb2xvclRvNTY1KGZsb2F0Myk7CisvL2V4dGVybiBmbG9hdDQgcnNVbnBhY2tDb2xvcjU2NSh1Y2hhcjQpOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNYXRyaXggb3BzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTZXQocnNfbWF0cml4NHg0ICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCwgZmxvYXQgdikgeworICAgIG0tPm1bcm93ICogNCArIGNvbF0gPSB2OworfQorCitzdGF0aWMgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4R2V0KGNvbnN0IHJzX21hdHJpeDR4NCAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wpIHsKKyAgICByZXR1cm4gbS0+bVtyb3cgKiA0ICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4U2V0KHJzX21hdHJpeDN4MyAqbSwgdWludDMyX3Qgcm93LCB1aW50MzJfdCBjb2wsIGZsb2F0IHYpIHsKKyAgICBtLT5tW3JvdyAqIDMgKyBjb2xdID0gdjsKK30KKworc3RhdGljIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeEdldChjb25zdCByc19tYXRyaXgzeDMgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgcmV0dXJuIG0tPm1bcm93ICogMyArIGNvbF07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFNldChyc19tYXRyaXgyeDIgKm0sIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sLCBmbG9hdCB2KSB7CisgICAgbS0+bVtyb3cgKiAyICsgY29sXSA9IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhHZXQoY29uc3QgcnNfbWF0cml4MngyICptLCB1aW50MzJfdCByb3csIHVpbnQzMl90IGNvbCkgeworICAgIHJldHVybiBtLT5tW3JvdyAqIDIgKyBjb2xdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4NHg0ICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gMC5mOworICAgIG0tPm1bNV0gPSAxLmY7CisgICAgbS0+bVs2XSA9IDAuZjsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSAwLmY7CisgICAgbS0+bVs5XSA9IDAuZjsKKyAgICBtLT5tWzEwXSA9IDEuZjsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZElkZW50aXR5KHJzX21hdHJpeDN4MyAqbSkgeworICAgIG0tPm1bMF0gPSAxLmY7CisgICAgbS0+bVsxXSA9IDAuZjsKKyAgICBtLT5tWzJdID0gMC5mOworICAgIG0tPm1bM10gPSAwLmY7CisgICAgbS0+bVs0XSA9IDEuZjsKKyAgICBtLT5tWzVdID0gMC5mOworICAgIG0tPm1bNl0gPSAwLmY7CisgICAgbS0+bVs3XSA9IDAuZjsKKyAgICBtLT5tWzhdID0gMS5mOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkSWRlbnRpdHkocnNfbWF0cml4MngyICptKSB7CisgICAgbS0+bVswXSA9IDEuZjsKKyAgICBtLT5tWzFdID0gMC5mOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IGZsb2F0ICp2KSB7CisgICAgbS0+bVswXSA9IHZbMF07CisgICAgbS0+bVsxXSA9IHZbMV07CisgICAgbS0+bVsyXSA9IHZbMl07CisgICAgbS0+bVszXSA9IHZbM107CisgICAgbS0+bVs0XSA9IHZbNF07CisgICAgbS0+bVs1XSA9IHZbNV07CisgICAgbS0+bVs2XSA9IHZbNl07CisgICAgbS0+bVs3XSA9IHZbN107CisgICAgbS0+bVs4XSA9IHZbOF07CisgICAgbS0+bVs5XSA9IHZbOV07CisgICAgbS0+bVsxMF0gPSB2WzEwXTsKKyAgICBtLT5tWzExXSA9IHZbMTFdOworICAgIG0tPm1bMTJdID0gdlsxMl07CisgICAgbS0+bVsxM10gPSB2WzEzXTsKKyAgICBtLT5tWzE0XSA9IHZbMTRdOworICAgIG0tPm1bMTVdID0gdlsxNV07Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCBmbG9hdCAqdikgeworICAgIG0tPm1bMF0gPSB2WzBdOworICAgIG0tPm1bMV0gPSB2WzFdOworICAgIG0tPm1bMl0gPSB2WzJdOworICAgIG0tPm1bM10gPSB2WzNdOworICAgIG0tPm1bNF0gPSB2WzRdOworICAgIG0tPm1bNV0gPSB2WzVdOworICAgIG0tPm1bNl0gPSB2WzZdOworICAgIG0tPm1bN10gPSB2WzddOworICAgIG0tPm1bOF0gPSB2WzhdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDJ4MiAqbSwgY29uc3QgZmxvYXQgKnYpIHsKKyAgICBtLT5tWzBdID0gdlswXTsKKyAgICBtLT5tWzFdID0gdlsxXTsKKyAgICBtLT5tWzJdID0gdlsyXTsKKyAgICBtLT5tWzNdID0gdlszXTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDR4NCAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworICAgIG0tPm1bNF0gPSB2LT5tWzRdOworICAgIG0tPm1bNV0gPSB2LT5tWzVdOworICAgIG0tPm1bNl0gPSB2LT5tWzZdOworICAgIG0tPm1bN10gPSB2LT5tWzddOworICAgIG0tPm1bOF0gPSB2LT5tWzhdOworICAgIG0tPm1bOV0gPSB2LT5tWzldOworICAgIG0tPm1bMTBdID0gdi0+bVsxMF07CisgICAgbS0+bVsxMV0gPSB2LT5tWzExXTsKKyAgICBtLT5tWzEyXSA9IHYtPm1bMTJdOworICAgIG0tPm1bMTNdID0gdi0+bVsxM107CisgICAgbS0+bVsxNF0gPSB2LT5tWzE0XTsKKyAgICBtLT5tWzE1XSA9IHYtPm1bMTVdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkKHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4M3gzICp2KSB7CisgICAgbS0+bVswXSA9IHYtPm1bMF07CisgICAgbS0+bVsxXSA9IHYtPm1bMV07CisgICAgbS0+bVsyXSA9IHYtPm1bMl07CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gdi0+bVs1XTsKKyAgICBtLT5tWzddID0gMC5mOworICAgIG0tPm1bOF0gPSB2LT5tWzZdOworICAgIG0tPm1bOV0gPSB2LT5tWzddOworICAgIG0tPm1bMTBdID0gdi0+bVs4XTsKKyAgICBtLT5tWzExXSA9IDAuZjsKKyAgICBtLT5tWzEyXSA9IDAuZjsKKyAgICBtLT5tWzEzXSA9IDAuZjsKKyAgICBtLT5tWzE0XSA9IDAuZjsKKyAgICBtLT5tWzE1XSA9IDEuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXg0eDQgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSAwLmY7CisgICAgbS0+bVszXSA9IDAuZjsKKyAgICBtLT5tWzRdID0gdi0+bVszXTsKKyAgICBtLT5tWzVdID0gdi0+bVs0XTsKKyAgICBtLT5tWzZdID0gMC5mOworICAgIG0tPm1bN10gPSAwLmY7CisgICAgbS0+bVs4XSA9IHYtPm1bNl07CisgICAgbS0+bVs5XSA9IHYtPm1bN107CisgICAgbS0+bVsxMF0gPSAxLmY7CisgICAgbS0+bVsxMV0gPSAwLmY7CisgICAgbS0+bVsxMl0gPSAwLmY7CisgICAgbS0+bVsxM10gPSAwLmY7CisgICAgbS0+bVsxNF0gPSAwLmY7CisgICAgbS0+bVsxNV0gPSAxLmY7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeExvYWQocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKnYpIHsKKyAgICBtLT5tWzBdID0gdi0+bVswXTsKKyAgICBtLT5tWzFdID0gdi0+bVsxXTsKKyAgICBtLT5tWzJdID0gdi0+bVsyXTsKKyAgICBtLT5tWzNdID0gdi0+bVszXTsKKyAgICBtLT5tWzRdID0gdi0+bVs0XTsKKyAgICBtLT5tWzVdID0gdi0+bVs1XTsKKyAgICBtLT5tWzZdID0gdi0+bVs2XTsKKyAgICBtLT5tWzddID0gdi0+bVs3XTsKKyAgICBtLT5tWzhdID0gdi0+bVs4XTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZChyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqdikgeworICAgIG0tPm1bMF0gPSB2LT5tWzBdOworICAgIG0tPm1bMV0gPSB2LT5tWzFdOworICAgIG0tPm1bMl0gPSB2LT5tWzJdOworICAgIG0tPm1bM10gPSB2LT5tWzNdOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkUm90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgZmxvYXQgYywgczsKKyAgICBtLT5tWzNdID0gMDsKKyAgICBtLT5tWzddID0gMDsKKyAgICBtLT5tWzExXT0gMDsKKyAgICBtLT5tWzEyXT0gMDsKKyAgICBtLT5tWzEzXT0gMDsKKyAgICBtLT5tWzE0XT0gMDsKKyAgICBtLT5tWzE1XT0gMTsKKyAgICByb3QgKj0gKGZsb2F0KShNX1BJIC8gMTgwLjBmKTsKKyAgICBjID0gY29zKHJvdCk7CisgICAgcyA9IHNpbihyb3QpOworCisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgY29uc3QgZmxvYXQgbmMgPSAxLjBmIC0gYzsKKyAgICBjb25zdCBmbG9hdCB4eSA9IHggKiB5OworICAgIGNvbnN0IGZsb2F0IHl6ID0geSAqIHo7CisgICAgY29uc3QgZmxvYXQgenggPSB6ICogeDsKKyAgICBjb25zdCBmbG9hdCB4cyA9IHggKiBzOworICAgIGNvbnN0IGZsb2F0IHlzID0geSAqIHM7CisgICAgY29uc3QgZmxvYXQgenMgPSB6ICogczsKKyAgICBtLT5tWyAwXSA9IHgqeCpuYyArICBjOworICAgIG0tPm1bIDRdID0gIHh5Km5jIC0genM7CisgICAgbS0+bVsgOF0gPSAgengqbmMgKyB5czsKKyAgICBtLT5tWyAxXSA9ICB4eSpuYyArIHpzOworICAgIG0tPm1bIDVdID0geSp5Km5jICsgIGM7CisgICAgbS0+bVsgOV0gPSAgeXoqbmMgLSB4czsKKyAgICBtLT5tWyAyXSA9ICB6eCpuYyAtIHlzOworICAgIG0tPm1bIDZdID0gIHl6Km5jICsgeHM7CisgICAgbS0+bVsxMF0gPSB6KnoqbmMgKyAgYzsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFNjYWxlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSB4OworICAgIG0tPm1bNV0gPSB5OworICAgIG0tPm1bMTBdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eShtKTsKKyAgICBtLT5tWzEyXSA9IHg7CisgICAgbS0+bVsxM10gPSB5OworICAgIG0tPm1bMTRdID0gejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpsaHMsIGNvbnN0IHJzX21hdHJpeDR4NCAqcmhzKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJpMCA9IDA7CisgICAgICAgIGZsb2F0IHJpMSA9IDA7CisgICAgICAgIGZsb2F0IHJpMiA9IDA7CisgICAgICAgIGZsb2F0IHJpMyA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8NCA7IGorKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgcmhzX2lqID0gcnNNYXRyaXhHZXQocmhzLCBpLGopOworICAgICAgICAgICAgcmkwICs9IHJzTWF0cml4R2V0KGxocywgaiwgMCkgKiByaHNfaWo7CisgICAgICAgICAgICByaTEgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAxKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMiArPSByc01hdHJpeEdldChsaHMsIGosIDIpICogcmhzX2lqOworICAgICAgICAgICAgcmkzICs9IHJzTWF0cml4R2V0KGxocywgaiwgMykgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMywgcmkzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgY29uc3QgcnNfbWF0cml4NHg0ICpyaHMpIHsKKyAgICByc19tYXRyaXg0eDQgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4M3gzICptLCBjb25zdCByc19tYXRyaXgzeDMgKmxocywgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDMgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZmxvYXQgcmkyID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICAgICAgcmkyICs9IHJzTWF0cml4R2V0KGxocywgaiwgMikgKiByaHNfaWo7CisgICAgICAgIH0KKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMCwgcmkwKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMSwgcmkxKTsKKyAgICAgICAgcnNNYXRyaXhTZXQobSwgaSwgMiwgcmkyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgY29uc3QgcnNfbWF0cml4M3gzICpyaHMpIHsKKyAgICByc19tYXRyaXgzeDMgbXQ7CisgICAgcnNNYXRyaXhMb2FkTXVsdGlwbHkoJm10LCBtLCByaHMpOworICAgIHJzTWF0cml4TG9hZChtLCAmbXQpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkTXVsdGlwbHkocnNfbWF0cml4MngyICptLCBjb25zdCByc19tYXRyaXgyeDIgKmxocywgY29uc3QgcnNfbWF0cml4MngyICpyaHMpIHsKKyAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKKyAgICAgICAgZmxvYXQgcmkwID0gMDsKKyAgICAgICAgZmxvYXQgcmkxID0gMDsKKyAgICAgICAgZm9yIChpbnQgaj0wIDsgajwyIDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByaHNfaWogPSByc01hdHJpeEdldChyaHMsIGksaik7CisgICAgICAgICAgICByaTAgKz0gcnNNYXRyaXhHZXQobGhzLCBqLCAwKSAqIHJoc19pajsKKyAgICAgICAgICAgIHJpMSArPSByc01hdHJpeEdldChsaHMsIGosIDEpICogcmhzX2lqOworICAgICAgICB9CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDAsIHJpMCk7CisgICAgICAgIHJzTWF0cml4U2V0KG0sIGksIDEsIHJpMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXgyeDIgKm0sIGNvbnN0IHJzX21hdHJpeDJ4MiAqcmhzKSB7CisgICAgcnNfbWF0cml4MngyIG10OworICAgIHJzTWF0cml4TG9hZE11bHRpcGx5KCZtdCwgbSwgcmhzKTsKKyAgICByc01hdHJpeExvYWQobSwgJm10KTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4Um90YXRlKHJzX21hdHJpeDR4NCAqbSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcnNfbWF0cml4NHg0IG0xOworICAgIHJzTWF0cml4TG9hZFJvdGF0ZSgmbTEsIHJvdCwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhTY2FsZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkU2NhbGUoJm0xLCB4LCB5LCB6KTsKKyAgICByc01hdHJpeE11bHRpcGx5KG0sICZtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zbGF0ZShyc19tYXRyaXg0eDQgKm0sIGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHopIHsKKyAgICByc19tYXRyaXg0eDQgbTE7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtMSwgeCwgeSwgeik7CisgICAgcnNNYXRyaXhNdWx0aXBseShtLCAmbTEpOworfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhMb2FkT3J0aG8ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzVdID0gMi5mIC8gKHRvcCAtIGJvdHRvbSk7CisgICAgbS0+bVsxMF09IC0yLmYgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxMl09IC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpOworICAgIG0tPm1bMTNdPSAtKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzE0XT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZEZydXN0dW0ocnNfbWF0cml4NHg0ICptLCBmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsIGZsb2F0IG5lYXIsIGZsb2F0IGZhcikgeworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KG0pOworICAgIG0tPm1bMF0gPSAyLmYgKiBuZWFyIC8gKHJpZ2h0IC0gbGVmdCk7CisgICAgbS0+bVs1XSA9IDIuZiAqIG5lYXIgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzhdID0gKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KTsKKyAgICBtLT5tWzldID0gKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKKyAgICBtLT5tWzEwXT0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKKyAgICBtLT5tWzExXT0gLTEuZjsKKyAgICBtLT5tWzE0XT0gLTIuZiAqIGZhciAqIG5lYXIgLyAoZmFyIC0gbmVhcik7CisgICAgbS0+bVsxNV09IDAuZjsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TG9hZFBlcnNwZWN0aXZlKHJzX21hdHJpeDR4NCogbSwgZmxvYXQgZm92eSwgZmxvYXQgYXNwZWN0LCBmbG9hdCBuZWFyLCBmbG9hdCBmYXIpIHsKKyAgICBmbG9hdCB0b3AgPSBuZWFyICogdGFuKChmbG9hdCkgKGZvdnkgKiBNX1BJIC8gMzYwLjBmKSk7CisgICAgZmxvYXQgYm90dG9tID0gLXRvcDsKKyAgICBmbG9hdCBsZWZ0ID0gYm90dG9tICogYXNwZWN0OworICAgIGZsb2F0IHJpZ2h0ID0gdG9wICogYXNwZWN0OworICAgIHJzTWF0cml4TG9hZEZydXN0dW0obSwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpOworfQorCitzdGF0aWMgZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDR4NCAqbSwgZmxvYXQ0IGluKSB7CisgICAgZmxvYXQ0IHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KSArIChtLT5tWzEyXSAqIGluLncpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzVdICogaW4ueSkgKyAobS0+bVs5XSAqIGluLnopICsgKG0tPm1bMTNdICogaW4udyk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIChtLT5tWzEwXSAqIGluLnopICsgKG0tPm1bMTRdICogaW4udyk7CisgICAgcmV0LncgPSAobS0+bVszXSAqIGluLngpICsgKG0tPm1bN10gKiBpbi55KSArIChtLT5tWzExXSAqIGluLnopICsgKG0tPm1bMTVdICogaW4udyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhNdWx0aXBseShyc19tYXRyaXg0eDQgKm0sIGZsb2F0MyBpbikgeworICAgIGZsb2F0NCByZXQ7CisgICAgcmV0LnggPSAobS0+bVswXSAqIGluLngpICsgKG0tPm1bNF0gKiBpbi55KSArIChtLT5tWzhdICogaW4ueikgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOV0gKiBpbi56KSArIG0tPm1bMTNdOworICAgIHJldC56ID0gKG0tPm1bMl0gKiBpbi54KSArIChtLT5tWzZdICogaW4ueSkgKyAobS0+bVsxMF0gKiBpbi56KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyAobS0+bVsxMV0gKiBpbi56KSArIG0tPm1bMTVdOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4TXVsdGlwbHkocnNfbWF0cml4NHg0ICptLCBmbG9hdDIgaW4pIHsKKyAgICBmbG9hdDQgcmV0OworICAgIHJldC54ID0gKG0tPm1bMF0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSkgKyBtLT5tWzEyXTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgbS0+bVsxM107CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNl0gKiBpbi55KSArIG0tPm1bMTRdOworICAgIHJldC53ID0gKG0tPm1bM10gKiBpbi54KSArIChtLT5tWzddICogaW4ueSkgKyBtLT5tWzE1XTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQzIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpICsgKG0tPm1bNl0gKiBpbi56KTsKKyAgICByZXQueSA9IChtLT5tWzFdICogaW4ueCkgKyAobS0+bVs0XSAqIGluLnkpICsgKG0tPm1bN10gKiBpbi56KTsKKyAgICByZXQueiA9IChtLT5tWzJdICogaW4ueCkgKyAobS0+bVs1XSAqIGluLnkpICsgKG0tPm1bOF0gKiBpbi56KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDN4MyAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQzIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVszXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzRdICogaW4ueSk7CisgICAgcmV0LnogPSAobS0+bVsyXSAqIGluLngpICsgKG0tPm1bNV0gKiBpbi55KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeE11bHRpcGx5KHJzX21hdHJpeDJ4MiAqbSwgZmxvYXQyIGluKSB7CisgICAgZmxvYXQyIHJldDsKKyAgICByZXQueCA9IChtLT5tWzBdICogaW4ueCkgKyAobS0+bVsyXSAqIGluLnkpOworICAgIHJldC55ID0gKG0tPm1bMV0gKiBpbi54KSArIChtLT5tWzNdICogaW4ueSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaSArIGpdID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIHJvdyBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVsxXSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bMl0gKyBtLT5tWzEyXSpyZXN1bHQubVszXTsKKworICAgIGlmIChmYWJzKGRldCkgPCAxZS02KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXQgPSAxLjBmIC8gZGV0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgIG0tPm1baV0gPSByZXN1bHQubVtpXSAqIGRldDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtYXRyaXggd2FzIHN1Y2Nlc3NmdWxseSBpbnZlcnNlZAorc3RhdGljIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4SW52ZXJzZVRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICByc19tYXRyaXg0eDQgcmVzdWx0OworCisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICAvLyBjb21wdXRlQ29mYWN0b3IgZm9yIGludCBpLCBpbnQgagorICAgICAgICAgICAgaW50IGMwID0gKGkrMSkgJSA0OworICAgICAgICAgICAgaW50IGMxID0gKGkrMikgJSA0OworICAgICAgICAgICAgaW50IGMyID0gKGkrMykgJSA0OworICAgICAgICAgICAgaW50IHIwID0gKGorMSkgJSA0OworICAgICAgICAgICAgaW50IHIxID0gKGorMikgJSA0OworICAgICAgICAgICAgaW50IHIyID0gKGorMykgJSA0OworCisgICAgICAgICAgICBmbG9hdCBtaW5vciA9IChtLT5tW2MwICsgNCpyMF0gKiAobS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIChtLT5tW2MwICsgNCpyMV0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjJdIC0gbS0+bVtjMSArIDQqcjJdICogbS0+bVtjMiArIDQqcjBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIChtLT5tW2MwICsgNCpyMl0gKiAobS0+bVtjMSArIDQqcjBdICogbS0+bVtjMiArIDQqcjFdIC0gbS0+bVtjMSArIDQqcjFdICogbS0+bVtjMiArIDQqcjBdKSk7CisKKyAgICAgICAgICAgIGZsb2F0IGNvZmFjdG9yID0gKGkraikgJiAxID8gLW1pbm9yIDogbWlub3I7CisKKyAgICAgICAgICAgIHJlc3VsdC5tWzQqaiArIGldID0gY29mYWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEb3QgcHJvZHVjdCBvZiAwdGggY29sdW1uIG9mIHNvdXJjZSBhbmQgMHRoIGNvbHVtbiBvZiByZXN1bHQKKyAgICBmbG9hdCBkZXQgPSBtLT5tWzBdKnJlc3VsdC5tWzBdICsgbS0+bVs0XSpyZXN1bHQubVs0XSArCisgICAgICAgICAgICAgICAgIG0tPm1bOF0qcmVzdWx0Lm1bOF0gKyBtLT5tWzEyXSpyZXN1bHQubVsxMl07CisKKyAgICBpZiAoZmFicyhkZXQpIDwgMWUtNikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGV0ID0gMS4wZiAvIGRldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgICBtLT5tW2ldID0gcmVzdWx0Lm1baV0gKiBkZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc01hdHJpeFRyYW5zcG9zZShyc19tYXRyaXg0eDQgKm0pIHsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgIHRlbXAgPSBtLT5tW2kqNCArIGpdOworICAgICAgICAgICAgbS0+bVtpKjQgKyBqXSA9IG0tPm1baio0ICsgaV07CisgICAgICAgICAgICBtLT5tW2oqNCArIGldID0gdGVtcDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzTWF0cml4VHJhbnNwb3NlKHJzX21hdHJpeDN4MyAqbSkgeworICAgIGludCBpLCBqOworICAgIGZsb2F0IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IDM7ICsraikgeworICAgICAgICAgICAgdGVtcCA9IG0tPm1baSozICsgal07CisgICAgICAgICAgICBtLT5tW2kqMyArIGpdID0gbS0+bVtqKjQgKyBpXTsKKyAgICAgICAgICAgIG0tPm1baiozICsgaV0gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorcnNNYXRyaXhUcmFuc3Bvc2UocnNfbWF0cml4MngyICptKSB7CisgICAgZmxvYXQgdGVtcCA9IG0tPm1bMV07CisgICAgbS0+bVsxXSA9IG0tPm1bMl07CisgICAgbS0+bVsyXSA9IHRlbXA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBxdWF0ZXJuaW9uIG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvblNldChyc19xdWF0ZXJuaW9uICpxLCBmbG9hdCB3LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcS0+dyA9IHc7CisgICAgcS0+eCA9IHg7CisgICAgcS0+eSA9IHk7CisgICAgcS0+eiA9IHo7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25TZXQocnNfcXVhdGVybmlvbiAqcSwgY29uc3QgcnNfcXVhdGVybmlvbiAqcmhzKSB7CisgICAgcS0+dyA9IHJocy0+dzsKKyAgICBxLT54ID0gcmhzLT54OworICAgIHEtPnkgPSByaHMtPnk7CisgICAgcS0+eiA9IHJocy0+ejsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKK3JzUXVhdGVybmlvbk11bHRpcGx5KHJzX3F1YXRlcm5pb24gKnEsIGZsb2F0IHMpIHsKKyAgICBxLT53ICo9IHM7CisgICAgcS0+eCAqPSBzOworICAgIHEtPnkgKj0gczsKKyAgICBxLT56ICo9IHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc1F1YXRlcm5pb25NdWx0aXBseShyc19xdWF0ZXJuaW9uICpxLCBjb25zdCByc19xdWF0ZXJuaW9uICpyaHMpIHsKKyAgICBxLT53ID0gLXEtPngqcmhzLT54IC0gcS0+eSpyaHMtPnkgLSBxLT56KnJocy0+eiArIHEtPncqcmhzLT53OworICAgIHEtPnggPSAgcS0+eCpyaHMtPncgKyBxLT55KnJocy0+eiAtIHEtPnoqcmhzLT55ICsgcS0+dypyaHMtPng7CisgICAgcS0+eSA9IC1xLT54KnJocy0+eiArIHEtPnkqcmhzLT53ICsgcS0+eipyaHMtPnogKyBxLT53KnJocy0+eTsKKyAgICBxLT56ID0gIHEtPngqcmhzLT55IC0gcS0+eSpyaHMtPnggKyBxLT56KnJocy0+dyArIHEtPncqcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uQWRkKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnJocykgeworICAgIHEtPncgKj0gcmhzLT53OworICAgIHEtPnggKj0gcmhzLT54OworICAgIHEtPnkgKj0gcmhzLT55OworICAgIHEtPnogKj0gcmhzLT56OworfQorCitzdGF0aWMgdm9pZAorcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgcm90ICo9IChmbG9hdCkoTV9QSSAvIDE4MC4wZikgKiAwLjVmOworICAgIGZsb2F0IGMgPSBjb3Mocm90KTsKKyAgICBmbG9hdCBzID0gc2luKHJvdCk7CisKKyAgICBxLT53ID0gYzsKKyAgICBxLT54ID0geCAqIHM7CisgICAgcS0+eSA9IHkgKiBzOworICAgIHEtPnogPSB6ICogczsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkxvYWRSb3RhdGUocnNfcXVhdGVybmlvbiAqcSwgZmxvYXQgcm90LCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0geCp4ICsgeSp5ICsgeip6OworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgeCAqPSByZWNpcExlbjsKKyAgICAgICAgeSAqPSByZWNpcExlbjsKKyAgICAgICAgeiAqPSByZWNpcExlbjsKKyAgICB9CisgICAgcnNRdWF0ZXJuaW9uTG9hZFJvdGF0ZVVuaXQocSwgcm90LCB4LCB5LCB6KTsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbkNvbmp1Z2F0ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgcS0+eCA9IC1xLT54OworICAgIHEtPnkgPSAtcS0+eTsKKyAgICBxLT56ID0gLXEtPno7Cit9CisKK3N0YXRpYyBmbG9hdAorcnNRdWF0ZXJuaW9uRG90KGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSkgeworICAgIHJldHVybiBxMC0+dypxMS0+dyArIHEwLT54KnExLT54ICsgcTAtPnkqcTEtPnkgKyBxMC0+eipxMS0+ejsKK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvbk5vcm1hbGl6ZShyc19xdWF0ZXJuaW9uICpxKSB7CisgICAgY29uc3QgZmxvYXQgbGVuID0gcnNRdWF0ZXJuaW9uRG90KHEsIHEpOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBjb25zdCBmbG9hdCByZWNpcExlbiA9IDEuZiAvIHNxcnQobGVuKTsKKyAgICAgICAgcnNRdWF0ZXJuaW9uTXVsdGlwbHkocSwgcmVjaXBMZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JzUXVhdGVybmlvblNsZXJwKHJzX3F1YXRlcm5pb24gKnEsIGNvbnN0IHJzX3F1YXRlcm5pb24gKnEwLCBjb25zdCByc19xdWF0ZXJuaW9uICpxMSwgZmxvYXQgdCkgeworICAgIGlmKHQgPD0gMC4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHQgPj0gMS4wZikgeworICAgICAgICByc1F1YXRlcm5pb25TZXQocSwgcTEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcnNfcXVhdGVybmlvbiB0ZW1wcTAsIHRlbXBxMTsKKyAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMCwgcTApOworICAgIHJzUXVhdGVybmlvblNldCgmdGVtcHExLCBxMSk7CisKKyAgICBmbG9hdCBhbmdsZSA9IHJzUXVhdGVybmlvbkRvdChxMCwgcTEpOworICAgIGlmKGFuZ2xlIDwgMCkgeworICAgICAgICByc1F1YXRlcm5pb25NdWx0aXBseSgmdGVtcHEwLCAtMS4wZik7CisgICAgICAgIGFuZ2xlICo9IC0xLjBmOworICAgIH0KKworICAgIGZsb2F0IHNjYWxlLCBpbnZTY2FsZTsKKyAgICBpZiAoYW5nbGUgKyAxLjBmID4gMC4wNWYpIHsKKyAgICAgICAgaWYgKDEuMGYgLSBhbmdsZSA+PSAwLjA1ZikgeworICAgICAgICAgICAgZmxvYXQgdGhldGEgPSBhY29zKGFuZ2xlKTsKKyAgICAgICAgICAgIGZsb2F0IGludlNpblRoZXRhID0gMS4wZiAvIHNpbih0aGV0YSk7CisgICAgICAgICAgICBzY2FsZSA9IHNpbih0aGV0YSAqICgxLjBmIC0gdCkpICogaW52U2luVGhldGE7CisgICAgICAgICAgICBpbnZTY2FsZSA9IHNpbih0aGV0YSAqIHQpICogaW52U2luVGhldGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzY2FsZSA9IDEuMGYgLSB0OworICAgICAgICAgICAgaW52U2NhbGUgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1F1YXRlcm5pb25TZXQoJnRlbXBxMSwgdGVtcHEwLnosIC10ZW1wcTAueSwgdGVtcHEwLngsIC10ZW1wcTAudyk7CisgICAgICAgIHNjYWxlID0gc2luKE1fUEkgKiAoMC41ZiAtIHQpKTsKKyAgICAgICAgaW52U2NhbGUgPSBzaW4oTV9QSSAqIHQpOworICAgIH0KKworICAgIHJzUXVhdGVybmlvblNldChxLCB0ZW1wcTAudypzY2FsZSArIHRlbXBxMS53KmludlNjYWxlLCB0ZW1wcTAueCpzY2FsZSArIHRlbXBxMS54KmludlNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHEwLnkqc2NhbGUgKyB0ZW1wcTEueSppbnZTY2FsZSwgdGVtcHEwLnoqc2NhbGUgKyB0ZW1wcTEueippbnZTY2FsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJzUXVhdGVybmlvbkdldE1hdHJpeFVuaXQocnNfbWF0cml4NHg0ICptLCBjb25zdCByc19xdWF0ZXJuaW9uICpxKSB7CisgICAgZmxvYXQgeDIgPSAyLjBmICogcS0+eCAqIHEtPng7CisgICAgZmxvYXQgeTIgPSAyLjBmICogcS0+eSAqIHEtPnk7CisgICAgZmxvYXQgejIgPSAyLjBmICogcS0+eiAqIHEtPno7CisgICAgZmxvYXQgeHkgPSAyLjBmICogcS0+eCAqIHEtPnk7CisgICAgZmxvYXQgd3ogPSAyLjBmICogcS0+dyAqIHEtPno7CisgICAgZmxvYXQgeHogPSAyLjBmICogcS0+eCAqIHEtPno7CisgICAgZmxvYXQgd3kgPSAyLjBmICogcS0+dyAqIHEtPnk7CisgICAgZmxvYXQgd3ggPSAyLjBmICogcS0+dyAqIHEtPng7CisgICAgZmxvYXQgeXogPSAyLjBmICogcS0+eSAqIHEtPno7CisKKyAgICBtLT5tWzBdID0gMS4wZiAtIHkyIC0gejI7CisgICAgbS0+bVsxXSA9IHh5IC0gd3o7CisgICAgbS0+bVsyXSA9IHh6ICsgd3k7CisgICAgbS0+bVszXSA9IDAuMGY7CisKKyAgICBtLT5tWzRdID0geHkgKyB3ejsKKyAgICBtLT5tWzVdID0gMS4wZiAtIHgyIC0gejI7CisgICAgbS0+bVs2XSA9IHl6IC0gd3g7CisgICAgbS0+bVs3XSA9IDAuMGY7CisKKyAgICBtLT5tWzhdID0geHogLSB3eTsKKyAgICBtLT5tWzldID0geXogLSB3eDsKKyAgICBtLT5tWzEwXSA9IDEuMGYgLSB4MiAtIHkyOworICAgIG0tPm1bMTFdID0gMC4wZjsKKworICAgIG0tPm1bMTJdID0gMC4wZjsKKyAgICBtLT5tWzEzXSA9IDAuMGY7CisgICAgbS0+bVsxNF0gPSAwLjBmOworICAgIG0tPm1bMTVdID0gMS4wZjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIHV0aWxpdHkgZnVuY3MKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0V4dHJhY3RGcnVzdHVtUGxhbmVzKGNvbnN0IHJzX21hdHJpeDR4NCAqbW9kZWxWaWV3UHJvaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKmxlZnQsIGZsb2F0NCAqcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICp0b3AsIGZsb2F0NCAqYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbmVhciwgZmxvYXQ0ICpmYXIpIHsKKyAgICAvLyB4IHkgeiB3ID0gYSBiIGMgZCBpbiB0aGUgcGxhbmUgZXF1YXRpb24KKyAgICBsZWZ0LT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSArIG1vZGVsVmlld1Byb2otPm1bMF07CisgICAgbGVmdC0+eSA9IG1vZGVsVmlld1Byb2otPm1bN10gKyBtb2RlbFZpZXdQcm9qLT5tWzRdOworICAgIGxlZnQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgbGVmdC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxMl07CisKKyAgICByaWdodC0+eCA9IG1vZGVsVmlld1Byb2otPm1bM10gLSBtb2RlbFZpZXdQcm9qLT5tWzBdOworICAgIHJpZ2h0LT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNF07CisgICAgcmlnaHQtPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bOF07CisgICAgcmlnaHQtPncgPSBtb2RlbFZpZXdQcm9qLT5tWzE1XSAtIG1vZGVsVmlld1Byb2otPm1bMTJdOworCisgICAgdG9wLT54ID0gbW9kZWxWaWV3UHJvai0+bVszXSAtIG1vZGVsVmlld1Byb2otPm1bMV07CisgICAgdG9wLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSAtIG1vZGVsVmlld1Byb2otPm1bNV07CisgICAgdG9wLT56ID0gbW9kZWxWaWV3UHJvai0+bVsxMV0gLSBtb2RlbFZpZXdQcm9qLT5tWzldOworICAgIHRvcC0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxM107CisKKyAgICBib3R0b20tPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsxXTsKKyAgICBib3R0b20tPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddICsgbW9kZWxWaWV3UHJvai0+bVs1XTsKKyAgICBib3R0b20tPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSArIG1vZGVsVmlld1Byb2otPm1bOV07CisgICAgYm90dG9tLT53ID0gbW9kZWxWaWV3UHJvai0+bVsxNV0gKyBtb2RlbFZpZXdQcm9qLT5tWzEzXTsKKworICAgIG5lYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdICsgbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBuZWFyLT55ID0gbW9kZWxWaWV3UHJvai0+bVs3XSArIG1vZGVsVmlld1Byb2otPm1bNl07CisgICAgbmVhci0+eiA9IG1vZGVsVmlld1Byb2otPm1bMTFdICsgbW9kZWxWaWV3UHJvai0+bVsxMF07CisgICAgbmVhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdICsgbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmYXItPnggPSBtb2RlbFZpZXdQcm9qLT5tWzNdIC0gbW9kZWxWaWV3UHJvai0+bVsyXTsKKyAgICBmYXItPnkgPSBtb2RlbFZpZXdQcm9qLT5tWzddIC0gbW9kZWxWaWV3UHJvai0+bVs2XTsKKyAgICBmYXItPnogPSBtb2RlbFZpZXdQcm9qLT5tWzExXSAtIG1vZGVsVmlld1Byb2otPm1bMTBdOworICAgIGZhci0+dyA9IG1vZGVsVmlld1Byb2otPm1bMTVdIC0gbW9kZWxWaWV3UHJvai0+bVsxNF07CisKKyAgICBmbG9hdCBsZW4gPSBsZW5ndGgobGVmdC0+eHl6KTsKKyAgICAqbGVmdCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHJpZ2h0LT54eXopOworICAgICpyaWdodCAvPSBsZW47CisgICAgbGVuID0gbGVuZ3RoKHRvcC0+eHl6KTsKKyAgICAqdG9wIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoYm90dG9tLT54eXopOworICAgICpib3R0b20gLz0gbGVuOworICAgIGxlbiA9IGxlbmd0aChuZWFyLT54eXopOworICAgICpuZWFyIC89IGxlbjsKKyAgICBsZW4gPSBsZW5ndGgoZmFyLT54eXopOworICAgICpmYXIgLz0gbGVuOworfQorCitib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc0lzU3BoZXJlSW5GcnVzdHVtKGZsb2F0NCAqc3BoZXJlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCAqbGVmdCwgZmxvYXQ0ICpyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdDQgKnRvcCwgZmxvYXQ0ICpib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ0ICpuZWFyLCBmbG9hdDQgKmZhcikgeworCisgICAgZmxvYXQgZGlzdFRvQ2VudGVyID0gZG90KGxlZnQtPnh5eiwgc3BoZXJlLT54eXopICsgbGVmdC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KHJpZ2h0LT54eXosIHNwaGVyZS0+eHl6KSArIHJpZ2h0LT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkaXN0VG9DZW50ZXIgPSBkb3QodG9wLT54eXosIHNwaGVyZS0+eHl6KSArIHRvcC0+dzsKKyAgICBpZihkaXN0VG9DZW50ZXIgPCAtc3BoZXJlLT53KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlzdFRvQ2VudGVyID0gZG90KGJvdHRvbS0+eHl6LCBzcGhlcmUtPnh5eikgKyBib3R0b20tPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChuZWFyLT54eXosIHNwaGVyZS0+eHl6KSArIG5lYXItPnc7CisgICAgaWYoZGlzdFRvQ2VudGVyIDwgLXNwaGVyZS0+dykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRpc3RUb0NlbnRlciA9IGRvdChmYXItPnh5eiwgc3BoZXJlLT54eXopICsgZmFyLT53OworICAgIGlmKGRpc3RUb0NlbnRlciA8IC1zcGhlcmUtPncpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gaW50IG9wcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworX19pbmxpbmVfXyBzdGF0aWMgdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIGFsd2F5c19pbmxpbmUpKSByc0NsYW1wKHVpbnQgYW1vdW50LCB1aW50IGxvdywgdWludCBoaWdoKSB7CisgICAgcmV0dXJuIGFtb3VudCA8IGxvdyA/IGxvdyA6IChhbW91bnQgPiBoaWdoID8gaGlnaCA6IGFtb3VudCk7Cit9CitfX2lubGluZV9fIHN0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChpbnQgYW1vdW50LCBpbnQgbG93LCBpbnQgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorX19pbmxpbmVfXyBzdGF0aWMgdXNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodXNob3J0IGFtb3VudCwgdXNob3J0IGxvdywgdXNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHNob3J0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAoc2hvcnQgYW1vdW50LCBzaG9ydCBsb3csIHNob3J0IGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIHVjaGFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSwgYWx3YXlzX2lubGluZSkpIHJzQ2xhbXAodWNoYXIgYW1vdW50LCB1Y2hhciBsb3csIHVjaGFyIGhpZ2gpIHsKKyAgICByZXR1cm4gYW1vdW50IDwgbG93ID8gbG93IDogKGFtb3VudCA+IGhpZ2ggPyBoaWdoIDogYW1vdW50KTsKK30KK19faW5saW5lX18gc3RhdGljIGNoYXIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCBhbHdheXNfaW5saW5lKSkgcnNDbGFtcChjaGFyIGFtb3VudCwgY2hhciBsb3csIGNoYXIgaGlnaCkgeworICAgIHJldHVybiBhbW91bnQgPCBsb3cgPyBsb3cgOiAoYW1vdW50ID4gaGlnaCA/IGhpZ2ggOiBhbW91bnQpOworfQorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IDcwY2Q1NjIuLmMwYjJkMmQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMSw2NSArMSwxMDYgQEAKKyNpZm5kZWYgX19SU19HUkFQSElDU19SU0hfXworI2RlZmluZSBfX1JTX0dSQVBISUNTX1JTSF9fCisKKyNpbmNsdWRlICJyc19tYXRoLnJzaCIKIAogCi1leHRlcm4gZmxvYXQyIHZlYzJSYW5kKGZsb2F0IGxlbik7CisvLyBCaW5kIGEgUHJvZ3JhbUZyYWdtZW50IHRvIHRoZSBSUyBjb250ZXh0LgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKHJzX3Byb2dyYW1fc3RvcmUpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dCaW5kUHJvZ3JhbVZlcnRleChyc19wcm9ncmFtX3ZlcnRleCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRQcm9ncmFtUmFzdGVyKHJzX3Byb2dyYW1fcmFzdGVyKTsKIAotZXh0ZXJuIGZsb2F0MyBmbG9hdDNOb3JtKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQgZmxvYXQzTGVuZ3RoKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M0FkZChmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdDMgZmxvYXQzU3ViKGZsb2F0MyBsaHMsIGZsb2F0MyByaHMpOwotZXh0ZXJuIGZsb2F0MyBmbG9hdDNDcm9zcyhmbG9hdDMgbGhzLCBmbG9hdDMgcmhzKTsKLWV4dGVybiBmbG9hdCBmbG9hdDNEb3QoZmxvYXQzIGxocywgZmxvYXQzIHJocyk7Ci1leHRlcm4gZmxvYXQzIGZsb2F0M1NjYWxlKGZsb2F0MyB2LCBmbG9hdCBzY2FsZSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRTYW1wbGVyKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfc2FtcGxlcik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRUZXh0dXJlKHJzX3Byb2dyYW1fZnJhZ21lbnQsIHVpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CiAKLWV4dGVybiBmbG9hdDQgZmxvYXQ0QWRkKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0NCBmbG9hdDRTdWIoZmxvYXQ0IGxocywgZmxvYXQ0IHJocyk7Ci1leHRlcm4gZmxvYXQ0IGZsb2F0NENyb3NzKGZsb2F0NCBsaHMsIGZsb2F0NCByaHMpOwotZXh0ZXJuIGZsb2F0IGZsb2F0NERvdChmbG9hdDQgbGhzLCBmbG9hdDQgcmhzKTsKLWV4dGVybiBmbG9hdDQgZmxvYXQ0U2NhbGUoZmxvYXQ0IHYsIGZsb2F0IHNjYWxlKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRQcm9qZWN0aW9uTWF0cml4KGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkVGV4dHVyZU1hdHJpeChjb25zdCByc19tYXRyaXg0eDQgKik7CiAKLSAgICAvLyBjb250ZXh0Ci1leHRlcm4gdm9pZCBiaW5kUHJvZ3JhbUZyYWdtZW50KHJzX3Byb2dyYW1fZnJhZ21lbnQpOwotZXh0ZXJuIHZvaWQgYmluZFByb2dyYW1TdG9yZShyc19wcm9ncmFtX3N0b3JlKTsKLWV4dGVybiB2b2lkIGJpbmRQcm9ncmFtVmVydGV4KHJzX3Byb2dyYW1fdmVydGV4KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnUHJvZ3JhbVZlcnRleEdldFByb2plY3Rpb25NYXRyaXgocnNfbWF0cml4NHg0ICopOwogCi1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfc2FtcGxlcik7Ci1leHRlcm4gdm9pZCBiaW5kU2FtcGxlcihyc19wcm9ncmFtX2ZyYWdtZW50LCBpbnQgc2xvdCwgcnNfYWxsb2NhdGlvbik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1Byb2dyYW1GcmFnbWVudENvbnN0YW50Q29sb3IocnNfcHJvZ3JhbV9mcmFnbWVudCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwogCi1leHRlcm4gdm9pZCB2cExvYWRNb2RlbE1hdHJpeChjb25zdCBmbG9hdCAqKTsKLWV4dGVybiB2b2lkIHZwTG9hZFRleHR1cmVNYXRyaXgoY29uc3QgZmxvYXQgKik7CitleHRlcm4gdWludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0dldFdpZHRoKHZvaWQpOworZXh0ZXJuIHVpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dHZXRIZWlnaHQodm9pZCk7CiAKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnVXBsb2FkVG9UZXh0dXJlKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dVcGxvYWRUb1RleHR1cmUocnNfYWxsb2NhdGlvbiwgdWludCBtaXBMZXZlbCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ1VwbG9hZFRvQnVmZmVyT2JqZWN0KHJzX2FsbG9jYXRpb24pOwogCi0vLyBkcmF3aW5nCi1leHRlcm4gdm9pZCBkcmF3UmVjdChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeik7Ci1leHRlcm4gdm9pZCBkcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHoyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKLWV4dGVybiB2b2lkIGRyYXdRdWFkVGV4Q29vcmRzKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgejEsIGZsb2F0IHUxLCBmbG9hdCB2MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6MiwgZmxvYXQgdTIsIGZsb2F0IHYyLCBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsIGZsb2F0IHg0LCBmbG9hdCB5NCwgZmxvYXQgejQsIGZsb2F0IHU0LCBmbG9hdCB2NCk7Ci1leHRlcm4gdm9pZCBkcmF3U3ByaXRlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwotZXh0ZXJuIHZvaWQgZHJhd0xpbmUoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCB6Mik7Ci1leHRlcm4gdm9pZCBkcmF3UG9pbnQoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSk7Ci1leHRlcm4gdm9pZCBkcmF3U2ltcGxlTWVzaChpbnQgaXNtKTsKLWV4dGVybiB2b2lkIGRyYXdTaW1wbGVNZXNoUmFuZ2UoaW50IGlzbSwgaW50IHN0YXJ0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1JlY3QoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHopOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3UXVhZChmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHoxLAorICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsCisgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLCBmbG9hdCB6MywKKyAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsIGZsb2F0IHo0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB6MSwgZmxvYXQgdTEsIGZsb2F0IHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgejIsIGZsb2F0IHUyLCBmbG9hdCB2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsIGZsb2F0IHozLCBmbG9hdCB1MywgZmxvYXQgdjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LCBmbG9hdCB6NCwgZmxvYXQgdTQsIGZsb2F0IHY0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd1Nwcml0ZVNjcmVlbnNwYWNlKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHosIGZsb2F0IHcsIGZsb2F0IGgpOwogCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdNZXNoKHJzX21lc2ggaXNtKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnRHJhd01lc2gocnNfbWVzaCBpc20sIHVpbnQgcHJpbWl0aXZlSW5kZXgpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3TWVzaChyc19tZXNoIGlzbSwgdWludCBwcmltaXRpdmVJbmRleCwgdWludCBzdGFydCwgdWludCBsZW4pOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0NsZWFyQ29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dDbGVhckRlcHRoKGZsb2F0KTsKKworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dEcmF3VGV4dChjb25zdCBjaGFyICosIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0RyYXdUZXh0KHJzX2FsbG9jYXRpb24sIGludCB4LCBpbnQgeSk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ0JpbmRGb250KHJzX2ZvbnQpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc2dGb250Q29sb3IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOworCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gocnNfbWVzaCBtZXNoLCBmbG9hdCAqbWluWCwgZmxvYXQgKm1pblksIGZsb2F0ICptaW5aLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1heFgsIGZsb2F0ICptYXhZLCBmbG9hdCAqbWF4Wik7Cit2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCityc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KHJzX21lc2ggbWVzaCwgZmxvYXQzICpiQm94TWluLCBmbG9hdDMgKmJCb3hNYXgpIHsKKyAgICBmbG9hdCB4MSwgeTEsIHoxLCB4MiwgeTIsIHoyOworICAgIHJzZ01lc2hDb21wdXRlQm91bmRpbmdCb3gobWVzaCwgJngxLCAmeTEsICZ6MSwgJngyLCAmeTIsICZ6Mik7CisgICAgYkJveE1pbi0+eCA9IHgxOworICAgIGJCb3hNaW4tPnkgPSB5MTsKKyAgICBiQm94TWluLT56ID0gejE7CisgICAgYkJveE1heC0+eCA9IHgyOworICAgIGJCb3hNYXgtPnkgPSB5MjsKKyAgICBiQm94TWF4LT56ID0gejI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIG1pc2MKLWV4dGVybiB2b2lkIHBmQ2xlYXJDb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBjb2xvcihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBoc2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIHZvaWQgaHNiVG9SZ2IoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQqKTsKLWV4dGVybiBpbnQgaHNiVG9BYmdyKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIHZvaWQgdXBsb2FkVG9UZXh0dXJlKGludCwgaW50KTsKLWV4dGVybiB2b2lkIHVwbG9hZFRvQnVmZmVyT2JqZWN0KGludCk7CisvLyBEZXByaWNhdGVkCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIGNvbG9yKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKIAotZXh0ZXJuIGludCBjb2xvckZsb2F0UkdCQXRvVU5vcm04KGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBpbnQgY29sb3JGbG9hdFJHQnRvNTY1KGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotCi1leHRlcm4gaW50IGdldFdpZHRoKCk7Ci1leHRlcm4gaW50IGdldEhlaWdodCgpOwotCi1leHRlcm4gaW50IHNlbmRUb0NsaWVudCh2b2lkICpkYXRhLCBpbnQgY21kSUQsIGludCBsZW4sIGludCB3YWl0Rm9yU3BhY2UpOwotCi1leHRlcm4gdm9pZCBkZWJ1Z0YoY29uc3QgY2hhciAqLCBmbG9hdCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0kzMihjb25zdCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBkZWJ1Z0hleEkzMihjb25zdCBjaGFyICosIGludCk7Ci0KLQorI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaCBiL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAppbmRleCA2MTNjN2NhLi41NzIwYjA1IDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCkBAIC0xLDI4NyArMSwyMjIgQEAKLS8vIEZsb2F0IG9wcworI2lmbmRlZiBfX1JTX01BVEhfUlNIX18KKyNkZWZpbmUgX19SU19NQVRIX1JTSF9fCiAKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhmbG9hdDE2KTsKKy8vIERlYnVnZ2luZywgcHJpbnQgdG8gdGhlIExPRyBhIGRlc2NyaXB0aW9uIHN0cmluZyBhbmQgYSB2YWx1ZS4KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDR4NCAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDN4MyAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHJzX21hdHJpeDJ4MiAqKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzRGVidWcoY29uc3QgY2hhciAqLCB1aW50KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEZWJ1Zyhjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIFJTX0RFQlVHKGEpIHJzRGVidWcoI2EsIGEpCisjZGVmaW5lIFJTX0RFQlVHX01BUktFUiByc0RlYnVnKF9fRklMRV9fLCBfX0xJTkVfXykKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYWNvcyhmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhY29zKGZsb2F0MTYpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXNpbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFzaW4oZmxvYXQxNik7CisjaW5jbHVkZSAicnNfY2wucnNoIgorI2luY2x1ZGUgInJzX2NvcmUucnNoIgogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4oZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2VsZW1lbnQgKmRzdCwgcnNfZWxlbWVudCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc190eXBlICpkc3QsIHJzX3R5cGUgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfYWxsb2NhdGlvbiAqZHN0LCByc19hbGxvY2F0aW9uIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX3NhbXBsZXIgKmRzdCwgcnNfc2FtcGxlciBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19zY3JpcHQgKmRzdCwgcnNfc2NyaXB0IHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX21lc2ggKmRzdCwgcnNfbWVzaCBzcmMpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NldE9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QsIHJzX3Byb2dyYW1fZnJhZ21lbnQgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXggKmRzdCwgcnNfcHJvZ3JhbV92ZXJ0ZXggc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9yYXN0ZXIgKmRzdCwgcnNfcHJvZ3JhbV9yYXN0ZXIgc3JjKTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZXRPYmplY3QocnNfcHJvZ3JhbV9zdG9yZSAqZHN0LCByc19wcm9ncmFtX3N0b3JlIHNyYyk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2V0T2JqZWN0KHJzX2ZvbnQgKmRzdCwgcnNfZm9udCBzcmMpOwogCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhdGFuMihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGF0YW4yKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgYXRhbjIoZmxvYXQxNiwgZmxvYXQxNik7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZWxlbWVudCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc190eXBlICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX2FsbG9jYXRpb24gKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfc2FtcGxlciAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19zY3JpcHQgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfbWVzaCAqZHN0KTsKK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNDbGVhck9iamVjdChyc19wcm9ncmFtX2ZyYWdtZW50ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fdmVydGV4ICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyICpkc3QpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0NsZWFyT2JqZWN0KHJzX3Byb2dyYW1fc3RvcmUgKmRzdCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQ2xlYXJPYmplY3QocnNfZm9udCAqZHN0KTsKIAotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNlaWwoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2VpbChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjZWlsKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDMsIGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQxNiwgZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MiwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY2xhbXAoZmxvYXQzLCBmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjbGFtcChmbG9hdDQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0OCwgZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNsYW1wKGZsb2F0MTYsIGZsb2F0LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcHlzaWduKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29weXNpZ24oZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3B5c2lnbihmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBjb3MoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGNvcyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgY29zKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZGVncmVlcyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBkZWdyZWVzKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGRlZ3JlZXMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGV4cDIoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAyKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBleHAxMChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZXhwMTAoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmYWJzKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZhYnMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmFicyhmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZmxvb3IoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZsb29yKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1heChmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQxNiwgZmxvYXQxNik7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQyLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQzLCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtYXgoZmxvYXQ4LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWF4KGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtaW4oZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MTYsIGZsb2F0MTYpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0MywgZmxvYXQpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0NCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbWluKGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1pbihmbG9hdDE2LCBmbG9hdCk7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmbW9kKGZsb2F0MywgZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGZtb2QoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZm1vZChmbG9hdDE2LCBmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2coZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZyhmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbG9nMihmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cyKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzIoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGxvZzEwKGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBsb2cxMChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1heChmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtYXgoZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWF4KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWluKGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDIsIGZsb2F0Mik7Ci1leHRlcm4gZmxvYXQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDMsIGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1pbihmbG9hdDgsIGZsb2F0OCk7Ci1leHRlcm4gZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaW4oZmxvYXQxNiwgZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MywgZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQ0LCBmbG9hdDQsIGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDE2LCBmbG9hdDE2LCBmbG9hdDE2KTsKLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDIsIGZsb2F0MiwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBtaXgoZmxvYXQzLCBmbG9hdDMsIGZsb2F0KTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0NCwgZmxvYXQ0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIG1peChmbG9hdDgsIGZsb2F0OCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgbWl4KGZsb2F0MTYsIGZsb2F0MTYsIGZsb2F0KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHBvdyhmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQyLCBmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQzLCBmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ0LCBmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBwb3coZmxvYXQ4LCBmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcG93KGZsb2F0MTYsIGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmFkaWFucyhmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByYWRpYW5zKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJhZGlhbnMoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByaW50KGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJpbnQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcmludChmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcm91bmQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHJvdW5kKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSByc3FydChmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgcnNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaWduKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpZ24oZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2lnbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDIpOwotZXh0ZXJuIGZsb2F0MyBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzaW4oZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNpbihmbG9hdDgpOwotZXh0ZXJuIGZsb2F0MTYgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc2luKGZsb2F0MTYpOwotCi1leHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdCk7Ci1leHRlcm4gZmxvYXQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgc3FydChmbG9hdDMpOwotZXh0ZXJuIGZsb2F0NCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBzcXJ0KGZsb2F0NCk7Ci1leHRlcm4gZmxvYXQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHNxcnQoZmxvYXQxNik7Ci0KLWV4dGVybiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQpOwotZXh0ZXJuIGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGFuKGZsb2F0Myk7Ci1leHRlcm4gZmxvYXQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDQpOwotZXh0ZXJuIGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0YW4oZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRhbihmbG9hdDE2KTsKLQotZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0KTsKLWV4dGVybiBmbG9hdDIgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQyKTsKLWV4dGVybiBmbG9hdDMgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQzKTsKLWV4dGVybiBmbG9hdDQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ0KTsKLWV4dGVybiBmbG9hdDggX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdHJ1bmMoZmxvYXQ4KTsKLWV4dGVybiBmbG9hdDE2IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRydW5jKGZsb2F0MTYpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2VsZW1lbnQpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3R5cGUpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NhbXBsZXIpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3NjcmlwdCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfbWVzaCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV9mcmFnbWVudCk7CitleHRlcm4gYm9vbCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSXNPYmplY3QocnNfcHJvZ3JhbV92ZXJ0ZXgpOworZXh0ZXJuIGJvb2wgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0lzT2JqZWN0KHJzX3Byb2dyYW1fcmFzdGVyKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19wcm9ncmFtX3N0b3JlKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNJc09iamVjdChyc19mb250KTsKIAogCiAKKy8vIEFsbG9jYXRpb25zCisKKy8vIFJldHVybiB0aGUgcnNfYWxsb2NhdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib3VuZCBkYXRhCisvLyBwb2ludGVyLgorZXh0ZXJuIHJzX2FsbG9jYXRpb24gX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0dldEFsbG9jYXRpb24oY29uc3Qgdm9pZCAqKTsKKworLy8gTWFyayB0aGUgYWxsb2NhdGlvbiBkaXJ0eSBhbmQgbm90aWZ5IHRob3NlIHVzaW5nIGl0CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbk1hcmtEaXJ0eShyc19hbGxvY2F0aW9uKTsKKworLy8gUmV0dXJuIHRoZSBkaW1lbnNpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0aW9uLgorZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltWChyc19hbGxvY2F0aW9uKTsKK2V4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkdldERpbVkocnNfYWxsb2NhdGlvbik7CitleHRlcm4gdWludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25HZXREaW1aKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltTE9EKHJzX2FsbG9jYXRpb24pOworZXh0ZXJuIHVpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNBbGxvY2F0aW9uR2V0RGltRmFjZXMocnNfYWxsb2NhdGlvbik7CisKKy8vIEV4dHJhY3QgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGFuIGFsbG9jYXRpb24uCitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSk7CitleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3Qgeik7CisKKy8vIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIDAgKG9yIG1pbl92YWx1ZSkgYW5kIG1heF9tYWx1ZS4KK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoaW50IG1heF92YWx1ZSk7CitleHRlcm4gaW50IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGludCBtaW5fdmFsdWUsIGludCBtYXhfdmFsdWUpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNSYW5kKGZsb2F0IG1heF92YWx1ZSk7CitleHRlcm4gZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1JhbmQoZmxvYXQgbWluX3ZhbHVlLCBmbG9hdCBtYXhfdmFsdWUpOworCisvLyByZXR1cm4gdGhlIGZyYWN0aW9uYWwgcGFydCBvZiBhIGZsb2F0CisvLyBtaW4odiAtICgoaW50KWZsb29yKHYpKSwgMHgxLmZmZmZmZXAtMWYpOworZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNGcmFjKGZsb2F0KTsKKworLy8gdGltZQorZXh0ZXJuIGludDMyX3QgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlY29uZCh2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNNaW51dGUodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzSG91cih2b2lkKTsKK2V4dGVybiBpbnQzMl90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNEYXkodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzTW9udGgodm9pZCk7CitleHRlcm4gaW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzWWVhcih2b2lkKTsKKworLy8gUmV0dXJuIHRoZSBjdXJyZW50IHN5c3RlbSBjbG9jayBpbiBtaWxsaXNlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVNaWxsaXModm9pZCk7CisKKy8vIFJldHVybiB0aGUgY3VycmVudCBzeXN0ZW0gY2xvY2sgaW4gbmFub3NlY29uZHMKK2V4dGVybiBpbnQ2NF90IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNVcHRpbWVOYW5vcyh2b2lkKTsKKworLy8gUmV0dXJuIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgZnVuY3Rpb24gd2FzIGxhc3QgY2FsbGVkIGluIHRoaXMgc2NyaXB0LgorZXh0ZXJuIGZsb2F0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNHZXREdCh2b2lkKTsKKworLy8gU2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50LiAgV2lsbCBub3QgYmxvY2sgYW5kIHJldHVybnMgdHJ1ZQorLy8gaWYgdGhlIG1lc3NhZ2Ugd2FzIHNlbmRhYmxlIGFuZCBmYWxzZSBpZiB0aGUgZmlmbyB3YXMgZnVsbC4KKy8vIEEgbWVzc2FnZSBJRCBpcyByZXF1aXJlZC4gIERhdGEgcGF5bG9hZCBpcyBvcHRpb25hbC4KK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElEKTsKK2V4dGVybiBib29sIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNTZW5kVG9DbGllbnQoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CisKKy8vIFNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIGNsaWVudCwgYmxvY2tpbmcgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcXVldWVkLgorLy8gQSBtZXNzYWdlIElEIGlzIHJlcXVpcmVkLiAgRGF0YSBwYXlsb2FkIGlzIG9wdGlvbmFsLgorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKGludCBjbWRJRCk7CitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoaW50IGNtZElELCBjb25zdCB2b2lkICpkYXRhLCB1aW50IGxlbik7CiAKIAorLy8gU2NyaXB0IHRvIFNjcmlwdAorZW51bSByc19mb3JfZWFjaF9zdHJhdGVneSB7CisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfU0VSSUFMLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX0RPTlRfQ0FSRSwKKyAgICBSU19GT1JfRUFDSF9TVFJBVEVHWV9EU1RfTElORUFSLAorICAgIFJTX0ZPUl9FQUNIX1NUUkFURUdZX1RJTEVfU01BTEwsCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9NRURJVU0sCisgICAgUlNfRk9SX0VBQ0hfU1RSQVRFR1lfVElMRV9MQVJHRQorfTsKIAotLy8gSW50IG9wcwordHlwZWRlZiBzdHJ1Y3QgcnNfc2NyaXB0X2NhbGwgeworICAgIGVudW0gcnNfZm9yX2VhY2hfc3RyYXRlZ3kgc3RyYXRlZ3k7CisgICAgdWludDMyX3QgeFN0YXJ0OworICAgIHVpbnQzMl90IHhFbmQ7CisgICAgdWludDMyX3QgeVN0YXJ0OworICAgIHVpbnQzMl90IHlFbmQ7CisgICAgdWludDMyX3QgelN0YXJ0OworICAgIHVpbnQzMl90IHpFbmQ7CisgICAgdWludDMyX3QgYXJyYXlTdGFydDsKKyAgICB1aW50MzJfdCBhcnJheUVuZDsKK30gcnNfc2NyaXB0X2NhbGxfdDsKIAotZXh0ZXJuIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50KTsKLWV4dGVybiBpbnQyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQyKTsKLWV4dGVybiBpbnQzIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQzKTsKLWV4dGVybiBpbnQ0IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ0KTsKLWV4dGVybiBpbnQ4IF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIGFicyhpbnQ4KTsKLWV4dGVybiBpbnQxNiBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBhYnMoaW50MTYpOworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhKTsKIAorZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0ZvckVhY2gocnNfc2NyaXB0IHNjcmlwdCwgcnNfYWxsb2NhdGlvbiBpbnB1dCwKKyAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbiBvdXRwdXQsIGNvbnN0IHZvaWQgKiB1c3JEYXRhLAorICAgICAgICAgICAgICBjb25zdCByc19zY3JpcHRfY2FsbF90ICopOwogCi0KLS8qCi1leHRlcm4gZmxvYXQgbW9kZihmbG9hdCwgZmxvYXQpOwotZXh0ZXJuIGZsb2F0IHJhbmRmKGZsb2F0KTsKLWV4dGVybiBmbG9hdCByYW5kZjIoZmxvYXQsIGZsb2F0KTsKLWV4dGVybiBmbG9hdCBmcmFjZihmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbGVycGYoZmxvYXQsIGZsb2F0LCBmbG9hdCk7Ci1leHRlcm4gZmxvYXQgbWFwZihmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQpOwotKi8KLQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAppbmRleCA0MTk4YTc0Li5kZDQyOTcyIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKQEAgLTIsNzAgKzIsNzMgQEAKIHR5cGVkZWYgY2hhciBpbnQ4X3Q7CiB0eXBlZGVmIHNob3J0IGludDE2X3Q7CiB0eXBlZGVmIGludCBpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1aW50MTZfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotLy90eXBlZGVmIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKIAogdHlwZWRlZiB1aW50OF90IHVjaGFyOwogdHlwZWRlZiB1aW50MTZfdCB1c2hvcnQ7CiB0eXBlZGVmIHVpbnQzMl90IHVpbnQ7Ci0vL3R5cGVkZWYgdWludDY0X3QgdWxvbmc7Cit0eXBlZGVmIHVpbnQ2NF90IHVsb25nOwogCi10eXBlZGVmIGludCByc19lbGVtZW50OwotdHlwZWRlZiBpbnQgcnNfdHlwZTsKLXR5cGVkZWYgaW50IHJzX2FsbG9jYXRpb247Ci10eXBlZGVmIGludCByc19zYW1wbGVyOwotdHlwZWRlZiBpbnQgcnNfc2NyaXB0OwotdHlwZWRlZiBpbnQgcnNfbWVzaDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fZnJhZ21lbnQ7Ci10eXBlZGVmIGludCByc19wcm9ncmFtX3ZlcnRleDsKLXR5cGVkZWYgaW50IHJzX3Byb2dyYW1fcmFzdGVyOwotdHlwZWRlZiBpbnQgcnNfcHJvZ3JhbV9zdG9yZTsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX2VsZW1lbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc190eXBlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfYWxsb2NhdGlvbjsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3NhbXBsZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19zY3JpcHQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19tZXNoOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9mcmFnbWVudDsKK3R5cGVkZWYgc3RydWN0IHsgY29uc3QgaW50KiBjb25zdCBwOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIHJzX3Byb2dyYW1fdmVydGV4OwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfcHJvZ3JhbV9yYXN0ZXI7Cit0eXBlZGVmIHN0cnVjdCB7IGNvbnN0IGludCogY29uc3QgcDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQsIGFsaWduZWQoNCkpKSByc19wcm9ncmFtX3N0b3JlOwordHlwZWRlZiBzdHJ1Y3QgeyBjb25zdCBpbnQqIGNvbnN0IHA7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkLCBhbGlnbmVkKDQpKSkgcnNfZm9udDsKKwogCiB0eXBlZGVmIGZsb2F0IGZsb2F0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgZmxvYXQgZmxvYXQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBmbG9hdCBmbG9hdDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIGZsb2F0IGZsb2F0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgZmxvYXQgZmxvYXQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgdWNoYXIgdWNoYXIyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1Y2hhciB1Y2hhcjMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVjaGFyIHVjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgdWNoYXIgdWNoYXI4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1Y2hhciB1Y2hhcjE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1c2hvcnQgdXNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgdXNob3J0IHVzaG9ydDMgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDMpKSk7CiB0eXBlZGVmIHVzaG9ydCB1c2hvcnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1c2hvcnQgdXNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgdXNob3J0IHVzaG9ydDE2IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgxNikpKTsKIAogdHlwZWRlZiB1aW50IHVpbnQyIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgyKSkpOwogdHlwZWRlZiB1aW50IHVpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiB1aW50IHVpbnQ0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg0KSkpOwotdHlwZWRlZiB1aW50IHVpbnQ4IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg4KSkpOwotdHlwZWRlZiB1aW50IHVpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgY2hhciBjaGFyMiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgY2hhciBjaGFyMyBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMykpKTsKIHR5cGVkZWYgY2hhciBjaGFyNCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyOCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgY2hhciBjaGFyMTYgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDE2KSkpOwogCiB0eXBlZGVmIHNob3J0IHNob3J0MiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMikpKTsKIHR5cGVkZWYgc2hvcnQgc2hvcnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBzaG9ydCBzaG9ydDQgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDQpKSk7Ci10eXBlZGVmIHNob3J0IHNob3J0OCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoOCkpKTsKLXR5cGVkZWYgc2hvcnQgc2hvcnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIHR5cGVkZWYgaW50IGludDIgX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDIpKSk7CiB0eXBlZGVmIGludCBpbnQzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOwogdHlwZWRlZiBpbnQgaW50NCBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKTsKLXR5cGVkZWYgaW50IGludDggX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKDgpKSk7Ci10eXBlZGVmIGludCBpbnQxNiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoMTYpKSk7CiAKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1bMTZdOworfSByc19tYXRyaXg0eDQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzldOworfSByc19tYXRyaXgzeDM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBtWzRdOworfSByc19tYXRyaXgyeDI7CisKK3R5cGVkZWYgZmxvYXQ0IHJzX3F1YXRlcm5pb247CisKKyNkZWZpbmUgUlNfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpCiAKZGlmZiAtLWdpdCBhL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcCBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcAppbmRleCAzOGIyZmFlLi5hNDNiNDQwMiAxMDA2NDQKLS0tIGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU2hhcmVkQnVmZmVyU3RhY2suY3BwCisrKyBiL2xpYnMvc3VyZmFjZWZsaW5nZXJfY2xpZW50L1NoYXJlZEJ1ZmZlclN0YWNrLmNwcApAQCAtMzc2LDExICszNzYsNiBAQAogewogICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwogCi0gICAgaWYgKHN0YWNrLmhlYWQgPT0gdGFpbCAmJiBzdGFjay5hdmFpbGFibGUgPT0gbU51bUJ1ZmZlcnMpIHsKLSAgICAgICAgTE9HVygiZGVxdWV1ZTogdGFpbD0lZCwgaGVhZD0lZCwgYXZhaWw9JWQsIHF1ZXVlZD0lZCIsCi0gICAgICAgICAgICAgICAgdGFpbCwgc3RhY2suaGVhZCwgc3RhY2suYXZhaWxhYmxlLCBzdGFjay5xdWV1ZWQpOwotICAgIH0KLQogICAgIFJXTG9jazo6QXV0b1JMb2NrIF9yZChtTG9jayk7CiAKICAgICBjb25zdCBuc2Vjc190IGRlcXVldWVUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlcl9jbGllbnQvU3VyZmFjZS5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAppbmRleCBjYjc2MDkxLi4yYmM1ZmFkIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyX2NsaWVudC9TdXJmYWNlLmNwcApAQCAtMzYzLDYgKzM2MywxMyBAQAogICAgICAgICBoZWlnaHQgICA9IHN1cmZhY2UtPm1IZWlnaHQ7CiAgICAgICAgIGZvcm1hdCAgID0gc3VyZmFjZS0+bUZvcm1hdDsKICAgICAgICAgZmxhZ3MgICAgPSBzdXJmYWNlLT5tRmxhZ3M7CisgICAgfSBlbHNlIGlmIChzdXJmYWNlICE9IDAgJiYgc3VyZmFjZS0+bVN1cmZhY2UgIT0gMCkgeworICAgICAgICBMT0dXKCJQYXJjZWxpbmcgaW52YWxpZCBzdXJmYWNlIHdpdGggbm9uLU5VTEwgSVN1cmZhY2UgYXMgTlVMTDogIgorICAgICAgICAgICAgICJtU3VyZmFjZSA9ICVwLCBtSWRlbnRpdHkgPSAlZCwgbVdpZHRoID0gJWQsIG1IZWlnaHQgPSAlZCwgIgorICAgICAgICAgICAgICJtRm9ybWF0ID0gJWQsIG1GbGFncyA9IDB4JTA4eCwgbUluaXRDaGVjayA9ICVkIiwKKyAgICAgICAgICAgICBzdXJmYWNlLT5tU3VyZmFjZS5nZXQoKSwgc3VyZmFjZS0+bUlkZW50aXR5LCBzdXJmYWNlLT5tV2lkdGgsCisgICAgICAgICAgICAgc3VyZmFjZS0+bUhlaWdodCwgc3VyZmFjZS0+bUZvcm1hdCwgc3VyZmFjZS0+bUZsYWdzLAorICAgICAgICAgICAgIHN1cmZhY2UtPm1Jbml0Q2hlY2spOwogICAgIH0KICAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN1ciE9MCA/IHN1ci0+YXNCaW5kZXIoKSA6IE5VTEwpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7CkBAIC00MzYsNiArNDQzLDkgQEAKICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQgPSBuZXcgU2hhcmVkQnVmZmVyQ2xpZW50KAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLCB0b2tlbiwgMiwgbUlkZW50aXR5KTsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLT52YWxpZGF0ZSh0b2tlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJOb3QgaW5pdGlhbGl6aW5nIHRoZSBzaGFyZWQgYnVmZmVyIGNsaWVudCBiZWNhdXNlIHRva2VuID0gJWQiLAorICAgICAgICAgICAgICAgICAgICB0b2tlbik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwIGIvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAppbmRleCA4MzQ1Y2MzLi45MWU3ZGYzIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKQEAgLTMxNyw2ICszMTcsMTIgQEAKICAgICAgICAgICAgIG1TdHJpbmdQb29sU2l6ZSA9CiAgICAgICAgICAgICAgICAgKG1IZWFkZXItPmhlYWRlci5zaXplLW1IZWFkZXItPnN0cmluZ3NTdGFydCkvY2hhclNpemU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaGVjayBpbnZhcmlhbnQ6IHN0eWxlcyBzdGFydHMgYmVmb3JlIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBpZiAobUhlYWRlci0+c3R5bGVzU3RhcnQgPj0gKG1IZWFkZXItPmhlYWRlci5zaXplLXNpemVvZih1aW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiQmFkIHN0eWxlIGJsb2NrOiBzdHlsZSBibG9jayBzdGFydHMgYXQgJWQgcGFzdCBkYXRhIHNpemUgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbUhlYWRlci0+c3R5bGVzU3RhcnQsIChpbnQpbUhlYWRlci0+aGVhZGVyLnNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAobUVycm9yPUJBRF9UWVBFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIGludmFyaWFudDogc3R5bGVzIGZvbGxvdyB0aGUgc3RyaW5ncwogICAgICAgICAgICAgaWYgKG1IZWFkZXItPnN0eWxlc1N0YXJ0IDw9IG1IZWFkZXItPnN0cmluZ3NTdGFydCkgewogICAgICAgICAgICAgICAgIExPR1coIkJhZCBzdHlsZSBibG9jazogc3R5bGUgYmxvY2sgc3RhcnRzIGF0ICVkLCBiZWZvcmUgc3RyaW5ncyBhdCAlZFxuIiwKQEAgLTE4NzgsNiArMTg4NCwxMiBAQAogICAgICAgICBvdXROYW1lLT50eXBlID0gZ3JwLT5iYXNlUGFja2FnZS0+dHlwZVN0cmluZ3Muc3RyaW5nQXQodCwgJm91dE5hbWUtPnR5cGVMZW4pOwogICAgICAgICBvdXROYW1lLT5uYW1lID0gZ3JwLT5iYXNlUGFja2FnZS0+a2V5U3RyaW5ncy5zdHJpbmdBdCgKICAgICAgICAgICAgIGR0b2hsKGVudHJ5LT5rZXkuaW5kZXgpLCAmb3V0TmFtZS0+bmFtZUxlbik7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGJhZCBpbmRleCBmb3Igc29tZSByZWFzb24sIHdlIHNob3VsZCBhYm9ydC4KKyAgICAgICAgaWYgKG91dE5hbWUtPnR5cGUgPT0gTlVMTCB8fCBvdXROYW1lLT5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMjYwOSw2ICsyNjIxLDI0IEBACiAgICAgICAgICpvdXRUeXBlID0gKmRlZlR5cGU7CiAgICAgfQogICAgICpvdXROYW1lID0gU3RyaW5nMTYocCwgZW5kLXApOworICAgIGlmKCoqb3V0UGFja2FnZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgcGFja2FnZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0VHlwZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgdHlwZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmKCoqb3V0TmFtZSA9PSAwKSB7CisgICAgICAgIGlmKG91dEVycm9yTXNnKSB7CisgICAgICAgICAgICAqb3V0RXJyb3JNc2cgPSAiUmVzb3VyY2UgaWQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDEyNywxMyArNDE1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICBzcGVjIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogZmxhZ3M9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0b2hsKHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2VudHJ5SW5kZXhdKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy0+Z2V0UmVzb3VyY2VOYW1lKHJlc0lELCAmcmVzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIHNwZWMgcmVzb3VyY2UgMHglMDh4ICVzOiVzLyVzOiBmbGFncz0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUudHlwZSwgcmVzTmFtZS50eXBlTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS5uYW1lLCByZXNOYW1lLm5hbWVMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obCh0eXBlQ29uZmlncy0+dHlwZVNwZWNGbGFnc1tlbnRyeUluZGV4XSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgIElOVkFMSUQgVFlQRSBDT05GSUcgRk9SIFJFU09VUkNFIDB4JTA4eFxuIiwgcmVzSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGNvbmZpZ0luZGV4PTA7IGNvbmZpZ0luZGV4PE5UQzsgY29uZmlnSW5kZXgrKykgewpAQCAtNDM0MCwxMSArNDM3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgwMGZmMDAwMCAmICgodHlwZUluZGV4KzEpPDwxNikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDAwMDBmZmZmICYgKGVudHJ5SW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX25hbWUgcmVzTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQVIxNl9UT19DU1RSKHJlc05hbWUucGFja2FnZSwgcmVzTmFtZS5wYWNrYWdlTGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUjE2X1RPX0NTVFIocmVzTmFtZS50eXBlLCByZXNOYW1lLnR5cGVMZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMtPmdldFJlc291cmNlTmFtZShyZXNJRCwgJnJlc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgIHJlc291cmNlIDB4JTA4eCAlczolcy8lczogIiwgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnBhY2thZ2UsIHJlc05hbWUucGFja2FnZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLnR5cGUsIHJlc05hbWUudHlwZUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSMTZfVE9fQ1NUUihyZXNOYW1lLm5hbWUsIHJlc05hbWUubmFtZUxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgICAgICAgSU5WQUxJRCBSRVNPVVJDRSAweCUwOHg6ICIsIHJlc0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpc09mZnNldCYweDMpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIk5PTi1JTlRFR0VSIE9GRlNFVDogJXBcbiIsICh2b2lkKil0aGlzT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MDIsMTggKzQ0MzgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdmFsdWUocGtnLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiYWdQdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgTiA9IGR0b2hsKGJhZ1B0ci0+Y291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNUYWJsZV9tYXAqIG1hcFB0ciA9IChjb25zdCBSZXNUYWJsZV9tYXAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNvbnN0IHVpbnQ4X3QqKWVudCkgKyBlc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJhc2VNYXBQdHIgPSAoY29uc3QgdWludDhfdCopZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlc1RhYmxlX21hcCogbWFwUHRyID0gKFJlc1RhYmxlX21hcCopKGJhc2VNYXBQdHIrbWFwT2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgUGFyZW50PTB4JTA4eCwgQ291bnQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdG9obChiYWdQdHItPnBhcmVudC5pZGVudCksIE4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOICYmIG1hcE9mZnNldCA8ICh0eXBlU2l6ZS1zaXplb2YoUmVzVGFibGVfbWFwKSk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgIyVpIChLZXk9MHglMDh4KTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBkdG9obChtYXBQdHItPm5hbWUuaWRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmNvcHlGcm9tX2R0b2gobWFwUHRyLT52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF92YWx1ZShwa2csIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gZHRvaHMobWFwUHRyLT52YWx1ZS5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFB0ciA9IChSZXNUYWJsZV9tYXAqKSgoKGNvbnN0IHVpbnQ4X3QqKW1hcFB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplICsgc2l6ZW9mKCptYXBQdHIpLXNpemVvZihtYXBQdHItPnZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPZmZzZXQgKz0gc2l6ZSArIHNpemVvZigqbWFwUHRyKS1zaXplb2YobWFwUHRyLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQdHIgPSAoUmVzVGFibGVfbWFwKikoYmFzZU1hcFB0cittYXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnkuYWlkbCBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworcGFyY2VsYWJsZSBDb3VudHJ5OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5LmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNjMDU0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgY291bnRyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBtb2JpbGUgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPVU5UUllfU09VUkNFX05FVFdPUksgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20gdGhlIGxvY2F0aW9uIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBVElPTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnRyeSBjb2RlIHdhcyByZWFkIGZyb20gdGhlIFNJTSBjYXJkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlRSWV9TT1VSQ0VfU0lNID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb3VudHJ5IGNvZGUgY2FtZSBmcm9tIHRoZSBzeXN0ZW0gbG9jYWxlIHNldHRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1VOVFJZX1NPVVJDRV9MT0NBTEUgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Db3VudHJ5SXNvOworCisgICAgLyoqCisgICAgICogV2hlcmUgdGhlIGNvdW50cnkgY29kZSBjYW1lIGZyb20uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVNvdXJjZTsKKworICAgIHByaXZhdGUgaW50IG1IYXNoQ29kZTsKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5SXNvIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gc291cmNlIHdoZXJlIHRoZSBjb3VudHJ5SXNvIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93CisgICAgICogICAgICAgIHZhbHVlcworICAgICAqICAgICAgICA8cD4KKyAgICAgKiAgICAgICAgPHVsPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX0xPQ0FUSU9OfTwvbGk+CisgICAgICogICAgICAgIDxsaT57QGxpbmsgI0NPVU5UUllfU09VUkNFX1NJTX08L2xpPgorICAgICAqICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeShmaW5hbCBTdHJpbmcgY291bnRyeUlzbywgZmluYWwgaW50IHNvdXJjZSkgeworICAgICAgICBpZiAoY291bnRyeUlzbyA9PSBudWxsIHx8IHNvdXJjZSA8IENPVU5UUllfU09VUkNFX05FVFdPUksKKyAgICAgICAgICAgICAgICB8fCBzb3VyY2UgPiBDT1VOVFJZX1NPVVJDRV9MT0NBTEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBtQ291bnRyeUlzbyA9IGNvdW50cnlJc28udG9Mb3dlckNhc2UoKTsKKyAgICAgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ291bnRyeShDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgbUNvdW50cnlJc28gPSBjb3VudHJ5Lm1Db3VudHJ5SXNvOworICAgICAgICBtU291cmNlID0gY291bnRyeS5tU291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb3VudHJ5SXNvKCkgeworICAgICAgICByZXR1cm4gbUNvdW50cnlJc287CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB3aGVyZSB0aGUgY291bnRyeSBjb2RlIGNhbWUgZnJvbSwgY291bGQgYmUgb25lIG9mIGJlbG93IHZhbHVlcworICAgICAqICAgICAgICAgPHA+CisgICAgICogICAgICAgICA8dWw+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9ORVRXT1JLfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBVElPTn08L2xpPgorICAgICAqICAgICAgICAgPGxpPntAbGluayAjQ09VTlRSWV9TT1VSQ0VfU0lNfTwvbGk+CisgICAgICogICAgICAgICA8bGk+e0BsaW5rICNDT1VOVFJZX1NPVVJDRV9MT0NBTEV9PC9saT4KKyAgICAgKiAgICAgICAgIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+IENSRUFUT1IgPSBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPENvdW50cnk+KCkgeworICAgICAgICBwdWJsaWMgQ291bnRyeSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGluLnJlYWRTdHJpbmcoKSwgaW4ucmVhZEludCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5W10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ291bnRyeVtzaXplXTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIHBhcmNlbCwgaW50IGZsYWdzKSB7CisgICAgICAgIHBhcmNlbC53cml0ZVN0cmluZyhtQ291bnRyeUlzbyk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtU291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb3VudHJ5KSB7CisgICAgICAgICAgICBDb3VudHJ5IGMgPSAoQ291bnRyeSkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5SXNvLmVxdWFscyhjLmdldENvdW50cnlJc28oKSkgJiYgbVNvdXJjZSA9PSBjLmdldFNvdXJjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IG1IYXNoQ29kZTsKKyAgICAgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgICAgICAgaGFzaCA9IDE3OworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAxMyArIG1Db3VudHJ5SXNvLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDEzICsgbVNvdXJjZTsKKyAgICAgICAgICAgIG1IYXNoQ29kZSA9IGhhc2g7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1IYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBzcGVjaWZpZWQgY291bnRyeSB0byB0aGlzIGNvdW50cnkgb2JqZWN0IGlnbm9yaW5nIHRoZSBtU291cmNlCisgICAgICogZmllbGQsIHJldHVybiB0cnVlIGlmIHRoZSBjb3VudHJ5SXNvIGZpZWxkcyBhcmUgZXF1YWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5IHRoZSBjb3VudHJ5IHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb3VudHJ5J3MgY291bnRyeUlzbyBmaWVsZCBpcyBlcXVhbCB0byB0aGlzCisgICAgICogICAgICAgICBjb3VudHJ5J3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVTb3VyY2UoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5ICE9IG51bGwgJiYgbUNvdW50cnlJc28uZXF1YWxzKGNvdW50cnkuZ2V0Q291bnRyeUlzbygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEgYi9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3ODBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gY291bnRyeSBkZXRlY3RvciBzZXJ2aWNlLiBUaGlzCisgKiBzZXJ2aWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4uCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IHdpbGwgYmUgZGV0ZWN0ZWQgaW4gb3JkZXIgb2YgcmVsaWFiaWxpdHksIGxpa2UKKyAqIDx1bD4KKyAqIDxsaT5Nb2JpbGUgbmV0d29yazwvbGk+CisgKiA8bGk+TG9jYXRpb248L2xpPgorICogPGxpPlNJTSdzIGNvdW50cnk8L2xpPgorICogPGxpPlBob25lJ3MgbG9jYWxlPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIENhbGwgdGhlIHtAbGluayAjZGV0ZWN0Q291bnRyeSgpfSB0byBnZXQgdGhlIGF2YWlsYWJsZSBjb3VudHJ5IGltbWVkaWF0ZWx5LgorICogPHA+CisgKiBUbyBiZSBub3RpZmllZCBvZiB0aGUgZnV0dXJlIGNvdW50cnkgY2hhbmdlLCB1c2UgdGhlCisgKiB7QGxpbmsgI2FkZENvdW50cnlMaXN0ZW5lcn0KKyAqIDxwPgorICogPHA+CisgKiBZb3UgZG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHk7IGluc3RlYWQsIHJldHJpZXZlIGl0IHRocm91Z2gKKyAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRTeXN0ZW1TZXJ2aWNlCisgKiBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKX0uCisgKiA8cD4KKyAqIEJvdGggQUNDRVNTX0ZJTkVfTE9DQVRJT04gYW5kIEFDQ0VTU19DT0FSU0VfTE9DQVRJT04gcGVybWlzc2lvbnMgYXJlIG5lZWRlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ291bnRyeURldGVjdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB0byB3cmFwIHRoZSBJQ291bnRyeUxpc3RlbmVyLlN0dWIgYW5kIENvdW50cnlMaXN0ZW5lciBvYmplY3RzCisgICAgICogdG9nZXRoZXIuIFRoZSBDb3VudHJ5TGlzdGVuZXIgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZSBzcGVjaWZpYworICAgICAqIGxvb3BlciBvbmNlIHRoZSBjb3VudHJ5IGNoYW5nZWQgYW5kIGRldGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIExpc3RlbmVyVHJhbnNwb3J0IGV4dGVuZHMgSUNvdW50cnlMaXN0ZW5lci5TdHViIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgICAgIHB1YmxpYyBMaXN0ZW5lclRyYW5zcG9ydChDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgaWYgKGxvb3BlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihsb29wZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChmaW5hbCBDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3IiOworICAgIHByaXZhdGUgZmluYWwgSUNvdW50cnlEZXRlY3RvciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4gbUxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIEBoaWRlIC0gaGlkZSB0aGlzIGNvbnN0cnVjdG9yIGJlY2F1c2UgaXQgaGFzIGEgcGFyYW1ldGVyIG9mIHR5cGUKKyAgICAgKiAgICAgICBJQ291bnRyeURldGVjdG9yLCB3aGljaCBpcyBhIHN5c3RlbSBwcml2YXRlIGNsYXNzLiBUaGUgcmlnaHQgd2F5IHRvCisgICAgICogICAgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNpbmcgdGhlIGZhY3RvcnkKKyAgICAgKiAgICAgICBDb250ZXh0LmdldFN5c3RlbVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvcihJQ291bnRyeURldGVjdG9yIHNlcnZpY2UpIHsKKyAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICBtTGlzdGVuZXJzID0gbmV3IEhhc2hNYXA8Q291bnRyeUxpc3RlbmVyLCBMaXN0ZW5lclRyYW5zcG9ydD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsCisgICAgICogICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImRldGVjdENvdW50cnk6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSBub3RpZmljYXRpb24gd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZAorICAgICAqIG9yIGNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY291bnRyeSBpcyBkZXRlY3RlZCBvciBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBsb29wZXIgYSBMb29wZXIgb2JqZWN0IHdob3NlIG1lc3NhZ2UgcXVldWUgd2lsbCBiZSB1c2VkIHRvCisgICAgICogICAgICAgIGltcGxlbWVudCB0aGUgY2FsbGJhY2sgbWVjaGFuaXNtLiBJZiBsb29wZXIgaXMgbnVsbCB0aGVuIHRoZQorICAgICAqICAgICAgICBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIsIExvb3BlciBsb29wZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpZiAoIW1MaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IExpc3RlbmVyVHJhbnNwb3J0KGxpc3RlbmVyLCBsb29wZXIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLmFkZENvdW50cnlMaXN0ZW5lcih0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhZGRDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgeworICAgICAgICAgICAgTGlzdGVuZXJUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbUxpc3RlbmVycy5nZXQobGlzdGVuZXIpOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5yZW1vdmVDb3VudHJ5TGlzdGVuZXIodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJyZW1vdmVDb3VudHJ5TGlzdGVuZXI6IFJlbW90ZUV4Y2VwdGlvbiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YSBiL2xvY2F0aW9uL2phdmEvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0NvdW50cnlMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC5sb2NhdGlvbjsKKworLyoqCisgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IKKyAqIGNoYW5nZWQKKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvdW50cnlMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogQHBhcmFtIGNvdW50cnkgdGhlIGNoYW5nZWQgb3IgZGV0ZWN0ZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSk7Cit9CmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFmMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5RGV0ZWN0b3IuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgQVBJIGZvciBkZXRlY3RpbmcgdGhlIGNvdW50cnkgd2hlcmUgdGhlIHVzZXIgaXMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUNvdW50cnlEZXRlY3RvcgoreworICAgIC8qKgorICAgICAqIFN0YXJ0IGRldGVjdGluZyB0aGUgY291bnRyeSB0aGF0IHRoZSB1c2VyIGlzIGluLgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIENvdW50cnkgZGV0ZWN0Q291bnRyeSgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUNvdW50cnlMaXN0ZW5lcihpbiBJQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9sb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbG9jYXRpb24vamF2YS9hbmRyb2lkL2xvY2F0aW9uL0lDb3VudHJ5TGlzdGVuZXIuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworLyoqCisgKiB7QGhpZGV9CisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUNvdW50cnlMaXN0ZW5lcgoreworICAgIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoaW4gQ291bnRyeSBjb3VudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhIGIvbG9jYXRpb24vdGVzdHMvbG9jYXRpb250ZXN0cy9zcmMvYW5kcm9pZC9sb2NhdGlvbi9Db3VudHJ5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwMmQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2F0aW9uL3Rlc3RzL2xvY2F0aW9udGVzdHMvc3JjL2FuZHJvaWQvbG9jYXRpb24vQ291bnRyeVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubG9jYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ291bnRyeVRlc3RlciBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50cnlFcXVhbHMoKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeUEgPSBuZXcgQ291bnRyeSgiVVMiLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX05FVFdPUkspOworICAgICAgICBDb3VudHJ5IGNvdW50cnlCID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlDID0gbmV3IENvdW50cnkoIkNOIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9MT0NBTEUpOworICAgICAgICBDb3VudHJ5IGNvdW50cnlEID0gbmV3IENvdW50cnkoInVzIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5QS5lcXVhbHNJZ25vcmVTb3VyY2UoY291bnRyeUIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeUEuZXF1YWxzSWdub3JlU291cmNlKGNvdW50cnlDKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5QykpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmVxdWFscyhjb3VudHJ5RCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlBLmhhc2hDb2RlKCkgPT0gY291bnRyeUQuaGFzaENvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0LmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQppbmRleCBmMWZhMWU4Li4zMWU0NjMxIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YQpAQCAtMzEsOSArMzEsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0lOVkFMSUQgPSAwOwogICAgIC8qKiBEZWZhdWx0IGF1ZGlvIGRhdGEgZm9ybWF0ICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfREVGQVVMVCA9IDE7Ci0gICAgLyoqIEF1ZGlvIGRhdGEgZm9ybWF0OiBQQ00gMTYgYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSAxNiBiaXQgcGVyIHNhbXBsZS4gR3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fMTZCSVQgPSAyOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQotICAgIC8qKiBBdWRpbyBkYXRhIGZvcm1hdDogUENNIDggYml0IHBlciBzYW1wbGUgKi8KKyAgICAvKiogQXVkaW8gZGF0YSBmb3JtYXQ6IFBDTSA4IGJpdCBwZXIgc2FtcGxlLiBOb3QgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgZGV2aWNlcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19QQ01fOEJJVCA9IDM7ICAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgY29kZQogCiAgICAgLyoqIEludmFsaWQgYXVkaW8gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9NYW5hZ2VyLmphdmEKaW5kZXggYmJiYmE3NC4uYjIzZGNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvTWFuYWdlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIuamF2YQpAQCAtMTUyNSw0ICsxNTI1LDIyIEBACiAgICAgICAqIHtAaGlkZX0KICAgICAgICovCiAgICAgIHByaXZhdGUgSUJpbmRlciBtSUNhbGxCYWNrID0gbmV3IEJpbmRlcigpOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBob25lIGlzIGluIHNpbGVudCBtb2RlLCB3aXRoIG9yIHdpdGhvdXQgdmlicmF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwaG9uZSBpcyBpbiBzaWxlbnQgbW9kZSwgd2l0aCBvciB3aXRob3V0IHZpYnJhdGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRSaW5nZXJNb2RlKCkKKyAgICAgKgorICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIENvdW5jaWwgYXBwcm92YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbGVudE1vZGUoKSB7CisgICAgICAgIGludCByaW5nZXJNb2RlID0gZ2V0UmluZ2VyTW9kZSgpOworICAgICAgICBib29sZWFuIHNpbGVudE1vZGUgPQorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfU0lMRU5UKSB8fAorICAgICAgICAgICAgKHJpbmdlck1vZGUgPT0gUklOR0VSX01PREVfVklCUkFURSk7CisgICAgICAgIHJldHVybiBzaWxlbnRNb2RlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQppbmRleCBjNDhlYWFkLi5jNTY3YTZlIDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQpAQCAtMTk0LDExICsxOTQsMTMgQEAKICAgICAgKiBDbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIHJlY29yZGluZyBzb3VyY2UuIFNlZSB7QGxpbmsgTWVkaWFSZWNvcmRlci5BdWRpb1NvdXJjZX0gZm9yCiAgICAgICogICAgcmVjb3JkaW5nIHNvdXJjZSBkZWZpbml0aW9ucy4KLSAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogdGhlIHNhbXBsZSByYXRlIGV4cHJlc3NlZCBpbiBIZXJ0ei4gRXhhbXBsZXMgb2YgcmF0ZXMgYXJlIChidXQKLSAgICAgKiAgIG5vdCBsaW1pdGVkIHRvKSA0NDEwMCwgMjIwNTAgYW5kIDExMDI1LgorICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiB0aGUgc2FtcGxlIHJhdGUgZXhwcmVzc2VkIGluIEhlcnR6LiA0NDEwMEh6IGlzIGN1cnJlbnRseSB0aGUgb25seQorICAgICAqICAgcmF0ZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gd29yayBvbiBhbGwgZGV2aWNlcywgYnV0IG90aGVyIHJhdGVzIHN1Y2ggYXMgMjIwNTAsCisgICAgICogICAxNjAwMCwgYW5kIDExMDI1IG1heSB3b3JrIG9uIHNvbWUgZGV2aWNlcy4KICAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZXNjcmliZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGF1ZGlvIGNoYW5uZWxzLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBhbmQKLSAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30KKyAgICAgKiAgIHtAbGluayBBdWRpb0Zvcm1hdCNDSEFOTkVMX0lOX1NURVJFT30uICB7QGxpbmsgQXVkaW9Gb3JtYXQjQ0hBTk5FTF9JTl9NT05PfSBpcyBndWFyYW50ZWVkCisgICAgICogICB0byB3b3JrIG9uIGFsbCBkZXZpY2VzLgogICAgICAqIEBwYXJhbSBhdWRpb0Zvcm1hdCB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBhdWRpbyBkYXRhIGlzIHJlcHJlc2VudGVkLiAKICAgICAgKiAgIFNlZSB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzE2QklUfSBhbmQgCiAgICAgICogICB7QGxpbmsgQXVkaW9Gb3JtYXQjRU5DT0RJTkdfUENNXzhCSVR9CkBAIC00NDQsNiArNDQ2LDggQEAKICAgICAgKiAgb3Ige0BsaW5rICNFUlJPUn0gaWYgdGhlIGltcGxlbWVudGF0aW9uIHdhcyB1bmFibGUgdG8gcXVlcnkgdGhlIGhhcmR3YXJlIGZvciBpdHMgCiAgICAgICogIG91dHB1dCBwcm9wZXJ0aWVzLCAKICAgICAgKiAgIG9yIHRoZSBtaW5pbXVtIGJ1ZmZlciBzaXplIGV4cHJlc3NlZCBpbiBieXRlcy4KKyAgICAgKiBAc2VlICNBdWRpb1JlY29yZChpbnQsIGludCwgaW50LCBpbnQsIGludCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdmFsaWQKKyAgICAgKiAgIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgICAqLwogICAgIHN0YXRpYyBwdWJsaWMgaW50IGdldE1pbkJ1ZmZlclNpemUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgY2hhbm5lbENvbmZpZywgaW50IGF1ZGlvRm9ybWF0KSB7CiAgICAgICAgIGludCBjaGFubmVsQ291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKaW5kZXggYTI3ZGY1Ny4uZGFhOTc2ZiAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCkBAIC0zOSwyMiArMzksODAgQEAKICAqLwogcHVibGljIGNsYXNzIENhbWNvcmRlclByb2ZpbGUKIHsKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcy9vcmRpbmFscyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0CisgICAgLy8gaW4gaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmghCisKICAgICAvKioKLSAgICAgKiBUaGUgb3V0cHV0IGZyb20gY2FtY29yZGVyIHJlY29yZGluZyBzZXNzaW9ucyBjYW4gaGF2ZSBkaWZmZXJlbnQgcXVhbGl0eSBsZXZlbHMuCi0gICAgICoKLSAgICAgKiBDdXJyZW50bHksIHdlIGRlZmluZSB0d28gcXVhbGl0eSBsZXZlbHM6IGhpZ2ggcXVhbGl0eSBhbmQgbG93IHF1YWxpdHkuCi0gICAgICogQSBjYW1jb3JkZXIgcmVjb3JkaW5nIHNlc3Npb24gd2l0aCBoaWdoIHF1YWxpdHkgbGV2ZWwgdXN1YWxseSBoYXMgaGlnaGVyIG91dHB1dCBiaXQKLSAgICAgKiByYXRlLCBiZXR0ZXIgdmlkZW8gYW5kL29yIGF1ZGlvIHJlY29yZGluZyBxdWFsaXR5LCBsYXJnZXIgdmlkZW8gZnJhbWUKLSAgICAgKiByZXNvbHV0aW9uIGFuZCBoaWdoZXIgYXVkaW8gc2FtcGxpbmcgcmF0ZSwgZXRjLCB0aGFuIHRob3NlIHdpdGggbG93IHF1YWxpdHkKLSAgICAgKiBsZXZlbC4KLSAgICAgKgotICAgICAqIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzL29yZGluYWxzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnQKLSAgICAgKiBpbiBpbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCEKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvd2VzdCBhdmFpbGFibGUgcmVzb2x1dGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX0xPVyAgPSAwOworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSByZXNvbHV0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfSElHSCA9IDE7CiAKICAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHFjaWYgKDE3NiB4IDE0NCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1FDSUYgPSAyOworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjaWYgKDM1MiB4IDI4OCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX0NJRiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDQ4MHAgKDcyMCB4IDQ4MCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzQ4MFAgPSA0OworCisgICAgLyoqCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA3MjBwICgxMjgwIHggNzIwKSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfNzIwUCA9IDU7CisKKyAgICAvKioKKyAgICAgKiBRdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDEwODBwICgxOTIwIHggMTA4OCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzEwODBQID0gNjsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlc3QgYXZhaWxhYmxlIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFX0hJR0ggPSAxMDAxOworCisgICAgLyoqCisgICAgICogVGltZSBsYXBzZSBxdWFsaXR5IGxldmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHFjaWYgKDE3NiB4IDE0NCkgcmVzb2x1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZX1RJTUVfTEFQU0VfUUNJRiA9IDEwMDI7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY2lmICgzNTIgeCAyODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFX0NJRiA9IDEwMDM7CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGxhcHNlIHF1YWxpdHkgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgNDgwcCAoNzIwIHggNDgwKSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV80ODBQID0gMTAwNDsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA3MjBwICgxMjgwIHggNzIwKSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfVElNRV9MQVBTRV83MjBQID0gMTAwNTsKKworICAgIC8qKgorICAgICAqIFRpbWUgbGFwc2UgcXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAxMDgwcCAoMTkyMCB4IDEwODgpIHJlc29sdXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV9USU1FX0xBUFNFXzEwODBQID0gMTAwNjsKKworICAgIC8qKgogICAgICAqIERlZmF1bHQgcmVjb3JkaW5nIGR1cmF0aW9uIGluIHNlY29uZHMgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQuCiAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGFwcGxpY2F0aW9ucyBsaWtlIE1NUyBoYXMgbGltaXRlZCBmaWxlIHNpemUgcmVxdWlyZW1lbnQuCiAgICAgICovCkBAIC0xMjIsMjUgKzE4MCw3NSBAQAogICAgICAqIFJldHVybnMgdGhlIGNhbWNvcmRlciBwcm9maWxlIGZvciB0aGUgZGVmYXVsdCBjYW1lcmEgYXQgdGhlIGdpdmVuCiAgICAgICogcXVhbGl0eSBsZXZlbC4KICAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQorICAgICAqIEBzZWUgI2dldChpbnQsIGludCkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgZ2V0KGludCBxdWFsaXR5KSB7Ci0gICAgICAgIHJldHVybiBnZXQoMCwgcXVhbGl0eSk7CisgICAgICAgIHJldHVybiBnZXQoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuQ0FNRVJBX0lEX0RFRkFVTFQsIHF1YWxpdHkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNhbWNvcmRlciBwcm9maWxlIGZvciB0aGUgZ2l2ZW4gY2FtZXJhIGF0IHRoZSBnaXZlbgogICAgICAqIHF1YWxpdHkgbGV2ZWwuCisgICAgICoKKyAgICAgKiBRdWFsaXR5IGxldmVscyBRVUFMSVRZX0xPVywgUVVBTElUWV9ISUdIIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCwgd2hpbGUKKyAgICAgKiBvdGhlciBsZXZlbHMgbWF5IG9yIG1heSBub3QgYmUgc3VwcG9ydGVkLiBUaGUgc3VwcG9ydGVkIGxldmVscyBjYW4gYmUgY2hlY2tlZCB1c2luZworICAgICAqIHtAbGluayAjaGFzUHJvZmlsZShpbnQsIGludCl9LgorICAgICAqIFFVQUxJVFlfTE9XIHJlZmVycyB0byB0aGUgbG93ZXN0IHF1YWxpdHkgYXZhaWxhYmxlLCB3aGlsZSBRVUFMSVRZX0hJR0ggcmVmZXJzIHRvCisgICAgICogdGhlIGhpZ2hlc3QgcXVhbGl0eSBhdmFpbGFibGUuCisgICAgICogUVVBTElUWV9MT1cvUVVBTElUWV9ISUdIIGhhdmUgdG8gbWF0Y2ggb25lIG9mIHFjaWYsIGNpZiwgNDgwcCwgNzIwcCwgb3IgMTA4MHAuCisgICAgICogRS5nLiBpZiB0aGUgZGV2aWNlIHN1cHBvcnRzIDQ4MHAsIDcyMHAsIGFuZCAxMDgwcCwgdGhlbiBsb3cgaXMgNDgwcCBhbmQgaGlnaCBpcworICAgICAqIDEwODBwLgorICAgICAqCisgICAgICogQSBjYW1jb3JkZXIgcmVjb3JkaW5nIHNlc3Npb24gd2l0aCBoaWdoZXIgcXVhbGl0eSBsZXZlbCB1c3VhbGx5IGhhcyBoaWdoZXIgb3V0cHV0CisgICAgICogYml0IHJhdGUsIGJldHRlciB2aWRlbyBhbmQvb3IgYXVkaW8gcmVjb3JkaW5nIHF1YWxpdHksIGxhcmdlciB2aWRlbyBmcmFtZQorICAgICAqIHJlc29sdXRpb24gYW5kIGhpZ2hlciBhdWRpbyBzYW1wbGluZyByYXRlLCBldGMsIHRoYW4gdGhvc2Ugd2l0aCBsb3dlciBxdWFsaXR5CisgICAgICogbGV2ZWwuCisgICAgICoKICAgICAgKiBAcGFyYW0gY2FtZXJhSWQgdGhlIGlkIGZvciB0aGUgY2FtZXJhCi0gICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZS4KKyAgICAgKiBAc2VlICNRVUFMSVRZX0xPVworICAgICAqIEBzZWUgI1FVQUxJVFlfSElHSAorICAgICAqIEBzZWUgI1FVQUxJVFlfUUNJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfQ0lGCisgICAgICogQHNlZSAjUVVBTElUWV80ODBQCisgICAgICogQHNlZSAjUVVBTElUWV83MjBQCisgICAgICogQHNlZSAjUVVBTElUWV8xMDgwUAorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV9MT1cKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfSElHSAorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV9RQ0lGCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFX0NJRgorICAgICAqIEBzZWUgI1FVQUxJVFlfVElNRV9MQVBTRV80ODBQCisgICAgICogQHNlZSAjUVVBTElUWV9USU1FX0xBUFNFXzcyMFAKKyAgICAgKiBAc2VlICNRVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENhbWNvcmRlclByb2ZpbGUgZ2V0KGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpIHsKLSAgICAgICAgaWYgKHF1YWxpdHkgPCBRVUFMSVRZX0xPVyB8fCBxdWFsaXR5ID4gUVVBTElUWV9ISUdIKSB7CisgICAgICAgIGlmICghKChxdWFsaXR5ID49IFFVQUxJVFlfTE9XICYmIHF1YWxpdHkgPD0gUVVBTElUWV8xMDgwUCkgfHwKKyAgICAgICAgICAgICAgICAocXVhbGl0eSA+PSBRVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmIHF1YWxpdHkgPD0gUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKICAgICAgICAgICAgIFN0cmluZyBlcnJNZXNzYWdlID0gIlVuc3VwcG9ydGVkIHF1YWxpdHkgbGV2ZWw6ICIgKyBxdWFsaXR5OwogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnJNZXNzYWdlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZShjYW1lcmFJZCwgcXVhbGl0eSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGNhbWNvcmRlciBwcm9maWxlIGV4aXN0cyBmb3IgdGhlIGRlZmF1bHQgY2FtZXJhIGF0CisgICAgICogdGhlIGdpdmVuIHF1YWxpdHkgbGV2ZWwuCisgICAgICogQHBhcmFtIHF1YWxpdHkgdGhlIHRhcmdldCBxdWFsaXR5IGxldmVsIGZvciB0aGUgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvZmlsZShpbnQgcXVhbGl0eSkgeworICAgICAgICByZXR1cm4gaGFzUHJvZmlsZShhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5DQU1FUkFfSURfREVGQVVMVCwgcXVhbGl0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGNhbWNvcmRlciBwcm9maWxlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdAorICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLgorICAgICAqIEBwYXJhbSBjYW1lcmFJZCB0aGUgaWQgZm9yIHRoZSBjYW1lcmEKKyAgICAgKiBAcGFyYW0gcXVhbGl0eSB0aGUgdGFyZ2V0IHF1YWxpdHkgbGV2ZWwgZm9yIHRoZSBjYW1jb3JkZXIgcHJvZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQcm9maWxlKGludCBjYW1lcmFJZCwgaW50IHF1YWxpdHkpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUoY2FtZXJhSWQsIHF1YWxpdHkpOworICAgIH0KKwogICAgIHN0YXRpYyB7CiAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibWVkaWFfam5pIik7CiAgICAgICAgIG5hdGl2ZV9pbml0KCk7CkBAIC0xNzgsNCArMjg2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfaW5pdCgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBmaW5hbCBDYW1jb3JkZXJQcm9maWxlIG5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUoCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBxdWFsaXR5KTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZmluYWwgYm9vbGVhbiBuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgcXVhbGl0eSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKaW5kZXggNmU1MjdkOS4uNjZhOTNmMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKQEAgLTM0LDggKzM0LDYgQEAKICAqIHtAaGlkZX0KICAqLwogcHVibGljIGNsYXNzIE1lZGlhRmlsZSB7Ci0gICAgLy8gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsIGZpbGUgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIG1lZGlhIHNjYW5uZXIKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBzRmlsZUV4dGVuc2lvbnM7CiAKICAgICAvLyBBdWRpbyBmaWxlIHR5cGVzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX01QMyAgICAgPSAxOwpAQCAtODQsNiArODIsMTcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfV1BMICAgICA9IDQzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9QTEFZTElTVF9GSUxFX1RZUEUgPSBGSUxFX1RZUEVfTTNVOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX1BMQVlMSVNUX0ZJTEVfVFlQRSA9IEZJTEVfVFlQRV9XUEw7CisKKyAgICAvLyBPdGhlciBwb3B1bGFyIGZpbGUgdHlwZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfVEVYVCAgICAgICAgICA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfSFRNTCAgICAgICAgICA9IDEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfUERGICAgICAgICAgICA9IDEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfWE1MICAgICAgICAgICA9IDEwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTVNfV09SRCAgICAgICA9IDEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTVNfRVhDRUwgICAgICA9IDEwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfTVNfUE9XRVJQT0lOVCA9IDEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfRkxBQyAgICAgICAgICA9IDEwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfWklQICAgICAgICAgICA9IDEwODsKICAgICAKICAgICBzdGF0aWMgY2xhc3MgTWVkaWFGaWxlVHlwZSB7CiAgICAgCkBAIC05NiwxNSArMTA1LDMyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIE1lZGlhRmlsZVR5cGU+IHNGaWxlVHlwZU1hcCAKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgTWVkaWFGaWxlVHlwZT4gc0ZpbGVUeXBlTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVkaWFGaWxlVHlwZT4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc01pbWVUeXBlTWFwIAotICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7ICAgICAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNNaW1lVHlwZU1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgLy8gbWFwcyBmaWxlIGV4dGVuc2lvbiB0byBNVFAgZm9ybWF0IGNvZGUKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0ZpbGVUeXBlVG9Gb3JtYXRNYXAKKyAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIC8vIG1hcHMgbWltZSB0eXBlIHRvIE1UUCBmb3JtYXQgY29kZQorICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBzTWltZVR5cGVUb0Zvcm1hdE1hcAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgLy8gbWFwcyBNVFAgZm9ybWF0IGNvZGUgdG8gbWltZSB0eXBlCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHNGb3JtYXRUb01pbWVUeXBlTWFwCisgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKKwogICAgIHN0YXRpYyB2b2lkIGFkZEZpbGVUeXBlKFN0cmluZyBleHRlbnNpb24sIGludCBmaWxlVHlwZSwgU3RyaW5nIG1pbWVUeXBlKSB7CiAgICAgICAgIHNGaWxlVHlwZU1hcC5wdXQoZXh0ZW5zaW9uLCBuZXcgTWVkaWFGaWxlVHlwZShmaWxlVHlwZSwgbWltZVR5cGUpKTsKICAgICAgICAgc01pbWVUeXBlTWFwLnB1dChtaW1lVHlwZSwgSW50ZWdlci52YWx1ZU9mKGZpbGVUeXBlKSk7CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgYWRkRmlsZVR5cGUoU3RyaW5nIGV4dGVuc2lvbiwgaW50IGZpbGVUeXBlLCBTdHJpbmcgbWltZVR5cGUsIGludCBtdHBGb3JtYXRDb2RlKSB7CisgICAgICAgIGFkZEZpbGVUeXBlKGV4dGVuc2lvbiwgZmlsZVR5cGUsIG1pbWVUeXBlKTsKKyAgICAgICAgc0ZpbGVUeXBlVG9Gb3JtYXRNYXAucHV0KGV4dGVuc2lvbiwgSW50ZWdlci52YWx1ZU9mKG10cEZvcm1hdENvZGUpKTsKKyAgICAgICAgc01pbWVUeXBlVG9Gb3JtYXRNYXAucHV0KG1pbWVUeXBlLCBJbnRlZ2VyLnZhbHVlT2YobXRwRm9ybWF0Q29kZSkpOworICAgICAgICBzRm9ybWF0VG9NaW1lVHlwZU1hcC5wdXQobXRwRm9ybWF0Q29kZSwgbWltZVR5cGUpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXTUFFbmFibGVkKCkgewogICAgICAgICBMaXN0PEF1ZGlvRGVjb2Rlcj4gZGVjb2RlcnMgPSBEZWNvZGVyQ2FwYWJpbGl0aWVzLmdldEF1ZGlvRGVjb2RlcnMoKTsKICAgICAgICAgZm9yIChBdWRpb0RlY29kZXIgZGVjb2RlcjogZGVjb2RlcnMpIHsKQEAgLTExNSwyOCArMTQxLDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV01WRW5hYmxlZCgpIHsKLSAgICAgICAgTGlzdDxWaWRlb0RlY29kZXI+IGRlY29kZXJzID0gRGVjb2RlckNhcGFiaWxpdGllcy5nZXRWaWRlb0RlY29kZXJzKCk7Ci0gICAgICAgIGZvciAoVmlkZW9EZWNvZGVyIGRlY29kZXI6IGRlY29kZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlciA9PSBWaWRlb0RlY29kZXIuVklERU9fREVDT0RFUl9XTVYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCiAgICAgc3RhdGljIHsKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QMyIsIEZJTEVfVFlQRV9NUDMsICJhdWRpby9tcGVnIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJNNEEiLCBGSUxFX1RZUEVfTTRBLCAiYXVkaW8vbXA0Iik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJXQVYiLCBGSUxFX1RZUEVfV0FWLCAiYXVkaW8veC13YXYiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QMyIsIEZJTEVfVFlQRV9NUDMsICJhdWRpby9tcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUDMpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTRBIiwgRklMRV9UWVBFX000QSwgImF1ZGlvL21wNCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXQVYiLCBGSUxFX1RZUEVfV0FWLCAiYXVkaW8veC13YXYiLCBNdHBDb25zdGFudHMuRk9STUFUX1dBVik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJBTVIiLCBGSUxFX1RZUEVfQU1SLCAiYXVkaW8vYW1yIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJBV0IiLCBGSUxFX1RZUEVfQVdCLCAiYXVkaW8vYW1yLXdiIik7CiAgICAgICAgIGlmIChpc1dNQUVuYWJsZWQoKSkgewotICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNQSIsIEZJTEVfVFlQRV9XTUEsICJhdWRpby94LW1zLXdtYSIpOworICAgICAgICAgICAgYWRkRmlsZVR5cGUoIldNQSIsIEZJTEVfVFlQRV9XTUEsICJhdWRpby94LW1zLXdtYSIsIE10cENvbnN0YW50cy5GT1JNQVRfV01BKTsKICAgICAgICAgfQotICAgICAgICBhZGRGaWxlVHlwZSgiT0dHIiwgRklMRV9UWVBFX09HRywgImFwcGxpY2F0aW9uL29nZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiT0dBIiwgRklMRV9UWVBFX09HRywgImFwcGxpY2F0aW9uL29nZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiQUFDIiwgRklMRV9UWVBFX0FBQywgImF1ZGlvL2FhYyIpOworICAgICAgICBhZGRGaWxlVHlwZSgiT0dHIiwgRklMRV9UWVBFX09HRywgImFwcGxpY2F0aW9uL29nZyIsIE10cENvbnN0YW50cy5GT1JNQVRfT0dHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk9HQSIsIEZJTEVfVFlQRV9PR0csICJhcHBsaWNhdGlvbi9vZ2ciLCBNdHBDb25zdGFudHMuRk9STUFUX09HRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJBQUMiLCBGSUxFX1RZUEVfQUFDLCAiYXVkaW8vYWFjIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQUMpOwogICAgICAgICBhZGRGaWxlVHlwZSgiTUtBIiwgRklMRV9UWVBFX01LQSwgImF1ZGlvL3gtbWF0cm9za2EiKTsKICAKICAgICAgICAgYWRkRmlsZVR5cGUoIk1JRCIsIEZJTEVfVFlQRV9NSUQsICJhdWRpby9taWRpIik7CkBAIC0xNDgsNzggKzE2NCwxMTggQEAKICAgICAgICAgYWRkRmlsZVR5cGUoIlJUWCIsIEZJTEVfVFlQRV9NSUQsICJhdWRpby9taWRpIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJPVEEiLCBGSUxFX1RZUEVfTUlELCAiYXVkaW8vbWlkaSIpOwogICAgICAgICAKLSAgICAgICAgYWRkRmlsZVR5cGUoIk1QRUciLCBGSUxFX1RZUEVfTVA0LCAidmlkZW8vbXBlZyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTVA0IiwgRklMRV9UWVBFX01QNCwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzR1BQIiwgRklMRV9UWVBFXzNHUFAsICJ2aWRlby8zZ3BwIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCIzRzIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIpOworICAgICAgICBhZGRGaWxlVHlwZSgiTVBFRyIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk1QNCIsIEZJTEVfVFlQRV9NUDQsICJ2aWRlby9tcDQiLCBNdHBDb25zdGFudHMuRk9STUFUX01QRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiTTRWIiwgRklMRV9UWVBFX000ViwgInZpZGVvL21wNCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVBFRyk7CisgICAgICAgIGFkZEZpbGVUeXBlKCIzR1AiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiLCAgTXRwQ29uc3RhbnRzLkZPUk1BVF8zR1BfQ09OVEFJTkVSKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIjNHUFAiLCBGSUxFX1RZUEVfM0dQUCwgInZpZGVvLzNncHAiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0cyIiwgRklMRV9UWVBFXzNHUFAyLCAidmlkZW8vM2dwcDIiLCBNdHBDb25zdGFudHMuRk9STUFUXzNHUF9DT05UQUlORVIpOworICAgICAgICBhZGRGaWxlVHlwZSgiM0dQUDIiLCBGSUxFX1RZUEVfM0dQUDIsICJ2aWRlby8zZ3BwMiIsIE10cENvbnN0YW50cy5GT1JNQVRfM0dQX0NPTlRBSU5FUik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJNS1YiLCBGSUxFX1RZUEVfTUtWLCAidmlkZW8veC1tYXRyb3NrYSIpOwogICAgICAgICBhZGRGaWxlVHlwZSgiV0VCTSIsIEZJTEVfVFlQRV9NS1YsICJ2aWRlby94LW1hdHJvc2thIik7CiAgICAgICAgIGFkZEZpbGVUeXBlKCJUUyIsIEZJTEVfVFlQRV9NUDJUUywgInZpZGVvL21wMnRzIik7CiAKLSAgICAgICAgaWYgKGlzV01WRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBhZGRGaWxlVHlwZSgiV01WIiwgRklMRV9UWVBFX1dNViwgInZpZGVvL3gtbXMtd212Iik7Ci0gICAgICAgICAgICBhZGRGaWxlVHlwZSgiQVNGIiwgRklMRV9UWVBFX0FTRiwgInZpZGVvL3gtbXMtYXNmIik7Ci0gICAgICAgIH0KKyAgICAgICAgYWRkRmlsZVR5cGUoIldNViIsIEZJTEVfVFlQRV9XTVYsICJ2aWRlby94LW1zLXdtdiIsIE10cENvbnN0YW50cy5GT1JNQVRfV01WKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkFTRiIsIEZJTEVfVFlQRV9BU0YsICJ2aWRlby94LW1zLWFzZiIpOwogCi0gICAgICAgIGFkZEZpbGVUeXBlKCJKUEciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkpQRUciLCBGSUxFX1RZUEVfSlBFRywgImltYWdlL2pwZWciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkdJRiIsIEZJTEVfVFlQRV9HSUYsICJpbWFnZS9naWYiKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIlBORyIsIEZJTEVfVFlQRV9QTkcsICJpbWFnZS9wbmciKTsKLSAgICAgICAgYWRkRmlsZVR5cGUoIkJNUCIsIEZJTEVfVFlQRV9CTVAsICJpbWFnZS94LW1zLWJtcCIpOworICAgICAgICBhZGRGaWxlVHlwZSgiSlBHIiwgRklMRV9UWVBFX0pQRUcsICJpbWFnZS9qcGVnIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9FWElGX0pQRUcpOworICAgICAgICBhZGRGaWxlVHlwZSgiSlBFRyIsIEZJTEVfVFlQRV9KUEVHLCAiaW1hZ2UvanBlZyIsIE10cENvbnN0YW50cy5GT1JNQVRfRVhJRl9KUEVHKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkdJRiIsIEZJTEVfVFlQRV9HSUYsICJpbWFnZS9naWYiLCBNdHBDb25zdGFudHMuRk9STUFUX0dJRik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJQTkciLCBGSUxFX1RZUEVfUE5HLCAiaW1hZ2UvcG5nIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTkcpOworICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9CTVApOwogICAgICAgICBhZGRGaWxlVHlwZSgiV0JNUCIsIEZJTEVfVFlQRV9XQk1QLCAiaW1hZ2Uvdm5kLndhcC53Ym1wIik7CiAgCi0gICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIik7Ci0gICAgICAgIGFkZEZpbGVUeXBlKCJQTFMiLCBGSUxFX1RZUEVfUExTLCAiYXVkaW8veC1zY3BscyIpOwotICAgICAgICBhZGRGaWxlVHlwZSgiV1BMIiwgRklMRV9UWVBFX1dQTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy13cGwiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIk0zVSIsIEZJTEVfVFlQRV9NM1UsICJhdWRpby94LW1wZWd1cmwiLCBNdHBDb25zdGFudHMuRk9STUFUX00zVV9QTEFZTElTVCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJQTFMiLCBGSUxFX1RZUEVfUExTLCAiYXVkaW8veC1zY3BscyIsIE10cENvbnN0YW50cy5GT1JNQVRfUExTX1BMQVlMSVNUKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIldQTCIsIEZJTEVfVFlQRV9XUEwsICJhcHBsaWNhdGlvbi92bmQubXMtd3BsIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9XUExfUExBWUxJU1QpOwogCi0gICAgICAgIC8vIGNvbXB1dGUgZmlsZSBleHRlbnNpb25zIGxpc3QgZm9yIG5hdGl2ZSBNZWRpYSBTY2FubmVyCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBzRmlsZVR5cGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9IAotICAgICAgICBzRmlsZUV4dGVuc2lvbnMgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIGFkZEZpbGVUeXBlKCJUWFQiLCBGSUxFX1RZUEVfVEVYVCwgInRleHQvcGxhaW4iLCBNdHBDb25zdGFudHMuRk9STUFUX1RFWFQpOworICAgICAgICBhZGRGaWxlVHlwZSgiSFRNIiwgRklMRV9UWVBFX0hUTUwsICJ0ZXh0L2h0bWwiLCBNdHBDb25zdGFudHMuRk9STUFUX0hUTUwpOworICAgICAgICBhZGRGaWxlVHlwZSgiSFRNTCIsIEZJTEVfVFlQRV9IVE1MLCAidGV4dC9odG1sIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9IVE1MKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlBERiIsIEZJTEVfVFlQRV9QREYsICJhcHBsaWNhdGlvbi9wZGYiKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkRPQyIsIEZJTEVfVFlQRV9NU19XT1JELCAiYXBwbGljYXRpb24vbXN3b3JkIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NU19XT1JEX0RPQ1VNRU5UKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIlhMUyIsIEZJTEVfVFlQRV9NU19FWENFTCwgImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsIE10cENvbnN0YW50cy5GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQpOworICAgICAgICBhZGRGaWxlVHlwZSgiUFBUIiwgRklMRV9UWVBFX01TX1BPV0VSUE9JTlQsICJhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQiLCBNdHBDb25zdGFudHMuRk9STUFUX01TX1BPV0VSUE9JTlRfUFJFU0VOVEFUSU9OKTsKKyAgICAgICAgYWRkRmlsZVR5cGUoIkZMQUMiLCBGSUxFX1RZUEVfRkxBQywgImF1ZGlvL2ZsYWMiLCBNdHBDb25zdGFudHMuRk9STUFUX0ZMQUMpOworICAgICAgICBhZGRGaWxlVHlwZSgiWklQIiwgRklMRV9UWVBFX1pJUCwgImFwcGxpY2F0aW9uL3ppcCIpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvRmlsZVR5cGUoaW50IGZpbGVUeXBlKSB7CiAgICAgICAgIHJldHVybiAoKGZpbGVUeXBlID49IEZJUlNUX0FVRElPX0ZJTEVfVFlQRSAmJgogICAgICAgICAgICAgICAgIGZpbGVUeXBlIDw9IExBU1RfQVVESU9fRklMRV9UWVBFKSB8fAogICAgICAgICAgICAgICAgIChmaWxlVHlwZSA+PSBGSVJTVF9NSURJX0ZJTEVfVFlQRSAmJgogICAgICAgICAgICAgICAgIGZpbGVUeXBlIDw9IExBU1RfTUlESV9GSUxFX1RZUEUpKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWRlb0ZpbGVUeXBlKGludCBmaWxlVHlwZSkgewogICAgICAgICByZXR1cm4gKGZpbGVUeXBlID49IEZJUlNUX1ZJREVPX0ZJTEVfVFlQRSAmJgogICAgICAgICAgICAgICAgIGZpbGVUeXBlIDw9IExBU1RfVklERU9fRklMRV9UWVBFKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbWFnZUZpbGVUeXBlKGludCBmaWxlVHlwZSkgewogICAgICAgICByZXR1cm4gKGZpbGVUeXBlID49IEZJUlNUX0lNQUdFX0ZJTEVfVFlQRSAmJgogICAgICAgICAgICAgICAgIGZpbGVUeXBlIDw9IExBU1RfSU1BR0VfRklMRV9UWVBFKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQbGF5TGlzdEZpbGVUeXBlKGludCBmaWxlVHlwZSkgewogICAgICAgICByZXR1cm4gKGZpbGVUeXBlID49IEZJUlNUX1BMQVlMSVNUX0ZJTEVfVFlQRSAmJgogICAgICAgICAgICAgICAgIGZpbGVUeXBlIDw9IExBU1RfUExBWUxJU1RfRklMRV9UWVBFKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIE1lZGlhRmlsZVR5cGUgZ2V0RmlsZVR5cGUoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgaW50IGxhc3REb3QgPSBwYXRoLmxhc3RJbmRleE9mKCIuIik7CiAgICAgICAgIGlmIChsYXN0RG90IDwgMCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICByZXR1cm4gc0ZpbGVUeXBlTWFwLmdldChwYXRoLnN1YnN0cmluZyhsYXN0RG90ICsgMSkudG9VcHBlckNhc2UoKSk7CiAgICAgfQotICAgIAorCisgICAgLy8gZ2VuZXJhdGVzIGEgdGl0bGUgYmFzZWQgb24gZmlsZSBuYW1lCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVRpdGxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIC8vIGV4dHJhY3QgZmlsZSBuYW1lIGFmdGVyIGxhc3Qgc2xhc2gKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICBsYXN0U2xhc2grKzsKKyAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPCBwYXRoLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKGxhc3RTbGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdHJ1bmNhdGUgdGhlIGZpbGUgZXh0ZW5zaW9uIChpZiBhbnkpCisgICAgICAgIGludCBsYXN0RG90ID0gcGF0aC5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAobGFzdERvdCA+IDApIHsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBsYXN0RG90KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRGaWxlVHlwZUZvck1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc01pbWVUeXBlTWFwLmdldChtaW1lVHlwZSk7CiAgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5pbnRWYWx1ZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZUZvckZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgTWVkaWFGaWxlVHlwZSBtZWRpYUZpbGVUeXBlID0gZ2V0RmlsZVR5cGUocGF0aCk7CisgICAgICAgIHJldHVybiAobWVkaWFGaWxlVHlwZSA9PSBudWxsID8gbnVsbCA6IG1lZGlhRmlsZVR5cGUubWltZVR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEZvcm1hdENvZGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBzTWltZVR5cGVUb0Zvcm1hdE1hcC5nZXQobWltZVR5cGUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGFzdERvdCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChsYXN0RG90ID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSk7CisgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gc0ZpbGVUeXBlVG9Gb3JtYXRNYXAuZ2V0KGV4dGVuc2lvbik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuRk9STUFUX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZUZvckZvcm1hdENvZGUoaW50IGZvcm1hdENvZGUpIHsKKyAgICAgICAgcmV0dXJuIHNGb3JtYXRUb01pbWVUeXBlTWFwLmdldChmb3JtYXRDb2RlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQppbmRleCAzNGE4NmVjLi4xOWIwYzE3IDEwMDY0NAotLS0gYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKQEAgLTcyLDYgKzcyLDkgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIG1QYXRoOwogICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbUZkOworICAgIHByaXZhdGUgYm9vbGVhbiBtUHJlcGFyZUF1eGlsaWFyeUZpbGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtUGF0aEF1eDsKKyAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yIG1GZEF1eDsKICAgICBwcml2YXRlIEV2ZW50SGFuZGxlciBtRXZlbnRIYW5kbGVyOwogICAgIHByaXZhdGUgT25FcnJvckxpc3RlbmVyIG1PbkVycm9yTGlzdGVuZXI7CiAgICAgcHJpdmF0ZSBPbkluZm9MaXN0ZW5lciBtT25JbmZvTGlzdGVuZXI7CkBAIC0yODIsNiArMjg1LDc1IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRW5hYmxlcy9EaXNhYmxlcyB0aW1lIGxhcHNlIGNhcHR1cmUgYW5kIHNldHMgaXRzIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIGJlIGNhbGxlZCBhZnRlciBzZXRQcm9maWxlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlVGltZUxhcHNlIFBhc3MgdHJ1ZSB0byBlbmFibGUgdGltZSBsYXBzZSBjYXB0dXJlLCBmYWxzZSB0byBkaXNhYmxlIGl0LgorICAgICAqIEBwYXJhbSB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSBQYXNzIHRydWUgdG8gdXNlIHN0aWxsIGNhbWVyYSBmb3IgY2FwdHVyaW5nIHRpbWUgbGFwc2UKKyAgICAgKiBmcmFtZXMsIGZhbHNlIHRvIHVzZSB0aGUgdmlkZW8gY2FtZXJhLgorICAgICAqIEBwYXJhbSB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zIHRpbWUgYmV0d2VlbiB0d28gY2FwdHVyZXMgb2YgdGltZSBsYXBzZSBmcmFtZXMuCisgICAgICogQHBhcmFtIGVuY29kZXJMZXZlbCB0aGUgdmlkZW8gZW5jb2RlciBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaW1lTGFwc2VQYXJhbWV0ZXJzKGJvb2xlYW4gZW5hYmxlVGltZUxhcHNlLAorICAgICAgICAgICAgYm9vbGVhbiB1c2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSwKKyAgICAgICAgICAgIGludCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zLCBpbnQgZW5jb2RlckxldmVsKSB7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ0aW1lLWxhcHNlLWVuYWJsZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIChlbmFibGVUaW1lTGFwc2UpID8gMSA6IDApKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmU9JWQiLAorICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSk7CisgICAgICAgIHNldFZpZGVvRW5jb2RlckxldmVsKGVuY29kZXJMZXZlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aW1lIGxhcHNlIGNhcHR1cmUgYW5kIHNldHMgaXRzIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIGJlIGNhbGxlZCBhZnRlciBzZXRQcm9maWxlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyB0aW1lIGJldHdlZW4gdHdvIGNhcHR1cmVzIG9mIHRpbWUgbGFwc2UgZnJhbWVzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5hYmxlVGltZUxhcHNlKGludCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSB7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ0aW1lLWxhcHNlLWVuYWJsZT0xIikpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGZpbGVuYW1lIGFuZCBwYXJhbWV0ZXJzIGZvciBhdXhpbGlhcnkgdGltZSBsYXBzZSB2aWRlby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3cml0dGVuIGludG8uCisgICAgICogQHBhcmFtIHZpZGVvRnJhbWVXaWR0aCB3aWR0aCBvZiB0aGUgYXV4aWxpYXJ5IHZpZGVvLgorICAgICAqIEBwYXJhbSB2aWRlb0ZyYW1lSGVpZ2h0IGhlaWdodCBvZiB0aGUgYXV4aWxpYXJ5IHZpZGVvLgorICAgICAqIEBwYXJhbSB2aWRlb0JpdFJhdGUgYml0IHJhdGUgb2YgdGhlIGF1eGlsaWFyeSB2aWRlbworICAgICAqIEBoaWRlCisgICAgICogKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXhWaWRlb1BhcmFtZXRlcnMoRmlsZURlc2NyaXB0b3IgZmQsCisgICAgICAgICAgICBpbnQgdmlkZW9GcmFtZVdpZHRoLCBpbnQgdmlkZW9GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGludCB2aWRlb0JpdFJhdGUpIHsKKyAgICAgICAgc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShmZCk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1hdXgtcGFyYW0td2lkdGg9JWQiLCB2aWRlb0ZyYW1lV2lkdGgpKTsKKyAgICAgICAgc2V0UGFyYW1ldGVyKFN0cmluZy5mb3JtYXQoInZpZGVvLWF1eC1wYXJhbS1oZWlnaHQ9JWQiLCB2aWRlb0ZyYW1lSGVpZ2h0KSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1hdXgtcGFyYW0tZW5jb2RpbmctYml0cmF0ZT0lZCIsIHZpZGVvQml0UmF0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgZmlsZW5hbWUgYW5kIHBhcmFtZXRlcnMgZm9yIGF1eGlsaWFyeSB0aW1lIGxhcHNlIHZpZGVvLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhuYW1lIHRvIHVzZSBmb3IgdGhlIGF1eGlsaWFyeSB2aWRlby4KKyAgICAgKiBAcGFyYW0gdmlkZW9GcmFtZVdpZHRoIHdpZHRoIG9mIHRoZSBhdXhpbGlhcnkgdmlkZW8uCisgICAgICogQHBhcmFtIHZpZGVvRnJhbWVIZWlnaHQgaGVpZ2h0IG9mIHRoZSBhdXhpbGlhcnkgdmlkZW8uCisgICAgICogQHBhcmFtIHZpZGVvQml0UmF0ZSBiaXQgcmF0ZSBvZiB0aGUgYXV4aWxpYXJ5IHZpZGVvCisgICAgICogQGhpZGUKKyAgICAgKiAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1eFZpZGVvUGFyYW1ldGVycyhTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIGludCB2aWRlb0ZyYW1lV2lkdGgsIGludCB2aWRlb0ZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgaW50IHZpZGVvQml0UmF0ZSkgeworICAgICAgICBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKHBhdGgpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tYXV4LXBhcmFtLXdpZHRoPSVkIiwgdmlkZW9GcmFtZVdpZHRoKSk7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1hdXgtcGFyYW0taGVpZ2h0PSVkIiwgdmlkZW9GcmFtZUhlaWdodCkpOworICAgICAgICBzZXRQYXJhbWV0ZXIoU3RyaW5nLmZvcm1hdCgidmlkZW8tYXV4LXBhcmFtLWVuY29kaW5nLWJpdHJhdGU9JWQiLCB2aWRlb0JpdFJhdGUpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlIHByb2R1Y2VkIGR1cmluZyByZWNvcmRpbmcuIENhbGwgdGhpcwogICAgICAqIGFmdGVyIHNldEF1ZGlvU291cmNlKCkvc2V0VmlkZW9Tb3VyY2UoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KICAgICAgKgpAQCAtNDQ4LDYgKzUyMCw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxldmVsIG9mIHRoZSBlbmNvZGVyLiBDYWxsIHRoaXMgYmVmb3JlIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGVyTGV2ZWwgdGhlIHZpZGVvIGVuY29kZXIgbGV2ZWwuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb0VuY29kZXJMZXZlbChpbnQgZW5jb2RlckxldmVsKSB7CisgICAgICAgIHNldFBhcmFtZXRlcihTdHJpbmcuZm9ybWF0KCJ2aWRlby1wYXJhbS1lbmNvZGVyLWxldmVsPSVkIiwgZW5jb2RlckxldmVsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFzcyBpbiB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBhdXhpbGlhcnkgZmlsZSB0byBiZSB3cml0dGVuLiBDYWxsIHRoaXMgYWZ0ZXIKKyAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZCBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byBiZSB3cml0dGVuIGludG8uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaXQgaXMgY2FsbGVkIGJlZm9yZQorICAgICAqIHNldE91dHB1dEZvcm1hdCgpIG9yIGFmdGVyIHByZXBhcmUoKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRBdXhpbGlhcnlPdXRwdXRGaWxlKEZpbGVEZXNjcmlwdG9yIGZkKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgeworICAgICAgICBtUHJlcGFyZUF1eGlsaWFyeUZpbGUgPSB0cnVlOworICAgICAgICBtUGF0aEF1eCA9IG51bGw7CisgICAgICAgIG1GZEF1eCA9IGZkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhdGggb2YgdGhlIGF1eGlsaWFyeSBvdXRwdXQgZmlsZSB0byBiZSBwcm9kdWNlZC4gQ2FsbCB0aGlzIGFmdGVyCisgICAgICogc2V0T3V0cHV0Rm9ybWF0KCkgYnV0IGJlZm9yZSBwcmVwYXJlKCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aG5hbWUgdG8gdXNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGl0IGlzIGNhbGxlZCBiZWZvcmUKKyAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBvciBhZnRlciBwcmVwYXJlKCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0QXV4aWxpYXJ5T3V0cHV0RmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbVByZXBhcmVBdXhpbGlhcnlGaWxlID0gdHJ1ZTsKKyAgICAgICAgbUZkQXV4ID0gbnVsbDsKKyAgICAgICAgbVBhdGhBdXggPSBwYXRoOworICAgIH0KKworICAgIC8qKgogICAgICAqIFBhc3MgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZSB3cml0dGVuLiBDYWxsIHRoaXMgYWZ0ZXIKICAgICAgKiBzZXRPdXRwdXRGb3JtYXQoKSBidXQgYmVmb3JlIHByZXBhcmUoKS4KICAgICAgKgpAQCAtNDc4LDYgKzU5MCw4IEBACiAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfc2V0T3V0cHV0RmlsZShGaWxlRGVzY3JpcHRvciBmZCwgbG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKQogICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9zZXRPdXRwdXRGaWxlQXV4KEZpbGVEZXNjcmlwdG9yIGZkKQorICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9wcmVwYXJlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CiAKICAgICAvKioKQEAgLTUwMyw2ICs2MTcsMjIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gdmFsaWQgb3V0cHV0IGZpbGUiKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtUHJlcGFyZUF1eGlsaWFyeUZpbGUpIHsKKyAgICAgICAgICAgIGlmIChtUGF0aEF1eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtUGF0aEF1eCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgX3NldE91dHB1dEZpbGVBdXgoZm9zLmdldEZEKCkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZkQXV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfc2V0T3V0cHV0RmlsZUF1eChtRmRBdXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk5vIHZhbGlkIG91dHB1dCBmaWxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBfcHJlcGFyZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lci5qYXZhCmluZGV4IDMzMzMyNjguLjlmMmE0OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXIuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFTY2FubmVyLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkZpbGVzOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLlZpZGVvOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5BdWRpby5HZW5yZXM7CkBAIC0xMDksNDEgKzExMCwxNSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJNZWRpYVNjYW5uZXIiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVVESU9fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBBdWRpby5NZWRpYS5fSUQsIC8vIDAKLSAgICAgICAgICAgIEF1ZGlvLk1lZGlhLkRBVEEsIC8vIDEKLSAgICAgICAgICAgIEF1ZGlvLk1lZGlhLkRBVEVfTU9ESUZJRUQsIC8vIDIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVTQ0FOX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCAvLyAwCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBLCAvLyAxCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVELCAvLyAyCiAgICAgfTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9BVURJT19DT0xVTU5fSU5ERVggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX0FVRElPX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfQVVESU9fQ09MVU1OX0lOREVYID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZJREVPX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgVmlkZW8uTWVkaWEuX0lELCAvLyAwCi0gICAgICAgICAgICBWaWRlby5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBWaWRlby5NZWRpYS5EQVRFX01PRElGSUVELCAvLyAyCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJRF9WSURFT19DT0xVTU5fSU5ERVggPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVRIX1ZJREVPX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfVklERU9fQ09MVU1OX0lOREVYID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElNQUdFU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5fSUQsIC8vIDAKLSAgICAgICAgICAgIEltYWdlcy5NZWRpYS5EQVRBLCAvLyAxCi0gICAgICAgICAgICBJbWFnZXMuTWVkaWEuREFURV9NT0RJRklFRCwgLy8gMgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVEhfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEVfTU9ESUZJRURfSU1BR0VTX0NPTFVNTl9JTkRFWCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQTEFZTElTVFNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuX0lELCAvLyAwCi0gICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuREFUQSwgLy8gMQotICAgICAgICAgICAgQXVkaW8uUGxheWxpc3RzLkRBVEVfTU9ESUZJRUQsIC8vIDIKLSAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYID0gMjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBMQVlMSVNUX01FTUJFUlNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICBBdWRpby5QbGF5bGlzdHMuTWVtYmVycy5QTEFZTElTVF9JRCwgLy8gMApAQCAtMzA0LDcgKzI3OSw5IEBACiAgICAgcHJpdmF0ZSBVcmkgbVRodW1ic1VyaTsKICAgICBwcml2YXRlIFVyaSBtR2VucmVzVXJpOwogICAgIHByaXZhdGUgVXJpIG1QbGF5bGlzdHNVcmk7CisgICAgcHJpdmF0ZSBVcmkgbUZpbGVzVXJpOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUHJvY2Vzc1BsYXlsaXN0cywgbVByb2Nlc3NHZW5yZXM7CisgICAgcHJpdmF0ZSBpbnQgbU10cE9iamVjdEhhbmRsZTsKIAogICAgIC8vIHVzZWQgd2hlbiBzY2FubmluZyB0aGUgaW1hZ2UgZGF0YWJhc2Ugc28gd2Uga25vdyB3aGV0aGVyIHdlIGhhdmUgdG8gcHJ1bmUKICAgICAvLyBvbGQgdGh1bWJuYWlsIGZpbGVzCkBAIC0zNTMsNyArMzMwLDcgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGF0aDsKKyAgICAgICAgICAgIHJldHVybiBtUGF0aCArICIgbVRhYmxlVXJpOiAiICsgbVRhYmxlVXJpICsgIiBtUm93SWQ6ICIgKyBtUm93SWQ7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzMSw2ICs0MDgsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTWltZVR5cGUgPSBudWxsOworICAgICAgICAgICAgbUZpbGVUeXBlID0gMDsKKyAgICAgICAgICAgIG1GaWxlU2l6ZSA9IGZpbGVTaXplOworCiAgICAgICAgICAgICAvLyB0cnkgbWltZVR5cGUgZmlyc3QsIGlmIGl0IGlzIHNwZWNpZmllZAogICAgICAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtRmlsZVR5cGUgPSBNZWRpYUZpbGUuZ2V0RmlsZVR5cGVGb3JNaW1lVHlwZShtaW1lVHlwZSk7CkBAIC00MzgsNyArNDE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVTaXplID0gZmlsZVNpemU7CiAKICAgICAgICAgICAgIC8vIGlmIG1pbWVUeXBlIHdhcyBub3Qgc3BlY2lmaWVkLCBjb21wdXRlIGZpbGUgdHlwZSBiYXNlZCBvbiBmaWxlIGV4dGVuc2lvbi4KICAgICAgICAgICAgIGlmIChtTWltZVR5cGUgPT0gbnVsbCkgewpAQCAtNDU1LDcgKzQzNCwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChrZXkpOwogICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBGaWxlQ2FjaGVFbnRyeShudWxsLCAwLCBwYXRoLCAwKTsKKyAgICAgICAgICAgICAgICBVcmkgdGFibGVVcmk7CisgICAgICAgICAgICAgICAgaWYgKE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1WaWRlb1VyaTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUobUZpbGVUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1JbWFnZXNVcmk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYUZpbGUuaXNBdWRpb0ZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtQXVkaW9Vcmk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVVcmkgPSBtRmlsZXNVcmk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IEZpbGVDYWNoZUVudHJ5KHRhYmxlVXJpLCAwLCBwYXRoLCAwKTsKICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIGVudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVudHJ5Lm1TZWVuSW5GaWxlU3lzdGVtID0gdHJ1ZTsKQEAgLTUwMCw3ICs0ODksOCBAQAogICAgICAgICAgICAgZG9TY2FuRmlsZShwYXRoLCBtaW1lVHlwZSwgbGFzdE1vZGlmaWVkLCBmaWxlU2l6ZSwgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFVyaSBkb1NjYW5GaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgbWltZVR5cGUsIGxvbmcgbGFzdE1vZGlmaWVkLCBsb25nIGZpbGVTaXplLCBib29sZWFuIHNjYW5BbHdheXMpIHsKKyAgICAgICAgcHVibGljIFVyaSBkb1NjYW5GaWxlKFN0cmluZyBwYXRoLCBTdHJpbmcgbWltZVR5cGUsIGxvbmcgbGFzdE1vZGlmaWVkLAorICAgICAgICAgICAgICAgIGxvbmcgZmlsZVNpemUsIGJvb2xlYW4gc2NhbkFsd2F5cykgewogICAgICAgICAgICAgVXJpIHJlc3VsdCA9IG51bGw7CiAvLyAgICAgICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC01MTUsNyArNTA1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdXNpYyA9IChsb3dwYXRoLmluZGV4T2YoTVVTSUNfRElSKSA+IDApIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAoIXJpbmd0b25lcyAmJiAhbm90aWZpY2F0aW9ucyAmJiAhYWxhcm1zICYmICFwb2RjYXN0cyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFNZWRpYUZpbGUuaXNJbWFnZUZpbGVUeXBlKG1GaWxlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBleHRyYWN0IG1ldGFkYXRhIGZvciBhdWRpbyBhbmQgdmlkZW8gZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUobUZpbGVUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE1lZGlhRmlsZS5pc1ZpZGVvRmlsZVR5cGUobUZpbGVUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocGF0aCwgbWltZVR5cGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU1NSw3ICs1NDcsOCBAQAogICAgICAgICAgICAgICAgIG1UaXRsZSA9IHZhbHVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYXJ0aXN0OyIpKSB7CiAgICAgICAgICAgICAgICAgbUFydGlzdCA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bWFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW1hcnRpc3Q7IikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJhbGJ1bWFydGlzdCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiYWxidW1hcnRpc3Q7IikKKyAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJiYW5kIikgfHwgbmFtZS5zdGFydHNXaXRoKCJiYW5kOyIpKSB7CiAgICAgICAgICAgICAgICAgbUFsYnVtQXJ0aXN0ID0gdmFsdWUudHJpbSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImFsYnVtIikgfHwgbmFtZS5zdGFydHNXaXRoKCJhbGJ1bTsiKSkgewogICAgICAgICAgICAgICAgIG1BbGJ1bSA9IHZhbHVlLnRyaW0oKTsKQEAgLTY1NCwyMSArNjQ3LDYgQEAKICAgICAgICAgICAgICAgICBib29sZWFuIGFsYXJtcywgYm9vbGVhbiBtdXNpYywgYm9vbGVhbiBwb2RjYXN0cykKICAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIHVwZGF0ZSBkYXRhYmFzZQotICAgICAgICAgICAgVXJpIHRhYmxlVXJpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0F1ZGlvID0gTWVkaWFGaWxlLmlzQXVkaW9GaWxlVHlwZShtRmlsZVR5cGUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1ZpZGVvID0gTWVkaWFGaWxlLmlzVmlkZW9GaWxlVHlwZShtRmlsZVR5cGUpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0ltYWdlID0gTWVkaWFGaWxlLmlzSW1hZ2VGaWxlVHlwZShtRmlsZVR5cGUpOwotICAgICAgICAgICAgaWYgKGlzVmlkZW8pIHsKLSAgICAgICAgICAgICAgICB0YWJsZVVyaSA9IG1WaWRlb1VyaTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbWFnZSkgewotICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUltYWdlc1VyaTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBdWRpbykgewotICAgICAgICAgICAgICAgIHRhYmxlVXJpID0gbUF1ZGlvVXJpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgZmlsZSB0byBkYXRhYmFzZSBpZiBub3QgYXVkaW8sIHZpZGVvIG9yIGltYWdlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeS5tVGFibGVVcmkgPSB0YWJsZVVyaTsKIAogICAgICAgICAgICAgIC8vIHVzZSBhbGJ1bSBhcnRpc3QgaWYgYXJ0aXN0IGlzIG1pc3NpbmcKICAgICAgICAgICAgIGlmIChtQXJ0aXN0ID09IG51bGwgfHwgbUFydGlzdC5sZW5ndGgoKSA9PSAwKSB7CkBAIC02NzgsMjAgKzY1Niw3IEBACiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IHRvVmFsdWVzKCk7CiAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuVElUTEUpOwogICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUudHJpbSgpKSkgewotICAgICAgICAgICAgICAgIHRpdGxlID0gdmFsdWVzLmdldEFzU3RyaW5nKE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEpOwotICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgZmlsZSBuYW1lIGFmdGVyIGxhc3Qgc2xhc2gKLSAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gdGl0bGUubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPCB0aXRsZS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5zdWJzdHJpbmcobGFzdFNsYXNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aGUgZmlsZSBleHRlbnNpb24gKGlmIGFueSkKLSAgICAgICAgICAgICAgICBpbnQgbGFzdERvdCA9IHRpdGxlLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3REb3QgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuc3Vic3RyaW5nKDAsIGxhc3REb3QpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aXRsZSA9IE1lZGlhRmlsZS5nZXRGaWxlVGl0bGUodmFsdWVzLmdldEFzU3RyaW5nKE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLkRBVEEpKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE1lZGlhU3RvcmUuTWVkaWFDb2x1bW5zLlRJVExFLCB0aXRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmcgYWxidW0gPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQXVkaW8uTWVkaWEuQUxCVU0pOwpAQCAtNzE1LDcgKzY4MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9uZyByb3dJZCA9IGVudHJ5Lm1Sb3dJZDsKLSAgICAgICAgICAgIGlmIChpc0F1ZGlvICYmIHJvd0lkID09IDApIHsKKyAgICAgICAgICAgIGlmIChNZWRpYUZpbGUuaXNBdWRpb0ZpbGVUeXBlKG1GaWxlVHlwZSkgJiYgcm93SWQgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHRoZXNlIGZvciBuZXcgZW50cmllcy4gRm9yIGV4aXN0aW5nIGVudHJpZXMsIHRoZXkKICAgICAgICAgICAgICAgICAvLyBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGxhdGVyLCBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNvIHRoYXQgY3VzdG9tIHJpbmd0b25lcyBzdGlsbCBzaG93IHVwIGluIHRoZSByaW5ndG9uZQpAQCAtNzY4LDggKzczMywxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgVXJpIHRhYmxlVXJpID0gZW50cnkubVRhYmxlVXJpOwogICAgICAgICAgICAgVXJpIHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgICBpZiAocm93SWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtTXRwT2JqZWN0SGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLk1lZGlhQ29sdW1ucy5NRURJQV9TQ0FOTkVSX05FV19PQkpFQ1RfSUQsIG1NdHBPYmplY3RIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFibGVVcmkgPT0gbUZpbGVzVXJpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFULCBNZWRpYUZpbGUuZ2V0Rm9ybWF0Q29kZShlbnRyeS5tUGF0aCwgbU1pbWVUeXBlKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIG5ldyBmaWxlLCBpbnNlcnQgaXQKICAgICAgICAgICAgICAgICByZXN1bHQgPSBtTWVkaWFQcm92aWRlci5pbnNlcnQodGFibGVVcmksIHZhbHVlcyk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CkBAIC04ODUsNyArODU3LDcgQEAKIAogICAgIH07IC8vIGVuZCBvZiBhbm9ueW1vdXMgTWVkaWFTY2FubmVyQ2xpZW50IGluc3RhbmNlCiAKLSAgICBwcml2YXRlIHZvaWQgcHJlc2NhbihTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBwcmVzY2FuKFN0cmluZyBmaWxlUGF0aCwgYm9vbGVhbiBwcmVzY2FuRmlsZXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBDdXJzb3IgYyA9IG51bGw7CiAgICAgICAgIFN0cmluZyB3aGVyZSA9IG51bGw7CiAgICAgICAgIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MgPSBudWxsOwpAQCAtOTAxLDIxICs4NzMsMjQgQEAKICAgICAgICAgICAgIG1QbGF5TGlzdHMuY2xlYXIoKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBxdWVyeSBmb3Igb25seSBvbmUgZmlsZQorICAgICAgICAgICAgd2hlcmUgPSBGaWxlcy5GaWxlQ29sdW1ucy5EQVRBICsgIj0/IjsKKyAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MgPSBuZXcgU3RyaW5nW10geyBmaWxlUGF0aCB9OworICAgICAgICB9CisKICAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgZmlsZXMgZnJvbSB0aGUgY29udGVudCBwcm92aWRlcgogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBhdWRpbyB0YWJsZQotICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IE1lZGlhU3RvcmUuQXVkaW8uTWVkaWEuREFUQSArICI9PyI7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uQXJncyA9IG5ldyBTdHJpbmdbXSB7IGZpbGVQYXRoIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUF1ZGlvVXJpLCBBVURJT19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CisgICAgICAgICAgICBpZiAocHJlc2NhbkZpbGVzKSB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgcmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBmaWxlcyB0YWJsZQogCi0gICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUZpbGVzVXJpLCBQUkVTQ0FOX1BST0pFQ1RJT04sIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKKworICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKElEX0FVRElPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBBVEhfQVVESU9fQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKERBVEVfTU9ESUZJRURfQVVESU9fQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKFBSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQpAQCAtOTI1LDExNCArOTAwLDE0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVDYWNoZUVudHJ5IGVudHJ5ID0gbmV3IEZpbGVDYWNoZUVudHJ5KG1GaWxlc1VyaSwgcm93SWQsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIGF1ZGlvIHRhYmxlIGFuZCB1cGRhdGUgRmlsZUNhY2hlRW50cnkKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtQXVkaW9VcmksIFBSRVNDQU5fUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKFBSRVNDQU5fSURfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQUkVTQ0FOX1BBVEhfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoUFJFU0NBTl9EQVRFX01PRElGSUVEX0NPTFVNTl9JTkRFWCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobUF1ZGlvVXJpLCByb3dJZCwgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubVRhYmxlVXJpID0gbUF1ZGlvVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1Sb3dJZCA9IHJvd0lkOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIHZpZGVvIHRhYmxlCi0gICAgICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gTWVkaWFTdG9yZS5WaWRlby5NZWRpYS5EQVRBICsgIj0/IjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2hlcmUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1WaWRlb1VyaSwgVklERU9fUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwotCisgICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIHZpZGVvIHRhYmxlIGFuZCB1cGRhdGUgRmlsZUNhY2hlRW50cnkKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtVmlkZW9VcmksIFBSRVNDQU5fUFJPSkVDVElPTiwgd2hlcmUsIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9WSURFT19DT0xVTU5fSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjLmdldFN0cmluZyhQQVRIX1ZJREVPX0NPTFVNTl9JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhEQVRFX01PRElGSUVEX1ZJREVPX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93SWQgPSBjLmdldExvbmcoUFJFU0NBTl9JRF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGMuZ2V0U3RyaW5nKFBSRVNDQU5fUEFUSF9DT0xVTU5fSU5ERVgpOworICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhQUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBlbnRyaWVzIHdpdGggYWJzb2x1dGUgcGF0aCBuYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzY2FubmVyIHJlbW92aW5nIHRoZW0uCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNhc2VJbnNlbnNpdGl2ZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNhY2hlRW50cnkgZW50cnkgPSBtRmlsZUNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobVZpZGVvVXJpLCByb3dJZCwgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubVRhYmxlVXJpID0gbVZpZGVvVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1Sb3dJZCA9IHJvd0lkOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIGltYWdlcyB0YWJsZQotICAgICAgICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IE1lZGlhU3RvcmUuSW1hZ2VzLk1lZGlhLkRBVEEgKyAiPT8iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT3JpZ2luYWxDb3VudCA9IDA7Ci0gICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUltYWdlc1VyaSwgSU1BR0VTX1BST0pFQ1RJT04sIHdoZXJlLCBzZWxlY3Rpb25BcmdzLCBudWxsKTsKLQorICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSB2aWRlbyB0YWJsZSBhbmQgdXBkYXRlIEZpbGVDYWNoZUVudHJ5CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobUltYWdlc1VyaSwgUFJFU0NBTl9QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7CiAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsQ291bnQgPSBjLmdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9JTUFHRVNfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhQUkVTQ0FOX0lEX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gYy5nZXRMb25nKFBSRVNDQU5fREFURV9NT0RJRklFRF9DT0xVTU5fSU5ERVgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgZW50cmllcyB3aXRoIGFic29sdXRlIHBhdGggbmFtZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHN0b3JpbmcgVVJJcyBpbiB0aGUgZGF0YWJhc2Ugd2l0aG91dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgotICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlQ2FjaGUucHV0KGtleSwgbmV3IEZpbGVDYWNoZUVudHJ5KG1JbWFnZXNVcmksIHJvd0lkLCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBzdG9yaW5nIFVSSXMgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNjYW5uZXIgcmVtb3ZpbmcgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2FzZUluc2Vuc2l0aXZlUGF0aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQ2FjaGVFbnRyeSBlbnRyeSA9IG1GaWxlQ2FjaGUuZ2V0KHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZUNhY2hlLnB1dChrZXksIG5ldyBGaWxlQ2FjaGVFbnRyeShtSW1hZ2VzVXJpLCByb3dJZCwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubVRhYmxlVXJpID0gbUltYWdlc1VyaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tUm93SWQgPSByb3dJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Qcm9jZXNzUGxheWxpc3RzKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVhZCBleGlzdGluZyBmaWxlcyBmcm9tIHRoZSBwbGF5bGlzdHMgdGFibGUKLSAgICAgICAgICAgICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IE1lZGlhU3RvcmUuQXVkaW8uUGxheWxpc3RzLkRBVEEgKyAiPT8iOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoZXJlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1QbGF5bGlzdHNVcmksIFBMQVlMSVNUU19QUk9KRUNUSU9OLCB3aGVyZSwgc2VsZWN0aW9uQXJncywgbnVsbCk7Ci0KKyAgICAgICAgICAgICAgICAvLyBSZWFkIGV4aXN0aW5nIGZpbGVzIGZyb20gdGhlIHBsYXlsaXN0cyB0YWJsZSBhbmQgdXBkYXRlIEZpbGVDYWNoZUVudHJ5CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1QbGF5bGlzdHNVcmksIFBSRVNDQU5fUFJPSkVDVElPTiwgd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkFyZ3MsIG51bGwpOwogICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjLm1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUEFUSF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJvd0lkID0gYy5nZXRMb25nKFBSRVNDQU5fSURfQ09MVU1OX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoUFJFU0NBTl9QQVRIX0NPTFVNTl9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGMuZ2V0TG9uZyhQUkVTQ0FOX0RBVEVfTU9ESUZJRURfQ09MVU1OX0lOREVYKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjLmdldExvbmcoREFURV9NT0RJRklFRF9QTEFZTElTVFNfQ09MVU1OX0lOREVYKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gcGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGVudHJpZXMgd2l0aCBhYnNvbHV0ZSBwYXRoIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3Mgc3RvcmluZyBVUklzIGluIHRoZSBkYXRhYmFzZSB3aXRob3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2Nhbm5lciByZW1vdmluZyB0aGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DYXNlSW5zZW5zaXRpdmVQYXRocykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXRoLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVDYWNoZUVudHJ5IGVudHJ5ID0gbUZpbGVDYWNoZS5nZXQocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVDYWNoZS5wdXQoa2V5LCBuZXcgRmlsZUNhY2hlRW50cnkobVBsYXlsaXN0c1VyaSwgcm93SWQsIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tVGFibGVVcmkgPSBtUGxheWxpc3RzVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tUm93SWQgPSByb3dJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTEzNCw3ICsxMTM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChNZWRpYVN0b3JlLkF1ZGlvLlBsYXlsaXN0cy5EQVRFX01PRElGSUVELCAwKTsKICAgICAgICAgICAgICAgICAgICAgbU1lZGlhUHJvdmlkZXIudXBkYXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKG1QbGF5bGlzdHNVcmksIGVudHJ5Lm1Sb3dJZCksIHZhbHVlcywgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUHJvdmlkZXIuZGVsZXRlKENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGVudHJ5Lm1UYWJsZVVyaSwgZW50cnkubVJvd0lkKSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVByb3ZpZGVyLmRlbGV0ZShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChtRmlsZXNVcmksIGVudHJ5Lm1Sb3dJZCksIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTYyLDYgKzExNjQsNyBAQAogICAgICAgICBtVmlkZW9VcmkgPSBWaWRlby5NZWRpYS5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogICAgICAgICBtSW1hZ2VzVXJpID0gSW1hZ2VzLk1lZGlhLmdldENvbnRlbnRVcmkodm9sdW1lTmFtZSk7CiAgICAgICAgIG1UaHVtYnNVcmkgPSBJbWFnZXMuVGh1bWJuYWlscy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOworICAgICAgICBtRmlsZXNVcmkgPSBGaWxlcy5nZXRDb250ZW50VXJpKHZvbHVtZU5hbWUpOwogCiAgICAgICAgIGlmICghdm9sdW1lTmFtZS5lcXVhbHMoImludGVybmFsIikpIHsKICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBwbGF5bGlzdHMgb24gZXh0ZXJuYWwgbWVkaWEKQEAgLTExNzAsOSArMTE3MywxMiBAQAogICAgICAgICAgICAgbUdlbnJlQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVyaT4oKTsKICAgICAgICAgICAgIG1HZW5yZXNVcmkgPSBHZW5yZXMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKICAgICAgICAgICAgIG1QbGF5bGlzdHNVcmkgPSBQbGF5bGlzdHMuZ2V0Q29udGVudFVyaSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIC8vIGFzc3VtaW5nIGV4dGVybmFsIHN0b3JhZ2UgaXMgRkFUIChjYXNlIGluc2Vuc2l0aXZlKSwgZXhjZXB0IG9uIHRoZSBzaW11bGF0b3IuCi0gICAgICAgICAgICBpZiAoIFByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgewotICAgICAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9IHRydWU7CisKKyAgICAgICAgICAgIG1DYXNlSW5zZW5zaXRpdmVQYXRocyA9ICFtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfY2FzZVNlbnNpdGl2ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgICAgICBpZiAoIVByb2Nlc3Muc3VwcG9ydHNQcm9jZXNzZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbXVsYXRvciB1c2VzIGhvc3QgZmlsZSBzeXN0ZW0sIHNvIGl0IHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgICAgICAgICBtQ2FzZUluc2Vuc2l0aXZlUGF0aHMgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExODEsMTEgKzExODcsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7Ci0gICAgICAgICAgICBwcmVzY2FuKG51bGwpOworICAgICAgICAgICAgcHJlc2NhbihudWxsLCB0cnVlKTsKICAgICAgICAgICAgIGxvbmcgcHJlc2NhbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgTWVkaWFGaWxlLnNGaWxlRXh0ZW5zaW9ucywgbUNsaWVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0RpcmVjdG9yeShkaXJlY3Rvcmllc1tpXSwgbUNsaWVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsb25nIHNjYW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIHBvc3RzY2FuKGRpcmVjdG9yaWVzKTsKQEAgLTEyMTIsNyArMTIxOCw3IEBACiAgICAgcHVibGljIFVyaSBzY2FuU2luZ2xlRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIFN0cmluZyBtaW1lVHlwZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZSh2b2x1bWVOYW1lKTsKLSAgICAgICAgICAgIHByZXNjYW4ocGF0aCk7CisgICAgICAgICAgICBwcmVzY2FuKHBhdGgsIHRydWUpOwogCiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKIApAQCAtMTIyNyw2ICsxMjMzLDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzY2FuTXRwRmlsZShTdHJpbmcgcGF0aCwgU3RyaW5nIHZvbHVtZU5hbWUsIGludCBvYmplY3RIYW5kbGUsIGludCBmb3JtYXQpIHsKKyAgICAgICAgTWVkaWFGaWxlLk1lZGlhRmlsZVR5cGUgbWVkaWFGaWxlVHlwZSA9IE1lZGlhRmlsZS5nZXRGaWxlVHlwZShwYXRoKTsKKyAgICAgICAgaW50IGZpbGVUeXBlID0gKG1lZGlhRmlsZVR5cGUgPT0gbnVsbCA/IDAgOiBtZWRpYUZpbGVUeXBlLmZpbGVUeXBlKTsKKworICAgICAgICBpZiAoIU1lZGlhRmlsZS5pc0F1ZGlvRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNWaWRlb0ZpbGVUeXBlKGZpbGVUeXBlKSAmJgorICAgICAgICAgICAgIU1lZGlhRmlsZS5pc0ltYWdlRmlsZVR5cGUoZmlsZVR5cGUpICYmICFNZWRpYUZpbGUuaXNQbGF5TGlzdEZpbGVUeXBlKGZpbGVUeXBlKSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IG9iamVjdEhhbmRsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluaXRpYWxpemUodm9sdW1lTmFtZSk7CisgICAgICAgICAgICAvLyBNVFAgd2lsbCBjcmVhdGUgYSBmaWxlIGVudHJ5IGZvciB1cyBzbyB3ZSBkb24ndCB3YW50IHRvIGRvIGl0IGluIHByZXNjYW4KKyAgICAgICAgICAgIHByZXNjYW4ocGF0aCwgZmFsc2UpOworCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKworICAgICAgICAgICAgLy8gbGFzdE1vZGlmaWVkIGlzIGluIG1pbGxpc2Vjb25kcyBvbiBGaWxlcy4KKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkU2Vjb25kcyA9IGZpbGUubGFzdE1vZGlmaWVkKCkgLyAxMDAwOworCisgICAgICAgICAgICAvLyBhbHdheXMgc2NhbiB0aGUgZmlsZSwgc28gd2UgY2FuIHJldHVybiB0aGUgY29udGVudDovL21lZGlhIFVyaSBmb3IgZXhpc3RpbmcgZmlsZXMKKyAgICAgICAgICAgIG1DbGllbnQuZG9TY2FuRmlsZShwYXRoLCBtZWRpYUZpbGVUeXBlLm1pbWVUeXBlLCBsYXN0TW9kaWZpZWRTZWNvbmRzLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBNZWRpYVNjYW5uZXIuc2NhbkZpbGUoKSIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbU10cE9iamVjdEhhbmRsZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgZmlsZS9kaXJlY3RvcnkgbmFtZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHJpZ2h0CiAgICAgcHJpdmF0ZSBpbnQgbWF0Y2hQYXRocyhTdHJpbmcgcGF0aDEsIFN0cmluZyBwYXRoMikgewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKQEAgLTE1MDYsNyArMTU0Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBleHRlbnNpb25zLCBNZWRpYVNjYW5uZXJDbGllbnQgY2xpZW50KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIE1lZGlhU2Nhbm5lckNsaWVudCBjbGllbnQpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgcHJvY2Vzc0ZpbGUoU3RyaW5nIHBhdGgsIFN0cmluZyBtaW1lVHlwZSwgTWVkaWFTY2FubmVyQ2xpZW50IGNsaWVudCk7CiAgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldExvY2FsZShTdHJpbmcgbG9jYWxlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzBjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ2xpZW50LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgY2xhc3MgTXRwQ2xpZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTXRwQ2xpZW50IjsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwQ2xpZW50KExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG5hdGl2ZV9zZXR1cCgpOworICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNdHBDbGllbnQ6IGxpc3RlbmVyIGlzIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF0aXZlX2ZpbmFsaXplKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU9iamVjdChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2RlbGV0ZV9vYmplY3QoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhcmVudChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9wYXJlbnQoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFN0b3JhZ2VJRChpbnQgZGV2aWNlSUQsIGludCBvYmplY3RJRCkgeworICAgICAgICByZXR1cm4gbmF0aXZlX2dldF9zdG9yYWdlX2lkKGRldmljZUlELCBvYmplY3RJRCk7CisgICAgfQorCisgICAgLy8gY3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIGZvciByZWFkaW5nIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3Qgb3ZlciBNVFAKKyAgICBwdWJsaWMgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV9vcGVuX2ZpbGUoZGV2aWNlSUQsIG9iamVjdElEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKyAgICAgICAgLy8gY2FsbGVkIHdoZW4gYSBuZXcgTVRQIGRldmljZSBoYXMgYmVlbiBkaXNjb3ZlcmVkCisgICAgICAgIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKTsKKworICAgICAgICAvLyBjYWxsZWQgd2hlbiBhbiBNVFAgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgdm9pZCBkZXZpY2VSZW1vdmVkKGludCBpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlQWRkZWQoaW50IGlkKSB7CisgICAgICAgIExvZy5kKFRBRywgImRldmljZUFkZGVkICIgKyBpZCk7CisgICAgICAgIG1MaXN0ZW5lci5kZXZpY2VBZGRlZChpZCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKKyAgICBwcml2YXRlIHZvaWQgZGV2aWNlUmVtb3ZlZChpbnQgaWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGV2aWNlUmVtb3ZlZCAiICsgaWQpOworICAgICAgICBtTGlzdGVuZXIuZGV2aWNlUmVtb3ZlZChpZCk7CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIG5hdGl2ZV9kZWxldGVfb2JqZWN0KGludCBkZXZpY2VJRCwgaW50IG9iamVjdElEKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlX2dldF9wYXJlbnQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworICAgIHByaXZhdGUgbmF0aXZlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5hdGl2ZV9vcGVuX2ZpbGUoaW50IGRldmljZUlELCBpbnQgb2JqZWN0SUQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2Y2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXRwQ29uc3RhbnRzIHsKKworLy8gTVRQIFJlc3BvbnNlIENvZGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5ERUZJTkVEID0gMHgyMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09LID0gMHgyMDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0dFTkVSQUxfRVJST1IgPSAweDIwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTiA9IDB4MjAwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1RSQU5TQUNUSU9OX0lEID0gMHgyMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gMHgyMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEID0gMHgyMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgPSAweDIwMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEID0gMHgyMDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSA9IDB4MjAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEID0gMHgyMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFID0gMHgyMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JBR0VfRlVMTCA9IDB4MjAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9PQkpFQ1RfV1JJVEVfUFJPVEVDVEVEID0gMHgyMDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NUT1JFX1JFQURfT05MWSA9IDB4MjAwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9BQ0NFU1NfREVOSUVEID0gMHgyMDBGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UID0gMHgyMDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgPSAweDIwMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfUEFSVElBTF9ERUxFVElPTiA9IDB4MjAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TVE9SRV9OT1RfQVZBSUxBQkxFID0gMHgyMDEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEID0gMHgyMDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPID0gMHgyMDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgPSAweDIwMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfVU5LTk9XTl9WRU5ET1JfQ09ERSA9IDB4MjAxNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9DQVBUVVJFX0FMUkVBRFlfVEVSTUlOQVRFRCA9IDB4MjAxODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9ERVZJQ0VfQlVTWSA9IDB4MjAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1QgPSAweDIwMUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9GT1JNQVQgPSAweDIwMUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9ERVZJQ0VfUFJPUF9WQUxVRSA9IDB4MjAxQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUiA9IDB4MjAxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTiA9IDB4MjAxRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQgPSAweDIwMUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9PRl9ERVNUSU5BVElPTl9VTlNVUFBPUlRFRCA9IDB4MjAyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9QUk9QX0NPREUgPSAweEE4MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQgPSAweEE4MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9WQUxVRSA9IDB4QTgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX09CSkVDVF9SRUZFUkVOQ0UgPSAweEE4MDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfR1JPVVBfTk9UX1NVUFBPUlRFRCA9IDB4QTgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9JTlZBTElEX0RBVEFTRVQgPSAweEE4MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfU1BFQ0lGSUNBVElPTl9CWV9HUk9VUF9VTlNVUFBPUlRFRCA9IDB4QTgwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNQT05TRV9TUEVDSUZJQ0FUSU9OX0JZX0RFUFRIX1VOU1VQUE9SVEVEID0gMHhBODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgPSAweEE4MDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRCA9IDB4QTgwQTsKKworICAgIC8vIE1UUCBmb3JtYXQgY29kZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEID0gMHgzMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU1NPQ0lBVElPTiA9IDB4MzAwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfU0NSSVBUID0gMHgzMDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FWEVDVVRBQkxFID0gMHgzMDAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9URVhUID0gMHgzMDA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9IVE1MID0gMHgzMDA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9EUE9GID0gMHgzMDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BSUZGID0gMHgzMDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XQVYgPSAweDMwMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01QMyA9IDB4MzAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQVZJID0gMHgzMDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUEVHID0gMHgzMDBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BU0YgPSAweDMwMEM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RFRklORUQgPSAweDM4MDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VYSUZfSlBFRyA9IDB4MzgwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVElGRl9FUCA9IDB4MzgwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRkxBU0hQSVggPSAweDM4MDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0JNUCA9IDB4MzgwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQ0lGRiA9IDB4MzgwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfR0lGID0gMHgzODA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KRklGID0gMHgzODA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DRCA9IDB4MzgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUElDVCA9IDB4MzgwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUE5HID0gMHgzODBCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGID0gMHgzODBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9USUZGX0lUID0gMHgzODBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9KUDIgPSAweDM4MEY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0pQWCA9IDB4MzgxMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFID0gMHhCODAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XSU5ET1dTX0lNQUdFX0ZPUk1BVCA9IDB4Qjg4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0FVRElPID0gMHhCOTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9XTUEgPSAweEI5MDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX09HRyA9IDB4QjkwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUFDID0gMHhCOTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BVURJQkxFID0gMHhCOTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9GTEFDID0gMHhCOTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfVklERU8gPSAweEI5ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dNViA9IDB4Qjk4MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVA0X0NPTlRBSU5FUiA9IDB4Qjk4MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVAyID0gMHhCOTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF8zR1BfQ09OVEFJTkVSID0gMHhCOTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfQ09MTEVDVElPTiA9IDB4QkEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSA9IDB4QkEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0gPSAweEJBMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0FVRElPX0FMQlVNID0gMHhCQTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9WSURFT19BTEJVTSA9IDB4QkEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QgPSAweEJBMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1RfR1JPVVAgPSAweEJBMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSID0gMHhCQTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiA9IDB4QkEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgPSAweEJBMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUID0gMHhCQTBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgPSAweEJBMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1dQTF9QTEFZTElTVCA9IDB4QkExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTTNVX1BMQVlMSVNUID0gMHhCQTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NUExfUExBWUxJU1QgPSAweEJBMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FTWF9QTEFZTElTVCA9IDB4QkExMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfUExTX1BMQVlMSVNUID0gMHhCQTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9VTkRFRklORURfRE9DVU1FTlQgPSAweEJBODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UID0gMHhCQTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9YTUxfRE9DVU1FTlQgPSAweEJBODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01TX1dPUkRfRE9DVU1FTlQgPSAweEJBODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UID0gMHhCQTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCA9IDB4QkE4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gPSAweEJBODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFID0gMHhCQjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSA9IDB4QkIwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgPSAweEJCODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgPSAweEJCODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX1ZDQVJEXzIgPSAweEJCODI7CisKKyAgICAvLyBNVFAgb2JqZWN0IHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVE9SQUdFX0lEID0gMHhEQzAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GT1JNQVQgPSAweERDMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVMgPSAweERDMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT0JKRUNUX1NJWkUgPSAweERDMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSA9IDB4REMwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDID0gMHhEQzA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgPSAweERDMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9DUkVBVEVEID0gMHhEQzA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfTU9ESUZJRUQgPSAweERDMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfS0VZV09SRFMgPSAweERDMEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UX09CSkVDVCA9IDB4REMwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyA9IDB4REMwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9ISURERU4gPSAweERDMEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU1lTVEVNX09CSkVDVCA9IDB4REMwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTSVNURU5UX1VJRCA9IDB4REM0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TWU5DX0lEID0gMHhEQzQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST1BFUlRZX0JBRyA9IDB4REM0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OQU1FID0gMHhEQzQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRUFURURfQlkgPSAweERDNDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVJUSVNUID0gMHhEQzQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0RBVEVfQVVUSE9SRUQgPSAweERDNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAweERDNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSA9IDB4REM0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgPSAweERDNEE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09QWVJJR0hUX0lORk9STUFUSU9OID0gMHhEQzRCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NPVVJDRSA9IDB4REM0QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gPSAweERDNEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfREFURV9BRERFRCA9IDB4REM0RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9OT05fQ09OU1VNQUJMRSA9IDB4REM0RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgPSAweERDNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUFJPRFVDRVJfU0VSSUFMX05VTUJFUiA9IDB4REM1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRk9STUFUID0gMHhEQzgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFID0gMHhEQzgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgPSAweERDODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIID0gMHhEQzg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiA9IDB4REM4NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfREFUQSA9IDB4REM4NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XSURUSCA9IDB4REM4NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9IRUlHSFQgPSAweERDODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRFVSQVRJT04gPSAweERDODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUkFUSU5HID0gMHhEQzhBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1RSQUNLID0gMHhEQzhCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dFTlJFID0gMHhEQzhDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NSRURJVFMgPSAweERDOEQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTFlSSUNTID0gMHhEQzhFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEID0gMHhEQzhGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BST0RVQ0VEX0JZID0gMHhEQzkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1VTRV9DT1VOVCA9IDB4REM5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TS0lQX0NPVU5UID0gMHhEQzkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0xBU1RfQUNDRVNTRUQgPSAweERDOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEFSRU5UQUxfUkFUSU5HID0gMHhEQzk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FVEFfR0VOUkUgPSAweERDOTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQ09NUE9TRVIgPSAweERDOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRUZGRUNUSVZFX1JBVElORyA9IDB4REM5NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJUSVRMRSA9IDB4REM5ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PUklHSU5BTF9SRUxFQVNFX0RBVEUgPSAweERDOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUxCVU1fTkFNRSA9IDB4REM5QTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BTEJVTV9BUlRJU1QgPSAweERDOUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTU9PRCA9IDB4REM5QzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9EUk1fU1RBVFVTID0gMHhEQzlEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NVQl9ERVNDUklQVElPTiA9IDB4REM5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JU19DUk9QUEVEID0gMHhEQ0QxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQgPSAweERDRDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfSU1BR0VfQklUX0RFUFRIID0gMHhEQ0QzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZfTlVNQkVSID0gMHhEQ0Q0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VYUE9TVVJFX1RJTUUgPSAweERDRDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRVhQT1NVUkVfSU5ERVggPSAweERDRDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVE9UQUxfQklUUkFURSA9IDB4REU5MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVRSQVRFX1RZUEUgPSAweERFOTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0FNUExFX1JBVEUgPSAweERFOTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTID0gMHhERTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FVRElPX0JJVF9ERVBUSCA9IDB4REU5NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TQ0FOX1RZUEUgPSAweERFOTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyA9IDB4REU5OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BVURJT19CSVRSQVRFID0gMHhERTlBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyA9IDB4REU5QjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9WSURFT19CSVRSQVRFID0gMHhERTlDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyA9IDB4REU5RDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9LRVlGUkFNRV9ESVNUQU5DRSA9IDB4REU5RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVUZGRVJfU0laRSA9IDB4REU5RjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZID0gMHhERUEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgPSAweERFQTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRElTUExBWV9OQU1FID0gMHhEQ0UwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0JPRFlfVEVYVCA9IDB4RENFMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUJKRUNUID0gMHhEQ0UyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU9SSVRZID0gMHhEQ0UzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0dJVkVOX05BTUUgPSAweEREMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUlERExFX05BTUVTID0gMHhERDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBTUlMWV9OQU1FID0gMHhERDAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSRUZJWCA9IDB4REQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9TVUZGSVggPSAweEREMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSA9IDB4REQwNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSA9IDB4REQwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9QUklNQVJZID0gMHhERDA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEgPSAweEREMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMiA9IDB4REQwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9FTUFJTF9CVVNJTkVTU18xID0gMHhERDBBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIgPSAweEREMEI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRU1BSUxfT1RIRVJTID0gMHhERDBDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZID0gMHhERDBEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCA9IDB4REQwRTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiA9IDB4REQwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QSE9ORV9OVU1CRVJfQlVTSU5FU1MgPSAweEREMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgPSAweEREMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX01PQklMRT0gMHhERDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiA9IDB4REQxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9GQVhfTlVNQkVSX1BSSU1BUlkgPSAweEREMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRkFYX05VTUJFUl9QRVJTT05BTD0gMHhERDE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1M9IDB4REQxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQUdFUl9OVU1CRVIgPSAweEREMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVfTlVNQkVSX09USEVSUz0gMHhERDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1M9IDB4REQxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QRVJTT05BTF9XRUJfQUREUkVTUyA9IDB4REQxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyA9IDB4REQxQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTID0gMHhERDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiA9IDB4REQxRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgPSAweEREMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfRlVMTCA9IDB4REQxRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzEgPSAweEREMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8yID0gMHhERDIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgPSAweEREMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OID0gMHhERDIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFID0gMHhERDI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgPSAweEREMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCA9IDB4REQyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgPSAweEREMjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfTElORV8yID0gMHhERDI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkgPSAweEREMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfUkVHSU9OID0gMHhERDJBOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFID0gMHhERDJCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkgPSAweEREMkM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfRlVMTCA9IDB4REQyRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9MSU5FXzEgPSAweEREMkU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yID0gMHhERDJGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkgPSAweEREMzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUkVHSU9OID0gMHhERDMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFID0gMHhERDMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkgPSAweEREMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgPSAweEREMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfUk9MRSA9IDB4REQzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9CSVJUSERBVEUgPSAweEREMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9UTyA9IDB4REQ0MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX0NDID0gMHhERDQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfQkNDID0gMHhERDQyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FU1NBR0VfUkVBRCA9IDB4REQ0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgPSAweERENDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTUVTU0FHRV9TRU5ERVIgPSAweERENDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSA9IDB4REQ1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSA9IDB4REQ1MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9MT0NBVElPTiA9IDB4REQ1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9SRVFVSVJFRF9BVFRFTkRFRVMgPSAweERENTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1BUSU9OQUxfQVRURU5ERUVTID0gMHhERDU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyA9IDB4REQ1NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9BQ0NFUFRFRCA9IDB4REQ1NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgPSAweERENTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfREVDTElORUQgPSAweERENTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgPSAweERENUE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfT1dORVIgPSAweERENUI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQUNUSVZJVFlfU1RBVFVTID0gMHhERDVDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX09XTkVSID0gMHhERDVEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VESVRPUiA9IDB4REQ1RTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9XRUJNQVNURVIgPSAweERENUY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVVJMX1NPVVJDRSA9IDB4REQ2MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9VUkxfREVTVElOQVRJT04gPSAweERENjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9CT09LTUFSSyA9IDB4REQ2MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9PQkpFQ1RfQk9PS01BUksgPSAweERENjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfQllURV9CT09LTUFSSyA9IDB4REQ2NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9MQVNUX0JVSUxEX0RBVEUgPSAweERENzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfVElNRV9UT19MSVZFID0gMHhERDcxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX01FRElBX0dVSUQgPSAweERENzI7CisKKyAgICAvLyBNVFAgZGV2aWNlIHByb3BlcnRpZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVU5ERUZJTkVEID0gMHg1MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CQVRURVJZX0xFVkVMID0gMHg1MDAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgPSAweDUwMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgPSAweDUwMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkcgPSAweDUwMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UgPSAweDUwMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOID0gMHg1MDA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GX05VTUJFUiA9IDB4NTAwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DQUxfTEVOR1RIID0gMHg1MDA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19ESVNUQU5DRSA9IDB4NTAwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSA9IDB4NTAwQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfTUVURVJJTkdfTU9ERSA9IDB4NTAwQjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRkxBU0hfTU9ERSA9IDB4NTAwQzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSA9IDB4NTAwRDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfUFJPR1JBTV9NT0RFID0gMHg1MDBFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9JTkRFWCA9IDB4NTAwRjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gPSAweDUwMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FID0gMHg1MDExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9DQVBUVVJFX0RFTEFZID0gMHg1MDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TVElMTF9DQVBUVVJFX01PREUgPSAweDUwMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUID0gMHg1MDE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TSEFSUE5FU1MgPSAweDUwMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSA9IDB4NTAxNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfRUZGRUNUX01PREUgPSAweDUwMTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUj0gMHg1MDE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9CVVJTVF9JTlRFUlZBTCA9IDB4NTAxOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX05VTUJFUiA9IDB4NTAxQTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfVElNRUxBUFNFX0lOVEVSVkFMID0gMHg1MDFCOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9GT0NVU19NRVRFUklOR19NT0RFID0gMHg1MDFDOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMID0gMHg1MDFEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9BUlRJU1QgPSAweDUwMUU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPID0gMHg1MDFGOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiA9IDB4RDQwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUUgPSAweEQ0MDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1ZPTFVNRSA9IDB4RDQwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfU1VQUE9SVEVEX0ZPUk1BVFNfT1JERVJFRCA9IDB4RDQwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0lDT04gPSAweEQ0MDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUgPSAweEQ0MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCA9IDB4RDQxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfQ09OVEFJTkVSX0lOREVYID0gMHhENDEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUWV9TRVNTSU9OX0lOSVRJQVRPUl9WRVJTSU9OX0lORk8gPSAweEQ0MDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSA9IDB4RDQwNzsKKworCisgICAgLyoqCisgICAgICogT2JqZWN0IGlzIG5vdCBwcm90ZWN0ZWQuIEl0IG1heSBiZSBtb2RpZmllZCBhbmQgZGVsZXRlZCwgYW5kIGl0cyBwcm9wZXJ0aWVzCisgICAgICogbWF5IGJlIG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RJT05fU1RBVFVTX05PTkUgPSAwOworCisgICAgLyoqCisgICAgICogT2JqZWN0IGNhbiBub3QgYmUgbW9kaWZpZWQgb3IgZGVsZXRlZCBhbmQgaXRzIHByb3BlcnRpZXMgY2FuIG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFkgPSAweDgwMDE7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgY2FuIG5vdCBiZSBtb2RpZmllZCBvciBkZWxldGVkIGJ1dCBpdHMgcHJvcGVydGllcyBhcmUgbW9kaWZpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19SRUFEX09OTFlfREFUQSA9IDB4ODAwMjsKKworICAgIC8qKgorICAgICAqIE9iamVjdCdzIGNvbnRlbnRzIGNhbiBub3QgYmUgdHJhbnNmZXJlZCBmcm9tIHRoZSBkZXZpY2UsIGJ1dCB0aGUgb2JqZWN0CisgICAgICogbWF5IGJlIG1vdmVkIG9yIGRlbGV0ZWQgYW5kIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNUSU9OX1NUQVRVU19OT05fVFJBTlNGRVJBQkxFX0RBVEEgPSAweDgwMDM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NPQ0lBVElPTl9UWVBFX0dFTkVSSUNfRk9MREVSID0gMHgwMDAxOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cEN1cnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MTQyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkFic3RyYWN0V2luZG93ZWRDdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXaW5kb3c7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAgKiBDdXJzb3IgY2xhc3MgZm9yIE1UUCBjb250ZW50IHByb3ZpZGVyCisgICogQGhpZGUKKyAgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNdHBDdXJzb3IgZXh0ZW5kcyBBYnN0cmFjdFdpbmRvd2VkQ3Vyc29yIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBDdXJzb3IiOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fQ09VTlQgPSAtMTsKKworICAgIC8qIGNvbnN0YW50cyBmb3IgbVF1ZXJ5VHlwZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRSAgICAgICAgICAgICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9JRCAgICAgICAgICAgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0UgICAgICAgICAgICAgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSUQgICAgICAgICAgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVCAgICAgICAgICAgICAgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JRCAgICAgICAgICAgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9DSElMRFJFTiAgICAgPSA4OworCisgICAgcHJpdmF0ZSBpbnQgbVF1ZXJ5VHlwZTsKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtUWJqZWN0SUQ7CisKKyAgICAvKiogVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBwcm9qZWN0aW9uICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtQ29sdW1uczsKKworICAgIC8qKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGN1cnNvciAqLworICAgIHByaXZhdGUgaW50IG1Db3VudCA9IE5PX0NPVU5UOworCisgICAgcHJpdmF0ZSBmaW5hbCBNdHBDbGllbnQgbUNsaWVudDsKKworICAgIHB1YmxpYyBNdHBDdXJzb3IoTXRwQ2xpZW50IGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELCBpbnQgc3RvcmFnZUlELCBpbnQgb2JqZWN0SUQsCisgICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisKKyAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbVF1ZXJ5VHlwZSA9IHF1ZXJ5VHlwZTsKKyAgICAgICAgbURldmljZUlEID0gZGV2aWNlSUQ7CisgICAgICAgIG1TdG9yYWdlSUQgPSBzdG9yYWdlSUQ7CisgICAgICAgIG1RYmplY3RJRCA9IG9iamVjdElEOworICAgICAgICBtQ29sdW1ucyA9IHByb2plY3Rpb247CisKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcDsKKyAgICAgICAgc3dpdGNoIChxdWVyeVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFOgorICAgICAgICAgICAgY2FzZSBERVZJQ0VfSUQ6CisgICAgICAgICAgICAgICAgbWFwID0gc0RldmljZVByb2plY3Rpb25NYXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUT1JBR0U6CisgICAgICAgICAgICBjYXNlIFNUT1JBR0VfSUQ6CisgICAgICAgICAgICAgICAgbWFwID0gc1N0b3JhZ2VQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9JRDoKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9DSElMRFJFTjoKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0NISUxEUkVOOgorICAgICAgICAgICAgICAgIG1hcCA9IHNPYmplY3RQcm9qZWN0aW9uTWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHF1ZXJ5IHR5cGUgIiAgKyBxdWVyeVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaW50W10gY29sdW1ucyA9IG5ldyBpbnRbcHJvamVjdGlvbi5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3Rpb24ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEludGVnZXIgaWQgPSBtYXAuZ2V0KHByb2plY3Rpb25baV0pOworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNvbHVtbiAiICArIHByb2plY3Rpb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sdW1uc1tpXSA9IGlkLmludFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX3NldHVwKGNsaWVudCwgcXVlcnlUeXBlLCBkZXZpY2VJRCwgc3RvcmFnZUlELCBvYmplY3RJRCwgY29sdW1ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVfZmluYWxpemUoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICBpZiAobUNvdW50ID09IE5PX0NPVU5UKSB7CisgICAgICAgICAgICBmaWxsV2luZG93KDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWVyeSgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAicmVxdWVyeSIpOworICAgICAgICBtQ291bnQgPSBOT19DT1VOVDsKKyAgICAgICAgaWYgKG1XaW5kb3cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGxXaW5kb3coaW50IHN0YXJ0UG9zKSB7CisgICAgICAgIGlmIChtV2luZG93ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzbid0IGEgd2luZG93IHNldCBhbHJlYWR5IGl0IHdpbGwgb25seSBiZSBhY2Nlc3NlZCBsb2NhbGx5CisgICAgICAgICAgICBtV2luZG93ID0gbmV3IEN1cnNvcldpbmRvdyh0cnVlIC8qIHRoZSB3aW5kb3cgaXMgbG9jYWwgb25seSAqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVdpbmRvdy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1XaW5kb3cuc2V0U3RhcnRQb3NpdGlvbihzdGFydFBvcyk7CisgICAgICAgIG1Db3VudCA9IG5hdGl2ZV9maWxsX3dpbmRvdyhtV2luZG93LCBzdGFydFBvcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRDb2x1bW5OYW1lcyByZXR1cm5pbmcgIiArIG1Db2x1bW5zKTsKKyAgICAgICAgcmV0dXJuIG1Db2x1bW5zOworICAgIH0KKworICAgIC8qIERldmljZSBDb2x1bW4gSURzICovCisgICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1JPV19JRCAgICAgICAgICA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9NQU5VRkFDVFVSRVIgICAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfTU9ERUwgICAgICAgICAgID0gMzsKKworICAgIC8qIFN0b3JhZ2UgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfUk9XX0lEICAgICAgICAgPSAxMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfSURFTlRJRklFUiAgICAgPSAxMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUT1JBR0VfREVTQ1JJUFRJT04gICAgPSAxMDM7CisKKyAgICAvKiBPYmplY3QgQ29sdW1uIElEcyAqLworICAgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuY3BwICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9ST1dfSUQgICAgICAgICAgICAgID0gMjAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU1RPUkFHRV9JRCAgICAgICAgICA9IDIwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgPSAyMDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QUk9URUNUSU9OX1NUQVRVUyAgID0gMjA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfU0laRSAgICAgICAgICAgICAgICA9IDIwNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgPSAyMDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9USFVNQl9TSVpFICAgICAgICAgID0gMjA3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfVEhVTUJfV0lEVEggICAgICAgICA9IDIwODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgPSAyMDk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9JTUFHRV9XSURUSCAgICAgICAgID0gMjEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfSU1BR0VfSEVJR0hUICAgICAgICA9IDIxMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgPSAyMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9QQVJFTlQgICAgICAgICAgICAgID0gMjEzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfQVNTT0NJQVRJT05fVFlQRSAgICA9IDIxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgPSAyMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9TRVFVRU5DRV9OVU1CRVIgICAgID0gMjE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfTkFNRSAgICAgICAgICAgICAgICA9IDIxNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgPSAyMTg7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9EQVRFX01PRElGSUVEICAgICAgID0gMjE5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPQkpFQ1RfS0VZV09SRFMgICAgICAgICAgICA9IDIyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgPSAyMjE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc0RldmljZVByb2plY3Rpb25NYXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHNTdG9yYWdlUHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4gc09iamVjdFByb2plY3Rpb25NYXA7CisKKyAgICBzdGF0aWMgeworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgc0RldmljZVByb2plY3Rpb25NYXAucHV0KE10cC5EZXZpY2UuX0lELCBuZXcgSW50ZWdlcihERVZJQ0VfUk9XX0lEKSk7CisgICAgICAgIHNEZXZpY2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgbmV3IEludGVnZXIoREVWSUNFX01BTlVGQUNUVVJFUikpOworICAgICAgICBzRGV2aWNlUHJvamVjdGlvbk1hcC5wdXQoTXRwLkRldmljZS5NT0RFTCwgbmV3IEludGVnZXIoREVWSUNFX01PREVMKSk7CisKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzU3RvcmFnZVByb2plY3Rpb25NYXAucHV0KE10cC5TdG9yYWdlLl9JRCwgbmV3IEludGVnZXIoU1RPUkFHRV9ST1dfSUQpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5JREVOVElGSUVSLCBuZXcgSW50ZWdlcihTVE9SQUdFX0lERU5USUZJRVIpKTsKKyAgICAgICAgc1N0b3JhZ2VQcm9qZWN0aW9uTWFwLnB1dChNdHAuU3RvcmFnZS5ERVNDUklQVElPTiwgbmV3IEludGVnZXIoU1RPUkFHRV9ERVNDUklQVElPTikpOworCisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5fSUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9ST1dfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU1RPUkFHRV9JRCwgbmV3IEludGVnZXIoT0JKRUNUX1NUT1JBR0VfSUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlBST1RFQ1RJT05fU1RBVFVTLCBuZXcgSW50ZWdlcihPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuU0laRSwgbmV3IEludGVnZXIoT0JKRUNUX1NJWkUpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfRk9STUFULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfRk9STUFUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1NJWkUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9USFVNQl9TSVpFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlRIVU1CX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuVEhVTUJfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfVEhVTUJfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX1dJRFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfV0lEVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuSU1BR0VfSEVJR0hULCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfSEVJR0hUKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LklNQUdFX0RFUFRILCBuZXcgSW50ZWdlcihPQkpFQ1RfSU1BR0VfREVQVEgpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuUEFSRU5ULCBuZXcgSW50ZWdlcihPQkpFQ1RfUEFSRU5UKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX1RZUEUsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LkFTU09DSUFUSU9OX0RFU0MsIG5ldyBJbnRlZ2VyKE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDKSk7CisgICAgICAgIHNPYmplY3RQcm9qZWN0aW9uTWFwLnB1dChNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwgbmV3IEludGVnZXIoT0JKRUNUX1NFUVVFTkNFX05VTUJFUikpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5OQU1FLCBuZXcgSW50ZWdlcihPQkpFQ1RfTkFNRSkpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5EQVRFX0NSRUFURUQsIG5ldyBJbnRlZ2VyKE9CSkVDVF9EQVRFX0NSRUFURUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuREFURV9NT0RJRklFRCwgbmV3IEludGVnZXIoT0JKRUNUX0RBVEVfTU9ESUZJRUQpKTsKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuS0VZV09SRFMsIG5ldyBJbnRlZ2VyKE9CSkVDVF9LRVlXT1JEUykpOworICAgICAgICBzT2JqZWN0UHJvamVjdGlvbk1hcC5wdXQoTXRwLk9iamVjdC5USFVNQiwgbmV3IEludGVnZXIoT0JKRUNUX1RIVU1CKSk7CisKKyAgICAgICAgc09iamVjdFByb2plY3Rpb25NYXAucHV0KE10cC5PYmplY3QuTkFNRSwgbmV3IEludGVnZXIoT0JKRUNUX05BTUUpKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwQ2xpZW50IGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgIGludCBkZXZpY2VJRCwgaW50IHN0b3JhZ2VJRCwgaW50IG9iamVjdElELCBpbnRbXSBjb2x1bW5zKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlX3dhaXRfZm9yX2V2ZW50KCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgaW50IG5hdGl2ZV9maWxsX3dpbmRvdyhDdXJzb3JXaW5kb3cgd2luZG93LCBpbnQgc3RhcnRQb3MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBiNzYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cERhdGFiYXNlLmphdmEKQEAgLTAsMCArMSw1NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuQXVkaW87CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLk1lZGlhQ29sdW1uczsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmUuRmlsZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBEYXRhYmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk10cERhdGFiYXNlIjsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIElDb250ZW50UHJvdmlkZXIgbU1lZGlhUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZvbHVtZU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbU9iamVjdHNVcmk7CisKKyAgICAvLyB0cnVlIGlmIHRoZSBkYXRhYmFzZSBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgY3VycmVudCBNVFAgc2Vzc2lvbgorICAgIHByaXZhdGUgYm9vbGVhbiBtRGF0YWJhc2VNb2RpZmllZDsKKworICAgIC8vIGRhdGFiYXNlIGZvciB3cml0YWJsZSBNVFAgZGV2aWNlIHByb3BlcnRpZXMKKyAgICBwcml2YXRlIFNRTGl0ZURhdGFiYXNlIG1EZXZpY2VQcm9wRGI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFVklDRV9QUk9QRVJUSUVTX0RBVEFCQVNFX1ZFUlNJT04gPSAxOworCisgICAgLy8gRklYTUUgLSB0aGlzIHNob3VsZCBiZSBwYXNzZWQgaW4gdmlhIHRoZSBjb25zdHJ1Y3RvcgorICAgIHByaXZhdGUgZmluYWwgaW50IG1TdG9yYWdlSUQgPSAweDAwMDEwMDAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSURfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIC8vIDAKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBVEhfU0laRV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLl9JRCwgLy8gMAorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuREFUQSwgLy8gMQorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuU0laRSwgLy8gMgorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT0JKRUNUX0lORk9fUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5fSUQsIC8vIDAKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEsIC8vIDEKKyAgICAgICAgICAgIEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCwgLy8gMgorICAgICAgICAgICAgRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5ULCAvLyAzCisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5TSVpFLCAvLyA0CisgICAgICAgICAgICBGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVELCAvLyA1CisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5fSUQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuREFUQSArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9XSEVSRSA9IEZpbGVzLkZpbGVDb2x1bW5zLlBBUkVOVCArICI9PyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9GT1JNQVRfV0hFUkUgPSBQQVJFTlRfV0hFUkUgKyAiIEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFUICsgIj0/IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFVklDRV9QUk9QRVJUWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsgIl9pZCIsICJ2YWx1ZSIgfTsKKyAgICBwcml2YXRlICBzdGF0aWMgZmluYWwgU3RyaW5nIERFVklDRV9QUk9QRVJUWV9XSEVSRSA9ICJjb2RlPT8iOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNjYW5uZXIgbU1lZGlhU2Nhbm5lcjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgibWVkaWFfam5pIik7CisgICAgfQorCisgICAgcHVibGljIE10cERhdGFiYXNlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHZvbHVtZU5hbWUpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKCk7CisKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtTWVkaWFQcm92aWRlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkuYWNxdWlyZVByb3ZpZGVyKCJtZWRpYSIpOworICAgICAgICBtVm9sdW1lTmFtZSA9IHZvbHVtZU5hbWU7CisgICAgICAgIG1PYmplY3RzVXJpID0gRmlsZXMuZ2V0TXRwT2JqZWN0c1VyaSh2b2x1bWVOYW1lKTsKKyAgICAgICAgbU1lZGlhU2Nhbm5lciA9IG5ldyBNZWRpYVNjYW5uZXIoY29udGV4dCk7CisgICAgICAgIG9wZW5EZXZpY2VQcm9wZXJ0aWVzRGF0YWJhc2UoY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvcGVuRGV2aWNlUHJvcGVydGllc0RhdGFiYXNlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBtRGV2aWNlUHJvcERiID0gY29udGV4dC5vcGVuT3JDcmVhdGVEYXRhYmFzZSgiZGV2aWNlLXByb3BlcnRpZXMiLCBDb250ZXh0Lk1PREVfUFJJVkFURSwgbnVsbCk7CisgICAgICAgIGludCB2ZXJzaW9uID0gbURldmljZVByb3BEYi5nZXRWZXJzaW9uKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gREVWSUNFX1BST1BFUlRJRVNfREFUQUJBU0VfVkVSU0lPTikgeworICAgICAgICAgICAgbURldmljZVByb3BEYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgcHJvcGVydGllcyAoIiArCisgICAgICAgICAgICAgICAgICAgICJfaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCIgKworICAgICAgICAgICAgICAgICAgICAiY29kZSBJTlRFR0VSIFVOSVFVRSBPTiBDT05GTElDVCBSRVBMQUNFLCIgKworICAgICAgICAgICAgICAgICAgICAidmFsdWUgVEVYVCIgKworICAgICAgICAgICAgICAgICAgICAiKTsiKTsKKyAgICAgICAgICAgIG1EZXZpY2VQcm9wRGIuZXhlY1NRTCgiQ1JFQVRFIElOREVYIHByb3BlcnR5X2luZGV4IE9OIHByb3BlcnRpZXMgKGNvZGUpOyIpOworICAgICAgICAgICAgbURldmljZVByb3BEYi5zZXRWZXJzaW9uKERFVklDRV9QUk9QRVJUSUVTX0RBVEFCQVNFX1ZFUlNJT04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgYmVnaW5TZW5kT2JqZWN0KFN0cmluZyBwYXRoLCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlLCBsb25nIHNpemUsIGxvbmcgbW9kaWZpZWQpIHsKKyAgICAgICAgbURhdGFiYXNlTW9kaWZpZWQgPSB0cnVlOworICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuREFUQSwgcGF0aCk7CisgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFULCBmb3JtYXQpOworICAgICAgICB2YWx1ZXMucHV0KEZpbGVzLkZpbGVDb2x1bW5zLlBBUkVOVCwgcGFyZW50KTsKKyAgICAgICAgLy8gc3RvcmFnZSBpcyBpZ25vcmVkIGZvciBub3cKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5TSVpFLCBzaXplKTsKKyAgICAgICAgdmFsdWVzLnB1dChGaWxlcy5GaWxlQ29sdW1ucy5EQVRFX01PRElGSUVELCBtb2RpZmllZCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBtTWVkaWFQcm92aWRlci5pbnNlcnQobU9iamVjdHNVcmksIHZhbHVlcyk7CisgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGJlZ2luU2VuZE9iamVjdCIsIGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZFNlbmRPYmplY3QoU3RyaW5nIHBhdGgsIGludCBoYW5kbGUsIGludCBmb3JtYXQsIGJvb2xlYW4gc3VjY2VlZGVkKSB7CisgICAgICAgIGlmIChzdWNjZWVkZWQpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBhYnN0cmFjdCBwbGF5bGlzdHMgc2VwYXJhdGVseQorICAgICAgICAgICAgLy8gdGhleSBkbyBub3QgZXhpc3QgaW4gdGhlIGZpbGUgc3lzdGVtIHNvIGRvbid0IHVzZSB0aGUgbWVkaWEgc2Nhbm5lciBoZXJlCisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IE10cENvbnN0YW50cy5GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBTdHJpcCBXaW5kb3dzIE1lZGlhIFBsYXllciBmaWxlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIucGxhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5hbWUgZnJvbSBwYXRoCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgIGludCBsYXN0U2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKDEpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQXVkaW8uUGxheWxpc3RzLkRBVEEsIHBhdGgpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQXVkaW8uUGxheWxpc3RzLk5BTUUsIG5hbWUpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTWVkaWFDb2x1bW5zLk1FRElBX1NDQU5ORVJfTkVXX09CSkVDVF9JRCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBVcmkgdXJpID0gbU1lZGlhUHJvdmlkZXIuaW5zZXJ0KEF1ZGlvLlBsYXlsaXN0cy5FWFRFUk5BTF9DT05URU5UX1VSSSwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZW5kU2VuZE9iamVjdCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU1lZGlhU2Nhbm5lci5zY2FuTXRwRmlsZShwYXRoLCBtVm9sdW1lTmFtZSwgaGFuZGxlLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsZXRlRmlsZShoYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRPYmplY3RMaXN0KGludCBzdG9yYWdlSUQsIGludCBmb3JtYXQsIGludCBwYXJlbnQpIHsKKyAgICAgICAgLy8gd2UgY2FuIGlnbm9yZSBzdG9yYWdlSUQgdW50aWwgd2Ugc3VwcG9ydCBtdWx0aXBsZSBzdG9yYWdlcworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RMaXN0IHBhcmVudDogIiArIHBhcmVudCk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibnVsbCBjdXJzb3IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBjb3VudCA9IGMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2NvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYy5tb3ZlVG9OZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGMuZ2V0SW50KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZXR1cm5pbmcgIiArIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBnZXRPYmplY3RMaXN0IiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE51bU9iamVjdHMoaW50IHN0b3JhZ2VJRCwgaW50IGZvcm1hdCwgaW50IHBhcmVudCkgeworICAgICAgICAvLyB3ZSBjYW4gaWdub3JlIHN0b3JhZ2VJRCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHN0b3JhZ2VzCisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdExpc3QgcGFyZW50OiAiICsgcGFyZW50KTsKKyAgICAgICAgQ3Vyc29yIGMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYyA9IG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVF9GT1JNQVRfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpLCBJbnRlZ2VyLnRvU3RyaW5nKGZvcm1hdCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfV0hFUkUsIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcocGFyZW50KSB9LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGdldE51bU9iamVjdHMiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgICAgICByZXR1cm4gbmV3IGludFtdIHsKKyAgICAgICAgICAgIC8vIGFsbG93IHRyYW5zZmVyaW5nIGFyYml0cmFyeSBmaWxlcworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9VTkRFRklORUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuRk9STUFUX0FTU09DSUFUSU9OLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLkZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludFtdIGdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgICAgICAvLyBubyBjYXB0dXJlIGZvcm1hdHMgeWV0CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBuZXcgaW50W10geworICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1NUT1JBR0VfSUQsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfU0laRSwKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLAorICAgICAgICAgICAgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BBUkVOVF9PQkpFQ1QsCisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IGludFtdIHsKKyAgICAgICAgICAgIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVIsCisgICAgICAgICAgICBNdHBDb25zdGFudHMuREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FLAorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdFByb3BlcnR5KGludCBoYW5kbGUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nW10gb3V0SW50VmFsdWUsIGNoYXJbXSBvdXRTdHJpbmdWYWx1ZSkgeworICAgICAgICBMb2cuZChUQUcsICJnZXRPYmplY3RQcm9wZXJ0eTogIiArIHByb3BlcnR5KTsKKyAgICAgICAgU3RyaW5nIGNvbHVtbiA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSBmYWxzZTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0aW9uIHN0YXR1cyBpcyBhbHdheXMgMAorICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgY2FzZSBNdHBDb25zdGFudHMuUFJPUEVSVFlfT0JKRUNUX1NJWkU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuU0laRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GSUxFX05BTUU6CisgICAgICAgICAgICAgICAgY29sdW1uID0gRmlsZXMuRmlsZUNvbHVtbnMuREFUQTsKKyAgICAgICAgICAgICAgICBpc1N0cmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9EQVRFX01PRElGSUVEOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEVfTU9ESUZJRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5QUk9QRVJUWV9QQVJFTlRfT0JKRUNUOgorICAgICAgICAgICAgICAgIGNvbHVtbiA9IEZpbGVzLkZpbGVDb2x1bW5zLlBBUkVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLlBST1BFUlRZX1BFUlNJU1RFTlRfVUlEOgorICAgICAgICAgICAgICAgIC8vIFBVSUQgaXMgY29uY2F0ZW5hdGlvbiBvZiBzdG9yYWdlSUQgYW5kIG9iamVjdCBoYW5kbGUKKyAgICAgICAgICAgICAgICBsb25nIHB1aWQgPSBtU3RvcmFnZUlEOworICAgICAgICAgICAgICAgIHB1aWQgPDw9IDMyOworICAgICAgICAgICAgICAgIHB1aWQgKz0gaGFuZGxlOworICAgICAgICAgICAgICAgIG91dEludFZhbHVlWzBdID0gcHVpZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBmb3Igbm93IHdlIGFyZSBvbmx5IHJlYWRpbmcgcHJvcGVydGllcyBmcm9tIHRoZSAib2JqZWN0cyIgdGFibGUKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nIFtdIHsgRmlsZXMuRmlsZUNvbHVtbnMuX0lELCBjb2x1bW4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gTXRwQ29uc3RhbnRzLlBST1BFUlRZX09CSkVDVF9GSUxFX05BTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgbmFtZSBmcm9tIGZ1bGwgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHZhbHVlLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxhc3RTbGFzaCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhbHVlLmdldENoYXJzKHN0YXJ0LCBlbmQsIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbZW5kIC0gc3RhcnRdID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRJbnRWYWx1ZVswXSA9IGMuZ2V0TG9uZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcXVlcnkgZmFpbGVkIGlmIHdlIGdldCBoZXJlCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldE9iamVjdFByb3BlcnR5KGludCBoYW5kbGUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGludFZhbHVlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0T2JqZWN0UHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7CisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXREZXZpY2VQcm9wZXJ0eShpbnQgcHJvcGVydHksIGxvbmdbXSBvdXRJbnRWYWx1ZSwgY2hhcltdIG91dFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldERldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkpOworCisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUjoKKyAgICAgICAgICAgIGNhc2UgTXRwQ29uc3RhbnRzLkRFVklDRV9QUk9QRVJUWV9ERVZJQ0VfRlJJRU5ETFlfTkFNRToKKyAgICAgICAgICAgICAgICAvLyB3cml0YWJsZSBzdHJpbmcgcHJvcGVydGllcyBrZXB0IGluIG91ciBkZXZpY2UgcHJvcGVydHkgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG1EZXZpY2VQcm9wRGIucXVlcnkoInByb3BlcnRpZXMiLCBERVZJQ0VfUFJPUEVSVFlfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9QUk9QRVJUWV9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcocHJvcGVydHkpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsICYmIGMubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDaGFycygwLCBsZW5ndGgsIG91dFN0cmluZ1ZhbHVlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZ1ZhbHVlW2xlbmd0aF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nVmFsdWVbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldERldmljZVByb3BlcnR5KGludCBwcm9wZXJ0eSwgbG9uZyBpbnRWYWx1ZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldERldmljZVByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIDogIiArIHN0cmluZ1ZhbHVlKTsKKworICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfU1lOQ0hST05JWkFUSU9OX1BBUlRORVI6CisgICAgICAgICAgICBjYXNlIE10cENvbnN0YW50cy5ERVZJQ0VfUFJPUEVSVFlfREVWSUNFX0ZSSUVORExZX05BTUU6CisgICAgICAgICAgICAgICAgLy8gd3JpdGFibGUgc3RyaW5nIHByb3BlcnRpZXMga2VwdCBpbiBvdXIgZGV2aWNlIHByb3BlcnR5IGRhdGFiYXNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJjb2RlIiwgcHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJ2YWx1ZSIsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BEYi5pbnNlcnQoInByb3BlcnRpZXMiLCAiY29kZSIsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfREVWSUNFX1BST1BfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0T2JqZWN0SW5mbyhpbnQgaGFuZGxlLCBpbnRbXSBvdXRTdG9yYWdlRm9ybWF0UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIG91dE5hbWUsIGxvbmdbXSBvdXRTaXplTW9kaWZpZWQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0SW5mbzogIiArIGhhbmRsZSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgT0JKRUNUX0lORk9fUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9XSEVSRSwgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoaGFuZGxlKSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzBdID0gbVN0b3JhZ2VJRDsKKyAgICAgICAgICAgICAgICBvdXRTdG9yYWdlRm9ybWF0UGFyZW50WzFdID0gYy5nZXRJbnQoMik7CisgICAgICAgICAgICAgICAgb3V0U3RvcmFnZUZvcm1hdFBhcmVudFsyXSA9IGMuZ2V0SW50KDMpOworCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuYW1lIGZyb20gcGF0aAorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAobGFzdFNsYXNoID49IDAgPyBsYXN0U2xhc2ggKyAxIDogMCk7CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgMjU1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRoLmdldENoYXJzKHN0YXJ0LCBlbmQsIG91dE5hbWUsIDApOworICAgICAgICAgICAgICAgIG91dE5hbWVbZW5kIC0gc3RhcnRdID0gMDsKKworICAgICAgICAgICAgICAgIG91dFNpemVNb2RpZmllZFswXSA9IGMuZ2V0TG9uZyg0KTsKKyAgICAgICAgICAgICAgICBvdXRTaXplTW9kaWZpZWRbMV0gPSBjLmdldExvbmcoNSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0UHJvcGVydHkiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE9iamVjdEZpbGVQYXRoKGludCBoYW5kbGUsIGNoYXJbXSBvdXRGaWxlUGF0aCwgbG9uZ1tdIG91dEZpbGVMZW5ndGgpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZ2V0T2JqZWN0RmlsZVBhdGg6ICIgKyBoYW5kbGUpOworICAgICAgICBDdXJzb3IgYyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIFBBVEhfU0laRV9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX1dIRVJFLCBuZXcgU3RyaW5nW10geyAgSW50ZWdlci50b1N0cmluZyhoYW5kbGUpIH0sIG51bGwpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLm1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gYy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgcGF0aC5nZXRDaGFycygwLCBwYXRoLmxlbmd0aCgpLCBvdXRGaWxlUGF0aCwgMCk7CisgICAgICAgICAgICAgICAgb3V0RmlsZVBhdGhbcGF0aC5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgICAgIG91dEZpbGVMZW5ndGhbMF0gPSBjLmdldExvbmcoMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE10cENvbnN0YW50cy5SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0RmlsZVBhdGgiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBkZWxldGVGaWxlKGludCBoYW5kbGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiZGVsZXRlRmlsZTogIiArIGhhbmRsZSk7CisgICAgICAgIG1EYXRhYmFzZU1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgVXJpIHVyaSA9IEZpbGVzLmdldE10cE9iamVjdHNVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobU1lZGlhUHJvdmlkZXIuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIGRlbGV0ZUZpbGUiLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBNdHBDb25zdGFudHMuUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0T2JqZWN0UmVmZXJlbmNlcyhpbnQgaGFuZGxlKSB7CisgICAgICAgIExvZy5kKFRBRywgImdldE9iamVjdFJlZmVyZW5jZXMgZm9yOiAiICsgaGFuZGxlKTsKKyAgICAgICAgVXJpIHVyaSA9IEZpbGVzLmdldE10cFJlZmVyZW5jZXNVcmkobVZvbHVtZU5hbWUsIGhhbmRsZSk7CisgICAgICAgIEN1cnNvciBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBtTWVkaWFQcm92aWRlci5xdWVyeSh1cmksIElEX1BST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNvdW50ID0gYy5nZXRDb3VudCgpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbY291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjLm1vdmVUb05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gYy5nZXRJbnQoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gZ2V0T2JqZWN0TGlzdCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBzZXRPYmplY3RSZWZlcmVuY2VzKGludCBoYW5kbGUsIGludFtdIHJlZmVyZW5jZXMpIHsKKyAgICAgICAgbURhdGFiYXNlTW9kaWZpZWQgPSB0cnVlOworICAgICAgICBVcmkgdXJpID0gRmlsZXMuZ2V0TXRwUmVmZXJlbmNlc1VyaShtVm9sdW1lTmFtZSwgaGFuZGxlKTsKKyAgICAgICAgaW50IGNvdW50ID0gcmVmZXJlbmNlcy5sZW5ndGg7CisgICAgICAgIENvbnRlbnRWYWx1ZXNbXSB2YWx1ZXNMaXN0ID0gbmV3IENvbnRlbnRWYWx1ZXNbY291bnRdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoRmlsZXMuRmlsZUNvbHVtbnMuX0lELCByZWZlcmVuY2VzW2ldKTsKKyAgICAgICAgICAgIHZhbHVlc0xpc3RbaV0gPSB2YWx1ZXM7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSBtTWVkaWFQcm92aWRlci5idWxrSW5zZXJ0KHVyaSwgdmFsdWVzTGlzdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX09LOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUmVtb3RlRXhjZXB0aW9uIGluIHNldE9iamVjdFJlZmVyZW5jZXMiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTXRwQ29uc3RhbnRzLlJFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlc3Npb25TdGFydGVkKCkgeworICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uU3RhcnRlZCIpOworICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXNzaW9uRW5kZWQoKSB7CisgICAgICAgIExvZy5kKFRBRywgInNlc3Npb25FbmRlZCIpOworICAgICAgICBpZiAobURhdGFiYXNlTW9kaWZpZWQpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInNlbmRpbmcgQUNUSU9OX01UUF9TRVNTSU9OX0VORCIpOworICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KE10cC5BQ1RJT05fTVRQX1NFU1NJT05fRU5EKSk7CisgICAgICAgICAgICBtRGF0YWJhc2VNb2RpZmllZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlZCBieSB0aGUgSk5JIGNvZGUKKyAgICBwcml2YXRlIGludCBtTmF0aXZlQ29udGV4dDsKKworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldHVwKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NdHBTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE1Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL010cFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEphdmEgd3JhcHBlciBmb3IgTVRQL1BUUCBzdXBwb3J0IGFzIFVTQiByZXNwb25kZXIuCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBjbGFzcyBNdHBTZXJ2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNdHBTZXJ2ZXIiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYV9qbmkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXRwU2VydmVyKE10cERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgc3RvcmFnZVBhdGgpIHsKKyAgICAgICAgbmF0aXZlX3NldHVwKGRhdGFiYXNlLCBzdG9yYWdlUGF0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5hdGl2ZV9maW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBuYXRpdmVfc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBuYXRpdmVfc3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRPYmplY3RBZGRlZChpbnQgaGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChoYW5kbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRPYmplY3RSZW1vdmVkKGludCBoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaGFuZGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQdHBNb2RlKGJvb2xlYW4gdXNlUHRwKSB7CisgICAgICAgIG5hdGl2ZV9zZXRfcHRwX21vZGUodXNlUHRwKTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IHRoZSBKTkkgY29kZQorICAgIHByaXZhdGUgaW50IG1OYXRpdmVDb250ZXh0OworCisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfc2V0dXAoTXRwRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyBzdG9yYWdlUGF0aCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfZmluYWxpemUoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zdGFydCgpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0b3AoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChpbnQgaGFuZGxlKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGludCBoYW5kbGUpOworICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldF9wdHBfbW9kZShib29sZWFuIHVzZVB0cCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2puaS9BbmRyb2lkLm1rCmluZGV4IDcwZWQ2MDguLjI1ZDI0M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2puaS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsMTEgQEAKICAgICBhbmRyb2lkX21lZGlhX01lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX1Jlc2FtcGxlSW5wdXRTdHJlYW0uY3BwIFwKICAgICBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXMuY3BwIFwKLSAgICBhbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtLmNwcAorICAgIGFuZHJvaWRfbWVkaWFfQW1ySW5wdXRTdHJlYW0uY3BwIFwKKwlhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcCBcCisJYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAgXAorCWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCkBAIC0yMSw5ICsyNSwxMiBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgbGliY2FtZXJhX2NsaWVudAorICAgIGxpYmNhbWVyYV9jbGllbnQgXAorCWxpYnNxbGl0ZQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtdHAgbGlidXNiaG9zdAorZW5kaWYKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgZXh0ZXJuYWwvdHJlbW9yL1RyZW1vciBcCkBAIC0zMiw2ICszOSw3IEBACiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjIFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCiAgICAgJChQVl9JTkNMVURFUykgXAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKaW5kZXggNmY5NGU4Yi4uZDRhYWNhZiAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcApAQCAtNzg4LDYgKzc4OCwxMCBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lcihKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfUmVzYW1wbGVJbnB1dFN0cmVhbShKTklFbnYgKmVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcyhKTklFbnYgKmVudik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IoSk5JRW52ICplbnYpOworZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cERhdGFiYXNlKEpOSUVudiAqZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIoSk5JRW52ICplbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX0FtcklucHV0U3RyZWFtKEpOSUVudiAqZW52KTsKIAogamludCBKTklfT25Mb2FkKEphdmFWTSogdm0sIHZvaWQqIHJlc2VydmVkKQpAQCAtODM2LDYgKzg0MCwyNiBAQAogICAgICAgICBnb3RvIGJhaWw7CiAgICAgfQogCisgICAgaWYgKHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50KGVudikgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBNdHBDbGllbnQgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cEN1cnNvcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwQ3Vyc29yIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZShlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwRGF0YWJhc2UgbmF0aXZlIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKworICAgIGlmIChyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cFNlcnZlcihlbnYpIDwgMCkgeworICAgICAgICBMT0dFKCJFUlJPUjogTXRwU2VydmVyIG5hdGl2ZSByZWdpc3RyYXRpb24gZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisKICAgICAvKiBzdWNjZXNzIC0tIHJldHVybiB2YWxpZCB2ZXJzaW9uIG51bWJlciAqLwogICAgIHJlc3VsdCA9IEpOSV9WRVJTSU9OXzFfNDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBjY2U5ZmQwLi4wOGE2ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzLmNwcApAQCAtMTY1LDcgKzE2NSw5IEBACiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGlkLCBqaW50IHF1YWxpdHkpCiB7CiAgICAgTE9HVigibmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZTogJWQgJWQiLCBpZCwgcXVhbGl0eSk7Ci0gICAgaWYgKHF1YWxpdHkgIT0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSCAmJiBxdWFsaXR5ICE9IENBTUNPUkRFUl9RVUFMSVRZX0xPVykgeworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiVW5rbm93biBjYW1jb3JkZXIgcHJvZmlsZSBxdWFsaXR5Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxMCw2ICsyMTIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVscyk7CiB9CiAKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBpZCwgamludCBxdWFsaXR5KQoreworICAgIExPR1YoIm5hdGl2ZV9oYXNfY2FtY29yZGVyX3Byb2ZpbGU6ICVkICVkIiwgaWQsIHF1YWxpdHkpOworICAgIGlmICghKChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0xPVyAmJiBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZXzEwODBQKSB8fAorICAgICAgICAgICAgICAgIChxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICYmCisgICAgICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNhbWNvcmRlcl9xdWFsaXR5IHEgPSBzdGF0aWNfY2FzdDxjYW1jb3JkZXJfcXVhbGl0eT4ocXVhbGl0eSk7CisgICAgcmV0dXJuIHNQcm9maWxlcy0+aGFzQ2FtY29yZGVyUHJvZmlsZShpZCwgcSk7Cit9CisKIHN0YXRpYyBqaW50CiBhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9udW1fdmlkZW9fZGVjb2RlcnMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKIHsKQEAgLTI4OSw2ICszMDUsOCBAQAogICAgIHsibmF0aXZlX2luaXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKClWIiwgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVByb2ZpbGVzX25hdGl2ZV9pbml0fSwKICAgICB7Im5hdGl2ZV9nZXRfY2FtY29yZGVyX3Byb2ZpbGUiLCAgICAgICAgICAgIihJSSlMYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2dldF9jYW1jb3JkZXJfcHJvZmlsZX0sCisgICAgeyJuYXRpdmVfaGFzX2NhbWNvcmRlcl9wcm9maWxlIiwgICAgICAgICAgICIoSUkpWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUHJvZmlsZXNfbmF0aXZlX2hhc19jYW1jb3JkZXJfcHJvZmlsZX0sCiB9OwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzRm9yRGVjb2RlckNhcGFiaWxpdGllc0NsYXNzW10gPSB7CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGVmYTA4MTMuLjgyYjRhYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXIuY3BwCkBAIC0yNjAsNiArMjYwLDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0T3V0cHV0RmlsZUF1eEZEKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgZmlsZURlc2NyaXB0b3IpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZSIpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgZmQgPSBnZXRQYXJjZWxGaWxlRGVzY3JpcHRvckZEKGVudiwgZmlsZURlc2NyaXB0b3IpOworICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gZ2V0TWVkaWFSZWNvcmRlcihlbnYsIHRoaXopOworICAgIHN0YXR1c190IG9wU3RhdHVzID0gbXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworICAgIHByb2Nlc3NfbWVkaWFfcmVjb3JkZXJfY2FsbChlbnYsIG9wU3RhdHVzLCAiamF2YS9pby9JT0V4Y2VwdGlvbiIsICJzZXRPdXRwdXRGaWxlIGZhaWxlZC4iKTsKK30KKworc3RhdGljIHZvaWQKIGFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb1NpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCB3aWR0aCwgamludCBoZWlnaHQpCiB7CiAgICAgTE9HVigic2V0VmlkZW9TaXplKCVkLCAlZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTQ2Niw2ICs0ODAsNyBAQAogICAgIHsic2V0QXVkaW9FbmNvZGVyIiwgICAgICAiKEkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldEF1ZGlvRW5jb2Rlcn0sCiAgICAgeyJzZXRQYXJhbWV0ZXIiLCAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLCAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0UGFyYW1ldGVyfSwKICAgICB7Il9zZXRPdXRwdXRGaWxlIiwgICAgICAgIihMamF2YS9pby9GaWxlRGVzY3JpcHRvcjtKSilWIiwgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRPdXRwdXRGaWxlRkR9LAorICAgIHsiX3NldE91dHB1dEZpbGVBdXgiLCAgICAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVJlY29yZGVyX3NldE91dHB1dEZpbGVBdXhGRH0sCiAgICAgeyJzZXRWaWRlb1NpemUiLCAgICAgICAgICIoSUkpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0VmlkZW9TaXplfSwKICAgICB7InNldFZpZGVvRnJhbWVSYXRlIiwgICAgIihJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFSZWNvcmRlcl9zZXRWaWRlb0ZyYW1lUmF0ZX0sCiAgICAgeyJzZXRNYXhEdXJhdGlvbiIsICAgICAgICIoSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX01lZGlhUmVjb3JkZXJfc2V0TWF4RHVyYXRpb259LApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjczZjFhZi4uZmQwYjIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3RvcnkoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBwYXRoLCBqc3RyaW5nIGV4dGVuc2lvbnMsIGpvYmplY3QgY2xpZW50KQorYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0RpcmVjdG9yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIHBhdGgsIGpvYmplY3QgY2xpZW50KQogewogICAgIE1lZGlhU2Nhbm5lciAqbXAgPSAoTWVkaWFTY2FubmVyICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZHMuY29udGV4dCk7CiAKQEAgLTE1NCwyNyArMTU0LDE2IEBACiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKKwogICAgIGNvbnN0IGNoYXIgKnBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOwogICAgIGlmIChwYXRoU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiT3V0IG9mIG1lbW9yeSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIE5VTEwpOwotICAgIGlmIChleHRlbnNpb25zU3RyID09IE5VTEwpIHsgIC8vIE91dCBvZiBtZW1vcnkKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocGF0aCwgcGF0aFN0cik7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIiwgIk91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAogICAgIE15TWVkaWFTY2FubmVyQ2xpZW50IG15Q2xpZW50KGVudiwgY2xpZW50KTsKLSAgICBtcC0+cHJvY2Vzc0RpcmVjdG9yeShwYXRoU3RyLCBleHRlbnNpb25zU3RyLCBteUNsaWVudCwgRXhjZXB0aW9uQ2hlY2ssIGVudik7CisgICAgbXAtPnByb2Nlc3NEaXJlY3RvcnkocGF0aFN0ciwgbXlDbGllbnQsIEV4Y2VwdGlvbkNoZWNrLCBlbnYpOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIHBhdGhTdHIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGV4dGVuc2lvbnMsIGV4dGVuc2lvbnNTdHIpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzA5LDkgKzI5OCw5IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLCAgICAKKyAgICB7InByb2Nlc3NEaXJlY3RvcnkiLCAgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9tZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQ7KVYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3Byb2Nlc3NEaXJlY3Rvcnl9LAotICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsICAgIAorICAgIHsicHJvY2Vzc0ZpbGUiLCAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL21lZGlhL01lZGlhU2Nhbm5lckNsaWVudDspViIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfcHJvY2Vzc0ZpbGV9LAogICAgIHsic2V0TG9jYWxlIiwgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTWVkaWFTY2FubmVyX3NldExvY2FsZX0sCiAgICAgeyJleHRyYWN0QWxidW1BcnQiLCAgICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVtCIiwgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVNjYW5uZXJfZXh0cmFjdEFsYnVtQXJ0fSwKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDbGllbnQuY3BwCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDbGllbnRKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2RldmljZUFkZGVkOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZGV2aWNlUmVtb3ZlZDsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9jb250ZXh0OworCitzdGF0aWMgc3RydWN0IGZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7CisgICAgamZpZWxkSUQgbURlc2NyaXB0b3I7Cit9IGdGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyY2VsX2ZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKK3sKKyAgICBqY2xhc3MgbUNsYXNzOworICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7Cit9IGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHM7CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitjbGFzcyBNeUNsaWVudCA6IHB1YmxpYyBNdHBDbGllbnQgeworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgICAgZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpOworICAgIHZpcnR1YWwgdm9pZCAgICBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKTsKKworICAgIGpvYmplY3QgICAgICAgICBtQ2xpZW50OworICAgIE10cERldmljZSogICAgICBtRXZlbnREZXZpY2U7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgTXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2b2lkICAgICAgICAgICAgY2xlYW51cChKTklFbnYgKmVudik7Cit9OworCitNdHBDbGllbnQqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YUNsaWVudCkKK3sKKyAgICByZXR1cm4gKE10cENsaWVudCopZW52LT5HZXRJbnRGaWVsZChqYXZhQ2xpZW50LCBmaWVsZF9jb250ZXh0KTsKK30KKworCitNeUNsaWVudDo6TXlDbGllbnQoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KQorICAgIDogICBtQ2xpZW50KGVudi0+TmV3R2xvYmFsUmVmKGNsaWVudCkpCit7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmNsZWFudXAoSk5JRW52ICplbnYpIHsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xpZW50KTsKK30KKwordm9pZCBNeUNsaWVudDo6ZGV2aWNlQWRkZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZUFkZGVkICVzXG4iLCBuYW1lKTsKKworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUNsaWVudCwgbWV0aG9kX2RldmljZUFkZGVkLCBkZXZpY2UtPmdldElEKCkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgTXlDbGllbnQ6OmRldmljZVJlbW92ZWQoTXRwRGV2aWNlICpkZXZpY2UpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGV2aWNlLT5nZXREZXZpY2VOYW1lKCk7CisgICAgTE9HRCgiTXlDbGllbnQ6OmRldmljZVJlbW92ZWQgJXNcbiIsIG5hbWUpOworCisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQ2xpZW50LCBtZXRob2RfZGV2aWNlUmVtb3ZlZCwgZGV2aWNlLT5nZXRJRCgpKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3NldHVwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworICAgIE15Q2xpZW50KiBjbGllbnQgPSBuZXcgTXlDbGllbnQoZW52LCB0aGl6KTsKKyAgICBjbGllbnQtPnN0YXJ0KCk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWNsaWVudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2ZpbmFsaXplKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgiZmluYWxpemVcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBjbGllbnQ7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgamJvb2xlYW4KK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X3N0YXJ0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RhcnRcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIHJldHVybiBjbGllbnQtPnN0YXJ0KCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfc3RvcChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInN0b3BcbiIpOworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGNsaWVudC0+c3RvcCgpOworI2VuZGlmCit9CisKK3N0YXRpYyBqYm9vbGVhbgorYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZGVsZXRlX29iamVjdChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LAorICAgICAgICBqaW50IGRldmljZV9pZCwgamludCBvYmplY3RfaWQpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmRlbGV0ZU9iamVjdChvYmplY3RfaWQpOworICAgIGVsc2UKKyAjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfcGFyZW50KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBNeUNsaWVudCAqY2xpZW50ID0gKE15Q2xpZW50ICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IGNsaWVudC0+Z2V0RGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKGRldmljZSkKKyAgICAgICAgcmV0dXJuIGRldmljZS0+Z2V0UGFyZW50KG9iamVjdF9pZCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGppbnQKK2FuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2dldF9zdG9yYWdlX2lkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgZGV2aWNlX2lkLCBqaW50IG9iamVjdF9pZCkKK3sKKyAjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTXlDbGllbnQgKmNsaWVudCA9IChNeUNsaWVudCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBjbGllbnQtPmdldERldmljZShkZXZpY2VfaWQpOworICAgIGlmIChkZXZpY2UpCisgICAgICAgIHJldHVybiBkZXZpY2UtPmdldFN0b3JhZ2VJRChvYmplY3RfaWQpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBqb2JqZWN0CithbmRyb2lkX21lZGlhX010cENsaWVudF9vcGVuX2ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKKyAgICAgICAgamludCBkZXZpY2VfaWQsIGppbnQgb2JqZWN0X2lkKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIE15Q2xpZW50ICpjbGllbnQgPSAoTXlDbGllbnQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIE10cERldmljZSogZGV2aWNlID0gY2xpZW50LT5nZXREZXZpY2UoZGV2aWNlX2lkKTsKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNdHBPYmplY3RJbmZvKiBpbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdF9pZCk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbnQgb2JqZWN0X3NpemUgPSBpbmZvLT5tQ29tcHJlc3NlZFNpemU7CisgICAgZGVsZXRlIGluZm87CisgICAgaW50IGZkID0gZGV2aWNlLT5yZWFkT2JqZWN0KG9iamVjdF9pZCwgb2JqZWN0X3NpemUpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGVudi0+TmV3T2JqZWN0KGdGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAorICAgICAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3Rvcik7CisgICAgaWYgKGZpbGVEZXNjcmlwdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChmaWxlRGVzY3JpcHRvciwgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciwgZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7CisjZW5kaWYKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICIoKVoiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdGFydH0sCisgICAgeyJuYXRpdmVfc3RvcCIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9zdG9wfSwKKyAgICB7Im5hdGl2ZV9kZWxldGVfb2JqZWN0IiwgICAiKElJKVoiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ2xpZW50X2RlbGV0ZV9vYmplY3R9LAorICAgIHsibmF0aXZlX2dldF9wYXJlbnQiLCAgICAgICIoSUkpSSIsICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfZ2V0X3BhcmVudH0sCisgICAgeyJuYXRpdmVfZ2V0X3N0b3JhZ2VfaWQiLCAgIihJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cENsaWVudF9nZXRfc3RvcmFnZV9pZH0sCisgICAgeyJuYXRpdmVfb3Blbl9maWxlIiwgICAgICAgIihJSSlMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBDbGllbnRfb3Blbl9maWxlfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cENsaWVudCI7CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudChKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xheno7CisKKyAgICBMT0dEKCJyZWdpc3Rlcl9hbmRyb2lkX21lZGlhX010cENsaWVudFxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cENsaWVudCIpOworICAgIGlmIChjbGF6eiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYW5kcm9pZC9tZWRpYS9NdHBDbGllbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfZGV2aWNlQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRldmljZUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2RldmljZVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZGV2aWNlUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF9kZXZpY2VSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBkZXZpY2VSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZmllbGRfY29udGV4dCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1OYXRpdmVDb250ZXh0IiwgIkkiKTsKKyAgICBpZiAoZmllbGRfY29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgTXRwQ2xpZW50Lm1OYXRpdmVDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKClWIik7CisgICAgZ0ZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tRGVzY3JpcHRvciA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgImRlc2NyaXB0b3IiLCAiSSIpOworICAgIExPR19GQVRBTF9JRihnRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1EZXNjcmlwdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBkZXNjcmlwdG9yIGZpZWxkIGluIGphdmEuaW8uRmlsZURlc2NyaXB0b3IiKTsKKworICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisKKyAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCisgICAgICAgICAgICAgICAgImFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50IiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI4YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yLmNwcApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ3Vyc29ySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImJpbmRlci9DdXJzb3JXaW5kb3cuaCIKKworI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgamZpZWxkSUQgZmllbGRfY29udGV4dDsKKworLy8gRnJvbSBhbmRyb2lkX21lZGlhX010cENsaWVudC5jcHAKK010cENsaWVudCAqIGdldF9jbGllbnRfZnJvbV9vYmplY3QoSk5JRW52ICogZW52LCBqb2JqZWN0IGphdmFDbGllbnQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBib29sIEV4Y2VwdGlvbkNoZWNrKHZvaWQqIGVudikKK3sKKyAgICByZXR1cm4gKChKTklFbnYgKillbnYpLT5FeGNlcHRpb25DaGVjaygpOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3Jfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhQ2xpZW50LAorICAgICAgICBqaW50IHF1ZXJ5VHlwZSwgamludCBkZXZpY2VJRCwgamludCBzdG9yYWdlSUQsIGppbnQgb2JqZWN0SUQsIGppbnRBcnJheSBqYXZhQ29sdW1ucykKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJhbmRyb2lkX21lZGlhX010cEN1cnNvcl9zZXR1cCBxdWVyeVR5cGU6ICVkIGRldmljZUlEOiAlZCBzdG9yYWdlSUQ6ICVkIG9iamVjdElEOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBxdWVyeVR5cGUsIGRldmljZUlELCBzdG9yYWdlSUQsIG9iamVjdElEKTsKKworICAgIGludCogY29sdW1ucyA9IE5VTEw7CisgICAgaW50IGNvbHVtbkNvdW50ID0gMDsKKyAgICBpZiAoamF2YUNvbHVtbnMpIHsKKyAgICAgICAgY29sdW1ucyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhqYXZhQ29sdW1ucywgMCk7CisgICAgICAgIGNvbHVtbkNvdW50ID0gZW52LT5HZXRBcnJheUxlbmd0aChqYXZhQ29sdW1ucyk7CisgICAgfQorCisgICAgTXRwQ2xpZW50KiBjbGllbnQgPSBnZXRfY2xpZW50X2Zyb21fb2JqZWN0KGVudiwgamF2YUNsaWVudCk7CisgICAgTXRwQ3Vyc29yKiBjdXJzb3IgPSBuZXcgTXRwQ3Vyc29yKGNsaWVudCwgcXVlcnlUeXBlLAorICAgICAgICAgICAgZGV2aWNlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SUQsIGNvbHVtbkNvdW50LCBjb2x1bW5zKTsKKworICAgIGlmIChjb2x1bW5zKQorICAgICAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGphdmFDb2x1bW5zLCBjb2x1bW5zLCAwKTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIChpbnQpY3Vyc29yKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBDdXJzb3JfZmluYWxpemUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJmaW5hbGl6ZVxuIik7CisgICAgTXRwQ3Vyc29yICpjdXJzb3IgPSAoTXRwQ3Vyc29yICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkZWxldGUgY3Vyc29yOworI2VuZGlmCit9CisKK3N0YXRpYyBqaW50CithbmRyb2lkX21lZGlhX010cEN1cnNvcl9maWxsX3dpbmRvdyhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqb2JqZWN0IGphdmFXaW5kb3csIGppbnQgc3RhcnRQb3MpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgQ3Vyc29yV2luZG93KiB3aW5kb3cgPSBnZXRfd2luZG93X2Zyb21fb2JqZWN0KGVudiwgamF2YVdpbmRvdyk7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBDdXJzb3JXaW5kb3ciKTsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ3Vyc29yV2luZG93Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdHBDdXJzb3IgKmN1cnNvciA9IChNdHBDdXJzb3IgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworCisgICAgcmV0dXJuIGN1cnNvci0+ZmlsbFdpbmRvdyh3aW5kb3csIHN0YXJ0UG9zKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdNZXRob2RzW10gPSB7CisgICAgeyJuYXRpdmVfc2V0dXAiLCAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwQ2xpZW50O0lJSUlbSSlWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbmFsaXplfSwKKyAgICB7Im5hdGl2ZV9maWxsX3dpbmRvdyIsICAgICAgIihMYW5kcm9pZC9kYXRhYmFzZS9DdXJzb3JXaW5kb3c7SSlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yX2ZpbGxfd2luZG93fSwKKworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwQ3Vyc29yXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwQ3Vyc29yIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cEN1cnNvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cEN1cnNvci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cEN1cnNvciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDJjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZS5jcHAKQEAgLTAsMCArMSw5NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERhdGFiYXNlSk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAiSk5JSGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorCisjaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorI2luY2x1ZGUgIm10cC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9iZWdpblNlbmRPYmplY3Q7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9lbmRTZW5kT2JqZWN0Oworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0TGlzdDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldE51bU9iamVjdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0czsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXRPYmplY3RQcm9wZXJ0eTsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX2dldERldmljZVByb3BlcnR5Oworc3RhdGljIGptZXRob2RJRCBtZXRob2Rfc2V0RGV2aWNlUHJvcGVydHk7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9nZXRPYmplY3RJbmZvOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGg7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9kZWxldGVGaWxlOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlczsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXM7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF9zZXNzaW9uU3RhcnRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3Nlc3Npb25FbmRlZDsKKworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CisKK010cERhdGFiYXNlKiBnZXRNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBkYXRhYmFzZSkgeworICAgIHJldHVybiAoTXRwRGF0YWJhc2UgKillbnYtPkdldEludEZpZWxkKGRhdGFiYXNlLCBmaWVsZF9jb250ZXh0KTsKK30KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBNeU10cERhdGFiYXNlIDogcHVibGljIE10cERhdGFiYXNlIHsKK3ByaXZhdGU6CisgICAgam9iamVjdCAgICAgICAgIG1EYXRhYmFzZTsKKyAgICBqaW50QXJyYXkgICAgICAgbUludEJ1ZmZlcjsKKyAgICBqbG9uZ0FycmF5ICAgICAgbUxvbmdCdWZmZXI7CisgICAgamNoYXJBcnJheSAgICAgIG1TdHJpbmdCdWZmZXI7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15TXRwRGF0YWJhc2UoSk5JRW52ICplbnYsIGpvYmplY3QgY2xpZW50KTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgICAgIH5NeU10cERhdGFiYXNlKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKEpOSUVudiAqZW52KTsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgbW9kaWZpZWQpOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRTZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgICAgICAgICBnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCk7CisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIHZpcnR1YWwgTXRwT2JqZWN0UHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVzZXREZXZpY2VQcm9wZXJ0eShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nJiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCk7CisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eUluZm8oTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eUluZm8oTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksIGludCYgdHlwZSk7CisKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZUxpc3QqICAgIGdldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcyk7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdGFydGVkKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKEpOSUVudiogZW52LCBjb25zdCBjaGFyKiBtZXRob2ROYW1lKSB7CisgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgeworICAgICAgICBMT0dFKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBieSBjYWxsYmFjayAnJXMnLiIsIG1ldGhvZE5hbWUpOworICAgICAgICBMT0dFX0VYKGVudik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTXlNdHBEYXRhYmFzZTo6TXlNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBjbGllbnQpCisgICAgOiAgIG1EYXRhYmFzZShlbnYtPk5ld0dsb2JhbFJlZihjbGllbnQpKSwKKyAgICAgICAgbUludEJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUxvbmdCdWZmZXIoTlVMTCksCisgICAgICAgIG1TdHJpbmdCdWZmZXIoTlVMTCkKK3sKKyAgICBqaW50QXJyYXkgaW50QXJyYXk7CisgICAgamxvbmdBcnJheSBsb25nQXJyYXk7CisgICAgamNoYXJBcnJheSBjaGFyQXJyYXk7CisKKyAgICAvLyBjcmVhdGUgYnVmZmVycyBmb3Igb3V0IGFyZ3VtZW50cworICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUgc28gdGhpcyBpcyBPSworICAgIGludEFycmF5ID0gZW52LT5OZXdJbnRBcnJheSgzKTsKKyAgICBpZiAoIWludEFycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUludEJ1ZmZlciA9IChqaW50QXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoaW50QXJyYXkpOworICAgIGxvbmdBcnJheSA9IGVudi0+TmV3TG9uZ0FycmF5KDIpOworICAgIGlmICghbG9uZ0FycmF5KQorICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgbUxvbmdCdWZmZXIgPSAoamxvbmdBcnJheSllbnYtPk5ld0dsb2JhbFJlZihsb25nQXJyYXkpOworICAgIGNoYXJBcnJheSA9IGVudi0+TmV3Q2hhckFycmF5KDI1Nik7CisgICAgaWYgKCFjaGFyQXJyYXkpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICBtU3RyaW5nQnVmZmVyID0gKGpjaGFyQXJyYXkpZW52LT5OZXdHbG9iYWxSZWYoY2hhckFycmF5KTsKKyAgICByZXR1cm47CisKK291dF9vZl9tZW1vcnk6CisgICAgZW52LT5UaHJvd05ldyhlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKSwgTlVMTCk7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6Y2xlYW51cChKTklFbnYgKmVudikgeworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1EYXRhYmFzZSk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUludEJ1ZmZlcik7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUxvbmdCdWZmZXIpOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1TdHJpbmdCdWZmZXIpOworfQorCitNeU10cERhdGFiYXNlOjp+TXlNdHBEYXRhYmFzZSgpIHsKK30KKworTXRwT2JqZWN0SGFuZGxlIE15TXRwRGF0YWJhc2U6OmJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9iZWdpblNlbmRPYmplY3QsCisgICAgICAgICAgICBlbnYtPk5ld1N0cmluZ1VURihwYXRoKSwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQsIChqaW50KXN0b3JhZ2UsCisgICAgICAgICAgICAoamxvbmcpc2l6ZSwgKGpsb25nKW1vZGlmaWVkKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXlNdHBEYXRhYmFzZTo6ZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBib29sIHN1Y2NlZWRlZCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZW5kU2VuZE9iamVjdCwgZW52LT5OZXdTdHJpbmdVVEYocGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAoamludCloYW5kbGUsIChqaW50KWZvcm1hdCwgKGpib29sZWFuKXN1Y2NlZWRlZCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RMaXN0LAorICAgICAgICAgICAgICAgIChqaW50KXN0b3JhZ2VJRCwgKGppbnQpZm9ybWF0LCAoamludClwYXJlbnQpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOworICAgIGppbnQqIGhhbmRsZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goaGFuZGxlc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgaGFuZGxlcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworaW50IE15TXRwRGF0YWJhc2U6OmdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0TnVtT2JqZWN0cywKKyAgICAgICAgICAgICAgICAoamludClzdG9yYWdlSUQsIChqaW50KWZvcm1hdCwgKGppbnQpcGFyZW50KTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cE9iamVjdEZvcm1hdExpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsCisgICAgICAgICAgICBtZXRob2RfZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKTsKKyAgICBpZiAoIWFycmF5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBsaXN0ID0gbmV3IE10cE9iamVjdEZvcm1hdExpc3QoKTsKKyAgICBqaW50KiBmb3JtYXRzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKGZvcm1hdHNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIGZvcm1hdHMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cE9iamVjdEZvcm1hdExpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RGb3JtYXRMaXN0KCk7CisgICAgamludCogZm9ybWF0cyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChhcnJheSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgbGlzdC0+cHVzaChmb3JtYXRzW2ldKTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGFycmF5LCBmb3JtYXRzLCAwKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBsaXN0OworfQorCitNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIE15TXRwRGF0YWJhc2U6OmdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnRBcnJheSBhcnJheSA9IChqaW50QXJyYXkpZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1EYXRhYmFzZSwKKyAgICAgICAgICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzLCAoamludClmb3JtYXQpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdFByb3BlcnR5TGlzdCogbGlzdCA9IG5ldyBNdHBPYmplY3RQcm9wZXJ0eUxpc3QoKTsKKyAgICBqaW50KiBwcm9wZXJ0aWVzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5LCAwKTsKKyAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICBsaXN0LT5wdXNoKHByb3BlcnRpZXNbaV0pOworICAgIGVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoYXJyYXksIHByb3BlcnRpZXMsIDApOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKK010cERldmljZVByb3BlcnR5TGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50QXJyYXkgYXJyYXkgPSAoamludEFycmF5KWVudi0+Q2FsbE9iamVjdE1ldGhvZChtRGF0YWJhc2UsCisgICAgICAgICAgICBtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyk7CisgICAgaWYgKCFhcnJheSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBsaXN0ID0gbmV3IE10cERldmljZVByb3BlcnR5TGlzdCgpOworICAgIGppbnQqIHByb3BlcnRpZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2gocHJvcGVydGllc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgcHJvcGVydGllcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGludCAgICAgICAgIHR5cGU7CisKKyAgICBpZiAoIWdldE9iamVjdFByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX2dldE9iamVjdFByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgKGppbnQpcHJvcGVydHksIG1Mb25nQnVmZmVyLCBtU3RyaW5nQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IGxvbmdWYWx1ZXNbMF07CisgICAgZW52LT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIGxvbmdWYWx1ZXMsIDApOworCisgICAgLy8gc3BlY2lhbCBjYXNlIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVELCB3aGljaCBpcyBhIHN0cmluZyB0byBNVFAKKyAgICAvLyBidXQgc3RvcmVkIGludGVybmFsbHkgYXMgYSB1aW50NjQKKyAgICBpZiAocHJvcGVydHkgPT0gTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQpIHsKKyAgICAgICAgY2hhciAgICBkYXRlWzIwXTsKKyAgICAgICAgZm9ybWF0RGF0ZVRpbWUobG9uZ1ZhbHVlLCBkYXRlLCBzaXplb2YoZGF0ZSkpOworICAgICAgICBwYWNrZXQucHV0U3RyaW5nKGRhdGUpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50OChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxMjgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyhzdHIpOworICAgICAgICAgICAgZW52LT5SZWxlYXNlQ2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgc3RyLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgdHlwZSBpbiBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQ7CisgICAgfQorCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIGludCAgICAgICAgIHR5cGU7CisKKyAgICBpZiAoIWdldE9iamVjdFByb3BlcnR5SW5mbyhwcm9wZXJ0eSwgdHlwZSkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1BST1BfTk9UX1NVUFBPUlRFRDsKKworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpsb25nIGxvbmdWYWx1ZSA9IDA7CisgICAganN0cmluZyBzdHJpbmdWYWx1ZSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlciBidWZmZXI7CisgICAgICAgICAgICBwYWNrZXQuZ2V0U3RyaW5nKGJ1ZmZlcik7CisgICAgICAgICAgICBzdHJpbmdWYWx1ZSA9IGVudi0+TmV3U3RyaW5nVVRGKChjb25zdCBjaGFyICopYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgidW5zdXBwb3J0ZWQgdHlwZSBpbiBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfUFJPUF9GT1JNQVQ7CisgICAgfQorCisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHksCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCAoamludClwcm9wZXJ0eSwgbG9uZ1ZhbHVlLCBzdHJpbmdWYWx1ZSk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisKKyAgICBpbnQgICAgICAgICB0eXBlOworCisgICAgaWYgKCFnZXREZXZpY2VQcm9wZXJ0eUluZm8ocHJvcGVydHksIHR5cGUpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQ7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXREZXZpY2VQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAoamludClwcm9wZXJ0eSwgbUxvbmdCdWZmZXIsIG1TdHJpbmdCdWZmZXIpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGpsb25nKiBsb25nVmFsdWVzID0gZW52LT5HZXRMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgMCk7CisgICAgamxvbmcgbG9uZ1ZhbHVlID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQxNihsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50MzIobG9uZ1ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDY0KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MTI4KGxvbmdWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOChsb25nVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBqY2hhciogc3RyID0gZW52LT5HZXRDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCAwKTsKKyAgICAgICAgICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZUNoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIHN0ciwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpzZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBpbnQgICAgICAgICB0eXBlOworCisgICAgaWYgKCFnZXREZXZpY2VQcm9wZXJ0eUluZm8ocHJvcGVydHksIHR5cGUpKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQ7CisKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbG9uZyBsb25nVmFsdWUgPSAwOworICAgIGpzdHJpbmcgc3RyaW5nVmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ4KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UODoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTY6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0SW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxNjoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldEludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICBsb25nVmFsdWUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIGxvbmdWYWx1ZSA9IHBhY2tldC5nZXRJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgorICAgICAgICAgICAgbG9uZ1ZhbHVlID0gcGFja2V0LmdldFVJbnQ2NCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfU1RSOgorICAgICAgICB7CisgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgcGFja2V0LmdldFN0cmluZyhidWZmZXIpOworICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBlbnYtPk5ld1N0cmluZ1VURigoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoInVuc3VwcG9ydGVkIHR5cGUgaW4gc2V0RGV2aWNlUHJvcGVydHlWYWx1ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUOworICAgIH0KKworICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3NldERldmljZVByb3BlcnR5LAorICAgICAgICAgICAgICAgIChqaW50KXByb3BlcnR5LCBsb25nVmFsdWUsIHN0cmluZ1ZhbHVlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpyZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgcmV0dXJuIC0xOworfQorCitNdHBSZXNwb25zZUNvZGUgTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBjaGFyICAgIGRhdGVbMjBdOworCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9nZXRPYmplY3RJbmZvLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgbUludEJ1ZmZlciwgbVN0cmluZ0J1ZmZlciwgbUxvbmdCdWZmZXIpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKworICAgIGppbnQqIGludFZhbHVlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhtSW50QnVmZmVyLCAwKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gaW50VmFsdWVzWzBdOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBpbnRWYWx1ZXNbMV07CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGludFZhbHVlc1syXTsKKyAgICBlbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKG1JbnRCdWZmZXIsIGludFZhbHVlcywgMCk7CisKKyAgICBqbG9uZyogbG9uZ1ZhbHVlcyA9IGVudi0+R2V0TG9uZ0FycmF5RWxlbWVudHMobUxvbmdCdWZmZXIsIDApOworICAgIHVpbnQ2NF90IHNpemUgPSBsb25nVmFsdWVzWzBdOworICAgIHVpbnQ2NF90IG1vZGlmaWVkID0gbG9uZ1ZhbHVlc1sxXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisKKy8vICAgIGludCBhc3NvY2lhdGlvblR5cGUgPSAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gPworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfR0VORVJJQ19GT0xERVIgOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEKTsKKyAgICBpbnQgYXNzb2NpYXRpb25UeXBlID0gTVRQX0FTU09DSUFUSU9OX1RZUEVfVU5ERUZJTkVEOworCisgICAgcGFja2V0LnB1dFVJbnQzMihzdG9yYWdlSUQpOworICAgIHBhY2tldC5wdXRVSW50MTYoZm9ybWF0KTsKKyAgICBwYWNrZXQucHV0VUludDE2KDApOyAgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgcGFja2V0LnB1dFVJbnQzMigoc2l6ZSA+IDB4RkZGRkZGRkZMTCA/IDB4RkZGRkZGRkYgOiBzaXplKSk7CisgICAgcGFja2V0LnB1dFVJbnQxNigwKTsgICAvLyB0aHVtYiBmb3JtYXQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIHRodW1iIGNvbXByZXNzZWQgc2l6ZQorICAgIHBhY2tldC5wdXRVSW50MzIoMCk7ICAgLy8gdGh1bWIgcGl4IHdpZHRoCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyB0aHVtYiBwaXggaGVpZ2h0CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBpbWFnZSBwaXggd2lkdGgKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIHBpeCBoZWlnaHQKKyAgICBwYWNrZXQucHV0VUludDMyKDApOyAgIC8vIGltYWdlIGJpdCBkZXB0aAorICAgIHBhY2tldC5wdXRVSW50MzIocGFyZW50KTsKKyAgICBwYWNrZXQucHV0VUludDE2KGFzc29jaWF0aW9uVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBhc3NvY2lhdGlvbiBkZXNjCisgICAgcGFja2V0LnB1dFVJbnQzMigwKTsgICAvLyBzZXF1ZW5jZSBudW1iZXIKKworICAgIGpjaGFyKiBzdHIgPSBlbnYtPkdldENoYXJBcnJheUVsZW1lbnRzKG1TdHJpbmdCdWZmZXIsIDApOworICAgIHBhY2tldC5wdXRTdHJpbmcoc3RyKTsgICAvLyBmaWxlIG5hbWUKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7CisgICAgZm9ybWF0RGF0ZVRpbWUobW9kaWZpZWQsIGRhdGUsIHNpemVvZihkYXRlKSk7CisgICAgcGFja2V0LnB1dFN0cmluZyhkYXRlKTsgICAvLyBkYXRlIG1vZGlmaWVkCisgICAgcGFja2V0LnB1dEVtcHR5U3RyaW5nKCk7ICAgLy8ga2V5d29yZHMKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNeU10cERhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmcmIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90JiBmaWxlTGVuZ3RoKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgKGppbnQpaGFuZGxlLCBtU3RyaW5nQnVmZmVyLCBtTG9uZ0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgamNoYXIqIHN0ciA9IGVudi0+R2V0Q2hhckFycmF5RWxlbWVudHMobVN0cmluZ0J1ZmZlciwgMCk7CisgICAgZmlsZVBhdGguc2V0VG8oc3RyLCBzdHJsZW4xNihzdHIpKTsKKyAgICBlbnYtPlJlbGVhc2VDaGFyQXJyYXlFbGVtZW50cyhtU3RyaW5nQnVmZmVyLCBzdHIsIDApOworCisgICAgamxvbmcqIGxvbmdWYWx1ZXMgPSBlbnYtPkdldExvbmdBcnJheUVsZW1lbnRzKG1Mb25nQnVmZmVyLCAwKTsKKyAgICBmaWxlTGVuZ3RoID0gbG9uZ1ZhbHVlc1swXTsKKyAgICBlbnYtPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhtTG9uZ0J1ZmZlciwgbG9uZ1ZhbHVlcywgMCk7CisgICAgCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OmRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZGVsZXRlRmlsZSwgKGppbnQpaGFuZGxlKTsKKworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBQcm9wZXJ0eVRhYmxlRW50cnkgeworICAgIE10cE9iamVjdFByb3BlcnR5ICAgcHJvcGVydHk7CisgICAgaW50ICAgICAgICAgICAgICAgICB0eXBlOworfTsKKworc3RhdGljIGNvbnN0IFByb3BlcnR5VGFibGVFbnRyeSAgIGtPYmplY3RQcm9wZXJ0eVRhYmxlW10gPSB7CisgICAgeyAgIE1UUF9QUk9QRVJUWV9QQVJFTlRfT0JKRUNULCAgICAgTVRQX1RZUEVfVUlOVDMyIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9TVE9SQUdFX0lELCAgICAgICAgTVRQX1RZUEVfVUlOVDMyIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRk9STUFULCAgICAgTVRQX1RZUEVfVUlOVDE2IH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfRklMRV9OQU1FLCAgTVRQX1RZUEVfU1RSICAgIH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRSwgICAgICAgTVRQX1RZUEVfVUlOVDY0IH0sCisgICAgeyAgIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVELCAgICAgTVRQX1RZUEVfU1RSICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5ICAga0RldmljZVByb3BlcnR5VGFibGVbXSA9IHsKKyAgICB7ICAgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiwgICAgIE1UUF9UWVBFX1NUUiB9LAorICAgIHsgICBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FLCAgICAgICAgTVRQX1RZUEVfU1RSIH0sCit9OworCitib29sIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5SW5mbyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgaW50JiB0eXBlKSB7CisgICAgaW50IGNvdW50ID0gc2l6ZW9mKGtPYmplY3RQcm9wZXJ0eVRhYmxlKSAvIHNpemVvZihrT2JqZWN0UHJvcGVydHlUYWJsZVswXSk7CisgICAgY29uc3QgUHJvcGVydHlUYWJsZUVudHJ5KiBlbnRyeSA9IGtPYmplY3RQcm9wZXJ0eVRhYmxlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPnByb3BlcnR5ID09IHByb3BlcnR5KSB7CisgICAgICAgICAgICB0eXBlID0gZW50cnktPnR5cGU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXlNdHBEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlJbmZvKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LCBpbnQmIHR5cGUpIHsKKyAgICBpbnQgY291bnQgPSBzaXplb2Yoa0RldmljZVByb3BlcnR5VGFibGUpIC8gc2l6ZW9mKGtEZXZpY2VQcm9wZXJ0eVRhYmxlWzBdKTsKKyAgICBjb25zdCBQcm9wZXJ0eVRhYmxlRW50cnkqIGVudHJ5ID0ga0RldmljZVByb3BlcnR5VGFibGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+cHJvcGVydHkgPT0gcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBlbnRyeS0+dHlwZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTXRwT2JqZWN0SGFuZGxlTGlzdCogTXlNdHBEYXRhYmFzZTo6Z2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamludEFycmF5IGFycmF5ID0gKGppbnRBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QobURhdGFiYXNlLCBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcywKKyAgICAgICAgICAgICAgICAoamludCloYW5kbGUpOworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGxpc3QgPSBuZXcgTXRwT2JqZWN0SGFuZGxlTGlzdCgpOworICAgIGppbnQqIGhhbmRsZXMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXksIDApOworICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgoYXJyYXkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGxpc3QtPnB1c2goaGFuZGxlc1tpXSk7CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgaGFuZGxlcywgMCk7CisKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gbGlzdDsKK30KKworTXRwUmVzcG9uc2VDb2RlIE15TXRwRGF0YWJhc2U6OnNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSB7CisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgaW50IGNvdW50ID0gcmVmZXJlbmNlcy0+c2l6ZSgpOworICAgIGppbnRBcnJheSBhcnJheSA9IGVudi0+TmV3SW50QXJyYXkoY291bnQpOworICAgIGlmICghYXJyYXkpIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSBpbiBzZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgamludCogaGFuZGxlcyA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhhcnJheSwgMCk7CisgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgaGFuZGxlc1tpXSA9ICgqcmVmZXJlbmNlcylbaV07CisgICAgZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheSwgaGFuZGxlcywgMCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtRGF0YWJhc2UsIG1ldGhvZF9zZXRPYmplY3RSZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIChqaW50KWhhbmRsZSwgYXJyYXkpOworCisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworTXRwUHJvcGVydHkqIE15TXRwRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgeworICAgIE10cFByb3BlcnR5KiByZXN1bHQgPSBOVUxMOworICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUFJPVEVDVElPTl9TVEFUVVM6CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1VJTlQxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfU1RPUkFHRV9JRDoKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfVUlOVDMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9PQkpFQ1RfU0laRToKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfVUlOVDY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfVUlOVDEyOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZJTEVfTkFNRToKKyAgICAgICAgY2FzZSBNVFBfUFJPUEVSVFlfREFURV9NT0RJRklFRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eShwcm9wZXJ0eSwgTVRQX1RZUEVfU1RSKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK010cFByb3BlcnR5KiBNeU10cERhdGFiYXNlOjpnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBNdHBQcm9wZXJ0eSogcmVzdWx0ID0gTlVMTDsKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUjoKKyAgICAgICAgY2FzZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FOgorICAgICAgICAgICAgLy8gd3JpdGVhYmxlIHN0cmluZyBwcm9wZXJ0aWVzCisgICAgICAgICAgICByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHkocHJvcGVydHksIE1UUF9UWVBFX1NUUiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OnNlc3Npb25TdGFydGVkKCkgeworICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobURhdGFiYXNlLCBtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQpOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIE15TXRwRGF0YWJhc2U6OnNlc3Npb25FbmRlZCgpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1EYXRhYmFzZSwgbWV0aG9kX3Nlc3Npb25FbmRlZCk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Cit9CisKKyNlbmRpZiAvLyBIQVZFX0FORFJPSURfT1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9zZXR1cChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNldHVwXG4iKTsKKyAgICBNeU10cERhdGFiYXNlKiBkYXRhYmFzZSA9IG5ldyBNeU10cERhdGFiYXNlKGVudiwgdGhpeik7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KWRhdGFiYXNlKTsKKyAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoImZpbmFsaXplXG4iKTsKKyAgICBNeU10cERhdGFiYXNlKiBkYXRhYmFzZSA9IChNeU10cERhdGFiYXNlICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICBkYXRhYmFzZS0+Y2xlYW51cChlbnYpOworICAgIGRlbGV0ZSBkYXRhYmFzZTsKKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQsIDApOworICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlX3NldHVwIiwgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZV9zZXR1cH0sCisgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cERhdGFiYXNlX2ZpbmFsaXplfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwRGF0YWJhc2UoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6OworCisgICAgTE9HRCgicmVnaXN0ZXJfYW5kcm9pZF9tZWRpYV9NdHBEYXRhYmFzZVxuIik7CisKKyAgICBjbGF6eiA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2JlZ2luU2VuZE9iamVjdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJiZWdpblNlbmRPYmplY3QiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSUpKKUkiKTsKKyAgICBpZiAobWV0aG9kX2JlZ2luU2VuZE9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgYmVnaW5TZW5kT2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2VuZFNlbmRPYmplY3QgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZW5kU2VuZE9iamVjdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SUlaKVYiKTsKKyAgICBpZiAobWV0aG9kX2VuZFNlbmRPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGVuZFNlbmRPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0TGlzdCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RMaXN0IiwgIihJSUkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldE9iamVjdExpc3QgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldE9iamVjdExpc3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0TnVtT2JqZWN0cyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXROdW1PYmplY3RzIiwgIihJSUkpSSIpOworICAgIGlmIChtZXRob2RfZ2V0TnVtT2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0TnVtT2JqZWN0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZENhcHR1cmVGb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMiLCAiKEkpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzIiwgIigpW0kiKTsKKyAgICBpZiAobWV0aG9kX2dldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0UHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0UHJvcGVydHkiLCAiKElJW0pbQylJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0UHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2V0T2JqZWN0UHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0T2JqZWN0UHJvcGVydHkiLCAiKElJSkxqYXZhL2xhbmcvU3RyaW5nOylJIik7CisgICAgaWYgKG1ldGhvZF9zZXRPYmplY3RQcm9wZXJ0eSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2V0T2JqZWN0UHJvcGVydHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0RGV2aWNlUHJvcGVydHkgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0RGV2aWNlUHJvcGVydHkiLCAiKElbSltDKUkiKTsKKyAgICBpZiAobWV0aG9kX2dldERldmljZVByb3BlcnR5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXREZXZpY2VQcm9wZXJ0eSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1ldGhvZF9zZXREZXZpY2VQcm9wZXJ0eSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJzZXREZXZpY2VQcm9wZXJ0eSIsICIoSUpMamF2YS9sYW5nL1N0cmluZzspSSIpOworICAgIGlmIChtZXRob2Rfc2V0RGV2aWNlUHJvcGVydHkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNldERldmljZVByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdEluZm8gPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAiZ2V0T2JqZWN0SW5mbyIsICIoSVtJW0NbSilaIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RJbmZvID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RJbmZvIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX2dldE9iamVjdEZpbGVQYXRoID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImdldE9iamVjdEZpbGVQYXRoIiwgIihJW0NbSilJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RGaWxlUGF0aCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgZ2V0T2JqZWN0RmlsZVBhdGgiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZGVsZXRlRmlsZSA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJkZWxldGVGaWxlIiwgIihJKUkiKTsKKyAgICBpZiAobWV0aG9kX2RlbGV0ZUZpbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGRlbGV0ZUZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfZ2V0T2JqZWN0UmVmZXJlbmNlcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRPYmplY3RSZWZlcmVuY2VzIiwgIihJKVtJIik7CisgICAgaWYgKG1ldGhvZF9nZXRPYmplY3RSZWZlcmVuY2VzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBnZXRPYmplY3RSZWZlcmVuY2VzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0T2JqZWN0UmVmZXJlbmNlcyIsICIoSVtJKUkiKTsKKyAgICBpZiAobWV0aG9kX3NldE9iamVjdFJlZmVyZW5jZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHNldE9iamVjdFJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2Vzc2lvblN0YXJ0ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2Vzc2lvblN0YXJ0ZWQiLCAiKClWIik7CisgICAgaWYgKG1ldGhvZF9zZXNzaW9uU3RhcnRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2Vzc2lvblN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2Rfc2Vzc2lvbkVuZGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNlc3Npb25FbmRlZCIsICIoKVYiKTsKKyAgICBpZiAobWV0aG9kX3Nlc3Npb25FbmRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgc2Vzc2lvbkVuZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmaWVsZF9jb250ZXh0ID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibU5hdGl2ZUNvbnRleHQiLCAiSSIpOworICAgIGlmIChmaWVsZF9jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBNdHBEYXRhYmFzZS5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cERhdGFiYXNlIiwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTY3OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyLmNwcApAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU2VydmVySk5JIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworI2luY2x1ZGUgPGxpbnV4L3VzYi9mX210cC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGpmaWVsZElEIGZpZWxkX2NvbnRleHQ7CitzdGF0aWMgTXV0ZXggICAgc011dGV4OworCisvLyBpbiBhbmRyb2lkX21lZGlhX010cERhdGFiYXNlLmNwcAorZXh0ZXJuIE10cERhdGFiYXNlKiBnZXRNdHBEYXRhYmFzZShKTklFbnYgKmVudiwgam9iamVjdCBkYXRhYmFzZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgYm9vbCBFeGNlcHRpb25DaGVjayh2b2lkKiBlbnYpCit7CisgICAgcmV0dXJuICgoSk5JRW52ICopZW52KS0+RXhjZXB0aW9uQ2hlY2soKTsKK30KKworY2xhc3MgTXRwVGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cERhdGFiYXNlKiAgICBtRGF0YWJhc2U7CisgICAgTXRwU2VydmVyKiAgICAgIG1TZXJ2ZXI7CisgICAgU3RyaW5nOCAgICAgICAgIG1TdG9yYWdlUGF0aDsKKyAgICBqb2JqZWN0ICAgICAgICAgbUphdmFTZXJ2ZXI7CisgICAgaW50ICAgICAgICAgICAgIG1GZDsKKworcHVibGljOgorICAgIE10cFRocmVhZChNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IGNoYXIqIHN0b3JhZ2VQYXRoLCBqb2JqZWN0IGphdmFTZXJ2ZXIpCisgICAgICAgIDogICBtRGF0YWJhc2UoZGF0YWJhc2UpLAorICAgICAgICAgICAgbVNlcnZlcihOVUxMKSwKKyAgICAgICAgICAgIG1TdG9yYWdlUGF0aChzdG9yYWdlUGF0aCksCisgICAgICAgICAgICBtSmF2YVNlcnZlcihqYXZhU2VydmVyKSwKKyAgICAgICAgICAgIG1GZCgtMSkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBzZXRQdHBNb2RlKGJvb2wgdXNlUHRwKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICAgICAgaW9jdGwobUZkLCBNVFBfU0VUX0lOVEVSRkFDRV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAodXNlUHRwID8gTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCA6IE1UUF9JTlRFUkZBQ0VfTU9ERV9NVFApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbXRwX3VzYiIsIE9fUkRXUik7CisgICAgICAgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgICAgIGlvY3RsKGZkLCBNVFBfU0VUX0lOVEVSRkFDRV9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVzZVB0cCA/IE1UUF9JTlRFUkZBQ0VfTU9ERV9QVFAgOiBNVFBfSU5URVJGQUNFX01PREVfTVRQKSk7CisgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNNdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgbUZkID0gb3BlbigiL2Rldi9tdHBfdXNiIiwgT19SRFdSKTsKKyAgICAgICAgcHJpbnRmKCJvcGVuIHJldHVybmVkICVkXG4iLCBtRmQpOworICAgICAgICBpZiAobUZkIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IG9wZW4gTVRQIGRyaXZlclxuIik7CisgICAgICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtU2VydmVyID0gbmV3IE10cFNlcnZlcihtRmQsIG1EYXRhYmFzZSwgQUlEX1NEQ0FSRF9SVywgMDY2NCwgMDc3NSk7CisgICAgICAgIG1TZXJ2ZXItPmFkZFN0b3JhZ2UobVN0b3JhZ2VQYXRoKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworCisgICAgICAgIExPR0QoIk10cFRocmVhZCBtU2VydmVyLT5ydW4iKTsKKyAgICAgICAgbVNlcnZlci0+cnVuKCk7CisKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgICAgIGRlbGV0ZSBtU2VydmVyOworICAgICAgICBtU2VydmVyID0gTlVMTDsKKworICAgICAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICAgICAgZW52LT5TZXRJbnRGaWVsZChtSmF2YVNlcnZlciwgZmllbGRfY29udGV4dCwgMCk7CisgICAgICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1KYXZhU2VydmVyKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworCisgICAgICAgIExPR0QoInRocmVhZExvb3AgcmV0dXJuaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgICAgIHNNdXRleC5sb2NrKCk7CisgICAgICAgIGlmIChtU2VydmVyKQorICAgICAgICAgICAgbVNlcnZlci0+c2VuZE9iamVjdEFkZGVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyAgICAgICAgc011dGV4LnVubG9jaygpOworICAgIH0KKworICAgIHZvaWQgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgICAgICBzTXV0ZXgubG9jaygpOworICAgICAgICBpZiAobVNlcnZlcikKKyAgICAgICAgICAgIG1TZXJ2ZXItPnNlbmRPYmplY3RSZW1vdmVkKGhhbmRsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR0UoInNlbmRPYmplY3RSZW1vdmVkIGNhbGxlZCB3aGlsZSBkaXNjb25uZWN0ZWRcbiIpOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorfTsKKworI2VuZGlmIC8vIEhBVkVfQU5EUk9JRF9PUworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqYXZhRGF0YWJhc2UsIGpzdHJpbmcgc3RvcmFnZVBhdGgpCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0dXBcbiIpOworCisgICAgTXRwRGF0YWJhc2UqIGRhdGFiYXNlID0gZ2V0TXRwRGF0YWJhc2UoZW52LCBqYXZhRGF0YWJhc2UpOworICAgIGNvbnN0IGNoYXIgKnN0b3JhZ2VQYXRoU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgTlVMTCk7CisKKyAgICBNdHBUaHJlYWQqIHRocmVhZCA9IG5ldyBNdHBUaHJlYWQoZGF0YWJhc2UsIHN0b3JhZ2VQYXRoU3RyLCBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KSk7CisgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0LCAoaW50KXRocmVhZCk7CisKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdG9yYWdlUGF0aCwgc3RvcmFnZVBhdGhTdHIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9maW5hbGl6ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6KQoreworICAgIExPR0QoImZpbmFsaXplXG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzdGFydFxuIik7CisgICAgTXRwVGhyZWFkICp0aHJlYWQgPSAoTXRwVGhyZWFkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBmaWVsZF9jb250ZXh0KTsKKyAgICB0aHJlYWQtPnJ1bigiTXRwVGhyZWFkIik7CisjZW5kaWYgLy8gSEFWRV9BTkRST0lEX09TCit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX21lZGlhX010cFNlcnZlcl9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic3RvcFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgaGFuZGxlKQoreworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworICAgIExPR0QoInNlbmRfb2JqZWN0X2FkZGVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0QWRkZWQoaGFuZGxlKTsKKyAgICBlbHNlCisgICAgICAgIExPR0UoInNlbmRPYmplY3RBZGRlZCBjYWxsZWQgd2hpbGUgZGlzY29ubmVjdGVkXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyAgICBMT0dEKCJzZW5kX29iamVjdF9yZW1vdmVkICVkXG4iLCBoYW5kbGUpOworICAgIE10cFRocmVhZCAqdGhyZWFkID0gKE10cFRocmVhZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRfY29udGV4dCk7CisgICAgaWYgKHRocmVhZCkKKyAgICAgICAgdGhyZWFkLT5zZW5kT2JqZWN0UmVtb3ZlZChoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgTE9HRSgic2VuZE9iamVjdFJlbW92ZWQgY2FsbGVkIHdoaWxlIGRpc2Nvbm5lY3RlZFxuIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldF9wdHBfbW9kZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiB1c2VQdHApCit7CisjaWZkZWYgSEFWRV9BTkRST0lEX09TCisgICAgTE9HRCgic2V0X3B0cF9tb2RlXG4iKTsKKyAgICBNdHBUaHJlYWQgKnRocmVhZCA9IChNdHBUaHJlYWQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGZpZWxkX2NvbnRleHQpOworICAgIGlmICh0aHJlYWQpCisgICAgICAgIHRocmVhZC0+c2V0UHRwTW9kZSh1c2VQdHApOworICNlbmRpZgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZV9zZXR1cCIsICAgICAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvTXRwRGF0YWJhc2U7TGphdmEvbGFuZy9TdHJpbmc7KVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NldHVwfSwKKyAgICB7Im5hdGl2ZV9maW5hbGl6ZSIsICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9maW5hbGl6ZX0sCisgICAgeyJuYXRpdmVfc3RhcnQiLCAgICAgICAgICAgICAgICAiKClWIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NdHBTZXJ2ZXJfc3RhcnR9LAorICAgIHsibmF0aXZlX3N0b3AiLCAgICAgICAgICAgICAgICAgIigpViIsICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3N0b3B9LAorICAgIHsibmF0aXZlX3NlbmRfb2JqZWN0X2FkZGVkIiwgICAgIihJKVYiLCAodm9pZCAqKWFuZHJvaWRfbWVkaWFfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkfSwKKyAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkIiwgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZW5kX29iamVjdF9yZW1vdmVkfSwKKyAgICB7Im5hdGl2ZV9zZXRfcHRwX21vZGUiLCAgICAgICAgICIoWilWIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX010cFNlcnZlcl9zZXRfcHRwX21vZGV9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIjsKKworaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyKEpOSUVudiAqZW52KQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIExPR0QoInJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfTXRwU2VydmVyXG4iKTsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTXRwU2VydmVyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBhbmRyb2lkL21lZGlhL010cFNlcnZlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZpZWxkX2NvbnRleHQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtTmF0aXZlQ29udGV4dCIsICJJIik7CisgICAgaWYgKGZpZWxkX2NvbnRleHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIE10cFNlcnZlci5tTmF0aXZlQ29udGV4dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LAorICAgICAgICAgICAgICAgICJhbmRyb2lkL21lZGlhL010cFNlcnZlciIsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA0OGI0NWZmLi5lNmZmNjU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMjcsNCArMjcsNCBAQAogCiBMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDdlM2I3NDMuLjljMmE4YmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTc2Myw3ICs3NjMsOCBAQAogICAgIGlmICgocG9wQ291bnQoZGV2aWNlKSA9PSAxICkgJiYKICAgICAgICAgKGRldmljZSAmIChBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIHwKICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQgfAotICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSkpIHsKKyAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCB8CisgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OkRFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCAwZjU1YjE5ZC4uOWRmZGNiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0yMiwxMiArMjIsMTQgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewogICAgIERJU0NPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFNFVF9WSURFT19TVVJGQUNFLAorICAgIFNFVF9WSURFT19JU1VSRkFDRSwKICAgICBQUkVQQVJFX0FTWU5DLAogICAgIFNUQVJULAogICAgIFNUT1AsCkBAIC02NSwxMSArNjcsMjAgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WSURFT19JU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgU3VyZmFjZTo6d3JpdGVUb1BhcmNlbChzdXJmYWNlLCAmZGF0YSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVklERU9fU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTI1Niw5ICsyNjcsMTUgQEAKICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVklERU9fU1VSRkFDRTogeworICAgICAgICBjYXNlIFNFVF9WSURFT19JU1VSRkFDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2UgPSBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0VmlkZW9JU3VyZmFjZShzdXJmYWNlKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX1ZJREVPX1NVUkZBQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFZpZGVvU3VyZmFjZShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggOTQ3ZmYzNC4uNTljZDFiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBMT0dfVEFHICJJTWVkaWFSZWNvcmRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CkBAIC00Myw2ICs0Myw3IEBACiAgICAgU0VUX0FVRElPX0VOQ09ERVIsCiAgICAgU0VUX09VVFBVVF9GSUxFX1BBVEgsCiAgICAgU0VUX09VVFBVVF9GSUxFX0ZELAorICAgIFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQsCiAgICAgU0VUX1ZJREVPX1NJWkUsCiAgICAgU0VUX1ZJREVPX0ZSQU1FUkFURSwKICAgICBTRVRfUEFSQU1FVEVSUywKQEAgLTY5LDEyICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorICAgIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogICAgIHsKICAgICAgICAgTE9HVigic2V0UHJldmlld1N1cmZhY2UoJXApIiwgc3VyZmFjZS5nZXQoKSk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UtPmFzQmluZGVyKCkpOworICAgICAgICBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKHN1cmZhY2UsICZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUkVWSUVXX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xNTksNiArMTYwLDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgeworICAgICAgICBMT0dWKCJzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KCVkKSIsIGZkKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfT1VUUFVUX0ZJTEVfQVVYSUxJQVJZX0ZELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKICAgICB7CiAgICAgICAgIExPR1YoInNldFZpZGVvU2l6ZSglZHglZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTM3Nyw2ICszODcsMTMgQEAKICAgICAgICAgICAgIDo6Y2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQ6IHsKKyAgICAgICAgICAgIExPR1YoIlNFVF9PVVRQVVRfRklMRV9BVVhJTElBUllfRkQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGZkID0gZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShmZCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WSURFT19TSVpFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfVklERU9fU0laRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CkBAIC00MDksNyArNDI2LDcgQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19TVVJGQUNFOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfUFJFVklFV19TVVJGQUNFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChkYXRhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFByZXZpZXdTdXJmYWNlKHN1cmZhY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggZjM4MDRiOC4uNDA4MDFhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTIxLDcgKzIxLDkgQEAKICAgICBTRVRfUEFSQU1FVEVSLAogICAgIEdFVF9DT05GSUcsCiAgICAgU0VUX0NPTkZJRywKKyAgICBFTkFCTEVfR1JBUEhJQ19CVUZGRVJTLAogICAgIFVTRV9CVUZGRVIsCisgICAgVVNFX0dSQVBISUNfQlVGRkVSLAogICAgIEFMTE9DX0JVRkZFUiwKICAgICBBTExPQ19CVUZGRVJfV0lUSF9CQUNLVVAsCiAgICAgRlJFRV9CVUZGRVIsCkBAIC0yMTYsNiArMjE4LDE5IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfR1JBUEhJQ19CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcikgewpAQCAtMjM4LDYgKzI1MywyOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorCisgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkICpidWZmZXIpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZSgqZ3JhcGhpY0J1ZmZlcik7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVU0VfR1JBUEhJQ19CVUZGRVIsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICpidWZmZXIgPSAwOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgKmJ1ZmZlciA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSkgewpAQCAtNTQxLDYgKzU3OSwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBFTkFCTEVfR1JBUEhJQ19CVUZGRVJTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGVuYWJsZUdyYXBoaWNCdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFVTRV9CVUZGRVI6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CkBAIC01NjEsNiArNjEzLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFVTRV9HUkFQSElDX0JVRkZFUjoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgICAgICAgICAgZGF0YS5yZWFkKCpncmFwaGljQnVmZmVyKTsKKworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlcjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGdyYXBoaWNCdWZmZXIsICZidWZmZXIpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBBTExPQ19CVUZGRVI6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDM4NjkzODkuLjY0NWMxNjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC01OSw4ICs1OSwyMSBAQAogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcFtdID0geworICAgIHsibG93IiwgQ0FNQ09SREVSX1FVQUxJVFlfTE9XfSwKICAgICB7ImhpZ2giLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIfSwKLSAgICB7ImxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9MT1d9CisgICAgeyJxY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfUUNJRn0sCisgICAgeyJjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9DSUZ9LAorICAgIHsiNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzQ4MFB9LAorICAgIHsiNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzcyMFB9LAorICAgIHsiMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV8xMDgwUH0sCisKKyAgICB7InRpbWVsYXBzZWxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPV30sCisgICAgeyJ0aW1lbGFwc2VoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9ISUdIfSwKKyAgICB7InRpbWVsYXBzZXFjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FDSUZ9LAorICAgIHsidGltZWxhcHNlY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9DSUZ9LAorICAgIHsidGltZWxhcHNlNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUH0sCisgICAgeyJ0aW1lbGFwc2U3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV83MjBQfSwKKyAgICB7InRpbWVsYXBzZTEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0KIH07CiAKIC8qc3RhdGljKi8gdm9pZApAQCAtNDExLDYgKzQyNCw0MCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlSGlnaFByb2ZpbGUoKQoreworICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQorICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDIwMDAwMDAwLCA3MjAsIDQ4MCwgMjApOworCisgICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CisgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOworICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CisgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKKyAgICBwcm9maWxlLT5tUXVhbGl0eSA9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSDsKKyAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHJldHVybiBwcm9maWxlOworfQorCisvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlTG93UHJvZmlsZSgpCit7CisgICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9CisgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMTAwMDAwMCwgMTc2LCAxNDQsIDIwKTsKKworICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOworICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOworICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CisgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVzsKKyAgICBwcm9maWxlLT5tRHVyYXRpb24gPSA2MDsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOworICAgIHJldHVybiBwcm9maWxlOworfQorCisvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVySGlnaFByb2ZpbGUoKQogewogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQpAQCAtNDQ5LDYgKzQ5Niw4IEBACiAvKnN0YXRpYyovIHZvaWQKIE1lZGlhUHJvZmlsZXM6OmNyZWF0ZURlZmF1bHRDYW1jb3JkZXJQcm9maWxlcyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKIHsKKyAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlSGlnaFByb2ZpbGUoKSk7CisgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlRGVmYXVsdENhbWNvcmRlclRpbWVMYXBzZUxvd1Byb2ZpbGUoKSk7CiAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlRGVmYXVsdENhbWNvcmRlckhpZ2hQcm9maWxlKCkpOwogICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKGNyZWF0ZURlZmF1bHRDYW1jb3JkZXJMb3dQcm9maWxlKCkpOwogfQpAQCAtNjY4LDEzICs3MTcsOCBAQAogICAgIHJldHVybiBkZWNvZGVyczsgIC8vIGNvcHkgb3V0CiB9CiAKLWludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdAoraW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVJbmRleChpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0CiB7Ci0gICAgTE9HVigiZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lOiAlcyBmb3IgY2FtZXJhICVkLCBxdWFsaXR5ICVkIiwKLSAgICAgICAgIG5hbWUsIGNhbWVyYUlkLCBxdWFsaXR5KTsKLQogICAgIGludCBpbmRleCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwLCBuID0gbUNhbWNvcmRlclByb2ZpbGVzLnNpemUoKTsgaSA8IG47ICsraSkgewogICAgICAgICBpZiAobUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tQ2FtZXJhSWQgPT0gY2FtZXJhSWQgJiYKQEAgLTY4Myw2ICs3MjcsMTcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKworaW50IE1lZGlhUHJvZmlsZXM6OmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0Cit7CisgICAgTE9HVigiZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lOiAlcyBmb3IgY2FtZXJhICVkLCBxdWFsaXR5ICVkIiwKKyAgICAgICAgIG5hbWUsIGNhbWVyYUlkLCBxdWFsaXR5KTsKKworICAgIGludCBpbmRleCA9IGdldENhbWNvcmRlclByb2ZpbGVJbmRleChjYW1lcmFJZCwgcXVhbGl0eSk7CiAgICAgaWYgKGluZGV4ID09IC0xKSB7CiAgICAgICAgIExPR0UoIlRoZSBnaXZlbiBjYW1jb3JkZXIgcHJvZmlsZSBjYW1lcmEgJWQgcXVhbGl0eSAlZCBpcyBub3QgZm91bmQiLAogICAgICAgICAgICAgIGNhbWVyYUlkLCBxdWFsaXR5KTsKQEAgLTcwNSw2ICs3NjAsMTEgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKK2Jvb2wgTWVkaWFQcm9maWxlczo6aGFzQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0Cit7CisgICAgcmV0dXJuIChnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoY2FtZXJhSWQsIHF1YWxpdHkpICE9IC0xKTsKK30KKwogVmVjdG9yPGludD4gTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdAogewogICAgIFZlY3RvcjxpbnQ+IHJlc3VsdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCmluZGV4IGM1MTEyYTUuLmMzMWI2MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtNDgsOCArNDgsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVNjYW5uZXI6OnByb2Nlc3NEaXJlY3RvcnkoCi0gICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKICAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudikgewogICAgIGludCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOwogICAgIGlmIChwYXRoTGVuZ3RoID49IFBBVEhfTUFYKSB7CkBAIC03MiwzNSArNzEsMTYgQEAKIAogICAgIHN0YXR1c190IHJlc3VsdCA9CiAgICAgICAgIGRvUHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLCBwYXRoUmVtYWluaW5nLCBleHRlbnNpb25zLCBjbGllbnQsCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2hlY2ssIGV4Y2VwdGlvbkVudik7CisgICAgICAgICAgICAgICAgcGF0aEJ1ZmZlciwgcGF0aFJlbWFpbmluZywgY2xpZW50LCBleGNlcHRpb25DaGVjaywgZXhjZXB0aW9uRW52KTsKIAogICAgIGZyZWUocGF0aEJ1ZmZlcik7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgYm9vbCBmaWxlTWF0Y2hlc0V4dGVuc2lvbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBleHRlbnNpb25zKSB7Ci0gICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihwYXRoLCAnLicpOwotICAgIGlmICghZXh0ZW5zaW9uKSByZXR1cm4gZmFsc2U7Ci0gICAgKytleHRlbnNpb247ICAgIC8vIHNraXAgdGhlIGRvdAotICAgIGlmIChleHRlbnNpb25bMF0gPT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gICAgd2hpbGUgKGV4dGVuc2lvbnNbMF0pIHsKLSAgICAgICAgY29uc3QgY2hhciogY29tbWEgPSBzdHJjaHIoZXh0ZW5zaW9ucywgJywnKTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IChjb21tYSA/IGNvbW1hIC0gZXh0ZW5zaW9ucyA6IHN0cmxlbihleHRlbnNpb25zKSk7Ci0gICAgICAgIGlmIChsZW5ndGggPT0gc3RybGVuKGV4dGVuc2lvbikgJiYgc3RybmNhc2VjbXAoZXh0ZW5zaW9uLCBleHRlbnNpb25zLCBsZW5ndGgpID09IDApIHJldHVybiB0cnVlOwotICAgICAgICBleHRlbnNpb25zICs9IGxlbmd0aDsKLSAgICAgICAgaWYgKGV4dGVuc2lvbnNbMF0gPT0gJywnKSArK2V4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0dXNfdCBNZWRpYVNjYW5uZXI6OmRvUHJvY2Vzc0RpcmVjdG9yeSgKLSAgICAgICAgY2hhciAqcGF0aCwgaW50IHBhdGhSZW1haW5pbmcsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMsCi0gICAgICAgIE1lZGlhU2Nhbm5lckNsaWVudCAmY2xpZW50LCBFeGNlcHRpb25DaGVjayBleGNlcHRpb25DaGVjaywKLSAgICAgICAgdm9pZCAqZXhjZXB0aW9uRW52KSB7CisgICAgICAgIGNoYXIgKnBhdGgsIGludCBwYXRoUmVtYWluaW5nLCBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCwKKyAgICAgICAgRXhjZXB0aW9uQ2hlY2sgZXhjZXB0aW9uQ2hlY2ssIHZvaWQgKmV4Y2VwdGlvbkVudikgewogICAgIC8vIHBsYWNlIHRvIGNvcHkgZmlsZSBvciBkaXJlY3RvcnkgbmFtZQogICAgIGNoYXIqIGZpbGVTcG90ID0gcGF0aCArIHN0cmxlbihwYXRoKTsKICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKQEAgLTEzMyw2ICsxMTMsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7CisgICAgICAgIGlmIChuYW1lTGVuZ3RoICsgMSA+IHBhdGhSZW1haW5pbmcpIHsKKyAgICAgICAgICAgIC8vIHBhdGggdG9vIGxvbmchCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoZmlsZVNwb3QsIG5hbWUpOworCiAgICAgICAgIGludCB0eXBlID0gZW50cnktPmRfdHlwZTsKICAgICAgICAgaWYgKHR5cGUgPT0gRFRfVU5LTk9XTikgewogICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgaXMgdW5rbm93biwgc3RhdCgpIHRoZSBmaWxlIGluc3RlYWQuCkBAIC0xNTAsMjkgKzEzNywyMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlID09IERUX1JFRyB8fCB0eXBlID09IERUX0RJUikgewotICAgICAgICAgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4obmFtZSk7Ci0gICAgICAgICAgICBib29sIGlzRGlyZWN0b3J5ID0gKHR5cGUgPT0gRFRfRElSKTsKLQotICAgICAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBwYXRoUmVtYWluaW5nIHx8IChpc0RpcmVjdG9yeSAmJiBuYW1lTGVuZ3RoICsgMSA+IHBhdGhSZW1haW5pbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcGF0aCB0b28gbG9uZyEKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyY3B5KGZpbGVTcG90LCBuYW1lKTsKLSAgICAgICAgICAgIGlmIChpc0RpcmVjdG9yeSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gRFRfRElSKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGRpcmVjdG9yaWVzIHdpdGggYSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggJy4nCiAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBNYWMgIi5UcmFzaGVzIiBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgc3RyY2F0KGZpbGVTcG90LCAiLyIpOwotICAgICAgICAgICAgICAgIGludCBlcnIgPSBkb1Byb2Nlc3NEaXJlY3RvcnkocGF0aCwgcGF0aFJlbWFpbmluZyAtIG5hbWVMZW5ndGggLSAxLCBleHRlbnNpb25zLCBjbGllbnQsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOworICAgICAgICAgICAgICAgIGludCBlcnIgPSBkb1Byb2Nlc3NEaXJlY3RvcnkocGF0aCwgcGF0aFJlbWFpbmluZyAtIG5hbWVMZW5ndGggLSAxLCBjbGllbnQsIGV4Y2VwdGlvbkNoZWNrLCBleGNlcHRpb25FbnYpOwogICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBleGNlcHRpb25zIHVwIC0gaWdub3JlIG90aGVyIGVycm9ycwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uQ2hlY2sgJiYgZXhjZXB0aW9uQ2hlY2soZXhjZXB0aW9uRW52KSkgZ290byBmYWlsdXJlOwogICAgICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBwcm9jZXNzaW5nICclcycgLSBza2lwcGluZ1xuIiwgcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZU1hdGNoZXNFeHRlbnNpb24ocGF0aCwgZXh0ZW5zaW9ucykpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKICAgICAgICAgICAgICAgICBzdGF0KHBhdGgsICZzdGF0YnVmKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGJ1Zi5zdF9zaXplID4gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IGYzMjI5YzAuLjMyYjIwYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTIwNiwxMCArMjA2LDE1IEBACiAgICAgTE9HVigic2V0VmlkZW9TdXJmYWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVBsYXllciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAoc3VyZmFjZSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKE5VTEwpOworCisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0VmlkZW9JU3VyZmFjZSgKKyAgICAgICAgICAgIHN1cmZhY2UgPT0gTlVMTCA/IE5VTEwgOiBzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpOwogfQogCiAvLyBtdXN0IGNhbGwgd2l0aCBsb2NrIGhlbGQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggOWQ1M2MyNS4uNTFkOTFmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlLT5nZXRJU3VyZmFjZSgpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0UHJldmlld1N1cmZhY2Uoc3VyZmFjZSk7CiAgICAgaWYgKE9LICE9IHJldCkgewogICAgICAgICBMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZSBmYWlsZWQ6ICVkIiwgcmV0KTsKICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0VSUk9SOwpAQCAtMzA4LDYgKzMwOCwzMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKQoreworICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkoJWQpIiwgZmQpOworICAgIGlmKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtSXNBdXhpbGlhcnlPdXRwdXRGaWxlU2V0KSB7CisgICAgICAgIExPR0UoIm91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1JFQ09SREVSX0RBVEFTT1VSQ0VfQ09ORklHVVJFRCkpIHsKKyAgICAgICAgTE9HRSgic2V0T3V0cHV0RmlsZSBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZSglZCkiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IG1NZWRpYVJlY29yZGVyLT5zZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGZkKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnkgZmFpbGVkOiAlZCIsIHJldCk7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgbUlzQXV4aWxpYXJ5T3V0cHV0RmlsZVNldCA9IHRydWU7CisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBMT0dWKCJzZXRWaWRlb1NpemUoJWQsICVkKSIsIHdpZHRoLCBoZWlnaHQpOwpAQCAtNTcxLDYgKzU5Nyw3IEBACiAgICAgbUlzQXVkaW9FbmNvZGVyU2V0ID0gZmFsc2U7CiAgICAgbUlzVmlkZW9FbmNvZGVyU2V0ID0gZmFsc2U7CiAgICAgbUlzT3V0cHV0RmlsZVNldCAgID0gZmFsc2U7CisgICAgbUlzQXV4aWxpYXJ5T3V0cHV0RmlsZVNldCA9IGZhbHNlOwogfQogCiAvLyBSZWxlYXNlIHNob3VsZCBiZSBPSyBpbiBhbnkgc3RhdGUKQEAgLTY0Myw0ICs2NzAsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGFiYTVmNTIuLmZmZTE5ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC04ODksNyArODg5LDE1IEBACiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKQoreworICAgIExPR1YoIlslZF0gc2V0VmlkZW9JU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0VmlkZW9JU3VyZmFjZShzdXJmYWNlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkKIHsKICAgICBMT0dWKCJbJWRdIHNldFZpZGVvU3VyZmFjZSglcCkiLCBtQ29ubklkLCBzdXJmYWNlLmdldCgpKTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBhOTY3ZWUyLi5kZWI0NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC0yMDQsNyArMjA0LDggQEAKIAogICAgICAgICAvLyBJTWVkaWFQbGF5ZXIgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvSVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCAxOTkxNWYxLi5iZTZhOGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC03MCw3ICs3MCw3IEBACiAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0Q2FtZXJhKGNhbWVyYSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTY0LDYgKzE2NCwxNyBAQAogICAgIHJldHVybiBtUmVjb3JkZXItPnNldE91dHB1dEZpbGUoZmQsIG9mZnNldCwgbGVuZ3RoKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpCit7CisgICAgTE9HVigic2V0T3V0cHV0RmlsZUF1eGlsaWFyeSglZCkiLCBmZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJyZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUmVjb3JkZXItPnNldE91dHB1dEZpbGVBdXhpbGlhcnkoZmQpOworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIExPR1YoInNldFZpZGVvU2l6ZSglZHglZCkiLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTMzNyw0ICszNDgsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCAxZDE5MTNkLi5mZGVkOThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTI5LDcgKzI5LDcgQEAKIHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU291cmNlKGludCB2cyk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU291cmNlKGludCBhcyk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZvcm1hdChpbnQgb2YpOwpAQCAtMzcsNiArMzcsNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb0VuY29kZXIoaW50IGFlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dEZpbGVBdXhpbGlhcnkoaW50IGZkKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKQEAgLTY2LDQgKzY3LDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX01FRElBUkVDT1JERVJDTElFTlRfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCmluZGV4IDRhNjBlY2UuLjA2ZTRiNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCkBAIC0zNSw3ICszNSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggMmM5NmQ2ZC4uNmI5YmY4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC00NCwxMyArNDQsMjAgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShkdXAoZmQpLCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgTE9HVigic2V0VmlkZW9TdXJmYWNlIik7CitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6c2V0VmlkZW9JU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBMT0dWKCJzZXRWaWRlb0lTdXJmYWNlIik7CiAKICAgICBtUGxheWVyLT5zZXRJU3VyZmFjZShzdXJmYWNlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKKworICAgIG1QbGF5ZXItPnNldFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6cHJlcGFyZSgpIHsKICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAppbmRleCA3ODFlYjQ0Li5kZDM3MTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaApAQCAtMzUsNyArMzUsOCBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGNmMDFmZjYuLjc3YTljY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zNCwxOSArMzcsMTkgQEAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJBUlRQV3JpdGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6U3RhZ2VmcmlnaHRSZWNvcmRlcigpCi0gICAgOiBtV3JpdGVyKE5VTEwpLAotICAgICAgbU91dHB1dEZkKC0xKSB7CisgICAgOiBtV3JpdGVyKE5VTEwpLCBtV3JpdGVyQXV4KE5VTEwpLAorICAgICAgbU91dHB1dEZkKC0xKSwgbU91dHB1dEZkQXV4KC0xKSB7CiAKICAgICBMT0dWKCJDb25zdHJ1Y3RvciIpOwogICAgIHJlc2V0KCk7CkBAIC0yMDAsNyArMjAzLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKICAgICBMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZTogJXAiLCBzdXJmYWNlLmdldCgpKTsKICAgICBtUHJldmlld1N1cmZhY2UgPSBzdXJmYWNlOwogCkBAIC0yMzQsNiArMjM3LDI0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkgeworICAgIExPR1YoInNldE91dHB1dEZpbGVBdXhpbGlhcnk6ICVkIiwgZmQpOworCisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcjogJWQiLCBmZCk7CisgICAgICAgIHJldHVybiAtRUJBREY7CisgICAgfQorCisgICAgbUNhcHR1cmVBdXhWaWRlbyA9IHRydWU7CisKKyAgICBpZiAobU91dHB1dEZkQXV4ID49IDApIHsKKyAgICAgICAgOjpjbG9zZShtT3V0cHV0RmRBdXgpOworICAgIH0KKyAgICBtT3V0cHV0RmRBdXggPSBkdXAoZmQpOworCisgICAgcmV0dXJuIE9LOworfQorCiAvLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGludDY0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsCiAvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogc3RhdGljIGJvb2wgc2FmZV9zdHJ0b2k2NChjb25zdCBjaGFyICpzLCBpbnQ2NF90ICp2YWwpIHsKQEAgLTQ3Myw2ICs0OTQsNjggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKSB7CisgICAgTE9HVigic2V0UGFyYW1UaW1lTGFwc2VFbmFibGU6ICVkIiwgdGltZUxhcHNlRW5hYmxlKTsKKworICAgIGlmKHRpbWVMYXBzZUVuYWJsZSA9PSAwKSB7CisgICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmICh0aW1lTGFwc2VFbmFibGUgPT0gMSkgeworICAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZTogJWxsZCB1cyIsIHRpbWVVcyk7CisKKyAgICAvLyBOb3QgYWxsb3dpbmcgdGltZSBtb3JlIHRoYW4gYSBkYXkKKyAgICBpZiAodGltZVVzIDw9IDAgfHwgdGltZVVzID4gODY0MDAqMUU2KSB7CisgICAgICAgIExPR0UoIlRpbWUgYmV0d2VlbiB0aW1lIGxhcHNlIGZyYW1lIGNhcHR1cmUgKCVsbGQpIGlzIG91dCBvZiByYW5nZSBbMCwgMSBEYXldIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyA9IHRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9XaWR0aChpbnQzMl90IHdpZHRoKSB7CisgICAgTE9HVigic2V0UGFyYW1BdXhWaWRlb1dpZHRoIDogJWQiLCB3aWR0aCk7CisKKyAgICBpZiAod2lkdGggPD0gMCkgeworICAgICAgICBMT0dFKCJXaWR0aCAoJWQpIGlzIG5vdCBwb3NpdGl2ZSIsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQXV4VmlkZW9XaWR0aCA9IHdpZHRoOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdXhWaWRlb0hlaWdodChpbnQzMl90IGhlaWdodCkgeworICAgIExPR1YoInNldFBhcmFtQXV4VmlkZW9IZWlnaHQgOiAlZCIsIGhlaWdodCk7CisKKyAgICBpZiAoaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HRSgiSGVpZ2h0ICglZCkgaXMgbm90IHBvc2l0aXZlIiwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQXV4VmlkZW9IZWlnaHQgPSBoZWlnaHQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1eFZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSkgeworICAgIExPR1YoIlN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQXV4VmlkZW9FbmNvZGluZ0JpdFJhdGU6ICVkIiwgYml0UmF0ZSk7CisKKyAgICBpZiAoYml0UmF0ZSA8PSAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGU6ICVkIiwgYml0UmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbUF1eFZpZGVvQml0UmF0ZSA9IGJpdFJhdGU7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKICAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKQEAgLTU1Niw2ICs2MzksMzIgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lU2NhbGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb1RpbWVTY2FsZSh0aW1lU2NhbGUpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtbGFwc2UtZW5hYmxlIikgeworICAgICAgICBpbnQzMl90IHRpbWVMYXBzZUVuYWJsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lTGFwc2VFbmFibGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUodGltZUxhcHNlRW5hYmxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWJldHdlZW4tdGltZS1sYXBzZS1mcmFtZS1jYXB0dXJlIikgeworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKAorICAgICAgICAgICAgICAgICAgICAxMDAwTEwgKiB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1hdXgtcGFyYW0td2lkdGgiKSB7CisgICAgICAgIGludDMyX3QgYXV4V2lkdGg7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmYXV4V2lkdGgpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb1dpZHRoKGF1eFdpZHRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1hdXgtcGFyYW0taGVpZ2h0IikgeworICAgICAgICBpbnQzMl90IGF1eEhlaWdodDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhIZWlnaHQpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb0hlaWdodChhdXhIZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLWF1eC1wYXJhbS1lbmNvZGluZy1iaXRyYXRlIikgeworICAgICAgICBpbnQzMl90IGF1eFZpZGVvQml0UmF0ZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZhdXhWaWRlb0JpdFJhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZShhdXhWaWRlb0JpdFJhdGUpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTc4Niw3ICs4OTUsMTQgQEAKICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgewogICAgICAgICBzb3VyY2UgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKCZzb3VyY2UpOworCisgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgmY2FtZXJhU291cmNlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKGNhbWVyYVNvdXJjZSwgbVZpZGVvQml0UmF0ZSwgJnNvdXJjZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KQEAgLTg1MCwxMSArOTY2LDE1IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZSgpIHsKLSAgICBjbGlwVmlkZW9CaXRSYXRlKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVSYXRlKCk7Ci0gICAgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOwotICAgIGNsaXBWaWRlb0ZyYW1lSGVpZ2h0KCk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYSgpIHsKKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgIC8vIERvbnQgY2xpcCBmb3IgdGltZSBsYXBzZSBjYXB0dXJlIGFzIGVuY29kZXIgd2lsbCBoYXZlIGVub3VnaAorICAgICAgICAvLyB0aW1lIHRvIGVuY29kZSBiZWNhdXNlIG9mIHNsb3cgY2FwdHVyZSByYXRlIG9mIHRpbWUgbGFwc2UuCisgICAgICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVSYXRlKCk7CisgICAgICAgIGNsaXBWaWRlb0ZyYW1lV2lkdGgoKTsKKyAgICAgICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKKyAgICB9CiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBpZiAobUNhbWVyYSA9PSAwKSB7CkBAIC04NjksNyArOTg5LDE0IEBACiAKICAgICAvLyBTZXQgdGhlIGFjdHVhbCB2aWRlbyByZWNvcmRpbmcgZnJhbWUgc2l6ZQogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgcGFyYW1zLnNldFByZXZpZXdTaXplKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworCisgICAgLy8gZG9udCBjaGFuZ2UgdGhlIHByZXZpZXcgc2l6ZSBiZWNhdXNlIHRpbWUgbGFwc2UgbWF5IGJlIHVzaW5nIHN0aWxsIGNhbWVyYQorICAgIC8vIGFzIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQgbWF5IGNvcnJlc3BvbmQgdG8gSEQgcmVzb2x1dGlvbiBub3QKKyAgICAvLyBzdXBwb3J0ZWQgYnkgdGhlIHZpZGVvIGNhbWVyYS4KKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgIHBhcmFtcy5zZXRQcmV2aWV3U2l6ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICB9CisKICAgICBwYXJhbXMuc2V0UHJldmlld0ZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKICAgICBTdHJpbmc4IHMgPSBwYXJhbXMuZmxhdHRlbigpOwogICAgIGlmIChPSyAhPSBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKHMpKSB7CkBAIC04ODIsOCArMTAwOSw5IEBACiAgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgc2l6ZQogICAgIGludCBmcmFtZVdpZHRoID0gMCwgZnJhbWVIZWlnaHQgPSAwOwogICAgIG5ld0NhbWVyYVBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmZnJhbWVXaWR0aCwgJmZyYW1lSGVpZ2h0KTsKLSAgICBpZiAoZnJhbWVXaWR0aCAgPCAwIHx8IGZyYW1lV2lkdGggICE9IG1WaWRlb1dpZHRoIHx8Ci0gICAgICAgIGZyYW1lSGVpZ2h0IDwgMCB8fCBmcmFtZUhlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKKyAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmCisgICAgICAgIChmcmFtZVdpZHRoICA8IDAgfHwgZnJhbWVXaWR0aCAgIT0gbVZpZGVvV2lkdGggfHwKKyAgICAgICAgZnJhbWVIZWlnaHQgPCAwIHx8IGZyYW1lSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgdmlkZW8gZnJhbWUgc2l6ZSB0byAlZHglZCIsCiAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwpAQCAtOTIxLDE3ICsxMDQ5LDI3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcihzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSkgewotICAgIHNvdXJjZS0+Y2xlYXIoKTsKLQotICAgIHN0YXR1c190IGVyciA9IHNldHVwQ2FtZXJhU291cmNlKCk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZShzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYSgpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKLSAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKLSAgICBDSEVDSyhjYW1lcmFTb3VyY2UgIT0gTlVMTCk7CisgICAgKmNhbWVyYVNvdXJjZSA9IChtQ2FwdHVyZVRpbWVMYXBzZSkgPworICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEobUNhbWVyYSwKKyAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwgbUZyYW1lUmF0ZSk6CisgICAgICAgIENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBDSEVDSygqY2FtZXJhU291cmNlICE9IE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKKyAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCisgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7CisgICAgc291cmNlLT5jbGVhcigpOwogCiAgICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpZGVvQml0UmF0ZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB2aWRlb0JpdFJhdGUpOwogICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUZyYW1lUmF0ZSk7CiAKICAgICBzd2l0Y2ggKG1WaWRlb0VuY29kZXIpIHsKQEAgLTk3NSwxNCArMTExMywyNCBAQAogICAgIH0KICAgICBpZiAobVZpZGVvRW5jb2RlckxldmVsICE9IC0xKSB7CiAgICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgbVZpZGVvRW5jb2RlckxldmVsKTsKKyAgICB9IGVsc2UgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSB1c2luZyBoaWdoIHJlc29sdXRpb24gYW5kL29yIGhpZ2ggYml0cmF0ZSBhbmQKKyAgICAgICAgLy8gc2V0IGFwcHJvcHJpYXRlIGxldmVsIGZvciB0aGUgc29mdHdhcmUgQVZDRW5jb2Rlci4KKyAgICAgICAgaWYgKCh3aWR0aCAqIGhlaWdodCA+PSA5MjE2MDApIC8vIDcyMHAKKyAgICAgICAgICAgICAgICB8fCAodmlkZW9CaXRSYXRlID49IDIwMDAwMDAwKSkgeworICAgICAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCA1MCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwogICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKIAorICAgIC8vIFVzZSBzb2Z0d2FyZSBjb2RlYyBmb3IgdGltZSBsYXBzZQorICAgIHVpbnQzMl90IGVuY29kZXJfZmxhZ3MgPSAobUNhcHR1cmVUaW1lTGFwc2UpID8gT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyA6IDA7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAogICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLCBlbmNfbWV0YSwKLSAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlKTsKKyAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlLAorICAgICAgICAgICAgTlVMTCwgZW5jb2Rlcl9mbGFncyk7CiAgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC0xMDEzLDUxICsxMTYxLDEzOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKLSAgICBpbnQzMl90IHRvdGFsQml0UmF0ZSA9IDA7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0UmVjb3JkaW5nKAorICAgICAgICBib29sIHVzZVNwbGl0Q2FtZXJhU291cmNlLAorICAgICAgICBpbnQgb3V0cHV0RmQsCisgICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKKyAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCisgICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcikgeworICAgIG1lZGlhV3JpdGVyLT5jbGVhcigpOworICAgICp0b3RhbEJpdFJhdGUgPSAwOwogICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG1PdXRwdXRGZCkpOworICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZHVwKG91dHB1dEZkKSk7CiAKICAgICAvLyBBZGQgYXVkaW8gc291cmNlIGZpcnN0IGlmIGl0IGV4aXN0cwotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkpIHsKICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICAgICAgdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CisgICAgICAgICp0b3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKICAgICB9CiAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfREVGQVVMVAogICAgICAgICAgICAgfHwgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9DQU1FUkEpIHsKKworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhTWVkaWFTb3VyY2U7CisgICAgICAgIGlmICh1c2VTcGxpdENhbWVyYVNvdXJjZSkgeworICAgICAgICAgICAgTE9HVigiVXNpbmcgU3BsaXQgY2FtZXJhIHNvdXJjZSIpOworICAgICAgICAgICAgY2FtZXJhTWVkaWFTb3VyY2UgPSBtQ2FtZXJhU291cmNlU3BsaXR0ZXItPmNyZWF0ZUNsaWVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBjYW1lcmFTb3VyY2U7CisgICAgICAgICAgICBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgmY2FtZXJhU291cmNlKTsKKyAgICAgICAgICAgIGNhbWVyYU1lZGlhU291cmNlID0gY2FtZXJhU291cmNlOworICAgICAgICB9CisgICAgICAgIGlmICgodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCkgfHwgKHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkpIHsKKyAgICAgICAgICAgIC8vIFVzZSBkb3duc2FtcGxpbmcgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlLgorICAgICAgICAgICAgQ0hFQ0sodmlkZW9XaWR0aCA8PSBtVmlkZW9XaWR0aCk7CisgICAgICAgICAgICBDSEVDSyh2aWRlb0hlaWdodCA8PSBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgY2FtZXJhTWVkaWFTb3VyY2UgPQorICAgICAgICAgICAgICAgIG5ldyBWaWRlb1NvdXJjZURvd25TYW1wbGVyKGNhbWVyYU1lZGlhU291cmNlLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcigmZW5jb2Rlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKGNhbWVyYU1lZGlhU291cmNlLCB2aWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOwotICAgICAgICB0b3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKKyAgICAgICAgKnRvdGFsQml0UmF0ZSArPSB2aWRlb0JpdFJhdGU7CiAgICAgfQogCiAgICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KICAgICAgICAgICAgIHNldEludGVybGVhdmVEdXJhdGlvbihtSW50ZXJsZWF2ZUR1cmF0aW9uVXMpOwogICAgIH0KLQogICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uVXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtTWF4RmlsZUR1cmF0aW9uVXMpOwogICAgIH0KICAgICBpZiAobU1heEZpbGVTaXplQnl0ZXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN5c3RlbVRpbWUoKSAvIDEwMDApOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisKKyAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCisgICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSkgeworICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdG90YWxCaXRSYXRlKTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCBtVXNlNjRCaXRGaWxlT2Zmc2V0KTsKICAgICBpZiAobU1vdmllVGltZVNjYWxlID4gMCkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOworICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOwogICAgIH0KICAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOwogICAgIH0KLSAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgbVdyaXRlciA9IHdyaXRlcjsKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQobWV0YS5nZXQoKSk7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgTE9HVigiQ3JlYXRpbmcgTWVkaWFTb3VyY2VTcGxpdHRlciIpOworICAgICAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBDYW1lcmFTb3VyY2UoJmNhbWVyYVNvdXJjZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYVNvdXJjZVNwbGl0dGVyID0gbmV3IE1lZGlhU291cmNlU3BsaXR0ZXIoY2FtZXJhU291cmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FtZXJhU291cmNlU3BsaXR0ZXIgPSBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgdG90YWxCaXRSYXRlOworICAgIHN0YXR1c190IGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcobUNhcHR1cmVBdXhWaWRlbywKKyAgICAgICAgICAgIG1PdXRwdXRGZCwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgIG1WaWRlb0JpdFJhdGUsICZ0b3RhbEJpdFJhdGUsICZtV3JpdGVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc2V0dXBNUEVHNE1ldGFEYXRhKHN0YXJ0VGltZVVzLCB0b3RhbEJpdFJhdGUsICZtZXRhKTsKKworICAgIGVyciA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAobUNhcHR1cmVBdXhWaWRlbykgeworICAgICAgICBDSEVDSyhtT3V0cHV0RmRBdXggPj0gMCk7CisgICAgICAgIGlmIChtV3JpdGVyQXV4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIkF1eGlsaWFyeSBGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdG90YWxCaXRyYXRlQXV4OworICAgICAgICBlcnIgPSBzZXR1cE1QRUc0UmVjb3JkaW5nKG1DYXB0dXJlQXV4VmlkZW8sCisgICAgICAgICAgICAgICAgbU91dHB1dEZkQXV4LCBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1BdXhWaWRlb0JpdFJhdGUsICZ0b3RhbEJpdHJhdGVBdXgsICZtV3JpdGVyQXV4KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhQXV4ID0gbmV3IE1ldGFEYXRhOworICAgICAgICBzZXR1cE1QRUc0TWV0YURhdGEoc3RhcnRUaW1lVXMsIHRvdGFsQml0cmF0ZUF1eCwgJm1ldGFBdXgpOworCisgICAgICAgIHJldHVybiBtV3JpdGVyQXV4LT5zdGFydChtZXRhQXV4LmdldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgewpAQCAtMTA2NiwxMiArMTMwMiwyOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAgICAgbVdyaXRlci0+cGF1c2UoKTsKKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmIChtV3JpdGVyQXV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1Xcml0ZXJBdXgtPnBhdXNlKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdG9wKCkgewogICAgIExPR1YoInN0b3AiKTsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmIChtQ2FwdHVyZUF1eFZpZGVvKSB7CisgICAgICAgIGlmIChtV3JpdGVyQXV4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Xcml0ZXJBdXgtPnN0b3AoKTsKKyAgICAgICAgICAgIG1Xcml0ZXJBdXguY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgZXJyID0gbVdyaXRlci0+c3RvcCgpOwogICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CkBAIC0xMDk1LDYgKzEzNDcsMTMgQEAKICAgICAgICAgbU91dHB1dEZkID0gLTE7CiAgICAgfQogCisgICAgaWYgKG1DYXB0dXJlQXV4VmlkZW8pIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGZEF1eCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZEF1eCk7CisgICAgICAgICAgICBtT3V0cHV0RmRBdXggPSAtMTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTExMTksOCArMTM3OCwxMSBAQAogICAgIG1WaWRlb0VuY29kZXIgID0gVklERU9fRU5DT0RFUl9IMjYzOwogICAgIG1WaWRlb1dpZHRoICAgID0gMTc2OwogICAgIG1WaWRlb0hlaWdodCAgID0gMTQ0OworICAgIG1BdXhWaWRlb1dpZHRoICAgID0gMTc2OworICAgIG1BdXhWaWRlb0hlaWdodCAgID0gMTQ0OwogICAgIG1GcmFtZVJhdGUgICAgID0gMjA7CiAgICAgbVZpZGVvQml0UmF0ZSAgPSAxOTIwMDA7CisgICAgbUF1eFZpZGVvQml0UmF0ZSA9IDE5MjAwMDsKICAgICBtU2FtcGxlUmF0ZSAgICA9IDgwMDA7CiAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAxOwogICAgIG1BdWRpb0JpdFJhdGUgID0gMTIyMDA7CkBAIC0xMTM3LDkgKzEzOTksMTQgQEAKICAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOwogICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKICAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKKyAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IGZhbHNlOworICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzID0gLTE7CisgICAgbUNhcHR1cmVBdXhWaWRlbyA9IGZhbHNlOworICAgIG1DYW1lcmFTb3VyY2VTcGxpdHRlciA9IE5VTEw7CiAgICAgbUVuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKKyAgICBtT3V0cHV0RmRBdXggPSAtMTsKICAgICBtRmxhZ3MgPSAwOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTE3Nyw2ICsxNDQ0LDggQEAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBSZWNvcmRlcjogJXBcbiIsIHRoaXMpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIE91dHB1dCBmaWxlIChmZCAlZCk6XG4iLCBtT3V0cHV0RmQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBPdXRwdXQgZmlsZSBBdXhpbGlhcnkgKGZkICVkKTpcbiIsIG1PdXRwdXRGZEF1eCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBmb3JtYXQ6ICVkXG4iLCBtT3V0cHV0Rm9ybWF0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBzaXplIChieXRlcyk6ICVsbGRcbiIsIG1NYXhGaWxlU2l6ZUJ5dGVzKTsKQEAgLTEyMjEsMTAgKzE0OTAsMTQgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGcmFtZSBzaXplIChwaXhlbHMpOiAlZHglZFxuIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQXV4IEZyYW1lIHNpemUgKHBpeGVscyk6ICVkeCVkXG4iLCBtQXV4VmlkZW9XaWR0aCwgbUF1eFZpZGVvSGVpZ2h0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGcmFtZSByYXRlIChmcHMpOiAlZFxuIiwgbUZyYW1lUmF0ZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtVmlkZW9CaXRSYXRlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBBdXggQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtQXV4VmlkZW9CaXRSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCAyMTZmNmJjLi5mMWRjOWU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTI0LDggKzI0LDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIENhbWVyYTsKK2NsYXNzIENhbWVyYVNvdXJjZTsKK2NsYXNzIE1lZGlhU291cmNlU3BsaXR0ZXI7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBzdHJ1Y3QgTWVkaWFXcml0ZXI7CitjbGFzcyBNZXRhRGF0YTsKIHN0cnVjdCBBdWRpb1NvdXJjZTsKIGNsYXNzIE1lZGlhUHJvZmlsZXM7CiAKQEAgLTQyLDkgKzQ1LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZUF1eGlsaWFyeShpbnQgZmQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7CkBAIC02Myw5ICs2Nyw5IEBACiAgICAgfTsKIAogICAgIHNwPENhbWVyYT4gbUNhbWVyYTsKLSAgICBzcDxJU3VyZmFjZT4gbVByZXZpZXdTdXJmYWNlOworICAgIHNwPFN1cmZhY2U+IG1QcmV2aWV3U3VyZmFjZTsKICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwotICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOworICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyLCBtV3JpdGVyQXV4OwogICAgIHNwPEF1ZGlvU291cmNlPiBtQXVkaW9Tb3VyY2VOb2RlOwogCiAgICAgYXVkaW9fc291cmNlIG1BdWRpb1NvdXJjZTsKQEAgLTc1LDggKzc5LDkgQEAKICAgICB2aWRlb19lbmNvZGVyIG1WaWRlb0VuY29kZXI7CiAgICAgYm9vbCBtVXNlNjRCaXRGaWxlT2Zmc2V0OwogICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKKyAgICBpbnQzMl90IG1BdXhWaWRlb1dpZHRoLCBtQXV4VmlkZW9IZWlnaHQ7CiAgICAgaW50MzJfdCBtRnJhbWVSYXRlOwotICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZTsKKyAgICBpbnQzMl90IG1WaWRlb0JpdFJhdGUsIG1BdXhWaWRlb0JpdFJhdGU7CiAgICAgaW50MzJfdCBtQXVkaW9CaXRSYXRlOwogICAgIGludDMyX3QgbUF1ZGlvQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKQEAgLTkyLDIwICs5NywzOCBAQAogICAgIGludDY0X3QgbU1heEZpbGVEdXJhdGlvblVzOwogICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAorICAgIGJvb2wgbUNhcHR1cmVUaW1lTGFwc2U7CisgICAgaW50NjRfdCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVczsKKyAgICBib29sIG1DYXB0dXJlQXV4VmlkZW87CisgICAgc3A8TWVkaWFTb3VyY2VTcGxpdHRlcj4gbUNhbWVyYVNvdXJjZVNwbGl0dGVyOworCiAgICAgU3RyaW5nOCBtUGFyYW1zOwotICAgIGludCBtT3V0cHV0RmQ7CisgICAgaW50IG1PdXRwdXRGZCwgbU91dHB1dEZkQXV4OwogICAgIGludDMyX3QgbUZsYWdzOwogCiAgICAgTWVkaWFQcm9maWxlcyAqbUVuY29kZXJQcm9maWxlczsKIAorICAgIHN0YXR1c190IHNldHVwTVBFRzRSZWNvcmRpbmcoCisgICAgICAgIGJvb2wgdXNlU3BsaXRDYW1lcmFTb3VyY2UsCisgICAgICAgIGludCBvdXRwdXRGZCwKKyAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAorICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKTsKKyAgICB2b2lkIHNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKKyAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzdGFydEFBQ1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7Ci0gICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2UoKTsKKyAgICBzdGF0dXNfdCBzZXR1cENhbWVyYSgpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOwotICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCisgICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKIAogICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CkBAIC0xMTMsNiArMTM2LDExIEBACiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHMoaW50MzJfdCBjaGFubmxlcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvSGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1eFZpZGVvV2lkdGgoaW50MzJfdCB3aWR0aCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdXhWaWRlb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcyk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0VuY29kZXJQcm9maWxlKGludDMyX3QgcHJvZmlsZSk7CkBAIC0xMzcsNCArMTY1LDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUkVDT1JERVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAppbmRleCA2ZTZjM2NkLi41ZWFmNTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaApAQCAtNzUsNyArNzUsMTAgQEAKIAogCiAgICAgLy8gQWxsIHRoZSBtZXRob2RzIGJlbG93IHdyYXAgdGhlIG1QbGF5ZXIgaW5zdGFuY2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SVN1cmZhY2U+JiBzKSAgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9JU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU3VyZmFjZT4mIHMpICB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb0lTdXJmYWNlKHMpOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTdXJmYWNlPiYgcykgIHsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZShzKTsKICAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCkge3JldHVybiBtUGxheWVyLT5wcmVwYXJlKCk7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggODZmYTY2OC4uMGQxMWIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw4IEBACiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCisgICAgICAgIFZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMyw2ICsyNSw3IEBACiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhU291cmNlU3BsaXR0ZXIuY3BwICAgICAgICAgICBcCiAgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51Q2FjaGVkU291cmNlMi5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51SFRUUERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICBcCkBAIC01OCw2ICs2MSw3IEBACiAgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKICAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF95dXYgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAppbmRleCA4NTA3YWZjLi5mZDVmMzBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KIAotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CisjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAKQEAgLTEwMCwxMyArMTAwLDE0IEBACiAgICAgICAgICAgICBib29sIHByZXZpZXdPbmx5LAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwKICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICAgICAgc2l6ZV90IGRpc3BsYXlXaWR0aCwgc2l6ZV90IGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICAgICAgOiBtVGFyZ2V0KE5VTEwpLAogICAgICAgICAgIG1MaWJIYW5kbGUoTlVMTCkgewogICAgICAgICAgICAgaW5pdChwcmV2aWV3T25seSwgY29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIHN1cmZhY2UsIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsIGlzdXJmYWNlLCBzdXJmYWNlLCBkaXNwbGF5V2lkdGgsCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CiAgICAgfQogCkBAIC0xMzgsNyArMTM5LDggQEAKICAgICAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJmlzdXJmYWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgICAgIHNpemVfdCBkZWNvZGVkV2lkdGgsIHNpemVfdCBkZWNvZGVkSGVpZ2h0KTsKIApAQCAtMTUwLDcgKzE1Miw4IEBACiAgICAgICAgIGJvb2wgcHJldmlld09ubHksCiAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0LAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UsCisgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBzaXplX3QgZGlzcGxheVdpZHRoLCBzaXplX3QgZGlzcGxheUhlaWdodCwKICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpIHsKICAgICBpZiAoIXByZXZpZXdPbmx5KSB7CkBAIC0xNzYsNyArMTc5LDcgQEAKIAogICAgICAgICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgICAgICAgICBtVGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShzdXJmYWNlLCBjb21wb25lbnROYW1lLCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgKCpmdW5jKShpc3VyZmFjZSwgY29tcG9uZW50TmFtZSwgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICAgICAgfQpAQCAtNjk0LDggKzY5NywxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBd2Vzb21lUGxheWVyOjpub3RpZnlWaWRlb1NpemVfbCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpbnQzMl90IGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodDsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmZGVjb2RlZFdpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZkZWNvZGVkSGVpZ2h0KSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OmluaXRSZW5kZXJlcl9sKCkgewotICAgIGlmIChtSVN1cmZhY2UgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMIHx8IG1JU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpbnQzMl90IGZvcm1hdDsKQEAgLTcxMiw3ICs3MjUsMTggQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCi0gICAgICAgIGlmICghc3RybmNtcCgiT01YLiIsIGNvbXBvbmVudCwgNCkpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIE90aGVyIGRlY29kZXJzIGFyZSBpbnN0YW50aWF0ZWQgbG9jYWxseSBhbmQgYXMgYSBjb25zZXF1ZW5jZQorICAgICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLgorICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIoCisgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBwcmV2aWV3T25seQorICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZm9ybWF0LAorICAgICAgICAgICAgICAgIG1JU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtU3VyZmFjZSwKKyAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAorICAgICAgICAgICAgICAgIGRlY29kZWRXaWR0aCwgZGVjb2RlZEhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdXIgT01YIGNvZGVjcyBhbGxvY2F0ZSBidWZmZXJzIG9uIHRoZSBtZWRpYV9zZXJ2ZXIgc2lkZQogICAgICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZXkgcmVxdWlyZSBhIHJlbW90ZSBJT01YUmVuZGVyZXIgdGhhdCBrbm93cyBob3cKICAgICAgICAgICAgIC8vIHRvIGRpc3BsYXkgdGhlbS4KQEAgLTcyMiwxNiArNzQ2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSlmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBkZWNvZGVycyBhcmUgaW5zdGFudGlhdGVkIGxvY2FsbHkgYW5kIGFzIGEgY29uc2VxdWVuY2UKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4KLSAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gcHJldmlld09ubHkKLSAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWZvcm1hdCwKLSAgICAgICAgICAgICAgICBtSVN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBkZWNvZGVkV2lkdGgsIGRlY29kZWRIZWlnaHQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNzcwLDYgKzc4NCwxMiBAQAogICAgIG1JU3VyZmFjZSA9IGlzdXJmYWNlOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVN1cmZhY2UgPSBzdXJmYWNlOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNldEF1ZGlvU2luaygKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMTAyMyw2ICsxMDQzLDggQEAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVigiVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UuIik7CiAKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRSZW5kZXJlcl9sKCk7CkBAIC0xNTE0LDEwICsxNTM2LDEwIEBACiAKIHZvaWQgQXdlc29tZVBsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7CiAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKKyAgICAgICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICAgICAgfQogCiAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwpAQCAtMTYzMCwxMyArMTY1MiwxNCBAQAogCiAgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKIAotICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIG1JU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgaWYgKHN0YXRlLT5tTGFzdFZpZGVvRnJhbWUgJiYgKG1TdXJmYWNlICE9IE5VTEwgfHwgbUlTdXJmYWNlICE9IE5VTEwpKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KICAgICAgICAgICAgIG5ldyBBd2Vzb21lTG9jYWxSZW5kZXJlcigKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIHByZXZpZXdPbmx5CiAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3RhdGUtPm1Db2xvckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgbUlTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1WaWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bURlY29kZWRXaWR0aCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCmluZGV4IDNlMzFkNjEuLjljY2QxNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcApAQCAtNjUsNiArNjUsMTEgQEAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIpIHsKICAgICBMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhVGltZXN0YW1wKApAQCAtMTE4LDE1ICsxMjMsMTUgQEAKIAogQ2FtZXJhU291cmNlOjpDYW1lcmFTb3VyY2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKQogICAgIDogbUNhbWVyYShjYW1lcmEpLAotICAgICAgbUZpcnN0RnJhbWVUaW1lVXMoMCksCi0gICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCiAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQoMCksCisgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNFbmNvZGVkKDApLAogICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMCksCiAgICAgICBtTnVtR2xpdGNoZXMoMCksCiAgICAgICBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcygyMDAwMDApLAotICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbUNvbGxlY3RTdGF0cyhmYWxzZSkgewogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOwpAQCAtMTYxLDcgKzE2Niw2IEBACiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7CiAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOwotCiB9CiAKIENhbWVyYVNvdXJjZTo6fkNhbWVyYVNvdXJjZSgpIHsKQEAgLTE3MCw2ICsxNzQsMTAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7Cit9CisKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCkBAIC0xODcsMTMgKzE5NSwxNyBAQAogCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKLSAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKSk7CisgICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdG9wKCkgewogICAgIExPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMjAyLDcgKzIxNCw3IEBACiAKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgc3RvcENhbWVyYVJlY29yZGluZygpOwogICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKICAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgewogICAgICAgICBMT0dJKCJXYWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJWQiLApAQCAtMjIyLDExICsyMzQsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKK30KKwogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VRdWV1ZWRGcmFtZXMoKSB7CiAgICAgTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdDsKICAgICB3aGlsZSAoIW1GcmFtZXNSZWNlaXZlZC5lbXB0eSgpKSB7CiAgICAgICAgIGl0ID0gbUZyYW1lc1JlY2VpdmVkLmJlZ2luKCk7Ci0gICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZSgqaXQpOworICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKml0KTsKICAgICAgICAgbUZyYW1lc1JlY2VpdmVkLmVyYXNlKGl0KTsKICAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKICAgICB9CkBAIC0yMzgsNyArMjU0LDcgQEAKIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiB9CiAKQEAgLTI0OCw3ICsyNjQsNiBAQAogICAgIGZvciAoTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdCA9IG1GcmFtZXNCZWluZ0VuY29kZWQuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1GcmFtZXNCZWluZ0VuY29kZWQuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKCgqaXQpLT5wb2ludGVyKCkgPT0gIGJ1ZmZlci0+ZGF0YSgpKSB7Ci0KICAgICAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZSgoKml0KSk7CiAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLmVyYXNlKGl0KTsKICAgICAgICAgICAgICsrbU51bUZyYW1lc0VuY29kZWQ7CkBAIC0zNDAsNiArMzU1LDEzIEBACiAgICAgICAgICsrbU51bUdsaXRjaGVzOwogICAgIH0KIAorICAgIC8vIE1heSBuZWVkIHRvIHNraXAgZnJhbWUgb3IgbW9kaWZ5IHRpbWVzdGFtcC4gQ3VycmVudGx5IGltcGxlbWVudGVkCisgICAgLy8gYnkgdGhlIHN1YmNsYXNzIENhbWVyYVNvdXJjZVRpbWVMYXBzZS4KKyAgICBpZihza2lwQ3VycmVudEZyYW1lKHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDApIHsKICAgICAgICAgbUZpcnN0RnJhbWVUaW1lVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTVhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UiCisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK0NhbWVyYVNvdXJjZVRpbWVMYXBzZSAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGUoCisgICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgdmlkZW9GcmFtZVJhdGUpIHsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdCgwKTsKKworICAgIGlmIChjYW1lcmEuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZVRpbWVMYXBzZShjYW1lcmEsIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSk7Cit9CisKKy8vIHN0YXRpYworQ2FtZXJhU291cmNlVGltZUxhcHNlICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKSB7CisgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgQ2FtZXJhU291cmNlVGltZUxhcHNlKGNhbWVyYSwgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHZpZGVvRnJhbWVSYXRlKTsKK30KKworQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhLAorICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlKQorICAgIDogQ2FtZXJhU291cmNlKGNhbWVyYSksCisgICAgICBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyh0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKSwKKyAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXMoMUU2L3ZpZGVvRnJhbWVSYXRlKSwKKyAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMoMCksCisgICAgICBtU2tpcEN1cnJlbnRGcmFtZShmYWxzZSkgeworCisgICAgTE9HVigic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlIik7CisgICAgbVZpZGVvV2lkdGggPSB3aWR0aDsKKyAgICBtVmlkZW9IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBpZiAodHJ5U2V0dGluZ1ByZXZpZXdTaXplKHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IEFkZCBhIGNoZWNrIHRvIHNlZSB0aGF0IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIGlzIGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgZmFzdGVzdCByYXRlIGF0IHdoaWNoIHRoZSBzdGlsbCBjYW1lcmEgY2FuIHRha2UgcGljdHVyZXMuCisgICAgICAgIG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSA9IHRydWU7CisgICAgICAgIENIRUNLKHNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgbU5lZWRDcm9wcGluZyA9IGNvbXB1dGVDcm9wUmVjdGFuZ2xlT2Zmc2V0KCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfQorfQorCitDYW1lcmFTb3VyY2VUaW1lTGFwc2U6On5DYW1lcmFTb3VyY2VUaW1lTGFwc2UoKSB7Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0cnlTZXR0aW5nUHJldmlld1NpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBTdHJpbmc4IHMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkU2l6ZXM7CisgICAgcGFyYW1zLmdldFN1cHBvcnRlZFByZXZpZXdTaXplcyhzdXBwb3J0ZWRTaXplcyk7CisKKyAgICBib29sIHByZXZpZXdTaXplU3VwcG9ydGVkID0gZmFsc2U7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgcGljdHVyZVdpZHRoID0gc3VwcG9ydGVkU2l6ZXNbaV0ud2lkdGg7CisgICAgICAgIGludDMyX3QgcGljdHVyZUhlaWdodCA9IHN1cHBvcnRlZFNpemVzW2ldLmhlaWdodDsKKworICAgICAgICBpZiAoKHBpY3R1cmVXaWR0aCA9PSB3aWR0aCkgJiYgKHBpY3R1cmVIZWlnaHQgPT0gaGVpZ2h0KSkgeworICAgICAgICAgICAgcHJldmlld1NpemVTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXZpZXdTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIExPR1YoIlZpZGVvIHNpemUgKCVkLCAlZCkgaXMgYSBzdXBwb3J0ZWQgcHJldmlldyBzaXplIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHBhcmFtcy5zZXRQcmV2aWV3U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgQ0hFQ0sobUNhbWVyYS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNldFBpY3R1cmVTaXplVG9DbG9zZXN0U3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocyk7CisgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFNpemVzOworICAgIHBhcmFtcy5nZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMoc3VwcG9ydGVkU2l6ZXMpOworCisgICAgaW50MzJfdCBtaW5QaWN0dXJlU2l6ZSA9IElOVF9NQVg7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgcGljdHVyZVdpZHRoID0gc3VwcG9ydGVkU2l6ZXNbaV0ud2lkdGg7CisgICAgICAgIGludDMyX3QgcGljdHVyZUhlaWdodCA9IHN1cHBvcnRlZFNpemVzW2ldLmhlaWdodDsKKworICAgICAgICBpZiAoKHBpY3R1cmVXaWR0aCA+PSB3aWR0aCkgJiYgKHBpY3R1cmVIZWlnaHQgPj0gaGVpZ2h0KSkgeworICAgICAgICAgICAgaW50MzJfdCBwaWN0dXJlU2l6ZSA9IHBpY3R1cmVXaWR0aCpwaWN0dXJlSGVpZ2h0OworICAgICAgICAgICAgaWYgKHBpY3R1cmVTaXplIDwgbWluUGljdHVyZVNpemUpIHsKKyAgICAgICAgICAgICAgICBtaW5QaWN0dXJlU2l6ZSA9IHBpY3R1cmVTaXplOworICAgICAgICAgICAgICAgIG1QaWN0dXJlV2lkdGggPSBwaWN0dXJlV2lkdGg7CisgICAgICAgICAgICAgICAgbVBpY3R1cmVIZWlnaHQgPSBwaWN0dXJlSGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR1YoIlBpY3R1cmUgc2l6ZSA9ICglZCwgJWQpIiwgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQpOworICAgIHJldHVybiAobWluUGljdHVyZVNpemUgIT0gSU5UX01BWCk7Cit9CisKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpjb21wdXRlQ3JvcFJlY3RhbmdsZU9mZnNldCgpIHsKKyAgICBpZiAoKG1QaWN0dXJlV2lkdGggPT0gbVZpZGVvV2lkdGgpICYmIChtUGljdHVyZUhlaWdodCA9PSBtVmlkZW9IZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDSygobVBpY3R1cmVXaWR0aCA+IG1WaWRlb1dpZHRoKSAmJiAobVBpY3R1cmVIZWlnaHQgPiBtVmlkZW9IZWlnaHQpKTsKKworICAgIGludDMyX3Qgd2lkdGhEaWZmZXJlbmNlID0gbVBpY3R1cmVXaWR0aCAtIG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgaGVpZ2h0RGlmZmVyZW5jZSA9IG1QaWN0dXJlSGVpZ2h0IC0gbVZpZGVvSGVpZ2h0OworCisgICAgbUNyb3BSZWN0U3RhcnRYID0gd2lkdGhEaWZmZXJlbmNlLzI7CisgICAgbUNyb3BSZWN0U3RhcnRZID0gaGVpZ2h0RGlmZmVyZW5jZS8yOworCisgICAgTE9HVigic2V0dGluZyBjcm9wIHJlY3RhbmdsZSBvZmZzZXQgdG8gKCVkLCAlZCkiLCBtQ3JvcFJlY3RTdGFydFgsIG1Dcm9wUmVjdFN0YXJ0WSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCit2b2lkICpDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpIHsKKyAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqPihtZSk7CisgICAgc291cmNlLT50aHJlYWRUaW1lTGFwc2VFbnRyeSgpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6dGhyZWFkVGltZUxhcHNlRW50cnkoKSB7CisgICAgd2hpbGUobVN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1DYW1lcmFJZGxlKSB7CisgICAgICAgICAgICBMT0dWKCJ0aHJlYWRUaW1lTGFwc2VFbnRyeTogdGFraW5nIHBpY3R1cmUiKTsKKyAgICAgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT50YWtlUGljdHVyZSgpKTsKKyAgICAgICAgICAgIG1DYW1lcmFJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB1c2xlZXAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigidGhyZWFkVGltZUxhcHNlRW50cnk6IGNhbWVyYSBidXN5IHdpdGggb2xkIHRha2VQaWN0dXJlLiBTbGVlcGluZyBhIGxpdHRsZS4iKTsKKyAgICAgICAgICAgIHVzbGVlcCgxRTQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CisgICAgaWYgKG1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBMT0dWKCJzdGFydCB0aW1lIGxhcHNlIHJlY29yZGluZyB1c2luZyBzdGlsbCBjYW1lcmEiKTsKKworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgU3RyaW5nOCBzID0gbUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhzKTsKKyAgICAgICAgcGFyYW1zLnNldFBpY3R1cmVTaXplKG1QaWN0dXJlV2lkdGgsIG1QaWN0dXJlSGVpZ2h0KTsKKyAgICAgICAgbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpKTsKKyAgICAgICAgbUNhbWVyYUlkbGUgPSB0cnVlOworCisgICAgICAgIC8vIGNyZWF0ZSBhIHRocmVhZCB3aGljaCB0YWtlcyBwaWN0dXJlcyBpbiBhIGxvb3AKKyAgICAgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgICAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZFRpbWVMYXBzZSwgJmF0dHIsIFRocmVhZFRpbWVMYXBzZVdyYXBwZXIsIHRoaXMpOworICAgICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigic3RhcnQgdGltZSBsYXBzZSByZWNvcmRpbmcgdXNpbmcgdmlkZW8gY2FtZXJhIik7CisgICAgICAgIENIRUNLX0VRKE9LLCBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgeworICAgIGlmIChtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgIHB0aHJlYWRfam9pbihtVGhyZWFkVGltZUxhcHNlLCAmZHVtbXkpOworICAgICAgICBDSEVDS19FUShPSywgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIGZyYW1lKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKKyAgICB9Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JlYXRlSU1lbW9yeUNvcHkoY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZV9kYXRhKSB7CisgICAgc2l6ZV90IHNvdXJjZV9zaXplID0gc291cmNlX2RhdGEtPnNpemUoKTsKKyAgICB2b2lkKiBzb3VyY2VfcG9pbnRlciA9IHNvdXJjZV9kYXRhLT5wb2ludGVyKCk7CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbmV3TWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzb3VyY2Vfc2l6ZSk7CisgICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc291cmNlX3NpemUpOworICAgIG1lbWNweShuZXdNZW1vcnktPnBvaW50ZXIoKSwgc291cmNlX3BvaW50ZXIsIHNvdXJjZV9zaXplKTsKKyAgICByZXR1cm4gbmV3TWVtb3J5OworfQorCisvLyBBbGxvY2F0ZXMgSU1lbW9yeSBvZiBmaW5hbCB0eXBlIE1lbW9yeUJhc2Ugd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4KK3NwPElNZW1vcnk+IGFsbG9jYXRlSU1lbW9yeShzaXplX3Qgc2l6ZSkgeworICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBuZXdNZW1vcnlIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUpOworICAgIHNwPE1lbW9yeUJhc2U+IG5ld01lbW9yeSA9IG5ldyBNZW1vcnlCYXNlKG5ld01lbW9yeUhlYXAsIDAsIHNpemUpOworICAgIHJldHVybiBuZXdNZW1vcnk7Cit9CisKKy8vIHN0YXRpYwordm9pZCAqQ2FtZXJhU291cmNlVGltZUxhcHNlOjpUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyKHZvaWQgKm1lKSB7CisgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxDYW1lcmFTb3VyY2VUaW1lTGFwc2UgKj4obWUpOworICAgIHNvdXJjZS0+dGhyZWFkU3RhcnRQcmV2aWV3KCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjp0aHJlYWRTdGFydFByZXZpZXcoKSB7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UHJldmlldygpKTsKKyAgICBtQ2FtZXJhSWRsZSA9IHRydWU7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpyZXN0YXJ0UHJldmlldygpIHsKKyAgICAvLyBTdGFydCB0aGlzIGluIGEgZGlmZmVyZW50IHRocmVhZCwgc28gdGhhdCB0aGUgZGF0YUNhbGxiYWNrIGNhbiByZXR1cm4KKyAgICBMT0dWKCJyZXN0YXJ0UHJldmlldyIpOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworCisgICAgcHRocmVhZF90IHRocmVhZFByZXZpZXc7CisgICAgcHRocmVhZF9jcmVhdGUoJnRocmVhZFByZXZpZXcsICZhdHRyLCBUaHJlYWRTdGFydFByZXZpZXdXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisKK3NwPElNZW1vcnk+IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6Y3JvcFlVVkltYWdlKGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSkgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lbW9yeSBmb3IgY3JvcHBlZCBpbWFnZSBhbmQgc2V0dXAgYSBjYW52YXMgdXNpbmcgaXQuCisgICAgc3A8SU1lbW9yeT4gY3JvcHBlZEltYWdlTWVtb3J5ID0gYWxsb2NhdGVJTWVtb3J5KAorICAgICAgICAgICAgWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KSk7CisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VDcm9wcGVkKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKWNyb3BwZWRJbWFnZU1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICBZVVZDYW52YXMgeXV2Q2FudmFzQ3JvcCh5dXZJbWFnZUNyb3BwZWQpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVBpY3R1cmVXaWR0aCwgbVBpY3R1cmVIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZV9kYXRhLT5wb2ludGVyKCkpOworICAgIHl1dkNhbnZhc0Nyb3AuQ29weUltYWdlUmVjdCgKKyAgICAgICAgICAgIFJlY3QobUNyb3BSZWN0U3RhcnRYLCBtQ3JvcFJlY3RTdGFydFksCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRYICsgbVZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgbUNyb3BSZWN0U3RhcnRZICsgbVZpZGVvSGVpZ2h0KSwKKyAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7CisKKyAgICByZXR1cm4gY3JvcHBlZEltYWdlTWVtb3J5OworfQorCit2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAobXNnVHlwZSA9PSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpIHsKKyAgICAgICAgLy8gdGFrZVBpY3R1cmUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGlzIGNhbGxiYWNrLCBzbyByZXN0YXJ0IHByZXZpZXcuCisgICAgICAgIHJlc3RhcnRQcmV2aWV3KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1zZ1R5cGUgIT0gQ0FNRVJBX01TR19SQVdfSU1BR0UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR1YoImRhdGFDYWxsYmFjayBmb3IgdGltZWxhcHNlIHN0aWxsIGZyYW1lIik7CisgICAgQ0hFQ0tfRVEodHJ1ZSwgbVVzZVN0aWxsQ2FtZXJhRm9yVGltZUxhcHNlKTsKKworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbVN0YXJ0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICB9CisKKyAgICBpZiAobU5lZWRDcm9wcGluZykgeworICAgICAgICBzcDxJTWVtb3J5PiBjcm9wcGVkSW1hZ2VEYXRhID0gY3JvcFlVVkltYWdlKGRhdGEpOworICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wVXMsIG1zZ1R5cGUsIGNyb3BwZWRJbWFnZURhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPElNZW1vcnk+IGRhdGFDb3B5ID0gY3JlYXRlSU1lbW9yeUNvcHkoZGF0YSk7CisgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YUNvcHkpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNraXBDdXJyZW50RnJhbWUoaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEZyYW1lQW5kTW9kaWZ5VGltZVN0YW1wKGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKCFtVXNlU3RpbGxDYW1lcmFGb3JUaW1lTGFwc2UpIHsKKyAgICAgICAgaWYgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgPT0gMCkgeworICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBsYXBzZSBmcmFtZS4gSW5pdGlhbGl6ZSBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzCisgICAgICAgICAgICAvLyB0byBjdXJyZW50IHRpbWUgKHRpbWVzdGFtcFVzKSBhbmQgc2F2ZSBmcmFtZSBkYXRhLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogaW5pdGlhbCBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICB9IGVsc2UgaWYgKCp0aW1lc3RhbXBVcyA8CisgICAgICAgICAgICAgICAgKG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgKyBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIC8vIFNraXAgYWxsIGZyYW1lcyBmcm9tIGxhc3QgZW5jb2RlZCBmcmFtZSB1bnRpbAorICAgICAgICAgICAgLy8gc3VmZmljaWVudCB0aW1lIChtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIC8vIFRlbGwgdGhlIGNhbWVyYSB0byByZWxlYXNlIGl0cyByZWNvcmRpbmcgZnJhbWUgYW5kIHJldHVybi4KKyAgICAgICAgICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCB0aW1lbGFwc2U6IHNraXBwaW5nIGludGVybWVkaWF0ZSBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEZXNpcmVkIGZyYW1lIGhhcyBhcnJpdmVkIGFmdGVyIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHRpbWU6CisgICAgICAgICAgICAvLyAtIFJlc2V0IG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMgdG8gY3VycmVudCB0aW1lLgorICAgICAgICAgICAgLy8gLSBBcnRpZmljaWFsbHkgbW9kaWZ5IHRpbWVzdGFtcFVzIHRvIGJlIG9uZSBmcmFtZSB0aW1lICgxL2ZyYW1lcmF0ZSkgYWhlYWQKKyAgICAgICAgICAgIC8vIG9mIHRoZSBsYXN0IGVuY29kZWQgZnJhbWUncyB0aW1lIHN0YW1wLgorICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZ290IHRpbWVsYXBzZSBmcmFtZSIpOworCisgICAgICAgICAgICBtTGFzdFRpbWVMYXBzZUZyYW1lUmVhbFRpbWVzdGFtcFVzID0gKnRpbWVzdGFtcFVzOworICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzICsgbVRpbWVCZXR3ZWVuVGltZUxhcHNlVmlkZW9GcmFtZXNVczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKKyAgICBpZiAoIW1Vc2VTdGlsbENhbWVyYUZvclRpbWVMYXBzZSkgeworICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgmdGltZXN0YW1wVXMpOworICAgIH0KKyAgICBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgbXNnVHlwZSwgZGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzcwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZVNwbGl0dGVyLmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTb3VyY2VTcGxpdHRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlU3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhU291cmNlU3BsaXR0ZXI6Ok1lZGlhU291cmNlU3BsaXR0ZXIoc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlKSB7CisgICAgbU51bWJlck9mQ2xpZW50cyA9IDA7CisgICAgbVNvdXJjZSA9IG1lZGlhU291cmNlOworICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCA9IDA7CisgICAgbU51bWJlck9mQ3VycmVudFJlYWRzID0gMDsKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAwOworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IHRydWU7Cit9CisKK01lZGlhU291cmNlU3BsaXR0ZXI6On5NZWRpYVNvdXJjZVNwbGl0dGVyKCkgeworfQorCitzcDxNZWRpYVNvdXJjZT4gTWVkaWFTb3VyY2VTcGxpdHRlcjo6Y3JlYXRlQ2xpZW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBtTnVtYmVyT2ZDbGllbnRzKyspOworICAgIG1DbGllbnRzU3RhcnRlZC5wdXNoKGZhbHNlKTsKKyAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LnB1c2goMCk7CisgICAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c3RhcnQoaW50IGNsaWVudElkLCBNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoInN0YXJ0IGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIGlmIChtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCsrOworCisgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICBMT0dWKCJTdGFydGluZyByZWFsIHNvdXJjZSBmcm9tIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1DbGllbnRzU3RhcnRlZC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudHNTdGFydGVkLmVkaXRJdGVtQXQoY2xpZW50SWQpID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICAgICAgLy8gTGFzdCByZWFkIHdhcyBjb21wbGV0ZWQuIFNvIGpvaW4gaW4gdGhlIHRocmVhZHMgZm9yIHRoZSBuZXh0IHJlYWQuCisgICAgICAgICAgICBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0LmVkaXRJdGVtQXQoY2xpZW50SWQpID0gIW1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIExhc3QgcmVhZCBpcyBvbmdvaW5nLiBTbyBqb2luIGluIHRoZSB0aHJlYWRzIGZvciB0aGUgY3VycmVudCByZWFkLgorICAgICAgICAgICAgbUNsaWVudHNEZXNpcmVkUmVhZEJpdC5lZGl0SXRlbUF0KGNsaWVudElkKSA9IG1DdXJyZW50UmVhZEJpdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpzdG9wKGludCBjbGllbnRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBMT0dWKCJzdG9wIGNsaWVudCAoJWQpIiwgY2xpZW50SWQpOworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKyAgICBDSEVDSyhtQ2xpZW50c1N0YXJ0ZWRbY2xpZW50SWRdKTsKKworICAgIGlmICgtLW1OdW1iZXJPZkNsaWVudHNTdGFydGVkID09IDApIHsKKyAgICAgICAgTE9HVigiU3RvcHBpbmcgcmVhbCBzb3VyY2UgZnJvbSBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50c1N0YXJ0ZWQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtTGFzdFJlYWRDb21wbGV0ZWQgJiYgKG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCkpIHsKKyAgICAgICAgICAgIC8vICFtTGFzdFJlYWRDb21wbGV0ZWQgaW1wbGllcyB0aGF0IGJ1ZmZlciBoYXMgYmVlbiByZWFkIGZyb20gc291cmNlLCBidXQgYWxsCisgICAgICAgICAgICAvLyBjbGllbnRzIGhhdmVuJ3QgcmVhZCBpdC4KKyAgICAgICAgICAgIC8vIG1DbGllbnRzRGVzaXJlZFJlYWRCaXRbY2xpZW50SWRdID09IG1DdXJyZW50UmVhZEJpdCBpbXBsaWVzIHRoYXQgdGhpcworICAgICAgICAgICAgLy8gY2xpZW50IHdvdWxkIGhhdmUgd2FudGVkIHRvIHJlYWQgZnJvbSB0aGlzIGJ1ZmZlci4gKGkuZS4gaXQgaGFzIG5vdCB5ZXQKKyAgICAgICAgICAgIC8vIGNhbGxlZCByZWFkKCkgZm9yIHRoZSBjdXJyZW50IHJlYWQgYnVmZmVyLikKKyAgICAgICAgICAgIC8vIFNpbmNlIG90aGVyIHRocmVhZHMgbWF5IGJlIHdhaXRpbmcgZm9yIGFsbCB0aGUgY2xpZW50cycgcmVhZHMgdG8gY29tcGxldGUsCisgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCB0aGlzIHJlYWQgaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgICAgICAgIHNpZ25hbFJlYWRDb21wbGV0ZV9sb2NrKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpnZXRGb3JtYXQoaW50IGNsaWVudElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIExPR1YoImdldEZvcm1hdCBjbGllbnQgKCVkKSIsIGNsaWVudElkKTsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnJlYWQoaW50IGNsaWVudElkLAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKGNsaWVudElkID49IDAgJiYgY2xpZW50SWQgPCBtTnVtYmVyT2ZDbGllbnRzKTsKKworICAgIExPR1YoInJlYWQgY2xpZW50ICglZCkiLCBjbGllbnRJZCk7CisgICAgKmJ1ZmZlciA9IE5VTEw7CisKKyAgICBpZiAoIW1DbGllbnRzU3RhcnRlZFtjbGllbnRJZF0pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFJlYWRCaXQgIT0gbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF0pIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIG5vdCBiZWVuIHJlYWQgZnJvbSBzb3VyY2UgeWV0LgorCisgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNsaWVudCBpcyB0aGUgc3BlY2lhbCBjbGllbnQgd2l0aCBjbGllbnRJZCA9IDAKKyAgICAgICAgLy8gdGhlbiByZWFkIGZyb20gc291cmNlLCBlbHNlIHdhaXQgdW50aWwgdGhlIGNsaWVudCAwIGhhcyBmaW5pc2hlZAorICAgICAgICAvLyByZWFkaW5nIGZyb20gc291cmNlLgorICAgICAgICBpZiAoY2xpZW50SWQgPT0gMCkgeworICAgICAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGNsaWVudCdzIGxhc3QgcmVhZCB0byBjb21wbGV0ZSBmaXJzdCBzbyBhcyB0byBub3QKKyAgICAgICAgICAgIC8vIGNvcnJ1cHQgdGhlIGJ1ZmZlciBhdCBtTGFzdFJlYWRNZWRpYUJ1ZmZlci4KKyAgICAgICAgICAgIHdhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlX2xvY2sob3B0aW9ucyk7CisgICAgICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhjbGllbnRJZCk7CisKKyAgICAgICAgICAgICpidWZmZXIgPSBtTGFzdFJlYWRNZWRpYUJ1ZmZlcjsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICAgICB9CisgICAgICAgIENIRUNLKG1DdXJyZW50UmVhZEJpdCA9PSBtQ2xpZW50c0Rlc2lyZWRSZWFkQml0W2NsaWVudElkXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGVzaXJlZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZWFkIGZyb20gc291cmNlLiBVc2UgdGhlIGNhY2hlZCBkYXRhLgorICAgICAgICBDSEVDSyhjbGllbnRJZCAhPSAwKTsKKworICAgICAgICAqYnVmZmVyID0gbUxhc3RSZWFkTWVkaWFCdWZmZXI7CisgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgIH0KKworICAgIG1DbGllbnRzRGVzaXJlZFJlYWRCaXQuZWRpdEl0ZW1BdChjbGllbnRJZCkgPSAhbUNsaWVudHNEZXNpcmVkUmVhZEJpdFtjbGllbnRJZF07CisgICAgc2lnbmFsUmVhZENvbXBsZXRlX2xvY2soZmFsc2UpOworCisgICAgcmV0dXJuIG1MYXN0UmVhZFN0YXR1czsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpyZWFkRnJvbVNvdXJjZV9sb2NrKGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIG1MYXN0UmVhZFN0YXR1cyA9IG1Tb3VyY2UtPnJlYWQoJm1MYXN0UmVhZE1lZGlhQnVmZmVyICwgb3B0aW9ucyk7CisKKyAgICBtQ3VycmVudFJlYWRCaXQgPSAhbUN1cnJlbnRSZWFkQml0OworICAgIG1MYXN0UmVhZENvbXBsZXRlZCA9IGZhbHNlOworICAgIG1SZWFkRnJvbVNvdXJjZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZVNwbGl0dGVyOjp3YWl0Rm9yUmVhZEZyb21Tb3VyY2VfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgbVJlYWRGcm9tU291cmNlQ29uZGl0aW9uLndhaXQobUxvY2spOworfQorCit2b2lkIE1lZGlhU291cmNlU3BsaXR0ZXI6OndhaXRGb3JBbGxDbGllbnRzTGFzdFJlYWRfbG9jayhpbnQzMl90IGNsaWVudElkKSB7CisgICAgaWYgKG1MYXN0UmVhZENvbXBsZXRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BbGxSZWFkc0NvbXBsZXRlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIENIRUNLKG1MYXN0UmVhZENvbXBsZXRlZCk7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2VTcGxpdHRlcjo6c2lnbmFsUmVhZENvbXBsZXRlX2xvY2soYm9vbCByZWFkQWJvcnRlZCkgeworICAgIGlmICghcmVhZEFib3J0ZWQpIHsKKyAgICAgICAgbU51bWJlck9mQ3VycmVudFJlYWRzKys7CisgICAgfQorCisgICAgaWYgKG1OdW1iZXJPZkN1cnJlbnRSZWFkcyA9PSBtTnVtYmVyT2ZDbGllbnRzU3RhcnRlZCkgeworICAgICAgICBtTGFzdFJlYWRDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICBtTnVtYmVyT2ZDdXJyZW50UmVhZHMgPSAwOworICAgICAgICBtQWxsUmVhZHNDb21wbGV0ZUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OnBhdXNlKGludCBjbGllbnRJZCkgeworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8gQ2xpZW50CisKK01lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6Q2xpZW50KAorICAgICAgICBzcDxNZWRpYVNvdXJjZVNwbGl0dGVyPiBzcGxpdHRlciwKKyAgICAgICAgaW50MzJfdCBjbGllbnRJZCkgeworICAgIG1TcGxpdHRlciA9IHNwbGl0dGVyOworICAgIG1DbGllbnRJZCA9IGNsaWVudElkOworfQorCitzdGF0dXNfdCBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdGFydChtQ2xpZW50SWQsIHBhcmFtcyk7Cit9CisKK3N0YXR1c190IE1lZGlhU291cmNlU3BsaXR0ZXI6OkNsaWVudDo6c3RvcCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5zdG9wKG1DbGllbnRJZCk7Cit9CisKK3NwPE1ldGFEYXRhPiBNZWRpYVNvdXJjZVNwbGl0dGVyOjpDbGllbnQ6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5nZXRGb3JtYXQobUNsaWVudElkKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5yZWFkKG1DbGllbnRJZCwgYnVmZmVyLCBvcHRpb25zKTsKK30KKworc3RhdHVzX3QgTWVkaWFTb3VyY2VTcGxpdHRlcjo6Q2xpZW50OjpwYXVzZSgpIHsKKyAgICByZXR1cm4gbVNwbGl0dGVyLT5wYXVzZShtQ2xpZW50SWQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCBhYjkyODVkLi4zMzJiYWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggMTY1Y2VjOS4uZjY4YzA4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTQ2LDI5ICsxNDYsMzYgQEAKIAogc3RhdGljIGNvbnN0IENvZGVjSW5mbyBrRGVjb2RlckluZm9bXSA9IHsKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcsICJPTVguVEkuSlBFRy5kZWNvZGUiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiT01YLlRJLk1QMy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHLCAiTVAzRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgIk9NWC5QVi5tcDNkZWMiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIk9NWC5USS5BTVIuZGVjb2RlIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtci5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAiQU1STkJEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguVEkuV0JBTVIuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiQU1SV0JEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJPTVguUFYuYW1yZGVjIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguTnZpZGlhLmFhYy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiT01YLlRJLkFBQy5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJBQUNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguUFYuYWFjZGVjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCAiRzcxMURlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsICJHNzExRGVjb2RlciIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguTnZpZGlhLm1wNC5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5tcGVnNCIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGRlYyIgfSwKKy8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk9NWC5OdmlkaWEuaDI2My5kZWNvZGUiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguTnZpZGlhLmgyNjQuZGVjb2RlIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCkBAIC0xOTksNiArMjA2LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLk52aWRpYS5oMjY0LmVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJBVkNFbmNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguUFYuYXZjZW5jIiB9LAogfTsKQEAgLTMzNyw2ICszNDUsMTMgQEAKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSkgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAKKyAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hbXIuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLmFtcndiLmRlY29kZXIiKSB8fAorICAgICAgICAgIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLk52aWRpYS5hYWMuZGVjb2RlciIpIHx8CisgICAgICAgICAhc3RyY21wKGNvbXBvbmVudE5hbWUsICJPTVguTnZpZGlhLm1wMy5kZWNvZGVyIikpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtEZWNvZGVyTGllc0Fib3V0TnVtYmVyT2ZDaGFubmVsczsKKyAgICB9CisKICAgICBpZiAoIXN0cmNtcChjb21wb25lbnROYW1lLCAiT01YLlBWLmF2Y2RlYyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrV2FudHNOQUxGcmFnbWVudHM7CiAgICAgfQpAQCAtODYzLDYgKzg3OCwxMCBAQAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRm9ybWF0OwogICAgIENIRUNLX0VRKE9LLCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQobWV0YSwgJmNvbG9yRm9ybWF0KSk7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSAqdmlkZW9fZGVmID0gJmRlZi5mb3JtYXQudmlkZW87CkBAIC0xMjA2LDYgKzEyMjUsMTAgQEAKICAgICBoMjY0dHlwZS5iTUJBRkYgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuZUxvb3BGaWx0ZXJNb2RlID0gT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGU7CiAKKyAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5OdmlkaWEuaDI2NC5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgIGgyNjR0eXBlLmVMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbE1heDsKKyAgICB9CisKICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgJmgyNjR0eXBlLCBzaXplb2YoaDI2NHR5cGUpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKQEAgLTE3ODgsNyArMTgxMSw5IEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBvblBvcnRTZXR0aW5nc0NoYW5nZWQoZGF0YTEpOworICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgeworICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMTc4LDYgKzIyMDMsNyBAQAogICAgIENIRUNLX0VRKG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIEVOQUJMRUQpOwogICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBESVNBQkxJTkc7CiAKKyAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydERpc2FibGUoJWxkKSIsIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgbU9NWC0+c2VuZENvbW1hbmQobU5vZGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIHBvcnRJbmRleCk7CiAgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2IwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb1NvdXJjZURvd25TYW1wbGVyLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmlkZW9Tb3VyY2VEb3duU2FtcGxlciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvU291cmNlRG93blNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1lVVkltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWQ2FudmFzLmg+CisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6VmlkZW9Tb3VyY2VEb3duU2FtcGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnZpZGVvU291cmNlLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIExPR1YoIkNvbnN0cnVjdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyIik7CisgICAgQ0hFQ0sod2lkdGggPiAwKTsKKyAgICBDSEVDSyhoZWlnaHQgPiAwKTsKKworICAgIG1SZWFsVmlkZW9Tb3VyY2UgPSB2aWRlb1NvdXJjZTsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGEoKihtUmVhbFZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVJlYWxTb3VyY2VXaWR0aCkpOworICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1SZWFsU291cmNlSGVpZ2h0KSk7CisKKyAgICBpZiAoKG1XaWR0aCAhPSBtUmVhbFNvdXJjZVdpZHRoKSB8fCAobUhlaWdodCAhPSBtUmVhbFNvdXJjZUhlaWdodCkpIHsKKyAgICAgICAgLy8gQ2hhbmdlIG1ldGEgZGF0YSBmb3Igd2lkdGggYW5kIGhlaWdodC4KKyAgICAgICAgQ0hFQ0sobVdpZHRoIDw9IG1SZWFsU291cmNlV2lkdGgpOworICAgICAgICBDSEVDSyhtSGVpZ2h0IDw9IG1SZWFsU291cmNlSGVpZ2h0KTsKKworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IHRydWU7CisgICAgICAgIGNvbXB1dGVEb3duU2FtcGxpbmdQYXJhbWV0ZXJzKCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1XaWR0aCk7CisgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtSGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTmVlZERvd25TYW1wbGluZyA9IGZhbHNlOworICAgIH0KK30KKworVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6flZpZGVvU291cmNlRG93blNhbXBsZXIoKSB7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Y29tcHV0ZURvd25TYW1wbGluZ1BhcmFtZXRlcnMoKSB7CisgICAgbURvd25TYW1wbGVTa2lwWCA9IG1SZWFsU291cmNlV2lkdGggLyBtV2lkdGg7CisgICAgbURvd25TYW1wbGVTa2lwWSA9IG1SZWFsU291cmNlSGVpZ2h0IC8gbUhlaWdodDsKKworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WCA9IG1SZWFsU291cmNlV2lkdGggLSBtRG93blNhbXBsZVNraXBYICogbVdpZHRoOworICAgIG1Eb3duU2FtcGxlT2Zmc2V0WSA9IG1SZWFsU291cmNlSGVpZ2h0IC0gbURvd25TYW1wbGVTa2lwWSAqIG1IZWlnaHQ7Cit9CisKK3ZvaWQgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6ZG93blNhbXBsZVlVVkltYWdlKAorICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlciAmc291cmNlQnVmZmVyLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgY29uc3QgeworICAgIC8vIGZpbmQgdGhlIFlVViBmb3JtYXQKKyAgICBpbnQzMl90IHNyY0Zvcm1hdDsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnNyY0Zvcm1hdCkpOworICAgIFlVVkltYWdlOjpZVVZGb3JtYXQgeXV2Rm9ybWF0OworICAgIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgeXV2Rm9ybWF0ID0gWVVWSW1hZ2U6OllVVjQyMFNlbWlQbGFuYXI7CisgICAgfSBlbHNlIGlmIChzcmNGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICB5dXZGb3JtYXQgPSBZVVZJbWFnZTo6WVVWNDIwUGxhbmFyOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIG1lZGlhQnVmZmVyIGZvciBkb3duIHNhbXBsZWQgaW1hZ2UgYW5kIHNldHVwIGEgY2FudmFzLgorICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoWVVWSW1hZ2U6OmJ1ZmZlclNpemUoeXV2Rm9ybWF0LCBtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBZVVZJbWFnZSB5dXZEb3duU2FtcGxlZEltYWdlKHl1dkZvcm1hdCwKKyAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICh1aW50OF90ICopKCpidWZmZXIpLT5kYXRhKCkpOworICAgIFlVVkNhbnZhcyB5dXZDYW52YXNEb3duU2FtcGxlKHl1dkRvd25TYW1wbGVkSW1hZ2UpOworCisgICAgWVVWSW1hZ2UgeXV2SW1hZ2VTb3VyY2UoeXV2Rm9ybWF0LAorICAgICAgICAgICAgbVJlYWxTb3VyY2VXaWR0aCwgbVJlYWxTb3VyY2VIZWlnaHQsCisgICAgICAgICAgICAodWludDhfdCAqKXNvdXJjZUJ1ZmZlci5kYXRhKCkpOworICAgIHl1dkNhbnZhc0Rvd25TYW1wbGUuZG93bnNhbXBsZShtRG93blNhbXBsZU9mZnNldFgsIG1Eb3duU2FtcGxlT2Zmc2V0WSwKKyAgICAgICAgICAgIG1Eb3duU2FtcGxlU2tpcFgsIG1Eb3duU2FtcGxlU2tpcFksCisgICAgICAgICAgICB5dXZJbWFnZVNvdXJjZSk7Cit9CisKK3N0YXR1c190IFZpZGVvU291cmNlRG93blNhbXBsZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBMT0dWKCJzdGFydCIpOworICAgIHJldHVybiBtUmVhbFZpZGVvU291cmNlLT5zdGFydCgpOworfQorCitzdGF0dXNfdCBWaWRlb1NvdXJjZURvd25TYW1wbGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+c3RvcCgpOworfQorCitzcDxNZXRhRGF0YT4gVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6Z2V0Rm9ybWF0KCkgeworICAgIExPR1YoImdldEZvcm1hdCIpOworICAgIHJldHVybiBtTWV0YTsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTE9HVigicmVhZCIpOworICAgIE1lZGlhQnVmZmVyICpyZWFsQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1SZWFsVmlkZW9Tb3VyY2UtPnJlYWQoJnJlYWxCdWZmZXIsIG9wdGlvbnMpOworCisgICAgaWYgKG1OZWVkRG93blNhbXBsaW5nKSB7CisgICAgICAgIGRvd25TYW1wbGVZVVZJbWFnZSgqcmVhbEJ1ZmZlciwgYnVmZmVyKTsKKworICAgICAgICBpbnQ2NF90IGZyYW1lVGltZTsKKyAgICAgICAgcmVhbEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworCisgICAgICAgIC8vIFdlIGp1c3Qgd2FudCB0aGlzIGJ1ZmZlciB0byBiZSBkZWxldGVkIHdoZW4gdGhlIGVuY29kZXIgcmVsZWFzZXMgaXQuCisgICAgICAgIC8vIFNvIGRvbid0IGFkZCBhIHJlZmVyZW5jZSB0byBpdCBhbmQgc2V0IHRoZSBvYnNlcnZlciB0byBOVUxMLgorICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKE5VTEwpOworCisgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBSZWxlYXNlIGl0LgorICAgICAgICByZWFsQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IHJlYWxCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgVmlkZW9Tb3VyY2VEb3duU2FtcGxlcjo6cGF1c2UoKSB7CisgICAgTE9HVigicGF1c2UiKTsKKyAgICByZXR1cm4gbVJlYWxWaWRlb1NvdXJjZS0+cGF1c2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggYjliYTFiZS4uMmI2MzIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTYsNyArNiw4IEBACiAgICAgICAgIFNvZnR3YXJlUmVuZGVyZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2hhcmR3YXJlL21zbTdrCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICBcCkBAIC0xNyw2ICsxOCwxMSBAQAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnRcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQKIAorIyBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtN2spCitpZmVxICgkKFRBUkdFVF9QUk9EVUNUKSxwYXNzaW9uKQorCUxPQ0FMX0NGTEFHUyArPSAtREhBU19ZQ0JDUjQyMF9TUF9BRFJFTk8KK2VuZGlmCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IGE2ZGJmNjkuLmMyMDRhOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIyLDY1ICsyMiwxNzkgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcFBtZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCisvLyBYWFg6IFRlbXBvcmFyeSBoYWNrIHRvIGFsbG93IHJlZmVyZW5jaW5nIHRoZSBfQURSRU5PIHBpeGVsIGZvcm1hdCBoZXJlLgorI2luY2x1ZGUgPGxpYmdyYWxsb2MtcXNkOGsvZ3JhbGxvY19wcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICBzaXplX3QgZGVjb2RlZFdpZHRoLCBzaXplX3QgZGVjb2RlZEhlaWdodCkKICAgICA6IG1Db2xvckZvcm1hdChjb2xvckZvcm1hdCksCi0gICAgICBtQ29udmVydGVyKGNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpLAotICAgICAgbUlTdXJmYWNlKHN1cmZhY2UpLAorICAgICAgbUNvbnZlcnRlcihOVUxMKSwKKyAgICAgIG1ZVVZNb2RlKE5vbmUpLAorICAgICAgbVN1cmZhY2Uoc3VyZmFjZSksCiAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksCiAgICAgICBtRGlzcGxheUhlaWdodChkaXNwbGF5SGVpZ2h0KSwKICAgICAgIG1EZWNvZGVkV2lkdGgoZGVjb2RlZFdpZHRoKSwKLSAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpLAotICAgICAgbUZyYW1lU2l6ZShtRGVjb2RlZFdpZHRoICogbURlY29kZWRIZWlnaHQgKiAyKSwgIC8vIFJHQjU2NQotICAgICAgbUluZGV4KDApIHsKLSAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgiL2Rldi9wbWVtX2Fkc3AiLCAyICogbUZyYW1lU2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA8IDApIHsKLSAgICAgICAgTE9HSSgiQ3JlYXRpbmcgcGh5c2ljYWwgbWVtb3J5IGhlYXAgZmFpbGVkLCByZXZlcnRpbmcgdG8gcmVndWxhciBoZWFwLiIpOwotICAgICAgICBtTWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSgyICogbUZyYW1lU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8TWVtb3J5SGVhcFBtZW0+IHBtZW1IZWFwID0gbmV3IE1lbW9yeUhlYXBQbWVtKG1NZW1vcnlIZWFwKTsKLSAgICAgICAgcG1lbUhlYXAtPnNsYXAoKTsKLSAgICAgICAgbU1lbW9yeUhlYXAgPSBwbWVtSGVhcDsKKyAgICAgIG1EZWNvZGVkSGVpZ2h0KGRlY29kZWRIZWlnaHQpIHsKKyAgICBMT0dJKCJpbnB1dCBmb3JtYXQgPSAlZCIsIG1Db2xvckZvcm1hdCk7CisgICAgTE9HSSgiZGlzcGxheSA9ICVkIHggJWQsIGRlY29kZWQgPSAlZCB4ICVkIiwKKyAgICAgICAgICAgIG1EaXNwbGF5V2lkdGgsIG1EaXNwbGF5SGVpZ2h0LCBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICBpbnQgaGFsRm9ybWF0OworICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisjaWYgSEFTX1lDQkNSNDIwX1NQX0FEUkVOTworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgICAgIG1ZVVZNb2RlID0gWVVWNDIwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAweDdmYTMwYzAwOgorICAgICAgICB7CisgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUF9BRFJFTk87CisgICAgICAgICAgICBtWVVWTW9kZSA9IFlVVjQyMHNwVG9ZVVY0MjBzcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworCisgICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQ0hFQ0sobUlTdXJmYWNlLmdldCgpICE9IE5VTEwpOworICAgIENIRUNLKG1TdXJmYWNlLmdldCgpICE9IE5VTEwpOwogICAgIENIRUNLKG1EZWNvZGVkV2lkdGggPiAwKTsKICAgICBDSEVDSyhtRGVjb2RlZEhlaWdodCA+IDApOwotICAgIENIRUNLKG1NZW1vcnlIZWFwLT5oZWFwSUQoKSA+PSAwKTsKLSAgICBDSEVDSyhtQ29udmVydGVyLmlzVmFsaWQoKSk7CisgICAgQ0hFQ0sobUNvbnZlcnRlciA9PSBOVUxMIHx8IG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAKLSAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJIZWFwKAotICAgICAgICAgICAgbURpc3BsYXlXaWR0aCwgbURpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgbU1lbW9yeUhlYXApOworICAgIENIRUNLX0VRKDAsCisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZSgKKyAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1JU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlckhlYXApOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtU3VyZmFjZS5nZXQoKSwgMikpOworCisgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIG1EZWNvZGVkV2lkdGgsIG1EZWNvZGVkSGVpZ2h0LAorICAgICAgICAgICAgICAgIGhhbEZvcm1hdCkpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKLSAgICBtSVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IEFMSUdOKHNpemVfdCB4LCBzaXplX3QgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwogfQogCiB2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSBtSW5kZXggKiBtRnJhbWVTaXplOwotICAgIHZvaWQgKmRzdCA9ICh1aW50OF90ICopbU1lbW9yeUhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIGludCBlcnI7CisgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+ZGVxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgJmJ1ZikpICE9IDApIHsKKyAgICAgICAgTE9HVygiU3VyZmFjZTo6ZGVxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBtQ29udmVydGVyLmNvbnZlcnQoCi0gICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKLSAgICAgICAgICAgIGRhdGEsIDAsIGRzdCwgMiAqIG1EZWNvZGVkV2lkdGgpOworICAgIENIRUNLX0VRKDAsIG1TdXJmYWNlLT5sb2NrQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKTsKIAotICAgIG1JU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgIG1JbmRleCA9IDEgLSBtSW5kZXg7CisgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisKKyAgICBSZWN0IGJvdW5kcyhtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCk7CisKKyAgICB2b2lkICpkc3Q7CisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soCisgICAgICAgICAgICAgICAgYnVmLT5oYW5kbGUsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sIGJvdW5kcywgJmRzdCkpOworCisgICAgaWYgKG1Db252ZXJ0ZXIpIHsKKyAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICBtRGVjb2RlZFdpZHRoLCBtRGVjb2RlZEhlaWdodCwKKyAgICAgICAgICAgICAgICBkYXRhLCAwLCBkc3QsIGJ1Zi0+c3RyaWRlICogMik7CisgICAgfSBlbHNlIGlmIChtWVVWTW9kZSA9PSBZVVY0MjBzcFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgYW5kIG91dHB1dCBhcmUgYm90aCBZVVY0MjBzcCwgYnV0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzCisgICAgICAgIC8vIGFyZSBkaWZmZXJlbnQuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpICYgfjE7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IEFMSUdOKG1EZWNvZGVkV2lkdGggLyAyLCAzMikgKiAyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1VWID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhCisgICAgICAgICAgICArIG1EZWNvZGVkSGVpZ2h0ICogbURlY29kZWRXaWR0aDsKKworICAgICAgICBzaXplX3QgZHN0VVZPZmZzZXQgPSBBTElHTihBTElHTihtRGVjb2RlZEhlaWdodCwgMzIpICogYnVmLT5zdHJpZGUsIDQwOTYpOworICAgICAgICB1aW50OF90ICpkc3RVViA9ICh1aW50OF90ICopZHN0ICsgZHN0VVZPZmZzZXQ7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAobURlY29kZWRIZWlnaHQgKyAxKSAvIDI7ICsraSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFVWLCBzcmNVViwgKG1EZWNvZGVkV2lkdGggKyAxKSAmIH4xKTsKKyAgICAgICAgICAgIHNyY1VWICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1ZVVZNb2RlID09IFlVVjQyMFRvWVVWNDIwc3ApIHsKKyAgICAgICAgLy8gSW5wdXQgaXMgWVVWNDIwIHBsYW5hciwgb3V0cHV0IGlzIFlVVjQyMHNwLCBhZGhlcmUgdG8gcHJvcGVyCisgICAgICAgIC8vIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbURlY29kZWRXaWR0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKyAgICAgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNvZGVkSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCBtRGVjb2RlZFdpZHRoKTsKKyAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgICAgIGRzdFkgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3Qgc3JjVVZTdHJpZGUgPSAobURlY29kZWRXaWR0aCArIDEpIC8gMjsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gQUxJR04obURlY29kZWRXaWR0aCAvIDIsIDMyKSAqIDI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgKyBtRGVjb2RlZEhlaWdodCAqIG1EZWNvZGVkV2lkdGg7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9CisgICAgICAgICAgICBzcmNVICsgKChtRGVjb2RlZFdpZHRoICsgMSkgLyAyKSAqICgobURlY29kZWRIZWlnaHQgKyAxKSAvIDIpOworCisgICAgICAgIHNpemVfdCBkc3RVVk9mZnNldCA9IEFMSUdOKEFMSUdOKG1EZWNvZGVkSGVpZ2h0LCAzMikgKiBidWYtPnN0cmlkZSwgNDA5Nik7CisgICAgICAgIHVpbnQ4X3QgKmRzdFVWID0gKHVpbnQ4X3QgKilkc3QgKyBkc3RVVk9mZnNldDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IChtRGVjb2RlZEhlaWdodCArIDEpIC8gMjsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChtRGVjb2RlZFdpZHRoICsgMSkgLyAyOyArK2opIHsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogaiArIDFdID0gc3JjVVtqXTsKKyAgICAgICAgICAgICAgICBkc3RVVlsyICogal0gPSBzcmNWW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjVSArPSBzcmNVVlN0cmlkZTsKKyAgICAgICAgICAgIHNyY1YgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICAgICBkc3RVViArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShkc3QsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2soYnVmLT5oYW5kbGUpKTsKKworICAgIGlmICgoZXJyID0gbVN1cmZhY2UtPnF1ZXVlQnVmZmVyKG1TdXJmYWNlLmdldCgpLCBidWYpKSAhPSAwKSB7CisgICAgICAgIExPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9CisgICAgYnVmID0gTlVMTDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IGVkZDg2NDguLjE3NzcxYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICBpZiAoc2xhc2hQb3MgPiAmYmFzZVVSTFs2XSkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCAxZjM5NDZjLi5lYTJmN2Q1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtNzYsNiArNzYsNyBAQAogICAgIGJvb2wgaXNQbGF5aW5nKCkgY29uc3Q7CiAKICAgICB2b2lkIHNldElTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmaXN1cmZhY2UpOworICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOwogICAgIHN0YXR1c190IHNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKTsKIApAQCAtMTE4LDYgKzExOSw3IEBACiAgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CiAKICAgICBzcDxJU3VyZmFjZT4gbUlTdXJmYWNlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogCiAgICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKQEAgLTIyMCw2ICsyMjIsNyBAQAogICAgIHN0YXR1c190IHNlZWtUb19sKGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBwYXVzZV9sKCk7CiAgICAgdm9pZCBpbml0UmVuZGVyZXJfbCgpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplX2woKTsKICAgICB2b2lkIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIAogICAgIHZvaWQgY2FuY2VsUGxheWVyRXZlbnRzKGJvb2wga2VlcEJ1ZmZlcmluZ0dvaW5nID0gZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggYzk5ZGE1OS4uODNiNzVhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC01OSwxMCArNTksMTcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOREVYVFlQRSBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IGI1YjMxYWMuLjhjN2M1NjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaApAQCAtNDksMTAgKzQ5LDE2IEBACiAgICAgc3RhdHVzX3QgZ2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKTsKIAorICAgIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpOworCiAgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKIAorICAgIHN0YXR1c190IHVzZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLAogICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhKTsKQEAgLTEyNSw0ICsxMzEsMyBAQAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBPTVhfTk9ERV9JTlNUQU5DRV9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IDllZWQwODkuLjhkNTgwNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC0yNCwxNCArMjQsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJU3VyZmFjZTsKK2NsYXNzIFN1cmZhY2U7CiBjbGFzcyBNZW1vcnlIZWFwQmFzZTsKIAogY2xhc3MgU29mdHdhcmVSZW5kZXJlciA6IHB1YmxpYyBWaWRlb1JlbmRlcmVyIHsKIHB1YmxpYzoKICAgICBTb2Z0d2FyZVJlbmRlcmVyKAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgICAgIHNpemVfdCBkaXNwbGF5V2lkdGgsIHNpemVfdCBkaXNwbGF5SGVpZ2h0LAogICAgICAgICAgICAgc2l6ZV90IGRlY29kZWRXaWR0aCwgc2l6ZV90IGRlY29kZWRIZWlnaHQpOwogCkBAIC00MSwxNCArNDEsMTggQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpOwogCiBwcml2YXRlOgorICAgIGVudW0gWVVWTW9kZSB7CisgICAgICAgIE5vbmUsCisgICAgICAgIFlVVjQyMFRvWVVWNDIwc3AsCisgICAgICAgIFlVVjQyMHNwVG9ZVVY0MjBzcCwKKyAgICB9OworCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbUNvbG9yRm9ybWF0OwotICAgIENvbG9yQ29udmVydGVyIG1Db252ZXJ0ZXI7Ci0gICAgc3A8SVN1cmZhY2U+IG1JU3VyZmFjZTsKKyAgICBDb2xvckNvbnZlcnRlciAqbUNvbnZlcnRlcjsKKyAgICBZVVZNb2RlIG1ZVVZNb2RlOworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogICAgIHNpemVfdCBtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodDsKICAgICBzaXplX3QgbURlY29kZWRXaWR0aCwgbURlY29kZWRIZWlnaHQ7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0gICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1NZW1vcnlIZWFwOwotICAgIGludCBtSW5kZXg7CiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDZkZTc2MWYuLjM3MjQzYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0yODcsNiArMjg3LDExIEBACiAgICAgICAgICAgICBpbmRleCwgcGFyYW1zLCBzaXplKTsKIH0KIAorc3RhdHVzX3QgT01YOjplbmFibGVHcmFwaGljQnVmZmVycygKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmVuYWJsZUdyYXBoaWNCdWZmZXJzKHBvcnRfaW5kZXgsIGVuYWJsZSk7Cit9CisKIHN0YXR1c190IE9NWDo6dXNlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTI5NCw2ICsyOTksMTMgQEAKICAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyKTsKIH0KIAorc3RhdHVzX3QgT01YOjp1c2VHcmFwaGljQnVmZmVyKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+dXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIHBvcnRfaW5kZXgsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlcik7Cit9CisKIHN0YXR1c190IE9NWDo6YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSkgewpAQCAtNDk1LDEyICs1MDcsMTcgQEAKICAgICB9CiAKICAgICBpZiAoIWltcGwpIHsKKyNpZiAwCiAgICAgICAgIExPR1coIlVzaW5nIHNvZnR3YXJlIHJlbmRlcmVyLiIpOwogICAgICAgICBpbXBsID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIoCiAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQsCiAgICAgICAgICAgICAgICAgc3VyZmFjZSwKICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICAgICAgZW5jb2RlZFdpZHRoLCBlbmNvZGVkSGVpZ2h0KTsKKyNlbHNlCisgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiBuZXcgT01YUmVuZGVyZXIoaW1wbCk7CkBAIC01MjUsNCArNTQyLDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCA1ZGI1MTZlLi5iYTRkNzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIApAQCAtNDAsNiArNDEsMTEgQEAKICAgICAgICAgICBtSXNCYWNrdXAoZmFsc2UpIHsKICAgICB9CiAKKyAgICBCdWZmZXJNZXRhKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKQorICAgICAgICA6IG1HcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpLAorICAgICAgICAgIG1Jc0JhY2t1cChmYWxzZSkgeworICAgIH0KKwogICAgIHZvaWQgQ29weUZyb21PTVgoY29uc3QgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcikgewogICAgICAgICBpZiAoIW1Jc0JhY2t1cCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjEsNiArNjcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKICAgICBzcDxJTWVtb3J5PiBtTWVtOwogICAgIHNpemVfdCBtU2l6ZTsKICAgICBib29sIG1Jc0JhY2t1cDsKQEAgLTI0MCw2ICsyNDcsNDMgQEAKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG1IYW5kbGUsCisgICAgICAgICAgICBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KCJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMiKSwKKyAgICAgICAgICAgICZpbmRleCk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4IGZhaWxlZCIpOworCisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBPTVhfVkVSU0lPTlRZUEUgdmVyOworICAgIHZlci5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHZlci5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHZlci5zLm5SZXZpc2lvbiA9IDA7CisgICAgdmVyLnMublN0ZXAgPSAwOworICAgIEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgc2l6ZW9mKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zKSwgdmVyLCBwb3J0SW5kZXgsIGVuYWJsZSwKKyAgICB9OworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcyk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0VuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIGZhaWxlZCB3aXRoIGVycm9yICVkICgweCUwOHgpIiwKKyAgICAgICAgICAgICAgICBlcnIsIGVycik7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIpIHsKQEAgLTI3Myw2ICszMTcsNjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAorICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfU1RSSU5HPigiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIiKSwKKyAgICAgICAgICAgICZpbmRleCk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4IGZhaWxlZCIpOworCisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gbmV3IEJ1ZmZlck1ldGEoZ3JhcGhpY0J1ZmZlcik7CisKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOworCisgICAgT01YX1ZFUlNJT05UWVBFIHZlcjsKKyAgICB2ZXIucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICB2ZXIucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICB2ZXIucy5uUmV2aXNpb24gPSAwOworICAgIHZlci5zLm5TdGVwID0gMDsKKyAgICBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgc2l6ZW9mKFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMpLCB2ZXIsIHBvcnRJbmRleCwgYnVmZmVyTWV0YSwKKyAgICAgICAgJmhlYWRlciwgZ3JhcGhpY0J1ZmZlciwKKyAgICB9OworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnBhcmFtcyk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgTE9HRSgiT01YX1VzZUFuZHJvaWROYXRpdmVCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQgKDB4JTA4eCkiLCBlcnIsCisgICAgICAgICAgICAgICAgZXJyKTsKKworICAgICAgICBkZWxldGUgYnVmZmVyTWV0YTsKKyAgICAgICAgYnVmZmVyTWV0YSA9IE5VTEw7CisKKyAgICAgICAgKmJ1ZmZlciA9IDA7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyTWV0YSk7CisKKyAgICAqYnVmZmVyID0gaGVhZGVyOworCisgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3Qgc2l6ZSwgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwKICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CkBAIC00OTgsNCArNTk2LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGNiZDQ4MzYuLmZkNmFhNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+Y19zdHIoKSwgJzonKTsKKyAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihob3N0LT5jX3N0cigpLCAnOicpOwogCiAgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyB4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggNGVhN2ZkYS4uNGE4Y2NlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBBU3RyaW5nIGZvcm1hdDsKICAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOwogCi0gICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOwogICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKIAogICAgIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGI4NDkxMTcuLjBhZWZkNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtODczLDcgKzg3Myw3IEBACiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwogICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CiAKICAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk0YWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgICAgIFlVVkltYWdlLmNwcCAgICAgICAgICAgIFwKKyAgICAgICAgWVVWQ2FudmFzLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKKyAgICAgICAgbGliY3V0aWxzCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWQ2FudmFzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZDYW52YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWE3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWQ2FudmFzLmNwcApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIllVVkNhbnZhcyIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZDYW52YXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9ZVVZJbWFnZS5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitZVVZDYW52YXM6OllVVkNhbnZhcyhZVVZJbWFnZSAmeXV2SW1hZ2UpCisgICAgOiBtWVVWSW1hZ2UoeXV2SW1hZ2UpIHsKK30KKworWVVWQ2FudmFzOjp+WVVWQ2FudmFzKCkgeworfQorCit2b2lkIFlVVkNhbnZhczo6RmlsbFlVVih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlKSB7CisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbVlVVkltYWdlLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVlVVkltYWdlLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpGaWxsWVVWUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHJlY3QsCisgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBmb3IgKGludDMyX3QgeSA9IHJlY3QudG9wOyB5IDwgcmVjdC5ib3R0b207ICsreSkgeworICAgICAgICBmb3IgKGludDMyX3QgeCA9IHJlY3QubGVmdDsgeCA8IHJlY3QucmlnaHQ7ICsreCkgeworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWQ2FudmFzOjpDb3B5SW1hZ2VSZWN0KAorICAgICAgICBjb25zdCBSZWN0JiBzcmNSZWN0LAorICAgICAgICBpbnQzMl90IGRlc3RTdGFydFgsIGludDMyX3QgZGVzdFN0YXJ0WSwKKyAgICAgICAgY29uc3QgWVVWSW1hZ2UgJnNyY0ltYWdlKSB7CisKKyAgICAvLyBUcnkgZmFzdCBjb3B5IGZpcnN0CisgICAgaWYgKFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgc3JjSW1hZ2UsIG1ZVVZJbWFnZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgc3JjU3RhcnRYID0gc3JjUmVjdC5sZWZ0OworICAgIGludDMyX3Qgc3JjU3RhcnRZID0gc3JjUmVjdC50b3A7CisgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgc3JjUmVjdC5oZWlnaHQoKTsgKytvZmZzZXRZKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRYID0gMDsgb2Zmc2V0WCA8IHNyY1JlY3Qud2lkdGgoKTsgKytvZmZzZXRYKSB7CisgICAgICAgICAgICBpbnQzMl90IHNyY1ggPSBzcmNTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBzcmNZID0gc3JjU3RhcnRZICsgb2Zmc2V0WTsKKworICAgICAgICAgICAgaW50MzJfdCBkZXN0WCA9IGRlc3RTdGFydFggKyBvZmZzZXRYOworICAgICAgICAgICAgaW50MzJfdCBkZXN0WSA9IGRlc3RTdGFydFkgKyBvZmZzZXRZOworCisgICAgICAgICAgICB1aW50OF90IHlWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB2VmFsdWU7CisKKyAgICAgICAgICAgIHNyY0ltYWdlLmdldFBpeGVsVmFsdWUoc3JjWCwgc3JjWSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJnZWYWx1ZSk7CisgICAgICAgICAgICBtWVVWSW1hZ2Uuc2V0UGl4ZWxWYWx1ZShkZXN0WCwgZGVzdFksIHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFlVVkNhbnZhczo6ZG93bnNhbXBsZSgKKyAgICAgICAgaW50MzJfdCBzcmNPZmZzZXRYLCBpbnQzMl90IHNyY09mZnNldFksCisgICAgICAgIGludDMyX3Qgc2tpcFgsIGludDMyX3Qgc2tpcFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSkgeworICAgIC8vIFRPRE86IEFkZCBhIGxvdyBwYXNzIGZpbHRlciBmb3IgZG93bnNhbXBsaW5nLgorCisgICAgLy8gQ2hlY2sgdGhhdCBzcmNJbWFnZSBpcyBiaWcgZW5vdWdoIHRvIGZpbGwgbVlVVkltYWdlLgorICAgIENIRUNLKChzcmNPZmZzZXRYICsgKG1ZVVZJbWFnZS53aWR0aCgpIC0gMSkgKiBza2lwWCkgPCBzcmNJbWFnZS53aWR0aCgpKTsKKyAgICBDSEVDSygoc3JjT2Zmc2V0WSArIChtWVVWSW1hZ2UuaGVpZ2h0KCkgLSAxKSAqIHNraXBZKSA8IHNyY0ltYWdlLmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgeVZhbHVlOworICAgIHVpbnQ4X3QgdVZhbHVlOworICAgIHVpbnQ4X3QgdlZhbHVlOworCisgICAgaW50MzJfdCBzcmNZID0gc3JjT2Zmc2V0WTsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtWVVWSW1hZ2UuaGVpZ2h0KCk7ICsreSkgeworICAgICAgICBpbnQzMl90IHNyY1ggPSBzcmNPZmZzZXRYOworICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtWVVWSW1hZ2Uud2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICBzcmNJbWFnZS5nZXRQaXhlbFZhbHVlKHNyY1gsIHNyY1ksICZ5VmFsdWUsICZ1VmFsdWUsICZ2VmFsdWUpOworICAgICAgICAgICAgbVlVVkltYWdlLnNldFBpeGVsVmFsdWUoeCwgeSwgeVZhbHVlLCB1VmFsdWUsIHZWYWx1ZSk7CisKKyAgICAgICAgICAgIHNyY1ggKz0gc2tpcFg7CisgICAgICAgIH0KKyAgICAgICAgc3JjWSArPSBza2lwWTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzEyMDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIllVVkltYWdlIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvWVVWSW1hZ2UuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1lVVkltYWdlOjpZVVZJbWFnZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIG1ZVVZGb3JtYXQgPSB5dXZGb3JtYXQ7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgIHNpemVfdCBudW1iZXJPZkJ5dGVzID0gYnVmZmVyU2l6ZSh5dXZGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W251bWJlck9mQnl0ZXNdOworICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgbU93bkJ1ZmZlciA9IHRydWU7CisKKyAgICBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKK30KKworWVVWSW1hZ2U6OllVVkltYWdlKFlVVkZvcm1hdCB5dXZGb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCB1aW50OF90ICpidWZmZXIpIHsKKyAgICBtWVVWRm9ybWF0ID0geXV2Rm9ybWF0OworICAgIG1XaWR0aCA9IHdpZHRoOworICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtT3duQnVmZmVyID0gZmFsc2U7CisKKyAgICBpbml0aWFsaXplWVVWUG9pbnRlcnMoKTsKK30KKworLy9zdGF0aWMKK3NpemVfdCBZVVZJbWFnZTo6YnVmZmVyU2l6ZShZVVZGb3JtYXQgeXV2Rm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGludDMyX3QgbnVtYmVyT2ZQaXhlbHMgPSB3aWR0aCpoZWlnaHQ7CisgICAgc2l6ZV90IG51bWJlck9mQnl0ZXMgPSAwOworICAgIGlmICh5dXZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyIHx8IHl1dkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFkgdGFrZXMgbnVtYmVyT2ZQaXhlbHMgYnl0ZXMgYW5kIFUvViB0YWtlIG51bWJlck9mUGl4ZWxzLzQgYnl0ZXMgZWFjaC4KKyAgICAgICAgbnVtYmVyT2ZCeXRlcyA9IChzaXplX3QpKG51bWJlck9mUGl4ZWxzICsgKG51bWJlck9mUGl4ZWxzID4+IDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGb3JtYXQgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICByZXR1cm4gbnVtYmVyT2ZCeXRlczsKK30KKworYm9vbCBZVVZJbWFnZTo6aW5pdGlhbGl6ZVlVVlBvaW50ZXJzKCkgeworICAgIGludDMyX3QgbnVtYmVyT2ZQaXhlbHMgPSBtV2lkdGggKiBtSGVpZ2h0OworCisgICAgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgIG1ZZGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlcjsKKyAgICAgICAgbVVkYXRhID0gbVlkYXRhICsgbnVtYmVyT2ZQaXhlbHM7CisgICAgICAgIG1WZGF0YSA9IG1VZGF0YSArIChudW1iZXJPZlBpeGVscyA+PiAyKTsKKyAgICB9IGVsc2UgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBVIGFuZCBWIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCBhcyBWVVZVVlUuCisgICAgICAgIC8vIFNvIFYgZGF0YSBzdGFydHMgYXQgdGhlIGVuZCBvZiBZIGNoYW5uZWwgYW5kCisgICAgICAgIC8vIFUgZGF0YSBzdGFydHMgcmlnaHQgYWZ0ZXIgVidzIHN0YXJ0LgorICAgICAgICBtWWRhdGEgPSAodWludDhfdCAqKW1CdWZmZXI7CisgICAgICAgIG1WZGF0YSA9IG1ZZGF0YSArIG51bWJlck9mUGl4ZWxzOworICAgICAgICBtVWRhdGEgPSBtVmRhdGEgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1lVVkltYWdlOjp+WVVWSW1hZ2UoKSB7CisgICAgaWYgKG1Pd25CdWZmZXIpIGRlbGV0ZVtdIG1CdWZmZXI7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OmdldE9mZnNldHMoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIGludDMyX3QgKnlPZmZzZXQsIGludDMyX3QgKnVPZmZzZXQsIGludDMyX3QgKnZPZmZzZXQpIGNvbnN0IHsKKyAgICAqeU9mZnNldCA9IHkqbVdpZHRoICsgeDsKKworICAgIGludDMyX3QgdXZPZmZzZXQgPSAoeSA+PiAxKSAqIChtV2lkdGggPj4gMSkgKyAoeCA+PiAxKTsKKyAgICBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgKnVPZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgKnZPZmZzZXQgPSB1dk9mZnNldDsKKyAgICB9IGVsc2UgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAvLyBTaW5jZSBVIGFuZCBWIGNoYW5uZWxzIGFyZSBpbnRlcmxlYXZlZCwgb2Zmc2V0cyBuZWVkCisgICAgICAgIC8vIHRvIGJlIGRvdWJsZWQuCisgICAgICAgICp1T2Zmc2V0ID0gMip1dk9mZnNldDsKKyAgICAgICAgKnZPZmZzZXQgPSAyKnV2T2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgIGludDMyX3QgKnlEYXRhT2Zmc2V0SW5jcmVtZW50LAorICAgICAgICBpbnQzMl90ICp1RGF0YU9mZnNldEluY3JlbWVudCwKKyAgICAgICAgaW50MzJfdCAqdkRhdGFPZmZzZXRJbmNyZW1lbnQpIGNvbnN0IHsKKyAgICAqeURhdGFPZmZzZXRJbmNyZW1lbnQgPSBtV2lkdGg7CisKKyAgICBpbnQzMl90IHV2RGF0YU9mZnNldEluY3JlbWVudCA9IG1XaWR0aCA+PiAxOworCisgICAgaWYgKG1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKSB7CisgICAgICAgICp1RGF0YU9mZnNldEluY3JlbWVudCA9IHV2RGF0YU9mZnNldEluY3JlbWVudDsKKyAgICAgICAgKnZEYXRhT2Zmc2V0SW5jcmVtZW50ID0gdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgIH0gZWxzZSBpZiAobVlVVkZvcm1hdCA9PSBZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgICAgIC8vIFNpbmNlIFUgYW5kIFYgY2hhbm5lbHMgYXJlIGludGVybGVhdmVkLCBvZmZzZXRzIG5lZWQKKyAgICAgICAgLy8gdG8gYmUgZG91YmxlZC4KKyAgICAgICAgKnVEYXRhT2Zmc2V0SW5jcmVtZW50ID0gMip1dkRhdGFPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICp2RGF0YU9mZnNldEluY3JlbWVudCA9IDIqdXZEYXRhT2Zmc2V0SW5jcmVtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFlBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1ZZGF0YSArIG9mZnNldDsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFVBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1VZGF0YSArIG9mZnNldDsKK30KKwordWludDhfdCogWVVWSW1hZ2U6OmdldFZBZGRyZXNzKGludDMyX3Qgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIG1WZGF0YSArIG9mZnNldDsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0WVVWQWRkcmVzc2VzKGludDMyX3QgeCwgaW50MzJfdCB5LAorICAgICAgICB1aW50OF90ICoqeUFkZHIsIHVpbnQ4X3QgKip1QWRkciwgdWludDhfdCAqKnZBZGRyKSBjb25zdCB7CisgICAgaW50MzJfdCB5T2Zmc2V0OworICAgIGludDMyX3QgdU9mZnNldDsKKyAgICBpbnQzMl90IHZPZmZzZXQ7CisgICAgaWYgKCFnZXRPZmZzZXRzKHgsIHksICZ5T2Zmc2V0LCAmdU9mZnNldCwgJnZPZmZzZXQpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeUFkZHIgPSBnZXRZQWRkcmVzcyh5T2Zmc2V0KTsKKyAgICAqdUFkZHIgPSBnZXRVQWRkcmVzcyh1T2Zmc2V0KTsKKyAgICAqdkFkZHIgPSBnZXRWQWRkcmVzcyh2T2Zmc2V0KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFlVVkltYWdlOjp2YWxpZFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdCB7CisgICAgcmV0dXJuICh4ID49IDAgJiYgeCA8IG1XaWR0aCAmJgorICAgICAgICAgICAgeSA+PSAwICYmIHkgPCBtSGVpZ2h0KTsKK30KKworYm9vbCBZVVZJbWFnZTo6Z2V0UGl4ZWxWYWx1ZShpbnQzMl90IHgsIGludDMyX3QgeSwKKyAgICAgICAgdWludDhfdCAqeVB0ciwgdWludDhfdCAqdVB0ciwgdWludDhfdCAqdlB0cikgY29uc3QgeworICAgIENIRUNLKHZhbGlkUGl4ZWwoeCwgeSkpOworCisgICAgdWludDhfdCAqeUFkZHI7CisgICAgdWludDhfdCAqdUFkZHI7CisgICAgdWludDhfdCAqdkFkZHI7CisgICAgaWYgKCFnZXRZVVZBZGRyZXNzZXMoeCwgeSwgJnlBZGRyLCAmdUFkZHIsICZ2QWRkcikpIHJldHVybiBmYWxzZTsKKworICAgICp5UHRyID0gKnlBZGRyOworICAgICp1UHRyID0gKnVBZGRyOworICAgICp2UHRyID0gKnZBZGRyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgWVVWSW1hZ2U6OnNldFBpeGVsVmFsdWUoaW50MzJfdCB4LCBpbnQzMl90IHksCisgICAgICAgIHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUpIHsKKyAgICBDSEVDSyh2YWxpZFBpeGVsKHgsIHkpKTsKKworICAgIHVpbnQ4X3QgKnlBZGRyOworICAgIHVpbnQ4X3QgKnVBZGRyOworICAgIHVpbnQ4X3QgKnZBZGRyOworICAgIGlmICghZ2V0WVVWQWRkcmVzc2VzKHgsIHksICZ5QWRkciwgJnVBZGRyLCAmdkFkZHIpKSByZXR1cm4gZmFsc2U7CisKKyAgICAqeUFkZHIgPSB5VmFsdWU7CisgICAgKnVBZGRyID0gdVZhbHVlOworICAgICp2QWRkciA9IHZWYWx1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZTQyMFBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwUGxhbmFyKTsKKyAgICBDSEVDSyhkZXN0SW1hZ2UubVlVVkZvcm1hdCA9PSBZVVY0MjBQbGFuYXIpOworCisgICAgaW50MzJfdCBzcmNTdGFydFggPSBzcmNSZWN0LmxlZnQ7CisgICAgaW50MzJfdCBzcmNTdGFydFkgPSBzcmNSZWN0LnRvcDsKKyAgICBpbnQzMl90IHdpZHRoID0gc3JjUmVjdC53aWR0aCgpOworICAgIGludDMyX3QgaGVpZ2h0ID0gc3JjUmVjdC5oZWlnaHQoKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0YXJ0IGFkZHJlc3NlcworICAgIHVpbnQ4X3QgKnlTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1U3JjQWRkckJhc2U7CisgICAgdWludDhfdCAqdlNyY0FkZHJCYXNlOworICAgIHNyY0ltYWdlLmdldFlVVkFkZHJlc3NlcyhzcmNTdGFydFgsIHNyY1N0YXJ0WSwKKyAgICAgICAgICAgICZ5U3JjQWRkckJhc2UsICZ1U3JjQWRkckJhc2UsICZ2U3JjQWRkckJhc2UpOworCisgICAgdWludDhfdCAqeURlc3RBZGRyQmFzZTsKKyAgICB1aW50OF90ICp1RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnZEZXN0QWRkckJhc2U7CisgICAgZGVzdEltYWdlLmdldFlVVkFkZHJlc3NlcyhkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgJnlEZXN0QWRkckJhc2UsICZ1RGVzdEFkZHJCYXNlLCAmdkRlc3RBZGRyQmFzZSk7CisKKyAgICAvLyBHZXQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZmZzZXQgaW5jcmVtZW50cyBpbmN1cnJlZCBpbiBnb2luZworICAgIC8vIGZyb20gb25lIGRhdGEgcm93IHRvIG5leHQuCisgICAgaW50MzJfdCB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdVNyY09mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgc3JjSW1hZ2UuZ2V0T2Zmc2V0SW5jcmVtZW50c1BlckRhdGFSb3coCisgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKKworICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOworCisgICAgLy8gQ29weSBZCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSB3aWR0aDsKKyAgICAgICAgdWludDhfdCAqeVNyY0FkZHIgPSB5U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnlEZXN0QWRkciA9IHlEZXN0QWRkckJhc2U7CisgICAgICAgIGZvciAoaW50MzJfdCBvZmZzZXRZID0gMDsgb2Zmc2V0WSA8IGhlaWdodDsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkoeURlc3RBZGRyLCB5U3JjQWRkciwgbnVtYmVyT2ZZQnl0ZXNQZXJSb3cpOworCisgICAgICAgICAgICB5U3JjQWRkciArPSB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyICs9IHlEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29weSBVCisgICAgeworICAgICAgICBzaXplX3QgbnVtYmVyT2ZVQnl0ZXNQZXJSb3cgPSAoc2l6ZV90KSAod2lkdGggPj4gMSk7CisgICAgICAgIHVpbnQ4X3QgKnVTcmNBZGRyID0gdVNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp1RGVzdEFkZHIgPSB1RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciByb3cgaGFzIGFuIGVudHJ5IGZvciBVL1YgY2hhbm5lbCB2YWx1ZXMuIEhlbmNlIG9ubHkKKyAgICAgICAgLy8gZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh1RGVzdEFkZHIsIHVTcmNBZGRyLCBudW1iZXJPZlVCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHVTcmNBZGRyICs9IHVTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB1RGVzdEFkZHIgKz0gdURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFYKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZlZCeXRlc1BlclJvdyA9IChzaXplX3QpICh3aWR0aCA+PiAxKTsKKyAgICAgICAgdWludDhfdCAqdlNyY0FkZHIgPSB2U3JjQWRkckJhc2U7CisgICAgICAgIHVpbnQ4X3QgKnZEZXN0QWRkciA9IHZEZXN0QWRkckJhc2U7CisgICAgICAgIC8vIEV2ZXJ5IG90aGVyIHBpeGVsIHJvdyBoYXMgYSBVL1YgZGF0YSByb3cuIEhlbmNlIG9ubHkgZ28gaGFsZiB0aGUgaGVpZ2h0LgorICAgICAgICBmb3IgKGludDMyX3Qgb2Zmc2V0WSA9IDA7IG9mZnNldFkgPCAoaGVpZ2h0ID4+IDEpOyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh2RGVzdEFkZHIsIHZTcmNBZGRyLCBudW1iZXJPZlZCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHZTcmNBZGRyICs9IHZTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgICAgICB2RGVzdEFkZHIgKz0gdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgWVVWSW1hZ2U6OmZhc3RDb3B5UmVjdGFuZ2xlNDIwU2VtaVBsYW5hcigKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIENIRUNLKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisgICAgQ0hFQ0soZGVzdEltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcik7CisKKyAgICBpbnQzMl90IHNyY1N0YXJ0WCA9IHNyY1JlY3QubGVmdDsKKyAgICBpbnQzMl90IHNyY1N0YXJ0WSA9IHNyY1JlY3QudG9wOworICAgIGludDMyX3Qgd2lkdGggPSBzcmNSZWN0LndpZHRoKCk7CisgICAgaW50MzJfdCBoZWlnaHQgPSBzcmNSZWN0LmhlaWdodCgpOworCisgICAgLy8gR2V0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RhcnQgYWRkcmVzc2VzCisgICAgdWludDhfdCAqeVNyY0FkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVTcmNBZGRyQmFzZTsKKyAgICB1aW50OF90ICp2U3JjQWRkckJhc2U7CisgICAgc3JjSW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKHNyY1N0YXJ0WCwgc3JjU3RhcnRZLAorICAgICAgICAgICAgJnlTcmNBZGRyQmFzZSwgJnVTcmNBZGRyQmFzZSwgJnZTcmNBZGRyQmFzZSk7CisKKyAgICB1aW50OF90ICp5RGVzdEFkZHJCYXNlOworICAgIHVpbnQ4X3QgKnVEZXN0QWRkckJhc2U7CisgICAgdWludDhfdCAqdkRlc3RBZGRyQmFzZTsKKyAgICBkZXN0SW1hZ2UuZ2V0WVVWQWRkcmVzc2VzKGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAmeURlc3RBZGRyQmFzZSwgJnVEZXN0QWRkckJhc2UsICZ2RGVzdEFkZHJCYXNlKTsKKworICAgIC8vIEdldCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mZnNldCBpbmNyZW1lbnRzIGluY3VycmVkIGluIGdvaW5nCisgICAgLy8gZnJvbSBvbmUgZGF0YSByb3cgdG8gbmV4dC4KKyAgICBpbnQzMl90IHlTcmNPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1U3JjT2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdlNyY09mZnNldEluY3JlbWVudDsKKyAgICBzcmNJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKKyAgICAgICAgICAgICZ5U3JjT2Zmc2V0SW5jcmVtZW50LCAmdVNyY09mZnNldEluY3JlbWVudCwgJnZTcmNPZmZzZXRJbmNyZW1lbnQpOworCisgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAorICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CisKKyAgICAvLyBDb3B5IFkKKyAgICB7CisgICAgICAgIHNpemVfdCBudW1iZXJPZllCeXRlc1BlclJvdyA9IChzaXplX3QpIHdpZHRoOworICAgICAgICB1aW50OF90ICp5U3JjQWRkciA9IHlTcmNBZGRyQmFzZTsKKyAgICAgICAgdWludDhfdCAqeURlc3RBZGRyID0geURlc3RBZGRyQmFzZTsKKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgaGVpZ2h0OyArK29mZnNldFkpIHsKKyAgICAgICAgICAgIG1lbWNweSh5RGVzdEFkZHIsIHlTcmNBZGRyLCBudW1iZXJPZllCeXRlc1BlclJvdyk7CisKKyAgICAgICAgICAgIHlTcmNBZGRyID0geVNyY0FkZHIgKyB5U3JjT2Zmc2V0SW5jcmVtZW50OworICAgICAgICAgICAgeURlc3RBZGRyID0geURlc3RBZGRyICsgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb3B5IFVWCisgICAgeworICAgICAgICAvLyBVViBhcmUgaW50ZXJsZWF2ZWQuIFNvIG51bWJlciBvZiBVViBieXRlcyBwZXIgcm93IGlzIDIqKHdpZHRoLzIpLgorICAgICAgICBzaXplX3QgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93ID0gKHNpemVfdCkgd2lkdGg7CisgICAgICAgIHVpbnQ4X3QgKnZTcmNBZGRyID0gdlNyY0FkZHJCYXNlOworICAgICAgICB1aW50OF90ICp2RGVzdEFkZHIgPSB2RGVzdEFkZHJCYXNlOworICAgICAgICAvLyBFdmVyeSBvdGhlciBwaXhlbCByb3cgaGFzIGEgVS9WIGRhdGEgcm93LiBIZW5jZSBvbmx5IGdvIGhhbGYgdGhlIGhlaWdodC4KKyAgICAgICAgZm9yIChpbnQzMl90IG9mZnNldFkgPSAwOyBvZmZzZXRZIDwgKGhlaWdodCA+PiAxKTsgKytvZmZzZXRZKSB7CisgICAgICAgICAgICBtZW1jcHkodkRlc3RBZGRyLCB2U3JjQWRkciwgbnVtYmVyT2ZVVkJ5dGVzUGVyUm93KTsKKworICAgICAgICAgICAgdlNyY0FkZHIgKz0gdlNyY09mZnNldEluY3JlbWVudDsKKyAgICAgICAgICAgIHZEZXN0QWRkciArPSB2RGVzdE9mZnNldEluY3JlbWVudDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCitib29sIFlVVkltYWdlOjpmYXN0Q29weVJlY3RhbmdsZSgKKyAgICAgICAgY29uc3QgUmVjdCYgc3JjUmVjdCwKKyAgICAgICAgaW50MzJfdCBkZXN0U3RhcnRYLCBpbnQzMl90IGRlc3RTdGFydFksCisgICAgICAgIGNvbnN0IFlVVkltYWdlICZzcmNJbWFnZSwgWVVWSW1hZ2UgJmRlc3RJbWFnZSkgeworICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IGRlc3RJbWFnZS5tWVVWRm9ybWF0KSB7CisgICAgICAgIGlmIChzcmNJbWFnZS5tWVVWRm9ybWF0ID09IFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGRlc3RTdGFydFgsIGRlc3RTdGFydFksCisgICAgICAgICAgICAgICAgICAgIHNyY0ltYWdlLCBkZXN0SW1hZ2UpOworICAgICAgICB9IGVsc2UgaWYgKHNyY0ltYWdlLm1ZVVZGb3JtYXQgPT0gWVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAgICAgZmFzdENvcHlSZWN0YW5nbGU0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXN0U3RhcnRYLCBkZXN0U3RhcnRZLAorICAgICAgICAgICAgICAgICAgICBzcmNJbWFnZSwgZGVzdEltYWdlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit1aW50OF90IGNsYW1wKHVpbnQ4X3QgdiwgdWludDhfdCBtaW5WYWx1ZSwgdWludDhfdCBtYXhWYWx1ZSkgeworICAgIENIRUNLKG1heFZhbHVlID49IG1pblZhbHVlKTsKKworICAgIGlmICh2IDwgbWluVmFsdWUpIHJldHVybiBtaW5WYWx1ZTsKKyAgICBlbHNlIGlmICh2ID4gbWF4VmFsdWUpIHJldHVybiBtYXhWYWx1ZTsKKyAgICBlbHNlIHJldHVybiB2OworfQorCit2b2lkIFlVVkltYWdlOjp5dXYycmdiKHVpbnQ4X3QgeVZhbHVlLCB1aW50OF90IHVWYWx1ZSwgdWludDhfdCB2VmFsdWUsCisgICAgICAgIHVpbnQ4X3QgKnIsIHVpbnQ4X3QgKmcsIHVpbnQ4X3QgKmIpIGNvbnN0IHsKKyAgICAqciA9IHlWYWx1ZSArICgxLjM3MDcwNSAqICh2VmFsdWUtMTI4KSk7CisgICAgKmcgPSB5VmFsdWUgLSAoMC42OTgwMDEgKiAodlZhbHVlLTEyOCkpIC0gKDAuMzM3NjMzICogKHVWYWx1ZS0xMjgpKTsKKyAgICAqYiA9IHlWYWx1ZSArICgxLjczMjQ0NiAqICh1VmFsdWUtMTI4KSk7CisKKyAgICAqciA9IGNsYW1wKCpyLCAwLCAyNTUpOworICAgICpnID0gY2xhbXAoKmcsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcCgqYiwgMCwgMjU1KTsKK30KKworYm9vbCBZVVZJbWFnZTo6d3JpdGVUb1BQTShjb25zdCBjaGFyICpmaWxlbmFtZSkgY29uc3QgeworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiUDNcbiIpOworICAgIGZwcmludGYoZnAsICIlZCAlZFxuIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOworICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7CisgICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOworCisgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ1ZhbHVlOworICAgICAgICAgICAgdWludDhfdCBiVmFsdWU7CisgICAgICAgICAgICB5dXYycmdiKHlWYWx1ZSwgdVZhbHVlLCB2VmFsdWUsICZyVmFsdWUsICZnVmFsdWUsICZiVmFsdWUpOworCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJWQgJWQgJWRcbiIsIChpbnQzMl90KXJWYWx1ZSwgKGludDMyX3QpZ1ZhbHVlLCAoaW50MzJfdCliVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDJmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ2xpZW50LmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBDdXJzb3IuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGVidWcuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEZXZpY2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cEV2ZW50UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkuY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXF1ZXN0UGFja2V0LmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU2VydmVyLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mby5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9DQUxfTU9EVUxFOj0gbGlibXRwCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UgLURNVFBfSE9TVAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCisKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cENsaWVudC5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwQ3Vyc29yLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERlYnVnLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwRGV2aWNlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBFdmVudFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8uY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SW5mby5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBQYWNrZXQuY3BwICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5LmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldC5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBSZXNwb25zZVBhY2tldC5jcHAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJbmZvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE10cFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9NT0RVTEU6PSBsaWJtdHAKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QKKworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcCBiL21lZGlhL210cC9NdHBDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmNwcApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwQ2xpZW50IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBDbGllbnQuaCIKKyNpbmNsdWRlICJNdHBEZXZpY2UuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjApCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBpc010cERldmljZSh1aW50MTZfdCB2ZW5kb3IsIHVpbnQxNl90IHByb2R1Y3QpIHsKKyAgICAvLyBTYW5kaXNrIFNhbnNhIEZ1emUKKyAgICBpZiAodmVuZG9yID09IDB4MDc4MSAmJiBwcm9kdWN0ID09IDB4NzRjMikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gU2Ftc3VuZyBZUC1aNQorICAgIGlmICh2ZW5kb3IgPT0gMHgwNGU4ICYmIHByb2R1Y3QgPT0gMHg1MDNjKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NsYXNzIE10cENsaWVudFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHJpdmF0ZToKKyAgICBNdHBDbGllbnQqICAgbUNsaWVudDsKKworcHVibGljOgorICAgIE10cENsaWVudFRocmVhZChNdHBDbGllbnQqIGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT50aHJlYWRMb29wKCk7CisgICAgfQorfTsKKworCitNdHBDbGllbnQ6Ok10cENsaWVudCgpCisgICAgOiAgIG1UaHJlYWQoTlVMTCksCisgICAgICAgIG1Vc2JIb3N0Q29udGV4dChOVUxMKSwKKyAgICAgICAgbURvbmUoZmFsc2UpCit7Cit9CisKK010cENsaWVudDo6fk10cENsaWVudCgpIHsKKyAgICB1c2JfaG9zdF9jbGVhbnVwKG1Vc2JIb3N0Q29udGV4dCk7Cit9CisKK2Jvb2wgTXRwQ2xpZW50OjpzdGFydCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtVGhyZWFkKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG1Vc2JIb3N0Q29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKKyAgICBpZiAoIW1Vc2JIb3N0Q29udGV4dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbVRocmVhZCA9IG5ldyBNdHBDbGllbnRUaHJlYWQodGhpcyk7CisgICAgbVRocmVhZC0+cnVuKCJNdHBDbGllbnRUaHJlYWQiKTsKKyAgICAvLyB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGRvIGluaXRpYWwgZGV2aWNlIGRpc2NvdmVyeSBiZWZvcmUgcmV0dXJuaW5nCisgICAgbVRocmVhZFN0YXJ0Q29uZGl0aW9uLndhaXQobU11dGV4KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE10cENsaWVudDo6c3RvcCgpIHsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKK010cERldmljZSogTXRwQ2xpZW50OjpnZXREZXZpY2UoaW50IGlkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VMaXN0W2ldOworICAgICAgICBpZiAoZGV2aWNlLT5nZXRJRCgpID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgTXRwQ2xpZW50Ojp1c2JEZXZpY2VBZGRlZChjb25zdCBjaGFyICpkZXZuYW1lKSB7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIG1Eb25lOworICAgIH0KKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfU1RJTExfSU1BR0UgJiYKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyA9PSAxICYmIC8vIFN0aWxsIEltYWdlIENhcHR1cmUKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAxKSAgICAgLy8gUGljdHVyZSBUcmFuc2ZlciBQcm90b2NvbCAoUElNQSAxNTQ3MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBjYW1lcmE6IFwiJXNcIiBcIiVzXCJcbiIsIHVzYl9kZXZpY2VfZ2V0X21hbnVmYWN0dXJlcl9uYW1lKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZGV2aWNlX2dldF9wcm9kdWN0X25hbWUoZGV2aWNlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVyZmFjZS0+YkludGVyZmFjZUNsYXNzID09IDB4RkYgJiYKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMHhGRiAmJgorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciogaW50ZXJmYWNlTmFtZSA9IHVzYl9kZXZpY2VfZ2V0X3N0cmluZyhkZXZpY2UsIGludGVyZmFjZS0+aUludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VOYW1lIHx8IHN0cmNtcChpbnRlcmZhY2VOYW1lLCAiTVRQIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgYW4gYW5kcm9pZCBzdHlsZSBNVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgTVRQIGRldmljZTogXCIlc1wiIFwiJXNcIlxuIiwgdXNiX2RldmljZV9nZXRfbWFudWZhY3R1cmVyX25hbWUoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfbmFtZShkZXZpY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbG9vayBmb3Igc3BlY2lhbCBjYXNlZCBkZXZpY2VzIGJhc2VkIG9uIHZlbmRvci9wcm9kdWN0IElECisgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvaW5nIHRoaXMgbWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgICAgICAgICAgICAgdWludDE2X3QgdmVuZG9yID0gdXNiX2RldmljZV9nZXRfdmVuZG9yX2lkKGRldmljZSk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvZHVjdCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTXRwRGV2aWNlKHZlbmRvciwgcHJvZHVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFuIE1UUCBvciBQVFAgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IE1UUCBPUyBzdHJpbmcgYW5kIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAvLyBzb21lIG11c2ljIHBsYXllcnMgbmVlZCB0byBzZWUgdGhpcyBiZWZvcmUgZW50ZXJpbmcgTVRQIG1vZGUuCisgICAgICAgICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHVzYl9kZXZpY2Vfc2VuZF9jb250cm9sKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRXxVU0JfVFlQRV9TVEFOREFSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsIChVU0JfRFRfU1RSSU5HIDw8IDgpIHwgMHhFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNpemVvZihidWZmZXIpLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHByaW50ZigidXNiX2RldmljZV9zZW5kX2NvbnRyb2wgcmV0dXJuZWQgJWQgZXJybm86ICVkXG4iLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoImdvdCBNVFAgc3RyaW5nICVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB1c2JfZGV2aWNlX3NlbmRfY29udHJvbChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9JTnxVU0JfUkVDSVBfREVWSUNFfFVTQl9UWVBFX1ZFTkRPUiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCBzaXplb2YoYnVmZmVyKSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJPUyBkZXNjcmlwdG9yIGdvdCAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIE1UUCBzdHJpbmdcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgaGF2ZSBhIGxpa2VseSBNVFAgb3IgUFRQIGRldmljZQorCisgICAgICAgICAgICAvLyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRocmVlIGVuZHBvaW50cworICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX291dF9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW50cl9kZXNjID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZXAgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVwIHx8IGVwLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbURvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgZXBfaW5fZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9vdXRfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXAtPmJtQXR0cmlidXRlcyA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXBfaW50cl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlcF9pbl9kZXNjIHx8ICFlcF9vdXRfZGVzYyB8fCAhZXBfaW50cl9kZXNjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZW5kcG9pbnRzIG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9pbiA9IHVzYl9lbmRwb2ludF9vcGVuKGRldmljZSwgZXBfaW5fZGVzYyk7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcF9vdXQgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX291dF9kZXNjKTsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIgPSB1c2JfZW5kcG9pbnRfb3BlbihkZXZpY2UsIGVwX2ludHJfZGVzYyk7CisKKyAgICAgICAgICAgIGlmICh1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZShkZXZpY2UsIGludGVyZmFjZS0+YkludGVyZmFjZU51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX2NsYWltX2ludGVyZmFjZSBmYWlsZWQgZXJybm86ICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICAgICAgdXNiX2VuZHBvaW50X2Nsb3NlKGVwX2luKTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfb3V0KTsKKyAgICAgICAgICAgICAgICB1c2JfZW5kcG9pbnRfY2xvc2UoZXBfaW50cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNdHBEZXZpY2UqIG10cERldmljZSA9IG5ldyBNdHBEZXZpY2UoZGV2aWNlLCBpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbiwgZXBfb3V0LCBlcF9pbnRyKTsKKyAgICAgICAgICAgIG1EZXZpY2VMaXN0LmFkZChtdHBEZXZpY2UpOworICAgICAgICAgICAgbXRwRGV2aWNlLT5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBkZXZpY2VBZGRlZChtdHBEZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIG1Eb25lOworICAgICAgICB9CisgICAgfQorCisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiBtRG9uZTsKK30KKworYm9vbCBNdHBDbGllbnQ6OnVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoZGV2bmFtZSwgZGV2aWNlLT5nZXREZXZpY2VOYW1lKCkpKSB7CisgICAgICAgICAgICBkZXZpY2VSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBtRGV2aWNlTGlzdC5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgICAgICBMT0dEKCJDYW1lcmEgcmVtb3ZlZCFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dXNiRGlzY292ZXJ5RG9uZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBtVGhyZWFkU3RhcnRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgcmV0dXJuIG1Eb25lOworfQorCitib29sIE10cENsaWVudDo6dGhyZWFkTG9vcCgpIHsKKyAgICB1c2JfaG9zdF9ydW4obVVzYkhvc3RDb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIHVzYl9kaXNjb3ZlcnlfZG9uZSwgdGhpcyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgTXRwQ2xpZW50Ojp1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9hZGRlZCAlc1xuIiwgZGV2bmFtZSk7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEZXZpY2VBZGRlZChkZXZuYW1lKTsKK30KKworaW50IE10cENsaWVudDo6dXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgTE9HRCgidXNiX2RldmljZV9yZW1vdmVkICVzXG4iLCBkZXZuYW1lKTsKKyAgICByZXR1cm4gKChNdHBDbGllbnQgKiljbGllbnRfZGF0YSktPnVzYkRldmljZVJlbW92ZWQoZGV2bmFtZSk7Cit9CisKK2ludCBNdHBDbGllbnQ6OnVzYl9kaXNjb3ZlcnlfZG9uZSh2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIExPR0QoInVzYl9kaXNjb3ZlcnlfZG9uZVxuIik7CisgICAgcmV0dXJuICgoTXRwQ2xpZW50ICopY2xpZW50X2RhdGEpLT51c2JEaXNjb3ZlcnlEb25lKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwQ2xpZW50LmggYi9tZWRpYS9tdHAvTXRwQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YzUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDbGllbnQuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0NMSUVOVF9ICisjZGVmaW5lIF9NVFBfQ0xJRU5UX0gKKworI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCB1c2JfaG9zdF9jb250ZXh0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cENsaWVudFRocmVhZDsKKworY2xhc3MgTXRwQ2xpZW50IHsKK3ByaXZhdGU6CisgICAgTXRwRGV2aWNlTGlzdCAgICAgICAgICAgICAgIG1EZXZpY2VMaXN0OworICAgIE10cENsaWVudFRocmVhZCogICAgICAgICAgICBtVGhyZWFkOworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtVGhyZWFkU3RhcnRDb25kaXRpb247CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogICAgbVVzYkhvc3RDb250ZXh0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cENsaWVudCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBDbGllbnQoKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc3RvcCgpOworCisgICAgaW5saW5lIE10cERldmljZUxpc3QmICAgZ2V0RGV2aWNlTGlzdCgpIHsgcmV0dXJuIG1EZXZpY2VMaXN0OyB9CisgICAgTXRwRGV2aWNlKiAgICAgICAgICAgICAgZ2V0RGV2aWNlKGludCBpZCk7CisKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRldmljZUFkZGVkKE10cERldmljZSAqZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV2aWNlUmVtb3ZlZChNdHBEZXZpY2UgKmRldmljZSkgPSAwOworCitwcml2YXRlOgorICAgIC8vIHRoZXNlIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCBzdG9wIG1vbml0b3JpbmcgVVNCIGFuZCBjbGVhbiB1cAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZUFkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHVzYkRldmljZVJlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgdXNiRGlzY292ZXJ5RG9uZSgpOworCisgICAgZnJpZW5kIGNsYXNzIE10cENsaWVudFRocmVhZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9hZGRlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIGludCAgICAgICAgICAgICAgdXNiX2RldmljZV9yZW1vdmVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICB1c2JfZGlzY292ZXJ5X2RvbmUodm9pZCogY2xpZW50X2RhdGEpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBDdXJzb3IuY3BwIGIvbWVkaWEvbXRwL010cEN1cnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBDdXJzb3IuY3BwCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBDdXJzb3IiCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cENsaWVudC5oIgorI2luY2x1ZGUgIk10cEN1cnNvci5oIgorI2luY2x1ZGUgIk10cERldmljZS5oIgorI2luY2x1ZGUgIk10cERldmljZUluZm8uaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKworCisjaW5jbHVkZSAiYmluZGVyL0N1cnNvcldpbmRvdy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIERldmljZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgREVWSUNFX1JPV19JRCAgICAgICAgICAgMQorI2RlZmluZSBERVZJQ0VfTUFOVUZBQ1RVUkVSICAgICAyCisjZGVmaW5lIERFVklDRV9NT0RFTCAgICAgICAgICAgIDMKKworLyogU3RvcmFnZSBDb2x1bW4gSURzICovCisvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gTXRwQ3Vyc29yLmphdmEgKi8KKyNkZWZpbmUgU1RPUkFHRV9ST1dfSUQgICAgICAgICAgMTAxCisjZGVmaW5lIFNUT1JBR0VfSURFTlRJRklFUiAgICAgIDEwMgorI2RlZmluZSBTVE9SQUdFX0RFU0NSSVBUSU9OICAgICAxMDMKKworLyogT2JqZWN0IENvbHVtbiBJRHMgKi8KKy8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBNdHBDdXJzb3IuamF2YSAqLworI2RlZmluZSBPQkpFQ1RfUk9XX0lEICAgICAgICAgICAgICAgMjAxCisjZGVmaW5lIE9CSkVDVF9TVE9SQUdFX0lEICAgICAgICAgICAyMDIKKyNkZWZpbmUgT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgIDIwMworI2RlZmluZSBPQkpFQ1RfUFJPVEVDVElPTl9TVEFUVVMgICAgMjA0CisjZGVmaW5lIE9CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAyMDUKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0ZPUk1BVCAgICAgICAgIDIwNgorI2RlZmluZSBPQkpFQ1RfVEhVTUJfU0laRSAgICAgICAgICAgMjA3CisjZGVmaW5lIE9CSkVDVF9USFVNQl9XSURUSCAgICAgICAgICAyMDgKKyNkZWZpbmUgT0JKRUNUX1RIVU1CX0hFSUdIVCAgICAgICAgIDIwOQorI2RlZmluZSBPQkpFQ1RfSU1BR0VfV0lEVEggICAgICAgICAgMjEwCisjZGVmaW5lIE9CSkVDVF9JTUFHRV9IRUlHSFQgICAgICAgICAyMTEKKyNkZWZpbmUgT0JKRUNUX0lNQUdFX0RFUFRIICAgICAgICAgIDIxMgorI2RlZmluZSBPQkpFQ1RfUEFSRU5UICAgICAgICAgICAgICAgMjEzCisjZGVmaW5lIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFICAgICAyMTQKKyNkZWZpbmUgT0JKRUNUX0FTU09DSUFUSU9OX0RFU0MgICAgIDIxNQorI2RlZmluZSBPQkpFQ1RfU0VRVUVOQ0VfTlVNQkVSICAgICAgMjE2CisjZGVmaW5lIE9CSkVDVF9OQU1FICAgICAgICAgICAgICAgICAyMTcKKyNkZWZpbmUgT0JKRUNUX0RBVEVfQ1JFQVRFRCAgICAgICAgIDIxOAorI2RlZmluZSBPQkpFQ1RfREFURV9NT0RJRklFRCAgICAgICAgMjE5CisjZGVmaW5lIE9CSkVDVF9LRVlXT1JEUyAgICAgICAgICAgICAyMjAKKyNkZWZpbmUgT0JKRUNUX1RIVU1CICAgICAgICAgICAgICAgIDIyMQorCitNdHBDdXJzb3I6Ok10cEN1cnNvcihNdHBDbGllbnQqIGNsaWVudCwgaW50IHF1ZXJ5VHlwZSwgaW50IGRldmljZUlELAorICAgICAgICAgICAgICAgIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpCisgICAgICAgIDogICBtQ2xpZW50KGNsaWVudCksCisgICAgICAgICAgICBtUXVlcnlUeXBlKHF1ZXJ5VHlwZSksCisgICAgICAgICAgICBtRGV2aWNlSUQoZGV2aWNlSUQpLAorICAgICAgICAgICAgbVN0b3JhZ2VJRChzdG9yYWdlSUQpLAorICAgICAgICAgICAgbVFiamVjdElEKG9iamVjdElEKSwKKyAgICAgICAgICAgIG1Db2x1bW5Db3VudChjb2x1bW5Db3VudCksCisgICAgICAgICAgICBtQ29sdW1ucyhOVUxMKQoreworICAgIGlmIChjb2x1bW5zKSB7CisgICAgICAgIG1Db2x1bW5zID0gbmV3IGludFtjb2x1bW5Db3VudF07CisgICAgICAgIG1lbWNweShtQ29sdW1ucywgY29sdW1ucywgY29sdW1uQ291bnQgKiBzaXplb2YoaW50KSk7CisgICAgfQorfQorCitNdHBDdXJzb3I6On5NdHBDdXJzb3IoKSB7CisgICAgZGVsZXRlW10gbUNvbHVtbnM7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIExPR0QoIk10cEN1cnNvcjo6ZmlsbFdpbmRvdyBtUXVlcnlUeXBlOiAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisKKyAgICBzd2l0Y2ggKG1RdWVyeVR5cGUpIHsKKyAgICAgICAgY2FzZSBERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gZmlsbERldmljZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgREVWSUNFX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxEZXZpY2Uod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRToKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZXMod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9JRDoKKyAgICAgICAgICAgIHJldHVybiBmaWxsU3RvcmFnZSh3aW5kb3csIHN0YXJ0UG9zKTsKKyAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICByZXR1cm4gZmlsbE9iamVjdHMod2luZG93LCAwLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0lEOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3Qod2luZG93LCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgU1RPUkFHRV9DSElMRFJFTjoKKyAgICAgICAgICAgIHJldHVybiBmaWxsT2JqZWN0cyh3aW5kb3csIC0xLCBzdGFydFBvcyk7CisgICAgICAgIGNhc2UgT0JKRUNUX0NISUxEUkVOOgorICAgICAgICAgICAgcmV0dXJuIGZpbGxPYmplY3RzKHdpbmRvdywgbVFiamVjdElELCBzdGFydFBvcyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJNdHBDdXJzb3I6OmZpbGxXaW5kb3c6IHVua25vd24gcXVlcnkgdHlwZSAlZFxuIiwgbVF1ZXJ5VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2VzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZUxpc3QmIGRldmljZUxpc3QgPSBtQ2xpZW50LT5nZXREZXZpY2VMaXN0KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgIE10cERldmljZSogZGV2aWNlID0gZGV2aWNlTGlzdFtpXTsKKyAgICAgICAgaWYgKGZpbGxEZXZpY2Uod2luZG93LCBkZXZpY2UsIHN0YXJ0UG9zKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIHN0YXJ0UG9zKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcykgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKGRldmljZSAmJiBmaWxsRGV2aWNlKHdpbmRvdywgZGV2aWNlLCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlcyhDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBNdHBEZXZpY2UqIGRldmljZSA9IG1DbGllbnQtPmdldERldmljZShtRGV2aWNlSUQpOworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlSURzID0gZGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgaWYgKCFzdG9yYWdlSURzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUlEcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9ICgqc3RvcmFnZUlEcylbaV07CisgICAgICAgIGlmIChmaWxsU3RvcmFnZSh3aW5kb3csIGRldmljZSwgc3RvcmFnZUlELCBzdGFydFBvcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBzdGFydFBvcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIHN0b3JhZ2VJRHM7CisgICAgcmV0dXJuIGNvdW50OworfQorCitpbnQgTXRwQ3Vyc29yOjpmaWxsU3RvcmFnZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxTdG9yYWdlKHdpbmRvdywgZGV2aWNlLCBtU3RvcmFnZUlELCBzdGFydFBvcykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBDdXJzb3I6OmZpbGxPYmplY3RzKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgcGFyZW50LCBpbnQgc3RhcnRQb3MpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgaWYgKCFkZXZpY2UpCisgICAgICAgIHJldHVybiAwOworICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBkZXZpY2UtPmdldE9iamVjdEhhbmRsZXMobVN0b3JhZ2VJRCwgMCwgcGFyZW50KTsKKyAgICBpZiAoIWhhbmRsZXMpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gKCpoYW5kbGVzKVtpXTsKKyAgICAgICAgaWYgKGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIGhhbmRsZSwgc3RhcnRQb3MpKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc3RhcnRQb3MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBjb3VudDsKK30KKworaW50IE10cEN1cnNvcjo6ZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKSB7CisgICAgTXRwRGV2aWNlKiBkZXZpY2UgPSBtQ2xpZW50LT5nZXREZXZpY2UobURldmljZUlEKTsKKyAgICBpZiAoZGV2aWNlICYmIGZpbGxPYmplY3Qod2luZG93LCBkZXZpY2UsIG1RYmplY3RJRCwgc3RhcnRQb3MpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitib29sIE10cEN1cnNvcjo6ZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgTXRwRGV2aWNlKiBkZXZpY2UsIGludCByb3cpIHsKKyAgICBNdHBEZXZpY2VJbmZvKiBkZXZpY2VJbmZvID0gZGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisgICAgaWYgKCFkZXZpY2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtQ29sdW1uc1tpXSkgeworICAgICAgICAgICAgY2FzZSBERVZJQ0VfUk9XX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIGRldmljZS0+Z2V0SUQoKSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVWSUNFX01BTlVGQUNUVVJFUjoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1NYW51ZmFjdHVyZXIsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERFVklDRV9NT0RFTDoKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIGRldmljZUluZm8tPm1Nb2RlbCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbERldmljZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdHBDdXJzb3I6OmZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwgaW50IHJvdykgeworCitMT0dEKCJmaWxsU3RvcmFnZSAlZFxuIiwgc3RvcmFnZUlEKTsKKworICAgIE10cFN0b3JhZ2VJbmZvKiBzdG9yYWdlSW5mbyA9IGRldmljZS0+Z2V0U3RvcmFnZUluZm8oc3RvcmFnZUlEKTsKKyAgICBpZiAoIXN0b3JhZ2VJbmZvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFwcmVwYXJlUm93KHdpbmRvdykpIHsKKyAgICAgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdGV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2x1bW5Db3VudDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobUNvbHVtbnNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgc3RvcmFnZUlELCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVE9SQUdFX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICAgdGV4dCA9IHN0b3JhZ2VJbmZvLT5tVm9sdW1lSWRlbnRpZmllcjsKKyAgICAgICAgICAgICAgICBpZiAoIXRleHQgfHwgIXRleHRbMF0pCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiQ2FtZXJhIFN0b3JhZ2UiOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RPUkFHRV9ERVNDUklQVElPTjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc3RvcmFnZUluZm8tPm1TdG9yYWdlRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0WzBdKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIlN0b3JhZ2UgRGVzY3JpcHRpb24iOworICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgdGV4dCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiZmlsbFN0b3JhZ2U6IHVua25vd24gY29sdW1uICVkXG4iLCBtQ29sdW1uc1tpXSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHN0b3JhZ2VJbmZvOworICAgIHJldHVybiB0cnVlOworCitmYWlsOgorICAgIGRlbGV0ZSBzdG9yYWdlSW5mbzsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpmaWxsT2JqZWN0KEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KSB7CisKKyAgICBNdHBPYmplY3RJbmZvKiBvYmplY3RJbmZvID0gZGV2aWNlLT5nZXRPYmplY3RJbmZvKG9iamVjdElEKTsKKyAgICBpZiAoIW9iamVjdEluZm8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBvYmplY3RJbmZvLT5wcmludCgpOworICAgIGlmICghcHJlcGFyZVJvdyh3aW5kb3cpKSB7CisgICAgICAgIGRlbGV0ZSBvYmplY3RJbmZvOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29sdW1uQ291bnQ7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1Db2x1bW5zW2ldKSB7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9ST1dfSUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TVE9SQUdFX0lEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1TdG9yYWdlSUQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1BST1RFQ1RJT05fU1RBVFVTOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Qcm90ZWN0aW9uU3RhdHVzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tQ29tcHJlc3NlZFNpemUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9USFVNQl9GT1JNQVQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVRodW1iRm9ybWF0LCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfU0laRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dExvbmcod2luZG93LCBvYmplY3RJbmZvLT5tVGh1bWJDb21wcmVzc2VkU2l6ZSwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX1RIVU1CX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUJfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1UaHVtYlBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX1dJRFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeFdpZHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfSU1BR0VfSEVJR0hUOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeEhlaWdodCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0lNQUdFX0RFUFRIOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1JbWFnZVBpeERlcHRoLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfUEFSRU5UOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1QYXJlbnQsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9UWVBFOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvblR5cGUsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9BU1NPQ0lBVElPTl9ERVNDOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1Bc3NvY2lhdGlvbkRlc2MsIHJvdywgaSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9CSkVDVF9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bVNlcXVlbmNlTnVtYmVyLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfTkFNRToKKyAgICAgICAgICAgICAgICBpZiAoIXB1dFN0cmluZyh3aW5kb3csIG9iamVjdEluZm8tPm1OYW1lLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfREFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGlmICghcHV0TG9uZyh3aW5kb3csIG9iamVjdEluZm8tPm1EYXRlQ3JlYXRlZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0RBVEVfTU9ESUZJRUQ6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRMb25nKHdpbmRvdywgb2JqZWN0SW5mby0+bURhdGVNb2RpZmllZCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT0JKRUNUX0tFWVdPUkRTOgorICAgICAgICAgICAgICAgIGlmICghcHV0U3RyaW5nKHdpbmRvdywgb2JqZWN0SW5mby0+bUtleXdvcmRzLCByb3csIGkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPQkpFQ1RfVEhVTUI6CisgICAgICAgICAgICAgICAgaWYgKCFwdXRUaHVtYm5haWwod2luZG93LCBvYmplY3RJRCwgb2JqZWN0SW5mby0+bUZvcm1hdCwgcm93LCBpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJmaWxsU3RvcmFnZTogdW5rbm93biBjb2x1bW4gJWRcbiIsIG1Db2x1bW5zW2ldKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgb2JqZWN0SW5mbzsKKyAgICByZXR1cm4gdHJ1ZTsKKworZmFpbDoKKyAgICBkZWxldGUgb2JqZWN0SW5mbzsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwcmVwYXJlUm93KEN1cnNvcldpbmRvdyogd2luZG93KSB7CisgICAgaWYgKCF3aW5kb3ctPnNldE51bUNvbHVtbnMobUNvbHVtbkNvdW50KSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY2hhbmdlIGNvbHVtbiBjb3VudCBmcm9tICVkIHRvICVkIiwgd2luZG93LT5nZXROdW1Db2x1bW5zKCksIG1Db2x1bW5Db3VudCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmllbGRfc2xvdF90ICogZmllbGREaXIgPSB3aW5kb3ctPmFsbG9jUm93KCk7CisgICAgaWYgKCFmaWVsZERpcikgeworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBmaWVsZERpciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRMb25nKEN1cnNvcldpbmRvdyogd2luZG93LCBpbnQgdmFsdWUsIGludCByb3csIGludCBjb2x1bW4pIHsKKworICAgIGlmICghd2luZG93LT5wdXRMb25nKHJvdywgY29sdW1uLCB2YWx1ZSkpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBzcGFjZSBmb3IgYSBsb25nIGluIGNvbHVtbiAlZCIsIGNvbHVtbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRTdHJpbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGNvbnN0IGNoYXIqIHRleHQsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBpbnQgc2l6ZSA9IHN0cmxlbih0ZXh0KSArIDE7CisgICAgaW50IG9mZnNldCA9IHdpbmRvdy0+YWxsb2Moc2l6ZSk7CisgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgd2luZG93LT5mcmVlTGFzdFJvdygpOworICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyAldSBieXRlcyBmb3IgdGV4dC9ibG9iICVzIiwgc2l6ZSwgdGV4dCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2luZG93LT5jb3B5SW4ob2Zmc2V0LCAoY29uc3QgdWludDhfdCopdGV4dCwgc2l6ZSk7CisKKyAgICAvLyBUaGlzIG11c3QgYmUgdXBkYXRlZCBhZnRlciB0aGUgY2FsbCB0byBhbGxvYygpLCBzaW5jZSB0aGF0CisgICAgLy8gbWF5IG1vdmUgdGhlIGZpZWxkIGFyb3VuZCBpbiB0aGUgd2luZG93CisgICAgZmllbGRfc2xvdF90ICogZmllbGRTbG90ID0gd2luZG93LT5nZXRGaWVsZFNsb3Qocm93LCBjb2x1bW4pOworICAgIGZpZWxkU2xvdC0+dHlwZSA9IEZJRUxEX1RZUEVfU1RSSU5HOworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIub2Zmc2V0ID0gb2Zmc2V0OworICAgIGZpZWxkU2xvdC0+ZGF0YS5idWZmZXIuc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTXRwQ3Vyc29yOjpwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBvYmplY3RJRCwgaW50IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIE10cERldmljZSogZGV2aWNlID0gbUNsaWVudC0+Z2V0RGV2aWNlKG1EZXZpY2VJRCk7CisgICAgdm9pZCogdGh1bWJuYWlsOworICAgIGludCBzaXplLCBvZmZzZXQ7CisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIHRodW1ibmFpbCA9IE5VTEw7CisgICAgICAgIHNpemUgPSBvZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1ibmFpbCA9IGRldmljZS0+Z2V0VGh1bWJuYWlsKG9iamVjdElELCBzaXplKTsKKworICAgICAgICBMT0dWKCJwdXRUaHVtYm5haWw6ICVwLCBzaXplOiAlZFxuIiwgdGh1bWJuYWlsLCBzaXplKTsKKyAgICAgICAgb2Zmc2V0ID0gd2luZG93LT5hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFvZmZzZXQpIHsKKyAgICAgICAgICAgIHdpbmRvdy0+ZnJlZUxhc3RSb3coKTsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCBhbGxvY2F0aW5nICV1IGJ5dGVzIGZvciB0aHVtYm5haWwiLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGh1bWJuYWlsKQorICAgICAgICB3aW5kb3ctPmNvcHlJbihvZmZzZXQsIChjb25zdCB1aW50OF90Kil0aHVtYm5haWwsIHNpemUpOworCisgICAgLy8gVGhpcyBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGNhbGwgdG8gYWxsb2MoKSwgc2luY2UgdGhhdAorICAgIC8vIG1heSBtb3ZlIHRoZSBmaWVsZCBhcm91bmQgaW4gdGhlIHdpbmRvdworICAgIGZpZWxkX3Nsb3RfdCAqIGZpZWxkU2xvdCA9IHdpbmRvdy0+Z2V0RmllbGRTbG90KHJvdywgY29sdW1uKTsKKyAgICBmaWVsZFNsb3QtPnR5cGUgPSBGSUVMRF9UWVBFX0JMT0I7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgZmllbGRTbG90LT5kYXRhLmJ1ZmZlci5zaXplID0gc2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEN1cnNvci5oIGIvbWVkaWEvbXRwL010cEN1cnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODQ3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwQ3Vyc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9DVVJTT1JfSAorI2RlZmluZSBfTVRQX0NVUlNPUl9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEN1cnNvcldpbmRvdzsKKworY2xhc3MgTXRwQ3Vyc29yIHsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIERFVklDRSAgICAgICAgICAgICAgPSAxLAorICAgICAgICBERVZJQ0VfSUQgICAgICAgICAgID0gMiwKKyAgICAgICAgU1RPUkFHRSAgICAgICAgICAgICA9IDMsCisgICAgICAgIFNUT1JBR0VfSUQgICAgICAgICAgPSA0LAorICAgICAgICBPQkpFQ1QgICAgICAgICAgICAgID0gNSwKKyAgICAgICAgT0JKRUNUX0lEICAgICAgICAgICA9IDYsCisgICAgICAgIFNUT1JBR0VfQ0hJTERSRU4gICAgPSA3LAorICAgICAgICBPQkpFQ1RfQ0hJTERSRU4gICAgID0gOCwKKyAgICB9OworCisgICAgTXRwQ2xpZW50KiAgbUNsaWVudDsKKyAgICBpbnQgICAgICAgICBtUXVlcnlUeXBlOworICAgIGludCAgICAgICAgIG1EZXZpY2VJRDsKKyAgICBpbnQgICAgICAgICBtU3RvcmFnZUlEOworICAgIGludCAgICAgICAgIG1RYmplY3RJRDsKKyAgICBpbnQgICAgICAgICBtQ29sdW1uQ291bnQ7CisgICAgaW50KiAgICAgICAgbUNvbHVtbnM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBNdHBDdXJzb3IoTXRwQ2xpZW50KiBjbGllbnQsIGludCBxdWVyeVR5cGUsIGludCBkZXZpY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdG9yYWdlSUQsIGludCBvYmplY3RJRCwgaW50IGNvbHVtbkNvdW50LCBpbnQqIGNvbHVtbnMpOworICAgIHZpcnR1YWwgICAgIH5NdHBDdXJzb3IoKTsKKworICAgIGludCAgICAgICAgIGZpbGxXaW5kb3coQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisKK3ByaXZhdGU6CisgICAgaW50ICAgICAgICAgZmlsbERldmljZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbERldmljZShDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKyAgICBpbnQgICAgICAgICBmaWxsU3RvcmFnZXMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbFN0b3JhZ2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdHMoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBwYXJlbnQsIGludCBzdGFydFBvcyk7CisgICAgaW50ICAgICAgICAgZmlsbE9iamVjdChDdXJzb3JXaW5kb3cqIHdpbmRvdywgaW50IHN0YXJ0UG9zKTsKKworICAgIGJvb2wgICAgICAgIGZpbGxEZXZpY2UoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLCBpbnQgc3RhcnRQb3MpOworICAgIGJvb2wgICAgICAgIGZpbGxTdG9yYWdlKEN1cnNvcldpbmRvdyogd2luZG93LCBNdHBEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIGludCByb3cpOworICAgIGJvb2wgICAgICAgIGZpbGxPYmplY3QoQ3Vyc29yV2luZG93KiB3aW5kb3csIE10cERldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdElELCBpbnQgcm93KTsKKworICAgIGJvb2wgICAgICAgIHByZXBhcmVSb3coQ3Vyc29yV2luZG93KiB3aW5kb3cpOworICAgIGJvb2wgICAgICAgIHB1dExvbmcoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisgICAgYm9vbCAgICAgICAgcHV0U3RyaW5nKEN1cnNvcldpbmRvdyogd2luZG93LCBjb25zdCBjaGFyKiB0ZXh0LCBpbnQgcm93LCBpbnQgY29sdW1uKTsKKyAgICBib29sICAgICAgICBwdXRUaHVtYm5haWwoQ3Vyc29yV2luZG93KiB3aW5kb3csIGludCBvYmplY3RJRCwgaW50IGZvcm1hdCwgaW50IHJvdywgaW50IGNvbHVtbik7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9DVVJTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzhmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERhdGFQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEYXRhUGFja2V0OjpNdHBEYXRhUGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMiksCisgICAgICAgIG1PZmZzZXQoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKK3sKK30KKworTXRwRGF0YVBhY2tldDo6fk10cERhdGFQYWNrZXQoKSB7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cmVzZXQoKSB7CisgICAgTXRwUGFja2V0OjpyZXNldCgpOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnNldE9wZXJhdGlvbkNvZGUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9DT0RFX09GRlNFVCwgY29kZSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6c2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDE2X3QgTXRwRGF0YVBhY2tldDo6Z2V0VUludDE2KCkgeworICAgIGludCBvZmZzZXQgPSBtT2Zmc2V0OworICAgIHVpbnQxNl90IHJlc3VsdCA9ICh1aW50MTZfdCltQnVmZmVyW29mZnNldF0gfCAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCk7CisgICAgbU9mZnNldCArPSAyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IE10cERhdGFQYWNrZXQ6OmdldFVJbnQzMigpIHsKKyAgICBpbnQgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAodWludDMyX3QpbUJ1ZmZlcltvZmZzZXRdIHwgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDJdIDw8IDE2KSAgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpOworICAgIG1PZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBNdHBEYXRhUGFja2V0OjpnZXRVSW50NjQoKSB7CisgICAgaW50IG9mZnNldCA9IG1PZmZzZXQ7CisgICAgdWludDY0X3QgcmVzdWx0ID0gKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0XSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAxXSA8PCA4KSB8CisgICAgICAgICAgICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyAyXSA8PCAxNikgfCAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgM10gPDwgMjQpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCltQnVmZmVyW29mZnNldCArIDRdIDw8IDMyKSB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA1XSA8PCA0MCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW1CdWZmZXJbb2Zmc2V0ICsgNl0gPDwgNDgpICB8ICgodWludDY0X3QpbUJ1ZmZlcltvZmZzZXQgKyA3XSA8PCA1Nik7CisgICAgbU9mZnNldCArPSA4OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6Z2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgdmFsdWVbMF0gPSBnZXRVSW50MzIoKTsKKyAgICB2YWx1ZVsxXSA9IGdldFVJbnQzMigpOworICAgIHZhbHVlWzJdID0gZ2V0VUludDMyKCk7CisgICAgdmFsdWVbM10gPSBnZXRVSW50MzIoKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpnZXRTdHJpbmcoTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpCit7CisgICAgc3RyaW5nLnJlYWRGcm9tUGFja2V0KHRoaXMpOworfQorCitJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDgoKSB7CisgICAgSW50OExpc3QqIHJlc3VsdCA9IG5ldyBJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ4KCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQ4TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQ4KCkgeworICAgIFVJbnQ4TGlzdCogcmVzdWx0ID0gbmV3IFVJbnQ4TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50OCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbnQxNkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFJbnQxNigpIHsKKyAgICBJbnQxNkxpc3QqIHJlc3VsdCA9IG5ldyBJbnQxNkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0SW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVUludDE2TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QVVJbnQxNigpIHsKKyAgICBVSW50MTZMaXN0KiByZXN1bHQgPSBuZXcgVUludDE2TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRVSW50MTYoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW50MzJMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBSW50MzIoKSB7CisgICAgSW50MzJMaXN0KiByZXN1bHQgPSBuZXcgSW50MzJMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldEludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1VJbnQzMkxpc3QqIE10cERhdGFQYWNrZXQ6OmdldEFVSW50MzIoKSB7CisgICAgVUludDMyTGlzdCogcmVzdWx0ID0gbmV3IFVJbnQzMkxpc3Q7CisgICAgaW50IGNvdW50ID0gZ2V0VUludDMyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICByZXN1bHQtPnB1c2goZ2V0VUludDMyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0ludDY0TGlzdCogTXRwRGF0YVBhY2tldDo6Z2V0QUludDY0KCkgeworICAgIEludDY0TGlzdCogcmVzdWx0ID0gbmV3IEludDY0TGlzdDsKKyAgICBpbnQgY291bnQgPSBnZXRVSW50MzIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHJlc3VsdC0+cHVzaChnZXRJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitVSW50NjRMaXN0KiBNdHBEYXRhUGFja2V0OjpnZXRBVUludDY0KCkgeworICAgIFVJbnQ2NExpc3QqIHJlc3VsdCA9IG5ldyBVSW50NjRMaXN0OworICAgIGludCBjb3VudCA9IGdldFVJbnQzMigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcmVzdWx0LT5wdXNoKGdldFVJbnQ2NCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDgoaW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50OCh1aW50OF90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDEpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KXZhbHVlOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxNihpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDE2KHVpbnQxNl90IHZhbHVlKSB7CisgICAgYWxsb2NhdGUobU9mZnNldCArIDIpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50MzIoaW50MzJfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA0KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGlmIChtUGFja2V0U2l6ZSA8IG1PZmZzZXQpCisgICAgICAgIG1QYWNrZXRTaXplID0gbU9mZnNldDsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRVSW50MzIodWludDMyX3QgdmFsdWUpIHsKKyAgICBhbGxvY2F0ZShtT2Zmc2V0ICsgNCk7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBtT2Zmc2V0KQorICAgICAgICBtUGFja2V0U2l6ZSA9IG1PZmZzZXQ7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0SW50NjQoaW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSkgeworICAgIGFsbG9jYXRlKG1PZmZzZXQgKyA4KTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDgpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMzIpICYgMHhGRik7CisgICAgbUJ1ZmZlclttT2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW21PZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworICAgIG1CdWZmZXJbbU9mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gNTYpICYgMHhGRik7CisgICAgaWYgKG1QYWNrZXRTaXplIDwgbU9mZnNldCkKKyAgICAgICAgbVBhY2tldFNpemUgPSBtT2Zmc2V0OworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dEludDEyOChjb25zdCBpbnQxMjhfdCYgdmFsdWUpIHsKKyAgICBwdXRJbnQzMih2YWx1ZVswXSk7CisgICAgcHV0SW50MzIodmFsdWVbMV0pOworICAgIHB1dEludDMyKHZhbHVlWzJdKTsKKyAgICBwdXRJbnQzMih2YWx1ZVszXSk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0VUludDEyOChjb25zdCB1aW50MTI4X3QmIHZhbHVlKSB7CisgICAgcHV0VUludDMyKHZhbHVlWzBdKTsKKyAgICBwdXRVSW50MzIodmFsdWVbMV0pOworICAgIHB1dFVJbnQzMih2YWx1ZVsyXSk7CisgICAgcHV0VUludDMyKHZhbHVlWzNdKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRJbnQxMjgoaW50NjRfdCB2YWx1ZSkgeworICAgIHB1dEludDY0KHZhbHVlKTsKKyAgICBwdXRJbnQ2NCh2YWx1ZSA8IDAgPyAtMSA6IDApOworfQorCit2b2lkIE10cERhdGFQYWNrZXQ6OnB1dFVJbnQxMjgodWludDY0X3QgdmFsdWUpIHsKKyAgICBwdXRVSW50NjQodmFsdWUpOworICAgIHB1dFVJbnQ2NCgwKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50OChjb25zdCBpbnQ4X3QqIHZhbHVlcywgaW50IGNvdW50KSB7CisgICAgcHV0VUludDMyKGNvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dEludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDgoY29uc3QgdWludDhfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0VUludDgoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MTYoY29uc3QgaW50MTZfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IHVpbnQxNl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDE2KGNvbnN0IFVJbnQxNkxpc3QqIHZhbHVlcykgeworICAgIHNpemVfdCBjb3VudCA9ICh2YWx1ZXMgPyB2YWx1ZXMtPnNpemUoKSA6IDApOworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MTYoKCp2YWx1ZXMpW2ldKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50MzIoY29uc3QgaW50MzJfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IHVpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50MzIoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDMyKGNvbnN0IFVJbnQzMkxpc3QqIGxpc3QpIHsKKyAgICBpZiAoIWxpc3QpIHsKKyAgICAgICAgcHV0RW1wdHlBcnJheSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbGlzdC0+c2l6ZSgpOworICAgICAgICBwdXRVSW50MzIoc2l6ZSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgcHV0VUludDMyKCgqbGlzdClbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBSW50NjQoY29uc3QgaW50NjRfdCogdmFsdWVzLCBpbnQgY291bnQpIHsKKyAgICBwdXRVSW50MzIoY291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgcHV0SW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRBVUludDY0KGNvbnN0IHVpbnQ2NF90KiB2YWx1ZXMsIGludCBjb3VudCkgeworICAgIHB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBwdXRVSW50NjQoKnZhbHVlcysrKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgTXRwU3RyaW5nQnVmZmVyJiBzdHJpbmcpIHsKKyAgICBzdHJpbmcud3JpdGVUb1BhY2tldCh0aGlzKTsKK30KKwordm9pZCBNdHBEYXRhUGFja2V0OjpwdXRTdHJpbmcoY29uc3QgY2hhciogcykgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmcocyk7CisgICAgc3RyaW5nLndyaXRlVG9QYWNrZXQodGhpcyk7Cit9CisKK3ZvaWQgTXRwRGF0YVBhY2tldDo6cHV0U3RyaW5nKGNvbnN0IHVpbnQxNl90KiBzdHJpbmcpIHsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmluZ1tpXSkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwdXRVSW50OChjb3VudCA+IDAgPyBjb3VudCArIDEgOiAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIHB1dFVJbnQxNihzdHJpbmdbaV0pOworICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5CisgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgcHV0VUludDE2KDApOworfQorCisjaWZkZWYgTVRQX0RFVklDRSAKK2ludCBNdHBEYXRhUGFja2V0OjpyZWFkKGludCBmZCkgeworICAgIC8vIGZpcnN0IHJlYWQgdGhlIGhlYWRlcgorICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgIT0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8vIHRoZW4gdGhlIGZvbGxvd2luZyBkYXRhCisgICAgaW50IHRvdGFsID0gTXRwUGFja2V0OjpnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VUKTsKKyAgICBpbnQgcmVtYWluaW5nID0gdG90YWwgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldCA9IDo6cmVhZChmZCwgJm1CdWZmZXJbMF0gKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCByZW1haW5pbmcpOworICAgIGlmIChyZXQgIT0gcmVtYWluaW5nKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtUGFja2V0U2l6ZSA9IHRvdGFsOworICAgIG1PZmZzZXQgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIHJldHVybiB0b3RhbDsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OnJlYWREYXRhSGVhZGVyKGludCBmZCkgeworICAgIGludCByZXQgPSA6OnJlYWQoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGUoaW50IGZkKSB7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGR1bXAoKTsKKyAgICAvLyBzZW5kIGhlYWRlciBzZXBhcmF0ZWx5IGZyb20gZGF0YQorICAgIGludCByZXQgPSA6OndyaXRlKGZkLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ID09IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNpemUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworaW50IE10cERhdGFQYWNrZXQ6OndyaXRlRGF0YUhlYWRlcihpbnQgZmQsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoKTsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfREFUQSk7CisgICAgaW50IHJldCA9IDo6d3JpdGUoZmQsIG1CdWZmZXIsIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmIC8vIE1UUF9ERVZJQ0UKKworI2lmZGVmIE1UUF9IT1NUCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIC8vIGZpcnN0IHJlYWQgdGhlIGhlYWRlcgorICAgIGludCBsZW5ndGggPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgbUJ1ZmZlclNpemUpOworICAgIGlmIChsZW5ndGggPj0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgeworICAgICAgICAvLyBsb29rIGF0IHRoZSBsZW5ndGggZmllbGQgdG8gc2VlIGlmIHRoZSBkYXRhIHNwYW5zIG11bHRpcGxlIHBhY2tldHMKKyAgICAgICAgdWludDMyX3QgdG90YWxMZW5ndGggPSBNdHBQYWNrZXQ6OmdldFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQpOworICAgICAgICB3aGlsZSAodG90YWxMZW5ndGggPiBsZW5ndGgpIHsKKyAgICAgICAgICAgIGFsbG9jYXRlKGxlbmd0aCArIG1BbGxvY2F0aW9uSW5jcmVtZW50KTsKKyAgICAgICAgICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciArIGxlbmd0aCwgbUFsbG9jYXRpb25JbmNyZW1lbnQpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIGxlbmd0aCArPSByZXQ7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxlbmd0aCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IGxlbmd0aDsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZERhdGEoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgaW50IGxlbmd0aCkgeworICAgIGludCBwYWNrZXRTaXplID0gdXNiX2VuZHBvaW50X21heF9wYWNrZXQoZXApOworICAgIGludCByZWFkID0gMDsKKyAgICB3aGlsZSAocmVhZCA8IGxlbmd0aCkgeworICAgICAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIChjaGFyICopYnVmZmVyICsgcmVhZCwgcGFja2V0U2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CitwcmludGYoIk10cERhdGFQYWNrZXQ6OnJlYWREYXRhIHJldHVybmluZyAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmVhZCArPSByZXQ7CisgICAgfQorcHJpbnRmKCJNdHBEYXRhUGFja2V0OjpyZWFkRGF0YSByZXR1cm5pbmcgJWRcbiIsIHJlYWQpOworICAgIHJldHVybiByZWFkOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6cmVhZERhdGFIZWFkZXIoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBpbnQgbGVuZ3RoID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIHVzYl9lbmRwb2ludF9tYXhfcGFja2V0KGVwKSk7CisgICAgaWYgKGxlbmd0aCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IGxlbmd0aDsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhSGVhZGVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBNdHBQYWNrZXQ6OnB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIGxlbmd0aCk7CisgICAgTXRwUGFja2V0OjpwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX0RBVEEpOworICAgIGludCByZXQgPSB0cmFuc2ZlcihlcCwgbUJ1ZmZlciwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCkgeworICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIE10cFBhY2tldDo6cHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBKTsKKworICAgIC8vIHNlbmQgaGVhZGVyIHNlcGFyYXRlbHkgZnJvbSBkYXRhCisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0ID09IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpCisgICAgICAgIHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTaXplIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisKK2ludCBNdHBEYXRhUGFja2V0Ojp3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgcGFja2V0U2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhfcGFja2V0KGVwKTsKKyAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICBpbnQgd3JpdGUgPSAobGVuZ3RoID4gcGFja2V0U2l6ZSA/IHBhY2tldFNpemUgOiBsZW5ndGgpOworICAgICAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIGJ1ZmZlciwgd3JpdGUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsZW5ndGggLT0gcmV0OworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDAgPyByZXQgOiAwKTsKK30KKworI2VuZGlmIC8vIE1UUF9IT1NUCisKK3ZvaWQqIE10cERhdGFQYWNrZXQ6OmdldERhdGEoaW50JiBvdXRMZW5ndGgpIGNvbnN0IHsKKyAgICBpbnQgbGVuZ3RoID0gbVBhY2tldFNpemUgLSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgIHZvaWQqIHJlc3VsdCA9IG1hbGxvYyhsZW5ndGgpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBtZW1jcHkocmVzdWx0LCBtQnVmZmVyICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIG91dExlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0TGVuZ3RoID0gMDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjZhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RBVEFfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9EQVRBX1BBQ0tFVF9ICisKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBTdHJpbmdCdWZmZXI7CisKK2NsYXNzIE10cERhdGFQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKK3ByaXZhdGU6CisgICAgLy8gY3VycmVudCBvZmZzZXQgZm9yIGdldC9wdXQgbWV0aG9kcworICAgIGludCAgICAgICAgICAgICAgICAgbU9mZnNldDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cERhdGFQYWNrZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVzZXQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0T3BlcmF0aW9uQ29kZShNdHBPcGVyYXRpb25Db2RlIGNvZGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25JRChNdHBUcmFuc2FjdGlvbklEIGlkKTsKKworICAgIGlubGluZSB1aW50OF90ICAgICAgZ2V0VUludDgoKSB7IHJldHVybiAodWludDhfdCltQnVmZmVyW21PZmZzZXQrK107IH0KKyAgICBpbmxpbmUgaW50OF90ICAgICAgIGdldEludDgoKSB7IHJldHVybiAoaW50OF90KW1CdWZmZXJbbU9mZnNldCsrXTsgfQorICAgIHVpbnQxNl90ICAgICAgICAgICAgZ2V0VUludDE2KCk7CisgICAgaW5saW5lIGludDE2X3QgICAgICBnZXRJbnQxNigpIHsgcmV0dXJuIChpbnQxNl90KWdldFVJbnQxNigpOyB9CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoKTsKKyAgICBpbmxpbmUgaW50MzJfdCAgICAgIGdldEludDMyKCkgeyByZXR1cm4gKGludDMyX3QpZ2V0VUludDMyKCk7IH0KKyAgICB1aW50NjRfdCAgICAgICAgICAgIGdldFVJbnQ2NCgpOworICAgIGlubGluZSBpbnQ2NF90ICAgICAgZ2V0SW50NjQoKSB7IHJldHVybiAoaW50NjRfdClnZXRVSW50NjQoKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgICAgZ2V0VUludDEyOCh1aW50MTI4X3QmIHZhbHVlKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGdldEludDEyOChpbnQxMjhfdCYgdmFsdWUpIHsgZ2V0VUludDEyOCgodWludDEyOF90Jil2YWx1ZSk7IH0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGdldFN0cmluZyhNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CisKKyAgICBJbnQ4TGlzdCogICAgICAgICAgIGdldEFJbnQ4KCk7CisgICAgVUludDhMaXN0KiAgICAgICAgICBnZXRBVUludDgoKTsKKyAgICBJbnQxNkxpc3QqICAgICAgICAgIGdldEFJbnQxNigpOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgZ2V0QVVJbnQxNigpOworICAgIEludDMyTGlzdCogICAgICAgICAgZ2V0QUludDMyKCk7CisgICAgVUludDMyTGlzdCogICAgICAgICBnZXRBVUludDMyKCk7CisgICAgSW50NjRMaXN0KiAgICAgICAgICBnZXRBSW50NjQoKTsKKyAgICBVSW50NjRMaXN0KiAgICAgICAgIGdldEFVSW50NjQoKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0SW50OChpbnQ4X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDgodWludDhfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxNihpbnQxNl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxNih1aW50MTZfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQzMihpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQzMih1aW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQ2NChpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQ2NCh1aW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxMjgoY29uc3QgaW50MTI4X3QmIHZhbHVlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFVJbnQxMjgoY29uc3QgdWludDEyOF90JiB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRJbnQxMjgoaW50NjRfdCB2YWx1ZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTI4KHVpbnQ2NF90IHZhbHVlKTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDgoY29uc3QgaW50OF90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDgoY29uc3QgdWludDhfdCogdmFsdWVzLCBpbnQgY291bnQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDE2KGNvbnN0IGludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MTYoY29uc3QgdWludDE2X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50MTYoY29uc3QgVUludDE2TGlzdCogdmFsdWVzKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFJbnQzMihjb25zdCBpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDMyKGNvbnN0IHVpbnQzMl90KiB2YWx1ZXMsIGludCBjb3VudCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRBVUludDMyKGNvbnN0IFVJbnQzMkxpc3QqIGxpc3QpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0QUludDY0KGNvbnN0IGludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dEFVSW50NjQoY29uc3QgdWludDY0X3QqIHZhbHVlcywgaW50IGNvdW50KTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCBNdHBTdHJpbmdCdWZmZXImIHN0cmluZyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHB1dFN0cmluZyhjb25zdCB1aW50MTZfdCogc3RyaW5nKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIHB1dEVtcHR5U3RyaW5nKCkgeyBwdXRVSW50OCgwKTsgfQorICAgIGlubGluZSB2b2lkICAgICAgICAgcHV0RW1wdHlBcnJheSgpIHsgcHV0VUludDMyKDApOyB9CisKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyBmaWxsIG91ciBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChpbnQgZmQpOworICAgIGludCAgICAgICAgICAgICAgICAgcmVhZERhdGFIZWFkZXIoaW50IGZkKTsKKworICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZURhdGFIZWFkZXIoaW50IGZkLCB1aW50MzJfdCBsZW5ndGgpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkRGF0YShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWREYXRhSGVhZGVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGVEYXRhSGVhZGVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB1aW50MzJfdCBsZW5ndGgpOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApOworICAgIGludCAgICAgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXAsIHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisgICAgaW5saW5lIGJvb2wgICAgICAgICBoYXNEYXRhKCkgY29uc3QgeyByZXR1cm4gbVBhY2tldFNpemUgPiBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOyB9CisgICAgdm9pZCogICAgICAgICAgICAgICBnZXREYXRhKGludCYgb3V0TGVuZ3RoKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RBVEFfUEFDS0VUX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL010cERhdGFiYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjYjAxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKKyNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CitjbGFzcyBNdHBQcm9wZXJ0eTsKKworY2xhc3MgTXRwRGF0YWJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfk10cERhdGFiYXNlKCkge30KKworICAgIC8vIGNhbGxlZCBmcm9tIFNlbmRPYmplY3RJbmZvIHRvIHJlc2VydmUgYSBkYXRhYmFzZSBlbnRyeSBmb3IgdGhlIGluY29taW5nIGZpbGUKKyAgICB2aXJ0dWFsIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGJlZ2luU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IG1vZGlmaWVkKSA9IDA7CisKKyAgICAvLyBjYWxsZWQgdG8gcmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgU2VuZE9iamVjdCBmaWxlIHRyYW5zZmVyCisgICAgLy8gc3VjY2VzcyBzaG91bGQgc2lnbmFsIGEgbm90aWZpY2F0aW9uIG9mIHRoZSBuZXcgb2JqZWN0J3MgY3JlYXRpb24sCisgICAgLy8gZmFpbHVyZSBzaG91bGQgcmVtb3ZlIHRoZSBkYXRhYmFzZSBlbnRyeSBjcmVhdGVkIGluIGJlZ2luU2VuZE9iamVjdAorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RMaXN0KE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpID0gMDsKKworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICAvLyBjYWxsZWUgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXN1bHRzIGZyb20gdGhlc2UKKyAgICAvLyByZXN1bHRzIGNhbiBiZSBOVUxMCisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RGb3JtYXRMaXN0KiAgICBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpID0gMDsKKyAgICB2aXJ0dWFsIE10cE9iamVjdFByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworICAgIHZpcnR1YWwgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgZ2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eVZhbHVlKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHJlc2V0RGV2aWNlUHJvcGVydHkoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nJiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZmlsZUxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBkZWxldGVGaWxlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcykgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXRPYmplY3RQcm9wZXJ0eURlc2MoTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUHJvcGVydHkqICAgICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdGFydGVkKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBzZXNzaW9uRW5kZWQoKSA9IDA7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9EQVRBQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVidWcuY3BwIGIvbWVkaWEvbXRwL010cERlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmIxMDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmNwcApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDb2RlRW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgdWludDE2X3QgY29kZTsKK307CisKK3N0YXRpYyBjb25zdCBDb2RlRW50cnkgc09wZXJhdGlvbkNvZGVzW10gPSB7CisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk8iLCAgICAgICAgICAgICAgMHgxMDAxIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04iLCAgICAgICAgICAgICAgICAgMHgxMDAyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OIiwgICAgICAgICAgICAgICAgMHgxMDAzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMiLCAgICAgICAgICAgICAgMHgxMDA0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPIiwgICAgICAgICAgICAgMHgxMDA1IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFMiLCAgICAgICAgICAgICAgMHgxMDA2IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVMiLCAgICAgICAgICAgMHgxMDA3IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8iLCAgICAgICAgICAgICAgMHgxMDA4IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUIiwgICAgICAgICAgICAgICAgICAgMHgxMDA5IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfVEhVTUIiLCAgICAgICAgICAgICAgICAgICAgMHgxMDBBIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUIiwgICAgICAgICAgICAgICAgMHgxMDBCIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVF9JTkZPIiwgICAgICAgICAgICAgMHgxMDBDIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDBEIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFIiwgICAgICAgICAgICAgMHgxMDBFIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9GT1JNQVRfU1RPUkUiLCAgICAgICAgICAgICAgICAgMHgxMDBGIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UiLCAgICAgICAgICAgICAgICAgMHgxMDEwIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRUxGX1RFU1QiLCAgICAgICAgICAgICAgICAgICAgMHgxMDExIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1RFQ1RJT04iLCAgICAgICAgMHgxMDEyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOIiwgICAgICAgICAgICAgICAgICAgMHgxMDEzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQyIsICAgICAgICAgMHgxMDE0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgICAgMHgxMDE1IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUiLCAgICAgICAgMHgxMDE2IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSIsICAgICAgMHgxMDE3IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9URVJNSU5BVEVfT1BFTl9DQVBUVVJFIiwgICAgICAgMHgxMDE4IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9NT1ZFX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDE5IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCIsICAgICAgICAgICAgICAgICAgMHgxMDFBIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QiLCAgICAgICAgICAgMHgxMDFCIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9JTklUSUFURV9PUEVOX0NBUFRVUkUiLCAgICAgICAgMHgxMDFDIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCIsICAgMHg5ODAxIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQyIsICAgICAgICAgMHg5ODAyIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUUiLCAgICAgICAgMHg5ODAzIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUiLCAgICAgICAgMHg5ODA0IH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVMiLCAgICAgICAgMHg5ODEwIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVMiLCAgICAgICAgMHg5ODExIH0sCisgICAgeyAiTVRQX09QRVJBVElPTl9TS0lQIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ODIwIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNGb3JtYXRDb2Rlc1tdID0geworICAgIHsgIk1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPIiwgICAgICAgICAgICAgIDB4MTAwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNTT0NJQVRJT04iLCAgICAgICAgICAgICAgICAgICAgIDB4MzAwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfU0NSSVBUIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfRVhFQ1VUQUJMRSIsICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfVEVYVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfSFRNTCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfRFBPRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUlGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfV0FWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVAzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVZJIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVBFRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQyB9LAorICAgIHsgIk1UUF9GT1JNQVRfREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfRVhJRl9KUEVHIiwgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRl9FUCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfRkxBU0hQSVgiLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQk1QIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQ0lGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfR0lGIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfSkZJRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQ0QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfUElDVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfUE5HIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVElGRl9JVCIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRSB9LAorICAgIHsgIk1UUF9GT1JNQVRfSlAyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiB9LAorICAgIHsgIk1UUF9GT1JNQVRfSlBYIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFIiwgICAgICAgICAgICAgIDB4QjgwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfV0lORE9XU19JTUFHRV9GT1JNQVQiLCAgICAgICAgICAgIDB4Qjg4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0FVRElPIiwgICAgICAgICAgICAgICAgIDB4QjkwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfV01BIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfT0dHIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUFDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVVESUJMRSIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfRkxBQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX1ZJREVPIiwgICAgICAgICAgICAgICAgIDB4Qjk4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfV01WIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVA0X0NPTlRBSU5FUiIsICAgICAgICAgICAgICAgICAgIDB4Qjk4MiB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVAyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MyB9LAorICAgIHsgIk1UUF9GT1JNQVRfM0dQX0NPTlRBSU5FUiIsICAgICAgICAgICAgICAgICAgIDB4Qjk4NCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04iLCAgICAgICAgICAgIDB4QkEwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTVVMVElNRURJQV9BTEJVTSIsICAgICAgIDB4QkEwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfSU1BR0VfQUxCVU0iLCAgICAgICAgICAgIDB4QkEwMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0iLCAgICAgICAgICAgIDB4QkEwMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fQUxCVU0iLCAgICAgICAgICAgIDB4QkEwNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVZfUExBWUxJU1QiLCAgICAgICAgICAgIDB4QkEwNSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCIsICAgICAgICAgIDB4QkEwNiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU0FHRV9GT0xERVIiLCAgICAgICAgIDB4QkEwNyB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ0hBUFRFUkVEX1BST0RVQ1RJT04iLCAgIDB4QkEwOCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QiLCAgICAgICAgIDB4QkEwOSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfVklERU9fUExBWUxJU1QiLCAgICAgICAgIDB4QkEwQSB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVESUFDQVNUIiwgICAgICAgICAgICAgIDB4QkEwQiB9LAorICAgIHsgIk1UUF9GT1JNQVRfV1BMX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTTNVX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMiB9LAorICAgIHsgIk1UUF9GT1JNQVRfQVNYX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExMyB9LAorICAgIHsgIk1UUF9GT1JNQVRfUExTX1BMQVlMSVNUIiwgICAgICAgICAgICAgICAgICAgIDB4QkExNCB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0RPQ1VNRU5UIiwgICAgICAgICAgICAgIDB4QkE4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfRE9DVU1FTlQiLCAgICAgICAgICAgICAgIDB4QkE4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfWE1MX0RPQ1VNRU5UIiwgICAgICAgICAgICAgICAgICAgIDB4QkE4MiB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCIsICAgICAgICAgICAgICAgIDB4QkE4MyB9LAorICAgIHsgIk1UUF9GT1JNQVRfTUhUX0NPTVBJTEVEX0hUTUxfRE9DVU1FTlQiLCAgICAgIDB4QkE4NCB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfRVhDRUxfU1BSRUFEU0hFRVQiLCAgICAgICAgICAgIDB4QkE4NSB9LAorICAgIHsgIk1UUF9GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04iLCAgICAgIDB4QkE4NiB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX01FU1NBR0UiLCAgICAgICAgICAgICAgIDB4QkIwMCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfTUVTU1NBR0UiLCAgICAgICAgICAgICAgIDB4QkIwMSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QiLCAgICAgICAgICAgICAgIDB4QkI4MCB9LAorICAgIHsgIk1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVCIsICAgICAgICAgICAgICAgIDB4QkI4MSB9LAorICAgIHsgIk1UUF9GT1JNQVRfVkNBUkRfMiIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkI4MiB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IENvZGVFbnRyeSBzT2JqZWN0UHJvcENvZGVzW10gPSB7CisgICAgeyAiTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9GT1JNQVQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST1RFQ1RJT05fU1RBVFVTIiwgICAgICAgICAgICAgICAgICAgICAgMHhEQzAzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX1RZUEUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FTU09DSUFUSU9OX0RFU0MiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQ1JFQVRFRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfTU9ESUZJRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0tFWVdPUkRTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBUkVOVF9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMTE9XRURfRk9MREVSX0NPTlRFTlRTIiwgICAgICAgICAgICAgICAgMHhEQzBDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0hJRERFTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NZU1RFTV9PQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BFUlNJU1RFTlRfVUlEIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NZTkNfSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST1BFUlRZX0JBRyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NSRUFURURfQlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQVVUSE9SRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RFU0NSSVBUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9SRUZFUkVOQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBTkdVQUdFX0xPQ0FMRSIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiIsICAgICAgICAgICAgICAgICAgMHhEQzRCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NPVVJDRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SSUdJTl9MT0NBVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzREIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RBVEVfQURERUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05PTl9DT05TVU1BQkxFIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPUlJVUFRfVU5QTEFZQUJMRSIsICAgICAgICAgICAgICAgICAgICAgMHhEQzUwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIiLCAgICAgICAgICAgICAgICAgMHhEQzUxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9GT1JNQVQiLCAgICAgICAgICAgMHhEQzgxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9TSVpFIiwgICAgICAgICAgICAgMHhEQzgyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQiLCAgICAgICAgICAgMHhEQzgzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9XSURUSCIsICAgICAgICAgICAgMHhEQzg0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EVVJBVElPTiIsICAgICAgICAgMHhEQzg1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EQVRBIiwgICAgICAgICAgICAgMHhEQzg2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1dJRFRIIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0hFSUdIVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RVUkFUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RSQUNLIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0dFTlJFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NSRURJVFMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xZUklDUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEIiwgICAgICAgICAgICAgICAgMHhEQzhGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BST0RVQ0VEX0JZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VTRV9DT1VOVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NLSVBfQ09VTlQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBU1RfQUNDRVNTRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBUkVOVEFMX1JBVElORyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FVEFfR0VOUkUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0NPTVBPU0VSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VGRkVDVElWRV9SQVRJTkciLCAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQlRJVExFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SSUdJTkFMX1JFTEVBU0VfREFURSIsICAgICAgICAgICAgICAgICAgMHhEQzk5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMQlVNX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FMQlVNX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01PT0QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RSTV9TVEFUVVMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQl9ERVNDUklQVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lTX0NST1BQRUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lTX0NPTE9VUl9DT1JSRUNURUQiLCAgICAgICAgICAgICAgICAgICAgMHhEQ0QyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCIsICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RPVEFMX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JJVFJBVEVfVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NBTVBMRV9SQVRFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX05VTUJFUl9PRl9DSEFOTkVMUyIsICAgICAgICAgICAgICAgICAgICAgMHhERTk0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX0JJVF9ERVBUSCIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NDQU5fVFlQRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTk3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX1dBVkVfQ09ERUMiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERTk5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FVRElPX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyIsICAgICAgICAgICAgICAgICAgICAgMHhERTlCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1ZJREVPX0JJVFJBVEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZSQU1FU19QRVJfVEhPVVNBTkRfU0VDT05EUyIsICAgICAgICAgICAgMHhERTlEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0tFWUZSQU1FX0RJU1RBTkNFIiwgICAgICAgICAgICAgICAgICAgICAgMHhERTlFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JVRkZFUl9TSVpFIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VOQ09ESU5HX1FVQUxJVFkiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERUEwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERUExIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0RJU1BMQVlfTkFNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JPRFlfVEVYVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVQkpFQ1QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSSU9SSVRZIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0dJVkVOX05BTUUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01JRERMRV9OQU1FUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBTUlMWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSRUZJWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1NVRkZJWCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX0dJVkVOX05BTUUiLCAgICAgICAgICAgICAgICAgICAgMHhERDA1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX0ZBTUlMWV9OQU1FIiwgICAgICAgICAgICAgICAgICAgMHhERDA2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BSSU1BUlkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDA3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzEiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDA4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX1BFUlNPTkFMXzIiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDA5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzEiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDBBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzIiLCAgICAgICAgICAgICAgICAgICAgICAgMHhERDBCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VNQUlMX09USEVSUyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDBDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZIiwgICAgICAgICAgICAgICAgICAgMHhERDBEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTCIsICAgICAgICAgICAgICAgICAgMHhERDBFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QRVJTT05BTF8yIiwgICAgICAgICAgICAgICAgMHhERDBGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTUyIsICAgICAgICAgICAgICAgICAgMHhERDEwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTU18yIiwgICAgICAgICAgICAgICAgMHhERDExIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEUiLCAgICAgICAgICAgICAgICAgICAgMHhERDEyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiIsICAgICAgICAgICAgICAgICAgMHhERDEzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUFJJTUFSWSIsICAgICAgICAgICAgICAgICAgICAgMHhERDE0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfUEVSU09OQUwiLCAgICAgICAgICAgICAgICAgICAgMHhERDE1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1MiLCAgICAgICAgICAgICAgICAgICAgMHhERDE2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BBR0VSX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDE3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9PVEhFUlMiLCAgICAgICAgICAgICAgICAgICAgMHhERDE4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1MiLCAgICAgICAgICAgICAgICAgICAgMHhERDE5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BFUlNPTkFMX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgMHhERDFBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JVU0lORVNTX1dFQl9BRERSRVNTIiwgICAgICAgICAgICAgICAgICAgMHhERDFCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1MiLCAgICAgICAgICAgICAgMHhERDFDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMiIsICAgICAgICAgICAgMHhERDFEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1NfMyIsICAgICAgICAgICAgMHhERDFFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwiLCAgICAgICAgICAgMHhERDFGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMSIsICAgICAgICAgMHhERDIwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0xJTkVfMiIsICAgICAgICAgMHhERDIxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkiLCAgICAgICAgICAgMHhERDIyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1JFR0lPTiIsICAgICAgICAgMHhERDIzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX1BPU1RBTF9DT0RFIiwgICAgMHhERDI0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkiLCAgICAgICAgMHhERDI1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0ZVTEwiLCAgICAgICAgICAgMHhERDI2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMSIsICAgICAgICAgMHhERDI3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiIsICAgICAgICAgMHhERDI4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NJVFkiLCAgICAgICAgICAgMHhERDI5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1JFR0lPTiIsICAgICAgICAgMHhERDJBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFIiwgICAgMHhERDJCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0NPVU5UUlkiLCAgICAgICAgMHhERDJDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0ZVTEwiLCAgICAgICAgICAgICAgMHhERDJEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMSIsICAgICAgICAgICAgMHhERDJFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMiIsICAgICAgICAgICAgMHhERDJGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NJVFkiLCAgICAgICAgICAgICAgMHhERDMwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiIsICAgICAgICAgICAgMHhERDMxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1BPU1RBTF9DT0RFIiwgICAgICAgMHhERDMyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0NPVU5UUlkiLCAgICAgICAgICAgMHhERDMzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDM0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1BIT05FVElDX09SR0FOSVpBVElPTl9OQU1FIiwgICAgICAgICAgICAgMHhERDM1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1JPTEUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JJUlRIREFURSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDM3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfVE8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfQ0MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfQkNDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfUkVBRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfUkVDRUlWRURfVElNRSIsICAgICAgICAgICAgICAgICAgMHhERDQ0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FU1NBR0VfU0VOREVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQ1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0JFR0lOX1RJTUUiLCAgICAgICAgICAgICAgICAgICAgMHhERDUwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0VORF9USU1FIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDUxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0xPQ0FUSU9OIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDUyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFUVVJUkVEX0FUVEVOREVFUyIsICAgICAgICAgICAgMHhERDU0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX09QVElPTkFMX0FUVEVOREVFUyIsICAgICAgICAgICAgMHhERDU1IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyIsICAgICAgICAgICAgICAgICAgICAgMHhERDU2IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0FDQ0VQVEVEIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDU3IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1RFTlRBVElWRSIsICAgICAgICAgICAgICAgICAgICAgMHhERDU4IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEIiwgICAgICAgICAgICAgICAgICAgICAgMHhERDU5IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFTUFJTkRFUl9USU1FIiwgICAgICAgICAgICAgICAgMHhERDVBIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX09XTkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVCIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0FDVElWSVRZX1NUQVRVUyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVDIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09XTkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVEIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0VESVRPUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVFIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1dFQk1BU1RFUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVGIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9TT1VSQ0UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1VSTF9ERVNUSU5BVElPTiIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RJTUVfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYyIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX09CSkVDVF9CT09LTUFSSyIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYzIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0JZVEVfQk9PS01BUksiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDY0IH0sCisgICAgeyAiTVRQX1BST1BFUlRZX0xBU1RfQlVJTERfREFURSIsICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcwIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX1RJTUVfVE9fTElWRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcxIH0sCisgICAgeyAiTVRQX1BST1BFUlRZX01FRElBX0dVSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcyIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgQ29kZUVudHJ5IHNEZXZpY2VQcm9wQ29kZXNbXSA9IHsKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCIsICAgICAgICAgICAgICAgICAgICAgICAweDUwMDAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JBVFRFUllfTEVWRUwiLCAgICAgICAgICAgICAgICAgICAweDUwMDEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZVTkNUSU9OQUxfTU9ERSIsICAgICAgICAgICAgICAgICAweDUwMDIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMDMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPTVBSRVNTSU9OX1NFVFRJTkciLCAgICAgICAgICAgICAweDUwMDQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1dISVRFX0JBTEFOQ0UiLCAgICAgICAgICAgICAgICAgICAweDUwMDUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZfTlVNQkVSIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDcgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ0FMX0xFTkdUSCIsICAgICAgICAgICAgICAgICAgICAweDUwMDggfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX0RJU1RBTkNFIiwgICAgICAgICAgICAgICAgICAweDUwMDkgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01PREUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMEEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX01FVEVSSU5HX01PREUiLCAgICAgICAgICAweDUwMEIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMEMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1RJTUUiLCAgICAgICAgICAgICAgICAgICAweDUwMEQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX1BST0dSQU1fTU9ERSIsICAgICAgICAgICAweDUwMEUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYIiwgICAgICAgICAgICAgICAgICAweDUwMEYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0JJQVNfQ09NUEVOU0FUSU9OIiwgICAgICAweDUwMTAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RBVEVUSU1FIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NBUFRVUkVfREVMQVkiLCAgICAgICAgICAgICAgICAgICAweDUwMTIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NUSUxMX0NBUFRVUkVfTU9ERSIsICAgICAgICAgICAgICAweDUwMTMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPTlRSQVNUIiwgICAgICAgICAgICAgICAgICAgICAgICAweDUwMTQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NIQVJQTkVTUyIsICAgICAgICAgICAgICAgICAgICAgICAweDUwMTUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RJR0lUQUxfWk9PTSIsICAgICAgICAgICAgICAgICAgICAweDUwMTYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0VGRkVDVF9NT0RFIiwgICAgICAgICAgICAgICAgICAgICAweDUwMTcgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUiIsICAgICAgICAgICAgICAgICAgICAweDUwMTggfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX0lOVEVSVkFMIiwgICAgICAgICAgICAgICAgICAweDUwMTkgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9OVU1CRVIiLCAgICAgICAgICAgICAgICAweDUwMUEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCIsICAgICAgICAgICAgICAweDUwMUIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX01FVEVSSU5HX01PREUiLCAgICAgICAgICAgICAweDUwMUMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1VQTE9BRF9VUkwiLCAgICAgICAgICAgICAgICAgICAgICAweDUwMUQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0FSVElTVCIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMUUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPIiwgICAgICAgICAgICAgICAgICAweDUwMUYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NZTkNIUk9OSVpBVElPTl9QQVJUTkVSIiwgICAgICAgICAweEQ0MDEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FIiwgICAgICAgICAgICAweEQ0MDIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1ZPTFVNRSIsICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ0MDMgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NVUFBPUlRFRF9GT1JNQVRTX09SREVSRUQiLCAgICAgICAweEQ0MDQgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OIiwgICAgICAgICAgICAgICAgICAgICAweEQ0MDUgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX1JBVEUiLCAgICAgICAgICAgICAgICAgICAweEQ0MTAgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX09CSkVDVCIsICAgICAgICAgICAgICAgICAweEQ0MTEgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCIsICAgICAgICAweEQ0MTIgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1NFU1NJT05fSU5JVElBVE9SX1ZFUlNJT05fSU5GTyIsICAweEQ0MDYgfSwKKyAgICB7ICJNVFBfREVWSUNFX1BST1BFUlRZX1BFUkNFSVZFRF9ERVZJQ0VfVFlQRSIsICAgICAgICAgICAweEQ0MDcgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRDb2RlTmFtZSh1aW50MTZfdCBjb2RlLCBjb25zdCBDb2RlRW50cnkqIHRhYmxlKSB7CisgICAgY29uc3QgQ29kZUVudHJ5KiBlbnRyeSA9IHRhYmxlOworICAgIHdoaWxlIChlbnRyeS0+bmFtZSkgeworICAgICAgICBpZiAoZW50cnktPmNvZGUgPT0gY29kZSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS0+bmFtZTsKKyAgICAgICAgZW50cnkrKzsKKyAgICB9CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworY29uc3QgY2hhciogTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKE10cE9wZXJhdGlvbkNvZGUgY29kZSkgeworICAgIHJldHVybiBnZXRDb2RlTmFtZShjb2RlLCBzT3BlcmF0aW9uQ29kZXMpOworfQorCitjb25zdCBjaGFyKiBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKSB7CisgICAgcmV0dXJuIGdldENvZGVOYW1lKGNvZGUsIHNGb3JtYXRDb2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc09iamVjdFByb3BDb2Rlcyk7Cit9CisKK2NvbnN0IGNoYXIqIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpIHsKKyAgICByZXR1cm4gZ2V0Q29kZU5hbWUoY29kZSwgc0RldmljZVByb3BDb2Rlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVidWcuaCBiL21lZGlhL210cC9NdHBEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTNlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVidWcuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFQlVHX0gKKyNkZWZpbmUgX01UUF9ERUJVR19ICisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERlYnVnIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0T3BlcmF0aW9uQ29kZU5hbWUoTXRwT3BlcmF0aW9uQ29kZSBjb2RlKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0Rm9ybWF0Q29kZU5hbWUoTXRwT2JqZWN0Rm9ybWF0IGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRPYmplY3RQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXREZXZpY2VQcm9wQ29kZU5hbWUoTXRwUHJvcGVydHlDb2RlIGNvZGUpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfREVCVUdfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EwMTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cERldmljZSIKKworI2luY2x1ZGUgIk10cERlYnVnLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyNpbmNsdWRlIDx1c2Job3N0L3VzYmhvc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBEZXZpY2U6Ok10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpCisgICAgOiAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpLAorICAgICAgICBtRW5kcG9pbnRJbihlcF9pbiksCisgICAgICAgIG1FbmRwb2ludE91dChlcF9vdXQpLAorICAgICAgICBtRW5kcG9pbnRJbnRyKGVwX2ludHIpLAorICAgICAgICBtRGV2aWNlSW5mbyhOVUxMKSwKKyAgICAgICAgbUlEKHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZChkZXZpY2UpKSwKKyAgICAgICAgbVNlc3Npb25JRCgwKSwKKyAgICAgICAgbVRyYW5zYWN0aW9uSUQoMCkKK3sKK30KKworTXRwRGV2aWNlOjp+TXRwRGV2aWNlKCkgeworICAgIGNsb3NlKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGV2aWNlUHJvcGVydGllcy5zaXplKCk7IGkrKykKKyAgICAgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzW2ldOworfQorCit2b2lkIE10cERldmljZTo6aW5pdGlhbGl6ZSgpIHsKKyAgICBvcGVuU2Vzc2lvbigpOworICAgIG1EZXZpY2VJbmZvID0gZ2V0RGV2aWNlSW5mbygpOworICAgIGlmIChtRGV2aWNlSW5mbykgeworICAgICAgICBtRGV2aWNlSW5mby0+cHJpbnQoKTsKKworICAgICAgICBpZiAobURldmljZUluZm8tPm1EZXZpY2VQcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIE10cERldmljZVByb3BlcnR5IHByb3BDb2RlID0gKCptRGV2aWNlSW5mby0+bURldmljZVByb3BlcnRpZXMpW2ldOworICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IGdldERldmljZVByb3BEZXNjKHByb3BDb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHktPnByaW50KCk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNdHBEZXZpY2U6OmNsb3NlKCkgeworICAgIGlmIChtRGV2aWNlKSB7CisgICAgICAgIHVzYl9kZXZpY2VfcmVsZWFzZV9pbnRlcmZhY2UobURldmljZSwgbUludGVyZmFjZSk7CisgICAgICAgIHVzYl9kZXZpY2VfY2xvc2UobURldmljZSk7CisgICAgICAgIG1EZXZpY2UgPSBOVUxMOworICAgIH0KK30KKworY29uc3QgY2hhciogTXRwRGV2aWNlOjpnZXREZXZpY2VOYW1lKCkgeworICAgIGlmIChtRGV2aWNlKQorICAgICAgICByZXR1cm4gdXNiX2RldmljZV9nZXRfbmFtZShtRGV2aWNlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiPz8/IjsKK30KKworYm9vbCBNdHBEZXZpY2U6Om9wZW5TZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVNlc3Npb25JRCA9IDA7CisgICAgbVRyYW5zYWN0aW9uSUQgPSAwOworICAgIE10cFNlc3Npb25JRCBuZXdTZXNzaW9uID0gMTsKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBuZXdTZXNzaW9uKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fT1BFTl9TRVNTSU9OKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9TRVNTSU9OX0FMUkVBRFlfT1BFTikKKyAgICAgICAgbmV3U2Vzc2lvbiA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMSk7CisgICAgZWxzZSBpZiAocmV0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbVNlc3Npb25JRCA9IG5ld1Nlc3Npb247CisgICAgbVRyYW5zYWN0aW9uSUQgPSAxOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE10cERldmljZTo6Y2xvc2VTZXNzaW9uKCkgeworICAgIC8vIEZJWE1FCisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cERldmljZUluZm8qIE10cERldmljZTo6Z2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBuZXcgTXRwRGV2aWNlSW5mbzsKKyAgICAgICAgaW5mby0+cmVhZChtRGF0YSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhLmdldEFVSW50MzIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cFN0b3JhZ2VJbmZvKiBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJbmZvKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9TVE9SQUdFX0lORk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJlYWREYXRhKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICBNdHBTdG9yYWdlSW5mbyogaW5mbyA9IG5ldyBNdHBTdG9yYWdlSW5mbyhzdG9yYWdlSUQpOworICAgICAgICBpbmZvLT5yZWFkKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RIYW5kbGVMaXN0KiBNdHBEZXZpY2U6OmdldE9iamVjdEhhbmRsZXMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIHN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGZvcm1hdCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDMsIHBhcmVudCk7CisgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSEFORExFUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIHJldHVybiBtRGF0YS5nZXRBVUludDMyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgLy8gRklYTUUgLSB3ZSBtaWdodCB3YW50IHRvIGFkZCBzb21lIGNhY2hpbmcgaGVyZQorCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKKyAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFyZWFkRGF0YSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgaWYgKHJldCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IG5ldyBNdHBPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgIGluZm8tPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQqIE10cERldmljZTo6Z2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9USFVNQikgJiYgcmVhZERhdGEoKSkgeworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gcmVhZFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbURhdGEuZ2V0RGF0YShvdXRMZW5ndGgpOworICAgICAgICB9CisgICAgfQorICAgIG91dExlbmd0aCA9IDA7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OnNlbmRPYmplY3RJbmZvKE10cE9iamVjdEluZm8qIGluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IGluZm8tPm1QYXJlbnQ7CisgICAgaWYgKHBhcmVudCA9PSAwKQorICAgICAgICBwYXJlbnQgPSBNVFBfUEFSRU5UX1JPT1Q7CisKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaW5mby0+bVN0b3JhZ2VJRCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDIsIGluZm8tPm1QYXJlbnQpOworCisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1TdG9yYWdlSUQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tRm9ybWF0KTsKKyAgICBtRGF0YS5wdXRVSW50MTYoaW5mby0+bVByb3RlY3Rpb25TdGF0dXMpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tQ29tcHJlc3NlZFNpemUpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tVGh1bWJGb3JtYXQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tVGh1bWJDb21wcmVzc2VkU2l6ZSk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1UaHVtYlBpeFdpZHRoKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bVRodW1iUGl4SGVpZ2h0KTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUltYWdlUGl4V2lkdGgpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhIZWlnaHQpOworICAgIG1EYXRhLnB1dFVJbnQzMihpbmZvLT5tSW1hZ2VQaXhEZXB0aCk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1QYXJlbnQpOworICAgIG1EYXRhLnB1dFVJbnQxNihpbmZvLT5tQXNzb2NpYXRpb25UeXBlKTsKKyAgICBtRGF0YS5wdXRVSW50MzIoaW5mby0+bUFzc29jaWF0aW9uRGVzYyk7CisgICAgbURhdGEucHV0VUludDMyKGluZm8tPm1TZXF1ZW5jZU51bWJlcik7CisgICAgbURhdGEucHV0U3RyaW5nKGluZm8tPm1OYW1lKTsKKworICAgIGNoYXIgY3JlYXRlZFsxMDBdLCBtb2RpZmllZFsxMDBdOworICAgIGZvcm1hdERhdGVUaW1lKGluZm8tPm1EYXRlQ3JlYXRlZCwgY3JlYXRlZCwgc2l6ZW9mKGNyZWF0ZWQpKTsKKyAgICBmb3JtYXREYXRlVGltZShpbmZvLT5tRGF0ZU1vZGlmaWVkLCBtb2RpZmllZCwgc2l6ZW9mKG1vZGlmaWVkKSk7CisKKyAgICBtRGF0YS5wdXRTdHJpbmcoY3JlYXRlZCk7CisgICAgbURhdGEucHV0U3RyaW5nKG1vZGlmaWVkKTsKKyAgICBpZiAoaW5mby0+bUtleXdvcmRzKQorICAgICAgICBtRGF0YS5wdXRTdHJpbmcoaW5mby0+bUtleXdvcmRzKTsKKyAgICBlbHNlCisgICAgICAgIG1EYXRhLnB1dEVtcHR5U3RyaW5nKCk7CisKKyAgIGlmIChzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8pICYmIHNlbmREYXRhKCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICAgICAgaW5mby0+bVN0b3JhZ2VJRCA9IG1SZXNwb25zZS5nZXRQYXJhbWV0ZXIoMSk7CisgICAgICAgICAgICBpbmZvLT5tUGFyZW50ID0gbVJlc3BvbnNlLmdldFBhcmFtZXRlcigyKTsKKyAgICAgICAgICAgIGluZm8tPm1IYW5kbGUgPSBtUmVzcG9uc2UuZ2V0UGFyYW1ldGVyKDMpOworICAgICAgICAgICAgcmV0dXJuIGluZm8tPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChNdHBPYmplY3RIYW5kbGUpLTE7Cit9CisKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8sIGludCBzcmNGRCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaW50IHJlbWFpbmluZyA9IGluZm8tPm1Db21wcmVzc2VkU2l6ZTsKKyAgICBtUmVxdWVzdC5yZXNldCgpOworICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBpbmZvLT5tSGFuZGxlKTsKKyAgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCkpIHsKKyAgICAgICAgLy8gc2VuZCBkYXRhIGhlYWRlcgorICAgICAgICB3cml0ZURhdGFIZWFkZXIoTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwgcmVtYWluaW5nKTsKKworICAgICAgICBjaGFyIGJ1ZmZlcls2NTUzNl07CisgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWFkKHNyY0ZELCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IG1EYXRhLndyaXRlKG1FbmRwb2ludE91dCwgYnVmZmVyLCBjb3VudCk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgZXJyb3IKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIE10cFJlc3BvbnNlQ29kZSByZXQgPSByZWFkUmVzcG9uc2UoKTsKKyAgICByZXR1cm4gKHJlbWFpbmluZyA9PSAwICYmIHJldCA9PSBNVFBfUkVTUE9OU0VfT0spOworfQorCitib29sIE10cERldmljZTo6ZGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ID09IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OmdldFBhcmVudChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICBpZiAoaW5mbykKKyAgICAgICAgcmV0dXJuIGluZm8tPm1QYXJlbnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK010cE9iamVjdEhhbmRsZSBNdHBEZXZpY2U6OmdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IGdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICBpZiAoaW5mbykKKyAgICAgICAgcmV0dXJuIGluZm8tPm1TdG9yYWdlSUQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK010cFByb3BlcnR5KiBNdHBEZXZpY2U6OmdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1SZXF1ZXN0LnJlc2V0KCk7CisgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGNvZGUpOworICAgIGlmICghc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghcmVhZERhdGEoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgIGlmIChyZXQgPT0gTVRQX1JFU1BPTlNFX09LKSB7CisgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IG5ldyBNdHBQcm9wZXJ0eTsKKyAgICAgICAgcHJvcGVydHktPnJlYWQobURhdGEpOworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjbGFzcyBSZWFkT2JqZWN0VGhyZWFkIDogcHVibGljIFRocmVhZCB7Citwcml2YXRlOgorICAgIE10cERldmljZSogICAgICAgICAgbURldmljZTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBtT2JqZWN0U2l6ZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgIG1Jbml0aWFsRGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1Jbml0aWFsRGF0YUxlbmd0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GRDsKKworcHVibGljOgorICAgIFJlYWRPYmplY3RUaHJlYWQoTXRwRGV2aWNlKiBkZXZpY2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICAgICAgbU9iamVjdFNpemUob2JqZWN0U2l6ZSksCisgICAgICAgICAgbUluaXRpYWxEYXRhKE5VTEwpLAorICAgICAgICAgIG1Jbml0aWFsRGF0YUxlbmd0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5SZWFkT2JqZWN0VGhyZWFkKCkgeworICAgICAgICBpZiAobUZEID49IDApCisgICAgICAgICAgICBjbG9zZShtRkQpOworICAgICAgICBmcmVlKG1Jbml0aWFsRGF0YSk7CisgICAgfQorCisgICAgLy8gcmV0dXJucyBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgaW5pdCgpIHsKKyAgICAgICAgbURldmljZS0+bVJlcXVlc3QucmVzZXQoKTsKKyAgICAgICAgbURldmljZS0+bVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIG1IYW5kbGUpOworICAgICAgICBpZiAobURldmljZS0+c2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUKQorICAgICAgICAgICAgICAgICYmIG1EZXZpY2UtPm1EYXRhLnJlYWREYXRhSGVhZGVyKG1EZXZpY2UtPm1FbmRwb2ludEluKSkgeworCisgICAgICAgICAgICAvLyBtRGF0YSB3aWxsIGNvbnRhaW4gaGVhZGVyIGFuZCBwb3NzaWJseSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3QgZGF0YQorICAgICAgICAgICAgbUluaXRpYWxEYXRhID0gbURldmljZS0+bURhdGEuZ2V0RGF0YShtSW5pdGlhbERhdGFMZW5ndGgpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwaXBlIGZvciB0aGUgY2xpZW50IHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgaW50IHBpcGVmZFsyXTsKKyAgICAgICAgICAgIGlmIChwaXBlKHBpcGVmZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicGlwZSBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRkQgPSBwaXBlZmRbMV07CisgICAgICAgICAgICByZXR1cm4gcGlwZWZkWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgaW50IHJlbWFpbmluZyA9IG1PYmplY3RTaXplOworICAgICAgICBpZiAobUluaXRpYWxEYXRhKSB7CisgICAgICAgICAgICB3cml0ZShtRkQsIG1Jbml0aWFsRGF0YSwgbUluaXRpYWxEYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBtSW5pdGlhbERhdGFMZW5ndGg7CisgICAgICAgICAgICBmcmVlKG1Jbml0aWFsRGF0YSk7CisgICAgICAgICAgICBtSW5pdGlhbERhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBidWZmZXJbMTYzODRdOworICAgICAgICB3aGlsZSAocmVtYWluaW5nID4gMCkgeworICAgICAgICAgICAgaW50IHJlYWRTaXplID0gKHJlbWFpbmluZyA+IHNpemVvZihidWZmZXIpID8gc2l6ZW9mKGJ1ZmZlcikgOiByZW1haW5pbmcpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbURldmljZS0+bURhdGEucmVhZERhdGEobURldmljZS0+bUVuZHBvaW50SW4sIGJ1ZmZlciwgcmVhZFNpemUpOworICAgICAgICAgICAgaW50IHdyaXR0ZW47CisgICAgICAgICAgICBpZiAoY291bnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGludCB3cml0dGVuID0gd3JpdGUobUZELCBidWZmZXIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayBlcnJvcgorICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSBjb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNdHBSZXNwb25zZUNvZGUgcmV0ID0gbURldmljZS0+cmVhZFJlc3BvbnNlKCk7CisgICAgICAgIG1EZXZpY2UtPm1NdXRleC51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKKyAgICAvLyByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIGEgcGlwZSB0byByZWFkIHRoZSBvYmplY3QncyBkYXRhCitpbnQgTXRwRGV2aWNlOjpyZWFkT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKSB7CisgICAgbU11dGV4LmxvY2soKTsKKworICAgIFJlYWRPYmplY3RUaHJlYWQqIHRocmVhZCA9IG5ldyBSZWFkT2JqZWN0VGhyZWFkKHRoaXMsIGhhbmRsZSwgb2JqZWN0U2l6ZSk7CisgICAgaW50IGZkID0gdGhyZWFkLT5pbml0KCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBkZWxldGUgdGhyZWFkOworICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZWFkLT5ydW4oIlJlYWRPYmplY3RUaHJlYWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGZkOworfQorCitib29sIE10cERldmljZTo6c2VuZFJlcXVlc3QoTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24pIHsKKyAgICBMT0dWKCJzZW5kUmVxdWVzdDogJXNcbiIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICBtUmVxdWVzdC5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgaWYgKG1UcmFuc2FjdGlvbklEID4gMCkKKyAgICAgICAgbVJlcXVlc3Quc2V0VHJhbnNhY3Rpb25JRChtVHJhbnNhY3Rpb25JRCsrKTsKKyAgICBpbnQgcmV0ID0gbVJlcXVlc3Qud3JpdGUobUVuZHBvaW50T3V0KTsKKyAgICBtUmVxdWVzdC5kdW1wKCk7CisgICAgcmV0dXJuIChyZXQgPiAwKTsKK30KKworYm9vbCBNdHBEZXZpY2U6OnNlbmREYXRhKCkgeworICAgIExPR1YoInNlbmREYXRhXG4iKTsKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKSk7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIGludCByZXQgPSBtRGF0YS53cml0ZShtRW5kcG9pbnRPdXQpOworICAgIG1EYXRhLmR1bXAoKTsKKyAgICByZXR1cm4gKHJldCA+IDApOworfQorCitib29sIE10cERldmljZTo6cmVhZERhdGEoKSB7CisgICAgbURhdGEucmVzZXQoKTsKKyAgICBpbnQgcmV0ID0gbURhdGEucmVhZChtRW5kcG9pbnRJbik7CisgICAgTE9HVigicmVhZERhdGEgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisgICAgaWYgKHJldCA+PSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKSB7CisgICAgICAgIG1EYXRhLmR1bXAoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dWKCJyZWFkUmVzcG9uc2UgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBNdHBEZXZpY2U6OndyaXRlRGF0YUhlYWRlcihNdHBPcGVyYXRpb25Db2RlIG9wZXJhdGlvbiwgaW50IGRhdGFMZW5ndGgpIHsKKyAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CisgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgIHJldHVybiAoIW1EYXRhLndyaXRlRGF0YUhlYWRlcihtRW5kcG9pbnRPdXQsIGRhdGFMZW5ndGgpKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cERldmljZTo6cmVhZFJlc3BvbnNlKCkgeworICAgIExPR1YoInJlYWRSZXNwb25zZVxuIik7CisgICAgaW50IHJldCA9IG1SZXNwb25zZS5yZWFkKG1FbmRwb2ludEluKTsKKyAgICBpZiAocmV0ID49IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgbVJlc3BvbnNlLmR1bXAoKTsKKyAgICAgICAgcmV0dXJuIG1SZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExPR0QoInJlYWRSZXNwb25zZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5oIGIvbWVkaWEvbXRwL010cERldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjQ5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0gKKyNkZWZpbmUgX01UUF9ERVZJQ0VfSAorCisjaW5jbHVkZSAiTXRwUmVxdWVzdFBhY2tldC5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFR5cGVzLmgiCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCB1c2JfZGV2aWNlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERldmljZUluZm87CitjbGFzcyBNdHBPYmplY3RJbmZvOworY2xhc3MgTXRwU3RvcmFnZUluZm87CisKK2NsYXNzIE10cERldmljZSB7Citwcml2YXRlOgorICAgIHN0cnVjdCB1c2JfZGV2aWNlKiAgICAgIG1EZXZpY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZTsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRJbjsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50KiAgICBtRW5kcG9pbnRPdXQ7CisgICAgc3RydWN0IHVzYl9lbmRwb2ludCogICAgbUVuZHBvaW50SW50cjsKKyAgICBNdHBEZXZpY2VJbmZvKiAgICAgICAgICBtRGV2aWNlSW5mbzsKKyAgICBNdHBQcm9wZXJ0eUxpc3QgICAgICAgICBtRGV2aWNlUHJvcGVydGllczsKKworICAgIC8vIGEgdW5pcXVlIElEIGZvciB0aGUgZGV2aWNlCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUlEOworCisgICAgLy8gY3VycmVudCBzZXNzaW9uIElECisgICAgTXRwU2Vzc2lvbklEICAgICAgICAgICAgbVNlc3Npb25JRDsKKyAgICAvLyBjdXJyZW50IHRyYW5zYWN0aW9uIElECisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICAgICAgbVRyYW5zYWN0aW9uSUQ7CisKKyAgICBNdHBSZXF1ZXN0UGFja2V0ICAgICAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgICAgICBtRGF0YTsKKyAgICBNdHBSZXNwb25zZVBhY2tldCAgICAgICBtUmVzcG9uc2U7CisKKyAgICAvLyB0byBlbnN1cmUgb25seSBvbmUgTVRQIHRyYW5zYWN0aW9uIGF0IGEgdGltZQorICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1NdXRleDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZShzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlLCBpbnQgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludCAqZXBfaW4sIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwX2ludHIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBEZXZpY2UoKTsKKworICAgIGlubGluZSBpbnQgICAgICAgICAgICAgIGdldElEKCkgY29uc3QgeyByZXR1cm4gbUlEOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCk7CisKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBvcGVuU2Vzc2lvbigpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGNsb3NlU2Vzc2lvbigpOworCisgICAgTXRwRGV2aWNlSW5mbyogICAgICAgICAgZ2V0RGV2aWNlSW5mbygpOworICAgIE10cFN0b3JhZ2VJRExpc3QqICAgICAgIGdldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBTdG9yYWdlSW5mbyogICAgICAgICBnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RIYW5kbGVzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpOworICAgIE10cE9iamVjdEluZm8qICAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBzZW5kT2JqZWN0SW5mbyhNdHBPYmplY3RJbmZvKiBpbmZvKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8sIGludCBzcmNGRCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIE10cE9iamVjdEhhbmRsZSAgICAgICAgIGdldFBhcmVudChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBnZXRTdG9yYWdlSUQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisKKyAgICBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKTsKKworICAgIC8vIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBwaXBlIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZWFkT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBvYmplY3RTaXplKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUmVhZE9iamVjdFRocmVhZDsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uKTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kRGF0YSgpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHJlYWREYXRhKCk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgd3JpdGVEYXRhSGVhZGVyKE10cE9wZXJhdGlvbkNvZGUgb3BlcmF0aW9uLCBpbnQgZGF0YUxlbmd0aCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgcmVhZFJlc3BvbnNlKCk7CisKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5MzIyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBEZXZpY2VJbmZvIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cERldmljZUluZm86Ok10cERldmljZUluZm8oKQorICAgIDogICBtU3RhbmRhcmRWZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQoMCksCisgICAgICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uKDApLAorICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYyhOVUxMKSwKKyAgICAgICAgbUZ1bmN0aW9uYWxDb2RlKDApLAorICAgICAgICBtT3BlcmF0aW9ucyhOVUxMKSwKKyAgICAgICAgbUV2ZW50cyhOVUxMKSwKKyAgICAgICAgbURldmljZVByb3BlcnRpZXMoTlVMTCksCisgICAgICAgIG1DYXB0dXJlRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbVBsYXliYWNrRm9ybWF0cyhOVUxMKSwKKyAgICAgICAgbU1hbnVmYWN0dXJlcihOVUxMKSwKKyAgICAgICAgbU1vZGVsKE5VTEwpLAorICAgICAgICBtVmVyc2lvbihOVUxMKSwKKyAgICAgICAgbVNlcmlhbChOVUxMKQoreworfQorCitNdHBEZXZpY2VJbmZvOjp+TXRwRGV2aWNlSW5mbygpIHsKKyAgICBpZiAobVZlbmRvckV4dGVuc2lvbkRlc2MpCisgICAgICAgIGZyZWUobVZlbmRvckV4dGVuc2lvbkRlc2MpOworICAgIGRlbGV0ZSBtT3BlcmF0aW9uczsKKyAgICBkZWxldGUgbUV2ZW50czsKKyAgICBkZWxldGUgbURldmljZVByb3BlcnRpZXM7CisgICAgZGVsZXRlIG1DYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgbVBsYXliYWNrRm9ybWF0czsKKyAgICBpZiAobU1hbnVmYWN0dXJlcikKKyAgICAgICAgZnJlZShtTWFudWZhY3R1cmVyKTsKKyAgICBpZiAobU1vZGVsKQorICAgICAgICBmcmVlKG1Nb2RlbCk7CisgICAgaWYgKG1WZXJzaW9uKQorICAgICAgICBmcmVlKG1WZXJzaW9uKTsKKyAgICBpZiAobVNlcmlhbCkKKyAgICAgICAgZnJlZShtU2VyaWFsKTsKK30KKwordm9pZCBNdHBEZXZpY2VJbmZvOjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworICAgIE10cFN0cmluZ0J1ZmZlciBzdHJpbmc7CisKKyAgICAvLyByZWFkIHRoZSBkZXZpY2UgaW5mbworICAgIG1TdGFuZGFyZFZlcnNpb24gPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVZlbmRvckV4dGVuc2lvbklEID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1WZW5kb3JFeHRlbnNpb25WZXJzaW9uID0gcGFja2V0LmdldFVJbnQxNigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZW5kb3JFeHRlbnNpb25EZXNjID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIG1GdW5jdGlvbmFsQ29kZSA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtT3BlcmF0aW9ucyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbUV2ZW50cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbURldmljZVByb3BlcnRpZXMgPSBwYWNrZXQuZ2V0QVVJbnQxNigpOworICAgIG1DYXB0dXJlRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisgICAgbVBsYXliYWNrRm9ybWF0cyA9IHBhY2tldC5nZXRBVUludDE2KCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbU1hbnVmYWN0dXJlciA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Nb2RlbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1WZXJzaW9uID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVNlcmlhbCA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7Cit9CisKK3ZvaWQgTXRwRGV2aWNlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HVigiRGV2aWNlIEluZm86XG5cdG1TdGFuZGFyZFZlcnNpb246ICVkXG5cdG1WZW5kb3JFeHRlbnNpb25JRDogJWRcblx0bVZlbmRvckV4dGVuc2lvblZlcnNpb255OiAlZFxuIiwKKyAgICAgICAgICAgIG1TdGFuZGFyZFZlcnNpb24sIG1WZW5kb3JFeHRlbnNpb25JRCwgbVZlbmRvckV4dGVuc2lvblZlcnNpb24pOworICAgIExPR1YoIlx0bVZlbmRvckV4dGVuc2lvbkRlc2M6ICVzXG5cdG1GdW5jdGlvbmFsQ29kZTogJWRcblx0bU1hbnVmYWN0dXJlcjogJXNcblx0bU1vZGVsOiAlc1xuXHRtVmVyc2lvbjogJXNcblx0bVNlcmlhbDogJXNcbiIsCisgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uRGVzYywgbUZ1bmN0aW9uYWxDb2RlLCBtTWFudWZhY3R1cmVyLCBtTW9kZWwsIG1WZXJzaW9uLCBtU2VyaWFsKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlSW5mby5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfREVWSUNFX0lORk9fSAorI2RlZmluZSBfTVRQX0RFVklDRV9JTkZPX0gKKworc3RydWN0IHN0YXQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YVBhY2tldDsKKworY2xhc3MgTXRwRGV2aWNlSW5mbyB7CitwdWJsaWM6CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVN0YW5kYXJkVmVyc2lvbjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVmVuZG9yRXh0ZW5zaW9uSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvblZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlbmRvckV4dGVuc2lvbkRlc2M7CisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZ1bmN0aW9uYWxDb2RlOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1PcGVyYXRpb25zOworICAgIFVJbnQxNkxpc3QqICAgICAgICAgICAgIG1FdmVudHM7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiAgbURldmljZVByb3BlcnRpZXM7CisgICAgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgbUNhcHR1cmVGb3JtYXRzOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqICAgIG1QbGF5YmFja0Zvcm1hdHM7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbU1hbnVmYWN0dXJlcjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICBtTW9kZWw7CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVZlcnNpb247CisgICAgY2hhciogICAgICAgICAgICAgICAgICAgbVNlcmlhbDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERldmljZUluZm8oKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwRGV2aWNlSW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0RFVklDRV9JTkZPX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzQ1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cEV2ZW50UGFja2V0IgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWZkZWYgTVRQX0RFVklDRQorI2luY2x1ZGUgPGxpbnV4L3VzYi9mX210cC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJNdHBFdmVudFBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cEV2ZW50UGFja2V0OjpNdHBFdmVudFBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cEV2ZW50UGFja2V0Ojp+TXRwRXZlbnRQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwRXZlbnRQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHN0cnVjdCBtdHBfZXZlbnQgICAgZXZlbnQ7CisKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBtUGFja2V0U2l6ZSk7CisgICAgcHV0VUludDE2KE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQsIE1UUF9DT05UQUlORVJfVFlQRV9FVkVOVCk7CisKKyAgICBldmVudC5kYXRhID0gbUJ1ZmZlcjsKKyAgICBldmVudC5sZW5ndGggPSBtUGFja2V0U2l6ZTsKKyAgICBpbnQgcmV0ID0gOjppb2N0bChmZCwgTVRQX1NFTkRfRVZFTlQsICh1bnNpZ25lZCBsb25nKSZldmVudCk7CisgICAgcmV0dXJuIChyZXQgPCAwID8gcmV0IDogMCk7Cit9CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CitpbnQgTXRwRXZlbnRQYWNrZXQ6OnJlYWQoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApIHsKKyAgICBpbnQgcmV0ID0gdHJhbnNmZXIoZXAsIG1CdWZmZXIsIG1CdWZmZXJTaXplKTsKKyAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oIGIvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZTg2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBFdmVudFBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfRVZFTlRfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9FVkVOVF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwUGFja2V0LmgiCisjaW5jbHVkZSAibXRwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRXZlbnRQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwRXZlbnRQYWNrZXQoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBFdmVudFBhY2tldCgpOworCisjaWZkZWYgTVRQX0RFVklDRQorICAgIC8vIHdyaXRlIG91ciBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKGludCBmZCk7CisjZW5kaWYKKworI2lmZGVmIE1UUF9IT1NUCisgICAgLy8gcmVhZCBvdXIgYnVmZmVyIGZyb20gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICByZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorCisgICAgaW5saW5lIE10cEV2ZW50Q29kZSAgICAgZ2V0RXZlbnRDb2RlKCkgY29uc3QgeyByZXR1cm4gZ2V0Q29udGFpbmVyQ29kZSgpOyB9CisgICAgaW5saW5lIHZvaWQgICAgICAgICAgICAgc2V0RXZlbnRDb2RlKE10cEV2ZW50Q29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9FVkVOVF9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDMwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cE9iamVjdEluZm8iCisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBPYmplY3RJbmZvOjpNdHBPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpCisgICAgOiAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgbVN0b3JhZ2VJRCgwKSwKKyAgICAgICAgbUZvcm1hdCgwKSwKKyAgICAgICAgbVByb3RlY3Rpb25TdGF0dXMoMCksCisgICAgICAgIG1Db21wcmVzc2VkU2l6ZSgwKSwKKyAgICAgICAgbVRodW1iRm9ybWF0KDApLAorICAgICAgICBtVGh1bWJDb21wcmVzc2VkU2l6ZSgwKSwKKyAgICAgICAgbVRodW1iUGl4V2lkdGgoMCksCisgICAgICAgIG1UaHVtYlBpeEhlaWdodCgwKSwKKyAgICAgICAgbUltYWdlUGl4V2lkdGgoMCksCisgICAgICAgIG1JbWFnZVBpeEhlaWdodCgwKSwKKyAgICAgICAgbUltYWdlUGl4RGVwdGgoMCksCisgICAgICAgIG1QYXJlbnQoMCksCisgICAgICAgIG1Bc3NvY2lhdGlvblR5cGUoMCksCisgICAgICAgIG1Bc3NvY2lhdGlvbkRlc2MoMCksCisgICAgICAgIG1TZXF1ZW5jZU51bWJlcigwKSwKKyAgICAgICAgbU5hbWUoTlVMTCksCisgICAgICAgIG1EYXRlQ3JlYXRlZCgwKSwKKyAgICAgICAgbURhdGVNb2RpZmllZCgwKSwKKyAgICAgICAgbUtleXdvcmRzKE5VTEwpCit7Cit9CisKK010cE9iamVjdEluZm86On5NdHBPYmplY3RJbmZvKCkgeworICAgIGlmIChtTmFtZSkKKyAgICAgICAgZnJlZShtTmFtZSk7CisgICAgaWYgKG1LZXl3b3JkcykKKyAgICAgICAgZnJlZShtS2V5d29yZHMpOworfQorCit2b2lkIE10cE9iamVjdEluZm86OnJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZzsKKyAgICB0aW1lX3QgdGltZTsKKworICAgIG1TdG9yYWdlSUQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUZvcm1hdCA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtUHJvdGVjdGlvblN0YXR1cyA9IHBhY2tldC5nZXRVSW50MTYoKTsKKyAgICBtQ29tcHJlc3NlZFNpemUgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVRodW1iRm9ybWF0ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1UaHVtYkNvbXByZXNzZWRTaXplID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYlBpeFdpZHRoID0gcGFja2V0LmdldFVJbnQzMigpOworICAgIG1UaHVtYlBpeEhlaWdodCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhXaWR0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtSW1hZ2VQaXhIZWlnaHQgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbUltYWdlUGl4RGVwdGggPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVBhcmVudCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtQXNzb2NpYXRpb25UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1Bc3NvY2lhdGlvbkRlc2MgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisgICAgbVNlcXVlbmNlTnVtYmVyID0gcGFja2V0LmdldFVJbnQzMigpOworCisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1OYW1lID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBpZiAocGFyc2VEYXRlVGltZSgoY29uc3QgY2hhciopc3RyaW5nLCB0aW1lKSkKKyAgICAgICAgbURhdGVDcmVhdGVkID0gdGltZTsKKworICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nKTsKKyAgICBpZiAocGFyc2VEYXRlVGltZSgoY29uc3QgY2hhciopc3RyaW5nLCB0aW1lKSkKKyAgICAgICAgbURhdGVNb2RpZmllZCA9IHRpbWU7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbUtleXdvcmRzID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBPYmplY3RJbmZvOjpwcmludCgpIHsKKyAgICBMT0dEKCJNdHBPYmplY3QgSW5mbyAlMDhYOiAlc1xuIiwgbUhhbmRsZSwgbU5hbWUpOworICAgIExPR0QoIiAgbVN0b3JhZ2VJRDogJTA4WCBtRm9ybWF0OiAlMDRYIG1Qcm90ZWN0aW9uU3RhdHVzOiAlZFxuIiwKKyAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1Gb3JtYXQsIG1Qcm90ZWN0aW9uU3RhdHVzKTsKKyAgICBMT0dEKCIgIG1Db21wcmVzc2VkU2l6ZTogJWQgbVRodW1iRm9ybWF0OiAlMDRYIG1UaHVtYkNvbXByZXNzZWRTaXplOiAlZFxuIiwKKyAgICAgICAgICAgIG1Db21wcmVzc2VkU2l6ZSwgbUZvcm1hdCwgbVRodW1iQ29tcHJlc3NlZFNpemUpOworICAgIExPR0QoIiAgbVRodW1iUGl4V2lkdGg6ICVkIG1UaHVtYlBpeEhlaWdodDogJWRcbiIsIG1UaHVtYlBpeFdpZHRoLCBtVGh1bWJQaXhIZWlnaHQpOworICAgIExPR0QoIiAgbUltYWdlUGl4V2lkdGg6ICVkIG1JbWFnZVBpeEhlaWdodDogJWQgbUltYWdlUGl4RGVwdGg6ICVkXG4iLAorICAgICAgICAgICAgbUltYWdlUGl4V2lkdGgsIG1JbWFnZVBpeEhlaWdodCwgbUltYWdlUGl4RGVwdGgpOworICAgIExPR0QoIiAgbVBhcmVudDogJTA4WCBtQXNzb2NpYXRpb25UeXBlOiAlMDRYIG1Bc3NvY2lhdGlvbkRlc2M6ICUwNFhcbiIsCisgICAgICAgICAgICBtUGFyZW50LCBtQXNzb2NpYXRpb25UeXBlLCBtQXNzb2NpYXRpb25EZXNjKTsKKyAgICBMT0dEKCIgIG1TZXF1ZW5jZU51bWJlcjogJWQgbURhdGVDcmVhdGVkOiAlZCBtRGF0ZU1vZGlmaWVkOiAlZCBtS2V5d29yZHM6ICVzXG4iLAorICAgICAgICAgICAgbVNlcXVlbmNlTnVtYmVyLCBtRGF0ZUNyZWF0ZWQsIG1EYXRlTW9kaWZpZWQsIG1LZXl3b3Jkcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwT2JqZWN0SW5mby5oIGIvbWVkaWEvbXRwL010cE9iamVjdEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0NDljYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBPYmplY3RJbmZvLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9PQkpFQ1RfSU5GT19ICisjZGVmaW5lIF9NVFBfT0JKRUNUX0lORk9fSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBPYmplY3RJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZUlEOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbUZvcm1hdDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1Qcm90ZWN0aW9uU3RhdHVzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUNvbXByZXNzZWRTaXplOworICAgIE10cE9iamVjdEZvcm1hdCAgICAgbVRodW1iRm9ybWF0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRodW1iQ29tcHJlc3NlZFNpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICBtVGh1bWJQaXhXaWR0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1UaHVtYlBpeEhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1JbWFnZVBpeFdpZHRoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4SGVpZ2h0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUltYWdlUGl4RGVwdGg7CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtUGFyZW50OworICAgIHVpbnQxNl90ICAgICAgICAgICAgbUFzc29jaWF0aW9uVHlwZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Bc3NvY2lhdGlvbkRlc2M7CisgICAgdWludDMyX3QgICAgICAgICAgICBtU2VxdWVuY2VOdW1iZXI7CisgICAgY2hhciogICAgICAgICAgICAgICBtTmFtZTsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlQ3JlYXRlZDsKKyAgICB0aW1lX3QgICAgICAgICAgICAgIG1EYXRlTW9kaWZpZWQ7CisgICAgY2hhciogICAgICAgICAgICAgICBtS2V5d29yZHM7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwT2JqZWN0SW5mbygpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICByZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHByaW50KCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9PQkpFQ1RfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmY4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUGFja2V0IgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFBhY2tldDo6TXRwUGFja2V0KGludCBidWZmZXJTaXplKQorICAgIDogICBtQnVmZmVyKE5VTEwpLAorICAgICAgICBtQnVmZmVyU2l6ZShidWZmZXJTaXplKSwKKyAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQoYnVmZmVyU2l6ZSksCisgICAgICAgIG1QYWNrZXRTaXplKDApCit7CisgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGJ1ZmZlclNpemUpOworICAgIGlmICghbUJ1ZmZlcikgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5ISIpOworICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworTXRwUGFja2V0Ojp+TXRwUGFja2V0KCkgeworICAgIGlmIChtQnVmZmVyKQorICAgICAgICBmcmVlKG1CdWZmZXIpOworfQorCit2b2lkIE10cFBhY2tldDo6cmVzZXQoKSB7CisgICAgYWxsb2NhdGUoTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CisgICAgbVBhY2tldFNpemUgPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOworICAgIG1lbXNldChtQnVmZmVyLCAwLCBtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjphbGxvY2F0ZShpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGxlbmd0aCA+IG1CdWZmZXJTaXplKSB7CisgICAgICAgIGludCBuZXdMZW5ndGggPSBsZW5ndGggKyBtQWxsb2NhdGlvbkluY3JlbWVudDsKKyAgICAgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopcmVhbGxvYyhtQnVmZmVyLCBuZXdMZW5ndGgpOworICAgICAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkhIik7CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJTaXplID0gbmV3TGVuZ3RoOworICAgIH0KK30KKwordm9pZCBNdHBQYWNrZXQ6OmR1bXAoKSB7CisjZGVmaW5lIERVTVBfQllURVNfUEVSX1JPVyAgMTYKKyAgICBjaGFyIGJ1ZmZlcls1MDBdOworICAgIGNoYXIqIGJ1ZnB0ciA9IGJ1ZmZlcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBhY2tldFNpemU7IGkrKykgeworICAgICAgICBzcHJpbnRmKGJ1ZnB0ciwgIiUwMlggIiwgbUJ1ZmZlcltpXSk7CisgICAgICAgIGJ1ZnB0ciArPSBzdHJsZW4oYnVmcHRyKTsKKyAgICAgICAgaWYgKGkgJSBEVU1QX0JZVEVTX1BFUl9ST1cgPT0gKERVTVBfQllURVNfUEVSX1JPVyAtIDEpKSB7CisgICAgICAgICAgICBMT0dWKCIlcyIsIGJ1ZmZlcik7CisgICAgICAgICAgICBidWZwdHIgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZnB0ciAhPSBidWZmZXIpIHsKKyAgICAgICAgLy8gcHJpbnQgbGFzdCBsaW5lCisgICAgICAgIExPR1YoIiVzIiwgYnVmZmVyKTsKKyAgICB9CisgICAgTE9HVigiXG4iKTsKK30KKwordWludDE2X3QgTXRwUGFja2V0OjpnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3QgeworICAgIHJldHVybiAoKHVpbnQxNl90KW1CdWZmZXJbb2Zmc2V0ICsgMV0gPDwgOCkgfCAodWludDE2X3QpbUJ1ZmZlcltvZmZzZXRdOworfQorCit1aW50MzJfdCBNdHBQYWNrZXQ6OmdldFVJbnQzMihpbnQgb2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuICgodWludDMyX3QpbUJ1ZmZlcltvZmZzZXQgKyAzXSA8PCAyNCkgfCAoKHVpbnQzMl90KW1CdWZmZXJbb2Zmc2V0ICsgMl0gPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdCltQnVmZmVyW29mZnNldCArIDFdIDw8IDgpICB8ICh1aW50MzJfdCltQnVmZmVyW29mZnNldF07Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpIHsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSh2YWx1ZSAmIDB4RkYpOworICAgIG1CdWZmZXJbb2Zmc2V0KytdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOworfQorCit2b2lkIE10cFBhY2tldDo6cHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBtQnVmZmVyW29mZnNldCsrXSA9ICh1aW50OF90KSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisgICAgbUJ1ZmZlcltvZmZzZXQrK10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworfQorCit1aW50MTZfdCBNdHBQYWNrZXQ6OmdldENvbnRhaW5lckNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VUKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldENvbnRhaW5lckNvZGUodWludDE2X3QgY29kZSkgeworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX0NPREVfT0ZGU0VULCBjb2RlKTsKK30KKworTXRwVHJhbnNhY3Rpb25JRCBNdHBQYWNrZXQ6OmdldFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVJbnQzMihNVFBfQ09OVEFJTkVSX1RSQU5TQUNUSU9OX0lEX09GRlNFVCk7Cit9CisKK3ZvaWQgTXRwUGFja2V0OjpzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpIHsKKyAgICBwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9UUkFOU0FDVElPTl9JRF9PRkZTRVQsIGlkKTsKK30KKwordWludDMyX3QgTXRwUGFja2V0OjpnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlcXVlc3RQYWNrZXQ6OmdldFBhcmFtZXRlciIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBnZXRVSW50MzIoTVRQX0NPTlRBSU5FUl9QQVJBTUVURVJfT0ZGU0VUICsgKGluZGV4IC0gMSkgKiBzaXplb2YodWludDMyX3QpKTsKK30KKwordm9pZCBNdHBQYWNrZXQ6OnNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IDUpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIHJhbmdlIGluIE10cFJlc3BvbnNlUGFja2V0OjpzZXRQYXJhbWV0ZXIiLCBpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IG9mZnNldCA9IE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCArIChpbmRleCAtIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobVBhY2tldFNpemUgPCBvZmZzZXQgKyBzaXplb2YodWludDMyX3QpKQorICAgICAgICBtUGFja2V0U2l6ZSA9IG9mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisgICAgcHV0VUludDMyKG9mZnNldCwgdmFsdWUpOworfQorCisjaWZkZWYgTVRQX0hPU1QKK2ludCBNdHBQYWNrZXQ6OnRyYW5zZmVyKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwLCB2b2lkKiBidWZmZXIsIGludCBsZW5ndGgpIHsKKyAgICBpZiAodXNiX2VuZHBvaW50X3F1ZXVlKGVwLCBidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgTE9HRSgidXNiX2VuZHBvaW50X3F1ZXVlIGZhaWxlZCwgZXJybm86ICVkIiwgZXJybm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBlcF9udW07CisgICAgcmV0dXJuIHVzYl9lbmRwb2ludF93YWl0KHVzYl9lbmRwb2ludF9nZXRfZGV2aWNlKGVwKSwgJmVwX251bSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuaCBiL21lZGlhL210cC9NdHBQYWNrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUEFDS0VUX0gKKyNkZWZpbmUgX01UUF9QQUNLRVRfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworc3RydWN0IHVzYl9lbmRwb2ludDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBQYWNrZXQgeworCitwcm90ZWN0ZWQ6CisgICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOworICAgIC8vIGN1cnJlbnQgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgaW50ICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkIHdoZW4gcmVzaXppbmcgdGhlIGJ1ZmZlcgorICAgIGludCAgICAgICAgICAgICAgICAgbUFsbG9jYXRpb25JbmNyZW1lbnQ7CisgICAgLy8gc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGFja2V0U2l6ZTsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUGFja2V0KGludCBidWZmZXJTaXplKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NdHBQYWNrZXQoKTsKKworICAgIC8vIHNldHMgcGFja2V0IHNpemUgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHNpemUgYW5kIHNldHMgYnVmZmVyIHRvIHplcm8KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlc2V0KCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGFsbG9jYXRlKGludCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZHVtcCgpOworCisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRDb250YWluZXJDb2RlKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250YWluZXJDb2RlKHVpbnQxNl90IGNvZGUpOworCisgICAgTXRwVHJhbnNhY3Rpb25JRCAgICBnZXRUcmFuc2FjdGlvbklEKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbklEKE10cFRyYW5zYWN0aW9uSUQgaWQpOworCisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldFBhcmFtZXRlcihpbnQgaW5kZXgsIHVpbnQzMl90IHZhbHVlKTsKKworI2lmZGVmIE1UUF9IT1NUCisgICAgaW50ICAgICAgICAgICAgICAgICB0cmFuc2ZlcihzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCwgdm9pZCogYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgdWludDE2X3QgICAgICAgICAgICBnZXRVSW50MTYoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgICBnZXRVSW50MzIoaW50IG9mZnNldCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICAgICBwdXRVSW50MTYoaW50IG9mZnNldCwgdWludDE2X3QgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHV0VUludDMyKGludCBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E5MWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSgpCisgICAgOiAgIG1Db2RlKDApLAorICAgICAgICBtVHlwZSgwKSwKKyAgICAgICAgbVdyaXRlYWJsZShmYWxzZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtRGVmYXVsdFZhbHVlLnN0ciA9IE5VTEw7CisgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworICAgIG1NaW5pbXVtVmFsdWUuc3RyID0gTlVMTDsKKyAgICBtTWF4aW11bVZhbHVlLnN0ciA9IE5VTEw7Cit9CisKK010cFByb3BlcnR5OjpNdHBQcm9wZXJ0eShNdHBQcm9wZXJ0eUNvZGUgcHJvcENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKQorICAgIDogICBtQ29kZShwcm9wQ29kZSksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtV3JpdGVhYmxlKHdyaXRlYWJsZSksCisgICAgICAgIG1EZWZhdWx0QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1EZWZhdWx0QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGgoMCksCisgICAgICAgIG1DdXJyZW50QXJyYXlWYWx1ZXMoTlVMTCksCisgICAgICAgIG1Hcm91cENvZGUoMCksCisgICAgICAgIG1Gb3JtRmxhZyhrRm9ybU5vbmUpLAorICAgICAgICBtRW51bUxlbmd0aCgwKSwKKyAgICAgICAgbUVudW1WYWx1ZXMoTlVMTCkKK3sKKyAgICBtZW1zZXQoJm1EZWZhdWx0VmFsdWUsIDAsIHNpemVvZihtRGVmYXVsdFZhbHVlKSk7CisgICAgbWVtc2V0KCZtQ3VycmVudFZhbHVlLCAwLCBzaXplb2YobUN1cnJlbnRWYWx1ZSkpOworICAgIG1lbXNldCgmbU1pbmltdW1WYWx1ZSwgMCwgc2l6ZW9mKG1NaW5pbXVtVmFsdWUpKTsKKyAgICBtZW1zZXQoJm1NYXhpbXVtVmFsdWUsIDAsIHNpemVvZihtTWF4aW11bVZhbHVlKSk7CisKKyAgICBpZiAoZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTggPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUudTggPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTE2ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51MTYgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDMyOgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTMyID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51MzIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgorICAgICAgICAgICAgICAgIG1EZWZhdWx0VmFsdWUuaTY0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgbURlZmF1bHRWYWx1ZS51NjQgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoInVua25vd24gdHlwZSAlMDRYIGluIE10cFByb3BlcnR5OjpNdHBQcm9wZXJ0eSIsIHR5cGUpOworICAgICAgICB9CisgICAgfQorfQorCitNdHBQcm9wZXJ0eTo6fk10cFByb3BlcnR5KCkgeworICAgIGlmIChtVHlwZSA9PSBNVFBfVFlQRV9TVFIpIHsKKyAgICAgICAgLy8gZnJlZSBhbGwgc3RyaW5ncworICAgICAgICBmcmVlKG1EZWZhdWx0VmFsdWUuc3RyKTsKKyAgICAgICAgZnJlZShtQ3VycmVudFZhbHVlLnN0cik7CisgICAgICAgIGZyZWUobU1pbmltdW1WYWx1ZS5zdHIpOworICAgICAgICBmcmVlKG1NYXhpbXVtVmFsdWUuc3RyKTsKKyAgICAgICAgaWYgKG1EZWZhdWx0QXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURlZmF1bHRBcnJheUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIGZyZWUobURlZmF1bHRBcnJheVZhbHVlc1tpXS5zdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudEFycmF5VmFsdWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1DdXJyZW50QXJyYXlMZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1DdXJyZW50QXJyYXlWYWx1ZXNbaV0uc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUVudW1WYWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVudW1MZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBmcmVlKG1FbnVtVmFsdWVzW2ldLnN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlW10gbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBkZWxldGVbXSBtQ3VycmVudEFycmF5VmFsdWVzOworICAgIGRlbGV0ZVtdIG1FbnVtVmFsdWVzOworfQorCit2b2lkIE10cFByb3BlcnR5OjpyZWFkKE10cERhdGFQYWNrZXQmIHBhY2tldCkgeworCisgICAgbUNvZGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbVdyaXRlYWJsZSA9IChwYWNrZXQuZ2V0VUludDgoKSA9PSAxKTsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBtRGVmYXVsdEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBtQ3VycmVudEFycmF5VmFsdWVzID0gcmVhZEFycmF5VmFsdWVzKHBhY2tldCwgbUN1cnJlbnRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1EZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgaWYgKGlzRGV2aWNlUHJvcGVydHkoKSkKKyAgICAgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKKyAgICB9CisgICAgbUdyb3VwQ29kZSA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBtRm9ybUZsYWcgPSBwYWNrZXQuZ2V0VUludDgoKTsKKworICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgeworICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CisgICAgICAgICAgICByZWFkVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIG1TdGVwU2l6ZSk7CisgICAgfSBlbHNlIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1FbnVtKSB7CisgICAgICAgIG1FbnVtTGVuZ3RoID0gcGFja2V0LmdldFVJbnQxNigpOworICAgICAgICBtRW51bVZhbHVlcyA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW21FbnVtTGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgbUVudW1WYWx1ZXNbaV0pOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGUoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgcGFja2V0LnB1dFVJbnQxNihtQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQxNihtVHlwZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Xcml0ZWFibGUgPyAxIDogMCk7CisKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ2NDoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDY0OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKHBhY2tldCwgbURlZmF1bHRBcnJheVZhbHVlcywgbURlZmF1bHRBcnJheUxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtRGVmYXVsdFZhbHVlKTsKKyAgICB9CisgICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKKyAgICBwYWNrZXQucHV0VUludDgobUZvcm1GbGFnKTsKKyAgICBpZiAobUZvcm1GbGFnID09IGtGb3JtUmFuZ2UpIHsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtU3RlcFNpemUpOworICAgIH0gZWxzZSBpZiAobUZvcm1GbGFnID09IGtGb3JtRW51bSkgeworICAgICAgICBwYWNrZXQucHV0VUludDE2KG1FbnVtTGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW51bUxlbmd0aDsgaSsrKQorICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1FbnVtVmFsdWVzW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnByaW50KCkgeworICAgIExPR1YoIk10cFByb3BlcnR5ICUwNFhcbiIsIG1Db2RlKTsKKyAgICBMT0dWKCIgICAgdHlwZSAlMDRYXG4iLCBtVHlwZSk7CisgICAgTE9HVigiICAgIHdyaXRlYWJsZSAlc1xuIiwgKG1Xcml0ZWFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Cit9CisKK3ZvaWQgTXRwUHJvcGVydHk6OnJlYWRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgdmFsdWUuaTggPSBwYWNrZXQuZ2V0SW50OCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICAgICAgdmFsdWUudTggPSBwYWNrZXQuZ2V0VUludDgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgICAgIHZhbHVlLmkxNiA9IHBhY2tldC5nZXRJbnQxNigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICB2YWx1ZS51MTYgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgICAgICB2YWx1ZS5pMzIgPSBwYWNrZXQuZ2V0SW50MzIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICAgICAgdmFsdWUudTMyID0gcGFja2V0LmdldFVJbnQzMigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgdmFsdWUuaTY0ID0gcGFja2V0LmdldEludDY0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgICAgIHZhbHVlLnU2NCA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LmdldEludDEyOCh2YWx1ZS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQuZ2V0VUludDEyOCh2YWx1ZS51MTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgICAgIHBhY2tldC5nZXRTdHJpbmcoc3RyaW5nQnVmZmVyKTsKKyAgICAgICAgICAgIHZhbHVlLnN0ciA9IHN0cmR1cChzdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6cmVhZFZhbHVlIiwgbVR5cGUpOworICAgIH0KK30KKwordm9pZCBNdHBQcm9wZXJ0eTo6d3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKSB7CisgICAgTXRwU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlcjsKKworICAgIHN3aXRjaCAobVR5cGUpIHsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDgodmFsdWUuaTgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ4OgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQ4KHZhbHVlLnU4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FJTlQxNjoKKyAgICAgICAgICAgIHBhY2tldC5wdXRJbnQxNih2YWx1ZS5pMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgorICAgICAgICBjYXNlIE1UUF9UWVBFX0FVSU5UMTY6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDE2KHZhbHVlLnUxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMzI6CisgICAgICAgICAgICBwYWNrZXQucHV0SW50MzIodmFsdWUuaTMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQzMjoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BVUlOVDMyOgorICAgICAgICAgICAgcGFja2V0LnB1dFVJbnQzMih2YWx1ZS51MzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQUlOVDY0OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDY0KHZhbHVlLmk2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQ2NDoKKyAgICAgICAgICAgIHBhY2tldC5wdXRVSW50NjQodmFsdWUudTY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKKyAgICAgICAgY2FzZSBNVFBfVFlQRV9BSU5UMTI4OgorICAgICAgICAgICAgcGFja2V0LnB1dEludDEyOCh2YWx1ZS5pMTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6CisgICAgICAgIGNhc2UgTVRQX1RZUEVfQVVJTlQxMjg6CisgICAgICAgICAgICBwYWNrZXQucHV0VUludDEyOCh2YWx1ZS51MTI4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9UWVBFX1NUUjoKKyAgICAgICAgICAgIGlmICh2YWx1ZS5zdHIpCisgICAgICAgICAgICAgICAgcGFja2V0LnB1dFN0cmluZyh2YWx1ZS5zdHIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBhY2tldC5wdXRFbXB0eVN0cmluZygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJ1bmtub3duIHR5cGUgJTA0WCBpbiBNdHBQcm9wZXJ0eTo6d3JpdGVWYWx1ZSIsIG1UeXBlKTsKKyAgICB9Cit9CisKK010cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgeworICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKKyAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE10cFByb3BlcnR5Ojp3cml0ZUFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSogdmFsdWVzLCBpbnQgbGVuZ3RoKSB7CisgICAgcGFja2V0LnB1dFVJbnQzMihsZW5ndGgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCB2YWx1ZXNbaV0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmggYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNmYjkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9QUk9QRVJUWV9ICisjZGVmaW5lIF9NVFBfUFJPUEVSVFlfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCitjbGFzcyBNdHBQcm9wZXJ0eSB7CitwdWJsaWM6CisgICAgTXRwUHJvcGVydHlDb2RlICAgICBtQ29kZTsKKyAgICBNdHBEYXRhVHlwZSAgICAgICAgIG1UeXBlOworICAgIGJvb2wgICAgICAgICAgICAgICAgbVdyaXRlYWJsZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1EZWZhdWx0VmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtQ3VycmVudFZhbHVlOworCisgICAgLy8gZm9yIGFycmF5IHR5cGVzCisgICAgaW50ICAgICAgICAgICAgICAgICBtRGVmYXVsdEFycmF5TGVuZ3RoOworICAgIE10cFByb3BlcnR5VmFsdWUqICAgbURlZmF1bHRBcnJheVZhbHVlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1DdXJyZW50QXJyYXlMZW5ndGg7CisgICAgTXRwUHJvcGVydHlWYWx1ZSogICBtQ3VycmVudEFycmF5VmFsdWVzOworCisgICAgZW51bSB7CisgICAgICAgIGtGb3JtTm9uZSA9IDAsCisgICAgICAgIGtGb3JtUmFuZ2UgPSAxLAorICAgICAgICBrRm9ybUVudW0gPSAyLAorICAgIH07CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1Hcm91cENvZGU7CisgICAgdWludDhfdCAgICAgICAgICAgICBtRm9ybUZsYWc7CisKKyAgICAvLyBmb3IgcmFuZ2UgZm9ybQorICAgIE10cFByb3BlcnR5VmFsdWUgICAgbU1pbmltdW1WYWx1ZTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlICAgIG1NYXhpbXVtVmFsdWU7CisgICAgTXRwUHJvcGVydHlWYWx1ZSAgICBtU3RlcFNpemU7CisKKyAgICAvLyBmb3IgZW51bSBmb3JtCisgICAgaW50ICAgICAgICAgICAgICAgICBtRW51bUxlbmd0aDsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIG1FbnVtVmFsdWVzOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkoTXRwUHJvcGVydHlDb2RlIHByb3BDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZWFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gMCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUHJvcGVydHkoKTsKKworICAgIGlubGluZSBNdHBQcm9wZXJ0eUNvZGUgZ2V0UHJvcGVydHlDb2RlKCkgY29uc3QgeyByZXR1cm4gbUNvZGU7IH0KKworICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGUoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKKworICAgIGlubGluZSBib29sICAgICAgICAgaXNEZXZpY2VQcm9wZXJ0eSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAgICgobUNvZGUgJiAweEYwMDApID09IDB4NTAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgobUNvZGUgJiAweEY4MDApID09IDB4RDAwMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgICAgICAgICAgICAgICAgcmVhZFZhbHVlKE10cERhdGFQYWNrZXQmIHBhY2tldCwgTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQsIE10cFByb3BlcnR5VmFsdWUmIHZhbHVlKTsKKyAgICBNdHBQcm9wZXJ0eVZhbHVlKiAgIHJlYWRBcnJheVZhbHVlcyhNdHBEYXRhUGFja2V0JiBwYWNrZXQsIGludCYgbGVuZ3RoKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHdyaXRlQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eVZhbHVlKiB2YWx1ZXMsIGludCBsZW5ndGgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfUFJPUEVSVFlfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlcXVlc3RQYWNrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2U1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVxdWVzdFBhY2tldCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIk10cFJlcXVlc3RQYWNrZXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBSZXF1ZXN0UGFja2V0OjpNdHBSZXF1ZXN0UGFja2V0KCkKKyAgICA6ICAgTXRwUGFja2V0KDUxMikKK3sKK30KKworTXRwUmVxdWVzdFBhY2tldDo6fk10cFJlcXVlc3RQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6cmVhZChpbnQgZmQpIHsKKyAgICBpbnQgcmV0ID0gOjpyZWFkKGZkLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICBtUGFja2V0U2l6ZSA9IHJldDsKKyAgICBlbHNlCisgICAgICAgIG1QYWNrZXRTaXplID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50IChob3N0IG1vZGUpCitpbnQgTXRwUmVxdWVzdFBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludCAqZXApCit7CisgICAgcHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbVBhY2tldFNpemUpOworICAgIHB1dFVJbnQxNihNVFBfQ09OVEFJTkVSX1RZUEVfT0ZGU0VULCBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCk7CisgICAgcmV0dXJuIHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtUGFja2V0U2l6ZSk7Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBSZXF1ZXN0UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVxdWVzdFBhY2tldC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfUkVRVUVTVF9QQUNLRVRfSAorI2RlZmluZSBfTVRQX1JFUVVFU1RfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlcXVlc3RQYWNrZXQgOiBwdWJsaWMgTXRwUGFja2V0IHsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICAgICAgTXRwUmVxdWVzdFBhY2tldCgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFJlcXVlc3RQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyBmaWxsIG91ciBidWZmZXIgd2l0aCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHdyaXRlIG91ciBidWZmZXIgdG8gdGhlIGdpdmVuIGVuZHBvaW50CisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBPcGVyYXRpb25Db2RlICAgIGdldE9wZXJhdGlvbkNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICBzZXRPcGVyYXRpb25Db2RlKE10cE9wZXJhdGlvbkNvZGUgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVFVRVNUX1BBQ0tFVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFJlc3BvbnNlUGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWY3MTRlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwUmVzcG9uc2VQYWNrZXQiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJNdHBSZXNwb25zZVBhY2tldC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK010cFJlc3BvbnNlUGFja2V0OjpNdHBSZXNwb25zZVBhY2tldCgpCisgICAgOiAgIE10cFBhY2tldCg1MTIpCit7Cit9CisKK010cFJlc3BvbnNlUGFja2V0Ojp+TXRwUmVzcG9uc2VQYWNrZXQoKSB7Cit9CisKKyNpZmRlZiBNVFBfREVWSUNFCitpbnQgTXRwUmVzcG9uc2VQYWNrZXQ6OndyaXRlKGludCBmZCkgeworICAgIHB1dFVJbnQzMihNVFBfQ09OVEFJTkVSX0xFTkdUSF9PRkZTRVQsIG1QYWNrZXRTaXplKTsKKyAgICBwdXRVSW50MTYoTVRQX0NPTlRBSU5FUl9UWVBFX09GRlNFVCwgTVRQX0NPTlRBSU5FUl9UWVBFX1JFU1BPTlNFKTsKKyAgICBpbnQgcmV0ID0gOjp3cml0ZShmZCwgbUJ1ZmZlciwgbVBhY2tldFNpemUpOworICAgIHJldHVybiAocmV0IDwgMCA/IHJldCA6IDApOworfQorI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAoraW50IE10cFJlc3BvbnNlUGFja2V0OjpyZWFkKHN0cnVjdCB1c2JfZW5kcG9pbnQgKmVwKSB7CisgICAgaW50IHJldCA9IHRyYW5zZmVyKGVwLCBtQnVmZmVyLCBtQnVmZmVyU2l6ZSk7CisgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgbVBhY2tldFNpemUgPSByZXQ7CisgICAgZWxzZQorICAgICAgICBtUGFja2V0U2l6ZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaCBiL21lZGlhL210cC9NdHBSZXNwb25zZVBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2Y4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwUmVzcG9uc2VQYWNrZXQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX1JFU1BPTlNFX1BBQ0tFVF9ICisjZGVmaW5lIF9NVFBfUkVTUE9OU0VfUEFDS0VUX0gKKworI2luY2x1ZGUgIk10cFBhY2tldC5oIgorI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cFJlc3BvbnNlUGFja2V0IDogcHVibGljIE10cFBhY2tldCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFJlc3BvbnNlUGFja2V0KCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwUmVzcG9uc2VQYWNrZXQoKTsKKworI2lmZGVmIE1UUF9ERVZJQ0UKKyAgICAvLyB3cml0ZSBvdXIgZGF0YSB0byB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgaW50ICAgICAgICAgICAgICAgICB3cml0ZShpbnQgZmQpOworI2VuZGlmCisKKyNpZmRlZiBNVFBfSE9TVAorICAgIC8vIHJlYWQgb3VyIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBlbmRwb2ludAorICAgIGludCAgICAgICAgICAgICAgICAgcmVhZChzdHJ1Y3QgdXNiX2VuZHBvaW50ICplcCk7CisjZW5kaWYKKworICAgIGlubGluZSBNdHBSZXNwb25zZUNvZGUgICAgICBnZXRSZXNwb25zZUNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRDb250YWluZXJDb2RlKCk7IH0KKyAgICBpbmxpbmUgdm9pZCAgICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VDb2RlKE10cFJlc3BvbnNlQ29kZSBjb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzZXRDb250YWluZXJDb2RlKGNvZGUpOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9SRVNQT05TRV9QQUNLRVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNiZDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTAsMCArMSw3MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgorI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCisjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKKyNpbmNsdWRlICJNdHBTZXJ2ZXIuaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgTXRwT3BlcmF0aW9uQ29kZSBrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXNbXSA9IHsKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTywKKyAgICBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTiwKKyAgICBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04sCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFMsCisgICAgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX05VTV9PQkpFQ1RTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9JTkZPLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CLAorICAgIE1UUF9PUEVSQVRJT05fREVMRVRFX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8sCisgICAgTVRQX09QRVJBVElPTl9TRU5EX09CSkVDVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fRk9STUFUX1NUT1JFLAorLy8gICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0UsCisvLyAgICBNVFBfT1BFUkFUSU9OX1NFTEZfVEVTVCwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9URUNUSU9OLAorLy8gICAgTVRQX09QRVJBVElPTl9QT1dFUl9ET1dOLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX0RFU0MsCisgICAgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUsCisgICAgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fVEVSTUlOQVRFX09QRU5fQ0FQVFVSRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNULAorLy8gICAgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QsCisvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSwKKyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVELAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX0RFU0MsCisvLyAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9WQUxVRSwKKy8vICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9QUk9QX1ZBTFVFLAorICAgIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorICAgIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTLAorLy8gICAgTVRQX09QRVJBVElPTl9TS0lQLAorfTsKKworc3RhdGljIGNvbnN0IE10cEV2ZW50Q29kZSBrU3VwcG9ydGVkRXZlbnRDb2Rlc1tdID0geworICAgIE1UUF9FVkVOVF9PQkpFQ1RfQURERUQsCisgICAgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELAorfTsKKworTXRwU2VydmVyOjpNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsCisgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pCisgICAgOiAgIG1GRChmZCksCisgICAgICAgIG1EYXRhYmFzZShkYXRhYmFzZSksCisgICAgICAgIG1GaWxlR3JvdXAoZmlsZUdyb3VwKSwKKyAgICAgICAgbUZpbGVQZXJtaXNzaW9uKGZpbGVQZXJtKSwKKyAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb24oZGlyZWN0b3J5UGVybSksCisgICAgICAgIG1TZXNzaW9uSUQoMCksCisgICAgICAgIG1TZXNzaW9uT3BlbihmYWxzZSksCisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlKGtJbnZhbGlkT2JqZWN0SGFuZGxlKSwKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQoMCksCisgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemUoMCkKK3sKK30KKworTXRwU2VydmVyOjp+TXRwU2VydmVyKCkgeworfQorCit2b2lkIE10cFNlcnZlcjo6YWRkU3RvcmFnZShjb25zdCBjaGFyKiBmaWxlUGF0aCkgeworICAgIGludCBpbmRleCA9IG1TdG9yYWdlcy5zaXplKCkgKyAxOworICAgIGluZGV4IHw9IGluZGV4IDw8IDE2OyAgIC8vIHNldCBoaWdoIGFuZCBsb3cgcGFydCB0byBvdXIgaW5kZXgKKyAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gbmV3IE10cFN0b3JhZ2UoaW5kZXgsIGZpbGVQYXRoLCBtRGF0YWJhc2UpOworICAgIGFkZFN0b3JhZ2Uoc3RvcmFnZSk7Cit9CisKK010cFN0b3JhZ2UqIE10cFNlcnZlcjo6Z2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gIG1TdG9yYWdlc1tpXTsKKyAgICAgICAgaWYgKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2U7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE10cFNlcnZlcjo6cnVuKCkgeworICAgIGludCBmZCA9IG1GRDsKKworICAgIExPR1YoIk10cFNlcnZlcjo6cnVuIGZkOiAlZFxuIiwgZmQpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHJldCA9IG1SZXF1ZXN0LnJlYWQoZmQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgTE9HRSgicmVxdWVzdCByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgICAgIE10cFRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb24gPSBtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCk7CisKKyAgICAgICAgTE9HVigib3BlcmF0aW9uOiAlcyIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgbVJlcXVlc3QuZHVtcCgpOworCisgICAgICAgIC8vIEZJWE1FIG5lZWQgdG8gZ2VuZXJhbGl6ZSB0aGlzCisgICAgICAgIGJvb2wgZGF0YUluID0gKG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8KKyAgICAgICAgICAgICAgICAgICAgfHwgb3BlcmF0aW9uID09IE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTCisgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRQorICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUpOworICAgICAgICBpZiAoZGF0YUluKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChmZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImRhdGEgcmVhZCByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dWKCJyZWNlaXZlZCBkYXRhOiIpOworICAgICAgICAgICAgbURhdGEuZHVtcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbURhdGEucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYW5kbGVSZXF1ZXN0KCkpIHsKKyAgICAgICAgICAgIGlmICghZGF0YUluICYmIG1EYXRhLmhhc0RhdGEoKSkgeworICAgICAgICAgICAgICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUob3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBtRGF0YS5zZXRUcmFuc2FjdGlvbklEKHRyYW5zYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIGRhdGE6Iik7CisgICAgICAgICAgICAgICAgcmV0ID0gbURhdGEud3JpdGUoZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3Qgd3JpdGUgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CisgICAgICAgICAgICBMT0dWKCJzZW5kaW5nIHJlc3BvbnNlICUwNFgiLCBtUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICAgICAgcmV0ID0gbVJlc3BvbnNlLndyaXRlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdG8gdG9wIG9mIGxvb3AgYW5kIHdhaXQgZm9yIG5leHQgY29tbWFuZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyByZXNwb25zZVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVNlc3Npb25PcGVuKQorICAgICAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOworfQorCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBpZiAobVNlc3Npb25PcGVuKSB7CisgICAgICAgIExPR0QoInNlbmRPYmplY3RBZGRlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShNVFBfRVZFTlRfT0JKRUNUX0FEREVEKTsKKyAgICAgICAgbUV2ZW50LnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICAgICAgbUV2ZW50LnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbUV2ZW50LndyaXRlKG1GRCk7CisgICAgICAgIExPR0QoIm1FdmVudC53cml0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKyAgICB9Cit9CisKK3ZvaWQgTXRwU2VydmVyOjpzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBMT0dEKCJzZW5kT2JqZWN0UmVtb3ZlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQpOworICAgICAgICBtRXZlbnQuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOworICAgICAgICBtRXZlbnQuc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CisgICAgICAgIGludCByZXQgPSBtRXZlbnQud3JpdGUobUZEKTsKKyAgICAgICAgTE9HRCgibUV2ZW50LndyaXRlIHJldHVybmVkICVkXG4iLCByZXQpOworICAgIH0KK30KKworYm9vbCBNdHBTZXJ2ZXI6OmhhbmRsZVJlcXVlc3QoKSB7CisgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3BvbnNlOworCisgICAgbVJlc3BvbnNlLnJlc2V0KCk7CisKKyAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKKyAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQorICAgICAgICBMT0dFKCJleHBlY3RlZCBTZW5kT2JqZWN0IGFmdGVyIFNlbmRPYmplY3RJbmZvIik7CisgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CisgICAgfQorCisgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX09QRU5fU0VTU0lPTjoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9PcGVuU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9DTE9TRV9TRVNTSU9OOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0Nsb3NlU2Vzc2lvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JRFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRTdG9yYWdlSW5mbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0hBTkRMRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfTlVNX09CSkVDVFM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0TnVtT2JqZWN0cygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1JFRkVSRU5DRVM6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9TZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZVByb3BWYWx1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUU6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1JFU0VUX0RFVklDRV9QUk9QX1ZBTFVFOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb1Jlc2V0RGV2aWNlUHJvcFZhbHVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfSU5GTzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RJbmZvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0T2JqZWN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk86CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvU2VuZE9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0RlbGV0ZU9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VQcm9wRGVzYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlSW5mbygpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgICBzdHJpbmc7CisgICAgY2hhciBwcm9wX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBwbGF5YmFja0Zvcm1hdHMgPSBtRGF0YWJhc2UtPmdldFN1cHBvcnRlZFBsYXliYWNrRm9ybWF0cygpOworICAgIE10cE9iamVjdEZvcm1hdExpc3QqIGNhcHR1cmVGb3JtYXRzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cERldmljZVByb3BlcnR5TGlzdCogZGV2aWNlUHJvcGVydGllcyA9IG1EYXRhYmFzZS0+Z2V0U3VwcG9ydGVkRGV2aWNlUHJvcGVydGllcygpOworCisgICAgLy8gZmlsbCBpbiBkZXZpY2UgaW5mbworICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgbURhdGEucHV0VUludDMyKDYpOyAvLyBNVFAgVmVuZG9yIEV4dGVuc2lvbiBJRAorICAgIG1EYXRhLnB1dFVJbnQxNihNVFBfU1RBTkRBUkRfVkVSU0lPTik7CisgICAgc3RyaW5nLnNldCgibWljcm9zb2Z0LmNvbTogMS4wOyIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAvLyBNVFAgRXh0ZW5zaW9ucworICAgIG1EYXRhLnB1dFVJbnQxNigwKTsgLy9GdW5jdGlvbmFsIE1vZGUKKyAgICBtRGF0YS5wdXRBVUludDE2KGtTdXBwb3J0ZWRPcGVyYXRpb25Db2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkT3BlcmF0aW9uQ29kZXMpIC8gc2l6ZW9mKHVpbnQxNl90KSk7IC8vIE9wZXJhdGlvbnMgU3VwcG9ydGVkCisgICAgbURhdGEucHV0QVVJbnQxNihrU3VwcG9ydGVkRXZlbnRDb2RlcywKKyAgICAgICAgICAgIHNpemVvZihrU3VwcG9ydGVkRXZlbnRDb2RlcykgLyBzaXplb2YodWludDE2X3QpKTsgLy8gRXZlbnRzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoZGV2aWNlUHJvcGVydGllcyk7IC8vIERldmljZSBQcm9wZXJ0aWVzIFN1cHBvcnRlZAorICAgIG1EYXRhLnB1dEFVSW50MTYoY2FwdHVyZUZvcm1hdHMpOyAvLyBDYXB0dXJlIEZvcm1hdHMKKyAgICBtRGF0YS5wdXRBVUludDE2KHBsYXliYWNrRm9ybWF0cyk7ICAvLyBQbGF5YmFjayBGb3JtYXRzCisgICAgLy8gRklYTUUKKyAgICBzdHJpbmcuc2V0KCJHb29nbGUsIEluYy4iKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNYW51ZmFjdHVyZXIKKworICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHByb3BfdmFsdWUsICJNVFAgRGV2aWNlIik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBNb2RlbAorICAgIHN0cmluZy5zZXQoIjEuMCIpOworICAgIG1EYXRhLnB1dFN0cmluZyhzdHJpbmcpOyAgIC8vIERldmljZSBWZXJzaW9uCisKKyAgICBwcm9wZXJ0eV9nZXQoInJvLnNlcmlhbG5vIiwgcHJvcF92YWx1ZSwgIj8/Pz8/Pz8/Iik7CisgICAgc3RyaW5nLnNldChwcm9wX3ZhbHVlKTsKKyAgICBtRGF0YS5wdXRTdHJpbmcoc3RyaW5nKTsgICAvLyBTZXJpYWwgTnVtYmVyCisKKyAgICBkZWxldGUgcGxheWJhY2tGb3JtYXRzOworICAgIGRlbGV0ZSBjYXB0dXJlRm9ybWF0czsKKyAgICBkZWxldGUgZGV2aWNlUHJvcGVydGllczsKKworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvT3BlblNlc3Npb24oKSB7CisgICAgaWYgKG1TZXNzaW9uT3BlbikgeworICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIG1TZXNzaW9uSUQpOworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOOworICAgIH0KKyAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CisKKyAgICBtRGF0YWJhc2UtPnNlc3Npb25TdGFydGVkKCk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0Nsb3NlU2Vzc2lvbigpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIG1TZXNzaW9uSUQgPSAwOworICAgIG1TZXNzaW9uT3BlbiA9IGZhbHNlOworICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRTdG9yYWdlSURzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisKKyAgICBpbnQgY291bnQgPSBtU3RvcmFnZXMuc2l6ZSgpOworICAgIG1EYXRhLnB1dFVJbnQzMihjb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBtRGF0YS5wdXRVSW50MzIobVN0b3JhZ2VzW2ldLT5nZXRTdG9yYWdlSUQoKSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldFN0b3JhZ2VJbmZvKCkgeworICAgIE10cFN0cmluZ0J1ZmZlciAgIHN0cmluZzsKKworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGlkID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKGlkKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworCisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldFR5cGUoKSk7CisgICAgbURhdGEucHV0VUludDE2KHN0b3JhZ2UtPmdldEZpbGVTeXN0ZW1UeXBlKCkpOworICAgIG1EYXRhLnB1dFVJbnQxNihzdG9yYWdlLT5nZXRBY2Nlc3NDYXBhYmlsaXR5KCkpOworICAgIG1EYXRhLnB1dFVJbnQ2NChzdG9yYWdlLT5nZXRNYXhDYXBhY2l0eSgpKTsKKyAgICBtRGF0YS5wdXRVSW50NjQoc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpOworICAgIG1EYXRhLnB1dFVJbnQzMigxMDI0KjEwMjQqMTAyNCk7IC8vIEZyZWUgU3BhY2UgaW4gT2JqZWN0cworICAgIHN0cmluZy5zZXQoc3RvcmFnZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgbURhdGEucHV0U3RyaW5nKHN0cmluZyk7CisgICAgbURhdGEucHV0RW1wdHlTdHJpbmcoKTsgICAvLyBWb2x1bWUgSWRlbnRpZmllcgorCisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wc1N1cHBvcnRlZCgpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwRGV2aWNlUHJvcGVydHlMaXN0KiBwcm9wZXJ0aWVzID0gbURhdGFiYXNlLT5nZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKGZvcm1hdCk7CisgICAgbURhdGEucHV0QVVJbnQxNihwcm9wZXJ0aWVzKTsKKyAgICBkZWxldGUgcHJvcGVydGllczsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdEhhbmRsZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIGFsbCBzdG9yYWdlCisgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigyKTsgICAgICAvLyAwIGZvciBhbGwgZm9ybWF0cworICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3Igb2JqZWN0cyB3aXRoIG5vIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHM/CisgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQorICAgICAgICBwYXJlbnQgPSAwOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0TGlzdChzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOworICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0TnVtT2JqZWN0cygpIHsKKyAgICBpZiAoIW1TZXNzaW9uT3BlbikKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7ICAgICAgLy8gMHhGRkZGRkZGRiBmb3IgYWxsIHN0b3JhZ2UKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOyAgICAgIC8vIDAgZm9yIGFsbCBmb3JtYXRzCisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBvYmplY3RzIHdpdGggbm8gcGFyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAweDAwMDAwMDAwIGZvciBhbGwgb2JqZWN0cz8KKyAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCisgICAgICAgIHBhcmVudCA9IDA7CisKKyAgICBpbnQgY291bnQgPSBtRGF0YWJhc2UtPmdldE51bU9iamVjdHMoc3RvcmFnZUlELCBmb3JtYXQsIHBhcmVudCk7CisgICAgaWYgKGNvdW50ID49IDApIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBjb3VudCk7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCAwKTsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFJlZmVyZW5jZXMoKSB7CisgICAgaWYgKCFtU2Vzc2lvbk9wZW4pCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU0VTU0lPTl9OT1RfT1BFTjsKKyAgICBNdHBTdG9yYWdlSUQgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworCisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgaW52YWxpZCBvYmplY3QgaGFuZGxlCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0UmVmZXJlbmNlcyhoYW5kbGUpOworICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CisgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EYXRhLnB1dEVtcHR5QXJyYXkoKTsKKyAgICB9CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZXRPYmplY3RSZWZlcmVuY2VzKCkgeworICAgIGlmICghbVNlc3Npb25PcGVuKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU47CisgICAgTXRwU3RvcmFnZUlEIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzID0gbURhdGEuZ2V0QVVJbnQzMigpOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQgPSBtRGF0YWJhc2UtPnNldE9iamVjdFJlZmVyZW5jZXMoaGFuZGxlLCByZWZlcmVuY2VzKTsKKyAgICBkZWxldGUgcmVmZXJlbmNlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0dldE9iamVjdFByb3BWYWx1ZSgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2V0T2JqZWN0UHJvcFZhbHVlKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgTE9HRCgiU2V0T2JqZWN0UHJvcFZhbHVlICVkICVzXG4iLCBoYW5kbGUsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXRPYmplY3RQcm9wZXJ0eVZhbHVlKGhhbmRsZSwgcHJvcGVydHksIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiR2V0RGV2aWNlUHJvcFZhbHVlICVzXG4iLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworCisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgbURhdGEpOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NldERldmljZVByb3BWYWx1ZSgpIHsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBMT0dEKCJTZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5zZXREZXZpY2VQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LCBtRGF0YSk7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvUmVzZXREZXZpY2VQcm9wVmFsdWUoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiUmVzZXREZXZpY2VQcm9wVmFsdWUgJXNcbiIsCisgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisKKyAgICByZXR1cm4gbURhdGFiYXNlLT5yZXNldERldmljZVByb3BlcnR5KHByb3BlcnR5KTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RJbmZvKCkgeworICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0SW5mbyhoYW5kbGUsIG1EYXRhKTsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3QoKSB7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworICAgIGlmIChtZnIuZmQgPCAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9CisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CisKKyAgICAvLyBzZW5kIGRhdGEgaGVhZGVyCisgICAgbURhdGEuc2V0T3BlcmF0aW9uQ29kZShtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCkpOworICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBtRGF0YS53cml0ZURhdGFIZWFkZXIobUZELCBmaWxlTGVuZ3RoKTsKKworICAgIC8vIHRoZW4gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICBpbnQgcmV0ID0gaW9jdGwobUZELCBNVFBfU0VORF9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICBjbG9zZShtZnIuZmQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpCisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3RJbmZvKCkgeworICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisKKyAgICAvLyBzcGVjaWFsIGNhc2UgdGhlIHJvb3QKKyAgICBpZiAocGFyZW50ID09IE1UUF9QQVJFTlRfUk9PVCkgeworICAgICAgICBwYXRoID0gc3RvcmFnZS0+Z2V0UGF0aCgpOworICAgICAgICBwYXJlbnQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKHBhcmVudCwgcGF0aCwgZHVtbXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gcmVhZCBvbmx5IHRoZSBmaWVsZHMgd2UgbmVlZAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gc3RvcmFnZSBJRAorICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtRGF0YS5nZXRVSW50MTYoKTsKKyAgICBtRGF0YS5nZXRVSW50MTYoKTsgIC8vIHByb3RlY3Rpb24gc3RhdHVzCisgICAgbVNlbmRPYmplY3RGaWxlU2l6ZSA9IG1EYXRhLmdldFVJbnQzMigpOworICAgIG1EYXRhLmdldFVJbnQxNigpOyAgLy8gdGh1bWIgZm9ybWF0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyB0aHVtYiBjb21wcmVzc2VkIHNpemUKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHRodW1iIHBpeCB3aWR0aAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gdGh1bWIgcGl4IGhlaWdodAorICAgIG1EYXRhLmdldFVJbnQzMigpOyAgLy8gaW1hZ2UgcGl4IHdpZHRoCisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBwaXggaGVpZ2h0CisgICAgbURhdGEuZ2V0VUludDMyKCk7ICAvLyBpbWFnZSBiaXQgZGVwdGgKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHBhcmVudAorICAgIHVpbnQxNl90IGFzc29jaWF0aW9uVHlwZSA9IG1EYXRhLmdldFVJbnQxNigpOworICAgIHVpbnQzMl90IGFzc29jaWF0aW9uRGVzYyA9IG1EYXRhLmdldFVJbnQzMigpOyAgIC8vIGFzc29jaWF0aW9uIGRlc2MKKyAgICBtRGF0YS5nZXRVSW50MzIoKTsgIC8vIHNlcXVlbmNlIG51bWJlcgorICAgIE10cFN0cmluZ0J1ZmZlciBuYW1lLCBjcmVhdGVkLCBtb2RpZmllZDsKKyAgICBtRGF0YS5nZXRTdHJpbmcobmFtZSk7ICAgIC8vIGZpbGUgbmFtZQorICAgIG1EYXRhLmdldFN0cmluZyhjcmVhdGVkKTsgICAgICAvLyBkYXRlIGNyZWF0ZWQKKyAgICBtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpOyAgICAgLy8gZGF0ZSBtb2RpZmllZAorICAgIC8vIGtleXdvcmRzIGZvbGxvdworCisgICAgdGltZV90IG1vZGlmaWVkVGltZTsKKyAgICBpZiAoIXBhcnNlRGF0ZVRpbWUobW9kaWZpZWQsIG1vZGlmaWVkVGltZSkpCisgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CisKKyAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKKyAgICAgICAgcGF0aCArPSAiLyI7CisgICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsCisgICAgICAgICAgICBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZUlELCBtU2VuZE9iamVjdEZpbGVTaXplLCBtb2RpZmllZFRpbWUpOworICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0KKworICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICAgICAgaW50IHJldCA9IG1rZGlyKChjb25zdCBjaGFyICopcGF0aCwgbURpcmVjdG9yeVBlcm1pc3Npb24pOworICAgICAgICB1bWFzayhtYXNrKTsKKyAgICAgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgY2hvd24oKGNvbnN0IGNoYXIgKilwYXRoLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7CisgICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOworICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMiwgcGFyZW50KTsKKyAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDMsIGhhbmRsZSk7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb1NlbmRPYmplY3QoKSB7CisgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICBtb2RlX3QgbWFzazsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKG1TZW5kT2JqZWN0SGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CisgICAgICAgIExPR0UoIkV4cGVjdGVkIFNlbmRPYmplY3RJbmZvIGJlZm9yZSBTZW5kT2JqZWN0Iik7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9OT19WQUxJRF9PQkpFQ1RfSU5GTzsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8vIHJlYWQgdGhlIGhlYWRlcgorICAgIHJldCA9IG1EYXRhLnJlYWREYXRhSGVhZGVyKG1GRCk7CisgICAgLy8gRklYTUUgLSBjaGVjayBmb3IgZXJyb3JzIGhlcmUuCisKKyAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIHNlbmQgdGhpcyBiYWNrCisgICAgbURhdGEucmVzZXQoKTsKKworICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgbWZyLmZkID0gb3BlbihtU2VuZE9iamVjdEZpbGVQYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOworICAgIC8vIHNldCBwZXJtaXNzaW9ucworICAgIG1hc2sgPSB1bWFzaygwKTsKKyAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIHVtYXNrKG1hc2spOworCisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemU7CisKKyAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgY2xvc2UobWZyLmZkKTsKKworICAgIExPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgdW5saW5rKG1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCitkb25lOgorICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChtU2VuZE9iamVjdEZpbGVQYXRoLCBtU2VuZE9iamVjdEhhbmRsZSwgbVNlbmRPYmplY3RGb3JtYXQsCisgICAgICAgICAgICByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0RlbGV0ZU9iamVjdCgpIHsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgLy8gRklYTUUgLSBzdXBwb3J0IGRlbGV0aW5nIGFsbCBvYmplY3RzIGlmIGhhbmRsZSBpcyAweEZGRkZGRkZGCisgICAgLy8gRklYTUUgLSBpbXBsZW1lbnQgZGVsZXRpbmcgb2JqZWN0cyBieSBmb3JtYXQKKyAgICAvLyBGSVhNRSAtIGhhbmRsZSBub24tZW1wdHkgZGlyZWN0b3JpZXMKKworICAgIE10cFN0cmluZyBmaWxlUGF0aDsKKyAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CisgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBmaWxlUGF0aCwgZmlsZUxlbmd0aCk7CisgICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKKyAgICAgICAgTE9HVigiZGVsZXRpbmcgJXMiLCAoY29uc3QgY2hhciAqKWZpbGVQYXRoKTsKKyAgICAgICAgLy8gb25lIG9mIHRoZXNlIHNob3VsZCB3b3JrCisgICAgICAgIHJtZGlyKChjb25zdCBjaGFyICopZmlsZVBhdGgpOworICAgICAgICB1bmxpbmsoKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisgICAgICAgIHJldHVybiBtRGF0YWJhc2UtPmRlbGV0ZUZpbGUoaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KKworTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9HZXRPYmplY3RQcm9wRGVzYygpIHsKKyAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wQ29kZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIExPR0QoIkdldE9iamVjdFByb3BEZXNjICVzICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BDb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CisgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gbURhdGFiYXNlLT5nZXRPYmplY3RQcm9wZXJ0eURlc2MocHJvcENvZGUsIGZvcm1hdCk7CisgICAgaWYgKCFwcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgIHByb3BlcnR5LT53cml0ZShtRGF0YSk7CisgICAgZGVsZXRlIHByb3BlcnR5OworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0RGV2aWNlUHJvcERlc2MoKSB7CisgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CisgICAgTE9HRCgiR2V0RGV2aWNlUHJvcERlc2MgJXNcbiIsIE10cERlYnVnOjpnZXREZXZpY2VQcm9wQ29kZU5hbWUocHJvcENvZGUpKTsKKyAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBtRGF0YWJhc2UtPmdldERldmljZVByb3BlcnR5RGVzYyhwcm9wQ29kZSk7CisgICAgaWYgKCFwcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9ERVZJQ0VfUFJPUF9OT1RfU1VQUE9SVEVEOworICAgIHByb3BlcnR5LT53cml0ZShtRGF0YSk7CisgICAgZGVsZXRlIHByb3BlcnR5OworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhNjU2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TRVJWRVJfSAorI2RlZmluZSBfTVRQX1NFUlZFUl9ICisKKyNpbmNsdWRlICJNdHBSZXF1ZXN0UGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgorI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwRXZlbnRQYWNrZXQuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTXRwRGF0YWJhc2U7CitjbGFzcyBNdHBTdG9yYWdlOworCitjbGFzcyBNdHBTZXJ2ZXIgeworCitwcml2YXRlOgorICAgIC8vIGZpbGUgZGVzY3JpcHRvciBmb3IgTVRQIGtlcm5lbCBkcml2ZXIKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GRDsKKworICAgIE10cERhdGFiYXNlKiAgICAgICAgbURhdGFiYXNlOworCisgICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKKyAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcworICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOworICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247CisKKyAgICAvLyBjdXJyZW50IHNlc3Npb24gSUQKKyAgICBNdHBTZXNzaW9uSUQgICAgICAgIG1TZXNzaW9uSUQ7CisgICAgLy8gdHJ1ZSBpZiB3ZSBoYXZlIGFuIG9wZW4gc2Vzc2lvbiBhbmQgbVNlc3Npb25JRCBpcyB2YWxpZAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlc3Npb25PcGVuOworCisgICAgTXRwUmVxdWVzdFBhY2tldCAgICBtUmVxdWVzdDsKKyAgICBNdHBEYXRhUGFja2V0ICAgICAgIG1EYXRhOworICAgIE10cFJlc3BvbnNlUGFja2V0ICAgbVJlc3BvbnNlOworICAgIE10cEV2ZW50UGFja2V0ICAgICAgbUV2ZW50OworCisgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CisKKyAgICAvLyBoYW5kbGUgZm9yIG5ldyBvYmplY3QsIHNldCBieSBTZW5kT2JqZWN0SW5mbyBhbmQgdXNlZCBieSBTZW5kT2JqZWN0CisgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtU2VuZE9iamVjdEhhbmRsZTsKKyAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1TZW5kT2JqZWN0Rm9ybWF0OworICAgIE10cFN0cmluZyAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemU7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0pOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFNlcnZlcigpOworCisgICAgdm9pZCAgICAgICAgICAgICAgICBhZGRTdG9yYWdlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKyAgICBpbmxpbmUgdm9pZCAgICAgICAgIGFkZFN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgeyBtU3RvcmFnZXMucHVzaChzdG9yYWdlKTsgfQorICAgIE10cFN0b3JhZ2UqICAgICAgICAgZ2V0U3RvcmFnZShNdHBTdG9yYWdlSUQgaWQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcnVuKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdCgpOworCisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvT3BlblNlc3Npb24oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvQ2xvc2VTZXNzaW9uKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldFN0b3JhZ2VJRHMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0U3RvcmFnZUluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SGFuZGxlcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXROdW1PYmplY3RzKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldE9iamVjdFJlZmVyZW5jZXMoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2V0T2JqZWN0UmVmZXJlbmNlcygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3RQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2V0T2JqZWN0UHJvcFZhbHVlKCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0dldERldmljZVByb3BWYWx1ZSgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvUmVzZXREZXZpY2VQcm9wVmFsdWUoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0SW5mbygpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9HZXRPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdEluZm8oKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZE9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9EZWxldGVPYmplY3QoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKKyAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0RGV2aWNlUHJvcERlc2MoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZjE4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNdHBTdG9yYWdlIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2UuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdG9yYWdlOjpNdHBTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCwgY29uc3QgY2hhciogZmlsZVBhdGgsIE10cERhdGFiYXNlKiBkYikKKyAgICA6ICAgbVN0b3JhZ2VJRChpZCksCisgICAgICAgIG1GaWxlUGF0aChmaWxlUGF0aCksCisgICAgICAgIG1EYXRhYmFzZShkYiksCisgICAgICAgIG1NYXhDYXBhY2l0eSgwKQoreworICAgIExPR0QoIk10cFN0b3JhZ2UgaWQ6ICVkIHBhdGg6ICVzXG4iLCBpZCwgZmlsZVBhdGgpOworfQorCitNdHBTdG9yYWdlOjp+TXRwU3RvcmFnZSgpIHsKK30KKworaW50IE10cFN0b3JhZ2U6OmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIE1UUF9TVE9SQUdFX0ZJWEVEX1JBTTsKK30KKworaW50IE10cFN0b3JhZ2U6OmdldEZpbGVTeXN0ZW1UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBNVFBfU1RPUkFHRV9GSUxFU1lTVEVNX0hJRVJBUkNISUNBTDsKK30KKworaW50IE10cFN0b3JhZ2U6OmdldEFjY2Vzc0NhcGFiaWxpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIE1UUF9TVE9SQUdFX1JFQURfV1JJVEU7Cit9CisKK3VpbnQ2NF90IE10cFN0b3JhZ2U6OmdldE1heENhcGFjaXR5KCkgeworICAgIGlmIChtTWF4Q2FwYWNpdHkgPT0gMCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdGZzICAgc3RhdDsKKyAgICAgICAgaWYgKHN0YXRmcyhtRmlsZVBhdGgsICZzdGF0KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbU1heENhcGFjaXR5ID0gKHVpbnQ2NF90KXN0YXQuZl9ibG9ja3MgKiAodWludDY0X3Qpc3RhdC5mX2JzaXplOworICAgIH0KKyAgICByZXR1cm4gbU1heENhcGFjaXR5OworfQorCit1aW50NjRfdCBNdHBTdG9yYWdlOjpnZXRGcmVlU3BhY2UoKSB7CisgICAgc3RydWN0IHN0YXRmcyAgIHN0YXQ7CisgICAgaWYgKHN0YXRmcyhtRmlsZVBhdGgsICZzdGF0KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAodWludDY0X3Qpc3RhdC5mX2JhdmFpbCAqICh1aW50NjRfdClzdGF0LmZfYnNpemU7Cit9CisKK2NvbnN0IGNoYXIqIE10cFN0b3JhZ2U6OmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgIHJldHVybiAiRGV2aWNlIFN0b3JhZ2UiOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzYjkyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0gKKyNkZWZpbmUgX01UUF9TVE9SQUdFX0gKKworI2luY2x1ZGUgIm10cC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFiYXNlOworCitjbGFzcyBNdHBTdG9yYWdlIHsKKworcHJpdmF0ZToKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgICAgICBtU3RvcmFnZUlEOworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgIG1GaWxlUGF0aDsKKyAgICBNdHBEYXRhYmFzZSogICAgICAgICAgICBtRGF0YWJhc2U7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heENhcGFjaXR5OworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLCBNdHBEYXRhYmFzZSogZGIpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NdHBTdG9yYWdlKCk7CisKKyAgICBpbmxpbmUgTXRwU3RvcmFnZUlEICAgICBnZXRTdG9yYWdlSUQoKSBjb25zdCB7IHJldHVybiBtU3RvcmFnZUlEOyB9CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpIGNvbnN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVTeXN0ZW1UeXBlKCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0QWNjZXNzQ2FwYWJpbGl0eSgpIGNvbnN0OworICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGdldE1heENhcGFjaXR5KCk7CisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgZ2V0RnJlZVNwYWNlKCk7CisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKKyAgICBpbmxpbmUgY29uc3QgY2hhciogICAgICBnZXRQYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpbGVQYXRoOyB9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9TVE9SQUdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjRhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk10cFN0b3JhZ2VJbmZvIgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBTdG9yYWdlSW5mbzo6TXRwU3RvcmFnZUluZm8oTXRwU3RvcmFnZUlEIGlkKQorICAgIDogICBtU3RvcmFnZUlEKGlkKSwKKyAgICAgICAgbVN0b3JhZ2VUeXBlKDApLAorICAgICAgICBtRmlsZVN5c3RlbVR5cGUoMCksCisgICAgICAgIG1BY2Nlc3NDYXBhYmlsaXR5KDApLAorICAgICAgICBtTWF4Q2FwYWNpdHkoMCksCisgICAgICAgIG1GcmVlU3BhY2VCeXRlcygwKSwKKyAgICAgICAgbUZyZWVTcGFjZU9iamVjdHMoMCksCisgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24oTlVMTCksCisgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyKE5VTEwpCit7Cit9CisKK010cFN0b3JhZ2VJbmZvOjp+TXRwU3RvcmFnZUluZm8oKSB7CisgICAgaWYgKG1TdG9yYWdlRGVzY3JpcHRpb24pCisgICAgICAgIGZyZWUobVN0b3JhZ2VEZXNjcmlwdGlvbik7CisgICAgaWYgKG1Wb2x1bWVJZGVudGlmaWVyKQorICAgICAgICBmcmVlKG1Wb2x1bWVJZGVudGlmaWVyKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cmVhZChNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBNdHBTdHJpbmdCdWZmZXIgc3RyaW5nOworCisgICAgLy8gcmVhZCB0aGUgZGV2aWNlIGluZm8KKyAgICBtU3RvcmFnZVR5cGUgPSBwYWNrZXQuZ2V0VUludDE2KCk7CisgICAgbUZpbGVTeXN0ZW1UeXBlID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1BY2Nlc3NDYXBhYmlsaXR5ID0gcGFja2V0LmdldFVJbnQxNigpOworICAgIG1NYXhDYXBhY2l0eSA9IHBhY2tldC5nZXRVSW50NjQoKTsKKyAgICBtRnJlZVNwYWNlQnl0ZXMgPSBwYWNrZXQuZ2V0VUludDY0KCk7CisgICAgbUZyZWVTcGFjZU9iamVjdHMgPSBwYWNrZXQuZ2V0VUludDMyKCk7CisKKyAgICBwYWNrZXQuZ2V0U3RyaW5nKHN0cmluZyk7CisgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiA9IHN0cmR1cCgoY29uc3QgY2hhciAqKXN0cmluZyk7CisgICAgcGFja2V0LmdldFN0cmluZyhzdHJpbmcpOworICAgIG1Wb2x1bWVJZGVudGlmaWVyID0gc3RyZHVwKChjb25zdCBjaGFyICopc3RyaW5nKTsKK30KKwordm9pZCBNdHBTdG9yYWdlSW5mbzo6cHJpbnQoKSB7CisgICAgTE9HRCgiU3RvcmFnZSBJbmZvICUwOFg6XG5cdG1TdG9yYWdlVHlwZTogJWRcblx0bUZpbGVTeXN0ZW1UeXBlOiAlZFxuXHRtQWNjZXNzQ2FwYWJpbGl0eTogJWRcbiIsCisgICAgICAgICAgICBtU3RvcmFnZUlELCBtU3RvcmFnZVR5cGUsIG1GaWxlU3lzdGVtVHlwZSwgbUFjY2Vzc0NhcGFiaWxpdHkpOworICAgIExPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgICAgICAgICBtTWF4Q2FwYWNpdHksIG1GcmVlU3BhY2VCeXRlcywgbUZyZWVTcGFjZU9iamVjdHMpOworICAgIExPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAorICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmggYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I2MjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9TVE9SQUdFX0lORk9fSAorI2RlZmluZSBfTVRQX1NUT1JBR0VfSU5GT19ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cERhdGFQYWNrZXQ7CisKK2NsYXNzIE10cFN0b3JhZ2VJbmZvIHsKK3B1YmxpYzoKKyAgICBNdHBTdG9yYWdlSUQgICAgICAgIG1TdG9yYWdlSUQ7CisgICAgdWludDE2X3QgICAgICAgICAgICBtU3RvcmFnZVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtRmlsZVN5c3RlbVR5cGU7CisgICAgdWludDE2X3QgICAgICAgICAgICBtQWNjZXNzQ2FwYWJpbGl0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1NYXhDYXBhY2l0eTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgIG1GcmVlU3BhY2VCeXRlczsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GcmVlU3BhY2VPYmplY3RzOworICAgIGNoYXIqICAgICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbjsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIG1Wb2x1bWVJZGVudGlmaWVyOworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgaWQpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgfk10cFN0b3JhZ2VJbmZvKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIHJlYWQoTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUT1JBR0VfSU5GT19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjY3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwU3RyaW5nQnVmZmVyIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCisjaW5jbHVkZSAiTXRwU3RyaW5nQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoKQorICAgIDogICBtQ2hhckNvdW50KDApLAorICAgICAgICBtQnl0ZUNvdW50KDEpCit7CisgICAgbUJ1ZmZlclswXSA9IDA7Cit9CisKK010cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYykKKyAgICA6ICAgbUNoYXJDb3VudCgwKSwKKyAgICAgICAgbUJ5dGVDb3VudCgxKQoreworICAgIHNldChzcmMpOworfQorCitNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCBNdHBTdHJpbmdCdWZmZXImIHNyYykKKyAgICA6ICAgbUNoYXJDb3VudChzcmMubUNoYXJDb3VudCksCisgICAgICAgIG1CeXRlQ291bnQoc3JjLm1CeXRlQ291bnQpCit7CisgICAgbWVtY3B5KG1CdWZmZXIsIHNyYy5tQnVmZmVyLCBtQnl0ZUNvdW50KTsKK30KKworCitNdHBTdHJpbmdCdWZmZXI6On5NdHBTdHJpbmdCdWZmZXIoKSB7Cit9CisKK3ZvaWQgTXRwU3RyaW5nQnVmZmVyOjpzZXQoY29uc3QgY2hhciogc3JjKSB7CisgICAgaW50IGxlbmd0aCA9IHN0cmxlbihzcmMpOworICAgIGlmIChsZW5ndGggPj0gc2l6ZW9mKG1CdWZmZXIpKQorICAgICAgICBsZW5ndGggPSBzaXplb2YobUJ1ZmZlcikgLSAxOworICAgIG1lbWNweShtQnVmZmVyLCBzcmMsIGxlbmd0aCk7CisKKyAgICAvLyBjb3VudCB0aGUgY2hhcmFjdGVycworICAgIGludCBjb3VudCA9IDA7CisgICAgY2hhciBjaDsKKyAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAwKSB7CisgICAgICAgIGlmICgoY2ggJiAweDgwKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgfSBlbHNlIGlmICgoY2ggJiAweEUwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAvLyB0d28gYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICghICpzcmMrKykgeworICAgICAgICAgICAgICAgIC8vIGxhc3QgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQsIHNvIGlnbm9yZSBsYXN0IGJ5dGUKKyAgICAgICAgICAgICAgICBsZW5ndGgtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoY2ggJiAweEYwKSA9PSAweEUwKSB7CisgICAgICAgICAgICAvLyAzIGJ5dGUgY2hhcgorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgYnl0ZQorICAgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEgKnNyYysrKSB7CisgICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgdHdvIGJ5dGVzCisgICAgICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICBtQnl0ZUNvdW50ID0gbGVuZ3RoICsgMTsKKyAgICBtQnVmZmVyW2xlbmd0aF0gPSAwOworICAgIG1DaGFyQ291bnQgPSBjb3VudDsKK30KKwordm9pZCBNdHBTdHJpbmdCdWZmZXI6OnJlYWRGcm9tUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgeworICAgIGludCBjb3VudCA9IHBhY2tldC0+Z2V0VUludDgoKTsKKyAgICB1aW50OF90KiBkZXN0ID0gbUJ1ZmZlcjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDE2X3QgY2ggPSBwYWNrZXQtPmdldFVJbnQxNigpOworICAgICAgICBpZiAoY2ggPj0gMHgwODAwKSB7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4RTAgfCAoY2ggPj4gMTIpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8ICgoY2ggPj4gNikgJiAweDNGKSk7CisgICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg4MCkgeworICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEMwIHwgKGNoID4+IDYpKTsKKyAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0KysgPSBjaDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZGVzdCsrID0gMDsKKyAgICBtQ2hhckNvdW50ID0gY291bnQ7CisgICAgbUJ5dGVDb3VudCA9IGRlc3QgLSBtQnVmZmVyOworfQorCit2b2lkIE10cFN0cmluZ0J1ZmZlcjo6d3JpdGVUb1BhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpIGNvbnN0IHsKKyAgICBpbnQgY291bnQgPSBtQ2hhckNvdW50OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IG1CdWZmZXI7CisgICAgcGFja2V0LT5wdXRVSW50OChjb3VudCA+IDAgPyBjb3VudCArIDEgOiAwKTsKKworICAgIC8vIGV4cGFuZCB1dGY4IHRvIDE2IGJpdCBjaGFycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB1aW50MTZfdCBjaDsKKyAgICAgICAgdWludDE2X3QgY2gxID0gKnNyYysrOworICAgICAgICBpZiAoKGNoMSAmIDB4ODApID09IDApIHsKKyAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgY2ggPSBjaDE7CisgICAgICAgIH0gZWxzZSBpZiAoKGNoMSAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgorICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOworICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MUYpIDw8IDYpIHwgKGNoMiAmIDB4M0YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhyZWUgYnl0ZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKKyAgICAgICAgICAgIHVpbnQxNl90IGNoMyA9ICpzcmMrKzsKKyAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDBGKSA8PCAxMikgfCAoKGNoMiAmIDB4M0YpIDw8IDYpIHwgKGNoMyAmIDB4M0YpOworICAgICAgICB9CisgICAgICAgIHBhY2tldC0+cHV0VUludDE2KGNoKTsKKyAgICB9CisgICAgLy8gb25seSB0ZXJtaW5hdGUgd2l0aCB6ZXJvIGlmIHN0cmluZyBpcyBub3QgZW1wdHkKKyAgICBpZiAoY291bnQgPiAwKQorICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNigwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQxYzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisjZGVmaW5lIF9NVFBfU1RSSU5HX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworCisvLyBSZXByZXNlbnRzIGEgdXRmOCBzdHJpbmcsIHdpdGggYSBtYXhpbXVtIG9mIDI1NSBjaGFyYWN0ZXJzCitjbGFzcyBNdHBTdHJpbmdCdWZmZXIgeworCitwcml2YXRlOgorICAgIC8vIG1heGltdW0gMyBieXRlcy9jaGFyYWN0ZXIsIHdpdGggMSBleHRyYSBmb3IgemVybyB0ZXJtaW5hdGlvbgorICAgIHVpbnQ4X3QgICAgICAgICBtQnVmZmVyWzI1NSAqIDMgKyAxXTsKKyAgICBpbnQgICAgICAgICAgICAgbUNoYXJDb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgbUJ5dGVDb3VudDsKKworcHVibGljOgorICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYyk7CisgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBNdHBTdHJpbmdCdWZmZXImIHNyYyk7CisgICAgdmlydHVhbCAgICAgICAgIH5NdHBTdHJpbmdCdWZmZXIoKTsKKworICAgIHZvaWQgICAgICAgICAgICBzZXQoY29uc3QgY2hhciogc3JjKTsKKworICAgIHZvaWQgICAgICAgICAgICByZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpOworICAgIHZvaWQgICAgICAgICAgICB3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3Q7CisKKyAgICBpbmxpbmUgaW50ICAgICAgZ2V0Q2hhckNvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYXJDb3VudDsgfQorICAgIGlubGluZSBpbnQgICAgICBnZXRCeXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQnl0ZUNvdW50OyB9CisKKwlpbmxpbmUgb3BlcmF0b3IgY29uc3QgY2hhciooKSBjb25zdCB7IHJldHVybiAoY29uc3QgY2hhciAqKW1CdWZmZXI7IH0KK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX1NUUklOR19CVUZGRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFR5cGVzLmggYi9tZWRpYS9tdHAvTXRwVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9UWVBFU19ICisjZGVmaW5lIF9NVFBfVFlQRVNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidXRpbHMvU3RyaW5nOC5oIgorI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgaW50MzJfdCBpbnQxMjhfdFs0XTsKK3R5cGVkZWYgdWludDMyX3QgdWludDEyOF90WzRdOworCit0eXBlZGVmIHVpbnQxNl90IE10cE9wZXJhdGlvbkNvZGU7Cit0eXBlZGVmIHVpbnQxNl90IE10cFJlc3BvbnNlQ29kZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwRXZlbnRDb2RlOwordHlwZWRlZiB1aW50MzJfdCBNdHBTZXNzaW9uSUQ7Cit0eXBlZGVmIHVpbnQzMl90IE10cFN0b3JhZ2VJRDsKK3R5cGVkZWYgdWludDMyX3QgTXRwVHJhbnNhY3Rpb25JRDsKK3R5cGVkZWYgdWludDE2X3QgTXRwUHJvcGVydHlDb2RlOwordHlwZWRlZiB1aW50MTZfdCBNdHBEYXRhVHlwZTsKK3R5cGVkZWYgdWludDE2X3QgTXRwT2JqZWN0Rm9ybWF0OwordHlwZWRlZiBNdHBQcm9wZXJ0eUNvZGUgTXRwRGV2aWNlUHJvcGVydHk7Cit0eXBlZGVmIE10cFByb3BlcnR5Q29kZSBNdHBPYmplY3RQcm9wZXJ0eTsKKworLy8gb2JqZWN0IGhhbmRsZXMgYXJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN0b3JhZ2UgYnV0IG9ubHkgd2l0aGluIGEgc2luZ2xlIHNlc3Npb24uCisvLyBvYmplY3QgaGFuZGxlcyBjYW5ub3QgYmUgcmV1c2VkIGFmdGVyIGFuIG9iamVjdCBpcyBkZWxldGVkLgorLy8gdmFsdWVzIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYgYXJlIHJlc2VydmVkIGZvciBzcGVjaWFsIHB1cnBvc2VzLgordHlwZWRlZiB1aW50MzJfdCBNdHBPYmplY3RIYW5kbGU7CisKK3VuaW9uIE10cFByb3BlcnR5VmFsdWUgeworICAgIGludDhfdCAgICAgICAgICBpODsKKyAgICB1aW50OF90ICAgICAgICAgdTg7CisgICAgaW50MTZfdCAgICAgICAgIGkxNjsKKyAgICB1aW50MTZfdCAgICAgICAgdTE2OworICAgIGludDMyX3QgICAgICAgICBpMzI7CisgICAgdWludDMyX3QgICAgICAgIHUzMjsKKyAgICBpbnQ2NF90ICAgICAgICAgaTY0OworICAgIHVpbnQ2NF90ICAgICAgICB1NjQ7CisgICAgaW50MTI4X3QgICAgICAgIGkxMjg7CisgICAgdWludDEyOF90ICAgICAgIHUxMjg7CisgICAgY2hhciogICAgICAgICAgIHN0cjsKK307CisKKy8vIFNwZWNpYWwgdmFsdWVzCisjZGVmaW5lIE1UUF9QQVJFTlRfUk9PVCAgICAgICAgIDB4RkZGRkZGRkYgICAgICAgLy8gcGFyZW50IGlzIHJvb3Qgb2YgdGhlIHN0b3JhZ2UKKyNkZWZpbmUga0ludmFsaWRPYmplY3RIYW5kbGUgICAgMHhGRkZGRkZGRgorCitjbGFzcyBNdHBTdG9yYWdlOworY2xhc3MgTXRwRGV2aWNlOworY2xhc3MgTXRwUHJvcGVydHk7CisKK3R5cGVkZWYgVmVjdG9yPE10cFN0b3JhZ2UgKj4gTXRwU3RvcmFnZUxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxNdHBEZXZpY2UqPiBNdHBEZXZpY2VMaXN0OwordHlwZWRlZiBWZWN0b3I8TXRwUHJvcGVydHkqPiBNdHBQcm9wZXJ0eUxpc3Q7CisKK3R5cGVkZWYgVmVjdG9yPHVpbnQ4X3Q+IFVJbnQ4TGlzdDsKK3R5cGVkZWYgVmVjdG9yPHVpbnQxNl90PiBVSW50MTZMaXN0OwordHlwZWRlZiBWZWN0b3I8dWludDMyX3Q+IFVJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3Rvcjx1aW50NjRfdD4gVUludDY0TGlzdDsKK3R5cGVkZWYgVmVjdG9yPGludDhfdD4gSW50OExpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQxNl90PiBJbnQxNkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQzMl90PiBJbnQzMkxpc3Q7Cit0eXBlZGVmIFZlY3RvcjxpbnQ2NF90PiBJbnQ2NExpc3Q7CisKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwordHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdEZvcm1hdExpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwT2JqZWN0SGFuZGxlTGlzdDsKK3R5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIFVJbnQzMkxpc3QgTXRwU3RvcmFnZUlETGlzdDsKKwordHlwZWRlZiBTdHJpbmc4ICAgIE10cFN0cmluZzsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMWVmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwVXRpbHMiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGN1dGlscy90enRpbWUuaD4KKyNpbmNsdWRlICJNdHBVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCitEYXRlVGltZSBzdHJpbmdzIGZvbGxvdyBhIGNvbXBhdGlibGUgc3Vic2V0IG9mIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIElTTyA4NjAxLCBhbmQKK3Rha2UgdGhlIGZvcm0gb2YgYSBVbmljb2RlIHN0cmluZyBmb3JtYXR0ZWQgYXM6ICJZWVlZTU1ERFRoaG1tc3MucyIuIEluIHRoaXMKK3JlcHJlc2VudGF0aW9uLCBZWVlZIHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB5ZWFyLCBNTSByZXBsYWNlZCBieSB0aGUgbW9udGggKDAxLTEyKSwKK0REIHJlcGxhY2VkIGJ5IHRoZSBkYXkgKDAxLTMxKSwgVCBpcyBhIGNvbnN0YW50IGNoYXJhY3RlciAnVCcgZGVsaW1pdGluZyB0aW1lIGZyb20gZGF0ZSwKK2hoIGlzIHJlcGxhY2VkIGJ5IHRoZSBob3VyICgwMC0yMyksIG1tIGlzIHJlcGxhY2VkIGJ5IHRoZSBtaW51dGUgKDAwLTU5KSwgYW5kIHNzIGJ5IHRoZQorc2Vjb25kICgwMC01OSkuIFRoZSAiLnMiIGlzIG9wdGlvbmFsLCBhbmQgcmVwcmVzZW50cyB0ZW50aHMgb2YgYSBzZWNvbmQuCisqLworCitib29sIHBhcnNlRGF0ZVRpbWUoY29uc3QgY2hhciogZGF0ZVRpbWUsIHRpbWVfdCYgb3V0U2Vjb25kcykgeworICAgIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZDsKKyAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICBpZiAoc3NjYW5mKGRhdGVUaW1lLCAiJTA0ZCUwMmQlMDJkVCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCkgIT0gNikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IGNoYXIqIHRhaWwgPSBkYXRlVGltZSArIDE1OworICAgIC8vIHNraXAgb3B0aW9uYWwgdGVudGggb2Ygc2Vjb25kCisgICAgaWYgKHRhaWxbMF0gPT0gJy4nICYmIHRhaWxbMV0pCisgICAgICAgIHRhaWwgKz0gMjsKKyAgICAvL0ZJWE1FIC0gc3VwcG9ydCArLy1oaG1tCisgICAgYm9vbCB1c2VVVEMgPSAodGFpbFswXSA9PSAnWicpOworCisgICAgLy8gaGFjayB0byBjb21wdXRlIHRpbWV6b25lCisgICAgdGltZV90IGR1bW15OworICAgIGxvY2FsdGltZV9yKCZkdW1teSwgJnRtKTsKKworICAgIHRtLnRtX3NlYyA9IHNlY29uZDsKKyAgICB0bS50bV9taW4gPSBtaW51dGU7CisgICAgdG0udG1faG91ciA9IGhvdXI7CisgICAgdG0udG1fbWRheSA9IGRheTsKKyAgICB0bS50bV9tb24gPSBtb250aDsKKyAgICB0bS50bV95ZWFyID0geWVhciAtIDE5MDA7CisgICAgdG0udG1fd2RheSA9IDA7CisgICAgdG0udG1faXNkc3QgPSAtMTsKKyAgICBpZiAodXNlVVRDKQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lKCZ0bSk7CisgICAgZWxzZQorICAgICAgICBvdXRTZWNvbmRzID0gbWt0aW1lX3R6KCZ0bSwgdG0udG1fem9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKSB7CisgICAgc3RydWN0IHRtIHRtOworCisgICAgbG9jYWx0aW1lX3IoJnNlY29uZHMsICZ0bSk7CisgICAgc25wcmludGYoYnVmZmVyLCBidWZmZXJMZW5ndGgsICIlMDRkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwKKyAgICAgICAgdG0udG1feWVhciArIDE5MDAsIHRtLnRtX21vbiwgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmggYi9tZWRpYS9tdHAvTXRwVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWY5MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cFV0aWxzLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX01UUF9VVElMU19ICisjZGVmaW5lIF9NVFBfVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwordm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL210cC5oIGIvbWVkaWEvbXRwL210cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvbXRwLmgKQEAgLTAsMCArMSw0NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfSAorI2RlZmluZSBfTVRQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIE1UUF9TVEFOREFSRF9WRVJTSU9OICAgICAgICAgICAgMTAwCisKKy8vIENvbnRhaW5lciBUeXBlcworI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfVU5ERUZJTkVEICAgIDAKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQgICAgICAxCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9EQVRBICAgICAgICAgMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX1RZUEVfUkVTUE9OU0UgICAgIDMKKyNkZWZpbmUgTVRQX0NPTlRBSU5FUl9UWVBFX0VWRU5UICAgICAgICA0CisKKy8vIENvbnRhaW5lciBPZmZzZXRzCisjZGVmaW5lIE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCAgICAgICAgICAgICAwCisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFlQRV9PRkZTRVQgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1UUF9DT05UQUlORVJfQ09ERV9PRkZTRVQgICAgICAgICAgICAgICA2CisjZGVmaW5lIE1UUF9DT05UQUlORVJfVFJBTlNBQ1RJT05fSURfT0ZGU0VUICAgICA4CisjZGVmaW5lIE1UUF9DT05UQUlORVJfUEFSQU1FVEVSX09GRlNFVCAgICAgICAgICAxMgorI2RlZmluZSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTIKKworLy8gTVRQIFR5cGVzCisjZGVmaW5lIE1UUF9UWVBFX1VOREVGSU5FRCAgICAgIDB4MDAwMCAgICAgICAgICAvLyBVbmRlZmluZWQKKyNkZWZpbmUgTVRQX1RZUEVfSU5UOCAgICAgICAgICAgMHgwMDAxICAgICAgICAgIC8vIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQ4ICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvLyBVbnNpZ25lZCA4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDE2ICAgICAgICAgIDB4MDAwMyAgICAgICAgICAvLyBTaWduZWQgMTYtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDE2ICAgICAgICAgMHgwMDA0ICAgICAgICAgIC8vIFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDMyICAgICAgICAgIDB4MDAwNSAgICAgICAgICAvLyBTaWduZWQgMzItYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDMyICAgICAgICAgMHgwMDA2ICAgICAgICAgIC8vIFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDY0ICAgICAgICAgIDB4MDAwNyAgICAgICAgICAvLyBTaWduZWQgNjQtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfVUlOVDY0ICAgICAgICAgMHgwMDA4ICAgICAgICAgIC8vIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX0lOVDEyOCAgICAgICAgIDB4MDAwOSAgICAgICAgICAvLyBTaWduZWQgMTI4LWJpdCBpbnRlZ2VyCisjZGVmaW5lIE1UUF9UWVBFX1VJTlQxMjggICAgICAgIDB4MDAwQSAgICAgICAgICAvLyBVbnNpZ25lZCAxMjgtYml0IGludGVnZXIKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDggICAgICAgICAgMHg0MDAxICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCA4LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDggICAgICAgICAweDQwMDIgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDE2ICAgICAgICAgMHg0MDAzICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQVVJTlQxNiAgICAgICAgMHg0MDA0ICAgICAgICAgIC8vIEFycmF5IG9mIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BSU5UMzIgICAgICAgICAweDQwMDUgICAgICAgICAgLy8gQXJyYXkgb2Ygc2lnbmVkIDMyLWJpdCBpbnRlZ2VycworI2RlZmluZSBNVFBfVFlQRV9BVUlOVDMyICAgICAgICAweDQwMDYgICAgICAgICAgLy8gQXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FJTlQ2NCAgICAgICAgIDB4NDAwNyAgICAgICAgICAvLyBBcnJheSBvZiBzaWduZWQgNjQtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UNjQgICAgICAgIDB4NDAwOCAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMKKyNkZWZpbmUgTVRQX1RZUEVfQUlOVDEyOCAgICAgICAgMHg0MDA5ICAgICAgICAgIC8vIEFycmF5IG9mIHNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX0FVSU5UMTI4ICAgICAgIDB4NDAwQSAgICAgICAgICAvLyBBcnJheSBvZiB1bnNpZ25lZCAxMjgtYml0IGludGVnZXJzCisjZGVmaW5lIE1UUF9UWVBFX1NUUiAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAvLyBWYXJpYWJsZS1sZW5ndGggVW5pY29kZSBzdHJpbmcKKworLy8gTVRQIEZvcm1hdCBDb2RlcworI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAgICAvLyBVbmRlZmluZWQgb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfQVNTT0NJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMSAgIC8vIEFzc29jaWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmb2xkZXIpCisjZGVmaW5lIE1UUF9GT1JNQVRfU0NSSVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMiAgIC8vIERldmljZSBtb2RlbC1zcGVjaWZpYyBzY3JpcHQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9FWEVDVVRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzICAgLy8gRGV2aWNlIG1vZGVsLXNwZWNpZmljIGJpbmFyeSBleGVjdXRhYmxlCisjZGVmaW5lIE1UUF9GT1JNQVRfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNCAgIC8vIFRleHQgZmlsZQorI2RlZmluZSBNVFBfRk9STUFUX0hUTUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDUgICAvLyBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfRFBPRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNiAgIC8vIERpZ2l0YWwgUHJpbnQgT3JkZXIgRm9ybWF0IGZpbGUgKHRleHQpCisjZGVmaW5lIE1UUF9GT1JNQVRfQUlGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNyAgIC8vIEF1ZGlvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9XQVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA4ICAgLy8gQXVkaW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX01QMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDkgICAvLyBBdWRpbyBjbGlwCisjZGVmaW5lIE1UUF9GT1JNQVRfQVZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwQSAgIC8vIFZpZGVvIGNsaXAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDBCICAgLy8gVmlkZW8gY2xpcAorI2RlZmluZSBNVFBfRk9STUFUX0FTRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMEMgICAvLyBNaWNyb3NvZnQgQWR2YW5jZWQgU3RyZWFtaW5nIEZvcm1hdCAodmlkZW8pCisjZGVmaW5lIE1UUF9GT1JNQVRfREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMCAgIC8vIFVua25vd24gaW1hZ2Ugb2JqZWN0CisjZGVmaW5lIE1UUF9GT1JNQVRfRVhJRl9KUEVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMSAgIC8vIEV4Y2hhbmdlYWJsZSBGaWxlIEZvcm1hdCwgSkVJREEgc3RhbmRhcmQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAyICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBFbGVjdHJvbmljIFBob3RvZ3JhcGh5CisjZGVmaW5lIE1UUF9GT1JNQVRfRkxBU0hQSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMyAgIC8vIFN0cnVjdHVyZWQgU3RvcmFnZSBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9CTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA0ICAgLy8gTWljcm9zb2Z0IFdpbmRvd3MgQml0bWFwIGZpbGUKKyNkZWZpbmUgTVRQX0ZPUk1BVF9DSUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODA1ICAgLy8gQ2Fub24gQ2FtZXJhIEltYWdlIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfR0lGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwNyAgIC8vIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdAorI2RlZmluZSBNVFBfRk9STUFUX0pGSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDggICAvLyBKUEVHIEZpbGUgSW50ZXJjaGFuZ2UgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwOSAgIC8vIFBob3RvQ0QgSW1hZ2UgUGFjCisjZGVmaW5lIE1UUF9GT1JNQVRfUElDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwQSAgIC8vIFF1aWNrZHJhdyBJbWFnZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBCICAgLy8gUG9ydGFibGUgTmV0d29yayBHcmFwaGljcworI2RlZmluZSBNVFBfRk9STUFUX1RJRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MEQgICAvLyBUYWcgSW1hZ2UgRmlsZSBGb3JtYXQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9USUZGX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODBFICAgLy8gVGFnIEltYWdlIEZpbGUgRm9ybWF0IGZvciBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IChncmFwaGljIGFydHMpCisjZGVmaW5lIE1UUF9GT1JNQVRfSlAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwRiAgIC8vIEpQRUcyMDAwIEJhc2VsaW5lIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfSlBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgxMCAgIC8vIEpQRUcyMDAwIEV4dGVuZGVkIEZpbGUgRm9ybWF0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0ZJUk1XQVJFICAgICAgICAgICAgICAgICAgIDB4QjgwMgorI2RlZmluZSBNVFBfRk9STUFUX1dJTkRPV1NfSU1BR0VfRk9STUFUICAgICAgICAgICAgICAgICAweEI4ODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfQVVESU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTAwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwMQorI2RlZmluZSBNVFBfRk9STUFUX09HRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDIKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOTAzCisjZGVmaW5lIE1UUF9GT1JNQVRfQVVESUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjkwNAorI2RlZmluZSBNVFBfRk9STUFUX0ZMQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI5MDYKKyNkZWZpbmUgTVRQX0ZPUk1BVF9VTkRFRklORURfVklERU8gICAgICAgICAgICAgICAgICAgICAgMHhCOTgwCisjZGVmaW5lIE1UUF9GT1JNQVRfV01WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MQorI2RlZmluZSBNVFBfRk9STUFUX01QNF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODIgIC8vIElTTyAxNDQ5Ni0xCisjZGVmaW5lIE1UUF9GT1JNQVRfTVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Qjk4MworI2RlZmluZSBNVFBfRk9STUFUXzNHUF9DT05UQUlORVIgICAgICAgICAgICAgICAgICAgICAgICAweEI5ODQgIC8vIDNHUFAgZmlsZSBmb3JtYXQuIERldGFpbHM6IGh0dHA6Ly93d3cuM2dwcC5vcmcvZnRwL1NwZWNzL2h0bWwtaW5mby8yNjI0NC5odG0gKHBhZ2UgdGl0bGUgLSBcdTIwMWNUcmFuc3BhcmVudCBlbmQtdG8tZW5kIHBhY2tldCBzd2l0Y2hlZCBzdHJlYW1pbmcgc2VydmljZSwgM0dQUCBmaWxlIGZvcm1hdFx1MjAxZCkuCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTExFQ1RJT04gICAgICAgICAgICAgICAgIDB4QkEwMAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01VTFRJTUVESUFfQUxCVU0gICAgICAgICAgICAweEJBMDEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9JTUFHRV9BTEJVTSAgICAgICAgICAgICAgICAgMHhCQTAyCisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fQUxCVU0gICAgICAgICAgICAgICAgIDB4QkEwMworI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX0FMQlVNICAgICAgICAgICAgICAgICAweEJBMDQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9BVl9QTEFZTElTVCAgICAgICAgICAgICAgICAgMHhCQTA1CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQ09OVEFDVF9HUk9VUCAgICAgICAgICAgICAgIDB4QkEwNgorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX01FU1NBR0VfRk9MREVSICAgICAgICAgICAgICAweEJBMDcKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9DSEFQVEVSRURfUFJPRFVDVElPTiAgICAgICAgMHhCQTA4CisjZGVmaW5lIE1UUF9GT1JNQVRfQUJTVFJBQ1RfQVVESU9fUExBWUxJU1QgICAgICAgICAgICAgIDB4QkEwOQorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX1ZJREVPX1BMQVlMSVNUICAgICAgICAgICAgICAweEJBMEEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRURJQUNBU1QgICAgICAgICAgICAgICAgICAgMHhCQTBCIC8vIEZvciB1c2Ugd2l0aCBtZWRpYWNhc3RzOyByZWZlcmVuY2VzIG11bHRpbWVkaWEgZW5jbG9zdXJlcyBvZiBSU1MgZmVlZHMgb3IgZXBpc29kaWMgY29udGVudAorI2RlZmluZSBNVFBfRk9STUFUX1dQTF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NM1VfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTExCisjZGVmaW5lIE1UUF9GT1JNQVRfTVBMX1BMQVlMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkExMgorI2RlZmluZSBNVFBfRk9STUFUX0FTWF9QTEFZTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAweEJBMTMKKyNkZWZpbmUgTVRQX0ZPUk1BVF9QTFNfUExBWUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTE0CisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgIDB4QkE4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0RPQ1VNRU5UICAgICAgICAgICAgICAgICAgICAweEJBODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9YTUxfRE9DVU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQTgyCisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfV09SRF9ET0NVTUVOVCAgICAgICAgICAgICAgICAgICAgIDB4QkE4MworI2RlZmluZSBNVFBfRk9STUFUX01IVF9DT01QSUxFRF9IVE1MX0RPQ1VNRU5UICAgICAgICAgICAweEJBODQKKyNkZWZpbmUgTVRQX0ZPUk1BVF9NU19FWENFTF9TUFJFQURTSEVFVCAgICAgICAgICAgICAgICAgMHhCQTg1CisjZGVmaW5lIE1UUF9GT1JNQVRfTVNfUE9XRVJQT0lOVF9QUkVTRU5UQVRJT04gICAgICAgICAgIDB4QkE4NgorI2RlZmluZSBNVFBfRk9STUFUX1VOREVGSU5FRF9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAweEJCMDAKKyNkZWZpbmUgTVRQX0ZPUk1BVF9BQlNUUkFDVF9NRVNTU0FHRSAgICAgICAgICAgICAgICAgICAgMHhCQjAxCisjZGVmaW5lIE1UUF9GT1JNQVRfVU5ERUZJTkVEX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgIDB4QkI4MAorI2RlZmluZSBNVFBfRk9STUFUX0FCU1RSQUNUX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgICAweEJCODEKKyNkZWZpbmUgTVRQX0ZPUk1BVF9WQ0FSRF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCQjgyCisKKy8vIE1UUCBPYmplY3QgUHJvcGVydHkgQ29kZXMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NUT1JBR0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUk9URUNUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweERDMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVNTT0NJQVRJT05fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BU1NPQ0lBVElPTl9ERVNDICAgICAgICAgICAgICAgICAgICAgICAweERDMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09CSkVDVF9GSUxFX05BTUUgICAgICAgICAgICAgICAgICAgICAgIDB4REMwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfREFURV9DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX01PRElGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTExPV0VEX0ZPTERFUl9DT05URU5UUyAgICAgICAgICAgICAgICAweERDMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0hJRERFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REMwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfU1lTVEVNX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QRVJTSVNURU5UX1VJRCAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NZTkNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPUEVSVFlfQkFHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NSRUFURURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQVJUSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EQVRFX0FVVEhPUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAweERDNDcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzQ5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MQU5HVUFHRV9MT0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAweERDNEEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0NPUFlSSUdIVF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgIDB4REM0QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9PUklHSU5fTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERDNEQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RBVEVfQURERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM0RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfTk9OX0NPTlNVTUFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzRGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9DT1JSVVBUX1VOUExBWUFCTEUgICAgICAgICAgICAgICAgICAgICAweERDNTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BST0RVQ0VSX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgIDB4REM1MQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX0ZPUk1BVCAgICAgICAgICAgMHhEQzgxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfU0laRSAgICAgICAgICAgICAweERDODIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9IRUlHSFQgICAgICAgICAgIDB4REM4MworI2RlZmluZSBNVFBfUFJPUEVSVFlfUkVQUkVTRU5UQVRJVkVfU0FNUExFX1dJRFRIICAgICAgICAgICAgMHhEQzg0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9SRVBSRVNFTlRBVElWRV9TQU1QTEVfRFVSQVRJT04gICAgICAgICAweERDODUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1JFUFJFU0VOVEFUSVZFX1NBTVBMRV9EQVRBICAgICAgICAgICAgIDB4REM4NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzg3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDODgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0RVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9UUkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0dFTlJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM4QworI2RlZmluZSBNVFBfUFJPUEVSVFlfQ1JFRElUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzhECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9MWVJJQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOEUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlNDUklQVElPTl9DT05URU5UX0lEICAgICAgICAgICAgICAgIDB4REM4RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJPRFVDRURfQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VU0VfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NLSVBfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTEFTVF9BQ0NFU1NFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzkzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QQVJFTlRBTF9SQVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAweERDOTQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FVEFfR0VOUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQ09NUE9TRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzk2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRkZFQ1RJVkVfUkFUSU5HICAgICAgICAgICAgICAgICAgICAgICAweERDOTcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQlRJVExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5OAorI2RlZmluZSBNVFBfUFJPUEVSVFlfT1JJR0lOQUxfUkVMRUFTRV9EQVRFICAgICAgICAgICAgICAgICAgMHhEQzk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BTEJVTV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FMQlVNX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTU9PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9EUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQl9ERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4REM5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfSVNfQ1JPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0QxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JU19DT0xPVVJfQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAweERDRDIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lNQUdFX0JJVF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgIDB4RENEMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0Q0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FWFBPU1VSRV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRDUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENENgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVE9UQUxfQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTkxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CSVRSQVRFX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NBTVBMRV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5MworI2RlZmluZSBNVFBfUFJPUEVSVFlfTlVNQkVSX09GX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgMHhERTk0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAweERFOTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NDQU5fVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REU5NworI2RlZmluZSBNVFBfUFJPUEVSVFlfQVVESU9fV0FWRV9DT0RFQyAgICAgICAgICAgICAgICAgICAgICAgMHhERTk5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BVURJT19CSVRSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweERFOUEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1ZJREVPX0ZPVVJDQ19DT0RFQyAgICAgICAgICAgICAgICAgICAgIDB4REU5QgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVklERU9fQklUUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GUkFNRVNfUEVSX1RIT1VTQU5EX1NFQ09ORFMgICAgICAgICAgICAweERFOUQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0tFWUZSQU1FX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgIDB4REU5RQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERTlGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTkNPRElOR19RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgICAweERFQTAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VOQ09ESU5HX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgIDB4REVBMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRElTUExBWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CT0RZX1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERDRTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RENFMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQ0UzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9HSVZFTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01JRERMRV9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDAyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QUkVGSVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMDMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1NVRkZJWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfR0lWRU5fTkFNRSAgICAgICAgICAgICAgICAgICAgMHhERDA1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORVRJQ19GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAgICAweEREMDYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX1BSSU1BUlkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQwNworI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfUEVSU09OQUxfMSAgICAgICAgICAgICAgICAgICAgICAgMHhERDA4CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9QRVJTT05BTF8yICAgICAgICAgICAgICAgICAgICAgICAweEREMDkKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0VNQUlMX0JVU0lORVNTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4REQwQQorI2RlZmluZSBNVFBfUFJPUEVSVFlfRU1BSUxfQlVTSU5FU1NfMiAgICAgICAgICAgICAgICAgICAgICAgMHhERDBCCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FTUFJTF9PVEhFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMEMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgIDB4REQwRAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgMHhERDBFCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfUEVSU09OQUxfMiAgICAgICAgICAgICAgICAweEREMEYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9CVVNJTkVTUyAgICAgICAgICAgICAgICAgIDB4REQxMAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVfTlVNQkVSX0JVU0lORVNTXzIgICAgICAgICAgICAgICAgMHhERDExCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfTU9CSUxFICAgICAgICAgICAgICAgICAgICAweEREMTIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BIT05FX05VTUJFUl9NT0JJTEVfMiAgICAgICAgICAgICAgICAgIDB4REQxMworI2RlZmluZSBNVFBfUFJPUEVSVFlfRkFYX05VTUJFUl9QUklNQVJZICAgICAgICAgICAgICAgICAgICAgMHhERDE0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9GQVhfTlVNQkVSX1BFUlNPTkFMICAgICAgICAgICAgICAgICAgICAweEREMTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0ZBWF9OVU1CRVJfQlVTSU5FU1MgICAgICAgICAgICAgICAgICAgIDB4REQxNgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEFHRVJfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDE3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QSE9ORV9OVU1CRVJfT1RIRVJTICAgICAgICAgICAgICAgICAgICAweEREMTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BSSU1BUllfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4REQxOQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEVSU09OQUxfV0VCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHhERDFBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CVVNJTkVTU19XRUJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAweEREMUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0lOU1RBTlRfTUVTU0FOR0VSX0FERFJFU1MgICAgICAgICAgICAgIDB4REQxQworI2RlZmluZSBNVFBfUFJPUEVSVFlfSU5TVEFOVF9NRVNTQU5HRVJfQUREUkVTU18yICAgICAgICAgICAgMHhERDFECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9JTlNUQU5UX01FU1NBTkdFUl9BRERSRVNTXzMgICAgICAgICAgICAweEREMUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0ZVTEwgICAgICAgICAgIDB4REQxRgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfTElORV8xICAgICAgICAgMHhERDIwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9MSU5FXzIgICAgICAgICAweEREMjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NJVFkgICAgICAgICAgIDB4REQyMgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfUEVSU09OQUxfUkVHSU9OICAgICAgICAgMHhERDIzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19QRVJTT05BTF9QT1NUQUxfQ09ERSAgICAweEREMjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX1BFUlNPTkFMX0NPVU5UUlkgICAgICAgIDB4REQyNQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfRlVMTCAgICAgICAgICAgMHhERDI2CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19MSU5FXzEgICAgICAgICAweEREMjcKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX0xJTkVfMiAgICAgICAgIDB4REQyOAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ0lUWSAgICAgICAgICAgMHhERDI5CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19CVVNJTkVTU19SRUdJT04gICAgICAgICAweEREMkEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX0JVU0lORVNTX1BPU1RBTF9DT0RFICAgIDB4REQyQgorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfQlVTSU5FU1NfQ09VTlRSWSAgICAgICAgMHhERDJDCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9GVUxMICAgICAgICAgICAgICAweEREMkQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX0xJTkVfMSAgICAgICAgICAgIDB4REQyRQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfTElORV8yICAgICAgICAgICAgMHhERDJGCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DSVRZICAgICAgICAgICAgICAweEREMzAKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1BPU1RBTF9BRERSRVNTX09USEVSX1JFR0lPTiAgICAgICAgICAgIDB4REQzMQorI2RlZmluZSBNVFBfUFJPUEVSVFlfUE9TVEFMX0FERFJFU1NfT1RIRVJfUE9TVEFMX0NPREUgICAgICAgMHhERDMyCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9QT1NUQUxfQUREUkVTU19PVEhFUl9DT1VOVFJZICAgICAgICAgICAweEREMzMKKyNkZWZpbmUgTVRQX1BST1BFUlRZX09SR0FOSVpBVElPTl9OQU1FICAgICAgICAgICAgICAgICAgICAgIDB4REQzNAorI2RlZmluZSBNVFBfUFJPUEVSVFlfUEhPTkVUSUNfT1JHQU5JWkFUSU9OX05BTUUgICAgICAgICAgICAgMHhERDM1CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9ST0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEREMzYKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0JJUlRIREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQzNworI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX0NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENDEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfQkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfTUVTU0FHRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDQzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRVNTQUdFX1JFQ0VJVkVEX1RJTUUgICAgICAgICAgICAgICAgICAweERENDQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX01FU1NBR0VfU0VOREVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ0NQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQkVHSU5fVElNRSAgICAgICAgICAgICAgICAgICAgMHhERDUwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9FTkRfVElNRSAgICAgICAgICAgICAgICAgICAgICAweERENTEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgIDB4REQ1MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVRVUlSRURfQVRURU5ERUVTICAgICAgICAgICAgMHhERDU0CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PUFRJT05BTF9BVFRFTkRFRVMgICAgICAgICAgICAweERENTUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAgIDB4REQ1NgorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfQUNDRVBURUQgICAgICAgICAgICAgICAgICAgICAgMHhERDU3CisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9URU5UQVRJVkUgICAgICAgICAgICAgICAgICAgICAweERENTgKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAgICAgIDB4REQ1OQorI2RlZmluZSBNVFBfUFJPUEVSVFlfQUNUSVZJVFlfUkVNQUlOREVSX1RJTUUgICAgICAgICAgICAgICAgMHhERDVBCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9BQ1RJVklUWV9PV05FUiAgICAgICAgICAgICAgICAgICAgICAgICAweERENUIKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0FDVElWSVRZX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1QworI2RlZmluZSBNVFBfUFJPUEVSVFlfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDVECisjZGVmaW5lIE1UUF9QUk9QRVJUWV9FRElUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENUUKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1dFQk1BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ1RgorI2RlZmluZSBNVFBfUFJPUEVSVFlfVVJMX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYwCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9VUkxfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweERENjEKKyNkZWZpbmUgTVRQX1BST1BFUlRZX1RJTUVfQk9PS01BUksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ2MgorI2RlZmluZSBNVFBfUFJPUEVSVFlfT0JKRUNUX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgMHhERDYzCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9CWVRFX0JPT0tNQVJLICAgICAgICAgICAgICAgICAgICAgICAgICAweERENjQKKyNkZWZpbmUgTVRQX1BST1BFUlRZX0xBU1RfQlVJTERfREFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4REQ3MAorI2RlZmluZSBNVFBfUFJPUEVSVFlfVElNRV9UT19MSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERDcxCisjZGVmaW5lIE1UUF9QUk9QRVJUWV9NRURJQV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweERENzIKKworLy8gTVRQIERldmljZSBQcm9wZXJ0eSBDb2RlcworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAwCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQkFUVEVSWV9MRVZFTCAgICAgICAgICAgICAgICAgICAweDUwMDEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GVU5DVElPTkFMX01PREUgICAgICAgICAgICAgICAgIDB4NTAwMgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0lNQUdFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMHg1MDAzCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09NUFJFU1NJT05fU0VUVElORyAgICAgICAgICAgICAweDUwMDQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9XSElURV9CQUxBTkNFICAgICAgICAgICAgICAgICAgIDB4NTAwNQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1JHQl9HQUlOICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA2CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRl9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDcKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9GT0NBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4NTAwOAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZPQ1VTX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgMHg1MDA5CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDUwMEEKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9NRVRFUklOR19NT0RFICAgICAgICAgIDB4NTAwQgorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0ZMQVNIX01PREUgICAgICAgICAgICAgICAgICAgICAgMHg1MDBDCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgICAweDUwMEQKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FWFBPU1VSRV9QUk9HUkFNX01PREUgICAgICAgICAgIDB4NTAwRQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0VYUE9TVVJFX0lOREVYICAgICAgICAgICAgICAgICAgMHg1MDBGCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRVhQT1NVUkVfQklBU19DT01QRU5TQVRJT04gICAgICAweDUwMTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9EQVRFVElNRSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0NBUFRVUkVfREVMQVkgICAgICAgICAgICAgICAgICAgMHg1MDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU1RJTExfQ0FQVFVSRV9NT0RFICAgICAgICAgICAgICAweDUwMTMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9DT05UUkFTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1NIQVJQTkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHg1MDE1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRElHSVRBTF9aT09NICAgICAgICAgICAgICAgICAgICAweDUwMTYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9FRkZFQ1RfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4NTAxNworI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0JVUlNUX05VTUJFUiAgICAgICAgICAgICAgICAgICAgMHg1MDE4CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQlVSU1RfSU5URVJWQUwgICAgICAgICAgICAgICAgICAweDUwMTkKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9USU1FTEFQU0VfTlVNQkVSICAgICAgICAgICAgICAgIDB4NTAxQQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1RJTUVMQVBTRV9JTlRFUlZBTCAgICAgICAgICAgICAgMHg1MDFCCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfRk9DVVNfTUVURVJJTkdfTU9ERSAgICAgICAgICAgICAweDUwMUMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9VUExPQURfVVJMICAgICAgICAgICAgICAgICAgICAgIDB4NTAxRAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0FSVElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDFFCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfQ09QWVJJR0hUX0lORk8gICAgICAgICAgICAgICAgICAweDUwMUYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TWU5DSFJPTklaQVRJT05fUEFSVE5FUiAgICAgICAgIDB4RDQwMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9GUklFTkRMWV9OQU1FICAgICAgICAgICAgMHhENDAyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAweEQ0MDMKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9TVVBQT1JURURfRk9STUFUU19PUkRFUkVEICAgICAgIDB4RDQwNAorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX0RFVklDRV9JQ09OICAgICAgICAgICAgICAgICAgICAgMHhENDA1CisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfUExBWUJBQ0tfUkFURSAgICAgICAgICAgICAgICAgICAweEQ0MTAKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QTEFZQkFDS19PQkpFQ1QgICAgICAgICAgICAgICAgIDB4RDQxMQorI2RlZmluZSBNVFBfREVWSUNFX1BST1BFUlRZX1BMQVlCQUNLX0NPTlRBSU5FUl9JTkRFWCAgICAgICAgMHhENDEyCisjZGVmaW5lIE1UUF9ERVZJQ0VfUFJPUEVSVFlfU0VTU0lPTl9JTklUSUFUT1JfVkVSU0lPTl9JTkZPICAweEQ0MDYKKyNkZWZpbmUgTVRQX0RFVklDRV9QUk9QRVJUWV9QRVJDRUlWRURfREVWSUNFX1RZUEUgICAgICAgICAgIDB4RDQwNworCisvLyBNVFAgT3BlcmF0aW9uIENvZGVzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9PUEVOX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0NMT1NFX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAzCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTICAgICAgICAgICAgICAgICAgICAgICAweDEwMDQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfU1RPUkFHRV9JTkZPICAgICAgICAgICAgICAgICAgICAgIDB4MTAwNQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9OVU1fT0JKRUNUUyAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA2CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9IQU5ETEVTICAgICAgICAgICAgICAgICAgICAweDEwMDcKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgIDB4MTAwOAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDA5CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX1RIVU1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9ERUxFVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwQgorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFTkRfT0JKRUNUX0lORk8gICAgICAgICAgICAgICAgICAgICAgMHgxMDBDCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMEQKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9JTklUSUFURV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTAwRQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0ZPUk1BVF9TVE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDBGCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTAKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRUxGX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPVEVDVElPTiAgICAgICAgICAgICAgICAgMHgxMDEyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX1BST1BfREVTQyAgICAgICAgICAgICAgICAgIDB4MTAxNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgICAgMHgxMDE1CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDEwMTYKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9SRVNFVF9ERVZJQ0VfUFJPUF9WQUxVRSAgICAgICAgICAgICAgIDB4MTAxNworI2RlZmluZSBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUgICAgICAgICAgICAgICAgMHgxMDE4CisjZGVmaW5lIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMTkKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxQQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9QQVJUSUFMX09CSkVDVCAgICAgICAgICAgICAgICAgICAgMHgxMDFCCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fSU5JVElBVEVfT1BFTl9DQVBUVVJFICAgICAgICAgICAgICAgICAweDEwMUMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BTX1NVUFBPUlRFRCAgICAgICAgICAgIDB4OTgwMQorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUF9ERVNDICAgICAgICAgICAgICAgICAgMHg5ODAyCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fR0VUX09CSkVDVF9QUk9QX1ZBTFVFICAgICAgICAgICAgICAgICAweDk4MDMKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TRVRfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgIDB4OTgwNAorI2RlZmluZSBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUkVGRVJFTkNFUyAgICAgICAgICAgICAgICAgMHg5ODEwCisjZGVmaW5lIE1UUF9PUEVSQVRJT05fU0VUX09CSkVDVF9SRUZFUkVOQ0VTICAgICAgICAgICAgICAgICAweDk4MTEKKyNkZWZpbmUgTVRQX09QRVJBVElPTl9TS0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgyMAorCisvLyBNVFAgUmVzcG9uc2UgQ29kZXMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fTk9UX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfVFJBTlNBQ1RJT05fSUQgICAgICAgICAgICAgICAgICAgICAweDIwMDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUkFNRVRFUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAweDIwMDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOQ09NUExFVEVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0ZPUk1BVF9DT0RFICAgICAgICAgICAgICAgICAweDIwMEIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JBR0VfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9XUklURV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAweDIwMEQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0FDQ0VTU19ERU5JRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMEYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1RIVU1CTkFJTF9QUkVTRU5UICAgICAgICAgICAgICAgICAgICAgICAweDIwMTAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFTEZfVEVTVF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1BBUlRJQUxfREVMRVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NUT1JFX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfRk9STUFUX1VOU1VQUE9SVEVEICAgICAgICAweDIwMTQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX05PX1ZBTElEX09CSkVDVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAweDIwMTUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfQ09ERV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1VOS05PV05fVkVORE9SX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0NBUFRVUkVfQUxSRUFEWV9URVJNSU5BVEVEICAgICAgICAgICAgICAgICAweDIwMTgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0RFVklDRV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMTkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAweDIwMUEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweDIwMUIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREVWSUNFX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweDIwMUMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMUQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NFU1NJT05fQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAweDIwMUUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1RSQU5TQUNUSU9OX0NBTkNFTExFRCAgICAgICAgICAgICAgICAgICAgICAweDIwMUYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fT0ZfREVTVElOQVRJT05fVU5TVVBQT1JURUQgICAweDIwMjAKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfQ09ERSAgICAgICAgICAgICAgICAgICAweEE4MDEKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfRk9STUFUICAgICAgICAgICAgICAgICAweEE4MDIKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1BST1BfVkFMVUUgICAgICAgICAgICAgICAgICAweEE4MDMKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX1JFRkVSRU5DRSAgICAgICAgICAgICAgICAgICAweEE4MDQKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0dST1VQX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDUKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX0lOVkFMSURfREFUQVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDYKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfR1JPVVBfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDcKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX1NQRUNJRklDQVRJT05fQllfREVQVEhfVU5TVVBQT1JURUQgICAgICAgICAweEE4MDgKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9UT09fTEFSR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4MDkKKyNkZWZpbmUgTVRQX1JFU1BPTlNFX09CSkVDVF9QUk9QX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAweEE4MEEKKworLy8gTVRQIEV2ZW50IENvZGVzCisjZGVmaW5lIE1UUF9FVkVOVF9VTkRFRklORUQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE1UUF9FVkVOVF9DQU5DRUxfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfQURERUQgICAgICAgICAgICAgICAgICAgICAgMHg0MDAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9BRERFRCAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVEICAgICAgICAgICAgICAgICAgICAgMHg0MDA1CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA3CisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfSU5GT19DSEFOR0VEICAgICAgICAgICAgICAgMHg0MDA4CisjZGVmaW5lIE1UUF9FVkVOVF9SRVFVRVNUX09CSkVDVF9UUkFOU0ZFUiAgICAgICAgICAgMHg0MDA5CisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDBBCisjZGVmaW5lIE1UUF9FVkVOVF9ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgMHg0MDBCCisjZGVmaW5lIE1UUF9FVkVOVF9TVE9SQUdFX0lORk9fQ0hBTkdFRCAgICAgICAgICAgICAgMHg0MDBDCisjZGVmaW5lIE1UUF9FVkVOVF9DQVBUVVJFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgMHg0MDBECisjZGVmaW5lIE1UUF9FVkVOVF9VTlJFUE9SVEVEX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg0MDBFCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9DSEFOR0VEICAgICAgICAgICAgICAgMHhDODAxCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUFJPUF9ERVNDX0NIQU5HRUQgICAgICAgICAgMHhDODAyCisjZGVmaW5lIE1UUF9FVkVOVF9PQkpFQ1RfUkVGRVJFTkNFU19DSEFOR0VEICAgICAgICAgMHhDODAzCisKKy8vIFN0b3JhZ2UgVHlwZQorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9ST00gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUk9NICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNVFBfU1RPUkFHRV9GSVhFRF9SQU0gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBNVFBfU1RPUkFHRV9SRU1PVkFCTEVfUkFNICAgICAgICAgICAgICAgICAgIDB4MDAwNAorCisvLyBTdG9yYWdlIEZpbGUgU3lzdGVtCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRkxBVCAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fSElFUkFSQ0hJQ0FMICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE1UUF9TVE9SQUdFX0ZJTEVTWVNURU1fRENGICAgICAgICAgICAgICAgICAgMHgwMDAzCisKKy8vIFN0b3JhZ2UgQWNjZXNzIENhcGFiaWxpdHkKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9XUklURSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhPVVRfREVMRVRFICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVRQX1NUT1JBR0VfUkVBRF9PTkxZX1dJVEhfREVMRVRFICAgICAgICAgICAweDAwMDIKKworLy8gQXNzb2NpYXRpb24gVHlwZQorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9VTkRFRklORUQgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNVFBfQVNTT0NJQVRJT05fVFlQRV9HRU5FUklDX0ZPTERFUiAgICAgICAgIDB4MDAwMQorCisjZW5kaWYgLy8gX01UUF9ICmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMjk3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gQ2FtZXJhQnJvd3NlcgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUwYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlciI+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9hcHBfbGFiZWwiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDYW1lcmFCcm93c2VyIiBhbmRyb2lkOmxhYmVsPSJDYW1lcmEgQnJvd3NlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iU3RvcmFnZUJyb3dzZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik9iamVjdEJyb3dzZXIiIC8+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik9iamVjdFZpZXdlciIgLz4KKworICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSJVc2JSZWNlaXZlciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5hY3Rpb24uVVNCX0NBTUVSQV9BVFRBQ0hFRCIgLz4KKyAgICAgICAgICAgICAgICA8ZGF0YSBhbmRyb2lkOnNjaGVtZT0iY29udGVudCIvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3JlY2VpdmVyPgorCisgICAgPC9hcHBsaWNhdGlvbj4KKworCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbGF5b3V0L29iamVjdF9pbmZvLnhtbCBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmZDgzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfaW5mby54bWwKQEAgLTAsMCArMSwxNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxUYWJsZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9vYmplY3RfaW5mbyIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL25hbWVfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmFtZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbmFtZSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaXplIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1iX2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGh1bWJfc2l6ZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90aHVtYl9zaXplX2xhYmVsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb19sYWJlbCIgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYl9zaXplIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy93aWR0aF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvd2lkdGgiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9oZWlnaHRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlaWdodCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGVwdGhfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RlcHRoIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXF1ZW5jZV9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2VxdWVuY2UiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NyZWF0ZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY3JlYXRlZF9sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY3JlYXRlZCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvaW5mb192YWx1ZSIgLz4KKyAgICA8L1RhYmxlUm93PgorICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbW9kaWZpZWRfbGFiZWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX2xhYmVsIiAvPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21vZGlmaWVkIgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9pbmZvX3ZhbHVlIiAvPgorICAgIDwvVGFibGVSb3c+CisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9rZXl3b3Jkc19sYWJlbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fbGFiZWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQva2V5d29yZHMiCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL2luZm9fdmFsdWUiIC8+CisgICAgPC9UYWJsZVJvdz4KKyAgICA8VGFibGVSb3c+CisgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aHVtYm5haWwiIC8+CisgICAgPC9UYWJsZVJvdz4KKzwvVGFibGVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL2xheW91dC9vYmplY3RfbGlzdC54bWwgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy9sYXlvdXQvb2JqZWN0X2xpc3QueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisgICAgCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RodW1ibmFpbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9uYW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvbWVudS9vYmplY3RfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NjVmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL21lbnUvb2JqZWN0X21lbnUueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NhdmUiCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvc2F2ZV9pdGVtIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZGVsZXRlIgorICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2RlbGV0ZV9pdGVtIiAvPgorPC9tZW51PgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzUxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9sYWJlbCI+Q2FtZXJhIEJyb3dzZXI8L3N0cmluZz4KKworICAgIDwhLS0gZm9yIG9iamVjdCBpbmZvIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibmFtZV9sYWJlbCI+TmFtZTogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaXplX2xhYmVsIj5TaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRodW1iX3dpZHRoX2xhYmVsIj5UaHVtYiBXaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9oZWlnaHRfbGFiZWwiPlRodW1iIEhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aHVtYl9zaXplX2xhYmVsIj5UaHVtYiBTaXplOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndpZHRoX2xhYmVsIj5XaWR0aDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJoZWlnaHRfbGFiZWwiPkhlaWdodDogPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkZXB0aF9sYWJlbCI+RGVwdGg6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2VxdWVuY2VfbGFiZWwiPlNlcXVlbmNlOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZWRfbGFiZWwiPkNyZWF0ZWQ6IDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9kaWZpZWRfbGFiZWwiPk1vZGlmaWVkOiA8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImtleXdvcmRzX2xhYmVsIj5LZXl3b3JkczogPC9zdHJpbmc+CisKKyAgICA8IS0tIG1lbnUgaXRlbXMgLS0+CisgICAgPHN0cmluZyBuYW1lPSJzYXZlX2l0ZW0iPlNhdmU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlbGV0ZV9pdGVtIj5EZWxldGU8L3N0cmluZz4KKworICAgIDwhLS0gdG9hc3RzIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ib2JqZWN0X3NhdmVkX21lc3NhZ2UiPk9iamVjdCBzYXZlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9mYWlsZWRfbWVzc2FnZSI+Q291bGQgbm90IHNhdmUgb2JqZWN0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJvYmplY3RfZGVsZXRlZF9tZXNzYWdlIj5PYmplY3QgZGVsZXRlZDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVsZXRlX2ZhaWxlZF9tZXNzYWdlIj5Db3VsZCBub3QgZGVsZXRlIG9iamVjdDwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9yZXMvdmFsdWVzL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2OTk4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9ImluZm9fbGFiZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1JpZ2h0Ij40ZGlwPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iaW5mb192YWx1ZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvQ2FtZXJhQnJvd3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDg3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL0NhbWVyYUJyb3dzZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIGNvbm5lY3RlZCBjYW1lcmFzLgorICovCitwdWJsaWMgY2xhc3MgQ2FtZXJhQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbWVyYUJyb3dzZXIiOworCisgICAgcHJpdmF0ZSBMaXN0QWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisgICAgcHJpdmF0ZSBEZXZpY2VPYnNlcnZlciBtRGV2aWNlT2JzZXJ2ZXI7CisgICAgcHJpdmF0ZSBDdXJzb3IgbUN1cnNvcjsKKworICAgIHByaXZhdGUgY2xhc3MgRGV2aWNlT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgeworICAgICAgICBEZXZpY2VPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGV2aWNlT2JzZXJ2ZXIub25DaGFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChtQ3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3Vyc29yLnJlcXVlcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFVklDRV9DT0xVTU5TID0KKyAgICAgICAgIG5ldyBTdHJpbmdbXSB7IE10cC5EZXZpY2UuX0lELCBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtUmVzb2x2ZXIgPSBnZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgbURldmljZU9ic2VydmVyID0gbmV3IERldmljZU9ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoTXRwLkRldmljZS5DT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICBERVZJQ0VfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgc3RhcnRNYW5hZ2luZ0N1cnNvcihjKTsKKyAgICAgICAgbUN1cnNvciA9IGM7CisKKyAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8yLnhtbAorICAgICAgICBtQWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBNdHAuRGV2aWNlLk1BTlVGQUNUVVJFUiwgTXRwLkRldmljZS5NT0RFTCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICAvLyByZWdpc3RlciBmb3IgY2hhbmdlcyB0byB0aGUgZGV2aWNlIGxpc3QKKyAgICAgICAgbVJlc29sdmVyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKE10cC5EZXZpY2UuQ09OVEVOVF9VUkksIHRydWUsIG1EZXZpY2VPYnNlcnZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtUmVzb2x2ZXIudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtRGV2aWNlT2JzZXJ2ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBTdG9yYWdlQnJvd3Nlci5jbGFzcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgKGludCltQWRhcHRlci5nZXRJdGVtSWQocG9zaXRpb24pKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9PYmplY3RCcm93c2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5OTg5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0QnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5jYW1lcmFicm93c2VyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTXRwQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk10cDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SZXNvdXJjZUN1cnNvckFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKyAvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIG9iamVjdHMgd2l0aGluIGEgY29udGFpbmVyIChmb2xkZXIgb3Igc3RvcmFnZSB1bml0KS4KKyAqLworcHVibGljIGNsYXNzIE9iamVjdEJyb3dzZXIgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJPYmplY3RCcm93c2VyIjsKKworICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CisgICAgcHJpdmF0ZSBPYmplY3RDdXJzb3JBZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgaW50IG1EZXZpY2VJRDsKKyAgICBwcml2YXRlIGludCBtU3RvcmFnZUlEOworICAgIHByaXZhdGUgaW50IG1PYmplY3RJRDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9CSkVDVF9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLk9iamVjdC5fSUQsIE10cC5PYmplY3QuTkFNRSwgTXRwLk9iamVjdC5GT1JNQVQsIE10cC5PYmplY3QuVEhVTUIgfTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MVU1OID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9DT0xVTU4gPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEhVTUJfQ09MVU1OID0gMzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgib2JqZWN0IiwgMCk7CisgICAgICAgIGlmIChtRGV2aWNlSUQgIT0gMCAmJiBtU3RvcmFnZUlEICE9IDApIHsKKyAgICAgICAgICAgIEN1cnNvciBjOworICAgICAgICAgICAgVXJpIHVyaTsKKyAgICAgICAgICAgIGlmIChtT2JqZWN0SUQgPT0gMCkgeworICAgICAgICAgICAgICAgIHVyaSA9IE10cC5PYmplY3QuZ2V0Q29udGVudFVyaUZvclN0b3JhZ2VDaGlsZHJlbihtRGV2aWNlSUQsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmlGb3JPYmplY3RDaGlsZHJlbihtRGV2aWNlSUQsIG1PYmplY3RJRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cuZChUQUcsICJxdWVyeSAiICsgdXJpKTsKKyAgICAgICAgICAgIGMgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeSh1cmksIE9CSkVDVF9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisgICAgICAgICAgICBtQ3Vyc29yID0gYzsKKworICAgICAgICAgICAgLy8gTWFwIEN1cnNvciBjb2x1bW5zIHRvIHZpZXdzIGRlZmluZWQgaW4gc2ltcGxlX2xpc3RfaXRlbV8xLnhtbAorICAgICAgICAgICAgbUFkYXB0ZXIgPSBuZXcgT2JqZWN0Q3Vyc29yQWRhcHRlcih0aGlzLCBjKTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBpbnQgcm93SUQgPSAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbik7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCByb3dJRCksCisgICAgICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfQ09MVU1OUywgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjICsgIiBjb3VudDogIiArIGMuZ2V0Q291bnQoKSk7CisgICAgICAgIGxvbmcgZm9ybWF0ID0gMDsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLmdldENvdW50KCkgPT0gMSkgeworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgbG9uZyByb3dJZCA9IGMuZ2V0TG9uZyhJRF9DT0xVTU4pOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldFN0cmluZyhOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBmb3JtYXQgPSBjLmdldExvbmcoRk9STUFUX0NPTFVNTik7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyb3dJZDogIiArIHJvd0lkICsgIiBuYW1lOiAiICsgbmFtZSArICIgZm9ybWF0OiAiICsgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0ID09IE10cENvbnN0YW50cy5GT1JNQVRfSkZJRikgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQodGhpcywgT2JqZWN0Vmlld2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgiZGV2aWNlIiwgbURldmljZUlEKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RvcmFnZSIsIG1TdG9yYWdlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJvYmplY3QiLHJvd0lEKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIE9iamVjdEJyb3dzZXIuY2xhc3MpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzdG9yYWdlIiwgbVN0b3JhZ2VJRCk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoIm9iamVjdCIsIHJvd0lEKTsKKyAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgT2JqZWN0Q3Vyc29yQWRhcHRlciBleHRlbmRzIFJlc291cmNlQ3Vyc29yQWRhcHRlciB7CisKKyAgICAgICAgcHVibGljIE9iamVjdEN1cnNvckFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgYykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgUi5sYXlvdXQub2JqZWN0X2xpc3QsIGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRWaWV3KFZpZXcgdmlldywgQ29udGV4dCBjb250ZXh0LCBDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICBJbWFnZVZpZXcgdGh1bWJWaWV3ID0gKEltYWdlVmlldyl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnRodW1ibmFpbCk7CisgICAgICAgICAgICBUZXh0VmlldyBuYW1lVmlldyA9IChUZXh0Vmlldyl2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm5hbWUpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIHRodW1ibmFpbAorICAgICAgICAgICAgYnl0ZVtdIHRodW1ibmFpbCA9IGN1cnNvci5nZXRCbG9iKFRIVU1CX0NPTFVNTik7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkodGh1bWJuYWlsLCAwLCB0aHVtYm5haWwubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3Vyc29yLmdldFN0cmluZyhOQU1FX0NPTFVNTik7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZVZpZXcuc2V0VGV4dChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvT2JqZWN0Vmlld2VyLmphdmEgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDljZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL09iamVjdFZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTXRwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworLyoqCisgKiBBIHZpZXcgdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RWaWV3ZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk9iamVjdFZpZXdlciI7CisKKyAgICBwcml2YXRlIGludCBtRGV2aWNlSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVN0b3JhZ2VJRDsKKyAgICBwcml2YXRlIGludCBtT2JqZWN0SUQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPQkpFQ1RfQ09MVU1OUyA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7ICBNdHAuT2JqZWN0Ll9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlRIVU1CX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LklNQUdFX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuSU1BR0VfREVQVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LlNFUVVFTkNFX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuREFURV9DUkVBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5EQVRFX01PRElGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgTXRwLk9iamVjdC5LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICAgIE10cC5PYmplY3QuVEhVTUIsCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm9iamVjdF9pbmZvKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKworICAgICAgICBtRGV2aWNlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgiZGV2aWNlIiwgMCk7CisgICAgICAgIG1TdG9yYWdlSUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgic3RvcmFnZSIsIDApOworICAgICAgICBtT2JqZWN0SUQgPSBnZXRJbnRlbnQoKS5nZXRJbnRFeHRyYSgib2JqZWN0IiwgMCk7CisKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwICYmIG1PYmplY3RJRCAhPSAwKSB7CisgICAgICAgIEN1cnNvciBjID0gZ2V0Q29udGVudFJlc29sdmVyKCkucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBNdHAuT2JqZWN0LmdldENvbnRlbnRVcmkobURldmljZUlELCBtT2JqZWN0SUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUX0NPTFVNTlMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgYy5tb3ZlVG9GaXJzdCgpOworICAgICAgICAgICAgVGV4dFZpZXcgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5uYW1lKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChjLmdldFN0cmluZygxKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnNpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDIpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3dpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZygzKSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC50aHVtYl9oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDQpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLnRodW1iX3NpemUpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDUpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLndpZHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg2KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5oZWlnaHQpOworICAgICAgICAgICAgdmlldy5zZXRUZXh0KExvbmcudG9TdHJpbmcoYy5nZXRMb25nKDcpKSk7CisgICAgICAgICAgICB2aWV3ID0gKFRleHRWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmRlcHRoKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChMb25nLnRvU3RyaW5nKGMuZ2V0TG9uZyg4KSkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zZXF1ZW5jZSk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoTG9uZy50b1N0cmluZyhjLmdldExvbmcoOSkpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY3JlYXRlZCk7CisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShjLmdldExvbmcoMTApICogMTAwMCk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHZpZXcgPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQubW9kaWZpZWQpOworICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGMuZ2V0TG9uZygxMSkgKiAxMDAwKTsKKyAgICAgICAgICAgIHZpZXcuc2V0VGV4dChkYXRlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdmlldyA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5rZXl3b3Jkcyk7CisgICAgICAgICAgICB2aWV3LnNldFRleHQoYy5nZXRTdHJpbmcoMTIpKTsKKyAgICAgICAgICAgIGJ5dGVbXSB0aHVtYm5haWwgPSBjLmdldEJsb2IoMTMpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHRodW1iVmlldyA9IChJbWFnZVZpZXcpZmluZFZpZXdCeUlkKFIuaWQudGh1bWJuYWlsKTsKKyAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkodGh1bWJuYWlsLCAwLCB0aHVtYm5haWwubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lm9iamVjdF9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25QcmVwYXJlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CisgICAgICAgIE1lbnVJdGVtIGl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQuc2F2ZSk7CisgICAgICAgIGl0ZW0uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgaXRlbSA9IG1lbnUuZmluZEl0ZW0oUi5pZC5kZWxldGUpOworICAgICAgICBpdGVtLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgY2FzZSBSLmlkLnNhdmU6CisgICAgICAgICAgICAgICAgc2F2ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBSLmlkLmRlbGV0ZToKKyAgICAgICAgICAgICAgICBkZWxldGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGMuc2V0VGltZUluTWlsbGlzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiV0WS0ldG0tJXRkLSV0SC0ldE0tJXRTIiwgYywgYywgYywgYywgYywgYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmUoKSB7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworICAgICAgICBVcmkgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgbU9iamVjdElEKTsKKyAgICAgICAgRmlsZSBkZXN0RmlsZSA9IG51bGw7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHBmZCA9IG51bGw7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBmZCA9IGdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5GaWxlRGVzY3JpcHRvcih1cmksICJyIik7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzYXZlIGdvdCBwZmQgIiArIHBmZCk7CisgICAgICAgICAgICBpZiAocGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBmZC5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzYXZlIGdvdCBmaXMgIiArIGZpcyk7CisgICAgICAgICAgICAgICAgRmlsZSBkZXN0RGlyID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlUHVibGljRGlyZWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuRElSRUNUT1JZX0RDSU0pOworICAgICAgICAgICAgICAgIGRlc3REaXIubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAiQ2FtZXJhQnJvd3Nlci0iICsgZ2V0VGltZXN0YW1wKCkgKyAiLmpwZWciKTsKKworCisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2F2ZSBnb3QgZGVzdEZpbGUgIiArIGRlc3RGaWxlKTsKKworICAgICAgICAgICAgICAgIGlmIChkZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0RmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOworCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY1NTM2XTsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gZmlzLnJlYWQoYnVmZmVyKSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3Mud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIHVudGlsIHdlIHN0cmFpZ2h0ZW4gb3V0IHBlcm1pc3Npb25zIGluIC9kYXRhL21lZGlhCisgICAgICAgICAgICAgICAgLy8gMTAxNSBpcyBBSURfU0RDQVJEX1JXCisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnNldFBlcm1pc3Npb25zKGRlc3REaXIuZ2V0UGF0aCgpLCAwNzc1LCBQcm9jZXNzLm15VWlkKCksIDEwMTUpOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zZXRQZXJtaXNzaW9ucyhkZXN0RmlsZS5nZXRQYXRoKCksIDA2NjQsIFByb2Nlc3MubXlVaWQoKSwgMTAxNSk7CisKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBPYmplY3RWaWV3LnNhdmUiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBwZmQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01FRElBX1NDQU5ORVJfU0NBTl9GSUxFKTsKKyAgICAgICAgICAgIGludGVudC5zZXREYXRhKFVyaS5mcm9tRmlsZShkZXN0RmlsZSkpOworICAgICAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcub2JqZWN0X3NhdmVkX21lc3NhZ2UsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcuc2F2ZV9mYWlsZWRfbWVzc2FnZSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlKCkgeworICAgICAgICBVcmkgdXJpID0gTXRwLk9iamVjdC5nZXRDb250ZW50VXJpKG1EZXZpY2VJRCwgbU9iamVjdElEKTsKKworICAgICAgICBMb2cuZChUQUcsICJkZWxldGluZyAiICsgdXJpKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0gZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKHVyaSwgbnVsbCwgbnVsbCk7CisgICAgICAgIGlmIChyZXN1bHQgPiAwKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dCh0aGlzLCBSLnN0cmluZy5vYmplY3RfZGVsZXRlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgUi5zdHJpbmcuZGVsZXRlX2ZhaWxlZF9tZXNzYWdlLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YSBiL21lZGlhL3Rlc3RzL0NhbWVyYUJyb3dzZXIvc3JjL2NvbS9hbmRyb2lkL2NhbWVyYWJyb3dzZXIvU3RvcmFnZUJyb3dzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRmNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9TdG9yYWdlQnJvd3Nlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmNhbWVyYWJyb3dzZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TaW1wbGVDdXJzb3JBZGFwdGVyOworCisvKioKKyAqIEEgbGlzdCB2aWV3IGRpc3BsYXlpbmcgYWxsIHN0b3JhZ2UgdW5pdHMgb24gYSBkZXZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTdG9yYWdlQnJvd3NlciBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0b3JhZ2VCcm93c2VyIjsKKworICAgIHByaXZhdGUgTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7CisgICAgcHJpdmF0ZSBpbnQgbURldmljZUlEOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RPUkFHRV9DT0xVTU5TID0KKyAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuX0lELCBNdHAuU3RvcmFnZS5ERVNDUklQVElPTiB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworCisgICAgICAgIG1EZXZpY2VJRCA9IGdldEludGVudCgpLmdldEludEV4dHJhKCJkZXZpY2UiLCAwKTsKKyAgICAgICAgaWYgKG1EZXZpY2VJRCAhPSAwKSB7CisgICAgICAgICAgICBDdXJzb3IgYyA9IGdldENvbnRlbnRSZXNvbHZlcigpLnF1ZXJ5KE10cC5TdG9yYWdlLmdldENvbnRlbnRVcmkobURldmljZUlEKSwKKyAgICAgICAgICAgICAgICAgICAgU1RPUkFHRV9DT0xVTU5TLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXJ5IHJldHVybmVkICIgKyBjKTsKKyAgICAgICAgICAgIHN0YXJ0TWFuYWdpbmdDdXJzb3IoYyk7CisKKyAgICAgICAgICAgIC8vIE1hcCBDdXJzb3IgY29sdW1ucyB0byB2aWV3cyBkZWZpbmVkIGluIHNpbXBsZV9saXN0X2l0ZW1fMS54bWwKKyAgICAgICAgICAgIG1BZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIodGhpcywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTXRwLlN0b3JhZ2UuREVTQ1JJUFRJT04gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEsIGFuZHJvaWQuUi5pZC50ZXh0MiB9KTsKKyAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBPYmplY3RCcm93c2VyLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJkZXZpY2UiLCBtRGV2aWNlSUQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoInN0b3JhZ2UiLCAoaW50KW1BZGFwdGVyLmdldEl0ZW1JZChwb3NpdGlvbikpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhIGIvbWVkaWEvdGVzdHMvQ2FtZXJhQnJvd3Nlci9zcmMvY29tL2FuZHJvaWQvY2FtZXJhYnJvd3Nlci9Vc2JSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNWIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9DYW1lcmFCcm93c2VyL3NyYy9jb20vYW5kcm9pZC9jYW1lcmFicm93c2VyL1VzYlJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuY2FtZXJhYnJvd3NlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuVXNiOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVXNiUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVXNiUmVjZWl2ZXIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBMb2cuZChUQUcsICJvblJlY2VpdmUgIiArIGludGVudCk7CisgICAgICAgIGlmIChVc2IuQUNUSU9OX1VTQl9DQU1FUkFfQVRUQUNIRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIFVyaSB1cmkgPSBpbnRlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChjb250ZXh0LCBTdG9yYWdlQnJvd3Nlci5jbGFzcyk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gYWRkIGEgd3JhcHBlciB0byBNdHAuRGV2aWNlIGZvciB0aGlzCisgICAgICAgICAgICAgICAgaW50IGlkID0gSW50ZWdlci5wYXJzZUludCh1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoImRldmljZSIsIGlkKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYmFkIGRldmljZSBVcmkgIiArIHVyaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tayBiL21lZGlhL3Rlc3RzL210cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDc0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDYxIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJbXRwLmNwcCBcCisJTXRwRmlsZS5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbXRwIFwKKworTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0hPU1QKKworTE9DQUxfTU9EVUxFIDo9IG10cAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0IGxpYnV0aWxzIGxpYmN1dGlscworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworZW5kaWYKKworaWZlcSAoJChIT1NUX09TKSxsaW51eCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJbXRwLmNwcCBcCisJTXRwRmlsZS5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAgXAorCS4uLy4uLy4uL2xpYnMvdXRpbHMvU2hhcmVkQnVmZmVyLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9UaHJlYWRzLmNwcCBcCisJLi4vLi4vLi4vbGlicy91dGlscy9WZWN0b3JJbXBsLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9tdHAgXAorCitMT0NBTF9DRkxBR1MgOj0gLURNVFBfSE9TVCAtZyAtTzAKKworaGF2ZV9yZWFkbGluZSA6PSAkKHdpbGRjYXJkIC91c3IvaW5jbHVkZS9yZWFkbGluZS9yZWFkbGluZS5oKQoraGF2ZV9oaXN0b3J5IDo9ICQod2lsZGNhcmQgL3Vzci9saWIvbGliaGlzdG9yeSopCitpZm5lcSAoJChzdHJpcCAkKGhhdmVfcmVhZGxpbmUpKSwpCitMT0NBTF9DRkxBR1MgKz0gLURIQVZFX1JFQURMSU5FPTEKK2VuZGlmCisKK0xPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKK2lmbmVxICgkKHN0cmlwICQoaGF2ZV9yZWFkbGluZSkpLCkKK0xPQ0FMX0xETElCUyArPSAtbHJlYWRsaW5lIC1sbmN1cnNlcworZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoaGF2ZV9oaXN0b3J5KSksKQorTE9DQUxfTERMSUJTICs9IC1saGlzdG9yeQorZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IG10cAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm10cCBsaWJ1c2Job3N0IGxpYmN1dGlscworCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwIGIvbWVkaWEvdGVzdHMvbXRwL010cEZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZDMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlSW5mby5oIgorI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKKyNpbmNsdWRlICJNdHBTdG9yYWdlLmgiCisjaW5jbHVkZSAiTXRwVXRpbHMuaCIKKworI2luY2x1ZGUgIk10cEZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBDbGllbnQqIE10cEZpbGU6OnNDbGllbnQgPSBOVUxMOworCitNdHBGaWxlOjpNdHBGaWxlKE10cERldmljZSogZGV2aWNlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKDApLAorICAgICAgICBtSGFuZGxlKDApCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKHN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKDApCit7Cit9CisKK010cEZpbGU6Ok10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlKQorICAgIDogICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1TdG9yYWdlKHN0b3JhZ2UpLAorICAgICAgICBtSGFuZGxlKGhhbmRsZSkKK3sKK30KKworTXRwRmlsZTo6TXRwRmlsZShNdHBGaWxlKiBmaWxlKQorICAgIDogICBtRGV2aWNlKGZpbGUtPm1EZXZpY2UpLAorICAgICAgICBtU3RvcmFnZShmaWxlLT5tU3RvcmFnZSksCisgICAgICAgIG1IYW5kbGUoZmlsZS0+bUhhbmRsZSkKK3sKK30KKworTXRwRmlsZTo6fk10cEZpbGUoKSB7Cit9CisKK3ZvaWQgTXRwRmlsZTo6cHJpbnQoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKworICAgIH0gZWxzZSBpZiAobVN0b3JhZ2UpIHsKKyAgICAgICAgcHJpbnRmKCIleFxuIiwgbVN0b3JhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpZCA9IG1EZXZpY2UtPmdldElEKCk7CisgICAgICAgIE10cERldmljZUluZm8qIGluZm8gPSBtRGV2aWNlLT5nZXREZXZpY2VJbmZvKCk7CisgICAgICAgIGlmIChpbmZvKQorICAgICAgICAgICAgcHJpbnRmKCIlZFx0JXMgJXMgJXNcbiIsIGlkLCBpbmZvLT5tTWFudWZhY3R1cmVyLCBpbmZvLT5tTW9kZWwsIGluZm8tPm1TZXJpYWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiVkXHQobm8gZGV2aWNlIGluZm8gYXZhaWxhYmxlKVxuIiwgaWQpOworICAgICAgICBkZWxldGUgaW5mbzsKKyAgICB9Cit9CisKK010cE9iamVjdEluZm8qIE10cEZpbGU6OmdldE9iamVjdEluZm8oKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPmdldE9iamVjdEluZm8obUhhbmRsZSk7Cit9CisKK3ZvaWQgTXRwRmlsZTo6bGlzdCgpIHsKKyAgICBpZiAobVN0b3JhZ2UpIHsKKyAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EZXZpY2UtPmdldE9iamVjdEhhbmRsZXMobVN0b3JhZ2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUhhbmRsZSA/IG1IYW5kbGUgOiAtMSkpOworICAgICAgICBpZiAoaGFuZGxlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSAoKmhhbmRsZXMpW2ldOworICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBtRGV2aWNlLT5nZXRPYmplY3RJbmZvKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBtb2RpZmllZFsxMDBdOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG0gdG07CisKKyAgICAgICAgICAgICAgICAgICAgZ210aW1lX3IoJmluZm8tPm1EYXRlTW9kaWZpZWQsICZ0bSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKG1vZGlmaWVkLCBzaXplb2YobW9kaWZpZWQpLCAiJWEgJWIgJWUgJUg6JU06JVMgR01UICVZIiwgJnRtKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyBIYW5kbGU6ICVkIEZvcm1hdDogJTA0WCBTaXplOiAlZCBNb2RpZmllZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bU5hbWUsIGhhbmRsZSwgaW5mby0+bUZvcm1hdCwgaW5mby0+bUNvbXByZXNzZWRTaXplLCBtb2RpZmllZCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbmZvOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbGlzdCBzdG9yYWdlIHVuaXRzIGZvciBkZXZpY2UKKyAgICAgICAgTXRwU3RvcmFnZUlETGlzdCogc3RvcmFnZUxpc3QgPSBtRGV2aWNlLT5nZXRTdG9yYWdlSURzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmFnZUxpc3QtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gKCpzdG9yYWdlTGlzdClbaV07CisgICAgICAgICAgICBwcmludGYoIiV4XG4iLCBzdG9yYWdlSUQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE10cEZpbGU6OmluaXQoTXRwQ2xpZW50KiBjbGllbnQpIHsKKyAgICBzQ2xpZW50ID0gY2xpZW50OworfQorCitNdHBGaWxlKiBNdHBGaWxlOjpwYXJzZVBhdGgoTXRwRmlsZSogYmFzZSwgY2hhciogcGF0aCkgeworICAgIE10cERldmljZSogZGV2aWNlID0gTlVMTDsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZSA9IDA7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IDA7CisKKyAgICBpZiAocGF0aFswXSAhPSAnLycgJiYgYmFzZSkgeworICAgICAgICBkZXZpY2UgPSBiYXNlLT5tRGV2aWNlOworICAgICAgICBzdG9yYWdlID0gYmFzZS0+bVN0b3JhZ2U7CisgICAgICAgIGhhbmRsZSA9IGJhc2UtPm1IYW5kbGU7CisgICAgfQorCisgICAgLy8gcGFyc2UgYW4gYWJzb2x1dGUgcGF0aAorICAgIGlmIChwYXRoWzBdID09ICcvJykKKyAgICAgICAgcGF0aCsrOworICAgIGNoYXIqIHRvayA9IHN0cnRvayhwYXRoLCAiLyIpOworICAgIHdoaWxlICh0b2spIHsKKyAgICAgICAgaWYgKHN0b3JhZ2UpIHsKKyAgICAgICAgICAgIC8vIGZpbmQgY2hpbGQgb2YgY3VycmVudCBoYW5kbGUKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZUxpc3QqIGhhbmRsZXMgPSBkZXZpY2UtPmdldE9iamVjdEhhbmRsZXMoc3RvcmFnZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFuZGxlID8gaGFuZGxlIDogLTEpKTsKKyAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBjaGlsZEhhbmRsZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChoYW5kbGVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzLT5zaXplKCkgJiYgIWNoaWxkSGFuZGxlOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9ICgqaGFuZGxlcylbaV07CisgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIGluZm8gPSBkZXZpY2UtPmdldE9iamVjdEluZm8oaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gJiYgIXN0cmNtcCh0b2ssIGluZm8tPm1OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSGFuZGxlID0gaGFuZGxlOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW5mbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGRIYW5kbGUpCisgICAgICAgICAgICAgICAgaGFuZGxlID0gY2hpbGRIYW5kbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQ7CisgICAgICAgICAgICAvLyBmaW5kIHN0b3JhZ2UgZm9yIHRoZSBkZXZpY2UKKyAgICAgICAgICAgIGlmIChzc2NhbmYodG9rLCAiJXgiLCAmaWQpID09IDEpIHsKKyAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSURMaXN0KiBzdG9yYWdlTGlzdCA9IGRldmljZS0+Z2V0U3RvcmFnZUlEcygpOworICAgICAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JhZ2VMaXN0LT5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKCpzdG9yYWdlTGlzdClbaV0gPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSA9IGlkOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBmaW5kIGRldmljZQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkOworICAgICAgICAgICAgaWYgKHNzY2FuZih0b2ssICIlZCIsICZpZCkgPT0gMSkKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBzQ2xpZW50LT5nZXREZXZpY2UoaWQpOworICAgICAgICAgICAgaWYgKCFkZXZpY2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB0b2sgPSBzdHJ0b2soTlVMTCwgIi8iKTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICByZXR1cm4gbmV3IE10cEZpbGUoZGV2aWNlLCBzdG9yYWdlLCBoYW5kbGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL210cC9NdHBGaWxlLmggYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODc2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9tdHAvTXRwRmlsZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9NVFBfRklMRV9ICisjZGVmaW5lIF9NVFBfRklMRV9ICisKKyNpbmNsdWRlICJNdHBUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE10cENsaWVudDsKK2NsYXNzIE10cERldmljZTsKK2NsYXNzIE10cE9iamVjdEluZm87CisKKy8vIEZpbGUtbGlrZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGludGVyYWN0aXZlIHNoZWxsLgorLy8gVGhpcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYW4gTVRQIGRldmljZSwgc3RvcmFnZSB1bml0IG9yIG9iamVjdAorLy8gKGVpdGhlciBmaWxlIG9yIGFzc29jaWF0aW9uKS4KK2NsYXNzIE10cEZpbGUgeworcHJpdmF0ZToKKyAgICBNdHBEZXZpY2UqICAgICAgICAgIG1EZXZpY2U7CisgICAgTXRwU3RvcmFnZUlEICAgICAgICBtU3RvcmFnZTsKKyAgICBNdHBPYmplY3RIYW5kbGUgICAgIG1IYW5kbGU7CisgICAgc3RhdGljIE10cENsaWVudCogICBzQ2xpZW50OworCitwdWJsaWM6CisgICAgTXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSk7CisgICAgTXRwRmlsZShNdHBEZXZpY2UqIGRldmljZSwgTXRwU3RvcmFnZUlEIHN0b3JhZ2UpOworICAgIE10cEZpbGUoTXRwRGV2aWNlKiBkZXZpY2UsIE10cFN0b3JhZ2VJRCBzdG9yYWdlLCBNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICBNdHBGaWxlKE10cEZpbGUqIGZpbGUpOworICAgIHZpcnR1YWwgfk10cEZpbGUoKTsKKworICAgIE10cE9iamVjdEluZm8qIGdldE9iamVjdEluZm8oKTsKKyAgICB2b2lkIHByaW50KCk7CisgICAgdm9pZCBsaXN0KCk7CisKKyAgICBpbmxpbmUgTXRwRGV2aWNlKiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisKKyAgICBzdGF0aWMgdm9pZCBpbml0KE10cENsaWVudCogY2xpZW50KTsKKyAgICBzdGF0aWMgTXRwRmlsZSogcGFyc2VQYXRoKE10cEZpbGUqIGJhc2UsIGNoYXIqIHBhdGgpOworfTsKKworfQorCisjZW5kaWYgLy8gX01UUF9ESVJFQ1RPUllfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAgYi9tZWRpYS90ZXN0cy9tdHAvbXRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVlMjNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvbXRwL210cC5jcHAKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmIEhBVkVfUkVBRExJTkUKKyNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgorI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiTXRwQ2xpZW50LmgiCisjaW5jbHVkZSAiTXRwRGV2aWNlLmgiCisjaW5jbHVkZSAiTXRwT2JqZWN0SW5mby5oIgorCisjaW5jbHVkZSAiTXRwRmlsZS5oIgorCisjZGVmaW5lIFBST01QVCAgIm10cD4gIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIE10cENsaWVudCogc0NsaWVudCA9IE5VTEw7CisKKy8vIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24gZm9yIGludGVyYWN0aXZlIHNoZWxsCitzdGF0aWMgTXRwRmlsZSogc0N1cnJlbnREaXJlY3RvcnkgPSBOVUxMOworCitzdGF0aWMgTXRwRmlsZSogcGFyc2VfcGF0aChjaGFyKiBwYXRoKSB7CisgICAgcmV0dXJuIE10cEZpbGU6OnBhcnNlUGF0aChzQ3VycmVudERpcmVjdG9yeSwgcGF0aCk7Cit9CisKK2NsYXNzIE15Q2xpZW50IDogcHVibGljIE10cENsaWVudCB7Citwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBkZXZpY2VBZGRlZChNdHBEZXZpY2UgKmRldmljZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkZXZpY2VSZW1vdmVkKE10cERldmljZSAqZGV2aWNlKSB7CisgICAgfQorCitwdWJsaWM6Cit9OworCitzdGF0aWMgdm9pZCBpbml0KCkgeworICAgIHNDbGllbnQgPSBuZXcgTXlDbGllbnQ7CisgICAgc0NsaWVudC0+c3RhcnQoKTsKKyAgICBNdHBGaWxlOjppbml0KHNDbGllbnQpOworfQorCitzdGF0aWMgaW50IHNldF9jd2QoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjZCBzaG91bGQgaGF2ZSBvbmUgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghc3RyY21wKGFyZ3ZbMF0sICIvIikpIHsKKyAgICAgICAgZGVsZXRlIHNDdXJyZW50RGlyZWN0b3J5OworICAgICAgICBzQ3VycmVudERpcmVjdG9yeSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBNdHBGaWxlKiBmaWxlID0gcGFyc2VfcGF0aChhcmd2WzBdKTsKKyAgICAgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzQ3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgICAgIHNDdXJyZW50RGlyZWN0b3J5ID0gZmlsZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgJXNcbiIsIGFyZ3ZbMF0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsaXN0X2RldmljZXMoKSB7CisgICAgLy8gVE9ETyAtIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBsaXN0IHdpbGwgbm90IGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcKKyAgICBNdHBEZXZpY2VMaXN0JiBkZXZpY2VzID0gc0NsaWVudC0+Z2V0RGV2aWNlTGlzdCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBNdHBEZXZpY2UqIGRldmljZSA9IGRldmljZXNbaV07CisgICAgICAgIE10cEZpbGUqIGZpbGUgPSBuZXcgTXRwRmlsZShkZXZpY2UpOworICAgICAgICBmaWxlLT5wcmludCgpOworICAgICAgICBkZWxldGUgZmlsZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbGlzdChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICAvLyBsaXN0IGN3ZAorICAgICAgICBpZiAoc0N1cnJlbnREaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIHNDdXJyZW50RGlyZWN0b3J5LT5saXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaXN0X2RldmljZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNoYXIqIHBhdGggPSBhcmd2W2ldOworICAgICAgICBpZiAoIXN0cmNtcChwYXRoLCAiLyIpKSB7CisgICAgICAgICAgICBsaXN0X2RldmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE10cEZpbGUqIGZpbGUgPSBwYXJzZV9wYXRoKHBhdGgpOworICAgICAgICAgICAgaWYgKCFmaWxlKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZmluZCAlc1xuIiwgcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZS0+bGlzdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpbGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc3JjRkQgPSAtMTsKKyAgICBpbnQgZGVzdEZEID0gLTE7CisgICAgTXRwRmlsZSogc3JjRmlsZSA9IE5VTEw7CisgICAgTXRwT2JqZWN0SW5mbyogaW5mbyA9IE5VTEw7CisgICAgY2hhciogZGVzdDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZmluZCBzb3VyY2Ugb2JqZWN0CisgICAgY2hhciogc3JjID0gYXJndlswXTsKKyAgICBzcmNGaWxlID0gcGFyc2VfcGF0aChzcmMpOworICAgIGlmICghc3JjRmlsZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBzcmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluZm8gPSBzcmNGaWxlLT5nZXRPYmplY3RJbmZvKCk7CisgICAgaWYgKCFpbmZvKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGZpbmQgb2JqZWN0IGluZm8gZm9yICVzXG4iLCBzcmMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChpbmZvLT5tRm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3B5aW5nIGRpcmVjdG9yaWVzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZGVzdCA9IChhcmdjID4gMSA/IGFyZ3ZbMV0gOiBpbmZvLT5tTmFtZSk7CisgICAgZGVzdEZEID0gb3BlbihkZXN0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICBpZiAoZGVzdEZEIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgJXNcbiIsIGRlc3QpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHNyY0ZEID0gc3JjRmlsZS0+Z2V0RGV2aWNlKCktPnJlYWRPYmplY3QoaW5mby0+bUhhbmRsZSwgaW5mby0+bUNvbXByZXNzZWRTaXplKTsKKyAgICBpZiAoc3JjRkQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBjaGFyIGJ1ZmZlcls2NTUzNl07CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGNvdW50ID0gcmVhZChzcmNGRCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHdyaXRlKGRlc3RGRCwgYnVmZmVyLCBjb3VudCk7CisgICAgfQorICAgIC8vIEZJWE1FIC0gZXJyb3IgY2hlY2tpbmcgYW5kIHJlcG9ydGluZworICAgIHJldCA9IDA7CisKK2ZhaWw6CisgICAgZGVsZXRlIHNyY0ZpbGU7CisgICAgZGVsZXRlIGluZm87CisgICAgaWYgKHNyY0ZEID49IDApCisgICAgICAgIGNsb3NlKHNyY0ZEKTsKKyAgICBpZiAoZGVzdEZEID49IDApCisgICAgICAgIGNsb3NlKGRlc3RGRCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwdXRfZmlsZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBzcmNGRCA9IC0xOworICAgIE10cEZpbGUqIGRlc3RGaWxlID0gTlVMTDsKKyAgICBNdHBPYmplY3RJbmZvKiBzcmNJbmZvID0gTlVMTDsKKyAgICBNdHBPYmplY3RJbmZvKiBkZXN0SW5mbyA9IE5VTEw7CisgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGNvbnN0IGNoYXIqIGxhc3RTbGFzaDsKKworICAgIGlmIChhcmdjIDwgMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vdCBlbm91Z2ggYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYXJnYyA+IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIHNyYyA9IGFyZ3ZbMF07CisgICAgc3JjRkQgPSBvcGVuKHNyYywgT19SRE9OTFkpOworICAgIGlmIChzcmNGRCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiAlc1xuIiwgc3JjKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoYXJnYyA9PSAyKSB7CisgICAgICAgICBjaGFyKiBkZXN0ID0gYXJndlsxXTsKKyAgICAgICAgZGVzdEZpbGUgPSBwYXJzZV9wYXRoKGRlc3QpOworICAgICAgICBpZiAoIWRlc3RGaWxlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kICVzXG4iLCBkZXN0KTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc0N1cnJlbnREaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBkZXN0RmlsZSA9IG5ldyBNdHBGaWxlKHNDdXJyZW50RGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICBkZXN0SW5mbyA9IGRlc3RGaWxlLT5nZXRPYmplY3RJbmZvKCk7CisgICAgaWYgKCFkZXN0SW5mbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBmaW5kIG9iamVjdCBpbmZvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGRlc3RJbmZvLT5tRm9ybWF0ICE9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZXN0aW5hdGlvbiBub3QgYSBkaXJlY3RvcnlcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGZzdGF0KHNyY0ZELCAmc3RhdGJ1ZikpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHNyY0luZm8gPSBuZXcgTXRwT2JqZWN0SW5mbygwKTsKKyAgICBzcmNJbmZvLT5tU3RvcmFnZUlEID0gZGVzdEluZm8tPm1TdG9yYWdlSUQ7CisgICAgc3JjSW5mby0+bUZvcm1hdCA9IE1UUF9GT1JNQVRfRVhJRl9KUEVHOyAgLy8gRklYTUUKKyAgICBzcmNJbmZvLT5tQ29tcHJlc3NlZFNpemUgPSBzdGF0YnVmLnN0X3NpemU7CisgICAgc3JjSW5mby0+bVBhcmVudCA9IGRlc3RJbmZvLT5tSGFuZGxlOworICAgIGxhc3RTbGFzaCA9IHN0cnJjaHIoc3JjLCAnLycpOworICAgIHNyY0luZm8tPm1OYW1lID0gc3RyZHVwKGxhc3RTbGFzaCA/IGxhc3RTbGFzaCArIDEgOiBzcmMpOworICAgIHNyY0luZm8tPm1EYXRlTW9kaWZpZWQgPSBzdGF0YnVmLnN0X210aW1lOworICAgIGhhbmRsZSA9IGRlc3RGaWxlLT5nZXREZXZpY2UoKS0+c2VuZE9iamVjdEluZm8oc3JjSW5mbyk7CisgICAgaWYgKGhhbmRsZSA8PSAwKSB7CisgICAgICAgIHByaW50Zigic2VuZE9iamVjdEluZm8gcmV0dXJuZWQgJTA0WFxuIiwgaGFuZGxlKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZGVzdEZpbGUtPmdldERldmljZSgpLT5zZW5kT2JqZWN0KHNyY0luZm8sIHNyY0ZEKSkKKyAgICAgICAgcmV0ID0gMDsKKworZmFpbDoKKyAgICBkZWxldGUgZGVzdEZpbGU7CisgICAgZGVsZXRlIHNyY0luZm87CisgICAgZGVsZXRlIGRlc3RJbmZvOworICAgIGlmIChzcmNGRCA+PSAwKQorICAgICAgICBjbG9zZShzcmNGRCk7CisgICAgcHJpbnRmKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBpbnQgKCogY29tbWFuZF9mdW5jKShpbnQgYXJnYywgY2hhciogYXJndltdKTsKKworc3RydWN0IGNvbW1hbmRfdGFibGVfZW50cnkgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29tbWFuZF9mdW5jIGZ1bmM7Cit9OworCitjb25zdCBjb21tYW5kX3RhYmxlX2VudHJ5IGNvbW1hbmRfbGlzdFtdID0geworICAgIHsgICAiY2QiLCAgICAgICBzZXRfY3dkICAgICAgICAgfSwKKyAgICB7ICAgImxzIiwgICAgICAgbGlzdCAgICAgICAgICAgIH0sCisgICAgeyAgICJnZXQiLCAgICAgIGdldF9maWxlICAgICAgICB9LAorICAgIHsgICAicHV0IiwgICAgICBwdXRfZmlsZSAgICAgICAgfSwKKyAgICB7ICAgTlVMTCwgICAgICAgTlVMTCAgICAgICAgICAgIH0sCit9OworCisKK3N0YXRpYyBpbnQgZG9fY29tbWFuZChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY29uc3QgY29tbWFuZF90YWJsZV9lbnRyeSogY29tbWFuZCA9IGNvbW1hbmRfbGlzdDsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gKmFyZ3YrKzsKKyAgICBhcmdjLS07CisKKyAgICB3aGlsZSAoY29tbWFuZC0+bmFtZSkgeworICAgICAgICBpZiAoIXN0cmNtcChjb21tYW5kLT5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kLT5mdW5jKGFyZ2MsIGFyZ3YpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb21tYW5kKys7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBjb21tYW5kICVzXG4iLCBuYW1lKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2hlbGwoKSB7CisgICAgaW50IGFyZ2M7CisgICAgaW50IHJlc3VsdCA9IDA7CisjZGVmaW5lIE1BWF9BUkdTICAgIDEwMAorICAgIGNoYXIqIGFyZ3ZbTUFYX0FSR1NdOworCisjaWYgSEFWRV9SRUFETElORQorICAgIHVzaW5nX2hpc3RvcnkoKTsKKyNlbmRpZgorCisgICAgd2hpbGUgKDEpIHsKKyNpZiBIQVZFX1JFQURMSU5FCisgICAgICAgIGNoYXIqIGxpbmUgPSByZWFkbGluZShQUk9NUFQpOworICAgICAgICBpZiAoIWxpbmUpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGNoYXIgICAgYnVmZmVyWzEwMDBdOworICAgICAgICBwcmludGYoIiVzIiwgUFJPTVBUKTsKKyAgICAgICAgY2hhciogbGluZSA9IE5VTEw7CisgICAgICAgIHNpemVfdCBsZW5ndGggPSAwOworCisgICAgICAgIGJ1ZmZlclswXSA9IDA7CisgICAgICAgIGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKTsKKyAgICAgICAgaW50IGNvdW50ID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChjb3VudCA+IDAgJiYgYnVmZmVyWzBdID09IEVPRikgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPiAwICYmIGxpbmVbY291bnQgLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgbGluZVtjb3VudCAtIDFdID09IDA7CisjZW5kaWYKKyAgICAgICAgY2hhciogdG9rID0gc3RydG9rKGxpbmUsICIgXHRcblxyIik7CisgICAgICAgIGlmICghdG9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghc3RyY21wKHRvaywgInF1aXQiKSB8fCAhc3RyY21wKHRvaywgImV4aXQiKSkgeworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorI2lmIEhBVkVfUkVBRExJTkUKKyAgICAgICAgYWRkX2hpc3RvcnkobGluZSk7CisjZW5kaWYKKyAgICAgICAgYXJnYyA9IDA7CisgICAgICAgIHdoaWxlICh0b2spIHsKKyAgICAgICAgICAgIGlmIChhcmdjICsgMSA9PSBNQVhfQVJHUykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGJvdHRvbV9vZl9sb29wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmd2W2FyZ2MrK10gPSBzdHJkdXAodG9rKTsKKyAgICAgICAgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiIFx0XG5cciIpOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gZG9fY29tbWFuZChhcmdjLCBhcmd2KTsKKworYm90dG9tX29mX2xvb3A6CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKQorICAgICAgICAgICAgZnJlZShhcmd2W2ldKTsKKyAgICAgICAgZnJlZShsaW5lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgaW5pdCgpOworCisgICAgaWYgKGFyZ2MgPT0gMSkKKyAgICAgICAgcmV0dXJuIHNoZWxsKCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZG9fY29tbWFuZChhcmdjIC0gMSwgYXJndiArIDEpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwIGIvbWVkaWEvdGVzdHMvcGxheWVycy9pbnZva2VfbW9ja19tZWRpYV9wbGF5ZXIuY3BwCmluZGV4IGIzY2M4YjYuLjUzMzA4YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL3BsYXllcnMvaW52b2tlX21vY2tfbWVkaWFfcGxheWVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9wbGF5ZXJzL2ludm9rZV9tb2NrX21lZGlhX3BsYXllci5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKIAogdXNpbmcgYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT047CiB1c2luZyBhbmRyb2lkOjpJU3VyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6OlN1cmZhY2U7CiB1c2luZyBhbmRyb2lkOjpNZWRpYVBsYXllckJhc2U7CiB1c2luZyBhbmRyb2lkOjpPSzsKIHVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKQEAgLTY3LDcgKzY4LDggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHtyZXR1cm4gT0s7fQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkge3JldHVybiBPSzt9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb0lTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkge3JldHVybiBPSzt9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZSgpIHtyZXR1cm4gT0s7fQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJlcGFyZUFzeW5jKCkge3JldHVybiBPSzt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpIHtyZXR1cm4gT0s7fQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC90dHMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNTEwOAotLS0gL2Rldi9udWxsCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvdHRzLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9UVFNfSAorI2RlZmluZSBBTkRST0lEX1RUU19IIAorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQW5kcm9pZCBwbGF0Zm9ybQorLy8gdG8gYWNjZXNzIFRleHQtVG8tU3BlZWNoIGZ1bmN0aW9uYWxpdHkgaW4gc2hhcmVkIGxpYnJhcmllcyB0aGF0IGltcGxlbWVudAorLy8gc3BlZWNoIHN5bnRoZXNpcyBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vIHN5bnRoZXNpcy4KKworLy8gVGhlIHNoYXJlZCBsaWJyYXJ5IG11c3QgY29udGFpbiBhIGZ1bmN0aW9uIG5hbWVkICJhbmRyb2lkX2dldFR0c0VuZ2luZSIKKy8vIHRoYXQgcmV0dXJucyBhbiAnYW5kcm9pZF90dHNfZW5naW5lX3QnIGluc3RhbmNlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRyAiZW5naW5lQ29uZmlnIgorI2RlZmluZSBBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfUElUQ0ggICJwaXRjaCIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1JBVEUgICAicmF0ZSIKKyNkZWZpbmUgQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX1ZPTFVNRSAidm9sdW1lIgorCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NVQ0NFU1MgICAgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19GQUlMVVJFICAgICAgICAgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0ZFQVRVUkVfVU5TVVBQT1JURUQgICAgID0gLTIsCisgICAgQU5EUk9JRF9UVFNfVkFMVUVfSU5WQUxJRCAgICAgICAgICAgPSAtMywKKyAgICBBTkRST0lEX1RUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCAgICA9IC00LAorICAgIEFORFJPSURfVFRTX1BST1BFUlRZX1NJWkVfVE9PX1NNQUxMID0gLTUsCisgICAgQU5EUk9JRF9UVFNfTUlTU0lOR19SRVNPVVJDRVMgICAgICAgPSAtNgorfSBhbmRyb2lkX3R0c19yZXN1bHRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1RUU19MQU5HX0NPVU5UUllfVkFSX0FWQUlMQUJMRSA9IDIsCisgICAgQU5EUk9JRF9UVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSAgICA9IDEsCisgICAgQU5EUk9JRF9UVFNfTEFOR19BVkFJTEFCTEUgICAgICAgICAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfTEFOR19NSVNTSU5HX0RBVEEgICAgICAgICA9IC0xLAorICAgIEFORFJPSURfVFRTX0xBTkdfTk9UX1NVUFBPUlRFRCAgICAgICAgPSAtMgorfSBhbmRyb2lkX3R0c19zdXBwb3J0X3Jlc3VsdF90OworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfVFRTX1NZTlRIX0RPTkUgICAgICAgICAgICAgID0gMCwKKyAgICBBTkRST0lEX1RUU19TWU5USF9QRU5ESU5HICAgICAgICAgICA9IDEKK30gYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVCAgICAgICAgICAgPSAwLAorICAgIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFICAgICAgID0gMQorfSBhbmRyb2lkX3R0c19jYWxsYmFja19zdGF0dXNfdDsKKworLy8gU3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKK3R5cGVkZWYgZW51bSB7CisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX0lOVkFMSUQgICAgPSAtMSwKKyAgICBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfREVGQVVMVCAgICA9IDAsCisgICAgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgPSAxLAorICAgIEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9QQ01fOF9CSVQgID0gMiwKK30gYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3Q7CisKKworLyogQW4gYW5kcm9pZF90dHNfZW5naW5lX3Qgb2JqZWN0IGNhbiBiZSBhbnl0aGluZywgYnV0IG11c3QgaGF2ZSwKKyAqIGFzIGl0cyBmaXJzdCBmaWVsZCwgYSBwb2ludGVyIHRvIGEgdGFibGUgb2YgZnVuY3Rpb25zLgorICoKKyAqIFNlZSB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIHN0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfdF9mdW5jc190CisgKiBiZWxvdyBmb3IgZGV0YWlscy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgIGFuZHJvaWRfdHRzX2VuZ2luZV9mdW5jc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX2Z1bmNzX3QgKmZ1bmNzOworfSBhbmRyb2lkX3R0c19lbmdpbmVfdDsKKworLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIFRUUyBFbmdpbmUgc2hhcmVkIGxpYnJhcnkKKyAqIGFuZCBtdXN0IHJldHVybiB0aGUgYWRkcmVzcyBvZiBhbiBhbmRyb2lkX3R0c19lbmdpbmVfdCBsaWJyYXJ5LgorICovCitleHRlcm4gYW5kcm9pZF90dHNfZW5naW5lX3QgKmFuZHJvaWRfZ2V0VHRzRW5naW5lKCk7CisKKy8qIEluY2x1ZGluZyB0aGUgb2xkIHZlcnNpb24gZm9yIGxlZ2FjeSBzdXBwb3J0IChGcm95byBjb21wYXRpYmlsaXR5KS4KKyAqIFRoaXMgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB0aGluZyBhcyBhbmRyb2lkX2dldFR0c0VuZ2luZS4KKyAqLworZXh0ZXJuICJDIiBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZ2V0VHRzRW5naW5lKCk7CisKKy8vIEEgY2FsbGJhY2sgdHlwZSB1c2VkIHRvIG5vdGlmeSB0aGUgZnJhbWV3b3JrIG9mIG5ldyBzeW50aGV0aXplZAorLy8gYXVkaW8gc2FtcGxlcywgc3RhdHVzIHdpbGwgYmUgU1lOVEhfRE9ORSBmb3IgdGhlIGxhc3Qgc2FtcGxlIG9mCisvLyB0aGUgbGFzdCByZXF1ZXN0LCBvZiBTWU5USF9QRU5ESU5HIG90aGVyd2lzZS4KKy8vCisvLyBUaGlzIGlzIHBhc3NlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHRoZSBlbmdpbmUgdGhyb3VnaCB0aGUKKy8vICdlbmdpbmVfaW5pdCcgZnVuY3Rpb24gKHNlZSBiZWxvdykuCisvLworLy8gVGhlIGNhbGxiYWNrIGZvciBzeW50aGVzaXMgY29tcGxldGVkIHRha2VzOgorLy8gQHBhcmFtIFtpbm91dF0gdm9pZCAqJiAgICAgICAtIFRoZSB1c2VyZGF0YSBwb2ludGVyIHNldCBpbiB0aGUgb3JpZ2luYWwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGggY2FsbAorLy8gQHBhcmFtIFtpbl0gICAgdWludDMyX3QgICAgICAtIFRyYWNrIHNhbXBsaW5nIHJhdGUgaW4gSHoKKy8vIEBwYXJhbSBbaW5dICAgIHVpbnQzMl90ICAgICAgLSBUaGUgYXVkaW8gZm9ybWF0CisvLyBAcGFyYW0gW2luXSAgICBpbnQgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBjaGFubmVscworLy8gQHBhcmFtIFtpbm91dF0gaW50OF90IComICAgICAtIEEgYnVmZmVyIG9mIGF1ZGlvIGRhdGEgb25seSB2YWxpZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoZSBjYWxsYmFjaworLy8gQHBhcmFtIFtpbm91dF0gc2l6ZV90ICAmICAgICAtIFRoZSBzaXplIG9mIHRoZSBidWZmZXIKKy8vIEBwYXJhbSBbaW5dIHR0c19zeW50aF9zdGF0dXMgLSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW50aGVzaXMgaXMgZG9uZSwgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW9yZSBkYXRhIGlzIHRvIGJlIHN5bnRoZXNpemVkLgorLy8gQHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVCB0byBpbmRpY2F0ZSB0aGUgc3ludGhlc2lzIG11c3Qgc3RvcCwKKy8vICAgICAgICAgVFRTX0NBTExCQUNLX0NPTlRJTlVFIHRvIGluZGljYXRlIHRoZSBzeW50aGVzaXMgbXVzdCBjb250aW51ZSBpZgorLy8gICAgICAgICAgICB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcHJvZHVjZS4KK3R5cGVkZWYgYW5kcm9pZF90dHNfY2FsbGJhY2tfc3RhdHVzX3QgKCphbmRyb2lkX3R0c19zeW50aF9jYl90KQorICAgICAgICAgICAgKHZvaWQgKipwVXNlckRhdGEsCisgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tTYW1wbGluZ0h6LAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgaW50OF90ICoqcEF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfc3RhdHVzX3Qgc3RhdHVzKTsKKworCisvLyBUaGUgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCB0aGUgYW5kcm9pZF90dHNfZW5naW5lX3QgbXVzdCBwb2ludCB0by4KKy8vIE5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRha2UgYSBoYW5kbGUgdG8gdGhlIGVuZ2luZSBpdHNlbGYKKy8vIGFzIHRoZWlyIGZpcnN0IHBhcmFtZXRlci4KKy8vCisKK3N0cnVjdCBhbmRyb2lkX3R0c19lbmdpbmVfZnVuY3NfdCB7CisgICAgLy8gcmVzZXJ2ZWQgZmllbGRzLCBpZ25vcmVkIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAvLyB0aGV5IG11c3QgYmUgcGxhY2VkIGhlcmUgdG8gZW5zdXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5CisgICAgLy8gb2YgbGVnYWN5IGJpbmFyeSBwbHVnaW5zLgorICAgIHZvaWQgKnJlc2VydmVkWzJdOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgVFRTIGVuZ2luZSBhbmQgcmV0dXJucyB3aGV0aGVyIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZC4KKyAgICAvLyBAcGFyYW0gc3ludGhEb25lQ0JQdHIgc3ludGhlc2lzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqaW5pdCkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgYW5kcm9pZF90dHNfc3ludGhfY2JfdCBzeW50aERvbmVQdHIsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5naW5lQ29uZmlnKTsKKworICAgIC8vIFNodXQgZG93biB0aGUgVFRTIGVuZ2luZSBhbmQgcmVsZWFzZXMgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzaHV0ZG93bikKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUpOworCisgICAgLy8gSW50ZXJydXB0IHN5bnRoZXNpcyBhbmQgZmx1c2hlcyBhbnkgc3ludGhlc2l6ZWQgZGF0YSB0aGF0IGhhc24ndCBiZWVuCisgICAgLy8gb3V0cHV0IHlldC4gVGhpcyB3aWxsIGJsb2NrIHVudGlsIGNhbGxiYWNrcyB1bmRlcndheSBhcmUgY29tcGxldGVkLgorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpzdG9wKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsZXZlbCBvZiBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQuCisgICAgLy8gQHJldHVybiBUVFNfTEFOR19DT1VOVFJZX1ZBUl9BVkFJTEFCTEUgaWYgdGhlIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBzdXBwb3J0ZWQsCisgICAgLy8gICAgICAgICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2VzIGFyZSBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19DT1VOVFJZX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHN1cHBvcnRlZCBhbmQgdGhlCisgICAgLy8gICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZXMgYXJlIGNvcnJlY3RseSBpbnN0YWxsZWQsIGJ1dCB0aGVyZSBpcyBubyBtYXRjaCBmb3IKKyAgICAvLyAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhcmlhbnQKKyAgICAvLyAgICAgICAgIFRUU19MQU5HX0FWQUlMQUJMRSBpZiB0aGUgbGFuZ3VhZ2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUKKyAgICAvLyAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZCwgYnV0IHRoZXJlIGlzIG5vIG1hdGNoIGZvcgorICAgIC8vICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgY291bnRyeSBhbmQgdmFyaWFudAorICAgIC8vICAgICAgICAgVFRTX0xBTkdfTUlTU0lOR19EQVRBIGlmIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgdG8gcHJvdmlkZSBhbnkgbGV2ZWwgb2Ygc3VwcG9ydAorICAgIC8vICAgICAgICAgICAgIGZvciB0aGUgbGFuZ3VhZ2UgYXJlIG5vdCBjb3JyZWN0bHkgaW5zdGFsbGVkCisgICAgLy8gICAgICAgICBUVFNfTEFOR19OT1RfU1VQUE9SVEVEIGlmIHRoZSBsYW5ndWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBUVFMgZW5naW5lLgorICAgIGFuZHJvaWRfdHRzX3N1cHBvcnRfcmVzdWx0X3QgKCppc0xhbmd1YWdlQXZhaWxhYmxlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBMb2FkIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuIFRoZSBsb2FkZWQKKyAgICAvLyBsYW5ndWFnZSB3aWxsIG9ubHkgYmUgdXNlZCBvbmNlIGEgY2FsbCB0byBzZXRMYW5ndWFnZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmxvYWRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3VudHJ5LAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcmlhbnQpOworCisgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCBMb2NhbGUgdmFyaWFudC4KKyAgICAvLyBUaGUgbG9hZGVkIGxhbmd1YWdlIHdpbGwgb25seSBiZSB1c2VkIG9uY2UgYSBjYWxsIHRvIHNldExhbmd1YWdlRnJvbUxvY2FsZSgpIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZSB2YWx1ZSBpcyBpc3N1ZWQuIExhbmd1YWdlIGFuZCBjb3VudHJ5IHZhbHVlcyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBJU08gdGhyZWUKKyAgICAvLyBsZXR0ZXIgY29kZXMgZm9yIGxhbmd1YWdlcyBhbmQgY291bnRyaWVzLCBhcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gYSBqYXZhLnV0aWwuTG9jYWxlCisgICAgLy8gaW5zdGFuY2UuIFRoZSB2YXJpYW50IHZhbHVlIGlzIGVuY29kZWQgYXMgdGhlIHZhcmlhbnQgc3RyaW5nIHJldHJpZXZlZCBmcm9tIGEKKyAgICAvLyBqYXZhLnV0aWwuTG9jYWxlIGluc3RhbmNlIGJ1aWx0IHdpdGggdGhhdCB2YXJpYW50IGRhdGEuCisgICAgLy8gQHBhcmFtIGxhbmcgcG9pbnRlciB0byB0aGUgSVNPIHRocmVlIGxldHRlciBjb2RlIGZvciB0aGUgbGFuZ3VhZ2UKKyAgICAvLyBAcGFyYW0gY291bnRyeSBwb2ludGVyIHRvIHRoZSBJU08gdGhyZWUgbGV0dGVyIGNvZGUgZm9yIHRoZSBjb3VudHJ5CisgICAgLy8gQHBhcmFtIHZhcmlhbnQgcG9pbnRlciB0byB0aGUgdmFyaWFudCBjb2RlCisgICAgLy8gQHJldHVybiBUVFNfU1VDQ0VTUywgb3IgVFRTX0ZBSUxVUkUKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldExhbmd1YWdlKQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnksCisgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyaWFudCk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCBsYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCwgb3IgZW1wdHkgc3RyaW5ncyBpZiBub25lIG9mCisgICAgLy8gcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0LiBMYW5ndWFnZSBhbmQgY291bnRyeSBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgMy1sZXR0ZXIgSVNPIGNvZGUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCAzLWxldHRlciBjb2RlIGxhbmd1YWdlIHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgMy1sZXR0ZXIgY29kZSBjb3VudHJ5IHZhbHVlCisgICAgLy8gQHBhcmFtW291dF0gICBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgdmFyaWFudCB2YWx1ZQorICAgIC8vIEByZXR1cm4gVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFCisgICAgYW5kcm9pZF90dHNfcmVzdWx0X3QgKCpnZXRMYW5ndWFnZSkKKyAgICAgICAgICAgICh2b2lkICplbmdpbmUsCisgICAgICAgICAgICAgY2hhciAqbGFuZ3VhZ2UsCisgICAgICAgICAgICAgY2hhciAqY291bnRyeSwKKyAgICAgICAgICAgICBjaGFyICp2YXJpYW50KTsKKworICAgIC8vIE5vdGlmaWVzIHRoZSBlbmdpbmUgd2hhdCBhdWRpbyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3ludGhlc2lzLgorICAgIC8vIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGhpbnQsIHRoZSBlbmdpbmUgaW1wbGVtZW50YXRpb24gd2lsbCBzZXQgdGhlIG91dHB1dCB2YWx1ZXMKKyAgICAvLyB0byB0aG9zZSBvZiB0aGUgc3ludGhlc2lzIGZvcm1hdCwgYmFzZWQgb24gYSBnaXZlbiBoaW50LgorICAgIC8vIEBwYXJhbVtpbm91dF0gZW5jb2RpbmcgaW46IHRoZSBkZXNpcmVkIGF1ZGlvIHNhbXBsZSBmb3JtYXQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgVFRTIGVuZ2luZQorICAgIC8vIEBwYXJhbVtpbm91dF0gcmF0ZSBpbjogdGhlIGRlc2lyZWQgYXVkaW8gc2FtcGxlIHJhdGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQ6IHRoZSBzYW1wbGUgcmF0ZSB1c2VkIGJ5IHRoZSBUVFMgZW5naW5lCisgICAgLy8gQHBhcmFtW2lub3V0XSBjaGFubmVscyBpbjogdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgYnkgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcmV0dXJuIFRUU19TVUNDRVNTLCBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc2V0QXVkaW9Gb3JtYXQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGFuZHJvaWRfdHRzX2F1ZGlvX2Zvcm1hdF90KiBwRW5jb2RpbmcsCisgICAgICAgICAgICAgdWludDMyX3QqIHBSYXRlLAorICAgICAgICAgICAgIGludCogcENoYW5uZWxzKTsKKworICAgIC8vIFNldCBhIHByb3BlcnR5IGZvciB0aGUgdGhlIFRUUyBlbmdpbmUKKyAgICAvLyAic2l6ZSIgaXMgdGhlIG1heGltdW0gc2l6ZSBvZiAidmFsdWUiIGZvciBwcm9wZXJ0aWVzICJwcm9wZXJ0eSIKKyAgICAvLyBAcGFyYW0gcHJvcGVydHkgcG9pbnRlciB0byB0aGUgcHJvcGVydHkgbmFtZQorICAgIC8vIEBwYXJhbSB2YWx1ZSAgICBwb2ludGVyIHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgIC8vIEBwYXJhbSBzaXplICAgICBtYXhpbXVtIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUgdGhpcyB0eXBlIG9mIHByb3BlcnR5CisgICAgLy8gQHJldHVybiAgICAgICAgIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsIG9yIFRUU19GQUlMVVJFLAorICAgIC8vICAgICAgICAgICAgICAgICAgb3IgVFRTX1ZBTFVFX0lOVkFMSUQKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKnNldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIFRUUyBlbmdpbmUKKyAgICAvLyBAcGFyYW0gICAgICAgIHByb3BlcnR5IHBvaW50ZXIgdG8gdGhlIHByb3BlcnR5IG5hbWUKKyAgICAvLyBAcGFyYW1bb3V0XSAgIHZhbHVlICAgIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBsYW5ndWFnZSB2YWx1ZQorICAgIC8vIEBwYXJhbVtpbm91dF0gaW9zaXplICAgaW46IHN0b3JlcyB0aGUgc2l6ZSBhdmFpbGFibGUgdG8gc3RvcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBzdG9yZXMgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgbGFuZ3VhZ2UKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaWYgZ2V0TGFuZ3VhZ2UoKSByZXR1cm5lZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwsIHVuY2hhbmdlZCBvdGhlcndpc2UKKyAgICAvLyBAcmV0dXJuIFRUU19QUk9QRVJUWV9VTlNVUFBPUlRFRCwgb3IgVFRTX1NVQ0NFU1MsCisgICAgLy8gICAgICAgICBvciBUVFNfUFJPUEVSVFlfU0laRV9UT09fU01BTEwKKyAgICBhbmRyb2lkX3R0c19yZXN1bHRfdCAoKmdldFByb3BlcnR5KQorICAgICAgICAgICAgKHZvaWQgKmVuZ2luZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKKyAgICAgICAgICAgICBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICBzaXplX3QgKmlvc2l6ZSk7CisKKyAgICAvLyBTeW50aGVzaXplIHRoZSB0ZXh0LgorICAgIC8vIEFzIHRoZSBzeW50aGVzaXMgaXMgcGVyZm9ybWVkLCB0aGUgZW5naW5lIGludm9rZXMgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeQorICAgIC8vIHRoZSBUVFMgZnJhbWV3b3JrIHRoYXQgaXQgaGFzIGZpbGxlZCB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgaW5kaWNhdGVzIGhvdworICAgIC8vIG1hbnkgYnl0ZXMgaXQgd3JvdGUuIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCB0aGUgZW5naW5lCisgICAgLy8gaGFzIGdlbmVyYXRlZCBhbGwgdGhlIGF1ZGlvIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgdGV4dC4KKyAgICAvLyBOb3RlIGFib3V0IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0OiB0aGUgdGV4dCBwYXJhbWV0ZXIgbWF5IHVzZSB0aGUKKyAgICAvLyBmb2xsb3dpbmcgZWxlbWVudHMKKyAgICAvLyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzIGFzIGRlZmluZWQgaW4gdGhlIFNTTUwgMS4wIHNwZWNpZmljYXRpb246CisgICAgLy8gICAgKiBsYW5nCisgICAgLy8gICAgKiBzYXktYXM6CisgICAgLy8gICAgICAgICAgbyBpbnRlcnByZXQtYXMKKyAgICAvLyAgICAqIHBob25lbWUKKyAgICAvLyAgICAqIHZvaWNlOgorICAgIC8vICAgICAgICAgIG8gZ2VuZGVyLAorICAgIC8vICAgICAgICAgIG8gYWdlLAorICAgIC8vICAgICAgICAgIG8gdmFyaWFudCwKKyAgICAvLyAgICAgICAgICBvIG5hbWUKKyAgICAvLyAgICAqIGVtcGhhc2lzCisgICAgLy8gICAgKiBicmVhazoKKyAgICAvLyAgICAgICAgICBvIHN0cmVuZ3RoLAorICAgIC8vICAgICAgICAgIG8gdGltZQorICAgIC8vICAgICogcHJvc29keToKKyAgICAvLyAgICAgICAgICBvIHBpdGNoLAorICAgIC8vICAgICAgICAgIG8gY29udG91ciwKKyAgICAvLyAgICAgICAgICBvIHJhbmdlLAorICAgIC8vICAgICAgICAgIG8gcmF0ZSwKKyAgICAvLyAgICAgICAgICBvIGR1cmF0aW9uLAorICAgIC8vICAgICAgICAgIG8gdm9sdW1lCisgICAgLy8gICAgKiBtYXJrCisgICAgLy8gRGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIHRleHQgZm9ybWF0IGFuZCBTU01MIGFyZToKKyAgICAvLyAgICAqIGZ1bGwgU1NNTCBkb2N1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyAgICAqIG5hbWVzcGFjZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAvLyBUZXh0IGlzIGNvZGVkIGluIFVURi04LgorICAgIC8vIEBwYXJhbSB0ZXh0ICAgICAgdGhlIFVURi04IHRleHQgdG8gc3ludGhlc2l6ZQorICAgIC8vIEBwYXJhbSB1c2VyZGF0YSAgcG9pbnRlciB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBjYWxsIGlzIGludm9rZWQKKyAgICAvLyBAcGFyYW0gYnVmZmVyICAgIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3ludGhlc2l6ZWQgZGF0YSBtdXN0IGJlIHdyaXR0ZW4KKyAgICAvLyBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gYnVmZmVyCisgICAgLy8gQHJldHVybiAgICAgICAgICBUVFNfU1VDQ0VTUyBvciBUVFNfRkFJTFVSRQorICAgIGFuZHJvaWRfdHRzX3Jlc3VsdF90ICgqc3ludGhlc2l6ZVRleHQpCisgICAgICAgICAgICAodm9pZCAqZW5naW5lLAorICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgaW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEFORFJPSURfVFRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAKaW5kZXggZGYyMTM1OGQuLjY2ZjllMmQgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJzL0VHTC9lZ2wuY3BwCkBAIC01OSw2ICs1OSw4IEBACiAgICAgICAgICJFR0xfS0hSX2ltYWdlICIKICAgICAgICAgIkVHTF9LSFJfaW1hZ2VfYmFzZSAiCiAgICAgICAgICJFR0xfS0hSX2ltYWdlX3BpeG1hcCAiCisgICAgICAgICJFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UgIgorICAgICAgICAiRUdMX0tIUl9mZW5jZV9zeW5jICIKICAgICAgICAgIkVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgIgogICAgICAgICAiRUdMX0FORFJPSURfc3dhcF9yZWN0YW5nbGUgIgogICAgICAgICA7CkBAIC0yNDMsOSArMjQ1LDIzIEBACiAgICAgRUdMSW1hZ2VLSFIgaW1hZ2VzW0lNUExfTlVNX0lNUExFTUVOVEFUSU9OU107CiB9OwogCitzdHJ1Y3QgZWdsX3N5bmNfdCA6IHB1YmxpYyBlZ2xfb2JqZWN0X3QKK3sKKyAgICB0eXBlZGVmIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8ZWdsX3N5bmNfdCwgRUdMU3luY0tIUj4gUmVmOworCisgICAgZWdsX3N5bmNfdChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjb250ZXh0LCBFR0xTeW5jS0hSIHN5bmMpCisgICAgICAgIDogZHB5KGRweSksIGNvbnRleHQoY29udGV4dCksIHN5bmMoc3luYykKKyAgICB7CisgICAgfQorICAgIEVHTERpc3BsYXkgZHB5OworICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICBFR0xTeW5jS0hSIHN5bmM7Cit9OworCiB0eXBlZGVmIGVnbF9zdXJmYWNlX3Q6OlJlZiAgU3VyZmFjZVJlZjsKIHR5cGVkZWYgZWdsX2NvbnRleHRfdDo6UmVmICBDb250ZXh0UmVmOwogdHlwZWRlZiBlZ2xfaW1hZ2VfdDo6UmVmICAgIEltYWdlUmVmOwordHlwZWRlZiBlZ2xfc3luY190OjpSZWYgICAgIFN5bmNSZWY7CiAKIHN0cnVjdCB0bHNfdAogewpAQCAtNDgxLDYgKzQ5NywxMSBAQAogICAgIHJldHVybiBlZ2xfdG9fbmF0aXZlX2Nhc3Q8ZWdsX2ltYWdlX3Q+KGltYWdlKTsKIH0KIAorc3RhdGljIGlubGluZQorZWdsX3N5bmNfdCogZ2V0X3N5bmMoRUdMU3luY0tIUiBzeW5jKSB7CisgICAgcmV0dXJuIGVnbF90b19uYXRpdmVfY2FzdDxlZ2xfc3luY190PihzeW5jKTsKK30KKwogc3RhdGljIGVnbF9jb25uZWN0aW9uX3QqIHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKAogICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKICAgICAgICAgZWdsX2Rpc3BsYXlfdCBjb25zdComIGRwKQpAQCAtMTc4Niw2ICsxODA3LDExMSBAQAogICAgICByZXR1cm4gRUdMX1RSVUU7CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVHTF9FR0xFWFRfVkVSU0lPTiA1CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworRUdMU3luY0tIUiBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCit7CisgICAgRUdMQ29udGV4dCBjdHggPSBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fSU1BR0VfS0hSKTsKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfTk9fSU1BR0VfS0hSOworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworICAgIEVHTFN5bmNLSFIgcmVzdWx0ID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsQ3JlYXRlU3luY0tIUikgeworICAgICAgICBFR0xTeW5jS0hSIHN5bmMgPSBjLT5jbngtPmVnbC5lZ2xDcmVhdGVTeW5jS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgdHlwZSwgYXR0cmliX2xpc3QpOworICAgICAgICBpZiAoc3luYyA9PSBFR0xfTk9fSU1BR0VfS0hSKQorICAgICAgICAgICAgcmV0dXJuIHN5bmM7CisgICAgICAgIHJlc3VsdCA9IChlZ2xfc3luY190KiluZXcgZWdsX3N5bmNfdChkcHksIGN0eCwgc3luYyk7CisgICAgfQorICAgIHJldHVybiAoRUdMU3luY0tIUilyZXN1bHQ7Cit9CisKK0VHTEJvb2xlYW4gZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYykKK3sKKyAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSBnZXRfZGlzcGxheShkcHkpOworICAgIGlmIChkcCA9PSAwKSB7CisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7CisgICAgfQorCisgICAgU3luY1JlZiBfcyhzeW5jKTsKKyAgICBpZiAoIV9zLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7CisgICAgZWdsX3N5bmNfdCogc3luY09iamVjdCA9IGdldF9zeW5jKHN5bmMpOworCisgICAgRUdMQ29udGV4dCBjdHggPSBzeW5jT2JqZWN0LT5jb250ZXh0OworICAgIENvbnRleHRSZWYgX2MoY3R4KTsKKyAgICBpZiAoIV9jLmdldCgpKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOworICAgIGlmICghdmFsaWRhdGVfZGlzcGxheV9jb250ZXh0KGRweSwgY3R4KSkKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKworICAgIGVnbF9jb250ZXh0X3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKKworICAgIGlmIChjLT5jbngtPmVnbC5lZ2xEZXN0cm95U3luY0tIUikgeworICAgICAgICByZXR1cm4gYy0+Y254LT5lZ2wuZWdsRGVzdHJveVN5bmNLSFIoCisgICAgICAgICAgICAgICAgZHAtPmRpc3BbYy0+aW1wbF0uZHB5LCBzeW5jT2JqZWN0LT5zeW5jKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQorCitFR0xpbnQgZWdsQ2xpZW50V2FpdFN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lS0hSIHRpbWVvdXQpCit7CisgICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKKyAgICBpZiAoZHAgPT0gMCkgeworICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOworICAgIH0KKworICAgIFN5bmNSZWYgX3Moc3luYyk7CisgICAgaWYgKCFfcy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOworICAgIGVnbF9zeW5jX3QqIHN5bmNPYmplY3QgPSBnZXRfc3luYyhzeW5jKTsKKworICAgIEVHTENvbnRleHQgY3R4ID0gc3luY09iamVjdC0+Y29udGV4dDsKKyAgICBDb250ZXh0UmVmIF9jKGN0eCk7CisgICAgaWYgKCFfYy5nZXQoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKKyAgICBpZiAoIXZhbGlkYXRlX2Rpc3BsYXlfY29udGV4dChkcHksIGN0eCkpCisgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisKKyAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7CisKKyAgICBpZiAoYy0+Y254LT5lZ2wuZWdsQ2xpZW50V2FpdFN5bmNLSFIpIHsKKyAgICAgICAgcmV0dXJuIGMtPmNueC0+ZWdsLmVnbENsaWVudFdhaXRTeW5jS0hSKAorICAgICAgICAgICAgICAgIGRwLT5kaXNwW2MtPmltcGxdLmRweSwgc3luY09iamVjdC0+c3luYywgZmxhZ3MsIHRpbWVvdXQpOworICAgIH0KKworICAgIHJldHVybiBFR0xfRkFMU0U7Cit9CisKK0VHTEJvb2xlYW4gZWdsR2V0U3luY0F0dHJpYktIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQoreworICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7CisgICAgaWYgKGRwID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKKyAgICB9CisKKyAgICBTeW5jUmVmIF9zKHN5bmMpOworICAgIGlmICghX3MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKKyAgICBlZ2xfc3luY190KiBzeW5jT2JqZWN0ID0gZ2V0X3N5bmMoc3luYyk7CisKKyAgICBFR0xDb250ZXh0IGN0eCA9IHN5bmNPYmplY3QtPmNvbnRleHQ7CisgICAgQ29udGV4dFJlZiBfYyhjdHgpOworICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7CisgICAgaWYgKCF2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoZHB5LCBjdHgpKQorICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOworCisgICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOworCisgICAgaWYgKGMtPmNueC0+ZWdsLmVnbEdldFN5bmNBdHRyaWJLSFIpIHsKKyAgICAgICAgcmV0dXJuIGMtPmNueC0+ZWdsLmVnbEdldFN5bmNBdHRyaWJLSFIoCisgICAgICAgICAgICAgICAgZHAtPmRpc3BbYy0+aW1wbF0uZHB5LCBzeW5jT2JqZWN0LT5zeW5jLCBhdHRyaWJ1dGUsIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gRUdMX0ZBTFNFOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBTkRST0lEIGV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbiBiL29wZW5nbC9saWJzL0VHTC9lZ2xfZW50cmllcy5pbgppbmRleCA1ZDg5Mjg3Li42M2MzYzE5IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KKysrIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluCkBAIC01MSw2ICs1MSwxMyBAQAogRUdMX0VOVFJZKEVHTEltYWdlS0hSLCBlZ2xDcmVhdGVJbWFnZUtIUiwgICBFR0xEaXNwbGF5LCBFR0xDb250ZXh0LCBFR0xlbnVtLCBFR0xDbGllbnRCdWZmZXIsIGNvbnN0IEVHTGludCAqKQogRUdMX0VOVFJZKEVHTEJvb2xlYW4sICBlZ2xEZXN0cm95SW1hZ2VLSFIsICBFR0xEaXNwbGF5LCBFR0xJbWFnZUtIUikKIAorLyogRUdMX0VHTEVYVF9WRVJTSU9OIDUgKi8KKworRUdMX0VOVFJZKEVHTFN5bmNLSFIsICAgZWdsQ3JlYXRlU3luY0tIUiwgICAgICAgRUdMRGlzcGxheSwgRUdMZW51bSwgY29uc3QgRUdMaW50ICopCitFR0xfRU5UUlkoRUdMQm9vbGVhbiwgICBlZ2xEZXN0cm95U3luY0tIUiwgICAgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSKQorRUdMX0VOVFJZKEVHTGludCwgICAgICAgZWdsQ2xpZW50V2FpdFN5bmNLSFIsICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUiwgRUdMaW50LCBFR0xUaW1lS0hSKQorRUdMX0VOVFJZKEVHTEJvb2xlYW4sICAgZWdsR2V0U3luY0F0dHJpYktIUiwgICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUiwgRUdMaW50LCBFR0xpbnQgKikKKwogLyogQU5EUk9JRCBleHRlbnNpb25zICovCiAKIEVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQsIEVHTGludCwgRUdMaW50KQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcCBiL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKaW5kZXggOTI0NzM3ZS4uYTEyZWRmMiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyLmNwcAorKysgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCkBAIC0zOSw2ICszOSw4IEBACiAjdW5kZWYgQ0FMTF9HTF9BUEkKICN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KIAorI2RlZmluZSBERUJVR19DQUxMX0dMX0FQSSAwCisKICNpZiBVU0VfRkFTVF9UTFNfS0VZCiAKICAgICAjaWZkZWYgSEFWRV9BUk1fVExTX1JFR0lTVEVSCkBAIC03MywxMCArNzUsMjQgQEAKIAogICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9hcGkKIAorI2lmIERFQlVHX0NBTExfR0xfQVBJCisKICAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXykKLSAgICAKKyAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOyBcCisgICAgICAgIEdMZW51bSBzdGF0dXMgPSBHTF9OT19FUlJPUjsgXAorICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsgXAorICAgICAgICAgICAgTE9HRCgiWyIgI19hcGkgIl0gMHgleCIsIHN0YXR1cyk7IFwKKyAgICAgICAgfQorCisjZWxzZQorCisgICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKKyAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOworCisjZW5kaWYKKwogICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCiAgICAgICAgIHJldHVybiBfYy0+X2FwaShfX1ZBX0FSR1NfXykKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NjQ3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlnbDJfcGVyZi5jcHAgXAorCWZpbGx0ZXN0LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkVHTCBcCisgICAgbGliR0xFU3YyIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1nbDJfcGVyZgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjlmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnJhZ21lbnRfc2hhZGVycy5jcHAiCisKK0ZJTEUgKiBmT3V0ID0gTlVMTDsKK3ZvaWQgcHRTd2FwKCk7CisKK3N0YXRpYyBjaGFyIGdDdXJyZW50VGVzdE5hbWVbMTAyNF07CitzdGF0aWMgdWludDMyX3QgZ1dpZHRoID0gMDsKK3N0YXRpYyB1aW50MzJfdCBnSGVpZ2h0ID0gMDsKKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBMT0dFKCJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOworICAgIH0KK30KKworR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7CisgICAgaWYgKHNoYWRlcikgeworICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKKyAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKKyAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOworICAgICAgICBpZiAoIWNvbXBpbGVkKSB7CisgICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKKyAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKKyAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgJWQ6XG4lc1xuIiwgc2hhZGVyVHlwZSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworZW51bSB7CisgICAgQV9QT1MsCisgICAgQV9DT0xPUiwKKyAgICBBX1RFWDAsCisgICAgQV9URVgxCit9OworCitHTHVpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UpIHsKKyAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlKTsKKyAgICBpZiAoIXZlcnRleFNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBHTHVpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlKTsKKyAgICBpZiAoIXBpeGVsU2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0pIHsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciB2Iik7CisgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKKyAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciBwIik7CisKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9QT1MsICJhX3BvcyIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX0NPTE9SLCAiYV9jb2xvciIpOworICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDAsICJhX3RleDAiKTsKKyAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgQV9URVgxLCAiYV90ZXgxIik7CisgICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKKyAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgeworICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7CisgICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgbGluayBwcm9ncmFtOlxuJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgICAgICAgICBwcm9ncmFtID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGVja0dsRXJyb3IoImNyZWF0ZVByb2dyYW0iKTsKKyAgICBnbFVzZVByb2dyYW0ocHJvZ3JhbSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKK3VpbnQ2NF90IGdldFRpbWUoKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKyAgICByZXR1cm4gdC50dl9uc2VjICsgKCh1aW50NjRfdCl0LnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCk7Cit9CisKK3VpbnQ2NF90IGdUaW1lOwordm9pZCBzdGFydFRpbWVyKCkgeworICAgIGdUaW1lID0gZ2V0VGltZSgpOworfQorCisKK3N0YXRpYyB2b2lkIGVuZFRpbWVyKGludCBjb3VudCkgeworICAgIHVpbnQ2NF90IHQyID0gZ2V0VGltZSgpOworICAgIGRvdWJsZSBkZWx0YSA9ICgoZG91YmxlKSh0MiAtIGdUaW1lKSkgLyAxMDAwMDAwMDAwOworICAgIGRvdWJsZSBwaXhlbHMgPSAoZ1dpZHRoICogZ0hlaWdodCkgKiBjb3VudDsKKyAgICBkb3VibGUgbXBwcyA9IHBpeGVscyAvIGRlbHRhIC8gMTAwMDAwMDsKKyAgICBkb3VibGUgZGM2MCA9ICgoZG91YmxlKWNvdW50KSAvIGRlbHRhIC8gNjA7CisKKyAgICBpZiAoZk91dCkgeworICAgICAgICBmcHJpbnRmKGZPdXQsICIlcywgJWYsICVmXHJcbiIsIGdDdXJyZW50VGVzdE5hbWUsIG1wcHMsIGRjNjApOworICAgICAgICBmZmx1c2goZk91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcywgJWYsICVmXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKKyAgICB9CisgICAgTE9HSSgiJXMsICVmLCAlZlxyXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciBnVmVydGV4U2hhZGVyW10gPQorICAgICJhdHRyaWJ1dGUgdmVjNCBhX3BvcztcbiIKKyAgICAiYXR0cmlidXRlIHZlYzQgYV9jb2xvcjtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgwO1xuIgorICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleDE7XG4iCisgICAgInZhcnlpbmcgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgxO1xuIgorICAgICJ1bmlmb3JtIHZlYzIgdV90ZXhPZmY7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgICAgdl9jb2xvciA9IGFfY29sb3I7XG4iCisgICAgIiAgICB2X3RleDAgPSBhX3RleDA7XG4iCisgICAgIiAgICB2X3RleDEgPSBhX3RleDE7XG4iCisgICAgIiAgICB2X3RleDAueCArPSB1X3RleE9mZi54O1xuIgorICAgICIgICAgdl90ZXgxLnkgKz0gdV90ZXhPZmYueTtcbiIKKyAgICAiICAgIGdsX1Bvc2l0aW9uID0gYV9wb3M7XG4iCisgICAgIn1cbiI7CisKK3N0YXRpYyB2b2lkIHNldHVwVkEoKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHZ0eFtdID0geworICAgICAgICAtMS4wZiwtMS4wZiwKKyAgICAgICAgIDEuMGYsLTEuMGYsCisgICAgICAgIC0xLjBmLCAxLjBmLAorICAgICAgICAgMS4wZiwgMS4wZiB9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBjb2xvcltdID0geworICAgICAgICAxLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAwLjBmLDAuMGYsMS4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMC4wZiwxLjBmLAorICAgICAgICAxLjBmLDEuMGYsMS4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDBbXSA9IHsKKyAgICAgICAgMC4wZiwwLjBmLAorICAgICAgICAxLjBmLDAuMGYsCisgICAgICAgIDAuMGYsMS4wZiwKKyAgICAgICAgMS4wZiwxLjBmIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHRleDFbXSA9IHsKKyAgICAgICAgMS4wZiwwLjBmLAorICAgICAgICAxLjBmLDEuMGYsCisgICAgICAgIDAuMGYsMS4wZiwKKyAgICAgICAgMC4wZiwwLjBmIH07CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfUE9TKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfQ09MT1IpOworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoQV9URVgwKTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMSk7CisKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9QT1MsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdnR4KTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9DT0xPUiwgNCwgR0xfRkxPQVQsIGZhbHNlLCAxNiwgY29sb3IpOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDAsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfVEVYMSwgMiwgR0xfRkxPQVQsIGZhbHNlLCA4LCB0ZXgxKTsKK30KKworc3RhdGljIHZvaWQgcmFuZFVuaWZvcm0oaW50IHBnbSwgY29uc3QgY2hhciAqdmFyKSB7CisgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgdmFyKTsKKyAgICBpZiAobG9jID49IDApIHsKKyAgICAgICAgZmxvYXQgeCA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBmbG9hdCB5ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7CisgICAgICAgIGZsb2F0IHogPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKKyAgICAgICAgZmxvYXQgdyA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOworICAgICAgICBnbFVuaWZvcm00Zihsb2MsIHgsIHksIHosIHcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG9Mb29wKGJvb2wgd2FybXVwLCBpbnQgcGdtLCB1aW50MzJfdCBwYXNzQ291bnQpIHsKKyAgICBpZiAod2FybXVwKSB7CisgICAgICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgICAgICBwdFN3YXAoKTsKKyAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXJ0VGltZXIoKTsKKyAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBmb3IgKHVpbnQzMl90IGN0PTA7IGN0IDwgcGFzc0NvdW50OyBjdCsrKSB7CisgICAgICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleE9mZiIpOworICAgICAgICBnbFVuaWZvcm0yZihsb2MsICgoZmxvYXQpY3QpIC8gcGFzc0NvdW50LCAoKGZsb2F0KWN0KSAvIDIuZiAvIHBhc3NDb3VudCk7CisKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV9jb2xvciIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzAiKTsKKyAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8xIik7CisgICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMiIpOworICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzMiKTsKKyAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKKyAgICB9CisgICAgcHRTd2FwKCk7CisgICAgZ2xGaW5pc2goKTsKKyAgICBlbmRUaW1lcihwYXNzQ291bnQpOworfQorCisKK3N0YXRpYyB1aW50MzJfdCByZ2IodWludDMyX3QgciwgdWludDMyX3QgZywgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXQgPSAweGZmMDAwMDAwOworICAgIHJldCB8PSByICYgMHhmZjsKKyAgICByZXQgfD0gKGcgJiAweGZmKSA8PCA4OworICAgIHJldCB8PSAoYiAmIDB4ZmYpIDw8IDE2OworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZ2VuVGV4dHVyZXMoKSB7CisgICAgdWludDMyX3QgKm0gPSAodWludDMyX3QgKiltYWxsb2MoMTAyNCoxMDI0KjQpOworICAgIGZvciAoaW50IHk9MDsgeSA8IDEwMjQ7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDEwMjQ7IHgrKyl7CisgICAgICAgICAgICBtW3kqMTAyNCArIHhdID0gcmdiKHgsICgoKHgreSkgJiAweGZmKSA9PSAweDdmKSAqIDB4ZmYsIHkpOworICAgICAgICB9CisgICAgfQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMSk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDEwMjQsIDEwMjQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworCisgICAgZm9yIChpbnQgeT0wOyB5IDwgMTY7IHkrKyl7CisgICAgICAgIGZvciAoaW50IHg9MDsgeCA8IDE2OyB4KyspeworICAgICAgICAgICAgbVt5KjE2ICsgeF0gPSByZ2IoeCA8PCA0LCAoKCh4K3kpICYgMHhmKSA9PSAweDcpICogMHhmZiwgeSA8PCA0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDIpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxNiwgMTYsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIG0pOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9SRVBFQVQpOworICAgIGZyZWUobSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvU2luZ2xlVGVzdCh1aW50MzJfdCBwZ21OdW0sIGludCB0ZXgpIHsKKyAgICBjb25zdCBjaGFyICpwZ21UeHQgPSBnRnJhZ21lbnRUZXN0c1twZ21OdW1dLT50eHQ7CisgICAgaW50IHBnbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgcGdtVHh0KTsKKyAgICBpZiAoIXBnbSkgeworICAgICAgICBwcmludGYoImVycm9yIHJ1bm5pbmcgdGVzdFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IGxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHBnbSwgInVfdGV4MCIpOworICAgIGlmIChsb2MgPj0gMCkgZ2xVbmlmb3JtMWkobG9jLCAwKTsKKyAgICBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDEiKTsKKyAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMSk7CisKKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgpOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXgpOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisKKyAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAvL3NwcmludGYoc3RyMiwgIiVpLCAlaSwgJWksICVpLCAlaSwgMCIsCisgICAgICAgICAgICAvL3VzZVZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGVGaXJzdFRleCwgZXh0cmFNYXRoLCB0ZXgwKTsKKyAgICAvL2RvTG9vcCh0cnVlLCBwZ20sIHcsIGgsIHN0cjIpOworICAgIC8vZG9Mb29wKGZhbHNlLCBwZ20sIHcsIGgsIHN0cjIpOworCisgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgIHNwcmludGYoZ0N1cnJlbnRUZXN0TmFtZSwgIiVzLCAlaSwgJWksIDEiLCBnRnJhZ21lbnRUZXN0c1twZ21OdW1dLT5uYW1lLCBwZ21OdW0sIHRleCk7CisgICAgZG9Mb29wKHRydWUsIHBnbSwgMTAwKTsKKyAgICBkb0xvb3AoZmFsc2UsIHBnbSwgMTAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGZhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisKKyNpbmNsdWRlICJmaWxsX2NvbW1vbi5jcHAiCisKKworYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCkgeworICAgIGdXaWR0aCA9IHc7CisgICAgZ0hlaWdodCA9IGg7CisgICAgc2V0dXBWQSgpOworICAgIGdlblRleHR1cmVzKCk7CisKKyAgICBwcmludGYoIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7CisKKyAgICBmb3IgKHVpbnQzMl90IG51bSA9IDA7IG51bSA8IGdGcmFnbWVudFRlc3RDb3VudDsgbnVtKyspIHsKKyAgICAgICAgZG9TaW5nbGVUZXN0KG51bSwgMik7CisgICAgICAgIGlmIChnRnJhZ21lbnRUZXN0c1tudW1dLT50ZXhDb3VudCkgeworICAgICAgICAgICAgZG9TaW5nbGVUZXN0KG51bSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDApOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9mcmFnbWVudF9zaGFkZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ1ZWFkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZnJhZ21lbnRfc2hhZGVycy5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKwordHlwZWRlZiBzdHJ1Y3QgRnJhZ21lbnRUZXN0UmVjIHsKKwljb25zdCBjaGFyICogbmFtZTsKKwl1aW50MzJfdCB0ZXhDb3VudDsKKwljb25zdCBjaGFyICogdHh0OworfSBGcmFnbWVudFRlc3Q7CisKK3N0YXRpYyBGcmFnbWVudFRlc3QgZnBGaWxsID0geworCSJTb2xpZCBjb2xvciIsIDAsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvcjtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcEdyYWRpZW50ID0geworCSJTb2xpZCBncmFkaWVudCIsIDAsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwQ29weVRleCA9IHsKKwkiVGV4dHVyZSBjb3B5IiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcENvcHlUZXhHYW1tYSA9IHsKKwkiVGV4dHVyZSBjb3B5IHdpdGggZ2FtbWEiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorICAgICIgIHQucmdiID0gcG93KHQucmdiLCB2ZWMzKDEuNCwgMS40LCAxLjQpKTtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB0O1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwVGV4U3BlYyA9IHsKKwkiVGV4dHVyZSBzcGVjIiwgMSwKKworICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKKyAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgorICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKyAgICAiICBmbG9hdCBzaW1TcGVjID0gZG90KGdsX0ZyYWdDb29yZC54eXosIGdsX0ZyYWdDb29yZC54eXopO1xuIgorICAgICIgIHNpbVNwZWMgPSBwb3coY2xhbXAoc2ltU3BlYywgMC4xLCAxLjApLCA0MC4wKTtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB0ICsgdmVjNChzaW1TcGVjLCBzaW1TcGVjLCBzaW1TcGVjLCBzaW1TcGVjKTtcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcERlcFRleCA9IHsKKwkiRGVwZW5kZW50IExvb2t1cCIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisgICAgIiAgdCArPSB0ZXh0dXJlMkQodV90ZXgwLCB0Lnh5KTtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSB0O1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVDb25zdGFudFRleCA9IHsKKwkiVGV4dHVyZSBtb2R1bGF0ZSBjb25zdGFudCIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKyAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCisKKyAgICAidm9pZCBtYWluKCkge1xuIgorICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKKwkiICBjICo9IHVfY29sb3I7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKKyAgICAifVxuIgorfTsKKworc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlVmFyeWluZ1RleCA9IHsKKwkiVGV4dHVyZSBtb2R1bGF0ZSBncmFkaWVudCIsIDEsCisKKyAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCisgICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgorCSIgIGMgKj0gdl9jb2xvcjtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVWYXJ5aW5nQ29uc3RhbnRUZXggPSB7CisJIlRleHR1cmUgbW9kdWxhdGUgZ3JhZGllbnQgY29uc3RhbnQiLCAxLAorCisgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgorICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCisgICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCisJIiAgYyAqPSB2X2NvbG9yO1xuIgorCSIgIGMgKj0gdV9jb2xvcjtcbiIKKyAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgorICAgICJ9XG4iCit9OworCitzdGF0aWMgRnJhZ21lbnRUZXN0ICpnRnJhZ21lbnRUZXN0c1tdID0geworCSZmcEZpbGwsCisJJmZwR3JhZGllbnQsCisJJmZwQ29weVRleCwKKwkmZnBDb3B5VGV4R2FtbWEsCisgICAmZnBUZXhTcGVjLAorICAgJmZwRGVwVGV4LAorCSZmcE1vZHVsYXRlQ29uc3RhbnRUZXgsCisJJmZwTW9kdWxhdGVWYXJ5aW5nVGV4LAorCSZmcE1vZHVsYXRlVmFyeWluZ0NvbnN0YW50VGV4LAorCit9OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGdGcmFnbWVudFRlc3RDb3VudCA9IHNpemVvZihnRnJhZ21lbnRUZXN0cykgLyBzaXplb2YoZ0ZyYWdtZW50VGVzdHNbMF0pOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmNmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9nbDJfcGVyZi5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KKyNpbmNsdWRlIDx1aS9FR0xVdGlscy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCitzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKSB7CisgICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCkgcmV0dXJuZWQgJWRcbiIsIG9wLCByZXR1cm5WYWwpOworICAgIH0KKworICAgIGZvciAoRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsgZXJyb3IgIT0gRUdMX1NVQ0NFU1M7IGVycm9yCisgICAgICAgICAgICA9IGVnbEdldEVycm9yKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KVxuIiwgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksCisgICAgICAgICAgICAgICAgZXJyb3IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7CisgICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCisgICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBlcnJvcik7CisgICAgfQorfQorCitib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKKworc3RhdGljIEVHTERpc3BsYXkgZHB5Oworc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKKyAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07CisKKyAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0xfTk9ORSB9OworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKyAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgIEVHTGludCB3LCBoOworCisKKyAgICBjaGVja0VnbEVycm9yKCI8aW5pdD4iKTsKKyAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldERpc3BsYXkiKTsKKyAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSByZXR1cm5lZCBFR0xfTk9fRElTUExBWS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm5WYWx1ZSA9IGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xJbml0aWFsaXplIiwgcmV0dXJuVmFsdWUpOworICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgeworICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7DQorICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyhkcHksIHNfY29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOworICAgIGlmIChyZXR1cm5WYWx1ZSkgeworICAgICAgICBwcmludGYoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coKSByZXR1cm5lZCAlZCIsIHJldHVyblZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOworCisgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7CisgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7CisgICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7CisgICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKKyAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7CisgICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKKworICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRvVGVzdCh3LCBoKTsKKyAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwdFN3YXAoKSB7CisgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3NWE3NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuR0wgRVMgUGVyZiBBcHAKKyMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpICMgbm90IDY0IGJpdCBjbGVhbgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBHTFBlcmYKKworTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZ2xwZXJmCisKKyMgUnVuIG9uIEVjbGFpcgorTE9DQUxfU0RLX1ZFUlNJT04gOj0gNworCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCdWlsZCBKTkkgU2hhcmVkIExpYnJhcnkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTE9DQUxfUEFUSDo9ICQoTE9DQUxfUEFUSCkvam5pCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIE9wdGlvbmFsIHRhZyB3b3VsZCBtZWFuIGl0IGRvZXNuJ3QgZ2V0IGluc3RhbGxlZCBieSBkZWZhdWx0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvcgorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgIGdsX2NvZGUuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnV0aWxzIFwKKwlsaWJFR0wgXAorCWxpYkdMRVN2MgorCitMT0NBTF9NT0RVTEUgOj0gbGliZ2xwZXJmCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYgIyBUQVJHRVRfU0lNVUxBVE9SCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVkOTVmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2xwZXJmIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMC4wIiBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMDAwMCIgPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjciIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dscGVyZl9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkdMUGVyZkFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKKyAgICAgICAgICAgIAlhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCisgICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MzM3MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL2puaS9nbF9jb2RlLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gT3BlbkdMIEVTIDIuMCBjb2RlCisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+CisjZGVmaW5lIExPR19UQUcgIkdMUGVyZiBnbF9jb2RlLmNwcCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiLi4vLi4vZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAiCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gV2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc2NyZWVuCisKK3VpbnQzMl90IHc7Cit1aW50MzJfdCBoOworCisvLyBUaGUgc3RhdGVDbG9jayBzdGFydHMgYXQgemVybyBhbmQgaW5jcmVtZW50cyBieSAxIGV2ZXJ5IHRpbWUgd2UgZHJhdyBhIGZyYW1lLiBJdCBpcyB1c2VkIHRvIGNvbnRyb2wgd2hpY2ggcGhhc2Ugb2YgdGhlIHRlc3Qgd2UgYXJlIGluLgorCitpbnQgc3RhdGVDbG9jazsKK2NvbnN0IGludCBkb0xvb3BTdGF0ZXMgPSAyOworY29uc3QgaW50IGRvU2luZ2xlVGVzdFN0YXRlcyA9IDI7Citib29sIGRvbmU7CisKKy8vIFNhdmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSB0ZXN0IChzbyB3ZSBjYW4gcHJpbnQgdGhlbSBvdXQgd2hlbiB3ZSBmaW5pc2ggdGhlIHRpbWluZy4pCisKKworaW50IHBnbTsKKwordm9pZCBwdFN3YXAoKSB7Cit9CisKK3ZvaWQgZG9UZXN0KCkgeworICAgIHVpbnQzMl90IHRlc3ROdW0gPSBzdGF0ZUNsb2NrID4+IDI7CisgICAgaW50IHRleFNpemUgPSAoKHN0YXRlQ2xvY2sgPj4gMSkgJiAweDEpICsgMTsKKworICAgIGlmICh0ZXN0TnVtID49IGdGcmFnbWVudFRlc3RDb3VudCkgeworICAgICAgIExPR0koImRvbmVcbiIpOworICAgICAgIGlmIChmT3V0KSB7CisgICAgICAgICAgIGZjbG9zZShmT3V0KTsKKyAgICAgICAgICAgZk91dCA9IE5VTEw7CisgICAgICAgfQorICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBMT0dJKCJkb1Rlc3QgJWQgJWQgJWRcbiIsIHRleENvdW50LCBleHRyYU1hdGgsIHRlc3RTdWJTdGF0ZSk7CisKKy8vICAgICAgICBmb3IgKHVpbnQzMl90IG51bSA9IDA7IG51bSA8IGdGcmFnbWVudFRlc3RDb3VudDsgbnVtKyspIHsKKyAgICBkb1NpbmdsZVRlc3QodGVzdE51bSwgdGV4U2l6ZSk7Cit9CisKK2V4dGVybiAiQyIgeworICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKKyAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOworfTsKKworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpCit7CisgICAgZ1dpZHRoID0gd2lkdGg7CisgICAgZ0hlaWdodCA9IGhlaWdodDsKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgICAgIHN0YXRlQ2xvY2sgPSAwOworICAgICAgICAgICAgZG9uZSA9IGZhbHNlOworICAgICAgICAgICAgc2V0dXBWQSgpOworICAgICAgICAgICAgZ2VuVGV4dHVyZXMoKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gIi9zZGNhcmQvZ2xwZXJmLmNzdiI7CisgICAgICAgICAgICBpZiAoZk91dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgIExPR0koIkNsb3NpbmcgcGFydGlhbGx5IHdyaXR0ZW4gb3V0cHV0Lm4iKTsKKyAgICAgICAgICAgICAgICAgZmNsb3NlKGZPdXQpOworICAgICAgICAgICAgICAgICBmT3V0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0koIldyaXRpbmcgdG86ICVzXG4iLGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGZPdXQgPSBmb3BlbihmaWxlTmFtZSwgInciKTsKKyAgICAgICAgICAgIGlmIChmT3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3Qgb3BlbjogJXNcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTE9HSSgiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKKyAgICAgICAgICAgIGlmIChmT3V0KSBmcHJpbnRmKGZPdXQsInZhckNvbG9yLCB0ZXhDb3VudCwgbW9kdWxhdGUsIGV4dHJhTWF0aCwgdGV4U2l6ZSwgYmxlbmQsIE1wcHMsIERDNjBcclxuIik7CisgICAgfQorfQorCitKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCit7CisgICAgaWYgKCEgZG9uZSkgeworICAgICAgICBpZiAoc3RhdGVDbG9jayA+IDAgJiYgKChzdGF0ZUNsb2NrICYgMSkgPT0gMCkpIHsKKyAgICAgICAgICAgIC8vZW5kVGltZXIoMTAwKTsKKyAgICAgICAgfQorICAgICAgICBkb1Rlc3QoKTsKKyAgICAgICAgc3RhdGVDbG9jaysrOworICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIxMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKKyAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZ2xwZXJmX2FjdGl2aXR5Ij5HTFBlcmY8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YzYWJmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmdscGVyZjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworcHVibGljIGNsYXNzIEdMUGVyZkFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgR0xQZXJmVmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisJZ2V0V2luZG93KCkuc2V0RmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTiwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CisgICAgICAgIG1WaWV3ID0gbmV3IEdMUGVyZlZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisJc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZMaWIuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhMGU1NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZ2xwZXJmOworCisvLyBXcmFwcGVyIGZvciBuYXRpdmUgbGlicmFyeQorCitwdWJsaWMgY2xhc3MgR0xQZXJmTGliIHsKKworICAgICBzdGF0aWMgeworICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJnbHBlcmYiKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdpZHRoIHRoZSBjdXJyZW50IHZpZXcgd2lkdGgKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBjdXJyZW50IHZpZXcgaGVpZ2h0CisgICAgICovCisgICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0ZXAoKTsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlNGE0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmVmlldy5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKKyAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKKyAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KKyAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KKyAqCisgKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCisgKiBpbnN0YW5jZS4KKyAqLworY2xhc3MgR0xQZXJmVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0xQZXJmVmlldyI7CisKKyAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXQoZmFsc2UsIDAsIDApOworICAgIH0KKworICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCh0cmFuc2x1Y2VudCwgZGVwdGgsIHN0ZW5jaWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0KGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgc2V0RUdMQ29udGV4dEZhY3RvcnkobmV3IENvbnRleHRGYWN0b3J5KCkpOworICAgICAgICBzZXRFR0xDb25maWdDaG9vc2VyKCB0cmFuc2x1Y2VudCA/CisgICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDgsOCw4LDgsIGRlcHRoLCBzdGVuY2lsKSA6CisgICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDUsNiw1LDAsIGRlcHRoLCBzdGVuY2lsKSk7CisgICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29udGV4dEZhY3RvcnkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7CisgICAgICAgIHB1YmxpYyBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImNyZWF0aW5nIE9wZW5HTCBFUyAyLjAgY29udGV4dCIpOworICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOworICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTDEwLkVHTF9OT05FIH07CisgICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBhdHRyaWJfbGlzdCk7CisgICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKFN0cmluZyBwcm9tcHQsIEVHTDEwIGVnbCkgeworICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgIHdoaWxlICgoZXJyb3IgPSBlZ2wuZWdsR2V0RXJyb3IoKSkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiJXM6IEVHTCBlcnJvcjogMHgleCIsIHByb21wdCwgZXJyb3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ0Nob29zZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbmZpZ0Nob29zZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gNDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc19jb25maWdBdHRyaWJzMiA9CisgICAgICAgIHsKKyAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCA0LAorICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgNCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCisgICAgICAgIH07CisKKyAgICAgICAgcHVibGljIENvbmZpZ0Nob29zZXIoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKKyAgICAgICAgICAgIG1SZWRTaXplID0gcjsKKyAgICAgICAgICAgIG1HcmVlblNpemUgPSBnOworICAgICAgICAgICAgbUJsdWVTaXplID0gYjsKKyAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhOworICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoOworICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7CisKKyAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBudWxsLCAwLCBudW1fY29uZmlnKTsKKworICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOworCisgICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKKyAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgY29uZmlncywgbnVtQ29uZmlncywgbnVtX2NvbmZpZyk7CisgICAgICAgICAgICAvLyBwcmludENvbmZpZ3MoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgICAgIHJldHVybiBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKKyAgICAgICAgICAgIEVHTENvbmZpZyBjbG9zZXN0Q29uZmlnID0gbnVsbDsKKyAgICAgICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSAxMDAwOworICAgICAgICAgICAgZm9yKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOworICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOworICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcz49IG1TdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOworICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhyIC0gbVJlZFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoZyAtIG1HcmVlblNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYiAtIG1CbHVlU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhhIC0gbUFscGhhU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q29uZmlnID0gY29uZmlnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RDb25maWc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKKworICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3MoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7CisgICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3MubGVuZ3RoOworICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIlZCBjb25maWd1cmF0aW9ucyIsIG51bUNvbmZpZ3MpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uICVkOlxuIiwgaSkpOworICAgICAgICAgICAgICAgIHByaW50Q29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlnc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgaW50W10gYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0lELAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9SRU5ERVJBQkxFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9JRCwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDMwLCAvLyBFR0wxMC5FR0xfUFJFU0VSVkVEX1JFU09VUkNFUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRVMsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVfQlVGRkVSUywKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NVUkZBQ0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzOSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCisgICAgICAgICAgICAgICAgICAgIDB4MzAzQSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAorICAgICAgICAgICAgICAgICAgICAweDMwM0IsIC8vIEVHTDEwLkVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgICAgMHgzMDNDLCAvLyBFR0wxMC5FR0xfTUFYX1NXQVBfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MVU1JTkFOQ0VfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX01BU0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAorICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAweDMwNDIgLy8gRUdMMTAuRUdMX0NPTkZPUk1BTlQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9CVUZGRVJfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfQkxVRV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9HUkVFTl9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9SRURfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfREVQVEhfU0laRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfU1RFTkNJTF9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfQ0FWRUFUIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfSUQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0xFVkVMIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1BJWEVMUyIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfV0lEVEgiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9SRU5ERVJBQkxFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX0lEIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRVMiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRV9CVUZGRVJTIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9TVVJGQUNFX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9NSU5fU1dBUF9JTlRFUlZBTCIsCisgICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1NXQVBfSU5URVJWQUwiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0xVTUlOQU5DRV9TSVpFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9NQVNLX1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTE9SX0JVRkZFUl9UWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgIkVHTF9SRU5ERVJBQkxFX1RZUEUiLAorICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZPUk1BTlQiCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6ICVkXG4iLCBuYW1lLCB2YWx1ZVswXSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogZmFpbGVkXG4iLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3ViY2xhc3NlcyBjYW4gYWRqdXN0IHRoZXNlIHZhbHVlczoKKyAgICAgICAgcHJvdGVjdGVkIGludCBtUmVkU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtR3JlZW5TaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1CbHVlU2l6ZTsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtQWxwaGFTaXplOworICAgICAgICBwcm90ZWN0ZWQgaW50IG1EZXB0aFNpemU7CisgICAgICAgIHByb3RlY3RlZCBpbnQgbVN0ZW5jaWxTaXplOworICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZSA9IG5ldyBpbnRbMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgeworICAgICAgICAgICAgR0xQZXJmTGliLnN0ZXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICBHTFBlcmZMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzc4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQorIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkgIyBub3QgNjQgYml0IGNsZWFuCisKK1RPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBCdWlsZCBhY3Rpdml0eQorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RWaWV3cG9ydAorCisjIFNldCBhIHNwZWNpZmljIFNESyB2ZXJzaW9uIHNvIHdlIGNhbiBydW4gb24gRnJveW8uCisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDgKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKK2VuZGlmICMgVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTlkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3QiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8YXBwbGljYXRpb24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdF9hY3Rpdml0eSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyLkZ1bGxzY3JlZW4iCisgICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRSBiL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmFiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpAQCAtMCwwICsxLDI4IEBACitSZXBybyBzdGVwczoKKworYnVpbGQsIGluc3RhbGwgYW5kIHJ1biB0aGUgYXR0YWNoZWQgdGVzdCBwcm9ncmFtIFRlc3RWaWV3cG9ydC5hcGsKKworUnVuIG9uIFNhcHBoaXJlIHdpdGggRnJveW8uCisKK1RoZSBwcm9ncmFtIGNsZWFycyB0aGUgc2NyZWVuIHRvIGJsdWUsIHRoZW4gZHJhd3MgYSBmdWxsIHNjcmVlbiB3aGl0ZSBxdWFkIHRoYXQKK2lzIGFsbGlnbmVkIHRvIHRoZSBzY3JlZW4uCisoVGhlcmVmb3JlIHRoZSB3aG9sZSBzY3JlZW4gc2hvdWxkIGFwcGVhciB0byBiZSB3aGl0ZS4pCisKKworTm90ZSB0aGF0IHNjcmVlbiBpcyBhbGwgd2hpdGUuCisKK1JvdGF0ZSBzY3JlZW4gOTAgZGVncmVlcy4KKworRXhwZWN0ZWQ6IHNjcmVlbiBpcyBzdGlsbCBhbGwgd2hpdGUuCisKK0FjdHVhbDogc2NyZWVuIGlzIGJsdWUgd2l0aCBvZmZzZXQgd2hpdGUgcmVjdGFuZ2xlLgorCitUaGlzIGJ1ZyBvbmx5IGhhcHBlbnMgb24gU2FwcGhpcmUsIGl0IHdvcmtzIGNvcnJlY3RseSBvbiBQYXNzaW9uLgorCitXaGF0IGhhcHBlbnM6CisKK0kgdGhpbmsgdGhlIGJ1ZyBpcyB0aGF0IHRoZSBnbC5nbFZpZXdwb3J0KCkgY2FsbCBpbiBvblN1cmZhY2VDaGFuZ2VkKCkgaXMKK2JlaW5nIGlnbm9yZWQgYnkgdGhlIE9wZW5HTCBkcml2ZXIuCisKK05PVEU6IElmIGEgZ2wuZ2xWaWV3cG9ydCBjYWxsIGlzIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9uRHJhd0ZyYW1lKCkKK2NhbGwgKHdoaWNoIG1lYW5zIGl0IGlzIGNhbGxlZCBiZWZvcmUgZXZlcnkgZHJhdyksIHRoZSBwcm9ncmFtIHJ1bnMgY29ycmVjdGx5LgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjhiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCisgICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InRlc3RfYWN0aXZpdHkiPlRlc3QgVmlld3BvcnQ8L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2U0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdEFjdGl2aXR5IjsKKyAgICBUZXN0VmlldyBtVmlldzsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgbVZpZXcgPSBuZXcgVGVzdFZpZXcoZ2V0QXBwbGljYXRpb24oKSk7CisJICAgIG1WaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworCSAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5vblBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2MzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgorICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQorICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQorICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKKyAqIGluc3RhbmNlLgorICovCitjbGFzcyBUZXN0VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgeworICAgIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOworICAgICAgICBzZXRSZW5kZXJNb2RlKFJFTkRFUk1PREVfV0hFTl9ESVJUWSk7CisgICAgfQorICAgIAorICAgICAgICAvKiogQSBncmlkIGlzIGEgdG9wb2xvZ2ljYWxseSByZWN0YW5ndWxhciBhcnJheSBvZiB2ZXJ0aWNlcy4KKyAgICAqCisgICAgKiBUaGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIGFyZSBoZWxkIGluIFZCTyBvYmplY3RzIGJlY2F1c2Ugb24gbW9zdAorICAgICogR1BVcyBWQk8gb2JqZWN0cyBhcmUgdGhlIGZhc3Rlc3Qgd2F5IG9mIHJlbmRlcmluZyBzdGF0aWMgdmVydGV4CisgICAgKiBhbmQgaW5kZXggZGF0YS4KKyAgICAqCisgICAgKi8KKworICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JpZCB7CisgICAgICAgLy8gU2l6ZSBvZiB2ZXJ0ZXggZGF0YSBlbGVtZW50cyBpbiBieXRlczoKKyAgICAgICBmaW5hbCBzdGF0aWMgaW50IEZMT0FUX1NJWkUgPSA0OworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUl9TSVpFID0gMjsKKworICAgICAgIC8vIFZlcnRleCBzdHJ1Y3R1cmU6CisgICAgICAgLy8gZmxvYXQgeCwgeSwgejsKKworICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgVkVSVEVYX1NJWkUgPSAzICogRkxPQVRfU0laRTsKKworICAgICAgIHByaXZhdGUgaW50IG1WZXJ0ZXhCdWZmZXJPYmplY3RJZDsKKyAgICAgICBwcml2YXRlIGludCBtRWxlbWVudEJ1ZmZlck9iamVjdElkOworCisgICAgICAgLy8gVGhlc2UgYnVmZmVycyBhcmUgdXNlZCB0byBob2xkIHRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgd2hpbGUKKyAgICAgICAvLyBjb25zdHJ1Y3RpbmcgdGhlIGdyaWQuIE9uY2UgY3JlYXRlQnVmZmVyT2JqZWN0cygpIGlzIGNhbGxlZAorICAgICAgIC8vIHRoZSBidWZmZXJzIGFyZSBudWxsZWQgb3V0IHRvIHNhdmUgbWVtb3J5LgorCisgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1WZXJ0ZXhCeXRlQnVmZmVyOworICAgICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgbVZlcnRleEJ1ZmZlcjsKKyAgICAgICBwcml2YXRlIENoYXJCdWZmZXIgbUluZGV4QnVmZmVyOworCisgICAgICAgcHJpdmF0ZSBpbnQgbVc7CisgICAgICAgcHJpdmF0ZSBpbnQgbUg7CisgICAgICAgcHJpdmF0ZSBpbnQgbUluZGV4Q291bnQ7CisKKyAgICAgICBwdWJsaWMgR3JpZChpbnQgdywgaW50IGgpIHsKKyAgICAgICAgICAgaWYgKHcgPCAwIHx8IHcgPj0gNjU1MzYpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInciKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoaCA8IDAgfHwgaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaCIpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmICh3ICogaCA+PSA2NTUzNikgeworICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyAqIGggPj0gNjU1MzYiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIG1XID0gdzsKKyAgICAgICAgICAgbUggPSBoOworICAgICAgICAgICBpbnQgc2l6ZSA9IHcgKiBoOworCisgICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJURVhfU0laRSAqIHNpemUpCisgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbVZlcnRleEJ5dGVCdWZmZXIuYXNGbG9hdEJ1ZmZlcigpOworCisgICAgICAgICAgIGludCBxdWFkVyA9IG1XIC0gMTsKKyAgICAgICAgICAgaW50IHF1YWRIID0gbUggLSAxOworICAgICAgICAgICBpbnQgcXVhZENvdW50ID0gcXVhZFcgKiBxdWFkSDsKKyAgICAgICAgICAgaW50IGluZGV4Q291bnQgPSBxdWFkQ291bnQgKiA2OworICAgICAgICAgICBtSW5kZXhDb3VudCA9IGluZGV4Q291bnQ7CisgICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0hBUl9TSVpFICogaW5kZXhDb3VudCkKKyAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNDaGFyQnVmZmVyKCk7CisKKyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0cmlhbmdsZSBsaXN0IG1lc2guCisgICAgICAgICAgICAqCisgICAgICAgICAgICAqICAgICBbMF0tLS0tLVsgIDFdIC4uLgorICAgICAgICAgICAgKiAgICAgIHwgICAgLyAgIHwKKyAgICAgICAgICAgICogICAgICB8ICAgLyAgICB8CisgICAgICAgICAgICAqICAgICAgfCAgLyAgICAgfAorICAgICAgICAgICAgKiAgICAgW3ddLS0tLS1bdysxXSAuLi4KKyAgICAgICAgICAgICogICAgICB8ICAgICAgIHwKKyAgICAgICAgICAgICoKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBxdWFkSDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBxdWFkVzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYSA9IChjaGFyKSAoeSAqIG1XICsgeCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYiA9IChjaGFyKSAoeSAqIG1XICsgeCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHgpOworICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGQgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHggKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYSk7CisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOworCisgICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOworICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgZCk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgICB9CisKKyAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7CisgICAgICAgICAgIGlmIChpIDwgMCB8fCBpID49IG1XKSB7CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpIik7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbUgpIHsKKyAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImoiKTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGludCBpbmRleCA9IG1XICogaiArIGk7CisKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wb3NpdGlvbihpbmRleCAqIFZFUlRFWF9TSVpFIC8gRkxPQVRfU0laRSk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHgpOworICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh5KTsKKyAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeik7CisgICAgICAgfQorCisgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQnVmZmVyT2JqZWN0cyhHTCBnbCkgeworICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIHRoZSB2ZXJ0ZXggYW5kIGVsZW1lbnQgYnVmZmVyIElEcworICAgICAgICAgICBpbnRbXSB2Ym9JZHMgPSBuZXcgaW50WzJdOworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisgICAgICAgICAgIGdsMTEuZ2xHZW5CdWZmZXJzKDIsIHZib0lkcywgMCk7CisgICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCA9IHZib0lkc1swXTsKKyAgICAgICAgICAgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCA9IHZib0lkc1sxXTsKKworICAgICAgICAgICAvLyBVcGxvYWQgdGhlIHZlcnRleCBkYXRhCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKKyAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCeXRlQnVmZmVyLmNhcGFjaXR5KCksIG1WZXJ0ZXhCeXRlQnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKKyAgICAgICAgICAgbUluZGV4QnVmZmVyLnBvc2l0aW9uKDApOworICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXIuY2FwYWNpdHkoKSAqIENIQVJfU0laRSwgbUluZGV4QnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKKworICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBpbi1tZW1vcnkgZGF0YSBhbnkgbW9yZQorICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbnVsbDsKKyAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBudWxsOworICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBudWxsOworICAgICAgIH0KKworICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR0wxMCBnbCkgeworICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7CisKKyAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7CisKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7CisgICAgICAgICAgIGdsMTEuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIFZFUlRFWF9TSVpFLCAwKTsKKyAgICAgICAgICAgCisgICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOworICAgICAgICAgICBnbDExLmdsRHJhd0VsZW1lbnRzKEdMMTAuR0xfVFJJQU5HTEVTLCBtSW5kZXhDb3VudCwgR0wxMC5HTF9VTlNJR05FRF9TSE9SVCwgMCk7CisgICAgICAgICAgIGdsLmdsRGlzYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIDApOworICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKKyAgICAgICB9CisgICB9CisKKworICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW5kZXJlciI7CisgICAgICAgIHByaXZhdGUgR3JpZCBtR3JpZDsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKKwkJCWdsLmdsQ2xlYXJDb2xvcigwLDAsMSwxKTsKKwkJCWdsLmdsQ2xlYXIoR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgICAgIG1HcmlkLmRyYXcoZ2wpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgIGdsLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9QUk9KRUNUSU9OKTsKKwkJCWdsLmdsTG9hZElkZW50aXR5KCk7CisJCQlnbC5nbE9ydGhvZigwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7CisJCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOworICAgICAgICAgICAgY3JlYXRlR3JpZChnbCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyaWQoR0wxMCBnbCwgZmxvYXQgdywgZmxvYXQgaCkgeworICAgICAgICBtR3JpZCA9IG5ldyBHcmlkKDIsIDIpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworCQkJCQlmbG9hdCB4ID0gdyAqIGk7CisJCQkJCWZsb2F0IHkgPSBoICogajsKKwkJCQkJZmxvYXQgeiA9IDAuMGY7CisJCQkJCW1HcmlkLnNldChpLGosIHgsIHksIHopOworCQkJCX0KKwkJCX0KKwkJCW1HcmlkLmNyZWF0ZUJ1ZmZlck9iamVjdHMoZ2wpOworCQl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvRGVmYXVsdENvbnRhaW5lclNlcnZpY2UvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAzN2Y1YjYxLi5mZmQ2YjU5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9EZWZhdWx0Q29udGFpbmVyU2VydmljZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL0RlZmF1bHRDb250YWluZXJTZXJ2aWNlL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE4LDYgKzE4LDYgQEAKICovCiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDwhLS0gc2VydmljZSBuYW1lICAtLT4KKyAgICA8IS0tIHNlcnZpY2UgbmFtZSBbQ0hBUiBMSU1JVD0yNV0gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZV9uYW1lIj5QYWNrYWdlIEFjY2VzcyBIZWxwZXI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MWU2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwX2xhYmVsIiBtc2dpZD0iNDU2NzU2NjA5ODUyODU4ODg2MyI+Ik1lbW9yaWEgZGFscyBwYXJhbWV0ZXJzIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbAppbmRleCA1MmUwNGQ3Li4yYWUzNGUzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMvZGVmYXVsdHMueG1sCisrKyBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKQEAgLTcyLDQgKzcyLDYgQEAKIAogICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5UIC0tPgogICAgIDxib29sIG5hbWU9ImRlZl92aWJyYXRlX2luX3NpbGVudCI+dHJ1ZTwvYm9vbD4KKworICAgIDxib29sIG5hbWU9ImRlZl91c2VfcHRwX2ludGVyZmFjZSI+ZmFsc2U8L2Jvb2w+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKaW5kZXggYWQwNGJiNC4uYzFhZDFjYSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKQEAgLTEwNjgsNiArMTA2OCw5IEBACiAgICAgCiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULAogICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX3ZpYnJhdGVfaW5fc2lsZW50KTsKKworICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5VU0VfUFRQX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl91c2VfcHRwX2ludGVyZmFjZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkLm1rCmluZGV4IDRjODM3NjguLmNmYWQ5MzkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWQubWsKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZC5tawpAQCAtMywxMSArMywxNiBAQAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKSBcCisgICAgLi4vLi4vLi4vZXgvY2Fyb3VzZWwvamF2YS9jb20vYW5kcm9pZC9leC9jYXJvdXNlbC9jYXJvdXNlbC5ycwogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZXJ2aWNlcwogCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC1jb21tb24tY2Fyb3VzZWwKKwogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFN5c3RlbVVJCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQogCitMT0NBTF9QUk9HVUFSRF9GTEFHUyA6PSAtaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Byb2d1YXJkLmZsYWdzCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMGZjY2JlNy4uZjFmMzFjZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC01LDYgKzUsOSBAQAogICAgICAgICA+CiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNUQVRVU19CQVJfU0VSVklDRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USCIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJMVUVUT09USF9BRE1JTiIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkdFVF9UQVNLUyIgLz4KIAogICAgIDxhcHBsaWNhdGlvbgogICAgICAgICBhbmRyb2lkOnBlcnNpc3RlbnQ9InRydWUiCkBAIC0xMyw3ICsxNiwxMiBAQAogICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19sYXVuY2hlcl9zZXR0aW5ncyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICA8c2VydmljZQotICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSIuc3RhdHVzYmFyLlN0YXR1c0JhclNlcnZpY2UiCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIuUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0iZmFsc2UiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxzZXJ2aWNlCisgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ii5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UiCiAgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJmYWxzZSIKICAgICAgICAgICAgIC8+CiAKQEAgLTIxLDUgKzI5LDExIEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9TeXN0ZW1VSS9wcm9ndWFyZC5mbGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ4NDYxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcHJvZ3VhcmQuZmxhZ3MKQEAgLTAsMCArMSw2IEBACista2VlcCBjbGFzcyBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0JhclNlcnZpY2UgeworICBwdWJsaWMgdm9pZCBub3RpZmljYXRpb25JY29uc0NsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCBzeXN0ZW1JbmZvQ2xpY2tlZChhbmRyb2lkLnZpZXcuVmlldyk7CisgIHB1YmxpYyB2b2lkIHJlY2VudEJ1dHRvbkNsaWNrZWQoYW5kcm9pZC52aWV3LlZpZXcpOworICBwdWJsaWMgdm9pZCB0b2dnbGVMaWdodHNPdXQoYW5kcm9pZC52aWV3LlZpZXcpOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9oeWRyYXVsaWNfYnJha2VfaW50ZXJwb2xhdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY3NzhlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvci54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIC8vZGV2aWNlL2FwcHMvY29tbW9uL3Jlcy9hbmltL2Vhc2Vfb3V0X2ludGVycG9sYXRvci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxkZWNlbGVyYXRlSW50ZXJwb2xhdG9yIAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmZhY3Rvcj0iMTAuMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vbGlnaHRzX291dF9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iMTAwJXAiIGFuZHJvaWQ6dG9ZRGVsdGE9IjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX21lZGl1bUFuaW1UaW1lIiAKKyAgICAgICAgYW5kcm9pZDppbnRlcnBvbGF0b3I9IkBhbmltL2h5ZHJhdWxpY19icmFrZV9pbnRlcnBvbGF0b3IiCisgICAgICAgIC8+CisgICAgPGFscGhhIGFuZHJvaWQ6ZnJvbUFscGhhPSIwLjAiIGFuZHJvaWQ6dG9BbHBoYT0iMS4wIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICAvPgorPC9zZXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X291dC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvYW5pbS9saWdodHNfb3V0X291dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiYzU1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL2xpZ2h0c19vdXRfb3V0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICA+CisgICAgPHRyYW5zbGF0ZSBhbmRyb2lkOnRvWURlbHRhPSIxMDAlcCIgYW5kcm9pZDpmcm9tWURlbHRhPSIwIiAKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iQGFuZHJvaWQ6aW50ZWdlci9jb25maWdfbWVkaXVtQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwZmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfaW4ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6ZnJvbVlEZWx0YT0iLTEwMCVwIiBhbmRyb2lkOnRvWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDpmcm9tQWxwaGE9IjAuMCIgYW5kcm9pZDp0b0FscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9hbmltL3N0YXR1c19iYXJfb3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcyYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2FuaW0vc3RhdHVzX2Jhcl9vdXQueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgID4KKyAgICA8dHJhbnNsYXRlIGFuZHJvaWQ6dG9ZRGVsdGE9Ii0xMDAlcCIgYW5kcm9pZDpmcm9tWURlbHRhPSIwIgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSJAYW5kcm9pZDppbnRlZ2VyL2NvbmZpZ19sb25nQW5pbVRpbWUiIAorICAgICAgICBhbmRyb2lkOmludGVycG9sYXRvcj0iQGFuaW0vaHlkcmF1bGljX2JyYWtlX2ludGVycG9sYXRvciIKKyAgICAgICAgLz4KKyAgICA8YWxwaGEgYW5kcm9pZDp0b0FscGhhPSIwLjAiIGFuZHJvaWQ6ZnJvbUFscGhhPSIxLjAiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IkBhbmRyb2lkOmludGVnZXIvY29uZmlnX2xvbmdBbmltVGltZSIgCisgICAgICAgIC8+Cis8L3NldD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzEyN2JkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWY4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9iYXR0ZXJ5XzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFjYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2NDAyNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkZTBlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyYjhlZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYmF0dGVyeV84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyMzFmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2JhdHRlcnlfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9kZWZhdWx0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMDA3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2J1dHRvbl9mcmFtZV9wcmVzc2VkLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxYWFkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2RvdHNfZW1wdHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTc2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2VtcHR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9kb3RzX2Z1bGwucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvZG90c19mdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlMzZjNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3NpZ25hbF8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMTAwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGY2NTJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzIwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTVkZDhlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzQwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzMWJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzYwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zaWduYWxfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE2NTZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc2lnbmFsXzgwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmOTU0MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhYTE5MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZmM3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjA5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzNWFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzljZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfbWVudV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTMyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N0YXR1c19iYXJfdmV0b19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYWlycGxhbmVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3NWVlOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjUwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfYnJpZ2h0bmVzc19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4N2ZiOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfb3JpZW50YXRpb25fbG9ja2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9zeXN0ZW1fcGFuZWxfc291bmRfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU4NTdiNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9ub3JtYWwuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2FsZXJ0X2Jhcl9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNThkZTEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYWxlcnRfYmFyX2JhY2tncm91bmRfcHJlc3NlZC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9iYXR0ZXJ5X2xvd19iYXR0ZXJ5LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfbG93X2JhdHRlcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJiZTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2JhdHRlcnlfbG93X2JhdHRlcnkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfZGVmYXVsdC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIxZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX2RlZmF1bHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9idXR0b25fZnJhbWVfcHJlc3NlZC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY3YTRkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvYnV0dG9uX2ZyYW1lX3ByZXNzZWQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZGl2aWRlcl9ob3Jpem9udGFsX2Rhcmtfb3BhcXVlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ0ZjBkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrX29wYXF1ZS45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvZG90c19lbXB0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhZGE0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZW1wdHkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2RvdHNfZnVsbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzQ2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9kb3RzX2Z1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9haXJwbGFuZV9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5N2JhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYWlycGxhbmVfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk2YjViCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2FpcnBsYW5lX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmFjay5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmFjay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1YTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9taW5pLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X21pbmkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmFiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9taW5pLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmF0dGVyeV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YjQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9iYXR0ZXJ5X29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2M2JhNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ibHVldG9vdGhfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzlkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYmx1ZXRvb3RoX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzcy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmYTVmYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19hdXRvLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9icmlnaHRuZXNzX2F1dG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19hdXRvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU1ZTNhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2JyaWdodG5lc3NfbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfY2xvc2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2Nsb3NlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FiY2JjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2Nsb3NlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZGVmYXVsdF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZGVmYXVsdF9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9kZWZhdWx0X2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29mZi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyZWQzNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ncHNfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfZ3BzX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaG9tZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaG9tZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4MTNkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9ob21lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9saWdodHNvdXQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDdhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbGlnaHRzb3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfbWVudS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3NzVmMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9tZW51LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfb3Blbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkNjI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9vcGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcHJlc3NfYmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU4MzkzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3ByZXNzX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yZWNlbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGFmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcmVjZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9sYW5zY2FwZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYWRmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX2xhbnNjYXBlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29mZl9wb3J0cmFpdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMGFjNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb2ZmX3BvcnRyYWl0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9yb3RhdGVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTdkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfcm90YXRlX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9zb3VuZF9vZmYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTFlODYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfc291bmRfb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNiYTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3NvdW5kX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX21pbmkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmQyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9taW5pLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vZmYucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FjYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX3dpZmlfb2ZmLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfd2lmaV9vbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiMWM3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl93aWZpX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1NzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2JhY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MjdiMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfYmFja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNjQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2M0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2V4cGFuZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxOWRlZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NGZlOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaG9tZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfaWNvbl90cmF5LjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmFjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2ljb25fdHJheS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX2l0ZW1fYXBwX2JhY2tncm91bmRfbm9ybWFsLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDc5NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9pdGVtX2FwcF9iYWNrZ3JvdW5kX25vcm1hbC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzYTc1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N0YXR1c19iYXJfbWVudV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMjFkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQ4ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBhM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl9yZWNlbnRfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE3Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zdGF0dXNfYmFyX3ZldG9fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc1YTUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWI0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8xMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MDUwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzEwMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTkwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8yMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfMzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmYxOWYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV8zMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWFiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV80MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDI0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfYmF0dGVyeV81MC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTkyN2ExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzcwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzcwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfNzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzgwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzgwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RkOWJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzkwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5XzkwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTM2ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnlfOTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pXzEwMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViMGYyOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV9yZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX2JhdHRlcnltaW5pX3JlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjYzZiOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9iYXR0ZXJ5bWluaV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9oaWRlbm90aWZpY2F0aW9uX2hhbmRsZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2VkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfaGlkZW5vdGlmaWNhdGlvbl9oYW5kbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9taW5pbWV0ZXJfYmcucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX21pbmltZXRlcl9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyNjVmYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9taW5pbWV0ZXJfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9wYW5lbF9iZy45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9wYW5lbF9iZy45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwMzRiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3BhbmVsX2JnLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjkzNzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsXzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAwLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMTAwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmU3NjNiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8yMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2NjM2MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF8zMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZDk0ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfMzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNDAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF80MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMjlkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF81MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5ODlkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNjAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF82MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNTdkYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNzAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF83MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MTk2OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfNzAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfODAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF84MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3N2FlMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfODAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfOTAucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3NpZ25hbF85MC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2MDQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxfOTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl9zaWduYWxtaW5pXzEwMC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsbWluaV8xMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZWFhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfc2lnbmFsbWluaV8xMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb2ZmLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzYmFyX3RvZ2dsZV9iZ19vZmYuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NDlkOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb2ZmLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c2Jhcl90b2dnbGVfYmdfb24uOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29uLjkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTA1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9zeXNiYXJfdG9nZ2xlX2JnX29uLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9haXJwbGFuZV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjg3NTMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2FpcnBsYW5lX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX2JyaWdodG5lc3NfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmYzgzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9icmlnaHRuZXNzX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg0NzljCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX29yaWVudGF0aW9uX2xvY2tlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxZDI2YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9vcmllbnRhdGlvbl9sb2NrZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3N5c3RlbV9wYW5lbF9zb3VuZF9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjYzNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvc3lzdGVtX3BhbmVsX3NvdW5kX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjZhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9hbGVydF9iYXJfYmFja2dyb3VuZF9wcmVzc2VkIiAvPgorICAgIDxpdGVtCisgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmRfbm9ybWFsIiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2J1dHRvbl9mcmFtZS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvYnV0dG9uX2ZyYW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIzOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2J1dHRvbl9mcmFtZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvYnV0dG9uX2ZyYW1lX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2J1dHRvbl9mcmFtZV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYTJhOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZy54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfc3lzYmFyX3ByZXNzX2JnIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfZGVmYXVsdF9iZyIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfYmFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZjE0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2sueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja19wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tfZGVmYXVsdCIgLz4KKzwvc2VsZWN0b3I+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9leHBhbmQueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfZXhwYW5kX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2hvbWVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9ob21lX2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zdGF0dXNfYmFyX21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzI4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX21lbnVfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9tZW51X2RlZmF1bHQiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl9yZWNlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzA4NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfcmVjZW50LnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX3JlY2VudF9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFiNjgxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N0YXR1c19iYXJfdmV0by54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9wcmVzc2VkPSJ0cnVlIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl92ZXRvX3ByZXNzZWQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0b19ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUxYmYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8bGV2ZWwtbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfMjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8zMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI0MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfNTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNjAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV82MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI3MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9iYXR0ZXJ5XzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnlfODAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iOTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV85MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIxMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeV8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzAwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCI+CisgICAgPGxldmVsLWxpc3Q+CisgICAgICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjE1MDAiICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX2JhdHRlcnltaW5pX3JlZCIgLz4KKyAgICAgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAwMDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeW1pbmlfMTAwIiAvPgorICAgIDwvbGV2ZWwtbGlzdD4KKzwvY2xpcD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfc2lnbmFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYxYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWwueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfOTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3NpZ25hbG1pbmkueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThiZjEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAwMCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxtaW5pXzEwMCIgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjFjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmkueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9yZXMvZHJhd2FibGUvc3RhdF9zeXNfYmF0dGVyeS54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzxsZXZlbC1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMDEiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzEwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjIwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8yMCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSIzMCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfMzAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNDAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzQwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjUwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF81MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI2MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfNjAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iNzAiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsXzcwIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6bWF4TGV2ZWw9IjgwIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF84MCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOm1heExldmVsPSI5MCIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWxfOTAiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDptYXhMZXZlbD0iMTAxIiBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvc3lzYmFyX3NpZ25hbF8xMDAiIC8+Cis8L2xldmVsLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmltaW5pLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9zeXNiYXJfd2lmaW1pbmkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmM5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvc3lzYmFyX3dpZmltaW5pLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogLy9kZXZpY2UvYXBwcy9jb21tb24vcmVzL2RyYXdhYmxlL3N0YXRfc3lzX2JhdHRlcnkueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y2xpcCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6Y2xpcE9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOm1heExldmVsPSIxMDAiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9zeXNiYXJfc2lnbmFsbWluaV8xMDAiIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjM0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyLnhtbApAQCAtMCwwICsxLDE2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPEZyYW1lTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKKyAgICA+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFyX2NvbnRlbnRzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0Lk5vdGlmaWNhdGlvbkljb25BcmVhCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDx2aWV3CisgICAgICAgICAgICAgICAgY2xhc3M9ImNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEkSWNvbkxheW91dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb25zIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9pY29uX3NpemUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPHZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSREcmFnZ2VyVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2hhbmRsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX2hpZGVub3RpZmljYXRpb25faGFuZGxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjhkaXAiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgICAgICBjbGFzcz0iY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5Ob3RpZmljYXRpb25JY29uQXJlYSRNb3JlVmlldyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4cGFuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX29wZW4iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJub3RpZmljYXRpb25JY29uc0NsaWNrZWQiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWE+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RpY2tlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL25vdGlmaWNhdGlvbkljb25zIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9ub3RpZmljYXRpb25JY29ucyIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGlja2VySWNvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlRpY2tlclZpZXcgYW5kcm9pZDppZD0iQCtpZC90aWNrZXJUZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjJkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIj4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQCphbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaWNrZXIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGlja2VyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuVGlja2VyVmlldz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPGluY2x1ZGUgbGF5b3V0PSJAbGF5b3V0L3N0YXR1c19iYXJfY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL21lbnUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQCtpZC9yZWNlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9tZW51IgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvaWNfc3lzYmFyX2ljb25fYmciCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCisgICAgICAgICAgICBzeXN0ZW11aTprZXlDb2RlPSI4MiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JlY2VudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAK2lkL2hvbWUiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9yZWNlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9pY19zeXNiYXJfaWNvbl9iZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0icmVjZW50QnV0dG9uQ2xpY2tlZCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2hvbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQCtpZC9iYWNrIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfaG9tZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iMyIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuS2V5QnV0dG9uVmlldyBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmFjayIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9pY29uX2JnIgorICAgICAgICAgICAgc3lzdGVtdWk6a2V5Q29kZT0iNCIKKyAgICAgICAgICAgIC8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDwhLS0gSXQncyBjdXJ0YWlucyBmb3IgeW91LiAtLT4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlnaHRzX291dCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfbGlnaHRzb3V0IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIKKyAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCisgICAgICAgIC8+Cis8L0ZyYW1lTGF5b3V0PgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2NlbnRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3NDY3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfY2VudGVyLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIENlbnRlciBvZiBzdGF0dXMgYmFyOiBTeXN0ZW0gaW5mbyBkaXNwbGF5LCBzeXN0ZW0gaW5mbyBwYW5lbCB0cmlnZ2VyIC0tPgorPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvc3lzdGVtSW5mbyIKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6c3lzdGVtdWk9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQuc3lzdGVtdWkiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICBhbmRyb2lkOm9uQ2xpY2s9InN5c3RlbUluZm9DbGlja2VkIgorICAgID4KKyAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjJkaXAiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhdHRlcnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9jbG9jayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9taW5pbWV0ZXJfYmciIAorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zaWduYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI2NGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvY2xvY2siCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlckluUGFyZW50PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfbWluaW1ldGVyX2JnIiAKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeV9pY29uIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvYmF0dGVyeSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVySW5QYXJlbnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2JhdHRlcnlfbWluaSIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsX2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvc2lnbmFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfd2lmaV9taW5pIgorICAgICAgICAvPgorPC9SZWxhdGl2ZUxheW91dD4KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0OTJkMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LnhtbApAQCAtMCwwICsxLDM2IEBACis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NXNwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvc3RhdHVzX2Jhcl9pdGVtX2JhY2tncm91bmQiCisgICAgPgorCisgICAgPEltYWdlQnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmV0byIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0byIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIyZGlwIgorICAgICAgICAvPgorCisgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5MYXRlc3RJdGVtVmlldyBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL3ZldG8iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRzcCIKKyAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNnNwIgorICAgICAgICAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxc3AiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgorICAgICAgICAvPgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX25vdGlmaWNhdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODllZWMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXhsYXJnZS9zeXNiYXJfcGFuZWxfbm90aWZpY2F0aW9ucy54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgorPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgID4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NsZWFyX2FsbF9idXR0b24iCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iCisgICAgICAgIC8+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKworICAgIDxTY3JvbGxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uU2Nyb2xsZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICA+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsfGJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YW5pbWF0aW9uQ2FjaGU9ImZhbHNlIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2JhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Zm9jdXNhYmxlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICAgICAgPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1Njcm9sbFZpZXc+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC14bGFyZ2Uvc3lzYmFyX3BhbmVsX3N5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NjlmNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQteGxhcmdlL3N5c2Jhcl9wYW5lbF9zeXN0ZW0ueG1sCkBAIC0wLDAgKzEsMjA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5TeXN0ZW1QYW5lbAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl9wYW5lbF9iZyIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI3MGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTIwZGlwIgorICAgID4KKworICAgIDwhLS0gdG9wIHJvdzogcXVpY2sgc2V0dGluZ3MgYnV0dG9ucyAtLT4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICA+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2JyaWdodG5lc3MiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYnJpZ2h0bmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc291bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX3NvdW5kX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9vcmllbnRhdGlvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfcm90YXRlX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9haXJwbGFuZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYWlycGxhbmVfb24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zeXNiYXJfdG9nZ2xlX2JnX29mZiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2dwcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfZ3BzX29uIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3lzYmFyX3RvZ2dsZV9iZ19vZmYiCisgICAgICAgICAgICAvPgorICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9ibHVldG9vdGgiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfc3lzYmFyX2JsdWV0b290aF9vbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N5c2Jhcl90b2dnbGVfYmdfb2ZmIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwhLS0gbWFpbiByb3c6IG1ldGVycywgY2xvY2sgLS0+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgID4KKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjU2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxOTJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0OGRpcCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9iYXR0ZXJ5X21ldGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlckNyb3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9zeXNiYXJfYmF0dGVyeSIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYmF0dGVyeV9pbmZvIgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlN5c3RlbVBhbmVsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL2JhdHRlcnlfbWV0ZXIiCisgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkNsb2NrCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5TeXN0ZW1QYW5lbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xvY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI1MHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICAvPgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTkyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI0OGRpcCIKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9zaWduYWxfbWV0ZXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI1NmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyQ3JvcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N5c2Jhcl9zaWduYWwiCisgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvc2lnbmFsX2luZm8iCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvc2lnbmFsX21ldGVyIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmF0dGVyeV9vbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfd2lmaV9vbiIKKyAgICAgICAgICAgIC8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDwhLS0gYm90dG9tIHJvdzogdHJhbnNpZW50IGluZGljYXRvcnMsIHNldHRpbmdzIGJ1dHRvbiAtLT4KKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFzcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFyayIKKyAgICAgICAgLz4KKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRpcCIKKyAgICAgICAgPgorICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBhbGFybSAtLT4KKyAgICAgICAgICAgIDwhLS0gVE9ETzogc3luYyAtLT4KKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RhdGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UZXh0QnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjMyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzJkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMXNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9zZXR0aW5nc19idXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkAqYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX3ZlcnRpY2FsX2RhcmsiCisgICAgICAgICAgICAvPgorCisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5TeXN0ZW1QYW5lbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9pbnRydWRlcl9hbGVydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YTc3NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvaW50cnVkZXJfYWxlcnQueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxGcmFtZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOGRpcCIKKyAgICA+CisgICAgICAgIAorICAgIDxMaW5lYXJMYXlvdXQgCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW50cnVkZXJfYWxlcnRfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOmFuaW1hdGlvbkNhY2hlPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvYWxlcnRfYmFyX2JhY2tncm91bmQiCisgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjZW5kYW50Rm9jdXNhYmlsaXR5PSJhZnRlckRlc2NlbmRhbnRzIgorICAgICAgICA+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGVydEljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsZXJ0VGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSW50cnVkZXJBbGVydCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRfYXBwc19hY3Rpdml0eS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY2MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRfYXBwc19hY3Rpdml0eS54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8TGluZWFyTGF5b3V0CisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPCEtLSBUaXRsZSAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjODBGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZWNlbnRfdGFza3NfdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorCisgICAgPCEtLSBUaGlzIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdmlzaWJsZSB3aGVuIGNhcm91c2VsIGlzIGludmlzaWJsZSAtLT4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVjZW50X3Rhc2tzX2VtcHR5IgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKworICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2Fyb3VzZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KKyAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXc+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKaW5kZXggNDIzY2Y1YS4uMmYxYjM2ZTggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhci54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyLnhtbApAQCAtMjEsNiArMjEsNyBAQAogPCEtLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9zdGF0dXNfYmFyX2Nsb3NlZF9kZWZhdWx0X2JhY2tncm91bmQiIC0tPgogPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXJWaWV3CiAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnN5c3RlbXVpPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5hbmRyb2lkLnN5c3RlbXVpIgogICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3N0YXR1c19iYXJfYmFja2dyb3VuZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKQEAgLTU1LDYgKzU2LDggQEAKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgogICAgICAgICAgICAgLz4KICAgICA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKaW5kZXggNjVjNzMxYi4uODhkOTczOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudC54bWwKQEAgLTE2LDggKzE2LDggQEAKIAogICAgIDxWaWV3CiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9kaXZpZGVyX2hvcml6b250YWxfZGFya19vcGFxdWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMXNwIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9icmlnaHQiCiAgICAgICAgIC8+CiAKIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNjFjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9jb2xvcnMueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPGRyYXdhYmxlIG5hbWU9InN0YXR1c19iYXJfYmFja2dyb3VuZCI+IzAwMDAwMDwvZHJhd2FibGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNWQxOGQxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19zdGF0dXNfYmFyX3Bvc2l0aW9uIj4xPC9pbnRlZ2VyPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2Uvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1OWM5MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy0tPgorPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPCEtLSBUaGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiBpbiB0aGUgbm90aWZpY2F0aW9uIHdpbmRvdy1zaGFkZSB0aGF0IGNsZWFycworICAgICAgICAgYWxsIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBub3RpZmljYXRpb25zLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbiI+Q2xlYXIgYWxsPC9zdHJpbmc+CisKKyAgICA8IS0tIFN5c3RlbSBwYW5lbCAoIlF1aWNrIFNldHRpbmdzIikgLS0+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgYmF0dGVyeSBtZXRlci4gU2hvdWxkCisgICAgICAgICBpbmNsdWRlIHRoZSB3b3JkIGZvciAiYmF0dGVyeSIgYW5kIGEgcGxhY2UgZm9yIHRoZSBwZXJjZW50YWdlIGNoYXJnZQorICAgICAgICAgYXZhaWxhYmxlLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfYmF0dGVyeV9tZXRlcl9mb3JtYXQiPgorICAgICAgICBCYXR0ZXJ5OiA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0icGVyY2VudCI+JSU8L3hsaWZmOmc+CisgICAgPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIG5vIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCI+CisgICAgICAgIG5vIGludGVybmV0IGNvbm5lY3Rpb24KKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbm5lY3RlZCwgbmFtZWQgV2ktRmkgbmV0d29yay4KKyAgICAgICAgIFNob3VsZCBpbmNsdWRlIHRoZSB3b3JkIGZvciAiV2ktRmkiIGFuZCBhIHBsYWNlaG9sZGVyIGZvciB0aGUKKyAgICAgICAgIHdpcmVsZXNzIG5ldHdvcmsncyBTU0lELiBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfc3NpZF9mb3JtYXQiPgorICAgICAgICBXaS1GaTogPHhsaWZmOmcgaWQ9InNzaWQiPiVzPC94bGlmZjpnPgorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIFdpLUZpIHN0YXR1cyBhbmQgV2ktRmkgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yaworICAgICAgICAgd2hvc2UgU1NJRCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCI+CisgICAgICAgIFdpLUZpOiBjb25uZWN0ZWQKKyAgICA8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCB0byBkaXNwbGF5IHVuZGVybmVhdGggdGhlIGdyYXBoaWNhbCBzaWduYWwgc3RyZW5ndGggbWV0ZXIgd2hlbgorICAgICAgICAgaXQgaXMgZGlzcGxheWluZyBXaS1GaSBzdGF0dXMgYW5kIFdpLUZpIGlzIGluIHRoZSBwcm9jZXNzIG9mCisgICAgICAgICBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gIFtDSEFSIExJTUlUPTIwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zaWduYWxfbWV0ZXJfd2lmaV9jb25uZWN0aW5nIj4KKyAgICAgICAgV2ktRmk6IGNvbm5lY3RpbmfigKYKKyAgICA8L3N0cmluZz4KKyAKKyAgICA8IS0tIFRleHQgdG8gZGlzcGxheSB1bmRlcm5lYXRoIHRoZSBncmFwaGljYWwgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIHdoZW4KKyAgICAgICAgIGl0IGlzIGRpc3BsYXlpbmcgbW9iaWxlIGRhdGEgKDNHKSBzdGF0dXMgYW5kIGEgbmV0d29yayBjb25uZWN0aW9uIGlzCisgICAgICAgICBhdmFpbGFibGUuCisgICAgICAgICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGVkIj4KKyAgICAgICAgTW9iaWxlIGRhdGE6IGNvbm5lY3RlZAorICAgIDwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IHRvIGRpc3BsYXkgdW5kZXJuZWF0aCB0aGUgZ3JhcGhpY2FsIHNpZ25hbCBzdHJlbmd0aCBtZXRlciB3aGVuCisgICAgICAgICBpdCBpcyBkaXNwbGF5aW5nIG1vYmlsZSBkYXRhICgzRykgc3RhdHVzIGFuZCBhIG5ldHdvcmsgY29ubmVjdGlvbiBpcworICAgICAgICAgdW5hdmFpbGFibGUuCisgICAgICAgICBbQ0hBUiBMSU1JVD0yMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGluZyI+CisgICAgICAgIE1vYmlsZSBkYXRhOiBjb25uZWN0aW5n4oCmCisgICAgPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiY2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IktleUJ1dHRvblZpZXciPgorICAgICAgICA8YXR0ciBuYW1lPSJrZXlDb2RlIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKaW5kZXggOGVhNDZlNS4uYWMwMGM2OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbApAQCAtMjAsNyArMjAsMTYgQEAKIDwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAogICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+CiA8cmVzb3VyY2VzPgotICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUyBkYXRhIGljb24gb24gZGV2aWNlcyAtLT4KKworICAgIDwhLS0gQ29udHJvbCB3aGV0aGVyIHN0YXR1cyBiYXIgc2hvdWxkIGRpc3Rpbmd1aXNoIEhTUEEgZGF0YSBpY29uIGZvcm0gVU1UUworICAgIGRhdGEgaWNvbiBvbiBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19oc3BhX2RhdGFfZGlzdGluZ3Vpc2hhYmxlIj5mYWxzZTwvYm9vbD4KKworICAgIDwhLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICAwIC0gdG9wCisgICAgICAgIDEgLSBib3R0b20KKyAgICAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MDwvaW50ZWdlcj4KKwogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IGJhM2EzZDEuLjAzN2RjNGEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtNTEsNCArNTEsMjAgQEAKICAgICAgICAgIHBvd2VyIHVzYWdlIGFjdGl2aXR5IHRvIGZpbmQgb3V0IHdoYXQgZHJhaW5lZCB0aGUgYmF0dGVyeS4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJiYXR0ZXJ5X2xvd193aHkiPkJhdHRlcnkgdXNlPC9zdHJpbmc+CiAKKyAgICA8IS0tIE5hbWUgb2YgdGhlIGJ1dHRvbiB0aGF0IGxpbmtzIHRvIHRoZSBTZXR0aW5ncyBhcHAuIFtNQVhDSEFSUz1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InN5c3RlbV9wYW5lbF9zZXR0aW5nc19idXR0b24iPlNldHRpbmdzPC9zdHJpbmc+CisKKworICAgIDwhLS0gUmVjZW50IFRhc2tzIGRpYWxvZzogdGl0bGUKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InJlY2VudF90YXNrc190aXRsZSI+UmVjZW50PC9zdHJpbmc+CisgICAgPCEtLSBSZWNlbnQgVGFza3MgZGlhbG9nOiBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIHJlY2VudCBhcHBsaWNhdGlvbnMKKyAgICAgVE9ETzogdGhpcyBzaG91bGQgbW92ZSB0byBTeXN0ZW1VSS5hcGssIGJ1dCB0aGUgY29kZSBmb3IgdGhlIG9sZCAKKyAgICAgICAgICAgIHJlY2VudCBkaWFsb2cgaXMgc3RpbGwgaW4gdGhlIGZyYW1ld29yaworICAgICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InJlY2VudF90YXNrc19lbXB0eSI+Tm8gcmVjZW50IGFwcGxpY2F0aW9ucy48L3N0cmluZz4KKworICAgIAogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggODE2ZjM0YTQuLmY1OTI3MDMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTI1LDQgKzI1LDE4IEBACiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5JbnRydWRlckFsZXJ0IgogICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CiAgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuU3lzdGVtUGFuZWwiCisgICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiM1MEZGRkZGRjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UZXh0QnV0dG9uIgorICAgICAgICBwYXJlbnQ9IkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0JhciI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ub3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jRkZGRkZGRkY8L2l0ZW0+CisgICAgPC9zdHlsZT4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzhkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsVmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFJTLkNhcm91c2VsQ2FsbGJhY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK3B1YmxpYyBjbGFzcyBSZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBUkRfU0xPVFMgPSA1NjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklTSUJMRV9TTE9UUyA9IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9UQVNLUyA9IFZJU0lCTEVfU0xPVFMgKiAyOworICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BY3Rpdml0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFJ1bm5pbmdUYXNrSW5mbz4gbVJ1bm5pbmdUYXNrTGlzdDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVBvcnRyYWl0TW9kZSA9IHRydWU7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aXZpdHlEZXNjcmlwdGlvbj4gbUFjdGl2aXR5RGVzY3JpcHRpb25zCisgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlEZXNjcmlwdGlvbj4oKTsKKyAgICBwcml2YXRlIENhcm91c2VsVmlldyBtQ2Fyb3VzZWxWaWV3OworICAgIHByaXZhdGUgVmlldyBtTm9SZWNlbnRzVmlldzsKKyAgICBwcml2YXRlIEJpdG1hcCBtQmxhbmtCaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKAorICAgICAgICAgICAgbmV3IGludFtdIHsweGZmODA4MDgwLCAweGZmZmZmZmZmLCAweGZmODA4MDgwLCAweGZmZmZmZmZmfSwgMiwgMiwgQ29uZmlnLlJHQl81NjUpOworCisgICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb24geworICAgICAgICBpbnQgaWQ7CisgICAgICAgIEJpdG1hcCB0aHVtYm5haWw7IC8vIGdlbmVyYXRlZCBieSBBY3Rpdml0eS5vbkNyZWF0ZVRodW1ibmFpbCgpCisgICAgICAgIERyYXdhYmxlIGljb247IC8vIGFwcGxpY2F0aW9uIHBhY2thZ2UgaWNvbgorICAgICAgICBTdHJpbmcgbGFiZWw7IC8vIGFwcGxpY2F0aW9uIHBhY2thZ2UgbGFiZWwKKyAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uOyAvLyBnZW5lcmF0ZWQgYnkgQWN0aXZpdHkub25DcmVhdGVEZXNjcmlwdGlvbigpCisgICAgICAgIEludGVudCBpbnRlbnQ7IC8vIGxhdW5jaCBpbnRlbnQgZm9yIGFwcGxpY2F0aW9uCisgICAgICAgIE1hdHJpeCBtYXRyaXg7IC8vIGFyYml0cmFyeSByb3RhdGlvbiBtYXRyaXggdG8gY29ycmVjdCBvcmllbnRhdGlvbgorICAgICAgICBpbnQgcG9zaXRpb247IC8vIHBvc2l0aW9uIGluIGxpc3QKKworICAgICAgICBwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbihCaXRtYXAgX3RodW1ibmFpbCwKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBfaWNvbiwgU3RyaW5nIF9sYWJlbCwgU3RyaW5nIF9kZXNjLCBpbnQgX2lkLCBpbnQgX3BvcykKKyAgICAgICAgeworICAgICAgICAgICAgdGh1bWJuYWlsID0gX3RodW1ibmFpbDsKKyAgICAgICAgICAgIGljb24gPSBfaWNvbjsKKyAgICAgICAgICAgIGxhYmVsID0gX2xhYmVsOworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfZGVzYzsKKyAgICAgICAgICAgIGlkID0gX2lkOworICAgICAgICAgICAgcG9zaXRpb24gPSBfcG9zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBpY29uID0gbnVsbDsKKyAgICAgICAgICAgIHRodW1ibmFpbCA9IG51bGw7CisgICAgICAgICAgICBsYWJlbCA9IG51bGw7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgICAgICBpbnRlbnQgPSBudWxsOworICAgICAgICAgICAgbWF0cml4ID0gbnVsbDsKKyAgICAgICAgICAgIGlkID0gLTE7CisgICAgICAgICAgICBwb3NpdGlvbiA9IC0xOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQWN0aXZpdHlEZXNjcmlwdGlvbiBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihpbnQgaWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uaWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBmaW5hbCBDYXJvdXNlbENhbGxiYWNrIG1DYXJvdXNlbENhbGxiYWNrID0gbmV3IENhcm91c2VsQ2FsbGJhY2soKSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25GaW5pc2hlZCgpIHsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydGVkKCkgeworCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcmRTZWxlY3RlZChpbnQgbikgeworICAgICAgICAgICAgaWYgKG4gPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChuKTsKKyAgICAgICAgICAgICAgICAvLyBwcmVwYXJlIGEgbGF1bmNoIGludGVudCBhbmQgc2VuZCBpdAorICAgICAgICAgICAgICAgIGlmIChpdGVtLmludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX0xBVU5DSEVEX0ZST01fSElTVE9SWSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTdGFydGluZyBpbnRlbnQgIiArIGl0ZW0uaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaXRlbS5pbnRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9vdmVycmlkZVBlbmRpbmdUcmFuc2l0aW9uKFIuYW5pbS56b29tX2VudGVyLCBSLmFuaW0uem9vbV9leGl0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudygiUmVjZW50IiwgIlVuYWJsZSB0byBsYXVuY2ggcmVjZW50IHRhc2siLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkludmFsaWRhdGVUZXh0dXJlKGludCBuKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdEdlb21ldHJ5KGludCBuKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSW52YWxpZGF0ZUdlb21ldHJ5KGludCBuKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVxdWVzdFRleHR1cmUoZmluYWwgaW50IG4pIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIm9uUmVxdWVzdFRleHR1cmUoIiArIG4gKyAiKSIpOworICAgICAgICAgICAgaWYgKG4gPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbUNhcm91c2VsVmlldy5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJGT1VORCBBQ1RJVklUWSBUSFVNQk5BSUwgIiArIGluZm8udGh1bWJuYWlsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gaW5mby50aHVtYm5haWwgPT0gbnVsbCA/IG1CbGFua0JpdG1hcCA6IGluZm8udGh1bWJuYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VGV4dHVyZUZvckl0ZW0obiwgYml0bWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiRkFJTEVEIFRPIEdFVCBBQ1RJVklUWSBUSFVNQk5BSUwgRk9SIElURU0gIiArIG4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBJVGh1bWJuYWlsUmVjZWl2ZXIgbVRodW1ibmFpbFJlY2VpdmVyID0gbmV3IElUaHVtYm5haWxSZWNlaXZlci5TdHViKCkgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5ld1RodW1ibmFpbChmaW5hbCBpbnQgaWQsIGZpbmFsIEJpdG1hcCBiaXRtYXAsIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCB3ID0gYml0bWFwLmdldFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgaCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIk5ldyB0aHVtYm5haWwgZm9yIGlkPSIgKyBpZCArICIsIGRpbWVuc2lvbnM9IiArIHcgKyAieCIgKyBoCisgICAgICAgICAgICAgICAgICAgICsgIiBkZXNjcmlwdGlvbiAnIiArIGRlc2NyaXB0aW9uICsgIiciKTsKKyAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaW5mbyA9IGZpbmRBY3Rpdml0eURlc2NyaXB0aW9uKGlkKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmZvLnRodW1ibmFpbCA9IGJpdG1hcDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGh1bWJXaWR0aCA9IGJpdG1hcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aHVtYkhlaWdodCA9IGJpdG1hcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA+IHRodW1iSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPCB0aHVtYkhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4LnNldFJvdGF0ZSg5MC4wZiwgKGZsb2F0KSB0aHVtYldpZHRoIC8gMiwgKGZsb2F0KSB0aHVtYkhlaWdodCAvIDIpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1hdHJpeCA9IG1hdHJpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1hdHJpeCA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VGV4dHVyZUZvckl0ZW0oaW5mby5wb3NpdGlvbiwgaW5mby50aHVtYm5haWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDYW4ndCBmaW5kIHZpZXcgZm9yIGlkICIgKyBpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgZmluYWwgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKworICAgICAgICBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoMHg4MDAwMDAwMCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJlY2VudF9hcHBzX2FjdGl2aXR5KTsKKyAgICAgICAgbUNhcm91c2VsVmlldyA9IChDYXJvdXNlbFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuY2Fyb3VzZWwpOworICAgICAgICBtTm9SZWNlbnRzVmlldyA9IChWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSk7CisgICAgICAgIC8vbUNhcm91c2VsVmlldyA9IG5ldyBDYXJvdXNlbFZpZXcodGhpcyk7CisgICAgICAgIC8vc2V0Q29udGVudFZpZXcobUNhcm91c2VsVmlldyk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0U2xvdENvdW50KENBUkRfU0xPVFMpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFZpc2libGVTbG90cyhWSVNJQkxFX1NMT1RTKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcygxKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXRTdGFydEFuZ2xlKChmbG9hdCkgLSgyLjBmKk1hdGguUEkgKiA1IC8gQ0FSRF9TTE9UUykpOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldERlZmF1bHRCaXRtYXAobUJsYW5rQml0bWFwKTsKKyAgICAgICAgbUNhcm91c2VsVmlldy5zZXRMb2FkaW5nQml0bWFwKG1CbGFua0JpdG1hcCk7CisgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0Q2FsbGJhY2sobUNhcm91c2VsQ2FsbGJhY2spOworICAgICAgICBtQ2Fyb3VzZWxWaWV3LmdldEhvbGRlcigpLnNldEZvcm1hdChQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisKKyAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IChBY3Rpdml0eU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgbVBvcnRyYWl0TW9kZSA9IGRlY29yVmlldy5nZXRIZWlnaHQoKSA+IGRlY29yVmlldy5nZXRXaWR0aCgpOworCisgICAgICAgIHJlZnJlc2goKTsKKworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgbVBvcnRyYWl0TW9kZSA9IG5ld0NvbmZpZy5vcmllbnRhdGlvbiA9PSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX1BPUlRSQUlUOworICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJDT05GSUcgQ0hBTkdFLCBtUG9ydHJhaXRNb2RlID0gIiArIG1Qb3J0cmFpdE1vZGUpOworICAgICAgICByZWZyZXNoKCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVSdW5uaW5nVGFza3MoKSB7CisgICAgICAgIG1SdW5uaW5nVGFza0xpc3QgPSBtQWN0aXZpdHlNYW5hZ2VyLmdldFJ1bm5pbmdUYXNrcyhNQVhfVEFTS1MsIDAsIG1UaHVtYm5haWxSZWNlaXZlcik7CisgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlBvcnRyYWl0OiAiICsgbVBvcnRyYWl0TW9kZSk7CisgICAgICAgIGZvciAoUnVubmluZ1Rhc2tJbmZvIHIgOiBtUnVubmluZ1Rhc2tMaXN0KSB7CisgICAgICAgICAgICBpZiAoci50aHVtYm5haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCB0aHVtYldpZHRoID0gci50aHVtYm5haWwuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICBpbnQgdGh1bWJIZWlnaHQgPSByLnRodW1ibmFpbC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJHb3QgdGh1bWJuYWlsICIgKyB0aHVtYldpZHRoICsgIngiICsgdGh1bWJIZWlnaHQpOworICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gZGVzYyA9IGZpbmRBY3Rpdml0eURlc2NyaXB0aW9uKHIuaWQpOworICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYy50aHVtYm5haWwgPSByLnRodW1ibmFpbDsKKyAgICAgICAgICAgICAgICAgICAgZGVzYy5sYWJlbCA9IHIudG9wQWN0aXZpdHkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPiB0aHVtYkhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5zZXRSb3RhdGUoOTAuMGYsIChmbG9hdCkgdGh1bWJXaWR0aCAvIDIsIChmbG9hdCkgdGh1bWJIZWlnaHQgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MubWF0cml4ID0gbWF0cml4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ291bGRuJ3QgZmluZCBBY3Rpdml0eURlc2MgZm9yIGlkPSIgKyByLmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIioqKiBSVU5OSU5HIFRIVU1CTkFJTCBXQVMgTlVMTCAqKioiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2Fyb3VzZWxWaWV3LmNyZWF0ZUNhcmRzKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZWNlbnRUYXNrcygpIHsKKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8+IHJlY2VudFRhc2tzID0KKyAgICAgICAgICAgICAgICBhbS5nZXRSZWNlbnRUYXNrcyhNQVhfVEFTS1MsIEFjdGl2aXR5TWFuYWdlci5SRUNFTlRfSUdOT1JFX1VOQVZBSUxBQkxFKTsKKworICAgICAgICBBY3Rpdml0eUluZm8gaG9tZUluZm8gPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTikuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0hPTUUpCisgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlQWN0aXZpdHlJbmZvKHBtLCAwKTsKKworICAgICAgICAvLyBJY29uVXRpbGl0aWVzIGljb25VdGlsaXRpZXMgPSBuZXcgSWNvblV0aWxpdGllcyh0aGlzKTsgLy8gRklYTUUKKworICAgICAgICBpbnQgbnVtVGFza3MgPSByZWNlbnRUYXNrcy5zaXplKCk7CisgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBpID0gMCwgaW5kZXggPSAwOyBpIDwgbnVtVGFza3MgJiYgKGluZGV4IDwgTUFYX1RBU0tTKTsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIuUmVjZW50VGFza0luZm8gcmVjZW50SW5mbyA9IHJlY2VudFRhc2tzLmdldChpKTsKKworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQocmVjZW50SW5mby5iYXNlSW50ZW50KTsKKyAgICAgICAgICAgIGlmIChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChyZWNlbnRJbmZvLm9yaWdBY3Rpdml0eSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgaG9tZSBhY3Rpdml0eS4KKyAgICAgICAgICAgIGlmIChob21lSW5mbyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGhvbWVJbmZvLnBhY2thZ2VOYW1lLmVxdWFscyhpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0UGFja2FnZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgaG9tZUluZm8ubmFtZS5lcXVhbHMoaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoKGludGVudC5nZXRGbGFncygpJn5JbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCkKKyAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHBtLnJlc29sdmVBY3Rpdml0eShpbnRlbnQsIDApOworICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eUluZm8gaW5mbyA9IHJlc29sdmVJbmZvLmFjdGl2aXR5SW5mbzsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGUgPSBpbmZvLmxvYWRMYWJlbChwbSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBpY29uID0gaW5mby5sb2FkSWNvbihwbSk7CisKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSByZWNlbnRUYXNrcy5nZXQoaSkuaWQ7CisgICAgICAgICAgICAgICAgaWYgKGlkICE9IC0xICYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwICYmIGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpY29uID0gbnVsbDsgRklYTUU6IGljb25VdGlsaXRpZXMuY3JlYXRlSWNvbkRyYXdhYmxlKGljb24pOworICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGl0ZW0gPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBpY29uLCB0aXRsZSwgbnVsbCwgaWQsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQgPSBpbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eURlc2NyaXB0aW9ucy5hZGQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkFkZGVkIGl0ZW1bIiArIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSwgaWQ9IiArIGl0ZW0uaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHRpdGxlPSIgKyBpdGVtLmxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJTS0lQUElORyBpdGVtICIgKyBpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIHVwZGF0ZVJlY2VudFRhc2tzKCk7CisgICAgICAgIHVwZGF0ZVJ1bm5pbmdUYXNrcygpOworICAgICAgICBpZiAobUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBzaG93ICJObyBSZWNlbnQgVGFrc3MiCisgICAgICAgICAgICBtTm9SZWNlbnRzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcyhtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGVjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldyBleHRlbmRzIENhcm91c2VsVmlldyB7CisKKyAgICBwdWJsaWMgUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBSZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgIH0KKworICAgIHB1YmxpYyBJbmZvIGdldFJlbmRlclNjcmlwdEluZm8oKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5mbyhSLnJhdy5jYXJvdXNlbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQppbmRleCBmNDVjYWY1MS4uMGY2NzIzZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9DbG9zZURyYWdIYW5kbGUuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0Nsb3NlRHJhZ0hhbmRsZS5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiAKIAogcHVibGljIGNsYXNzIENsb3NlRHJhZ0hhbmRsZSBleHRlbmRzIExpbmVhckxheW91dCB7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAKICAgICBwdWJsaWMgQ2xvc2VEcmFnSGFuZGxlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCmluZGV4IGY5MzQ3YjEuLjNlZjEyZjkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogY29hbGVzY2luZyB0aGVzZSBjYWxscyBzbyB0aGV5IGRvbid0IHN0YWNrIHVwLiAgRm9yIHRoZSBjYWxscwogICogYXJlIGNvYWxlc2NlZCwgbm90ZSB0aGF0IHRoZXkgYXJlIGFsbCBpZGVtcG90ZW50LgogICovCi1jbGFzcyBDb21tYW5kUXVldWUgZXh0ZW5kcyBJU3RhdHVzQmFyLlN0dWIgeworcHVibGljIGNsYXNzIENvbW1hbmRRdWV1ZSBleHRlbmRzIElTdGF0dXNCYXIuU3R1YiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0dXNCYXIuQ29tbWFuZFF1ZXVlIjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTUFTSyA9IDB4ZmZmZjAwMDA7CkBAIC01Miw2ICs1Miw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QX0VYUEFORCA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9QX0NPTExBUFNFID0gMjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX0xJR0hUU19PTiA9IDB4MDAwNzAwMDA7CisKICAgICBwcml2YXRlIFN0YXR1c0Jhckljb25MaXN0IG1MaXN0OwogICAgIHByaXZhdGUgQ2FsbGJhY2tzIG1DYWxsYmFja3M7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEgoKTsKQEAgLTc1LDYgKzc3LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpOwogICAgICAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCk7CiAgICAgICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ29tbWFuZFF1ZXVlKENhbGxiYWNrcyBjYWxsYmFja3MsIFN0YXR1c0Jhckljb25MaXN0IGxpc3QpIHsKQEAgLTE0Myw2ICsxNDYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldExpZ2h0c09uKGJvb2xlYW4gb24pIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdCkgeworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NFVF9MSUdIVFNfT04pOworICAgICAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfU0VUX0xJR0hUU19PTiwgb24gPyAxIDogMCwgMCwgbnVsbCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdCAmIE1TR19NQVNLOwpAQCAtMTk0LDYgKzIwNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5hbmltYXRlQ29sbGFwc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfTElHSFRTX09OOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLnNldExpZ2h0c09uKG1zZy5hcmcxICE9IDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0V4cGFuZGVkVmlldy5qYXZhCmluZGV4IDNkODVmMjcuLmEyZDRiOTUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvRXhwYW5kZWRWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9FeHBhbmRlZFZpZXcuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogCiAKIHB1YmxpYyBjbGFzcyBFeHBhbmRlZFZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGludCBtUHJldkhlaWdodCA9IC0xOwogCiAgICAgcHVibGljIEV4cGFuZGVkVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewpAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgIC8vU2xvZy5kKFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiaGVpZ2h0IGNoYW5nZWQgb2xkPSIgKyBtUHJldkhlaWdodAogICAgICAgICAgICAgIC8vICAgICArICIgbmV3PSIgKyBoZWlnaHQpOwogICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLkVYUEFOREVEX0xFQVZFX0FMT05FKTsKICAgICAgICAgIH0KICAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0tleUJ1dHRvblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDFjNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9LZXlCdXR0b25WaWV3LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkhhcHRpY0ZlZWRiYWNrQ29uc3RhbnRzOworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXREZXZpY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0NvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzLlJlbW90ZVZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgS2V5QnV0dG9uVmlldyBleHRlbmRzIEltYWdlVmlldyB7CisgICAgSVdpbmRvd01hbmFnZXIgbVdpbmRvd01hbmFnZXI7CisgICAgbG9uZyBtRG93blRpbWU7CisgICAgYm9vbGVhbiBtU2VuZGluZywgbUxvbmdQcmVzc2VkOworICAgIGludCBtQ29kZTsKKyAgICBpbnQgbVJlcGVhdDsKKyAgICBSdW5uYWJsZSBtQ2hlY2tMb25nUHJlc3MgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIFNsb2cuZCgiS2V5QnV0dG9uVmlldyIsICJsb25ncHJlc3MiKTsKKyAgICAgICAgICAgIGlmIChpc1ByZXNzZWQoKSkgeworICAgICAgICAgICAgICAgIG1Mb25nUHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbVJlcGVhdCsrOworICAgICAgICAgICAgICAgIHNlbmRFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZCisgICAgICAgICAgICAgICAgICAgICAgICB8IEtleUV2ZW50LkZMQUdfTE9OR19QUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIEtleUJ1dHRvblZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3LAorICAgICAgICAgICAgICAgIGRlZlN0eWxlLCAwKTsKKworICAgICAgICBtQ29kZSA9IGEuZ2V0SW50ZWdlcihSLnN0eWxlYWJsZS5LZXlCdXR0b25WaWV3X2tleUNvZGUsIDApOworICAgICAgICBpZiAobUNvZGUgPT0gMCkgeworICAgICAgICAgICAgU2xvZy53KFN0YXR1c0JhclNlcnZpY2UuVEFHLCAiS2V5QnV0dG9uVmlldyB3aXRob3V0IGtleSBjb2RlIGlkPTB4IgorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoZ2V0SWQoKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBtV2luZG93TWFuYWdlciA9IElXaW5kb3dNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBldi5nZXRBY3Rpb24oKTsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgLy9TbG9nLmQoIktleUJ1dHRvblZpZXciLCAicHJlc3MiKTsKKyAgICAgICAgICAgICAgICBtRG93blRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBtUmVwZWF0ID0gMDsKKyAgICAgICAgICAgICAgICBtU2VuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxvbmdQcmVzc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2VuZEV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuRkxBR19GUk9NX1NZU1RFTSB8IEtleUV2ZW50LkZMQUdfVklSVFVBTF9IQVJEX0tFWSwgbURvd25UaW1lKTsKKyAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKHRydWUpOworICAgICAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtQ2hlY2tMb25nUHJlc3MpOworICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG1DaGVja0xvbmdQcmVzcywgVmlld0NvbmZpZ3VyYXRpb24uZ2V0TG9uZ1ByZXNzVGltZW91dCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgaWYgKG1TZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAoaW50KWV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IChpbnQpZXYuZ2V0WSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBnZXRXaWR0aCgpIHx8IHkgPCAwIHx8IHkgPj0gZ2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlFdmVudC5GTEFHX0ZST01fU1lTVEVNIHwgS2V5RXZlbnQuRkxBR19WSVJUVUFMX0hBUkRfS0VZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlFdmVudC5GTEFHX0NBTkNFTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXNzZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1DaGVja0xvbmdQcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBzZXRQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAobVNlbmRpbmcgJiYgIW1Mb25nUHJlc3NlZCkgeworICAgICAgICAgICAgICAgICAgICBtU2VuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoS2V5RXZlbnQuQUNUSU9OX1VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUV2ZW50LkZMQUdfRlJPTV9TWVNURU0gfCBLZXlFdmVudC5GTEFHX1ZJUlRVQUxfSEFSRF9LRVkpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3MobUNoZWNrTG9uZ1ByZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc2VuZEV2ZW50KGFjdGlvbiwgZmxhZ3MsIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQgYWN0aW9uLCBpbnQgZmxhZ3MsIGxvbmcgd2hlbikgeworICAgICAgICBmaW5hbCBLZXlFdmVudCBldiA9IG5ldyBLZXlFdmVudChtRG93blRpbWUsIHdoZW4sIGFjdGlvbiwgbUNvZGUsIG1SZXBlYXQsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgZmxhZ3MsIElucHV0RGV2aWNlLlNPVVJDRV9LRVlCT0FSRCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL1Nsb2cuZChTdGF0dXNCYXJTZXJ2aWNlLlRBRywgImluamVjdGluZyBldmVudCAiICsgZXYpOworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuaW5qZWN0SW5wdXRFdmVudE5vV2FpdChldik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gU3lzdGVtIHByb2Nlc3MgaXMgZGVhZAorICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvTm90aWZpY2F0aW9uRGF0YS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKaW5kZXggN2E4MjI2Ny4uNDVhYmU5MyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Ob3RpZmljYXRpb25EYXRhLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJOb3RpZmljYXRpb247CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTM1LDI2ICszNiw0NyBAQAogICAgICAgICBwdWJsaWMgVmlldyByb3c7IC8vIHRoZSBvdXRlciBleHBhbmRlZCB2aWV3CiAgICAgICAgIHB1YmxpYyBWaWV3IGNvbnRlbnQ7IC8vIHRha2VzIHRoZSBjbGljayBldmVudHMgYW5kIHNlbmRzIHRoZSBQZW5kaW5nSW50ZW50CiAgICAgICAgIHB1YmxpYyBWaWV3IGV4cGFuZGVkOyAvLyB0aGUgaW5mbGF0ZWQgUmVtb3RlVmlld3MKKyAgICAgICAgcHVibGljIEVudHJ5KCkge30KKyAgICAgICAgcHVibGljIEVudHJ5KElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RhdHVzQmFySWNvblZpZXcgaWMpIHsKKyAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBuOworICAgICAgICAgICAgdGhpcy5pY29uID0gaWM7CisgICAgICAgIH0KICAgICB9CiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RW50cnk+IG1FbnRyaWVzID0gbmV3IEFycmF5TGlzdDxFbnRyeT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RW50cnk+IG1FbnRyeUNtcCA9IG5ldyBDb21wYXJhdG9yPEVudHJ5PigpIHsKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKEVudHJ5IGEsIEVudHJ5IGIpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KShhLm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiAtIGIubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuKTsKKyAgICAgICAgfQorICAgIH07CiAKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtRW50cmllcy5zaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIEVudHJ5IGdldEVudHJ5QXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBtRW50cmllcy5nZXQoaW5kZXgpOworICAgIHB1YmxpYyBFbnRyeSBnZXQoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuIG1FbnRyaWVzLmdldChpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGZpbmRFbnRyeShJQmluZGVyIGtleSkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkua2V5ID09IGtleSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgIHB1YmxpYyBFbnRyeSBmaW5kQnlLZXkoSUJpbmRlciBrZXkpIHsKKyAgICAgICAgZm9yIChFbnRyeSBlIDogbUVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlLmtleSA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYWRkKEVudHJ5IGVudHJ5KSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICAgICAgZm9yIChpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBpZiAobUVudHJ5Q21wLmNvbXBhcmUobUVudHJpZXMuZ2V0KGkpLCBlbnRyeSkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVudHJpZXMuYWRkKGksIGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIGk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBhZGQoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXcgcm93LCBWaWV3IGNvbnRlbnQsCkBAIC02Niw0MiArODgsMjMgQEAKICAgICAgICAgZW50cnkuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgIGVudHJ5LmV4cGFuZGVkID0gZXhwYW5kZWQ7CiAgICAgICAgIGVudHJ5Lmljb24gPSBpY29uOwotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjaG9vc2VJbmRleChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4pOwotICAgICAgICBtRW50cmllcy5hZGQoaW5kZXgsIGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICByZXR1cm4gYWRkKGVudHJ5KTsKICAgICB9CiAKICAgICBwdWJsaWMgRW50cnkgcmVtb3ZlKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgbUVudHJpZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgRW50cnkgZSA9IGZpbmRCeUtleShrZXkpOworICAgICAgICBpZiAoZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtRW50cmllcy5yZW1vdmUoZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY2hvb3NlSW5kZXgoZmluYWwgbG9uZyB3aGVuKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPiB3aGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE47CisgICAgICAgIHJldHVybiBlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdmlzaWJsZSBpdGVtcyAoaS5lLiBpdGVtcyB3aXRob3V0IGFuIGVycm9yKS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNWaXNpYmxlSXRlbXMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBOID0gbUVudHJpZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG1FbnRyaWVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5leHBhbmRlZCAhPSBudWxsKSB7IC8vIHRoZSB2aWV3IHN1Y2Nlc3NmdWxseSBpbmZsYXRlZAorICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTEyLDExICsxMTUsOSBAQAogICAgICAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgY2xlYXJhYmxlIGl0ZW1zICh0aGF0IGFyZW4ndCBlcnJvcnMpLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc0NsZWFyYWJsZUl0ZW1zKCkgewotICAgICAgICBmaW5hbCBpbnQgTiA9IG1FbnRyaWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSBtRW50cmllcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZmxhZ3MgJiBOb3RpZmljYXRpb24uRkxBR19OT19DTEVBUikgPT0gMCkgeworICAgICAgICBmb3IgKEVudHJ5IGUgOiBtRW50cmllcykgeworICAgICAgICAgICAgaWYgKGUuZXhwYW5kZWQgIT0gbnVsbCkgeyAvLyB0aGUgdmlldyBzdWNjZXNzZnVsbHkgaW5mbGF0ZWQKKyAgICAgICAgICAgICAgICBpZiAoKGUubm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mbGFncyAmIE5vdGlmaWNhdGlvbi5GTEFHX05PX0NMRUFSKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDU5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1Bob25lU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTU2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlN0YXR1c0JhclBvbGljeTsKKworCisKK3B1YmxpYyBjbGFzcyBQaG9uZVN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTdGF0dXNCYXJTZXJ2aWNlIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJQaG9uZVN0YXR1c0JhclNlcnZpY2UiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQRVcgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFUVVNCQVJfU1RBUlQKKyAgICAgICAgICAgID0gImNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5zdGF0dXNiYXIuU1RBUlQiOworCisgICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9MRUFWRV9BTE9ORSA9IC0xMDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVYUEFOREVEX0ZVTExfT1BFTiA9IC0xMDAwMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURSA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFX1JFVkVBTCA9IDEwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TSE9XX0lOVFJVREVSID0gMTAwMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0hJREVfSU5UUlVERVIgPSAxMDAzOworCisgICAgLy8gd2lsbCBsaWtlbHkgbW92ZSB0byBhIHJlc291cmNlIG9yIG90aGVyIHR1bmFibGUgcGFyYW0gYXQgc29tZSBwb2ludAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRSVURFUl9BTEVSVF9ERUNBWV9NUyA9IDEwMDAwOworCisgICAgU3RhdHVzQmFyUG9saWN5IG1JY29uUG9saWN5OworCisgICAgaW50IG1JY29uU2l6ZTsKKyAgICBEaXNwbGF5IG1EaXNwbGF5OworCisgICAgU3RhdHVzQmFyVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBpbnQgbVBpeGVsRm9ybWF0OworICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOworICAgIE9iamVjdCBtUXVldWVMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gaWNvbnMKKyAgICBMaW5lYXJMYXlvdXQgbUljb25zOworICAgIEljb25NZXJnZXIgbU5vdGlmaWNhdGlvbkljb25zOworICAgIExpbmVhckxheW91dCBtU3RhdHVzSWNvbnM7CisKKyAgICAvLyBleHBhbmRlZCBub3RpZmljYXRpb25zCisgICAgRGlhbG9nIG1FeHBhbmRlZERpYWxvZzsKKyAgICBFeHBhbmRlZFZpZXcgbUV4cGFuZGVkVmlldzsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtRXhwYW5kZWRQYXJhbXM7CisgICAgU2Nyb2xsVmlldyBtU2Nyb2xsVmlldzsKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ7CisgICAgVmlldyBtRXhwYW5kZWRDb250ZW50czsKKyAgICAvLyB0b3AgYmFyCisgICAgVGV4dFZpZXcgbU5vTm90aWZpY2F0aW9uc1RpdGxlOworICAgIFRleHRWaWV3IG1DbGVhckJ1dHRvbjsKKyAgICAvLyBkcmFnIGJhcgorICAgIENsb3NlRHJhZ0hhbmRsZSBtQ2xvc2VWaWV3OworICAgIC8vIG9uZ29pbmcKKyAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKKyAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOworICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOworICAgIC8vIGxhdGVzdAorICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOworICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7CisgICAgLy8gcG9zaXRpb24KKyAgICBpbnRbXSBtUG9zaXRpb25UbXAgPSBuZXcgaW50WzJdOworICAgIGJvb2xlYW4gbUV4cGFuZGVkOworICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKKworICAgIC8vIHRoZSBkYXRlIHZpZXcKKyAgICBEYXRlVmlldyBtRGF0ZVZpZXc7CisKKyAgICAvLyBmb3IgaW1tZXJzaXZlIGFjdGl2aXRpZXMKKyAgICBwcml2YXRlIFZpZXcgbUludHJ1ZGVyQWxlcnRWaWV3OworCisgICAgLy8gdGhlIHRyYWNrZXIgdmlldworICAgIFRyYWNraW5nVmlldyBtVHJhY2tpbmdWaWV3OworICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1UcmFja2luZ1BhcmFtczsKKyAgICBpbnQgbVRyYWNraW5nUG9zaXRpb247IC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSB0cmFja2luZyB2aWV3LgorICAgIHByaXZhdGUgYm9vbGVhbiBtUGFuZWxTbGlnaHRseVZpc2libGU7CisKKyAgICAvLyB0aWNrZXIKKyAgICBwcml2YXRlIFRpY2tlciBtVGlja2VyOworICAgIHByaXZhdGUgVmlldyBtVGlja2VyVmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVRpY2tpbmc7CisKKyAgICAvLyBUcmFja2luZyBmaW5nZXIgZm9yIG9wZW5pbmcvY2xvc2luZy4KKyAgICBpbnQgbUVkZ2VCb3JkZXI7IC8vIGNvcnJlc3BvbmRzIHRvIFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZQorICAgIGJvb2xlYW4gbVRyYWNraW5nOworICAgIFZlbG9jaXR5VHJhY2tlciBtVmVsb2NpdHlUcmFja2VyOworCisgICAgc3RhdGljIGZpbmFsIGludCBBTklNX0ZSQU1FX0RVUkFUSU9OID0gKDEwMDAvNjApOworCisgICAgYm9vbGVhbiBtQW5pbWF0aW5nOworICAgIGxvbmcgbUN1ckFuaW1hdGlvblRpbWU7CisgICAgZmxvYXQgbURpc3BsYXlIZWlnaHQ7CisgICAgZmxvYXQgbUFuaW1ZOworICAgIGZsb2F0IG1BbmltVmVsOworICAgIGZsb2F0IG1BbmltQWNjZWw7CisgICAgbG9uZyBtQW5pbUxhc3RUaW1lOworICAgIGJvb2xlYW4gbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgIGludCBtVmlld0RlbHRhOworICAgIGludFtdIG1BYnNQb3MgPSBuZXcgaW50WzJdOworCisgICAgLy8gZm9yIGRpc2FibGluZyB0aGUgc3RhdHVzIGJhcgorICAgIGludCBtRGlzYWJsZWQgPSAwOworCisgICAgcHJpdmF0ZSBjbGFzcyBFeHBhbmRlZERpYWxvZyBleHRlbmRzIERpYWxvZyB7CisgICAgICAgIEV4cGFuZGVkRGlhbG9nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5UaGVtZV9MaWdodF9Ob1RpdGxlQmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBib29sZWFuIGRvd24gPSBldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTjsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0S2V5Q29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKKyAgICAgICAgICAgICAgICBpZiAoIWRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIG1EaXNwbGF5ID0gKChXaW5kb3dNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpLmdldERlZmF1bHREaXNwbGF5KCk7CisKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsKKworICAgICAgICBhZGRJbnRydWRlclZpZXcoKTsKKworICAgICAgICAvLyBMYXN0bHksIGNhbGwgdG8gdGhlIGljb24gcG9saWN5IHRvIGluc3RhbGwvdXBkYXRlIGFsbCB0aGUgaWNvbnMuCisgICAgICAgIG1JY29uUG9saWN5ID0gbmV3IFN0YXR1c0JhclBvbGljeSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIHdlJ3JlIG5ldmVyIGRlc3Ryb3llZAorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gQ29uc3RydWN0aW5nIHRoZSB2aWV3CisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gdGhpczsKKworICAgICAgICBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9pY29uX3NpemUpOworCisgICAgICAgIEV4cGFuZGVkVmlldyBleHBhbmRlZCA9IChFeHBhbmRlZFZpZXcpVmlldy5pbmZsYXRlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuc3RhdHVzX2Jhcl9leHBhbmRlZCwgbnVsbCk7CisgICAgICAgIGV4cGFuZGVkLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcgPSBWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuaW50cnVkZXJfYWxlcnQsIG51bGwpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBtSW50cnVkZXJBbGVydFZpZXcuc2V0Q2xpY2thYmxlKHRydWUpOworCisgICAgICAgIFN0YXR1c0JhclZpZXcgc2IgPSAoU3RhdHVzQmFyVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2JhciwgbnVsbCk7CisgICAgICAgIHNiLm1TZXJ2aWNlID0gdGhpczsKKworICAgICAgICAvLyBmaWd1cmUgb3V0IHdoaWNoIHBpeGVsLWZvcm1hdCB0byB1c2UgZm9yIHRoZSBzdGF0dXMgYmFyLgorICAgICAgICBtUGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKKyAgICAgICAgRHJhd2FibGUgYmcgPSBzYi5nZXRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGlmIChiZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBtU3RhdHVzQmFyVmlldyA9IHNiOworICAgICAgICBtU3RhdHVzSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLnN0YXR1c0ljb25zKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zID0gKEljb25NZXJnZXIpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworICAgICAgICBtSWNvbnMgPSAoTGluZWFyTGF5b3V0KXNiLmZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKyAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOworICAgICAgICBtRGF0ZVZpZXcgPSAoRGF0ZVZpZXcpc2IuZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7CisKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nID0gbmV3IEV4cGFuZGVkRGlhbG9nKGNvbnRleHQpOworICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7CisgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKyAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOworICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOworICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOworICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKKyAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm5vTm90aWZpY2F0aW9uc1RpdGxlKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmNsZWFyX2FsbF9idXR0b24pOworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1DbGVhckJ1dHRvbkxpc3RlbmVyKTsKKyAgICAgICAgbVNjcm9sbFZpZXcgPSAoU2Nyb2xsVmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5zY3JvbGwpOworICAgICAgICBtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0ID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKKworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBtVGlja2VyID0gbmV3IE15VGlja2VyKGNvbnRleHQsIHNiKTsKKworICAgICAgICBUaWNrZXJWaWV3IHRpY2tlclZpZXcgPSAoVGlja2VyVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJUZXh0KTsKKyAgICAgICAgdGlja2VyVmlldy5tVGlja2VyID0gbVRpY2tlcjsKKworICAgICAgICBtVHJhY2tpbmdWaWV3ID0gKFRyYWNraW5nVmlldylWaWV3LmluZmxhdGUoY29udGV4dCwgUi5sYXlvdXQuc3RhdHVzX2Jhcl90cmFja2luZywgbnVsbCk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcubVNlcnZpY2UgPSB0aGlzOworICAgICAgICBtQ2xvc2VWaWV3ID0gKENsb3NlRHJhZ0hhbmRsZSltVHJhY2tpbmdWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmNsb3NlKTsKKyAgICAgICAgbUNsb3NlVmlldy5tU2VydmljZSA9IHRoaXM7CisKKyAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7CisKKyAgICAgICAgLy8gdGhlIG1vcmUgbm90aWZpY2F0aW9ucyBpY29uCisgICAgICAgIFN0YXR1c0Jhckljb25WaWV3IG1vcmVWaWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsICJtb3JlIik7CisgICAgICAgIG1vcmVWaWV3LnNldChuZXcgU3RhdHVzQmFySWNvbihudWxsLCBSLmRyYXdhYmxlLnN0YXRfbm90aWZ5X21vcmUsIDApKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZE1vcmVWaWV3KG1vcmVWaWV3LAorICAgICAgICAgICAgICAgIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKG1JY29uU2l6ZSwgbUljb25TaXplKSk7CisKKyAgICAgICAgLy8gc2V0IHRoZSBpbml0YWwgdmlldyB2aXNpYmlsaXR5CisgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgLy8gcmVjZWl2ZSBicm9hZGNhc3RzCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DT05GSUdVUkFUSU9OX0NIQU5HRUQpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fU0NSRUVOX09GRik7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQnJvYWRjYXN0UmVjZWl2ZXIsIGZpbHRlcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEludHJ1ZGVyVmlldygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0PSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOworCisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOworICAgICAgICBscC55ICs9IGhlaWdodCAqIDEuNTsgLy8gRklYTUUKKyAgICAgICAgbHAuc2V0VGl0bGUoIkludHJ1ZGVyQWxlcnQiKTsKKyAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX1N0YXR1c0Jhcl9JbnRydWRlckFsZXJ0OworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1JbnRydWRlckFsZXJ0VmlldywgbHApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4CisgICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOworICAgICAgICB2aWV3LnNldChpY29uKTsKKyAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKKyAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKKyAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOworICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7CisgICAgICAgIHZpZXcuc2V0KGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7CisgICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgIGlmIChpY29uVmlldyA9PSBudWxsKSByZXR1cm47CisKKyAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltbWVyc2l2ZSkgeworICAgICAgICAgICAgaWYgKChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZsYWdzICYgTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWSkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJQcmVzZW50aW5nIGhpZ2gtcHJpb3JpdHkgbm90aWZpY2F0aW9uIGluIGltbWVyc2l2ZSBhY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgbmV3IHRyYW5zaWVudCB0aWNrZXIgbW9kZQorICAgICAgICAgICAgICAgIC8vIDEuIFBvcHVsYXRlIG1JbnRydWRlckFsZXJ0VmlldworCisgICAgICAgICAgICAgICAgSW1hZ2VWaWV3IGFsZXJ0SWNvbiA9IChJbWFnZVZpZXcpIG1JbnRydWRlckFsZXJ0Vmlldy5maW5kVmlld0J5SWQoUi5pZC5hbGVydEljb24pOworICAgICAgICAgICAgICAgIFRleHRWaWV3IGFsZXJ0VGV4dCA9IChUZXh0VmlldykgbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmFsZXJ0VGV4dCk7CisgICAgICAgICAgICAgICAgYWxlcnRJY29uLnNldEltYWdlRHJhd2FibGUoU3RhdHVzQmFySWNvblZpZXcuZ2V0SWNvbigKKyAgICAgICAgICAgICAgICAgICAgYWxlcnRJY29uLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgaWNvblZpZXcuZ2V0U3RhdHVzQmFySWNvbigpKSk7CisgICAgICAgICAgICAgICAgYWxlcnRUZXh0LnNldFRleHQobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KTsKKworICAgICAgICAgICAgICAgIFZpZXcgYnV0dG9uID0gbUludHJ1ZGVyQWxlcnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmludHJ1ZGVyX2FsZXJ0X2NvbnRlbnQpOworICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBMYXVuY2hlcihub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKworICAgICAgICAgICAgICAgIC8vIDIuIEFuaW1hdGUgbUludHJ1ZGVyQWxlcnRWaWV3IGluCisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU0hPV19JTlRSVURFUik7CisKKyAgICAgICAgICAgICAgICAvLyAzLiBTZXQgYWxhcm0gdG8gYWdlIHRoZSBub3RpZmljYXRpb24gb2ZmIChUT0RPKQorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19ISURFX0lOVFJVREVSKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfSElERV9JTlRSVURFUiwgSU5UUlVERVJfQUxFUlRfREVDQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBub3QgaW1tZXJzaXZlICYgYSBmdWxsLXNjcmVlbiBhbGVydCBzaG91bGQgYmUgc2hvd24KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJOb3RpZmljYXRpb24gaGFzIGZ1bGxTY3JlZW5JbnRlbnQgYW5kIGFjdGl2aXR5IGlzIG5vdCBpbW1lcnNpdmU7IgorICAgICAgICAgICAgICAgICAgICArICIgc2VuZGluZyBmdWxsU2NyZWVuSW50ZW50Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudC5zZW5kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHVzdWFsIGNhc2U6IHN0YXR1cyBiYXIgdmlzaWJsZSAmIG5vdCBpbW1lcnNpdmUKKworICAgICAgICAgICAgLy8gc2hvdyB0aGUgdGlja2VyCisgICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkgKyAiIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsKKworICAgICAgICBOb3RpZmljYXRpb25EYXRhIG9sZExpc3Q7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBtT25nb2luZy5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgaWYgKG9sZEVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9sZExpc3QgPSBtT25nb2luZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZEVudHJ5ID0gbUxhdGVzdC5maW5kQnlLZXkoa2V5KTsKKyAgICAgICAgICAgIGlmIChvbGRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBvbGROb3RpZmljYXRpb24gPSBvbGRFbnRyeS5ub3RpZmljYXRpb247CisgICAgICAgIGZpbmFsIFJlbW90ZVZpZXdzIG9sZENvbnRlbnRWaWV3ID0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50VmlldzsKKworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBjb250ZW50VmlldyA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgaWYgKGZhbHNlKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAib2xkIG5vdGlmaWNhdGlvbjogd2hlbj0iICsgb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGFuZGVkPSIgKyBvbGRFbnRyeS5leHBhbmRlZAorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIG9sZENvbnRlbnRWaWV3KTsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJuZXcgbm90aWZpY2F0aW9uOiB3aGVuPSIgKyBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAgICAgKyAiIG9uZ29pbmc9IiArIG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICAgICArICIgY29udGVudFZpZXc9IiArIGNvbnRlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbiB3ZSBqdXN0IHJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzIGluIHBsYWNlPyAgSWYgd2hlbiBkaWRuJ3QgY2hhbmdlLCB0aGUgb3JkZXIKKyAgICAgICAgLy8gZGlkbid0IGNoYW5nZS4KKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbiA9PSBvbGROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4KKyAgICAgICAgICAgICAgICAmJiBub3RpZmljYXRpb24uaXNPbmdvaW5nKCkgPT0gb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgJiYgb2xkRW50cnkuZXhwYW5kZWQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3ICE9IG51bGwgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmV1c2luZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVhcHBseSB0aGUgUmVtb3RlVmlld3MKKyAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5yZWFwcGx5KHRoaXMsIG9sZEVudHJ5LmNvbnRlbnQpOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY29udGVudEludGVudAorICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudEludGVudDsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5LmNvbnRlbnQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBMYXVuY2hlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpY29uLgorICAgICAgICAgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ubnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZEVudHJ5Lmljb24uc2V0KGljKSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IHVwZGF0ZSBpY29uOiAiICsgaWMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEl0IGZhaWxlZCB0byBhZGQgY2xlYW5seS4gIExvZywgYW5kIHJlbW92ZSB0aGUgdmlldyBmcm9tIHRoZSBwYW5lbC4KKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgcmVhcHBseSB2aWV3cyBmb3IgcGFja2FnZSAiICsgY29udGVudFZpZXcuZ2V0UGFja2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAibm90IHJldXNpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICBpZiAobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhVGV4dFV0aWxzLmVxdWFscyhub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQsCisgICAgICAgICAgICAgICAgICAgIG9sZEVudHJ5Lm5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCkpIHsKKyAgICAgICAgICAgIHRpY2sobm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgorICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJyZW1vdmVOb3RpZmljYXRpb24ga2V5PSIgKyBrZXkpOworICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkID0gcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKworICAgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgdGlja2VyIGlmIGl0J3Mgc3RpbGwgcnVubmluZworICAgICAgICAgICAgbVRpY2tlci5yZW1vdmVFbnRyeShvbGQpOworCisgICAgICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KKyAgICAgICAgICAgIHNldEFyZVRoZXJlTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGNob29zZUljb25JbmRleChib29sZWFuIGlzT25nb2luZywgaW50IHZpZXdJbmRleCkgeworICAgICAgICBmaW5hbCBpbnQgbGF0ZXN0U2l6ZSA9IG1MYXRlc3Quc2l6ZSgpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbGF0ZXN0U2l6ZSArIChtT25nb2luZy5zaXplKCkgLSB2aWV3SW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgLSB2aWV3SW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWaWV3W10gbWFrZU5vdGlmaWNhdGlvblZpZXcoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisgICAgICAgIFJlbW90ZVZpZXdzIHJlbW90ZVZpZXdzID0gbi5jb250ZW50VmlldzsKKyAgICAgICAgaWYgKHJlbW90ZVZpZXdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOworCisgICAgICAgIC8vIGJpbmQgdGhlIGNsaWNrIGV2ZW50IHRvIHRoZSBjb250ZW50IGFyZWEKKyAgICAgICAgVmlld0dyb3VwIGNvbnRlbnQgPSAoVmlld0dyb3VwKXJvdy5maW5kVmlld0J5SWQoUi5pZC5jb250ZW50KTsKKyAgICAgICAgY29udGVudC5zZXREZXNjZW5kYW50Rm9jdXNhYmlsaXR5KFZpZXdHcm91cC5GT0NVU19CTE9DS19ERVNDRU5EQU5UUyk7CisgICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbi5jb250ZW50SW50ZW50OworICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwgbm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi50YWcsIG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICB9CisKKyAgICAgICAgVmlldyBleHBhbmRlZCA9IG51bGw7CisgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhwYW5kZWQgPSByZW1vdGVWaWV3cy5hcHBseSh0aGlzLCBjb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmIChleHBhbmRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaWRlbnQgPSBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCk7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiY291bGRuJ3QgaW5mbGF0ZSB2aWV3IGZvciBub3RpZmljYXRpb24gIiArIGlkZW50LCBleGNlcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOworICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFZpZXdbXSB7IHJvdywgY29udGVudCwgZXhwYW5kZWQgfTsKKyAgICB9CisKKyAgICBTdGF0dXNCYXJJY29uVmlldyBhZGROb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBOb3RpZmljYXRpb25EYXRhIGxpc3Q7CisgICAgICAgIFZpZXdHcm91cCBwYXJlbnQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNPbmdvaW5nID0gbm90aWZpY2F0aW9uLmlzT25nb2luZygpOworICAgICAgICBpZiAoaXNPbmdvaW5nKSB7CisgICAgICAgICAgICBsaXN0ID0gbU9uZ29pbmc7CisgICAgICAgICAgICBwYXJlbnQgPSBtT25nb2luZ0l0ZW1zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdCA9IG1MYXRlc3Q7CisgICAgICAgICAgICBwYXJlbnQgPSBtTGF0ZXN0SXRlbXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBleHBhbmRlZCB2aWV3LgorICAgICAgICBmaW5hbCBWaWV3W10gdmlld3MgPSBtYWtlTm90aWZpY2F0aW9uVmlldyhub3RpZmljYXRpb24sIHBhcmVudCk7CisgICAgICAgIGlmICh2aWV3cyA9PSBudWxsKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVmlldyByb3cgPSB2aWV3c1swXTsKKyAgICAgICAgZmluYWwgVmlldyBjb250ZW50ID0gdmlld3NbMV07CisgICAgICAgIGZpbmFsIFZpZXcgZXhwYW5kZWQgPSB2aWV3c1syXTsKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpY29uLgorICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uVmlldyBpY29uVmlldyA9IG5ldyBTdGF0dXNCYXJJY29uVmlldyh0aGlzLAorICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgIGZpbmFsIFN0YXR1c0Jhckljb24gaWMgPSBuZXcgU3RhdHVzQmFySWNvbihub3RpZmljYXRpb24ucGtnLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb24sCisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbkxldmVsLCBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgIGlmICghaWNvblZpZXcuc2V0KGljKSkgeworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZGluZyBjcmVhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgZmluYWwgaW50IHZpZXdJbmRleCA9IGxpc3QuYWRkKGtleSwgbm90aWZpY2F0aW9uLCByb3csIGNvbnRlbnQsIGV4cGFuZGVkLCBpY29uVmlldyk7CisgICAgICAgIHBhcmVudC5hZGRWaWV3KHJvdywgdmlld0luZGV4KTsKKyAgICAgICAgLy8gQWRkIHRoZSBpY29uLgorICAgICAgICBmaW5hbCBpbnQgaWNvbkluZGV4ID0gY2hvb3NlSWNvbkluZGV4KGlzT25nb2luZywgdmlld0luZGV4KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLmFkZFZpZXcoaWNvblZpZXcsIGljb25JbmRleCwKKyAgICAgICAgICAgICAgICBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOworICAgICAgICByZXR1cm4gaWNvblZpZXc7CisgICAgfQorCisgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtT25nb2luZy5yZW1vdmUoa2V5KTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGVudHJ5ID0gbUxhdGVzdC5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlbW92ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFJlbW92ZSB0aGUgZXhwYW5kZWQgdmlldy4KKyAgICAgICAgKChWaWV3R3JvdXApZW50cnkucm93LmdldFBhcmVudCgpKS5yZW1vdmVWaWV3KGVudHJ5LnJvdyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgaWNvbi4KKyAgICAgICAgKChWaWV3R3JvdXApZW50cnkuaWNvbi5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5pY29uKTsKKworICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKSB7CisgICAgICAgIGJvb2xlYW4gb25nb2luZyA9IG1PbmdvaW5nLmhhc1Zpc2libGVJdGVtcygpOworICAgICAgICBib29sZWFuIGxhdGVzdCA9IG1MYXRlc3QuaGFzVmlzaWJsZUl0ZW1zKCk7CisKKyAgICAgICAgLy8gKG5vIG9uZ29pbmcgbm90aWZpY2F0aW9ucyBhcmUgY2xlYXJhYmxlKQorICAgICAgICBpZiAobUxhdGVzdC5oYXNDbGVhcmFibGVJdGVtcygpKSB7CisgICAgICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9CisKKyAgICAgICAgbU9uZ29pbmdUaXRsZS5zZXRWaXNpYmlsaXR5KG9uZ29pbmcgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShsYXRlc3QgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworCisgICAgICAgIGlmIChvbmdvaW5nIHx8IGxhdGVzdCkgeworICAgICAgICAgICAgbU5vTm90aWZpY2F0aW9uc1RpdGxlLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXRlIGlzIG9uZSBvciBtb3JlIG9mIHRoZSBESVNBQkxFIGNvbnN0YW50cyBmcm9tIFN0YXR1c0Jhck1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgZmluYWwgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gc3RhdGU7CisKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7CisgICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogeWVzIik7CisgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGwgY2hhbmdlcyB0byB0aGUgc3RhdHVzIGJhciBhbmQgbm90aWZpY2F0aW9ucyBmdW5uZWwgdGhyb3VnaCBoZXJlIGFuZCBhcmUgYmF0Y2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEggZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURToKKyAgICAgICAgICAgICAgICAgICAgZG9BbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQU5JTUFURV9SRVZFQUw6CisgICAgICAgICAgICAgICAgICAgIGRvUmV2ZWFsQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfSU5UUlVERVI6CisgICAgICAgICAgICAgICAgICAgIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ISURFX0lOVFJVREVSOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnRydWRlckFsZXJ0VmlzaWJpbGl0eShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIgbUZvY3VzQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkZvY3VzQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXNDaGFuZ2UoVmlldyB2LCBib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgICAgICAvLyBCZWNhdXNlICd2JyBpcyBhIFZpZXdHcm91cCwgYWxsIGl0cyBjaGlsZHJlbiB3aWxsIGJlICh1bilzZWxlY3RlZAorICAgICAgICAgICAgLy8gdG9vLCB3aGljaCBhbGxvd3MgbWFycXVlZWluZyB0byB3b3JrLgorICAgICAgICAgICAgdi5zZXRTZWxlY3RlZChoYXNGb2N1cyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VFeHBhbmRlZFZpc2libGUoKSB7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiTWFrZSBleHBhbmRlZCB2aXNpYmxlOiBleHBhbmRlZCB2aXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlKTsKKyAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodHJ1ZSk7CisKKyAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKKyAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgIG1FeHBhbmRlZFZpZXcucmVxdWVzdEZvY3VzKFZpZXcuRk9DVVNfRk9SV0FSRCk7CisgICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgIGlmICghbVRpY2tpbmcpIHsKKyAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIkFuaW1hdGUgZXhwYW5kOiBleHBhbmRlZD0iICsgbUV4cGFuZGVkKTsKKyAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByZXBhcmVUcmFja2luZygwLCB0cnVlKTsKKyAgICAgICAgcGVyZm9ybUZsaW5nKDAsIDIwMDAuMGYsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJhbmltYXRlQ29sbGFwc2UoKTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbWF0aW5nPSIgKyBtQW5pbWF0aW5nCisgICAgICAgICAgICAgICAgICAgICsgIiBtQW5pbVk9IiArIG1BbmltWQorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1WZWw9IiArIG1BbmltVmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHk7CisgICAgICAgIGlmIChtQW5pbWF0aW5nKSB7CisgICAgICAgICAgICB5ID0gKGludCltQW5pbVk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCktMTsKKyAgICAgICAgfQorICAgICAgICAvLyBMZXQgdGhlIGZsaW5nIHRoaW5rIHRoYXQgd2UncmUgb3BlbiBzbyBpdCBnb2VzIGluIHRoZSByaWdodCBkaXJlY3Rpb24KKyAgICAgICAgLy8gYW5kIGRvZXNuJ3QgdHJ5IHRvIHJlLW9wZW4gdGhlIHdpbmRvd3NoYWRlLgorICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOworICAgICAgICBwcmVwYXJlVHJhY2tpbmcoeSwgZmFsc2UpOworICAgICAgICBwZXJmb3JtRmxpbmcoeSwgLTIwMDAuMGYsIHRydWUpOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUV4cGFuZCgpIHsKKyAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtRXhwYW5kOiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7CisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4cGFuZGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRXhwYW5kZWQgPSB0cnVlOworICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7CisgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9GVUxMX09QRU4pOworCisgICAgICAgIGlmIChmYWxzZSkgcG9zdFN0YXJ0VHJhY2luZygpOworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUNvbGxhcHNlKCkgeworICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInBlcmZvcm1Db2xsYXBzZTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKKyAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZChmYWxzZSk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOworICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpID09IDApIHsKKyAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKKyAgICAgICAgfQorICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7CisKKyAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRXhwYW5kZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGRvQW5pbWF0aW9uKCkgeworICAgICAgICBpZiAobUFuaW1hdGluZykgeworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiIpOworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBiZWZvcmUgbUFuaW1ZPSIgKyBtQW5pbVkpOworICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOworICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBhZnRlciAgbUFuaW1ZPSIgKyBtQW5pbVkpOworICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xKSB7CisgICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGV4cGFuZGVkIHN0YXRlLiIpOworICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKKyAgICAgICAgICAgICAgICBwZXJmb3JtRXhwYW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtQW5pbVkgPCBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBjb2xsYXBzZWQgc3RhdGUuIik7CisgICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygwKTsKKyAgICAgICAgICAgICAgICBwZXJmb3JtQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdG9wVHJhY2tpbmcoKSB7CisgICAgICAgIG1UcmFja2luZyA9IGZhbHNlOworICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnRBbmltKCkgeworICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICBmbG9hdCB0ID0gKChmbG9hdCkobm93IC0gbUFuaW1MYXN0VGltZSkpIC8gMTAwMDsgICAgICAgICAgICAvLyBtcyAtPiBzCisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBtQW5pbVk7CisgICAgICAgIGZpbmFsIGZsb2F0IHYgPSBtQW5pbVZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKKyAgICAgICAgZmluYWwgZmxvYXQgYSA9IG1BbmltQWNjZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcy9zCisgICAgICAgIG1BbmltWSA9IHkgKyAodip0KSArICgwLjVmKmEqdCp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4CisgICAgICAgIG1BbmltVmVsID0gdiArIChhKnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKKyAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXMKKyAgICAgICAgLy9TbG9nLmQoVEFHLCAieT0iICsgeSArICIgdj0iICsgdiArICIgYT0iICsgYSArICIgdD0iICsgdCArICIgbUFuaW1ZPSIgKyBtQW5pbVkKKyAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKKyAgICB9CisKKyAgICB2b2lkIGRvUmV2ZWFsQW5pbWF0aW9uKCkgeworICAgICAgICBmaW5hbCBpbnQgaCA9IG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCkgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgbUFuaW1hdGluZyAmJiBtQW5pbVkgPCBoKSB7CisgICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7CisgICAgICAgICAgICBpZiAobUFuaW1ZID49IGgpIHsKKyAgICAgICAgICAgICAgICBtQW5pbVkgPSBoOworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7CisgICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByZXBhcmVUcmFja2luZyhpbnQgeSwgYm9vbGVhbiBvcGVuaW5nKSB7CisgICAgICAgIG1UcmFja2luZyA9IHRydWU7CisgICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgIGlmIChvcGVuaW5nKSB7CisgICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKKyAgICAgICAgICAgIG1BbmltVmVsID0gMjAwOworICAgICAgICAgICAgbUFuaW1ZID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOworICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKKyAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAorICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7CisgICAgICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpdCdzIG9wZW4sIGNsb3NlIGl0PworICAgICAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcGVyZm9ybUZsaW5nKGludCB5LCBmbG9hdCB2ZWwsIGJvb2xlYW4gYWx3YXlzKSB7CisgICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKworICAgICAgICBtQW5pbVkgPSB5OworICAgICAgICBtQW5pbVZlbCA9IHZlbDsKKworICAgICAgICAvL1Nsb2cuZChUQUcsICJzdGFydGluZyB3aXRoIG1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOworCisgICAgICAgIGlmIChtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgIGlmICghYWx3YXlzICYmICgKKyAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCisgICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LTI1KSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQorICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGV4cGFuZGVkIHBvc2l0aW9uLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQgYW5kIGFyZSBub3cgZ29pbmcgdG8gYW5pbWF0ZSBhd2F5LgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKKyAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFsd2F5cyB8fCAoCisgICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgorICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC8yKSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBhbmQgdGhleSBtb3ZlZCBlbm91Z2ggdG8gYWxsb3cgdXMgdG8KKyAgICAgICAgICAgICAgICAvLyBleHBhbmQuICBBbmltYXRlIGluIHRoZSBub3RpZmljYXRpb25zLgorICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKKyAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBjb2xsYXBzZWQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOworICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy9TbG9nLmQoVEFHLCAibUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbAorICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOworCisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7CisgICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKKyAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKKyAgICAgICAgc3RvcFRyYWNraW5nKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBpbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG91Y2g6IHJhd1k9IiArIGV2ZW50LmdldFJhd1koKSArICIgZXZlbnQ9IiArIGV2ZW50ICsgIiBtRGlzYWJsZWQ9IgorICAgICAgICAgICAgICAgICsgbURpc2FibGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHN0YXR1c0JhclNpemUgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGhpdFNpemUgPSBzdGF0dXNCYXJTaXplKjI7CisgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgeworICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKKworICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKKyAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gc3RhdHVzQmFyU2l6ZSAtIHk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gbUFic1Bvc1sxXSArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkgLSB5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCghbUV4cGFuZGVkICYmIHkgPCBoaXRTaXplKSB8fAorICAgICAgICAgICAgICAgICAgICAobUV4cGFuZGVkICYmIHkgPiAobURpc3BsYXkuZ2V0SGVpZ2h0KCktaGl0U2l6ZSkpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBkcm9wIGV2ZW50cyBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIG1ha2UgdGhlIHdpbmRvd3NoYWRlIGNvbWUKKyAgICAgICAgICAgICAgICAvLyBkb3duIGJ5IGFjY2lkZW50IGxlc3MsIGVzcGVjaWFsbHkgd2hlbiBwdXNoaW5nIG9wZW4gYSBkZXZpY2Ugd2l0aCBhIGtleWJvYXJkCisgICAgICAgICAgICAgICAgLy8gdGhhdCByb3RhdGVzIChsaWtlIGcxIGFuZCBkcm9pZCkKKyAgICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpZXZlbnQuZ2V0UmF3WCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBlZGdlQm9yZGVyID0gbUVkZ2VCb3JkZXI7CisgICAgICAgICAgICAgICAgaWYgKHggPj0gZWRnZUJvcmRlciAmJiB4IDwgbURpc3BsYXkuZ2V0V2lkdGgoKSAtIGVkZ2VCb3JkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksICFtRXhwYW5kZWQpOy8vIG9wZW5pbmcgaWYgd2UncmUgbm90IGFscmVhZHkgZnVsbHkgdmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVRyYWNraW5nKSB7CisgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtaW5ZID0gc3RhdHVzQmFyU2l6ZSArIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgICAgICBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOworICAgICAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIHkgPCBtaW5ZKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKKyAgICAgICAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7CisgICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDApOworCisgICAgICAgICAgICAgICAgZmxvYXQgeVZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IHlWZWwgPCAwOworCisgICAgICAgICAgICAgICAgZmxvYXQgeFZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WFZlbG9jaXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKHhWZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHhWZWwgPSAteFZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHhWZWwgPiAxNTAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgeFZlbCA9IDE1MC4wZjsgLy8gbGltaXQgaG93IG11Y2ggd2UgY2FyZSBhYm91dCB0aGUgeCBheGlzCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmxvYXQgdmVsID0gKGZsb2F0KU1hdGguaHlwb3QoeVZlbCwgeFZlbCk7CisgICAgICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHZlbCA9IC12ZWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGVyZm9ybUZsaW5nKChpbnQpZXZlbnQuZ2V0UmF3WSgpLCB2ZWwsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKSB7CisgICAgICAgIGlmICghb24pIHsKKyAgICAgICAgICAgIC8vIEFsbCB3ZSBkbyBmb3IgImxpZ2h0cyBvdXQiIG1vZGUgb24gYSBwaG9uZSBpcyBoaWRlIHRoZSBzdGF0dXMgYmFyLAorICAgICAgICAgICAgLy8gd2hpY2ggdGhlIHdpbmRvdyBtYW5hZ2VyIGRvZXMuICBCdXQgd2UgZG8gbmVlZCB0byBoaWRlIHRoZSB3aW5kb3dzaGFkZQorICAgICAgICAgICAgLy8gb24gb3VyIG93bi4KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMYXVuY2hlciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1JbnRlbnQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1Qa2c7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7CisgICAgICAgIHByaXZhdGUgaW50IG1JZDsKKworICAgICAgICBMYXVuY2hlcihQZW5kaW5nSW50ZW50IGludGVudCwgU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkKSB7CisgICAgICAgICAgICBtSW50ZW50ID0gaW50ZW50OworICAgICAgICAgICAgbVBrZyA9IHBrZzsKKyAgICAgICAgICAgIG1UYWcgPSB0YWc7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBpbnRlbnQgd2UgYXJlIHNlbmRpbmcgaXMgZm9yIHRoZSBhcHBsaWNhdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3b24ndCBoYXZlIHBlcm1pc3Npb24gdG8gaW1tZWRpYXRlbHkgc3RhcnQgYW4gYWN0aXZpdHkgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBzd2l0Y2hlcyB0byBob21lLiAgV2Uga25vdyBpdCBpcyBzYWZlIHRvIGRvIGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBwb2ludCwgc28gbWFrZSBzdXJlIG5ldyBhY3Rpdml0eSBzd2l0Y2hlcyBhcmUgbm93IGFsbG93ZWQuCisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmdldERlZmF1bHQoKS5yZXN1bWVBcHBTd2l0Y2hlcygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludFtdIHBvcyA9IG5ldyBpbnRbMl07CisgICAgICAgICAgICAgICAgdi5nZXRMb2NhdGlvbk9uU2NyZWVuKHBvcyk7CisgICAgICAgICAgICAgICAgSW50ZW50IG92ZXJsYXkgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgb3ZlcmxheS5zZXRTb3VyY2VCb3VuZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdChwb3NbMF0sIHBvc1sxXSwgcG9zWzBdK3YuZ2V0V2lkdGgoKSwgcG9zWzFdK3YuZ2V0SGVpZ2h0KCkpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSW50ZW50LnNlbmQoUGhvbmVTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCisgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhpcyBjbGljayB3YXMgb24gdGhlIGludHJ1ZGVyIGFsZXJ0LCBoaWRlIHRoYXQgaW5zdGVhZAorICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfSElERV9JTlRSVURFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGljayhTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgICAgICAvLyBTaG93IHRoZSB0aWNrZXIgaWYgb25lIGlzIHJlcXVlc3RlZC4gQWxzbyBkb24ndCBkbyB0aGlzCisgICAgICAgIC8vIHVudGlsIHN0YXR1cyBiYXIgd2luZG93IGlzIGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cgbWFuYWdlciwKKyAgICAgICAgLy8gYmVjYXVzZS4uLiAgd2VsbCwgd2hhdCdzIHRoZSBwb2ludCBvdGhlcndpc2U/ICBBbmQgdHJ5aW5nIHRvCisgICAgICAgIC8vIHJ1biBhIHRpY2tlciB3aXRob3V0IGJlaW5nIGF0dGFjaGVkIHdpbGwgY3Jhc2ghCisgICAgICAgIGlmIChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ICE9IG51bGwgJiYgbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoMCA9PSAobURpc2FibGVkICYgKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSkpIHsKKyAgICAgICAgICAgICAgICBtVGlja2VyLmFkZEVudHJ5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIHRoaXMgbm90aWZpY2F0aW9uIGFuZCB0ZWxsIHRoZSBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSAvIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlCisgICAgICogYWJvdXQgdGhlIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIHdpbGwgY2FsbCBiYWNrIGludG8gdXMuICBEb24ndCBob2xkIGFueSBsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uKGtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkVycm9yKG4ucGtnLCBuLnRhZywgbi5pZCwgbi51aWQsIG4uaW5pdGlhbFBpZCwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGVuZCBpcyBuaWdoLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNeVRpY2tlciBleHRlbmRzIFRpY2tlciB7CisgICAgICAgIE15VGlja2VyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc2IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlclN0YXJ0aW5nKCkgeworICAgICAgICAgICAgbVRpY2tpbmcgPSB0cnVlOworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX2luLCBudWxsKSk7CisgICAgICAgICAgICBtSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0LCBudWxsKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfdXBfb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJEb25lKCkgeworICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luLCBudWxsKSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaWNraW5nRG9uZUxpc3RlbmVyKSk7CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgIHNldERhdGVWaWV3VmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckhhbHRpbmcoKSB7CisgICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luLCBudWxsKSk7CisgICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGlja2luZ0RvbmVMaXN0ZW5lcikpOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIG1UaWNraW5nRG9uZUxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHs7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQW5pbWF0aW9uIGxvYWRBbmltKGludCBpZCwgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIEFuaW1hdGlvbiBhbmltID0gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihQaG9uZVN0YXR1c0JhclNlcnZpY2UudGhpcywgaWQpOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2aWV3SW5mbyhWaWV3IHYpIHsKKyAgICAgICAgcmV0dXJuICIoIiArIHYuZ2V0TGVmdCgpICsgIiwiICsgdi5nZXRUb3AoKSArICIpKCIgKyB2LmdldFJpZ2h0KCkgKyAiLCIgKyB2LmdldEJvdHRvbSgpCisgICAgICAgICAgICAgICAgKyAiICIgKyB2LmdldFdpZHRoKCkgKyAieCIgKyB2LmdldEhlaWdodCgpICsgIikiOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChjaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQorICAgICAgICAgICAgICAgICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgcHcucHJpbnRsbigiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU3RhdHVzQmFyIGZyb20gZnJvbSBwaWQ9IgorICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUXVldWVMb2NrKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFN0YXR1cyBCYXIgc3RhdGU6Iik7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUV4cGFuZGVkVmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNraW5nPSIgKyBtVGlja2luZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZz0iICsgbVRyYWNraW5nKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZworICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltWT0iICsgbUFuaW1ZICsgIiwgbUFuaW1WZWw9IiArIG1BbmltVmVsCisgICAgICAgICAgICAgICAgICAgICsgIiwgbUFuaW1BY2NlbD0iICsgbUFuaW1BY2NlbCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DdXJBbmltYXRpb25UaW1lPSIgKyBtQ3VyQW5pbWF0aW9uVGltZQorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1MYXN0VGltZT0iICsgbUFuaW1MYXN0VGltZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodAorICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZ1JldmVhbD0iICsgbUFuaW1hdGluZ1JldmVhbAorICAgICAgICAgICAgICAgICAgICArICIgbVZpZXdEZWx0YT0iICsgbVZpZXdEZWx0YSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EaXNwbGF5SGVpZ2h0PSIgKyBtRGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFBhcmFtczogIiArIG1FeHBhbmRlZFBhcmFtcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZFZpZXc6ICIgKyB2aWV3SW5mbyhtRXhwYW5kZWRWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1FeHBhbmRlZERpYWxvZzogIiArIG1FeHBhbmRlZERpYWxvZyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1BhcmFtczogIiArIG1UcmFja2luZ1BhcmFtcyk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UcmFja2luZ1ZpZXc6ICIgKyB2aWV3SW5mbyhtVHJhY2tpbmdWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nVGl0bGU6ICIgKyB2aWV3SW5mbyhtT25nb2luZ1RpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1PbmdvaW5nSXRlbXM6ICIgKyB2aWV3SW5mbyhtT25nb2luZ0l0ZW1zKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1MYXRlc3RUaXRsZTogIiArIHZpZXdJbmZvKG1MYXRlc3RUaXRsZSkpOworICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0SXRlbXM6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0SXRlbXMpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbU5vTm90aWZpY2F0aW9uc1RpdGxlOiAiICsgdmlld0luZm8obU5vTm90aWZpY2F0aW9uc1RpdGxlKSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1DbG9zZVZpZXc6ICIgKyB2aWV3SW5mbyhtQ2xvc2VWaWV3KSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1UaWNrZXJWaWV3OiAiICsgdmlld0luZm8obVRpY2tlclZpZXcpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbVNjcm9sbFZpZXc6ICIgKyB2aWV3SW5mbyhtU2Nyb2xsVmlldykKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNjcm9sbCAiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWCgpICsgIiwiICsgbVNjcm9sbFZpZXcuZ2V0U2Nyb2xsWSgpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIm1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQ6ICIgKyB2aWV3SW5mbyhtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KSk7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgc3luY2hyb25pemVkIChtTm90aWZpY2F0aW9uRGF0YSkgeworICAgICAgICAgICAgaW50IE4gPSBtTm90aWZpY2F0aW9uRGF0YS5vbmdvaW5nQ291bnQoKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0T25nb2luZyhpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOID0gbU5vdGlmaWNhdGlvbkRhdGEubGF0ZXN0Q291bnQoKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgb25nb2luZ0NvdW50LnNpemU9IiArIE4pOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuID0gbU5vdGlmaWNhdGlvbkRhdGEuZ2V0TGF0ZXN0KGkpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBbIiArIGkgKyAiXSBrZXk9IiArIG4ua2V5ICsgIiB2aWV3PSIgKyBuLnZpZXcpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAgICAgICAgZGF0YT0iICsgbi5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgcHcucHJpbnRsbigic2VlIHRoZSBsb2djYXQgZm9yIGEgZHVtcCBvZiB0aGUgdmlld3Mgd2UgaGF2ZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgLy8gbXVzdCBoYXBwZW4gb24gdWkgdGhyZWFkCisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtU3RhdHVzQmFyVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtU3RhdHVzQmFyVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclZpZXcuZGVidWcoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5nZXRMb2NhdGlvbk9uU2NyZWVuKG1BYnNQb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm1FeHBhbmRlZFZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbUV4cGFuZGVkVmlldy5nZXRXaWR0aCgpICsgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUV4cGFuZGVkVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaWV3LmRlYnVnKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtVHJhY2tpbmdWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1UcmFja2luZ1ZpZXcuZ2V0V2lkdGgoKSArICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNraW5nVmlldy5kZWJ1ZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQmFyVmlld0F0dGFjaGVkKCkgeworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKKyAgICAgICAgaW50IHBpeGVsRm9ybWF0OworICAgICAgICBEcmF3YWJsZSBiZzsKKworICAgICAgICAvLy8gLS0tLS0tLS0tLSBUcmFja2luZyBWaWV3IC0tLS0tLS0tLS0tLS0tCisgICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuUkdCWF84ODg4OworICAgICAgICBiZyA9IG1UcmFja2luZ1ZpZXcuZ2V0QmFja2dyb3VuZCgpOworICAgICAgICBpZiAoYmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXQgPSBiZy5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdCk7CisvLyAgICAgICAgbHAudG9rZW4gPSBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpOworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlRyYWNraW5nVmlldyIpOworICAgICAgICBscC55ID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgIG1UcmFja2luZ1BhcmFtcyA9IGxwOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1UcmFja2luZ1ZpZXcsIGxwKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVHJhY2tpbmdWaWV3QXR0YWNoZWQoKSB7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwOworICAgICAgICBpbnQgcGl4ZWxGb3JtYXQ7CisgICAgICAgIERyYXdhYmxlIGJnOworCisgICAgICAgIC8vLyAtLS0tLS0tLS0tIEV4cGFuZGVkIFZpZXcgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVDsKKworICAgICAgICBmaW5hbCBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgbHAgPSBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBscC53aWR0aCA9IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICBscC5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOworICAgICAgICBscC54ID0gMDsKKyAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSBscC55ID0gLWRpc3BoOyAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgbmVnYXRpdmUKKyAgICAgICAgbHAudHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTDsKKyAgICAgICAgbHAuZmxhZ3MgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfVE9VQ0hfTU9EQUwKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElUSEVSCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CisgICAgICAgIGxwLmZvcm1hdCA9IHBpeGVsRm9ybWF0OworICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlN0YXR1c0JhckV4cGFuZGVkIik7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKKyAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEZvcm1hdChwaXhlbEZvcm1hdCk7CisgICAgICAgIG1FeHBhbmRlZFBhcmFtcyA9IGxwOworCisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5zZXRDb250ZW50VmlldyhtRXhwYW5kZWRWaWV3LAorICAgICAgICAgICAgICAgIG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUobnVsbCk7CisgICAgICAgIG1FeHBhbmRlZERpYWxvZy5zaG93KCk7CisgICAgICAgIEZyYW1lTGF5b3V0IGhhY2sgPSAoRnJhbWVMYXlvdXQpbUV4cGFuZGVkVmlldy5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERhdGVWaWV3VmlzaWJpbGl0eShib29sZWFuIHZpc2libGUsIGludCBhbmltKSB7CisgICAgICAgIG1EYXRlVmlldy5zZXRVcGRhdGVzKHZpc2libGUpOworICAgICAgICBtRGF0ZVZpZXcuc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOworICAgICAgICBtRGF0ZVZpZXcuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOworICAgIH0KKworICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgeworICAgICAgICBpbnQgb2xkID0gbU5vdGlmaWNhdGlvbkljb25zLmdldFZpc2liaWxpdHkoKTsKKyAgICAgICAgaW50IHYgPSB2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEU7CisgICAgICAgIGlmIChvbGQgIT0gdikgeworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkodik7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuc3RhcnRBbmltYXRpb24obG9hZEFuaW0oYW5pbSwgbnVsbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoaW50IGV4cGFuZGVkUG9zaXRpb24pIHsKKyAgICAgICAgaWYgKFNQRVcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVFeHBhbmRlZFZpZXdQb3MgYmVmb3JlIGV4cGFuZGVkUG9zaXRpb249IiArIGV4cGFuZGVkUG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1BhcmFtcy55PSIgKyBtVHJhY2tpbmdQYXJhbXMueQorICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUG9zaXRpb249IiArIG1UcmFja2luZ1Bvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBoID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIGludCBkaXNwaCA9IG1EaXNwbGF5LmdldEhlaWdodCgpOworCisgICAgICAgIC8vIElmIHRoZSBleHBhbmRlZCB2aWV3IGlzIG5vdCB2aXNpYmxlLCBtYWtlIHN1cmUgdGhleSdyZSBzdGlsbCBvZmYgc2NyZWVuLgorICAgICAgICAvLyBNYXliZSB0aGUgdmlldyB3YXMgcmVzaXplZC4KKyAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7CisgICAgICAgICAgICBpZiAobVRyYWNraW5nVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVRyYWNraW5nUG9zaXRpb24gPSAtZGlzcGg7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFja2luZ1BhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1BhcmFtcy55ID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS51cGRhdGVWaWV3TGF5b3V0KG1UcmFja2luZ1ZpZXcsIG1UcmFja2luZ1BhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYWNraW5nIHZpZXcuLi4KKyAgICAgICAgaW50IHBvczsKKyAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfRlVMTF9PUEVOKSB7CisgICAgICAgICAgICBwb3MgPSBoOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGV4cGFuZGVkUG9zaXRpb24gPT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKKyAgICAgICAgICAgIHBvcyA9IG1UcmFja2luZ1Bvc2l0aW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gPD0gZGlzcGgpIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBleHBhbmRlZFBvc2l0aW9uOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBkaXNwaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSBkaXNwaC1oOworICAgICAgICB9CisgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbVRyYWNraW5nUGFyYW1zLnkgPSBwb3M7CisgICAgICAgIG1UcmFja2luZ1BhcmFtcy5oZWlnaHQgPSBkaXNwaC1oOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOworCisgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNsb3NlVmlldy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2xvc2VQb3MgPSBtUG9zaXRpb25UbXBbMV07CisKKyAgICAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzLmdldExvY2F0aW9uSW5XaW5kb3cobVBvc2l0aW9uVG1wKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50c0JvdHRvbSA9IG1Qb3NpdGlvblRtcFsxXSArIG1FeHBhbmRlZENvbnRlbnRzLmdldEhlaWdodCgpOworCisgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IHBvcyArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgLSAobVRyYWNraW5nUGFyYW1zLmhlaWdodC1jbG9zZVBvcykgLSBjb250ZW50c0JvdHRvbTsKKyAgICAgICAgICAgIGludCBtYXggPSBoOworICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55ID4gbWF4KSB7CisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWluID0gbVRyYWNraW5nUG9zaXRpb247CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zLnkgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMueSA9IG1pbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gKG1UcmFja2luZ1Bvc2l0aW9uICsgbVRyYWNraW5nVmlldy5nZXRIZWlnaHQoKSkgPiBoOworICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnRzIGFyZW4ndCB2aXNpYmxlLCBtb3ZlIHRoZSBleHBhbmRlZCB2aWV3IHdheSBvZmYgc2NyZWVuCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgd2luZG93IGl0c2VsZiBleHRlbmRzIGJlbG93IHRoZSBjb250ZW50IHZpZXcuCisgICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSAtZGlzcGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOworCisgICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgaXNuJ3QganVzdCBhIHJlcG9zaXRpb25pbmcgdGhhdCdzIG5vdCBzdXBwb3NlZCB0byBhZmZlY3QKKyAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcGVyY2VwdGlvbiBvZiB3aGF0J3Mgc2hvd2luZywgY2FsbCB0byBzYXkgdGhhdCB0aGUgdmlzaWJpbGl0eQorICAgICAgICAgICAgLy8gaGFzIGNoYW5nZWQuIChPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSB3aWxsIGNhbGwgdG8gZG8gdGhhdCkuCisgICAgICAgICAgICBpZiAoZXhwYW5kZWRQb3NpdGlvbiAhPSBFWFBBTkRFRF9MRUFWRV9BTE9ORSkgeworICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIHZpc2liaWxpdHlDaGFuZ2VkKCIgKyB2aXNpYmxlICsgIikiKTsKKyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChTUEVXKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGFmdGVyICBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iICsgbVRyYWNraW5nUGFyYW1zLnkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLnk9IiArIG1FeHBhbmRlZFBhcmFtcy55CisgICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0PSIgKyBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBnZXRFeHBhbmRlZEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwbGF5LmdldEhlaWdodCgpIC0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCkgLSBtQ2xvc2VWaWV3LmdldEhlaWdodCgpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRIZWlnaHQoKSB7CisgICAgICAgIGlmIChtRXhwYW5kZWRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy5oZWlnaHQgPSBnZXRFeHBhbmRlZEhlaWdodCgpOworICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBMRURzIGFyZSB0dXJuZWQgbylmZiB3aGVuIHRoZSBub3RpZmljYXRpb24gcGFuZWwgaXMgc2hvd24sIGV2ZW4ganVzdCBhIGxpdHRsZSBiaXQuCisgICAgICogVGhpcyB3YXMgYWRkZWQgbGFzdC1taW51dGUgYW5kIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhlIG5vdGlmaWNhdGlvbnMKKyAgICAgKiBhcmUgaGFuZGxlZCwgYmVjYXVzZSB0aGUgbm90aWZpY2F0aW9uIGlzbid0IHJlYWxseSBjYW5jZWxsZWQuICBUaGUgbGlnaHRzIGFyZSBqdXN0CisgICAgICogdHVybmVkIG9mZi4gIElmIGFueSBvdGhlciBub3RpZmljYXRpb25zIGhhcHBlbiwgdGhlIGxpZ2h0cyB3aWxsIHR1cm4gYmFjayBvbi4gIFN0ZXZlIHNheXMKKyAgICAgKiB0aGlzIGlzIHdoYXQgaGUgd2FudHMuIChzZWUgYnVnIDExMzE0NjEpCisgICAgICovCisgICAgdm9pZCB2aXNpYmlsaXR5Q2hhbmdlZChib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKG1QYW5lbFNsaWdodGx5VmlzaWJsZSAhPSB2aXNpYmxlKSB7CisgICAgICAgICAgICBtUGFuZWxTbGlnaHRseVZpc2libGUgPSB2aXNpYmxlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vblBhbmVsUmV2ZWFsZWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIFdvbid0IGZhaWwgdW5sZXNzIHRoZSB3b3JsZCBoYXMgZW5kZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBlcmZvcm1EaXNhYmxlQWN0aW9ucyhpbnQgbmV0KSB7CisgICAgICAgIGludCBvbGQgPSBtRGlzYWJsZWQ7CisgICAgICAgIGludCBkaWZmID0gbmV0IF4gb2xkOworICAgICAgICBtRGlzYWJsZWQgPSBuZXQ7CisKKyAgICAgICAgLy8gYWN0IGFjY29yZGluZ2x5CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX0VYUEFORDogeWVzIik7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtVGlja2VyLmhhbHQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eShmYWxzZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHNldEludHJ1ZGVyQWxlcnRWaXNpYmlsaXR5KGJvb2xlYW4gdmlzKSB7CisgICAgICAgIG1JbnRydWRlckFsZXJ0Vmlldy5zZXRWaXNpYmlsaXR5KHZpcyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgICoKKyAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKKyAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQorICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVSZXNvdXJjZXMoKSB7CisgICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKKworICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbikpOworICAgICAgICBtT25nb2luZ1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX29uZ29pbmdfZXZlbnRzX3RpdGxlKSk7CisgICAgICAgIG1MYXRlc3RUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlKSk7CisgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlKSk7CisKKyAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7CisKKyAgICAgICAgaWYgKGZhbHNlKSBTbG9nLnYoVEFHLCAidXBkYXRlUmVzb3VyY2VzIik7CisgICAgfQorCisgICAgLy8KKyAgICAvLyB0cmFjaW5nCisgICAgLy8KKworICAgIHZvaWQgcG9zdFN0YXJ0VHJhY2luZygpIHsKKyAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0YXJ0VHJhY2luZywgMzAwMCk7CisgICAgfQorCisgICAgdm9pZCB2aWJyYXRlKCkgeworICAgICAgICBhbmRyb2lkLm9zLlZpYnJhdG9yIHZpYiA9IChhbmRyb2lkLm9zLlZpYnJhdG9yKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKKyAgICAgICAgdmliLnZpYnJhdGUoMjUwKTsKKyAgICB9CisKKyAgICBSdW5uYWJsZSBtU3RhcnRUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB2aWJyYXRlKCk7CisgICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgyNTApOworICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0YXJ0VHJhY2luZyIpOworICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIi9kYXRhL3N0YXR1c2Jhci10cmFjZXMvdHJhY2UiKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2luZywgMTAwMDApOworICAgICAgICB9CisgICAgfTsKKworICAgIFJ1bm5hYmxlIG1TdG9wVHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0b3BUcmFjaW5nIik7CisgICAgICAgICAgICB2aWJyYXRlKCk7CisgICAgICAgIH0KKyAgICB9OworfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCmluZGV4IGFmNzM2YWEuLjY5NWZkYmEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0xNywxODQgKzE3LDUzIEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2JhcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLklTdGF0dXNCYXJTZXJ2aWNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uTGlzdDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmVsb2NpdHlUcmFja2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbW90ZVZpZXdzOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LlN0YXR1c0JhclBvbGljeTsKIAotCi0KLXB1YmxpYyBjbGFzcyBTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSBpbXBsZW1lbnRzIENvbW1hbmRRdWV1ZS5DYWxsYmFja3MgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c0JhclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIGltcGxlbWVudHMgQ29tbWFuZFF1ZXVlLkNhbGxiYWNrcyB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RhdHVzQmFyU2VydmljZSI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1BFVyA9IGZhbHNlOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVRVU0JBUl9TVEFSVAotICAgICAgICAgICAgPSAiY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LnN0YXR1c2Jhci5TVEFSVCI7CisgICAgcHJvdGVjdGVkIENvbW1hbmRRdWV1ZSBtQ29tbWFuZFF1ZXVlOworICAgIHByb3RlY3RlZCBJU3RhdHVzQmFyU2VydmljZSBtQmFyU2VydmljZTsKIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5ERURfTEVBVkVfQUxPTkUgPSAtMTAwMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBFWFBBTkRFRF9GVUxMX09QRU4gPSAtMTAwMDE7CisgICAgLy8gVXAtY2FsbCBtZXRob2RzCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQU5JTUFURSA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19BTklNQVRFX1JFVkVBTCA9IDEwMDE7Ci0KLSAgICBTdGF0dXNCYXJQb2xpY3kgbUljb25Qb2xpY3k7Ci0KLSAgICBDb21tYW5kUXVldWUgbUNvbW1hbmRRdWV1ZTsKLSAgICBJU3RhdHVzQmFyU2VydmljZSBtQmFyU2VydmljZTsKLQotICAgIGludCBtSWNvblNpemU7Ci0gICAgRGlzcGxheSBtRGlzcGxheTsKLSAgICBTdGF0dXNCYXJWaWV3IG1TdGF0dXNCYXJWaWV3OwotICAgIGludCBtUGl4ZWxGb3JtYXQ7Ci0gICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7Ci0gICAgT2JqZWN0IG1RdWV1ZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAvLyBpY29ucwotICAgIExpbmVhckxheW91dCBtSWNvbnM7Ci0gICAgSWNvbk1lcmdlciBtTm90aWZpY2F0aW9uSWNvbnM7Ci0gICAgTGluZWFyTGF5b3V0IG1TdGF0dXNJY29uczsKLQotICAgIC8vIGV4cGFuZGVkIG5vdGlmaWNhdGlvbnMKLSAgICBEaWFsb2cgbUV4cGFuZGVkRGlhbG9nOwotICAgIEV4cGFuZGVkVmlldyBtRXhwYW5kZWRWaWV3OwotICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIG1FeHBhbmRlZFBhcmFtczsKLSAgICBTY3JvbGxWaWV3IG1TY3JvbGxWaWV3OwotICAgIFZpZXcgbU5vdGlmaWNhdGlvbkxpbmVhckxheW91dDsKLSAgICBWaWV3IG1FeHBhbmRlZENvbnRlbnRzOwotICAgIC8vIHRvcCBiYXIKLSAgICBUZXh0VmlldyBtTm9Ob3RpZmljYXRpb25zVGl0bGU7Ci0gICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOwotICAgIC8vIGRyYWcgYmFyCi0gICAgQ2xvc2VEcmFnSGFuZGxlIG1DbG9zZVZpZXc7Ci0gICAgLy8gb25nb2luZwotICAgIE5vdGlmaWNhdGlvbkRhdGEgbU9uZ29pbmcgPSBuZXcgTm90aWZpY2F0aW9uRGF0YSgpOwotICAgIFRleHRWaWV3IG1PbmdvaW5nVGl0bGU7Ci0gICAgTGluZWFyTGF5b3V0IG1PbmdvaW5nSXRlbXM7Ci0gICAgLy8gbGF0ZXN0Ci0gICAgTm90aWZpY2F0aW9uRGF0YSBtTGF0ZXN0ID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKLSAgICBUZXh0VmlldyBtTGF0ZXN0VGl0bGU7Ci0gICAgTGluZWFyTGF5b3V0IG1MYXRlc3RJdGVtczsKLSAgICAvLyBwb3NpdGlvbgotICAgIGludFtdIG1Qb3NpdGlvblRtcCA9IG5ldyBpbnRbMl07Ci0gICAgYm9vbGVhbiBtRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtRXhwYW5kZWRWaXNpYmxlOwotCi0gICAgLy8gdGhlIGRhdGUgdmlldwotICAgIERhdGVWaWV3IG1EYXRlVmlldzsKLQotICAgIC8vIHRoZSB0cmFja2VyIHZpZXcKLSAgICBUcmFja2luZ1ZpZXcgbVRyYWNraW5nVmlldzsKLSAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtVHJhY2tpbmdQYXJhbXM7Ci0gICAgaW50IG1UcmFja2luZ1Bvc2l0aW9uOyAvLyB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgdHJhY2tpbmcgdmlldy4KLSAgICBwcml2YXRlIGJvb2xlYW4gbVBhbmVsU2xpZ2h0bHlWaXNpYmxlOwotCi0gICAgLy8gdGlja2VyCi0gICAgcHJpdmF0ZSBUaWNrZXIgbVRpY2tlcjsKLSAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOwotCi0gICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCi0gICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKLSAgICBib29sZWFuIG1UcmFja2luZzsKLSAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQU5JTV9GUkFNRV9EVVJBVElPTiA9ICgxMDAwLzYwKTsKLQotICAgIGJvb2xlYW4gbUFuaW1hdGluZzsKLSAgICBsb25nIG1DdXJBbmltYXRpb25UaW1lOwotICAgIGZsb2F0IG1EaXNwbGF5SGVpZ2h0OwotICAgIGZsb2F0IG1BbmltWTsKLSAgICBmbG9hdCBtQW5pbVZlbDsKLSAgICBmbG9hdCBtQW5pbUFjY2VsOwotICAgIGxvbmcgbUFuaW1MYXN0VGltZTsKLSAgICBib29sZWFuIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICBpbnQgbVZpZXdEZWx0YTsKLSAgICBpbnRbXSBtQWJzUG9zID0gbmV3IGludFsyXTsKLQotICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKLSAgICBpbnQgbURpc2FibGVkID0gMDsKLQotICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotICAgICAgICBFeHBhbmRlZERpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuVGhlbWVfTGlnaHRfTm9UaXRsZUJhcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewotICAgICAgICAgICAgYm9vbGVhbiBkb3duID0gZXZlbnQuZ2V0QWN0aW9uKCkgPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEtleUNvZGUoKSkgewotICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0JBQ0s6Ci0gICAgICAgICAgICAgICAgaWYgKCFkb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIE5vYm9keSBiaW5kcyB0byB1cy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewogICAgICAgICAvLyBGaXJzdCBzZXQgdXAgb3VyIHZpZXdzIGFuZCBzdHVmZi4KLSAgICAgICAgbURpc3BsYXkgPSAoKFdpbmRvd01hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKSkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgbWFrZVN0YXR1c0JhclZpZXcodGhpcyk7CisgICAgICAgIFZpZXcgc2IgPSBtYWtlU3RhdHVzQmFyVmlldygpOwogCiAgICAgICAgIC8vIENvbm5lY3QgaW4gdG8gdGhlIHN0YXR1cyBiYXIgbWFuYWdlciBzZXJ2aWNlCiAgICAgICAgIFN0YXR1c0Jhckljb25MaXN0IGljb25MaXN0ID0gbmV3IFN0YXR1c0Jhckljb25MaXN0KCk7CkBAIC0yMDMsMTIgKzcyLDE2IEBACiAgICAgICAgIG1Db21tYW5kUXVldWUgPSBuZXcgQ29tbWFuZFF1ZXVlKHRoaXMsIGljb25MaXN0KTsKICAgICAgICAgbUJhclNlcnZpY2UgPSBJU3RhdHVzQmFyU2VydmljZS5TdHViLmFzSW50ZXJmYWNlKAogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5TVEFUVVNfQkFSX1NFUlZJQ0UpKTsKKyAgICAgICAgYm9vbGVhbltdIGxpZ2h0c09uID0gbmV3IGJvb2xlYW5bMV07CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQmFyU2VydmljZS5yZWdpc3RlclN0YXR1c0JhcihtQ29tbWFuZFF1ZXVlLCBpY29uTGlzdCwgbm90aWZpY2F0aW9uS2V5cywgbm90aWZpY2F0aW9ucyk7CisgICAgICAgICAgICBtQmFyU2VydmljZS5yZWdpc3RlclN0YXR1c0JhcihtQ29tbWFuZFF1ZXVlLCBpY29uTGlzdCwgbm90aWZpY2F0aW9uS2V5cywgbm90aWZpY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgbGlnaHRzT24pOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBzeXN0ZW0gcHJvY2VzcyBpc24ndCB0aGVyZSB3ZSdyZSBkb29tZWQgYW55d2F5LgogICAgICAgICB9CiAKKyAgICAgICAgc2V0TGlnaHRzT24obGlnaHRzT25bMF0pOworCiAgICAgICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCBpY29uIHN0YXRlCiAgICAgICAgIGludCBOID0gaWNvbkxpc3Quc2l6ZSgpOwogICAgICAgICBpbnQgdmlld0luZGV4ID0gMDsKQEAgLTIzMiwxMzA2ICsxMDUsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFB1dCB1cCB0aGUgdmlldwotICAgICAgICBhZGRTdGF0dXNCYXJWaWV3KCk7Ci0KLSAgICAgICAgLy8gTGFzdGx5LCBjYWxsIHRvIHRoZSBpY29uIHBvbGljeSB0byBpbnN0YWxsL3VwZGF0ZSBhbGwgdGhlIGljb25zLgotICAgICAgICBtSWNvblBvbGljeSA9IG5ldyBTdGF0dXNCYXJQb2xpY3kodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgewotICAgICAgICAvLyB3ZSdyZSBuZXZlciBkZXN0cm95ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb2JvZHkgYmluZHMgdG8gdXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIHZpZXcKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHByaXZhdGUgdm9pZCBtYWtlU3RhdHVzQmFyVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9zaXplKTsKLQotICAgICAgICBFeHBhbmRlZFZpZXcgZXhwYW5kZWQgPSAoRXhwYW5kZWRWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIFIubGF5b3V0LnN0YXR1c19iYXJfZXhwYW5kZWQsIG51bGwpOwotICAgICAgICBleHBhbmRlZC5tU2VydmljZSA9IHRoaXM7Ci0KLSAgICAgICAgU3RhdHVzQmFyVmlldyBzYiA9IChTdGF0dXNCYXJWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKLSAgICAgICAgc2IubVNlcnZpY2UgPSB0aGlzOwotCi0gICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hpY2ggcGl4ZWwtZm9ybWF0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIuCi0gICAgICAgIG1QaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwotICAgICAgICBEcmF3YWJsZSBiZyA9IHNiLmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QaXhlbEZvcm1hdCA9IGJnLmdldE9wYWNpdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0dXNCYXJWaWV3ID0gc2I7Ci0gICAgICAgIG1TdGF0dXNJY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzSWNvbnMpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMgPSAoSWNvbk1lcmdlcilzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25JY29ucyk7Ci0gICAgICAgIG1JY29ucyA9IChMaW5lYXJMYXlvdXQpc2IuZmluZFZpZXdCeUlkKFIuaWQuaWNvbnMpOwotICAgICAgICBtVGlja2VyVmlldyA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlcik7Ci0gICAgICAgIG1EYXRlVmlldyA9IChEYXRlVmlldylzYi5maW5kVmlld0J5SWQoUi5pZC5kYXRlKTsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cgPSBuZXcgRXhwYW5kZWREaWFsb2coY29udGV4dCk7Ci0gICAgICAgIG1FeHBhbmRlZFZpZXcgPSBleHBhbmRlZDsKLSAgICAgICAgbUV4cGFuZGVkQ29udGVudHMgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotICAgICAgICBtT25nb2luZ1RpdGxlID0gKFRleHRWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdUaXRsZSk7Ci0gICAgICAgIG1PbmdvaW5nSXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLm9uZ29pbmdJdGVtcyk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RUaXRsZSk7Ci0gICAgICAgIG1MYXRlc3RJdGVtcyA9IChMaW5lYXJMYXlvdXQpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0SXRlbXMpOwotICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm9Ob3RpZmljYXRpb25zVGl0bGUpOwotICAgICAgICBtQ2xlYXJCdXR0b24gPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQuY2xlYXJfYWxsX2J1dHRvbik7Ci0gICAgICAgIG1DbGVhckJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUNsZWFyQnV0dG9uTGlzdGVuZXIpOwotICAgICAgICBtU2Nyb2xsVmlldyA9IChTY3JvbGxWaWV3KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLnNjcm9sbCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25MaW5lYXJMYXlvdXQgPSBleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25MaW5lYXJMYXlvdXQpOwotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtTGF0ZXN0VGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIG1UaWNrZXIgPSBuZXcgTXlUaWNrZXIoY29udGV4dCwgc2IpOwotCi0gICAgICAgIFRpY2tlclZpZXcgdGlja2VyVmlldyA9IChUaWNrZXJWaWV3KXNiLmZpbmRWaWV3QnlJZChSLmlkLnRpY2tlclRleHQpOwotICAgICAgICB0aWNrZXJWaWV3Lm1UaWNrZXIgPSBtVGlja2VyOwotCi0gICAgICAgIG1UcmFja2luZ1ZpZXcgPSAoVHJhY2tpbmdWaWV3KVZpZXcuaW5mbGF0ZShjb250ZXh0LCBSLmxheW91dC5zdGF0dXNfYmFyX3RyYWNraW5nLCBudWxsKTsKLSAgICAgICAgbVRyYWNraW5nVmlldy5tU2VydmljZSA9IHRoaXM7Ci0gICAgICAgIG1DbG9zZVZpZXcgPSAoQ2xvc2VEcmFnSGFuZGxlKW1UcmFja2luZ1ZpZXcuZmluZFZpZXdCeUlkKFIuaWQuY2xvc2UpOwotICAgICAgICBtQ2xvc2VWaWV3Lm1TZXJ2aWNlID0gdGhpczsKLQotICAgICAgICBtRWRnZUJvcmRlciA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5zdGF0dXNfYmFyX2VkZ2VfaWdub3JlKTsKLQotICAgICAgICAvLyB0aGUgbW9yZSBub3RpZmljYXRpb25zIGljb24KLSAgICAgICAgU3RhdHVzQmFySWNvblZpZXcgbW9yZVZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywgIm1vcmUiKTsKLSAgICAgICAgbW9yZVZpZXcuc2V0KG5ldyBTdGF0dXNCYXJJY29uKG51bGwsIFIuZHJhd2FibGUuc3RhdF9ub3RpZnlfbW9yZSwgMCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uSWNvbnMuYWRkTW9yZVZpZXcobW9yZVZpZXcsCi0gICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRhbCB2aWV3IHZpc2liaWxpdHkKLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKLSAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUyk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Ccm9hZGNhc3RSZWNlaXZlciwgZmlsdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNCYXJWaWV3KCkgewotICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKICAgICAgICAgZmluYWwgaW50IGhlaWdodD0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKIAotICAgICAgICBmaW5hbCBTdGF0dXNCYXJWaWV3IHZpZXcgPSBtU3RhdHVzQmFyVmlldzsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAogICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVIsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19UT1VDSEFCTEVfV0hFTl9XQUtJTkcsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuUkdCWF84ODg4KTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgICAgIGxwLmdyYXZpdHkgPSBnZXRTdGF0dXNCYXJHcmF2aXR5KCk7CiAgICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXIiKTsKICAgICAgICAgLy8gVE9ETyBscC53aW5kb3dBbmltYXRpb25zID0gUi5zdHlsZS5BbmltYXRpb25fU3RhdHVzQmFyOworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhzYiwgbHApOwogCi0gICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KHZpZXcsIGxwKTsKKyAgICAgICAgU2xvZy5kKFRBRywgIkFkZGVkIHN0YXR1cyBiYXIgdmlldyB3LyBncmF2aXR5IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZ3Jhdml0eSkpOwogICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiYWRkSWNvbiBzbG90PSIgKyBzbG90ICsgIiBpbmRleD0iICsgaW5kZXggKyAiIHZpZXdJbmRleD0iICsgdmlld0luZGV4Ci0gICAgICAgICAgICAgICAgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gbmV3IFN0YXR1c0Jhckljb25WaWV3KHRoaXMsIHNsb3QpOwotICAgICAgICB2aWV3LnNldChpY29uKTsKLSAgICAgICAgbVN0YXR1c0ljb25zLmFkZFZpZXcodmlldywgdmlld0luZGV4LCBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwKLSAgICAgICAgICAgIFN0YXR1c0Jhckljb24gb2xkLCBTdGF0dXNCYXJJY29uIGljb24pIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uIHNsb3Q9IiArIHNsb3QgKyAiIGluZGV4PSIgKyBpbmRleCArICIgdmlld0luZGV4PSIgKyB2aWV3SW5kZXgKLSAgICAgICAgICAgICAgICArICIgb2xkPSIgKyBvbGQgKyAiIGljb249IiArIGljb24pOwotICAgICAgICBTdGF0dXNCYXJJY29uVmlldyB2aWV3ID0gKFN0YXR1c0Jhckljb25WaWV3KW1TdGF0dXNJY29ucy5nZXRDaGlsZEF0KHZpZXdJbmRleCk7Ci0gICAgICAgIHZpZXcuc2V0KGljb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJlbW92ZUljb24gc2xvdD0iICsgc2xvdCArICIgaW5kZXg9IiArIGluZGV4ICsgIiB2aWV3SW5kZXg9IiArIHZpZXdJbmRleCk7Ci0gICAgICAgIG1TdGF0dXNJY29ucy5yZW1vdmVWaWV3QXQodmlld0luZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBzaG91bGRUaWNrID0gdHJ1ZTsKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uZnVsbFNjcmVlbkludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaG91bGRUaWNrID0gZmFsc2U7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50OyBzZW5kaW5nIGZ1bGxTY3JlZW5JbnRlbnQiKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5mdWxsU2NyZWVuSW50ZW50LnNlbmQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9IAotCi0gICAgICAgIFN0YXR1c0Jhckljb25WaWV3IGljb25WaWV3ID0gYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOwotICAgICAgICBpZiAoaWNvblZpZXcgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmIChzaG91bGRUaWNrKSB7Ci0gICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2xpZGluZyB3aW5kb3dzIGFuZCB0aGUgdGl0bGVzLgotICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKEVYUEFOREVEX0xFQVZFX0FMT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVOb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBrZXk9IiArIGtleSArICIgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOwotCi0gICAgICAgIE5vdGlmaWNhdGlvbkRhdGEgb2xkTGlzdDsKLSAgICAgICAgaW50IG9sZEluZGV4ID0gbU9uZ29pbmcuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgIGlmIChvbGRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBvbGRMaXN0ID0gbU9uZ29pbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbGRJbmRleCA9IG1MYXRlc3QuZmluZEVudHJ5KGtleSk7Ci0gICAgICAgICAgICBpZiAob2xkSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbiBmb3IgdW5rbm93biBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZExpc3QgPSBtTGF0ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBvbGRMaXN0LmdldEVudHJ5QXQob2xkSW5kZXgpOwotICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOwotICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7Ci0KLSAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OwotCi0gICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgotICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCi0gICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCi0gICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCi0gICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCi0gICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQotICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsICYmIG9sZENvbnRlbnRWaWV3ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG9sZENvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpLmVxdWFscyhjb250ZW50Vmlldy5nZXRQYWNrYWdlKCkpCi0gICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0TGF5b3V0SWQoKSA9PSBjb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIik7Ci0gICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFJlYXBwbHkgdGhlIFJlbW90ZVZpZXdzCi0gICAgICAgICAgICAgICAgY29udGVudFZpZXcucmVhcHBseSh0aGlzLCBvbGRFbnRyeS5jb250ZW50KTsKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvbnRlbnRJbnRlbnQKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IGNvbnRlbnRJbnRlbnQgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRJbnRlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5jb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTGF1bmNoZXIoY29udGVudEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KLSAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCi0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIm5vdCByZXVzaW5nIG5vdGlmaWNhdGlvbiIpOwotICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKLSAgICAgICAgICAgIGFkZE5vdGlmaWNhdGlvblZpZXdzKGtleSwgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKLSAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgIVRleHRVdGlscy5lcXVhbHMobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0LAotICAgICAgICAgICAgICAgICAgICBvbGRFbnRyeS5ub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLnRpY2tlclRleHQpKSB7Ci0gICAgICAgICAgICB0aWNrKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNsaWRpbmcgd2luZG93cyBhbmQgdGhlIHRpdGxlcy4KLSAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7Ci0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uKElCaW5kZXIga2V5KSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGtleT0iICsga2V5KTsKLSAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG9sZCA9IHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7Ci0KLSAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHRpY2tlciBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcKLSAgICAgICAgICAgIG1UaWNrZXIucmVtb3ZlRW50cnkob2xkKTsKLQotICAgICAgICAgICAgLy8gUmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBzbGlkaW5nIHdpbmRvd3MgYW5kIHRoZSB0aXRsZXMuCi0gICAgICAgICAgICBzZXRBcmVUaGVyZU5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjaG9vc2VJY29uSW5kZXgoYm9vbGVhbiBpc09uZ29pbmcsIGludCB2aWV3SW5kZXgpIHsKLSAgICAgICAgZmluYWwgaW50IGxhdGVzdFNpemUgPSBtTGF0ZXN0LnNpemUoKTsKLSAgICAgICAgaWYgKGlzT25nb2luZykgewotICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFNpemUgKyAobU9uZ29pbmcuc2l6ZSgpIC0gdmlld0luZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBsYXRlc3RTaXplIC0gdmlld0luZGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVmlld1tdIG1ha2VOb3RpZmljYXRpb25WaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOwotICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IG4uY29udGVudFZpZXc7Ci0gICAgICAgIGlmIChyZW1vdGVWaWV3cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcm93IHZpZXcKLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKLSAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnN0YXR1c19iYXJfbGF0ZXN0X2V2ZW50LCBwYXJlbnQsIGZhbHNlKTsKLQotICAgICAgICAvLyBiaW5kIHRoZSBjbGljayBldmVudCB0byB0aGUgY29udGVudCBhcmVhCi0gICAgICAgIFZpZXdHcm91cCBjb250ZW50ID0gKFZpZXdHcm91cClyb3cuZmluZFZpZXdCeUlkKFIuaWQuY29udGVudCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwotICAgICAgICBjb250ZW50LnNldE9uRm9jdXNDaGFuZ2VMaXN0ZW5lcihtRm9jdXNDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIFBlbmRpbmdJbnRlbnQgY29udGVudEludGVudCA9IG4uY29udGVudEludGVudDsKLSAgICAgICAgaWYgKGNvbnRlbnRJbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IExhdW5jaGVyKGNvbnRlbnRJbnRlbnQsIG5vdGlmaWNhdGlvbi5wa2csCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udGFnLCBub3RpZmljYXRpb24uaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZXcgZXhwYW5kZWQgPSBudWxsOwotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4cGFuZGVkID0gcmVtb3RlVmlld3MuYXBwbHkodGhpcywgY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhwYW5kZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGlkZW50ID0gbm90aWZpY2F0aW9uLnBrZyArICIvMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhub3RpZmljYXRpb24uaWQpOwotICAgICAgICAgICAgU2xvZy5lKFRBRywgImNvdWxkbid0IGluZmxhdGUgdmlldyBmb3Igbm90aWZpY2F0aW9uICIgKyBpZGVudCwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGVudC5hZGRWaWV3KGV4cGFuZGVkKTsKLSAgICAgICAgICAgIHJvdy5zZXREcmF3aW5nQ2FjaGVFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBWaWV3W10geyByb3csIGNvbnRlbnQsIGV4cGFuZGVkIH07Ci0gICAgfQotCi0gICAgU3RhdHVzQmFySWNvblZpZXcgYWRkTm90aWZpY2F0aW9uVmlld3MoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgTm90aWZpY2F0aW9uRGF0YSBsaXN0OwotICAgICAgICBWaWV3R3JvdXAgcGFyZW50OwotICAgICAgICBmaW5hbCBib29sZWFuIGlzT25nb2luZyA9IG5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKTsKLSAgICAgICAgaWYgKGlzT25nb2luZykgewotICAgICAgICAgICAgbGlzdCA9IG1PbmdvaW5nOwotICAgICAgICAgICAgcGFyZW50ID0gbU9uZ29pbmdJdGVtczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpc3QgPSBtTGF0ZXN0OwotICAgICAgICAgICAgcGFyZW50ID0gbUxhdGVzdEl0ZW1zOwotICAgICAgICB9Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZXhwYW5kZWQgdmlldy4KLSAgICAgICAgZmluYWwgVmlld1tdIHZpZXdzID0gbWFrZU5vdGlmaWNhdGlvblZpZXcobm90aWZpY2F0aW9uLCBwYXJlbnQpOwotICAgICAgICBpZiAodmlld3MgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCBleHBhbmQgUmVtb3RlVmlld3MgZm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbm90aWZpY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFZpZXcgcm93ID0gdmlld3NbMF07Ci0gICAgICAgIGZpbmFsIFZpZXcgY29udGVudCA9IHZpZXdzWzFdOwotICAgICAgICBmaW5hbCBWaWV3IGV4cGFuZGVkID0gdmlld3NbMl07Ci0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KLSAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOwotICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOwotICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRpbmcgY3JlYXRlIGljb246ICIgKyBpYyk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBBZGQgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgIGZpbmFsIGludCB2aWV3SW5kZXggPSBsaXN0LmFkZChrZXksIG5vdGlmaWNhdGlvbiwgcm93LCBjb250ZW50LCBleHBhbmRlZCwgaWNvblZpZXcpOwotICAgICAgICBwYXJlbnQuYWRkVmlldyhyb3csIHZpZXdJbmRleCk7Ci0gICAgICAgIC8vIEFkZCB0aGUgaWNvbi4KLSAgICAgICAgZmluYWwgaW50IGljb25JbmRleCA9IGNob29zZUljb25JbmRleChpc09uZ29pbmcsIHZpZXdJbmRleCk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5hZGRWaWV3KGljb25WaWV3LCBpY29uSW5kZXgsCi0gICAgICAgICAgICAgICAgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMobUljb25TaXplLCBtSWNvblNpemUpKTsKLSAgICAgICAgcmV0dXJuIGljb25WaWV3OwotICAgIH0KLQotICAgIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhJQmluZGVyIGtleSkgewotICAgICAgICBOb3RpZmljYXRpb25EYXRhLkVudHJ5IGVudHJ5ID0gbU9uZ29pbmcucmVtb3ZlKGtleSk7Ci0gICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlbnRyeSA9IG1MYXRlc3QucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJyZW1vdmVOb3RpZmljYXRpb24gZm9yIHVua25vd24ga2V5OiAiICsga2V5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCi0gICAgICAgICgoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKSkucmVtb3ZlVmlldyhlbnRyeS5yb3cpOwotICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCi0gICAgICAgICgoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCkpLnJlbW92ZVZpZXcoZW50cnkuaWNvbik7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5Lm5vdGlmaWNhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCkgewotICAgICAgICBib29sZWFuIG9uZ29pbmcgPSBtT25nb2luZy5oYXNWaXNpYmxlSXRlbXMoKTsKLSAgICAgICAgYm9vbGVhbiBsYXRlc3QgPSBtTGF0ZXN0Lmhhc1Zpc2libGVJdGVtcygpOwotCi0gICAgICAgIC8vIChubyBvbmdvaW5nIG5vdGlmaWNhdGlvbnMgYXJlIGNsZWFyYWJsZSkKLSAgICAgICAgaWYgKG1MYXRlc3QuaGFzQ2xlYXJhYmxlSXRlbXMoKSkgewotICAgICAgICAgICAgbUNsZWFyQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DbGVhckJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1PbmdvaW5nVGl0bGUuc2V0VmlzaWJpbGl0eShvbmdvaW5nID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgbUxhdGVzdFRpdGxlLnNldFZpc2liaWxpdHkobGF0ZXN0ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLQotICAgICAgICBpZiAob25nb2luZyB8fCBsYXRlc3QpIHsKLSAgICAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTm9Ob3RpZmljYXRpb25zVGl0bGUuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTdGF0ZSBpcyBvbmUgb3IgbW9yZSBvZiB0aGUgRElTQUJMRSBjb25zdGFudHMgZnJvbSBTdGF0dXNCYXJNYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoaW50IHN0YXRlKSB7Ci0gICAgICAgIGZpbmFsIGludCBvbGQgPSBtRGlzYWJsZWQ7Ci0gICAgICAgIGZpbmFsIGludCBkaWZmID0gc3RhdGUgXiBvbGQ7Ci0gICAgICAgIG1EaXNhYmxlZCA9IHN0YXRlOwotCi0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOwotICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25JY29uVmlzaWJpbGl0eSh0cnVlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9pbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtVGlja2luZyAmJiAoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVI6IHllcyIpOwotICAgICAgICAgICAgICAgIG1UaWNrZXIuaGFsdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsIGNoYW5nZXMgdG8gdGhlIHN0YXR1cyBiYXIgYW5kIG5vdGlmaWNhdGlvbnMgZnVubmVsIHRocm91Z2ggaGVyZSBhbmQgYXJlIGJhdGNoZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG0ud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEU6Ci0gICAgICAgICAgICAgICAgICAgIGRvQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FOSU1BVEVfUkVWRUFMOgotICAgICAgICAgICAgICAgICAgICBkb1JldmVhbEFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyIG1Gb2N1c0NoYW5nZUxpc3RlbmVyID0gbmV3IFZpZXcuT25Gb2N1c0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkZvY3VzQ2hhbmdlKFZpZXcgdiwgYm9vbGVhbiBoYXNGb2N1cykgewotICAgICAgICAgICAgLy8gQmVjYXVzZSAndicgaXMgYSBWaWV3R3JvdXAsIGFsbCBpdHMgY2hpbGRyZW4gd2lsbCBiZSAodW4pc2VsZWN0ZWQKLSAgICAgICAgICAgIC8vIHRvbywgd2hpY2ggYWxsb3dzIG1hcnF1ZWVpbmcgdG8gd29yay4KLSAgICAgICAgICAgIHYuc2V0U2VsZWN0ZWQoaGFzRm9jdXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYWtlRXhwYW5kZWRWaXNpYmxlKCkgewotICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgIk1ha2UgZXhwYW5kZWQgdmlzaWJsZTogZXhwYW5kZWQgdmlzaWJsZT0iICsgbUV4cGFuZGVkVmlzaWJsZSk7Ci0gICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IHRydWU7Ci0gICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKHRydWUpOwotCi0gICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcyhFWFBBTkRFRF9MRUFWRV9BTE9ORSk7Ci0gICAgICAgIG1FeHBhbmRlZFBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICBtRXhwYW5kZWRWaWV3LnJlcXVlc3RGb2N1cyhWaWV3LkZPQ1VTX0ZPUldBUkQpOwotICAgICAgICBtVHJhY2tpbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICBpZiAoIW1UaWNraW5nKSB7Ci0gICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRlIGV4cGFuZDogZXhwYW5kZWQ9IiArIG1FeHBhbmRlZCk7Ci0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUV4cGFuZGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcmVwYXJlVHJhY2tpbmcoMCwgdHJ1ZSk7Ci0gICAgICAgIHBlcmZvcm1GbGluZygwLCAyMDAwLjBmLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7Ci0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiYW5pbWF0ZUNvbGxhcHNlKCk6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWRWaXNpYmxlPSIgKyBtRXhwYW5kZWRWaXNpYmxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1hdGluZz0iICsgbUFuaW1hdGluZwotICAgICAgICAgICAgICAgICAgICArICIgbUFuaW1ZPSIgKyBtQW5pbVkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB5OwotICAgICAgICBpZiAobUFuaW1hdGluZykgewotICAgICAgICAgICAgeSA9IChpbnQpbUFuaW1ZOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeSA9IG1EaXNwbGF5LmdldEhlaWdodCgpLTE7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTGV0IHRoZSBmbGluZyB0aGluayB0aGF0IHdlJ3JlIG9wZW4gc28gaXQgZ29lcyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uCi0gICAgICAgIC8vIGFuZCBkb2Vzbid0IHRyeSB0byByZS1vcGVuIHRoZSB3aW5kb3dzaGFkZS4KLSAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKLSAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksIGZhbHNlKTsKLSAgICAgICAgcGVyZm9ybUZsaW5nKHksIC0yMDAwLjBmLCB0cnVlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1FeHBhbmQoKSB7Ci0gICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAicGVyZm9ybUV4cGFuZDogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQpOwotICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FeHBhbmRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV4cGFuZGVkID0gdHJ1ZTsKLSAgICAgICAgbWFrZUV4cGFuZGVkVmlzaWJsZSgpOwotICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKLQotICAgICAgICBpZiAoZmFsc2UpIHBvc3RTdGFydFRyYWNpbmcoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHBlcmZvcm1Db2xsYXBzZSgpIHsKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJwZXJmb3JtQ29sbGFwc2U6IG1FeHBhbmRlZD0iICsgbUV4cGFuZGVkCi0gICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKLSAgICAgICAgICAgICAgICArICIgbVRpY2tpbmc9IiArIG1UaWNraW5nKTsKLQotICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgIHZpc2liaWxpdHlDaGFuZ2VkKGZhbHNlKTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzIHw9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRTsKLSAgICAgICAgbUV4cGFuZGVkUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU07Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIG1UcmFja2luZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgPT0gMCkgewotICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLmZhZGVfaW4pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRGF0ZVZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KGZhbHNlLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRXhwYW5kZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGRvQW5pbWF0aW9uKCkgewotICAgICAgICBpZiAobUFuaW1hdGluZykgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiIpOwotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBiZWZvcmUgbUFuaW1ZPSIgKyBtQW5pbVkpOwotICAgICAgICAgICAgaW5jcmVtZW50QW5pbSgpOwotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJkb0FuaW1hdGlvbiBhZnRlciAgbUFuaW1ZPSIgKyBtQW5pbVkpOwotICAgICAgICAgICAgaWYgKG1BbmltWSA+PSBtRGlzcGxheS5nZXRIZWlnaHQoKS0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJBbmltYXRpb24gY29tcGxldGVkIHRvIGV4cGFuZGVkIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgIG1BbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoRVhQQU5ERURfRlVMTF9PUEVOKTsKLSAgICAgICAgICAgICAgICBwZXJmb3JtRXhwYW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtQW5pbVkgPCBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAiQW5pbWF0aW9uIGNvbXBsZXRlZCB0byBjb2xsYXBzZWQgc3RhdGUuIik7Ci0gICAgICAgICAgICAgICAgbUFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygwKTsKLSAgICAgICAgICAgICAgICBwZXJmb3JtQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFKSwgbUN1ckFuaW1hdGlvblRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzdG9wVHJhY2tpbmcoKSB7Ci0gICAgICAgIG1UcmFja2luZyA9IGZhbHNlOwotICAgICAgICBtVmVsb2NpdHlUcmFja2VyLnJlY3ljbGUoKTsKLSAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnRBbmltKCkgewotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBmbG9hdCB0ID0gKChmbG9hdCkobm93IC0gbUFuaW1MYXN0VGltZSkpIC8gMTAwMDsgICAgICAgICAgICAvLyBtcyAtPiBzCi0gICAgICAgIGZpbmFsIGZsb2F0IHkgPSBtQW5pbVk7Ci0gICAgICAgIGZpbmFsIGZsb2F0IHYgPSBtQW5pbVZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKLSAgICAgICAgZmluYWwgZmxvYXQgYSA9IG1BbmltQWNjZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHgvcy9zCi0gICAgICAgIG1BbmltWSA9IHkgKyAodip0KSArICgwLjVmKmEqdCp0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4Ci0gICAgICAgIG1BbmltVmVsID0gdiArIChhKnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB4L3MKLSAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXMKLSAgICAgICAgLy9TbG9nLmQoVEFHLCAieT0iICsgeSArICIgdj0iICsgdiArICIgYT0iICsgYSArICIgdD0iICsgdCArICIgbUFuaW1ZPSIgKyBtQW5pbVkKLSAgICAgICAgLy8gICAgICAgICsgIiBtQW5pbUFjY2VsPSIgKyBtQW5pbUFjY2VsKTsKLSAgICB9Ci0KLSAgICB2b2lkIGRvUmV2ZWFsQW5pbWF0aW9uKCkgewotICAgICAgICBmaW5hbCBpbnQgaCA9IG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCkgKyBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgaWYgKG1BbmltYXRpbmdSZXZlYWwgJiYgbUFuaW1hdGluZyAmJiBtQW5pbVkgPCBoKSB7Ci0gICAgICAgICAgICBpbmNyZW1lbnRBbmltKCk7Ci0gICAgICAgICAgICBpZiAobUFuaW1ZID49IGgpIHsKLSAgICAgICAgICAgICAgICBtQW5pbVkgPSBoOwotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZUV4cGFuZGVkVmlld1BvcygoaW50KW1BbmltWSk7Ci0gICAgICAgICAgICAgICAgbUN1ckFuaW1hdGlvblRpbWUgKz0gQU5JTV9GUkFNRV9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19BTklNQVRFX1JFVkVBTCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByZXBhcmVUcmFja2luZyhpbnQgeSwgYm9vbGVhbiBvcGVuaW5nKSB7Ci0gICAgICAgIG1UcmFja2luZyA9IHRydWU7Ci0gICAgICAgIG1WZWxvY2l0eVRyYWNrZXIgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7Ci0gICAgICAgIGlmIChvcGVuaW5nKSB7Ci0gICAgICAgICAgICBtQW5pbUFjY2VsID0gMjAwMC4wZjsKLSAgICAgICAgICAgIG1BbmltVmVsID0gMjAwOwotICAgICAgICAgICAgbUFuaW1ZID0gbVN0YXR1c0JhclZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoKGludCltQW5pbVkpOwotICAgICAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtQW5pbWF0aW5nUmV2ZWFsID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFX1JFVkVBTCk7Ci0gICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgbUFuaW1MYXN0VGltZSA9IG5vdzsKLSAgICAgICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKLSAgICAgICAgICAgIG1BbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURV9SRVZFQUwpLAotICAgICAgICAgICAgICAgICAgICBtQ3VyQW5pbWF0aW9uVGltZSk7Ci0gICAgICAgICAgICBtYWtlRXhwYW5kZWRWaXNpYmxlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpdCdzIG9wZW4sIGNsb3NlIGl0PwotICAgICAgICAgICAgaWYgKG1BbmltYXRpbmcpIHsKLSAgICAgICAgICAgICAgICBtQW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKHkgKyBtVmlld0RlbHRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcGVyZm9ybUZsaW5nKGludCB5LCBmbG9hdCB2ZWwsIGJvb2xlYW4gYWx3YXlzKSB7Ci0gICAgICAgIG1BbmltYXRpbmdSZXZlYWwgPSBmYWxzZTsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLQotICAgICAgICBtQW5pbVkgPSB5OwotICAgICAgICBtQW5pbVZlbCA9IHZlbDsKLQotICAgICAgICAvL1Nsb2cuZChUQUcsICJzdGFydGluZyB3aXRoIG1BbmltWT0iICsgbUFuaW1ZICsgIiBtQW5pbVZlbD0iICsgbUFuaW1WZWwpOwotCi0gICAgICAgIGlmIChtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgIGlmICghYWx3YXlzICYmICgKLSAgICAgICAgICAgICAgICAgICAgdmVsID4gMjAwLjBmCi0gICAgICAgICAgICAgICAgICAgIHx8ICh5ID4gKG1EaXNwbGF5SGVpZ2h0LTI1KSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQsIGJ1dCB0aGV5IGRpZG4ndCBtb3ZlIHN1ZmZpY2llbnRseSB0byBjYXVzZQotICAgICAgICAgICAgICAgIC8vIHVzIHRvIHJldHJhY3QuICBBbmltYXRlIGJhY2sgdG8gdGhlIGV4cGFuZGVkIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZXhwYW5kZWQgYW5kIGFyZSBub3cgZ29pbmcgdG8gYW5pbWF0ZSBhd2F5LgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAtMjAwMC4wZjsKLSAgICAgICAgICAgICAgICBpZiAodmVsID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtQW5pbVZlbCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGFsd2F5cyB8fCAoCi0gICAgICAgICAgICAgICAgICAgIHZlbCA+IDIwMC4wZgotICAgICAgICAgICAgICAgICAgICB8fCAoeSA+IChtRGlzcGxheUhlaWdodC8yKSAmJiB2ZWwgPiAtMjAwLjBmKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBhbmQgdGhleSBtb3ZlZCBlbm91Z2ggdG8gYWxsb3cgdXMgdG8KLSAgICAgICAgICAgICAgICAvLyBleHBhbmQuICBBbmltYXRlIGluIHRoZSBub3RpZmljYXRpb25zLgotICAgICAgICAgICAgICAgIG1BbmltQWNjZWwgPSAyMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgY29sbGFwc2VkLCBidXQgdGhleSBkaWRuJ3QgbW92ZSBzdWZmaWNpZW50bHkgdG8gY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB1cyB0byByZXRyYWN0LiAgQW5pbWF0ZSBiYWNrIHRvIHRoZSBjb2xsYXBzZWQgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgbUFuaW1BY2NlbCA9IC0yMDAwLjBmOwotICAgICAgICAgICAgICAgIGlmICh2ZWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmltVmVsID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9TbG9nLmQoVEFHLCAibUFuaW1ZPSIgKyBtQW5pbVkgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbAotICAgICAgICAvLyAgICAgICAgKyAiIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOwotCi0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgIG1BbmltTGFzdFRpbWUgPSBub3c7Ci0gICAgICAgIG1DdXJBbmltYXRpb25UaW1lID0gbm93ICsgQU5JTV9GUkFNRV9EVVJBVElPTjsKLSAgICAgICAgbUFuaW1hdGluZyA9IHRydWU7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19BTklNQVRFKTsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0FOSU1BVEVfUkVWRUFMKTsKLSAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQU5JTUFURSksIG1DdXJBbmltYXRpb25UaW1lKTsKLSAgICAgICAgc3RvcFRyYWNraW5nKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpbnRlcmNlcHRUb3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAiVG91Y2g6IHJhd1k9IiArIGV2ZW50LmdldFJhd1koKSArICIgZXZlbnQ9IiArIGV2ZW50ICsgIiBtRGlzYWJsZWQ9IgotICAgICAgICAgICAgICAgICsgbURpc2FibGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobURpc2FibGVkICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IHN0YXR1c0JhclNpemUgPSBtU3RhdHVzQmFyVmlldy5nZXRIZWlnaHQoKTsKLSAgICAgICAgZmluYWwgaW50IGhpdFNpemUgPSBzdGF0dXNCYXJTaXplKjI7Ci0gICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICAgICAgZmluYWwgaW50IHkgPSAoaW50KWV2ZW50LmdldFJhd1koKTsKLQotICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gc3RhdHVzQmFyU2l6ZSAtIHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICBtVmlld0RlbHRhID0gbUFic1Bvc1sxXSArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkgLSB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghbUV4cGFuZGVkICYmIHkgPCBoaXRTaXplKSB8fAotICAgICAgICAgICAgICAgICAgICAobUV4cGFuZGVkICYmIHkgPiAobURpc3BsYXkuZ2V0SGVpZ2h0KCktaGl0U2l6ZSkpKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBkcm9wIGV2ZW50cyBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuIHRvIG1ha2UgdGhlIHdpbmRvd3NoYWRlIGNvbWUKLSAgICAgICAgICAgICAgICAvLyBkb3duIGJ5IGFjY2lkZW50IGxlc3MsIGVzcGVjaWFsbHkgd2hlbiBwdXNoaW5nIG9wZW4gYSBkZXZpY2Ugd2l0aCBhIGtleWJvYXJkCi0gICAgICAgICAgICAgICAgLy8gdGhhdCByb3RhdGVzIChsaWtlIGcxIGFuZCBkcm9pZCkKLSAgICAgICAgICAgICAgICBpbnQgeCA9IChpbnQpZXZlbnQuZ2V0UmF3WCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBlZGdlQm9yZGVyID0gbUVkZ2VCb3JkZXI7Ci0gICAgICAgICAgICAgICAgaWYgKHggPj0gZWRnZUJvcmRlciAmJiB4IDwgbURpc3BsYXkuZ2V0V2lkdGgoKSAtIGVkZ2VCb3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNraW5nKHksICFtRXhwYW5kZWQpOy8vIG9wZW5pbmcgaWYgd2UncmUgbm90IGFscmVhZHkgZnVsbHkgdmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVRyYWNraW5nKSB7Ci0gICAgICAgICAgICBtVmVsb2NpdHlUcmFja2VyLmFkZE1vdmVtZW50KGV2ZW50KTsKLSAgICAgICAgICAgIGZpbmFsIGludCBtaW5ZID0gc3RhdHVzQmFyU2l6ZSArIG1DbG9zZVZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpIHsKLSAgICAgICAgICAgICAgICBpbnQgeSA9IChpbnQpZXZlbnQuZ2V0UmF3WSgpOwotICAgICAgICAgICAgICAgIGlmIChtQW5pbWF0aW5nUmV2ZWFsICYmIHkgPCBtaW5ZKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9IGVsc2UgIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuaW1hdGluZ1JldmVhbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVFeHBhbmRlZFZpZXdQb3MoeSArIG1WaWV3RGVsdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQKSB7Ci0gICAgICAgICAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDApOwotCi0gICAgICAgICAgICAgICAgZmxvYXQgeVZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WVZlbG9jaXR5KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBuZWdhdGl2ZSA9IHlWZWwgPCAwOwotCi0gICAgICAgICAgICAgICAgZmxvYXQgeFZlbCA9IG1WZWxvY2l0eVRyYWNrZXIuZ2V0WFZlbG9jaXR5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHhWZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhWZWwgPSAteFZlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHhWZWwgPiAxNTAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgeFZlbCA9IDE1MC4wZjsgLy8gbGltaXQgaG93IG11Y2ggd2UgY2FyZSBhYm91dCB0aGUgeCBheGlzCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmxvYXQgdmVsID0gKGZsb2F0KU1hdGguaHlwb3QoeVZlbCwgeFZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlbCA9IC12ZWw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGVyZm9ybUZsaW5nKChpbnQpZXZlbnQuZ2V0UmF3WSgpLCB2ZWwsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIExhdW5jaGVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUludGVudDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBrZzsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUlkOwotCi0gICAgICAgIExhdW5jaGVyKFBlbmRpbmdJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKLSAgICAgICAgICAgIG1JbnRlbnQgPSBpbnRlbnQ7Ci0gICAgICAgICAgICBtUGtnID0gcGtnOwotICAgICAgICAgICAgbVRhZyA9IHRhZzsKLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGludGVudCB3ZSBhcmUgc2VuZGluZyBpcyBmb3IgdGhlIGFwcGxpY2F0aW9uLCB3aGljaAotICAgICAgICAgICAgICAgIC8vIHdvbid0IGhhdmUgcGVybWlzc2lvbiB0byBpbW1lZGlhdGVseSBzdGFydCBhbiBhY3Rpdml0eSBhZnRlcgotICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyIHN3aXRjaGVzIHRvIGhvbWUuICBXZSBrbm93IGl0IGlzIHNhZmUgdG8gZG8gYXQgdGhpcwotICAgICAgICAgICAgICAgIC8vIHBvaW50LCBzbyBtYWtlIHN1cmUgbmV3IGFjdGl2aXR5IHN3aXRjaGVzIGFyZSBub3cgYWxsb3dlZC4KLSAgICAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnJlc3VtZUFwcFN3aXRjaGVzKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50W10gcG9zID0gbmV3IGludFsyXTsKLSAgICAgICAgICAgICAgICB2LmdldExvY2F0aW9uT25TY3JlZW4ocG9zKTsKLSAgICAgICAgICAgICAgICBJbnRlbnQgb3ZlcmxheSA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgICAgICBvdmVybGF5LnNldFNvdXJjZUJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHBvc1swXSwgcG9zWzFdLCBwb3NbMF0rdi5nZXRXaWR0aCgpLCBwb3NbMV0rdi5nZXRIZWlnaHQoKSkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlbnQuc2VuZChTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIDAsIG92ZXJsYXkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhY2sgdHJhY2UgaXNuJ3QgdmVyeSBoZWxwZnVsIGhlcmUuICBKdXN0IGxvZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTZW5kaW5nIGNvbnRlbnRJbnRlbnQgZmFpbGVkOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQ2xpY2sobVBrZywgbVRhZywgbUlkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQgaWYgd2UncmUgaGVyZS4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHNoYWRlIGlmIGl0IHdhcyBvcGVuCi0gICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aWNrKFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7Ci0gICAgICAgIC8vIFNob3cgdGhlIHRpY2tlciBpZiBvbmUgaXMgcmVxdWVzdGVkLiBBbHNvIGRvbid0IGRvIHRoaXMKLSAgICAgICAgLy8gdW50aWwgc3RhdHVzIGJhciB3aW5kb3cgaXMgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdyBtYW5hZ2VyLAotICAgICAgICAvLyBiZWNhdXNlLi4uICB3ZWxsLCB3aGF0J3MgdGhlIHBvaW50IG90aGVyd2lzZT8gIEFuZCB0cnlpbmcgdG8KLSAgICAgICAgLy8gcnVuIGEgdGlja2VyIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWQgd2lsbCBjcmFzaCEKLSAgICAgICAgaWYgKG4ubm90aWZpY2F0aW9uLnRpY2tlclRleHQgIT0gbnVsbCAmJiBtU3RhdHVzQmFyVmlldy5nZXRXaW5kb3dUb2tlbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICgwID09IChtRGlzYWJsZWQgJiAoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpKSkgewotICAgICAgICAgICAgICAgIG1UaWNrZXIuYWRkRW50cnkobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWwgdGhpcyBub3RpZmljYXRpb24gYW5kIHRlbGwgdGhlIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIC8gTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UKLSAgICAgKiBhYm91dCB0aGUgZmFpbHVyZS4KLSAgICAgKgotICAgICAqIFdBUk5JTkc6IHRoaXMgd2lsbCBjYWxsIGJhY2sgaW50byB1cy4gIERvbid0IGhvbGQgYW55IGxvY2tzLgotICAgICAqLwotICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE15VGlja2VyIGV4dGVuZHMgVGlja2VyIHsKLSAgICAgICAgTXlUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBTdGF0dXNCYXJWaWV3IHNiKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBzYik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKLSAgICAgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAidGlja2VyU3RhcnRpbmciKTsKLSAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIG1JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF91cF9pbiwgbnVsbCkpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5wdXNoX3VwX291dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgdm9pZCB0aWNrZXJEb25lKCkgewotICAgICAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICJ0aWNrZXJEb25lIik7Ci0gICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOwotICAgICAgICAgICAgbUljb25zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1JY29ucy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0ucHVzaF9kb3duX291dCwgbnVsbCkpOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFZpc2libGUpIHsKLSAgICAgICAgICAgICAgICBzZXREYXRlVmlld1Zpc2liaWxpdHkodHJ1ZSwgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hbmltLnB1c2hfZG93bl9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRpY2tlckhhbHRpbmcoKSB7Ci0gICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInRpY2tlckhhbHRpbmciKTsKLSAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBtSWNvbnMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVRpY2tlclZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luLCBudWxsKSk7Ci0gICAgICAgICAgICBtVGlja2VyVmlldy5zdGFydEFuaW1hdGlvbihsb2FkQW5pbShjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFuaW0uZmFkZV9vdXQsIG51bGwpKTsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGF0ZVZpZXdWaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5pbWF0aW9uIGxvYWRBbmltKGludCBpZCwgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbihTdGF0dXNCYXJTZXJ2aWNlLnRoaXMsIGlkKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmltOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmlld0luZm8oVmlldyB2KSB7Ci0gICAgICAgIHJldHVybiAiKCIgKyB2LmdldExlZnQoKSArICIsIiArIHYuZ2V0VG9wKCkgKyAiKSgiICsgdi5nZXRSaWdodCgpICsgIiwiICsgdi5nZXRCb3R0b20oKQotICAgICAgICAgICAgICAgICsgIiAiICsgdi5nZXRXaWR0aCgpICsgIngiICsgdi5nZXRIZWlnaHQoKSArICIpIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKLSAgICAgICAgICAgICAgICAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFN0YXR1c0JhciBmcm9tIGZyb20gcGlkPSIKLSAgICAgICAgICAgICAgICAgICAgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobVF1ZXVlTG9jaykgewotICAgICAgICAgICAgcHcucHJpbnRsbigiQ3VycmVudCBTdGF0dXMgQmFyIHN0YXRlOiIpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWQ9IiArIG1FeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICArICIsIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2luZz0iICsgbVRpY2tpbmcpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmc9IiArIG1UcmFja2luZyk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1BbmltYXRpbmc9IiArIG1BbmltYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtQW5pbVk9IiArIG1BbmltWSArICIsIG1BbmltVmVsPSIgKyBtQW5pbVZlbAotICAgICAgICAgICAgICAgICAgICArICIsIG1BbmltQWNjZWw9IiArIG1BbmltQWNjZWwpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ3VyQW5pbWF0aW9uVGltZT0iICsgbUN1ckFuaW1hdGlvblRpbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltTGFzdFRpbWU9IiArIG1BbmltTGFzdFRpbWUpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltYXRpbmdSZXZlYWw9IiArIG1BbmltYXRpbmdSZXZlYWwKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1WaWV3RGVsdGE9IiArIG1WaWV3RGVsdGEpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGlzcGxheUhlaWdodD0iICsgbURpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRQYXJhbXM6ICIgKyBtRXhwYW5kZWRQYXJhbXMpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWRWaWV3OiAiICsgdmlld0luZm8obUV4cGFuZGVkVmlldykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRXhwYW5kZWREaWFsb2c6ICIgKyBtRXhwYW5kZWREaWFsb2cpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdQYXJhbXM6ICIgKyBtVHJhY2tpbmdQYXJhbXMpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVHJhY2tpbmdWaWV3OiAiICsgdmlld0luZm8obVRyYWNraW5nVmlldykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ1RpdGxlOiAiICsgdmlld0luZm8obU9uZ29pbmdUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtT25nb2luZ0l0ZW1zOiAiICsgdmlld0luZm8obU9uZ29pbmdJdGVtcykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtTGF0ZXN0VGl0bGU6ICIgKyB2aWV3SW5mbyhtTGF0ZXN0VGl0bGUpKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUxhdGVzdEl0ZW1zOiAiICsgdmlld0luZm8obUxhdGVzdEl0ZW1zKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZTogIiArIHZpZXdJbmZvKG1Ob05vdGlmaWNhdGlvbnNUaXRsZSkpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2xvc2VWaWV3OiAiICsgdmlld0luZm8obUNsb3NlVmlldykpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICBtVGlja2VyVmlldzogIiArIHZpZXdJbmZvKG1UaWNrZXJWaWV3KSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG1TY3JvbGxWaWV3OiAiICsgdmlld0luZm8obVNjcm9sbFZpZXcpCi0gICAgICAgICAgICAgICAgICAgICsgIiBzY3JvbGwgIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFgoKSArICIsIiArIG1TY3JvbGxWaWV3LmdldFNjcm9sbFkoKSk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJtTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0OiAiICsgdmlld0luZm8obU5vdGlmaWNhdGlvbkxpbmVhckxheW91dCkpOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkRhdGEpIHsKLSAgICAgICAgICAgIGludCBOID0gbU5vdGlmaWNhdGlvbkRhdGEub25nb2luZ0NvdW50KCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldE9uZ29pbmcoaSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFsiICsgaSArICJdIGtleT0iICsgbi5rZXkgKyAiIHZpZXc9IiArIG4udmlldyk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICAgICAgICBkYXRhPSIgKyBuLmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTiA9IG1Ob3RpZmljYXRpb25EYXRhLmxhdGVzdENvdW50KCk7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIG9uZ29pbmdDb3VudC5zaXplPSIgKyBOKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdGF0dXNCYXJOb3RpZmljYXRpb24gbiA9IG1Ob3RpZmljYXRpb25EYXRhLmdldExhdGVzdChpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgWyIgKyBpICsgIl0ga2V5PSIgKyBuLmtleSArICIgdmlldz0iICsgbi52aWV3KTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgICAgICAgIGRhdGE9IiArIG4uZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oInNlZSB0aGUgbG9nY2F0IGZvciBhIGR1bXAgb2YgdGhlIHZpZXdzIHdlIGhhdmUgY3JlYXRlZC4iKTsKLSAgICAgICAgICAgIC8vIG11c3QgaGFwcGVuIG9uIHVpIHRocmVhZAotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVN0YXR1c0JhclZpZXc6IC0tLS0tICgiICsgbUFic1Bvc1swXSArICIsIiArIG1BYnNQb3NbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSAiICsgbVN0YXR1c0JhclZpZXcuZ2V0V2lkdGgoKSArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJWaWV3LmRlYnVnKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1FeHBhbmRlZFZpZXcuZ2V0TG9jYXRpb25PblNjcmVlbihtQWJzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJtRXhwYW5kZWRWaWV3OiAtLS0tLSAoIiArIG1BYnNQb3NbMF0gKyAiLCIgKyBtQWJzUG9zWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgIiArIG1FeHBhbmRlZFZpZXcuZ2V0V2lkdGgoKSArICJ4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1FeHBhbmRlZFZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlldy5kZWJ1ZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdWaWV3LmdldExvY2F0aW9uT25TY3JlZW4obUFic1Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAibVRyYWNraW5nVmlldzogLS0tLS0gKCIgKyBtQWJzUG9zWzBdICsgIiwiICsgbUFic1Bvc1sxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpICIgKyBtVHJhY2tpbmdWaWV3LmdldFdpZHRoKCkgKyAieCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja2luZ1ZpZXcuZGVidWcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkJhclZpZXdBdHRhY2hlZCgpIHsKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHA7Ci0gICAgICAgIGludCBwaXhlbEZvcm1hdDsKLSAgICAgICAgRHJhd2FibGUgYmc7Ci0KLSAgICAgICAgLy8vIC0tLS0tLS0tLS0gVHJhY2tpbmcgVmlldyAtLS0tLS0tLS0tLS0tLQotICAgICAgICBwaXhlbEZvcm1hdCA9IFBpeGVsRm9ybWF0LlJHQlhfODg4ODsKLSAgICAgICAgYmcgPSBtVHJhY2tpbmdWaWV3LmdldEJhY2tncm91bmQoKTsKLSAgICAgICAgaWYgKGJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBpeGVsRm9ybWF0ID0gYmcuZ2V0T3BhY2l0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0sCi0gICAgICAgICAgICAgICAgcGl4ZWxGb3JtYXQpOwotLy8gICAgICAgIGxwLnRva2VuID0gbVN0YXR1c0JhclZpZXcuZ2V0V2luZG93VG9rZW4oKTsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7Ci0gICAgICAgIGxwLnNldFRpdGxlKCJUcmFja2luZ1ZpZXciKTsKLSAgICAgICAgbHAueSA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICBtVHJhY2tpbmdQYXJhbXMgPSBscDsKLQotICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtVHJhY2tpbmdWaWV3LCBscCk7Ci0gICAgfQotCi0gICAgdm9pZCBvblRyYWNraW5nVmlld0F0dGFjaGVkKCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscDsKLSAgICAgICAgaW50IHBpeGVsRm9ybWF0OwotICAgICAgICBEcmF3YWJsZSBiZzsKLQotICAgICAgICAvLy8gLS0tLS0tLS0tLSBFeHBhbmRlZCBWaWV3IC0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBpeGVsRm9ybWF0ID0gUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQ7Ci0KLSAgICAgICAgZmluYWwgaW50IGRpc3BoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIGxwID0gbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVDsKLSAgICAgICAgbHAuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKLSAgICAgICAgbHAueCA9IDA7Ci0gICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gbHAueSA9IC1kaXNwaDsgLy8gc3VmZmljaWVudGx5IGxhcmdlIG5lZ2F0aXZlCi0gICAgICAgIGxwLnR5cGUgPSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUw7Ci0gICAgICAgIGxwLmZsYWdzID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9OT19MSU1JVFMKLSAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCi0gICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0RJVEhFUgotICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwotICAgICAgICBscC5mb3JtYXQgPSBwaXhlbEZvcm1hdDsKLSAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuVE9QIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7Ci0gICAgICAgIGxwLnNldFRpdGxlKCJTdGF0dXNCYXJFeHBhbmRlZCIpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QXR0cmlidXRlcyhscCk7Ci0gICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRGb3JtYXQocGl4ZWxGb3JtYXQpOwotICAgICAgICBtRXhwYW5kZWRQYXJhbXMgPSBscDsKLQotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2V0Q29udGVudFZpZXcobUV4cGFuZGVkVmlldywKLSAgICAgICAgICAgICAgICBuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG51bGwpOwotICAgICAgICBtRXhwYW5kZWREaWFsb2cuc2hvdygpOwotICAgICAgICBGcmFtZUxheW91dCBoYWNrID0gKEZyYW1lTGF5b3V0KW1FeHBhbmRlZFZpZXcuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXREYXRlVmlld1Zpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlLCBpbnQgYW5pbSkgewotICAgICAgICBtRGF0ZVZpZXcuc2V0VXBkYXRlcyh2aXNpYmxlKTsKLSAgICAgICAgbURhdGVWaWV3LnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgbURhdGVWaWV3LnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KGJvb2xlYW4gdmlzaWJsZSwgaW50IGFuaW0pIHsKLSAgICAgICAgaW50IG9sZCA9IG1Ob3RpZmljYXRpb25JY29ucy5nZXRWaXNpYmlsaXR5KCk7Ci0gICAgICAgIGludCB2ID0gdmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuSU5WSVNJQkxFOwotICAgICAgICBpZiAob2xkICE9IHYpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KHYpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25zLnN0YXJ0QW5pbWF0aW9uKGxvYWRBbmltKGFuaW0sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlRXhwYW5kZWRWaWV3UG9zKGludCBleHBhbmRlZFBvc2l0aW9uKSB7Ci0gICAgICAgIGlmIChTUEVXKSB7Ci0gICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRXhwYW5kZWRWaWV3UG9zIGJlZm9yZSBleHBhbmRlZFBvc2l0aW9uPSIgKyBleHBhbmRlZFBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQYXJhbXMueT0iIAotICAgICAgICAgICAgICAgICAgICArICgobVRyYWNraW5nUGFyYW1zID09IG51bGwpID8gIj8/PyIgOiBtVHJhY2tpbmdQYXJhbXMueSkKLSAgICAgICAgICAgICAgICAgICAgKyAiIG1UcmFja2luZ1Bvc2l0aW9uPSIgKyBtVHJhY2tpbmdQb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaCA9IG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpOwotICAgICAgICBpbnQgZGlzcGggPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgZXhwYW5kZWQgdmlldyBpcyBub3QgdmlzaWJsZSwgbWFrZSBzdXJlIHRoZXkncmUgc3RpbGwgb2ZmIHNjcmVlbi4KLSAgICAgICAgLy8gTWF5YmUgdGhlIHZpZXcgd2FzIHJlc2l6ZWQuCi0gICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewotICAgICAgICAgICAgaWYgKG1UcmFja2luZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1UcmFja2luZ1Bvc2l0aW9uID0gLWRpc3BoOwotICAgICAgICAgICAgICAgIGlmIChtVHJhY2tpbmdQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtVHJhY2tpbmdQYXJhbXMueSA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkudXBkYXRlVmlld0xheW91dChtVHJhY2tpbmdWaWV3LCBtVHJhY2tpbmdQYXJhbXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOwotICAgICAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cmFja2luZyB2aWV3Li4uCi0gICAgICAgIGludCBwb3M7Ci0gICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0ZVTExfT1BFTikgewotICAgICAgICAgICAgcG9zID0gaDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleHBhbmRlZFBvc2l0aW9uID09IEVYUEFOREVEX0xFQVZFX0FMT05FKSB7Ci0gICAgICAgICAgICBwb3MgPSBtVHJhY2tpbmdQb3NpdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChleHBhbmRlZFBvc2l0aW9uIDw9IGRpc3BoKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gZXhwYW5kZWRQb3NpdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gZGlzcGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MgLT0gZGlzcGgtaDsKLSAgICAgICAgfQotICAgICAgICBtVHJhY2tpbmdQb3NpdGlvbiA9IG1UcmFja2luZ1BhcmFtcy55ID0gcG9zOwotICAgICAgICBtVHJhY2tpbmdQYXJhbXMuaGVpZ2h0ID0gZGlzcGgtaDsKLSAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobVRyYWNraW5nVmlldywgbVRyYWNraW5nUGFyYW1zKTsKLQotICAgICAgICBpZiAobUV4cGFuZGVkUGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DbG9zZVZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtUG9zaXRpb25UbXApOwotICAgICAgICAgICAgZmluYWwgaW50IGNsb3NlUG9zID0gbVBvc2l0aW9uVG1wWzFdOwotCi0gICAgICAgICAgICBtRXhwYW5kZWRDb250ZW50cy5nZXRMb2NhdGlvbkluV2luZG93KG1Qb3NpdGlvblRtcCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudHNCb3R0b20gPSBtUG9zaXRpb25UbXBbMV0gKyBtRXhwYW5kZWRDb250ZW50cy5nZXRIZWlnaHQoKTsKLQotICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBwb3MgKyBtVHJhY2tpbmdWaWV3LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgIC0gKG1UcmFja2luZ1BhcmFtcy5oZWlnaHQtY2xvc2VQb3MpIC0gY29udGVudHNCb3R0b207Ci0gICAgICAgICAgICBpbnQgbWF4ID0gaDsKLSAgICAgICAgICAgIGlmIChtRXhwYW5kZWRQYXJhbXMueSA+IG1heCkgewotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gbWF4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG1pbiA9IG1UcmFja2luZ1Bvc2l0aW9uOwotICAgICAgICAgICAgaWYgKG1FeHBhbmRlZFBhcmFtcy55IDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgbUV4cGFuZGVkUGFyYW1zLnkgPSBtaW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IChtVHJhY2tpbmdQb3NpdGlvbiArIG1UcmFja2luZ1ZpZXcuZ2V0SGVpZ2h0KCkpID4gaDsKLSAgICAgICAgICAgIGlmICghdmlzaWJsZSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50cyBhcmVuJ3QgdmlzaWJsZSwgbW92ZSB0aGUgZXhwYW5kZWQgdmlldyB3YXkgb2ZmIHNjcmVlbgotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHdpbmRvdyBpdHNlbGYgZXh0ZW5kcyBiZWxvdyB0aGUgY29udGVudCB2aWV3LgotICAgICAgICAgICAgICAgIG1FeHBhbmRlZFBhcmFtcy55ID0gLWRpc3BoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUV4cGFuZGVkRGlhbG9nLmdldFdpbmRvdygpLnNldEF0dHJpYnV0ZXMobUV4cGFuZGVkUGFyYW1zKTsKLQotICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGlzbid0IGp1c3QgYSByZXBvc2l0aW9uaW5nIHRoYXQncyBub3Qgc3VwcG9zZWQgdG8gYWZmZWN0Ci0gICAgICAgICAgICAvLyB0aGUgdXNlcidzIHBlcmNlcHRpb24gb2Ygd2hhdCdzIHNob3dpbmcsIGNhbGwgdG8gc2F5IHRoYXQgdGhlIHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkLiAoT3RoZXJ3aXNlLCBzb21lb25lIGVsc2Ugd2lsbCBjYWxsIHRvIGRvIHRoYXQpLgotICAgICAgICAgICAgaWYgKGV4cGFuZGVkUG9zaXRpb24gIT0gRVhQQU5ERURfTEVBVkVfQUxPTkUpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1BFVykgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyB2aXNpYmlsaXR5Q2hhbmdlZCgiICsgdmlzaWJsZSArICIpIik7Ci0gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNoYW5nZWQodmlzaWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU1BFVykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgInVwZGF0ZUV4cGFuZGVkVmlld1BvcyBhZnRlciAgZXhwYW5kZWRQb3NpdGlvbj0iICsgZXhwYW5kZWRQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICArICIgbVRyYWNraW5nUGFyYW1zLnk9IiArIG1UcmFja2luZ1BhcmFtcy55Ci0gICAgICAgICAgICAgICAgICAgICsgIiBtVHJhY2tpbmdQb3NpdGlvbj0iICsgbVRyYWNraW5nUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFBhcmFtcy55PSIgKyBtRXhwYW5kZWRQYXJhbXMueQotICAgICAgICAgICAgICAgICAgICArICIgbUV4cGFuZGVkUGFyYW1zLmhlaWdodD0iICsgbUV4cGFuZGVkUGFyYW1zLmhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgZ2V0RXhwYW5kZWRIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzcGxheS5nZXRIZWlnaHQoKSAtIG1TdGF0dXNCYXJWaWV3LmdldEhlaWdodCgpIC0gbUNsb3NlVmlldy5nZXRIZWlnaHQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUV4cGFuZGVkSGVpZ2h0KCkgewotICAgICAgICBpZiAobUV4cGFuZGVkVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRXhwYW5kZWRQYXJhbXMuaGVpZ2h0ID0gZ2V0RXhwYW5kZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIG1FeHBhbmRlZERpYWxvZy5nZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKG1FeHBhbmRlZFBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgotICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCi0gICAgICogYXJlIGhhbmRsZWQsIGJlY2F1c2UgdGhlIG5vdGlmaWNhdGlvbiBpc24ndCByZWFsbHkgY2FuY2VsbGVkLiAgVGhlIGxpZ2h0cyBhcmUganVzdAotICAgICAqIHR1cm5lZCBvZmYuICBJZiBhbnkgb3RoZXIgbm90aWZpY2F0aW9ucyBoYXBwZW4sIHRoZSBsaWdodHMgd2lsbCB0dXJuIGJhY2sgb24uICBTdGV2ZSBzYXlzCi0gICAgICogdGhpcyBpcyB3aGF0IGhlIHdhbnRzLiAoc2VlIGJ1ZyAxMTMxNDYxKQotICAgICAqLwotICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmIChtUGFuZWxTbGlnaHRseVZpc2libGUgIT0gdmlzaWJsZSkgewotICAgICAgICAgICAgbVBhbmVsU2xpZ2h0bHlWaXNpYmxlID0gdmlzaWJsZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25QYW5lbFJldmVhbGVkKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBXb24ndCBmYWlsIHVubGVzcyB0aGUgd29ybGQgaGFzIGVuZGVkLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwZXJmb3JtRGlzYWJsZUFjdGlvbnMoaW50IG5ldCkgewotICAgICAgICBpbnQgb2xkID0gbURpc2FibGVkOwotICAgICAgICBpbnQgZGlmZiA9IG5ldCBeIG9sZDsKLSAgICAgICAgbURpc2FibGVkID0gbmV0OwotCi0gICAgICAgIC8vIGFjdCBhY2NvcmRpbmdseQotICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOwotICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKLSAgICAgICAgICAgIGlmICgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUykgIT0gMCkgewotICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogeWVzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1UaWNraW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29ucy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uSWNvblZpc2liaWxpdHkoZmFsc2UsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX291dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IG5vIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRXhwYW5kZWRWaXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvbkljb25WaXNpYmlsaXR5KHRydWUsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYW5pbS5mYWRlX2luKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUjogIgotICAgICAgICAgICAgICAgICsgKCgobmV0ICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApCi0gICAgICAgICAgICAgICAgICAgID8gInllcyIgOiAibm8iKSk7Ci0gICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbVRpY2tlci5oYWx0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgotICAgICAgICAgICAgfQotICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQnJvYWRjYXN0UmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKEludGVudC5BQ1RJT05fQ09ORklHVVJBVElPTl9DSEFOR0VELmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogUmVsb2FkIHNvbWUgb2Ygb3VyIHJlc291cmNlcyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBXZSBkb24ndCByZWxvYWQgZXZlcnl0aGluZyB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgLS0gd2UgcHJvYmFibHkKLSAgICAgKiBzaG91bGQsIGJ1dCBnZXR0aW5nIHRoYXQgc21vb3RoIGlzIHRvdWdoLiAgU29tZWRheSB3ZSdsbCBmaXggdGhhdC4gIEluIHRoZQotICAgICAqIG1lYW50aW1lLCBqdXN0IHVwZGF0ZSB0aGUgdGhpbmdzIHRoYXQgd2Uga25vdyBjaGFuZ2UuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVSZXNvdXJjZXMoKSB7Ci0gICAgICAgIFJlc291cmNlcyByZXMgPSBnZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICBtQ2xlYXJCdXR0b24uc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLnN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbikpOwotICAgICAgICBtT25nb2luZ1RpdGxlLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5zdGF0dXNfYmFyX29uZ29pbmdfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1MYXRlc3RUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRzX3RpdGxlKSk7Ci0gICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub19ub3RpZmljYXRpb25zX3RpdGxlKSk7Ci0KLSAgICAgICAgbUVkZ2VCb3JkZXIgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4uc3RhdHVzX2Jhcl9lZGdlX2lnbm9yZSk7Ci0KLSAgICAgICAgaWYgKGZhbHNlKSBTbG9nLnYoVEFHLCAidXBkYXRlUmVzb3VyY2VzIik7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyB0cmFjaW5nCi0gICAgLy8KLQotICAgIHZvaWQgcG9zdFN0YXJ0VHJhY2luZygpIHsKLSAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQobVN0YXJ0VHJhY2luZywgMzAwMCk7Ci0gICAgfQotCi0gICAgdm9pZCB2aWJyYXRlKCkgewotICAgICAgICBhbmRyb2lkLm9zLlZpYnJhdG9yIHZpYiA9IChhbmRyb2lkLm9zLlZpYnJhdG9yKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5WSUJSQVRPUl9TRVJWSUNFKTsKLSAgICAgICAgdmliLnZpYnJhdGUoMjUwKTsKLSAgICB9Ci0KLSAgICBSdW5uYWJsZSBtU3RhcnRUcmFjaW5nID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgICAgICBTeXN0ZW1DbG9jay5zbGVlcCgyNTApOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0YXJ0VHJhY2luZyIpOwotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIi9kYXRhL3N0YXR1c2Jhci10cmFjZXMvdHJhY2UiKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2luZywgMTAwMDApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIFJ1bm5hYmxlIG1TdG9wVHJhY2luZyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgYW5kcm9pZC5vcy5EZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOwotICAgICAgICAgICAgU2xvZy5kKFRBRywgInN0b3BUcmFjaW5nIik7Ci0gICAgICAgICAgICB2aWJyYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0JhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCmluZGV4IDFlMTQwYjkuLjIwZmM0MWYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyVmlldy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwpAQCAtMzQsNyArMzUsNyBAQAogCiAgICAgc3RhdGljIGZpbmFsIGludCBESU1fQU5JTV9USU1FID0gNDAwOwogICAgIAotICAgIFN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CisgICAgUGhvbmVTdGF0dXNCYXJTZXJ2aWNlIG1TZXJ2aWNlOwogICAgIGJvb2xlYW4gbVRyYWNraW5nOwogICAgIGludCBtU3RhcnRYLCBtU3RhcnRZOwogICAgIFZpZXdHcm91cCBtTm90aWZpY2F0aW9uSWNvbnM7CkBAIC00Niw2ICs0Nyw5IEBACiAgICAgaW50IG1TdGFydEFscGhhID0gMCwgbUVuZEFscGhhID0gMDsKICAgICBsb25nIG1FbmRUaW1lID0gMDsKIAorICAgIFJlY3QgbUJ1dHRvbkJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgYm9vbGVhbiBtQ2FwdHVyaW5nRXZlbnRzID0gdHJ1ZTsKKwogICAgIHB1YmxpYyBTdGF0dXNCYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKICAgICB9CkBAIC05NCw3ICs5OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TaXplQ2hhbmdlZChpbnQgdywgaW50IGgsIGludCBvbGR3LCBpbnQgb2xkaCkgewogICAgICAgICBzdXBlci5vblNpemVDaGFuZ2VkKHcsIGgsIG9sZHcsIG9sZGgpOwotICAgICAgICBtU2VydmljZS51cGRhdGVFeHBhbmRlZFZpZXdQb3MoU3RhdHVzQmFyU2VydmljZS5FWFBBTkRFRF9MRUFWRV9BTE9ORSk7CisgICAgICAgIG1TZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkVmlld1BvcyhQaG9uZVN0YXR1c0JhclNlcnZpY2UuRVhQQU5ERURfTEVBVkVfQUxPTkUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTc3LDYgKzE4MSw5IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmICghbUNhcHR1cmluZ0V2ZW50cykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSAhPSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCk7CiAgICAgICAgIH0KQEAgLTE4NSw2ICsxOTIsMTMgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uSW50ZXJjZXB0VG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIGlmIChtQnV0dG9uQm91bmRzLmNvbnRhaW5zKChpbnQpZXZlbnQuZ2V0WCgpLCAoaW50KWV2ZW50LmdldFkoKSkpIHsKKyAgICAgICAgICAgICAgICBtQ2FwdHVyaW5nRXZlbnRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJpbmdFdmVudHMgPSB0cnVlOwogICAgICAgICByZXR1cm4gbVNlcnZpY2UuaW50ZXJjZXB0VG91Y2hFdmVudChldmVudCkKICAgICAgICAgICAgICAgICA/IHRydWUgOiBzdXBlci5vbkludGVyY2VwdFRvdWNoRXZlbnQoZXZlbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RpY2tlci5qYXZhCmluZGV4IDNhNjk3YTYuLmU3YjA1MDkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXIuamF2YQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgVGlja2VyKENvbnRleHQgY29udGV4dCwgU3RhdHVzQmFyVmlldyBzYikgeworICAgIHB1YmxpYyBUaWNrZXIoQ29udGV4dCBjb250ZXh0LCBWaWV3IHNiKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVRpY2tlclZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICB9CiAKIAotICAgIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgewogICAgICAgICBpbnQgaW5pdGlhbENvdW50ID0gbVNlZ21lbnRzLnNpemUoKTsKIAogICAgICAgICAvLyBJZiB3aGF0J3MgYmVpbmcgZGlzcGxheWVkIGhhcyB0aGUgc2FtZSB0ZXh0IGFuZCBpY29uLCBqdXN0IGRyb3AgaXQKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCByZW1vdmVFbnRyeShTdGF0dXNCYXJOb3RpZmljYXRpb24gbikgeworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuKSB7CiAgICAgICAgIGZvciAoaW50IGk9bVNlZ21lbnRzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldChpKTsKICAgICAgICAgICAgIGlmIChuLmlkID09IHNlZy5ub3RpZmljYXRpb24uaWQgJiYgbi5wa2cuZXF1YWxzKHNlZy5ub3RpZmljYXRpb24ucGtnKSkgewpAQCAtMjIxLDEzICsyMjEsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgaGFsdCgpIHsKKyAgICBwdWJsaWMgdm9pZCBoYWx0KCkgewogICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobUFkdmFuY2VUaWNrZXIpOwogICAgICAgICBtU2VnbWVudHMuY2xlYXIoKTsKICAgICAgICAgdGlja2VySGFsdGluZygpOwogICAgIH0KIAotICAgIHZvaWQgcmVmbG93VGV4dCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZWZsb3dUZXh0KCkgewogICAgICAgICBpZiAobVNlZ21lbnRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIFNlZ21lbnQgc2VnID0gbVNlZ21lbnRzLmdldCgwKTsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gc2VnLmdldFRleHQoKTsKQEAgLTI2Niw4ICsyNjYsOCBAQAogICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChtQWR2YW5jZVRpY2tlciwgVElDS0VSX1NFR01FTlRfREVMQVkpOwogICAgIH0KIAotICAgIGFic3RyYWN0IHZvaWQgdGlja2VyU3RhcnRpbmcoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKLSAgICBhYnN0cmFjdCB2b2lkIHRpY2tlckhhbHRpbmcoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJTdGFydGluZygpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRpY2tlckRvbmUoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0aWNrZXJIYWx0aW5nKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVGlja2VyVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKaW5kZXggOTc0OWFlNC4uODE0MDgxMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UaWNrZXJWaWV3LmphdmEKQEAgLTM0LDUgKzM0LDkgQEAKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKICAgICAgICAgbVRpY2tlci5yZWZsb3dUZXh0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGlja2VyKFRpY2tlciB0KSB7CisgICAgICAgIG1UaWNrZXIgPSB0OworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvVHJhY2tpbmdWaWV3LmphdmEKaW5kZXggOTEwOGVlZS4uYzU5ZWI2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9UcmFja2luZ1ZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1RyYWNraW5nVmlldy5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBUcmFja2luZ1ZpZXcgZXh0ZW5kcyBMaW5lYXJMYXlvdXQgewogICAgIGZpbmFsIERpc3BsYXkgbURpc3BsYXk7Ci0gICAgU3RhdHVzQmFyU2VydmljZSBtU2VydmljZTsKKyAgICBQaG9uZVN0YXR1c0JhclNlcnZpY2UgbVNlcnZpY2U7CiAgICAgYm9vbGVhbiBtVHJhY2tpbmc7CiAgICAgaW50IG1TdGFydFgsIG1TdGFydFk7CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L05vdGlmaWNhdGlvbkljb25BcmVhLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9Ob3RpZmljYXRpb25JY29uQXJlYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2Q3NGMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvTm90aWZpY2F0aW9uSWNvbkFyZWEuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKKworcHVibGljIGNsYXNzIE5vdGlmaWNhdGlvbkljb25BcmVhIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGlmaWNhdGlvbkljb25BcmVhIjsKKworICAgIEljb25MYXlvdXQgbUljb25MYXlvdXQ7CisgICAgRHJhZ2dlclZpZXcgbURyYWdnZXJWaWV3OworCisgICAgcHVibGljIE5vdGlmaWNhdGlvbkljb25BcmVhKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBtSWNvbkxheW91dCA9IChJY29uTGF5b3V0KWZpbmRWaWV3QnlJZChSLmlkLmljb25zKTsKKyAgICAgICAgbURyYWdnZXJWaWV3ID0gKERyYWdnZXJWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5oYW5kbGUpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBJY29uTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICAgICAgcHVibGljIEljb25MYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEcmFnZ2VyVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwdWJsaWMgRHJhZ2dlclZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvU3lzdGVtUGFuZWwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxZWYxZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1N5c3RlbVBhbmVsLmphdmEKQEAgLTAsMCArMSw3MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklQb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlckltcGw7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0U3dpdGNoZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlJbnRlbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLkVyaUluZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuVHR5SW50ZW50OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLio7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIFN5c3RlbVBhbmVsIGV4dGVuZHMgTGluZWFyTGF5b3V0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5c3RlbVBhbmVsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gVGFibGV0U3RhdHVzQmFyU2VydmljZS5ERUJVRzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NJR05BTCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX0RJTSArIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQkFDS0xJR0hUID0gYW5kcm9pZC5vcy5Qb3dlci5CUklHSFRORVNTX09OOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JBQ0tMSUdIVCA9IChpbnQpIChhbmRyb2lkLm9zLlBvd2VyLkJSSUdIVE5FU1NfT04gKiAwLjRmKTsKKworICAgIHByaXZhdGUgVGFibGV0U3RhdHVzQmFyU2VydmljZSBtQmFyOworICAgIHByaXZhdGUgYm9vbGVhbiBtQWlycGxhbmVNb2RlOworCisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQnJpZ2h0bmVzc0J1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1Tb3VuZEJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PcmllbnRhdGlvbkJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1BaXJwbGFuZUJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1HcHNCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQmx1ZXRvb3RoQnV0dG9uOworCisgICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUJhdHRlcnlNZXRlcjsKKyAgICBwcml2YXRlIEltYWdlVmlldyBtU2lnbmFsTWV0ZXI7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1CYXR0ZXJ5VGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TaWduYWxUZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFRlbGVwaG9ueU1hbmFnZXIgbVBob25lOworICAgIHByaXZhdGUgZmluYWwgQmx1ZXRvb3RoQWRhcHRlciBtQmx1ZXRvb3RoQWRhcHRlcjsKKworICAgIC8vIHN0YXRlIHRyYWNrZXJzIGZvciB0ZWxlcGhvbnkgY29kZQorICAgIEljY0NhcmQuU3RhdGUgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5SRUFEWTsKKyAgICBpbnQgbVBob25lU3RhdGUgPSBUZWxlcGhvbnlNYW5hZ2VyLkNBTExfU1RBVEVfSURMRTsKKyAgICBpbnQgbURhdGFTdGF0ZSA9IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9ESVNDT05ORUNURUQ7CisgICAgU2VydmljZVN0YXRlIG1TZXJ2aWNlU3RhdGU7CisgICAgU2lnbmFsU3RyZW5ndGggbVNpZ25hbFN0cmVuZ3RoOworCisgICAgLy8gc3RhdGUgZm9yIHRoZSBtZXRlcnMKKyAgICBib29sZWFuIG1XaWZpRW5hYmxlZCwgbVdpZmlDb25uZWN0ZWQ7CisgICAgaW50IG1XaWZpTGV2ZWw7CisgICAgU3RyaW5nIG1XaWZpU3NpZDsKKworICAgIGJvb2xlYW4gbURhdGFFbmFibGVkLCBtRGF0YUNvbm5lY3RlZCwgbURhdGFSb2FtaW5nOworICAgIGludCBtRGF0YUxldmVsOworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHJlZnJlc2hTb3VuZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUJhdHRlcnkoaW50ZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKQorICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pCisgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTikKKyAgICAgICAgICAgICAgICAgICAgfHwgYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVdpZmlTdGF0ZShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKFRlbGVwaG9ueUludGVudHMuQUNUSU9OX1NJTV9TVEFURV9DSEFOR0VEKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNpbVN0YXRlKGludGVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZVNpbVN0YXRlKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgU3RyaW5nIHN0YXRlRXh0cmEgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoSWNjQ2FyZC5JTlRFTlRfS0VZX0lDQ19TVEFURSk7CisgICAgICAgIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9JQ0NfQUJTRU5ULmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX1JFQURZLmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5SRUFEWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9JQ0NfTE9DS0VELmVxdWFscyhzdGF0ZUV4dHJhKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvY2tlZFJlYXNvbiA9IGludGVudC5nZXRTdHJpbmdFeHRyYShJY2NDYXJkLklOVEVOVF9LRVlfTE9DS0VEX1JFQVNPTik7CisgICAgICAgICAgICBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BJTi5lcXVhbHMobG9ja2VkUmVhc29uKSkgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BVSy5lcXVhbHMobG9ja2VkUmVhc29uKSkgeworICAgICAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5ORVRXT1JLX0xPQ0tFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDZG1hKCkgeworICAgICAgICByZXR1cm4gKG1TaWduYWxTdHJlbmd0aCAhPSBudWxsKSAmJiAhbVNpZ25hbFN0cmVuZ3RoLmlzR3NtKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXZkbygpIHsKKyAgICAgICAgcmV0dXJuICggKG1TZXJ2aWNlU3RhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgJiYgKChtU2VydmljZVN0YXRlLmdldFJhZGlvVGVjaG5vbG9neSgpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPXzApCisgICAgICAgICAgICAgICAgICAgICB8fCAobVNlcnZpY2VTdGF0ZS5nZXRSYWRpb1RlY2hub2xvZ3koKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET19BKQorICAgICAgICAgICAgICAgICAgICAgfHwgKG1TZXJ2aWNlU3RhdGUuZ2V0UmFkaW9UZWNobm9sb2d5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQikpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2VydmljZSgpIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChtU2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5TVEFURV9PVVRfT0ZfU0VSVklDRToKKyAgICAgICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5TVEFURV9QT1dFUl9PRkY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldENkbWFMZXZlbCgpIHsKKyAgICAgICAgaWYgKG1TaWduYWxTdHJlbmd0aCA9PSBudWxsKSByZXR1cm4gMDsKKyAgICAgICAgZmluYWwgaW50IGNkbWFEYm0gPSBtU2lnbmFsU3RyZW5ndGguZ2V0Q2RtYURibSgpOworICAgICAgICBmaW5hbCBpbnQgY2RtYUVjaW8gPSBtU2lnbmFsU3RyZW5ndGguZ2V0Q2RtYUVjaW8oKTsKKyAgICAgICAgaW50IGxldmVsRGJtID0gMDsKKyAgICAgICAgaW50IGxldmVsRWNpbyA9IDA7CisKKyAgICAgICAgaWYgKGNkbWFEYm0gPj0gLTc1KSBsZXZlbERibSA9IDQ7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTg1KSBsZXZlbERibSA9IDM7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTk1KSBsZXZlbERibSA9IDI7CisgICAgICAgIGVsc2UgaWYgKGNkbWFEYm0gPj0gLTEwMCkgbGV2ZWxEYm0gPSAxOworICAgICAgICBlbHNlIGxldmVsRGJtID0gMDsKKworICAgICAgICAvLyBFYy9JbyBhcmUgaW4gZEIqMTAKKyAgICAgICAgaWYgKGNkbWFFY2lvID49IC05MCkgbGV2ZWxFY2lvID0gNDsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTExMCkgbGV2ZWxFY2lvID0gMzsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTEzMCkgbGV2ZWxFY2lvID0gMjsKKyAgICAgICAgZWxzZSBpZiAoY2RtYUVjaW8gPj0gLTE1MCkgbGV2ZWxFY2lvID0gMTsKKyAgICAgICAgZWxzZSBsZXZlbEVjaW8gPSAwOworCisgICAgICAgIHJldHVybiAobGV2ZWxEYm0gPCBsZXZlbEVjaW8pID8gbGV2ZWxEYm0gOiBsZXZlbEVjaW87CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0RXZkb0xldmVsKCkgeworICAgICAgICBpZiAobVNpZ25hbFN0cmVuZ3RoID09IG51bGwpIHJldHVybiAwOworICAgICAgICBpbnQgZXZkb0RibSA9IG1TaWduYWxTdHJlbmd0aC5nZXRFdmRvRGJtKCk7CisgICAgICAgIGludCBldmRvU25yID0gbVNpZ25hbFN0cmVuZ3RoLmdldEV2ZG9TbnIoKTsKKyAgICAgICAgaW50IGxldmVsRXZkb0RibSA9IDA7CisgICAgICAgIGludCBsZXZlbEV2ZG9TbnIgPSAwOworCisgICAgICAgIGlmIChldmRvRGJtID49IC02NSkgbGV2ZWxFdmRvRGJtID0gNDsKKyAgICAgICAgZWxzZSBpZiAoZXZkb0RibSA+PSAtNzUpIGxldmVsRXZkb0RibSA9IDM7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9EYm0gPj0gLTkwKSBsZXZlbEV2ZG9EYm0gPSAyOworICAgICAgICBlbHNlIGlmIChldmRvRGJtID49IC0xMDUpIGxldmVsRXZkb0RibSA9IDE7CisgICAgICAgIGVsc2UgbGV2ZWxFdmRvRGJtID0gMDsKKworICAgICAgICBpZiAoZXZkb1NuciA+PSA3KSBsZXZlbEV2ZG9TbnIgPSA0OworICAgICAgICBlbHNlIGlmIChldmRvU25yID49IDUpIGxldmVsRXZkb1NuciA9IDM7CisgICAgICAgIGVsc2UgaWYgKGV2ZG9TbnIgPj0gMykgbGV2ZWxFdmRvU25yID0gMjsKKyAgICAgICAgZWxzZSBpZiAoZXZkb1NuciA+PSAxKSBsZXZlbEV2ZG9TbnIgPSAxOworICAgICAgICBlbHNlIGxldmVsRXZkb1NuciA9IDA7CisKKyAgICAgICAgcmV0dXJuIChsZXZlbEV2ZG9EYm0gPCBsZXZlbEV2ZG9TbnIpID8gbGV2ZWxFdmRvRGJtIDogbGV2ZWxFdmRvU25yOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEYXRhU3RhdGUoKSB7CisgICAgICAgIG1EYXRhQ29ubmVjdGVkID0gaGFzU2VydmljZSgpICYmIChtRGF0YVN0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuREFUQV9DT05ORUNURUQpOworCisgICAgICAgIGlmIChpc0NkbWEoKSkgeworICAgICAgICAgICAgLy8gdGhlc2UgZnVuY3Rpb25zIHJldHVybiBhIHZhbHVlIGZyb20gMCB0byA0LCBpbmNsdXNpdmUKKyAgICAgICAgICAgIGlmICgobVBob25lU3RhdGUgPT0gVGVsZXBob255TWFuYWdlci5DQUxMX1NUQVRFX0lETEUpICYmIGlzRXZkbygpKXsKKyAgICAgICAgICAgICAgICBtRGF0YUxldmVsID0gZ2V0RXZkb0xldmVsKCkgKiAyNTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURhdGFMZXZlbCA9IGdldENkbWFMZXZlbCgpICogMjU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHU00KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGFzdSA9IChtU2lnbmFsU3RyZW5ndGggPT0gbnVsbCkgPyAwIDogbVNpZ25hbFN0cmVuZ3RoLmdldEdzbVNpZ25hbFN0cmVuZ3RoKCk7CisKKyAgICAgICAgICAgIC8vIGFzdSBvbiBbMCwzMV07IDk5ID0gdW5rbm93bgorICAgICAgICAgICAgLy8gQW5kcm9pZCBoYXMgaGlzdG9yaWNhbGx5IHNob3duIGFueXRoaW5nID49MTIgYXMgImZ1bGwiCisgICAgICAgICAgICAvLyBYWFg6IHR1bmUgdGhpcyBiYXNlZCBvbiBJbmR1c3RyeSBCZXN0IFByYWN0aWNlcyhUTSkKKyAgICAgICAgICAgIGlmIChhc3UgPD0gMiB8fCBhc3UgPT0gOTkpIG1EYXRhTGV2ZWwgPSAwOworICAgICAgICAgICAgZWxzZSBtRGF0YUxldmVsID0gKGludCkoKChmbG9hdClNYXRoLm1heChhc3UsIDE1KSAvIDE1KSAqIDEwMCk7CisKKyAgICAgICAgICAgIG1EYXRhUm9hbWluZyA9IG1QaG9uZS5pc05ldHdvcmtSb2FtaW5nKCk7CisKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGVkID0gbURhdGFDb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAmJiAobVNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUkVBRFkgfHwgbVNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuVU5LTk9XTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoREVCVUdfU0lHTkFMIHx8IERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlRGF0YVN0YXRlOiBjb25uZWN0ZWQ9IiArIG1EYXRhQ29ubmVjdGVkIAorICAgICAgICAgICAgICAgICAgICArICIgbGV2ZWw9IiArIG1EYXRhTGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzRXZkbz0iICsgaXNFdmRvKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzQ2RtYT0iICsgaXNDZG1hKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIG1QaG9uZVN0YXRlPSIgKyBtUGhvbmVTdGF0ZQorICAgICAgICAgICAgICAgICAgICArICIgbURhdGFTdGF0ZT0iICsgbURhdGFTdGF0ZQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaWZpU3RhdGUoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoREVCVUcpCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAidXBkYXRlV2lmaVN0YXRlOiAiICsgaW50ZW50KTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOworICAgICAgICBmaW5hbCBib29sZWFuIHdhc0Nvbm5lY3RlZCA9IG1XaWZpQ29ubmVjdGVkOworCisgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICBtV2lmaUVuYWJsZWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9VTktOT1dOKSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSAoTmV0d29ya0luZm8pCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgIG1XaWZpQ29ubmVjdGVkID0gbmV0d29ya0luZm8gIT0gbnVsbCAmJiBuZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgZGV0YWlsZWRTdGF0ZSA9IFdpZmlJbmZvLmdldERldGFpbGVkU3RhdGVPZigKKyAgICAgICAgICAgICAgICAgICAgKFN1cHBsaWNhbnRTdGF0ZSlpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSkpOworICAgICAgICAgICAgbVdpZmlDb25uZWN0ZWQgPSBkZXRhaWxlZFN0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdSc3NpID0gaW50ZW50LmdldEludEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19SU1NJLCAtMjAwKTsKKyAgICAgICAgICAgIGludCBuZXdTaWduYWxMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKG5ld1Jzc2ksIDEwMSk7CisgICAgICAgICAgICBtV2lmaUxldmVsID0gbVdpZmlDb25uZWN0ZWQgPyBuZXdTaWduYWxMZXZlbCA6IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVdpZmlDb25uZWN0ZWQgJiYgIXdhc0Nvbm5lY3RlZCkgeworICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpTWFuYWdlci5nZXRDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgaWYgKERFQlVHKQorICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJ1cGRhdGVXaWZpU3RhdGU6IGp1c3QgY29ubmVjdGVkOiBpbmZvPSIgKyBpbmZvKTsKKworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIGluaXRpYWwgc2lnbmFsIHN0cmVuZ3RoCisgICAgICAgICAgICAgICAgbVdpZmlMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKGluZm8uZ2V0UnNzaSgpLCAxMDEpOworCisgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgU1NJRAorICAgICAgICAgICAgICAgIG1XaWZpU3NpZCA9IGluZm8uZ2V0U1NJRCgpOworICAgICAgICAgICAgICAgIGlmIChtV2lmaVNzaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBPSywgaXQncyBub3QgaW4gdGhlIGNvbm5lY3Rpb25JbmZvOyB3ZSBoYXZlIHRvIGdvIGh1bnRpbmcgZm9yIGl0CisgICAgICAgICAgICAgICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0gbVdpZmlNYW5hZ2VyLmdldENvbmZpZ3VyZWROZXR3b3JrcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIG5ldCA6IG5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV0Lm5ldHdvcmtJZCA9PSBpbmZvLmdldE5ldHdvcmtJZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlTc2lkID0gbmV0LlNTSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWZyZXNoU2lnbmFsTWV0ZXJzKCk7CisgICAgfQorCisgICAgLy8gZmlndXJlIG91dCB3aGF0IHRvIHNob3c6IGZpcnN0IHdpZmksIHRoZW4gM0csIHRoZW4gbm90aGluZworICAgIHZvaWQgcmVmcmVzaFNpZ25hbE1ldGVycygpIHsKKyAgICAgICAgaWYgKG1TaWduYWxNZXRlciA9PSBudWxsKSByZXR1cm47IC8vIG5vIFVJIHlldAorCisgICAgICAgIENvbnRleHQgY3R4dCA9IGdldENvbnRleHQoKTsKKworICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7CisgICAgICAgIGludCBsZXZlbCA9IDA7CisKKyAgICAgICAgaWYgKG1XaWZpQ29ubmVjdGVkKSB7CisgICAgICAgICAgICBpZiAobVdpZmlTc2lkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3R4dC5nZXRTdHJpbmcoUi5zdHJpbmcuc3lzdGVtX3BhbmVsX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX3dpZmlfc3NpZF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3NpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXZlbCA9IG1XaWZpTGV2ZWw7CisgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2RhdGFfY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGxldmVsID0gbURhdGFMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHQgPSBjdHh0LmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCk7CisgICAgICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl9zaWduYWwpOworICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCk7CisgICAgICAgIG1TaWduYWxUZXh0LnNldFRleHQodGV4dCk7CisKKyAgICAgICAgLy8gaGFjayBmb3Igbm93CisgICAgICAgIG1CYXIuc2V0U2lnbmFsTWV0ZXIobGV2ZWwsIG1XaWZpQ29ubmVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXIoVGFibGV0U3RhdHVzQmFyU2VydmljZSBiYXIpIHsKKyAgICAgICAgbUJhciA9IGJhcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCYXR0ZXJ5KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGxldmVsID0gaW50ZW50LmdldEludEV4dHJhKCJsZXZlbCIsIDApOworICAgICAgICBmaW5hbCBib29sZWFuIHBsdWdnZWQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoInBsdWdnZWQiLCAwKSAhPSAwOworCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl9iYXR0ZXJ5KTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKGxldmVsKTsKKyAgICAgICAgbUJhdHRlcnlUZXh0LnNldFRleHQoZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5zeXN0ZW1fcGFuZWxfYmF0dGVyeV9tZXRlcl9mb3JtYXQsIGxldmVsKSk7CisKKyAgICAgICAgLy8gaGFjayBmb3Igbm93CisgICAgICAgIG1CYXIuc2V0QmF0dGVyeU1ldGVyKGxldmVsLCBwbHVnZ2VkKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN5c3RlbVBhbmVsKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBTeXN0ZW1QYW5lbChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisKKyAgICAgICAgLy8gZ2V0IG5vdGlmaWVkIG9mIHBob25lIHN0YXRlIGNoYW5nZXMKKyAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoVGVsZXBob255TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICB0ZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgUGhvbmVTdGF0ZUxpc3RlbmVyLkxJU1RFTl9TSUdOQUxfU1RSRU5HVEhTCisgICAgICAgICAgICAgICAgICAgICAgICB8IFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9TVEFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQUNUSVZJVFkpOworCisgICAgICAgIC8vIHdpZmkgc3RhdHVzIGluZm8KKyAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOworICAgICAgICAKKyAgICAgICAgLy8gYXVkaW8gc3RhdHVzIAorICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworCisgICAgICAgIC8vIG1vYmlsZSBkYXRhIAorICAgICAgICBtUGhvbmUgPSAoVGVsZXBob255TWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisKKyAgICAgICAgLy8gQmx1ZXRvb3RoCisgICAgICAgIG1CbHVldG9vdGhBZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgVGV4dFZpZXcgc2V0dGluZ3NCdXR0b24gPSAoVGV4dFZpZXcpZmluZFZpZXdCeUlkKFIuaWQuc2V0dGluZ3NfYnV0dG9uKTsKKyAgICAgICAgc2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnN0YXJ0QWN0aXZpdHkobmV3IEludGVudChhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLkFDVElPTl9TRVRUSU5HUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSykpOworICAgICAgICAgICAgICAgIG1CYXIuYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICB9fSk7CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYnJpZ2h0bmVzcyk7CisgICAgICAgIG1CcmlnaHRuZXNzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHJvdGF0ZUJyaWdodG5lc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVNvdW5kQnV0dG9uID0gKEltYWdlQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNvdW5kKTsKKyAgICAgICAgbVNvdW5kQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNldFNpbGVudE1vZGUoIWdldFNpbGVudE1vZGUoKSk7CisgICAgICAgICAgICAgICAgbVNvdW5kQnV0dG9uLnNldEFscGhhKGdldFNpbGVudE1vZGUoKSA/IDB4N0YgOiAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1PcmllbnRhdGlvbkJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5vcmllbnRhdGlvbik7CisgICAgICAgIG1PcmllbnRhdGlvbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChnZXRDb250ZXh0KCksICJPcmllbnRhdGlvbiBjb250cm9sIG5vdCBpbXBsZW1lbnRlZDsgcGxlYXNlIGFkanVzdCBuZWNrIGFuZ2xlLiIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtQWlycGxhbmVCdXR0b24gPSAoSW1hZ2VCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuYWlycGxhbmUpOworICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0QWxwaGEobUFpcnBsYW5lTW9kZSA/IDB4RkYgOiAweDdGKTsKKyAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbmV3TW9kZSA9ICFnZXRBaXJwbGFuZU1vZGUoKTsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChnZXRDb250ZXh0KCksICJBdHRlbXB0aW5nIHRvIHR1cm4gIgorICAgICAgICAgICAgICAgICAgICArIChuZXdNb2RlID8gIm9uIiA6ICJvZmYiKSArICIgYWlycGxhbmUgbW9kZSAoZmxha3kpLiIsCisgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIHNldEFpcnBsYW5lTW9kZShuZXdNb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUdwc0J1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5ncHMpOworICAgICAgICBtR3BzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRvZ2dsZUdwcygpOworICAgICAgICAgICAgICAgIHJlZnJlc2hHcHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbUJsdWV0b290aEJ1dHRvbiA9IChJbWFnZUJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5ibHVldG9vdGgpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHRvZ2dsZUJsdWV0b290aCgpOworICAgICAgICAgICAgICAgIHJlZnJlc2hCbHVldG9vdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgZm9yIGJyb2FkY2FzdHMKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihBdWRpb01hbmFnZXIuUklOR0VSX01PREVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQkFUVEVSWV9DSEFOR0VEKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlJbnRlbnRzLkFDVElPTl9TSU1fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRCk7CisgICAgICAgIGdldENvbnRleHQoKS5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyKTsKKyAgICAgICAgCisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIgPSAoSW1hZ2VWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmJhdHRlcnlfbWV0ZXIpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfYmF0dGVyeSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKyAgICAgICAgbVNpZ25hbE1ldGVyID0gKEltYWdlVmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfbWV0ZXIpOworICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlUmVzb3VyY2UoUi5kcmF3YWJsZS5zeXNiYXJfc2lnbmFsKTsKKyAgICAgICAgbUJhdHRlcnlNZXRlci5zZXRJbWFnZUxldmVsKDApOworCisgICAgICAgIG1CYXR0ZXJ5VGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5iYXR0ZXJ5X2luZm8pOworICAgICAgICBtU2lnbmFsVGV4dCA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zaWduYWxfaW5mbyk7CisKKyAgICAgICAgcmVmcmVzaFNpZ25hbE1ldGVycygpOworICAgICAgICByZWZyZXNoQmx1ZXRvb3RoKCk7CisgICAgICAgIHJlZnJlc2hHcHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgZ2V0Q29udGV4dCgpLnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gICAgcHJpdmF0ZSBib29sZWFuIGlzQXV0b0JyaWdodG5lc3MoKSB7CisvLyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworLy8gICAgICAgIHRyeSB7CisvLyAgICAgICAgICAgIElQb3dlck1hbmFnZXIgcG93ZXIgPSBJUG93ZXJNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisvLyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisvLyAgICAgICAgICAgIGlmIChwb3dlciAhPSBudWxsKSB7CisvLyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTU19NT0RFKTsKKy8vICAgICAgICAgICAgICAgIHJldHVybiBicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUM7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworLy8gICAgICAgIH0gY2F0Y2ggKFNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisvLyAgICAgICAgfQorLy8gICAgICAgIHJldHVybiBmYWxzZTsKKy8vICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByb3RhdGVCcmlnaHRuZXNzKCkgeworICAgICAgICBpbnQgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3M7CisgICAgICAgIGludCBiZyA9IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbjsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlciA9IElQb3dlck1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAocG93ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTKTsKKyAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9NQU5VQUw7CisgICAgICAgICAgICAgICAgLy9Pbmx5IGdldCBicmlnaHRuZXNzIHNldHRpbmcgaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfYXV0b21hdGljX2JyaWdodG5lc3NfYXZhaWxhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzTW9kZSA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQoY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSBBVVRPIC0+IE1JTklNVU0gLT4gREVGQVVMVCAtPiBNQVhJTVVNCisgICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIG5vdCBhIHRvZ2dsZS4uLgorICAgICAgICAgICAgICAgIGlmIChicmlnaHRuZXNzTW9kZSA9PSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IE1JTklNVU1fQkFDS0xJR0hUOworICAgICAgICAgICAgICAgICAgICBpY29uID0gUi5kcmF3YWJsZS5pY19zeXNiYXJfYnJpZ2h0bmVzc19sb3c7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA8IERFRkFVTFRfQkFDS0xJR0hUKSB7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBERUZBVUxUX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJyaWdodG5lc3MgPCBNQVhJTVVNX0JBQ0tMSUdIVCkgeworICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gTUFYSU1VTV9CQUNLTElHSFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUgPSBTZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX0JSSUdIVE5FU1NfTU9ERV9BVVRPTUFUSUM7CisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBNSU5JTVVNX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgaWNvbiA9IFIuZHJhd2FibGUuaWNfc3lzYmFyX2JyaWdodG5lc3NfYXV0bzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19hdXRvbWF0aWNfYnJpZ2h0bmVzc19hdmFpbGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBzY3JlZW4gYnJpZ2h0bmVzcyBtb2RlIChhdXRvbWF0aWMgb3IgbWFudWFsKQorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0ucHV0SW50KGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzc01vZGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGJyaWdodG5lc3MgaWYgYXV0b21hdGljIG1vZGUgaXNuJ3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3NNb2RlID0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnJpZ2h0bmVzc01vZGUgPT0gU2V0dGluZ3MuU3lzdGVtLlNDUkVFTl9CUklHSFRORVNTX01PREVfTUFOVUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHBvd2VyLnNldEJhY2tsaWdodEJyaWdodG5lc3MoYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoY3IsIFNldHRpbmdzLlN5c3RlbS5TQ1JFRU5fQlJJR0hUTkVTUywgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShpY29uKTsKKyAgICAgICAgbUJyaWdodG5lc3NCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKGJnKTsKKyAgICB9CisKKyAgICBQaG9uZVN0YXRlTGlzdGVuZXIgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZWQoU2VydmljZVN0YXRlIHNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgaWYgKERFQlVHX1NJR05BTCB8fCBERUJVRykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJwaG9uZSBzZXJ2aWNlIHN0YXRlIGNoYW5nZWQ6ICIgKyBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc2VydmljZVN0YXRlOworICAgICAgICAgICAgbUFpcnBsYW5lTW9kZSA9IHNlcnZpY2VTdGF0ZS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9QT1dFUl9PRkY7CisgICAgICAgICAgICBpZiAobUFpcnBsYW5lQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWlycGxhbmVCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZShtQWlycGxhbmVNb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfYWlycGxhbmVfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2FpcnBsYW5lX29mZik7CisgICAgICAgICAgICAgICAgbUFpcnBsYW5lQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShtQWlycGxhbmVNb2RlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLnN5c2Jhcl90b2dnbGVfYmdfb2ZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNpZ25hbFN0cmVuZ3Roc0NoYW5nZWQoU2lnbmFsU3RyZW5ndGggc2lnbmFsU3RyZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25TaWduYWxTdHJlbmd0aHNDaGFuZ2VkOiAiICsgc2lnbmFsU3RyZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNpZ25hbFN0cmVuZ3RoID0gc2lnbmFsU3RyZW5ndGg7CisgICAgICAgICAgICB1cGRhdGVEYXRhU3RhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DYWxsU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSwgU3RyaW5nIGluY29taW5nTnVtYmVyKSB7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgLy8gSW4gY2RtYSwgaWYgYSB2b2ljZSBjYWxsIGlzIG1hZGUsIFJTU0kgc2hvdWxkIHN3aXRjaCB0byAxeC4KKyAgICAgICAgICAgIGlmIChpc0NkbWEoKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZURhdGFTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLCBpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgIGlmIChERUJVR19TSUdOQUwgfHwgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZDogc3RhdGU9IiArIHN0YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHR5cGU9IiArIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EYXRhU3RhdGUgPSBzdGF0ZTsKKy8vICAgICAgICAgICAgdXBkYXRlRGF0YU5ldFR5cGUobmV0d29ya1R5cGUpOworICAgICAgICAgICAgdXBkYXRlRGF0YVN0YXRlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEFpcnBsYW5lTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BaXJwbGFuZU1vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEFpcnBsYW5lTW9kZShib29sZWFuIG9uKSB7CisgICAgICAgIFNldHRpbmdzLlN5c3RlbS5wdXRJbnQoCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLkFJUlBMQU5FX01PREVfT04sCisgICAgICAgICAgICAgICAgb24gPyAxIDogMCk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fQUlSUExBTkVfTU9ERV9DSEFOR0VEKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgic3RhdGUiLCBvbik7CisgICAgICAgIGdldENvbnRleHQoKS5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgYm9vbGVhbiBnZXRTaWxlbnRNb2RlKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvTWFuYWdlci5nZXRSaW5nZXJNb2RlKCkgIT0gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTDsKKyAgICB9CisKKyAgICB2b2lkIHNldFNpbGVudE1vZGUoYm9vbGVhbiBvbikgeworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZSgoU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uVklCUkFURV9JTl9TSUxFTlQsIDEpID09IDEpCisgICAgICAgICAgICAgICAgPyBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfVklCUkFURQorICAgICAgICAgICAgICAgIDogQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX1NJTEVOVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hTb3VuZCgpIHsKKyAgICAgICAgYm9vbGVhbiBzaWxlbnQgPSBnZXRTaWxlbnRNb2RlKCk7CisgICAgICAgIG1Tb3VuZEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKCFzaWxlbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfc291bmRfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl9zb3VuZF9vZmYpOworICAgICAgICBtU291bmRCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKCFzaWxlbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgfQorCisgICAgdm9pZCB0b2dnbGVCbHVldG9vdGgoKSB7CisgICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmIChtQmx1ZXRvb3RoQWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZGlzYWJsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsdWV0b290aEFkYXB0ZXIuZW5hYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hCbHVldG9vdGgoKSB7CisgICAgICAgIGJvb2xlYW4gb24gPSBtQmx1ZXRvb3RoQWRhcHRlciAhPSBudWxsICYmIG1CbHVldG9vdGhBZGFwdGVyLmlzRW5hYmxlZCgpOworICAgICAgICBtQmx1ZXRvb3RoQnV0dG9uLnNldEltYWdlUmVzb3VyY2Uob24gPyBSLmRyYXdhYmxlLmljX3N5c2Jhcl9ibHVldG9vdGhfb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5pY19zeXNiYXJfYmx1ZXRvb3RoX29mZik7CisgICAgICAgIG1CbHVldG9vdGhCdXR0b24uc2V0QmFja2dyb3VuZFJlc291cmNlKG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUi5kcmF3YWJsZS5zeXNiYXJfdG9nZ2xlX2JnX29mZik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzR3BzRW5hYmxlZCgpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmlzTG9jYXRpb25Qcm92aWRlckVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgTG9jYXRpb25NYW5hZ2VyLkdQU19QUk9WSURFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZUdwcygpIHsKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnNldExvY2F0aW9uUHJvdmlkZXJFbmFibGVkKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIExvY2F0aW9uTWFuYWdlci5HUFNfUFJPVklERVIsICFpc0dwc0VuYWJsZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hHcHMoKSB7CisgICAgICAgIGJvb2xlYW4gb24gPSBpc0dwc0VuYWJsZWQoKTsKKyAgICAgICAgbUdwc0J1dHRvbi5zZXRJbWFnZVJlc291cmNlKG9uID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfZ3BzX29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfc3lzYmFyX2dwc19vZmYpOworICAgICAgICBtR3BzQnV0dG9uLnNldEJhY2tncm91bmRSZXNvdXJjZShvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuc3lzYmFyX3RvZ2dsZV9iZ19vZmYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmExZmFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNzc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXJJbXBsOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3M7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0U3dpdGNoZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFySWNvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuU3RhdHVzQmFyTm90aWZpY2F0aW9uOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLio7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBUYWJsZXRTdGF0dXNCYXJTZXJ2aWNlIGV4dGVuZHMgU3RhdHVzQmFyU2VydmljZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlRhYmxldFN0YXR1c0JhciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lNQUdFX0xFVkVMID0gMTAwMDA7CisKKyAgICBpbnQgbUljb25TaXplOworCisgICAgSCBtSGFuZGxlciA9IG5ldyBIKCk7CisKKyAgICAvLyB0cmFja2luZyBhbGwgY3VycmVudCBub3RpZmljYXRpb25zCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25EYXRhIG1Ob3RucyA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CisgICAgCisgICAgVmlldyBtU3RhdHVzQmFyVmlldzsKKyAgICBOb3RpZmljYXRpb25JY29uQXJlYSBtTm90aWZpY2F0aW9uSWNvbkFyZWE7CisKKyAgICBWaWV3IG1Ob3RpZmljYXRpb25QYW5lbDsKKyAgICBTeXN0ZW1QYW5lbCBtU3lzdGVtUGFuZWw7CisKKyAgICBWaWV3R3JvdXAgbVBpbGU7CisgICAgVGV4dFZpZXcgbUNsZWFyQnV0dG9uOworCisgICAgSW1hZ2VWaWV3IG1CYXR0ZXJ5TWV0ZXI7CisgICAgSW1hZ2VWaWV3IG1TaWduYWxNZXRlcjsKKyAgICBJbWFnZVZpZXcgbVNpZ25hbEljb247CisKKyAgICBWaWV3IG1CYXJDb250ZW50czsKKyAgICBWaWV3IG1DdXJ0YWluczsKKworICAgIE5vdGlmaWNhdGlvbkljb25BcmVhLkljb25MYXlvdXQgbUljb25MYXlvdXQ7CisKKyAgICBLaWNrZXJDb250cm9sbGVyIG1LaWNrZXI7CisgICAgVmlldyBtS2lja2VyVmlldzsKKyAgICBib29sZWFuIG1UaWNraW5nOworICAgIGJvb2xlYW4gbUV4cGFuZGVkVmlzaWJsZTsKKworICAgIC8vIGZvciBkaXNhYmxpbmcgdGhlIHN0YXR1cyBiYXIKKyAgICBpbnQgbURpc2FibGVkID0gMDsKKworICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhbmVsV2luZG93cygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworICAgICAgICBmaW5hbCBpbnQgYmFySGVpZ2h0PSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2hlaWdodCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsID0gVmlldy5pbmZsYXRlKHRoaXMsIFIubGF5b3V0LnN5c2Jhcl9wYW5lbF9ub3RpZmljYXRpb25zLCBudWxsKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA0MDAsIC8vIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfU1RBVFVTX0JBUl9QQU5FTCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0xBWU9VVF9JTl9TQ1JFRU4KKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9UT1VDSF9NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfV0FUQ0hfT1VUU0lERV9UT1VDSAorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX0ZPQ1VTQUJMRQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuTEVGVDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIk5vdGlmaWNhdGlvblBhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TbGlkaW5nQ2FyZDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtTm90aWZpY2F0aW9uUGFuZWwsIGxwKTsKKworICAgICAgICBtU3lzdGVtUGFuZWwgPSAoU3lzdGVtUGFuZWwpIFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zeXNiYXJfcGFuZWxfc3lzdGVtLCBudWxsKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICA4MDAsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIX01PREFMCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19XQVRDSF9PVVRTSURFX1RPVUNICisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNLAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIlN5c3RlbVBhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9TbGlkaW5nQ2FyZDsKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtU3lzdGVtUGFuZWwsIGxwKTsKKyAgICAgICAgbVN5c3RlbVBhbmVsLnNldEJhcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoKTsgLy8gd2lsbCBhZGQgdGhlIG1haW4gYmFyIHZpZXcKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVmlldyBtYWtlU3RhdHVzQmFyVmlldygpIHsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGdldFJlc291cmNlcygpOworCisgICAgICAgIG1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisKKyAgICAgICAgZmluYWwgVmlldyBzYiA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5zdGF0dXNfYmFyLCBudWxsKTsKKyAgICAgICAgbVN0YXR1c0JhclZpZXcgPSBzYjsKKworICAgICAgICBtQmFyQ29udGVudHMgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5iYXJfY29udGVudHMpOworICAgICAgICBtQ3VydGFpbnMgPSBzYi5maW5kVmlld0J5SWQoUi5pZC5saWdodHNfb3V0KTsKKyAgICAgICAgVmlldyBzeXN0ZW1JbmZvID0gc2IuZmluZFZpZXdCeUlkKFIuaWQuc3lzdGVtSW5mbyk7CisKKyAgICAgICAgc3lzdGVtSW5mby5zZXRPbkxvbmdDbGlja0xpc3RlbmVyKG5ldyBTZXRMaWdodHNPbkxpc3RlbmVyKGZhbHNlKSk7CisKKyAgICAgICAgU2V0TGlnaHRzT25MaXN0ZW5lciBvbiA9IG5ldyBTZXRMaWdodHNPbkxpc3RlbmVyKHRydWUpOworICAgICAgICBtQ3VydGFpbnMuc2V0T25DbGlja0xpc3RlbmVyKG9uKTsKKyAgICAgICAgbUN1cnRhaW5zLnNldE9uTG9uZ0NsaWNrTGlzdGVuZXIob24pOworCisgICAgICAgIC8vIHRoZSBtb3JlIG5vdGlmaWNhdGlvbnMgaWNvbgorICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEgPSAoTm90aWZpY2F0aW9uSWNvbkFyZWEpc2IuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uSWNvbnMpOworCisgICAgICAgIC8vIHdoZXJlIHRoZSBpY29ucyBnbworICAgICAgICBtSWNvbkxheW91dCA9IChOb3RpZmljYXRpb25JY29uQXJlYS5JY29uTGF5b3V0KSBzYi5maW5kVmlld0J5SWQoUi5pZC5pY29ucyk7CisKKyAgICAgICAgbUtpY2tlciA9IG5ldyBLaWNrZXJDb250cm9sbGVyKChDb250ZXh0KXRoaXMsIG1TdGF0dXNCYXJWaWV3KTsKKworICAgICAgICAvLyBTeXN0ZW0gaW5mbyAoY2VudGVyKQorICAgICAgICBtQmF0dGVyeU1ldGVyID0gKEltYWdlVmlldykgc2IuZmluZFZpZXdCeUlkKFIuaWQuYmF0dGVyeSk7CisgICAgICAgIG1TaWduYWxNZXRlciA9IChJbWFnZVZpZXcpIHNiLmZpbmRWaWV3QnlJZChSLmlkLnNpZ25hbCk7CisgICAgICAgIG1TaWduYWxJY29uID0gKEltYWdlVmlldykgc2IuZmluZFZpZXdCeUlkKFIuaWQuc2lnbmFsX2ljb24pOworCisgICAgICAgIC8vIEFkZCB0aGUgd2luZG93cworICAgICAgICBhZGRQYW5lbFdpbmRvd3MoKTsKKworICAgICAgICBtUGlsZSA9IChWaWV3R3JvdXApbU5vdGlmaWNhdGlvblBhbmVsLmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICAKKyAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IChTY3JvbGxWaWV3KW1QaWxlLmdldFBhcmVudCgpOworICAgICAgICBzY3JvbGxlci5zZXRGaWxsVmlld3BvcnQodHJ1ZSk7CisKKyAgICAgICAgbUNsZWFyQnV0dG9uID0gKFRleHRWaWV3KW1Ob3RpZmljYXRpb25QYW5lbC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKKyAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CisKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0U3RhdHVzQmFyR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUw7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCA9IDEwMDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9TWVNURU1fUEFORUwgPSAxMDEwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMID0gMTAxMTsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgbm90aWZpY2F0aW9ucyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBtRXhwYW5kZWRWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIG5vdGlmaWNhdGlvbnMgcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvblBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZGVkVmlzaWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19PUEVOX1NZU1RFTV9QQU5FTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAib3BlbmluZyBzeXN0ZW0gcGFuZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xPU0VfU1lTVEVNX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIHN5c3RlbSBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXR0ZXJ5TWV0ZXIoaW50IGxldmVsLCBib29sZWFuIHBsdWdnZWQpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYmF0dGVyeT0iICsgbGV2ZWwgKyAocGx1Z2dlZCA/ICIgLSBwbHVnZ2VkIiA6ICIgLSB1bnBsdWdnZWQiKSk7CisgICAgICAgIG1CYXR0ZXJ5TWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl9iYXR0ZXJ5bWluaSk7CisgICAgICAgIC8vIGFkanVzdCBwZXJjZW50IHRvIHBlcm15cmlhZCBmb3IgQ2xpcERyYXdhYmxlJ3Mgc2FrZQorICAgICAgICBtQmF0dGVyeU1ldGVyLnNldEltYWdlTGV2ZWwobGV2ZWwgKiAoTUFYX0lNQUdFX0xFVkVMIC8gMTAwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2lnbmFsTWV0ZXIoaW50IGxldmVsLCBib29sZWFuIGlzV2lmaSkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJzaWduYWw9IiArIGxldmVsKTsKKyAgICAgICAgaWYgKGxldmVsIDwgMCkgeworICAgICAgICAgICAgbVNpZ25hbE1ldGVyLnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VMZXZlbCgwKTsKKyAgICAgICAgICAgIG1TaWduYWxJY29uLnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnN5c2Jhcl93aWZpbWluaSk7CisgICAgICAgICAgICAvLyBhZGp1c3QgdG8gcGVybXlyaWFkCisgICAgICAgICAgICBtU2lnbmFsTWV0ZXIuc2V0SW1hZ2VMZXZlbChsZXZlbCAqIChNQVhfSU1BR0VfTEVWRUwgLyAxMDApKTsKKyAgICAgICAgICAgIG1TaWduYWxJY29uLnNldEltYWdlUmVzb3VyY2UoaXNXaWZpID8gUi5kcmF3YWJsZS5pY19zeXNiYXJfd2lmaV9taW5pIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSLmRyYXdhYmxlLmljX3N5c2Jhcl93aWZpX21pbmkpOyAvLyBYWFgKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCwgU3RhdHVzQmFySWNvbiBpY29uKSB7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImFkZEljb24oIiArIHNsb3QgKyAiKSAtPiAiICsgaWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlSWNvbihTdHJpbmcgc2xvdCwgaW50IGluZGV4LCBpbnQgdmlld0luZGV4LAorICAgICAgICAgICAgU3RhdHVzQmFySWNvbiBvbGQsIFN0YXR1c0Jhckljb24gaWNvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJ1cGRhdGVJY29uKCIgKyBzbG90ICsgIikgLT4gIiArIGljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QsIGludCBpbmRleCwgaW50IHZpZXdJbmRleCkgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJyZW1vdmVJY29uKCIgKyBzbG90ICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZmljYXRpb24oSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYWRkTm90aWZpY2F0aW9uKCIgKyBrZXkgKyAiIC0+ICIgKyBub3RpZmljYXRpb24gKyAiKSIpOworICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisKKyAgICAgICAgYm9vbGVhbiBpbW1lcnNpdmUgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpOworICAgICAgICAgICAgU2xvZy5kKFRBRywgIlRvcCBhY3Rpdml0eSBpcyAiICsgKGltbWVyc2l2ZT8iaW1tZXJzaXZlIjoibm90IGltbWVyc2l2ZSIpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltbWVyc2l2ZSkgeworICAgICAgICAgICAgLy8gVE9ETzogaW1tZXJzaXZlIG1vZGUgcG9wdXBzIGZvciB0YWJsZXQKKyAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm90IGltbWVyc2l2ZSAmIGEgZnVsbC1zY3JlZW4gYWxlcnQgc2hvdWxkIGJlIHNob3duCisgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTm90aWZpY2F0aW9uIGhhcyBmdWxsU2NyZWVuSW50ZW50IGFuZCBhY3Rpdml0eSBpcyBub3QgaW1tZXJzaXZlOyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNlbmRpbmcgZnVsbFNjcmVlbkludGVudCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmZ1bGxTY3JlZW5JbnRlbnQuc2VuZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aWNrKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihJQmluZGVyIGtleSwgU3RhdHVzQmFyTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJ1cGRhdGVOb3RpZmljYXRpb24oIiArIGtleSArICIgLT4gIiArIG5vdGlmaWNhdGlvbiArICIpIC8vIFRPRE8iKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgb2xkRW50cnkgPSBtTm90bnMuZmluZEJ5S2V5KGtleSk7CisgICAgICAgIGlmIChvbGRFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAidXBkYXRlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdGF0dXNCYXJOb3RpZmljYXRpb24gb2xkTm90aWZpY2F0aW9uID0gb2xkRW50cnkubm90aWZpY2F0aW9uOworICAgICAgICBmaW5hbCBSZW1vdGVWaWV3cyBvbGRDb250ZW50VmlldyA9IG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uY29udGVudFZpZXc7CisKKyAgICAgICAgZmluYWwgUmVtb3RlVmlld3MgY29udGVudFZpZXcgPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworCisgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9sZCBub3RpZmljYXRpb246IHdoZW49IiArIG9sZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24ud2hlbgorICAgICAgICAgICAgICAgICAgICArICIgb25nb2luZz0iICsgb2xkTm90aWZpY2F0aW9uLmlzT25nb2luZygpCisgICAgICAgICAgICAgICAgICAgICsgIiBleHBhbmRlZD0iICsgb2xkRW50cnkuZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBvbGRDb250ZW50Vmlldyk7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAibmV3IG5vdGlmaWNhdGlvbjogd2hlbj0iICsgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgICAgICsgIiBvbmdvaW5nPSIgKyBvbGROb3RpZmljYXRpb24uaXNPbmdvaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRlbnRWaWV3PSIgKyBjb250ZW50Vmlldyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW4gd2UganVzdCByZWFwcGx5IHRoZSBSZW1vdGVWaWV3cyBpbiBwbGFjZT8gIElmIHdoZW4gZGlkbid0IGNoYW5nZSwgdGhlIG9yZGVyCisgICAgICAgIC8vIGRpZG4ndCBjaGFuZ2UuCisgICAgICAgIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLndoZW4gPT0gb2xkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi53aGVuCisgICAgICAgICAgICAgICAgJiYgbm90aWZpY2F0aW9uLmlzT25nb2luZygpID09IG9sZE5vdGlmaWNhdGlvbi5pc09uZ29pbmcoKQorICAgICAgICAgICAgICAgICYmIG9sZEVudHJ5LmV4cGFuZGVkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb250ZW50VmlldyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgb2xkQ29udGVudFZpZXcuZ2V0UGFja2FnZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRQYWNrYWdlKCkuZXF1YWxzKGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSkKKyAgICAgICAgICAgICAgICAmJiBvbGRDb250ZW50Vmlldy5nZXRMYXlvdXRJZCgpID09IGNvbnRlbnRWaWV3LmdldExheW91dElkKCkpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInJldXNpbmcgbm90aWZpY2F0aW9uIGZvciBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgb2xkRW50cnkubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBSZWFwcGx5IHRoZSBSZW1vdGVWaWV3cworICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnJlYXBwbHkodGhpcywgb2xkRW50cnkuY29udGVudCk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb250ZW50SW50ZW50CisgICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OworICAgICAgICAgICAgICAgIGlmIChjb250ZW50SW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkRW50cnkuY29udGVudC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoY29udGVudEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLnBrZywgbm90aWZpY2F0aW9uLnRhZywgbm90aWZpY2F0aW9uLmlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaWNvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uaWNvbiwgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLm51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKCFvbGRFbnRyeS5pY29uLnNldChpYykpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3Ioa2V5LCBub3RpZmljYXRpb24sICJDb3VsZG4ndCB1cGRhdGUgaWNvbjogIiArIGljKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBmYWlsZWQgdG8gYWRkIGNsZWFubHkuICBMb2csIGFuZCByZW1vdmUgdGhlIHZpZXcgZnJvbSB0aGUgcGFuZWwuCisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNvdWxkbid0IHJlYXBwbHkgdmlld3MgZm9yIHBhY2thZ2UgIiArIGNvbnRlbnRWaWV3LmdldFBhY2thZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uVmlld3Moa2V5KTsKKyAgICAgICAgICAgICAgICBhZGROb3RpZmljYXRpb25WaWV3cyhrZXksIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJub3QgcmV1c2luZyBub3RpZmljYXRpb24gZm9yIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZW1vdmVOb3RpZmljYXRpb25WaWV3cyhrZXkpOworICAgICAgICAgICAgYWRkTm90aWZpY2F0aW9uVmlld3Moa2V5LCBub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IGtpY2tlcjsgaW1tZXJzaXZlIG1vZGUKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb24oSUJpbmRlciBrZXkpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uKCIgKyBrZXkgKyAiKSAvLyBUT0RPIik7CisgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKGtleSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzYWJsZShpbnQgc3RhdGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgZmluYWwgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgZmluYWwgaW50IGRpZmYgPSBzdGF0ZSBeIG9sZDsKKyAgICAgICAgbURpc2FibGVkID0gc3RhdGU7CisKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChzdGF0ZSAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9FWFBBTkQ6IHllcyIpOworICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpY2tpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbUtpY2tlci5oYWx0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TOiBubyIpOworICAgICAgICAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoZGlmZiAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobVRpY2tpbmcgJiYgKHN0YXRlICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PVElGSUNBVElPTl9USUNLRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fVElDS0VSOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBtS2lja2VyLmhhbHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KKworICAgIHZvaWQgcGVyZm9ybURpc2FibGVBY3Rpb25zKGludCBuZXQpIHsKKyAgICAgICAgLyoKKyAgICAgICAgaW50IG9sZCA9IG1EaXNhYmxlZDsKKyAgICAgICAgaW50IGRpZmYgPSBuZXQgXiBvbGQ7CisgICAgICAgIG1EaXNhYmxlZCA9IG5ldDsKKworICAgICAgICAvLyBhY3QgYWNjb3JkaW5nbHkKKyAgICAgICAgaWYgKChkaWZmICYgU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX0VYUEFORCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkRJU0FCTEVfRVhQQU5EOiB5ZXMiKTsKKyAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG5ldCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRElTQUJMRV9OT1RJRklDQVRJT05fSUNPTlM6IHllcyIpOworICAgICAgICAgICAgICAgIGlmIChtVGlja2luZykgeworICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25JY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJESVNBQkxFX05PVElGSUNBVElPTl9JQ09OUzogbm8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1FeHBhbmRlZFZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkljb25BcmVhLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRpZmYgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1UaWNraW5nICYmIChuZXQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikgIT0gMCkgeworICAgICAgICAgICAgICAgIG1LaWNrZXIuaGFsdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRpY2soU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgLy8gU2hvdyB0aGUgdGlja2VyIGlmIG9uZSBpcyByZXF1ZXN0ZWQuIEFsc28gZG9uJ3QgZG8gdGhpcworICAgICAgICAvLyB1bnRpbCBzdGF0dXMgYmFyIHdpbmRvdyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93IG1hbmFnZXIsCisgICAgICAgIC8vIGJlY2F1c2UuLi4gIHdlbGwsIHdoYXQncyB0aGUgcG9pbnQgb3RoZXJ3aXNlPyAgQW5kIHRyeWluZyB0bworICAgICAgICAvLyBydW4gYSB0aWNrZXIgd2l0aG91dCBiZWluZyBhdHRhY2hlZCB3aWxsIGNyYXNoIQorICAgICAgICBpZiAobi5ub3RpZmljYXRpb24udGlja2VyVGV4dCAhPSBudWxsICYmIG1TdGF0dXNCYXJWaWV3LmdldFdpbmRvd1Rva2VuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CisgICAgICAgICAgICAgICAgbUtpY2tlci5hZGRFbnRyeShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgS2lja2VyQ29udHJvbGxlciB7CisgICAgICAgIFZpZXcgbVZpZXc7CisgICAgICAgIEltYWdlVmlldyBtS2lja2VySWNvbjsKKyAgICAgICAgVGV4dFN3aXRjaGVyIG1LaWNrZXJUZXh0OworCisgICAgICAgIHB1YmxpYyBLaWNrZXJDb250cm9sbGVyKENvbnRleHQgY29udGV4dCwgVmlldyBzYikgeworICAgICAgICAgICAgbVZpZXcgPSBzYi5maW5kVmlld0J5SWQoUi5pZC50aWNrZXIpOworICAgICAgICAgICAgbUtpY2tlckljb24gPSAoSW1hZ2VWaWV3KSBtVmlldy5maW5kVmlld0J5SWQoUi5pZC50aWNrZXJJY29uKTsKKyAgICAgICAgICAgIG1LaWNrZXJUZXh0ID0gKFRleHRTd2l0Y2hlcikgbVZpZXcuZmluZFZpZXdCeUlkKFIuaWQudGlja2VyVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBoYWx0KCkgeworICAgICAgICAgICAgdGlja2VySGFsdGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkRW50cnkoU3RhdHVzQmFyTm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgICAgIG1LaWNrZXJJY29uLnNldEltYWdlUmVzb3VyY2Uobi5ub3RpZmljYXRpb24uaWNvbik7CisgICAgICAgICAgICBtS2lja2VyVGV4dC5zZXRDdXJyZW50VGV4dChuLm5vdGlmaWNhdGlvbi50aWNrZXJUZXh0KTsKKyAgICAgICAgICAgIHRpY2tlclN0YXJ0aW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0aWNrZXJTdGFydGluZygpIHsKKyAgICAgICAgICAgIG1UaWNraW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1LaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRpY2tlckRvbmUoKSB7CisgICAgICAgICAgICBtSWNvbkxheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtS2lja2VyVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtVGlja2luZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdGlja2VySGFsdGluZygpIHsKKyAgICAgICAgICAgIG1JY29uTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1LaWNrZXJWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaWNraW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19PUEVOX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpIHsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShILk1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwpOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlnaHRzT24oYm9vbGVhbiBvbikgeworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIG1DdXJ0YWlucy5zZXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigoQ29udGV4dCl0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLmxpZ2h0c19vdXRfb3V0KSk7CisgICAgICAgICAgICBtQ3VydGFpbnMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUJhckNvbnRlbnRzLnNldEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKChDb250ZXh0KXRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0uc3RhdHVzX2Jhcl9pbikpOworICAgICAgICAgICAgbUJhckNvbnRlbnRzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworICAgICAgICAgICAgbUN1cnRhaW5zLnNldEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKChDb250ZXh0KXRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBSLmFuaW0ubGlnaHRzX291dF9pbikpOworICAgICAgICAgICAgbUN1cnRhaW5zLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1CYXJDb250ZW50cy5zZXRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigoQ29udGV4dCl0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLnN0YXR1c19iYXJfb3V0KSk7CisgICAgICAgICAgICBtQmFyQ29udGVudHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZpY2F0aW9uSWNvbnNDbGlja2VkKFZpZXcgdikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIG5vdGlmaWNhdGlvbiBpY29ucyIpOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhILk1TR19DTE9TRV9TWVNURU1fUEFORUwpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKEguTVNHX0NMT1NFX1NZU1RFTV9QQU5FTCk7CisKKyAgICAgICAgaW50IG1zZyA9IChtTm90aWZpY2F0aW9uUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgCisgICAgICAgICAgICA/IEguTVNHX09QRU5fTk9USUZJQ0FUSU9OX1BBTkVMCisgICAgICAgICAgICA6IEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTDsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobXNnKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN5c3RlbUluZm9DbGlja2VkKFZpZXcgdikgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIHN5c3RlbSBpbmZvIik7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKEguTVNHX0NMT1NFX05PVElGSUNBVElPTl9QQU5FTCk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoSC5NU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BBTkVMKTsKKworICAgICAgICBpbnQgbXNnID0gKG1TeXN0ZW1QYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSAKKyAgICAgICAgICAgID8gSC5NU0dfT1BFTl9TWVNURU1fUEFORUwKKyAgICAgICAgICAgIDogSC5NU0dfQ0xPU0VfU1lTVEVNX1BBTkVMOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVjZW50QnV0dG9uQ2xpY2tlZChWaWV3IHYpIHsKKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiY2xpY2tlZCByZWNlbnQgYXBwcyIpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKKyAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGlzIG5vdGlmaWNhdGlvbiBhbmQgdGVsbCB0aGUgc3RhdHVzIGJhciBzZXJ2aWNlIGFib3V0IHRoZSBmYWlsdXJlLiBIb2xkIG5vIGxvY2tzLgorICAgICAqLworICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXJyb3IoSUJpbmRlciBrZXksIFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBuLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZW1vdmVOb3RpZmljYXRpb24oa2V5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CYXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uRXJyb3Iobi5wa2csIG4udGFnLCBuLmlkLCBuLnVpZCwgbi5pbml0aWFsUGlkLCBtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBUaGUgZW5kIGlzIG5pZ2guCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFZpZXcuT25DbGlja0xpc3RlbmVyIG1DbGVhckJ1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbkNsZWFyQWxsTm90aWZpY2F0aW9ucygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBjbGFzcyBOb3RpZmljYXRpb25DbGlja2VyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUludGVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBrZzsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUlkOworCisgICAgICAgIE5vdGlmaWNhdGlvbkNsaWNrZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICAgICAgbUludGVudCA9IGludGVudDsKKyAgICAgICAgICAgIG1Qa2cgPSBwa2c7CisgICAgICAgICAgICBtVGFnID0gdGFnOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IHdlIGFyZSBzZW5kaW5nIGlzIGZvciB0aGUgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgLy8gd29uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IGFuIGFjdGl2aXR5IGFmdGVyCisgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgc3dpdGNoZXMgdG8gaG9tZS4gIFdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBhdCB0aGlzCisgICAgICAgICAgICAgICAgLy8gcG9pbnQsIHNvIG1ha2Ugc3VyZSBuZXcgYWN0aXZpdHkgc3dpdGNoZXMgYXJlIG5vdyBhbGxvd2VkLgorICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkucmVzdW1lQXBwU3dpdGNoZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRbXSBwb3MgPSBuZXcgaW50WzJdOworICAgICAgICAgICAgICAgIHYuZ2V0TG9jYXRpb25PblNjcmVlbihwb3MpOworICAgICAgICAgICAgICAgIEludGVudCBvdmVybGF5ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIG92ZXJsYXkuc2V0U291cmNlQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3QocG9zWzBdLCBwb3NbMV0sIHBvc1swXSt2LmdldFdpZHRoKCksIHBvc1sxXSt2LmdldEhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVudC5zZW5kKFRhYmxldFN0YXR1c0JhclNlcnZpY2UudGhpcywgMCwgb3ZlcmxheSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayB0cmFjZSBpc24ndCB2ZXJ5IGhlbHBmdWwgaGVyZS4gIEp1c3QgbG9nIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNlbmRpbmcgY29udGVudEludGVudCBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhclNlcnZpY2Uub25Ob3RpZmljYXRpb25DbGljayhtUGtnLCBtVGFnLCBtSWQpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc2hhZGUgaWYgaXQgd2FzIG9wZW4KKyAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZSgpOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGNsaWNrIHdhcyBvbiB0aGUgaW50cnVkZXIgYWxlcnQsIGhpZGUgdGhhdCBpbnN0ZWFkCisvLyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0hJREVfSU5UUlVERVIpOworICAgICAgICB9CisgICAgfQorCisgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHJlbW92ZU5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5KSB7CisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBtTm90bnMucmVtb3ZlKGtleSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVtb3ZlTm90aWZpY2F0aW9uIGZvciB1bmtub3duIGtleTogIiArIGtleSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIFZpZXdHcm91cCByb3dQYXJlbnQgPSAoVmlld0dyb3VwKWVudHJ5LnJvdy5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHJvd1BhcmVudCAhPSBudWxsKSByb3dQYXJlbnQucmVtb3ZlVmlldyhlbnRyeS5yb3cpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGljb24uCisvLyAgICAgICAgVmlld0dyb3VwIGljb25QYXJlbnQgPSAoVmlld0dyb3VwKWVudHJ5Lmljb24uZ2V0UGFyZW50KCk7CisvLyAgICAgICAgaWYgKGljb25QYXJlbnQgIT0gbnVsbCkgaWNvblBhcmVudC5yZW1vdmVWaWV3KGVudHJ5Lmljb24pOworICAgICAgICByZWZyZXNoSWNvbnMoKTsKKworICAgICAgICByZXR1cm4gZW50cnkubm90aWZpY2F0aW9uOworICAgIH0KKworICAgIFN0YXR1c0Jhckljb25WaWV3IGFkZE5vdGlmaWNhdGlvblZpZXdzKElCaW5kZXIga2V5LCBTdGF0dXNCYXJOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZE5vdGlmaWNhdGlvblZpZXdzKGtleT0iICsga2V5ICsgIiwgbm90aWZpY2F0aW9uPSIgKyBub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaWNvbi4KKyAgICAgICAgZmluYWwgU3RhdHVzQmFySWNvblZpZXcgaWNvblZpZXcgPSBuZXcgU3RhdHVzQmFySWNvblZpZXcodGhpcywKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ucGtnICsgIi8weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG5vdGlmaWNhdGlvbi5pZCkpOworICAgICAgICBpY29uVmlldy5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5DRU5URVJfSU5TSURFKTsKKworICAgICAgICBmaW5hbCBTdGF0dXNCYXJJY29uIGljID0gbmV3IFN0YXR1c0Jhckljb24obm90aWZpY2F0aW9uLnBrZywKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5pY29uLAorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uLmljb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5udW1iZXIpOworICAgICAgICBpZiAoIWljb25WaWV3LnNldChpYykpIHsKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbkVycm9yKGtleSwgbm90aWZpY2F0aW9uLCAiQ291bGRuJ3QgYXR0YWNoIFN0YXR1c0Jhckljb246ICIgKyBpYyk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGV4cGFuZGVkIHZpZXcuCisgICAgICAgIE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnkgPSBuZXcgTm90aWZpY2F0aW9uRGF0YS5FbnRyeShrZXksIG5vdGlmaWNhdGlvbiwgaWNvblZpZXcpOworICAgICAgICBpZiAoIWluZmxhdGVWaWV3cyhlbnRyeSwgbVBpbGUpKSB7CisgICAgICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25FcnJvcihrZXksIG5vdGlmaWNhdGlvbiwgIkNvdWxkbid0IGV4cGFuZCBSZW1vdGVWaWV3cyBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHRoZSBpY29uLgorICAgICAgICBtTm90bnMuYWRkKGVudHJ5KTsKKyAgICAgICAgcmVmcmVzaEljb25zKCk7CisKKyAgICAgICAgcmV0dXJuIGljb25WaWV3OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoSWNvbnMoKSB7CisgICAgICAgIC8vIFhYWDogbmVlZCB0byBpbXBsZW1lbnQgYSBuZXcgbGltaXRlZCBsaW5lYXIgbGF5b3V0IGNsYXNzCisgICAgICAgIC8vIHRvIGF2b2lkIHJlbW92aW5nICYgcmVhZGRpbmcgZXZlcnl0aGluZworCisgICAgICAgIGludCBOID0gbU5vdG5zLnNpemUoKTsKKyAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPSBuZXcgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcyhtSWNvblNpemUsIG1JY29uU2l6ZSk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVmcmVzaGluZyBpY29ucyAoIiArIE4gKyAiIG5vdGlmaWNhdGlvbnMsIG1JY29uTGF5b3V0PSIKKyAgICAgICAgICAgICAgICAgICAgKyBtSWNvbkxheW91dCArICIsIG1QaWxlPSIgKyBtUGlsZSk7CisgICAgICAgIH0KKworICAgICAgICBtSWNvbkxheW91dC5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaT49TikgYnJlYWs7CisgICAgICAgICAgICBtSWNvbkxheW91dC5hZGRWaWV3KG1Ob3Rucy5nZXQoTi1pLTEpLmljb24sIGksIHBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBtUGlsZS5yZW1vdmVBbGxWaWV3cygpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICBtUGlsZS5hZGRWaWV3KG1Ob3Rucy5nZXQoTi1pLTEpLnJvdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5mbGF0ZVZpZXdzKE5vdGlmaWNhdGlvbkRhdGEuRW50cnkgZW50cnksIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgU3RhdHVzQmFyTm90aWZpY2F0aW9uIHNibiA9IGVudHJ5Lm5vdGlmaWNhdGlvbjsKKyAgICAgICAgUmVtb3RlVmlld3MgcmVtb3RlVmlld3MgPSBzYm4ubm90aWZpY2F0aW9uLmNvbnRlbnRWaWV3OworICAgICAgICBpZiAocmVtb3RlVmlld3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByb3cgdmlldworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTEFZT1VUX0lORkxBVEVSX1NFUlZJQ0UpOworICAgICAgICBWaWV3IHJvdyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnQsIHBhcmVudCwgZmFsc2UpOworICAgICAgICBWaWV3IHZldG9CdXR0b24gPSByb3cuZmluZFZpZXdCeUlkKFIuaWQudmV0byk7CisgICAgICAgIGZpbmFsIFN0cmluZyBfcGtnID0gc2JuLnBrZzsKKyAgICAgICAgZmluYWwgU3RyaW5nIF90YWcgPSBzYm4udGFnOworICAgICAgICBmaW5hbCBpbnQgX2lkID0gc2JuLmlkOworICAgICAgICB2ZXRvQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7IAorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmFyU2VydmljZS5vbk5vdGlmaWNhdGlvbkNsZWFyKF9wa2csIF90YWcsIF9pZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZCBpZiB3ZSdyZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gYmluZCB0aGUgY2xpY2sgZXZlbnQgdG8gdGhlIGNvbnRlbnQgYXJlYQorICAgICAgICBWaWV3R3JvdXAgY29udGVudCA9IChWaWV3R3JvdXApcm93LmZpbmRWaWV3QnlJZChSLmlkLmNvbnRlbnQpOworICAgICAgICAvLyBYWFg6IHVwZGF0ZSB0byBhbGxvdyBjb250cm9scyB3aXRoaW4gbm90aWZpY2F0aW9uIHZpZXdzCisgICAgICAgIGNvbnRlbnQuc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOworLy8gICAgICAgIGNvbnRlbnQuc2V0T25Gb2N1c0NoYW5nZUxpc3RlbmVyKG1Gb2N1c0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgUGVuZGluZ0ludGVudCBjb250ZW50SW50ZW50ID0gc2JuLm5vdGlmaWNhdGlvbi5jb250ZW50SW50ZW50OworICAgICAgICBpZiAoY29udGVudEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgTm90aWZpY2F0aW9uQ2xpY2tlcihjb250ZW50SW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2JuLnBrZywgc2JuLnRhZywgc2JuLmlkKSk7CisgICAgICAgIH0KKworICAgICAgICBWaWV3IGV4cGFuZGVkID0gbnVsbDsKKyAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBhbmRlZCA9IHJlbW90ZVZpZXdzLmFwcGx5KHRoaXMsIGNvbnRlbnQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cGFuZGVkID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZGVudCA9IHNibi5wa2cgKyAiLzB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoc2JuLmlkKTsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJjb3VsZG4ndCBpbmZsYXRlIHZpZXcgZm9yIG5vdGlmaWNhdGlvbiAiICsgaWRlbnQsIGV4Y2VwdGlvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50LmFkZFZpZXcoZXhwYW5kZWQpOworICAgICAgICAgICAgcm93LnNldERyYXdpbmdDYWNoZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeS5yb3cgPSByb3c7CisgICAgICAgIGVudHJ5LmNvbnRlbnQgPSBjb250ZW50OworICAgICAgICBlbnRyeS5leHBhbmRlZCA9IGV4cGFuZGVkOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTZXRMaWdodHNPbkxpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkxvbmdDbGlja0xpc3RlbmVyLAorICAgICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT247CisKKyAgICAgICAgU2V0TGlnaHRzT25MaXN0ZW5lcihib29sZWFuIG9uKSB7CisgICAgICAgICAgICBtT24gPSBvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLnNldExpZ2h0c09uKG1Pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Mb25nQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXJTZXJ2aWNlLnNldExpZ2h0c09uKG1Pbik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rIGIvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvQW5kcm9pZC5tawppbmRleCBiNDE3NTlhLi41ZGMwYzMwIDEwMDc1NQotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9BbmRyb2lkLm1rCisrKyBiL3BhY2thZ2VzL1R0c1NlcnZpY2Uvam5pL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAJYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCisJZnJhbWV3b3Jrcy9iYXNlL25hdGl2ZS9pbmNsdWRlIFwKIAkkKEpOSV9IX0lOQ0xVREUpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVHRzU2VydmljZS9qbmkvYW5kcm9pZF90dHNfU3ludGhQcm94eS5jcHAgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAppbmRleCAxZDY5MzYxLi44ZGM4OGRiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcAorKysgYi9wYWNrYWdlcy9UdHNTZXJ2aWNlL2puaS9hbmRyb2lkX3R0c19TeW50aFByb3h5LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEdvb2dsZSBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0jaW5jbHVkZSA8dHRzL1R0c0VuZ2luZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvdHRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1hdGguaD4KIApAQCAtMTU0LDcgKzE1NCw3IEBACiBjbGFzcyBTeW50aFByb3h5Sm5pU3RvcmFnZSB7CiAgICAgcHVibGljIDoKICAgICAgICAgam9iamVjdCAgICAgICAgICAgICAgICAgICB0dHNfcmVmOwotICAgICAgICBUdHNFbmdpbmUqICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZTsKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QqICAgICAgIG1FbmdpbmU7CiAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZUxpYkhhbmRsZTsKICAgICAgICAgQXVkaW9UcmFjayogICAgICAgICAgICAgICBtQXVkaW9PdXQ7CiAgICAgICAgIGludDhfdCAgICAgICAgICAgICAgICAgICAgbVBsYXlTdGF0ZTsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAgICAgICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgdHRzX3JlZiA9IE5VTEw7Ci0gICAgICAgICAgICBtTmF0aXZlU3ludGhJbnRlcmZhY2UgPSBOVUxMOworICAgICAgICAgICAgbUVuZ2luZSA9IE5VTEw7CiAgICAgICAgICAgICBtRW5naW5lTGliSGFuZGxlID0gTlVMTDsKICAgICAgICAgICAgIG1BdWRpb091dCA9IE5VTEw7CiAgICAgICAgICAgICBtUGxheVN0YXRlID0gIFNZTlRIUExBWVNUQVRFX0lTX1NUT1BQRUQ7CkBAIC0xODQsOSArMTg0LDkgQEAKICAgICAgICAgflN5bnRoUHJveHlKbmlTdG9yYWdlKCkgewogICAgICAgICAgICAgLy9MT0dWKCJlbnRlcmluZyB+U3ludGhQcm94eUpuaVN0b3JhZ2UoKSIpOwogICAgICAgICAgICAga2lsbEF1ZGlvKCk7Ci0gICAgICAgICAgICBpZiAobU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zaHV0ZG93bigpOwotICAgICAgICAgICAgICAgIG1OYXRpdmVTeW50aEludGVyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUVuZ2luZSkgeworICAgICAgICAgICAgICAgIG1FbmdpbmUtPmZ1bmNzLT5zaHV0ZG93bihtRW5naW5lKTsKKyAgICAgICAgICAgICAgICBtRW5naW5lID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtRW5naW5lTGliSGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgLy9MT0dFKCJ+U3ludGhQcm94eUpuaVN0b3JhZ2UoKTogYmVmb3JlIGNsb3NlIGxpYnJhcnkiKTsKQEAgLTI3MywyOCArMjczLDQ1IEBACiAgKiBDYWxsYmFjayBmcm9tIFRUUyBlbmdpbmUuCiAgKiBEaXJlY3RseSBzcGVha3MgdXNpbmcgQXVkaW9UcmFjayBvciB3cml0ZSB0byBmaWxlCiAgKi8KLXN0YXRpYyB0dHNfY2FsbGJhY2tfc3RhdHVzIHR0c1N5bnRoRG9uZUNCKHZvaWQgKiYgdXNlcmRhdGEsIHVpbnQzMl90IHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIGludCBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IComd2F2LCBzaXplX3QgJmJ1ZmZlclNpemUsIHR0c19zeW50aF9zdGF0dXMgc3RhdHVzKSB7CitleHRlcm4gIkMiIGFuZHJvaWRfdHRzX2NhbGxiYWNrX3N0YXR1c190CitfX3R0c1N5bnRoRG9uZUNCKHZvaWQgKiogcFVzZXJkYXRhLCB1aW50MzJfdCByYXRlLAorICAgICAgICAgICAgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgIGludDhfdCAqKnBXYXYsIHNpemVfdCAqcEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICBhbmRyb2lkX3R0c19zeW50aF9zdGF0dXNfdCBzdGF0dXMpIAorewogICAgIC8vTE9HVigidHRzU3ludGhEb25lQ2FsbGJhY2s6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAgZW5jb2Rpbmc7CiAKLSAgICBpZiAodXNlcmRhdGEgPT0gTlVMTCl7CisgICAgaWYgKCpwVXNlcmRhdGEgPT0gTlVMTCl7CiAgICAgICAgIExPR0UoInVzZXJkYXRhID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIFRUU19DQUxMQkFDS19IQUxUOworICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICB9Ci0gICAgYWZ0ZXJTeW50aERhdGFfdCogcEZvckFmdGVyID0gKGFmdGVyU3ludGhEYXRhX3QqKXVzZXJkYXRhOworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQU5EUk9JRF9UVFNfQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIGVuY29kaW5nID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkNhbid0IHBsYXksIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgfQorICAgIGFmdGVyU3ludGhEYXRhX3QqIHBGb3JBZnRlciA9IChhZnRlclN5bnRoRGF0YV90KikgKnBVc2VyZGF0YTsKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcEpuaURhdGEgPSAoU3ludGhQcm94eUpuaVN0b3JhZ2UqKShwRm9yQWZ0ZXItPmpuaVN0b3JhZ2UpOwogCiAgICAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZKXsKICAgICAgICAgLy9MT0dWKCJEaXJlY3Qgc3BlZWNoIik7CiAKLSAgICAgICAgaWYgKHdhdiA9PSBOVUxMKSB7CisgICAgICAgIGlmICgqcFdhdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgcEZvckFmdGVyOworICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChidWZmZXJTaXplID4gMCkgewotICAgICAgICAgICAgcHJlcEF1ZGlvVHJhY2socEpuaURhdGEsIHBGb3JBZnRlci0+c3RyZWFtVHlwZSwgcmF0ZSwgKEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQpZm9ybWF0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKCpwQnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHByZXBBdWRpb1RyYWNrKHBKbmlEYXRhLCBwRm9yQWZ0ZXItPnN0cmVhbVR5cGUsIHJhdGUsIGVuY29kaW5nLCBjaGFubmVsKTsKICAgICAgICAgICAgIGlmIChwSm5pRGF0YS0+bUF1ZGlvT3V0KSB7CiAgICAgICAgICAgICAgICAgcEpuaURhdGEtPm1QbGF5TG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYocEpuaURhdGEtPm1BdWRpb091dC0+c3RvcHBlZCgpCkBAIC0zMDMsMjggKzMyMCwzMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiVXNlRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90KikqcFdhdiwgKnBCdWZmZXJTaXplLzIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwSm5pRGF0YS0+bUF1ZGlvT3V0LT53cml0ZSh3YXYsIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIG1lbXNldCh3YXYsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHBKbmlEYXRhLT5tQXVkaW9PdXQtPndyaXRlKCpwV2F2LCAqcEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgICAgICAgICAvL0xPR1YoIkF1ZGlvVHJhY2sgd3JvdGU6ICVkIGJ5dGVzIiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPR0UoIkNhbid0IHBsYXksIG51bGwgYXVkaW90cmFjayIpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CisgICAgICAgICAgICAgICAgcEZvckFmdGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSAgaWYgKHBGb3JBZnRlci0+dXNhZ2VNb2RlID09IFVTQUdFTU9ERV9XUklURV9UT19GSUxFKSB7CiAgICAgICAgIC8vTE9HVigiU2F2ZSB0byBmaWxlIik7Ci0gICAgICAgIGlmICh3YXYgPT0gTlVMTCkgeworICAgICAgICBpZiAoKnBXYXYgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHBGb3JBZnRlcjsKICAgICAgICAgICAgIExPR1YoIk51bGw6IHNwZWVjaCBoYXMgY29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gVFRTX0NBTExCQUNLX0hBTFQ7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9UVFNfQ0FMTEJBQ0tfSEFMVDsKICAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyU2l6ZSA+IDApeworICAgICAgICBpZiAoKnBCdWZmZXJTaXplID4gMCl7CiAgICAgICAgICAgICBpZiAoYlVzZUZpbHRlcikgewotICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVyKChpbnQxNl90Kil3YXYsIGJ1ZmZlclNpemUvMik7CisgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKGludDE2X3QqKSpwV2F2LCAqcEJ1ZmZlclNpemUvMik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmd3JpdGUod2F2LCAxLCBidWZmZXJTaXplLCBwRm9yQWZ0ZXItPm91dHB1dEZpbGUpOwotICAgICAgICAgICAgbWVtc2V0KHdhdiwgMCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBmd3JpdGUoKnBXYXYsIDEsICpwQnVmZmVyU2l6ZSwgcEZvckFmdGVyLT5vdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIG1lbXNldCgqcFdhdiwgMCwgKnBCdWZmZXJTaXplKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBGdXR1cmUgdXBkYXRlOgpAQCAtMzMyLDcgKzM1Miw3IEBACiAgICAgLy8gICAgICBqYXZhVFRTRmllbGRzLnN5bnRoUHJveHlNZXRob2RQb3N0IG1ldGhvZGUgdG8gbm90aWZ5CiAgICAgLy8gICAgICBwbGF5YmFjayBoYXMgY29tcGxldGVkIGlmIHRoZSBzeW50aGVzaXMgaXMgZG9uZSBvciBpZiBhIG1hcmtlciBoYXMgYmVlbiByZWFjaGVkLgogCi0gICAgaWYgKHN0YXR1cyA9PSBUVFNfU1lOVEhfRE9ORSkgeworICAgIGlmIChzdGF0dXMgPT0gQU5EUk9JRF9UVFNfU1lOVEhfRE9ORSkgewogICAgICAgICAvLyB0aGlzIHN0cnVjdCB3YXMgYWxsb2NhdGVkIGluIHRoZSBvcmlnaW5hbCBhbmRyb2lkX3R0c19TeW50aFByb3h5X3NwZWFrIGNhbGwsCiAgICAgICAgIC8vIGFsbCBwcm9jZXNzaW5nIG1hdGNoaW5nIHRoaXMgY2FsbCBpcyBub3cgZG9uZS4KICAgICAgICAgTE9HVigiU3BlZWNoIHN5bnRoZXNpcyBkb25lLiIpOwpAQCAtMzQyLDE2ICszNjIsMTYgQEAKICAgICAgICAgICAgIGRlbGV0ZSBwRm9yQWZ0ZXI7CiAgICAgICAgICAgICBwRm9yQWZ0ZXIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfSEFMVDsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0hBTFQ7CiAgICAgfQogCiAgICAgLy8gd2UgZG9uJ3QgdXBkYXRlIHRoZSB3YXYgKG91dHB1dCkgcGFyYW1ldGVyIGFzIHdlJ2xsIGxldCB0aGUgbmV4dCBjYWxsYmFjawogICAgIC8vIHdyaXRlIGF0IHRoZSBzYW1lIGxvY2F0aW9uLCB3ZSd2ZSBjb25zdW1lZCB0aGUgZGF0YSBhbHJlYWR5LCBidXQgd2UgbmVlZAogICAgIC8vIHRvIHVwZGF0ZSBidWZmZXJTaXplIHRvIGxldCB0aGUgVFRTIGVuZ2luZSBrbm93IGhvdyBtdWNoIGl0IGNhbiB3cml0ZSB0aGUKICAgICAvLyBuZXh0IHRpbWUgaXQgY2FsbHMgdGhpcyBmdW5jdGlvbi4KLSAgICBidWZmZXJTaXplID0gcEpuaURhdGEtPm1CdWZmZXJTaXplOworICAgICpwQnVmZmVyU2l6ZSA9IHBKbmlEYXRhLT5tQnVmZmVyU2l6ZTsKIAotICAgIHJldHVybiBUVFNfQ0FMTEJBQ0tfQ09OVElOVUU7CisgICAgcmV0dXJuIEFORFJPSURfVFRTX0NBTExCQUNLX0NPTlRJTlVFOwogfQogCiAKQEAgLTM2MCw3ICszODAsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRMb3dTaGVsZihKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqYm9vbGVhbiBhcHBseUZpbHRlciwKICAgICAgICAgamZsb2F0IGZpbHRlckdhaW4sIGpmbG9hdCBhdHRlbnVhdGlvbkluRGIsIGpmbG9hdCBmcmVxSW5IeiwgamZsb2F0IHNsb3BlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfU1VDQ0VTUzsKIAogICAgIGJVc2VGaWx0ZXIgPSBhcHBseUZpbHRlcjsKICAgICBpZiAoYXBwbHlGaWx0ZXIpIHsKQEAgLTM3Myw3ICszOTMsNyBAQAogICAgICAgICAgICAgaW5pdGlhbGl6ZUVRKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHNsb3BlLCBjYW4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4NSw3ICs0MDUsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9uYXRpdmVfc2V0dXAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwKICAgICAgICAgam9iamVjdCB3ZWFrX3RoaXMsIGpzdHJpbmcgbmF0aXZlU29MaWIsIGpzdHJpbmcgZW5nQ29uZmlnKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGJVc2VGaWx0ZXIgPSBmYWxzZTsKIApAQCAtNDAyLDE4ICs0MjIsMjggQEAKICAgICBpZiAoZW5naW5lX2xpYl9oYW5kbGUgPT0gTlVMTCkgewogICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbmF0aXZlX3NldHVwKCk6IGVuZ2luZV9saWJfaGFuZGxlID09IE5VTEwiKTsKICAgICB9IGVsc2UgewotICAgICAgICBUdHNFbmdpbmUgKigqZ2V0X1R0c0VuZ2luZSkoKSA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFR0c0VuZ2luZSogKCopKCk+KGRsc3ltKGVuZ2luZV9saWJfaGFuZGxlLCAiZ2V0VHRzRW5naW5lIikpOworICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqICgqZ2V0X1R0c0VuZ2luZSkoKSA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJhbmRyb2lkX2dldFR0c0VuZ2luZSIpKTsKIAotICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlID0gKCpnZXRfVHRzRW5naW5lKSgpOwotICAgICAgICBwSm5pU3RvcmFnZS0+bUVuZ2luZUxpYkhhbmRsZSA9IGVuZ2luZV9saWJfaGFuZGxlOwotCi0gICAgICAgIGlmIChwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7Ci0gICAgICAgICAgICBwSm5pU3RvcmFnZS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5pbml0KHR0c1N5bnRoRG9uZUNCLCBlbmdDb25maWdTdHJpbmcpOworICAgICAgICAvLyBTdXBwb3J0IG9ic29sZXRlL2xlZ2FjeSBiaW5hcnkgbW9kdWxlcworICAgICAgICBpZiAoZ2V0X1R0c0VuZ2luZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBnZXRfVHRzRW5naW5lID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGFuZHJvaWRfdHRzX2VuZ2luZV90KiAoKikoKT4oZGxzeW0oZW5naW5lX2xpYl9oYW5kbGUsICJnZXRUdHNFbmdpbmUiKSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXN1bHQgPSBUVFNfU1VDQ0VTUzsKKyAgICAgICAgcEpuaVN0b3JhZ2UtPm1FbmdpbmUgPSAoKmdldF9UdHNFbmdpbmUpKCk7CisgICAgICAgIHBKbmlTdG9yYWdlLT5tRW5naW5lTGliSGFuZGxlID0gZW5naW5lX2xpYl9oYW5kbGU7CisKKyAgICAgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBKbmlTdG9yYWdlLT5tRW5naW5lOworICAgICAgICBpZiAoZW5naW5lKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CisgICAgICAgICAgICBlbmdpbmUtPmZ1bmNzLT5pbml0KAorICAgICAgICAgICAgICAgIGVuZ2luZSwKKyAgICAgICAgICAgICAgICBfX3R0c1N5bnRoRG9uZUNCLAorICAgICAgICAgICAgICAgIGVuZ0NvbmZpZ1N0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBBTkRST0lEX1RUU19TVUNDRVNTOwogICAgIH0KIAogICAgIC8vIHdlIHVzZSBhIHdlYWsgcmVmZXJlbmNlIHNvIHRoZSBTeW50aFByb3h5IG9iamVjdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCkBAIC00NjIsNyArNDkyLDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfaXNMYW5ndWFnZUF2YWlsYWJsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00NzQsOCArNTA0LDEwIEBACiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+aXNMYW5ndWFnZUF2YWlsYWJsZShsYW5nTmF0aXZlU3RyaW5nLAorICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5pc0xhbmd1YWdlQXZhaWxhYmxlKGVuZ2luZSxsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC00ODcsNyArNTE5LDcgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0Q29uZmlnKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSwganN0cmluZyBlbmdpbmVDb25maWcpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldENvbmZpZygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC00OTgsOSArNTMwLDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBjb25zdCBjaGFyICplbmdpbmVDb25maWdOYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGVuZ2luZUNvbmZpZywgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoQU5EUk9JRF9UVFNfRU5HSU5FX1BST1BFUlRZX0NPTkZJRywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSxBTkRST0lEX1RUU19FTkdJTkVfUFJPUEVSVFlfQ09ORklHLAogICAgICAgICAgICAgICAgIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZywgc3RybGVuKGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZykpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbmdpbmVDb25maWcsIGVuZ2luZUNvbmZpZ05hdGl2ZVN0cmluZyk7CkBAIC01MTIsNyArNTQ1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0TGFuZ3VhZ2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIGxhbmd1YWdlLCBqc3RyaW5nIGNvdW50cnksIGpzdHJpbmcgdmFyaWFudCkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0xBTkdfTk9UX1NVUFBPUlRFRDsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfTEFOR19OT1RfU1VQUE9SVEVEOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTUyNSw5ICs1NTgsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0TGFuZ3VhZ2UobGFuZ05hdGl2ZVN0cmluZywKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldExhbmd1YWdlKGVuZ2luZSwgbGFuZ05hdGl2ZVN0cmluZywKICAgICAgICAgICAgICAgICBjb3VudHJ5TmF0aXZlU3RyaW5nLCB2YXJpYW50TmF0aXZlU3RyaW5nKTsKICAgICB9CiAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMobGFuZ3VhZ2UsIGxhbmdOYXRpdmVTdHJpbmcpOwpAQCAtNTQxLDcgKzU3NSw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X2xvYWRMYW5ndWFnZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGpzdHJpbmcgbGFuZ3VhZ2UsIGpzdHJpbmcgY291bnRyeSwganN0cmluZyB2YXJpYW50KQogewotICAgIGludCByZXN1bHQgPSBUVFNfTEFOR19OT1RfU1VQUE9SVEVEOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19MQU5HX05PVF9TVVBQT1JURUQ7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfbG9hZExhbmd1YWdlKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTU1Miw5ICs1ODYsMTAgQEAKICAgICBjb25zdCBjaGFyICpsYW5nTmF0aXZlU3RyaW5nID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgMCk7CiAgICAgY29uc3QgY2hhciAqY291bnRyeU5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY291bnRyeSwgMCk7CiAgICAgY29uc3QgY2hhciAqdmFyaWFudE5hdGl2ZVN0cmluZyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnModmFyaWFudCwgMCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+bG9hZExhbmd1YWdlKGxhbmdOYXRpdmVTdHJpbmcsCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5sb2FkTGFuZ3VhZ2UoZW5naW5lLCBsYW5nTmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgICAgIGNvdW50cnlOYXRpdmVTdHJpbmcsIHZhcmlhbnROYXRpdmVTdHJpbmcpOwogICAgIH0KICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhsYW5ndWFnZSwgbGFuZ05hdGl2ZVN0cmluZyk7CkBAIC01NjksNyArNjA0LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZShKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgc3BlZWNoUmF0ZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc2V0U3BlZWNoUmF0ZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC01ODQsOSArNjE5LDEwIEBACiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKICAgICBMT0dJKCJzZXR0aW5nIHNwZWVjaCByYXRlIHRvICVkIiwgc3BlZWNoUmF0ZSk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInJhdGUiLCBidWZmZXIsIGJ1ZlNpemUpOworICAgIGlmIChlbmdpbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c2V0UHJvcGVydHkoZW5naW5lLCAicmF0ZSIsIGJ1ZmZlciwgYnVmU2l6ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTU5Nyw3ICs2MzMsNyBAQAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zZXRQaXRjaChKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqaW50IGpuaURhdGEsCiAgICAgICAgIGppbnQgcGl0Y2gpCiB7Ci0gICAgaW50IHJlc3VsdCA9IFRUU19GQUlMVVJFOworICAgIGludCByZXN1bHQgPSBBTkRST0lEX1RUU19GQUlMVVJFOwogCiAgICAgaWYgKGpuaURhdGEgPT0gMCkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3NldFBpdGNoKCk6IGludmFsaWQgSk5JIGRhdGEiKTsKQEAgLTYxMiw5ICs2NDgsMTAgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogICAgIExPR0koInNldHRpbmcgcGl0Y2ggdG8gJWQiLCBwaXRjaCk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CiAKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHJlc3VsdCA9IHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+c2V0UHJvcGVydHkoInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnNldFByb3BlcnR5KGVuZ2luZSwgInBpdGNoIiwgYnVmZmVyLCBidWZTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNjI1LDcgKzY2Miw3IEBACiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqc3RyaW5nIGZpbGVuYW1lSmF2YVN0cmluZykKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC02MzMsNyArNjcwLDcgQEAKICAgICB9CiAKICAgICBTeW50aFByb3h5Sm5pU3RvcmFnZSogcFN5bnRoRGF0YSA9IChTeW50aFByb3h5Sm5pU3RvcmFnZSopam5pRGF0YTsKLSAgICBpZiAoIXBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmICghcFN5bnRoRGF0YS0+bUVuZ2luZSkgewogICAgICAgICBMT0dFKCJhbmRyb2lkX3R0c19TeW50aFByb3h5X3N5bnRoZXNpemVUb0ZpbGUoKTogaW52YWxpZCBlbmdpbmUgaGFuZGxlIik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNjQzLDEyICs2ODAsMjIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChlbmdpbmVNdXRleCk7CiAKICAgICAvLyBSZXRyaWV2ZSBhdWRpbyBwYXJhbWV0ZXJzIGJlZm9yZSB3cml0aW5nIHRoZSBmaWxlIGhlYWRlcgotICAgIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgZW5jb2RpbmcgPSBERUZBVUxUX1RUU19GT1JNQVQ7CisgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCBlbmNvZGluZzsKICAgICB1aW50MzJfdCByYXRlID0gREVGQVVMVF9UVFNfUkFURTsKICAgICBpbnQgY2hhbm5lbHMgPSBERUZBVUxUX1RUU19OQl9DSEFOTkVMUzsKLSAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnNldEF1ZGlvRm9ybWF0KGVuY29kaW5nLCByYXRlLCBjaGFubmVscyk7CisgICAgYW5kcm9pZF90dHNfZW5naW5lX3QgKmVuZ2luZSA9IHBTeW50aERhdGEtPm1FbmdpbmU7CisgICAgYW5kcm9pZF90dHNfYXVkaW9fZm9ybWF0X3QgIGZvcm1hdCA9IEFORFJPSURfVFRTX0FVRElPX0ZPUk1BVF9ERUZBVUxUOwogCi0gICAgaWYgKChlbmNvZGluZyAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgJiYgKGVuY29kaW5nICE9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpKSB7CisgICAgZW5naW5lLT5mdW5jcy0+c2V0QXVkaW9Gb3JtYXQoZW5naW5lLCAmZm9ybWF0LCAmcmF0ZSwgJmNoYW5uZWxzKTsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgZW5jb2RpbmcgPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTkRST0lEX1RUU19BVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBlbmNvZGluZyA9IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3ludGhlc2l6ZVRvRmlsZSgpOiBlbmdpbmUgdXNlcyBpbnZhbGlkIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTY3Nyw3ICs3MjQsOCBAQAogICAgIHVuc2lnbmVkIGludCB1bmlxdWVfaWRlbnRpZmllcjsKIAogICAgIG1lbXNldChwU3ludGhEYXRhLT5tQnVmZmVyLCAwLCBwU3ludGhEYXRhLT5tQnVmZmVyU2l6ZSk7Ci0gICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorCisgICAgcmVzdWx0ID0gZW5naW5lLT5mdW5jcy0+c3ludGhlc2l6ZVRleHQoZW5naW5lLCB0ZXh0TmF0aXZlU3RyaW5nLAogICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKIAogICAgIGxvbmcgZmlsZWxlbiA9IGZ0ZWxsKHBGb3JBZnRlci0+b3V0cHV0RmlsZSk7CkBAIC03MzcsNyArNzg1LDcgQEAKIGFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3BlYWsoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBqbmlEYXRhLAogICAgICAgICBqc3RyaW5nIHRleHRKYXZhU3RyaW5nLCBqaW50IGphdmFTdHJlYW1UeXBlKQogewotICAgIGludCByZXN1bHQgPSBUVFNfRkFJTFVSRTsKKyAgICBpbnQgcmVzdWx0ID0gQU5EUk9JRF9UVFNfRkFJTFVSRTsKIAogICAgIGlmIChqbmlEYXRhID09IDApIHsKICAgICAgICAgTE9HRSgiYW5kcm9pZF90dHNfU3ludGhQcm94eV9zcGVhaygpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03NTksMTAgKzgwNywxMiBAQAogICAgIHBGb3JBZnRlci0+dXNhZ2VNb2RlICA9IFVTQUdFTU9ERV9QTEFZX0lNTUVESUFURUxZOwogICAgIHBGb3JBZnRlci0+c3RyZWFtVHlwZSA9IChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpIGphdmFTdHJlYW1UeXBlOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnRleHROYXRpdmVTdHJpbmcgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHRleHRKYXZhU3RyaW5nLCAwKTsKICAgICAgICAgbWVtc2V0KHBTeW50aERhdGEtPm1CdWZmZXIsIDAsIHBTeW50aERhdGEtPm1CdWZmZXJTaXplKTsKLSAgICAgICAgcmVzdWx0ID0gcFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlLT5zeW50aGVzaXplVGV4dCh0ZXh0TmF0aXZlU3RyaW5nLAorICAgICAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKworICAgICAgICByZXN1bHQgPSBlbmdpbmUtPmZ1bmNzLT5zeW50aGVzaXplVGV4dChlbmdpbmUsIHRleHROYXRpdmVTdHJpbmcsCiAgICAgICAgICAgICAgICAgcFN5bnRoRGF0YS0+bUJ1ZmZlciwgcFN5bnRoRGF0YS0+bUJ1ZmZlclNpemUsICh2b2lkICopcEZvckFmdGVyKTsKICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnModGV4dEphdmFTdHJpbmcsIHRleHROYXRpdmVTdHJpbmcpOwogICAgIH0KQEAgLTc3NCw3ICs4MjQsNyBAQAogc3RhdGljIGludAogYW5kcm9pZF90dHNfU3ludGhQcm94eV9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC03OTAsOCArODQwLDkgQEAKICAgICB9CiAgICAgcFN5bnRoRGF0YS0+bVBsYXlMb2NrLnVubG9jaygpOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgewotICAgICAgICByZXN1bHQgPSBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPnN0b3AoKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIHJlc3VsdCA9IGVuZ2luZS0+ZnVuY3MtPnN0b3AoZW5naW5lKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODAxLDcgKzg1Miw3IEBACiBzdGF0aWMgaW50CiBhbmRyb2lkX3R0c19TeW50aFByb3h5X3N0b3BTeW5jKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgam5pRGF0YSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gVFRTX0ZBSUxVUkU7CisgICAgaW50IHJlc3VsdCA9IEFORFJPSURfVFRTX0ZBSUxVUkU7CiAKICAgICBpZiAoam5pRGF0YSA9PSAwKSB7CiAgICAgICAgIExPR0UoImFuZHJvaWRfdHRzX1N5bnRoUHJveHlfc3RvcCgpOiBpbnZhbGlkIEpOSSBkYXRhIik7CkBAIC04MjksNyArODgwLDcgQEAKIAogICAgIFN5bnRoUHJveHlKbmlTdG9yYWdlKiBwU3ludGhEYXRhID0gKFN5bnRoUHJveHlKbmlTdG9yYWdlKilqbmlEYXRhOwogCi0gICAgaWYgKHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZSkgeworICAgIGlmIChwU3ludGhEYXRhLT5tRW5naW5lKSB7CiAgICAgICAgIHNpemVfdCBidWZTaXplID0gMTAwOwogICAgICAgICBjaGFyIGxhbmdbYnVmU2l6ZV07CiAgICAgICAgIGNoYXIgY291bnRyeVtidWZTaXplXTsKQEAgLTgzOSw3ICs4OTAsOSBAQAogICAgICAgICBtZW1zZXQodmFyaWFudCwgMCwgYnVmU2l6ZSk7CiAgICAgICAgIGpvYmplY3RBcnJheSByZXRMb2NhbGUgPSAoam9iamVjdEFycmF5KWVudi0+TmV3T2JqZWN0QXJyYXkoMywKICAgICAgICAgICAgICAgICBlbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpLCBlbnYtPk5ld1N0cmluZ1VURigiIikpOwotICAgICAgICBwU3ludGhEYXRhLT5tTmF0aXZlU3ludGhJbnRlcmZhY2UtPmdldExhbmd1YWdlKGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOworCisgICAgICAgIGFuZHJvaWRfdHRzX2VuZ2luZV90ICplbmdpbmUgPSBwU3ludGhEYXRhLT5tRW5naW5lOworICAgICAgICBlbmdpbmUtPmZ1bmNzLT5nZXRMYW5ndWFnZShlbmdpbmUsIGxhbmcsIGNvdW50cnksIHZhcmlhbnQpOwogICAgICAgICBlbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChyZXRMb2NhbGUsIDAsIGVudi0+TmV3U3RyaW5nVVRGKGxhbmcpKTsKICAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQocmV0TG9jYWxlLCAxLCBlbnYtPk5ld1N0cmluZ1VURihjb3VudHJ5KSk7CiAgICAgICAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldExvY2FsZSwgMiwgZW52LT5OZXdTdHJpbmdVVEYodmFyaWFudCkpOwpAQCAtODY0LDggKzkxNyw5IEBACiAgICAgY2hhciBidWZbYnVmU2l6ZV07CiAgICAgbWVtc2V0KGJ1ZiwgMCwgYnVmU2l6ZSk7CiAgICAgLy8gVE9ETyBjaGVjayByZXR1cm4gY29kZXMKLSAgICBpZiAocFN5bnRoRGF0YS0+bU5hdGl2ZVN5bnRoSW50ZXJmYWNlKSB7Ci0gICAgICAgIHBTeW50aERhdGEtPm1OYXRpdmVTeW50aEludGVyZmFjZS0+Z2V0UHJvcGVydHkoInJhdGUiLCBidWYsICZidWZTaXplKTsKKyAgICBhbmRyb2lkX3R0c19lbmdpbmVfdCAqZW5naW5lID0gcFN5bnRoRGF0YS0+bUVuZ2luZTsKKyAgICBpZiAoZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS0+ZnVuY3MtPmdldFByb3BlcnR5KGVuZ2luZSwicmF0ZSIsIGJ1ZiwgJmJ1ZlNpemUpOwogICAgIH0KICAgICByZXR1cm4gYXRvaShidWYpOwogfQpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQppbmRleCBiYTFkN2Y1Li43MGE0YjIwIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01hbmFnZXIuamF2YQpAQCAtMTEzLDcgKzExMywxNSBAQAogICAgICAgICAgICAgICAgICAgICBmbGFncywgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOwogICAgICAgICAgICAgbHAuc29mdElucHV0TW9kZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX1BBTjsKICAgICAgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9Mb2NrU2NyZWVuOwotICAgICAgICAgICAgbHAuc2NyZWVuT3JpZW50YXRpb24gPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX05PU0VOU09SOworCisgICAgICAgICAgICBpZiAobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbihSLmJvb2wuY29uZmlnX2VuYWJsZUxvY2tTY3JlZW5Sb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9uISIpOworICAgICAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9TRU5TT1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdGF0aW9uIHNlbnNvciBmb3IgbG9jayBzY3JlZW4gT2ZmISIpOworICAgICAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbHAuc2V0VGl0bGUoIktleWd1YXJkIik7CiAgICAgICAgICAgICBtV2luZG93TGF5b3V0UGFyYW1zID0gbHA7CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQppbmRleCA4ODIwM2MzLi5kMTlmMzE4IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGw7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW0uU0NSRUVOX09GRl9USU1FT1VUOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVXRpbHM7CiAKQEAgLTQxLDYgKzQzLDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CkBAIC05Myw2ICs5Niw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBLZXlndWFyZFZpZXdNZWRpYXRvciBpbXBsZW1lbnRzIEtleWd1YXJkVmlld0NhbGxiYWNrLAogICAgICAgICBLZXlndWFyZFVwZGF0ZU1vbml0b3IuU2ltU3RhdGVDYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0RJU1BMQVlfVElNRU9VVF9ERUxBWV9ERUZBVUxUID0gMzAwMDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlICYmIENvbmZpZy5MT0dEOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREJHX1dBS0UgPSBERUJVRyB8fCB0cnVlOwogCkBAIC0xMzMsNyArMTM3LDcgQEAKICAgICAgKiB0dXJuaW5nIG9uIHRoZSBrZXlndWFyZCAoaS5lLCB0aGUgdXNlciBoYXMgdGhpcyBtdWNoIHRpbWUgdG8gdHVybgogICAgICAqIHRoZSBzY3JlZW4gYmFjayBvbiB3aXRob3V0IGhhdmluZyB0byBmYWNlIHRoZSBrZXlndWFyZCkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWUdVQVJEX0RFTEFZX01TID0gNTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZR1VBUkRfTE9DS19BRlRFUl9ERUxBWV9ERUZBVUxUID0gNTAwMDsKIAogICAgIC8qKgogICAgICAqIEhvdyBsb25nIHdlJ2xsIHdhaXQgZm9yIHRoZSB7QGxpbmsgS2V5Z3VhcmRWaWV3Q2FsbGJhY2sja2V5Z3VhcmREb25lRHJhd2luZygpfQpAQCAtMjQ0LDYgKzI0OCw3IEBACiAgICAgICogdGhlIGtleWd1YXJkLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtV2FpdGluZ1VudGlsS2V5Z3VhcmRWaXNpYmxlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOwogCiAgICAgcHVibGljIEtleWd1YXJkVmlld01lZGlhdG9yKENvbnRleHQgY29udGV4dCwgUGhvbmVXaW5kb3dNYW5hZ2VyIGNhbGxiYWNrLAogICAgICAgICAgICAgTG9jYWxQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyKSB7CkBAIC0yNzUsOCArMjgwLDkgQEAKIAogICAgICAgICBtVXBkYXRlTW9uaXRvci5yZWdpc3RlclNpbVN0YXRlQ2FsbGJhY2sodGhpcyk7CiAKLSAgICAgICAgbUtleWd1YXJkVmlld1Byb3BlcnRpZXMgPSBuZXcgTG9ja1BhdHRlcm5LZXlndWFyZFZpZXdQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIG5ldyBMb2NrUGF0dGVyblV0aWxzKG1Db250ZXh0KSwgbVVwZGF0ZU1vbml0b3IpOworICAgICAgICBtTG9ja1BhdHRlcm5VdGlscyA9IG5ldyBMb2NrUGF0dGVyblV0aWxzKG1Db250ZXh0KTsKKyAgICAgICAgbUtleWd1YXJkVmlld1Byb3BlcnRpZXMgCisgICAgICAgICAgICAgICAgPSBuZXcgTG9ja1BhdHRlcm5LZXlndWFyZFZpZXdQcm9wZXJ0aWVzKG1Mb2NrUGF0dGVyblV0aWxzLCBtVXBkYXRlTW9uaXRvcik7CiAKICAgICAgICAgbUtleWd1YXJkVmlld01hbmFnZXIgPSBuZXcgS2V5Z3VhcmRWaWV3TWFuYWdlcigKICAgICAgICAgICAgICAgICBjb250ZXh0LCBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCksIHRoaXMsCkBAIC0zMjYsMTUgKzMzMiw0NiBAQAogICAgICAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBpdCBhIGxpdHRsZSBiaXQgbGF0ZXIgKGkuZSwgZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZQogICAgICAgICAgICAgICAgIC8vIHRvIHR1cm4gdGhlIHNjcmVlbiBiYWNrIG9uIHdpdGhpbiBhIGNlcnRhaW4gd2luZG93IHdpdGhvdXQKICAgICAgICAgICAgICAgICAvLyBoYXZpbmcgdG8gdW5sb2NrIHRoZSBzY3JlZW4pCi0gICAgICAgICAgICAgICAgbG9uZyB3aGVuID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgKyBLRVlHVUFSRF9ERUxBWV9NUzsKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChERUxBWUVEX0tFWUdVQVJEX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJzZXEiLCBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW5kZXIgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIGludGVudCwgUGVuZGluZ0ludGVudC5GTEFHX0NBTkNFTF9DVVJSRU5UKTsKLSAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRV9XQUtFVVAsIHdoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0dGluZyBhbGFybSB0byB0dXJuIG9mZiBrZXlndWFyZCwgc2VxID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRGVsYXllZFNob3dpbmdTZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisKKyAgICAgICAgICAgICAgICAvLyBGcm9tIERpc3BsYXlTZXR0aW5ncworICAgICAgICAgICAgICAgIGxvbmcgZGlzcGxheVRpbWVvdXQgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTQ1JFRU5fT0ZGX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlHVUFSRF9ESVNQTEFZX1RJTUVPVVRfREVMQVlfREVGQVVMVCk7CisKKyAgICAgICAgICAgICAgICAvLyBGcm9tIFNlY3VyaXR5U2V0dGluZ3MKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxvY2tBZnRlclRpbWVvdXQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkxPQ0tfU0NSRUVOX0xPQ0tfQUZURVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWUdVQVJEX0xPQ0tfQUZURVJfREVMQVlfREVGQVVMVCk7CisKKyAgICAgICAgICAgICAgICAvLyBGcm9tIERldmljZVBvbGljeUFkbWluCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb2xpY3lUaW1lb3V0ID0gbUxvY2tQYXR0ZXJuVXRpbHMuZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CisKKyAgICAgICAgICAgICAgICBsb25nIHRpbWVvdXQ7CisgICAgICAgICAgICAgICAgaWYgKHBvbGljeVRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljeSBpbiBlZmZlY3QuIE1ha2Ugc3VyZSB3ZSBkb24ndCBnbyBiZXlvbmQgcG9saWN5IGxpbWl0LgorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VGltZW91dCA9IE1hdGgubWF4KGRpc3BsYXlUaW1lb3V0LCAwKTsgLy8gaWdub3JlIG5lZ2F0aXZlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gTWF0aC5taW4ocG9saWN5VGltZW91dCAtIGRpc3BsYXlUaW1lb3V0LCBsb2NrQWZ0ZXJUaW1lb3V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gbG9ja0FmdGVyVGltZW91dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExvY2sgbm93CisgICAgICAgICAgICAgICAgICAgIG1TdXBwcmVzc05leHRMb2NrU291bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBkb0tleWd1YXJkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9jayBpbiB0aGUgZnV0dXJlCisgICAgICAgICAgICAgICAgICAgIGxvbmcgd2hlbiA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsgdGltZW91dDsKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoREVMQVlFRF9LRVlHVUFSRF9BQ1RJT04pOworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoInNlcSIsIG1EZWxheWVkU2hvd2luZ1NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBzZW5kZXIgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVCk7CisgICAgICAgICAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuc2V0KEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwgd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNldHRpbmcgYWxhcm0gdG8gdHVybiBvZmYga2V5Z3VhcmQsIHNlcSA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1EZWxheWVkU2hvd2luZ1NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoeSA9PSBXaW5kb3dNYW5hZ2VyUG9saWN5Lk9GRl9CRUNBVVNFX09GX1BST1hfU0VOU09SKSB7CiAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGVuYWJsZSB0aGUga2V5Z3VhcmQgaWYgdGhlIHByb3ggc2Vuc29yIGZvcmNlZCB0aGUgc2NyZWVuIG9mZi4KICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKaW5kZXggMjc3MDZlZi4uODIyYmU0NiAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXcuamF2YQpAQCAtNjQ1LDcgKzY0NSw5IEBACiAgICAgICAgICAgICAvLyBTaG93IExvY2tTY3JlZW4gZmlyc3QgZm9yIGFueSBzY3JlZW4gb3RoZXIgdGhhbiBQYXR0ZXJuIHVubG9jay4KICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNpbmdMb2NrUGF0dGVybiA9IG1Mb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCkKICAgICAgICAgICAgICAgICAgICAgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORzsKLSAgICAgICAgICAgIGlmIChpc1NlY3VyZSgpICYmIHVzaW5nTG9ja1BhdHRlcm4pIHsKKworICAgICAgICAgICAgYm9vbGVhbiBzaG93U2xpZGluZ1RhYiA9IGdldFJlc291cmNlcygpLmdldEJvb2xlYW4oUi5ib29sLmNvbmZpZ19lbmFibGVTbGlkaW5nVGFiRmlyc3QpOworICAgICAgICAgICAgaWYgKGlzU2VjdXJlKCkgJiYgKHVzaW5nTG9ja1BhdHRlcm4gfHwgIXNob3dTbGlkaW5nVGFiKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBNb2RlLlVubG9ja1NjcmVlbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGUuTG9ja1NjcmVlbjsKQEAgLTY2Nyw2ICs2NjksNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX05VTUVSSUM6CiAgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFCRVRJQzoKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQ09NUExFWDoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlBhc3N3b3JkOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkc6CkBAIC02ODcsOCArNjkwLDE3IEBACiAKICAgICBwcml2YXRlIHZvaWQgc2hvd1RpbWVvdXREaWFsb2coKSB7CiAgICAgICAgIGludCB0aW1lb3V0SW5TZWNvbmRzID0gKGludCkgTG9ja1BhdHRlcm5VdGlscy5GQUlMRURfQVRURU1QVF9USU1FT1VUX01TIC8gMTAwMDsKKyAgICAgICAgaW50IG1lc3NhZ2VJZCA9IFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICBpZihnZXRVbmxvY2tNb2RlKCkgPT0gVW5sb2NrTW9kZS5QYXNzd29yZCkgeworICAgICAgICAgICAgaWYobUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKSA9PQorICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9OVU1FUklDKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUlkID0gUi5zdHJpbmcubG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQgPSBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9wYXNzd29yZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1Db250ZXh0LmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9hdHRlbXB0c19kaWFsb2dfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlSWQsCiAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0RmFpbGVkQXR0ZW1wdHMoKSwKICAgICAgICAgICAgICAgICB0aW1lb3V0SW5TZWNvbmRzKTsKICAgICAgICAgZmluYWwgQWxlcnREaWFsb2cgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCmluZGV4IGE1ZWYxZmEuLmY4YzBhYmEgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCkBAIC01OSwxMiArNTksNyBAQAogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKLSAgICBwcml2YXRlIFRleHRWaWV3IG1DYXJyaWVyOwogICAgIHByaXZhdGUgU2xpZGluZ1RhYiBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGltZTsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzMjsKICAgICBwcml2YXRlIFRleHRWaWV3IG1TY3JlZW5Mb2NrZWQ7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRW1lcmdlbmN5Q2FsbFRleHQ7CiAgICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUNhbGxCdXR0b247CkBAIC05Myw2ICs4OCw4IEBACiAgICAgcHJpdmF0ZSBqYXZhLnRleHQuRGF0ZUZvcm1hdCBtVGltZUZvcm1hdDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZU1lbnVLZXlJbkxvY2tTY3JlZW47CiAKKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CisKICAgICAvKioKICAgICAgKiBUaGUgc3RhdHVzIG9mIHRoaXMgbG9jayBzY3JlZW4uCiAgICAgICovCkBAIC0xOTUsMTQgKzE5Miw3IEBACiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQsIHRoaXMsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgbUNhcnJpZXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhcnJpZXIpOwotICAgICAgICAvLyBSZXF1aXJlZCBmb3IgTWFycXVlZSB0byB3b3JrCi0gICAgICAgIG1DYXJyaWVyLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICBtQ2Fycmllci5zZXRUZXh0Q29sb3IoMHhmZmZmZmZmZik7Ci0KLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotICAgICAgICBtU3RhdHVzMSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMSk7Ci0gICAgICAgIG1TdGF0dXMyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXMyKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1TY3JlZW5Mb2NrZWQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnNjcmVlbkxvY2tlZCk7CiAgICAgICAgIG1TZWxlY3RvciA9IChTbGlkaW5nVGFiKSBmaW5kVmlld0J5SWQoUi5pZC50YWJfc2VsZWN0b3IpOwpAQCAtMjIwLDcgKzIxMCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0KICAgICAgICAgc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICAgICAgc2V0RGVzY2VuZGFudEZvY3VzYWJpbGl0eShWaWV3R3JvdXAuRk9DVVNfQkxPQ0tfREVTQ0VOREFOVFMpOwpAQCAtNDI4LDM4ICs0MTcsMTEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFRpbWVBbmREYXRlRGlzcGxheSgpIHsKLSAgICAgICAgbURhdGUuc2V0VGV4dChEYXRlRm9ybWF0LmZvcm1hdChtRGF0ZUZvcm1hdFN0cmluZywgbmV3IERhdGUoKSkpOworICAgICAgICBtU3RhdHVzVmlldy5yZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1c0xpbmVzKCkgewotICAgICAgICBpZiAoIW1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCkKLSAgICAgICAgICAgICAgICB8fCAobUNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgewotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2hhcmdpbmcgIT0gbnVsbCAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNoYXJnaW5nIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIG1DaGFyZ2luZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBuZXh0IGFsYXJtIG9ubHkKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKG1DaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1DaGFyZ2luZyk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMobUNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRUZXh0KG1OZXh0QWxhcm0pOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKG1BbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9CisgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKG1TdGF0dXMuc2hvd1N0YXR1c0xpbmVzKCksIG1DaGFyZ2luZywgbUNoYXJnaW5nSWNvbiwgbUFsYXJtSWNvbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTUwOSw3ICs0NzEsNyBAQAogICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CiAgICAgICAgICAgICAgICAgLy8gdGV4dAotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CkBAIC01MTgsMTQgKzQ4MCwxNCBAQAogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dCgiIik7CiAKICAgICAgICAgICAgICAgICAvLyBsYXlvdXQKLSAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1TZWxlY3Rvci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTmV0d29ya0xvY2tlZDoKICAgICAgICAgICAgICAgICAvLyBUaGUgY2FycmllciBzdHJpbmcgc2hvd3MgYm90aCBzaW0gY2FyZCBzdGF0dXMgKGkuZS4gTm8gU2ltIENhcmQpIGFuZAogICAgICAgICAgICAgICAgIC8vIGNhcnJpZXIncyBuYW1lIGFuZC9vciAiRW1lcmdlbmN5IENhbGxzIE9ubHkiIHN0YXR1cwotICAgICAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoCisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDYXJyaWVyU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRUZWxlcGhvbnlQbG1uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbmV0d29ya19sb2NrZWRfbWVzc2FnZSkpKTsKQEAgLTUzOCw3ICs1MDAsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1NaXNzaW5nOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9pbnN0cnVjdGlvbnMpOwogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CkBAIC01NDksNyArNTExLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltTWlzc2luZ0xvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KSkpOwpAQCAtNTYzLDcgKzUyNSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNpbUxvY2tlZDoKICAgICAgICAgICAgICAgICAvLyB0ZXh0Ci0gICAgICAgICAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhcnJpZXJTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC01NzUsNyArNTM3LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU2ltUHVrTG9ja2VkOgogICAgICAgICAgICAgICAgIC8vIHRleHQKLSAgICAgICAgICAgICAgICBtQ2Fycmllci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0VGVsZXBob255UGxtbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3NpbV9wdWtfbG9ja2VkX21lc3NhZ2UpKSk7CkBAIC02NTgsNyArNjIwLDYgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCkBAIC02NzYsNiArNjM3LDUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCAzOWYyOTE3Li45ZGI4NmFhIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnRleHQubWV0aG9kLkRpZ2l0c0tleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKQEAgLTUwLDE5ICs1MSwyNSBAQAogcHVibGljIGNsYXNzIFBhc3N3b3JkVW5sb2NrU2NyZWVuIGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgS2V5Z3VhcmRTY3JlZW4sCiAgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrLCBPbkVkaXRvckFjdGlvbkxpc3RlbmVyIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGFzc3dvcmRVbmxvY2tTY3JlZW4iOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIG1VcGRhdGVNb25pdG9yOwogICAgIHByaXZhdGUgZmluYWwgS2V5Z3VhcmRTY3JlZW5DYWxsYmFjayBtQ2FsbGJhY2s7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWxwaGE7CisKICAgICBwcml2YXRlIEVkaXRUZXh0IG1QYXNzd29yZEVudHJ5OwogICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lDYWxsQnV0dG9uOwogICAgIHByaXZhdGUgTG9ja1BhdHRlcm5VdGlscyBtTG9ja1BhdHRlcm5VdGlsczsKICAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlldzsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZFZpZXcgbUtleWJvYXJkVmlld0FscGhhOwogICAgIHByaXZhdGUgUGFzc3dvcmRFbnRyeUtleWJvYXJkSGVscGVyIG1LZXlib2FyZEhlbHBlcjsKKyAgICBwcml2YXRlIFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlciBtS2V5Ym9hcmRIZWxwZXJBbHBoYTsKIAogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbk9yaWVudGF0aW9uOwogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbjsKICAgICBwcml2YXRlIENvdW50RG93blRpbWVyIG1Db3VudGRvd25UaW1lcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZTsKKworICAgIHByaXZhdGUgU3RhdHVzVmlldyBtU3RhdHVzVmlldzsKIAogICAgIC8vIFRvIGF2b2lkIGFjY2lkZW50YWwgbG9ja291dCBkdWUgdG8gZXZlbnRzIHdoaWxlIHRoZSBkZXZpY2UgaW4gaW4gdGhlIHBvY2tldCwgaWdub3JlCiAgICAgLy8gYW55IHBhc3N3b3JkcyB3aXRoIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBsZW5ndGguCkBAIC04NiwzNiArOTMsNjUgQEAKICAgICAgICAgICAgIGxheW91dEluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQua2V5Z3VhcmRfc2NyZWVuX3Bhc3N3b3JkX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CiAgICAgICAgIH0KIAorICAgICAgICBtU3RhdHVzVmlldyA9IG5ldyBTdGF0dXNWaWV3KHRoaXMsIG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgZmluYWwgaW50IHF1YWxpdHkgPSBsb2NrUGF0dGVyblV0aWxzLmdldEtleWd1YXJkU3RvcmVkUGFzc3dvcmRRdWFsaXR5KCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNBbHBoYSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDID09IHF1YWxpdHkKLSAgICAgICAgICAgICAgICB8fCBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfQUxQSEFOVU1FUklDID09IHF1YWxpdHk7CisgICAgICAgIG1Jc0FscGhhID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUMgPT0gcXVhbGl0eQorICAgICAgICAgICAgICAgIHx8IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYID09IHF1YWxpdHk7CiAKICAgICAgICAgbUtleWJvYXJkVmlldyA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZCk7CisgICAgICAgIG1LZXlib2FyZFZpZXdBbHBoYSA9IChQYXNzd29yZEVudHJ5S2V5Ym9hcmRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5rZXlib2FyZEFscGhhKTsKICAgICAgICAgbVBhc3N3b3JkRW50cnkgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkRW50cnkpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5zZXRPbkVkaXRvckFjdGlvbkxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOwogICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7Ci0gICAgICAgIG1UaXRsZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZW50ZXJfcGFzc3dvcmRfbGFiZWwpOwogCi0gICAgICAgIG1LZXlib2FyZEhlbHBlciA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlldywgdGhpcyk7Ci0gICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUoaXNBbHBoYSA/IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBCi0gICAgICAgICAgICAgICAgOiBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9OVU1FUklDKTsKKyAgICAgICAgbUtleWJvYXJkSGVscGVyID0gbmV3IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlcihjb250ZXh0LCBtS2V5Ym9hcmRWaWV3LCB0aGlzLCBmYWxzZSk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRWaWV3QWxwaGEgPT0gbnVsbCB8fCAhbUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlci5zZXRLZXlib2FyZE1vZGUobUlzQWxwaGEgPworICAgICAgICAgICAgICAgICAgICBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIuS0VZQk9BUkRfTU9ERV9BTFBIQQorICAgICAgICAgICAgICAgICAgICA6IFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkVmlldy5zZXRWaXNpYmlsaXR5KAorICAgICAgICAgICAgICAgICAgICBtQ3JlYXRpb25IYXJkS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8KKyAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXJBbHBoYSA9IG5ldyBQYXNzd29yZEVudHJ5S2V5Ym9hcmRIZWxwZXIoY29udGV4dCwgbUtleWJvYXJkVmlld0FscGhhLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBmYWxzZSk7CisgICAgICAgICAgICBtS2V5Ym9hcmRIZWxwZXIuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX05VTUVSSUMpOworICAgICAgICAgICAgbUtleWJvYXJkSGVscGVyQWxwaGEuc2V0S2V5Ym9hcmRNb2RlKFBhc3N3b3JkRW50cnlLZXlib2FyZEhlbHBlci5LRVlCT0FSRF9NT0RFX0FMUEhBKTsKKyAgICAgICAgICAgIG1LZXlib2FyZFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUtleWJvYXJkVmlld0FscGhhLnNldFZpc2liaWxpdHkoCisgICAgICAgICAgICAgICAgICAgIG1DcmVhdGlvbkhhcmRLZXlib2FyZEhpZGRlbiA9PSBDb25maWd1cmF0aW9uLkhBUkRLRVlCT0FSREhJRERFTl9OTworICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldFdpZHRoKG1LZXlib2FyZFZpZXdBbHBoYS5nZXRMYXlvdXRQYXJhbXMoKS53aWR0aCk7CisgICAgICAgIH0KIAotICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldFZpc2liaWxpdHkobUNyZWF0aW9uSGFyZEtleWJvYXJkSGlkZGVuID09IENvbmZpZ3VyYXRpb24uSEFSREtFWUJPQVJESElEREVOX05PCi0gICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgIDAsIDApOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKIAogICAgICAgICAvLyBUaGlzIGFsbG93cyBrZXlib2FyZHMgd2l0aCBvdmVybGFwcGluZyBxd2VydHkvbnVtZXJpYyBrZXlzIHRvIGNob29zZSBqdXN0IHRoZQogICAgICAgICAvLyBudW1lcmljIGtleXMuCi0gICAgICAgIGlmIChpc0FscGhhKSB7CisgICAgICAgIGlmIChtSXNBbHBoYSkgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoVGV4dEtleUxpc3RlbmVyLmdldEluc3RhbmNlKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0S2V5TGlzdGVuZXIoRGlnaXRzS2V5TGlzdGVuZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Bhc3N3b3JkX2NvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgbUtleWJvYXJkSGVscGVyLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ192aXJ0dWFsS2V5VmliZVBhdHRlcm4gOiAwKTsKKyAgICAgICAgaWYgKG1LZXlib2FyZEhlbHBlckFscGhhICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1LZXlib2FyZEhlbHBlckFscGhhLnNldFZpYnJhdGVQYXR0ZXJuKG1Mb2NrUGF0dGVyblV0aWxzLmlzVGFjdGlsZUZlZWRiYWNrRW5hYmxlZCgpID8KKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdmlydHVhbEtleVZpYmVQYXR0ZXJuIDogMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1bnRpbCB3ZSBnZXQgYW4gdXBkYXRlLi4uCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzYsOCArMTcyLDEyIEBACiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CisKICAgICAgICAgLy8gc3RhcnQgZnJlc2gKICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CisgICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOwogICAgICAgICBtUGFzc3dvcmRFbnRyeS5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKIApAQCAtMTc0LDYgKzIxNCw5IEBACiAgICAgICAgICAgICAgICAgbG9uZyBkZWFkbGluZSA9IG1Mb2NrUGF0dGVyblV0aWxzLnNldExvY2tvdXRBdHRlbXB0RGVhZGxpbmUoKTsKICAgICAgICAgICAgICAgICBoYW5kbGVBdHRlbXB0TG9ja291dChkZWFkbGluZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvblRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXNzd29yZF93cm9uZyk7CiAgICAgICAgIH0KICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0VGV4dCgiIik7CiAgICAgfQpAQCAtMTkxLDE0ICsyMzQsMTQgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgaW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KGluc3RydWN0aW9ucyk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KGluc3RydWN0aW9ucyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25GaW5pc2goKSB7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKICAgICAgICAgICAgICAgICBtS2V5Ym9hcmRWaWV3LnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0uc3RhcnQoKTsKICAgICB9CkBAIC0yNDQsMjQgKzI4Nyw0MSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gLS0tLS0tLS0tLSBJbmZvQ2FsbGJhY2sKKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaEJhdHRlcnlJbmZvKHNob3dCYXR0ZXJ5SW5mbywgcGx1Z2dlZEluLCBiYXR0ZXJ5TGV2ZWwpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25UaW1lQ2hhbmdlZCgpIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25SZWZyZXNoQ2FycmllckluZm8ocGxtbiwgc3BuKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgICAgIC8vIG5vdCBjdXJyZW50bHkgdXNlZAorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0gU2ltU3RhdGVDYWxsYmFjaworCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgewogICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uUmluZ2VyTW9kZUNoYW5nZWQoaW50IHN0YXRlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblRpbWVDaGFuZ2VkKCkgewotCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgaWYobUlzQWxwaGEpIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wYXNzd29yZF9jb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0dXNWaWV3LnNldEluc3RydWN0aW9uVGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fcGFzc3dvcmRfY29kZSk7CisgICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggNDE4ZTI0My4uMzVmYTNlNSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTI1LDkgKzI1LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwpAQCAtMzcsNyArMzQsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcuQ2VsbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIHNjcmVlbiB0aGF0IHNob3dzIHRoZSA5IGNpcmNsZSB1bmxvY2sgd2lkZ2V0IGFuZCBpbnN0cnVjdHMKQEAgLTc1LDI3ICs3MSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVGYWxsYmFjazsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1EYXRlRm9ybWF0U3RyaW5nOwotCi0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ2FycmllcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRlOwotCi0gICAgLy8gYXJlIHdlIHNob3dpbmcgYmF0dGVyeSBpbmZvcm1hdGlvbj8KLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IGZhbHNlOwotCi0gICAgLy8gbGFzdCBrbm93biBwbHVnZ2VkIGluIHN0YXRlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QbHVnZ2VkSW4gPSBmYWxzZTsKLQotICAgIC8vIGxhc3Qga25vd24gYmF0dGVyeSBsZXZlbAotICAgIHByaXZhdGUgaW50IG1CYXR0ZXJ5TGV2ZWwgPSAxMDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtTmV4dEFsYXJtID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czE7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3RhdHVzU2VwOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7Ci0KKyAgICBwcml2YXRlIFN0YXR1c1ZpZXcgbVN0YXR1c1ZpZXc7CiAKICAgICBwcml2YXRlIExvY2tQYXR0ZXJuVmlldyBtTG9ja1BhdHRlcm5WaWV3OwogCkBAIC0xMzMsMTUgKzEwOSwxOCBAQAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVGb290ZXIoRm9vdGVyTW9kZSBtb2RlKSB7CiAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICAgY2FzZSBOb3JtYWw6CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBub3JtYWwiKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEZvcmdvdExvY2tQYXR0ZXJuOgorICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1vZGUgRm9yZ290TG9ja1BhdHRlcm4iKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyTm9ybWFsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKICAgICAgICAgICAgICAgICBtRm9vdGVyRm9yZ290UGF0dGVybi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBWZXJpZnlVbmxvY2tlZDoKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIFZlcmlmeVVubG9ja2VkIik7CiAgICAgICAgICAgICAgICAgbUZvb3Rlck5vcm1hbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICAgICAgbUZvb3RlckZvcmdvdFBhdHRlcm4uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICB9CkBAIC0xODAsMjQgKzE1OSwxNiBAQAogICAgICAgICBtQ3JlYXRpb25PcmllbnRhdGlvbiA9IGNvbmZpZ3VyYXRpb24ub3JpZW50YXRpb247CiAKICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpOworCiAgICAgICAgIGlmIChtQ3JlYXRpb25PcmllbnRhdGlvbiAhPSBDb25maWd1cmF0aW9uLk9SSUVOVEFUSU9OX0xBTkRTQ0FQRSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicG9ydHJhaXQgbW9kZSIpOwogICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LCB0aGlzLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImxhbmRzY2FwZSBtb2RlIik7CiAgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLCB0aGlzLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIG1DYXJyaWVyID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYXJyaWVyKTsKLSAgICAgICAgbURhdGUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmRhdGUpOwotCi0gICAgICAgIG1EYXRlRm9ybWF0U3RyaW5nID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5mdWxsX3dkYXlfbW9udGhfZGF5X25vX3llYXIpOwotICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7Ci0KLSAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOwotICAgICAgICBtU3RhdHVzU2VwID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNTZXApOwotICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7Ci0KLSAgICAgICAgcmVzZXRTdGF0dXNJbmZvKCk7Ci0KKyAgICAgICAgbVN0YXR1c1ZpZXcgPSBuZXcgU3RhdHVzVmlldyh0aGlzLCBtVXBkYXRlTW9uaXRvciwgbUxvY2tQYXR0ZXJuVXRpbHMpOwogCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcgPSAoTG9ja1BhdHRlcm5WaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5sb2NrUGF0dGVybik7CiAKQEAgLTI0OSwxNSArMjIwLDExIEBACiAgICAgICAgIHVwZGF0ZU1vbml0b3IucmVnaXN0ZXJTaW1TdGF0ZUNhbGxiYWNrKHRoaXMpOwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKIAotICAgICAgICAvLyBSZXF1aXJlZCB0byBnZXQgTWFycXVlZSB0byB3b3JrLgotICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dENvbG9yKDB4ZmZmZmZmZmYpOwotCiAgICAgICAgIC8vIHVudGlsIHdlIGdldCBhbiB1cGRhdGUuLi4KLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcoCisgICAgICAgIG1TdGF0dXNWaWV3LnNldENhcnJpZXJUZXh0KExvY2tTY3JlZW4uZ2V0Q2FycmllclN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVBsbW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1VcGRhdGVNb25pdG9yLmdldFRlbGVwaG9ueVNwbigpKSk7CisKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEVtZXJnZW5jeUJ1dHRvblRleHQoKSB7CkBAIC0yNzAsODggKzIzNyw2IEBACiAgICAgICAgIG1FbmFibGVGYWxsYmFjayA9IHN0YXRlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCByZXNldFN0YXR1c0luZm8oKSB7Ci0gICAgICAgIG1JbnN0cnVjdGlvbnMgPSBudWxsOwotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gbVVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7Ci0gICAgICAgIG1QbHVnZ2VkSW4gPSBtVXBkYXRlTW9uaXRvci5pc0RldmljZVBsdWdnZWRJbigpOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gbVVwZGF0ZU1vbml0b3IuZ2V0QmF0dGVyeUxldmVsKCk7Ci0gICAgICAgIG1OZXh0QWxhcm0gPSBtTG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzTGluZXMoKSB7Ci0gICAgICAgIGlmIChtSW5zdHJ1Y3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyBvbmx5Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1JbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1JbnN0cnVjdGlvbnMpKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1c1NlcC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNob3dpbmdCYXR0ZXJ5SW5mbyAmJiBtTmV4dEFsYXJtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGJhdHRlcnkgb25seQotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5TGV2ZWwgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fY2hhcmdlZCkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmxvY2tzY3JlZW5fcGx1Z2dlZF9pbiwgbUJhdHRlcnlMZXZlbCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiAhbVNob3dpbmdCYXR0ZXJ5SW5mbykgewotICAgICAgICAgICAgLy8gYWxhcm0gb25seQotICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtTmV4dEFsYXJtKTsKLSAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgaWYgKG1OZXh0QWxhcm0gIT0gbnVsbCAmJiBtU2hvd2luZ0JhdHRlcnlJbmZvKSB7Ci0gICAgICAgICAgICAvLyBib3RoIGJhdHRlcnkgYW5kIG5leHQgYWxhcm0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFRleHQoInwiKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0LAotICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbigxMDAsIG1CYXR0ZXJ5TGV2ZWwpKSk7Ci0gICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsIDAsIDApOwotICAgICAgICAgICAgaWYgKG1QbHVnZ2VkSW4pIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfY2hhcmdpbmcsIDAsIDAsIDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdGF0dXNTZXAuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpYyB0byBzaG93OyBzaG93IGdlbmVyYWwgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpOwotICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2xvY2ssIDAsIDAsIDApOwotCi0gICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3RhdHVzU2VwLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKSB7Ci0gICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKLSAgICB9Ci0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewogICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSB1c2VyIGlzIGVudGVyaW5nIGEgcGF0dGVybiAoaS5lIHNlbmRpbmcgYSB0b3VjaApAQCAtMzY2LDI1ICsyNTEsMjEgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLQogICAgIC8vIC0tLS0tLS0tLS0gSW5mb0NhbGxiYWNrCiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewotICAgICAgICBtU2hvd2luZ0JhdHRlcnlJbmZvID0gc2hvd0JhdHRlcnlJbmZvOwotICAgICAgICBtUGx1Z2dlZEluID0gcGx1Z2dlZEluOwotICAgICAgICBtQmF0dGVyeUxldmVsID0gYmF0dGVyeUxldmVsOwotICAgICAgICB1cGRhdGVTdGF0dXNMaW5lcygpOworICAgICAgICBtU3RhdHVzVmlldy5vblJlZnJlc2hCYXR0ZXJ5SW5mbyhzaG93QmF0dGVyeUluZm8sIHBsdWdnZWRJbiwgYmF0dGVyeUxldmVsKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7Ci0gICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICAgICAgbVN0YXR1c1ZpZXcub25UaW1lQ2hhbmdlZCgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKLSAgICAgICAgbUNhcnJpZXIuc2V0VGV4dChMb2NrU2NyZWVuLmdldENhcnJpZXJTdHJpbmcocGxtbiwgc3BuKSk7CisgICAgICAgIG1TdGF0dXNWaWV3Lm9uUmVmcmVzaENhcnJpZXJJbmZvKHBsbW4sIHNwbik7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KQEAgLTQ0NCw4ICszMjUsOCBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgLy8gcmVzZXQgaGVhZGVyCi0gICAgICAgIHJlc2V0U3RhdHVzSW5mbygpOworICAgICAgICAvLyByZXNldCBzdGF0dXMKKyAgICAgICAgbVN0YXR1c1ZpZXcucmVzZXRTdGF0dXNJbmZvKG1VcGRhdGVNb25pdG9yLCBtTG9ja1BhdHRlcm5VdGlscyk7CiAKICAgICAgICAgLy8gcmVzZXQgbG9jayBwYXR0ZXJuCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcuZW5hYmxlSW5wdXQoKTsKQEAgLTUxNCw4ICszOTUsOCBAQAogICAgICAgICAgICAgaWYgKG1Mb2NrUGF0dGVyblV0aWxzLmNoZWNrUGF0dGVybihwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREaXNwbGF5TW9kZShMb2NrUGF0dGVyblZpZXcuRGlzcGxheU1vZGUuQ29ycmVjdCk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9ICIiOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKCIiKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5rZXlndWFyZERvbmUodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlcG9ydFN1Y2Nlc3NmdWxVbmxvY2tBdHRlbXB0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTMzLDggKzQxNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUF0dGVtcHRMb2Nrb3V0KGRlYWRsaW5lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1VbmxvY2tJY29uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX3dyb25nKSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNWaWV3LnVwZGF0ZVN0YXR1c0xpbmVzKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcucG9zdERlbGF5ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbFBhdHRlcm5SdW5uYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRURVJOX0NMRUFSX1RJTUVPVVRfTVMpOwpAQCAtNTUyLDE3ICs0MzQsMTggQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKGxvbmcgbWlsbGlzVW50aWxGaW5pc2hlZCkgewogICAgICAgICAgICAgICAgIGludCBzZWNvbmRzUmVtYWluaW5nID0gKGludCkgKG1pbGxpc1VudGlsRmluaXNoZWQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fdG9vX21hbnlfZmFpbGVkX2F0dGVtcHRzX2NvdW50ZG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHNSZW1haW5pbmcpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c0xpbmVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzUmVtYWluaW5nKSk7CisgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcudXBkYXRlU3RhdHVzTGluZXMoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaCgpIHsKICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5WaWV3LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUluc3RydWN0aW9ucyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9wYXR0ZXJuX2luc3RydWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRJbnN0cnVjdGlvbnMoZ2V0Q29udGV4dCgpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fcGF0dGVybl9pbnN0cnVjdGlvbnMpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcygpOwogICAgICAgICAgICAgICAgIC8vIFRPRE8gbVVubG9ja0ljb24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogICAgICAgICAgICAgICAgIG1GYWlsZWRQYXR0ZXJuQXR0ZW1wdHNTaW5jZUxhc3RUaW1lb3V0ID0gMDsKICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZUZhbGxiYWNrKSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggZGZmY2NmOC4uYzI1ZGYxZCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMjQsMTEgKzI0LDE1IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LkJhc2VTdXJmYWNlSG9sZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuUm9vdFZpZXdTdXJmYWNlVGFrZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5TdGFuZGFsb25lQWN0aW9uTW9kZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuQ29udGV4dE1lbnVCdWlsZGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudURpYWxvZ0hlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVBvcHVwSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuU3ViTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkFjdGlvbkJhckNvbnRleHRWaWV3OworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5BY3Rpb25CYXJWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuS2V5Z3VhcmRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlNlYXJjaE1hbmFnZXI7CkBAIC01Myw2ICs1Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5IYXB0aWNGZWVkYmFja0NvbnN0YW50czsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZTsKQEAgLTY2LDYgKzcxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1N0dWI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZvbHVtZVBhbmVsOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CkBAIC05NSw3ICsxMDEsNyBAQAogICAgICAqIFNpbXBsZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBjb250ZXh0IG1lbnUgYW5kIGl0cyBzdWJtZW51cy4gVGhlIG9wdGlvbnMKICAgICAgKiBtZW51IHN1Ym1lbnVzIGRvIG5vdCB1c2UgdGhpcyAodGhlaXIgYmVoYXZpb3IgaXMgbW9yZSBjb21wbGV4KS4KICAgICAgKi8KLSAgICBDb250ZXh0TWVudUNhbGxiYWNrIG1Db250ZXh0TWVudUNhbGxiYWNrID0gbmV3IENvbnRleHRNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOworICAgIERpYWxvZ01lbnVDYWxsYmFjayBtQ29udGV4dE1lbnVDYWxsYmFjayA9IG5ldyBEaWFsb2dNZW51Q2FsbGJhY2soRkVBVFVSRV9DT05URVhUX01FTlUpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIHZpZXcgb2YgdGhlIHdpbmRvdywgY29udGFpbmluZyB0aGUgd2luZG93IGRlY29yLgogICAgIHByaXZhdGUgRGVjb3JWaWV3IG1EZWNvcjsKQEAgLTExNCw2ICsxMjAsOCBAQAogICAgIHByaXZhdGUgTGF5b3V0SW5mbGF0ZXIgbUxheW91dEluZmxhdGVyOwogCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OworICAgIAorICAgIHByaXZhdGUgQWN0aW9uQmFyVmlldyBtQWN0aW9uQmFyOwogCiAgICAgcHJpdmF0ZSBEcmF3YWJsZUZlYXR1cmVTdGF0ZVtdIG1EcmF3YWJsZXM7CiAKQEAgLTE5MSw4ICsxOTksMTIgQEAKICAgICAgICAgICAgIC8qIEN1c3RvbSB0aXRsZSBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSB1c2VyIGlzIHRyeWluZyB0byBlbmFibGUgYW5vdGhlciBmZWF0dXJlICovCiAgICAgICAgICAgICB0aHJvdyBuZXcgQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb24oIllvdSBjYW5ub3QgY29tYmluZSBjdXN0b20gdGl0bGVzIHdpdGggb3RoZXIgdGl0bGUgZmVhdHVyZXMiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfT1BFTkdMKSB7Ci0gICAgICAgICAgICBnZXRBdHRyaWJ1dGVzKCkubWVtb3J5VHlwZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1FTU9SWV9UWVBFX0dQVTsKKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfTk9fVElUTEUpKSAhPSAwICYmIGZlYXR1cmVJZCA9PSBGRUFUVVJFX0FDVElPTl9CQVIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSWdub3JlLiBObyB0aXRsZSBkb21pbmF0ZXMuCisgICAgICAgIH0KKyAgICAgICAgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDAgJiYgZmVhdHVyZUlkID09IEZFQVRVUkVfTk9fVElUTEUpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYWN0aW9uIGJhciBmZWF0dXJlIGlmIHdlIGhhdmUgbm8gdGl0bGUuIE5vIHRpdGxlIGRvbWluYXRlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdEZlYXR1cmUoZmVhdHVyZUlkKTsKICAgICB9CkBAIC0yNzYsNiArMjg4LDggQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKICAgICAgICAgaWYgKG1UaXRsZVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgICB9CiAgICAgICAgIG1UaXRsZSA9IHRpdGxlOwogICAgIH0KQEAgLTMwMSw3ICszMTUsNyBAQAogICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkIChpc1ByZXBhcmVkIHdpbGwgYmUgcmVzZXQgdG8gZmFsc2UgbGF0ZXIpCiAgICAgICAgIGlmIChzdC5pc1ByZXBhcmVkKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KKyAgICAgICAgCiAgICAgICAgIGlmICgobVByZXBhcmVkUGFuZWwgIT0gbnVsbCkgJiYgKG1QcmVwYXJlZFBhbmVsICE9IHN0KSkgewogICAgICAgICAgICAgLy8gQW5vdGhlciBQYW5lbCBpcyBwcmVwYXJlZCBhbmQgcG9zc2libHkgb3Blbiwgc28gY2xvc2UgaXQKICAgICAgICAgICAgIGNsb3NlUGFuZWwobVByZXBhcmVkUGFuZWwsIGZhbHNlKTsKQEAgLTMxNSw5ICszMjksMTEgQEAKIAogICAgICAgICBpZiAoc3QuY3JlYXRlZFBhbmVsVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBJbml0IHRoZSBwYW5lbCBzdGF0ZSdzIG1lbnUtLXJldHVybiBmYWxzZSBpZiBpbml0IGZhaWxlZAotICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHN0Lm1lbnUgPT0gbnVsbCB8fCBzdC5yZWZyZXNoTWVudUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QubWVudSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZVBhbmVsTWVudShzdCkgfHwgKHN0Lm1lbnUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDYWxsIGNhbGxiYWNrLCBhbmQgcmV0dXJuIGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IG1lbnUKICAgICAgICAgICAgICAgICBpZiAoKGNiID09IG51bGwpIHx8ICFjYi5vbkNyZWF0ZVBhbmVsTWVudShzdC5mZWF0dXJlSWQsIHN0Lm1lbnUpKSB7CkBAIC0zMjYsNiArMzQyLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5zZXRNZW51KHN0Lm1lbnUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2FsbGJhY2sgYW5kIHJldHVybiBpZiB0aGUgY2FsbGJhY2sgZG9lcyBub3Qgd2FudCB0byBzaG93IHRoZSBtZW51CkBAIC0zNDksMzYgKzM3MSwzNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBmYWxzZSk7Ci0gICAgICAgIGlmICgoc3QgIT0gbnVsbCkgJiYgKHN0Lm1lbnUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OworICAgICAgICAvLyBBY3Rpb24gYmFycyBoYW5kbGUgdGhlaXIgb3duIG1lbnUgc3RhdGUKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgPT0gbnVsbCkgeworICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKChzdCAhPSBudWxsKSAmJiAoc3QubWVudSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnVCdWlsZGVyID0gKE1lbnVCdWlsZGVyKSBzdC5tZW51OwogCi0gICAgICAgICAgICBpZiAoc3QuaXNPcGVuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRnJlZXplIHN0YXRlCi0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgIG1lbnVCdWlsZGVyLnNhdmVIaWVyYXJjaHlTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBGcmVlemUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHN0YXRlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5zYXZlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBtZW51IHZpZXdzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSByZWNyZWF0ZWQKLSAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1lbnUgdmlld3Mgc2luY2UgdGhleSBuZWVkIHRvIGJlIHJlY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNsZWFyTWVudVZpZXdzKHN0KTsKIAotICAgICAgICAgICAgICAgIC8vIFJlLW9wZW4gdGhlIHNhbWUgbWVudQotICAgICAgICAgICAgICAgIHJlb3Blbk1lbnUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAvLyBSZS1vcGVuIHRoZSBzYW1lIG1lbnUKKyAgICAgICAgICAgICAgICAgICAgcmVvcGVuTWVudShmYWxzZSk7CiAKLSAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHN0YXRlCi0gICAgICAgICAgICAgICAgbWVudUJ1aWxkZXIucmVzdG9yZUhpZXJhcmNoeVN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBtZW51QnVpbGRlci5yZXN0b3JlSGllcmFyY2h5U3RhdGUoc3RhdGUpOwogCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIENsZWFyIG1lbnUgdmlld3Mgc28gb24gbmV4dCBtZW51IG9wZW5pbmcsIGl0IHdpbGwgdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKLSAgICAgICAgICAgICAgICBjbGVhck1lbnVWaWV3cyhzdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVudSB2aWV3cyBzbyBvbiBuZXh0IG1lbnUgb3BlbmluZywgaXQgd2lsbCB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlciBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNZW51Vmlld3Moc3QpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhck1lbnVWaWV3cyhQYW5lbEZlYXR1cmVTdGF0ZSBzdCkgewotCiAgICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBjb25maWcgY2hhbmdlcywgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZQogICAgICAgICAvLyB0aGUgdmlld3Mgd2lsbCBiZSByZWNvbnN0cnVjdGVkIGJhc2VkIG9uIHRoZSBuZXcgb3JpZW50YXRpb24sIGV0Yy4KIApAQCAtMzkzLDcgKzQxNiwxMiBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgb3BlblBhbmVsKGludCBmZWF0dXJlSWQsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9wZW5QYW5lbChnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSksIGV2ZW50KTsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5zaG93T3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGVuUGFuZWwoZ2V0UGFuZWxTdGF0ZShmZWF0dXJlSWQsIHRydWUpLCBldmVudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb3BlblBhbmVsKFBhbmVsRmVhdHVyZVN0YXRlIHN0LCBLZXlFdmVudCBldmVudCkgewpAQCAtNDg0LDcgKzUxMiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2VQYW5lbChpbnQgZmVhdHVyZUlkKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9DT05URVhUX01FTlUpIHsKKyAgICAgICAgaWYgKGZlYXR1cmVJZCA9PSBGRUFUVVJFX09QVElPTlNfUEFORUwgJiYgbUFjdGlvbkJhciAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5pc092ZXJmbG93UmVzZXJ2ZWQoKSkgeworICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkID09IEZFQVRVUkVfQ09OVEVYVF9NRU5VKSB7CiAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZVBhbmVsKGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKSwgdHJ1ZSk7CkBAIC01NDUsNiArNTc2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlUGFuZWxNZW51KGludCBmZWF0dXJlSWQpIHsKKyAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CisgICAgICAgIGlmIChzdC5tZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0Lm1lbnUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzdC5yZWZyZXNoTWVudUNvbnRlbnQgPSB0cnVlOworICAgICAgICBzdC5yZWZyZXNoRGVjb3JWaWV3ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIC8vIFByZXBhcmUgdGhlIG9wdGlvbnMgcGFuZWwgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gYmFyCisgICAgICAgIGlmICgoZmVhdHVyZUlkID09IEZFQVRVUkVfQUNUSU9OX0JBUiB8fCBmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMKQorICAgICAgICAgICAgICAgICYmIG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3QgPSBnZXRQYW5lbFN0YXRlKFdpbmRvdy5GRUFUVVJFX09QVElPTlNfUEFORUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3QuaXNQcmVwYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHByZXBhcmVQYW5lbChzdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBhbmVsIGtleSBpcyBwdXNoZWQgZG93bi4KICAgICAgKiBAcGFyYW0gZmVhdHVyZUlkIFRoZSBmZWF0dXJlIElEIG9mIHRoZSByZWxldmFudCBwYW5lbCAoZGVmYXVsdHMgdG8gRkVBVFVSRV9PUFRJT05TX1BBTkVMfS4KQEAgLTU1OCw3ICs2MDksNyBAQAogICAgICAgICAgICAgLy8gVGhlIHBhbmVsIGtleSB3YXMgcHVzaGVkLCBzbyBzZXQgdGhlIGNob3JkaW5nIGtleQogICAgICAgICAgICAgbVBhbmVsQ2hvcmRpbmdLZXkgPSBrZXlDb2RlOwogICAgICAgICAgICAgbVBhbmVsTWF5TG9uZ1ByZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKGZlYXR1cmVJZCwgdHJ1ZSk7CiAgICAgICAgICAgICBpZiAoIXN0LmlzT3BlbikgewogICAgICAgICAgICAgICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmtleWJvYXJkCkBAIC01NjcsNyArNjE4LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVQYW5lbChzdCwgZXZlbnQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0gZWxzZSBpZiAobVBhbmVsTWF5TG9uZ1ByZXNzICYmIG1QYW5lbENob3JkaW5nS2V5ID09IGtleUNvZGUKICAgICAgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZ3MoKSZLZXlFdmVudC5GTEFHX0xPTkdfUFJFU1MpICE9IDApIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmUgaGFkIGEgbG9uZyBwcmVzcyB3aGlsZSBpbiBhIHN0YXRlIHdoZXJlIHRoaXMKQEAgLTYwMiwyNSArNjUyLDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGJvb2xlYW4gcGxheVNvdW5kRWZmZWN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKLSAgICAgICAgICAgIGlmIChzdC5pc09wZW4gfHwgc3QuaXNIYW5kbGVkKSB7CisgICAgICAgICAgICBmaW5hbCBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoZmVhdHVyZUlkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlSWQgPT0gRkVBVFVSRV9PUFRJT05TX1BBTkVMICYmIG1BY3Rpb25CYXIgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dSZXNlcnZlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi5vblByZXBhcmVQYW5lbChmZWF0dXJlSWQsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IG1BY3Rpb25CYXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LmlzT3BlbiB8fCBzdC5pc0hhbmRsZWQpIHsKIAotICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBqdXN0IHJlbGVhc2VkIGEgbWVudSBzaG9ydGN1dCkKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSBzdC5pc09wZW47CisgICAgICAgICAgICAgICAgICAgIC8vIFBsYXkgdGhlIHNvdW5kIGVmZmVjdCBpZiB0aGUgdXNlciBjbG9zZWQgYW4gb3BlbiBtZW51IChhbmQgbm90IGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXkganVzdCByZWxlYXNlZCBhIG1lbnUgc2hvcnRjdXQpCisgICAgICAgICAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdCA9IHN0LmlzT3BlbjsKIAotICAgICAgICAgICAgICAgIC8vIENsb3NlIG1lbnUKLSAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgbWVudQorICAgICAgICAgICAgICAgICAgICBjbG9zZVBhbmVsKHN0LCB0cnVlKTsKIAotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC5pc1ByZXBhcmVkKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNTAwMDEsIDApOworICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSAnbWVudSBvcGVuZWQnIHRvIGV2ZW50IGxvZworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KDUwMDAxLCAwKTsKIAotICAgICAgICAgICAgICAgIC8vIFNob3cgbWVudQotICAgICAgICAgICAgICAgIG9wZW5QYW5lbChzdCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAvLyBTaG93IG1lbnUKKyAgICAgICAgICAgICAgICAgICAgb3BlblBhbmVsKHN0LCBldmVudCk7CiAKLSAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBwbGF5U291bmRFZmZlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHBsYXlTb3VuZEVmZmVjdCkgewpAQCAtNzc3LDggKzg0MCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCi0gICAgICAgIG5ldyBNZW51RGlhbG9nSGVscGVyKHN1Yk1lbnUpLnNob3cobnVsbCk7CisgICAgICAgIGZpbmFsIE1lbnUgcGFyZW50TWVudSA9IHN1Yk1lbnUuZ2V0Um9vdE1lbnUoKTsKKyAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgcGFuZWwgPSBmaW5kTWVudVBhbmVsKHBhcmVudE1lbnUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVzZSB0aGUgcGFuZWwgb3BlbiBzdGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGNvbWluZyBmcm9tIGFuIG9wZW4gcGFuZWwKKyAgICAgICAgICogb3IgYW4gYWN0aW9uIGJ1dHRvbi4gSWYgaXQncyBhbiBvcGVuIHBhbmVsIHdlIHdhbnQgdG8gdXNlIE1lbnVEaWFsb2dIZWxwZXIuCisgICAgICAgICAqIElmIGl0J3MgY2xvc2VkIHdlIHdhbnQgdG8gZ3JhYiB0aGUgcmVsZXZhbnQgdmlldyBhbmQgY3JlYXRlIGEgcG9wdXAgYW5jaG9yZWQgdG8gaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAocGFuZWwuaXNPcGVuKSB7CisgICAgICAgICAgICAvLyBUaGUgd2luZG93IG1hbmFnZXIgd2lsbCBnaXZlIHVzIGEgdmFsaWQgd2luZG93IHRva2VuCisgICAgICAgICAgICBuZXcgTWVudURpYWxvZ0hlbHBlcihzdWJNZW51KS5zaG93KG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIHN1Yk1lbnUpLnNob3coKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTc4OCw2ICs4NjMsMjEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVvcGVuTWVudShib29sZWFuIHRvZ2dsZU1lbnVNb2RlKSB7CisgICAgICAgIGlmIChtQWN0aW9uQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbUFjdGlvbkJhci5pc092ZXJmbG93TWVudVNob3dpbmcoKSB8fCAhdG9nZ2xlTWVudU1vZGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYiA9IGdldENhbGxiYWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFuZWxGZWF0dXJlU3RhdGUgc3QgPSBnZXRQYW5lbFN0YXRlKEZFQVRVUkVfT1BUSU9OU19QQU5FTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYi5vblByZXBhcmVQYW5lbChGRUFUVVJFX09QVElPTlNfUEFORUwsIHN0LmNyZWF0ZWRQYW5lbFZpZXcsIHN0Lm1lbnUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbkJhci5oaWRlT3ZlcmZsb3dNZW51KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBQYW5lbEZlYXR1cmVTdGF0ZSBzdCA9IGdldFBhbmVsU3RhdGUoRkVBVFVSRV9PUFRJT05TX1BBTkVMLCB0cnVlKTsKIAogICAgICAgICAvLyBTYXZlIHRoZSBmdXR1cmUgZXhwYW5kZWQgbW9kZSBzdGF0ZSBzaW5jZSBjbG9zZVBhbmVsIHdpbGwgcmVzZXQgaXQKQEAgLTE0MzcsNiArMTUyNyw3IEBACiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEZPQ1VTRURfSURfVEFHID0gImFuZHJvaWQ6Zm9jdXNlZFZpZXdJZCI7CiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFZJRVdTX1RBRyA9ICJhbmRyb2lkOnZpZXdzIjsKICAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUEFORUxTX1RBRyA9ICJhbmRyb2lkOlBhbmVscyI7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIEFDVElPTl9CQVJfVEFHID0gImFuZHJvaWQ6QWN0aW9uQmFyIjsKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgQE92ZXJyaWRlCkBAIC0xNDcwLDYgKzE1NjEsMTAgQEAKICAgICAgICAgICAgIG91dFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheShQQU5FTFNfVEFHLCBwYW5lbFN0YXRlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKEFDVElPTl9CQVJfVEFHLCBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBvdXRTdGF0ZTsKICAgICB9CiAKQEAgLTE1MDQsNiArMTU5OSwxMCBAQAogICAgICAgICBpZiAocGFuZWxTdGF0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVzdG9yZVBhbmVsU3RhdGUocGFuZWxTdGF0ZXMpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCAmJiBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRykpIHsKKyAgICAgICAgICAgIG1BY3Rpb25CYXIucG9zdFNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5NCw2ICsxNjkzLDkgQEAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1XYXRjaGluZ0Zvck1lbnU7CiAgICAgICAgIHByaXZhdGUgaW50IG1Eb3duWTsKIAorICAgICAgICBwcml2YXRlIEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgICAgIHByaXZhdGUgQWN0aW9uQmFyQ29udGV4dFZpZXcgbUFjdGlvbk1vZGVWaWV3OworCiAgICAgICAgIHB1YmxpYyBEZWNvclZpZXcoQ29udGV4dCBjb250ZXh0LCBpbnQgZmVhdHVyZUlkKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CkBAIC0xNjAyLDcgKzE3MDQsOCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcGF0Y2hLZXlFdmVudChLZXlFdmVudCBldmVudCkgewogICAgICAgICAgICAgZmluYWwgaW50IGtleUNvZGUgPSBldmVudC5nZXRLZXlDb2RlKCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRG93biA9IGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9ET1dOOworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Rvd24gPSBhY3Rpb24gPT0gS2V5RXZlbnQuQUNUSU9OX0RPV047CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBJZiB0aGUgdXNlciBoaXRzIGFub3RoZXIga2V5IHdpdGhpbiB0aGUgcGxheSBzb3VuZCBkZWxheSwgdGhlbgpAQCAtMTY1OSw2ICsxNzYyLDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBCYWNrIGNhbmNlbHMgYWN0aW9uIG1vZGVzIGZpcnN0LgorICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwgJiYga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0JBQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgICAgICAgICBtQWN0aW9uTW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNiID0gZ2V0Q2FsbGJhY2soKTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFuZGxlZCA9IGNiICE9IG51bGwgJiYgbUZlYXR1cmVJZCA8IDAgPyBjYi5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KQogICAgICAgICAgICAgICAgICAgICA6IHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwpAQCAtMTg4MSw2ICsxOTkyLDU1IEBACiAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHRNZW51SGVscGVyICE9IG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlRm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcsCisgICAgICAgICAgICAgICAgQWN0aW9uTW9kZS5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgLy8gb3JpZ2luYWxWaWV3IGNhbiBiZSB1c2VkIGhlcmUgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IG9ic2N1cmUKKyAgICAgICAgICAgIC8vIHJlbGV2YW50IGNvbnRlbnQgd2l0aCB0aGUgY29udGV4dCBtb2RlIFVJLgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0QWN0aW9uTW9kZShjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFjdGlvbk1vZGUgc3RhcnRBY3Rpb25Nb2RlKEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChtQWN0aW9uTW9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGUuZmluaXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgd3JhcHBlZENhbGxiYWNrID0gbmV3IEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoY2FsbGJhY2spOworICAgICAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gZ2V0Q2FsbGJhY2soKS5vblN0YXJ0QWN0aW9uTW9kZSh3cmFwcGVkQ2FsbGJhY2spOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXNGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IG5ldyBBY3Rpb25CYXJDb250ZXh0VmlldyhtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUQ0hfUEFSRU5ULCBXUkFQX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmlldyhtQWN0aW9uTW9kZVZpZXcsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3U3R1YiBzdHViID0gKFZpZXdTdHViKSBmaW5kVmlld0J5SWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX21vZGVfYmFyX3N0dWIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0dWIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlVmlldyA9IChBY3Rpb25CYXJDb250ZXh0Vmlldykgc3R1Yi5pbmZsYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IG5ldyBTdGFuZGFsb25lQWN0aW9uTW9kZShnZXRDb250ZXh0KCksIG1BY3Rpb25Nb2RlVmlldywgd3JhcHBlZENhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LmluaXRGb3JNb2RlKG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTW9kZTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q2hhbmdpbmcoKSB7CiAgICAgICAgICAgICBtQ2hhbmdpbmcgPSB0cnVlOwogICAgICAgICB9CkBAIC0yMDYwLDYgKzIyMjAsMzcgQEAKICAgICAgICAgICAgIGlmIChrZWVwT24pIFBob25lV2luZG93LnRoaXMuYWRkRmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTik7CiAgICAgICAgICAgICBlbHNlIFBob25lV2luZG93LnRoaXMuY2xlYXJGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0tFRVBfU0NSRUVOX09OKTsKICAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgb3V0IGludGVybmFsIHJlZmVyZW5jZSB3aGVuIHRoZSBhY3Rpb24gbW9kZSBpcyBkZXN0cm95ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGNsYXNzIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIgaW1wbGVtZW50cyBBY3Rpb25Nb2RlLkNhbGxiYWNrIHsKKyAgICAgICAgICAgIHByaXZhdGUgQWN0aW9uTW9kZS5DYWxsYmFjayBtV3JhcHBlZDsKKworICAgICAgICAgICAgcHVibGljIEFjdGlvbk1vZGVDYWxsYmFja1dyYXBwZXIoQWN0aW9uTW9kZS5DYWxsYmFjayB3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQub25DcmVhdGVBY3Rpb25Nb2RlKG1vZGUsIG1lbnUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblByZXBhcmVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uUHJlcGFyZUFjdGlvbk1vZGUobW9kZSwgbWVudSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQWN0aW9uSXRlbUNsaWNrZWQoQWN0aW9uTW9kZSBtb2RlLCBNZW51SXRlbSBpdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVkLm9uQWN0aW9uSXRlbUNsaWNrZWQobW9kZSwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlKSB7CisgICAgICAgICAgICAgICAgbVdyYXBwZWQub25EZXN0cm95QWN0aW9uTW9kZShtb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGlvbk1vZGVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGlvbk1vZGVWaWV3LnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBEZWNvclZpZXcgZ2VuZXJhdGVEZWNvcigpIHsKQEAgLTIxMDgsNiArMjI5OSwxNyBAQAogCiAgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd05vVGl0bGUsIGZhbHNlKSkgewogICAgICAgICAgICAgcmVxdWVzdEZlYXR1cmUoRkVBVFVSRV9OT19USVRMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXIsIGZhbHNlKSkgeworICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgYW4gYWN0aW9uIGJhciBpZiB0aGVyZSBpcyBubyB0aXRsZS4KKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dBY3Rpb25CYXJPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX0JBUl9PVkVSTEFZKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhLmdldEJvb2xlYW4oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuV2luZG93X3dpbmRvd0FjdGlvbk1vZGVPdmVybGF5LCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RGZWF0dXJlKEZFQVRVUkVfQUNUSU9OX01PREVfT1ZFUkxBWSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLldpbmRvd193aW5kb3dGdWxsc2NyZWVuLCBmYWxzZSkpIHsKQEAgLTIxNzIsMTEgKzIzNzQsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGVfaWNvbnM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZSBJY29ucyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoKDEgPDwgRkVBVFVSRV9QUk9HUkVTUykgfCAoMSA8PCBGRUFUVVJFX0lOREVURVJNSU5BVEVfUFJPR1JFU1MpKSkgIT0gMCkgewogICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHdpbmRvdyB3aXRoIG9ubHkgYSBwcm9ncmVzcyBiYXIgKGFuZCB0aXRsZSkuCiAgICAgICAgICAgICAvLyBYWFggTmVlZCB0byBoYXZlIGEgbm8tdGl0bGUgdmVyc2lvbiBvZiBlbWJlZGRlZCB3aW5kb3dzLgogICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fcHJvZ3Jlc3M7CisgICAgICAgICAgICAvLyBYWFggUmVtb3ZlIHRoaXMgb25jZSBhY3Rpb24gYmFyIHN1cHBvcnRzIHRoZXNlIGZlYXR1cmVzLgorICAgICAgICAgICAgcmVtb3ZlRmVhdHVyZShGRUFUVVJFX0FDVElPTl9CQVIpOwogICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9ncmVzcyEiKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX0NVU1RPTV9USVRMRSkpICE9IDApIHsKICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSB3aW5kb3cgd2l0aCBhIGN1c3RvbSB0aXRsZS4KQEAgLTIxODYsMTEgKzIzOTIsMTkgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fY3VzdG9tX3RpdGxlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWFhYIFJlbW92ZSB0aGlzIG9uY2UgYWN0aW9uIGJhciBzdXBwb3J0cyB0aGVzZSBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJlbW92ZUZlYXR1cmUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmVhdHVyZXMgJiAoMSA8PCBGRUFUVVJFX05PX1RJVExFKSkgPT0gMCkgewogICAgICAgICAgICAgLy8gSWYgbm8gb3RoZXIgZmVhdHVyZXMgYW5kIG5vdCBlbWJlZGRlZCwgb25seSBuZWVkIGEgdGl0bGUuCiAgICAgICAgICAgICAvLyBJZiB0aGUgd2luZG93IGlzIGZsb2F0aW5nLCB3ZSBuZWVkIGEgZGlhbG9nIGxheW91dAogICAgICAgICAgICAgaWYgKG1Jc0Zsb2F0aW5nKSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5kaWFsb2dfdGl0bGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChmZWF0dXJlcyAmICgxIDw8IEZFQVRVUkVfQUNUSU9OX0JBUikpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZlYXR1cmVzICYgKDEgPDwgRkVBVFVSRV9BQ1RJT05fQkFSX09WRVJMQVkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dFJlc291cmNlID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2NyZWVuX2FjdGlvbl9iYXJfb3ZlcmxheTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXRSZXNvdXJjZSA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNjcmVlbl9hY3Rpb25fYmFyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbGF5b3V0UmVzb3VyY2UgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5zY3JlZW5fdGl0bGU7CiAgICAgICAgICAgICB9CkBAIC0yMjc1LDYgKzI0ODksMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIgPSAoQWN0aW9uQmFyVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGlvbkJhci5nZXRUaXRsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25CYXIuc2V0V2luZG93VGl0bGUobVRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IHRoZSBwYW5lbCBpbnZhbGlkYXRlIGZvciBsYXRlcjsgYXZvaWQgYXBwbGljYXRpb24gb25DcmVhdGVPcHRpb25zTWVudQorICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBvbkNyZWF0ZSBvciBzaW1pbGFyLgorICAgICAgICAgICAgICAgICAgICBtRGVjb3IucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYW5lbE1lbnUoRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI2MjgsNiArMjg1OCw4IEBACiAKICAgICAgICAgYm9vbGVhbiByZWZyZXNoRGVjb3JWaWV3OwogCisgICAgICAgIGJvb2xlYW4gcmVmcmVzaE1lbnVDb250ZW50OworICAgICAgICAKICAgICAgICAgYm9vbGVhbiB3YXNMYXN0T3BlbjsKICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gd2FzTGFzdEV4cGFuZGVkOwpAQCAtMjc1MCwxMSArMjk4MiwxMSBAQAogICAgICAqIDxsaT4gQ2FsbHMgYmFjayB0byB0aGUgY2FsbGJhY2sncyBvbk1lbnVJdGVtU2VsZWN0ZWQgd2hlbiBhbiBpdGVtIGlzCiAgICAgICogc2VsZWN0ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZXh0TWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRGlhbG9nTWVudUNhbGxiYWNrIGltcGxlbWVudHMgTWVudUJ1aWxkZXIuQ2FsbGJhY2sgewogICAgICAgICBwcml2YXRlIGludCBtRmVhdHVyZUlkOwogICAgICAgICBwcml2YXRlIE1lbnVEaWFsb2dIZWxwZXIgbVN1Yk1lbnVIZWxwZXI7CiAKLSAgICAgICAgcHVibGljIENvbnRleHRNZW51Q2FsbGJhY2soaW50IGZlYXR1cmVJZCkgeworICAgICAgICBwdWJsaWMgRGlhbG9nTWVudUNhbGxiYWNrKGludCBmZWF0dXJlSWQpIHsKICAgICAgICAgICAgIG1GZWF0dXJlSWQgPSBmZWF0dXJlSWQ7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKaW5kZXggMjc0MTI0Yi4uNzAwOWM2NSAxMDA3NTUKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCkBAIC00Niw2ICs0Niw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuUG9saWN5TWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhclNlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LklUZWxlcGhvbnk7CkBAIC0xNzYsNiArMTc3LDcgQEAKICAgICBDb250ZXh0IG1Db250ZXh0OwogICAgIElXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOwogICAgIExvY2FsUG93ZXJNYW5hZ2VyIG1Qb3dlck1hbmFnZXI7CisgICAgSVN0YXR1c0JhclNlcnZpY2UgbVN0YXR1c0JhclNlcnZpY2U7CiAgICAgVmlicmF0b3IgbVZpYnJhdG9yOyAvLyBWaWJyYXRvciBmb3IgZ2l2aW5nIGZlZWRiYWNrIG9mIG9yaWVudGF0aW9uIGNoYW5nZXMKIAogICAgIC8vIFZpYnJhdG9yIHBhdHRlcm4gZm9yIGhhcHRpYyBmZWVkYmFjayBvZiBhIGxvbmcgcHJlc3MuCkBAIC0xOTgsNiArMjAwLDcgQEAKICAgICAKICAgICBib29sZWFuIG1TYWZlTW9kZTsKICAgICBXaW5kb3dTdGF0ZSBtU3RhdHVzQmFyID0gbnVsbDsKKyAgICBib29sZWFuIG1TdGF0dXNCYXJDYW5IaWRlOwogICAgIGZpbmFsIEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4gbVN0YXR1c0JhclBhbmVscyA9IG5ldyBBcnJheUxpc3Q8V2luZG93U3RhdGU+KCk7CiAgICAgV2luZG93U3RhdGUgbUtleWd1YXJkID0gbnVsbDsKICAgICBLZXlndWFyZFZpZXdNZWRpYXRvciBtS2V5Z3VhcmRNZWRpYXRvcjsKQEAgLTI2MSw2ICsyNjQsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBSZWN0IG1UbXBWaXNpYmxlRnJhbWUgPSBuZXcgUmVjdCgpOwogICAgIAogICAgIFdpbmRvd1N0YXRlIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGU7CisgICAgYm9vbGVhbiBtVG9wSXNGdWxsc2NyZWVuOwogICAgIGJvb2xlYW4gbUZvcmNlU3RhdHVzQmFyOwogICAgIGJvb2xlYW4gbUhpZGVMb2NrU2NyZWVuOwogICAgIGJvb2xlYW4gbURpc21pc3NLZXlndWFyZDsKQEAgLTI4OCw2ICsyOTIsOSBAQAogCiAgICAgLy8gTm90aGluZyB0byBzZWUgaGVyZSwgbW92ZSBhbG9uZy4uLgogICAgIGludCBtRmFuY3lSb3RhdGlvbkFuaW1hdGlvbjsKKyAgICAKKyAgICAvLyBFbmFibGUgM0QgcmVjZW50cyBiYXNlZCBvbiBjb25maWcgc2V0dGluZ3MuCisgICAgcHJpdmF0ZSBCb29sZWFuIG1Vc2UzZFJlY2VudHM7CiAKICAgICBTaG9ydGN1dE1hbmFnZXIgbVNob3J0Y3V0TWFuYWdlcjsKICAgICBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbUJyb2FkY2FzdFdha2VMb2NrOwpAQCAtNDkwLDYgKzQ5NywyNyBAQAogICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgbGF1bmNoIHRoZSByZWNlbnQgYXBwcyBkaWFsb2cKICAgICAgKi8KICAgICB2b2lkIHNob3dSZWNlbnRBcHBzRGlhbG9nKCkgeworICAgICAgICAvLyBXZSBjYW4ndCBpbml0aWFsaXplIHRoaXMgaW4gaW5pdCgpIHNpbmNlIHRoZSBjb25maWd1cmF0aW9uIGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Vc2UzZFJlY2VudHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlUmVjZW50QXBwczNEKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gVXNlIDNkIFJlY2VudHMgZGlhbG9nCisgICAgICAgIGlmIChtVXNlM2RSZWNlbnRzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgCisgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0FDVElWSVRZX0VYQ0xVREVfRlJPTV9SRUNFTlRTKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxhdW5jaCBSZWNlbnRBcHBzSW50ZW50IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWxsYmFjayB0byBkaWFsb2cgaWYgd2UgZmFpbCB0byBsYXVuY2ggdGhlIGFib3ZlLgogICAgICAgICBpZiAobVJlY2VudEFwcHNEaWFsb2cgPT0gbnVsbCkgewogICAgICAgICAgICAgbVJlY2VudEFwcHNEaWFsb2cgPSBuZXcgUmVjZW50QXBwbGljYXRpb25zRGlhbG9nKG1Db250ZXh0KTsKICAgICAgICAgfQpAQCAtNTIxLDYgKzU0OSw3IEBACiAgICAgICAgIG1EZXNrRG9ja0ludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVTS19ET0NLKTsKICAgICAgICAgbURlc2tEb2NrSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCiAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRCk7CisKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbUJyb2FkY2FzdFdha2VMb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICJQaG9uZVdpbmRvd01hbmFnZXIubUJyb2FkY2FzdFdha2VMb2NrIik7CkBAIC01NjMsNiArNTkyLDkgQEAKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ19zYWZlTW9kZURpc2FibGVkVmliZVBhdHRlcm4pOwogICAgICAgICBtU2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4gPSBnZXRMb25nSW50QXJyYXkobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4pOworCisgICAgICAgIC8vIE5vdGU6IHRoZSBDb25maWd1cmF0aW9uIGlzIG5vdCBzdGFibGUgaGVyZSwgc28gd2UgY2Fubm90IGxvYWQgbVN0YXR1c0JhckNhbkhpZGUgZnJvbQorICAgICAgICAvLyBjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSBiZWNhdXNlIHRoZSBsYXR0ZXIgZGVwZW5kcyBvbiB0aGUgc2NyZWVuIHNpemUKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZXR0aW5ncygpIHsKQEAgLTk3NSw2ICsxMDA3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5BRERfTVVMVElQTEVfU0lOR0xFVE9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyID0gd2luOworCisgICAgICAgICAgICAgICAgLy8gVGhlIENvbmZpZ3VyYXRpb24gd2lsbCBiZSBzdGFibGUgYnkgbm93LCBzbyB3ZSBjYW4gbG9hZCB0aGlzCisgICAgICAgICAgICAgICAgbVN0YXR1c0JhckNhbkhpZGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ19zdGF0dXNCYXJDYW5IaWRlKTsKKwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUWVBFX1NUQVRVU19CQVJfUEFORUw6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTIzMyw3ICsxMjcwLDcgQEAKICAgICBwdWJsaWMgdm9pZCBnZXRDb250ZW50SW5zZXRIaW50THcoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgYXR0cnMsIFJlY3QgY29udGVudEluc2V0KSB7CiAgICAgICAgIGZpbmFsIGludCBmbCA9IGF0dHJzLmZsYWdzOwogICAgICAgICAKLSAgICAgICAgaWYgKChmbCAmCisgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSAmJiAoZmwgJgogICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgPT0gKEZMQUdfTEFZT1VUX0lOX1NDUkVFTiB8IEZMQUdfTEFZT1VUX0lOU0VUX0RFQ09SKSkgewogICAgICAgICAgICAgY29udGVudEluc2V0LnNldChtQ3VyTGVmdCwgbUN1clRvcCwgbVcgLSBtQ3VyUmlnaHQsIG1IIC0gbUN1ckJvdHRvbSk7CkBAIC0xMjY2LDEwICsxMzAzLDE3IEBACiAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5pc1Zpc2libGVMdygpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXR1cyBiYXIgaXMgaGlkZGVuLCB3ZSBkb24ndCB3YW50IHRvIGNhdXNlCiAgICAgICAgICAgICAgICAgLy8gd2luZG93cyBiZWhpbmQgaXQgdG8gc2Nyb2xsLgotICAgICAgICAgICAgICAgIG1Eb2NrVG9wID0gbUNvbnRlbnRUb3AgPSBtQ3VyVG9wID0gbVN0YXR1c0Jhci5nZXRGcmFtZUx3KCkuYm90dG9tOwotICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIlN0YXR1cyBiYXI6IG1Eb2NrQm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbURvY2tCb3R0b20gKyAiIG1Db250ZW50Qm90dG9tPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbnRlbnRCb3R0b20gKyAiIG1DdXJCb3R0b209IiArIG1DdXJCb3R0b20pOworICAgICAgICAgICAgICAgIGZpbmFsIFJlY3QgciA9IG1TdGF0dXNCYXIuZ2V0RnJhbWVMdygpOworICAgICAgICAgICAgICAgIGlmIChtRG9ja1RvcCA9PSByLnRvcCkgbURvY2tUb3AgPSByLmJvdHRvbTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtRG9ja0JvdHRvbSA9PSByLmJvdHRvbSkgbURvY2tCb3R0b20gPSByLnRvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudFRvcCA9IG1DdXJUb3AgPSBtRG9ja1RvcDsKKyAgICAgICAgICAgICAgICBtQ29udGVudEJvdHRvbSA9IG1DdXJCb3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTdGF0dXMgYmFyOiBtRG9ja1RvcD0iICsgbURvY2tUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ29udGVudFRvcD0iICsgbUNvbnRlbnRUb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtQ3VyVG9wPSIgKyBtQ3VyVG9wCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbURvY2tCb3R0b209IiArIG1Eb2NrQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUNvbnRlbnRCb3R0b209IiArIG1Db250ZW50Qm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbUN1ckJvdHRvbT0iICsgbUN1ckJvdHRvbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzU0LDcgKzEzOTgsNyBAQAogICAgICAgICAgICAgYXR0cnMuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NOwogICAgICAgICAgICAgbURvY2tMYXllciA9IHdpbi5nZXRTdXJmYWNlTGF5ZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgoZmwgJgorICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmCiAgICAgICAgICAgICAgICAgICAgIChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0ZVTExTQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpCiAgICAgICAgICAgICAgICAgICAgID09IChGTEFHX0xBWU9VVF9JTl9TQ1JFRU4gfCBGTEFHX0xBWU9VVF9JTlNFVF9ERUNPUikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIG5vcm1hbCBhY3Rpdml0eSB3aW5kb3c6IHdlIHdhbnQgaXQKQEAgLTEzODYsNyArMTQzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZmLnJpZ2h0ID0gbUN1clJpZ2h0OwogICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsICYgRkxBR19MQVlPVVRfSU5fU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0dXNCYXJDYW5IaWRlICYmIChmbCAmIEZMQUdfTEFZT1VUX0lOX1NDUkVFTikgIT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEEgd2luZG93IHRoYXQgaGFzIHJlcXVlc3RlZCB0byBmaWxsIHRoZSBlbnRpcmUgc2NyZWVuIGp1c3QKICAgICAgICAgICAgICAgICAvLyBnZXRzIGV2ZXJ5dGhpbmcsIHBlcmlvZC4KICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gZGYubGVmdCA9IGNmLmxlZnQgPSAwOwpAQCAtMTUxMyw4ICsxNTU3LDggQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyBpbnQgZmluaXNoQW5pbWF0aW9uTHcoKSB7CiAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaGlkaW5nID0gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiB0b3BJc0Z1bGxzY3JlZW4gPSBmYWxzZTsKICAgICAgICAgaWYgKG1TdGF0dXNCYXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLmkoVEFHLCAiZm9yY2U9IiArIG1Gb3JjZVN0YXR1c0JhcgogICAgICAgICAgICAgICAgICAgICArICIgdG9wPSIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlKTsKQEAgLTE1MjIsMTcgKzE1NjYsMjUgQEAKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfTEFZT1VUKSBMb2cudihUQUcsICJTaG93aW5nIHN0YXR1cyBiYXIiKTsKICAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0Jhci5zaG93THcodHJ1ZSkpIGNoYW5nZXMgfD0gRklOSVNIX0xBWU9VVF9SRURPX0xBWU9VVDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9Mb2cuaShUQUcsICJmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0RnJhbWVMdygpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICsgIiBzaG93biBmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0U2hvd25GcmFtZUx3KCkpOwotICAgICAgICAgICAgICAgIC8vTG9nLmkoVEFHLCAiYXR0cjogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0QXR0cnMoKSk7Ci0gICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPQotICAgICAgICAgICAgICAgICAgICBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEF0dHJzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoaWRlU3RhdHVzQmFyID0KLSAgICAgICAgICAgICAgICAgICAgKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOwotICAgICAgICAgICAgICAgIGlmIChoaWRlU3RhdHVzQmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIExvZy52KFRBRywgIkhpZGluZyBzdGF0dXMgYmFyIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwotICAgICAgICAgICAgICAgICAgICBoaWRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGZpbmFsIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpOworICAgICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZnJhbWU6ICIgKyBtVG9wRnVsbHNjcmVlbk9wYXF1ZVdpbmRvd1N0YXRlLmdldEZyYW1lTHcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG93biBmcmFtZTogIiArIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUuZ2V0U2hvd25GcmFtZUx3KCkpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhdHRyOiAiICsgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZS5nZXRBdHRycygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGxwLmZsYWdzPTB4IiArIEludGVnZXIudG9IZXhTdHJpbmcobHAuZmxhZ3MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9wSXNGdWxsc2NyZWVuID0gKGxwLmZsYWdzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKSAhPSAwOworICAgICAgICAgICAgICAgIC8vIFRoZSBzdWJ0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3aW5kb3cgZm9yIG1Ub3BGdWxsc2NyZWVuT3BhcXVlV2luZG93U3RhdGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgbVRvcElzRnVsbHNjcmVlbiBpcyB0aGF0IHRoYXQgbVRvcElzRnVsbHNjcmVlbiBpcyBzZXQgb25seSBpZiB0aGUgd2luZG93CisgICAgICAgICAgICAgICAgLy8gaGFzIHRoZSBGTEFHX0ZVTExTQ1JFRU4gc2V0LiAgTm90IHN1cmUgaWYgdGhlcmUgaXMgYW5vdGhlciB3YXkgdGhhdCB0byBiZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYXNlIHRob3VnaC4KKyAgICAgICAgICAgICAgICBpZiAodG9wSXNGdWxsc2NyZWVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyQ2FuSGlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiSGlkaW5nIHN0YXR1cyBiYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLmhpZGVMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTE9HVikgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiUHJldmVudGluZyBzdGF0dXMgYmFyIGZyb20gaGlkaW5nIGJ5IHBvbGljeSIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiU2hvd2luZyBzdGF0dXMgYmFyIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQmFyLnNob3dMdyh0cnVlKSkgY2hhbmdlcyB8PSBGSU5JU0hfTEFZT1VUX1JFRE9fTEFZT1VUOwpAQCAtMTU0MCwyMSArMTU5MiwzNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBpZiAoY2hhbmdlcyAhPSAwICYmIGhpZGluZykgewotICAgICAgICAgICAgSVN0YXR1c0JhclNlcnZpY2Ugc2JzID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJzdGF0dXNiYXIiKSk7Ci0gICAgICAgICAgICBpZiAoc2JzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHdpbmRvdyBzaGFkZSBpcyBoaWRkZW4uCi0gICAgICAgICAgICAgICAgICAgIHNicy5jb2xsYXBzZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBpZiAodG9wSXNGdWxsc2NyZWVuICE9IG1Ub3BJc0Z1bGxzY3JlZW4pIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdG9wSXNGdWxsc2NyZWVuRiA9IHRvcElzRnVsbHNjcmVlbjsKKyAgICAgICAgICAgIG1Ub3BJc0Z1bGxzY3JlZW4gPSB0b3BJc0Z1bGxzY3JlZW47CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJTZXJ2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmUgdGhhdCBjYW4gbm90IGdvIGF3YXksIGJ1dCBpdCBkb2Vzbid0IGNvbWUgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHdpbmRvdyBtYW5hZ2VyIGRvZXMsIHNvIGRvbid0IGZhaWwgaWYgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0LiBUaGlzIHdvcmtzIGFzIGxvbmcgYXMgbm8gZnVsbHNjcmVlbiB3aW5kb3dzIGNvbWUgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHN0YXR1cyBiYXIgc2VydmljZSBkb2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJTZXJ2aWNlID0gSVN0YXR1c0JhclNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoInN0YXR1c2JhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXNCYXJTZXJ2aWNlIHNicyA9IG1TdGF0dXNCYXJTZXJ2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnMuc2V0QWN0aXZlV2luZG93SXNGdWxsc2NyZWVuKHRvcElzRnVsbHNjcmVlbkYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgYmVjYXVzZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyU2VydmljZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBIaWRlIHRoZSBrZXkgZ3VhcmQgaWYgYSB2aXNpYmxlIHdpbmRvdyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGF0IGl0IHdhbnRzIHRvIGJlIGRpc3BsYXllZAogICAgICAgICAvLyB3aGVuIHRoZSBzY3JlZW4gaXMgbG9ja2VkCiAgICAgICAgIGlmIChtS2V5Z3VhcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLnYoVEFHLCAiZmluaXNoTGF5b3V0THc6Om1IaWRlS2V5Z3VhcmQ9IittSGlkZUxvY2tTY3JlZW4pOworICAgICAgICAgICAgaWYgKGxvY2FsTE9HVikgTG9nLnYoVEFHLCAiZmluaXNoQW5pbWF0aW9uTHc6Om1IaWRlS2V5Z3VhcmQ9IittSGlkZUxvY2tTY3JlZW4pOwogICAgICAgICAgICAgaWYgKG1EaXNtaXNzS2V5Z3VhcmQgJiYgIW1LZXlndWFyZE1lZGlhdG9yLmlzU2VjdXJlKCkpIHsKICAgICAgICAgICAgICAgICBpZiAobUtleWd1YXJkLmhpZGVMdyh0cnVlKSkgewogICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IEZJTklTSF9MQVlPVVRfUkVET19MQVlPVVQKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TdGF0dXNWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwOGNmZAotLS0gL2Rldi9udWxsCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU3RhdHVzVmlldy5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnBvbGljeS5pbXBsOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitjbGFzcyBTdGF0dXNWaWV3IHsKKyAgICBwcml2YXRlIFN0cmluZyBtRGF0ZUZvcm1hdFN0cmluZzsKKworICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhcnJpZXI7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0ZTsKKworICAgIC8vIGFyZSB3ZSBzaG93aW5nIGJhdHRlcnkgaW5mb3JtYXRpb24/CisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nQmF0dGVyeUluZm8gPSBmYWxzZTsKKworICAgIC8vIGxhc3Qga25vd24gcGx1Z2dlZCBpbiBzdGF0ZQorICAgIHByaXZhdGUgYm9vbGVhbiBtUGx1Z2dlZEluID0gZmFsc2U7CisKKyAgICAvLyBsYXN0IGtub3duIGJhdHRlcnkgbGV2ZWwKKyAgICBwcml2YXRlIGludCBtQmF0dGVyeUxldmVsID0gMTAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbU5leHRBbGFybSA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdGF0dXMxOworICAgIHByaXZhdGUgVGV4dFZpZXcgbVN0YXR1czI7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtUHJvcGVydHlPZjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzU3RhdHVzMjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NhcnJpZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNEYXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzUHJvcGVydHk7CisKKyAgICBwcml2YXRlIFZpZXcgbVZpZXc7CisKKyAgICBwcml2YXRlIFZpZXcgZmluZFZpZXdCeUlkKGludCBpZCkgeworICAgICAgICByZXR1cm4gbVZpZXcuZmluZFZpZXdCeUlkKGlkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3LmdldENvbnRleHQoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9ucyhTdHJpbmcgaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgIG1JbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7CisgICAgfQorCisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChDaGFyU2VxdWVuY2UgY2FycmllclRleHQpIHsKKyAgICAgICAgaWYgKG1DYXJyaWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHQoY2FycmllclRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBvblJlZnJlc2hCYXR0ZXJ5SW5mbyhib29sZWFuIHNob3dCYXR0ZXJ5SW5mbywgYm9vbGVhbiBwbHVnZ2VkSW4sIGludCBiYXR0ZXJ5TGV2ZWwpIHsKKyAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHNob3dCYXR0ZXJ5SW5mbzsKKyAgICAgICAgbVBsdWdnZWRJbiA9IHBsdWdnZWRJbjsKKyAgICAgICAgbUJhdHRlcnlMZXZlbCA9IGJhdHRlcnlMZXZlbDsKKyAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVGltZUNoYW5nZWQoKSB7CisgICAgICAgIHJlZnJlc2hUaW1lQW5kRGF0ZURpc3BsYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJpbmdlck1vZGVDaGFuZ2VkKGludCBzdGF0ZSkgeworICAgIH0KKworICAgIHZvaWQgb25SZWZyZXNoQ2FycmllckluZm8oQ2hhclNlcXVlbmNlIHBsbW4sIENoYXJTZXF1ZW5jZSBzcG4pIHsKKyAgICAgICAgc2V0Q2FycmllclRleHQoTG9ja1NjcmVlbi5nZXRDYXJyaWVyU3RyaW5nKHBsbW4sIHNwbikpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0dXNWaWV3KFZpZXcgdmlldywgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IsCisgICAgICAgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIGxvY2tQYXR0ZXJuVXRpbHMpIHsKKyAgICAgICAgbVZpZXcgPSB2aWV3OworICAgICAgICBtQ2FycmllciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuY2Fycmllcik7CisgICAgICAgIG1IYXNDYXJyaWVyID0gKG1DYXJyaWVyICE9IG51bGwpOworICAgICAgICBtRGF0ZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuZGF0ZSk7CisgICAgICAgIG1IYXNEYXRlID0gKG1EYXRlICE9IG51bGwpOworICAgICAgICBtRGF0ZUZvcm1hdFN0cmluZyA9IGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZnVsbF93ZGF5X21vbnRoX2RheV9ub195ZWFyKTsKKworICAgICAgICByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCk7CisKKyAgICAgICAgbVN0YXR1czEgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXR1czEpOworICAgICAgICBtU3RhdHVzMiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhdHVzMik7CisgICAgICAgIG1IYXNTdGF0dXMyID0gKG1TdGF0dXMyICE9IG51bGwpOworICAgICAgICBtUHJvcGVydHlPZiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucHJvcGVydHlPZik7CisgICAgICAgIG1IYXNQcm9wZXJ0eSA9IChtUHJvcGVydHlPZiAhPSBudWxsKTsKKworICAgICAgICByZXNldFN0YXR1c0luZm8odXBkYXRlTW9uaXRvciwgbG9ja1BhdHRlcm5VdGlscyk7CisKKyAgICAgICAgLy8gUmVxdWlyZWQgdG8gZ2V0IE1hcnF1ZWUgdG8gd29yay4KKyAgICAgICAgaWYgKG1IYXNDYXJyaWVyKSB7CisgICAgICAgICAgICBtQ2Fycmllci5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgICAgIG1DYXJyaWVyLnNldFRleHRDb2xvcigweGZmZmZmZmZmKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgdm9pZCByZXNldFN0YXR1c0luZm8oS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IsIExvY2tQYXR0ZXJuVXRpbHMgbG9ja1BhdHRlcm5VdGlscykgeworICAgICAgICBtSW5zdHJ1Y3Rpb25zID0gbnVsbDsKKyAgICAgICAgbVNob3dpbmdCYXR0ZXJ5SW5mbyA9IHVwZGF0ZU1vbml0b3Iuc2hvdWxkU2hvd0JhdHRlcnlJbmZvKCk7CisgICAgICAgIG1QbHVnZ2VkSW4gPSB1cGRhdGVNb25pdG9yLmlzRGV2aWNlUGx1Z2dlZEluKCk7CisgICAgICAgIG1CYXR0ZXJ5TGV2ZWwgPSB1cGRhdGVNb25pdG9yLmdldEJhdHRlcnlMZXZlbCgpOworICAgICAgICBtTmV4dEFsYXJtID0gbG9ja1BhdHRlcm5VdGlscy5nZXROZXh0QWxhcm0oKTsKKyAgICAgICAgdXBkYXRlU3RhdHVzTGluZXMoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldEluc3RydWN0aW9uVGV4dChpbnQgc3RyaW5nSWQpIHsKKyAgICAgICAgbVN0YXR1czEuc2V0VGV4dChzdHJpbmdJZCk7CisgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLCAwLCAwKTsKKyAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgIH0KKworICAgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25UZXh0KFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgbVN0YXR1czEuc2V0VGV4dChzdHJpbmcpOworICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldENhcnJpZXJUZXh0KGludCBzdHJpbmdJZCkgeworICAgICAgICBtQ2Fycmllci5zZXRUZXh0KHN0cmluZ0lkKTsKKyAgICB9CisgICAgdm9pZCBzZXRDYXJyaWVyVGV4dChTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIG1DYXJyaWVyLnNldFRleHQoc3RyaW5nKTsKKyAgICB9CisKKyAgICAvKiogT3JpZ2luYXRlZCBmcm9tIFBhdHRlcm5VbmxvY2tTY3JlZW4gKiovCisgICAgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcygpIHsKKyAgICAgICAgaWYgKG1IYXNQcm9wZXJ0eSkgeworICAgICAgICAgICAgLy8gVE9ETyBHZXQgYWN0dWFsIG5hbWUgJiBlbWFpbAorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiSm9obiBTbWl0aCI7CisgICAgICAgICAgICBTdHJpbmcgZW1haWwgPSAianNtaXRoQGdtYWlsLmNvbSI7CisgICAgICAgICAgICBtUHJvcGVydHlPZi5zZXRUZXh0KCJQcm9wZXJ0eSBvZjpcbiIgKyBuYW1lICsgIlxuIiArIGVtYWlsKTsKKyAgICAgICAgICAgIG1Qcm9wZXJ0eU9mLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUhhc1N0YXR1czIpIHJldHVybjsKKworICAgICAgICBpZiAobUluc3RydWN0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChtSW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShtSW5zdHJ1Y3Rpb25zKSkgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcygwLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfbG9jaywgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICB9IGVsc2UgaWYgKG1TaG93aW5nQmF0dGVyeUluZm8gJiYgbU5leHRBbGFybSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBiYXR0ZXJ5IG9ubHkKKyAgICAgICAgICAgIGlmIChtUGx1Z2dlZEluKSB7CisgICAgICAgICAgICAgIGlmIChtQmF0dGVyeUxldmVsID49IDEwMCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX2NoYXJnZWQpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhSLnN0cmluZy5sb2Nrc2NyZWVuX3BsdWdnZWRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5TGV2ZWwpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9sb3dfYmF0dGVyeSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKFIuZHJhd2FibGUuaWNfbG9ja19pZGxlX2NoYXJnaW5nLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgIW1TaG93aW5nQmF0dGVyeUluZm8pIHsKKyAgICAgICAgICAgIC8vIGFsYXJtIG9ubHkKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoUi5kcmF3YWJsZS5pY19sb2NrX2lkbGVfYWxhcm0sIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDApOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTmV4dEFsYXJtICE9IG51bGwgJiYgbVNob3dpbmdCYXR0ZXJ5SW5mbykgeworICAgICAgICAgICAgLy8gYm90aCBiYXR0ZXJ5IGFuZCBuZXh0IGFsYXJtCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KG1OZXh0QWxhcm0pOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5sb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQsCisgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKDEwMCwgbUJhdHRlcnlMZXZlbCkpKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9hbGFybSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisgICAgICAgICAgICBpZiAobVBsdWdnZWRJbikgeworICAgICAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9jaGFyZ2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdHVzMi5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWMgdG8gc2hvdzsgc2hvdyBnZW5lcmFsIGluc3RydWN0aW9ucworICAgICAgICAgICAgbVN0YXR1czEuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX3BhdHRlcm5faW5zdHJ1Y3Rpb25zKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhSLmRyYXdhYmxlLmljX2xvY2tfaWRsZV9sb2NrLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogT3JpZ2luYXRlZCBmcm9tIExvY2tTY3JlZW4gKiovCisgICAgLy8gVE9ETyBNZXJnZSB3aXRoIGZ1bmN0aW9uIGFib3ZlCisgICAgdm9pZCB1cGRhdGVTdGF0dXNMaW5lcyhib29sZWFuIHNob3dTdGF0dXNMaW5lcywgU3RyaW5nIGNoYXJnaW5nLCBEcmF3YWJsZSBjaGFyZ2luZ0ljb24sCisgICAgICAgICAgICBEcmF3YWJsZSBhbGFybUljb24pIHsKKyAgICAgICAgaWYgKCFzaG93U3RhdHVzTGluZXMgfHwgKGNoYXJnaW5nID09IG51bGwgJiYgbU5leHRBbGFybSA9PSBudWxsKSkgeworICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICBtU3RhdHVzMi5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY2hhcmdpbmcgb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQoY2hhcmdpbmcpOworICAgICAgICAgICAgbVN0YXR1czEuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGNoYXJnaW5nSWNvbiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAobU5leHRBbGFybSAhPSBudWxsICYmIGNoYXJnaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5leHQgYWxhcm0gb25seQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldFRleHQobU5leHRBbGFybSk7CisgICAgICAgICAgICBtU3RhdHVzMS5zZXRDb21wb3VuZERyYXdhYmxlc1dpdGhJbnRyaW5zaWNCb3VuZHMoYWxhcm1JY29uLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFyZ2luZyAhPSBudWxsICYmIG1OZXh0QWxhcm0gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYm90aCBjaGFyZ2luZyBhbmQgbmV4dCBhbGFybQorICAgICAgICAgICAgbVN0YXR1czEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBtU3RhdHVzMS5zZXRUZXh0KGNoYXJnaW5nKTsKKyAgICAgICAgICAgIG1TdGF0dXMxLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhjaGFyZ2luZ0ljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgbVN0YXR1czIuc2V0VGV4dChtTmV4dEFsYXJtKTsKKyAgICAgICAgICAgIG1TdGF0dXMyLnNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhhbGFybUljb24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoVGltZUFuZERhdGVEaXNwbGF5KCkgeworICAgICAgICBpZiAobUhhc0RhdGUpIHsKKyAgICAgICAgICAgIG1EYXRlLnNldFRleHQoRGF0ZUZvcm1hdC5mb3JtYXQobURhdGVGb3JtYXRTdHJpbmcsIG5ldyBEYXRlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcHJlbG9hZGVkLWNsYXNzZXMgYi9wcmVsb2FkZWQtY2xhc3NlcwppbmRleCAxZDVmYmMwOC4uMzMxNzI4NiAxMDA2NDQKLS0tIGEvcHJlbG9hZGVkLWNsYXNzZXMKKysrIGIvcHJlbG9hZGVkLWNsYXNzZXMKQEAgLTEzOCw3ICsxMzgsNiBAQAogYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3IKIGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNsb3NhYmxlCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDb21waWxlZFNxbAotYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ29udGVudEhlbHBlcgogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ3Vyc29yCiBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZQogYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGVidWcKQEAgLTU2Myw4ICs1NjIsNiBAQAogYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXcKIGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcgogYW5kcm9pZC53aWRnZXQuQXV0b0NvbXBsZXRlVGV4dFZpZXcKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JERyb3BEb3duSXRlbUNsaWNrTGlzdGVuZXIKLWFuZHJvaWQud2lkZ2V0LkF1dG9Db21wbGV0ZVRleHRWaWV3JERyb3BEb3duTGlzdFZpZXcKIGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5CYXNlRXhwYW5kYWJsZUxpc3RBZGFwdGVyCiBhbmRyb2lkLndpZGdldC5DaGVja0JveApAQCAtNTgyLDYgKzU3OSw3IEBACiBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcKIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldyRTY2FsZVR5cGUKIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dAorYW5kcm9pZC53aWRnZXQuTGlzdFBvcHVwV2luZG93CiBhbmRyb2lkLndpZGdldC5MaXN0VmlldwogYW5kcm9pZC53aWRnZXQuTGlzdFZpZXckU2F2ZWRTdGF0ZQogYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sbGVyCkBAIC02ODUsNyArNjgzLDYgQEAKIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51QnVpbGRlcgogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbAogY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyCi1jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuQ29udGFjdEhlYWRlcldpZGdldAogY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpYWxvZ1RpdGxlCiBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRWRpdGFibGVJbnB1dENvbm5lY3Rpb24KIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50CkBAIC03MjcsNyArNzI0LDYgQEAKIGphdmEuaW8uRmlsZQogamF2YS5pby5GaWxlRGVzY3JpcHRvcgogamF2YS5pby5GaWxlSW5wdXRTdHJlYW0KLWphdmEuaW8uRmlsZUlucHV0U3RyZWFtJFJlcG9zaXRpb25pbmdMb2NrCiBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbgogamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtCiBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtCkBAIC0xMTMxLDcgKzExMjcsNiBAQAogb3JnLmFwYWNoZS5oYXJtb255Lm5pby5GaWxlQ2hhbm5lbEZhY3RvcnkKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRGlyZWN0QnVmZmVyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkZpbGVDaGFubmVsSW1wbAotb3JnLmFwYWNoZS5oYXJtb255Lm5pby5pbnRlcm5hbC5GaWxlQ2hhbm5lbEltcGwkUmVwb3NpdGlvbmluZ0xvY2sKIG9yZy5hcGFjaGUuaGFybW9ueS5uaW8uaW50ZXJuYWwuRmlsZUxvY2tJbXBsCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyCiBvcmcuYXBhY2hlLmhhcm1vbnkubmlvLmludGVybmFsLkxvY2tNYW5hZ2VyJDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcAppbmRleCA0MjVjYTMxLi42NWQ5ZWY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCkBAIC0xMDE3LDggKzEwMTcsOCBAQAogI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCiAgICAgVGhyZWFkKGZhbHNlKSwKICNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLAotICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKKyAgICBtUGhvbmVTdGF0ZShBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwpLCBtUmluZ2VyTW9kZSgwKSwgbU11c2ljU3RvcFRpbWUoMCksIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwKKyAgICBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtMTgzNSwyOSArMTgzNSwzOCBAQAogICAgIH0KIAogICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOwotICAgIC8vIGRvIG5vdCBzZXQgdm9sdW1lIGlmIHRoZSBmbG9hdCB2YWx1ZSBkaWQgbm90IGNoYW5nZQotICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dIHx8CisgICAgICAgICAgICBmb3JjZSkgewogICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CiAgICAgICAgIExPR1YoInNldFN0cmVhbVZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CiAgICAgICAgIGlmIChzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEwgfHwKICAgICAgICAgICAgIHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6RFRNRiB8fAogICAgICAgICAgICAgc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZSA9IC0xLjA7CiAgICAgICAgICAgICAvLyBvZmZzZXQgdmFsdWUgdG8gcmVmbGVjdCBhY3R1YWwgaGFyZHdhcmUgdm9sdW1lIHRoYXQgbmV2ZXIgcmVhY2hlcyAwCiAgICAgICAgICAgICAvLyAxJSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGZpcnN0IHN0ZXAgaW4gVk9JQ0VfQ0FMTCBzdHJlYW0gdm9sdW1lIHNldHRpbmcgKHNlZSBBdWRpb1NlcnZpY2UuamF2YSkKICAgICAgICAgICAgIHZvbHVtZSA9IDAuMDEgKyAwLjk5ICogdm9sdW1lOwotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgewotICAgICAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEF1ZGlvU3lzdGVtOjpCTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9pY2VWb2x1bWUgPj0gMCAmJiBvdXRwdXQgPT0gbUhhcmR3YXJlT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CiAgICAgfQogCisgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQXVkaW9TeXN0ZW06OkJMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb1N5c3RlbTo6Vk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZvaWNlVm9sdW1lICE9IG1MYXN0Vm9pY2VWb2x1bWUgJiYgb3V0cHV0ID09IG1IYXJkd2FyZU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKaW5kZXggYjNlMGVlNi4uMDdiNWEzNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCkBAIC0xMDEsOSArMTAxLDkgQEAKICAgICBtRmFrZUNhbWVyYSA9IDA7IC8vIHBhcmFub2lhCiB9CiAKLXNwPElNZW1vcnlIZWFwPiBDYW1lcmFIYXJkd2FyZVN0dWI6OmdldFByZXZpZXdIZWFwKCkgY29uc3QKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlU3R1Yjo6c2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKQogewotICAgIHJldHVybiBtUHJldmlld0hlYXA7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzcDxJTWVtb3J5SGVhcD4gQ2FtZXJhSGFyZHdhcmVTdHViOjpnZXRSYXdIZWFwKCkgY29uc3QKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKaW5kZXggZDM0MjdiYS4uOWI2NmE3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogY2xhc3MgQ2FtZXJhSGFyZHdhcmVTdHViIDogcHVibGljIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIHsKIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRQcmV2aWV3SGVhcCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRSYXdIZWFwKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNldENhbGxiYWNrcyhub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBlYTJjNWQ0Li5lNTg4OWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMzM2LDE4ICszMzYsNiBAQAogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNsaWVudDo6fkNsaWVudCBFIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7CiAKLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgcHRocmVhZF90IHRocjsKLSAgICAgICAgLy8gV2UgdW5yZWdpc3RlciB0aGUgYnVmZmVycyBpbiBhIGRpZmZlcmVudCB0aHJlYWQgYmVjYXVzZSBiaW5kZXIgZG9lcwotICAgICAgICAvLyBub3QgbGV0IHVzIG1ha2Ugc3ljaHJvbm91cyB0cmFuc2FjdGlvbnMgaW4gYSBiaW5kZXIgZGVzdHJ1Y3RvciAodGhhdAotICAgICAgICAvLyBpcywgdXBvbiBvdXIgcmVhY2hpbmcgYSByZWZjb3VudCBvZiB6ZXJvLikKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIGF0dHIKLSAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSk7Ci0gICAgICAgIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpOwotICAgIH0KLQogICAgIC8vIHNldCBtQ2xpZW50UGlkIHRvIGxldCBkaXNjb25uZXQoKSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCiAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgZGlzY29ubmVjdCgpOwpAQCAtNDY1LDYgKzQ1MywxMSBAQAogICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICBtT3ZlcmxheVJlZiA9IDA7CiAgICAgfQorICAgIC8vIFJlbGVhc2UgdGhlIGhlbGQgQU5hdGl2ZVdpbmRvdyByZXNvdXJjZXMuCisgICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IDApIHsKKyAgICAgICAgbVByZXZpZXdXaW5kb3cgPSAwOworICAgICAgICBtSGFyZHdhcmUtPnNldFByZXZpZXdXaW5kb3cobVByZXZpZXdXaW5kb3cpOworICAgIH0KICAgICBtSGFyZHdhcmUuY2xlYXIoKTsKIAogICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnQobUNhbWVyYUNsaWVudCk7CkBAIC00NzUsOCArNDY4LDggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBzZXQgdGhlIElTdXJmYWNlIHRoYXQgdGhlIHByZXZpZXcgd2lsbCB1c2UKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7CisvLyBzZXQgdGhlIFN1cmZhY2UgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgewogICAgIExPRzEoInNldFByZXZpZXdEaXNwbGF5KCVwKSAocGlkICVkKSIsIHN1cmZhY2UuZ2V0KCksIGdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTQ4Niw3ICs0NzksNyBAQAogCiAgICAgLy8gcmV0dXJuIGlmIG5vIGNoYW5nZSBpbiBzdXJmYWNlLgogICAgIC8vIGFzQmluZGVyKCkgaXMgc2FmZSBvbiBOVUxMIChyZXR1cm5zIE5VTEwpCi0gICAgaWYgKHN1cmZhY2UtPmFzQmluZGVyKCkgPT0gbVN1cmZhY2UtPmFzQmluZGVyKCkpIHsKKyAgICBpZiAoZ2V0SVN1cmZhY2Uoc3VyZmFjZSktPmFzQmluZGVyKCkgPT0gbVN1cmZhY2UtPmFzQmluZGVyKCkpIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTQ5Niw0NCArNDg5LDI4IEBACiAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgYW55IHByZXZpb3VzIG92ZXJsYXkKICAgICAgICAgICAgIHNwPE92ZXJsYXk+IGR1bW15OwogICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRPdmVybGF5KGR1bW15KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogICAgICAgICB9CiAgICAgfQotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKKyAgICBpZiAoc3VyZmFjZSAhPSAwKSB7CisgICAgICAgIG1TdXJmYWNlID0gZ2V0SVN1cmZhY2Uoc3VyZmFjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN1cmZhY2UgPSAwOworICAgIH0KKyAgICBtUHJldmlld1dpbmRvdyA9IHN1cmZhY2U7CiAgICAgbU92ZXJsYXlSZWYgPSAwOwogICAgIC8vIElmIHByZXZpZXcgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkLCBzZXQgb3ZlcmxheSBvciByZWdpc3RlciBwcmV2aWV3CiAgICAgLy8gYnVmZmVycyBub3cuCiAgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewogICAgICAgICBpZiAobVVzZU92ZXJsYXkpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IHNldE92ZXJsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVByZXZpZXdXaW5kb3cgIT0gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KG1QcmV2aWV3V2luZG93KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpIHsKLSAgICBpbnQgdywgaDsKLSAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3LCAmaCk7Ci0KLSAgICAvLyBGSVhNRTogZG9uJ3QgdXNlIGEgaGFyZGNvZGVkIGZvcm1hdCBoZXJlLgotICAgIElTdXJmYWNlOjpCdWZmZXJIZWFwIGJ1ZmZlcnModywgaCwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZS0+Z2V0UHJldmlld0hlYXAoKSk7Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgicmVnaXN0ZXJCdWZmZXJzIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0T3ZlcmxheSgpIHsKICAgICBpbnQgdywgaDsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CkBAIC01OTAsMTYgKzU2NywxMCBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKIAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gY2FsbGJhY2tfZmxhZzsKLQotICAgIC8vIElmIHdlIGRvbid0IHVzZSBvdmVybGF5LCB3ZSBhbHdheXMgbmVlZCB0aGUgcHJldmlldyBmcmFtZSBmb3IgZGlzcGxheS4KLSAgICAvLyBJZiB3ZSBkbyB1c2Ugb3ZlcmxheSwgd2Ugb25seSBuZWVkIHRoZSBwcmV2aWV3IGZyYW1lIGlmIHRoZSB1c2VyCi0gICAgLy8gd2FudHMgdGhlIGRhdGEuCi0gICAgaWYgKG1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIGlmKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykgewotICAgICAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfQorICAgIGlmIChtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKKyAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CiAgICAgfQogfQogCkBAIC02MjQsMTQgKzU5NSwxNCBAQAogCiAgICAgc3dpdGNoKG1vZGUpIHsKICAgICAgICAgY2FzZSBDQU1FUkFfUFJFVklFV19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwICYmIG1QcmV2aWV3V2luZG93ID09IDApIHsKICAgICAgICAgICAgICAgICBMT0cxKCJtU3VyZmFjZSBpcyBub3Qgc2V0IHlldC4iKTsKICAgICAgICAgICAgICAgICAvLyBzdGlsbCBhYmxlIHRvIHN0YXJ0IHByZXZpZXcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UHJldmlld01vZGUoKTsKICAgICAgICAgY2FzZSBDQU1FUkFfUkVDT1JESU5HX01PREU6Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgewotICAgICAgICAgICAgICAgIExPR0UoIm1TdXJmYWNlIG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCAmJiBtUHJldmlld1dpbmRvdyA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibVN1cmZhY2Ugb3IgbVByZXZpZXdXaW5kb3cgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhcnRSZWNvcmRpbmdNb2RlKCk7CkBAIC02NTcsMTYgKzYyOCw5IEBACiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgICAgICAvLyBYWFg6IFNldCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIEFOYXRpdmVXaW5kb3cuCisgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7CiAgICAgICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRQcmV2aWV3KCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIC8vIElmIHByZXZpZXcgZGlzcGxheSBoYXMgYmVlbiBzZXQsIHJlZ2lzdGVyIHByZXZpZXcgYnVmZmVycyBub3cuCi0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIG1heSBiZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgICAgICAgLy8gd2l0aCB0aGUgcmF3IChzbmFwc2hvdCkgaGVhcC4KLSAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNzA0LDEzICs2NjgsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCisKICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgewotICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICB9Ci0KICAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwogfQogCkBAIC05OTgsMTEgKzk1OSw2IEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKICAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOwogCi0gICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgIH0KLQogICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwogICAgIGlmIChjICE9IDApIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CkBAIC0xMDMwLDcgKzk4Niw2IEBACiAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwgbU9yaWVudGF0aW9uLCAwLAogICAgICAgICAgICAgbUhhcmR3YXJlLT5nZXRSYXdIZWFwKCkpOwogCi0gICAgICAgIG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAKQEAgLTEwNDMsMTIgKzk5OCw2IEBACiAgICAgc2l6ZV90IHNpemU7CiAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CiAKLSAgICBpZiAoIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gbG9jYWwgY29weSBvZiB0aGUgY2FsbGJhY2sgZmxhZ3MKICAgICBpbnQgZmxhZ3MgPSBtUHJldmlld0NhbGxiYWNrRmxhZzsKIApAQCAtMTA2OSw5ICsxMDE4LDcgQEAKICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7Ci0gICAgICAgIGlmIChtVXNlT3ZlcmxheSkgewotICAgICAgICAgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgfQorICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwogICAgIH0KIAogICAgIGlmIChjICE9IDApIHsKQEAgLTExMDgsMTEgKzEwNTUsNiBAQAogICAgIHNpemVfdCBzaXplOwogICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwogCi0gICAgLy8gUHV0IHRoZSBZVVYgdmVyc2lvbiBvZiB0aGUgc25hcHNob3QgaW4gdGhlIHByZXZpZXcgZGlzcGxheS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKLSAgICB9Ci0KICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoYyAhPSAwKSB7CkBAIC0xMjcwLDQgKzEyMTIsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NwPElTdXJmYWNlPiBDYW1lcmFTZXJ2aWNlOjpnZXRJU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIGlmIChzdXJmYWNlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHN1cmZhY2UtPmdldElTdXJmYWNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNwPElTdXJmYWNlPigwKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggMGQ2OTgzNi4uN2VkMTkyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtNzksNiArNzksMTIgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCisgICAgLy8gVXNlZCBieSBDbGllbnQgb2JqZWN0cyB0byBleHRyYWN0IHRoZSBJU3VyZmFjZSBmcm9tIGEgU3VyZmFjZSBvYmplY3QuCisgICAgLy8gVGhpcyBpcyB1c2VkIGJlY2F1c2UgbWFraW5nIENsaWVudCBhIGZyaWVuZCBjbGFzcyBvZiBTdXJmYWNlIHdvdWxkCisgICAgLy8gcmVxdWlyZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgaW4gU3VyZmFjZS5oIHNpbmNlIENsaWVudCBpcyBhIG5lc3RlZAorICAgIC8vIGNsYXNzLgorICAgIHN0YXRpYyBzcDxJU3VyZmFjZT4gZ2V0SVN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOworCiAgICAgY2xhc3MgQ2xpZW50IDogcHVibGljIEJuQ2FtZXJhCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTg3LDcgKzkzLDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbG9jaygpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0Rpc3BsYXkoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKGludCBmbGFnKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRQcmV2aWV3KCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CkBAIC0xNjksNiArMTc1LDcgQEAKICAgICAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICAgICAgbVByZXZpZXdXaW5kb3c7CiAKICAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCiAgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDg3ZGU3OWEuLjgzY2UzZTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNjksMTQgKzI2OSwxMCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRFbmFibGVkKG1Jc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkIEFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OiAiICsgY2xpZW50LCByZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2xpZW50cy5hZGQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKaW5kZXggNzMxZmIyMi4uNWVmM2QzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQpAQCAtNDI2LDYgKzQyNiw0MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcGFydGlhbGx5VXBkYXRlQXBwV2lkZ2V0SWRzKGludFtdIGFwcFdpZGdldElkcywgUmVtb3RlVmlld3Mgdmlld3MpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdzLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFwcFdpZGdldFZpZXdEYXRhQ2hhbmdlZChpbnRbXSBhcHBXaWRnZXRJZHMsIGludCB2aWV3SWQpIHsKKyAgICAgICAgaWYgKGFwcFdpZGdldElkcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcFdpZGdldElkcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBOID0gYXBwV2lkZ2V0SWRzLmxlbmd0aDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkc1tpXSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoaWQsIHZpZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVBcHBXaWRnZXRQcm92aWRlcihDb21wb25lbnROYW1lIHByb3ZpZGVyLCBSZW1vdGVWaWV3cyB2aWV3cykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKICAgICAgICAgICAgIFByb3ZpZGVyIHAgPSBsb29rdXBQcm92aWRlckxvY2tlZChwcm92aWRlcik7CkBAIC00NDMsMTEgKzQ3NywxNyBAQAogICAgIH0KIAogICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzKSB7CisgICAgICAgIHVwZGF0ZUFwcFdpZGdldEluc3RhbmNlTG9ja2VkKGlkLCB2aWV3cywgZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlQXBwV2lkZ2V0SW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIFJlbW90ZVZpZXdzIHZpZXdzLCBib29sZWFuIGlzUGFydGlhbFVwZGF0ZSkgewogICAgICAgICAvLyBhbGxvdyBmb3Igc3RhbGUgYXBwV2lkZ2V0SWRzIGFuZCBvdGhlciBiYWRuZXNzCiAgICAgICAgIC8vIGxvb2t1cCBhbHNvIGNoZWNrcyB0aGF0IHRoZSBjYWxsaW5nIHByb2Nlc3MgY2FuIGFjY2VzcyB0aGUgYXBwV2lkZ2V0SWQKICAgICAgICAgLy8gZHJvcCB1bmJvdW5kIGFwcFdpZGdldElkcyAoc2hvdWxkbid0IGJlIHBvc3NpYmxlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzKQogICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiBpZC5wcm92aWRlciAhPSBudWxsICYmICFpZC5wcm92aWRlci56b21iaWUgJiYgIWlkLmhvc3Quem9tYmllKSB7Ci0gICAgICAgICAgICBpZC52aWV3cyA9IHZpZXdzOworCisgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBzYXZlIHRoaXMgUmVtb3RlVmlld3MKKyAgICAgICAgICAgIGlmICghaXNQYXJ0aWFsVXBkYXRlKSBpZC52aWV3cyA9IHZpZXdzOwogCiAgICAgICAgICAgICAvLyBpcyBhbnlvbmUgbGlzdGVuaW5nPwogICAgICAgICAgICAgaWYgKGlkLmhvc3QuY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQ2Myw2ICs1MDMsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgbm90aWZ5QXBwV2lkZ2V0Vmlld0RhdGFDaGFuZ2VkSW5zdGFuY2VMb2NrZWQoQXBwV2lkZ2V0SWQgaWQsIGludCB2aWV3SWQpIHsKKyAgICAgICAgLy8gYWxsb3cgZm9yIHN0YWxlIGFwcFdpZGdldElkcyBhbmQgb3RoZXIgYmFkbmVzcworICAgICAgICAvLyBsb29rdXAgYWxzbyBjaGVja3MgdGhhdCB0aGUgY2FsbGluZyBwcm9jZXNzIGNhbiBhY2Nlc3MgdGhlIGFwcFdpZGdldElkCisgICAgICAgIC8vIGRyb3AgdW5ib3VuZCBhcHBXaWRnZXRJZHMgKHNob3VsZG4ndCBiZSBwb3NzaWJsZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykKKyAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQucHJvdmlkZXIgIT0gbnVsbCAmJiAhaWQucHJvdmlkZXIuem9tYmllICYmICFpZC5ob3N0LnpvbWJpZSkgeworICAgICAgICAgICAgLy8gaXMgYW55b25lIGxpc3RlbmluZz8KKyAgICAgICAgICAgIGlmIChpZC5ob3N0LmNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxvY2sgaXMgaGVsZCwgYnV0IHRoaXMgaXMgYSBvbmV3YXkgY2FsbAorICAgICAgICAgICAgICAgICAgICBpZC5ob3N0LmNhbGxiYWNrcy52aWV3RGF0YUNoYW5nZWQoaWQuYXBwV2lkZ2V0SWQsIHZpZXdJZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQgZmFpbGVkOyByZW1vdmUgdGhlIGNhbGxiYWNrLiBObyBuZWVkIHRvIHBydW5lIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoaXMgaG9zdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIGlkLmhvc3QuY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50W10gc3RhcnRMaXN0ZW5pbmcoSUFwcFdpZGdldEhvc3QgY2FsbGJhY2tzLCBTdHJpbmcgcGFja2FnZU5hbWUsIGludCBob3N0SWQsCiAgICAgICAgICAgICBMaXN0PFJlbW90ZVZpZXdzPiB1cGRhdGVkVmlld3MpIHsKICAgICAgICAgaW50IGNhbGxpbmdVaWQgPSBlbmZvcmNlQ2FsbGluZ1VpZChwYWNrYWdlTmFtZSk7CkBAIC03NDIsNiArODAxLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZm8ubGFiZWwgPSBhY3Rpdml0eUluZm8ubG9hZExhYmVsKG1QYWNrYWdlTWFuYWdlcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGluZm8uaWNvbiA9IHJpLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgaW5mby5wcmV2aWV3SW1hZ2UgPSBzYS5nZXRSZXNvdXJjZUlkKAorICAgICAgICAgICAgCQljb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BcHBXaWRnZXRQcm92aWRlckluZm9fcHJldmlld0ltYWdlLCAwKTsKKwogICAgICAgICAgICAgc2EucmVjeWNsZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gT2sgdG8gY2F0Y2ggRXhjZXB0aW9uIGhlcmUsIGJlY2F1c2UgYW55dGhpbmcgZ29pbmcgd3JvbmcgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ2xpcGJvYXJkU2VydmljZS5qYXZhCmluZGV4IGFhOGNkZWQuLjMwOGM5YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0NsaXBib2FyZFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9DbGlwYm9hcmRTZXJ2aWNlLmphdmEKQEAgLTE2LDQyICsxNiw4NCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IGFuZHJvaWQudGV4dC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGF0YTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JQ2xpcGJvYXJkOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrTGlzdDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpcGJvYXJkIGZvciBjb3B5IGFuZCBwYXN0ZS4KICAqLwogcHVibGljIGNsYXNzIENsaXBib2FyZFNlcnZpY2UgZXh0ZW5kcyBJQ2xpcGJvYXJkLlN0dWIgewotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1DbGlwYm9hcmQgPSAiIjsKKyAgICBwcml2YXRlIENsaXBEYXRhIG1QcmltYXJ5Q2xpcDsKKyAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNhbGxiYWNrTGlzdDxJT25QcmltYXJ5Q2xpcENoYW5nZWRMaXN0ZW5lcj4gbVByaW1hcnlDbGlwTGlzdGVuZXJzCisgICAgICAgICAgICA9IG5ldyBSZW1vdGVDYWxsYmFja0xpc3Q8SU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXI+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIGNsaXBib2FyZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ2xpcGJvYXJkU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyB2b2lkIHNldENsaXBib2FyZFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q2xpcChDbGlwRGF0YSBjbGlwKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKKyAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwgJiYgY2xpcC5nZXRJdGVtQ291bnQoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gaXRlbXMiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcCA9IGNsaXA7CisgICAgICAgICAgICBmaW5hbCBpbnQgbiA9IG1QcmltYXJ5Q2xpcExpc3RlbmVycy5iZWdpbkJyb2FkY2FzdCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMuZ2V0QnJvYWRjYXN0SXRlbShpKS5kaXNwYXRjaFByaW1hcnlDbGlwQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFJlbW90ZUNhbGxiYWNrTGlzdCB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVhZCBvYmplY3QgZm9yIHVzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmltYXJ5Q2xpcExpc3RlbmVycy5maW5pc2hCcm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgIH0KICAgICAKLSAgICAgICAgICAgIG1DbGlwYm9hcmQgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q2xpcGJvYXJkVGV4dCgpIHsKKyAgICBwdWJsaWMgQ2xpcERhdGEgZ2V0UHJpbWFyeUNsaXAoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIG1DbGlwYm9hcmQ7CisgICAgICAgICAgICByZXR1cm4gbVByaW1hcnlDbGlwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQorICAgIHB1YmxpYyBDbGlwRGVzY3JpcHRpb24gZ2V0UHJpbWFyeUNsaXBEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaXBEZXNjcmlwdGlvbihtUHJpbWFyeUNsaXApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJpbWFyeUNsaXAoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5Q2xpcCAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMucmVnaXN0ZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIoSU9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtUHJpbWFyeUNsaXBMaXN0ZW5lcnMudW5yZWdpc3RlcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGlwYm9hcmRUZXh0KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2xpcGJvYXJkLmxlbmd0aCgpID4gMDsKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeUNsaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVByaW1hcnlDbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggNzJlNzQzNS4uOTZhMjM5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQpAQCAtMjYsMTQgKzI2LDE4IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTW9iaWxlRGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlTdGF0ZVRyYWNrZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTQ3LDggKzUxLDEzIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmNvbm5lY3Rpdml0eS5UZXRoZXJpbmc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKQEAgLTY3LDcgKzc2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19SRVNUT1JFX0RFTEFZX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiYW5kcm9pZC50ZWxlcGhvbnkuYXBuLXJlc3RvcmUiOwogCi0KICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIApAQCAtODQsNiArOTIsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdCBtTmV0UmVxdWVzdGVyc1BpZHNbXTsKIAorICAgIHByaXZhdGUgV2lmaVdhdGNoZG9nU2VydmljZSBtV2lmaVdhdGNoZG9nU2VydmljZTsKKwogICAgIC8vIHByaW9yaXR5IG9yZGVyIG9mIHRoZSBuZXR0cmFja2VycwogICAgIC8vIChleGNsdWRpbmcgZHluYW1pY2FsbHkgc2V0IG1OZXR3b3JrUHJlZmVyZW5jZSkKICAgICAvLyBUT0RPIC0gbW92ZSBtTmV0d29ya1R5cGVQcmVmZXJlbmNlIGludG8gdGhpcwpAQCAtMTEyLDYgKzEyMiwxMyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbUluaXRpYWxCcm9hZGNhc3Q7CiAKKyAgICBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtTmV0VHJhbnNpdGlvbldha2VMb2NrOworICAgIHByaXZhdGUgU3RyaW5nIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeSA9ICIiOworICAgIHByaXZhdGUgaW50IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXI7CisgICAgcHJpdmF0ZSBpbnQgbU5ldFRyYW5zaXRpb25XYWtlTG9ja1RpbWVvdXQ7CisKKyAgICBwcml2YXRlIEluZXRBZGRyZXNzIG1EZWZhdWx0RG5zOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0d29ya0F0dHJpYnV0ZXMgewogICAgICAgICAvKioKICAgICAgICAgICogQ2xhc3MgZm9yIGhvbGRpbmcgc2V0dGluZ3MgcmVhZCBmcm9tIHJlc291cmNlcy4KQEAgLTE0Nyw1MiArMTY0LDIwIEBACiAgICAgfQogICAgIFJhZGlvQXR0cmlidXRlc1tdIG1SYWRpb0F0dHJpYnV0ZXM7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25uZWN0aXZpdHlUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlUaHJlYWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcigiQ29ubmVjdGl2aXR5VGhyZWFkIik7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNTZXJ2aWNlSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgc1NlcnZpY2VJbnN0YW5jZSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIExvb3Blci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzU2VydmljZUluc3RhbmNlID0gbmV3IENvbm5lY3Rpdml0eVNlcnZpY2UobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9vcGVyLmxvb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRTZXJ2aWNlSW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBDb25uZWN0aXZpdHlUaHJlYWQgdGhyZWFkID0gbmV3IENvbm5lY3Rpdml0eVRocmVhZChjb250ZXh0KTsKLSAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRocmVhZCkgewotICAgICAgICAgICAgICAgIHdoaWxlIChzU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgc1NlcnZpY2VJbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBDb25uZWN0aXZpdHlTZXJ2aWNlIHRocmVhZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc1NlcnZpY2VJbnN0YW5jZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdGl2aXR5U2VydmljZSBnZXRJbnN0YW5jZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIENvbm5lY3Rpdml0eVRocmVhZC5nZXRTZXJ2aWNlSW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIHJldHVybiBzU2VydmljZUluc3RhbmNlOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIkNvbm5lY3Rpdml0eVNlcnZpY2Ugc3RhcnRpbmcgdXAiKTsKIAorICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ29ubmVjdGl2aXR5U2VydmljZVRocmVhZCIpOworICAgICAgICBoYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKwogICAgICAgICAvLyBzZXR1cCBvdXIgdW5pcXVlIGRldmljZSBuYW1lCiAgICAgICAgIFN0cmluZyBpZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRTdHJpbmcoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQU5EUk9JRF9JRCk7CkBAIC0yMDEsMTAgKzE4NiwyOCBAQAogICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5ob3N0bmFtZSIsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmVhZCBvdXIgZGVmYXVsdCBkbnMgc2VydmVyIGlwCisgICAgICAgIFN0cmluZyBkbnMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFRkFVTFRfRE5TX1NFUlZFUik7CisgICAgICAgIGlmIChkbnMgPT0gbnVsbCB8fCBkbnMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgZG5zID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19kZWZhdWx0X2Ruc19zZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtRGVmYXVsdERucyA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShkbnMpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3Igc2V0dGluZyBkZWZhdWx0RG5zIHVzaW5nICIgKyBkbnMpOworICAgICAgICB9CisKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CisgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CisKICAgICAgICAgbU5ldFRyYWNrZXJzID0gbmV3IE5ldHdvcmtTdGF0ZVRyYWNrZXJbCiAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5NQVhfTkVUV09SS19UWVBFKzFdOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKIAogICAgICAgICBtTmV0d29ya1ByZWZlcmVuY2UgPSBnZXRQZXJzaXN0ZWROZXR3b3JrUHJlZmVyZW5jZSgpOwogCkBAIC0zMDEsMTggKzMwNCwyMSBAQAogICAgICAgICAgICAgc3dpdGNoIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tUmFkaW8pIHsKICAgICAgICAgICAgIGNhc2UgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkk6CiAgICAgICAgICAgICAgICAgaWYgKERCRykgU2xvZy52KFRBRywgIlN0YXJ0aW5nIFdpZmkgU2VydmljZS4iKTsKLSAgICAgICAgICAgICAgICBXaWZpU3RhdGVUcmFja2VyIHdzdCA9IG5ldyBXaWZpU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0LCB3c3QpOworICAgICAgICAgICAgICAgIFdpZmlTdGF0ZVRyYWNrZXIgd3N0ID0gbmV3IFdpZmlTdGF0ZVRyYWNrZXIoKTsKKyAgICAgICAgICAgICAgICBXaWZpU2VydmljZSB3aWZpU2VydmljZSA9IG5ldyBXaWZpU2VydmljZShjb250ZXh0KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFLCB3aWZpU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgd2lmaVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICAgICAgd2lmaVNlcnZpY2UuY2hlY2tBbmRTdGFydFdpZmkoKTsKICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkldID0gd3N0OwotICAgICAgICAgICAgICAgIHdzdC5zdGFydE1vbml0b3JpbmcoKTsKKyAgICAgICAgICAgICAgICB3c3Quc3RhcnRNb25pdG9yaW5nKGNvbnRleHQsIG1IYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIC8vVE9ETzogYXMgcGFydCBvZiBXV1MgcmVmYWN0b3IsIGNyZWF0ZSBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBuZXcgV2lmaVdhdGNoZG9nU2VydmljZShjb250ZXh0KTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFOgotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKGNvbnRleHQsIG1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBuZXRUeXBlLCBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXSA9IG5ldyBNb2JpbGVEYXRhU3RhdGVUcmFja2VyKG5ldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5tTmFtZSk7CisgICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLnN0YXJ0TW9uaXRvcmluZyhjb250ZXh0LCBtSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgaWYgKG5vTW9iaWxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAidGVhcmluZyBkb3duIE1vYmlsZSBuZXR3b3JrcyBkdWUgdG8gc2V0dGluZyIpOwogICAgICAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0udGVhcmRvd24oKTsKQEAgLTMyOSw3ICszMzUsOCBAQAogICAgICAgICBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSAoKChtTmV0VHJhY2tlcnNbQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRV9EVU5dICE9IG51bGwpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1UZXRoZXJpbmcuaXNEdW5SZXF1aXJlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVVzYlJlZ2V4cygpLmxlbmd0aCAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZVdpZmlSZWdleHMoKS5sZW5ndGggIT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXRoZXJpbmcuZ2V0VGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cygpLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRVcHN0cmVhbUlmYWNlUmVnZXhzKCkubGVuZ3RoICE9IDApOwogCiAgICAgfQpAQCAtNjA1LDE1ICs2MTIsNyBAQAogICAgICAgICAgICAgICAgIG5ldHdvcmsucmVjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZWF0dXJlVXNlcnMuYWRkKGYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfUkVTVE9SRV9ERUZBVUxUX05FVFdPUkssCi0gICAgICAgICAgICAgICAgICAgICAgICBmKSwgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV0d29yay5zdGFydFVzaW5nTmV0d29ya0ZlYXR1cmUoZmVhdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwgZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CkBAIC03MzIsOCArNzMxLDcgQEAKICAgICAgICAgICAgIHRyYWNrZXIudGVhcmRvd24oKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZG8gaXQgdGhlIG9sZCBmYXNoaW9uZWQgd2F5Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tlci5zdG9wVXNpbmdOZXR3b3JrRmVhdHVyZShmZWF0dXJlLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc4MiwxMSArNzgwLDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdEFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIucmVxdWVzdFJvdXRlVG9Ib3N0KGluZXRBZGRyZXNzKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhob3N0QWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gYWRkSG9zdFJvdXRlKHRyYWNrZXIsIGFkZHIpOworICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7fQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHRoYXQgYSBuZXR3b3JrIHJvdXRlIGV4aXN0cyB0byBkZWxpdmVyIHRyYWZmaWMgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QgdmlhIHRoZSBtb2JpbGUgZGF0YSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBob3N0QWRkcmVzcyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgcm91dGUgaXMgZGVzaXJlZCwKKyAgICAgKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgICAgICogVE9ETyAtIGRlcHJlY2F0ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IG9uIHN1Y2Nlc3MsIHtAY29kZSBmYWxzZX0gb24gZmFpbHVyZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhZGRIb3N0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCwgSW5ldEFkZHJlc3MgaG9zdEFkZHJlc3MpIHsKKyAgICAgICAgaWYgKG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZSgpID09IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJSZXF1ZXN0ZWQgaG9zdCByb3V0ZSB0byAiICsgaG9zdEFkZHJlc3MgKyAiKCIgKyBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBob3N0QWRkcmVzcywgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmUoVEFHLCAiYWRkSG9zdFJvdXRlIGZhaWxlZCBkdWUgdG8gbnVsbCBpbnRlcmZhY2UgbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtODk1LDYgKzkxOSwxMiBAQAogICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMLAorICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlTZXJ2aWNlIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogSGFuZGxlIGEge0Bjb2RlIERJU0NPTk5FQ1RFRH0gZXZlbnQuIElmIHRoaXMgcGVydGFpbnMgdG8gdGhlIG5vbi1hY3RpdmUKICAgICAgKiBuZXR3b3JrLCB3ZSBpZ25vcmUgaXQuIElmIGl0IGlzIGZvciB0aGUgYWN0aXZlIG5ldHdvcmssIHdlIHNlbmQgb3V0IGEKQEAgLTExNjUsOSArMTE5NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIk5ldHdvcmsgZGVjbGluZWQgdGVhcmRvd24gcmVxdWVzdCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhaWxvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdGhlck5ldC5yZWxlYXNlV2FrZUxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQ29ubmVjdGl2aXR5U2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIG5ldyBkZWZhdWx0IG5ldHdvcmssIHJlbGVhc2UgdGhlIHRyYW5zaXRpb24gd2FrZWxvY2sgaW4gYSBzZWNvbmQKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGhlbGQuICBUaGUgc2Vjb25kIHBhdXNlIGlzIHRvIGFsbG93IGFwcHMgdG8gcmVjb25uZWN0IG92ZXIgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV3IG5ldHdvcmsKKyAgICAgICAgICAgICAgICBpZiAobU5ldFRyYW5zaXRpb25XYWtlTG9jay5pc0hlbGQoKSkgeworICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BY3RpdmVEZWZhdWx0TmV0d29yayA9IHR5cGU7CkBAIC0xMTgxLDM2ICsxMjE5LDE0IEBACiAgICAgICAgICAgICAvL3JlcG9ydE5ldHdvcmtDb25kaXRpb24obUFjdGl2ZURlZmF1bHROZXR3b3JrLCAxMDApOwogICAgICAgICB9CiAgICAgICAgIHRoaXNOZXQuc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwotICAgICAgICB0aGlzTmV0LnVwZGF0ZU5ldHdvcmtTZXR0aW5ncygpOworICAgICAgICB1cGRhdGVOZXR3b3JrU2V0dGluZ3ModGhpc05ldCk7CiAgICAgICAgIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZSh0eXBlKTsKICAgICAgICAgc2VuZENvbm5lY3RlZEJyb2FkY2FzdChpbmZvKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2NhblJlc3VsdHNBdmFpbGFibGUoTmV0d29ya0luZm8gaW5mbykgewotICAgICAgICBpbnQgbmV0d29ya1R5cGUgPSBpbmZvLmdldFR5cGUoKTsKLSAgICAgICAgaWYgKG5ldHdvcmtUeXBlICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBTbG9nLnYoVEFHLCAiR290IFNjYW5SZXN1bHRzQXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRUeXBlTmFtZSgpICsgIiBuZXR3b3JrLiBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtTmV0VHJhY2tlcnNbbmV0d29ya1R5cGVdLmludGVycHJldFNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkNoYW5nZShib29sZWFuIHZpc2libGUsIGludCBpZCwKLSAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7Ci0KLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KGlkLCBub3RpZmljYXRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoaWQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCi0gICAgICogQWZ0ZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhbnkgbmV0d29yaywgV2UncmUgbWFpbmx5Ci0gICAgICogY29uY2VybmVkIHdpdGggbWFraW5nIHN1cmUgdGhhdCB0aGUgbGlzdCBvZiBETlMgc2VydmVycyBpcyBzZXR1cHVwCisgICAgICogQWZ0ZXIgYSBjaGFuZ2UgaW4gdGhlIGNvbm5lY3Rpdml0eSBzdGF0ZSBvZiBhIG5ldHdvcmsuIFdlJ3JlIG1haW5seQorICAgICAqIGNvbmNlcm5lZCB3aXRoIG1ha2luZyBzdXJlIHRoYXQgdGhlIGxpc3Qgb2YgRE5TIHNlcnZlcnMgaXMgc2V0IHVwCiAgICAgICogYWNjb3JkaW5nIHRvIHdoaWNoIG5ldHdvcmtzIGFyZSBjb25uZWN0ZWQsIGFuZCBlbnN1cmluZyB0aGF0IHRoZQogICAgICAqIHJpZ2h0IHJvdXRpbmcgdGFibGUgZW50cmllcyBleGlzdC4KICAgICAgKi8KQEAgLTEyMjMsMTkgKzEyMzksMTU4IEBACiAKICAgICAgICAgaWYgKG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkpIHsKICAgICAgICAgICAgIGlmIChtTmV0QXR0cmlidXRlc1tuZXRUeXBlXS5pc0RlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5hZGREZWZhdWx0Um91dGUoKTsKKyAgICAgICAgICAgICAgICBhZGREZWZhdWx0Um91dGUobU5ldFRyYWNrZXJzW25ldFR5cGVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU5ldFRyYWNrZXJzW25ldFR5cGVdLmFkZFByaXZhdGVEbnNSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICBhZGRQcml2YXRlRG5zUm91dGVzKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobU5ldEF0dHJpYnV0ZXNbbmV0VHlwZV0uaXNEZWZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBtTmV0VHJhY2tlcnNbbmV0VHlwZV0ucmVtb3ZlRGVmYXVsdFJvdXRlKCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlRGVmYXVsdFJvdXRlKG1OZXRUcmFja2Vyc1tuZXRUeXBlXSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1OZXRUcmFja2Vyc1tuZXRUeXBlXS5yZW1vdmVQcml2YXRlRG5zUm91dGVzKCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBib29sZWFuIHByaXZhdGVEbnNSb3V0ZVNldCA9IG50LmlzUHJpdmF0ZURuc1JvdXRlU2V0KCk7CisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZFByaXZhdGVEbnNSb3V0ZXMgZm9yICIgKyBudCArCisgICAgICAgICAgICAgICAgICAgICIoIiArIGludGVyZmFjZU5hbWUgKyAiKSAtIG1Qcml2YXRlRG5zUm91dGVTZXQgPSAiICsgcHJpdmF0ZURuc1JvdXRlU2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsICYmICFwcml2YXRlRG5zUm91dGVTZXQpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc0xpc3QgPSBwLmdldERuc2VzKCk7CisgICAgICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc0xpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiICBhZGRpbmcgIiArIGRucyk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLmFkZEhvc3RSb3V0ZShpbnRlcmZhY2VOYW1lLCBkbnMsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnQucHJpdmF0ZURuc1JvdXRlU2V0KHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICAvLyBUT0RPIC0gd2Ugc2hvdWxkIGRvIHRoaXMgZXhwbGljaXRseSBidXQgdGhlIE5ldFV0aWxzIGFwaSBkb2VzbnQKKyAgICAgICAgLy8gc3VwcG9ydCB0aGlzIHlldCAtIG11c3QgcmVtb3ZlIGFsbC4gIE5vIHdvcnNlIHRoYW4gYmVmb3JlCisgICAgICAgIExpbmtQcm9wZXJ0aWVzIHAgPSBudC5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICBpZiAocCA9PSBudWxsKSByZXR1cm47CisgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gcC5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgIGJvb2xlYW4gcHJpdmF0ZURuc1JvdXRlU2V0ID0gbnQuaXNQcml2YXRlRG5zUm91dGVTZXQoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBwcml2YXRlRG5zUm91dGVTZXQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAicmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyBmb3IgIiArIG50LmdldE5ldHdvcmtJbmZvKCkuZ2V0VHlwZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaW50ZXJmYWNlTmFtZSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVtb3ZlSG9zdFJvdXRlcyhpbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgIG50LnByaXZhdGVEbnNSb3V0ZVNldChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0Um91dGUoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgeworICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHAuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICBJbmV0QWRkcmVzcyBkZWZhdWx0R2F0ZXdheUFkZHIgPSBwLmdldEdhdGV3YXkoKTsKKworICAgICAgICBpZiAoKGludGVyZmFjZU5hbWUgIT0gbnVsbCkgJiYgKGRlZmF1bHRHYXRld2F5QWRkciAhPSBudWxsICkpIHsKKyAgICAgICAgICAgIGlmICghTmV0d29ya1V0aWxzLmFkZERlZmF1bHRSb3V0ZShpbnRlcmZhY2VOYW1lLCBkZWZhdWx0R2F0ZXdheUFkZHIpICYmIERCRykgeworICAgICAgICAgICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gbnQuZ2V0TmV0d29ya0luZm8oKTsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYWRkRGVmYXVsdFJvdXRlIGZvciAiICsgbmV0d29ya0luZm8uZ2V0VHlwZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaW50ZXJmYWNlTmFtZSArICIpLCBHYXRld2F5QWRkcj0iICsgZGVmYXVsdEdhdGV3YXlBZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRGVmYXVsdFJvdXRlKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgcCA9IG50LmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBwLmdldEludGVyZmFjZU5hbWUoKTsKKworICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoKE5ldHdvcmtVdGlscy5yZW1vdmVEZWZhdWx0Um91dGUoaW50ZXJmYWNlTmFtZSkgPj0gMCkgJiYgREJHKSB7CisgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBudC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJyZW1vdmVEZWZhdWx0Um91dGUgZm9yICIgKyBuZXR3b3JrSW5mby5nZXRUeXBlTmFtZSgpICsgIiAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogUmVhZHMgdGhlIG5ldHdvcmsgc3BlY2lmaWMgVENQIGJ1ZmZlciBzaXplcyBmcm9tIFN5c3RlbVByb3BlcnRpZXMKKyAgICAgKiBuZXQudGNwLmJ1ZmZlcnNpemUuW2RlZmF1bHR8d2lmaXx1bXRzfGVkZ2V8Z3Byc10gYW5kIHNldCB0aGVtIGZvciBzeXN0ZW0KKyAgICAgKiB3aWRlIHVzZQorICAgICAqLworICAgcHVibGljIHZvaWQgdXBkYXRlTmV0d29ya1NldHRpbmdzKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IG50LmdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGJ1ZmZlclNpemVzID0gU3lzdGVtUHJvcGVydGllcy5nZXQoa2V5KTsKKworICAgICAgICBpZiAoYnVmZmVyU2l6ZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywga2V5ICsgIiBub3QgZm91bmQgaW4gc3lzdGVtIHByb3BlcnRpZXMuIFVzaW5nIGRlZmF1bHRzIik7CisKKyAgICAgICAgICAgIC8vIFNldHRpbmcgdG8gZGVmYXVsdCB2YWx1ZXMgc28gd2Ugd29uJ3QgYmUgc3R1Y2sgdG8gcHJldmlvdXMgdmFsdWVzCisgICAgICAgICAgICBrZXkgPSAibmV0LnRjcC5idWZmZXJzaXplLmRlZmF1bHQiOworICAgICAgICAgICAgYnVmZmVyU2l6ZXMgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHZhbHVlcyBpbiBrZXJuZWwKKyAgICAgICAgaWYgKGJ1ZmZlclNpemVzLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLnYoVEFHLCAiU2V0dGluZyBUQ1AgdmFsdWVzOiBbIiArIGJ1ZmZlclNpemVzCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIHdoaWNoIGNvbWVzIGZyb20gWyIgKyBrZXkgKyAiXSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZShidWZmZXJTaXplcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgIC8qKgorICAgICAqIFdyaXRlcyBUQ1AgYnVmZmVyIHNpemVzIHRvIC9zeXMva2VybmVsL2lwdjQvdGNwX1tyL3ddbWVtX1ttaW4vZGVmL21heF0KKyAgICAgKiB3aGljaCBtYXBzIHRvIC9wcm9jL3N5cy9uZXQvaXB2NC90Y3Bfcm1lbSBhbmQgdGNwd21lbQorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemVzIGluIHRoZSBmb3JtYXQgb2YgInJlYWRNaW4sIHJlYWRJbml0aWFsLCByZWFkTWF4LAorICAgICAqICAgICAgICB3cml0ZU1pbiwgd3JpdGVJbml0aWFsLCB3cml0ZU1heCIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0QnVmZmVyU2l6ZShTdHJpbmcgYnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGJ1ZmZlclNpemVzLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDYpIHsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICIvc3lzL2tlcm5lbC9pcHY0L3RjcF8iOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9taW4iLCB2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9tYXgiLCB2YWx1ZXNbMl0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9taW4iLCB2YWx1ZXNbM10pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOworICAgICAgICAgICAgICAgIHN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9tYXgiLCB2YWx1ZXNbNV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNhbid0IHNldCB0Y3AgYnVmZmVyIHNpemVzOiIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyoqCisgICAgICogV3JpdGVzIHN0cmluZyB0byBmaWxlLiBCYXNpY2FsbHkgc2FtZSBhcyAiZWNobyAtbiAkc3RyaW5nID4gJGZpbGVuYW1lIgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nVG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXQud3JpdGUoc3RyaW5nKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisKICAgICAvKioKICAgICAgKiBBZGp1c3QgdGhlIHBlci1wcm9jZXNzIGRucyBlbnRyaWVzIChuZXQuZG5zPHg+LjxwaWQ+KSBiYXNlZAogICAgICAqIG9uIHRoZSBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBuZXQgd2hpY2ggdGhpcyBwcm9jZXNzIHJlcXVlc3RlZC4KQEAgLTEyNTEsMTIgKzE0MDYsMTQgQEAKICAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgbnQgPSBtTmV0VHJhY2tlcnNbaV07CiAgICAgICAgICAgICBpZiAobnQuZ2V0TmV0d29ya0luZm8oKS5pc0Nvbm5lY3RlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICFudC5pc1RlYXJkb3duUmVxdWVzdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICBMaXN0IHBpZHMgPSBtTmV0UmVxdWVzdGVyc1BpZHNbaV07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHBpZHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldChqKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBpZC5pbnRWYWx1ZSgpID09IG15UGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBkbnNMaXN0ID0gbnQuZ2V0TmFtZVNlcnZlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUGlkRG5zKGRuc0xpc3QsIG15UGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc2VzID0gcC5nZXREbnNlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zZXMsIG15UGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb0J1bXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW1wRG5zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMjc4LDEyICsxNDM1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVQaWREbnMoU3RyaW5nW10gZG5zTGlzdCwgaW50IHBpZCkgeworICAgIHByaXZhdGUgdm9pZCB3cml0ZVBpZERucyhDb2xsZWN0aW9uIDxJbmV0QWRkcmVzcz4gZG5zZXMsIGludCBwaWQpIHsKICAgICAgICAgaW50IGogPSAxOwotICAgICAgICBmb3IgKFN0cmluZyBkbnMgOiBkbnNMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoZG5zICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMoZG5zLCAiMC4wLjAuMCIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMiICsgaisrICsgIi4iICsgcGlkLCBkbnMpOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc2VzKSB7CisgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgibmV0LmRucyIgKyBqKysgKyAiLiIgKyBwaWQsIGRucy5nZXRIb3N0QWRkcmVzcygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTMwNiwxNiArMTQ2MSwyNCBAQAogICAgICAgICAvLyBhZGQgZGVmYXVsdCBuZXQncyBkbnMgZW50cmllcwogICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIG50ID0gbU5ldFRyYWNrZXJzW25ldFR5cGVdOwogICAgICAgICBpZiAobnQgIT0gbnVsbCAmJiBudC5nZXROZXR3b3JrSW5mbygpLmlzQ29ubmVjdGVkKCkgJiYgIW50LmlzVGVhcmRvd25SZXF1ZXN0ZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gZG5zTGlzdCA9IG50LmdldE5hbWVTZXJ2ZXJzKCk7CisgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBwID0gbnQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5ldEFkZHJlc3M+IGRuc2VzID0gcC5nZXREbnNlcygpOwogICAgICAgICAgICAgaWYgKG1OZXRBdHRyaWJ1dGVzW25ldFR5cGVdLmlzRGVmYXVsdCgpKSB7CiAgICAgICAgICAgICAgICAgaW50IGogPSAxOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGRucyA6IGRuc0xpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRucyAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKGRucywgIjAuMC4wLjAiKSkgeworICAgICAgICAgICAgICAgIGlmIChkbnNlcy5zaXplKCkgPT0gMCAmJiBtRGVmYXVsdERucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJubyBkbnMgcHJvdmlkZWQgLSB1c2luZyAiICsgbURlZmF1bHREbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoIm5ldC5kbnMxIiwgbURlZmF1bHREbnMuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEluZXRBZGRyZXNzIGRucyA6IGRuc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImFkZGluZyBkbnMgIiArIGRucyArICIgZm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnQuZ2V0TmV0d29ya0luZm8oKS5nZXRUeXBlTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJuZXQuZG5zIiArIGorKywgZG5zLmdldEhvc3RBZGRyZXNzKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaW50IGs9aiA7IGs8bU51bURuc0VudHJpZXM7IGsrKykgewpAQCAtMTMyOCwxMSArMTQ5MSwxMSBAQAogICAgICAgICAgICAgICAgIExpc3QgcGlkcyA9IG1OZXRSZXF1ZXN0ZXJzUGlkc1tuZXRUeXBlXTsKICAgICAgICAgICAgICAgICBmb3IgKGludCB5PTA7IHk8IHBpZHMuc2l6ZSgpOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBwaWQgPSAoSW50ZWdlcilwaWRzLmdldCh5KTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQaWREbnMoZG5zTGlzdCwgcGlkLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVBpZERucyhkbnNlcywgcGlkLmludFZhbHVlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1bXBEbnMoKTsKICAgICAgICAgfQotICAgICAgICBidW1wRG5zKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0UmVzdG9yZURlZmF1bHROZXR3b3JrRGVsYXkoKSB7CkBAIC0xMzg3LDExICsxNTUwLDIyIEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiTmV0d29ya1RyYW5zdGlvbldha2VMb2NrIGlzIGN1cnJlbnRseSAiICsKKyAgICAgICAgICAgICAgICAgICAgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkgPyAiIiA6ICJub3QgIikgKyAiaGVsZC4iKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIkl0IHdhcyBsYXN0IHJlcXVlc3RlZCBmb3IgIittTmV0VHJhbnNpdGlvbldha2VMb2NrQ2F1c2VkQnkpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50bG4oKTsKKwogICAgICAgICBtVGV0aGVyaW5nLmR1bXAoZmQsIHB3LCBhcmdzKTsKICAgICB9CiAKICAgICAvLyBtdXN0IGJlIHN0YXRlbGVzcyAtIHRoaW5ncyBjaGFuZ2UgdW5kZXIgdXMuCiAgICAgcHJpdmF0ZSBjbGFzcyBNeUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIE15SGFuZGxlcihMb29wZXIgbG9vcGVyKSB7CisgICAgICAgICAgICBzdXBlcihsb29wZXIpOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIE5ldHdvcmtJbmZvIGluZm87CkBAIC0xNDUzLDM0ICsxNjI3LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb25uZWN0KGluZm8pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgICAgIGluZm8gPSAoTmV0d29ya0luZm8pIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNjYW5SZXN1bHRzQXZhaWxhYmxlKGluZm8pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uQ2hhbmdlKG1zZy5hcmcxID09IDEsIG1zZy5hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3RpZmljYXRpb24pIG1zZy5vYmopOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQogICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DT05GSUdVUkFUSU9OX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBtYWtlIHRoaXMgaGFuZGxlIGlwL3Byb3h5L2dhdGV3YXkvZG5zIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGluZm8uZ2V0VHlwZSgpOwogICAgICAgICAgICAgICAgICAgICBoYW5kbGVEbnNDb25maWd1cmF0aW9uQ2hhbmdlKHR5cGUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9ST0FNSU5HX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbWUgaW4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE5ldHdvcmtTdGF0ZVRyYWNrZXIuRVZFTlRfTkVUV09SS19TVUJUWVBFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbWUgaW4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX1JFU1RPUkVfREVGQVVMVF9ORVRXT1JLOgogICAgICAgICAgICAgICAgICAgICBGZWF0dXJlVXNlciB1ID0gKEZlYXR1cmVVc2VyKW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHUuZXhwaXJlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDb25uZWN0aXZpdHlTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA9PSBtTmV0VHJhbnNpdGlvbldha2VMb2NrU2VyaWFsTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV0VHJhbnNpdGlvbldha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSA9IG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tDYXVzZWRCeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2VkQnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5ldFRyYW5zaXRpb24gV2FrZWxvY2sgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWRCeSArICIgcmVsZWFzZWQgYnkgdGltZW91dCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTmV0d29ya1N0YXRlVHJhY2tlci5FVkVOVF9JTkVUX0NPTkRJVElPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJJbmV0IGNvbm5lY3Rpdml0eSBjaGFuZ2UsIG5ldD0iICsKQEAgLTE2MDEsNiArMTc3MSwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIGVuZm9yY2VUZXRoZXJBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIGlmIChpc1RldGhlcmluZ1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRPRE8gLSBtb3ZlIGlmYWNlIGxpc3RpbmcsIHF1ZXJpZXMsIGV0YyB0byBuZXcgbW9kdWxlCiAgICAgLy8gamF2YWRvYyBmcm9tIGludGVyZmFjZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRUZXRoZXJhYmxlSWZhY2VzKCkgewpAQCAtMTYyOSw2ICsxODA4LDI1IEBACiAgICAgICAgIHJldHVybiB0ZXRoZXJFbmFibGVkSW5TZXR0aW5ncyAmJiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQ7CiAgICAgfQogCisgICAgLy8gQW4gQVBJIE5ldHdvcmtTdGF0ZVRyYWNrZXJzIGNhbiBjYWxsIHdoZW4gdGhleSBsb3NlIHRoZWlyIG5ldHdvcmsuCisgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBYIHNlY29uZHMgb3IgYSBuZXR3b3JrIGJlY29tZXMgQ09OTkVDVEVELAorICAgIC8vIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LiAgVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgYnkgdGhlIGZpcnN0IGNhbGxlciBhbmQgbm90CisgICAgLy8gcmVzdGFydGVkIGJ5IHN1YnNlcXVlbnQgY2FsbGVycy4KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0TmV0d29ya1RyYW5zaXRpb25XYWtlbG9jayhTdHJpbmcgZm9yV2hvbSkgeworICAgICAgICBlbmZvcmNlQ29ubmVjdGl2aXR5SW50ZXJuYWxQZXJtaXNzaW9uKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suaXNIZWxkKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIrKzsKKyAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9ja0NhdXNlZEJ5ID0gZm9yV2hvbTsKKyAgICAgICAgfQorICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobUhhbmRsZXIub2J0YWluTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NMRUFSX05FVF9UUkFOU0lUSU9OX1dBS0VMT0NLLAorICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tTZXJpYWxOdW1iZXIsIDApLAorICAgICAgICAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8vIDEwMCBwZXJjZW50IGlzIGZ1bGwgZ29vZCwgMCBpcyBmdWxsIGJhZC4KICAgICBwdWJsaWMgdm9pZCByZXBvcnRJbmV0Q29uZGl0aW9uKGludCBuZXR3b3JrVHlwZSwgaW50IHBlcmNlbnRhZ2UpIHsKICAgICAgICAgaWYgKERCRykgU2xvZy5kKFRBRywgInJlcG9ydE5ldHdvcmtDb25kaXRpb24oIiArIG5ldHdvcmtUeXBlICsgIiwgIiArIHBlcmNlbnRhZ2UgKyAiKSIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ291bnRyeURldGVjdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbi5Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uSUNvdW50cnlEZXRlY3RvcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgaXMgaW4gdGhyb3VnaAorICoge0BsaW5rIENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3J9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGV4dGVuZHMgSUNvdW50cnlEZXRlY3Rvci5TdHViIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlbW90ZSBsaXN0ZW5lciwgaXQgd2lsbCBhbHNvIHJlbW92ZXMgaXRzZWxmCisgICAgICogZnJvbSBsaXN0ZW5lciBsaXN0IHdoZW4gdGhlIHJlbW90ZSBwcm9jZXNzIHdhcyBkaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVjZWl2ZXIgaW1wbGVtZW50cyBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyIG1LZXk7CisKKyAgICAgICAgcHVibGljIFJlY2VpdmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICAgICAgbUtleSA9IGxpc3RlbmVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobUtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlck9iaikgeworICAgICAgICAgICAgaWYgKG90aGVyT2JqIGluc3RhbmNlb2YgUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUtleS5lcXVhbHMoKChSZWNlaXZlcikgb3RoZXJPYmopLm1LZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElDb3VudHJ5TGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUxpc3RlbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4gbVJlY2VpdmVyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIG1Db3VudHJ5RGV0ZWN0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKyAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb3VudHJ5TGlzdGVuZXIgbUxvY2F0aW9uQmFzZWREZXRlY3Rvckxpc3RlbmVyOworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIG1SZWNlaXZlcnMgPSBuZXcgSGFzaE1hcDxJQmluZGVyLCBSZWNlaXZlcj4oKTsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBJQ291bnRyeUxpc3RlbmVyIGludG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQ291bnRyeUxpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBpZiAoIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGFkZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIElDb3VudHJ5TGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb3VudHJ5TGlzdGVuZXIoSUNvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKElDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBSZWNlaXZlciByID0gbmV3IFJlY2VpdmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXNCaW5kZXIoKS5saW5rVG9EZWF0aChyLCAwKTsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJzLnB1dChsaXN0ZW5lci5hc0JpbmRlcigpLCByKTsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiVGhlIGZpcnN0IGxpc3RlbmVyIGlzIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHNldENvdW50cnlMaXN0ZW5lcihtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImxpbmtUb0RlYXRoIGZhaWxlZDoiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihJQmluZGVyIGtleSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNlaXZlcnMpIHsKKyAgICAgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAobVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIk5vIGxpc3RlbmVyIGlzIGxlZnQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVjZWl2ZXJzKENvdW50cnkgY291bnRyeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlY2VpdmVycykgeworICAgICAgICAgICAgZm9yIChSZWNlaXZlciByZWNlaXZlciA6IG1SZWNlaXZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5nZXRMaXN0ZW5lcigpLm9uQ291bnRyeURldGVjdGVkKGNvdW50cnkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNoYWxsIHdlIHJlbW92ZSB0aGUgcmVjZWl2ZXI/CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJub3RpZnlSZWNlaXZlcnMgZmFpbGVkOiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIC8vIFNoYWxsIHdlIHdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2guCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMsICJDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIik7CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBtQ291bnRyeURldGVjdG9yID0gbmV3IENvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IobUNvbnRleHQpOworICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yTGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoZmluYWwgQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVJlY2VpdmVycyhjb3VudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eShQcm9jZXNzLlRIUkVBRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisgICAgICAgIExvb3Blci5sb29wKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Db3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gRm9yIHRlc3RpbmcKKyAgICBib29sZWFuIGlzU3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHJldHVybiBtU3lzdGVtUmVhZHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RlbW9EYXRhU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Nzk4NWYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGVtb0RhdGFTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0czsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTWVkaWFTdG9yZS5JbWFnZXM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVtb0RhdGFTZXQKLXsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9HX1RBRyA9ICJEZW1vRGF0YVNldCI7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKENvbnRleHQgY29udGV4dCkKLSAgICB7Ci0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIgPSBjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIG9sZCBkYXRhCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIuZGVsZXRlKENvbnRhY3RzLlBlb3BsZS5DT05URU5UX1VSSSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBuZXcgZGF0YQotICAgICAgICBhZGREZWZhdWx0RGF0YSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGltYWdlcyBmcm9tIC9hbmRyb2lkL2ltYWdlcwotICAgICAgICBhZGREZWZhdWx0SW1hZ2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGFkZERlZmF1bHRJbWFnZXMoKQotICAgIHsKLSAgICAgICAgRmlsZSByb290RGlyZWN0b3J5ID0gRW52aXJvbm1lbnQuZ2V0Um9vdERpcmVjdG9yeSgpOwotICAgICAgICBTdHJpbmcgW10gZmlsZXMKLSAgICAgICAgICAgID0gbmV3IEZpbGUocm9vdERpcmVjdG9yeSwgImltYWdlcyIpLmxpc3QoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZmlsZXMubGVuZ3RoOwotCi0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgImFkZERlZmF1bHRJbWFnZXM6IG5vIGltYWdlcyBmb3VuZCEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcm9vdERpcmVjdG9yeSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VzLk1lZGlhLmluc2VydEltYWdlKG1Db250ZW50UmVzb2x2ZXIsIHBhdGgsIG5hbWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkZhaWxlZCB0byBpbXBvcnQgaW1hZ2UgIiArIHBhdGgsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGREZWZhdWx0RGF0YSgpCi0gICAgewotICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBkZWZhdWx0IGRhdGEuLi4iKTsKLQotLy8gICAgICAgYWRkSW1hZ2UoIlZpb2xldCIsICJpbWFnZXMvdmlvbGV0LnBuZyIpOwotLy8gICAgICAgYWRkSW1hZ2UoIkNvcmt5IiwgImltYWdlcy9jb3JreS5wbmciKTsKLQotICAgICAgICAvLyBQRU5ESU5HOiBzaG91bGQgdGhpcyBiZSBkb25lIGhlcmU/IT8hCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIEludGVudC5BQ1RJT05fQ0FMTCwgVXJpLmZyb21QYXJ0cygidm9pY2VtYWlsIiwgIiIsIG51bGwpKTsKLSAgICAgICAgYWRkU2hvcnRjdXQoIjEiLCBpbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgVXJpIGFkZEltYWdlKFN0cmluZyBuYW1lLCBVcmkgZmlsZSkKLSAgICB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgaW1hZ2V2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgaW1hZ2V2LnB1dCgibmFtZSIsIG5hbWUpOwotCi0gICAgICAgIFVyaSB1cmwgPSBudWxsOwotCi0gICAgICAgIEFzc2V0TWFuYWdlciBhc3MgPSBBc3NldE1hbmFnZXIuZ2V0U3lzdGVtKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW4gPSBhc3Mub3BlbihmaWxlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICB1cmwgPSBtQ29udGVudFJlc29sdmVyLmluc2VydChJbWFnZXMuTWVkaWEuSU5URVJOQUxfQ09OVEVOVF9VUkksIGltYWdldik7Ci0gICAgICAgICAgICBvdXQgPSBtQ29udGVudFJlc29sdmVyLm9wZW5PdXRwdXRTdHJlYW0odXJsKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSA4ICogMTAyNDsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBpbi5yZWFkKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRmFpbGVkIHRvIGluc2VydCBpbWFnZSAnIiArIGZpbGUgKyAiJyIsIGUpOwotICAgICAgICAgICAgdXJsID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVcmkgYWRkU2hvcnRjdXQoU3RyaW5nIHNob3J0Y3V0LCBJbnRlbnQgaW50ZW50KQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBTbG9nLnYoTE9HX1RBRywgImFkZFNob3J0Y3V0OiBzaG9ydGN1dD0iICsgc2hvcnRjdXQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5Cb29rbWFya3MuYWRkKG1Db250ZW50UmVzb2x2ZXIsIGludGVudCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgIT0gbnVsbCA/IHNob3J0Y3V0LmNoYXJBdCgwKSA6IDAsIDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDE5ZDE0NmQuLjBjM2EwZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLklEZXZpY2VQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CkBAIC01OCw0NiArNjEsNjYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHBvbGljeSBBUElzLgogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBJRGV2aWNlUG9saWN5TWFuYWdlci5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZSI7Ci0gICAgCisKICAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIGZpbmFsIE15UGFja2FnZU1vbml0b3IgbU1vbml0b3I7CiAKICAgICBJUG93ZXJNYW5hZ2VyIG1JUG93ZXJNYW5hZ2VyOwotICAgIAorCiAgICAgaW50IG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgaW50IG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgIGludCBtQWN0aXZlUGFzc3dvcmROdW1lcmljID0gMDsKKyAgICBpbnQgbUFjdGl2ZVBhc3N3b3JkU3ltYm9scyA9IDA7CisgICAgaW50IG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgaW50IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzID0gMDsKLSAgICAKKwogICAgIGludCBtUGFzc3dvcmRPd25lciA9IC0xOwotICAgIAorCiAgICAgZmluYWwgSGFzaE1hcDxDb21wb25lbnROYW1lLCBBY3RpdmVBZG1pbj4gbUFkbWluTWFwCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIEFjdGl2ZUFkbWluPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3RpdmVBZG1pbj4gbUFkbWluTGlzdAogICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PEFjdGl2ZUFkbWluPigpOwotICAgIAorCiAgICAgc3RhdGljIGNsYXNzIEFjdGl2ZUFkbWluIHsKICAgICAgICAgZmluYWwgRGV2aWNlQWRtaW5JbmZvIGluZm87Ci0gICAgICAgIAorCiAgICAgICAgIGludCBwYXNzd29yZFF1YWxpdHkgPSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfVU5TUEVDSUZJRUQ7CiAgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZW5ndGggPSAwOworICAgICAgICBpbnQgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gMDsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IDA7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSAwOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IDE7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmROdW1lcmljID0gMTsKKyAgICAgICAgaW50IG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSAxOworICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gMDsKICAgICAgICAgbG9uZyBtYXhpbXVtVGltZVRvVW5sb2NrID0gMDsKICAgICAgICAgaW50IG1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlID0gMDsKLSAgICAgICAgCisKKyAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQorICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBnbG9iYWxQcm94eVNwZWMgPSBudWxsOworICAgICAgICBTdHJpbmcgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gbnVsbDsKKwogICAgICAgICBBY3RpdmVBZG1pbihEZXZpY2VBZG1pbkluZm8gX2luZm8pIHsKICAgICAgICAgICAgIGluZm8gPSBfaW5mbzsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBpbnQgZ2V0VWlkKCkgeyByZXR1cm4gaW5mby5nZXRBY3Rpdml0eUluZm8oKS5hcHBsaWNhdGlvbkluZm8udWlkOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgd3JpdGVUb1htbChYbWxTZXJpYWxpemVyIG91dCkKICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicG9saWNpZXMiKTsKQEAgLTExMCw3ICsxMzMsNDIgQEAKICAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sZW5ndGgiKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtbi1wYXNzd29yZC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwYXNzd29yZEhpc3RvcnlMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGFzc3dvcmQtaGlzdG9yeS1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHBhc3N3b3JkSGlzdG9yeUxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJtaW4tcGFzc3dvcmQtdXBwZXJjYXNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxvd2VyY2FzZSIpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2YWx1ZSIsIEludGVnZXIudG9TdHJpbmcobWluaW11bVBhc3N3b3JkTG93ZXJDYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1pbi1wYXNzd29yZC1sb3dlcmNhc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZExldHRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLWxldHRlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE51bWVyaWMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW51bWVyaWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLXN5bWJvbHMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1pbmltdW1QYXNzd29yZE5vbkxldHRlciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJtaW4tcGFzc3dvcmQtbm9ubGV0dGVyIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAibWluLXBhc3N3b3JkLW5vbmxldHRlciIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXhpbXVtVGltZVRvVW5sb2NrICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewpAQCAtMTIzLDggKzE4MSwyMyBAQAogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgSW50ZWdlci50b1N0cmluZyhtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgIm1heC1mYWlsZWQtcGFzc3dvcmQtd2lwZSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNwZWNpZmllc0dsb2JhbFByb3h5KSB7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsICJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Iik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKHNwZWNpZmllc0dsb2JhbFByb3h5KSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAic3BlY2lmaWVzX2dsb2JhbF9wcm94eSIpOworICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImdsb2JhbC1wcm94eS1zcGVjIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlTcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LXNwZWMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInZhbHVlIiwgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZ2xvYmFsLXByb3h5LWV4Y2x1c2lvbi1saXN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgcmVhZEZyb21YbWwoWG1sUHVsbFBhcnNlciBwYXJzZXIpCiAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBvdXRlckRlcHRoID0gcGFyc2VyLmdldERlcHRoKCk7CkBAIC0xNDMsMTkgKzIxNiw0OSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC1sZW5ndGgiLmVxdWFscyh0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXNzd29yZC1oaXN0b3J5LWxlbmd0aCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRIaXN0b3J5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1pbi1wYXNzd29yZC11cHBlcmNhc2UiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtaW4tcGFzc3dvcmQtbG93ZXJjYXNlIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLWxldHRlcnMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW51bWVyaWMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZE51bWVyaWMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLXN5bWJvbHMiLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbmltdW1QYXNzd29yZFN5bWJvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWluLXBhc3N3b3JkLW5vbmxldHRlciIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluaW11bVBhc3N3b3JkTm9uTGV0dGVyID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1heC10aW1lLXRvLXVubG9jayIuZXF1YWxzKHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVRpbWVUb1VubG9jayA9IExvbmcucGFyc2VMb25nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibWF4LWZhaWxlZC1wYXNzd29yZC13aXBlIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzcGVjaWZpZXMtZ2xvYmFsLXByb3h5Ii5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXNHbG9iYWxQcm94eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZhbHVlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1zcGVjIi5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm94eVNwZWMgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImdsb2JhbC1wcm94eS1leGNsdXNpb24tbGlzdCIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBhZG1pbiB0YWc6ICIgKyB0YWcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBYbWxVdGlscy5za2lwQ3VycmVudFRhZyhwYXJzZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4LCBQcmludFdyaXRlciBwdykgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInVpZD0iKTsgcHcucHJpbnRsbihnZXRVaWQoKSk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKCJwb2xpY2llczoiKTsKQEAgLTE2NiwyMyArMjY5LDQ3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkUXVhbGl0eT0weCIpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKHBhc3N3b3JkUXVhbGl0eSkpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExlbmd0aD0iKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhc3N3b3JkSGlzdG9yeUxlbmd0aD0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwYXNzd29yZEhpc3RvcnlMZW5ndGgpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRVcHBlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZT0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZExldHRlcnM9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWluaW11bVBhc3N3b3JkTGV0dGVycyk7CisgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWluaW11bVBhc3N3b3JkTnVtZXJpYz0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROdW1lcmljKTsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJtaW5pbXVtUGFzc3dvcmRTeW1ib2xzPSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1pbmltdW1QYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1pbmltdW1QYXNzd29yZE5vbkxldHRlcj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihtaW5pbXVtUGFzc3dvcmROb25MZXR0ZXIpOwogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIm1heGltdW1UaW1lVG9VbmxvY2s9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bVRpbWVUb1VubG9jayk7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGU9Iik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNwZWNpZmllc0dsb2JhbFByb3h5PSIpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNwZWNpZmllc0dsb2JhbFByb3h5KTsKKyAgICAgICAgICAgIGlmIChnbG9iYWxQcm94eVNwZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJnbG9iYWxQcm94eVNwZWM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5U3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiZ2xvYmFsUHJveHlFY2x1c2lvbkxpc3Q9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewogICAgICAgICBwdWJsaWMgdm9pZCBvblNvbWVQYWNrYWdlc0NoYW5nZWQoKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKERldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLnRoaXMpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPW1BZG1pbkxpc3Quc2l6ZSgpLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhYSA9IG1BZG1pbkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7IAorICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlID0gaXNQYWNrYWdlRGlzYXBwZWFyaW5nKGFhLmluZm8uZ2V0UGFja2FnZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9QRVJNQU5FTlRfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbmdlID09IFBBQ0tBR0VfVEVNUE9SQVJZX0NIQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkFkbWluIHVuZXhwZWN0ZWRseSB1bmluc3RhbGxlZDogIgpAQCAtMjA3LDcgKzMzNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBJbnN0YW50aWF0ZXMgdGhlIHNlcnZpY2UuCiAgICAgICovCkBAIC0yMjQsNyArMzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbUlQb3dlck1hbmFnZXI7CiAgICAgfQotICAgIAorCiAgICAgQWN0aXZlQWRtaW4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoQ29tcG9uZW50TmFtZSB3aG8pIHsKICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5NYXAuZ2V0KHdobyk7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsCkBAIC0yMzQsNyArMzYxLDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0gICAgCisKICAgICBBY3RpdmVBZG1pbiBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZChDb21wb25lbnROYW1lIHdobywgaW50IHJlcVBvbGljeSkKICAgICAgICAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKQEAgLTI2NSwxMyArMzkyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSArICIgZm9yIHBvbGljeSAjIiArIHJlcVBvbGljeSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICB2b2lkIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoQWN0aXZlQWRtaW4gYWRtaW4sIFN0cmluZyBhY3Rpb24pIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChhZG1pbi5pbmZvLmdldENvbXBvbmVudCgpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KLSAgICAKKwogICAgIHZvaWQgc2VuZEFkbWluQ29tbWFuZExvY2tlZChTdHJpbmcgYWN0aW9uLCBpbnQgcmVxUG9saWN5KSB7CiAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgIGlmIChOID4gMCkgewpAQCAtMjgzLDE5ICs0MTAsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQWRtaW5Mb2NrZWQoQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgIGlmIChhZG1pbiAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRvUHJveHlDbGVhbnVwID0KKyAgICAgICAgICAgICAgICBhZG1pbi5pbmZvLnVzZXNQb2xpY3koRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKICAgICAgICAgICAgIHNlbmRBZG1pbkNvbW1hbmRMb2NrZWQoYWRtaW4sCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX0RFVklDRV9BRE1JTl9ESVNBQkxFRCk7CiAgICAgICAgICAgICAvLyBYWFggbmVlZCB0byB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KICAgICAgICAgICAgIG1BZG1pbkxpc3QucmVtb3ZlKGFkbWluKTsKICAgICAgICAgICAgIG1BZG1pbk1hcC5yZW1vdmUoYWRtaW5SZWNlaXZlcik7CiAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgIGlmIChkb1Byb3h5Q2xlYW51cCkgeworICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBEZXZpY2VBZG1pbkluZm8gZmluZEFkbWluKENvbXBvbmVudE5hbWUgYWRtaW5OYW1lKSB7CiAgICAgICAgIEludGVudCByZXNvbHZlSW50ZW50ID0gbmV3IEludGVudCgpOwogICAgICAgICByZXNvbHZlSW50ZW50LnNldENvbXBvbmVudChhZG1pbk5hbWUpOwpAQCAtMzA0LDcgKzQzNiw3IEBACiAgICAgICAgIGlmIChpbmZvcyA9PSBudWxsIHx8IGluZm9zLnNpemUoKSA8PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkbWluOiAiICsgYWRtaW5OYW1lKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VBZG1pbkluZm8obUNvbnRleHQsIGluZm9zLmdldCgwKSk7CiAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgewpAQCAtMzE1LDcgKzQ0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHByaXZhdGUgc3RhdGljIEpvdXJuYWxlZEZpbGUgbWFrZUpvdXJuYWxlZEZpbGUoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlID0gIi9kYXRhL3N5c3RlbS9kZXZpY2VfcG9saWNpZXMueG1sIjsKICAgICAgICAgcmV0dXJuIG5ldyBKb3VybmFsZWRGaWxlKG5ldyBGaWxlKGJhc2UpLCBuZXcgRmlsZShiYXNlICsgIi50bXAiKSk7CkBAIC0zMzEsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG91dC5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOwogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBvbGljaWVzIik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtMzQyLDI2ICs0NzQsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiYWRtaW4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDApIHsKICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgInBhc3N3b3JkLW93bmVyIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1QYXNzd29yZE93bmVyKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAicGFzc3dvcmQtb3duZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAobUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzKSk7CiAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCAiZmFpbGVkLXBhc3N3b3JkLWF0dGVtcHRzIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoICE9IDApIHsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gMAorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IDAgfHwgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyAhPSAwCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZFN5bWJvbHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYWN0aXZlLXBhc3N3b3JkIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAicXVhbGl0eSIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxlbmd0aCIsIEludGVnZXIudG9TdHJpbmcobUFjdGl2ZVBhc3N3b3JkTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidXBwZXJjYXNlIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJsb3dlcmNhc2UiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImxldHRlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZExldHRlcnMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJudW1lcmljIiwgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKG1BY3RpdmVQYXNzd29yZE51bWVyaWMpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJzeW1ib2xzIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmRTeW1ib2xzKSk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibm9ubGV0dGVyIiwgSW50ZWdlci50b1N0cmluZyhtQWN0aXZlUGFzc3dvcmROb25MZXR0ZXIpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJhY3RpdmUtcGFzc3dvcmQiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJwb2xpY2llcyIpOwogCiAgICAgICAgICAgICBvdXQuZW5kRG9jdW1lbnQoKTsKQEAgLTQzOSw2ICs1ODEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInF1YWxpdHkiKSk7CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsZW5ndGgiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZFVwcGVyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ1cHBlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsb3dlcmNhc2UiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibGV0dGVycyIpKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJudW1lcmljIikpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gSW50ZWdlci5wYXJzZUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bWJvbHMiKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJub25sZXR0ZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLnNraXBDdXJyZW50VGFnKHBhcnNlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gdGFnOiAiICsgdGFnKTsKQEAgLTQ3NiwxMCArNjMwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyh1dGlscy5nZXRBY3RpdmVQYXNzd29yZFF1YWxpdHkoKSkpOwogICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRDsKICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExlbmd0aCA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZExldHRlcnMgPSAwOworICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyA9IDA7CisgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gMDsKKyAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE5vbkxldHRlciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVQYXNzd29yZE93bmVyTG9ja2VkKCk7Ci0gICAgICAgIAorCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewogICAgICAgICAgICAgdGltZU1zID0gSW50ZWdlci5NQVhfVkFMVUU7CkBAIC00OTgsMTIgKzY1OCwxMyBAQAogICAgICAgICAgICAgY2FzZSBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQzoKICAgICAgICAgICAgIGNhc2UgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBQkVUSUM6CiAgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQU5VTUVSSUM6CisgICAgICAgICAgICBjYXNlIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYOgogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHF1YWxpdHkgY29uc3RhbnQ6IDB4IgogICAgICAgICAgICAgICAgICsgSW50ZWdlci50b0hleFN0cmluZyhxdWFsaXR5KSk7CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtUGFzc3dvcmRPd25lciA+PSAwKSB7CiAgICAgICAgICAgICBib29sZWFuIGhhdmVPd25lciA9IGZhbHNlOwpAQCAtNTIwLDE3ICs2ODEsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGxvYWRTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlQWRtaW4oQ29tcG9uZW50TmFtZSBhZG1pblJlY2VpdmVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4sIG51bGwpOwotICAgICAgICAKKwogICAgICAgICBEZXZpY2VBZG1pbkluZm8gaW5mbyA9IGZpbmRBZG1pbihhZG1pblJlY2VpdmVyKTsKICAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGFkbWluOiAiICsgYWRtaW5SZWNlaXZlcik7CkBAIC01NTIsMTMgKzcxMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQoYWRtaW5SZWNlaXZlcikgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTcyLDcgKzczMyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gcGFja2FnZUhhc0FjdGl2ZUFkbWlucyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwpAQCAtNTg0LDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIGFkbWluUmVjZWl2ZXIpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGFkbWluUmVjZWl2ZXIpOwpAQCAtNjAzLDEwICs3NjQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobywgaW50IHF1YWxpdHkpIHsKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKQEAgLTYxOSwxNiArNzgwLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkUXVhbGl0eShDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBtb2RlID0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLnBhc3N3b3JkUXVhbGl0eSA6IG1vZGU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKICAgICAgICAgICAgIGZvciAgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKQEAgLTYzOSw3ICs4MDAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZW5ndGgoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTY1MywxNiArODE0LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChDb21wb25lbnROYW1lIHdobykgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExlbmd0aCA6IGxlbmd0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtNjczLDE4ICs4MzQsMjY3IEBACiAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICB9CiAgICAgfQotICAgIAorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5wYXNzd29yZEhpc3RvcnlMZW5ndGggPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGggOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLnBhc3N3b3JkSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5wYXNzd29yZEhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVVwcGVyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkVXBwZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFVwcGVyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRVcHBlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxvd2VyQ2FzZShDb21wb25lbnROYW1lIHdobywgaW50IGxlbmd0aCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIGlmIChhcC5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2UgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UoQ29tcG9uZW50TmFtZSB3aG8pIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgICAgICAgICAgaWYgKHdobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhZG1pbiAhPSBudWxsID8gYWRtaW4ubWluaW11bVBhc3N3b3JkTG93ZXJDYXNlIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMb3dlckNhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkTGV0dGVycyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZExldHRlcnMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTGV0dGVycykgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBhZG1pbi5taW5pbXVtUGFzc3dvcmRMZXR0ZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE51bWVyaWMgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYXAubWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljIDogbGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCBhZG1pbi5taW5pbXVtUGFzc3dvcmROdW1lcmljKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE51bWVyaWM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoQ29tcG9uZW50TmFtZSB3aG8sIGludCBsZW5ndGgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCisgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7CisgICAgICAgICAgICBpZiAoYXAubWluaW11bVBhc3N3b3JkU3ltYm9scyAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmRTeW1ib2xzID0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKENvbXBvbmVudE5hbWUgd2hvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7CisKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRtaW4gIT0gbnVsbCA/IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IGFkbWluLm1pbmltdW1QYXNzd29yZFN5bWJvbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYWRtaW4ubWluaW11bVBhc3N3b3JkU3ltYm9sczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKENvbXBvbmVudE5hbWUgd2hvLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKHdobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDb21wb25lbnROYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gZ2V0QWN0aXZlQWRtaW5Gb3JDYWxsZXJMb2NrZWQod2hvLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkQpOworICAgICAgICAgICAgaWYgKGFwLm1pbmltdW1QYXNzd29yZE5vbkxldHRlciAhPSBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBhcC5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2F2ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworCisgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5taW5pbXVtUGFzc3dvcmROb25MZXR0ZXIgOiBsZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgYWRtaW4ubWluaW11bVBhc3N3b3JkTm9uTGV0dGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGFkbWluLm1pbmltdW1QYXNzd29yZE5vbkxldHRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmVQYXNzd29yZFN1ZmZpY2llbnQoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCiAgICAgICAgICAgICAvLyBzbyB0cnkgdG8gcmV0cmlldmUgaXQgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbGVyIGlzIG9uZS4KICAgICAgICAgICAgIGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKG51bGwsCiAgICAgICAgICAgICAgICAgICAgIERldmljZUFkbWluSW5mby5VU0VTX1BPTElDWV9MSU1JVF9QQVNTV09SRCk7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSA+PSBnZXRQYXNzd29yZFF1YWxpdHkobnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID49IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKKyAgICAgICAgICAgIGlmIChtQWN0aXZlUGFzc3dvcmRRdWFsaXR5IDwgZ2V0UGFzc3dvcmRRdWFsaXR5KG51bGwpCisgICAgICAgICAgICAgICAgICAgIHx8IG1BY3RpdmVQYXNzd29yZExlbmd0aCA8IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZSA+PSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycyA+PSBnZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPj0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID49IGdldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID49IGdldFBhc3N3b3JkTWluaW11bU5vbkxldHRlcihudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgLy8gVGhpcyBBUEkgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IGFuIGFjdGl2ZSBkZXZpY2UgYWRtaW4sCkBAIC02OTQsNyArMTEwNCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZShDb21wb25lbnROYW1lIHdobywgaW50IG51bSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtNzA5LDE2ICsxMTE5LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgaW50IGdldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtRmFpbGVkUGFzc3dvcmRzRm9yV2lwZSA6IGNvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gbUFkbWluTGlzdC5nZXQoaSk7CkBAIC03MzIsNyArMTE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgYm9vbGVhbiByZXNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGludCBxdWFsaXR5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTc0MywxNCArMTE1MywxNSBAQAogICAgICAgICAgICAgcXVhbGl0eSA9IGdldFBhc3N3b3JkUXVhbGl0eShudWxsKTsKICAgICAgICAgICAgIGlmIChxdWFsaXR5ICE9IERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgIGludCByZWFsUXVhbGl0eSA9IExvY2tQYXR0ZXJuVXRpbHMuY29tcHV0ZVBhc3N3b3JkUXVhbGl0eShwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxRdWFsaXR5IDwgcXVhbGl0eSkgeworICAgICAgICAgICAgICAgIGlmIChyZWFsUXVhbGl0eSA8IHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIHF1YWxpdHkgMHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHF1YWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgcXVhbGl0eSAweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcocXVhbGl0eSkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHF1YWxpdHkgPSByZWFsUXVhbGl0eTsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gTWF0aC5tYXgocmVhbFF1YWxpdHksIHF1YWxpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGxlbmd0aCA9IGdldFBhc3N3b3JkTWluaW11bUxlbmd0aChudWxsKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGgoKSA8IGxlbmd0aCkgewpAQCAtNzU4LDE0ICsxMTY5LDg2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBsZW5ndGggIiArIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0NPTVBMRVgpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGV0dGVycyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGxvd2VyY2FzZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IG51bWJlcnMgPSAwOworICAgICAgICAgICAgICAgIGludCBzeW1ib2xzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbm9ubGV0dGVyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGFzc3dvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyY2FzZSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXR0ZXJzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmNhc2UrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycysrOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ubGV0dGVyKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBub25sZXR0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkTGV0dGVycyA9IGdldFBhc3N3b3JkTWluaW11bUxldHRlcnMobnVsbCk7CisgICAgICAgICAgICAgICAgaWYobGV0dGVycyA8IG5lZWRlZExldHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBsZXR0ZXJzICIgKyBsZXR0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIGxldHRlcnMgIiArIG5lZWRlZExldHRlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROdW1iZXJzID0gZ2V0UGFzc3dvcmRNaW5pbXVtTnVtZXJpYyhudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobnVtYmVycyA8IG5lZWRlZE51bWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiBudW1lcmljYWwgZGlnaXRzICIgKyBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbnVtZXJpY2FsIGRpZ2l0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZE51bWJlcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWRMb3dlckNhc2UgPSBnZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGxvd2VyY2FzZSA8IG5lZWRlZExvd2VyQ2FzZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIGxvd2VyY2FzZSBsZXR0ZXJzICIgKyBsb3dlcmNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWVldCByZXF1aXJlZCBudW1iZXIgb2YgbG93ZXJjYXNlIGxldHRlcnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmVlZGVkTG93ZXJDYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmVlZGVkVXBwZXJDYXNlID0gZ2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJDYXNlKG51bGwpOworICAgICAgICAgICAgICAgIGlmICh1cHBlcmNhc2UgPCBuZWVkZWRVcHBlckNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IG51bWJlciBvZiB1cHBlcmNhc2UgbGV0dGVycyAiICsgdXBwZXJjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIHVwcGVyY2FzZSBsZXR0ZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5lZWRlZFVwcGVyQ2FzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5lZWRlZFN5bWJvbHMgPSBnZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKG51bGwpOworICAgICAgICAgICAgICAgIGlmIChzeW1ib2xzIDwgbmVlZGVkU3ltYm9scykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIHNwZWNpYWwgc3ltYm9scyAiICsgc3ltYm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBtZWV0IHJlcXVpcmVkIG51bWJlciBvZiBzcGVjaWFsIHN5bWJvbHMgIiArIG5lZWRlZFN5bWJvbHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBuZWVkZWROb25MZXR0ZXIgPSBnZXRQYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKG5vbmxldHRlciA8IG5lZWRlZE5vbkxldHRlcikgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicmVzZXRQYXNzd29yZDogbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiICsgbm9ubGV0dGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1lZXQgcmVxdWlyZWQgbnVtYmVyIG9mIG5vbi1sZXR0ZXIgY2hhcmFjdGVycyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZWVkZWROb25MZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIHV0aWxzID0gbmV3IExvY2tQYXR0ZXJuVXRpbHMobUNvbnRleHQpOworICAgICAgICAgICAgaWYodXRpbHMuY2hlY2tQYXNzd29yZEhpc3RvcnkocGFzc3dvcmQpKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IHBhc3N3b3JkIGlzIHRoZSBzYW1lIGFzIG9uZSBvZiB0aGUgbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChudWxsKSArICIgcGFzc3dvcmRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGludCBjYWxsaW5nVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgaWYgKG1QYXNzd29yZE93bmVyID49IDAgJiYgbVBhc3N3b3JkT3duZXIgIT0gY2FsbGluZ1VpZCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgInJlc2V0UGFzc3dvcmQ6IGFscmVhZHkgc2V0IGJ5IGFub3RoZXIgdWlkIGFuZCBub3QgZW50ZXJlZCBieSB1c2VyIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhlbGQsIGJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gY2FsbAogICAgICAgICAvLyBiYWNrIGluIHRvIHRoZSBzZXJ2aWNlLgogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CkBAIC03ODMsMTAgKzEyNjYsMTAgQEAKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhDb21wb25lbnROYW1lIHdobywgbG9uZyB0aW1lTXMpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKQEAgLTc5NiwxNiArMTI3OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyk7CiAgICAgICAgICAgICBpZiAoYXAubWF4aW11bVRpbWVUb1VubG9jayAhPSB0aW1lTXMpIHsKICAgICAgICAgICAgICAgICBhcC5tYXhpbXVtVGltZVRvVW5sb2NrID0gdGltZU1zOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBnZXRNYXhpbXVtVGltZVRvTG9jayhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVNcyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SVBvd2VyTWFuYWdlcigpLnNldE1heGltdW1TY3JlZW5PZmZUaW1lb3VudCgoaW50KXRpbWVNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CkBAIC04MTcsMTYgKzEzMDAsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1UaW1lVG9Mb2NrKENvbXBvbmVudE5hbWUgd2hvKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyB0aW1lID0gMDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKHdobyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFkbWluICE9IG51bGwgPyBhZG1pbi5tYXhpbXVtVGltZVRvVW5sb2NrIDogdGltZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOwogICAgICAgICAgICAgZm9yICAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IG1BZG1pbkxpc3QuZ2V0KGkpOwpAQCAtODQwLDcgKzEzMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCBsb2NrTm93KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgQVBJIGNhbiBvbmx5IGJlIGNhbGxlZCBieSBhbiBhY3RpdmUgZGV2aWNlIGFkbWluLApAQCAtODU3LDcgKzEzNDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgdm9pZCB3aXBlRGF0YUxvY2tlZChpbnQgZmxhZ3MpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlY292ZXJ5U3lzdGVtLnJlYm9vdFdpcGVVc2VyRGF0YShtQ29udGV4dCk7CkBAIC04NjUsNyArMTM0OCw3IEBACiAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHJlcXVlc3RpbmcgZGF0YSB3aXBlIiwgZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgdm9pZCB3aXBlRGF0YShpbnQgZmxhZ3MpIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICAvLyBUaGlzIEFQSSBjYW4gb25seSBiZSBjYWxsZWQgYnkgYW4gYWN0aXZlIGRldmljZSBhZG1pbiwKQEAgLTg4MCwxMSArMTM2MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgZ2V0UmVtb3ZlV2FybmluZyhDb21wb25lbnROYW1lIGNvbXAsIGZpbmFsIFJlbW90ZUNhbGxiYWNrIHJlc3VsdCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluVW5jaGVja2VkTG9ja2VkKGNvbXApOwogICAgICAgICAgICAgaWYgKGFkbWluID09IG51bGwpIHsKQEAgLTkwNywyMCArMTM5MCwzMCBAQAogICAgICAgICAgICAgfSwgbnVsbCwgQWN0aXZpdHkuUkVTVUxUX09LLCBudWxsLCBudWxsKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoKSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXNzd29yZFN0YXRlKGludCBxdWFsaXR5LCBpbnQgbGVuZ3RoLCBpbnQgbGV0dGVycywgaW50IHVwcGVyY2FzZSwKKyAgICAgICAgICAgIGludCBsb3dlcmNhc2UsIGludCBudW1iZXJzLCBpbnQgc3ltYm9scywgaW50IG5vbmxldHRlcikgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkJJTkRfREVWSUNFX0FETUlOLCBudWxsKTsKLSAgICAgICAgCisKICAgICAgICAgdmFsaWRhdGVRdWFsaXR5Q29uc3RhbnQocXVhbGl0eSk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1BY3RpdmVQYXNzd29yZFF1YWxpdHkgIT0gcXVhbGl0eSB8fCBtQWN0aXZlUGFzc3dvcmRMZW5ndGggIT0gbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgbUZhaWxlZFBhc3N3b3JkQXR0ZW1wdHMgIT0gMCB8fCBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzICE9IGxldHRlcnMKKyAgICAgICAgICAgICAgICAgICAgfHwgbUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlICE9IHVwcGVyY2FzZQorICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UgIT0gbG93ZXJjYXNlIHx8IG1BY3RpdmVQYXNzd29yZE51bWVyaWMgIT0gbnVtYmVycworICAgICAgICAgICAgICAgICAgICB8fCBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzICE9IHN5bWJvbHMgfHwgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyICE9IG5vbmxldHRlcikgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRRdWFsaXR5ID0gcXVhbGl0eTsKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzID0gbGV0dGVyczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTG93ZXJDYXNlID0gbG93ZXJjYXNlOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2UgPSB1cHBlcmNhc2U7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVQYXNzd29yZE51bWVyaWMgPSBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzID0gc3ltYm9sczsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyID0gbm9ubGV0dGVyOwogICAgICAgICAgICAgICAgICAgICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzZW5kQWRtaW5Db21tYW5kTG9ja2VkKERldmljZUFkbWluUmVjZWl2ZXIuQUNUSU9OX1BBU1NXT1JEX0NIQU5HRUQsCkBAIC05MzEsMTEgKzE0MjQsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHJlcG9ydEZhaWxlZFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTk1MiwxMSArMTQ0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgcmVwb3J0U3VjY2Vzc2Z1bFBhc3N3b3JkQXR0ZW1wdCgpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5CSU5EX0RFVklDRV9BRE1JTiwgbnVsbCk7Ci0gICAgICAgIAorCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1GYWlsZWRQYXNzd29yZEF0dGVtcHRzICE9IDAgfHwgbVBhc3N3b3JkT3duZXIgPj0gMCkgewogICAgICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTk3Miw3ICsxNDY1LDk1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBzZXRHbG9iYWxQcm94eShDb21wb25lbnROYW1lIHdobywgU3RyaW5nIHByb3h5U3BlYywKKyAgICAgICAgICAgIFN0cmluZyBleGNsdXNpb25MaXN0KSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbXBvbmVudE5hbWUgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhZG1pbiA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX1NFVFNfR0xPQkFMX1BST1hZKTsKKworICAgICAgICAgICAgLy8gU2NhbiB0aHJvdWdoIGFjdGl2ZSBhZG1pbnMgYW5kIGZpbmQgaWYgYW55b25lIGhhcyBhbHJlYWR5CisgICAgICAgICAgICAvLyBzZXQgdGhlIGdsb2JhbCBwcm94eS4KKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gY29tcFNldCA9IG1BZG1pbk1hcC5rZXlTZXQoKTsKKyAgICAgICAgICAgIGZvciAgKENvbXBvbmVudE5hbWUgY29tcG9uZW50IDogY29tcFNldCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFwID0gbUFkbWluTWFwLmdldChjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpICYmICghY29tcG9uZW50LmVxdWFscyh3aG8pKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGFkbWluIGFscmVhZHkgc2V0cyB0aGUgZ2xvYmFsIHByb3h5CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm94eVNwZWMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlTcGVjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eUV4Y2x1c2lvbkxpc3QgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGFkbWluLnNwZWNpZmllc0dsb2JhbFByb3h5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhZG1pbi5nbG9iYWxQcm94eVNwZWMgPSBwcm94eVNwZWM7CisgICAgICAgICAgICAgICAgYWRtaW4uZ2xvYmFsUHJveHlFeGNsdXNpb25MaXN0ID0gZXhjbHVzaW9uTGlzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGdsb2JhbCBwcm94eSBhY2NvcmRpbmdseQorICAgICAgICAgICAgLy8gRG8gdGhpcyB1c2luZyBzeXN0ZW0gcGVybWlzc2lvbnMsIGFzIGFwcHMgY2Fubm90IHdyaXRlIHRvIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbG9uZyBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KG9yaWdJZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldEdsb2JhbFByb3h5QWRtaW4oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAvLyBTY2FuIHRocm91Z2ggYWN0aXZlIGFkbWlucyBhbmQgZmluZCBpZiBhbnlvbmUgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIHNldCB0aGUgZ2xvYmFsIHByb3h5LgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXAuc3BlY2lmaWVzR2xvYmFsUHJveHkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGV2aWNlIGFkbWluIHNldHMgdGhlIGdsb2JhbCBwcm94eQorICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaXQgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwLmluZm8uZ2V0Q29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbiBzZXRzIHRoZSBnbG9iYWwgcHJveHkuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldEdsb2JhbFByb3h5KCkgeworICAgICAgICBmaW5hbCBpbnQgTiA9IG1BZG1pbkxpc3Quc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcC5zcGVjaWZpZXNHbG9iYWxQcm94eSkgeworICAgICAgICAgICAgICAgIHNhdmVHbG9iYWxQcm94eShhcC5nbG9iYWxQcm94eVNwZWMsIGFwLmdsb2JhbFByb3h5RXhjbHVzaW9uTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE5vIGRldmljZSBhZG1pbnMgZGVmaW5pbmcgZ2xvYmFsIHByb3hpZXMgLSByZXNldCBnbG9iYWwgcHJveHkgc2V0dGluZ3MgdG8gbm9uZQorICAgICAgICBzYXZlR2xvYmFsUHJveHkobnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVHbG9iYWxQcm94eShTdHJpbmcgcHJveHlTcGVjLCBTdHJpbmcgZXhjbHVzaW9uTGlzdCkgeworICAgICAgICBpZiAoZXhjbHVzaW9uTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5U3BlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm94eVNwZWMgPSAiIjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgd2hpdGUgc3BhY2VzCisgICAgICAgIHByb3h5U3BlYyA9IHByb3h5U3BlYy50cmltKCk7CisgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBleGNsdXNpb25MaXN0LnRyaW0oKTsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIHJlcyA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKHJlcywgU2V0dGluZ3MuU2VjdXJlLkhUVFBfUFJPWFksIHByb3h5U3BlYyk7CisgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRTdHJpbmcocmVzLCBTZXR0aW5ncy5TZWN1cmUuSFRUUF9QUk9YWV9FWENMVVNJT05fTElTVCwgZXhjbHVzaW9uTGlzdCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgaWYgKG1Db250ZXh0LmNoZWNrQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApCkBAIC05ODMsMTIgKzE1NjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiLCB1aWQ9IiArIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIGZpbmFsIFByaW50ZXIgcCA9IG5ldyBQcmludFdyaXRlclByaW50ZXIocHcpOwotICAgICAgICAKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHAucHJpbnRsbigiQ3VycmVudCBEZXZpY2UgUG9saWN5IE1hbmFnZXIgc3RhdGU6Iik7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcC5wcmludGxuKCIgIEVuYWJsZWQgRGV2aWNlIEFkbWluczoiKTsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUFkbWluTGlzdC5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CkBAIC05OTksMTEgKzE1ODAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYXAuZHVtcCgiICAgICIsIHB3KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHcucHJpbnRsbigiICIpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkUXVhbGl0eT0weCIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcobUFjdGl2ZVBhc3N3b3JkUXVhbGl0eSkpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGVuZ3RoPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZExlbmd0aCk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRVcHBlckNhc2U9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkVXBwZXJDYXNlKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZExvd2VyQ2FzZT0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMb3dlckNhc2UpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTGV0dGVycz0iKTsgcHcucHJpbnRsbihtQWN0aXZlUGFzc3dvcmRMZXR0ZXJzKTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIG1BY3RpdmVQYXNzd29yZE51bWVyaWM9Iik7IHB3LnByaW50bG4obUFjdGl2ZVBhc3N3b3JkTnVtZXJpYyk7CisgICAgICAgICAgICBwdy5wcmludCgiICBtQWN0aXZlUGFzc3dvcmRTeW1ib2xzPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZFN5bWJvbHMpOworICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFjdGl2ZVBhc3N3b3JkTm9uTGV0dGVyPSIpOyBwdy5wcmludGxuKG1BY3RpdmVQYXNzd29yZE5vbkxldHRlcik7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cz0iKTsgcHcucHJpbnRsbihtRmFpbGVkUGFzc3dvcmRBdHRlbXB0cyk7CiAgICAgICAgICAgICBwdy5wcmludCgiICBtUGFzc3dvcmRPd25lcj0iKTsgcHcucHJpbnRsbihtUGFzc3dvcmRPd25lcik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0xvY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBhMzg5NzBmLi5hMzQzYzU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Mb2NhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTG9jYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00NjUsMTAgKzQ2NSwxMSBAQAogICAgICAgICBtRW5hYmxlZFByb3ZpZGVycy5hZGQocGFzc2l2ZVByb3ZpZGVyLmdldE5hbWUoKSk7CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBleHRlcm5hbCBuZXR3b3JrIGxvY2F0aW9uIGFuZCBnZW9jb2RlciBzZXJ2aWNlcworICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IG1Db250ZXh0LiBnZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlc291cmNlcy5nZXRTdHJpbmcoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuY29uZmlnX25ldHdvcmtMb2NhdGlvblByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1OZXR3b3JrTG9jYXRpb25Qcm92aWRlciA9CiAgICAgICAgICAgICAgICAgbmV3IExvY2F0aW9uUHJvdmlkZXJQcm94eShtQ29udGV4dCwgTG9jYXRpb25NYW5hZ2VyLk5FVFdPUktfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwgbUxvY2F0aW9uSGFuZGxlcik7CkBAIC00NzYsNyArNDc3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNlcnZpY2VOYW1lID0gcmVzb3VyY2VzLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfZ2VvY29kZVByb3ZpZGVyKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG0ucmVzb2x2ZVNlcnZpY2UobmV3IEludGVudChzZXJ2aWNlTmFtZSksIDApICE9IG51bGwpIHsKICAgICAgICAgICAgIG1HZW9jb2RlUHJvdmlkZXIgPSBuZXcgR2VvY29kZXJQcm94eShtQ29udGV4dCwgc2VydmljZU5hbWUpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKaW5kZXggZjgzMTE5Zi4uYzA3MDA3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTW91bnRTZXJ2aWNlLmphdmEKQEAgLTEzNyw2ICsxMzcsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQm9vdGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VuZFVtc0Nvbm5lY3RlZE9uQm9vdCA9IGZhbHNlOworICAgIC8vIHRydWUgaWYgd2Ugc2hvdWxkIGZha2UgTUVESUFfTU9VTlRFRCBzdGF0ZSBmb3IgZXh0ZXJuYWwgc3RvcmFnZQorICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogUHJpdmF0ZSBoYXNoIG9mIGN1cnJlbnRseSBtb3VudGVkIHNlY3VyZSBjb250YWluZXJzLgpAQCAtMzk3LDcgKzM5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gZ2V0Vm9sdW1lU3RhdGUocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZXF1YWxzKEVudmlyb25tZW50Lk1FRElBX1VOTU9VTlRFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5Vm9sdW1lU3RhdGVDaGFuZ2UobnVsbCwgcGF0aCwgVm9sdW1lU3RhdGUuTm9NZWRpYSwgVm9sdW1lU3RhdGUuTW91bnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoRW52aXJvbm1lbnQuTUVESUFfVU5NT1VOVEVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmMgPSBkb01vdW50Vm9sdW1lKHBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJCb290LXRpbWUgbW91bnQgZmFpbGVkICglZCkiLCByYykpOwpAQCAtNDY4LDExICs0NzIsMTMgQEAKICAgICAgICAgICAgIFNsb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBzdGF0ZSB0cmFuc2l0aW9uICglcyAtPiAlcykiLCBtTGVnYWN5U3RhdGUsIHN0YXRlKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHN0YXRlIG9uIFBhY2thZ2VNYW5hZ2VyCi0gICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgewotICAgICAgICAgICAgbVBtcy51cGRhdGVFeHRlcm5hbE1lZGlhU3RhdHVzKGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRC5lcXVhbHMoc3RhdGUpKSB7Ci0gICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUgb24gUGFja2FnZU1hbmFnZXIsIGJ1dCBvbmx5IG9mIHJlYWwgZXZlbnRzCisgICAgICAgIGlmICghbUVtdWxhdGVFeHRlcm5hbFN0b3JhZ2UpIHsKKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5URUQuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIG1QbXMudXBkYXRlRXh0ZXJuYWxNZWRpYVN0YXR1cyhmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtUG1zLnVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXModHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBvbGRTdGF0ZSA9IG1MZWdhY3lTdGF0ZTsKICAgICAgICAgbUxlZ2FjeVN0YXRlID0gc3RhdGU7CkBAIC05NzIsNiArOTc4LDEzIEBACiAgICAgcHVibGljIE1vdW50U2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogCisgICAgICAgIG1FbXVsYXRlRXh0ZXJuYWxTdG9yYWdlID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZW11bGF0ZUV4dGVybmFsU3RvcmFnZSk7CisgICAgICAgIGlmIChtRW11bGF0ZUV4dGVybmFsU3RvcmFnZSkgeworICAgICAgICAgICAgU2xvZy5kKFRBRywgInVzaW5nIGVtdWxhdGVkIGV4dGVybmFsIHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIG1MZWdhY3lTdGF0ZSA9IEVudmlyb25tZW50Lk1FRElBX01PVU5URUQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBYWFg6IFRoaXMgd2lsbCBnbyBhd2F5IHNvb24gaW4gZmF2b3Igb2YgSU1vdW50U2VydmljZU9ic2VydmVyCiAgICAgICAgIG1QbXMgPSAoUGFja2FnZU1hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKCJwYWNrYWdlIik7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggZjNjYjliNy4uMDNmOGRhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTEzMiwxMSArMTMyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaGFuZGxpbmcgJyVzJyIsIGV2ZW50KSwgZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNwb25zZVF1ZXVlLnB1dChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBwdXQgcmVzcG9uc2Ugb250byBxdWV1ZSIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3BvbnNlUXVldWUucHV0KGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gcHV0IHJlc3BvbnNlIG9udG8gcXVldWUiLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQmFkIG1zZyAoJXMpIiwgZXZlbnQpKTsKQEAgLTIxNiw2ICsyMTcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PFN0cmluZz4gZG9Db21tYW5kKFN0cmluZyBjbWQpCiAgICAgICAgICAgICB0aHJvd3MgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uICB7CisgICAgICAgIG1SZXNwb25zZVF1ZXVlLmNsZWFyKCk7CiAgICAgICAgIHNlbmRDb21tYW5kKGNtZCk7CiAKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggNGE2OWYyMC4uZGU0NTlhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIwNSwxMCArMjA1LDEwIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworICAgICAgICAgICAgaW50IGEgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSA8PCAyNDsKKyAgICAgICAgICAgIGludCBiID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1sxXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgYyA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pIDw8ICA4OworICAgICAgICAgICAgaW50IGQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSAgICAgIDsKIAogICAgICAgICAgICAgcmV0dXJuIGEgfCBiIHwgYyB8IGQ7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNTE4Y2ZkOS4uNWFmYWJiZCAxMDA3NTUKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC02MSw2ICs2MSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMjg1LDYgKzI4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24uRkxBR19GT1JFR1JPVU5EX1NFUlZJQ0UpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwa2csIHRhZywgaWQsIDAsIDApOyAvLyBtYXliZSBhZGQgc29tZSBmbGFncz8KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobU5vdGlmaWNhdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICAvLyBzb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUGFja2FnZU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA2ODViZWU0Li44NmVhMGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtOTQyMiw3ICs5NDIyLDggQEAKICAgICAqIFVwZGF0ZSBtZWRpYSBzdGF0dXMgb24gUGFja2FnZU1hbmFnZXIuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4dGVybmFsTWVkaWFTdGF0dXMoZmluYWwgYm9vbGVhbiBtZWRpYVN0YXR1cywgZmluYWwgYm9vbGVhbiByZXBvcnRTdGF0dXMpIHsKLSAgICAgICBpZiAoQmluZGVyLmdldENhbGxpbmdVaWQoKSAhPSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICBpbnQgY2FsbGluZ1VpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgaWYgKGNhbGxpbmdVaWQgIT0gMCAmJiBjYWxsaW5nVWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIk1lZGlhIHN0YXR1cyBjYW4gb25seSBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW0iKTsKICAgICAgICB9CiAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAxNmYzZjEwLi4yZTMyZTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNDU2LDcgKzI0NTYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUtleWxpZ2h0RGVsYXkgPSBMT05HX0tFWUxJR0hUX0RFTEFZOwogICAgICAgICAgICAgaWYgKHRvdGFsRGVsYXkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVNjcmVlbk9mZkRlbGF5ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHN0YXkgb24gYXMgbG9uZyBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmRGVsYXkgPSBtTWF4aW11bVNjcmVlbk9mZlRpbWVvdXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1LZXlsaWdodERlbGF5IDwgdG90YWxEZWxheSkgewogICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0IHRoZSB0aW1lIHRoYXQgdGhlIGtleWxpZ2h0IGRlbGF5LiBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUKICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgb2YgdGhlIHRpbWUgdGhhdCB3ZSBuZWVkIHRvIHNsZWVwIHRvIGdldCB0aGUgYWNjdXJhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWY3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TYW1wbGluZ1Byb2ZpbGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQub3MuRHJvcEJveE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5TYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZSBleHRlbmRzIEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR1YgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVF9ESVIgPSBTYW1wbGluZ1Byb2ZpbGVySW50ZWdyYXRpb24uU05BUFNIT1RfRElSOworCisgICAgcHJpdmF0ZSBGaWxlT2JzZXJ2ZXIgc25hcHNob3RPYnNlcnZlcjsKKworICAgIHB1YmxpYyBTYW1wbGluZ1Byb2ZpbGVyU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmVnaXN0ZXJTZXR0aW5nT2JzZXJ2ZXIoY29udGV4dCk7CisgICAgICAgIHN0YXJ0V29ya2luZyhjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRXb3JraW5nKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgInN0YXJ0aW5nIFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlISIpOworCisgICAgICAgIGZpbmFsIERyb3BCb3hNYW5hZ2VyIGRyb3Bib3ggPQorICAgICAgICAgICAgICAgIChEcm9wQm94TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRFJPUEJPWF9TRVJWSUNFKTsKKworICAgICAgICAvLyBiZWZvcmUgRmlsZU9ic2VydmVyIGlzIHJlYWR5LCB0aGVyZSBjb3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzb21lIHNuYXBzaG90cworICAgICAgICAvLyBpbiB0aGUgZGlyZWN0b3J5LCB3ZSBkb24ndCB3YW50IHRvIG1pc3MgdGhlbQorICAgICAgICBGaWxlW10gc25hcHNob3RGaWxlcyA9IG5ldyBGaWxlKFNOQVBTSE9UX0RJUikubGlzdEZpbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBzbmFwc2hvdEZpbGVzICE9IG51bGwgJiYgaSA8IHNuYXBzaG90RmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGhhbmRsZVNuYXBzaG90RmlsZShzbmFwc2hvdEZpbGVzW2ldLCBkcm9wYm94KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVjdCBuZXcgc25hcHNob3QgYW5kIHB1dCBpdCBpbiBkcm9wYm94CisgICAgICAgIC8vIGRlbGV0ZSBpdCBhZnRlcndhcmRzIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIGJlZm9yZQorICAgICAgICAvLyBOb3RlOiBuZWVkcyBsaXN0ZW5pbmcgYXQgZXZlbnQgQVRUUklCIHJhdGhlciB0aGFuIENMT1NFX1dSSVRFLCBiZWNhdXNlIHdlIHNldCB0aGUKKyAgICAgICAgLy8gcmVhZGFiaWxpdHkgb2Ygc25hcHNob3QgZmlsZXMgYWZ0ZXIgd3JpdGluZyB0aGVtIQorICAgICAgICBzbmFwc2hvdE9ic2VydmVyID0gbmV3IEZpbGVPYnNlcnZlcihTTkFQU0hPVF9ESVIsIEZpbGVPYnNlcnZlci5BVFRSSUIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChpbnQgZXZlbnQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlU25hcHNob3RGaWxlKG5ldyBGaWxlKFNOQVBTSE9UX0RJUiwgcGF0aCksIGRyb3Bib3gpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzbmFwc2hvdE9ic2VydmVyLnN0YXJ0V2F0Y2hpbmcoKTsKKworICAgICAgICBpZiAoTE9DQUxfTE9HVikgU2xvZy52KFRBRywgIlNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlIGFjdGl2YXRlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTbmFwc2hvdEZpbGUoRmlsZSBmaWxlLCBEcm9wQm94TWFuYWdlciBkcm9wYm94KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkcm9wYm94LmFkZEZpbGUoVEFHLCBmaWxlLCAwKTsKKyAgICAgICAgICAgIGlmIChMT0NBTF9MT0dWKSBTbG9nLnYoVEFHLCBmaWxlLmdldFBhdGgoKSArICIgYWRkZWQgdG8gZHJvcGJveCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ2FuJ3QgYWRkICIgKyBmaWxlLmdldFBhdGgoKSArICIgdG8gZHJvcGJveCIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNldHRpbmdPYnNlcnZlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiksCisgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBTYW1wbGluZ1Byb2ZpbGVyU2V0dGluZ3NPYnNlcnZlcihjb250ZW50UmVzb2x2ZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBwdy5wcmludGxuKCJTYW1wbGluZ1Byb2ZpbGVyU2VydmljZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiV2F0Y2hpbmcgZGlyZWN0b3J5OiAiICsgU05BUFNIT1RfRElSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgcHVibGljIFNhbXBsaW5nUHJvZmlsZXJTZXR0aW5nc09ic2VydmVyKENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRlbnRSZXNvbHZlcjsKKyAgICAgICAgICAgIG9uQ2hhbmdlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHNhbXBsaW5nUHJvZmlsZXJIeiA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5TQU1QTElOR19QUk9GSUxFUl9IWiwgMCk7CisgICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBzYW1wbGluZyBwcm9maWxlciwKKyAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWRqdXN0IHRoZSBmcmVxdWVuY3kgb2YgdGFraW5nIHNuYXBzaG90cy4KKyAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy5wcm9maWxlcl9oeiIsIHNhbXBsaW5nUHJvZmlsZXJIei50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU2h1dGRvd25BY3Rpdml0eS5qYXZhCmluZGV4IDY0YjljNWQuLmM5ZDRkMDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1NodXRkb3duQWN0aXZpdHkuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TaHV0ZG93bkFjdGl2aXR5LmphdmEKQEAgLTI3LDE5ICsyNywyNiBAQAogcHVibGljIGNsYXNzIFNodXRkb3duQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNodXRkb3duQWN0aXZpdHkiOworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVib290OwogICAgIHByaXZhdGUgYm9vbGVhbiBtQ29uZmlybTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAotICAgICAgICBtQ29uZmlybSA9IGdldEludGVudCgpLmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtUmVib290ID0gSW50ZW50LkFDVElPTl9SRUJPT1QuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSk7CisgICAgICAgIG1Db25maXJtID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShJbnRlbnQuRVhUUkFfS0VZX0NPTkZJUk0sIGZhbHNlKTsKICAgICAgICAgU2xvZy5pKFRBRywgIm9uQ3JlYXRlKCk6IGNvbmZpcm09IiArIG1Db25maXJtKTsKIAogICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOwogICAgICAgICBoLnBvc3QobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnNodXRkb3duKFNodXRkb3duQWN0aXZpdHkudGhpcywgbUNvbmZpcm0pOworICAgICAgICAgICAgICAgIGlmIChtUmVib290KSB7CisgICAgICAgICAgICAgICAgICAgIFNodXRkb3duVGhyZWFkLnJlYm9vdChTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG51bGwsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTaHV0ZG93blRocmVhZC5zaHV0ZG93bihTaHV0ZG93bkFjdGl2aXR5LnRoaXMsIG1Db25maXJtKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDQxNzc0MzIuLmIxYmFlYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjgsNiArNjgsMTAgQEAKICAgICBBcnJheUxpc3Q8RGlzYWJsZVJlY29yZD4gbURpc2FibGVSZWNvcmRzID0gbmV3IEFycmF5TGlzdDxEaXNhYmxlUmVjb3JkPigpOwogICAgIGludCBtRGlzYWJsZWQgPSAwOwogCisgICAgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8vIFdlIHVzdWFsbHkgY2FsbCBpdCBsaWdodHMgb3V0IG1vZGUsIGJ1dCBkb3VibGUgbmVnYXRpdmVzIGFyZSBhbm5veWluZworICAgIGJvb2xlYW4gbUxpZ2h0c09uID0gdHJ1ZTsKKwogICAgIHByaXZhdGUgY2xhc3MgRGlzYWJsZVJlY29yZCBpbXBsZW1lbnRzIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgewogICAgICAgICBTdHJpbmcgcGtnOwogICAgICAgICBpbnQgd2hhdDsKQEAgLTg0LDYgKzg4LDcgQEAKICAgICAgICAgdm9pZCBvblNldERpc2FibGVkKGludCBzdGF0dXMpOwogICAgICAgICB2b2lkIG9uQ2xlYXJBbGwoKTsKICAgICAgICAgdm9pZCBvbk5vdGlmaWNhdGlvbkNsaWNrKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCk7CisgICAgICAgIHZvaWQgb25Ob3RpZmljYXRpb25DbGVhcihTdHJpbmcgcGtnLCBTdHJpbmcgdGFnLCBpbnQgaWQpOwogICAgICAgICB2b2lkIG9uUGFuZWxSZXZlYWxlZCgpOwogICAgICAgICB2b2lkIG9uTm90aWZpY2F0aW9uRXJyb3IoU3RyaW5nIHBrZywgU3RyaW5nIHRhZywgaW50IGlkLAogICAgICAgICAgICAgICAgIGludCB1aWQsIGludCBpbml0aWFsUGlkLCBTdHJpbmcgbWVzc2FnZSk7CkBAIC0yNDEsNiArMjQ2LDU2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgdmVyc2lvbiBvZiBsaWdodHMtb3V0IG1vZGUuICBPbmx5IGNhbGwgdGhpcyBmcm9tCisgICAgICogdGhlIHdpbmRvdyBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHNlZSBzZXRMaWdodHNPbihib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVdpbmRvd0lzRnVsbHNjcmVlbihib29sZWFuIGZ1bGxzY3JlZW4pIHsKKyAgICAgICAgLy8gV2UgY291bGQgZ2V0IGF3YXkgd2l0aCBhIHNlcGFyYXRlIHBlcm1pc3Npb24gaGVyZSwgYnV0IFNUQVRVU19CQVIgaXMKKyAgICAgICAgLy8gc2lnbmF0dXJlT3JTeXN0ZW0gd2hpY2ggaXMgcHJvYmFibHkgZ29vZCBlbm91Z2guICBUaGVyZSBpcyBubyBwdWJsaWMgQVBJCisgICAgICAgIC8vIGZvciB0aGlzLCBzbyB0aGUgcXVlc3Rpb24gaXMgYSBzZWN1cml0eSBpc3N1ZSwgbm90IGFuIEFQSSBjb21wYXRpYmlsaXR5IGlzc3VlLgorICAgICAgICBlbmZvcmNlU3RhdHVzQmFyKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQoIWZ1bGxzY3JlZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdXNlci1jb250cm9sbGVkIHZlcnNpb24gb2YgbGlnaHRzLW91dCBtb2RlLiAgT25seSBjYWxsIHRoaXMgZnJvbQorICAgICAqIHRoZSBzdGF0dXMgYmFyIGl0c2VsZi4KKyAgICAgKgorICAgICAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSBJIHRoaW5rIHdlJ3JlIGdvaW5nIHRvIHdhbnQgdG8KKyAgICAgKiB0d2VhayB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgdXNlciBrZWVwcyB0dXJuaW5nIGxpZ2h0cy1vdXQgbW9kZSBvZmYgYW5kIHRoZQorICAgICAqIGFwcCBrZWVwcyB0cnlpbmcgdG8gdHVybiBpdCBvbi4gIEZvciBub3cgdGhleSBjYW4ganVzdCBmaWdodCBpdCBvdXQuICBIYXZpbmcKKyAgICAgKiB0aGVzZSB0d28gc2VwYXJ0ZSBpbnB1dHMgd2lsbCBhbGxvdyB1cyB0byBrZWVwIHRoYXQgY2hhbmdlIGxvY2FsIHRvIGhlcmUuICAtLWpvZW8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIGxpZ2h0c09uKSB7CisgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgdXBkYXRlTGlnaHRzT25Mb2NrZWQobGlnaHRzT24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpZ2h0c09uTG9ja2VkKGZpbmFsIGJvb2xlYW4gbGlnaHRzT24pIHsKKyAgICAgICAgaWYgKG1MaWdodHNPbiAhPSBsaWdodHNPbikgeworICAgICAgICAgICAgbUxpZ2h0c09uID0gbGlnaHRzT247CisgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXIuc2V0TGlnaHRzT24obGlnaHRzT24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTdGF0dXNCYXIoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1RBVFVTX0JBUiwKICAgICAgICAgICAgICAgICAiU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UiKTsKQEAgLTI2MSw3ICszMTYsOCBAQAogICAgIC8vIENhbGxiYWNrcyBmcm9tIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuCiAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclN0YXR1c0JhcihJU3RhdHVzQmFyIGJhciwgU3RhdHVzQmFySWNvbkxpc3QgaWNvbkxpc3QsCi0gICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zKSB7CisgICAgICAgICAgICBMaXN0PElCaW5kZXI+IG5vdGlmaWNhdGlvbktleXMsIExpc3Q8U3RhdHVzQmFyTm90aWZpY2F0aW9uPiBub3RpZmljYXRpb25zLAorICAgICAgICAgICAgYm9vbGVhbiBsaWdodHNPbltdKSB7CiAgICAgICAgIGVuZm9yY2VTdGF0dXNCYXJTZXJ2aWNlKCk7CiAKICAgICAgICAgU2xvZy5pKFRBRywgInJlZ2lzdGVyU3RhdHVzQmFyIGJhcj0iICsgYmFyKTsKQEAgLTI3NSw2ICszMzEsOSBAQAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuYWRkKGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbGlnaHRzT25bMF0gPSBtTGlnaHRzT247CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwMiw2ICszNjEsMTIgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbkNhbGxiYWNrcy5vbk5vdGlmaWNhdGlvbkVycm9yKHBrZywgdGFnLCBpZCwgdWlkLCBpbml0aWFsUGlkLCBtZXNzYWdlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBvbk5vdGlmaWNhdGlvbkNsZWFyKFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgeworICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOworCisgICAgICAgIG1Ob3RpZmljYXRpb25DYWxsYmFja3Mub25Ob3RpZmljYXRpb25DbGVhcihwa2csIHRhZywgaWQpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQ2xlYXJBbGxOb3RpZmljYXRpb25zKCkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyU2VydmljZSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDRhOWM5ZTkuLjNhYmFjMGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0yNCwyNiArMjQsMjggQEAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlZNUnVudGltZTsKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLio7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aEEyZHBTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLkJsdWV0b290aFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5zZXJ2ZXIuc2VhcmNoLlNlYXJjaE1hbmFnZXJTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnRNYW5hZ2VyU2VydmljZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXI7CkBAIC01MSwxMSArNTMsOCBAQAogCiBjbGFzcyBTZXJ2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIElOQ0xVREVfREVNTyA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR19CT09UX1BST0dSRVNTX1NZU1RFTV9SVU4gPSAzMDEwOwotCi0gICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKKyAgICBDb250ZW50UmVzb2x2ZXIgbUNvbnRlbnRSZXNvbHZlcjsKIAogICAgIHByaXZhdGUgY2xhc3MgQWRiU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgIHB1YmxpYyBBZGJTZXR0aW5nc09ic2VydmVyKCkgewpAQCAtMjEwLDYgKzIwOSw3IEBACiAgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlIG5vdGlmaWNhdGlvbiA9IG51bGw7CiAgICAgICAgIFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlIHdhbGxwYXBlciA9IG51bGw7CiAgICAgICAgIExvY2F0aW9uTWFuYWdlclNlcnZpY2UgbG9jYXRpb24gPSBudWxsOworICAgICAgICBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIGNvdW50cnlEZXRlY3RvciA9IG51bGw7CiAKICAgICAgICAgaWYgKGZhY3RvcnlUZXN0ICE9IFN5c3RlbVNlcnZlci5GQUNUT1JZX1RFU1RfTE9XX0xFVkVMKSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzIwLDYgKzMyMCwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDb3VudHJ5IERldGVjdG9yIik7CisgICAgICAgICAgICAgICAgY291bnRyeURldGVjdG9yID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2UoY29udGV4dCk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkNPVU5UUllfREVURUNUT1IsIGNvdW50cnlEZXRlY3Rvcik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIENvdW50cnkgRGV0ZWN0b3IiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2VhcmNoIFNlcnZpY2UiKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuU0VBUkNIX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VhcmNoTWFuYWdlclNlcnZpY2UoY29udGV4dCkpOwpAQCAtMzI3LDExICszMzUsNiBAQAogICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsdXJlIHN0YXJ0aW5nIFNlYXJjaCBTZXJ2aWNlIiwgZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChJTkNMVURFX0RFTU8pIHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5zdGFsbGluZyBkZW1vIGRhdGEuLi4iKTsKLSAgICAgICAgICAgICAgICAobmV3IERlbW9UaHJlYWQoY29udGV4dCkpLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkRyb3BCb3ggU2VydmljZSIpOwogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5EUk9QQk9YX1NFUlZJQ0UsCkBAIC00MTgsNiArNDIxLDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgdGhpcyBzZXJ2aWNlIGV2ZW4gaWYgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLmlzRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgLy8gaXMgZmFsc2UsIGJlY2F1c2UgaXQgaXMgdGhpcyBzZXJ2aWNlIHRoYXQgZGV0ZWN0cyBzeXN0ZW0gcHJvcGVydHkgY2hhbmdlIGFuZAorICAgICAgICAgICAgICAgIC8vIHR1cm5zIG9uIFNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbi4gUGx1cywgd2hlbiBzYW1wbGluZyBwcm9maWxlciBkb2Vzbid0IHdvcmssCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbGl0dGxlIG92ZXJoZWFkIGZvciBydW5uaW5nIHRoaXMgc2VydmljZS4KKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZSgic2FtcGxpbmdwcm9maWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNhbXBsaW5nUHJvZmlsZXJTZXJ2aWNlKGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgU2FtcGxpbmdQcm9maWxlciBTZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU2lwU2VydmljZSBzaXBTZXJ2aWNlID0gU2lwU2VydmljZS5jcmVhdGUoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgaWYgKHNpcFNlcnZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2lwIFNlcnZpY2UiKTsKQEAgLTQ4Niw2ICs1MDEsNyBAQAogICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlIGltbUYgPSBpbW07CiAgICAgICAgIGZpbmFsIFJlY29nbml0aW9uTWFuYWdlclNlcnZpY2UgcmVjb2duaXRpb25GID0gcmVjb2duaXRpb247CiAgICAgICAgIGZpbmFsIExvY2F0aW9uTWFuYWdlclNlcnZpY2UgbG9jYXRpb25GID0gbG9jYXRpb247CisgICAgICAgIGZpbmFsIENvdW50cnlEZXRlY3RvclNlcnZpY2UgY291bnRyeURldGVjdG9yRiA9IGNvdW50cnlEZXRlY3RvcjsKIAogICAgICAgICAvLyBXZSBub3cgdGVsbCB0aGUgYWN0aXZpdHkgbWFuYWdlciBpdCBpcyBva2F5IHRvIHJ1biB0aGlyZCBwYXJ0eQogICAgICAgICAvLyBjb2RlLiAgSXQgd2lsbCBjYWxsIGJhY2sgaW50byB1cyBvbmNlIGl0IGhhcyBnb3R0ZW4gdG8gdGhlIHN0YXRlCkBAIC01MTMsNiArNTI5LDcgQEAKICAgICAgICAgICAgICAgICBpZiAod2FsbHBhcGVyRiAhPSBudWxsKSB3YWxscGFwZXJGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICAgICAgaWYgKGltbUYgIT0gbnVsbCkgaW1tRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbkYgIT0gbnVsbCkgbG9jYXRpb25GLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEZXRlY3RvckYgIT0gbnVsbCkgY291bnRyeURldGVjdG9yRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsZUYgIT0gbnVsbCkgdGhyb3R0bGVGLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwpAQCAtNTMzLDM3ICs1NTAsNyBAQAogICAgIH0KIH0KIAotY2xhc3MgRGVtb1RocmVhZCBleHRlbmRzIFRocmVhZAotewotICAgIERlbW9UaHJlYWQoQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ3Vyc29yIGMgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5xdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNEYXRhID0gYyAhPSBudWxsICYmIGMubW92ZVRvRmlyc3QoKTsKLSAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjLmRlYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzRGF0YSkgewotICAgICAgICAgICAgICAgIERlbW9EYXRhU2V0IGRhdGFzZXQgPSBuZXcgRGVtb0RhdGFTZXQoKTsKLSAgICAgICAgICAgICAgICBkYXRhc2V0LmFkZChtQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoIlN5c3RlbVNlcnZlciIsICJGYWlsdXJlIGluc3RhbGxpbmcgZGVtbyBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIENvbnRleHQgbUNvbnRleHQ7Ci19Ci0KLXB1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIKLXsKK3B1YmxpYyBjbGFzcyBTeXN0ZW1TZXJ2ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtU2VydmVyIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZBQ1RPUllfVEVTVF9PRkYgPSAwOwpAQCAtNTg3LDcgKzU3NCw3IEBACiAgICAgICAgICAgICB0aW1lci5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uLndyaXRlU25hcHNob3QoInN5c3RlbV9zZXJ2ZXIiLCBudWxsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBTTkFQU0hPVF9JTlRFUlZBTCwgU05BUFNIT1RfSU5URVJWQUwpOwogICAgICAgICB9CkBAIC01OTUsNyArNTgyLDcgQEAKICAgICAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2ZXIgaGFzIHRvIHJ1biBhbGwgb2YgdGhlIHRpbWUsIHNvIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIC8vIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3aXRoIGl0cyBtZW1vcnkgdXNhZ2UuCiAgICAgICAgIFZNUnVudGltZS5nZXRSdW50aW1lKCkuc2V0VGFyZ2V0SGVhcFV0aWxpemF0aW9uKDAuOGYpOwotICAgICAgICAKKwogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImFuZHJvaWRfc2VydmVycyIpOwogICAgICAgICBpbml0MShhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGVsZXBob255UmVnaXN0cnkuamF2YQppbmRleCA3ZTIzNDIyLi4wYTkwYTRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UZWxlcGhvbnlSZWdpc3RyeS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1RlbGVwaG9ueVJlZ2lzdHJ5LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueVJlZ2lzdHJ5OwpAQCAtODksOSArOTAsOSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uQXBuID0gIiI7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1EYXRhQ29ubmVjdGlvbkFwblR5cGVzID0gbnVsbDsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db25uZWN0ZWRBcG5zOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSA9ICIiOworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbURhdGFDb25uZWN0aW9uUHJvcGVydGllczsKIAogICAgIHByaXZhdGUgQnVuZGxlIG1DZWxsTG9jYXRpb24gPSBuZXcgQnVuZGxlKCk7CiAKQEAgLTEyMSw2ICsxMjIsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUJhdHRlcnlTdGF0cyA9IEJhdHRlcnlTdGF0c1NlcnZpY2UuZ2V0U2VydmljZSgpOworICAgICAgICBtQ29ubmVjdGVkQXBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGxpc3RlbihTdHJpbmcgcGtnRm9yRGVidWcsIElQaG9uZVN0YXRlTGlzdGVuZXIgY2FsbGJhY2ssIGludCBldmVudHMsCkBAIC0yMzMsMTkgKzIzNSwyMCBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5Q2FsbFN0YXRlKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtQ2FsbFN0YXRlID0gc3RhdGU7CiAgICAgICAgICAgICBtQ2FsbEluY29taW5nTnVtYmVyID0gaW5jb21pbmdOdW1iZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0NBTExfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25DYWxsU3RhdGVDaGFuZ2VkKHN0YXRlLCBpbmNvbWluZ051bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgICAgIGJyb2FkY2FzdENhbGxTdGF0ZUNoYW5nZWQoc3RhdGUsIGluY29taW5nTnVtYmVyKTsKICAgICB9CkBAIC0yNTYsOCArMjU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZFNlcnZpY2VTdGF0ZShyLCBzdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcwLDEwICsyNzIsMTAgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeVNpZ25hbFN0cmVuZ3RoKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtU2lnbmFsU3RyZW5ndGggPSBzaWduYWxTdHJlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fU0lHTkFMX1NUUkVOR1RIUykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kU2lnbmFsU3RyZW5ndGgociwgc2lnbmFsU3RyZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4MywxMCArMjg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uU2lnbmFsU3RyZW5ndGhDaGFuZ2VkKChnc21TaWduYWxTdHJlbmd0aCA9PSA5OSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NtU2lnbmFsU3RyZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICAgICAgYnJvYWRjYXN0U2lnbmFsU3RyZW5ndGhDaGFuZ2VkKHNpZ25hbFN0cmVuZ3RoKTsKICAgICB9CkBAIC0yOTUsMTggKzI5OCwxOSBAQAogICAgICAgICBpZiAoIWNoZWNrTm90aWZ5UGVybWlzc2lvbigibm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKCkiKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIEFycmF5TGlzdDxJQmluZGVyPiByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdDxJQmluZGVyPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SZWNvcmRzKSB7CiAgICAgICAgICAgICBtTWVzc2FnZVdhaXRpbmcgPSBtd2k7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJlY29yZHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX01FU1NBR0VfV0FJVElOR19JTkRJQ0FUT1IpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2sub25NZXNzYWdlV2FpdGluZ0luZGljYXRvckNoYW5nZWQobXdpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoci5iaW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdC5hZGQoci5iaW5kZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJQmluZGVyIGIgOiByZW1vdmVMaXN0KSByZW1vdmUoYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCwxOCArMzE4LDE5IEBACiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoKSIpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1DYWxsRm9yd2FyZGluZyA9IGNmaTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0FMTF9GT1JXQVJESU5HX0lORElDQVRPUikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkNhbGxGb3J3YXJkaW5nSW5kaWNhdG9yQ2hhbmdlZChjZmkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShyLmJpbmRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0LmFkZChyLmJpbmRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzMzLDU3ICszMzgsODEgQEAKICAgICAgICAgaWYgKCFjaGVja05vdGlmeVBlcm1pc3Npb24oIm5vdGlmeURhdGFBY3Rpdml0eSgpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQWN0aXZpdHkgPSBzdGF0ZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fREFUQV9BQ1RJVklUWSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFBY3Rpdml0eShzdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSUJpbmRlciBiIDogcmVtb3ZlTGlzdCkgcmVtb3ZlKGIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgU3RyaW5nIGFwblR5cGUsIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzLAorICAgICAgICAgICAgaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbigpIiApKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLkRBVEFfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkQXBucy5jb250YWlucyhhcG5UeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBucy5hZGQoYXBuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25TdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwbnMucmVtb3ZlKGFwblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uU3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIG1EYXRhQ29ubmVjdGlvblN0YXRlIGFzIGlzIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIG91dCB0aGUgbmV3IHN0YXR1cyBmb3IgdGhlIEFQTiBpbiBxdWVzdGlvbi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZSA9IGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uUmVhc29uID0gcmVhc29uOwogICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuID0gYXBuOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uQXBuVHlwZXMgPSBhcG5UeXBlczsKLSAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uTmV0d29ya1R5cGUgPSBuZXR3b3JrVHlwZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFjay5vbkRhdGFDb25uZWN0aW9uU3RhdGVDaGFuZ2VkKHN0YXRlLCBuZXR3b3JrVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKHIuYmluZGVyKTsKKyAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMgPSBsaW5rUHJvcGVydGllczsKKyAgICAgICAgICAgIGlmIChtRGF0YUNvbm5lY3Rpb25OZXR3b3JrVHlwZSAhPSBuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbk5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PElCaW5kZXI+IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PElCaW5kZXI+KCk7CisgICAgICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoci5ldmVudHMgJiBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGxiYWNrLm9uRGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoc3RhdGUsIG5ldHdvcmtUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3QuYWRkKHIuYmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKElCaW5kZXIgYiA6IHJlbW92ZUxpc3QpIHJlbW92ZShiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicm9hZGNhc3REYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChzdGF0ZSwgaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUsIHJlYXNvbiwgYXBuLAotICAgICAgICAgICAgICAgIGFwblR5cGVzLCBpbnRlcmZhY2VOYW1lLCBnYXRld2F5KTsKKyAgICAgICAgICAgICAgICBhcG5UeXBlLCBsaW5rUHJvcGVydGllcyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIGlmICghY2hlY2tOb3RpZnlQZXJtaXNzaW9uKCJub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZCgpIikpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGVyZSBpcyBvbiBvbkRhdGFDb25uZWN0aW9uRmFpbGVkIGNhbGxiYWNrCi0gICAgICAgICAqIG9uIFBob25lU3RhdGVMaXN0ZW5lci4gVGhlcmUgc2hvdWxkIGJlCisgICAgICAgICAqIFRoaXMgaXMgY29tbWVudGVkIG91dCBiZWNhdXNlIHRoZXJlIGlzIG5vIG9uRGF0YUNvbm5lY3Rpb25GYWlsZWQgY2FsbGJhY2sKKyAgICAgICAgICogaW4gUGhvbmVTdGF0ZUxpc3RlbmVyLiBUaGVyZSBzaG91bGQgYmUuCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJlY29yZHMpIHsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbkZhaWxlZFJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVJlY29yZHMuc2l6ZSgpOwpAQCAtMzk1LDcgKzQyNCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKi8KLSAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oQnVuZGxlIGNlbGxMb2NhdGlvbikgewpAQCAtNDA0LDggKzQzMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChtUmVjb3JkcykgewogICAgICAgICAgICAgbUNlbGxMb2NhdGlvbiA9IGNlbGxMb2NhdGlvbjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUmVjb3Jkcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIFJlY29yZCByID0gbVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgZm9yIChSZWNvcmQgciA6IG1SZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyLmV2ZW50cyAmIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fQ0VMTF9MT0NBVElPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzZW5kQ2VsbExvY2F0aW9uKHIsIGNlbGxMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDcgKzQ0NCw3IEBACiAgICAgLyoqCiAgICAgICogQ29weSB0aGUgc2VydmljZSBzdGF0ZSBvYmplY3Qgc28gdGhleSBjYW4ndCBtZXNzIGl0IHVwIGluIHRoZSBsb2NhbCBjYWxscwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRTZXJ2aWNlU3RhdGUoUmVjb3JkIHIsIFNlcnZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kU2VydmljZVN0YXRlKFJlY29yZCByLCBTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHIuY2FsbGJhY2sub25TZXJ2aWNlU3RhdGVDaGFuZ2VkKG5ldyBTZXJ2aWNlU3RhdGUoc3RhdGUpKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CkBAIC00NjIsMTEgKzQ5MCwxMCBAQAogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25Qb3NzaWJsZT0iICsgbURhdGFDb25uZWN0aW9uUG9zc2libGUpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtRGF0YUNvbm5lY3Rpb25SZWFzb249IiArIG1EYXRhQ29ubmVjdGlvblJlYXNvbik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvbkFwbj0iICsgbURhdGFDb25uZWN0aW9uQXBuKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZT0iICsgbURhdGFDb25uZWN0aW9uSW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXM9IiArIG1EYXRhQ29ubmVjdGlvblByb3BlcnRpZXMpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiICBtQ2VsbExvY2F0aW9uPSIgKyBtQ2VsbExvY2F0aW9uKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oInJlZ2lzdHJhdGlvbnM6IGNvdW50PSIgKyByZWNvcmRDb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZWNvcmQgciA9IG1SZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIGZvciAoUmVjb3JkIHIgOiBtUmVjb3JkcykgewogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgIiArIHIucGtnRm9yRGVidWcgKyAiIDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoci5ldmVudHMpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3LDcgKzU2NCw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgYnJvYWRjYXN0RGF0YUNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoaW50IHN0YXRlLAogICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSwKLSAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZ1tdIGFwblR5cGVzLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIGdhdGV3YXkpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcykgewogICAgICAgICAvLyBOb3RlOiBub3QgcmVwb3J0aW5nIHRvIHRoZSBiYXR0ZXJ5IHN0YXRzIHNlcnZpY2UgaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgLy8gc3RhdHVzIGJhciB0YWtlcyBjYXJlIG9mIHRoYXQgYWZ0ZXIgdGFraW5nIGludG8gYWNjb3VudCBhbGwgb2YgdGhlCiAgICAgICAgIC8vIHJlcXVpcmVkIGluZm8uCkBAIC01NTAsMjkgKzU3NywyMyBAQAogICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5TVEFURV9DSEFOR0VfUkVBU09OX0tFWSwgcmVhc29uKTsKICAgICAgICAgfQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9BUE5fS0VZLCBhcG4pOwotICAgICAgICBTdHJpbmcgdHlwZXMgPSBuZXcgU3RyaW5nKCIiKTsKLSAgICAgICAgaWYgKGFwblR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHR5cGVzID0gYXBuVHlwZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFwblR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHlwZXMgPSB0eXBlcysiLCIrYXBuVHlwZXNbaV07CisgICAgICAgIGlmIChsaW5rUHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoUGhvbmUuREFUQV9MSU5LX1BST1BFUlRJRVNfS0VZLCBsaW5rUHJvcGVydGllcyk7CisgICAgICAgICAgICBOZXR3b3JrSW50ZXJmYWNlIGlmYWNlID0gbGlua1Byb3BlcnRpZXMuZ2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0lGQUNFX05BTUVfS0VZLCBpZmFjZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0FQTl9UWVBFU19LRVksIHR5cGVzKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfSUZBQ0VfTkFNRV9LRVksIGludGVyZmFjZU5hbWUpOwotICAgICAgICBpbnQgZ2F0ZXdheUFkZHIgPSAwOwotICAgICAgICBpZiAoZ2F0ZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnYXRld2F5QWRkciA9IE5ldHdvcmtVdGlscy52NFN0cmluZ1RvSW50KGdhdGV3YXkpOwotICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShQaG9uZS5EQVRBX0dBVEVXQVlfS0VZLCBnYXRld2F5QWRkcik7Ci0KKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX0tFWSwgYXBuKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBicm9hZGNhc3REYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKSB7CisgICAgcHJpdmF0ZSB2b2lkIGJyb2FkY2FzdERhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFRlbGVwaG9ueUludGVudHMuQUNUSU9OX0RBVEFfQ09OTkVDVElPTl9GQUlMRUQpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkZBSUxVUkVfUkVBU09OX0tFWSwgcmVhc29uKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBob25lLkRBVEFfQVBOX1RZUEVfS0VZLCBhcG5UeXBlKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQppbmRleCBhOTNhNmVlLi5kODQxY2IzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2UuamF2YQpAQCAtNjAsNiArNjAsOCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CkBAIC04Myw4ICs4NSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBURVNUSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsKIAogICAgIHByaXZhdGUgaW50IG1Qb2xpY3lQb2xsUGVyaW9kU2VjOwotICAgIHByaXZhdGUgbG9uZyBtUG9saWN5VGhyZXNob2xkOwotICAgIHByaXZhdGUgaW50IG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgIHByaXZhdGUgQXRvbWljTG9uZyBtUG9saWN5VGhyZXNob2xkOworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKICAgICBwcml2YXRlIGludCBtUG9saWN5UmVzZXREYXk7IC8vIDEtMjgKICAgICBwcml2YXRlIGludCBtUG9saWN5Tm90aWZpY2F0aW9uc0FsbG93ZWRNYXNrOwogCkBAIC0xMTQsNyArMTE2LDcgQEAKICAgICBwcml2YXRlIEludGVyZmFjZU9ic2VydmVyIG1JbnRlcmZhY2VPYnNlcnZlcjsKICAgICBwcml2YXRlIFNldHRpbmdzT2JzZXJ2ZXIgbVNldHRpbmdzT2JzZXJ2ZXI7CiAKLSAgICBwcml2YXRlIGludCBtVGhyb3R0bGVJbmRleDsgLy8gMCBmb3Igbm9uZSwgMSBmb3IgZmlyc3QgdGhyb3R0bGUgdmFsLCAyIGZvciBuZXh0LCBldGMKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbVRocm90dGxlSW5kZXg7IC8vIDAgZm9yIG5vbmUsIDEgZm9yIGZpcnN0IHRocm90dGxlIHZhbCwgMiBmb3IgbmV4dCwgZXRjCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQgPSAtMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQgICA9ICAwOwogCkBAIC0xMjYsNiArMTI4LDEwIEBACiAgICAgICAgIGlmIChWREJHKSBTbG9nLnYoVEFHLCAiU3RhcnRpbmcgVGhyb3R0bGVTZXJ2aWNlIik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKIAorICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBtVGhyb3R0bGVJbmRleCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKICAgICAgICAgbU50cEFjdGl2ZSA9IGZhbHNlOwogCiAgICAgICAgIG1JZmFjZSA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb25maWdfZGF0YXVzZV9pZmFjZSk7CkBAIC0yMTQsNyArMjIwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIGxvbmcgbnRwVG9XYWxsVGltZShsb25nIG50cFRpbWUpIHsKLSAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgbG9uZyBiZXN0Tm93ID0gZ2V0QmVzdFRpbWUodHJ1ZSk7IC8vIGRvIGl0IHF1aWNrbHkKICAgICAgICAgbG9uZyBsb2NhbE5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICByZXR1cm4gbG9jYWxOb3cgKyAobnRwVGltZSAtIGJlc3ROb3cpOwogICAgIH0KQEAgLTIyMiw0MCArMjI4LDQyIEBACiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCiAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0UmVzZXRUaW1lKFN0cmluZyBpZmFjZSkgeworICAgIHB1YmxpYyBsb25nIGdldFJlc2V0VGltZShTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgbG9uZyByZXNldFRpbWUgPSAwOwogICAgICAgICBpZiAobVJlY29yZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc2V0VGltZSA9IG50cFRvV2FsbFRpbWUobVJlY29yZGVyLmdldFBlcmlvZEVuZCgpKTsKKyAgICAgICAgICAgIHJlc2V0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RFbmQoKTsKICAgICAgICAgfQorICAgICAgICByZXNldFRpbWUgPSBudHBUb1dhbGxUaW1lKHJlc2V0VGltZSk7CiAgICAgICAgIHJldHVybiByZXNldFRpbWU7CiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKICAgICAvLyByZXR1cm4gdGltZSBpbiB0aGUgbG9jYWwsIHN5c3RlbSB3YWxsIHRpbWUsIGNvcnJlY3RpbmcgZm9yIHRoZSB1c2Ugb2YgbnRwCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFBlcmlvZFN0YXJ0VGltZShTdHJpbmcgaWZhY2UpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKKyAgICBwdWJsaWMgbG9uZyBnZXRQZXJpb2RTdGFydFRpbWUoU3RyaW5nIGlmYWNlKSB7CiAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gMDsKKyAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKG1SZWNvcmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdGFydFRpbWUgPSBudHBUb1dhbGxUaW1lKG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpKTsKKyAgICAgICAgICAgIHN0YXJ0VGltZSA9IG1SZWNvcmRlci5nZXRQZXJpb2RTdGFydCgpOwogICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZSA9IG50cFRvV2FsbFRpbWUoc3RhcnRUaW1lKTsKICAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKICAgICB9CiAgICAgLy9UT0RPIC0gYSBiZXR0ZXIgbmFtZT8gIGdldENsaWZmQnl0ZUNvdW50VGhyZXNob2xkPwogICAgIC8vIFRPRE8gLSBmZXRjaCBmb3IgdGhlIGlmYWNlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldENsaWZmVGhyZXNob2xkKFN0cmluZyBpZmFjZSwgaW50IGNsaWZmKSB7CisgICAgcHVibGljIGxvbmcgZ2V0Q2xpZmZUaHJlc2hvbGQoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyZXNob2xkOworICAgICAgICAgICByZXR1cm4gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLy8gVE9ETyAtIGEgYmV0dGVyIG5hbWU/IGdldFRocm90dGxlUmF0ZT8KICAgICAvLyBUT0RPIC0gZmV0Y2ggZm9yIHRoZSBpZmFjZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKKyAgICBwdWJsaWMgaW50IGdldENsaWZmTGV2ZWwoU3RyaW5nIGlmYWNlLCBpbnQgY2xpZmYpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGNsaWZmID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yNjcsMTAgKzI3NSw5IEBACiAgICAgfQogCiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0Qnl0ZUNvdW50KFN0cmluZyBpZmFjZSwgaW50IGRpciwgaW50IHBlcmlvZCwgaW50IGFnbykgeworICAgIHB1YmxpYyBsb25nIGdldEJ5dGVDb3VudChTdHJpbmcgaWZhY2UsIGludCBkaXIsIGludCBwZXJpb2QsIGludCBhZ28pIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKChwZXJpb2QgPT0gVGhyb3R0bGVNYW5hZ2VyLlBFUklPRF9DWUNMRSkgJiYKLSAgICAgICAgICAgICAgICAobVJlY29yZGVyICE9IG51bGwpKSB7CisgICAgICAgIGlmICgocGVyaW9kID09IFRocm90dGxlTWFuYWdlci5QRVJJT0RfQ1lDTEUpICYmIChtUmVjb3JkZXIgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGlmIChkaXIgPT0gVGhyb3R0bGVNYW5hZ2VyLkRJUkVDVElPTl9UWCkgcmV0dXJuIG1SZWNvcmRlci5nZXRQZXJpb2RUeChhZ28pOwogICAgICAgICAgICAgaWYgKGRpciA9PSBUaHJvdHRsZU1hbmFnZXIuRElSRUNUSU9OX1JYKSByZXR1cm4gbVJlY29yZGVyLmdldFBlcmlvZFJ4KGFnbyk7CiAgICAgICAgIH0KQEAgLTI3OSwxMCArMjg2LDEwIEBACiAKICAgICAvLyBUT0RPIC0gYSBiZXR0ZXIgbmFtZSAtIGdldEN1cnJlbnRUaHJvdHRsZVJhdGU/CiAgICAgLy8gVE9ETyAtIGZldGNoIGZvciB0aGUgaWZhY2UKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUaHJvdHRsZShTdHJpbmcgaWZhY2UpIHsKKyAgICBwdWJsaWMgaW50IGdldFRocm90dGxlKFN0cmluZyBpZmFjZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVRocm90dGxlSW5kZXggPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlOworICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTMwNSwyMiArMzEyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LCBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9SRVNFVCkpOwogCi0gICAgICAgIC8vIHVzZSBhIG5ldyB0aHJlYWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBzdGFsbCB0aGUgc3lzdGVtIGZvciBmaWxlIHdyaXRlcwotICAgICAgICBtVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoVEFHKTsKLSAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVRocmVhZC5nZXRMb29wZXIoKSk7Ci0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfUkVCT09UX1JFQ09WRVJZKS5zZW5kVG9UYXJnZXQoKTsKLQotICAgICAgICBtSW50ZXJmYWNlT2JzZXJ2ZXIgPSBuZXcgSW50ZXJmYWNlT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX0lGQUNFX1VQLCBtSWZhY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU5NU2VydmljZS5yZWdpc3Rlck9ic2VydmVyKG1JbnRlcmZhY2VPYnNlcnZlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTbG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIEludGVyZmFjZU9ic2VydmVyICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobUhhbmRsZXIsIEVWRU5UX1BPTElDWV9DSEFOR0VEKTsKLSAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIub2JzZXJ2ZShtQ29udGV4dCk7Ci0KICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtMzM3LDYgKzMyOCwyMiBAQAogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIGEgbmV3IHRocmVhZCBhcyB3ZSBkb24ndCB3YW50IHRvIHN0YWxsIHRoZSBzeXN0ZW0gZm9yIGZpbGUgd3JpdGVzCisgICAgICAgIG1UaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOworICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihtVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9SRUJPT1RfUkVDT1ZFUlkpLnNlbmRUb1RhcmdldCgpOworCisgICAgICAgIG1JbnRlcmZhY2VPYnNlcnZlciA9IG5ldyBJbnRlcmZhY2VPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfSUZBQ0VfVVAsIG1JZmFjZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTk1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobUludGVyZmFjZU9ic2VydmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcmVnaXN0ZXIgSW50ZXJmYWNlT2JzZXJ2ZXIgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgbVNldHRpbmdzT2JzZXJ2ZXIgPSBuZXcgU2V0dGluZ3NPYnNlcnZlcihtSGFuZGxlciwgRVZFTlRfUE9MSUNZX0NIQU5HRUQpOworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlci5vYnNlcnZlKG1Db250ZXh0KTsKICAgICB9CiAKIApAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgICAgICAgICAvLyBjaGVjayBmb3Igc2ltIGNoYW5nZSBUT0RPCiAgICAgICAgICAgICAvLyByZXJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gb2YgcG9saWN5IGNoYW5nZQogCi0gICAgICAgICAgICBtVGhyb3R0bGVJbmRleCA9IFRIUk9UVExFX0lOREVYX1VOSU5JVElBTElaRUQ7CisgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRCk7CiAKICAgICAgICAgICAgIG1SZWNvcmRlciA9IG5ldyBEYXRhUmVjb3JkZXIobUNvbnRleHQsIFRocm90dGxlU2VydmljZS50aGlzKTsKIApAQCAtNDAzLDE1ICs0MTAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3RocmVzaG9sZF9ieXRlcyk7CiAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICAgICAgUi5pbnRlZ2VyLmNvbmZpZ19kYXRhdXNlX3Rocm90dGxlX2tiaXRzcHMpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0TG9uZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9USFJFU0hPTERfQllURVMsIGRlZmF1bHRUaHJlc2hvbGQpOwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjID0gVEVTVElOR19QT0xMSU5HX1BFUklPRF9TRUM7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJlc2hvbGQgPSBURVNUSU5HX1RIUkVTSE9MRDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIHRocmVzaG9sZCA9IFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfVEhSRVNIT0xEX0JZVEVTLCBkZWZhdWx0VGhyZXNob2xkKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5USFJPVFRMRV9WQUxVRV9LQklUU1BTLCBkZWZhdWx0VmFsdWUpOworCisgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCh0aHJlc2hvbGQpOworICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuc2V0KHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0ZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgbVBvbGljeVBvbGxQZXJpb2RTZWMgPSBURVNUSU5HX1BPTExJTkdfUEVSSU9EX1NFQzsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldChURVNUSU5HX1RIUkVTSE9MRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Qb2xpY3lSZXNldERheSA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCkBAIC00MjMsMTAgKzQzMSw4IEBACiAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfUkVTRVRfREFZLCBtUG9saWN5UmVzZXREYXkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChUaHJvdHRsZVNlcnZpY2UudGhpcykgewotICAgICAgICAgICAgICAgIGlmIChtSWZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlmYWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyZXNob2xkLnNldCgwKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50IGRlZmF1bHROb3RpZmljYXRpb25UeXBlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKQEAgLTQzNywxNSArNDQzLDE2IEBACiAgICAgICAgICAgICBtTWF4TnRwQ2FjaGVBZ2VTZWMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVEhST1RUTEVfTUFYX05UUF9DQUNIRV9BR0VfU0VDLCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMpOwogCi0gICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZCAhPSAwKSkgeworICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQuZ2V0KCkgIT0gMCkpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAib25Qb2xpY3lDaGFuZ2VkIHRlc3Rpbmc9IiArIHRlc3RpbmcgKyIsIHBlcmlvZD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkICsgIiwgdmFsdWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKyAiLCBub3RlVHlwZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsgbU1heE50cENhY2hlQWdlU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lQb2xsUGVyaW9kU2VjICsgIiwgdGhyZXNob2xkPSIgKyBtUG9saWN5VGhyZXNob2xkLmdldCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIHZhbHVlPSIgKyBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICIsIHJlc2V0RGF5PSIgKyBtUG9saWN5UmVzZXREYXkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgbm90ZVR5cGU9IiArIG1Qb2xpY3lOb3RpZmljYXRpb25zQWxsb3dlZE1hc2sgKyAiLCBtYXhOdHBDYWNoZUFnZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZvcmNlIHVwZGF0ZXMKLSAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTklOSVRJQUxJWkVEKTsKIAogICAgICAgICAgICAgb25SZXNldEFsYXJtKCk7CiAKQEAgLTQ4Nyw3ICs0OTQsNyBAQAogICAgICAgICAgICAgbG9uZyBwZXJpb2RSeCA9IG1SZWNvcmRlci5nZXRQZXJpb2RSeCgwKTsKICAgICAgICAgICAgIGxvbmcgcGVyaW9kVHggPSBtUmVjb3JkZXIuZ2V0UGVyaW9kVHgoMCk7CiAgICAgICAgICAgICBsb25nIHRvdGFsID0gcGVyaW9kUnggKyBwZXJpb2RUeDsKLSAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkICE9IDApKSB7CisgICAgICAgICAgICBpZiAoVkRCRyB8fCAobVBvbGljeVRocmVzaG9sZC5nZXQoKSAhPSAwKSkgewogICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblBvbGxBbGFybSAtIHJvYW1pbmcgPSIgKyByb2FtaW5nICsKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHJlYWQgPSIgKyBpbmNSZWFkICsgIiwgd3JpdHRlbiA9IiArIGluY1dyaXRlICsgIiwgbmV3IHRvdGFsID0iICsgdG90YWwpOwogICAgICAgICAgICAgfQpAQCAtNTEwLDExICs1MTcsMTEgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uSWZhY2VVcCgpIHsKICAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdGhyb3R0bGVkIGJlZm9yZSwgYmUgc3VyZSBhbmQgc2V0IGl0IGFnYWluIC0gdGhlIGlmYWNlIHdlbnQgZG93bgogICAgICAgICAgICAgLy8gKGFuZCBtYXkgaGF2ZSBkaXNhcHBlYXJlZCBhbGwgdG9nZXRoZXIpIGFuZCB0aGVzZSBzZXR0aW5ncyB3ZXJlIGxvc3QKLSAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCA9PSAxKSB7CisgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1OTVNlcnZpY2Uuc2V0SW50ZXJmYWNlVGhyb3R0bGUobUlmYWNlLCAtMSwgLTEpOwogICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZSwgbVBvbGljeVRocm90dGxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpLCBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgImVycm9yIHNldHRpbmcgVGhyb3R0bGU6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjMsNyArNTMwLDggQEAKIAogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tUaHJvdHRsZUFuZFBvc3ROb3RpZmljYXRpb24obG9uZyBjdXJyZW50VG90YWwpIHsKICAgICAgICAgICAgIC8vIGlzIHRocm90dGxpbmcgZW5hYmxlZD8KLSAgICAgICAgICAgIGlmIChtUG9saWN5VGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgdGhyZXNob2xkID0gbVBvbGljeVRocmVzaG9sZC5nZXQoKTsKKyAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgewogICAgICAgICAgICAgICAgIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC01MzUsMTUgKzU0MywxMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gICAgICAgICAgICBpZiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVGhyb3R0bGVTZXJ2aWNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBTbG9nLmQoVEFHLCAiVGhyZXNob2xkICIgKyBtUG9saWN5VGhyZXNob2xkICsgIiBleGNlZWRlZCEiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VG90YWwgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXguZ2V0KCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtVGhyb3R0bGVJbmRleC5zZXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJUaHJlc2hvbGQgIiArIHRocmVzaG9sZCArICIgZXhjZWVkZWQhIik7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTk1TZXJ2aWNlLnNldEludGVyZmFjZVRocm90dGxlKG1JZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUsIG1Qb2xpY3lUaHJvdHRsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCksIG1Qb2xpY3lUaHJvdHRsZVZhbHVlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJlcnJvciBzZXR0aW5nIFRocm90dGxlOiAiICsgZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU1Niw3ICs1NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQpOwogCiAgICAgICAgICAgICAgICAgICAgIEludGVudCBicm9hZGNhc3QgPSBuZXcgSW50ZW50KFRocm90dGxlTWFuYWdlci5USFJPVFRMRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QucHV0RXh0cmEoVGhyb3R0bGVNYW5hZ2VyLkVYVFJBX1RIUk9UVExFX0xFVkVMLCBtUG9saWN5VGhyb3R0bGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyb2FkY2FzdC5wdXRFeHRyYShUaHJvdHRsZU1hbmFnZXIuRVhUUkFfVEhST1RUTEVfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeVRocm90dGxlVmFsdWUuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7CiAKICAgICAgICAgICAgICAgICB9IC8vIGVsc2UgYWxyZWFkeSB1cCEKQEAgLTU3OSw4ICs1ODYsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZExlbmd0aCA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgICAgICBsb25nIHRpbWVVc2VkID0gbm93IC0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgd2FybmluZ1RocmVzaG9sZCA9IDIqbVBvbGljeVRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gbVBvbGljeVRocmVzaG9sZC80KSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHdhcm5pbmdUaHJlc2hvbGQgPSAyKnRocmVzaG9sZCp0aW1lVXNlZC8odGltZVVzZWQrcGVyaW9kTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VG90YWwgPiB3YXJuaW5nVGhyZXNob2xkKSAmJiAoY3VycmVudFRvdGFsID4gdGhyZXNob2xkLzQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdhcm5pbmdOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5jYW5jZWwoUi5kcmF3YWJsZS5zdGF0X3N5c190aHJvdHRsZWQpOwpAQCAtNjI1LDExICs2MzIsOSBAQAogICAgICAgICB9CiAKIAotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyVGhyb3R0bGVBbmROb3RpZmljYXRpb24oKSB7Ci0gICAgICAgICAgICBpZiAobVRocm90dGxlSW5kZXggIT0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRocm90dGxlU2VydmljZS50aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4ID0gVEhST1RUTEVfSU5ERVhfVU5USFJPVFRMRUQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJUaHJvdHRsZUFuZE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChtVGhyb3R0bGVJbmRleC5nZXQoKSAhPSBUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCkgeworICAgICAgICAgICAgICAgIG1UaHJvdHRsZUluZGV4LnNldChUSFJPVFRMRV9JTkRFWF9VTlRIUk9UVExFRCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbU5NU2VydmljZS5zZXRJbnRlcmZhY2VUaHJvdHRsZShtSWZhY2UsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTY4NywxMiArNjkyLDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgb25SZXNldEFsYXJtKCkgewotICAgICAgICAgICAgaWYgKFZEQkcgfHwgKG1Qb2xpY3lUaHJlc2hvbGQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChWREJHIHx8IChtUG9saWN5VGhyZXNob2xkLmdldCgpICE9IDApKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIm9uUmVzZXRBbGFybSAtIGxhc3QgcGVyaW9kIGhhZCAiICsgbVJlY29yZGVyLmdldFBlcmlvZFJ4KDApICsKICAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgcmVhZCBhbmQgIiArIG1SZWNvcmRlci5nZXRQZXJpb2RUeCgwKSArICIgd3JpdHRlbiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKCk7CisgICAgICAgICAgICBsb25nIG5vdyA9IGdldEJlc3RUaW1lKGZhbHNlKTsKIAogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUgfHwgKG1OdHBTZXJ2ZXIgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICBDYWxlbmRhciBlbmQgPSBjYWxjdWxhdGVQZXJpb2RFbmQobm93KTsKQEAgLTcxOSwyMCArNzI0LDIzIEBACiAKICAgICAgICAgLy8gd2lsbCB0cnkgdG8gZ2V0IHRoZSBudHAgdGltZSBhbmQgc3dpdGNoIHRvIGl0IGlmIGZvdW5kLgogICAgICAgICAvLyB3aWxsIGFsc28gY2FjaGUgdGhlIHRpbWUgc28gd2UgZG9uJ3QgZmV0Y2ggaXQgcmVwZWF0ZWRseS4KLSAgICAgICAgZ2V0QmVzdFRpbWUoKTsKKyAgICAgICAgZ2V0QmVzdFRpbWUoZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlRQX0NBQ0hFX0FHRV9TRUMgPSA2MCAqIDYwICogMjQ7IC8vIDEgZGF5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVFBfRkVUQ0hfV0FJVCA9IDEwICogMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05UUF9GRVRDSF9XQUlUID0gMjAgKiAxMDAwOwogICAgIHByaXZhdGUgaW50IG1NYXhOdHBDYWNoZUFnZVNlYyA9IE1BWF9OVFBfQ0FDSEVfQUdFX1NFQzsKICAgICBwcml2YXRlIGxvbmcgY2FjaGVkTnRwOwogICAgIHByaXZhdGUgbG9uZyBjYWNoZWROdHBUaW1lc3RhbXA7CiAKLSAgICBwcml2YXRlIGxvbmcgZ2V0QmVzdFRpbWUoKSB7CisgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgdGllZCB0byBVSSBhbmQgQU5SJ3MgYXJlIGEgZGFuZ2VyLCByZXF1ZXN0IGEgZmFzdCByZXN1bHQKKyAgICAvLyB0aGUgcmVndWxhciBwb2xsaW5nIHNob3VsZCBoYXZlIHVwZGF0ZWQgdGhlIGNhY2hlZCB0aW1lIHJlY2VudGx5IHVzaW5nIHRoZQorICAgIC8vIHNsb3dlciBtZXRob2QgKCFmYXN0KQorICAgIHByaXZhdGUgbG9uZyBnZXRCZXN0VGltZShib29sZWFuIGZhc3QpIHsKICAgICAgICAgaWYgKG1OdHBTZXJ2ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKG1OdHBBY3RpdmUpIHsKICAgICAgICAgICAgICAgICBsb25nIG50cEFnZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gY2FjaGVkTnRwVGltZXN0YW1wOwotICAgICAgICAgICAgICAgIGlmIChudHBBZ2UgPCBtTWF4TnRwQ2FjaGVBZ2VTZWMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG50cEFnZSA8IG1NYXhOdHBDYWNoZUFnZVNlYyAqIDEwMDAgfHwgZmFzdCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgU2xvZy52KFRBRywgInVzaW5nIGNhY2hlZCB0aW1lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWROdHAgKyBudHBBZ2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTAyNSwzOSArMTAzMyw1NyBAQAogICAgICAgICAgICAgICAgIGlmIChEQkcpIFNsb2cuZChUQUcsICJkYXRhIGZpbGUgZW1wdHkiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJzZWQgPSBkYXRhLnNwbGl0KCI6Iik7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnNlZFVzZWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicmVhZGluZyBkYXRhIGZpbGUgd2l0aCBpbnN1ZmZpY2llbnQgbGVuZ3RoIC0gaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcnNlZCA9IGRhdGEuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGludCBwYXJzZWRVc2VkID0gMDsKKyAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoIDwgNikgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGluc3VmZmljaWVudCBsZW5ndGggLSBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaW50IHBlcmlvZENvdW50OworICAgICAgICAgICAgbG9uZ1tdIHBlcmlvZFJ4RGF0YTsKKyAgICAgICAgICAgIGxvbmdbXSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICBpbnQgY3VycmVudFBlcmlvZDsKKyAgICAgICAgICAgIENhbGVuZGFyIHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgQ2FsZW5kYXIgcGVyaW9kRW5kOworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSkgIT0gREFUQV9GSUxFX1ZFUlNJT04pIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInJlYWRpbmcgZGF0YSBmaWxlIHdpdGggYmFkIHZlcnNpb24gLSBpZ25vcmluZyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogbVBlcmlvZENvdW50KSkgeworICAgICAgICAgICAgICAgIHBlcmlvZENvdW50ID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGggIT0gNSArICgyICogcGVyaW9kQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJyZWFkaW5nIGRhdGEgZmlsZSB3aXRoIGJhZCBsZW5ndGggKCIgKyBwYXJzZWQubGVuZ3RoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSsoMiptUGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICE9ICIgKyAoNSArICgyICogcGVyaW9kQ291bnQpKSArICIpIC0gaWdub3JpbmciKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJpb2RSeERhdGEgPSBuZXcgbG9uZ1twZXJpb2RDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJpb2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcmlvZFJ4RGF0YVtpXSA9IExvbmcucGFyc2VMb25nKHBhcnNlZFtwYXJzZWRVc2VkKytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyaW9kVHhEYXRhID0gbmV3IGxvbmdbcGVyaW9kQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyaW9kQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwZXJpb2RUeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBlcmlvZFJ4RGF0YSA9IG5ldyBsb25nW21QZXJpb2RDb3VudF07Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1QZXJpb2RDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZXJpb2RSeERhdGFbaV0gPSBMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBuZXcgbG9uZ1ttUGVyaW9kQ291bnRdOwotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtUGVyaW9kQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUGVyaW9kVHhEYXRhW2ldID0gTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ3VycmVudFBlcmlvZCA9IEludGVnZXIucGFyc2VJbnQocGFyc2VkW3BhcnNlZFVzZWQrK10pOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKLSAgICAgICAgICAgICAgICBtUGVyaW9kRW5kID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgbVBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50UGVyaW9kID0gSW50ZWdlci5wYXJzZUludChwYXJzZWRbcGFyc2VkVXNlZCsrXSk7CisKKyAgICAgICAgICAgICAgICBwZXJpb2RTdGFydCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0LnNldFRpbWVJbk1pbGxpcyhMb25nLnBhcnNlTG9uZyhwYXJzZWRbcGFyc2VkVXNlZCsrXSkpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgICAgIHBlcmlvZEVuZC5zZXRUaW1lSW5NaWxsaXMoTG9uZy5wYXJzZUxvbmcocGFyc2VkW3BhcnNlZFVzZWQrK10pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIHBhcnNpbmcgZGF0YSBmaWxlIC0gaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBtUGVyaW9kQ291bnQgPSBwZXJpb2RDb3VudDsKKyAgICAgICAgICAgICAgICBtUGVyaW9kUnhEYXRhID0gcGVyaW9kUnhEYXRhOworICAgICAgICAgICAgICAgIG1QZXJpb2RUeERhdGEgPSBwZXJpb2RUeERhdGE7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQZXJpb2QgPSBjdXJyZW50UGVyaW9kOworICAgICAgICAgICAgICAgIG1QZXJpb2RTdGFydCA9IHBlcmlvZFN0YXJ0OworICAgICAgICAgICAgICAgIG1QZXJpb2RFbmQgPSBwZXJpb2RFbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTA5MSwxNSArMTExNywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHB3LnByaW50bG4oKTsKIAotICAgICAgICBwdy5wcmludGxuKCJUaGUgdGhyZXNob2xkIGlzICIgKyBtUG9saWN5VGhyZXNob2xkICsKKyAgICAgICAgcHcucHJpbnRsbigiVGhlIHRocmVzaG9sZCBpcyAiICsgbVBvbGljeVRocmVzaG9sZC5nZXQoKSArCiAgICAgICAgICAgICAgICAgIiwgYWZ0ZXIgd2hpY2ggeW91IGV4cGVyaW5jZSB0aHJvdHRsaW5nIHRvICIgKwotICAgICAgICAgICAgICAgIG1Qb2xpY3lUaHJvdHRsZVZhbHVlICsgImticHMiKTsKKyAgICAgICAgICAgICAgICBtUG9saWN5VGhyb3R0bGVWYWx1ZS5nZXQoKSArICJrYnBzIik7CiAgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgcGVyaW9kIGlzICIgKwogICAgICAgICAgICAgICAgIChtUmVjb3JkZXIuZ2V0UGVyaW9kRW5kKCkgLSBtUmVjb3JkZXIuZ2V0UGVyaW9kU3RhcnQoKSkvMTAwMCArICIgc2Vjb25kcyBsb25nICIgKwogICAgICAgICAgICAgICAgICJhbmQgZW5kcyBpbiAiICsgKGdldFJlc2V0VGltZShtSWZhY2UpIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIC8gMTAwMCArCiAgICAgICAgICAgICAgICAgIiBzZWNvbmRzLiIpOwogICAgICAgICBwdy5wcmludGxuKCJQb2xsaW5nIGV2ZXJ5ICIgKyBtUG9saWN5UG9sbFBlcmlvZFNlYyArICIgc2Vjb25kcyIpOwotICAgICAgICBwdy5wcmludGxuKCJDdXJyZW50IFRocm90dGxlIEluZGV4IGlzICIgKyBtVGhyb3R0bGVJbmRleCk7CisgICAgICAgIHB3LnByaW50bG4oIkN1cnJlbnQgVGhyb3R0bGUgSW5kZXggaXMgIiArIG1UaHJvdHRsZUluZGV4LmdldCgpKTsKICAgICAgICAgcHcucHJpbnRsbigiTWF4IE5UUCBDYWNoZSBBZ2UgaXMgIiArIG1NYXhOdHBDYWNoZUFnZVNlYyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUmVjb3JkZXIuZ2V0UGVyaW9kQ291bnQoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIuamF2YQppbmRleCBkMDhmZTliLi41NDZlNWY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuVUV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NdHA7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwpAQCAtMTQ3LDggKzE0OCw0MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBtb25pdG9yVXNiSG9zdEJ1cygpOworCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhQWRkZWQoaW50IGRldmljZUlEKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYi5BQ1RJT05fVVNCX0NBTUVSQV9BVFRBQ0hFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwLkRldmljZS5nZXRDb250ZW50VXJpKGRldmljZUlEKSk7CisgICAgICAgIExvZy5kKFRBRywgInVzYkNhbWVyYUFkZGVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLy8gY2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkKKyAgICBwcml2YXRlIHZvaWQgdXNiQ2FtZXJhUmVtb3ZlZChpbnQgZGV2aWNlSUQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiLkFDVElPTl9VU0JfQ0FNRVJBX0RFVEFDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHAuRGV2aWNlLmdldENvbnRlbnRVcmkoZGV2aWNlSUQpKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiQ2FtZXJhUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0SG9zdFN1cHBvcnQoKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIGludG8gbmF0aXZlIGNvZGUgdG8gd2FpdCBmb3IgVVNCIGhvc3QgZXZlbnRzLgorICAgICAgICAvLyBUaGlzIHRocmVhZCB3aWxsIGNhbGwgdXMgYmFjayBvbiB1c2JDYW1lcmFBZGRlZCBhbmQgdXNiQ2FtZXJhUmVtb3ZlZC4KKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvclVzYkhvc3RCdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbmV3IFRocmVhZChudWxsLCBydW5uYWJsZSwgIlVzYk9ic2VydmVyIGhvc3QgdGhyZWFkIikuc3RhcnQoKTsKKyAgICB9CisKICAgICB2b2lkIHN5c3RlbVJlYWR5KCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2hhc1VzYkhvc3RTdXBwb3J0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1cGRhdGUoKTsKICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCmluZGV4IDBlY2EwODIuLjZlY2M1MTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDE5ICsxNiw5IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRElTQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRU5BQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMSU5HOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfRkFJTEVEOwotCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKIGltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7CkBAIC0zOCw2OSArMjgsNjAgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuSVdpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUluZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlTWFjaGluZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLktleU1nbXQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JbnRlcmZhY2VDb25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuRGhjcEluZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1V0aWxzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKLWltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuSUJhY2t1cE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkJhdHRlcnlTdGF0c1NlcnZpY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIAogLyoqCiAgKiBXaWZpU2VydmljZSBoYW5kbGVzIHJlbW90ZSBXaUZpIG9wZXJhdGlvbiByZXF1ZXN0cyBieSBpbXBsZW1lbnRpbmcKLSAqIHRoZSBJV2lmaU1hbmFnZXIgaW50ZXJmYWNlLiBJdCBhbHNvIGNyZWF0ZXMgYSBXaWZpTW9uaXRvciB0byBsaXN0ZW4KLSAqIGZvciBXaWZpLXJlbGF0ZWQgZXZlbnRzLgorICogdGhlIElXaWZpTWFuYWdlciBpbnRlcmZhY2UuCiAgKgogICogQGhpZGUKICAqLworLy9UT0RPOiBDbGVhbiB1cCBtdWx0aXBsZSBsb2NrcyBhbmQgaW1wbGVtZW50IFdpZmlTZXJ2aWNlCisvLyBhcyBhIFNNIHRvIHRyYWNrIHNvZnQgQVAvY2xpZW50L2FkaG9jIGJyaW5nIHVwIGJhc2VkCisvLyBvbiBkZXZpY2UgaWRsZSBzdGF0ZSwgYWlycGxhbmUgbW9kZSBhbmQgYm9vdC4KKwogcHVibGljIGNsYXNzIFdpZmlTZXJ2aWNlIGV4dGVuZHMgSVdpZmlNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVUcmFja2VyIG1XaWZpU3RhdGVUcmFja2VyOwotICAgIC8qIFRPRE86IGZldGNoIGEgY29uZmlndXJhYmxlIGludGVyZmFjZSAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUQVBfSUZBQ0UgPSAid2wwLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgV2lmaVN0YXRlTWFjaGluZSBtV2lmaVN0YXRlTWFjaGluZTsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGludCBtV2lmaUFwU3RhdGU7CiAKICAgICBwcml2YXRlIEFsYXJtTWFuYWdlciBtQWxhcm1NYW5hZ2VyOwogICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtSWRsZUludGVudDsKQEAgLTEwOSwxNSArOTAsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbURldmljZUlkbGU7CiAgICAgcHJpdmF0ZSBpbnQgbVBsdWdnZWRUeXBlOwogCi0gICAgcHJpdmF0ZSBlbnVtIERyaXZlckFjdGlvbiB7RFJJVkVSX1VOTE9BRCwgTk9fRFJJVkVSX1VOTE9BRH07Ci0KICAgICAvLyB0cnVlIGlmIHRoZSB1c2VyIGVuYWJsZWQgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbjsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrTGlzdCBtTG9ja3MgPSBuZXcgTG9ja0xpc3QoKTsKICAgICAvLyBzb21lIHdpZmkgbG9jayBzdGF0aXN0aWNzCi0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxIaWdoUGVyZkxvY2tzUmVsZWFzZWQ7CiAgICAgcHJpdmF0ZSBpbnQgbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgIHByaXZhdGUgaW50IG1GdWxsTG9ja3NSZWxlYXNlZDsKICAgICBwcml2YXRlIGludCBtU2NhbkxvY2tzQWNxdWlyZWQ7CkBAIC0xMzAsOSArMTA3LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgSUJhdHRlcnlTdGF0cyBtQmF0dGVyeVN0YXRzOwogCi0gICAgcHJpdmF0ZSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG53U2VydmljZTsKICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKLSAgICBwcml2YXRlIFdpZmlXYXRjaGRvZ1NlcnZpY2UgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nW10gbVdpZmlSZWdleHM7CiAKICAgICAvKioKQEAgLTE0NCw2MSArMTE5LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfSURMRV9NSUxMSVMgPSAxNSAqIDYwICogMTAwMDsgLyogMTUgbWludXRlcyAqLwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBS0VMT0NLX1RBRyA9ICJXaWZpU2VydmljZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byBob2xkIHRoZSB3YWtlIGxvY2sgYWZ0ZXIgYSBkaXNjb25uZWN0Ci0gICAgICogY2F1c2VkIGJ5IHN0b3BwaW5nIHRoZSBkcml2ZXIuIEVzdGFibGlzaGluZyBhbiBFREdFIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgICAgKiBvYnNlcnZlZCB0byB0YWtlIGFib3V0IDUgc2Vjb25kcyB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhpcwotICAgICAqIHByb3ZpZGVzIGEgYml0IG9mIGV4dHJhIG1hcmdpbi4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TfS4KLSAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGEgU2V0dGluZ3MuU2VjdXJlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dBS0VMT0NLX1RJTUVPVVQgPSA4MDAwOwotCi0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgZHJpdmVyLXN0b3Agb3BlcmF0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgUG93ZXJNYW5hZ2VyLldha2VMb2NrIHNEcml2ZXJTdG9wV2FrZUxvY2s7Ci0gICAgLy8gV2FrZSBsb2NrIHVzZWQgYnkgb3RoZXIgb3BlcmF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfV0lGSSAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0RJU0FCTEVfV0lGSSAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU1RPUF9XSUZJICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9XSUZJICAgICAgICAgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1JFTEVBU0VfV0FLRUxPQ0sgICA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVVBEQVRFX1NUQVRFICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TVEFSVF9BQ0NFU1NfUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UICA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0NIQU5ORUxTICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1MgICAgPSA5OwotCi0KLSAgICBwcml2YXRlIGZpbmFsICBXaWZpSGFuZGxlciBtV2lmaUhhbmRsZXI7Ci0KLSAgICAvKgotICAgICAqIENhY2hlIG9mIHNjYW4gcmVzdWx0cyBvYmplY3RzIChzaXplIGlzIHNvbWV3aGF0IGFyYml0cmFyeSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA9IDgwOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0Q2FjaGU7Ci0KLSAgICAvKgotICAgICAqIENoYXJhY3RlciBidWZmZXIgdXNlZCB0byBwYXJzZSBzY2FuIHJlc3VsdHMgKG9wdGltaXphdGlvbikKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9SRVNVTFRfQlVGRkVSX1NJWkUgPSA1MTI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkUmVjb25maWc7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RFbmFibGVVaWQgPSBQcm9jZXNzLm15VWlkKCk7Ci0KLSAgICAvKgotICAgICAqIExhc3QgVUlEIHRoYXQgYXNrZWQgdG8gZW5hYmxlIFdJRkkgQVAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbUxhc3RBcEVuYWJsZVVpZCA9IFByb2Nlc3MubXlVaWQoKTsKLQotCiAgICAgLyoqCiAgICAgICogTnVtYmVyIG9mIGFsbG93ZWQgcmFkaW8gZnJlcXVlbmN5IGNoYW5uZWxzIGluIHZhcmlvdXMgcmVndWxhdG9yeSBkb21haW5zLgogICAgICAqIFRoaXMgbGlzdCBpcyBzdWZmaWNpZW50IGZvciA4MDIuMTFiL2cgbmV0d29ya3MgKDIuNEdIeiByYW5nZSkuCkBAIC0yMDgsNDcgKzEyOCw4MCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fREVWSUNFX0lETEUgPQogICAgICAgICAgICAgImNvbS5hbmRyb2lkLnNlcnZlci5XaWZpTWFuYWdlci5hY3Rpb24uREVWSUNFX0lETEUiOwogCi0gICAgV2lmaVNlcnZpY2UoQ29udGV4dCBjb250ZXh0LCBXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzUmVjZWl2ZXJSZWdpc3RlcmVkID0gZmFsc2U7CisKKworICAgIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSSwgMCwgIldJRkkiLCAiIik7CisKKyAgICAvLyBWYXJpYWJsZXMgcmVsYXRpbmcgdG8gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbgorICAgIC8qKgorICAgICAqIFRoZSBpY29uIHRvIHNob3cgaW4gdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4gVGhpcyB3aWxsIGFsc28KKyAgICAgKiBiZSB0aGUgSUQgb2YgdGhlIE5vdGlmaWNhdGlvbiBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUNPTl9ORVRXT1JLU19BVkFJTEFCTEUgPQorICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X25vdGlmeV93aWZpX2luX3JhbmdlOworICAgIC8qKgorICAgICAqIFdoZW4gYSBub3RpZmljYXRpb24gaXMgc2hvd24sIHdlIHdhaXQgdGhpcyBhbW91bnQgYmVmb3JlIHBvc3NpYmx5IHNob3dpbmcgaXQgYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIE5PVElGSUNBVElPTl9SRVBFQVRfREVMQVlfTVM7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgdXNlciBoYXMgc2V0IHRoZSBzZXR0aW5nIHRvIHNob3cgdGhlICdhdmFpbGFibGUgbmV0d29ya3MnIG5vdGlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvbkVuYWJsZWQ7CisgICAgLyoqCisgICAgICogT2JzZXJ2ZXMgdGhlIHVzZXIgc2V0dGluZyB0byBrZWVwIHtAbGluayAjbU5vdGlmaWNhdGlvbkVuYWJsZWR9IGluIHN5bmMuCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyOworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IG11c3QgYmUgYXQgbGVhc3QgdGhpcyB2YWx1ZSBmb3IgdXMKKyAgICAgKiB0byBzaG93IHRoZSBub3RpZmljYXRpb24gYWdhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lOworICAgIC8qKgorICAgICAqIFRoZSBOb3RpZmljYXRpb24gb2JqZWN0IGdpdmVuIHRvIHRoZSBOb3RpZmljYXRpb25NYW5hZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgbm90aWZpY2F0aW9uIGlzIGJlaW5nIHNob3duLCBhcyBzZXQgYnkgdXMuIFRoYXQgaXMsIGlmIHRoZQorICAgICAqIHVzZXIgY2FuY2VscyB0aGUgbm90aWZpY2F0aW9uLCB3ZSB3aWxsIG5vdCByZWNlaXZlIHRoZSBjYWxsYmFjayBzbyB0aGlzCisgICAgICogd2lsbCBzdGlsbCBiZSB0cnVlLiBXZSBvbmx5IGd1YXJhbnRlZSBpZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZQorICAgICAqIG5vdGlmaWNhdGlvbiBpcyBub3Qgc2hvd2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbU5vdGlmaWNhdGlvblNob3duOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29udGludW91cyBzY2FucyB0aGF0IG11c3Qgb2NjdXIgYmVmb3JlIGNvbnNpZGVyIHRoZQorICAgICAqIHN1cHBsaWNhbnQgaW4gYSBzY2FubmluZyBzdGF0ZS4gVGhpcyBhbGxvd3Mgc3VwcGxpY2FudCB0byBhc3NvY2lhdGUgd2l0aAorICAgICAqIHJlbWVtYmVyZWQgbmV0d29ya3MgdGhhdCBhcmUgaW4gdGhlIHNjYW4gcmVzdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORyA9IDM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzY2FucyBzaW5jZSB0aGUgbGFzdCBuZXR3b3JrIHN0YXRlIGNoYW5nZS4gV2hlbiB0aGlzCisgICAgICogZXhjZWVkcyB7QGxpbmsgI05VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkd9LCB3ZSBjb25zaWRlciB0aGUKKyAgICAgKiBzdXBwbGljYW50IHRvIGFjdHVhbGx5IGJlIHNjYW5uaW5nLiBXaGVuIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiBzY2FubmluZywgd2UgcmVzZXQgdGhpcyB0byAwLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlOworCisKKyAgICBXaWZpU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlciA9IHRyYWNrZXI7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZSA9IG5ldyBXaWZpU3RhdGVNYWNoaW5lKG1Db250ZXh0KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7CiAgICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBCYXR0ZXJ5U3RhdHNTZXJ2aWNlLmdldFNlcnZpY2UoKTsKIAotICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7Ci0gICAgICAgIG53U2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKLQotICAgICAgICBtU2NhblJlc3VsdENhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PigKLSAgICAgICAgICAgIFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUsIDAuNzVmLCB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBMaW1pdCB0aGUgY2FjaGUgc2l6ZSBieSBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFCi0gICAgICAgICAgICAgICAgICogZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFIDwgdGhpcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIHdpZmlUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiV2lmaVNlcnZpY2UiKTsKLSAgICAgICAgd2lmaVRocmVhZC5zdGFydCgpOwotICAgICAgICBtV2lmaUhhbmRsZXIgPSBuZXcgV2lmaUhhbmRsZXIod2lmaVRocmVhZC5nZXRMb29wZXIoKSk7Ci0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRElTQUJMRUQpOwotICAgICAgICBtV2lmaUFwU3RhdGUgPSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCiAgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BTEFSTV9TRVJWSUNFKTsKICAgICAgICAgSW50ZW50IGlkbGVJbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9ERVZJQ0VfSURMRSwgbnVsbCk7CiAgICAgICAgIG1JZGxlSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIElETEVfUkVRVUVTVCwgaWRsZUludGVudCwgMCk7CiAKLSAgICAgICAgUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciA9IChQb3dlck1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlBPV0VSX1NFUlZJQ0UpOwotICAgICAgICBzV2FrZUxvY2sgPSBwb3dlck1hbmFnZXIubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFTE9DS19UQUcpOwotICAgICAgICBzRHJpdmVyU3RvcFdha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgV0FLRUxPQ0tfVEFHKTsKKyAgICAgICAgSGFuZGxlclRocmVhZCB3aWZpVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldpZmlTZXJ2aWNlIik7CisgICAgICAgIHdpZmlUaHJlYWQuc3RhcnQoKTsKIAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKAogICAgICAgICAgICAgICAgIG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91ciBmbGFnIGluZGljYXRpbmcgdGhlIHVzZXIgaGFzIG92ZXJ3cmlkZGVuIGFpcnBsYW5lIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BaXJwbGFuZU1vZGVPdmVyd3JpZGRlbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLnNldChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBhaXJwbGFuZSBkaXNhYmxlLCByZXN0b3JlIFdpZmkgaWYgdGhlIHNhdmVkIHN0YXRlIGluZGljYXRlcyBzbwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FpcnBsYW5lTW9kZU9uKCkgJiYgdGVzdEFuZENsZWFyV2lmaVNhdmVkU3RhdGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZCh0cnVlKTsKQEAgLTI2MywxNCArMjE2LDUwIEBACiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewogCi0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQVZBSUxBQkxFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfQUNUSVZFX1RFVEhFUik7Ci0gICAgICAgICAgICAgICAgICB1cGRhdGVUZXRoZXJTdGF0ZShhdmFpbGFibGUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGF2YWlsYWJsZSA9IGludGVudC5nZXRTdHJpbmdBcnJheUxpc3RFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0FWQUlMQUJMRV9URVRIRVIpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY3RpdmUgPSBpbnRlbnQuZ2V0U3RyaW5nQXJyYXlMaXN0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9BQ1RJVkVfVEVUSEVSKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGV0aGVyU3RhdGUoYXZhaWxhYmxlLCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSxuZXcgSW50ZW50RmlsdGVyKENvbm5lY3Rpdml0eU1hbmFnZXIuQUNUSU9OX1RFVEhFUl9TVEFURV9DSEFOR0VEKSk7CisKKyAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5ORVRXT1JLX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTik7CisKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0ICYgY2xlYXIgbm90aWZpY2F0aW9uIG9uIGFueSB3aWZpIHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLk5FVFdPUktfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvID0gKE5ldHdvcmtJbmZvKSBpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVhUUkFfTkVUV09SS19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCAmIGNsZWFyIG5vdGlmaWNhdGlvbiBvbiBhIG5ldHdvcmsgY29ubmVjdCAmIGRpc2Nvbm5lY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5TQ0FOX1JFU1VMVFNfQVZBSUxBQkxFX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgZmlsdGVyKTsKKworICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKKyAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9ORVRXT1JLU19BVkFJTEFCTEVfUkVQRUFUX0RFTEFZLCA5MDApICogMTAwMGw7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyID0gbmV3IE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7CisgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyLnJlZ2lzdGVyKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzksNyArMjY4LDcgQEAKICAgICAgKgogICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGF0IGJvb3QgdGltZQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0V2lmaSgpIHsKKyAgICBwdWJsaWMgdm9pZCBjaGVja0FuZFN0YXJ0V2lmaSgpIHsKICAgICAgICAgLyogU3RhcnQgaWYgV2ktRmkgaXMgZW5hYmxlZCBvciB0aGUgc2F2ZWQgc3RhdGUgaW5kaWNhdGVzIFdpLUZpIHdhcyBvbiAqLwogICAgICAgICBib29sZWFuIHdpZmlFbmFibGVkID0gIWlzQWlycGxhbmVNb2RlT24oKQogICAgICAgICAgICAgICAgICYmIChnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpIHx8IHRlc3RBbmRDbGVhcldpZmlTYXZlZFN0YXRlKCkpOwpAQCAtMjk2LDcgKzI4NSwxMCBAQAogICAgICAgICBJQmluZGVyIGIgPSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuTkVUV09SS01BTkFHRU1FTlRfU0VSVklDRSk7CiAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIAotICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpOworICAgICAgICBpZiAobUNtID09IG51bGwpIHsKKyAgICAgICAgICAgIG1DbSA9IChDb25uZWN0aXZpdHlNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIH0KKwogICAgICAgICBtV2lmaVJlZ2V4cyA9IG1DbS5nZXRUZXRoZXJhYmxlV2lmaVJlZ2V4cygpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGludGYgOiBhdmFpbGFibGUpIHsKQEAgLTMxNiwxNyArMzA4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgY29uZmlndXJpbmcgaW50ZXJmYWNlICIgKyBpbnRmICsgIiwgOiIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCwgMCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZChudWxsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZihtQ20udGV0aGVyKGludGYpICE9IENvbm5lY3Rpdml0eU1hbmFnZXIuVEVUSEVSX0VSUk9SX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nICIraW50Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgdGV0aGVyaW5nIG9uICIgKyBpbnRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlBcEVuYWJsZWQobnVsbCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTM2MiwxOTAgKzM1MSwyMSBAQAogICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KGNyLCBTZXR0aW5ncy5TZWN1cmUuV0lGSV9PTiwgZW5hYmxlZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcGluZ1N1cHBsaWNhbnQoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwaW5nU3VwcGxpY2FudCgpIHsKLSAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucGluZygpOworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1BpbmdTdXBwbGljYW50KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3N0YXJ0U2NhbigpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgc3dpdGNoIChtV2lmaVN0YXRlVHJhY2tlci5nZXRTdXBwbGljYW50U3RhdGUoKSkgewotICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIElOQUNUSVZFOgotICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKLSAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdEhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaVN0YXRlVHJhY2tlci5TVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnNjYW4oZm9yY2VBY3RpdmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNzZXRXaWZpRW5hYmxlZChib29sZWFuKX0KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byBlbmFibGUsIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5hYmxlL2Rpc2FibGUgb3BlcmF0aW9uIHdhcwotICAgICAqICAgICAgICAgc3RhcnRlZCBvciBpcyBhbHJlYWR5IGluIHRoZSBxdWV1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotICAgICAgICBpZiAobVdpZmlIYW5kbGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgLy8gY2FsbGVyIG1heSBub3QgaGF2ZSBXQUtFX0xPQ0sgcGVybWlzc2lvbiAtIGl0J3Mgbm90IHJlcXVpcmVkIGhlcmUKLSAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0KLSAgICAgICAgICAgIG1MYXN0RW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIC8vIHNldCBhIGZsYWcgaWYgdGhlIHVzZXIgaXMgZW5hYmxpbmcgV2lmaSB3aGlsZSBpbiBhaXJwbGFuZSBtb2RlCi0gICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4gPSAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKTsKLSAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGVuYWJsZSwgdHJ1ZSwgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzL2Rpc2FibGVzIFdpLUZpIHN5bmNocm9ub3VzbHkuCi0gICAgICogQHBhcmFtIGVuYWJsZSB7QGNvZGUgdHJ1ZX0gdG8gdHVybiBXaS1GaSBvbiwge0Bjb2RlIGZhbHNlfSB0byB0dXJuIGl0IG9mZi4KLSAgICAgKiBAcGFyYW0gcGVyc2lzdCB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNldHRpbmcgc2hvdWxkIGJlIHBlcnNpc3RlZC4KLSAgICAgKiBAcGFyYW0gdWlkIFRoZSBVSUQgb2YgdGhlIHByb2Nlc3MgbWFraW5nIHRoZSByZXF1ZXN0LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0V2lmaUVuYWJsZWRCbG9ja2luZyhib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBwZXJzaXN0LCBpbnQgdWlkKSB7Ci0gICAgICAgIGZpbmFsIGludCBldmVudHVhbFdpZmlTdGF0ZSA9IGVuYWJsZSA/IFdJRklfU1RBVEVfRU5BQkxFRCA6IFdJRklfU1RBVEVfRElTQUJMRUQ7Ci0gICAgICAgIGZpbmFsIGludCB3aWZpU3RhdGUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLQotICAgICAgICBpZiAod2lmaVN0YXRlID09IGV2ZW50dWFsV2lmaVN0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGlwbGUgY2FsbHMgdG8gdW5yZWdpc3RlclJlY2VpdmVyKCkgY2F1c2UgZXhjZXB0aW9uIGFuZCBhIHN5c3RlbSBjcmFzaC4KLSAgICAgICAgICogVGhpcyBjYW4gaGFwcGVuIGlmIGEgc3VwcGxpY2FudCBpcyBsb3N0IChvciBmaXJtd2FyZSBjcmFzaCBvY2N1cnMpIGFuZCB1c2VyIGluZGljYXRlcwotICAgICAgICAgKiBkaXNhYmxlIHdpZmkgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAgICAgICogQXZvaWQgZG9pbmcgYSBkaXNhYmxlIHdoZW4gdGhlIGN1cnJlbnQgV2lmaSBzdGF0ZSBpcyBVTktOT1dOCi0gICAgICAgICAqIFRPRE86IEhhbmRsZSBkcml2ZXIgbG9hZCBmYWlsIGFuZCBzdXBwbGljYW50IGxvc3QgYXMgc2VwZXJhdGUgc3RhdGVzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX1VOS05PV04pICYmICFlbmFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIFdpZmkgaWYgQVAgaXMgZW5hYmxlZAotICAgICAgICAgKiBUT0RPOiBEZXByZWNhdGUgV0lGSV9TVEFURV9VTktOT1dOIGFuZCByZW5hbWUgaXQKLSAgICAgICAgICogV0lGSV9TVEFURV9GQUlMRUQKLSAgICAgICAgICovCi0gICAgICAgIGlmICgobVdpZmlBcFN0YXRlID09IFdJRklfQVBfU1RBVEVfRU5BQkxFRCkgJiYgZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZW5hYmxlID8gV0lGSV9TVEFURV9FTkFCTElORyA6IFdJRklfU1RBVEVfRElTQUJMSU5HLCB1aWQpOwotCi0gICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBsb2FkIFdpLUZpIGRyaXZlci4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0YXJ0U3VwcGxpY2FudCgpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCk7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byBzdGFydCBzdXBwbGljYW50IGRhZW1vbi4iKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpRW5hYmxlZFN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTiwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZ2lzdGVyRm9yQnJvYWRjYXN0cygpOwotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RhcnRFdmVudExvb3AoKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKLSAgICAgICAgICAgLy8gUmVtb3ZlIG5vdGlmaWNhdGlvbiAoaXQgd2lsbCBuby1vcCBpZiBpdCBpc24ndCB2aXNpYmxlKQotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOwotCi0gICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlciA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnN0b3BTdXBwbGljYW50KCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHN0b3Agc3VwcGxpY2FudCBkYWVtb24uIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04sIHVpZCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAqIGJlZm9yZSB3ZSB1bmxvYWQgdGhlIGRyaXZlcgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXNldENvbm5lY3Rpb25zKHRydWUpOwotCi0gICAgICAgICAgICBpZiAoIW1XaWZpU3RhdGVUcmFja2VyLnVubG9hZERyaXZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgV2ktRmkgZHJpdmVyLiIpOwotICAgICAgICAgICAgICAgIGlmICghZmFpbGVkVG9TdG9wU3VwcGxpY2FudE9yVW5sb2FkRHJpdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoV0lGSV9TVEFURV9VTktOT1dOLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb1N0b3BTdXBwbGljYW50T3JVbmxvYWREcml2ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZhaWxlZFRvU3RvcFN1cHBsaWNhbnRPclVubG9hZERyaXZlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1Y2Nlc3MhCi0KLSAgICAgICAgaWYgKHBlcnNpc3QpIHsKLSAgICAgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOwotICAgICAgICB9Ci0gICAgICAgIHNldFdpZmlFbmFibGVkU3RhdGUoZXZlbnR1YWxXaWZpU3RhdGUsIHVpZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRXaWZpRW5hYmxlZFN0YXRlKGludCB3aWZpU3RhdGUsIGludCB1aWQpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaVN0YXRlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0V2lmaVN0YXRlKCk7Ci0KLSAgICAgICAgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRElTQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKHVpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3RhdGUKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0V2lmaVN0YXRlKHdpZmlTdGF0ZSk7Ci0KLSAgICAgICAgLy8gQnJvYWRjYXN0Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRTY2FuKGZvcmNlQWN0aXZlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKSB7CkBAIC01NjYsNiArMzg2LDQ3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlFbmFibGVkKGJvb2xlYW4pfQorICAgICAqIEBwYXJhbSBlbmFibGUge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSwge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbmFibGUvZGlzYWJsZSBvcGVyYXRpb24gd2FzCisgICAgICogICAgICAgICBzdGFydGVkIG9yIGlzIGFscmVhZHkgaW4gdGhlIHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbnZva2luZyBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpRW5hYmxlZFxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgYSBmbGFnIGlmIHRoZSB1c2VyIGlzIGVuYWJsaW5nIFdpZmkgd2hpbGUgaW4gYWlycGxhbmUgbW9kZQorICAgICAgICBpZiAoZW5hYmxlICYmIGlzQWlycGxhbmVNb2RlT24oKSAmJiBpc0FpcnBsYW5lVG9nZ2xlYWJsZSgpKSB7CisgICAgICAgICAgICBtQWlycGxhbmVNb2RlT3ZlcndyaWRkZW4uc2V0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZW5hYmxlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDYWxsZXIgbWlnaHQgbm90IGhhdmUgV1JJVEVfU0VDVVJFX1NFVFRJTkdTLAorICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAqLworICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHBlcnNpc3RXaWZpRW5hYmxlZChlbmFibGUpOworICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudCk7CisKKyAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgaWYgKCFtSXNSZWNlaXZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHMoKTsKKyAgICAgICAgICAgICAgICBtSXNSZWNlaXZlclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCl7CisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyKTsKKyAgICAgICAgICAgIG1Jc1JlY2VpdmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBXaWZpTWFuYWdlciNnZXRXaWZpU3RhdGUoKX0KICAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCiAgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LApAQCAtNTc1LDY2ICs0MzYsNTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFdpZmlFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewotICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlY29ubmVjdCgpfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVhc3NvY2lhdGUoKSB7Ci0gICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlYXNzb2NpYXRlKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaVN0YXRlKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogc2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3NldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24sIGJvb2xlYW4pfQogICAgICAqIEBwYXJhbSB3aWZpQ29uZmlnIFNTSUQsIHNlY3VyaXR5IGFuZCBjaGFubmVsIGRldGFpbHMgYXMKICAgICAgKiAgICAgICAgcGFydCBvZiBXaWZpQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBlbmFibGVkLCB0cnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZQorICAgICAqIEBwYXJhbSBlbmFibGVkIHRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlCiAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0YXJ0IG9wZXJhdGlvbiB3YXMKICAgICAgKiAgICAgICAgIHN0YXJ0ZWQgb3IgaXMgYWxyZWFkeSBpbiB0aGUgcXVldWUuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0V2lmaUFwRW5hYmxlZChXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnLCBib29sZWFuIGVuYWJsZWQpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtV2lmaUhhbmRsZXIpIHsKLQorICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgLyogVXNlIGRlZmF1bHQgY29uZmlnIGlmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIGNvbmZpZyAqLworICAgICAgICAgICAgaWYgKHdpZmlDb25maWcgPT0gbnVsbCAmJiAoKHdpZmlDb25maWcgPSBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkpID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgd2lmaUNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgIHdpZmlDb25maWcuU1NJRCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy53aWZpX3RldGhlcl9jb25maWd1cmVfc3NpZF9kZWZhdWx0KTsKKyAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChLZXlNZ210Lk5PTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhbGxlciBtaWdodCBub3QgaGF2ZSBXUklURV9TRUNVUkVfU0VUVElOR1MsCisgICAgICAgICAgICAgKiBvbmx5IENIQU5HRV9XSUZJX1NUQVRFIGlzIGVuZm9yY2VkCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7CisgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwogICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwotCi0gICAgICAgICAgICBtTGFzdEFwRW5hYmxlVWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIHNlbmRBY2Nlc3NQb2ludE1lc3NhZ2UoZW5hYmxlZCwgd2lmaUNvbmZpZywgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKHdpZmlDb25maWcsIGVuYWJsZWQpOworCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCkgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjZ2V0V2lmaUFwU3RhdGUoKX0KKyAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9ESVNBQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxFRH0sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9GQUlMRUR9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRXaWZpQXBFbmFibGVkU3RhdGUoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0V2lmaUFwU3RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcENvbmZpZ3VyYXRpb24oKX0KKyAgICAgKiBAcmV0dXJuIHNvZnQgYWNjZXNzIHBvaW50IGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFdpZmlDb25maWd1cmF0aW9uIGdldFdpZmlBcENvbmZpZ3VyYXRpb24oKSB7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGludCBhdXRoVHlwZTsKQEAgLTY1Miw3ICs1MDYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgeworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgV2lmaU1hbmFnZXIjc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbil9CisgICAgICogQHBhcmFtIHdpZmlDb25maWcgV2lmaUNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3Igc29mdCBhY2Nlc3MgcG9pbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0V2lmaUFwQ29uZmlndXJhdGlvbihXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CiAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwogICAgICAgICBib29sZWFuIGlzV3BhOwpAQCAtNjY4LDE0MyArNTI2LDI3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5hYmxlcy9kaXNhYmxlcyBXaS1GaSBBUCBzeW5jaHJvbm91c2x5LiBUaGUgZHJpdmVyIGlzIGxvYWRlZAotICAgICAqIGFuZCBzb2Z0IGFjY2VzcyBwb2ludCBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG9wZXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gZW5hYmxlIHtAY29kZSB0cnVlfSB0byB0dXJuIFdpLUZpIG9uLCB7QGNvZGUgZmFsc2V9IHRvIHR1cm4gaXQgb2ZmLgotICAgICAqIEBwYXJhbSB1aWQgVGhlIFVJRCBvZiB0aGUgcHJvY2VzcyBtYWtpbmcgdGhlIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIHdpZmlDb25maWcgVGhlIFdpZmlDb25maWd1cmF0aW9uIGZvciBBUAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgKG9yIGlmIHRoZSBleGlzdGluZyBzdGF0ZQotICAgICAqICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBzdGF0ZSkKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjZGlzY29ubmVjdCgpfQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsIFdpZmlDb25maWd1cmF0aW9uIHdpZmlDb25maWcpIHsKLSAgICAgICAgZmluYWwgaW50IGV2ZW50dWFsV2lmaUFwU3RhdGUgPSBlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgOiBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEOwotCi0gICAgICAgIGlmIChtV2lmaUFwU3RhdGUgPT0gZXZlbnR1YWxXaWZpQXBTdGF0ZSkgewotICAgICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBjaGFuZ2VkIG9uIGEgcnVubmluZyBhY2Nlc3MgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmKGVuYWJsZSAmJiAod2lmaUNvbmZpZyAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRBY2Nlc3NQb2ludCh3aWZpQ29uZmlnLCBtV2lmaVN0YXRlVHJhY2tlci5nZXRJbnRlcmZhY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUQVBfSUZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBDb25maWd1cmF0aW9uKHdpZmlDb25maWcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJFeGNlcHRpb24gaW4gbndTZXJ2aWNlIGR1cmluZyBBUCByZXN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc3RvcEFjY2Vzc1BvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWlsIEFQIGlmIFdpZmkgaXMgZW5hYmxlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMRUQpICYmIGVuYWJsZSkgewotICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShlbmFibGUgPyBXSUZJX0FQX1NUQVRFX0VOQUJMSU5HIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLQotICAgICAgICBpZiAoZW5hYmxlKSB7Ci0KLSAgICAgICAgICAgIC8qIFVzZSBkZWZhdWx0IGNvbmZpZyBpZiB0aGVyZSBpcyBubyBleGlzdGluZyBjb25maWcgKi8KLSAgICAgICAgICAgIGlmICh3aWZpQ29uZmlnID09IG51bGwgJiYgKCh3aWZpQ29uZmlnID0gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHdpZmlDb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICB3aWZpQ29uZmlnLlNTSUQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcud2lmaV90ZXRoZXJfY29uZmlndXJlX3NzaWRfZGVmYXVsdCk7Ci0gICAgICAgICAgICAgICAgd2lmaUNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5zZXQoS2V5TWdtdC5OT05FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgV2ktRmkgZHJpdmVyIGZvciBBUCBtb2RlIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQod2lmaUNvbmZpZywgbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0SW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPRlRBUF9JRkFDRSk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkV4Y2VwdGlvbiBpbiBzdGFydEFjY2Vzc1BvaW50KCkiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lmaUFwQ29uZmlndXJhdGlvbih3aWZpQ29uZmlnKTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG53U2VydmljZS5zdG9wQWNjZXNzUG9pbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0b3BBY2Nlc3NQb2ludCgpIik7Ci0gICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKFdJRklfQVBfU1RBVEVfRkFJTEVELCB1aWQsIERyaXZlckFjdGlvbi5EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIudW5sb2FkRHJpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHVubG9hZCBXaS1GaSBkcml2ZXIgZm9yIEFQIG1vZGUiKTsKLSAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQsIHVpZCwgRHJpdmVyQWN0aW9uLk5PX0RSSVZFUl9VTkxPQUQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFdpZmlBcEVuYWJsZWRTdGF0ZShldmVudHVhbFdpZmlBcFN0YXRlLCB1aWQsIERyaXZlckFjdGlvbi5OT19EUklWRVJfVU5MT0FEKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZGlzY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBzZWUge0BsaW5rIFdpZmlNYW5hZ2VyI2dldFdpZmlBcFN0YXRlKCl9Ci0gICAgICogQHJldHVybiBPbmUgb2Yge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRElTQUJMSU5HfSwKLSAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMRUR9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRU5BQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfQVBfU1RBVEVfRkFJTEVEfQorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNyZWNvbm5lY3QoKX0KICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFdpZmlBcEVuYWJsZWRTdGF0ZSgpIHsKLSAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpQXBTdGF0ZTsKKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwRW5hYmxlZFN0YXRlKGludCB3aWZpQVBTdGF0ZSwgaW50IHVpZCwgRHJpdmVyQWN0aW9uIGZsYWcpIHsKLSAgICAgICAgZmluYWwgaW50IHByZXZpb3VzV2lmaUFwU3RhdGUgPSBtV2lmaUFwU3RhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVubG9hZCB0aGUgZHJpdmVyIGlmIGdvaW5nIHRvIGEgZmFpbGVkIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKG1XaWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0ZBSUxFRCkgJiYgKGZsYWcgPT0gRHJpdmVyQWN0aW9uLkRSSVZFUl9VTkxPQUQpKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci51bmxvYWREcml2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aWZpQVBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT24odWlkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaUFQU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlPZmYodWlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZQotICAgICAgICBtV2lmaUFwU3RhdGUgPSB3aWZpQVBTdGF0ZTsKLQotICAgICAgICAvLyBCcm9hZGNhc3QKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfV0lGSV9BUF9TVEFURSwgd2lmaUFQU3RhdGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfUFJFVklPVVNfV0lGSV9BUF9TVEFURSwgcHJldmlvdXNXaWZpQXBTdGF0ZSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjcmVhc3NvY2lhdGUoKX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFzc29jaWF0ZSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUucmVhc3NvY2lhdGVDb21tYW5kKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MTMsMjE3ICs1NTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBsaXN0U3RyOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGRvbid0IGNhY2hlIHRoZSBsaXN0LCBiZWNhdXNlIHdlIHdhbnQgdG8gYWxsb3cKLSAgICAgICAgICogZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgICogaGFzIGJlZW4gbW9kaWZpZWQgdGhyb3VnaCBzb21lIGV4dGVybmFsIG1lYW5zLAotICAgICAgICAgKiBzdWNoIGFzIHRoZSB3cGFfY2xpIGNvbW1hbmQgbGluZSBwcm9ncmFtLgotICAgICAgICAgKi8KLSAgICAgICAgbGlzdFN0ciA9IG1XaWZpU3RhdGVUcmFja2VyLmxpc3ROZXR3b3JrcygpOwotCi0gICAgICAgIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IG5ldHdvcmtzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIGlmIChsaXN0U3RyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0KLSAgICAgICAgU3RyaW5nW10gbGluZXMgPSBsaXN0U3RyLnNwbGl0KCJcbiIpOwotICAgICAgICAvLyBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7Ci0gICAgICAgICAgIC8vIG5ldHdvcmstaWQgfCBzc2lkIHwgYnNzaWQgfCBmbGFncwotICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgV2lmaUNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFswXSk7Ci0gICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMykgewotICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkNVUlJFTlQ7Ci0gICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRbM10uaW5kZXhPZigiW0RJU0FCTEVEXSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyA9IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5FTkFCTEVEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7Ci0gICAgICAgICAgIG5ldHdvcmtzLmFkZChjb25maWcpOwotICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV0d29ya3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bwotICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHN5bmNocm9uaXphdGlvbiBtb25pdG9yLgotICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZE5ldHdvcmtWYXJpYWJsZXMoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLSAgICAgICAgaW50IG5ldElkID0gY29uZmlnLm5ldHdvcmtJZDsKLSAgICAgICAgaWYgKG5ldElkIDwgMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBtYXliZSBzaG91bGQgaGF2ZSBhIG5hdGl2ZSBtZXRob2QgdGhhdCB0YWtlcyBhbiBhcnJheSBvZgotICAgICAgICAgKiB2YXJpYWJsZSBuYW1lcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB2YWx1ZXMuIEJ1dCB3ZSdkIHN0aWxsCi0gICAgICAgICAqIGJlIGRvaW5nIGEgcm91bmQgdHJpcCB0byB0aGUgc3VwcGxpY2FudCBkYWVtb24gZm9yIGVhY2ggdmFyaWFibGUuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5TU0lEID0gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOwotICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOwotICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKLSAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB1cCB0byA0IFdFUCBrZXlzLiBOb3RlIHRoYXQgdGhlIGFjdHVhbCBrZXlzIGFyZSBub3QgcGFzc2VkIGJhY2ssCi0gICAgICAgICAqIGp1c3QgYSAiKiIgaWYgdGhlIGtleSBpcyBzZXQsIG9yIHRoZSBudWxsIHN0cmluZyBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUobmV0SWQsIFdpZmlDb25maWd1cmF0aW9uLndlcEtleVZhck5hbWVzW2ldKTsKLSAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBwcml2YXRlIHNoYXJlZCBrZXkuIE5vdGUgdGhhdCB0aGUgYWN0dWFsIGtleXMgYXJlIG5vdCBwYXNzZWQgYmFjaywKLSAgICAgICAgICoganVzdCBhICIqIiBpZiB0aGUga2V5IGlzIHNldCwgb3IgdGhlIG51bGwgc3RyaW5nIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lKTsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLnNldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsdWUgPSBtV2lmaVN0YXRlVHJhY2tlci5nZXROZXR3b3JrVmFyaWFibGUoY29uZmlnLm5ldHdvcmtJZCwKLSAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkF1dGhBbGdvcml0aG0udmFyTmFtZSk7Ci0gICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkQXV0aEFsZ29yaXRobXMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWx1ZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldE5ldHdvcmtWYXJpYWJsZShjb25maWcubmV0d29ya0lkLAotICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUpOwotICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuc2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uLkVudGVycHJpc2VGaWVsZCBmaWVsZCA6Ci0gICAgICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgIHZhbHVlID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TmV0d29ya1ZhcmlhYmxlKG5ldElkLAotICAgICAgICAgICAgICAgICAgICBmaWVsZC52YXJOYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gY29uZmlnLmVhcCkgdmFsdWUgPSByZW1vdmVEb3VibGVRdW90ZXModmFsdWUpOwotICAgICAgICAgICAgICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVEb3VibGVRdW90ZXMoU3RyaW5nIHN0cmluZykgewotICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IDIpIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSwgc3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1F1b3RlZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiAiXCIiICsgc3RyaW5nICsgIlwiIjsKKyAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRDb25maWd1cmVkTmV0d29ya3MoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzMsMjgwICs1NjUsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGFkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgc3VwcGxpZWQgbmV0d29ya0lkIGlzIC0xLCB3ZSBjcmVhdGUgYSBuZXcgZW1wdHkKLSAgICAgICAgICogbmV0d29yayBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIHRoZSBuZXR3b3JrSWQgc2hvdWxkCi0gICAgICAgICAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBpbnQgbmV0SWQgPSBjb25maWcubmV0d29ya0lkOwotICAgICAgICBib29sZWFuIG5ld05ldHdvcmsgPSBuZXRJZCA9PSAtMTsKLSAgICAgICAgYm9vbGVhbiBkb1JlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgIC8vIG5ldHdvcmtJZCBvZiAtMSBtZWFucyB3ZSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBuZXR3b3JrCi0gICAgICAgIHN5bmNocm9uaXplZCAobVdpZmlTdGF0ZVRyYWNrZXIpIHsKLSAgICAgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7Ci0gICAgICAgICAgICAgICAgbmV0SWQgPSBtV2lmaVN0YXRlVHJhY2tlci5hZGROZXR3b3JrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ldElkIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiRmFpbGVkIHRvIGFkZCBhIG5ldHdvcmshIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb1JlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OZWVkUmVjb25maWcgPSBtTmVlZFJlY29uZmlnIHx8IGRvUmVjb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYXJpYWJsZXM6IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgaWYgYSBuZXR3b3JrSWQgZm9yIGEgbm9uLWV4aXN0ZW50IG5ldHdvcmsKLSAgICAgICAgICAgICAqIHdhcyBzdXBwbGllZCwgdGhlbiB0aGUgZmlyc3Qgc2V0TmV0d29ya1ZhcmlhYmxlKCkKLSAgICAgICAgICAgICAqIHdpbGwgZmFpbCwgc28gd2UgZG9uJ3QgYm90aGVyIHRvIG1ha2UgYSBzZXBhcmF0ZSBjaGVjawotICAgICAgICAgICAgICogZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgSUQgdXAgZnJvbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLkJTU0lEICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLkJTU0lEKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgQlNTSUQ6ICIrY29uZmlnLkJTU0lEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LCBXaWZpQ29uZmlndXJhdGlvbi5LZXlNZ210LnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudC5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEtleU1hbmFnZW1lbnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBrZXlfbWdtdDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMsIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnN0cmluZ3MpOwotICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUHJvdG9jb2xzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC52YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFByb3RvY29sc1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHByb3RvOiAiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQcm90b2NvbHNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQotICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nID0KLSAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLCBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci5zdHJpbmdzKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZFBhaXJ3aXNlQ2lwaGVycy5jYXJkaW5hbGl0eSgpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUGFpcndpc2VDaXBoZXIudmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQYWlyd2lzZUNpcGhlcnNTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwYWlyd2lzZTogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUGFpcndpc2VDaXBoZXJzU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9Ci0gICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJldmVudCBjbGllbnQgc2NyZXctdXAgYnkgcGFzc2luZyBpbiBhIFdpZmlDb25maWd1cmF0aW9uIHdlIGdhdmUgaXQKLSAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmVTaGFyZWRLZXkgIT0gbnVsbCAmJiAhY29uZmlnLnByZVNoYXJlZEtleS5lcXVhbHMoIioiKSAmJgotICAgICAgICAgICAgICAgICAgICAhbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wc2tWYXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByZVNoYXJlZEtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBzazogIitjb25maWcucHJlU2hhcmVkS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgotICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHNldCB3ZXBfa2V5IitpKyI6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgewotICAgICAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZXQgd2VwX3R4X2tleWlkeDogIisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuc2V0TmV0d29ya1ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5wcmlvcml0eSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgcHJpb3JpdHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlnLmhpZGRlblNTSUQgJiYgIW1XaWZpU3RhdGVUcmFja2VyLnNldE5ldHdvcmtWYXJpYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy5oaWRkZW5TU0lEID8gMSA6IDApKSkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IGhpZGRlblNTSUQ6ICIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmhpZGRlblNTSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5zZXROZXR3b3JrVmFyaWFibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgIiArIHZhck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXRJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBhbiB1cGRhdGUsIGlmIG9uZSBvZiB0aGUgc2V0TmV0d29ya1ZhcmlhYmxlIG9wZXJhdGlvbnMgZmFpbHMsCi0gICAgICAgICAqIHdlIG1pZ2h0IHdhbnQgdG8gcm9sbCBiYWNrIGFsbCB0aGUgY2hhbmdlcyBhbHJlYWR5IG1hZGUuIEJ1dCB0aGUKLSAgICAgICAgICogY2hhbmNlcyBhcmUgdGhhdCBpZiBhbnl0aGluZyBpcyBnb2luZyB0byBnbyB3cm9uZywgaXQnbGwgaGFwcGVuCi0gICAgICAgICAqIHRoZSBmaXJzdCB0aW1lIHdlIHRyeSB0byBzZXQgb25lIG9mIHRoZSB2YXJpYWJsZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobmV3TmV0d29yaykgewotICAgICAgICAgICAgcmVtb3ZlTmV0d29yayhuZXRJZCk7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGEgbmV0d29yayB2YXJpYWJsZSwgcmVtb3ZlZCBuZXR3b3JrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5ldElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jQWRkT3JVcGRhdGVOZXR3b3JrKGNvbmZpZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOwotCi0gICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKLSAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KLSAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7Ci0KLSAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQotICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7Ci0gICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgewotICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOwotCi0gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQotICAgICAgICAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCi0gICAgICAgICAgICAvLyB2YWx1ZSB0byBXaWZpQ29uZmlndXJhdGlvbiB0byByZWZsZWN0IHRoYXQgaXQncwotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudAotICAgICAgICAgICAgU2xvZy53KFRBRywgIkZhaWxlZCB0byBsb29rLXVwIGEgc3RyaW5nOiAiICsgc3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogU2VlIHtAbGluayBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyI3JlbW92ZU5ldHdvcmsoaW50KX0KICAgICAgKiBAcGFyYW0gbmV0SWQgdGhlIGludGVnZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24KICAgICAgKiB0byB0aGUgc3VwcGxpY2FudApAQCAtMTMxNCw4ICs1NzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldElkKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLnJlbW92ZU5ldHdvcmsobmV0SWQpOworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlbW92ZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyNywxNCArNTg4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVOZXR3b3JrKGludCBuZXRJZCwgYm9vbGVhbiBkaXNhYmxlT3RoZXJzKSB7CiAgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlmbmFtZSA9IG1XaWZpU3RhdGVUcmFja2VyLmdldEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgTmV0d29ya1V0aWxzLmVuYWJsZUludGVyZmFjZShpZm5hbWUpOwotICAgICAgICBib29sZWFuIHJlc3VsdCA9IG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgTmV0d29ya1V0aWxzLmRpc2FibGVJbnRlcmZhY2UoaWZuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0VuYWJsZU5ldHdvcmsobmV0SWQsIGRpc2FibGVPdGhlcnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM0NSw4ICs1OTksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVOZXR3b3JrKGludCBuZXRJZCkgewogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwotCi0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5kaXNhYmxlTmV0d29yayhuZXRJZCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jRGlzYWJsZU5ldHdvcmsobmV0SWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM1OSw3ICs2MTIsNyBAQAogICAgICAgICAgKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLCBieSBzZW5kaW5nCiAgICAgICAgICAqIGEgc3RhdHVzIHJlcXVlc3QgdG8gdGhlIHN1cHBsaWNhbnQuCiAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZVRyYWNrZXIucmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzY5LDE4MCArNjIyLDE5IEBACiAgICAgICovCiAgICAgcHVibGljIExpc3Q8U2NhblJlc3VsdD4gZ2V0U2NhblJlc3VsdHMoKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXBseTsKLQotICAgICAgICByZXBseSA9IG1XaWZpU3RhdGVUcmFja2VyLnNjYW5SZXN1bHRzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2Nhbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7Ci0KLSAgICAgICAgaW50IGxpbmVDb3VudCA9IDA7Ci0KLSAgICAgICAgaW50IHJlcGx5TGVuID0gcmVwbHkubGVuZ3RoKCk7Ci0gICAgICAgIC8vIFBhcnNlIHRoZSByZXN1bHQgc3RyaW5nLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbGFzdCBsaW5lIGRvZXMKLSAgICAgICAgLy8gbm90IGVuZCB3aXRoIGEgbmV3bGluZS4KLSAgICAgICAgZm9yIChpbnQgbGluZUJlZyA9IDAsIGxpbmVFbmQgPSAwOyBsaW5lRW5kIDw9IHJlcGx5TGVuOyArK2xpbmVFbmQpIHsKLSAgICAgICAgICAgIGlmIChsaW5lRW5kID09IHJlcGx5TGVuIHx8IHJlcGx5LmNoYXJBdChsaW5lRW5kKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgKytsaW5lQ291bnQ7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTa2lwIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBhIGhlYWRlcgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZUVuZCA+IGxpbmVCZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZXBseS5zdWJzdHJpbmcobGluZUJlZywgbGluZUVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHBhcnNlU2NhblJlc3VsdChsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbkxpc3QuYWRkKHNjYW5SZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIm1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCBmb3I6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2NhblJlc3VsdHNMaXN0KHNjYW5MaXN0KTsKLSAgICAgICAgcmV0dXJuIHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBzY2FuIHJlc3VsdCBsaW5lIHBhc3NlZCB0byB1cyBieSB3cGFfc3VwcGxpY2FudCAoaGVscGVyKS4KLSAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwYXJzZQotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTY2FuUmVzdWx0fSBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIFNjYW5SZXN1bHQgcGFyc2VTY2FuUmVzdWx0KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWNoZSBpbXBsZW1lbnRhdGlvbiAoTGlua2VkSGFzaE1hcCkgaXMgbm90IHN5bmNocm9uaXplZCwgdGh1cywKLSAgICAgICAgICAgICAqIG11c3Qgc3luY2hyb25pemVkIGhlcmUhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVNjYW5SZXN1bHRDYWNoZSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHNjYW5SZXN1bHRQYXR0ZXJuLnNwbGl0KGxpbmUpOwotICAgICAgICAgICAgICAgIGlmICgzIDw9IHJlc3VsdC5sZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8PSA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBic3NpZCA9IHJlc3VsdFswXTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgfCBmcmVxdWVuY3kgfCBsZXZlbCB8IGZsYWdzIHwgc3NpZAotICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3VsdFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzJdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSBsZXZlbCAtPSAyNTY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGZvcm1hdHRpbmcgb2YgdGhlIHJlc3VsdHMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICogd3BhX3N1cHBsaWNhbnQgaXMgaW50ZW5kZWQgdG8gbWFrZSB0aGUgZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAqIGxpbmUgdXAgbmljZWx5IHdoZW4gcHJpbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICogbm90IHRvIG1ha2UgdGhlbSBlYXN5IHRvIHBhcnNlLiBTbyB3ZSBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvbWUgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAqIGlzIHRoZSBTU0lEIGFuZCB3aGljaCBmaWVsZCBpcyB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZsYWdzOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzNdLmNoYXJBdCgwKSA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQubGVuZ3RoID09IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9IHJlc3VsdFs0XTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIG11c3QgaGF2ZSAzIGZpZWxkczogbm8gZmxhZ3MgYW5kIHNzaWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGJzc2lkICsgc3NpZCBpcyB0aGUgaGFzaCBrZXkKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGJzc2lkICsgc3NpZDsKLSAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdCA9IG1TY2FuUmVzdWx0Q2FjaGUuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQubGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuU1NJRCA9IHNzaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmNhcGFiaWxpdGllcyA9IGZsYWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHNjYW4gcmVzdWx0cyB0aGF0IGhhdmUgbm8gU1NJRCBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgc3NpZC50cmltKCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNjYW5SZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkLCBic3NpZCwgZmxhZ3MsIGxldmVsLCBmcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY2FuUmVzdWx0Q2FjaGUucHV0KGtleSwgc2NhblJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiTWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IHRleHQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmxlbmd0aCArICIgZmllbGRzOiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjYW5SZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlICJmbGFncyIgZmllbGQgcGFzc2VkIGJhY2sgaW4gYSBzY2FuIHJlc3VsdCBieSB3cGFfc3VwcGxpY2FudCwKLSAgICAgKiBhbmQgY29uc3RydWN0IGEge0Bjb2RlIFdpZmlDb25maWd1cmF0aW9ufSB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jcnlwdGlvbiwKLSAgICAgKiBrZXkgbWFuYWdlbWVudCwgYW5kIGF1dGhlbnRpY2Fpb24gY2FwYWJpbGl0aWVzIG9mIHRoZSBhY2Nlc3MgcG9pbnQuCi0gICAgICogQHBhcmFtIGZsYWdzIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgd3BhX3N1cHBsaWNhbnQKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdCwgZmlsbGVkIGluCi0gICAgICovCi0gICAgV2lmaUNvbmZpZ3VyYXRpb24gcGFyc2VTY2FuRmxhZ3MoU3RyaW5nIGZsYWdzKSB7Ci0gICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGlmIChmbGFncy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuc2V0KFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuTk9ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gLi4uIHRvIGJlIGltcGxlbWVudGVkCi0gICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgc3VwcGxpY2FudCB0byBwZXJzaXN0IHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3Jrcy4KICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZAorICAgICAqCisgICAgICogVE9ETzogZGVwcmVjYXRlIHRoaXMKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpU3RhdGVUcmFja2VyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtV2lmaVN0YXRlVHJhY2tlci5zYXZlQ29uZmlnKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICYmIG1OZWVkUmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICBtTmVlZFJlY29uZmlnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpZmlTdGF0ZVRyYWNrZXIucmVsb2FkQ29uZmlnKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLk5FVFdPUktfSURTX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJbmZvcm0gdGhlIGJhY2t1cCBtYW5hZ2VyIGFib3V0IGEgZGF0YSBjaGFuZ2UKLSAgICAgICAgSUJhY2t1cE1hbmFnZXIgaWJtID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQkFDS1VQX1NFUlZJQ0UpKTsKLSAgICAgICAgaWYgKGlibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlibS5kYXRhQ2hhbmdlZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBsYXRlcgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jU2F2ZUNvbmZpZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1Nyw3ICs2NDksNyBAQAogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAogICAgICAqIHtAY29kZSBudW1DaGFubmVsc30gaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVscyhpbnQgbnVtQ2hhbm5lbHMsIGJvb2xlYW4gcGVyc2lzdCkgewogICAgICAgICBTbG9nLmkoVEFHLCAiV2lmaVNlcnZpY2UgdHJ5aW5nIHRvIHNldE51bUFsbG93ZWQgdG8gIitudW1DaGFubmVscysKICAgICAgICAgICAgICAgICAiIHdpdGggcGVyc2lzdCBzZXQgdG8gIitwZXJzaXN0KTsKICAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKQEAgLTE1NzksMjggKzY3MSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1XaWZpSGFuZGxlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfU0VUX0NIQU5ORUxTLCBudW1DaGFubmVscywgKHBlcnNpc3QgPyAxIDogMCkpLnNlbmRUb1RhcmdldCgpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIG51bWJlciBvZiBhbGxvd2VkIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyBzeW5jaHJvbm91c2x5Ci0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHBhcmFtIHBlcnNpc3Qge0Bjb2RlIHRydWV9IGlmIHRoZSBzZXR0aW5nIHNob3VsZCBiZSByZW1lbWJlcmVkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVsc0Jsb2NraW5nKGludCBudW1DaGFubmVscywgYm9vbGVhbiBwZXJzaXN0KSB7CiAgICAgICAgIGlmIChwZXJzaXN0KSB7CiAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9OVU1fQUxMT1dFRF9DSEFOTkVMUywKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlci5zZXROdW1BbGxvd2VkQ2hhbm5lbHMobnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldE51bUFsbG93ZWRDaGFubmVscyhudW1DaGFubmVscyk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjE4LDcgKzY5Nyw3IEBACiAgICAgICAgICAqIFdpLUZpIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZCksIGdldCB0aGUgdmFsdWUgZnJvbQogICAgICAgICAgKiBTZXR0aW5ncy4KICAgICAgICAgICovCi0gICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CisgICAgICAgIG51bUNoYW5uZWxzID0gbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7CiAgICAgICAgIGlmIChudW1DaGFubmVscyA8IDApIHsKICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMsCkBAIC0xNjQ0LDcgKzcyMyw3NiBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaGNwSW5mbyBnZXREaGNwSW5mbygpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVUcmFja2VyLmdldERoY3BJbmZvKCk7CisgICAgICAgIHJldHVybiBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0RGhjcEluZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RhcnRXaWZpfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRXaWZpKCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworICAgICAgICAvKiBUT0RPOiBtYXkgYmUgYWRkIHBlcm1pc3Npb25zIGZvciBhY2Nlc3Mgb25seSB0byBjb25uZWN0aXZpdHkgc2VydmljZQorICAgICAgICAgKiBUT0RPOiBpZiBhIHN0YXJ0IGlzc3VlZCwga2VlcCB3aWZpIGFsaXZlIHVudGlsIGEgc3RvcCBpc3N1ZWQgaXJyZXNwZWN0aXZlCisgICAgICAgICAqIG9mIFdpZmlMb2NrICYgZGV2aWNlIGlkbGUgc3RhdHVzIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQodHJ1ZSk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjc3RvcFdpZml9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wV2lmaSgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgLyogVE9ETzogbWF5IGJlIGFkZCBwZXJtaXNzaW9ucyBmb3IgYWNjZXNzIG9ubHkgdG8gY29ubmVjdGl2aXR5IHNlcnZpY2UKKyAgICAgICAgICogVE9ETzogaWYgYSBzdG9wIGlzIGlzc3VlZCwgd2lmaSBpcyBicm91Z2h0IHVwIG9ubHkgYnkgc3RhcnRXaWZpCisgICAgICAgICAqIHVubGVzcyB3aWZpIGVuYWJsZWQgc3RhdHVzIGlzIHRvZ2dsZWQKKyAgICAgICAgICovCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHNlZSB7QGxpbmsgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlciNhZGRUb0JsYWNrbGlzdH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFRvQmxhY2tsaXN0KFN0cmluZyBic3NpZCkgeworICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOworCisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWUge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIjY2xlYXJCbGFja2xpc3R9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5jbGVhckJsYWNrbGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuY29ubmVjdE5ldHdvcmsobmV0d29ya0lkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmNvbm5lY3ROZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGVuZm9yY2VDaGFuZ2VQZXJtaXNzaW9uKCk7CisgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgZW5mb3JjZUNoYW5nZVBlcm1pc3Npb24oKTsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZm9yZ2V0TmV0d29yayhuZXRJZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CkBAIC0xNjYzLDE3ICs4MTEsMTEgQEAKICAgICAgICAgICAgICAgICBtQWxhcm1NYW5hZ2VyLmNhbmNlbChtSWRsZUludGVudCk7CiAgICAgICAgICAgICAgICAgbURldmljZUlkbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuZW5hYmxlUnNzaVBvbGxpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLyogREhDUCBvciBvdGhlciB0ZW1wb3JhcnkgZmFpbHVyZXMgaW4gdGhlIHBhc3QgY2FuIHByZXZlbnQKLSAgICAgICAgICAgICAgICAgKiBhIGRpc2FibGVkIG5ldHdvcmsgZnJvbSBiZWluZyBjb25uZWN0ZWQgdG8sIGVuYWJsZSBvbiBzY3JlZW4gb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlTdGF0ZVRyYWNrZXIuaXNBbnlOZXR3b3JrRGlzYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlTmV0d29ya3NNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLmVuYWJsZVJzc2lQb2xsaW5nKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpIHsKICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiQUNUSU9OX1NDUkVFTl9PRkYiKTsKICAgICAgICAgICAgICAgICBtU2NyZWVuT2ZmID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5lbmFibGVSc3NpUG9sbGluZyhmYWxzZSk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuZW5hYmxlUnNzaVBvbGxpbmcoZmFsc2UpOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IGEgdGltZXIgdG8gcHV0IFdpLUZpIHRvIHNsZWVwLCBidXQgb25seSBpZiB0aGUgc2NyZWVuIGlzIG9mZgogICAgICAgICAgICAgICAgICAqIEFORCB0aGUgInN0YXkgb24gd2hpbGUgcGx1Z2dlZCBpbiIgc2V0dGluZyBkb2Vzbid0IG1hdGNoIHRoZQpAQCAtMTY4MSwxMSArODIzLDExIEBACiAgICAgICAgICAgICAgICAgICogb3IgcGx1Z2dlZCBpbiB0byBBQykuCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRXaWZpU3RheUF3YWtlKHN0YXlBd2FrZUNvbmRpdGlvbnMsIG1QbHVnZ2VkVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgV2lmaUluZm8gaW5mbyA9IG1XaWZpU3RhdGVUcmFja2VyLnJlcXVlc3RDb25uZWN0aW9uSW5mbygpOworICAgICAgICAgICAgICAgICAgICBXaWZpSW5mbyBpbmZvID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY1JlcXVlc3RDb25uZWN0aW9uSW5mbygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRvIGdvIHRvIHNsZWVwIGltbWVkaWF0ZWx5LCBidXQgdGhpcyBjYXVzZWQgc29tZSByYWNlIGNvbmRpdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGltZSB0byB0cmFjayBkb3duIGZvciB0aGlzIHJlbGVhc2UuICBEZWxheSBpbnN0ZWFkLCBidXQgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHdlIHdvdWxkIGlmIGNvbm5lY3RlZCAoYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gdHJhY2sgZG93biBmb3IgdGhpcyByZWxlYXNlLiAgRGVsYXkgaW5zdGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYXMgbG9uZyBhcyB3ZSB3b3VsZCBpZiBjb25uZWN0ZWQgKGJlbG93KQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGZpeCB0aGUgcmFjZSBjb25kaXRpb25zIGFuZCBzd2l0Y2ggYmFjayB0byB0aGUgaW1tZWRpYXRlIHR1cm4tb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAoMio2MCoxMDAwKTsgLy8gMiBtaW4KICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJzZXR0aW5nIEFDVElPTl9ERVZJQ0VfSURMRSB0aW1lciBmb3IgMTIwLDAwMCBtcyIpOwpAQCAtMTczMiw3ICs4NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldEJsdWV0b290aFNjYW5Nb2RlKGlzQmx1ZXRvb3RoUGxheWluZyk7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc3MSw3ICs5MTMsNyBAQAogICAgICAgICAgKiBvZiB7QGNvZGUgMH0gaXNuJ3QgcmVhbGx5IGEgcGx1Z2dlZCB0eXBlLCBidXQgcmF0aGVyIGFuIGluZGljYXRpb24gdGhhdCB0aGUKICAgICAgICAgICogZGV2aWNlIGlzbid0IHBsdWdnZWQgaW4gYXQgYWxsLCB0aGVyZSBpcyBubyBiaXQgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhCiAgICAgICAgICAqIHtAY29kZSBwbHVnZ2VkVHlwZX0gdmFsdWUgb2Yge0Bjb2RlIDB9LiBUaGF0IGlzIHdoeSB3ZSBzaGlmdCBieQotICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGUmbmJzcDsmIzgyMTI7Jm5ic3A7MX0gaW5zdGVhZCBvZiBieSB7QGNvZGUgcGx1Z2dlZFR5cGV9LgorICAgICAgICAgKiB7QGNvZGUgcGx1Z2dlZFR5cGUgLSAxfSBpbnN0ZWFkIG9mIGJ5IHtAY29kZSBwbHVnZ2VkVHlwZX0uCiAgICAgICAgICAqIEBwYXJhbSBzdGF5QXdha2VDb25kaXRpb25zIGEgYml0IHN0cmluZyBzcGVjaWZ5aW5nIHdoaWNoICJwbHVnZ2VkIHR5cGVzIiBzaG91bGQKICAgICAgICAgICoga2VlcCB0aGUgZGV2aWNlIChhbmQgaGVuY2UgV2ktRmkpIGF3YWtlLgogICAgICAgICAgKiBAcGFyYW0gcGx1Z2dlZFR5cGUgdGhlIHR5cGUgb2YgcGx1ZyAoVVNCLCBBQywgb3Igbm9uZSkgZm9yIHdoaWNoIHRoZSBjaGVjayBpcwpAQCAtMTc4NCw4NSArOTI2LDM2IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRFbmFibGVNZXNzYWdlKGJvb2xlYW4gZW5hYmxlLCBib29sZWFuIHBlcnNpc3QsIGludCB1aWQpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfRU5BQkxFX1dJRkkgOiBNRVNTQUdFX0RJU0FCTEVfV0lGSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBlcnNpc3QgPyAxIDogMCksIHVpZCk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFN0YXJ0TWVzc2FnZShpbnQgbG9ja01vZGUpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX1NUQVJUX1dJRkksIGxvY2tNb2RlLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShib29sZWFuIGVuYWJsZSwgV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgaW50IHVpZCkgewotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgKGVuYWJsZSA/IE1FU1NBR0VfU1RBUlRfQUNDRVNTX1BPSU5UIDogTUVTU0FHRV9TVE9QX0FDQ0VTU19QT0lOVCksCi0gICAgICAgICAgICAgICAgdWlkLCAwLCB3aWZpQ29uZmlnKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEVuYWJsZU5ldHdvcmtzTWVzc2FnZSgpIHsKLSAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdpZmlIYW5kbGVyLCBNRVNTQUdFX0VOQUJMRV9ORVRXT1JLUykuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpZmlTdGF0ZSgpIHsKLSAgICAgICAgLy8gc2VuZCBhIG1lc3NhZ2Ugc28gaXQncyBhbGwgc2VyaWFsaXplZAotICAgICAgICBNZXNzYWdlLm9idGFpbihtV2lmaUhhbmRsZXIsIE1FU1NBR0VfVVBEQVRFX1NUQVRFLCAwLCAwKS5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9VcGRhdGVXaWZpU3RhdGUoKSB7CiAgICAgICAgIGJvb2xlYW4gd2lmaUVuYWJsZWQgPSBnZXRQZXJzaXN0ZWRXaWZpRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuOworICAgICAgICBib29sZWFuIGFpcnBsYW5lTW9kZSA9IGlzQWlycGxhbmVNb2RlT24oKSAmJiAhbUFpcnBsYW5lTW9kZU92ZXJ3cmlkZGVuLmdldCgpOwogICAgICAgICBib29sZWFuIGxvY2tIZWxkID0gbUxvY2tzLmhhc0xvY2tzKCk7Ci0gICAgICAgIGludCBzdHJvbmdlc3RMb2NrTW9kZSA9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICBpbnQgc3Ryb25nZXN0TG9ja01vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlRW5hYmxlZCA9IHdpZmlFbmFibGVkICYmICFhaXJwbGFuZU1vZGU7CiAgICAgICAgIGJvb2xlYW4gd2lmaVNob3VsZEJlU3RhcnRlZCA9ICFtRGV2aWNlSWRsZSB8fCBsb2NrSGVsZDsKLQotICAgICAgICBpZiAobG9ja0hlbGQpIHsKKyAgICAgICAgaWYgKG1EZXZpY2VJZGxlICYmIGxvY2tIZWxkKSB7CiAgICAgICAgICAgICBzdHJvbmdlc3RMb2NrTW9kZSA9IG1Mb2Nrcy5nZXRTdHJvbmdlc3RMb2NrTW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElmIGRldmljZSBpcyBub3QgaWRsZSwgbG9ja21vZGUgY2Fubm90IGJlIHNjYW4gb25seSAqLwotICAgICAgICBpZiAoIW1EZXZpY2VJZGxlICYmIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgIH0KIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaWZpSGFuZGxlcikgewotICAgICAgICAgICAgaWYgKChtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSA9PSBXSUZJX1NUQVRFX0VOQUJMSU5HKSAmJiAhYWlycGxhbmVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLworICAgICAgICBpZiAoYWlycGxhbmVNb2RlKSB7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5zZXRXaWZpQXBFbmFibGVkKG51bGwsIGZhbHNlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBEaXNhYmxlIHRldGhlcmluZyB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgICAgICAgICAgaWYgKGFpcnBsYW5lTW9kZSAmJgotICAgICAgICAgICAgICAgIChtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTElORyB8fCBtV2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSkgewotICAgICAgICAgICAgICAgIHNXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgc2VuZEFjY2Vzc1BvaW50TWVzc2FnZShmYWxzZSwgbnVsbCwgbUxhc3RBcEVuYWJsZVVpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpZmlTaG91bGRCZVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEVuYWJsZU1lc3NhZ2UodHJ1ZSwgZmFsc2UsIG1MYXN0RW5hYmxlVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXJ0TWVzc2FnZShzdHJvbmdlc3RMb2NrTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHdha2VMb2NrVGltZW91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTU9CSUxFX0RBVEFfVFJBTlNJVElPTl9XQUtFTE9DS19USU1FT1VUX01TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9XQUtFTE9DS19USU1FT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogV2UgYXJlIGFzc3VtaW5nIHRoYXQgQ29ubmVjdGl2aXR5U2VydmljZSBjYW4gbWFrZQotICAgICAgICAgICAgICAgICAgICAgKiBhIHRyYW5zaXRpb24gdG8gY2VsbHVsYXIgZGF0YSB3aXRoaW4gd2FrZUxvY2tUaW1lb3V0IHRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAqIFRoZSB3YWtlbG9jayBpcyByZWxlYXNlZCBieSB0aGUgZGVsYXllZCBtZXNzYWdlLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5hY3F1aXJlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1FU1NBR0VfU1RPUF9XSUZJKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSywgd2FrZUxvY2tUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmICh3aWZpU2hvdWxkQmVFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVNob3VsZEJlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFdpZmlFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldFNjYW5Pbmx5TW9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9uZ2VzdExvY2tNb2RlID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnNldERyaXZlclN0YXJ0KHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgIHNlbmRFbmFibGVNZXNzYWdlKGZhbHNlLCBmYWxzZSwgbUxhc3RFbmFibGVVaWQpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnJlcXVlc3RDbVdha2VMb2NrKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0RHJpdmVyU3RhcnQoZmFsc2UpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTAwLDgxICs5OTMsNiBAQAogICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5BSVJQTEFORV9NT0RFX09OLCAwKSA9PSAxOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCBhbGxvd3MgcG9zdGluZyB0byB0aGUgV2lmaVRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFdpZmlIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHB1YmxpYyBXaWZpSGFuZGxlcihMb29wZXIgbG9vcGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUVuYWJsZWRCbG9ja2luZyh0cnVlLCBtc2cuYXJnMSA9PSAxLCBtc2cuYXJnMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtV2lmaVdhdGNoZG9nU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2lmaVdhdGNoZG9nU2VydmljZSA9IG5ldyBXaWZpV2F0Y2hkb2dTZXJ2aWNlKG1Db250ZXh0LCBtV2lmaVN0YXRlVHJhY2tlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfU1RBUlRfV0lGSToKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc2V0U2Nhbk9ubHlNb2RlKG1zZy5hcmcxID09IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkpOwotICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLnNldEhpZ2hQZXJmTW9kZShtc2cuYXJnMSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1VQREFURV9TVEFURToKLSAgICAgICAgICAgICAgICAgICAgZG9VcGRhdGVXaWZpU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfRElTQUJMRV9XSUZJOgotICAgICAgICAgICAgICAgICAgICAvLyBhIG5vbi16ZXJvIG1zZy5hcmcxIHZhbHVlIG1lYW5zIHRoZSAiZW5hYmxlZCIgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgcGVyc2lzdGVkCi0gICAgICAgICAgICAgICAgICAgIHNldFdpZmlFbmFibGVkQmxvY2tpbmcoZmFsc2UsIG1zZy5hcmcxID09IDEsIG1zZy5hcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlXYXRjaGRvZ1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9TVE9QX1dJRkk6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmRpc2Nvbm5lY3RBbmRTdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHJlbGVhc2Ugd2FrZWxvY2sKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfUkVMRUFTRV9XQUtFTE9DSzoKLSAgICAgICAgICAgICAgICAgICAgc0RyaXZlclN0b3BXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUQVJUX0FDQ0VTU19QT0lOVDoKLSAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwRW5hYmxlZEJsb2NraW5nKHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NUT1BfQUNDRVNTX1BPSU5UOgotICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBFbmFibGVkQmxvY2tpbmcoZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXaWZpQ29uZmlndXJhdGlvbikgbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHNXYWtlTG9jay5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNRVNTQUdFX1NFVF9DSEFOTkVMUzoKLSAgICAgICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzQmxvY2tpbmcobXNnLmFyZzEsIG1zZy5hcmcyID09IDEpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTUVTU0FHRV9FTkFCTEVfTkVUV09SS1M6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLmVuYWJsZUFsbE5ldHdvcmtzKGdldENvbmZpZ3VyZWROZXR3b3JrcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3LCBTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChtQ29udGV4dC5jaGVja0NhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKQpAQCAtMTk4NCwxNyArMTAwMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICArICIsIHVpZD0iICsgQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcHcucHJpbnRsbigiV2ktRmkgaXMgIiArIHN0YXRlTmFtZShtV2lmaVN0YXRlVHJhY2tlci5nZXRXaWZpU3RhdGUoKSkpOworICAgICAgICBwdy5wcmludGxuKCJXaS1GaSBpcyAiICsgbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFdpZmlTdGF0ZUJ5TmFtZSgpKTsKICAgICAgICAgcHcucHJpbnRsbigiU3RheS1hd2FrZSBjb25kaXRpb25zOiAiICsKICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlNUQVlfT05fV0hJTEVfUExVR0dFRF9JTiwgMCkpOwogICAgICAgICBwdy5wcmludGxuKCk7CiAKICAgICAgICAgcHcucHJpbnRsbigiSW50ZXJuYWwgc3RhdGU6Iik7Ci0gICAgICAgIHB3LnByaW50bG4obVdpZmlTdGF0ZVRyYWNrZXIpOworICAgICAgICBwdy5wcmludGxuKG1XaWZpU3RhdGVNYWNoaW5lKTsKICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMYXRlc3Qgc2NhbiByZXN1bHRzOiIpOwotICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZVRyYWNrZXIuZ2V0U2NhblJlc3VsdHNMaXN0KCk7CisgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBtV2lmaVN0YXRlTWFjaGluZS5zeW5jR2V0U2NhblJlc3VsdHNMaXN0KCk7CiAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsICYmIHNjYW5SZXN1bHRzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICBwdy5wcmludGxuKCIgIEJTU0lEICAgICAgICAgICAgICBGcmVxdWVuY3kgICBSU1NJICBGbGFncyAgICAgICAgICAgICBTU0lEIik7CiAgICAgICAgICAgICBmb3IgKFNjYW5SZXN1bHQgciA6IHNjYW5SZXN1bHRzKSB7CkBAIC0yMDA4LDMzICsxMDI2LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigpOwogICAgICAgICBwdy5wcmludGxuKCJMb2NrcyBhY3F1aXJlZDogIiArIG1GdWxsTG9ja3NBY3F1aXJlZCArICIgZnVsbCwgIiArCi0gICAgICAgICAgICAgICAgbUZ1bGxIaWdoUGVyZkxvY2tzQWNxdWlyZWQgKyAiIGZ1bGwgaGlnaCBwZXJmLCAiICsKICAgICAgICAgICAgICAgICBtU2NhbkxvY2tzQWNxdWlyZWQgKyAiIHNjYW4iKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgcmVsZWFzZWQ6ICIgKyBtRnVsbExvY2tzUmVsZWFzZWQgKyAiIGZ1bGwsICIgKwotICAgICAgICAgICAgICAgIG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkICsgIiBmdWxsIGhpZ2ggcGVyZiwgIiArCiAgICAgICAgICAgICAgICAgbVNjYW5Mb2Nrc1JlbGVhc2VkICsgIiBzY2FuIik7CiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiTG9ja3MgaGVsZDoiKTsKICAgICAgICAgbUxvY2tzLmR1bXAocHcpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0ZU5hbWUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHdpZmlTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7Ci0gICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOwotICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBjbGFzcyBXaWZpTG9jayBleHRlbmRzIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgV2lmaUxvY2soaW50IGxvY2tNb2RlLCBTdHJpbmcgdGFnLCBJQmluZGVyIGJpbmRlcikgewogICAgICAgICAgICAgc3VwZXIobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIwNjYsMTUgKzEwNjUsMTEgQEAKICAgICAgICAgICAgIGlmIChtTGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEw7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRnVsbEhpZ2hQZXJmTG9ja3NBY3F1aXJlZCA+IG1GdWxsSGlnaFBlcmZMb2Nrc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjsKKyAgICAgICAgICAgIGZvciAoV2lmaUxvY2sgbCA6IG1MaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGwubU1vZGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1GdWxsTG9ja3NBY3F1aXJlZCA+IG1GdWxsTG9ja3NSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTDsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcmV0dXJuIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk7CiAgICAgICAgIH0KIApAQCAtMjExMywxMSArMTEwOCw3IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhY3F1aXJlV2lmaUxvY2soSUJpbmRlciBiaW5kZXIsIGludCBsb2NrTW9kZSwgU3RyaW5nIHRhZykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLldBS0VfTE9DSywgbnVsbCk7Ci0gICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJgotICAgICAgICAgICAgICAgIGxvY2tNb2RlICE9IFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFkgJiYKLSAgICAgICAgICAgICAgICBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTF9ISUdIX1BFUkYpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJJbGxlZ2FsIGFyZ3VtZW50LCBsb2NrTW9kZT0gIiArIGxvY2tNb2RlKTsKLSAgICAgICAgICAgIGlmIChEQkcpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2tNb2RlPSIgKyBsb2NrTW9kZSk7CisgICAgICAgIGlmIChsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfRlVMTCAmJiBsb2NrTW9kZSAhPSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgV2lmaUxvY2sgd2lmaUxvY2sgPSBuZXcgV2lmaUxvY2sobG9ja01vZGUsIHRhZywgYmluZGVyKTsKQEAgLTIxMzksMTIgKzExMzAsNiBAQAogICAgICAgICAgICAgICAgICsrbUZ1bGxMb2Nrc0FjcXVpcmVkOwogICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja0FjcXVpcmVkKHVpZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRjoKLSAgICAgICAgICAgICAgICArK21GdWxsSGlnaFBlcmZMb2Nrc0FjcXVpcmVkOwotICAgICAgICAgICAgICAgIC8qIFRyZWF0IGhpZ2ggcG93ZXIgYXMgYSBmdWxsIGxvY2sgZm9yIGJhdHRlcnkgc3RhdHMgKi8KLSAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tBY3F1aXJlZCh1aWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgICAgICBjYXNlIFdpZmlNYW5hZ2VyLldJRklfTU9ERV9TQ0FOX09OTFk6CiAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzQWNxdWlyZWQ7CiAgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlU2NhbldpZmlMb2NrQWNxdWlyZWQodWlkKTsKQEAgLTIxODQsMTAgKzExNjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbExvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVGdWxsV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV2lmaU1hbmFnZXIuV0lGSV9NT0RFX0ZVTExfSElHSF9QRVJGOgotICAgICAgICAgICAgICAgICAgICAgICAgKyttRnVsbEhpZ2hQZXJmTG9ja3NSZWxlYXNlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZUZ1bGxXaWZpTG9ja1JlbGVhc2VkKHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXaWZpTWFuYWdlci5XSUZJX01PREVfU0NBTl9PTkxZOgogICAgICAgICAgICAgICAgICAgICAgICAgKyttU2NhbkxvY2tzUmVsZWFzZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVTY2FuV2lmaUxvY2tSZWxlYXNlZCh1aWQpOwpAQCAtMjI1OCw3ICsxMjM5LDcgQEAKICAgICAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLnN0YXJ0UGFja2V0RmlsdGVyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjczLDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgLy8gb3VyIG5ldyBzaXplID09IDEgKGZpcnN0IGNhbGwpLCBidXQgdGhpcyBmdW5jdGlvbiB3b24ndAogICAgICAgICAgICAgLy8gYmUgY2FsbGVkIG9mdGVuIGFuZCBieSBtYWtpbmcgdGhlIHN0b3BQYWNrZXQgY2FsbCBlYWNoCiAgICAgICAgICAgICAvLyB0aW1lIHdlJ3JlIGxlc3MgZnJhZ2lsZSBhbmQgc2VsZi1oZWFsaW5nLgotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RvcFBhY2tldEZpbHRlcmluZygpOwogICAgICAgICB9CiAKICAgICAgICAgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CkBAIC0yMzEwLDcgKzEyOTEsNyBAQAogICAgICAgICAgICAgcmVtb3ZlZC51bmxpbmtEZWF0aFJlY2lwaWVudCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtTXVsdGljYXN0ZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKICAgICAgICAgfQogCiAgICAgICAgIExvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTIzMjksNCArMTMxMCwxNDQgQEAKICAgICAgICAgICAgIHJldHVybiAobU11bHRpY2FzdGVycy5zaXplKCkgPiAwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0FuZFNldE5vdGlmaWNhdGlvbigpIHsKKyAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgorICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOworCisgICAgICAgIFN0YXRlIHN0YXRlID0gbU5ldHdvcmtJbmZvLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQorICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgYW4gb3BlbiBuZXR3b3JrCisgICAgICAgICAgICBMaXN0PFNjYW5SZXN1bHQ+IHNjYW5SZXN1bHRzID0gbVdpZmlTdGF0ZU1hY2hpbmUuc3luY0dldFNjYW5SZXN1bHRzTGlzdCgpOworICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtT3Blbk5ldHdvcmtzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2NhblJlc3VsdHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gc2NhblJlc3VsdHMuZ2V0KGkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzY2FuUmVzdWx0LmNhcGFiaWxpdGllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU9wZW5OZXR3b3JrcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG51bU9wZW5OZXR3b3JrcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPj0gTlVNX1NDQU5TX0JFRk9SRV9BQ1RVQUxMWV9TQ0FOTklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlJ3ZlIHNjYW5uZWQgY29udGludW91c2x5IGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBOVU1fU0NBTlNfQkVGT1JFX05PVElGSUNBVElPTiB0aW1lcy4gVGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb2JhYmx5IGRvZXMgbm90IGhhdmUgYSByZW1lbWJlcmVkIG5ldHdvcmsgaW4gcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvdGhlcndpc2Ugc3VwcGxpY2FudCB3b3VsZCBoYXZlIHRyaWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhc3NvY2lhdGUgYW5kIHRodXMgcmVzZXR0aW5nIHRoaXMgY291bnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZSh0cnVlLCBudW1PcGVuTmV0d29ya3MsIGZhbHNlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0cmFja2luZyB3aGV0aGVyIGEgbm90aWZpY2F0aW9uIGhhcyBiZWVuCisgICAgICogc2hvd24gcmVjZW50bHkgYW5kIGNsZWFycyB0aGUgY3VycmVudCBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uKCkgeworICAgICAgICBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSA9IDA7CisgICAgICAgIG1OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID0gMDsKKyAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgb3IgZG9uJ3QgZGlzcGxheSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZXJlIGFyZSBvcGVuIFdpLUZpIG5ldHdvcmtzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIHtAY29kZSB0cnVlfSBpZiBub3RpZmljYXRpb24gc2hvdWxkIGJlIHZpc2libGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHBhcmFtIG51bU5ldHdvcmtzIHRoZSBudW1iZXIgbmV0d29ya3Mgc2VlbgorICAgICAqIEBwYXJhbSBmb3JjZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2Ugbm90aWZpY2F0aW9uIHRvIGJlIHNob3duL25vdC1zaG93biwKKyAgICAgKiBldmVuIGlmIGl0IGlzIGFscmVhZHkgc2hvd24vbm90LXNob3duLgorICAgICAqIEBwYXJhbSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlCisgICAgICogdmlzaWJsZSBvciBpbnZpc2libGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE5vdGlmaWNhdGlvblZpc2libGUoYm9vbGVhbiB2aXNpYmxlLCBpbnQgbnVtTmV0d29ya3MsIGJvb2xlYW4gZm9yY2UsCisgICAgICAgICAgICBpbnQgZGVsYXkpIHsKKworICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKKyAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKKyAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93CisgICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKKyAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQorCisgICAgICAgIC8vIElmIGl0IHNob3VsZCBiZSBoaWRkZW4gYW5kIGl0IGlzIGFscmVhZHkgaGlkZGVuLCB0aGVuIG5vb3AKKyAgICAgICAgaWYgKCF2aXNpYmxlICYmICFtTm90aWZpY2F0aW9uU2hvd24gJiYgIWZvcmNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbgorICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbU5vdGlmaWNhdGlvblJlcGVhdFRpbWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgTm90aWZpY2F0aW9uIG9iamVjdC4KKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7CisKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOworCisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLm5vdGlmeShJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChJQ09OX05FVFdPUktTX0FWQUlMQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBtTm90aWZpY2F0aW9uU2hvd24gPSB2aXNpYmxlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisKKyAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgeworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04pLCB0cnVlLCB0aGlzKTsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZCA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sIDEpID09IDE7CisgICAgICAgIH0KKyAgICB9CisKKwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCmluZGV4IDQ0NWRkMDMuLjQ2ZDZiZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLlNjYW5SZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5uZXQud2lmaS5XaWZpSW5mbzsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzcsNyArNzYsNiBAQAogICAgIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwotICAgIHByaXZhdGUgV2lmaVN0YXRlVHJhY2tlciBtV2lmaVN0YXRlVHJhY2tlcjsKICAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XaWZpTWFuYWdlcjsKICAgICAKICAgICAvKioKQEAgLTEwOCwxMCArMTA2LDkgQEAKICAgICAvKiogV2hldGhlciB0aGUgY3VycmVudCBBUCBjaGVjayBzaG91bGQgYmUgY2FuY2VsZWQuICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG1TaG91bGRDYW5jZWw7CiAgICAgCi0gICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQsIFdpZmlTdGF0ZVRyYWNrZXIgd2lmaVN0YXRlVHJhY2tlcikgeworICAgIFdpZmlXYXRjaGRvZ1NlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbUNvbnRlbnRSZXNvbHZlciA9IGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgIG1XaWZpU3RhdGVUcmFja2VyID0gd2lmaVN0YXRlVHJhY2tlcjsKICAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwogICAgICAgICAKICAgICAgICAgY3JlYXRlVGhyZWFkKCk7CkBAIC0yNzUsMTIgKzI3MiwxMyBAQAogICAgIC8qKgogICAgICAqIFVucmVnaXN0ZXIgYnJvYWRjYXN0cyBhbmQgcXVpdCB0aGUgd2F0Y2hkb2cgdGhyZWFkCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7Ci0gICAgICAgIHVucmVnaXN0ZXJGb3JXaWZpQnJvYWRjYXN0cygpOwotICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS51bnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKG1Db250ZW50T2JzZXJ2ZXIpOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXQoKTsKLSAgICB9CisgICAgLy9UT0RPOiBDaGFuZ2UgYmFjayB0byBydW5uaW5nIFdXUyB3aGVuIG5lZWRlZAorLy8gICAgcHJpdmF0ZSB2b2lkIHF1aXQoKSB7CisvLyAgICAgICAgdW5yZWdpc3RlckZvcldpZmlCcm9hZGNhc3RzKCk7CisvLyAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkudW5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihtQ29udGVudE9ic2VydmVyKTsKKy8vICAgICAgICBtSGFuZGxlci5yZW1vdmVBbGxBY3Rpb25zKCk7CisvLyAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdCgpOworLy8gICAgfQogCiAgICAgLyoqCiAgICAgICogV2FpdHMgZm9yIHRoZSBtYWluIHdhdGNoZG9nIHRocmVhZCB0byBjcmVhdGUgdGhlIGhhbmRsZXIuCkBAIC03NTEsNyArNzQ5LDcgQEAKICAgICAgICAgLy8gQmxhY2sgbGlzdCB0aGlzICJiYWQiIEFQLCB0aGlzIHdpbGwgY2F1c2UgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvIGFub3RoZXIKICAgICAgICAgYmxhY2tsaXN0QXAoYXAuYnNzaWQpOwogICAgICAgICAvLyBJbml0aWF0ZSBhbiBhc3NvY2lhdGlvbiB0byBhbiBhbHRlcm5hdGUgQVAKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgbVdpZmlNYW5hZ2VyLnJlYXNzb2NpYXRlKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGJsYWNrbGlzdEFwKFN0cmluZyBic3NpZCkgewpAQCAtNzYyLDEwICs3NjAsNyBAQAogICAgICAgICAvLyBCZWZvcmUgdGFraW5nIGFjdGlvbiwgbWFrZSBzdXJlIHdlIHNob3VsZCBub3QgY2FuY2VsIG91ciBwcm9jZXNzaW5nCiAgICAgICAgIGlmIChzaG91bGRDYW5jZWwoKSkgcmV0dXJuOwogICAgICAgICAKLSAgICAgICAgaWYgKCFtV2lmaVN0YXRlVHJhY2tlci5hZGRUb0JsYWNrbGlzdChic3NpZCkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgIC8vU2xvZy5lKFRBRywgIkJsYWNrbGlzdGluZyAiICsgYnNzaWQgKyAiIGZhaWxlZCIpOwotICAgICAgICB9CisgICAgICAgIG1XaWZpTWFuYWdlci5hZGRUb0JsYWNrbGlzdChic3NpZCk7CiAKICAgICAgICAgaWYgKEQpIHsKICAgICAgICAgICAgIG15TG9nRCgiQmxhY2tsaXN0aW5nICIgKyBic3NpZCk7CkBAIC04NjAsMTAgKzg1NSw3IEBACiAgICAgICAgICAgICAgKiAoYW5kIGJsYWNrbGlzdGVkIHRoZW0pLiBDbGVhciB0aGUgYmxhY2tsaXN0IHNvIHRoZSBBUCB3aXRoIGJlc3QKICAgICAgICAgICAgICAqIHNpZ25hbCBpcyBjaG9zZW4uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghbVdpZmlTdGF0ZVRyYWNrZXIuY2xlYXJCbGFja2xpc3QoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBrbm93biBidWcgd2hlcmUgdGhpcyBtZXRob2QgcmV0dXJucyBmYWlsdXJlIG9uIHN1Y2Nlc3MKLSAgICAgICAgICAgICAgICAvL1Nsb2cuZShUQUcsICJDbGVhcmluZyBibGFja2xpc3QgZmFpbGVkIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKFYpIHsKICAgICAgICAgICAgICAgICBteUxvZ1YoImhhbmRsZVNsZWVwOiBTZXQgc3RhdGUgdG8gU0xFRVAgYW5kIGNsZWFyZWQgYmxhY2tsaXN0Iik7CkBAIC05MzQsNyArOTI2LDcgQEAKICAgICAgKiBzaG91bGQgcmV2ZXJ0IGFueXRoaW5nIGRvbmUgYnkgdGhlIHdhdGNoZG9nIG1vbml0b3JpbmcuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc2V0KCkgewotICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5jbGVhckJsYWNrbGlzdCgpOworICAgICAgICBtV2lmaU1hbmFnZXIuY2xlYXJCbGFja2xpc3QoKTsKICAgICAgICAgc2V0SWRsZVN0YXRlKHRydWUpOwogICAgIH0KICAgICAKQEAgLTExNTEsNyArMTE0Myw3IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZmlTdGF0ZUNoYW5nZWQoaW50IHdpZmlTdGF0ZSkgewogICAgICAgICAgICAgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICAgICAgcXVpdCgpOworICAgICAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZmlTdGF0ZSA9PSBXaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQpIHsKICAgICAgICAgICAgICAgICBvbkVuYWJsZWQoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDkxNDBhOTMuLmRhY2RkN2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESU1fQkVISU5EOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19LRUVQX1NDUkVFTl9PTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRlVMTFNDUkVFTjsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU1lTVEVNX0VSUk9SOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNOwpAQCAtMTU4LDcgKzE1OSw2IEBACiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1RBUlRJTkdfV0lORE9XID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUkVPUkRFUiA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1dBTExQQVBFUiA9IGZhbHNlOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZSRUVaRSA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1dfVFJBTlNBQ1RJT05TID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gSElERV9TVEFDS19DUkFXTFMgPSB0cnVlOwogCkBAIC0xNzg5LDE4ICsxNzg5LDExIEBACiAgICAgICAgIGJvb2xlYW4gcmVwb3J0TmV3Q29uZmlnID0gZmFsc2U7CiAgICAgICAgIFdpbmRvd1N0YXRlIGF0dGFjaGVkV2luZG93ID0gbnVsbDsKICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbnVsbDsKKyAgICAgICAgbG9uZyBvcmlnSWQ7CiAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpbmcgYSBEaXNwbGF5IHJlcXVpcmVzIHRhbGtpbmcgd2l0aCB0aGUgc2ltdWxhdG9yLAotICAgICAgICAgICAgLy8gc28gZG9uJ3QgZG8gaXQgdW50aWwgd2Uga25vdyB0aGUgc3lzdGVtIGlzIG1vc3RseSB1cCBhbmQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcuCiAgICAgICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSAoV2luZG93TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgbUlucHV0TWFuYWdlci5zZXREaXNwbGF5U2l6ZSgwLCBtSW5pdGlhbERpc3BsYXlXaWR0aCwgbUluaXRpYWxEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICByZXBvcnROZXdDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgaGFzIG5vdCBiZWVuIGluaXRpYWxpYWxpemVkIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtV2luZG93TWFwLmNvbnRhaW5zS2V5KGNsaWVudC5hc0JpbmRlcigpKSkgewpAQCAtMTkwNiw3ICsxODk5LDcgQEAKIAogICAgICAgICAgICAgcmVzID0gV2luZG93TWFuYWdlckltcGwuQUREX09LQVk7CiAKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBvcmlnSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgICAgICAgICAgaWYgKGFkZFRva2VuKSB7CiAgICAgICAgICAgICAgICAgbVRva2VuTWFwLnB1dChhdHRycy50b2tlbiwgdG9rZW4pOwpAQCAtMTk4MywxNCArMTk3NiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2VuZE5ld0NvbmZpZ3VyYXRpb24oKSBjaGVja3MgY2FsbGVyIHBlcm1pc3Npb25zIHNvIHdlIG11c3QgY2FsbCBpdCB3aXRoCi0gICAgICAgIC8vIHByaXZpbGVnZS4gIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2VucygpIGNsZWFycyBhbmQgcmVzZXRzIHRoZSBjYWxsZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYW55d2F5LCBzbyBpdCdzIHNhZmUgdG8ganVzdCBjbGVhciAmIHJlc3RvcmUgYXJvdW5kIHRoaXMgd2hvbGUKLSAgICAgICAgLy8gYmxvY2suCi0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ0lkID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGlmIChyZXBvcnROZXdDb25maWcpIHsKICAgICAgICAgICAgIHNlbmROZXdDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIH0KKwogICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvcmlnSWQpOwogCiAgICAgICAgIHJldHVybiByZXM7CkBAIC0zMTAzLDggKzMwOTIsMTEgQEAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gb2J2aW91cyBhY3Rpb24gd2UgbmVlZCB0byB0YWtlLCBidXQgaWYgb3VyIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYWFuYWdlcidzLCB1cGRhdGUgaXQKKyAgICAgICAgICAgICAgICAvLyBzdGF0ZSBtaXNtYXRjaGVzIHRoZSBhY3Rpdml0eSBtYW5hZ2VyJ3MsIHVwZGF0ZSBpdCwKKyAgICAgICAgICAgICAgICAvLyBkaXNyZWdhcmRpbmcgZm9udCBzY2FsZSwgd2hpY2ggc2hvdWxkIHJlbWFpbiBzZXQgdG8KKyAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICAgbVRlbXBDb25maWd1cmF0aW9uLnNldFRvRGVmYXVsdHMoKTsKKyAgICAgICAgICAgICAgICBtVGVtcENvbmZpZ3VyYXRpb24uZm9udFNjYWxlID0gY3VycmVudENvbmZpZy5mb250U2NhbGU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVOZXdDb25maWd1cmF0aW9uTG9ja2VkKG1UZW1wQ29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb25maWcuZGlmZihtVGVtcENvbmZpZ3VyYXRpb24pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWl0aW5nRm9yQ29uZmlnID0gdHJ1ZTsKQEAgLTQ0MzYsOCArNDQyOCw3IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1XaW5kb3dzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgICAgICBXaW5kb3dTdGF0ZSB3ID0gbVdpbmRvd3MuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICh3LmlzVmlzaWJsZUx3KCkgJiYgIXcubU9ic2N1cmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAody5tT3JpZW50YXRpb25DaGFuZ2luZyB8fCAhdy5pc0RyYXduTHcoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAody5pc1Zpc2libGVMdygpICYmICF3Lm1PYnNjdXJlZCAmJiAhdy5pc0RyYXduTHcoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTYxMyw2ICs1NjA0LDIyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBpZiAobURpc3BsYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRpc3BsYXkgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBtRGlzcGxheSA9IHdtLmdldERlZmF1bHREaXNwbGF5KCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlXaWR0aCA9IG1EaXNwbGF5LmdldFdpZHRoKCk7CisgICAgICAgICAgICBtSW5pdGlhbERpc3BsYXlIZWlnaHQgPSBtRGlzcGxheS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0RGlzcGxheVNpemUoMCwgbUluaXRpYWxEaXNwbGF5V2lkdGgsIG1Jbml0aWFsRGlzcGxheUhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlci51cGRhdGVDb25maWd1cmF0aW9uKG51bGwpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCkBAIC02ODkwLDcgKzY4OTcsNyBAQAogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1BdHRhY2hlZEhpZGRlbgogICAgICAgICAgICAgICAgICAgICAmJiAoYXRva2VuID09IG51bGwgPyBtUG9saWN5VmlzaWJpbGl0eSA6ICFhdG9rZW4uaGlkZGVuUmVxdWVzdGVkKQotICAgICAgICAgICAgICAgICAgICAmJiAobU9yaWVudGF0aW9uQ2hhbmdpbmcgfHwgKCFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZykpCisgICAgICAgICAgICAgICAgICAgICYmICFtRHJhd1BlbmRpbmcgJiYgIW1Db21taXREcmF3UGVuZGluZwogICAgICAgICAgICAgICAgICAgICAmJiAhbUV4aXRpbmcgJiYgIW1EZXN0cm95aW5nOwogICAgICAgICB9CiAKQEAgLTY5OTQsMTQgKzcwMDEsMTIgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaGFzIGEgc3VyZmFjZSB0aGF0IGl0IGhhcyBkcmF3biBhCi0gICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLiAgTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgKiBpcyBjaGFuZ2luZyBldmVuIGlmIHRoZSB3aW5kb3cgaGFzbid0IHJlZHJhd24gYmVjYXVzZSB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAqIHRvIHN0b3AgdGhpbmdzIGZyb20gZXhlY3V0aW5nIGR1cmluZyB0aGF0IHRpbWUuCisgICAgICAgICAqIGNvbXBsZXRlIFVJIGluIHRvLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEcmF3bkx3KCkgewogICAgICAgICAgICAgZmluYWwgQXBwV2luZG93VG9rZW4gYXRva2VuID0gbUFwcFRva2VuOwogICAgICAgICAgICAgcmV0dXJuIG1TdXJmYWNlICE9IG51bGwgJiYgIW1EZXN0cm95aW5nCi0gICAgICAgICAgICAgICAgJiYgKG1PcmllbnRhdGlvbkNoYW5naW5nIHx8ICghbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmcpKTsKKyAgICAgICAgICAgICAgICAmJiAhbURyYXdQZW5kaW5nICYmICFtQ29tbWl0RHJhd1BlbmRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWxsc1NjcmVlbkx3KGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCwKQEAgLTcwMjMsNiArNzAyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5yaWdodCA+PSBtQ29tcGF0aWJsZVNjcmVlbkZyYW1lLnJpZ2h0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5ib3R0b20gPj0gbUNvbXBhdGlibGVTY3JlZW5GcmFtZS5ib3R0b207CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgobUF0dHJzLmZsYWdzICYgRkxBR19GVUxMU0NSRUVOKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWUubGVmdCA8PSAwICYmIGZyYW1lLnRvcCA8PSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmcmFtZS5yaWdodCA+PSBzY3JlZW5XaWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZnJhbWUuYm90dG9tID49IHNjcmVlbkhlaWdodDsKQEAgLTg1MjIsNiArODUzMCwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkSW5uZXIoCiAgICAgICAgICAgICBib29sZWFuIHJlY292ZXJpbmdNZW1vcnkpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJza2lwcGluZyBwZXJmb3JtTGF5b3V0QW5kUGxhY2VTdXJmYWNlc0xvY2tlZElubmVyIHdpdGggbm8gbURpc3BsYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbURpc3BsYXkuZ2V0V2lkdGgoKTsKICAgICAgICAgZmluYWwgaW50IGRoID0gbURpc3BsYXkuZ2V0SGVpZ2h0KCk7CkBAIC05MzEwLDEyICs5MzIzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHcubUF0dGFjaGVkSGlkZGVuIHx8ICF3LmlzUmVhZHlGb3JEaXNwbGF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdy5tTGFzdEhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiV2luZG93IGhpZGluZzogd2FpdGluZ1RvU2hvdz0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHcubVJvb3RUb2tlbi53YWl0aW5nVG9TaG93ICsgIiBwb2x2aXM9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1Qb2xpY3lWaXNpYmlsaXR5ICsgIiBhdHRoaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3Lm1BdHRhY2hlZEhpZGRlbiArICIgdG9raGlkPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tUm9vdFRva2VuLmhpZGRlbiArICIgdmlzPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdy5tVmlld1Zpc2liaWxpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcubUxhc3RIaWRkZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJREUgKHBlcmZvcm1MYXlvdXQpIiwgbnVsbCk7CkBAIC05NzE2LDMwICs5NzIzLDI2IEBACiAgICAgICAgIH0gZWxzZSBpZiAoYW5pbWF0aW5nKSB7CiAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uTG9ja2VkKGN1cnJlbnRUaW1lKygxMDAwLzYwKS1TeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgbUlucHV0TW9uaXRvci51cGRhdGVJbnB1dFdpbmRvd3NMdygpOwotICAgICAgICAKLSAgICAgICAgaWYgKERFQlVHX0ZSRUVaRSkgU2xvZy52KFRBRywgIkxheW91dDogbURpc3BsYXlGcm96ZW49IiArIG1EaXNwbGF5RnJvemVuCi0gICAgICAgICAgICAgICAgKyAiIGhvbGRTY3JlZW49IiArIGhvbGRTY3JlZW4pOwotICAgICAgICBpZiAoIW1EaXNwbGF5RnJvemVuKSB7Ci0gICAgICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7Ci0gICAgICAgICAgICBpZiAoc2NyZWVuQnJpZ2h0bmVzcyA8IDAgfHwgc2NyZWVuQnJpZ2h0bmVzcyA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldFNjcmVlbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0U2NyZWVuQnJpZ2h0bmVzc092ZXJyaWRlKChpbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2NyZWVuQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidXR0b25CcmlnaHRuZXNzIDwgMCB8fCBidXR0b25CcmlnaHRuZXNzID4gMS4wZikgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIuc2V0QnV0dG9uQnJpZ2h0bmVzc092ZXJyaWRlKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRCdXR0b25CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKLSAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25CcmlnaHRuZXNzICogUG93ZXIuQlJJR0hUTkVTU19PTikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhvbGRTY3JlZW4gIT0gbUhvbGRpbmdTY3JlZW5PbikgewotICAgICAgICAgICAgICAgIG1Ib2xkaW5nU2NyZWVuT24gPSBob2xkU2NyZWVuOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKLSAgICAgICAgICAgICAgICBtSC5zZW5kTWVzc2FnZShtKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICBzZXRIb2xkU2NyZWVuTG9ja2VkKGhvbGRTY3JlZW4gIT0gbnVsbCk7CisgICAgICAgIGlmIChzY3JlZW5CcmlnaHRuZXNzIDwgMCB8fCBzY3JlZW5CcmlnaHRuZXNzID4gMS4wZikgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoLTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci5zZXRTY3JlZW5CcmlnaHRuZXNzT3ZlcnJpZGUoKGludCkKKyAgICAgICAgICAgICAgICAgICAgKHNjcmVlbkJyaWdodG5lc3MgKiBQb3dlci5CUklHSFRORVNTX09OKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1dHRvbkJyaWdodG5lc3MgPCAwIHx8IGJ1dHRvbkJyaWdodG5lc3MgPiAxLjBmKSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLnNldEJ1dHRvbkJyaWdodG5lc3NPdmVycmlkZSgoaW50KQorICAgICAgICAgICAgICAgICAgICAoYnV0dG9uQnJpZ2h0bmVzcyAqIFBvd2VyLkJSSUdIVE5FU1NfT04pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9sZFNjcmVlbiAhPSBtSG9sZGluZ1NjcmVlbk9uKSB7CisgICAgICAgICAgICBtSG9sZGluZ1NjcmVlbk9uID0gaG9sZFNjcmVlbjsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5IT0xEX1NDUkVFTl9DSEFOR0VELCBob2xkU2NyZWVuKTsKKyAgICAgICAgICAgIG1ILnNlbmRNZXNzYWdlKG0pOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1UdXJuT25TY3JlZW4pIHsKQEAgLTEwMDI4LDggKzEwMDMxLDYgQEAKICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREVCVUdfRlJFRVpFKSBTbG9nLnYoVEFHLCAiKioqIEZSRUVaSU5HIERJU1BMQVkiLCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgCiAgICAgICAgIG1EaXNwbGF5RnJvemVuID0gdHJ1ZTsKICAgICAgICAgCiAgICAgICAgIG1JbnB1dE1vbml0b3IuZnJlZXplSW5wdXREaXNwYXRjaGluZ0x3KCk7CkBAIC0xMDA1Niw4ICsxMDA1Nyw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19GUkVFWkUpIFNsb2cudihUQUcsICIqKiogVU5GUkVFWklORyBESVNQTEFZIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIAogICAgICAgICBtRGlzcGxheUZyb3plbiA9IGZhbHNlOwogICAgICAgICBtSC5yZW1vdmVNZXNzYWdlcyhILkFQUF9GUkVFWkVfVElNRU9VVCk7CiAgICAgICAgIGlmIChQUk9GSUxFX09SSUVOVEFUSU9OKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggMzA0NjQ2NC4uNzNjMTc5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjQxMCw2ICsyNDEwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChwcm9jLnRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2MucGlkID09IFByb2Nlc3MubXlQaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJjcmFzaEFwcGxpY2F0aW9uOiB0cnlpbmcgdG8gY3Jhc2ggc2VsZiEiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgcHJvYy50aHJlYWQuc2NoZWR1bGVDcmFzaChtZXNzYWdlKTsKQEAgLTU4MDYsNiArNTgxMCwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0SW1tZXJzaXZlKElCaW5kZXIgdG9rZW4sIGJvb2xlYW4gaW1tZXJzaXZlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAodG9rZW4gIT0gbnVsbCkgPyBtTWFpblN0YWNrLmluZGV4T2ZUb2tlbkxvY2tlZCh0b2tlbikgOiAtMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gKEFjdGl2aXR5UmVjb3JkKW1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIHIuaW1tZXJzaXZlID0gaW1tZXJzaXZlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW1lcnNpdmUoSUJpbmRlciB0b2tlbikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9ICh0b2tlbiAhPSBudWxsKSA/IG1NYWluU3RhY2suaW5kZXhPZlRva2VuTG9ja2VkKHRva2VuKSA6IC0xOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHIgPSAoQWN0aXZpdHlSZWNvcmQpbU1haW5TdGFjay5tSGlzdG9yeS5nZXQoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHIuaW1tZXJzaXZlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUb3BBY3Rpdml0eUltbWVyc2l2ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gKHIgIT0gbnVsbCkgPyByLmltbWVyc2l2ZSA6IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZW50ZXJTYWZlTW9kZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKICAgICAgICAgICAgIC8vIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gZG8gdGhpcyBiZWZvcmUgdGhlIHN5c3RlbSBpcyByZWFkeQpAQCAtMTIwNjcsNyArMTIxMDAsNjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIHB1YmxpYyBib29sZWFuIGR1bXBIZWFwKFN0cmluZyBwcm9jZXNzLCBib29sZWFuIG1hbmFnZWQsCisgICAgICAgICAgICBTdHJpbmcgcGF0aCwgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlOiBoaWphY2tpbmcgU0VUX0FDVElWSVRZX1dBVENIRVIsIGJ1dCBzaG91bGQgYmUgY2hhbmdlZCB0bworICAgICAgICAgICAgICAgIC8vIGl0cyBvd24gcGVybWlzc2lvbiAoc2FtZSBhcyBwcm9maWxlQ29udHJvbCkuCisgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9BQ1RJVklUWV9XQVRDSEVSKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gUGFja2FnZU1hbmFnZXIuUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUmVxdWlyZXMgcGVybWlzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgZmQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBQcm9jZXNzUmVjb3JkIHByb2MgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGludCBwaWQgPSBJbnRlZ2VyLnBhcnNlSW50KHByb2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1QaWRzU2VsZkxvY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYyA9IG1QaWRzU2VsZkxvY2tlZC5nZXQocGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3BhcnNlQXJyYXk8UHJvY2Vzc1JlY29yZD4+IGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbVByb2Nlc3NOYW1lcy5nZXRNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgU3BhcnNlQXJyYXk8UHJvY2Vzc1JlY29yZD4gcHJvY3MgPSBhbGwuZ2V0KHByb2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvY3MgIT0gbnVsbCAmJiBwcm9jcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jID0gcHJvY3MudmFsdWVBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm9jID09IG51bGwgfHwgcHJvYy50aHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHByb2Nlc3M6ICIgKyBwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2VjdXJlID0gIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldChTWVNURU1fU0VDVVJFLCAiMCIpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNTZWN1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9jLmluZm8uZmxhZ3MmQXBwbGljYXRpb25JbmZvLkZMQUdfREVCVUdHQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQcm9jZXNzIG5vdCBkZWJ1Z2dhYmxlOiAiICsgcHJvYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jLnRocmVhZC5kdW1wSGVhcChtYW5hZ2VkLCBwYXRoLCBmZCk7CisgICAgICAgICAgICAgICAgZmQgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvY2VzcyBkaXNhcHBlYXJlZCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmZC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogSW4gdGhpcyBtZXRob2Qgd2UgdHJ5IHRvIGFjcXVpcmUgb3VyIGxvY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBub3QgZGVhZGxvY2tlZCAqLwogICAgIHB1YmxpYyB2b2lkIG1vbml0b3IoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeyB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCA5MzU4NDY5Li5iZjRkYjgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKQEAgLTEwNSw2ICsxMDUsNyBAQAogICAgIGJvb2xlYW4gaWRsZTsgICAgICAgICAgIC8vIGhhcyB0aGUgYWN0aXZpdHkgZ29uZSBpZGxlPwogICAgIGJvb2xlYW4gaGFzQmVlbkxhdW5jaGVkOy8vIGhhcyB0aGlzIGFjdGl2aXR5IGV2ZXIgYmVlbiBsYXVuY2hlZD8KICAgICBib29sZWFuIGZyb3plbkJlZm9yZURlc3Ryb3k7Ly8gaGFzIGJlZW4gZnJvemVuIGJ1dCBub3QgeWV0IGRlc3Ryb3llZC4KKyAgICBib29sZWFuIGltbWVyc2l2ZTsgICAgICAvLyBpbW1lcnNpdmUgbW9kZSAoZG9uJ3QgaW50ZXJydXB0IGlmIHBvc3NpYmxlKQogCiAgICAgU3RyaW5nIHN0cmluZ05hbWU7ICAgICAgLy8gZm9yIGNhY2hpbmcgb2YgdG9TdHJpbmcoKS4KICAgICAKQEAgLTE2MSw2ICsxNjIsNyBAQAogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgia2V5c1BhdXNlZD0iKTsgcHcucHJpbnQoa2V5c1BhdXNlZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpbkhpc3Rvcnk9Iik7IHB3LnByaW50KGluSGlzdG9yeSk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBwZXJzaXN0ZW50PSIpOyBwdy5wcmludChwZXJzaXN0ZW50KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIGltbWVyc2l2ZT0iKTsgcHcucHJpbnQoaW1tZXJzaXZlKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGxhdW5jaE1vZGU9Iik7IHB3LnByaW50bG4obGF1bmNoTW9kZSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJmdWxsc2NyZWVuPSIpOyBwdy5wcmludChmdWxsc2NyZWVuKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHZpc2libGU9Iik7IHB3LnByaW50KHZpc2libGUpOwpAQCAtMjkyLDYgKzI5NCw4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlzSG9tZUFjdGl2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltbWVyc2l2ZSA9IChhSW5mby5mbGFncyAmIEFjdGl2aXR5SW5mby5GTEFHX0lNTUVSU0lWRSkgIT0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJlYWxBY3Rpdml0eSA9IG51bGw7CiAgICAgICAgICAgICB0YXNrQWZmaW5pdHkgPSBudWxsOwpAQCAtMzAzLDYgKzMwNyw3IEBACiAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IG51bGw7CiAgICAgICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTsKICAgICAgICAgICAgIGlzSG9tZUFjdGl2aXR5ID0gZmFsc2U7CisgICAgICAgICAgICBpbW1lcnNpdmUgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCmluZGV4IGViMGE4YTkuLjUzY2U1YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKQEAgLTE5LDggKzE5LDggQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CkBAIC0zMiw5ICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CkBAIC01Myw2ICs1Myw3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAvKioKICAqIEBoaWRlCkBAIC02NSw3ICs2Niw4IEBACiBwdWJsaWMgY2xhc3MgVGV0aGVyaW5nIGV4dGVuZHMgSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlci5TdHViIHsKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiVGV0aGVyaW5nIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRldGhlcmluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Cb290ZWQgPSBmYWxzZTsKICAgICAvL3VzZWQgdG8gcmVtZW1iZXIgaWYgd2UgZ290IGNvbm5lY3RlZCBiZWZvcmUgYm9vdCBmaW5pc2hlZApAQCAtNzQsNiArNzYsNyBAQAogICAgIC8vIFRPRE8gLSByZW1vdmUgYm90aCBvZiB0aGVzZSAtIHNob3VsZCBiZSBwYXJ0IG9mIGludGVyZmFjZSBpbnNwZWN0aW9uL3NlbGVjdGlvbiBzdHVmZgogICAgIHByaXZhdGUgU3RyaW5nW10gbVRldGhlcmFibGVVc2JSZWdleHM7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKICAgICBwcml2YXRlIFN0cmluZ1tdIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogCiAgICAgcHJpdmF0ZSBMb29wZXIgbUxvb3BlcjsKQEAgLTkzLDYgKzk2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMV9TVE9QICA9ICIxOTIuMTY4LjQyLjI1NCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTJfU1RBUlQgPSAiMTkyLjE2OC40My4yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFMl9TVE9QICA9ICIxOTIuMTY4LjQzLjI1NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERIQ1BfREVGQVVMVF9SQU5HRTNfU1RBUlQgPSAiMTkyLjE2OC40NC45IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREhDUF9ERUZBVUxUX1JBTkdFM19TVE9QICA9ICIxOTIuMTY4LjQ0LjI1NCI7CiAKICAgICBwcml2YXRlIFN0cmluZ1tdIG1EbnNTZXJ2ZXJzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBETlNfREVGQVVMVF9TRVJWRVIxID0gIjguOC44LjgiOwpAQCAtMTEwLDYgKzExNSwxNCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNiTWFzc1N0b3JhZ2VPZmY7ICAvLyB0cmFjayB0aGUgc3RhdHVzIG9mIFVTQiBNYXNzIFN0b3JhZ2UKICAgICBwcml2YXRlIGJvb2xlYW4gbVVzYkNvbm5lY3RlZDsgICAgICAgLy8gdHJhY2sgdGhlIHN0YXR1cyBvZiBVU0IgY29ubmVjdGlvbgogCisgICAgLy8gbVVzYkhhbmRsZXIgbWVzc2FnZQorICAgIHN0YXRpYyBmaW5hbCBpbnQgVVNCX1NUQVRFX0NIQU5HRSA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBVU0JfRElTQ09OTkVDVEVEID0gMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IFVTQl9DT05ORUNURUQgPSAxOworCisgICAgLy8gVGltZSB0byBkZWxheSBiZWZvcmUgcHJvY2Vzc2luZyBVU0IgZGlzY29ubmVjdCBldmVudHMKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBVU0JfRElTQ09OTkVDVF9ERUxBWSA9IDEwMDA7CisKICAgICBwdWJsaWMgVGV0aGVyaW5nKENvbnRleHQgY29udGV4dCwgTG9vcGVyIGxvb3BlcikgewogICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJpbmcgc3RhcnRpbmciKTsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMTUyLDExICsxNjUsMTMgQEAKICAgICAgICAgbURoY3BSYW5nZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2RoY3BfcmFuZ2UpOwogICAgICAgICBpZiAoKG1EaGNwUmFuZ2UubGVuZ3RoID09IDApIHx8IChtRGhjcFJhbmdlLmxlbmd0aCAlIDIgPT0xKSkgewotICAgICAgICAgICAgbURoY3BSYW5nZSA9IG5ldyBTdHJpbmdbNF07CisgICAgICAgICAgICBtRGhjcFJhbmdlID0gbmV3IFN0cmluZ1s2XTsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMF0gPSBESENQX0RFRkFVTFRfUkFOR0UxX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVsxXSA9IERIQ1BfREVGQVVMVF9SQU5HRTFfU1RPUDsKICAgICAgICAgICAgIG1EaGNwUmFuZ2VbMl0gPSBESENQX0RFRkFVTFRfUkFOR0UyX1NUQVJUOwogICAgICAgICAgICAgbURoY3BSYW5nZVszXSA9IERIQ1BfREVGQVVMVF9SQU5HRTJfU1RPUDsKKyAgICAgICAgICAgIG1EaGNwUmFuZ2VbNF0gPSBESENQX0RFRkFVTFRfUkFOR0UzX1NUQVJUOworICAgICAgICAgICAgbURoY3BSYW5nZVs1XSA9IERIQ1BfREVGQVVMVF9SQU5HRTNfU1RPUDsKICAgICAgICAgfQogICAgICAgICBtRHVuUmVxdWlyZWQgPSBmYWxzZTsgLy8gcmVzYW1wbGUgd2hlbiB3ZSB0dXJuIG9uCiAKQEAgLTE2NCw2ICsxNzksOCBAQAogICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3RldGhlcl91c2JfcmVnZXhzKTsKICAgICAgICAgbVRldGhlcmFibGVXaWZpUmVnZXhzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ190ZXRoZXJfd2lmaV9yZWdleHMpOworICAgICAgICBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX2JsdWV0b290aF9yZWdleHMpOwogICAgICAgICBtVXBzdHJlYW1JZmFjZVJlZ2V4cyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nQXJyYXkoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfdGV0aGVyX3Vwc3RyZWFtX3JlZ2V4cyk7CiAKQEAgLTE3NCw3ICsxOTEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkKFN0cmluZyBpZmFjZSwgYm9vbGVhbiBsaW5rKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImludGVyZmFjZUxpbmtTdGF0dXNDaGFuZ2VkICIgKyBpZmFjZSArICIsICIgKyBsaW5rKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZCAiICsgaWZhY2UgKyAiLCAiICsgbGluayk7CiAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiB1c2IgPSBmYWxzZTsKICAgICAgICAgaWYgKGlzV2lmaShpZmFjZSkpIHsKQEAgLTE4Miw2ICsxOTksOCBAQAogICAgICAgICB9IGVsc2UgaWYgKGlzVXNiKGlmYWNlKSkgewogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0JsdWV0b290aChpZmFjZSkpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZm91bmQgPT0gZmFsc2UpIHJldHVybjsKIApAQCAtMjE2LDYgKzIzNSwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoU3RyaW5nIGlmYWNlKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogbVRldGhlcmFibGVCbHVldG9vdGhSZWdleHMpIHsKKyAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHJlZ2V4KSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VBZGRlZChTdHJpbmcgaWZhY2UpIHsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC0yMjgsMjkgKzI1MywzNCBAQAogICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgdXNiID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAoaXNCbHVldG9vdGgoaWZhY2UpKSB7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOworICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsIGlmYWNlICsgIiBpcyBub3QgYSB0ZXRoZXJhYmxlIGlmYWNlLCBpZ25vcmluZyIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgc3luY2hyb25pemVkIChtSWZhY2VzKSB7CiAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IG1JZmFjZXMuZ2V0KGlmYWNlKTsKICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYWN0aXZlIGlmYWNlICgiICsgaWZhY2UgKyAiKSByZXBvcnRlZCBhcyBhZGRlZCwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImFjdGl2ZSBpZmFjZSAoIiArIGlmYWNlICsgIikgcmVwb3J0ZWQgYXMgYWRkZWQsIGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc20gPSBuZXcgVGV0aGVySW50ZXJmYWNlU00oaWZhY2UsIG1Mb29wZXIsIHVzYik7CiAgICAgICAgICAgICBtSWZhY2VzLnB1dChpZmFjZSwgc20pOwogICAgICAgICAgICAgc20uc3RhcnQoKTsKICAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJpbnRlcmZhY2VBZGRlZCA6IiArIGlmYWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VSZW1vdmVkKFN0cmluZyBpZmFjZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1JZmFjZXMpIHsKICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhdHRlbXB0aW5nIHRvIHJlbW92ZSB1bmtub3duIGlmYWNlICgiICsgaWZhY2UgKyAiKSwgaWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiYXR0ZW1wdGluZyB0byByZW1vdmUgdW5rbm93biBpZmFjZSAoIiArIGlmYWNlICsgIiksIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNtLnNlbmRNZXNzYWdlKFRldGhlckludGVyZmFjZVNNLkNNRF9JTlRFUkZBQ0VfRE9XTik7CkBAIC0zMjEsMTMgKzM1MSwxNCBAQAogCiAgICAgICAgIGJvb2xlYW4gd2lmaVRldGhlcmVkID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gdXNiVGV0aGVyZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBibHVldG9vdGhUZXRoZXJlZCA9IGZhbHNlOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobUlmYWNlcykgewogICAgICAgICAgICAgU2V0IGlmYWNlcyA9IG1JZmFjZXMua2V5U2V0KCk7CiAgICAgICAgICAgICBmb3IgKE9iamVjdCBpZmFjZSA6IGlmYWNlcykgewogICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHNtID0gbUlmYWNlcy5nZXQoaWZhY2UpOwogICAgICAgICAgICAgICAgIGlmIChzbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHNtLmlzRXJyb3JlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbS5pc0Vycm9yZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNtLmlzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxpc3QuYWRkKChTdHJpbmcpaWZhY2UpOwpAQCAtMzM2LDYgKzM2Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiVGV0aGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpZmkoKFN0cmluZylpZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWZpVGV0aGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNCbHVldG9vdGgoKFN0cmluZylpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVldG9vdGhUZXRoZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LmFkZCgoU3RyaW5nKWlmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzUwLDE3ICszODMsMjUgQEAKICAgICAgICAgYnJvYWRjYXN0LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKENvbm5lY3Rpdml0eU1hbmFnZXIuRVhUUkFfRVJST1JFRF9URVRIRVIsCiAgICAgICAgICAgICAgICAgZXJyb3JlZExpc3QpOwogICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGJyb2FkY2FzdCk7Ci0gICAgICAgIExvZy5kKFRBRywgInNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QgIiArIGF2YWlsYWJsZUxpc3Quc2l6ZSgpICsgIiwgIiArCi0gICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5zaXplKCkgKyAiLCAiICsgZXJyb3JlZExpc3Quc2l6ZSgpKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZW5kVGV0aGVyU3RhdGVDaGFuZ2VkQnJvYWRjYXN0ICIgKyBhdmFpbGFibGVMaXN0LnNpemUoKSArICIsICIgKworICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LnNpemUoKSArICIsICIgKyBlcnJvcmVkTGlzdC5zaXplKCkpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHVzYlRldGhlcmVkKSB7Ci0gICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkKSB7CisgICAgICAgICAgICBpZiAod2lmaVRldGhlcmVkIHx8IGJsdWV0b290aFRldGhlcmVkKSB7CiAgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX2dlbmVyYWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfdXNiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICh3aWZpVGV0aGVyZWQpIHsKLSAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl93aWZpKTsKKyAgICAgICAgICAgIGlmIChibHVldG9vdGhUZXRoZXJlZCkgeworICAgICAgICAgICAgICAgIHNob3dUZXRoZXJlZE5vdGlmaWNhdGlvbihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRyYXdhYmxlLnN0YXRfc3lzX3RldGhlcl9nZW5lcmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2hvd1RldGhlcmVkTm90aWZpY2F0aW9uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfdGV0aGVyX3dpZmkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJsdWV0b290aFRldGhlcmVkKSB7CisgICAgICAgICAgICBzaG93VGV0aGVyZWROb3RpZmljYXRpb24oY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c190ZXRoZXJfYmx1ZXRvb3RoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsZWFyVGV0aGVyZWROb3RpZmljYXRpb24oKTsKICAgICAgICAgfQpAQCAtMzkxLDcgKzQzMiw3IEBACiAgICAgICAgIENoYXJTZXF1ZW5jZSBtZXNzYWdlID0gci5nZXRUZXh0KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLgogICAgICAgICAgICAgICAgIHRldGhlcmVkX25vdGlmaWNhdGlvbl9tZXNzYWdlKTsKIAotICAgICAgICBpZihtVGV0aGVyZWROb3RpZmljYXRpb24gPT0gbnVsbCkgeworICAgICAgICBpZiAobVRldGhlcmVkTm90aWZpY2F0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKICAgICAgICAgICAgIG1UZXRoZXJlZE5vdGlmaWNhdGlvbi53aGVuID0gMDsKICAgICAgICAgfQpAQCAtNDIxLDEyICs0NjIsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgSGFuZGxlciBtVXNiSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgbVVzYkNvbm5lY3RlZCA9IChtc2cuYXJnMSA9PSBVU0JfQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOworICAgICAgICB9CisgICAgfTsKKwogICAgIHByaXZhdGUgY2xhc3MgU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGVudCwgSW50ZW50IGludGVudCkgewogICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKICAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFVzYi5BQ1RJT05fVVNCX1NUQVRFKSkgewotICAgICAgICAgICAgICAgIG1Vc2JDb25uZWN0ZWQgPSBpbnRlbnQuZ2V0RXh0cmFzKCkuZ2V0Qm9vbGVhbihVc2IuVVNCX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdHVzKCk7CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBjb25uZWN0IGV2ZW50cyBpbW1lZGlhdGVseSwgYnV0IGRlbGF5IGhhbmRsaW5nIGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgLy8gdG8gZGVib3VuY2UgVVNCIGNvbmZpZ3VyYXRpb24gY2hhbmdlcworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29ubmVjdGVkID0gaW50ZW50LmdldEV4dHJhcygpLmdldEJvb2xlYW4oVXNiLlVTQl9DT05ORUNURUQpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obVVzYkhhbmRsZXIsIFVTQl9TVEFURV9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29ubmVjdGVkID8gVVNCX0NPTk5FQ1RFRCA6IFVTQl9ESVNDT05ORUNURUQpLCAwKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhVU0JfU1RBVEVfQ0hBTkdFKTsKKyAgICAgICAgICAgICAgICBtVXNiSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBjb25uZWN0ZWQgPyAwIDogVVNCX0RJU0NPTk5FQ1RfREVMQVkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0hBUkVEKSkgewogICAgICAgICAgICAgICAgIG1Vc2JNYXNzU3RvcmFnZU9mZiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHVwZGF0ZVVzYlN0YXR1cygpOwpAQCAtNDM1LDcgKzQ4OSw3IEBACiAgICAgICAgICAgICAgICAgbVVzYk1hc3NTdG9yYWdlT2ZmID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB1cGRhdGVVc2JTdGF0dXMoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhDb25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyaW5nIGdvdCBDT05ORUNUSVZJVFlfQUNUSU9OIik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXJpbmcgZ290IENPTk5FQ1RJVklUWV9BQ1RJT04iKTsKICAgICAgICAgICAgICAgICBtVGV0aGVyTWFzdGVyU00uc2VuZE1lc3NhZ2UoVGV0aGVyTWFzdGVyU00uQ01EX1VQU1RSRUFNX0NIQU5HRUQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fQk9PVF9DT01QTEVURUQpKSB7CiAgICAgICAgICAgICAgICAgbUJvb3RlZCA9IHRydWU7CkBAIC00NjYsOSArNTIwLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHRvZ2dsZWQgd2hlbiB3ZSBlbnRlci9sZWF2ZSB0aGUgZnVsbHkgdGVhdGhlcmVkIHN0YXRlCisgICAgLy8gdG9nZ2xlZCB3aGVuIHdlIGVudGVyL2xlYXZlIHRoZSBmdWxseSB0ZXRoZXJlZCBzdGF0ZQogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVVc2JSbmRpcyhib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiZW5hYmxlVXNiUm5kaXMoIiArIGVuYWJsZWQgKyAiKSIpOworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImVuYWJsZVVzYlJuZGlzKCIgKyBlbmFibGVkICsgIikiKTsKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICAgICAgICAgIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2Ugc2VydmljZSA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKIApAQCAtNDkzLDcgKzU0Nyw3IEBACiAKICAgICAvLyBjb25maWd1cmVkIHdoZW4gd2Ugc3RhcnQgdGV0aGVyaW5nIGFuZCB1bmNvbmZpZydkIG9uIGVycm9yIG9yIGNvbmNsdXNpb24KICAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlVXNiSWZhY2UoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImNvbmZpZ3VyZVVzYklmYWNlKCIgKyBlbmFibGVkICsgIikiKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJjb25maWd1cmVVc2JJZmFjZSgiICsgZW5hYmxlZCArICIpIik7CiAKICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwogICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIHNlcnZpY2UgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CkBAIC01NDksNiArNjAzLDEwIEBACiAgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZVdpZmlSZWdleHM7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRldGhlcmFibGVCbHVldG9vdGhSZWdleHMoKSB7CisgICAgICAgIHJldHVybiBtVGV0aGVyYWJsZUJsdWV0b290aFJlZ2V4czsKKyAgICB9CisKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXBzdHJlYW1JZmFjZVJlZ2V4cygpIHsKICAgICAgICAgcmV0dXJuIG1VcHN0cmVhbUlmYWNlUmVnZXhzOwogICAgIH0KQEAgLTc0MCw3ICs3OTgsNyBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiSW5pdGlhbFN0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX1JFUVVFU1RFRDoKQEAgLTc4MSw3ICs4MzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJTdGFydGluZ1N0YXRlLnByb2Nlc3NNZXNzYWdlIHdoYXQ9IiArIG1lc3NhZ2Uud2hhdCk7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF5YmUgYSBwYXJlbnQgY2xhc3M/CkBAIC04MzMsNyArODkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVVzYikgVGV0aGVyaW5nLnRoaXMuZW5hYmxlVXNiUm5kaXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgc2V0VGV0aGVyZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2VuZFRldGhlclN0YXRlQ2hhbmdlZEJyb2FkY2FzdCgpOwpAQCAtODQ0LDcgKzkwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIlRldGhlcmVkU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKQEAgLTg4Nyw3ICs5NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLndoYXQgPT0gQ01EX0lOVEVSRkFDRV9ET1dOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmF2YWlsYWJsZVN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVudGV0aGVyZWQgIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJVbnRldGhlcmVkICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfQ09OTkVDVElPTl9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1Vwc3RyZWFtSWZhY2VOYW1lID0gKFN0cmluZykobWVzc2FnZS5vYmopOwpAQCAtOTYwLDcgKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGl2aXR5TWFuYWdlci5URVRIRVJfRVJST1JfTUFTVEVSX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBsb3N0IHVwc3RyZWFtIGNvbm5lY3Rpb24gIiArIG1JZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgbG9zdCB1cHN0cmVhbSBjb25uZWN0aW9uICIgKyBtSWZhY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUZXRoZXJTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVXNiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUZXRoZXJpbmcudGhpcy5jb25maWd1cmVVc2JJZmFjZShmYWxzZSkpIHsKQEAgLTExOTgsOCArMTI1NiwxMCBAQAogICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgICAgICAgICAgSUNvbm5lY3Rpdml0eU1hbmFnZXIgY20gPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGIpOwogICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uUmVxdWVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2hvb3NlVXBzdHJlYW1UeXBlKCIgKyB0cnlDZWxsICsgIiksICBkdW5SZXF1aXJlZCA9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaG9vc2VVcHN0cmVhbVR5cGUoIiArIHRyeUNlbGwgKyAiKSwgIGR1blJlcXVpcmVkID0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRHVuUmVxdWlyZWQgKyAiLCBpZmFjZT0iICsgaWZhY2UpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoaWZhY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EdW5SZXF1aXJlZCkgewpAQCAtMTIwNyw3ICsxMjY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0RVTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXR0aW5nIGR1biBpZmFjZW5hbWUgPSIgKyBpZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2V0dGluZyBkdW4gaWZhY2VuYW1lID0iICsgaWZhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWVib2R5IGVsc2UncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZjb3VudCwgc28gYWRkIG91ciBvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwpAQCAtMTIxOSwxMSArMTI3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjaGVja2luZyBpZiBoaXByaSBicm91Z2h0IHVzIHRoaXMgY29ubmVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiY2hlY2tpbmcgaWYgaGlwcmkgYnJvdWdodCB1cyB0aGlzIGNvbm5lY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gY20uZ2V0TmV0d29ya0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInllcyAtIGhpcHJpIGluIHVzZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIC0gaXQgbWF5IGJlIHNvbWJvZHkgZWxzZSdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmNvdW50LCBzbyBhZGQgb3VyIG93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJuT25Nb2JpbGVDb25uZWN0aW9uKCk7CkBAIC0xMjQ1LDcgKzEzMDUsNyBAQAogICAgICAgICAgICAgICAgIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKGlmYWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVRldGhlcmVkT2ZOZXdVcHN0cmVhbUlmYWNlKFN0cmluZyBpZmFjZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJub3RpZnlpbmcgdGV0aGVyZWQgd2l0aCBpZmFjZSA9IiArIGlmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgbVVwc3RyZWFtSWZhY2VOYW1lID0gaWZhY2VOYW1lOwogICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBtTm90aWZ5TGlzdCkgewogICAgICAgICAgICAgICAgICAgICBUZXRoZXJJbnRlcmZhY2VTTSBzbSA9IChUZXRoZXJJbnRlcmZhY2VTTSlvOwpAQCAtMTI2MiwxOSArMTMyMiwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJNYXN0ZXJJbml0aWFsU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIk1hc3RlckluaXRpYWxTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1RFVEhFUl9NT0RFX1JFUVVFU1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW5SZXF1aXJlZCA9IGlzRHVuUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFRldGhlckludGVyZmFjZVNNIHdobyA9IChUZXRoZXJJbnRlcmZhY2VTTSltZXNzYWdlLm9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlRldGhlciBNb2RlIHJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSByZXF1ZXN0ZWQgYnkgIiArIHdoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMaXN0LmFkZCh3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1UZXRoZXJNb2RlQWxpdmVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfVEVUSEVSX01PREVfVU5SRVFVRVNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB3aG8gPSAoVGV0aGVySW50ZXJmYWNlU00pbWVzc2FnZS5vYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJUZXRoZXIgTW9kZSB1bnJlcXVlc3RlZCBieSAiICsgd2hvLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbU5vdGlmeUxpc3QuaW5kZXhPZih3aG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxpc3QucmVtb3ZlKHdobyk7CkBAIC0xMzA0LDcgKzEzNjQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUZXRoZXJNb2RlQWxpdmVTdGF0ZS5wcm9jZXNzTWVzc2FnZSB3aGF0PSIgKyBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiVGV0aGVyTW9kZUFsaXZlU3RhdGUucHJvY2Vzc01lc3NhZ2Ugd2hhdD0iICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9URVRIRVJfTU9ERV9SRVFVRVNURUQ6CkBAIC0xMzMyLDggKzEzOTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSBzdGlsbCB1c2luZyBhIHJlcXVlc3RlZCBjb25uZWN0aW9uIC0gbWF5IGhhdmUgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZmkgb3Igc29tZXRoaW5nIHNpbmNlIHRoZW4uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZXF1ZXN0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExfQ09OTkVDVElPTl9SRU5FV19NUyArICJtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZW5ld2luZyBtb2JpbGUgY29ubmVjdGlvbiAtIHJlcXVldWluZyBmb3IgYW5vdGhlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX0NPTk5FQ1RJT05fUkVORVdfTVMgKyAibXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVybk9uTW9iaWxlQ29ubmVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY5MmY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBjb3VudHJ5IHdoZXJlIHRoZSB1c2VyIGlzLiBUaGUgc291cmNlcyBvZgorICogY291bnRyeSBhcmUgcXVlcmllZCBpbiBvcmRlciBvZiByZWxpYWJpbGl0eSwgbGlrZQorICogPHVsPgorICogPGxpPk1vYmlsZSBuZXR3b3JrPC9saT4KKyAqIDxsaT5Mb2NhdGlvbjwvbGk+CisgKiA8bGk+U0lNJ3MgY291bnRyeTwvbGk+CisgKiA8bGk+UGhvbmUncyBsb2NhbGU8L2xpPgorICogPC91bD4KKyAqIDxwPgorICogQ2FsbCB0aGUge0BsaW5rICNkZXRlY3RDb3VudHJ5KCl9IHRvIGdldCB0aGUgYXZhaWxhYmxlIGNvdW50cnkgaW1tZWRpYXRlbHkuCisgKiA8cD4KKyAqIFRvIGJlIG5vdGlmaWVkIG9mIHRoZSBmdXR1cmUgY291bnRyeSBjaGFuZ2UsIHVzaW5nIHRoZQorICoge0BsaW5rICNzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyKX0KKyAqIDxwPgorICogVXNpbmcgdGhlIHtAbGluayAjc3RvcCgpfSB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgY291bnRyeSBjaGFuZ2UuCisgKiA8cD4KKyAqIFRoZSBjb3VudHJ5IGluZm9ybWF0aW9uIHdpbGwgYmUgcmVmcmVzaGVkIGV2ZXJ5CisgKiB7QGxpbmsgI0xPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUx9IG9uY2UgdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgaXMgdXNlZC4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciBleHRlbmRzIENvdW50cnlEZXRlY3RvckJhc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yIjsKKworICAgIC8qKgorICAgICAqIFRoZSByZWZyZXNoIGludGVydmFsIHdoZW4gdGhlIGxvY2F0aW9uIGJhc2VkIGNvdW50cnkgd2FzIHVzZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwgPSAxMDAwICogNjAgKiA2MCAqIDI0OyAvLyAxIGRheQorCisgICAgcHJvdGVjdGVkIENvdW50cnlEZXRlY3RvckJhc2UgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3I7CisgICAgcHJvdGVjdGVkIFRpbWVyIG1Mb2NhdGlvblJlZnJlc2hUaW1lcjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1QaG9uZVR5cGU7CisgICAgcHJpdmF0ZSBDb3VudHJ5IG1Db3VudHJ5OworICAgIHByaXZhdGUgVGVsZXBob255TWFuYWdlciBtVGVsZXBob255TWFuYWdlcjsKKyAgICBwcml2YXRlIENvdW50cnkgbUNvdW50cnlGcm9tTG9jYXRpb247CisgICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTZXJ2aWNlU3RhdGUgbUxhc3RTdGF0ZTsKKworICAgIHByaXZhdGUgUGhvbmVTdGF0ZUxpc3RlbmVyIG1QaG9uZVN0YXRlTGlzdGVuZXIgPSBuZXcgUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgb3V0IGhvdyBvZnRlbiB3ZSB3aWxsIGJlIG5vdGlmaWVkLCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG9vCisgICAgICAgICAgICAvLyBtYW55IHRpbWVzLCBsZXQncyBjb25zaWRlciBxdWVyeWluZyB0aGUgbmV0d29yay4KKyAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgY2FyZSB0aGUgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICBpZiAobUxhc3RTdGF0ZSA9PSBudWxsIHx8IG1MYXN0U3RhdGUuZ2V0U3RhdGUoKSAhPSBzZXJ2aWNlU3RhdGUuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgbUxhc3RTdGF0ZSA9IG5ldyBTZXJ2aWNlU3RhdGUoc2VydmljZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuZXIgZm9yIHJlY2VpdmluZyB0aGUgbm90aWZpY2F0aW9uIGZyb20gTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ291bnRyeURldGVjdGVkKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbUNvdW50cnlGcm9tTG9jYXRpb24gPSBjb3VudHJ5OworICAgICAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgdGhlIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuCisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIHN0b3BMb2NhdGlvbkJhc2VkRGV0ZWN0b3IoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyID0gKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LlRFTEVQSE9OWV9TRVJWSUNFKTsKKyAgICAgICAgbVBob25lVHlwZSA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldFBob25lVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb3VudHJ5IGRldGVjdENvdW50cnkoKSB7CisgICAgICAgIC8vIERvbid0IHN0YXJ0IHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGlmIHdlIGhhdmUgYmVlbiBzdG9wcGVkLgorICAgICAgICByZXR1cm4gZGV0ZWN0Q291bnRyeShmYWxzZSwgIW1TdG9wcGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBTbG9nLmkoVEFHLCAiU3RvcCB0aGUgZGV0ZWN0b3IuIik7CisgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICByZW1vdmVQaG9uZVN0YXRlTGlzdGVuZXIoKTsKKyAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICBtTGlzdGVuZXIgPSBudWxsOworICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb3VudHJ5IGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gb3JkZXIgb2YgdGhlIHJlbGlhYmlsaXR5LgorICAgICAqLworICAgIHByaXZhdGUgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICBDb3VudHJ5IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHJlc3VsdCA9IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U2ltQmFzZWRDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRMb2NhbGVDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb3VudHJ5IGZyb20gdGhlIG1vYmlsZSBuZXR3b3JrLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgLy8gVE9ETzogVGhlIGRvY3VtZW50IHNheXMgdGhlIHJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbiBDRE1BIG5ldHdvcmtzLiBTaGFsbCB3ZSB1c2UKKyAgICAgICAgLy8gaXQgb24gQ0RNQSBwaG9uZT8gV2UgbWF5IHRlc3QgdGhlIEFuZHJvaWQgcHJpbWFyaWx5IHVzZWQgY291bnRyaWVzLgorICAgICAgICBpZiAobVBob25lVHlwZSA9PSBUZWxlcGhvbnlNYW5hZ2VyLlBIT05FX1RZUEVfR1NNKSB7CisgICAgICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0TmV0d29ya0NvdW50cnlJc28oKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoY291bnRyeUlzbykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjYWNoZWQgbG9jYXRpb24gYmFzZWQgY291bnRyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db3VudHJ5RnJvbUxvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSBTSU0gY2FyZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgU3RyaW5nIGNvdW50cnlJc28gPSBudWxsOworICAgICAgICBjb3VudHJ5SXNvID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0U2ltQ291bnRyeUlzbygpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGNvdW50cnlJc28pKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnkoY291bnRyeUlzbywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgZnJvbSB0aGUgc3lzdGVtJ3MgbG9jYWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRMb2NhbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb3VudHJ5KGRlZmF1bHRMb2NhbGUuZ2V0Q291bnRyeSgpLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBub3RpZnlDaGFuZ2UgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZCB0aGUgY2hhbmdlIG9mIHRoZQorICAgICAqIGNvdW50cnkKKyAgICAgKiBAcGFyYW0gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGNvdWxkCisgICAgICogYmUgc3RhcnRlZCBpZiB0aGUgY3VycmVudCBjb3VudHJ5IHNvdXJjZSBpcyBsZXNzIHJlbGlhYmxlIHRoYW4gdGhlIGxvY2F0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYXZhaWxhYmxlIFVzZXJDb3VudHJ5CisgICAgICovCisgICAgcHJpdmF0ZSBDb3VudHJ5IGRldGVjdENvdW50cnkoYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGdldENvdW50cnkoKTsKKyAgICAgICAgcnVuQWZ0ZXJEZXRlY3Rpb25Bc3luYyhtQ291bnRyeSAhPSBudWxsID8gbmV3IENvdW50cnkobUNvdW50cnkpIDogbUNvdW50cnksIGNvdW50cnksCisgICAgICAgICAgICAgICAgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIHJldHVybiBtQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIHRhc2tzIGluIHRoZSBzZXJ2aWNlJ3MgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJ1bkFmdGVyRGV0ZWN0aW9uQXN5bmMoZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIGRldGVjdGVkQ291bnRyeSwgbm90aWZ5Q2hhbmdlLCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb3VudHJ5TGlzdGVuZXIoQ291bnRyeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIENvdW50cnlMaXN0ZW5lciBwcmV2TGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBpZiAobUxpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFN0b3AgbGlzdGVuaW5nIGFsbCBzZXJ2aWNlcworICAgICAgICAgICAgcmVtb3ZlUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBzdG9wTG9jYXRpb25CYXNlZERldGVjdG9yKCk7CisgICAgICAgICAgICBjYW5jZWxMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmV2TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICBkZXRlY3RDb3VudHJ5KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgcnVuQWZ0ZXJEZXRlY3Rpb24oZmluYWwgQ291bnRyeSBjb3VudHJ5LCBmaW5hbCBDb3VudHJ5IGRldGVjdGVkQ291bnRyeSwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbm90aWZ5Q2hhbmdlLCBmaW5hbCBib29sZWFuIHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbikgeworICAgICAgICBpZiAobm90aWZ5Q2hhbmdlKSB7CisgICAgICAgICAgICBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGNvdW50cnksIGRldGVjdGVkQ291bnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0TG9jYXRpb25CYXNlZERldGVjdGlvbiAmJiAoZGV0ZWN0ZWRDb3VudHJ5ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBkZXRlY3RlZENvdW50cnkuZ2V0U291cmNlKCkgPiBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKQorICAgICAgICAgICAgICAgICYmIGlzQWlycGxhbmVNb2RlT2ZmKCkgJiYgbUxpc3RlbmVyICE9IG51bGwgJiYgaXNHZW9Db2RlckltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IGZpbmRpbmcgbG9jYXRpb24gd2hlbiB0aGUgc291cmNlIGlzIGxlc3MgcmVsaWFibGUgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uIGFuZCB0aGUgYWlycGxhbmUgbW9kZSBpcyBvZmYgKGFzIGdlb2NvZGVyIHdpbGwgbm90CisgICAgICAgICAgICAvLyB3b3JrKS4KKyAgICAgICAgICAgIC8vIFRPRE8gOiBTaGFsbCB3ZSBnaXZlIHVwIHN0YXJ0aW5nIHRoZSBkZXRlY3RvciB3aXRoaW4gYQorICAgICAgICAgICAgLy8gcGVyaW9kIG9mIHRpbWU/CisgICAgICAgICAgICBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3Rpb25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgZGV0ZWN0ZWRDb3VudHJ5LmdldFNvdXJjZSgpID49IENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pIHsKKyAgICAgICAgICAgIC8vIFNjaGVkdWxlIHRoZSBsb2NhdGlvbiByZWZyZXNoIGlmIHRoZSBjb3VudHJ5IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbm90IG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgbG9jYXRpb24gb3Igbm8gY291bnRyeSBpcworICAgICAgICAgICAgLy8gZm91bmQuCisgICAgICAgICAgICAvLyBUT0RPOiBMaXN0ZW4gdG8gdGhlIHByZWZlcmVuY2UgY2hhbmdlIG9mIEdQUywgV2lmaSBldGMsCisgICAgICAgICAgICAvLyBhbmQgc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAgICAgICAgc2NoZWR1bGVMb2NhdGlvblJlZnJlc2goKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgbG9jYXRpb24gcmVmcmVzaCBvbmNlIHRoZSBjdXJyZW50IHNvdXJjZSBpcworICAgICAgICAgICAgLy8gbW9yZSByZWxpYWJsZSB0aGFuIHRoZSBsb2NhdGlvbi4KKyAgICAgICAgICAgIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpOworICAgICAgICAgICAgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgY291bnRyeSBmcm9tIExvY2F0aW9uUHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExvY2F0aW9uQmFzZWREZXRlY3RvcihDb3VudHJ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciA9IGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc3RvcExvY2F0aW9uQmFzZWREZXRlY3RvcigpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihtQ29udGV4dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TeXN0ZW0uQUlSUExBTkVfTU9ERV9PTiwgMCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNvdW50cnkgY2hhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBub3RpZnlJZkNvdW50cnlDaGFuZ2VkKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnkpIHsKKyAgICAgICAgaWYgKGRldGVjdGVkQ291bnRyeSAhPSBudWxsICYmIG1MaXN0ZW5lciAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKGNvdW50cnkgPT0gbnVsbCB8fCAhY291bnRyeS5lcXVhbHMoZGV0ZWN0ZWRDb3VudHJ5KSkpIHsKKyAgICAgICAgICAgIFNsb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICJUaGUgY291bnRyeSB3YXMgY2hhbmdlZCBmcm9tICIgKyBjb3VudHJ5ICE9IG51bGwgPyBjb3VudHJ5LmdldENvdW50cnlJc28oKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ICsgIiB0byAiICsgZGV0ZWN0ZWRDb3VudHJ5LmdldENvdW50cnlJc28oKSk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihkZXRlY3RlZENvdW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NoZWR1bGUgdGhlIG5leHQgbG9jYXRpb24gcmVmcmVzaC4gV2Ugd2lsbCBkbyBub3RoaW5nIGlmIHRoZSBzY2hlZHVsZWQgdGFzayBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzY2hlZHVsZUxvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9IG51bGw7CisgICAgICAgICAgICAgICAgZGV0ZWN0Q291bnRyeShmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIExPQ0FUSU9OX1JFRlJFU0hfSU5URVJWQUwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHJlZnJlc2ggdGFzayBpZiBpdCBleGlzdHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbExvY2F0aW9uUmVmcmVzaCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtTG9jYXRpb25SZWZyZXNoVGltZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGFkZFBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgPT0gbnVsbCAmJiBtUGhvbmVUeXBlID09IFRlbGVwaG9ueU1hbmFnZXIuUEhPTkVfVFlQRV9HU00pIHsKKyAgICAgICAgICAgIG1MYXN0U3RhdGUgPSBudWxsOworICAgICAgICAgICAgbVBob25lU3RhdGVMaXN0ZW5lciA9IG5ldyBQaG9uZVN0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2VkKFNlcnZpY2VTdGF0ZSBzZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgaG93IG9mdGVuIHdlIHdpbGwgYmUgbm90aWZpZWQsIGlmIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlzIGNhbGxlZCB0b28KKyAgICAgICAgICAgICAgICAgICAgLy8gbWFueSB0aW1lcywgbGV0J3MgY29uc2lkZXIgcXVlcnlpbmcgdGhlIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblNlcnZpY2VTdGF0ZUNoYW5nZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBjYXJlIHRoZSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0U3RhdGUgPT0gbnVsbCB8fCBtTGFzdFN0YXRlLmdldFN0YXRlKCkgIT0gc2VydmljZVN0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdENvdW50cnkodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFN0YXRlID0gbmV3IFNlcnZpY2VTdGF0ZShzZXJ2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1UZWxlcGhvbnlNYW5hZ2VyLmxpc3RlbihtUGhvbmVTdGF0ZUxpc3RlbmVyLCBQaG9uZVN0YXRlTGlzdGVuZXIuTElTVEVOX1NFUlZJQ0VfU1RBVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRlbGVwaG9ueU1hbmFnZXIubGlzdGVuKG1QaG9uZVN0YXRlTGlzdGVuZXIsIFBob25lU3RhdGVMaXN0ZW5lci5MSVNURU5fTk9ORSk7CisgICAgICAgICAgICBtUGhvbmVTdGF0ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEdlb2NvZGVyLmlzSW1wbGVtZW50ZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Db3VudHJ5RGV0ZWN0b3JCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyNmVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvdW50cnlEZXRlY3RvckJhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBtZXRob2RzIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvdW50cnkKKyAqIGRldGVjdG9yLgorICogPHA+CisgKiBDYWxsaW5nIHtAbGluayAjZGV0ZWN0Q291bnRyeX0gdG8gc3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LiBUaGUgY291bnRyeQorICogY291bGQgYmUgcmV0dXJuZWQgaW1tZWRpYXRlbHkgaWYgaXQgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb3VudHJ5RGV0ZWN0b3JCYXNlIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeUxpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgQ291bnRyeSBtRGV0ZWN0ZWRDb3VudHJ5OworCisgICAgcHVibGljIENvdW50cnlEZXRlY3RvckJhc2UoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjdHg7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBkZXRlY3RpbmcgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBpcyBpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvdW50cnkgaWYgaXQgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgbnVsbCBzaG91bGQKKyAgICAgKiAgICAgICAgIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb3VudHJ5IGRldGVjdENvdW50cnkoKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSB0aGUgbm90aWZpY2F0aW9uIHdoZW4gdGhlIGNvdW50cnkgaXMgZGV0ZWN0ZWQgb3IgY2hhbmdlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJldmlvdXMgbGlzdGVuZXIgd2lsbCBiZSByZXBsYWNlZCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGRldGVjdGluZyB0aGUgY291bnRyeS4gVGhlIGRldGVjdG9yIHNob3VsZCByZWxlYXNlIGFsbCBzeXN0ZW0gc2VydmljZXMgYW5kIGJlIHJlYWR5IHRvCisgICAgICogYmUgZnJlZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdG9wKCk7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcihDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25Db3VudHJ5RGV0ZWN0ZWQoY291bnRyeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9sb2NhdGlvbi9Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM5ZjA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubG9jYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkFkZHJlc3M7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uR2VvY29kZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkxvY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZXRlY3RzIHdoaWNoIGNvdW50cnkgdGhlIHVzZXIgY3VycmVudGx5IGlzIGluIHRocm91Z2ggdGhlIGVuYWJsZWQKKyAqIGxvY2F0aW9uIHByb3ZpZGVycyBhbmQgdGhlIEdlb0NvZGVyCisgKiA8cD4KKyAqIFVzZSB7QGxpbmsgI2RldGVjdENvdW50cnl9IHRvIHN0YXJ0IHF1ZXJ5aW5nLiBJZiB0aGUgbG9jYXRpb24gY2FuIG5vdCBiZQorICogcmVzb2x2ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lLCB0aGUgbGFzdCBrbm93biBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0CisgKiB0aGUgdXNlciBjb3VudHJ5IHRocm91Z2ggdGhlIEdlb0NvZGVyLiBUaGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUKKyAqIHRocm93biBpZiB0aGVyZSBpcyBhIG9uZ29pbmcgcXVlcnkuCisgKiA8cD4KKyAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhbiBiZSBzdG9wcGVkIGJ5IHtAbGluayAjc3RvcCgpfQorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIGV4dGVuZHMgQ291bnRyeURldGVjdG9yQmFzZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQgPSAxMDAwICogNjAgKiA1OyAvLyA1IG1pbnMKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNhbmNlbGluZyBsb2NhdGlvbiBxdWVyeQorICAgICAqLworICAgIHByb3RlY3RlZCBUaW1lciBtVGltZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZWFkIHRvIHF1ZXJ5IHRoZSBjb3VudHJ5IGZyb20gdGhlIEdlb0NvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgbVF1ZXJ5VGhyZWFkOworICAgIHByb3RlY3RlZCBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1Mb2NhdGlvbkxpc3RlbmVyczsKKworICAgIHByaXZhdGUgTG9jYXRpb25NYW5hZ2VyIG1Mb2NhdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUVuYWJsZWRQcm92aWRlcnM7CisKKyAgICBwdWJsaWMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvcihDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihjdHgpOworICAgICAgICBtTG9jYXRpb25NYW5hZ2VyID0gKExvY2F0aW9uTWFuYWdlcikgY3R4LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5MT0NBVElPTl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSBmcm9tIHRoZSBsb2NhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgIEdlb2NvZGVyIGdlb0NvZGVyID0gbmV3IEdlb2NvZGVyKG1Db250ZXh0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZ2VvQ29kZXIuZ2V0RnJvbUxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5nZXRMYXRpdHVkZSgpLCBsb2NhdGlvbi5nZXRMb25naXR1ZGUoKSwgMSk7CisgICAgICAgICAgICBpZiAoYWRkcmVzc2VzICE9IG51bGwgJiYgYWRkcmVzc2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gYWRkcmVzc2VzLmdldCgwKS5nZXRDb3VudHJ5Q29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXhjZXB0aW9uIG9jY3VycyB3aGVuIGdldHRpbmcgY291bnRyeSBmcm9tIGxvY2F0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gbGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IHRvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1Mb2NhdGlvbk1hbmFnZXIucmVxdWVzdExvY2F0aW9uVXBkYXRlcygKKyAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWRQcm92aWRlcnMuZ2V0KGkpLCAwLCAwLCBsaXN0ZW5lcnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgdGhlIGxpc3RlbmVycyB3aXRoIHRoZSBsb2NhdGlvbiBwcm92aWRlcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bnJlZ2lzdGVyUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgbUxvY2F0aW9uTWFuYWdlci5yZW1vdmVVcGRhdGVzKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3Qga25vd24gbG9jYXRpb24gZnJvbSBhbGwgcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExvY2F0aW9uIGdldExhc3RLbm93bkxvY2F0aW9uKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gcHJvdmlkZXJzID0gbUxvY2F0aW9uTWFuYWdlci5nZXRBbGxQcm92aWRlcnMoKTsKKyAgICAgICAgTG9jYXRpb24gYmVzdExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIExvY2F0aW9uIGxhc3RLbm93bkxvY2F0aW9uID0gbUxvY2F0aW9uTWFuYWdlci5nZXRMYXN0S25vd25Mb2NhdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICBpZiAobGFzdEtub3duTG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPT0gbnVsbCB8fCBiZXN0TG9jYXRpb24uZ2V0VGltZSgpIDwgbGFzdEtub3duTG9jYXRpb24uZ2V0VGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RMb2NhdGlvbiA9IGxhc3RLbm93bkxvY2F0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdExvY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVvdXQgZm9yIHF1ZXJ5aW5nIHRoZSBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIFFVRVJZX0xPQ0FUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuYWJsZWQgbG9jYXRpb24gcHJvdmlkZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgIGlmIChtRW5hYmxlZFByb3ZpZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtRW5hYmxlZFByb3ZpZGVycyA9IG1Mb2NhdGlvbk1hbmFnZXIuZ2V0UHJvdmlkZXJzKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRW5hYmxlZFByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgZGV0ZWN0aW5nIHRoZSBjb3VudHJ5LgorICAgICAqIDxwPgorICAgICAqIFF1ZXJpZXMgdGhlIGxvY2F0aW9uIGZyb20gYWxsIGxvY2F0aW9uIHByb3ZpZGVycywgdGhlbiBzdGFydHMgYSB0aHJlYWQgdG8gcXVlcnkgdGhlCisgICAgICogY291bnRyeSBmcm9tIEdlb0NvZGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICBpZiAobUxvY2F0aW9uTGlzdGVuZXJzICAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCB0aGUgbG9jYXRpb24gZnJvbSBhbGwgZW5hYmxlZCBwcm92aWRlcnMuCisgICAgICAgIGludCB0b3RhbFByb3ZpZGVycyA9IGdldFRvdGFsRW5hYmxlZFByb3ZpZGVycygpOworICAgICAgICBpZiAodG90YWxQcm92aWRlcnMgPiAwKSB7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PExvY2F0aW9uTGlzdGVuZXI+KHRvdGFsUHJvdmlkZXJzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxQcm92aWRlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYXRpb25MaXN0ZW5lciAoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYXRpb25DaGFuZ2VkKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IudGhpcy5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckRpc2FibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJFbmFibGVkKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdHVzQ2hhbmdlZChTdHJpbmcgcHJvdmlkZXIsIGludCBzdGF0dXMsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbUxvY2F0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWdpc3RlckVuYWJsZWRQcm92aWRlcnMobUxvY2F0aW9uTGlzdGVuZXJzKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG5ldyBUaW1lcigpOworICAgICAgICAgICAgbVRpbWVyLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBMb29rcyBsaWtlIG5vIHByb3ZpZGVyIGNvdWxkIHByb3ZpZGUgdGhlIGxvY2F0aW9uLCBsZXQncyB0cnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vd24gbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5Q291bnRyeUNvZGUoZ2V0TGFzdEtub3duTG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgZ2V0UXVlcnlMb2NhdGlvblRpbWVvdXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwcm92aWRlciBlbmFibGVkLgorICAgICAgICAgICAgcXVlcnlDb3VudHJ5Q29kZShnZXRMYXN0S25vd25Mb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURldGVjdGVkQ291bnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjdXJyZW50IHF1ZXJ5IHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1Mb2NhdGlvbkxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyUHJvdmlkZXJzKG1Mb2NhdGlvbkxpc3RlbmVycyk7CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHRocmVhZCB0byBxdWVyeSB0aGUgY291bnRyeSBmcm9tIEdlb2NvZGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcXVlcnlDb3VudHJ5Q29kZShmaW5hbCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1RdWVyeVRocmVhZCAhPSBudWxsKSByZXR1cm47CisgICAgICAgIG1RdWVyeVRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5SXNvID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5SXNvID0gZ2V0Q291bnRyeUZyb21Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5SXNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbURldGVjdGVkQ291bnRyeSA9IG5ldyBDb3VudHJ5KGNvdW50cnlJc28sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXRlY3RlZENvdW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtRGV0ZWN0ZWRDb3VudHJ5KTsKKyAgICAgICAgICAgICAgICBtUXVlcnlUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVF1ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawppbmRleCBjZGMwYTZmLi40NTk1NTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9qbmkvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDcgQEAKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfTGlnaHRzU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlci5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9WaWJyYXRvclNlcnZpY2UuY3BwIFwKIAljb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAgXAogICAgIG9ubG9hZC5jcHAKQEAgLTI1LDYgKzI2LDggQEAKIAlsaWJ1dGlscyBcCiAJbGlidWkKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJ1c2Job3N0CisKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIGlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLHg4NikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NzhkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVc2JPYnNlcnZlciIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLCA2LCAyMCkKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3VzYl9jaDkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworc3RhdGljIGptZXRob2RJRCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQ7CitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkOworCitWZWN0b3I8aW50PiBtRGV2aWNlTGlzdDsKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICAvLyBjaGVjayB0byBzZWUgaWYgaXQgaXMgYSBjYW1lcmEKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOworICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7CisKKyAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOworICAgIGlmICghZGV2aWNlKSB7CisgICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1c2JfZGVzY3JpcHRvcl9pdGVyX2luaXQoZGV2aWNlLCAmaXRlcik7CisKKyAgICB3aGlsZSAoKGRlc2MgPSB1c2JfZGVzY3JpcHRvcl9pdGVyX25leHQoJml0ZXIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0lOVEVSRkFDRSkgeworICAgICAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilkZXNjOworCisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFICYmCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMSAmJiAvLyBTdGlsbCBJbWFnZSBDYXB0dXJlCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMSkgICAgIC8vIFBpY3R1cmUgVHJhbnNmZXIgUHJvdG9jb2wgKFBJTUEgMTU0NzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgY2FtZXJhOiBcIiVzXCIgXCIlc1wiXG4iLCB1c2JfZGV2aWNlX2dldF9tYW51ZmFjdHVyZXJfbmFtZShkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2RldmljZV9nZXRfcHJvZHVjdF9uYW1lKGRldmljZSkpOworCisgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIHNob3VsZCBiZSBmb2xsb3dlZCBieSB0aHJlZSBlbmRwb2ludHMKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW5fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9vdXRfZGVzYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pbnRyX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVwID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKXVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZXAgfHwgZXAtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImVuZHBvaW50cyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcF9pbl9kZXNjID0gZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBfb3V0X2Rlc2MgPSBlcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwX2ludHJfZGVzYyA9IGVwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXBfaW5fZGVzYyB8fCAhZXBfb3V0X2Rlc2MgfHwgIWVwX2ludHJfZGVzYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmRwb2ludHMgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB3ZSBmb3VuZCBhIGNhbWVyYQorICAgICAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgICAgIGpvYmplY3QgdGhpeiA9IChqb2JqZWN0KWNsaWVudF9kYXRhOworCisgICAgICAgICAgICAgICAgaW50IGlkID0gdXNiX2RldmljZV9nZXRfdW5pcXVlX2lkX2Zyb21fbmFtZShkZXZuYW1lKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlTGlzdC5hZGQoaWQpOworCisgICAgICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiQ2FtZXJhQWRkZWQsIGlkKTsKKyAgICAgICAgICAgICAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK2RvbmU6CisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAgIGludCBpZCA9IHVzYl9kZXZpY2VfZ2V0X3VuaXF1ZV9pZF9mcm9tX25hbWUoZGV2bmFtZSk7CisKKyAgICAvLyBzZWUgaWYgaXQgaXMgYSBkZXZpY2Ugd2Uga25vdyBhYm91dAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkICA9PSBtRGV2aWNlTGlzdFtpXSkgeworICAgICAgICAgICAgbURldmljZUxpc3QucmVtb3ZlQXQoaSk7CisKKyAgICAgICAgICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQsIGlkKTsKKyAgICAgICAgICAgIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqIGNvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7CisgICAgaWYgKCFjb250ZXh0KSB7CisgICAgICAgIExPR0UoInVzYl9ob3N0X2luaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGhpcyB3aWxsIG5ldmVyIHJldHVybiBzbyBpdCBpcyBzYWZlIHRvIHBhc3MgdGhpeiBkaXJlY3RseQorICAgIHVzYl9ob3N0X3J1bihjb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIE5VTEwsICh2b2lkICopdGhpeik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibW9uaXRvclVzYkhvc3RCdXMiLCAiKClWIiwgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYk9ic2VydmVyX21vbml0b3JVc2JIb3N0QnVzIH0KK307CisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL1VzYk9ic2VydmVyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvVXNiT2JzZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhQWRkZWQiLCAiKEkpViIpOworICAgIGlmIChtZXRob2RfdXNiQ2FtZXJhQWRkZWQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIHVzYkNhbWVyYUFkZGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWV0aG9kX3VzYkNhbWVyYVJlbW92ZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiQ2FtZXJhUmVtb3ZlZCIsICIoSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JDYW1lcmFSZW1vdmVkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCB1c2JDYW1lcmFSZW1vdmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9Vc2JPYnNlcnZlciIsCisgICAgICAgICAgICBtZXRob2RfdGFibGUsIE5FTEVNKG1ldGhvZF90YWJsZSkpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfbG9jYXRpb25fR3BzTG9jYXRpb25Qcm92aWRlci5jcHAKaW5kZXggNTlkN2NkZS4uOTMwNjhlNiAxMDA3NTUKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIuY3BwCkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgICAgICAgc0FHcHNJbnRlcmZhY2UtPmluaXQoJnNBR3BzQ2FsbGJhY2tzKTsKIAogICAgIGlmICghc0dwc05pSW50ZXJmYWNlKQotICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKKyAgICAgICAgc0dwc05pSW50ZXJmYWNlID0gKGNvbnN0IEdwc05pSW50ZXJmYWNlKilzR3BzSW50ZXJmYWNlLT5nZXRfZXh0ZW5zaW9uKEdQU19OSV9JTlRFUkZBQ0UpOwogICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCi0gICAgICAgc0dwc05pSW50ZXJmYWNlLT5pbml0KCZzR3BzTmlDYWxsYmFja3MpOworICAgICAgICBzR3BzTmlJbnRlcmZhY2UtPmluaXQoJnNHcHNOaUNhbGxiYWNrcyk7CiAKICAgICBpZiAoIXNHcHNEZWJ1Z0ludGVyZmFjZSkKICAgICAgICBzR3BzRGVidWdJbnRlcmZhY2UgPSAoY29uc3QgR3BzRGVidWdJbnRlcmZhY2UqKXNHcHNJbnRlcmZhY2UtPmdldF9leHRlbnNpb24oR1BTX0RFQlVHX0lOVEVSRkFDRSk7CkBAIC00MTMsMTIgKzQxMywxMCBAQAogc3RhdGljIHZvaWQgYW5kcm9pZF9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyX3NlbmRfbmlfcmVzcG9uc2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLAogICAgICAgamludCBub3RpZklkLCBqaW50IHJlc3BvbnNlKQogewotICAgIGlmICghc0dwc05pSW50ZXJmYWNlKSB7CisgICAgaWYgKCFzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZSA9IChjb25zdCBHcHNOaUludGVyZmFjZSopc0dwc0ludGVyZmFjZS0+Z2V0X2V4dGVuc2lvbihHUFNfTklfSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgaWYgKHNHcHNOaUludGVyZmFjZSkgeworICAgIGlmIChzR3BzTmlJbnRlcmZhY2UpCiAgICAgICAgIHNHcHNOaUludGVyZmFjZS0+cmVzcG9uZChub3RpZklkLCByZXNwb25zZSk7Ci0gICAgfQogfQogCiBzdGF0aWMganN0cmluZyBhbmRyb2lkX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXJfZ2V0X2ludGVybmFsX3N0YXRlKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaikKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9vbmxvYWQuY3BwIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKaW5kZXggY2Q0ZjBhNC4uMzUwMmFjYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAKKysrIGIvc2VydmljZXMvam5pL29ubG9hZC5jcHAKQEAgLTksNiArOSw3IEBACiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoSk5JRW52KiBlbnYpOwpAQCAtMzIsNiArMzMsNyBAQAogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UoZW52KTsKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9BbGFybU1hbmFnZXJTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQmF0dGVyeVNlcnZpY2UoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JPYnNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoZW52KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGExNGJmYjUuLmU0ODI1ZDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpAQCAtNSw2ICs1LDcgQEAKICAgICBjbHouY3BwLmFybSBcCiAgICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5jcHAgXAogICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcCBcCisgICAgRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwIFwKICAgICBCbHVyRmlsdGVyLmNwcC5hcm0gXAogICAgIEdMRXh0ZW5zaW9ucy5jcHAgXAogICAgIExheWVyLmNwcCBcCkBAIC0yMSw3ICsyMiw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKIGlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgb21hcDMpCi0JTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4CisJTE9DQUxfQ0ZMQUdTICs9IC1ETk9fUkdCWF84ODg4IC1ESEFTX1BVU0hfQlVGRkVSUwogZW5kaWYKIAogIyBuZWVkICItbHJ0IiBvbiBMaW51eCBzaW11bGF0b3IgdG8gcGljayB1cCBjbG9ja19nZXR0aW1lCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCmluZGV4IDJlYWMwYTguLjNlMjM5MjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCkBAIC0zNiwxMSArMzYsMTEgQEAKIAogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKIAotI2luY2x1ZGUgPGhhcmR3YXJlL2NvcHliaXQuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9vdmVybGF5Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogCiAjaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiSFdDb21wb3Nlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNzYsNyArNzYsNyBAQAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCiAgICAgICAgIHVpbnQzMl90IGRweSkKICAgICA6IERpc3BsYXlIYXJkd2FyZUJhc2UoZmxpbmdlciwgZHB5KSwKLSAgICAgIG1GbGFncygwKQorICAgICAgbUZsYWdzKDApLCBtSHdjKDApCiB7CiAgICAgaW5pdChkcHkpOwogfQpAQCAtMjYyLDYgKzI2MiwxNyBAQAogCiAgICAgLy8gVW5iaW5kIHRoZSBjb250ZXh0IGZyb20gdGhpcyB0aHJlYWQKICAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgSC9XIGNvbXBvc2VyCisgICAgbUh3YyA9IG5ldyBIV0NvbXBvc2VyKCk7CisgICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id2MtPnNldEZyYW1lQnVmZmVyKG1EaXNwbGF5LCBtU3VyZmFjZSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyJiBEaXNwbGF5SGFyZHdhcmU6OmdldEh3Q29tcG9zZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICptSHdjOwogfQogCiAvKgpAQCAtMjgxLDYgKzI5Miw5IEBACiB2b2lkIERpc3BsYXlIYXJkd2FyZTo6cmVsZWFzZVNjcmVlbigpIGNvbnN0CiB7CiAgICAgRGlzcGxheUhhcmR3YXJlQmFzZTo6cmVsZWFzZVNjcmVlbigpOworICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSHdjLT5yZWxlYXNlKCk7CisgICAgfQogfQogCiB2b2lkIERpc3BsYXlIYXJkd2FyZTo6YWNxdWlyZVNjcmVlbigpIGNvbnN0CkBAIC0zMTcsNyArMzMxLDEyIEBACiAgICAgfQogICAgIAogICAgIG1QYWdlRmxpcENvdW50Kys7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKworICAgIGlmIChtSHdjLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSHdjLT5jb21taXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgIH0KICAgICBjaGVja0VHTEVycm9ycygiZWdsU3dhcEJ1ZmZlcnMiKTsKIAogICAgIC8vIGZvciBkZWJ1Z2dpbmcKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaAppbmRleCA2NmJmNTIxLi5mMmNmZDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCkBAIC0zNCwxMiArMzQsMTEgQEAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5oIgogCiBzdHJ1Y3Qgb3ZlcmxheV9jb250cm9sX2RldmljZV90Owotc3RydWN0IGZyYW1lYnVmZmVyX2RldmljZV90Owotc3RydWN0IGNvcHliaXRfaW1hZ2VfdDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzsKK2NsYXNzIEhXQ29tcG9zZXI7CiAKIGNsYXNzIERpc3BsYXlIYXJkd2FyZSA6IHB1YmxpYyBEaXNwbGF5SGFyZHdhcmVCYXNlCiB7CkBAIC04MCw2ICs3OSw5IEBACiAgICAgdWludDMyX3QgZ2V0UGFnZUZsaXBDb3VudCgpIGNvbnN0OwogICAgIEVHTERpc3BsYXkgZ2V0RUdMRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1EaXNwbGF5OyB9CiAgICAgb3ZlcmxheV9jb250cm9sX2RldmljZV90KiBnZXRPdmVybGF5RW5naW5lKCkgY29uc3QgeyByZXR1cm4gbU92ZXJsYXlFbmdpbmU7IH0KKworICAgIC8vIEhhcmR3YXJlIENvbXBvc2VyCisgICAgSFdDb21wb3NlciYgZ2V0SHdDb21wb3NlcigpIGNvbnN0OwogICAgIAogICAgIHN0YXR1c190IGNvbXBvc2l0aW9uQ29tcGxldGUoKSBjb25zdDsKICAgICAKQEAgLTEwNyw2ICsxMDksOCBAQAogICAgIEdMaW50ICAgICAgICAgICBtTWF4Vmlld3BvcnREaW1zOwogICAgIEdMaW50ICAgICAgICAgICBtTWF4VGV4dHVyZVNpemU7CiAgICAgCisgICAgSFdDb21wb3NlciogICAgIG1Id2M7CisKICAgICBzcDxGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKICAgICBvdmVybGF5X2NvbnRyb2xfZGV2aWNlX3QqIG1PdmVybGF5RW5naW5lOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjliZTRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIV0NvbXBvc2VyOjpIV0NvbXBvc2VyKCkKKyAgICA6IG1Nb2R1bGUoMCksIG1Id2MoMCksIG1MaXN0KDApLCBtQ2FwYWNpdHkoMCksCisgICAgICBtRHB5KEVHTF9OT19ESVNQTEFZKSwgbVN1cihFR0xfTk9fU1VSRkFDRSkKK3sKKyAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbU1vZHVsZSk7CisgICAgTE9HV19JRihlcnIsICIlcyBtb2R1bGUgbm90IGZvdW5kIiwgSFdDX0hBUkRXQVJFX01PRFVMRV9JRCk7CisgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgIGVyciA9IGh3Y19vcGVuKG1Nb2R1bGUsICZtSHdjKTsKKyAgICAgICAgTE9HRV9JRihlcnIsICIlcyBkZXZpY2UgZmFpbGVkIHRvIGluaXRpYWxpemUgKCVzKSIsCisgICAgICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorfQorCitIV0NvbXBvc2VyOjp+SFdDb21wb3NlcigpIHsKKyAgICBmcmVlKG1MaXN0KTsKKyAgICBpZiAobUh3YykgeworICAgICAgICBod2NfY2xvc2UobUh3Yyk7CisgICAgfQorfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id2MgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3ZvaWQgSFdDb21wb3Nlcjo6c2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKSB7CisgICAgbURweSA9IChod2NfZGlzcGxheV90KWRweTsKKyAgICBtU3VyID0gKGh3Y19zdXJmYWNlX3Qpc3VyOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKSB7CisgICAgaWYgKG1Id2MpIHsKKyAgICAgICAgaWYgKCFtTGlzdCB8fCBtQ2FwYWNpdHkgPCBudW1MYXllcnMpIHsKKyAgICAgICAgICAgIGZyZWUobUxpc3QpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzKnNpemVvZihod2NfbGF5ZXJfdCk7CisgICAgICAgICAgICBtTGlzdCA9IChod2NfbGF5ZXJfbGlzdF90KiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ2FwYWNpdHkgPSBudW1MYXllcnM7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgICAgIG1MaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIV0NvbXBvc2VyOjpwcmVwYXJlKCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5wcmVwYXJlKG1Id2MsIG1MaXN0KTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc3RhdHVzX3QgSFdDb21wb3Nlcjo6Y29tbWl0KCkgY29uc3QgeworICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgbURweSwgbVN1ciwgbUxpc3QpOworICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7CisgICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Cit9CisKK3N0YXR1c190IEhXQ29tcG9zZXI6OnJlbGVhc2UoKSBjb25zdCB7CisgICAgaW50IGVyciA9IG1Id2MtPnNldChtSHdjLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICByZXR1cm4gKHN0YXR1c190KWVycjsKK30KKworc2l6ZV90IEhXQ29tcG9zZXI6OmdldE51bUxheWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+bnVtSHdMYXllcnMgOiAwOworfQorCitod2NfbGF5ZXJfdCogSFdDb21wb3Nlcjo6Z2V0TGF5ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtTGlzdCA/IG1MaXN0LT5od0xheWVycyA6IDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZmYxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICisjZGVmaW5lIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEhXQ29tcG9zZXIKK3sKK3B1YmxpYzoKKworICAgIEhXQ29tcG9zZXIoKTsKKyAgICB+SFdDb21wb3NlcigpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICAvLyB0ZWxscyB0aGUgSEFMIHdoYXQgdGhlIGZyYW1lYnVmZmVyIGlzCisgICAgdm9pZCBzZXRGcmFtZUJ1ZmZlcihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXIpOworCisgICAgLy8gY3JlYXRlIGEgd29yayBsaXN0IGZvciBudW1MYXllcnMgbGF5ZXIKKyAgICBzdGF0dXNfdCBjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKTsKKworICAgIC8vIEFza3MgdGhlIEhBTCB3aGF0IGl0IGNhbiBkbworICAgIHN0YXR1c190IHByZXBhcmUoKSBjb25zdDsKKworICAgIC8vIGNvbW1pdHMgdGhlIGxpc3QKKyAgICBzdGF0dXNfdCBjb21taXQoKSBjb25zdDsKKworICAgIC8vIHJlbGVhc2UgaGFyZHdhcmUgcmVzb3VyY2VzCisgICAgc3RhdHVzX3QgcmVsZWFzZSgpIGNvbnN0OworCisgICAgc2l6ZV90IGdldE51bUxheWVycygpIGNvbnN0OworICAgIGh3Y19sYXllcl90KiBnZXRMYXllcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBod19tb2R1bGVfdCBjb25zdCogICAgICBtTW9kdWxlOworICAgIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCogIG1Id2M7CisgICAgaHdjX2xheWVyX2xpc3RfdCogICAgICAgbUxpc3Q7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUNhcGFjaXR5OworICAgIGh3Y19kaXNwbGF5X3QgICAgICAgICAgIG1EcHk7CisgICAgaHdjX3N1cmZhY2VfdCAgICAgICAgICAgbVN1cjsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRl9IV0NPTVBPU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcAppbmRleCA2OTVjYmZhLi4xOTRjMjk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiTGF5ZXIuaCIKICNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgogCiAKICNkZWZpbmUgREVCVUdfUkVTSVpFICAgIDAKQEAgLTE4MSw2ICsxODIsNjIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgTGF5ZXI6OnNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKQoreworICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICBod2NsLT5oaW50cyA9IDA7CisgICAgaHdjbC0+ZmxhZ3MgPSAwOworICAgIGh3Y2wtPnRyYW5zZm9ybSA9IDA7CisgICAgaHdjbC0+YmxlbmRpbmcgPSBIV0NfQkxFTkRJTkdfTk9ORTsKKworICAgIC8vIHdlIGNhbid0IGRvIGFscGhhLWZhZGUgd2l0aCB0aGUgaHdjIEhBTAorICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKKyAgICBpZiAocy5hbHBoYSA8IDB4RkYpIHsKKyAgICAgICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIGNhbiBvbmx5IGhhbmRsZSBzaW1wbGUgdHJhbnNmb3JtYXRpb24KKyAgICBpZiAobU9yaWVudGF0aW9uICYgVHJhbnNmb3JtOjpST1RfSU5WQUxJRCkgeworICAgICAgICBod2NsLT5mbGFncyA9IEhXQ19TS0lQX0xBWUVSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaHdjbC0+dHJhbnNmb3JtID0gbU9yaWVudGF0aW9uOworCisgICAgaWYgKG5lZWRzQmxlbmRpbmcoKSkgeworICAgICAgICBod2NsLT5ibGVuZGluZyA9IG1QcmVtdWx0aXBsaWVkQWxwaGEgPworICAgICAgICAgICAgICAgIEhXQ19CTEVORElOR19QUkVNVUxUIDogSFdDX0JMRU5ESU5HX0NPVkVSQUdFOworICAgIH0KKworICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS5sZWZ0ICAgPSBtVHJhbnNmb3JtZWRCb3VuZHMubGVmdDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUudG9wICAgID0gbVRyYW5zZm9ybWVkQm91bmRzLnRvcDsKKyAgICBod2NsLT5kaXNwbGF5RnJhbWUucmlnaHQgID0gbVRyYW5zZm9ybWVkQm91bmRzLnJpZ2h0OworICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS5ib3R0b20gPSBtVHJhbnNmb3JtZWRCb3VuZHMuYm90dG9tOworCisgICAgaHdjbC0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3Y19yZWN0X3QgY29uc3QgKj4oCisgICAgICAgICAgICAgICAgICAgIHZpc2libGVSZWdpb25TY3JlZW4uZ2V0QXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMpKTsKK30KKwordm9pZCBMYXllcjo6c2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG1CdWZmZXJNYW5hZ2VyLmdldEFjdGl2ZUJ1ZmZlcigpKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gdGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbiBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeSBmb3IgaW5zdGFuY2UuCisgICAgICAgIC8vIG5vdCBtdWNoIHdlIGNhbiBkby4gY29udGludWUgdG8gdXNlIHdoYXRldmVyIHRleHR1cmUgd2FzIGJvdW5kCisgICAgICAgIC8vIHRvIHRoaXMgY29udGV4dC4KKyAgICAgICAgaHdjbC0+aGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBod2NsLT5oYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGJ1ZmZlci0+aGFuZGxlKTsKKyAgICAvLyBUT0RPOiBzZXQgdGhlIGNyb3AgdmFsdWUgcHJvcGVybHkKKyAgICBod2NsLT5zb3VyY2VDcm9wLmxlZnQgICA9IDA7CisgICAgaHdjbC0+c291cmNlQ3JvcC50b3AgICAgPSAwOworICAgIGh3Y2wtPnNvdXJjZUNyb3AucmlnaHQgID0gYnVmZmVyLT53aWR0aDsKKyAgICBod2NsLT5zb3VyY2VDcm9wLmJvdHRvbSA9IGJ1ZmZlci0+aGVpZ2h0OworfQorCiB2b2lkIExheWVyOjpyZWxvYWRUZXh0dXJlKGNvbnN0IFJlZ2lvbiYgZGlydHkpCiB7CiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG1CdWZmZXJNYW5hZ2VyLmdldEFjdGl2ZUJ1ZmZlcigpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCmluZGV4IGUxZDI4M2IuLjE4OGRhNmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaApAQCAtNjgsNiArNjgsOCBAQAogICAgIGJvb2wgaXNGaXhlZFNpemUoKSBjb25zdDsKIAogICAgIC8vIExheWVyQmFzZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoaHdjX2xheWVyX3QqIGh3Y2wpOworICAgIHZpcnR1YWwgdm9pZCBzZXRQZXJGcmFtZURhdGEoaHdjX2xheWVyX3QqIGh3Y2wpOwogICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGRvVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7CiAgICAgdmlydHVhbCB2b2lkIGxvY2tQYWdlRmxpcChib29sJiByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAppbmRleCA2ZmM1MDEwLi4zZDA0OWE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKQEAgLTMwOSw2ICszMDksMTUgQEAKICAgICB9CiB9CiAKK3ZvaWQgTGF5ZXJCYXNlOjpzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCkgeworICAgIGh3Y2wtPmZsYWdzIHw9IEhXQ19TS0lQX0xBWUVSOworfQorCit2b2lkIExheWVyQmFzZTo6c2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKSB7CisgICAgaHdjbC0+Y29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOworICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7Cit9CisKIHZvaWQgTGF5ZXJCYXNlOjpkcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKIHsKICAgICAvLyByZXNldCBHTCBzdGF0ZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAppbmRleCA4Y2JhMjg3Li5jNjZkYzM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaApAQCAtMzUsNiArMzUsOCBAQAogCiAjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogCisjaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgorCiAjaW5jbHVkZSAiVHJhbnNmb3JtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEwOCw2ICsxMTAsMTAgQEAKIAogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VHlwZUlkKCkgY29uc3QgeyByZXR1cm4gIkxheWVyQmFzZSI7IH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKKwogICAgIC8qKgogICAgICAqIGRyYXcgLSBwZXJmb3JtcyBzb21lIGdsb2JhbCBjbGlwcGluZyBvcHRpbWl6YXRpb25zCiAgICAgICogYW5kIGNhbGxzIG9uRHJhdygpLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCmluZGV4IDYzN2FlNDguLmQ4MjAzODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgogCiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgorI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgiCiAKIC8qIGlkZWFsbHkgQUlEX0dSQVBISUNTIHdvdWxkIGJlIGluIGEgc2VtaS1wdWJsaWMgaGVhZGVyCiAgKiBvciB0aGVyZSB3b3VsZCBiZSBhIHdheSB0byBtYXAgYSB1c2VyL2dyb3VwIG5hbWUgdG8gaXRzIGlkCkBAIC03Niw2ICs3Nyw3IEBACiAgICAgICAgIG1BY2Nlc3NTdXJmYWNlRmxpbmdlcigiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19TVVJGQUNFX0ZMSU5HRVIiKSwKICAgICAgICAgbUR1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIiksCiAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5KGZhbHNlKSwKKyAgICAgICAgbUh3V29ya0xpc3REaXJ0eShmYWxzZSksCiAgICAgICAgIG1EZWZlclJlbGVhc2VDb25zb2xlKGZhbHNlKSwKICAgICAgICAgbUZyZWV6ZURpc3BsYXkoZmFsc2UpLAogICAgICAgICBtRnJlZXplQ291bnQoMCksCkBAIC0xNjMsNyArMTY1LDcgQEAKIHsKICAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKICAgICBjb25zdCBuc2Vjc190IGR1cmF0aW9uID0gbm93IC0gbUJvb3RUaW1lOwotICAgIExPR0koIkJvb3QgaXMgZmluaXNoZWQgKCVsZCBtcykiLCBsb25nKG5zMm1zKGR1cmF0aW9uKSkgKTsgIAorICAgIExPR0koIkJvb3QgaXMgZmluaXNoZWQgKCVsZCBtcykiLCBsb25nKG5zMm1zKGR1cmF0aW9uKSkgKTsKICAgICBtQm9vdEZpbmlzaGVkID0gdHJ1ZTsKICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdG9wIiwgImJvb3RhbmltIik7CiB9CkBAIC0xOTksMTAgKzIwMSwxMCBAQAogICAgIG1TZXJ2ZXJIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKDQwOTYsCiAgICAgICAgICAgICBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZLCAiU3VyZmFjZUZsaW5nZXIgcmVhZC1vbmx5IGhlYXAiKTsKICAgICBMT0dFX0lGKG1TZXJ2ZXJIZWFwPT0wLCAiY2FuJ3QgY3JlYXRlIHNoYXJlZCBtZW1vcnkgZGVhbGVyIik7Ci0gICAgCisKICAgICBtU2VydmVyQ2JsayA9IHN0YXRpY19jYXN0PHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QqPihtU2VydmVySGVhcC0+Z2V0QmFzZSgpKTsKICAgICBMT0dFX0lGKG1TZXJ2ZXJDYmxrPT0wLCAiY2FuJ3QgZ2V0IHRvIHNoYXJlZCBjb250cm9sIGJsb2NrJ3MgYWRkcmVzcyIpOwotICAgIAorCiAgICAgbmV3KG1TZXJ2ZXJDYmxrKSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwogCiAgICAgLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IHNjcmVlbgpAQCAtMjMxLDcgKzIzMyw3IEBACiAKICAgICAvLyBJbml0aWFsaXplIE9wZW5HTHxFUwogICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7Ci0gICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7IAorICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOwogICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwogICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKQEAgLTI2NSw3ICsyNjcsNyBAQAogCiAgICAgLy8gc3RhcnQgYm9vdCBhbmltYXRpb24KICAgICBwcm9wZXJ0eV9zZXQoImN0bC5zdGFydCIsICJib290YW5pbSIpOwotICAgIAorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zNjgsNiArMzcwLDExIEBACiAgICAgLy8gcG9zdCBzdXJmYWNlcyAoaWYgbmVlZGVkKQogICAgIGhhbmRsZVBhZ2VGbGlwKCk7CiAKKyAgICBpZiAoVU5MSUtFTFkobUh3V29ya0xpc3REaXJ0eSkpIHsKKyAgICAgICAgLy8gYnVpbGQgdGhlIGgvdyB3b3JrIGxpc3QKKyAgICAgICAgaGFuZGxlV29ya0xpc3QoKTsKKyAgICB9CisKICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CiAgICAgaWYgKExJS0VMWShody5jYW5EcmF3KCkgJiYgIWlzRnJvemVuKCkpKSB7CiAgICAgICAgIC8vIHJlcGFpbnQgdGhlIGZyYW1lYnVmZmVyIChpZiBuZWVkZWQpCkBAIC0zNzYsMTAgKzM4MywxMCBAQAogICAgICAgICAvLyBpbmZvcm0gdGhlIGgvdyB0aGF0IHdlJ3JlIGRvbmUgY29tcG9zaXRpbmcKICAgICAgICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwogCi0gICAgICAgIC8vIHJlbGVhc2UgdGhlIGNsaWVudHMgYmVmb3JlIHdlIGZsaXAgKCdjYXVzZSBmbGlwIG1pZ2h0IGJsb2NrKQorICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKKwogICAgICAgICB1bmxvY2tDbGllbnRzKCk7CiAKLSAgICAgICAgcG9zdEZyYW1lYnVmZmVyKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gcHJldGVuZCB3ZSBkaWQgdGhlIHBvc3QKICAgICAgICAgdW5sb2NrQ2xpZW50cygpOwpAQCAtNDQzLDYgKzQ1MCw3IEBACiAgICAgICAgIGhhbmRsZVRyYW5zYWN0aW9uTG9ja2VkKHRyYW5zYWN0aW9uRmxhZ3MsIGRpdGNoZWRMYXllcnMpOwogICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbiA9IDA7CisgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICAvLyBoZXJlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQKICAgICB9CiAKQEAgLTQ1MCw2ICs0NTgsNyBAQAogICAgICAqIENsZWFuLXVwIGFsbCBsYXllcnMgdGhhdCB3ZW50IGF3YXkKICAgICAgKiAoZG8gdGhpcyB3aXRob3V0IHRoZSBsb2NrIGhlbGQpCiAgICAgICovCisKICAgICBjb25zdCBzaXplX3QgY291bnQgPSBkaXRjaGVkTGF5ZXJzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGlmIChkaXRjaGVkTGF5ZXJzW2ldICE9IDApIHsKQEAgLTY1Myw3ICs2NjIsNyBAQAogCiAgICAgICAgIC8vIFVwZGF0ZSBhYm92ZU9wYXF1ZUxheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCiAgICAgICAgIGFib3ZlT3BhcXVlTGF5ZXJzLm9yU2VsZihvcGFxdWVSZWdpb24pOwotICAgICAgICAKKwogICAgICAgICAvLyBTdG9yZSB0aGUgdmlzaWJsZSByZWdpb24gaXMgc2NyZWVuIHNwYWNlCiAgICAgICAgIGxheWVyLT5zZXRWaXNpYmxlUmVnaW9uKHZpc2libGVSZWdpb24pOwogICAgICAgICBsYXllci0+c2V0Q292ZXJlZFJlZ2lvbihjb3ZlcmVkUmVnaW9uKTsKQEAgLTY4Myw4ICs2OTIsOCBAQAogdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUGFnZUZsaXAoKQogewogICAgIGJvb2wgdmlzaWJsZVJlZ2lvbnMgPSBtVmlzaWJsZVJlZ2lvbnNEaXJ0eTsKLSAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPigKLSAgICAgICAgICAgIG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKKyAgICBMYXllclZlY3RvciYgY3VycmVudExheWVycygKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8TGF5ZXJWZWN0b3ImPihtRHJhd2luZ1N0YXRlLmxheWVyc1NvcnRlZEJ5WikpOwogICAgIHZpc2libGVSZWdpb25zIHw9IGxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKIAogICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpOwpAQCAtNzA3LDYgKzcxNiw3IEBACiAKICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbiA9IHNjcmVlblJlZ2lvbi5zdWJ0cmFjdChvcGFxdWVSZWdpb24pOwogICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSBmYWxzZTsKKyAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICB1bmxvY2tQYWdlRmxpcChjdXJyZW50TGF5ZXJzKTsKQEAgLTczNyw2ICs3NDcsMjAgQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVdvcmtMaXN0KCkKK3sKKyAgICBtSHdXb3JrTGlzdERpcnR5ID0gZmFsc2U7CisgICAgSFdDb21wb3NlciYgaHdjKGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKS5nZXRId0NvbXBvc2VyKCkpOworICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGN1cnJlbnRMYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKKyAgICAgICAgaHdjLmNyZWF0ZVdvcmtMaXN0KGNvdW50KTsKKyAgICAgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBjdXIgJiYgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY3VycmVudExheWVyc1tpXS0+c2V0R2VvbWV0cnkoJmN1cltpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVJlcGFpbnQoKQogewpAQCAtNzU3LDggKzc4MSw4IEBACiAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICBpZiAoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwgCi0gICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpIAorICAgIGlmICgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAorICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKQogICAgIHsKICAgICAgICAgLy8gd2UgY2FuIHJlZHJhdyBvbmx5IHdoYXQncyBkaXJ0eSwgYnV0IHNpbmNlIFNXQVBfUkVDVEFOR0xFIG9ubHkKICAgICAgICAgLy8gdGFrZXMgYSByZWN0YW5nbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGF0IHdob2xlCkBAIC04MDEsOSArODI1LDcyIEBACiAgICAgICAgIC8vIGRyYXcgc29tZXRoaW5nLi4uCiAgICAgICAgIGRyYXdXb3JtaG9sZSgpOwogICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBsYXllcnMobVZpc2libGVMYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7ICsraSkgeworICAgIHNpemVfdCBjb3VudCA9IGxheWVycy5zaXplKCk7CisKKyAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CisgICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7CisgICAgaHdjX2xheWVyX3QqIGNvbnN0IGN1cihod2MuZ2V0TGF5ZXJzKCkpOworCisgICAgTE9HRV9JRihjdXIgJiYgaHdjLmdldE51bUxheWVycygpICE9IGNvdW50LAorICAgICAgICAgICAgIkhBTCBudW1iZXIgb2YgbGF5ZXJzICglZCkgZG9lc24ndCBtYXRjaCBzdXJmYWNlZmxpbmdlciAoJWQpIiwKKyAgICAgICAgICAgIGh3Yy5nZXROdW1MYXllcnMoKSwgY291bnQpOworCisgICAgLy8ganVzdCB0byBiZSBleHRyYS1zYWZlLCB1c2UgdGhlIHNtYWxsZXN0IGNvdW50CisgICAgaWYgKGh3Yy5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICBjb3VudCA9IGNvdW50IDwgaHdjLmdldE51bUxheWVycygpID8gY291bnQgOiBod2MuZ2V0TnVtTGF5ZXJzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgdXBkYXRlIHRoZSBwZXItZnJhbWUgaC93IGNvbXBvc2VyIGRhdGEgZm9yIGVhY2ggbGF5ZXIKKyAgICAgKiAgYW5kIGJ1aWxkIHRoZSB0cmFuc3BhcmVudCByZWdpb24gb2YgdGhlIEZCCisgICAgICovCisgICAgUmVnaW9uIHRyYW5zcGFyZW50OworICAgIGlmIChjdXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKKyAgICAgICAgICAgIGxheWVyLT5zZXRQZXJGcmFtZURhdGEoJmN1cltpXSk7CisgICAgICAgICAgICBpZiAoY3VyW2ldLmhpbnRzICYgSFdDX0hJTlRfQ0xFQVJfRkIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShsYXllci0+bmVlZHNCbGVuZGluZygpKSkgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBod2MucHJlcGFyZSgpOworICAgICAgICBMT0dFX0lGKGVyciwgIkhXQ29tcG9zZXI6OnByZXBhcmUgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgY2xlYXIgdGhlIGFyZWEgb2YgdGhlIEZCIHRoYXQgbmVlZCB0byBiZSB0cmFuc3BhcmVudAorICAgICAqLworICAgIHRyYW5zcGFyZW50LmFuZFNlbGYoZGlydHkpOworICAgIGlmICghdHJhbnNwYXJlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKKyAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHRyYW5zcGFyZW50LmJlZ2luKCk7CisgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gdHJhbnNwYXJlbnQuZW5kKCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIoKml0KyspOworICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKKyAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOworICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBhbmQgdGhlbiwgcmVuZGVyIHRoZSBsYXllcnMgdGFyZ2V0ZWQgYXQgdGhlIGZyYW1lYnVmZmVyCisgICAgICovCisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICBpZiAoKGN1cltpXS5jb21wb3NpdGlvblR5cGUgIT0gSFdDX0ZSQU1FQlVGRkVSKSAmJgorICAgICAgICAgICAgICAgICEoY3VyW2ldLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBsYXllcnMgaGFuZGxlZCBieSB0aGUgSEFMCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKICAgICAgICAgY29uc3QgUmVnaW9uIGNsaXAoZGlydHkuaW50ZXJzZWN0KGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKSk7CiAgICAgICAgIGlmICghY2xpcC5pc0VtcHR5KCkpIHsKQEAgLTEwNDIsNyArMTEyOSw3IEBACiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbVRyYW5zYWN0aW9uQ291bnQpID09IDEpIHsKICAgICAgICAgc2lnbmFsRXZlbnQoKTsKIAotICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHdpdGggYSByZXNpemUsIHdhaXQgZm9yIGl0IHRvIAorICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIHdpdGggYSByZXNpemUsIHdhaXQgZm9yIGl0IHRvCiAgICAgICAgIC8vIHRha2UgZWZmZWN0IGJlZm9yZSByZXR1cm5pbmcuCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKICAgICAgICAgd2hpbGUgKG1SZXNpemVUcmFuc2F0aW9uUGVuZGluZykgewpAQCAtMTA4Niw3ICsxMTczLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWludCBTdXJmYWNlRmxpbmdlcjo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwgCitpbnQgU3VyZmFjZUZsaW5nZXI6OnNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksCiAgICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgaWYgKFVOTElLRUxZKHVpbnQzMl90KGRweSkgPj0gRElTUExBWV9DT1VOVCkpCkBAIC0xMTE5LDE0ICsxMjA2LDE3IEBACiAgICAgICAgICAgICAgICAgaW50KHcpLCBpbnQoaCkpOwogICAgICAgICByZXR1cm4gc3VyZmFjZUhhbmRsZTsKICAgICB9Ci0gICAgCisKICAgICAvL0xPR0QoImNyZWF0ZVN1cmZhY2UgZm9yIHBpZCAlZCAoJWQgeCAlZCkiLCBwaWQsIHcsIGgpOwogICAgIHNwPExheWVyPiBub3JtYWxMYXllcjsKICAgICBzd2l0Y2ggKGZsYWdzICYgZUZYU3VyZmFjZU1hc2spIHsKICAgICAgICAgY2FzZSBlRlhTdXJmYWNlTm9ybWFsOgorI2lmIEhBU19QVVNIX0JVRkZFUlMKICAgICAgICAgICAgIGlmIChVTkxJS0VMWShmbGFncyAmIGVQdXNoQnVmZmVycykpIHsKICAgICAgICAgICAgICAgICBsYXllciA9IGNyZWF0ZVB1c2hCdWZmZXJzU3VyZmFjZShjbGllbnQsIGQsIHcsIGgsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5vcm1hbExheWVyID0gY3JlYXRlTm9ybWFsU3VyZmFjZShjbGllbnQsIGQsIHcsIGgsIGZsYWdzLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIGxheWVyID0gbm9ybWFsTGF5ZXI7CiAgICAgICAgICAgICB9CkBAIC0xMTQ1LDcgKzEyMzUsNyBAQAogICAgICAgICBzc2l6ZV90IHRva2VuID0gYWRkQ2xpZW50TGF5ZXIoY2xpZW50LCBsYXllcik7CiAKICAgICAgICAgc3VyZmFjZUhhbmRsZSA9IGxheWVyLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsgCisgICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsKICAgICAgICAgICAgIHBhcmFtcy0+dG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgIHBhcmFtcy0+aWRlbnRpdHkgPSBzdXJmYWNlSGFuZGxlLT5nZXRJZGVudGl0eSgpOwogICAgICAgICAgICAgcGFyYW1zLT53aWR0aCA9IHc7CkBAIC0xMjI5LDcgKzEzMTksNyBAQAogICAgIC8qCiAgICAgICogY2FsbGVkIGJ5IHRoZSB3aW5kb3cgbWFuYWdlciwgd2hlbiBhIHN1cmZhY2Ugc2hvdWxkIGJlIG1hcmtlZCBmb3IKICAgICAgKiBkZXN0cnVjdGlvbi4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIFRoZSBzdXJmYWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudCBhbmQgZHJhd2luZyBsaXN0cywgYnV0IHBsYWNlZAogICAgICAqIGluIHRoZSBwdXJnYXRvcnkgcXVldWUsIHNvIGl0J3Mgbm90IGRlc3Ryb3llZCByaWdodC1hd2F5ICh3ZSBuZWVkCiAgICAgICogdG8gd2FpdCBmb3IgYWxsIGNsaWVudCdzIHJlZmVyZW5jZXMgdG8gZ28gYXdheSBmaXJzdCkuCkBAIC0xMjUwLDcgKzEzNDAsNyBAQAogc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmRlc3Ryb3lTdXJmYWNlKGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQogewogICAgIC8vIGNhbGxlZCBieSB+SVN1cmZhY2UoKSB3aGVuIGFsbCByZWZlcmVuY2VzIGFyZSBnb25lCi0gICAgCisKICAgICBjbGFzcyBNZXNzYWdlRGVzdHJveVN1cmZhY2UgOiBwdWJsaWMgTWVzc2FnZUJhc2UgewogICAgICAgICBTdXJmYWNlRmxpbmdlciogZmxpbmdlcjsKICAgICAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcjsKQEAgLTEyNjMsOSArMTM1Myw5IEBACiAgICAgICAgICAgICBsYXllci5jbGVhcigpOyAvLyBjbGVhciBpdCBvdXRzaWRlIG9mIHRoZSBsb2NrOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGZsaW5nZXItPm1TdGF0ZUxvY2spOwogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHJlbW92ZSB0aGUgbGF5ZXIgZnJvbSB0aGUgY3VycmVudCBsaXN0IC0tIGNoYW5jZXMgYXJlIHRoYXQgaXQncyAKLSAgICAgICAgICAgICAqIG5vdCBpbiB0aGUgbGlzdCBhbnl3YXksIGJlY2F1c2UgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIAotICAgICAgICAgICAgICogYWxyZWFkeSB1cG9uIHJlcXVlc3Qgb2YgdGhlIGNsaWVudCAoZWc6IHdpbmRvdyBtYW5hZ2VyKS4gCisgICAgICAgICAgICAgKiByZW1vdmUgdGhlIGxheWVyIGZyb20gdGhlIGN1cnJlbnQgbGlzdCAtLSBjaGFuY2VzIGFyZSB0aGF0IGl0J3MKKyAgICAgICAgICAgICAqIG5vdCBpbiB0aGUgbGlzdCBhbnl3YXksIGJlY2F1c2UgaXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkCisgICAgICAgICAgICAgKiBhbHJlYWR5IHVwb24gcmVxdWVzdCBvZiB0aGUgY2xpZW50IChlZzogd2luZG93IG1hbmFnZXIpLgogICAgICAgICAgICAgICogSG93ZXZlciwgYSBidWdneSBjbGllbnQgY291bGQgaGF2ZSBub3QgZG9uZSB0aGF0LgogICAgICAgICAgICAgICogU2luY2Ugd2Uga25vdyB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNsaWVudHMsIHdlIGRvbid0IG5lZWQKICAgICAgICAgICAgICAqIHRvIHVzZSB0aGUgcHVyZ2F0b3J5LgpAQCAtMTM4MCw3ICsxNDcwLDcgQEAKICAgICAgICAgfQogICAgICAgICBjb25zdCBib29sIGxvY2tlZChyZXRyeSA+PSAwKTsKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgCisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCiAgICAgICAgICAgICAgICAgICAgICJTdXJmYWNlRmxpbmdlciBhcHBlYXJzIHRvIGJlIHVucmVzcG9uc2l2ZSwgIgogICAgICAgICAgICAgICAgICAgICAiZHVtcGluZyBhbnl3YXlzIChubyBsb2NrcyBoZWxkKVxuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC0xNjU1LDEyICsxNzQ1LDE1IEBACiB7CiAgICAgaW50MzJfdCBuYW1lID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgc3A8TGF5ZXI+IGxheWVyKG1GbGluZ2VyLT5nZXRMYXllcihzdXIpKTsKLSAgICBpZiAobGF5ZXIgPT0gMCkgcmV0dXJuIG5hbWU7CisgICAgaWYgKGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQogCiAgICAgLy8gaWYgdGhpcyBsYXllciBhbHJlYWR5IGhhcyBhIHRva2VuLCBqdXN0IHJldHVybiBpdAogICAgIG5hbWUgPSBsYXllci0+Z2V0VG9rZW4oKTsKLSAgICBpZiAoKG5hbWUgPj0gMCkgJiYgKGxheWVyLT5nZXRDbGllbnQoKSA9PSB0aGlzKSkKKyAgICBpZiAoKG5hbWUgPj0gMCkgJiYgKGxheWVyLT5nZXRDbGllbnQoKSA9PSB0aGlzKSkgewogICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CiAKICAgICBuYW1lID0gMDsKICAgICBkbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAppbmRleCA4ZWNmYzAxLi44ZTI4NmU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKQEAgLTI5Niw2ICsyOTYsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUGFnZUZsaXAoKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGxvY2tQYWdlRmxpcChjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyk7CiAgICAgICAgICAgICB2b2lkICAgICAgICB1bmxvY2tQYWdlRmxpcChjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyk7CisgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVXb3JrTGlzdCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlUmVwYWludCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgcG9zdEZyYW1lYnVmZmVyKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBjb21wb3NlU3VyZmFjZXMoY29uc3QgUmVnaW9uJiBkaXJ0eSk7CkBAIC0zNzAsNiArMzcxLDcgQEAKICAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRSZWdpb247CiAgICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHk7CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHk7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclJlbGVhc2VDb25zb2xlOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZXplRGlzcGxheTsKICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUZyZWV6ZUNvdW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGIwN2ExMGIuLjE4NmIzNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWQubWsKQEAgLTcsOCArNywxMCBAQAogIyBJbmNsdWRlIGFsbCB0ZXN0IGphdmEgZmlsZXMuCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCiAKK0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBlYXN5bW9ja2xpYgogCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnRlc3QucnVubmVyIHNlcnZpY2VzCisKIExPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBGcmFtZXdvcmtzU2VydmljZXNUZXN0cwogCiBMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDVjZTEwOWYuLmYxMTVmNDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTIzLDYgKzIzLDE5IEBACiAgICAgCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiLz4KKyAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnNlcnZlci5BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0JE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIj4KKyAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIi8+CisgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L3NlcnZpY2U+CisKICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlM2E4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCisvKioKKyAqIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhlCisgKiB7QGxpbmsgY29tLmFuZHJvaWQuc2VydmVyLkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZX0gYnkgbW9ja2luZyB0aGUKKyAqIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcn0gd2hpY2ggdGFsa3MgdG8gdG8gdGhlCisgKiBzZXJ2aWNlLiBUaGUgc2VydmljZSBpdHNlbGYgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcGxhdGZvcm0uIE5vdGU6IFRlc3RpbmcKKyAqIHRoZSBzZXJ2aWNlIGluIGZ1bGwgaXNvbGF0aW9uIHdvdWxkIHJlcXVpcmUgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHdvcmsgZm9yCisgKiBtb2NraW5nIGFsbCBzeXN0ZW0gaW50ZXJhY3Rpb25zLiBJdCB3b3VsZCBhbHNvIHJlcXVpcmUgYSBsb3Qgb2YgbW9ja2luZyBjb2RlLgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX0JJTkRFUl9DQUxMID0gMTAwOworCisgICAgLyoqCisgICAgICogVGltZW91dCBpbiB3aGljaCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIHN5c3RlbSB0byBzdGFydCB0aGUgbW9jaworICAgICAqIGFjY2Vzc2liaWxpdHkgc2VydmljZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FT1VUX1NUQVJUX01PQ0tfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgdXNlZCBmb3IgdGVzdGluZyB0aGF0IGEgc2VydmljZSBpcyBub3RpZmllZCBvbmx5IHVwb24gYQorICAgICAqIG5vdGlmaWNhdGlvbiB0aW1lb3V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUID0gMzAwOworCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc1BhY2thZ2VOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSB1c2VkIHRvIHRhbGsgdG8gdGhlIHRlc3RlZCBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1NYW5hZ2VyU2VydmljZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7CisgICAgICAgIGlmIChzUGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc1BhY2thZ2VOYW1lID0gY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdCgpIHsKKyAgICAgICAgSUJpbmRlciBpQmluZGVyID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZSA9IElBY2Nlc3NpYmlsaXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKGlCaW5kZXIpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlEaXNhYmxlZFRoZW5FbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IG1vY2sgaW5zdGFuY2UKKyAgICAgICAgTXlNb2NrQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQgbW9ja0NsaWVudCA9IG5ldyBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkID0gbU1hbmFnZXJTZXJ2aWNlLmFkZENsaWVudChtb2NrQ2xpZW50KTsKKworICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjbGllbnQgbXVzdCBiZSBkaXNhYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGRpc2FibGVkLiIsCisgICAgICAgICAgICAgICAgZW5hYmxlZEFjY2Vzc2liaWxpdHlEaXNhYmxlZCk7CisKKyAgICAgICAgLy8gZW5hYmxlIGFjY2Vzc2liaWxpdHkKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY2xpZW50IG11c3QgYmUgZW5hYmxlZCBzaW5jZSBhY2Nlc3NpYmlsaXR5IGlzIGVuYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eUVuYWJsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xpZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkVGhlbkRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGVuYWJsZSBhY2Nlc3NpYmlsaXR5IGJlZm9yZSByZWdpc3RlcmluZyB0aGUgY2xpZW50CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBjbGllbnQgbW9jayBpbnN0YW5jZQorICAgICAgICBNeU1vY2tBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBtb2NrQ2xpZW50ID0gbmV3IE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCA9IG1NYW5hZ2VyU2VydmljZS5hZGRDbGllbnQobW9ja0NsaWVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBjbGllbnQgbXVzdCBiZSBlbmFibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZW5hYmxlZC4iLAorICAgICAgICAgICAgICAgIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCBmYWxzZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBib29sZWFuIGVuYWJsZWRBY2Nlc3NpYmlsaXR5RGlzYWJsZWQgPSBtTWFuYWdlclNlcnZpY2UuYWRkQ2xpZW50KG1vY2tDbGllbnQpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiVGhlIGNsaWVudCBtdXN0IGJlIGRpc2FibGVkIHNpbmNlIGFjY2Vzc2liaWxpdHkgaXMgZGlzYWJsZWQuIiwKKyAgICAgICAgICAgICAgICBlbmFibGVkQWNjZXNzaWJpbGl0eURpc2FibGVkKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQgPSBmYWxzZTsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGZpcnN0TW9ja1NlcnZpY2VDbGFzc05hbWUgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0d28gbW9jayBzZXJ2aWNlcworICAgICAgICBmb3IgKFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvIDogbU1hbmFnZXJTZXJ2aWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlSW5zdGFsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIkZpcnN0IG1vY2sgc2VydmljZSBtdXN0IGJlIGluc3RhbGxlZCIsIGZpcnN0TW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgbW9jayBzZXJ2aWNlIG11c3QgYmUgaW5zdGFsbGVkIiwgc2Vjb25kTW9ja1NlcnZpY2VJbnN0YWxsZWQpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIGZhbHNlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2VydmljZSA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGwgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90TWF0Y2hpbmdQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJuby5zZXJ2aWNlLnJlZ2lzdGVyZWQuZm9yLnRoaXMucGFja2FnZSIpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9PbmVTZXJ2aWNlX05vdE1hdGNoaW5nRXZlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxsIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9OT1RJRklDQVRJT05fU1RBVEVfQ0hBTkdFRCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X09uZVNlcnZpY2VfTm90aWZpdmF0aW9uQWZ0ZXJUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNldCB0aGUgYWNjZXNzaWJpbGl0eSBzZXR0aW5nIHZhbHVlCisgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKG1Db250ZXh0LCB0cnVlKTsKKworICAgICAgICAvLyBlbmFibGUgdGhlIG1vY2sgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUOworICAgICAgICBzZXJ2aWNlLnNldFNlcnZpY2VJbmZvKGluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbCB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZmlyc3QgZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZmlyc3RFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgc2Vjb25kIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlY29uZEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZWNvbmRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucworICAgICAgICBzZXJ2aWNlLmV4cGVjdEV2ZW50KHNlY29uZEV2ZW50KTsKKyAgICAgICAgc2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudHMKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZmlyc3RFdmVudCk7CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlY29uZEV2ZW50KTsKKworICAgICAgICAvLyB3YWl0IGZvciAjc2VuZEFjY2Vzc2liaWxpdHlFdmVudCB0byByZWFjaCB0aGUgYmFja2luZyBzZXJ2aWNlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmljZS52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoIk5vIGV2ZW50cyBtdXN0IGJlIGRpc3BhdGNoZWQgYmVmb3JlIHRoZSBleHBpcmF0aW9uIG9mIHRoZSBub3RpZmljYXRpb24gdGltZW91dC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgeworICAgICAgICAgICAgLyogZXhwZWN0ZWQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjb25maWd1cmVkIG5vdGlmaWNhdGlvbiB0aW1lb3V0IHRvIGV4cGlyZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9URVNUX05PVElGSUNBVElPTl9USU1FT1VUKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWYgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBhc3NlcnRNb2NrU2VydmljZVZlcmlmaWVkV2l0aGluVGltZW91dChzZXJ2aWNlKTsKKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRfVHdvU2VydmljZXNfTWF0Y2hpbmdQYWNrYWdlQW5kRXZlbnRUeXBlX0RpZmZGZWVkYmFjaygpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19BVURJQkxFOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBzZWNvbmRJbmZvID0gTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmVlZGJhY2tUeXBlID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX0hBUFRJQzsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhzZWNvbmRJbmZvKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZSgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHBvcHVsYXRlIGFuIGV2ZW50IHRvIGJlIHNlbnQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgZnVsbHlQb3B1bGF0ZURlZmF1bHRBY2Nlc3NpYmlsaXR5RXZlbnQoc2VudEV2ZW50KTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZW5kIHRoZSBldmVudAorICAgICAgICBtTWFuYWdlclNlcnZpY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9Ud29TZXJ2aWNlc19NYXRjaGluZ1BhY2thZ2VBbmRFdmVudFR5cGVfT25lRGVmYXVsdCgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBmaXJzdEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIGZpcnN0SW5mby5mbGFncyA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5ERUZBVUxUOworICAgICAgICBmaXJzdFNlcnZpY2Uuc2V0U2VydmljZUluZm8oZmlyc3RJbmZvKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNlY29uZFNlcnZpY2UgPSBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIHNlY29uZFNlcnZpY2Uuc2V0U2VydmljZUluZm8oTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGJpbmRlciBjYWxscyB0byAjc2V0U2VydmljZSB0byBjb21wbGV0ZQorICAgICAgICBUaHJlYWQuc2xlZXAoVElNRU9VVF9CSU5ERVJfQ0FMTCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBhbiBldmVudCB0byBiZSBzZW50CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGZ1bGx5UG9wdWxhdGVEZWZhdWx0QWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBmaXJzdFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gc2V0IGV4cGVjdGF0aW9ucyBmb3IgdGhlIHNlY29uZCBtb2NrIHNlcnZpY2UKKyAgICAgICAgc2Vjb25kU2VydmljZS5leHBlY3RFdmVudChzZW50RXZlbnQpOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X1R3b1NlcnZpY2VzX01hdGNoaW5nUGFja2FnZUFuZEV2ZW50VHlwZV9Ud29EZWZhdWx0KCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzZXQgdGhlIGFjY2Vzc2liaWxpdHkgc2V0dGluZyB2YWx1ZQorICAgICAgICBlbnN1cmVBY2Nlc3NpYmlsaXR5RW5hYmxlZChtQ29udGV4dCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMKKyAgICAgICAgZW5zdXJlT25seU1vY2tTZXJ2aWNlc0VuYWJsZWQobUNvbnRleHQsIHRydWUsIHRydWUpOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBmaXJzdFNlcnZpY2UgPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGZpcnN0SW5mbyA9IE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKTsKKyAgICAgICAgZmlyc3RJbmZvLmZsYWdzID0gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQ7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Ugc2Vjb25kU2VydmljZSA9IE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNJbnN0YW5jZTsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIHNlY29uZEluZm8gPSBNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNyZWF0ZURlZmF1bHRJbmZvKCk7CisgICAgICAgIHNlY29uZEluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgc2Vjb25kU2VydmljZS5zZXRTZXJ2aWNlSW5mbyhmaXJzdEluZm8pOworCisgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiaW5kZXIgY2FsbHMgdG8gI3NldFNlcnZpY2UgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgcG9wdWxhdGUgYW4gZXZlbnQgdG8gYmUgc2VudAorICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigpOworICAgICAgICBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBmaXJzdCBtb2NrIHNlcnZpY2UKKyAgICAgICAgZmlyc3RTZXJ2aWNlLmV4cGVjdEV2ZW50KHNlbnRFdmVudCk7CisgICAgICAgIGZpcnN0U2VydmljZS5yZXBsYXkoKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgc2Vjb25kIG1vY2sgc2VydmljZQorICAgICAgICBzZWNvbmRTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNlbmQgdGhlIGV2ZW50CisgICAgICAgIG1NYW5hZ2VyU2VydmljZS5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGlmIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoZmlyc3RTZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0TW9ja1NlcnZpY2VWZXJpZmllZFdpdGhpblRpbWVvdXQoc2Vjb25kU2VydmljZSk7CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gc2V0IHRoZSBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgdmFsdWUKKyAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eUVuYWJsZWQobUNvbnRleHQsIHRydWUpOworCisgICAgICAgIC8vIGVuYWJsZSB0aGUgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCisgICAgICAgIGVuc3VyZU9ubHlNb2NrU2VydmljZXNFbmFibGVkKG1Db250ZXh0LCB0cnVlLCB0cnVlKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIGZpcnN0IG1vY2sgc2VydmljZQorICAgICAgICBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZmlyc3RTZXJ2aWNlID0gTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2U7CisgICAgICAgIGZpcnN0U2VydmljZS5zZXRTZXJ2aWNlSW5mbyhNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY3JlYXRlRGVmYXVsdEluZm8oKSk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZWNvbmRTZXJ2aWNlID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlOworICAgICAgICBzZWNvbmRTZXJ2aWNlLnNldFNlcnZpY2VJbmZvKE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5jcmVhdGVEZWZhdWx0SW5mbygpKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgYmluZGVyIGNhbGxzIHRvICNzZXRTZXJ2aWNlIHRvIGNvbXBsZXRlCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKworICAgICAgICAvLyBzZXQgZXhwZWN0YXRpb25zIGZvciB0aGUgZmlyc3QgbW9jayBzZXJ2aWNlCisgICAgICAgIGZpcnN0U2VydmljZS5leHBlY3RJbnRlcnJ1cHQoKTsKKyAgICAgICAgZmlyc3RTZXJ2aWNlLnJlcGxheSgpOworCisgICAgICAgIC8vIHNldCBleHBlY3RhdGlvbnMgZm9yIHRoZSBzZWNvbmQgbW9jayBzZXJ2aWNlCisgICAgICAgIHNlY29uZFNlcnZpY2UuZXhwZWN0SW50ZXJydXB0KCk7CisgICAgICAgIHNlY29uZFNlcnZpY2UucmVwbGF5KCk7CisKKyAgICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgbU1hbmFnZXJTZXJ2aWNlLmludGVycnVwdCgpOworCisgICAgICAgIC8vIHZlcmlmeSBpZiBhbGwgZXhwZWN0ZWQgbWV0aG9kcyBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KGZpcnN0U2VydmljZSk7CisgICAgICAgIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KHNlY29uZFNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGx5IHBvcHVsYXRlcyB0aGUge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gdG8gbWFyc2hhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZW50RXZlbnQgVGhlIGV2ZW50IHRvIHBvcHVsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmdWxseVBvcHVsYXRlRGVmYXVsdEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgc2VudEV2ZW50KSB7CisgICAgICAgIHNlbnRFdmVudC5zZXRBZGRlZENvdW50KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0QmVmb3JlVGV4dCgiQmVmb3JlVGV4dCIpOworICAgICAgICBzZW50RXZlbnQuc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENsYXNzTmFtZSgiZm9vLmJhci5iYXouQ2xhc3MiKTsKKyAgICAgICAgc2VudEV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbigiQ29udGVudERlc2NyaXB0aW9uIik7CisgICAgICAgIHNlbnRFdmVudC5zZXRDdXJyZW50SXRlbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEV2ZW50VHlwZShBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0NMSUNLRUQpOworICAgICAgICBzZW50RXZlbnQuc2V0RXZlbnRUaW1lKDEwMDApOworICAgICAgICBzZW50RXZlbnQuc2V0RnJvbUluZGV4KDEpOworICAgICAgICBzZW50RXZlbnQuc2V0RnVsbFNjcmVlbih0cnVlKTsKKyAgICAgICAgc2VudEV2ZW50LnNldEl0ZW1Db3VudCgxKTsKKyAgICAgICAgc2VudEV2ZW50LnNldFBhY2thZ2VOYW1lKCJmb28uYmFyLmJheiIpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFyY2VsYWJsZURhdGEoTWVzc2FnZS5vYnRhaW4obnVsbCwgMSwgbnVsbCkpOworICAgICAgICBzZW50RXZlbnQuc2V0UGFzc3dvcmQodHJ1ZSk7CisgICAgICAgIHNlbnRFdmVudC5zZXRSZW1vdmVkQ291bnQoMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyBhIG1vY2sge0BsaW5rIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudH0uCisgICAgICovCisgICAgcHVibGljIGNsYXNzIE15TW9ja0FjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LlN0dWIgeworICAgICAgICBib29sZWFuIG1Jc0VuYWJsZWQ7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyBhY2Nlc3NpYmlsaXR5IGlzIGluIGEgZ2l2ZW4gc3RhdGUgYnkgd3JpdGluZyB0aGUgc3RhdGUgdG8gdGhlCisgICAgICogc2V0dGluZ3MgYW5kIHdhaXRpbmcgdW50aWwgdGhlIGFjY2Vzc2liaWxpdHkgbWFuYWdlciBzZXJ2aWNlIHBpY2sgaXQgdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgaGFuZGxlIHRvIGFjY2VzcyB0aGUgc2V0dGluZ3MuCisgICAgICogQHBhcmFtIGVuYWJsZWQgVGhlIGFjY2Vzc2liaWxpdHkgc3RhdGUgdG8gd3JpdGUgdG8gdGhlIHNldHRpbmdzLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFueSBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjY2Vzc2liaWxpdHlFbmFibGVkKENvbnRleHQgY29udGV4dCwgYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSAoU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDApID09IDEgPyB0cnVlIDogZmFsc2UpOworCisgICAgICAgIGlmIChpc0VuYWJsZWQgPT0gZW5hYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELAorICAgICAgICAgICAgICAgIGVuYWJsZWQgPyAxIDogMCk7CisKKyAgICAgICAgLy8gd2FpdCB0aGUgYWNjZXNzaWJpbGl0eSBtYW5hZ2VyIHNlcnZpY2UgdG8gcGljayB0aGUgY2hhbmdlIHVwCisgICAgICAgIFRocmVhZC5zbGVlcChUSU1FT1VUX0JJTkRFUl9DQUxMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSBvbmx5IHtAbGluayBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2V9cyB3aXRoIGdpdmVuIGNvbXBvbmVudAorICAgICAqIG5hbWVzIGFyZSBlbmFibGVkIGJ5IHdyaXRpbmcgdG8gdGhlIHN5c3RlbSBzZXR0aW5ncyBhbmQgd2FpdGluZyB1bnRpbCB0aGUKKyAgICAgKiBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrcyB0aGF0IHVwIG9yIHRoZQorICAgICAqIHtAbGluayAjVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVN9IGlzIGV4Y2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IGhhbmRsZSB0byBhY2Nlc3MgdGhlIHNldHRpbmdzLgorICAgICAqIEBwYXJhbSBmaXJzdE1vY2tTZXJ2aWNlRW5hYmxlZCBJZiB0aGUgZmlyc3QgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAcGFyYW0gc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkIElmIHRoZSBzZWNvbmQgbW9jayBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgZW5hYmxlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBzb21lIG9mIHRoZSByZXF1ZXN0ZWQgZm9yIGVuYWJsaW5nIG1vY2sgc2VydmljZXMKKyAgICAgKiAgICAgICAgIGlzIG5vdCBwcm9wZXJseSBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEV4Y2VwdGlvbiBJZiBhbnkgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVPbmx5TW9ja1NlcnZpY2VzRW5hYmxlZChDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZUVuYWJsZWQsCisgICAgICAgICAgICBib29sZWFuIHNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlbmFibGVkU2VydmljZXMgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKGNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkVOQUJMRURfQUNDRVNTSUJJTElUWV9TRVJWSUNFUyk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzZXJ2aWNlc1RvRW5hYmxlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vjb25kTW9ja1NlcnZpY2VFbmFibGVkKSB7CisgICAgICAgICAgICBzZXJ2aWNlc1RvRW5hYmxlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSkuYXBwZW5kKCI6Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmljZXNUb0VuYWJsZS5lcXVhbHMoZW5hYmxlZFNlcnZpY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dFN0cmluZyhjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5FTkFCTEVEX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMsIHNlcnZpY2VzVG9FbmFibGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gd2UgaGF2ZSBlbmFibGVkIHRoZSBzZXJ2aWNlcyBvZiBpbnRlcmVzdCBhbmQgbmVlZCB0byB3YWl0IHVudGlsIHRoZXkKKyAgICAgICAgLy8gYXJlIGluc3RhbnRpYXRlZCBhbmQgc3RhcnRlZCAoaWYgbmVlZGVkKSBhbmQgdGhlIHN5c3RlbSBiaW5kcyB0byB0aGVtCisgICAgICAgIGJvb2xlYW4gZmlyc3RNb2NrU2VydmljZU9LID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2Vjb25kTW9ja1NlcnZpY2VPSyA9IGZhbHNlOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgcG9sbGluZ0ludGVydmFsID0gVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMgLyA2OworCisgICAgICAgIHdoaWxlIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgVElNRU9VVF9TVEFSVF9NT0NLX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMpICB7CisgICAgICAgICAgICBmaXJzdE1vY2tTZXJ2aWNlT0sgPSAhZmlyc3RNb2NrU2VydmljZUVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgKE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zSW5zdGFuY2UuaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkpOworCisgICAgICAgICAgICBzZWNvbmRNb2NrU2VydmljZU9LID0gIXNlY29uZE1vY2tTZXJ2aWNlRW5hYmxlZAorICAgICAgICAgICAgICAgICAgICB8fCAoTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2Uuc0luc3RhbmNlLmlzU3lzdGVtQm91bmRBc0NsaWVudCgpKTsKKworICAgICAgICAgICAgaWYgKGZpcnN0TW9ja1NlcnZpY2VPSyAmJiBzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAocG9sbGluZ0ludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJNb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgbm90IHN0YXJ0ZWQgb3Igc3lzdGVtIG5vdCBib3VuZCBhcyBhIGNsaWVudDogIik7CisgICAgICAgIGlmICghZmlyc3RNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeUZpcnN0TW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLnNDb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZWNvbmRNb2NrU2VydmljZU9LKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZS5zQ29tcG9uZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIHRoZSBtb2NrIGFjY2Vzc2liaWxpdHkgc2VydmljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdmVyaWZpZWQKKyAgICAgKiAod2hpY2ggaXMgaXQgaGFzIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBtZXRob2QgY2FsbHMgd2l0aCBleHBlY3RlZAorICAgICAqIGFyZ3VtZW50cykgd2l0aGluIHRoZSB7QGxpbmsgI1RJTUVPVVRfQklOREVSX0NBTEx9LiBUaGUgdmVyaWZpZWQgc3RhdGUgaXMKKyAgICAgKiBjaGVja2VkIGJ5IHBvbGxpbmcgdXBvbiBzbWFsbCBpbnRlcnZhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0byB2ZXJpZnkuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgdGhlIHZlcmlmaWNhdGlvbiBoYXMgZmFpbGVkIHdpdGggZXhjZXB0aW9uIGFmdGVyIHRoZQorICAgICAqICAgICAgICAgICAgIHtAbGluayAjVElNRU9VVF9CSU5ERVJfQ0FMTH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1vY2tTZXJ2aWNlVmVyaWZpZWRXaXRoaW5UaW1lb3V0KE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzZXJ2aWNlKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEV4Y2VwdGlvbiBsYXN0VmVyaWZ5RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyBwb2xsVG1lb3V0ID0gVElNRU9VVF9CSU5ERVJfQ0FMTCAvIDU7CisKKyAgICAgICAgLy8gcG9sbCB1bnRpbCB0aGUgdGltZW91dCBoYXMgZWxhcHNlZAorICAgICAgICB3aGlsZSAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBiZWdpblRpbWUgPCBUSU1FT1VUX0JJTkRFUl9DQUxMKSB7CisgICAgICAgICAgICAvLyBzbGVlcCBmaXJzdCBzaW5jZSBpbW1lZGlhdGUgY2FsbCB3aWxsIGFsd2F5cyBmYWlsCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChwb2xsVG1lb3V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb2xsIGZvciB2ZXJpZmljYXRpb24gYW5kIGlmIHRoaXMgZmFpbHMgc2F2ZSB0aGUgZXhjZXB0aW9uIGFuZAorICAgICAgICAgICAgLy8ga2VlcCBwb2xsaW5nCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZpY2UudmVyaWZ5KCk7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgc28gaXQgZG9lcyBub3QgYWNjZXB0IG1vcmUgZXZlbnRzCisgICAgICAgICAgICAgICAgc2VydmljZS5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbGFzdFZlcmlmeUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXNldCwgd2UgaGF2ZSBhbHJlYWR5IGZhaWxlZAorICAgICAgICBzZXJ2aWNlLnJlc2V0KCk7CisKKyAgICAgICAgLy8gYWx3YXlzIG5vdCBudWxsCisgICAgICAgIHRocm93IGxhc3RWZXJpZnlFeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBpcyB0aGUgZmlyc3QgbW9jayB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15Rmlyc3RNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgdG8gdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBzSW5zdGFuY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlGaXJzdE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBmaXJzdCBtb2NrIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSBleHRlbmRzIE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBDb21wb25lbnROYW1lfSBmbGF0dGVuZWQgYXMgYSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNDb21wb25lbnROYW1lID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgc1BhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIE15U2Vjb25kTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlIHNJbnN0YW5jZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeVNlY29uZE1vY2tBY2Nlc3NpYmlsaXR5U2VydmljZSgpIHsKKyAgICAgICAgICAgIHNJbnN0YW5jZSA9IHRoaXM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmZWQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVTdHJpY3RNb2NrOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwb3J0TWF0Y2hlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OworCitpbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5NZWRpdW1UZXN0OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIHdoaWNoIG1vY2tpbmcgdGhlIGJhY2tpbmcgc2VydmljZS4KKyAqLworcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lb3V0IHJlcXVpcmVkIGZvciBwZW5kaW5nIEJpbmRlciBjYWxscyBvciBldmVudCBwcm9jZXNzaW5nIHRvCisgICAgICogY29tcGxldGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQklOREVSX0NBTEwgPSA1MDsKKworICAgIC8qKgorICAgICAqIFRoZSByZXVzYWJsZSBtb2NrIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1Nb2NrU2VydmljZUludGVyZmFjZSA9CisgICAgICAgIGNyZWF0ZVN0cmljdE1vY2soSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc2V0KG1Nb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhIGxpc3Qgb2YgaW5zdGFsbGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgdGhlIG1vY2sgc2VydmljZSByZXR1cm5zCisgICAgICAgIExpc3Q8U2VydmljZUluZm8+IGV4cGVjdGVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VJbmZvPigpOworICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IG5ldyBTZXJ2aWNlSW5mbygpOworICAgICAgICBzZXJ2aWNlSW5mby5uYW1lID0gIlRlc3RTZXJ2aWNlSW5mb05hbWUiOworICAgICAgICBleHBlY3RlZFNlcnZpY2VzLmFkZChzZXJ2aWNlSW5mbyk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpLmFuZFJldHVybihleHBlY3RlZFNlcnZpY2VzKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gcmVjZWl2ZWRTZXJ2aWNlcyA9IG1hbmFnZXIuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0IChsaXN0IGVxdWFscygpIGNvbXBhcmVzIGl0IGNvbnRlbnRzIGFzIHdlbGwpCisgICAgICAgIGFzc2VydEVxdWFscygiQWxsIGV4cGVjdGVkIHNlcnZpY2VzIG11c3QgYmUgcmV0dXJuZWQiLCByZWNlaXZlZFNlcnZpY2VzLCBleHBlY3RlZFNlcnZpY2VzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgbW9ja1NlcnZpY2VJbnRlcmZhY2UuaW50ZXJydXB0KCk7CisgICAgICAgIHJlcGxheShtb2NrU2VydmljZUludGVyZmFjZSk7CisKKyAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QgdW5kZXIgdGVzdAorICAgICAgICBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyKG1Db250ZXh0LCBtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgICAgIG1hbmFnZXIuaW50ZXJydXB0KCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSBtb2NrIHNlcnZpY2Ugd2FzIHByb3Blcmx5IGNhbGxlZAorICAgICAgICB2ZXJpZnkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgbW9jayBzZXJ2aWNlIGJlaGF2aW9yCisgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtb2NrU2VydmljZUludGVyZmFjZSA9IG1Nb2NrU2VydmljZUludGVyZmFjZTsKKyAgICAgICAgZXhwZWN0KG1vY2tTZXJ2aWNlSW50ZXJmYWNlLmFkZENsaWVudChhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSkpLmFuZFJldHVybih0cnVlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCA9IG1hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIGFzc2VydFRydWUoIk11c3QgYmUgZW5hYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGVuYWJsZWQiLCBpc0VuYWJsZWRTZXJ2aWNlRW5hYmxlZCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBhY2Nlc3NpYmlsaXR5CisgICAgICAgIG1hbmFnZXIuZ2V0Q2xpZW50KCkuc2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGFzeW5jaHJvbm91cyBJQmluZGVyIGNhbGwgdG8gY29tcGxldGUKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVRfQklOREVSX0NBTEwpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QKKyAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQgPSBtYW5hZ2VyLmlzRW5hYmxlZCgpOworCisgICAgICAgIC8vIGNoZWNrIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICBhc3NlcnRGYWxzZSgiTXVzdCBiZSBkaXNhYmxlZCBzaW5jZSB0aGUgbW9jayBzZXJ2aWNlIGlzIGRpc2FibGVkIiwKKyAgICAgICAgICAgICAgICBpc0VuYWJsZWRTZXJ2Y2llRGlzYWJsZWQpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGUgbW9jayBzZXJ2aWNlIHdhcyBwcm9wZXJseSBjYWxsZWQKKyAgICAgICAgdmVyaWZ5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kQWNjZXNzaWJpbGl0eUV2ZW50X0FjY2Vzc2liaWxpdHlFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhbiBldmVudCB0byBiZSBkaXNwYXRjaGVkCisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBzZW50RXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisKKyAgICAgICAgLy8gY29uZmlndXJlIHRoZSBtb2NrIHNlcnZpY2UgYmVoYXZpb3IKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1vY2tTZXJ2aWNlSW50ZXJmYWNlID0gbU1vY2tTZXJ2aWNlSW50ZXJmYWNlOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuYWRkQ2xpZW50KGFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCgpKSkuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKHRydWUpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2Uuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChlcUFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpKSkKKyAgICAgICAgICAgICAgICAuYW5kUmV0dXJuKGZhbHNlKTsKKyAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKworICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0IChtYW5hZ2VyIGFuZCBzZXJ2aWNlIGluIGRpZmZlcmVudCBwcm9jZXNzZXMpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGFzc2VydFNhbWUoIlRoZSBtYW5hZ2VyIGFuZCB0aGUgc2VydmljZSBhcmUgaW4gZGlmZmVyZW50IHByb2Nlc3Nlcywgc28gdGhlIGV2ZW50IG11c3QgYmUgIiArCisgICAgICAgICAgICAgICAgInJlY3ljbGVkIiwgc2VudEV2ZW50LCBuZXh0RXZlbnREaWZmZXJlbnRQcm9jZXNzZXMpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKG1hbmFnZXIgYW5kIHNlcnZpY2UgaW4gdGhlIHNhbWUgcHJvY2VzcykKKyAgICAgICAgbWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KHNlbnRFdmVudCk7CisKKyAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXh0RXZlbnRTYW1lUHJvY2VzcyA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZSgiVGhlIG1hbmFnZXIgYW5kIHRoZSBzZXJ2aWNlIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLCBzbyB0aGUgZXZlbnQgbXVzdCBub3QiICsKKyAgICAgICAgICAgICAgICAiYmUgcmVjeWNsZWQiLCBzZW50RXZlbnQsIG5leHRFdmVudFNhbWVQcm9jZXNzKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEFjY2Vzc2liaWxpdHlFdmVudF9BY2Nlc3NpYmlsaXR5RGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIGFuIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHNlbnRFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oKTsKKworICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgorICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CisgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4oZmFsc2UpOworICAgICAgICByZXBsYXkobW9ja1NlcnZpY2VJbnRlcmZhY2UpOworCisgICAgICAgIC8vIGludm9rZSB0aGUgbWV0aG9kIHVuZGVyIHRlc3QgKGFjY2Vzc2liaWxpdHkgZGlzYWJsZWQpCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChzZW50RXZlbnQpOworICAgICAgICAgICAgZmFpbCgiTm8gYWNjZXNzaWJpbGl0eSBldmVudHMgYXJlIHNlbnQgaWYgYWNjZXNzaWJpbGl0eSBpcyBkaXNhYmxlZCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvLyBjaGVjayBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQWNjZXNzaWJpbGl0eSBvZmYuIERpZCB5b3UgZm9yZ2V0IHRvIGNoZWNrIHRoYXQ/IiwgaXNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhlIG1vY2sgc2VydmljZSB3YXMgcHJvcGVybHkgY2FsbGVkCisgICAgICAgIHZlcmlmeShtb2NrU2VydmljZUludGVyZmFjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSBwYXNzZWQgYXMgYSBtZXRob2QgYXJndW1lbnQKKyAgICAgKiBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXRjaGVkIFRoZSBldmVudCB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgZXhwZWN0YXRpb25zIGFyZSBtYXRjaGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEFjY2Vzc2liaWxpdHlFdmVudCBlcUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgbWF0Y2hlZCkgeworICAgICAgICByZXBvcnRNYXRjaGVyKG5ldyBBY2Nlc3NpYmlsaXR5RXZlbnRNYXRoZXIobWF0Y2hlZCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIHtAbGluayBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnR9IHBhc3NlZCBhcyBhIG1ldGhvZCBhcmd1bWVudAorICAgICAqIG1hdGNoZXMgZXhwZWN0YXRpb25zIHdoaWNoIGluIHRoaXMgY2FzZSBhcmUgdGhhdCBhbnkgaW5zdGFuY2UgaXMgYWNjZXB0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBhbnlJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQoKSB7CisgICAgICAgIHJlcG9ydE1hdGNoZXIobmV3IEFueUlBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudE1hdGhlcigpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2hlciBmb3Ige0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2Vzc2liaWxpdHlFdmVudE1hdGhlciBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgeworICAgICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlFdmVudCBtRXhwZWN0ZWRFdmVudDsKKworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eUV2ZW50TWF0aGVyKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50KSB7CisgICAgICAgICAgICBtRXhwZWN0ZWRFdmVudCA9IGV4cGVjdGVkRXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBtYXRjaGVkKSB7CisgICAgICAgICAgICBpZiAoIShtYXRjaGVkIGluc3RhbmNlb2YgQWNjZXNzaWJpbGl0eUV2ZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNlaXZlZEV2ZW50ID0gKEFjY2Vzc2liaWxpdHlFdmVudCkgbWF0Y2hlZDsKKyAgICAgICAgICAgIHJldHVybiBtRXhwZWN0ZWRFdmVudC5nZXRFdmVudFR5cGUoKSA9PSByZWNlaXZlZEV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgic2VuZEFjY2Vzc2liaWxpdHlFdmVudCgpIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgd2l0aCBldmVudCB0eXBlIFwiIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKG1FeHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaGVyIGZvciB7QGxpbmsgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50fXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50TWF0aGVyIGltcGxlbWVudHMgSUFyZ3VtZW50TWF0Y2hlciB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG1hdGNoZWQpIHsKKyAgICAgICAgICAgIGlmICghKG1hdGNoZWQgaW5zdGFuY2VvZiBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJhZGRDbGllbnQoKSB3aXRoIGFueSBJQWNjZXNzaWJpbGl0eU1hbmFnZXJDbGllbnQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0NvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMTU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Db3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeTsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLkNvdW50cnlMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmxvY2F0aW9uLklDb3VudHJ5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlMaXN0ZW5lclRlc3RlciBleHRlbmRzIElDb3VudHJ5TGlzdGVuZXIuU3R1YiB7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db3VudHJ5RGV0ZWN0ZWQoQ291bnRyeSBjb3VudHJ5KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb3VudHJ5IGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5ICE9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgZXh0ZW5kcyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlIHsKKworICAgICAgICBwcml2YXRlIENvdW50cnlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlSZWNlaXZlcnMoQ291bnRyeSBjb3VudHJ5KSB7CisgICAgICAgICAgICBzdXBlci5ub3RpZnlSZWNlaXZlcnMoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRyeUxpc3RlbmVyKGZpbmFsIENvdW50cnlMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyU2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1MaXN0ZW5lciAhPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIgc2VydmljZVRlc3RlciA9IG5ldyBDb3VudHJ5RGV0ZWN0b3JTZXJ2aWNlVGVzdGVyKGdldENvbnRleHQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgd2FpdEZvclN5c3RlbVJlYWR5KHNlcnZpY2VUZXN0ZXIpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIgbGlzdGVuZXJUZXN0ZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVyVGVzdGVyKCk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlVGVzdGVyLmlzTGlzdGVuZXJTZXQoKSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIucmVtb3ZlQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RpZnlMaXN0ZW5lcnMoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgQ291bnRyeURldGVjdG9yU2VydmljZVRlc3RlciBzZXJ2aWNlVGVzdGVyID0gbmV3IENvdW50cnlEZXRlY3RvclNlcnZpY2VUZXN0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQSA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVyVGVzdGVyIGxpc3RlbmVyVGVzdGVyQiA9IG5ldyBDb3VudHJ5TGlzdGVuZXJUZXN0ZXIoKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gbmV3IENvdW50cnkoIlVTIiwgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9ORVRXT1JLKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5zeXN0ZW1SZWFkeSgpOworICAgICAgICB3YWl0Rm9yU3lzdGVtUmVhZHkoc2VydmljZVRlc3Rlcik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQSk7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIuYWRkQ291bnRyeUxpc3RlbmVyKGxpc3RlbmVyVGVzdGVyQik7CisgICAgICAgIHNlcnZpY2VUZXN0ZXIubm90aWZ5UmVjZWl2ZXJzKGNvdW50cnkpOworICAgICAgICBhc3NlcnRUcnVlKHNlcnZpY2VUZXN0ZXIuaXNMaXN0ZW5lclNldCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckEuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lclRlc3RlckIuaXNOb3RpZmllZCgpKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJBKTsKKyAgICAgICAgc2VydmljZVRlc3Rlci5yZW1vdmVDb3VudHJ5TGlzdGVuZXIobGlzdGVuZXJUZXN0ZXJCKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZVRlc3Rlci5pc0xpc3RlbmVyU2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yU3lzdGVtUmVhZHkoQ291bnRyeURldGVjdG9yU2VydmljZSBzZXJ2aWNlKSB7CisgICAgICAgIGludCBjb3VudCA9IDU7CisgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VydmljZS5pc1N5c3RlbVJlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldhaXQgU3lzdGVtIFJlYWR5IHRpbWVvdXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTW9ja0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Nb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vY2sge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5U2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEFjY2Vzc2liaWxpdHlFdmVudD4gbUV4cGVjdGVkRXZlbnRzID0gbmV3IExpbmtlZExpc3Q8QWNjZXNzaWJpbGl0eUV2ZW50PigpOworCisgICAgLyoqCisgICAgICogSW50ZXJydXB0aW9uIGNhbGwgdGhpcyBzZXJ2aWNlIGV4cGVjdHMgdG8gcmVjZWl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUV4cGVjdGVkSW50ZXJydXB0OworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgbW9jayBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGF5aW5nOworCisgICAgLyoqCisgICAgICogRmxhZyBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kIGFzIGEgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30gcG9wdWxhdGVkIHdpdGggZGVmYXVsdAorICAgICAqIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBjcmVhdGVEZWZhdWx0SW5mbygpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGRlZmF1bHRJbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOworICAgICAgICBkZWZhdWx0SW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEOworICAgICAgICBkZWZhdWx0SW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfQVVESUJMRTsKKyAgICAgICAgZGVmYXVsdEluZm8uZmxhZ3MgPSAwOworICAgICAgICBkZWZhdWx0SW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gMDsKKyAgICAgICAgZGVmYXVsdEluZm8ucGFja2FnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJmb28uYmFyLmJheiIKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gZGVmYXVsdEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHJlcGxheWluZyB0aGUgbW9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXBsYXkoKSB7CisgICAgICAgIG1SZXBsYXlpbmcgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIGlmIGFsbCBleHBlY3RlZCBzZXJ2aWNlIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgIGlmICghbVJlcGxheWluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZXBsYXkoKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXhwZWN0ZWQgY2FsbCB0byAjaW50ZXJydXB0KCkgbm90IHJlY2VpdmVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRXhwZWN0ZWRFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHBlY3RlZCBhIGNhbGwgdG8gb25BY2Nlc3NpYmlsaXR5RXZlbnQoKSBmb3IgIgorICAgICAgICAgICAgICAgICAgICArICJldmVudHMgXCIiICsgbUV4cGVjdGVkRXZlbnRzICsgIlwiIG5vdCByZWNlaXZlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIHJldXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmNsZWFyKCk7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgICAgICBtUmVwbGF5aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBleHBlY3RlZCBjYWxsIHRvCisgICAgICoge0BsaW5rICNvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQpfSB3aXRoIGdpdmVuIGV2ZW50IGFzCisgICAgICogYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRFdmVudCBUaGUgZXhwZWN0ZWQgZXZlbnQgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwZWN0RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQpIHsKKyAgICAgICAgbUV4cGVjdGVkRXZlbnRzLmFkZChleHBlY3RlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGV4cGVjdGVkIGNhbGwgb2Yge0BsaW5rICNvbkludGVycnVwdCgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnJ1cHQoKSB7CisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV4cGVjdGVkRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBldmVudDogIiArIHJlY2VpdmVkRXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQgPSBtRXhwZWN0ZWRFdmVudHMucG9sbCgpOworICAgICAgICBhc3NlcnRFcXVhbHNBY2Nlc3NpYmxpdHlFdmVudChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHsKKyAgICAgICAgaWYgKCFtUmVwbGF5aW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1FeHBlY3RlZEludGVycnVwdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYWxsIHRvIG9uSW50ZXJydXB0KCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FeHBlY3RlZEludGVycnVwdCA9IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uU2VydmljZUNvbm5lY3RlZCgpIHsKKyAgICAgICAgbUlzU3lzdGVtQm91bmRBc0NsaWVudCA9IHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICBtSXNTeXN0ZW1Cb3VuZEFzQ2xpZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlmIHRoZSBzeXN0ZW0gaXMgYm91bmQgYXMgY2xpZW50IHRvIHRoaXMgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3lzdGVtIGlzIGJvdW5kLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTeXN0ZW1Cb3VuZEFzQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gbUlzU3lzdGVtQm91bmRBc0NsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBhbGwgcHJvcGVydGllcyBvZiB0aGUgPGNvZGU+ZXhwZWN0ZWRFdmVudDwvY29kZT4gYW5kIHRoZQorICAgICAqIDxjb2RlPnJlY2V2aWVkRXZlbnQ8L2NvZGU+IHRvIHZlcmlmeSB0aGF0IHRoZSByZWNlaXZlZCBldmVudCBpcyB0aGUgb25lCisgICAgICogdGhhdCBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQWNjZXNzaWJsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50IGV4cGVjdGVkRXZlbnQsCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgcmVjZWl2ZWRFdmVudCkgeworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImFkZGVkQ291bnQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0QWRkZWRDb3VudCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJiZWZvcmVUZXh0IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEJlZm9yZVRleHQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEJlZm9yZVRleHQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY2hlY2tlZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc0NoZWNrZWQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjbGFzc05hbWUgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuZ2V0Q2xhc3NOYW1lKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiY29udGVudERlc2NyaXB0aW9uIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCByZWNlaXZlZEV2ZW50LmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJjdXJyZW50SXRlbUluZGV4IGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50CisgICAgICAgICAgICAgICAgLmdldEN1cnJlbnRJdGVtSW5kZXgoKSwgcmVjZWl2ZWRFdmVudC5nZXRDdXJyZW50SXRlbUluZGV4KCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImVuYWJsZWQgaGFzIGluY29ycmVjdCB2YWx1ZSIsIGV4cGVjdGVkRXZlbnQuaXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscygiZXZlbnRUeXBlIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmdldEV2ZW50VHlwZSgpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuZ2V0RXZlbnRUeXBlKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoImZyb21JbmRleCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRGcm9tSW5kZXgoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEZyb21JbmRleCgpKTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJmdWxsU2NyZWVuIGhhcyBpbmNvcnJlY3QgdmFsdWUiLCBleHBlY3RlZEV2ZW50LmlzRnVsbFNjcmVlbigpLAorICAgICAgICAgICAgICAgIHJlY2VpdmVkRXZlbnQuaXNGdWxsU2NyZWVuKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIml0ZW1Db3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRJdGVtQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldEl0ZW1Db3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzTm90aWZpY2F0aW9uQXNQYXJjZWxhYmxlRGF0YShleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKCJwYXNzd29yZCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5pc1Bhc3N3b3JkKCksCisgICAgICAgICAgICAgICAgcmVjZWl2ZWRFdmVudC5pc1Bhc3N3b3JkKCkpOworICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoInJlbW92ZWRDb3VudCBoYXMgaW5jb3JyZWN0IHZhbHVlIiwgZXhwZWN0ZWRFdmVudC5nZXRSZW1vdmVkQ291bnQoKSwKKyAgICAgICAgICAgICAgICByZWNlaXZlZEV2ZW50LmdldFJlbW92ZWRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzVGV4dChleHBlY3RlZEV2ZW50LCByZWNlaXZlZEV2ZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIGFuZHJvaWQub3MuUGFyY2VsYWJsZX0gZGF0YSBvZiB0aGUKKyAgICAgKiA8Y29kZT5leHBlY3RlZEV2ZW50PC9jb2RlPiBhbmQgPGNvZGU+cmVjZWl2ZWRFdmVudDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQKKyAgICAgKiB0aGUgcmVjZWl2ZWQgZXZlbnQgaXMgdGhlIG9uZSB0aGF0IGlzIGV4cGVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNOb3RpZmljYXRpb25Bc1BhcmNlbGFibGVEYXRhKEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAicGFyY2VsYWJsZURhdGEgaGFzIGluY29ycmVjdCB2YWx1ZSI7CisgICAgICAgIE1lc3NhZ2UgZXhwZWN0ZWRNZXNzYWdlID0gKE1lc3NhZ2UpIGV4cGVjdGVkRXZlbnQuZ2V0UGFyY2VsYWJsZURhdGEoKTsKKyAgICAgICAgTWVzc2FnZSByZWNlaXZlZE1lc3NhZ2UgPSAoTWVzc2FnZSkgcmVjZWl2ZWRFdmVudC5nZXRQYXJjZWxhYmxlRGF0YSgpOworCisgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlY2VpdmVkTWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtZXNzYWdlLCByZWNlaXZlZE1lc3NhZ2UpOworCisgICAgICAgIC8vIHdlIGRvIGEgdmVyeSBzaW1wbGUgc2FuaXR5IGNoZWNrIHNpbmNlIHdlIGRvIG5vdCB0ZXN0IE1lc3NhZ2UKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkTWVzc2FnZS53aGF0LCByZWNlaXZlZE1lc3NhZ2Uud2hhdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHRleHQgb2YgdGhlIDxjb2RlPmV4cGVjdGVkRXZlbnQ8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPnJlY2VpdmVkRXZlbnQ8L2NvZGU+IGJ5IGNvbXBhcmluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIENoYXJTZXF1ZW5jZX1zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNUZXh0KEFjY2Vzc2liaWxpdHlFdmVudCBleHBlY3RlZEV2ZW50LAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IHJlY2VpdmVkRXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAidGV4dCBoYXMgaW5jb3JyZWN0IHZhbHVlIjsKKyAgICAgICAgTGlzdDxDaGFyU2VxdWVuY2U+IGV4cGVjdGVkVGV4dCA9IGV4cGVjdGVkRXZlbnQuZ2V0VGV4dCgpOworICAgICAgICBMaXN0PENoYXJTZXF1ZW5jZT4gcmVjZWl2ZWRUZXh0ID0gcmVjZWl2ZWRFdmVudC5nZXRUZXh0KCk7CisKKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkVGV4dC5zaXplKCksIHJlY2VpdmVkVGV4dC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPENoYXJTZXF1ZW5jZT4gZXhwZWN0ZWRUZXh0SXRlcmF0b3IgPSBleHBlY3RlZFRleHQuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8Q2hhclNlcXVlbmNlPiByZWNlaXZlZFRleHRJdGVyYXRvciA9IHJlY2VpdmVkVGV4dC5pdGVyYXRvcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUZXh0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAvLyBjb21wYXJlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFRleHRJdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRUZXh0SXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0NvbXByZWhlbnNpdmVDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLmxvY2F0aW9uOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21wcmVoZW5zaXZlQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgQ29tcHJlaGVuc2l2ZUNvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPVU5UUllfSVNPID0gInVzIjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIENvdW50cnkgbU5vdGlmaWVkQ291bnRyeTsKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKENvdW50cnkgY291bnRyeSkgeworICAgICAgICAgICAgbU5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Ob3RpZmllZENvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TGlzdGVuZXIoY291bnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yICE9IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yID09IG51bGwgJiYgbUxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsb2NhdGlvblJlZnJlc2hTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbG9jYXRpb25SZWZyZXNoQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhdGlvblJlZnJlc2hUaW1lciA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5RGV0ZWN0b3JCYXNlIGNyZWF0ZUxvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50cnlEZXRlY3RvckJhc2UobUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ291bnRyeSBkZXRlY3RDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgICAgICBtTG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRMYXN0S25vd25Mb2NhdGlvbkJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWRDb3VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldFNpbUJhc2VkQ291bnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5BZnRlckRldGVjdGlvbkFzeW5jKGZpbmFsIENvdW50cnkgY291bnRyeSwgZmluYWwgQ291bnRyeSBkZXRlY3RlZENvdW50cnksCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBub3RpZnlDaGFuZ2UsIGZpbmFsIGJvb2xlYW4gc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKSB7CisgICAgICAgICAgICBydW5BZnRlckRldGVjdGlvbihjb3VudHJ5LCBkZXRlY3RlZENvdW50cnksIG5vdGlmeUNoYW5nZSwgc3RhcnRMb2NhdGlvbkJhc2VkRGV0ZWN0aW9uKTsKKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBaXJwbGFuZU1vZGVPZmYoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYWRkUGhvbmVTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgbGlzdGVuZXJBZGRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBob25lU3RhdGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlb0NvZGVySW1wbGVtZW50ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXJBZGRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ291bnRyeUxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENvdW50cnlMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtTm90aWZpZWQ7CisgICAgICAgIHByaXZhdGUgQ291bnRyeSBtQ291bnRyeTsKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db3VudHJ5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfTkVUV09SSyk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldE5ldHdvcmtCYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdExvY2F0aW9uQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX1NJTSk7CisgICAgICAgIGZpbmFsIENvdW50cnkgbG9jYXRpb25CYXNlZENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FUSU9OKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25CYXNlZExpc3RlbmVyKGxvY2F0aW9uQmFzZWRDb3VudHJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShsaXN0ZW5lci5nZXRDb3VudHJ5KCksIGxvY2F0aW9uQmFzZWRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaFN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zdG9wKCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxlQmFzZWRDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBDb3VudHJ5IHJlc3VsdENvdW50cnkgPSBuZXcgQ291bnRyeSgKKyAgICAgICAgICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yLkNPVU5UUllfSVNPLCBDb3VudHJ5LkNPVU5UUllfU09VUkNFX0xPQ0FMRSk7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDb3VudHJ5IGdldExvY2FsZUNvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0b3BwaW5nRGV0ZWN0b3IoKSB7CisgICAgICAgIC8vIFRlc3Qgc3RvcHBpbmcgZGV0ZWN0b3Igd2hlbiBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yIHdhcyBzdGFydGVkCisgICAgICAgIGZpbmFsIENvdW50cnkgcmVzdWx0Q291bnRyeSA9IG5ldyBDb3VudHJ5KAorICAgICAgICAgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IuQ09VTlRSWV9JU08sIENvdW50cnkuQ09VTlRSWV9TT1VSQ0VfU0lNKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBjb3VudHJ5RGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3RvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIENvdW50cnkgZ2V0U2ltQmFzZWRDb3VudHJ5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRDb3VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIENvdW50cnkgY291bnRyeSA9IGNvdW50cnlEZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydFRydWUoc2FtZUNvdW50cnkoY291bnRyeSwgcmVzdWx0Q291bnRyeSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBUaGUgTG9jYXRpb25CYXNlZERldGVjdG9yIHNob3VsZCBiZSBzdG9wcGVkLgorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICAvLyBUaGUgbG9jYXRpb24gcmVmcmVzaCBzaG91bGQgbm90IHJ1bm5pbmcuCisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uUmVmcmVzaENhbmNlbGxlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25CYXNlZENvdW50cnlOb3RGb3VuZCgpIHsKKyAgICAgICAgZmluYWwgQ291bnRyeSByZXN1bHRDb3VudHJ5ID0gbmV3IENvdW50cnkoCisgICAgICAgICAgICAgICAgVGVzdENvdW50cnlEZXRlY3Rvci5DT1VOVFJZX0lTTywgQ291bnRyeS5DT1VOVFJZX1NPVVJDRV9TSU0pOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgQ291bnRyeSBnZXRTaW1CYXNlZENvdW50cnkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdENvdW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCByZXN1bHRDb3VudHJ5KSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vQ291bnRyeUZvdW5kKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgQ291bnRyeSBjb3VudHJ5ID0gY291bnRyeURldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzYW1lQ291bnRyeShjb3VudHJ5LCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkJhc2VkTGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHNhbWVDb3VudHJ5KGxpc3RlbmVyLmdldENvdW50cnkoKSwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvbkJhc2VkRGV0ZWN0b3JTdG9wcGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hTdGFydGVkKCkpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlEZXRlY3Rvci5sb2NhdGlvblJlZnJlc2hDYW5jZWxsZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxpc3RlbmVyKCkgeworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGNvdW50cnlEZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKCk7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IubG9jYXRpb25CYXNlZERldGVjdG9yU3RhcnRlZCgpKTsKKyAgICAgICAgY291bnRyeURldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmlzUGhvbmVTdGF0ZUxpc3RlbmVyQWRkZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0b3BwZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlb2NvZGVyTm90SW1wbGVtZW50ZWQoKSB7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgY291bnRyeURldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2VvQ29kZXJJbXBsZW1lbnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBjb3VudHJ5RGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5RGV0ZWN0b3IuaXNQaG9uZVN0YXRlTGlzdGVuZXJBZGRlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY291bnRyeURldGVjdG9yLmxvY2F0aW9uQmFzZWREZXRlY3RvclN0YXJ0ZWQoKSk7CisgICAgICAgIGNvdW50cnlEZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIobnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvdW50cnlEZXRlY3Rvci5pc1Bob25lU3RhdGVMaXN0ZW5lckFkZGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzYW1lQ291bnRyeShDb3VudHJ5IGNvdW50cnkxLCBDb3VudHJ5IGNvdW50cnkyKSB7CisgICAgICAgIHJldHVybiBjb3VudHJ5MSA9PSBudWxsICYmIGNvdW50cnkyID09IG51bGwgfHwgY291bnRyeTEgIT0gbnVsbCAmJiBjb3VudHJ5MiAhPSBudWxsICYmCisgICAgICAgIGNvdW50cnkxLmdldENvdW50cnlJc28oKS5lcXVhbHNJZ25vcmVDYXNlKGNvdW50cnkyLmdldENvdW50cnlJc28oKSkgJiYKKyAgICAgICAgY291bnRyeTEuZ2V0U291cmNlKCkgPT0gY291bnRyeTIuZ2V0U291cmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvbG9jYXRpb24vTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWU4ZTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL2xvY2F0aW9uL0xvY2F0aW9uQmFzZWRDb3VudHJ5RGV0ZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5sb2NhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworCitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Db3VudHJ5OworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC5sb2NhdGlvbi5Mb2NhdGlvbkxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkJhc2VkQ291bnRyeURldGVjdG9yVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBjbGFzcyBUZXN0Q291bnRyeURldGVjdG9yIGV4dGVuZHMgTG9jYXRpb25CYXNlZENvdW50cnlEZXRlY3RvciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMX1BST1ZJREVSUyA9IDI7CisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY291bnRyeUZvdW5kTG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlDb3VudHJ5ID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9jYXRpb24gbUxvY2F0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ291bnRyeTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1RdWVyeUxvY2F0aW9uVGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PExvY2F0aW9uTGlzdGVuZXI+IG1MaXN0ZW5lcnM7CisKKyAgICAgICAgcHVibGljIFRlc3RDb3VudHJ5RGV0ZWN0b3IoU3RyaW5nIGNvdW50cnksIFN0cmluZyBwcm92aWRlcikgeworICAgICAgICAgICAgdGhpcyhjb3VudHJ5LCBwcm92aWRlciwgMTAwMCAqIDYwICogNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdENvdW50cnlEZXRlY3RvcihTdHJpbmcgY291bnRyeSwgU3RyaW5nIHByb3ZpZGVyLCBsb25nIHF1ZXJ5TG9jYXRpb25UaW1lb3V0KSB7CisgICAgICAgICAgICBzdXBlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbUNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICAgICAgbUxvY2F0aW9uID0gbmV3IExvY2F0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIG1RdWVyeUxvY2F0aW9uVGltZW91dCA9IHF1ZXJ5TG9jYXRpb25UaW1lb3V0OworICAgICAgICAgICAgbUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TG9jYXRpb25MaXN0ZW5lcj4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvdW50cnlGcm9tTG9jYXRpb24oTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub3RpZnlDb3VudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUxvY2F0aW9uLmdldFByb3ZpZGVyKCkuZW5kc1dpdGgobG9jYXRpb24uZ2V0UHJvdmlkZXIoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvdW50cnk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBMb2NhdGlvbiBnZXRMYXN0S25vd25Mb2NhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJFbmFibGVkUHJvdmlkZXJzKExpc3Q8TG9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJzLmFkZEFsbChsaXN0ZW5lcnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJQcm92aWRlcnMoTGlzdDxMb2NhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZvciAoTG9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IG1Mb2NhdGlvbkxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgbG9uZyBnZXRRdWVyeUxvY2F0aW9uVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUXVlcnlMb2NhdGlvblRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBnZXRUb3RhbEVuYWJsZWRQcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gVE9UQUxfUFJPVklERVJTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TG9jYXRpb25Gb3VuZCgpIHsKKyAgICAgICAgICAgIC8vIExpc3RlbmVyIGNvdWxkIGJlIHJlbW92ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbi4KKyAgICAgICAgICAgIExvY2F0aW9uTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgTG9jYXRpb25MaXN0ZW5lclttTGlzdGVuZXJzLnNpemUoKV07CisgICAgICAgICAgICBtTG9jYXRpb25MaXN0ZW5lcnMudG9BcnJheShsaXN0ZW5lcnMpOworICAgICAgICAgICAgZm9yIChMb2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDpsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkxvY2F0aW9uQ2hhbmdlZChtTG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRMaXN0ZW5lcnNDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNvdW50cnlGb3VuZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY291bnRyeUZvdW5kTG9ja2VyKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5Q291bnRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgY291bnRyeUZvdW5kTG9ja2VyLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRpbWVyIGdldFRpbWVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UaW1lcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJlYWQgZ2V0UXVlcnlUaHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVF1ZXJ5VGhyZWFkOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb3VudHJ5TGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ291bnRyeUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmllZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvdW50cnlDb2RlOworICAgICAgICBwdWJsaWMgdm9pZCBvbkNvdW50cnlEZXRlY3RlZChDb3VudHJ5IGNvdW50cnkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvdW50cnlDb2RlID0gY291bnRyeS5nZXRDb3VudHJ5SXNvKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvdW50cnlDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdDb3VudHJ5KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY291bnRyeSA9ICJ1cyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9ICJHb29kIjsKKyAgICAgICAgQ291bnRyeUxpc3RlbmVySW1wbCBjb3VudHJ5TGlzdGVuZXIgPSBuZXcgQ291bnRyeUxpc3RlbmVySW1wbCgpOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpOworICAgICAgICBkZXRlY3Rvci5zZXRDb3VudHJ5TGlzdGVuZXIoY291bnRyeUxpc3RlbmVyKTsKKyAgICAgICAgZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgVGVzdENvdW50cnlEZXRlY3Rvci5UT1RBTF9QUk9WSURFUlMpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlMb2NhdGlvbkZvdW5kKCk7CisgICAgICAgIC8vIEFsbCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZGV0ZWN0b3IuZ2V0TGlzdGVuZXJzQ291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0VGltZXIoKSk7CisgICAgICAgIFRocmVhZCBxdWVyeVRocmVhZCA9IHdhaXRGb3JRdWVyeVRocmVhZExhdW5jaGVkKGRldGVjdG9yKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5Q291bnRyeUZvdW5kKCk7CisgICAgICAgIC8vIFdhaXQgZm9yIHF1ZXJ5IHRocmVhZCBlbmRpbmcKKyAgICAgICAgd2FpdEZvclRocmVhZEVuZGluZyhxdWVyeVRocmVhZCk7CisgICAgICAgIC8vIFF1ZXJ5VGhyZWFkIHNob3VsZCBiZSBzZXQgdG8gTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50cnlMaXN0ZW5lci5nZXRDb3VudHJ5KCksIGNvdW50cnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kaW5nQ291bnRyeUNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLnN0b3AoKTsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHN0b3AgdGhlIHRocmVhZCwgbGV0J3MgdGVzdCBpdCBjb3VsZCBiZSBzdG9wcGVkLCBhZnRlciBnZXQgY291bnRyeQorICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRyeUxpc3RlbmVyLm5vdGlmaWVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRyeUxpc3RlbmVyLmdldENvdW50cnkoKSwgY291bnRyeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkNhbmNlbGxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBUZXN0Q291bnRyeURldGVjdG9yKGNvdW50cnksIHByb3ZpZGVyKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iuc3RvcCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBUaGUgdGltZSBzaG91bGQgYmUgc3RvcHBlZAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRpbmdMb2NhdGlvbkZhaWxlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50cnkgPSAidXMiOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAiR29vZCI7CisgICAgICAgIGxvbmcgdGltZW91dCA9IDEwMDA7CisgICAgICAgIFRlc3RDb3VudHJ5RGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgVGVzdENvdW50cnlEZXRlY3Rvcihjb3VudHJ5LCBwcm92aWRlciwgdGltZW91dCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTG9jYXRpb24gZ2V0TGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgd2FpdEZvclRpbWVyUmVzZXQoZGV0ZWN0b3IpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgc3RpbGwgYmUgTlVMTAorICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlGYWlsZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb3VudHJ5RnJvbUxvY2F0aW9uKExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChjb3VudHJ5Rm91bmRMb2NrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgbm90aWZ5Q291bnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Rm91bmRMb2NrZXIud2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGNvdW50cnkuCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENvdW50cnlMaXN0ZW5lckltcGwgY291bnRyeUxpc3RlbmVyID0gbmV3IENvdW50cnlMaXN0ZW5lckltcGwoKTsKKyAgICAgICAgZGV0ZWN0b3Iuc2V0Q291bnRyeUxpc3RlbmVyKGNvdW50cnlMaXN0ZW5lcik7CisgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIFRlc3RDb3VudHJ5RGV0ZWN0b3IuVE9UQUxfUFJPVklERVJTKTsKKyAgICAgICAgZGV0ZWN0b3Iubm90aWZ5TG9jYXRpb25Gb3VuZCgpOworICAgICAgICAvLyBBbGwgbGlzdGVuZXJzIHNob3VsZCBiZSB1bnJlZ2lzdGVyZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRldGVjdG9yLmdldExpc3RlbmVyc0NvdW50KCksIDApOworICAgICAgICBhc3NlcnROdWxsKGRldGVjdG9yLmdldFRpbWVyKCkpOworICAgICAgICBUaHJlYWQgcXVlcnlUaHJlYWQgPSB3YWl0Rm9yUXVlcnlUaHJlYWRMYXVuY2hlZChkZXRlY3Rvcik7CisgICAgICAgIGRldGVjdG9yLm5vdGlmeUNvdW50cnlGb3VuZCgpOworICAgICAgICAvLyBXYWl0IGZvciBxdWVyeSB0aHJlYWQgZW5kaW5nCisgICAgICAgIHdhaXRGb3JUaHJlYWRFbmRpbmcocXVlcnlUaHJlYWQpOworICAgICAgICAvLyBRdWVyeVRocmVhZCBzaG91bGQgYmUgc2V0IHRvIE5VTEwKKyAgICAgICAgYXNzZXJ0TnVsbChkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpKTsKKyAgICAgICAgLy8gQ291bnRyeUxpc3RlbmVyIHNob3VsZCBiZSBub3RpZmllZAorICAgICAgICBhc3NlcnRUcnVlKGNvdW50cnlMaXN0ZW5lci5ub3RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZGluZ0NvdW50cnlXaXRoTGFzdEtub3duTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudHJ5ID0gInVzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gIkdvb2QiOworICAgICAgICBsb25nIHRpbWVvdXQgPSAxMDAwOworICAgICAgICBUZXN0Q291bnRyeURldGVjdG9yIGRldGVjdG9yID0gbmV3IFRlc3RDb3VudHJ5RGV0ZWN0b3IoY291bnRyeSwgcHJvdmlkZXIsIHRpbWVvdXQpOworICAgICAgICBDb3VudHJ5TGlzdGVuZXJJbXBsIGNvdW50cnlMaXN0ZW5lciA9IG5ldyBDb3VudHJ5TGlzdGVuZXJJbXBsKCk7CisgICAgICAgIGRldGVjdG9yLnNldENvdW50cnlMaXN0ZW5lcihjb3VudHJ5TGlzdGVuZXIpOworICAgICAgICBkZXRlY3Rvci5kZXRlY3RDb3VudHJ5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCBUZXN0Q291bnRyeURldGVjdG9yLlRPVEFMX1BST1ZJREVSUyk7CisgICAgICAgIHdhaXRGb3JUaW1lclJlc2V0KGRldGVjdG9yKTsKKyAgICAgICAgLy8gQWxsIGxpc3RlbmVycyBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhkZXRlY3Rvci5nZXRMaXN0ZW5lcnNDb3VudCgpLCAwKTsKKyAgICAgICAgVGhyZWFkIHF1ZXJ5VGhyZWFkID0gd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoZGV0ZWN0b3IpOworICAgICAgICBkZXRlY3Rvci5ub3RpZnlDb3VudHJ5Rm91bmQoKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcXVlcnkgdGhyZWFkIGVuZGluZworICAgICAgICB3YWl0Rm9yVGhyZWFkRW5kaW5nKHF1ZXJ5VGhyZWFkKTsKKyAgICAgICAgLy8gUXVlcnlUaHJlYWQgc2hvdWxkIGJlIHNldCB0byBOVUxMCisgICAgICAgIGFzc2VydE51bGwoZGV0ZWN0b3IuZ2V0UXVlcnlUaHJlYWQoKSk7CisgICAgICAgIC8vIENvdW50cnlMaXN0ZW5lciBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudHJ5TGlzdGVuZXIubm90aWZpZWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudHJ5TGlzdGVuZXIuZ2V0Q291bnRyeSgpLCBjb3VudHJ5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvclRpbWVyUmVzZXQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRUaW1lcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGltZXIgdGltZXIgPSBkZXRlY3Rvci5nZXRUaW1lcigpOworICAgICAgICBhc3NlcnRUcnVlKHRpbWVyID09IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yVGhyZWFkRW5kaW5nKFRocmVhZCB0aHJlYWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZC5qb2luKDUwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWQgd2FpdEZvclF1ZXJ5VGhyZWFkTGF1bmNoZWQoVGVzdENvdW50cnlEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICBpbnQgY291bnQgPSA1OworICAgICAgICBsb25nIGludGVydmFsID0gMTAwMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjb3VudC0tID4gMCAmJiBkZXRlY3Rvci5nZXRRdWVyeVRocmVhZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoaW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHRocmVhZCA9IGRldGVjdG9yLmdldFF1ZXJ5VGhyZWFkKCk7CisgICAgICAgIGFzc2VydFRydWUodGhyZWFkICE9IG51bGwpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlci5qYXZhCmluZGV4IDhhNDczMzkuLmZmYWJiN2IgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIuamF2YQpAQCAtMTYsODMgKzE2LDIwMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OwogCitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5Bc1lvdVR5cGVGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CisKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgotICogV2F0Y2hlcyBhIHtAbGluayBUZXh0Vmlld30gYW5kIGlmIGEgcGhvbmUgbnVtYmVyIGlzIGVudGVyZWQgd2lsbCBmb3JtYXQgaXQgdXNpbmcKLSAqIHtAbGluayBQaG9uZU51bWJlclV0aWxzI2Zvcm1hdE51bWJlcihFZGl0YWJsZSwgaW50KX0uIFRoZSBmb3JtYXR0aW5nIGlzIGJhc2VkIG9uCi0gKiB0aGUgY3VycmVudCBzeXN0ZW0gbG9jYWxlIHdoZW4gdGhpcyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCi0gKiBtYXkgbm90IHRha2UgZWZmZWN0IG9uIHRoaXMgaW5zdGFuY2UuCisgKiBXYXRjaGVzIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3fSBhbmQgaWYgYSBwaG9uZSBudW1iZXIgaXMgZW50ZXJlZAorICogd2lsbCBmb3JtYXQgaXQuCisgKiA8cD4KKyAqIFN0b3AgZm9ybWF0dGluZyB3aGVuIHRoZSB1c2VyCisgKiA8dWw+CisgKiA8bGk+SW5wdXRzIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXJzPC9saT4KKyAqIDxsaT5SZW1vdmVzIHRoZSBzZXBhcmF0b3IgaW4gdGhlIG1pZGRsZSBvZiBzdHJpbmcuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgcmVzdGFydGVkIG9uY2UgdGhlIHRleHQgaXMgY2xlYXJlZC4KICAqLwogcHVibGljIGNsYXNzIFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyIGltcGxlbWVudHMgVGV4dFdhdGNoZXIgeworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfUkVNT1ZFX0xBU1QgPSAwOwogCi0gICAgc3RhdGljIHByaXZhdGUgaW50IHNGb3JtYXRUeXBlOwotICAgIHN0YXRpYyBwcml2YXRlIExvY2FsZSBzQ2FjaGVkTG9jYWxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRm9ybWF0dGluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nSHlwaGVuOwotICAgIHByaXZhdGUgaW50IG1IeXBoZW5TdGFydDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURlbGV0aW5nQmFja3dhcmQ7CisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgY2hhcmFjdGVycyB3ZXJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBTVEFURV9BUFBFTkQgPSAxOwogCisgICAgLyoqCisgICAgICogT25lIG9yIG1vcmUgZGlnaXRzIHdlcmUgY2hhbmdlZCBpbiB0aGUgYmVnaW5uaW5nIG9yIHRoZSBtaWRkbGUgb2YgdGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfTU9ESUZZX0RJR0lUUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhbmdlcyBvdGhlciB0aGFuIHRoZSBhYm92ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU1RBVEVfT1RIRVIgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlIGNvdWxkIGJlIG9uZSB2YWx1ZSBvZiB0aGUgYWJvdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtU3RhdGU7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIGNoYW5nZSB3YXMgY2F1c2VkIGJ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGZDaGFuZ2UgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGUgZm9ybWF0dGluZyBoYXMgYmVlbiBzdG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcEZvcm1hdHRpbmc7CisKKyAgICBwcml2YXRlIEFzWW91VHlwZUZvcm1hdHRlciBtRm9ybWF0dGVyOworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGxvY2FsZSBhbmQgZnV0dXJlIGxvY2FsZSBjaGFuZ2VzCisgICAgICogbWF5IG5vdCB0YWtlIGVmZmVjdCBvbiB0aGlzIGluc3RhbmNlLgorICAgICAqLwogICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcigpIHsKLSAgICAgICAgaWYgKHNDYWNoZWRMb2NhbGUgPT0gbnVsbCB8fCBzQ2FjaGVkTG9jYWxlICE9IExvY2FsZS5nZXREZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNDYWNoZWRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgc0Zvcm1hdFR5cGUgPSBQaG9uZU51bWJlclV0aWxzLmdldEZvcm1hdFR5cGVGb3JMb2NhbGUoc0NhY2hlZExvY2FsZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcyhMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldENvdW50cnkoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgdGV4dCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdG8gaWdub3JlIGNhbGxzIHRvIGFmdGVyVGV4dENoYW5nZWQgY2F1c2VkIGJ5IHRoZSB3b3JrIGRvbmUgYmVsb3cKLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgbUZvcm1hdHRpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBJZiBkZWxldGluZyB0aGUgaHlwaGVuLCBhbHNvIGRlbGV0ZSB0aGUgY2hhciBiZWZvcmUgb3IgYWZ0ZXIgdGhhdAotICAgICAgICAgICAgaWYgKG1EZWxldGluZ0h5cGhlbiAmJiBtSHlwaGVuU3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EZWxldGluZ0JhY2t3YXJkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSHlwaGVuU3RhcnQgLSAxIDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUobUh5cGhlblN0YXJ0IC0gMSwgbUh5cGhlblN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUh5cGhlblN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShtSHlwaGVuU3RhcnQsIG1IeXBoZW5TdGFydCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIodGV4dCwgc0Zvcm1hdFR5cGUpOwotCi0gICAgICAgICAgICBtRm9ybWF0dGluZyA9IGZhbHNlOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRpbmcgaXMgYmFzZWQgb24gdGhlIGdpdmVuIDxjb2RlPmNvdW50cnlDb2RlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudHJ5Q29kZSB0aGUgSVNPIDMxNjYtMSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgY291bnRyeS9yZWdpb24KKyAgICAgKiB3aGVyZSB0aGUgcGhvbmUgbnVtYmVyIGlzIGJlaW5nIGVudGVyZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBQaG9uZU51bWJlckZvcm1hdHRpbmdUZXh0V2F0Y2hlcihTdHJpbmcgY291bnRyeUNvZGUpIHsKKyAgICAgICAgaWYgKGNvdW50cnlDb2RlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgbUZvcm1hdHRlciA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpLmdldEFzWW91VHlwZUZvcm1hdHRlcihjb3VudHJ5Q29kZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgaXMgZGVsZXRpbmcgYSBoeXBoZW4KLSAgICAgICAgaWYgKCFtRm9ybWF0dGluZykgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHVzZXIgaXMgZGVsZXRpbmcgb25lIGNoYXIsIHdpdGhvdXQgYSBzZWxlY3Rpb24KLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxTdGFydCA9IFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25TdGFydChzKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWxFbmQgPSBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKHMpOwotICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxIC8vIENhbiBkZWxldGUgYW5vdGhlciBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgY291bnQgPT0gMSAvLyBEZWxldGluZyBvbmx5IG9uZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgYWZ0ZXIgPT0gMCAvLyBEZWxldGluZwotICAgICAgICAgICAgICAgICAgICAmJiBzLmNoYXJBdChzdGFydCkgPT0gJy0nIC8vIGEgaHlwaGVuCi0gICAgICAgICAgICAgICAgICAgICYmIHNlbFN0YXJ0ID09IHNlbEVuZCkgeyAvLyBubyBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICBtRGVsZXRpbmdIeXBoZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IeXBoZW5TdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGRlbGV0aW5nIGZvcndhcmQgb3IgYmFja3dhcmQKLSAgICAgICAgICAgICAgICBpZiAoc2VsU3RhcnQgPT0gc3RhcnQgKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZWxldGluZ0JhY2t3YXJkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRGVsZXRpbmdCYWNrd2FyZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURlbGV0aW5nSHlwaGVuID0gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgaW50IGFmdGVyKSB7CisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPT0gMCAmJiBzLmxlbmd0aCgpID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvLyBBcHBlbmQgb25lIG9yIG1vcmUgbmV3IGNoYXJzCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BUFBFTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIgPT0gMCAmJiBzdGFydCArIGNvdW50ID09IHMubGVuZ3RoKCkgJiYgY291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgb25lIG9yIG1vcmUgY2hhcnMgZnJvbSB0aGUgZW5kIG9mIHN0cmluZy4KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JFTU9WRV9MQVNUOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID4gMCAmJiAhaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZGlhbGFibGUgY2hhcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTU9ESUZZX0RJR0lUUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX09USEVSOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nCisgICAgICAgIGlmIChtU2VsZkNoYW5nZSB8fCBtU3RvcEZvcm1hdHRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAwICYmICFoYXNTZXBhcmF0b3Iocywgc3RhcnQsIGNvdW50KSkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgaW5zZXJ0ZWQgdGhlIGRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIG1pZGRsZSBvZiB0ZXh0LgorICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX01PRElGWV9ESUdJVFM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgc3RvcCBmb3JtYXR0aW5nLgorICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FQUEVORCAmJiBjb3VudCA+IDAgJiYgaGFzU2VwYXJhdG9yKHMsIHN0YXJ0LCBjb3VudCkpIHsKKyAgICAgICAgICAgIC8vIFVzZXIgYXBwZW5kZWQgdGhlIG5vbi1kaWFsYWJsZSBjaGFyYWN0ZXIsIHN0b3AgZm9ybWF0dGluZy4KKyAgICAgICAgICAgIHN0b3BGb3JtYXR0aW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX09USEVSKSB7CisgICAgICAgICAgICAvLyBVc2VyIG11c3QgaW5zZXJ0IG9yIHJlbW92ZSB0aGUgbm9uLWRpYWxhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJlZ2luIG9yIG1pZGRsZSBvZgorICAgICAgICAgICAgLy8gbnVtYmVyLCBzdG9wIGZvcm1hdHRpbmcuCisgICAgICAgICAgICBzdG9wRm9ybWF0dGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICBpZiAobVN0b3BGb3JtYXR0aW5nKSB7CisgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSBmb3JtYXR0aW5nIHdoZW4gYWxsIHRleHRzIHdlcmUgY2xlYXIuCisgICAgICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSAhKHMubGVuZ3RoKCkgPT0gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNoYW5nZSBjYXVzZWQgYnkgcy5yZXBsYWNlKCkuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZCA9IHJlZm9ybWF0KHMsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQocykpOworICAgICAgICBpZiAoZm9ybWF0dGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCByZW1lbWJlcmVkUG9zID0gbUZvcm1hdHRlci5nZXRSZW1lbWJlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIHMucmVwbGFjZSgwLCBzLmxlbmd0aCgpLCBmb3JtYXR0ZWQsIDAsIGZvcm1hdHRlZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAvLyBUaGUgdGV4dCBjb3VsZCBiZSBjaGFuZ2VkIGJ5IG90aGVyIFRleHRXYXRjaGVyIGFmdGVyIHdlIGNoYW5nZWQgaXQuIElmIHdlIGZvdW5kIHRoZQorICAgICAgICAgICAgLy8gdGV4dCBpcyBub3QgdGhlIG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywganVzdCBnaXZlIHVwIGNhbGxpbmcgc2V0U2VsZWN0aW9uKCkuCisgICAgICAgICAgICBpZiAoZm9ybWF0dGVkLmVxdWFscyhzLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihzLCByZW1lbWJlcmVkUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxmQ2hhbmdlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgZm9ybWF0dGVkIG51bWJlciBieSBpZ25vcmluZyBhbGwgbm9uLWRpYWxhYmxlIGNoYXJzIGFuZCBzdGljayB0aGUgY3Vyc29yIHRvIHRoZQorICAgICAqIG5lYXJlc3QgZGlhbGFibGUgY2hhciB0byB0aGUgbGVmdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbnVtYmVyIGlzICAoNjUwKSAxMjMtNDU2NzggYW5kICc0JyBpcworICAgICAqIHJlbW92ZWQgdGhlbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBiZWhpbmQgJzMnIGluc3RlYWQgb2YgJy0nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlZm9ybWF0KENoYXJTZXF1ZW5jZSBzLCBpbnQgY3Vyc29yKSB7CisgICAgICAgIC8vIFRoZSBpbmRleCBvZiBjaGFyIHRvIHRoZSBsZWZ0d2FyZCBvZiB0aGUgY3Vyc29yLgorICAgICAgICBpbnQgY3VySW5kZXggPSBjdXJzb3IgLSAxOworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gbnVsbDsKKyAgICAgICAgbUZvcm1hdHRlci5jbGVhcigpOworICAgICAgICBjaGFyIGxhc3ROb25TZXBhcmF0b3IgPSAwOworICAgICAgICBib29sZWFuIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0Tm9uU2VwYXJhdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gZ2V0Rm9ybWF0dGVkTnVtYmVyKGxhc3ROb25TZXBhcmF0b3IsIGhhc0N1cnNvcik7CisgICAgICAgICAgICAgICAgICAgIGhhc0N1cnNvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0Tm9uU2VwYXJhdG9yID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGN1ckluZGV4KSB7CisgICAgICAgICAgICAgICAgaGFzQ3Vyc29yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdE5vblNlcGFyYXRvciAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBnZXRGb3JtYXR0ZWROdW1iZXIobGFzdE5vblNlcGFyYXRvciwgaGFzQ3Vyc29yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0dGVkOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEZvcm1hdHRlZE51bWJlcihjaGFyIGxhc3ROb25TZXBhcmF0b3IsIGJvb2xlYW4gaGFzQ3Vyc29yKSB7CisgICAgICAgIHJldHVybiBoYXNDdXJzb3IgPyBtRm9ybWF0dGVyLmlucHV0RGlnaXRBbmRSZW1lbWJlclBvc2l0aW9uKGxhc3ROb25TZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgOiBtRm9ybWF0dGVyLmlucHV0RGlnaXQobGFzdE5vblNlcGFyYXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BGb3JtYXR0aW5nKCkgeworICAgICAgICBtU3RvcEZvcm1hdHRpbmcgPSB0cnVlOworICAgICAgICBtRm9ybWF0dGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlcGFyYXRvcihmaW5hbCBDaGFyU2VxdWVuY2UgcywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICghUGhvbmVOdW1iZXJVdGlscy5pc05vblNlcGFyYXRvcihjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZU51bWJlclV0aWxzLmphdmEKaW5kZXggZGRmYzUyMC4uZTM3NzMzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHMuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuTnVtYmVyUGFyc2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWwuUGhvbmVOdW1iZXJGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZW51bWJlci5QaG9uZU51bWJlcjsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CkBAIC02MTcsNyArNjIyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEluIHRoZSBVUywgMS02NTAtNTU1LTEyMzQgbXVzdCBiZSBlcXVhbCB0byA2NTAtNTU1LTEyMzQsCi0gICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsdCB0byA5MC0xMjM0LTEyMzQgaW4gSmFwYW4uCisgICAgICAgICAgICAvLyB3aGlsZSAwOTAtMTIzNC0xMjM0IG11c3Qgbm90IGJlIGVxdWFsIHRvIDkwLTEyMzQtMTIzNCBpbiBKYXBhbi4KICAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCBleGlzdHMganVzdCBpbiBVUyAod2l0aCAxIHRydW5rIChOREQpIHByZWZpeCkuCiAgICAgICAgICAgICAvLyBJbiBhZGRpdGlvbiwgIjAxMSAxMSA3MDA1NTU0MTQxIiBtdXN0IG5vdCBlcXVhbCB0byAiKzE3MDA1NTU0MTQxIiwKICAgICAgICAgICAgIC8vIHdoaWxlICIwMTEgMSA3MDA1NTU0MTQxIiBtdXN0IGVxdWFsIHRvICIrMTcwMDU1NTQxNDEiCkBAIC03NzksMTAgKzc4NCwxMCBAQAogICAgICAgICBpZiAocHJlcGVuZFBsdXMpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gImludGVybmF0aW9uYWwgbnVtYmVyIiBhbmQgc2hvdWxkIGhhdmUKICAgICAgICAgICAgIC8vIGEgcGx1cyBwcmVwZW5kZWQgdG8gdGhlIGRpYWxpbmcgbnVtYmVyLiBCdXQgdGhlcmUKLSAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdzbSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKKyAgICAgICAgICAgIC8vIGNhbiBhbHNvIGJlIEdTTSBNTUkgY29kZXMgYXMgZGVmaW5lZCBpbiBUUyAyMi4wMzAgNi41LjIKICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRob3NlIGFsc28uCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gaHR0cDovL3dlYi50ZWxpYS5jb20vfnU0NzkwNDc3Ni9nc21rb2RlLmh0bSBpcyBhCisgICAgICAgICAgICAvLyBodHRwOi8vd2ViLnRlbGlhLmNvbS9+dTQ3OTA0Nzc2L2dzbWtvZGUuaHRtCiAgICAgICAgICAgICAvLyBoYXMgYSBuaWNlIGxpc3Qgb2Ygc29tZSBvZiB0aGVzZSBHU00gY29kZXMuCiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gRXhhbXBsZXMgYXJlOgpAQCAtODcwLDEwICs4NzUsMTAgQEAKIAogICAgICAgICAgICAgLy8gRklYTUUobWtmKSBUUyAyMy4wNDAgOS4xLjIuMyBzYXlzCiAgICAgICAgICAgICAvLyAiaWYgYSBtb2JpbGUgcmVjZWl2ZXMgMTExMSBpbiBhIHBvc2l0aW9uIHByaW9yIHRvCi0gICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5zZSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgbGFzdCBzZW1pLW9jdGV0IHRoZW4gcHJvY2Vzc2luZyBzaGFsbCBjb21tZW5jZSB3aXRoCiAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzZW1pLW9jdGV0IGFuZCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAgICAgICAgIC8vIHNlbWktb2N0ZXQgc2hhbGwgYmUgaWdub3JlZCIKLSAgICAgICAgICAgIC8vIEhvdyBkb2VzIHRoaXMgaml2ZSB3aXRoIDI0LDAwOCAxMC41LjQuNworICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBqaXZlIHdpdGggMjQuMDA4IDEwLjUuNC43CiAKICAgICAgICAgICAgIGIgPSAoYnl0ZSkoKGJ5dGVzW2ldID4+IDQpICYgMHhmKTsKIApAQCAtMTAwNCw3ICsxMDA5LDcgQEAKICAgICAgKiBDb252ZXJ0IGEgZGlhbGluZyBudW1iZXIgdG8gQkNEIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBudW1iZXIgZGlhbGluZyBudW1iZXIgc3RyaW5nCi0gICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmwgVE9BCisgICAgICogICAgICAgIGlmIHRoZSBkaWFsaW5nIG51bWJlciBzdGFydHMgd2l0aCAnKycsIHNldCB0byBpbnRlcm5hdGlvbmFsIFRPQQogICAgICAqIEByZXR1cm4gQkNEIGJ5dGUgYXJyYXkKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXQpAQCAtMTEwOCwxMCArMTExMywxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNvdXJjZSB0aGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdAogICAgICAqIEBwYXJhbSBkZWZhdWx0Rm9ybWF0dGluZ1R5cGUgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBydWxlcyB0byBhcHBseSBpZiB0aGUgbnVtYmVyIGRvZXMKLSAgICAgKiBub3QgYmVnaW4gd2l0aCArPGNvdW50cnlfY29kZT4KKyAgICAgKiBub3QgYmVnaW4gd2l0aCArW2NvdW50cnlfY29kZV0KICAgICAgKiBAcmV0dXJuIFRoZSBwaG9uZSBudW1iZXIgZm9ybWF0dGVkIHdpdGggdGhlIGdpdmVuIGZvcm1hdHRpbmcgdHlwZS4KICAgICAgKgotICAgICAqIEBoaWRlIFRPRE86U2h1b2xkIGJlIHVuaGlkZGVuLgorICAgICAqIEBoaWRlIFRPRE86IFNob3VsZCBiZSB1bmhpZGRlbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXIoU3RyaW5nIHNvdXJjZSwgaW50IGRlZmF1bHRGb3JtYXR0aW5nVHlwZSkgewogICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihzb3VyY2UpOwpAQCAtMTEzOCw3ICsxMTQzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLCB3aWxsIGJlIG1vZGlmaWVkIHdpdGggdGhlIGZvcm1hdHRpbmcKICAgICAgKiBAcGFyYW0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgcnVsZXMgdG8gYXBwbHkgaWYgdGhlIG51bWJlciBkb2VzCi0gICAgICogbm90IGJlZ2luIHdpdGggKzxjb3VudHJ5X2NvZGU+CisgICAgICogbm90IGJlZ2luIHdpdGggK1tjb3VudHJ5X2NvZGVdCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdE51bWJlcihFZGl0YWJsZSB0ZXh0LCBpbnQgZGVmYXVsdEZvcm1hdHRpbmdUeXBlKSB7CiAgICAgICAgIGludCBmb3JtYXRUeXBlID0gZGVmYXVsdEZvcm1hdHRpbmdUeXBlOwpAQCAtMTMxOSw2ICsxMzI0LDEzMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBnaXZlbiBwaG9uZU51bWJlciB0byB0aGUgRS4xNjQgcmVwcmVzZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVGhlIGdpdmVuIHBob25lIG51bWJlciBtdXN0IGhhdmUgYW4gYXJlYSBjb2RlIGFuZCBjb3VsZCBoYXZlIGEgY291bnRyeQorICAgICAqIGNvZGUuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHRDb3VudHJ5SXNvIGlzIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGdpdmVuIG51bWJlciBhbmQgZ2VuZXJhdGUKKyAgICAgKiB0aGUgRS4xNjQgcGhvbmUgbnVtYmVyIGlmIHRoZSBnaXZlbiBudW1iZXIgZG9lc24ndCBoYXZlIGEgY291bnRyeSBjb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgcGhvbmUgbnVtYmVyIHRvIGZvcm1hdAorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlCisgICAgICogQHJldHVybiB0aGUgRS4xNjQgcmVwcmVzZW50YXRpb24sIG9yIG51bGwgaWYgdGhlIGdpdmVuIHBob25lIG51bWJlciBpcworICAgICAqICAgICAgICAgbm90IHZhbGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXROdW1iZXJUb0UxNjQoU3RyaW5nIHBob25lTnVtYmVyLCBTdHJpbmcgZGVmYXVsdENvdW50cnlJc28pIHsKKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQaG9uZU51bWJlciBwbiA9IHV0aWwucGFyc2UocGhvbmVOdW1iZXIsIGRlZmF1bHRDb3VudHJ5SXNvKTsKKyAgICAgICAgICAgIGlmICh1dGlsLmlzVmFsaWROdW1iZXIocG4pKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdXRpbC5mb3JtYXQocG4sIFBob25lTnVtYmVyRm9ybWF0LkUxNjQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgYSBwaG9uZSBudW1iZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGdpdmVuIG51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZSwgdGhlIHBob25lIHdpbGwgYmUKKyAgICAgKiBmb3JtYXR0ZWQgdG8gdGhlIGRlZmF1bHQgY291bnRyeSdzIGNvbnZlbnRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLgorICAgICAqIEBwYXJhbSBkZWZhdWx0Q291bnRyeUlzbworICAgICAqICAgICAgICAgICAgdGhlIElTTyAzMTY2LTEgdHdvIGxldHRlcnMgY291bnRyeSBjb2RlIHdob3NlIGNvbnZlbnRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgYmUgdXNlZCBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGRvZXNuJ3QgaGF2ZSB0aGUgY291bnRyeSBjb2RlLgorICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdHRlZCBudW1iZXIsIG9yIG51bGwgaWYgdGhlIGdpdmVuIG51bWJlciBpcyBub3QgdmFsaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIsIFN0cmluZyBkZWZhdWx0Q291bnRyeUlzbykgeworICAgICAgICBQaG9uZU51bWJlclV0aWwgdXRpbCA9IFBob25lTnVtYmVyVXRpbC5nZXRJbnN0YW5jZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFBob25lTnVtYmVyIHBuID0gdXRpbC5wYXJzZUFuZEtlZXBSYXdJbnB1dChwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgcmVzdWx0ID0gdXRpbC5mb3JtYXRJbk9yaWdpbmFsRm9ybWF0KHBuLCBkZWZhdWx0Q291bnRyeUlzbyk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgcGhvbmUgbnVtYmVyIG9ubHkgaWYgdGhlIGdpdmVuIG51bWJlciBoYXNuJ3QgYmVlbiBmb3JtYXR0ZWQuCisgICAgICogPHA+CisgICAgICogVGhlIG51bWJlciB3aGljaCBoYXMgb25seSBkYWlsYWJsZSBjaGFyYWN0ZXIgaXMgdHJlYXRlZCBhcyBub3QgYmVpbmcKKyAgICAgKiBmb3JtYXR0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGhvbmVOdW1iZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLgorICAgICAqIEBwYXJhbSBwaG9uZU51bWJlckUxNjQKKyAgICAgKiAgICAgICAgICAgIHRoZSBFMTY0IGZvcm1hdCBudW1iZXIgd2hvc2UgY291bnRyeSBjb2RlIGlzIHVzZWQgaWYgdGhlIGdpdmVuCisgICAgICogICAgICAgICAgICBwaG9uZU51bWJlciBkb2Vzbid0IGhhdmUgdGhlIGNvdW50cnkgY29kZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvdW50cnlJc28KKyAgICAgKiAgICAgICAgICAgIHRoZSBJU08gMzE2Ni0xIHR3byBsZXR0ZXJzIGNvdW50cnkgY29kZSB3aG9zZSBjb252ZW50aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgIGJlIHVzZWQgaWYgdGhlIHBob25lTnVtYmVyRTE2NCBpcyBudWxsIG9yIGludmFsaWQuCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIG51bWJlciBpZiB0aGUgZ2l2ZW4gbnVtYmVyIGhhcyBiZWVuIGZvcm1hdHRlZCwKKyAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBnaXZlbiBudW1iZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE51bWJlcigKKyAgICAgICAgICAgIFN0cmluZyBwaG9uZU51bWJlciwgU3RyaW5nIHBob25lTnVtYmVyRTE2NCwgU3RyaW5nIGRlZmF1bHRDb3VudHJ5SXNvKSB7CisgICAgICAgIGludCBsZW4gPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKCFpc0RpYWxhYmxlKHBob25lTnVtYmVyLmNoYXJBdChpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGhvbmVOdW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUGhvbmVOdW1iZXJVdGlsIHV0aWwgPSBQaG9uZU51bWJlclV0aWwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgLy8gR2V0IHRoZSBjb3VudHJ5IGNvZGUgZnJvbSBwaG9uZU51bWJlckUxNjQKKyAgICAgICAgaWYgKHBob25lTnVtYmVyRTE2NCAhPSBudWxsICYmIHBob25lTnVtYmVyRTE2NC5sZW5ndGgoKSA+PSAyCisgICAgICAgICAgICAgICAgJiYgcGhvbmVOdW1iZXJFMTY0LmNoYXJBdCgwKSA9PSAnKycpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXIgcG4gPSB1dGlsLnBhcnNlKHBob25lTnVtYmVyRTE2NCwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICAgICAgICAgIFN0cmluZyByZWdpb25Db2RlID0gdXRpbC5nZXRSZWdpb25Db2RlRm9yTnVtYmVyKHBuKTsKKyAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHJlZ2lvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb3VudHJ5SXNvID0gcmVnaW9uQ29kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGZvcm1hdE51bWJlcihwaG9uZU51bWJlciwgZGVmYXVsdENvdW50cnlJc28pOworICAgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBwaG9uZU51bWJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSBwaG9uZSBudW1iZXIgYnkgcmVtb3ZpbmcgdGhlIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBkaWdpdHMuIElmCisgICAgICogdGhlIGdpdmVuIG51bWJlciBoYXMga2V5cGFkIGxldHRlcnMsIHRoZSBsZXR0ZXJzIHdpbGwgYmUgY29udmVydGVkIHRvCisgICAgICogZGlnaXRzIGZpcnN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBob25lTnVtYmVyCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGJlIG5vcm1hbGl6ZWQuCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBudW1iZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZU51bWJlcihTdHJpbmcgcGhvbmVOdW1iZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsZW4gPSBwaG9uZU51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcGhvbmVOdW1iZXIuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKChpID09IDAgJiYgYyA9PSAnKycpIHx8IFBob25lTnVtYmVyVXRpbHMuaXNJU09EaWdpdChjKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU51bWJlcihQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMocGhvbmVOdW1iZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICAvLyBUaHJlZSBhbmQgZm91ciBkaWdpdCBwaG9uZSBudW1iZXJzIGZvciBlaXRoZXIgc3BlY2lhbCBzZXJ2aWNlcywKICAgICAvLyBvciAzLTYgZGlnaXQgYWRkcmVzc2VzIGZyb20gdGhlIG5ldHdvcmsgKGVnIGNhcnJpZXItb3JpZ2luYXRlZCBTTVMgbWVzc2FnZXMpIHNob3VsZAogICAgIC8vIG5vdCBtYXRjaC4KQEAgLTE1NDYsNyArMTY3Nyw3IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZwotICAgIGNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KFN0cmluZyBkaWFsU3RyLGludCBjdXJyRm9ybWF0LGludCBkZWZhdWx0Rm9ybXQpIHsKKyAgICBjZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdChTdHJpbmcgZGlhbFN0cixpbnQgY3VyckZvcm1hdCxpbnQgZGVmYXVsdEZvcm1hdCkgewogICAgICAgICBTdHJpbmcgcmV0U3RyID0gZGlhbFN0cjsKIAogICAgICAgICAvLyBDaGVja3MgaWYgdGhlIHBsdXMgc2lnbiBjaGFyYWN0ZXIgaXMgaW4gdGhlIHBhc3NlZC1pbiBkaWFsIHN0cmluZwpAQCAtMTU1NCw3ICsxNjg1LDcgQEAKICAgICAgICAgICAgIGRpYWxTdHIubGFzdEluZGV4T2YoUExVU19TSUdOX1NUUklORykgIT0gLTEpIHsKICAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgdGhlIGNvdW50cnkgdGhlIG51bWJlciBpcyBmcm9tLAogICAgICAgICAgICAgLy8gYW5kIHRoZSBjdXJyZW50IGNvdW50cnkgdGhlIHBob25lIGlzIGNhbXBlZCBvbi4KLSAgICAgICAgICAgIGlmICgoY3VyckZvcm1hdCA9PSBkZWZhdWx0Rm9ybXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgeworICAgICAgICAgICAgaWYgKChjdXJyRm9ybWF0ID09IGRlZmF1bHRGb3JtYXQpICYmIChjdXJyRm9ybWF0ID09IEZPUk1BVF9OQU5QKSkgewogICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGRlZmF1bHQgYW5kIGN1cnJlbnQgdGVsZXBob25lIG51bWJlcmluZyBwbGFucyBhcmUgTkFOUC4KICAgICAgICAgICAgICAgICBTdHJpbmcgcG9zdERpYWxTdHIgPSBudWxsOwogICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wRGlhbFN0ciA9IGRpYWxTdHI7CkBAIC0xNzQxLDcgKzE4NzIsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhYmxhYmxlIFAvVyBjaGFyYWN0ZXIgdG8gdGhlIG9yaWdpbmFsCisgICAgLy8gVGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBub24tZGlhbGFibGUgUC9XIGNoYXJhY3RlciB0byB0aGUgb3JpZ2luYWwKICAgICAvLyBkaWFsIHN0cmluZyBiYXNlZCBvbiB0aGUgZGlhbGFibGUgaW5kZXggcGFzc2VkIGluCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nCiAgICAgYXBwZW5kUHdDaGFyQmFja1RvT3JpZ0RpYWxTdHIoaW50IGRpYWxhYmxlSW5kZXgsU3RyaW5nIG9yaWdTdHIsIFN0cmluZyBkaWFsU3RyKSB7CkBAIC0xNzYxLDcgKzE4OTIsNyBAQAogICAgICAgICByZXR1cm4gcmV0U3RyOwogICAgIH0KIAotICAgIC8vPT09PT0gQmVnaW5pbmcgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgaW4gY29tcGFyZUxvb3NlbHkoKSA9PT09PQorICAgIC8vPT09PT0gQmVnaW5uaW5nIG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGluIGNvbXBhcmVMb29zZWx5KCkgPT09PT0KIAogICAgIC8qKgogICAgICAqIFBob25lIG51bWJlcnMgYXJlIHN0b3JlZCBpbiAibG9va3VwIiBmb3JtIGluIHRoZSBkYXRhYmFzZQpAQCAtMTg4MywxMiArMjAxNCwxMiBAQAogCiAgICAgLy89PT09PSBFbmQgb2YgdXRpbGl0eSBtZXRob2RzIHVzZWQgb25seSBpbiBjb21wYXJlTG9vc2VseSgpID09PT09CiAKLSAgICAvLz09PT09IEJlZ2dpbmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KKyAgICAvLz09PT09IEJlZ2lubmluZyBvZiB1dGlsaXR5IG1ldGhvZHMgdXNlZCBvbmx5IGluIGNvbXBhcmVTdHJpY3RseSgpID09PT0KIAogICAgIC8qCiAgICAgICogSWYgdHJ1ZSwgdGhlIG51bWJlciBpcyBjb3VudHJ5IGNhbGxpbmcgY29kZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPVU5UTFlfQ0FMTElOR19DQUxMW10gPSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT1VOVFJZX0NBTExJTkdfQ0FMTFtdID0gewogICAgICAgICB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwKICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIGZhbHNlLApAQCAtMTkwMCwxOCArMjAzMSwxOCBAQAogICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwKICAgICAgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwKICAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRMWV9DQUxMSU5HX0NBTEwubGVuZ3RoOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQ0NfTEVOR1RIID0gQ09VTlRSWV9DQUxMSU5HX0NBTEwubGVuZ3RoOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0cnVlIHdoZW4gaW5wdXQgaXMgdmFsaWQgQ291bnRyeSBDYWxsaW5nIENvZGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvdW50cnlDYWxsaW5nQ29kZShpbnQgY291bnRyeUNhbGxpbmdDb2RlQ2FuZGlkYXRlKSB7CiAgICAgICAgIHJldHVybiBjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGUgPiAwICYmIGNvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZSA8IENDQ19MRU5HVEggJiYKLSAgICAgICAgICAgICAgICBDT1VOVExZX0NBTExJTkdfQ0FMTFtjb3VudHJ5Q2FsbGluZ0NvZGVDYW5kaWRhdGVdOworICAgICAgICAgICAgICAgIENPVU5UUllfQ0FMTElOR19DQUxMW2NvdW50cnlDYWxsaW5nQ29kZUNhbmRpZGF0ZV07CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBpbnRlcmdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBpZiBpbnB1dCAiY2giIGlzCisgICAgICogUmV0dXJucyBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGlmIGlucHV0ICJjaCIgaXMKICAgICAgKiBJU08tTEFUSU4gY2hhcmFjdGVycyAwLTkuCiAgICAgICogUmV0dXJucyAtMSBvdGhlcndpc2UKICAgICAgKi8KQEAgLTIwNDYsNyArMjE3Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJlZml4IG9mICJzdHIiIGlzICJpZ25vcmFibGUiLiBIZXJlLCAiaWdub3JhYmxlIiBtZWFucwotICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0ZXIgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcworICAgICAqIHRoYXQgInN0ciIgaGFzIG9ubHkgb25lIGRpZ2l0IGFuZCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gVGhlIG9uZSBkaWdpdCBpcwogICAgICAqIGFzc3VtZWQgdG8gYmUgdHJ1bmsgcHJlZml4LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tQcmVmaXhJc0lnbm9yYWJsZShmaW5hbCBTdHJpbmcgc3RyLApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVTdGF0ZUxpc3RlbmVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQppbmRleCA4MzBhZjQ3Li4zOGY0NGQ4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9QaG9uZVN0YXRlTGlzdGVuZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVBob25lU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiAKIC8qKgogICogQSBsaXN0ZW5lciBjbGFzcyBmb3IgbW9uaXRvcmluZyBjaGFuZ2VzIGluIHNwZWNpZmljIHRlbGVwaG9ueSBzdGF0ZXMKQEAgLTI4NCw3ICsyODUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQ29ubmVjdGlvblN0YXRlQ2hhbmdlZChpbnQgc3RhdGUsIGludCBuZXR3b3JrVHlwZSkgewotICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIExJU1RFTl9EQVRBX0NPTk5FQ1RJT05fU1RBVEUsIHN0YXRlLCBuZXR3b3JrVHlwZSwgbnVsbCkuCisgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihtSGFuZGxlciwgTElTVEVOX0RBVEFfQ09OTkVDVElPTl9TVEFURSwgc3RhdGUsIG5ldHdvcmtUeXBlKS4KICAgICAgICAgICAgICAgICAgICAgc2VuZFRvVGFyZ2V0KCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCmluZGV4IGY1ZTk3NTEuLjk1MzY5NmIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JU21zOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc1Jhd0RhdGE7CkBAIC0zMyw3ICszMiw3IEBACiAvKgogICogVE9ETyhjb2RlIHJldmlldyk6IEN1cmlvdXMgcXVlc3Rpb24uLi4gV2h5IGFyZSBhIGxvdCBvZiB0aGVzZQogICogbWV0aG9kcyBub3QgZGVjbGFyZWQgYXMgc3RhdGljLCBzaW5jZSB0aGV5IGRvIG5vdCBzZWVtIHRvIHJlcXVpcmUKLSAqIGFueSBsb2NhbCBvYmplY3Qgc3RhdGU/ICBBc3N1bWVkbHkgdGhpcyBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0CisgKiBhbnkgbG9jYWwgb2JqZWN0IHN0YXRlPyAgUHJlc3VtYWJseSB0aGlzIGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQKICAqIGludGVyZmVyaW5nIHdpdGggdGhlIEFQSS4uLgogICovCiAKQEAgLTQyLDcgKzQxLDggQEAKICAqIEdldCB0aGlzIG9iamVjdCBieSBjYWxsaW5nIHRoZSBzdGF0aWMgbWV0aG9kIFNtc01hbmFnZXIuZ2V0RGVmYXVsdCgpLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgU21zTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU21zTWFuYWdlciBzSW5zdGFuY2U7CisgICAgLyoqIFNpbmdsZXRvbiBvYmplY3QgY29uc3RydWN0ZWQgZHVyaW5nIGNsYXNzIGluaXRpYWxpemF0aW9uLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNtc01hbmFnZXIgc0luc3RhbmNlID0gbmV3IFNtc01hbmFnZXIoKTsKIAogICAgIC8qKgogICAgICAqIFNlbmQgYSB0ZXh0IGJhc2VkIFNNUy4KQEAgLTUyLDggKzUyLDggQEAKICAgICAgKiAgdGhlIGN1cnJlbnQgZGVmYXVsdCBTTVNDCiAgICAgICogQHBhcmFtIHRleHQgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgdG8gc2VuZAogICAgICAqIEBwYXJhbSBzZW50SW50ZW50IGlmIG5vdCBOVUxMIHRoaXMgPGNvZGU+UGVuZGluZ0ludGVudDwvY29kZT4gaXMKLSAgICAgKiAgYnJvYWRjYXN0IHdoZW4gdGhlIG1lc3NhZ2UgaXMgc3VjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgotICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Nlc3NmdWxseSBzZW50LCBvciBmYWlsZWQuCisgICAgICogIFRoZSByZXN1bHQgY29kZSB3aWxsIGJlIDxjb2RlPkFjdGl2aXR5LlJFU1VMVF9PSzwvY29kZT4gZm9yIHN1Y2Nlc3MsCiAgICAgICogIG9yIG9uZSBvZiB0aGVzZSBlcnJvcnM6PGJyPgogICAgICAqICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX1JBRElPX09GRjwvY29kZT48YnI+CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICAgKiBAcGFyYW0gc2VudEludGVudHMgaWYgbm90IG51bGwsIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YKICAgICAgKiAgIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+cyAob25lIGZvciBlYWNoIG1lc3NhZ2UgcGFydCkgdGhhdCBpcwogICAgICAqICAgYnJvYWRjYXN0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBwYXJ0IGhhcyBiZWVuIHNlbnQuCi0gICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8Y29kZT4gZm9yIHN1Y2Nlc3MsCisgICAgICogICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICAgb3Igb25lIG9mIHRoZXNlIGVycm9yczo8YnI+CiAgICAgICogICA8Y29kZT5SRVNVTFRfRVJST1JfR0VORVJJQ19GQUlMVVJFPC9jb2RlPjxicj4KICAgICAgKiAgIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICogICB0aGUgZXh0cmEgImVycm9yQ29kZSIgY29udGFpbmluZyBhIHJhZGlvIHRlY2hub2xvZ3kgc3BlY2lmaWMgdmFsdWUsCiAgICAgICogICBnZW5lcmFsbHkgb25seSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy48YnI+CiAgICAgICogICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogICBpcyBOVUxMIHRoZSBjYWxsZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYWxsIHVua25vd24gYXBwbGljYWl0b25zLAorICAgICAqICAgaXMgTlVMTCB0aGUgY2FsbGVyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFsbCB1bmtub3duIGFwcGxpY2F0aW9ucywKICAgICAgKiAgIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnRzIGlmIG5vdCBudWxsLCBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IG9mCiAgICAgICogICA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPnMgKG9uZSBmb3IgZWFjaCBtZXNzYWdlIHBhcnQpIHRoYXQgaXMKQEAgLTE3OCw4ICsxNzgsOCBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0bwogICAgICAqIEBwYXJhbSBkYXRhIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQKICAgICAgKiBAcGFyYW0gc2VudEludGVudCBpZiBub3QgTlVMTCB0aGlzIDxjb2RlPlBlbmRpbmdJbnRlbnQ8L2NvZGU+IGlzCi0gICAgICogIGJyb2FkY2FzdCB3aGVuIHRoZSBtZXNzYWdlIGlzIHN1Y2Vzc2Z1bGx5IHNlbnQsIG9yIGZhaWxlZC4KLSAgICAgKiAgVGhlIHJlc3VsdCBjb2RlIHdpbGwgYmUgPGNvZGU+QWN0aXZpdHkuUkVTVUxUX09LPGNvZGU+IGZvciBzdWNjZXNzLAorICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBzdWNjZXNzZnVsbHkgc2VudCwgb3IgZmFpbGVkLgorICAgICAqICBUaGUgcmVzdWx0IGNvZGUgd2lsbCBiZSA8Y29kZT5BY3Rpdml0eS5SRVNVTFRfT0s8L2NvZGU+IGZvciBzdWNjZXNzLAogICAgICAqICBvciBvbmUgb2YgdGhlc2UgZXJyb3JzOjxicj4KICAgICAgKiAgPGNvZGU+UkVTVUxUX0VSUk9SX0dFTkVSSUNfRkFJTFVSRTwvY29kZT48YnI+CiAgICAgICogIDxjb2RlPlJFU1VMVF9FUlJPUl9SQURJT19PRkY8L2NvZGU+PGJyPgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICogIHRoZSBleHRyYSAiZXJyb3JDb2RlIiBjb250YWluaW5nIGEgcmFkaW8gdGVjaG5vbG9neSBzcGVjaWZpYyB2YWx1ZSwKICAgICAgKiAgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcuPGJyPgogICAgICAqICBUaGUgcGVyLWFwcGxpY2F0aW9uIGJhc2VkIFNNUyBjb250cm9sIGNoZWNrcyBzZW50SW50ZW50LiBJZiBzZW50SW50ZW50Ci0gICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhaXRvbnMsCisgICAgICogIGlzIE5VTEwgdGhlIGNhbGxlciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhbGwgdW5rbm93biBhcHBsaWNhdGlvbnMsCiAgICAgICogIHdoaWNoIGNhdXNlIHNtYWxsZXIgbnVtYmVyIG9mIFNNUyB0byBiZSBzZW50IGluIGNoZWNraW5nIHBlcmlvZC4KICAgICAgKiBAcGFyYW0gZGVsaXZlcnlJbnRlbnQgaWYgbm90IE5VTEwgdGhpcyA8Y29kZT5QZW5kaW5nSW50ZW50PC9jb2RlPiBpcwogICAgICAqICBicm9hZGNhc3Qgd2hlbiB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHJlY2lwaWVudC4gIFRoZQpAQCAtMjI0LDkgKzIyNCw2IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgU21zTWFuYWdlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU21zTWFuYWdlciBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoc0luc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBTbXNNYW5hZ2VyKCk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01lc3NhZ2UuamF2YQppbmRleCBhMjg0ZWE1Li4wNzQ2NTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWVzc2FnZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRW5jb2RlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5TdWJtaXRQZHVCYXNlOwpAQCAtNTQsNiArNTMsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR183QklUID0gMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR184QklUID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR18xNkJJVCA9IDM7CisgICAgLyoqCisgICAgICogQGhpZGUgVGhpcyB2YWx1ZSBpcyBub3QgZGVmaW5lZCBpbiBnbG9iYWwgc3RhbmRhcmQuIE9ubHkgaW4gS29yZWEsIHRoaXMgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19LU0M1NjAxID0gNDsKIAogICAgIC8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGF5bG9hZCBieXRlcyBwZXIgbWVzc2FnZSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VU0VSX0RBVEFfQllURVMgPSAxNDA7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKaW5kZXggMjdlMDhkNC4uMjM3MGFkZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQpAQCAtOTEyLDQgKzkxMiwyNSBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzICJ2b2ljZSBjYXBhYmxlIi4KKyAgICAgKiA8cD4KKyAgICAgKiAiVm9pY2UgY2FwYWJsZSIgbWVhbnMgdGhhdCB0aGlzIGRldmljZSBzdXBwb3J0cyBjaXJjdWl0LXN3aXRjaGVkCisgICAgICogKGkuZS4gdm9pY2UpIHBob25lIGNhbGxzIG92ZXIgdGhlIHRlbGVwaG9ueSBuZXR3b3JrLCBhbmQgaXMgYWxsb3dlZAorICAgICAqIHRvIGRpc3BsYXkgdGhlIGluLWNhbGwgVUkgd2hpbGUgYSBjZWxsdWxhciB2b2ljZSBjYWxsIGlzIGFjdGl2ZS4KKyAgICAgKiBUaGlzIHdpbGwgYmUgZmFsc2Ugb24gImRhdGEgb25seSIgZGV2aWNlcyB3aGljaCBjYW4ndCBtYWtlIHZvaWNlCisgICAgICogY2FsbHMgYW5kIGRvbid0IHN1cHBvcnQgYW55IGluLWNhbGwgVUkuCisgICAgICogPHA+CisgICAgICogTm90ZTogdGhlIG1lYW5pbmcgb2YgdGhpcyBmbGFnIGlzIHN1YnRseSBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgKiBQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1RFTEVQSE9OWSBzeXN0ZW0gZmVhdHVyZSwgd2hpY2ggaXMgYXZhaWxhYmxlCisgICAgICogb24gYW55IGRldmljZSB3aXRoIGEgdGVsZXBob255IHJhZGlvLCBldmVuIGlmIHRoZSBkZXZpY2UgaXMKKyAgICAgKiBkYXRhLW9ubHkuCisgICAgICoKKyAgICAgKiBAaGlkZSBwZW5kaW5nIEFQSSByZXZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvaWNlQ2FwYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5ib29sLmNvbmZpZ192b2ljZV9jYXBhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ29tbWFuZHNJbnRlcmZhY2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCmluZGV4IDVkZTA0MjYuLjI3YTRkY2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Db21tYW5kc0ludGVyZmFjZS5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZHNJbnRlcmZhY2UgewogICAgIGVudW0gUmFkaW9TdGF0ZSB7Ci0gICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWN0bHkgcG93ZXJlZCBvZmYgKGVnIENGVU49MCkgKi8KLSAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlZywgcmVzZXR0aW5nIG9yIG5vdCBib290ZWQpICovCisgICAgICAgIFJBRElPX09GRiwgICAgICAgICAvKiBSYWRpbyBleHBsaWNpdGx5IHBvd2VyZWQgb2ZmIChlLmcuIENGVU49MCkgKi8KKyAgICAgICAgUkFESU9fVU5BVkFJTEFCTEUsIC8qIFJhZGlvIHVuYXZhaWxhYmxlIChlLmcuIHJlc2V0dGluZyBvciBub3QgYm9vdGVkKSAqLwogICAgICAgICBTSU1fTk9UX1JFQURZLCAgICAgLyogUmFkaW8gaXMgb24sIGJ1dCB0aGUgU0lNIGludGVyZmFjZSBpcyBub3QgcmVhZHkgKi8KICAgICAgICAgU0lNX0xPQ0tFRF9PUl9BQlNFTlQsICAvKiBTSU0gUElOIGxvY2tlZCwgUFVLIHJlcXVpcmVkLCBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYWxpemF0aW9uLCBvciBTSU0gYWJzZW50ICovCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAvLyBTZWUgMjcuMDA3ICtDQ0ZDIG9yICtDTENLCiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX05PTkUgICAgID0gMDsgLy8gbm8gdXNlciBpbnB1dAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19WT0lDRSAgICA9ICgxIDw8IDApOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9DTEFTU19EQVRBICAgICA9ICgxIDw8IDEpOyAvL3N5bm95bSBmb3IgMTYrMzIrNjQrMTI4CisgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEEgICAgID0gKDEgPDwgMSk7IC8vc3lub255bSBmb3IgMTYrMzIrNjQrMTI4CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0ZBWCAgICAgID0gKDEgPDwgMik7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX1NNUyAgICAgID0gKDEgPDwgMyk7CiAgICAgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0NMQVNTX0RBVEFfU1lOQyA9ICgxIDw8IDQpOwpAQCAtOTUyLDE5ICs5NTIsMTkgQEAKICAgICB2b2lkIHdyaXRlU21zVG9SdWltKGludCBzdGF0dXMsIFN0cmluZyBwZHUsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gYXBuCiAgICAgICogQHBhcmFtIHVzZXIKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQKICAgICAgKiBAcGFyYW0gcmVzcG9uc2UKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgc2V0dXBEZWZhdWx0UERQKFN0cmluZyBhcG4sIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKICAgICAgKiBAcGFyYW0gY2lkCiAgICAgICogQHBhcmFtIHJlc3BvbnNlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICB2b2lkIGRlYWN0aXZhdGVEZWZhdWx0UERQKGludCBjaWQsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgdm9pZCBzZXRSYWRpb1Bvd2VyKGJvb2xlYW4gb24sIE1lc3NhZ2UgcmVzcG9uc2UpOwpAQCAtOTc0LDcgKzk3NCw3IEBACiAgICAgdm9pZCBhY2tub3dsZWRnZUxhc3RJbmNvbWluZ0NkbWFTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgY2F1c2UsIE1lc3NhZ2UgcmVzcG9uc2UpOwogCiAgICAgLyoqCi0gICAgICogcGFyYW1ldGVycyBlcXVpdmlsaWVudCB0byAyNy4wMDcgQVQrQ1JTTSBjb21tYW5kCisgICAgICogcGFyYW1ldGVycyBlcXVpdmFsZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKICAgICAgKiByZXNwb25zZS5vYmogd2lsbCBiZSBhbiBBc3luY1Jlc3VsdAogICAgICAqIHJlc3BvbnNlLm9iai51c2VyT2JqIHdpbGwgYmUgYSBJY2NJb1Jlc3VsdCBvbiBzdWNjZXNzCiAgICAgICovCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCiAgICAgLyoqCiAgICAgICogKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0IHdpbGwgYmUgYW4gSW50ZWdlciByZXByZXNlbnRpbmcKLSAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VyaXZpY2UgY2xhc3NlcyAoc3VtIG9mIFNFUlZJQ0VfQ0xBU1NfKikKKyAgICAgKiB0aGUgc3VtIG9mIGVuYWJsZWQgc2VydmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQogICAgICAqCiAgICAgICogQHBhcmFtIGZhY2lsaXR5IG9uZSBvZiBDQl9GQUNJTFRZXyoKICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHdoZW4KLSAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGVpb24gKGxhYyBhbmQvb3IgY2lkKSBoYXMgY2hhbmdlZC4KKyAgICAgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiAobGFjIGFuZC9vciBjaWQpIGhhcyBjaGFuZ2VkLgogICAgICAqCiAgICAgICogQHBhcmFtIGVuYWJsZSB0cnVlIHRvIGVuYWJsZSwgZmFsc2UgdG8gZGlzYWJsZQogICAgICAqIEBwYXJhbSByZXNwb25zZSBjYWxsYmFjayBtZXNzYWdlCkBAIC0xMTgzLDcgKzExODMsNyBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHRvIHRoZSB2ZW5kb3IgcmlsIHRoYXQgU3RrU2VydmljZSBpcyBydW5uaW5nCi0gICAgICogcmFuZCBpcyBlYWR5IHRvIHJlY2VpdmUgUklMX1VOU09MX1NUS19YWFhYIGNvbW1hbmRzLgorICAgICAqIGFuZCBpcyByZWFkeSB0byByZWNlaXZlIFJJTF9VTlNPTF9TVEtfWFhYWCBjb21tYW5kcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQppbmRleCA2NjM0MDE3Li41MjFkOTBjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YQpAQCAtMjEsMTEgKzIxLDE3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKIAoraW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiAKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKKwogLyoqCiAgKiB7QGhpZGV9CiAgKgpAQCAtMjU1LDEwICsyNjEsNyBAQAogICAgIHByb3RlY3RlZCBpbnQgbVRhZzsKICAgICBwcm90ZWN0ZWQgUGhvbmVCYXNlIHBob25lOwogICAgIHByb3RlY3RlZCBpbnQgY2lkOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaW50ZXJmYWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlwQWRkcmVzczsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdhdGV3YXlBZGRyZXNzOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBkbnNTZXJ2ZXJzOworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICBwcm90ZWN0ZWQgbG9uZyBjcmVhdGVUaW1lOwogICAgIHByb3RlY3RlZCBsb25nIGxhc3RGYWlsVGltZTsKICAgICBwcm90ZWN0ZWQgRmFpbENhdXNlIGxhc3RGYWlsQ2F1c2U7CkBAIC0yODMsOCArMjg2LDYgQEAKICAgICAgICAgaWYgKERCRykgbG9nKCJEYXRhQ29ubmVjdGlvbiBjb25zdHJ1Y3RvciBFIik7CiAgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKICAgICAgICAgdGhpcy5jaWQgPSAtMTsKLSAgICAgICAgdGhpcy5kbnNTZXJ2ZXJzID0gbmV3IFN0cmluZ1syXTsKLQogICAgICAgICBjbGVhclNldHRpbmdzKCk7CiAKICAgICAgICAgc2V0RGJnKGZhbHNlKTsKQEAgLTM3NywxMSArMzc4LDcgQEAKICAgICAgICAgdGhpcy5sYXN0RmFpbFRpbWUgPSAtMTsKICAgICAgICAgdGhpcy5sYXN0RmFpbENhdXNlID0gRmFpbENhdXNlLk5PTkU7CiAKLSAgICAgICAgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlwQWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIGdhdGV3YXlBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgZG5zU2VydmVyc1swXSA9IG51bGw7Ci0gICAgICAgIGRuc1NlcnZlcnNbMV0gPSBudWxsOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNiwzNSArNDEzLDY4IEBACiAvLyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsKIC8vICAgICAgICAgICAgICAgIGxvZygiICByZXNwb25zZVsiICsgaSArICJdPSciICsgcmVzcG9uc2VbaV0gKyAiJyIpOwogLy8gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggY2xlYW4gbmV0d29yayBwcm9wZXJ0aWVzIGFuZCBpZiB3ZSBoYXZlCisgICAgICAgICAgICAvLyBhIGZhaWx1cmUgd2UnbGwgY2xlYXIgYWdhaW4gYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGNvZGUuCisgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG5ldyBMaW5rUHJvcGVydGllcygpOwogICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgY2lkID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZVswXSk7Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9IHJlc3BvbnNlWzJdOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIm5ldC4iICsgaW50ZXJmYWNlTmFtZSArICIuIjsKLSAgICAgICAgICAgICAgICAgICAgZ2F0ZXdheUFkZHJlc3MgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZ3ciKTsKLSAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1swXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMxIik7Ci0gICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMV0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coImludGVyZmFjZT0iICsgaW50ZXJmYWNlTmFtZSArICIgaXBBZGRyZXNzPSIgKyBpcEFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZ2F0ZXdheT0iICsgZ2F0ZXdheUFkZHJlc3MgKyAiIEROUzE9IiArIGRuc1NlcnZlcnNbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRE5TMj0iICsgZG5zU2VydmVyc1sxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHJlc3BvbnNlWzFdOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRG5zT2soZG5zU2VydmVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LlNVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfQmFkRG5zOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAibmV0LiIgKyBpbnRlcmZhY2VOYW1lICsgIi4iOworCisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLnNldEludGVyZmFjZShOZXR3b3JrSW50ZXJmYWNlLmdldEJ5TmFtZShpbnRlcmZhY2VOYW1lKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogR2V0IGdhdGV3YXkgYW5kIGRucyB2aWEgUklMIGludGVyZmFjZSBub3QgcHJvcGVydHk/CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBnYXRld2F5QWRkcmVzcyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJndyIpOworICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5zZXRHYXRld2F5KEluZXRBZGRyZXNzLmdldEJ5TmFtZShnYXRld2F5QWRkcmVzcykpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXBBZGRyZXNzID0gcmVzcG9uc2VbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5hZGRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShpcEFkZHJlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogR2V0IGdhdGV3YXkgYW5kIGRucyB2aWEgUklMIGludGVyZmFjZSBub3QgcHJvcGVydHk/CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG5zU2VydmVyc1tdID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRuc1NlcnZlcnNbMF0gPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcmVmaXggKyAiZG5zMSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZG5zU2VydmVyc1sxXSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KHByZWZpeCArICJkbnMyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEbnNPayhkbnNTZXJ2ZXJzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU2VydmVyc1swXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLmFkZERucyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoZG5zU2VydmVyc1sxXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfQmFkRG5zOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gU2V0dXBSZXN1bHQuU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIm9uU2V0dXBDb21wbGV0ZWQ6IFVua25vd0hvc3RFeGNlcHRpb24gIiArIGUxKTsKKyAgICAgICAgICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkOiBTb2NrZXRFeGNlcHRpb24gIiArIGUyKTsKKyAgICAgICAgICAgICAgICAgICAgZTIucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygib25TZXR1cENvbXBsZXRlZDogZXJyb3I7IGV4cGVjdGVkIG51bWJlciBvZiByZXNwb25zZXMgPj0gMiB3YXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNldHVwUmVzdWx0LkVSUl9PdGhlcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgc28gY2xlYXIgcHJvcGVydGllcworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgbG9nKCJvblNldHVwQ29tcGxldGVkIHdpdGggYW4gZXJyb3IgY2xlYXJpbmcgTGlua1Byb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoREJHKSBsb2coIkRhdGFDb25uZWN0aW9uIHNldHVwIHJlc3VsdD0nIiArIHJlc3VsdCArICInIG9uIGNpZD0iICsgY2lkKTsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgbG9nKCJEYXRhQ29ubmVjdGlvbiBzZXR1cCByZXN1bHQ9JyIgKyByZXN1bHQgKyAiJyBvbiBjaWQ9IiArIGNpZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFNldHVwUmVzdWx0LlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBsb2coIkxpbmtQcm9wZXJ0aWVzOiAiICsgbUxpbmtQcm9wZXJ0aWVzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC02MDYsNyArNjM2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVSUl9CYWREbnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBzdWNjZWVkZWQgYnV0IEROUyBpbmZvIGlzIGJhZCBzbyBkaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuUERQX0JBRF9ETlNfQUREUkVTUywgZG5zU2VydmVyc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBkbnNBZGRyZXNzZXNTYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGRyIDogbUxpbmtQcm9wZXJ0aWVzLmdldERuc2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpICE9IDApIGRuc0FkZHJlc3Nlc1NiLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi5hcHBlbmQoYWRkci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRuc0FkZHJlc3Nlc1NiLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5zQWRkcmVzc2VzU2IuYXBwZW5kKCJuby1kbnMtYWRkcmVzc2VzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLlBEUF9CQURfRE5TX0FERFJFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNBZGRyZXNzZXNTYi50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bkRhdGEoY3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ0JhZERuc1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3MywzMSArOTEyLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGlvbnMgTGlua1Byb3BlcnRpZXMKICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgaXAgYWRkcmVzcyBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGlwQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBnYXRld2F5IGFkZHJlc3MgYXMgYSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRHYXRld2F5QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGdhdGV3YXlBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYXNzb2NpYXRlZCBETlMgYWRkcmVzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZG5zU2VydmVyczsKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCAzYjllNmNjLi43NjVmNjRiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0xNywxMCArMTcsMTAgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwpAQCAtMjgsNiArMjgsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAorCiAvKioKICAqIHtAaGlkZX0KICAqCkBAIC0xODgsNyArMTg5LDEzIEBACiAgICAgLyoqIENJRCBvZiBhY3RpdmUgZGF0YSBjb25uZWN0aW9uICovCiAgICAgcHJvdGVjdGVkIGludCBjaWRBY3RpdmU7CiAKLSAgIC8qKgorICAgIC8qKiBpbmRpY2F0aW9uIG9mIG91ciBhdmFpbGFiaWxpdHkgKHByZWNvbmRpdGlvbnMgdG8gdHJ5c2V0dXBEYXRhIGFyZSBtZXQpICoqLworICAgIHByb3RlY3RlZCBib29sZWFuIG1BdmFpbGFiaWxpdHkgPSBmYWxzZTsKKworICAgIC8qKiBhbGwgb3VyIGxpbmsgcHJvcGVydGllcyAoZG5zLCBnYXRld2F5LCBpcCwgZXRjKSAqLworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBtTGlua1Byb3BlcnRpZXM7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERhdGFDb25uZWN0aW9uVHJhY2tlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTQxMSwxNyArNDE4LDk1IEBACiAKICAgICBwdWJsaWMgYWJzdHJhY3QgQXJyYXlMaXN0PERhdGFDb25uZWN0aW9uPiBnZXRBbGxEYXRhQ29ubmVjdGlvbnMoKTsKIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEdhdGV3YXkoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpOwotCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0U3RhdGUoU3RhdGUgcyk7CiAKLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbmFibGVkKGludCBpZCkgeworICAgIHByb3RlY3RlZCBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBpbnQgaWQgPSBhcG5UeXBlVG9JZChhcG5UeXBlKTsKKyAgICAgICAgaWYgKGlzQXBuSWRFbmFibGVkKGlkKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZWxsIGFsbCBhY3RpdmUgYXBucyBvZiB0aGUgY3VycmVudCBjb25kaXRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIGZvciAoaW50IGlkID0gMDsgaWQgPCBBUE5fTlVNX1RZUEVTOyBpZCsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbaWRdKSB7CisgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uLCBhcG5JZFRvVHlwZShpZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKKyAgICB9CisKKyAgICAvLyBhIG5ldyBBUE4gaGFzIGdvbmUgYWN0aXZlIGFuZCBuZWVkcyB0byBzZW5kIGV2ZW50cyB0byBjYXRjaCB1cCB3aXRoIHRoZSBjdXJyZW50IGNvbmRpdGlvbgorICAgIHByaXZhdGUgdm9pZCBub3RpZnlBcG5JZFVwVG9DdXJyZW50KFN0cmluZyByZWFzb24sIGludCBhcG5JZCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIElETEU6CisgICAgICAgICAgICBjYXNlIElOSVRJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RJTkc6CisgICAgICAgICAgICBjYXNlIFNDQU5OSU5HOgorICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVElORyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24sIGFwbklkVG9UeXBlKGFwbklkKSwgUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNpbmNlIHdlIG5vcm1hbGx5IGRvbid0IHNlbmQgaW5mbyB0byBhIGRpc2Nvbm5lY3RlZCBBUE4sIHdlIG5lZWQgdG8gZG8gdGhpcyBzcGVjaWFsbHkKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoU3RyaW5nIHJlYXNvbiwgaW50IGFwbklkKSB7CisgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbiwgYXBuSWRUb1R5cGUoYXBuSWQpLCBQaG9uZS5EYXRhU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlZCBhcG4ncyBzdGlsbCBuZWVkIGF2YWlsL3VuYXZhaWwgbm90aWZpY2lhdGlvbnMgLSBzZW5kIHRoZW0gb3V0CisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KFN0cmluZyByZWFzb24sIGJvb2xlYW4gYXZhaWxhYmlsaXR5KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmlsaXR5ID09IGF2YWlsYWJpbGl0eSkgcmV0dXJuOworICAgICAgICBtQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5OworICAgICAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQVBOX05VTV9UWVBFUzsgaWQrKykgeworICAgICAgICAgICAgaWYgKCFpc0FwbklkRW5hYmxlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBcG5JZERpc2Nvbm5lY3RlZChyZWFzb24sIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGhhZCBhbiBhdmFpbGFiaWxpdHkgY2hhbmdlIC0gdGVsbCB0aGUgbGlzdGVuZXJzCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CisgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CisgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKKyAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSBhcmUKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRhdGEgaXMgZGlzYWxsb3dlZCAocm9hbWluZywgcG93ZXIgc3RhdGUsIHZvaWNlIGNhbGwsIGV0YykuPC9saT4KKyAgICAgKiA8bGk+VGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSBpcyB7QGNvZGUgRElTQ09OTkVDVEVEfSBmb3IgYSByZWFzb24gb3RoZXIgdGhhbgorICAgICAqIGhhdmluZyBleHBsaWNpdGx5IGRpc2FibGVkIGNvbm5lY3Rpdml0eS4gSW4gb3RoZXIgd29yZHMsIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorICAgICAqIGJlY2F1c2UgdGhlIHBob25lIGlzIG91dCBvZiBjb3ZlcmFnZSBvciBzb21lIGxpa2UgcmVhc29uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkYXRhIGNvbm5lY3Rpdml0eSBpcyBwb3NzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoKSB7CisgICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoaXNEYXRhQWxsb3dlZCgpICYmCisgICAgICAgICAgICAhKGdldERhdGFFbmFibGVkKCkgJiYgKHN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBzdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zc2libGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBcG5UeXBlRW5hYmxlZChTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gaXNBcG5JZEVuYWJsZWQoYXBuVHlwZVRvSWQoYXBuVHlwZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0FwbklkRW5hYmxlZChpbnQgaWQpIHsKICAgICAgICAgaWYgKGlkICE9IEFQTl9JTlZBTElEX0lEKSB7CiAgICAgICAgICAgICByZXR1cm4gZGF0YUVuYWJsZWRbaWRdOwogICAgICAgICB9CkBAIC00NDQsMjIgKzUyOSwyMSBAQAogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChEQkcpIExvZy5kKExPR19UQUcsICJlbmFibGVBcG5UeXBlKCIrdHlwZSsiKSwgaXNBcG5UeXBlQWN0aXZlID0gIgotICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiBhbmQgc3RhdGUgPSAiICsgc3RhdGUpOworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiZW5hYmxlQXBuVHlwZSgiICsgdHlwZSArICIpLCBpc0FwblR5cGVBY3RpdmUgPSAiCisgICAgICAgICAgICAgICAgICAgICsgaXNBcG5UeXBlQWN0aXZlKHR5cGUpICsgIiwgaXNBcG5JZEVuYWJsZWQgPSIgKyBpc0FwbklkRW5hYmxlZChpZCkgKworICAgICAgICAgICAgICAgICAgICAiIGFuZCBzdGF0ZSA9ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIWlzQXBuVHlwZUF2YWlsYWJsZSh0eXBlKSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInR5cGUgbm90IGF2YWlsYWJsZSIpOwogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9UWVBFX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBqdXN0IGJlY2F1c2UgaXQncyBhY3RpdmUgZG9lc24ndCBtZWFuIHdlIGhhZCBpdCBleHBsaWNpdGx5IHJlcXVlc3RlZCBiZWZvcmUKLSAgICAgICAgLy8gKGEgYnJvYWQgZGVmYXVsdCBtYXkgaGFuZGxlIG1hbnkgdHlwZXMpLiAgbWFrZSBzdXJlIHdlIG1hcmsgaXQgZW5hYmxlZAotICAgICAgICAvLyBzbyBpZiB0aGUgZGVmYXVsdCBpcyBkaXNhYmxlZCB3ZSBrZWVwIHRoZSBjb25uZWN0aW9uIGZvciBvdGhlcnMKLSAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKGlzQXBuVHlwZUFjdGl2ZSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklOSVRJTkcpIHJldHVybiBQaG9uZS5BUE5fUkVRVUVTVF9TVEFSVEVEOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEKSByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUGhvbmUuQVBOX0FMUkVBRFlfQUNUSVZFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RW5hYmxlZChpZCwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX1NUQVJURUQ7CiAgICAgfQpAQCAtNDc4LDcgKzU2Miw3IEBACiAgICAgICAgIGlmIChpZCA9PSBBUE5fSU5WQUxJRF9JRCkgewogICAgICAgICAgICAgcmV0dXJuIFBob25lLkFQTl9SRVFVRVNUX0ZBSUxFRDsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNFbmFibGVkKGlkKSkgeworICAgICAgICBpZiAoaXNBcG5JZEVuYWJsZWQoaWQpKSB7CiAgICAgICAgICAgICBzZXRFbmFibGVkKGlkLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSkgewpAQCAtNDk1LDkgKzU3OSwxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkKGludCBpZCwgYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIiArCi0gICAgICAgICAgICAgICAgZGF0YUVuYWJsZWRbaWRdICsgIiBhbmQgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCk7Ci0KKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldEVuYWJsZWQoIiArIGlkICsgIiwgIiArIGVuYWJsZSArICIpIHdpdGggb2xkIHN0YXRlID0gIgorICAgICAgICAgICAgICAgICAgICArIGRhdGFFbmFibGVkW2lkXSArICIgYW5kIGVuYWJsZWRDb3VudCA9ICIgKyBlbmFibGVkQ291bnQpOworICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9FTkFCTEVfTkVXX0FQTik7CiAgICAgICAgIG1zZy5hcmcxID0gaWQ7CiAgICAgICAgIG1zZy5hcmcyID0gKGVuYWJsZSA/IEVOQUJMRUQgOiBESVNBQkxFRCk7CkBAIC01MDcsOSArNTkyLDggQEAKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgb25FbmFibGVBcG4oaW50IGFwbklkLCBpbnQgZW5hYmxlZCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiRVZFTlRfQVBOX0VOQUJMRV9SRVFVRVNUICIgKyBhcG5JZCArICIsICIgKyBlbmFibGVkKTsKLSAgICAgICAgICAgIExvZy5kKExPR19UQUcsICIgZGF0YUVuYWJsZWQgPSAiICsgZGF0YUVuYWJsZWRbYXBuSWRdICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZW5hYmxlZENvdW50ID0gIiArIGVuYWJsZWRDb3VudCArCi0gICAgICAgICAgICAgICAgICAgICIsIGlzQXBuVHlwZUFjdGl2ZSA9ICIgKyBpc0FwblR5cGVBY3RpdmUoYXBuSWRUb1R5cGUoYXBuSWQpKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAiIGRhdGFFbmFibGVkID0gIiArIGRhdGFFbmFibGVkW2FwbklkXSArICIsIGVuYWJsZWRDb3VudCA9ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlbmFibGVkQ291bnQgKyAiLCBpc0FwblR5cGVBY3RpdmUgPSAiICsgaXNBcG5UeXBlQWN0aXZlKGFwbklkVG9UeXBlKGFwbklkKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChlbmFibGVkID09IEVOQUJMRUQpIHsKICAgICAgICAgICAgIGlmICghZGF0YUVuYWJsZWRbYXBuSWRdKSB7CkBAIC01MjAsNiArNjA0LDggQEAKICAgICAgICAgICAgIGlmICghaXNBcG5UeXBlQWN0aXZlKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgbVJlcXVlc3RlZEFwblR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeUFwbklkVXBUb0N1cnJlbnQoUGhvbmUuUkVBU09OX0FQTl9TV0lUQ0hFRCwgYXBuSWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZGlzYWJsZQpAQCAtNTI4LDggKzYxNCwxNyBAQAogICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudC0tOwogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkQ291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFFbmFibGVkW0FQTl9ERUZBVUxUX0lEXSA9PSB0cnVlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhaXNBcG5UeXBlQWN0aXZlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgZGlzY29ubmVjdCBtc2cgbWFudWFsbHksIHNpbmNlIHRoZSBub3JtYWwgcm91dGUgd29udCBzZW5kCisgICAgICAgICAgICAgICAgLy8gaXQgKGl0J3Mgbm90IGVuYWJsZWQpCisgICAgICAgICAgICAgICAgbm90aWZ5QXBuSWREaXNjb25uZWN0ZWQoUGhvbmUuUkVBU09OX0RBVEFfRElTQUJMRUQsIGFwbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUVuYWJsZWRbQVBOX0RFRkFVTFRfSURdID09IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIHRoaXMgaXMgYW4gdWdseSB3YXkgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBjb25uIC0gc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgYSByZWFsIGNvbnRlbnRpb24gbWFuYWdlciBhbmQgcG9saWN5IHRoYXQgZGlzY29ubmVjdHMgdGhlIGxvd2VyIHByaQorICAgICAgICAgICAgICAgICAgICAvLyBzdHVmZiBhcyBlbmFibGUgcmVxdWVzdHMgY29tZSBpbiBhbmQgcG9wcyB0aGVtIGJhY2sgb24gYXMgd2UgZGlzYWJsZSBiYWNrCisgICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdG8gdGhlIGxvd2VyIHByaSBzdHVmZgogICAgICAgICAgICAgICAgICAgICBtUmVxdWVzdGVkQXBuVHlwZSA9IFBob25lLkFQTl9UWVBFX0RFRkFVTFQ7CiAgICAgICAgICAgICAgICAgICAgIG9uRW5hYmxlTmV3QXBuKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTc0LDkgKzY2OSwxMSBAQAogICAgICAgICAgICAgICAgIG9uVHJ5U2V0dXBEYXRhKFBob25lLlJFQVNPTl9EQVRBX0VOQUJMRUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvbkNsZWFuVXBDb25uZWN0aW9uKHRydWUsIFBob25lLlJFQVNPTl9EQVRBX0RJU0FCTEVEKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KKyAgICBwcm90ZWN0ZWQgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoRGF0YUNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRMaW5rUHJvcGVydGllcygpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EZWZhdWx0UGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggMDU3YmEwYS4uYmYzYzRkMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RlZmF1bHRQaG9uZU5vdGlmaWVyLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOwpAQCAtOTIsMjYgKzkzLDQyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oc2VuZGVyLCByZWFzb24sIGFwblR5cGUsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ob3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgLy8gdXNlIGFwblR5cGUgYXMgdGhlIGtleSB0byB3aGljaCBjb25uZWN0aW9uIHdlJ3JlIHRhbGtpbmcgYWJvdXQuCisgICAgICAgIC8vIHBhc3MgYXBuVHlwZSBiYWNrIHVwIHRvIGZldGNoIHBhcnRpY3VsYXIgZm9yIHRoaXMgb25lLgogICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueSA9IFRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG51bGw7CisgICAgICAgIGlmIChzdGF0ZSA9PSBQaG9uZS5EYXRhU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBsaW5rUHJvcGVydGllcyA9IHNlbmRlci5nZXRMaW5rUHJvcGVydGllcyhhcG5UeXBlKTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHNlbmRlci5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCkpLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RGF0YVN0YXRlKHN0YXRlKSwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKCksIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwbigpLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QWN0aXZlQXBuVHlwZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEludGVyZmFjZU5hbWUobnVsbCksCisgICAgICAgICAgICAgICAgICAgIGFwblR5cGUsCisgICAgICAgICAgICAgICAgICAgIGxpbmtQcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAoKHRlbGVwaG9ueSE9bnVsbCkgPyB0ZWxlcGhvbnkuZ2V0TmV0d29ya1R5cGUoKSA6Ci0gICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pLAotICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0R2F0ZXdheShudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19UWVBFX1VOS05PV04pKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uKTsKKyAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChyZWFzb24sIGFwblR5cGUpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIHN5c3RlbSBwcm9jZXNzIGlzIGRlYWQKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0LmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQppbmRleCA3ZWRmMDY1Li5lNDI4MjdmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIGNoYXJhY3RlciBzZXQgbWFwcGluZyBiZXR3ZWVuCiAgKiB0aGUgR1NNIFNNUyA3LWJpdCBhbHBoYWJldCBzcGVjaWZpZWQgaW4gVFMgMjMuMDM4IDYuMi4xCkBAIC0xNzEsNyArMTc0LDcgQEAKICAgICAgKiBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1IHNlcHRldHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdGV4dCBzdHJpbmcgdG8gZW5jb2RlLgotICAgICAqIEBwYXJhbSBoZWFkZXIgT3B0aW9uYWwgaGVhZGVyIChpbmNsdWRlaW5nIGxlbmd0aCBieXRlKSB0aGF0IHByZWNlZGVzCisgICAgICogQHBhcmFtIGhlYWRlciBPcHRpb25hbCBoZWFkZXIgKGluY2x1ZGluZyBsZW5ndGggYnl0ZSkgdGhhdCBwcmVjZWRlcwogICAgICAqIHRoZSBlbmNvZGVkIGRhdGEsIHBhZGRlZCB0byBzZXB0ZXQgYm91bmRhcnkuCiAgICAgICogQHJldHVybiBCeXRlIGFycmF5IGNvbnRhaW5pbmcgaGVhZGVyIGFuZCBlbmNvZGVkIGRhdGEuCiAgICAgICovCkBAIC0yMDQsNyArMjA3LDcgQEAKICAgICAgKiB0aGUgcGFja2VkIHNlcHRldHMuIFRoZSByZXR1cm5lZCBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1CiAgICAgICogc2VwdGV0cy4KICAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmRjb2RlCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGRhdGEgc3RyaW5nIHRvIGVuY29kZQogICAgICAqIEB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIGlmIFN0cmluZyBpcyB0b28gbGFyZ2UgdG8gZW5jb2RlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gc3RyaW5nVG9Hc203Qml0UGFja2VkKFN0cmluZyBkYXRhKQpAQCAtMjIzLDcgKzIyNiw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgdGV4dCB0byBjb252ZXJ0IHRvIHNlcHRldHMKICAgICAgKiBAcGFyYW0gc3RhcnRpbmdTZXB0ZXRPZmZzZXQgdGhlIG51bWJlciBvZiBwYWRkaW5nIHNlcHRldHMgdG8gcHV0IGJlZm9yZQotICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBhcnJheQorICAgICAqICB0aGUgY2hhcmFjdGVyIGRhdGEgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkKICAgICAgKiBAcGFyYW0gdGhyb3dFeGNlcHRpb24gSWYgdHJ1ZSwgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBvbiBpbnZhbGlkIGNoYXIuCiAgICAgICogICBJZiBmYWxzZSwgcmVwbGFjZXMgdW5lbmNvZGFibGUgY2hhciB3aXRoIEdTTSBhbHBoYWJldCBzcGFjZSBjaGFyLgogICAgICAqCkBAIC0yNTcsNyArMjYwLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3BpcmF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKKyAgICAgKiBQYWNrIGEgNy1iaXQgY2hhciBpbnRvIGl0cyBhcHByb3ByaWF0ZSBwbGFjZSBpbiBhIGJ5dGUgYXJyYXkKICAgICAgKgogICAgICAqIEBwYXJhbSBiaXRPZmZzZXQgdGhlIGJpdCBvZmZzZXQgdGhhdCB0aGUgc2VwdGV0IHNob3VsZCBiZSBwYWNrZWQgYXQKICAgICAgKiAgICAgICAgICAgICAgICAgIChzZXB0ZXQgaW5kZXggKiA3KQpAQCAtMzIwLDcgKzMyMyw3IEBACiAKICAgICAgICAgICAgICAgICBnc21WYWwgPSAoMHg3ZiAmIChwZHVbb2Zmc2V0ICsgYnl0ZU9mZnNldF0gPj4gc2hpZnQpKTsKIAotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGNyb3NzZXMgYSBieXRlIGJvdW5kcnkKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBjcm9zc2VzIGEgYnl0ZSBib3VuZGFyeQogICAgICAgICAgICAgICAgIGlmIChzaGlmdCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG1zYiBiaXRzIHRvIDAKICAgICAgICAgICAgICAgICAgICAgZ3NtVmFsICY9IDB4N2YgPj4gKHNoaWZ0IC0gMSk7CkBAIC0zNTUsNiArMzU4LDMyIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKICAgICBnc204Qml0VW5wYWNrZWRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgR1NNIGFscGhhYmV0IHN0cmluZyB0aGF0J3Mgc3RvcmVkIGluIDgtYml0IHVucGFja2VkCisgICAgICogZm9ybWF0IChhcyBpdCBvZnRlbiBhcHBlYXJzIGluIFNJTSByZWNvcmRzKSBpbnRvIGEgU3RyaW5nCisgICAgICoKKyAgICAgKiBGaWVsZCBtYXkgYmUgcGFkZGVkIHdpdGggdHJhaWxpbmcgMHhmZidzLiBUaGUgZGVjb2RlIHN0b3BzCisgICAgICogYXQgdGhlIGZpcnN0IDB4ZmYgZW5jb3VudGVyZWQuCisgICAgICoKKyAgICAgKiBBZGRpdGlvbmFsbHksIGluIHNvbWUgY291bnRyeShleC4gS29yZWEpLCB0aGVyZSBhcmUgbm9uLUFTQ0lJIG9yIE1CQ1MgY2hhcmFjdGVycy4KKyAgICAgKiBJZiBhIGNoYXJhY3RlciBzZXQgaXMgZ2l2ZW4sIGNoYXJhY3RlcnMgaW4gZGF0YSBhcmUgdHJlYXQgYXMgTUJDUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2hhcmFjdGVyc2V0KSB7CisgICAgICAgIGJvb2xlYW4gaXNNYmNzID0gZmFsc2U7CisgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IG51bGw7CisgICAgICAgIEJ5dGVCdWZmZXIgbWJjc0J1ZmZlciA9IG51bGw7CisKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjaGFyYWN0ZXJzZXQpCisgICAgICAgICAgICAgICAgJiYgIWNoYXJhY3RlcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1cy1hc2NpaSIpCisgICAgICAgICAgICAgICAgJiYgQ2hhcnNldC5pc1N1cHBvcnRlZChjaGFyYWN0ZXJzZXQpKSB7CisgICAgICAgICAgICBpc01iY3MgPSB0cnVlOworICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyYWN0ZXJzZXQpOworICAgICAgICAgICAgbWJjc0J1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMik7CisgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBwcmV2V2FzRXNjYXBlOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CiAKQEAgLTM4MCw3ICs0MDksMTUgQEAKICAgICAgICAgICAgICAgICBpZiAocHJldldhc0VzY2FwZSkgewogICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKWdzbUV4dGVuZGVkVG9DaGFyLmdldChjLCAnICcpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKChjaGFyKWdzbVRvQ2hhci5nZXQoYywgJyAnKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNNYmNzIHx8IGMgPCAweDgwIHx8IGkgKyAxID49IG9mZnNldCArIGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcilnc21Ub0NoYXIuZ2V0KGMsICcgJykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNNYmNzIG11c3QgYmUgdHJ1ZS4gU28gYm90aCBtYmNzQnVmZmVyIGFuZCBjaGFyc2V0IGFyZSBpbml0aWFsaXplZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1iY3NCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iY3NCdWZmZXIucHV0KGRhdGEsIGkrKywgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBtYmNzQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoY2hhcnNldC5kZWNvZGUobWJjc0J1ZmZlcikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcHJldldhc0VzY2FwZSA9IGZhbHNlOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKaW5kZXggMjMyODcxNy4uN2ExNTg3YiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCkBAIC0yMzksOSArMjM5LDExIEBACiAgICAgU3RyaW5nIGdldENkbWFFcmlUZXh0KCk7CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgQ0RNQSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgc2VydmljZSBwcm92aXNpb25pbmcgbmVlZHMgdG8gcnVuLgorICAgICAqIE9ubHkgcmVsZXZhbnQgb24gc29tZSB0ZWNobm9sb2dpZXMsIG90aGVycyB3aWxsIGFsd2F5cworICAgICAqIHJldHVybiBmYWxzZS4KICAgICAgKi8KLSAgICBib29sZWFuIGdldENkbWFOZWVkc1Byb3Zpc2lvbmluZygpOworICAgIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCk7CiAKICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdW5yZWFkIGNvdW50IG9mIHZvaWNlbWFpbHMKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbCBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255UmVnaXN0cnkuYWlkbAppbmRleCA4N2U0YjUyLi5lYjdlNTY2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueVJlZ2lzdHJ5LmFpZGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnlSZWdpc3RyeS5haWRsCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoOwpAQCAtMzIsOCArMzMsOCBAQAogICAgIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKGJvb2xlYW4gY2ZpKTsKICAgICB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShpbnQgc3RhdGUpOwogICAgIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oaW50IHN0YXRlLCBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlLAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwbiwgaW4gU3RyaW5nW10gYXBuVHlwZXMsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBpbnQgbmV0d29ya1R5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZ2F0ZXdheSk7Ci0gICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uKTsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG4sIFN0cmluZyBhcG5UeXBlLCBpbiBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgIGludCBuZXR3b3JrVHlwZSk7CisgICAgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAgICAgdm9pZCBub3RpZnlDZWxsTG9jYXRpb24oaW4gQnVuZGxlIGNlbGxMb2NhdGlvbik7CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCmluZGV4IDk1N2VkZGQuLmRmNTc5YjAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCkBAIC0xNiwxMyArMTYsMTYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5Ob3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7Ci0KIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogVmFyaW91cyBtZXRob2RzLCB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aCBTSU0gZGF0YS4KQEAgLTE1MCw2ICsxNTMsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYWRuU3RyaW5nRmllbGRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQogICAgICAgICBpZiAobGVuZ3RoID49IDEpIHsKICAgICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gPT0gKGJ5dGUpIDB4ODApIHsKICAgICAgICAgICAgICAgICBpbnQgdWNzbGVuID0gKGxlbmd0aCAtIDEpIC8gMjsKQEAgLTIyNSw3ICsyMzEsMTUgQEAKICAgICAgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIFJlc291cmNlcyByZXNvdXJjZSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWZhdWx0Q2hhcnNldCA9CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5nc21fYWxwaGFiZXRfZGVmYXVsdF9jaGFyc2V0KTsKKyAgICAgICAgfSBjYXRjaCAoTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlIEV4Y2VwdGlvbiBhbmQgZGVmYXVsdENoYXJzZXQgaXMgc2V0IHRvIGEgZW1wdHkgc3RyaW5nLgorICAgICAgICB9CisgICAgICAgIHJldHVybiBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyhkYXRhLCBvZmZzZXQsIGxlbmd0aCwgZGVmYXVsdENoYXJzZXQudHJpbSgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgaW50CkBAIC0yNjcsOSArMjgxLDExIEBACiAKIAogICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgYnl0ZSBhcnJheSBpbnRvIGEgU3RyaW5nIGhleGlkZWNpbWFsIGNoYXJhY3RlcnMKKyAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzLgogICAgICAqCi0gICAgICogbnVsbCByZXR1cm5zIG51bGwKKyAgICAgKiBAcGFyYW0gYnl0ZXMgYW4gYXJyYXkgb2YgYnl0ZXMKKyAgICAgKgorICAgICAqIEByZXR1cm4gaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBieXRlcyBhcnJheQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nCiAgICAgYnl0ZXNUb0hleFN0cmluZyhieXRlW10gYnl0ZXMpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKaW5kZXggYjczYzJmNy4uOWIwYWEzYyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlLmphdmEKQEAgLTIzLDM0NiArMjMsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhlIHRhYmxlIGJlbG93IGlzIGJ1aWx0IGZyb20gdHdvIHJlc291cmNlczoKLSAqCi0gKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCi0gKiAgIGlkZW50aWZpY2F0aW9uIHBsYW4gZm9yIG1vYmlsZSB0ZXJtaW5hbHMgYW5kIG1vYmlsZSB1c2VycyIKLSAqICAgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIGFuIGFubmV4IHRvIHRoZSBJVFUgb3BlcmF0aW9uYWwgYnVsbGV0aW4KLSAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCi0gKgotICogMikgVGhlIElTTyAzMTY2IGNvdW50cnkgY29kZXMgbGlzdCwgYXZhaWxhYmxlIGhlcmU6Ci0gKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAotICoKLSAqIFRoaXMgdGFibGUgd2FzIHZlcmlmaWVkICgyOCBBdWcgMjAwOSkgYWdhaW5zdAotICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX21vYmlsZV9jb3VudHJ5X2NvZGVzIHdpdGggdGhlCi0gKiBvbmx5IHVucmVzb2x2ZWQgZGlzY3JlcGFuY3kgYmVpbmcgdGhhdCB0aGlzIGxpc3QgaGFzIGFuIGV4dHJhIGVudHJ5Ci0gKiAoNDYxKSBmb3IgQ2hpbmEuCi0gKgotICogVE9ETzogQ29tcGxldGUgdGhlIG1hcHBpbmdzIGZvciB0aW1lem9uZXMgYW5kIGxhbmd1YWdlL2xvY2FsZSBjb2Rlcy4KLSAqCi0gKiBUaGUgYWN0dWFsIHRhYmxlIGRhdGEgdXNlZCBpbiB0aGUgSmF2YSBjb2RlIGlzIGdlbmVyYXRlZCBmcm9tIHRoZQotICogYmVsb3cgUHl0aG9uIGNvZGUgZm9yIGVmZmljaWVuY3kuICBUaGUgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQgdG8KLSAqIGJlIHN0YXRpYywgYnV0IGlmIGNoYW5nZXMgYXJlIHJlcXVpcmVkLCB0aGUgdGFibGUgaW4gdGhlIHB5dGhvbgotICogY29kZSBjYW4gYmUgbW9kaWZpZWQgYW5kIHRoZSB0cmFpbGluZyBjb2RlIHJ1biB0byByZS1nZW5lcmF0ZSB0aGUKLSAqIHRhYmxlcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IEphdmEuCi0KLW1jY190YWJsZSA9IFsKLSAgKDIwMiwgJ2dyJywgMiwgJ0dyZWVjZScpLAotICAoMjA0LCAnbmwnLCAyLCAnRXVyb3BlL0Ftc3RlcmRhbScsICdubCcsIDEzLCAnTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKScpLAotICAoMjA2LCAnYmUnLCAyLCAnQmVsZ2l1bScpLAotICAoMjA4LCAnZnInLCAyLCAnRXVyb3BlL1BhcmlzJywgJ2ZyJywgJ0ZyYW5jZScpLAotICAoMjEyLCAnbWMnLCAyLCAnTW9uYWNvIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTMsICdhZCcsIDIsICdBbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpJyksCi0gICgyMTQsICdlcycsIDIsICdFdXJvcGUvTWFkcmlkJywgJ2VzJywgJ1NwYWluJyksCi0gICgyMTYsICdodScsIDIsICdIdW5nYXJ5IChSZXB1YmxpYyBvZiknKSwKLSAgKDIxOCwgJ2JhJywgMiwgJ0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEnKSwKLSAgKDIxOSwgJ2hyJywgMiwgJ0Nyb2F0aWEgKFJlcHVibGljIG9mKScpLAotICAoMjIwLCAncnMnLCAyLCAnU2VyYmlhIGFuZCBNb250ZW5lZ3JvJyksCi0gICgyMjIsICdpdCcsIDIsICdFdXJvcGUvUm9tZScsICdpdCcsICdJdGFseScpLAotICAoMjI1LCAndmEnLCAyLCAnRXVyb3BlL1JvbWUnLCAnaXQnLCAnVmF0aWNhbiBDaXR5IFN0YXRlJyksCi0gICgyMjYsICdybycsIDIsICdSb21hbmlhJyksCi0gICgyMjgsICdjaCcsIDIsICdFdXJvcGUvWnVyaWNoJywgJ2RlJywgJ1N3aXR6ZXJsYW5kIChDb25mZWRlcmF0aW9uIG9mKScpLAotICAoMjMwLCAnY3onLCAyLCAnRXVyb3BlL1ByYWd1ZScsICdjcycsIDEzLCAnQ3plY2ggUmVwdWJsaWMnKSwKLSAgKDIzMSwgJ3NrJywgMiwgJ1Nsb3ZhayBSZXB1YmxpYycpLAotICAoMjMyLCAnYXQnLCAyLCAnRXVyb3BlL1ZpZW5uYScsICdkZScsIDEzLCAnQXVzdHJpYScpLAotICAoMjM0LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM1LCAnZ2InLCAyLCAnRXVyb3BlL0xvbmRvbicsICdlbicsIDEzLCAnVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZCcpLAotICAoMjM4LCAnZGsnLCAyLCAnRGVubWFyaycpLAotICAoMjQwLCAnc2UnLCAyLCAnU3dlZGVuJyksCi0gICgyNDIsICdubycsIDIsICdOb3J3YXknKSwKLSAgKDI0NCwgJ2ZpJywgMiwgJ0ZpbmxhbmQnKSwKLSAgKDI0NiwgJ2x0JywgMiwgJ0xpdGh1YW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNDcsICdsdicsIDIsICdMYXR2aWEgKFJlcHVibGljIG9mKScpLAotICAoMjQ4LCAnZWUnLCAyLCAnRXN0b25pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNTAsICdydScsIDIsICdSdXNzaWFuIEZlZGVyYXRpb24nKSwKLSAgKDI1NSwgJ3VhJywgMiwgJ1VrcmFpbmUnKSwKLSAgKDI1NywgJ2J5JywgMiwgJ0JlbGFydXMgKFJlcHVibGljIG9mKScpLAotICAoMjU5LCAnbWQnLCAyLCAnTW9sZG92YSAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjAsICdwbCcsIDIsICdFdXJvcGUvV2Fyc2F3JywgJ1BvbGFuZCAoUmVwdWJsaWMgb2YpJyksCi0gICgyNjIsICdkZScsIDIsICdFdXJvcGUvQmVybGluJywgJ2RlJywgMTMsICdHZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoMjY2LCAnZ2knLCAyLCAnR2licmFsdGFyJyksCi0gICgyNjgsICdwdCcsIDIsICdQb3J0dWdhbCcpLAotICAoMjcwLCAnbHUnLCAyLCAnTHV4ZW1ib3VyZycpLAotICAoMjcyLCAnaWUnLCAyLCAnRXVyb3BlL0R1YmxpbicsICdlbicsICdJcmVsYW5kJyksCi0gICgyNzQsICdpcycsIDIsICdJY2VsYW5kJyksCi0gICgyNzYsICdhbCcsIDIsICdBbGJhbmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDI3OCwgJ210JywgMiwgJ01hbHRhJyksCi0gICgyODAsICdjeScsIDIsICdDeXBydXMgKFJlcHVibGljIG9mKScpLAotICAoMjgyLCAnZ2UnLCAyLCAnR2VvcmdpYScpLAotICAoMjgzLCAnYW0nLCAyLCAnQXJtZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODQsICdiZycsIDIsICdCdWxnYXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyODYsICd0cicsIDIsICdUdXJrZXknKSwKLSAgKDI4OCwgJ2ZvJywgMiwgJ0Zhcm9lIElzbGFuZHMnKSwKLSAgKDI4OSwgJ2dlJywgMiwgJ0Fia2hhemlhIChHZW9yZ2lhKScpLAotICAoMjkwLCAnZ2wnLCAyLCAnR3JlZW5sYW5kIChEZW5tYXJrKScpLAotICAoMjkyLCAnc20nLCAyLCAnU2FuIE1hcmlubyAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTMsICdzbCcsIDIsICdTbG92ZW5pYSAoUmVwdWJsaWMgb2YpJyksCi0gICgyOTQsICdtaycsIDIsICdUaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYScpLAotICAoMjk1LCAnbGknLCAyLCAnTGllY2h0ZW5zdGVpbiAoUHJpbmNpcGFsaXR5IG9mKScpLAotICAoMjk3LCAnbWUnLCAyLCAnTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpJyksCi0gICgzMDIsICdjYScsIDMsICcnLCAnJywgMTEsICdDYW5hZGEnKSwKLSAgKDMwOCwgJ3BtJywgMiwgJ1NhaW50IFBpZXJyZSBhbmQgTWlxdWVsb24gKENvbGxlY3Rpdml0IHRlcnJpdG9yaWFsZSBkZSBsYSBScHVibGlxdWUgZnJhbmFpc2UpJyksCi0gICgzMTAsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzExLCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxMiwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTMsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzE0LCAndXMnLCAzLCAnJywgJ2VuJywgMTEsICdVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EnKSwKLSAgKDMxNSwgJ3VzJywgMywgJycsICdlbicsIDExLCAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJyksCi0gICgzMTYsICd1cycsIDMsICcnLCAnZW4nLCAxMSwgJ1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYScpLAotICAoMzMwLCAncHInLCAyLCAnUHVlcnRvIFJpY28nKSwKLSAgKDMzMiwgJ3ZpJywgMiwgJ1VuaXRlZCBTdGF0ZXMgVmlyZ2luIElzbGFuZHMnKSwKLSAgKDMzNCwgJ214JywgMywgJ01leGljbycpLAotICAoMzM4LCAnam0nLCAzLCAnSmFtYWljYScpLAotICAoMzQwLCAnZ3AnLCAyLCAnR3VhZGVsb3VwZSAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICgzNDIsICdiYicsIDMsICdCYXJiYWRvcycpLAotICAoMzQ0LCAnYWcnLCAzLCAnQW50aWd1YSBhbmQgQmFyYnVkYScpLAotICAoMzQ2LCAna3knLCAzLCAnQ2F5bWFuIElzbGFuZHMnKSwKLSAgKDM0OCwgJ3ZnJywgMywgJ0JyaXRpc2ggVmlyZ2luIElzbGFuZHMnKSwKLSAgKDM1MCwgJ2JtJywgMiwgJ0Jlcm11ZGEnKSwKLSAgKDM1MiwgJ2dkJywgMiwgJ0dyZW5hZGEnKSwKLSAgKDM1NCwgJ21zJywgMiwgJ01vbnRzZXJyYXQnKSwKLSAgKDM1NiwgJ2tuJywgMiwgJ1NhaW50IEtpdHRzIGFuZCBOZXZpcycpLAotICAoMzU4LCAnbGMnLCAyLCAnU2FpbnQgTHVjaWEnKSwKLSAgKDM2MCwgJ3ZjJywgMiwgJ1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzJyksCi0gICgzNjIsICdubCcsIDIsICdOZXRoZXJsYW5kcyBBbnRpbGxlcycpLAotICAoMzYzLCAnYXcnLCAyLCAnQXJ1YmEnKSwKLSAgKDM2NCwgJ2JzJywgMiwgJ0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICgzNjUsICdhaScsIDMsICdBbmd1aWxsYScpLAotICAoMzY2LCAnZG0nLCAyLCAnRG9taW5pY2EgKENvbW1vbndlYWx0aCBvZiknKSwKLSAgKDM2OCwgJ2N1JywgMiwgJ0N1YmEnKSwKLSAgKDM3MCwgJ2RvJywgMiwgJ0RvbWluaWNhbiBSZXB1YmxpYycpLAotICAoMzcyLCAnaHQnLCAyLCAnSGFpdGkgKFJlcHVibGljIG9mKScpLAotICAoMzc0LCAndHQnLCAyLCAnVHJpbmlkYWQgYW5kIFRvYmFnbycpLAotICAoMzc2LCAndGMnLCAyLCAnVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzJyksCi0gICg0MDAsICdheicsIDIsICdBemVyYmFpamFuaSBSZXB1YmxpYycpLAotICAoNDAxLCAna3onLCAyLCAnS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDIsICdidCcsIDIsICdCaHV0YW4gKEtpbmdkb20gb2YpJyksCi0gICg0MDQsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MDUsICdpbicsIDIsICdJbmRpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg0MTAsICdwaycsIDIsICdQYWtpc3RhbiAoSXNsYW1pYyBSZXB1YmxpYyBvZiknKSwKLSAgKDQxMiwgJ2FmJywgMiwgJ0FmZ2hhbmlzdGFuJyksCi0gICg0MTMsICdsaycsIDIsICdTcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKScpLAotICAoNDE0LCAnbW0nLCAyLCAnTXlhbm1hciAoVW5pb24gb2YpJyksCi0gICg0MTUsICdsYicsIDIsICdMZWJhbm9uJyksCi0gICg0MTYsICdqbycsIDIsICdKb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKScpLAotICAoNDE3LCAnc3knLCAyLCAnU3lyaWFuIEFyYWIgUmVwdWJsaWMnKSwKLSAgKDQxOCwgJ2lxJywgMiwgJ0lyYXEgKFJlcHVibGljIG9mKScpLAotICAoNDE5LCAna3cnLCAyLCAnS3V3YWl0IChTdGF0ZSBvZiknKSwKLSAgKDQyMCwgJ3NhJywgMiwgJ1NhdWRpIEFyYWJpYSAoS2luZ2RvbSBvZiknKSwKLSAgKDQyMSwgJ3llJywgMiwgJ1llbWVuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQyMiwgJ29tJywgMiwgJ09tYW4gKFN1bHRhbmF0ZSBvZiknKSwKLSAgKDQyMywgJ3BzJywgMiwgJ1BhbGVzdGluZScpLAotICAoNDI0LCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQyNSwgJ2lsJywgMiwgJ0lzcmFlbCAoU3RhdGUgb2YpJyksCi0gICg0MjYsICdiaCcsIDIsICdCYWhyYWluIChLaW5nZG9tIG9mKScpLAotICAoNDI3LCAncWEnLCAyLCAnUWF0YXIgKFN0YXRlIG9mKScpLAotICAoNDI4LCAnbW4nLCAyLCAnTW9uZ29saWEnKSwKLSAgKDQyOSwgJ25wJywgMiwgJ05lcGFsJyksCi0gICg0MzAsICdhZScsIDIsICdVbml0ZWQgQXJhYiBFbWlyYXRlcycpLAotICAoNDMxLCAnYWUnLCAyLCAnVW5pdGVkIEFyYWIgRW1pcmF0ZXMnKSwKLSAgKDQzMiwgJ2lyJywgMiwgJ0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJyksCi0gICg0MzQsICd1eicsIDIsICdVemJla2lzdGFuIChSZXB1YmxpYyBvZiknKSwKLSAgKDQzNiwgJ3RqJywgMiwgJ1RhamlraXN0YW4gKFJlcHVibGljIG9mKScpLAotICAoNDM3LCAna2cnLCAyLCAnS3lyZ3l6IFJlcHVibGljJyksCi0gICg0MzgsICd0bScsIDIsICdUdXJrbWVuaXN0YW4nKSwKLSAgKDQ0MCwgJ2pwJywgMiwgJ0FzaWEvVG9reW8nLCAnamEnLCAxNCwgJ0phcGFuJyksCi0gICg0NDEsICdqcCcsIDIsICdBc2lhL1Rva3lvJywgJ2phJywgMTQsICdKYXBhbicpLAotICAoNDUwLCAna3InLCAyLCAnS29yZWEgKFJlcHVibGljIG9mKScpLAotICAoNDUyLCAndm4nLCAyLCAnVmlldCBOYW0gKFNvY2lhbGlzdCBSZXB1YmxpYyBvZiknKSwKLSAgKDQ1NCwgJ2hrJywgMiwgJyJIb25nIEtvbmcsIENoaW5hIicpLAotICAoNDU1LCAnbW8nLCAyLCAnIk1hY2FvLCBDaGluYSInKSwKLSAgKDQ1NiwgJ2toJywgMiwgJ0NhbWJvZGlhIChLaW5nZG9tIG9mKScpLAotICAoNDU3LCAnbGEnLCAyLCAiTGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWMiKSwKLSAgKDQ2MCwgJ2NuJywgMiwgIkFzaWEvQmVpamluZyIsICd6aCcsIDEzLCAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSIpLAotICAoNDYxLCAnY24nLCAyLCAiQXNpYS9CZWlqaW5nIiwgJ3poJywgMTMsICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NjYsICd0dycsIDIsICJUYWl3YW4gKFJlcHVibGljIG9mIENoaW5hKSIpLAotICAoNDY3LCAna3AnLCAyLCAiRGVtb2NyYXRpYyBQZW9wbGUncyBSZXB1YmxpYyBvZiBLb3JlYSIpLAotICAoNDcwLCAnYmQnLCAyLCAiQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIiksCi0gICg0NzIsICdtdicsIDIsICdNYWxkaXZlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg1MDIsICdteScsIDIsICdNYWxheXNpYScpLAotICAoNTA1LCAnYXUnLCAyLCAnQXVzdHJhbGlhL1N5ZG5leScsICdlbicsIDExLCAnQXVzdHJhbGlhJyksCi0gICg1MTAsICdpZCcsIDIsICdJbmRvbmVzaWEgKFJlcHVibGljIG9mKScpLAotICAoNTE0LCAndGwnLCAyLCAnRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZScpLAotICAoNTE1LCAncGgnLCAyLCAnUGhpbGlwcGluZXMgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDUyMCwgJ3RoJywgMiwgJ1RoYWlsYW5kJyksCi0gICg1MjUsICdzZycsIDIsICdBc2lhL1NpbmdhcG9yZScsICdlbicsIDExLCAnU2luZ2Fwb3JlIChSZXB1YmxpYyBvZiknKSwKLSAgKDUyOCwgJ2JuJywgMiwgJ0JydW5laSBEYXJ1c3NhbGFtJyksCi0gICg1MzAsICdueicsIDIsICdQYWNpZmljL0F1Y2tsYW5kJywgJ2VuJywgJ05ldyBaZWFsYW5kJyksCi0gICg1MzQsICdtcCcsIDIsICdOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMgKENvbW1vbndlYWx0aCBvZiB0aGUpJyksCi0gICg1MzUsICdndScsIDIsICdHdWFtJyksCi0gICg1MzYsICducicsIDIsICdOYXVydSAoUmVwdWJsaWMgb2YpJyksCi0gICg1MzcsICdwZycsIDIsICdQYXB1YSBOZXcgR3VpbmVhJyksCi0gICg1MzksICd0bycsIDIsICdUb25nYSAoS2luZ2RvbSBvZiknKSwKLSAgKDU0MCwgJ3NiJywgMiwgJ1NvbG9tb24gSXNsYW5kcycpLAotICAoNTQxLCAndnUnLCAyLCAnVmFudWF0dSAoUmVwdWJsaWMgb2YpJyksCi0gICg1NDIsICdmaicsIDIsICdGaWppIChSZXB1YmxpYyBvZiknKSwKLSAgKDU0MywgJ3dmJywgMiwgIldhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpIiksCi0gICg1NDQsICdhcycsIDIsICdBbWVyaWNhbiBTYW1vYScpLAotICAoNTQ1LCAna2knLCAyLCAnS2lyaWJhdGkgKFJlcHVibGljIG9mKScpLAotICAoNTQ2LCAnbmMnLCAyLCAiTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ3LCAncGYnLCAyLCAiRnJlbmNoIFBvbHluZXNpYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKSIpLAotICAoNTQ4LCAnY2snLCAyLCAnQ29vayBJc2xhbmRzJyksCi0gICg1NDksICd3cycsIDIsICdTYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpJyksCi0gICg1NTAsICdmbScsIDIsICdNaWNyb25lc2lhIChGZWRlcmF0ZWQgU3RhdGVzIG9mKScpLAotICAoNTUxLCAnbWgnLCAyLCAnTWFyc2hhbGwgSXNsYW5kcyAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNTUyLCAncHcnLCAyLCAnUGFsYXUgKFJlcHVibGljIG9mKScpLAotICAoNjAyLCAnZWcnLCAyLCAnRWd5cHQgKEFyYWIgUmVwdWJsaWMgb2YpJyksCi0gICg2MDMsICdkeicsIDIsICJBbGdlcmlhIChQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIG9mKSIpLAotICAoNjA0LCAnbWEnLCAyLCAnTW9yb2NjbyAoS2luZ2RvbSBvZiknKSwKLSAgKDYwNSwgJ3RuJywgMiwgJ1R1bmlzaWEnKSwKLSAgKDYwNiwgJ2x5JywgMiwgIkxpYnlhIChTb2NpYWxpc3QgUGVvcGxlJ3MgTGlieWFuIEFyYWIgSmFtYWhpcml5YSkiKSwKLSAgKDYwNywgJ2dtJywgMiwgJ0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjA4LCAnc24nLCAyLCAnU2VuZWdhbCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MDksICdtcicsIDIsICdNYXVyaXRhbmlhIChJc2xhbWljIFJlcHVibGljIG9mKScpLAotICAoNjEwLCAnbWwnLCAyLCAnTWFsaSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTEsICdnbicsIDIsICdHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjEyLCAnY2knLCAyLCAiQ3RlIGQnSXZvaXJlIChSZXB1YmxpYyBvZikiKSwKLSAgKDYxMywgJ2JmJywgMiwgJ0J1cmtpbmEgRmFzbycpLAotICAoNjE0LCAnbmUnLCAyLCAnTmlnZXIgKFJlcHVibGljIG9mIHRoZSknKSwKLSAgKDYxNSwgJ3RnJywgMiwgJ1RvZ29sZXNlIFJlcHVibGljJyksCi0gICg2MTYsICdiaicsIDIsICdCZW5pbiAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTcsICdtdScsIDIsICdNYXVyaXRpdXMgKFJlcHVibGljIG9mKScpLAotICAoNjE4LCAnbHInLCAyLCAnTGliZXJpYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2MTksICdzbCcsIDIsICdTaWVycmEgTGVvbmUnKSwKLSAgKDYyMCwgJ2doJywgMiwgJ0doYW5hJyksCi0gICg2MjEsICduZycsIDIsICdOaWdlcmlhIChGZWRlcmFsIFJlcHVibGljIG9mKScpLAotICAoNjIyLCAndGQnLCAyLCAnQ2hhZCAoUmVwdWJsaWMgb2YpJyksCi0gICg2MjMsICdjZicsIDIsICdDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMnKSwKLSAgKDYyNCwgJ2NtJywgMiwgJ0NhbWVyb29uIChSZXB1YmxpYyBvZiknKSwKLSAgKDYyNSwgJ2N2JywgMiwgJ0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKScpLAotICAoNjI2LCAnc3QnLCAyLCAnU2FvIFRvbWUgYW5kIFByaW5jaXBlIChEZW1vY3JhdGljIFJlcHVibGljIG9mKScpLAotICAoNjI3LCAnZ3EnLCAyLCAnRXF1YXRvcmlhbCBHdWluZWEgKFJlcHVibGljIG9mKScpLAotICAoNjI4LCAnZ2EnLCAyLCAnR2Fib25lc2UgUmVwdWJsaWMnKSwKLSAgKDYyOSwgJ2NnJywgMiwgJ0NvbmdvIChSZXB1YmxpYyBvZiB0aGUpJyksCi0gICg2MzAsICdjZycsIDIsICdEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbycpLAotICAoNjMxLCAnYW8nLCAyLCAnQW5nb2xhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzMiwgJ2d3JywgMiwgJ0d1aW5lYS1CaXNzYXUgKFJlcHVibGljIG9mKScpLAotICAoNjMzLCAnc2MnLCAyLCAnU2V5Y2hlbGxlcyAoUmVwdWJsaWMgb2YpJyksCi0gICg2MzQsICdzZCcsIDIsICdTdWRhbiAoUmVwdWJsaWMgb2YgdGhlKScpLAotICAoNjM1LCAncncnLCAyLCAnUndhbmRhIChSZXB1YmxpYyBvZiknKSwKLSAgKDYzNiwgJ2V0JywgMiwgJ0V0aGlvcGlhIChGZWRlcmFsIERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpJyksCi0gICg2MzcsICdzbycsIDIsICdTb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYycpLAotICAoNjM4LCAnZGonLCAyLCAnRGppYm91dGkgKFJlcHVibGljIG9mKScpLAotICAoNjM5LCAna2UnLCAyLCAnS2VueWEgKFJlcHVibGljIG9mKScpLAotICAoNjQwLCAndHonLCAyLCAnVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZiknKSwKLSAgKDY0MSwgJ3VnJywgMiwgJ1VnYW5kYSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDIsICdiaScsIDIsICdCdXJ1bmRpIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0MywgJ216JywgMiwgJ01vemFtYmlxdWUgKFJlcHVibGljIG9mKScpLAotICAoNjQ1LCAnem0nLCAyLCAnWmFtYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY0NiwgJ21nJywgMiwgJ01hZGFnYXNjYXIgKFJlcHVibGljIG9mKScpLAotICAoNjQ3LCAncmUnLCAyLCAnUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpJyksCi0gICg2NDgsICd6dycsIDIsICdaaW1iYWJ3ZSAoUmVwdWJsaWMgb2YpJyksCi0gICg2NDksICduYScsIDIsICdOYW1pYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MCwgJ213JywgMiwgJ01hbGF3aScpLAotICAoNjUxLCAnbHMnLCAyLCAnTGVzb3RobyAoS2luZ2RvbSBvZiknKSwKLSAgKDY1MiwgJ2J3JywgMiwgJ0JvdHN3YW5hIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1MywgJ3N6JywgMiwgJ1N3YXppbGFuZCAoS2luZ2RvbSBvZiknKSwKLSAgKDY1NCwgJ2ttJywgMiwgJ0NvbW9yb3MgKFVuaW9uIG9mIHRoZSknKSwKLSAgKDY1NSwgJ3phJywgMiwgJ0FmcmljYS9Kb2hhbm5lc2J1cmcnLCAnZW4nLCAnU291dGggQWZyaWNhIChSZXB1YmxpYyBvZiknKSwKLSAgKDY1NywgJ2VyJywgMiwgJ0VyaXRyZWEnKSwKLSAgKDcwMiwgJ2J6JywgMiwgJ0JlbGl6ZScpLAotICAoNzA0LCAnZ3QnLCAyLCAnR3VhdGVtYWxhIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwNiwgJ3N2JywgMiwgJ0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZiknKSwKLSAgKDcwOCwgJ2huJywgMywgJ0hvbmR1cmFzIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxMCwgJ25pJywgMiwgJ05pY2FyYWd1YScpLAotICAoNzEyLCAnY3InLCAyLCAnQ29zdGEgUmljYScpLAotICAoNzE0LCAncGEnLCAyLCAnUGFuYW1hIChSZXB1YmxpYyBvZiknKSwKLSAgKDcxNiwgJ3BlJywgMiwgJ1BlcnUnKSwKLSAgKDcyMiwgJ2FyJywgMywgJ0FyZ2VudGluZSBSZXB1YmxpYycpLAotICAoNzI0LCAnYnInLCAyLCAnQnJhemlsIChGZWRlcmF0aXZlIFJlcHVibGljIG9mKScpLAotICAoNzMwLCAnY2wnLCAyLCAnQ2hpbGUnKSwKLSAgKDczMiwgJ2NvJywgMywgJ0NvbG9tYmlhIChSZXB1YmxpYyBvZiknKSwKLSAgKDczNCwgJ3ZlJywgMiwgJ1ZlbmV6dWVsYSAoQm9saXZhcmlhbiBSZXB1YmxpYyBvZiknKSwKLSAgKDczNiwgJ2JvJywgMiwgJ0JvbGl2aWEgKFJlcHVibGljIG9mKScpLAotICAoNzM4LCAnZ3knLCAyLCAnR3V5YW5hJyksCi0gICg3NDAsICdlYycsIDIsICdFY3VhZG9yJyksCi0gICg3NDIsICdnZicsIDIsICdGcmVuY2ggR3VpYW5hIChGcmVuY2ggRGVwYXJ0bWVudCBvZiknKSwKLSAgKDc0NCwgJ3B5JywgMiwgJ1BhcmFndWF5IChSZXB1YmxpYyBvZiknKSwKLSAgKDc0NiwgJ3NyJywgMiwgJ1N1cmluYW1lIChSZXB1YmxpYyBvZiknKSwKLSAgKDc0OCwgJ3V5JywgMiwgJ1VydWd1YXkgKEVhc3Rlcm4gUmVwdWJsaWMgb2YpJyksCi0gICg3NTAsICdmaycsIDIsICdGYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcyknKV0KLQotZ2V0X21jYyA9IGxhbWJkYSBlbHQ6IGVsdFswXQotZ2V0X2lzbyA9IGxhbWJkYSBlbHQ6IGVsdFsxXQotZ2V0X3NkID0gbGFtYmRhIGVsdDogZWx0WzJdCi1nZXRfdHogPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDQgYW5kIGVsdFszXSBvciAnJwotZ2V0X2xhbmcgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDUgYW5kIGVsdFs0XSBvciAnJwotZ2V0X3dpZmkgPSBsYW1iZGEgZWx0OiBsZW4oZWx0KSA+IDYgYW5kIGVsdFs1XSBvciAwCi0KLW1jY19jb2RlcyA9IFsnMHglMDR4JyAlIGdldF9tY2MoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLXR6X3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfdHooZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZSkpCi1sYW5nX3NldCA9IHNvcnRlZCh4IGZvciB4IGluIHNldChnZXRfbGFuZyhlbHQpIGZvciBlbHQgaW4gbWNjX3RhYmxlKSkKLQotZGVmIG1rX2luZF9jb2RlKGVsdCk6Ci0gIGlzbyA9IGdldF9pc28oZWx0KQotICBpc29fY29kZSA9ICgob3JkKGlzb1swXSkgPDwgOCkgfCBvcmQoaXNvWzFdKSkgJiAweEZGRkYgIyAxNiBiaXRzCi0gIHdpZmkgPSBnZXRfd2lmaShlbHQpICYgMHgwMDBGICAgICAgICAgICAgICAgICAgICAgICAgICAjICA0IGJpdHMKLSAgc2QgPSBnZXRfc2QoZWx0KSAmIDB4MDAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIDIgYml0cwotICB0el9pbmQgPSB0el9zZXQuaW5kZXgoZ2V0X3R6KGVsdCkpICYgMHgwMDFGICAgICAgICAgICAgIyAgNSBiaXRzCi0gIGxhbmdfaW5kID0gbGFuZ19zZXQuaW5kZXgoZ2V0X2xhbmcoZWx0KSkgJiAweDAwMEYgICAgICAjICA0IGJpdHMKLSAgcmV0dXJuIChpc29fY29kZSA8PCAxNikgfCAod2lmaSA8PCAxMSkgfCAoc2QgPDwgOSkgfCAodHpfaW5kIDw8IDQpIHwgbGFuZ19pbmQKLQotaW5kX2NvZGVzID0gWycweCUwOHgnICUgbWtfaW5kX2NvZGUoZWx0KSBmb3IgZWx0IGluIG1jY190YWJsZV0KLQotZGVmIGZtdF9saXN0KHRpdGxlLCBsLCBiYXRjaF9zeik6Ci0gIHNsID0gW10KLSAgZm9yIGkgaW4gcmFuZ2UobGVuKGwpIC8gYmF0Y2hfc3ogKyAobGVuKGwpICUgYmF0Y2hfc3ogYW5kIDEgb3IgMCkpOgotICAgIGogPSBpICogYmF0Y2hfc3oKLSAgICBzbC5hcHBlbmQoKCcgJyAqIDgpICsgJywgJy5qb2luKGxbajpqICsgYmF0Y2hfc3pdKSkKLSAgcmV0dXJuICcgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgJXMgPSB7XG4nICUgdGl0bGUgKyAnLFxuJy5qb2luKHNsKSArICdcbiAgICB9O1xuJwotCi1kZWYgZG9fYXV0b2dlbl9jb21tZW50KGV4dHJhX2Rlc2M9W10pOgotICBwcmludCAnICAgIC8nICsgJyoqXG4gICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKScKLSAgZm9yIGxpbmUgaW4gZXh0cmFfZGVzYzoKLSAgICBwcmludCAnICAgICogJXMnICUgbGluZQotICBwcmludCAnICAgIConICsgJy8nCi0KLWRvX2F1dG9nZW5fY29tbWVudCgpCi1wcmludCBmbXRfbGlzdCgnU3RyaW5nW10gVFpfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIHR6X3NldF0sIDEpCi1kb19hdXRvZ2VuX2NvbW1lbnQoKQotcHJpbnQgZm10X2xpc3QoJ1N0cmluZ1tdIExBTkdfU1RSSU5HUycsIFsnIiVzIicgJSB4IGZvciB4IGluIGxhbmdfc2V0XSwgMTApCi1kb19hdXRvZ2VuX2NvbW1lbnQoWydUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZScsCi0gICAgICAgICAgICAgICAgICAgICdvZiBhIGdpdmVuIE1DQyBjb2RlIGlzIHRoZSBpbmRleCBvZiBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCcsCi0gICAgICAgICAgICAgICAgICAgICd0aGF0IE1DQyBpbiB0aGUgSU5EX0NPREVTIHRhYmxlLiddKQotcHJpbnQgZm10X2xpc3QoJ3Nob3J0W10gTUNDX0NPREVTJywgbWNjX2NvZGVzLCAxMCkKLWRvX2F1dG9nZW5fY29tbWVudChbJ1RoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBpc28gY291bnRyeSBjb2RlIDE2IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgICh1bnVzZWQpICAgICAgICAgIDEgYml0JywKLSAgICAgICAgICAgICAgICAgICAgJyAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMnLAotICAgICAgICAgICAgICAgICAgICAnICAgIHNtYWxsZWQgZGlnaXQgICAgIDIgYml0cycsCi0gICAgICAgICAgICAgICAgICAgICcgICAgZGVmYXVsdCB0aW1lem9uZSAgNSBiaXRzJywKLSAgICAgICAgICAgICAgICAgICAgJyAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMnXSkKLXByaW50IGZtdF9saXN0KCdpbnRbXSBJTkRfQ09ERVMnLCBpbmRfY29kZXMsIDYpCi0KLWRlZiBwYXJzZV9pbmRfY29kZShpbmQpOgotICBtY2MgPSBldmFsKG1jY19jb2Rlc1tpbmRdKQotICBjb2RlID0gZXZhbChpbmRfY29kZXNbaW5kXSkKLSAgaXNvX2xzYiA9IGludCgoY29kZSA+PiAxNikgJiAweDAwRkYpCi0gIGlzb19tc2IgPSBpbnQoKGNvZGUgPj4gMjQpICYgMHgwMEZGKQotICBpc28gPSAnJXMlcycgJSAoY2hyKGlzb19tc2IpLCBjaHIoaXNvX2xzYikpCi0gIHdpZmkgPSBpbnQoKGNvZGUgPj4gMTEpICYgMHgwMDBGKQotICBzZCA9IGludCgoY29kZSA+PiA5KSAmIDB4MDAwMykKLSAgdHpfaW5kID0gKGNvZGUgPj4gNCkgJiAweDAwMUYKLSAgbGFuZ19pbmQgPSAoY29kZSA+PiAwKSAmIDB4MDAwRgotICByZXR1cm4gKG1jYywgaXNvLCBzZCwgdHpfc2V0W3R6X2luZF0sIGxhbmdfc2V0W2xhbmdfaW5kXSwgd2lmaSkKLQotZm10X3N0ciA9ICdtY2MgPSAlcywgaXNvID0gJXMsIHNkID0gJXMsIHR6ID0gJXMsIGxhbmcgPSAlcywgd2lmaSA9ICVzJwotb3JpZ190YWJsZSA9IFtmbXRfc3RyICUgKGdldF9tY2MoZWx0KSwgZ2V0X2lzbyhlbHQpLCBnZXRfc2QoZWx0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdHooZWx0KSwgZ2V0X2xhbmcoZWx0KSwgZ2V0X3dpZmkoZWx0KSkKLSAgICAgICAgICAgICAgZm9yIGVsdCBpbiBtY2NfdGFibGVdCi1kZXJpdmVkX3RhYmxlID0gW2ZtdF9zdHIgJSBwYXJzZV9pbmRfY29kZShpKSBmb3IgaSBpbiByYW5nZShsZW4oaW5kX2NvZGVzKSldCi1mb3IgaSBpbiByYW5nZShsZW4ob3JpZ190YWJsZSkpOgotICBpZiBvcmlnX3RhYmxlW2ldID09IGRlcml2ZWRfdGFibGVbaV06IGNvbnRpbnVlCi0gIHByaW50ICdNSVNNQVRDSCBFUlJPUiA6ICcsIG9yaWdfdGFibGVbaV0sICIgIT0gIiwgZGVyaXZlZF90YWJsZVtpXQotCi0qLworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgbGliY29yZS5pY3UuVGltZVpvbmVzOwogCiAvKioKICAqIE1vYmlsZSBDb3VudHJ5IENvZGUKQEAgLTM3MSwyMDAgKzM4LDE1MyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTWNjVGFibGUKIHsKLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRaX1NUUklOR1MgPSB7Ci0gICAgICAgICIiLAotICAgICAgICAiQWZyaWNhL0pvaGFubmVzYnVyZyIsCi0gICAgICAgICJBc2lhL0JlaWppbmciLAotICAgICAgICAiQXNpYS9TaW5nYXBvcmUiLAotICAgICAgICAiQXNpYS9Ub2t5byIsCi0gICAgICAgICJBdXN0cmFsaWEvU3lkbmV5IiwKLSAgICAgICAgIkV1cm9wZS9BbXN0ZXJkYW0iLAotICAgICAgICAiRXVyb3BlL0JlcmxpbiIsCi0gICAgICAgICJFdXJvcGUvRHVibGluIiwKLSAgICAgICAgIkV1cm9wZS9Mb25kb24iLAotICAgICAgICAiRXVyb3BlL01hZHJpZCIsCi0gICAgICAgICJFdXJvcGUvUGFyaXMiLAotICAgICAgICAiRXVyb3BlL1ByYWd1ZSIsCi0gICAgICAgICJFdXJvcGUvUm9tZSIsCi0gICAgICAgICJFdXJvcGUvVmllbm5hIiwKLSAgICAgICAgIkV1cm9wZS9XYXJzYXciLAotICAgICAgICAiRXVyb3BlL1p1cmljaCIsCi0gICAgICAgICJQYWNpZmljL0F1Y2tsYW5kIgotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExBTkdfU1RSSU5HUyA9IHsKLSAgICAgICAgIiIsICJjcyIsICJkZSIsICJlbiIsICJlcyIsICJmciIsICJpdCIsICJqYSIsICJubCIsICJ6aCIKLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogQVVUTyBHRU5FUkFURUQgKGJ5IHRoZSBQeXRob24gY29kZSBhYm92ZSkKLSAgICAgKiBUaGlzIHRhYmxlIGlzIGEgbGlzdCBvZiBNQ0MgY29kZXMuICBUaGUgaW5kZXggaW4gdGhpcyB0YWJsZQotICAgICAqIG9mIGEgZ2l2ZW4gTUNDIGNvZGUgaXMgdGhlIGluZGV4IG9mIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICogdGhhdCBNQ0MgaW4gdGhlIElORF9DT0RFUyB0YWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydFtdIE1DQ19DT0RFUyA9IHsKLSAgICAgICAgMHgwMGNhLCAweDAwY2MsIDB4MDBjZSwgMHgwMGQwLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDgsIDB4MDBkYSwgMHgwMGRiLAotICAgICAgICAweDAwZGMsIDB4MDBkZSwgMHgwMGUxLCAweDAwZTIsIDB4MDBlNCwgMHgwMGU2LCAweDAwZTcsIDB4MDBlOCwgMHgwMGVhLCAweDAwZWIsCi0gICAgICAgIDB4MDBlZSwgMHgwMGYwLCAweDAwZjIsIDB4MDBmNCwgMHgwMGY2LCAweDAwZjcsIDB4MDBmOCwgMHgwMGZhLCAweDAwZmYsIDB4MDEwMSwKLSAgICAgICAgMHgwMTAzLCAweDAxMDQsIDB4MDEwNiwgMHgwMTBhLCAweDAxMGMsIDB4MDEwZSwgMHgwMTEwLCAweDAxMTIsIDB4MDExNCwgMHgwMTE2LAotICAgICAgICAweDAxMTgsIDB4MDExYSwgMHgwMTFiLCAweDAxMWMsIDB4MDExZSwgMHgwMTIwLCAweDAxMjEsIDB4MDEyMiwgMHgwMTI0LCAweDAxMjUsCi0gICAgICAgIDB4MDEyNiwgMHgwMTI3LCAweDAxMjksIDB4MDEyZSwgMHgwMTM0LCAweDAxMzYsIDB4MDEzNywgMHgwMTM4LCAweDAxMzksIDB4MDEzYSwKLSAgICAgICAgMHgwMTNiLCAweDAxM2MsIDB4MDE0YSwgMHgwMTRjLCAweDAxNGUsIDB4MDE1MiwgMHgwMTU0LCAweDAxNTYsIDB4MDE1OCwgMHgwMTVhLAotICAgICAgICAweDAxNWMsIDB4MDE1ZSwgMHgwMTYwLCAweDAxNjIsIDB4MDE2NCwgMHgwMTY2LCAweDAxNjgsIDB4MDE2YSwgMHgwMTZiLCAweDAxNmMsCi0gICAgICAgIDB4MDE2ZCwgMHgwMTZlLCAweDAxNzAsIDB4MDE3MiwgMHgwMTc0LCAweDAxNzYsIDB4MDE3OCwgMHgwMTkwLCAweDAxOTEsIDB4MDE5MiwKLSAgICAgICAgMHgwMTk0LCAweDAxOTUsIDB4MDE5YSwgMHgwMTljLCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLCAweDAxYTAsIDB4MDFhMSwgMHgwMWEyLAotICAgICAgICAweDAxYTMsIDB4MDFhNCwgMHgwMWE1LCAweDAxYTYsIDB4MDFhNywgMHgwMWE4LCAweDAxYTksIDB4MDFhYSwgMHgwMWFiLCAweDAxYWMsCi0gICAgICAgIDB4MDFhZCwgMHgwMWFlLCAweDAxYWYsIDB4MDFiMCwgMHgwMWIyLCAweDAxYjQsIDB4MDFiNSwgMHgwMWI2LCAweDAxYjgsIDB4MDFiOSwKLSAgICAgICAgMHgwMWMyLCAweDAxYzQsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOSwgMHgwMWNjLCAweDAxY2QsIDB4MDFkMiwgMHgwMWQzLAotICAgICAgICAweDAxZDYsIDB4MDFkOCwgMHgwMWY2LCAweDAxZjksIDB4MDFmZSwgMHgwMjAyLCAweDAyMDMsIDB4MDIwOCwgMHgwMjBkLCAweDAyMTAsCi0gICAgICAgIDB4MDIxMiwgMHgwMjE2LCAweDAyMTcsIDB4MDIxOCwgMHgwMjE5LCAweDAyMWIsIDB4MDIxYywgMHgwMjFkLCAweDAyMWUsIDB4MDIxZiwKLSAgICAgICAgMHgwMjIwLCAweDAyMjEsIDB4MDIyMiwgMHgwMjIzLCAweDAyMjQsIDB4MDIyNSwgMHgwMjI2LCAweDAyMjcsIDB4MDIyOCwgMHgwMjVhLAotICAgICAgICAweDAyNWIsIDB4MDI1YywgMHgwMjVkLCAweDAyNWUsIDB4MDI1ZiwgMHgwMjYwLCAweDAyNjEsIDB4MDI2MiwgMHgwMjYzLCAweDAyNjQsCi0gICAgICAgIDB4MDI2NSwgMHgwMjY2LCAweDAyNjcsIDB4MDI2OCwgMHgwMjY5LCAweDAyNmEsIDB4MDI2YiwgMHgwMjZjLCAweDAyNmQsIDB4MDI2ZSwKLSAgICAgICAgMHgwMjZmLCAweDAyNzAsIDB4MDI3MSwgMHgwMjcyLCAweDAyNzMsIDB4MDI3NCwgMHgwMjc1LCAweDAyNzYsIDB4MDI3NywgMHgwMjc4LAotICAgICAgICAweDAyNzksIDB4MDI3YSwgMHgwMjdiLCAweDAyN2MsIDB4MDI3ZCwgMHgwMjdlLCAweDAyN2YsIDB4MDI4MCwgMHgwMjgxLCAweDAyODIsCi0gICAgICAgIDB4MDI4MywgMHgwMjg1LCAweDAyODYsIDB4MDI4NywgMHgwMjg4LCAweDAyODksIDB4MDI4YSwgMHgwMjhiLCAweDAyOGMsIDB4MDI4ZCwKLSAgICAgICAgMHgwMjhlLCAweDAyOGYsIDB4MDI5MSwgMHgwMmJlLCAweDAyYzAsIDB4MDJjMiwgMHgwMmM0LCAweDAyYzYsIDB4MDJjOCwgMHgwMmNhLAotICAgICAgICAweDAyY2MsIDB4MDJkMiwgMHgwMmQ0LCAweDAyZGEsIDB4MDJkYywgMHgwMmRlLCAweDAyZTAsIDB4MDJlMiwgMHgwMmU0LCAweDAyZTYsCi0gICAgICAgIDB4MDJlOCwgMHgwMmVhLCAweDAyZWMsIDB4MDJlZQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBVVRPIEdFTkVSQVRFRCAoYnkgdGhlIFB5dGhvbiBjb2RlIGFib3ZlKQotICAgICAqIFRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZSBhcmUgYnJva2VuIGRvd24gYXMgZm9sbG93cyAobXNiIHRvIGxzYik6Ci0gICAgICogICAgIGlzbyBjb3VudHJ5IGNvZGUgMTYgYml0cwotICAgICAqICAgICAodW51c2VkKSAgICAgICAgICAxIGJpdAotICAgICAqICAgICB3aWZpIGNoYW5uZWwgICAgICA0IGJpdHMKLSAgICAgKiAgICAgc21hbGxlZCBkaWdpdCAgICAgMiBiaXRzCi0gICAgICogICAgIGRlZmF1bHQgdGltZXpvbmUgIDUgYml0cwotICAgICAqICAgICBkZWZhdWx0IGxhbmd1YWdlICA0IGJpdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBJTkRfQ09ERVMgPSB7Ci0gICAgICAgIDB4Njc3MjA0MDAsIDB4NmU2YzZjNjgsIDB4NjI2NTA0MDAsIDB4NjY3MjA0YjUsIDB4NmQ2MzA0MDAsIDB4NjE2NDA0MDAsCi0gICAgICAgIDB4NjU3MzA0YTQsIDB4Njg3NTA0MDAsIDB4NjI2MTA0MDAsIDB4Njg3MjA0MDAsIDB4NzI3MzA0MDAsIDB4Njk3NDA0ZDYsCi0gICAgICAgIDB4NzY2MTA0ZDYsIDB4NzI2ZjA0MDAsIDB4NjM2ODA1MDIsIDB4NjM3YTZjYzEsIDB4NzM2YjA0MDAsIDB4NjE3NDZjZTIsCi0gICAgICAgIDB4Njc2MjZjOTMsIDB4Njc2MjZjOTMsIDB4NjQ2YjA0MDAsIDB4NzM2NTA0MDAsIDB4NmU2ZjA0MDAsIDB4NjY2OTA0MDAsCi0gICAgICAgIDB4NmM3NDA0MDAsIDB4NmM3NjA0MDAsIDB4NjU2NTA0MDAsIDB4NzI3NTA0MDAsIDB4NzU2MTA0MDAsIDB4NjI3OTA0MDAsCi0gICAgICAgIDB4NmQ2NDA0MDAsIDB4NzA2YzA0ZjAsIDB4NjQ2NTZjNzIsIDB4Njc2OTA0MDAsIDB4NzA3NDA0MDAsIDB4NmM3NTA0MDAsCi0gICAgICAgIDB4Njk2NTA0ODMsIDB4Njk3MzA0MDAsIDB4NjE2YzA0MDAsIDB4NmQ3NDA0MDAsIDB4NjM3OTA0MDAsIDB4Njc2NTA0MDAsCi0gICAgICAgIDB4NjE2ZDA0MDAsIDB4NjI2NzA0MDAsIDB4NzQ3MjA0MDAsIDB4NjY2ZjA0MDAsIDB4Njc2NTA0MDAsIDB4Njc2YzA0MDAsCi0gICAgICAgIDB4NzM2ZDA0MDAsIDB4NzM2YzA0MDAsIDB4NmQ2YjA0MDAsIDB4NmM2OTA0MDAsIDB4NmQ2NTA0MDAsIDB4NjM2MTVlMDAsCi0gICAgICAgIDB4NzA2ZDA0MDAsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsCi0gICAgICAgIDB4NzU3MzVlMDMsIDB4NzU3MzVlMDMsIDB4NzA3MjA0MDAsIDB4NzY2OTA0MDAsIDB4NmQ3ODA2MDAsIDB4NmE2ZDA2MDAsCi0gICAgICAgIDB4Njc3MDA0MDAsIDB4NjI2MjA2MDAsIDB4NjE2NzA2MDAsIDB4NmI3OTA2MDAsIDB4NzY2NzA2MDAsIDB4NjI2ZDA0MDAsCi0gICAgICAgIDB4Njc2NDA0MDAsIDB4NmQ3MzA0MDAsIDB4NmI2ZTA0MDAsIDB4NmM2MzA0MDAsIDB4NzY2MzA0MDAsIDB4NmU2YzA0MDAsCi0gICAgICAgIDB4NjE3NzA0MDAsIDB4NjI3MzA0MDAsIDB4NjE2OTA2MDAsIDB4NjQ2ZDA0MDAsIDB4NjM3NTA0MDAsIDB4NjQ2ZjA0MDAsCi0gICAgICAgIDB4Njg3NDA0MDAsIDB4NzQ3NDA0MDAsIDB4NzQ2MzA0MDAsIDB4NjE3YTA0MDAsIDB4NmI3YTA0MDAsIDB4NjI3NDA0MDAsCi0gICAgICAgIDB4Njk2ZTA0MDAsIDB4Njk2ZTA0MDAsIDB4NzA2YjA0MDAsIDB4NjE2NjA0MDAsIDB4NmM2YjA0MDAsIDB4NmQ2ZDA0MDAsCi0gICAgICAgIDB4NmM2MjA0MDAsIDB4NmE2ZjA0MDAsIDB4NzM3OTA0MDAsIDB4Njk3MTA0MDAsIDB4NmI3NzA0MDAsIDB4NzM2MTA0MDAsCi0gICAgICAgIDB4Nzk2NTA0MDAsIDB4NmY2ZDA0MDAsIDB4NzA3MzA0MDAsIDB4NjE2NTA0MDAsIDB4Njk2YzA0MDAsIDB4NjI2ODA0MDAsCi0gICAgICAgIDB4NzE2MTA0MDAsIDB4NmQ2ZTA0MDAsIDB4NmU3MDA0MDAsIDB4NjE2NTA0MDAsIDB4NjE2NTA0MDAsIDB4Njk3MjA0MDAsCi0gICAgICAgIDB4NzU3YTA0MDAsIDB4NzQ2YTA0MDAsIDB4NmI2NzA0MDAsIDB4NzQ2ZDA0MDAsIDB4NmE3MDc0NDcsIDB4NmE3MDc0NDcsCi0gICAgICAgIDB4NmI3MjA0MDAsIDB4NzY2ZTA0MDAsIDB4Njg2YjA0MDAsIDB4NmQ2ZjA0MDAsIDB4NmI2ODA0MDAsIDB4NmM2MTA0MDAsCi0gICAgICAgIDB4NjM2ZTZjMjksIDB4NjM2ZTZjMjksIDB4NzQ3NzA0MDAsIDB4NmI3MDA0MDAsIDB4NjI2NDA0MDAsIDB4NmQ3NjA0MDAsCi0gICAgICAgIDB4NmQ3OTA0MDAsIDB4NjE3NTVjNTMsIDB4Njk2NDA0MDAsIDB4NzQ2YzA0MDAsIDB4NzA2ODA0MDAsIDB4NzQ2ODA0MDAsCi0gICAgICAgIDB4NzM2NzVjMzMsIDB4NjI2ZTA0MDAsIDB4NmU3YTA1MTMsIDB4NmQ3MDA0MDAsIDB4Njc3NTA0MDAsIDB4NmU3MjA0MDAsCi0gICAgICAgIDB4NzA2NzA0MDAsIDB4NzQ2ZjA0MDAsIDB4NzM2MjA0MDAsIDB4NzY3NTA0MDAsIDB4NjY2YTA0MDAsIDB4Nzc2NjA0MDAsCi0gICAgICAgIDB4NjE3MzA0MDAsIDB4NmI2OTA0MDAsIDB4NmU2MzA0MDAsIDB4NzA2NjA0MDAsIDB4NjM2YjA0MDAsIDB4Nzc3MzA0MDAsCi0gICAgICAgIDB4NjY2ZDA0MDAsIDB4NmQ2ODA0MDAsIDB4NzA3NzA0MDAsIDB4NjU2NzA0MDAsIDB4NjQ3YTA0MDAsIDB4NmQ2MTA0MDAsCi0gICAgICAgIDB4NzQ2ZTA0MDAsIDB4NmM3OTA0MDAsIDB4Njc2ZDA0MDAsIDB4NzM2ZTA0MDAsIDB4NmQ3MjA0MDAsIDB4NmQ2YzA0MDAsCi0gICAgICAgIDB4Njc2ZTA0MDAsIDB4NjM2OTA0MDAsIDB4NjI2NjA0MDAsIDB4NmU2NTA0MDAsIDB4NzQ2NzA0MDAsIDB4NjI2YTA0MDAsCi0gICAgICAgIDB4NmQ3NTA0MDAsIDB4NmM3MjA0MDAsIDB4NzM2YzA0MDAsIDB4Njc2ODA0MDAsIDB4NmU2NzA0MDAsIDB4NzQ2NDA0MDAsCi0gICAgICAgIDB4NjM2NjA0MDAsIDB4NjM2ZDA0MDAsIDB4NjM3NjA0MDAsIDB4NzM3NDA0MDAsIDB4Njc3MTA0MDAsIDB4Njc2MTA0MDAsCi0gICAgICAgIDB4NjM2NzA0MDAsIDB4NjM2NzA0MDAsIDB4NjE2ZjA0MDAsIDB4Njc3NzA0MDAsIDB4NzM2MzA0MDAsIDB4NzM2NDA0MDAsCi0gICAgICAgIDB4NzI3NzA0MDAsIDB4NjU3NDA0MDAsIDB4NzM2ZjA0MDAsIDB4NjQ2YTA0MDAsIDB4NmI2NTA0MDAsIDB4NzQ3YTA0MDAsCi0gICAgICAgIDB4NzU2NzA0MDAsIDB4NjI2OTA0MDAsIDB4NmQ3YTA0MDAsIDB4N2E2ZDA0MDAsIDB4NmQ2NzA0MDAsIDB4NzI2NTA0MDAsCi0gICAgICAgIDB4N2E3NzA0MDAsIDB4NmU2MTA0MDAsIDB4NmQ3NzA0MDAsIDB4NmM3MzA0MDAsIDB4NjI3NzA0MDAsIDB4NzM3YTA0MDAsCi0gICAgICAgIDB4NmI2ZDA0MDAsIDB4N2E2MTA0MTMsIDB4NjU3MjA0MDAsIDB4NjI3YTA0MDAsIDB4Njc3NDA0MDAsIDB4NzM3NjA0MDAsCi0gICAgICAgIDB4Njg2ZTA2MDAsIDB4NmU2OTA0MDAsIDB4NjM3MjA0MDAsIDB4NzA2MTA0MDAsIDB4NzA2NTA0MDAsIDB4NjE3MjA2MDAsCi0gICAgICAgIDB4NjI3MjA0MDAsIDB4NjM2YzA0MDAsIDB4NjM2ZjA2MDAsIDB4NzY2NTA0MDAsIDB4NjI2ZjA0MDAsIDB4Njc3OTA0MDAsCi0gICAgICAgIDB4NjU2MzA0MDAsIDB4Njc2NjA0MDAsIDB4NzA3OTA0MDAsIDB4NzM3MjA0MDAsIDB4NzU3OTA0MDAsIDB4NjY2YjA0MDAKLSAgICB9OwotCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1jY1RhYmxlIjsKIAorICAgIHN0YXRpYyBBcnJheUxpc3Q8TWNjRW50cnk+IHRhYmxlOworCisgICAgc3RhdGljIGNsYXNzIE1jY0VudHJ5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxNY2NFbnRyeT4KKyAgICB7CisgICAgICAgIGludCBtY2M7CisgICAgICAgIFN0cmluZyBpc287CisgICAgICAgIGludCBzbWFsbGVzdERpZ2l0c01uYzsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlOworICAgICAgICBpbnQgd2lmaUNoYW5uZWxzOworCisgICAgICAgIE1jY0VudHJ5KGludCBtbmMsIFN0cmluZyBpc28sIGludCBzbWFsbGVzdERpZ2l0c01DQykgeworICAgICAgICAgICAgdGhpcyhtbmMsIGlzbywgc21hbGxlc3REaWdpdHNNQ0MsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWNjRW50cnkoaW50IG1uYywgU3RyaW5nIGlzbywgaW50IHNtYWxsZXN0RGlnaXRzTUNDLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMobW5jLCBpc28sIHNtYWxsZXN0RGlnaXRzTUNDLCBsYW5ndWFnZSwgMCk7CisgICAgICAgIH0KKworICAgICAgICBNY2NFbnRyeShpbnQgbW5jLCBTdHJpbmcgaXNvLCBpbnQgc21hbGxlc3REaWdpdHNNQ0MsIFN0cmluZyBsYW5ndWFnZSwgaW50IHdpZmlDaGFubmVscykgeworICAgICAgICAgICAgdGhpcy5tY2MgPSBtbmM7CisgICAgICAgICAgICB0aGlzLmlzbyA9IGlzbzsKKyAgICAgICAgICAgIHRoaXMuc21hbGxlc3REaWdpdHNNbmMgPSBzbWFsbGVzdERpZ2l0c01DQzsKKyAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgICAgIHRoaXMud2lmaUNoYW5uZWxzID0gd2lmaUNoYW5uZWxzOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhNY2NFbnRyeSBvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWNjIC0gby5tY2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNY2NFbnRyeQorICAgIGVudHJ5Rm9yTWNjKGludCBtY2MpCisgICAgeworICAgICAgICBpbnQgaW5kZXg7CisKKyAgICAgICAgTWNjRW50cnkgbTsKKworICAgICAgICBtID0gbmV3IE1jY0VudHJ5KG1jYywgbnVsbCwgMCk7CisKKyAgICAgICAgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2godGFibGUsIG0pOworCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYSBkZWZhdWx0IHRpbWUgem9uZSBJRAotICAgICAqIGlmIGF2YWlsYWJsZS4gIFJldHVybnMgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIGEgZGVmYXVsdCB0aW1lIHpvbmUgSUQgZm9yIHRoZSBnaXZlbiBNQ0MuCisgICAgICogQHBhcmFtIG1jYyBNb2JpbGUgQ291bnRyeSBDb2RlCisgICAgICogQHJldHVybiBkZWZhdWx0IFRpbWVab25lIElELCBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0VGltZVpvbmVGb3JNY2MoaW50IG1jYykgewotICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKE1DQ19DT0RFUywgKHNob3J0KW1jYyk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCB8fCBlbnRyeS5pc28gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlOworICAgICAgICAgICAgaWYgKGVudHJ5Lmxhbmd1YWdlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoZW50cnkubGFuZ3VhZ2UsIGVudHJ5Lmlzbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSB0eiA9IFRpbWVab25lcy5mb3JMb2NhbGUobG9jYWxlKTsKKyAgICAgICAgICAgIGlmICh0ei5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICByZXR1cm4gdHpbMF07CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgdHpJbmQgPSAoaW5kQ29kZSA+Pj4gNCkgJiAweDAwMUY7Ci0gICAgICAgIFN0cmluZyB0eiA9IFRaX1NUUklOR1NbdHpJbmRdOwotICAgICAgICBpZiAodHogPT0gIiIpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ejsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHaXZlbiBhIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgYW4gSVNPIHR3by1jaGFyYWN0ZXIKLSAgICAgKiBjb3VudHJ5IGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyAiIiBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBHaXZlbiBhIEdTTSBNb2JpbGUgQ291bnRyeSBDb2RlLCByZXR1cm5zCisgICAgICogYW4gSVNPIHR3by1jaGFyYWN0ZXIgY291bnRyeSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zICIiIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdW50cnlDb2RlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKKyAgICBjb3VudHJ5Q29kZUZvck1jYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkuaXNvOwogICAgICAgICB9Ci0gICAgICAgIGludCBpbmRDb2RlID0gSU5EX0NPREVTW2luZGV4XTsKLSAgICAgICAgYnl0ZVtdIGlzbyA9IHsoYnl0ZSkoKGluZENvZGUgPj4+IDI0KSAmIDB4MDBGRiksIChieXRlKSgoaW5kQ29kZSA+Pj4gMTYpICYgMHgwMEZGKX07Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlzbyk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyBhbiBJU08gMi0zIGNoYXJhY3RlcgotICAgICAqIGxhbmd1YWdlIGNvZGUgaWYgYXZhaWxhYmxlLiAgUmV0dXJucyBudWxsIGlmIHVuYXZhaWxhYmxlLgorICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMKKyAgICAgKiBhbiBJU08gMi0zIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExhbmd1YWdlRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIE1jY0VudHJ5IGVudHJ5OworCisgICAgICAgIGVudHJ5ID0gZW50cnlGb3JNY2MobWNjKTsKKworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnkubGFuZ3VhZ2U7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGluZENvZGUgPSBJTkRfQ09ERVNbaW5kZXhdOwotICAgICAgICBpbnQgbGFuZ0luZCA9IGluZENvZGUgJiAweDAwMEY7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gTEFOR19TVFJJTkdTW2xhbmdJbmRdOwotICAgICAgICBpZiAobGFuZyA9PSAiIikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhbmc7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIHNtYWxsZXN0IG51bWJlciBvZiBkaWdpdHMgZmllbGQuICBSZXR1cm5zIDIgaWYgdW5hdmFpbGFibGUuCisgICAgICogR2l2ZW4gYSBHU00gTW9iaWxlIENvdW50cnkgQ29kZSwgcmV0dXJucworICAgICAqIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgZGlnaXRzIHRoYXQgTSBpZiBhdmFpbGFibGUuCisgICAgICogUmV0dXJucyAyIGlmIHVuYXZhaWxhYmxlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNtYWxsZXN0RGlnaXRzTWNjRm9yTW5jKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICBzbWFsbGVzdERpZ2l0c01jY0Zvck1uYyhpbnQgbWNjKQorICAgIHsKKyAgICAgICAgTWNjRW50cnkgZW50cnk7CisKKyAgICAgICAgZW50cnkgPSBlbnRyeUZvck1jYyhtY2MpOworCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbWFsbGVzdERpZ2l0c01uYzsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCBzbURpZyA9IChpbmRDb2RlID4+PiA5KSAmIDB4MDAwMzsKLSAgICAgICAgcmV0dXJuIHNtRGlnOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdpdmVuIGEgR1NNIE1vYmlsZSBDb3VudHJ5IENvZGUsIHJldHVybnMgdGhlIG51bWJlciBvZiB3aWZpCiAgICAgICogY2hhbm5lbHMgYWxsb3dlZCBpbiB0aGF0IGNvdW50cnkuICBSZXR1cm5zIDAgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lmaUNoYW5uZWxzRm9yTWNjKGludCBtY2MpIHsKLSAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChNQ0NfQ09ERVMsIChzaG9ydCltY2MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgcHVibGljIHN0YXRpYyBpbnQKKyAgICB3aWZpQ2hhbm5lbHNGb3JNY2MoaW50IG1jYykgeworICAgICAgICBNY2NFbnRyeSBlbnRyeTsKKworICAgICAgICBlbnRyeSA9IGVudHJ5Rm9yTWNjKG1jYyk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5LndpZmlDaGFubmVsczsKICAgICAgICAgfQotICAgICAgICBpbnQgaW5kQ29kZSA9IElORF9DT0RFU1tpbmRleF07Ci0gICAgICAgIGludCB3aWZpID0gKGluZENvZGUgPj4+IDExKSAmIDB4MDAwRjsKLSAgICAgICAgcmV0dXJuIHdpZmk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NTYsNCArMjc2LDI2MiBAQAogICAgICAgICAgICAgd00uc2V0TnVtQWxsb3dlZENoYW5uZWxzKHdpZmlDaGFubmVscywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICB0YWJsZSA9IG5ldyBBcnJheUxpc3Q8TWNjRW50cnk+KDI0MCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgdGFibGUgYmVsb3cgaXMgYnVpbHQgZnJvbSB0d28gcmVzb3VyY2VzOgorICAgICAgICAgKgorICAgICAgICAgKiAxKSBJVFUgIk1vYmlsZSBOZXR3b3JrIENvZGUgKE1OQykgZm9yIHRoZSBpbnRlcm5hdGlvbmFsCisgICAgICAgICAqICAgaWRlbnRpZmljYXRpb24gcGxhbiBmb3IgbW9iaWxlIHRlcm1pbmFscyBhbmQgbW9iaWxlIHVzZXJzIgorICAgICAgICAgKiAgIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBhbiBhbm5leCB0byB0aGUgSVRVIG9wZXJhdGlvbmFsIGJ1bGxldGluCisgICAgICAgICAqICAgYXZhaWxhYmxlIGhlcmU6IGh0dHA6Ly93d3cuaXR1LmludC9pdHUtdC9idWxsZXRpbi9hbm5leC5odG1sCisgICAgICAgICAqCisgICAgICAgICAqIDIpIFRoZSBJU08gMzE2NiBjb3VudHJ5IGNvZGVzIGxpc3QsIGF2YWlsYWJsZSBoZXJlOgorICAgICAgICAgKiAgICBodHRwOi8vd3d3Lmlzby5vcmcvaXNvL2VuL3Byb2RzLXNlcnZpY2VzL2lzbzMxNjZtYS8wMmlzby0zMTY2LWNvZGUtbGlzdHMvaW5kZXguaHRtbAorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHRhYmxlIGhhcyBub3QgYmVlbiB2ZXJpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICovCisKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMDIsImdyIiwyKSk7CS8vR3JlZWNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA0LCJubCIsMiwibmwiLDEzKSk7CS8vTmV0aGVybGFuZHMgKEtpbmdkb20gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIwNiwiYmUiLDIpKTsJLy9CZWxnaXVtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjA4LCJmciIsMiwiZnIiKSk7CS8vRnJhbmNlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjEyLCJtYyIsMikpOwkvL01vbmFjbyAoUHJpbmNpcGFsaXR5IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIxMywiYWQiLDIpKTsJLy9BbmRvcnJhIChQcmluY2lwYWxpdHkgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE0LCJlcyIsMiwiZXMiKSk7CS8vU3BhaW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTYsImh1IiwyKSk7CS8vSHVuZ2FyeSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjE4LCJiYSIsMikpOwkvL0Jvc25pYSBhbmQgSGVyemVnb3ZpbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMTksImhyIiwyKSk7CS8vQ3JvYXRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjIwLCJycyIsMikpOwkvL1NlcmJpYSBhbmQgTW9udGVuZWdybworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIyMiwiaXQiLDIsIml0IikpOwkvL0l0YWx5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI1LCJ2YSIsMiwiaXQiKSk7CS8vVmF0aWNhbiBDaXR5IFN0YXRlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjI2LCJybyIsMikpOwkvL1JvbWFuaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMjgsImNoIiwyLCJkZSIpKTsJLy9Td2l0emVybGFuZCAoQ29uZmVkZXJhdGlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzAsImN6IiwyLCJjcyIsMTMpKTsJLy9DemVjaCBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzMSwic2siLDIpKTsJLy9TbG92YWsgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzIsImF0IiwyLCJkZSIsMTMpKTsJLy9BdXN0cmlhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjM0LCJnYiIsMiwiZW4iLDEzKSk7CS8vVW5pdGVkIEtpbmdkb20gb2YgR3JlYXQgQnJpdGFpbiBhbmQgTm9ydGhlcm4gSXJlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDIzNSwiZ2IiLDIsImVuIiwxMykpOwkvL1VuaXRlZCBLaW5nZG9tIG9mIEdyZWF0IEJyaXRhaW4gYW5kIE5vcnRoZXJuIElyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyMzgsImRrIiwyKSk7CS8vRGVubWFyaworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI0MCwic2UiLDIpKTsJLy9Td2VkZW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDIsIm5vIiwyKSk7CS8vTm9yd2F5CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjQ0LCJmaSIsMikpOwkvL0ZpbmxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDYsImx0IiwyKSk7CS8vTGl0aHVhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDcsImx2IiwyKSk7CS8vTGF0dmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNDgsImVlIiwyKSk7CS8vRXN0b25pYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjUwLCJydSIsMikpOwkvL1J1c3NpYW4gRmVkZXJhdGlvbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1NSwidWEiLDIpKTsJLy9Va3JhaW5lCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjU3LCJieSIsMikpOwkvL0JlbGFydXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI1OSwibWQiLDIpKTsJLy9Nb2xkb3ZhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjAsInBsIiwyKSk7CS8vUG9sYW5kIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjIsImRlIiwyLCJkZSIsMTMpKTsJLy9HZXJtYW55IChGZWRlcmFsIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI2NiwiZ2kiLDIpKTsJLy9HaWJyYWx0YXIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNjgsInB0IiwyKSk7CS8vUG9ydHVnYWwKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzAsImx1IiwyKSk7CS8vTHV4ZW1ib3VyZworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3MiwiaWUiLDIsImVuIikpOwkvL0lyZWxhbmQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzQsImlzIiwyKSk7CS8vSWNlbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI3NiwiYWwiLDIpKTsJLy9BbGJhbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyNzgsIm10IiwyKSk7CS8vTWFsdGEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODAsImN5IiwyKSk7CS8vQ3lwcnVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODIsImdlIiwyKSk7CS8vR2VvcmdpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4MywiYW0iLDIpKTsJLy9Bcm1lbmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODQsImJnIiwyKSk7CS8vQnVsZ2FyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI4NiwidHIiLDIpKTsJLy9UdXJrZXkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyODgsImZvIiwyKSk7CS8vRmFyb2UgSXNsYW5kcworICAgICAgICAgICAgICAgIHRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjg5LCJnZSIsMikpOyAgICAvL0Fia2hhemlhIChHZW9yZ2lhKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5MCwiZ2wiLDIpKTsJLy9HcmVlbmxhbmQgKERlbm1hcmspCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMjkyLCJzbSIsMikpOwkvL1NhbiBNYXJpbm8gKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5Mywic2wiLDIpKTsJLy9TbG92ZW5pYSAoUmVwdWJsaWMgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTQsIm1rIiwyKSk7ICAgLy9UaGUgRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDI5NSwibGkiLDIpKTsJLy9MaWVjaHRlbnN0ZWluIChQcmluY2lwYWxpdHkgb2YpCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgyOTcsIm1lIiwyKSk7ICAgIC8vTW9udGVuZWdybyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzAyLCJjYSIsMywiIiwxMSkpOwkvL0NhbmFkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMwOCwicG0iLDIpKTsJLy9TYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChDb2xsZWN0aXZpdCB0ZXJyaXRvcmlhbGUgZGUgbGEgUnB1YmxpcXVlIGZyYW5haXNlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxMywidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNCwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNSwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMxNiwidXMiLDMsImVuIiwxMSkpOwkvL1VuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMCwicHIiLDIpKTsJLy9QdWVydG8gUmljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzMiwidmkiLDIpKTsJLy9Vbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzM0LCJteCIsMykpOwkvL01leGljbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDMzOCwiam0iLDMpKTsJLy9KYW1haWNhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQwLCJncCIsMikpOwkvL0d1YWRlbG91cGUgKEZyZW5jaCBEZXBhcnRtZW50IG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0MiwiYmIiLDMpKTsJLy9CYXJiYWRvcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM0NCwiYWciLDMpKTsJLy9BbnRpZ3VhIGFuZCBCYXJidWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ2LCJreSIsMykpOwkvL0NheW1hbiBJc2xhbmRzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzQ4LCJ2ZyIsMykpOwkvL0JyaXRpc2ggVmlyZ2luIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTAsImJtIiwyKSk7CS8vQmVybXVkYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM1MiwiZ2QiLDIpKTsJLy9HcmVuYWRhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU0LCJtcyIsMikpOwkvL01vbnRzZXJyYXQKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNTYsImtuIiwyKSk7CS8vU2FpbnQgS2l0dHMgYW5kIE5ldmlzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzU4LCJsYyIsMikpOwkvL1NhaW50IEx1Y2lhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYwLCJ2YyIsMikpOwkvL1NhaW50IFZpbmNlbnQgYW5kIHRoZSBHcmVuYWRpbmVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYyLCJubCIsMikpOwkvL05ldGhlcmxhbmRzIEFudGlsbGVzCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzYzLCJhdyIsMikpOwkvL0FydWJhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY0LCJicyIsMikpOwkvL0JhaGFtYXMgKENvbW1vbndlYWx0aCBvZiB0aGUpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY1LCJhaSIsMykpOwkvL0FuZ3VpbGxhCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY2LCJkbSIsMikpOwkvL0RvbWluaWNhIChDb21tb253ZWFsdGggb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzY4LCJjdSIsMikpOwkvL0N1YmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzAsImRvIiwyKSk7CS8vRG9taW5pY2FuIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoMzcyLCJodCIsMikpOwkvL0hhaXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSgzNzQsInR0IiwyKSk7CS8vVHJpbmlkYWQgYW5kIFRvYmFnbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDM3NiwidGMiLDIpKTsJLy9UdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDAsImF6IiwyKSk7CS8vQXplcmJhaWphbmkgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDEsImt6IiwyKSk7CS8vS2F6YWtoc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDAyLCJidCIsMikpOwkvL0JodXRhbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MDQsImluIiwyKSk7CS8vSW5kaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQwNSwiaW4iLDIpKTsJLy9JbmRpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDEwLCJwayIsMikpOwkvL1Bha2lzdGFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMiwiYWYiLDIpKTsJLy9BZmdoYW5pc3RhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxMywibGsiLDIpKTsJLy9TcmkgTGFua2EgKERlbW9jcmF0aWMgU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNCwibW0iLDIpKTsJLy9NeWFubWFyIChVbmlvbiBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTUsImxiIiwyKSk7CS8vTGViYW5vbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNiwiam8iLDIpKTsJLy9Kb3JkYW4gKEhhc2hlbWl0ZSBLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxNywic3kiLDIpKTsJLy9TeXJpYW4gQXJhYiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQxOCwiaXEiLDIpKTsJLy9JcmFxIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MTksImt3IiwyKSk7CS8vS3V3YWl0IChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjAsInNhIiwyKSk7CS8vU2F1ZGkgQXJhYmlhIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMSwieWUiLDIpKTsJLy9ZZW1lbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDIyLCJvbSIsMikpOwkvL09tYW4gKFN1bHRhbmF0ZSBvZikKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyMywicHMiLDIpKTsgICAgLy9QYWxlc3RpbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjQsImFlIiwyKSk7CS8vVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjUsImlsIiwyKSk7CS8vSXNyYWVsIChTdGF0ZSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjYsImJoIiwyKSk7CS8vQmFocmFpbiAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MjcsInFhIiwyKSk7CS8vUWF0YXIgKFN0YXRlIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOCwibW4iLDIpKTsJLy9Nb25nb2xpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQyOSwibnAiLDIpKTsJLy9OZXBhbAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMCwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMSwiYWUiLDIpKTsJLy9Vbml0ZWQgQXJhYiBFbWlyYXRlcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzMiwiaXIiLDIpKTsJLy9JcmFuIChJc2xhbWljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzNCwidXoiLDIpKTsJLy9VemJla2lzdGFuIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0MzYsInRqIiwyKSk7CS8vVGFqaWtpc3RhbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDM3LCJrZyIsMikpOwkvL0t5cmd5eiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQzOCwidG0iLDIpKTsJLy9UdXJrbWVuaXN0YW4KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NDAsImpwIiwyLCJqYSIsMTQpKTsJLy9KYXBhbgorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ0MSwianAiLDIsImphIiwxNCkpOwkvL0phcGFuCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDUwLCJrciIsMiwia28iLDEzKSk7CS8vS29yZWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1Miwidm4iLDIpKTsJLy9WaWV0IE5hbSAoU29jaWFsaXN0IFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ1NCwiaGsiLDIpKTsJLy8iSG9uZyBLb25nLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTUsIm1vIiwyKSk7CS8vIk1hY2FvLCBDaGluYSIKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NTYsImtoIiwyKSk7CS8vQ2FtYm9kaWEgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDU3LCJsYSIsMikpOwkvL0xhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDYwLCJjbiIsMiwiemgiLDEzKSk7CS8vQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDQ2MSwiY24iLDIsInpoIiwxMykpOwkvL0NoaW5hIChQZW9wbGUncyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NjYsInR3IiwyKSk7CS8vIlRhaXdhbiwgQ2hpbmEiCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDY3LCJrcCIsMikpOwkvL0RlbW9jcmF0aWMgUGVvcGxlJ3MgUmVwdWJsaWMgb2YgS29yZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg0NzAsImJkIiwyKSk7CS8vQmFuZ2xhZGVzaCAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNDcyLCJtdiIsMikpOwkvL01hbGRpdmVzIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDIsIm15IiwyKSk7CS8vTWFsYXlzaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MDUsImF1IiwyLCJlbiIsMTEpKTsJLy9BdXN0cmFsaWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTAsImlkIiwyKSk7CS8vSW5kb25lc2lhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MTQsInRsIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiBUaW1vci1MZXN0ZQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUxNSwicGgiLDIpKTsJLy9QaGlsaXBwaW5lcyAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyMCwidGgiLDIpKTsJLy9UaGFpbGFuZAorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUyNSwic2ciLDIsImVuIiwxMSkpOwkvL1NpbmdhcG9yZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTI4LCJibiIsMikpOwkvL0JydW5laSBEYXJ1c3NhbGFtCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTMwLCJueiIsMiwgImVuIikpOwkvL05ldyBaZWFsYW5kCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM0LCJtcCIsMikpOwkvL05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyAoQ29tbW9ud2VhbHRoIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzUsImd1IiwyKSk7CS8vR3VhbQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDUzNiwibnIiLDIpKTsJLy9OYXVydSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTM3LCJwZyIsMikpOwkvL1BhcHVhIE5ldyBHdWluZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1MzksInRvIiwyKSk7CS8vVG9uZ2EgKEtpbmdkb20gb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQwLCJzYiIsMikpOwkvL1NvbG9tb24gSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0MSwidnUiLDIpKTsJLy9WYW51YXR1IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDIsImZqIiwyKSk7CS8vRmlqaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQzLCJ3ZiIsMikpOwkvL1dhbGxpcyBhbmQgRnV0dW5hIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ0LCJhcyIsMikpOwkvL0FtZXJpY2FuIFNhbW9hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ1LCJraSIsMikpOwkvL0tpcmliYXRpIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NDYsIm5jIiwyKSk7CS8vTmV3IENhbGVkb25pYSAoVGVycml0b2lyZSBmcmFuYWlzIGQnb3V0cmUtbWVyKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0NywicGYiLDIpKTsJLy9GcmVuY2ggUG9seW5lc2lhIChUZXJyaXRvaXJlIGZyYW5haXMgZCdvdXRyZS1tZXIpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTQ4LCJjayIsMikpOwkvL0Nvb2sgSXNsYW5kcworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDU0OSwid3MiLDIpKTsJLy9TYW1vYSAoSW5kZXBlbmRlbnQgU3RhdGUgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUwLCJmbSIsMikpOwkvL01pY3JvbmVzaWEgKEZlZGVyYXRlZCBTdGF0ZXMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNTUxLCJtaCIsMikpOwkvL01hcnNoYWxsIElzbGFuZHMgKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg1NTIsInB3IiwyKSk7CS8vUGFsYXUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwMiwiZWciLDIpKTsJLy9FZ3lwdCAoQXJhYiBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDMsImR6IiwyKSk7CS8vQWxnZXJpYSAoUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDQsIm1hIiwyKSk7CS8vTW9yb2NjbyAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDUsInRuIiwyKSk7CS8vVHVuaXNpYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwNiwibHkiLDIpKTsJLy9MaWJ5YSAoU29jaWFsaXN0IFBlb3BsZSdzIExpYnlhbiBBcmFiIEphbWFoaXJpeWEpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjA3LCJnbSIsMikpOwkvL0dhbWJpYSAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYwOCwic24iLDIpKTsJLy9TZW5lZ2FsIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MDksIm1yIiwyKSk7CS8vTWF1cml0YW5pYSAoSXNsYW1pYyBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MTAsIm1sIiwyKSk7CS8vTWFsaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjExLCJnbiIsMikpOwkvL0d1aW5lYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEyLCJjaSIsMikpOwkvL0N0ZSBkJ0l2b2lyZSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjEzLCJiZiIsMikpOwkvL0J1cmtpbmEgRmFzbworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNCwibmUiLDIpKTsJLy9OaWdlciAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNSwidGciLDIpKTsJLy9Ub2dvbGVzZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxNiwiYmoiLDIpKTsJLy9CZW5pbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE3LCJtdSIsMikpOwkvL01hdXJpdGl1cyAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjE4LCJsciIsMikpOwkvL0xpYmVyaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYxOSwic2wiLDIpKTsJLy9TaWVycmEgTGVvbmUKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjAsImdoIiwyKSk7CS8vR2hhbmEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjEsIm5nIiwyKSk7CS8vTmlnZXJpYSAoRmVkZXJhbCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjIsInRkIiwyKSk7CS8vQ2hhZCAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjIzLCJjZiIsMikpOwkvL0NlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNCwiY20iLDIpKTsJLy9DYW1lcm9vbiAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI1LCJjdiIsMikpOwkvL0NhcGUgVmVyZGUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYyNiwic3QiLDIpKTsJLy9TYW8gVG9tZSBhbmQgUHJpbmNpcGUgKERlbW9jcmF0aWMgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjI3LCJncSIsMikpOwkvL0VxdWF0b3JpYWwgR3VpbmVhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjgsImdhIiwyKSk7CS8vR2Fib25lc2UgUmVwdWJsaWMKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MjksImNnIiwyKSk7CS8vQ29uZ28gKFJlcHVibGljIG9mIHRoZSkKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzAsImNnIiwyKSk7CS8vRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28KKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzEsImFvIiwyKSk7CS8vQW5nb2xhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2MzIsImd3IiwyKSk7CS8vR3VpbmVhLUJpc3NhdSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjMzLCJzYyIsMikpOwkvL1NleWNoZWxsZXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNCwic2QiLDIpKTsJLy9TdWRhbiAoUmVwdWJsaWMgb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNSwicnciLDIpKTsJLy9Sd2FuZGEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNiwiZXQiLDIpKTsJLy9FdGhpb3BpYSAoRmVkZXJhbCBEZW1vY3JhdGljIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzNywic28iLDIpKTsJLy9Tb21hbGkgRGVtb2NyYXRpYyBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDYzOCwiZGoiLDIpKTsJLy9Eamlib3V0aSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjM5LCJrZSIsMikpOwkvL0tlbnlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDAsInR6IiwyKSk7CS8vVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDEsInVnIiwyKSk7CS8vVWdhbmRhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDIsImJpIiwyKSk7CS8vQnVydW5kaSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQzLCJteiIsMikpOwkvL01vemFtYmlxdWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NSwiem0iLDIpKTsJLy9aYW1iaWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY0NiwibWciLDIpKTsJLy9NYWRhZ2FzY2FyIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDcsInJlIiwyKSk7CS8vUmV1bmlvbiAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjQ4LCJ6dyIsMikpOwkvL1ppbWJhYndlIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NDksIm5hIiwyKSk7CS8vTmFtaWJpYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUwLCJtdyIsMikpOwkvL01hbGF3aQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MSwibHMiLDIpKTsJLy9MZXNvdGhvIChLaW5nZG9tIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1MiwiYnciLDIpKTsJLy9Cb3Rzd2FuYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjUzLCJzeiIsMikpOwkvL1N3YXppbGFuZCAoS2luZ2RvbSBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg2NTQsImttIiwyKSk7CS8vQ29tb3JvcyAoVW5pb24gb2YgdGhlKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDY1NSwiemEiLDIsImVuIikpOwkvL1NvdXRoIEFmcmljYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNjU3LCJlciIsMikpOwkvL0VyaXRyZWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDIsImJ6IiwyKSk7CS8vQmVsaXplCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA0LCJndCIsMikpOwkvL0d1YXRlbWFsYSAoUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzA2LCJzdiIsMikpOwkvL0VsIFNhbHZhZG9yIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MDgsImhuIiwzKSk7CS8vSG9uZHVyYXMgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxMCwibmkiLDIpKTsJLy9OaWNhcmFndWEKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MTIsImNyIiwyKSk7CS8vQ29zdGEgUmljYQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNCwicGEiLDIpKTsJLy9QYW5hbWEgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcxNiwicGUiLDIpKTsJLy9QZXJ1CisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzIyLCJhciIsMykpOwkvL0FyZ2VudGluZSBSZXB1YmxpYworCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDcyNCwiYnIiLDIpKTsJLy9CcmF6aWwgKEZlZGVyYXRpdmUgUmVwdWJsaWMgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMwLCJjbCIsMikpOwkvL0NoaWxlCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzMyLCJjbyIsMykpOwkvL0NvbG9tYmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzQsInZlIiwyKSk7CS8vVmVuZXp1ZWxhIChCb2xpdmFyaWFuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDczNiwiYm8iLDIpKTsJLy9Cb2xpdmlhIChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3MzgsImd5IiwyKSk7CS8vR3V5YW5hCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQwLCJlYyIsMikpOwkvL0VjdWFkb3IKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDIsImdmIiwyKSk7CS8vRnJlbmNoIEd1aWFuYSAoRnJlbmNoIERlcGFydG1lbnQgb2YpCisJCXRhYmxlLmFkZChuZXcgTWNjRW50cnkoNzQ0LCJweSIsMikpOwkvL1BhcmFndWF5IChSZXB1YmxpYyBvZikKKwkJdGFibGUuYWRkKG5ldyBNY2NFbnRyeSg3NDYsInNyIiwyKSk7CS8vU3VyaW5hbWUgKFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc0OCwidXkiLDIpKTsJLy9VcnVndWF5IChFYXN0ZXJuIFJlcHVibGljIG9mKQorCQl0YWJsZS5hZGQobmV3IE1jY0VudHJ5KDc1MCwiZmsiLDIpKTsJLy9GYWxrbGFuZCBJc2xhbmRzIChNYWx2aW5hcykKKyAgICAgICAgLy90YWJsZS5hZGQobmV3IE1jY0VudHJ5KDkwMSwiIiwyKSk7CS8vIkludGVybmF0aW9uYWwgTW9iaWxlLCBzaGFyZWQgY29kZSIKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRhYmxlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCmluZGV4IDNkZDlhMDEuLmZmZmUwNTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZS5qYXZhCkBAIC0xNywxMCArMTcsOSBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CkBAIC0yOCw3ICsyNyw2IEBACiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNvbm5lY3Rpb247CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbURhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtOTksMTEgKzk3LDExIEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORV9OQU1FX0tFWSA9ICJwaG9uZU5hbWUiOwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUFTT05fS0VZID0gInJlYXNvbiI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9DSEFOR0VfUkVBU09OX0tFWSA9ICJyZWFzb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRVNfS0VZID0gImFwblR5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9BUE5fVFlQRV9LRVkgPSAiYXBuVHlwZSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0FQTl9LRVkgPSAiYXBuIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTElOS19QUk9QRVJUSUVTX0tFWSA9ICJsaW5rUHJvcGVydGllcyI7CiAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfSUZBQ0VfTkFNRV9LRVkgPSAiaWZhY2UiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9HQVRFV0FZX0tFWSA9ICJnYXRld2F5IjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktfVU5BVkFJTEFCTEVfS0VZID0gIm5ldHdvcmtVbnZhaWxhYmxlIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FX0lOX0VDTV9TVEFURSA9ICJwaG9uZWluRUNNU3RhdGUiOwogCkBAIC0yNDMsMTMgKzI0MSwyMSBAQAogICAgIENlbGxMb2NhdGlvbiBnZXRDZWxsTG9jYXRpb24oKTsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKLSAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICogR2V0IHRoZSBjdXJyZW50IGZvciB0aGUgZGVmYXVsdCBhcG4gRGF0YVN0YXRlLiBObyBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgICAgICogZXhpc3RzIGF0IHRoaXMgaW50ZXJmYWNlIC0tIHVzZQogICAgICAqIHtAbGluayBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXJ9IGluc3RlYWQuCiAgICAgICovCiAgICAgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKTsKIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBEYXRhU3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKKyAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCisgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlBob25lU3RhdGVMaXN0ZW5lcn0gaW5zdGVhZC4KKyAgICAgKiBAcGFyYW0gYXBuVHlwZSBzcGVjaWZ5IGZvciB3aGljaCBhcG4gdG8gZ2V0IGNvbm5lY3Rpb24gc3RhdGUgaW5mby4KKyAgICAgKi8KKyAgICBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRGF0YUFjdGl2aXR5U3RhdGUuIE5vIGNoYW5nZSBub3RpZmljYXRpb24gZXhpc3RzIGF0IHRoaXMKICAgICAgKiBpbnRlcmZhY2UgLS0gdXNlCiAgICAgICoge0BsaW5rIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXJ9IGluc3RlYWQuCkBAIC0zMTMsNiArMzE5LDExIEBACiAgICAgU3RyaW5nIGdldEFjdGl2ZUFwbigpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5hbWVkIGFwbiBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSk7CisKKyAgICAvKioKICAgICAgKiBHZXQgY3VycmVudCBzaWduYWwgc3RyZW5ndGguIE5vIGNoYW5nZSBub3RpZmljYXRpb24gYXZhaWxhYmxlIG9uIHRoaXMKICAgICAgKiBpbnRlcmZhY2UuIFVzZSA8Y29kZT5QaG9uZVN0YXRlTm90aWZpZXI8L2NvZGU+IG9yIGFuIGVxdWl2YWxlbnQuCiAgICAgICogQW4gQVNVIGlzIDAtMzEgb3IgLTEgaWYgdW5rbm93biAoZm9yIEdTTSwgZEJtID0gLTExMyAtIDIgKiBhc3UpLgpAQCAtMTM2OCwyOSArMTM3OSw2IEBACiAgICAgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIEFQTiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZ2F0ZXdheSBmb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNwZWNpZmllZCBBUE4KLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEROUyBzZXJ2ZXJzIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogQVBOIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpOwotCi0gICAgLyoqCiAgICAgICogUmV0cmlldmVzIHRoZSB1bmlxdWUgZGV2aWNlIElELCBlLmcuLCBJTUVJIGZvciBHU00gcGhvbmVzIGFuZCBNRUlEIGZvciBDRE1BIHBob25lcy4KICAgICAgKi8KICAgICBTdHJpbmcgZ2V0RGV2aWNlSWQoKTsKQEAgLTE1MzUsNiArMTUyMywxMSBAQAogICAgIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cik7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgT1RBIFNlcnZpY2UgUHJvdmlzaW9uaW5nIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBib29sZWFuIG5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpOworCisgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgd2hlbiBDRE1BIGNhbGwgd2FpdGluZyBjb21lcwogICAgICAqCiAgICAgICogQHBhcmFtIGggSGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZS4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQppbmRleCAxZGE5ZDRkLi43OGNlNDczIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5TaGFyZWRQcmVmZXJlbmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtMzUsMTAgKzM2LDggQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbURhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIApAQCAtNzM3LDggKzczNiwxMyBAQAogICAgICAgICBtTm90aWZpZXIubm90aWZ5TWVzc2FnZVdhaXRpbmdDaGFuZ2VkKHRoaXMpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSwgc3RhdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlKSB7CisgICAgICAgIG1Ob3RpZmllci5ub3RpZnlEYXRhQ29ubmVjdGlvbih0aGlzLCByZWFzb24sIGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGhvbmVOYW1lKCk7CkBAIC04MjQsOSArODI4LDE5IEBACiAgICAgICAgIGxvZ1VuZXhwZWN0ZWRDZG1hTWV0aG9kQ2FsbCgidW5yZWdpc3RlckZvclN1YnNjcmlwdGlvbkluZm9SZWFkeSIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBPVEEgU2VydmljZSBQcm92aXNpb25pbmcgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICAgICAqIElmIG5vdCBvdmVycmlkZGVuIHJldHVybiBmYWxzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXIgaXMgYW4gT1RBU1AgbnVtYmVyLgorICAgICAqIElmIG5vdCBvdmVycmlkZGVuIHJldHVybiBmYWxzZS4KKyAgICAgKi8KICAgICBwdWJsaWMgIGJvb2xlYW4gaXNPdGFTcE51bWJlcihTdHJpbmcgZGlhbFN0cikgewotICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjbGFzcyBDRE1BUGhvbmUuIE5vdCBpbXBsZW1lbnRlZCBpbiBHU01QaG9uZS4KLSAgICAgICAgbG9nVW5leHBlY3RlZENkbWFNZXRob2RDYWxsKCJpc090YVNwTnVtYmVyIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTkxNiwzMCArOTMwLDE4IEBACiAgICAgICAgICBsb2dVbmV4cGVjdGVkQ2RtYU1ldGhvZENhbGwoInVuc2V0T25FY2JNb2RlRXhpdFJlc3BvbnNlIik7CiAgICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEludGVyZmFjZU5hbWUoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRJcEFkZHJlc3MoYXBuVHlwZSk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5RW5hYmxlZCgpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXREYXRhRW5hYmxlZCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEdhdGV3YXkoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXREbnNTZXJ2ZXJzKGFwblR5cGUpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3RpdmVBcG5UeXBlcygpIHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5nZXRBY3RpdmVBcG5UeXBlcygpOwogICAgIH0KIAorICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldExpbmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZlQXBuKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uLmdldEFjdGl2ZUFwblN0cmluZygpOwogICAgIH0KQEAgLTk1Miw2ICs5NTQsMTAgQEAKICAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvbi5kaXNhYmxlQXBuVHlwZSh0eXBlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuICgobURhdGFDb25uZWN0aW9uICE9IG51bGwpICYmIChtRGF0YUNvbm5lY3Rpb24uaXNEYXRhUG9zc2libGUoKSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIHNpbXVsYXRlRGF0YUNvbm5lY3Rpb24KICAgICAgKgpAQCAtOTgwLDcgKzk4Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtRGF0YUNvbm5lY3Rpb24uc2V0U3RhdGUoZGNTdGF0ZSk7Ci0gICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsLCBQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMzQsNiArMTA0MCwxMCBAQAogICAgICAgICAgICAgICAgICJjYWxsZWQsIENETUFQaG9uZSBpbmFjdGl2ZS4iKTsKICAgICB9CiAKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBnZXREYXRhQ29ubmVjdGlvblN0YXRlKEFQTl9UWVBFX0RFRkFVTFQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbW1vbiBlcnJvciBsb2dnZXIgbWV0aG9kIGZvciB1bmV4cGVjdGVkIGNhbGxzIHRvIEdTTS9XQ0RNQS1vbmx5IG1ldGhvZHMuCiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTm90aWZpZXIuamF2YQppbmRleCBlOTZlZWFlLi42OTEyNzFmIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOb3RpZmllci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZU5vdGlmaWVyLmphdmEKQEAgLTMzLDkgKzMzLDEyIEBACiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlDYWxsRm9yd2FyZGluZ0NoYW5nZWQoUGhvbmUgc2VuZGVyKTsKIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbik7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pOworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUsCisgICAgICAgICAgICBQaG9uZS5EYXRhU3RhdGUgc3RhdGUpOworCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSk7CiAKICAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQWN0aXZpdHkoUGhvbmUgc2VuZGVyKTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKaW5kZXggNWU3ZGNiMC4uYjZlNGNkYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCkBAIC0yMCwxMyArMjAsMTEgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LkNlbGxMb2NhdGlvbjsKLWltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZVN0YXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU2VydmljZVN0YXRlOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNpZ25hbFN0cmVuZ3RoOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0zNCw3ICszMiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuQ0RNQVBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5OZXR3b3JrSW5mbzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbURhdGFDb25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS50ZXN0LlNpbXVsYXRlZFJhZGlvQ29udHJvbDsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMTcyLDcgKzE2OSwxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShQaG9uZS5BUE5fVFlQRV9ERUZBVUxUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREYXRhQ29ubmVjdGlvblN0YXRlKGFwblR5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhQWN0aXZpdHlTdGF0ZSBnZXREYXRhQWN0aXZpdHlTdGF0ZSgpIHsKQEAgLTIwNyw2ICsyMDgsMTAgQEAKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRBY3RpdmVBcG5UeXBlcygpOwogICAgIH0KIAorICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRMaW5rUHJvcGVydGllcyhTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldExpbmtQcm9wZXJ0aWVzKGFwblR5cGUpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZlQXBuKCkgewogICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEFjdGl2ZUFwbigpOwogICAgIH0KQEAgLTY2MCwyMiArNjY1LDYgQEAKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlTmFtZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldEludGVyZmFjZU5hbWUoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJcEFkZHJlc3MoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXRJcEFkZHJlc3MoYXBuVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIHJldHVybiBtQWN0aXZlUGhvbmUuZ2V0R2F0ZXdheShhcG5UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RG5zU2VydmVycyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmdldERuc1NlcnZlcnMoYXBuVHlwZSk7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZyBnZXREZXZpY2VJZCgpIHsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5nZXREZXZpY2VJZCgpOwogICAgIH0KQEAgLTc2NCw2ICs3NTMsMTAgQEAKICAgICAgICAgbUFjdGl2ZVBob25lLmV4aXRFbWVyZ2VuY3lDYWxsYmFja01vZGUoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKXsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBpc090YVNwTnVtYmVyKFN0cmluZyBkaWFsU3RyKXsKICAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc090YVNwTnVtYmVyKGRpYWxTdHIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQppbmRleCA1NjlhYzVjLi44YzIyODBiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1JJTC5qYXZhCkBAIC0yODUsOSArMjg1LDggQEAKICAgICAgICAgfQogCiAKLSAgICAgICAgLy8qKioqKiBIYW5kbGVyIGltcGxlbWVtZW50YXRpb24KLQotICAgICAgICBwdWJsaWMgdm9pZAorICAgICAgICAvLyoqKioqIEhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkCiAgICAgICAgIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIFJJTFJlcXVlc3QgcnIgPSAoUklMUmVxdWVzdCkobXNnLm9iaik7CiAgICAgICAgICAgICBSSUxSZXF1ZXN0IHJlcSA9IG51bGw7CkBAIC03ODAsNyArNzc5LDcgQEAKICAgICAgICAgc2VuZChycik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQKKyAgICBARGVwcmVjYXRlZCBwdWJsaWMgdm9pZAogICAgIGdldFBEUENvbnRleHRMaXN0KE1lc3NhZ2UgcmVzdWx0KSB7CiAgICAgICAgIGdldERhdGFDYWxsTGlzdChyZXN1bHQpOwogICAgIH0KQEAgLTEyOTksMTAgKzEyOTgsMTggQEAKICAgICBwdWJsaWMgdm9pZAogICAgIHNldHVwRGF0YUNhbGwoU3RyaW5nIHJhZGlvVGVjaG5vbG9neSwgU3RyaW5nIHByb2ZpbGUsIFN0cmluZyBhcG4sCiAgICAgICAgICAgICBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgYXV0aFR5cGUsIE1lc3NhZ2UgcmVzdWx0KSB7CisgICAgICAgIHNldHVwRGF0YUNhbGxXaXRoUHJvdG9jb2wocmFkaW9UZWNobm9sb2d5LCBwcm9maWxlLCBhcG4sIHVzZXIsIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFR5cGUsICJJUCIsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQKKyAgICBzZXR1cERhdGFDYWxsV2l0aFByb3RvY29sKFN0cmluZyByYWRpb1RlY2hub2xvZ3ksIFN0cmluZyBwcm9maWxlLAorICAgICAgICAgICAgU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGF1dGhUeXBlLAorICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sVHlwZSwgTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgUklMUmVxdWVzdCBycgogICAgICAgICAgICAgICAgID0gUklMUmVxdWVzdC5vYnRhaW4oUklMX1JFUVVFU1RfU0VUVVBfREFUQV9DQUxMLCByZXN1bHQpOwogCi0gICAgICAgIHJyLm1wLndyaXRlSW50KDYpOworICAgICAgICByci5tcC53cml0ZUludCg3KTsKIAogICAgICAgICByci5tcC53cml0ZVN0cmluZyhyYWRpb1RlY2hub2xvZ3kpOwogICAgICAgICByci5tcC53cml0ZVN0cmluZyhwcm9maWxlKTsKQEAgLTEzMTAsMTEgKzEzMTcsMTIgQEAKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcodXNlcik7CiAgICAgICAgIHJyLm1wLndyaXRlU3RyaW5nKHBhc3N3b3JkKTsKICAgICAgICAgcnIubXAud3JpdGVTdHJpbmcoYXV0aFR5cGUpOworICAgICAgICByci5tcC53cml0ZVN0cmluZyhwcm90b2NvbFR5cGUpOwogCiAgICAgICAgIGlmIChSSUxKX0xPR0QpIHJpbGpMb2cocnIuc2VyaWFsU3RyaW5nKCkgKyAiPiAiCiAgICAgICAgICAgICAgICAgKyByZXF1ZXN0VG9TdHJpbmcocnIubVJlcXVlc3QpICsgIiAiICsgcmFkaW9UZWNobm9sb2d5ICsgIiAiCiAgICAgICAgICAgICAgICAgKyBwcm9maWxlICsgIiAiICsgYXBuICsgIiAiICsgdXNlciArICIgIgotICAgICAgICAgICAgICAgICsgcGFzc3dvcmQgKyAiICIgKyBhdXRoVHlwZSk7CisgICAgICAgICAgICAgICAgKyBwYXNzd29yZCArICIgIiArIGF1dGhUeXBlICsgIiAiICsgcHJvdG9jb2xUeXBlKTsKIAogICAgICAgICBzZW5kKHJyKTsKICAgICB9CkBAIC0yOTAyLDcgKzI5MTAsMTEgQEAKICAgICAgICAgICAgIGRhdGFDYWxsLmFjdGl2ZSA9IHAucmVhZEludCgpOwogICAgICAgICAgICAgZGF0YUNhbGwudHlwZSA9IHAucmVhZFN0cmluZygpOwogICAgICAgICAgICAgZGF0YUNhbGwuYXBuID0gcC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBkYXRhQ2FsbC5hZGRyZXNzID0gcC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IHAucmVhZFN0cmluZygpOworICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLnNwbGl0KCIgIilbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhQ2FsbC5hZGRyZXNzID0gYWRkcmVzczsKIAogICAgICAgICAgICAgcmVzcG9uc2UuYWRkKGRhdGFDYWxsKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKaW5kZXggOTE3ZTFkOC4uM2E3Y2U0NyAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCkBAIC0yNTUsNiArMjU1LDcgQEAKICAgICAgICAgbUNtLnVucmVnaXN0ZXJGb3JPbih0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiU01TRGlzcGF0Y2hlciBmaW5hbGl6ZWQiKTsKICAgICB9CkBAIC05MjcsMTQgKzkyOCwxNCBAQAogICAgICAqLwogICAgIHN0YXRpYyBwcm90ZWN0ZWQgY2xhc3MgU21zVHJhY2tlciB7CiAgICAgICAgIC8vIGZpZWxkcyBuZWVkIHRvIGJlIHB1YmxpYyBmb3IgZGVyaXZlZCBTbXNEaXNwYXRjaGVycwotICAgICAgICBwdWJsaWMgSGFzaE1hcCBtRGF0YTsKKyAgICAgICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1EYXRhOwogICAgICAgICBwdWJsaWMgaW50IG1SZXRyeUNvdW50OwogICAgICAgICBwdWJsaWMgaW50IG1NZXNzYWdlUmVmOwogCiAgICAgICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IG1TZW50SW50ZW50OwogICAgICAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBtRGVsaXZlcnlJbnRlbnQ7CiAKLSAgICAgICAgU21zVHJhY2tlcihIYXNoTWFwIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKKyAgICAgICAgU21zVHJhY2tlcihIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCiAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBkZWxpdmVyeUludGVudCkgewogICAgICAgICAgICAgbURhdGEgPSBkYXRhOwogICAgICAgICAgICAgbVNlbnRJbnRlbnQgPSBzZW50SW50ZW50OwpAQCAtOTQzLDcgKzk0NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU21zVHJhY2tlciBTbXNUcmFja2VyRmFjdG9yeShIYXNoTWFwIGRhdGEsIFBlbmRpbmdJbnRlbnQgc2VudEludGVudCwKKyAgICBwcm90ZWN0ZWQgU21zVHJhY2tlciBTbXNUcmFja2VyRmFjdG9yeShIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7CiAgICAgICAgIHJldHVybiBuZXcgU21zVHJhY2tlcihkYXRhLCBzZW50SW50ZW50LCBkZWxpdmVyeUludGVudCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaXBQaG9uZU5vdGlmaWVyLmphdmEKaW5kZXggNDA5MmM2OS4uMzBkMDZkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NpcFBob25lTm90aWZpZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2lwUGhvbmVOb3RpZmllci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwogCitpbXBvcnQgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTk0LDI2ICs5NSw0MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShhcG5UeXBlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICBkb05vdGlmeURhdGFDb25uZWN0aW9uKHNlbmRlciwgcmVhc29uLCBhcG5UeXBlLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvTm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSwKKyAgICAgICAgICAgIFBob25lLkRhdGFTdGF0ZSBzdGF0ZSkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIC8vIHVzZSBhcG5UeXBlIGFzIHRoZSBrZXkgdG8gd2hpY2ggY29ubmVjdGlvbiB3ZSdyZSB0YWxraW5nIGFib3V0LgorICAgICAgICAvLyBwYXNzIGFwblR5cGUgYmFjayB1cCB0byBmZXRjaCBwYXJ0aWN1bGFyIGZvciB0aGlzIG9uZS4KICAgICAgICAgVGVsZXBob255TWFuYWdlciB0ZWxlcGhvbnkgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKTsKKyAgICAgICAgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMgPSBudWxsOworICAgICAgICBpZiAoc3RhdGUgPT0gUGhvbmUuRGF0YVN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMgPSBzZW5kZXIuZ2V0TGlua1Byb3BlcnRpZXMoYXBuVHlwZSk7CisgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1SZWdpc3RyeS5ub3RpZnlEYXRhQ29ubmVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzZW5kZXIuZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydERhdGFTdGF0ZShzdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpLCByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBY3RpdmVBcG4oKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEFjdGl2ZUFwblR5cGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5nZXRJbnRlcmZhY2VOYW1lKG51bGwpLAorICAgICAgICAgICAgICAgICAgICBhcG5UeXBlLAorICAgICAgICAgICAgICAgICAgICBsaW5rUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgKCh0ZWxlcGhvbnkhPW51bGwpID8gdGVsZXBob255LmdldE5ldHdvcmtUeXBlKCkgOgotICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSwKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldEdhdGV3YXkobnVsbCkpOworICAgICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLk5FVFdPUktfVFlQRV9VTktOT1dOKSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy8gc3lzdGVtIHByb2Nlc3MgaXMgZGVhZAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uKSB7CisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVJlZ2lzdHJ5Lm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHJlYXNvbik7CisgICAgICAgICAgICBtUmVnaXN0cnkubm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQocmVhc29uLCBhcG5UeXBlKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBpcyBkZWFkCiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNIZWFkZXIuamF2YQppbmRleCA3ODcyZWVjLi43YTY1MTYyIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU21zSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc0hlYWRlci5qYXZhCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTbXNIZWFkZXIgewogCi0gICAgLy8gVE9ETyhjbGVhbnVwKTogdGhpcyBkYXRhc3RydWN0dXJlIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcworICAgIC8vIFRPRE8oY2xlYW51cCk6IHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzCiAgICAgLy8gdGhlICd1c2VyIGRhdGEgaGVhZGVyJyBvciBVREgsIGFuZCBzbyB0aGUgY2xhc3MgbmFtZSBzaG91bGQKICAgICAvLyBjaGFuZ2UgdG8gcmVmbGVjdCB0aGlzLi4uCiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TbXNNZXNzYWdlQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKaW5kZXggYWY2YzVmOC4uY2JkODYwNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Ntc01lc3NhZ2VCYXNlLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtMzY2LDEzICszNjUsMTMgQEAKICAgICAvKioKICAgICAgKiBUcnkgdG8gcGFyc2UgdGhpcyBtZXNzYWdlIGFzIGFuIGVtYWlsIGdhdGV3YXkgbWVzc2FnZQogICAgICAqIFRoZXJlIGFyZSB0d28gd2F5cyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQwIFNlY3Rpb24gMy44IDoKLSAgICAgKiAgLSBTTVMgbWVzc2FnZSAibWF5IGhhdmUgaXRzIFRQLVBJRCBzZXQgZm9yIGludGVybmV0IGVsZWN0cm9uaWMgbWFpbCAtIE1UCisgICAgICogIC0gU01TIG1lc3NhZ2UgIm1heSBoYXZlIGl0cyBUUC1QSUQgc2V0IGZvciBJbnRlcm5ldCBlbGVjdHJvbmljIG1haWwgLSBNVAogICAgICAqIFNNUyBmb3JtYXQ6IFs8ZnJvbS1hZGRyZXNzPjxzcGFjZT5dPG1lc3NhZ2U+IC0gIkRlcGVuZGluZyBvbiB0aGUKICAgICAgKiBuYXR1cmUgb2YgdGhlIGdhdGV3YXksIHRoZSBkZXN0aW5hdGlvbi9vcmlnaW5hdGlvbiBhZGRyZXNzIGlzIGVpdGhlcgogICAgICAqIGRlcml2ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgU01TIFRQLU9BIG9yIFRQLURBIGZpZWxkLCBvciB0aGUKICAgICAgKiBUUC1PQS9UUC1EQSBmaWVsZCBjb250YWlucyBhIGdlbmVyaWMgZ2F0ZXdheSBhZGRyZXNzIGFuZCB0aGUgdG8vZnJvbQogICAgICAqIGFkZHJlc3MgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBhcyBzaG93biBhYm92ZS4iICh3aGljaCBpcyBzdXBwb3J0ZWQgaGVyZSkKLSAgICAgKiAtIE11bHRpcGxlIGFkZHJlc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIG5vIHNwYWNlcywgU3ViamVjdCBmaWVsZCBkZWxpbWl0ZWQKKyAgICAgKiAtIE11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLCBubyBzcGFjZXMsIFN1YmplY3QgZmllbGQgZGVsaW1pdGVkCiAgICAgICogYnkgJygpJyBvciAnIyMnIGFuZCAnIycgU2VjdGlvbiA5LjIuMy4yNC4xMSAod2hpY2ggYXJlIE5PVCBzdXBwb3J0ZWQgaGVyZSkKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0RW1haWxBZGRyZXNzRnJvbU1lc3NhZ2VCb2R5KCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZWxlcGhvbnlQcm9wZXJ0aWVzLmphdmEKaW5kZXggYTExMzc4Ny4uMTM2ZDViMSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1RlbGVwaG9ueVByb3BlcnRpZXMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVsZXBob255UHJvcGVydGllcy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICogIENETUEgbmV0d29ya3MuCiAgICAgICovCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PUEVSQVRPUl9BTFBIQSA9ICJnc20ub3BlcmF0b3IuYWxwaGEiOwotICAgIC8vVE9ETzogbW9zdCBvZiB0aGVzZSBwcm9wcmlldGllcyBhcmUgZ2VuZXJpYywgc3Vic3RpdHV0ZSBnc20uIHdpdGggcGhvbmUuIGJ1ZyAxODU2OTU5CisgICAgLy9UT0RPOiBtb3N0IG9mIHRoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyaWMsIHN1YnN0aXR1dGUgZ3NtLiB3aXRoIHBob25lLiBidWcgMTg1Njk1OQogCiAgICAgLyoqIE51bWVyaWMgbmFtZSAoTUNDK01OQykgb2YgY3VycmVudCByZWdpc3RlcmVkIG9wZXJhdG9yLjxwPgogICAgICAqICBBdmFpbGFiaWxpdHk6IHdoZW4gcmVnaXN0ZXJlZCB0byBhIG5ldHdvcmsuIFJlc3VsdCBtYXkgYmUgdW5yZWxpYWJsZSBvbgpAQCAtODMsMTIgKzgzLDEyIEBACiAKICAgICAvKiogVGhlIE1DQytNTkMgKG1vYmlsZSBjb3VudHJ5IGNvZGUrbW9iaWxlIG5ldHdvcmsgY29kZSkgb2YgdGhlCiAgICAgICogIHByb3ZpZGVyIG9mIHRoZSBTSU0uIDUgb3IgNiBkZWNpbWFsIGRpZ2l0cy4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfTlVNRVJJQyA9ICJnc20uc2ltLm9wZXJhdG9yLm51bWVyaWMiOwogCiAgICAgLyoqIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSBpcyBhbHNvIGtub3duIGFzIHRoZSBTUE4sIG9yIFNlcnZpY2UgUHJvdmlkZXIgTmFtZS4KLSAgICAgKiAgQXZhaWxhYmxpdHk6IFNJTSBzdGF0ZSBtdXN0IGJlICJSRUFEWSIKKyAgICAgKiAgQXZhaWxhYmlsaXR5OiBTSU0gc3RhdGUgbXVzdCBiZSAiUkVBRFkiCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfQUxQSEEgPSAiZ3NtLnNpbS5vcGVyYXRvci5hbHBoYSI7CiAKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAicm8udGVsZXBob255LmNhbGxfcmluZy5tdWx0aXBsZSI7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpLXNlY29uZHMgYmV0d2VlbiBDQUxMX1JJTkcgbm90aWZpY2F0aW9ucy4KKyAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIENBTExfUklORyBub3RpZmljYXRpb25zLgogICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ0FMTF9SSU5HX0RFTEFZID0gInJvLnRlbGVwaG9ueS5jYWxsX3JpbmcuZGVsYXkiOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCmluZGV4IGYzMWJmMjQuLjZlNTNlYzUgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC01MTUsMTQgKzUxNSw2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgIGdldERhdGFDb25uZWN0aW9uU3RhdGUoKSA9PSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwotICAgICAgICByZXR1cm4gIW5vRGF0YSAmJiBnZXRJY2NDYXJkKCkuZ2V0U3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlJFQURZICYmCi0gICAgICAgICAgICAgICAgZ2V0U2VydmljZVN0YXRlKCkuZ2V0U3RhdGUoKSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgotICAgICAgICAgICAgICAgIChtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSB8fCAhZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBNTUkgZnJvbSB0aGUgcGVuZGluZyBsaXN0IGFuZCBub3RpZmllcyByZWdpc3RyYW50cyB0aGF0CiAgICAgICogaXQgaXMgY29tcGxldGUuCkBAIC02MTMsNyArNjA1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtNjI1LDYgKzYxNyw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtODc4LDI2ICs4NzIsNiBAQAogICAgICAgICBtUnVpbVJlY29yZHMuc2V0Vm9pY2VNZXNzYWdlV2FpdGluZygxLCBtd2kpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBDRE1BIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCi0gICAgICovCi0gICAgLyogcGFja2FnZSAqLyBib29sZWFuCi0gICAgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgewotICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOwotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7Ci0gICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGl0RW1lcmdlbmN5Q2FsbGJhY2tNb2RlKCkgewogICAgICAgICBpZiAobVdha2VMb2NrLmlzSGVsZCgpKSB7CkBAIC0xMTkxLDYgKzExNjUsMjYgQEAKICAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIE9UQSBTZXJ2aWNlIFByb3Zpc2lvbmluZyBuZWVkcyB0byBiZSBwZXJmb3JtZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkgeworICAgICAgICBTdHJpbmcgY2RtYU1pbiA9IGdldENkbWFNaW4oKTsKKyAgICAgICAgYm9vbGVhbiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICAgICAgaWYgKGNkbWFNaW4gPT0gbnVsbCB8fCAoY2RtYU1pbi5sZW5ndGgoKSA8IDYpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAibmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nOiBpbGxlZ2FsIGNkbWFNaW49JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2RtYU1pbiArICInIGFzc3VtZSBwcm92aXNpb25pbmcgbmVlZGVkLiIpOworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmVlZHNQcm92aXNpb25pbmcgPSAoY2RtYU1pbi5lcXVhbHMoVU5BQ1RJVkFURURfTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB8fCBjZG1hTWluLnN1YnN0cmluZygwLDYpLmVxdWFscyhVTkFDVElWQVRFRF9NSU4yX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgU3lzdGVtUHJvcGVydGllcy5nZXRCb29sZWFuKCJ0ZXN0X2NkbWFfc2V0dXAiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgTG9nLmQoTE9HX1RBRywgIm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZzogcmV0PSIgKyBuZWVkc1Byb3Zpc2lvbmluZyk7CisgICAgICAgIHJldHVybiBuZWVkc1Byb3Zpc2lvbmluZzsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVM2ODNBX0ZFQVRVUkVfQ09ERSA9ICIqMjI4IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX0ZFQVRVUkVfQ09ERV9OVU1fRElHSVRTID0gNDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVM2ODNBX1NZU19TRUxfQ09ERV9OVU1fRElHSVRTID0gMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQppbmRleCA5ZjJhNDRiLi41OTE4MjQ1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yMywxNCArMjMsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Jlc3VsdDsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKQEAgLTUwLDggKzQ4LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRXZlbnRMb2dUYWdzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uQXBuU2V0dGluZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJldHJ5TWFuYWdlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU2VydmljZVN0YXRlVHJhY2tlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKQEAgLTMwNSw5ICszMDEsNDAgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRGF0YUFsbG93ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKTsKLSAgICAgICAgcmV0dXJuIGdldEFueURhdGFFbmFibGVkKCkgJiYgKCFyb2FtaW5nIHx8IGdldERhdGFPblJvYW1pbmdFbmFibGVkKCkpICYmIG1NYXN0ZXJEYXRhRW5hYmxlZDsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgeworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiAhZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSk7CisgICAgICAgIGJvb2xlYW4gZGVzaXJlZFBvd2VyU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0RGVzaXJlZFBvd2VyU3RhdGUoKTsKKworICAgICAgICBib29sZWFuIGFsbG93ZWQgPSAocHNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAmJgorICAgICAgICAgICAgICAgIChwaG9uZS5tQ00uZ2V0UmFkaW9TdGF0ZSgpID09IENvbW1hbmRzSW50ZXJmYWNlLlJhZGlvU3RhdGUuTlZfUkVBRFkgfHwKKyAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKKyAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFKSAmJgorICAgICAgICAgICAgICAgICFyb2FtaW5nICYmCisgICAgICAgICAgICAgICAgbU1hc3RlckRhdGFFbmFibGVkICYmCisgICAgICAgICAgICAgICAgZGVzaXJlZFBvd2VyU3RhdGUgJiYKKyAgICAgICAgICAgICAgICAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8gJiYKKyAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChwc1N0YXRlICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSByZWFzb24gKz0gIiAtIHBzU3RhdGU9ICIgKyBwc1N0YXRlOworICAgICAgICAgICAgaWYgKHBob25lLm1DTS5nZXRSYWRpb1N0YXRlKCkgIT0gQ29tbWFuZHNJbnRlcmZhY2UuUmFkaW9TdGF0ZS5OVl9SRUFEWSAmJgorICAgICAgICAgICAgICAgICAgICAhbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSByYWRpb1N0YXRlPSAiICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArICIgLSBSVUlNIG5vdCBsb2FkZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBob25lLmdldFN0YXRlKCkgIT0gUGhvbmUuU3RhdGUuSURMRSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gKz0gIiAtIGNvbmN1cnJlbnRWb2ljZUFuZERhdGEgbm90IGFsbG93ZWQgYW5kIHN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb2FtaW5nKSByZWFzb24gKz0gIiAtIFJvYW1pbmciOworICAgICAgICAgICAgaWYgKCFtTWFzdGVyRGF0YUVuYWJsZWQpIHJlYXNvbiArPSAiIC0gbU1hc3RlckRhdGFFbmFibGVkPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAoIWRlc2lyZWRQb3dlclN0YXRlKSByZWFzb24gKz0gIiAtIGRlc2lyZWRQb3dlclN0YXRlPSBmYWxzZSI7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdSZXN0YXJ0UmFkaW8pIHJlYXNvbiArPSAiIC0gbVBlbmRpbmdSZXN0YXJ0UmFkaW89IHRydWUiOworICAgICAgICAgICAgaWYgKG1DZG1hUGhvbmUubmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nKCkpIHJlYXNvbiArPSAiIC0gbmVlZHMgUHJvdmlzaW9uaW5nIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKQEAgLTMxNyw3ICszNDQsOCBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgdHJ1ZSk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzI3LDM2ICszNTUsMTMgQEAKICAgICAgICAgYm9vbGVhbiByb2FtaW5nID0gcGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChwc1N0YXRlID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKQotICAgICAgICAgICAgICAgICYmICgocGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSA9PSBDb21tYW5kc0ludGVyZmFjZS5SYWRpb1N0YXRlLk5WX1JFQURZKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKQotICAgICAgICAgICAgICAgICYmIChtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldFN0YXRlKCkgPT0gUGhvbmUuU3RhdGUuSURMRSApCi0gICAgICAgICAgICAgICAgJiYgaXNEYXRhQWxsb3dlZCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUKLSAgICAgICAgICAgICAgICAmJiAhbVBlbmRpbmdSZXN0YXJ0UmFkaW8KLSAgICAgICAgICAgICAgICAmJiAhbUNkbWFQaG9uZS5uZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSkgewotCi0gICAgICAgICAgICByZXR1cm4gc2V0dXBEYXRhKHJlYXNvbik7Ci0KKyAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKSAmJgorICAgICAgICAgICAgICAgIGlzRGF0YUFsbG93ZWQoKSAmJiBnZXRBbnlEYXRhRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBib29sZWFuIHJldFZhbHVlID0gc2V0dXBEYXRhKHJlYXNvbik7CisgICAgICAgICAgICBub3RpZnlPZmZBcG5zT2ZBdmFpbGFiaWxpdHkocmVhc29uLCByZXRWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygidHJ5U2V0dXBEYXRhOiBOb3QgcmVhZHkgZm9yIGRhdGE6ICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGFTdGF0ZT0iICsgc3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIFBTIHN0YXRlPSIgKyBwc1N0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiByYWRpbyBzdGF0ZT0iICsgcGhvbmUubUNNLmdldFJhZGlvU3RhdGUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcnVpbT0iICsgbUNkbWFQaG9uZS5tUnVpbVJlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBjb25jdXJyZW50Vm9pY2UmRGF0YT0iICsgbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBwaG9uZVN0YXRlPSIgKyBwaG9uZS5nZXRTdGF0ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhRW5hYmxlZD0iICsgZ2V0QW55RGF0YUVuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcm9hbWluZz0iICsgcm9hbWluZyArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGVzaXJlZFBvd2VyU3RhdGU9IiArIGRlc2lyZWRQb3dlclN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgIiBQZW5kaW5nUmVzdGFydFJhZGlvPSIgKyBtUGVuZGluZ1Jlc3RhcnRSYWRpbyArCi0gICAgICAgICAgICAgICAgICAgICIgTWFzdGVyRGF0YUVuYWJsZWQ9IiArIG1NYXN0ZXJEYXRhRW5hYmxlZCArCi0gICAgICAgICAgICAgICAgICAgICIgbmVlZHNPdGFTZXJ2aWNlUHJvdmlzaW9uaW5nPSIgKyBtQ2RtYVBob25lLm5lZWRzT3RhU2VydmljZVByb3Zpc2lvbmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTM4Miw2ICszODcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuRElTQ09OTkVDVElORyk7CisgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkocmVhc29uKTsKIAogICAgICAgICBib29sZWFuIG5vdGlmaWNhdGlvbkRlZmVycmVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoRGF0YUNvbm5lY3Rpb24gY29ubiA6IGRhdGFDb25uZWN0aW9uTGlzdCkgewpAQCAtNDQwLDEzICs0NDYsMTMgQEAKICAgICAgICAgY29ubi5jb25uZWN0KG1zZywgbUFjdGl2ZUFwbik7CiAKICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSU5JVElORyk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgbVJldHJ5TWdyLnJlc2V0UmV0cnlDb3VudCgpOwogICAgIH0KQEAgLTYyMiwxMiArNjI4LDEzIEBACiAKICAgICBwcml2YXRlIHZvaWQgbm90aWZ5Tm9EYXRhKEZhaWxDYXVzZSBsYXN0RmFpbENhdXNlQ29kZSkgewogICAgICAgICBzZXRTdGF0ZShTdGF0ZS5GQUlMRUQpOworICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTY4NywxMSArNjk0LDEzIEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKIAogICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIldlJ3JlIG9uIHRoZSBzaW11bGF0b3I7IGFzc3VtaW5nIGRhdGEgaXMgY29ubmVjdGVkIik7CiAgICAgICAgIH0KIAorICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KG51bGwpOworCiAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbih0cnVlLCBudWxsKTsKICAgICAgICAgfQpAQCAtNzIzLDYgKzczMiw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYXIuZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IGdldExpbmtQcm9wZXJ0aWVzKG1BY3RpdmVEYXRhQ29ubmVjdGlvbik7CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIG5vdGlmeURlZmF1bHREYXRhKHJlYXNvbik7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NjIsNyArNzczLDcgQEAKICAgICAgICAgICAgIG9uUmVzdGFydFJhZGlvKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICAgICAgaWYgKHJldHJ5QWZ0ZXJEaXNjb25uZWN0ZWQocmVhc29uKSkgewogICAgICAgICAgIHRyeVNldHVwRGF0YShyZWFzb24pOwpAQCAtNzg5LDcgKzgwMCw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICFtQ2RtYVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFBdmFpbGFiaWxpdHkoUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgwMCwxMSArODEyLDEyIEBACiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIGlmICghbUNkbWFQaG9uZS5tU1NULmlzQ29uY3VycmVudFZvaWNlQW5kRGF0YSgpKSB7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKKyAgICAgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNsZWFuIHNsYXRlIGFmdGVyIGNhbGwgZW5kLgogICAgICAgICAgICAgICAgIHJlc2V0UG9sbFN0YXRzKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlEYXRhQXZhaWxhYmlsaXR5KFBob25lLlJFQVNPTl9WT0lDRV9DQUxMX0VOREVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKICAgICAgICAgICAgIC8vIGluIGNhc2UgZGF0YSBzZXR1cCB3YXMgYXR0ZW1wdGVkIHdoZW4gd2Ugd2VyZSBvbiBhIHZvaWNlIGNhbGwKQEAgLTgzOCw3ICs4NTEsNyBAQAogICAgIHByaXZhdGUgdm9pZCBvbkNkbWFEYXRhRGV0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0NETUFfREFUQV9ERVRBQ0hFRCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgY2xlYW5VcENvbm5lY3Rpb24oZmFsc2UsIFBob25lLlJFQVNPTl9DRE1BX0RBVEFfREVUQUNIRUQpOwpAQCAtOTQ5LDM0ICs5NjIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZURhdGFDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlRGF0YUNvbm5lY3Rpb24uZ2V0SXBBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHYXRld2F5KFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXRHYXRld2F5QWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXREbnNTZXJ2ZXJzKFN0cmluZyBhcG5UeXBlKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlRGF0YUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVEYXRhQ29ubmVjdGlvbi5nZXREbnNTZXJ2ZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgcHVibGljIEFycmF5TGlzdDxEYXRhQ29ubmVjdGlvbj4gZ2V0QWxsRGF0YUNvbm5lY3Rpb25zKCkgewogICAgICAgICByZXR1cm4gZGF0YUNvbm5lY3Rpb25MaXN0OwogICAgIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU01TRGlzcGF0Y2hlci5qYXZhCmluZGV4IGRjZWZmMmEuLjM3YTMzYmMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIExvZy5kKFRBRywgImhhbmRsZVN0YXR1c1JlcG9ydCBpcyBhIHNwZWNpYWwgR1NNIGZ1bmN0aW9uLCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIENETUEhIik7CiAgICAgfQpAQCAtOTIsNiArOTMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMzM1LDYgKzMzNyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNDMsNiArMzQ2LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0zNTEsNiArMzU1LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwKICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBhcnRzLCBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gc2VudEludGVudHMsCiAgICAgICAgICAgICBBcnJheUxpc3Q8UGVuZGluZ0ludGVudD4gZGVsaXZlcnlJbnRlbnRzKSB7CkBAIC0zNTksNyArMzY0LDcgQEAKICAgICAgICAgICogVE9ETyhjbGVhbnVwKTogVGhlcmUgaXMgbm8gcmVhbCBjb2RlIGRpZmZlcmVuY2UgYmV0d2VlbgogICAgICAgICAgKiB0aGlzIGFuZCB0aGUgR1NNIHZlcnNpb24sIGFuZCBoZW5jZSBpdCBzaG91bGQgYmUgbW92ZWQgdG8KICAgICAgICAgICogdGhlIGJhc2UgY2xhc3Mgb3IgY29uc29saWRhdGVkIHNvbWVob3csIHByb3ZpZGVkIGNhbGxpbmcKLSAgICAgICAgICogdGhlIHByb3BlciBzdWJtaXRwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgorICAgICAgICAgKiB0aGUgcHJvcGVyIHN1Ym1pdCBwZHUgc3R1ZmYgY2FuIGJlIGFycmFuZ2VkLgogICAgICAgICAgKi8KIAogICAgICAgICBpbnQgcmVmTnVtYmVyID0gZ2V0TmV4dENvbmNhdGVuYXRlZFJlZigpICYgMHgwMEZGOwpAQCAtNDMyLDggKzQzNyw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgLy8gYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7ICAvLyB1bnVzZWQgZm9yIENETUEKICAgICAgICAgYnl0ZSBwZHVbXSA9IChieXRlW10pIG1hcC5nZXQoInBkdSIpOwpAQCAtNDQ0LDExICs0NTAsMTMgQEAKICAgICB9CiAKICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgTG9nLmQoVEFHLCAiVE9ETzogQ2RtYVNNU0Rpc3BhdGNoZXIuc2VuZE11bHRpcGFydFNtcyBub3QgaW1wbGVtZW50ZWQiKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFja25vd2xlZGdlTGFzdEluY29taW5nU21zKGJvb2xlYW4gc3VjY2VzcywgaW50IHJlc3VsdCwgTWVzc2FnZSByZXNwb25zZSl7CiAgICAgICAgIC8vIEZJWE1FIHVuaXQgdGVzdCBsZWF2ZXMgY20gPT0gbnVsbC4gdGhpcyBzaG91bGQgY2hhbmdlCiAKQEAgLTQ2OSwxNiArNDc3LDE5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoaW50IGFjdGl2YXRlLCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5zZXRDZG1hQnJvYWRjYXN0QWN0aXZhdGlvbigoYWN0aXZhdGUgPT0gMCksIHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSkgewogICAgICAgICBtQ20uZ2V0Q2RtYUJyb2FkY2FzdENvbmZpZyhyZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIG1DbS5zZXRDZG1hQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggMmNhZDZjYy4uNWQ0ZGM1OCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xMTE5LDcgKzExMTksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc0NkbWFEYXRhQ29ubmVjdGlvbkNoYW5nZWQgfHwgaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwsIG51bGwpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JvYW1pbmdPbikgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggZTk3NTQ5ZC4uZDg0YjZhYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC02OCw4ICs2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KW1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbXMgID0gKExpc3Q8U21zUmF3RGF0YT4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFZhbGlkUmF3RGF0YSgoQXJyYXlMaXN0PGJ5dGVbXT4pIGFyLnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNtcyA9IGJ1aWxkVmFsaWRSYXdEYXRhKChBcnJheUxpc3Q8Ynl0ZVtdPikgYXIucmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREJHKSBsb2coIkNhbm5vdCBsb2FkIFNtcyByZWNvcmRzIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TbXMgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQppbmRleCAwZjNiOGZmLi5lOTViMmY5IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCkBAIC0xOCwxMSArMTgsOCBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkVuY29kZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY1V0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwpAQCAtMzMsNyArMzAsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNTgsNyArNTQsNyBAQAogLyoqCiAgKiBUT0RPKGNsZWFudXApOiBpbnRlcm5hbGx5IHJldHVybmluZyBudWxsIGluIG1hbnkgcGxhY2VzIG1ha2VzCiAgKiBkZWJ1Z2dpbmcgdmVyeSBoYXJkIChhbW9uZyBtYW55IG90aGVyIHJlYXNvbnMpIGFuZCBzaG91bGQgYmUgbWFkZQotICogbW9yZSBtZWFuaW5nZnVsIChyZXBsYWNlZCB3aXRoIGV4ZWNwdGlvbnMgZm9yIGV4YW1wbGUpLiAgTnVsbAorICogbW9yZSBtZWFuaW5nZnVsIChyZXBsYWNlZCB3aXRoIGV4Y2VwdGlvbnMgZm9yIGV4YW1wbGUpLiAgTnVsbAogICogcmV0dXJucyBzaG91bGQgb25seSBvY2N1ciBhdCB0aGUgdmVyeSBvdXRzaWRlIG9mIHRoZSBtb2R1bGUvY2xhc3MKICAqIHNjb3BlLgogICovCkBAIC02MTQsNyArNjEwLDcgQEAKICAgICAgKiBpbmNyZW1lbnRpbmcgd2l0aGluIHRoZSByYW5nZSAxLi42NTUzNSByZW1lbWJlcmluZyB0aGUgc3RhdGUKICAgICAgKiB2aWEgYSBwZXJzaXN0ZW50IHN5c3RlbSBwcm9wZXJ0eS4gIChTZWUgQy5TMDAxNS1CLCB2Mi4wLAogICAgICAqIDQuMy4xLjUpIFNpbmNlIHRoaXMgcm91dGluZSBpcyBleHBlY3RlZCB0byBiZSBhY2Nlc3NlZCB2aWEgdmlhCi0gICAgICogYmluZGVyLWNhbGwsIGFuZCBoZW5jZSBzaG91bGQgYmUgdGhyZWFkc2FmZSwgaXQgaGFzIGJlZW4KKyAgICAgKiBiaW5kZXItY2FsbCwgYW5kIGhlbmNlIHNob3VsZCBiZSB0aHJlYWQtc2FmZSwgaXQgaGFzIGJlZW4KICAgICAgKiBzeW5jaHJvbml6ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGludCBnZXROZXh0TWVzc2FnZUlkKCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9CZWFyZXJEYXRhLmphdmEKaW5kZXggYWI3OWZlOS4uY2YwNmRhYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL0JlYXJlckRhdGEuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9zbXMvQmVhcmVyRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFU19XSVRIX0hFQURFUjsKIAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUludEFycmF5OwogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZTsKIApAQCAtMzAsMTAgKzI5LDggQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlVzZXJEYXRhOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IZXhEdW1wOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZUlucHV0U3RyZWFtOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQml0d2lzZU91dHB1dFN0cmVhbTsKIApAQCAtNDUsMTMgKzQyLDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiU01TIjsKIAogICAgIC8qKgotICAgICAqIEJlYXJlciBEYXRhIFN1YnBhcmFtZXRlciBJbmRlbnRpZmllcnMKKyAgICAgKiBCZWFyZXIgRGF0YSBTdWJwYXJhbWV0ZXIgSWRlbnRpZmllcnMKICAgICAgKiAoU2VlIDNHUFAyIEMuUzAwMTUtQiwgdjIuMCwgdGFibGUgNC41LTEpCiAgICAgICogTk9URTogQ29tbWVudGVkIHN1YnBhcmFtZXRlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9JREVOVElGSUVSICAgICAgICAgICAgICAgPSAweDAwOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVBPTlNFX0NPREUgICAgICAgICAgICAgICAgPSAweDAyOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgPSAweDAyOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fTUVTU0FHRV9DRU5URVJfVElNRV9TVEFNUCAgICAgICAgPSAweDAzOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX0FCU09MVVRFICAgICAgICAgPSAweDA0OwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgU1VCUEFSQU1fVkFMSURJVFlfUEVSSU9EX1JFTEFUSVZFICAgICAgICAgPSAweDA1OwpAQCAtNjk3LDcgKzY5NCw3IEBACiAgICAgLyoKICAgICAgKiBUT0RPKGNsZWFudXApOiBDZG1hU21zQWRkcmVzcyBlbmNvZGluZyBzaG91bGQgbWFrZSB1c2Ugb2YKICAgICAgKiBDZG1hU21zQWRkcmVzcy5wYXJzZSBwcm92aWRlZCB0aGF0IERUTUYgZW5jb2RpbmcgaXMgdW5pZmllZCwKLSAgICAgKiBhbmQgdGhlIGRpZmZlcmVuY2UgaW4gNGJpdCB2cyA4Yml0IGlzIHJlc29sdmVkLgorICAgICAqIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiA0LWJpdCB2cy4gOC1iaXQgaXMgcmVzb2x2ZWQuCiAgICAgICovCiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuY29kZUNkbWFTbXNBZGRyZXNzKENkbWFTbXNBZGRyZXNzIGFkZHIpIHRocm93cyBDb2RpbmdFeGNlcHRpb24gewpAQCAtODA1LDYgKzgwMiw3IEBACiAgICAgICogKFNlZSAzR1BQMiBDLlIxMDAxLUYsIHYxLjAsIHNlY3Rpb24gNC41IGZvciBsYXlvdXQgZGV0YWlscykKICAgICAgKgogICAgICAqIEBwYXJhbSBiRGF0YSBhbiBpbnN0YW5jZSBvZiBCZWFyZXJEYXRhLgorICAgICAqCiAgICAgICogQHJldHVybiBieXRlIGFycmF5IG9mIHJhdyBlbmNvZGVkIFNNUyBiZWFyZXIgZGF0YS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoQmVhcmVyRGF0YSBiRGF0YSkgewpAQCAtOTE1LDcgKzkxMyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVV0ZjE2KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbnVtRmllbGRzKQogICAgICAgICB0aHJvd3MgQ29kaW5nRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBTdGFydCByZWFkaW5nIGZyb20gdGhlIG5leHQgMTYtYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCAxNi1iaXQgYWxpZ25lZCBib3VuZGFyeSBhZnRlciBvZmZzZXQuCiAgICAgICAgIGludCBwYWRkaW5nID0gb2Zmc2V0ICUgMjsKICAgICAgICAgbnVtRmllbGRzIC09IChvZmZzZXQgKyBwYWRkaW5nKSAvIDI7CiAgICAgICAgIHRyeSB7CkBAIC05NjEsNyArOTU5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlN2JpdEdzbShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IG51bUZpZWxkcykKICAgICAgICAgdGhyb3dzIENvZGluZ0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgLy8gU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBuZXh0IDctYml0IGFsaWduZWQgYm91bmRyeSBhZnRlciBvZmZzZXQuCisgICAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgbmV4dCA3LWJpdCBhbGlnbmVkIGJvdW5kYXJ5IGFmdGVyIG9mZnNldC4KICAgICAgICAgaW50IG9mZnNldEJpdHMgPSBvZmZzZXQgKiA4OwogICAgICAgICBpbnQgb2Zmc2V0U2VwdGV0cyA9IChvZmZzZXRCaXRzICsgNikgLyA3OwogICAgICAgICBudW1GaWVsZHMgLT0gb2Zmc2V0U2VwdGV0czsKQEAgLTE1NTQsNyArMTU1Miw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVUJQQVJBTV9VU0VSX0RBVEE6CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN1Y2Nlc3MgPSBkZWNvZGVVc2VyRGF0YShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1VTRVJfUkVQT05TRV9DT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgU1VCUEFSQU1fVVNFUl9SRVNQT05TRV9DT0RFOgogICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdWNjZXNzID0gZGVjb2RlVXNlclJlc3BvbnNlQ29kZShiRGF0YSwgaW5TdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNVQlBBUkFNX1JFUExZX09QVElPTjoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL3Ntcy9TbXNFbnZlbG9wZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKaW5kZXggMGRjYWNjMS4uYTY3MzI3YSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvc21zL1Ntc0VudmVsb3BlLmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zOwogCiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZXsKK3B1YmxpYyBmaW5hbCBjbGFzcyBTbXNFbnZlbG9wZSB7CiAgICAgLyoqCiAgICAgICogTWVzc2FnZSBUeXBlcwogICAgICAqIChTZWUgM0dQUDIgQy5TMDAxNS1CIDMuNC4xKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCmluZGV4IDQzOTcxZmYuLjMwYTYzMjQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKQEAgLTI4Nyw3ICsyODcsNyBAQAogICAgICAgICByZXR1cm4gbVBlbmRpbmdNTUlzOwogICAgIH0KIAotICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKKyAgICBwdWJsaWMgRGF0YVN0YXRlIGdldERhdGFDb25uZWN0aW9uU3RhdGUoU3RyaW5nIGFwblR5cGUpIHsKICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1TU1QgPT0gbnVsbCkgewpAQCAtMzAwLDYgKzMwMCw4IEBACiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawogICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93CiAgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvbi5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgeyAvKiBtU1NULmdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSAqLwogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb24uZ2V0U3RhdGUoKSkgewogICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOgpAQCAtNDAxLDggKzQwMyw4IEBACiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZAotICAgIG5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbik7CisgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgbU5vdGlmaWVyLm5vdGlmeURhdGFDb25uZWN0aW9uRmFpbGVkKHRoaXMsIHJlYXNvbiwgYXBuVHlwZSk7CiAgICAgfQogCiAgICAgLypwYWNrYWdlKi8gdm9pZApAQCAtMTA5MSwyNyArMTA5Myw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGhlIG9ubHkgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCB3ZSByZXBvcnQgdGhhdCBkYXRhIGNvbm5lY3Rpdml0eSBpcyBub3QKLSAgICAgKiBwb3NzaWJsZSBhcmUKLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkRhdGEgcm9hbWluZyBpcyBkaXNhbGxvd2VkIGFuZCB3ZSBhcmUgcm9hbWluZy48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5IGNoZWNrcyBpZiBhbnkgR1BSUyBjb25uZWN0aW9uIGlzIGFjdGl2ZS4gU2hvdWxkIGl0IG9ubHkKLSAgICAgICAgLy8gY2hlY2sgZm9yICJkZWZhdWx0Ij8KLSAgICAgICAgYm9vbGVhbiBub0RhdGEgPSBtRGF0YUNvbm5lY3Rpb24uZ2V0RGF0YUVuYWJsZWQoKSAmJgotICAgICAgICAgICAgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZSgpID09IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7Ci0gICAgICAgIHJldHVybiAhbm9EYXRhICYmIGdldEljY0NhcmQoKS5nZXRTdGF0ZSgpID09IFNpbUNhcmQuU3RhdGUuUkVBRFkgJiYKLSAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlU3RhdGUoKS5nZXRTdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFICYmCi0gICAgICAgICAgICAobURhdGFDb25uZWN0aW9uLmdldERhdGFPblJvYW1pbmdFbmFibGVkKCkgfHwgIWdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gTU1JIGZyb20gdGhlIHBlbmRpbmcgbGlzdCBhbmQgbm90aWZpZXMKICAgICAgKiByZWdpc3RyYW50cyB0aGF0IGl0IGlzIGNvbXBsZXRlLgogICAgICAqIEBwYXJhbSBtbWkgTU1JIHRoYXQgaXMgZG9uZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvbi5qYXZhCmluZGV4IDA5ZDQ2ZGQuLjE1NzJmMDkgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb24uamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uLmphdmEKQEAgLTE4MCw4ICsxODAsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEbnNPayhTdHJpbmdbXSBkb21haW5OYW1lU2VydmVycykgewotICAgICAgICBpZiAoTlVMTF9JUC5lcXVhbHMoZG5zU2VydmVyc1swXSkgJiYgTlVMTF9JUC5lcXVhbHMoZG5zU2VydmVyc1sxXSkKLSAgICAgICAgICAgICAgICAgICAgJiYgISgoR1NNUGhvbmUpIHBob25lKS5pc0Ruc0NoZWNrRGlzYWJsZWQoKSkgeworICAgICAgICBpZiAoTlVMTF9JUC5lcXVhbHMoZG9tYWluTmFtZVNlcnZlcnNbMF0pICYmIE5VTExfSVAuZXF1YWxzKGRvbWFpbk5hbWVTZXJ2ZXJzWzFdKQorICAgICAgICAgICAgICAgICYmICEoKEdTTVBob25lKSBwaG9uZSkuaXNEbnNDaGVja0Rpc2FibGVkKCkpIHsKICAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgUU1JIGRvZXMgbm90IGZpbGwgaW4gRE5TOgogICAgICAgICAgICAgLy8gRGVhY3RpdmF0ZSBQRFAgYW5kIGxldCBEYXRhQ29ubmVjdGlvblRyYWNrZXIgcmV0cnkuCiAgICAgICAgICAgICAvLyBEbyBub3QgYXBwbHkgdGhlIHJhY2UgY29uZGl0aW9uIHdvcmthcm91bmQgZm9yIE1NUyBBUE4KQEAgLTE4OSw2ICsxODksOSBAQAogICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBBUE4gd2lsbCBub3QgYmUgcmVzdG9yZWQgYW55bW9yZS4KICAgICAgICAgICAgIGlmICghYXBuLnR5cGVzWzBdLmVxdWFscyhQaG9uZS5BUE5fVFlQRV9NTVMpCiAgICAgICAgICAgICAgICAgfHwgIWlzSXBBZGRyZXNzKGFwbi5tbXNQcm94eSkpIHsKKyAgICAgICAgICAgICAgICBsb2coU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJpc0Ruc09rOiByZXR1cm4gZmFsc2UgYXBuLnR5cGVzWzBdPSVzIEFQTl9UWVBFX01NUz0lcyBpc0lwQWRkcmVzcyglcyk9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBuLnR5cGVzWzBdLCBQaG9uZS5BUE5fVFlQRV9NTVMsIGFwbi5tbXNQcm94eSwgaXNJcEFkZHJlc3MoYXBuLm1tc1Byb3h5KSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKaW5kZXggZTdkNTdiYy4uZjY4ODdlYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCkBAIC0yNywxNSArMjcsMTQgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CkBAIC01OCw2ICs1Nyw5IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkRhdGFDb25uZWN0aW9uLkZhaWxDYXVzZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIAogLyoqCkBAIC0zODgsMTIgKzM5MCw2IEBACiAgICAgICAgIHJldHVybiBwZHBzOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFBbGxvd2VkKCkgewotICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBwaG9uZS5nZXRTZXJ2aWNlU3RhdGUoKS5nZXRSb2FtaW5nKCk7Ci0gICAgICAgIHJldHVybiBnZXRBbnlEYXRhRW5hYmxlZCgpICYmICghcm9hbWluZyB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgotICAgICAgICAgICAgICAgIG1NYXN0ZXJEYXRhRW5hYmxlZDsKLSAgICB9Ci0KICAgICAvLyoqKioqKiBDYWxsZWQgZnJvbSBTZXJ2aWNlU3RhdGVUcmFja2VyCiAgICAgLyoqCiAgICAgICogSW52b2tlZCB3aGVuIFNlcnZpY2VTdGF0ZVRyYWNrZXIgb2JzZXJ2ZXMgYSB0cmFuc2l0aW9uIGZyb20gR1BSUwpAQCAtNDA1LDEzICs0MDEsMTMgQEAKICAgICAgICAgICogd2hlbiBHUFJTIGRldGFjaGVzLCBidXQgd2Ugc2hvdWxkIHN0b3AgdGhlIG5ldHdvcmsgcG9sbGluZy4KICAgICAgICAgICovCiAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fR1BSU19ERVRBQ0hFRCk7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0RFVEFDSEVEKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgb25HcHJzQXR0YWNoZWQoKSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT05ORUNURUQpIHsKICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9HUFJTX0FUVEFDSEVEKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBjbGVhblVwQ29ubmVjdGlvbihmYWxzZSwgUGhvbmUuUkVBU09OX0dQUlNfQVRUQUNIRUQpOwpAQCAtNDIxLDYgKzQxNywzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKKyAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKKyAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CisKKyAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0gKChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKSAmJgorICAgICAgICAgICAgICAgIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgJiYKKyAgICAgICAgICAgICAgICBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUgJiYKKyAgICAgICAgICAgICAgICBtTWFzdGVyRGF0YUVuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAoIXBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgorICAgICAgICAgICAgICAgICFtSXNQc1Jlc3RyaWN0ZWQgJiYKKyAgICAgICAgICAgICAgICBkZXNpcmVkUG93ZXJTdGF0ZSk7CisgICAgICAgIGlmICghYWxsb3dlZCAmJiBEQkcpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKKyAgICAgICAgICAgIGlmIChncHJzU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHJlYXNvbiArPSAiIC0gZ3Bycz0gIiArIGdwcnNTdGF0ZTsKKyAgICAgICAgICAgIGlmICghbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSkgcmVhc29uICs9ICIgLSBTSU0gbm90IGxvYWRlZCI7CisgICAgICAgICAgICBpZiAocGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBQaG9uZVN0YXRlPSAiICsgcGhvbmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU1hc3RlckRhdGFFbmFibGVkKSByZWFzb24gKz0gIiAtIG1NYXN0ZXJEYXRhRW5hYmxlZD0gZmFsc2UiOworICAgICAgICAgICAgaWYgKHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSAmJiBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBSb2FtaW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNQc1Jlc3RyaWN0ZWQpIHJlYXNvbiArPSAiIC0gbUlzUHNSZXN0cmljdGVkPSB0cnVlIjsKKyAgICAgICAgICAgIGlmICghZGVzaXJlZFBvd2VyU3RhdGUpIHJlYXNvbiArPSAiIC0gZGVzaXJlZFBvd2VyU3RhdGU9IGZhbHNlIjsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgYWxsb3dlZCBkdWUgdG8iICsgcmVhc29uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsb3dlZDsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5U2V0dXBEYXRhKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCIqKip0cnlTZXR1cERhdGEgZHVlIHRvICIgKyAocmVhc29uID09IG51bGwgPyAiKHVuc3BlY2lmaWVkKSIgOiByZWFzb24pKTsKIApAQCAtNDMwLDcgKzQ1NSw3IEBACiAgICAgICAgICAgICAvLyBBc3N1bWUgZGF0YSBpcyBjb25uZWN0ZWQgb24gdGhlIHNpbXVsYXRvcgogICAgICAgICAgICAgLy8gRklYTUUgIHRoaXMgY2FuIGJlIGltcHJvdmVkCiAgICAgICAgICAgICBzZXRTdGF0ZShTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24ocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICIoZml4PykgV2UncmUgb24gdGhlIHNpbXVsYXRvcjsgYXNzdW1pbmcgZGF0YSBpcyBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDM5LDE5ICs0NjQsMTUgQEAKICAgICAgICAgaW50IGdwcnNTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldEN1cnJlbnRHcHJzU3RhdGUoKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1Hc21QaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKLSAgICAgICAgaWYgKChzdGF0ZSA9PSBTdGF0ZS5JRExFIHx8IHN0YXRlID09IFN0YXRlLlNDQU5OSU5HKQotICAgICAgICAgICAgICAgICYmIChncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgfHwgbm9BdXRvQXR0YWNoKQotICAgICAgICAgICAgICAgICYmIG1Hc21QaG9uZS5tU0lNUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkKLSAgICAgICAgICAgICAgICAmJiBwaG9uZS5nZXRTdGF0ZSgpID09IFBob25lLlN0YXRlLklETEUKLSAgICAgICAgICAgICAgICAmJiBpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiAhbUlzUHNSZXN0cmljdGVkCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZFBvd2VyU3RhdGUgKSB7CisgICAgICAgIGlmICgoKHN0YXRlID09IFN0YXRlLklETEUpIHx8IChzdGF0ZSA9PSBTdGF0ZS5TQ0FOTklORykpICYmCisgICAgICAgICAgICAgICAgaXNEYXRhQWxsb3dlZCgpICYmIGdldEFueURhdGFFbmFibGVkKCkpIHsKIAogICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLklETEUpIHsKICAgICAgICAgICAgICAgICB3YWl0aW5nQXBucyA9IGJ1aWxkV2FpdGluZ0FwbnMoKTsKICAgICAgICAgICAgICAgICBpZiAod2FpdGluZ0FwbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiTm8gQVBOIGZvdW5kIik7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeU5vRGF0YShHc21EYXRhQ29ubmVjdGlvbi5GYWlsQ2F1c2UuTUlTU0lOR19VTktOT1dOX0FQTik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZyAoIkNyZWF0ZSBmcm9tIGFsbEFwbnMgOiAiICsgYXBuTGlzdFRvU3RyaW5nKGFsbEFwbnMpKTsKQEAgLTQ2MSwyMiArNDgyLDExIEBACiAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgbG9nICgiU2V0dXAgd2FpdG5nQXBucyA6ICIgKyBhcG5MaXN0VG9TdHJpbmcod2FpdGluZ0FwbnMpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBzZXR1cERhdGEocmVhc29uKTsKKyAgICAgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIHJldFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpCi0gICAgICAgICAgICAgICAgbG9nKCJ0cnlTZXR1cERhdGE6IE5vdCByZWFkeSBmb3IgZGF0YTogIiArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YVN0YXRlPSIgKyBzdGF0ZSArCi0gICAgICAgICAgICAgICAgICAgICIgZ3Byc1N0YXRlPSIgKyBncHJzU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIHNpbT0iICsgbUdzbVBob25lLm1TSU1SZWNvcmRzLmdldFJlY29yZHNMb2FkZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgVU1UUz0iICsgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHBob25lU3RhdGU9IiArIHBob25lLmdldFN0YXRlKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGlzRGF0YUFsbG93ZWQ9IiArIGlzRGF0YUFsbG93ZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YUVuYWJsZWQ9IiArIGdldEFueURhdGFFbmFibGVkKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHJvYW1pbmc9IiArIHBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YU9uUm9hbWluZ0VuYWJsZT0iICsgZ2V0RGF0YU9uUm9hbWluZ0VuYWJsZWQoKSArCi0gICAgICAgICAgICAgICAgICAgICIgcHMgcmVzdHJpY3RlZD0iICsgbUlzUHNSZXN0cmljdGVkICsKLSAgICAgICAgICAgICAgICAgICAgIiBkZXNpcmVkUG93ZXJTdGF0ZT0iICsgZGVzaXJlZFBvd2VyU3RhdGUgKwotICAgICAgICAgICAgICAgICAgICAiIE1hc3RlckRhdGFFbmFibGVkPSIgKyBtTWFzdGVyRGF0YUVuYWJsZWQpOworICAgICAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNTk1LDQ2ICs2MDUsMTAgQEAKICAgICAgICAgcGRwLmNvbm5lY3QobXNnLCBhcG4pOwogCiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklOSVRJTkcpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldElwQWRkcmVzcyhTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZVBkcCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGFwblR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIChtQWN0aXZlQXBuICE9IG51bGwgJiYgbUFjdGl2ZUFwbi5jYW5IYW5kbGVUeXBlKGFwblR5cGUpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGRwLmdldElwQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2F0ZXdheShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICBpZiAobUFjdGl2ZVBkcCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGFwblR5cGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIChtQWN0aXZlQXBuICE9IG51bGwgJiYgbUFjdGl2ZUFwbi5jYW5IYW5kbGVUeXBlKGFwblR5cGUpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtQWN0aXZlUGRwLmdldEdhdGV3YXlBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERuc1NlcnZlcnMoU3RyaW5nIGFwblR5cGUpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVQZHAgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIChhcG5UeXBlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAobUFjdGl2ZUFwbiAhPSBudWxsICYmIG1BY3RpdmVBcG4uY2FuSGFuZGxlVHlwZShhcG5UeXBlKSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVBkcC5nZXREbnNTZXJ2ZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuCiAgICAgcGRwU3RhdGVzSGFzQ0lEIChBcnJheUxpc3Q8RGF0YUNhbGxTdGF0ZT4gc3RhdGVzLCBpbnQgY2lkKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzID0gc3RhdGVzLnNpemUoKSA7IGkgPCBzIDsgaSsrKSB7CkBAIC03NDYsNyArNzIwLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEZWZhdWx0RGF0YShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLkNPTk5FQ1RFRCk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKICAgICAgICAgLy8gcmVzZXQgcmVjb25uZWN0IHRpbWVyCiAgICAgICAgIG1SZXRyeU1nci5yZXNldFJldHJ5Q291bnQoKTsKQEAgLTc1Niw3ICs3MzAsNyBAQAogICAgIHByaXZhdGUgdm9pZCBnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uKFN0cmluZyByZWFzb24pIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJnb3RvSWRsZUFuZE5vdGlmeURhdGFDb25uZWN0aW9uOiByZWFzb249IiArIHJlYXNvbik7CiAgICAgICAgIHNldFN0YXRlKFN0YXRlLklETEUpOwotICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOworICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihyZWFzb24pOwogICAgICAgICBtQWN0aXZlQXBuID0gbnVsbDsKICAgICB9CiAKQEAgLTk5OCw3ICs5NzIsNyBAQAogICAgICAgICAgICAgaWYgKCFtUmV0cnlNZ3IuaXNSZXRyeU5lZWRlZCgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkQXBuVHlwZS5lcXVhbHMoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gbW9yZSByZXRyaWVzIG9uIGEgc2Vjb25kYXJ5IEFQTiBhdHRlbXB0LCB0ZWxsIHRoZSB3b3JsZCBhbmQgcmV2ZXJ0LgotICAgICAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgb25FbmFibGVBcG4oYXBuVHlwZVRvSWQobVJlcXVlc3RlZEFwblR5cGUpLCBESVNBQkxFRCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDkxLDcgKzEwNjUsNyBAQAogICAgICAgICAgICAgLy8gQXNzdW1lIGRhdGEgaXMgY29ubmVjdGVkIG9uIHRoZSBzaW11bGF0b3IKICAgICAgICAgICAgIC8vIEZJWE1FICB0aGlzIGNhbiBiZSBpbXByb3ZlZAogICAgICAgICAgICAgc2V0U3RhdGUoU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCk7CiAKICAgICAgICAgICAgIExvZy5pKExPR19UQUcsICJXZSdyZSBvbiB0aGUgc2ltdWxhdG9yOyBhc3N1bWluZyBkYXRhIGlzIGNvbm5lY3RlZCIpOwogICAgICAgICB9CkBAIC0xMTI1LDYgKzEwOTksMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhci5leGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gZ2V0TGlua1Byb3BlcnRpZXMobUFjdGl2ZVBkcCk7CisKKyAgICAgICAgICAgIEFwblNldHRpbmcgYXBuID0gbUFjdGl2ZVBkcC5nZXRBcG4oKTsKKyAgICAgICAgICAgIGlmIChhcG4ucHJveHkgIT0gbnVsbCAmJiBhcG4ucHJveHkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFByb3h5UHJvcGVydGllcyBwcm94eSA9IG5ldyBQcm94eVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0U29ja2V0QWRkcmVzcyhuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKGFwbi5wcm94eSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChhcG4ucG9ydCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEh0dHBQcm94eShwcm94eSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiVW5rbm93bkhvc3RFeGNlcHRpb24gbWFraW5nIFByb3h5UHJvcGVydGllczogIiArIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNlY3VyaXR5RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXM6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG1ha2luZyBQcm94eVByb3BlcnRpZXMgKCIgKyBhcG4ucG9ydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgaXMgc2V0dXAKICAgICAgICAgICAgIGlmIChpc0FwblR5cGVBY3RpdmUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgiZ3NtLmRlZmF1bHRwZHBjb250ZXh0LmFjdGl2ZSIsICJ0cnVlIik7CkBAIC0xMTU3LDcgKzExNTAsNyBAQAogICAgICAgICAgICAgLy8gTm8gdHJ5IGZvciBwZXJtYW5lbnQgZmFpbHVyZQogICAgICAgICAgICAgaWYgKGNhdXNlLmlzUGVybWFuZW50RmFpbCgpKSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5Tm9EYXRhKGNhdXNlKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fQVBOX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX0FQTl9GQUlMRUQpOwogICAgICAgICAgICAgICAgIG9uRW5hYmxlQXBuKGFwblR5cGVUb0lkKG1SZXF1ZXN0ZWRBcG5UeXBlKSwgRElTQUJMRUQpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTExODYsNyArMTE3OSw3IEBACiAgICAgICAgICAgIHJlYXNvbiA9IChTdHJpbmcpIGFyLnVzZXJPYmo7CiAgICAgICAgIH0KICAgICAgICAgc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CisgICAgICAgIG5vdGlmeURhdGFDb25uZWN0aW9uKHJlYXNvbik7CiAgICAgICAgIG1BY3RpdmVBcG4gPSBudWxsOwogICAgICAgICBpZiAocmV0cnlBZnRlckRpc2Nvbm5lY3RlZChyZWFzb24pKSB7CiAgICAgICAgICAgICB0cnlTZXR1cERhdGEocmVhc29uKTsKQEAgLTEyMTcsNyArMTIxMCw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgb25Wb2ljZUNhbGxTdGFydGVkKCkgewogICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ09OTkVDVEVEICYmICEgbUdzbVBob25lLm1TU1QuaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhKCkpIHsKICAgICAgICAgICAgIHN0b3BOZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfU1RBUlRFRCk7CisgICAgICAgICAgICBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9TVEFSVEVEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIyNSw3ICsxMjE4LDcgQEAKICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgewogICAgICAgICAgICAgaWYgKCFtR3NtUGhvbmUubVNTVC5pc0NvbmN1cnJlbnRWb2ljZUFuZERhdGEoKSkgewogICAgICAgICAgICAgICAgIHN0YXJ0TmV0U3RhdFBvbGwoKTsKLSAgICAgICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZS5SRUFTT05fVk9JQ0VfQ0FMTF9FTkRFRCk7CisgICAgICAgICAgICAgICAgbm90aWZ5RGF0YUNvbm5lY3Rpb24oUGhvbmUuUkVBU09OX1ZPSUNFX0NBTExfRU5ERUQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjbGVhbiBzbGF0ZSBhZnRlciBjYWxsIGVuZC4KICAgICAgICAgICAgICAgICByZXNldFBvbGxTdGF0cygpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQppbmRleCAzMDc5YTY0Li5lZDcwNjZiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNTYsNiArNTYsNyBAQAogICAgICAqIEBwYXJhbSBhciBBc3luY1Jlc3VsdCBwYXNzZWQgaW50byB0aGUgbWVzc2FnZSBoYW5kbGVyLiAgYXIucmVzdWx0IHNob3VsZAogICAgICAqICAgICAgICAgICBiZSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyByZXBvcnQgUERVLCBhcyBBU0NJSSBoZXguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3RhdHVzUmVwb3J0KEFzeW5jUmVzdWx0IGFyKSB7CiAgICAgICAgIFN0cmluZyBwZHVTdHJpbmcgPSAoU3RyaW5nKSBhci5yZXN1bHQ7CiAgICAgICAgIFNtc01lc3NhZ2Ugc21zID0gU21zTWVzc2FnZS5uZXdGcm9tQ0RTKHBkdVN0cmluZyk7CkBAIC04NCw2ICs4NSw3IEBACiAKIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBkaXNwYXRjaE1lc3NhZ2UoU21zTWVzc2FnZUJhc2Ugc21zYikgewogCiAgICAgICAgIC8vIElmIHNtcyBpcyBudWxsLCBtZWFucyB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLgpAQCAtMTUxLDYgKzE1Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kRGF0YShTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsIGludCBkZXN0UG9ydCwKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhLCBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNTksNiArMTYyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUZXh0KFN0cmluZyBkZXN0QWRkciwgU3RyaW5nIHNjQWRkciwgU3RyaW5nIHRleHQsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlbnRJbnRlbnQsIFBlbmRpbmdJbnRlbnQgZGVsaXZlcnlJbnRlbnQpIHsKICAgICAgICAgU21zTWVzc2FnZS5TdWJtaXRQZHUgcGR1ID0gU21zTWVzc2FnZS5nZXRTdWJtaXRQZHUoCkBAIC0xNjcsNiArMTcxLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNdWx0aXBhcnRUZXh0KFN0cmluZyBkZXN0aW5hdGlvbkFkZHJlc3MsIFN0cmluZyBzY0FkZHJlc3MsCiAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXJ0cywgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IHNlbnRJbnRlbnRzLAogICAgICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50cykgewpAQCAtMzA2LDggKzMxMSw5IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kU21zKFNtc1RyYWNrZXIgdHJhY2tlcikgewotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgYnl0ZSBzbXNjW10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJzbXNjIik7CiAgICAgICAgIGJ5dGUgcGR1W10gPSAoYnl0ZVtdKSBtYXAuZ2V0KCJwZHUiKTsKQEAgLTMyMiwxMiArMzI4LDEzIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdHJhY2tlciBob2xkcyB0aGUgbXVsdGlwYXJ0IFNtcyB0cmFja2VyIHJlYWR5IHRvIGJlIHNlbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpIHsKICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGFydHM7CiAgICAgICAgIEFycmF5TGlzdDxQZW5kaW5nSW50ZW50PiBzZW50SW50ZW50czsKICAgICAgICAgQXJyYXlMaXN0PFBlbmRpbmdJbnRlbnQ+IGRlbGl2ZXJ5SW50ZW50czsKIAotICAgICAgICBIYXNoTWFwIG1hcCA9IHRyYWNrZXIubURhdGE7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IHRyYWNrZXIubURhdGE7CiAKICAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uQWRkcmVzcyA9IChTdHJpbmcpIG1hcC5nZXQoImRlc3RpbmF0aW9uIik7CiAgICAgICAgIFN0cmluZyBzY0FkZHJlc3MgPSAoU3RyaW5nKSBtYXAuZ2V0KCJzY2FkZHJlc3MiKTsKQEAgLTM0Miw2ICszNDksNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYWNrbm93bGVkZ2VMYXN0SW5jb21pbmdTbXMoYm9vbGVhbiBzdWNjZXNzLCBpbnQgcmVzdWx0LCBNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gRklYTUUgdW5pdCB0ZXN0IGxlYXZlcyBjbSA9PSBudWxsLiB0aGlzIHNob3VsZCBjaGFuZ2UKICAgICAgICAgaWYgKG1DbSAhPSBudWxsKSB7CkBAIC0zNTAsNiArMzU4LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM1Nyw2ICszNjYsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKXsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKQEAgLTM2NCw2ICszNzQsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkICB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKICAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggOTBlY2JkNy4uYjYzOWVlYSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTEwMTgsNyArMTAxOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBwaG9uZS5ub3RpZnlEYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIC8vIFRPRE8gLSBkbyB3ZSByZWFsbHkgd2FudCB0aGlzPworICAgICAgICAgICAgcGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24obnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUm9hbWluZ09uKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDY3ZWNjNzcuLmFhYjM1OWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CkBAIC0xOTIsNiArMTkzLDcgQEAKICAgICAgICAgcmV0dXJuIG1TbXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltTaW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc01lc3NhZ2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCmluZGV4IDlhM2M0NzYuLmUyNDYxM2YgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zTWVzc2FnZS5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkdzbUFscGhhYmV0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNIZWFkZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc01lc3NhZ2VCYXNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZS5UZXh0RW5jb2RpbmdEZXRhaWxzOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwpAQCAtMzQsNiArMzMsNyBAQAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuRU5DT0RJTkdfOEJJVDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR18xNkJJVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5FTkNPRElOR19LU0M1NjAxOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLkVOQ09ESU5HX1VOS05PV047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTUFYX1VTRVJfREFUQV9CWVRFUzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZWxlcGhvbnkuU21zTWVzc2FnZS5NQVhfVVNFUl9EQVRBX0JZVEVTX1dJVEhfSEVBREVSOwpAQCAtNDUsNyArNDUsNyBAQAogICogQSBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgbWVzc2FnZS4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBTbXNNZXNzYWdlIGV4dGVuZHMgU21zTWVzc2FnZUJhc2V7CitwdWJsaWMgY2xhc3MgU21zTWVzc2FnZSBleHRlbmRzIFNtc01lc3NhZ2VCYXNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKIAogICAgIHByaXZhdGUgTWVzc2FnZUNsYXNzIG1lc3NhZ2VDbGFzczsKQEAgLTMxMSw3ICszMTEsNyBAQAogICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyJ3MgU0lNIGNhcmQuIFlvdSBjYW4gdGhlbiBzZW5kIG1lc3NhZ2VzIHRvIHlvdXJzZWxmCiAgICAgICAgICAgICAvLyAob24gYSBwaG9uZSB3aXRoIHRoaXMgY2hhbmdlKSBhbmQgdGhleSdsbCBlbmQgdXAgb24gdGhlIFNJTSBjYXJkLgogICAgICAgICAgICAgYm8ud3JpdGUoMHgwMCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vYXNzdW1lIFVDUy0yCisgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZSBVQ1MtMgogICAgICAgICAgICAgaWYgKCgweGZmICYgdXNlckRhdGFbMF0pID4gTUFYX1VTRVJfREFUQV9CWVRFUykgewogICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgdG9vIGxvbmcKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTM3Nyw3ICszNzcsNyBAQAogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbkFkZHJlc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBvcnQgdGhlIHBvcnQgdG8gZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhdCB0aGUKICAgICAgKiAgICAgICAgZGVzdGluYXRpb24KLSAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0IGZvciB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIGZvciB0aGUgbWVzc2FnZQogICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdWJtaXRQZHU8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgU0MKICAgICAgKiAgICAgICAgIGFkZHJlc3MsIGlmIGFwcGxpY2FibGUsIGFuZCB0aGUgZW5jb2RlZCBtZXNzYWdlLgogICAgICAqICAgICAgICAgUmV0dXJucyBudWxsIG9uIGVuY29kZSBlcnJvci4KQEAgLTQ4Miw3ICs0ODIsNyBAQAogICAgICAgICByZXR1cm4gYm87CiAgICAgfQogCi0gICAgc3RhdGljIGNsYXNzIFBkdVBhcnNlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGR1UGFyc2VyIHsKICAgICAgICAgYnl0ZSBwZHVbXTsKICAgICAgICAgaW50IGN1cjsKICAgICAgICAgU21zSGVhZGVyIHVzZXJEYXRhSGVhZGVyOwpAQCAtNDkwLDEwICs0OTAsNiBAQAogICAgICAgICBpbnQgbVVzZXJEYXRhU2VwdGV0UGFkZGluZzsKICAgICAgICAgaW50IG1Vc2VyRGF0YVNpemU7CiAKLSAgICAgICAgUGR1UGFyc2VyKFN0cmluZyBzKSB7Ci0gICAgICAgICAgICB0aGlzKEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMocykpOwotICAgICAgICB9Ci0KICAgICAgICAgUGR1UGFyc2VyKGJ5dGVbXSBwZHUpIHsKICAgICAgICAgICAgIHRoaXMucGR1ID0gcGR1OwogICAgICAgICAgICAgY3VyID0gMDsKQEAgLTU0NSw3ICs1NDEsNyBAQAogICAgICAgICAgICAgR3NtU21zQWRkcmVzcyByZXQ7CiAKICAgICAgICAgICAgIC8vICJUaGUgQWRkcmVzcy1MZW5ndGggZmllbGQgaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhlIG51bWJlciBmaWVsZCwgaS5lLiBleGNsdWRlcyBhbnkgc2VtaSBvY3RldCBjb250YWluaW5nIG9ubHkKKyAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgZmllbGQsIGkuZS4gZXhjbHVkZXMgYW55IHNlbWktb2N0ZXQgY29udGFpbmluZyBvbmx5CiAgICAgICAgICAgICAvLyBmaWxsIGJpdHMuIgogICAgICAgICAgICAgLy8gVGhlIFRPQSBmaWVsZCBpcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGlzCiAgICAgICAgICAgICBpbnQgYWRkcmVzc0xlbmd0aCA9IHBkdVtjdXJdICYgMHhmZjsKQEAgLTU3Myw3ICs1NjksNyBAQAogICAgICAgICAgICAgaW50IHNlY29uZCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbY3VyKytdKTsKIAogICAgICAgICAgICAgLy8gRm9yIHRoZSB0aW1lem9uZSwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZQotICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQorICAgICAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIHRoZSBzaWduIGJ5dGUKICAgICAgICAgICAgIC8vIChtZWFuaW5nIHRoZSBtYXggcmFuZ2Ugb2YgdGhpcyBmaWVsZCBpcyA3OSBxdWFydGVyLWhvdXJzLAogICAgICAgICAgICAgLy8gd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCkKIApAQCAtNjMyLDcgKzYyOCw3IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBIZXJlIHdlIGp1c3QgY3JlYXRlIHRoZSB1c2VyIGRhdGEgbGVuZ3RoIHRvIGJlIHRoZSByZW1haW5kZXIgb2YKICAgICAgICAgICAgICAgICAgKiB0aGUgcGR1IG1pbnVzIHRoZSB1c2VyIGRhdGEgaGVhZGVyLCBzaW5jZSB1c2VyRGF0YUxlbmd0aCBtZWFucwotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIHNlcGV0cy4KKyAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBzZXB0ZXRzLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGJ1ZmZlckxlbiA9IHBkdS5sZW5ndGggLSBvZmZzZXQ7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjcxLDEwICs2NjcsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFkZGluZyBiaXRzIGF0IHRoZSBiZWdpbmluZyBvZiB0aGUgdXNlciBkYXRhCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdXNlciBkYXRhCiAgICAgICAgICAqIGFycmF5IGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlcHRldHMuCiAgICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYWRkaW5nIGJpdHMgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSB1c2VyIGRhdGEKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1c2VyIGRhdGEKICAgICAgICAgICogYXJyYXkgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VwdGV0cwogICAgICAgICAgKi8KICAgICAgICAgaW50IGdldFVzZXJEYXRhU2VwdGV0UGFkZGluZygpIHsKQEAgLTY5NCw3ICs2OTAsNyBAQAogICAgICAgICBYWFggTm90IHN1cmUgd2hhdCB0aGlzIG9uZSBpcyBzdXBwb3NlZCB0byBiZSBkb2luZywgYW5kIG5vIG9uZSBpcyB1c2luZwogICAgICAgICBpdC4KICAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhR1NNOGJpdCgpIHsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHB1ZDoiICsKKyAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVtYWluZGVyIG9mIHBkdToiICsKICAgICAgICAgICAgIC8vIEhleER1bXAuZHVtcEhleFN0cmluZyhwZHUsIGN1ciwgcGR1Lmxlbmd0aCAtIGN1cikpOwogICAgICAgICAgICAgaW50IGNvdW50ID0gcGR1W2N1cisrXSAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IHBkdVtjdXIrK107CkBAIC03ODEsNiArNzc3LDI3IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVycHJldHMgdGhlIHVzZXIgZGF0YSBwYXlsb2FkIGFzIEtTQy01NjAxIGNoYXJhY3RlcnMsIGFuZAorICAgICAgICAgKiBkZWNvZGVzIHRoZW0gaW50byBhIFN0cmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJ5dGVDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB1c2VyIGRhdGEgcGF5bG9hZAorICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIGRlY29kZWQgY2hhcmFjdGVycworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGdldFVzZXJEYXRhS1NDNTYwMShpbnQgYnl0ZUNvdW50KSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0OworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldCA9IG5ldyBTdHJpbmcocGR1LCBjdXIsIGJ5dGVDb3VudCwgIktTQzU2MDEiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAiIjsKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiaW1wbGF1c2libGUgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIsIGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyICs9IGJ5dGVDb3VudDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKwogICAgICAgICBib29sZWFuIG1vcmVEYXRhUHJlc2VudCgpIHsKICAgICAgICAgICAgIHJldHVybiAocGR1Lmxlbmd0aCA+IGN1cik7CiAgICAgICAgIH0KQEAgLTgyNywxMSArODQ0LDEzIEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFByb3RvY29sSWRlbnRpZmllcigpIHsKICAgICAgICAgcmV0dXJuIHByb3RvY29sSWRlbnRpZmllcjsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbGFjZSgpIHsKICAgICAgICAgcmV0dXJuIChwcm90b2NvbElkZW50aWZpZXIgJiAweGMwKSA9PSAweDQwCiAgICAgICAgICAgICAgICAgJiYgKHByb3RvY29sSWRlbnRpZmllciAmIDB4M2YpID4gMApAQCAtODM5LDEyICs4NTgsMTQgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ3Boc013aU1lc3NhZ2UoKSB7CiAgICAgICAgIHJldHVybiAoKEdzbVNtc0FkZHJlc3MpIG9yaWdpbmF0aW5nQWRkcmVzcykuaXNDcGhzVm9pY2VNZXNzYWdlQ2xlYXIoKQogICAgICAgICAgICAgICAgIHx8ICgoR3NtU21zQWRkcmVzcykgb3JpZ2luYXRpbmdBZGRyZXNzKS5pc0NwaHNWb2ljZU1lc3NhZ2VTZXQoKTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJQ2xlYXJNZXNzYWdlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgKG13aVNlbnNlID09IGZhbHNlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NTUsNiArODc2LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTVdJU2V0TWVzc2FnZSgpIHsKICAgICAgICAgaWYgKGlzTXdpICYmIChtd2lTZW5zZSA9PSB0cnVlKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04NjUsNiArODg3LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzTXdpRG9udFN0b3JlKCkgewogICAgICAgICBpZiAoaXNNd2kgJiYgbXdpRG9udFN0b3JlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTg4NCwzMSArOTA3LDM0IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIGlzU3RhdHVzUmVwb3J0TWVzc2FnZTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmVwbHlQYXRoUHJlc2VudCgpIHsKICAgICAgICAgcmV0dXJuIHJlcGx5UGF0aFByZXNlbnQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVFMgMjcuMDA1IDMuMSwgPHBkdT4gZGVmaW5pdGlvbiAiSW4gdGhlIGNhc2Ugb2YgU01TOiAzR1BQIFRTIDI0LjAxMSBbNl0KKyAgICAgKiBUUyAyNy4wMDUgMy4xLCAmbHQ7cGR1Jmd0OyBkZWZpbml0aW9uICJJbiB0aGUgY2FzZSBvZiBTTVM6IDNHUFAgVFMgMjQuMDExIFs2XQogICAgICAqIFNDIGFkZHJlc3MgZm9sbG93ZWQgYnkgM0dQUCBUUyAyMy4wNDAgWzNdIFRQRFUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0OgogICAgICAqIE1FL1RBIGNvbnZlcnRzIGVhY2ggb2N0ZXQgb2YgVFAgZGF0YSB1bml0IGludG8gdHdvIElSQSBjaGFyYWN0ZXIgbG9uZwotICAgICAqIGhleGFkIG51bWJlciAoZS5nLiBvY3RldCB3aXRoIGludGVnZXIgdmFsdWUgNDIgaXMgcHJlc2VudGVkIHRvIFRFIGFzIHR3bworICAgICAqIGhleCBudW1iZXIgKGUuZy4gb2N0ZXQgd2l0aCBpbnRlZ2VyIHZhbHVlIDQyIGlzIHByZXNlbnRlZCB0byBURSBhcyB0d28KICAgICAgKiBjaGFyYWN0ZXJzIDJBIChJUkEgNTAgYW5kIDY1KSkiIC4uLmluIHRoZSBjYXNlIG9mIGNlbGwgYnJvYWRjYXN0LAogICAgICAqIHNvbWV0aGluZyBlbHNlLi4uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGR1KGJ5dGVbXSBwZHUpIHsKICAgICAgICAgbVBkdSA9IHBkdTsKLSAgICAgICAgLy8gTG9nLmQoTE9HX1RBRywgInJhdyBzbXMgbWVzYWdlOiIpOworICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCAicmF3IHNtcyBtZXNzYWdlOiIpOwogICAgICAgICAvLyBMb2cuZChMT0dfVEFHLCBzKTsKIAogICAgICAgICBQZHVQYXJzZXIgcCA9IG5ldyBQZHVQYXJzZXIocGR1KTsKQEAgLTExMDcsNiArMTEzMywxNiBAQAogICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJNV0kgZm9yIGZheCwgZW1haWwsIG9yIG90aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGFDb2RpbmdTY2hlbWUgJiAweGZmKSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKGRhdGFDb2RpbmdTY2hlbWUgJiAweEMwKSA9PSAweDgwKSB7CisgICAgICAgICAgICAvLyAzR1BQIFRTIDIzLjAzOCBWNy4wLjAgKDIwMDYtMDMpIHNlY3Rpb24gNAorICAgICAgICAgICAgLy8gMHg4MC4uMHhCRiA9PSBSZXNlcnZlZCBjb2RpbmcgZ3JvdXBzCisgICAgICAgICAgICBpZiAoZGF0YUNvZGluZ1NjaGVtZSA9PSAweDg0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSB1c2VkIGZvciBLU0M1NjAxIGJ5IGNhcnJpZXJzIGluIEtvcmVhLgorICAgICAgICAgICAgICAgIGVuY29kaW5nVHlwZSA9IEVOQ09ESU5HX0tTQzU2MDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICI1IC0gVW5zdXBwb3J0ZWQgU01TIGRhdGEgY29kaW5nIHNjaGVtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhQ29kaW5nU2NoZW1lICYgMHhmZikpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIjMgLSBVbnN1cHBvcnRlZCBTTVMgZGF0YSBjb2Rpbmcgc2NoZW1lICIKICAgICAgICAgICAgICAgICAgICAgKyAoZGF0YUNvZGluZ1NjaGVtZSAmIDB4ZmYpKTsKQEAgLTExMzEsNiArMTE2NywxMCBAQAogICAgICAgICBjYXNlIEVOQ09ESU5HXzE2QklUOgogICAgICAgICAgICAgbWVzc2FnZUJvZHkgPSBwLmdldFVzZXJEYXRhVUNTMihjb3VudCk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVOQ09ESU5HX0tTQzU2MDE6CisgICAgICAgICAgICBtZXNzYWdlQm9keSA9IHAuZ2V0VXNlckRhdGFLU0M1NjAxKGNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKENvbmZpZy5MT0dWKSBMb2cudihMT0dfVEFHLCAiU01TIG1lc3NhZ2UgYm9keSAocmF3KTogJyIgKyBtZXNzYWdlQm9keSArICInIik7CkBAIC0xMTYyLDYgKzEyMDIsNyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWVzc2FnZUNsYXNzIGdldE1lc3NhZ2VDbGFzcygpIHsKICAgICAgICAgcmV0dXJuIG1lc3NhZ2VDbGFzczsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1VzaW1QaG9uZUJvb2tNYW5hZ2VyLmphdmEKaW5kZXggYjY0MjU0MS4uNDFmM2IyMyAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Vc2ltUGhvbmVCb29rTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vVXNpbVBob25lQm9va01hbmFnZXIuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVCYXNlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5oYXJtb255Lmx1bmkubGFuZy5yZWZsZWN0Lkxpc3RPZlR5cGVzOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBDb25uZWN0aW9uQmFzZS5qYXZhCmluZGV4IDZjOTg5YjQuLmY1ZDg0ZWIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwQ29ubmVjdGlvbkJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcENvbm5lY3Rpb25CYXNlLmphdmEKQEAgLTIzOCwxMSArMjM4LDkgQEAKICAgICAgICAgcmV0dXJuIENvbm5lY3Rpb24uUFJFU0VOVEFUSU9OX0FMTE9XRUQ7CiAgICAgfQogCi0gICAgLyoKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewogICAgICAgICAvLyBGSVhNRTogd2hhdCdzIHRoaXMgZm9yIFNJUD8KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgICovCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lLmphdmEKaW5kZXggYmYxYjkzOS4uZjMwZTExZSAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmUuamF2YQpAQCAtNjAsNyArNjAsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVByb3h5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZVN1YkluZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKQEAgLTEwMCw2ICs5OSwxNCBAQAogICAgICAgICAvLyAgICAgICAgbmV3IEludGVnZXIoUGhvbmUuUEhPTkVfVFlQRV9HU00pLnRvU3RyaW5nKCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFNpcFBob25lKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBTaXBQaG9uZSB0aGF0ID0gKFNpcFBob25lKSBvOworICAgICAgICByZXR1cm4gbVByb2ZpbGUuZ2V0VXJpU3RyaW5nKCkuZXF1YWxzKHRoYXQubVByb2ZpbGUuZ2V0VXJpU3RyaW5nKCkpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmVOYW1lKCkgewogICAgICAgICByZXR1cm4gIlNJUDoiICsgZ2V0VXJpU3RyaW5nKG1Qcm9maWxlKTsKICAgICB9CkBAIC0xNzMsMTAgKzE4MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nLCBVVVNJbmZvIHV1c2luZm8pIHRocm93cyBDYWxsU3RhdGVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGlhbChkaWFsU3RyaW5nKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQ29ubmVjdGlvbiBkaWFsKFN0cmluZyBkaWFsU3RyaW5nKSB0aHJvd3MgQ2FsbFN0YXRlRXhjZXB0aW9uIHsKICAgICAgICAgc3luY2hyb25pemVkIChTaXBQaG9uZS5jbGFzcykgewogICAgICAgICAgICAgcmV0dXJuIGRpYWxJbnRlcm5hbChkaWFsU3RyaW5nKTsKQEAgLTc4MiwxMCArNzg1LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVVVTSW5mbyBnZXRVVVNJbmZvKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBDYWxsLlN0YXRlIGdldENhbGxTdGF0ZUZyb20oU2lwQXVkaW9DYWxsIHNpcEF1ZGlvQ2FsbCkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9zaXAvU2lwUGhvbmVCYXNlLmphdmEKaW5kZXggOTA5OGU2Zi4uNWYyNmFmNCAxMDA3NTUKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3NpcC9TaXBQaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvc2lwL1NpcFBob25lQmFzZS5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKQEAgLTY1LDcgKzY2LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVQcm94eTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmVTdWJJbmZvOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOwotLy9pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMDIsMTMgKzEwMywxMSBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IENhbGwgZ2V0UmluZ2luZ0NhbGwoKTsKIAotICAgIC8qCiAgICAgcHVibGljIENvbm5lY3Rpb24gZGlhbChTdHJpbmcgZGlhbFN0cmluZywgVVVTSW5mbyB1dXNJbmZvKQogICAgICAgICAgICAgdGhyb3dzIENhbGxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGlnbm9yZSBVVVNJbmZvCiAgICAgICAgIHJldHVybiBkaWFsKGRpYWxTdHJpbmcpOwogICAgIH0KLSAgICAqLwogCiAgICAgdm9pZCBtaWdyYXRlRnJvbShTaXBQaG9uZUJhc2UgZnJvbSkgewogICAgICAgICBtaWdyYXRlKG1SaW5nYmFja1JlZ2lzdHJhbnRzLCBmcm9tLm1SaW5nYmFja1JlZ2lzdHJhbnRzKTsKQEAgLTUzMyw2ICs1MzIsMTggQEAKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBTSVAuIik7CiAgICAgfQogCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBuZWVkc090YVNlcnZpY2VQcm92aXNpb25pbmcoKSB7CisgICAgICAgIC8vIEZJWE1FOiB3aGF0J3MgdGhpcyBmb3IgU0lQPworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9AT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgLy8gRklYTUU6IHdoYXQncyB0aGlzIGZvciBTSVA/CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKwogICAgIHZvaWQgdXBkYXRlUGhvbmVTdGF0ZSgpIHsKICAgICAgICAgU3RhdGUgb2xkU3RhdGUgPSBzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS90ZXN0L1NpbXVsYXRlZENvbW1hbmRzLmphdmEKaW5kZXggOWM3MmU1YS4uZmRjZjc4ZCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L3Rlc3QvU2ltdWxhdGVkQ29tbWFuZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvdGVzdC9TaW11bGF0ZWRDb21tYW5kcy5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnRlc3Q7CiAKLQogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwpAQCAtMjcsNyArMjYsNiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db21tYW5kc0ludGVyZmFjZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuRGF0YUNhbGxTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlVVU0luZm87CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwpAQCAtMzM1LDcgKzMzMyw3IEBACiAKICAgICAvKioKICAgICAgKiAoQXN5bmNSZXN1bHQpcmVzcG9uc2Uub2JqKS5yZXN1bHQgd2lsbCBiZSBhbiBJbnRlZ2VyIHJlcHJlc2VudGluZwotICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJpdmljZSBjbGFzc2VzIChzdW0gb2YgU0VSVklDRV9DTEFTU18qKQorICAgICAqIHRoZSBzdW0gb2YgZW5hYmxlZCBzZXJ2aWNlIGNsYXNzZXMgKHN1bSBvZiBTRVJWSUNFX0NMQVNTXyopCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmFjaWxpdHkgb25lIG9mIENCX0ZBQ0lMVFlfKgogICAgICAqIEBwYXJhbSBwaW4gcGFzc3dvcmQgb3IgIiIgaWYgbm90IHJlcXVpcmVkCkBAIC00NDEsNyArNDM5LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGNvbnRhaW5zIGEgTGlzdCBvZiBEcml2ZXJDYWxsCiAgICAgICogICAgICBUaGUgYXIucmVzdWx0IExpc3QgaXMgc29ydGVkIGJ5IERyaXZlckNhbGwuaW5kZXgKICAgICAgKi8KQEAgLTQ2OCw3ICs0NjYsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgY29udGFpbnMgYSBMaXN0IG9mIERhdGFDYWxsU3RhdGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXREYXRhQ2FsbExpc3QoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTQ3OSw3ICs0NzcsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiBDTElSX0RFRkFVTFQgICAgID09IG9uICJ1c2Ugc3Vic2NyaXB0aW9uIGRlZmF1bHQgdmFsdWUiCkBAIC00OTYsNyArNDk0LDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqCiAgICAgICogQ0xJUl9ERUZBVUxUICAgICA9PSBvbiAidXNlIHN1YnNjcmlwdGlvbiBkZWZhdWx0IHZhbHVlIgpAQCAtNTEzLDcgKzUxMSw3IEBACiAgICAgICogIHJldHVybmVkIG1lc3NhZ2UKICAgICAgKiAgcmV0TXNnLm9iaiA9IEFzeW5jUmVzdWx0IGFyCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBTdHJpbmcgY29udGFpbmluZyBJTVNJIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTVNJKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01MjQsNyArNTIyLDcgQEAKICAgICAgKiAgcmV0dXJuZWQgbWVzc2FnZQogICAgICAqICByZXRNc2cub2JqID0gQXN5bmNSZXN1bHQgYXIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIFN0cmluZyBjb250YWluaW5nIElNRUkgb24gc3VjY2VzcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldElNRUkoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTUzNSw3ICs1MzMsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgU3RyaW5nIGNvbnRhaW5pbmcgSU1FSVNWIG9uIHN1Y2Nlc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRJTUVJU1YoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTU0Nyw3ICs1NDUsNyBAQAogICAgICAqICByZXR1cm5lZCBtZXNzYWdlCiAgICAgICogIHJldE1zZy5vYmogPSBBc3luY1Jlc3VsdCBhcgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICoKICAgICAgKiAgM0dQUCAyMi4wMzAgNi41LjUKQEAgLTU3Miw3ICs1NzAsNyBAQAogICAgICAqICAiUmVsZWFzZXMgYWxsIGhlbGQgY2FsbHMgb3Igc2V0cyBVc2VyIERldGVybWluZWQgVXNlciBCdXN5IChVRFVCKQogICAgICAqICAgZm9yIGEgd2FpdGluZyBjYWxsLiIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGhhbmd1cFdhaXRpbmdPckJhY2tncm91bmQgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC01OTMsNyArNTkxLDcgQEAKICAgICAgKiAgdGhlIG90aGVyIChoZWxkIG9yIHdhaXRpbmcpIGNhbGwuIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBoYW5ndXBGb3JlZ3JvdW5kUmVzdW1lQmFja2dyb3VuZCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTYxNCw3ICs2MTIsNyBAQAogICAgICAqICB0aGUgb3RoZXIgKGhlbGQgb3Igd2FpdGluZykgY2FsbC4iCiAgICAgICoKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN3aXRjaFdhaXRpbmdPckhvbGRpbmdBbmRBY3RpdmUgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02MzQsNyArNjMyLDcgQEAKICAgICAgKiAiQWRkcyBhIGhlbGQgY2FsbCB0byB0aGUgY29udmVyc2F0aW9uIgogICAgICAqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb25mZXJlbmNlIChNZXNzYWdlIHJlc3VsdCkgewpAQCAtNjU0LDcgKzY1Miw3IEBACiAgICAgICogIkNvbm5lY3RzIHRoZSB0d28gY2FsbHMgYW5kIGRpc2Nvbm5lY3RzIHRoZSBzdWJzY3JpYmVyIGZyb20gYm90aCBjYWxscyIKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhwbGljaXRDYWxsVHJhbnNmZXIgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC02OTAsNyArNjg4LDcgQEAKICAgICAvKioKICAgICAgKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWNjZXB0Q2FsbCAoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTcwOCw3ICs3MDYsNyBAQAogICAgIC8qKgogICAgICAqICBhbHNvIGtub3duIGFzIFVEVUIKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlamVjdENhbGwgKE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC03ODUsNyArNzgzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByZXN1bHQgaXMgY2FsbGJhY2sgbWVzc2FnZQogICAgICAqICAgICAgICAoKEFzeW5jUmVzdWx0KXJlc3BvbnNlLm9iaikucmVzdWx0ICBpcyBhbiBpbnRbXSB3aXRoIGV2ZXJ5Ci0gICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmlhbGFibGUgQk1fKl9CQU5ECisgICAgICogICAgICAgIGVsZW1lbnQgcmVwcmVzZW50aW5nIG9uZSBhdmFpbGFibGUgQk1fKl9CQU5ECiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcXVlcnlBdmFpbGFibGVCYW5kTW9kZSAoTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgaW50IHJldFtdID0gbmV3IGludCBbNF07CkBAIC04OTQsNyArODkyLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VuZER0bWYoY2hhciBjLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtOTAzLDcgKzkwMSw3IEBACiAKICAgICAvKioKICAgICAgKiAgYXIuZXhjZXB0aW9uIGNhcnJpZXMgZXhjZXB0aW9uIG9uIGZhaWx1cmUKLSAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ25hbCB2YWx1ZSBvZiByZXN1bHQub2JqCisgICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKICAgICAgKiAgYXIucmVzdWx0IGlzIG51bGwgb24gc3VjY2VzcyBhbmQgZmFpbHVyZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RHRtZihjaGFyIGMsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05MTIsNyArOTEwLDcgQEAKIAogICAgIC8qKgogICAgICAqICBhci5leGNlcHRpb24gY2FycmllcyBleGNlcHRpb24gb24gZmFpbHVyZQotICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnbmFsIHZhbHVlIG9mIHJlc3VsdC5vYmoKKyAgICAgKiAgYXIudXNlck9iamVjdCBjb250YWlucyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagogICAgICAqICBhci5yZXN1bHQgaXMgbnVsbCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RvcER0bWYoTWVzc2FnZSByZXN1bHQpIHsKQEAgLTkyMSw3ICs5MTksNyBAQAogCiAgICAgLyoqCiAgICAgICogIGFyLmV4Y2VwdGlvbiBjYXJyaWVzIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi0gICAgICogIGFyLnVzZXJPYmplY3QgY29udGFpbnMgdGhlIG9yaWduYWwgdmFsdWUgb2YgcmVzdWx0Lm9iagorICAgICAqICBhci51c2VyT2JqZWN0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiByZXN1bHQub2JqCiAgICAgICogIGFyLnJlc3VsdCBpcyBudWxsIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kQnVyc3REdG1mKFN0cmluZyBkdG1mU3RyaW5nLCBpbnQgb24sIGludCBvZmYsIE1lc3NhZ2UgcmVzdWx0KSB7CkBAIC05NTYsNiArOTU0LDcgQEAKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXNwb25zZSk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXR1cERlZmF1bHRQRFAoU3RyaW5nIGFwbiwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCwgTWVzc2FnZSByZXN1bHQpIHsKICAgICAgICAgdW5pbXBsZW1lbnRlZChyZXN1bHQpOwogICAgIH0KQEAgLTk2Nyw5ICs5NjYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZURhdGFDYWxsKGludCBjaWQsIE1lc3NhZ2UgcmVzdWx0KSB7dW5pbXBsZW1lbnRlZChyZXN1bHQpO30KIAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlRGVmYXVsdFBEUChpbnQgY2lkLCBNZXNzYWdlIHJlc3VsdCkge3VuaW1wbGVtZW50ZWQocmVzdWx0KTt9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZShpbnQgbmV0d29ya1R5cGUgLCBNZXNzYWdlIHJlc3VsdCkgewpAQCAtMTA0Niw3ICsxMDQzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2aWxpZW50IHRvIDI3LjAwNyBBVCtDUlNNIGNvbW1hbmQKKyAgICAgKiBwYXJhbWV0ZXJzIGVxdWl2YWxlbnQgdG8gMjcuMDA3IEFUK0NSU00gY29tbWFuZAogICAgICAqIHJlc3BvbnNlLm9iaiB3aWxsIGJlIGFuIEFzeW5jUmVzdWx0CiAgICAgICogcmVzcG9uc2Uub2JqLnVzZXJPYmogd2lsbCBiZSBhIFNpbUlvUmVzdWx0IG9uIHN1Y2Nlc3MKICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9tb2NrcmlsL0FuZHJvaWQubWsgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvbW9ja3JpbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKworTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZSBmcmFtZXdvcmsKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKworTE9DQUxfTU9EVUxFIDo9IG1vY2tyaWxjb250cm9sbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEgYi90ZWxlcGhvbnkvbW9ja3JpbC9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbENvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEzOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L21vY2tyaWwvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9tb2NrcmlsL01vY2tSaWxDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZ0hlYWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb21tdW5pY2F0aW9uLk1zZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbEN0cmxDbWRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5yaWxfcHJvdG8uUmlsQ21kczsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm1pY3JvLk1lc3NhZ2VNaWNybzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQ29udGFpbiBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gY29udHJvbCBNb2NrIFJJTC4gQmVmb3JlIHVzaW5nIHRoZXNlIGNvbW1hbmRzIHRoZSBkZXZpY2VzCisgKiBuZWVkcyB0byBiZSBzZXQgd2l0aCBNb2NrIFJJTC4gUmVmZXIgdG8gaGFyZHdhcmUvcmlsL21vY2tyaWwvUkVBRE1FLnR4dCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrUmlsQ29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUklMQ29udHJvbGxlciI7CisgICAgcHJpdmF0ZSBSaWxDaGFubmVsIG1SaWxDaGFubmVsID0gbnVsbDsKKyAgICBwcml2YXRlIE1zZyBtTWVzc2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgTW9ja1JpbENvbnRyb2xsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY2hhbm5lbCBhZnRlciB0aGUgY29tbXVuaWNhdGlvbiBpcyBkb25lLgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VDaGFubmVsKCkgeworICAgICAgICBtUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgY29tbWFuZHMgYW5kIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICAgKiBAcGFyYW0gY21kIGZvciBNc2dIZWFkZXIKKyAgICAgKiBAcGFyYW0gdG9rZW4gZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBzdGF0dXMgZm9yIE1zZ0hlYWRlcgorICAgICAqIEBwYXJhbSBwYkRhdGEgZm9yIE1zZyBkYXRhCisgICAgICogQHJldHVybiB0cnVlIGlmIGNvbW1hbmQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIGl0IGZhaWxzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRDdHJsQ29tbWFuZChpbnQgY21kLCBsb25nIHRva2VuLCBpbnQgc3RhdHVzLCBNZXNzYWdlTWljcm8gcGJEYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNc2cuc2VuZChtUmlsQ2hhbm5lbCwgY21kLCB0b2tlbiwgc3RhdHVzLCBwYkRhdGEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIGNvbW1hbmQgOiAlZCBmYWlsZWQ6ICIgKyBlLmdldFN0YWNrVHJhY2UoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbnRyb2wgcmVzcG9uc2UKKyAgICAgKiBAcmV0dXJuIE1zZyBpZiByZXNwb25zZSBpcyByZWNlaXZlZCwgZWxzZSByZXR1cm4gbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1zZyBnZXRDdHJsUmVzcG9uc2UoKSB7CisgICAgICAgIE1zZyByZXNwb25zZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IE1zZy5yZWN2KG1SaWxDaGFubmVsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAicmVjZWl2ZSByZXNwb25zZSBmb3IgZ2V0UmFkaW9TdGF0ZSgpIGVycm9yOiAiICsgZS5nZXRTdGFja1RyYWNlKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJhZGlvIHN0YXRlIGlmIGl0IGlzIHZhbGlkLCBvdGhlcndpc2UgcmV0dXJuIC0xCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpZiAoIXNlbmRDdHJsQ29tbWFuZChSaWxDdHJsQ21kcy5DVFJMX0NNRF9HRVRfUkFESU9fU1RBVEUsIDAsIDAsIG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgTXNnIHJlc3BvbnNlID0gZ2V0Q3RybFJlc3BvbnNlKCk7CisgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJmYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UucHJpbnRIZWFkZXIoVEFHKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcmVzcCA9CisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworICAgICAgICBpbnQgc3RhdGUgPSByZXNwLmdldFN0YXRlKCk7CisgICAgICAgIGlmICgoc3RhdGUgPj0gUmlsQ21kcy5SQURJT1NUQVRFX09GRikgJiYgKHN0YXRlIDw9IFJpbENtZHMuUkFESU9TVEFURV9OVl9SRUFEWSkpCisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJhZGlvIHN0YXRlIG9mIG1vY2sgcmlsIHRvIHRoZSBnaXZlbiBzdGF0ZQorICAgICAqIEBwYXJhbSBzdGF0ZSBmb3IgZ2l2ZW4gcmFkaW8gc3RhdGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YXRlIGlzIHNldCBzdWNjZXNzZnVsLCBmYWxzZSBpZiBpdCBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNldFJhZGlvU3RhdGUoaW50IHN0YXRlKSB7CisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIHJlcSA9IG5ldyBSaWxDdHJsQ21kcy5DdHJsUmVxUmFkaW9TdGF0ZSgpOworICAgICAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID4gUmlsQ21kcy5SQURJT1NUQVRFX05WX1JFQURZKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJ0aGUgZ2l2ZSByYWRpbyBzdGF0ZSBpcyBub3QgdmFsaWQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVxLnNldFN0YXRlKHN0YXRlKTsKKyAgICAgICAgaWYgKCFzZW5kQ3RybENvbW1hbmQoUmlsQ3RybENtZHMuQ1RSTF9DTURfU0VUX1JBRElPX1NUQVRFLCAwLCAwLCByZXEpKSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJzZW5kIHNldCByYWRpbyBzdGF0ZSByZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNc2cgcmVzcG9uc2UgPSBnZXRDdHJsUmVzcG9uc2UoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgImZhaWxlZCB0byBnZXQgcmVzcG9uc2UgZm9yIHNldFJhZGlvU3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5wcmludEhlYWRlcihUQUcpOworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByZXNwID0KKyAgICAgICAgICAgIHJlc3BvbnNlLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisgICAgICAgIGludCBjdXJzdGF0ZSA9IHJlc3AuZ2V0U3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIGN1cnN0YXRlID09IHN0YXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnltb2NrcmlsdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxZDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gbW9ja3JpbGNvbnRyb2xsZXIKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVsZXBob255TW9ja1JpbFRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjQ0YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cyI+CisKKyAgICA8YXBwbGljYXRpb24+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpsYWJlbD0iVGVsZXBob255TW9ja1JpbFRlc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJUZWxlcGhvbnlNb2NrUmlsVGVzdCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC50ZWxlcGhvbnltb2NrcmlsdGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlRlc3QgcnVubmVyIGZvciBUZWxlcGhvbnkgVGVzdHMgVXNpbmcgTW9jayBSSUwiCisgICAgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QSE9ORV9TVEFURSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvVGVsZXBob255TW9ja1Rlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVlNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL1RlbGVwaG9ueU1vY2tUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0czsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lm1vY2tyaWwuTW9ja1JpbENvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5mdW5jdGlvbmFsLlNpbXBsZVRlc3RVc2luZ01vY2tSaWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFRlc3QgcnVubmVyIGZvciB0ZWxlcGhvbnkgdGVzdHMgdGhhdCB1c2luZyBNb2NrIFJJTAorICoKKyAqLworcHVibGljIGNsYXNzIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIGV4dGVuZHMgSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRz0iVGVsZXBob255TW9ja1Rlc3RSdW5uZXIiOworICAgIHB1YmxpYyBNb2NrUmlsQ29udHJvbGxlciBtQ29udHJvbGxlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Db250cm9sbGVyID0gbmV3IE1vY2tSaWxDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKCJDcmVhdGUgTW9jayBSSWwgQ29udHJvbGxlciBmYWlsZWQiLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChtQ29udHJvbGxlcik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmluaXNoKGludCByZXN1bHRDb2RlLCBCdW5kbGUgcmVzdWx0cykgeworICAgICAgICBpZiAobUNvbnRyb2xsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIG1Db250cm9sbGVyLmNsb3NlQ2hhbm5lbCgpOworICAgICAgICBzdXBlci5maW5pc2gocmVzdWx0Q29kZSwgcmVzdWx0cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueW1vY2tyaWx0ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVsZXBob255bW9ja3JpbHRlc3RzL2Z1bmN0aW9uYWwvU2ltcGxlVGVzdFVzaW5nTW9ja1JpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255bW9ja3JpbHRlc3RzL3NyYy9jb20vYW5kcm9pZC90ZWxlcGhvbnltb2NrcmlsdGVzdHMvZnVuY3Rpb25hbC9TaW1wbGVUZXN0VXNpbmdNb2NrUmlsLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVsZXBob255bW9ja3JpbHRlc3RzLmZ1bmN0aW9uYWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsQ29udHJvbGxlcjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnRlbGVwaG9ueW1vY2tyaWx0ZXN0cy5UZWxlcGhvbnlNb2NrVGVzdFJ1bm5lcjsKKworLyoqCisgKiBBIHNpbXBsZSB0ZXN0IHRoYXQgdXNpbmcgTW9jayBSSUwgQ29udHJvbGxlcgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdFVzaW5nTW9ja1JpbCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNpbXBsZVRlc3RVc2luZ01vY2tSaWwiOworICAgIHByaXZhdGUgTW9ja1JpbENvbnRyb2xsZXIgbU1vY2tSaWxDdHJsID0gbnVsbDsKKyAgICBwcml2YXRlIFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyIG1SdW5uZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtUnVubmVyID0gKFRlbGVwaG9ueU1vY2tUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBtTW9ja1JpbEN0cmwgPSBtUnVubmVyLm1Db250cm9sbGVyOworICAgICAgICBhc3NlcnROb3ROdWxsKG1Nb2NrUmlsQ3RybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjdXJyZW50IHJhZGlvIHN0YXRlIG9mIFJJTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSYWRpb1N0YXRlKCkgeworICAgICAgICBpbnQgc3RhdGUgPSBtTW9ja1JpbEN0cmwuZ2V0UmFkaW9TdGF0ZSgpOworICAgICAgICBMb2cudihUQUcsICJ0ZXN0R2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdGF0ZSA+PSAwICYmIHN0YXRlIDw9IDkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCByYWRpbyBzdGF0ZSBvZiBSSUwKKyAgICAgKiBhbmQgdmVyaWZ5IHRoZSByYWRpbyBzdGF0ZSBpcyBzZXQgY29ycmVjdGx5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldFJhZGlvU3RhdGUoKSB7CisgICAgICAgIGZvciAoaW50IHN0YXRlID0gMDsgc3RhdGUgPD0gOTsgc3RhdGUrKykgeworICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0IHJhZGlvIHN0YXRlIHRvIGJlICIgKyBzdGF0ZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJzZXQgcmFkaW8gc3RhdGU6ICIgKyBzdGF0ZSArICIgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1Nb2NrUmlsQ3RybC5zZXRSYWRpb1N0YXRlKHN0YXRlKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2UoInVzZSBhbiBpbnZhbGlkIHJhZGlvIHN0YXRlIiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoLTEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInRoZSByYWRpbyBzdGF0ZSBkb2Vzbid0IGV4aXN0IiwgbU1vY2tSaWxDdHJsLnNldFJhZGlvU3RhdGUoMTApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZC5tayBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDQ1ZTI2NWEuLjk4ZTQ0MDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkLm1rCkBAIC01LDYgKzUsOCBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKIAorTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGxpYnJpbHByb3RvLWphdmEKKwogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gRnJhbWV3b3Jrc1RlbGVwaG9ueVRlc3RzCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDZhOTc0MjMuLmJhMWQ5NTcgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMiw2ICszMiwxMyBAQAogICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHMiCiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZyYW1ld29ya3MgVGVsZXBob255IFRlc3RzIj4KICAgICA8L2luc3RydW1lbnRhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSIuVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3Jrcy50ZWxlcGhvbnl0ZXN0cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iVGVzdCBSdW5uZXIgZm9yIE1vY2sgUmlsIFRlc3RzIgorICAgIC8+CisKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OWI4MS4uMDAwMDAwMAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKLWltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uU21hbGxUZXN0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuVGVsZXBob255TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyVXRpbHNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzE3MDA1NTU0MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIisxICg3MDApLjU1NS00MTQxIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDE0MSojIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQotICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKioyMSoqMTcwMDU1NTQxNDEjIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKioyMSoqKzE3MDA1NTU0MTQxIyIpCi0gICAgICAgICAgICAgICAgLy9UT0RPIHRoaXMgaXMgdGhlIGNvcnJlY3QgcmVzdWx0LCBhbHRob3VnaCB0aGUgYWJvdmUKLSAgICAgICAgICAgICAgICAvL3Jlc3VsdCBoYXMgYmVlbiByZXR1cm5lZCBzaW5jZSBjaGFuZ2UgMzE3NzYKLSAgICAgICAgICAgICAgICAvLyIqKjIxKiorMTcwMDU1NTQxNDEjIgotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIsMTIzNCIpKTsKLQotICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MDsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJ5dGVbXSBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIisxNzAwNTU1MDAyMCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgYlJldC5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaV0sIGJSZXRbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYlJldCA9IFBob25lTnVtYmVyVXRpbHMubmV0d29ya1BvcnRpb25Ub0NhbGxlZFBhcnR5QkNEV2l0aExlbmd0aCgiKzE3MDA1NTUwMDIwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBiUmV0Lmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhiUmV0WzBdLCA3KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhiW2kgLSAxXSwgYlJldFtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0QoIjcwMDU1NTAwMjAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiUmV0LCAwLCBiUmV0Lmxlbmd0aCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzAwNTU1MDAyMCMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDcpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg3MTsgYlsyXSA9IChieXRlKSAweDAwOyBiWzNdID0gKGJ5dGUpIDB4NTU7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNTsgYls1XSA9IChieXRlKSAweDIwOyBiWzZdID0gKGJ5dGUpIDB4QjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJCOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzIxIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QjE7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxIysiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDMpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMiLAotICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSMrIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA0KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4OUE7IGJbMl0gPSAoYnl0ZSkgMHhBOTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhCMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqOTkqKzE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgOSkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKjE3MDA1NTUwMDIwIyIsCi0gICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMTApKTsKLQotICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHhBQTsgYlsyXSA9IChieXRlKSAweDEyOyBiWzNdID0gKGJ5dGUpIDB4MUE7Ci0gICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwNzsgYls1XSA9IChieXRlKSAweDUwOyBiWzZdID0gKGJ5dGUpIDB4NTU7IGJbN10gPSAoYnl0ZSkgMHgwMDsKLSAgICAgICAgYls4XSA9IChieXRlKSAweDAyOyBiWzldID0gKGJ5dGUpIDB4RkI7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKioyMSorMTcwMDU1NTAwMjAjIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOwotCi0gICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweDJBOyBiWzJdID0gKGJ5dGUpIDB4QTE7IGJbM10gPSAoYnl0ZSkgMHg3MTsKLSAgICAgICAgYls0XSA9IChieXRlKSAweDAwOyBiWzVdID0gKGJ5dGUpIDB4NTU7IGJbNl0gPSAoYnl0ZSkgMHgwNTsgYls3XSA9IChieXRlKSAweDIwOwotICAgICAgICBiWzhdID0gKGJ5dGUpIDB4RjA7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKjIxKjE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsgYlszXSA9IChieXRlKSAweDcxOwotICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7Ci0gICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKzE3MDA1NTUwMDIwIiwKLSAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbihudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUobnVsbCwgIjEyMyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxMjMiLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2gobnVsbCkpOwotICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZChudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5zdHJpbmdGcm9tU3RyaW5nQW5kVE9BKG51bGwsIDEpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxNzAwNTU1NDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIrMSAoNzAwKS41NTUtNDE0MSIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIFRoaXMgbWF5IHNlZW0gd3JvbmcsIGJ1dCBpdCdzIHByb2JhYmx5IG9rCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEqIyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxNDEqIyIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4iKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OLDEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIxICg3MDApLjU1NS00MU5OOzEyMzQiKQotICAgICAgICApOwotCi0gICAgICAgIC8vIEFuIE1NSSBzdHJpbmcgaXMgdW5wZXJ0ZXJiZWQsIGV2ZW4gdGhvdWdoIGl0IGNvbnRhaW5zIGEKLSAgICAgICAgLy8gKHZhbGlkIGluIHRoaXMgY2FzZSkgZW1iZWRkZWQgKwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIioqMjEqKisxNzAwNTU1NDE0MSMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqKjIxKiorMTcwMDU1NTQxNDEjIikKLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIiozMSMrNDQ3OTY2MTY0MjA4IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKjMxIys0NDc5NjYxNjQyMDgiKQotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjICgrNDQpIDc5IDY2MTYgNDIwOCIpCi0gICAgICAgICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiwxMjM0IikpOwotCi0gICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQobnVsbCkpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIsMTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdFBvc3REaWFsUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxTk47MTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI7MTIzNCw7TiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxLTIuMzQgLDtOIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIGlzIG9kZAotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIiIsICIiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjkxMSIsICI5MTEiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjE4MDA1NTUwOTExIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICI1NTU1IikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjU1NTUiLCAiMTgwMDU1NTU1NTU1IikpOwotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIisxICg3MDApLjU1NS00MTQxLDEyMzQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiMTcwMDU1NTQxNDEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMTExNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMTcwMDU1NTQxNDEiLCAiMDAxNzAwNTU1NDE0MSIpKTsKLQotCi0gICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMrMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMSA5OTkgNzAwNTU1NDE0MSIsICIrMSA3MDA1NTU0MTQxIikpOwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDEgNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiMDExIDExIDcwMDU1NTQxNDEiLCAiKzE3MDA1NTU0MTQxIikpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjcwODU4ODIzMDAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwIDIwNyA3OTIgMzQ5MCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLyoqKioqIEZJWE1FJ3MgKioqKioqLwotICAgICAgICAvLwotICAgICAgICAvLyBNTUkgaGVhZGVyIHNob3VsZCBiZSBpZ25vcmVkCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIioqMzEjMTcwMDU1NTQxNDEiKSk7Ci0KLSAgICAgICAgLy8gSXQncyB0b28gYmFkIHRoaXMgaXMgZmFsc2UKLSAgICAgICAgLy8gKzQ0ICgwKSAyMDcgNzkyIDM0OTAgaXMgbm90IGEgZGlhbGFibGUgbnVtYmVyCi0gICAgICAgIC8vIGJ1dCBpdCBpcyBjb21tb25seSBob3cgRXVyb3BlYW4gcGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbgotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiKzQ0ICgwKSAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIGphcGFuZXNlIGludGVybmF0aW9uYWwgcHJlZml4LCBmb3IgZXhhbXBsZSwgbWVzc2VzIHVzIHVwCi0gICAgICAgIC8vIEJ1dCB3aG8gdXNlcyBhIEdTTSBwaG9uZSBpbiBKYXBhbj8KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAxMCA0NCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gVGhlIEF1c3RyYWxpYW4gb25lIG1lc3NlcyB1cyB1cCB0b28KLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQgMjA3IDc5MiAzNDkwIiwgIjAwMTEgNDQgMjA3IDc5MiAzNDkwIikpOwotCi0gICAgICAgIC8vIFRoZSBSdXNzaWFuIHRydW5rIHByZWZpeCBtZXNzZXMgdXMgdXAsIGFzIGRvZXMgY3VycmVudAotICAgICAgICAvLyBSdXNzaWFuIGFyZWEgY29kZXMgKHdoaWNoIGJlaW4gd2l0aCAwKQotCi0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzcoMDk1KTkxMDA3NjYiLCAiOCgwOTUpOTEwMDc2NiIpKTsKLQotICAgICAgICAvLyA0NDQgaXMgbm90IGEgdmFsaWQgY291bnRyeSBjb2RlLCBidXQKLSAgICAgICAgLy8gbWF0Y2hJbnRsUHJlZml4QW5kQ0MgZG9lc250IGtub3cgdGhpcwotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0NCAyMDcgNzkyIDM0OTAiLCAiMCAyMDcgNzkyIDM0OTAiKSk7Ci0KLSAgICAgICAgLy8gY29tcGFyZSBTTVMgc2hvcnQgY29kZQotICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNDA0LTA0IiwgIjQwNDA0IikpOwotICAgIH0KLQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb0NhbGxlcklESW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxNzAwNTU1NDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MTQxOzEyMzQiKSk7Ci0KLSAgICAgICAgLy90aGlzIHNlZW1zIHdyb25nLCBvciBhdCBsZWFzdCB1c2VsZXNzCi0gICAgICAgIGFzc2VydEVxdWFscygiTk4xNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDFOTiIpKTsKLQotICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKzIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIiojMDMxIyIpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDEsMTIzNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKLQotICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1MDA3MSIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMS03MDAtNTU1LTQxTk4iKSk7Ci0KLSAgICAgICAgLy88c2hydWc+IC0tIHRoZXNlIGFyZSBhbGwgbm90IHVzZWZ1bCwgYnV0IG5vdCB0ZXJyaWJseSB3cm9uZwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjIzMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDAzMisiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIisyMzAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiMxMzAjKiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKiMwMzEjIikpOwotICAgIH0KLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFucEZvcm1hdHRpbmcoKSB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMDU1NTEyMSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyMSIsIG51bWJlci50b1N0cmluZygpKTsKLQotICAgICAgICBudW1iZXIuY2xlYXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROYW5wTnVtYmVyKG51bWJlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiNTU1LTEyMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbnVtYmVyLmNsZWFyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjgwMC01NTUxMiIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MDAtNTU1LTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIG51bWJlci5jbGVhcigpOwotICAgICAgICBudW1iZXIuYXBwZW5kKCI0NjY0NSIpOwotICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0NjY0NSIsIG51bWJlci50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2NC00MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC1HT09HLTQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDBHT09HNDExIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjEtODAwLTQ2Ni00NDExIiwKLSAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMS04MDAtNDY2LTQ0MTEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTgwMDQ2NjQ0MTEiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxODAwNDY2NDQxMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMjItMzMzLTQ0NC01NTUtNjY2LTc3NzctODg4LTk5OTkiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDLURFRi1HSEktSktMLU1OTy1QUVJTLVRVVi1XWFlaIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCi0gICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMtZGVmLWdoaS1qa2wtbW5vLXBxcnMtdHV2LXd4eXoiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgMjIyLTMzMzQiLAotICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIoODAwKSBBQkMtREVGRyIpKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBydW4gdGhpcyB0ZXN0LCB0aGUgZGV2aWNlIGhhcyB0byBiZSByZWdpc3RlcmVkIHdpdGggbmV0d29yawotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDExMTIzNDU2NyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxMjM0NTY3IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTIzNDU2NzAwMDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzIzNDU2NzAwMDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTExODc1NzY3ODAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzExODc1NzY3ODAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxODQ3NTIzMTc1MyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTE4NDc1Nzk3MDAwLDE4NDc1MjMxNzUzIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7MDExODQ2OTMxMjM0NSIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7Kzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwwMTExMjM0NTY3IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwrMTIzNDU2NyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1OTcwMDA7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1OTcwMDA7KzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsLDAxMTg0NjkzMTIzNDUiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwrODQ2OTMxMjM0NSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTE4NDY5MzEyMzQ1IiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDssKzg0NjkzMTIzNDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MTg0NzUyMzE3NTMiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTg0NzUyMzE3NTMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDssMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCw7MDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLDsrMTE4NzU3NjcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsLDAxMTExODc1NzY3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwsLCsxMTg3NTc2NzAwMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywsMDExMTE4NzU3NjcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywsKzExODc1NzY3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIis7LDg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrOyw4NDc1Nzk3MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDAsIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMCwiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiODQ3KzU3OS03MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3KzU3OS03MDAwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiw4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiLDg0NzU3OTcwMDAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiOzs4NDc1Nzk3MDAwLCwiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI7Ozg0NzU3OTcwMDAsLCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIrdGhpcytpcyR3ZWlyZDssKyIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIit0aGlzK2lzJHdlaXJkOywrIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIiIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShudWxsKSk7Ci0gICAgfQotCi0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoIjE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAotICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTixQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIisxODQ3NTc5NzAwMCIsCi0gICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGVCeU51bWJlckZvcm1hdCgiKzE4NDc1Nzk3MDAwIiwKLSAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNpYyBjaGVja3MgZm9yIHRoZSBWb2ljZU1haWwgbnVtYmVyLgotICAgICAqLwotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE51bWJlck5vdEVxdWFsVG9Wb2ljZU1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiOTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCJ0ZWw6OTExIikpOwotICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCIrMTgwMDEyMzQ1NjciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcihudWxsKSk7Ci0gICAgICAgIC8vIFRoaXMgdGVzdCBmYWlscyBvbiBhIGRldmljZSB3aXRob3V0IGEgc2ltIGNhcmQKLSAgICAgICAgLypUZWxlcGhvbnlNYW5hZ2VyIG1UZWxlcGhvbnlNYW5hZ2VyID0KLSAgICAgICAgICAgIChUZWxlcGhvbnlNYW5hZ2VyKWdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOwotICAgICAgICBTdHJpbmcgbVZvaWNlTWFpbE51bWJlciA9IG1UZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWb2ljZU1haWxOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG1Wb2ljZU1haWxOdW1iZXIpKTsKLSAgICAgICAgKi8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2FuZHJvaWQvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVhZWNkLi4wMDAwMDAwCi0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvYW5kcm9pZC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OwotCi1pbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKLWltcG9ydCBhbmRyb2lkLnRleHQuU2VsZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGVTdHJpbmdCdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0V2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFBob25lTnVtYmVyV2F0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQFNtYWxsVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIeXBoZW5hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFRleHRXYXRjaGVyIHR3ID0gbmV3IFBob25lTnVtYmVyRm9ybWF0dGluZ1RleHRXYXRjaGVyKCk7Ci0gICAgICAgIG51bWJlci5hcHBlbmQoIjU1NS0xMjEyIik7Ci0gICAgICAgIC8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBlZGdlCi0gICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCAwKTsKLSAgICAgICAgdHcuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCAwLCAxKTsKLSAgICAgICAgLy8gSW5zZXJ0IGFuIDggYXQgdGhlIGJlZ2lubmluZwotICAgICAgICBudW1iZXIuaW5zZXJ0KDAsICI4Iik7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NTUtNTEyLTEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBAU21hbGxUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEh5cGhlbkRlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgVGV4dFdhdGNoZXIgdHcgPSBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoKTsKLSAgICAgICAgbnVtYmVyLmFwcGVuZCgiNTU1LTEyMTIiKTsKLSAgICAgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIGFmdGVyIHRoZSBoeXBoZW4KLSAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDQpOwotICAgICAgICAvLyBEZWxldGUgdGhlIGh5cGhlbgotICAgICAgICB0dy5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDMsIDEsIDApOwotICAgICAgICBudW1iZXIuZGVsZXRlKDMsIDQpOwotICAgICAgICB0dy5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGRlbGV0ZWQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGh5cGhlbiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTEtMjEyIiwgbnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGRlYWxzIHdpdGggbGVmdCBlZGdlIGJvdW5kYXJ5IGNhc2UKLSAgICAgICAgbnVtYmVyLmluc2VydCgwLCAiLSIpOwotICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMSk7Ci0gICAgICAgIHR3LmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMSwgMCk7Ci0gICAgICAgIG51bWJlci5kZWxldGUoMCwgMSk7Ci0gICAgICAgIHR3LmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgaXQgZGVsZXRlZCB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgaHlwaGVuIAotICAgICAgICBhc3NlcnRFcXVhbHMoIjU1MS0yMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29ya3MvdGVsZXBob255dGVzdHMvVGVsZXBob255TW9ja1JpbFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmtzL3RlbGVwaG9ueXRlc3RzL1RlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmZyYW1ld29ya3MudGVsZXBob255dGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmlsQ2hhbm5lbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbC5Nb2NrUmlsVGVzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgeworCisgICAgcHVibGljIFJpbENoYW5uZWwgbU1vY2tSaWxDaGFubmVsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RTdWl0ZSBnZXRBbGxUZXN0cygpIHsKKyAgICAgICAgbG9nKCJnZXRBbGxUZXN0cyBFIik7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNb2NrUmlsVGVzdC5jbGFzcyk7CisgICAgICAgIGxvZygiZ2V0QWxsVGVzdHMgWCIpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKKyAgICAgICAgbG9nKCJnZXRMb2FkZXIgRVgiKTsKKyAgICAgICAgcmV0dXJuIFRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBsb2coIm9uQ3JlYXRlIEUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbCA9IFJpbENoYW5uZWwubWFrZVJpbENoYW5uZWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIm9uQ3JlYXRlIFgiKTsKKworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgLy8gSSd2ZSBub3Qgc2VlbiB0aGlzIGNhbGxlZAorICAgICAgICBsb2coIm9uRGVzdHJveSBFWCIpOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHRocmVhZCBpcyBzdGFydGVkLgorICAgICAgICAvLyBBdCB0aGUgbW9tZW50IHdlIGRvbid0IG5lZWQgdGhlIHRocmVhZCBzbyByZXR1cm4KKyAgICAgICAgLy8gd2hpY2ggd2lsbCBzaHV0IGRvd24gdGhpcyB1bnVzZWQgdGhyZWFkLgorICAgICAgICBsb2coIm9uU3RhcnQgRVgiKTsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmlzaChpbnQgcmVzdWx0Q29kZSwgQnVuZGxlIHJlc3VsdHMpIHsKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gY29tcGxldGUgc28gSSBhc2sgdGhlIG1Nb2NrUmlsQ2hhbm5lbCB0byBxdWl0LgorICAgICAgICBsb2coImZpbmlzaCBFIik7CisgICAgICAgIG1Nb2NrUmlsQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICBsb2coImZpbmlzaCBYIik7CisgICAgICAgIHN1cGVyLmZpbmlzaChyZXN1bHRDb2RlLCByZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBzKSB7CisgICAgICAgIExvZy5lKCJUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbUFscGhhYmV0VGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKaW5kZXggM2E5YzUxMS4uNzAxMWFlYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXRUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuR3NtQWxwaGFiZXQ7CisKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwpAQCAtNTEsNyArNTMsNyBAQAogICAgICAgICAvLyAnQCcgbWFwcyB0byBjaGFyIDAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnQCcpKTsKIAotICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYXRlcgorICAgICAgICAvLyBgYSAoYSB3aXRoIGdyYXZlIGFjY2VudCkgbWFwcyB0byBsYXN0IEdTTSBjaGFyYWN0ZXIKICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4N2YsIEdzbUFscGhhYmV0LmNoYXJUb0dzbSgnXHUwMGUwJykpOwogCiAgICAgICAgIC8vCkBAIC0zMDcsNCArMzA5LDI2IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiYSIsCiAgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDEsIHVucGFja2VkLmxlbmd0aCAtIDEpKTsKICAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdzbThCaXRVcGFja2VkV2l0aEV1Y2tyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNvbWUgZmVhdHVyZSBwaG9uZXMgaW4gS29yZWEgc3RvcmUgY29udGFjdHMgYXMgZXVjLWtyLgorICAgICAgICAvLyBUZXN0IHRoaXMgc2l0dWF0aW9ucy4KKyAgICAgICAgYnl0ZSB1bnBhY2tlZFtdOworCisgICAgICAgIC8vIFRlc3QgZ2VuZXJhbCBhbHBoYWJldCBzdHJpbmdzLgorICAgICAgICB1bnBhY2tlZCA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjYxNjI2MzIwNjQ2NTY2RkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMgZGVmIiwKKyAgICAgICAgICAgICAgICBHc21BbHBoYWJldC5nc204Qml0VW5wYWNrZWRUb1N0cmluZyh1bnBhY2tlZCwgMCwgdW5wYWNrZWQubGVuZ3RoLCAiZXVjLWtyIikpOworCisgICAgICAgIC8vIFRlc3Qga29yZWFuIHN0cmluZ3MuCisgICAgICAgIHVucGFja2VkID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiQzVEN0JEQkFDNkFFRkYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdUQxNENcdUMyQTRcdUQyQjgiLAorICAgICAgICAgICAgICAgIEdzbUFscGhhYmV0LmdzbThCaXRVbnBhY2tlZFRvU3RyaW5nKHVucGFja2VkLCAwLCB1bnBhY2tlZC5sZW5ndGgsICJldWMta3IiKSk7CisKKyAgICAgICAgLy8gVGVzdCBnc20gRXh0ZW50ZWQgQ2hhcmFjdGVycy4KKyAgICAgICAgdW5wYWNrZWQgPSBHc21BbHBoYWJldC5zdHJpbmdUb0dzbThCaXRQYWNrZWQoc0dzbUV4dGVuZGVkQ2hhcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc0dzbUV4dGVuZGVkQ2hhcnMsCisgICAgICAgICAgICAgICAgR3NtQWxwaGFiZXQuZ3NtOEJpdFVucGFja2VkVG9TdHJpbmcodW5wYWNrZWQsIDAsIHVucGFja2VkLmxlbmd0aCwgImV1Yy1rciIpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNUZXN0LmphdmEKaW5kZXggMzEwM2ZjMS4uMjE1YzZjZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zVGVzdC5qYXZhCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0dzbVNtc1Rlc3QuamF2YQpAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KIHB1YmxpYyBjbGFzcyBHc21TbXNUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAogICAgIEBTbWFsbFRlc3QKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L01jY1RhYmxlVGVzdC5qYXZhIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKaW5kZXggMmQ2OTc3Yy4uN2ViM2RmOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGVUZXN0LmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIEBTbWFsbFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYygyMDgpLCAiRXVyb3BlL1BhcmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoMjA4KSwgIkVDVCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoTWNjVGFibGUuZGVmYXVsdFRpbWVab25lRm9yTWNjKDIzMiksICJFdXJvcGUvVmllbm5hIik7CiAgICAgICAgIGFzc2VydEVxdWFscyhNY2NUYWJsZS5kZWZhdWx0VGltZVpvbmVGb3JNY2MoNjU1KSwgIkFmcmljYS9Kb2hhbm5lc2J1cmciKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE1jY1RhYmxlLmRlZmF1bHRUaW1lWm9uZUZvck1jYyg0NDApLCAiQXNpYS9Ub2t5byIpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJVdGlsc1Rlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNmY1MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw1MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5QaG9uZU51bWJlclV0aWxzOworCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJVdGlsc1Rlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0TmV0d29ya1BvcnRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIrMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiKzEgKDcwMCkuNTU1LTQxNDEiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxNDEiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBUaGlzIG1heSBzZWVtIHdyb25nLCBidXQgaXQncyBwcm9iYWJseSBvaworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxKiMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MTQxKiMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiMTcwMDU1NTQxTk4iLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIxICg3MDApLjU1NS00MU5OIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTiwxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiMSAoNzAwKS41NTUtNDFOTjsxMjM0IikKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBbiBNTUkgc3RyaW5nIGlzIHVucGVydGVyYmVkLCBldmVuIHRob3VnaCBpdCBjb250YWlucyBhCisgICAgICAgIC8vICh2YWxpZCBpbiB0aGlzIGNhc2UpIGVtYmVkZGVkICsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqKjIxKioxNzAwNTU1NDE0MSMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKCIqKjIxKiorMTcwMDU1NTQxNDEjIikKKyAgICAgICAgICAgICAgICAvL1RPRE8gdGhpcyBpcyB0aGUgY29ycmVjdCByZXN1bHQsIGFsdGhvdWdoIHRoZSBhYm92ZQorICAgICAgICAgICAgICAgIC8vcmVzdWx0IGhhcyBiZWVuIHJldHVybmVkIHNpbmNlIGNoYW5nZSAzMTc3NgorICAgICAgICAgICAgICAgIC8vIioqMjEqKisxNzAwNTU1NDE0MSMiCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbigiIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb24oIiwxMjM0IikpOworCisgICAgICAgIGJ5dGUgW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkwOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNzAwNTU1MDAyMCIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYnl0ZVtdIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiKzE3MDA1NTUwMDIwIik7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBiUmV0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYltpXSwgYlJldFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBiUmV0ID0gUGhvbmVOdW1iZXJVdGlscy5uZXR3b3JrUG9ydGlvblRvQ2FsbGVkUGFydHlCQ0RXaXRoTGVuZ3RoKCIrMTcwMDU1NTAwMjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJSZXQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJSZXRbMF0sIDcpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJbaSAtIDFdLCBiUmV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXQgPSBQaG9uZU51bWJlclV0aWxzLm5ldHdvcmtQb3J0aW9uVG9DYWxsZWRQYXJ0eUJDRCgiNzAwNTU1MDAyMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGJSZXQsIDAsIGJSZXQubGVuZ3RoKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4NzE7IGJbMl0gPSAoYnl0ZSkgMHgwMDsgYlszXSA9IChieXRlKSAweDU1OworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDU7IGJbNV0gPSAoYnl0ZSkgMHgyMDsgYls2XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MDA1NTUwMDIwIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweDcxOyBiWzJdID0gKGJ5dGUpIDB4MDA7IGJbM10gPSAoYnl0ZSkgMHg1NTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA1OyBiWzVdID0gKGJ5dGUpIDB4MjA7IGJbNl0gPSAoYnl0ZSkgMHhCMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA3KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkI7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMjEjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAzKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDkxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhCMTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEjKyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgMykpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg4MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIyIsCisgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNhbGxlZFBhcnR5QkNEVG9TdHJpbmcoYiwgMCwgNCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxIysiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDQpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4ODE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSoxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHg5QTsgYlsyXSA9IChieXRlKSAweEE5OyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEIwOworICAgICAgICBhc3NlcnRFcXVhbHMoIio5OSorMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCA5KSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4QUE7IGJbMl0gPSAoYnl0ZSkgMHgxMjsgYlszXSA9IChieXRlKSAweDFBOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDc7IGJbNV0gPSAoYnl0ZSkgMHg1MDsgYls2XSA9IChieXRlKSAweDU1OyBiWzddID0gKGJ5dGUpIDB4MDA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHgwMjsgYls5XSA9IChieXRlKSAweEZCOworICAgICAgICBhc3NlcnRFcXVhbHMoIioqMjEqMTcwMDU1NTAwMjAjIiwKKyAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2FsbGVkUGFydHlCQ0RUb1N0cmluZyhiLCAwLCAxMCkpOworCisgICAgICAgIGJbMF0gPSAoYnl0ZSkgMHg5MTsgYlsxXSA9IChieXRlKSAweEFBOyBiWzJdID0gKGJ5dGUpIDB4MTI7IGJbM10gPSAoYnl0ZSkgMHgxQTsKKyAgICAgICAgYls0XSA9IChieXRlKSAweDA3OyBiWzVdID0gKGJ5dGUpIDB4NTA7IGJbNl0gPSAoYnl0ZSkgMHg1NTsgYls3XSA9IChieXRlKSAweDAwOworICAgICAgICBiWzhdID0gKGJ5dGUpIDB4MDI7IGJbOV0gPSAoYnl0ZSkgMHhGQjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKjIxKisxNzAwNTU1MDAyMCMiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDEwKSk7CisKKyAgICAgICAgYlswXSA9IChieXRlKSAweDgxOyBiWzFdID0gKGJ5dGUpIDB4MkE7IGJbMl0gPSAoYnl0ZSkgMHhBMTsgYlszXSA9IChieXRlKSAweDcxOworICAgICAgICBiWzRdID0gKGJ5dGUpIDB4MDA7IGJbNV0gPSAoYnl0ZSkgMHg1NTsgYls2XSA9IChieXRlKSAweDA1OyBiWzddID0gKGJ5dGUpIDB4MjA7CisgICAgICAgIGJbOF0gPSAoYnl0ZSkgMHhGMDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqMjEqMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBiWzBdID0gKGJ5dGUpIDB4OTE7IGJbMV0gPSAoYnl0ZSkgMHgyQTsgYlsyXSA9IChieXRlKSAweEIxOyBiWzNdID0gKGJ5dGUpIDB4NzE7CisgICAgICAgIGJbNF0gPSAoYnl0ZSkgMHgwMDsgYls1XSA9IChieXRlKSAweDU1OyBiWzZdID0gKGJ5dGUpIDB4MDU7IGJbN10gPSAoYnl0ZSkgMHgyMDsKKyAgICAgICAgYls4XSA9IChieXRlKSAweEYwOworICAgICAgICBhc3NlcnRFcXVhbHMoIioyMSMrMTcwMDU1NTAwMjAiLAorICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jYWxsZWRQYXJ0eUJDRFRvU3RyaW5nKGIsIDAsIDkpKTsKKworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24obnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZShudWxsLCAiMTIzIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIjEyMyIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaChudWxsKSk7CisgICAgICAgIGFzc2VydE51bGwoUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLnN0cmluZ0Zyb21TdHJpbmdBbmRUT0EobnVsbCwgMSkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKzE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiKzE3MDA1NTU0MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIisxNzAwNTU1NDE0MSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIisxICg3MDApLjU1NS00MTQxIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MTQxIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhpcyBtYXkgc2VlbSB3cm9uZywgYnV0IGl0J3MgcHJvYmFibHkgb2sKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDE0MSojIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDE0MSojIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjE3MDA1NTU0MU5OIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiMSAoNzAwKS41NTUtNDFOTiIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk4sMTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIxNzAwNTU1NDFOTiIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIjEgKDcwMCkuNTU1LTQxTk47MTIzNCIpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQW4gTU1JIHN0cmluZyBpcyB1bnBlcnRlcmJlZCwgZXZlbiB0aG91Z2ggaXQgY29udGFpbnMgYQorICAgICAgICAvLyAodmFsaWQgaW4gdGhpcyBjYXNlKSBlbWJlZGRlZCArCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKioyMSoqKzE3MDA1NTU0MTQxIyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIioqMjEqKisxNzAwNTU1NDE0MSMiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiKjMxIys0NDc5NjYxNjQyMDgiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIqMzEjKzQ0Nzk2NjE2NDIwOCIpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIqMzEjKzQ0Nzk2NjE2NDIwOCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0TmV0d29ya1BvcnRpb25BbHQoIiozMSMgKCs0NCkgNzkgNjYxNiA0MjA4IikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFBob25lTnVtYmVyVXRpbHMuZXh0cmFjdE5ldHdvcmtQb3J0aW9uQWx0KCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdCgiLDEyMzQiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmV4dHJhY3ROZXR3b3JrUG9ydGlvbkFsdChudWxsKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiwxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTiwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0IiwgUGhvbmVOdW1iZXJVdGlscy5leHRyYWN0UG9zdERpYWxQb3J0aW9uKCIrMSAoNzAwKS41NTUtNDFOTjsxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjsxMjM0LDtOIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmV4dHJhY3RQb3N0RGlhbFBvcnRpb24oIisxICg3MDApLjU1NS00MU5OOzEtMi4zNCAsO04iKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRoaXMgaXMgb2RkCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiIiwgIiIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiOTExIiwgIjkxMSIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI5MTEiLCAiMTgwMDU1NTA5MTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI1NTU1IiwgIjU1NTUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiNTU1NSIsICIxODAwNTU1NTU1NTUiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKzEgKDcwMCkuNTU1LTQxNDEsMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIxNzAwNTU1NDE0MSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICI3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICI1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAxMTE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzE3MDA1NTU0MTQxIiwgIjAwMTcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIxNzAwNTU1NDE0MSIsICIwMDE3MDA1NTU0MTQxIikpOworCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxNzAwNTU1NDE0MSIsICIqKjMxIysxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIisxIDk5OSA3MDA1NTU0MTQxIiwgIisxIDcwMDU1NTQxNDEiKSk7CisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMSA3MDA1NTU0MTQxIiwgIjcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIwMTEgMTEgNzAwNTU1NDE0MSIsICIrMTcwMDU1NTQxNDEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiNzA4NTg4MjMwMCIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAgMjA3IDc5MiAzNDkwIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDExIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvKioqKiogRklYTUUncyAqKioqKiovCisgICAgICAgIC8vCisgICAgICAgIC8vIE1NSSBoZWFkZXIgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrMTcwMDU1NTQxNDEiLCAiKiozMSMxNzAwNTU1NDE0MSIpKTsKKworICAgICAgICAvLyBJdCdzIHRvbyBiYWQgdGhpcyBpcyBmYWxzZQorICAgICAgICAvLyArNDQgKDApIDIwNyA3OTIgMzQ5MCBpcyBub3QgYSBkaWFsYWJsZSBudW1iZXIKKyAgICAgICAgLy8gYnV0IGl0IGlzIGNvbW1vbmx5IGhvdyBFdXJvcGVhbiBwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuCisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuY29tcGFyZSgiKzQ0IDIwNyA3OTIgMzQ5MCIsICIrNDQgKDApIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgamFwYW5lc2UgaW50ZXJuYXRpb25hbCBwcmVmaXgsIGZvciBleGFtcGxlLCBtZXNzZXMgdXMgdXAKKyAgICAgICAgLy8gQnV0IHdobyB1c2VzIGEgR1NNIHBob25lIGluIEphcGFuPworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDEwIDQ0IDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBUaGUgQXVzdHJhbGlhbiBvbmUgbWVzc2VzIHVzIHVwIHRvbworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmNvbXBhcmUoIis0NCAyMDcgNzkyIDM0OTAiLCAiMDAxMSA0NCAyMDcgNzkyIDM0OTAiKSk7CisKKyAgICAgICAgLy8gVGhlIFJ1c3NpYW4gdHJ1bmsgcHJlZml4IG1lc3NlcyB1cyB1cCwgYXMgZG9lcyBjdXJyZW50CisgICAgICAgIC8vIFJ1c3NpYW4gYXJlYSBjb2RlcyAod2hpY2ggYmVpbiB3aXRoIDApCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNygwOTUpOTEwMDc2NiIsICI4KDA5NSk5MTAwNzY2IikpOworCisgICAgICAgIC8vIDQ0NCBpcyBub3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUsIGJ1dAorICAgICAgICAvLyBtYXRjaEludGxQcmVmaXhBbmRDQyBkb2VzbnQga25vdyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCIrNDQ0IDIwNyA3OTIgMzQ5MCIsICIwIDIwNyA3OTIgMzQ5MCIpKTsKKworICAgICAgICAvLyBjb21wYXJlIFNNUyBzaG9ydCBjb2RlCisgICAgICAgIGFzc2VydFRydWUoUGhvbmVOdW1iZXJVdGlscy5jb21wYXJlKCI0MDQtMDQiLCAiNDA0MDQiKSk7CisgICAgfQorCisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvQ2FsbGVySURJbmRleGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNDE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjE3MDA1NTU0MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NSIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMS03MDAtNTU1LTQxNDE7MTIzNCIpKTsKKworICAgICAgICAvL3RoaXMgc2VlbXMgd3JvbmcsIG9yIGF0IGxlYXN0IHVzZWxlc3MKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTjE0NTU1IiwgUGhvbmVOdW1iZXJVdGlscy50b0NhbGxlcklETWluTWF0Y2goIjEtNzAwLTU1NS00MU5OIikpOworCisgICAgICAgIC8vPHNocnVnPiAtLSB0aGVzZSBhcmUgYWxsIG5vdCB1c2VmdWwsIGJ1dCBub3QgdGVycmlibHkgd3JvbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMzIiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMudG9DYWxsZXJJRE1pbk1hdGNoKCIrMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIjMTMwIyoiLCBQaG9uZU51bWJlclV0aWxzLnRvQ2FsbGVySURNaW5NYXRjaCgiKiMwMzEjIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTQxNDU1NTAwNzEiLCBQaG9uZU51bWJlclV0aWxzLmdldFN0cmlwcGVkUmV2ZXJzZWQoIjEtNzAwLTU1NS00MTQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MSwxMjM0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE0MTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDE0MTsxMjM0IikpOworCisgICAgICAgIC8vdGhpcyBzZWVtcyB3cm9uZywgb3IgYXQgbGVhc3QgdXNlbGVzcworICAgICAgICBhc3NlcnRFcXVhbHMoIk5OMTQ1NTUwMDcxIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIxLTcwMC01NTUtNDFOTiIpKTsKKworICAgICAgICAvLzxzaHJ1Zz4gLS0gdGhlc2UgYXJlIGFsbCBub3QgdXNlZnVsLCBidXQgbm90IHRlcnJpYmx5IHdyb25nCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDAzMiIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiMjMwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMDMyKyIsIFBob25lTnVtYmVyVXRpbHMuZ2V0U3RyaXBwZWRSZXZlcnNlZCgiKzIzMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIzEzMCMqIiwgUGhvbmVOdW1iZXJVdGlscy5nZXRTdHJpcHBlZFJldmVyc2VkKCIqIzAzMSMiKSk7CisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW5wRm9ybWF0dGluZygpIHsKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI4MDA1NTUxMjEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwNTU1MTIxIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIxIiwgbnVtYmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIG51bWJlci5jbGVhcigpOworICAgICAgICBudW1iZXIuYXBwZW5kKCI1NTUtMTIxMiIpOworICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE5hbnBOdW1iZXIobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NTUtMTIxMiIsIG51bWJlci50b1N0cmluZygpKTsKKworICAgICAgICBudW1iZXIuY2xlYXIoKTsKKyAgICAgICAgbnVtYmVyLmFwcGVuZCgiODAwLTU1NTEyIik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjgwMC01NTUtMTIiLCBudW1iZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbnVtYmVyLmNsZWFyKCk7CisgICAgICAgIG51bWJlci5hcHBlbmQoIjQ2NjQ1Iik7CisgICAgICAgIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TmFucE51bWJlcihudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQ2NjQ1IiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLTgwMC00NjY0LTQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjEtODAwLUdPT0ctNDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE4MDA0NjY0NDExIiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygiMTgwMEdPT0c0MTEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS04MDAtNDY2LTQ0MTEiLAorICAgICAgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jb252ZXJ0S2V5cGFkTGV0dGVyc1RvRGlnaXRzKCIxLTgwMC00NjYtNDQxMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODAwNDY2NDQxMSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIjE4MDA0NjY0NDExIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIyMi0zMzMtNDQ0LTU1NS02NjYtNzc3Ny04ODgtOTk5OSIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkMtREVGLUdISS1KS0wtTU5PLVBRUlMtVFVWLVdYWVoiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjIyLTMzMy00NDQtNTU1LTY2Ni03Nzc3LTg4OC05OTk5IiwKKyAgICAgICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY29udmVydEtleXBhZExldHRlcnNUb0RpZ2l0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYy1kZWYtZ2hpLWprbC1tbm8tcHFycy10dXYtd3h5eiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoODAwKSAyMjItMzMzNCIsCisgICAgICAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNvbnZlcnRLZXlwYWRMZXR0ZXJzVG9EaWdpdHMoIig4MDApIEFCQy1ERUZHIikpOworICAgIH0KKworICAgIC8vIFRvIHJ1biB0aGlzIHRlc3QsIHRoZSBkZXZpY2UgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBuZXR3b3JrCisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIisxODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTExMjM0NTY3IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiKzEyMzQ1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMjM0NTY3MDAwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMjM0NTY3MDAwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMDExMTE4NzU3Njc4MDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrMTE4NzU3Njc4MDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsKzE4NDc1MjMxNzUzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMTg0NzU3OTcwMDAsMTg0NzUyMzE3NTMiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIrODQ3NTc5NzAwMCwrMTg0NzUyMzE3NTMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMDswMTE4NDY5MzEyMzQ1IiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiODQ3NTc5NzAwMDsrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDAxMTEyMzQ1NjciLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCsxMjM0NTY3IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU5NzAwMDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU5NzAwMDsrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwsMDExODQ2OTMxMjM0NSIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsLCs4NDY5MzEyMzQ1IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LDAxMTg0NjkzMTIzNDUiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwOywrODQ2OTMxMjM0NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDsxODQ3NTIzMTc1MyIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxODQ3NTIzMTc1MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwOywwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCsxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLDswMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDAsOysxMTg3NTc2NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDc1Nzk3MDAwLCwsMDExMTE4NzU3NjcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCwsKzExODc1NzY3MDAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjg0NzU3OTcwMDA7LCwwMTExMTg3NTc2NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjg0NzU3OTcwMDA7LCwrMTE4NzU3NjcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzssODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIis7LDg0NzU3OTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODQ3NTc5NzAwMCwiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDc1Nzk3MDAwLCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4NDcrNTc5LTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCI4NDcrNTc5LTcwMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLDg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKCIsODQ3NTc5NzAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI7Ozg0NzU3OTcwMDAsLCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5jZG1hQ2hlY2tBbmRQcm9jZXNzUGx1c0NvZGUoIjs7ODQ3NTc5NzAwMCwsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIit0aGlzK2lzJHdlaXJkOywrIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiK3RoaXMraXMkd2VpcmQ7LCsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZSgiIikpOworICAgICAgICBhc3NlcnROdWxsKFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlKG51bGwpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9OQU5QKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX05BTlAsUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuY2RtYUNoZWNrQW5kUHJvY2Vzc1BsdXNDb2RlQnlOdW1iZXJGb3JtYXQoIisxODQ3NTc5NzAwMCIsCisgICAgICAgICAgICAgICAgUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfTkFOUCxQaG9uZU51bWJlclV0aWxzLkZPUk1BVF9VTktOT1dOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOLFBob25lTnVtYmVyVXRpbHMuRk9STUFUX0pBUEFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE4NDc1Nzk3MDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZUJ5TnVtYmVyRm9ybWF0KCIrMTg0NzU3OTcwMDAiLAorICAgICAgICAgICAgICAgIFBob25lTnVtYmVyVXRpbHMuRk9STUFUX1VOS05PV04sUGhvbmVOdW1iZXJVdGlscy5GT1JNQVRfVU5LTk9XTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGNoZWNrcyBmb3IgdGhlIFZvaWNlTWFpbCBudW1iZXIuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoTnVtYmVyTm90RXF1YWxUb1ZvaWNlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKCI5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoInRlbDo5MTEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIoIisxODAwMTIzNDU2NyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUGhvbmVOdW1iZXJVdGlscy5pc1ZvaWNlTWFpbE51bWJlcigiIikpOworICAgICAgICBhc3NlcnRGYWxzZShQaG9uZU51bWJlclV0aWxzLmlzVm9pY2VNYWlsTnVtYmVyKG51bGwpKTsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGZhaWxzIG9uIGEgZGV2aWNlIHdpdGhvdXQgYSBzaW0gY2FyZAorICAgICAgICAvKlRlbGVwaG9ueU1hbmFnZXIgbVRlbGVwaG9ueU1hbmFnZXIgPQorICAgICAgICAgICAgKFRlbGVwaG9ueU1hbmFnZXIpZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgIFN0cmluZyBtVm9pY2VNYWlsTnVtYmVyID0gbVRlbGVwaG9ueU1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldFZvaWNlTWFpbE51bWJlcigpOworICAgICAgICBhc3NlcnRUcnVlKFBob25lTnVtYmVyVXRpbHMuaXNWb2ljZU1haWxOdW1iZXIobVZvaWNlTWFpbE51bWJlcikpOworICAgICAgICAqLworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyVG9FMTY0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIisxNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyVG9FMTY0KCI2NTAgMjkxMDAwMCIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiMTIzNDU2NyIsICJ1cyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMTgwMDQ2NjQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlclRvRTE2NCgiODAwLUdPT0ctMTE0IiwgInVzIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0TnVtYmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MCAyOTEwMDAwIiwgInVzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjEyMzQ1NjciLCAidXMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKDgwMCkgNDY2LTQxMTQiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiODAwLUdPT0ctMTE0IiwgInVzIikpOworCisgICAgfQorCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVOdW1iZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiNjUwMjkxMDAwMCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI2NTAgMjkxMDAwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NTY3IiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIjEyLDMjNCo1NjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiODAwNDY2NDExNCIsIFBob25lTnVtYmVyVXRpbHMubm9ybWFsaXplTnVtYmVyKCI4MDAtR09PRy0xMTQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKzE2NTAyOTEwMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5ub3JtYWxpemVOdW1iZXIoIisxIDY1MCAyOTEwMDAwIikpOworICAgIH0KKworICAgIEBTbWFsbFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0RGFpbGFiZU51bWJlcigpIHsKKyAgICAgICAgLy8gVXNpbmcgdGhlIHBob25lTnVtYmVyRTE2NCdzIGNvdW50cnkgY29kZQorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwMjkxMDAwMCIsICIrMTY1MDI5MTAwMDAiLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBwaG9uZU51bWJlckUxNjQgaXMgbnVsbAorICAgICAgICBhc3NlcnRFcXVhbHMoIig2NTApIDI5MS0wMDAwIiwgUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoIjY1MDI5MTAwMDAiLCBudWxsLCAiVVMiKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgaGFzIGEgY291bnRyeSBjb2RlLgorICAgICAgICBhc3NlcnRFcXVhbHMoIisxIDY1MC0yOTEtMDAwMCIsIFBob25lTnVtYmVyVXRpbHMuZm9ybWF0TnVtYmVyKCIrMTY1MDI5MTAwMDAiLCBudWxsLCAiQ04iKSk7CisgICAgICAgIC8vIFRoZSBnaXZlbiBudW1iZXIgd2FzIGZvcm1hdHRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI2NTAtMjkxLTAwMDAiLCBQaG9uZU51bWJlclV0aWxzLmZvcm1hdE51bWJlcigiNjUwLTI5MS0wMDAwIiwgbnVsbCwgIlVTIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lTnVtYmVyV2F0Y2hlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU1NzNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVOdW1iZXJXYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNlbGVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CisKK3B1YmxpYyBjbGFzcyBQaG9uZU51bWJlcldhdGNoZXJUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hhcnMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtdWx0aUNoYXJzID0gIjY1MDEyMzQ1IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZDEgPSAiKDY1MCkgMTIzLTQ1IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIC8vIEFwcGVuZCBtb3JlIHRoYW4gb25lIGNoYXJzCisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbXVsdGlDaGFycy5sZW5ndGgoKSk7CisgICAgICAgIG51bWJlci5hcHBlbmQobXVsdGlDaGFycyk7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgMCwgMCwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICAgICAgLy8gQXBwZW5kIG9uZSBjaGFycworICAgICAgICBmaW5hbCBjaGFyIGFwcGVuZENoYXIgPSAnNic7CisgICAgICAgIGZpbmFsIFN0cmluZyBmb3JtYXR0ZWQyID0gIig2NTApIDEyMy00NTYiOworICAgICAgICBpbnQgbGVuID0gbnVtYmVyLmxlbmd0aCgpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSwgMCwgMSk7CisgICAgICAgIG51bWJlci5hcHBlbmQoYXBwZW5kQ2hhcik7CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOworICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgbGVuLCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMiwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0dGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdENoYXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdCA9ICI2NTAxMjM0NTY3OCI7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQxID0gIig2NTApIDEyMy00NTY3IjsKKyAgICAgICAgVGV4dFdhdGNoZXIgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGxhc3QgY2hhci4KKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCBsZW4gLSAxLCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZShsZW4gLSAxLCBsZW4pOworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIG51bWJlci5sZW5ndGgoKSAtIDEsIDEsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQxLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgICAgICAvLyBSZW1vdmUgbGFzdCA1IGNoYXJzCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQyID0gIig2NTApIDEyMyI7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgbnVtYmVyLmxlbmd0aCgpIC0gNCwgNCwgMCk7CisgICAgICAgIG51bWJlci5kZWxldGUobnVtYmVyLmxlbmd0aCgpIC0gNSwgbnVtYmVyLmxlbmd0aCgpKTsKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCBudW1iZXIubGVuZ3RoKCksIDQsIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQyLmxlbmd0aCgpLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRDaGFycygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMjMiOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQxID0gIig2NTApIDEyMyI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBJbnNlcnQgb25lIGNoYXIKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg0LCAiMSIpOyAvLyAoNjUwMSkgMjMKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIDUpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgMQorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgNCwgMCwgMSk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzEnCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworCisgICAgICAgIC8vIEluc2VydCBtdWx0aXBsZSBjaGFycworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQyID0gIig2NTApIDE0NS02NzIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg3LCAiNDU2NyIpOyAvLyBjaGFuZ2UgdG8gKDY1MCkgMTQ1NjcyMworICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgMTEpOyAvLyB0aGUgY3Vyc29yIGlzIGF0IHRoZSByaWdodCBvZiAnNycuCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA3LCAwLCA0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNycKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uRW5kKG51bWJlcikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wRm9ybWF0dGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIoNjUwKSAxMjMgNCI7CisgICAgICAgIFRleHRXYXRjaGVyIHRleHRXYXRjaGVyID0gZ2V0VGV4dFdhdGNoZXIoKTsKKworICAgICAgICAvLyBBcHBlbmQgc3BhY2UKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg5LCAiIDQiKTsgLy8gKDY1MDEpIDIzIDQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAyKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQxLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMS5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKworICAgICAgICAvLyBEZWxldGUgYSAnKScKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9Iig2NTAgMTIzIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgbnVtYmVyLmRlbGV0ZSg0LCA1KTsgLy8gKDY1MDEgMjMgNAorICAgICAgICBTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKG51bWJlciwgNSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiAxCisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA0LCAxLCAwKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnMScKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGEgaHlwaGVuCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDMgPSIoNjUwKSAxMi0zIjsKKyAgICAgICAgdGV4dFdhdGNoZXIgPSBnZXRUZXh0V2F0Y2hlcigpOworICAgICAgICBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA4LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg4LCAiLSIpOyAvLyAoNjUwKSAxMi0zCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA5KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIC0KKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDgsIDAsIDEpOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDMsIG51bWJlci50b1N0cmluZygpKTsKKyAgICAgICAgLy8gdGhlIGN1cnNvciBzaG91bGQgc3RpbGwgYXQgdGhlIHJpZ2h0IG9mICctJworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdGFydEZvcm1hdHRpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbml0ID0gIig2NTApIDEyMyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZDEgPSAiKDY1MCkgMTIzIDQiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgLy8gQXBwZW5kIHNwYWNlCisgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgbnVtYmVyID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIoaW5pdCk7CisgICAgICAgIHRleHRXYXRjaGVyLmJlZm9yZVRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIG51bWJlci5pbnNlcnQoOSwgIiA0Iik7IC8vICg2NTApIDEyMyA0CisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCBudW1iZXIubGVuZ3RoKCkpOyAvLyBtYWtlIHRoZSBjdXJzb3IgYXQgcmlnaHQgb2YgNAorICAgICAgICB0ZXh0V2F0Y2hlci5vblRleHRDaGFuZ2VkKG51bWJlciwgOSwgMCwgMik7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICAvLyB0aGUgY3Vyc29yIHNob3VsZCBzdGlsbCBhdCB0aGUgcmlnaHQgb2YgJzQnCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZDEubGVuZ3RoKCksIFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25FbmQobnVtYmVyKSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc3RyaW5nLCBhbmQgc3RhcnQgZm9ybWF0dGluZyBhZ2Fpbi4KKyAgICAgICAgaW50IGxlbiA9IG51bWJlci5sZW5ndGgoKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICBudW1iZXIuZGVsZXRlKDAsIGxlbik7CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCAwLCBsZW4sIDApOworICAgICAgICB0ZXh0V2F0Y2hlci5hZnRlclRleHRDaGFuZ2VkKG51bWJlcik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMiA9ICIoNjUwKSAxMjMtNCI7CisgICAgICAgIG51bWJlciA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKGluaXQpOworICAgICAgICB0ZXh0V2F0Y2hlci5iZWZvcmVUZXh0Q2hhbmdlZChudW1iZXIsIDksIDAsIDEpOworICAgICAgICBudW1iZXIuaW5zZXJ0KDksICI0Iik7IC8vICg2NTApIDEyMzQKKyAgICAgICAgU2VsZWN0aW9uLnNldFNlbGVjdGlvbihudW1iZXIsIG51bWJlci5sZW5ndGgoKSk7IC8vIG1ha2UgdGhlIGN1cnNvciBhdCByaWdodCBvZiA0CisgICAgICAgIHRleHRXYXRjaGVyLm9uVGV4dENoYW5nZWQobnVtYmVyLCA5LCAwLCAxKTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYWZ0ZXJUZXh0Q2hhbmdlZChudW1iZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQyLCBudW1iZXIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIHRoZSBjdXJzb3Igc2hvdWxkIHN0aWxsIGF0IHRoZSByaWdodCBvZiAnNCcKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMi5sZW5ndGgoKSwgU2VsZWN0aW9uLmdldFNlbGVjdGlvbkVuZChudW1iZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dENoYW5nZWRCeU90aGVyVGV4dFdhdGNoZXIoKSB7CisgICAgICAgIGZpbmFsIFRleHRXYXRjaGVyIGNsZWFudXBUZXh0V2F0Y2hlciA9IG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGluaXQgPSAiKDY1MCkgMTIzIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkMSA9ICIiOworICAgICAgICBUZXh0V2F0Y2hlciB0ZXh0V2F0Y2hlciA9IGdldFRleHRXYXRjaGVyKCk7CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBudW1iZXIgPSBuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcihpbml0KTsKKyAgICAgICAgdGV4dFdhdGNoZXIuYmVmb3JlVGV4dENoYW5nZWQobnVtYmVyLCA1LCAwLCAxKTsKKyAgICAgICAgbnVtYmVyLmluc2VydCg1LCAiNCIpOyAvLyAoNjUwNCkgMTIzCisgICAgICAgIFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24obnVtYmVyLCA1KTsgLy8gbWFrZSB0aGUgY3Vyc29yIGF0IHJpZ2h0IG9mIDQKKyAgICAgICAgdGV4dFdhdGNoZXIub25UZXh0Q2hhbmdlZChudW1iZXIsIDUsIDAsIDEpOworICAgICAgICBudW1iZXIuc2V0U3BhbihjbGVhbnVwVGV4dFdhdGNoZXIsIDAsIG51bWJlci5sZW5ndGgoKSwgMCk7CisgICAgICAgIHRleHRXYXRjaGVyLmFmdGVyVGV4dENoYW5nZWQobnVtYmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkMSwgbnVtYmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgVGV4dFdhdGNoZXIgZ2V0VGV4dFdhdGNoZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGhvbmVOdW1iZXJGb3JtYXR0aW5nVGV4dFdhdGNoZXIoIlVTIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2ltVXRpbHNUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQppbmRleCBkYjM4ZWRlLi5lZjYyZDg1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TaW1VdGlsc1Rlc3QuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gZGF0YSwgZGF0YTI7CiAKLSAgICAgICAgLyogCisgICAgICAgIC8qCiAgICAgICAgICAqIGJjZFRvU3RyaW5nKCkKICAgICAgICAgICovCiAKQEAgLTQwLDkgKzQwLDEzIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiMDEyNjA0NTAwMTQ0ODQ4NiIsIEljY1V0aWxzLmJjZFRvU3RyaW5nKGRhdGEsIDEsIGRhdGEubGVuZ3RoIC0gMikpOwogCiAgICAgICAgIC8vIFN0b3BzIG9uIGludmFsaWQgQkNEIHZhbHVlCi0gICAgICAgIGRhdGEgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCI5OEYwNjI0MDA1MTA0NDQ4NjhmMiIpOworICAgICAgICBkYXRhID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiOThFMDYyNDAwNTEwNDQ0ODY4ZjIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCI4OTAiLCBJY2NVdGlscy5iY2RUb1N0cmluZyhkYXRhLCAwLCBkYXRhLmxlbmd0aCkpOwogCisgICAgICAgIC8vIHNraXAgdGhlIGhpZ2ggbmliYmxlICdGJyBzaW5jZSBzb21lIFBMTU5zIGhhdmUgaXQKKyAgICAgICAgZGF0YSA9IEljY1V0aWxzLmhleFN0cmluZ1RvQnl0ZXMoIjk4RjA2MjQwMDUxMDQ0NDg2OGYyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiODkwMjYwNDUwMDE0NDg0ODYyIiwgSWNjVXRpbHMuYmNkVG9TdHJpbmcoZGF0YSwgMCwgZGF0YS5sZW5ndGgpKTsKKwogICAgICAgICAvKgogICAgICAgICAgKiBnc21CY2RCeXRlVG9JbnQoKQogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9UZXN0UGhvbmVOb3RpZmllci5qYXZhCmluZGV4IDQyNzc5NWIuLjhjYjA1Y2MgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Rlc3RQaG9uZU5vdGlmaWVyLmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvVGVzdFBob25lTm90aWZpZXIuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKKwogLyoqCiAgKiBTdHViIGNsYXNzIHVzZWQgZm9yIHVuaXQgdGVzdHMKICAqLwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2VsbExvY2F0aW9uKFBob25lIHNlbmRlcikgewogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNpZ25hbFN0cmVuZ3RoKFBob25lIHNlbmRlcikgewogICAgIH0KIApAQCAtNDIsMTAgKzQ0LDE0IEBACiAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2FsbEZvcndhcmRpbmdDaGFuZ2VkKFBob25lIHNlbmRlcikgewogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbikgeworICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lIHNlbmRlciwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGFwblR5cGUpIHsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbkZhaWxlZChQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24pIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEYXRhQ29ubmVjdGlvbihQaG9uZSBzZW5kZXIsIFN0cmluZyByZWFzb24sIFN0cmluZyBhcG5UeXBlLAorICAgICAgICAgICAgUGhvbmUuRGF0YVN0YXRlIHN0YXRlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RGF0YUNvbm5lY3Rpb25GYWlsZWQoUGhvbmUgc2VuZGVyLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgYXBuVHlwZSkgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeURhdGFBY3Rpdml0eShQaG9uZSBzZW5kZXIpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZVRlc3QuamF2YQppbmRleCBiOTY3NDNhLi40ODU1NDJiIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmVUZXN0LmphdmEKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lVGVzdC5qYXZhCkBAIC0xOCwyNyArMTgsMjEgQEAKIAogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlNlcnZpY2VTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ2FsbFN0YXRlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Db25uZWN0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5NbWlDb2RlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5QaG9uZTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVzdFBob25lTm90aWZpZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5DYWxsRmFpbENhdXNlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR1NNUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5HU01UZXN0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLkdzbU1taUNvZGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TdXBwU2VydmljZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRDb21tYW5kczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkudGVzdC5TaW11bGF0ZWRSYWRpb0NvbnRyb2w7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L21vY2tyaWwvTW9ja1JpbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ1YjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvbW9ja3JpbC9Nb2NrUmlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkubW9ja3JpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2dIZWFkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29tbXVuaWNhdGlvbi5Nc2c7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJpbENoYW5uZWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LnJpbF9wcm90by5SaWxDdHJsQ21kczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkucmlsX3Byb3RvLlJpbENtZHM7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLnRlbGVwaG9ueXRlc3RzLlRlbGVwaG9ueU1vY2tSaWxUZXN0UnVubmVyOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubWljcm8uSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb247CisKKy8vIFRlc3Qgc3VpdGUgZm9yIHRlc3QgcmlsCitwdWJsaWMgY2xhc3MgTW9ja1JpbFRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNb2NrUmlsVGVzdCI7CisKKyAgICBSaWxDaGFubmVsIG1Nb2NrUmlsQ2hhbm5lbDsKKyAgICBUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lciBtUnVubmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbVJ1bm5lciA9IChUZWxlcGhvbnlNb2NrUmlsVGVzdFJ1bm5lcilnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbU1vY2tSaWxDaGFubmVsID0gbVJ1bm5lci5tTW9ja1JpbENoYW5uZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgTG9nLnYoVEFHLCBzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHByb3RvYnVmIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbgorICAgICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9idWZTZXJEZXMoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTWljcm9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RQcm90b2J1ZlNlcmRlcyBFIik7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnMgPSBuZXcgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBycy5zdGF0ZSA9PSAwIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMCk7CisgICAgICAgIHJzLnNldFN0YXRlKDEpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHJzLnN0YXRlID09IDEgd2FzICVkIiwgcnMuZ2V0U3RhdGUoKSksCisgICAgICAgICAgICAgICAgcnMuZ2V0U3RhdGUoKSA9PSAxKTsKKworICAgICAgICBieXRlW10gcnNfc2VyID0gcnMudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNOZXcgPSBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5wYXJzZUZyb20ocnNfc2VyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCByc05ldy5zdGF0ZSA9PSAxIHdhcyAlZCIsIHJzLmdldFN0YXRlKCkpLAorICAgICAgICAgICAgICAgIHJzLmdldFN0YXRlKCkgPT0gMSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0UHJvdG9idWZTZXJkZXMgWCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZWNobyBjb21tYW5kIHdvcmtzIHVzaW5nIHdyaXRlTXNnICYgcmVhZE1zZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvTXNnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBFIik7CisKKyAgICAgICAgTXNnSGVhZGVyIG1oID0gbmV3IE1zZ0hlYWRlcigpOworICAgICAgICBtaC5zZXRDbWQoMCk7CisgICAgICAgIG1oLnNldFRva2VuKDEpOworICAgICAgICBtaC5zZXRTdGF0dXMoMik7CisgICAgICAgIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7CisgICAgICAgIGRhdGEucHV0KChieXRlKTMpOworICAgICAgICBkYXRhLnB1dCgoYnl0ZSk0KTsKKyAgICAgICAgZGF0YS5wdXQoKGJ5dGUpNSk7CisgICAgICAgIE1zZy5zZW5kKG1Nb2NrUmlsQ2hhbm5lbCwgbWgsIGRhdGEpOworCisgICAgICAgIE1zZyByZXNwTXNnID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLmNtZCA9PSAwIHdhcyAlZCIscmVzcE1zZy5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXRDbWQoKSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnRva2VuID09IDEgd2FzICVkIixyZXNwTXNnLmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0VG9rZW4oKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuaGVhZGVyLnN0YXR1cyA9PSAyIHdhcyAlZCIsIHJlc3BNc2cuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0U3RhdHVzKCkgPT0gMik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbWhkLmRhdGFbMF0gPT0gMyB3YXMgJWQiLCByZXNwTXNnLmdldERhdGEoMCkpLAorICAgICAgICAgICAgICAgIHJlc3BNc2cuZ2V0RGF0YSgwKSA9PSAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBtaGQuZGF0YVsxXSA9PSA0IHdhcyAlZCIsIHJlc3BNc2cuZ2V0RGF0YSgxKSksCisgICAgICAgICAgICAgICAgcmVzcE1zZy5nZXREYXRhKDEpID09IDQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIG1oZC5kYXRhWzJdID09IDUgd2FzICVkIiwgcmVzcE1zZy5nZXREYXRhKDIpKSwKKyAgICAgICAgICAgICAgICByZXNwTXNnLmdldERhdGEoMikgPT0gNSk7CisKKyAgICAgICAgbG9nKCJ0ZXN0RWNob01zZyBYIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBnZXQgYXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXMoKSB7CisgICAgICAgIGxvZygidGVzdEdldEFzIEUiKTsKKworICAgICAgICAvLyBVc2UgYSBtZXNzYWdlIGhlYWRlciBhcyB0aGUgcHJvdG9idWYgZGF0YSBjb250ZW50CisgICAgICAgIE1zZ0hlYWRlciBtaCA9IG5ldyBNc2dIZWFkZXIoKTsKKyAgICAgICAgbWguc2V0Q21kKDEyMzQ1KTsKKyAgICAgICAgbWguc2V0VG9rZW4oOTg3Nik7CisgICAgICAgIG1oLnNldFN0YXR1cyg3NjU0KTsKKyAgICAgICAgbWguc2V0TGVuZ3RoRGF0YSg0MzIxKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBtaC50b0J5dGVBcnJheSgpOworICAgICAgICBNc2dIZWFkZXIgbWhSZXN1bHQgPSBNc2cuZ2V0QXMoTXNnSGVhZGVyLmNsYXNzLCBkYXRhKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGNtZCA9PSAxMjM0NSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0Q21kKCkgPT0gMTIzNDUpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHRva2VuID09IDk4NzYgd2FzICVkIiwgbWhSZXN1bHQuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0VG9rZW4oKSA9PSA5ODc2KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBzdGF0dXMgPT0gNzY1NCB3YXMgJWQiLCBtaFJlc3VsdC5nZXRTdGF0dXMoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0U3RhdHVzKCkgPT0gNzY1NCk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgbGVuZ3RoRGF0YSA9PSA0MzIxIHdhcyAlZCIsIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSksCisgICAgICAgICAgICAgICAgbWhSZXN1bHQuZ2V0TGVuZ3RoRGF0YSgpID09IDQzMjEpOworCisgICAgICAgIE1zZyBtc2cgPSBNc2cub2J0YWluKCk7CisgICAgICAgIG1zZy5zZXREYXRhKEJ5dGVCdWZmZXIud3JhcChkYXRhKSk7CisKKyAgICAgICAgbWhSZXN1bHQgPSBtc2cuZ2V0RGF0YUFzKE1zZ0hlYWRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBjbWQgPT0gMTIzNDUgd2FzICVkIiwgbWhSZXN1bHQuZ2V0Q21kKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldENtZCgpID09IDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIG1oUmVzdWx0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFRva2VuKCkgPT0gOTg3Nik7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgc3RhdHVzID09IDc2NTQgd2FzICVkIiwgbWhSZXN1bHQuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldFN0YXR1cygpID09IDc2NTQpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIGxlbmd0aERhdGEgPT0gNDMyMSB3YXMgJWQiLCBtaFJlc3VsdC5nZXRMZW5ndGhEYXRhKCkpLAorICAgICAgICAgICAgICAgIG1oUmVzdWx0LmdldExlbmd0aERhdGEoKSA9PSA0MzIxKTsKKworICAgICAgICBsb2coInRlc3RHZXRBcyBYIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFJhZGlvU3RhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIEUiKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIDEsIDk4NzYsIDAsIG51bGwpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKyAgICAgICAgLy9yZXNwLnByaW50SGVhZGVyKCJ0ZXN0R2V0UmFkaW9TdGF0ZSIpOworCisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgY21kID09IDEgd2FzICVkIiwgcmVzcC5nZXRDbWQoKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRDbWQoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCB0b2tlbiA9PSA5ODc2IHdhcyAlZCIsIHJlc3AuZ2V0VG9rZW4oKSksCisgICAgICAgICAgICAgICAgcmVzcC5nZXRUb2tlbigpID09IDk4NzYpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoImV4cGVjdGVkIHN0YXR1cyA9PSAwIHdhcyAlZCIsIHJlc3AuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIHJlc3AuZ2V0U3RhdHVzKCkgPT0gMCk7CisKKyAgICAgICAgUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUgcnNwID0gcmVzcC5nZXREYXRhQXMoUmlsQ3RybENtZHMuQ3RybFJzcFJhZGlvU3RhdGUuY2xhc3MpOworCisgICAgICAgIGludCBzdGF0ZSA9IHJzcC5nZXRTdGF0ZSgpOworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIHN0YXRlPSIgKyBzdGF0ZSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiZXhwZWN0ZWQgUmFkaW9TdGF0ZSA+PSAwICYmIFJhZGlvU3RhdGUgPD0gOSB3YXMgJWQiLCBzdGF0ZSksCisgICAgICAgICAgICAgICAgKChzdGF0ZSA+PSAwKSAmJiAoc3RhdGUgPD0gOSkpKTsKKworICAgICAgICBsb2coInRlc3RHZXRSYWRpb1N0YXRlIFgiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmFkaW9TdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZygidGVzdFNldFJhZGlvU3RhdGUgRSIpOworCisgICAgICAgIFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlIGNtZHJzID0gbmV3IFJpbEN0cmxDbWRzLkN0cmxSZXFSYWRpb1N0YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBjbWRycy5zZXRTdGF0ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjbWRycy5nZXRTdGF0ZSgpKTsKKworICAgICAgICBNc2cuc2VuZChtTW9ja1JpbENoYW5uZWwsIFJpbEN0cmxDbWRzLkNUUkxfQ01EX1NFVF9SQURJT19TVEFURSwgMCwgMCwgY21kcnMpOworCisgICAgICAgIE1zZyByZXNwID0gTXNnLnJlY3YobU1vY2tSaWxDaGFubmVsKTsKKworICAgICAgICBSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZSByc3AgPSByZXNwLmdldERhdGFBcyhSaWxDdHJsQ21kcy5DdHJsUnNwUmFkaW9TdGF0ZS5jbGFzcyk7CisKKyAgICAgICAgaW50IHN0YXRlID0gcnNwLmdldFN0YXRlKCk7CisgICAgICAgIGxvZygiZ2V0IHJlc3BvbnNlIGZvciB0ZXN0U2V0UmFkaW9TdGF0ZTogIiArIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShSaWxDbWRzLlJBRElPU1RBVEVfU0lNX05PVF9SRUFEWSA9PSBzdGF0ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Mb2FkZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTY1OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0xvYWRlclRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyLk9uTG9hZENvbXBsZXRlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKKworLyoqCisgKiBBIGNvbnZlbmllbmNlIGNsYXNzIGZvciB0ZXN0aW5nIHtAbGluayBMb2FkZXJ9cy4gVGhpcyB0ZXN0IGNhc2UKKyAqIHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBzeW5jaHJvbm91c2x5IGdldCB0aGUgcmVzdWx0IGZyb20gYSBMb2FkZXIgbWFraW5nCisgKiBpdCBlYXN5IHRvIGFzc2VydCB0aGF0IHRoZSBMb2FkZXIgcmV0dXJucyB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorICovCitwdWJsaWMgY2xhc3MgTG9hZGVyVGVzdENhc2UgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIEZvcmNlIGNsYXNzIGxvYWRpbmcgb2YgQXN5bmNUYXNrIG9uIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IGl0J3MgaGFuZGxlcnMgYXJlIHRpZWQgdG8KKyAgICAgICAgLy8gdGhlIG1haW4gdGhyZWFkIGFuZCByZXNwb25zZXMgZnJvbSB0aGUgd29ya2VyIHRocmVhZCBnZXQgZGVsaXZlcmVkIG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICAgICAgLy8gVGhlIHRlc3RzIGFyZSBydW4gb24gYW5vdGhlciB0aHJlYWQsIGFsbG93aW5nIHRoZW0gdG8gYmxvY2sgd2FpdGluZyBvbiBhIHJlc3BvbnNlIGZyb20KKyAgICAgICAgLy8gdGhlIGNvZGUgcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQuIFRoZSBtYWluIHRocmVhZCBjYW4ndCBibG9jayBzaW5jZSB0aGUgQXlzbmNUYXNrCisgICAgICAgIC8vIHJlc3VsdHMgY29tZSBpbiB2aWEgdGhlIGV2ZW50IGxvb3AuCisgICAgICAgIG5ldyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgVm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBWb2lkIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJncykge3JldHVybiBudWxsO30KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShWb2lkIHJlc3VsdCkge30KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGEgTG9hZGVyIHN5bmNocm9ub3VzbHkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZC4gVGhlIGxvYWRlciB3aWxsCisgICAgICogYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIGRlc3Ryb3llZCBieSB0aGlzIG1ldGhvZCBzbyBpdCBjYW5ub3QgYmUgcmV1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgbG9hZGVyIHRvIHJ1biBzeW5jaHJvbm91c2x5CisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IGZyb20gdGhlIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBnZXRMb2FkZXJSZXN1bHRTeW5jaHJvbm91c2x5KGZpbmFsIExvYWRlcjxUPiBsb2FkZXIpIHsKKyAgICAgICAgLy8gVGhlIHRlc3QgdGhyZWFkIGJsb2NrcyBvbiB0aGlzIHF1ZXVlIHVudGlsIHRoZSBsb2FkZXIgcHV0cyBpdCdzIHJlc3VsdCBpbgorICAgICAgICBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8VD4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFQ+KDEpOworCisgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBhbmQgdW5ibG9ja3MgdGhlIHRlc3QgdGhyZWFkCisgICAgICAgIC8vIHdoZW4gaXQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlIGJsb2NraW5nIHF1ZXVlCisgICAgICAgIGZpbmFsIE9uTG9hZENvbXBsZXRlTGlzdGVuZXI8VD4gbGlzdGVuZXIgPSBuZXcgT25Mb2FkQ29tcGxldGVMaXN0ZW5lcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2FkQ29tcGxldGUoTG9hZGVyPFQ+IGNvbXBsZXRlZExvYWRlciwgVCBkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gU2h1dCB0aGUgbG9hZGVyIGRvd24KKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRMb2FkZXIudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5zdG9wTG9hZGluZygpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlZExvYWRlci5kZXN0cm95KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzdWx0LCB1bmJsb2NraW5nIHRoZSB0ZXN0IHRocmVhZAorICAgICAgICAgICAgICAgIHF1ZXVlLmFkZChkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgcnVucyBvbiB0aGUgIm1haW4iIHRocmVhZCBvZiB0aGUgcHJvY2VzcyBzaW5jZSBBc3luY1Rhc2sKKyAgICAgICAgLy8gaXMgZG9jdW1lbnRlZCBhcyBuZWVkaW5nIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIG1hbnkgTG9hZGVycyB1c2UKKyAgICAgICAgLy8gQXN5bmNUYXNrCisgICAgICAgIGZpbmFsIEhhbmRsZXIgbWFpblRocmVhZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBsb2FkZXIucmVnaXN0ZXJMaXN0ZW5lcigwLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbG9hZGVyLnN0YXJ0TG9hZGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIEFzayB0aGUgbWFpbiB0aHJlYWQgdG8gc3RhcnQgdGhlIGxvYWRpbmcgcHJvY2VzcworICAgICAgICBtYWluVGhyZWFkSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKDApOworCisgICAgICAgIC8vIEJsb2NrIG9uIHRoZSBxdWV1ZSB3YWl0aW5nIGZvciB0aGUgcmVzdWx0IG9mIHRoZSBsb2FkIHRvIGJlIGluc2VydGVkCisgICAgICAgIFQgcmVzdWx0OworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWV1ZS50YWtlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIndhaXRpbmcgdGhyZWFkIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKaW5kZXggZTExNzJjZi4uNzRjZWJlZSAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlLmphdmEKQEAgLTczLDYgKzczLDE4IEBACiAgICAgICAgIG1SZXNvbHZlci5hZGRQcm92aWRlcihtUHJvdmlkZXJBdXRob3JpdHksIGdldFByb3ZpZGVyKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCiAgICAgcHVibGljIE1vY2tDb250ZW50UmVzb2x2ZXIgZ2V0TW9ja0NvbnRlbnRSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIG1SZXNvbHZlcjsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKaW5kZXggMWZiNTUzOC4uMjgxMWIwZCAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQpAQCAtNzQsNyArNzQsNyBAQAogICAgIHByaXZhdGUgSXNvbGF0ZWRDb250ZXh0IG1Qcm92aWRlckNvbnRleHQ7CiAgICAgcHJpdmF0ZSBNb2NrQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKIAotICAgICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgeworICAgIHByaXZhdGUgY2xhc3MgTW9ja0NvbnRleHQyIGV4dGVuZHMgTW9ja0NvbnRleHQgewogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKQEAgLTg3LDYgKzg3LDExIEBACiAgICAgICAgICAgICAvLyBvbmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIENvbnRleHQKICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0KCkuZ2V0RGlyKCJtb2NrY29udGV4dDJfIiArIG5hbWUsIG1vZGUpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CiAgICAgfQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgpAQCAtMTQxLDYgKzE0NiwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlYXJzIGRvd24gdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdCBmaXh0dXJlLgorICAgICAqIDxwPgorICAgICAqIENhbGxzIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyI3NodXRkb3duKCl9IG9uIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyfSByZXByZXNlbnRlZCBieSBtUHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVByb3ZpZGVyLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFlvdQogICAgICAqIG11c3QgdXNlIHRoZSBtZXRob2RzIG9mIHRoaXMgcmVzb2x2ZXIgdG8gYWNjZXNzIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1JlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCmluZGV4IDk3M2I5ZjIuLmVlZTNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZUVycm9ySGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtMTQ4LDYgKzE0OSwxNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIGludCBtb2RlLCBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IGZhY3RvcnksIERhdGFiYXNlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgaW50ZXJuYWxOYW1lID0gcmVuYW1lZEZpbGVOYW1lKG5hbWUpOworICAgICAgICBpZiAoIW1EYXRhYmFzZU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICBtRGF0YWJhc2VOYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICBtRmlsZUNvbnRleHQuZGVsZXRlRGF0YWJhc2UoaW50ZXJuYWxOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZpbGVDb250ZXh0Lm9wZW5PckNyZWF0ZURhdGFiYXNlKGludGVybmFsTmFtZSwgbW9kZSwgZmFjdG9yeSwgZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVEYXRhYmFzZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAobURhdGFiYXNlTmFtZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIG1EYXRhYmFzZU5hbWVzLnJlbW92ZShuYW1lKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDNmZDcxYzguLmI2M2ZmM2QgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTI3LDYgKzEyNywxNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLmdldFN0cmVhbVR5cGVzKHVybCwgbWltZVR5cGVGaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gTW9ja0NvbnRlbnRQcm92aWRlci50aGlzLm9wZW5UeXBlZEFzc2V0RmlsZSh1cmwsIG1pbWVUeXBlLCBvcHRzKTsKKyAgICAgICAgfQogICAgIH0KICAgICBwcml2YXRlIGZpbmFsIEludmVyc2lvbklDb250ZW50UHJvdmlkZXIgbUlDb250ZW50UHJvdmlkZXIgPSBuZXcgSW52ZXJzaW9uSUNvbnRlbnRQcm92aWRlcigpOwogCkBAIC0yMjIsNiArMjMyLDE0IEBACiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QgY2FsbCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCBjYWxsIik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBJQ29udGVudFByb3ZpZGVyIHdoaWNoIGNhbGxzIGJhY2sgc2FtZSBtZXRob2RzIGluIHRoaXMgY2xhc3MuCiAgICAgICogQnkgb3ZlcnJpZGluZyB0aGlzIGNsYXNzLCB3ZSBhdm9pZCB0aGUgbWVjaGFuaXNtIGhpZGRlbiBiZWhpbmQgQ29udGVudFByb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRleHQuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCmluZGV4IGZmZDc1N2MuLmMzMWM5Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGV4dC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQXNzZXRNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKQEAgLTE4NCw2ICsxODUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1FMaXRlRGF0YWJhc2Ugb3Blbk9yQ3JlYXRlRGF0YWJhc2UoU3RyaW5nIGZpbGUsIGludCBtb2RlLAorICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeSBmYWN0b3J5LCBEYXRhYmFzZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0RGF0YWJhc2VQYXRoKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0N1cnNvci5qYXZhCmluZGV4IDliMWMwZWYuLmJhYTE1MGEgMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ3Vyc29yLmphdmEKKysrIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tDdXJzb3IuamF2YQpAQCAtMTc4LDM2ICsxNzgsMTEgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIGNvbW1pdFVwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0VXBkYXRlcyhNYXA8PyBleHRlbmRzIExvbmcsID8gZXh0ZW5kcyBNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNVcGRhdGVzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvblVyaShDb250ZW50UmVzb2x2ZXIgY3IsIFVyaSB1cmkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1VwZGF0ZXMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlUm93KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwogICAgIH0KQEAgLTIxNyw0OCArMTkyLDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQogCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVCbG9iKGludCBjb2x1bW5JbmRleCwgYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRG91YmxlKGludCBjb2x1bW5JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlRmxvYXQoaW50IGNvbHVtbkluZGV4LCBmbG9hdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUludChpbnQgY29sdW1uSW5kZXgsIGludCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZUxvbmcoaW50IGNvbHVtbkluZGV4LCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIGJvb2xlYW4gdXBkYXRlU2hvcnQoaW50IGNvbHVtbkluZGV4LCBzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVN0cmluZyhpbnQgY29sdW1uSW5kZXgsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVRvTnVsbChpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBhYm9ydFVwZGF0ZXMoKSB7CisgICAgcHVibGljIGludCBnZXRUeXBlKGludCBjb2x1bW5JbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInVuaW1wbGVtZW50ZWQgbW9jayBtZXRob2QiKTsKICAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9tb2NrL01vY2tJQ29udGVudFByb3ZpZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAwYmU1YmVhLi4xODNiZTQxIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0lDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKQEAgLTEwMiw0ICsxMDMsMTMgQEAKICAgICBwdWJsaWMgSUJpbmRlciBhc0JpbmRlcigpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmVhbVR5cGVzKFVyaSB1cmwsIFN0cmluZyBtaW1lVHlwZUZpbHRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidW5pbXBsZW1lbnRlZCBtb2NrIG1ldGhvZCIpOworICAgIH0KKworICAgIHB1YmxpYyBBc3NldEZpbGVEZXNjcmlwdG9yIG9wZW5UeXBlZEFzc2V0RmlsZShVcmkgdXJsLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBvcHRzKQorICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1bmltcGxlbWVudGVkIG1vY2sgbWV0aG9kIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQppbmRleCBkZjZkYTcwLi5hMmI5NGZmIDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmcuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgVGVzdEdyb3VwaW5nIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRlc3RHcm91cGluZyI7CisKICAgICBTb3J0ZWRTZXQ8Q2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPj4gdGVzdENhc2VDbGFzc2VzOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4+IFNPUlRfQllfU0lNUExFX05BTUUKQEAgLTExNCw3ICsxMTYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBwYWNrYWdlTmFtZSA6IHBhY2thZ2VOYW1lcykgewogICAgICAgICAgICAgTGlzdDxDbGFzczw/IGV4dGVuZHMgVGVzdENhc2U+PiBhZGRlZENsYXNzZXMgPSB0ZXN0Q2FzZUNsYXNzZXNJblBhY2thZ2UocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgaWYgKGFkZGVkQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudygiVGVzdEdyb3VwaW5nIiwgIkludmFsaWQgUGFja2FnZTogJyIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJJbnZhbGlkIFBhY2thZ2U6ICciICsgcGFja2FnZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgY291bGQgbm90IGJlIGZvdW5kIG9yIGhhcyBubyB0ZXN0cyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGVzdENhc2VDbGFzc2VzLmFkZEFsbChhZGRlZENsYXNzZXMpOwpAQCAtMjM0LDYgKzIzNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIlRlc3RDYXNlIGNsYXNzICVzIGlzIG1pc3NpbmcgYSBwdWJsaWMgY29uc3RydWN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzICIgKworICAgICAgICAgICAgICAgICAgICAib3IgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciAtIHNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgYUNsYXNzLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvVGVzdEdyb3VwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDc3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9UZXN0R3JvdXBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUZXN0R3JvdXBpbmd9CisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0R3JvdXBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBUZXN0R3JvdXBpbmcgbUdyb3VwaW5nOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUdyb3VwaW5nID0gbmV3IFRlc3RHcm91cGluZyhUZXN0R3JvdXBpbmcuU09SVF9CWV9TSU1QTEVfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhhdCBUZXN0Q2FzZXMgd2l0aCBubyBwdWJsaWMgY29uc3RydWN0b3IgYXJlIG5vdCBsb2FkZWQuCisgICAgICogUmVsaWVzIG9uIGZpeHR1cmUgY2xhc3NlcyBpbiBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRlc3RzX25vUHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG1Hcm91cGluZy5hZGRQYWNrYWdlc1JlY3Vyc2l2ZSgiYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvciIpOworICAgICAgICBMaXN0PFRlc3RNZXRob2Q+IHRlc3RzID0gbUdyb3VwaW5nLmdldFRlc3RzKCk7CisgICAgICAgIC8vIG9ubHkgdGhlIFB1YmxpY0NvbnN0cnVjdG9yVGVzdCdzIHRlc3QgbWV0aG9kIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0ZXN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RQdWJsaWNDb25zdHJ1Y3RvciIsIHRlc3RzLmdldCgwKS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL05vUHVibGljQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTA5YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Ob1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuZXhhbXBsZXMuY29uc3RydWN0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQSB7QGxpbmsgVGVzdENhc2V9IHdoaWNoIHNob3VsZCBub3QgYmUgbG9hZGVkIHNpbmNlIGl0IGhhcyBub24tcHVibGljIGNvbnN0cnVjdG9ycyB3aXRoIG5vIGFyZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE5vUHVibGljQ29uc3RydWN0b3JUZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdChTdHJpbmcgZm9vLCBTdHJpbmcgZm9vMikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RSdW4oKSB7CisgICAgICAgIGZhaWwoIm1ldGhvZCBpbiBOb1B1YmxpY0NvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9Qcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg2MmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9zdWl0ZWJ1aWxkZXIvZXhhbXBsZXMvY29uc3RydWN0b3IvUHJvdGVjdGVkQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5leGFtcGxlcy5jb25zdHJ1Y3RvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBBIHByb3RlY3RlZCBjb25zdHJ1Y3RvciB0ZXN0IGNhc2UgdGhhdCBzaG91bGQgbm90IGJlIGxvYWRlZC4KKyAqLworcHVibGljIGNsYXNzIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBQcm90ZWN0ZWRDb25zdHJ1Y3RvclRlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdFJ1bigpIHsKKyAgICAgICAgZmFpbCgibWV0aG9kIGluIFByb3RlY3RlZENvbnN0cnVjdG9yVGVzdCBydW4gdW5leHBlY3RlZGx5Iik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3Qvc3VpdGVidWlsZGVyL2V4YW1wbGVzL2NvbnN0cnVjdG9yL1B1YmxpY0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L3N1aXRlYnVpbGRlci9leGFtcGxlcy9jb25zdHJ1Y3Rvci9QdWJsaWNDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmV4YW1wbGVzLmNvbnN0cnVjdG9yOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCisvKioKKyAqIEEgcHVibGljIGNvbnN0cnVjdG9yIHRlc3QgY2FzZSB0aGF0IHNob3VsZCBiZSBsb2FkZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBQdWJsaWNDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljQ29uc3RydWN0b3IoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCmluZGV4IGEwNThkNGEuLjAzNzM2N2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKQEAgLTY1LDcgKzY1LDcgQEAKIHB1YmxpYzoKICAgICBTdWJQbHVnaW4oTlBQIGluc3QpIDogbV9pbnN0KGluc3QpIHt9CiAgICAgdmlydHVhbCB+U3ViUGx1Z2luKCkge30KLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgPSAwOwogCiAgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5jcHAKaW5kZXggMmVmZjM5NC4uOTFmMWIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmNwcAorKysgYi90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvZXZlbnQvRXZlbnRQbHVnaW4uY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBicm93c2VyLT5tZW1mcmVlKGJlZ2luTWVtKTsKIH0KIAotaW50MTYgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgRXZlbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAKICAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6IHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9ldmVudC9FdmVudFBsdWdpbi5oIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKaW5kZXggODhiN2M5ZC4uMDQzYmU4NSAxMDA2NDQKLS0tIGEvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL2V2ZW50L0V2ZW50UGx1Z2luLmgKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYzoKICAgICBFdmVudFBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+RXZlbnRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcCBiL3Rlc3RzL0Jyb3dzZXJUZXN0UGx1Z2luL2puaS9tYWluLmNwcAppbmRleCA0MDJhN2UyLi41MTExODBjIDEwMDY0NAotLS0gYS90ZXN0cy9Ccm93c2VyVGVzdFBsdWdpbi9qbmkvbWFpbi5jcHAKKysrIGIvdGVzdHMvQnJvd3NlclRlc3RQbHVnaW4vam5pL21haW4uY3BwCkBAIC0zNCwxOSArMzQsMTkgQEAKIE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlcjsKICNkZWZpbmUgRVhQT1JUIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7CiBOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKIE5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwogTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLAotICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpOworICAgICAgICBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSk7CiBOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKLWludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKLWludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCitpbnQzMl90ICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyX3QgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBsZW4sCiAgICAgICAgIHZvaWQqIGJ1ZmZlcik7CiB2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7CiB2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7CitpbnQxNl90ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOwogdm9pZCAgICBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sCiAgICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwogTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LWJyb3dzZXJ0ZXN0cGx1Z2luOmJ0cDpBbmRyb2lkIEJyb3dzZXIgVGVzdCBQbHVnaW4iOwogfQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKIHsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1OUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSkKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpCiB7CiAgICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CkBAIC0xOTksMTIgKzE5OSwxMiBAQAogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKIH0KIAotaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoraW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCitpbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKQogewogICAgIHJldHVybiAwOwogfQpAQCAtMjE3LDcgKzIxNyw3IEBACiB7CiB9CiAKLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQoraW50MTZfdCBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKIHsKICAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKICAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAzYjdlMjYuLmMxNTEyNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTgsMTUgKzE4LDE4IEBACiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bmFtZT0iSFRNTEhvc3RBcHAiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iTWVudSIgYW5kcm9pZDpsYWJlbD0iRHVtcCBSZW5kZXIgVHJlZSIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCI+CisgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlRFU1QiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IlRlc3RTaGVsbEFjdGl2aXR5IiBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRvcCIKLSAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIvPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiLz4KKyAgICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCIvPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSZWxpYWJpbGl0eVRlc3RBY3Rpdml0eSIgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiCisgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTGlnaHQiLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0F1dG9SdW5uZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9hc3NldHMvcnVuX2xheW91dF90ZXN0cy5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CmluZGV4IGI2ZTdiZjMuLmNlYWM1ZDIgMTAwNzU1Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgIyBDb3VudCBjcmFzaGVkIHRlc3RzLgogICBjcmFzaGVkX3Rlc3RzID0gW10KIAotICB0aW1lb3V0X21zID0gJzMwMDAwJworICB0aW1lb3V0X21zID0gJzE1MDAwJwogICBpZiBvcHRpb25zLnRpbWVfb3V0X21zOgogICAgIHRpbWVvdXRfbXMgPSBvcHRpb25zLnRpbWVfb3V0X21zCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvQ2FsbGJhY2tQcm94eS5qYXZhCmluZGV4IDU3ODBjNDMuLjc0MGY1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9DYWxsYmFja1Byb3h5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0NhbGxiYWNrUHJveHkuamF2YQpAQCAtNzQsNiArNzQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfU0VUX0NBTl9PUEVOX1dJTkRPV1MgPSA0MjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04gPSA0MzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgT1ZFUlJJREVfUFJFRkVSRU5DRSA9IDQ0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCA9IDQ1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRfWFNTX0FVRElUT1JfRU5BQkxFRCA9IDQ2OwogICAgIAogICAgIENhbGxiYWNrUHJveHkoRXZlbnRTZW5kZXIgZXZlbnRTZW5kZXIsIAogICAgICAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIgbGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKQEAgLTE3NSw3ICsxNzcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfVEVYVDoKLSAgICAgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dChtc2cuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEFZT1VUX0RVTVBfQ0hJTERfRlJBTUVTX1RFWFQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcENoaWxkRnJhbWVzQXNUZXh0KCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIExBWU9VVF9EVU1QX0hJU1RPUlk6CkBAIC0yNzMsNiArMjc5LDEwIEBACiAgICAgICAgICAgICBib29sZWFuIHZhbHVlID0gbXNnLmdldERhdGEoKS5nZXRCb29sZWFuKCJ2YWx1ZSIpOwogICAgICAgICAgICAgbUxheW91dFRlc3RDb250cm9sbGVyLm92ZXJyaWRlUHJlZmVyZW5jZShrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX1hTU19BVURJVE9SX0VOQUJMRUQ6CisgICAgICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0WFNTQXVkaXRvckVuYWJsZWQobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM4NywxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7Ci0gICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoTEFZT1VUX0RVTVBfVEVYVCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9URVhULCBlbmFibGVQaXhlbFRlc3RzID8gMSA6IDApLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgb2J0YWluTWVzc2FnZShMQVlPVVRfRFVNUF9DSElMRF9GUkFNRVNfVEVYVCkuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpIHsKQEAgLTQ5MiwxMCArNTEwLDIyIEBACiAgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT04sIGFsbG93ID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpcyBpbiBXZWJLaXQsIHNvIHN0YXkgb24gV2ViQ29yZSB0aHJlYWQsIGJ1dCBnbyB2aWEgdGhlIFRlc3RTaGVsbEFjdGl2aXR5CisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UoT1ZFUlJJREVfUFJFRkVSRU5DRSk7CiAgICAgICAgIG1lc3NhZ2UuZ2V0RGF0YSgpLnB1dFN0cmluZygia2V5Iiwga2V5KTsKICAgICAgICAgbWVzc2FnZS5nZXREYXRhKCkucHV0Qm9vbGVhbigidmFsdWUiLCB2YWx1ZSk7CiAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG9idGFpbk1lc3NhZ2UoU0VUX1hTU19BVURJVE9SX0VOQUJMRUQsIGZsYWcgPyAxIDogMCwgMCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9GaWxlRmlsdGVyLmphdmEKaW5kZXggNzdmZDNlZC4uNjVkYTIxMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZpbGVGaWx0ZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRmlsZUZpbHRlci5qYXZhCkBAIC03Myw0MyArNzMsNzYgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVUZXN0TGlzdCA9IHsKICAgICAgICAgImVkaXRpbmcvc2VsZWN0aW9uL21vdmUtbGVmdC1yaWdodC5odG1sIiwgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcKKyAgICAgICAgImZhc3QvanMvZXhjZXNzaXZlLWNvbW1hLXVzYWdlLmh0bWwiLCAvLyBUZXN0cyBodWdlIGluaXRpYWxpemVyIGxpc3QsIGNhdXNlcyBPT00uCiAgICAgICAgICJmYXN0L2pzL3JlZ2V4cC1jaGFyY2xhc3MtY3Jhc2guaHRtbCIsIC8vIFJlZ0V4cCBpcyB0b28gbGFyZ2UsIGNhdXNpbmcgT09NCiAgICAgICAgICJmYXN0L3JlZ2V4L3Rlc3QxLmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4Ci0gICAgICAgICJmYXN0L3JlZ2V4L3Nsb3cuaHRtbCIgLy8gQ2F1c2VzIER1bXBSZW5kZXJUcmVlIHRvIGhhbmcgd2l0aCBWOAorICAgICAgICAiZmFzdC9yZWdleC9zbG93Lmh0bWwiLCAvLyBDYXVzZXMgRHVtcFJlbmRlclRyZWUgdG8gaGFuZyB3aXRoIFY4CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0xNC5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk1CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy0yOS5odG1sIiwgLy8gaGFuZ3MgdGhlIGxheW91dCB0ZXN0cworICAgICAgICAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yODg5NTk2CisgICAgICAgICJpZXRlc3RjZW50ZXIvSmF2YXNjcmlwdC8xNS40LjQuMTUtMy04Lmh0bWwiLCAvLyBoYW5ncyB0aGUgbGF5b3V0IHRlc3RzCisgICAgICAgIC8vIGh0dHA6Ly9iL2lzc3VlP2lkPTI4ODk1OTgKKyAgICAgICAgImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvc2ltcGxlLWNyb3NzLW9yaWdpbi1wcm9ncmVzcy1ldmVudHMuaHRtbCIsIC8vIHJ1bnMgd2ViY29yZSBpbnRvIGJhZCBzdGF0ZQorICAgICAgICAvLyBodHRwOi8vYi8yOTgyNTAwCiAgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIGZpbGxJZ25vcmVSZXN1bHRMaXN0KCkgewotICAgICAgICAvLyBUaGlzIGZpcnN0IGJsb2NrIG9mIHRlc3RzIGFyZSBmb3IgSFRNTDUgZmVhdHVyZXMsIGZvciB3aGljaCBBbmRyb2lkCisgICAgICAgIC8vIFRoaXMgZmlyc3QgYmxvY2sgb2YgdGVzdHMgYXJlIGZvciBmZWF0dXJlcyBmb3Igd2hpY2ggQW5kcm9pZAogICAgICAgICAvLyBzaG91bGQgcGFzcyBhbGwgdGVzdHMuIFRoZXkgYXJlIHNraXBwZWQgb25seSB0ZW1wb3JhcmlseS4KICAgICAgICAgLy8gVE9ETzogRml4IHRoZXNlIGZhaWxpbmcgdGVzdHMgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhpcyBsaXN0LgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvYmFzaWMtbXVsdGktdG91Y2gtZXZlbnRzLmh0bWwiKTsgLy8gUmVxdWlyZXMgbXVsdGktdG91Y2gKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZXZlbnRzL3RvdWNoL3RvdWNoLXRhcmdldC5odG1sIik7IC8vIFJlcXVpcmVzIG11bHRpLXRvdWNoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2VtcHR5LW1hbmlmZXN0Lmh0bWwiKTsgLy8gZmxha3kKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvYXBwY2FjaGUvZmFsbGJhY2suaHRtbCIpOyAvLyBodHRwOi8vYi9pc3N1ZT9pZD0yNzEzMDA0CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJodHRwL3Rlc3RzL2FwcGNhY2hlL2ZvcmVpZ24taWZyYW1lLW1haW4uaHRtbCIpOyAvLyBmbGFreSAtIHNraXBzIHN0YXRlcwogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9tYW5pZmVzdC13aXRoLWVtcHR5LWZpbGUuaHRtbCIpOyAvLyBmbGFreQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiaHR0cC90ZXN0cy9hcHBjYWNoZS9vcmlnaW4tcXVvdGEuaHRtbCIpOyAvLyBuZWVkcyBjbGVhckFsbEFwcGxpY2F0aW9uQ2FjaGVzKCksIHNlZSBodHRwOi8vYi9pc3N1ZT9pZD0yOTQ0MTk2CiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL2RhdGFiYXNlLWxvY2stYWZ0ZXItcmVsb2FkLmh0bWwiKTsgLy8gU3VjY2VlZHMgYnV0IER1bXBSZW5kZXJUcmVlIGRvZXMgbm90IHJlYWQgcmVzdWx0IGNvcnJlY3RseQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9oYXNoLWNoYW5nZS13aXRoLXhoci5odG1sIik7IC8vIFN1Y2NlZWRzIGJ1dCBEdW1wUmVuZGVyVHJlZSBkb2VzIG5vdCByZWFkIHJlc3VsdCBjb3JyZWN0bHkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvb3Blbi1kYXRhYmFzZS1jcmVhdGlvbi1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2Uvc3RhdGVtZW50LWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9zdGF0ZW1lbnQtc3VjY2Vzcy1jYWxsYmFjay1pc29sYXRlZC13b3JsZC5odG1sIik7IC8vIFJlcXVpcmVzIGxheW91dFRlc3RDb250cm9sbGVyLmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKCkKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvdHJhbnNhY3Rpb24tY2FsbGJhY2staXNvbGF0ZWQtd29ybGQuaHRtbCIpOyAvLyBSZXF1aXJlcyBsYXlvdXRUZXN0Q29udHJvbGxlci5ldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCgpCisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJzdG9yYWdlL3RyYW5zYWN0aW9uLWVycm9yLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS90cmFuc2FjdGlvbi1zdWNjZXNzLWNhbGxiYWNrLWlzb2xhdGVkLXdvcmxkLmh0bWwiKTsgLy8gUmVxdWlyZXMgbGF5b3V0VGVzdENvbnRyb2xsZXIuZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQoKQogCi0gICAgICAgIC8vIFdpbGwgYWx3YXlzIGZhaWwKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS9zdmcvbGV2ZWwzL3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIHVuc3VwcG9ydGVkIGZlYXR1cmVzLgorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvdG91Y2gvdG91Y2gtY29vcmRzLWluLXpvb20tYW5kLXNjcm9sbC5odG1sIik7IC8vIFJlcXVpcmVzIGV2ZW50U2VuZGVyLnpvb21QYWdlSW4oKSx6b29tUGFnZU91dCgpCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3hwYXRoIik7IC8vIFhQYXRoIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvZXZlbnRzb3VyY2Uvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImh0dHAvdGVzdHMveG1saHR0cHJlcXVlc3Qvd29ya2VycyIpOyAvLyB3b3JrZXJzIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9sb2NhbHN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1hZmZlY3RzLXN0b3JhZ2UuaHRtbCIpOyAvLyBwcml2YXRlIGJyb3dzaW5nIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvZG9tc3RvcmFnZS9zZXNzaW9uc3RvcmFnZS9wcml2YXRlLWJyb3dzaW5nLWFmZmVjdHMtc3RvcmFnZS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAorICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgic3RvcmFnZS9pbmRleGVkZGIiKTsgLy8gaW5kZXhlZGRiIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN0b3JhZ2UvcHJpdmF0ZS1icm93c2luZy1yZWFkb25seS5odG1sIik7IC8vIHByaXZhdGUgYnJvd3Npbmcgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgid2Vic29ja2V0L3Rlc3RzL3dvcmtlcnMiKTsgLy8gd29ya2VycyBub3Qgc3VwcG9ydGVkCiAKKyAgICAgICAgLy8gRXhwZWN0ZWQgZmFpbHVyZXMgZHVlIHRvIG1pc3NpbmcgZXhwZWN0ZWQgcmVzdWx0cworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2Nhbm9uaWNhbGZvcm0wOS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL2RvY3VtZW50Z2V0aW5wdXRlbmNvZGluZzAzLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0aW5wdXRlbmNvZGluZzAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvZW50aXR5Z2V0eG1sdmVyc2lvbjAyLnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkwNS54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMDcueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTA5LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxMC54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlZ2V0YmFzZXVyaTE1LnhodG1sIik7CisgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJkb20veGh0bWwvbGV2ZWwzL2NvcmUvbm9kZWdldGJhc2V1cmkxNy54aHRtbCIpOworICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZG9tL3hodG1sL2xldmVsMy9jb3JlL25vZGVnZXRiYXNldXJpMTgueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwbmFtZXNwYWNldXJpMDEueGh0bWwiKTsKKyAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImRvbS94aHRtbC9sZXZlbDMvY29yZS9ub2RlbG9va3VwcHJlZml4MTkueGh0bWwiKTsKKwogICAgICAgICAvLyBUT0RPOiBUaGVzZSBuZWVkIHRvIGJlIHRyaWFnZWQKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvY3NzL2Nhc2UtdHJhbnNmb3JtLmh0bWwiKTsgLy8gd2lsbCBub3QgZml4ICM2MTk3MDcKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL0VsZW1lbnQvb2Zmc2V0TGVmdC1vZmZzZXRUb3AtYm9keS1xdWlyay5odG1sIik7IC8vIGRpZmZlcmVudCBzY3JlZW4gc2l6ZSByZXN1bHQgaW4gZXh0cmEgc3BhY2VzIGluIEFwcGxlIGNvbXBhcmVkIHRvIHVzCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvUGx1Zy1pbnMuaHRtbCIpOyAvLyBuZWVkIHRlc3QgcGx1Z2luCi0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXByb3BlcnRpZXMuaHRtbCIpOyAvLyB4c2x0IGFuZCB4cGF0aCBlbGVtZW50cyBtaXNzaW5nIGZyb20gcHJvcGVydHkgbGlzdAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vV2luZG93L3dpbmRvdy1zY3JlZW4tcHJvcGVydGllcy5odG1sIik7IC8vIHBpeGVsIGRlcHRoCiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9XaW5kb3cvd2luZG93LXh5LXByb3BlcnRpZXMuaHRtbCIpOyAvLyByZXF1aXJlcyBldmVudFNlbmRlci5tb3VzZURvd24oKSxtb3VzZVVwKCkKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2F0dHJpYnV0ZS1uYW1lc3BhY2VzLWdldC1zZXQuaHRtbCIpOyAvLyBodHRwOi8vYi83MzMyMjkKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoImZhc3QvZG9tL2djLTkuaHRtbCIpOyAvLyByZXF1aXJlcyB4cGF0aCBzdXBwb3J0Ci0gICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L2RvbS9nbG9iYWwtY29uc3RydWN0b3JzLmh0bWwiKTsgLy8gcmVxdWlyZXMgeHNsdCBhbmQgeHBhdGggc3VwcG9ydAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vb2JqZWN0LWVtYmVkLXBsdWdpbi1zY3JpcHRpbmcuaHRtbCIpOyAvLyBkeW5hbWljIHBsdWdpbnMgbm90IHN1cHBvcnRlZAogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9kb20vdGFiaW5kZXgtY2xhbXAuaHRtbCIpOyAvLyB0aGVyZSBpcyBleHRyYSBzcGFjaW5nIGluIHRoZSBmaWxlIGR1ZSB0byBtdWx0aXBsZSBpbnB1dCBib3hlcyBmaXR0aW5nIG9uIG9uZSBsaW5lIG9uIEFwcGxlLCBvdXJzIGFyZSB3cmFwcGVkLiBTcGFjZSBhdCBsaW5lIGVuZHMgYXJlIHN0cmlwcGVkLgogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC9ldmVudHMvYW5jaG9yLWltYWdlLXNjcm9sbGVkLXgteS5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQpAQCAtMTcyLDggKzIwNSw2IEBACiAgICAgICAgIGlnbm9yZVJlc3VsdExpc3QuYWRkKCJmYXN0L3JlcGxhY2VkL2ltYWdlLW1hcC5odG1sIik7IC8vIHJlcXVpcmVzIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpLG1vdXNlVXAoKQogICAgICAgICBpZ25vcmVSZXN1bHRMaXN0LmFkZCgiZmFzdC90ZXh0L3BsYWluLXRleHQtbGluZS1icmVha3MuaHRtbCIpOyAvLyBleHRyYSBzcGFjaW5nIGJlY2F1c2UgaUZyYW1lcyByZW5kZXJlZCBuZXh0IHRvIGVhY2ggb3RoZXIgb24gQXBwbGUKICAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInByb2ZpbGVyIik7IC8vIHByb2ZpbGVyIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgaWdub3JlUmVzdWx0TGlzdC5hZGQoInN2ZyIpOyAvLyBzdmcgaXMgbm90IHN1cHBvcnRlZAotCiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0ZzVXRpbHMuamF2YQppbmRleCA2Y2ZjZTQxLi41ZDM0ZTI1IDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvRnNVdGlscy5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9Gc1V0aWxzLmphdmEKQEAgLTQ5LDggKzQ5LDEzIEBACiAgICAgICAgIC8vbm8gY3JlYXRpb24gb2YgaW5zdGFuY2VzCiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgaW4gdGhlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgd3JpdGVMYXlvdXRUZXN0TGlzdFJlY3Vyc2l2ZWx5KEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcywKICAgICAgICAgICAgIFN0cmluZyBkaXIsIGJvb2xlYW4gaWdub3JlUmVzdWx0c0luRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwogICAgICAgICBMb2cudihMT0dUQUcsICJTZWFyY2hpbmcgdGVzdHMgdW5kZXIgIiArIGRpcik7CiAKICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyKTsKQEAgLTY4LDcgKzczLDcgQEAKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHRlc3QgZGlyZWN0b3J5LCB3ZSBkb24ndCByZWN1cnNlIGludG8gaXQuCiAgICAgICAgICAgICAgICAgaWYgKCFGaWxlRmlsdGVyLmlzTm9uVGVzdERpcihzKSkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJSZWN1cnNpbmcgb24gIiArIHMpOwotICAgICAgICAgICAgICAgICAgICBmaW5kTGF5b3V0VGVzdHNSZWN1cnNpdmVseShib3MsIHMsIGlnbm9yZVJlc3VsdHNJbkRpcik7CisgICAgICAgICAgICAgICAgICAgIHRlc3RDb3VudCArPSB3cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoYm9zLCBzLCBpZ25vcmVSZXN1bHRzSW5EaXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTc5LDcgKzg0LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5odG1sIikgfHwgcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICBpZiAoKHMudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmh0bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKQorICAgICAgICAgICAgICAgICAgICB8fCBzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54aHRtbCIpKQogICAgICAgICAgICAgICAgICAgICAmJiAhcy5lbmRzV2l0aCgiVEVNUExBVEUuaHRtbCIpKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVjb3JkaW5nICIgKyBzKTsKICAgICAgICAgICAgICAgICBib3Mud3JpdGUocy5nZXRCeXRlcygpKTsKQEAgLTg4LDggKzk1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJvcy53cml0ZSgoIiBJR05PUkVfUkVTVUxUIikuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJvcy53cml0ZSgnXG4nKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdENvdW50OwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVUZXN0U3RhdHVzKFN0cmluZyBzdGF0dXNGaWxlLCBTdHJpbmcgcykgewpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQppbmRleCA5MjM2MzQ1Li45YmUyZjFjIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdENvbnRyb2xsZXIuamF2YQpAQCAtMTgsMjkgKzE4LDMwIEBACiAKIHB1YmxpYyBpbnRlcmZhY2UgTGF5b3V0VGVzdENvbnRyb2xsZXIgewogCi0JcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpOwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKLQlwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7Ci0JCi0JLy8gRm9yY2UgYSByZWRyYXcgb2YgdGhlIHBhZ2UKLQlwdWJsaWMgdm9pZCBkaXNwbGF5KCk7Ci0JLy8gVXNlZCB3aXRoIHBpeGVsIGR1bXBzIG9mIGNvbnRlbnQKLQlwdWJsaWMgdm9pZCB0ZXN0UmVwYWludCgpOwotCQotCS8vIElmIHRoZSBwYWdlIHRpdGxlIGNoYW5nZXMsIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dC4KLQlwdWJsaWMgdm9pZCBkdW1wVGl0bGVDaGFuZ2VzKCk7Ci0JcHVibGljIHZvaWQgZHVtcEJhY2tGb3J3YXJkTGlzdCgpOwotCXB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKCk7Ci0JcHVibGljIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoKTsKLQkKLQkvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZwotCXB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7Ci0JLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKLQlwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7Ci0JCi0JcHVibGljIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoKTsKLQkKLQkvLyBpbnZhbGlkYXRlIGFuZCBkcmF3IG9uZSBsaW5lIGF0IGEgdGltZSBvZiB0aGUgd2ViIHZpZXcuCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpOworICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpOworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKTsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCk7CisKKyAgICAvLyBGb3JjZSBhIHJlZHJhdyBvZiB0aGUgcGFnZQorICAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoKTsKKyAgICAvLyBVc2VkIHdpdGggcGl4ZWwgZHVtcHMgb2YgY29udGVudAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhaW50KCk7CisKKyAgICAvLyBJZiB0aGUgcGFnZSB0aXRsZSBjaGFuZ2VzLCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQuCisgICAgcHVibGljIHZvaWQgZHVtcFRpdGxlQ2hhbmdlcygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBCYWNrRm9yd2FyZExpc3QoKTsKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucygpOworICAgIHB1YmxpYyB2b2lkIGR1bXBFZGl0aW5nQ2FsbGJhY2tzKCk7CisKKyAgICAvLyBTaG93L0hpZGUgd2luZG93IGZvciB3aW5kb3cub25CbHVyKCkgdGVzdGluZworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd0lzS2V5KGJvb2xlYW4gYik7CisgICAgLy8gTWFjIGZ1bmN0aW9uLCB1c2VkIHRvIGRpc2FibGUgZXZlbnRzIGdvaW5nIHRvIHRoZSB3aW5kb3cKKyAgICBwdWJsaWMgdm9pZCBzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2xlYW4gYik7CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wU2VsZWN0aW9uUmVjdCgpOworCisgICAgLy8gaW52YWxpZGF0ZSBhbmQgZHJhdyBvbmUgbGluZSBhdCBhIHRpbWUgb2YgdGhlIHdlYiB2aWV3LgogICAgIHB1YmxpYyB2b2lkIHJlcGFpbnRTd2VlcEhvcml6b250YWxseSgpOwogICAgIAogICAgIC8vIEhpc3RvcnkgdGVzdGluZyBmdW5jdGlvbnMKQEAgLTY3LDQgKzY4LDExIEBACiAgICAgcHVibGljIHZvaWQgc2V0R2VvbG9jYXRpb25QZXJtaXNzaW9uKGJvb2xlYW4gYWxsb3cpOwogCiAgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpOworCisgICAgLy8gRm9yIFhTU0F1ZGl0b3IgdGVzdHMKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChib29sZWFuIGZsYWcpOworCisgICAgLy8gRm9yIERldmljZU9yaWVudGF0aW9uIHRlc3RzCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL0xheW91dFRlc3RzQXV0b1Rlc3QuamF2YQppbmRleCA5Y2NmNTQ5Li4xMzJmMTdhIDEwMDY0NAotLS0gYS90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTGF5b3V0VGVzdHNBdXRvVGVzdC5qYXZhCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9MYXlvdXRUZXN0c0F1dG9UZXN0LmphdmEKQEAgLTIwLDkgKzIwLDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZS5mb3J3YXJkZXIuQWRiVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUuZm9yd2FyZGVyLkZvcndhcmRTZXJ2aWNlOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTE1OCwxOCArMTU2LDExIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbUpzRW5naW5lOwogICAgIHByaXZhdGUgU3RyaW5nIG1UZXN0UGF0aFByZWZpeDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUZpbmlzaGVkOworICAgIHByaXZhdGUgaW50IG1UZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbVJlc3VtZUluZGV4OwogCiAgICAgcHVibGljIExheW91dFRlc3RzQXV0b1Rlc3QoKSB7Ci0gICAgICBzdXBlcigiY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUiLCBUZXN0U2hlbGxBY3Rpdml0eS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgbGF5b3V0IHRlc3QgdG8KLSAgICAvLyBBbSBzdGF0dXMgc28gdGhhdCBpdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gYSBzY3JpcHQuCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NPckZhaWxDYWxsYmFjayhTdHJpbmcgZmlsZSwgYm9vbGVhbiByZXN1bHQpIHsKLSAgICAgIEluc3RydW1lbnRhdGlvbiBpbnN0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCk7Ci0gICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgYnVuZGxlLnB1dEJvb2xlYW4oZmlsZSwgcmVzdWx0KTsKLSAgICAgIGluc3Quc2VuZFN0YXR1cygwLCBidW5kbGUpOworICAgICAgc3VwZXIoVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnZXRUZXN0TGlzdCgpIHsKQEAgLTE5MCw2ICsxODEsNyBAQAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HVEFHLCAiRXJyb3Igd2hpbGUgcmVhZGluZyB0ZXN0IGxpc3QgOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CisgICAgICAgIG1UZXN0Q291bnQgPSBtVGVzdExpc3Quc2l6ZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZXN1bWVUZXN0TGlzdCgpIHsKQEAgLTIwMCw2ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtVGVzdExpc3QuZWxlbWVudEF0KGkpLmVxdWFscyhsaW5lKSkgewogICAgICAgICAgICAgICAgICAgICBtVGVzdExpc3QgPSBuZXcgVmVjdG9yPFN0cmluZz4obVRlc3RMaXN0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3Quc2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIG1UZXN0TGlzdElnbm9yZVJlc3VsdCA9IG5ldyBWZWN0b3I8Qm9vbGVhbj4obVRlc3RMaXN0SWdub3JlUmVzdWx0LnN1Ykxpc3QoaSsxLCBtVGVzdExpc3RJZ25vcmVSZXN1bHQuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bWVJbmRleCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzIsMTQgKzIyNSwyMiBAQAogICAgICAgICAvLyBUaGUgZ2VuZXJpYyByZXN1bHQgaXMgYXQgPHBhdGg+LzxuYW1lPi1leHBlY3RlZC50eHQKICAgICAgICAgLy8gRmlyc3QgdHJ5IHRoZSBBbmRyb2lkLXNwZWNpZmljIHJlc3VsdCBhdAogICAgICAgICAvLyBwbGF0Zm9ybS9hbmRyb2lkLTxqcy1lbmdpbmU+LzxwYXRoPi88bmFtZT4tZXhwZWN0ZWQudHh0CisgICAgICAgIC8vIHRoZW4KKyAgICAgICAgLy8gcGxhdGZvcm0vYW5kcm9pZC88cGF0aD4vPG5hbWU+LWV4cGVjdGVkLnR4dAogICAgICAgICBpbnQgcG9zID0gdGVzdC5sYXN0SW5kZXhPZignLicpOwogICAgICAgICBpZiAocG9zID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIFN0cmluZyBnZW5lcmljRXhwZWN0ZWRSZXN1bHQgPSB0ZXN0LnN1YnN0cmluZygwLCBwb3MpICsgIi1leHBlY3RlZC50eHQiOwogICAgICAgICBTdHJpbmcgYW5kcm9pZEV4cGVjdGVkUmVzdWx0c0RpciA9ICJwbGF0Zm9ybS9hbmRyb2lkLSIgKyBtSnNFbmdpbmUgKyAiLyI7Ci0gICAgICAgIFN0cmluZyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgPQotICAgICAgICAgICAgZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKKyAgICAgICAgU3RyaW5nIGFuZHJvaWRFeHBlY3RlZFJlc3VsdCA9IGdlbmVyaWNFeHBlY3RlZFJlc3VsdC5yZXBsYWNlRmlyc3QoTEFZT1VUX1RFU1RTX1JPT1QsCisgICAgICAgICAgICAgICAgTEFZT1VUX1RFU1RTX1JPT1QgKyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgICAgaWYgKGYuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZEV4cGVjdGVkUmVzdWx0OworICAgICAgICBhbmRyb2lkRXhwZWN0ZWRSZXN1bHRzRGlyID0gInBsYXRmb3JtL2FuZHJvaWQvIjsKKyAgICAgICAgYW5kcm9pZEV4cGVjdGVkUmVzdWx0ID0gZ2VuZXJpY0V4cGVjdGVkUmVzdWx0LnJlcGxhY2VGaXJzdChMQVlPVVRfVEVTVFNfUk9PVCwKKyAgICAgICAgICAgICAgICBMQVlPVVRfVEVTVFNfUk9PVCArIGFuZHJvaWRFeHBlY3RlZFJlc3VsdHNEaXIpOworICAgICAgICBmID0gbmV3IEZpbGUoYW5kcm9pZEV4cGVjdGVkUmVzdWx0KTsKICAgICAgICAgcmV0dXJuIGYuZXhpc3RzKCkgPyBhbmRyb2lkRXhwZWN0ZWRSZXN1bHQgOiBnZW5lcmljRXhwZWN0ZWRSZXN1bHQ7CiAgICAgfQogCkBAIC0zMDAsNyArMzAxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCkgeworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShUZXN0U2hlbGxBY3Rpdml0eSBhY3Rpdml0eSwgU3RyaW5nIHRlc3QsIGludCB0aW1lb3V0LCBib29sZWFuIGlnbm9yZVJlc3VsdCwgaW50IHRlc3ROdW1iZXIpIHsKICAgICAgICAgYWN0aXZpdHkuc2V0Q2FsbGJhY2sobmV3IFRlc3RTaGVsbENhbGxiYWNrKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWQoKSB7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChMYXlvdXRUZXN0c0F1dG9UZXN0LnRoaXMpIHsKQEAgLTMzNiw2ICszMzcsOSBAQAogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsIEZzVXRpbHMuZ2V0VGVzdFVybCh0ZXN0KSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5SRVNVTFRfRklMRSwgcmVzdWx0RmlsZSk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5USU1FT1VUX0lOX01JTExJUywgdGltZW91dCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5UT1RBTF9URVNUX0NPVU5ULCBtVGVzdENvdW50KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LkNVUlJFTlRfVEVTVF9OVU1CRVIsIHRlc3ROdW1iZXIpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuU1RPUF9PTl9SRUZfRVJST1IsIHRydWUpOwogICAgICAgICBhY3Rpdml0eS5zdGFydEFjdGl2aXR5KGludGVudCk7CiAKICAgICAgICAgLy8gV2FpdCB1bnRpbCBkb25lLgpAQCAtMzc1LDggKzM3OSw4IEBACiAgICAgICAgIC8vIFJlYWQgc2V0dGluZ3MKICAgICAgICAgbVRlc3RQYXRoUHJlZml4ID0gKG5ldyBGaWxlKExBWU9VVF9URVNUU19ST09UICsgcnVubmVyLm1UZXN0UGF0aCkpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICBtUmViYXNlbGluZVJlc3VsdHMgPSBydW5uZXIubVJlYmFzZWxpbmU7Ci0gICAgICAgIC8vIEpTQyBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KLSAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gImpzYyIgOiBydW5uZXIubUpzRW5naW5lOworICAgICAgICAvLyBWOCBpcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGVuZ2luZS4KKyAgICAgICAgbUpzRW5naW5lID0gcnVubmVyLm1Kc0VuZ2luZSA9PSBudWxsID8gInY4IiA6IHJ1bm5lci5tSnNFbmdpbmU7CiAKICAgICAgICAgaW50IHRpbWVvdXQgPSBydW5uZXIubVRpbWVvdXRJbk1pbGxpczsKICAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkgewpAQCAtMzkzLDcgKzM5Nyw3IEBACiAgICAgICAgICAgICByZXN1bWVUZXN0TGlzdCgpOwogCiAgICAgICAgIFRlc3RTaGVsbEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkoKTsKLSAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRFVNUF9BU19URVhUKTsKKyAgICAgICAgYWN0aXZpdHkuc2V0RGVmYXVsdER1bXBEYXRhVHlwZShEdW1wRGF0YVR5cGUuRVhUX1JFUFIpOwogCiAgICAgICAgIC8vIFJ1biB0ZXN0cy4KICAgICAgICAgaW50IGFkZHIgPSAtMTsKQEAgLTQxMCw3ICs0MTQsOSBAQAogICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVSZXN1bHQgPSBtVGVzdExpc3RJZ25vcmVSZXN1bHQuZWxlbWVudEF0KGkpOwogICAgICAgICAgICAgRnNVdGlscy51cGRhdGVUZXN0U3RhdHVzKFRFU1RfU1RBVFVTX0ZJTEUsIHMpOwogICAgICAgICAgICAgLy8gUnVuIHRlc3RzCi0gICAgICAgICAgICBydW5UZXN0QW5kV2FpdFVudGlsRG9uZShhY3Rpdml0eSwgcywgcnVubmVyLm1UaW1lb3V0SW5NaWxsaXMsIGlnbm9yZVJlc3VsdCk7CisgICAgICAgICAgICAvLyBpIGlzIDAgYmFzZWQsIGJ1dCB0ZXN0IGNvdW50IGlzIDEgYmFzZWQgc28gYWRkIDEgdG8gaSBoZXJlLgorICAgICAgICAgICAgcnVuVGVzdEFuZFdhaXRVbnRpbERvbmUoYWN0aXZpdHksIHMsIHJ1bm5lci5tVGltZW91dEluTWlsbGlzLCBpZ25vcmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIGkgKyAxICsgbVJlc3VtZUluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIEZzVXRpbHMudXBkYXRlVGVzdFN0YXR1cyhURVNUX1NUQVRVU19GSUxFLCAiI0RPTkUiKTsKQEAgLTQzNSw3ICs0NDEsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmlsZSB0ZXN0c19saXN0ID0gbmV3IEZpbGUoTEFZT1VUX1RFU1RTX0xJU1RfRklMRSk7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdHNfbGlzdCwgZmFsc2UpKTsKLSAgICAgICAgICAgIEZzVXRpbHMuZmluZExheW91dFRlc3RzUmVjdXJzaXZlbHkoYm9zLCBnZXRUZXN0UGF0aCgpLCBmYWxzZSk7IC8vIERvbid0IGlnbm9yZSByZXN1bHRzCisgICAgICAgICAgICBGc1V0aWxzLndyaXRlTGF5b3V0VGVzdExpc3RSZWN1cnNpdmVseShib3MsIGdldFRlc3RQYXRoKCksIGZhbHNlKTsgLy8gRG9uJ3QgaWdub3JlIHJlc3VsdHMKICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwogICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9NZW51LmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCmluZGV4IDljNGI1NzI1Ni4uMGIwMGQ2NSAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL01lbnUuamF2YQorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZS9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUvTWVudS5qYXZhCkBAIC01MywyOSArNTMsMzggQEAKICAgICAgICAgaW50ZW50LnNldENsYXNzKHRoaXMsIFRlc3RTaGVsbEFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX1NJTkdMRV9UT1ApOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVEVTVF9VUkwsICJmaWxlOi8vIiArIGZpbGVuYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRPVEFMX1RFU1RfQ09VTlQsIDEpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuQ1VSUkVOVF9URVNUX05VTUJFUiwgMSk7CiAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHByb2Nlc3NEaXJlY3RvcnkoU3RyaW5nIHBhdGgsIGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdExpc3QocGF0aCk7CisgICAgICAgIGludCB0ZXN0Q291bnQgPSBnZW5lcmF0ZVRlc3RMaXN0KHBhdGgpOwogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX1ZJRVcpOwogICAgICAgICBpbnRlbnQuc2V0Q2xhc3ModGhpcywgVGVzdFNoZWxsQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfU0lOR0xFX1RPUCk7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5VSV9BVVRPX1RFU1QsIExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdFNoZWxsQWN0aXZpdHkuVE9UQUxfVEVTVF9DT1VOVCwgdGVzdENvdW50KTsKKyAgICAgICAgLy8gVGVzdFNoZWxsQWN0aXZpdHkgd2lsbCBwcm9jZXNzIHRoaXMgaW50ZW50IG9uY2UgYW5kIGluY3JlbWVudCB0aGUgdGVzdCBpbmRleAorICAgICAgICAvLyBiZWZvcmUgcnVubmluZyB0aGUgZmlyc3QgdGVzdCwgc28gcGFzcyAwIGhlcmUgdG8gYWxsb3cgZm9yIHRoYXQuCisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCAwKTsKICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRlc3RMaXN0KFN0cmluZyBwYXRoKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2VuZXJhdGVUZXN0TGlzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgdGVzdENvdW50ID0gMDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEZpbGUgdGVzdHNfbGlzdCA9IG5ldyBGaWxlKExBWU9VVF9URVNUU19MSVNUX0ZJTEUpOwogICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RzX2xpc3QsIGZhbHNlKSk7Ci0gICAgICAgICAgICBGc1V0aWxzLmZpbmRMYXlvdXRUZXN0c1JlY3Vyc2l2ZWx5KGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cworICAgICAgICAgICAgdGVzdENvdW50ID0gRnNVdGlscy53cml0ZUxheW91dFRlc3RMaXN0UmVjdXJzaXZlbHkoCisgICAgICAgICAgICAgICAgICAgIGJvcywgcGF0aCwgZmFsc2UpOyAvLyBEb24ndCBpZ25vcmUgcmVzdWx0cwogICAgICAgICAgICAgYm9zLmZsdXNoKCk7CiAgICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBMb2cuZShMT0dUQUcsICJFcnJvciB3aGVuIGNyZWF0aW5nIHRlc3QgbGlzdDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CisgICAgICAgcmV0dXJuIHRlc3RDb3VudDsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZS9UZXN0U2hlbGxBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKaW5kZXggNzQ3NTcxOS4uNDBhZjhjMCAxMDA2NDQKLS0tIGEvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlL1Rlc3RTaGVsbEFjdGl2aXR5LmphdmEKQEAgLTM1LDYgKzM1LDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuR2VvbG9jYXRpb25QZXJtaXNzaW9uczsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5IdHRwQXV0aEhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CkBAIC01NSw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC05OSw2ICsxMDIsOCBAQAogICAgICAgICBMb2cudihMT0dUQUcsICJtZXNzYWdlIHNlbnQgdG8gV2ViVmlldyB0byBkdW1wIHRleHQuIik7CiAgICAgICAgIHN3aXRjaCAobUR1bXBEYXRhVHlwZSkgewogICAgICAgICAgICAgY2FzZSBEVU1QX0FTX1RFWFQ6CisgICAgICAgICAgICAgICAgY2FsbGJhY2suYXJnMSA9IG1EdW1wVG9wRnJhbWVBc1RleHQgPyAxIDogMDsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOwogICAgICAgICAgICAgICAgIG1XZWJWaWV3LmRvY3VtZW50QXNUZXh0KGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVhUX1JFUFI6CkBAIC0xMTcsNiArMTIyLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTKTsKIAogICAgICAgICBMaW5lYXJMYXlvdXQgY29udGVudFZpZXcgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOwogICAgICAgICBjb250ZW50Vmlldy5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwpAQCAtMTQ1LDYgKzE1MSw5IEBACiAgICAgICAgIGlmIChpbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgZXhlY3V0ZUludGVudChpbnRlbnQpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpcyBhc3luY2hyb25vdXMsIGJ1dCBpdCBnZXRzIHByb2Nlc3NlZCBieSBXZWJDb3JlIGJlZm9yZSBpdCBzdGFydHMgbG9hZGluZyBwYWdlcy4KKyAgICAgICAgbVdlYlZpZXcudXNlTW9ja0RldmljZU9yaWVudGF0aW9uKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTksNiArMTY4LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IGludGVudC5nZXRJbnRFeHRyYShUT1RBTF9URVNUX0NPVU5ULCBtVG90YWxUZXN0Q291bnQpOworICAgICAgICBtQ3VycmVudFRlc3ROdW1iZXIgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQ1VSUkVOVF9URVNUX05VTUJFUiwgbUN1cnJlbnRUZXN0TnVtYmVyKTsKKwogICAgICAgICBtVGVzdFVybCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShURVNUX1VSTCk7CiAgICAgICAgIGlmIChtVGVzdFVybCA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVWlBdXRvVGVzdFBhdGggPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoVUlfQVVUT19URVNUKTsKQEAgLTE3Miw2ICsxODQsMTEgQEAKICAgICAgICAgbVRpbWVvdXRJbk1pbGxpcyA9IGludGVudC5nZXRJbnRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMCk7CiAgICAgICAgIG1HZXREcmF3dGltZSA9IGludGVudC5nZXRCb29sZWFuRXh0cmEoR0VUX0RSQVdfVElNRSwgZmFsc2UpOwogICAgICAgICBtU2F2ZUltYWdlUGF0aCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShTQVZFX0lNQUdFKTsKKyAgICAgICAgbVN0b3BPblJlZkVycm9yID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShTVE9QX09OX1JFRl9FUlJPUiwgZmFsc2UpOworICAgICAgICBzZXRUaXRsZSgiVGVzdCAiICsgbUN1cnJlbnRUZXN0TnVtYmVyICsgIiBvZiAiICsgbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAoZmxvYXQpbUN1cnJlbnRUZXN0TnVtYmVyIC8gbVRvdGFsVGVzdENvdW50OworICAgICAgICBpbnQgcHJvZ3Jlc3MgPSAoaW50KShyYXRpbyAqIFdpbmRvdy5QUk9HUkVTU19FTkQpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRGZWF0dXJlSW50KFdpbmRvdy5GRUFUVVJFX1BST0dSRVNTLCBwcm9ncmVzcyk7CiAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAiICBMb2FkaW5nICIgKyBtVGVzdFVybCk7CiAgICAgICAgIG1XZWJWaWV3LmxvYWRVcmwobVRlc3RVcmwpOwpAQCAtMjM3LDYgKzI1NCw3IEBACiAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7CiAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9TSU5HTEVfVE9QKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRlc3RTaGVsbEFjdGl2aXR5LlRFU1RfVVJMLCBGc1V0aWxzLmdldFRlc3RVcmwodXJsKSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0U2hlbGxBY3Rpdml0eS5DVVJSRU5UX1RFU1RfTlVNQkVSLCArK21DdXJyZW50VGVzdE51bWJlcik7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShUSU1FT1VUX0lOX01JTExJUywgMTAwMDApOwogICAgICAgICBleGVjdXRlSW50ZW50KGludGVudCk7CiAgICAgfQpAQCAtMzI5LDE0ICszNDcsMjkgQEAKIAogICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogICAgIC8vIExheW91dFRlc3RDb250cm9sbGVyIEZ1bmN0aW9ucwotICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoKSB7CisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdHMpIHsKKyAgICAgICAgLy8gQWRkZWQgYWZ0ZXIgd2Via2l0IHVwZGF0ZSB0byByNjM4NTkuIFNlZSB0cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzYzNzMwLgorICAgICAgICBpZiAoZW5hYmxlUGl4ZWxUZXN0cykgeworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dChlbmFibGVQaXhlbFRlc3RzID09IHRydWUpIG5vdCBpbXBsZW1lbnRlZCBvbiBBbmRyb2lkISIpOworICAgICAgICB9CisKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wVG9wRnJhbWVBc1RleHQgPSB0cnVlOwogICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOwogICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcEFzVGV4dCBjYWxsZWQ6ICIrdXJsKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsKKyAgICAgICAgbUR1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5EVU1QX0FTX1RFWFQ7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSB0cnVlOworICAgICAgICBpZiAobVdlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHVybCA9IG1XZWJWaWV3LmdldFVybCgpOworICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiZHVtcENoaWxkRnJhbWVzQXNUZXh0IGNhbGxlZDogIit1cmwpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgd2FpdFVudGlsRG9uZSgpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSB0cnVlOwogICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7CkBAIC0zNDgsNyArMzgxLDkgQEAKICAgICAgICAgTG9nLnYoTE9HVEFHLCAibm90aWZ5RG9uZSBjYWxsZWQ6ICIgKyB1cmwpOwogICAgICAgICBpZiAobVdhaXRVbnRpbERvbmUpIHsKICAgICAgICAgICAgIG1XYWl0VW50aWxEb25lID0gZmFsc2U7Ci0gICAgICAgICAgICBtQ2hyb21lQ2xpZW50Lm9uUHJvZ3Jlc3NDaGFuZ2VkKG1XZWJWaWV3LCAxMDEpOworICAgICAgICAgICAgaWYgKCFtUmVxdWVzdGVkV2ViS2l0RGF0YSAmJiAhbVRpbWVkT3V0ICYmICFmaW5pc2hlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdFdlYktpdERhdGEoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDU5LDggKzQ5NCwyNSBAQAogICAgICAqIFNldHMgdGhlIEdlb2xvY2F0aW9uIHBlcm1pc3Npb24gc3RhdGUgdG8gYmUgdXNlZCBmb3IgYWxsIGZ1dHVyZSByZXF1ZXN0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgewotICAgICAgICBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gdHJ1ZTsKICAgICAgICAgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiA9IGFsbG93OworCisgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2spIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW4gPSAoU3RyaW5nKSBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcy5nZXQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tEZXZpY2VPcmllbnRhdGlvbihib29sZWFuIGNhblByb3ZpZGVBbHBoYSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgYm9vbGVhbiBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEsIGJvb2xlYW4gY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpIHsKKyAgICAgICAgbVdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlUHJlZmVyZW5jZShTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7CkBAIC00NzMsNiArNTI1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZCAoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIG1XZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0WFNTQXVkaXRvckVuYWJsZWQoZmxhZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJWaWV3Q2xpZW50IG1WaWV3Q2xpZW50ID0gbmV3IFdlYlZpZXdDbGllbnQoKXsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUGFnZUZpbmlzaGVkKFdlYlZpZXcgdmlldywgU3RyaW5nIHVybCkgewpAQCAtNDkwLDExICs1NDYsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgZHJhd1BhZ2VUb0ZpbGUobVNhdmVJbWFnZVBhdGggKyAiLyIgKyBuYW1lICsgIi5wbmciLCBtV2ViVmlldyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBDYWxsaW5nIGZpbmlzaGVkKCkgd2lsbCBjaGVjayBpZiB3ZSd2ZSBtZXQgYWxsIHRoZSBjb25kaXRpb25zIGZvciBjb21wbGV0aW5nCi0gICAgICAgICAgICAvLyB0aGlzIHRlc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25lIGlmIHdlIGFyZSByZWFkeS4KKyAgICAgICAgICAgIC8vIHRoaXMgdGVzdCBhbmQgbW92ZSB0byB0aGUgbmV4dCBvbmUgaWYgd2UgYXJlIHJlYWR5LiBPdGhlcndpc2Ugd2UgYXNrIFdlYkNvcmUgdG8KKyAgICAgICAgICAgIC8vIGR1bXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtV2FpdFVudGlsRG9uZSAmJiAhbVJlcXVlc3RlZFdlYktpdERhdGEgJiYgIW1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RXZWJLaXREYXRhKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtV2FpdFVudGlsRG9uZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IHdhaXRpbmcgZm9yIG5vdGlmeURvbmUgdG8gYmUgY2FsbGVkOiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RlZFdlYktpdERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAicGFnZSBmaW5pc2hlZCBsb2FkaW5nIGJ1dCB3ZWJraXQgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZDogIiArIHVybCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJwYWdlIGZpbmlzaGVkIGxvYWRpbmcgYnV0IGFscmVhZHkgdGltZWQgb3V0OiAiICsgdXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN1cGVyLm9uUGFnZUZpbmlzaGVkKHZpZXcsIHVybCk7CiAgICAgICAgIH0KIApAQCAtNTM2LDQ0ICs2MTEsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJDaHJvbWVDbGllbnQgbUNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChXZWJWaWV3IHZpZXcsIGludCBuZXdQcm9ncmVzcykgewotCi0gICAgICAgICAgICAvLyBub3RpZnlEb25lIGNhbGxzIHRoaXMgd2l0aCAxMDElLiBXZSBvbmx5IHdhbnQgdG8gdXBkYXRlIHRoaXMgZmxhZyBpZiB0aGlzCi0gICAgICAgICAgICAvLyBpcyB0aGUgcmVhbCBjYWxsIGZyb20gV2ViQ29yZS4KLSAgICAgICAgICAgIGlmIChuZXdQcm9ncmVzcyA9PSAxMDApIHsKLSAgICAgICAgICAgICAgICBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdpdGggdGhlIGZsYWcgdXBkYXRlZCwgd2UgY2FuIG5vdyBwcm9jZWVkIGFzIG5vcm1hbCB3aGV0aGVyIHRoZSBwcm9ncmVzcyB1cGRhdGUgY2FtZSBmcm9tCi0gICAgICAgICAgICAvLyBXZWJDb3JlIG9yIG5vdGlmeURvbmUuCi0gICAgICAgICAgICBpZiAobmV3UHJvZ3Jlc3MgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluaXNoZWQoKSB3aWxsIGNoZWNrIGlmIHdlIGFyZSByZWFkeSB0byBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgYW5kIGRvIHNvIGlmIHdlIGFyZS4KLSAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFtVGltZWRPdXQgJiYgIW1XYWl0VW50aWxEb25lICYmICFtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gbVdlYlZpZXcuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KExPR1RBRywgIkZpbmlzaGVkOiAiKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2ViS2l0RGF0YSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBtV2ViVmlldy5nZXRVcmwoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiVGltZWQgb3V0IGJlZm9yZSBmaW5pc2hpbmc6ICIgKyB1cmwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1XYWl0VW50aWxEb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJXYWl0aW5nIGZvciBub3RpZnlEb25lOiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVxdWVzdGVkV2ViS2l0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiUmVxdWVzdGVkIHdlYmtpdCBkYXRhIHJlYWR5OiAiICsgdXJsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkVGl0bGUoV2ViVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGgoKSA+IDMwKQotICAgICAgICAgICAgICAgIHRpdGxlID0gIi4uLiIrdGl0bGUuc3Vic3RyaW5nKHRpdGxlLmxlbmd0aCgpLTMwKTsKLSAgICAgICAgICAgIHNldFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgIHNldFRpdGxlKCJUZXN0ICIgKyBtQ3VycmVudFRlc3ROdW1iZXIgKyAiIG9mICIgKyBtVG90YWxUZXN0Q291bnQgKyAiOiAiKyB0aXRsZSk7CiAgICAgICAgICAgICBpZiAobUR1bXBUaXRsZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICBtVGl0bGVDaGFuZ2VzLmFwcGVuZCgiVElUTEUgQ0hBTkdFRDogIik7CiAgICAgICAgICAgICAgICAgbVRpdGxlQ2hhbmdlcy5hcHBlbmQodGl0bGUpOwpAQCAtNjcwLDIxICs3MDksNDAgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKICAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAobUdlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgeworICAgICAgICAgICAgaWYgKG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCkgewogICAgICAgICAgICAgICAgIGNhbGxiYWNrLmludm9rZShvcmlnaW4sIG1HZW9sb2NhdGlvblBlcm1pc3Npb24sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzLnB1dChjYWxsYmFjaywgb3JpZ2luKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbnNvbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlSUQpIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db25zb2xlTWVzc2FnZShDb25zb2xlTWVzc2FnZSBjb25zb2xlTWVzc2FnZSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDT05TT0xFIE1FU1NBR0U6IGxpbmUgIiArIGNvbnNvbGVNZXNzYWdlLmxpbmVOdW1iZXIoKSArICI6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iOwogICAgICAgICAgICAgaWYgKG1Db25zb2xlTWVzc2FnZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29uc29sZU1lc3NhZ2UgPSAiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIKLSAgICAgICAgICAgICAgICAgICAgKyBsaW5lTnVtYmVyICsiOiAiKyBtZXNzYWdlICsiXG4iOwotICAgICAgICAgICAgbUNvbnNvbGVNZXNzYWdlcy5hcHBlbmQoY29uc29sZU1lc3NhZ2UpOwotICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTE9HOiAiK2NvbnNvbGVNZXNzYWdlKTsKKyAgICAgICAgICAgIG1Db25zb2xlTWVzc2FnZXMuYXBwZW5kKG1zZyk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJMT0c6ICIgKyBtc2cpOworICAgICAgICAgICAgLy8gdGhlIHJhdGlvbmFsZSBoZXJlIGlzIHRoYXQgaWYgdGhlcmUncyBhbiBlcnJvciBvZiBlaXRoZXIgdHlwZSwgYW5kIHRoZSB0ZXN0IHdhcworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIm5vdGlmeURvbmUiIHNpZ25hbCB0byBmaW5pc2gsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nCisgICAgICAgICAgICAvLyBhbnltb3JlIGJlY2F1c2UgdGhlIEpTIGV4ZWN1dGlvbiBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYXQgdGhpcyBwb2ludCBhbmQgYQorICAgICAgICAgICAgLy8gIm5vdGlmeURvbmUiIHdpbGwgbmV2ZXIgY29tZSBvdXQgc28gaXQncyBqdXN0IHdhc3RpbmcgdGltZSB0aWxsIHRpbWVvdXQga2lja3MgaW4KKyAgICAgICAgICAgIGlmICgobXNnLmNvbnRhaW5zKCJVbmNhdWdodCBSZWZlcmVuY2VFcnJvcjoiKSB8fCBtc2cuY29udGFpbnMoIlVuY2F1Z2h0IFR5cGVFcnJvcjoiKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhaXRVbnRpbERvbmUgJiYgbVN0b3BPblJlZkVycm9yKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HVEFHLCAiVGVybWluYXRpbmcgdGVzdCBjYXNlIG9uIHVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yIG9yIFR5cGVFcnJvci4iKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeURvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzIzLDEzICs3ODEsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5ld1dpbmRvd1dlYlZpZXcgZXh0ZW5kcyBXZWJWaWV3IHsKICAgICAgICAgcHVibGljIE5ld1dpbmRvd1dlYlZpZXcoQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzSWZhY2VzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcyk7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBudWxsLCAwLCBqc0lmYWNlcywgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlc2V0VGVzdFN0YXR1cygpIHsKICAgICAgICAgbVdhaXRVbnRpbERvbmUgPSBmYWxzZTsKICAgICAgICAgbUR1bXBEYXRhVHlwZSA9IG1EZWZhdWx0RHVtcERhdGFUeXBlOworICAgICAgICBtRHVtcFRvcEZyYW1lQXNUZXh0ID0gZmFsc2U7CisgICAgICAgIG1EdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIG1EdW1wVGl0bGVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgIG1SZXF1ZXN0ZWRXZWJLaXREYXRhID0gZmFsc2U7CkBAIC03MzksMTAgKzc5OSwxMiBAQAogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaFBvaW50cygpOwogICAgICAgICBtRXZlbnRTZW5kZXIuY2xlYXJUb3VjaE1ldGFTdGF0ZSgpOwogICAgICAgICBtUGFnZUZpbmlzaGVkID0gZmFsc2U7Ci0gICAgICAgIG1PbmVIdW5kcmVkUGVyY2VudENvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwogICAgICAgICBtR2V0RHJhd3RpbWUgPSBmYWxzZTsKICAgICAgICAgbVNhdmVJbWFnZVBhdGggPSBudWxsOworICAgICAgICBzZXREZWZhdWx0V2ViU2V0dGluZ3MobVdlYlZpZXcpOworICAgICAgICBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPSBudWxsOwogICAgIH0KIAogICAgIHByaXZhdGUgbG9uZ1tdIGdldERyYXdXZWJWaWV3VGltZShXZWJWaWV3IHZpZXcsIGludCBjb3VudCkgewpAQCAtNzc5LDcgKzg0MSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhbk1vdmVUb05leHRUZXN0KCkgewotICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OworICAgICAgICByZXR1cm4gKG1EdW1wV2ViS2l0RGF0YSAmJiBtUGFnZUZpbmlzaGVkICYmICFtV2FpdFVudGlsRG9uZSkgfHwgbVRpbWVkT3V0OwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXR1cFdlYlZpZXdGb3JMYXlvdXRUZXN0cyhXZWJWaWV3IHdlYnZpZXcsIENhbGxiYWNrUHJveHkgY2FsbGJhY2tQcm94eSkgewpAQCAtNzg3LDYgKzg0OSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgc2V0RGVmYXVsdFdlYlNldHRpbmdzKHdlYnZpZXcpOworCisgICAgICAgIHdlYnZpZXcuc2V0V2ViQ2hyb21lQ2xpZW50KG1DaHJvbWVDbGllbnQpOworICAgICAgICB3ZWJ2aWV3LnNldFdlYlZpZXdDbGllbnQobVZpZXdDbGllbnQpOworICAgICAgICAvLyBTZXR0aW5nIGEgdG91Y2ggaW50ZXJ2YWwgb2YgLTEgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhlIG9wdGltaXNhdGlvbiBpbiBXZWJWaWV3CisgICAgICAgIC8vIHRoYXQgc3RvcHMgcmVwZWF0ZWQgdG91Y2ggZXZlbnRzIGZsb29kaW5nIFdlYkNvcmUuIFRoZSBFdmVudCBTZW5kZXIgb25seSBzZW5kcyBhCisgICAgICAgIC8vIHNpbmdsZSBldmVudCByYXRoZXIgdGhhbiBhIHN0cmVhbSBvZiBldmVudHMgKGxpa2Ugd2hhdCB3b3VsZCBnZW5lcmFsbHkgaGFwcGVuIGluCisgICAgICAgIC8vIGEgcmVhbCB1c2Ugb2YgdG91Y2ggZXZlbnRzIGluIGEgV2ViVmlldykgIGFuZCBzbyBpZiB0aGUgV2ViVmlldyBkcm9wcyB0aGUgZXZlbnQsCisgICAgICAgIC8vIHRoZSB0ZXN0IHdpbGwgZmFpbCBhcyB0aGUgdGVzdCBleHBlY3RzIG9uZSBjYWxsYmFjayBmb3IgZXZlcnkgdG91Y2ggaXQgc3ludGhlc2l6ZXMuCisgICAgICAgIHdlYnZpZXcuc2V0VG91Y2hJbnRlcnZhbCgtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFdlYlNldHRpbmdzKFdlYlZpZXcgd2VidmlldykgewogICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IHdlYnZpZXcuZ2V0U2V0dGluZ3MoKTsKICAgICAgICAgc2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOwogICAgICAgICBzZXR0aW5ncy5zZXRBcHBDYWNoZVBhdGgoZ2V0QXBwbGljYXRpb25Db250ZXh0KCkuZ2V0Q2FjaGVEaXIoKS5nZXRQYXRoKCkpOwpAQCAtNzk5LDE1ICs4NzQsNyBAQAogICAgICAgICBzZXR0aW5ncy5zZXREYXRhYmFzZVBhdGgoZ2V0RGlyKCJkYXRhYmFzZXMiLDApLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgc2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CiAgICAgICAgIHNldHRpbmdzLnNldFdvcmtlcnNFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB3ZWJ2aWV3LnNldFdlYkNocm9tZUNsaWVudChtQ2hyb21lQ2xpZW50KTsKLSAgICAgICAgd2Vidmlldy5zZXRXZWJWaWV3Q2xpZW50KG1WaWV3Q2xpZW50KTsKLSAgICAgICAgLy8gU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldwotICAgICAgICAvLyB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQotICAgICAgICAvLyBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgotICAgICAgICAvLyBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAotICAgICAgICAvLyB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgotICAgICAgICB3ZWJ2aWV3LnNldFRvdWNoSW50ZXJ2YWwoLTEpOworICAgICAgICBzZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBXZWJWaWV3IG1XZWJWaWV3OwpAQCAtODI0LDYgKzg5MSw5IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbVNhdmVJbWFnZVBhdGg7CiAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBtVGVzdExpc3RSZWFkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZXREcmF3dGltZTsKKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0TnVtYmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcE9uUmVmRXJyb3I7CiAKICAgICAvLyBTdGF0ZXMKICAgICBwcml2YXRlIGJvb2xlYW4gbVRpbWVkT3V0OwpAQCAtODMzLDYgKzkwMyw4IEBACiAgICAgLy8gTGF5b3V0IHRlc3QgY29udHJvbGxlciB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSBEdW1wRGF0YVR5cGUgbUR1bXBEYXRhVHlwZTsKICAgICBwcml2YXRlIER1bXBEYXRhVHlwZSBtRGVmYXVsdER1bXBEYXRhVHlwZSA9IER1bXBEYXRhVHlwZS5FWFRfUkVQUjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBUb3BGcmFtZUFzVGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRVbnRpbERvbmU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wVGl0bGVDaGFuZ2VzOwogICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1UaXRsZUNoYW5nZXM7CkBAIC04NDYsNyArOTE4LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtUGFnZUZpbmlzaGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1EdW1wV2ViS2l0RGF0YSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT25lSHVuZHJlZFBlcmNlbnRDb21wbGV0ZSA9IGZhbHNlOwogCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FT1VUX1NUUiA9ICIqKlRlc3QgdGltZW91dCI7CiAKQEAgLTg2MSwxMSArOTMyLDE1IEBACiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9BVVRPX1RFU1QgPSAiVWlBdXRvVGVzdCI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRFJBV19USU1FID0gIkdldERyYXdUaW1lIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfSU1BR0UgPSAiU2F2ZUltYWdlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVEFMX1RFU1RfQ09VTlQgPSAiVGVzdENvdW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVEVTVF9OVU1CRVIgPSAiVGVzdE51bWJlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX09OX1JFRl9FUlJPUiA9ICJTdG9wT25SZWZlcmVuY2VFcnJvciI7CiAKICAgICBzdGF0aWMgZmluYWwgaW50IERSQVdfUlVOUyA9IDU7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBEUkFXX1RJTUVfTE9HID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKwogICAgICAgICAiL2FuZHJvaWQvcGFnZV9kcmF3X3RpbWUudHh0IjsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNHZW9sb2NhdGlvblBlcm1pc3Npb25TZXQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1HZW9sb2NhdGlvblBlcm1pc3Npb247CisgICAgcHJpdmF0ZSBNYXAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tayBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmM2MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKKworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGRpZmZfbWF0Y2hfcGF0Y2gKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IER1bXBSZW5kZXJUcmVlMgorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGMxOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIiPgorICAgIDxhcHBsaWNhdGlvbj4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnVpLkRpckxpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkR1bXAgUmVuZGVyIFRyZWUgMiIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDwhLS0gYW5kcm9pZDpsYXVuY2hNb2RlPSJzaW5nbGVUYXNrIiBpcyB0aGVyZSBzbyB3ZSBvbmx5IGhhdmUgYSBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICBvZiB0aGlzIGFjdGl2aXR5LiBIb3dldmVyLCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yayBleGFjdGx5IGxpa2UgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGJlY2F1c2UgdGhlIGJlaGF2aW91ciBvZiB0aGUgYXBwbGljYXRpb24gc3VnZ2VzdAorICAgICAgICAgICAgIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFzayBmb3IgYWxsIDMgYWN0aXZpdGllcy4gV2UgZG9uJ3QgdW5kZXJzdGFuZAorICAgICAgICAgICAgIGhvdyBleGFjdGx5IGl0IGFsbCB3b3JrcywgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MganVzdCBmaW5lLgorICAgICAgICAgICAgIEl0IGNhbiBsZWFkIHRvIHNvbWUgd2VpcmQgYmVoYXZpb3VyIGluIHRoZSBmdXR1cmUuIC0tPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuVGVzdHNMaXN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJUZXN0cycgbGlzdCBhY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb24iPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5MYXlvdXRUZXN0c0V4ZWN1dG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF5b3V0IHRlc3RzJyBleGVjdXRvciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iOmV4ZWN1dG9yIj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8c2VydmljZSBhbmRyb2lkOm5hbWU9Ik1hbmFnZXJTZXJ2aWNlIj4KKyAgICAgICAgPC9zZXJ2aWNlPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU2NyaXB0VGVzdFJ1bm5lciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iTGF5b3V0IHRlc3RzIHNjcmlwdCBydW5uZXIiIC8+CisKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0RDQVJEIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldBS0VfTE9DSyIgLz4KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fYXBhY2hlMi5weSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQxZTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9hc3NldHMvcnVuX2FwYWNoZTIucHkKQEAgLTAsMCArMSwxMjQgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiU3RhcnQsIHN0b3AsIG9yIHJlc3RhcnQgYXBhY2hlMiBzZXJ2ZXIuCisKKyAgQXBhY2hlMiBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIG1vZF9waHAhCisKKyAgVXNhZ2U6CisgICAgcnVuX2FwYWNoZTIucHkgc3RhcnR8c3RvcHxyZXN0YXJ0CisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKKworZGVmIG1haW4oKToKKyAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgcnVuX2NtZCA9ICIiCisgIGVsc2U6CisgICAgcnVuX2NtZCA9IHN5cy5hcmd2WzFdCisKKyAgIyBTZXR1cCBsb2dnaW5nIGNsYXNzCisgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKworICBpZiBub3QgcnVuX2NtZCBpbiAoInN0YXJ0IiwgInN0b3AiLCAicmVzdGFydCIpOgorICAgIGxvZ2dpbmcuaW5mbygiaWxsZWdhbCBhcmd1bWVudDogIiArIHJ1bl9jbWQpCisgICAgbG9nZ2luZy5pbmZvKCJVc2FnZTogcHl0aG9uIHJ1bl9hcGFjaGUyLnB5IHN0YXJ0fHN0b3B8cmVzdGFydCIpCisgICAgcmV0dXJuCisKKyAgIyBDcmVhdGUgL3RtcC9XZWJLaXQgaWYgaXQgZG9lc24ndCBleGlzdC4gVGhpcyBpcyBuZWVkZWQgZm9yIHZhcmlvdXMgZmlsZXMgdXNlZCBieSBhcGFjaGUyCisgIHRtcF9XZWJLaXQgPSBvcy5wYXRoLmpvaW4oIi90bXAiLCAiV2ViS2l0IikKKyAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRtcF9XZWJLaXQpOgorICAgIG9zLm1rZGlyKHRtcF9XZWJLaXQpCisKKyAgIyBHZXQgdGhlIHBhdGggdG8gYW5kcm9pZCB0cmVlIHJvb3QgYmFzZWQgb24gdGhlIHNjcmlwdCBsb2NhdGlvbi4KKyAgIyBCYXNpY2FsbHkgd2UgZ28gNSBsZXZlbHMgdXAKKyAgcGFyZW50ID0gb3MucGFyZGlyCisgIHNjcmlwdF9sb2NhdGlvbiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGguam9pbihzY3JpcHRfbG9jYXRpb24sIHBhcmVudCwgcGFyZW50LCBwYXJlbnQsIHBhcmVudCwgcGFyZW50KQorICBhbmRyb2lkX3RyZWVfcm9vdCA9IG9zLnBhdGgubm9ybXBhdGgoYW5kcm9pZF90cmVlX3Jvb3QpCisKKyAgIyBQYXRocyByZWxhdGl2ZSB0byBhbmRyb2lkX3RyZWVfcm9vdAorICB3ZWJraXRfcGF0aCA9IG9zLnBhdGguam9pbigiZXh0ZXJuYWwiLCAid2Via2l0IikKKyAgbGF5b3V0X3Rlc3RzX3BhdGggPSBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJMYXlvdXRUZXN0cyIpCisgIGh0dHBfY29uZl9wYXRoID0gb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJjb25mIikKKworICAjIFByZXBhcmUgdGhlIGNvbW1hbmQgdG8gc2V0ICR7QVBBQ0hFX1JVTl9VU0VSfSBhbmQgJHtBUEFDSEVfUlVOX0dST1VQfQorICBlbnZ2YXJzX3BhdGggPSBvcy5wYXRoLmpvaW4oIi9ldGMiLCAiYXBhY2hlMiIsICJlbnZ2YXJzIikKKyAgZXhwb3J0X2VudnZhcnNfY21kID0gInNvdXJjZSAiICsgZW52dmFyc19wYXRoCisKKyAgZXJyb3JfbG9nX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wX1dlYktpdCwgImFwYWNoZTItZXJyb3IubG9nIikKKyAgY3VzdG9tX2xvZ19wYXRoID0gb3MucGF0aC5qb2luKHRtcF9XZWJLaXQsICJhcGFjaGUyLWFjY2Vzcy5sb2ciKQorCisgICMgUHJlcGFyZSB0aGUgY29tbWFuZCB0byAocmUpc3RhcnQvc3RvcCB0aGUgc2VydmVyIHdpdGggc3BlY2lmaWVkIHNldHRpbmdzCisgIGFwYWNoZTJfcmVzdGFydF9jbWQgPSAiYXBhY2hlMiAtayAiICsgcnVuX2NtZAorICBkaXJlY3RpdmVzICA9ICIgLWMgXCJTZXJ2ZXJSb290ICIgKyBhbmRyb2lkX3RyZWVfcm9vdCArICJcIiIKKworICAjIFdlIHVzZSBodHRwL3Rlc3RzIGFzIHRoZSBkb2N1bWVudCByb290IGFzIHRoZSBIVFRQIHRlc3RzIHVzZSBoYXJkY29kZWQKKyAgIyByZXNvdXJjZXMgYXQgdGhlIHNlcnZlciByb290LiBXZSB0aGVuIHVzZSBhbGlhc2VzIHRvIG1ha2UgYXZhaWxhYmxlIHRoZQorICAjIGNvbXBsZXRlIHNldCBvZiB0ZXN0cyBhbmQgdGhlIHJlcXVpcmVkIHNjcmlwdHMuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkRvY3VtZW50Um9vdCAiICsgb3MucGF0aC5qb2luKGxheW91dF90ZXN0c19wYXRoLCAiaHR0cCIsICJ0ZXN0cy8iKSArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL0xheW91dFRlc3RzICIgKyBsYXlvdXRfdGVzdHNfcGF0aCArICJcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiQWxpYXMgL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2FuZHJvaWQgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4od2Via2l0X3BhdGgsICJXZWJLaXRUb29scyIsICJEdW1wUmVuZGVyVHJlZSIsICJhbmRyb2lkIikgKyAiXCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkFsaWFzIC9UaGlyZFBhcnR5UHJvamVjdC5wcm9wICIgKyBcCisgICAgb3MucGF0aC5qb2luKHdlYmtpdF9wYXRoLCAiVGhpcmRQYXJ0eVByb2plY3QucHJvcCIpICsgIlwiIgorCisgICMgVGhpcyBkaXJlY3RpdmUgaXMgY29tbWVudGVkIG91dCBpbiBhcGFjaGUyLWRlYmlhbi1odHRwZC5jb25mIGZvciBzb21lIHJlYXNvbgorICAjIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCB0byBicm93c2UgdGhyb3VnaCB0ZXN0cyBpbiB0aGUgYnJvd3Nlciwgc28gaXQncyBhZGRlZCBoZXJlLgorICAjIE9uZSB0aGluZyB0byBub3RlIGlzIHRoYXQgYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1vZF9kaXIgYW5kIHBvcnQgbnVtYmVycywgbW9kX2RpcgorICAjIGlzIHR1cm5lZCBvZmYuIFRoYXQgbWVhbnMgdGhhdCB0aGVyZSBfbXVzdF8gYmUgYSB0cmFpbGluZyBzbGFzaCBhdCB0aGUgZW5kIG9mIFVSTAorICAjIGZvciBhdXRvIGluZGV4ZXMgdG8gd29yayBjb3JyZWN0bHkuCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkxvYWRNb2R1bGUgYXV0b2luZGV4X21vZHVsZSAvdXNyL2xpYi9hcGFjaGUyL21vZHVsZXMvbW9kX2F1dG9pbmRleC5zb1wiIgorCisgIGRpcmVjdGl2ZXMgKz0gIiAtYyBcIkVycm9yTG9nICIgKyBlcnJvcl9sb2dfcGF0aCArIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJDdXN0b21Mb2cgIiArIGN1c3RvbV9sb2dfcGF0aCArICIgY29tYmluZWRcIiIKKyAgZGlyZWN0aXZlcyArPSAiIC1jIFwiU1NMQ2VydGlmaWNhdGVGaWxlICIgKyBvcy5wYXRoLmpvaW4oaHR0cF9jb25mX3BhdGgsICJ3ZWJraXQtaHR0cGQucGVtIikgKyBcCisgICAgIlwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJVc2VyICR7QVBBQ0hFX1JVTl9VU0VSfVwiIgorICBkaXJlY3RpdmVzICs9ICIgLWMgXCJHcm91cCAke0FQQUNIRV9SVU5fR1JPVVB9XCIiCisgIGRpcmVjdGl2ZXMgKz0gIiAtQyBcIlR5cGVzQ29uZmlnICIgKyBcCisgICAgb3MucGF0aC5qb2luKGFuZHJvaWRfdHJlZV9yb290LCBodHRwX2NvbmZfcGF0aCwgIm1pbWUudHlwZXMiKSArICJcIiIKKyAgY29uZl9maWxlX2NtZCA9ICIgLWYgIiArIFwKKyAgICBvcy5wYXRoLmpvaW4oYW5kcm9pZF90cmVlX3Jvb3QsIGh0dHBfY29uZl9wYXRoLCAiYXBhY2hlMi1kZWJpYW4taHR0cGQuY29uZiIpCisKKyAgIyBUcnkgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZHMKKyAgbG9nZ2luZy5pbmZvKCJXaWxsICIgKyBydW5fY21kICsgIiBhcGFjaGUyIHNlcnZlci4iKQorICBjbWQgPSBleHBvcnRfZW52dmFyc19jbWQgKyAiICYmICIgKyBhcGFjaGUyX3Jlc3RhcnRfY21kICsgZGlyZWN0aXZlcyArIGNvbmZfZmlsZV9jbWQKKyAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAob3V0LCBlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisKKyAgIyBPdXRwdXQgdGhlIHN0ZG91dCBmcm9tIHRoZSBjb21tYW5kIHRvIGNvbnNvbGUKKyAgbG9nZ2luZy5pbmZvKG91dCkKKworICAjIFJlcG9ydCBhbnkgZXJyb3JzCisgIGlmIHAucmV0dXJuY29kZSAhPSAwOgorICAgIGxvZ2dpbmcuaW5mbygiISEgRVJST1JTOiIpCisKKyAgICBpZiBlcnIuZmluZChlbnZ2YXJzX3BhdGgpICE9IC0xOgorICAgICAgbG9nZ2luZy5pbmZvKGVycikKKyAgICBlbGlmIGVyci5maW5kKCdjb21tYW5kIG5vdCBmb3VuZCcpICE9IC0xOgorICAgICAgbG9nZ2luZy5pbmZvKCJhcGFjaGUyIGlzIHByb2JhYmx5IG5vdCBpbnN0YWxsZWQiKQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLmluZm8oZXJyKQorICAgICAgbG9nZ2luZy5pbmZvKCJUcnkgbG9va2luZyBpbiAiICsgZXJyb3JfbG9nX3BhdGggKyAiIGZvciBkZXRhaWxzIikKKyAgZWxzZToKKyAgICBsb2dnaW5nLmluZm8oIk9LIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgbWFpbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5IGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL2Fzc2V0cy9ydW5fbGF5b3V0X3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxM2Q4YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvYXNzZXRzL3J1bl9sYXlvdXRfdGVzdHMucHkKQEAgLTAsMCArMSw2NSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIiIiUnVuIGxheW91dCB0ZXN0cyBvbiB0aGUgZGV2aWNlLgorCisgIEl0IHJ1bnMgdGhlIHNwZWNpZmllZCB0ZXN0cyBvbiB0aGUgZGV2aWNlLCBkb3dubG9hZHMgdGhlIHN1bW1hcmllcyB0byB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeQorICBhbmQgb3BlbnMgaHRtbCBkZXRhaWxzIGluIHRoZSBkZWZhdWx0IGJyb3dzZXIuCisKKyAgVXNhZ2U6CisgICAgcnVuX2xheW91dF90ZXN0cy5weSBQQVRICisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB3ZWJicm93c2VyCitpbXBvcnQgdGVtcGZpbGUKKworI1RPRE86IFRoZXNlIHNob3VsZCBub3QgYmUgaGFyZGNvZGVkCitSRVNVTFRTX0FCU09MVVRFX1BBVEggPSAiL3NkY2FyZC9hbmRyb2lkL0xheW91dFRlc3RzLXJlc3VsdHMvIgorREVUQUlMU19IVE1MID0gImRldGFpbHMuaHRtbCIKK1NVTU1BUllfVFhUID0gInN1bW1hcnkudHh0IgorCitkZWYgbWFpbigpOgorICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICBwYXRoID0gc3lzLmFyZ3ZbMV0KKyAgZWxzZToKKyAgICBwYXRoID0gIiIKKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSclKG1lc3NhZ2UpcycpCisKKyAgdG1wZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisKKyAgIyBSdW4gdGhlIHRlc3RzIGluIHBhdGgKKyAgY21kID0gImFkYiBzaGVsbCBhbSBpbnN0cnVtZW50ICIKKyAgY21kICs9ICItZSBjbGFzcyBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydC5TdGFydGVyI3N0YXJ0TGF5b3V0VGVzdHMgIgorICBjbWQgKz0gIi1lIHBhdGggXCIiICsgcGF0aCArICJcIiAiCisgIGNtZCArPSItdyBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIvY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQuU2NyaXB0VGVzdFJ1bm5lciIKKworICBsb2dnaW5nLmluZm8oIlJ1bm5pbmcgdGhlIHRlc3RzLi4uIikKKyAgc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKCkKKworICBsb2dnaW5nLmluZm8oIkRvd25sb2FkaW5nIHRoZSBzdW1tYXJpZXMuLi4iKQorCisgICMgRG93bmxvYWQgdGhlIHR4dCBzdW1tYXJ5IHRvIHRtcCBmb2xkZXIKKyAgc3VtbWFyeV90eHRfdG1wX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBTVU1NQVJZX1RYVCkKKyAgY21kID0gImFkYiBwdWxsICIgKyBSRVNVTFRTX0FCU09MVVRFX1BBVEggKyBTVU1NQVJZX1RYVCArICIgIiArIHN1bW1hcnlfdHh0X3RtcF9wYXRoCisgIHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCisKKyAgIyBEb3dubG9hZCB0aGUgaHRtbCBzdW1tYXJ5IHRvIHRtcCBmb2xkZXIKKyAgZGV0YWlsc19odG1sX3RtcF9wYXRoID0gb3MucGF0aC5qb2luKHRtcGRpciwgREVUQUlMU19IVE1MKQorICBjbWQgPSAiYWRiIHB1bGwgIiArIFJFU1VMVFNfQUJTT0xVVEVfUEFUSCArIERFVEFJTFNfSFRNTCArICIgIiArIGRldGFpbHNfaHRtbF90bXBfcGF0aAorICBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorCisgICMgUHJpbnQgc3VtbWFyeSB0byBjb25zb2xlCisgIGxvZ2dpbmcuaW5mbygiQWxsIGRvbmUuXG4iKQorICBjbWQgPSAiY2F0ICIgKyBzdW1tYXJ5X3R4dF90bXBfcGF0aAorICBvcy5zeXN0ZW0oY21kKQorICBsb2dnaW5nLmluZm8oIiIpCisKKyAgIyBPcGVuIHRoZSBicm93c2VyIHdpdGggc3VtbWFyeQorICB3ZWJicm93c2VyLm9wZW4oZGV0YWlsc19odG1sX3RtcF9wYXRoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBtYWluKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL2ZvbGRlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzZmNlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvZHJhd2FibGUvZm9sZGVyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2RyYXdhYmxlL3J1bnRlc3QucG5nIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBjNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9kcmF3YWJsZS9ydW50ZXN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL2xheW91dC9kaXJsaXN0X3Jvdy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1NzhhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9yZXMvbGF5b3V0L2Rpcmxpc3Rfcm93LnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjgwcHgiCisgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE1cHgiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTVweCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNXB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI2MHB4IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKKyAgICAvPgorCis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL21lbnUvZ3VpX21lbnUueG1sIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy9tZW51L2d1aV9tZW51LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvcnVuX2FsbCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3J1bl9hbGxfdGVzdHMiIC8+Cis8L21lbnU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDk2NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX3RpdGxlX3ByZWZpeCI+RGlyZWN0b3J5Ojwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnIj5UaGlzIHdpbGwgcnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkgYW5kIGFsbAorICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yaWVzLiBJdCBtYXkgdGFrZSBhIGZldyBob3VycyE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiI+UnVuIHRlc3RzITwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uIj5BYm9ydDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfdGl0bGUiPkxvYWRpbmcgaXRlbXMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJkaWFsb2dfcHJvZ3Jlc3NfbXNnIj5QbGVhc2Ugd2FpdC4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5uZXJfcHJlbG9hZGluZ190aXRsZSI+UHJlbG9hZGluZyB0ZXN0cy4uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJydW5fYWxsX3Rlc3RzIj5SdW4gYWxsIHRlc3RzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvc3RyaW5nPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWJzdHJhY3RSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYjM5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0Fic3RyYWN0UmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3OworCisvKioKKyAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnQgYSByZXN1bHQgb2YgdGhlIHRlc3QuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHJlc3VsdCdzCisgKiByYXcgZGF0YSBhbmQgZ2VuZXJhdGluZyBpdHMgb3duIGRpZmYgaW4gSFRNTCBmb3JtYXQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc3VsdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8QWJzdHJhY3RSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFic3RyYWN0UmVzdWx0IjsKKworICAgIHB1YmxpYyBlbnVtIFRlc3RUeXBlIHsKKyAgICAgICAgVEVYVCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dFJlc3VsdChidW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBSRU5ERVJfVFJFRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBSZW5kZXJUcmVlIHRlc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJlc3VsdCBjcmVhdGVSZXN1bHQoQnVuZGxlIGJ1bmRsZSk7CisgICAgfQorCisgICAgcHVibGljIGVudW0gUmVzdWx0Q29kZSB7CisgICAgICAgIFBBU1MoIlBhc3NlZCIpLAorICAgICAgICBGQUlMX1JFU1VMVF9ESUZGRVJTKCJSZXN1bHQgZGlmZmVycyIpLAorICAgICAgICBGQUlMX05PX0VYUEVDVEVEX1JFU1VMVCgiTm8gZXhwZWN0ZWQgcmVzdWx0IiksCisgICAgICAgIEZBSUxfVElNRURfT1VUKCJUaW1lZCBvdXQiKSwKKyAgICAgICAgRkFJTF9DUkFTSEVEKCJDcmFzaGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgICAgIHByaXZhdGUgUmVzdWx0Q29kZShTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgICAgIG1UaXRsZSA9IHRpdGxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRpdGxlOworICAgICAgICB9CisgICAgfQorCisgICAgU3RyaW5nIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEFic3RyYWN0UmVzdWx0IGFub3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aCgpLmNvbXBhcmVUbyhhbm90aGVyLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcpIHsKKyAgICAgICAgbUFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nID0gYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1BZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgcmVzdWx0IG9iamVjdCBvYnRhaW4gdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgZnJvbSB0aGUgd2VidmlldworICAgICAqIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBmb3JtYXQgdGhhdCBzdWl0cyBpdHNlbGYgYmVzdHMuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cy4KKyAgICAgKiBUaGUgbWVzc2FnZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgaXMgYSBtZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gaXRzIHRhcmdldAorICAgICAqIHdoZW4gdGhlIHJlc3VsdCBmaW5pc2hlcyBvYnRhaW5pbmcgdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJ2aWV3CisgICAgICogQHBhcmFtIHJlc3VsdE9idGFpbmVkTXNnCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb2J0YWluQWN0dWFsUmVzdWx0cyhXZWJWaWV3IHdlYnZpZXcsIE1lc3NhZ2UgcmVzdWx0T2J0YWluZWRNc2cpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEV4cGVjdGVkSW1hZ2VSZXN1bHRQYXRoKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgcmVzdWx0J3MgaW1hZ2UgZGF0YSB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSBkaXNrLiBJdCBjYW4gYmUgbnVsbAorICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9mIHNvbWUgc29ydCBvciBmb3IgZXhhbXBsZSB0aGUgdGVzdCB0aW1lcyBvdXQuCisgICAgICoKKyAgICAgKiA8cD4gU29tZSB0ZXN0cyB3aWxsIG5vdCBwcm92aWRlIGRhdGEgKGxpa2UgdGV4dCB0ZXN0cykKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHJlc3VsdHMgaW1hZ2UgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0QWN0dWFsSW1hZ2VSZXN1bHQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgcmVzdWx0J3MgdGV4dCBkYXRhLiBJdCBjYW4gYmUgbnVsbAorICAgICAqIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9mIHNvbWUgc29ydCBvciBmb3IgZXhhbXBsZSB0aGUgdGVzdCB0aW1lcyBvdXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICByZXN1bHRzIHRleHQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QWN0dWFsVGV4dFJlc3VsdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29kZSBvZiB0aGlzIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBjb2RlIG9mIHRoaXMgcmVzdWx0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVGVzdFR5cGUgZ2V0VHlwZSgpOworCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwaWVjZSBvZiBIVE1MIGNvZGUgdGhhdCBwcmVzZW50cyBhIHZpc3VhbCBkaWZmIGJldHdlZW4gYSByZXN1bHQgYW5kCisgICAgICogdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgcGllY2Ugb2YgSFRNTCBjb2RlIHdpdGggYSB2aXN1YWwgZGlmZiBiZXR3ZWVuIHRoZSByZXN1bHQgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpZmZBc0h0bWwoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBCdW5kbGUgZ2V0QnVuZGxlKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvQWRkaXRpb25hbFRleHRPdXRwdXQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YTkxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0FkZGl0aW9uYWxUZXh0T3V0cHV0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIEEgY2xhc3MgdGhhdCBzdG9yZXMgY29uc29sZXMgbWVzc2FnZXMsIGRhdGFiYXNlIGNhbGxiYWNrcywgYWxlcnQgbWVzc2FnZXMsIGV0Yy4KKyAqLworcHVibGljIGNsYXNzIEFkZGl0aW9uYWxUZXh0T3V0cHV0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBZGRpdGlvbmFsVGV4dE91dHB1dCI7CisKKyAgICAvKioKKyAgICAgKiBPcmRlcmluZyBvZiBlbnVtcyBpcyBpbXBvcnRhbnQgYXMgaXQgZGV0ZXJtaW5lcyBvcmRlcmluZyBvZiB0aGUgdG9TdHJpbmcgbWV0aG9kIQorICAgICAqIFN0cmluZ0J1aWxkZXJzIHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3JkZXIgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgYXBwZWFyIGhlcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIE91dHB1dFR5cGUgeworICAgICAgICBKU19ESUFMT0csCisgICAgICAgIEVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UsCisgICAgICAgIENPTlNPTEVfTUVTU0FHRTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyW10gbU91dHB1dHMgPSBuZXcgU3RyaW5nQnVpbGRlcltPdXRwdXRUeXBlLnZhbHVlcygpLmxlbmd0aF07CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZSBvdXRwdXRUeXBlKSB7CisgICAgICAgIGludCBpbmRleCA9IG91dHB1dFR5cGUub3JkaW5hbCgpOworICAgICAgICBpZiAobU91dHB1dHNbaW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgIG1PdXRwdXRzW2luZGV4XSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1PdXRwdXRzW2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRFeGNlZWRlZERiUXVvdGFNZXNzYWdlKFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkYXRhYmFzZUlkZW50aWZpZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkVYQ0VFREVEX0RCX1FVT1RBX01FU1NBR0UpOworCisgICAgICAgIFN0cmluZyBwcm90b2NvbCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBpbnQgcG9ydCA9IDA7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7CisgICAgICAgICAgICBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOworICAgICAgICAgICAgaG9zdCA9IHVybC5nZXRIb3N0KCk7CisgICAgICAgICAgICBpZiAodXJsLmdldFBvcnQoKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHVybC5nZXRQb3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAidXJsU3RyaW5nPSIgKyB1cmxTdHJpbmcgKyAiIGRhdGFiYXNlSWRlbnRpZmllcj0iICsgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dC5hcHBlbmQoIlVJIERFTEVHQVRFIERBVEFCQVNFIENBTExCQUNLOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiZXhjZWVkZWREYXRhYmFzZVF1b3RhRm9yU2VjdXJpdHlPcmlnaW46eyIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKHByb3RvY29sICsgIiwgIiArIGhvc3QgKyAiLCAiICsgcG9ydCArICJ9ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJkYXRhYmFzZToiICsgZGF0YWJhc2VJZGVudGlmaWVyICsgIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kQ29uc29sZU1lc3NhZ2UoQ29uc29sZU1lc3NhZ2UgY29uc29sZU1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkNPTlNPTEVfTUVTU0FHRSk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09OU09MRSBNRVNTQUdFOiBsaW5lICIgKyBjb25zb2xlTWVzc2FnZS5saW5lTnVtYmVyKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCI6ICIgKyBjb25zb2xlTWVzc2FnZS5tZXNzYWdlKCkgKyAiXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0FsZXJ0KFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gZ2V0U3RyaW5nQnVpbGRlckZvclR5cGUoT3V0cHV0VHlwZS5KU19ESUFMT0cpOworCisgICAgICAgIG91dHB1dC5hcHBlbmQoIkFMRVJUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRKc0NvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiQ09ORklSTTogIik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwZW5kSnNQcm9tcHQoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXRwdXQgPSBnZXRTdHJpbmdCdWlsZGVyRm9yVHlwZShPdXRwdXRUeXBlLkpTX0RJQUxPRyk7CisKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiUFJPTVBUOiAiKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiLCBkZWZhdWx0IHRleHQ6ICIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1PdXRwdXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobU91dHB1dHNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0NyYXNoZWREdW1teVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZGE3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9DcmFzaGVkRHVtbXlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKKy8qKgorICogQSBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgdGVzdCB0aGF0IGNyYXNoZWQuCisgKgorICogVE9ETzogQWxsIHRoZSBtZXRob2RzIHJlZ2FyZGluZyBleHBlY3RlZCByZXN1bHRzIG5lZWQgaW1wbGVtZW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgQ3Jhc2hlZER1bW15UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RSZXN1bHQgeworICAgIFN0cmluZyBtUmVsYXRpdmVQYXRoOworCisgICAgcHVibGljIENyYXNoZWREdW1teVJlc3VsdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1SZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgLyoqIFRPRE86ICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZmZBc0h0bWwoKSB7CisgICAgICAgIC8qKiBUT0RPOiBQcm9iYWJseSBzaG93IGF0IGxlYXN0IGV4cGVjdGVkIHJlc3VsdHMgKi8KKyAgICAgICAgcmV0dXJuICJPb29wcywgSSBjcmFzaGVkLi4uIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3VsdENvZGUgZ2V0UmVzdWx0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdENvZGUuRkFJTF9DUkFTSEVEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0VHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvYnRhaW5BY3R1YWxSZXN1bHRzKFdlYlZpZXcgd2VidmlldywgTWVzc2FnZSByZXN1bHRPYnRhaW5lZE1zZykgeworICAgICAgICAvKiogVGhpcyBtZXRob2QgaXMgbm90IGFwcGxpY2FibGUgZm9yIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkSW1hZ2VSZXN1bHQoYnl0ZVtdIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0KFN0cmluZyBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoKSB7CisgICAgICAgIC8qKiBUT0RPICovCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICAvKiogVE9ETyAqLworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdjYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgYWN0cyBhcyBhIEpTIGludGVyZmFjZSBmb3Igd2VidmlldyB0byBtb2NrIHZhcmlvdXMgdG91Y2ggZXZlbnRzLAorICogbW91c2UgYWN0aW9ucyBhbmQga2V5IHByZXNzZXMuCisgKgorICogVGhlIG1ldGhvZHMgaGVyZSBqdXN0IGNhbGwgY29ycmVzcG9uZGluZyBtZXRob2RzIG9uIEV2ZW50U2VuZGVySW1wbAorICogdGhhdCBjb250YWlucyB0aGUgbG9naWMgb2YgaG93IHRvIGV4ZWN1dGUgdGhlIG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNlbmRlciB7CisgICAgRXZlbnRTZW5kZXJJbXBsIG1FdmVudFNlbmRlckltcGwgPSBuZXcgRXZlbnRTZW5kZXJJbXBsKCk7CisKKyAgICBwdWJsaWMgdm9pZCByZXNldChXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5yZXNldCh3ZWJWaWV3KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmFibGVET01VSUV2ZW50TG9nZ2luZyhpbnQgZG9tTm9kZSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGRvbU5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChpbnQgZG9tTm9kZSkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLmZpcmVLZXlib2FyZEV2ZW50c1RvRWxlbWVudChkb21Ob2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBrZXlEb3duKFN0cmluZyBjaGFyYWN0ZXIsIFN0cmluZ1tdIHdpdGhNb2RpZmllcnMpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5rZXlEb3duKGNoYXJhY3Rlciwgd2l0aE1vZGlmaWVycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQga2V5RG93bihTdHJpbmcgY2hhcmFjdGVyKSB7CisgICAgICAgIGtleURvd24oY2hhcmFjdGVyLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubGVhcEZvcndhcmQobWlsbGlzZWNvbmRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLm1vdXNlQ2xpY2soKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VNb3ZlVG8oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwubW91c2VNb3ZlVG8oeCwgeSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbW91c2VVcCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5tb3VzZVVwKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hTdGFydCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVG91Y2hQb2ludChpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5hZGRUb3VjaFBvaW50KHgsIHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRvdWNoUG9pbnQoaW50IGlkLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC51cGRhdGVUb3VjaFBvaW50KGlkLCB4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1FdmVudFNlbmRlckltcGwuc2V0VG91Y2hNb2RpZmllcihtb2RpZmllciwgZW5hYmxlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoTW92ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VUb3VjaFBvaW50KGludCBpZCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnJlbGVhc2VUb3VjaFBvaW50KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaEVuZCgpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC50b3VjaEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRvdWNoQ2FuY2VsKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJJbXBsLnRvdWNoQ2FuY2VsKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXJUb3VjaFBvaW50cygpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5jbGVhclRvdWNoUG9pbnRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySW1wbC5jYW5jZWxUb3VjaFBvaW50KGlkKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9FdmVudFNlbmRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U2MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvRXZlbnRTZW5kZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlldzsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEV2ZW50U2VuZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNlbmRlckltcGwgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkV2ZW50U2VuZGVySW1wbCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0VOQUJMRV9ET01fVUlfRVZFTlRfTE9HR0lORyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GSVJFX0tFWUJPQVJEX0VWRU5UU19UT19FTEVNRU5UID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0xFQVBfRk9SV0FSRCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0tFWV9ET1dOID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfTU9VU0VfRE9XTiA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9VUCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9DTElDSyA9IDY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19NT1VTRV9NT1ZFX1RPID0gNzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQUREX1RPVUNIX1BPSU5UID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX1NUQVJUID0gOTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9UT1VDSF9QT0lOVCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVE9VQ0hfTU9WRSA9IDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTID0gMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UT1VDSF9DQU5DRUwgPSAxMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQgPSAxNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPVUNIX0VORCA9IDE1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0VUX1RPVUNIX01PRElGSUVSID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQgPSAxNzsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG91Y2hQb2ludCB7CisgICAgICAgIFdlYlZpZXcgbVdlYlZpZXc7CisgICAgICAgIHByaXZhdGUgaW50IG1YOworICAgICAgICBwcml2YXRlIGludCBtWTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Eb3duVGltZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWxlYXNlZCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU1vdmVkID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsbGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRvdWNoUG9pbnQoV2ViVmlldyB3ZWJWaWV3LCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgICAgIG1YID0gc2NhbGVYKHgpOworICAgICAgICAgICAgbVkgPSBzY2FsZVkoeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3ZlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTW92ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBtb3ZlKGludCBuZXdYLCBpbnQgbmV3WSkgeworICAgICAgICAgICAgbVggPSBzY2FsZVgobmV3WCk7CisgICAgICAgICAgICBtWSA9IHNjYWxlWShuZXdZKTsKKyAgICAgICAgICAgIG1Nb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldEhhc01vdmVkKCkgeworICAgICAgICAgICAgbU1vdmVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXREb3duVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRG93blRpbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXREb3duVGltZShsb25nIGRvd25UaW1lKSB7CisgICAgICAgICAgICBtRG93blRpbWUgPSBkb3duVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVsZWFzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGVhc2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgICAgIG1SZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FuY2VsbGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICAgICAgbUNhbmNlbGxlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBzY2FsZVgoaW50IHgpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh4ICogbVdlYlZpZXcuZ2V0U2NhbGUoKSkgLSBtV2ViVmlldy5nZXRTY3JvbGxYKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBzY2FsZVkoaW50IHkpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSh5ICogbVdlYlZpZXcuZ2V0U2NhbGUoKSkgLSBtV2ViVmlldy5nZXRTY3JvbGxZKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VG91Y2hQb2ludD4gbVRvdWNoUG9pbnRzOworICAgIHByaXZhdGUgaW50IG1Ub3VjaE1ldGFTdGF0ZTsKKyAgICBwcml2YXRlIGludCBtTW91c2VYOworICAgIHByaXZhdGUgaW50IG1Nb3VzZVk7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbVdlYlZpZXc7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUV2ZW50U2VuZGVySGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgVG91Y2hQb2ludCB0b3VjaFBvaW50OworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZTsKKyAgICAgICAgICAgIEtleUV2ZW50IGV2ZW50OworCisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRU5BQkxFX0RPTV9VSV9FVkVOVF9MT0dHSU5HOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogaW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRklSRV9LRVlCT0FSRF9FVkVOVFNfVE9fRUxFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IGltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0xFQVBfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IGltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0tFWV9ET1dOOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyYWN0ZXIgPSBidW5kbGUuZ2V0U3RyaW5nKCJjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gd2l0aE1vZGlmaWVycyA9IGJ1bmRsZS5nZXRTdHJpbmdBcnJheSgid2l0aE1vZGlmaWVycyIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoTW9kaWZpZXJzICE9IG51bGwgJiYgd2l0aE1vZGlmaWVycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhNb2RpZmllcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllclRvS2V5Q29kZSh3aXRoTW9kaWZpZXJzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUtleUV2ZW50KEtleUV2ZW50LkFDVElPTl9ET1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJUb0tleUNvZGUoY2hhcmFjdGVyLnRvTG93ZXJDYXNlKCkudG9DaGFyQXJyYXkoKVswXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qKiBNT1VTRSAqLworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRPRE86IEltcGxlbWVudCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX01PVVNFX1VQOgorICAgICAgICAgICAgICAgICAgICAvKiogVE9ETzogSW1wbGVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfTU9VU0VfQ0xJQ0s6CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19NT1VTRV9NT1ZFX1RPOgorICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IG1zZy5hcmcyOworCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggPiBtTW91c2VYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1JJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgbU1vdXNlWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgS2V5RXZlbnQoS2V5RXZlbnQuQUNUSU9OX0RPV04sIEtleUV2ZW50LktFWUNPREVfRFBBRF9MRUZUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlVcChldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHkgPiBtTW91c2VZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX0RPV04pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPCBtTW91c2VZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBLZXlFdmVudChLZXlFdmVudC5BQ1RJT05fRE9XTiwgS2V5RXZlbnQuS0VZQ09ERV9EUEFEX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXcub25LZXlVcChldmVudC5nZXRLZXlDb2RlKCksIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1Nb3VzZVggPSB4OworICAgICAgICAgICAgICAgICAgICBtTW91c2VZID0geTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiogVE9VQ0ggKi8KKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FERF9UT1VDSF9QT0lOVDoKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5hZGQobmV3IFRvdWNoUG9pbnQobVdlYlZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmFyZzEsIG1zZy5hcmcyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcgKyAiOjpNU0dfQUREX1RPVUNIX1BPSU5UIiwgIkFkZGVkIG1vcmUgdGhhbiBvbmUgdG91Y2ggcG9pbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQuc2V0RG93blRpbWUoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1RPVUNIX1BPSU5UOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gYnVuZGxlLmdldEludCgiaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkID49IGdldFRvdWNoUG9pbnRzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHICsgIjo6TVNHX1VQREFURV9UT1VDSF9QT0lOVCIsICJUb3VjaFBvaW50IG91dCBvZiBib3VuZHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGdldFRvdWNoUG9pbnRzKCkuZ2V0KGlkKS5tb3ZlKGJ1bmRsZS5nZXRJbnQoIngiKSwgYnVuZGxlLmdldEludCgieSIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9NT1ZFOgorICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogRklYTUU6IEF0IHRoZSBtb21lbnQgd2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aS10b3VjaC4gSGVuY2UsIHdlIG9ubHkgZXhhbWluZQorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmlyc3QgdG91Y2ggcG9pbnQuIEluIGZ1dHVyZSB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgcmV3cml0aW5nLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRvdWNoUG9pbnRzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG91Y2hQb2ludCA9IGdldFRvdWNoUG9pbnRzKCkuZ2V0KDApOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdG91Y2hQb2ludC5oYXNNb3ZlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQodG91Y2hQb2ludCwgTW90aW9uRXZlbnQuQUNUSU9OX01PVkUpOworICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50LnJlc2V0SGFzTW92ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPVUNIX0NBTkNFTDoKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEZJWE1FOiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHN1cHBvcnQgbXVsdGktdG91Y2guIEhlbmNlLCB3ZSBvbmx5IGV4YW1pbmUKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IHRvdWNoIHBvaW50LiBJbiBmdXR1cmUgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHJld3JpdGluZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRUb3VjaFBvaW50cygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBnZXRUb3VjaFBvaW50cygpLmdldCgwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodG91Y2hQb2ludC5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlVG91Y2hFdmVudCh0b3VjaFBvaW50LCBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnMSA+PSBnZXRUb3VjaFBvaW50cygpLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6Ok1TR19SRUxFQVNFX1RPVUNIX1BPSU5UIiwgIlRvdWNoUG9pbnQgb3V0IG9mIGJvdW5kczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG91Y2hQb2ludHMoKS5nZXQobXNnLmFyZzEpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1VDSF9FTkQ6CisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBzdXBwb3J0IG11bHRpLXRvdWNoLiBIZW5jZSwgd2Ugb25seSBleGFtaW5lCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCB0b3VjaCBwb2ludC4gSW4gZnV0dXJlIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCByZXdyaXRpbmcuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VG91Y2hQb2ludHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0b3VjaFBvaW50ID0gZ2V0VG91Y2hQb2ludHMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVRvdWNoRXZlbnQodG91Y2hQb2ludCwgTW90aW9uRXZlbnQuQUNUSU9OX1VQKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvdWNoUG9pbnQuaXNSZWxlYXNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoUG9pbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX1RPVUNIX01PRElGSUVSOgorICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSAoQnVuZGxlKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RpZmllciA9IGJ1bmRsZS5nZXRTdHJpbmcoIm1vZGlmaWVyIik7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IGJ1bmRsZS5nZXRCb29sZWFuKCJlbmFibGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoImFsdCIuZXF1YWxzKG1vZGlmaWVyLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gS2V5RXZlbnQuTUVUQV9BTFRfT047CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNoaWZ0Ii5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NISUZUX09OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjdHJsIi5lcXVhbHMobW9kaWZpZXIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBLZXlFdmVudC5NRVRBX1NZTV9PTjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG91Y2hNZXRhU3RhdGUgfD0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1ldGFTdGF0ZSAmPSB+bWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ0xFQVJfVE9VQ0hfUE9JTlRTOgorICAgICAgICAgICAgICAgICAgICBnZXRUb3VjaFBvaW50cygpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHZvaWQgcmVzZXQoV2ViVmlldyB3ZWJWaWV3KSB7CisgICAgICAgIG1XZWJWaWV3ID0gd2ViVmlldzsKKyAgICAgICAgbVRvdWNoUG9pbnRzID0gbnVsbDsKKyAgICAgICAgbVRvdWNoTWV0YVN0YXRlID0gMDsKKyAgICAgICAgbU1vdXNlWCA9IDA7CisgICAgICAgIG1Nb3VzZVkgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuYWJsZURPTVVJRXZlbnRMb2dnaW5nKGludCBkb21Ob2RlKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19FTkFCTEVfRE9NX1VJX0VWRU5UX0xPR0dJTkcpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaXJlS2V5Ym9hcmRFdmVudHNUb0VsZW1lbnQoaW50IGRvbU5vZGUpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZJUkVfS0VZQk9BUkRfRVZFTlRTX1RPX0VMRU1FTlQpOworICAgICAgICBtc2cuYXJnMSA9IGRvbU5vZGU7CisgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsZWFwRm9yd2FyZChpbnQgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19MRUFQX0ZPUldBUkQpOworICAgICAgICBtc2cuYXJnMSA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtleURvd24oU3RyaW5nIGNoYXJhY3RlciwgU3RyaW5nW10gd2l0aE1vZGlmaWVycykgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJjaGFyYWN0ZXIiLCBjaGFyYWN0ZXIpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXkoIndpdGhNb2RpZmllcnMiLCB3aXRoTW9kaWZpZXJzKTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19LRVlfRE9XTiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogTU9VU0UgKi8KKworICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bigpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19NT1VTRV9ET1dOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX1VQKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX01PVVNFX0NMSUNLKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmVUbyhpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19NT1VTRV9NT1ZFX1RPLCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICAvKiogVE9VQ0ggKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZFRvdWNoUG9pbnQoaW50IHgsIGludCB5KSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfQUREX1RPVUNIX1BPSU5ULCB4LCB5KS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0b3VjaFN0YXJ0KCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX1NUQVJUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUb3VjaFBvaW50KGludCBpZCwgaW50IHgsIGludCB5KSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoImlkIiwgaWQpOworICAgICAgICBidW5kbGUucHV0SW50KCJ4IiwgeCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoInkiLCB5KTsKKyAgICAgICAgbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfVE9VQ0hfUE9JTlQsIGJ1bmRsZSkuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hNb3ZlKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1RPVUNIX01PVkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbFRvdWNoUG9pbnQoaW50IGlkKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUV2ZW50U2VuZGVySGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19DQU5DRUxfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hDYW5jZWwoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfQ0FOQ0VMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlVG91Y2hQb2ludChpbnQgaWQpIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1JFTEVBU0VfVE9VQ0hfUE9JTlQpOworICAgICAgICBtc2cuYXJnMSA9IGlkOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdG91Y2hFbmQoKSB7CisgICAgICAgIG1FdmVudFNlbmRlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfVE9VQ0hfRU5EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3VjaE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoIm1vZGlmaWVyIiwgbW9kaWZpZXIpOworICAgICAgICBidW5kbGUucHV0Qm9vbGVhbigiZW5hYmxlZCIsIGVuYWJsZWQpOworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9UT1VDSF9NT0RJRklFUiwgYnVuZGxlKS5zZW5kVG9UYXJnZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclRvdWNoUG9pbnRzKCkgeworICAgICAgICBtRXZlbnRTZW5kZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0NMRUFSX1RPVUNIX1BPSU5UUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRvdWNoUG9pbnQ+IGdldFRvdWNoUG9pbnRzKCkgeworICAgICAgICBpZiAobVRvdWNoUG9pbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1Ub3VjaFBvaW50cyA9IG5ldyBMaW5rZWRMaXN0PFRvdWNoUG9pbnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVRvdWNoUG9pbnRzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVG91Y2hFdmVudChUb3VjaFBvaW50IHRvdWNoUG9pbnQsIGludCBhY3Rpb24pIHsKKyAgICAgICAgTW90aW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgIE1vdGlvbkV2ZW50Lm9idGFpbih0b3VjaFBvaW50LmdldERvd25UaW1lKCksIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgIGFjdGlvbiwgdG91Y2hQb2ludC5nZXRYKCksIHRvdWNoUG9pbnQuZ2V0WSgpLCBtVG91Y2hNZXRhU3RhdGUpOworICAgICAgICBtV2ViVmlldy5vblRvdWNoRXZlbnQoZXZlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlS2V5RXZlbnQoaW50IGFjdGlvbiwgaW50IGtleUNvZGUpIHsKKyAgICAgICAgS2V5RXZlbnQgZXZlbnQgPSBuZXcgS2V5RXZlbnQoYWN0aW9uLCBrZXlDb2RlKTsKKyAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGV2ZW50LmdldEtleUNvZGUoKSwgZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc3VtZXMgbG93ZXJjYXNlIGNoYXJzLCBjYXNlIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgY2FsbGluZyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hhclRvS2V5Q29kZShjaGFyIGMpIHsKKyAgICAgICAgLy8gaGFuZGxlIG51bWJlcnMKKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gYyAtICcwJzsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFXzAgKyBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgY2hhcmFjdGVycworICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBjIC0gJ2EnOworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfQSArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBhbGwgb3RoZXJzCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU1RBUjsKKworICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfUE9VTkQ7CisKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0NPTU1BOworCisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9QRVJJT0Q7CisKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9UQUI7CisKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NQQUNFOworCisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfRU5URVI7CisKKyAgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgIGNhc2UgMHg3RjoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9ERUw7CisKKyAgICAgICAgICAgIGNhc2UgJ34nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0dSQVZFOworCisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9NSU5VUzsKKworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfRVFVQUxTOworCisgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9MRUZUX0JSQUNLRVQ7CisKKyAgICAgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1JJR0hUX0JSQUNLRVQ7CisKKyAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9CQUNLU0xBU0g7CisKKyAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NFTUlDT0xPTjsKKworICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0FQT1NUUk9QSEU7CisKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX1NMQVNIOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZGlmaWVyVG9LZXlDb2RlKFN0cmluZyBtb2RpZmllcikgeworICAgICAgICBpZiAobW9kaWZpZXIuZXF1YWxzKCJjdHJsS2V5IikpIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlFdmVudC5LRVlDT0RFX0FMVF9MRUZUOworICAgICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyLmVxdWFscygic2hpZnRLZXkiKSkgeworICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50LktFWUNPREVfU0hJRlRfTEVGVDsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5lcXVhbHMoImFsdEtleSIpKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9TWU07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gS2V5RXZlbnQuS0VZQ09ERV9VTktOT1dOOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9GaWxlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNzZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZpbGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSB1dGlsaXR5IHRvIGZpbHRlciBvdXQgc29tZSBmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSB2aWV3cyBhbmQgdGVzdHMgdGhhdCBydW4uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaWxlRmlsdGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCA9CisgICAgICAgICAgICAicGxhdGZvcm0vYW5kcm9pZC90ZXN0X2V4cGVjdGF0aW9ucy50eHQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVEVTVFNfUEFUSCA9ICJodHRwL3Rlc3RzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9QQVRIID0gInNzbC8iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPS0VOX0NSQVNIID0gIkNSQVNIIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRkFJTCA9ICJGQUlMIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU0xPVyA9ICJTTE9XIjsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gbUNyYXNoTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1GYWlsTGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG1TbG93TGlzdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290RGlyUGF0aDsKKworICAgIHB1YmxpYyBGaWxlRmlsdGVyKFN0cmluZyByb290RGlyUGF0aCkgeworICAgICAgICAvKiogSXQgbWF5IG9yIG1heSBub3QgY29udGFpbiBhIHRyYWlsaW5nIHNsYXNoICovCisgICAgICAgIHRoaXMubVJvb3REaXJQYXRoID0gcm9vdERpclBhdGg7CisKKyAgICAgICAgbG9hZFRlc3RFeHBlY3RhdGlvbnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHJpbVRyYWlsaW5nU2xhc2hJZlByZXNlbnQoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIHJldHVybiBmaWxlLmdldFBhdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVGVzdEV4cGVjdGF0aW9ucygpIHsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsgIkxheW91dFRlc3RzLyIgKworICAgICAgICAgICAgICAgICAgICBURVNUX0VYUEVDVEFUSU9OU19UWFRfUEFUSCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBGc1V0aWxzLnJlYWREYXRhRnJvbVVybCh1cmwpKSkpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5OworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoOworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHRva2VuczsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHRoZSBjb21tZW50IGFuZCB0cmltICovCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbGluZS5zcGxpdCgiLy8iLCAyKVswXS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIE9taXQgZW1wdHkgbGluZXMsIGFkdmFuY2UgdG8gbmV4dCBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIFNwbGl0IG9uIHdoaXRlc3BhY2UgaW50byBwYXRoIHBhcnQgYW5kIHRoZSByZXN0ICovCisgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gZW50cnkuc3BsaXQoIlxccyIsIDIpOworCisgICAgICAgICAgICAgICAgICAgIC8qKiBBdCB0aGlzIHBvaW50IHBhcnRzLmxlbmd0aCA+PSAxICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRyArICI6OnJlbG9hZENvbmZpZ3VyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIG9wdGlvbnMgc3BlY2lmaWVkIGZvciB0aGUgdGVzdCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRyaW1UcmFpbGluZ1NsYXNoSWZQcmVzZW50KHBhcnRzWzBdKTsKKworICAgICAgICAgICAgICAgICAgICAvKiogU3BsaXQgb24gd2hpdGVzcGFjZSAqLworICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QocGFydHNbMV0uc3BsaXQoIlxccyIsIDApKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoqIENob3NlIHRoZSByaWdodCBjb2xsZWN0aW9ucyB0byBhZGQgdG8gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5jb250YWlucyhUT0tFTl9DUkFTSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DcmFzaExpc3QuYWRkKHBhdGgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiogSWYgdGVzdCBpcyBvbiBza2lwIGxpc3Qgd2UgaWdub3JlIGFueSBmdXJ0aGVyIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vucy5jb250YWlucyhUT0tFTl9GQUlMKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZhaWxMaXN0LmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmNvbnRhaW5zKFRPS0VOX1NMT1cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2xvd0xpc3QuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWRSZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJyZWxvYWRDb25maWd1cmF0aW9uKCk6IEZpbGUgbm90IGZvdW5kOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAidXJsPSIgKyB1cmwsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRlc3QgaXMgZXhwZWN0ZWQgdG8gY3Jhc2guCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHNraXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NyYXNoKFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtQ3Jhc2hMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCByZXN1bHQgaXMgc3VwcG9zZWQgdG8gYmUgImZhaWxlZCIuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBQYXRoIGdpdmVuIHNob3VsZCByZWxhdGl2ZSB3aXRoaW4gTGF5b3V0VGVzdHMgZm9sZGVyLCBlLmcuIGZhc3QvZG9tL2Zvby5odG1sCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdFBhdGgKKyAgICAgKiAgICAgICAgICAgIC0gYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIKKyAgICAgKiBAcmV0dXJuIGlmIHRoZSB0ZXN0IHJlc3VsdCBpcyBzdXBwb3NlZCB0byBiZSAiZmFpbGVkIgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbChTdHJpbmcgdGVzdFBhdGgpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJlZml4IDogZ2V0UHJlZml4ZXModGVzdFBhdGgpKSB7CisgICAgICAgICAgICBpZiAobUZhaWxMaXN0LmNvbnRhaW5zKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGVzdCBpcyBzbG93IGFuZCBzaG91bGQgaGF2ZSB0aW1lb3V0IGluY3JlYXNlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFBhdGggZ2l2ZW4gc2hvdWxkIHJlbGF0aXZlIHdpdGhpbiBMYXlvdXRUZXN0cyBmb2xkZXIsIGUuZy4gZmFzdC9kb20vZm9vLmh0bWwKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0UGF0aAorICAgICAqICAgICAgICAgICAgLSBhIHJlbGF0aXZlIHBhdGggd2l0aGluIExheW91dFRlc3RzIGZvbGRlcgorICAgICAqIEByZXR1cm4gaWYgdGhlIHRlc3QgaXMgc2xvdyBhbmQgc2hvdWxkIGhhdmUgdGltZW91dCBpbmNyZWFzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTbG93KFN0cmluZyB0ZXN0UGF0aCkgeworICAgICAgICBmb3IgKFN0cmluZyBwcmVmaXggOiBnZXRQcmVmaXhlcyh0ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGlmIChtU2xvd0xpc3QuY29udGFpbnMocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhdGggcHJlZml4ZXMgb2YgdGhlIGdpdmVuIHBhdGguCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBlLmcuIHRoaXMvaXMvYS9wYXRoIHJldHVybnMgdGhlIGxpc3Q6IHRoaXMgdGhpcy9pcyB0aGlzL2lzL2EgdGhpcy9pcy9hL3BhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgcGF0aCBwcmVmaXhlcyBvZiB0aGUgZ2l2ZW4gcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0UHJlZml4ZXMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPig4KTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmVmaXhlcy5hZGQoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICB9IHdoaWxlIChmaWxlICE9IG51bGwpOworCisgICAgICAgIHJldHVybiBwcmVmaXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cyBvciBjb250YWlucyBqdXN0IGhlbHBlciBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJOYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIGRpcmVjdG9yeSBtYXkgY29udGFpbiB0ZXN0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rlc3REaXIoU3RyaW5nIGRpck5hbWUpIHsKKyAgICAgICAgcmV0dXJuICghZGlyTmFtZS5lcXVhbHMoInNjcmlwdC10ZXN0cyIpCisgICAgICAgICAgICAgICAgJiYgIWRpck5hbWUuZXF1YWxzKCJyZXNvdXJjZXMiKSAmJiAhZGlyTmFtZS5zdGFydHNXaXRoKCIuIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZmlsZSBpcyBhIHRlc3QuCisgICAgICogQ3VycmVudGx5IHdlIHJ1biAuaHRtbCBhbmQgLnhodG1sIHRlc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3ROYW1lCisgICAgICogQHJldHVybgorICAgICAqICAgICAgaWYgdGhlIGZpbGUgaXMgYSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGVzdEZpbGUoU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgICAgIHJldHVybiB0ZXN0TmFtZS5lbmRzV2l0aCgiLmh0bWwiKSB8fCB0ZXN0TmFtZS5lbmRzV2l0aCgiLnhodG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgVVJMIG9mIHRoZSB0ZXN0IG9uIHRoZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCisgICAgICogQHJldHVybiBhIFVSTCBvZiB0aGUgdGVzdCBvbiB0aGUgc2VydmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkwgZ2V0VXJsKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHVybEJhc2UgPSBGb3J3YXJkZXJNYW5hZ2VyLmdldEhvc3RTY2hlbWVQb3J0KGZhbHNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVVJMIGlzIGZvcm1lZCBkaWZmZXJlbnRseSBmb3IgSFRUUCB2cyBub24tSFRUUCB0ZXN0cywgYmVjYXVzZSBIVFRQIHRlc3RzCisgICAgICAgICAqIGV4cGVjdCBkaWZmZXJlbnQgZG9jdW1lbnQgcm9vdC4gU2VlIHJ1bl9hcGFjaGUyLnB5IGFuZCAuY29uZiBmaWxlIGZvciBkZXRhaWxzCisgICAgICAgICAqLworICAgICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoSFRUUF9URVNUU19QQVRIKSkgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoLnN1YnN0cmluZyhIVFRQX1RFU1RTX1BBVEgubGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFNTTF9QQVRIKSkgeworICAgICAgICAgICAgICAgIHVybEJhc2UgPSBGb3J3YXJkZXJNYW5hZ2VyLmdldEhvc3RTY2hlbWVQb3J0KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gIkxheW91dFRlc3RzLyIgKyByZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsQmFzZSArIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiTWFsZm9ybWVkIFVSTCEiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlUGF0aAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyByb290IGRpcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFN0cmluZyBmaWxlUGF0aCkgeworICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShtUm9vdERpclBhdGgpOworICAgICAgICByZXR1cm4gZmlsZVBhdGgucmVwbGFjZUZpcnN0KHJvb3REaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHRlc3RzIHJvb3QgZGlyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGgKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgdGVzdHMgcm9vdCBkaXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlbGF0aXZlUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZSBnZXRBYnNvbHV0ZUZpbGUoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobVJvb3REaXJQYXRoLCByZWxhdGl2ZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWJvc2x1dGVQYXRoKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEFic29sdXRlRmlsZShyZWxhdGl2ZVBhdGgpLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBwYXRoIGNvbnRhaW5zIGV4dGVuc2lvbiAoZS5nIC5mb28gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSkgdGhlbiBpdCBjaGFuZ2VzCisgICAgICogdGhpcyAoLmZvbykgaW50byBuZXdFbmRpbmcgKHNvIGl0IGhhcyB0byBjb250YWluIHRoZSBkb3QgaWYgd2Ugd2FudCB0byBwcmVzZXJ2ZSBpdCkuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcGF0aCBkb2Vzbid0IGNvbnRhaW4gYW4gZXh0ZW5zaW9uLCBpdCBhZGRzIHRoZSBlbmRpbmcgdG8gdGhlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCisgICAgICogQHBhcmFtIG5ld0VuZGluZworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIGEgbmV3IHBhdGgsIGNvbnRhaW5pbmcgdGhlIG5ld0V4dGVuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldFBhdGhFbmRpbmcoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIG5ld0VuZGluZykgeworICAgICAgICBpbnQgZG90UG9zID0gcmVsYXRpdmVQYXRoLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChkb3RQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggKyBuZXdFbmRpbmc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnN1YnN0cmluZygwLCBkb3RQb3MpICsgbmV3RW5kaW5nOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9Gc1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMjY2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0ZzVXRpbHMuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEZzVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRnNVdGlscyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX1VSTCA9IEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsKKyAgICAgICAgICAgICJXZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL2dldF9sYXlvdXRfdGVzdHNfZGlyX2NvbnRlbnRzLnBocCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEYXRhVG9TdG9yYWdlKEZpbGUgZmlsZSwgYnl0ZVtdIGJ5dGVzLCBib29sZWFuIGFwcGVuZCkgeworICAgICAgICBMb2cuZChMT0dfVEFHLCAid3JpdGVEYXRhVG9TdG9yYWdlKCk6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAid3JpdGVEYXRhVG9TdG9yYWdlKCk6IEZpbGUgY3JlYXRlZDogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUsIGFwcGVuZCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImZpbGUuZ2V0QWJzb2x1dGVQYXRoPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBhcHBlbmQ9IiArIGFwcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRGF0YUZyb21TdG9yYWdlKEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWFkRGF0YUZyb21TdG9yYWdlKCk6IEZpbGUgZG9lcyBub3QgZXhpc3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIGJ5dGVzID0gbmV3IGJ5dGVbKGludClmaWxlLmxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBmaXMucmVhZChieXRlcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJmaWxlLmdldEFic29sdXRlUGF0aD0iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZERhdGFGcm9tVXJsKFVSTCB1cmwpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAicmVhZERhdGFGcm9tVXJsKCk6IHVybCBpcyBudWxsISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdXJsQ29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlcyA9IG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInJlYWREYXRhRnJvbVVybCgpOiBGaWxlIG5vdCBmb3VuZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgInVybD0iICsgdXJsLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGgsIGJvb2xlYW4gcmVjdXJzZSwKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kZSkgeworICAgICAgICBTdHJpbmcgbW9kZVN0cmluZyA9IChtb2RlID8gImZvbGRlcnMiIDogImZpbGVzIik7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKFNDUklQVF9VUkwgKworICAgICAgICAgICAgICAgICAgICAiP3BhdGg9IiArIGRpclJlbGF0aXZlUGF0aCArCisgICAgICAgICAgICAgICAgICAgICImcmVjdXJzZT0iICsgcmVjdXJzZSArCisgICAgICAgICAgICAgICAgICAgICImbW9kZT0iICsgbW9kZVN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicGF0aD0iICsgZGlyUmVsYXRpdmVQYXRoICsgIiByZWN1cnNlPSIgKyByZWN1cnNlICsgIiBtb2RlPSIgKworICAgICAgICAgICAgICAgICAgICBtb2RlU3RyaW5nLCBlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgICAgIHdoaWxlICgocmVsYXRpdmVQYXRoID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChyZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkUmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJwYXRoPSIgKyBkaXJSZWxhdGl2ZVBhdGggKyAiIHJlY3Vyc2U9IiArIHJlY3Vyc2UgKyAiIG1vZGU9IiArCisgICAgICAgICAgICAgICAgICAgIG1vZGVTdHJpbmcsIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL0xheW91dFRlc3RDb250cm9sbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTdlYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0Q29udHJvbGxlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5Nb2NrR2VvbG9jYXRpb247CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViU3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBIGNsYXNzIHRoYXQgaXMgcmVnaXN0ZXJlZCBhcyBKUyBpbnRlcmZhY2UgZm9yIHdlYnZpZXcgaW4gTGF5b3V0VGVzdEV4ZWN1dG9yCisgKi8KK3B1YmxpYyBjbGFzcyBMYXlvdXRUZXN0Q29udHJvbGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTGF5b3V0VGVzdENvbnRyb2xsZXIiOworCisgICAgTGF5b3V0VGVzdHNFeGVjdXRvciBtTGF5b3V0VGVzdHNFeGVjdXRvcjsKKworICAgIHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxlcihMYXlvdXRUZXN0c0V4ZWN1dG9yIGxheW91dFRlc3RzRXhlY3V0b3IpIHsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3IgPSBsYXlvdXRUZXN0c0V4ZWN1dG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhaXRVbnRpbERvbmUoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLndhaXRVbnRpbERvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5ub3RpZnlEb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dCgpIHsKKyAgICAgICAgZHVtcEFzVGV4dChmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcEFzVGV4dChib29sZWFuIGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQXNUZXh0KGVuYWJsZVBpeGVsVGVzdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckFsbERhdGFiYXNlcygpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgImNsZWFyQWxsRGF0YWJhc2VzKCkgY2FsbGVkIik7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5kZWxldGVBbGxEYXRhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoKSB7CisgICAgICAgIG1MYXlvdXRUZXN0c0V4ZWN1dG9yLnNldENhbk9wZW5XaW5kb3dzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcERhdGFiYXNlQ2FsbGJhY2tzKCkgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5kdW1wRGF0YWJhc2VDYWxsYmFja3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmFzZVF1b3RhKGxvbmcgcXVvdGEpIHsKKyAgICAgICAgLyoqIFRPRE86IFJlc2V0IHRoaXMgYmVmb3JlIGV2ZXJ5IHRlc3QhICovCisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXREYXRhYmFzZVF1b3RhKCkgY2FsbGVkIHdpdGg6ICIgKyBxdW90YSk7CisgICAgICAgIFdlYlN0b3JhZ2UuZ2V0SW5zdGFuY2UoKS5zZXRRdW90YUZvck9yaWdpbihVcmkuZnJvbUZpbGUobmV3IEZpbGUoIiIpKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHF1b3RhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBtTGF5b3V0VGVzdHNFeGVjdXRvci5zZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYWxsb3cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91YmxlIGFjY3VyYWN5KSB7CisgICAgICAgIExvZy5pKExPR19UQUcsICJzZXRNb2NrR2VvbG9jYXRpb25Qb3NpdGlvbigpOiAiICsgImxhdGl0dWRlPSIgKyBsYXRpdHVkZSArCisgICAgICAgICAgICAgICAgIiBsb25naXR1ZGU9IiArIGxvbmdpdHVkZSArICIgYWNjdXJhY3k9IiArIGFjY3VyYWN5KTsKKyAgICAgICAgTW9ja0dlb2xvY2F0aW9uLmdldEluc3RhbmNlKCkuc2V0UG9zaXRpb24obGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWNjdXJhY3kpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vY2tHZW9sb2NhdGlvbkVycm9yKGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0dlb2xvY2F0aW9uRXJyb3IoKTogIiArICJjb2RlPSIgKyBjb2RlICsgIiBtZXNzYWdlPSIgKyBtZXNzYWdlKTsKKyAgICAgICAgTW9ja0dlb2xvY2F0aW9uLmdldEluc3RhbmNlKCkuc2V0RXJyb3IoY29kZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICAvLyBDb25maWd1cmF0aW9uIGlzIGluIFdlYktpdCwgc28gc3RheSBvbiBXZWJDb3JlIHRocmVhZCwgYnV0IGdvIHZpYSBMYXlvdXRUZXN0c0V4ZWN1dG9yCisgICAgICAgIC8vIGFzIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBXZWJ2aWV3LgorICAgICAgICBMb2cuaShMT0dfVEFHLCAic2V0TW9ja0RldmljZU9yaWVudGF0aW9uKCIgKyBjYW5Qcm92aWRlQWxwaGEgKworICAgICAgICAgICAgICAgICIsICIgKyBhbHBoYSArICIsICIgKyBjYW5Qcm92aWRlQmV0YSArICIsICIgKyBiZXRhICsgIiwgIiArIGNhblByb3ZpZGVHYW1tYSArCisgICAgICAgICAgICAgICAgIiwgIiArIGdhbW1hICsgIikiKTsKKyAgICAgICAgbUxheW91dFRlc3RzRXhlY3V0b3Iuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLCBjYW5Qcm92aWRlR2FtbWEsIGdhbW1hKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvTGF5b3V0VGVzdHNFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDIzMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9MYXlvdXRUZXN0c0V4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw2NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlci5XYWtlTG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNQcm9tcHRSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuSnNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViQ2hyb21lQ2xpZW50OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53ZWJraXQuV2ViVmlld0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5HZW9sb2NhdGlvblBlcm1pc3Npb25zOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlN0b3JhZ2UuUXVvdGFVcGRhdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5UaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSBleGVjdXRlcyB0aGUgdGVzdC4gSXQgY29udGFpbnMgV2ViVmlldyBhbmQgbG9naWMgb2YgTGF5b3V0VGVzdENvbnRyb2xsZXIKKyAqIGZ1bmN0aW9ucy4gSXQgcnVucyBpbiBhIHNlcGFyYXRlIHByb2Nlc3MgYW5kIHNlbmRzIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgdGhlIHRlc3QKKyAqIHRvIE1hbmFnZXJTZXJ2aWNlLiBUaGUgcmVhc29uIHdoeSBpcyB0byBoYW5kbGUgY3Jhc2hpbmcgKHRlc3QgdGhhdCBjcmFzaGVzIGJyaW5ncyBkb3duCisgKiB3aG9sZSBwcm9jZXNzIHdpdGggaXQpLgorICovCitwdWJsaWMgY2xhc3MgTGF5b3V0VGVzdHNFeGVjdXRvciBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgZW51bSBDdXJyZW50U3RhdGUgeworICAgICAgICBJRExFLAorICAgICAgICBSRU5ERVJJTkdfUEFHRSwKKyAgICAgICAgV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1QsCisgICAgICAgIE9CVEFJTklOR19SRVNVTFQ7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nU3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0UgfHwKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9PSBDdXJyZW50U3RhdGUuV0FJVElOR19GT1JfQVNZTkNIUk9OT1VTX1RFU1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVE9ETzogbWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1JPT1RfRElSX1BBVEggPQorICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYW5kcm9pZCIgKworICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiTGF5b3V0VGVzdHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiTGF5b3V0VGVzdEV4ZWN1dG9yIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1RFU1RTX0xJU1QgPSAiVGVzdHNMaXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9URVNUX0lOREVYID0gIlRlc3RJbmRleCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FDVFVBTF9SRVNVTFRfT0JUQUlORUQgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEVTVF9USU1FRF9PVVQgPSAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRV9PVVRfTVMgPSAxNSAqIDEwMDA7CisKKyAgICAvKiogQSBsaXN0IG9mIHRlc3RzIHRoYXQgcmVtYWluIHRvIHJ1biBzaW5jZSBsYXN0IGNyYXNoICovCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRlc3RzTGlzdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBudW1iZXIgb2YgY3VycmVudGx5IHJ1bm5pbmcgdGVzdC4gSXQgaXMgMC1iYXNlZCBhbmQgZG9lc24ndCByZXNldCBhZnRlcgorICAgICAqIHRoZSBjcmFzaC4gSW5pdGlhbCBpbmRleCBpcyBwYXNzZWQgdG8gTGF5b3V0VGVzdHNFeGVjdXRlciBpbiB0aGUgaW50ZW50IHRoYXQgc3RhcnRzCisgICAgICogaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRUZXN0SW5kZXg7CisKKyAgICAvKiogVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyB0byBydW4sIGRvZXNuJ3QgcmVzZXQgYWZ0ZXIgY3Jhc2ggKi8KKyAgICBwcml2YXRlIGludCBtVG90YWxUZXN0Q291bnQ7CisKKyAgICBwcml2YXRlIFdlYlZpZXcgbUN1cnJlbnRXZWJWaWV3OworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudFRlc3RVcmk7CisgICAgcHJpdmF0ZSBDdXJyZW50U3RhdGUgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5JRExFOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1DdXJyZW50VGVzdFRpbWVkT3V0OworICAgIHByaXZhdGUgQWJzdHJhY3RSZXN1bHQgbUN1cnJlbnRSZXN1bHQ7CisgICAgcHJpdmF0ZSBBZGRpdGlvbmFsVGV4dE91dHB1dCBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0OworCisgICAgcHJpdmF0ZSBMYXlvdXRUZXN0Q29udHJvbGxlciBtTGF5b3V0VGVzdENvbnRyb2xsZXIgPSBuZXcgTGF5b3V0VGVzdENvbnRyb2xsZXIodGhpcyk7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5PcGVuV2luZG93czsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBEYXRhYmFzZUNhbGxiYWNrczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0OworICAgIHByaXZhdGUgYm9vbGVhbiBtR2VvbG9jYXRpb25QZXJtaXNzaW9uOworICAgIHByaXZhdGUgTWFwPEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2ssIFN0cmluZz4gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3M7CisKKyAgICBwcml2YXRlIEV2ZW50U2VuZGVyIG1FdmVudFNlbmRlciA9IG5ldyBFdmVudFNlbmRlcigpOworCisgICAgcHJpdmF0ZSBXYWtlTG9jayBtU2NyZWVuRGltTG9jazsKKworICAgIC8qKiBDT01NVU5JQ0FUSU9OIFdJVEggTWFuYWdlclNlcnZpY2UgKi8KKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlcjsKKworICAgIHByaXZhdGUgU2VydmljZUNvbm5lY3Rpb24gbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlcnZpY2VDb25uZWN0aW9uKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIoc2VydmljZSk7CisgICAgICAgICAgICBzdGFydFRlc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgLyoqIFRPRE8gKi8KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbVJlc3VsdEhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19BQ1RVQUxfUkVTVUxUX09CVEFJTkVEOgorICAgICAgICAgICAgICAgICAgICBvbkFjdHVhbFJlc3VsdHNPYnRhaW5lZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RFU1RfVElNRURfT1VUOgorICAgICAgICAgICAgICAgICAgICBvblRlc3RUaW1lZE91dCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBXRUJWSUVXIENPTkZJR1VSQVRJT04gKi8KKworICAgIHByaXZhdGUgV2ViVmlld0NsaWVudCBtV2ViVmlld0NsaWVudCA9IG5ldyBXZWJWaWV3Q2xpZW50KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QYWdlRmluaXNoZWQoV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsKSB7CisgICAgICAgICAgICAvKiogU29tZSB0ZXN0cyBmaXJlIHVwIG1hbnkgcGFnZSBsb2Fkcywgd2UgZG9uJ3Qgd2FudCB0byBkZXRlY3QgdGhlbSAqLworICAgICAgICAgICAgaWYgKCF1cmwuZXF1YWxzKG1DdXJyZW50VGVzdFVyaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5SRU5ERVJJTkdfUEFHRSkgeworICAgICAgICAgICAgICAgIG9uVGVzdEZpbmlzaGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBXZWJDaHJvbWVDbGllbnQgbVdlYkNocm9tZUNsaWVudCA9IG5ldyBXZWJDaHJvbWVDbGllbnQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VlZGVkRGF0YWJhc2VRdW90YShTdHJpbmcgdXJsLCBTdHJpbmcgZGF0YWJhc2VJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudFF1b3RhLCBsb25nIGVzdGltYXRlZFNpemUsIGxvbmcgdG90YWxVc2VkUXVvdGEsCisgICAgICAgICAgICAgICAgUXVvdGFVcGRhdGVyIHF1b3RhVXBkYXRlcikgeworICAgICAgICAgICAgLyoqIFRPRE86IFRoaXMgc2hvdWxkIGJlIHJlY29yZGVkIGFzIHBhcnQgb2YgdGhlIHRleHQgcmVzdWx0ICovCisgICAgICAgICAgICAvKiogVE9ETzogVGhlIHF1b3RhIHNob3VsZCBhbHNvIHByb2JhYmx5IGJlIHJlc2V0IHNvbWVob3cgZm9yIGV2ZXJ5IHRlc3Q/ICovCisgICAgICAgICAgICBpZiAobUR1bXBEYXRhYmFzZUNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEV4Y2VlZGVkRGJRdW90YU1lc3NhZ2UodXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1b3RhVXBkYXRlci51cGRhdGVRdW90YShjdXJyZW50UXVvdGEgKyA1ICogMTAyNCAqIDEwMjQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uSnNBbGVydChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBKc1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpLmFwcGVuZEpzQWxlcnQobWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc0NvbmZpcm0oV2ViVmlldyB2aWV3LCBTdHJpbmcgdXJsLCBTdHJpbmcgbWVzc2FnZSwgSnNSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRKc0NvbmZpcm0obWVzc2FnZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlybSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Kc1Byb21wdChXZWJWaWV3IHZpZXcsIFN0cmluZyB1cmwsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgIEpzUHJvbXB0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgZ2V0Q3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0KCkuYXBwZW5kSnNQcm9tcHQobWVzc2FnZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIHJlc3VsdC5jb25maXJtKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnNvbGVNZXNzYWdlKENvbnNvbGVNZXNzYWdlIGNvbnNvbGVNZXNzYWdlKSB7CisgICAgICAgICAgICBnZXRDdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQoKS5hcHBlbmRDb25zb2xlTWVzc2FnZShjb25zb2xlTWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZVdpbmRvdyhXZWJWaWV3IHZpZXcsIGJvb2xlYW4gZGlhbG9nLCBib29sZWFuIHVzZXJHZXN0dXJlLAorICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVzdWx0TXNnKSB7CisgICAgICAgICAgICBXZWJWaWV3LldlYlZpZXdUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFdlYlZpZXcuV2ViVmlld1RyYW5zcG9ydClyZXN1bHRNc2cub2JqOworICAgICAgICAgICAgLyoqIEJ5IGRlZmF1bHQgd2luZG93cyBjYW5ub3QgYmUgb3BlbmVkLCBzbyBqdXN0IHNlbmQgbnVsbCBiYWNrLiAqLworICAgICAgICAgICAgV2ViVmlldyBuZXdXaW5kb3dXZWJWaWV3ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKG1DYW5PcGVuV2luZG93cykgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFdlIG5ldmVyIGRpc3BsYXkgdGhlIG5ldyB3aW5kb3csIGp1c3QgY3JlYXRlIHRoZSB2aWV3IGFuZCBhbGxvdyBpdCdzIGNvbnRlbnQgdG8KKyAgICAgICAgICAgICAgICAgKiBleGVjdXRlIGFuZCBiZSByZWNvcmRlZCBieSB0aGUgZXhlY3V0b3IuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3V2luZG93V2ViVmlldyA9IG5ldyBXZWJWaWV3KExheW91dFRlc3RzRXhlY3V0b3IudGhpcyk7CisgICAgICAgICAgICAgICAgc2V0dXBXZWJWaWV3KG5ld1dpbmRvd1dlYlZpZXcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFuc3BvcnQuc2V0V2ViVmlldyhuZXdXaW5kb3dXZWJWaWV3KTsKKyAgICAgICAgICAgIHJlc3VsdE1zZy5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR2VvbG9jYXRpb25QZXJtaXNzaW9uc1Nob3dQcm9tcHQoU3RyaW5nIG9yaWdpbiwKKyAgICAgICAgICAgICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0KSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suaW52b2tlKG9yaWdpbiwgbUdlb2xvY2F0aW9uUGVybWlzc2lvbiwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8R2VvbG9jYXRpb25QZXJtaXNzaW9ucy5DYWxsYmFjaywgU3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBvcmlnaW4pOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKiBJTVBMRU1FTlRBVElPTiAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJdCBkZXRlY3RzIHRoZSBjcmFzaCBieSBjYXRjaGluZyBhbGwgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuIEhvd2V2ZXIsIHdlCisgICAgICAgICAqIHN0aWxsIGhhdmUgdG8ga2lsbCB0aGUgcHJvY2VzcywgYmVjYXVzZSBhZnRlciBjYXRjaGluZyB0aGUgZXhjZXB0aW9uIHRoZQorICAgICAgICAgKiBhY3Rpdml0eSByZW1haW5zIGluIGEgc3RyYW5nZSBzdGF0ZSwgd2hlcmUgaW50ZW50cyBkb24ndCByZXZpdmUgaXQuCisgICAgICAgICAqIEhvd2V2ZXIsIHdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHNlcnZpY2UgdG8gc3BlZWQgdXAgdGhlIHJlYm9vdGluZworICAgICAgICAgKiAod2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciB0aW1lLW91dCB0byBraWNrIGluKS4KKyAgICAgICAgICovCisgICAgICAgIFRocmVhZC5zZXREZWZhdWx0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKFRocmVhZCB0aHJlYWQsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvblRlc3RDcmFzaGVkKCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiIHRocmVhZD0iICsgdGhyZWFkLCBlKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0NVUlJFTlRfVEVTVF9DUkFTSEVEKTsKKworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHJvY2Vzcy5raWxsUHJvY2VzcyhQcm9jZXNzLm15UGlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0V2luZG93RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9QUk9HUkVTUyk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOworICAgICAgICBtVGVzdHNMaXN0ID0gaW50ZW50LmdldFN0cmluZ0FycmF5TGlzdEV4dHJhKEVYVFJBX1RFU1RTX0xJU1QpOworICAgICAgICBtQ3VycmVudFRlc3RJbmRleCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9URVNUX0lOREVYLCAtMSk7CisgICAgICAgIG1Ub3RhbFRlc3RDb3VudCA9IG1DdXJyZW50VGVzdEluZGV4ICsgbVRlc3RzTGlzdC5zaXplKCk7CisKKyAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSk7CisgICAgICAgIG1TY3JlZW5EaW1Mb2NrID0gcG0ubmV3V2FrZUxvY2soUG93ZXJNYW5hZ2VyLlNDUkVFTl9ESU1fV0FLRV9MT0NLCisgICAgICAgICAgICAgICAgfCBQb3dlck1hbmFnZXIuT05fQUZURVJfUkVMRUFTRSwgIldha2VMb2NrIGluIExheW91dFRlc3RlciIpOworICAgICAgICBtU2NyZWVuRGltTG9jay5hY3F1aXJlKCk7CisKKyAgICAgICAgYmluZFNlcnZpY2UobmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyksIG1TZXJ2aWNlQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKKyAgICAgICAgV2ViVmlldyBwcmV2aW91c1dlYlZpZXcgPSBtQ3VycmVudFdlYlZpZXc7CisKKyAgICAgICAgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpOworCisgICAgICAgIG1DdXJyZW50VGVzdFRpbWVkT3V0ID0gZmFsc2U7CisgICAgICAgIG1DdXJyZW50UmVzdWx0ID0gbnVsbDsKKyAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG51bGw7CisKKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3ID0gbmV3IFdlYlZpZXcodGhpcyk7CisgICAgICAgIHNldHVwV2ViVmlldyhtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIG1FdmVudFNlbmRlci5yZXNldChtQ3VycmVudFdlYlZpZXcpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KG1DdXJyZW50V2ViVmlldyk7CisgICAgICAgIGlmIChwcmV2aW91c1dlYlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRyArICI6OnJlc2V0IiwgInByZXZpb3VzV2ViVmlldyAhPSBudWxsIik7CisgICAgICAgICAgICBwcmV2aW91c1dlYlZpZXcuZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwV2ViVmlldyhXZWJWaWV3IHdlYlZpZXcpIHsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJWaWV3Q2xpZW50KG1XZWJWaWV3Q2xpZW50KTsKKyAgICAgICAgd2ViVmlldy5zZXRXZWJDaHJvbWVDbGllbnQobVdlYkNocm9tZUNsaWVudCk7CisgICAgICAgIHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShtTGF5b3V0VGVzdENvbnRyb2xsZXIsICJsYXlvdXRUZXN0Q29udHJvbGxlciIpOworICAgICAgICB3ZWJWaWV3LmFkZEphdmFzY3JpcHRJbnRlcmZhY2UobUV2ZW50U2VuZGVyLCAiZXZlbnRTZW5kZXIiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGluZyBhIHRvdWNoIGludGVydmFsIG9mIC0xIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoZSBvcHRpbWlzYXRpb24gaW4gV2ViVmlldworICAgICAgICAgKiB0aGF0IHN0b3BzIHJlcGVhdGVkIHRvdWNoIGV2ZW50cyBmbG9vZGluZyBXZWJDb3JlLiBUaGUgRXZlbnQgU2VuZGVyIG9ubHkgc2VuZHMgYQorICAgICAgICAgKiBzaW5nbGUgZXZlbnQgcmF0aGVyIHRoYW4gYSBzdHJlYW0gb2YgZXZlbnRzIChsaWtlIHdoYXQgd291bGQgZ2VuZXJhbGx5IGhhcHBlbiBpbgorICAgICAgICAgKiBhIHJlYWwgdXNlIG9mIHRvdWNoIGV2ZW50cyBpbiBhIFdlYlZpZXcpICBhbmQgc28gaWYgdGhlIFdlYlZpZXcgZHJvcHMgdGhlIGV2ZW50LAorICAgICAgICAgKiB0aGUgdGVzdCB3aWxsIGZhaWwgYXMgdGhlIHRlc3QgZXhwZWN0cyBvbmUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHRvdWNoIGl0IHN5bnRoZXNpemVzLgorICAgICAgICAgKi8KKyAgICAgICAgd2ViVmlldy5zZXRUb3VjaEludGVydmFsKC0xKTsKKworICAgICAgICB3ZWJWaWV3LmNsZWFyQ2FjaGUodHJ1ZSk7CisKKyAgICAgICAgV2ViU2V0dGluZ3Mgd2ViVmlld1NldHRpbmdzID0gd2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0QXBwQ2FjaGVQYXRoKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEFwcENhY2hlTWF4U2l6ZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2ViVmlld1NldHRpbmdzLnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRTdXBwb3J0TXVsdGlwbGVXaW5kb3dzKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0TGF5b3V0QWxnb3JpdGhtKFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobS5OT1JNQUwpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RGF0YWJhc2VFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RGF0YWJhc2VQYXRoKGdldERpcigiZGF0YWJhc2VzIiwgMCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB3ZWJWaWV3U2V0dGluZ3Muc2V0RG9tU3RvcmFnZUVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRXb3JrZXJzRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHdlYlZpZXdTZXR0aW5ncy5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgLy8gVGhpcyBpcyBhc3luY2hyb25vdXMsIGJ1dCBpdCBnZXRzIHByb2Nlc3NlZCBieSBXZWJDb3JlIGJlZm9yZSBpdCBzdGFydHMgbG9hZGluZyBwYWdlcy4KKyAgICAgICAgbUN1cnJlbnRXZWJWaWV3LnVzZU1vY2tEZXZpY2VPcmllbnRhdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFRlc3RzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZSBzZXJ2aWNlTXNnID0KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4obnVsbCwgTWFuYWdlclNlcnZpY2UuTVNHX0ZJUlNUX1RFU1QpOworCisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKCFtVGVzdHNMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImZpcnN0VGVzdCIsIG1UZXN0c0xpc3QuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0SW50KCJpbmRleCIsIG1DdXJyZW50VGVzdEluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VydmljZU1zZy5zZXREYXRhKGJ1bmRsZSk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5OZXh0VGVzdCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLklETEUgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBpZiAobVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG9uQWxsVGVzdHNGaW5pc2hlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoID0gbVRlc3RzTGlzdC5yZW1vdmUoMCk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInJ1bk5leHRUZXN0KCk6IFN0YXJ0OiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsKKyAgICAgICAgICAgICAgICAiICgiICsgbUN1cnJlbnRUZXN0SW5kZXggKyAiKSIpOworCisgICAgICAgIG1DdXJyZW50VGVzdFVyaSA9IEZpbGVGaWx0ZXIuZ2V0VXJsKG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCkudG9TdHJpbmcoKTsKKworICAgICAgICByZXNldCgpOworCisgICAgICAgIC8qKiBTdGFydCB0aW1lLW91dCBjb3VudGRvd24gYW5kIHRoZSB0ZXN0ICovCisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuUkVOREVSSU5HX1BBR0U7CisgICAgICAgIG1SZXN1bHRIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19URVNUX1RJTUVEX09VVCwgREVGQVVMVF9USU1FX09VVF9NUyk7CisgICAgICAgIG1DdXJyZW50V2ViVmlldy5sb2FkVXJsKG1DdXJyZW50VGVzdFVyaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdFRpbWVkT3V0KCkgeworICAgICAgICBhc3NlcnQgbUN1cnJlbnRTdGF0ZS5pc1J1bm5pbmdTdGF0ZSgpIDogIm1DdXJyZW50U3RhdGUgPSAiICsgbUN1cnJlbnRTdGF0ZS5uYW1lKCk7CisKKyAgICAgICAgTG9nLncoTE9HX1RBRywgIm9uVGVzdFRpbWVkT3V0KCk6ICIgKyBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICBtQ3VycmVudFRlc3RUaW1lZE91dCA9IHRydWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoaWxlIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdGhhdCB0aGUgdGVzdCB0aW1lcyBvdXQgYmVjYXVzZQorICAgICAgICAgKiBvZiB3ZWJ2aWV3IGJlY29taW5nIHVucmVzcG9uc2l2ZSwgaXQgaXMgdmVyeSB1bmxpa2VseS4gVGhlcmVmb3JlIGl0J3MKKyAgICAgICAgICogYXNzdW1lZCB0aGF0IG9idGFpbmluZyByZXN1bHRzICh0aGF0IGNhbGxzIHZhcmlvdXMgd2VidmlldyBtZXRob2RzKQorICAgICAgICAgKiB3aWxsIG5vdCBpdHNlbGYgaGFuZy4KKyAgICAgICAgICovCisgICAgICAgIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvblRlc3RGaW5pc2hlZCgpIHsKKyAgICAgICAgYXNzZXJ0IG1DdXJyZW50U3RhdGUuaXNSdW5uaW5nU3RhdGUoKSA6ICJtQ3VycmVudFN0YXRlID0gIiArIG1DdXJyZW50U3RhdGUubmFtZSgpOworCisgICAgICAgIExvZy5pKExPR19UQUcsICJvblRlc3RGaW5pc2hlZCgpOiAiICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoKTsKKyAgICAgICAgb2J0YWluQWN0dWFsUmVzdWx0c0Zyb21XZWJWaWV3KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHNGcm9tV2ViVmlldygpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHRoZSByZXN1bHQgaGFzIG5vdCBiZWVuIHNldCBieSB0aGUgdGltZSB0aGUgdGVzdCBmaW5pc2hlcyB3ZSBjcmVhdGUKKyAgICAgICAgICogYSBkZWZhdWx0IHR5cGUgb2YgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1DdXJyZW50UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8qKiBUT0RPOiBEZWZhdWx0IHR5cGUgc2hvdWxkIGJlIFJlbmRlclRyZWVSZXN1bHQuIFdlIGRvbid0IHN1cHBvcnQgaXQgbm93LiAqLworICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUOworCisgICAgICAgIG1DdXJyZW50UmVzdWx0Lm9idGFpbkFjdHVhbFJlc3VsdHMobUN1cnJlbnRXZWJWaWV3LAorICAgICAgICAgICAgICAgIG1SZXN1bHRIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0FDVFVBTF9SRVNVTFRfT0JUQUlORUQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKSB7CisgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlID09IEN1cnJlbnRTdGF0ZS5PQlRBSU5JTkdfUkVTVUxUCisgICAgICAgICAgICAgICAgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICBMb2cuaShMT0dfVEFHLCAib25BY3R1YWxSZXN1bHRzT2J0YWluZWQoKTogIiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBDdXJyZW50U3RhdGUuSURMRTsKKworICAgICAgICBtUmVzdWx0SGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVEVTVF9USU1FRF9PVVQpOworICAgICAgICByZXBvcnRSZXN1bHRUb1NlcnZpY2UoKTsKKyAgICAgICAgbUN1cnJlbnRUZXN0SW5kZXgrKzsKKyAgICAgICAgdXBkYXRlUHJvZ3Jlc3NCYXIoKTsKKyAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0UmVzdWx0VG9TZXJ2aWNlKCkgeworICAgICAgICBpZiAobUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ3VycmVudFJlc3VsdC5zZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lc3NhZ2Ugc2VydmljZU1zZyA9CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG51bGwsIE1hbmFnZXJTZXJ2aWNlLk1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTKTsKKworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG1DdXJyZW50UmVzdWx0LmdldEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dEludCgidGVzdEluZGV4IiwgbUN1cnJlbnRUZXN0SW5kZXgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VGVzdFRpbWVkT3V0KSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVzdWx0Q29kZSIsIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9USU1FRF9PVVQubmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVRlc3RzTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKCJuZXh0VGVzdCIsIG1UZXN0c0xpc3QuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VydmljZU1zZy5zZXREYXRhKGJ1bmRsZSk7CisgICAgICAgICAgICBtTWFuYWdlclNlcnZpY2VNZXNzZW5nZXIuc2VuZChzZXJ2aWNlTXNnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGg9IiArIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvZ3Jlc3NCYXIoKSB7CisgICAgICAgIGdldFdpbmRvdygpLnNldEZlYXR1cmVJbnQoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgbUN1cnJlbnRUZXN0SW5kZXggKiBXaW5kb3cuUFJPR1JFU1NfRU5EIC8gbVRvdGFsVGVzdENvdW50KTsKKyAgICAgICAgc2V0VGl0bGUobUN1cnJlbnRUZXN0SW5kZXggKiAxMDAgLyBtVG90YWxUZXN0Q291bnQgKyAiJSAiICsKKyAgICAgICAgICAgICAgICAiKCIgKyBtQ3VycmVudFRlc3RJbmRleCArICIvIiArIG1Ub3RhbFRlc3RDb3VudCArICIpIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQWxsVGVzdHNGaW5pc2hlZCgpIHsKKyAgICAgICAgbVNjcmVlbkRpbUxvY2sucmVsZWFzZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlIHNlcnZpY2VNc2cgPQorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlLm9idGFpbihudWxsLCBNYW5hZ2VyU2VydmljZS5NU0dfQUxMX1RFU1RTX0ZJTklTSEVEKTsKKyAgICAgICAgICAgIG1NYW5hZ2VyU2VydmljZU1lc3Nlbmdlci5zZW5kKHNlcnZpY2VNc2cpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aD0iICsgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFkZGl0aW9uYWxUZXh0T3V0cHV0IGdldEN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCgpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50QWRkaXRpb25hbFRleHRPdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRBZGRpdGlvbmFsVGV4dE91dHB1dCA9IG5ldyBBZGRpdGlvbmFsVGV4dE91dHB1dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3VycmVudEFkZGl0aW9uYWxUZXh0T3V0cHV0OworICAgIH0KKworICAgIC8qKiBMQVlPVVQgVEVTVCBDT05UUk9MTEVSICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dBSVRfVU5USUxfRE9ORSA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19OT1RJRllfRE9ORSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19EVU1QX0FTX1RFWFQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRFVNUF9DSElMRF9GUkFNRVNfQVNfVEVYVCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUyA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfR0VPTE9DQVRJT05fUEVSTUlTU0lPTiA9IDY7CisKKyAgICBIYW5kbGVyIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIGFzc2VydCBtQ3VycmVudFN0YXRlLmlzUnVubmluZ1N0YXRlKCkgOiAibUN1cnJlbnRTdGF0ZSA9ICIgKyBtQ3VycmVudFN0YXRlLm5hbWUoKTsKKworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1dBSVRfVU5USUxfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IEN1cnJlbnRTdGF0ZS5XQUlUSU5HX0ZPUl9BU1lOQ0hST05PVVNfVEVTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19OT1RJRllfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gQ3VycmVudFN0YXRlLldBSVRJTkdfRk9SX0FTWU5DSFJPTk9VU19URVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvblRlc3RGaW5pc2hlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRFVNUF9BU19URVhUOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRSZXN1bHQgPSBuZXcgVGV4dFJlc3VsdChtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YgVGV4dFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm1DdXJyZW50UmVzdWx0IGluc3RhbmNlb2YiICsgbUN1cnJlbnRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19EVU1QX0NISUxEX0ZSQU1FU19BU19URVhUOgorICAgICAgICAgICAgICAgICAgICAvKiogSWYgZHVtcEFzVGV4dCB3YXMgbm90IGNhbGxlZCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0ZXh0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFJlc3VsdCA9IG5ldyBUZXh0UmVzdWx0KG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbUN1cnJlbnRSZXN1bHQgaW5zdGFuY2VvZiBUZXh0UmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibUN1cnJlbnRSZXN1bHQgaW5zdGFuY2VvZiIgKyBtQ3VycmVudFJlc3VsdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgICAgICAoKFRleHRSZXN1bHQpbUN1cnJlbnRSZXN1bHQpLnNldER1bXBDaGlsZEZyYW1lc0FzVGV4dCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfQ0FOX09QRU5fV0lORE9XUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbk9wZW5XaW5kb3dzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19EVU1QX0RBVEFCQVNFX0NBTExCQUNLUzoKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBEYXRhYmFzZUNhbGxiYWNrcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0VUX0dFT0xPQ0FUSU9OX1BFUk1JU1NJT046CisgICAgICAgICAgICAgICAgICAgIG1Jc0dlb2xvY2F0aW9uUGVybWlzc2lvblNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1HZW9sb2NhdGlvblBlcm1pc3Npb24gPSBtc2cuYXJnMSA9PSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxHZW9sb2NhdGlvblBlcm1pc3Npb25zLkNhbGxiYWNrPiBpdGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbnMuQ2FsbGJhY2sgY2FsbGJhY2sgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luID0gbVBlbmRpbmdHZW9sb2NhdGlvblBlcm1pc3Npb25DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5pbnZva2Uob3JpZ2luLCBtR2VvbG9jYXRpb25QZXJtaXNzaW9uLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0dlb2xvY2F0aW9uUGVybWlzc2lvbkNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAibXNnLndoYXQ9IiArIG1zZy53aGF0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRMYXlvdXRUZXN0Q29udHJvbGxlcigpIHsKKyAgICAgICAgbUNhbk9wZW5XaW5kb3dzID0gZmFsc2U7CisgICAgICAgIG1EdW1wRGF0YWJhc2VDYWxsYmFja3MgPSBmYWxzZTsKKyAgICAgICAgbUlzR2VvbG9jYXRpb25QZXJtaXNzaW9uU2V0ID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxEb25lKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiB3YWl0VW50aWxEb25lKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfV0FJVF9VTlRJTF9ET05FKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlEb25lKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBub3RpZnlEb25lKCkgY2FsbGVkIik7CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfTk9USUZZX0RPTkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXBBc1RleHQoYm9vbGVhbiBlbmFibGVQaXhlbFRlc3QpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgbUN1cnJlbnRUZXN0UmVsYXRpdmVQYXRoICsgIjogZHVtcEFzVGV4dCgiICsgZW5hYmxlUGl4ZWxUZXN0ICsgIikgY2FsbGVkIik7CisgICAgICAgIC8qKiBUT0RPOiBJbXBsZW1lbnQgKi8KKyAgICAgICAgaWYgKGVuYWJsZVBpeGVsVGVzdCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuYWJsZVBpeGVsVGVzdCBub3QgaW1wbGVtZW50ZWQsIHN3aXRjaGluZyB0byBmYWxzZSIpOworICAgICAgICB9CisgICAgICAgIG1MYXlvdXRUZXN0Q29udHJvbGxlckhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfRFVNUF9BU19URVhUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IGR1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RVTVBfQ0hJTERfRlJBTUVTX0FTX1RFWFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhbk9wZW5XaW5kb3dzKCkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBzZXRDYW5PcGVuV2luZG93cygpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX1NFVF9DQU5fT1BFTl9XSU5ET1dTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoKSB7CisgICAgICAgIExvZy5pKExPR19UQUcsIG1DdXJyZW50VGVzdFJlbGF0aXZlUGF0aCArICI6IGR1bXBEYXRhYmFzZUNhbGxiYWNrcygpIGNhbGxlZCIpOworICAgICAgICBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RVTVBfREFUQUJBU0VfQ0FMTEJBQ0tTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oYm9vbGVhbiBhbGxvdykgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBzZXRHZW9sb2NhdGlvblBlcm1pc3Npb24oIiArIGFsbG93ICsKKyAgICAgICAgICAgICAgICAiKSBjYWxsZWQiKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtTGF5b3V0VGVzdENvbnRyb2xsZXJIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1NFVF9HRU9MT0NBVElPTl9QRVJNSVNTSU9OKTsKKyAgICAgICAgbXNnLmFyZzEgPSBhbGxvdyA/IDEgOiAwOworICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGJvb2xlYW4gY2FuUHJvdmlkZUFscGhhLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICBib29sZWFuIGNhblByb3ZpZGVCZXRhLCBkb3VibGUgYmV0YSwgYm9vbGVhbiBjYW5Qcm92aWRlR2FtbWEsIGRvdWJsZSBnYW1tYSkgeworICAgICAgICBMb2cuaShMT0dfVEFHLCBtQ3VycmVudFRlc3RSZWxhdGl2ZVBhdGggKyAiOiBzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oIiArIGNhblByb3ZpZGVBbHBoYSArCisgICAgICAgICAgICAgICAgIiwgIiArIGFscGhhICsgIiwgIiArIGNhblByb3ZpZGVCZXRhICsgIiwgIiArIGJldGEgKyAiLCAiICsgY2FuUHJvdmlkZUdhbW1hICsKKyAgICAgICAgICAgICAgICAiLCAiICsgZ2FtbWEgKyAiKSIpOworICAgICAgICBtQ3VycmVudFdlYlZpZXcuc2V0TW9ja0RldmljZU9yaWVudGF0aW9uKGNhblByb3ZpZGVBbHBoYSwgYWxwaGEsIGNhblByb3ZpZGVCZXRhLCBiZXRhLAorICAgICAgICAgICAgICAgIGNhblByb3ZpZGVHYW1tYSwgZ2FtbWEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL01hbmFnZXJTZXJ2aWNlLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGE2NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9NYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBzZXJ2aWNlIHRoYXQgaGFuZGxlcyBtYW5hZ2luZyB0aGUgcmVzdWx0cyBvZiB0ZXN0cywgaW5mb3JtaW5nIG9mIGNyYXNoZXMsIGdlbmVyYXRpbmcKKyAqIHN1bW1hcmllcywgZXRjLgorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIk1hbmFnZXJTZXJ2aWNlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ1JBU0hfVElNRU9VVF9FWFBJUkVEID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUkFTSF9USU1FT1VUX01TID0gMjAgKiAxMDAwOworCisgICAgLyoqIFRPRE86IG1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBtYWtlIGl0IGEgc2V0dGluZyAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUU19ST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzLXJlc3VsdHMiOworCisgICAgLyoqIFRPRE86IE1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMpOworICAgIHsKKyAgICAgICAgRVhQRUNURURfUkVTVUxUX0xPQ0FUSU9OX1JFTEFUSVZFX0RJUl9QUkVGSVhFUy5hZGQoInBsYXRmb3JtIiArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAiYW5kcm9pZC12OCIgKyBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVMuYWRkKCJwbGF0Zm9ybSIgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgImFuZHJvaWQiICsgRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLmFkZCgiIik7CisgICAgfQorCisgICAgLyoqIFRPRE86IE1ha2UgdGhlc2Ugc2V0dGluZ3MgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVNVTFRfRVhURU5TSU9OID0gInR4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX1JFU1VMVF9FWFRFTlNJT04gPSAicG5nIjsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST0NFU1NfQUNUVUFMX1JFU1VMVFMgPSAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FMTF9URVNUU19GSU5JU0hFRCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfRklSU1RfVEVTVCA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfQ1VSUkVOVF9URVNUX0NSQVNIRUQgPSAzOworCisgICAgLyoqCisgICAgICogVGhpcyBoYW5kbGVyIGlzIHB1cmVseSBmb3IgSVBDLiBJdCBpcyB1c2VkIHRvIGNyZWF0ZSBtTWVzc2VuZ2VyCisgICAgICogdGhhdCBnZW5lcmF0ZXMgYSBiaW5kZXIgcmV0dXJuZWQgaW4gb25CaW5kIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhbmRsZXIgbUluY29taW5nSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0ZJUlNUX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgIG1TdW1tYXJpemVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBtc2cuZ2V0RGF0YSgpOworICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXh0VGVzdFNldHVwKGJ1bmRsZS5nZXRTdHJpbmcoImZpcnN0VGVzdCIpLCBidW5kbGUuZ2V0SW50KCJpbmRleCIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9DRVNTX0FDVFVBTF9SRVNVTFRTOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCJtSW5jb21pbmdIYW5kbGVyOiAiICsgbXNnLmdldERhdGEoKS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpKTsKKyAgICAgICAgICAgICAgICAgICAgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQobXNnLmdldERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNU0dfQ1VSUkVOVF9URVNUX0NSQVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIG1DcmFzaE1lc3NhZ2VzSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQ1JBU0hfVElNRU9VVF9FWFBJUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgb25UZXN0Q3Jhc2hlZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0FMTF9URVNUU19GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc2V0VGVzdHNSZWxhdGl2ZVBhdGgobUFsbFRlc3RzUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1bW1hcml6ZXIuc3VtbWFyaXplKCk7CisgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1hbmFnZXJTZXJ2aWNlLnRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1NIVVRET1dOKTsKKyAgICAgICAgICAgICAgICAgICAgLyoqIFRoaXMgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBzZW5kIHRoZSBpbnRlbnQgZnJvbSB0aGUgc2VydmljZSAqLworICAgICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgTWVzc2VuZ2VyIG1NZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1JbmNvbWluZ0hhbmRsZXIpOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1DcmFzaE1lc3NhZ2VzSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19DUkFTSF9USU1FT1VUX0VYUElSRUQpIHsKKyAgICAgICAgICAgICAgICBvblRlc3RDcmFzaGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworICAgIHByaXZhdGUgU3VtbWFyaXplciBtU3VtbWFyaXplcjsKKworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50bHlSdW5uaW5nVGVzdDsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudGx5UnVubmluZ1Rlc3RJbmRleDsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGdldEV4cGVjdGVkUmVzdWx0UGF0aCgpIHVzZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIKKyAgICAgKiBvZiByZXF1ZXN0cyByZXF1aXJlZCB0byB0aGUgaG9zdCBzZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhSZXF1ZXN0ZWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhGZXRjaGVkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUFsbFRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKCk7CisKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcihURVNUU19ST09UX0RJUl9QQVRIKTsKKyAgICAgICAgbVN1bW1hcml6ZXIgPSBuZXcgU3VtbWFyaXplcihtRmlsZUZpbHRlciwgUkVTVUxUU19ST09UX0RJUl9QQVRIKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKKyAgICAgICAgbUFsbFRlc3RzUmVsYXRpdmVQYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKCJwYXRoIik7CisgICAgICAgIGFzc2VydCBtQWxsVGVzdHNSZWxhdGl2ZVBhdGggIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIFNUQVJUX1NUSUNLWTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgeworICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25BY3R1YWxSZXN1bHRzT2J0YWluZWQoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBtQ3Jhc2hNZXNzYWdlc0hhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NSQVNIX1RJTUVPVVRfRVhQSVJFRCk7CisgICAgICAgIGVuc3VyZU5leHRUZXN0U2V0dXAoYnVuZGxlLmdldFN0cmluZygibmV4dFRlc3QiKSwgYnVuZGxlLmdldEludCgidGVzdEluZGV4IikgKyAxKTsKKworICAgICAgICBBYnN0cmFjdFJlc3VsdCByZXN1bHRzID0KKyAgICAgICAgICAgICAgICBBYnN0cmFjdFJlc3VsdC5UZXN0VHlwZS52YWx1ZU9mKGJ1bmRsZS5nZXRTdHJpbmcoInR5cGUiKSkuY3JlYXRlUmVzdWx0KGJ1bmRsZSk7CisKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgIm9uQWN0dWFsUmVzdWx0T2J0YWluZWQ6ICIgKyByZXN1bHRzLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0cyhyZXN1bHRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlTmV4dFRlc3RTZXR1cChTdHJpbmcgbmV4dFRlc3QsIGludCBpbmRleCkgeworICAgICAgICBpZiAobmV4dFRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVuc3VyZU5leHRUZXN0U2V0dXAoKTogbmV4dFRlc3Q9bnVsbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUN1cnJlbnRseVJ1bm5pbmdUZXN0ID0gbmV4dFRlc3Q7CisgICAgICAgIG1DdXJyZW50bHlSdW5uaW5nVGVzdEluZGV4ID0gaW5kZXg7CisgICAgICAgIG1DcmFzaE1lc3NhZ2VzSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChNU0dfQ1JBU0hfVElNRU9VVF9FWFBJUkVELCBDUkFTSF9USU1FT1VUX01TKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNlbmRzIGFuIGludGVudCB0byBUZXN0c0xpc3RBY3Rpdml0eSB0byByZXN0YXJ0IExheW91dFRlc3RzRXhlY3V0b3IuCisgICAgICogVGhlIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGZsb3cgaXMgaW4gdGhlIGNvbW1lbnQgb2Ygb25OZXdJbnRlbnQKKyAgICAgKiBtZXRob2QgaW4gVGVzdHNMaXN0QWN0aXZpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uVGVzdENyYXNoZWQoKSB7CisgICAgICAgIGhhbmRsZVJlc3VsdHMobmV3IENyYXNoZWREdW1teVJlc3VsdChtQ3VycmVudGx5UnVubmluZ1Rlc3QpKTsKKworICAgICAgICBMb2cudyhMT0dfVEFHLCAib25UZXN0Q3Jhc2hlZCgpOiAiICsgbUN1cnJlbnRseVJ1bm5pbmdUZXN0ICsKKyAgICAgICAgICAgICAgICAiICgiICsgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXggKyAiKSIpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHRoaXMsIFRlc3RzTGlzdEFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JFQk9PVCk7CisgICAgICAgIC8qKiBUaGlzIGZsYWcgaXMgbmVlZGVkIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgaW50ZW50IGZyb20gdGhlIHNlcnZpY2UgKi8KKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJjcmFzaGVkVGVzdEluZGV4IiwgbUN1cnJlbnRseVJ1bm5pbmdUZXN0SW5kZXgpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlc3VsdHMoQWJzdHJhY3RSZXN1bHQgcmVzdWx0cykgeworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzdWx0cy5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZFRleHRSZXN1bHQoZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0KHJlbGF0aXZlUGF0aCkpOworICAgICAgICByZXN1bHRzLnNldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoZ2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgcmVzdWx0cy5zZXRFeHBlY3RlZEltYWdlUmVzdWx0KGdldEV4cGVjdGVkSW1hZ2VSZXN1bHQocmVsYXRpdmVQYXRoKSk7CisgICAgICAgIHJlc3VsdHMuc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgoZ2V0RXhwZWN0ZWRJbWFnZVJlc3VsdFBhdGgocmVsYXRpdmVQYXRoKSk7CisKKyAgICAgICAgZHVtcEFjdHVhbFRleHRSZXN1bHQocmVzdWx0cyk7CisgICAgICAgIGR1bXBBY3R1YWxJbWFnZVJlc3VsdChyZXN1bHRzKTsKKworICAgICAgICBtU3VtbWFyaXplci5hcHBlbmRUZXN0KHJlc3VsdHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wQWN0dWFsVGV4dFJlc3VsdChBYnN0cmFjdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RQYXRoID0gcmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICBTdHJpbmcgYWN0dWFsVGV4dFJlc3VsdCA9IHJlc3VsdC5nZXRBY3R1YWxUZXh0UmVzdWx0KCk7CisgICAgICAgIGlmIChhY3R1YWxUZXh0UmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHRQYXRoID0gRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHRlc3RQYXRoLCAiLWFjdHVhbC4iICsgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICAgICAgRnNVdGlscy53cml0ZURhdGFUb1N0b3JhZ2UobmV3IEZpbGUoUkVTVUxUU19ST09UX0RJUl9QQVRILCByZXN1bHRQYXRoKSwKKyAgICAgICAgICAgICAgICBhY3R1YWxUZXh0UmVzdWx0LmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcEFjdHVhbEltYWdlUmVzdWx0KEFic3RyYWN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICBTdHJpbmcgdGVzdFBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgIGJ5dGVbXSBhY3R1YWxJbWFnZVJlc3VsdCA9IHJlc3VsdC5nZXRBY3R1YWxJbWFnZVJlc3VsdCgpOworICAgICAgICBpZiAoYWN0dWFsSW1hZ2VSZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdFBhdGggPSBGaWxlRmlsdGVyLnNldFBhdGhFbmRpbmcodGVzdFBhdGgsCisgICAgICAgICAgICAgICAgIi1hY3R1YWwuIiArIElNQUdFX1JFU1VMVF9FWFRFTlNJT04pOworICAgICAgICBGc1V0aWxzLndyaXRlRGF0YVRvU3RvcmFnZShuZXcgRmlsZShSRVNVTFRTX1JPT1RfRElSX1BBVEgsIHJlc3VsdFBhdGgpLAorICAgICAgICAgICAgICAgIGFjdHVhbEltYWdlUmVzdWx0LCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBieXRlW10gcmVzdWx0ID0gZ2V0RXhwZWN0ZWRSZXN1bHQocmVsYXRpdmVQYXRoLCBURVhUX1JFU1VMVF9FWFRFTlNJT04pOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRFeHBlY3RlZEltYWdlUmVzdWx0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdldEV4cGVjdGVkUmVzdWx0KHJlbGF0aXZlUGF0aCwgSU1BR0VfUkVTVUxUX0VYVEVOU0lPTik7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZ2V0RXhwZWN0ZWRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxSZWxhdGl2ZVBhdGggPQorICAgICAgICAgICAgICAgIEZpbGVGaWx0ZXIuc2V0UGF0aEVuZGluZyhyZWxhdGl2ZVBhdGgsICItZXhwZWN0ZWQuIiArIGV4dGVuc2lvbik7CisgICAgICAgIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoUmVxdWVzdGVkID0gb3JpZ2luYWxSZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxvY2F0aW9ucyA9IEVYUEVDVEVEX1JFU1VMVF9MT0NBVElPTl9SRUxBVElWRV9ESVJfUFJFRklYRVM7CisKKyAgICAgICAgaW50IHNpemUgPSBFWFBFQ1RFRF9SRVNVTFRfTE9DQVRJT05fUkVMQVRJVkVfRElSX1BSRUZJWEVTLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGJ5dGVzID09IG51bGwgJiYgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gbG9jYXRpb25zLmdldChpKSArIG9yaWdpbmFsUmVsYXRpdmVQYXRoOworICAgICAgICAgICAgYnl0ZXMgPSBGc1V0aWxzLnJlYWREYXRhRnJvbVVybChGaWxlRmlsdGVyLmdldFVybChyZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0RXhwZWN0ZWRSZXN1bHRQYXRoRmV0Y2hlZCA9IHJlbGF0aXZlUGF0aDsKKyAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEV4cGVjdGVkVGV4dFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICByZXR1cm4gZ2V0RXhwZWN0ZWRSZXN1bHRQYXRoKHJlbGF0aXZlUGF0aCwgVEVYVF9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHBlY3RlZFJlc3VsdFBhdGgocmVsYXRpdmVQYXRoLCBJTUFHRV9SRVNVTFRfRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBlY3RlZFJlc3VsdFBhdGgoU3RyaW5nIHJlbGF0aXZlUGF0aCwgU3RyaW5nIGV4dGVuc2lvbikgeworICAgICAgICBTdHJpbmcgb3JpZ2luYWxSZWxhdGl2ZVBhdGggPQorICAgICAgICAgICAgRmlsZUZpbHRlci5zZXRQYXRoRW5kaW5nKHJlbGF0aXZlUGF0aCwgIi1leHBlY3RlZC4iICsgZXh0ZW5zaW9uKTsKKyAgICAgICAgaWYgKCFvcmlnaW5hbFJlbGF0aXZlUGF0aC5lcXVhbHMobUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhSZXF1ZXN0ZWQpKSB7CisgICAgICAgICAgICBnZXRFeHBlY3RlZFJlc3VsdChyZWxhdGl2ZVBhdGgsIGV4dGVuc2lvbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbUxhc3RFeHBlY3RlZFJlc3VsdFBhdGhGZXRjaGVkOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9TdW1tYXJpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmYjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1N1bW1hcml6ZXIuamF2YQpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyLkZvcndhcmRlck1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRlc3RzIHRoYXQgcmFuIGFuZCBjYW4gY3JlYXRlIEhUTUwKKyAqIGZpbGVzIHdpdGggc3VtbWFyaWVzIGFuZCBlYXN5IG5hdmlnYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTdW1tYXJpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlN1bW1hcml6ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTUyA9CisgICAgICAgICAgICAiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiIgKworICAgICAgICAgICAgIiogeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LWZhbWlseTogVmVyZGFuYTsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyOiAwOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDA7fSIgKworICAgICAgICAgICAgImJvZHkgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDEwcHg7fSIgKworICAgICAgICAgICAgImgxIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAyNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDRweCAwIDRweCAwO30iICsKKyAgICAgICAgICAgICJoMiB7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZToxOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW46IDIwcHggMCAzcHggMDt9IiArCisgICAgICAgICAgICAiaDMsIGgzIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDE0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazsiICsKKyAgICAgICAgICAgICIgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOiA0cHg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1ib3R0b206IDJweDt9IiArCisgICAgICAgICAgICAiaDMgYSBzcGFuLnBhdGggeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi50cmkgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGZsb2F0OiBsZWZ0OyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogMjBweDt9IiArCisgICAgICAgICAgICAiaDMgc3Bhbi5zcXIgeyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjOGVlMTAwOyIgKworICAgICAgICAgICAgIiAgICAgICBmbG9hdDogbGVmdDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDIwcHg7fSIgKworICAgICAgICAgICAgInNwYW4uc291cmNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZGlzcGxheTogYmxvY2s7IiArCisgICAgICAgICAgICAiICAgICAgIGZvbnQtc2l6ZTogMTBweDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICM4ODg7IiArCisgICAgICAgICAgICAiICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAxcHg7fSIgKworICAgICAgICAgICAgInNwYW4uc291cmNlIGEgeyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXNpemU6IDEwcHg7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjODg4O30iICsKKyAgICAgICAgICAgICJoMyBpbWcgeyIgKworICAgICAgICAgICAgIiAgICAgICB3aWR0aDogOHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDt9IiArCisgICAgICAgICAgICAiZGl2LmRpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4O30iICsKKyAgICAgICAgICAgICJkaXYuZGlmZiBhIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMnB4OyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogIzg4ODt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IiArCisgICAgICAgICAgICAiICAgICAgIHdpZHRoOiAxMDAlOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLmhlYWRlcnMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci10b3A6IDA7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmctYm90dG9tOiAzcHg7fSIgKworICAgICAgICAgICAgInRhYmxlLnZpc3VhbF9kaWZmIHRyLnJlc3VsdHMgdGQgeyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxNXB4OyIgKworICAgICAgICAgICAgIiAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5yZXN1bHRzIHRkLmxpbmVfY291bnQgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNhYWE7IiArCisgICAgICAgICAgICAiICAgICAgIG1pbi13aWR0aDoyMHB4OyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LWFsaWduOiByaWdodDsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQ7IiArCisgICAgICAgICAgICAiICAgICAgIHBhZGRpbmc6IDJweCAxcHggMnB4IDBweDt9IiArCisgICAgICAgICAgICAidGFibGUudmlzdWFsX2RpZmYgdHIucmVzdWx0cyB0ZC5saW5lIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogMnB4IDBweCAycHggNHB4OyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDQ5LjglO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ci5mb290ZXJzIHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkOyIgKworICAgICAgICAgICAgIiAgICAgICBib3JkZXItYm90dG9tOiAwO30iICsKKyAgICAgICAgICAgICJ0YWJsZS52aXN1YWxfZGlmZiB0ciB0ZC5zcGFjZSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMDsiICsKKyAgICAgICAgICAgICIgICAgICAgd2lkdGg6IDAuNCV9IiArCisgICAgICAgICAgICAiZGl2LnNwYWNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgbWFyZ2luLXRvcDo0cHg7fSIgKworICAgICAgICAgICAgInNwYW4uZXFsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzt9IiArCisgICAgICAgICAgICAic3Bhbi5kZWwgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY4ODg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5pbnMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODhmZjg4OyB9IiArCisgICAgICAgICAgICAic3Bhbi5mYWlsIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IHJlZDt9IiArCisgICAgICAgICAgICAic3Bhbi5wYXNzIHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGdyZWVuO30iICsKKyAgICAgICAgICAgICJzcGFuLnRpbWVfb3V0IHsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IG9yYW5nZTt9IiArCisgICAgICAgICAgICAidGFibGUuc3VtbWFyeSB7IiArCisgICAgICAgICAgICAiICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyIgKworICAgICAgICAgICAgIiAgICAgICBtYXJnaW4tdG9wOiAyMHB4O30iICsKKyAgICAgICAgICAgICJ0YWJsZS5zdW1tYXJ5IHRkIHsiICsKKyAgICAgICAgICAgICIgICAgICAgcGFkZGluZzogM3B4O30iICsKKyAgICAgICAgICAgICJzcGFuLmxpc3RJdGVtIHsiICsKKyAgICAgICAgICAgICIgICAgICAgZm9udC1zaXplOiAxMXB4OyIgKworICAgICAgICAgICAgIiAgICAgICBmb250LXdlaWdodDogbm9ybWFsOyIgKworICAgICAgICAgICAgIiAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyIgKworICAgICAgICAgICAgIiAgICAgICBwYWRkaW5nOiAzcHg7IiArCisgICAgICAgICAgICAiICAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1MubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzhlZTEwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfUkVTVUxUX0RJRkZFUlMubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6IGJsYWNrO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfTk9fRVhQRUNURURfUkVTVUxULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhNzAwZTQ7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiAjZmZmO30iICsKKyAgICAgICAgICAgICJzcGFuLiIgKyBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLkZBSUxfVElNRURfT1VULm5hbWUoKSArICJ7IiArCisgICAgICAgICAgICAiICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2NiMDA7IiArCisgICAgICAgICAgICAiICAgICAgIGNvbG9yOiBibGFjazt9IiArCisgICAgICAgICAgICAic3Bhbi4iICsgQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQubmFtZSgpICsgInsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2MzMDAwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgInNwYW4ubm9MdGMgeyIgKworICAgICAgICAgICAgIiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTQ0MDAwOyIgKworICAgICAgICAgICAgIiAgICAgICBjb2xvcjogI2ZmZjt9IiArCisgICAgICAgICAgICAic3Bhbi5ub0V2ZW50U2VuZGVyIHsiICsKKyAgICAgICAgICAgICIgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzgxNTYwMDsiICsKKyAgICAgICAgICAgICIgICAgICAgY29sb3I6ICNmZmY7fSIgKworICAgICAgICAgICAgIjwvc3R5bGU+IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPQorICAgICAgICAgICAgIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPiIgKworICAgICAgICAgICAgIiAgICBmdW5jdGlvbiB0b2dnbGVEaXNwbGF5KGlkKSB7IiArCisgICAgICAgICAgICAiICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyIgKworICAgICAgICAgICAgIiAgICAgICAgdHJpYW5nbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJpLicgKyBpZCk7IiArCisgICAgICAgICAgICAiICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09ICdub25lJykgeyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOyIgKworICAgICAgICAgICAgIiAgICAgICAgICAgIHRyaWFuZ2xlLmlubmVySFRNTCA9ICcmI3gyNWJjOyAnOyIgKworICAgICAgICAgICAgIiAgICAgICAgfSBlbHNlIHsiICsKKyAgICAgICAgICAgICIgICAgICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IiArCisgICAgICAgICAgICAiICAgICAgICAgICAgdHJpYW5nbGUuaW5uZXJIVE1MID0gJyYjeDI1YjY7ICc7IiArCisgICAgICAgICAgICAiICAgICAgICB9IiArCisgICAgICAgICAgICAiICAgIH0iICsKKyAgICAgICAgICAgICI8L3NjcmlwdD4iOworCisgICAgLyoqIFRPRE86IE1ha2UgaXQgYSBzZXR0aW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIID0gImRldGFpbHMuaHRtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEggPSAic3VtbWFyeS50eHQiOworCisgICAgcHJpdmF0ZSBpbnQgbUNyYXNoZWRUZXN0c0NvdW50ID0gMDsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1VbmV4cGVjdGVkRmFpbHVyZXMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUV4cGVjdGVkRmFpbHVyZXMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0UmVzdWx0PigpOworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdFJlc3VsdD4gbUV4cGVjdGVkUGFzc2VzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QWJzdHJhY3RSZXN1bHQ+IG1VbmV4cGVjdGVkUGFzc2VzID0gbmV3IEFycmF5TGlzdDxBYnN0cmFjdFJlc3VsdD4oKTsKKworICAgIHByaXZhdGUgRmlsZUZpbHRlciBtRmlsZUZpbHRlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtUmVzdWx0c1Jvb3REaXJQYXRoOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgcHJpdmF0ZSBEYXRlIG1EYXRlOworCisgICAgcHVibGljIFN1bW1hcml6ZXIoRmlsZUZpbHRlciBmaWxlRmlsdGVyLCBTdHJpbmcgcmVzdWx0c1Jvb3REaXJQYXRoKSB7CisgICAgICAgIG1GaWxlRmlsdGVyID0gZmlsZUZpbHRlcjsKKyAgICAgICAgbVJlc3VsdHNSb290RGlyUGF0aCA9IHJlc3VsdHNSb290RGlyUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFVSSSBnZXREZXRhaWxzVXJpKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoTWFuYWdlclNlcnZpY2UuUkVTVUxUU19ST09UX0RJUl9QQVRIICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIKS50b1VSSSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGVuZFRlc3QoQWJzdHJhY3RSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHRDb2RlKCkgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX0NSQVNIRUQpIHsKKyAgICAgICAgICAgIG1DcmFzaGVkVGVzdHNDb3VudCsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXN1bHRDb2RlKCkgPT0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5QQVNTKSB7CisgICAgICAgICAgICBpZiAobUZpbGVGaWx0ZXIuaXNGYWlsKHJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBtVW5leHBlY3RlZFBhc3Nlcy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUV4cGVjdGVkUGFzc2VzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1GaWxlRmlsdGVyLmlzRmFpbChyZWxhdGl2ZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1VbmV4cGVjdGVkRmFpbHVyZXMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXN0c1JlbGF0aXZlUGF0aChTdHJpbmcgdGVzdHNSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgbVRlc3RzUmVsYXRpdmVQYXRoID0gdGVzdHNSZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VtbWFyaXplKCkgeworICAgICAgICBjcmVhdGVIdG1sRGV0YWlscygpOworICAgICAgICBjcmVhdGVUeHRTdW1tYXJ5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1DcmFzaGVkVGVzdHNDb3VudCA9IDA7CisgICAgICAgIG1VbmV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgbUV4cGVjdGVkUGFzc2VzLmNsZWFyKCk7CisgICAgICAgIG1EYXRlID0gbmV3IERhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVHh0U3VtbWFyeSgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0eHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIHR4dC5hcHBlbmQobVRlc3RzUmVsYXRpdmVQYXRoICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIkRhdGU6ICIgKyBkYXRlRm9ybWF0LmZvcm1hdChtRGF0ZSkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiQnVpbGQgZmluZ2VycHJpbnQ6ICIgKyBCdWlsZC5GSU5HRVJQUklOVCArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJXZWJLaXQgdmVyc2lvbjogIiArIGdldFdlYktpdFZlcnNpb25Gcm9tVXNlckFnZW50U3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiV2ViS2l0IHJldmlzaW9uOiAiICsgZ2V0V2ViS2l0UmV2aXNpb24oKSArICJcbiIpOworCisgICAgICAgIHR4dC5hcHBlbmQoIlRPVEFMOiAgICIgKyBnZXRUb3RhbFRlc3RDb3VudCgpICsgIlxuIik7CisgICAgICAgIGlmIChtQ3Jhc2hlZFRlc3RzQ291bnQgPiAwKSB7CisgICAgICAgICAgICB0eHQuYXBwZW5kKCJDUkFTSEVEICh0b3RhbCBhbW9uZyBhbGwgdGVzdHMpOiAiICsgbUNyYXNoZWRUZXN0c0NvdW50ICsgIlxuIik7CisgICAgICAgICAgICB0eHQuYXBwZW5kKCItLS0tLS0tLS0tLS0tIik7CisgICAgICAgIH0KKyAgICAgICAgdHh0LmFwcGVuZCgiVU5FWFBFQ1RFRCBGQUlMVVJFUzogIiArIG1VbmV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpICsgIlxuIik7CisgICAgICAgIHR4dC5hcHBlbmQoIlVORVhQRUNURUQgUEFTU0VTOiAgICIgKyBtVW5leHBlY3RlZFBhc3Nlcy5zaXplKCkgKyAiXG4iKTsKKyAgICAgICAgdHh0LmFwcGVuZCgiRVhQRUNURUQgRkFJTFVSRVM6ICAgIiArIG1FeHBlY3RlZEZhaWx1cmVzLnNpemUoKSArICJcbiIpOworICAgICAgICB0eHQuYXBwZW5kKCJFWFBFQ1RFRCBQQVNTRVM6ICAgICAiICsgbUV4cGVjdGVkUGFzc2VzLnNpemUoKSArICJcbiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIFRYVF9TVU1NQVJZX1JFTEFUSVZFX1BBVEgpLAorICAgICAgICAgICAgICAgIHR4dC50b1N0cmluZygpLmdldEJ5dGVzKCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlSHRtbERldGFpbHMoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxodG1sPjxoZWFkPiIpOworICAgICAgICBodG1sLmFwcGVuZChDU1MpOworICAgICAgICBodG1sLmFwcGVuZChTQ1JJUFQpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworCisgICAgICAgIGNyZWF0ZVRvcFN1bW1hcnlUYWJsZShodG1sKTsKKworICAgICAgICBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKGh0bWwsICJVbmV4cGVjdGVkIGZhaWx1cmVzIiwgbVVuZXhwZWN0ZWRGYWlsdXJlcyk7CisKKyAgICAgICAgY3JlYXRlUmVzdWx0c0xpc3ROb0RpZmYoaHRtbCwgIlVuZXhwZWN0ZWQgcGFzc2VzIiwgbVVuZXhwZWN0ZWRQYXNzZXMpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0V2l0aERpZmYoaHRtbCwgIkV4cGVjdGVkIGZhaWx1cmVzIiwgbUV4cGVjdGVkRmFpbHVyZXMpOworCisgICAgICAgIGNyZWF0ZVJlc3VsdHNMaXN0Tm9EaWZmKGh0bWwsICJFeHBlY3RlZCBwYXNzZXMiLCBtRXhwZWN0ZWRQYXNzZXMpOworCisgICAgICAgIGh0bWwuYXBwZW5kKCI8L2JvZHk+PC9odG1sPiIpOworCisgICAgICAgIEZzVXRpbHMud3JpdGVEYXRhVG9TdG9yYWdlKG5ldyBGaWxlKG1SZXN1bHRzUm9vdERpclBhdGgsIEhUTUxfREVUQUlMU19SRUxBVElWRV9QQVRIKSwKKyAgICAgICAgICAgICAgICBodG1sLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFRvdGFsVGVzdENvdW50KCkgeworICAgICAgICByZXR1cm4gbVVuZXhwZWN0ZWRGYWlsdXJlcy5zaXplKCkgKworICAgICAgICAgICAgICAgIG1VbmV4cGVjdGVkUGFzc2VzLnNpemUoKSArCisgICAgICAgICAgICAgICAgbUV4cGVjdGVkUGFzc2VzLnNpemUoKSArCisgICAgICAgICAgICAgICAgbUV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYktpdFZlcnNpb25Gcm9tVXNlckFnZW50U3RyaW5nKCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcyhuZXcgQXNzZXRNYW5hZ2VyKCksIG5ldyBEaXNwbGF5TWV0cmljcygpLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCkpOworICAgICAgICBTdHJpbmcgdXNlckFnZW50ID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLndlYl91c2VyX2FnZW50KTsKKworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIkFwcGxlV2ViS2l0LyhbMC05XSs/XFwuWzAtOV0pIikubWF0Y2hlcih1c2VyQWdlbnQpOworICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmdyb3VwKDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAidW5rbm93biI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2ViS2l0UmV2aXNpb24oKSB7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTChGb3J3YXJkZXJNYW5hZ2VyLmdldEhvc3RTY2hlbWVQb3J0KGZhbHNlKSArICJUaGlyZFBhcnR5UHJvamVjdC5wcm9wIik7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdGhpcmRQYXJ0eVByb2plY3RDb250ZW50cyA9IG5ldyBTdHJpbmcoRnNVdGlscy5yZWFkRGF0YUZyb21VcmwodXJsKSk7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiXnZlcnNpb249KFswLTldKykiLCBQYXR0ZXJuLk1VTFRJTElORSkubWF0Y2hlcigKKyAgICAgICAgICAgICAgICB0aGlyZFBhcnR5UHJvamVjdENvbnRlbnRzKTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUb3BTdW1tYXJ5VGFibGUoU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDE+IiArIG1UZXN0c1JlbGF0aXZlUGF0aCArICI8L2gxPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiRGF0ZTogIiArIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpICsgIjwvaDM+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+IiArICJCdWlsZCBmaW5nZXJwcmludDogIiArIEJ1aWxkLkZJTkdFUlBSSU5UICsgIjwvaDM+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDM+IiArICJXZWJLaXQgdmVyc2lvbjogIiArIGdldFdlYktpdFZlcnNpb25Gcm9tVXNlckFnZW50U3RyaW5nKCkgKyAiPC9oMz4iKTsKKworICAgICAgICBTdHJpbmcgd2Via2l0UmV2aXNpb24gPSBnZXRXZWJLaXRSZXZpc2lvbigpOworICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIgKyAiV2ViS2l0IHJldmlzaW9uOiAiKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCJodHRwOi8vdHJhYy53ZWJraXQub3JnL2Jyb3dzZXIvdHJ1bms/cmV2PSIgKyB3ZWJraXRSZXZpc2lvbiArCisgICAgICAgICAgICAgICAgIlwiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyB3ZWJraXRSZXZpc2lvbiArICI8L3NwYW4+PC9hPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiPC9oMz4iKTsKKworICAgICAgICBodG1sLmFwcGVuZCgiPHRhYmxlIGNsYXNzPVwic3VtbWFyeVwiPiIpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIlRPVEFMIiwgZ2V0VG90YWxUZXN0Q291bnQoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiQ1JBU0hFRCIsIG1DcmFzaGVkVGVzdHNDb3VudCk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiVU5FWFBFQ1RFRCBGQUlMVVJFUyIsIG1VbmV4cGVjdGVkRmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgY3JlYXRlU3VtbWFyeVRhYmxlUm93KGh0bWwsICJVTkVYUEVDVEVEIFBBU1NFUyIsIG1VbmV4cGVjdGVkUGFzc2VzLnNpemUoKSk7CisgICAgICAgIGNyZWF0ZVN1bW1hcnlUYWJsZVJvdyhodG1sLCAiRVhQRUNURUQgRkFJTFVSRVMiLCBtRXhwZWN0ZWRGYWlsdXJlcy5zaXplKCkpOworICAgICAgICBjcmVhdGVTdW1tYXJ5VGFibGVSb3coaHRtbCwgIkVYUEVDVEVEIFBBU1NFUyIsIG1FeHBlY3RlZFBhc3Nlcy5zaXplKCkpOworICAgICAgICBodG1sLmFwcGVuZCgiPC90YWJsZT4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3VtbWFyeVRhYmxlUm93KFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIGNhcHRpb24sIGludCBzaXplKSB7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8dHI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkPiIgKyBjYXB0aW9uICsgIjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkPiIgKyBzaXplICsgIjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8L3RyPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVSZXN1bHRzTGlzdFdpdGhEaWZmKFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFJlc3VsdD4gcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKyAgICAgICAgU3RyaW5nIGlkID0gIiI7CisgICAgICAgIEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUgcmVzdWx0Q29kZTsKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHNMaXN0KTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjxoMj4iICsgdGl0bGUgKyAiIFsiICsgcmVzdWx0c0xpc3Quc2l6ZSgpICsgIl08L2gyPiIpOworICAgICAgICBmb3IgKEFic3RyYWN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHNMaXN0KSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICByZXN1bHRDb2RlID0gcmVzdWx0LmdldFJlc3VsdENvZGUoKTsKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHRDb2RlICE9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuUEFTUyA6ICJyZXN1bHRDb2RlPSIgKyByZXN1bHRDb2RlOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGgzPiIpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRlY2huaWNhbGx5LCB0d28gZGlmZmVyZW50IHBhdGhzIGNvdWxkIGVuZCB1cCBiZWluZyB0aGUgc2FtZSwgYmVjYXVzZQorICAgICAgICAgICAgICogJzonIGlzIGEgdmFsaWQgIGNoYXJhY3RlciBpbiBhIHBhdGguIEhvd2V2ZXIsIGl0IGlzIHByb2JhYmx5IG5vdCBnb2luZworICAgICAgICAgICAgICogdG8gY2F1c2UgYW55IHByb2JsZW1zIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yLCAiOiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIjXCIgb25DbGljaz1cInRvZ2dsZURpc3BsYXkoJyIgKyBpZCArICInKTsiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJyZXR1cm4gZmFsc2U7XCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHNwYW4gY2xhc3M9XCJ0cmlcIiBpZD1cInRyaS4iICsgaWQgKyAiXCI+JiN4MjViNjsgPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyByZWxhdGl2ZVBhdGggKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtICIgKyByZXN1bHRDb2RlLm5hbWUoKSArICJcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKHJlc3VsdENvZGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC9zcGFuPiIpOworCisgICAgICAgICAgICAvKiogRGV0ZWN0IG1pc3NpbmcgTFRDIGZ1bmN0aW9uICovCisgICAgICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcgPSByZXN1bHQuZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZSIpICYmCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nLmNvbnRhaW5zKCJoYXMgbm8gbWV0aG9kIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcuY29udGFpbnMoIkxheW91dFRlc3RDb250cm9sbGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiA8c3BhbiBjbGFzcz1cImxpc3RJdGVtIG5vTHRjXCI+TFRDIGZ1bmN0aW9uIG1pc3Npbmc8L3NwYW4+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZy5jb250YWlucygiRXZlbnRTZW5kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiIDxzcGFuIGNsYXNzPVwibGlzdEl0ZW0gbm9FdmVudFNlbmRlclwiPiIpOworICAgICAgICAgICAgICAgICAgICBodG1sLmFwcGVuZCgiRVMgZnVuY3Rpb24gbWlzc2luZzwvc3Bhbj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2gzPiIpOworICAgICAgICAgICAgYXBwZW5kRXhwZWN0ZWRSZXN1bHRzU291cmNlcyhyZXN1bHQsIGh0bWwpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGRpdiBjbGFzcz1cImRpZmZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgaWQ9XCIiICsgaWQgKyAiXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZChyZXN1bHQuZ2V0RGlmZkFzSHRtbCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiI1wiIG9uQ2xpY2s9XCJ0b2dnbGVEaXNwbGF5KCciICsgaWQgKyAiJyk7Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgicmV0dXJuIGZhbHNlO1wiPkhpZGU8L2E+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHwgIik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPGEgaHJlZj1cIiIgKyBnZXRWaWV3U291cmNlVXJsKHJlbGF0aXZlUGF0aCkudG9TdHJpbmcoKSArICJcIiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB0YXJnZXQ9XCJfYmxhbmtcIj5TaG93IHNvdXJjZTwvYT4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2Rpdj4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlc3VsdHNMaXN0Tm9EaWZmKFN0cmluZ0J1aWxkZXIgaHRtbCwgU3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFJlc3VsdD4gcmVzdWx0c0xpc3QpIHsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzTGlzdCk7CisgICAgICAgIGh0bWwuYXBwZW5kKCI8aDI+IiArIHRpdGxlICsgIiBbIiArIHJlc3VsdHNMaXN0LnNpemUoKSArICJdPC9oMj4iKTsKKyAgICAgICAgZm9yIChBYnN0cmFjdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzTGlzdCkgeworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxoMz4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiIiArIGdldFZpZXdTb3VyY2VVcmwocmVzdWx0LmdldFJlbGF0aXZlUGF0aCgpKS50b1N0cmluZygpICsKKyAgICAgICAgICAgICAgICAgICAgIlwiIik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiIHRhcmdldD1cIl9ibGFua1wiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic3FyXCI+JiN4MjVhMDsgPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwicGF0aFwiPiIgKyByZXN1bHQuZ2V0UmVsYXRpdmVQYXRoKCkgKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjwvYT4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8L2gzPiIpOworICAgICAgICAgICAgYXBwZW5kRXhwZWN0ZWRSZXN1bHRzU291cmNlcyhyZXN1bHQsIGh0bWwpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxkaXYgY2xhc3M9XCJzcGFjZVwiPjwvZGl2PiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgdm9pZCBhcHBlbmRFeHBlY3RlZFJlc3VsdHNTb3VyY2VzKEFic3RyYWN0UmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICBTdHJpbmcgdGV4dFNvdXJjZSA9IHJlc3VsdC5nZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKCk7CisgICAgICAgIFN0cmluZyBpbWFnZVNvdXJjZSA9IHJlc3VsdC5nZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aCgpOworCisgICAgICAgIGlmICh0ZXh0U291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIHRleHR1YWwgcmVzdWx0IGZyb206ICIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIjxhIGhyZWY9XCIiICsgRm9yd2FyZGVyTWFuYWdlci5nZXRIb3N0U2NoZW1lUG9ydChmYWxzZSkgKyAiTGF5b3V0VGVzdHMvIiArCisgICAgICAgICAgICAgICAgICAgIHRleHRTb3VyY2UgKyAiXCIiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgdGFyZ2V0PVwiX2JsYW5rXCI+Iik7CisgICAgICAgICAgICBodG1sLmFwcGVuZCh0ZXh0U291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltYWdlU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8c3BhbiBjbGFzcz1cInNvdXJjZVwiPkV4cGVjdGVkIGltYWdlIHJlc3VsdCBmcm9tOiAiKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCI8YSBocmVmPVwiIiArIEZvcndhcmRlck1hbmFnZXIuZ2V0SG9zdFNjaGVtZVBvcnQoZmFsc2UpICsgIkxheW91dFRlc3RzLyIgKworICAgICAgICAgICAgICAgICAgICBpbWFnZVNvdXJjZSArICJcIiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiB0YXJnZXQ9XCJfYmxhbmtcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGltYWdlU291cmNlICsgIjwvYT48L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkwgZ2V0Vmlld1NvdXJjZVVybChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cCIsICJsb2NhbGhvc3QiLCBGb3J3YXJkZXJNYW5hZ2VyLkhUVFBfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgIi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9hbmRyb2lkL3ZpZXdfc291cmNlLnBocD9zcmM9IiArCisgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAicmVsYXRpdmVQYXRoPSIgKyByZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9UZXN0c0xpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI0ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydC5PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBbiBBY3Rpdml0eSB0aGF0IGdlbmVyYXRlcyBhIGxpc3Qgb2YgdGVzdHMgYW5kIHNlbmRzIHRoZSBpbnRlbnQgdG8KKyAqIExheW91dFRlc3RzRXhlY3V0ZXIgdG8gcnVuIHRoZW0uIEl0IGFsc28gcmVzdGFydHMgdGhlIExheW91dFRlc3RzRXhlY3V0ZXIKKyAqIGFmdGVyIGl0IGNyYXNoZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0c0xpc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVEVTVF9MSVNUX1BSRUxPQURFUl9ET05FID0gMDsKKworICAgIC8qKiBDb25zdGFudHMgZm9yIGFkZGluZyBleHRyYXMgdG8gYW4gaW50ZW50ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVEVTVF9QQVRIID0gIlRlc3RQYXRoIjsKKworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RFU1RfTElTVF9QUkVMT0FERVJfRE9ORToKKyAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RzTGlzdCA9IChBcnJheUxpc3Q8U3RyaW5nPiltc2cub2JqOworICAgICAgICAgICAgICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBtVGVzdHNMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdGFydEV4ZWN1dG9yKDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1UZXN0c0xpc3Q7CisgICAgcHJpdmF0ZSBpbnQgbVRvdGFsVGVzdENvdW50OworCisgICAgcHJpdmF0ZSBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrOworICAgIHByaXZhdGUgYm9vbGVhbiBtRXZlcnl0aGluZ0ZpbmlzaGVkOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8qKiBQcmVwYXJlIHRoZSBwcm9ncmVzcyBkaWFsb2cgKi8KKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKFRlc3RzTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0Q2FuY2VsYWJsZShmYWxzZSk7CisgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRQcm9ncmVzc1N0eWxlKFByb2dyZXNzRGlhbG9nLlNUWUxFX1NQSU5ORVIpOworICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldE1lc3NhZ2UoZ2V0VGV4dChSLnN0cmluZy5kaWFsb2dfcHJvZ3Jlc3NfbXNnKSk7CisKKyAgICAgICAgcmVxdWVzdFdpbmRvd0ZlYXR1cmUoV2luZG93LkZFQVRVUkVfUFJPR1JFU1MpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKyAgICAgICAgaWYgKCFpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fUlVOKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwYXRoID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEVYVFJBX1RFU1RfUEFUSCk7CisKKyAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNob3coKTsKKyAgICAgICAgTWVzc2FnZSBkb25lTXNnID0gTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIE1TR19URVNUX0xJU1RfUFJFTE9BREVSX0RPTkUpOworCisgICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudCh0aGlzLCBNYW5hZ2VyU2VydmljZS5jbGFzcyk7CisgICAgICAgIHNlcnZpY2VJbnRlbnQucHV0RXh0cmEoInBhdGgiLCBwYXRoKTsKKyAgICAgICAgc3RhcnRTZXJ2aWNlKHNlcnZpY2VJbnRlbnQpOworCisgICAgICAgIG5ldyBUZXN0c0xpc3RQcmVsb2FkZXJUaHJlYWQocGF0aCwgZG9uZU1zZykuc3RhcnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk5ld0ludGVudChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fUkVCT09UKSkgeworICAgICAgICAgICAgb25DcmFzaEludGVudChpbnRlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9TSFVURE9XTikpIHsKKyAgICAgICAgICAgIG9uRXZlcnl0aGluZ0ZpbmlzaGVkSW50ZW50KGludGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGFuIGludGVudCB0aGF0IGNvbWVzIGZyb20gTWFuYWdlU2VydmljZSB3aGVuIGNyYXNoIGlzIGRldGVjdGVkLgorICAgICAqIFRoZSBpbnRlbnQgY29udGFpbnMgYW4gaW5kZXggaW4gbVRlc3RzTGlzdCBvZiB0aGUgdGVzdCB0aGF0IGNyYXNoZWQuIFRlc3RzTGlzdEFjdGl2aXR5CisgICAgICogcmVzdGFydHMgdGhlIExheW91dFRlc3RzRXhlY3V0b3IgZnJvbSB0aGUgZm9sbG93aW5nIHRlc3QgaW4gbVRlc3RzTGlzdCwgYnkgc2VuZGluZworICAgICAqIGFuIGludGVudCB0byBpdC4gVGhpcyBuZXcgaW50ZW50IGNvbnRhaW5zIGEgbGlzdCBvZiByZW1haW5pbmcgdGVzdHMgdG8gcnVuLAorICAgICAqIHRvdGFsIGNvdW50IG9mIGFsbCB0ZXN0cywgYW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdGVzdCB0byBydW4gYWZ0ZXIgcmVzdGFydGluZy4KKyAgICAgKiBMYXlvdXRUZXN0RXhlY3V0b3IgcnVucyB0aGVuIGFzIHVzdWFsLCBzZW5kaW5nIHJlcG9ydHMgdG8gTWFuYWdlclNlcnZpY2UuIElmIGl0CisgICAgICogZGV0ZWN0cyB0aGUgY3Jhc2ggaXQgc2VuZHMgYSBuZXcgaW50ZW50IGFuZCB0aGUgZmxvdyByZXBlYXRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvbkNyYXNoSW50ZW50KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgaW50IG5leHRUZXN0VG9SdW4gPSBpbnRlbnQuZ2V0SW50RXh0cmEoImNyYXNoZWRUZXN0SW5kZXgiLCAtMSkgKyAxOworICAgICAgICBpZiAobmV4dFRlc3RUb1J1biA+IDAgJiYgbmV4dFRlc3RUb1J1biA8PSBtVG90YWxUZXN0Q291bnQpIHsKKyAgICAgICAgICAgIHJlc3RhcnRFeGVjdXRvcihuZXh0VGVzdFRvUnVuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjayhPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIGlmIChtRXZlcnl0aGluZ0ZpbmlzaGVkKSB7CisgICAgICAgICAgICBtT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5vbkZpbmlzaGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25FdmVyeXRoaW5nRmluaXNoZWRJbnRlbnQoSW50ZW50IGludGVudCkgeworICAgICAgICBUb2FzdCB0b2FzdCA9IFRvYXN0Lm1ha2VUZXh0KHRoaXMsCisgICAgICAgICAgICAgICAgIkFsbCB0ZXN0cyBmaW5pc2hlZC5cblByZXNzIGJhY2sga2V5IHRvIHJldHVybiB0byB0aGUgdGVzdHMnIGxpc3QuIiwKKyAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORyk7CisgICAgICAgIHRvYXN0LnNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIsIC00MCwgMCk7CisgICAgICAgIHRvYXN0LnNob3coKTsKKworICAgICAgICAvKiogU2hvdyB0aGUgZGV0YWlscyB0byB0aGUgdXNlciAqLworICAgICAgICBXZWJWaWV3IHdlYlZpZXcgPSBuZXcgV2ViVmlldyh0aGlzKTsKKyAgICAgICAgd2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEphdmFTY3JpcHRFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJWaWV3LmdldFNldHRpbmdzKCkuc2V0QnVpbHRJblpvb21Db250cm9scyh0cnVlKTsKKyAgICAgICAgd2ViVmlldy5nZXRTZXR0aW5ncygpLnNldEVuYWJsZVNtb290aFRyYW5zaXRpb24odHJ1ZSk7CisgICAgICAgIC8qKiBUaGlzIGVuYWJsZXMgZG91YmxlLXRhcCB0byB6b29tICovCisgICAgICAgIHdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5zZXRVc2VXaWRlVmlld1BvcnQodHJ1ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcod2ViVmlldyk7CisgICAgICAgIHdlYlZpZXcubG9hZFVybChTdW1tYXJpemVyLmdldERldGFpbHNVcmkoKS50b1N0cmluZygpKTsKKworICAgICAgICBtRXZlcnl0aGluZ0ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMsIHRvZ2V0aGVyIHdpdGggYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbiIgaW4gbWFuaWZlc3QgZmlsZSwgcHJldmVudHMKKyAgICAgKiB0aGUgYWN0aXZpdHkgZnJvbSByZXN0YXJ0aW5nIG9uIG9yaWVudGF0aW9uIGNoYW5nZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBvdXRTdGF0ZS5wdXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIsIG1UZXN0c0xpc3QpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoInRvdGFsQ291bnQiLCBtVG90YWxUZXN0Q291bnQpOworCisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbVRlc3RzTGlzdCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRTdHJpbmdBcnJheUxpc3QoInRlc3RzTGlzdCIpOworICAgICAgICBtVG90YWxUZXN0Q291bnQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0b3RhbENvdW50Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogKFJlKXN0YXJ0cyB0aGUgZXhlY3V0ZXIgYWN0aXZpdHkgZnJvbSB0aGUgZ2l2ZW4gdGVzdCBudW1iZXIgKGluY2x1c2l2ZSwgMC1iYXNlZCkuCisgICAgICogVGhpcyBudW1iZXIgaXMgYW4gaW5kZXggaW4gbVRlc3RzTGlzdCwgbm90IHRoZSBzdWJsaXN0IHBhc3NlZCBpbiB0aGUgaW50ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0RnJvbQorICAgICAqICAgICAgdGVzdCBpbmRleCBpbiBtVGVzdHNMaXN0IHRvIHN0YXJ0IHRoZSB0ZXN0cyBmcm9tIChpbmNsdXNpdmUsIDAtYmFzZWQpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnRFeGVjdXRvcihpbnQgc3RhcnRGcm9tKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzcyh0aGlzLCBMYXlvdXRUZXN0c0V4ZWN1dG9yLmNsYXNzKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisKKyAgICAgICAgaWYgKHN0YXJ0RnJvbSA8IG1Ub3RhbFRlc3RDb3VudCkgeworICAgICAgICAgICAgaW50ZW50LnB1dFN0cmluZ0FycmF5TGlzdEV4dHJhKExheW91dFRlc3RzRXhlY3V0b3IuRVhUUkFfVEVTVFNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1UZXN0c0xpc3Quc3ViTGlzdChzdGFydEZyb20sIG1Ub3RhbFRlc3RDb3VudCkpKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShMYXlvdXRUZXN0c0V4ZWN1dG9yLkVYVFJBX1RFU1RfSU5ERVgsIHN0YXJ0RnJvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlbnQucHV0U3RyaW5nQXJyYXlMaXN0RXh0cmEoTGF5b3V0VGVzdHNFeGVjdXRvci5FWFRSQV9URVNUU19MSVNULAorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNGVjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1Rlc3RzTGlzdFByZWxvYWRlclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBBIFRocmVhZCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGEgbGlzdHMgb2YgdGVzdHMgdG8gcnVuLgorICovCitwdWJsaWMgY2xhc3MgVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlRlc3RzTGlzdFByZWxvYWRlclRocmVhZCI7CisKKyAgICAvKiogVE9ETzogbWFrZSBpdCBhIHNldHRpbmcgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVFNfUk9PVF9ESVJfUEFUSCA9CisgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJhbmRyb2lkIiArCisgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArICJMYXlvdXRUZXN0cyI7CisKKyAgICAvKiogQSBsaXN0IGNvbnRhaW5pbmcgcmVsYXRpdmUgcGF0aHMgb2YgdGVzdHMgdG8gcnVuICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtVGVzdHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisKKyAgICBwcml2YXRlIEZpbGVGaWx0ZXIgbUZpbGVGaWx0ZXI7CisKKyAgICAvKioKKyAgICAgKiBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZvbGRlciB3aXRoIHRoZSB0ZXN0cyB3ZSB3YW50IHRvIHJ1biBvciBwYXJ0aWN1bGFyIHRlc3QuCisgICAgICogVXNlZCB1cCB0byBhbmQgaW5jbHVkaW5nIHByZWxvYWRUZXN0cygpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICBwcml2YXRlIE1lc3NhZ2UgbURvbmVNc2c7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2l2ZW4gcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSByb290IGRpci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogQHBhcmFtIGRvbmVNc2cKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdHNMaXN0UHJlbG9hZGVyVGhyZWFkKFN0cmluZyBwYXRoLCBNZXNzYWdlIGRvbmVNc2cpIHsKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcihURVNUU19ST09UX0RJUl9QQVRIKTsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IHBhdGg7CisgICAgICAgIG1Eb25lTXNnID0gZG9uZU1zZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUobVJlbGF0aXZlUGF0aCkpIHsKKyAgICAgICAgICAgIG1UZXN0c0xpc3QuYWRkKG1SZWxhdGl2ZVBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9hZFRlc3RzRnJvbVVybChtUmVsYXRpdmVQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Eb25lTXNnLm9iaiA9IG1UZXN0c0xpc3Q7CisgICAgICAgIG1Eb25lTXNnLnNlbmRUb1RhcmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGFsbCB0aGUgdGVzdHMgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVycyBhbmQgYWxsIHRoZSBzdWJmb2xkZXJzCisgICAgICogaW50byBtVGVzdHNMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclJlbGF0aXZlUGF0aAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkVGVzdHNGcm9tVXJsKFN0cmluZyBkaXJSZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGZvbGRlcnNMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBmb2xkZXJzTGlzdC5hZGQoZGlyUmVsYXRpdmVQYXRoKTsKKworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoOworICAgICAgICBTdHJpbmcgaXRlbU5hbWU7CisgICAgICAgIHdoaWxlICghZm9sZGVyc0xpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmb2xkZXJzTGlzdC5yZW1vdmVGaXJzdCgpOworCisgICAgICAgICAgICBmb3IgKFN0cmluZyBmb2xkZXJSZWxhdGl2ZVBhdGggOiBGc1V0aWxzLmdldExheW91dFRlc3RzRGlyQ29udGVudHMocmVsYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtTmFtZSA9IG5ldyBGaWxlKGZvbGRlclJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdERpcihpdGVtTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9sZGVyc0xpc3QuYWRkKGZvbGRlclJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFN0cmluZyB0ZXN0UmVsYXRpdmVQYXRoIDogRnNVdGlscy5nZXRMYXlvdXRUZXN0c0RpckNvbnRlbnRzKHJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIGl0ZW1OYW1lID0gbmV3IEZpbGUodGVzdFJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChGaWxlRmlsdGVyLmlzVGVzdEZpbGUoaXRlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBXZSBjaG9zZSB0byBza2lwIGFsbCB0aGUgdGVzdHMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gY3Jhc2guICovCisgICAgICAgICAgICAgICAgICAgIGlmICghbUZpbGVGaWx0ZXIuaXNDcmFzaCh0ZXN0UmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RzTGlzdC5hZGQodGVzdFJlbGF0aXZlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRPRE86IFN1bW1hcml6ZXIgaXMgbm93IGluIHNlcnZpY2UgLSBmaWd1cmUgb3V0IGhvdyB0byBzZW5kIHRoZSBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgICogUHJldmlvdXNseTogbVN1bW1hcml6ZXIuYWRkU2tpcHBlZFRlc3QocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL1RleHRSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY0ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVGV4dFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTI7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXc7CisKK2ltcG9ydCBuYW1lLmZyYXNlci5uZWlsLnBsYWludGV4dC5kaWZmX21hdGNoX3BhdGNoOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQSByZXN1bHQgb2JqZWN0IGZvciB3aGljaCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGlzIHRleHQuIEl0IGRvZXMgbm90IGhhdmUgYW4gaW1hZ2UKKyAqIGV4cGVjdGVkIHJlc3VsdC4KKyAqCisgKiA8cD5DcmVhdGVkIGlmIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKSB3YXMgY2FsbGVkLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFJlc3VsdCBleHRlbmRzIEFic3RyYWN0UmVzdWx0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9DVU1FTlRfQVNfVEVYVCA9IDA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtRXhwZWN0ZWRSZXN1bHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBtQWN0dWFsUmVzdWx0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgcHJpdmF0ZSBSZXN1bHRDb2RlIG1SZXN1bHRDb2RlOworICAgIHByaXZhdGUgTWVzc2FnZSBtUmVzdWx0T2J0YWluZWRNc2c7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dDsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IE1TR19ET0NVTUVOVF9BU19URVhUKSB7CisgICAgICAgICAgICAgICAgbUFjdHVhbFJlc3VsdCA9IChTdHJpbmcpbXNnLm9iajsKKyAgICAgICAgICAgICAgICBtUmVzdWx0T2J0YWluZWRNc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFRleHRSZXN1bHQoU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER1bXBDaGlsZEZyYW1lc0FzVGV4dChib29sZWFuIGR1bXBDaGlsZEZyYW1lc0FzVGV4dCkgeworICAgICAgICBtRHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZHVtcENoaWxkRnJhbWVzQXNUZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcmVjcmVhdGUgdGhlIFJlc3VsdCB3aGVuIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZQorICAgICAqICAgICAgYnVuZGxlIHdpdGggZGF0YSB1c2VkIHRvIHJlY3JlYXRlIHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dFJlc3VsdChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBtRXhwZWN0ZWRSZXN1bHRQYXRoID0gYnVuZGxlLmdldFN0cmluZygiZXhwZWN0ZWRUZXh0dWFsUmVzdWx0UGF0aCIpOworICAgICAgICBtQWN0dWFsUmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIpOworICAgICAgICBzZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyhidW5kbGUuZ2V0U3RyaW5nKCJhZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZyIpKTsKKyAgICAgICAgbVJlbGF0aXZlUGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlbGF0aXZlUGF0aCIpOworICAgICAgICBTdHJpbmcgcmVzdWx0Q29kZSA9IGJ1bmRsZS5nZXRTdHJpbmcoInJlc3VsdENvZGUiKTsKKyAgICAgICAgaWYgKHJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBSZXN1bHRDb2RlLnZhbHVlT2YocmVzdWx0Q29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0Q29kZSBnZXRSZXN1bHRDb2RlKCkgeworICAgICAgICBpZiAobVJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXN1bHRDb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBtUmVzdWx0Q29kZSA9IEFic3RyYWN0UmVzdWx0LlJlc3VsdENvZGUuRkFJTF9OT19FWFBFQ1RFRF9SRVNVTFQ7CisgICAgICAgIH0gZWxzZSBpZiAoIW1FeHBlY3RlZFJlc3VsdC5lcXVhbHMobUFjdHVhbFJlc3VsdCkpIHsKKyAgICAgICAgICAgIG1SZXN1bHRDb2RlID0gQWJzdHJhY3RSZXN1bHQuUmVzdWx0Q29kZS5GQUlMX1JFU1VMVF9ESUZGRVJTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlc3VsdENvZGUgPSBBYnN0cmFjdFJlc3VsdC5SZXN1bHRDb2RlLlBBU1M7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVJlc3VsdENvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSBnZXRBY3R1YWxJbWFnZVJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBY3R1YWxUZXh0UmVzdWx0KCkgeworICAgICAgICBTdHJpbmcgYWRkaXRpb25hbFRleHRSZXN1bHRTdHJpbmcgPSBnZXRBZGRpdGlvbmFsVGV4dE91dHB1dFN0cmluZygpOworICAgICAgICBpZiAoYWRkaXRpb25hbFRleHRSZXN1bHRTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxUZXh0UmVzdWx0U3RyaW5nKyBtQWN0dWFsUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1BY3R1YWxSZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRJbWFnZVJlc3VsdChieXRlW10gZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIC8qKiBUaGlzIG1ldGhvZCBpcyBub3QgYXBwbGljYWJsZSB0byB0aGlzIHR5cGUgb2YgcmVzdWx0ICovCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZEltYWdlUmVzdWx0UGF0aCgpIHsKKyAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoaXMgdHlwZSBvZiByZXN1bHQgKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRUZXh0UmVzdWx0UGF0aChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdFBhdGggPSByZWxhdGl2ZVBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRFeHBlY3RlZFRleHRSZXN1bHRQYXRoKCkgeworICAgICAgICByZXR1cm4gbUV4cGVjdGVkUmVzdWx0UGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFRleHRSZXN1bHQoU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIG1FeHBlY3RlZFJlc3VsdCA9IGV4cGVjdGVkUmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlmZkFzSHRtbCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBodG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjx0YWJsZSBjbGFzcz1cInZpc3VhbF9kaWZmXCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiaGVhZGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5FeHBlY3RlZCByZXN1bHQ6PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICAgICAgPHRkIGNsYXNzPVwic3BhY2VcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5BY3R1YWwgcmVzdWx0OjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKworICAgICAgICBpZiAobUV4cGVjdGVkUmVzdWx0ID09IG51bGwgfHwgbUFjdHVhbFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBhcHBlbmROdWxsc0h0bWwoaHRtbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcHBlbmREaWZmSHRtbChodG1sKTsKKyAgICAgICAgfQorCisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwiZm9vdGVyc1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj48L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiPjwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90cj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIjwvdGFibGU+Iik7CisKKyAgICAgICAgcmV0dXJuIGh0bWwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kRGlmZkh0bWwoU3RyaW5nQnVpbGRlciBodG1sKSB7CisgICAgICAgIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBkaWZmcyA9CisgICAgICAgICAgICAgICAgbmV3IGRpZmZfbWF0Y2hfcGF0Y2goKS5kaWZmX21haW4obUV4cGVjdGVkUmVzdWx0LCBtQWN0dWFsUmVzdWx0KTsKKworICAgICAgICBkaWZmcyA9IFZpc3VhbERpZmZVdGlscy5zcGxpdERpZmZzT25OZXdsaW5lKGRpZmZzKTsKKworICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaW5lcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBleHBlY3RlZExpbmVOdW1zID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgTGlua2VkTGlzdDxTdHJpbmc+IGFjdHVhbExpbmVzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGFjdHVhbExpbmVOdW1zID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKworICAgICAgICBWaXN1YWxEaWZmVXRpbHMuZ2VuZXJhdGVFeHBlY3RlZFJlc3VsdExpbmVzKGRpZmZzLCBleHBlY3RlZExpbmVOdW1zLCBleHBlY3RlZExpbmVzKTsKKyAgICAgICAgVmlzdWFsRGlmZlV0aWxzLmdlbmVyYXRlQWN0dWFsUmVzdWx0TGluZXMoZGlmZnMsIGFjdHVhbExpbmVOdW1zLCBhY3R1YWxMaW5lcyk7CisKKyAgICAgICAgaHRtbC5hcHBlbmQoVmlzdWFsRGlmZlV0aWxzLmdldEh0bWwoZXhwZWN0ZWRMaW5lTnVtcywgZXhwZWN0ZWRMaW5lcywKKyAgICAgICAgICAgICAgICBhY3R1YWxMaW5lTnVtcywgYWN0dWFsTGluZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kTnVsbHNIdG1sKFN0cmluZ0J1aWxkZXIgaHRtbCkgeworICAgICAgICAvKiogVE9ETzogQ3JlYXRlIGEgc2VwYXJhdGUgcm93IGZvciBlYWNoIGxpbmUgb2Ygbm90IG51bGwgcmVzdWx0ICovCisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRyIGNsYXNzPVwicmVzdWx0c1wiPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgaWYgKG1FeHBlY3RlZFJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiRXhwZWN0ZWQgcmVzdWx0IHdhcyBOVUxMIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZChtRXhwZWN0ZWRSZXN1bHQucmVwbGFjZSgiXG4iLCAiPGJyIC8+IikpOworICAgICAgICB9CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDwvdGQ+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgICAgIDx0ZCBjbGFzcz1cInNwYWNlXCI+PC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lX2NvdW50XCI+Iik7CisgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKyAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJsaW5lXCI+Iik7CisgICAgICAgIGlmIChtQWN0dWFsUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCJBY3R1YWwgcmVzdWx0IHdhcyBOVUxMIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZChtQWN0dWFsUmVzdWx0LnJlcGxhY2UoIlxuIiwgIjxiciAvPiIpKTsKKyAgICAgICAgfQorICAgICAgICBodG1sLmFwcGVuZCgiICAgICAgICA8L3RkPiIpOworICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdHI+Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRlc3RUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUZXN0VHlwZS5URVhUOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9idGFpbkFjdHVhbFJlc3VsdHMoV2ViVmlldyB3ZWJ2aWV3LCBNZXNzYWdlIHJlc3VsdE9idGFpbmVkTXNnKSB7CisgICAgICAgIG1SZXN1bHRPYnRhaW5lZE1zZyA9IHJlc3VsdE9idGFpbmVkTXNnOworICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPQ1VNRU5UX0FTX1RFWFQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBhcmcxIC0gc2hvdWxkIGR1bXAgdG9wIGZyYW1lIGFzIHRleHQKKyAgICAgICAgICogYXJnMiAtIHNob3VsZCBkdW1wIGNoaWxkIGZyYW1lcyBhcyB0ZXh0CisgICAgICAgICAqLworICAgICAgICBtc2cuYXJnMSA9IDE7CisgICAgICAgIG1zZy5hcmcyID0gbUR1bXBDaGlsZEZyYW1lc0FzVGV4dCA/IDEgOiAwOworICAgICAgICB3ZWJ2aWV3LmRvY3VtZW50QXNUZXh0KG1zZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdCIsIG1FeHBlY3RlZFJlc3VsdCk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImV4cGVjdGVkVGV4dHVhbFJlc3VsdFBhdGgiLCBtRXhwZWN0ZWRSZXN1bHRQYXRoKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygiYWN0dWFsVGV4dHVhbFJlc3VsdCIsIGdldEFjdHVhbFRleHRSZXN1bHQoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoImFkZGl0aW9uYWxUZXh0T3V0cHV0U3RyaW5nIiwgZ2V0QWRkaXRpb25hbFRleHRPdXRwdXRTdHJpbmcoKSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIG1SZWxhdGl2ZVBhdGgpOworICAgICAgICBpZiAobVJlc3VsdENvZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZygicmVzdWx0Q29kZSIsIG1SZXN1bHRDb2RlLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZygidHlwZSIsIGdldFR5cGUoKS5uYW1lKCkpOworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkgeworICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9WaXN1YWxEaWZmVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvVmlzdWFsRGlmZlV0aWxzLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMjsKKworaW1wb3J0IG5hbWUuZnJhc2VyLm5laWwucGxhaW50ZXh0LmRpZmZfbWF0Y2hfcGF0Y2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyBmbyBUZXh0UmVzdWx0LmdldERpZmZBc0h0bWwoKQorICovCitwdWJsaWMgY2xhc3MgVmlzdWFsRGlmZlV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET05UX1BSSU5UX0xJTkVfTlVNQkVSID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBQcmVwcm9jZXNzZXMgdGhlIGxpc3Qgb2YgZGlmZnMgc28gdGhhdCBuZXcgbGluZSBjaGFyYWN0ZXJzIGFwcGVhciBvbmx5IGF0IHRoZSBlbmQgb2YKKyAgICAgKiBkaWZmLnRleHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWZmcworICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgIExpbmtlZExpc3Qgb2YgZGlmZnMgd2hlcmUgbmV3IGxpbmUgY2hhcmFjdGVyIGFwcGVhcnMgb25seSBvbiB0aGUgZW5kIG9mCisgICAgICogICAgICBkaWZmLnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBzcGxpdERpZmZzT25OZXdsaW5lKAorICAgICAgICAgICAgTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzKSB7CisgICAgICAgIExpbmtlZExpc3Q8ZGlmZl9tYXRjaF9wYXRjaC5EaWZmPiBuZXdEaWZmcyA9IG5ldyBMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4oKTsKKworICAgICAgICBTdHJpbmdbXSBwYXJ0czsKKyAgICAgICAgaW50IGxlbmd0aE1pbnVzT25lOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHBhcnRzID0gZGlmZi50ZXh0LnNwbGl0KCJcbiIsIC0xKTsKKyAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIG5ld0RpZmZzLmFkZChkaWZmKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuZ3RoTWludXNPbmUgPSBwYXJ0cy5sZW5ndGggLSAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhNaW51c09uZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2ldICsgIlxuIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwYXJ0c1tsZW5ndGhNaW51c09uZV0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbmV3RGlmZnMuYWRkKG5ldyBkaWZmX21hdGNoX3BhdGNoLkRpZmYoZGlmZi5vcGVyYXRpb24sIHBhcnRzW2xlbmd0aE1pbnVzT25lXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0RpZmZzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUV4cGVjdGVkUmVzdWx0TGluZXMoTGlua2VkTGlzdDxkaWZmX21hdGNoX3BhdGNoLkRpZmY+IGRpZmZzLAorICAgICAgICAgICAgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzKSB7CisgICAgICAgIFN0cmluZyBkZWxTcGFuID0gIjxzcGFuIGNsYXNzPVwiZGVsXCI+IjsKKyAgICAgICAgU3RyaW5nIGVxbFNwYW4gPSAiPHNwYW4gY2xhc3M9XCJlcWxcIj4iOworCisgICAgICAgIFN0cmluZyBsaW5lID0gIiI7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiA6IGRpZmZzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGRpZmYub3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGRlbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bXMuYWRkKERPTlRfUFJJTlRfTElORV9OVU1CRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYWRkKCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRVFVQUw6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBwcm9jZXNzRGlmZihkaWZmLCBsaW5lTnVtcywgbGluZXMsIGxpbmUsIGksIGVxbFNwYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpbmUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lTnVtcy5hZGQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVBY3R1YWxSZXN1bHRMaW5lcyhMaW5rZWRMaXN0PGRpZmZfbWF0Y2hfcGF0Y2guRGlmZj4gZGlmZnMsCisgICAgICAgICAgICBMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMpIHsKKyAgICAgICAgU3RyaW5nIGluc1NwYW4gPSAiPHNwYW4gY2xhc3M9XCJpbnNcIj4iOworICAgICAgICBTdHJpbmcgZXFsU3BhbiA9ICI8c3BhbiBjbGFzcz1cImVxbFwiPiI7CisKKyAgICAgICAgU3RyaW5nIGxpbmUgPSAiIjsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBmb3IgKGRpZmZfbWF0Y2hfcGF0Y2guRGlmZiBkaWZmIDogZGlmZnMpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZGlmZi5vcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOU0VSVDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgaW5zU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZi50ZXh0LmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtcy5hZGQoRE9OVF9QUklOVF9MSU5FX05VTUJFUik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFUVVBTDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHByb2Nlc3NEaWZmKGRpZmYsIGxpbmVOdW1zLCBsaW5lcywgbGluZSwgaSwgZXFsU3Bhbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxpbmVzLmFkZChsaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW1zLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIG9yIGFwcGVuZCBhIGxpbmUgZm9yIGEgZ2l2ZW4gZGlmZiBhbmQgYWRkIGl0IHRvIGdpdmVuIGNvbGxlY3Rpb25zIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiBJdCBwdXRzIGRpZmZzIGluIEhUTUwgc3BhbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlmZgorICAgICAqIEBwYXJhbSBsaW5lTnVtcworICAgICAqIEBwYXJhbSBsaW5lcworICAgICAqIEBwYXJhbSBsaW5lCisgICAgICogQHBhcmFtIGkKKyAgICAgKiBAcGFyYW0gYmVnU3BhbgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGlmZihkaWZmX21hdGNoX3BhdGNoLkRpZmYgZGlmZiwgTGlua2VkTGlzdDxJbnRlZ2VyPiBsaW5lTnVtcywKKyAgICAgICAgICAgIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lcywgU3RyaW5nIGxpbmUsIGludCBpLCBTdHJpbmcgYmVnU3BhbikgeworICAgICAgICBTdHJpbmcgZW5kU3BhbiA9ICI8L3NwYW4+IjsKKyAgICAgICAgU3RyaW5nIGJyID0gIiZuYnNwOyI7CisKKyAgICAgICAgaWYgKGRpZmYudGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgICAgbGluZU51bXMuYWRkKGkrKyk7CisgICAgICAgICAgICAvKiogVE9ETzogVGhpbmsgb2YgYmV0dGVyIHdheSB0byByZXBsYWNlIHN0dWZmICovCisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikKKyAgICAgICAgICAgICAgICAgICAgKyBlbmRTcGFuICsgYnI7CisgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lICs9IGJlZ1NwYW4gKyBkaWZmLnRleHQucmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IikgKyBlbmRTcGFuOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChMaW5rZWRMaXN0PEludGVnZXI+IGxpbmVOdW1zMSwgTGlua2VkTGlzdDxTdHJpbmc+IGxpbmVzMSwKKyAgICAgICAgICAgIExpbmtlZExpc3Q8SW50ZWdlcj4gbGluZU51bXMyLCBMaW5rZWRMaXN0PFN0cmluZz4gbGluZXMyKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBsaW5lTnVtOworICAgICAgICBpbnQgc2l6ZSA9IGxpbmVzMS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPHRyIGNsYXNzPVwicmVzdWx0c1wiPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVfY291bnRcIj4iKTsKKyAgICAgICAgICAgIGxpbmVOdW0gPSBsaW5lTnVtczEucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGlmIChsaW5lTnVtID4gMCkgeworICAgICAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDx0ZCBjbGFzcz1cImxpbmVcIj4iKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKGxpbmVzMS5yZW1vdmVGaXJzdCgpKTsKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPC90ZD4iKTsKKworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8dGQgY2xhc3M9XCJzcGFjZVwiPjwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZV9jb3VudFwiPiIpOworICAgICAgICAgICAgbGluZU51bSA9IGxpbmVOdW1zMi5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxpbmVOdW0gPiAwKSB7CisgICAgICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodG1sLmFwcGVuZCgiICAgIDwvdGQ+Iik7CisKKyAgICAgICAgICAgIGh0bWwuYXBwZW5kKCIgICAgPHRkIGNsYXNzPVwibGluZVwiPiIpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQobGluZXMyLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgaHRtbC5hcHBlbmQoIiAgICA8L3RkPiIpOworCisgICAgICAgICAgICBodG1sLmFwcGVuZCgiPC90cj4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaHRtbC50b1N0cmluZygpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9BZGJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjVhMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQWRiVXRpbHMuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CisKKy8qKgorICogVGhlIHV0aWxpdHkgY2xhc3MgdGhhdCBjYW4gc2V0dXAgYSBzb2NrZXQgYWxsb3dpbmcgdGhlIGRldmljZSB0byBjb21tdW5pY2F0ZSB3aXRoIHJlbW90ZQorICogbWFjaGluZXMgdGhyb3VnaCB0aGUgbWFjaGluZSB0aGF0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHZpYSBhZGIuCisgKi8KK3B1YmxpYyBjbGFzcyBBZGJVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQWRiVXRpbHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9PSyA9ICJPS0FZIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURCX1BPUlQgPSA1MDM3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREJfSE9TVCA9ICIxMjcuMC4wLjEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBREJfUkVTUE9OU0VfU0laRSA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFuIEFEQiBjb21tYW5kIHVzaW5nIGV4aXN0aW5nIHNvY2tldCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBUaGUgc3RyZWFtcyBwcm92aWRlZCBtdXN0IGJlIGZyb20gYSBzb2NrZXQgY29ubmVjdGVkIHRvIGFkYiBhbHJlYWR5CisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtIG9mIHRoZSBzb2NrZXQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBvcyBvdXRwdXQgc3RyZWFtIG9mIHRoZSBzb2NrZXQKKyAgICAgKiBAcGFyYW0gY21kIHRoZSBhZGIgY29tbWFuZCB0byBzZW5kCisgICAgICogQHJldHVybiBpZiBhZGIgZ2F2ZSBhIHN1Y2Nlc3MgcmVzcG9uc2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZW5kQWRiQ21kKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MsIFN0cmluZyBjbWQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbQURCX1JFU1BPTlNFX1NJWkVdOworCisgICAgICAgIGNtZCA9IFN0cmluZy5mb3JtYXQoIiUwNFgiLCBjbWQubGVuZ3RoKCkpICsgY21kOworICAgICAgICBvcy53cml0ZShjbWQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGludCByZWFkID0gaXMucmVhZChidWYpOworICAgICAgICBpZiAocmVhZCAhPSBBREJfUkVTUE9OU0VfU0laRSB8fCAhQURCX09LLmVxdWFscyhuZXcgU3RyaW5nKGJ1ZikpKSB7CisgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiYWRiIGNtZCBmYWlsZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSB0Y3Agc29ja2V0IGNvbm5lY3Rpb24gdG8gc3BlY2lmaWVkIElQIGFkZHJlc3MgYW5kIHBvcnQgcHJveGllZCBieSBhZGIKKyAgICAgKgorICAgICAqIFRoZSBwcm94eWluZyBpcyB0cmFuc3BhcmVudCwgZS5nLiBpZiBhIHNvY2tldCBpcyByZXR1cm5lZCwgdGhlbiBpdCBjYW4gYmUgd3JpdHRlbiB0byBhbmQKKyAgICAgKiByZWFkIGZyb20gYXMgaWYgaXQgaXMgZGlyZWN0bHkgY29ubmVjdGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyZXNzIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqIEBwYXJhbSByZW1vdGVQb3J0IHBvcnQgb2YgdGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqIEByZXR1cm4gYSB2YWxpZCBTb2NrZXQgaW5zdGFuY2UgaWYgc3VjY2Vzc2Z1bCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNvY2tldCBnZXRTb2NrZXRUb1JlbW90ZU1hY2hpbmUoU3RyaW5nIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldChBREJfSE9TVCwgQURCX1BPUlQpOworICAgICAgICAgICAgU3RyaW5nIGNtZCA9ICJ0Y3A6IiArIHJlbW90ZVBvcnQgKyAiOiIgKyByZW1vdGVBZGRyZXNzOworICAgICAgICAgICAgaWYgKCFzZW5kQWRiQ21kKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLCBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCksIGNtZCkpIHsKKyAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgImVycm9yIGNyZWF0aW5nIGFkYiBzb2NrZXQiLCBpb2UpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTlmMjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0Nvbm5lY3Rpb25IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiBXb3JrZXIgY2xhc3MgZm9yIHtAbGluayBGb3J3YXJkZXJ9LiBBIENvbm5lY3Rpb25IYW5kbGVyIHdpbGwgYmUgY3JlYXRlZCBvbmNlIHRoZSBGb3J3YXJkZXIKKyAqIGFjY2VwdHMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kIGl0IHdpbGwgdGhlbiBmb3J3YXJkIHRoZSBpbmNvbWluZy9vdXRnb2luZyBzdHJlYW1zIHRvIGEKKyAqIGNvbm5lY3Rpb24gYWxyZWFkeSBwcm94aWVkIGJ5IGFkYiBuZXR3b3JraW5nIChzZWUgYWxzbyB7QGxpbmsgQWRiVXRpbHN9KS4KKyAqLworcHVibGljIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNvbm5lY3Rpb25IYW5kbGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uRmluaXNoZWRDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNvY2tldFBpcGVUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCisgICAgICAgIHByaXZhdGUgU29ja2V0IG1JblNvY2tldCwgbU91dFNvY2tldDsKKworICAgICAgICBwdWJsaWMgU29ja2V0UGlwZVRocmVhZChTb2NrZXQgaW5Tb2NrZXQsIFNvY2tldCBvdXRTb2NrZXQpIHsKKyAgICAgICAgICAgIG1JblNvY2tldCA9IGluU29ja2V0OworICAgICAgICAgICAgbU91dFNvY2tldCA9IG91dFNvY2tldDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpczsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gbUluU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIG9zID0gbU91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgdGhpcy50b1N0cmluZygpLCBlKTsKKyAgICAgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoID0gaXMucmVhZChidWZmZXIpKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvKiogVGhpcyBleGNlcHRpb24gbWVhbnMgb25lIG9mIHRoZSBzdHJlYW1zIGlzIGNsb3NlZCAqLworICAgICAgICAgICAgICAgICAgICBMb2cudihMT0dfVEFHLCB0aGlzLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZHNSdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgbVRocmVhZHNSdW5uaW5nLS07CisgICAgICAgICAgICAgICAgaWYgKG1UaHJlYWRzUnVubmluZyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25IYW5kbGVyLnRoaXMuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtT25GaW5pc2hlZENhbGxiYWNrLm9uRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU29ja2V0UGlwZVRocmVhZDpcbiIgKyBtSW5Tb2NrZXQgKyAiXG49PlxuIiArIG1PdXRTb2NrZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEludGVnZXIgbVRocmVhZHNSdW5uaW5nOworCisgICAgcHJpdmF0ZSBTb2NrZXQgbUZyb21Tb2NrZXQsIG1Ub1NvY2tldDsKKyAgICBwcml2YXRlIFNvY2tldFBpcGVUaHJlYWQgbUZyb21Ub1BpcGUsIG1Ub0Zyb21QaXBlOworCisgICAgcHJpdmF0ZSBPbkZpbmlzaGVkQ2FsbGJhY2sgbU9uRmluaXNoZWRDYWxsYmFjazsKKworICAgIHB1YmxpYyBDb25uZWN0aW9uSGFuZGxlcihTb2NrZXQgZnJvbVNvY2tldCwgU29ja2V0IHRvU29ja2V0KSB7CisgICAgICAgIG1Gcm9tU29ja2V0ID0gZnJvbVNvY2tldDsKKyAgICAgICAgbVRvU29ja2V0ID0gdG9Tb2NrZXQ7CisgICAgICAgIG1Gcm9tVG9QaXBlID0gbmV3IFNvY2tldFBpcGVUaHJlYWQobUZyb21Tb2NrZXQsIG1Ub1NvY2tldCk7CisgICAgICAgIG1Ub0Zyb21QaXBlID0gbmV3IFNvY2tldFBpcGVUaHJlYWQobVRvU29ja2V0LCBtRnJvbVNvY2tldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJPbkNvbm5lY3Rpb25IYW5kbGVyRmluaXNoZWRDYWxsYmFjayhPbkZpbmlzaGVkQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbU9uRmluaXNoZWRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAvKiogV2UgaGF2ZSAyIHRocmVhZHMgcnVubmluZywgb25lIGZvciBlYWNoIHBpcGUsIHRoYXQgd2Ugc3RhcnQgaGVyZS4gKi8KKyAgICAgICAgbVRocmVhZHNSdW5uaW5nID0gMjsKKyAgICAgICAgbUZyb21Ub1BpcGUuc3RhcnQoKTsKKyAgICAgICAgbVRvRnJvbVBpcGUuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBzaHV0ZG93bihtRnJvbVNvY2tldCk7CisgICAgICAgIHNodXRkb3duKG1Ub1NvY2tldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNodXRkb3duKFNvY2tldCBzb2NrZXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtRnJvbVRvUGlwZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtVG9Gcm9tUGlwZSkgeworICAgICAgICAgICAgICAgIC8qKiBUaGlzIHdpbGwgc3RvcCB0aGUgd2hpbGUgbG9vcCBpbiB0aGUgcnVuIG1ldGhvZCAqLworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc29ja2V0LmlzSW5wdXRTaHV0ZG93bigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuc2h1dGRvd25JbnB1dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUZyb21Ub1BpcGU9IiArIG1Gcm9tVG9QaXBlICsgIiBtVG9Gcm9tUGlwZT0iICsgbVRvRnJvbVBpcGUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNvY2tldC5pc091dHB1dFNodXRkb3duKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5zaHV0ZG93bk91dHB1dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibUZyb21Ub1BpcGU9IiArIG1Gcm9tVG9QaXBlICsgIiBtVG9Gcm9tUGlwZT0iICsgbVRvRnJvbVBpcGUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNvY2tldC5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Gcm9tVG9QaXBlPSIgKyBtRnJvbVRvUGlwZSArICIgbVRvRnJvbVBpcGU9IiArIG1Ub0Zyb21QaXBlLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvZm9yd2FyZGVyL0ZvcndhcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2Q4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXI7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBwb3J0IGZvcndhcmRpbmcgc2VydmVyLiBMaXN0ZW5zIG9uIGxvY2FsaG9zdCBvbiBzcGVjaWZpZWQgcG9ydCBhbmQgZm9yd2FyZHMgdGhlIHRjcAorICogY29tbXVuaWNhdGlvbnMgdG8gZXh0ZXJuYWwgc29ja2V0IHZpYSBhZGIgbmV0d29ya2luZyBwcm94eS4KKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRlciBleHRlbmRzIFRocmVhZCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRm9yd2FyZGVyIjsKKworICAgIHByaXZhdGUgaW50IG1Qb3J0OworICAgIHByaXZhdGUgU3RyaW5nIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzOworCisgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbVNlcnZlclNvY2tldDsKKworICAgIHByaXZhdGUgU2V0PENvbm5lY3Rpb25IYW5kbGVyPiBtQ29ubmVjdGlvbkhhbmRsZXJzID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbkhhbmRsZXI+KCk7CisKKyAgICBwdWJsaWMgRm9yd2FyZGVyKGludCBwb3J0LCBTdHJpbmcgcmVtb3RlTWFjaGluZUlwQWRkcmVzcykgeworICAgICAgICBtUG9ydCA9IHBvcnQ7CisgICAgICAgIG1SZW1vdGVNYWNoaW5lSXBBZGRyZXNzID0gcmVtb3RlTWFjaGluZUlwQWRkcmVzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgTG9nLmkoTE9HX1RBRywgInN0YXJ0KCk6IFN0YXJ0aW5nIGZvd2FyZGVyIG9uIHBvcnQ6ICIgKyBtUG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KG1Qb3J0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5zdGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8qKiBUaGVzZSBzb2NrZXRzIHdpbGwgYmUgY2xvc2VkIHdoZW4gRm9yd2FyZGVyLnN0b3AoKSBpcyBjYWxsZWQgKi8KKyAgICAgICAgICAgIFNvY2tldCBsb2NhbFNvY2tldDsKKyAgICAgICAgICAgIFNvY2tldCByZW1vdGVTb2NrZXQ7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0ID0gbVNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICByZW1vdGVTb2NrZXQgPSBBZGJVdGlscy5nZXRTb2NrZXRUb1JlbW90ZU1hY2hpbmUobVJlbW90ZU1hY2hpbmVJcEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLyoqIFRoaXMgbW9zdCBsaWtlbHkgbWVhbnMgdGhhdCBtU2VydmVyU29ja2V0IGlzIGFscmVhZHkgY2xvc2VkICovCisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIm1Qb3J0PSIgKyBtUG9ydCwgZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZW1vdGVTb2NrZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAibVBvcnQ9IiArIG1Qb3J0LCBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAicnVuKCk6IG1Qb3J0PSAiICsgbVBvcnQgKyAiIEZhaWxlZCB0byBzdGFydCBmb3J3YXJkaW5nIGZyb20gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFNvY2tldCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3Rpb25IYW5kbGVyIGNvbm5lY3Rpb25IYW5kbGVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25IYW5kbGVyKGxvY2FsU29ja2V0LCByZW1vdGVTb2NrZXQpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFdlIGhhdmUgdG8gY2xvc2UgdGhlIHNvY2tldHMgYWZ0ZXIgdGhlIENvbm5lY3Rpb25IYW5kbGVyIGZpbmlzaGVzLCBzbyB3ZQorICAgICAgICAgICAgICogZG9uJ3QgZ2V0ICJUb28gbWF5IG9wZW4gZmlsZXMiIGV4Y2VwdGlvbi4gV2UgYWxzbyByZW1vdmUgdGhlIENvbm5lY3Rpb25IYW5kbGVyCisgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2xsZWN0aW9uIHRvIGF2b2lkIG1lbW9yeSBpc3N1ZXMuCisgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgQ29ubmVjdGlvbkhhbmRsZXIuT25GaW5pc2hlZENhbGxiYWNrIGNhbGxiYWNrID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25IYW5kbGVyLk9uRmluaXNoZWRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbkhhbmRsZXJzLnJlbW92ZShjb25uZWN0aW9uSGFuZGxlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVtb3ZlQ29ubmVjdGlvbkhhbmRsZXIoKTogcmVtb3ZlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAicmVtb3ZlQ29ubmVjdGlvbkhhbmRsZXIoKTogbm90IGluIHRoZSBjb2xsZWN0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25uZWN0aW9uSGFuZGxlci5yZWdpc3Rlck9uQ29ubmVjdGlvbkhhbmRsZXJGaW5pc2hlZENhbGxiYWNrKGNhbGxiYWNrKTsKKworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25IYW5kbGVycy5hZGQoY29ubmVjdGlvbkhhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ubmVjdGlvbkhhbmRsZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgZm9yIChDb25uZWN0aW9uSGFuZGxlciBjb25uZWN0aW9uSGFuZGxlciA6IG1Db25uZWN0aW9uSGFuZGxlcnMpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uSGFuZGxlci5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtU2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJtUG9ydD0iICsgbVBvcnQsIGUpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL2ZvcndhcmRlci9Gb3J3YXJkZXJNYW5hZ2VyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTdhMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9mb3J3YXJkZXIvRm9yd2FyZGVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuZm9yd2FyZGVyOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHNpbXBsZSBjbGFzcyB0byBzdGFydCBhbmQgc3RvcCBGb3J3YXJkZXJzIHJ1bm5pbmcgb24gc29tZSBwb3J0cy4KKyAqCisgKiBJdCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGlzIHRocmVhZCBzYWZlLgorICovCitwdWJsaWMgY2xhc3MgRm9yd2FyZGVyTWFuYWdlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiRm9yd2FyZGVyTWFuYWdlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHRlc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUX0lQID0gIjEyNy4wLjAuMSI7CisKKyAgICAvKioKKyAgICAgKiBXZSB1c2UgdGhlc2UgcG9ydHMgYmVjYXVzZSBvdGhlciB3ZWJraXQgcGxhdGZvcm1zIGRvLiBUaGV5IGFyZSBzZXQgdXAgaW4KKyAgICAgKiBleHRlcm5hbC93ZWJraXQvTGF5b3V0VGVzdHMvaHR0cC9jb25mL2FwYWNoZTItZGViaWFuLWh0dHBkLmNvbmYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1BPUlQgPSA4MDgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBTX1BPUlQgPSA4NDQzOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgRm9yd2FyZGVyTWFuYWdlciBmb3J3YXJkZXJNYW5hZ2VyOworCisgICAgcHJpdmF0ZSBTZXQ8Rm9yd2FyZGVyPiBtRm9yd2FyZGVyczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RhcnRlZDsKKworICAgIHByaXZhdGUgRm9yd2FyZGVyTWFuYWdlcigpIHsKKyAgICAgICAgbUZvcndhcmRlcnMgPSBuZXcgSGFzaFNldDxGb3J3YXJkZXI+KDIpOworICAgICAgICBtRm9yd2FyZGVycy5hZGQobmV3IEZvcndhcmRlcihIVFRQX1BPUlQsIEhPU1RfSVApKTsKKyAgICAgICAgbUZvcndhcmRlcnMuYWRkKG5ldyBGb3J3YXJkZXIoSFRUUFNfUE9SVCwgSE9TVF9JUCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1haW4gcGFydCBvZiB0aGUgVVJMIHdpdGggdGhlIHRyYWlsaW5nIHNsYXNoCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNIdHRwcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRIb3N0U2NoZW1lUG9ydChib29sZWFuIGlzSHR0cHMpIHsKKyAgICAgICAgaW50IHBvcnQ7CisgICAgICAgIFN0cmluZyBwcm90b2NvbDsKKyAgICAgICAgaWYgKGlzSHR0cHMpIHsKKyAgICAgICAgICAgIHByb3RvY29sID0gImh0dHBzIjsKKyAgICAgICAgICAgIHBvcnQgPSBIVFRQU19QT1JUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJvdG9jb2wgPSAiaHR0cCI7CisgICAgICAgICAgICBwb3J0ID0gSFRUUF9QT1JUOworICAgICAgICB9CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHByb3RvY29sLCBIT1NULCBwb3J0LCAiLyIpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogImlzSHR0cHM9IiArIGlzSHR0cHM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRm9yd2FyZGVyTWFuYWdlciBnZXRGb3J3YXJkZXJNYW5hZ2VyKCkgeworICAgICAgICBpZiAoZm9yd2FyZGVyTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3J3YXJkZXJNYW5hZ2VyID0gbmV3IEZvcndhcmRlck1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9yd2FyZGVyTWFuYWdlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgeworICAgICAgICBpZiAobUlzU3RhcnRlZCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInN0YXJ0KCk6IEZvcndhcmRlck1hbmFnZXIgYWxyZWFkeSBydW5uaW5nISBOT09QLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGb3J3YXJkZXIgZm9yd2FyZGVyIDogbUZvcndhcmRlcnMpIHsKKyAgICAgICAgICAgIGZvcndhcmRlci5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgbUlzU3RhcnRlZCA9IHRydWU7CisgICAgICAgIExvZy5pKExPR19UQUcsICJGb3J3YXJkZXJNYW5hZ2VyIHN0YXJ0ZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmICghbUlzU3RhcnRlZCkgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgInN0b3AoKTogRm9yd2FyZGVyTWFuYWdlciBhbHJlYWR5IHN0b3BwZWQhIE5PT1AuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEZvcndhcmRlciBmb3J3YXJkZXIgOiBtRm9yd2FyZGVycykgeworICAgICAgICAgICAgZm9yd2FyZGVyLmZpbmlzaCgpOworICAgICAgICB9CisKKyAgICAgICAgbUlzU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBMb2cuaShMT0dfVEFHLCAiRm9yd2FyZGVyTWFuYWdlciBzdG9wcGVkLiIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3NjcmlwdHN1cHBvcnQvT25FdmVyeXRoaW5nRmluaXNoZWRDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDQzNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L09uRXZlcnl0aGluZ0ZpbmlzaGVkQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIuc2NyaXB0c3VwcG9ydDsKKworLyoqCisgKiBDYWxsYmFjayB1c2VkIHRvIGluZm9ybSBzY3JpcHRzdXBwb3J0LlN0YXJ0ZXIgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmlzaGVkIGFuZAorICogd2UgY2FuIGV4aXQKKyAqLworcHVibGljIGludGVyZmFjZSBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrIHsKKyAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaGVkKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1NjcmlwdFRlc3RSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TY3JpcHRUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKKworLyoqCisgKiBFeHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgdG8gYWxsb3cgdGhlIHNjcmlwdCB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUgYXBwbGljYXRpb24KKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBTdHJpbmcgbVRlc3RzUmVsYXRpdmVQYXRoOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGFyZ3VtZW50cykgeworICAgICAgICBtVGVzdHNSZWxhdGl2ZVBhdGggPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJwYXRoIik7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0c1JlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1UZXN0c1JlbGF0aXZlUGF0aDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi9zY3JpcHRzdXBwb3J0L1N0YXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQxYTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRHVtcFJlbmRlclRyZWUyL3NyYy9jb20vYW5kcm9pZC9kdW1wcmVuZGVydHJlZTIvc2NyaXB0c3VwcG9ydC9TdGFydGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnNjcmlwdHN1cHBvcnQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworLyoqCisgKiBBIGNsYXNzIHdoaWNoIHByb3ZpZGVzIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIHNjcmlwdCBydW5uaW5nIG9uIHRoZSBob3N0IG1hY2hpbmUgdG8KKyAqIHJ1biB0aGUgdGVzdHMuCisgKgorICogSXQgc3RhcnRzIGEgVGVzdHNMaXN0QWN0aXZpdHkgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgdGhlIHRlc3RzIGZpbmlzaCBleGVjdXRpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdGFydGVyIGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8VGVzdHNMaXN0QWN0aXZpdHk+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJTdGFydGVyIjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUV2ZXJ5dGhpbmdGaW5pc2hlZDsKKworICAgIHB1YmxpYyBTdGFydGVyKCkgeworICAgICAgICBzdXBlcihUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gYWRiIHRvIHN0YXJ0IGV4ZWN1dGluZyB0aGUgdGVzdHMuIEl0IGRvZXNuJ3QgcmV0dXJuCisgICAgICogdW50aWwgZXZlcnl0aGluZyBpcyBmaW5pc2hlZCBzbyB0aGF0IHRoZSBzY3JpcHQgY2FuIHdhaXQgZm9yIHRoZSBlbmQgaWYgaXQgbmVlZHMKKyAgICAgKiB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydExheW91dFRlc3RzKCkgeworICAgICAgICBTY3JpcHRUZXN0UnVubmVyIHJ1bm5lciA9IChTY3JpcHRUZXN0UnVubmVyKWdldEluc3RydW1lbnRhdGlvbigpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gcnVubmVyLmdldFRlc3RzUmVsYXRpdmVQYXRoKCk7CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RhcnQoKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5kdW1wcmVuZGVydHJlZTIiLCAiVGVzdHNMaXN0QWN0aXZpdHkiKTsKKyAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShUZXN0c0xpc3RBY3Rpdml0eS5FWFRSQV9URVNUX1BBVEgsIHJlbGF0aXZlUGF0aCk7CisgICAgICAgIHNldEFjdGl2aXR5SW50ZW50KGludGVudCk7CisgICAgICAgIGdldEFjdGl2aXR5KCkucmVnaXN0ZXJPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKG5ldyBPbkV2ZXJ5dGhpbmdGaW5pc2hlZENhbGxiYWNrKCkgeworICAgICAgICAgICAgLyoqIFRoaXMgbWV0aG9kIGlzIHNhZmUgdG8gY2FsbCBvbiBhbnkgdGhyZWFkICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoZWQoKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChTdGFydGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUV2ZXJ5dGhpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZXIudGhpcy5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgd2hpbGUgKCFtRXZlcnl0aGluZ0ZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAic3RhcnRMYXlvdXRUZXN0cygpIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRm9yd2FyZGVyTWFuYWdlci5nZXRGb3J3YXJkZXJNYW5hZ2VyKCkuc3RvcCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0R1bXBSZW5kZXJUcmVlMi9zcmMvY29tL2FuZHJvaWQvZHVtcHJlbmRlcnRyZWUyL3VpL0Rpckxpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODYyZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9EdW1wUmVuZGVyVHJlZTIvc3JjL2NvbS9hbmRyb2lkL2R1bXByZW5kZXJ0cmVlMi91aS9EaXJMaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLnVpOworCitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZpbGVGaWx0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLkZzVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuZHVtcHJlbmRlcnRyZWUyLlRlc3RzTGlzdEFjdGl2aXR5OworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmR1bXByZW5kZXJ0cmVlMi5mb3J3YXJkZXIuRm9yd2FyZGVyTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFuIEFjdGl2aXR5IHRoYXQgYWxsb3dzIG5hdmlnYXRpbmcgdGhyb3VnaCB0ZXN0cyBmb2xkZXJzIGFuZCBjaG9vc2luZyBmb2xkZXJzIG9yIHRlc3RzIHRvIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIERpckxpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJEaXJMaXN0QWN0aXZpdHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUl9QQVRIID0KKyAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgImFuZHJvaWQiICsKKyAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgIkxheW91dFRlc3RzIjsKKworICAgIC8qKiBUT0RPOiBUaGlzIGlzIGp1c3QgYSBndWVzcyAtIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBhY2hpZXZlIGl0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FQU5fVElUTEVfQ0hBUl9TSVpFID0gMTM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPR1JFU1NfRElBTE9HX0RFTEFZX01TID0gMjAwOworCisgICAgLyoqIENvZGUgZm9yIHRoZSBkaWFsb2csIHVzZWQgaW4gc2hvd0RpYWxvZyBhbmQgb25DcmVhdGVEaWFsb2cgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElBTE9HX1JVTl9BQk9SVF9ESVIgPSAwOworCisgICAgLyoqIE1lc3NhZ2VzIGNvZGVzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19MT0FERURfSVRFTVMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cgPSAxOworCisgICAgLyoqIEluaXRpYWxpemVkIGxhemlseSBiZWZvcmUgZmlyc3Qgc1Byb2dyZXNzRGlhbG9nLnNob3coKSAqLworICAgIHByaXZhdGUgc3RhdGljIFByb2dyZXNzRGlhbG9nIHNQcm9ncmVzc0RpYWxvZzsKKworICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OworCisgICAgLyoqIFRoaXMgaXMgYSByZWxhdGl2ZSBwYXRoISAqLworICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RGlyUGF0aDsKKworICAgIC8qKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0YW50LCBidXQgcmF0aGVyIGJlIGNvbmZpZ3VyYWJsZSBmcm9tIHNvbWV3aGVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtUm9vdERpclBhdGggPSBST09UX0RJUl9QQVRIOworCisgICAgcHJpdmF0ZSBGaWxlRmlsdGVyIG1GaWxlRmlsdGVyOworCisgICAgLyoqCisgICAgICogQSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgZnJvbSBzZCBjYXJkCisgICAgICogYW5kIHNlbmRpbmcgdGhlbSB2aWEgTWVzc2FnZSB0byBtYWluIHRocmVhZCB0aGF0IHRoZW4gbG9hZHMgdGhlbSBpbnRvCisgICAgICogTGlzdFZpZXcKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIExvYWRMaXN0SXRlbXNUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisKKyAgICAgICAgcHVibGljIExvYWRMaXN0SXRlbXNUaHJlYWQoU3RyaW5nIHJlbGF0aXZlUGF0aCwgSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfTE9BREVEX0lURU1TKTsKKyAgICAgICAgICAgIG1zZy5vYmogPSBnZXREaXJMaXN0KG1SZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcnkgc2ltcGxlIG9iamVjdCB0byB1c2UgaW5zaWRlIExpc3RWaWV3IGFzIGFuIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdEl0ZW0gaW1wbGVtZW50cyBDb21wYXJhYmxlPExpc3RJdGVtPiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1SZWxhdGl2ZVBhdGg7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzRGlyZWN0b3J5OworCisgICAgICAgIHB1YmxpYyBMaXN0SXRlbShTdHJpbmcgcmVsYXRpdmVQYXRoLCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtUmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgbU5hbWUgPSBuZXcgRmlsZShyZWxhdGl2ZVBhdGgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG1Jc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlzRGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0SXRlbSBhbm90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5jb21wYXJlVG8oYW5vdGhlci5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbVJlbGF0aXZlUGF0aC5lcXVhbHMoKChMaXN0SXRlbSlvKS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUmVsYXRpdmVQYXRoLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9tIGFkYXB0ZXIgdGhhdCBzZXRzIHRoZSBwcm9wZXIgaWNvbiBhbmQgbGFiZWwgaW4gdGhlIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaXJMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxMaXN0SXRlbT4geworICAgICAgICBwcml2YXRlIEFjdGl2aXR5IG1Db250ZXh0OworICAgICAgICBwcml2YXRlIExpc3RJdGVtW10gbUl0ZW1zOworCisgICAgICAgIHB1YmxpYyBEaXJMaXN0QWRhcHRlcihBY3Rpdml0eSBjb250ZXh0LCBMaXN0SXRlbVtdIGl0ZW1zKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBSLmxheW91dC5kaXJsaXN0X3JvdywgaXRlbXMpOworCisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICBtSXRlbXMgPSBpdGVtczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIgPSBtQ29udGV4dC5nZXRMYXlvdXRJbmZsYXRlcigpOworICAgICAgICAgICAgVmlldyByb3cgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmRpcmxpc3Rfcm93LCBudWxsKTsKKworICAgICAgICAgICAgVGV4dFZpZXcgbGFiZWwgPSAoVGV4dFZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmxhYmVsKTsKKyAgICAgICAgICAgIGxhYmVsLnNldFRleHQobUl0ZW1zW3Bvc2l0aW9uXS5nZXROYW1lKCkpOworCisgICAgICAgICAgICBJbWFnZVZpZXcgaWNvbiA9IChJbWFnZVZpZXcpcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworICAgICAgICAgICAgaWYgKG1JdGVtc1twb3NpdGlvbl0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLmZvbGRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGljb24uc2V0SW1hZ2VSZXNvdXJjZShSLmRyYXdhYmxlLnJ1bnRlc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZvcndhcmRlck1hbmFnZXIuZ2V0Rm9yd2FyZGVyTWFuYWdlcigpLnN0YXJ0KCk7CisKKyAgICAgICAgbUZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcihST09UX0RJUl9QQVRIKTsKKyAgICAgICAgbUxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihuZXcgQWRhcHRlclZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2hvd0RpcihpdGVtLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiogUnVuIHRoZSB0ZXN0ICovCisgICAgICAgICAgICAgICAgICAgIHJ1bkFsbFRlc3RzVW5kZXIoaXRlbS5nZXRSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtTGlzdFZpZXcuc2V0T25JdGVtTG9uZ0NsaWNrTGlzdGVuZXIobmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUxvbmdDbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkl0ZW1Mb25nQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgIExpc3RJdGVtIGl0ZW0gPSAoTGlzdEl0ZW0pcGFyZW50LmdldEl0ZW1BdFBvc2l0aW9uKHBvc2l0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGFyZ3VtZW50cyA9IG5ldyBCdW5kbGUoMSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoIm5hbWUiLCBpdGVtLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5wdXRTdHJpbmcoInJlbGF0aXZlUGF0aCIsIGl0ZW0uZ2V0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBzaG93RGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qKiBUT0RPOiBNYXliZSBzaG93IHNvbWUgaW5mbyBhYm91dCBhIHRlc3Q/ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8qKiBBbGwgdGhlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0ZXN0IHJvb3QgZGlyIHdoZXJlIHBvc3NpYmxlICovCisgICAgICAgIHNob3dEaXIoIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5BbGxUZXN0c1VuZGVyKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzKERpckxpc3RBY3Rpdml0eS50aGlzLCBUZXN0c0xpc3RBY3Rpdml0eS5jbGFzcyk7CisgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVGVzdHNMaXN0QWN0aXZpdHkuRVhUUkFfVEVTVF9QQVRILCByZWxhdGl2ZVBhdGgpOworICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lmd1aV9tZW51LCBtZW51KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisgICAgICAgICAgICBjYXNlIFIuaWQucnVuX2FsbDoKKyAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKG1DdXJyZW50RGlyUGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICAvKioKKyAgICAgKiBNb3ZlcyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBpZiBvbmUgZXhpc3RzLiBEb2VzIG5vdCBhbGxvdyB0byBtb3ZlIGFib3ZlCisgICAgICogdGhlIHRlc3QgJ3Jvb3QnIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkJhY2tQcmVzc2VkKCkgeworICAgICAgICBGaWxlIGN1cnJlbnREaXJQYXJlbnQgPSBuZXcgRmlsZShtQ3VycmVudERpclBhdGgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKGN1cnJlbnREaXJQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2hvd0RpcihjdXJyZW50RGlyUGFyZW50LmdldFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93RGlyKCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIHRoZSBhY3Rpdml0eSBmcm9tIHJlY3JlYXRpbmcgb24gY2hhbmdlIG9mIG9yaWVudGF0aW9uLiBUaGUgdGl0bGUgbmVlZHMgdG8KKyAgICAgKiBiZSByZWNhbGN1bGF0ZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisKKyAgICAgICAgc2V0VGl0bGUoc2hvcnRlblRpdGxlKG1DdXJyZW50RGlyUGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEaWFsb2cgb25DcmVhdGVEaWFsb2coaW50IGlkLCBmaW5hbCBCdW5kbGUgYXJncykgeworICAgICAgICBEaWFsb2cgZGlhbG9nID0gbnVsbDsKKyAgICAgICAgQWxlcnREaWFsb2cuQnVpbGRlciBidWlsZGVyID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcyk7CisKKyAgICAgICAgc3dpdGNoIChpZCkgeworICAgICAgICAgICAgY2FzZSBESUFMT0dfUlVOX0FCT1JUX0RJUjoKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfdGl0bGVfcHJlZml4KSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmdldFN0cmluZygibmFtZSIpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldE1lc3NhZ2UoUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfbXNnKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENhbmNlbGFibGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBvc2l0aXZlQnV0dG9uKFIuc3RyaW5nLmRpYWxvZ19ydW5fYWJvcnRfZGlyX29rX2J1dHRvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURpYWxvZyhESUFMT0dfUlVOX0FCT1JUX0RJUik7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5BbGxUZXN0c1VuZGVyKGFyZ3MuZ2V0U3RyaW5nKCJyZWxhdGl2ZVBhdGgiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuZGlhbG9nX3J1bl9hYm9ydF9kaXJfYWJvcnRfYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGlhbG9nKERJQUxPR19SVU5fQUJPUlRfRElSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgZGlhbG9nID0gYnVpbGRlci5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcihuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2FuY2VsTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbmNlbChEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEaWFsb2coRElBTE9HX1JVTl9BQk9SVF9ESVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGlhbG9nOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiBkaXIgaW50byB0aGUgbGlzdCB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGRpclBhdGgKKyAgICAgKiAgICAgIGRpcmVjdG9yeSB0byBsb2FkIGludG8gbGlzdCB2aWV3CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNob3dEaXIoU3RyaW5nIGRpclBhdGgpIHsKKyAgICAgICAgbUN1cnJlbnREaXJQYXRoID0gZGlyUGF0aDsKKworICAgICAgICAvKiogU2hvdyBwcm9ncmVzcyBkaWFsb2cgd2l0aCBhIGRlbGF5ICovCisgICAgICAgIGZpbmFsIEhhbmRsZXIgZGVsYXllZERpYWxvZ0hhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfU0hPV19QUk9HUkVTU19ESUFMT0cpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NEaWFsb2coRGlyTGlzdEFjdGl2aXR5LnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldENhbmNlbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc1Byb2dyZXNzRGlhbG9nLnNldFByb2dyZXNzU3R5bGUoUHJvZ3Jlc3NEaWFsb2cuU1RZTEVfU1BJTk5FUik7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuc2V0VGl0bGUoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKGdldFRleHQoUi5zdHJpbmcuZGlhbG9nX3Byb2dyZXNzX21zZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNQcm9ncmVzc0RpYWxvZy5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBNZXNzYWdlIG1zZ1Nob3dEaWFsb2cgPSBkZWxheWVkRGlhbG9nSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnNlbmRNZXNzYWdlRGVsYXllZChtc2dTaG93RGlhbG9nLCBQUk9HUkVTU19ESUFMT0dfREVMQVlfTVMpOworCisgICAgICAgIC8qKiBEZWxlZ2F0ZSBsb2FkaW5nIGNvbnRlbnRzIGZyb20gU0QgY2FyZCB0byBhIG5ldyB0aHJlYWQgKi8KKyAgICAgICAgbmV3IExvYWRMaXN0SXRlbXNUaHJlYWQobUN1cnJlbnREaXJQYXRoLCBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgICAgIGlmIChtc2cud2hhdCA9PSBNU0dfTE9BREVEX0lURU1TKSB7CisgICAgICAgICAgICAgICAgICAgIHNldExpc3RBZGFwdGVyKG5ldyBEaXJMaXN0QWRhcHRlcihEaXJMaXN0QWN0aXZpdHkudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdEl0ZW1bXSltc2cub2JqKSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ZWREaWFsb2dIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19TSE9XX1BST0dSRVNTX0RJQUxPRyk7CisgICAgICAgICAgICAgICAgICAgIHNldFRpdGxlKHNob3J0ZW5UaXRsZShtQ3VycmVudERpclBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNQcm9ncmVzc0RpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzUHJvZ3Jlc3NEaWFsb2cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KS5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGZpbmQgYSBuZWF0IHdheSB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBmaXQgaW4gdGhlIHRpdGxlCisgICAgICogYmFyLgorICAgICAqICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRlblRpdGxlKFN0cmluZyB0aXRsZSkgeworICAgICAgICBpZiAodGl0bGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgcmV0dXJuICJUZXN0cycgcm9vdCBkaXI6IjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY2hhckNvdW50ID0gbUxpc3RWaWV3LmdldFdpZHRoKCkgLyBNRUFOX1RJVExFX0NIQVJfU0laRTsKKworICAgICAgICBpZiAodGl0bGUubGVuZ3RoKCkgPiBjaGFyQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiAiLi4uIiArIHRpdGxlLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKSAtIGNoYXJDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFycmF5IHdpdGggY29udGVudHMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yeS4KKyAgICAgKiBGaXJzdCBpdCBjb250YWlucyB0aGUgc3ViZm9sZGVycywgdGhlbiB0aGUgZmlsZXMuIEJvdGggc29ydGVkCisgICAgICogYWxwaGFiZXRpY2FsbHkuCisgICAgICoKKyAgICAgKiBUaGUgZGlyUGF0aCBpcyByZWxhdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3RJdGVtW10gZ2V0RGlyTGlzdChTdHJpbmcgZGlyUGF0aCkgeworICAgICAgICBMaXN0PExpc3RJdGVtPiBzdWJEaXJzID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlbT4oKTsKKyAgICAgICAgTGlzdDxMaXN0SXRlbT4gc3ViRmlsZXMgPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVtPigpOworCisgICAgICAgIGZvciAoU3RyaW5nIGRpclJlbGF0aXZlUGF0aCA6IEZzVXRpbHMuZ2V0TGF5b3V0VGVzdHNEaXJDb250ZW50cyhkaXJQYXRoLCBmYWxzZSwKKyAgICAgICAgICAgICAgICB0cnVlKSkgeworICAgICAgICAgICAgaWYgKEZpbGVGaWx0ZXIuaXNUZXN0RGlyKG5ldyBGaWxlKGRpclJlbGF0aXZlUGF0aCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHN1YkRpcnMuYWRkKG5ldyBMaXN0SXRlbShkaXJSZWxhdGl2ZVBhdGgsIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIHRlc3RSZWxhdGl2ZVBhdGggOiBGc1V0aWxzLmdldExheW91dFRlc3RzRGlyQ29udGVudHMoZGlyUGF0aCwgZmFsc2UsCisgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICBpZiAoRmlsZUZpbHRlci5pc1Rlc3RGaWxlKG5ldyBGaWxlKHRlc3RSZWxhdGl2ZVBhdGgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBzdWJGaWxlcy5hZGQobmV3IExpc3RJdGVtKHRlc3RSZWxhdGl2ZVBhdGgsIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiogQ29uY2F0ZW5hdGUgdGhlIHR3byBsaXN0cyAqLworICAgICAgICBzdWJEaXJzLmFkZEFsbChzdWJGaWxlcyk7CisKKyAgICAgICAgcmV0dXJuIHN1YkRpcnMudG9BcnJheShuZXcgTGlzdEl0ZW1bc3ViRGlycy5zaXplKCldKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc0M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCisKK0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBId0FjY2VsZXJhdGlvblRlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGE3MjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdC5od3VpIj4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJId1VpIgorICAgICAgICBhbmRyb2lkOmhhcmR3YXJlQWNjZWxlcmF0ZWQ9InRydWUiPgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWxwaGFMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfzrFMYXllcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJSZXNpemVBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUmVzaXplIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0iYWRqdXN0UmVzaXplIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0dhbW1hIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRleHRHYW1tYUFjdGl2aXR5JFN1YkdhbW1hQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1N1YiBHYW1tYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJMYXllcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfTGF5ZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTmV3TGF5ZXJzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX05ld0xheWVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlhmZXJtb2RlQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1hmZXJtb2RlcyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9CaXRtYXBzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLlRyYW5zbHVjZW50Lk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc0FscGhhQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0JpdG1hcHNBbHBoYSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5UcmFuc2x1Y2VudC5Ob1RpdGxlQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQml0bWFwc1JlY3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQml0bWFwc1JlY3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuVHJhbnNsdWNlbnQuTm9UaXRsZUJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9Ik5pbmVQYXRjaGVzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iXzlwYXRjaCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlF1aWNrUmVqZWN0QWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1F1aWNrUmVqZWN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iUm90YXRpb25BY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUm90YXRpb24iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iU2hhZGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TaGFkZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVGV4dEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9UZXh0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9MaXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IlRyYW5zcGFyZW50TGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9UcmFuc3BhcmVudExpc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJNb3JlU2hhZGVyc0FjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TaGFkZXJzMiI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJDb2xvckZpbHRlcnNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfQ29sb3JGaWx0ZXJzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkxpbmVzQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iX0xpbmVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0iZmFsc2UiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iUGF0aHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfUGF0aHMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iVHJhbnNmb3JtM2RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfM2QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iU2ltcGxlUGF0aHNBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU2ltcGxlUGF0aHMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iQWR2YW5jZWRCbGVuZEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9BZHZhbmNlZEJsZW5kIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfRnJhbWVidWZmZXJCbGVuZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIAorCisgICAgICAgIDxhY3Rpdml0eQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iU3RhY2tBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJfU3RhY2tzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmJkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDEuanBnIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDEuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0MS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDIucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNThlZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0Mi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDMucG5nIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS1oZHBpL3N1bnNldDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDhiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlLWhkcGkvc3Vuc2V0My5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2RyYXdhYmxlL2RlZmF1bHRfd2FsbHBhcGVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNhZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9pY29uLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0MGExOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQxLmpwZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0MS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NTFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0MS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQyLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0Mi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGVlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0Mi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9kcmF3YWJsZS9zdW5zZXQzLnBuZyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0My5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwOGIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvZHJhd2FibGUvc3Vuc2V0My5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvZm9ybS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9mb3JtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE3ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvZm9ybS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAgICAgCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJGaXJzdCBuYW1lIiAvPgorICAgICAgICAKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJFbnRlciB5b3VyIGZpcnN0IG5hbWUiIC8+CisgICAgICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgIAorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iTGFzdCBuYW1lIiAvPgorICAgICAgICAKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJFbnRlciB5b3VyIGxhc3QgbmFtZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPEVkaXRUZXh0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmN2YwMDAwIiAvPgorICAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L2xpc3RfYWN0aXZpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYmEzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC9saXN0X2FjdGl2aXR5LnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorICAgICAgICAKKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJBZGQiIC8+CisgICAgICAgIAorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlbW92ZSIgLz4KKyAgICAgICAgCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDJkNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2sueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIwZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSI+CisgICAgPFN0YWNrVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YWNrX3ZpZXciIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzQ4cHgiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjM3NHB4IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOmNhY2hlQ29sb3JIaW50PSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6YXV0b1N0YXJ0PSJ0cnVlIiAvPgorPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvc3RhY2tfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNDAxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3N0YWNrX2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFja19pdGVtIiAgCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICA8RnJhbWVMYXlvdXQgIAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPiAKKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3X2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiIC8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21pbmlfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgPFRleHRWaWV3IAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIiAvPgorPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbGFyZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjM3NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X2xhcmdlLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICBhbmRyb2lkOnRleHQ9IldpZGdldCAiLz4gCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X21lZGl1bS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxOTVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9yZXMvbGF5b3V0L3RleHRfbWVkaXVtLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGV4dFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bUludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvcmVzL2xheW91dC90ZXh0X3NtYWxsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVlZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3Jlcy9sYXlvdXQvdGV4dF9zbWFsbC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbEludmVyc2UiCisgICAgYW5kcm9pZDp0ZXh0PSJXaWRnZXQgIi8+IApkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BZHZhbmNlZEJsZW5kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFhMjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQWR2YW5jZWRCbGVuZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29tcG9zZVNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgQWR2YW5jZWRCbGVuZEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIENvbXBvc2VTaGFkZXIgbUNvbXBvc2VTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTNTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTRTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTVTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZTZTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQml0bWFwU2hhZGVyIG1TY2FsZWQyU2hhZGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5CTEFDSywgQ29sb3IuV0hJVEUsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1Db21wb3NlU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgbUNvbXBvc2UzU2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworICAgICAgICAgICAgbUNvbXBvc2U0U2hhZGVyID0gbmV3IENvbXBvc2VTaGFkZXIobVNjYWxlZFNoYWRlciwgbUhvckdyYWRpZW50LAorICAgICAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU0NSRUVOKTsKKyAgICAgICAgICAgIG1Db21wb3NlNVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLkFERCk7CisgICAgICAgICAgICBtQ29tcG9zZTZTaGFkZXIgPSBuZXcgQ29tcG9zZVNoYWRlcihtSG9yR3JhZGllbnQsIG1TY2FsZWRTaGFkZXIsCisgICAgICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5PVkVSTEFZKTsKKworICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTNTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNFNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Db21wb3NlNlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9BbHBoYUxheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2OGE5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0FscGhhTGF5ZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBBbHBoYUxheWVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkh3VWkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIERpcnR5Qml0bWFwVmlldyBjb250YWluZXIgPSBuZXcgRGlydHlCaXRtYXBWaWV3KHRoaXMpOworCisgICAgICAgIENvbG9yVmlldyBjb2xvciA9IG5ldyBDb2xvclZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGNvbG9yLCBuZXcgRGlydHlCaXRtYXBWaWV3LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBkaXBUb1B4KHRoaXMsIDEwMCksIGRpcFRvUHgodGhpcywgMTAwKSwgR3Jhdml0eS5DRU5URVIpKTsKKworICAgICAgICBBbHBoYUFuaW1hdGlvbiBhID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpOworICAgICAgICBhLnNldER1cmF0aW9uKDIwMDApOworICAgICAgICBhLnNldFJlcGVhdENvdW50KEFuaW1hdGlvbi5JTkZJTklURSk7CisgICAgICAgIGEuc2V0UmVwZWF0TW9kZShBbmltYXRpb24uUkVWRVJTRSk7CisgICAgICAgIGNvbG9yLnN0YXJ0QW5pbWF0aW9uKGEpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ29sb3JWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIENvbG9yVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDAsIDI1NSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRGlydHlCaXRtYXBWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKKworICAgICAgICBEaXJ0eUJpdG1hcFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDIwMC4wZiwgMC4wZiwgMjIwLjBmLCAyMC4wZiwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMTAwLjBmLCAxMDAuMGYsIDExMC4wZiwgMTEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoMjUuMGYsIDUuMGYsIDMwLjBmLCAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnNjYWxlKDIuMGYsIDIuMGYpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDIwLjBmLCAwLjBmLCA0MC4wZiwgMjAuMGYpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgImNsaXBSZWN0ID0gIiArIGNhbnZhcy5nZXRDbGlwQm91bmRzKCkpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCg1MC4wZiwgNTAuMGYsIDYwLjBmLCA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkVkZ2VUeXBlLkJXKSk7CisgICAgICAgICAgICBMb2cuZChMT0dfVEFHLCAicmVqZWN0ZWQgPSAiICsgY2FudmFzLnF1aWNrUmVqZWN0KDI1LjBmLCA1LjBmLCAzMC4wZiwgMTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jbGlwUmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJjbGlwUmVjdCA9ICIgKyBjYW52YXMuZ2V0Q2xpcEJvdW5kcygpKTsKKyAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJyZWplY3RlZCA9ICIgKyBjYW52YXMucXVpY2tSZWplY3QoODAuMGYsIDgwLjBmLCA5MC4wZiwgOTAuMGYsCisgICAgICAgICAgICAgICAgICAgIENhbnZhcy5FZGdlVHlwZS5CVykpOworICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInJlamVjdGVkID0gIiArIGNhbnZhcy5xdWlja1JlamVjdCgyNS4wZiwgNS4wZiwgMzAuMGYsIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuRWRnZVR5cGUuQlcpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuc2NhbGUoMi4wZiwgMi4wZik7ICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMjAuMGYsIDAuMGYsIDQwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMC4wZiwgMjAuMGYsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1QYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgyMC4wZiwgMC4wZiwgNDAuMGYsIDIwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzdG9yZVRvID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXJBbHBoYSgwLjBmLCAxMDAuMGYsIGdldFdpZHRoKCksIDE1MC4wZiwgMTI3LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyB8IENhbnZhcy5DTElQX1RPX0xBWUVSX1NBVkVfRkxBRyk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMTAwLjBmLCA0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmYwMGZmZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDQwLjBmLCAxMDAuMGYsIDE0MC4wZiwgMTUwLjBmLCBtUGFpbnQpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDE0MC4wZiwgMTAwLjBmLCAyNDAuMGYsIDE1MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChyZXN0b3JlVG8pOworCisgICAgICAgICAgICBzdXBlci5kaXNwYXRjaERyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1NDM1MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5TY2FsZUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEJpdG1hcHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIGZpbmFsIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg0ODAsIDgwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICAgICAgCisgICAgICAgIFNjYWxlQW5pbWF0aW9uIGEgPSBuZXcgU2NhbGVBbmltYXRpb24oMS4wZiwgMi4wZiwgMS4wZiwgMi4wZiwKKyAgICAgICAgICAgICAgICBTY2FsZUFuaW1hdGlvbi5SRUxBVElWRV9UT19TRUxGLCAwLjVmLAorICAgICAgICAgICAgICAgIFNjYWxlQW5pbWF0aW9uLlJFTEFUSVZFX1RPX1NFTEYsMC41Zik7CisgICAgICAgIGEuc2V0RHVyYXRpb24oMjAwMCk7CisgICAgICAgIGEuc2V0UmVwZWF0Q291bnQoQW5pbWF0aW9uLklORklOSVRFKTsKKyAgICAgICAgYS5zZXRSZXBlYXRNb2RlKEFuaW1hdGlvbi5SRVZFUlNFKTsKKyAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQml0bWFwc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtQml0bWFwUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAxOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQb3J0ZXJEdWZmWGZlcm1vZGUgbURzdEluOworCisgICAgICAgIEJpdG1hcHNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUJpdG1hcDIgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0Mik7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbURzdEluID0gbmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0lOKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJpdG1hcFBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMjUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtQml0bWFwMi5nZXRXaWR0aCgpLCBtQml0bWFwMi5nZXRIZWlnaHQoKSwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRYZmVybW9kZShtRHN0SW4pOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1CaXRtYXBQYWludCk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5yZXNldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc0FscGhhQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0OWM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0JpdG1hcHNBbHBoYUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEJpdG1hcHNBbHBoYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQml0bWFwc1ZpZXcgdmlldyA9IG5ldyBCaXRtYXBzVmlldyh0aGlzKTsKKyAgICAgICAgZmluYWwgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyh2aWV3LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDQ4MCwgODAwLCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1CaXRtYXAyOworICAgICAgICBwcml2YXRlIEJpdG1hcCBtQml0bWFwMzsKKworICAgICAgICBCaXRtYXBzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiTG9hZGluZyBzdW5zZXQxLCBkZWZhdWx0IG9wdGlvbnMiKTsKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIkxvYWRpbmcgc3Vuc2V0MiwgZGVmYXVsdCBvcHRpb25zIik7CisgICAgICAgICAgICBtQml0bWFwMiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQyKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJMb2FkaW5nIHN1bnNldDMsIGZvcmNpbmcgQVJHQi04ODg4Iik7CisgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0cyA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKKyAgICAgICAgICAgIG9wdHMuaW5QcmVmZXJyZWRDb25maWcgPSBCaXRtYXAuQ29uZmlnLkFSR0JfODg4ODsKKyAgICAgICAgICAgIG1CaXRtYXAzID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDMsIG9wdHMpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIiAgICBoYXMgYml0bWFwIGFscGhhPyAiICsgbUJpdG1hcDMuaGFzQWxwaGEoKSk7CisKKyAgICAgICAgICAgIG1CaXRtYXBQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgIj09PT09PT09PT09PT09PT09IERyYXciKTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDUwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQml0bWFwUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMjUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMjUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDMsIDAuMGYsIDAuMGYsIG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQml0bWFwc1JlY3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTIyMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9CaXRtYXBzUmVjdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBCaXRtYXBzUmVjdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgZmluYWwgQml0bWFwc1ZpZXcgdmlldyA9IG5ldyBCaXRtYXBzVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpdG1hcHNWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbUJpdG1hcFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdCBtU3JjUmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0RiBtRHN0UmVjdDI7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtQml0bWFwMiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQyKTsKKworICAgICAgICAgICAgbUJpdG1hcFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtQml0bWFwUGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCBmb3VydGggPSBtQml0bWFwMS5nZXRXaWR0aCgpIC8gNC4wZjsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGhhbGYgPSBtQml0bWFwMS5nZXRIZWlnaHQoKSAvIDIuMGY7CisgICAgICAgICAgICBtU3JjUmVjdCA9IG5ldyBSZWN0KChpbnQpIGZvdXJ0aCwgKGludCkgKGhhbGYgLSBoYWxmIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIChmb3VydGggKyBmb3VydGgpLCAoaW50KSAoaGFsZiArIGhhbGYgLyAyLjBmKSk7CisgICAgICAgICAgICBtRHN0UmVjdCA9IG5ldyBSZWN0Rihmb3VydGgsIGhhbGYgLSBoYWxmIC8gMi4wZiwgZm91cnRoICsgZm91cnRoLCBoYWxmICsgaGFsZiAvIDIuMGYpOworICAgICAgICAgICAgbURzdFJlY3QyID0gbmV3IFJlY3RGKGZvdXJ0aCwgaGFsZiAtIGhhbGYgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAoZm91cnRoICsgZm91cnRoKSAqIDMuMGYsIChoYWxmICsgaGFsZiAvIDIuMGYpICogMy4wZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDEyMC4wZiwgNTAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIG1TcmNSZWN0LCBtRHN0UmVjdCwgbUJpdG1hcFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCBtQml0bWFwMS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC0xMDAuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBtU3JjUmVjdCwgbURzdFJlY3QyLCBtQml0bWFwUGFpbnQpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0NvbG9yRmlsdGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDYzZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Db2xvckZpbHRlcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JNYXRyaXhDb2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkxpZ2h0aW5nQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBDb2xvckZpbHRlcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIEJpdG1hcHNWaWV3IHZpZXcgPSBuZXcgQml0bWFwc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaXRtYXBzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUNvbG9yTWF0cml4UGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxpZ2h0aW5nUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJsZW5kUGFpbnQ7CisKKyAgICAgICAgQml0bWFwc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtQml0bWFwMiA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UoYy5nZXRSZXNvdXJjZXMoKSwgUi5kcmF3YWJsZS5zdW5zZXQyKTsKKworICAgICAgICAgICAgbUNvbG9yTWF0cml4UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIGZpbmFsIENvbG9yTWF0cml4IGNvbG9yTWF0cml4ID0gbmV3IENvbG9yTWF0cml4KCk7CisgICAgICAgICAgICBjb2xvck1hdHJpeC5zZXRTYXR1cmF0aW9uKDApOworICAgICAgICAgICAgbUNvbG9yTWF0cml4UGFpbnQuc2V0Q29sb3JGaWx0ZXIobmV3IENvbG9yTWF0cml4Q29sb3JGaWx0ZXIoY29sb3JNYXRyaXgpKTsKKworICAgICAgICAgICAgbUxpZ2h0aW5nUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MaWdodGluZ1BhaW50LnNldENvbG9yRmlsdGVyKG5ldyBMaWdodGluZ0NvbG9yRmlsdGVyKDB4MDA2MGZmZmYsIDB4MDAxMDEwMzApKTsKKworICAgICAgICAgICAgbUJsZW5kUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1CbGVuZFBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoMHg3Zjk5MDA0MCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUNvbG9yTWF0cml4UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDUwLjBmICsgbUJpdG1hcDEuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDEsIDAuMGYsIDAuMGYsIG1MaWdodGluZ1BhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAxLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAwLjBmLCAwLjBmLCBtQmxlbmRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYgKyBtQml0bWFwMS5nZXRXaWR0aCgpICsgMTIwLjBmLCA1MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMiwgMC4wZiwgMC4wZiwgbUNvbG9yTWF0cml4UGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDUwLjBmICsgbUJpdG1hcDIuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobUJpdG1hcDIsIDAuMGYsIDAuMGYsIG1MaWdodGluZ1BhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA1MC4wZiArIG1CaXRtYXAyLmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAyLCAwLjBmLCAwLjBmLCBtQmxlbmRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9GcmFtZWJ1ZmZlckJsZW5kQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU2YmFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvRnJhbWVidWZmZXJCbGVuZEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZYZmVybW9kZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEZyYW1lYnVmZmVyQmxlbmRBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcobmV3IEJsZW5kVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJsZW5kVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgbVRleHR1cmU7CisKKyAgICAgICAgQmxlbmRWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1UZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gbVRleHR1cmUuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIG1UZXhIZWlnaHQgPSBtVGV4dHVyZS5nZXRIZWlnaHQoKTsKKworICAgICAgICAgICAgbUhvckdyYWRpZW50ID0gbmV3IExpbmVhckdyYWRpZW50KDAuMGYsIDAuMGYsIG1UZXhXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuQkxBQ0ssIENvbG9yLldISVRFLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXAoY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUuREFSS0VOKTsKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLkxJR0hURU4pOworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXAoY2FudmFzLCBQb3J0ZXJEdWZmLk1vZGUuTVVMVElQTFkpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1UZXhXaWR0aCArIDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIGRyYXdCbGVuZGVkQml0bWFwKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLlNDUkVFTik7CisgICAgICAgICAgICBkcmF3QmxlbmRlZEJpdG1hcChjYW52YXMsIFBvcnRlckR1ZmYuTW9kZS5BREQpOworICAgICAgICAgICAgZHJhd0JsZW5kZWRCaXRtYXBJbnZlcnNlKGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlLk9WRVJMQVkpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdCbGVuZGVkQml0bWFwKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgbVBhaW50LnNldFhmZXJtb2RlKG51bGwpOworICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVRleHR1cmUsIDAuMGYsIDAuMGYsIG1QYWludCk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtVGV4V2lkdGgsIG1UZXhIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtVGV4SGVpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmF3QmxlbmRlZEJpdG1hcEludmVyc2UoQ2FudmFzIGNhbnZhcywgUG9ydGVyRHVmZi5Nb2RlIG1vZGUpIHsKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShudWxsKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtVGV4V2lkdGgsIG1UZXhIZWlnaHQsIG1QYWludCk7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobnVsbCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtVGV4dHVyZSwgMC4wZiwgMC4wZiwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1UZXhIZWlnaHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGF5ZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwNTExNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xheWVyc0FjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgTGF5ZXJzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgTGF5ZXJzVmlldyh0aGlzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExheWVyc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGF5ZXJQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUmVjdFBhaW50OworCisgICAgICAgIExheWVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTQwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMjUuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDUwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMDAuMGYsIDEwMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDEyNS4wZik7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldEFscGhhKDI1NSk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkNfT1VUKSk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4ZmZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDUwLjBmLCAyNS4wZiwgMTUwLjBmLCA3NS4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTI1LjBmKTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0QWxwaGEoMjU1KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAxMDAuMGYsIDUwLjBmLCBtUmVjdFBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBtTGF5ZXJQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgbUxheWVyUGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuRFNUX0FUT1ApKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmVMYXllcig1MC4wZiwgMjUuMGYsIDE1MC4wZiwgNzUuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoNTAuMGYsIDI1LjBmLCAxNTAuMGYsIDc1LjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmVUb0NvdW50KGNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxheWVyUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpbmVzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhkZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvTGluZXNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpbmVzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBMaW5lc1ZpZXcgdmlldyA9IG5ldyBMaW5lc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMaW5lc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0W10gbVBvaW50czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtQWxwaGFQYWludDsKKworICAgICAgICBMaW5lc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworCisgICAgICAgICAgICBtTWVkaXVtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0U3Ryb2tlV2lkdGgoNC4wZik7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDBmZjAwKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFN0cm9rZVdpZHRoKDE1LjBmKTsKKworICAgICAgICAgICAgbUFscGhhUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1BbHBoYVBhaW50LnNldENvbG9yKDB4N2ZmZjAwNTApOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U3Ryb2tlV2lkdGgoMTAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcihtQml0bWFwMSwgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgQml0bWFwU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisKKyAgICAgICAgICAgIG1Qb2ludHMgPSBuZXcgZmxvYXRbXSB7CisgICAgICAgICAgICAgICAgICAgIDYyLjBmLCAwLjBmLCAzMDIuMGYsIDQwMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgMzAyLjBmLCA0MDAuMGYsIDM1Mi4wZiwgNDAwLjBmLAorICAgICAgICAgICAgICAgICAgICAzNTIuMGYsIDQwMC4wZiwgMzUyLjBmLCA1MDAuMGYKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAyMC4wZik7CisKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAwLjBmLCA0MC4wZiwgNDAwLjBmLCBtU21hbGxQYWludCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUoNS4wZiwgMC4wZiwgOTUuMGYsIDQwMC4wZiwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgyMi4wZiwgMC4wZiwgMTYyLjBmLCA0MDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDQyLjBmLCAwLjBmLCAyMjIuMGYsIDQwMC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmVzKG1Qb2ludHMsIG1BbHBoYVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMjAuMGYsIDAuMGYpOworICAgICAgICAgICAgbUFscGhhUGFpbnQuc2V0U2hhZGVyKG1TaGFkZXIpOyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lcyhtUG9pbnRzLCBtQWxwaGFQYWludCk7CisgICAgICAgICAgICBtQWxwaGFQYWludC5zZXRTaGFkZXIobnVsbCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDRmNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9MaXN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIExpc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRBX0xJU1QgPSB7CisgICAgICAgICAgICAiQWZnaGFuaXN0YW4iLCAiQWxiYW5pYSIsICJBbGdlcmlhIiwgIkFtZXJpY2FuIFNhbW9hIiwgIkFuZG9ycmEiLAorICAgICAgICAgICAgIkFuZ29sYSIsICJBbmd1aWxsYSIsICJBbnRhcmN0aWNhIiwgIkFudGlndWEgYW5kIEJhcmJ1ZGEiLCAiQXJnZW50aW5hIiwKKyAgICAgICAgICAgICJBcm1lbmlhIiwgIkFydWJhIiwgIkF1c3RyYWxpYSIsICJBdXN0cmlhIiwgIkF6ZXJiYWlqYW4iLAorICAgICAgICAgICAgIkJhaHJhaW4iLCAiQmFuZ2xhZGVzaCIsICJCYXJiYWRvcyIsICJCZWxhcnVzIiwgIkJlbGdpdW0iLAorICAgICAgICAgICAgIkJlbGl6ZSIsICJCZW5pbiIsICJCZXJtdWRhIiwgIkJodXRhbiIsICJCb2xpdmlhIiwKKyAgICAgICAgICAgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgIkJvdHN3YW5hIiwgIkJvdXZldCBJc2xhbmQiLCAiQnJhemlsIiwKKyAgICAgICAgICAgICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiLCAiQnJpdGlzaCBWaXJnaW4gSXNsYW5kcyIsICJCcnVuZWkiLCAiQnVsZ2FyaWEiLAorICAgICAgICAgICAgIkJ1cmtpbmEgRmFzbyIsICJCdXJ1bmRpIiwgIkNvdGUgZCdJdm9pcmUiLCAiQ2FtYm9kaWEiLCAiQ2FtZXJvb24iLCAiQ2FuYWRhIiwgIkNhcGUgVmVyZGUiLAorICAgICAgICAgICAgIkNheW1hbiBJc2xhbmRzIiwgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsICJDaGFkIiwgIkNoaWxlIiwgIkNoaW5hIiwKKyAgICAgICAgICAgICJDaHJpc3RtYXMgSXNsYW5kIiwgIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzIiwgIkNvbG9tYmlhIiwgIkNvbW9yb3MiLCAiQ29uZ28iLAorICAgICAgICAgICAgIkNvb2sgSXNsYW5kcyIsICJDb3N0YSBSaWNhIiwgIkNyb2F0aWEiLCAiQ3ViYSIsICJDeXBydXMiLCAiQ3plY2ggUmVwdWJsaWMiLAorICAgICAgICAgICAgIkRlbW9jcmF0aWMgUmVwdWJsaWMgb2YgdGhlIENvbmdvIiwgIkRlbm1hcmsiLCAiRGppYm91dGkiLCAiRG9taW5pY2EiLCAiRG9taW5pY2FuIFJlcHVibGljIiwKKyAgICAgICAgICAgICJFYXN0IFRpbW9yIiwgIkVjdWFkb3IiLCAiRWd5cHQiLCAiRWwgU2FsdmFkb3IiLCAiRXF1YXRvcmlhbCBHdWluZWEiLCAiRXJpdHJlYSIsCisgICAgICAgICAgICAiRXN0b25pYSIsICJFdGhpb3BpYSIsICJGYWVyb2UgSXNsYW5kcyIsICJGYWxrbGFuZCBJc2xhbmRzIiwgIkZpamkiLCAiRmlubGFuZCIsCisgICAgICAgICAgICAiRm9ybWVyIFl1Z29zbGF2IFJlcHVibGljIG9mIE1hY2Vkb25pYSIsICJGcmFuY2UiLCAiRnJlbmNoIEd1aWFuYSIsICJGcmVuY2ggUG9seW5lc2lhIiwKKyAgICAgICAgICAgICJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXMiLCAiR2Fib24iLCAiR2VvcmdpYSIsICJHZXJtYW55IiwgIkdoYW5hIiwgIkdpYnJhbHRhciIsCisgICAgICAgICAgICAiR3JlZWNlIiwgIkdyZWVubGFuZCIsICJHcmVuYWRhIiwgIkd1YWRlbG91cGUiLCAiR3VhbSIsICJHdWF0ZW1hbGEiLCAiR3VpbmVhIiwgIkd1aW5lYS1CaXNzYXUiLAorICAgICAgICAgICAgIkd1eWFuYSIsICJIYWl0aSIsICJIZWFyZCBJc2xhbmQgYW5kIE1jRG9uYWxkIElzbGFuZHMiLCAiSG9uZHVyYXMiLCAiSG9uZyBLb25nIiwgIkh1bmdhcnkiLAorICAgICAgICAgICAgIkljZWxhbmQiLCAiSW5kaWEiLCAiSW5kb25lc2lhIiwgIklyYW4iLCAiSXJhcSIsICJJcmVsYW5kIiwgIklzcmFlbCIsICJJdGFseSIsICJKYW1haWNhIiwKKyAgICAgICAgICAgICJKYXBhbiIsICJKb3JkYW4iLCAiS2F6YWtoc3RhbiIsICJLZW55YSIsICJLaXJpYmF0aSIsICJLdXdhaXQiLCAiS3lyZ3l6c3RhbiIsICJMYW9zIiwKKyAgICAgICAgICAgICJMYXR2aWEiLCAiTGViYW5vbiIsICJMZXNvdGhvIiwgIkxpYmVyaWEiLCAiTGlieWEiLCAiTGllY2h0ZW5zdGVpbiIsICJMaXRodWFuaWEiLCAiTHV4ZW1ib3VyZyIsCisgICAgICAgICAgICAiTWFjYXUiLCAiTWFkYWdhc2NhciIsICJNYWxhd2kiLCAiTWFsYXlzaWEiLCAiTWFsZGl2ZXMiLCAiTWFsaSIsICJNYWx0YSIsICJNYXJzaGFsbCBJc2xhbmRzIiwKKyAgICAgICAgICAgICJNYXJ0aW5pcXVlIiwgIk1hdXJpdGFuaWEiLCAiTWF1cml0aXVzIiwgIk1heW90dGUiLCAiTWV4aWNvIiwgIk1pY3JvbmVzaWEiLCAiTW9sZG92YSIsCisgICAgICAgICAgICAiTW9uYWNvIiwgIk1vbmdvbGlhIiwgIk1vbnRzZXJyYXQiLCAiTW9yb2NjbyIsICJNb3phbWJpcXVlIiwgIk15YW5tYXIiLCAiTmFtaWJpYSIsCisgICAgICAgICAgICAiTmF1cnUiLCAiTmVwYWwiLCAiTmV0aGVybGFuZHMiLCAiTmV0aGVybGFuZHMgQW50aWxsZXMiLCAiTmV3IENhbGVkb25pYSIsICJOZXcgWmVhbGFuZCIsCisgICAgICAgICAgICAiTmljYXJhZ3VhIiwgIk5pZ2VyIiwgIk5pZ2VyaWEiLCAiTml1ZSIsICJOb3Jmb2xrIElzbGFuZCIsICJOb3J0aCBLb3JlYSIsICJOb3J0aGVybiBNYXJpYW5hcyIsCisgICAgICAgICAgICAiTm9yd2F5IiwgIk9tYW4iLCAiUGFraXN0YW4iLCAiUGFsYXUiLCAiUGFuYW1hIiwgIlBhcHVhIE5ldyBHdWluZWEiLCAiUGFyYWd1YXkiLCAiUGVydSIsCisgICAgICAgICAgICAiUGhpbGlwcGluZXMiLCAiUGl0Y2Fpcm4gSXNsYW5kcyIsICJQb2xhbmQiLCAiUG9ydHVnYWwiLCAiUHVlcnRvIFJpY28iLCAiUWF0YXIiLAorICAgICAgICAgICAgIlJldW5pb24iLCAiUm9tYW5pYSIsICJSdXNzaWEiLCAiUndhbmRhIiwgIlNxbyBUb21lIGFuZCBQcmluY2lwZSIsICJTYWludCBIZWxlbmEiLAorICAgICAgICAgICAgIlNhaW50IEtpdHRzIGFuZCBOZXZpcyIsICJTYWludCBMdWNpYSIsICJTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIiwKKyAgICAgICAgICAgICJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lcyIsICJTYW1vYSIsICJTYW4gTWFyaW5vIiwgIlNhdWRpIEFyYWJpYSIsICJTZW5lZ2FsIiwKKyAgICAgICAgICAgICJTZXljaGVsbGVzIiwgIlNpZXJyYSBMZW9uZSIsICJTaW5nYXBvcmUiLCAiU2xvdmFraWEiLCAiU2xvdmVuaWEiLCAiU29sb21vbiBJc2xhbmRzIiwKKyAgICAgICAgICAgICJTb21hbGlhIiwgIlNvdXRoIEFmcmljYSIsICJTb3V0aCBHZW9yZ2lhIGFuZCB0aGUgU291dGggU2FuZHdpY2ggSXNsYW5kcyIsICJTb3V0aCBLb3JlYSIsCisgICAgICAgICAgICAiU3BhaW4iLCAiU3JpIExhbmthIiwgIlN1ZGFuIiwgIlN1cmluYW1lIiwgIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW4iLCAiU3dhemlsYW5kIiwgIlN3ZWRlbiIsCisgICAgICAgICAgICAiU3dpdHplcmxhbmQiLCAiU3lyaWEiLCAiVGFpd2FuIiwgIlRhamlraXN0YW4iLCAiVGFuemFuaWEiLCAiVGhhaWxhbmQiLCAiVGhlIEJhaGFtYXMiLAorICAgICAgICAgICAgIlRoZSBHYW1iaWEiLCAiVG9nbyIsICJUb2tlbGF1IiwgIlRvbmdhIiwgIlRyaW5pZGFkIGFuZCBUb2JhZ28iLCAiVHVuaXNpYSIsICJUdXJrZXkiLAorICAgICAgICAgICAgIlR1cmttZW5pc3RhbiIsICJUdXJrcyBhbmQgQ2FpY29zIElzbGFuZHMiLCAiVHV2YWx1IiwgIlZpcmdpbiBJc2xhbmRzIiwgIlVnYW5kYSIsCisgICAgICAgICAgICAiVWtyYWluZSIsICJVbml0ZWQgQXJhYiBFbWlyYXRlcyIsICJVbml0ZWQgS2luZ2RvbSIsCisgICAgICAgICAgICAiVW5pdGVkIFN0YXRlcyIsICJVbml0ZWQgU3RhdGVzIE1pbm9yIE91dGx5aW5nIElzbGFuZHMiLCAiVXJ1Z3VheSIsICJVemJla2lzdGFuIiwKKyAgICAgICAgICAgICJWYW51YXR1IiwgIlZhdGljYW4gQ2l0eSIsICJWZW5lenVlbGEiLCAiVmlldG5hbSIsICJXYWxsaXMgYW5kIEZ1dHVuYSIsICJXZXN0ZXJuIFNhaGFyYSIsCisgICAgICAgICAgICAiWWVtZW4iLCAiWXVnb3NsYXZpYSIsICJaYW1iaWEiLCAiWmltYmFid2UiCisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGlzdF9hY3Rpdml0eSk7CisKKyAgICAgICAgTGlzdEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVMaXN0QWRhcHRlcih0aGlzKTsKKworICAgICAgICBMaXN0VmlldyBsaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0KTsKKyAgICAgICAgbGlzdC5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICAKKyAgICAgICAgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShsaXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKCJDb250ZXh0IG1lbnUiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMiIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHVibGljIFNpbXBsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIERBVEFfTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHYgPSAoVGV4dFZpZXcpIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gci5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgdi5zZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZygoaW50KSAoNiAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKHIuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Nb3JlU2hhZGVyc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYTQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL01vcmVTaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbXBvc2VTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaWdodGluZ0NvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBNb3JlU2hhZGVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtU2NhbGVkU2hhZGVyOworICAgICAgICBwcml2YXRlIGludCBtVGV4V2lkdGg7CisgICAgICAgIHByaXZhdGUgaW50IG1UZXhIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3V2lkdGg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbURyYXdIZWlnaHQ7CisgICAgICAgIHByaXZhdGUgTGluZWFyR3JhZGllbnQgbUhvckdyYWRpZW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1WZXJ0R3JhZGllbnQ7CisgICAgICAgIHByaXZhdGUgQ29tcG9zZVNoYWRlciBtQ29tcG9zZVNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NlU2hhZGVyIG1Db21wb3NlMlNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBQYWludCBtTGFyZ2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZDJTaGFkZXI7CisgICAgICAgIHByaXZhdGUgQ29sb3JGaWx0ZXIgbUNvbG9yRmlsdGVyOworCisgICAgICAgIFNoYWRlcnNWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIEJpdG1hcCB0ZXh0dXJlID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbVRleFdpZHRoID0gdGV4dHVyZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgbVRleEhlaWdodCA9IHRleHR1cmUuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBtRHJhd1dpZHRoID0gbVRleFdpZHRoICogMi4yZjsKKyAgICAgICAgICAgIG1EcmF3SGVpZ2h0ID0gbVRleEhlaWdodCAqIDEuMmY7CisKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0yID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTIuc2V0U2NhbGUoMC41ZiwgMC41Zik7CisgICAgICAgICAgICBtU2NhbGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0yKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZDJTaGFkZXIgPSBuZXcgQml0bWFwU2hhZGVyKHRleHR1cmUsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworICAgICAgICAgICAgTWF0cml4IG0zID0gbmV3IE1hdHJpeCgpOworICAgICAgICAgICAgbTMuc2V0U2NhbGUoMC4xZiwgMC4xZik7CisgICAgICAgICAgICBtU2NhbGVkMlNoYWRlci5zZXRMb2NhbE1hdHJpeChtMyk7CisKKyAgICAgICAgICAgIG1Ib3JHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5SRUQsIDB4N2YwMGZmMDAsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1WZXJ0R3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgMC4wZiwgbURyYXdIZWlnaHQgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5ZRUxMT1csIENvbG9yLk1BR0VOVEEsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtQ29tcG9zZVNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1TY2FsZWRTaGFkZXIsIG1Ib3JHcmFkaWVudCwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVkVSKTsKKyAgICAgICAgICAgIG1Db21wb3NlMlNoYWRlciA9IG5ldyBDb21wb3NlU2hhZGVyKG1Ib3JHcmFkaWVudCwgbVNjYWxlZFNoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLlNSQ19PVVQpOworCisgICAgICAgICAgICBtQ29sb3JGaWx0ZXIgPSBuZXcgTGlnaHRpbmdDb2xvckZpbHRlcigweDAwNjBmZmZmLCAweDAwMTAxMDMwKTsKKyAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRUZXh0U2l6ZSgzNi4wZik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRDb2xvcigweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDQwLjBmLCA0MC4wZik7CisKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobUNvbXBvc2VTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtQ29tcG9zZTJTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobUhvckdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiT3BlbkdMIHJlbmRlcmluZyIsIDAuMGYsIDIwLjBmLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihtU2NhbGVkMlNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCA2MC4wZiwgbUxhcmdlUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobUNvbXBvc2UyU2hhZGVyKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldENvbG9yRmlsdGVyKG1Db2xvckZpbHRlcik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTCByZW5kZXJpbmciLCAwLjBmLCAxMDAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldENvbG9yRmlsdGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0U2hhZGVyKG1WZXJ0R3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJPcGVuR0wgcmVuZGVyaW5nIiwgMC4wZiwgMjAuMGYsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05ld0xheWVyc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OZXdMYXllcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzc1M2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OZXdMYXllcnNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBOZXdMYXllcnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBMYXllcnNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGF5ZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1MYXllclBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1SZWN0UGFpbnQ7CisKKyAgICAgICAgTGF5ZXJzVmlldyhDb250ZXh0IGMpIHsKKyAgICAgICAgICAgIHN1cGVyKGMpOworCisgICAgICAgICAgICBtTGF5ZXJQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVJlY3RQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtUmVjdFBhaW50LnNldFRleHRTaXplKDI0LjBmKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDEyOCwgMjU1LCAxMjgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxNDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAuMGYsIDAuMGYsIDIwMC4wZiwgMTAwLjBmLCBtTGF5ZXJQYWludCwKKyAgICAgICAgICAgICAgICAgICAgQ2FudmFzLkFMTF9TQVZFX0ZMQUcpOworCisgICAgICAgICAgICBtUmVjdFBhaW50LnNldENvbG9yKDB4N2ZmZjAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KC0yMC4wZiwgLTIwLjBmLCAyMjAuMGYsIDEyMC4wZiwgbVJlY3RQYWludCk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgc3RyaW5nIHRvIG92ZXJsYXAgYmV0d2VlbiBsYXllcnMgYW5kIGZyYW1lYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgLTEwMC4wZiwgNTAuMGYsIG1SZWN0UGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoY291bnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1MYXllclBhaW50LnNldEFscGhhKDEyNyk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5zYXZlTGF5ZXIoMC4wZiwgMC4wZiwgMjAwLjBmLCAxMDAuMGYsIG1MYXllclBhaW50LAorICAgICAgICAgICAgICAgICAgICBDYW52YXMuSEFTX0FMUEhBX0xBWUVSX1NBVkVfRkxBRyk7CisKKyAgICAgICAgICAgIG1SZWN0UGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTIwLjBmLCAtMjAuMGYsIDIyMC4wZiwgMTIwLjBmLCBtUmVjdFBhaW50KTsKKworICAgICAgICAgICAgbVJlY3RQYWludC5zZXRDb2xvcigweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBzdHJpbmcgdG8gb3ZlcmxhcCBiZXR3ZWVuIGxheWVycyBhbmQgZnJhbWVidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAtMTAwLjBmLCA1MC4wZiwgbVJlY3RQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9OaW5lUGF0Y2hlc0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMGY3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL05pbmVQYXRjaGVzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBOaW5lUGF0Y2hlc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIEZyYW1lTGF5b3V0IGxheW91dCA9IG5ldyBGcmFtZUxheW91dCh0aGlzKTsKKyAgICAgICAgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKHRoaXMpOworICAgICAgICBiLnNldExheW91dFBhcmFtcyhuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgYi5zZXRUZXh0KCI5IHBhdGNoZXMiKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcoYik7CisgICAgICAgIGxheW91dC5zZXRCYWNrZ3JvdW5kQ29sb3IoMHhmZmZmZmZmZik7CisgICAgICAgIAorICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1BhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDliZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUGF0aHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBTaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhdGg7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFBhdGhzQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBQYXRoc1ZpZXcgdmlldyA9IG5ldyBQYXRoc1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBQYXRoc1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNtYWxsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbU1lZGl1bVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1MYXJnZVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcFNoYWRlciBtU2hhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggbVBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVjdEYgbVBhdGhCb3VuZHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUJvdW5kc1BhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtQml0bWFwOworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1PZmZzZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbUxpbmVQYWludDsKKworICAgICAgICBQYXRoc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJpdG1hcDEgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisKKyAgICAgICAgICAgIG1TbWFsbFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU21hbGxQYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKyAgICAgICAgICAgIG1TbWFsbFBhaW50LnNldFN0cm9rZVdpZHRoKDEuMGYpOworICAgICAgICAgICAgbVNtYWxsUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUxpbmVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtTGluZVBhaW50LnNldENvbG9yKDB4ZmZmZjAwZmYpOworICAgICAgICAgICAgbUxpbmVQYWludC5zZXRTdHJva2VXaWR0aCgxLjBmKTsKKyAgICAgICAgICAgIG1MaW5lUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKKworICAgICAgICAgICAgbU1lZGl1bVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtTWVkaXVtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldENvbG9yKDB4ZmYwMDAwZmYpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFN0cm9rZVdpZHRoKDEwLjBmKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0Q29sb3IoMHhmZjAwZmYwMCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHJva2VXaWR0aCgxNS4wZik7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKKworICAgICAgICAgICAgbVNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIobUJpdG1hcDEsIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IsCisgICAgICAgICAgICAgICAgICAgIEJpdG1hcFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUGF0aCA9IG5ldyBQYXRoKCk7CisgICAgICAgICAgICBtUGF0aC5tb3ZlVG8oMC4wZiwgMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDAuMGYsIDAuMGYsIDEwMC4wZiwgMTUwLjBmLCAxMDAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKDEwMC4wZiwgMjAwLjBmLCA1MC4wZiwgMzAwLjBmLCAtODAuMGYsIDIwMC4wZik7CisgICAgICAgICAgICBtUGF0aC5jdWJpY1RvKC04MC4wZiwgMjAwLjBmLCAxMDAuMGYsIDIwMC4wZiwgMjAwLjBmLCAwLjBmKTsKKworICAgICAgICAgICAgbVBhdGhCb3VuZHMgPSBuZXcgUmVjdEYoKTsKKyAgICAgICAgICAgIG1QYXRoLmNvbXB1dGVCb3VuZHMobVBhdGhCb3VuZHMsIHRydWUpOworCisgICAgICAgICAgICBtQm91bmRzUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1Cb3VuZHNQYWludC5zZXRDb2xvcigweDQwMDBmZjAwKTsKKworICAgICAgICAgICAgbU9mZnNldCA9IG1NZWRpdW1QYWludC5nZXRTdHJva2VXaWR0aCgpOworICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gKGludCkgKG1QYXRoQm91bmRzLndpZHRoKCkgKyBtT2Zmc2V0ICogMy4wZiArIDAuNWYpOworICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IChpbnQpIChtUGF0aEJvdW5kcy5oZWlnaHQoKSArIG1PZmZzZXQgKiAzLjBmICsgMC41Zik7CisgICAgICAgICAgICBtQml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh3aWR0aCwgaGVpZ2h0LCBCaXRtYXAuQ29uZmlnLkFMUEhBXzgpOworICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMobUJpdG1hcCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKC1tUGF0aEJvdW5kcy5sZWZ0ICsgbU9mZnNldCAqIDEuNWYsIC1tUGF0aEJvdW5kcy50b3AgKyBtT2Zmc2V0ICogMS41Zik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1NZWRpdW1QYWludCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjAwLjBmLCA2MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1TbWFsbFBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgzNTAuMGYsIDAuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtTWVkaXVtUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDIwMC4wZiwgMzYwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UGF0aChtUGF0aCwgbVNtYWxsUGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KG1QYXRoQm91bmRzLCBtQm91bmRzUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwLCBtUGF0aEJvdW5kcy5sZWZ0IC0gbU9mZnNldCAqIDEuNWYsCisgICAgICAgICAgICAgICAgICAgIG1QYXRoQm91bmRzLnRvcCAtIG1PZmZzZXQgKiAxLjVmLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgwLjBmLCAtMzYwLjBmLCAwLjBmLCA1MDAuMGYsIG1MaW5lUGFpbnQpOworCisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRTaGFkZXIobVNoYWRlcik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDM1MC4wZiwgMC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1BhdGgobVBhdGgsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdChtUGF0aEJvdW5kcywgbUJvdW5kc1BhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRlcihudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9RdWlja1JlamVjdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9RdWlja1JlamVjdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5MmJmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1F1aWNrUmVqZWN0QWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUXVpY2tSZWplY3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGZpbmFsIFF1aWNrUmVqZWN0VmlldyB2aWV3ID0gbmV3IFF1aWNrUmVqZWN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFF1aWNrUmVqZWN0VmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIFBhaW50IG1CaXRtYXBQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisKKyAgICAgICAgUXVpY2tSZWplY3RWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworCisgICAgICAgICAgICBtQml0bWFwUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1CaXRtYXBQYWludC5zZXRGaWx0ZXJCaXRtYXAodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQ9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciBzYXZlPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJnZXRTYXZlQ291bnQgYWZ0ZXIgc2F2ZT0iICsgY291bnQpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIGNvdW50ID0gY2FudmFzLmdldFNhdmVDb3VudCgpOworICAgICAgICAgICAgTG9nLmQoIk9wZW5HTFJlbmRlcmVyIiwgImNvdW50IGFmdGVyIHJlc3RvcmU9IiArIGNvdW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZT0iICsgY2FudmFzLmdldFNhdmVDb3VudCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZT0iICsgY2FudmFzLmdldFNhdmVDb3VudCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZT0iICsgY2FudmFzLmdldFNhdmVDb3VudCgpKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJjb3VudCBhZnRlciByZXN0b3JlVG9Db3VudD0iICsgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuc2F2ZUxheWVyKDAsIDAsIDEwLCAxMCwgbUJpdG1hcFBhaW50LCBDYW52YXMuQUxMX1NBVkVfRkxBRyk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgc2F2ZUxheWVyPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjb3VudCA9IGNhbnZhcy5nZXRTYXZlQ291bnQoKTsKKyAgICAgICAgICAgIExvZy5kKCJPcGVuR0xSZW5kZXJlciIsICJnZXRTYXZlQ291bnQgYWZ0ZXIgc2F2ZUxheWVyPSIgKyBjb3VudCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICAgICAgY291bnQgPSBjYW52YXMuZ2V0U2F2ZUNvdW50KCk7CisgICAgICAgICAgICBMb2cuZCgiT3BlbkdMUmVuZGVyZXIiLCAiY291bnQgYWZ0ZXIgcmVzdG9yZT0iICsgY291bnQpOworCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLmNsaXBSZWN0KDAuMGYsIDAuMGYsIDQwLjBmLCA0MC4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwMSwgMC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCAtbUJpdG1hcDEuZ2V0V2lkdGgoKSwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCA1MC4wZiwgMC4wZiwgbUJpdG1hcFBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvUmVzaXplQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1Jlc2l6ZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmOWRlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1Jlc2l6ZUFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBSZXNpemVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mb3JtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Sb3RhdGlvbkFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9Sb3RhdGlvbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMDliNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1JvdGF0aW9uQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgUm90YXRpb25BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcgY29udGFpbmVyID0gbmV3IERyYXdpbmdWaWV3KHRoaXMpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRhaW5lcik7CisgICAgfQorICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKKyAgICBzdGF0aWMgaW50IGRpcFRvUHgoQ29udGV4dCBjLCBpbnQgZGlwKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKiBkaXAgKyAwLjVmKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgRHJhd2luZ1ZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGFpbnQ7CisKKyAgICAgICAgRHJhd2luZ1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKyAgICAgICAgICAgIG1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZGlwVG9QeChnZXRDb250ZXh0KCksIDQwMCksIGRpcFRvUHgoZ2V0Q29udGV4dCgpLCAyMDApKTsKKyAgICAgICAgICAgIGNhbnZhcy5yb3RhdGUoNDUuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSR0IoMjU1LCAyNTUsIDI1NSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoLTgwLjBmLCAtODAuMGYsIDgwLjBmLCA4MC4wZiwgbVBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCAyMjAuMGYsIDIyMC4wZiwgbVBhaW50KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TaGFkZXJzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NoYWRlcnNBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGU3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TaGFkZXJzQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5MaW5lYXJHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgU2hhZGVyc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2hhZGVyc1ZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaGFkZXJzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtUmVwZWF0U2hhZGVyOworICAgICAgICBwcml2YXRlIEJpdG1hcFNoYWRlciBtVHJhbnNsYXRlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXBTaGFkZXIgbVNjYWxlZFNoYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleFdpZHRoOworICAgICAgICBwcml2YXRlIGludCBtVGV4SGVpZ2h0OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRHJhd1dpZHRoOworICAgICAgICBwcml2YXRlIGZsb2F0IG1EcmF3SGVpZ2h0OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1Ib3JHcmFkaWVudDsKKyAgICAgICAgcHJpdmF0ZSBMaW5lYXJHcmFkaWVudCBtRGlhZ0dyYWRpZW50OworICAgICAgICBwcml2YXRlIExpbmVhckdyYWRpZW50IG1WZXJ0R3JhZGllbnQ7CisKKyAgICAgICAgU2hhZGVyc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgQml0bWFwIHRleHR1cmUgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVJlc291cmNlKGMuZ2V0UmVzb3VyY2VzKCksIFIuZHJhd2FibGUuc3Vuc2V0MSk7CisgICAgICAgICAgICBtVGV4V2lkdGggPSB0ZXh0dXJlLmdldFdpZHRoKCk7CisgICAgICAgICAgICBtVGV4SGVpZ2h0ID0gdGV4dHVyZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIG1EcmF3V2lkdGggPSBtVGV4V2lkdGggKiAyLjJmOworICAgICAgICAgICAgbURyYXdIZWlnaHQgPSBtVGV4SGVpZ2h0ICogMS4yZjsKKworICAgICAgICAgICAgbVJlcGVhdFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLlJFUEVBVCk7CisKKyAgICAgICAgICAgIG1UcmFuc2xhdGVkU2hhZGVyID0gbmV3IEJpdG1hcFNoYWRlcih0ZXh0dXJlLCBTaGFkZXIuVGlsZU1vZGUuUkVQRUFULAorICAgICAgICAgICAgICAgICAgICBTaGFkZXIuVGlsZU1vZGUuUkVQRUFUKTsKKyAgICAgICAgICAgIE1hdHJpeCBtMSA9IG5ldyBNYXRyaXgoKTsKKyAgICAgICAgICAgIG0xLnNldFRyYW5zbGF0ZShtVGV4V2lkdGggLyAyLjBmLCBtVGV4SGVpZ2h0IC8gMi4wZik7CisgICAgICAgICAgICBtMS5wb3N0Um90YXRlKDQ1LCAwLCAwKTsKKyAgICAgICAgICAgIG1UcmFuc2xhdGVkU2hhZGVyLnNldExvY2FsTWF0cml4KG0xKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVNjYWxlZFNoYWRlciA9IG5ldyBCaXRtYXBTaGFkZXIodGV4dHVyZSwgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgU2hhZGVyLlRpbGVNb2RlLk1JUlJPUik7CisgICAgICAgICAgICBNYXRyaXggbTIgPSBuZXcgTWF0cml4KCk7CisgICAgICAgICAgICBtMi5zZXRTY2FsZSgwLjVmLCAwLjVmKTsKKyAgICAgICAgICAgIG1TY2FsZWRTaGFkZXIuc2V0TG9jYWxNYXRyaXgobTIpOworCisgICAgICAgICAgICBtSG9yR3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgQ29sb3IuUkVELCBDb2xvci5HUkVFTiwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbURpYWdHcmFkaWVudCA9IG5ldyBMaW5lYXJHcmFkaWVudCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoIC8gMS41ZiwgbURyYXdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIENvbG9yLkJMVUUsIENvbG9yLk1BR0VOVEEsIFNoYWRlci5UaWxlTW9kZS5DTEFNUCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1WZXJ0R3JhZGllbnQgPSBuZXcgTGluZWFyR3JhZGllbnQoMC4wZiwgMC4wZiwgMC4wZiwgbURyYXdIZWlnaHQgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICBDb2xvci5ZRUxMT1csIENvbG9yLk1BR0VOVEEsIFNoYWRlci5UaWxlTW9kZS5NSVJST1IpOworCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAvL2NhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICAvLyBCaXRtYXAgc2hhZGVycworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoNDAuMGYsIDQwLjBmKTsKKworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtUmVwZWF0U2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCA0MC4wZiArIG1EcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1QYWludC5zZXRTaGFkZXIobVRyYW5zbGF0ZWRTaGFkZXIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtU2NhbGVkU2hhZGVyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKworICAgICAgICAgICAgLy8gR3JhZGllbnRzCisgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSg0MC4wZiArIG1EcmF3V2lkdGggKyA0MC4wZiwgNDAuMGYpOworCisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1Ib3JHcmFkaWVudCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgbURyYXdXaWR0aCwgbURyYXdIZWlnaHQsIG1QYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgNDAuMGYgKyBtRHJhd0hlaWdodCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0U2hhZGVyKG1EaWFnR3JhZGllbnQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIG1EcmF3V2lkdGgsIG1EcmF3SGVpZ2h0LCBtUGFpbnQpOworCisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDQwLjBmICsgbURyYXdIZWlnaHQpOworICAgICAgICAgICAgbVBhaW50LnNldFNoYWRlcihtVmVydEdyYWRpZW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCBtRHJhd1dpZHRoLCBtRHJhd0hlaWdodCwgbVBhaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NpbXBsZVBhdGhzQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2UxOGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU2ltcGxlUGF0aHNBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgU2ltcGxlUGF0aHNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgRnJhbWVMYXlvdXQgbGF5b3V0ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBFZGl0VGV4dCB0ZXh0ID0gbmV3IEVkaXRUZXh0KHRoaXMpOworICAgICAgICBsYXlvdXQuYWRkVmlldyh0ZXh0LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDYwMCwgMzUwLCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICB0ZXh0LnNldFRleHQoIlRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhbiBFZGl0VGV4dCB3aWRnZXQgXG4iICsKKyAgICAgICAgICAgICAgICAidXNpbmcgc2ltcGxlIHBhdGhzIHRvIGNyZWF0ZSB0aGUgc2VsZWN0aW9uLiIpOworICAgICAgICAvL3RleHQuc2V0U2VsZWN0aW9uKDAsIHRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TdGFja0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9TdGFja0FjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1NWFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1N0YWNrQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU3RhY2tWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgU3RhY2tBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuc3RhY2spOworCisgICAgICAgIFN0YWNrVmlldyBzdGFjayA9IChTdGFja1ZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YWNrX3ZpZXcpOworICAgICAgICBzdGFjay5zZXRBZGFwdGVyKG5ldyBBcnJheUFkYXB0ZXI8RHJhd2FibGU+KHRoaXMsIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pZC50ZXh0MSwgbmV3IERyYXdhYmxlW10geworICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5zdW5zZXQxKSwKKyAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuc3Vuc2V0MiksCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBWaWV3IGl0ZW0gPSBjb252ZXJ0VmlldzsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBMYXlvdXRJbmZsYXRlci5mcm9tKGdldENvbnRleHQoKSkuaW5mbGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5zdGFja19pdGVtLCBudWxsLCBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKChJbWFnZVZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudGV4dHZpZXdfaWNvbikpLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtKHBvc2l0aW9uICUgZ2V0Q291bnQoKSkpOworICAgICAgICAgICAgICAgICgoVGV4dFZpZXcpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubWluaV90ZXh0KSkuc2V0VGV4dCgiIiArIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHN0YWNrLnNldERpc3BsYXllZENoaWxkKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwZGY1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgVGV4dEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgQ3VzdG9tVGV4dFZpZXcodGhpcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDdXN0b21UZXh0VmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1NZWRpdW1QYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtTGFyZ2VQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtU3RyaWtlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVNjYWxlZFBhaW50OworCisgICAgICAgIEN1c3RvbVRleHRWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1NZWRpdW1QYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRDb2xvcigweGZmZmYwMDAwKTsKKworICAgICAgICAgICAgbUxhcmdlUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFRleHRTaXplKDM2LjBmKTsKKworICAgICAgICAgICAgbVN0cmlrZVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtU3RyaWtlUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFRleHRTaXplKDE2LjBmKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRVbmRlcmxpbmVUZXh0KHRydWUpOworCisgICAgICAgICAgICBtU2NhbGVkUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNpemUoMTYuMGYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UkdCKDI1NSwgMjU1LCAyNTUpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDIwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5DRU5URVIpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA0MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uUklHSFQpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA2MCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRUZXh0QWxpZ24oUGFpbnQuQWxpZ24uTEVGVCk7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCAxMDAsIDEwMCwgbU1lZGl1bVBhaW50KTsKKyAgICAgICAgICAgIG1NZWRpdW1QYWludC5zZXRTaGFkb3dMYXllcigyLjVmLCAwLjBmLCAwLjBmLCAweGZmMDAwMDAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMTUwLCBtTWVkaXVtUGFpbnQpOworICAgICAgICAgICAgbU1lZGl1bVBhaW50LmNsZWFyU2hhZG93TGF5ZXIoKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMjAwLCBtTGFyZ2VQYWludCk7CisKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRvd0xheWVyKDIuNWYsIDMuMGYsIDMuMGYsIDB4ZmYwMDAwMDApOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgMTAwLCA0MDAsIG1MYXJnZVBhaW50KTsKKyAgICAgICAgICAgIG1MYXJnZVBhaW50LnNldFNoYWRvd0xheWVyKDMuMGYsIDMuMGYsIDMuMGYsIDB4ZmYwMGZmMDApOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuc2V0QWxwaGEoMTAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgNTAwLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBtTGFyZ2VQYWludC5zZXRBbHBoYSgyNTUpOworICAgICAgICAgICAgbUxhcmdlUGFpbnQuY2xlYXJTaGFkb3dMYXllcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDQwLCBtU3RyaWtlUGFpbnQpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFN0cmlrZVRocnVUZXh0KHRydWUpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCA3MCwgbVN0cmlrZVBhaW50KTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRVbmRlcmxpbmVUZXh0KGZhbHNlKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMTAwLCBtU3RyaWtlUGFpbnQpOworICAgICAgICAgICAgbVN0cmlrZVBhaW50LnNldFN0cmlrZVRocnVUZXh0KGZhbHNlKTsKKyAgICAgICAgICAgIG1TdHJpa2VQYWludC5zZXRVbmRlcmxpbmVUZXh0KHRydWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtU2NhbGVkUGFpbnQuc2V0VGV4dFNjYWxlWCgwLjVmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDUwMCwgMjAwLCBtU2NhbGVkUGFpbnQpOworICAgICAgICAgICAgbVNjYWxlZFBhaW50LnNldFRleHRTY2FsZVgoMi4wZik7CisgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIkhlbGxvIE9wZW5HTCByZW5kZXJlciEiLCA1MDAsIDIzMCwgbVNjYWxlZFBhaW50KTsKKyAgICAgICAgICAgIG1TY2FsZWRQYWludC5zZXRUZXh0U2NhbGVYKDEuMGYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJIZWxsbyBPcGVuR0wgcmVuZGVyZXIhIiwgNTAwLCAyNjAsIG1TY2FsZWRQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMuY2xpcFJlY3QoMTUwLjBmLCAyMjAuMGYsIDQ1MC4wZiwgMzIwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiSGVsbG8gT3BlbkdMIHJlbmRlcmVyISIsIDEwMCwgMzAwLCBtTGFyZ2VQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHRHYW1tYUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0R2FtbWFBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3M2QzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0R2FtbWFBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkNvbG9yRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBUZXh0R2FtbWFBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgZmluYWwgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CisgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOworCisgICAgICAgIGZpbmFsIEdhbW1hVGV4dFZpZXcgZ2FtbWEgPSBuZXcgR2FtbWFUZXh0Vmlldyh0aGlzKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcoZ2FtbWEsIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVAorICAgICAgICApKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOworICAgICAgICAKKyAgICAgICAgbGF5b3V0LnBvc3QobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgQml0bWFwIGIgPSBCaXRtYXAuY3JlYXRlQml0bWFwKGdhbW1hLmdldFdpZHRoKCksIGdhbW1hLmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICAgICAgICAgIENhbnZhcyBjID0gbmV3IENhbnZhcyhiKTsKKyAgICAgICAgICAgICAgICBjLmRyYXdDb2xvcigwLCBQb3J0ZXJEdWZmLk1vZGUuQ0xFQVIpOworICAgICAgICAgICAgICAgIGdhbW1hLmRyYXcoYyk7CisKKyAgICAgICAgICAgICAgICBJbWFnZVZpZXcgaW1hZ2UgPSBuZXcgSW1hZ2VWaWV3KFRleHRHYW1tYUFjdGl2aXR5LnRoaXMpOworICAgICAgICAgICAgICAgIGltYWdlLnNldEltYWdlQml0bWFwKGIpOworCisgICAgICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoaW1hZ2UsIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVAorICAgICAgICAgICAgICAgICkpOworCisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KFRleHRHYW1tYUFjdGl2aXR5LnRoaXMsIFN1YkdhbW1hQWN0aXZpdHkuY2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlKG5ldyBDb2xvckRyYXdhYmxlKDB4ZmZmZmZmZmYpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgR2FtbWFUZXh0VmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgICAgIEdhbW1hVGV4dFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKDB4ZmZmZmZmZmYpOworCisgICAgICAgICAgICBmaW5hbCBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oYyk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfbGFyZ2UsIHRoaXMsIHRydWUpOworICAgICAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC50ZXh0X21lZGl1bSwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRleHRfc21hbGwsIHRoaXMsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJHYW1tYUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgZmluYWwgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CisgICAgICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKyAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBHYW1tYVRleHRWaWV3IGdhbW1hID0gbmV3IEdhbW1hVGV4dFZpZXcodGhpcyk7CisgICAgICAgICAgICBmaW5hbCBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIGxwID0gbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGxwLnNldE1hcmdpbnMoMCwgNzQsIDAsIDApOworICAgICAgICAgICAgbGF5b3V0LmFkZFZpZXcoZ2FtbWEsIGxwKTsKKworICAgICAgICAgICAgc2V0Q29udGVudFZpZXcobGF5b3V0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zZm9ybTNkQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY2NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVHJhbnNmb3JtM2RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbWVyYTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFRyYW5zZm9ybTNkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBmaW5hbCBUcmFuc2Zvcm0zZFZpZXcgdmlldyA9IG5ldyBUcmFuc2Zvcm0zZFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KHZpZXcpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBUcmFuc2Zvcm0zZFZpZXcgZXh0ZW5kcyBWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUJpdG1hcDE7CisgICAgICAgIHByaXZhdGUgQ2FtZXJhIG1DYW1lcmE7CisgICAgICAgIHByaXZhdGUgTWF0cml4IG1NYXRyaXg7CisKKyAgICAgICAgVHJhbnNmb3JtM2RWaWV3KENvbnRleHQgYykgeworICAgICAgICAgICAgc3VwZXIoYyk7CisKKyAgICAgICAgICAgIG1CaXRtYXAxID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShjLmdldFJlc291cmNlcygpLCBSLmRyYXdhYmxlLnN1bnNldDEpOworICAgICAgICAgICAgbUNhbWVyYSA9IG5ldyBDYW1lcmEoKTsKKyAgICAgICAgICAgIG1NYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgICAgICBjYW52YXMuZHJhd0FSR0IoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgZmluYWwgZmxvYXQgY2VudGVyWCA9IGdldFdpZHRoKCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0V2lkdGgoKSAvIDIuMGY7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBjZW50ZXJZID0gZ2V0SGVpZ2h0KCkgLyAyLjBmIC0gbUJpdG1hcDEuZ2V0SGVpZ2h0KCkgLyAyLjBmOworICAgICAgICAgICAgZmluYWwgQ2FtZXJhIGNhbWVyYSA9IG1DYW1lcmE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIE1hdHJpeCBtYXRyaXggPSBtTWF0cml4OworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDMyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAwLjBmLCBtYXRyaXgpOworCisgICAgICAgICAgICByb3RhdGUoY2VudGVyWCwgY2VudGVyWSwgY2FtZXJhLCBtYXRyaXgsIDEyLjBmKTsKKyAgICAgICAgICAgIGRyYXdCaXRtYXAoY2FudmFzLCBjZW50ZXJYLCBjZW50ZXJZLCAtbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCA1Mi4wZik7CisgICAgICAgICAgICBkcmF3Qml0bWFwKGNhbnZhcywgY2VudGVyWCwgY2VudGVyWSwgbUJpdG1hcDEuZ2V0V2lkdGgoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcm90YXRlKGNlbnRlclgsIGNlbnRlclksIGNhbWVyYSwgbWF0cml4LCAxMjIuMGYpOworICAgICAgICAgICAgZHJhd0JpdG1hcChjYW52YXMsIGNlbnRlclgsIGNlbnRlclksIG1CaXRtYXAxLmdldFdpZHRoKCkgKiAyLjBmLCBtYXRyaXgpOworICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0JpdG1hcChDYW52YXMgY2FudmFzLCBmbG9hdCBjZW50ZXJYLCBmbG9hdCBjZW50ZXJZLCBmbG9hdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCkgeworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUob2Zmc2V0LCAwLjBmKTsKKyAgICAgICAgICAgIGNhbnZhcy5jb25jYXQobWF0cml4KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAxLCBjZW50ZXJYLCBjZW50ZXJZLCBudWxsKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcm90YXRlKGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIENhbWVyYSBjYW1lcmEsCisgICAgICAgICAgICAgICAgTWF0cml4IG1hdHJpeCwgZmxvYXQgYW5nbGUpIHsKKyAgICAgICAgICAgIGNhbWVyYS5zYXZlKCk7CisgICAgICAgICAgICBjYW1lcmEucm90YXRlWShhbmdsZSk7CisgICAgICAgICAgICBjYW1lcmEuZ2V0TWF0cml4KG1hdHJpeCk7CisgICAgICAgICAgICBjYW1lcmEucmVzdG9yZSgpOworCisgICAgICAgICAgICBtYXRyaXgucHJlVHJhbnNsYXRlKC1jZW50ZXJYLCAtY2VudGVyWSk7CisgICAgICAgICAgICBtYXRyaXgucG9zdFRyYW5zbGF0ZShjZW50ZXJYLCBjZW50ZXJZKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RyYW5zcGFyZW50TGlzdEFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc3BhcmVudExpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0N2IwMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UcmFuc3BhcmVudExpc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCitwdWJsaWMgY2xhc3MgVHJhbnNwYXJlbnRMaXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFUQV9MSVNUID0geworICAgICAgICAgICAgIkFmZ2hhbmlzdGFuIiwgIkFsYmFuaWEiLCAiQWxnZXJpYSIsICJBbWVyaWNhbiBTYW1vYSIsICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLCAiQW5ndWlsbGEiLCAiQW50YXJjdGljYSIsICJBbnRpZ3VhIGFuZCBCYXJidWRhIiwgIkFyZ2VudGluYSIsCisgICAgICAgICAgICAiQXJtZW5pYSIsICJBcnViYSIsICJBdXN0cmFsaWEiLCAiQXVzdHJpYSIsICJBemVyYmFpamFuIiwKKyAgICAgICAgICAgICJCYWhyYWluIiwgIkJhbmdsYWRlc2giLCAiQmFyYmFkb3MiLCAiQmVsYXJ1cyIsICJCZWxnaXVtIiwKKyAgICAgICAgICAgICJCZWxpemUiLCAiQmVuaW4iLCAiQmVybXVkYSIsICJCaHV0YW4iLCAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhIGFuZCBIZXJ6ZWdvdmluYSIsICJCb3Rzd2FuYSIsICJCb3V2ZXQgSXNsYW5kIiwgIkJyYXppbCIsCisgICAgICAgICAgICAiQnJpdGlzaCBJbmRpYW4gT2NlYW4gVGVycml0b3J5IiwgIkJyaXRpc2ggVmlyZ2luIElzbGFuZHMiLCAiQnJ1bmVpIiwgIkJ1bGdhcmlhIiwKKyAgICAgICAgICAgICJCdXJraW5hIEZhc28iLCAiQnVydW5kaSIsICJDb3RlIGQnSXZvaXJlIiwgIkNhbWJvZGlhIiwgIkNhbWVyb29uIiwgIkNhbmFkYSIsICJDYXBlIFZlcmRlIiwKKyAgICAgICAgICAgICJDYXltYW4gSXNsYW5kcyIsICJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMiLCAiQ2hhZCIsICJDaGlsZSIsICJDaGluYSIsCisgICAgICAgICAgICAiQ2hyaXN0bWFzIElzbGFuZCIsICJDb2NvcyAoS2VlbGluZykgSXNsYW5kcyIsICJDb2xvbWJpYSIsICJDb21vcm9zIiwgIkNvbmdvIiwKKyAgICAgICAgICAgICJDb29rIElzbGFuZHMiLCAiQ29zdGEgUmljYSIsICJDcm9hdGlhIiwgIkN1YmEiLCAiQ3lwcnVzIiwgIkN6ZWNoIFJlcHVibGljIiwKKyAgICAgICAgICAgICJEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZSBDb25nbyIsICJEZW5tYXJrIiwgIkRqaWJvdXRpIiwgIkRvbWluaWNhIiwgIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiRWFzdCBUaW1vciIsICJFY3VhZG9yIiwgIkVneXB0IiwgIkVsIFNhbHZhZG9yIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiwgIkVyaXRyZWEiLAorICAgICAgICAgICAgIkVzdG9uaWEiLCAiRXRoaW9waWEiLCAiRmFlcm9lIElzbGFuZHMiLCAiRmFsa2xhbmQgSXNsYW5kcyIsICJGaWppIiwgIkZpbmxhbmQiLAorICAgICAgICAgICAgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiLCAiRnJhbmNlIiwgIkZyZW5jaCBHdWlhbmEiLCAiRnJlbmNoIFBvbHluZXNpYSIsCisgICAgICAgICAgICAiRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIiwgIkdhYm9uIiwgIkdlb3JnaWEiLCAiR2VybWFueSIsICJHaGFuYSIsICJHaWJyYWx0YXIiLAorICAgICAgICAgICAgIkdyZWVjZSIsICJHcmVlbmxhbmQiLCAiR3JlbmFkYSIsICJHdWFkZWxvdXBlIiwgIkd1YW0iLCAiR3VhdGVtYWxhIiwgIkd1aW5lYSIsICJHdWluZWEtQmlzc2F1IiwKKyAgICAgICAgICAgICJHdXlhbmEiLCAiSGFpdGkiLCAiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzIiwgIkhvbmR1cmFzIiwgIkhvbmcgS29uZyIsICJIdW5nYXJ5IiwKKyAgICAgICAgICAgICJJY2VsYW5kIiwgIkluZGlhIiwgIkluZG9uZXNpYSIsICJJcmFuIiwgIklyYXEiLCAiSXJlbGFuZCIsICJJc3JhZWwiLCAiSXRhbHkiLCAiSmFtYWljYSIsCisgICAgICAgICAgICAiSmFwYW4iLCAiSm9yZGFuIiwgIkthemFraHN0YW4iLCAiS2VueWEiLCAiS2lyaWJhdGkiLCAiS3V3YWl0IiwgIkt5cmd5enN0YW4iLCAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwgIkxlYmFub24iLCAiTGVzb3RobyIsICJMaWJlcmlhIiwgIkxpYnlhIiwgIkxpZWNodGVuc3RlaW4iLCAiTGl0aHVhbmlhIiwgIkx1eGVtYm91cmciLAorICAgICAgICAgICAgIk1hY2F1IiwgIk1hZGFnYXNjYXIiLCAiTWFsYXdpIiwgIk1hbGF5c2lhIiwgIk1hbGRpdmVzIiwgIk1hbGkiLCAiTWFsdGEiLCAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWFydGluaXF1ZSIsICJNYXVyaXRhbmlhIiwgIk1hdXJpdGl1cyIsICJNYXlvdHRlIiwgIk1leGljbyIsICJNaWNyb25lc2lhIiwgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsICJNb25nb2xpYSIsICJNb250c2VycmF0IiwgIk1vcm9jY28iLCAiTW96YW1iaXF1ZSIsICJNeWFubWFyIiwgIk5hbWliaWEiLAorICAgICAgICAgICAgIk5hdXJ1IiwgIk5lcGFsIiwgIk5ldGhlcmxhbmRzIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiwgIk5ldyBDYWxlZG9uaWEiLCAiTmV3IFplYWxhbmQiLAorICAgICAgICAgICAgIk5pY2FyYWd1YSIsICJOaWdlciIsICJOaWdlcmlhIiwgIk5pdWUiLCAiTm9yZm9sayBJc2xhbmQiLCAiTm9ydGggS29yZWEiLCAiTm9ydGhlcm4gTWFyaWFuYXMiLAorICAgICAgICAgICAgIk5vcndheSIsICJPbWFuIiwgIlBha2lzdGFuIiwgIlBhbGF1IiwgIlBhbmFtYSIsICJQYXB1YSBOZXcgR3VpbmVhIiwgIlBhcmFndWF5IiwgIlBlcnUiLAorICAgICAgICAgICAgIlBoaWxpcHBpbmVzIiwgIlBpdGNhaXJuIElzbGFuZHMiLCAiUG9sYW5kIiwgIlBvcnR1Z2FsIiwgIlB1ZXJ0byBSaWNvIiwgIlFhdGFyIiwKKyAgICAgICAgICAgICJSZXVuaW9uIiwgIlJvbWFuaWEiLCAiUnVzc2lhIiwgIlJ3YW5kYSIsICJTcW8gVG9tZSBhbmQgUHJpbmNpcGUiLCAiU2FpbnQgSGVsZW5hIiwKKyAgICAgICAgICAgICJTYWludCBLaXR0cyBhbmQgTmV2aXMiLCAiU2FpbnQgTHVjaWEiLCAiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvbiIsCisgICAgICAgICAgICAiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXMiLCAiU2Ftb2EiLCAiU2FuIE1hcmlubyIsICJTYXVkaSBBcmFiaWEiLCAiU2VuZWdhbCIsCisgICAgICAgICAgICAiU2V5Y2hlbGxlcyIsICJTaWVycmEgTGVvbmUiLCAiU2luZ2Fwb3JlIiwgIlNsb3Zha2lhIiwgIlNsb3ZlbmlhIiwgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsICJTb3V0aCBBZnJpY2EiLCAiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHMiLCAiU291dGggS29yZWEiLAorICAgICAgICAgICAgIlNwYWluIiwgIlNyaSBMYW5rYSIsICJTdWRhbiIsICJTdXJpbmFtZSIsICJTdmFsYmFyZCBhbmQgSmFuIE1heWVuIiwgIlN3YXppbGFuZCIsICJTd2VkZW4iLAorICAgICAgICAgICAgIlN3aXR6ZXJsYW5kIiwgIlN5cmlhIiwgIlRhaXdhbiIsICJUYWppa2lzdGFuIiwgIlRhbnphbmlhIiwgIlRoYWlsYW5kIiwgIlRoZSBCYWhhbWFzIiwKKyAgICAgICAgICAgICJUaGUgR2FtYmlhIiwgIlRvZ28iLCAiVG9rZWxhdSIsICJUb25nYSIsICJUcmluaWRhZCBhbmQgVG9iYWdvIiwgIlR1bmlzaWEiLCAiVHVya2V5IiwKKyAgICAgICAgICAgICJUdXJrbWVuaXN0YW4iLCAiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzIiwgIlR1dmFsdSIsICJWaXJnaW4gSXNsYW5kcyIsICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiLCAiVW5pdGVkIEtpbmdkb20iLAorICAgICAgICAgICAgIlVuaXRlZCBTdGF0ZXMiLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiwgIlVydWd1YXkiLCAiVXpiZWtpc3RhbiIsCisgICAgICAgICAgICAiVmFudWF0dSIsICJWYXRpY2FuIENpdHkiLCAiVmVuZXp1ZWxhIiwgIlZpZXRuYW0iLCAiV2FsbGlzIGFuZCBGdXR1bmEiLCAiV2VzdGVybiBTYWhhcmEiLAorICAgICAgICAgICAgIlllbWVuIiwgIll1Z29zbGF2aWEiLCAiWmFtYmlhIiwgIlppbWJhYndlIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIAorICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGUoZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5kZWZhdWx0X3dhbGxwYXBlcikpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5saXN0X2FjdGl2aXR5KTsKKworICAgICAgICBMaXN0QWRhcHRlciBhZGFwdGVyID0gbmV3IFNpbXBsZUxpc3RBZGFwdGVyKHRoaXMpOworCisgICAgICAgIExpc3RWaWV3IGxpc3QgPSAoTGlzdFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmxpc3QpOworICAgICAgICBsaXN0LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIGxpc3Quc2V0Q2FjaGVDb2xvckhpbnQoMCk7CisKKyAgICAgICAgcmVnaXN0ZXJGb3JDb250ZXh0TWVudShsaXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnUuQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlQ29udGV4dE1lbnUobWVudSwgdiwgbWVudUluZm8pOworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKCJDb250ZXh0IG1lbnUiKTsKKyAgICAgICAgbWVudS5hZGQoIkxpc3QgaXRlbSAxIik7CisgICAgICAgIG1lbnUuYWRkKCJMaXN0IGl0ZW0gMiIpOworICAgICAgICBtZW51LmFkZCgiTGlzdCBpdGVtIDMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVMaXN0QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHVibGljIFNpbXBsZUxpc3RBZGFwdGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIERBVEFfTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFRleHRWaWV3IHYgPSAoVGV4dFZpZXcpIHN1cGVyLmdldFZpZXcocG9zaXRpb24sIGNvbnZlcnRWaWV3LCBwYXJlbnQpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gci5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgdi5zZXRDb21wb3VuZERyYXdhYmxlUGFkZGluZygoaW50KSAoNiAqIG1ldHJpY3MuZGVuc2l0eSArIDAuNWYpKTsKKyAgICAgICAgICAgIHYuc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKHIuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY29uKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9YZmVybW9kZUFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExMDc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1hmZXJtb2RlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmWGZlcm1vZGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGU7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBjbGFzcyBYZmVybW9kZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KG5ldyBYZmVybW9kZXNWaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgWGZlcm1vZGVzVmlldyBleHRlbmRzIFZpZXcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1CbHVlUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVJlZFBhaW50OworCisgICAgICAgIFhmZXJtb2Rlc1ZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbUJsdWVQYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgbUJsdWVQYWludC5zZXRDb2xvcigweGZmMDAwMGZmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVJlZFBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUmVkUGFpbnQuc2V0Q29sb3IoMHg3ZmZmMDAwMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworICAgICAgICAgICAgLy9jYW52YXMuZHJhd1JHQigyNTUsIDI1NSwgMjU1KTsKKworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNSQyBtb2RlcworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1ZFUik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDX0lOKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfT1VUKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKworICAgICAgICAgICAgZHJhd1JlY3RzKGNhbnZhcywgTW9kZS5TUkNfQVRPUCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuU1JDKTsKKworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgxMDAuMGYsIDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEU1QgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09WRVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVF9JTik7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX09VVCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAuMGYsIDEwMC4wZik7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuRFNUX0FUT1ApOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworICAgICAgICAgICAgCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLkRTVCk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMTAwLjBmLCAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gT3RoZXIgbW9kZXMKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisKKyAgICAgICAgICAgIGRyYXdSZWN0cyhjYW52YXMsIE1vZGUuQ0xFQVIpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgwLjBmLCAxMDAuMGYpOworCisgICAgICAgICAgICBkcmF3UmVjdHMoY2FudmFzLCBNb2RlLlhPUik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMjcpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMC4wZiwgMTAwLjBmKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUJsdWVQYWludC5zZXRBbHBoYSgxMCk7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldENvbG9yKDB4N2YwMDAwZmYpOworICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDAuMGYsIDAuMGYsIDUwLjBmLCA1MC4wZiwgbUJsdWVQYWludCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1CbHVlUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDBmZik7CisgICAgICAgICAgICBtQmx1ZVBhaW50LnNldEFscGhhKDI1NSk7CisKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd1JlY3RzKENhbnZhcyBjYW52YXMsIFBvcnRlckR1ZmYuTW9kZSBtb2RlKSB7CisgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMC4wZiwgMC4wZiwgNTAuMGYsIDUwLjBmLCBtQmx1ZVBhaW50KTsKKworICAgICAgICAgICAgY2FudmFzLnNhdmUoKTsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoMjUuMGYsIDI1LjBmKTsKKyAgICAgICAgICAgIG1SZWRQYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKG1vZGUpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCgwLjBmLCAwLjBmLCA1MC4wZiwgNTAuMGYsIG1SZWRQYWludCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX2dtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvYXBwX3Bob25lLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJlN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiNGUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfY2hhdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4NTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3MmI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL2ljb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhNDBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfZ21haWwucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX2dtYWlsLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9hcHBfcGhvbmUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvYXBwX3Bob25lLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2FwcF9waG9uZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfY2hhdC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2NoYXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N0YXR1c2Jhcl9jaGF0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9lbWFpbC5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY19zdGF0dXNiYXJfZW1haWwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX2VtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljX3N0YXR1c2Jhcl9taXNzZWRjYWxsLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY19zdGF0dXNiYXJfbWlzc2VkY2FsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3RhdHVzYmFyX21pc3NlZGNhbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjEucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24xLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMS5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uMi5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24yLnBuZwpyZW5hbWUgdG8gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb24yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlL2ljb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uMy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjMucG5nCnJlbmFtZSB0byB0ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLW1kcGkvaWNvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUvaWNvbjQucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1tZHBpL2ljb240LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS9pY29uNC5wbmcKcmVuYW1lIHRvIHRlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtbWRwaS9pY29uNC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L05vdGlmaWNhdGlvblRlc3RMaXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQppbmRleCAzNzk3NmVlLi4xNmIzMDAxIDEwMDY0NAotLS0gYS90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvTm90aWZpY2F0aW9uVGVzdExpc3QuamF2YQpAQCAtNjMzLDIwICs2MzMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LAogCi0gICAgICAgIG5ldyBUZXN0KCJUaWNrZXIiKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuYXBwX2dtYWlsLCAKLSAgICAgICAgICAgICAgICAgICAgIk5ldyBtYWlsIGZyb20gam9lb0BleGFtcGxlLmNvbSwgb24gdGhlIHRvcGljIG9mIHZlcnkgbG9uZyB0aWNrZXIgdGV4dHMiLAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgbm90LnNldExhdGVzdEV2ZW50SW5mbyhOb3RpZmljYXRpb25UZXN0TGlzdC50aGlzLAotICAgICAgICAgICAgICAgICAgICAiQSBuZXcgbWVzc2FnZSBhd2FpdHMiLAotICAgICAgICAgICAgICAgICAgICAiVGhlIGNvbnRlbnRzIGFyZSB2ZXJ5IGludGVyZXN0aW5nIGFuZCBpbXBvcnRhbnQiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSW50ZW50KCkpOwotICAgICAgICAgICAgICAgIG1OTS5ub3RpZnkoMSwgbm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLQogICAgICAgICBuZXcgVGVzdCgiQ3Jhc2giKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YSBiL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKaW5kZXggMTA3ODcwMS4uZTMxNzExZSAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQorKysgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCkBAIC02MCwyMyArNjAsMzIgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFRlc3RbXSBtVGVzdHMgPSBuZXcgVGVzdFtdIHsKLSAgICAgICAgbmV3IFRlc3QoIkhpZGUiKSB7CisgICAgICAgIG5ldyBUZXN0KCJIaWRlIChGTEFHX0ZVTExTQ1JFRU4pIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBnZXRXaW5kb3coKTsKLSAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyB3aW5QYXJhbXMgPSB3aW4uZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdpblBhcmFtcy5mbGFncyB8PSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU47Ci0gICAgICAgICAgICAgICAgd2luLnNldEF0dHJpYnV0ZXMod2luUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB3aW4uc2V0RmxhZ3MoV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOLAorICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyh3aW4uZ2V0QXR0cmlidXRlcygpLmZsYWdzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIG5ldyBUZXN0KCJTaG93IikgeworICAgICAgICBuZXcgVGVzdCgiU2hvdyAofkZMQUdfRlVMTFNDUkVFTikiKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgV2luZG93IHdpbiA9IGdldFdpbmRvdygpOwotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHdpblBhcmFtcyA9IHdpbi5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgd2luUGFyYW1zLmZsYWdzICY9IH5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0ZVTExTQ1JFRU47Ci0gICAgICAgICAgICAgICAgd2luLnNldEF0dHJpYnV0ZXMod2luUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB3aW4uc2V0RmxhZ3MoMCwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19GVUxMU0NSRUVOKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyh3aW4uZ2V0QXR0cmlidXRlcygpLmZsYWdzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIG5ldyBUZXN0KCJmdWxsU2NyZWVuSW50ZW50IikgeworICAgICAgICBuZXcgVGVzdCgiSW1tZXJzaXZlOiBFbnRlciIpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBzZXRJbW1lcnNpdmUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBUZXN0KCJJbW1lcnNpdmU6IEV4aXQiKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0SW1tZXJzaXZlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgbmV3IFRlc3QoIlByaW9yaXR5IG5vdGlmaWNhdGlvbiIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90ID0gbmV3IE5vdGlmaWNhdGlvbihTdGF0dXNCYXJUZXN0LnRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuc3RhdF9zeXNfcGhvbmUsCkBAIC04Niw4ICs5NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoODg4KSA1NTUtNTAzOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBub3QuZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWTsKICAgICAgICAgICAgICAgICBJbnRlbnQgZnVsbFNjcmVlbkludGVudCA9IG5ldyBJbnRlbnQoU3RhdHVzQmFyVGVzdC50aGlzLCBUZXN0QWxlcnRBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaW50IGlkID0gKGludClTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgaWQgPSAoaW50KVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAvLyBYWFggSEFYCiAgICAgICAgICAgICAgICAgZnVsbFNjcmVlbkludGVudC5wdXRFeHRyYSgiaWQiLCBpZCk7CiAgICAgICAgICAgICAgICAgbm90LmZ1bGxTY3JlZW5JbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAogICAgICAgICAgICAgICAgICAgICBTdGF0dXNCYXJUZXN0LnRoaXMsCmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCBmNzFlYmI5Li5lYWZmMGY0IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTE5OCw4ICsxOTgsMTAgQEAKICAgICAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcHJpbnRmKCJcbk5vIHJlc291cmNlIHRhYmxlIGZvdW5kLlxuIik7CiAgICAgICAgIH0gZWxzZSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICAgICAgcHJpbnRmKCJcblJlc291cmNlIHRhYmxlOlxuIik7CiAgICAgICAgICAgICByZXMucHJpbnQoZmFsc2UpOworI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBBc3NldCogbWFuaWZlc3RBc3NldCA9IGFzc2V0cy5vcGVuTm9uQXNzZXQoIkFuZHJvaWRNYW5pZmVzdC54bWwiLApAQCAtMzkwLDggKzM5Miw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0cmNtcCgicmVzb3VyY2VzIiwgb3B0aW9uKSA9PSAwKSB7CisjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogICAgICAgICByZXMucHJpbnQoYnVuZGxlLT5nZXRWYWx1ZXMoKSk7Ci0KKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJ4bWx0cmVlIiwgb3B0aW9uKSA9PSAwKSB7CiAgICAgICAgIGlmIChidW5kbGUtPmdldEZpbGVTcGVjQ291bnQoKSA8IDMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGR1bXAgeG1sdHJlZSByZXNvdXJjZSBmaWxlIHNwZWNpZmllZFxuIik7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1BhY2thZ2UuY3BwIGIvdG9vbHMvYWFwdC9QYWNrYWdlLmNwcAppbmRleCA5OTlhNWNmLi4zY2I2MTRmIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1BhY2thZ2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUGFja2FnZS5jcHAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiBzc2l6ZV90IHByb2Nlc3NKYXJGaWxlcyhCdW5kbGUqIGJ1bmRsZSwgWmlwRmlsZSogemlwKQogewotICAgIHNzaXplX3QgZXJyOworICAgIHN0YXR1c190IGVycjsKICAgICBzc2l6ZV90IGNvdW50ID0gMDsKICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgY2hhcio+JiBqYXJzID0gYnVuZGxlLT5nZXRKYXJGaWxlcygpOwogCmRpZmYgLS1naXQgYS90b29scy9hYXB0L1Jlc291cmNlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCmluZGV4IGM4YmE5MDQuLjgyMjI2MmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCisrKyBiL3Rvb2xzL2FhcHQvUmVzb3VyY2UuY3BwCkBAIC01NDIsMTEgKzU0MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPEFhcHRHcm91cEVudHJ5LCBzcDxBYXB0RmlsZT4gPiBiYXNlRmlsZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlR3JvdXAtPmdldEZpbGVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBiYXNlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImJhc2VGaWxlICVsZCBoYXMgZmxhdm9yICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYmFzZUZpbGUgJWQgaGFzIGZsYXZvciAlc1xuIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlcy5rZXlBdChpKS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IG92ZXJsYXlGaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigib3ZlcmxheUZpbGUgJWxkIGhhcyBmbGF2b3IgJXNcbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJvdmVybGF5RmlsZSAlZCBoYXMgZmxhdm9yICVzXG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KGkpLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QXQob3ZlcmxheUdyb3VwSW5kZXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJhc2VGaWxlSW5kZXggPCBVTktOT1dOX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS0+Z2V0VmVyYm9zZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZm91bmQgYSBtYXRjaCAoJWxkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImZvdW5kIGEgbWF0Y2ggKCVkKSBmb3Igb3ZlcmxheSBmaWxlICVzLCBmb3IgZmxhdm9yICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VGaWxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUdyb3VwLT5nZXRMZWFmKCkuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUZpbGVzLmtleUF0KG92ZXJsYXlHcm91cEluZGV4KS50b1N0cmluZygpLnN0cmluZygpKTsKQEAgLTIwODMsMTIgKzIwODMsMTMgQEAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4gbGF5b3V0IGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtMYXlvdXRUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJ2aWV3IiwgTlVMTCwgImNsYXNzIik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtMYXlvdXRUYWdBdHRyUGFpcnMsICJmcmFnbWVudCIsIE5VTEwsICJjbGFzcyIpOwogICAgIGFkZFRhZ0F0dHJQYWlyKCZrTGF5b3V0VGFnQXR0clBhaXJzLCAiZnJhZ21lbnQiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJuYW1lIik7CiAKICAgICAvLyB0YWc6YXR0cmlidXRlIHBhaXJzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgaW4geG1sIGZpbGVzLgogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE5hbWVzcGFjZUF0dHJpYnV0ZVBhaXI+IGtYbWxUYWdBdHRyUGFpcnM7CiAgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJQcmVmZXJlbmNlU2NyZWVuIiwgUkVTT1VSQ0VTX0FORFJPSURfTkFNRVNQQUNFLCAiZnJhZ21lbnQiKTsKLSAgICBhZGRUYWdBdHRyUGFpcigma1htbFRhZ0F0dHJQYWlycywgIkhlYWRlciIsIFJFU09VUkNFU19BTkRST0lEX05BTUVTUEFDRSwgImZyYWdtZW50Iik7CisgICAgYWRkVGFnQXR0clBhaXIoJmtYbWxUYWdBdHRyUGFpcnMsICJoZWFkZXIiLCBSRVNPVVJDRVNfQU5EUk9JRF9OQU1FU1BBQ0UsICJmcmFnbWVudCIpOwogCiAgICAgY29uc3QgVmVjdG9yPHNwPEFhcHREaXI+ID4mIGRpcnMgPSBhc3NldHMtPnJlc0RpcnMoKTsKICAgICBjb25zdCBzaXplX3QgSyA9IGRpcnMuc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggNzU1YjkzYi4uZjQwYTg3NyAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yMzY2LDcgKzIzNjYsNyBAQAogICAgICAgICBpZiAoY29uZmlnU2V0LmNvdW50KGRlZmF1bHRMb2NhbGUpID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiYWFwdDogd2FybmluZzogc3RyaW5nICclcycgaGFzIG5vIGRlZmF1bHQgdHJhbnNsYXRpb24gaW4gJXM7IGZvdW5kOiIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZUl0ZXItPmZpcnN0KS5zdHJpbmcoKSwgbUJ1bmRsZS0+Z2V0UmVzb3VyY2VTb3VyY2VEaXJzKClbMF0pOwotICAgICAgICAgICAgZm9yIChzZXQ8U3RyaW5nOD46Oml0ZXJhdG9yIGxvY2FsZXMgPSBjb25maWdTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGZvciAoc2V0PFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBsb2NhbGVzID0gY29uZmlnU2V0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGxvY2FsZXMgIT0gY29uZmlnU2V0LmVuZCgpOwogICAgICAgICAgICAgICAgICBsb2NhbGVzKyspIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiAlcyIsICgqbG9jYWxlcykuc3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcCBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKaW5kZXggYTA5Y2VjMC4uZTI4YmRmZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAorKysgYi90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBzdHIgPSBTdHJpbmc4KHBvb2wtPnN0cmluZ0F0KHMsICZsZW4pKS5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaW50ZigiU3RyaW5nICMlbGQ6ICVzXG4iLCBzLCBzdHIpOworICAgICAgICBwcmludGYoIlN0cmluZyAjJWQ6ICVzXG4iLCBzLCBzdHIpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcCBiL3Rvb2xzL2FhcHQvWE1MTm9kZS5jcHAKaW5kZXggODU1MWIwZi4uY2VlODU0NiAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9YTUxOb2RlLmNwcAorKysgYi90b29scy9hYXB0L1hNTE5vZGUuY3BwCkBAIC0yMDMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHhsaWZmRGVwdGggPT0gMCAmJiBwc2V1ZG9sb2NhbGl6ZSkgeworI2lmZGVmIEVOQUJMRV9QU0VVRE9MT0NBTElaRQogICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9yaWcoU3RyaW5nOCh0ZXh0KS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHNldWRvID0gcHNldWRvbG9jYWxpemVfc3RyaW5nKG9yaWcpOwogICAgICAgICAgICAgICAgIGN1clN0cmluZy5hcHBlbmQoU3RyaW5nMTYoU3RyaW5nOChwc2V1ZG8uY19zdHIoKSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoaXNGb3JtYXR0ZWQgJiYgaGFzU3Vic3RpdHV0aW9uRXJyb3JzKGZpbGVOYW1lLCBpblhtbCwgdGV4dCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1ppcEZpbGUuaCBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCmluZGV4IGRiYmQwNzIuLjc4Nzc1NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCisrKyBiL3Rvb2xzL2FhcHQvWmlwRmlsZS5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgLyoKICAgICAgKiBPcGVuIGEgbmV3IG9yIGV4aXN0aW5nIGFyY2hpdmUuCiAgICAgICovCi0gICAgdHlwZWRlZiBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAga09wZW5SZWFkT25seSAgID0gMHgwMSwKICAgICAgICAga09wZW5SZWFkV3JpdGUgID0gMHgwMiwKICAgICAgICAga09wZW5DcmVhdGUgICAgID0gMHgwNCwgICAgIC8vIGNyZWF0ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvUkVBRE1FIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhOWJkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGF5b3V0bGliL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0xheW91dGxpYiBpcyBhIGN1c3RvbSB2ZXJzaW9uIG9mIHRoZSBhbmRyb2lkIFZpZXcgZnJhbWV3b3JrIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgRWNsaXBzZS4KK1RoZSBnb2FsIG9mIHRoZSBsaWJyYXJ5IGlzIHRvIHByb3ZpZGUgbGF5b3V0IHJlbmRlcmluZyBpbiBFY2xpcHNlIHRoYXQgYXJlIHZlcnkgdmVyeSBjbG9zZSB0byB0aGVpciByZW5kZXJpbmcgb24gZGV2aWNlcy4KKworTm9uZSBvZiB0aGUgY29tLmFuZHJvaWQuKiBvciBhbmRyb2lkLiogY2xhc3NlcyBpbiBsYXlvdXRsaWIgcnVuIG9uIGRldmljZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKaW5kZXggZDVkMzE1ZS4uMWUxYWJhOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCkBAIC02OSwxMSArNjksNiBAQAogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBDYW52YXMoaW50KSIpOwogICAgIH0KIAotICAgIHB1YmxpYyBDYW52YXMoamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wgZ2wpIHsKLSAgICAgICAgbUxvZ2dlciA9IG51bGw7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgY3JlYXRlIENhbnZhcyhqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTCkiKTsKLSAgICB9Ci0KICAgICAvLyBjdXN0b20gY29uc3RydWN0b3JzIGZvciBvdXIgdXNlLgogICAgIHB1YmxpYyBDYW52YXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBJTGF5b3V0TG9nIGxvZ2dlcikgewogICAgICAgICBtTG9nZ2VyID0gbG9nZ2VyOwpAQCAtMTE3NCwxNSArMTE2OSw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjZ2V0R0woKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHTCBnZXRHTCgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0R0woKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyNnZXRNYXRyaXgoKQogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTI1NywxNSArMTI0Myw2IEBACiAgICAgfQogCiAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2V0Vmlld3BvcnQoaW50LCBpbnQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld3BvcnQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgc3VwZXIuc2V0Vmlld3BvcnQod2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMjc2tldyhmbG9hdCwgZmxvYXQpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZUNvbnRleHQuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCmluZGV4IDc0NGJmYmUuLjU4YjFiNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlQ29udGV4dC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuRGF0YWJhc2VFcnJvckhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2UuQ3Vyc29yRmFjdG9yeTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKQEAgLTEwNTksNiArMTA2MCwxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTUUxpdGVEYXRhYmFzZSBvcGVuT3JDcmVhdGVEYXRhYmFzZShTdHJpbmcgYXJnMCwgaW50IGFyZzEsCisgICAgICAgICAgICBDdXJzb3JGYWN0b3J5IGFyZzIsIERhdGFiYXNlRXJyb3JIYW5kbGVyIGFyZzMpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRHJhd2FibGUgcGVla1dhbGxwYXBlcigpIHsKICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3ZvaXAvamF2YS9hbmRyb2lkL25ldC9zaXAvU2lwQXVkaW9DYWxsSW1wbC5qYXZhIGIvdm9pcC9qYXZhL2FuZHJvaWQvbmV0L3NpcC9TaXBBdWRpb0NhbGxJbXBsLmphdmEKaW5kZXggMmUyY2E1Yi4uYTRmYTA1MyAxMDA2NDQKLS0tIGEvdm9pcC9qYXZhL2FuZHJvaWQvbmV0L3NpcC9TaXBBdWRpb0NhbGxJbXBsLmphdmEKKysrIGIvdm9pcC9qYXZhL2FuZHJvaWQvbmV0L3NpcC9TaXBBdWRpb0NhbGxJbXBsLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBhbmRyb2lkLm5ldC5ydHAuQXVkaW9Hcm91cDsKIGltcG9ydCBhbmRyb2lkLm5ldC5ydHAuQXVkaW9TdHJlYW07CiBpbXBvcnQgYW5kcm9pZC5uZXQucnRwLlJ0cFN0cmVhbTsKLWltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlZpYnJhdG9yOwpAQCAtNzcsMTMgKzc2LDEwIEBACiAgICAgcHJpdmF0ZSBUb25lR2VuZXJhdG9yIG1SaW5nYmFja1RvbmU7CiAKICAgICBwcml2YXRlIFNpcFByb2ZpbGUgbVBlbmRpbmdDYWxsUmVxdWVzdDsKLSAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XbTsKLSAgICBwcml2YXRlIFdpZmlNYW5hZ2VyLldpZmlMb2NrIG1XaWZpSGlnaFBlcmZMb2NrOwogCiAgICAgcHVibGljIFNpcEF1ZGlvQ2FsbEltcGwoQ29udGV4dCBjb250ZXh0LCBTaXBQcm9maWxlIGxvY2FsUHJvZmlsZSkgewogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1Mb2NhbFByb2ZpbGUgPSBsb2NhbFByb2ZpbGU7Ci0gICAgICAgIG1XbSA9IChXaWZpTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihTaXBBdWRpb0NhbGwuTGlzdGVuZXIgbGlzdGVuZXIpIHsKQEAgLTQxNywyOCArNDEzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBncmFiV2lmaUhpZ2hQZXJmTG9jaygpIHsKLSAgICAgICAgaWYgKG1XaWZpSGlnaFBlcmZMb2NrID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgImFjcXVpcmUgd2lmaSBoaWdoIHBlcmYgbG9jayIpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sgPSAoKFdpZmlNYW5hZ2VyKQotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lGSV9TRVJWSUNFKSkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVdpZmlMb2NrKFdpZmlNYW5hZ2VyLldJRklfTU9ERV9GVUxMX0hJR0hfUEVSRiwgVEFHKTsKLSAgICAgICAgICAgIG1XaWZpSGlnaFBlcmZMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlV2lmaUhpZ2hQZXJmTG9jaygpIHsKLSAgICAgICAgaWYgKG1XaWZpSGlnaFBlcmZMb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgInJlbGVhc2Ugd2lmaSBoaWdoIHBlcmYgbG9jayIpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgbVdpZmlIaWdoUGVyZkxvY2sgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2lmaU9uKCkgewotICAgICAgICByZXR1cm4gKG1XbS5nZXRDb25uZWN0aW9uSW5mbygpLmdldEJTU0lEKCkgPT0gbnVsbCkgPyBmYWxzZSA6IHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ29udGludWVTZXNzaW9uRGVzY3JpcHRpb24oKSB7CiAgICAgICAgIHJldHVybiBjcmVhdGVTZHBCdWlsZGVyKHRydWUsIG1Db2RlYykuYnVpbGQoKTsKICAgICB9CkBAIC01NzMsNyArNTQ3LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBzdGFydENhbGwoU2RwU2Vzc2lvbkRlc2NyaXB0aW9uIHBlZXJTZCkgewogICAgICAgICBzdG9wQ2FsbChET05UX1JFTEVBU0VfU09DS0VUKTsKLSAgICAgICAgaWYgKGlzV2lmaU9uKCkpIGdyYWJXaWZpSGlnaFBlcmZMb2NrKCk7CisKICAgICAgICAgbVBlZXJTZCA9IHBlZXJTZDsKICAgICAgICAgU3RyaW5nIHBlZXJNZWRpYUFkZHJlc3MgPSBwZWVyU2QuZ2V0UGVlck1lZGlhQWRkcmVzcyhBVURJTyk7CiAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBtdWx0aXBsZSBtZWRpYSBmaWVsZHMKQEAgLTY0MCw3ICs2MTQsNiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BDYWxsKGJvb2xlYW4gcmVsZWFzZVNvY2tldCkgewogICAgICAgICBMb2cuZChUQUcsICJzdG9wIGF1ZGlvY2FsbCIpOwotICAgICAgICByZWxlYXNlV2lmaUhpZ2hQZXJmTG9jaygpOwogICAgICAgICBpZiAobUF1ZGlvU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgIG1BdWRpb1N0cmVhbS5qb2luKG51bGwpOwogCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9JV2lmaU1hbmFnZXIuYWlkbCBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCmluZGV4IDZlMGJjOWQuLjE5MTNmYTAgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL0lXaWZpTWFuYWdlci5haWRsCkBAIC00MCwxNSArNDAsMTUgQEAKIAogICAgIGJvb2xlYW4gcGluZ1N1cHBsaWNhbnQoKTsKIAotICAgIGJvb2xlYW4gc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpOworICAgIHZvaWQgc3RhcnRTY2FuKGJvb2xlYW4gZm9yY2VBY3RpdmUpOwogCiAgICAgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0cygpOwogCi0gICAgYm9vbGVhbiBkaXNjb25uZWN0KCk7CisgICAgdm9pZCBkaXNjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlY29ubmVjdCgpOworICAgIHZvaWQgcmVjb25uZWN0KCk7CiAKLSAgICBib29sZWFuIHJlYXNzb2NpYXRlKCk7CisgICAgdm9pZCByZWFzc29jaWF0ZSgpOwogCiAgICAgV2lmaUluZm8gZ2V0Q29ubmVjdGlvbkluZm8oKTsKIApAQCAtODUsNSArODUsMjEgQEAKICAgICBXaWZpQ29uZmlndXJhdGlvbiBnZXRXaWZpQXBDb25maWd1cmF0aW9uKCk7CiAKICAgICB2b2lkIHNldFdpZmlBcENvbmZpZ3VyYXRpb24oaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIHN0YXJ0V2lmaSgpOworCisgICAgdm9pZCBzdG9wV2lmaSgpOworCisgICAgdm9pZCBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpOworCisgICAgdm9pZCBjbGVhckJsYWNrbGlzdCgpOworCisgICAgdm9pZCBjb25uZWN0TmV0d29ya1dpdGhDb25maWcoaW4gV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZyk7CisKKyAgICB2b2lkIGNvbm5lY3ROZXR3b3JrV2l0aElkKGludCBuZXR3b3JrSWQpOworCisgICAgdm9pZCBzYXZlTmV0d29yayhpbiBXaWZpQ29uZmlndXJhdGlvbiB3aWZpQ29uZmlnKTsKKworICAgIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0d29ya0lkKTsKIH0KIApkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlnU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQ1YjdlCi0tLSAvZGV2L251bGwKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKQEAgLTAsMCArMSw2ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0LndpZmk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC53aWZpLldpZmlDb25maWd1cmF0aW9uLlN0YXR1czsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgQVBJIHRvIG1hbmFnZSBjb25maWd1cmVkCisgKiB3aWZpIG5ldHdvcmtzLiBUaGUgQVBJIGlzIG5vdCB0aHJlYWQgc2FmZSBpcyBiZWluZworICogdXNlZCBvbmx5IGZyb20gV2lmaVN0YXRlTWFjaGluZS4KKyAqCisgKiBJdCBkZWFscyB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIC0gQWRkL3VwZGF0ZS9yZW1vdmUgYSBXaWZpQ29uZmlndXJhdGlvbgorICogLSBNYWludGFpbiBhIGxpc3Qgb2YgY29uZmlndXJlZCBuZXR3b3JrcyBmb3IgcXVpY2sgYWNjZXNzCisgKiBUT0RPOgorICogLSBoYW5kbGUgc3RhdGljIElQIHBlciBjb25maWd1cmF0aW9uCisgKiAtIGhhbmRsZSBwcm94eSBwZXIgY29uZmlndXJhdGlvbgorICovCitjbGFzcyBXaWZpQ29uZmlnU3RvcmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBzQ29udGV4dDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlDb25maWdTdG9yZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBzQ29uZmlndXJlZE5ldHdvcmtzID0gbmV3IEFycmF5TGlzdDxXaWZpQ29uZmlndXJhdGlvbj4oKTsKKyAgICAvKiBUcmFja3MgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgY29uZmlndXJlZCBuZXR3b3JrcyAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzTGFzdFByaW9yaXR5ID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGNvbnRleHQsIGZldGNoIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKKyAgICAgKiBhbmQgZW5hYmxlIGFsbCBzdG9yZWQgbmV0d29ya3MgaW4gc3VwcGxpY2FudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBMb2cuZChUQUcsICJVcGRhdGluZyBjb25maWcgYW5kIGVuYWJsaW5nIGFsbCBuZXR3b3JrcyIpOworICAgICAgICBzQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZWROZXR3b3JrcygpOworICAgICAgICBlbmFibGVBbGxOZXR3b3JrcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIG5ldHdvcmtzCisgICAgICogQHJldHVybiBMaXN0IG9mIG5ldHdvcmtzCisgICAgICovCisgICAgc3RhdGljIExpc3Q8V2lmaUNvbmZpZ3VyYXRpb24+IGdldENvbmZpZ3VyZWROZXR3b3JrcygpIHsKKyAgICAgICAgTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MgPSBuZXcgQXJyYXlMaXN0PFdpZmlDb25maWd1cmF0aW9uPigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgICAgIG5ldHdvcmtzLmFkZChjb25maWcuY2xvbmUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldHdvcmtzOworICAgIH0KKworICAgIC8qKgorICAgICAqIGVuYWJsZSBhbGwgbmV0d29ya3MgYW5kIHNhdmUgY29uZmlnLiBUaGlzIHdpbGwgYmUgYSBuby1vcCBpZiB0aGUgbGlzdAorICAgICAqIG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MgaW5kaWNhdGVzIGFsbCBuZXR3b3JrcyBhcyBiZWluZyBlbmFibGVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoKSB7CisgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogc0NvbmZpZ3VyZWROZXR3b3JrcykgeworICAgICAgICAgICAgaWYoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLnN0YXR1cyA9PSBTdGF0dXMuRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGNvbmZpZyBmb3IgY29ubmVjdGlvbi4gVGhpcyBpbnZvbHZlcworICAgICAqIGFkZGl0aW9uL3VwZGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbmZpZywgdXBkYXRpbmcgdGhlIHByaW9yaXR5IG9mCisgICAgICogYWxsIHRoZSBuZXR3b3JrcyBhbmQgZW5hYmxpbmcgdGhlIGdpdmVuIG5ldHdvcmsgd2hpbGUgZGlzYWJsaW5nIG90aGVycy4KKyAgICAgKgorICAgICAqIFNlbGVjdGluZyBhIG5ldHdvcmsgd2lsbCBsZWF2ZSB0aGUgb3RoZXIgbmV0d29ya3MgZGlzYWJsZWQgYW5kCisgICAgICogYSBjYWxsIHRvIGVuYWJsZUFsbE5ldHdvcmtzKCkgbmVlZHMgdG8gYmUgaXNzdWVkIHVwb24gYSBjb25uZWN0aW9uCisgICAgICogb3IgYSBmYWlsdXJlIGV2ZW50IGZyb20gc3VwcGxpY2FudAorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGluIFdpZmlDb25maWd1cmF0aW9uCisgICAgICovCisgICAgc3RhdGljIHZvaWQgc2VsZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgbmV0SWQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgICAgIHNlbGVjdE5ldHdvcmsobmV0SWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIG5ldHdvcmsgZm9yIGNvbm5lY3Rpb24uIFRoaXMgaW52b2x2ZXMKKyAgICAgKiB1cGRhdGluZyB0aGUgcHJpb3JpdHkgb2YgYWxsIHRoZSBuZXR3b3JrcyBhbmQgZW5hYmxpbmcgdGhlIGdpdmVuCisgICAgICogbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgb3RoZXJzLgorICAgICAqCisgICAgICogU2VsZWN0aW5nIGEgbmV0d29yayB3aWxsIGxlYXZlIHRoZSBvdGhlciBuZXR3b3JrcyBkaXNhYmxlZCBhbmQKKyAgICAgKiBhIGNhbGwgdG8gZW5hYmxlQWxsTmV0d29ya3MoKSBuZWVkcyB0byBiZSBpc3N1ZWQgdXBvbiBhIGNvbm5lY3Rpb24KKyAgICAgKiBvciBhIGZhaWx1cmUgZXZlbnQgZnJvbSBzdXBwbGljYW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBzZWxlY3QgZm9yIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZWxlY3ROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICAvLyBSZXNldCB0aGUgcHJpb3JpdHkgb2YgZWFjaCBuZXR3b3JrIGF0IHN0YXJ0IG9yIGlmIGl0IGdvZXMgdG9vIGhpZ2guCisgICAgICAgIGlmIChzTGFzdFByaW9yaXR5ID09IC0xIHx8IHNMYXN0UHJpb3JpdHkgPiAxMDAwMDAwKSB7CisgICAgICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmYgOiBzQ29uZmlndXJlZE5ldHdvcmtzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmYubmV0d29ya0lkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmYucHJpb3JpdHkgPSAwOworICAgICAgICAgICAgICAgICAgICBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBXaWZpQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcubmV0d29ya0lkID0gbmV0SWQ7CisgICAgICAgIGNvbmZpZy5wcmlvcml0eSA9ICsrc0xhc3RQcmlvcml0eTsKKworICAgICAgICBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgV2lmaU5hdGl2ZS5zYXZlQ29uZmlnQ29tbWFuZCgpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgZ2l2ZW4gbmV0d29yayB3aGlsZSBkaXNhYmxpbmcgYWxsIG90aGVyIG5ldHdvcmtzICovCisgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIHRydWUpOworCisgICAgICAgIC8qIHVwZGF0ZSB0aGUgY29uZmlndXJlZCBuZXR3b3JrcyBsaXN0IGJ1dCBub3Qgc2VuZCBhCisgICAgICAgICAqIGJyb2FkY2FzdCB0byBhdm9pZCBhIGZldGNoIGZyb20gc2V0dGluZ3MKKyAgICAgICAgICogZHVyaW5nIHRoaXMgdGVtcG9yYXJ5IGRpc2FibGluZyBvZiBuZXR3b3JrcworICAgICAgICAgKi8KKyAgICAgICAgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkL3VwZGF0ZSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIHNhdmUgY29uZmlnCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFdpZmlDb25maWd1cmF0aW9uIHRvIGJlIHNhdmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGludCBuZXRJZCA9IGFkZE9yVXBkYXRlTmV0d29ya05hdGl2ZShjb25maWcpOworICAgICAgICAvKiBlbmFibGUgYSBuZXcgbmV0d29yayAqLworICAgICAgICBpZiAoY29uZmlnLm5ldHdvcmtJZCA8IDApIHsKKyAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JnZXQgdGhlIHNwZWNpZmllZCBuZXR3b3JrIGFuZCBzYXZlIGNvbmZpZworICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gZm9yZ2V0CisgICAgICovCisgICAgc3RhdGljIHZvaWQgZm9yZ2V0TmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgV2lmaU5hdGl2ZS5yZW1vdmVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKKyAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZC91cGRhdGUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwdWJsaWMKKyAgICAgKiBBUEkuIFRoZSBtb3JlIHBvd2VyZnVsIHNhdmVOZXR3b3JrKCkgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBzdGF0ZSBtYWNoaW5lCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHdpZmkgY29uZmlndXJhdGlvbiB0byBhZGQvdXBkYXRlCisgICAgICovCisgICAgc3RhdGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGludCByZXQgPSBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoY29uZmlnKTsKKyAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYworICAgICAqIEFQSS4gVGhlIG1vcmUgcG93ZXJmdWwgZm9yZ2V0TmV0d29yaygpIGlzIHVzZWQgYnkgdGhlCisgICAgICogc3RhdGUgbWFjaGluZSBmb3IgbmV0d29yayByZW1vdmFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gcmVtb3ZlTmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBhIG5ldHdvcmsuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBzYXZlQ29uZmlnIG9wZXJhdGlvbi4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJldGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYworICAgICAqIEFQSS4gVGhlIG1vcmUgcG93ZXJmdWwgc2VsZWN0TmV0d29yaygpL3NhdmVOZXR3b3JrKCkgaXMgdXNlZCBieSB0aGUKKyAgICAgKiBzdGF0ZSBtYWNoaW5lIGZvciBjb25uZWN0aW5nIHRvIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGVuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBXaWZpTmF0aXZlLmVuYWJsZU5ldHdvcmtDb21tYW5kKG5ldElkLCBkaXNhYmxlT3RoZXJzKTsKKyAgICAgICAgdXBkYXRlQ29uZmlnQW5kU2VuZENoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGUgYSBuZXR3b3JrLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gc2F2ZUNvbmZpZyBvcGVyYXRpb24uCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgdG8gYmUgZGlzYWJsZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChuZXRJZCk7CisgICAgICAgIHVwZGF0ZUNvbmZpZ0FuZFNlbmRDaGFuZ2VCcm9hZGNhc3QoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBjb25maWd1cmVkIG5ldHdvcmtzIGluIHN1cHBsaWNhbnQgdG8gZGlzaworICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNhdmVDb25maWcoKSB7CisgICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNhdmVDb25maWdDb21tYW5kKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVDb25maWdBbmRTZW5kQ2hhbmdlQnJvYWRjYXN0KCkgeworICAgICAgICB1cGRhdGVDb25maWd1cmVkTmV0d29ya3MoKTsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgc0NvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ29uZmlndXJlZE5ldHdvcmtzKCkgeworICAgICAgICBTdHJpbmcgbGlzdFN0ciA9IFdpZmlOYXRpdmUubGlzdE5ldHdvcmtzQ29tbWFuZCgpOworICAgICAgICBzTGFzdFByaW9yaXR5ID0gMDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIHNDb25maWd1cmVkTmV0d29ya3MuY2xlYXIoKTsKKworICAgICAgICAgICAgaWYgKGxpc3RTdHIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGxpbmVzID0gbGlzdFN0ci5zcGxpdCgiXG4iKTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGEgaGVhZGVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbGluZXNbaV0uc3BsaXQoIlx0Iik7CisgICAgICAgICAgICAgICAgLy8gbmV0d29yay1pZCB8IHNzaWQgfCBic3NpZCB8IGZsYWdzCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm5ldHdvcmtJZCA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzBdKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFszXS5pbmRleE9mKCJbQ1VSUkVOVF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuQ1VSUkVOVDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0WzNdLmluZGV4T2YoIltESVNBQkxFRF0iKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBXaWZpQ29uZmlndXJhdGlvbi5TdGF0dXMuRU5BQkxFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuc3RhdHVzID0gV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzLkVOQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWROZXR3b3JrVmFyaWFibGVzKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmlvcml0eSA+IHNMYXN0UHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgc0xhc3RQcmlvcml0eSA9IGNvbmZpZy5wcmlvcml0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc0NvbmZpZ3VyZWROZXR3b3Jrcy5hZGQoY29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBhZGRPclVwZGF0ZU5ldHdvcmtOYXRpdmUoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBzdXBwbGllZCBuZXR3b3JrSWQgaXMgLTEsIHdlIGNyZWF0ZSBhIG5ldyBlbXB0eQorICAgICAgICAgKiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uIE90aGVyd2lzZSwgdGhlIG5ldHdvcmtJZCBzaG91bGQKKyAgICAgICAgICogcmVmZXIgdG8gYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7CisgICAgICAgIGJvb2xlYW4gbmV3TmV0d29yayA9IG5ldElkID09IC0xOworICAgICAgICAvLyBuZXR3b3JrSWQgb2YgLTEgbWVhbnMgd2Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbmV0d29yaworCisgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7CisgICAgICAgICAgICBuZXRJZCA9IFdpZmlOYXRpdmUuYWRkTmV0d29ya0NvbW1hbmQoKTsKKyAgICAgICAgICAgIGlmIChuZXRJZCA8IDApIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gYWRkIGEgbmV0d29yayEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0VmFyaWFibGVzOiB7CisKKyAgICAgICAgICAgIGlmIChjb25maWcuU1NJRCAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLnNzaWRWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBTU0lEOiAiK2NvbmZpZy5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuQlNTSUQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5ic3NpZFZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuQlNTSUQpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBCU1NJRDogIitjb25maWcuQlNTSUQpOworICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nID0KKyAgICAgICAgICAgICAgICBtYWtlU3RyaW5nKGNvbmZpZy5hbGxvd2VkS2V5TWFuYWdlbWVudCwgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEtleU1hbmFnZW1lbnQuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQudmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRLZXlNYW5hZ2VtZW50U3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQga2V5X21nbXQ6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkS2V5TWFuYWdlbWVudFN0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFByb3RvY29sc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZFByb3RvY29scywgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRQcm90b2NvbHMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlByb3RvY29sLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgcHJvdG86ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkUHJvdG9jb2xzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcgPQorICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcywgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXV0aEFsZ29yaXRobXNTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBhdXRoX2FsZzogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdXRoQWxnb3JpdGhtc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgICAgIG1ha2VTdHJpbmcoY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLmNhcmRpbmFsaXR5KCkgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZykpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsZWQgdG8gc2V0IHBhaXJ3aXNlOiAiKworICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFBhaXJ3aXNlQ2lwaGVyc1N0cmluZyk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWxsb3dlZEdyb3VwQ2lwaGVyc1N0cmluZyA9CisgICAgICAgICAgICAgICAgbWFrZVN0cmluZyhjb25maWcuYWxsb3dlZEdyb3VwQ2lwaGVycywgV2lmaUNvbmZpZ3VyYXRpb24uR3JvdXBDaXBoZXIuc3RyaW5ncyk7CisgICAgICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRHcm91cENpcGhlcnMuY2FyZGluYWxpdHkoKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnZhck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWxlZCB0byBzZXQgZ3JvdXA6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkR3JvdXBDaXBoZXJzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAvLyBieSBwcmV2ZW50aW5nICIqIiBhcyBhIGtleS4KKyAgICAgICAgICAgIGlmIChjb25maWcucHJlU2hhcmVkS2V5ICE9IG51bGwgJiYgIWNvbmZpZy5wcmVTaGFyZWRLZXkuZXF1YWxzKCIqIikgJiYKKyAgICAgICAgICAgICAgICAgICAgIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbGVkIHRvIHNldCBwc2s6ICIrY29uZmlnLnByZVNoYXJlZEtleSk7CisgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGhhc1NldEtleSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbmZpZy53ZXBLZXlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy53ZXBLZXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY2xpZW50IHNjcmV3LXVwIGJ5IHBhc3NpbmcgaW4gYSBXaWZpQ29uZmlndXJhdGlvbiB3ZSBnYXZlIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHByZXZlbnRpbmcgIioiIGFzIGEga2V5LgorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLndlcEtleXNbaV0gIT0gbnVsbCAmJiAhY29uZmlnLndlcEtleXNbaV0uZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi53ZXBLZXlWYXJOYW1lc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53ZXBLZXlzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF9rZXkiK2krIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgc2V0VmFyaWFibGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzU2V0S2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc1NldEtleSkgeworICAgICAgICAgICAgICAgIGlmICghV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uLndlcFR4S2V5SWR4VmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvbmZpZy53ZXBUeEtleUluZGV4KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHdlcF90eF9rZXlpZHg6ICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIVdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ucHJpb3JpdHlWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhjb25maWcucHJpb3JpdHkpKSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0IHByaW9yaXR5OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArY29uZmlnLnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25maWcuaGlkZGVuU1NJRCAmJiAhV2lmaU5hdGl2ZS5zZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5oaWRkZW5TU0lEVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoY29uZmlnLmhpZGRlblNTSUQgPyAxIDogMCkpKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb25maWcuU1NJRCArICI6IGZhaWxlZCB0byBzZXQgaGlkZGVuU1NJRDogIisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEKTsKKyAgICAgICAgICAgICAgICBicmVhayBzZXRWYXJpYWJsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24uRW50ZXJwcmlzZUZpZWxkIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmVudGVycHJpc2VGaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IGZpZWxkLnZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPSBjb25maWcuZWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSA/ICJOVUxMIiA6IGNvbnZlcnRUb1F1b3RlZFN0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFXaWZpTmF0aXZlLnNldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29uZmlnLlNTSUQgKyAiOiBmYWlsZWQgdG8gc2V0ICIgKyB2YXJOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHNldFZhcmlhYmxlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXRJZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdOZXR3b3JrKSB7CisgICAgICAgICAgICBXaWZpTmF0aXZlLnJlbW92ZU5ldHdvcmtDb21tYW5kKG5ldElkKTsKKyAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgYSBuZXR3b3JrIHZhcmlhYmxlLCByZW1vdmVkIG5ldHdvcms6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuZXRJZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgdmFyaWFibGVzIGZyb20gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIHRoYXQgYXJlIG5lZWRlZCB0bworICAgICAqIGZpbGwgaW4gdGhlIFdpZmlDb25maWd1cmF0aW9uIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHtAbGluayBXaWZpQ29uZmlndXJhdGlvbn0gb2JqZWN0IHRvIGJlIGZpbGxlZCBpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlYWROZXR3b3JrVmFyaWFibGVzKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworCisgICAgICAgIGludCBuZXRJZCA9IGNvbmZpZy5uZXR3b3JrSWQ7CisgICAgICAgIGlmIChuZXRJZCA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETzogbWF5YmUgc2hvdWxkIGhhdmUgYSBuYXRpdmUgbWV0aG9kIHRoYXQgdGFrZXMgYW4gYXJyYXkgb2YKKyAgICAgICAgICogdmFyaWFibGUgbmFtZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdmFsdWVzLiBCdXQgd2UnZCBzdGlsbAorICAgICAgICAgKiBiZSBkb2luZyBhIHJvdW5kIHRyaXAgdG8gdGhlIHN1cHBsaWNhbnQgZGFlbW9uIGZvciBlYWNoIHZhcmlhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5zc2lkVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IHJlbW92ZURvdWJsZVF1b3Rlcyh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcuU1NJRCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uYnNzaWRWYXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGNvbmZpZy5CU1NJRCA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnLkJTU0lEID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBXaWZpQ29uZmlndXJhdGlvbi5wcmlvcml0eVZhck5hbWUpOworICAgICAgICBjb25maWcucHJpb3JpdHkgPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24uaGlkZGVuU1NJRFZhck5hbWUpOworICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IGZhbHNlOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcuaGlkZGVuU1NJRCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpICE9IDA7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ud2VwVHhLZXlJZHhWYXJOYW1lKTsKKyAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSAtMTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLndlcFR4S2V5SW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZ25vcmUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24ud2VwS2V5VmFyTmFtZXNbaV0pOworICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWcud2VwS2V5c1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgV2lmaUNvbmZpZ3VyYXRpb24ucHNrVmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcucHJlU2hhcmVkS2V5ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uUHJvdG9jb2wudmFyTmFtZSk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsc1tdID0gdmFsdWUuc3BsaXQoIiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbCA6IHZhbHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICBsb29rdXBTdHJpbmcodmFsLCBXaWZpQ29uZmlndXJhdGlvbi5Qcm90b2NvbC5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scy5zZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKGNvbmZpZy5uZXR3b3JrSWQsCisgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24uS2V5TWdtdC52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLktleU1nbXQuc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50LnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5BdXRoQWxnb3JpdGhtLnZhck5hbWUpOworICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHNbXSA9IHZhbHVlLnNwbGl0KCIgIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgbG9va3VwU3RyaW5nKHZhbCwgV2lmaUNvbmZpZ3VyYXRpb24uQXV0aEFsZ29yaXRobS5zdHJpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWcuYWxsb3dlZEF1dGhBbGdvcml0aG1zLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5QYWlyd2lzZUNpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLlBhaXJ3aXNlQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkUGFpcndpc2VDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBXaWZpTmF0aXZlLmdldE5ldHdvcmtWYXJpYWJsZUNvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwKKyAgICAgICAgICAgICAgICBXaWZpQ29uZmlndXJhdGlvbi5Hcm91cENpcGhlci52YXJOYW1lKTsKKyAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWxzW10gPSB2YWx1ZS5zcGxpdCgiICIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsIDogdmFscykgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgIGxvb2t1cFN0cmluZyh2YWwsIFdpZmlDb25maWd1cmF0aW9uLkdyb3VwQ2lwaGVyLnN0cmluZ3MpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChXaWZpQ29uZmlndXJhdGlvbi5FbnRlcnByaXNlRmllbGQgZmllbGQgOgorICAgICAgICAgICAgICAgIGNvbmZpZy5lbnRlcnByaXNlRmllbGRzKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwKKyAgICAgICAgICAgICAgICAgICAgZmllbGQudmFyTmFtZSgpKTsKKyAgICAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IGNvbmZpZy5lYXApIHZhbHVlID0gcmVtb3ZlRG91YmxlUXVvdGVzKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRG91YmxlUXVvdGVzKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSA8PSAyKSByZXR1cm4gIiI7CisgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEsIHN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9RdW90ZWRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gIlwiIiArIHN0cmluZyArICJcIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VTdHJpbmcoQml0U2V0IHNldCwgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbnQgbmV4dFNldEJpdCA9IC0xOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSBhbGwgc2V0IGJpdHMgYXJlIGluIFswLCBzdHJpbmdzLmxlbmd0aCkgdG8gYXZvaWQKKyAgICAgICAgICogZ29pbmcgb3V0IG9mIGJvdW5kcyBvbiBzdHJpbmdzLiAgKFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLikgKi8KKyAgICAgICAgc2V0ID0gc2V0LmdldCgwLCBzdHJpbmdzLmxlbmd0aCk7CisKKyAgICAgICAgd2hpbGUgKChuZXh0U2V0Qml0ID0gc2V0Lm5leHRTZXRCaXQobmV4dFNldEJpdCArIDEpKSAhPSAtMSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzdHJpbmdzW25leHRTZXRCaXRdLnJlcGxhY2UoJ18nLCAnLScpKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzcGFjZQorICAgICAgICBpZiAoc2V0LmNhcmRpbmFsaXR5KCkgPiAwKSB7CisgICAgICAgICAgICBidWYuc2V0TGVuZ3RoKGJ1Zi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBsb29rdXBTdHJpbmcoU3RyaW5nIHN0cmluZywgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBpbnQgc2l6ZSA9IHN0cmluZ3MubGVuZ3RoOworCisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCctJywgJ18nKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKHN0cmluZ3NbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgIC8vIGlmIHdlIGV2ZXIgZ2V0IGhlcmUsIHdlIHNob3VsZCBwcm9iYWJseSBhZGQgdGhlCisgICAgICAgIC8vIHZhbHVlIHRvIFdpZmlDb25maWd1cmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCisgICAgICAgIC8vIHN1cHBvcnRlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQKKyAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvb2stdXAgYSBzdHJpbmc6ICIgKyBzdHJpbmcpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGR1bXAoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBzYi5hcHBlbmQoInNMYXN0UHJpb3JpdHkgIikuYXBwZW5kKHNMYXN0UHJpb3JpdHkpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgiQ29uZmlndXJlZCBuZXR3b3JrcyAiKS5hcHBlbmQoTFMpOworICAgICAgICBmb3IgKFdpZmlDb25maWd1cmF0aW9uIGNvbmYgOiBnZXRDb25maWd1cmVkTmV0d29ya3MoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGNvbmYpLmFwcGVuZChMUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWd1cmF0aW9uLmphdmEKaW5kZXggMDFiYzkxOS4uY2E0ZjI5ZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ3VyYXRpb24uamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAvKioKICAgICAgKiBUaGUgbmV0d29yaydzIFNTSUQuIENhbiBlaXRoZXIgYmUgYW4gQVNDSUkgc3RyaW5nLAogICAgICAqIHdoaWNoIG11c3QgYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RhdGlvbiBtYXJrcwotICAgICAqIChlLmcuLCB7QGNvZGUgJnF1b3Q7TXlOZXR3b3JrJnF1b3Q7fSwgb3IgYSBzdHJpbmcgb2YKKyAgICAgKiAoZS5nLiwge0Bjb2RlICJNeU5ldHdvcmsifSwgb3IgYSBzdHJpbmcgb2YKICAgICAgKiBoZXggZGlnaXRzLHdoaWNoIGFyZSBub3QgZW5jbG9zZWQgaW4gcXVvdGVzCiAgICAgICogKGUuZy4sIHtAY29kZSAwMWEyNDNmNDA1fSkuCiAgICAgICovCkBAIC0yMzksNyArMjM5LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIHByZVNoYXJlZEtleTsKICAgICAvKioKICAgICAgKiBVcCB0byBmb3VyIFdFUCBrZXlzLiBFaXRoZXIgYW4gQVNDSUkgc3RyaW5nIGVuY2xvc2VkIGluIGRvdWJsZQotICAgICAqIHF1b3RhdGlvbiBtYXJrcyAoZS5nLiwge0Bjb2RlICZxdW90O2FiY2RlZiZxdW90O30gb3IgYSBzdHJpbmcKKyAgICAgKiBxdW90YXRpb24gbWFya3MgKGUuZy4sIHtAY29kZSAiYWJjZGVmIn0gb3IgYSBzdHJpbmcKICAgICAgKiBvZiBoZXggZGlnaXRzIChlLmcuLCB7QGNvZGUgMDEwMjAzMDQwNX0pLgogICAgICAqIDxwLz4KICAgICAgKiBXaGVuIHRoZSB2YWx1ZSBvZiBvbmUgb2YgdGhlc2Uga2V5cyBpcyByZWFkLCB0aGUgYWN0dWFsIGtleSBpcwpAQCAtNDMyLDYgKzQzMiwzOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFdpZmlDb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyBXaWZpQ29uZmlndXJhdGlvbi4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBXaWZpQ29uZmlndXJhdGlvbiBjbG9uZSgpIHsKKyAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IFdpZmlDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmZpZy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7CisgICAgICAgIGNvbmZpZy5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIGNvbmZpZy5TU0lEID0gU1NJRDsKKyAgICAgICAgY29uZmlnLkJTU0lEID0gQlNTSUQ7CisgICAgICAgIGNvbmZpZy5wcmVTaGFyZWRLZXkgPSBwcmVTaGFyZWRLZXk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZXBLZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgY29uZmlnLndlcEtleXNbaV0gPSB3ZXBLZXlzW2ldOworCisgICAgICAgIGNvbmZpZy53ZXBUeEtleUluZGV4ID0gd2VwVHhLZXlJbmRleDsKKyAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICAgIGNvbmZpZy5oaWRkZW5TU0lEID0gaGlkZGVuU1NJRDsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRLZXlNYW5hZ2VtZW50ICAgPSAoQml0U2V0KSBhbGxvd2VkS2V5TWFuYWdlbWVudC5jbG9uZSgpOworICAgICAgICBjb25maWcuYWxsb3dlZFByb3RvY29scyAgICAgICA9IChCaXRTZXQpIGFsbG93ZWRQcm90b2NvbHMuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRBdXRoQWxnb3JpdGhtcyAgPSAoQml0U2V0KSBhbGxvd2VkQXV0aEFsZ29yaXRobXMuY2xvbmUoKTsKKyAgICAgICAgY29uZmlnLmFsbG93ZWRQYWlyd2lzZUNpcGhlcnMgPSAoQml0U2V0KSBhbGxvd2VkUGFpcndpc2VDaXBoZXJzLmNsb25lKCk7CisgICAgICAgIGNvbmZpZy5hbGxvd2VkR3JvdXBDaXBoZXJzICAgID0gKEJpdFNldCkgYWxsb3dlZEdyb3VwQ2lwaGVycy5jbG9uZSgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50ZXJwcmlzZUZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29uZmlnLmVudGVycHJpc2VGaWVsZHNbaV0uc2V0VmFsdWUoZW50ZXJwcmlzZUZpZWxkc1tpXS52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKwogICAgIC8qKiBJbXBsZW1lbnQgdGhlIFBhcmNlbGFibGUgaW50ZXJmYWNlIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKICAgICAgICAgZGVzdC53cml0ZUludChuZXR3b3JrSWQpOwpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNYW5hZ2VyLmphdmEKaW5kZXggOWQyMTUyMS4uOGMzZWM1ZiAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1hbmFnZXIuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTWFuYWdlci5qYXZhCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRElTQUJMSU5HID0gMTA7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgZGlzYWJsZWQuCiAgICAgICoKQEAgLTE3NCw3ICsxNzQsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEID0gMTE7CiAgICAgLyoqCiAgICAgICogV2ktRmkgQVAgaXMgY3VycmVudGx5IGJlaW5nIGVuYWJsZWQuIFRoZSBzdGF0ZSB3aWxsIGNoYW5nZSB0bwogICAgICAqIHtAbGluayAjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSBpZiBpdCBmaW5pc2hlcyBzdWNjZXNzZnVsbHkuCkBAIC0xODQsNyArMTg0LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTElORyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9FTkFCTElORyA9IDEyOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGVuYWJsZWQuCiAgICAgICoKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX0FQX1NUQVRFX0VOQUJMRUQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRU5BQkxFRCA9IDEzOwogICAgIC8qKgogICAgICAqIFdpLUZpIEFQIGlzIGluIGEgZmFpbGVkIHN0YXRlLiBUaGlzIHN0YXRlIHdpbGwgb2NjdXIgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nCiAgICAgICogZW5hYmxpbmcgb3IgZGlzYWJsaW5nCkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9BUF9TVEFURV9GQUlMRUQgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJRklfQVBfU1RBVEVfRkFJTEVEID0gMTQ7CiAKICAgICAvKioKICAgICAgKiBCcm9hZGNhc3QgaW50ZW50IGFjdGlvbiBpbmRpY2F0aW5nIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50IGhhcwpAQCAtMjc0LDcgKzI3NCwxNCBAQAogICAgICAqIEBzZWUgI0VSUk9SX0FVVEhFTlRJQ0FUSU5HCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU1VQUExJQ0FOVF9FUlJPUiA9ICJzdXBwbGljYW50RXJyb3IiOwotCisgICAgLyoqCisgICAgICogQnJvYWRjYXN0IGludGVudCBhY3Rpb24gaW5kaWNhdGluZyB0aGF0IHRoZSBzdXBwbGljYW50IGNvbmZpZ3VyYXRpb24gY2hhbmdlZC4KKyAgICAgKiBUaGlzIGNhbiBiZSBhcyBhIHJlc3VsdCBvZiBhZGRpbmcvdXBkYXRpbmcvZGVsZXRpbmcgYSBuZXR3b3JrCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUFBMSUNBTlRfQ09ORklHX0NIQU5HRURfQUNUSU9OID0KKyAgICAgICAgImFuZHJvaWQubmV0LndpZmkuc3VwcGxpY2FudC5DT05GSUdfQ0hBTkdFIjsKICAgICAvKioKICAgICAgKiBBbiBhY2Nlc3MgcG9pbnQgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIHN1cHBsaWNhbnQuCiAgICAgICogQ2FsbCB7QGxpbmsgI2dldFNjYW5SZXN1bHRzKCl9IHRvIG9idGFpbiB0aGUgcmVzdWx0cy4KQEAgLTI5MywxMSArMzAwLDI2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTkVXX1JTU0kgPSAibmV3UnNzaSI7CiAKICAgICAvKioKKyAgICAgKiBCcm9hZGNhc3QgaW50ZW50IGFjdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIElQIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBjaGFuZ2VkIG9uIHdpZmkuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DSEFOR0VEX0FDVElPTiA9ICJhbmRyb2lkLm5ldC53aWZpLkNPTkZJR19DSEFOR0VEIjsKKyAgICAvKioKKyAgICAgKiBUaGUgbG9va3VwIGtleSBmb3IgYSB7QGxpbmsgYW5kcm9pZC5uZXQuTGlua1Byb3BlcnRpZXN9IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogV2ktRmkgbmV0d29yay4gUmV0cmlldmUgd2l0aAorICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50I2dldFBhcmNlbGFibGVFeHRyYShTdHJpbmcpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0xJTktfUFJPUEVSVElFUyA9ICJsaW5rUHJvcGVydGllcyI7CisKKyAgICAvKioKICAgICAgKiBUaGUgbmV0d29yayBJRHMgb2YgdGhlIGNvbmZpZ3VyZWQgbmV0d29ya3MgY291bGQgaGF2ZSBjaGFuZ2VkLgogICAgICAqLwogICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19JRFNfQ0hBTkdFRF9BQ1RJT04gPSAiYW5kcm9pZC5uZXQud2lmaS5ORVRXT1JLX0lEU19DSEFOR0VEIjsKLSAgICAKKwogICAgIC8qKgogICAgICAqIEFjdGl2aXR5IEFjdGlvbjogUGljayBhIFdpLUZpIG5ldHdvcmsgdG8gY29ubmVjdCB0by4KICAgICAgKiA8cD5JbnB1dDogTm90aGluZy4KQEAgLTMwNywxNiArMzI5LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUElDS19XSUZJX05FVFdPUksgPSAiYW5kcm9pZC5uZXQud2lmaS5QSUNLX1dJRklfTkVUV09SSyI7CiAKICAgICAvKioKLSAgICAgKiBJbiB0aGlzIFdpLUZpIGxvY2sgbW9kZSwgV2ktRmkgd2lsbCBiZWhhdmUgYXMgaW4gdGhlIG1vZGUKLSAgICAgKiB7QGxpbmsgI1dJRklfTU9ERV9GVUxMfSBidXQgaXQgb3BlcmF0ZXMgYXQgaGlnaCBwZXJmb3JtYW5jZQotICAgICAqIGF0IHRoZSBleHBlbnNlIG9mIHBvd2VyLiBUaGlzIG1vZGUgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiBvbmx5IHdoZW4gdGhlIHdpZmkgY29ubmVjdGlvbiBuZWVkcyB0byBoYXZlIG1pbmltdW0gbG9zcyBhbmQgbG93Ci0gICAgICogbGF0ZW5jeSBhcyBpdCBjYW4gaW1wYWN0IHRoZSBiYXR0ZXJ5IGxpZmUuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSUZJX01PREVfRlVMTF9ISUdIX1BFUkYgPSAzOwotCi0gICAgLyoqCiAgICAgICogSW4gdGhpcyBXaS1GaSBsb2NrIG1vZGUsIFdpLUZpIHdpbGwgYmUga2VwdCBhY3RpdmUsCiAgICAgICogYW5kIHdpbGwgYmVoYXZlIG5vcm1hbGx5LCBpLmUuLCBpdCB3aWxsIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseQogICAgICAqIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gYSByZW1lbWJlcmVkIGFjY2VzcyBwb2ludCB0aGF0IGlzCkBAIC01MTIsNyArNTI0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01MjYsNyArNTM5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWNvbm5lY3QoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UucmVjb25uZWN0KCk7CisgICAgICAgICAgICBtU2VydmljZS5yZWNvbm5lY3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01NDAsNyArNTU0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5yZWFzc29jaWF0ZSgpOworICAgICAgICAgICAgbVNlcnZpY2UucmVhc3NvY2lhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC01NjksNyArNTg0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNjYW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlcnZpY2Uuc3RhcnRTY2FuKGZhbHNlKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0U2NhbihmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtNTg3LDcgKzYwMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3RhcnRTY2FuQWN0aXZlKCkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLnN0YXJ0U2Nhbih0cnVlKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnN0YXJ0U2Nhbih0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC03NTMsOCArNzcwLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChyc3NpID49IE1BWF9SU1NJKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVtTGV2ZWxzIC0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBwYXJ0aXRpb25TaXplID0gKE1BWF9SU1NJIC0gTUlOX1JTU0kpIC8gKG51bUxldmVscyAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIChyc3NpIC0gTUlOX1JTU0kpIC8gcGFydGl0aW9uU2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IGlucHV0UmFuZ2UgPSAoTUFYX1JTU0kgLSBNSU5fUlNTSSk7CisgICAgICAgICAgICBmbG9hdCBvdXRwdXRSYW5nZSA9IChudW1MZXZlbHMgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoZmxvYXQpKHJzc2kgLSBNSU5fUlNTSSkgKiBvdXRwdXRSYW5nZSAvIGlucHV0UmFuZ2UpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtODQ4LDYgKzg2NiwxNjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgLyoqCisgICAgICogU3RhcnQgdGhlIGRyaXZlciBhbmQgY29ubmVjdCB0byBuZXR3b3JrLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIG92ZXItcmlkZSBXaWZpTG9jayBhbmQgZGV2aWNlIGlkbGUgc3RhdHVzLiBGb3IgZXhhbXBsZSwKKyAgICAgKiBldmVuIGlmIHRoZSBkZXZpY2UgaXMgaWRsZSBvciB0aGVyZSBpcyBvbmx5IGEgc2Nhbi1vbmx5IGxvY2sgaGVsZCwKKyAgICAgKiBhIHN0YXJ0IHdpZmkgd291bGQgbWVhbiB0aGF0IHdpZmkgY29ubmVjdGlvbiBpcyBrZXB0IGFjdGl2ZSB1bnRpbAorICAgICAqIGEgc3RvcFdpZmkoKSBpcyBzZW50LgorICAgICAqCisgICAgICogVGhpcyBBUEkgaXMgdXNlZCBieSBXaWZpU3RhdGVUcmFja2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzIGVsc2Uge0Bjb2RlIGZhbHNlfQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RhcnRXaWZpKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKGlmIGFueSkgYW5kIHN0b3AgdGhlIGRyaXZlci4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyLXJpZGUgV2lmaUxvY2sgYW5kIGRldmljZSBpZGxlIHN0YXR1cy4gV2ktRmkKKyAgICAgKiBzdGF5cyBpbmFjdGl2ZSB1bnRpbCBhIHN0YXJ0V2lmaSgpIGlzIGlzc3VlZC4KKyAgICAgKgorICAgICAqIFRoaXMgQVBJIGlzIHVzZWQgYnkgV2lmaVN0YXRlVHJhY2tlcgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBlbHNlIHtAY29kZSBmYWxzZX0KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BXaWZpKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc3RvcFdpZmkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgYnNzaWQgdG8gdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmFkZFRvQmxhY2tsaXN0KGJzc2lkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHN1cHBsaWNhbnQgYmxhY2tsaXN0CisgICAgICoKKyAgICAgKiBUaGlzIEFQSSBpcyB1c2VkIGJ5IFdpZmlXYXRjaGRvZ1NlcnZpY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgZWxzZSB7QGNvZGUgZmFsc2V9CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjbGVhckJsYWNrbGlzdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNsZWFyQmxhY2tsaXN0KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRPRE86IGRlcHJlY2F0ZSBzeW5jaHJvbm91cyBBUEkgYW5kIG9wZW4gdXAgdGhlIGZvbGxvd2luZyBBUEkgKi8KKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIGEgbmV0d29yayB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBUaGUgbmV0d29yayBhbHNvCisgICAgICogZ2V0cyBhZGRlZCB0byB0aGUgc3VwcGxpY2FudCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogRm9yIGEgbmV3IG5ldHdvcmssIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnN0ZWFkIG9mIGEKKyAgICAgKiBzZXF1ZW5jZSBvZiBhZGROZXR3b3JrKCksIGVuYWJsZU5ldHdvcmsoKSwgc2F2ZUNvbmZpZ3VyYXRpb24oKSBhbmQKKyAgICAgKiByZWNvbm5lY3QoKQorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aENvbmZpZyhjb25maWcpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byBhIG5ldHdvcmsgd2l0aCB0aGUgZ2l2ZW4gbmV0d29ya0lkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluc3RlYWQgb2YgYSBlbmFibGVOZXR3b3JrKCksIHNhdmVDb25maWd1cmF0aW9uKCkgYW5kCisgICAgICogcmVjb25uZWN0KCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgdGhlIG5ldHdvcmsgaWQgaWRlbnRpZml5aW5nIHRoZSBuZXR3b3JrIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgIHN1cHBsaWNhbnQgY29uZmlndXJhdGlvbiBsaXN0CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0TmV0d29yayhpbnQgbmV0d29ya0lkKSB7CisgICAgICAgIGlmIChuZXR3b3JrSWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmNvbm5lY3ROZXR3b3JrV2l0aElkKG5ldHdvcmtJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7IH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBnaXZlbiBuZXR3b3JrIGluIHRoZSBzdXBwbGljYW50IGNvbmZpZy4gSWYgdGhlIG5ldHdvcmsgYWxyZWFkeQorICAgICAqIGV4aXN0cywgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdXBkYXRlZC4gQSBuZXcgbmV0d29yayBpcyBlbmFibGVkCisgICAgICogYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEZvciBhIG5ldyBuZXR3b3JrLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhCisgICAgICogc2VxdWVuY2Ugb2YgYWRkTmV0d29yaygpLCBlbmFibGVOZXR3b3JrKCkgYW5kIHNhdmVDb25maWd1cmF0aW9uKCkuCisgICAgICoKKyAgICAgKiBGb3IgYW4gZXhpc3RpbmcgbmV0d29yaywgaXQgYWNjb21wbGlzaGVzIHRoZSB0YXNrIG9mIHVwZGF0ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBzZXQgb2YgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24sCisgICAgICogICAgICAgICAgICBjb250YWluZWQgaW4gYSB7QGxpbmsgV2lmaUNvbmZpZ3VyYXRpb259IG9iamVjdC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmVOZXR3b3JrKFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2Uuc2F2ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgbmV0d29yayBpbiB0aGUgc3VwcGxpY2FudCBjb25maWcuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHNlcXVlbmNlIG9mIHJlbW92ZU5ldHdvcmsoKQorICAgICAqIGFuZCBzYXZlQ29uZmlndXJhdGlvbigpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgc2V0IG9mIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoZSBjb25maWd1cmF0aW9uLAorICAgICAqICAgICAgICAgICAgY29udGFpbmVkIGluIGEge0BsaW5rIFdpZmlDb25maWd1cmF0aW9ufSBvYmplY3QuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBpZiAobmV0SWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLmZvcmdldE5ldHdvcmsobmV0SWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeyB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGtlZXAgdGhlIFdpLUZpIHJhZGlvIGF3YWtlLgogICAgICAqIE5vcm1hbGx5IHRoZSBXaS1GaSByYWRpbyBtYXkgdHVybiBvZmYgd2hlbiB0aGUgdXNlciBoYXMgbm90IHVzZWQgdGhlIGRldmljZSBpbiBhIHdoaWxlLgpAQCAtMTAwMyw5ICsxMTgxLDggQEAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGEgbmV3IFdpZmlMb2NrLgogICAgICAqCi0gICAgICogQHBhcmFtIGxvY2tUeXBlIHRoZSB0eXBlIG9mIGxvY2sgdG8gY3JlYXRlLiBTZWUge0BsaW5rICNXSUZJX01PREVfRlVMTH0sCi0gICAgICogYW5kIHtAbGluayAjV0lGSV9NT0RFX1NDQU5fT05MWX0gZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGUgdHlwZXMgb2YgV2ktRmkgbG9ja3MuCi0gICAgICoKKyAgICAgKiBAcGFyYW0gbG9ja1R5cGUgdGhlIHR5cGUgb2YgbG9jayB0byBjcmVhdGUuIFNlZSB7QGxpbmsgI1dJRklfTU9ERV9GVUxMfSBhbmQKKyAgICAgKiB7QGxpbmsgI1dJRklfTU9ERV9TQ0FOX09OTFl9IGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIHR5cGVzIG9mIFdpLUZpIGxvY2tzLgogICAgICAqIEBwYXJhbSB0YWcgYSB0YWcgZm9yIHRoZSBXaWZpTG9jayB0byBpZGVudGlmeSBpdCBpbiBkZWJ1Z2dpbmcgbWVzc2FnZXMuICBUaGlzIHN0cmluZyBpcyAKICAgICAgKiAgICAgICAgICAgIG5ldmVyIHNob3duIHRvIHRoZSB1c2VyIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCBidXQgc2hvdWxkIGJlIGRlc2NyaXB0aXZlIAogICAgICAqICAgICAgICAgICAgZW5vdWdoIHRvIGlkZW50aWZ5IHlvdXIgYXBwbGljYXRpb24gYW5kIHRoZSBzcGVjaWZpYyBXaWZpTG9jayB3aXRoaW4gaXQsIGlmIGl0CmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQppbmRleCAyNjZkODAxLi5hZjMxMzJmIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKQEAgLTE5LDE0ICsxOSwxMyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogCiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiAKIC8qKgogICogTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gdGhlIHdwYV9zdXBwbGljYW50IHNlcnZlciwgYW5kIHBhc3NlcyB0aGVtIG9uCi0gKiB0byB0aGUge0BsaW5rIFdpZmlTdGF0ZVRyYWNrZXJ9IGZvciBoYW5kbGluZy4gUnVucyBpbiBpdHMgb3duIHRocmVhZC4KKyAqIHRvIHRoZSB7QGxpbmsgV2lmaVN0YXRlTWFjaGluZX0gZm9yIGhhbmRsaW5nLiBSdW5zIGluIGl0cyBvd24gdGhyZWFkLgogICoKICAqIEBoaWRlCiAgKi8KQEAgLTExNyw3ICsxMTYsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm4gbUNvbm5lY3RlZEV2ZW50UGF0dGVybiA9CiAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKCg/OlswLTlhLWZdezJ9Oil7NX1bMC05YS1mXXsyfSkgLiogXFxbaWQ9KFswLTldKykgIik7CiAKLSAgICBwcml2YXRlIGZpbmFsIFdpZmlTdGF0ZVRyYWNrZXIgbVdpZmlTdGF0ZVRyYWNrZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVNYWNoaW5lIG1XaWZpU3RhdGVNYWNoaW5lOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBpbmRpY2F0ZXMgdGhlIHN1cHBsaWNhbnQgY29ubmVjdGlvbiBmb3IgdGhlIG1vbml0b3IgaXMgY2xvc2VkCkBAIC0xMzksMzEgKzEzOCwyNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDVl9FUlJPUlMgICAgPSAxMDsKIAotICAgIHB1YmxpYyBXaWZpTW9uaXRvcihXaWZpU3RhdGVUcmFja2VyIHRyYWNrZXIpIHsKLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIgPSB0cmFja2VyOworICAgIHB1YmxpYyBXaWZpTW9uaXRvcihXaWZpU3RhdGVNYWNoaW5lIHdpZmlTdGF0ZU1hY2hpbmUpIHsKKyAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUgPSB3aWZpU3RhdGVNYWNoaW5lOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKICAgICAgICAgbmV3IE1vbml0b3JUaHJlYWQoKS5zdGFydCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBOZXR3b3JrU3RhdGVUcmFja2VyIGdldE5ldHdvcmtTdGF0ZVRyYWNrZXIoKSB7Ci0gICAgICAgIHJldHVybiBtV2lmaVN0YXRlVHJhY2tlcjsKLSAgICB9Ci0KICAgICBjbGFzcyBNb25pdG9yVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKICAgICAgICAgcHVibGljIE1vbml0b3JUaHJlYWQoKSB7CiAgICAgICAgICAgICBzdXBlcigiV2lmaU1vbml0b3IiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAKICAgICAgICAgICAgIGlmIChjb25uZWN0VG9TdXBwbGljYW50KCkpIHsKICAgICAgICAgICAgICAgICAvLyBTZW5kIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHNlbmQgY29tbWFuZHMKICAgICAgICAgICAgICAgICAvLyB0byB0aGUgc3VwcGxpY2FudAotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlTdXBwbGljYW50TG9zdCgpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMjU5LDcgKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgYW5kIGV4aXQKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5U3VwcGxpY2FudExvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXZlbnQoZXZlbnQsIGV2ZW50RGF0YSk7CkBAIC0yNzIsNyArMjY3LDcgQEAKICAgICAgICAgICAgIGludCBjb25uZWN0VHJpZXMgPSAwOwogCiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGlmIChtV2lmaVN0YXRlVHJhY2tlci5jb25uZWN0VG9TdXBwbGljYW50KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoV2lmaU5hdGl2ZS5jb25uZWN0VG9TdXBwbGljYW50KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjb25uZWN0VHJpZXMrKyA8IDMpIHsKQEAgLTI4NSw3ICsyODAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QoKSB7Ci0gICAgICAgICAgICBtV2lmaVN0YXRlVHJhY2tlci5ub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCk7CisgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRHJpdmVyRXZlbnQoU3RyaW5nIHN0YXRlKSB7CkBAIC0yOTMsMTEgKzI4OCwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0ZS5lcXVhbHMoIlNUT1BQRUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlclN0b3BwZWQoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJTdG9wcGVkKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmVxdWFscygiU1RBUlRFRCIpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5RHJpdmVyU3RhcnRlZCgpOworICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKCJIQU5HRUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeURyaXZlckh1bmcoKTsKKyAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJIdW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzE4LDcgKzMxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFM6Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVUcmFja2VyLm5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgY2FzZSBVTktOT1dOOgpAQCAtMzc1LDcgKzM3MCw3IEBACiAgICAgICAgICAgICBpZiAobmV3U3VwcGxpY2FudFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTlZBTElEKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSW52YWxpZCBzdXBwbGljYW50IHN0YXRlOiAiICsgbmV3U3RhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3RhdGVDaGFuZ2UobmV0d29ya0lkLCBCU1NJRCwgbmV3U3VwcGxpY2FudFN0YXRlKTsKKyAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShuZXR3b3JrSWQsIEJTU0lELCBuZXdTdXBwbGljYW50U3RhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTUsNyArMzkwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVdpZmlTdGF0ZVRyYWNrZXIubm90aWZ5U3RhdGVDaGFuZ2UobmV3U3RhdGUsIEJTU0lELCBuZXR3b3JrSWQpOworICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlOZXR3b3JrU3RhdGVDaGFuZ2UobmV3U3RhdGUsIEJTU0lELCBuZXR3b3JrSWQpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU5hdGl2ZS5qYXZhCmluZGV4IDI1ZjA1YzAuLjg2MmE2MWIgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlOYXRpdmUuamF2YQorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTmF0aXZlLmphdmEKQEAgLTQxLDYgKzQxLDggQEAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBTdHJpbmcgZ2V0RXJyb3JTdHJpbmcoaW50IGVycm9yQ29kZSk7CiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIGxvYWREcml2ZXIoKTsKKworICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGJvb2xlYW4gaXNEcml2ZXJMb2FkZWQoKTsKICAgICAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHVubG9hZERyaXZlcigpOwogCkBAIC0xMDksNiArMTExLDEwIEBACiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldFBvd2VyTW9kZUNvbW1hbmQoaW50IG1vZGUpOwogCisgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgaW50IGdldEJhbmRDb21tYW5kKCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldEJhbmRDb21tYW5kKGludCBiYW5kKTsKKwogICAgIHB1YmxpYyBuYXRpdmUgc3RhdGljIGludCBnZXRQb3dlck1vZGVDb21tYW5kKCk7CiAKICAgICBwdWJsaWMgbmF0aXZlIHN0YXRpYyBib29sZWFuIHNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQoaW50IG51bUNoYW5uZWxzKTsKQEAgLTE0OSw4ICsxNTUsNiBAQAogCiAgICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgU3RyaW5nIGdldERoY3BFcnJvcigpOwogCi0gICAgcHVibGljIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBzZXRTdXNwZW5kT3B0aW1pemF0aW9uc0NvbW1hbmQoYm9vbGVhbiBlbmFibGVkKTsKLQogICAgIC8qKgogICAgICAqIFdhaXQgZm9yIHRoZSBzdXBwbGljYW50IHRvIHNlbmQgYW4gZXZlbnQsIHJldHVybmluZyB0aGUgZXZlbnQgc3RyaW5nLgogICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHN0cmluZyBzZW50IGJ5IHRoZSBzdXBwbGljYW50LgpkaWZmIC0tZ2l0IGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlTWFjaGluZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlTWFjaGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxY2JmNWIKLS0tIC9kZXYvbnVsbAorKysgYi93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKQEAgLTAsMCArMSwzMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047CisKKy8qKgorICogVE9ETzogQWRkIHNvZnQgQVAgc3RhdGVzIGFzIHBhcnQgb2YgV0lGSV9TVEFURV9YWFgKKyAqIFJldGFpbiBXSUZJX1NUQVRFX0VOQUJMSU5HIHRoYXQgaW5kaWNhdGVzIGRyaXZlciBpcyBsb2FkaW5nCisgKiBBZGQgV0lGSV9TVEFURV9BUF9FTkFCTEVEIHRvIGluZGljYXRlIHNvZnQgQVAgaGFzIHN0YXJ0ZWQKKyAqIGFuZCBXSUZJX1NUQVRFX0ZBSUxFRCBmb3IgZmFpbHVyZQorICogRGVwcmVjYXRlIFdJRklfU1RBVEVfVU5LTk9XTgorICoKKyAqIERvaW5nIHRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbG9naWMgZm9yIHNlbmRpbmcgYnJvYWRjYXN0cworICovCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9ESVNBQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0RJU0FCTElORzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0VOQUJMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9BUF9TVEFURV9FTkFCTElORzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX0FQX1NUQVRFX0ZBSUxFRDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaUNvbmZpZ3VyYXRpb24uU3RhdHVzOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuSUJhY2t1cE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEhlYWRzZXQ7CitpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoQTJkcDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklCYXR0ZXJ5U3RhdHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5IaWVyYXJjaGljYWxTdGF0ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIFRyYWNrIHRoZSBzdGF0ZSBvZiBXaWZpIGNvbm5lY3Rpdml0eS4gQWxsIGV2ZW50IGhhbmRsaW5nIGlzIGRvbmUgaGVyZSwKKyAqIGFuZCBhbGwgY2hhbmdlcyBpbiBjb25uZWN0aXZpdHkgc3RhdGUgYXJlIGluaXRpYXRlZCBoZXJlLgorICoKKyAqIEBoaWRlCisgKi8KKy8vVE9ETzogd2Ugc3RpbGwgbmVlZCBmcmVxdWVudCBzY2FubmluZyBmb3IgdGhlIGNhc2Ugd2hlbgorLy8gd2UgaXNzdWUgZGlzY29ubmVjdCBidXQgbmVlZCBzY2FuIHJlc3VsdHMgZm9yIG9wZW4gbmV0d29yayBub3RpZmljYXRpb24KK3B1YmxpYyBjbGFzcyBXaWZpU3RhdGVNYWNoaW5lIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVN0YXRlTWFjaGluZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktUWVBFID0gIldJRkkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CisKKyAgICAvKiBUT0RPOiBmZXRjaCBhIGNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVEFQX0lGQUNFID0gIndsMC4xIjsKKworICAgIHByaXZhdGUgV2lmaU1vbml0b3IgbVdpZmlNb25pdG9yOworICAgIHByaXZhdGUgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBud1NlcnZpY2U7CisgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIG1DbTsKKworICAgIC8qIFNjYW4gcmVzdWx0cyBoYW5kbGluZyAqLworICAgIHByaXZhdGUgTGlzdDxTY2FuUmVzdWx0PiBtU2NhblJlc3VsdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBzY2FuUmVzdWx0UGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiXHQrIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUX0NBQ0hFX1NJWkUgPSA4MDsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTY2FuUmVzdWx0PiBtU2NhblJlc3VsdENhY2hlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbUludGVyZmFjZU5hbWU7CisKKyAgICBwcml2YXRlIGludCBtTnVtQWxsb3dlZENoYW5uZWxzID0gMDsKKyAgICBwcml2YXRlIGludCBtTGFzdFNpZ25hbExldmVsID0gLTE7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RCc3NpZDsKKyAgICBwcml2YXRlIGludCBtTGFzdE5ldHdvcmtJZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZVJzc2lQb2xsaW5nID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IG1SZWNvbm5lY3RDb3VudCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Db25maWdDaGFuZ2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW5jZSBvZiB0aGUgYmx1ZXRvb3RoIGhlYWRzZXQgaGVscGVyLiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCisgICAgICogbm90ZWQgYnkgaXRzIGphdmFkb2MuIElmIHdlIGNoZWNrIGJlZm9yZSBpdCBpcyBjb25uZWN0ZWQsIGl0IHdpbGwgYmUKKyAgICAgKiBpbiBhbiBlcnJvciBzdGF0ZSBhbmQgd2Ugd2lsbCBub3QgZGlzYWJsZSBjb2V4aXN0ZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUJsdWV0b290aEhlYWRzZXQ7CisKKyAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUJsdWV0b290aEEyZHA7CisKKyAgICAvKioKKyAgICAgKiBPYnNlcnZlcyB0aGUgc3RhdGljIElQIGFkZHJlc3Mgc2V0dGluZ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworCisgICAgLy8gSGVsZCBkdXJpbmcgZHJpdmVyIGxvYWQgYW5kIHVubG9hZAorICAgIHByaXZhdGUgc3RhdGljIFBvd2VyTWFuYWdlci5XYWtlTG9jayBzV2FrZUxvY2s7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisKKyAgICBwcml2YXRlIERoY3BJbmZvIG1EaGNwSW5mbzsKKyAgICBwcml2YXRlIFdpZmlJbmZvIG1XaWZpSW5mbzsKKyAgICBwcml2YXRlIE5ldHdvcmtJbmZvIG1OZXR3b3JrSW5mbzsKKyAgICBwcml2YXRlIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXI7CisgICAgLyogQ29ubmVjdGlvbiB0byBhIHNwZWNpZmljIG5ldHdvcmsgaW52b2x2ZXMgZGlzYWJsaW5nIGFsbCBuZXR3b3JrcywKKyAgICAgKiB0aGlzIGZsYWcgdHJhY2tzIGlmIG5ldHdvcmtzIG5lZWQgdG8gYmUgcmUtZW5hYmxlZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlQWxsTmV0d29ya3MgPSBmYWxzZTsKKworCisgICAgLy8gRXZlbnQgbG9nIHRhZ3MgKG11c3QgYmUgaW4gc3luYyB3aXRoIGV2ZW50LWxvZy10YWdzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQgICAgICAgID0gNTAwMjE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCAgICAgICAgPSA1MDAyMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICA9IDUwMDIzOworCisgICAgLyogTG9hZCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgLyogVW5sb2FkIHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1VOTE9BRF9EUklWRVIgICAgICAgICAgICAgICAgICAgID0gMjsKKyAgICAvKiBJbmRpY2F0ZXMgZHJpdmVyIGxvYWQgc3VjY2VlZGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgICA9IDM7CisgICAgLyogSW5kaWNhdGVzIGRyaXZlciBsb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfTE9BRF9EUklWRVJfRkFJTFVSRSAgICAgICAgICAgICAgPSA0OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIHN1Y2NlZWRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTICAgICAgICAgICAgPSA1OworICAgIC8qIEluZGljYXRlcyBkcml2ZXIgdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfVU5MT0FEX0RSSVZFUl9GQUlMVVJFICAgICAgICAgICAgPSA2OworCisgICAgLyogU3RhcnQgdGhlIHN1cHBsaWNhbnQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUQVJUX1NVUFBMSUNBTlQgICAgICAgICAgICAgICAgID0gMTE7CisgICAgLyogU3RvcCB0aGUgc3VwcGxpY2FudCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSAxMjsKKyAgICAvKiBTdGFydCB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9EUklWRVIgICAgICAgICAgICAgICAgICAgICA9IDEzOworICAgIC8qIFN0YXJ0IHRoZSBkcml2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgID0gMTQ7CisgICAgLyogSW5kaWNhdGVzIERIQ1Agc3VjY2VkZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0lQX0NPTkZJR19TVUNDRVNTICAgICAgICAgICAgICAgID0gMTU7CisgICAgLyogSW5kaWNhdGVzIERIQ1AgZmFpbGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9JUF9DT05GSUdfRkFJTFVSRSAgICAgICAgICAgICAgICA9IDE2OworICAgIC8qIFJlLWNvbmZpZ3VyZSBpbnRlcmZhY2UgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQ09ORklHVVJFX0lQICAgICAgICAgICAgICAgICAgID0gMTc7CisKKworICAgIC8qIFN0YXJ0IHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTsKKyAgICAvKiBTdG9wIHRoZSBzb2Z0IGFjY2VzcyBwb2ludCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RPUF9BUCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjsKKworCisgICAgLyogU3VwcGxpY2FudCBldmVudHMgKi8KKyAgICAvKiBDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgICAgID0gMzE7CisgICAgLyogQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgID0gMzI7CisgICAgLyogRHJpdmVyIHN0YXJ0IGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRfRVZFTlQgICAgICAgICAgICAgICAgICAgPSAzMzsKKyAgICAvKiBEcml2ZXIgc3RvcCBjb21wbGV0ZWQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BfRVZFTlQgICAgICAgICAgICAgICAgICAgID0gMzQ7CisgICAgLyogTmV0d29yayBjb25uZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgPSAzNjsKKyAgICAvKiBOZXR3b3JrIGRpc2Nvbm5lY3Rpb24gY29tcGxldGVkICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICA9IDM3OworICAgIC8qIFNjYW4gcmVzdWx0cyBhcmUgYXZhaWxhYmxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDM4OworICAgIC8qIFN1cHBsaWNhdGUgc3RhdGUgY2hhbmdlZCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCAgICAgICAgPSAzOTsKKyAgICAvKiBQYXNzd29yZCBtYXkgYmUgaW5jb3JyZWN0ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQgICAgICA9IDQwOworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyAqLworICAgIC8qIElzIHN1cHBsaWNhbnQgYWxpdmUgPyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUElOR19TVVBQTElDQU5UICAgICAgICAgICAgICAgICAgPSA1MTsKKyAgICAvKiBBZGQvdXBkYXRlIGEgbmV0d29yayBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9BRERfT1JfVVBEQVRFX05FVFdPUksgICAgICAgICAgICA9IDUyOworICAgIC8qIERlbGV0ZSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFTU9WRV9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gNTM7CisgICAgLyogRW5hYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSB3aWxsIGF0dGVtcHQgYSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBuZXR3b3JrLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX05FVFdPUksgICAgICAgICAgICAgICAgICAgPSA1NDsKKyAgICAvKiBEaXNhYmxlIGEgbmV0d29yay4gVGhlIGRldmljZSBkb2VzIG5vdCBhdHRlbXB0IGEgY29ubmVjdGlvbiB0byB0aGUgZ2l2ZW4gbmV0d29yay4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0FCTEVfTkVUV09SSyAgICAgICAgICAgICAgICAgID0gNTU7CisgICAgLyogQmxhY2tsaXN0IG5ldHdvcmsuIERlLXByaW9yaXRpemVzIHRoZSBnaXZlbiBCU1NJRCBmb3IgY29ubmVjdGlvbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0JMQUNLTElTVF9ORVRXT1JLICAgICAgICAgICAgICAgID0gNTY7CisgICAgLyogQ2xlYXIgdGhlIGJsYWNrbGlzdCBuZXR3b3JrIGxpc3QgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0NMRUFSX0JMQUNLTElTVCAgICAgICAgICAgICAgICAgID0gNTc7CisgICAgLyogU2F2ZSBjb25maWd1cmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICA9IDU4OworCisgICAgLyogU3VwcGxpY2FudCBjb21tYW5kcyBhZnRlciBkcml2ZXIgc3RhcnQqLworICAgIC8qIEluaXRpYXRlIGEgc2NhbiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU1RBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgPSA3MTsKKyAgICAvKiBTZXQgc2NhbiBtb2RlLiBDT05ORUNUX01PREUgb3IgU0NBTl9PTkxZX01PREUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9TQ0FOX01PREUgICAgICAgICAgICAgICAgICAgID0gNzI7CisgICAgLyogU2V0IHNjYW4gdHlwZS4gU0NBTl9BQ1RJVkUgb3IgU0NBTl9QQVNTSVZFICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfU0NBTl9UWVBFICAgICAgICAgICAgICAgICAgICA9IDczOworICAgIC8qIERpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICAgICAgID0gNzQ7CisgICAgLyogUmVjb25uZWN0IHRvIGEgbmV0d29yayAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTsKKyAgICAvKiBSZWFzc29jaWF0ZSB0byBhIG5ldHdvcmsgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JFQVNTT0NJQVRFICAgICAgICAgICAgICAgICAgICAgID0gNzY7CisgICAgLyogU2V0IHBvd2VyIG1vZGUKKyAgICAgKiBQT1dFUl9NT0RFX0FDVElWRQorICAgICAqIFBPV0VSX01PREVfQVVUTworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfU0VUX1BPV0VSX01PREUgICAgICAgICAgICAgICAgICAgPSA3NzsKKyAgICAvKiBTZXQgYmx1ZXRvb3RoIGNvLWV4aXN0ZW5jZQorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9ESVNBQkxFRAorICAgICAqIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFICAgICAgICA9IDc4OworICAgIC8qIEVuYWJsZS9kaXNhYmxlIGJsdWV0b290aCBzY2FuIG1vZGUKKyAgICAgKiB0cnVlKDEpCisgICAgICogZmFsc2UoMCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFICAgICAgICAgID0gNzk7CisgICAgLyogU2V0IG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TRVRfTlVNX0FMTE9XRURfQ0hBTk5FTFMgICAgICAgICA9IDgwOworICAgIC8qIFJlcXVlc3QgY29ubmVjdGl2aXR5IG1hbmFnZXIgd2FrZSBsb2NrIGJlZm9yZSBkcml2ZXIgc3RvcCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSyAgICAgICAgICAgICAgPSA4MTsKKyAgICAvKiBFbmFibGVzIFJTU0kgcG9sbCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfRU5BQkxFX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgPSA4MjsKKyAgICAvKiBSU1NJIHBvbGwgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1JTU0lfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgID0gODM7CisgICAgLyogR2V0IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0kgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NDsKKyAgICAvKiBHZXQgYXBwcm94IGN1cnJlbnQgUlNTSSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfR0VUX1JTU0lfQVBQUk9YICAgICAgICAgICAgICAgICAgPSA4NTsKKyAgICAvKiBHZXQgbGluayBzcGVlZCBvbiBjb25uZWN0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTElOS19TUEVFRCAgICAgICAgICAgICAgICAgICA9IDg2OworICAgIC8qIFJhZGlvIG1hYyBhZGRyZXNzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9HRVRfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICA9IDg3OworICAgIC8qIFNldCB1cCBwYWNrZXQgZmlsdGVyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HICAgICAgICAgICA9IDg4OworICAgIC8qIENsZWFyIHBhY2tldCBmaWx0ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX1NUT1BfUEFDS0VUX0ZJTFRFUklORyAgICAgICAgICAgID0gODk7CisgICAgLyogQ29ubmVjdCB0byBhIHNwZWNpZmllZCBuZXR3b3JrIChuZXR3b3JrIGlkCisgICAgICogb3IgV2lmaUNvbmZpZ3VyYXRpb24pIFRoaXMgaW52b2x2ZXMgaW5jcmVhc2luZworICAgICAqIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV0d29yaywgZW5hYmxpbmcgdGhlIG5ldHdvcmsKKyAgICAgKiAod2hpbGUgZGlzYWJsaW5nIG90aGVycykgYW5kIGlzc3VpbmcgYSByZWNvbm5lY3QuCisgICAgICogTm90ZSB0aGF0IENNRF9SRUNPTk5FQ1QganVzdCBkb2VzIGEgcmVjb25uZWN0IHRvCisgICAgICogYW4gZXhpc3RpbmcgbmV0d29yay4gQWxsIHRoZSBuZXR3b3JrcyBnZXQgZW5hYmxlZAorICAgICAqIHVwb24gYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTURfQ09OTkVDVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgPSA5MDsKKyAgICAvKiBTYXZlIHRoZSBzcGVjaWZpZWQgbmV0d29yay4gVGhpcyBpbnZvbHZlcyBhZGRpbmcKKyAgICAgKiBhbiBlbmFibGVkIG5ldHdvcmsgKGlmIG5ldykgYW5kIHVwZGF0aW5nIHRoZQorICAgICAqIGNvbmZpZyBhbmQgaXNzdWluZyBhIHNhdmUgb24gc3VwcGxpY2FudCBjb25maWcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENNRF9TQVZFX05FVFdPUksgICAgICAgICAgICAgICAgICAgICA9IDkxOworICAgIC8qIERlbGV0ZSB0aGUgc3BlY2lmaWVkIG5ldHdvcmsuIFRoaXMgaW52b2x2ZXMKKyAgICAgKiByZW1vdmluZyB0aGUgbmV0d29yayBhbmQgaXNzdWluZyBhIHNhdmUgb24KKyAgICAgKiBzdXBwbGljYW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ01EX0ZPUkdFVF9ORVRXT1JLICAgICAgICAgICAgICAgICAgID0gOTI7CisKKworCisgICAgLyoqCisgICAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9sbGluZyBmb3IgY29ubmVjdGlvbgorICAgICAqIHN0YXR1cyBpdGVtcyB0aGF0IGFyZSBub3Qgc2VudCB2aWEgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAgICAgKiBBbiBleGFtcGxlIGlzIFJTU0kgKHNpZ25hbCBzdHJlbmd0aCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfUlNTSV9JTlRFUlZBTF9NU0VDUyA9IDMwMDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9NT0RFICAgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX09OTFlfTU9ERSA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9BQ1RJVkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX1BBU1NJVkUgPSAyOworCisgICAgLyogQXV0byBhbGxvd3MgODAyLjExQS9CL0cgb3BlcmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBTkRfQVVUTyA9IDA7CisgICAgLyogNUdIeiBhbGxvd3MgODAyLjExQSBvcGVyYXRpb24gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFORF81RyA9IDE7CisgICAgLyogMi40R0h6IGFsbG93cyA4MDIuMTFCL0cgb3BlcmF0aW9uICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBTkRfMkcgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgcmV0cnkgYSBjb25uZWN0aW9uIHRvIGFuIGFjY2VzcyBwb2ludAorICAgICAqIGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuIEEgdmFsdWUgb2YKKyAgICAgKiBOIG1lYW5zIHRoYXQgd2Ugd2lsbCBtYWtlIE4rMSBjb25uZWN0aW9uIGF0dGVtcHRzIGluIGFsbC4KKyAgICAgKiA8cD4KKyAgICAgKiBTZWUge0BsaW5rIFNldHRpbmdzLlNlY3VyZSNXSUZJX01BWF9ESENQX1JFVFJZX0NPVU5UfS4gVGhpcyBpcyB0aGUgZGVmYXVsdAorICAgICAqIHZhbHVlIGlmIGEgU2V0dGluZ3MgdmFsdWUgaXMgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX0RIQ1BfUkVUUklFUyA9IDk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1BPV0VSX01PREVfQVVUTyA9IDA7CisKKyAgICAvKiBEZWZhdWx0IHBhcmVudCBzdGF0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURlZmF1bHRTdGF0ZSA9IG5ldyBEZWZhdWx0U3RhdGUoKTsKKyAgICAvKiBUZW1wb3JhcnkgaW5pdGlhbCBzdGF0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbUluaXRpYWxTdGF0ZSA9IG5ldyBJbml0aWFsU3RhdGUoKTsKKyAgICAvKiBVbmxvYWRpbmcgdGhlIGRyaXZlciAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclVubG9hZGluZ1N0YXRlID0gbmV3IERyaXZlclVubG9hZGluZ1N0YXRlKCk7CisgICAgLyogTG9hZGluZyB0aGUgZHJpdmVyICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRHJpdmVyVW5sb2FkZWRTdGF0ZSA9IG5ldyBEcml2ZXJVbmxvYWRlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWQvdW5sb2FkIGZhaWxlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckZhaWxlZFN0YXRlID0gbmV3IERyaXZlckZhaWxlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRpbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJMb2FkaW5nU3RhdGUgPSBuZXcgRHJpdmVyTG9hZGluZ1N0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlckxvYWRlZFN0YXRlID0gbmV3IERyaXZlckxvYWRlZFN0YXRlKCk7CisgICAgLyogRHJpdmVyIGxvYWRlZCwgd2FpdGluZyBmb3Igc3VwcGxpY2FudCB0byBzdGFydCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVdhaXRGb3JTdXBTdGF0ZSA9IG5ldyBXYWl0Rm9yU3VwU3RhdGUoKTsKKworICAgIC8qIERyaXZlciBsb2FkZWQgYW5kIHN1cHBsaWNhbnQgcmVhZHkgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdXBSZWFkeVN0YXRlID0gbmV3IERyaXZlclN1cFJlYWR5U3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RhcnQgaXNzdWVkLCB3YWl0aW5nIGZvciBjb21wbGV0ZWQgZXZlbnQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdGFydGluZ1N0YXRlID0gbmV3IERyaXZlclN0YXJ0aW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RhcnRlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0YXJ0ZWRTdGF0ZSA9IG5ldyBEcml2ZXJTdGFydGVkU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RvcHBpbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Ecml2ZXJTdG9wcGluZ1N0YXRlID0gbmV3IERyaXZlclN0b3BwaW5nU3RhdGUoKTsKKyAgICAvKiBEcml2ZXIgc3RvcHBlZCAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURyaXZlclN0b3BwZWRTdGF0ZSA9IG5ldyBEcml2ZXJTdG9wcGVkU3RhdGUoKTsKKyAgICAvKiBTY2FuIGZvciBuZXR3b3Jrcywgbm8gY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtU2Nhbk1vZGVTdGF0ZSA9IG5ldyBTY2FuTW9kZVN0YXRlKCk7CisgICAgLyogQ29ubmVjdGluZyB0byBhbiBhY2Nlc3MgcG9pbnQgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0TW9kZVN0YXRlID0gbmV3IENvbm5lY3RNb2RlU3RhdGUoKTsKKyAgICAvKiBGZXRjaGluZyBJUCBhZnRlciBuZXR3b3JrIGNvbm5lY3Rpb24gKGFzc29jK2F1dGggY29tcGxldGUpICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29ubmVjdGluZ1N0YXRlID0gbmV3IENvbm5lY3RpbmdTdGF0ZSgpOworICAgIC8qIENvbm5lY3RlZCB3aXRoIElQIGFkZHIgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db25uZWN0ZWRTdGF0ZSA9IG5ldyBDb25uZWN0ZWRTdGF0ZSgpOworICAgIC8qIGRpc2Nvbm5lY3QgaXNzdWVkLCB3YWl0aW5nIGZvciBuZXR3b3JrIGRpc2Nvbm5lY3QgY29uZmlybWF0aW9uICovCisgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdGluZ1N0YXRlID0gbmV3IERpc2Nvbm5lY3RpbmdTdGF0ZSgpOworICAgIC8qIE5ldHdvcmsgaXMgbm90IGNvbm5lY3RlZCwgc3VwcGxpY2FudCBhc3NvYythdXRoIGlzIG5vdCBjb21wbGV0ZSAqLworICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbURpc2Nvbm5lY3RlZFN0YXRlID0gbmV3IERpc2Nvbm5lY3RlZFN0YXRlKCk7CisKKyAgICAvKiBTb2Z0IEFwIGlzIHJ1bm5pbmcgKi8KKyAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Tb2Z0QXBTdGFydGVkU3RhdGUgPSBuZXcgU29mdEFwU3RhcnRlZFN0YXRlKCk7CisKKworICAgIC8qKgorICAgICAqIE9uZSBvZiAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRElTQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX1NUQVRFX0VOQUJMRUR9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxJTkd9LAorICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfVU5LTk9XTn0KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaVN0YXRlID0gbmV3IEF0b21pY0ludGVnZXIoV0lGSV9TVEFURV9ESVNBQkxFRCk7CisKKyAgICAvKioKKyAgICAgKiBPbmUgb2YgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTEVEfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0RJU0FCTElOR30sCisgICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9BUF9TVEFURV9FTkFCTEVEfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0VOQUJMSU5HfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBXaWZpTWFuYWdlciNXSUZJX0FQX1NUQVRFX0ZBSUxFRH0KKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtV2lmaUFwU3RhdGUgPSBuZXcgQXRvbWljSW50ZWdlcihXSUZJX0FQX1NUQVRFX0RJU0FCTEVEKTsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtTGFzdEVuYWJsZVVpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKFByb2Nlc3MubXlVaWQoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1MYXN0QXBFbmFibGVVaWQgPSBuZXcgQXRvbWljSW50ZWdlcihQcm9jZXNzLm15VWlkKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7CisKKyAgICBwdWJsaWMgV2lmaVN0YXRlTWFjaGluZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoVEFHKTsKKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtQmF0dGVyeVN0YXRzID0gSUJhdHRlcnlTdGF0cy5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhdHRlcnlpbmZvIikpOworCisgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKKyAgICAgICAgbndTZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOworCisgICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKKyAgICAgICAgbURoY3BJbmZvID0gbmV3IERoY3BJbmZvKCk7CisgICAgICAgIG1XaWZpSW5mbyA9IG5ldyBXaWZpSW5mbygpOworICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJ3aWZpLmludGVyZmFjZSIsICJ0aXdsYW4wIik7CisgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyID0gbmV3IFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoY29udGV4dCwgZ2V0SGFuZGxlcigpKTsKKworICAgICAgICBtQmx1ZXRvb3RoSGVhZHNldCA9IG5ldyBCbHVldG9vdGhIZWFkc2V0KG1Db250ZXh0LCBudWxsKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbmV3IExpbmtQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgIG1MYXN0QnNzaWQgPSBudWxsOworICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IC0xOworICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7CisKKyAgICAgICAgbVNjYW5SZXN1bHRDYWNoZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2NhblJlc3VsdD4oCisgICAgICAgICAgICBTQ0FOX1JFU1VMVF9DQUNIRV9TSVpFLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTGltaXQgdGhlIGNhY2hlIHNpemUgYnkgU0NBTl9SRVNVTFRfQ0FDSEVfU0laRQorICAgICAgICAgICAgICAgICAqIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5IGVsZGVzdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0NBTl9SRVNVTFRfQ0FDSEVfU0laRSA8IHRoaXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtU2V0dGluZ3NPYnNlcnZlciA9IG5ldyBTZXR0aW5nc09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgc1dha2VMb2NrID0gcG93ZXJNYW5hZ2VyLm5ld1dha2VMb2NrKFBvd2VyTWFuYWdlci5QQVJUSUFMX1dBS0VfTE9DSywgVEFHKTsKKworICAgICAgICBhZGRTdGF0ZShtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclVubG9hZGluZ1N0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJVbmxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyRmFpbGVkU3RhdGUsIG1Ecml2ZXJVbmxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJMb2FkaW5nU3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlckxvYWRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtV2FpdEZvclN1cFN0YXRlLCBtRHJpdmVyTG9hZGVkU3RhdGUpOworICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN1cFJlYWR5U3RhdGUsIG1EZWZhdWx0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Ecml2ZXJTdGFydGluZ1N0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0YXJ0ZWRTdGF0ZSwgbURyaXZlclN1cFJlYWR5U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2Nhbk1vZGVTdGF0ZSwgbURyaXZlclN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0TW9kZVN0YXRlLCBtRHJpdmVyU3RhcnRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0aW5nU3RhdGUsIG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Db25uZWN0ZWRTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RpbmdTdGF0ZSwgbUNvbm5lY3RNb2RlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3RhdGUobURpc2Nvbm5lY3RlZFN0YXRlLCBtQ29ubmVjdE1vZGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobURyaXZlclN0b3BwaW5nU3RhdGUsIG1Ecml2ZXJTdXBSZWFkeVN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtRHJpdmVyU3RvcHBlZFN0YXRlLCBtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICBhZGRTdGF0ZShtU29mdEFwU3RhcnRlZFN0YXRlLCBtRGVmYXVsdFN0YXRlKTsKKworICAgICAgICBzZXRJbml0aWFsU3RhdGUobUluaXRpYWxTdGF0ZSk7CisKKyAgICAgICAgaWYgKERCRykgc2V0RGJnKHRydWUpOworCisgICAgICAgIC8vc3RhcnQgdGhlIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogTWV0aG9kcyBleHBvc2VkIGZvciBwdWJsaWMgdXNlCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY1BpbmdTdXBwbGljYW50KCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9QSU5HX1NVUFBMSUNBTlQpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oYm9vbGVhbiBmb3JjZUFjdGl2ZSkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TVEFSVF9TQ0FOLCBmb3JjZUFjdGl2ZSA/CisgICAgICAgICAgICAgICAgU0NBTl9BQ1RJVkUgOiBTQ0FOX1BBU1NJVkUsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWZpRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICBtTGFzdEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9TVVBQTElDQU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVE9QX1NVUFBMSUNBTlQpOworICAgICAgICAgICAgLyogQXJndW1lbnQgaXMgdGhlIHN0YXRlIHRoYXQgaXMgZW50ZXJlZCB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfRElTQUJMRUQsIDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZmlBcEVuYWJsZWQoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZywgYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgbUxhc3RBcEVuYWJsZVVpZC5zZXQoQmluZGVyLmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIC8qIEFyZ3VtZW50IGlzIHRoZSBzdGF0ZSB0aGF0IGlzIGVudGVyZWQgcHJpb3IgdG8gbG9hZCAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRU5BQkxJTkcsIDApKTsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NUQVJUX0FQLCB3aWZpQ29uZmlnKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9BUCk7CisgICAgICAgICAgICAvKiBBcmd1bWVudCBpcyB0aGUgc3RhdGUgdGhhdCBpcyBlbnRlcmVkIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9ESVNBQkxFRCwgMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaVN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNHZXRXaWZpU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlTdGF0ZS5nZXQoKSkgeworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX0RJU0FCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkaXNhYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlbmFibGluZyI7CisgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOworICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIHN0YXRlIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0V2lmaUFwU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBtV2lmaUFwU3RhdGUuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzeW5jR2V0V2lmaUFwU3RhdGVCeU5hbWUoKSB7CisgICAgICAgIHN3aXRjaCAobVdpZmlBcFN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAiZGlzYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsaW5nIjsKKyAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZW5hYmxlZCI7CisgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbGVkIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJbaW52YWxpZCBzdGF0ZV0iOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiwgaWYgYW55LgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgV2lmaUluZm99IG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBXaWZpSW5mbyBzeW5jUmVxdWVzdENvbm5lY3Rpb25JbmZvKCkgeworICAgICAgICByZXR1cm4gbVdpZmlJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBEaGNwSW5mbyBzeW5jR2V0RGhjcEluZm8oKSB7CisgICAgICAgIHJldHVybiBtRGhjcEluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogZG9jCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJpdmVyU3RhcnQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RBUlRfRFJJVkVSKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1NUT1BfRFJJVkVSKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FuT25seU1vZGUoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9NT0RFLCBTQ0FOX09OTFlfTU9ERSwgMCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TRVRfU0NBTl9NT0RFLCBDT05ORUNUX01PREUsIDApKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2FuVHlwZShib29sZWFuIGFjdGl2ZSkgeworICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX1RZUEUsIFNDQU5fQUNUSVZFLCAwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9TQ0FOX1RZUEUsIFNDQU5fUEFTU0lWRSwgMCkpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE86IGRvYworICAgICAqLworICAgIHB1YmxpYyBMaXN0PFNjYW5SZXN1bHQ+IHN5bmNHZXRTY2FuUmVzdWx0c0xpc3QoKSB7CisgICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgYSByZWNvbm5lY3Rpb24gdG8gQVAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvbm5lY3RDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVDT05ORUNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZSBhIHJlLWFzc29jaWF0aW9uIHRvIEFQCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhc3NvY2lhdGVDb21tYW5kKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfUkVBU1NPQ0lBVEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldHdvcmsgc3luY2hyb25vdXNseQorICAgICAqCisgICAgICogQHJldHVybiBuZXR3b3JrIGlkIG9mIHRoZSBuZXcgbmV0d29yaworICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0FkZE9yVXBkYXRlTmV0d29yayhXaWZpQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfQUREX09SX1VQREFURV9ORVRXT1JLLCBjb25maWcpLmludFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFdpZmlDb25maWd1cmF0aW9uPiBzeW5jR2V0Q29uZmlndXJlZE5ldHdvcmtzKCkgeworICAgICAgICByZXR1cm4gV2lmaUNvbmZpZ1N0b3JlLmdldENvbmZpZ3VyZWROZXR3b3JrcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNSZW1vdmVOZXR3b3JrKGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9SRU1PVkVfTkVUV09SSywgbmV0d29ya0lkLCAwKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRW5hYmxlTmV0UGFyYW1zIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV0SWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNhYmxlT3RoZXJzOworICAgICAgICBFbmFibGVOZXRQYXJhbXMoaW50IG4sIGJvb2xlYW4gYikgeworICAgICAgICAgICAgbmV0SWQgPSBuOworICAgICAgICAgICAgZGlzYWJsZU90aGVycyA9IGI7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoqCisgICAgICogRW5hYmxlIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsKKyAgICAgKiBAcGFyYW0gZGlzYWJsZU90aGVycyB0cnVlLCBpZiBhbGwgb3RoZXIgbmV0d29ya3MgaGF2ZSB0byBiZSBkaXNhYmxlZAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc3luY0VuYWJsZU5ldHdvcmsoaW50IG5ldElkLCBib29sZWFuIGRpc2FibGVPdGhlcnMpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfRU5BQkxFX05FVFdPUkssCisgICAgICAgICAgICAgICAgbmV3IEVuYWJsZU5ldFBhcmFtcyhuZXRJZCwgZGlzYWJsZU90aGVycykpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgbmV0d29yaworICAgICAqCisgICAgICogQHBhcmFtIG5ldElkIG5ldHdvcmsgaWQgb2YgdGhlIG5ldHdvcmsKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN5bmNEaXNhYmxlTmV0d29yayhpbnQgbmV0SWQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9ESVNBQkxFX05FVFdPUkssIG5ldElkLCAwKSkuYm9vbFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsYWNrbGlzdCBhIEJTU0lELiBUaGlzIHdpbGwgYXZvaWQgdGhlIEFQIGlmIHRoZXJlIGFyZQorICAgICAqIGFsdGVybmF0ZSBBUHMgdG8gY29ubmVjdAorICAgICAqCisgICAgICogQHBhcmFtIGJzc2lkIEJTU0lEIG9mIHRoZSBuZXR3b3JrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG9CbGFja2xpc3QoU3RyaW5nIGJzc2lkKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0JMQUNLTElTVF9ORVRXT1JLLCBic3NpZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIHRoZSBibGFja2xpc3QgbGlzdAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJCbGFja2xpc3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX0NMRUFSX0JMQUNLTElTVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3ROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9DT05ORUNUX05FVFdPUkssIG5ldElkLCAwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdE5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgeworICAgICAgICAvKiBhcmcxIGlzIHVzZWQgdG8gaW5kaWNhdGUgbmV0SWQsIGZvcmNlIGEgbmV0SWQgdmFsdWUgb2YgLTEgd2hlbgorICAgICAgICAgKiB3ZSBhcmUgcGFzc2luZyBhIGNvbmZpZ3VyYXRpb24gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAgICAgICAgICogMCBpcyBhIHZhbGlkIG5ldElkCisgICAgICAgICAqLworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9DT05ORUNUX05FVFdPUkssIC0xLCAwLCB3aWZpQ29uZmlnKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2F2ZU5ldHdvcmsoV2lmaUNvbmZpZ3VyYXRpb24gd2lmaUNvbmZpZykgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9TQVZFX05FVFdPUkssIHdpZmlDb25maWcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmb3JnZXROZXR3b3JrKGludCBuZXRJZCkgeworICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9GT1JHRVRfTkVUV09SSywgbmV0SWQsIDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmFibGVSc3NpUG9sbGluZyhib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKENNRF9FTkFCTEVfUlNTSV9QT0xMLCBlbmFibGVkID8gMSA6IDAsIDApKTsKKyAgICB9CisgICAgLyoqCisgICAgICogR2V0IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHN5bmNHZXRSc3NpKCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKENNRF9HRVRfUlNTSSkuaW50VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFwcHJveCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yaworICAgICAqCisgICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIGludCBzeW5jR2V0UnNzaUFwcHJveCgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX1JTU0lfQVBQUk9YKS5pbnRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGluayBzcGVlZCB0byBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsKKyAgICAgKgorICAgICAqIEByZXR1cm4gbGluayBzcGVlZCwgLTEgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3luY0dldExpbmtTcGVlZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX0xJTktfU1BFRUQpLmludFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBNQUMgYWRkcmVzcyBvZiByYWRpbworICAgICAqCisgICAgICogQHJldHVybiBNQUMgYWRkcmVzcywgbnVsbCBvbiBmYWlsdXJlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzeW5jR2V0TWFjQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfR0VUX01BQ19BRERSKS5zdHJpbmdWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBwYWNrZXQgZmlsdGVyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFSVF9QQUNLRVRfRklMVEVSSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHBhY2tldCBmaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wUGFja2V0RmlsdGVyaW5nKCkgeworICAgICAgICBzZW5kTWVzc2FnZShDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcG93ZXIgbW9kZQorICAgICAqIEBwYXJhbSBtb2RlCisgICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FVVE8KKyAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG93ZXJNb2RlKGludCBtb2RlKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9QT1dFUl9NT0RFLCBtb2RlLCAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgZnJvbSB0aGUgc3lzdGVtCisgICAgICogc2V0dGluZyB2YWx1ZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bUFsbG93ZWRDaGFubmVscygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMpKTsKKyAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChtTnVtQWxsb3dlZENoYW5uZWxzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzZXROdW1BbGxvd2VkQ2hhbm5lbHMobU51bUFsbG93ZWRDaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZHJpdmVyIGRlZmF1bHQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbnVtYmVyIG9mIHJhZGlvIGZyZXF1ZW5jeSBjaGFubmVscyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQKKyAgICAgKiBpbiB0aGUgY3VycmVudCByZWd1bGF0b3J5IGRvbWFpbi4KKyAgICAgKiBAcGFyYW0gbnVtQ2hhbm5lbHMgdGhlIG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwCisgICAgICogYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROdW1BbGxvd2VkQ2hhbm5lbHMoaW50IG51bUNoYW5uZWxzKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUywgbnVtQ2hhbm5lbHMsIDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gY2hhbm5lbCBjb3VudCwgLTEgb24gZmFpbHVyZQorICAgICAqCisgICAgICogVE9ETzogdGhpcyBpcyBub3QgYSBwdWJsaWMgQVBJIGFuZCBuZWVkcyB0byBiZSByZW1vdmVkIGluIGZhdm9yCisgICAgICogb2YgYXN5bmNocm9ub3VzIHJlcG9ydGluZy4gdW51c2VkIGZvciBub3cuCisgICAgICovCisgICAgcHVibGljIGludCBnZXROdW1BbGxvd2VkQ2hhbm5lbHMoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYmx1ZXRvb3RoIGNvZXggbW9kZToKKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2RlCisgICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0VOQUJMRUQKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQKKyAgICAgKiAgQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRSwgbW9kZSwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIEJsdWV0b290aCBjb2V4aXN0ZW5jZSBzY2FuIG1vZGUuIFdoZW4gdGhpcyBtb2RlIGlzIG9uLAorICAgICAqIHNvbWUgb2YgdGhlIGxvdy1sZXZlbCBzY2FuIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgZHJpdmVyIGFyZSBjaGFuZ2VkIHRvCisgICAgICogcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIEEyRFAgc3RyZWFtaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGlzQmx1ZXRvb3RoUGxheWluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgbW9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aFNjYW5Nb2RlKGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFLCBpc0JsdWV0b290aFBsYXlpbmcgPyAxIDogMCwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgY29uZmlndXJhdGlvbiBvbiBzdXBwbGljYW50CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqCisgICAgICogVE9ETzogZGVwcmVjYXRlIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzeW5jU2F2ZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRTeW5jTWVzc2FnZShDTURfU0FWRV9DT05GSUcpLmJvb2xWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0Q21XYWtlTG9jaygpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFUVVFU1RfQ01fV0FLRUxPQ0spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBzYi5hcHBlbmQoImN1cnJlbnQgSFNNIHN0YXRlOiAiKS5hcHBlbmQoZ2V0Q3VycmVudFN0YXRlKCkuZ2V0TmFtZSgpKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MaW5rUHJvcGVydGllcyAiKS5hcHBlbmQobUxpbmtQcm9wZXJ0aWVzKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1XaWZpSW5mbyAiKS5hcHBlbmQobVdpZmlJbmZvKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1EaGNwSW5mbyAiKS5hcHBlbmQobURoY3BJbmZvKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1OZXR3b3JrSW5mbyAiKS5hcHBlbmQobU5ldHdvcmtJbmZvKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1OdW1BbGxvd2VkQ2hhbm5lbHMgIikuYXBwZW5kKG1OdW1BbGxvd2VkQ2hhbm5lbHMpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUxhc3RTaWduYWxMZXZlbCAiKS5hcHBlbmQobUxhc3RTaWduYWxMZXZlbCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtTGFzdEJzc2lkICIpLmFwcGVuZChtTGFzdEJzc2lkKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1MYXN0TmV0d29ya0lkICIpLmFwcGVuZChtTGFzdE5ldHdvcmtJZCkuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtRW5hYmxlQWxsTmV0d29ya3MgIikuYXBwZW5kKG1FbmFibGVBbGxOZXR3b3JrcykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtRW5hYmxlUnNzaVBvbGxpbmcgIikuYXBwZW5kKG1FbmFibGVSc3NpUG9sbGluZykuYXBwZW5kKExTKTsKKyAgICAgICAgc2IuYXBwZW5kKCJtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCAiKS5hcHBlbmQobVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVVzZVN0YXRpY0lwICIpLmFwcGVuZChtVXNlU3RhdGljSXApLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibVJlY29ubmVjdENvdW50ICIpLmFwcGVuZChtUmVjb25uZWN0Q291bnQpLmFwcGVuZChMUyk7CisgICAgICAgIHNiLmFwcGVuZCgibUlzU2Nhbk1vZGUgIikuYXBwZW5kKG1Jc1NjYW5Nb2RlKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIm1Db25maWdDaGFuZ2VkICIpLmFwcGVuZChtQ29uZmlnQ2hhbmdlZCkuYXBwZW5kKExTKS5hcHBlbmQoTFMpOworICAgICAgICBzYi5hcHBlbmQoIlN1cHBsaWNhbnQgc3RhdHVzIikuYXBwZW5kKExTKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoV2lmaU5hdGl2ZS5zdGF0dXNDb21tYW5kKCkpLmFwcGVuZChMUykuYXBwZW5kKExTKTsKKworICAgICAgICBzYi5hcHBlbmQoV2lmaUNvbmZpZ1N0b3JlLmR1bXAoKSk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBJbnRlcm5hbCBwcml2YXRlIGZ1bmN0aW9ucworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGNsYXNzIFN5bmNSZXR1cm4geworICAgICAgICBib29sZWFuIGJvb2xWYWx1ZTsKKyAgICAgICAgaW50IGludFZhbHVlOworICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7CisgICAgICAgIE9iamVjdCBvYmpWYWx1ZTsKKyAgICB9CisKKyAgICBjbGFzcyBTeW5jUGFyYW1zIHsKKyAgICAgICAgT2JqZWN0IG1QYXJhbWV0ZXI7CisgICAgICAgIFN5bmNSZXR1cm4gbVN5bmNSZXR1cm47CisgICAgICAgIFN5bmNQYXJhbXMoKSB7CisgICAgICAgICAgICBtU3luY1JldHVybiA9IG5ldyBTeW5jUmV0dXJuKCk7CisgICAgICAgIH0KKyAgICAgICAgU3luY1BhcmFtcyhPYmplY3QgcCkgeworICAgICAgICAgICAgbVBhcmFtZXRlciA9IHA7CisgICAgICAgICAgICBtU3luY1JldHVybiA9IG5ldyBTeW5jUmV0dXJuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZXNzYWdlLm9iaiBpcyB1c2VkIHRvIHN0b3JlIFN5bmNQYXJhbXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN5bmNSZXR1cm4gc3luY2VkU2VuZChNZXNzYWdlIG1zZykgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbXNnLm9iajsKKyAgICAgICAgc3luY2hyb25pemVkKHN5bmNQYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInN5bmNlZFNlbmQgIiArIG1zZyk7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtc2cpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLndhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzZW5kU3luY01lc3NhZ2U6IHVuZXhwZWN0ZWQgaW50ZXJydXB0aW9uIG9mIHdhaXQoKSIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuOworICAgIH0KKworICAgIHByaXZhdGUgU3luY1JldHVybiBzZW5kU3luY01lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zID0gbmV3IFN5bmNQYXJhbXMoKTsKKyAgICAgICAgbXNnLm9iaiA9IHN5bmNQYXJhbXM7CisgICAgICAgIHJldHVybiBzeW5jZWRTZW5kKG1zZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShpbnQgd2hhdCwgT2JqZWN0IHBhcmFtKSB7CisgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtcyA9IG5ldyBTeW5jUGFyYW1zKHBhcmFtKTsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBvYnRhaW5NZXNzYWdlKHdoYXQsIHN5bmNQYXJhbXMpOworICAgICAgICByZXR1cm4gc3luY2VkU2VuZChtc2cpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBTeW5jUmV0dXJuIHNlbmRTeW5jTWVzc2FnZShpbnQgd2hhdCkgeworICAgICAgICByZXR1cm4gc2VuZFN5bmNNZXNzYWdlKG9idGFpbk1lc3NhZ2Uod2hhdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlPbk1zZ09iamVjdChNZXNzYWdlIG1zZykgeworICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbXNnLm9iajsKKyAgICAgICAgaWYgKHN5bmNQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHN5bmNQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJub3RpZnlPbk1zZ09iamVjdCAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIHN5bmNQYXJhbXMgaW4gbm90aWZ5T25Nc2dPYmplY3QgaXMgbnVsbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFdpZmlTdGF0ZShpbnQgd2lmaVN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlTdGF0ZSA9IG1XaWZpU3RhdGUuZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aWZpU3RhdGUgPT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKG1MYXN0RW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lmaVN0YXRlID09IFdJRklfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICBtQmF0dGVyeVN0YXRzLm5vdGVXaWZpT2ZmKG1MYXN0RW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBub3RlIGJhdHRlcnkgc3RhdHMgaW4gd2lmaSIpOworICAgICAgICB9CisKKyAgICAgICAgbVdpZmlTdGF0ZS5zZXQod2lmaVN0YXRlKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzZXRXaWZpU3RhdGU6ICIgKyBzeW5jR2V0V2lmaVN0YXRlQnlOYW1lKCkpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfU1RBVEUsIHdpZmlTdGF0ZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9QUkVWSU9VU19XSUZJX1NUQVRFLCBwcmV2aW91c1dpZmlTdGF0ZSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0V2lmaUFwU3RhdGUoaW50IHdpZmlBcFN0YXRlKSB7CisgICAgICAgIGZpbmFsIGludCBwcmV2aW91c1dpZmlBcFN0YXRlID0gbVdpZmlBcFN0YXRlLmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod2lmaUFwU3RhdGUgPT0gV0lGSV9BUF9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9uKG1MYXN0QXBFbmFibGVVaWQuZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWZpQXBTdGF0ZSA9PSBXSUZJX0FQX1NUQVRFX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaU9mZihtTGFzdEFwRW5hYmxlVWlkLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBub3RlIGJhdHRlcnkgc3RhdHMgaW4gd2lmaSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgICAgIG1XaWZpQXBTdGF0ZS5zZXQod2lmaUFwU3RhdGUpOworCisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInNldFdpZmlBcFN0YXRlOiAiICsgc3luY0dldFdpZmlBcFN0YXRlQnlOYW1lKCkpOworCisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLldJRklfQVBfU1RBVEVfQ0hBTkdFRF9BQ1RJT04pOworICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVHSVNURVJFRF9PTkxZX0JFRk9SRV9CT09UKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1dJRklfQVBfU1RBVEUsIHdpZmlBcFN0YXRlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1BSRVZJT1VTX1dJRklfQVBfU1RBVEUsIHByZXZpb3VzV2lmaUFwU3RhdGUpOworICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHNjYW4gcmVzdWx0IGxpbmUgcGFzc2VkIHRvIHVzIGJ5IHdwYV9zdXBwbGljYW50IChoZWxwZXIpLgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIHBhcnNlCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFNjYW5SZXN1bHR9IG9iamVjdAorICAgICAqLworICAgIHByaXZhdGUgU2NhblJlc3VsdCBwYXJzZVNjYW5SZXN1bHQoU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgU2NhblJlc3VsdCBzY2FuUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhY2hlIGltcGxlbWVudGF0aW9uIChMaW5rZWRIYXNoTWFwKSBpcyBub3Qgc3luY2hyb25pemVkLCB0aHVzLAorICAgICAgICAgICAgICogbXVzdCBzeW5jaHJvbml6ZWQgaGVyZSEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3luY2hyb25pemVkIChtU2NhblJlc3VsdENhY2hlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gc2NhblJlc3VsdFBhdHRlcm4uc3BsaXQobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKDMgPD0gcmVzdWx0Lmxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDw9IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJzc2lkID0gcmVzdWx0WzBdOworICAgICAgICAgICAgICAgICAgICAvLyBic3NpZCB8IGZyZXF1ZW5jeSB8IGxldmVsIHwgZmxhZ3MgfCBzc2lkCisgICAgICAgICAgICAgICAgICAgIGludCBmcmVxdWVuY3k7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IEludGVnZXIucGFyc2VJbnQocmVzdWx0WzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gSW50ZWdlci5wYXJzZUludChyZXN1bHRbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IDApIGxldmVsIC09IDI1NjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBUaGUgZm9ybWF0dGluZyBvZiB0aGUgcmVzdWx0cyByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCBpcyBpbnRlbmRlZCB0byBtYWtlIHRoZSBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICogbGluZSB1cCBuaWNlbHkgd2hlbiBwcmludGVkLAorICAgICAgICAgICAgICAgICAgICAgKiBub3QgdG8gbWFrZSB0aGVtIGVhc3kgdG8gcGFyc2UuIFNvIHdlIGhhdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgc29tZSBoZXVyaXN0aWNzIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICogaXMgdGhlIFNTSUQgYW5kIHdoaWNoIGZpZWxkIGlzIHRoZSBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzc2lkOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbM10uY2hhckF0KDApID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gcmVzdWx0WzNdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggPT0gNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgICAgICBzc2lkID0gcmVzdWx0WzRdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSwgd2UgbXVzdCBoYXZlIDMgZmllbGRzOiBubyBmbGFncyBhbmQgc3NpZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgc3NpZCA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYnNzaWQgKyBzc2lkIGlzIHRoZSBoYXNoIGtleQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYnNzaWQgKyBzc2lkOworICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0ID0gbVNjYW5SZXN1bHRDYWNoZS5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5sZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblJlc3VsdC5TU0lEID0gc3NpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQuY2FwYWJpbGl0aWVzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuUmVzdWx0LmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBhZGQgc2NhbiByZXN1bHRzIHRoYXQgaGF2ZSBubyBTU0lEIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBzc2lkLnRyaW0oKS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5SZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2NhblJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaWQsIGJzc2lkLCBmbGFncywgbGV2ZWwsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNjYW5SZXN1bHRDYWNoZS5wdXQoa2V5LCBzY2FuUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIk1pc2Zvcm1hdHRlZCBzY2FuIHJlc3VsdCB0ZXh0IHdpdGggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5sZW5ndGggKyAiIGZpZWxkczogIiArIGxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzY2FuUmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHNjYW5SZXN1bHRzIGlucHV0IGZvcm1hdAorICAgICAqIDAwOmJiOmNjOmRkOmNjOmVlICAgICAgIDI0MjcgICAgMTY2ICAgICBbV1BBLUVBUC1US0lQXVtXUEEyLUVBUC1DQ01QXSAgIE5ldDEKKyAgICAgKiAwMDpiYjpjYzpkZDpjYzpmZiAgICAgICAyNDEyICAgIDE2NSAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFNjYW5SZXN1bHRzKFN0cmluZyBzY2FuUmVzdWx0cykgeworICAgICAgICBpZiAoc2NhblJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTY2FuUmVzdWx0PiBzY2FuTGlzdCA9IG5ldyBBcnJheUxpc3Q8U2NhblJlc3VsdD4oKTsKKworICAgICAgICBpbnQgbGluZUNvdW50ID0gMDsKKworICAgICAgICBpbnQgc2NhblJlc3VsdHNMZW4gPSBzY2FuUmVzdWx0cy5sZW5ndGgoKTsKKyAgICAgICAgLy8gUGFyc2UgdGhlIHJlc3VsdCBzdHJpbmcsIGtlZXBpbmcgaW4gbWluZCB0aGF0IHRoZSBsYXN0IGxpbmUgZG9lcworICAgICAgICAvLyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgorICAgICAgICBmb3IgKGludCBsaW5lQmVnID0gMCwgbGluZUVuZCA9IDA7IGxpbmVFbmQgPD0gc2NhblJlc3VsdHNMZW47ICsrbGluZUVuZCkgeworICAgICAgICAgICAgaWYgKGxpbmVFbmQgPT0gc2NhblJlc3VsdHNMZW4gfHwgc2NhblJlc3VsdHMuY2hhckF0KGxpbmVFbmQpID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICArK2xpbmVDb3VudDsKKworICAgICAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lQmVnID0gbGluZUVuZCArIDE7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGluZUVuZCA+IGxpbmVCZWcpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBzY2FuUmVzdWx0cy5zdWJzdHJpbmcobGluZUJlZywgbGluZUVuZCk7CisgICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHBhcnNlU2NhblJlc3VsdChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5SZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbkxpc3QuYWRkKHNjYW5SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAibWlzZm9ybWF0dGVkIHNjYW4gcmVzdWx0IGZvcjogIiArIGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVCZWcgPSBsaW5lRW5kICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1TY2FuUmVzdWx0cyA9IHNjYW5MaXN0OworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGZldGNoU1NJRCgpIHsKKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9IFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOworICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIGV4dHJhY3Qgc3NpZCBmcm9tIGEgc2VyaWVzIG9mICJuYW1lPXZhbHVlIgorICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IHN0YXR1cy5zcGxpdCgiXG4iKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwcm9wID0gbGluZS5zcGxpdCgiICo9ICoiKTsKKyAgICAgICAgICAgIGlmIChwcm9wLmxlbmd0aCA8IDIpIGNvbnRpbnVlOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wWzBdOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcFsxXTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInNzaWQiKSkgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVMaW5rUHJvcGVydGllcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcy5zZXRJbnRlcmZhY2UoTmV0d29ya0ludGVyZmFjZS5nZXRCeU5hbWUobUludGVyZmFjZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlNvY2tldEV4Y2VwdGlvbiBjcmVhdGluZyBOZXR3b3JrSW50ZXJmYWNlIGZyb20gIiArIG1JbnRlcmZhY2VOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIi4gZT0iICsgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5QRSBjcmVhdGluZyBOZXR3b3JrSW50ZXJmYWNlLiBlPSIgKyBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIC0gZml4IHRoaXMgZm9yIHY2CisgICAgICAgIG1MaW5rUHJvcGVydGllcy5hZGRBZGRyZXNzKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLnNldEdhdGV3YXkoTmV0d29ya1V0aWxzLmludFRvSW5ldEFkZHJlc3MobURoY3BJbmZvLmdhdGV3YXkpKTsKKyAgICAgICAgbUxpbmtQcm9wZXJ0aWVzLmFkZERucyhOZXR3b3JrVXRpbHMuaW50VG9JbmV0QWRkcmVzcyhtRGhjcEluZm8uZG5zMSkpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMuYWRkRG5zKE5ldHdvcmtVdGlscy5pbnRUb0luZXRBZGRyZXNzKG1EaGNwSW5mby5kbnMyKSk7CisgICAgICAgIC8vIFRPRE8gLSBhZGQgcHJveHkgaW5mbworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7CisgICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOworICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKKyAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOworICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7CisgICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOworICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKKyAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7CisgICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OworCisgICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRNYXhEaGNwUmV0cmllcygpIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX01BWF9ESENQX1JFVFJZX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2V0dGluZ3NPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgICAgIHB1YmxpYyBTZXR0aW5nc09ic2VydmVyKEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlcik7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfVVNFX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX05FVE1BU0spLCBmYWxzZSwgdGhpcyk7CisgICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAorICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ETlMxKSwgZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMiksIGZhbHNlLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOworCisgICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOworICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7CisgICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7CisgICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKKyAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOworICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OworICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKKyAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOworICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7CisKKyAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9CisgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAorICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7CisKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1JFQ09ORklHVVJFX0lQKTsKKyAgICAgICAgICAgICAgICBtQ29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB3aGlsZSBvYnRhaW5pbmcgSVAgYWRkcmVzcy4gVGhpcworICAgICAqIGxvZ2ljIHdpbGwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVudCBibHVldG9vdGgKKyAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KKyAgICAgKiBlcnJvciBzdGF0ZSwgd2Ugd2lsbCBOT1QgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHRvIGVyciBvbiB0aGUgc2lkZQorICAgICAqIG9mIHNhZmV0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERpc2FibGVDb2V4aXN0ZW5jZU1vZGUoKSB7CisgICAgICAgIGludCBzdGF0ZSA9IG1CbHVldG9vdGhIZWFkc2V0LmdldFN0YXRlKG1CbHVldG9vdGhIZWFkc2V0LmdldEN1cnJlbnRIZWFkc2V0KCkpOworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXNCbHVldG9vdGhQbGF5aW5nKCkgeworICAgICAgICBib29sZWFuIGlzQmx1ZXRvb3RoUGxheWluZyA9IGZhbHNlOworICAgICAgICBTZXQ8Qmx1ZXRvb3RoRGV2aWNlPiBjb25uZWN0ZWQgPSBtQmx1ZXRvb3RoQTJkcC5nZXRDb25uZWN0ZWRTaW5rcygpOworCisgICAgICAgIGZvciAoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA6IGNvbm5lY3RlZCkgeworICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhBMmRwLmdldFNpbmtTdGF0ZShkZXZpY2UpID09IEJsdWV0b290aEEyZHAuU1RBVEVfUExBWUlORykgeworICAgICAgICAgICAgICAgIGlzQmx1ZXRvb3RoUGxheWluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Qmx1ZXRvb3RoU2Nhbk1vZGUoaXNCbHVldG9vdGhQbGF5aW5nKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU0NBTl9SRVNVTFRTX0FWQUlMQUJMRV9BQ1RJT04pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QoZmluYWwgaW50IG5ld1Jzc2kpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuUlNTSV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKKyAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIGlmIChic3NpZCAhPSBudWxsKQorICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpIHsKKyAgICAgICAgaWYgKCFBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSByZXR1cm47CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkNPTkZJR19DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3QoU3RhdGVDaGFuZ2VSZXN1bHQgc2MsIGJvb2xlYW4gZmFpbGVkQXV0aCkgeworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAorICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpc2Muc3RhdGUpOworICAgICAgICBpZiAoZmFpbGVkQXV0aCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKAorICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfRVJST1IsCisgICAgICAgICAgICAgICAgV2lmaU1hbmFnZXIuRVJST1JfQVVUSEVOVElDQVRJTkcpOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFN1cHBsaWNhbnRDb25uZWN0aW9uQ2hhbmdlZEJyb2FkY2FzdChib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBpZiAoIUFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHJldHVybjsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX0NPTk5FQ1RJT05fQ0hBTkdFX0FDVElPTik7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0NPTk5FQ1RFRCwgY29ubmVjdGVkKTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZGV0YWlsZWQgc3RhdGUgb2YgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IEB7Y29kZSBEZXRhaWxlZFN0YXRlfQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXREZXRhaWxlZFN0YXRlKE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAic2V0RGV0YWlsZWQgc3RhdGUsIG9sZCA9IgorICAgICAgICAgICAgICAgICsgbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSArICIgYW5kIG5ldyBzdGF0ZT0iICsgc3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgIT0gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSkgeworICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldERldGFpbGVkU3RhdGUoc3RhdGUsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9sbCBmb3IgaW5mbyBub3QgcmVwb3J0ZWQgdmlhIGV2ZW50cworICAgICAqIFJTU0kgJiBMaW5rc3BlZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oKSB7CisgICAgICAgIGludCBuZXdSc3NpID0gV2lmaU5hdGl2ZS5nZXRSc3NpQ29tbWFuZCgpOworICAgICAgICBpZiAobmV3UnNzaSAhPSAtMSAmJiAtMjAwIDwgbmV3UnNzaSAmJiBuZXdSc3NpIDwgMjU2KSB7IC8vIHNjcmVlbiBvdXQgaW52YWxpZCB2YWx1ZXMKKyAgICAgICAgICAgIC8qIHNvbWUgaW1wbGVtZW50YXRpb25zIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyBieSBhZGRpbmcgMjU2CisgICAgICAgICAgICAgKiBzbyB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgdGhhdCBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobmV3UnNzaSA+IDApIG5ld1Jzc2kgLT0gMjU2OworICAgICAgICAgICAgbVdpZmlJbmZvLnNldFJzc2kobmV3UnNzaSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKKyAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKKyAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKKyAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKKyAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IG1XaWZpSW5mb3JtaW5nIG90aGVycworICAgICAgICAgICAgICogaW50ZXJlc3RlZCBpbiBSU1NJIG9mIGFsbCB0aGUgY2hhbmdlcyBpbiBzaWduYWwKKyAgICAgICAgICAgICAqIGxldmVsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgc2Vjb25kIGFyZyB0byB0aGUgY2FsbCBiZWxvdyBuZWVkcyB0byBiZSBhIHN5bWJvbCBzb21ld2hlcmUsIGJ1dAorICAgICAgICAgICAgLy8gaXQncyBhY3R1YWxseSB0aGUgc2l6ZSBvZiBhbiBhcnJheSBvZiBpY29ucyB0aGF0J3MgcHJpdmF0ZQorICAgICAgICAgICAgLy8gdG8gU3RhdHVzQmFyIFBvbGljeS4KKyAgICAgICAgICAgIGludCBuZXdTaWduYWxMZXZlbCA9IFdpZmlNYW5hZ2VyLmNhbGN1bGF0ZVNpZ25hbExldmVsKG5ld1Jzc2ksIDQpOworICAgICAgICAgICAgaWYgKG5ld1NpZ25hbExldmVsICE9IG1MYXN0U2lnbmFsTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBzZW5kUnNzaUNoYW5nZUJyb2FkY2FzdChuZXdSc3NpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSBuZXdTaWduYWxMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRSc3NpKC0yMDApOworICAgICAgICB9CisgICAgICAgIGludCBuZXdMaW5rU3BlZWQgPSBXaWZpTmF0aXZlLmdldExpbmtTcGVlZENvbW1hbmQoKTsKKyAgICAgICAgaWYgKG5ld0xpbmtTcGVlZCAhPSAtMSkgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cworICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AgJiBkaXNhYmxpbmcgaW50ZXJmYWNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCkgeworICAgICAgICBMb2cuZChUQUcsICJSZXNldCBjb25uZWN0aW9ucyBhbmQgc3RvcHBpbmcgREhDUCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb25zICYgc3RvcCBESENQCisgICAgICAgICAqLworICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgaWYgKCFOZXR3b3JrVXRpbHMuc3RvcERoY3AobUludGVyZmFjZU5hbWUpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc3RvcCBESENQIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaXNhYmxlIGludGVyZmFjZSAqLworICAgICAgICBOZXR3b3JrVXRpbHMuZGlzYWJsZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSk7CisKKyAgICAgICAgLyogc2VuZCBldmVudCB0byBDTSAmIG5ldHdvcmsgY2hhbmdlIGJyb2FkY2FzdCAqLworICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKKworICAgICAgICAvKiBSZXNldCBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOworICAgICAgICBtV2lmaUluZm8uc2V0U1NJRChudWxsKTsKKyAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZCgtMSk7CisKKyAgICAgICAgLyogQ2xlYXIgbmV0d29yayBwcm9wZXJ0aWVzICovCisgICAgICAgIG1MaW5rUHJvcGVydGllcy5jbGVhcigpOworCisgICAgICAgIG1MYXN0QnNzaWQ9IG51bGw7CisgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisKKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBOb3RpZmljYXRpb25zIGZyb20gV2lmaU1vbml0b3IKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioKKyAgICAgKiBBIHN0cnVjdHVyZSBmb3Igc3VwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IGEgc3VwcGxpY2FudCBzdGF0ZQorICAgICAqIGNoYW5nZSBpbiB0aGUgU1RBVEVfQ0hBTkdFIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZQorICAgICAqIFdpZmlNb25pdG9yCisgICAgICogdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRlQ2hhbmdlUmVzdWx0IHsKKyAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBPYmplY3Qgc3RhdGUpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKKyAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOworICAgICAgICB9CisgICAgICAgIGludCBuZXR3b3JrSWQ7CisgICAgICAgIFN0cmluZyBCU1NJRDsKKyAgICAgICAgT2JqZWN0IHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKKyAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCisgICAgICovCisgICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgeworICAgICAgICBzZW5kTWVzc2FnZShQQVNTV09SRF9NQVlfQkVfSU5DT1JSRUNUX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9DT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50CisgICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudExvc3QoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5CisgICAgICogaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBuZXR3b3JrIHN0YXRlCisgICAgICogQHBhcmFtIEJTU0lEIHdoZW4gdGhlIG5ldyBzdGF0ZSBpcyB7QGxpbmsgRGV0YWlsZWRTdGF0ZSNDT05ORUNURUQKKyAgICAgKiBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRH0sCisgICAgICogdGhpcyBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGFjY2VzcyBwb2ludC4gT3RoZXJ3aXNlLCBpdAorICAgICAqIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeU5ldHdvcmtTdGF0ZUNoYW5nZShEZXRhaWxlZFN0YXRlIG5ld1N0YXRlLCBTdHJpbmcgQlNTSUQsIGludCBuZXR3b3JrSWQpIHsKKyAgICAgICAgaWYgKG5ld1N0YXRlID09IE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShvYnRhaW5NZXNzYWdlKE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRlQ2hhbmdlUmVzdWx0KG5ldHdvcmtJZCwgQlNTSUQsIG5ld1N0YXRlKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZUNoYW5nZVJlc3VsdChuZXR3b3JrSWQsIEJTU0lELCBuZXdTdGF0ZSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgdGhlIHN1cHBsaWNhbnQKKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IHtAY29kZSBTdXBwbGljYW50U3RhdGV9CisgICAgICovCisgICAgdm9pZCBub3RpZnlTdXBwbGljYW50U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKKyAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVCwKKyAgICAgICAgICAgICAgICBuZXcgU3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IGEgc2NhbiBoYXMgY29tcGxldGVkLCBhbmQgcmVzdWx0cworICAgICAqIGFyZSBhdmFpbGFibGUuCisgICAgICovCisgICAgdm9pZCBub3RpZnlTY2FuUmVzdWx0c0F2YWlsYWJsZSgpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN3aXRjaCBzY2FuIG1vZGUgb3ZlciB0byBwYXNzaXZlLgorICAgICAgICAgKiBUdXJuaW5nIG9mZiBzY2FuLW9ubHkgbW9kZSBoYXBwZW5zIG9ubHkgaW4gIkNvbm5lY3QiIG1vZGUKKyAgICAgICAgICovCisgICAgICAgIHNldFNjYW5UeXBlKGZhbHNlKTsKKyAgICAgICAgc2VuZE1lc3NhZ2UoU0NBTl9SRVNVTFRTX0VWRU5UKTsKKyAgICB9CisKKyAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7CisgICAgICAgIHNlbmRNZXNzYWdlKERSSVZFUl9TVEFSVF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJTdG9wcGVkKCkgeworICAgICAgICBzZW5kTWVzc2FnZShEUklWRVJfU1RPUF9FVkVOVCk7CisgICAgfQorCisgICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgeworICAgICAgICBzZXRXaWZpRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHNldFdpZmlFbmFibGVkKHRydWUpOworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogSFNNIHN0YXRlcworICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY2xhc3MgRGVmYXVsdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU3luY2hyb25vdXMgY2FsbCByZXR1cm5zICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfUElOR19TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0FCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9BRERfT1JfVVBEQVRFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0k6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfR0VUX1JTU0lfQVBQUk9YOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9MSU5LX1NQRUVEOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLnN0cmluZ1ZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9SU1NJX1BPTEw6CisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVSc3NpUG9sbGluZyA9IChtZXNzYWdlLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKENNRF9FTkFCTEVfUlNTSV9QT0xMKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUT1BfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQkxBQ0tMSVNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ0xFQVJfQkxBQ0tMSVNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfUE9XRVJfTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfQkxVRVRPT1RIX0NPRVhJU1RFTkNFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9OVU1fQUxMT1dFRF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRVFVRVNUX0NNX1dBS0VMT0NLOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TQVZFX05FVFdPUks6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRk9SR0VUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yISB1bmhhbmRsZWQgbWVzc2FnZSIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEluaXRpYWxTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIC8vVE9ETzogY291bGQgbW92ZSBsb2dnaW5nIGludG8gYSBjb21tb24gY2xhc3MKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgLy8gWzMxLThdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAvLyBbNyAtIDBdIEhTTSBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICAgIC8vIDUwMDIxIHdpZmlfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAoV2lmaU5hdGl2ZS5pc0RyaXZlckxvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclVubG9hZGVkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyTG9hZGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmNvcHlGcm9tKGdldEN1cnJlbnRNZXNzYWdlKCkpOworICAgICAgICAgICAgLyogVE9ETzogYWRkIGEgdGltZW91dCB0byBmYWlsIHdoZW4gZHJpdmVyIGxvYWQgaXMgaHVuZy4KKyAgICAgICAgICAgICAqIFNpbWlsYXJseSBmb3IgZHJpdmVyIHVubG9hZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgICAvL2VuYWJsaW5nIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpU3RhdGUoV0lGSV9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRU5BQkxJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9FTkFCTElORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihXaWZpTmF0aXZlLmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIGxvYWQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0xPQURfRFJJVkVSX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9FTkFCTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9MT0FEX0RSSVZFUl9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9MT0FEX0RSSVZFUl9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJMb2FkZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfVU5MT0FEX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJVbmxvYWRpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmKFdpZmlOYXRpdmUuc3RhcnRTdXBwbGljYW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN1cHBsaWNhbnQgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlNb25pdG9yLnN0YXJ0TW9uaXRvcmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfRU5BQkxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVdhaXRGb3JTdXBTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc3RhcnQgc3VwcGxpY2FudCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfVU5LTk9XTiwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0YXJ0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIHN0YXJ0QWNjZXNzUG9pbnQoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2Uob2J0YWluTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUiwgV0lGSV9BUF9TVEFURV9GQUlMRUQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNvZnQgQVAgc3RhcnQgc3VjY2Vzc2Z1bCIpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0VOQUJMRUQpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNvZnRBcFN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICAgICAgbWVzc2FnZS5jb3B5RnJvbShnZXRDdXJyZW50TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc1dha2VMb2NrLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoV2lmaU5hdGl2ZS51bmxvYWREcml2ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRHJpdmVyIHVubG9hZCBzdWNjZXNzZnVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfVU5MT0FEX0RSSVZFUl9TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2UuYXJnMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0lGSV9BUF9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB1bmxvYWQgZHJpdmVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLmFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX1NUQVRFX1VOS05PV046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZmlTdGF0ZShXSUZJX1NUQVRFX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdJRklfQVBfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXSUZJX0FQX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzV2FrZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyVW5sb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVJfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJGYWlsZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0xPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1VOTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1NVUFBMSUNBTlQ6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9BUDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBEcml2ZXJVbmxvYWRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfTE9BRF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyTG9hZGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlckZhaWxlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgY2xhc3MgV2FpdEZvclN1cFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUF9DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdXBwbGljYW50IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIucmVzZXRTdXBwbGljYW50U3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TmV0d29ya0lkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U2lnbmFsTGV2ZWwgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0TWFjQWRkcmVzcyhXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCkpOworCisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5pbml0aWFsaXplKG1Db250ZXh0KTsKKworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGluaXRpYWxpemUgYW5kIGZpeCBtdWx0aWNhc3QgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJsdWV0b290aEEyZHAgPSBuZXcgQmx1ZXRvb3RoQTJkcChtQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50Q29ubmVjdGlvbkNoYW5nZWRCcm9hZGNhc3QodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3VwUmVhZHlTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RvcCBzdXBwbGljYW50IHJlY2VpdmVkIik7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFN1cHBsaWNhbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJMb2FkZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBGYWlsIHNvZnQgYXAgd2hlbiB3YWl0aW5nIGZvciBzdXBwbGljYW50IHN0YXJ0ICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCB0byBzdGFydCBzb2Z0IEFQIHdpdGggYSBydW5uaW5nIHN1cHBsaWNhbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfQVA6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9VTkxPQURfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRHJpdmVyU3VwUmVhZHlTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmb3IgY29ubmVjdCBtb2RlIG9wZXJhdGlvbiBhdCBzdGFydCAqLworICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfU1VQUExJQ0FOVDogICAvKiBTdXBwbGljYW50IHN0b3BwZWQgYnkgdXNlciAqLworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdG9wIHN1cHBsaWNhbnQgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdG9wU3VwcGxpY2FudCgpOworICAgICAgICAgICAgICAgICAgICAvLyRGQUxMLVRIUk9VR0gkCisgICAgICAgICAgICAgICAgY2FzZSBTVVBfRElTQ09OTkVDVElPTl9FVkVOVDogIC8qIFN1cHBsaWNhbnQgZGllZCAqLworICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5jbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50Q29ubmVjdGlvbkNoYW5nZWRCcm9hZGNhc3QoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5yZXNldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBXaGVuIHN1cHBsaWNhbnQgZGllcywgdW5sb2FkIGRyaXZlciBhbmQgZW50ZXIgZmFpbGVkIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY29uc2lkZXIgYnJpbmdpbmcgdXAgc3VwcGxpY2FudCBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS53aGF0ID09IFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdXBwbGljYW50IGRpZWQsIHVubG9hZGluZyBkcml2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfU1RBVEVfVU5LTk9XTiwgMCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RhcnRpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBzZXRTY2FuUmVzdWx0cyhXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFNjYW5SZXN1bHRzQXZhaWxhYmxlQnJvYWRjYXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1BJTkdfU1VQUExJQ0FOVDoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpTmF0aXZlLnBpbmdDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9BRERfT1JfVVBEQVRFX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAoV2lmaUNvbmZpZ3VyYXRpb24pIHN5bmNQYXJhbXMubVBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5hZGRPclVwZGF0ZU5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFTU9WRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUucmVtb3ZlTmV0d29yaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0VOQUJMRV9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlTmV0UGFyYW1zIGVuYWJsZU5ldFBhcmFtcyA9IChFbmFibGVOZXRQYXJhbXMpIHN5bmNQYXJhbXMubVBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5ib29sVmFsdWUgPSBXaWZpQ29uZmlnU3RvcmUuZW5hYmxlTmV0d29yaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVOZXRQYXJhbXMubmV0SWQsIGVuYWJsZU5ldFBhcmFtcy5kaXNhYmxlT3RoZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0FCTEVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMgPSAoU3luY1BhcmFtcykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQYXJhbXMubVN5bmNSZXR1cm4uYm9vbFZhbHVlID0gV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9CTEFDS0xJU1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKChTdHJpbmcpbWVzc2FnZS5vYmopOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DTEVBUl9CTEFDS0xJU1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuY2xlYXJCbGFja2xpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmJvb2xWYWx1ZSA9IFdpZmlDb25maWdTdG9yZS5zYXZlQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm0gdGhlIGJhY2t1cCBtYW5hZ2VyIGFib3V0IGEgZGF0YSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgSUJhY2t1cE1hbmFnZXIgaWJtID0gSUJhY2t1cE1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQkFDS1VQX1NFUlZJQ0UpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlibSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlibS5kYXRhQ2hhbmdlZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5zdHJpbmdWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0TWFjQWRkcmVzc0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBDYW5ub3Qgc3RhcnQgc29mdCBBUCB3aGlsZSBpbiBjbGllbnQgbW9kZSAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gc3RhcnQgc29mdCBBUCB3aXRoIGEgcnVubmluZyBzdXBwbGljYW50Iik7CisgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgICAgICAgICBzZXRXaWZpQXBTdGF0ZShXSUZJX0FQX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NBVkVfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNhdmVOZXR3b3JrKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0ZPUkdFVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZm9yZ2V0TmV0d29yayhtZXNzYWdlLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0YXJ0aW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJUX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlclN0YXJ0ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBRdWV1ZSBkcml2ZXIgY29tbWFuZHMgJiBjb25uZWN0aW9uIGV2ZW50cyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgUEFTU1dPUkRfTUFZX0JFX0lOQ09SUkVDVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0YXJ0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gaWdub3JlKSB7fQorCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIGNoYW5uZWwgY291bnQgKi8KKyAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNUT1BTSElQCisgICAgICAgICAgICAgKiBUT0RPOiBXZSBhcmUgaGF2aW5nIDExQSBpc3N1ZXMgdGhhdCBCcm9hZGNvbSBpcyBsb29raW5nCisgICAgICAgICAgICAgKiB0byByZXNvbHZlLCB0aGlzIGlzIGEgdGVtcG9yYXJ5IGZpeCB0byBhbGxvdyBvbmx5IDExQi9HCisgICAgICAgICAgICAgKiBhbmQgaGVscCBpbXByb3ZlIEdvb2dsZUd1ZXN0IGNvbm5lY3Rpdml0eQorICAgICAgICAgICAgICogV2UgYWxzbyBuZWVkIHRvIGFkZCB0aGUgVUkgZm9yIGJhbmQgY29udHJvbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJhbmRDb21tYW5kKEJBTkRfMkcpOworCisgICAgICAgICAgICBpZiAobUlzU2Nhbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoU0NBTl9PTkxZX01PREUpOworICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5Nb2RlU3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQoQ09OTkVDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAvKiBJZiBzdXBwbGljYW50IGhhcyBhbHJlYWR5IGNvbm5lY3RlZCwgYmVmb3JlIHdlIGNvdWxkIGZpbmlzaCBlc3RhYmxpc2hpbmcKKyAgICAgICAgICAgICAgICAgKiB0aGUgY29udHJvbCBjaGFubmVsIGNvbm5lY3Rpb24sIHdlIG1pc3MgYWxsIHRoZSBzdXBwbGljYW50IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgKiBEaXNjb25uZWN0IGFuZCByZWNvbm5lY3Qgd2hlbiBkcml2ZXIgaGFzIHN0YXJ0ZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUKKyAgICAgICAgICAgICAgICAgKiBhbGwgc3VwcGxpY2FudCBldmVudHMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUT0RPOiBUaGlzIGlzIGEgYml0IHVuY2xlYW4sIGlkZWFsbHkgdGhlIHN1cHBsaWNhbnQgc2hvdWxkIG5ldmVyCisgICAgICAgICAgICAgICAgICogY29ubmVjdCB1bnRpbCB0b2xkIHRvIGRvIHNvIGJ5IHRoZSBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLmRpc2Nvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Db25uZWN0TW9kZVN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgU3luY1BhcmFtcyBzeW5jUGFyYW1zOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuTW9kZUNvbW1hbmQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlU2Nhbk1vZGVDb21tYW5kKG1lc3NhZ2UuYXJnMSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbWVzc2FnZS5hcmcxOworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgYW5vdGhlciBkcml2ZXIgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9EUklWRVI6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVRVUVTVF9DTV9XQUtFTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ20gPSAoQ29ubmVjdGl2aXR5TWFuYWdlciltQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ20ucmVxdWVzdE5ldHdvcmtUcmFuc2l0aW9uV2FrZWxvY2soVEFHKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfUEFDS0VUX0ZJTFRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RvcFBhY2tldEZpbHRlcmluZygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlTdGF0cy5ub3RlV2lmaVN0b3BwZWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsgfQorICAgICAgICAgICAgbVNjYW5SZXN1bHRzID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0b3BwaW5nU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUT1BfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RvcHBlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGRyaXZlciBjb21tYW5kcyAqLworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9QT1dFUl9NT0RFOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9CTFVFVE9PVEhfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX0JMVUVUT09USF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX05VTV9BTExPV0VEX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1BBQ0tFVF9GSUxURVJJTkc6CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RPUF9QQUNLRVRfRklMVEVSSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERyaXZlclN0b3BwZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTY2FuTW9kZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIFN5bmNQYXJhbXMgc3luY1BhcmFtczsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1lc3NhZ2UuYXJnMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnJlY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NjYW5Nb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JFQ09OTkVDVDoKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdE1vZGVTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBTeW5jUGFyYW1zIHN5bmNQYXJhbXM7CisgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdDsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBBU1NXT1JEX01BWV9CRV9JTkNPUlJFQ1RfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBtU3VwcGxpY2FudFN0YXRlVHJhY2tlci5oYW5kbGVFdmVudChzdGF0ZUNoYW5nZVJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHNjYW4gdHlwZSBpbiBjb21wbGV0ZWQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBuZXdNc2cgPSBvYnRhaW5NZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld01zZy5jb3B5RnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuc2VuZE1lc3NhZ2UobmV3TXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIERvIGEgcmVkdW5kYW50IGRpc2Nvbm5lY3Qgd2l0aG91dCB0cmFuc2l0aW9uICovCisgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUFTU09DSUFURToKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWFzc29jaWF0ZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfQ09OTkVDVF9ORVRXT1JLOgorICAgICAgICAgICAgICAgICAgICBpbnQgbmV0SWQgPSBtZXNzYWdlLmFyZzE7CisgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IChXaWZpQ29uZmlndXJhdGlvbikgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgICAgLyogV2UgY29ubmVjdCB0byBhIHNwZWNpZmljIG5ldHdvcmsgYnkgaXNzdWluZyBhIHNlbGVjdAorICAgICAgICAgICAgICAgICAgICAgKiB0byB0aGUgV2lmaUNvbmZpZ1N0b3JlLiBUaGlzIGVuYWJsZXMgdGhlIG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgICAqIHdoaWxlIGRpc2FibGluZyBhbGwgb3RoZXIgbmV0d29ya3MgaW4gdGhlIHN1cHBsaWNhbnQuCisgICAgICAgICAgICAgICAgICAgICAqIERpc2FibGluZyBhIGNvbm5lY3RlZCBuZXR3b3JrIHdpbGwgY2F1c2UgYSBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIG5ldHdvcmsuIEEgcmVjb25uZWN0Q29tbWFuZCgpIHdpbGwgdGhlbiBpbml0aWF0ZQorICAgICAgICAgICAgICAgICAgICAgKiBhIGNvbm5lY3Rpb24gdG8gdGhlIGVuYWJsZWQgbmV0d29yay4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLnNlbGVjdE5ldHdvcmsoY29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5zZWxlY3ROZXR3b3JrKG5ldElkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2UgbmVlZCB0byBlbmFibGUgYWxsCisgICAgICAgICAgICAgICAgICAgICAqIG5ldHdvcmtzIGFmdGVyIHN1cHBsaWNhbnQgaW5kaWNhdGVzIGEgbmV0d29yaworICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZSBjaGFuZ2UgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVBbGxOZXR3b3JrcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRXhwZWN0IGEgZGlzY29ubmVjdGlvbiBmcm9tIHRoZSBvbGQgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0NBTl9SRVNVTFRTX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHNjYW4gc2V0dGluZyBiYWNrIHRvICJjb25uZWN0IiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0U2NhblJlc3VsdEhhbmRsaW5nQ29tbWFuZChDT05ORUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgc2NhbiByZXN1bHRzICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJOZXR3b3JrIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogbWFrZSBzdXBwbGljYW50IG1vZGlmaWNhdGlvbiB0byBwdXNoIHRoaXMgaW4gZXZlbnRzCisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTU0lEKGZldGNoU1NJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG1MYXN0QnNzaWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5CU1NJRCk7CisgICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXROZXR3b3JrSWQoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSBzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZXZlbnQgdG8gQ00gJiBuZXR3b3JrIGNoYW5nZSBicm9hZGNhc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIk5ldHdvcmsgY29ubmVjdGlvbiBsb3N0Iik7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5ldHdvcmtEaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9HRVRfUlNTSToKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0UnNzaUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9SU1NJX0FQUFJPWDoKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcyA9IChTeW5jUGFyYW1zKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BhcmFtcy5tU3luY1JldHVybi5pbnRWYWx1ZSA9IFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5T25Nc2dPYmplY3QobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0dFVF9MSU5LX1NQRUVEOgorICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zID0gKFN5bmNQYXJhbXMpIG1lc3NhZ2Uub2JqOworICAgICAgICAgICAgICAgICAgICBzeW5jUGFyYW1zLm1TeW5jUmV0dXJuLmludFZhbHVlID0gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeU9uTXNnT2JqZWN0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgQ29ubmVjdGluZ1N0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBib29sZWFuIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlOworICAgICAgICBpbnQgcG93ZXJNb2RlOworICAgICAgICBUaHJlYWQgbURoY3BUaHJlYWQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgeworCisgICAgICAgICAgICAgICAgbURoY3BUaHJlYWQgPSBudWxsOworICAgICAgICAgICAgICAgIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcG93ZXJNb2RlID0gRFJJVkVSX1BPV0VSX01PREVfQVVUTzsKKworICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgYXJlIHByb2JsZW1zIHNldHRpbmcgdGhlIFdpLUZpIGRyaXZlcidzIHBvd2VyCisgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICogZW5hYmxlZCBvciBzZW5zZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAqIG9idGFpbmluZyBhbiBJUCBhZGRyZXNzIGJlY2F1c2Ugd2UndmUgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICogY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aCBzb21lIHJvdXRlcnMgd2l0aCBsb3cgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICogPHA+CisgICAgICAgICAgICAgICAgICAgICAqIEluIG9yZGVyIGZvciB0aGlzIGFjdGl2ZSBwb3dlciBtb2RlIHRvIHByb3Blcmx5IGJlIHNldCwKKyAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcy4gIE9uZSBleGNlcHRpb24gaXMgaWYgd2UKKyAgICAgICAgICAgICAgICAgICAgICogYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gYSBoZWFkc2V0LCBzaW5jZSBkaXNhYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLkJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSAgV2lmaU5hdGl2ZS5nZXRQb3dlck1vZGVDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBzdXBwbGljYW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAvLyBnZXRQb3dlck1vZGVDb21tYW5kLgorICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQoRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHJlcXVlc3Qgc3RhcnRlZCIpOworICAgICAgICAgICAgICAgIG1EaGNwVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkRIQ1AgcmVxdWVzdCBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHJlcXVlc3QgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0lQX0NPTkZJR19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1EaGNwVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMuY29uZmlndXJlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lLCBtRGhjcEluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX1NVQ0NFU1MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfSVBfQ09ORklHX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKworICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgY2FzZSBDTURfSVBfQ09ORklHX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgPSAwOworICAgICAgICAgICAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOyAvLyBmb3JjZSB1cGRhdGUgb2Ygc2lnbmFsIHN0cmVuZ3RoCisgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKG1EaGNwSW5mby5pcEFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSVAgY29uZmlndXJhdGlvbjogIiArIG1EaGNwSW5mbyk7CisgICAgICAgICAgICAgICAgICBjb25maWd1cmVMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgICBzZW5kTmV0d29ya1N0YXRlQ2hhbmdlQnJvYWRjYXN0KG1MYXN0QnNzaWQpOworICAgICAgICAgICAgICAgICAgLy9UT0RPOiB3ZSBjb3VsZCBhbHNvIGRldGVjdCBhbiBJUCBjb25maWcgY2hhbmdlCisgICAgICAgICAgICAgICAgICAvLyBmcm9tIGEgREhDUCByZW5ld2FsIGFuZCBzZW5kIG91dCBhIGNvbmZpZyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgIC8vIGJyb2FkY2FzdAorICAgICAgICAgICAgICAgICAgaWYgKG1Db25maWdDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2VuZENvbmZpZ0NoYW5nZUJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgICAgIG1Db25maWdDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9JUF9DT05GSUdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRJcEFkZHJlc3MoMCk7CisKKyAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIklQIGNvbmZpZ3VyYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAqIElmIHdlJ3ZlIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGZvciBESENQCisgICAgICAgICAgICAgICAgICAgKiB0byBhIGdpdmVuIG5ldHdvcmssIGRpc2FibGUgdGhlIG5ldHdvcmsKKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgaWYgKCsrbVJlY29ubmVjdENvdW50ID4gZ2V0TWF4RGhjcFJldHJpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ICsgIiB0aW1lcywgRGlzYWJsaW5nICIgKyBtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgICAgICAgICAgICAgICAgV2lmaUNvbmZpZ1N0b3JlLmRpc2FibGVOZXR3b3JrKG1MYXN0TmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgLyogREhDUCB0aW1lcyBvdXQgYWZ0ZXIgYWJvdXQgMzAgc2Vjb25kcywgd2UgZG8gYQorICAgICAgICAgICAgICAgICAgICogZGlzY29ubmVjdCBhbmQgYW4gaW1tZWRpYXRlIHJlY29ubmVjdCB0byB0cnkgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5yZWNvbm5lY3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURpc2Nvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGNvbm5lY3Rpb24gdG8gc2FtZSBuZXR3b3JrICovCisgICAgICAgICAgICAgIGNhc2UgQ01EX0NPTk5FQ1RfTkVUV09SSzoKKyAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkgPT0gbmV0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSAqLworICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9ESVNDT05ORUNUKTsKKyAgICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBDTURfUkVDT05GSUdVUkVfSVA6CisgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgfQorICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgLyogcmVzZXQgcG93ZXIgc3RhdGUgJiBibHVldG9vdGggY29leGlzdGVuY2UgaWYgb24gREhDUCAqLworICAgICAgICAgIGlmICghbVVzZVN0YXRpY0lwKSB7CisgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQocG93ZXJNb2RlKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmIChtb2RpZmllZEJsdWV0b290aENvZXhpc3RlbmNlTW9kZSkgeworICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjb2V4aXN0ZW5jZSBtb2RlIGJhY2sgdG8gaXRzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5CTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9TRU5TRSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBDb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0aW5nU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9SRUNPTkZJR1VSRV9JUDoKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCJSZWNvbmZpZ3VyaW5nIElQIG9uIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUNvbm5lY3RpbmdTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOgorICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZShDTURfRElTQ09OTkVDVCk7CisgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU0VUX1NDQU5fTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX09OTFlfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoQ01EX0RJU0NPTk5FQ1QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgY29ubmVjdGlvbiB0byBzYW1lIG5ldHdvcmsgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9DT05ORUNUX05FVFdPUks6CisgICAgICAgICAgICAgICAgICAgIGludCBuZXRJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXROZXR3b3JrSWQoKSA9PSBuZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX0VWRU5UX0hBTkRMRUQsIG1lc3NhZ2Uud2hhdCk7CisgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERpc2Nvbm5lY3RpbmdTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9TVEFURV9DSEFOR0VELCBnZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUT1BfRFJJVkVSOiAvKiBTdG9wIGRyaXZlciBvbmx5IGFmdGVyIGRpc2Nvbm5lY3QgaGFuZGxlZCAqLworICAgICAgICAgICAgICAgICAgICBkZWZlck1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9TQ0FOX01PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gU0NBTl9PTkxZX01PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVyTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGl0KCkgeworICAgICAgICAgICAgaWYgKG1FbmFibGVBbGxOZXR3b3JrcykgeworICAgICAgICAgICAgICAgIG1FbmFibGVBbGxOZXR3b3JrcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5lbmFibGVBbGxOZXR3b3JrcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgRGlzY29ubmVjdGVkU3RhdGUgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfU1RBVEVfQ0hBTkdFRCwgZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TRVRfU0NBTl9NT0RFOgorICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hcmcxID09IFNDQU5fT05MWV9NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldFNjYW5SZXN1bHRIYW5kbGluZ0NvbW1hbmQobWVzc2FnZS5hcmcxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcGxpY2FudCBkaXNjb25uZWN0IHRvIHByZXZlbnQgZnVydGhlciBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuTW9kZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIG5ldHdvcmsgZGlzY29ubmVjdCAqLworICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1dJRklfRVZFTlRfSEFORExFRCwgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU29mdEFwU3RhcnRlZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19XSUZJX1NUQVRFX0NIQU5HRUQsIGdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0FQOgorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIlN0b3BwaW5nIFNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaUFwU3RhdGUoV0lGSV9BUF9TVEFURV9ESVNBQkxJTkcpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFeGNlcHRpb24gaW4gc3RvcEFjY2Vzc1BvaW50KCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obURyaXZlckxvYWRlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfQVA6CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiU29mdEFQIHNldCBvbiBhIHJ1bm5pbmcgYWNjZXNzIHBvaW50Iik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0QWNjZXNzUG9pbnQoKFdpZmlDb25maWd1cmF0aW9uKSBtZXNzYWdlLm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GVEFQX0lGQUNFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXhjZXB0aW9uIGluIG53U2VydmljZSBkdXJpbmcgc29mdCBBUCBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbndTZXJ2aWNlLnN0b3BBY2Nlc3NQb2ludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBzdG9wIEFQLCA6IiArIGVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UoQ01EX1VOTE9BRF9EUklWRVIsIFdJRklfQVBfU1RBVEVfRkFJTEVELCAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRmFpbCBjbGllbnQgbW9kZSBvcGVyYXRpb24gd2hlbiBzb2Z0IEFQIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TVVBQTElDQU5UOgorICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIkNhbm5vdCBzdGFydCBzdXBwbGljYW50IHdpdGggYSBydW5uaW5nIHNvZnQgQVAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0V2lmaVN0YXRlKFdJRklfU1RBVEVfVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfV0lGSV9FVkVOVF9IQU5ETEVELCBtZXNzYWdlLndoYXQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGNsYXNzIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgeworCisgICAgICAgIHByaXZhdGUgaW50IG1Sc3NpUG9sbFRva2VuID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBudW1iZXIgb2YgdGhlIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9ucyBiZWZvcmUgd2UKKyAgICAgICAgICogZGVjaWRlIHRoYXQgdGhlIGxvb3Agc2hvdWxkIGJlIHRlcm1pbmF0ZWQ6CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TID0gNDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUxvb3BEZXRlY3RJbmRleCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1Mb29wRGV0ZWN0Q291bnQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAgU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgY29tbWFuZHMgZm9sbG93CisgICAgICAgICAqICB0aGUgb3JkaW5hbCB2YWx1ZXMgZGVmaW5lZCBpbiBTdXBwbGljYW50U3RhdGUuamF2YQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPTk5FQ1RFRCAgICAgICAgICAgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5BQ1RJVkUgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOTklORyAgICAgICAgICAgICAgID0gMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTU09DSUFUSU5HICAgICAgICAgICAgPSAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNTT0NJQVRFRCAgICAgICAgICAgICA9IDQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1VSX1dBWV9IQU5EU0hBS0UgICAgID0gNTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX0hBTkRTSEFLRSAgICAgICAgPSA2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NUExFVEVEICAgICAgICAgICAgICA9IDc7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBET1JNQU5UICAgICAgICAgICAgICAgID0gODsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRUQgICAgICAgICAgPSA5OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCAgICAgICAgICAgICAgICA9IDEwOworCisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtSW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBJbml0aWFsaXplZFN0YXRlKCk7OworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1JbmFjdGl2ZVN0YXRlID0gbmV3IEluYWN0aXZlU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtRGlzY29ubmVjdFN0YXRlID0gbmV3IERpc2Nvbm5lY3RlZFN0YXRlKCk7CisgICAgICAgIHByaXZhdGUgSGllcmFyY2hpY2FsU3RhdGUgbVNjYW5TdGF0ZSA9IG5ldyBTY2FuU3RhdGUoKTsKKyAgICAgICAgcHJpdmF0ZSBIaWVyYXJjaGljYWxTdGF0ZSBtQ29ubmVjdFN0YXRlID0gbmV3IENvbm5lY3RTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1IYW5kc2hha2VTdGF0ZSA9IG5ldyBIYW5kc2hha2VTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Db21wbGV0ZWRTdGF0ZSA9IG5ldyBDb21wbGV0ZWRTdGF0ZSgpOworICAgICAgICBwcml2YXRlIEhpZXJhcmNoaWNhbFN0YXRlIG1Eb3JtYW50U3RhdGUgPSBuZXcgRG9ybWFudFN0YXRlKCk7CisKKyAgICAgICAgcHVibGljIFN1cHBsaWNhbnRTdGF0ZVRyYWNrZXIoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICAgICAgc3VwZXIoVEFHLCB0YXJnZXQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgICAgICBhZGRTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgIGFkZFN0YXRlKG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSW5hY3RpdmVTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1EaXNjb25uZWN0U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKyAgICAgICAgICAgICAgICBhZGRTdGF0ZShtU2NhblN0YXRlLCBtSW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgICAgICAgICAgYWRkU3RhdGUobUNvbm5lY3RTdGF0ZSwgbUluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtSGFuZHNoYWtlU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICBhZGRTdGF0ZShtQ29tcGxldGVkU3RhdGUsIG1Db25uZWN0U3RhdGUpOworICAgICAgICAgICAgICAgIGFkZFN0YXRlKG1Eb3JtYW50U3RhdGUsIG1Jbml0aWFsaXplZFN0YXRlKTsKKworICAgICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKG1VbmluaXRpYWxpemVkU3RhdGUpOworCisgICAgICAgICAgICAvL3N0YXJ0IHRoZSBzdGF0ZSBtYWNoaW5lCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQpIHsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBuZXdTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworCisgICAgICAgICAgICAvLyBTdXBwbGljYW50IHN0YXRlIGNoYW5nZQorICAgICAgICAgICAgLy8gWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICAgICAgICAgICAgLy8gWzggLSAwXSBTdXBwbGljYW50IHN0YXRlIChhcyBkZWZpbmVkIGluIFN1cHBsaWNhbnRTdGF0ZS5qYXZhKQorICAgICAgICAgICAgLy8gNTAwMjMgc3VwcGxpY2FudF9zdGF0ZV9jaGFuZ2VkIChjdXN0b218MXw1KQorICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIG5ld1N0YXRlLm9yZGluYWwoKSk7CisKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG9idGFpbk1lc3NhZ2UobmV3U3RhdGUub3JkaW5hbCgpLCBzdGF0ZUNoYW5nZVJlc3VsdCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRTdXBwbGljYW50U3RhdGUoKSB7CisgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXRMb29wRGV0ZWN0aW9uKCkgeworICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCA9IDA7CisgICAgICAgICAgICBtTG9vcERldGVjdEluZGV4ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUcmFuc2l0aW9uKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1zZy50b1N0cmluZygpICsgIlxuIik7CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRGlzY29ubmVjdFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1TY2FuU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICAgICAgLyogQlNTSUQgaXMgdmFsaWQgb25seSBpbiBBU1NPQ0lBVElORyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtV2lmaUluZm8uc2V0QlNTSUQoc3RhdGVDaGFuZ2VSZXN1bHQuQlNTSUQpOworICAgICAgICAgICAgICAgICAgICAvLyRGQUxMLVRIUk9VR0gkCisgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obUhhbmRzaGFrZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29tcGxldGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERPUk1BTlQ6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRG9ybWFudFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1JbmFjdGl2ZVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRDoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1VbmluaXRpYWxpemVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBTdGF0ZSA9IChTdXBwbGljYW50U3RhdGUpIHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOworICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3VwU3RhdGUpKTsKKyAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3VwU3RhdGUpOworICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICAgICAgcmV0dXJuIEhBTkRMRUQ7CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogSFNNIHN0YXRlcworICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBjbGFzcyBJbml0aWFsaXplZFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArIG1lc3NhZ2UudG9TdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKG1lc3NhZ2UuYXJnMSA9PSBTQ0FOX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy53KFRBRywgIklnbm9yaW5nICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFVuaW5pdGlhbGl6ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy53KFRBRywgIklnbm9yaW5nICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBJbmFjdGl2ZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8uc2V0SXNBdmFpbGFibGUoZmFsc2UpOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4aXQoKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBjbGFzcyBEaXNjb25uZWN0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgLyogSWYgYSBkaXNjb25uZWN0IGV2ZW50IGhhcHBlbnMgYWZ0ZXIgYSBwYXNzd29yZCBrZXkgZmFpbHVyZQorICAgICAgICAgICAgICAgICAgKiBldmVudCwgZGlzYWJsZSB0aGUgbmV0d29yaworICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgaWYgKG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJGYWlsZWQgdG8gYXV0aGVudGljYXRlLCBkaXNhYmxpbmcgbmV0d29yayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5kaXNhYmxlTmV0d29yayhtV2lmaUluZm8uZ2V0TmV0d29ya0lkKCkpOworICAgICAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgU2NhblN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICByZXNldExvb3BEZXRlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcmFuc2l0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29ubmVjdFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVEFSVF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKFNDQU5fT05MWV9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc2NhbkNvbW1hbmQobWVzc2FnZS5hcmcxID09IFNDQU5fQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSEFORExFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEhhbmRzaGFrZVN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgcHVibGljIHZvaWQgZW50ZXIoKSB7CisgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgIFN0YXRlQ2hhbmdlUmVzdWx0IHN0YXRlQ2hhbmdlUmVzdWx0ID0gKFN0YXRlQ2hhbmdlUmVzdWx0KSBtZXNzYWdlLm9iajsKKworICAgICAgICAgICAgICAgICBpZiAobUxvb3BEZXRlY3RJbmRleCA+IG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RDb3VudCsrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmIChtTG9vcERldGVjdENvdW50ID4gTUFYX1NVUFBMSUNBTlRfTE9PUF9JVEVSQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgICBXaWZpQ29uZmlnU3RvcmUuZGlzYWJsZU5ldHdvcmsoc3RhdGVDaGFuZ2VSZXN1bHQubmV0d29ya0lkKTsKKyAgICAgICAgICAgICAgICAgICAgIG1Mb29wRGV0ZWN0Q291bnQgPSAwOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgbUxvb3BEZXRlY3RJbmRleCA9IG1lc3NhZ2Uud2hhdDsKKworICAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZUNoYW5nZVJlc3VsdCwgZmFsc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBDb21wbGV0ZWRTdGF0ZSBleHRlbmRzIEhpZXJhcmNoaWNhbFN0YXRlIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgeworICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRDdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CisKKyAgICAgICAgICAgICAgICAgbVJzc2lQb2xsVG9rZW4rKzsKKyAgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVSc3NpUG9sbGluZykgeworICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0xMX1JTU0lfSU5URVJWQUxfTVNFQ1MpOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgc2VuZFN1cHBsaWNhbnRTdGF0ZUNoYW5nZWRCcm9hZGNhc3Qoc3RhdGVDaGFuZ2VSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZPVVJfV0FZX0hBTkRTSEFLRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01EX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmFyZzEgPT0gbVJzc2lQb2xsVG9rZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgSW5mbyBhbmQgY29udGludWUgcG9sbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sbGluZyBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTURfRU5BQkxFX1JTU0lfUE9MTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Sc3NpUG9sbFRva2VuKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuYWJsZVJzc2lQb2xsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgcG9sbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQb2xsZWRJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKG9idGFpbk1lc3NhZ2UoQ01EX1JTU0lfUE9MTCwgbVJzc2lQb2xsVG9rZW4sIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9MTF9SU1NJX0lOVEVSVkFMX01TRUNTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVRyYW5zaXRpb24obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBIQU5ETEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgRG9ybWFudFN0YXRlIGV4dGVuZHMgSGllcmFyY2hpY2FsU3RhdGUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsIGdldE5hbWUoKSArICJcbiIpOworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGdldEN1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICAgICAgcmVzZXRMb29wRGV0ZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHNlbmRTdXBwbGljYW50U3RhdGVDaGFuZ2VkQnJvYWRjYXN0KHN0YXRlQ2hhbmdlUmVzdWx0LCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiByZWNvbm5lY3QgaXMgbm93IGJlaW5nIGhhbmRsZWQgYXQgREhDUCBmYWlsdXJlIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICogSWYgd2UgcnVuIGludG8gaXNzdWVzIHdpdGggc3RheWluZyBpbiBEb3JtYW50IHN0YXRlLCBtaWdodAorICAgICAgICAgICAgICAgICAqIG5lZWQgYSByZWNvbm5lY3QgaGVyZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJhbnNpdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA1OWYyMzEyLi45Y2M0NGI1IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVUcmFja2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlVHJhY2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsNDUwICsxNiwxMDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldC53aWZpOwogCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9ESVNBQkxFRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0RJU0FCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX0VOQUJMRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTElORzsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQud2lmaS5XaWZpTWFuYWdlci5XSUZJX1NUQVRFX1VOS05PV047CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87Ci1pbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlVHJhY2tlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5EaGNwSW5mbzsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkNvbmZpZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoSGVhZHNldDsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhBMmRwOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuSUJhdHRlcnlTdGF0czsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiAKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIC8qKgotICogVHJhY2sgdGhlIHN0YXRlIG9mIFdpZmkgY29ubmVjdGl2aXR5LiBBbGwgZXZlbnQgaGFuZGxpbmcgaXMgZG9uZSBoZXJlLAotICogYW5kIGFsbCBjaGFuZ2VzIGluIGNvbm5lY3Rpdml0eSBzdGF0ZSBhcmUgaW5pdGlhdGVkIGhlcmUuCisgKiBUcmFjayB0aGUgc3RhdGUgb2Ygd2lmaSBmb3IgY29ubmVjdGl2aXR5IHNlcnZpY2UuCiAgKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFdpZmlTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBOZXR3b3JrU3RhdGVUcmFja2VyIHsKK3B1YmxpYyBjbGFzcyBXaWZpU3RhdGVUcmFja2VyIGltcGxlbWVudHMgTmV0d29ya1N0YXRlVHJhY2tlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0FMX0xPR0QgPSBDb25maWcuTE9HRCB8fCBmYWxzZTsKLSAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS1RZUEUgPSAiV0lGSSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXaWZpU3RhdGVUcmFja2VyIjsKIAotICAgIC8vIEV2ZW50IGxvZyB0YWdzIChtdXN0IGJlIGluIHN5bmMgd2l0aCBldmVudC1sb2ctdGFncykKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRMT0dfTkVUV09SS19TVEFURV9DSEFOR0VEID0gNTAwMjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCA9IDUwMDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19EUklWRVJfU1RBVEVfQ0hBTkdFRCA9IDUwMDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VEID0gNTAwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEID0gNTAwMjU7CisgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1UZWFyZG93blJlcXVlc3RlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVByaXZhdGVEbnNSb3V0ZVNldCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgbURlZmF1bHRHYXRld2F5QWRkciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtRGVmYXVsdFJvdXRlU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCi0gICAgLy8gRXZlbnQgY29kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OICAgICAgICAgICAgID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUICAgICAgICAgICAgID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VEICAgICAgICAgID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTkVUV09SS19TVEFURV9DSEFOR0VEICAgICAgICAgICAgID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSAgICAgICAgICAgID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fU1VDQ0VFREVEID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEICAgID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUE9MTF9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREhDUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCAgICAgICAgICAgICAgID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0RFRkVSUkVEX1JFQ09OTkVDVCAgICAgICAgICAgICAgICA9IDExOwotICAgIC8qKgotICAgICAqIFRoZSBkcml2ZXIgaXMgc3RhcnRlZCBvciBzdG9wcGVkLiBUaGUgb2JqZWN0IHdpbGwgYmUgdGhlIHN0YXRlOiB0cnVlIGZvcgotICAgICAqIHN0YXJ0ZWQsIGZhbHNlIGZvciBzdG9wcGVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9EUklWRVJfU1RBVEVfQ0hBTkdFRCAgICAgICAgICAgICAgPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfUEFTU1dPUkRfS0VZX01BWV9CRV9JTkNPUlJFQ1QgICAgID0gMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNUICA9IDE0OworICAgIHByaXZhdGUgTGlua1Byb3BlcnRpZXMgbUxpbmtQcm9wZXJ0aWVzOworICAgIHByaXZhdGUgTmV0d29ya0luZm8gbU5ldHdvcmtJbmZvOwogCi0gICAgLyoqCi0gICAgICogVGhlIGRyaXZlciBzdGF0ZSBpbmRpY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RBUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfSFVORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIC8qIEZvciBzZW5kaW5nIGV2ZW50cyB0byBjb25uZWN0aXZpdHkgc2VydmljZSBoYW5kbGVyICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1Dc0hhbmRsZXI7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVdpZmlTdGF0ZVJlY2VpdmVyOworICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwogCi0gICAgLyoqCi0gICAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9sbGluZyBmb3IgY29ubmVjdGlvbgotICAgICAqIHN0YXR1cyBpdGVtcyB0aGF0IGFyZSBub3Qgc2VudCB2aWEgYXN5bmNocm9ub3VzIGV2ZW50cy4KLSAgICAgKiBBbiBleGFtcGxlIGlzIFJTU0kgKHNpZ25hbCBzdHJlbmd0aCkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfU1RBVFVTX0lOVEVSVkFMX01TRUNTID0gMzAwMDsKKyAgICBwdWJsaWMgV2lmaVN0YXRlVHJhY2tlcigpIHsKKyAgICAgICAgbU5ldHdvcmtJbmZvID0gbmV3IE5ldHdvcmtJbmZvKENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJLCAwLCBORVRXT1JLVFlQRSwgIiIpOworICAgICAgICBtTGlua1Byb3BlcnRpZXMgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKIAotICAgIC8qKgotICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIHRoZSBXUEEgc3VwcGxpY2FudCBsb29wIGl0ZXJhdGlvbnMgYmVmb3JlIHdlCi0gICAgICogZGVjaWRlIHRoYXQgdGhlIGxvb3Agc2hvdWxkIGJlIHRlcm1pbmF0ZWQ6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUyA9IDQ7CisgICAgICAgIG1OZXR3b3JrSW5mby5zZXRJc0F2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIG1MaW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICBzZXRUZWFyZG93blJlcXVlc3RlZChmYWxzZSk7CisgICAgfQogCi0gICAgLyoqCi0gICAgICogV2hlbiBhIERJU0NPTk5FQ1QgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGRlZmVyIGhhbmRsaW5nIGl0IHRvCi0gICAgICogYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBESVNDT05ORUNUIGlzIGFib3V0IHRvCi0gICAgICogYmUgZm9sbG93ZWQgc2hvcnRseSBieSBhIENPTk5FQ1QgdG8gdGhlIHNhbWUgbmV0d29yayB3ZSB3ZXJlCi0gICAgICoganVzdCBjb25uZWN0ZWQgdG8uIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlcG9ydAotICAgICAqIHRoZSBuZXR3b3JrIGFzIGRvd24sIG5vciBkbyB3ZSB3YW50IHRvIHJlY29uZmlndXJlIHRoZSBuZXR3b3JrCi0gICAgICogaW50ZXJmYWNlLCBldGMuIElmIHdlIGdldCBhIENPTk5FQ1QgZXZlbnQgZm9yIGFub3RoZXIgbmV0d29yawotICAgICAqIHdpdGhpbiB0aGUgZGVsYXkgd2luZG93LCB3ZSBpbW1lZGlhdGVseSBoYW5kbGUgdGhlIHBlbmRpbmcKLSAgICAgKiBkaXNjb25uZWN0IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBDT05ORUNULjxwLz4KLSAgICAgKiBUaGUgZml2ZSBzZWNvbmQgZGVsYXkgaXMgY2hvc2VuIHNvbWV3aGF0IGFyYml0cmFyaWx5LCBidXQgaXMKLSAgICAgKiBtZWFudCB0byBjb3ZlciBtb3N0IG9mIHRoZSBjYXNlcyB3aGVyZSBhIERJU0NPTk5FQ1QvQ09OTkVDVAotICAgICAqIGhhcHBlbnMgdG8gYSBuZXR3b3JrLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT05ORUNUX0RFTEFZX01TRUNTID0gNTAwMDsKLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBzdXBwbGljYW50IGdvZXMgaWRsZSBhZnRlciB3ZSBkbyBhbiBleHBsaWNpdCBkaXNjb25uZWN0Ci0gICAgICogZm9sbG93aW5nIGEgREhDUCBmYWlsdXJlLCB3ZSBuZWVkIHRvIGtpY2sgdGhlIHN1cHBsaWNhbnQgaW50bwotICAgICAqIHRyeWluZyB0byBhc3NvY2lhdGUgd2l0aCBhY2Nlc3MgcG9pbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MgPSAyMDAwOwogCi0gICAgLyoqCi0gICAgICogV2hlbiB0aGUgc3VwcGxpY2FudCBkaXNjb25uZWN0cyBmcm9tIGFuIEFQIGl0IHNvbWV0aW1lcyBmb3JnZXRzCi0gICAgICogdG8gcmVzdGFydCBzY2FubmluZy4gIFdhaXQgdGhpcyBkZWxheSBiZWZvcmUgYXNraW5nIGl0IHRvIHN0YXJ0Ci0gICAgICogc2Nhbm5pbmcgKGluIGNhc2UgaXQgZm9yZ290KS4gIDE1IHNlYyBpcyB0aGUgc3RhbmRhcmQgZGVsYXkgYmV0d2VlbgotICAgICAqIHNjYW5zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLSUNLU1RBUlRfU0NBTk5JTkdfREVMQVlfTVNFQ1MgPSAxNTAwMDsKKyAgICBwdWJsaWMgdm9pZCBzZXRUZWFyZG93blJlcXVlc3RlZChib29sZWFuIGlzUmVxdWVzdGVkKSB7CisgICAgICAgIG1UZWFyZG93blJlcXVlc3RlZC5zZXQoaXNSZXF1ZXN0ZWQpOworICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSB3aWxsIHJldHJ5IGEgY29ubmVjdGlvbiB0byBhbiBhY2Nlc3MgcG9pbnQKLSAgICAgKiBmb3Igd2hpY2ggd2UgaGF2ZSBmYWlsZWQgaW4gYWNxdWlyaW5nIGFuIElQIGFkZHJlc3MgZnJvbSBESENQLiBBIHZhbHVlIG9mCi0gICAgICogTiBtZWFucyB0aGF0IHdlIHdpbGwgbWFrZSBOKzEgY29ubmVjdGlvbiBhdHRlbXB0cyBpbiBhbGwuCi0gICAgICogPHA+Ci0gICAgICogU2VlIHtAbGluayBTZXR0aW5ncy5TZWN1cmUjV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVH0uIFRoaXMgaXMgdGhlIGRlZmF1bHQKLSAgICAgKiB2YWx1ZSBpZiBhIFNldHRpbmdzIHZhbHVlIGlzIG5vdCBwcmVzZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9ESENQX1JFVFJJRVMgPSA5OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSSVZFUl9QT1dFUl9NT0RFX0FVVE8gPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUklWRVJfUE9XRVJfTU9ERV9BQ1RJVkUgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgV1BBIHN1cHBsaWNhbnQgbG9vcCBzdGF0ZSAodXNlZCB0byBkZXRlY3QgbG9vcGluZyBiZWhhdmlvcik6Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdXBwbGljYW50U3RhdGUgbVN1cHBsaWNhbnRMb29wU3RhdGUgPSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIFdQQSBzdXBwbGljYW50IGxvb3AgaXRlcmF0aW9uczoKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBzdXBwbGljYW50IHN0YXRlIGNoYW5nZXMuICBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0gICAgICogaWYgd2UndmUgcmVjZWl2ZWQgYW55IG5ldyBpbmZvIHNpbmNlIHdlIGZvdW5kIG91dCBpdCB3YXMgRElTQ09OTkVDVEVEIG9yCi0gICAgICogSU5BQ1RJVkUuICBJZiB3ZSBoYXZlbid0IGZvciBYIG1zLCB3ZSB0aGVuIHJlcXVlc3QgYSBzY2FuIC0gaXQgc2hvdWxkIGhhdmUKLSAgICAgKiBkb25lIHRoYXQgYXV0b21hdGljYWxseSwgYnV0IHNvbWV0aW1lcyBzb21lIGZpcm13YXJlIGRvZXMgbm90LgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzID0gMDsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgd2UgcmVjZWl2ZWQgYW4gZXZlbnQgdGhhdCB0aGF0IGEgcGFzc3dvcmQta2V5IG1heSBiZSBpbmNvcnJlY3QuCi0gICAgICogSWYgdGhlIG5leHQgaW5jb21pbmcgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQgaXMgRElTQ09OTkVDVCwKLSAgICAgKiBicm9hZGNhc3QgYSBtZXNzYWdlIHRoYXQgd2UgaGF2ZSBhIHBvc3NpYmxlIHBhc3N3b3JkIGVycm9yIGFuZCBkaXNhYmxlCi0gICAgICogdGhlIG5ldHdvcmsuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1QYXNzd29yZEtleU1heUJlSW5jb3JyZWN0ID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkgPSAyOwotCi0gICAgcHJpdmF0ZSBXaWZpTW9uaXRvciBtV2lmaU1vbml0b3I7Ci0gICAgcHJpdmF0ZSBXaWZpSW5mbyBtV2lmaUluZm87Ci0gICAgcHJpdmF0ZSBMaXN0PFNjYW5SZXN1bHQ+IG1TY2FuUmVzdWx0czsKLSAgICBwcml2YXRlIFdpZmlNYW5hZ2VyIG1XTTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVJcEFkZHJlc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PYnRhaW5pbmdJcEFkZHJlc3M7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Ub3JuRG93bkJ5Q29ubk1ncjsKLSAgICAvKioKLSAgICAgKiBBIERJU0NPTk5FQ1QgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQsIGJ1dCBwcm9jZXNzaW5nIGl0Ci0gICAgICogaXMgYmVpbmcgZGVmZXJyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0UGVuZGluZzsKLSAgICAvKioKLSAgICAgKiBBbiBvcGVyYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIGFzIGEgcmVzdWx0IG9mIHdoaWNoIHdlIGV4cGVjdCB0aGUgbmV4dCBldmVudAotICAgICAqIHdpbGwgYmUgYSBESVNDT05ORUNULgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdEV4cGVjdGVkOwotICAgIHByaXZhdGUgRGhjcEhhbmRsZXIgbURoY3BUYXJnZXQ7Ci0gICAgcHJpdmF0ZSBEaGNwSW5mbyBtRGhjcEluZm87Ci0gICAgcHJpdmF0ZSBpbnQgbUxhc3RTaWduYWxMZXZlbCA9IC0xOwotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0QnNzaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUxhc3RTc2lkOwotICAgIHByaXZhdGUgaW50IG1MYXN0TmV0d29ya0lkID0gLTE7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IG1SZWNvbm5lY3RDb3VudDsKLQotICAgIC8qIFRyYWNrcyBpZiBhbnkgbmV0d29yayBpbiB0aGUgY29uZmlndXJhdGlvbiBpcyBkaXNhYmxlZCAqLwotICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBtSXNBbnlOZXR3b3JrRGlzYWJsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0KLSAgICAvLyB1c2VkIHRvIHN0b3JlIHRoZSAobm9uLXBlcnNpc3RlZCkgbnVtIGRldGVybWluZWQgZHVyaW5nIGRldmljZSBib290IAotICAgIC8vIChmcm9tIG1jYyBvciBvdGhlciBwaG9uZSBpbmZvKSBiZWZvcmUgdGhlIGRyaXZlciBpcyBzdGFydGVkLgotICAgIHByaXZhdGUgaW50IG1OdW1BbGxvd2VkQ2hhbm5lbHMgPSAwOwotCi0gICAgLy8gVmFyaWFibGVzIHJlbGF0aW5nIHRvIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaWNvbiB0byBzaG93IGluIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uIFRoaXMgd2lsbCBhbHNvCi0gICAgICogYmUgdGhlIElEIG9mIHRoZSBOb3RpZmljYXRpb24gZ2l2ZW4gdG8gdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElDT05fTkVUV09SS1NfQVZBSUxBQkxFID0KLSAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9ub3RpZnlfd2lmaV9pbl9yYW5nZTsKLSAgICAvKioKLSAgICAgKiBXaGVuIGEgbm90aWZpY2F0aW9uIGlzIHNob3duLCB3ZSB3YWl0IHRoaXMgYW1vdW50IGJlZm9yZSBwb3NzaWJseSBzaG93aW5nIGl0IGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNldCB0aGUgc2V0dGluZyB0byBzaG93IHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25FbmFibGVkOwotICAgIC8qKgotICAgICAqIE9ic2VydmVzIHRoZSB1c2VyIHNldHRpbmcgdG8ga2VlcCB7QGxpbmsgI21Ob3RpZmljYXRpb25FbmFibGVkfSBpbiBzeW5jLgotICAgICAqLwotICAgIHByaXZhdGUgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlcjsKLSAgICAvKioKLSAgICAgKiBUaGUge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcygpfSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMgdmFsdWUgZm9yIHVzCi0gICAgICogdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluLgotICAgICAqLwotICAgIHByaXZhdGUgbG9uZyBtTm90aWZpY2F0aW9uUmVwZWF0VGltZTsKLSAgICAvKioKLSAgICAgKiBUaGUgTm90aWZpY2F0aW9uIG9iamVjdCBnaXZlbiB0byB0aGUgTm90aWZpY2F0aW9uTWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtTm90aWZpY2F0aW9uOwotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIG5vdGlmaWNhdGlvbiBpcyBiZWluZyBzaG93biwgYXMgc2V0IGJ5IHVzLiBUaGF0IGlzLCBpZiB0aGUKLSAgICAgKiB1c2VyIGNhbmNlbHMgdGhlIG5vdGlmaWNhdGlvbiwgd2Ugd2lsbCBub3QgcmVjZWl2ZSB0aGUgY2FsbGJhY2sgc28gdGhpcwotICAgICAqIHdpbGwgc3RpbGwgYmUgdHJ1ZS4gV2Ugb25seSBndWFyYW50ZWUgaWYgdGhpcyBpcyBmYWxzZSwgdGhlbiB0aGUKLSAgICAgKiBub3RpZmljYXRpb24gaXMgbm90IHNob3dpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Ob3RpZmljYXRpb25TaG93bjsKLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIGNvbnRpbnVvdXMgc2NhbnMgdGhhdCBtdXN0IG9jY3VyIGJlZm9yZSBjb25zaWRlciB0aGUKLSAgICAgKiBzdXBwbGljYW50IGluIGEgc2Nhbm5pbmcgc3RhdGUuIFRoaXMgYWxsb3dzIHN1cHBsaWNhbnQgdG8gYXNzb2NpYXRlIHdpdGgKLSAgICAgKiByZW1lbWJlcmVkIG5ldHdvcmtzIHRoYXQgYXJlIGluIHRoZSBzY2FuIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcgPSAzOwotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc2NhbnMgc2luY2UgdGhlIGxhc3QgbmV0d29yayBzdGF0ZSBjaGFuZ2UuIFdoZW4gdGhpcwotICAgICAqIGV4Y2VlZHMge0BsaW5rICNOVU1fU0NBTlNfQkVGT1JFX0FDVFVBTExZX1NDQU5OSU5HfSwgd2UgY29uc2lkZXIgdGhlCi0gICAgICogc3VwcGxpY2FudCB0byBhY3R1YWxseSBiZSBzY2FubmluZy4gV2hlbiB0aGUgbmV0d29yayBzdGF0ZSBjaGFuZ2VzIHRvCi0gICAgICogc29tZXRoaW5nIG90aGVyIHRoYW4gc2Nhbm5pbmcsIHdlIHJlc2V0IHRoaXMgdG8gMC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZTsKLSAgICAvKioKLSAgICAgKiBPYnNlcnZlcyB0aGUgc3RhdGljIElQIGFkZHJlc3Mgc2V0dGluZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXR0aW5nc09ic2VydmVyIG1TZXR0aW5nc09ic2VydmVyOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTY2FuTW9kZUFjdGl2ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZVJzc2lQb2xsaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNIaWdoUGVyZkVuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVBvd2VyTW9kZVJlZkNvdW50ID0gMDsKLSAgICBwcml2YXRlIGludCBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogT25lIG9mICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxFRH0sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9ESVNBQkxJTkd9LAotICAgICAqICAgICAgICAge0BsaW5rIFdpZmlNYW5hZ2VyI1dJRklfU1RBVEVfRU5BQkxFRH0sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9FTkFCTElOR30sCi0gICAgICogICAgICAgICB7QGxpbmsgV2lmaU1hbmFnZXIjV0lGSV9TVEFURV9VTktOT1dOfQotICAgICAqCi0gICAgICogZ2V0V2lmaVN0YXRlKCkgaXMgbm90IHN5bmNocm9uaXplZCB0byBtYWtlIHN1cmUgaXQncyBhbHdheXMgZmFzdCwKLSAgICAgKiBldmVuIHdoZW4gdGhlIGluc3RhbmNlIGxvY2sgaXMgaGVsZCBvbiBvdGhlciBzbG93IG9wZXJhdGlvbnMuCi0gICAgICogVXNlIGEgYXRvbWljIHZhcmlhYmxlIGZvciBzdGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbVdpZmlTdGF0ZSA9IG5ldyBBdG9taWNJbnRlZ2VyKFdJRklfU1RBVEVfVU5LTk9XTik7Ci0KLSAgICAvLyBXaS1GaSBydW4gc3RhdGVzOgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RBUlRJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfUlVOTklORyAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RPUFBJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVU5fU1RBVEVfU1RPUFBFRCAgPSA0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1SdW5TdGF0ZU5hbWVzW10gPSB7Ci0gICAgICAgICAgICAiU3RhcnRpbmciLAotICAgICAgICAgICAgIlJ1bm5pbmciLAotICAgICAgICAgICAgIlN0b3BwaW5nIiwKLSAgICAgICAgICAgICJTdG9wcGVkIgotICAgIH07Ci0gICAgcHJpdmF0ZSBpbnQgbVJ1blN0YXRlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJQmF0dGVyeVN0YXRzIG1CYXR0ZXJ5U3RhdHM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU2Nhbk9ubHk7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUJsdWV0b290aEEyZHA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBtSW50ZXJmYWNlTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzRG5zUHJvcE5hbWVzOwotICAgIHByaXZhdGUgUnVubmFibGUgbVJlbGVhc2VXYWtlTG9ja0NhbGxiYWNrOwotCi0gICAgLyoqCi0gICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1cHBsaWNhbnQgc3RhdGUKLSAgICAgKiBjaGFuZ2UgaW4gdGhlIFNUQVRFX0NIQU5HRSBldmVudCBtZXNzYWdlIHRoYXQgY29tZXMgZnJvbSB0aGUKLSAgICAgKiBXaWZpTW9uaXRvcgotICAgICAqIHRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgewotICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHRoaXMuQlNTSUQgPSBCU1NJRDsKLSAgICAgICAgICAgIHRoaXMubmV0d29ya0lkID0gbmV0d29ya0lkOwotICAgICAgICB9Ci0gICAgICAgIGludCBuZXR3b3JrSWQ7Ci0gICAgICAgIFN0cmluZyBCU1NJRDsKLSAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN0YXRlOworICAgIHB1YmxpYyBib29sZWFuIGlzVGVhcmRvd25SZXF1ZXN0ZWQoKSB7CisgICAgICAgIHJldHVybiBtVGVhcmRvd25SZXF1ZXN0ZWQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQSBzdHJ1Y3R1cmUgZm9yIHN1cHBseWluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbm5lY3Rpb24gaW4KLSAgICAgKiB0aGUgQ09OTkVDVEVEIGV2ZW50IG1lc3NhZ2UgdGhhdCBjb21lcyBmcm9tIHRoZSBXaWZpTW9uaXRvcgotICAgICAqIHRocmVhZC4KKyAgICAgKiBCZWdpbiBtb25pdG9yaW5nIHdpZmkgY29ubmVjdGl2aXR5CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHsKLSAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KERldGFpbGVkU3RhdGUgc3RhdGUsIFN0cmluZyBCU1NJRCwgaW50IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgdGhpcy5CU1NJRCA9IEJTU0lEOwotICAgICAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSBuZXR3b3JrSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgRGV0YWlsZWRTdGF0ZSBzdGF0ZTsKLSAgICAgICAgU3RyaW5nIEJTU0lEOwotICAgICAgICBpbnQgbmV0d29ya0lkOwotICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzdGFydE1vbml0b3JpbmcoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIHRhcmdldCkgeworICAgICAgICBtQ3NIYW5kbGVyID0gdGFyZ2V0OworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAKLSAgICBwdWJsaWMgV2lmaVN0YXRlVHJhY2tlcihDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIHRhcmdldCwgQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJRkksIDAsICJXSUZJIiwgIiIpOwotICAgICAgICAKLSAgICAgICAgbVdpZmlJbmZvID0gbmV3IFdpZmlJbmZvKCk7Ci0gICAgICAgIG1XaWZpTW9uaXRvciA9IG5ldyBXaWZpTW9uaXRvcih0aGlzKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncihmYWxzZSk7Ci0gICAgICAgIG1EaXNjb25uZWN0UGVuZGluZyA9IGZhbHNlOwotICAgICAgICBtU2NhblJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFNjYW5SZXN1bHQ+KCk7Ci0gICAgICAgIC8vIEFsbG9jYXRlIERIQ1AgaW5mbyBvYmplY3Qgb25jZSwgYW5kIGZpbGwgaXQgaW4gb24gZWFjaCByZXF1ZXN0Ci0gICAgICAgIG1EaGNwSW5mbyA9IG5ldyBEaGNwSW5mbygpOwotICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7CisgICAgICAgIG1XaWZpTWFuYWdlciA9IChXaWZpTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKTsKIAotICAgICAgICAvLyBTZXR0aW5nIGlzIGluIHNlY29uZHMKLSAgICAgICAgTk9USUZJQ0FUSU9OX1JFUEVBVF9ERUxBWV9NUyA9IFNldHRpbmdzLlNlY3VyZS5nZXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwgCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTkVUV09SS1NfQVZBSUxBQkxFX1JFUEVBVF9ERUxBWSwgOTAwKSAqIDEwMDBsOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciA9IG5ldyBOb3RpZmljYXRpb25FbmFibGVkU2V0dGluZ09ic2VydmVyKG5ldyBIYW5kbGVyKCkpOwotICAgICAgICBtTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlci5yZWdpc3RlcigpOwotCi0gICAgICAgIG1TZXR0aW5nc09ic2VydmVyID0gbmV3IFNldHRpbmdzT2JzZXJ2ZXIobmV3IEhhbmRsZXIoKSk7Ci0KLSAgICAgICAgbUludGVyZmFjZU5hbWUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgid2lmaS5pbnRlcmZhY2UiLCAidGl3bGFuMCIpOwotICAgICAgICBzRG5zUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICJkaGNwLiIgKyBtSW50ZXJmYWNlTmFtZSArICIuZG5zMSIsCi0gICAgICAgICAgICAiZGhjcC4iICsgbUludGVyZmFjZU5hbWUgKyAiLmRuczIiCi0gICAgICAgIH07Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdHMgPSBJQmF0dGVyeVN0YXRzLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiYmF0dGVyeWluZm8iKSk7Ci0KKyAgICAgICAgbVdpZmlTdGF0ZVJlY2VpdmVyID0gbmV3IFdpZmlTdGF0ZVJlY2VpdmVyKCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVdpZmlTdGF0ZVJlY2VpdmVyLCBmaWx0ZXIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2Q6IHNldHMgdGhlIHN1cHBsaWNhbnQgc3RhdGUgYW5kIGtlZXBzIHRoZSBuZXR3b3JrCi0gICAgICogaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgbmV3IHN0YXRlCisgICAgICogRGlzYWJsZSBjb25uZWN0aXZpdHkgdG8gYSBuZXR3b3JrCisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdXBwbGljYW50U3RhdGUgZ2V0U3VwcGxpY2FudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOworICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgeworICAgICAgICBtVGVhcmRvd25SZXF1ZXN0ZWQuc2V0KHRydWUpOworICAgICAgICBtV2lmaU1hbmFnZXIuc3RvcFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQga2VlcHMgdGhlIG5ldHdvcmsKLSAgICAgKiBpbmZvIHVwZGF0ZWQgKHN0cmluZyB2ZXJzaW9uKS4KLSAgICAgKiBAcGFyYW0gc3RhdGVOYW1lIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmV3IHN0YXRlCisgICAgICogUmUtZW5hYmxlIGNvbm5lY3Rpdml0eSB0byBhIG5ldHdvcmsgYWZ0ZXIgYSB7QGxpbmsgI3RlYXJkb3duKCl9LgorICAgICAqIFRPRE86IGRvIGF3YXkgd2l0aCByZXR1cm4gdmFsdWUgYWZ0ZXIgbWFraW5nIE1vYmlsZURhdGFTdGF0ZVRyYWNrZXIgYXN5bmMKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0U3VwcGxpY2FudFN0YXRlKFN0cmluZyBzdGF0ZU5hbWUpIHsKLSAgICAgICAgbVdpZmlJbmZvLnNldFN1cHBsaWNhbnRTdGF0ZShzdGF0ZU5hbWUpOwotICAgICAgICB1cGRhdGVOZXR3b3JrSW5mbygpOwotICAgICAgICBjaGVja1BvbGxUaW1lcigpOworICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKKyAgICAgICAgbVRlYXJkb3duUmVxdWVzdGVkLnNldChmYWxzZSk7CisgICAgICAgIG1XaWZpTWFuYWdlci5zdGFydFdpZmkoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogc2V0cyB0aGUgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGFza2VkIHRoZSBuZXR3b3JrIHRvIGJlIHRvcm4gZG93biAoYW5kIHNvIG9ubHkgdGhlIGNvbm5lY3Rpb24KLSAgICAgKiBtYW5hZ2VyIGNhbiBzZXQgaXQgdXAgYWdhaW4pLgotICAgICAqIG5ldHdvcmsgaW5mbyB1cGRhdGVkLgotICAgICAqIEBwYXJhbSBmbGFnIHtAY29kZSB0cnVlfSBpZiBleHBsaWNpdGx5IGRpc2FibGVkLgorICAgICAqIFR1cm4gdGhlIHdpcmVsZXNzIHJhZGlvIG9mZiBmb3IgYSBuZXR3b3JrLgorICAgICAqIEBwYXJhbSB0dXJuT24ge0Bjb2RlIHRydWV9IHRvIHR1cm4gdGhlIHJhZGlvIG9uLCB7QGNvZGUgZmFsc2V9CisgICAgICogVE9ETzogZG8gYXdheSB3aXRoIHJldHVybiB2YWx1ZSBhZnRlciBtYWtpbmcgTW9iaWxlRGF0YVN0YXRlVHJhY2tlciBhc3luYwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUb3JuRG93bkJ5Q29ubk1ncihib29sZWFuIGZsYWcpIHsKLSAgICAgICAgbVRvcm5Eb3duQnlDb25uTWdyID0gZmxhZzsKLSAgICAgICAgdXBkYXRlTmV0d29ya0luZm8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUgRE5TIHNlcnZlcnMgYXZhaWxhYmxlIGZvciB0aGUgV0xBTgotICAgICAqIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIEROUyBhZGRyZXNzZXMsIHdpdGggbm8gaG9sZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVTZXJ2ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZVNlcnZlckxpc3Qoc0Ruc1Byb3BOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIG91ciBXTEFOIG5ldHdvcmsgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2Ygb3VyIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0Y3AgYnVmZmVyIHNpemVzCi0gICAgICogZm9yIHRoaXMgbmV0d29yay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRjcEJ1ZmZlclNpemVzUHJvcE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAibmV0LnRjcC5idWZmZXJzaXplLndpZmkiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZygpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IGEgaGFuZGxlIG9uIHRoZSBXaWZpTWFuYWdlci4gVGhpcyBjYW5ub3QgYmUgZG9uZSBpbiBvdXIKLSAgICAgICAgICogY29uc3RydWN0b3IsIGJlY2F1c2UgdGhlIFdpZmkgc2VydmljZSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCi0gICAgICAgICAqLwotICAgICAgICBtV00gPSAoV2lmaU1hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJRklfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFdmVudExvb3AoKSB7Ci0gICAgICAgIG1XaWZpTW9uaXRvci5zdGFydE1vbml0b3JpbmcoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgeworICAgICAgICBtV2lmaU1hbmFnZXIuc2V0V2lmaUVuYWJsZWQodHVybk9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzEsMjE3MiArMTI5LDExOCBAQAogICAgICAqIHVuYXZhaWxhYmxlLgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFdpLUZpIGNvbm5lY3Rpb25zIGFyZSBwb3NzaWJsZQogICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogTmVlZCB0byBhbHNvIGxvb2sgYXQgc2NhbiByZXN1bHRzIHRvIHNlZSB3aGV0aGVyIHdlJ3JlCi0gICAgICAgICAqIGluIHJhbmdlIG9mIGFueSBhY2Nlc3MgcG9pbnRzLiBJZiB3ZSBoYXZlIHNjYW4gcmVzdWx0cyB0aGF0Ci0gICAgICAgICAqIGFyZSBubyBtb3JlIHRoYW4gTiBzZWNvbmRzIG9sZCwgdXNlIHRob3NlLCBvdGhlcndpc2UsIGluaXRpYXRlCi0gICAgICAgICAqIGEgc2NhbiBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdHMuIFRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0gICAgICAgICAqIGFsbG93IG1vYmlsZSB0byBiZSB0aGUgcHJlZmVycmVkIG5ldHdvcmsuCi0gICAgICAgICAqLwotICAgICAgICBTdXBwbGljYW50U3RhdGUgc3VwcFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICByZXR1cm4gc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEICYmCi0gICAgICAgICAgICAgICAgc3VwcFN0YXRlICE9IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSAmJgotICAgICAgICAgICAgICAgIChtVG9ybkRvd25CeUNvbm5NZ3IgfHwgIWlzRHJpdmVyU3RvcHBlZCgpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mby5pc0F2YWlsYWJsZSgpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiBUaGVyZSBhcmUgY3VycmVudGx5IG5vIGRlZmluZWQgV2ktRmkgc3VidHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROZXR3b3JrU3VidHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZDogdXBkYXRlcyB0aGUgbmV0d29yayBpbmZvIG9iamVjdCB0byBrZWVwIGl0IGluIHN5bmMgd2l0aAotICAgICAqIHRoZSBXaS1GaSBzdGF0ZSB0cmFja2VyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOZXR3b3JrSW5mbygpIHsKLSAgICAgICAgbU5ldHdvcmtJbmZvLnNldElzQXZhaWxhYmxlKGlzQXZhaWxhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgZm9yIGRhdGEuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayBTdXBwbGljYW50U3RhdGV9IGlzCi0gICAgICoge0BsaW5rIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlI0NPTVBMRVRFRCBDT01QTEVURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvbkNvbXBsZXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoZSBXaS1GaSBjb25uZWN0aW9uIGhhcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQgYW4gSVAgYWRkcmVzcy4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgV2ktRmkgY29ubmVjdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCBhbiBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0lwQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIG1IYXZlSXBBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCBhIHVzZXItZW50ZXJlZCBwYXNzd29yZCBrZXkKLSAgICAgKiBtYXkgYmUgaW5jb3JyZWN0IChpLmUuLCBjYXVzZWQgYXV0aGVudGljYXRpb24gdG8gZmFpbCkuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlQYXNzd29yZEtleU1heUJlSW5jb3JyZWN0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1BBU1NXT1JEX0tFWV9NQVlfQkVfSU5DT1JSRUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50Ci0gICAgICogZGFlbW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3VwcGxpY2FudENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBzdXBwbGljYW50Ci0gICAgICogaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtIG5ldHdvcmtJZCB0aGUgY29uZmlndXJlZCBuZXR3b3JrIG9uIHdoaWNoIHRoZSBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQKLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyB7QGNvZGUgU3VwcGxpY2FudFN0YXRlfQotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoaW50IG5ldHdvcmtJZCwgU3RyaW5nIEJTU0lELCBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigKLSAgICAgICAgICAgIHRoaXMsIEVWRU5UX1NVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgIG5ldyBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQobmV0d29ya0lkLCBCU1NJRCwgbmV3U3RhdGUpKTsKLSAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIHRyYWNrZXIgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3RhdGUgb2YgV2lmaSBjb25uZWN0aXZpdHkKLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiBAcGFyYW0gbmV0d29ya0lkIHRoZSBjb25maWd1cmVkIG5ldHdvcmsgb24gd2hpY2ggdGhlIHN0YXRlIGNoYW5nZSBvY2N1cnJlZAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IG5ldHdvcmsgc3RhdGUKLSAgICAgKiBAcGFyYW0gQlNTSUQgd2hlbiB0aGUgbmV3IHN0YXRlIGlzIHtAbGluayBEZXRhaWxlZFN0YXRlI0NPTk5FQ1RFRAotICAgICAqIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUuQ09OTkVDVEVEfSwKLSAgICAgKiB0aGlzIGlzIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgYWNjZXNzIHBvaW50LiBPdGhlcndpc2UsIGl0Ci0gICAgICogaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHZvaWQgbm90aWZ5U3RhdGVDaGFuZ2UoRGV0YWlsZWRTdGF0ZSBuZXdTdGF0ZSwgU3RyaW5nIEJTU0lELCBpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oCi0gICAgICAgICAgICB0aGlzLCBFVkVOVF9ORVRXT1JLX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICBuZXcgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0KG5ld1N0YXRlLCBCU1NJRCwgbmV0d29ya0lkKSk7Ci0gICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIHRoZSB0cmFja2VyIGEgbm90aWZpY2F0aW9uIHRoYXQgYSBzY2FuIGhhcyBjb21wbGV0ZWQsIGFuZCByZXN1bHRzCi0gICAgICogYXJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVNjYW5SZXN1bHRzQXZhaWxhYmxlKCkgewotICAgICAgICAvLyByZXNldCB0aGUgc3VwcGxpY2FudCdzIGhhbmRsaW5nIG9mIHNjYW4gcmVzdWx0cyB0byAibm9ybWFsIiBtb2RlCi0gICAgICAgIHNldFNjYW5SZXN1bHRIYW5kbGluZyhTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgIHNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfU0NBTl9SRVNVTFRTX0FWQUlMQUJMRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHdlIGNhbiBubyBsb25nZXIgY29tbXVuaWNhdGUgd2l0aAotICAgICAqIHRoZSBzdXBwbGljYW50IGRhZW1vbi4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeVN1cHBsaWNhbnRMb3N0KCkgewotICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKEVWRU5UX1NVUFBMSUNBTlRfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotCi0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RvcHBlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RPUFBFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGJlZW4gcmVzdGFydGVkIGFmdGVyCi0gICAgICogaGF2aW5nIGJlZW4gc3RvcHBlZC4KLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeURyaXZlclN0YXJ0ZWQoKSB7Ci0gICAgICAgIC8vIFNlbmQgYSBkcml2ZXIgc3RhcnRlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfU1RBUlRFRCwgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCB0aGUgdHJhY2tlciBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBXaS1GaSBkcml2ZXIgaGFzIGh1bmcgYW5kIG5lZWRzIHJlc3RhcnRpbmcuCi0gICAgICovCi0gICAgdm9pZCBub3RpZnlEcml2ZXJIdW5nKCkgewotICAgICAgICAvLyBTZW5kIGEgZHJpdmVyIGhhbmdlZCBtZXNzYWdlIHRvIG91ciBoYW5kbGVyCi0gICAgICAgIE1lc3NhZ2Uub2J0YWluKHRoaXMsIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VELCBEUklWRVJfSFVORywgMCkuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnRlcnZhbCB0aW1lciBmb3IgcG9sbGluZyBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICogdGhhdCBpcyBub3QgZGVsaXZlcmVkIGFzeW5jaHJvbm91c2x5LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tQb2xsVGltZXIoKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgJiYKLSAgICAgICAgICAgICAgICBtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCAmJgotICAgICAgICAgICAgICAgICFoYXNNZXNzYWdlcyhFVkVOVF9QT0xMX0lOVEVSVkFMKSkgewotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZURlbGF5ZWQoRVZFTlRfUE9MTF9JTlRFUlZBTCwgUE9MTF9TVEFUVVNfSU5URVJWQUxfTVNFQ1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogbVJ1blN0YXRlIGlzIG5vdCBzeW5jaHJvbml6ZWQgaW4gc29tZSBwbGFjZXMKLSAgICAgKiBhZGRyZXNzIHRoaXMgYXMgcGFydCBvZiByZS1hcmNoaXRlY3QuCi0gICAgICoKLSAgICAgKiBUT0RPOiBXZSBhcmUgZXhwb3NpbmcgYW4gYWRkaXRpb25hbCBwdWJsaWMgc3luY2hyb25pemVkIGNhbGwKLSAgICAgKiBmb3IgYSB3YWtlbG9jayBvcHRpbWl6YXRpb24gaW4gV2lmaVNlcnZpY2UuIFJlbW92ZSBpdAotICAgICAqIHdoZW4gd2UgaGFuZGxlIHRoZSB3YWtlbG9jayBpbiBDb25uZWN0aXZpdHlTZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0RyaXZlclN0b3BwZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUT1BQRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90ZVJ1blN0YXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlSdW5uaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdHMubm90ZVdpZmlTdG9wcGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcnVuIHN0YXRlIHRvIGVpdGhlciAibm9ybWFsIiBvciAic2Nhbi1vbmx5Ii4KLSAgICAgKiBAcGFyYW0gc2Nhbk9ubHlNb2RlIHRydWUgaWYgdGhlIG5ldyBtb2RlIHNob3VsZCBiZSBzY2FuLW9ubHkuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5Pbmx5TW9kZShib29sZWFuIHNjYW5Pbmx5TW9kZSkgewotICAgICAgICAvLyBkbyBub3RoaW5nIHVubGVzcyBzY2FuLW9ubHkgbW9kZSBpcyBjaGFuZ2luZwotICAgICAgICBpZiAobUlzU2Nhbk9ubHkgIT0gc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICBpbnQgc2NhblR5cGUgPSAoc2Nhbk9ubHlNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgU1VQUExfU0NBTl9IQU5ETElOR19MSVNUX09OTFkgOiBTVVBQTF9TQ0FOX0hBTkRMSU5HX05PUk1BTCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU2Nhbi1vbmx5IG1vZGUgY2hhbmdpbmcgdG8gIiArIHNjYW5Pbmx5TW9kZSArICIgc2NhblR5cGU9IiArIHNjYW5UeXBlKTsKLSAgICAgICAgICAgIGlmIChzZXRTY2FuUmVzdWx0SGFuZGxpbmcoc2NhblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk9ubHkgPSBzY2FuT25seU1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbk9ubHlNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgc3VzcGVuZCBtb2RlIG9wdGltaXphdGlvbnMuIFRoZXNlIGluY2x1ZGU6Ci0gICAgICogLSBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICogLSB0dXJuIG9mZiByb2FtaW5nCi0gICAgICogLSBEVElNIHNldHRpbmdzCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHRoZSBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBhcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMgb3B0aW1pemF0aW9ucyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEZvciBleGFtcGxlLCBXaWZpTG9jayBjYW4ga2VlcCBzdXNwZW5kIG9wdGltaXphdGlvbnMgZGlzYWJsZWQKLSAgICAgKiBvciB0aGUgdXNlciBzZXR0aW5nICh3aWZpIG5ldmVyIHNsZWVwcykgY2FuIGtlZXAgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogZGlzYWJsZWQuIEFzIGxvbmcgYXMgb25lIGVudGl0eSB3YW50cyBpdCBkaXNhYmxlZCwgaXQgc2hvdWxkIHN0YXkKLSAgICAgKiB0aGF0IHdheQotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBvcHRpbWl6YXRpb25zIG5lZWQgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyhib29sZWFuIGVuYWJsZWQpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHN1c3BlbmQgb3B0aW1pemF0aW9uIGVuYWJsZQotICAgICAgICAgKiBvciBkaXNhYmxlIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5hYmxlZCkgewotICAgICAgICAgICAgbU9wdGltaXphdGlvbnNEaXNhYmxlZFJlZkNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQtLTsKLSAgICAgICAgICAgIGlmIChtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBLZWVwIHJlZmNvdW50IGZyb20gYmVjb21pbmcgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgICAgICBtT3B0aW1pemF0aW9uc0Rpc2FibGVkUmVmQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFN1c3BlbmRPcHRpbWl6YXRpb25zQ29tbWFuZChlbmFibGVkKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCBoaWdoIHBlcmZvcm1hbmNlIG1vZGUgb2Ygb3BlcmF0aW9uLiBUaGlzIHdvdWxkIG1lYW4KLSAgICAgKiB1c2UgYWN0aXZlIHBvd2VyIG1vZGUgYW5kIGRpc2FibGUgc3VzcGVuZCBvcHRpbWl6YXRpb25zCi0gICAgICogQHBhcmFtIGVuYWJsZWQgdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SGlnaFBlcmZNb2RlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAobUlzSGlnaFBlcmZFbmFibGVkICE9IGVuYWJsZWQpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSk7Ci0gICAgICAgICAgICAgICAgc2V0U3VzcGVuZE1vZGVPcHRpbWl6YXRpb25zKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKERSSVZFUl9QT1dFUl9NT0RFX0FVVE8pOwotICAgICAgICAgICAgICAgIHNldFN1c3BlbmRNb2RlT3B0aW1pemF0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICBMb2cuZChUQUcsImhpZ2ggcGVyZm9ybWFuY2UgbW9kZTogIiArIGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJc0JsdWV0b290aFBsYXlpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nID0gZmFsc2U7Ci0gICAgICAgIFNldDxCbHVldG9vdGhEZXZpY2U+IGNvbm5lY3RlZCA9IG1CbHVldG9vdGhBMmRwLmdldENvbm5lY3RlZFNpbmtzKCk7Ci0KLSAgICAgICAgZm9yIChCbHVldG9vdGhEZXZpY2UgZGV2aWNlIDogY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aEEyZHAuZ2V0U2lua1N0YXRlKGRldmljZSkgPT0gQmx1ZXRvb3RoQTJkcC5TVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgaXNCbHVldG9vdGhQbGF5aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRCbHVldG9vdGhTY2FuTW9kZShpc0JsdWV0b290aFBsYXlpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVJzc2lQb2xsaW5nKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtRW5hYmxlUnNzaVBvbGxpbmcgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtRW5hYmxlUnNzaVBvbGxpbmcgPSBlbmFibGU7Ci0gICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgcmVsZWFzZSB0aGUgd2FrZWxvY2sgaW4gV2lmaVNlcnZpY2UKLSAgICAgKiB1c2luZyBhIHRpbWVyLgotICAgICAqCi0gICAgICogVE9ETzoKLSAgICAgKiBSZWxlYXNpbmcgd2FrZWxvY2sgdXNpbmcgYm90aCB0aW1lciBhbmQKLSAgICAgKiBhIGNhbGwgZnJvbSBDb25uZWN0aXZpdHlTZXJ2aWNlIHJlcXVpcmVzCi0gICAgICogYSByZXRoaW5rLiBXZSBoYWQgcHJvYmxlbXMgd2hlcmUgV2lmaVNlcnZpY2UKLSAgICAgKiBjb3VsZCBrZWVwIGEgd2FrZWxvY2sgZm9yZXZlciBpZiB3ZSBkZWxldGUKLSAgICAgKiBtZXNzYWdlcyBpbiB0aGUgYXN5bmNocm9ub3VzIGNhbGwKLSAgICAgKiBmcm9tIENvbm5lY3Rpdml0eVNlcnZpY2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlV2FrZUxvY2soKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2tzIHRoZSBXUEEgc3VwcGxpY2FudCBzdGF0ZXMgdG8gZGV0ZWN0ICJsb29wIiBzaXR1YXRpb25zLgotICAgICAqIEBwYXJhbSBuZXdTdXBwbGljYW50U3RhdGUgVGhlIG5ldyBXUEEgc3VwcGxpY2FudCBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpY2FudCBsb29wIHNob3VsZCBiZSBzdG9wcGVkCi0gICAgICogYW5kIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGNvbnRpbnVlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBsaWNhbnRMb29waW5nKFN1cHBsaWNhbnRTdGF0ZSBuZXdTdXBwbGljYW50U3RhdGUpIHsKLSAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORy5vcmRpbmFsKCkgPD0gbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKQotICAgICAgICAgICAgJiYgbmV3U3VwcGxpY2FudFN0YXRlLm9yZGluYWwoKSA8IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQub3JkaW5hbCgpKSB7Ci0gICAgICAgICAgICBpZiAobVN1cHBsaWNhbnRMb29wU3RhdGUgIT0gbmV3U3VwcGxpY2FudFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZS5vcmRpbmFsKCkgPCBtU3VwcGxpY2FudExvb3BTdGF0ZS5vcmRpbmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKyttTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TdXBwbGljYW50TG9vcFN0YXRlID0gbmV3U3VwcGxpY2FudFN0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG5ld1N1cHBsaWNhbnRTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXNldFN1cHBsaWNhbnRMb29wU3RhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtTnVtU3VwcGxpY2FudExvb3BJdGVyYXRpb25zID49IE1BWF9TVVBQTElDQU5UX0xPT1BfSVRFUkFUSU9OUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhlIFdQQSBzdXBwbGljYW50IGxvb3Agc3RhdGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0U3VwcGxpY2FudExvb3BTdGF0ZSgpIHsKLSAgICAgICAgbU51bVN1cHBsaWNhbnRMb29wSXRlcmF0aW9ucyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBJbnRlbnQgaW50ZW50OwotCi0gICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9DT05ORUNUSU9OOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9SVU5OSU5HOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGNoZWNrVXNlU3RhdGljSXAoKTsKLSAgICAgICAgICAgICAgICAvKiBSZXNldCBub3RpZmljYXRpb24gc3RhdGUgb24gbmV3IGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICByZXNldE5vdGlmaWNhdGlvblRpbWVyKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBESENQIHJlcXVlc3RzIGFyZSBibG9ja2luZywgc28gcnVuIHRoZW0gaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSGFuZGxlclRocmVhZCBkaGNwVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkRIQ1AgSGFuZGxlciBUaHJlYWQiKTsKLSAgICAgICAgICAgICAgICBkaGNwVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbURoY3BUYXJnZXQgPSBuZXcgRGhjcEhhbmRsZXIoZGhjcFRocmVhZC5nZXRMb29wZXIoKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbUlzU2Nhbk1vZGVBY3RpdmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Jc0hpZ2hQZXJmRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1PcHRpbWl6YXRpb25zRGlzYWJsZWRSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTW9kZVJlZkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBtVG9ybkRvd25CeUNvbm5NZ3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTGFzdFNzaWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpOwotICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdXBwbFN0YXRlID0gbVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBNQUMgYWRkcmVzcyBpc24ndCBnb2luZyB0byBjaGFuZ2UsIHNvIGp1c3QgcmVxdWVzdCBpdAotICAgICAgICAgICAgICAgICAqIG9uY2UgaGVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWFjYWRkciA9IGdldE1hY0FkZHJlc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtYWNhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE1hY0FkZHJlc3MobWFjYWRkcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDb25uZWN0aW9uIHRvIHN1cHBsaWNhbnQgZXN0YWJsaXNoZWQsIHN0YXRlPSIgKwotICAgICAgICAgICAgICAgICAgICBzdXBwbFN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBzdXBwbGljYW50IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDJdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAxLSAwXSBDb25uZWN0ZWQgdG8gc3VwcGxpY2FudCAoMSksIGRpc2Nvbm5lY3RlZCBmcm9tIHN1cHBsaWNhbnQgKDApICwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgIG9yIHN1cHBsaWNhbnQgZGllZCAoMikKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX1NVUFBMSUNBTlRfQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELCAxKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFRoZSBDT01QTEVURUQgc3RhdGUgY2hhbmdlIGZyb20gdGhlIHN1cHBsaWNhbnQgbWF5IGhhdmUgb2NjdXJyZWQKLSAgICAgICAgICAgICAgICAgKiBpbiBiZXR3ZWVuIHBvbGxpbmcgZm9yIHN1cHBsaWNhbnQgYXZhaWxhYmlsaXR5LCBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAgICAgICogd2UgZGlkbid0IHBlcmZvcm0gYSBESENQIHJlcXVlc3QgdG8gZ2V0IGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHN1cHBsU3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkNPTVBMRVRFRCkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gbVdpZmlJbmZvLmdldEJTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0U3NpZCA9IG1XaWZpSW5mby5nZXRTU0lEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmlzU3lzdGVtUmVhZHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNVUFBMSUNBTlRfQ09OTkVDVElPTl9DSEFOR0VfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX1NVUFBMSUNBTlRfQ09OTkVDVEVELCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmIG1IYXZlSXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoV2lmaUluZm8uZ2V0RGV0YWlsZWRTdGF0ZU9mKHN1cHBsU3RhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaWx0ZXIgb3V0IG11bHRpY2FzdCBwYWNrZXRzLiBUaGlzIHNhdmVzIGJhdHRlcnkgcG93ZXIsIHNpbmNlCi0gICAgICAgICAgICAgICAgICogdGhlIENQVSBkb2Vzbid0IGhhdmUgdG8gc3BlbmQgdGltZSBwcm9jZXNzaW5nIHBhY2tldHMgdGhhdAotICAgICAgICAgICAgICAgICAqIGFyZSBnb2luZyB0byBlbmQgdXAgYmVpbmcgdGhyb3duIGF3YXkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbVdNLmluaXRpYWxpemVNdWx0aWNhc3RGaWx0ZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoQTJkcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhBMmRwID0gbmV3IEJsdWV0b290aEEyZHAobUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGVja0lzQmx1ZXRvb3RoUGxheWluZygpOwotCi0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGlzIGFmdGVyIHRoZSBzdXBwbGljYW50IGlzIGFsaXZlCi0gICAgICAgICAgICAgICAgc2V0TnVtQWxsb3dlZENoYW5uZWxzKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVZFTlRfU1VQUExJQ0FOVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgICAgIG5vdGVSdW5TdGF0ZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGllZCA9IG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxFRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9ESVNBQkxJTkc7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN1cHBsaWNhbnQgZGllZCB1bmV4cGVjdGVkbHkiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiQ29ubmVjdGlvbiB0byBzdXBwbGljYW50IGxvc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgc3VwcGxpY2FudCBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSAyXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgMS0gMF0gQ29ubmVjdGVkIHRvIHN1cHBsaWNhbnQgKDEpLCBkaXNjb25uZWN0ZWQgZnJvbSBzdXBwbGljYW50ICgwKSAsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICBvciBzdXBwbGljYW50IGRpZWQgKDIpCi0gICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwgZGllZCA/IDIgOiAwKTsKLSAgICAgICAgICAgICAgICBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGllZCkgewotICAgICAgICAgICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXaGVuIHN1cHBsaWNhbnQgZGllcywga2lsbCB0aGUgREhDUCB0aHJlYWQKLSAgICAgICAgICAgICAgICBpZiAobURoY3BUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtRGhjcFRhcmdldC5nZXRMb29wZXIoKS5xdWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQucmVtb3ZlU3RpY2t5QnJvYWRjYXN0KG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuU1VQUExJQ0FOVF9DT05ORUNUSU9OX0NIQU5HRV9BQ1RJT04pOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfU1VQUExJQ0FOVF9DT05ORUNURUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuRElTQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUoU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChkaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1XTS5zZXRXaWZpRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX01BWUJFX1NUQVJUX1NDQU5fUE9TVF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpZiB3ZSBoYXZlbid0IGdvdHRlbiBhIG5ldyBzdXBwbGljYW50IHN0YXR1cyBzaW5jZSB0aGUgdGltZXIKLSAgICAgICAgICAgICAgICAvLyBzdGFydGVkCi0gICAgICAgICAgICAgICAgaWYgKG1OdW1TdXBwbGljYW50U3RhdGVDaGFuZ2VzID09IG1zZy5hcmcxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW4oZmFsc2UpOyAvLyBkbyBhIHBhc3NpdmUgc2NhbgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgbU51bVN1cHBsaWNhbnRTdGF0ZUNoYW5nZXMrKzsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGVDaGFuZ2VSZXN1bHQgc3VwcGxpY2FudFN0YXRlUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgKFN1cHBsaWNhbnRTdGF0ZUNoYW5nZVJlc3VsdCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgbmV3U3RhdGUgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQuc3RhdGU7Ci0gICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIGN1cnJlbnRTdGF0ZSA9IG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFdpLUZpIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDZdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyA1LSAwXSBTdXBwbGljYW50IHN0YXRlIG9yZGluYWwgKGFzIGRlZmluZWQgYnkgU3VwcGxpY2FudFN0YXRlKQotICAgICAgICAgICAgICAgIGludCBldmVudExvZ1BhcmFtID0gKG5ld1N0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLQotICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cudihUQUcsICJDaGFuZ2luZyBzdXBwbGljYW50IHN0YXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudFN0YXRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9PT4gIiArIG5ld1N0YXRlKTsKLQotICAgICAgICAgICAgICAgIGludCBuZXR3b3JrSWQgPSBzdXBwbGljYW50U3RhdGVSZXN1bHQubmV0d29ya0lkOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhlIFN1cHBsaWNhbnRTdGF0ZSBCU1NJRCB2YWx1ZSBpcyB2YWxpZCBpbiBBU1NPQ0lBVElORyBzdGF0ZSBvbmx5LgotICAgICAgICAgICAgICAgICAqIFRoZSBOZXR3b3JrU3RhdGUgQlNTSUQgdmFsdWUgY29tZXMgdXBvbiBhIHN1Y2Nlc3NmdWwgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3VwcGxpY2FudFN0YXRlUmVzdWx0LnN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdEJzc2lkID0gc3VwcGxpY2FudFN0YXRlUmVzdWx0LkJTU0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBkaXNjb25uZWN0IG9yIGluYWN0aXZlIHdlIG5lZWQgdG8gc3RhcnQgb3VyCi0gICAgICAgICAgICAgICAgICogd2F0Y2hkb2cgdGltZXIgdG8gc3RhcnQgYSBzY2FuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTkFDVElWRSkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQob2J0YWluTWVzc2FnZShFVkVOVF9NQVlCRV9TVEFSVF9TQ0FOX1BPU1RfRElTQ09OTkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3VwcGxpY2FudFN0YXRlQ2hhbmdlcywgMCksIEtJQ0tTVEFSVF9TQ0FOTklOR19ERUxBWV9NU0VDUyk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIERpZCB3ZSBnZXQgdG8gRElTQ09OTkVDVEVEIHN0YXRlIGR1ZSB0byBhbgotICAgICAgICAgICAgICAgICAqIGF1dGhlbnRpY2F0aW9uIChwYXNzd29yZCkgZmFpbHVyZT8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIGZhaWxlZFRvQXV0aGVudGljYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9BdXRoZW50aWNhdGUgPSBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBhc3N3b3JkS2V5TWF5QmVJbmNvcnJlY3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogS2VlcCB0cmFjayBvZiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBhbmQgY2hlY2sgaWYgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICogZGlzYWJsZSB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3VwcGxpY2FudExvb3BpbmcobmV3U3RhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCBXUEEgc3VwcGxpY2FudCBsb29wIGFuZCBkaXNhYmxlIG5ldHdvcmsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZE5ldHdvcmsgPSB3aWZpTWFuYWdlckRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgbG9vcCBzdGF0ZSBpZiB3ZSBkaXNhYmxlZCB0aGUgbmV0d29yawotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzZXRTdXBwbGljYW50TG9vcFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBjdXJyZW50U3RhdGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuRElTQ09OTkVDVEVEICYmIGlzRHJpdmVyU3RvcHBlZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRTdXBwbGljYW50U3RhdGUobmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgbmV3RGV0YWlsZWRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVjb25uZWN0TXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1QsIG1MYXN0QnNzaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1NjYW5Pbmx5IHx8IG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5JRExFOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXRhaWxlZFN0YXRlID0gRGV0YWlsZWRTdGF0ZS5GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShuZXdEZXRhaWxlZFN0YXRlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBhc3NvY2lhdGVkIHdpdGggYSBuZXR3b3JrIChuZXR3b3JrSWQgIT0gLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzdW1lIHdlIHJlYWNoZWQgdGhpcyBzdGF0ZSBiZWNhdXNlIG9mIGEgZmFpbGVkIGF0dGVtcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGFjcXVpcmUgYW4gSVAgYWRkcmVzcywgYW5kIGF0dGVtcHQgYW5vdGhlciBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgSVAgYWRkcmVzcyBhY3F1aXNpdGlvbiBpbiBSRUNPTk5FQ1RfREVMQVlfTVNFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1pbGxpc2Vjb25kcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdW5TdGF0ZSA9PSBSVU5fU1RBVEVfUlVOTklORyAmJiAhbUlzU2Nhbk9ubHkgJiYgbmV0d29ya0lkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VEZWxheWVkKHJlY29ubmVjdE1zZywgUkVDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEcml2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVEFSVElORyAmJiAhbUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RyaXZlclN0b3BwZWQoKSB8fCBtRGlzY29ubmVjdEV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSAhPSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEICYmICFtRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSWdub3JlIGV2ZW50cyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgY29ubmVjdGl2aXR5IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjaCBhcyBXUEEgcmVrZXlpbmcgb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY3VycmVudFN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5DT01QTEVURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkFTU09DSUFUSU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5GT1VSX1dBWV9IQU5EU0hBS0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkdST1VQX0hBTkRTSEFLRSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2YobmV3U3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0RXhwZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FV19TVEFURSwgKFBhcmNlbGFibGUpbmV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkVG9BdXRoZW50aWNhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0NBTF9MT0dEKSBMb2cuZChUQUcsICJGYWlsZWQgdG8gYXV0aGVudGljYXRlLCBkaXNhYmxpbmcgbmV0d29yayAiICsgbmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZmlNYW5hZ2VyRGlzYWJsZU5ldHdvcmsobmV0d29ya0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9TVVBQTElDQU5UX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVSUk9SX0FVVEhFTlRJQ0FUSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX05FVFdPUktfU1RBVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEVhY2ggQ09OTkVDVCBvciBESVNDT05ORUNUIGdlbmVyYXRlcyBhIHBhaXIgb2YgZXZlbnRzLgotICAgICAgICAgICAgICAgICAqIE9uZSBpcyBhIHN1cHBsaWNhbnQgc3RhdGUgY2hhbmdlIGV2ZW50LCBhbmQgdGhlIG90aGVyCi0gICAgICAgICAgICAgICAgICogaXMgYSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gRm9yIGNvbm5lY3RzLCB0aGUKLSAgICAgICAgICAgICAgICAgKiBzdXBwbGljYW50IGV2ZW50IGFsd2F5cyBhcnJpdmVzIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAqIHRoZSBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudC4gT25seSB0aGUgbGF0dGVyIGV2ZW50Ci0gICAgICAgICAgICAgICAgICogaGFzIHRoZSBCU1NJRCwgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FwdHVyaW5nLgotICAgICAgICAgICAgICAgICAqIEZvciBkaXNjb25uZWN0cywgdGhlIG9yZGVyIGlzIHRoZSBvcHBvc2l0ZSAtLSB0aGUKLSAgICAgICAgICAgICAgICAgKiBuZXR3b3JrIHN0YXRlIGNoYW5nZSBldmVudCBjb21lcyBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTmV0d29ya1N0YXRlQ2hhbmdlUmVzdWx0IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIChOZXR3b3JrU3RhdGVDaGFuZ2VSZXN1bHQpIG1zZy5vYmo7Ci0KLSAgICAgICAgICAgICAgICAvLyBXaS1GaSBuZXR3b3JrIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgLy8gWzMxLSA2XSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgIC8vIFsgNS0gMF0gRGV0YWlsZWQgc3RhdGUgb3JkaW5hbCAoYXMgZGVmaW5lZCBieSBOZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlKSAgIAotICAgICAgICAgICAgICAgIGV2ZW50TG9nUGFyYW0gPSAocmVzdWx0LnN0YXRlLm9yZGluYWwoKSAmIDB4M2YpOwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfTkVUV09SS19TVEFURV9DSEFOR0VELCBldmVudExvZ1BhcmFtKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiTmV3IG5ldHdvcmsgc3RhdGUgaXMgIiArIHJlc3VsdC5zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSdyZSBpbiBzY2FuLW9ubHkgbW9kZSwgZG9uJ3QgYWR2YW5jZSB0aGUgc3RhdGUgbWFjaGluZSwgYW5kCi0gICAgICAgICAgICAgICAgICogZG9uJ3QgcmVwb3J0IHRoZSBzdGF0ZSBjaGFuZ2UgdG8gY2xpZW50cy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobUlzU2Nhbk9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIkRyb3BwaW5nIGV2ZW50IGluIHNjYW4tb25seSBtb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlICE9IERldGFpbGVkU3RhdGUuU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHNjYW4gY291bnQgc2luY2UgdGhlcmUgd2FzIGEgbmV0d29yayBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgKiBjaGFuZ2UuIFRoaXMgY291bGQgYmUgZnJvbSBzdXBwbGljYW50IHRyeWluZyB0byBhc3NvY2lhdGUKLSAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtTnVtU2NhbnNTaW5jZU5ldHdvcmtTdGF0ZUNoYW5nZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSWYgdGhlIHN1cHBsaWNhbnQgc2VudCB1cyBhIENPTk5FQ1RFRCBldmVudCwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgKiB3YW50IHRvIHNlbmQgb3V0IGFuIGluZGljYXRpb24gb2Ygb3ZlcmFsbCBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICogY29ubmVjdGl2aXR5IHVudGlsIHdlIGhhdmUgb3VyIElQIGFkZHJlc3MuIElmIHRoZQotICAgICAgICAgICAgICAgICAqIHN1cHBsaWNhbnQgc2VudCB1cyBhIERJU0NPTk5FQ1RFRCBldmVudCwgd2UgZGVsYXkKLSAgICAgICAgICAgICAgICAgKiBzZW5kaW5nIGEgbm90aWZpY2F0aW9uIGluIGNhc2UgYSByZWNvbm5lY3Rpb24gdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBhY2Nlc3MgcG9pbnQgb2NjdXJzIHdpdGhpbiBhIHNob3J0IHRpbWUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSA9PSBEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5ET1JNQU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZURpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICghbUhhdmVJcEFkZHJlc3MgfHwgbURpc2Nvbm5lY3RQZW5kaW5nKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShyZXN1bHQuc3RhdGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogUmVtb3ZlIHRoZSAnYXZhaWxhYmxlIG5ldHdvcmtzJyBub3RpZmljYXRpb24gd2hlbiB3ZQotICAgICAgICAgICAgICAgICAgICAgKiBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byBhIG5ldHdvcmsuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd2FzRGlzY29ubmVjdFBlbmRpbmcgPSBtRGlzY29ubmVjdFBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmNlbERpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gaXMgZnVsbHkgY29uZmlndXJlZCBhcyBmYXIgYXMgbGluay1sZXZlbAotICAgICAgICAgICAgICAgICAgICAgKiBjb25uZWN0aXZpdHkgaXMgY29uY2VybmVkLCBidXQgd2UgbWF5IHN0aWxsIG5lZWQgdG8gb2J0YWluCi0gICAgICAgICAgICAgICAgICAgICAqIGFuIElQIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAod2FzRGlzY29ubmVjdFBlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkU3RhdGUgc2F2ZVN0YXRlID0gZ2V0TmV0d29ya0luZm8oKS5nZXREZXRhaWxlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0ZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZUludGVybmFsKHNhdmVTdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RCc3NpZCA9IHJlc3VsdC5CU1NJRDsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RTc2lkID0gbVdpZmlJbmZvLmdldFNTSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQgPSByZXN1bHQubmV0d29ya0lkOwotICAgICAgICAgICAgICAgICAgICBpZiAobUhhdmVJcEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5DT05ORUNURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLk9CVEFJTklOR19JUEFERFIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmROZXR3b3JrU3RhdGVDaGFuZ2VCcm9hZGNhc3QobVdpZmlJbmZvLmdldEJTU0lEKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1NDQU5fUkVTVUxUU19BVkFJTEFCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5pc1N5c3RlbVJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLlNDQU5fUkVTVUxUU19BVkFJTEFCTEVfQUNUSU9OKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRTY2FuUmVzdWx0c0F2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE9uIHJlY2VpdmluZyB0aGUgZmlyc3Qgc2NhbiByZXN1bHRzIGFmdGVyIGNvbm5lY3RpbmcgdG8KLSAgICAgICAgICAgICAgICAgKiB0aGUgc3VwcGxpY2FudCwgc3dpdGNoIHNjYW4gbW9kZSBvdmVyIHRvIHBhc3NpdmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc2V0U2Nhbk1vZGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX1BPTExfSU5URVJWQUw6Ci0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UG9sbGVkSW5mbyhtV2lmaUluZm8sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjaGVja1BvbGxUaW1lcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNUOgotICAgICAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgIT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9ERUZFUlJFRF9SRUNPTk5FQ1Q6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogbUxhc3RCc3NpZCBjYW4gYmUgbnVsbCB3aGVuIHRoZXJlIGlzIGEgcmVjb25uZWN0Ci0gICAgICAgICAgICAgICAgICogcmVxdWVzdCBvbiB0aGUgZmlyc3QgQlNTSUQgd2UgY29ubmVjdCB0bwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBCU1NJRCA9IChtc2cub2JqICE9IG51bGwpID8gbXNnLm9iai50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBJZiB3ZSd2ZSBleGNlZWRlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBmb3IgcmVjb25uZWN0aW5nCi0gICAgICAgICAgICAgICAgICogdG8gYSBnaXZlbiBuZXR3b3JrLCBkaXNhYmxlIHRoZSBuZXR3b3JrCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSAhPSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyttUmVjb25uZWN0Q291bnQgPiBnZXRNYXhEaGNwUmV0cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkZhaWxlZCByZWNvbm5lY3QgY291bnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29ubmVjdENvdW50ICsgIiBEaXNhYmxpbmcgIiArIEJTU0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1XTS5kaXNhYmxlTmV0d29yayhtTGFzdE5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0Q29tbWFuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2luY2UgdGhpcyBldmVudCBpcyBzZW50IGZyb20gYW5vdGhlciB0aHJlYWQsIGl0IG1pZ2h0IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAqIHNlbnQgYWZ0ZXIgd2UgY2xvc2VkIG91ciBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGljYW50IGluIHRoZSBjb3Vyc2UKLSAgICAgICAgICAgICAgICAgKiBvZiBkaXNhYmxpbmcgV2ktRmkuIEluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZSBldmVudC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpID09IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUmVjb25uZWN0Q291bnQgPSAwOwotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtT2J0YWluaW5nSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcyhtRGhjcEluZm8uaXBBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gLTE7IC8vIGZvcmNlIHVwZGF0ZSBvZiBzaWduYWwgc3RyZW5ndGgKLSAgICAgICAgICAgICAgICBpZiAobU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKSAhPSBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZXREZXRhaWxlZFN0YXRlKERldGFpbGVkU3RhdGUuQ09OTkVDVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtV2lmaUluZm8uZ2V0QlNTSUQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiSVAgY29uZmlndXJhdGlvbjogIiArIG1EaGNwSW5mbyk7Ci0gICAgICAgICAgICAgICAgLy8gV2ktRmkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gc3RhdGUgY2hhbmdlZDoKLSAgICAgICAgICAgICAgICAvLyBbMzEtIDFdIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkgICAKLSAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEVWRU5UTE9HX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NUQVRFX0NIQU5HRUQsIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gV2UndmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSwgc28gYWxsb3cgdGhlIG5vdGlmaWNhdGlvbiBhZ2FpbiBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldFN1cHBsaWNhbnRTdGF0ZSgpICE9IFN1cHBsaWNhbnRTdGF0ZS5VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdpLUZpIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHN0YXRlIGNoYW5nZWQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFszMS0gMV0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAgICAgICAgICAgICAgICAgICAgLy8gWyAwLSAwXSBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBzdWNjZWVkZWQgKDEpIG9yIGZhaWxlZCAoMCkKLSAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVEFURV9DSEFOR0VELCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldElwQWRkcmVzcygwKTsKLSAgICAgICAgICAgICAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEVWRU5UX0RSSVZFUl9TVEFURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgIC8vIFdpLUZpIGRyaXZlciBzdGF0ZSBjaGFuZ2VkOgotICAgICAgICAgICAgICAgIC8vIDAgU1RBUlRFRAotICAgICAgICAgICAgICAgIC8vIDEgU1RPUFBFRAotICAgICAgICAgICAgICAgIC8vIDIgSFVORwotICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRVZFTlRMT0dfRFJJVkVSX1NUQVRFX0NIQU5HRUQsIG1zZy5hcmcxKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnLmFyZzEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVEVEOgotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBjaGFubmVscyBhY2NvcmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICogdG8gdGhlIHN5c3RlbSBzZXR0aW5nLCBzaW5jZSBpdCBnZXRzIHJlc2V0IGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBkcml2ZXIgdXBvbiBjaGFuZ2luZyB0byB0aGUgU1RBUlRFRCBzdGF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHNldE51bUFsbG93ZWRDaGFubmVscygpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVuU3RhdGUgPT0gUlVOX1NUQVRFX1NUQVJUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSXNTY2FuT25seSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3RDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBzaXR1YXRpb25zLCBzdXBwbGljYW50IG5lZWRzIHRvIGJlIGtpY2tzdGFydGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX0hVTkc6Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIldpZmkgRHJpdmVyIHJlcG9ydHMgSFVORyAtIHJlbG9hZGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIHJlc3RhcnQgdGhlIGRyaXZlciAtIHRvZ2dsZSBvZmYgYW5kIG9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtV00uc2V0V2lmaUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBub3RlUnVuU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBFVkVOVF9QQVNTV09SRF9LRVlfTUFZX0JFX0lOQ09SUkVDVDoKLSAgICAgICAgICAgICAgICBtUGFzc3dvcmRLZXlNYXlCZUluY29ycmVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gd2lmaU1hbmFnZXJEaXNhYmxlTmV0d29yayhpbnQgbmV0d29ya0lkKSB7Ci0gICAgICAgIGJvb2xlYW4gZGlzYWJsZWROZXR3b3JrID0gZmFsc2U7Ci0gICAgICAgIGlmICgwIDw9IG5ldHdvcmtJZCkgewotICAgICAgICAgICAgZGlzYWJsZWROZXR3b3JrID0gbVdNLmRpc2FibGVOZXR3b3JrKG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgewotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZE5ldHdvcmspIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRGlzYWJsZWQgbmV0d29yazogIiArIG5ldHdvcmtJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0NBTF9MT0dEKSB7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVkTmV0d29yaykgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBkaXNhYmxlIG5ldHdvcms6IiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG5ldHdvcmsgaWQ6ICIgKyBuZXR3b3JrSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNhYmxlZE5ldHdvcms7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUludGVyZmFjZSgpIHsKLSAgICAgICAgY2hlY2tQb2xsVGltZXIoKTsKLSAgICAgICAgbUxhc3RTaWduYWxMZXZlbCA9IC0xOwotICAgICAgICBpZiAoIW1Vc2VTdGF0aWNJcCkgewotICAgICAgICAgICAgaWYgKCFtSGF2ZUlwQWRkcmVzcyAmJiAhbU9idGFpbmluZ0lwQWRkcmVzcykgewotICAgICAgICAgICAgICAgIG1PYnRhaW5pbmdJcEFkZHJlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnNlbmRFbXB0eU1lc3NhZ2UoRVZFTlRfREhDUF9TVEFSVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBpZiAoTmV0d29ya1V0aWxzLmNvbmZpZ3VyZUludGVyZmFjZShtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBldmVudCA9IEVWRU5UX0lOVEVSRkFDRV9DT05GSUdVUkFUSU9OX1NVQ0NFRURFRDsKLSAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYXZlSXBBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy52KFRBRywgIlN0YXRpYyBJUCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCBvdXIgSVAgc3RhdGUgYW5kIHNlbmQgb3V0IGJyb2FkY2FzdHMgZm9sbG93aW5nIGEgZGlzY29ubmVjdC4KLSAgICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIHtAY29kZSBEZXRhaWxlZFN0YXRlfSB0byBzZXQuIFNob3VsZCBiZSBlaXRoZXIKLSAgICAgKiB7QGNvZGUgRElTQ09OTkVDVEVEfSBvciB7QGNvZGUgRkFJTEVEfS4KLSAgICAgKiBAcGFyYW0gZGlzYWJsZUludGVyZmFjZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW50ZXJmYWNlIHNob3VsZAotICAgICAqIGJlIGRpc2FibGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURpc2Nvbm5lY3RlZFN0YXRlKERldGFpbGVkU3RhdGUgbmV3U3RhdGUsIGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAobURpc2Nvbm5lY3RQZW5kaW5nKSB7Ci0gICAgICAgICAgICBjYW5jZWxEaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbURpc2Nvbm5lY3RFeHBlY3RlZCA9IGZhbHNlOwotICAgICAgICByZXNldENvbm5lY3Rpb25zKGRpc2FibGVJbnRlcmZhY2UpOwotICAgICAgICBzZXREZXRhaWxlZFN0YXRlKG5ld1N0YXRlKTsKLSAgICAgICAgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChtTGFzdEJzc2lkKTsKLSAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKG51bGwpOwotICAgICAgICBtTGFzdEJzc2lkID0gbnVsbDsKLSAgICAgICAgbUxhc3RTc2lkID0gbnVsbDsKLSAgICAgICAgbURpc2Nvbm5lY3RQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBXaS1GaSBDb25uZWN0aW9ucyBieSBjbGVhcmluZyBhbnkgc3RhdGUsIHJlc2V0dGluZyBhbnkgc29ja2V0cwotICAgICAqIHVzaW5nIHRoZSBpbnRlcmZhY2UsIHN0b3BwaW5nIERIQ1AsIGFuZCBkaXNhYmxpbmcgdGhlIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb25zKGJvb2xlYW4gZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKLSAgICAgICAgbUhhdmVJcEFkZHJlc3MgPSBmYWxzZTsKLSAgICAgICAgbU9idGFpbmluZ0lwQWRkcmVzcyA9IGZhbHNlOwotICAgICAgICBtV2lmaUluZm8uc2V0SXBBZGRyZXNzKDApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFJlc2V0IGNvbm5lY3Rpb24gZGVwZW5kcyBvbiBib3RoIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBJUCBhc3NpZ25lZCwKLSAgICAgICAgICogc28gaXQgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSBjaGFuY2Ugb2YgdGhlIElQIGJlaW5nIGxvc3QuCi0gICAgICAgICAqLwotICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7Ci0KLSAgICAgICAgLy8gU3RvcCBESENQCi0gICAgICAgIGlmIChtRGhjcFRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGhjcFRhcmdldC5zZXRDYW5jZWxDYWxsYmFjayh0cnVlKTsKLSAgICAgICAgICAgIG1EaGNwVGFyZ2V0LnJlbW92ZU1lc3NhZ2VzKEVWRU5UX0RIQ1BfU1RBUlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghTmV0d29ya1V0aWxzLnN0b3BEaGNwKG1JbnRlcmZhY2VOYW1lKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHN0b3AgREhDUCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEludGVyZmFjZSBpcyByZS1lbmFibGVkIGluIHRoZSBzdXBwbGljYW50Ci0gICAgICAgICAqIHdoZW4gbW92aW5nIG91dCBvZiBBU1NPQ0lBVElORyBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYoZGlzYWJsZUludGVyZmFjZSkgewotICAgICAgICAgICAgaWYgKExPQ0FMX0xPR0QpIExvZy5kKFRBRywgIkRpc2FibGluZyBpbnRlcmZhY2UiKTsKLSAgICAgICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBzdXBwbGljYW50IGlzIHJlcG9ydGluZyB0aGF0IHdlIGFyZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY3VycmVudAotICAgICAqIGFjY2VzcyBwb2ludC4gT2Z0ZW4sIGhvd2V2ZXIsIGEgZGlzY29ubmVjdCB3aWxsIGJlIGZvbGxvd2VkIHZlcnkgc2hvcnRseQotICAgICAqIGJ5IGEgcmVjb25uZWN0IHRvIHRoZSBzYW1lIGFjY2VzcyBwb2ludC4gVGhlcmVmb3JlLCB3ZSBkZWxheSByZXNldHRpbmcKLSAgICAgKiB0aGUgY29ubmVjdGlvbidzIElQIHN0YXRlIGZvciBhIGJpdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSB0cnVlOwotICAgICAgICBpZiAoIWhhc01lc3NhZ2VzKEVWRU5UX0RFRkVSUkVEX0RJU0NPTk5FQ1QpKSB7Ci0gICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlRGVsYXllZChFVkVOVF9ERUZFUlJFRF9ESVNDT05ORUNULCBESVNDT05ORUNUX0RFTEFZX01TRUNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjYW5jZWxEaXNjb25uZWN0KCkgewotICAgICAgICBtRGlzY29ubmVjdFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgcmVtb3ZlTWVzc2FnZXMoRVZFTlRfREVGRVJSRURfRElTQ09OTkVDVCk7Ci0gICAgfQotCi0gICAgcHVibGljIERoY3BJbmZvIGdldERoY3BJbmZvKCkgewotICAgICAgICByZXR1cm4gbURoY3BJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTY2FuUmVzdWx0PiBnZXRTY2FuUmVzdWx0c0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBtU2NhblJlc3VsdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNjYW5SZXN1bHRzTGlzdChMaXN0PFNjYW5SZXN1bHQ+IHNjYW5MaXN0KSB7Ci0gICAgICAgIG1TY2FuUmVzdWx0cyA9IHNjYW5MaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24sIGlmIGFueS4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFdpZmlJbmZvfSBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFdpZmlJbmZvIHJlcXVlc3RDb25uZWN0aW9uSW5mbygpIHsKLSAgICAgICAgcmVxdWVzdENvbm5lY3Rpb25TdGF0dXMobVdpZmlJbmZvKTsKLSAgICAgICAgcmVxdWVzdFBvbGxlZEluZm8obVdpZmlJbmZvLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBtV2lmaUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RDb25uZWN0aW9uU3RhdHVzKFdpZmlJbmZvIGluZm8pIHsKLSAgICAgICAgU3RyaW5nIHJlcGx5ID0gc3RhdHVzKCk7Ci0gICAgICAgIGlmIChyZXBseSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGFyc2UgdGhlIHJlcGx5IGZyb20gdGhlIHN1cHBsaWNhbnQgdG8gdGhlIHN0YXR1cyBjb21tYW5kLCBhbmQgdXBkYXRlCi0gICAgICAgICAqIGxvY2FsIHN0YXRlIGFjY29yZGluZ2x5LiBUaGUgcmVwbHkgaXMgYSBzZXJpZXMgb2YgbGluZXMgb2YgdGhlIGZvcm0KLSAgICAgICAgICogIm5hbWU9dmFsdWUiLgotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIFNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgQlNTSUQgPSBudWxsOwotICAgICAgICBTdHJpbmcgc3VwcFN0YXRlID0gbnVsbDsKLSAgICAgICAgaW50IG5ldElkID0gLTE7Ci0gICAgICAgIFN0cmluZ1tdIGxpbmVzID0gcmVwbHkuc3BsaXQoIlxuIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvcCA9IGxpbmUuc3BsaXQoIiAqPSAqIiwgMik7Ci0gICAgICAgICAgICBpZiAocHJvcC5sZW5ndGggPCAyKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wWzBdOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcFsxXTsKLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImlkIikpCi0gICAgICAgICAgICAgICAgbmV0SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic3NpZCIpKQotICAgICAgICAgICAgICAgIFNTSUQgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnNzaWQiKSkKLSAgICAgICAgICAgICAgICBCU1NJRCA9IHZhbHVlOwotICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ3cGFfc3RhdGUiKSkKLSAgICAgICAgICAgICAgICBzdXBwU3RhdGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLnNldE5ldHdvcmtJZChuZXRJZCk7Ci0gICAgICAgIGluZm8uc2V0U1NJRChTU0lEKTsKLSAgICAgICAgaW5mby5zZXRCU1NJRChCU1NJRCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG9ubHkgc2V0IHRoZSBzdXBwbGljYW50IHN0YXRlIGlmIHRoZSBwcmV2aW91cyBzdGF0ZSB3YXMKLSAgICAgICAgICogVU5JTklUSUFMSVpFRC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB3ZSBmaXJzdCBjb25uZWN0IHRvCi0gICAgICAgICAqIHRoZSBzdXBwbGljYW50LiBPbmNlIHdlJ3JlIGNvbm5lY3RlZCwgd2Ugc2hvdWxkIGFsd2F5cyByZWNlaXZlCi0gICAgICAgICAqIGFuIGV2ZW50IHVwb24gYW55IHN0YXRlIGNoYW5nZSwgYnV0IGluIHRoaXMgY2FzZSwgd2Ugd2FudCB0bwotICAgICAgICAgKiBtYWtlIHN1cmUgYW55IGxpc3RlbmVycyBhcmUgbWFkZSBhd2FyZSBvZiB0aGUgc3RhdGUgY2hhbmdlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1XaWZpSW5mby5nZXRTdXBwbGljYW50U3RhdGUoKSA9PSBTdXBwbGljYW50U3RhdGUuVU5JTklUSUFMSVpFRCAmJiBzdXBwU3RhdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHNldFN1cHBsaWNhbnRTdGF0ZShzdXBwU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZHluYW1pYyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCByZXBvcnRlZCB2aWEgZXZlbnRzLgotICAgICAqIEBwYXJhbSBpbmZvIHRoZSBvYmplY3QgaW50byB3aGljaCB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhcHR1cmVkLgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdFBvbGxlZEluZm8oV2lmaUluZm8gaW5mbywgYm9vbGVhbiBwb2xsaW5nKQotICAgIHsKLSAgICAgICAgaW50IG5ld1Jzc2kgPSAocG9sbGluZyA/IGdldFJzc2lBcHByb3goKSA6IGdldFJzc2koKSk7Ci0gICAgICAgIGlmIChuZXdSc3NpICE9IC0xICYmIC0yMDAgPCBuZXdSc3NpICYmIG5ld1Jzc2kgPCAyNTYpIHsgLy8gc2NyZWVuIG91dCBpbnZhbGlkIHZhbHVlcwotICAgICAgICAgICAgLyogc29tZSBpbXBsZW1lbnRhdGlvbnMgYXZvaWQgbmVnYXRpdmUgdmFsdWVzIGJ5IGFkZGluZyAyNTYKLSAgICAgICAgICAgICAqIHNvIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGF0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChuZXdSc3NpID4gMCkgbmV3UnNzaSAtPSAyNTY7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2kobmV3UnNzaSk7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUmF0aGVyIHRoZW4gc2VuZGluZyB0aGUgcmF3IFJTU0kgb3V0IGV2ZXJ5IHRpbWUgaXQKLSAgICAgICAgICAgICAqIGNoYW5nZXMsIHdlIHByZWNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsIHRoYXQgd291bGQKLSAgICAgICAgICAgICAqIGJlIGRpc3BsYXllZCBpbiB0aGUgc3RhdHVzIGJhciwgYW5kIG9ubHkgc2VuZCB0aGUKLSAgICAgICAgICAgICAqIGJyb2FkY2FzdCBpZiB0aGF0IG11Y2ggbW9yZSBjb2Fyc2UtZ3JhaW5lZCBudW1iZXIKLSAgICAgICAgICAgICAqIGNoYW5nZXMuIFRoaXMgY3V0cyBkb3duIGdyZWF0bHkgb24gdGhlIG51bWJlciBvZgotICAgICAgICAgICAgICogYnJvYWRjYXN0cywgYXQgdGhlIGNvc3Qgb2Ygbm90IGluZm9ybWluZyBvdGhlcnMKLSAgICAgICAgICAgICAqIGludGVyZXN0ZWQgaW4gUlNTSSBvZiBhbGwgdGhlIGNoYW5nZXMgaW4gc2lnbmFsCi0gICAgICAgICAgICAgKiBsZXZlbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gVE9ETzogVGhlIHNlY29uZCBhcmcgdG8gdGhlIGNhbGwgYmVsb3cgbmVlZHMgdG8gYmUgYSBzeW1ib2wgc29tZXdoZXJlLCBidXQKLSAgICAgICAgICAgIC8vIGl0J3MgYWN0dWFsbHkgdGhlIHNpemUgb2YgYW4gYXJyYXkgb2YgaWNvbnMgdGhhdCdzIHByaXZhdGUKLSAgICAgICAgICAgIC8vIHRvIFN0YXR1c0JhciBQb2xpY3kuCi0gICAgICAgICAgICBpbnQgbmV3U2lnbmFsTGV2ZWwgPSBXaWZpTWFuYWdlci5jYWxjdWxhdGVTaWduYWxMZXZlbChuZXdSc3NpLCA0KTsKLSAgICAgICAgICAgIGlmIChuZXdTaWduYWxMZXZlbCAhPSBtTGFzdFNpZ25hbExldmVsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFJzc2lDaGFuZ2VCcm9hZGNhc3QobmV3UnNzaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFNpZ25hbExldmVsID0gbmV3U2lnbmFsTGV2ZWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvLnNldFJzc2koLTIwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ld0xpbmtTcGVlZCA9IGdldExpbmtTcGVlZCgpOwotICAgICAgICBpZiAobmV3TGlua1NwZWVkICE9IC0xKSB7Ci0gICAgICAgICAgICBpbmZvLnNldExpbmtTcGVlZChuZXdMaW5rU3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRSc3NpQ2hhbmdlQnJvYWRjYXN0KGZpbmFsIGludCBuZXdSc3NpKSB7Ci0gICAgICAgIGlmIChBY3Rpdml0eU1hbmFnZXJOYXRpdmUuaXNTeXN0ZW1SZWFkeSgpKSB7Ci0gICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChXaWZpTWFuYWdlci5SU1NJX0NIQU5HRURfQUNUSU9OKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVdfUlNTSSwgbmV3UnNzaSk7Ci0gICAgICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZE5ldHdvcmtTdGF0ZUNoYW5nZUJyb2FkY2FzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTik7Ci0gICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QKLSAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8sIG1OZXR3b3JrSW5mbyk7Ci0gICAgICAgIGlmIChic3NpZCAhPSBudWxsKQotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0JTU0lELCBic3NpZCk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIFdpLUZpIGNvbm5lY3Rpdml0eSBieSBzdG9wcGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRlYXJkb3duKCkgewotICAgICAgICBpZiAoIW1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKGRpc2Nvbm5lY3RBbmRTdG9wKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRUb3JuRG93bkJ5Q29ubk1ncih0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWVuYWJsZSBXaS1GaSBjb25uZWN0aXZpdHkgYnkgcmVzdGFydGluZyB0aGUgZHJpdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1Ub3JuRG93bkJ5Q29ubk1ncikgewotICAgICAgICAgICAgaWYgKHJlc3RhcnQoKSkgewotICAgICAgICAgICAgICAgIHNldFRvcm5Eb3duQnlDb25uTWdyKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSB3YW50IHRvIHN0b3AgdGhlIGRyaXZlciwgYnV0IGlmIHdlJ3JlIGNvbm5lY3RlZCB0byBhIG5ldHdvcmssCi0gICAgICogd2UgZmlyc3Qgd2FudCB0byBkaXNjb25uZWN0LCBzbyB0aGF0IHRoZSBzdXBwbGljYW50IGlzIGFsd2F5cyBpbgotICAgICAqIGEga25vd24gc3RhdGUgKERJU0NPTk5FQ1RFRCkgd2hlbiB0aGUgZHJpdmVyIGlzIHN0b3BwZWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKLSAgICAgKiBkaXNjb25uZWN0IG9yIHN0b3AgY29tbWFuZCB3YXMgaW5pdGlhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNjb25uZWN0QW5kU3RvcCgpIHsKLSAgICAgICAgYm9vbGVhbiByZXQgPSB0cnVlOzsKLSAgICAgICAgaWYgKG1SdW5TdGF0ZSAhPSBSVU5fU1RBVEVfU1RPUFBJTkcgJiYgbVJ1blN0YXRlICE9IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICAvLyBUYWtlIGRvd24gYW55IG9wZW4gbmV0d29yayBub3RpZmljYXRpb25zCi0gICAgICAgICAgICBzZXROb3RpZmljYXRpb25WaXNpYmxlKGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLkRPUk1BTlQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBzdG9wRHJpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5TdGF0ZSA9IFJVTl9TVEFURV9TVE9QUElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXN0YXJ0KCkgewotICAgICAgICBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICBtUnVuU3RhdGUgPSBSVU5fU1RBVEVfU1RBUlRJTkc7Ci0gICAgICAgICAgICByZXNldENvbm5lY3Rpb25zKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RHJpdmVyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUElORykgewotICAgICAgICAgICAgbVJ1blN0YXRlID0gUlVOX1NUQVRFX1NUQVJUSU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0V2lmaVN0YXRlKCkgewotICAgICAgICByZXR1cm4gbVdpZmlTdGF0ZS5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaWZpU3RhdGUoaW50IHdpZmlTdGF0ZSkgewotICAgICAgICBtV2lmaVN0YXRlLnNldCh3aWZpU3RhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW55TmV0d29ya0Rpc2FibGVkKCkgewotICAgICAgICByZXR1cm4gbUlzQW55TmV0d29ya0Rpc2FibGVkLmdldCgpOwotICAgIH0KLQotICAgLyoqCi0gICAgICogVGhlIFdpZmlOYXRpdmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgbGlzdGVkIGJlbG93LgotICAgICAqIFRoZSBvbmx5IG5hdGl2ZSBjYWxsIHRoYXQgaXMgbm90IHN5bmNocm9uaXplZCBvbgotICAgICAqIFdpZmlTdGF0ZVRyYWNrZXIgaXMgd2FpdEZvckV2ZW50KCkgd2hpY2ggd2FpdHMgb24gYQotICAgICAqIHNlcGVyYXRlIG1vbml0b3IgY2hhbm5lbC4KLSAgICAgKgotICAgICAqIEFsbCBzdXBwbGljYW50IGNvbW1hbmRzIG5lZWQgdGhlIHdpZmkgdG8gYmUgaW4gYW4KLSAgICAgKiBlbmFibGVkIHN0YXRlLiBUaGlzIGNhbiBiZSBkb25lIGJ5IGNoZWNraW5nIHRoZQotICAgICAqIG1XaWZpU3RhdGUgdG8gYmUgV0lGSV9TVEFURV9FTkFCTEVELgotICAgICAqCi0gICAgICogQWxsIGNvbW1hbmRzIHRoYXQgY2FuIGNhdXNlIGNvbW1hbmRzIHRvIGRyaXZlcgotICAgICAqIGluaXRpYXRlZCBuZWVkIHRoZSBkcml2ZXIgc3RhdGUgdG8gYmUgc3RhcnRlZC4KLSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgY2hlY2tpbmcgaXNEcml2ZXJTdG9wcGVkKCkgdG8KLSAgICAgKiBiZSBmYWxzZS4KLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvYWREcml2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxvYWREcml2ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvYWQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHVubG9hZERyaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUudW5sb2FkRHJpdmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN1cHBsaWNhbnQgY29uZmlnIGFuZAotICAgICAqIHN0YXJ0IHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdXBwbGljYW50KCkgewotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zdGFydFN1cHBsaWNhbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzdXBwbGljYW50IGRhZW1vbgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN1cHBsaWNhbnQoKSB7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BTdXBwbGljYW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXN0YWJsaXNoZXMgdHdvIGNoYW5uZWxzIC0gY29udHJvbCBjaGFubmVsIGZvciBjb21tYW5kcwotICAgICAqIGFuZCBtb25pdG9yIGNoYW5uZWwgZm9yIG5vdGlmeWluZyBXaWZpTW9uaXRvcgotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29ubmVjdFRvU3VwcGxpY2FudCgpIHsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuY29ubmVjdFRvU3VwcGxpY2FudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBjb250cm9sL21vbml0b3IgY2hhbm5lbHMgdG8gc3VwcGxpY2FudAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZVN1cHBsaWNhbnRDb25uZWN0aW9uKCkgewotICAgICAgICBXaWZpTmF0aXZlLmNsb3NlU3VwcGxpY2FudENvbm5lY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3VwcGxpY2FudCBpcyBhbGl2ZQotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcGluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucGluZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBhbiBhY3RpdmUgb3IgcGFzc2l2ZSBzY2FuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9yY2VBY3RpdmUgdHJ1ZSBpZiBpdCBpcyBhIGFjdGl2ZSBzY2FuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2Nhbihib29sZWFuIGZvcmNlQWN0aXZlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5Db21tYW5kKGZvcmNlQWN0aXZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgc3VwcGxpY2FudCBvciBkcml2ZXIKLSAgICAgKiB0YWtlIGNhcmUgb2YgaW5pdGlhdGluZyBzY2FuIGFuZCBkb2luZyBBUCBzZWxlY3Rpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgU1VQUExfU0NBTl9IQU5ETElOR19OT1JNQUwKLSAgICAgKiAgICBTVVBQTF9TQ0FOX0hBTkRMSU5HX0xJU1RfT05MWQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5SZXN1bHRIYW5kbGluZyhpbnQgbW9kZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5zZXRTY2FuUmVzdWx0SGFuZGxpbmdDb21tYW5kKG1vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoIHRoZSBzY2FuIHJlc3VsdHMgZnJvbSB0aGUgc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiBleGFtcGxlIHJlc3VsdCBzdHJpbmcKLSAgICAgKiAwMDpiYjpjYzpkZDpjYzplZSAgICAgICAyNDI3ICAgIDE2NiAgICAgW1dQQS1FQVAtVEtJUF1bV1BBMi1FQVAtQ0NNUF0gICBOZXQxCi0gICAgICogMDA6YmI6Y2M6ZGQ6Y2M6ZmYgICAgICAgMjQxMiAgICAxNjUgICAgIFtXUEEtRUFQLVRLSVBdW1dQQTItRUFQLUNDTVBdICAgTmV0MgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHNjYW5SZXN1bHRzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNjYW5SZXN1bHRzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2NhbiBtb2RlIC0gYWN0aXZlIG9yIHBhc3NpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldFNjYW5Nb2RlKGJvb2xlYW4gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzU2Nhbk1vZGVBY3RpdmUgIT0gaXNTY2FuTW9kZUFjdGl2ZSkgewotICAgICAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0U2Nhbk1vZGVDb21tYW5kKG1Jc1NjYW5Nb2RlQWN0aXZlID0gaXNTY2FuTW9kZUFjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCBmcm9tIEFjY2VzcyBQb2ludAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzY29ubmVjdCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZGlzY29ubmVjdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSBhIHJlY29ubmVjdGlvbiB0byBBUAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjb25uZWN0Q29tbWFuZCgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVjb25uZWN0Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEByZXR1cm4gbmV0d29yayBpZCBvZiB0aGUgbmV3IG5ldHdvcmsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBhZGROZXR3b3JrKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5hZGROZXR3b3JrQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrSWQgaWQgb2YgdGhlIG5ldHdvcmsgdG8gYmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbW92ZU5ldHdvcmsoaW50IG5ldHdvcmtJZCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURpc2Nvbm5lY3RFeHBlY3RlZCA9IFdpZmlOYXRpdmUucmVtb3ZlTmV0d29ya0NvbW1hbmQobmV0d29ya0lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGUgYSBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmV0SWQgbmV0d29yayBpZCBvZiB0aGUgbmV0d29yawotICAgICAqIEBwYXJhbSBkaXNhYmxlT3RoZXJzIHRydWUsIGlmIGFsbCBvdGhlciBuZXR3b3JrcyBoYXZlIHRvIGJlIGRpc2FibGVkCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZW5hYmxlTmV0d29yayhpbnQgbmV0SWQsIGJvb2xlYW4gZGlzYWJsZU90aGVycykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlzYWJsZU90aGVycykgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldCh0cnVlKTsKLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQobmV0SWQsIGRpc2FibGVPdGhlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhbGwgbmV0d29ya3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXR3b3JrcyBsaXN0IG9mIGNvbmZpZ3VyZWQgbmV0d29ya3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZW5hYmxlQWxsTmV0d29ya3MoTGlzdDxXaWZpQ29uZmlndXJhdGlvbj4gbmV0d29ya3MpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUlzQW55TmV0d29ya0Rpc2FibGVkLnNldChmYWxzZSk7Ci0gICAgICAgIGZvciAoV2lmaUNvbmZpZ3VyYXRpb24gY29uZmlnIDogbmV0d29ya3MpIHsKLSAgICAgICAgICAgIGlmIChjb25maWcuc3RhdHVzID09IFdpZmlDb25maWd1cmF0aW9uLlN0YXR1cy5ESVNBQkxFRCkgewotICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuZW5hYmxlTmV0d29ya0NvbW1hbmQoY29uZmlnLm5ldHdvcmtJZCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZSBhIG5ldHdvcmsKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZGlzYWJsZU5ldHdvcmsoaW50IG5ldElkKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1Jc0FueU5ldHdvcmtEaXNhYmxlZC5zZXQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmRpc2FibGVOZXR3b3JrQ29tbWFuZChuZXRJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhdGUgYSByZS1hc3NvY2lhdGlvbiBpbiBzdXBwbGljYW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFzc29jaWF0ZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUucmVhc3NvY2lhdGVDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmxhY2tsaXN0IGEgQlNTSUQuIFRoaXMgd2lsbCBhdm9pZCB0aGUgQVAgaWYgdGhlcmUgYXJlCi0gICAgICogYWx0ZXJuYXRlIEFQcyB0byBjb25uZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnNzaWQgQlNTSUQgb2YgdGhlIG5ldHdvcmsKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRUb0JsYWNrbGlzdChTdHJpbmcgYnNzaWQpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuYWRkVG9CbGFja2xpc3RDb21tYW5kKGJzc2lkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgYmxhY2tsaXN0IGxpc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNsZWFyQmxhY2tsaXN0KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5jbGVhckJsYWNrbGlzdENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IGFsbCBjb25maWd1cmVkIG5ldHdvcmtzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbmV0d29ya3Mgb3IgbnVsbCBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgbGlzdE5ldHdvcmtzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmxpc3ROZXR3b3Jrc0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV0d29ya1ZhcmlhYmxlKGludCBuZXRJZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROZXR3b3JrVmFyaWFibGVDb21tYW5kKG5ldElkLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgbmV0d29yayBzZXR0aW5nIGJ5IG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXRJZCBuZXR3b3JrIGlkIG9mIHRoZSBuZXR3b3JrCi0gICAgICogQHBhcmFtIG5hbWUgbmV0d29yayB2YXJpYWJsZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUgbmV0d29yayB2YXJpYWJsZSB2YWx1ZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHNldE5ldHdvcmtWYXJpYWJsZShpbnQgbmV0SWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2V0TmV0d29ya1ZhcmlhYmxlQ29tbWFuZChuZXRJZCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBkZXRhaWxlZCBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gRXhhbXBsZSBzdGF0dXMgcmVzdWx0Ci0gICAgICogIGJzc2lkPWFhOmJiOmNjOmRkOmVlOmZmCi0gICAgICogIHNzaWQ9VGVzdE5ldAotICAgICAqICBpZD0zCi0gICAgICogIHBhaXJ3aXNlX2NpcGhlcj1OT05FCi0gICAgICogIGdyb3VwX2NpcGhlcj1OT05FCi0gICAgICogIGtleV9tZ210PU5PTkUKLSAgICAgKiAgd3BhX3N0YXRlPUNPTVBMRVRFRAotICAgICAqICBpcF9hZGRyZXNzPVguWC5YLlgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBzdGF0dXMoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhdHVzQ29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBSU1NJIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBSU1NJIHZhbHVlLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0UnNzaSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuZ2V0UnNzaUFwcHJveENvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYXBwcm94IFJTU0kgdG8gY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJTU0kgdmFsdWUsIC0xIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRSc3NpQXBwcm94KCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRSc3NpQXBwcm94Q29tbWFuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaW5rIHNwZWVkIHRvIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yawotICAgICAqCi0gICAgICogQHJldHVybiBsaW5rIHNwZWVkLCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TGlua1NwZWVkKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXRMaW5rU3BlZWRDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE1BQyBhZGRyZXNzIG9mIHJhZGlvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE1BQyBhZGRyZXNzLCBudWxsIG9uIGZhaWx1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNYWNBZGRyZXNzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldE1hY0FkZHJlc3NDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnQgZHJpdmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydERyaXZlcigpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcCBkcml2ZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BEcml2ZXIoKSB7Ci0gICAgICAgIC8qIERyaXZlciBzdG9wIHNob3VsZCBub3QgaGFwcGVuIG9ubHkgd2hlbiBzdXBwbGljYW50IGV2ZW50Ci0gICAgICAgICAqIERSSVZFUl9TVE9QUEVEIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCAqLwotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgbVJ1blN0YXRlID09IFJVTl9TVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RvcERyaXZlckNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwYWNrZXQgZmlsdGVyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdGFydFBhY2tldEZpbHRlcmluZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc3RhcnRQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHBhY2tldCBmaWx0ZXJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BQYWNrZXRGaWx0ZXJpbmcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnN0b3BQYWNrZXRGaWx0ZXJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcG93ZXIgbW9kZQotICAgICAqIEByZXR1cm4gcG93ZXIgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFBvd2VyTW9kZSgpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEICYmICFpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLmdldFBvd2VyTW9kZUNvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgcG93ZXIgbW9kZQotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogICAgIERSSVZFUl9QT1dFUl9NT0RFX0FVVE8KLSAgICAgKiAgICAgRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFCi0gICAgICoKLSAgICAgKiBVc2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogYXMgbG9uZyBhcyBvbmUgZW50aXR5IHdhbnRzIHBvd2VyIG1vZGUgdG8gYmUgYWN0aXZlLgotICAgICAqCi0gICAgICogRm9yIGV4YW1wbGUsIFdpZmlMb2NrIGhpZ2ggcGVyZiBtb2RlIGNhbiBrZWVwIHBvd2VyIG1vZGUgYWN0aXZlCi0gICAgICogb3IgYSBESENQIHNlc3Npb24gY2FuIGtlZXAgaXQgYWN0aXZlLiBBcyBsb25nIGFzIG9uZSBlbnRpdHkgd2FudHMKLSAgICAgKiBpdCBlbmFibGVkLCBpdCBzaG91bGQgc3RheSB0aGF0IHdheQotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQb3dlck1vZGUoaW50IG1vZGUpIHsKLQotICAgICAgICAvKiBJdCBpcyBnb29kIHRvIHBsdW1iIHBvd2VyIG1vZGUgY2hhbmdlCi0gICAgICAgICAqIGV2ZW4gaWYgcmVmIGNvdW50IGluZGljYXRlcyBhbHJlYWR5IGRvbmUKLSAgICAgICAgICogc2luY2Ugd2UgY291bGQgaGF2ZSBhIGNhc2Ugb2YgcHJldmlvdXMgZmFpbHVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRToKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRFJJVkVSX1BPV0VSX01PREVfQVVUTzoKLSAgICAgICAgICAgICAgICBtUG93ZXJNb2RlUmVmQ291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAobVBvd2VyTW9kZVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogS2VlcCByZWZjb3VudCBmcm9tIGJlY29taW5nIG5lZ2F0aXZlICovCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlck1vZGVSZWZDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEIHx8IGlzRHJpdmVyU3RvcHBlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBXaWZpTmF0aXZlLnNldFBvd2VyTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgYWxsb3dlZCByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgZnJvbSB0aGUgc3lzdGVtCi0gICAgICogc2V0dGluZyB2YWx1ZSwgaWYgYW55LgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLCBlLmcuLAotICAgICAqIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNldE51bUFsbG93ZWRDaGFubmVscygKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfTlVNX0FMTE9XRURfQ0hBTk5FTFMpKTsKLSAgICAgICAgfSBjYXRjaCAoU2V0dGluZ3MuU2V0dGluZ05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChtTnVtQWxsb3dlZENoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobU51bUFsbG93ZWRDaGFubmVscyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZSB0aGUgZHJpdmVyIGRlZmF1bHQKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiByYWRpbyBmcmVxdWVuY3kgY2hhbm5lbHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSB1c2VkCi0gICAgICogaW4gdGhlIGN1cnJlbnQgcmVndWxhdG9yeSBkb21haW4uCi0gICAgICogQHBhcmFtIG51bUNoYW5uZWxzIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscy4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMAotICAgICAqIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UsIGUuZy4sCi0gICAgICoge0Bjb2RlIG51bUNoYW5uZWxzfSBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0TnVtQWxsb3dlZENoYW5uZWxzKGludCBudW1DaGFubmVscykgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtTnVtQWxsb3dlZENoYW5uZWxzID0gbnVtQ2hhbm5lbHM7Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldE51bUFsbG93ZWRDaGFubmVsc0NvbW1hbmQobnVtQ2hhbm5lbHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscwotICAgICAqCi0gICAgICogQHJldHVybiBjaGFubmVsIGNvdW50LCAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TnVtQWxsb3dlZENoYW5uZWxzKCkgewotICAgICAgICBpZiAobVdpZmlTdGF0ZS5nZXQoKSAhPSBXSUZJX1NUQVRFX0VOQUJMRUQgfHwgaXNEcml2ZXJTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV2lmaU5hdGl2ZS5nZXROdW1BbGxvd2VkQ2hhbm5lbHNDb21tYW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJsdWV0b290aCBjb2V4IG1vZGU6Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kZQotICAgICAqICBCTFVFVE9PVEhfQ09FWElTVEVOQ0VfTU9ERV9FTkFCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX0RJU0FCTEVECi0gICAgICogIEJMVUVUT09USF9DT0VYSVNURU5DRV9NT0RFX1NFTlNFCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnNldEJsdWV0b290aENvZXhpc3RlbmNlTW9kZUNvbW1hbmQobW9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlIG9yIGRpc2FibGUgQmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHNjYW4gbW9kZS4gV2hlbiB0aGlzIG1vZGUgaXMgb24sCi0gICAgICogc29tZSBvZiB0aGUgbG93LWxldmVsIHNjYW4gcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBkcml2ZXIgYXJlIGNoYW5nZWQgdG8KLSAgICAgKiByZWR1Y2UgaW50ZXJmZXJlbmNlIHdpdGggQTJEUCBzdHJlYW1pbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXNCbHVldG9vdGhQbGF5aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhpcyBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJsdWV0b290aFNjYW5Nb2RlKGJvb2xlYW4gaXNCbHVldG9vdGhQbGF5aW5nKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCB8fCBpc0RyaXZlclN0b3BwZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFdpZmlOYXRpdmUuc2V0Qmx1ZXRvb3RoQ29leGlzdGVuY2VTY2FuTW9kZUNvbW1hbmQoaXNCbHVldG9vdGhQbGF5aW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gb24gc3VwcGxpY2FudAotICAgICAqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2F2ZUNvbmZpZygpIHsKLSAgICAgICAgaWYgKG1XaWZpU3RhdGUuZ2V0KCkgIT0gV0lGSV9TVEFURV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdpZmlOYXRpdmUuc2F2ZUNvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxvYWRDb25maWcoKSB7Ci0gICAgICAgIGlmIChtV2lmaVN0YXRlLmdldCgpICE9IFdJRklfU1RBVEVfRU5BQkxFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXaWZpTmF0aXZlLnJlbG9hZENvbmZpZ0NvbW1hbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpbyhib29sZWFuIHR1cm5PbikgewotICAgICAgICByZXR1cm4gbVdNLnNldFdpZmlFbmFibGVkKHR1cm5Pbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gV2ktRmktc3BlY2lmaWMgZmVhdHVyZXMgc3VwcG9ydGVkLgotICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlCi0gICAgICogQHJldHVybiB7QGNvZGUgLTF9IGluZGljYXRpbmcgZmFpbHVyZSwgYWx3YXlzCisgICAgICogVGVsbHMgdGhlIHVuZGVybHlpbmcgbmV0d29ya2luZyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIHdhbnRzIHRvCisgICAgICogYmVnaW4gdXNpbmcgdGhlIG5hbWVkIGZlYXR1cmUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgZmVhdHVyZX0KKyAgICAgKiBpcyBjb21wbGV0ZWx5IHVwIHRvIGVhY2ggbmV0d29ya2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gZmVhdHVyZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIGNhbGxpbmdQaWQgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIHRoZSB1c2VyIElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgaXMgaXNzdWluZyB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvdXRjb21lIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHZhbHVlIGlzIHNwZWNpZmljIHRvIGVhY2ggbmV0d29ya2luZworICAgICAqIGltcGxlbWVudGF0aW9uK2ZlYXR1cmUgY29tYmluYXRpb24sIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZSB7QGNvZGUgLTF9CisgICAgICogYWx3YXlzIGluZGljYXRlcyBmYWlsdXJlLgorICAgICAqIFRPRE86IG5lZWRzIHRvIGdvIGF3YXkKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHN0YXJ0VXNpbmdOZXR3b3JrRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IGNhbGxpbmdQaWQsIGludCBjYWxsaW5nVWlkKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogVGhlcmUgYXJlIGN1cnJlbnRseSBubyBXaS1GaS1zcGVjaWZpYyBmZWF0dXJlcyBzdXBwb3J0ZWQuCi0gICAgICogQHBhcmFtIGZlYXR1cmUgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUKLSAgICAgKiBAcmV0dXJuIHtAY29kZSAtMX0gaW5kaWNhdGluZyBmYWlsdXJlLCBhbHdheXMKKyAgICAgKiBUZWxscyB0aGUgdW5kZXJseWluZyBuZXR3b3JraW5nIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgaXMgZmluaXNoZWQKKyAgICAgKiB1c2luZyB0aGUgbmFtZWQgZmVhdHVyZS4gVGhlIGludGVycHJldGF0aW9uIG9mIHtAY29kZSBmZWF0dXJlfQorICAgICAqIGlzIGNvbXBsZXRlbHkgdXAgdG8gZWFjaCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRoYXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgKiBAcGFyYW0gY2FsbGluZ1BpZCB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgcHJvY2VzcyB0aGF0IGlzIGlzc3VpbmcgdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIGNhbGxpbmdVaWQgdGhlIHVzZXIgSUQgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBpc3N1aW5nIHRoaXMgcmVxdWVzdAorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG91dGNvbWUgb2YgdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgdmFsdWUgaXMgc3BlY2lmaWMgdG8gZWFjaCBuZXR3b3JraW5nCisgICAgICogaW1wbGVtZW50YXRpb24rZmVhdHVyZSBjb21iaW5hdGlvbiwgZXhjZXB0IHRoYXQgdGhlIHZhbHVlIHtAY29kZSAtMX0KKyAgICAgKiBhbHdheXMgaW5kaWNhdGVzIGZhaWx1cmUuCisgICAgICogVE9ETzogbmVlZHMgdG8gZ28gYXdheQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc3RvcFVzaW5nTmV0d29ya0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJwcmV0U2NhblJlc3VsdHNBdmFpbGFibGUoKSB7Ci0KLSAgICAgICAgLy8gSWYgd2Ugc2hvdWxkbid0IHBsYWNlIGEgbm90aWZpY2F0aW9uIG9uIGF2YWlsYWJsZSBuZXR3b3JrcywgdGhlbgotICAgICAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgICAgaWYgKCFtTm90aWZpY2F0aW9uRW5hYmxlZCkgcmV0dXJuOwotCi0gICAgICAgIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvID0gZ2V0TmV0d29ya0luZm8oKTsKLQotICAgICAgICBTdGF0ZSBzdGF0ZSA9IG5ldHdvcmtJbmZvLmdldFN0YXRlKCk7Ci0gICAgICAgIGlmICgoc3RhdGUgPT0gTmV0d29ya0luZm8uU3RhdGUuRElTQ09OTkVDVEVEKQotICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBOZXR3b3JrSW5mby5TdGF0ZS5VTktOT1dOKSkgewotCi0gICAgICAgICAgICAvLyBMb29rIGZvciBhbiBvcGVuIG5ldHdvcmsKLSAgICAgICAgICAgIExpc3Q8U2NhblJlc3VsdD4gc2NhblJlc3VsdHMgPSBnZXRTY2FuUmVzdWx0c0xpc3QoKTsKLSAgICAgICAgICAgIGlmIChzY2FuUmVzdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IG51bU9wZW5OZXR3b3JrcyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNjYW5SZXN1bHRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNjYW5SZXN1bHQgc2NhblJlc3VsdCA9IHNjYW5SZXN1bHRzLmdldChpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2NhblJlc3VsdC5jYXBhYmlsaXRpZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1PcGVuTmV0d29ya3MrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1PcGVuTmV0d29ya3MgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgrK21OdW1TY2Fuc1NpbmNlTmV0d29ya1N0YXRlQ2hhbmdlID49IE5VTV9TQ0FOU19CRUZPUkVfQUNUVUFMTFlfU0NBTk5JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSd2ZSBzY2FubmVkIGNvbnRpbnVvdXNseSBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICogTlVNX1NDQU5TX0JFRk9SRV9OT1RJRklDQVRJT04gdGltZXMuIFRoZSB1c2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwcm9iYWJseSBkb2VzIG5vdCBoYXZlIGEgcmVtZW1iZXJlZCBuZXR3b3JrIGluIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICogc2luY2Ugb3RoZXJ3aXNlIHN1cHBsaWNhbnQgd291bGQgaGF2ZSB0cmllZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICogYXNzb2NpYXRlIGFuZCB0aHVzIHJlc2V0dGluZyB0aGlzIGNvdW50ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5vdGlmaWNhdGlvblZpc2libGUodHJ1ZSwgbnVtT3Blbk5ldHdvcmtzLCBmYWxzZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTm8gb3BlbiBuZXR3b3JrcyBpbiByYW5nZSwgcmVtb3ZlIHRoZSBub3RpZmljYXRpb24KLSAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgZmFsc2UsIDApOworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHByaXZhdGUgRE5TIHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVEbnNSb3V0ZVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Qcml2YXRlRG5zUm91dGVTZXQuZ2V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGlzcGxheSBvciBkb24ndCBkaXNwbGF5IGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlcmUgYXJlIG9wZW4gV2ktRmkgbmV0d29ya3MuCi0gICAgICogQHBhcmFtIHZpc2libGUge0Bjb2RlIHRydWV9IGlmIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgdmlzaWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gbnVtTmV0d29ya3MgdGhlIG51bWJlciBuZXR3b3JrcyBzZWVuCi0gICAgICogQHBhcmFtIGZvcmNlIHtAY29kZSB0cnVlfSB0byBmb3JjZSBub3RpZmljYXRpb24gdG8gYmUgc2hvd24vbm90LXNob3duLAotICAgICAqIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzaG93bi9ub3Qtc2hvd24uCi0gICAgICogQHBhcmFtIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBub3RpZmljYXRpb24gc2hvdWxkIGJlIG1hZGUKLSAgICAgKiB2aXNpYmxlIG9yIGludmlzaWJsZS4KKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgcHJpdmF0ZSBETlMgcm91dGUgaXMgc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShib29sZWFuIHZpc2libGUsIGludCBudW1OZXR3b3JrcywgYm9vbGVhbiBmb3JjZSwgaW50IGRlbGF5KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYXV0byBjYW5jZWwgb24gdGhlIG5vdGlmaWNhdGlvbiwgd2hlbiB0aGUKLSAgICAgICAgLy8gbU5ldHdvcmtzQXZhaWxhYmxlTm90aWZpY2F0aW9uU2hvd24gaXMgdHJ1ZSwgdGhlIG5vdGlmaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBhY3R1YWxseSBiZWVuIGNhbmNlbGVkLiAgSG93ZXZlciwgd2hlbiBpdCBpcyBmYWxzZSB3ZSBrbm93Ci0gICAgICAgIC8vIGZvciBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nIHNob3duIChpdCB3aWxsIG5vdCBiZSBzaG93biBhbnkgb3RoZXIKLSAgICAgICAgLy8gcGxhY2UgdGhhbiBoZXJlKQotICAgICAgICAKLSAgICAgICAgLy8gSWYgaXQgc2hvdWxkIGJlIGhpZGRlbiBhbmQgaXQgaXMgYWxyZWFkeSBoaWRkZW4sIHRoZW4gbm9vcAotICAgICAgICBpZiAoIXZpc2libGUgJiYgIW1Ob3RpZmljYXRpb25TaG93biAmJiAhZm9yY2UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm90IGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgdG8gc2hvdyB0aGUgbm90aWZpY2F0aW9uIGFnYWluCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBtTm90aWZpY2F0aW9uUmVwZWF0VGltZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBOb3RpZmljYXRpb24gbWFpbmx5IHNvIHdlIGNhbiByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQgbWVzc2FnZSB3aXRoIHRoaXMgTm90aWZpY2F0aW9uIGZyb20KLSAgICAgICAgICAgICAgICAvLyB0aGUgcXVldWUgbGF0ZXIKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigpOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24ud2hlbiA9IDA7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5pY29uID0gSUNPTl9ORVRXT1JLU19BVkFJTEFCTEU7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX0FVVE9fQ0FOQ0VMOwotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkobUNvbnRleHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50KFdpZmlNYW5hZ2VyLkFDVElPTl9QSUNLX1dJRklfTkVUV09SSyksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZSwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRldGFpbHMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRRdWFudGl0eVRleHQoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIucGx1cmFscy53aWZpX2F2YWlsYWJsZV9kZXRhaWxlZCwgbnVtTmV0d29ya3MpOwotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIGRldGFpbHMsIG1Ob3RpZmljYXRpb24uY29udGVudEludGVudCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBOT1RJRklDQVRJT05fUkVQRUFUX0RFTEFZX01TOwotCi0gICAgICAgICAgICBtZXNzYWdlID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX05PVElGSUNBVElPTl9DSEFOR0VELCAxLAotICAgICAgICAgICAgICAgICAgICBJQ09OX05FVFdPUktTX0FWQUlMQUJMRSwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwZW5kaW5nIG1lc3NhZ2VzIHRvIHNob3cgdGhlIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgbVRhcmdldC5yZW1vdmVNZXNzYWdlcyhFVkVOVF9OT1RJRklDQVRJT05fQ0hBTkdFRCwgbU5vdGlmaWNhdGlvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBtVGFyZ2V0Lm9idGFpbk1lc3NhZ2UoRVZFTlRfTk9USUZJQ0FUSU9OX0NIQU5HRUQsIDAsIElDT05fTkVUV09SS1NfQVZBSUxBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UYXJnZXQuc2VuZE1lc3NhZ2VEZWxheWVkKG1lc3NhZ2UsIGRlbGF5KTsKLSAgICAgICAgCi0gICAgICAgIG1Ob3RpZmljYXRpb25TaG93biA9IHZpc2libGU7CisgICAgcHVibGljIHZvaWQgcHJpdmF0ZURuc1JvdXRlU2V0KGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtUHJpdmF0ZURuc1JvdXRlU2V0LnNldChlbmFibGVkKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhcnMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdHJhY2tpbmcgd2hldGhlciBhIG5vdGlmaWNhdGlvbiBoYXMgYmVlbgotICAgICAqIHNob3duIHJlY2VudGx5LgotICAgICAqIDxwPgotICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB0aW1lciB0aGF0IHByZXZlbnRzIG5vdGlmaWNhdGlvbnMgZnJvbQotICAgICAqIGJlaW5nIHNob3duIHRvbyBvZnRlbiB3aWxsIGJlIGNsZWFyZWQuCisgICAgICogRmV0Y2ggTmV0d29ya0luZm8gZm9yIHRoZSBuZXR3b3JrCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0Tm90aWZpY2F0aW9uVGltZXIoKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25SZXBlYXRUaW1lID0gMDsKLSAgICAgICAgbU51bVNjYW5zU2luY2VOZXR3b3JrU3RhdGVDaGFuZ2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaW50ZXJmYWNlICIpLmFwcGVuZChtSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiIHJ1blN0YXRlPSIpOwotICAgICAgICBpZiAobVJ1blN0YXRlID49IDEgJiYgbVJ1blN0YXRlIDw9IG1SdW5TdGF0ZU5hbWVzLmxlbmd0aCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG1SdW5TdGF0ZU5hbWVzW21SdW5TdGF0ZS0xXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobVJ1blN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoTFMpLmFwcGVuZChtV2lmaUluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZChtRGhjcEluZm8pLmFwcGVuZChMUyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaGF2ZUlwQWRkcmVzcz0iKS5hcHBlbmQobUhhdmVJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBvYnRhaW5pbmdJcEFkZHJlc3M9IikuYXBwZW5kKG1PYnRhaW5pbmdJcEFkZHJlc3MpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBzY2FuTW9kZUFjdGl2ZT0iKS5hcHBlbmQobUlzU2Nhbk1vZGVBY3RpdmUpLmFwcGVuZChMUykuCi0gICAgICAgICAgICAgICAgYXBwZW5kKCJsYXN0U2lnbmFsTGV2ZWw9IikuYXBwZW5kKG1MYXN0U2lnbmFsTGV2ZWwpLgotICAgICAgICAgICAgICAgIGFwcGVuZCgiLCBleHBsaWNpdGx5RGlzYWJsZWQ9IikuYXBwZW5kKG1Ub3JuRG93bkJ5Q29ubk1ncik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1OZXR3b3JrSW5mbzsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIERoY3BIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1UYXJnZXQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBza2lwIHRoZSBESENQIHJlc3VsdCBjYWxsYmFjayB0byB0aGUgdGFyZ2V0LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICogdGhpcyBjb3VsZCBiZSBzZXQgaWYgdGhlIG5ldHdvcmsgd2Ugd2VyZSByZXF1ZXN0aW5nIGFuIElQIGZvciBoYXMKLSAgICAgICAgICogc2luY2UgYmVlbiBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBOb3RlOiBUaGVyZSBpcyBzdGlsbCBhIGNoYW5jZSB3aGVyZSB0aGUgY2xpZW50J3MgaW50ZW5kZWQgREhDUAotICAgICAgICAgKiByZXF1ZXN0IG5vdCBiZWluZyBjYW5jZWxlZC4gRm9yIGV4YW1wbGUsIHdlIGFyZSByZXF1ZXN0IGZvciBJUCBvbgotICAgICAgICAgKiBBLCBhbmQgaGUgcXVldWVzIHJlcXVlc3QgZm9yIElQIG9uIEIsIGFuZCB0aGVuIGNhbmNlbHMgdGhlIHJlcXVlc3Qgb24KLSAgICAgICAgICogQiB3aGlsZSB3ZSdyZSBzdGlsbCByZXF1ZXN0aW5nIGZyb20gQS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuY2VsQ2FsbGJhY2s7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBibHVldG9vdGggaGVhZHNldCBoZWxwZXIuIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZAotICAgICAgICAgKiBlYXJseSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVsYXkgYmVmb3JlIGl0IGFjdHVhbGx5ICdjb25uZWN0cycsIGFzCi0gICAgICAgICAqIG5vdGVkIGJ5IGl0cyBqYXZhZG9jLiBJZiB3ZSBjaGVjayBiZWZvcmUgaXQgaXMgY29ubmVjdGVkLCBpdCB3aWxsIGJlCi0gICAgICAgICAqIGluIGFuIGVycm9yIHN0YXRlIGFuZCB3ZSB3aWxsIG5vdCBkaXNhYmxlIGNvZXhpc3RlbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBCbHVldG9vdGhIZWFkc2V0IG1CbHVldG9vdGhIZWFkc2V0OwotICAgICAgICAKLSAgICAgICAgcHVibGljIERoY3BIYW5kbGVyKExvb3BlciBsb29wZXIsIEhhbmRsZXIgdGFyZ2V0KSB7Ci0gICAgICAgICAgICBzdXBlcihsb29wZXIpOwotICAgICAgICAgICAgbVRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbUJsdWV0b290aEhlYWRzZXQgPSBuZXcgQmx1ZXRvb3RoSGVhZHNldChtQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0RIQ1BfU1RBUlQ6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkQmx1ZXRvb3RoQ29leGlzdGVuY2VNb2RlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgcHJvYmxlbXMgc2V0dGluZyB0aGUgV2ktRmkgZHJpdmVyJ3MgcG93ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZGUgdG8gYWN0aXZlIHdoZW4gYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIG1vZGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZWQgb3Igc2Vuc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIHNldCBXaS1GaSB0byBhY3RpdmUgbW9kZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBvYnRhaW5pbmcgYW4gSVAgYWRkcmVzcyBiZWNhdXNlIHdlJ3ZlIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aXRoIHNvbWUgcm91dGVycyB3aXRoIGxvdyBwb3dlcgotICAgICAgICAgICAgICAgICAgICAgICAgICogbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIDxwPgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3JkZXIgZm9yIHRoaXMgYWN0aXZlIHBvd2VyIG1vZGUgdG8gcHJvcGVybHkgYmUgc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgZGlzYWJsZSBjb2V4aXN0ZW5jZSBtb2RlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluaW5nIGFuIElQIGFkZHJlc3MuICBPbmUgZXhjZXB0aW9uIGlzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhIGhlYWRzZXQsIHNpbmNlIGRpc2FibGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICogY29leGlzdGVuY2Ugd291bGQgaW50ZXJydXB0IHRoYXQgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjb2V4aXN0ZW5jZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfRElTQUJMRUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBnZXRQb3dlck1vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyTW9kZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc3VwcGxpY2FudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFBvd2VyTW9kZUNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3dlck1vZGUgPSBEUklWRVJfUE9XRVJfTU9ERV9BVVRPOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3dlck1vZGUgIT0gRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQb3dlck1vZGUoRFJJVkVSX1BPV0VSX01PREVfQUNUSVZFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBuZXcgcmVxdWVzdCBpcyBiZWluZyBtYWRlLCBzbyBhc3N1bWUgd2Ugd2lsbCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChOZXR3b3JrVXRpbHMucnVuRGhjcChtSW50ZXJmYWNlTmFtZSwgbURoY3BJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBFVkVOVF9JTlRFUkZBQ0VfQ09ORklHVVJBVElPTl9TVUNDRUVERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9DQUxfTE9HRCkgTG9nLnYoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBzdWNjZWVkZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gRVZFTlRfSU5URVJGQUNFX0NPTkZJR1VSQVRJT05fRkFJTEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGhjcEhhbmRsZXI6IERIQ1AgcmVxdWVzdCBmYWlsZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlscy5nZXREaGNwRXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXJNb2RlICE9IERSSVZFUl9QT1dFUl9NT0RFX0FDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UG93ZXJNb2RlKHBvd2VyTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY29leGlzdGVuY2UgbW9kZSBiYWNrIHRvIGl0cyBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRCbHVldG9vdGhDb2V4aXN0ZW5jZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuQkxVRVRPT1RIX0NPRVhJU1RFTkNFX01PREVfU0VOU0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1DYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYXJnZXQuc2VuZEVtcHR5TWVzc2FnZShldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FuY2VsQ2FsbGJhY2soYm9vbGVhbiBjYW5jZWxDYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbmNlbENhbGxiYWNrID0gY2FuY2VsQ2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciB0byBkaXNhYmxlIGNvZXhpc3RlbmNlIG1vZGUgd2hpbGUgb2J0YWluaW5nIElQIGFkZHJlc3MuIFRoaXMKLSAgICAgICAgICogbG9naWMgd2lsbCByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IGJsdWV0b290aAotICAgICAgICAgKiBoZWFkc2V0L2hhbmRzZnJlZSBzdGF0ZSBpcyBkaXNjb25uZWN0ZWQuIFRoaXMgbWVhbnMgaWYgaXQgaXMgaW4gYW4KLSAgICAgICAgICogZXJyb3Igc3RhdGUsIHdlIHdpbGwgTk9UIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZSB0byBlcnIgb24gdGhlIHNpZGUKLSAgICAgICAgICogb2Ygc2FmZXR5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBXaGV0aGVyIHRvIGRpc2FibGUgY29leGlzdGVuY2UgbW9kZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGREaXNhYmxlQ29leGlzdGVuY2VNb2RlKCkgewotICAgICAgICAgICAgaW50IHN0YXRlID0gbUJsdWV0b290aEhlYWRzZXQuZ2V0U3RhdGUobUJsdWV0b290aEhlYWRzZXQuZ2V0Q3VycmVudEhlYWRzZXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gQmx1ZXRvb3RoSGVhZHNldC5TVEFURV9ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlU3RhdGljSXAoKSB7Ci0gICAgICAgIG1Vc2VTdGF0aWNJcCA9IGZhbHNlOwotICAgICAgICBmaW5hbCBDb250ZW50UmVzb2x2ZXIgY3IgPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9VU0VfU1RBVElDX0lQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0lQKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8uaXBBZGRyZXNzID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfR0FURVdBWSk7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmdhdGV3YXkgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkciA9IFNldHRpbmdzLlN5c3RlbS5nZXRTdHJpbmcoY3IsIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKTsKLSAgICAgICAgICAgIGlmIChhZGRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGhjcEluZm8ubmV0bWFzayA9IHN0cmluZ1RvSXBBZGRyKGFkZHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRyID0gU2V0dGluZ3MuU3lzdGVtLmdldFN0cmluZyhjciwgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzEpOwotICAgICAgICAgICAgaWYgKGFkZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1EaGNwSW5mby5kbnMxID0gc3RyaW5nVG9JcEFkZHIoYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHIgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0U3RyaW5nKGNyLCBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMik7Ci0gICAgICAgICAgICBpZiAoYWRkciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSBzdHJpbmdUb0lwQWRkcihhZGRyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbURoY3BJbmZvLmRuczIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVVzZVN0YXRpY0lwID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBGZXRjaCBMaW5rUHJvcGVydGllcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua1Byb3BlcnRpZXMgZ2V0TGlua1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua1Byb3BlcnRpZXMobUxpbmtQcm9wZXJ0aWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RyaW5nVG9JcEFkZHIoU3RyaW5nIGFkZHJTdHJpbmcpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGFkZHJTdHJpbmcuc3BsaXQoIlxcLiIpOwotICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKGFkZHJTdHJpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYSA9IEludGVnZXIucGFyc2VJbnQocGFydHNbMF0pICAgICAgOwotICAgICAgICAgICAgaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSA8PCAgODsKLSAgICAgICAgICAgIGludCBjID0gSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSkgPDwgMTY7Ci0gICAgICAgICAgICBpbnQgZCA9IEludGVnZXIucGFyc2VJbnQocGFydHNbM10pIDw8IDI0OwotCi0gICAgICAgICAgICByZXR1cm4gYSB8IGIgfCBjIHwgZDsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5rbm93bkhvc3RFeGNlcHRpb24oYWRkclN0cmluZyk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBGZXRjaCBkZWZhdWx0IGdhdGV3YXkgYWRkcmVzcyBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERlZmF1bHRHYXRld2F5QWRkcigpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0R2F0ZXdheUFkZHIuZ2V0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWF4RGhjcFJldHJpZXMoKSB7Ci0gICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9NQVhfREhDUF9SRVRSWV9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfREhDUF9SRVRSSUVTKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBkZWZhdWx0IHJvdXRlIGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJvdXRlU2V0KCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZVNldC5nZXQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewotICAgICAgICBwdWJsaWMgU2V0dGluZ3NPYnNlcnZlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1VTRV9TVEFUSUNfSVApLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19JUCksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0dBVEVXQVkpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TeXN0ZW0uZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlN5c3RlbS5XSUZJX1NUQVRJQ19ORVRNQVNLKSwgZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgY3IucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcigKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uV0lGSV9TVEFUSUNfRE5TMSksIGZhbHNlLCB0aGlzKTsKLSAgICAgICAgICAgIGNyLnJlZ2lzdGVyQ29udGVudE9ic2VydmVyKFNldHRpbmdzLlN5c3RlbS5nZXRVcmlGb3IoCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLldJRklfU1RBVElDX0ROUzIpLCBmYWxzZSwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQ2hhbmdlKHNlbGZDaGFuZ2UpOwotCi0gICAgICAgICAgICBib29sZWFuIHdhc1N0YXRpY0lwID0gbVVzZVN0YXRpY0lwOwotICAgICAgICAgICAgaW50IG9JcCwgb0d3LCBvTXNrLCBvRG5zMSwgb0RuczI7Ci0gICAgICAgICAgICBvSXAgPSBvR3cgPSBvTXNrID0gb0RuczEgPSBvRG5zMiA9IDA7Ci0gICAgICAgICAgICBpZiAod2FzU3RhdGljSXApIHsKLSAgICAgICAgICAgICAgICBvSXAgPSBtRGhjcEluZm8uaXBBZGRyZXNzOwotICAgICAgICAgICAgICAgIG9HdyA9IG1EaGNwSW5mby5nYXRld2F5OwotICAgICAgICAgICAgICAgIG9Nc2sgPSBtRGhjcEluZm8ubmV0bWFzazsKLSAgICAgICAgICAgICAgICBvRG5zMSA9IG1EaGNwSW5mby5kbnMxOwotICAgICAgICAgICAgICAgIG9EbnMyID0gbURoY3BJbmZvLmRuczI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja1VzZVN0YXRpY0lwKCk7Ci0KLSAgICAgICAgICAgIGlmIChtV2lmaUluZm8uZ2V0U3VwcGxpY2FudFN0YXRlKCkgPT0gU3VwcGxpY2FudFN0YXRlLlVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9Ci0gICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICE9IG1Vc2VTdGF0aWNJcCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHdhc1N0YXRpY0lwICYmICgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9JcCAgICE9IG1EaGNwSW5mby5pcEFkZHJlc3MgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9HdyAgICE9IG1EaGNwSW5mby5nYXRld2F5IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBvTXNrICAhPSBtRGhjcEluZm8ubmV0bWFzayB8fAotICAgICAgICAgICAgICAgICAgICAgICAgb0RuczEgIT0gbURoY3BJbmZvLmRuczEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9EbnMyICE9IG1EaGNwSW5mby5kbnMyKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRDb25uZWN0aW9ucyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobVVzZVN0YXRpY0lwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVRhcmdldC5vYnRhaW5NZXNzYWdlKEVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIFNldCBhIGZsYWcgaW5kaWNhdGluZyBkZWZhdWx0IHJvdXRlIGlzIHNldCBmb3IgdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0Um91dGVTZXQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIG1EZWZhdWx0Um91dGVTZXQuc2V0KGVuYWJsZWQpOwogICAgIH0KIAotICAgIHByaXZhdGUgY2xhc3MgTm90aWZpY2F0aW9uRW5hYmxlZFNldHRpbmdPYnNlcnZlciBleHRlbmRzIENvbnRlbnRPYnNlcnZlciB7CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzeXN0ZW0gcHJvcGVydGllcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGNwIGJ1ZmZlciBzaXplcworICAgICAqIGZvciB0aGlzIG5ldHdvcmsuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUY3BCdWZmZXJTaXplc1Byb3BOYW1lKCkgeworICAgICAgICByZXR1cm4gIm5ldC50Y3AuYnVmZmVyc2l6ZS53aWZpIjsKKyAgICB9CiAKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbkVuYWJsZWRTZXR0aW5nT2JzZXJ2ZXIoSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBzdXBlcihoYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNyID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBjci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcihTZXR0aW5ncy5TZWN1cmUuZ2V0VXJpRm9yKAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04pLCB0cnVlLCB0aGlzKTsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotCisgICAgcHJpdmF0ZSBjbGFzcyBXaWZpU3RhdGVSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgewotICAgICAgICAgICAgc3VwZXIub25DaGFuZ2Uoc2VsZkNoYW5nZSk7Ci0KLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25FbmFibGVkID0gZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghbU5vdGlmaWNhdGlvbkVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IG5vdGlmaWNhdGlvbiB0aGF0IG1heSBiZSBzaG93aW5nCi0gICAgICAgICAgICAgICAgc2V0Tm90aWZpY2F0aW9uVmlzaWJsZShmYWxzZSwgMCwgdHJ1ZSwgMCk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuTkVUV09SS19TVEFURV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya0luZm8gPSAoTmV0d29ya0luZm8pIGludGVudC5nZXRQYXJjZWxhYmxlRXh0cmEoCisgICAgICAgICAgICAgICAgICAgICAgICBXaWZpTWFuYWdlci5FWFRSQV9ORVRXT1JLX0lORk8pOworICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IChMaW5rUHJvcGVydGllcykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ3NIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU1RBVEVfQ0hBTkdFRCwgbU5ldHdvcmtJbmZvKTsKKyAgICAgICAgICAgICAgICBtc2cuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoV2lmaU1hbmFnZXIuQ09ORklHX0NIQU5HRURfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIG1MaW5rUHJvcGVydGllcyA9IChMaW5rUHJvcGVydGllcykgaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtQ3NIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfQ09ORklHVVJBVElPTl9DSEFOR0VELCBtTmV0d29ya0luZm8pOworICAgICAgICAgICAgICAgIG1zZy5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzZXROb3RpZmljYXRpb25UaW1lcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGdldFZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCi0gICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX05FVFdPUktTX0FWQUlMQUJMRV9OT1RJRklDQVRJT05fT04sIDEpID09IDE7CiAgICAgICAgIH0KICAgICB9CisKIH0K